🚀 Socket Launch Week Day 5:Introducing Repository Access Permissions and Custom Roles.Learn more
Sign In

@autostorejs/devtools

Package Overview
Dependencies
Maintainers
1
Versions
35
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

@autostorejs/devtools - npm Package Compare versions

Comparing version
1.2.2
to
2.0.0
+18
-18
.turbo/turbo-build.log
> @autostorejs/devtools@1.2.2 build /home/runner/work/autostore/autostore/packages/devTools
> @autostorejs/devtools@2.0.0 build /home/runner/work/autostore/autostore/packages/devTools
> tsup
CLI Building entry: src/cycleDetectExtend.ts
CLI Building entry: src/index.ts
CLI Using tsconfig: tsconfig.json
CLI tsup v8.3.0
CLI tsup v8.5.0
CLI Using tsup config: /home/runner/work/autostore/autostore/packages/devTools/tsup.config.ts
CLI Building entry: src/index.ts
CLI Building entry: src/cycleDetectExtend.ts
CLI Using tsconfig: tsconfig.json
CLI tsup v8.3.0
CLI tsup v8.5.0
CLI Using tsup config: /home/runner/work/autostore/autostore/packages/devTools/tsup.config.ts

@@ -22,20 +22,20 @@ CLI Target: es2022

