@autostorejs/plugins 4.3.0 → 4.3.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/shadow.ts","../src/utils/installPlugin.ts"],"names":["installPlugin","plugin","globalThis","__AUTOSTORE_PLUGINS__","push","shadow","store","state","options","shadowStore","AutoStore","Object","assign","id","getRootScope","__name","getShadowStore","debug","onObserverBeforeCreate","descriptor","scope","isRelPath","watcher","watch","operate","operates","emit","path","join","PATH_DELIMITER","once","off"],"mappings":"gDA8BA,IAAA,CAAA,CAAA,MAAA,CAAA,cAAA,CAAA,IAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,GAAA,CAAA,CAAA,CAAA,CAAA,MAAA,CAAA,CAAA,KAAA,CAAA,CAAA,CAAA,YAAA,CAAA,IAAA,CAAA,CAAA,CC5BO,SAASA,CAAAA,CAAcC,CAAAA,CAAwB,CAE7CC,UAAAA,CAAWC,qBAAAA,GAEZD,UAAAA,CAAWC,qBAAAA,CAAwB,EAAA,CAAA,CAEvCD,UAAAA,CAAWC,qBAAAA,CAAsBC,IAAAA,CAAKH,CAAAA,EAC1C,CAPgBD,CAAAA,CAAAA,CAAAA,CAAAA,eAAAA,CAAAA,CDwCT,SAASK,CAAAA,CAAOC,EAAmB,CACtCA,CAAAA,CAAMD,MAAAA,CAAS,SAA0BE,CAAAA,CAAUC,CAAAA,CAA6B,CAC5E,IAAMC,CAAAA,CAAc,IAAIC,mBAAAA,CACpBH,CAAAA,CACAI,MAAAA,CAAOC,MAAAA,CAAO,EAAC,CAAGJ,CAAAA,CAAS,CACvBK,EAAAA,CAAI,CAAA,EAAGP,CAAAA,CAAMO,EAAE,CAAA,OAAA,CAAA,CACfC,YAAAA,CAAcC,CAAAA,CAAA,IAAMT,CAAAA,CAAMC,KAAAA,CAAZ,cAAA,CAAA,CACdS,cAAAA,CAAgBD,CAAAA,CAAA,IAAMT,EAAN,gBAAA,CAAA,CAChBW,KAAAA,CAAOX,CAAAA,CAAME,OAAAA,CAAQS,KAAAA,CACrBZ,MAAAA,CAAQ,IAAA,CACRa,sBAAAA,CAAwBH,CAAAA,CAACI,CAAAA,EAAAA,CAGrB,IAAMC,CAAAA,CAAQD,CAAAA,CAAWX,OAAAA,CAAQY,KAAAA,CAAAA,CAC7B,CAACA,CAAAA,EAASC,mBAAAA,CAAUD,CAAAA,CAAAA,IACpBD,CAAAA,CAAWX,OAAAA,CAAQY,KAAAA,CAAQ,MAAA,EAEnC,CAAA,CAPwB,wBAAA,CAQ5B,CAAA,CAAA,CAAA,CAIEE,CAAAA,CAAUhB,CAAAA,CAAMiB,MAAOC,CAAAA,EAAAA,CACzBA,CAAAA,CAAQnB,MAAAA,CAAS,IAAA,CACjBI,CAAAA,CAAYgB,QAAAA,CAASC,IAAAA,CAAKF,CAAAA,CAAQG,IAAAA,CAAKC,IAAAA,CAAKC,wBAAAA,CAAAA,CAAiBL,CAAAA,EACjE,CAAA,CAAA,CACAf,OAAAA,CAAAA,CAAYqB,IAAAA,CAAK,QAAA,CAAU,IAAMR,CAAAA,CAAQS,GAAAA,EAAG,CAAA,CACrCtB,CACX,EACJ,CA7BgBJ,CAAAA,CAAAA,CAAAA,CAAAA,QAAAA,CAAAA,CA8ChBL,EAAcK,CAAAA,CAAAA","file":"shadow.cjs","sourcesContent":["/**\r\n * shadow 插件\r\n *\r\n * 为 AutoStore 注入影子 store(shadowStore)能力:\r\n * - 调用 shadow(store) 后,store 获得 store.shadow(state) 方法\r\n * - shadowStore 基于原 store 派生,自身不持有业务状态,其计算属性/watch 的作用域指向原 store 的 state\r\n * - 原 store 的写操作会转发到 shadowStore,触发其计算属性重新计算\r\n * - 适用于在不污染原 store 的前提下,派生额外的计算视图(如多维聚合、派生展示字段)\r\n *\r\n * shadowStore 的 id 为 `${原store.id}_shadow`,且 options.shadow = true。\r\n * 由于 shadowStore 中的 observer 是动态创建的,其 scope 会被强制设为 ROOT\r\n * (不能是 CURRENT 或相对路径)。\r\n *\r\n * @example\r\n *\r\n * import { AutoStore, computed } from \"autostore\";\r\n * import { shadow } from \"@autostorejs/plugins\";\r\n *\r\n * const store = new AutoStore({ price: 10, count: 3 });\r\n * shadow(store); // 安装插件,挂载 store.shadow 方法\r\n *\r\n * const shadowStore = store.shadow({\r\n * total: computed((scope) => scope.price * scope.count),\r\n * });\r\n *\r\n * shadowStore.state.total; // 30\r\n * store.state.count = 4;\r\n * shadowStore.state.total; // 40\r\n */\r\n\r\nimport { AutoStore, isRelPath, PATH_DELIMITER } from \"autostore\";\r\nimport type { AutoStoreOptions, ObserverDescriptor, AnyAutoStore, Dict } from \"autostore\";\r\nimport { installPlugin } from \"./utils/installPlugin\";\r\n\r\n/**\r\n * shadow 插件入口\r\n *\r\n * 给目标 store 挂载 shadow 方法,调用后即可通过 store.shadow(state) 创建影子 store。\r\n *\r\n * @param store 目标 AutoStore 实例\r\n * @returns 无返回值,副作用是给 store 挂载 shadow 方法\r\n */\r\nexport function shadow(store: AnyAutoStore) {\r\n store.shadow = function <T extends Dict>(state: T, options?: AutoStoreOptions<T>) {\r\n const shadowStore = new AutoStore(\r\n state,\r\n Object.assign({}, options, {\r\n id: `${store.id}_shadow`,\r\n getRootScope: () => store.state,\r\n getShadowStore: () => store,\r\n debug: store.options.debug,\r\n shadow: true,\r\n onObserverBeforeCreate: (descriptor: ObserverDescriptor<any, any, any>) => {\r\n //除非显式指定scope,并且scope不能是CURRENT\r\n // 因为动态创建的observer不能是CURRENT,也不能是相对路径\r\n const scope = descriptor.options.scope;\r\n if (!scope || isRelPath(scope)) {\r\n descriptor.options.scope = \"ROOT\";\r\n }\r\n },\r\n }),\r\n ) as AutoStore<T>;\r\n\r\n // 将操作转到到shadowStore\r\n const watcher = store.watch((operate) => {\r\n operate.shadow = true;\r\n shadowStore.operates.emit(operate.path.join(PATH_DELIMITER), operate);\r\n });\r\n shadowStore.once(\"unload\", () => watcher.off());\r\n return shadowStore;\r\n };\r\n}\r\ndeclare module \"autostore\" {\r\n export interface AutoStore<State extends Dict, Options = unknown> {\r\n /**\r\n * 基于当前 store 创建一个影子 store(shadowStore)\r\n *\r\n * shadowStore 不持有独立业务状态,其计算属性的作用域指向原 store 的 state;\r\n * 原 store 的写操作会转发到 shadowStore 并触发其计算属性重算。\r\n *\r\n * @param state 影子 store 的状态定义(通常只包含 computed 计算属性)\r\n * @param options 额外的 AutoStore 配置,会与内部 shadow 配置合并\r\n * @returns 新建的 shadowStore 实例\r\n */\r\n shadow<T extends Dict>(state: T, options?: AutoStoreOptions<T>): AutoStore<T>;\r\n }\r\n}\r\n\r\ninstallPlugin(shadow);\r\n","import type { IAutoStorePlugin } from \"autostore\";\r\n\r\nexport function installPlugin(plugin: IAutoStorePlugin) {\r\n // @ts-ignore\r\n if (!globalThis.__AUTOSTORE_PLUGINS__) {\r\n // @ts-ignore\r\n globalThis.__AUTOSTORE_PLUGINS__ = [];\r\n }\r\n globalThis.__AUTOSTORE_PLUGINS__.push(plugin);\r\n}\r\n\r\ndeclare global {\r\n // @ts-ignore\r\n var __AUTOSTORE_PLUGINS__: IAutoStorePlugin[];\r\n}\r\n"]}
1
+ {"version":3,"sources":["../src/shadow.ts","../src/utils/installPlugin.ts"],"names":["installPlugin","plugin","globalThis","__AUTOSTORE_PLUGINS__","push","shadow","store","state","options","shadowStore","AutoStore","Object","assign","id","getRootScope","__name","getShadowStore","debug","onObserverBeforeCreate","descriptor","scope","isRelPath","watcher","watch","operate","operates","emit","path","join","PATH_DELIMITER","once","off"],"mappings":"gDA8BA,IAAA,CAAA,CAAA,MAAA,CAAA,cAAA,CAAA,IAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,GAAA,CAAA,CAAA,CAAA,CAAA,MAAA,CAAA,CAAA,KAAA,CAAA,CAAA,CAAA,YAAA,CAAA,IAAA,CAAA,CAAA,CC5BO,SAASA,CAAAA,CAAcC,CAAAA,CAAwB,CAE7CC,UAAAA,CAAWC,qBAAAA,GAEZD,UAAAA,CAAWC,qBAAAA,CAAwB,EAAA,CAAA,CAEvCD,UAAAA,CAAWC,qBAAAA,CAAsBC,IAAAA,CAAKH,CAAAA,EAC1C,CAPgBD,CAAAA,CAAAA,CAAAA,CAAAA,eAAAA,CAAAA,CDwCT,SAASK,CAAAA,CAAOC,EAAmB,CACtCA,CAAAA,CAAMD,MAAAA,CAAS,SAA0BE,CAAAA,CAAUC,CAAAA,CAA6B,CAC5E,IAAMC,CAAAA,CAAc,IAAIC,mBAAAA,CACpBH,CAAAA,CACAI,MAAAA,CAAOC,MAAAA,CAAO,EAAC,CAAGJ,CAAAA,CAAS,CACvBK,EAAAA,CAAI,CAAA,EAAGP,CAAAA,CAAMO,EAAE,CAAA,OAAA,CAAA,CACfC,YAAAA,CAAcC,CAAAA,CAAA,IAAMT,CAAAA,CAAMC,KAAAA,CAAZ,cAAA,CAAA,CACdS,cAAAA,CAAgBD,CAAAA,CAAA,IAAMT,EAAN,gBAAA,CAAA,CAChBW,KAAAA,CAAOX,CAAAA,CAAME,OAAAA,CAAQS,KAAAA,CACrBZ,MAAAA,CAAQ,IAAA,CACRa,sBAAAA,CAAwBH,CAAAA,CAACI,CAAAA,EAAAA,CAGrB,IAAMC,CAAAA,CAAQD,CAAAA,CAAWX,OAAAA,CAAQY,KAAAA,CAAAA,CAC7B,CAACA,CAAAA,EAASC,mBAAAA,CAAUD,CAAAA,CAAAA,IACpBD,CAAAA,CAAWX,OAAAA,CAAQY,KAAAA,CAAQ,MAAA,EAEnC,CAAA,CAPwB,wBAAA,CAQ5B,CAAA,CAAA,CAAA,CAIEE,CAAAA,CAAUhB,CAAAA,CAAMiB,MAAOC,CAAAA,EAAAA,CACzBA,CAAAA,CAAQnB,MAAAA,CAAS,IAAA,CACjBI,CAAAA,CAAYgB,QAAAA,CAASC,IAAAA,CAAKF,CAAAA,CAAQG,IAAAA,CAAKC,IAAAA,CAAKC,wBAAAA,CAAAA,CAAiBL,CAAAA,EACjE,CAAA,CAAA,CACAf,OAAAA,CAAAA,CAAYqB,IAAAA,CAAK,QAAA,CAAU,IAAMR,CAAAA,CAAQS,GAAAA,EAAG,CAAA,CACrCtB,CACX,EACJ,CA7BgBJ,CAAAA,CAAAA,CAAAA,CAAAA,QAAAA,CAAAA,CA8ChBL,EAAcK,CAAAA,CAAAA","file":"shadow.cjs","sourcesContent":["/**\n * shadow 插件\n *\n * 为 AutoStore 注入影子 store(shadowStore)能力:\n * - 调用 shadow(store) 后,store 获得 store.shadow(state) 方法\n * - shadowStore 基于原 store 派生,自身不持有业务状态,其计算属性/watch 的作用域指向原 store 的 state\n * - 原 store 的写操作会转发到 shadowStore,触发其计算属性重新计算\n * - 适用于在不污染原 store 的前提下,派生额外的计算视图(如多维聚合、派生展示字段)\n *\n * shadowStore 的 id 为 `${原store.id}_shadow`,且 options.shadow = true。\n * 由于 shadowStore 中的 observer 是动态创建的,其 scope 会被强制设为 ROOT\n * (不能是 CURRENT 或相对路径)。\n *\n * @example\n *\n * import { AutoStore, computed } from \"autostore\";\n * import { shadow } from \"@autostorejs/plugins\";\n *\n * const store = new AutoStore({ price: 10, count: 3 });\n * shadow(store); // 安装插件,挂载 store.shadow 方法\n *\n * const shadowStore = store.shadow({\n * total: computed((scope) => scope.price * scope.count),\n * });\n *\n * shadowStore.state.total; // 30\n * store.state.count = 4;\n * shadowStore.state.total; // 40\n */\n\nimport { AutoStore, isRelPath, PATH_DELIMITER } from \"autostore\";\nimport type { AutoStoreOptions, ObserverDescriptor, AnyAutoStore, Dict } from \"autostore\";\nimport { installPlugin } from \"./utils/installPlugin\";\n\n/**\n * shadow 插件入口\n *\n * 给目标 store 挂载 shadow 方法,调用后即可通过 store.shadow(state) 创建影子 store。\n *\n * @param store 目标 AutoStore 实例\n * @returns 无返回值,副作用是给 store 挂载 shadow 方法\n */\nexport function shadow(store: AnyAutoStore) {\n store.shadow = function <T extends Dict>(state: T, options?: AutoStoreOptions<T>) {\n const shadowStore = new AutoStore(\n state,\n Object.assign({}, options, {\n id: `${store.id}_shadow`,\n getRootScope: () => store.state,\n getShadowStore: () => store,\n debug: store.options.debug,\n shadow: true,\n onObserverBeforeCreate: (descriptor: ObserverDescriptor<any, any, any>) => {\n //除非显式指定scope,并且scope不能是CURRENT\n // 因为动态创建的observer不能是CURRENT,也不能是相对路径\n const scope = descriptor.options.scope;\n if (!scope || isRelPath(scope)) {\n descriptor.options.scope = \"ROOT\";\n }\n },\n }),\n ) as AutoStore<T>;\n\n // 将操作转到到shadowStore\n const watcher = store.watch((operate) => {\n operate.shadow = true;\n shadowStore.operates.emit(operate.path.join(PATH_DELIMITER), operate);\n });\n shadowStore.once(\"unload\", () => watcher.off());\n return shadowStore;\n };\n}\ndeclare module \"autostore\" {\n export interface AutoStore<State extends Dict, Options = unknown> {\n /**\n * 基于当前 store 创建一个影子 store(shadowStore)\n *\n * shadowStore 不持有独立业务状态,其计算属性的作用域指向原 store 的 state;\n * 原 store 的写操作会转发到 shadowStore 并触发其计算属性重算。\n *\n * @param state 影子 store 的状态定义(通常只包含 computed 计算属性)\n * @param options 额外的 AutoStore 配置,会与内部 shadow 配置合并\n * @returns 新建的 shadowStore 实例\n */\n shadow<T extends Dict>(state: T, options?: AutoStoreOptions<T>): AutoStore<T>;\n }\n}\n\ninstallPlugin(shadow);\n","import type { IAutoStorePlugin } from \"autostore\";\n\nexport function installPlugin(plugin: IAutoStorePlugin) {\n // @ts-ignore\n if (!globalThis.__AUTOSTORE_PLUGINS__) {\n // @ts-ignore\n globalThis.__AUTOSTORE_PLUGINS__ = [];\n }\n globalThis.__AUTOSTORE_PLUGINS__.push(plugin);\n}\n\ndeclare global {\n // @ts-ignore\n var __AUTOSTORE_PLUGINS__: IAutoStorePlugin[];\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/shadow.ts","../src/utils/installPlugin.ts"],"names":["installPlugin","plugin","globalThis","__AUTOSTORE_PLUGINS__","push","shadow","store","state","options","shadowStore","AutoStore","Object","assign","id","getRootScope","__name","getShadowStore","debug","onObserverBeforeCreate","descriptor","scope","isRelPath","watcher","watch","operate","operates","emit","path","join","PATH_DELIMITER","once","off"],"mappings":"2DA8BA,IAAA,CAAA,CAAA,MAAA,CAAA,cAAA,CAAA,IAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,GAAA,CAAA,CAAA,CAAA,CAAA,MAAA,CAAA,CAAA,KAAA,CAAA,CAAA,CAAA,YAAA,CAAA,IAAA,CAAA,CAAA,CC5BO,SAASA,CAAAA,CAAcC,CAAAA,CAAwB,CAE7CC,UAAAA,CAAWC,qBAAAA,GAEZD,UAAAA,CAAWC,qBAAAA,CAAwB,EAAA,CAAA,CAEvCD,UAAAA,CAAWC,qBAAAA,CAAsBC,IAAAA,CAAKH,CAAAA,EAC1C,CAPgBD,CAAAA,CAAAA,CAAAA,CAAAA,eAAAA,CAAAA,CDwCT,SAASK,CAAAA,CAAOC,EAAmB,CACtCA,CAAAA,CAAMD,MAAAA,CAAS,SAA0BE,CAAAA,CAAUC,CAAAA,CAA6B,CAC5E,IAAMC,CAAAA,CAAc,IAAIC,SAAAA,CACpBH,CAAAA,CACAI,MAAAA,CAAOC,MAAAA,CAAO,EAAC,CAAGJ,CAAAA,CAAS,CACvBK,EAAAA,CAAI,CAAA,EAAGP,CAAAA,CAAMO,EAAE,CAAA,OAAA,CAAA,CACfC,YAAAA,CAAcC,CAAAA,CAAA,IAAMT,CAAAA,CAAMC,KAAAA,CAAZ,cAAA,CAAA,CACdS,cAAAA,CAAgBD,CAAAA,CAAA,IAAMT,EAAN,gBAAA,CAAA,CAChBW,KAAAA,CAAOX,CAAAA,CAAME,OAAAA,CAAQS,KAAAA,CACrBZ,MAAAA,CAAQ,IAAA,CACRa,sBAAAA,CAAwBH,CAAAA,CAACI,CAAAA,EAAAA,CAGrB,IAAMC,CAAAA,CAAQD,CAAAA,CAAWX,OAAAA,CAAQY,KAAAA,CAAAA,CAC7B,CAACA,CAAAA,EAASC,SAAAA,CAAUD,CAAAA,CAAAA,IACpBD,CAAAA,CAAWX,OAAAA,CAAQY,KAAAA,CAAQ,MAAA,EAEnC,CAAA,CAPwB,wBAAA,CAQ5B,CAAA,CAAA,CAAA,CAIEE,CAAAA,CAAUhB,CAAAA,CAAMiB,MAAOC,CAAAA,EAAAA,CACzBA,CAAAA,CAAQnB,MAAAA,CAAS,IAAA,CACjBI,CAAAA,CAAYgB,QAAAA,CAASC,IAAAA,CAAKF,CAAAA,CAAQG,IAAAA,CAAKC,IAAAA,CAAKC,cAAAA,CAAAA,CAAiBL,CAAAA,EACjE,CAAA,CAAA,CACAf,OAAAA,CAAAA,CAAYqB,IAAAA,CAAK,QAAA,CAAU,IAAMR,CAAAA,CAAQS,GAAAA,EAAG,CAAA,CACrCtB,CACX,EACJ,CA7BgBJ,CAAAA,CAAAA,CAAAA,CAAAA,QAAAA,CAAAA,CA8ChBL,EAAcK,CAAAA,CAAAA","file":"shadow.js","sourcesContent":["/**\r\n * shadow 插件\r\n *\r\n * 为 AutoStore 注入影子 store(shadowStore)能力:\r\n * - 调用 shadow(store) 后,store 获得 store.shadow(state) 方法\r\n * - shadowStore 基于原 store 派生,自身不持有业务状态,其计算属性/watch 的作用域指向原 store 的 state\r\n * - 原 store 的写操作会转发到 shadowStore,触发其计算属性重新计算\r\n * - 适用于在不污染原 store 的前提下,派生额外的计算视图(如多维聚合、派生展示字段)\r\n *\r\n * shadowStore 的 id 为 `${原store.id}_shadow`,且 options.shadow = true。\r\n * 由于 shadowStore 中的 observer 是动态创建的,其 scope 会被强制设为 ROOT\r\n * (不能是 CURRENT 或相对路径)。\r\n *\r\n * @example\r\n *\r\n * import { AutoStore, computed } from \"autostore\";\r\n * import { shadow } from \"@autostorejs/plugins\";\r\n *\r\n * const store = new AutoStore({ price: 10, count: 3 });\r\n * shadow(store); // 安装插件,挂载 store.shadow 方法\r\n *\r\n * const shadowStore = store.shadow({\r\n * total: computed((scope) => scope.price * scope.count),\r\n * });\r\n *\r\n * shadowStore.state.total; // 30\r\n * store.state.count = 4;\r\n * shadowStore.state.total; // 40\r\n */\r\n\r\nimport { AutoStore, isRelPath, PATH_DELIMITER } from \"autostore\";\r\nimport type { AutoStoreOptions, ObserverDescriptor, AnyAutoStore, Dict } from \"autostore\";\r\nimport { installPlugin } from \"./utils/installPlugin\";\r\n\r\n/**\r\n * shadow 插件入口\r\n *\r\n * 给目标 store 挂载 shadow 方法,调用后即可通过 store.shadow(state) 创建影子 store。\r\n *\r\n * @param store 目标 AutoStore 实例\r\n * @returns 无返回值,副作用是给 store 挂载 shadow 方法\r\n */\r\nexport function shadow(store: AnyAutoStore) {\r\n store.shadow = function <T extends Dict>(state: T, options?: AutoStoreOptions<T>) {\r\n const shadowStore = new AutoStore(\r\n state,\r\n Object.assign({}, options, {\r\n id: `${store.id}_shadow`,\r\n getRootScope: () => store.state,\r\n getShadowStore: () => store,\r\n debug: store.options.debug,\r\n shadow: true,\r\n onObserverBeforeCreate: (descriptor: ObserverDescriptor<any, any, any>) => {\r\n //除非显式指定scope,并且scope不能是CURRENT\r\n // 因为动态创建的observer不能是CURRENT,也不能是相对路径\r\n const scope = descriptor.options.scope;\r\n if (!scope || isRelPath(scope)) {\r\n descriptor.options.scope = \"ROOT\";\r\n }\r\n },\r\n }),\r\n ) as AutoStore<T>;\r\n\r\n // 将操作转到到shadowStore\r\n const watcher = store.watch((operate) => {\r\n operate.shadow = true;\r\n shadowStore.operates.emit(operate.path.join(PATH_DELIMITER), operate);\r\n });\r\n shadowStore.once(\"unload\", () => watcher.off());\r\n return shadowStore;\r\n };\r\n}\r\ndeclare module \"autostore\" {\r\n export interface AutoStore<State extends Dict, Options = unknown> {\r\n /**\r\n * 基于当前 store 创建一个影子 store(shadowStore)\r\n *\r\n * shadowStore 不持有独立业务状态,其计算属性的作用域指向原 store 的 state;\r\n * 原 store 的写操作会转发到 shadowStore 并触发其计算属性重算。\r\n *\r\n * @param state 影子 store 的状态定义(通常只包含 computed 计算属性)\r\n * @param options 额外的 AutoStore 配置,会与内部 shadow 配置合并\r\n * @returns 新建的 shadowStore 实例\r\n */\r\n shadow<T extends Dict>(state: T, options?: AutoStoreOptions<T>): AutoStore<T>;\r\n }\r\n}\r\n\r\ninstallPlugin(shadow);\r\n","import type { IAutoStorePlugin } from \"autostore\";\r\n\r\nexport function installPlugin(plugin: IAutoStorePlugin) {\r\n // @ts-ignore\r\n if (!globalThis.__AUTOSTORE_PLUGINS__) {\r\n // @ts-ignore\r\n globalThis.__AUTOSTORE_PLUGINS__ = [];\r\n }\r\n globalThis.__AUTOSTORE_PLUGINS__.push(plugin);\r\n}\r\n\r\ndeclare global {\r\n // @ts-ignore\r\n var __AUTOSTORE_PLUGINS__: IAutoStorePlugin[];\r\n}\r\n"]}
1
+ {"version":3,"sources":["../src/shadow.ts","../src/utils/installPlugin.ts"],"names":["installPlugin","plugin","globalThis","__AUTOSTORE_PLUGINS__","push","shadow","store","state","options","shadowStore","AutoStore","Object","assign","id","getRootScope","__name","getShadowStore","debug","onObserverBeforeCreate","descriptor","scope","isRelPath","watcher","watch","operate","operates","emit","path","join","PATH_DELIMITER","once","off"],"mappings":"2DA8BA,IAAA,CAAA,CAAA,MAAA,CAAA,cAAA,CAAA,IAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,GAAA,CAAA,CAAA,CAAA,CAAA,MAAA,CAAA,CAAA,KAAA,CAAA,CAAA,CAAA,YAAA,CAAA,IAAA,CAAA,CAAA,CC5BO,SAASA,CAAAA,CAAcC,CAAAA,CAAwB,CAE7CC,UAAAA,CAAWC,qBAAAA,GAEZD,UAAAA,CAAWC,qBAAAA,CAAwB,EAAA,CAAA,CAEvCD,UAAAA,CAAWC,qBAAAA,CAAsBC,IAAAA,CAAKH,CAAAA,EAC1C,CAPgBD,CAAAA,CAAAA,CAAAA,CAAAA,eAAAA,CAAAA,CDwCT,SAASK,CAAAA,CAAOC,EAAmB,CACtCA,CAAAA,CAAMD,MAAAA,CAAS,SAA0BE,CAAAA,CAAUC,CAAAA,CAA6B,CAC5E,IAAMC,CAAAA,CAAc,IAAIC,SAAAA,CACpBH,CAAAA,CACAI,MAAAA,CAAOC,MAAAA,CAAO,EAAC,CAAGJ,CAAAA,CAAS,CACvBK,EAAAA,CAAI,CAAA,EAAGP,CAAAA,CAAMO,EAAE,CAAA,OAAA,CAAA,CACfC,YAAAA,CAAcC,CAAAA,CAAA,IAAMT,CAAAA,CAAMC,KAAAA,CAAZ,cAAA,CAAA,CACdS,cAAAA,CAAgBD,CAAAA,CAAA,IAAMT,EAAN,gBAAA,CAAA,CAChBW,KAAAA,CAAOX,CAAAA,CAAME,OAAAA,CAAQS,KAAAA,CACrBZ,MAAAA,CAAQ,IAAA,CACRa,sBAAAA,CAAwBH,CAAAA,CAACI,CAAAA,EAAAA,CAGrB,IAAMC,CAAAA,CAAQD,CAAAA,CAAWX,OAAAA,CAAQY,KAAAA,CAAAA,CAC7B,CAACA,CAAAA,EAASC,SAAAA,CAAUD,CAAAA,CAAAA,IACpBD,CAAAA,CAAWX,OAAAA,CAAQY,KAAAA,CAAQ,MAAA,EAEnC,CAAA,CAPwB,wBAAA,CAQ5B,CAAA,CAAA,CAAA,CAIEE,CAAAA,CAAUhB,CAAAA,CAAMiB,MAAOC,CAAAA,EAAAA,CACzBA,CAAAA,CAAQnB,MAAAA,CAAS,IAAA,CACjBI,CAAAA,CAAYgB,QAAAA,CAASC,IAAAA,CAAKF,CAAAA,CAAQG,IAAAA,CAAKC,IAAAA,CAAKC,cAAAA,CAAAA,CAAiBL,CAAAA,EACjE,CAAA,CAAA,CACAf,OAAAA,CAAAA,CAAYqB,IAAAA,CAAK,QAAA,CAAU,IAAMR,CAAAA,CAAQS,GAAAA,EAAG,CAAA,CACrCtB,CACX,EACJ,CA7BgBJ,CAAAA,CAAAA,CAAAA,CAAAA,QAAAA,CAAAA,CA8ChBL,EAAcK,CAAAA,CAAAA","file":"shadow.js","sourcesContent":["/**\n * shadow 插件\n *\n * 为 AutoStore 注入影子 store(shadowStore)能力:\n * - 调用 shadow(store) 后,store 获得 store.shadow(state) 方法\n * - shadowStore 基于原 store 派生,自身不持有业务状态,其计算属性/watch 的作用域指向原 store 的 state\n * - 原 store 的写操作会转发到 shadowStore,触发其计算属性重新计算\n * - 适用于在不污染原 store 的前提下,派生额外的计算视图(如多维聚合、派生展示字段)\n *\n * shadowStore 的 id 为 `${原store.id}_shadow`,且 options.shadow = true。\n * 由于 shadowStore 中的 observer 是动态创建的,其 scope 会被强制设为 ROOT\n * (不能是 CURRENT 或相对路径)。\n *\n * @example\n *\n * import { AutoStore, computed } from \"autostore\";\n * import { shadow } from \"@autostorejs/plugins\";\n *\n * const store = new AutoStore({ price: 10, count: 3 });\n * shadow(store); // 安装插件,挂载 store.shadow 方法\n *\n * const shadowStore = store.shadow({\n * total: computed((scope) => scope.price * scope.count),\n * });\n *\n * shadowStore.state.total; // 30\n * store.state.count = 4;\n * shadowStore.state.total; // 40\n */\n\nimport { AutoStore, isRelPath, PATH_DELIMITER } from \"autostore\";\nimport type { AutoStoreOptions, ObserverDescriptor, AnyAutoStore, Dict } from \"autostore\";\nimport { installPlugin } from \"./utils/installPlugin\";\n\n/**\n * shadow 插件入口\n *\n * 给目标 store 挂载 shadow 方法,调用后即可通过 store.shadow(state) 创建影子 store。\n *\n * @param store 目标 AutoStore 实例\n * @returns 无返回值,副作用是给 store 挂载 shadow 方法\n */\nexport function shadow(store: AnyAutoStore) {\n store.shadow = function <T extends Dict>(state: T, options?: AutoStoreOptions<T>) {\n const shadowStore = new AutoStore(\n state,\n Object.assign({}, options, {\n id: `${store.id}_shadow`,\n getRootScope: () => store.state,\n getShadowStore: () => store,\n debug: store.options.debug,\n shadow: true,\n onObserverBeforeCreate: (descriptor: ObserverDescriptor<any, any, any>) => {\n //除非显式指定scope,并且scope不能是CURRENT\n // 因为动态创建的observer不能是CURRENT,也不能是相对路径\n const scope = descriptor.options.scope;\n if (!scope || isRelPath(scope)) {\n descriptor.options.scope = \"ROOT\";\n }\n },\n }),\n ) as AutoStore<T>;\n\n // 将操作转到到shadowStore\n const watcher = store.watch((operate) => {\n operate.shadow = true;\n shadowStore.operates.emit(operate.path.join(PATH_DELIMITER), operate);\n });\n shadowStore.once(\"unload\", () => watcher.off());\n return shadowStore;\n };\n}\ndeclare module \"autostore\" {\n export interface AutoStore<State extends Dict, Options = unknown> {\n /**\n * 基于当前 store 创建一个影子 store(shadowStore)\n *\n * shadowStore 不持有独立业务状态,其计算属性的作用域指向原 store 的 state;\n * 原 store 的写操作会转发到 shadowStore 并触发其计算属性重算。\n *\n * @param state 影子 store 的状态定义(通常只包含 computed 计算属性)\n * @param options 额外的 AutoStore 配置,会与内部 shadow 配置合并\n * @returns 新建的 shadowStore 实例\n */\n shadow<T extends Dict>(state: T, options?: AutoStoreOptions<T>): AutoStore<T>;\n }\n}\n\ninstallPlugin(shadow);\n","import type { IAutoStorePlugin } from \"autostore\";\n\nexport function installPlugin(plugin: IAutoStorePlugin) {\n // @ts-ignore\n if (!globalThis.__AUTOSTORE_PLUGINS__) {\n // @ts-ignore\n globalThis.__AUTOSTORE_PLUGINS__ = [];\n }\n globalThis.__AUTOSTORE_PLUGINS__.push(plugin);\n}\n\ndeclare global {\n // @ts-ignore\n var __AUTOSTORE_PLUGINS__: IAutoStorePlugin[];\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/utils/installPlugin.ts","../src/trace.ts"],"names":["installPlugin","plugin","globalThis","__AUTOSTORE_PLUGINS__","push","trace","store","fn","operates","watcher","stop","__name","off","start","isStop","ops","Promise","resolve","watch","operate","finally"],"mappings":"8FAEO,SAASA,CAAAA,CAAcC,EAAwB,CAE7CC,UAAAA,CAAWC,wBAEZD,UAAAA,CAAWC,qBAAAA,CAAwB,EAAA,CAAA,CAEvCD,UAAAA,CAAWC,qBAAAA,CAAsBC,KAAKH,CAAAA,EAC1C,CAPgBD,CAAAA,CAAAA,CAAAA,CAAAA,eAAAA,CAAAA,CCkET,SAASK,CAAAA,CAAMC,CAAAA,CAAmB,CACrCA,CAAAA,CAAMD,KAAAA,CAAQ,SACVE,EACAC,CAAAA,CAA2C,CAE3C,IAAIC,CAAAA,CACJ,OAAO,CACHC,KAAMC,CAAAA,CAAA,IAAMF,CAAAA,EAASG,GAAAA,EAAAA,CAAf,MAAA,CAAA,CACNC,MAAOF,CAAAA,CAAA,MAAOG,CAAAA,EAAAA,CACV,IAAMC,CAAAA,CAAsB,EAAA,CAC5B,OAAO,IAAIC,OAAAA,CAASC,CAAAA,EAAAA,CAChBR,EAAU,IAAA,CAAKS,KAAAA,CACVC,CAAAA,EAAAA,CACGJ,CAAAA,CAAIX,IAAAA,CAAKe,CAAAA,CAAAA,CACLL,CAAAA,GAASK,CAAAA,CAAAA,GACTV,CAAAA,CAAQG,GAAAA,GACRK,CAAAA,CAAQF,CAAAA,CAAAA,EAEhB,CAAA,CACA,CAAEP,QAAAA,CAAAA,CAAS,CAAA,CAAA,CAEfQ,OAAAA,CAAQC,OAAAA,CAAQV,CAAAA,EAAAA,EAAMa,OAAAA,CAAQ,IAAA,CACtB,OAAON,CAAAA,EAAW,UAAA,GAClBL,EAAQG,GAAAA,EAAG,CACXK,CAAAA,CAAQF,CAAAA,CAAAA,EAEhB,CAAA,EACJ,CAAA,CACJ,CAAA,CApBO,OAAA,CAqBX,CACJ,EACJ,CA/BgBV,CAAAA,CAAAA,CAAAA,CAAAA,OAAAA,CAAAA,CAqChBL,CAAAA,CAAcK,CAAAA,CAAAA","file":"trace.cjs","sourcesContent":["import type { IAutoStorePlugin } from \"autostore\";\r\n\r\nexport function installPlugin(plugin: IAutoStorePlugin) {\r\n // @ts-ignore\r\n if (!globalThis.__AUTOSTORE_PLUGINS__) {\r\n // @ts-ignore\r\n globalThis.__AUTOSTORE_PLUGINS__ = [];\r\n }\r\n globalThis.__AUTOSTORE_PLUGINS__.push(plugin);\r\n}\r\n\r\ndeclare global {\r\n // @ts-ignore\r\n var __AUTOSTORE_PLUGINS__: IAutoStorePlugin[];\r\n}\r\n","/**\r\n * 跟踪函数内部的操作\r\n *\r\n * 主要用于调试,跟踪函数内部的操作\r\n *\r\n * 比如我们想要知道执行一个state.xxx=1时,会触发哪些操作,可以通过此方法来跟踪\r\n *\r\n * 注意: 本方法主要用于调试,不要在生产环境中使用\r\n *\r\n * @example\r\n *\r\n * - 跟踪同步函数内部的操作\r\n * trace((state)=>{\r\n * state.xxx.xxx = 1\r\n * },(operate)=>{\r\n * console.log(operate)\r\n * })\r\n *\r\n * - 跟踪异步函数内部的操作???\r\n *\r\n * 注意:\r\n * 由于无法控制异步上下文,特别是在同时运行多个异步trace函数时,不同的trace函数可能会相互干扰,无法区分。\r\n * 因此,异步函数的跟踪难以实现,只能用在调试时且只运行单个异步trace函数时使用\r\n *\r\n * const store= new AutoStore({\r\n * price:10,\r\n * count:2,\r\n * total: async (state)=>{\r\n * await delay(1000)\r\n * return state.price * state.count\r\n * }\r\n * })\r\n *\r\n *\r\n *\r\n * const fn = async ()=>{\r\n * await fetch('xxxx')\r\n * store.state.price = 20\r\n * store.state.count= 3\r\n * }\r\n * 我们想要知道fn执行时会触发哪些操作,可以通过trace来跟踪\r\n * const ops = await trace(fn).start()\r\n *\r\n *\r\n * 我们可以看到,fn执行时,只有显式的对price和count,但是由于total是异步计算属性,所以也会触发total的变化。\r\n * 因此也应该被跟踪,但是由于其是异步计算属性,所以不会被跟踪。\r\n * 因此需要显式的提供一个abort参数来结束包括异步的跟踪过程\r\n *\r\n *\r\n * stateTracker.stop() // 取消跟踪\r\n * const operates = await stateTracker.start((operate)=>{\r\n * return operate.type=='set' && path[0]==='total'\r\n * }) // 开始跟踪\r\n *\r\n *\r\n * @param fn\r\n * @param operates\r\n * @returns\r\n */\r\n\r\nimport type { StateOperate, Watcher, WatchListenerOptions, AnyAutoStore, Dict } from \"autostore\";\r\nimport { installPlugin } from \"./utils/installPlugin\";\r\n\r\nexport type StateTracker = {\r\n stop: () => void;\r\n start(isStop?: (operate: StateOperate) => boolean): Promise<StateOperate[]>;\r\n};\r\n\r\nexport function trace(store: AnyAutoStore) {\r\n store.trace = function (\r\n fn: () => any,\r\n operates?: WatchListenerOptions[\"operates\"],\r\n ): StateTracker {\r\n let watcher: Watcher;\r\n return {\r\n stop: () => watcher?.off(),\r\n start: async (isStop?: (operate: StateOperate) => boolean) => {\r\n const ops: StateOperate[] = [];\r\n return new Promise((resolve) => {\r\n watcher = this.watch(\r\n (operate) => {\r\n ops.push(operate);\r\n if (isStop?.(operate)) {\r\n watcher.off();\r\n resolve(ops);\r\n }\r\n },\r\n { operates },\r\n );\r\n Promise.resolve(fn()).finally(() => {\r\n if (typeof isStop !== \"function\") {\r\n watcher.off();\r\n resolve(ops);\r\n }\r\n });\r\n });\r\n },\r\n };\r\n };\r\n}\r\ndeclare module \"autostore\" {\r\n export interface AutoStore<State extends Dict, Options = unknown> {\r\n trace(fn: () => any, operates?: WatchListenerOptions[\"operates\"]): StateTracker;\r\n }\r\n}\r\ninstallPlugin(trace);\r\n"]}
1
+ {"version":3,"sources":["../src/utils/installPlugin.ts","../src/trace.ts"],"names":["installPlugin","plugin","globalThis","__AUTOSTORE_PLUGINS__","push","trace","store","fn","operates","watcher","stop","__name","off","start","isStop","ops","Promise","resolve","watch","operate","finally"],"mappings":"8FAEO,SAASA,CAAAA,CAAcC,EAAwB,CAE7CC,UAAAA,CAAWC,wBAEZD,UAAAA,CAAWC,qBAAAA,CAAwB,EAAA,CAAA,CAEvCD,UAAAA,CAAWC,qBAAAA,CAAsBC,KAAKH,CAAAA,EAC1C,CAPgBD,CAAAA,CAAAA,CAAAA,CAAAA,eAAAA,CAAAA,CCkET,SAASK,CAAAA,CAAMC,CAAAA,CAAmB,CACrCA,CAAAA,CAAMD,KAAAA,CAAQ,SACVE,EACAC,CAAAA,CAA2C,CAE3C,IAAIC,CAAAA,CACJ,OAAO,CACHC,KAAMC,CAAAA,CAAA,IAAMF,CAAAA,EAASG,GAAAA,EAAAA,CAAf,MAAA,CAAA,CACNC,MAAOF,CAAAA,CAAA,MAAOG,CAAAA,EAAAA,CACV,IAAMC,CAAAA,CAAsB,EAAA,CAC5B,OAAO,IAAIC,OAAAA,CAASC,CAAAA,EAAAA,CAChBR,EAAU,IAAA,CAAKS,KAAAA,CACVC,CAAAA,EAAAA,CACGJ,CAAAA,CAAIX,IAAAA,CAAKe,CAAAA,CAAAA,CACLL,CAAAA,GAASK,CAAAA,CAAAA,GACTV,CAAAA,CAAQG,GAAAA,GACRK,CAAAA,CAAQF,CAAAA,CAAAA,EAEhB,CAAA,CACA,CAAEP,QAAAA,CAAAA,CAAS,CAAA,CAAA,CAEfQ,OAAAA,CAAQC,OAAAA,CAAQV,CAAAA,EAAAA,EAAMa,OAAAA,CAAQ,IAAA,CACtB,OAAON,CAAAA,EAAW,UAAA,GAClBL,EAAQG,GAAAA,EAAG,CACXK,CAAAA,CAAQF,CAAAA,CAAAA,EAEhB,CAAA,EACJ,CAAA,CACJ,CAAA,CApBO,OAAA,CAqBX,CACJ,EACJ,CA/BgBV,CAAAA,CAAAA,CAAAA,CAAAA,OAAAA,CAAAA,CAqChBL,CAAAA,CAAcK,CAAAA,CAAAA","file":"trace.cjs","sourcesContent":["import type { IAutoStorePlugin } from \"autostore\";\n\nexport function installPlugin(plugin: IAutoStorePlugin) {\n // @ts-ignore\n if (!globalThis.__AUTOSTORE_PLUGINS__) {\n // @ts-ignore\n globalThis.__AUTOSTORE_PLUGINS__ = [];\n }\n globalThis.__AUTOSTORE_PLUGINS__.push(plugin);\n}\n\ndeclare global {\n // @ts-ignore\n var __AUTOSTORE_PLUGINS__: IAutoStorePlugin[];\n}\n","/**\n * 跟踪函数内部的操作\n *\n * 主要用于调试,跟踪函数内部的操作\n *\n * 比如我们想要知道执行一个state.xxx=1时,会触发哪些操作,可以通过此方法来跟踪\n *\n * 注意: 本方法主要用于调试,不要在生产环境中使用\n *\n * @example\n *\n * - 跟踪同步函数内部的操作\n * trace((state)=>{\n * state.xxx.xxx = 1\n * },(operate)=>{\n * console.log(operate)\n * })\n *\n * - 跟踪异步函数内部的操作???\n *\n * 注意:\n * 由于无法控制异步上下文,特别是在同时运行多个异步trace函数时,不同的trace函数可能会相互干扰,无法区分。\n * 因此,异步函数的跟踪难以实现,只能用在调试时且只运行单个异步trace函数时使用\n *\n * const store= new AutoStore({\n * price:10,\n * count:2,\n * total: async (state)=>{\n * await delay(1000)\n * return state.price * state.count\n * }\n * })\n *\n *\n *\n * const fn = async ()=>{\n * await fetch('xxxx')\n * store.state.price = 20\n * store.state.count= 3\n * }\n * 我们想要知道fn执行时会触发哪些操作,可以通过trace来跟踪\n * const ops = await trace(fn).start()\n *\n *\n * 我们可以看到,fn执行时,只有显式的对price和count,但是由于total是异步计算属性,所以也会触发total的变化。\n * 因此也应该被跟踪,但是由于其是异步计算属性,所以不会被跟踪。\n * 因此需要显式的提供一个abort参数来结束包括异步的跟踪过程\n *\n *\n * stateTracker.stop() // 取消跟踪\n * const operates = await stateTracker.start((operate)=>{\n * return operate.type=='set' && path[0]==='total'\n * }) // 开始跟踪\n *\n *\n * @param fn\n * @param operates\n * @returns\n */\n\nimport type { StateOperate, Watcher, WatchListenerOptions, AnyAutoStore, Dict } from \"autostore\";\nimport { installPlugin } from \"./utils/installPlugin\";\n\nexport type StateTracker = {\n stop: () => void;\n start(isStop?: (operate: StateOperate) => boolean): Promise<StateOperate[]>;\n};\n\nexport function trace(store: AnyAutoStore) {\n store.trace = function (\n fn: () => any,\n operates?: WatchListenerOptions[\"operates\"],\n ): StateTracker {\n let watcher: Watcher;\n return {\n stop: () => watcher?.off(),\n start: async (isStop?: (operate: StateOperate) => boolean) => {\n const ops: StateOperate[] = [];\n return new Promise((resolve) => {\n watcher = this.watch(\n (operate) => {\n ops.push(operate);\n if (isStop?.(operate)) {\n watcher.off();\n resolve(ops);\n }\n },\n { operates },\n );\n Promise.resolve(fn()).finally(() => {\n if (typeof isStop !== \"function\") {\n watcher.off();\n resolve(ops);\n }\n });\n });\n },\n };\n };\n}\ndeclare module \"autostore\" {\n export interface AutoStore<State extends Dict, Options = unknown> {\n trace(fn: () => any, operates?: WatchListenerOptions[\"operates\"]): StateTracker;\n }\n}\ninstallPlugin(trace);\n"]}
package/dist/trace.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/utils/installPlugin.ts","../src/trace.ts"],"names":["installPlugin","plugin","globalThis","__AUTOSTORE_PLUGINS__","push","trace","store","fn","operates","watcher","stop","__name","off","start","isStop","ops","Promise","resolve","watch","operate","finally"],"mappings":"iFAEO,SAASA,CAAAA,CAAcC,EAAwB,CAE7CC,UAAAA,CAAWC,wBAEZD,UAAAA,CAAWC,qBAAAA,CAAwB,EAAA,CAAA,CAEvCD,UAAAA,CAAWC,qBAAAA,CAAsBC,KAAKH,CAAAA,EAC1C,CAPgBD,CAAAA,CAAAA,CAAAA,CAAAA,eAAAA,CAAAA,CCkET,SAASK,CAAAA,CAAMC,CAAAA,CAAmB,CACrCA,CAAAA,CAAMD,KAAAA,CAAQ,SACVE,EACAC,CAAAA,CAA2C,CAE3C,IAAIC,CAAAA,CACJ,OAAO,CACHC,KAAMC,CAAAA,CAAA,IAAMF,CAAAA,EAASG,GAAAA,EAAAA,CAAf,MAAA,CAAA,CACNC,MAAOF,CAAAA,CAAA,MAAOG,CAAAA,EAAAA,CACV,IAAMC,CAAAA,CAAsB,EAAA,CAC5B,OAAO,IAAIC,OAAAA,CAASC,CAAAA,EAAAA,CAChBR,EAAU,IAAA,CAAKS,KAAAA,CACVC,CAAAA,EAAAA,CACGJ,CAAAA,CAAIX,IAAAA,CAAKe,CAAAA,CAAAA,CACLL,CAAAA,GAASK,CAAAA,CAAAA,GACTV,CAAAA,CAAQG,GAAAA,GACRK,CAAAA,CAAQF,CAAAA,CAAAA,EAEhB,CAAA,CACA,CAAEP,QAAAA,CAAAA,CAAS,CAAA,CAAA,CAEfQ,OAAAA,CAAQC,OAAAA,CAAQV,CAAAA,EAAAA,EAAMa,OAAAA,CAAQ,IAAA,CACtB,OAAON,CAAAA,EAAW,UAAA,GAClBL,EAAQG,GAAAA,EAAG,CACXK,CAAAA,CAAQF,CAAAA,CAAAA,EAEhB,CAAA,EACJ,CAAA,CACJ,CAAA,CApBO,OAAA,CAqBX,CACJ,EACJ,CA/BgBV,CAAAA,CAAAA,CAAAA,CAAAA,OAAAA,CAAAA,CAqChBL,CAAAA,CAAcK,CAAAA,CAAAA","file":"trace.js","sourcesContent":["import type { IAutoStorePlugin } from \"autostore\";\r\n\r\nexport function installPlugin(plugin: IAutoStorePlugin) {\r\n // @ts-ignore\r\n if (!globalThis.__AUTOSTORE_PLUGINS__) {\r\n // @ts-ignore\r\n globalThis.__AUTOSTORE_PLUGINS__ = [];\r\n }\r\n globalThis.__AUTOSTORE_PLUGINS__.push(plugin);\r\n}\r\n\r\ndeclare global {\r\n // @ts-ignore\r\n var __AUTOSTORE_PLUGINS__: IAutoStorePlugin[];\r\n}\r\n","/**\r\n * 跟踪函数内部的操作\r\n *\r\n * 主要用于调试,跟踪函数内部的操作\r\n *\r\n * 比如我们想要知道执行一个state.xxx=1时,会触发哪些操作,可以通过此方法来跟踪\r\n *\r\n * 注意: 本方法主要用于调试,不要在生产环境中使用\r\n *\r\n * @example\r\n *\r\n * - 跟踪同步函数内部的操作\r\n * trace((state)=>{\r\n * state.xxx.xxx = 1\r\n * },(operate)=>{\r\n * console.log(operate)\r\n * })\r\n *\r\n * - 跟踪异步函数内部的操作???\r\n *\r\n * 注意:\r\n * 由于无法控制异步上下文,特别是在同时运行多个异步trace函数时,不同的trace函数可能会相互干扰,无法区分。\r\n * 因此,异步函数的跟踪难以实现,只能用在调试时且只运行单个异步trace函数时使用\r\n *\r\n * const store= new AutoStore({\r\n * price:10,\r\n * count:2,\r\n * total: async (state)=>{\r\n * await delay(1000)\r\n * return state.price * state.count\r\n * }\r\n * })\r\n *\r\n *\r\n *\r\n * const fn = async ()=>{\r\n * await fetch('xxxx')\r\n * store.state.price = 20\r\n * store.state.count= 3\r\n * }\r\n * 我们想要知道fn执行时会触发哪些操作,可以通过trace来跟踪\r\n * const ops = await trace(fn).start()\r\n *\r\n *\r\n * 我们可以看到,fn执行时,只有显式的对price和count,但是由于total是异步计算属性,所以也会触发total的变化。\r\n * 因此也应该被跟踪,但是由于其是异步计算属性,所以不会被跟踪。\r\n * 因此需要显式的提供一个abort参数来结束包括异步的跟踪过程\r\n *\r\n *\r\n * stateTracker.stop() // 取消跟踪\r\n * const operates = await stateTracker.start((operate)=>{\r\n * return operate.type=='set' && path[0]==='total'\r\n * }) // 开始跟踪\r\n *\r\n *\r\n * @param fn\r\n * @param operates\r\n * @returns\r\n */\r\n\r\nimport type { StateOperate, Watcher, WatchListenerOptions, AnyAutoStore, Dict } from \"autostore\";\r\nimport { installPlugin } from \"./utils/installPlugin\";\r\n\r\nexport type StateTracker = {\r\n stop: () => void;\r\n start(isStop?: (operate: StateOperate) => boolean): Promise<StateOperate[]>;\r\n};\r\n\r\nexport function trace(store: AnyAutoStore) {\r\n store.trace = function (\r\n fn: () => any,\r\n operates?: WatchListenerOptions[\"operates\"],\r\n ): StateTracker {\r\n let watcher: Watcher;\r\n return {\r\n stop: () => watcher?.off(),\r\n start: async (isStop?: (operate: StateOperate) => boolean) => {\r\n const ops: StateOperate[] = [];\r\n return new Promise((resolve) => {\r\n watcher = this.watch(\r\n (operate) => {\r\n ops.push(operate);\r\n if (isStop?.(operate)) {\r\n watcher.off();\r\n resolve(ops);\r\n }\r\n },\r\n { operates },\r\n );\r\n Promise.resolve(fn()).finally(() => {\r\n if (typeof isStop !== \"function\") {\r\n watcher.off();\r\n resolve(ops);\r\n }\r\n });\r\n });\r\n },\r\n };\r\n };\r\n}\r\ndeclare module \"autostore\" {\r\n export interface AutoStore<State extends Dict, Options = unknown> {\r\n trace(fn: () => any, operates?: WatchListenerOptions[\"operates\"]): StateTracker;\r\n }\r\n}\r\ninstallPlugin(trace);\r\n"]}
1
+ {"version":3,"sources":["../src/utils/installPlugin.ts","../src/trace.ts"],"names":["installPlugin","plugin","globalThis","__AUTOSTORE_PLUGINS__","push","trace","store","fn","operates","watcher","stop","__name","off","start","isStop","ops","Promise","resolve","watch","operate","finally"],"mappings":"iFAEO,SAASA,CAAAA,CAAcC,EAAwB,CAE7CC,UAAAA,CAAWC,wBAEZD,UAAAA,CAAWC,qBAAAA,CAAwB,EAAA,CAAA,CAEvCD,UAAAA,CAAWC,qBAAAA,CAAsBC,KAAKH,CAAAA,EAC1C,CAPgBD,CAAAA,CAAAA,CAAAA,CAAAA,eAAAA,CAAAA,CCkET,SAASK,CAAAA,CAAMC,CAAAA,CAAmB,CACrCA,CAAAA,CAAMD,KAAAA,CAAQ,SACVE,EACAC,CAAAA,CAA2C,CAE3C,IAAIC,CAAAA,CACJ,OAAO,CACHC,KAAMC,CAAAA,CAAA,IAAMF,CAAAA,EAASG,GAAAA,EAAAA,CAAf,MAAA,CAAA,CACNC,MAAOF,CAAAA,CAAA,MAAOG,CAAAA,EAAAA,CACV,IAAMC,CAAAA,CAAsB,EAAA,CAC5B,OAAO,IAAIC,OAAAA,CAASC,CAAAA,EAAAA,CAChBR,EAAU,IAAA,CAAKS,KAAAA,CACVC,CAAAA,EAAAA,CACGJ,CAAAA,CAAIX,IAAAA,CAAKe,CAAAA,CAAAA,CACLL,CAAAA,GAASK,CAAAA,CAAAA,GACTV,CAAAA,CAAQG,GAAAA,GACRK,CAAAA,CAAQF,CAAAA,CAAAA,EAEhB,CAAA,CACA,CAAEP,QAAAA,CAAAA,CAAS,CAAA,CAAA,CAEfQ,OAAAA,CAAQC,OAAAA,CAAQV,CAAAA,EAAAA,EAAMa,OAAAA,CAAQ,IAAA,CACtB,OAAON,CAAAA,EAAW,UAAA,GAClBL,EAAQG,GAAAA,EAAG,CACXK,CAAAA,CAAQF,CAAAA,CAAAA,EAEhB,CAAA,EACJ,CAAA,CACJ,CAAA,CApBO,OAAA,CAqBX,CACJ,EACJ,CA/BgBV,CAAAA,CAAAA,CAAAA,CAAAA,OAAAA,CAAAA,CAqChBL,CAAAA,CAAcK,CAAAA,CAAAA","file":"trace.js","sourcesContent":["import type { IAutoStorePlugin } from \"autostore\";\n\nexport function installPlugin(plugin: IAutoStorePlugin) {\n // @ts-ignore\n if (!globalThis.__AUTOSTORE_PLUGINS__) {\n // @ts-ignore\n globalThis.__AUTOSTORE_PLUGINS__ = [];\n }\n globalThis.__AUTOSTORE_PLUGINS__.push(plugin);\n}\n\ndeclare global {\n // @ts-ignore\n var __AUTOSTORE_PLUGINS__: IAutoStorePlugin[];\n}\n","/**\n * 跟踪函数内部的操作\n *\n * 主要用于调试,跟踪函数内部的操作\n *\n * 比如我们想要知道执行一个state.xxx=1时,会触发哪些操作,可以通过此方法来跟踪\n *\n * 注意: 本方法主要用于调试,不要在生产环境中使用\n *\n * @example\n *\n * - 跟踪同步函数内部的操作\n * trace((state)=>{\n * state.xxx.xxx = 1\n * },(operate)=>{\n * console.log(operate)\n * })\n *\n * - 跟踪异步函数内部的操作???\n *\n * 注意:\n * 由于无法控制异步上下文,特别是在同时运行多个异步trace函数时,不同的trace函数可能会相互干扰,无法区分。\n * 因此,异步函数的跟踪难以实现,只能用在调试时且只运行单个异步trace函数时使用\n *\n * const store= new AutoStore({\n * price:10,\n * count:2,\n * total: async (state)=>{\n * await delay(1000)\n * return state.price * state.count\n * }\n * })\n *\n *\n *\n * const fn = async ()=>{\n * await fetch('xxxx')\n * store.state.price = 20\n * store.state.count= 3\n * }\n * 我们想要知道fn执行时会触发哪些操作,可以通过trace来跟踪\n * const ops = await trace(fn).start()\n *\n *\n * 我们可以看到,fn执行时,只有显式的对price和count,但是由于total是异步计算属性,所以也会触发total的变化。\n * 因此也应该被跟踪,但是由于其是异步计算属性,所以不会被跟踪。\n * 因此需要显式的提供一个abort参数来结束包括异步的跟踪过程\n *\n *\n * stateTracker.stop() // 取消跟踪\n * const operates = await stateTracker.start((operate)=>{\n * return operate.type=='set' && path[0]==='total'\n * }) // 开始跟踪\n *\n *\n * @param fn\n * @param operates\n * @returns\n */\n\nimport type { StateOperate, Watcher, WatchListenerOptions, AnyAutoStore, Dict } from \"autostore\";\nimport { installPlugin } from \"./utils/installPlugin\";\n\nexport type StateTracker = {\n stop: () => void;\n start(isStop?: (operate: StateOperate) => boolean): Promise<StateOperate[]>;\n};\n\nexport function trace(store: AnyAutoStore) {\n store.trace = function (\n fn: () => any,\n operates?: WatchListenerOptions[\"operates\"],\n ): StateTracker {\n let watcher: Watcher;\n return {\n stop: () => watcher?.off(),\n start: async (isStop?: (operate: StateOperate) => boolean) => {\n const ops: StateOperate[] = [];\n return new Promise((resolve) => {\n watcher = this.watch(\n (operate) => {\n ops.push(operate);\n if (isStop?.(operate)) {\n watcher.off();\n resolve(ops);\n }\n },\n { operates },\n );\n Promise.resolve(fn()).finally(() => {\n if (typeof isStop !== \"function\") {\n watcher.off();\n resolve(ops);\n }\n });\n });\n },\n };\n };\n}\ndeclare module \"autostore\" {\n export interface AutoStore<State extends Dict, Options = unknown> {\n trace(fn: () => any, operates?: WatchListenerOptions[\"operates\"]): StateTracker;\n }\n}\ninstallPlugin(trace);\n"]}
package/package.json CHANGED
@@ -1,50 +1,52 @@
1
1
  {
2
- "name": "@autostorejs/plugins",
3
- "type": "module",
4
- "version": "4.3.0",
5
- "module": "src/index.ts",
6
- "publishConfig": {
7
- "access": "public"
2
+ "name": "@autostorejs/plugins",
3
+ "type": "module",
4
+ "version": "4.3.2",
5
+ "module": "src/index.ts",
6
+ "access": "public",
7
+ "repository": {
8
+ "type": "git",
9
+ "url": "git+https://github.com/zhangfisher/autostore.git"
10
+ },
11
+ "files": [
12
+ "dist"
13
+ ],
14
+ "exports": {
15
+ ".": {
16
+ "types": "./dist/index.d.ts",
17
+ "import": "./dist/index.js",
18
+ "require": "./dist/index.cjs"
8
19
  },
9
- "files": [
10
- "dist"
11
- ],
12
- "exports": {
13
- ".": {
14
- "types": "./dist/index.d.ts",
15
- "import": "./dist/index.js",
16
- "require": "./dist/index.cjs"
17
- },
18
- "./asyncpro": {
19
- "types": "./dist/asyncpro.d.ts",
20
- "import": "./dist/asyncpro.js",
21
- "require": "./dist/asyncpro.cjs"
22
- },
23
- "./shadow": {
24
- "types": "./dist/shadow.d.ts",
25
- "import": "./dist/shadow.js",
26
- "require": "./dist/shadow.cjs"
27
- },
28
- "./trace": {
29
- "types": "./dist/trace.d.ts",
30
- "import": "./dist/trace.js",
31
- "require": "./dist/trace.cjs"
32
- }
20
+ "./asyncpro": {
21
+ "types": "./dist/asyncpro.d.ts",
22
+ "import": "./dist/asyncpro.js",
23
+ "require": "./dist/asyncpro.cjs"
33
24
  },
34
- "scripts": {
35
- "build": "tsup"
25
+ "./shadow": {
26
+ "types": "./dist/shadow.d.ts",
27
+ "import": "./dist/shadow.js",
28
+ "require": "./dist/shadow.cjs"
36
29
  },
37
- "dependencies": {
38
- "autostore": "workspace:*",
39
- "flex-tools": "^1.6.6"
40
- },
41
- "devDependencies": {
42
- "@swc/core": "^1.15.46",
43
- "@type-challenges/utils": "^0.1.1",
44
- "@types/bun": "latest",
45
- "tsup": "^8.5.1"
46
- },
47
- "peerDependencies": {
48
- "typescript": "^5"
30
+ "./trace": {
31
+ "types": "./dist/trace.d.ts",
32
+ "import": "./dist/trace.js",
33
+ "require": "./dist/trace.cjs"
49
34
  }
50
- }
35
+ },
36
+ "scripts": {
37
+ "build": "tsup"
38
+ },
39
+ "dependencies": {
40
+ "autostore": "^4.3.2",
41
+ "flex-tools": "^1.6.6"
42
+ },
43
+ "devDependencies": {
44
+ "@swc/core": "^1.15.46",
45
+ "@type-challenges/utils": "^0.1.1",
46
+ "@types/bun": "latest",
47
+ "tsup": "^8.5.1"
48
+ },
49
+ "peerDependencies": {
50
+ "typescript": "^5"
51
+ }
52
+ }