ESM dist/cycleDetectExtend.mjs 2.22 KB
ESM dist/cycleDetectExtend.mjs.map 12.06 KB
ESM ⚡️ Build success in 416ms
CJS dist/cycleDetectExtend.js 2.23 KB
CJS dist/cycleDetectExtend.js.map 12.06 KB
CJS ⚡️ Build success in 417ms
ESM dist/index.mjs 3.54 KB
ESM dist/index.mjs.map 16.12 KB
ESM ⚡️ Build success in 409ms
CJS dist/index.js 3.56 KB
CJS dist/index.js.map 16.12 KB
CJS ⚡️ Build success in 408ms
ESM dist/cycleDetectExtend.mjs.map 12.04 KB
ESM ⚡️ Build success in 476ms
CJS dist/cycleDetectExtend.js 2.24 KB
CJS dist/cycleDetectExtend.js.map 12.03 KB
CJS ⚡️ Build success in 476ms
ESM dist/index.mjs 3.55 KB
ESM dist/index.mjs.map 16.10 KB
ESM ⚡️ Build success in 493ms
CJS dist/index.js 3.57 KB
CJS dist/index.js.map 16.10 KB
CJS ⚡️ Build success in 493ms
DTS Build start
DTS Build start
DTS ⚡️ Build success in 3147ms
DTS ⚡️ Build success in 2958ms
DTS dist/cycleDetectExtend.d.mts 1.20 KB
DTS dist/cycleDetectExtend.d.ts 1.20 KB
DTS ⚡️ Build success in 3236ms
DTS ⚡️ Build success in 3159ms
DTS dist/index.d.mts 2.13 KB
DTS dist/index.d.ts 2.13 KB
# @autostorejs/devtools
## 2.0.0
### Major Changes
- [`55cef3a`](https://github.com/zhangfisher/autostore/commit/55cef3afb4869c41041f1c975174e05e7bc5c384) Thanks [@zhangfisher](https://github.com/zhangfisher)! - 全面升级增加 schema 功能
## 1.2.2

@@ -4,0 +10,0 @@

@@ -1,8 +0,2 @@

'use strict';
function g(i,e){return !i||!e||i.length!==e.length?!1:i.every((n,s)=>n===e[s])}function y(i,e){return i.length>e.length?!1:i.every((n,s)=>n===e[s])}function f(i,e){let n=i.reduce((r,a,l)=>(a===e&&r.push(l),r),[]),s=n.map((r,a)=>a<n.length-1?i.slice(r,n[a+1]):i.slice(r)),t=new Map;for(let r=0;r<s.length;r++){let a=s[r];if(!(a.length<2))for(let l=r+1;l<s.length;l++){let h=s[l];if(g(a,h)||y(a,h)){let p=a.join("->");t.has(p)||t.set(p,1);let d=t.get(p);t.set(p,d+1);}}}let o=0,c;return t.forEach((r,a)=>{r<3||a.length>o&&(c=a,o=r);}),[c,o]}var u=class{constructor(e,n){this.computedObject=e;this.path=e.path.join("."),this.steps.push(this.path),this.options=Object.assign({cycleCount:8,maxOpereates:200,stores:[]},n);}steps=[];running=!1;_watcher;path;options;start(){this.running=!0,this.steps.push(this.path),this._watcher=this.computedObject.store.watch(e=>{this.steps.length<500&&this.steps.push(e.path.join("."));},{operates:"read"});}analysisCycleSteps(){let[e,n]=f(this.steps,this.path),{onDetected:s,cycleCount:t}=this.options;if(!(n<t)&&(this.computedObject.store.log(`CycleDepend detected in <${this.computedObject.toString()}>: ${e}`,"warn"),typeof s=="function")){let o=s(e,this.computedObject);if(o==="ignore")return;if(o==="disable")this.computedObject.enable=!1;else throw new Error(`CycleDepend found in <${this.computedObject.toString()}>: ${e}`)}}detect(){if(this.steps.length>this.options.maxOpereates){this._watcher.off();try{this.analysisCycleSteps();}finally{this.steps=[];}}}};function m(i){return function(n){let{onObserverCreated:s}=n.options;typeof s=="function"?n.log(`Store<${n.id}> onObserverCreated is already configured, cycleDetectExtend is disabled`,"warn"):(n.options.onObserverCreated=t=>{if(t.type==="computed"&&t.async){t._cycleDetector=new u(t,i);let o=t.run;t.run=async function(c){return c&&c.first===!0?t._cycleDetector.start():t._cycleDetector.detect(),await o.apply(t,c)}.bind(t);}},n.log("cycleDetectExtend is already installed"));}}function E(i){globalThis.__AUTOSTORE_EXTENDS__||(globalThis.__AUTOSTORE_EXTENDS__=[]),globalThis.__AUTOSTORE_EXTENDS__.push(m(i));}
exports.AsyncCycleDetector = u;
exports.installCycleDetectExtend = E;
//# sourceMappingURL=cycleDetectExtend.js.map
'use strict';function g(i,e){return !i||!e||i.length!==e.length?false:i.every((n,s)=>n===e[s])}function y(i,e){return i.length>e.length?false:i.every((n,s)=>n===e[s])}function f(i,e){let n=i.reduce((r,a,l)=>(a===e&&r.push(l),r),[]),s=n.map((r,a)=>a<n.length-1?i.slice(r,n[a+1]):i.slice(r)),t=new Map;for(let r=0;r<s.length;r++){let a=s[r];if(!(a.length<2))for(let l=r+1;l<s.length;l++){let h=s[l];if(g(a,h)||y(a,h)){let p=a.join("->");t.has(p)||t.set(p,1);let d=t.get(p);t.set(p,d+1);}}}let o=0,c;return t.forEach((r,a)=>{r<3||a.length>o&&(c=a,o=r);}),[c,o]}var u=class{constructor(e,n){this.computedObject=e;this.path=e.path.join("."),this.steps.push(this.path),this.options=Object.assign({cycleCount:8,maxOpereates:200,stores:[]},n);}steps=[];running=false;_watcher;path;options;start(){this.running=true,this.steps.push(this.path),this._watcher=this.computedObject.store.watch(e=>{this.steps.length<500&&this.steps.push(e.path.join("."));},{operates:"read"});}analysisCycleSteps(){let[e,n]=f(this.steps,this.path),{onDetected:s,cycleCount:t}=this.options;if(!(n<t)&&(this.computedObject.store.log(`CycleDepend detected in <${this.computedObject.toString()}>: ${e}`,"warn"),typeof s=="function")){let o=s(e,this.computedObject);if(o==="ignore")return;if(o==="disable")this.computedObject.enable=false;else throw new Error(`CycleDepend found in <${this.computedObject.toString()}>: ${e}`)}}detect(){if(this.steps.length>this.options.maxOpereates){this._watcher.off();try{this.analysisCycleSteps();}finally{this.steps=[];}}}};function m(i){return function(n){let{onObserverCreated:s}=n.options;typeof s=="function"?n.log(`Store<${n.id}> onObserverCreated is already configured, cycleDetectExtend is disabled`,"warn"):(n.options.onObserverCreated=t=>{if(t.type==="computed"&&t.async){t._cycleDetector=new u(t,i);let o=t.run;t.run=async function(c){return c&&c.first===true?t._cycleDetector.start():t._cycleDetector.detect(),await o.apply(t,c)}.bind(t);}},n.log("cycleDetectExtend is already installed"));}}function E(i){globalThis.__AUTOSTORE_EXTENDS__||(globalThis.__AUTOSTORE_EXTENDS__=[]),globalThis.__AUTOSTORE_EXTENDS__.push(m(i));}exports.AsyncCycleDetector=u;exports.installCycleDetectExtend=E;//# sourceMappingURL=cycleDetectExtend.js.map
//# sourceMappingURL=cycleDetectExtend.js.map

@@ -1,1 +0,1 @@

{"version":3,"sources":["../src/utils.ts","../src/cycleDetectExtend.ts"],"names":["isPathEq","a","b","item","index","pathStartsWith","basePath","destPath","p","i","analysisCyclePath","steps","curPath","indexs","prev","cur","groups","v","results","group","j","group2","gKey","n","count","paths","k","AsyncCycleDetector","computedObject","options","event","onDetected","cycleCount","result","createCycleDetectExtend","store","onObserverCreated","observerObject","oldRun","installCycleDetectExtend"],"mappings":"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","file":"cycleDetectExtend.js","sourcesContent":["\nexport class WeakObjectMap<T extends object> {\n private map: Map<string, WeakRef<T>>;\n private finalizationRegistry: FinalizationRegistry<string>;\n \n constructor() {\n this.map = new Map();\n this.finalizationRegistry = new FinalizationRegistry((key) => {\n this.map.delete(key);\n });\n }\n \n set(key: string, value: T): void {\n const weakRef = new WeakRef(value);\n this.map.set(key, weakRef);\n this.finalizationRegistry.register(value, key);\n }\n \n get(key: string): T | undefined {\n const weakRef = this.map.get(key);\n return weakRef ? weakRef.deref() : undefined;\n }\n \n delete(key: string): boolean {\n return this.map.delete(key);\n }\n \n has(key: string): boolean {\n const weakRef = this.map.get(key);\n return weakRef ? weakRef.deref() !== undefined : false;\n }\n}\n/**\n * 判定两个值是否相等\n * \n * 如果两个值都是对象,则判断两个对象是否相等\n * 如果两个值都是数组,则判断两个数组的值是否相等\n * \n */\n\nexport function isPathEq(a:string[] | undefined,b:string[] | undefined):boolean{\n if(!a) return false\n if(!b) return false\n if(a.length!==b.length) return false\n return a.every((item,index)=>item===b[index])\n}\n/**\n * 判断一个路径destPath是否包含另一个路径basePath判断\n * @param basePath \n * @param destPath \n */\nexport function pathStartsWith(basePath:string[],destPath:string[]){\n if(basePath.length>destPath.length) return false\n return basePath.every((p,i)=>{\n return p===destPath[i]\n })\n}\n\nexport function analysisCyclePath(steps:string[],curPath:string):[string | undefined,number] {\n // 使用curPath将steps分割为多个数组\n const indexs = steps.reduce((prev,cur,index)=>{\n if(cur===curPath) prev.push(index) \n return prev\n },[] as number[])\n\n const groups = indexs.map((v,i)=>{\n if(i<indexs.length-1){\n return steps.slice(v,indexs[i+1])\n }else{\n return steps.slice(v)\n } \n })\n\n // 找到groups相同的分组\n const results = new Map<string,number>()\n for(let i=0;i<groups.length;i++){\n const group = groups[i]\n if(group.length<2) continue\n for(let j=i+1;j<groups.length;j++){\n const group2 = groups[j]\n if(isPathEq(group,group2) || pathStartsWith(group,group2)){\n const gKey = group.join('->')\n if(!results.has(gKey)){\n results.set(gKey,1)\n }\n const n = results.get(gKey)! \n results.set(gKey,n+1)\n }\n }\n }\n // 找到results里面路径最长的\n let count = 0\n let paths = undefined\n results.forEach((v,k)=>{\n if(v<3) return\n if(k.length>count){\n paths = k\n count = v \n }\n }) \n return [paths,count]\n\n}\n","/**\n * \n * import { installCycleDetectExtend } from \"@autostore/devtools\"\n * \n * installCycleDetectExtend({....})\n * \n * \n */\nimport { analysisCyclePath } from \"./utils\"\n\n\nexport type CycleDetectExtendOptions = { \n /**\n * 当检测到多少个循环时视为循环依赖 \n */\n cycleCount?:number\n /**\n * \n * 当检测时间操作数量达到此值时,停止检测\n * \n */\n maxOpereates?:number\n /**\n * 指定仅作用于指定的store\n * =[]代表所有store均生效\n */\n stores?:string[]\n /**\n * \n */\n onDetected?:(paths:string[],computedObject:any)=>'ignore'|'throw'|'disable' \n\n}\n\n/**\n * \n * - 在异步计算第一次执行时调用\n * cycleDetector.start()\n * \n * \n * \n */\nexport class AsyncCycleDetector{\n steps:string[] = []\n running:boolean = false \n private _watcher:any\n path:string\n options: Record<string,any>\n constructor(public computedObject:any,options?:Record<string,any>){\n this.path = computedObject.path.join('.')\n this.steps.push(this.path)\n this.options = Object.assign({\n cycleCount : 8,\n maxOpereates: 200,\n stores:[]\n },options)\n } \n /**\n * 本方法应该在异步函数第一次运行时调用\n */\n start(){\n this.running = true\n this.steps.push(this.path)\n this._watcher = this.computedObject.store.watch((event:any)=>{\n if(this.steps.length<500){\n this.steps.push(event.path.join('.'))\n }\n },{operates:'read'}) \n }\n /**\n * \n * 开始检测是否存在循环依赖\n * \n * \n * [\"a\",'d','c','b','a','d','c','b','a']\n * \n * \n * 编写一个函数,检测是否存在循环依赖\n * \n * 逻辑如下:\n * \n * 对this.steps里面是否存在连续的相同的路径,如果存在,则表示存在循环依赖\n * \n * \n * @returns \n */\n private analysisCycleSteps(){\n const [paths,count] = analysisCyclePath(this.steps,this.path)\n const { onDetected,cycleCount } = this.options\n if(count<cycleCount) return\n this.computedObject.store.log(`CycleDepend detected in <${this.computedObject.toString()}>: ${paths}`,'warn')\n if(typeof(onDetected )==='function'){\n const result = onDetected(paths,this.computedObject)\n if(result==='ignore'){\n return\n }else if(result==='disable') {\n this.computedObject.enable = false\n }else{\n throw new Error(`CycleDepend found in <${this.computedObject.toString()}>: ${paths}`)\n }\n } \n } \n detect(){\n if(this.steps.length>this.options.maxOpereates){\n this._watcher.off()\n try{\n this.analysisCycleSteps()\n }finally{ \n this.steps=[]\n }\n }\n }\n}\n\n\nfunction createCycleDetectExtend(options?:CycleDetectExtendOptions){\n return function cycleDetectExtend(store:any){\n const { onObserverCreated } = store.options\n if(typeof(onObserverCreated) ==='function'){ \n // 当store的onObserverCreated选项已经配置时,cycleDetectExtend不能生效\n store.log(`Store<${store.id}> onObserverCreated is already configured, cycleDetectExtend is disabled`,\"warn\")\n }else{\n store.options.onObserverCreated = (observerObject:any)=>{\n // 只对异步计算属性进行循环依赖检测\n if(observerObject.type==='computed' && observerObject.async){\n observerObject._cycleDetector = new AsyncCycleDetector(observerObject,options)\n const oldRun = observerObject.run\n // 封装原始的run方法\n observerObject.run = (async function(options:any){\n // 在第一次运行时启动循环依赖检测\n if(options && options.first===true){\n observerObject._cycleDetector.start()\n }else{\n observerObject._cycleDetector.detect() \n }\n return await oldRun.apply(observerObject,options)\n }).bind(observerObject)\n }\n }\n store.log(\"cycleDetectExtend is already installed\")\n }\n } \n\n}\n\n\nexport function installCycleDetectExtend(options?:CycleDetectExtendOptions){\n // @ts-ignore\n if(!globalThis.__AUTOSTORE_EXTENDS__){\n // @ts-ignore\n globalThis.__AUTOSTORE_EXTENDS__=[]\n }\n // @ts-ignore\n globalThis.__AUTOSTORE_EXTENDS__.push(createCycleDetectExtend(options))\n \n}\n "]}
{"version":3,"sources":["../src/utils.ts","../src/cycleDetectExtend.ts"],"names":["isPathEq","a","b","item","index","pathStartsWith","basePath","destPath","p","i","analysisCyclePath","steps","curPath","indexs","prev","cur","groups","v","results","group","j","group2","gKey","n","count","paths","k","AsyncCycleDetector","computedObject","options","event","onDetected","cycleCount","result","createCycleDetectExtend","store","onObserverCreated","observerObject","oldRun","installCycleDetectExtend"],"mappings":"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","file":"cycleDetectExtend.js","sourcesContent":["\nexport class WeakObjectMap<T extends object> {\n private map: Map<string, WeakRef<T>>;\n private finalizationRegistry: FinalizationRegistry<string>;\n \n constructor() {\n this.map = new Map();\n this.finalizationRegistry = new FinalizationRegistry((key) => {\n this.map.delete(key);\n });\n }\n \n set(key: string, value: T): void {\n const weakRef = new WeakRef(value);\n this.map.set(key, weakRef);\n this.finalizationRegistry.register(value, key);\n }\n \n get(key: string): T | undefined {\n const weakRef = this.map.get(key);\n return weakRef ? weakRef.deref() : undefined;\n }\n \n delete(key: string): boolean {\n return this.map.delete(key);\n }\n \n has(key: string): boolean {\n const weakRef = this.map.get(key);\n return weakRef ? weakRef.deref() !== undefined : false;\n }\n}\n/**\n * 判定两个值是否相等\n * \n * 如果两个值都是对象,则判断两个对象是否相等\n * 如果两个值都是数组,则判断两个数组的值是否相等\n * \n */\n\nexport function isPathEq(a:string[] | undefined,b:string[] | undefined):boolean{\n if(!a) return false\n if(!b) return false\n if(a.length!==b.length) return false\n return a.every((item,index)=>item===b[index])\n}\n/**\n * 判断一个路径destPath是否包含另一个路径basePath判断\n * @param basePath \n * @param destPath \n */\nexport function pathStartsWith(basePath:string[],destPath:string[]){\n if(basePath.length>destPath.length) return false\n return basePath.every((p,i)=>{\n return p===destPath[i]\n })\n}\n\nexport function analysisCyclePath(steps:string[],curPath:string):[string | undefined,number] {\n // 使用curPath将steps分割为多个数组\n const indexs = steps.reduce((prev,cur,index)=>{\n if(cur===curPath) prev.push(index) \n return prev\n },[] as number[])\n\n const groups = indexs.map((v,i)=>{\n if(i<indexs.length-1){\n return steps.slice(v,indexs[i+1])\n }else{\n return steps.slice(v)\n } \n })\n\n // 找到groups相同的分组\n const results = new Map<string,number>()\n for(let i=0;i<groups.length;i++){\n const group = groups[i]\n if(group.length<2) continue\n for(let j=i+1;j<groups.length;j++){\n const group2 = groups[j]\n if(isPathEq(group,group2) || pathStartsWith(group,group2)){\n const gKey = group.join('->')\n if(!results.has(gKey)){\n results.set(gKey,1)\n }\n const n = results.get(gKey)! \n results.set(gKey,n+1)\n }\n }\n }\n // 找到results里面路径最长的\n let count = 0\n let paths = undefined\n results.forEach((v,k)=>{\n if(v<3) return\n if(k.length>count){\n paths = k\n count = v \n }\n }) \n return [paths,count]\n\n}\n","/**\n * \n * import { installCycleDetectExtend } from \"@autostore/devtools\"\n * \n * installCycleDetectExtend({....})\n * \n * \n */\nimport { analysisCyclePath } from \"./utils\"\n\n\nexport type CycleDetectExtendOptions = { \n /**\n * 当检测到多少个循环时视为循环依赖 \n */\n cycleCount?:number\n /**\n * \n * 当检测时间操作数量达到此值时,停止检测\n * \n */\n maxOpereates?:number\n /**\n * 指定仅作用于指定的store\n * =[]代表所有store均生效\n */\n stores?:string[]\n /**\n * \n */\n onDetected?:(paths:string[],computedObject:any)=>'ignore'|'throw'|'disable' \n\n}\n\n/**\n * \n * - 在异步计算第一次执行时调用\n * cycleDetector.start()\n * \n * \n * \n */\nexport class AsyncCycleDetector{\n steps:string[] = []\n running:boolean = false \n private _watcher:any\n path:string\n options: Record<string,any>\n constructor(public computedObject:any,options?:Record<string,any>){\n this.path = computedObject.path.join('.')\n this.steps.push(this.path)\n this.options = Object.assign({\n cycleCount : 8,\n maxOpereates: 200,\n stores:[]\n },options)\n } \n /**\n * 本方法应该在异步函数第一次运行时调用\n */\n start(){\n this.running = true\n this.steps.push(this.path)\n this._watcher = this.computedObject.store.watch((event:any)=>{\n if(this.steps.length<500){\n this.steps.push(event.path.join('.'))\n }\n },{operates:'read'}) \n }\n /**\n * \n * 开始检测是否存在循环依赖\n * \n * \n * [\"a\",'d','c','b','a','d','c','b','a']\n * \n * \n * 编写一个函数,检测是否存在循环依赖\n * \n * 逻辑如下:\n * \n * 对this.steps里面是否存在连续的相同的路径,如果存在,则表示存在循环依赖\n * \n * \n * @returns \n */\n private analysisCycleSteps(){\n const [paths,count] = analysisCyclePath(this.steps,this.path)\n const { onDetected,cycleCount } = this.options\n if(count<cycleCount) return\n this.computedObject.store.log(`CycleDepend detected in <${this.computedObject.toString()}>: ${paths}`,'warn')\n if(typeof(onDetected )==='function'){\n const result = onDetected(paths,this.computedObject)\n if(result==='ignore'){\n return\n }else if(result==='disable') {\n this.computedObject.enable = false\n }else{\n throw new Error(`CycleDepend found in <${this.computedObject.toString()}>: ${paths}`)\n }\n } \n } \n detect(){\n if(this.steps.length>this.options.maxOpereates){\n this._watcher.off()\n try{\n this.analysisCycleSteps()\n }finally{ \n this.steps=[]\n }\n }\n }\n}\n\n\nfunction createCycleDetectExtend(options?:CycleDetectExtendOptions){\n return function cycleDetectExtend(store:any){\n const { onObserverCreated } = store.options\n if(typeof(onObserverCreated) ==='function'){ \n // 当store的onObserverCreated选项已经配置时,cycleDetectExtend不能生效\n store.log(`Store<${store.id}> onObserverCreated is already configured, cycleDetectExtend is disabled`,\"warn\")\n }else{\n store.options.onObserverCreated = (observerObject:any)=>{\n // 只对异步计算属性进行循环依赖检测\n if(observerObject.type==='computed' && observerObject.async){\n observerObject._cycleDetector = new AsyncCycleDetector(observerObject,options)\n const oldRun = observerObject.run\n // 封装原始的run方法\n observerObject.run = (async function(options:any){\n // 在第一次运行时启动循环依赖检测\n if(options && options.first===true){\n observerObject._cycleDetector.start()\n }else{\n observerObject._cycleDetector.detect() \n }\n return await oldRun.apply(observerObject,options)\n }).bind(observerObject)\n }\n }\n store.log(\"cycleDetectExtend is already installed\")\n }\n } \n\n}\n\n\nexport function installCycleDetectExtend(options?:CycleDetectExtendOptions){\n // @ts-ignore\n if(!globalThis.__AUTOSTORE_EXTENDS__){\n // @ts-ignore\n globalThis.__AUTOSTORE_EXTENDS__=[]\n }\n // @ts-ignore\n globalThis.__AUTOSTORE_EXTENDS__.push(createCycleDetectExtend(options))\n \n}\n "]}

@@ -1,5 +0,2 @@

function g(i,e){return !i||!e||i.length!==e.length?!1:i.every((n,s)=>n===e[s])}function y(i,e){return i.length>e.length?!1:i.every((n,s)=>n===e[s])}function f(i,e){let n=i.reduce((r,a,l)=>(a===e&&r.push(l),r),[]),s=n.map((r,a)=>a<n.length-1?i.slice(r,n[a+1]):i.slice(r)),t=new Map;for(let r=0;r<s.length;r++){let a=s[r];if(!(a.length<2))for(let l=r+1;l<s.length;l++){let h=s[l];if(g(a,h)||y(a,h)){let p=a.join("->");t.has(p)||t.set(p,1);let d=t.get(p);t.set(p,d+1);}}}let o=0,c;return t.forEach((r,a)=>{r<3||a.length>o&&(c=a,o=r);}),[c,o]}var u=class{constructor(e,n){this.computedObject=e;this.path=e.path.join("."),this.steps.push(this.path),this.options=Object.assign({cycleCount:8,maxOpereates:200,stores:[]},n);}steps=[];running=!1;_watcher;path;options;start(){this.running=!0,this.steps.push(this.path),this._watcher=this.computedObject.store.watch(e=>{this.steps.length<500&&this.steps.push(e.path.join("."));},{operates:"read"});}analysisCycleSteps(){let[e,n]=f(this.steps,this.path),{onDetected:s,cycleCount:t}=this.options;if(!(n<t)&&(this.computedObject.store.log(`CycleDepend detected in <${this.computedObject.toString()}>: ${e}`,"warn"),typeof s=="function")){let o=s(e,this.computedObject);if(o==="ignore")return;if(o==="disable")this.computedObject.enable=!1;else throw new Error(`CycleDepend found in <${this.computedObject.toString()}>: ${e}`)}}detect(){if(this.steps.length>this.options.maxOpereates){this._watcher.off();try{this.analysisCycleSteps();}finally{this.steps=[];}}}};function m(i){return function(n){let{onObserverCreated:s}=n.options;typeof s=="function"?n.log(`Store<${n.id}> onObserverCreated is already configured, cycleDetectExtend is disabled`,"warn"):(n.options.onObserverCreated=t=>{if(t.type==="computed"&&t.async){t._cycleDetector=new u(t,i);let o=t.run;t.run=async function(c){return c&&c.first===!0?t._cycleDetector.start():t._cycleDetector.detect(),await o.apply(t,c)}.bind(t);}},n.log("cycleDetectExtend is already installed"));}}function E(i){globalThis.__AUTOSTORE_EXTENDS__||(globalThis.__AUTOSTORE_EXTENDS__=[]),globalThis.__AUTOSTORE_EXTENDS__.push(m(i));}
export { u as AsyncCycleDetector, E as installCycleDetectExtend };
//# sourceMappingURL=cycleDetectExtend.mjs.map
function g(i,e){return !i||!e||i.length!==e.length?false:i.every((n,s)=>n===e[s])}function y(i,e){return i.length>e.length?false:i.every((n,s)=>n===e[s])}function f(i,e){let n=i.reduce((r,a,l)=>(a===e&&r.push(l),r),[]),s=n.map((r,a)=>a<n.length-1?i.slice(r,n[a+1]):i.slice(r)),t=new Map;for(let r=0;r<s.length;r++){let a=s[r];if(!(a.length<2))for(let l=r+1;l<s.length;l++){let h=s[l];if(g(a,h)||y(a,h)){let p=a.join("->");t.has(p)||t.set(p,1);let d=t.get(p);t.set(p,d+1);}}}let o=0,c;return t.forEach((r,a)=>{r<3||a.length>o&&(c=a,o=r);}),[c,o]}var u=class{constructor(e,n){this.computedObject=e;this.path=e.path.join("."),this.steps.push(this.path),this.options=Object.assign({cycleCount:8,maxOpereates:200,stores:[]},n);}steps=[];running=false;_watcher;path;options;start(){this.running=true,this.steps.push(this.path),this._watcher=this.computedObject.store.watch(e=>{this.steps.length<500&&this.steps.push(e.path.join("."));},{operates:"read"});}analysisCycleSteps(){let[e,n]=f(this.steps,this.path),{onDetected:s,cycleCount:t}=this.options;if(!(n<t)&&(this.computedObject.store.log(`CycleDepend detected in <${this.computedObject.toString()}>: ${e}`,"warn"),typeof s=="function")){let o=s(e,this.computedObject);if(o==="ignore")return;if(o==="disable")this.computedObject.enable=false;else throw new Error(`CycleDepend found in <${this.computedObject.toString()}>: ${e}`)}}detect(){if(this.steps.length>this.options.maxOpereates){this._watcher.off();try{this.analysisCycleSteps();}finally{this.steps=[];}}}};function m(i){return function(n){let{onObserverCreated:s}=n.options;typeof s=="function"?n.log(`Store<${n.id}> onObserverCreated is already configured, cycleDetectExtend is disabled`,"warn"):(n.options.onObserverCreated=t=>{if(t.type==="computed"&&t.async){t._cycleDetector=new u(t,i);let o=t.run;t.run=async function(c){return c&&c.first===true?t._cycleDetector.start():t._cycleDetector.detect(),await o.apply(t,c)}.bind(t);}},n.log("cycleDetectExtend is already installed"));}}function E(i){globalThis.__AUTOSTORE_EXTENDS__||(globalThis.__AUTOSTORE_EXTENDS__=[]),globalThis.__AUTOSTORE_EXTENDS__.push(m(i));}export{u as AsyncCycleDetector,E as installCycleDetectExtend};//# sourceMappingURL=cycleDetectExtend.mjs.map
//# sourceMappingURL=cycleDetectExtend.mjs.map

@@ -1,1 +0,1 @@

{"version":3,"sources":["../src/utils.ts","../src/cycleDetectExtend.ts"],"names":["isPathEq","a","b","item","index","pathStartsWith","basePath","destPath","p","i","analysisCyclePath","steps","curPath","indexs","prev","cur","groups","v","results","group","j","group2","gKey","n","count","paths","k","AsyncCycleDetector","computedObject","options","event","onDetected","cycleCount","result","createCycleDetectExtend","store","onObserverCreated","observerObject","oldRun","installCycleDetectExtend"],"mappings":"AAwCO,SAASA,CAAAA,CAASC,CAAuBC,CAAAA,CAAAA,CAA+B,CAG7E,OAFG,CAACD,CAAAA,EACD,CAACC,CAAAA,EACDD,CAAE,CAAA,MAAA,GAASC,CAAE,CAAA,MAAA,CAAe,GACxBD,CAAE,CAAA,KAAA,CAAM,CAACE,CAAAA,CAAKC,CAAQD,GAAAA,CAAAA,GAAOD,CAAEE,CAAAA,CAAK,CAAC,CAC9C,CAMO,SAASC,CAAeC,CAAAA,CAAAA,CAAkBC,EAAkB,CACjE,OAAGD,CAAS,CAAA,MAAA,CAAOC,CAAS,CAAA,MAAA,CAAe,CACpCD,CAAAA,CAAAA,CAAAA,CAAS,KAAM,CAAA,CAACE,CAAEC,CAAAA,CAAAA,GACdD,CAAID,GAAAA,CAAAA,CAASE,CAAC,CACxB,CACH,CAEO,SAASC,CAAAA,CAAkBC,CAAeC,CAAAA,CAAAA,CAA4C,CAE3F,IAAMC,CAASF,CAAAA,CAAAA,CAAM,MAAO,CAAA,CAACG,CAAKC,CAAAA,CAAAA,CAAIX,KAC/BW,CAAMH,GAAAA,CAAAA,EAASE,CAAK,CAAA,IAAA,CAAKV,CAAK,CAAA,CAC1BU,CACT,CAAA,CAAA,EAAc,CAAA,CAEVE,CAASH,CAAAA,CAAAA,CAAO,GAAI,CAAA,CAACI,EAAER,CACtBA,GAAAA,CAAAA,CAAEI,CAAO,CAAA,MAAA,CAAO,CACRF,CAAAA,CAAAA,CAAM,KAAMM,CAAAA,CAAAA,CAAEJ,CAAOJ,CAAAA,CAAAA,CAAE,CAAC,CAAC,CAEzBE,CAAAA,CAAAA,CAAM,MAAMM,CAAC,CAE3B,CAGKC,CAAAA,CAAAA,CAAU,IAAI,GAAA,CACpB,IAAQT,IAAAA,CAAAA,CAAE,CAAEA,CAAAA,CAAAA,CAAEO,CAAO,CAAA,MAAA,CAAOP,CAAI,EAAA,CAAA,CAC5B,IAAMU,CAAAA,CAAQH,CAAOP,CAAAA,CAAC,CACtB,CAAA,GAAG,EAAAU,CAAAA,CAAM,MAAO,CAAA,CAAA,CAAA,CAChB,IAAQC,IAAAA,CAAAA,CAAEX,CAAE,CAAA,CAAA,CAAEW,CAAEJ,CAAAA,CAAAA,CAAO,OAAOI,CAAI,EAAA,CAAA,CAC9B,IAAMC,CAAAA,CAASL,CAAOI,CAAAA,CAAC,CACvB,CAAA,GAAGpB,CAASmB,CAAAA,CAAAA,CAAME,CAAM,CAAA,EAAKhB,CAAec,CAAAA,CAAAA,CAAME,CAAM,CAAE,CAAA,CACtD,IAAMC,CAAAA,CAAOH,CAAM,CAAA,IAAA,CAAK,IAAI,CAAA,CACxBD,CAAQ,CAAA,GAAA,CAAII,CAAI,CAAA,EAChBJ,CAAQ,CAAA,GAAA,CAAII,EAAK,CAAC,CAAA,CAEtB,IAAMC,CAAAA,CAAIL,CAAQ,CAAA,GAAA,CAAII,CAAI,CAAA,CAC1BJ,CAAQ,CAAA,GAAA,CAAII,CAAKC,CAAAA,CAAAA,CAAE,CAAC,EACxB,CACJ,CACJ,CAEA,IAAIC,CAAQ,CAAA,CAAA,CACRC,CACJ,CAAA,OAAAP,CAAQ,CAAA,OAAA,CAAQ,CAACD,CAAAA,CAAES,CAAI,GAAA,CAChBT,CAAE,CAAA,CAAA,EACFS,EAAE,MAAOF,CAAAA,CAAAA,GACVC,CAAQC,CAAAA,CAAAA,CACRF,CAAQP,CAAAA,CAAAA,EAEd,CAAC,CAAA,CACM,CAACQ,CAAAA,CAAMD,CAAK,CAErB,CC5DO,IAAMG,CAAN,CAAA,KAAwB,CAM3B,WAAA,CAAmBC,CAAmBC,CAAAA,CAAAA,CAA4B,CAA/C,IAAA,CAAA,cAAA,CAAAD,CACf,CAAA,IAAA,CAAK,IAAOA,CAAAA,CAAAA,CAAe,IAAK,CAAA,IAAA,CAAK,GAAG,CAAA,CACxC,KAAK,KAAM,CAAA,IAAA,CAAK,IAAK,CAAA,IAAI,CACzB,CAAA,IAAA,CAAK,OAAU,CAAA,MAAA,CAAO,MAAO,CAAA,CACzB,UAAc,CAAA,CAAA,CACd,YAAc,CAAA,GAAA,CACd,MAAO,CAAA,EACX,CAAA,CAAEC,CAAO,EACb,CAbA,KAAA,CAAiB,EAAC,CAClB,OAAkB,CAAA,CAAA,CAAA,CACV,QACR,CAAA,IAAA,CACA,OAaA,CAAA,KAAA,EAAO,CACH,IAAK,CAAA,OAAA,CAAU,CACf,CAAA,CAAA,IAAA,CAAK,KAAM,CAAA,IAAA,CAAK,IAAK,CAAA,IAAI,CACzB,CAAA,IAAA,CAAK,QAAW,CAAA,IAAA,CAAK,cAAe,CAAA,KAAA,CAAM,MAAOC,CAAY,EAAA,CACtD,IAAK,CAAA,KAAA,CAAM,MAAO,CAAA,GAAA,EACjB,IAAK,CAAA,KAAA,CAAM,IAAKA,CAAAA,CAAAA,CAAM,IAAK,CAAA,IAAA,CAAK,GAAG,CAAC,EAE5C,CAAE,CAAA,CAAC,QAAS,CAAA,MAAM,CAAC,EACvB,CAkBQ,kBAAA,EAAoB,CACxB,GAAM,CAACL,CAAAA,CAAMD,CAAK,CAAA,CAAId,CAAkB,CAAA,IAAA,CAAK,KAAM,CAAA,IAAA,CAAK,IAAI,CAAA,CACtD,CAAE,UAAA,CAAAqB,CAAW,CAAA,UAAA,CAAAC,CAAW,CAAA,CAAI,IAAK,CAAA,OAAA,CACvC,GAAG,EAAAR,EAAMQ,CACT,CAAA,GAAA,IAAA,CAAK,cAAe,CAAA,KAAA,CAAM,GAAI,CAAA,CAAA,yBAAA,EAA4B,IAAK,CAAA,cAAA,CAAe,QAAS,EAAC,CAAMP,GAAAA,EAAAA,CAAK,CAAG,CAAA,CAAA,MAAM,EACzG,OAAOM,CAAAA,EAAe,UAAW,CAAA,CAAA,CAChC,IAAME,CAAAA,CAASF,CAAWN,CAAAA,CAAAA,CAAM,IAAK,CAAA,cAAc,CACnD,CAAA,GAAGQ,CAAS,GAAA,QAAA,CACR,OACE,GAAGA,CAAAA,GAAS,SACd,CAAA,IAAA,CAAK,cAAe,CAAA,MAAA,CAAS,CAE7B,CAAA,CAAA,KAAA,MAAM,IAAI,KAAA,CAAM,CAAyB,sBAAA,EAAA,IAAA,CAAK,cAAe,CAAA,QAAA,EAAU,CAAA,GAAA,EAAMR,CAAK,CAAA,CAAE,CAE5F,CACJ,CACA,MAAA,EAAQ,CACJ,GAAG,IAAK,CAAA,KAAA,CAAM,MAAO,CAAA,IAAA,CAAK,OAAQ,CAAA,YAAA,CAAa,CAC3C,IAAK,CAAA,QAAA,CAAS,GAAI,EAAA,CAClB,GAAG,CACC,IAAK,CAAA,kBAAA,GACT,CAAA,OAAC,CACG,IAAA,CAAK,KAAM,CAAA,GACf,CACJ,CACJ,CACJ,EAGA,SAASS,CAAAA,CAAwBL,CAAkC,CAAA,CAC/D,OAAO,SAA2BM,CAAU,CAAA,CACxC,GAAM,CAAE,kBAAAC,CAAkB,CAAA,CAAID,CAAM,CAAA,OAAA,CACjC,OAAOC,CAAAA,EAAsB,UAE5BD,CAAAA,CAAAA,CAAM,GAAI,CAAA,CAAA,MAAA,EAASA,CAAM,CAAA,EAAE,CAA2E,wEAAA,CAAA,CAAA,MAAM,CAE5GA,EAAAA,CAAAA,CAAM,OAAQ,CAAA,iBAAA,CAAqBE,CAAqB,EAAA,CAEpD,GAAGA,CAAAA,CAAe,IAAO,GAAA,UAAA,EAAcA,CAAe,CAAA,KAAA,CAAM,CACxDA,CAAAA,CAAe,cAAiB,CAAA,IAAIV,EAAmBU,CAAeR,CAAAA,CAAO,CAC7E,CAAA,IAAMS,CAASD,CAAAA,CAAAA,CAAe,GAE9BA,CAAAA,CAAAA,CAAe,GAAO,CAAA,eAAeR,CAAY,CAAA,CAE7C,OAAGA,CAAAA,EAAWA,CAAQ,CAAA,KAAA,GAAQ,CAC1BQ,CAAAA,CAAAA,CAAAA,CAAe,cAAe,CAAA,KAAA,EAE9BA,CAAAA,CAAAA,CAAe,cAAe,CAAA,MAAA,EAE3B,CAAA,MAAMC,CAAO,CAAA,KAAA,CAAMD,CAAeR,CAAAA,CAAO,CACpD,CAAG,CAAA,IAAA,CAAKQ,CAAc,EAC1B,CACJ,CAAA,CACAF,CAAM,CAAA,GAAA,CAAI,wCAAwC,CAAA,EAE1D,CAEJ,CAGO,SAASI,CAAAA,CAAyBV,CAAkC,CAAA,CAEnE,UAAW,CAAA,qBAAA,GAEX,UAAW,CAAA,qBAAA,CAAsB,EAAC,CAAA,CAGtC,UAAW,CAAA,qBAAA,CAAsB,IAAKK,CAAAA,CAAAA,CAAwBL,CAAO,CAAC,EAE1E","file":"cycleDetectExtend.mjs","sourcesContent":["\nexport class WeakObjectMap<T extends object> {\n private map: Map<string, WeakRef<T>>;\n private finalizationRegistry: FinalizationRegistry<string>;\n \n constructor() {\n this.map = new Map();\n this.finalizationRegistry = new FinalizationRegistry((key) => {\n this.map.delete(key);\n });\n }\n \n set(key: string, value: T): void {\n const weakRef = new WeakRef(value);\n this.map.set(key, weakRef);\n this.finalizationRegistry.register(value, key);\n }\n \n get(key: string): T | undefined {\n const weakRef = this.map.get(key);\n return weakRef ? weakRef.deref() : undefined;\n }\n \n delete(key: string): boolean {\n return this.map.delete(key);\n }\n \n has(key: string): boolean {\n const weakRef = this.map.get(key);\n return weakRef ? weakRef.deref() !== undefined : false;\n }\n}\n/**\n * 判定两个值是否相等\n * \n * 如果两个值都是对象,则判断两个对象是否相等\n * 如果两个值都是数组,则判断两个数组的值是否相等\n * \n */\n\nexport function isPathEq(a:string[] | undefined,b:string[] | undefined):boolean{\n if(!a) return false\n if(!b) return false\n if(a.length!==b.length) return false\n return a.every((item,index)=>item===b[index])\n}\n/**\n * 判断一个路径destPath是否包含另一个路径basePath判断\n * @param basePath \n * @param destPath \n */\nexport function pathStartsWith(basePath:string[],destPath:string[]){\n if(basePath.length>destPath.length) return false\n return basePath.every((p,i)=>{\n return p===destPath[i]\n })\n}\n\nexport function analysisCyclePath(steps:string[],curPath:string):[string | undefined,number] {\n // 使用curPath将steps分割为多个数组\n const indexs = steps.reduce((prev,cur,index)=>{\n if(cur===curPath) prev.push(index) \n return prev\n },[] as number[])\n\n const groups = indexs.map((v,i)=>{\n if(i<indexs.length-1){\n return steps.slice(v,indexs[i+1])\n }else{\n return steps.slice(v)\n } \n })\n\n // 找到groups相同的分组\n const results = new Map<string,number>()\n for(let i=0;i<groups.length;i++){\n const group = groups[i]\n if(group.length<2) continue\n for(let j=i+1;j<groups.length;j++){\n const group2 = groups[j]\n if(isPathEq(group,group2) || pathStartsWith(group,group2)){\n const gKey = group.join('->')\n if(!results.has(gKey)){\n results.set(gKey,1)\n }\n const n = results.get(gKey)! \n results.set(gKey,n+1)\n }\n }\n }\n // 找到results里面路径最长的\n let count = 0\n let paths = undefined\n results.forEach((v,k)=>{\n if(v<3) return\n if(k.length>count){\n paths = k\n count = v \n }\n }) \n return [paths,count]\n\n}\n","/**\n * \n * import { installCycleDetectExtend } from \"@autostore/devtools\"\n * \n * installCycleDetectExtend({....})\n * \n * \n */\nimport { analysisCyclePath } from \"./utils\"\n\n\nexport type CycleDetectExtendOptions = { \n /**\n * 当检测到多少个循环时视为循环依赖 \n */\n cycleCount?:number\n /**\n * \n * 当检测时间操作数量达到此值时,停止检测\n * \n */\n maxOpereates?:number\n /**\n * 指定仅作用于指定的store\n * =[]代表所有store均生效\n */\n stores?:string[]\n /**\n * \n */\n onDetected?:(paths:string[],computedObject:any)=>'ignore'|'throw'|'disable' \n\n}\n\n/**\n * \n * - 在异步计算第一次执行时调用\n * cycleDetector.start()\n * \n * \n * \n */\nexport class AsyncCycleDetector{\n steps:string[] = []\n running:boolean = false \n private _watcher:any\n path:string\n options: Record<string,any>\n constructor(public computedObject:any,options?:Record<string,any>){\n this.path = computedObject.path.join('.')\n this.steps.push(this.path)\n this.options = Object.assign({\n cycleCount : 8,\n maxOpereates: 200,\n stores:[]\n },options)\n } \n /**\n * 本方法应该在异步函数第一次运行时调用\n */\n start(){\n this.running = true\n this.steps.push(this.path)\n this._watcher = this.computedObject.store.watch((event:any)=>{\n if(this.steps.length<500){\n this.steps.push(event.path.join('.'))\n }\n },{operates:'read'}) \n }\n /**\n * \n * 开始检测是否存在循环依赖\n * \n * \n * [\"a\",'d','c','b','a','d','c','b','a']\n * \n * \n * 编写一个函数,检测是否存在循环依赖\n * \n * 逻辑如下:\n * \n * 对this.steps里面是否存在连续的相同的路径,如果存在,则表示存在循环依赖\n * \n * \n * @returns \n */\n private analysisCycleSteps(){\n const [paths,count] = analysisCyclePath(this.steps,this.path)\n const { onDetected,cycleCount } = this.options\n if(count<cycleCount) return\n this.computedObject.store.log(`CycleDepend detected in <${this.computedObject.toString()}>: ${paths}`,'warn')\n if(typeof(onDetected )==='function'){\n const result = onDetected(paths,this.computedObject)\n if(result==='ignore'){\n return\n }else if(result==='disable') {\n this.computedObject.enable = false\n }else{\n throw new Error(`CycleDepend found in <${this.computedObject.toString()}>: ${paths}`)\n }\n } \n } \n detect(){\n if(this.steps.length>this.options.maxOpereates){\n this._watcher.off()\n try{\n this.analysisCycleSteps()\n }finally{ \n this.steps=[]\n }\n }\n }\n}\n\n\nfunction createCycleDetectExtend(options?:CycleDetectExtendOptions){\n return function cycleDetectExtend(store:any){\n const { onObserverCreated } = store.options\n if(typeof(onObserverCreated) ==='function'){ \n // 当store的onObserverCreated选项已经配置时,cycleDetectExtend不能生效\n store.log(`Store<${store.id}> onObserverCreated is already configured, cycleDetectExtend is disabled`,\"warn\")\n }else{\n store.options.onObserverCreated = (observerObject:any)=>{\n // 只对异步计算属性进行循环依赖检测\n if(observerObject.type==='computed' && observerObject.async){\n observerObject._cycleDetector = new AsyncCycleDetector(observerObject,options)\n const oldRun = observerObject.run\n // 封装原始的run方法\n observerObject.run = (async function(options:any){\n // 在第一次运行时启动循环依赖检测\n if(options && options.first===true){\n observerObject._cycleDetector.start()\n }else{\n observerObject._cycleDetector.detect() \n }\n return await oldRun.apply(observerObject,options)\n }).bind(observerObject)\n }\n }\n store.log(\"cycleDetectExtend is already installed\")\n }\n } \n\n}\n\n\nexport function installCycleDetectExtend(options?:CycleDetectExtendOptions){\n // @ts-ignore\n if(!globalThis.__AUTOSTORE_EXTENDS__){\n // @ts-ignore\n globalThis.__AUTOSTORE_EXTENDS__=[]\n }\n // @ts-ignore\n globalThis.__AUTOSTORE_EXTENDS__.push(createCycleDetectExtend(options))\n \n}\n "]}
{"version":3,"sources":["../src/utils.ts","../src/cycleDetectExtend.ts"],"names":["isPathEq","a","b","item","index","pathStartsWith","basePath","destPath","p","i","analysisCyclePath","steps","curPath","indexs","prev","cur","groups","v","results","group","j","group2","gKey","n","count","paths","k","AsyncCycleDetector","computedObject","options","event","onDetected","cycleCount","result","createCycleDetectExtend","store","onObserverCreated","observerObject","oldRun","installCycleDetectExtend"],"mappings":"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","file":"cycleDetectExtend.mjs","sourcesContent":["\nexport class WeakObjectMap<T extends object> {\n private map: Map<string, WeakRef<T>>;\n private finalizationRegistry: FinalizationRegistry<string>;\n \n constructor() {\n this.map = new Map();\n this.finalizationRegistry = new FinalizationRegistry((key) => {\n this.map.delete(key);\n });\n }\n \n set(key: string, value: T): void {\n const weakRef = new WeakRef(value);\n this.map.set(key, weakRef);\n this.finalizationRegistry.register(value, key);\n }\n \n get(key: string): T | undefined {\n const weakRef = this.map.get(key);\n return weakRef ? weakRef.deref() : undefined;\n }\n \n delete(key: string): boolean {\n return this.map.delete(key);\n }\n \n has(key: string): boolean {\n const weakRef = this.map.get(key);\n return weakRef ? weakRef.deref() !== undefined : false;\n }\n}\n/**\n * 判定两个值是否相等\n * \n * 如果两个值都是对象,则判断两个对象是否相等\n * 如果两个值都是数组,则判断两个数组的值是否相等\n * \n */\n\nexport function isPathEq(a:string[] | undefined,b:string[] | undefined):boolean{\n if(!a) return false\n if(!b) return false\n if(a.length!==b.length) return false\n return a.every((item,index)=>item===b[index])\n}\n/**\n * 判断一个路径destPath是否包含另一个路径basePath判断\n * @param basePath \n * @param destPath \n */\nexport function pathStartsWith(basePath:string[],destPath:string[]){\n if(basePath.length>destPath.length) return false\n return basePath.every((p,i)=>{\n return p===destPath[i]\n })\n}\n\nexport function analysisCyclePath(steps:string[],curPath:string):[string | undefined,number] {\n // 使用curPath将steps分割为多个数组\n const indexs = steps.reduce((prev,cur,index)=>{\n if(cur===curPath) prev.push(index) \n return prev\n },[] as number[])\n\n const groups = indexs.map((v,i)=>{\n if(i<indexs.length-1){\n return steps.slice(v,indexs[i+1])\n }else{\n return steps.slice(v)\n } \n })\n\n // 找到groups相同的分组\n const results = new Map<string,number>()\n for(let i=0;i<groups.length;i++){\n const group = groups[i]\n if(group.length<2) continue\n for(let j=i+1;j<groups.length;j++){\n const group2 = groups[j]\n if(isPathEq(group,group2) || pathStartsWith(group,group2)){\n const gKey = group.join('->')\n if(!results.has(gKey)){\n results.set(gKey,1)\n }\n const n = results.get(gKey)! \n results.set(gKey,n+1)\n }\n }\n }\n // 找到results里面路径最长的\n let count = 0\n let paths = undefined\n results.forEach((v,k)=>{\n if(v<3) return\n if(k.length>count){\n paths = k\n count = v \n }\n }) \n return [paths,count]\n\n}\n","/**\n * \n * import { installCycleDetectExtend } from \"@autostore/devtools\"\n * \n * installCycleDetectExtend({....})\n * \n * \n */\nimport { analysisCyclePath } from \"./utils\"\n\n\nexport type CycleDetectExtendOptions = { \n /**\n * 当检测到多少个循环时视为循环依赖 \n */\n cycleCount?:number\n /**\n * \n * 当检测时间操作数量达到此值时,停止检测\n * \n */\n maxOpereates?:number\n /**\n * 指定仅作用于指定的store\n * =[]代表所有store均生效\n */\n stores?:string[]\n /**\n * \n */\n onDetected?:(paths:string[],computedObject:any)=>'ignore'|'throw'|'disable' \n\n}\n\n/**\n * \n * - 在异步计算第一次执行时调用\n * cycleDetector.start()\n * \n * \n * \n */\nexport class AsyncCycleDetector{\n steps:string[] = []\n running:boolean = false \n private _watcher:any\n path:string\n options: Record<string,any>\n constructor(public computedObject:any,options?:Record<string,any>){\n this.path = computedObject.path.join('.')\n this.steps.push(this.path)\n this.options = Object.assign({\n cycleCount : 8,\n maxOpereates: 200,\n stores:[]\n },options)\n } \n /**\n * 本方法应该在异步函数第一次运行时调用\n */\n start(){\n this.running = true\n this.steps.push(this.path)\n this._watcher = this.computedObject.store.watch((event:any)=>{\n if(this.steps.length<500){\n this.steps.push(event.path.join('.'))\n }\n },{operates:'read'}) \n }\n /**\n * \n * 开始检测是否存在循环依赖\n * \n * \n * [\"a\",'d','c','b','a','d','c','b','a']\n * \n * \n * 编写一个函数,检测是否存在循环依赖\n * \n * 逻辑如下:\n * \n * 对this.steps里面是否存在连续的相同的路径,如果存在,则表示存在循环依赖\n * \n * \n * @returns \n */\n private analysisCycleSteps(){\n const [paths,count] = analysisCyclePath(this.steps,this.path)\n const { onDetected,cycleCount } = this.options\n if(count<cycleCount) return\n this.computedObject.store.log(`CycleDepend detected in <${this.computedObject.toString()}>: ${paths}`,'warn')\n if(typeof(onDetected )==='function'){\n const result = onDetected(paths,this.computedObject)\n if(result==='ignore'){\n return\n }else if(result==='disable') {\n this.computedObject.enable = false\n }else{\n throw new Error(`CycleDepend found in <${this.computedObject.toString()}>: ${paths}`)\n }\n } \n } \n detect(){\n if(this.steps.length>this.options.maxOpereates){\n this._watcher.off()\n try{\n this.analysisCycleSteps()\n }finally{ \n this.steps=[]\n }\n }\n }\n}\n\n\nfunction createCycleDetectExtend(options?:CycleDetectExtendOptions){\n return function cycleDetectExtend(store:any){\n const { onObserverCreated } = store.options\n if(typeof(onObserverCreated) ==='function'){ \n // 当store的onObserverCreated选项已经配置时,cycleDetectExtend不能生效\n store.log(`Store<${store.id}> onObserverCreated is already configured, cycleDetectExtend is disabled`,\"warn\")\n }else{\n store.options.onObserverCreated = (observerObject:any)=>{\n // 只对异步计算属性进行循环依赖检测\n if(observerObject.type==='computed' && observerObject.async){\n observerObject._cycleDetector = new AsyncCycleDetector(observerObject,options)\n const oldRun = observerObject.run\n // 封装原始的run方法\n observerObject.run = (async function(options:any){\n // 在第一次运行时启动循环依赖检测\n if(options && options.first===true){\n observerObject._cycleDetector.start()\n }else{\n observerObject._cycleDetector.detect() \n }\n return await oldRun.apply(observerObject,options)\n }).bind(observerObject)\n }\n }\n store.log(\"cycleDetectExtend is already installed\")\n }\n } \n\n}\n\n\nexport function installCycleDetectExtend(options?:CycleDetectExtendOptions){\n // @ts-ignore\n if(!globalThis.__AUTOSTORE_EXTENDS__){\n // @ts-ignore\n globalThis.__AUTOSTORE_EXTENDS__=[]\n }\n // @ts-ignore\n globalThis.__AUTOSTORE_EXTENDS__.push(createCycleDetectExtend(options))\n \n}\n "]}

@@ -1,12 +0,2 @@

'use strict';
var redux = require('redux');
var u=class{map;finalizationRegistry;constructor(){this.map=new Map,this.finalizationRegistry=new FinalizationRegistry(t=>{this.map.delete(t);});}set(t,e){let s=new WeakRef(e);this.map.set(t,s),this.finalizationRegistry.register(e,t);}get(t){let e=this.map.get(t);return e?e.deref():void 0}delete(t){return this.map.delete(t)}has(t){let e=this.map.get(t);return e?e.deref()!==void 0:!1}};function y(i,t){return !i||!t||i.length!==t.length?!1:i.every((e,s)=>e===t[s])}function E(i,t){return i.length>t.length?!1:i.every((e,s)=>e===t[s])}function g(i,t){let e=i.reduce((r,o,c)=>(o===t&&r.push(c),r),[]),s=e.map((r,o)=>o<e.length-1?i.slice(r,e[o+1]):i.slice(r)),n=new Map;for(let r=0;r<s.length;r++){let o=s[r];if(!(o.length<2))for(let c=r+1;c<s.length;c++){let f=s[c];if(y(o,f)||E(o,f)){let p=o.join("->");n.has(p)||n.set(p,1);let _=n.get(p);n.set(p,_+1);}}}let a=0,l;return n.forEach((r,o)=>{r<3||o.length>a&&(l=o,a=r);}),[l,a]}var h=class{constructor(t,e){this.computedObject=t;this.path=t.path.join("."),this.steps.push(this.path),this.options=Object.assign({cycleCount:8,maxOpereates:200,stores:[]},e);}steps=[];running=!1;_watcher;path;options;start(){this.running=!0,this.steps.push(this.path),this._watcher=this.computedObject.store.watch(t=>{this.steps.length<500&&this.steps.push(t.path.join("."));},{operates:"read"});}analysisCycleSteps(){let[t,e]=g(this.steps,this.path),{onDetected:s,cycleCount:n}=this.options;if(!(e<n)&&(this.computedObject.store.log(`CycleDepend detected in <${this.computedObject.toString()}>: ${t}`,"warn"),typeof s=="function")){let a=s(t,this.computedObject);if(a==="ignore")return;if(a==="disable")this.computedObject.enable=!1;else throw new Error(`CycleDepend found in <${this.computedObject.toString()}>: ${t}`)}}detect(){if(this.steps.length>this.options.maxOpereates){this._watcher.off();try{this.analysisCycleSteps();}finally{this.steps=[];}}}};function S(i){return function(e){let{onObserverCreated:s}=e.options;typeof s=="function"?e.log(`Store<${e.id}> onObserverCreated is already configured, cycleDetectExtend is disabled`,"warn"):(e.options.onObserverCreated=n=>{if(n.type==="computed"&&n.async){n._cycleDetector=new h(n,i);let a=n.run;n.run=async function(l){return l&&l.first===!0?n._cycleDetector.start():n._cycleDetector.detect(),await a.apply(n,l)}.bind(n);}},e.log("cycleDetectExtend is already installed"));}}function w(i){globalThis.__AUTOSTORE_EXTENDS__||(globalThis.__AUTOSTORE_EXTENDS__=[]),globalThis.__AUTOSTORE_EXTENDS__.push(S(i));}var T={},d=class{reduxStore;_installed=!1;stores=new u;constructor(){this.install();}add(t){this.stores.set(t.id,t),t.operates.onAny((e,s)=>{e.type!=="get"&&this.reduxStore.dispatch({type:`${e.type}@${s}`,store:t,payload:e});}),this.reduxStore.dispatch({type:"__ADD_STORE__",store:t});}remove(t){this.stores.has(t.id)&&this.stores.delete(t.id);}reducer(t=T,e){return e.type.startsWith("@@")?t:e.type==="__ADD_STORE__"?{...t,[`AutoStore<${e.store.id}>`]:{...e.store.getSnap()}}:{...t,[`AutoStore<${e.store.id}>`]:{...e.store.getSnap()}}}install(){this._installed||(this.reduxStore=redux.legacy_createStore(this.reducer,window.__REDUX_DEVTOOLS_EXTENSION__&&window.__REDUX_DEVTOOLS_EXTENSION__()),this._installed=!0,console.info("%c AutoStoreDevTools installed. Please open <Redux devtools> to view. %c","color:red;",""));}};function m(){globalThis.__AUTOSTORE_DEVTOOLS__||(globalThis.__AUTOSTORE_DEVTOOLS__=new d);}m();
exports.AsyncCycleDetector = h;
exports.AutoStoreDevTools = d;
exports.install = m;
exports.installCycleDetectExtend = w;
//# sourceMappingURL=index.js.map
'use strict';var redux=require('redux');var u=class{map;finalizationRegistry;constructor(){this.map=new Map,this.finalizationRegistry=new FinalizationRegistry(t=>{this.map.delete(t);});}set(t,e){let s=new WeakRef(e);this.map.set(t,s),this.finalizationRegistry.register(e,t);}get(t){let e=this.map.get(t);return e?e.deref():void 0}delete(t){return this.map.delete(t)}has(t){let e=this.map.get(t);return e?e.deref()!==void 0:false}};function y(i,t){return !i||!t||i.length!==t.length?false:i.every((e,s)=>e===t[s])}function E(i,t){return i.length>t.length?false:i.every((e,s)=>e===t[s])}function g(i,t){let e=i.reduce((r,o,c)=>(o===t&&r.push(c),r),[]),s=e.map((r,o)=>o<e.length-1?i.slice(r,e[o+1]):i.slice(r)),n=new Map;for(let r=0;r<s.length;r++){let o=s[r];if(!(o.length<2))for(let c=r+1;c<s.length;c++){let f=s[c];if(y(o,f)||E(o,f)){let p=o.join("->");n.has(p)||n.set(p,1);let _=n.get(p);n.set(p,_+1);}}}let a=0,l;return n.forEach((r,o)=>{r<3||o.length>a&&(l=o,a=r);}),[l,a]}var h=class{constructor(t,e){this.computedObject=t;this.path=t.path.join("."),this.steps.push(this.path),this.options=Object.assign({cycleCount:8,maxOpereates:200,stores:[]},e);}steps=[];running=false;_watcher;path;options;start(){this.running=true,this.steps.push(this.path),this._watcher=this.computedObject.store.watch(t=>{this.steps.length<500&&this.steps.push(t.path.join("."));},{operates:"read"});}analysisCycleSteps(){let[t,e]=g(this.steps,this.path),{onDetected:s,cycleCount:n}=this.options;if(!(e<n)&&(this.computedObject.store.log(`CycleDepend detected in <${this.computedObject.toString()}>: ${t}`,"warn"),typeof s=="function")){let a=s(t,this.computedObject);if(a==="ignore")return;if(a==="disable")this.computedObject.enable=false;else throw new Error(`CycleDepend found in <${this.computedObject.toString()}>: ${t}`)}}detect(){if(this.steps.length>this.options.maxOpereates){this._watcher.off();try{this.analysisCycleSteps();}finally{this.steps=[];}}}};function S(i){return function(e){let{onObserverCreated:s}=e.options;typeof s=="function"?e.log(`Store<${e.id}> onObserverCreated is already configured, cycleDetectExtend is disabled`,"warn"):(e.options.onObserverCreated=n=>{if(n.type==="computed"&&n.async){n._cycleDetector=new h(n,i);let a=n.run;n.run=async function(l){return l&&l.first===true?n._cycleDetector.start():n._cycleDetector.detect(),await a.apply(n,l)}.bind(n);}},e.log("cycleDetectExtend is already installed"));}}function w(i){globalThis.__AUTOSTORE_EXTENDS__||(globalThis.__AUTOSTORE_EXTENDS__=[]),globalThis.__AUTOSTORE_EXTENDS__.push(S(i));}var T={},d=class{reduxStore;_installed=false;stores=new u;constructor(){this.install();}add(t){this.stores.set(t.id,t),t.operates.onAny((e,s)=>{e.type!=="get"&&this.reduxStore.dispatch({type:`${e.type}@${s}`,store:t,payload:e});}),this.reduxStore.dispatch({type:"__ADD_STORE__",store:t});}remove(t){this.stores.has(t.id)&&this.stores.delete(t.id);}reducer(t=T,e){return e.type.startsWith("@@")?t:e.type==="__ADD_STORE__"?{...t,[`AutoStore<${e.store.id}>`]:{...e.store.getSnap()}}:{...t,[`AutoStore<${e.store.id}>`]:{...e.store.getSnap()}}}install(){this._installed||(this.reduxStore=redux.legacy_createStore(this.reducer,window.__REDUX_DEVTOOLS_EXTENSION__&&window.__REDUX_DEVTOOLS_EXTENSION__()),this._installed=true,console.info("%c AutoStoreDevTools installed. Please open <Redux devtools> to view. %c","color:red;",""));}};function m(){globalThis.__AUTOSTORE_DEVTOOLS__||(globalThis.__AUTOSTORE_DEVTOOLS__=new d);}m();exports.AsyncCycleDetector=h;exports.AutoStoreDevTools=d;exports.install=m;exports.installCycleDetectExtend=w;//# sourceMappingURL=index.js.map
//# sourceMappingURL=index.js.map

@@ -1,1 +0,1 @@

{"version":3,"sources":["../src/utils.ts","../src/cycleDetectExtend.ts","../src/devTools.ts"],"names":["WeakObjectMap","key","value","weakRef","isPathEq","a","b","item","index","pathStartsWith","basePath","destPath","p","i","analysisCyclePath","steps","curPath","indexs","prev","cur","groups","v","results","group","j","group2","gKey","n","count","paths","k","AsyncCycleDetector","computedObject","options","event","onDetected","cycleCount","result","createCycleDetectExtend","store","onObserverCreated","observerObject","oldRun","installCycleDetectExtend","initialState","AutoStoreDevTools","payload","type","state","action","createStore","install"],"mappings":"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","file":"index.js","sourcesContent":["\nexport class WeakObjectMap<T extends object> {\n private map: Map<string, WeakRef<T>>;\n private finalizationRegistry: FinalizationRegistry<string>;\n \n constructor() {\n this.map = new Map();\n this.finalizationRegistry = new FinalizationRegistry((key) => {\n this.map.delete(key);\n });\n }\n \n set(key: string, value: T): void {\n const weakRef = new WeakRef(value);\n this.map.set(key, weakRef);\n this.finalizationRegistry.register(value, key);\n }\n \n get(key: string): T | undefined {\n const weakRef = this.map.get(key);\n return weakRef ? weakRef.deref() : undefined;\n }\n \n delete(key: string): boolean {\n return this.map.delete(key);\n }\n \n has(key: string): boolean {\n const weakRef = this.map.get(key);\n return weakRef ? weakRef.deref() !== undefined : false;\n }\n}\n/**\n * 判定两个值是否相等\n * \n * 如果两个值都是对象,则判断两个对象是否相等\n * 如果两个值都是数组,则判断两个数组的值是否相等\n * \n */\n\nexport function isPathEq(a:string[] | undefined,b:string[] | undefined):boolean{\n if(!a) return false\n if(!b) return false\n if(a.length!==b.length) return false\n return a.every((item,index)=>item===b[index])\n}\n/**\n * 判断一个路径destPath是否包含另一个路径basePath判断\n * @param basePath \n * @param destPath \n */\nexport function pathStartsWith(basePath:string[],destPath:string[]){\n if(basePath.length>destPath.length) return false\n return basePath.every((p,i)=>{\n return p===destPath[i]\n })\n}\n\nexport function analysisCyclePath(steps:string[],curPath:string):[string | undefined,number] {\n // 使用curPath将steps分割为多个数组\n const indexs = steps.reduce((prev,cur,index)=>{\n if(cur===curPath) prev.push(index) \n return prev\n },[] as number[])\n\n const groups = indexs.map((v,i)=>{\n if(i<indexs.length-1){\n return steps.slice(v,indexs[i+1])\n }else{\n return steps.slice(v)\n } \n })\n\n // 找到groups相同的分组\n const results = new Map<string,number>()\n for(let i=0;i<groups.length;i++){\n const group = groups[i]\n if(group.length<2) continue\n for(let j=i+1;j<groups.length;j++){\n const group2 = groups[j]\n if(isPathEq(group,group2) || pathStartsWith(group,group2)){\n const gKey = group.join('->')\n if(!results.has(gKey)){\n results.set(gKey,1)\n }\n const n = results.get(gKey)! \n results.set(gKey,n+1)\n }\n }\n }\n // 找到results里面路径最长的\n let count = 0\n let paths = undefined\n results.forEach((v,k)=>{\n if(v<3) return\n if(k.length>count){\n paths = k\n count = v \n }\n }) \n return [paths,count]\n\n}\n","/**\n * \n * import { installCycleDetectExtend } from \"@autostore/devtools\"\n * \n * installCycleDetectExtend({....})\n * \n * \n */\nimport { analysisCyclePath } from \"./utils\"\n\n\nexport type CycleDetectExtendOptions = { \n /**\n * 当检测到多少个循环时视为循环依赖 \n */\n cycleCount?:number\n /**\n * \n * 当检测时间操作数量达到此值时,停止检测\n * \n */\n maxOpereates?:number\n /**\n * 指定仅作用于指定的store\n * =[]代表所有store均生效\n */\n stores?:string[]\n /**\n * \n */\n onDetected?:(paths:string[],computedObject:any)=>'ignore'|'throw'|'disable' \n\n}\n\n/**\n * \n * - 在异步计算第一次执行时调用\n * cycleDetector.start()\n * \n * \n * \n */\nexport class AsyncCycleDetector{\n steps:string[] = []\n running:boolean = false \n private _watcher:any\n path:string\n options: Record<string,any>\n constructor(public computedObject:any,options?:Record<string,any>){\n this.path = computedObject.path.join('.')\n this.steps.push(this.path)\n this.options = Object.assign({\n cycleCount : 8,\n maxOpereates: 200,\n stores:[]\n },options)\n } \n /**\n * 本方法应该在异步函数第一次运行时调用\n */\n start(){\n this.running = true\n this.steps.push(this.path)\n this._watcher = this.computedObject.store.watch((event:any)=>{\n if(this.steps.length<500){\n this.steps.push(event.path.join('.'))\n }\n },{operates:'read'}) \n }\n /**\n * \n * 开始检测是否存在循环依赖\n * \n * \n * [\"a\",'d','c','b','a','d','c','b','a']\n * \n * \n * 编写一个函数,检测是否存在循环依赖\n * \n * 逻辑如下:\n * \n * 对this.steps里面是否存在连续的相同的路径,如果存在,则表示存在循环依赖\n * \n * \n * @returns \n */\n private analysisCycleSteps(){\n const [paths,count] = analysisCyclePath(this.steps,this.path)\n const { onDetected,cycleCount } = this.options\n if(count<cycleCount) return\n this.computedObject.store.log(`CycleDepend detected in <${this.computedObject.toString()}>: ${paths}`,'warn')\n if(typeof(onDetected )==='function'){\n const result = onDetected(paths,this.computedObject)\n if(result==='ignore'){\n return\n }else if(result==='disable') {\n this.computedObject.enable = false\n }else{\n throw new Error(`CycleDepend found in <${this.computedObject.toString()}>: ${paths}`)\n }\n } \n } \n detect(){\n if(this.steps.length>this.options.maxOpereates){\n this._watcher.off()\n try{\n this.analysisCycleSteps()\n }finally{ \n this.steps=[]\n }\n }\n }\n}\n\n\nfunction createCycleDetectExtend(options?:CycleDetectExtendOptions){\n return function cycleDetectExtend(store:any){\n const { onObserverCreated } = store.options\n if(typeof(onObserverCreated) ==='function'){ \n // 当store的onObserverCreated选项已经配置时,cycleDetectExtend不能生效\n store.log(`Store<${store.id}> onObserverCreated is already configured, cycleDetectExtend is disabled`,\"warn\")\n }else{\n store.options.onObserverCreated = (observerObject:any)=>{\n // 只对异步计算属性进行循环依赖检测\n if(observerObject.type==='computed' && observerObject.async){\n observerObject._cycleDetector = new AsyncCycleDetector(observerObject,options)\n const oldRun = observerObject.run\n // 封装原始的run方法\n observerObject.run = (async function(options:any){\n // 在第一次运行时启动循环依赖检测\n if(options && options.first===true){\n observerObject._cycleDetector.start()\n }else{\n observerObject._cycleDetector.detect() \n }\n return await oldRun.apply(observerObject,options)\n }).bind(observerObject)\n }\n }\n store.log(\"cycleDetectExtend is already installed\")\n }\n } \n\n}\n\n\nexport function installCycleDetectExtend(options?:CycleDetectExtendOptions){\n // @ts-ignore\n if(!globalThis.__AUTOSTORE_EXTENDS__){\n // @ts-ignore\n globalThis.__AUTOSTORE_EXTENDS__=[]\n }\n // @ts-ignore\n globalThis.__AUTOSTORE_EXTENDS__.push(createCycleDetectExtend(options))\n \n}\n ","/**\n * \n * 基于开发工具\n * \n * Redux DevTools 是一个实用工具,用于开发和调试 Redux 应用程序。\n * AutoStore是基于Redux DevTools 的简单包装,可以让开发者使用Redux DevTools\n * 来查看AutoStore的状态变化 \n * \n * import { createStore } from \"@autostorejs/react\"\n * import { install } from \"@autostorejs/devtools\"\n * \n * \n * const store = createStore({})\n * \n * install()\n * \n */\n\n//@ts-ignore\nimport { legacy_createStore as createStore } from \"redux\"\nimport { WeakObjectMap } from \"./utils\"\n \nconst initialState = {\n \n}\n\n\nexport class AutoStoreDevTools{\n private reduxStore:any\n private _installed:boolean = false\n stores = new WeakObjectMap()\n constructor(){\n this.install()\n }\n add(store:any){ \n this.stores.set(store.id,store)\n store.operates.onAny((payload:any,type:any)=>{ \n if(payload.type==='get') return \n this.reduxStore.dispatch({\n type:`${payload.type}@${type}`,\n store,\n payload \n })\n })\n this.reduxStore.dispatch({\n type:\"__ADD_STORE__\",\n store\n })\n }\n remove(store:any){ \n if( this.stores.has(store.id)){\n this.stores.delete(store.id)\n }\n }\n private reducer(state:object = initialState, action:any){\n if(action.type.startsWith(\"@@\")) return state\n if(action.type==='__ADD_STORE__') {\n return {\n ...state,\n [`AutoStore<${action.store.id}>`]:{...action.store.getSnap()}\n }\n }else{\n return {\n ...state,\n [`AutoStore<${action.store.id}>`]:{...action.store.getSnap()}\n }\n } \n }\n private install(){\n if(this._installed) return \n this.reduxStore = createStore(\n this.reducer,\n // @ts-ignore\n window.__REDUX_DEVTOOLS_EXTENSION__ && window.__REDUX_DEVTOOLS_EXTENSION__()\n ); \n this._installed = true\n console.info('%c AutoStoreDevTools installed. Please open <Redux devtools> to view. %c',\"color:red;\",'')\n }\n}\n\nexport function install(){\n // @ts-ignore\n if(!globalThis.__AUTOSTORE_DEVTOOLS__) globalThis.__AUTOSTORE_DEVTOOLS__ = new AutoStoreDevTools() \n} \n\ndeclare global{\n // @ts-ignore\n var __AUTOSTORE_DEVTOOLS__ : AutoStoreDevTools\n}\n\n\ninstall()\n\n"]}
{"version":3,"sources":["../src/utils.ts","../src/cycleDetectExtend.ts","../src/devTools.ts"],"names":["WeakObjectMap","key","value","weakRef","isPathEq","a","b","item","index","pathStartsWith","basePath","destPath","p","i","analysisCyclePath","steps","curPath","indexs","prev","cur","groups","v","results","group","j","group2","gKey","n","count","paths","k","AsyncCycleDetector","computedObject","options","event","onDetected","cycleCount","result","createCycleDetectExtend","store","onObserverCreated","observerObject","oldRun","installCycleDetectExtend","initialState","AutoStoreDevTools","payload","type","state","action","createStore","install"],"mappings":"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","file":"index.js","sourcesContent":["\nexport class WeakObjectMap<T extends object> {\n private map: Map<string, WeakRef<T>>;\n private finalizationRegistry: FinalizationRegistry<string>;\n \n constructor() {\n this.map = new Map();\n this.finalizationRegistry = new FinalizationRegistry((key) => {\n this.map.delete(key);\n });\n }\n \n set(key: string, value: T): void {\n const weakRef = new WeakRef(value);\n this.map.set(key, weakRef);\n this.finalizationRegistry.register(value, key);\n }\n \n get(key: string): T | undefined {\n const weakRef = this.map.get(key);\n return weakRef ? weakRef.deref() : undefined;\n }\n \n delete(key: string): boolean {\n return this.map.delete(key);\n }\n \n has(key: string): boolean {\n const weakRef = this.map.get(key);\n return weakRef ? weakRef.deref() !== undefined : false;\n }\n}\n/**\n * 判定两个值是否相等\n * \n * 如果两个值都是对象,则判断两个对象是否相等\n * 如果两个值都是数组,则判断两个数组的值是否相等\n * \n */\n\nexport function isPathEq(a:string[] | undefined,b:string[] | undefined):boolean{\n if(!a) return false\n if(!b) return false\n if(a.length!==b.length) return false\n return a.every((item,index)=>item===b[index])\n}\n/**\n * 判断一个路径destPath是否包含另一个路径basePath判断\n * @param basePath \n * @param destPath \n */\nexport function pathStartsWith(basePath:string[],destPath:string[]){\n if(basePath.length>destPath.length) return false\n return basePath.every((p,i)=>{\n return p===destPath[i]\n })\n}\n\nexport function analysisCyclePath(steps:string[],curPath:string):[string | undefined,number] {\n // 使用curPath将steps分割为多个数组\n const indexs = steps.reduce((prev,cur,index)=>{\n if(cur===curPath) prev.push(index) \n return prev\n },[] as number[])\n\n const groups = indexs.map((v,i)=>{\n if(i<indexs.length-1){\n return steps.slice(v,indexs[i+1])\n }else{\n return steps.slice(v)\n } \n })\n\n // 找到groups相同的分组\n const results = new Map<string,number>()\n for(let i=0;i<groups.length;i++){\n const group = groups[i]\n if(group.length<2) continue\n for(let j=i+1;j<groups.length;j++){\n const group2 = groups[j]\n if(isPathEq(group,group2) || pathStartsWith(group,group2)){\n const gKey = group.join('->')\n if(!results.has(gKey)){\n results.set(gKey,1)\n }\n const n = results.get(gKey)! \n results.set(gKey,n+1)\n }\n }\n }\n // 找到results里面路径最长的\n let count = 0\n let paths = undefined\n results.forEach((v,k)=>{\n if(v<3) return\n if(k.length>count){\n paths = k\n count = v \n }\n }) \n return [paths,count]\n\n}\n","/**\n * \n * import { installCycleDetectExtend } from \"@autostore/devtools\"\n * \n * installCycleDetectExtend({....})\n * \n * \n */\nimport { analysisCyclePath } from \"./utils\"\n\n\nexport type CycleDetectExtendOptions = { \n /**\n * 当检测到多少个循环时视为循环依赖 \n */\n cycleCount?:number\n /**\n * \n * 当检测时间操作数量达到此值时,停止检测\n * \n */\n maxOpereates?:number\n /**\n * 指定仅作用于指定的store\n * =[]代表所有store均生效\n */\n stores?:string[]\n /**\n * \n */\n onDetected?:(paths:string[],computedObject:any)=>'ignore'|'throw'|'disable' \n\n}\n\n/**\n * \n * - 在异步计算第一次执行时调用\n * cycleDetector.start()\n * \n * \n * \n */\nexport class AsyncCycleDetector{\n steps:string[] = []\n running:boolean = false \n private _watcher:any\n path:string\n options: Record<string,any>\n constructor(public computedObject:any,options?:Record<string,any>){\n this.path = computedObject.path.join('.')\n this.steps.push(this.path)\n this.options = Object.assign({\n cycleCount : 8,\n maxOpereates: 200,\n stores:[]\n },options)\n } \n /**\n * 本方法应该在异步函数第一次运行时调用\n */\n start(){\n this.running = true\n this.steps.push(this.path)\n this._watcher = this.computedObject.store.watch((event:any)=>{\n if(this.steps.length<500){\n this.steps.push(event.path.join('.'))\n }\n },{operates:'read'}) \n }\n /**\n * \n * 开始检测是否存在循环依赖\n * \n * \n * [\"a\",'d','c','b','a','d','c','b','a']\n * \n * \n * 编写一个函数,检测是否存在循环依赖\n * \n * 逻辑如下:\n * \n * 对this.steps里面是否存在连续的相同的路径,如果存在,则表示存在循环依赖\n * \n * \n * @returns \n */\n private analysisCycleSteps(){\n const [paths,count] = analysisCyclePath(this.steps,this.path)\n const { onDetected,cycleCount } = this.options\n if(count<cycleCount) return\n this.computedObject.store.log(`CycleDepend detected in <${this.computedObject.toString()}>: ${paths}`,'warn')\n if(typeof(onDetected )==='function'){\n const result = onDetected(paths,this.computedObject)\n if(result==='ignore'){\n return\n }else if(result==='disable') {\n this.computedObject.enable = false\n }else{\n throw new Error(`CycleDepend found in <${this.computedObject.toString()}>: ${paths}`)\n }\n } \n } \n detect(){\n if(this.steps.length>this.options.maxOpereates){\n this._watcher.off()\n try{\n this.analysisCycleSteps()\n }finally{ \n this.steps=[]\n }\n }\n }\n}\n\n\nfunction createCycleDetectExtend(options?:CycleDetectExtendOptions){\n return function cycleDetectExtend(store:any){\n const { onObserverCreated } = store.options\n if(typeof(onObserverCreated) ==='function'){ \n // 当store的onObserverCreated选项已经配置时,cycleDetectExtend不能生效\n store.log(`Store<${store.id}> onObserverCreated is already configured, cycleDetectExtend is disabled`,\"warn\")\n }else{\n store.options.onObserverCreated = (observerObject:any)=>{\n // 只对异步计算属性进行循环依赖检测\n if(observerObject.type==='computed' && observerObject.async){\n observerObject._cycleDetector = new AsyncCycleDetector(observerObject,options)\n const oldRun = observerObject.run\n // 封装原始的run方法\n observerObject.run = (async function(options:any){\n // 在第一次运行时启动循环依赖检测\n if(options && options.first===true){\n observerObject._cycleDetector.start()\n }else{\n observerObject._cycleDetector.detect() \n }\n return await oldRun.apply(observerObject,options)\n }).bind(observerObject)\n }\n }\n store.log(\"cycleDetectExtend is already installed\")\n }\n } \n\n}\n\n\nexport function installCycleDetectExtend(options?:CycleDetectExtendOptions){\n // @ts-ignore\n if(!globalThis.__AUTOSTORE_EXTENDS__){\n // @ts-ignore\n globalThis.__AUTOSTORE_EXTENDS__=[]\n }\n // @ts-ignore\n globalThis.__AUTOSTORE_EXTENDS__.push(createCycleDetectExtend(options))\n \n}\n ","/**\n * \n * 基于开发工具\n * \n * Redux DevTools 是一个实用工具,用于开发和调试 Redux 应用程序。\n * AutoStore是基于Redux DevTools 的简单包装,可以让开发者使用Redux DevTools\n * 来查看AutoStore的状态变化 \n * \n * import { createStore } from \"@autostorejs/react\"\n * import { install } from \"@autostorejs/devtools\"\n * \n * \n * const store = createStore({})\n * \n * install()\n * \n */\n\n//@ts-ignore\nimport { legacy_createStore as createStore } from \"redux\"\nimport { WeakObjectMap } from \"./utils\"\n \nconst initialState = {\n \n}\n\n\nexport class AutoStoreDevTools{\n private reduxStore:any\n private _installed:boolean = false\n stores = new WeakObjectMap()\n constructor(){\n this.install()\n }\n add(store:any){ \n this.stores.set(store.id,store)\n store.operates.onAny((payload:any,type:any)=>{ \n if(payload.type==='get') return \n this.reduxStore.dispatch({\n type:`${payload.type}@${type}`,\n store,\n payload \n })\n })\n this.reduxStore.dispatch({\n type:\"__ADD_STORE__\",\n store\n })\n }\n remove(store:any){ \n if( this.stores.has(store.id)){\n this.stores.delete(store.id)\n }\n }\n private reducer(state:object = initialState, action:any){\n if(action.type.startsWith(\"@@\")) return state\n if(action.type==='__ADD_STORE__') {\n return {\n ...state,\n [`AutoStore<${action.store.id}>`]:{...action.store.getSnap()}\n }\n }else{\n return {\n ...state,\n [`AutoStore<${action.store.id}>`]:{...action.store.getSnap()}\n }\n } \n }\n private install(){\n if(this._installed) return \n this.reduxStore = createStore(\n this.reducer,\n // @ts-ignore\n window.__REDUX_DEVTOOLS_EXTENSION__ && window.__REDUX_DEVTOOLS_EXTENSION__()\n ); \n this._installed = true\n console.info('%c AutoStoreDevTools installed. Please open <Redux devtools> to view. %c',\"color:red;\",'')\n }\n}\n\nexport function install(){\n // @ts-ignore\n if(!globalThis.__AUTOSTORE_DEVTOOLS__) globalThis.__AUTOSTORE_DEVTOOLS__ = new AutoStoreDevTools() \n} \n\ndeclare global{\n // @ts-ignore\n var __AUTOSTORE_DEVTOOLS__ : AutoStoreDevTools\n}\n\n\ninstall()\n\n"]}

@@ -1,7 +0,2 @@

import { legacy_createStore } from 'redux';
var u=class{map;finalizationRegistry;constructor(){this.map=new Map,this.finalizationRegistry=new FinalizationRegistry(t=>{this.map.delete(t);});}set(t,e){let s=new WeakRef(e);this.map.set(t,s),this.finalizationRegistry.register(e,t);}get(t){let e=this.map.get(t);return e?e.deref():void 0}delete(t){return this.map.delete(t)}has(t){let e=this.map.get(t);return e?e.deref()!==void 0:!1}};function y(i,t){return !i||!t||i.length!==t.length?!1:i.every((e,s)=>e===t[s])}function E(i,t){return i.length>t.length?!1:i.every((e,s)=>e===t[s])}function g(i,t){let e=i.reduce((r,o,c)=>(o===t&&r.push(c),r),[]),s=e.map((r,o)=>o<e.length-1?i.slice(r,e[o+1]):i.slice(r)),n=new Map;for(let r=0;r<s.length;r++){let o=s[r];if(!(o.length<2))for(let c=r+1;c<s.length;c++){let f=s[c];if(y(o,f)||E(o,f)){let p=o.join("->");n.has(p)||n.set(p,1);let _=n.get(p);n.set(p,_+1);}}}let a=0,l;return n.forEach((r,o)=>{r<3||o.length>a&&(l=o,a=r);}),[l,a]}var h=class{constructor(t,e){this.computedObject=t;this.path=t.path.join("."),this.steps.push(this.path),this.options=Object.assign({cycleCount:8,maxOpereates:200,stores:[]},e);}steps=[];running=!1;_watcher;path;options;start(){this.running=!0,this.steps.push(this.path),this._watcher=this.computedObject.store.watch(t=>{this.steps.length<500&&this.steps.push(t.path.join("."));},{operates:"read"});}analysisCycleSteps(){let[t,e]=g(this.steps,this.path),{onDetected:s,cycleCount:n}=this.options;if(!(e<n)&&(this.computedObject.store.log(`CycleDepend detected in <${this.computedObject.toString()}>: ${t}`,"warn"),typeof s=="function")){let a=s(t,this.computedObject);if(a==="ignore")return;if(a==="disable")this.computedObject.enable=!1;else throw new Error(`CycleDepend found in <${this.computedObject.toString()}>: ${t}`)}}detect(){if(this.steps.length>this.options.maxOpereates){this._watcher.off();try{this.analysisCycleSteps();}finally{this.steps=[];}}}};function S(i){return function(e){let{onObserverCreated:s}=e.options;typeof s=="function"?e.log(`Store<${e.id}> onObserverCreated is already configured, cycleDetectExtend is disabled`,"warn"):(e.options.onObserverCreated=n=>{if(n.type==="computed"&&n.async){n._cycleDetector=new h(n,i);let a=n.run;n.run=async function(l){return l&&l.first===!0?n._cycleDetector.start():n._cycleDetector.detect(),await a.apply(n,l)}.bind(n);}},e.log("cycleDetectExtend is already installed"));}}function w(i){globalThis.__AUTOSTORE_EXTENDS__||(globalThis.__AUTOSTORE_EXTENDS__=[]),globalThis.__AUTOSTORE_EXTENDS__.push(S(i));}var T={},d=class{reduxStore;_installed=!1;stores=new u;constructor(){this.install();}add(t){this.stores.set(t.id,t),t.operates.onAny((e,s)=>{e.type!=="get"&&this.reduxStore.dispatch({type:`${e.type}@${s}`,store:t,payload:e});}),this.reduxStore.dispatch({type:"__ADD_STORE__",store:t});}remove(t){this.stores.has(t.id)&&this.stores.delete(t.id);}reducer(t=T,e){return e.type.startsWith("@@")?t:e.type==="__ADD_STORE__"?{...t,[`AutoStore<${e.store.id}>`]:{...e.store.getSnap()}}:{...t,[`AutoStore<${e.store.id}>`]:{...e.store.getSnap()}}}install(){this._installed||(this.reduxStore=legacy_createStore(this.reducer,window.__REDUX_DEVTOOLS_EXTENSION__&&window.__REDUX_DEVTOOLS_EXTENSION__()),this._installed=!0,console.info("%c AutoStoreDevTools installed. Please open <Redux devtools> to view. %c","color:red;",""));}};function m(){globalThis.__AUTOSTORE_DEVTOOLS__||(globalThis.__AUTOSTORE_DEVTOOLS__=new d);}m();
export { h as AsyncCycleDetector, d as AutoStoreDevTools, m as install, w as installCycleDetectExtend };
//# sourceMappingURL=index.mjs.map
import {legacy_createStore}from'redux';var u=class{map;finalizationRegistry;constructor(){this.map=new Map,this.finalizationRegistry=new FinalizationRegistry(t=>{this.map.delete(t);});}set(t,e){let s=new WeakRef(e);this.map.set(t,s),this.finalizationRegistry.register(e,t);}get(t){let e=this.map.get(t);return e?e.deref():void 0}delete(t){return this.map.delete(t)}has(t){let e=this.map.get(t);return e?e.deref()!==void 0:false}};function y(i,t){return !i||!t||i.length!==t.length?false:i.every((e,s)=>e===t[s])}function E(i,t){return i.length>t.length?false:i.every((e,s)=>e===t[s])}function g(i,t){let e=i.reduce((r,o,c)=>(o===t&&r.push(c),r),[]),s=e.map((r,o)=>o<e.length-1?i.slice(r,e[o+1]):i.slice(r)),n=new Map;for(let r=0;r<s.length;r++){let o=s[r];if(!(o.length<2))for(let c=r+1;c<s.length;c++){let f=s[c];if(y(o,f)||E(o,f)){let p=o.join("->");n.has(p)||n.set(p,1);let _=n.get(p);n.set(p,_+1);}}}let a=0,l;return n.forEach((r,o)=>{r<3||o.length>a&&(l=o,a=r);}),[l,a]}var h=class{constructor(t,e){this.computedObject=t;this.path=t.path.join("."),this.steps.push(this.path),this.options=Object.assign({cycleCount:8,maxOpereates:200,stores:[]},e);}steps=[];running=false;_watcher;path;options;start(){this.running=true,this.steps.push(this.path),this._watcher=this.computedObject.store.watch(t=>{this.steps.length<500&&this.steps.push(t.path.join("."));},{operates:"read"});}analysisCycleSteps(){let[t,e]=g(this.steps,this.path),{onDetected:s,cycleCount:n}=this.options;if(!(e<n)&&(this.computedObject.store.log(`CycleDepend detected in <${this.computedObject.toString()}>: ${t}`,"warn"),typeof s=="function")){let a=s(t,this.computedObject);if(a==="ignore")return;if(a==="disable")this.computedObject.enable=false;else throw new Error(`CycleDepend found in <${this.computedObject.toString()}>: ${t}`)}}detect(){if(this.steps.length>this.options.maxOpereates){this._watcher.off();try{this.analysisCycleSteps();}finally{this.steps=[];}}}};function S(i){return function(e){let{onObserverCreated:s}=e.options;typeof s=="function"?e.log(`Store<${e.id}> onObserverCreated is already configured, cycleDetectExtend is disabled`,"warn"):(e.options.onObserverCreated=n=>{if(n.type==="computed"&&n.async){n._cycleDetector=new h(n,i);let a=n.run;n.run=async function(l){return l&&l.first===true?n._cycleDetector.start():n._cycleDetector.detect(),await a.apply(n,l)}.bind(n);}},e.log("cycleDetectExtend is already installed"));}}function w(i){globalThis.__AUTOSTORE_EXTENDS__||(globalThis.__AUTOSTORE_EXTENDS__=[]),globalThis.__AUTOSTORE_EXTENDS__.push(S(i));}var T={},d=class{reduxStore;_installed=false;stores=new u;constructor(){this.install();}add(t){this.stores.set(t.id,t),t.operates.onAny((e,s)=>{e.type!=="get"&&this.reduxStore.dispatch({type:`${e.type}@${s}`,store:t,payload:e});}),this.reduxStore.dispatch({type:"__ADD_STORE__",store:t});}remove(t){this.stores.has(t.id)&&this.stores.delete(t.id);}reducer(t=T,e){return e.type.startsWith("@@")?t:e.type==="__ADD_STORE__"?{...t,[`AutoStore<${e.store.id}>`]:{...e.store.getSnap()}}:{...t,[`AutoStore<${e.store.id}>`]:{...e.store.getSnap()}}}install(){this._installed||(this.reduxStore=legacy_createStore(this.reducer,window.__REDUX_DEVTOOLS_EXTENSION__&&window.__REDUX_DEVTOOLS_EXTENSION__()),this._installed=true,console.info("%c AutoStoreDevTools installed. Please open <Redux devtools> to view. %c","color:red;",""));}};function m(){globalThis.__AUTOSTORE_DEVTOOLS__||(globalThis.__AUTOSTORE_DEVTOOLS__=new d);}m();export{h as AsyncCycleDetector,d as AutoStoreDevTools,m as install,w as installCycleDetectExtend};//# sourceMappingURL=index.mjs.map
//# sourceMappingURL=index.mjs.map

@@ -1,1 +0,1 @@

{"version":3,"sources":["../src/utils.ts","../src/cycleDetectExtend.ts","../src/devTools.ts"],"names":["WeakObjectMap","key","value","weakRef","isPathEq","a","b","item","index","pathStartsWith","basePath","destPath","p","i","analysisCyclePath","steps","curPath","indexs","prev","cur","groups","v","results","group","j","group2","gKey","n","count","paths","k","AsyncCycleDetector","computedObject","options","event","onDetected","cycleCount","result","createCycleDetectExtend","store","onObserverCreated","observerObject","oldRun","installCycleDetectExtend","initialState","AutoStoreDevTools","payload","type","state","action","createStore","install"],"mappings":"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","file":"index.mjs","sourcesContent":["\nexport class WeakObjectMap<T extends object> {\n private map: Map<string, WeakRef<T>>;\n private finalizationRegistry: FinalizationRegistry<string>;\n \n constructor() {\n this.map = new Map();\n this.finalizationRegistry = new FinalizationRegistry((key) => {\n this.map.delete(key);\n });\n }\n \n set(key: string, value: T): void {\n const weakRef = new WeakRef(value);\n this.map.set(key, weakRef);\n this.finalizationRegistry.register(value, key);\n }\n \n get(key: string): T | undefined {\n const weakRef = this.map.get(key);\n return weakRef ? weakRef.deref() : undefined;\n }\n \n delete(key: string): boolean {\n return this.map.delete(key);\n }\n \n has(key: string): boolean {\n const weakRef = this.map.get(key);\n return weakRef ? weakRef.deref() !== undefined : false;\n }\n}\n/**\n * 判定两个值是否相等\n * \n * 如果两个值都是对象,则判断两个对象是否相等\n * 如果两个值都是数组,则判断两个数组的值是否相等\n * \n */\n\nexport function isPathEq(a:string[] | undefined,b:string[] | undefined):boolean{\n if(!a) return false\n if(!b) return false\n if(a.length!==b.length) return false\n return a.every((item,index)=>item===b[index])\n}\n/**\n * 判断一个路径destPath是否包含另一个路径basePath判断\n * @param basePath \n * @param destPath \n */\nexport function pathStartsWith(basePath:string[],destPath:string[]){\n if(basePath.length>destPath.length) return false\n return basePath.every((p,i)=>{\n return p===destPath[i]\n })\n}\n\nexport function analysisCyclePath(steps:string[],curPath:string):[string | undefined,number] {\n // 使用curPath将steps分割为多个数组\n const indexs = steps.reduce((prev,cur,index)=>{\n if(cur===curPath) prev.push(index) \n return prev\n },[] as number[])\n\n const groups = indexs.map((v,i)=>{\n if(i<indexs.length-1){\n return steps.slice(v,indexs[i+1])\n }else{\n return steps.slice(v)\n } \n })\n\n // 找到groups相同的分组\n const results = new Map<string,number>()\n for(let i=0;i<groups.length;i++){\n const group = groups[i]\n if(group.length<2) continue\n for(let j=i+1;j<groups.length;j++){\n const group2 = groups[j]\n if(isPathEq(group,group2) || pathStartsWith(group,group2)){\n const gKey = group.join('->')\n if(!results.has(gKey)){\n results.set(gKey,1)\n }\n const n = results.get(gKey)! \n results.set(gKey,n+1)\n }\n }\n }\n // 找到results里面路径最长的\n let count = 0\n let paths = undefined\n results.forEach((v,k)=>{\n if(v<3) return\n if(k.length>count){\n paths = k\n count = v \n }\n }) \n return [paths,count]\n\n}\n","/**\n * \n * import { installCycleDetectExtend } from \"@autostore/devtools\"\n * \n * installCycleDetectExtend({....})\n * \n * \n */\nimport { analysisCyclePath } from \"./utils\"\n\n\nexport type CycleDetectExtendOptions = { \n /**\n * 当检测到多少个循环时视为循环依赖 \n */\n cycleCount?:number\n /**\n * \n * 当检测时间操作数量达到此值时,停止检测\n * \n */\n maxOpereates?:number\n /**\n * 指定仅作用于指定的store\n * =[]代表所有store均生效\n */\n stores?:string[]\n /**\n * \n */\n onDetected?:(paths:string[],computedObject:any)=>'ignore'|'throw'|'disable' \n\n}\n\n/**\n * \n * - 在异步计算第一次执行时调用\n * cycleDetector.start()\n * \n * \n * \n */\nexport class AsyncCycleDetector{\n steps:string[] = []\n running:boolean = false \n private _watcher:any\n path:string\n options: Record<string,any>\n constructor(public computedObject:any,options?:Record<string,any>){\n this.path = computedObject.path.join('.')\n this.steps.push(this.path)\n this.options = Object.assign({\n cycleCount : 8,\n maxOpereates: 200,\n stores:[]\n },options)\n } \n /**\n * 本方法应该在异步函数第一次运行时调用\n */\n start(){\n this.running = true\n this.steps.push(this.path)\n this._watcher = this.computedObject.store.watch((event:any)=>{\n if(this.steps.length<500){\n this.steps.push(event.path.join('.'))\n }\n },{operates:'read'}) \n }\n /**\n * \n * 开始检测是否存在循环依赖\n * \n * \n * [\"a\",'d','c','b','a','d','c','b','a']\n * \n * \n * 编写一个函数,检测是否存在循环依赖\n * \n * 逻辑如下:\n * \n * 对this.steps里面是否存在连续的相同的路径,如果存在,则表示存在循环依赖\n * \n * \n * @returns \n */\n private analysisCycleSteps(){\n const [paths,count] = analysisCyclePath(this.steps,this.path)\n const { onDetected,cycleCount } = this.options\n if(count<cycleCount) return\n this.computedObject.store.log(`CycleDepend detected in <${this.computedObject.toString()}>: ${paths}`,'warn')\n if(typeof(onDetected )==='function'){\n const result = onDetected(paths,this.computedObject)\n if(result==='ignore'){\n return\n }else if(result==='disable') {\n this.computedObject.enable = false\n }else{\n throw new Error(`CycleDepend found in <${this.computedObject.toString()}>: ${paths}`)\n }\n } \n } \n detect(){\n if(this.steps.length>this.options.maxOpereates){\n this._watcher.off()\n try{\n this.analysisCycleSteps()\n }finally{ \n this.steps=[]\n }\n }\n }\n}\n\n\nfunction createCycleDetectExtend(options?:CycleDetectExtendOptions){\n return function cycleDetectExtend(store:any){\n const { onObserverCreated } = store.options\n if(typeof(onObserverCreated) ==='function'){ \n // 当store的onObserverCreated选项已经配置时,cycleDetectExtend不能生效\n store.log(`Store<${store.id}> onObserverCreated is already configured, cycleDetectExtend is disabled`,\"warn\")\n }else{\n store.options.onObserverCreated = (observerObject:any)=>{\n // 只对异步计算属性进行循环依赖检测\n if(observerObject.type==='computed' && observerObject.async){\n observerObject._cycleDetector = new AsyncCycleDetector(observerObject,options)\n const oldRun = observerObject.run\n // 封装原始的run方法\n observerObject.run = (async function(options:any){\n // 在第一次运行时启动循环依赖检测\n if(options && options.first===true){\n observerObject._cycleDetector.start()\n }else{\n observerObject._cycleDetector.detect() \n }\n return await oldRun.apply(observerObject,options)\n }).bind(observerObject)\n }\n }\n store.log(\"cycleDetectExtend is already installed\")\n }\n } \n\n}\n\n\nexport function installCycleDetectExtend(options?:CycleDetectExtendOptions){\n // @ts-ignore\n if(!globalThis.__AUTOSTORE_EXTENDS__){\n // @ts-ignore\n globalThis.__AUTOSTORE_EXTENDS__=[]\n }\n // @ts-ignore\n globalThis.__AUTOSTORE_EXTENDS__.push(createCycleDetectExtend(options))\n \n}\n ","/**\n * \n * 基于开发工具\n * \n * Redux DevTools 是一个实用工具,用于开发和调试 Redux 应用程序。\n * AutoStore是基于Redux DevTools 的简单包装,可以让开发者使用Redux DevTools\n * 来查看AutoStore的状态变化 \n * \n * import { createStore } from \"@autostorejs/react\"\n * import { install } from \"@autostorejs/devtools\"\n * \n * \n * const store = createStore({})\n * \n * install()\n * \n */\n\n//@ts-ignore\nimport { legacy_createStore as createStore } from \"redux\"\nimport { WeakObjectMap } from \"./utils\"\n \nconst initialState = {\n \n}\n\n\nexport class AutoStoreDevTools{\n private reduxStore:any\n private _installed:boolean = false\n stores = new WeakObjectMap()\n constructor(){\n this.install()\n }\n add(store:any){ \n this.stores.set(store.id,store)\n store.operates.onAny((payload:any,type:any)=>{ \n if(payload.type==='get') return \n this.reduxStore.dispatch({\n type:`${payload.type}@${type}`,\n store,\n payload \n })\n })\n this.reduxStore.dispatch({\n type:\"__ADD_STORE__\",\n store\n })\n }\n remove(store:any){ \n if( this.stores.has(store.id)){\n this.stores.delete(store.id)\n }\n }\n private reducer(state:object = initialState, action:any){\n if(action.type.startsWith(\"@@\")) return state\n if(action.type==='__ADD_STORE__') {\n return {\n ...state,\n [`AutoStore<${action.store.id}>`]:{...action.store.getSnap()}\n }\n }else{\n return {\n ...state,\n [`AutoStore<${action.store.id}>`]:{...action.store.getSnap()}\n }\n } \n }\n private install(){\n if(this._installed) return \n this.reduxStore = createStore(\n this.reducer,\n // @ts-ignore\n window.__REDUX_DEVTOOLS_EXTENSION__ && window.__REDUX_DEVTOOLS_EXTENSION__()\n ); \n this._installed = true\n console.info('%c AutoStoreDevTools installed. Please open <Redux devtools> to view. %c',\"color:red;\",'')\n }\n}\n\nexport function install(){\n // @ts-ignore\n if(!globalThis.__AUTOSTORE_DEVTOOLS__) globalThis.__AUTOSTORE_DEVTOOLS__ = new AutoStoreDevTools() \n} \n\ndeclare global{\n // @ts-ignore\n var __AUTOSTORE_DEVTOOLS__ : AutoStoreDevTools\n}\n\n\ninstall()\n\n"]}
{"version":3,"sources":["../src/utils.ts","../src/cycleDetectExtend.ts","../src/devTools.ts"],"names":["WeakObjectMap","key","value","weakRef","isPathEq","a","b","item","index","pathStartsWith","basePath","destPath","p","i","analysisCyclePath","steps","curPath","indexs","prev","cur","groups","v","results","group","j","group2","gKey","n","count","paths","k","AsyncCycleDetector","computedObject","options","event","onDetected","cycleCount","result","createCycleDetectExtend","store","onObserverCreated","observerObject","oldRun","installCycleDetectExtend","initialState","AutoStoreDevTools","payload","type","state","action","createStore","install"],"mappings":"uCACO,IAAMA,EAAN,KAAsC,CACjC,IACA,oBAER,CAAA,WAAA,EAAc,CACZ,IAAK,CAAA,GAAA,CAAM,IAAI,GACf,CAAA,IAAA,CAAK,qBAAuB,IAAI,oBAAA,CAAsBC,GAAQ,CAC5D,IAAA,CAAK,IAAI,MAAOA,CAAAA,CAAG,EACrB,CAAC,EACH,CAEA,GAAIA,CAAAA,CAAAA,CAAaC,EAAgB,CAC/B,IAAMC,EAAU,IAAI,OAAA,CAAQD,CAAK,CACjC,CAAA,IAAA,CAAK,IAAI,GAAID,CAAAA,CAAAA,CAAKE,CAAO,CACzB,CAAA,IAAA,CAAK,qBAAqB,QAASD,CAAAA,CAAAA,CAAOD,CAAG,EAC/C,CAEA,IAAIA,CAA4B,CAAA,CAC9B,IAAME,CAAU,CAAA,IAAA,CAAK,IAAI,GAAIF,CAAAA,CAAG,EAChC,OAAOE,CAAAA,CAAUA,EAAQ,KAAM,EAAA,CAAI,MACrC,CAEA,MAAA,CAAOF,EAAsB,CAC3B,OAAO,KAAK,GAAI,CAAA,MAAA,CAAOA,CAAG,CAC5B,CAEA,IAAIA,CAAsB,CAAA,CACxB,IAAME,CAAU,CAAA,IAAA,CAAK,IAAI,GAAIF,CAAAA,CAAG,EAChC,OAAOE,CAAAA,CAAUA,EAAQ,KAAM,EAAA,GAAM,OAAY,KACnD,CACJ,EASO,SAASC,CAAAA,CAASC,EAAuBC,CAA+B,CAAA,CAG7E,OAFG,CAACD,CAAAA,EACD,CAACC,CACDD,EAAAA,CAAAA,CAAE,SAASC,CAAE,CAAA,MAAA,CAAe,MACxBD,CAAE,CAAA,KAAA,CAAM,CAACE,CAAKC,CAAAA,CAAAA,GAAQD,IAAOD,CAAEE,CAAAA,CAAK,CAAC,CAC9C,CAMO,SAASC,CAAeC,CAAAA,CAAAA,CAAkBC,EAAkB,CACjE,OAAGD,EAAS,MAAOC,CAAAA,CAAAA,CAAS,OAAe,KACpCD,CAAAA,CAAAA,CAAS,MAAM,CAACE,CAAAA,CAAEC,IACdD,CAAID,GAAAA,CAAAA,CAASE,CAAC,CACxB,CACH,CAEO,SAASC,CAAAA,CAAkBC,EAAeC,CAA4C,CAAA,CAE3F,IAAMC,CAASF,CAAAA,CAAAA,CAAM,OAAO,CAACG,CAAAA,CAAKC,EAAIX,CAC/BW,IAAAA,CAAAA,GAAMH,GAASE,CAAK,CAAA,IAAA,CAAKV,CAAK,CAC1BU,CAAAA,CAAAA,CAAAA,CACT,EAAc,CAAA,CAEVE,EAASH,CAAO,CAAA,GAAA,CAAI,CAACI,CAAER,CAAAA,CAAAA,GACtBA,EAAEI,CAAO,CAAA,MAAA,CAAO,EACRF,CAAM,CAAA,KAAA,CAAMM,EAAEJ,CAAOJ,CAAAA,CAAAA,CAAE,CAAC,CAAC,CAAA,CAEzBE,EAAM,KAAMM,CAAAA,CAAC,CAE3B,CAGKC,CAAAA,CAAAA,CAAU,IAAI,GAAA,CACpB,QAAQT,CAAE,CAAA,CAAA,CAAEA,EAAEO,CAAO,CAAA,MAAA,CAAOP,IAAI,CAC5B,IAAMU,EAAQH,CAAOP,CAAAA,CAAC,EACtB,GAAG,EAAAU,EAAM,MAAO,CAAA,CAAA,CAAA,CAChB,QAAQC,CAAEX,CAAAA,CAAAA,CAAE,EAAEW,CAAEJ,CAAAA,CAAAA,CAAO,OAAOI,CAAI,EAAA,CAAA,CAC9B,IAAMC,CAASL,CAAAA,CAAAA,CAAOI,CAAC,CACvB,CAAA,GAAGpB,EAASmB,CAAME,CAAAA,CAAM,GAAKhB,CAAec,CAAAA,CAAAA,CAAME,CAAM,CAAE,CAAA,CACtD,IAAMC,CAAOH,CAAAA,CAAAA,CAAM,KAAK,IAAI,CAAA,CACxBD,EAAQ,GAAII,CAAAA,CAAI,GAChBJ,CAAQ,CAAA,GAAA,CAAII,EAAK,CAAC,CAAA,CAEtB,IAAMC,CAAIL,CAAAA,CAAAA,CAAQ,IAAII,CAAI,CAAA,CAC1BJ,EAAQ,GAAII,CAAAA,CAAAA,CAAKC,EAAE,CAAC,EACxB,CACJ,CACJ,CAEA,IAAIC,CAAQ,CAAA,CAAA,CACRC,EACJ,OAAAP,CAAAA,CAAQ,QAAQ,CAACD,CAAAA,CAAES,IAAI,CAChBT,CAAAA,CAAE,GACFS,CAAE,CAAA,MAAA,CAAOF,IACVC,CAAQC,CAAAA,CAAAA,CACRF,EAAQP,CAEd,EAAA,CAAC,EACM,CAACQ,CAAAA,CAAMD,CAAK,CAErB,KC5DaG,CAAN,CAAA,KAAwB,CAM3B,WAAmBC,CAAAA,CAAAA,CAAmBC,EAA4B,CAA/C,IAAA,CAAA,cAAA,CAAAD,EACf,IAAK,CAAA,IAAA,CAAOA,EAAe,IAAK,CAAA,IAAA,CAAK,GAAG,CACxC,CAAA,IAAA,CAAK,MAAM,IAAK,CAAA,IAAA,CAAK,IAAI,CACzB,CAAA,IAAA,CAAK,QAAU,MAAO,CAAA,MAAA,CAAO,CACzB,UAAc,CAAA,CAAA,CACd,aAAc,GACd,CAAA,MAAA,CAAO,EACX,CAAA,CAAEC,CAAO,EACb,CAbA,MAAiB,EAAC,CAClB,QAAkB,KACV,CAAA,QAAA,CACR,KACA,OAaA,CAAA,KAAA,EAAO,CACH,IAAK,CAAA,OAAA,CAAU,KACf,IAAK,CAAA,KAAA,CAAM,KAAK,IAAK,CAAA,IAAI,EACzB,IAAK,CAAA,QAAA,CAAW,KAAK,cAAe,CAAA,KAAA,CAAM,MAAOC,CAAY,EAAA,CACtD,KAAK,KAAM,CAAA,MAAA,CAAO,KACjB,IAAK,CAAA,KAAA,CAAM,KAAKA,CAAM,CAAA,IAAA,CAAK,KAAK,GAAG,CAAC,EAE5C,CAAE,CAAA,CAAC,SAAS,MAAM,CAAC,EACvB,CAkBQ,kBAAA,EAAoB,CACxB,GAAM,CAACL,CAAMD,CAAAA,CAAK,EAAId,CAAkB,CAAA,IAAA,CAAK,MAAM,IAAK,CAAA,IAAI,EACtD,CAAE,UAAA,CAAAqB,EAAW,UAAAC,CAAAA,CAAW,EAAI,IAAK,CAAA,OAAA,CACvC,GAAG,EAAAR,CAAAA,CAAMQ,KACT,IAAK,CAAA,cAAA,CAAe,MAAM,GAAI,CAAA,CAAA,yBAAA,EAA4B,KAAK,cAAe,CAAA,QAAA,EAAU,CAAMP,GAAAA,EAAAA,CAAK,GAAG,MAAM,CAAA,CACzG,OAAOM,CAAe,EAAA,UAAA,CAAA,CAAW,CAChC,IAAME,CAAAA,CAASF,EAAWN,CAAM,CAAA,IAAA,CAAK,cAAc,CACnD,CAAA,GAAGQ,IAAS,QACR,CAAA,OACE,GAAGA,CAAS,GAAA,SAAA,CACd,KAAK,cAAe,CAAA,MAAA,CAAS,WAEvB,MAAA,IAAI,MAAM,CAAyB,sBAAA,EAAA,IAAA,CAAK,eAAe,QAAS,EAAC,MAAMR,CAAK,CAAA,CAAE,CAE5F,CACJ,CACA,QAAQ,CACJ,GAAG,KAAK,KAAM,CAAA,MAAA,CAAO,KAAK,OAAQ,CAAA,YAAA,CAAa,CAC3C,IAAK,CAAA,QAAA,CAAS,KACd,CAAA,GAAG,CACC,IAAK,CAAA,kBAAA,GACT,CAAC,OAAA,CACG,KAAK,KAAM,CAAA,GACf,CACJ,CACJ,CACJ,EAGA,SAASS,EAAwBL,CAAkC,CAAA,CAC/D,OAAO,SAA2BM,CAAAA,CAAU,CACxC,GAAM,CAAE,kBAAAC,CAAkB,CAAA,CAAID,EAAM,OACjC,CAAA,OAAOC,GAAsB,UAE5BD,CAAAA,CAAAA,CAAM,IAAI,CAASA,MAAAA,EAAAA,CAAAA,CAAM,EAAE,CAA2E,wEAAA,CAAA,CAAA,MAAM,GAE5GA,CAAM,CAAA,OAAA,CAAQ,kBAAqBE,CAAqB,EAAA,CAEpD,GAAGA,CAAe,CAAA,IAAA,GAAO,YAAcA,CAAe,CAAA,KAAA,CAAM,CACxDA,CAAe,CAAA,cAAA,CAAiB,IAAIV,CAAmBU,CAAAA,CAAAA,CAAeR,CAAO,CAC7E,CAAA,IAAMS,EAASD,CAAe,CAAA,GAAA,CAE9BA,EAAe,GAAO,CAAA,eAAeR,EAAY,CAE7C,OAAGA,GAAWA,CAAQ,CAAA,KAAA,GAAQ,KAC1BQ,CAAe,CAAA,cAAA,CAAe,OAE9BA,CAAAA,CAAAA,CAAe,eAAe,MAAO,EAAA,CAElC,MAAMC,CAAO,CAAA,KAAA,CAAMD,EAAeR,CAAO,CACpD,EAAG,IAAKQ,CAAAA,CAAc,EAC1B,CACJ,CAAA,CACAF,EAAM,GAAI,CAAA,wCAAwC,GAE1D,CAEJ,CAGO,SAASI,CAAyBV,CAAAA,CAAAA,CAAkC,CAEnE,UAAW,CAAA,qBAAA,GAEX,UAAW,CAAA,qBAAA,CAAsB,EAGrC,CAAA,CAAA,UAAA,CAAW,sBAAsB,IAAKK,CAAAA,CAAAA,CAAwBL,CAAO,CAAC,EAE1E,CCrIA,IAAMW,EAAe,EAErB,CAGaC,EAAN,KAAuB,CAClB,WACA,UAAqB,CAAA,KAAA,CAC7B,OAAS,IAAI7C,CAAAA,CACb,aAAa,CACT,IAAA,CAAK,UACT,CACA,IAAIuC,CAAU,CAAA,CACV,KAAK,MAAO,CAAA,GAAA,CAAIA,EAAM,EAAGA,CAAAA,CAAK,EAC9BA,CAAM,CAAA,QAAA,CAAS,MAAM,CAACO,CAAAA,CAAYC,IAAW,CACtCD,CAAAA,CAAQ,OAAO,KAClB,EAAA,IAAA,CAAK,WAAW,QAAS,CAAA,CACrB,KAAK,CAAGA,EAAAA,CAAAA,CAAQ,IAAI,CAAIC,CAAAA,EAAAA,CAAI,GAC5B,KAAAR,CAAAA,CAAAA,CACA,QAAAO,CACJ,CAAC,EACL,CAAC,CAAA,CACD,KAAK,UAAW,CAAA,QAAA,CAAS,CACrB,IAAK,CAAA,eAAA,CACL,MAAAP,CACJ,CAAC,EACL,CACA,MAAA,CAAOA,EAAU,CACT,IAAA,CAAK,OAAO,GAAIA,CAAAA,CAAAA,CAAM,EAAE,CACxB,EAAA,IAAA,CAAK,OAAO,MAAOA,CAAAA,CAAAA,CAAM,EAAE,EAEnC,CACQ,QAAQS,CAAeJ,CAAAA,CAAAA,CAAcK,EAAW,CACpD,OAAGA,EAAO,IAAK,CAAA,UAAA,CAAW,IAAI,CAAUD,CAAAA,CAAAA,CACrCC,EAAO,IAAO,GAAA,eAAA,CACN,CACH,GAAGD,CAAAA,CACH,CAAC,CAAaC,UAAAA,EAAAA,CAAAA,CAAO,MAAM,EAAE,CAAA,CAAA,CAAG,EAAE,CAAC,GAAGA,EAAO,KAAM,CAAA,OAAA,EAAS,CAChE,CAAA,CAEO,CACH,GAAGD,CAAAA,CACH,CAAC,CAAaC,UAAAA,EAAAA,CAAAA,CAAO,MAAM,EAAE,CAAA,CAAA,CAAG,EAAE,CAAC,GAAGA,EAAO,KAAM,CAAA,OAAA,EAAS,CAChE,CAER,CACQ,OAAS,EAAA,CACV,KAAK,UACR,GAAA,IAAA,CAAK,WAAaC,kBACd,CAAA,IAAA,CAAK,QAEL,MAAO,CAAA,4BAAA,EAAgC,OAAO,4BAA6B,EAC/E,EACA,IAAK,CAAA,UAAA,CAAa,KAClB,OAAQ,CAAA,IAAA,CAAK,2EAA2E,YAAa,CAAA,EAAE,GAC3G,CACJ,EAEO,SAASC,CAAS,EAAA,CAEjB,WAAW,sBAAwB,GAAA,UAAA,CAAW,uBAAyB,IAAIN,CAAAA,EACnF,CAQAM,CAAQ,EAAA","file":"index.mjs","sourcesContent":["\nexport class WeakObjectMap<T extends object> {\n private map: Map<string, WeakRef<T>>;\n private finalizationRegistry: FinalizationRegistry<string>;\n \n constructor() {\n this.map = new Map();\n this.finalizationRegistry = new FinalizationRegistry((key) => {\n this.map.delete(key);\n });\n }\n \n set(key: string, value: T): void {\n const weakRef = new WeakRef(value);\n this.map.set(key, weakRef);\n this.finalizationRegistry.register(value, key);\n }\n \n get(key: string): T | undefined {\n const weakRef = this.map.get(key);\n return weakRef ? weakRef.deref() : undefined;\n }\n \n delete(key: string): boolean {\n return this.map.delete(key);\n }\n \n has(key: string): boolean {\n const weakRef = this.map.get(key);\n return weakRef ? weakRef.deref() !== undefined : false;\n }\n}\n/**\n * 判定两个值是否相等\n * \n * 如果两个值都是对象,则判断两个对象是否相等\n * 如果两个值都是数组,则判断两个数组的值是否相等\n * \n */\n\nexport function isPathEq(a:string[] | undefined,b:string[] | undefined):boolean{\n if(!a) return false\n if(!b) return false\n if(a.length!==b.length) return false\n return a.every((item,index)=>item===b[index])\n}\n/**\n * 判断一个路径destPath是否包含另一个路径basePath判断\n * @param basePath \n * @param destPath \n */\nexport function pathStartsWith(basePath:string[],destPath:string[]){\n if(basePath.length>destPath.length) return false\n return basePath.every((p,i)=>{\n return p===destPath[i]\n })\n}\n\nexport function analysisCyclePath(steps:string[],curPath:string):[string | undefined,number] {\n // 使用curPath将steps分割为多个数组\n const indexs = steps.reduce((prev,cur,index)=>{\n if(cur===curPath) prev.push(index) \n return prev\n },[] as number[])\n\n const groups = indexs.map((v,i)=>{\n if(i<indexs.length-1){\n return steps.slice(v,indexs[i+1])\n }else{\n return steps.slice(v)\n } \n })\n\n // 找到groups相同的分组\n const results = new Map<string,number>()\n for(let i=0;i<groups.length;i++){\n const group = groups[i]\n if(group.length<2) continue\n for(let j=i+1;j<groups.length;j++){\n const group2 = groups[j]\n if(isPathEq(group,group2) || pathStartsWith(group,group2)){\n const gKey = group.join('->')\n if(!results.has(gKey)){\n results.set(gKey,1)\n }\n const n = results.get(gKey)! \n results.set(gKey,n+1)\n }\n }\n }\n // 找到results里面路径最长的\n let count = 0\n let paths = undefined\n results.forEach((v,k)=>{\n if(v<3) return\n if(k.length>count){\n paths = k\n count = v \n }\n }) \n return [paths,count]\n\n}\n","/**\n * \n * import { installCycleDetectExtend } from \"@autostore/devtools\"\n * \n * installCycleDetectExtend({....})\n * \n * \n */\nimport { analysisCyclePath } from \"./utils\"\n\n\nexport type CycleDetectExtendOptions = { \n /**\n * 当检测到多少个循环时视为循环依赖 \n */\n cycleCount?:number\n /**\n * \n * 当检测时间操作数量达到此值时,停止检测\n * \n */\n maxOpereates?:number\n /**\n * 指定仅作用于指定的store\n * =[]代表所有store均生效\n */\n stores?:string[]\n /**\n * \n */\n onDetected?:(paths:string[],computedObject:any)=>'ignore'|'throw'|'disable' \n\n}\n\n/**\n * \n * - 在异步计算第一次执行时调用\n * cycleDetector.start()\n * \n * \n * \n */\nexport class AsyncCycleDetector{\n steps:string[] = []\n running:boolean = false \n private _watcher:any\n path:string\n options: Record<string,any>\n constructor(public computedObject:any,options?:Record<string,any>){\n this.path = computedObject.path.join('.')\n this.steps.push(this.path)\n this.options = Object.assign({\n cycleCount : 8,\n maxOpereates: 200,\n stores:[]\n },options)\n } \n /**\n * 本方法应该在异步函数第一次运行时调用\n */\n start(){\n this.running = true\n this.steps.push(this.path)\n this._watcher = this.computedObject.store.watch((event:any)=>{\n if(this.steps.length<500){\n this.steps.push(event.path.join('.'))\n }\n },{operates:'read'}) \n }\n /**\n * \n * 开始检测是否存在循环依赖\n * \n * \n * [\"a\",'d','c','b','a','d','c','b','a']\n * \n * \n * 编写一个函数,检测是否存在循环依赖\n * \n * 逻辑如下:\n * \n * 对this.steps里面是否存在连续的相同的路径,如果存在,则表示存在循环依赖\n * \n * \n * @returns \n */\n private analysisCycleSteps(){\n const [paths,count] = analysisCyclePath(this.steps,this.path)\n const { onDetected,cycleCount } = this.options\n if(count<cycleCount) return\n this.computedObject.store.log(`CycleDepend detected in <${this.computedObject.toString()}>: ${paths}`,'warn')\n if(typeof(onDetected )==='function'){\n const result = onDetected(paths,this.computedObject)\n if(result==='ignore'){\n return\n }else if(result==='disable') {\n this.computedObject.enable = false\n }else{\n throw new Error(`CycleDepend found in <${this.computedObject.toString()}>: ${paths}`)\n }\n } \n } \n detect(){\n if(this.steps.length>this.options.maxOpereates){\n this._watcher.off()\n try{\n this.analysisCycleSteps()\n }finally{ \n this.steps=[]\n }\n }\n }\n}\n\n\nfunction createCycleDetectExtend(options?:CycleDetectExtendOptions){\n return function cycleDetectExtend(store:any){\n const { onObserverCreated } = store.options\n if(typeof(onObserverCreated) ==='function'){ \n // 当store的onObserverCreated选项已经配置时,cycleDetectExtend不能生效\n store.log(`Store<${store.id}> onObserverCreated is already configured, cycleDetectExtend is disabled`,\"warn\")\n }else{\n store.options.onObserverCreated = (observerObject:any)=>{\n // 只对异步计算属性进行循环依赖检测\n if(observerObject.type==='computed' && observerObject.async){\n observerObject._cycleDetector = new AsyncCycleDetector(observerObject,options)\n const oldRun = observerObject.run\n // 封装原始的run方法\n observerObject.run = (async function(options:any){\n // 在第一次运行时启动循环依赖检测\n if(options && options.first===true){\n observerObject._cycleDetector.start()\n }else{\n observerObject._cycleDetector.detect() \n }\n return await oldRun.apply(observerObject,options)\n }).bind(observerObject)\n }\n }\n store.log(\"cycleDetectExtend is already installed\")\n }\n } \n\n}\n\n\nexport function installCycleDetectExtend(options?:CycleDetectExtendOptions){\n // @ts-ignore\n if(!globalThis.__AUTOSTORE_EXTENDS__){\n // @ts-ignore\n globalThis.__AUTOSTORE_EXTENDS__=[]\n }\n // @ts-ignore\n globalThis.__AUTOSTORE_EXTENDS__.push(createCycleDetectExtend(options))\n \n}\n ","/**\n * \n * 基于开发工具\n * \n * Redux DevTools 是一个实用工具,用于开发和调试 Redux 应用程序。\n * AutoStore是基于Redux DevTools 的简单包装,可以让开发者使用Redux DevTools\n * 来查看AutoStore的状态变化 \n * \n * import { createStore } from \"@autostorejs/react\"\n * import { install } from \"@autostorejs/devtools\"\n * \n * \n * const store = createStore({})\n * \n * install()\n * \n */\n\n//@ts-ignore\nimport { legacy_createStore as createStore } from \"redux\"\nimport { WeakObjectMap } from \"./utils\"\n \nconst initialState = {\n \n}\n\n\nexport class AutoStoreDevTools{\n private reduxStore:any\n private _installed:boolean = false\n stores = new WeakObjectMap()\n constructor(){\n this.install()\n }\n add(store:any){ \n this.stores.set(store.id,store)\n store.operates.onAny((payload:any,type:any)=>{ \n if(payload.type==='get') return \n this.reduxStore.dispatch({\n type:`${payload.type}@${type}`,\n store,\n payload \n })\n })\n this.reduxStore.dispatch({\n type:\"__ADD_STORE__\",\n store\n })\n }\n remove(store:any){ \n if( this.stores.has(store.id)){\n this.stores.delete(store.id)\n }\n }\n private reducer(state:object = initialState, action:any){\n if(action.type.startsWith(\"@@\")) return state\n if(action.type==='__ADD_STORE__') {\n return {\n ...state,\n [`AutoStore<${action.store.id}>`]:{...action.store.getSnap()}\n }\n }else{\n return {\n ...state,\n [`AutoStore<${action.store.id}>`]:{...action.store.getSnap()}\n }\n } \n }\n private install(){\n if(this._installed) return \n this.reduxStore = createStore(\n this.reducer,\n // @ts-ignore\n window.__REDUX_DEVTOOLS_EXTENSION__ && window.__REDUX_DEVTOOLS_EXTENSION__()\n ); \n this._installed = true\n console.info('%c AutoStoreDevTools installed. Please open <Redux devtools> to view. %c',\"color:red;\",'')\n }\n}\n\nexport function install(){\n // @ts-ignore\n if(!globalThis.__AUTOSTORE_DEVTOOLS__) globalThis.__AUTOSTORE_DEVTOOLS__ = new AutoStoreDevTools() \n} \n\ndeclare global{\n // @ts-ignore\n var __AUTOSTORE_DEVTOOLS__ : AutoStoreDevTools\n}\n\n\ninstall()\n\n"]}
{
"name": "@autostorejs/devtools",
"version": "1.2.2",
"version": "2.0.0",
"description": "devtools for autostore",

@@ -28,3 +28,3 @@ "repository": {

"@types/node": "^22.7.4",
"tsup": "^8.3.0"
"tsup": "^8.5.0"
},

@@ -31,0 +31,0 @@ "scripts": {