fractostate 4.5.0 → 4.7.0

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.
Files changed (40) hide show
  1. package/dist/cjs/index.js +36 -16
  2. package/dist/cjs/index.js.map +1 -1
  3. package/dist/cjs/src/plugins/mods/persist.js +1 -2
  4. package/dist/cjs/src/plugins/mods/persist.js.map +1 -1
  5. package/dist/cjs/src/plugins/storage/StorageAdapter.js +61 -13
  6. package/dist/cjs/src/plugins/storage/StorageAdapter.js.map +1 -1
  7. package/dist/cjs/src/proxy.js.map +1 -1
  8. package/dist/cjs/src/store.js +34 -30
  9. package/dist/cjs/src/store.js.map +1 -1
  10. package/dist/esm/index.js +36 -16
  11. package/dist/esm/index.js.map +1 -1
  12. package/dist/esm/src/plugins/mods/persist.js +1 -2
  13. package/dist/esm/src/plugins/mods/persist.js.map +1 -1
  14. package/dist/esm/src/plugins/storage/StorageAdapter.js +61 -13
  15. package/dist/esm/src/plugins/storage/StorageAdapter.js.map +1 -1
  16. package/dist/esm/src/proxy.js.map +1 -1
  17. package/dist/esm/src/store.js +34 -30
  18. package/dist/esm/src/store.js.map +1 -1
  19. package/dist/index.d.ts +13 -10
  20. package/dist/plugins.d.ts +5 -3
  21. package/dist/{types-dU51pXGw.d.ts → types-4LME7oGG.d.ts} +18 -5
  22. package/dist/types-8kp16WTu.d.ts +206 -0
  23. package/dist/{types-CN9iqe-Q.d.ts → types-B8PKsJu0.d.ts} +3 -2
  24. package/dist/{types-CHVmLPlS.d.ts → types-C0NWkZo2.d.ts} +1 -0
  25. package/dist/{types-Du0Lv_Ij.d.ts → types-DVfC_yXR.d.ts} +3 -2
  26. package/dist/types-w9Mg5qmL.d.ts +203 -0
  27. package/package.json +2 -2
  28. package/dist/cjs/src/devtools/DevToolsFlow.js +0 -76
  29. package/dist/cjs/src/devtools/DevToolsFlow.js.map +0 -1
  30. package/dist/esm/src/devtools/DevToolsFlow.js +0 -74
  31. package/dist/esm/src/devtools/DevToolsFlow.js.map +0 -1
  32. package/dist/types-4Less-Sm.d.ts +0 -166
  33. package/dist/types-BGbbVpKy.d.ts +0 -176
  34. package/dist/types-B_uh22Cx.d.ts +0 -181
  35. package/dist/types-BlOtjIyh.d.ts +0 -176
  36. package/dist/types-C9aLynPD.d.ts +0 -176
  37. package/dist/types-Cazb5ndN.d.ts +0 -177
  38. package/dist/types-DIGkYYhy.d.ts +0 -167
  39. package/dist/types-f-XQRW_R.d.ts +0 -159
  40. package/dist/types-sg0rN5WO.d.ts +0 -172
package/dist/cjs/index.js CHANGED
@@ -76,22 +76,32 @@ function getFlow(def) {
76
76
  get state() {
77
77
  return store.store.get(key, initial);
78
78
  },
79
+ };
80
+ const actions = def?.options?.actions || flowOptions?.actions;
81
+ const actionOps = {
82
+ get self() {
83
+ return defaultOps.self;
84
+ },
85
+ get state() {
86
+ return defaultOps.state;
87
+ },
79
88
  get ctx() {
80
- if (!flowOptions?.ctx)
89
+ const ctxGen = actions?.__ctx__;
90
+ if (!ctxGen)
81
91
  return undefined;
82
- return flowOptions.ctx({
83
- get state() {
84
- return store.store.get(key, initial);
85
- },
86
- initialState: initial,
92
+ return ctxGen({
93
+ state: store.store.get(key, initial),
94
+ initialState: store.store.getInitial(key) ?? initial,
87
95
  actions: boundActions,
96
+ ops: defaultOps,
88
97
  });
89
98
  },
90
99
  };
91
- const actions = def?.options?.actions || flowOptions?.actions;
92
100
  if (actions) {
93
101
  for (const [name, fn] of Object.entries(actions)) {
94
- boundActions[name] = (...args) => fn(...args)(defaultOps);
102
+ if (name === "__ctx__")
103
+ continue;
104
+ boundActions[name] = (...args) => fn(...args)(actionOps);
95
105
  }
96
106
  }
97
107
  const toolbox = {
@@ -168,22 +178,32 @@ function useFlow(keyOrDef, initial, options) {
168
178
  get state() {
169
179
  return store.store.get(key, initialVal);
170
180
  },
181
+ };
182
+ const actions = keyOrDef?.options?.actions || flowOptions?.actions;
183
+ const actionOps = {
184
+ get self() {
185
+ return defaultOps.self;
186
+ },
187
+ get state() {
188
+ return defaultOps.state;
189
+ },
171
190
  get ctx() {
172
- if (!flowOptions?.ctx)
191
+ const ctxGen = actions?.__ctx__;
192
+ if (!ctxGen)
173
193
  return undefined;
174
- return flowOptions.ctx({
175
- get state() {
176
- return store.store.get(key, initialVal);
177
- },
178
- initialState: initialVal,
194
+ return ctxGen({
195
+ state: store.store.get(key, initialVal),
196
+ initialState: store.store.getInitial(key) ?? initialVal,
179
197
  actions: boundActions,
198
+ ops: defaultOps,
180
199
  });
181
200
  },
182
201
  };
183
- const actions = keyOrDef?.options?.actions || flowOptions?.actions;
184
202
  if (actions) {
185
203
  for (const [name, fn] of Object.entries(actions)) {
186
- boundActions[name] = (...args) => fn(...args)(defaultOps);
204
+ if (name === "__ctx__")
205
+ continue;
206
+ boundActions[name] = (...args) => fn(...args)(actionOps);
187
207
  }
188
208
  }
189
209
  return {
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../../src/index.ts"],"sourcesContent":["/* *****************************************************************************\n * FractoSate\n *\n * ACCESS RESTRICTIONS:\n * - This software is exclusively for use by Authorized Personnel of NEHONIX\n * - Intended for Internal Use only within NEHONIX operations\n * - No rights granted to unauthorized individuals or entities\n * - All modifications are works made for hire assigned to NEHONIX\n *\n * PROHIBITED ACTIVITIES:\n * - Copying, distributing, or sublicensing without written permission\n * - Reverse engineering, decompiling, or disassembling\n * - Creating derivative works without explicit authorization\n * - External use or commercial distribution outside NEHONIX\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n *\n * For questions or permissions, contact:\n * NEHONIX Legal Department\n * Email: legal@nehonix.com\n * Website: www.nehonix.com\n ***************************************************************************** */\n\nimport { useState, useEffect, useMemo } from \"react\";\nimport type {\n FlowOperations,\n FlowContext,\n ActionOpsObject,\n FlowDefinition,\n DerivedFlowDefinition,\n FlowOptions,\n UseFlowOptions,\n} from \"./types\";\nimport { store } from \"./store\";\nimport { createDeepProxy } from \"./proxy\";\n\n// Connect proxy creator to store for internal effects\nstore.setProxyCreator(createDeepProxy);\n\nexport * from \"./types\";\n\n/**\n * Manually initializes a flow to ensure its effects run immediately.\n * This is useful for flows that need to start working before any component subscribes to them.\n */\nexport function initFlow<T, A>(flow: FlowDefinition<T, A>) {\n store.get(flow.key, flow.initial, flow.options);\n}\n\n/**\n * Defines a derived flow that reacts to changes in a source flow.\n * Use this for computed values that shouldn't be manually modified.\n */\nexport function defineDerived<T, R>(\n source: FlowDefinition<T, any>,\n selector: (state: T) => R,\n derivedKey?: string,\n): DerivedFlowDefinition<T, R> {\n const key = derivedKey || `${source.key}_derived_${Date.now()}`;\n store.setParent(key, source.key);\n return {\n key,\n source,\n selector,\n };\n}\n\nexport function defineFlow<T, A extends Record<string, any>, C = undefined>(\n key: string,\n initial: T,\n options: {\n actions: {\n [K in keyof A]: (\n ...args: any[]\n ) => (ops: ActionOpsObject<T, A, C>) => any;\n };\n ctx?: (context: FlowContext<T, A>) => C;\n } & Omit<FlowOptions<NoInfer<T>, NoInfer<A>, NoInfer<C>>, \"actions\" | \"ctx\">,\n): FlowDefinition<T, A, C>;\nexport function defineFlow<T>(\n key: string,\n initial: T,\n options?: FlowOptions<NoInfer<T>, {}, any>,\n): FlowDefinition<T, {}, any>;\nexport function defineFlow<T, A, C = any>(\n key: string,\n initial: T,\n options?: FlowOptions<T, A, C> & { actions?: A },\n): FlowDefinition<T, A, C> {\n return { key, initial, options: options as any };\n}\n\n/**\n * Non-hook version of useFlow.\n * Useful for accessing and interacting with flows outside React components (e.g., axios interceptors).\n */\nexport function getFlow<T, A, C>(\n def: FlowDefinition<T, A, C>,\n): [T, FlowOperations<T, A>] {\n const { key, initial, options: flowOptions } = def;\n const state = store.get(key, initial, flowOptions);\n\n const boundActions = {} as any;\n const defaultOps: ActionOpsObject<T, A, any> = {\n get self() {\n return createDeepProxy<T, A>(key, [], store.get(key, initial), {\n ...flowOptions,\n actions: boundActions,\n actor: flowOptions?.actor,\n });\n },\n get state() {\n return store.get(key, initial);\n },\n get ctx() {\n if (!flowOptions?.ctx) return undefined;\n return flowOptions.ctx({\n get state() {\n return store.get(key, initial);\n },\n initialState: initial,\n actions: boundActions,\n });\n },\n };\n\n const actions = (def as any)?.options?.actions || flowOptions?.actions;\n\n if (actions) {\n for (const [name, fn] of Object.entries(actions)) {\n boundActions[name] = (...args: any[]) =>\n (fn as Function)(...args)(defaultOps);\n }\n }\n\n const toolbox: FlowOperations<T, A> = {\n ops: defaultOps,\n actions: boundActions,\n _undo: () => store.undo(key),\n _redo: () => store.redo(key),\n history: store.getHistory(key),\n _canUndo: store.getHistory(key).length > 1,\n _canRedo: store.getRedoStack(key).length > 0,\n _set: (val: any) => {\n const next = typeof val === \"function\" ? val(store.get(key)) : val;\n store.set(key, next, {\n ...flowOptions,\n force: true,\n actor: flowOptions?.actor,\n });\n },\n _patch: (val: any) => {\n const next = typeof val === \"function\" ? val(store.get(key)) : val;\n store.set(key, next, {\n ...flowOptions,\n force: false,\n actor: flowOptions?.actor,\n });\n },\n _reset: () => store.reset(key),\n cf: flowOptions || {},\n isHydrating: !!store.__hydrating__?.has(key),\n };\n\n return [state, toolbox];\n}\n\n/**\n * Main hook to consume and interact with a FractoState flow.\n * Returns a tuple containing the current [State, Toolbox].\n */\nexport function useFlow<K extends string, T = any>(\n key: K,\n initial?: T,\n options?: UseFlowOptions<T>,\n): [T, FlowOperations<T, {}>];\n\nexport function useFlow<T, A, C>(\n def: FlowDefinition<T, A, C>,\n options?: UseFlowOptions<T>,\n): [T, FlowOperations<T, A>];\n\nexport function useFlow<T, R>(def: DerivedFlowDefinition<T, R>): [R, {}];\n\nexport function useFlow(\n keyOrDef: any,\n initial?: any,\n options?: any,\n): [any, any] {\n const isDerived = typeof keyOrDef === \"object\" && \"selector\" in keyOrDef;\n const isDef = typeof keyOrDef === \"object\" && \"key\" in keyOrDef && !isDerived;\n\n const key = isDef\n ? (keyOrDef as any).key\n : isDerived\n ? (keyOrDef as any).source.key\n : (keyOrDef as string);\n const initialVal = isDef\n ? (keyOrDef as any).initial\n : isDerived\n ? (keyOrDef as any).source.initial\n : initial;\n const flowOptions = isDef\n ? { ...((keyOrDef as any).options || {}), ...(initial || {}) }\n : isDerived\n ? (keyOrDef as any).source.options\n : options;\n\n const [state, setState] = useState(() => {\n const raw = store.get(key, initialVal, flowOptions);\n return isDerived ? (keyOrDef as any).selector(raw) : raw;\n });\n\n useEffect(() => {\n const label = flowOptions?.name || flowOptions?.actor || `useFlow(${key})`;\n return store.subscribe(\n key,\n () => {\n const raw = store.get(key, initialVal);\n setState(isDerived ? (keyOrDef as any).selector(raw) : raw);\n },\n { label },\n );\n }, [key, isDerived, flowOptions?.name, flowOptions?.actor]);\n\n const toolbox = useMemo(() => {\n if (isDerived) return {};\n\n const boundActions = {} as any;\n const defaultOps: ActionOpsObject<any, any, any> = {\n get self() {\n return createDeepProxy<any, any>(key, [], store.get(key, initialVal), {\n ...flowOptions,\n actions: boundActions,\n actor: flowOptions?.name || flowOptions?.actor,\n });\n },\n get state() {\n return store.get(key, initialVal);\n },\n get ctx() {\n if (!flowOptions?.ctx) return undefined;\n return flowOptions.ctx({\n get state() {\n return store.get(key, initialVal);\n },\n initialState: initialVal,\n actions: boundActions,\n });\n },\n };\n\n const actions = (keyOrDef as any)?.options?.actions || flowOptions?.actions;\n\n if (actions) {\n for (const [name, fn] of Object.entries(actions)) {\n boundActions[name] = (...args: any[]) =>\n (fn as Function)(...args)(defaultOps);\n }\n }\n\n return {\n ops: defaultOps,\n actions: boundActions,\n _undo: () => store.undo(key),\n _redo: () => store.redo(key),\n history: store.getHistory(key),\n _canUndo: store.getHistory(key).length > 1,\n _canRedo: store.getRedoStack(key).length > 0,\n _set: (val: any) => {\n const next = typeof val === \"function\" ? val(store.get(key)) : val;\n store.set(key, next, {\n ...flowOptions,\n force: true,\n actor: flowOptions?.name || flowOptions?.actor,\n });\n },\n _patch: (val: any) => {\n const next = typeof val === \"function\" ? val(store.get(key)) : val;\n store.set(key, next, {\n ...flowOptions,\n force: false,\n actor: flowOptions?.name || flowOptions?.actor,\n });\n },\n _reset: () => store.reset(key),\n cf: flowOptions || {},\n isHydrating: !!store.__hydrating__?.has(key),\n };\n }, [key, isDerived, state, flowOptions]);\n\n return [state, toolbox] as any;\n}\n"],"names":["store","createDeepProxy","useState","useEffect","useMemo"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sources":["../../src/index.ts"],"sourcesContent":["/* *****************************************************************************\n * FractoSate\n *\n * ACCESS RESTRICTIONS:\n * - This software is exclusively for use by Authorized Personnel of NEHONIX\n * - Intended for Internal Use only within NEHONIX operations\n * - No rights granted to unauthorized individuals or entities\n * - All modifications are works made for hire assigned to NEHONIX\n *\n * PROHIBITED ACTIVITIES:\n * - Copying, distributing, or sublicensing without written permission\n * - Reverse engineering, decompiling, or disassembling\n * - Creating derivative works without explicit authorization\n * - External use or commercial distribution outside NEHONIX\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n *\n * For questions or permissions, contact:\n * NEHONIX Legal Department\n * Email: legal@nehonix.com\n * Website: www.nehonix.com\n ***************************************************************************** */\n\nimport { useState, useEffect, useMemo } from \"react\";\nimport type {\n FlowOperations,\n FlowDefinition,\n DerivedFlowDefinition,\n FlowOptions,\n UseFlowOptions,\n FlowOpsObject,\n ActionOpsObject,\n ContextGetterOps,\n} from \"./types\";\nimport { store } from \"./store\";\nimport { createDeepProxy } from \"./proxy\";\n\n// Connect proxy creator to store for internal effects\nstore.setProxyCreator(createDeepProxy);\n\nexport * from \"./types\";\n\n/**\n * Manually initializes a flow to ensure its effects run immediately.\n * This is useful for flows that need to start working before any component subscribes to them.\n */\nexport function initFlow<T, A, C>(flow: FlowDefinition<T, A, C>) {\n store.get(flow.key, flow.initial, flow.options);\n}\n\n/**\n * Defines a derived flow that reacts to changes in a source flow.\n * Use this for computed values that shouldn't be manually modified.\n */\nexport function defineDerived<T, R>(\n source: FlowDefinition<T, any>,\n selector: (state: T) => R,\n derivedKey?: string,\n): DerivedFlowDefinition<T, R> {\n const key = derivedKey || `${source.key}_derived_${Date.now()}`;\n store.setParent(key, source.key);\n return {\n key,\n source,\n selector,\n };\n}\n\nexport function defineFlow<\n T,\n A extends Record<string, any>,\n C = A extends { __ctx__: (ops: ContextGetterOps<T, any>) => infer R }\n ? R\n : undefined,\n>(\n key: string,\n initial: T,\n options: FlowOptions<NoInfer<T>, any> & {\n actions: {\n __ctx__?: (c: ContextGetterOps<T, Record<string, any>>) => C;\n } & {\n [K in keyof A as K extends \"__ctx__\" ? never : K]: (\n ...args: any[]\n ) => (ops: ActionOpsObject<T, Record<string, any>, C>) => any;\n } & A;\n },\n): FlowDefinition<T, A, C>;\nexport function defineFlow<T>(\n key: string,\n initial: T,\n options?: FlowOptions<NoInfer<T>, {}>,\n): FlowDefinition<T, {}>;\nexport function defineFlow<T, A, C = undefined>(\n key: string,\n initial: T,\n options?: FlowOptions<T, A> & { actions?: A },\n): FlowDefinition<T, A, C> {\n return { key, initial, options: options as any };\n}\n\n/**\n * Non-hook version of useFlow.\n * Useful for accessing and interacting with flows outside React components (e.g., axios interceptors).\n */\nexport function getFlow<T, A, C>(\n def: FlowDefinition<T, A, C>,\n): [T, FlowOperations<T, A>] {\n const { key, initial, options: flowOptions } = def;\n const state = store.get(key, initial, flowOptions);\n\n const boundActions = {} as any;\n const defaultOps: FlowOpsObject<T, A> = {\n get self() {\n return createDeepProxy<T, A>(key, [], store.get(key, initial), {\n ...flowOptions,\n actions: boundActions,\n actor: flowOptions?.actor,\n });\n },\n get state() {\n return store.get(key, initial);\n },\n };\n\n const actions = (def as any)?.options?.actions || flowOptions?.actions;\n\n const actionOps: ActionOpsObject<T, A, any> = {\n get self() {\n return defaultOps.self;\n },\n get state() {\n return defaultOps.state;\n },\n get ctx() {\n const ctxGen = (actions as any)?.__ctx__;\n if (!ctxGen) return undefined;\n return ctxGen({\n state: store.get(key, initial),\n initialState: store.getInitial(key) ?? initial,\n actions: boundActions,\n ops: defaultOps,\n });\n },\n };\n\n if (actions) {\n for (const [name, fn] of Object.entries(actions)) {\n if (name === \"__ctx__\") continue;\n boundActions[name] = (...args: any[]) =>\n (fn as Function)(...args)(actionOps);\n }\n }\n\n const toolbox: FlowOperations<T, A> = {\n ops: defaultOps,\n actions: boundActions,\n _undo: () => store.undo(key),\n _redo: () => store.redo(key),\n history: store.getHistory(key),\n _canUndo: store.getHistory(key).length > 1,\n _canRedo: store.getRedoStack(key).length > 0,\n _set: (val: any) => {\n const next = typeof val === \"function\" ? val(store.get(key)) : val;\n store.set(key, next, {\n ...flowOptions,\n force: true,\n actor: flowOptions?.actor,\n });\n },\n _patch: (val: any) => {\n const next = typeof val === \"function\" ? val(store.get(key)) : val;\n store.set(key, next, {\n ...flowOptions,\n force: false,\n actor: flowOptions?.actor,\n });\n },\n _reset: () => store.reset(key),\n cf: flowOptions || {},\n isHydrating: !!store.__hydrating__?.has(key),\n };\n\n return [state, toolbox];\n}\n\n/**\n * Main hook to consume and interact with a FractoState flow.\n * Returns a tuple containing the current [State, Toolbox].\n */\nexport function useFlow<K extends string, T = any>(\n key: K,\n initial?: T,\n options?: UseFlowOptions<T>,\n): [T, FlowOperations<T, {}>];\n\nexport function useFlow<T, A, C>(\n def: FlowDefinition<T, A, C>,\n options?: UseFlowOptions<T>,\n): [T, FlowOperations<T, A>];\n\nexport function useFlow<T, R>(def: DerivedFlowDefinition<T, R>): [R, {}];\n\nexport function useFlow(\n keyOrDef: any,\n initial?: any,\n options?: any,\n): [any, any] {\n const isDerived = typeof keyOrDef === \"object\" && \"selector\" in keyOrDef;\n const isDef = typeof keyOrDef === \"object\" && \"key\" in keyOrDef && !isDerived;\n\n const key = isDef\n ? (keyOrDef as any).key\n : isDerived\n ? (keyOrDef as any).source.key\n : (keyOrDef as string);\n const initialVal = isDef\n ? (keyOrDef as any).initial\n : isDerived\n ? (keyOrDef as any).source.initial\n : initial;\n const flowOptions = isDef\n ? { ...((keyOrDef as any).options || {}), ...(initial || {}) }\n : isDerived\n ? (keyOrDef as any).source.options\n : options;\n\n const [state, setState] = useState(() => {\n const raw = store.get(key, initialVal, flowOptions);\n return isDerived ? (keyOrDef as any).selector(raw) : raw;\n });\n\n useEffect(() => {\n const label = flowOptions?.name || flowOptions?.actor || `useFlow(${key})`;\n return store.subscribe(\n key,\n () => {\n const raw = store.get(key, initialVal);\n setState(isDerived ? (keyOrDef as any).selector(raw) : raw);\n },\n { label },\n );\n }, [key, isDerived, flowOptions?.name, flowOptions?.actor]);\n\n const toolbox = useMemo(() => {\n if (isDerived) return {};\n\n const boundActions = {} as any;\n const defaultOps: FlowOpsObject<any, any> = {\n get self() {\n return createDeepProxy<any, any>(key, [], store.get(key, initialVal), {\n ...flowOptions,\n actions: boundActions,\n actor: flowOptions?.name || flowOptions?.actor,\n });\n },\n get state() {\n return store.get(key, initialVal);\n },\n };\n\n const actions = (keyOrDef as any)?.options?.actions || flowOptions?.actions;\n\n const actionOps: ActionOpsObject<any, any, any> = {\n get self() {\n return defaultOps.self;\n },\n get state() {\n return defaultOps.state;\n },\n get ctx() {\n const ctxGen = (actions as any)?.__ctx__;\n if (!ctxGen) return undefined;\n return ctxGen({\n state: store.get(key, initialVal),\n initialState: store.getInitial(key) ?? initialVal,\n actions: boundActions,\n ops: defaultOps,\n });\n },\n };\n\n if (actions) {\n for (const [name, fn] of Object.entries(actions)) {\n if (name === \"__ctx__\") continue;\n boundActions[name] = (...args: any[]) =>\n (fn as Function)(...args)(actionOps);\n }\n }\n\n return {\n ops: defaultOps,\n actions: boundActions,\n _undo: () => store.undo(key),\n _redo: () => store.redo(key),\n history: store.getHistory(key),\n _canUndo: store.getHistory(key).length > 1,\n _canRedo: store.getRedoStack(key).length > 0,\n _set: (val: any) => {\n const next = typeof val === \"function\" ? val(store.get(key)) : val;\n store.set(key, next, {\n ...flowOptions,\n force: true,\n actor: flowOptions?.name || flowOptions?.actor,\n });\n },\n _patch: (val: any) => {\n const next = typeof val === \"function\" ? val(store.get(key)) : val;\n store.set(key, next, {\n ...flowOptions,\n force: false,\n actor: flowOptions?.name || flowOptions?.actor,\n });\n },\n _reset: () => store.reset(key),\n cf: flowOptions || {},\n isHydrating: !!store.__hydrating__?.has(key),\n };\n }, [key, isDerived, state, flowOptions]);\n\n return [state, toolbox] as any;\n}\n"],"names":["store","createDeepProxy","useState","useEffect","useMemo"],"mappings":"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"}
@@ -7,9 +7,8 @@ var StorageAdapter = require('../storage/StorageAdapter.js');
7
7
  * Simple, fast, non-intrusive.
8
8
  */
9
9
  function persist(options = {}) {
10
- const type = options.storage || "indexedDB";
11
10
  const storage = new StorageAdapter.StorageAdapter();
12
- return storage.persist(options.key, type);
11
+ return storage.persist(options);
13
12
  }
14
13
 
15
14
  exports.persist = persist;
@@ -1 +1 @@
1
- {"version":3,"file":"persist.js","sources":["../../../../../src/plugins/mods/persist.ts"],"sourcesContent":["import type { FlowPlugin } from \"../../types\";\nimport { PersistOptions } from \"../types/pluginTypes\";\nimport { StorageAdapter } from \"../storage/StorageAdapter\";\n\n/**\n * Standard persistence plugin.\n * Simple, fast, non-intrusive.\n */\nexport function persist(options: PersistOptions = {}): FlowPlugin {\n const type = options.storage || \"indexedDB\";\n const storage = new StorageAdapter();\n return storage.persist(options.key, type);\n}\n"],"names":["StorageAdapter"],"mappings":";;;;AAIA;;;AAGG;AACG,SAAU,OAAO,CAAC,OAAA,GAA0B,EAAE,EAAA;AAClD,IAAA,MAAM,IAAI,GAAG,OAAO,CAAC,OAAO,IAAI,WAAW;AAC3C,IAAA,MAAM,OAAO,GAAG,IAAIA,6BAAc,EAAE;IACpC,OAAO,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,IAAI,CAAC;AAC3C;;;;"}
1
+ {"version":3,"file":"persist.js","sources":["../../../../../src/plugins/mods/persist.ts"],"sourcesContent":["import type { FlowPlugin } from \"../../types\";\nimport type { PersistOptions } from \"../types/pluginTypes\";\nimport { StorageAdapter } from \"../storage/StorageAdapter\";\n\n/**\n * Standard persistence plugin.\n * Simple, fast, non-intrusive.\n */\nexport function persist<T = any, A = any>(\n options: PersistOptions<T, A> = {},\n): FlowPlugin<T, A> {\n const storage = new StorageAdapter();\n return storage.persist(options);\n}\n"],"names":["StorageAdapter"],"mappings":";;;;AAIA;;;AAGG;AACG,SAAU,OAAO,CACrB,OAAA,GAAgC,EAAE,EAAA;AAElC,IAAA,MAAM,OAAO,GAAG,IAAIA,6BAAc,EAAE;AACpC,IAAA,OAAO,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC;AACjC;;;;"}
@@ -85,17 +85,47 @@ class StorageAdapter {
85
85
  deleteCookie(name) {
86
86
  this.setCookie(name, "", -1);
87
87
  }
88
- persist($key, type) {
89
- if (!type)
90
- throw new Error("No storage type provided");
88
+ persist(options) {
89
+ const { storage: type = "indexedDB", key: $key, restoreIf, saveIf, } = options;
90
+ const buildOps = (hkey, store, stateOverride, fallback) => {
91
+ let state = stateOverride !== undefined
92
+ ? stateOverride
93
+ : store.get(hkey, undefined, { bypassClone: true });
94
+ if (state === undefined)
95
+ state = fallback;
96
+ const flowOptions = store.getOptions(hkey) || {};
97
+ return {
98
+ get self() {
99
+ return store.proxyCreator?.(hkey, [], state, flowOptions);
100
+ },
101
+ state,
102
+ };
103
+ };
104
+ const shouldRestore = (hkey, store, initial) => {
105
+ if (restoreIf === undefined)
106
+ return true;
107
+ if (typeof restoreIf === "boolean")
108
+ return restoreIf;
109
+ return restoreIf(buildOps(hkey, store, undefined, initial));
110
+ };
111
+ const shouldSave = (hkey, store, next) => {
112
+ if (saveIf === undefined)
113
+ return true;
114
+ if (typeof saveIf === "boolean")
115
+ return saveIf;
116
+ return saveIf(buildOps(hkey, store, next));
117
+ };
91
118
  return {
92
119
  name: "persist",
93
- onHydrate: ({ key: hkey, store }) => {
120
+ onHydrate: ({ key: hkey, store, initial }) => {
94
121
  const storageKey = $key || `fracto_flow_${hkey}`;
122
+ if (!shouldRestore(hkey, store, initial)) {
123
+ return undefined;
124
+ }
95
125
  // Notify engine of async task
96
- store.__hydrating__?.add($key);
126
+ store.__hydrating__?.add(storageKey);
97
127
  const done = (val) => {
98
- store.__hydrating__?.delete($key);
128
+ store.__hydrating__?.delete(storageKey);
99
129
  if (val !== undefined) {
100
130
  store.logPluginActivity?.(hkey, {
101
131
  plugin: "persist",
@@ -119,6 +149,8 @@ class StorageAdapter {
119
149
  return done(raw ? JSON.parse(raw) : undefined);
120
150
  },
121
151
  onUpdate: ({ key: hkey, next, store }) => {
152
+ if (!shouldSave(hkey, store, next))
153
+ return;
122
154
  const storageKey = $key || `fracto_flow_${hkey}`;
123
155
  const json = JSON.stringify(next);
124
156
  if (type === "indexedDB") {
@@ -141,21 +173,37 @@ class StorageAdapter {
141
173
  getOps: ({ key: hkey, store }) => {
142
174
  const storageKey = $key || `fracto_flow_${hkey}`;
143
175
  return {
176
+ getData: async () => {
177
+ let data;
178
+ if (type === "indexedDB") {
179
+ const raw = await this.idbGet(storageKey);
180
+ data = raw ? JSON.parse(raw) : undefined;
181
+ }
182
+ else if (typeof window !== "undefined") {
183
+ const raw = type === "cookie"
184
+ ? this.getCookie(storageKey)
185
+ : window[type].getItem(storageKey);
186
+ data = raw ? JSON.parse(raw) : undefined;
187
+ }
188
+ return data;
189
+ },
144
190
  clear: () => {
145
191
  if (type === "indexedDB") {
146
- this.IDB_NAME &&
147
- this.getIDB().then((db) => {
148
- db.transaction(this.STORE_NAME, "readwrite")
149
- .objectStore(this.STORE_NAME)
150
- .delete(storageKey);
151
- });
192
+ this.getIDB().then((db) => {
193
+ db.transaction(this.STORE_NAME, "readwrite")
194
+ .objectStore(this.STORE_NAME)
195
+ .delete(storageKey);
196
+ });
152
197
  }
153
198
  else if (typeof window !== "undefined") {
154
199
  if (type === "cookie") {
155
200
  this.deleteCookie(storageKey);
156
201
  }
157
202
  else {
158
- window[type].removeItem(storageKey);
203
+ const storage = window[type];
204
+ if (storage && typeof storage.removeItem === "function") {
205
+ storage.removeItem(storageKey);
206
+ }
159
207
  }
160
208
  }
161
209
  store.logPluginActivity(hkey, {
@@ -1 +1 @@
1
- {"version":3,"file":"StorageAdapter.js","sources":["../../../../../src/plugins/storage/StorageAdapter.ts"],"sourcesContent":["/* *****************************************************************************\n * FractoSate\n *\n * ACCESS RESTRICTIONS:\n * - This software is exclusively for use by Authorized Personnel of NEHONIX\n * - Intended for Internal Use only within NEHONIX operations\n * - No rights granted to unauthorized individuals or entities\n * - All modifications are works made for hire assigned to NEHONIX\n *\n * PROHIBITED ACTIVITIES:\n * - Copying, distributing, or sublicensing without written permission\n * - Reverse engineering, decompiling, or disassembling\n * - Creating derivative works without explicit authorization\n * - External use or commercial distribution outside NEHONIX\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n *\n * For questions or permissions, contact:\n * NEHONIX Legal Department\n * Email: legal@nehonix.com\n * Website: www.nehonix.com\n ***************************************************************************** */\n\nimport { FlowPlugin } from \"../../types\";\nimport { PersistOptions } from \"../types/pluginTypes\";\n\nexport class StorageAdapter {\n private IDB_NAME = \"FractoVaultDB\";\n private STORE_NAME = \"kvp\"; // kvp = key_value_pairs\n\n private getIDB() {\n return new Promise<IDBDatabase>((resolve, reject) => {\n const request = indexedDB.open(this.IDB_NAME, 1);\n request.onupgradeneeded = () =>\n request.result.createObjectStore(this.STORE_NAME);\n request.onsuccess = () => resolve(request.result);\n request.onerror = () => reject(request.error);\n });\n }\n\n private async idbGet(key: string): Promise<any> {\n const db = await this.getIDB();\n return new Promise((resolve) => {\n const req = db\n .transaction(this.STORE_NAME)\n .objectStore(this.STORE_NAME)\n .get(key);\n req.onsuccess = () => resolve(req.result);\n req.onerror = () => resolve(null);\n });\n }\n\n private async idbSet(key: string, value: any): Promise<void> {\n const db = await this.getIDB();\n return new Promise((resolve) => {\n const req = db\n .transaction(this.STORE_NAME, \"readwrite\")\n .objectStore(this.STORE_NAME)\n .put(value, key);\n req.onsuccess = () => resolve();\n });\n }\n\n private setCookie(name: string, value: string, days = 7) {\n const expires = new Date(Date.now() + days * 864e5).toUTCString();\n document.cookie = `${name}=${encodeURIComponent(value)}; expires=${expires}; path=/`;\n }\n\n private getCookie(name: string) {\n return document.cookie.split(\"; \").reduce((r, v) => {\n const parts = v.split(\"=\");\n return parts[0] === name ? decodeURIComponent(parts[1]) : r;\n }, \"\");\n }\n\n private deleteCookie(name: string) {\n this.setCookie(name, \"\", -1);\n }\n\n public persist(\n $key: string | undefined,\n type: PersistOptions[\"storage\"],\n ): FlowPlugin {\n if (!type) throw new Error(\"No storage type provided\");\n\n return {\n name: \"persist\",\n onHydrate: ({ key: hkey, store }) => {\n const storageKey = $key || `fracto_flow_${hkey}`;\n\n // Notify engine of async task\n (store as any).__hydrating__?.add($key);\n\n const done = (val: any) => {\n (store as any).__hydrating__?.delete($key);\n if (val !== undefined) {\n (store as any).logPluginActivity?.(hkey, {\n plugin: \"persist\",\n action: \"hydrate\",\n description: `Auto-restored state from ${type}`,\n data: val,\n });\n }\n return val;\n };\n\n if (type === \"indexedDB\") {\n return this.idbGet(storageKey).then((data) =>\n done(data ? JSON.parse(data) : undefined),\n );\n }\n\n if (typeof window === \"undefined\") return done(undefined);\n\n if (type === \"cookie\") {\n const raw = this.getCookie(storageKey);\n return done(raw ? JSON.parse(raw) : undefined);\n }\n\n const raw = (window as any)[type].getItem(storageKey);\n return done(raw ? JSON.parse(raw) : undefined);\n },\n\n onUpdate: ({ key: hkey, next, store }) => {\n const storageKey = $key || `fracto_flow_${hkey}`;\n const json = JSON.stringify(next);\n\n if (type === \"indexedDB\") {\n this.idbSet(storageKey, json);\n } else if (typeof window !== \"undefined\") {\n if (type === \"cookie\") {\n this.setCookie(storageKey, json);\n } else {\n (window as any)[type].setItem(storageKey, json);\n }\n }\n\n (store as any).logPluginActivity?.(hkey, {\n plugin: \"persist\",\n action: \"auto-save\",\n description: `Automatically synced changes to ${type}`,\n });\n },\n\n getOps: ({ key: hkey, store }) => {\n const storageKey = $key || `fracto_flow_${hkey}`;\n return {\n clear: () => {\n if (type === \"indexedDB\") {\n this.IDB_NAME &&\n this.getIDB().then((db) => {\n db.transaction(this.STORE_NAME, \"readwrite\")\n .objectStore(this.STORE_NAME)\n .delete(storageKey);\n });\n } else if (typeof window !== \"undefined\") {\n if (type === \"cookie\") {\n this.deleteCookie(storageKey);\n } else {\n (window as any)[type].removeItem(storageKey);\n }\n }\n store.logPluginActivity(hkey, {\n plugin: \"persist\",\n action: \"clear\",\n description: `Cleared ${type} storage for key ${storageKey}`,\n });\n },\n update: () => {\n const current = store.get(hkey, undefined, { bypassClone: true });\n const json = JSON.stringify(current);\n if (type === \"indexedDB\") {\n this.idbSet(storageKey, json);\n } else if (typeof window !== \"undefined\") {\n if (type === \"cookie\") {\n this.setCookie(storageKey, json);\n } else {\n (window as any)[type].setItem(storageKey, json);\n }\n }\n store.logPluginActivity(hkey, {\n plugin: \"persist\",\n action: \"update\",\n description: `Manually pushed current state to ${type}`,\n data: current,\n });\n },\n refresh: async () => {\n let data: any;\n if (type === \"indexedDB\") {\n const raw = await this.idbGet(storageKey);\n data = raw ? JSON.parse(raw) : undefined;\n } else if (typeof window !== \"undefined\") {\n const raw =\n type === \"cookie\"\n ? this.getCookie(storageKey)\n : (window as any)[type].getItem(storageKey);\n data = raw ? JSON.parse(raw) : undefined;\n }\n if (data !== undefined) {\n store.set(hkey, data, { force: true, actor: \"persist_refresh\" });\n store.logPluginActivity(hkey, {\n plugin: \"persist\",\n action: \"refresh\",\n description: `Successfully restored state from ${type}`,\n data,\n });\n }\n },\n };\n },\n };\n }\n}\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"StorageAdapter.js","sources":["../../../../../src/plugins/storage/StorageAdapter.ts"],"sourcesContent":["/* *****************************************************************************\n * FractoSate\n *\n * ACCESS RESTRICTIONS:\n * - This software is exclusively for use by Authorized Personnel of NEHONIX\n * - Intended for Internal Use only within NEHONIX operations\n * - No rights granted to unauthorized individuals or entities\n * - All modifications are works made for hire assigned to NEHONIX\n *\n * PROHIBITED ACTIVITIES:\n * - Copying, distributing, or sublicensing without written permission\n * - Reverse engineering, decompiling, or disassembling\n * - Creating derivative works without explicit authorization\n * - External use or commercial distribution outside NEHONIX\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n *\n * For questions or permissions, contact:\n * NEHONIX Legal Department\n * Email: legal@nehonix.com\n * Website: www.nehonix.com\n ***************************************************************************** */\n\nimport type { FlowPlugin } from \"../../types\";\nimport type { PersistOptions } from \"../types/pluginTypes\";\n\nexport class StorageAdapter {\n private IDB_NAME = \"FractoVaultDB\";\n private STORE_NAME = \"kvp\"; // kvp = key_value_pairs\n\n private getIDB() {\n return new Promise<IDBDatabase>((resolve, reject) => {\n const request = indexedDB.open(this.IDB_NAME, 1);\n request.onupgradeneeded = () =>\n request.result.createObjectStore(this.STORE_NAME);\n request.onsuccess = () => resolve(request.result);\n request.onerror = () => reject(request.error);\n });\n }\n\n private async idbGet(key: string): Promise<any> {\n const db = await this.getIDB();\n return new Promise((resolve) => {\n const req = db\n .transaction(this.STORE_NAME)\n .objectStore(this.STORE_NAME)\n .get(key);\n req.onsuccess = () => resolve(req.result);\n req.onerror = () => resolve(null);\n });\n }\n\n private async idbSet(key: string, value: any): Promise<void> {\n const db = await this.getIDB();\n return new Promise((resolve) => {\n const req = db\n .transaction(this.STORE_NAME, \"readwrite\")\n .objectStore(this.STORE_NAME)\n .put(value, key);\n req.onsuccess = () => resolve();\n });\n }\n\n private setCookie(name: string, value: string, days = 7) {\n const expires = new Date(Date.now() + days * 864e5).toUTCString();\n document.cookie = `${name}=${encodeURIComponent(value)}; expires=${expires}; path=/`;\n }\n\n private getCookie(name: string) {\n return document.cookie.split(\"; \").reduce((r, v) => {\n const parts = v.split(\"=\");\n return parts[0] === name ? decodeURIComponent(parts[1]) : r;\n }, \"\");\n }\n\n private deleteCookie(name: string) {\n this.setCookie(name, \"\", -1);\n }\n\n public persist<T = any, A = any>(\n options: PersistOptions<T, A>,\n ): FlowPlugin<T, A> {\n const {\n storage: type = \"indexedDB\",\n key: $key,\n restoreIf,\n saveIf,\n } = options;\n\n const buildOps = (\n hkey: string,\n store: any,\n stateOverride?: any,\n fallback?: any,\n ) => {\n let state =\n stateOverride !== undefined\n ? stateOverride\n : store.get(hkey, undefined, { bypassClone: true });\n\n if (state === undefined) state = fallback;\n\n const flowOptions = store.getOptions(hkey) || {};\n return {\n get self() {\n return (store as any).proxyCreator?.(hkey, [], state, flowOptions);\n },\n state,\n };\n };\n\n const shouldRestore = (hkey: string, store: any, initial?: any) => {\n if (restoreIf === undefined) return true;\n if (typeof restoreIf === \"boolean\") return restoreIf;\n return restoreIf(buildOps(hkey, store, undefined, initial));\n };\n\n const shouldSave = (hkey: string, store: any, next?: any) => {\n if (saveIf === undefined) return true;\n if (typeof saveIf === \"boolean\") return saveIf;\n return saveIf(buildOps(hkey, store, next));\n };\n\n return {\n name: \"persist\",\n onHydrate: ({ key: hkey, store, initial }) => {\n const storageKey = $key || `fracto_flow_${hkey}`;\n\n if (!shouldRestore(hkey, store, initial)) {\n return undefined;\n }\n\n // Notify engine of async task\n (store as any).__hydrating__?.add(storageKey);\n\n const done = (val: any) => {\n (store as any).__hydrating__?.delete(storageKey);\n if (val !== undefined) {\n (store as any).logPluginActivity?.(hkey, {\n plugin: \"persist\",\n action: \"hydrate\",\n description: `Auto-restored state from ${type}`,\n data: val,\n });\n }\n return val;\n };\n\n if (type === \"indexedDB\") {\n return this.idbGet(storageKey).then((data) =>\n done(data ? JSON.parse(data) : undefined),\n );\n }\n\n if (typeof window === \"undefined\") return done(undefined);\n\n if (type === \"cookie\") {\n const raw = this.getCookie(storageKey);\n return done(raw ? JSON.parse(raw) : undefined);\n }\n\n const raw = (window as any)[type].getItem(storageKey);\n return done(raw ? JSON.parse(raw) : undefined);\n },\n\n onUpdate: ({ key: hkey, next, store }) => {\n if (!shouldSave(hkey, store, next)) return;\n\n const storageKey = $key || `fracto_flow_${hkey}`;\n const json = JSON.stringify(next);\n\n if (type === \"indexedDB\") {\n this.idbSet(storageKey, json);\n } else if (typeof window !== \"undefined\") {\n if (type === \"cookie\") {\n this.setCookie(storageKey, json);\n } else {\n (window as any)[type].setItem(storageKey, json);\n }\n }\n\n (store as any).logPluginActivity?.(hkey, {\n plugin: \"persist\",\n action: \"auto-save\",\n description: `Automatically synced changes to ${type}`,\n });\n },\n\n getOps: ({ key: hkey, store }) => {\n const storageKey = $key || `fracto_flow_${hkey}`;\n return {\n getData: async () => {\n let data: any;\n if (type === \"indexedDB\") {\n const raw = await this.idbGet(storageKey);\n data = raw ? JSON.parse(raw) : undefined;\n } else if (typeof window !== \"undefined\") {\n const raw =\n type === \"cookie\"\n ? this.getCookie(storageKey)\n : (window as any)[type].getItem(storageKey);\n data = raw ? JSON.parse(raw) : undefined;\n }\n return data;\n },\n clear: () => {\n if (type === \"indexedDB\") {\n this.getIDB().then((db) => {\n db.transaction(this.STORE_NAME, \"readwrite\")\n .objectStore(this.STORE_NAME)\n .delete(storageKey);\n });\n } else if (typeof window !== \"undefined\") {\n if (type === \"cookie\") {\n this.deleteCookie(storageKey);\n } else {\n const storage = (window as any)[type];\n if (storage && typeof storage.removeItem === \"function\") {\n storage.removeItem(storageKey);\n }\n }\n }\n store.logPluginActivity(hkey, {\n plugin: \"persist\",\n action: \"clear\",\n description: `Cleared ${type} storage for key ${storageKey}`,\n });\n },\n update: () => {\n const current = store.get(hkey, undefined, { bypassClone: true });\n const json = JSON.stringify(current);\n if (type === \"indexedDB\") {\n this.idbSet(storageKey, json);\n } else if (typeof window !== \"undefined\") {\n if (type === \"cookie\") {\n this.setCookie(storageKey, json);\n } else {\n (window as any)[type].setItem(storageKey, json);\n }\n }\n store.logPluginActivity(hkey, {\n plugin: \"persist\",\n action: \"update\",\n description: `Manually pushed current state to ${type}`,\n data: current,\n });\n },\n refresh: async () => {\n let data: any;\n if (type === \"indexedDB\") {\n const raw = await this.idbGet(storageKey);\n data = raw ? JSON.parse(raw) : undefined;\n } else if (typeof window !== \"undefined\") {\n const raw =\n type === \"cookie\"\n ? this.getCookie(storageKey)\n : (window as any)[type].getItem(storageKey);\n data = raw ? JSON.parse(raw) : undefined;\n }\n if (data !== undefined) {\n store.set(hkey, data, { force: true, actor: \"persist_refresh\" });\n store.logPluginActivity(hkey, {\n plugin: \"persist\",\n action: \"refresh\",\n description: `Successfully restored state from ${type}`,\n data,\n });\n }\n },\n };\n },\n };\n }\n}\n"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"proxy.js","sources":["../../../src/proxy.ts"],"sourcesContent":["/* *****************************************************************************\n * FractoSate\n *\n * ACCESS RESTRICTIONS:\n * - This software is exclusively for use by Authorized Personnel of NEHONIX\n * - Intended for Internal Use only within NEHONIX operations\n * - No rights granted to unauthorized individuals or entities\n * - All modifications are works made for hire assigned to NEHONIX\n *\n * PROHIBITED ACTIVITIES:\n * - Copying, distributing, or sublicensing without written permission\n * - Reverse engineering, decompiling, or disassembling\n * - Creating derivative works without explicit authorization\n * - External use or commercial distribution outside NEHONIX\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n *\n * For questions or permissions, contact:\n * NEHONIX Legal Department\n * Email: legal@nehonix.com\n * Website: www.nehonix.com\n ***************************************************************************** */\n\nimport type { FlowOptions, TypeAwareOps } from \"./types\";\nimport { store } from \"./store\";\n\n// Path cache to avoid repeated array allocations\nconst pathCache = new WeakMap<string[], Map<string, string[]>>();\n\nfunction getCachedPath(path: string[], prop: string): string[] {\n let cache = pathCache.get(path);\n if (!cache) {\n cache = new Map();\n pathCache.set(path, cache);\n }\n\n let cached = cache.get(prop);\n if (!cached) {\n cached = [...path, prop];\n cache.set(prop, cached);\n }\n return cached;\n}\n\n/**\n * Creates a deep proxy that provides type-specific atomic operations for a flow.\n * The proxy tracks its path within the state tree and maps access to specific update logic.\n *\n * Reduced allocations, cached operations\n */\nexport function createDeepProxy<T = any, A = any>(\n key: string,\n path: string[],\n currentVal: any,\n options: FlowOptions<any>,\n): TypeAwareOps<T, A> {\n // Pre-bind commit function to avoid recreation\n const commit = (\n val: any,\n forceful: boolean,\n skipEquality = false,\n op?: string,\n ) => {\n try {\n // INTERNAL OPTIMIZATION: We fetch the RAW current state from the vault\n // without cloning it. Since we are about to produce a new IMMUTABLE state\n // using setInPath (which does structural cloning), this is safe and\n // avoiding a full deepClone of the entire tree on every tiny action\n // results in 100x performance in loops.\n const currentState = store.get(key, undefined, { bypassClone: true });\n const newState = setInPath(currentState, path, val);\n store.set(key, newState, {\n ...options,\n force: forceful,\n skipEquality,\n _op: op || (options as any)._op || \"set\",\n _path: path,\n } as any);\n } catch (error) {\n console.error(\n `[FlowProxy] Commit error at path ${path.join(\".\")}:`,\n error,\n );\n throw error;\n }\n };\n\n // Pre-create update function\n const update = (val: any, op?: string) => {\n commit(val, false, true, op);\n };\n\n return new Proxy(() => {}, {\n get(_target: any, prop: any) {\n if (typeof prop === \"symbol\") return undefined;\n\n // --- Meta-Operations (Fast path) ---\n if (prop === \"_val\") return currentVal;\n if (prop === \"_set\")\n return (val: any) => {\n commit(val, true, false, \"_set\");\n };\n if (prop === \"_patch\")\n return (val: any) => {\n commit(val, false, false, \"_patch\");\n };\n if (prop === \"__actions__\") return (options as any).actions;\n\n // Handle plugin-provided operations (e.g., _persist)\n const pluginOps = store.getPluginOps(key, options);\n if (prop in pluginOps) return pluginOps[prop];\n\n // Type check once for this level\n const valType = typeof currentVal;\n const isArray = Array.isArray(currentVal);\n\n // --- Number Operations (Optimized with cached functions) ---\n if (valType === \"number\") {\n switch (prop) {\n case \"_increment\":\n return (amount = 1) => {\n const liveVal =\n path.length === 0\n ? store.get(key, undefined, { bypassClone: true })\n : getInPath(\n store.get(key, undefined, { bypassClone: true }),\n path,\n );\n update(liveVal + amount, \"_increment\");\n };\n case \"_decrement\":\n return (amount = 1) => {\n const liveVal =\n path.length === 0\n ? store.get(key, undefined, { bypassClone: true })\n : getInPath(\n store.get(key, undefined, { bypassClone: true }),\n path,\n );\n update(liveVal - amount, \"_decrement\");\n };\n case \"_add\":\n return (amount: number) => {\n const liveVal =\n path.length === 0\n ? store.get(key, undefined, { bypassClone: true })\n : getInPath(\n store.get(key, undefined, { bypassClone: true }),\n path,\n );\n update(liveVal + amount, \"_add\");\n };\n case \"_subtract\":\n return (amount: number) => {\n const liveVal =\n path.length === 0\n ? store.get(key, undefined, { bypassClone: true })\n : getInPath(\n store.get(key, undefined, { bypassClone: true }),\n path,\n );\n update(liveVal - amount, \"_subtract\");\n };\n case \"_multiply\":\n return (amount: number) => {\n const liveVal =\n path.length === 0\n ? store.get(key, undefined, { bypassClone: true })\n : getInPath(\n store.get(key, undefined, { bypassClone: true }),\n path,\n );\n update(liveVal * amount, \"_multiply\");\n };\n case \"_divide\":\n return (amount: number) => {\n if (amount === 0) throw new Error(\"[FlowProxy] Division by zero\");\n const liveVal =\n path.length === 0\n ? store.get(key, undefined, { bypassClone: true })\n : getInPath(\n store.get(key, undefined, { bypassClone: true }),\n path,\n );\n update(liveVal / amount, \"_divide\");\n };\n }\n }\n\n // --- Array Operations (Optimized with minimal allocations) ---\n if (isArray) {\n switch (prop) {\n case \"_push\":\n return (item: any) => {\n // Manual copy instead of spread for large arrays\n const len = currentVal.length;\n const newArr = new Array(len + 1);\n for (let i = 0; i < len; i++) newArr[i] = currentVal[i];\n newArr[len] = item;\n update(newArr, \"_push\");\n };\n case \"_pop\":\n return () => update(currentVal.slice(0, -1), \"_pop\");\n case \"_shift\":\n return () => update(currentVal.slice(1), \"_shift\");\n case \"_unshift\":\n return (item: any) => {\n // Manual copy for better performance\n const len = currentVal.length;\n const newArr = new Array(len + 1);\n newArr[0] = item;\n for (let i = 0; i < len; i++) newArr[i + 1] = currentVal[i];\n update(newArr, \"_unshift\");\n };\n case \"_filter\":\n return (fn: any) => update(currentVal.filter(fn), \"_filter\");\n case \"_map\":\n return (fn: any) => update(currentVal.map(fn), \"_map\");\n case \"_removeAt\":\n return (index: number) => {\n // Manual filter for single index\n const len = currentVal.length;\n const newArr = new Array(len - 1);\n let j = 0;\n for (let i = 0; i < len; i++) {\n if (i !== index) newArr[j++] = currentVal[i];\n }\n update(newArr, \"_removeAt\");\n };\n case \"_insertAt\":\n return (index: number, item: any) => {\n const len = currentVal.length;\n const newArr = new Array(len + 1);\n for (let i = 0; i < index; i++) newArr[i] = currentVal[i];\n newArr[index] = item;\n for (let i = index; i < len; i++) newArr[i + 1] = currentVal[i];\n update(newArr, \"_insertAt\");\n };\n }\n }\n\n // --- String Operations ---\n if (valType === \"string\") {\n switch (prop) {\n case \"_append\":\n return (str: string) => update(currentVal + str, \"_append\");\n case \"_prepend\":\n return (str: string) => update(str + currentVal, \"_prepend\");\n case \"_uppercase\":\n return () => update(currentVal.toUpperCase(), \"_uppercase\");\n case \"_lowercase\":\n return () => update(currentVal.toLowerCase(), \"_lowercase\");\n case \"_trim\":\n return () => update(currentVal.trim(), \"_trim\");\n }\n }\n\n // --- Boolean Operations ---\n if (valType === \"boolean\") {\n if (prop === \"_toggle\") {\n return () => update(!currentVal, \"_toggle\");\n }\n }\n\n // --- Object Operations ---\n if (currentVal !== null && valType === \"object\" && !isArray) {\n if (prop === \"_merge\") {\n return (obj: any) => {\n // Object.assign faster than spread for merge\n const merged = Object.assign({}, currentVal, obj);\n update(merged, \"_merge\");\n };\n }\n if (prop === \"_delete\") {\n return (keyToDel: string) => {\n // Only copy if key exists\n if (!(keyToDel in currentVal)) return;\n const keys = Object.keys(currentVal);\n const next: any = {};\n for (const k of keys) {\n if (k !== keyToDel) next[k] = currentVal[k];\n }\n update(next, \"_delete\");\n };\n }\n }\n\n // Recursive step: create a new proxy for the child property\n // Use cached path\n const nextVal =\n currentVal !== null && currentVal !== undefined\n ? currentVal[prop]\n : undefined;\n const newPath = getCachedPath(path, prop);\n return createDeepProxy(key, newPath, nextVal, options);\n },\n apply(_target, _thisArg, args) {\n if (typeof currentVal === \"function\") {\n return currentVal(...args);\n }\n console.warn(\n `[FlowProxy] Attempted to call a non-function value at path: ${path.join(\".\")}`,\n );\n },\n }) as unknown as TypeAwareOps<T>;\n}\n\n/**\n * Immutable update utility that sets a value at a specific path within an object/array.\n */\nexport function setInPath(obj: any, path: string[], value: any): any {\n return setInPathRecursive(obj, path, value, 0);\n}\n\nfunction setInPathRecursive(\n obj: any,\n path: string[],\n value: any,\n index: number,\n): any {\n if (index === path.length) return value;\n\n const head = path[index];\n\n if (Array.isArray(obj)) {\n const i = parseInt(head, 10);\n if (isNaN(i) || i < 0)\n throw new Error(`[FlowProxy] Invalid array index: ${head}`);\n\n const len = obj.length;\n const newArr = new Array(Math.max(len, i + 1));\n\n // Fast copy with check for modified index\n for (let j = 0; j < newArr.length; j++) {\n if (j === i) {\n newArr[j] = setInPathRecursive(obj[j], path, value, index + 1);\n } else {\n newArr[j] = j < len ? obj[j] : undefined;\n }\n }\n return newArr;\n }\n\n // Object path\n const currentObj = obj ?? {};\n const keys = Object.keys(currentObj);\n const result: any = {};\n\n for (let i = 0; i < keys.length; i++) {\n const key = keys[i];\n result[key] =\n key === head\n ? setInPathRecursive(currentObj[key], path, value, index + 1)\n : currentObj[key];\n }\n\n if (!(head in currentObj)) {\n result[head] = setInPathRecursive(undefined, path, value, index + 1);\n }\n\n return result;\n}\n\n/**\n * Access utility to get a value at a specific path.\n */\nfunction getInPath(obj: any, path: string[]): any {\n let current = obj;\n for (let i = 0; i < path.length; i++) {\n if (current === null || current === undefined) return undefined;\n current = current[path[i]];\n }\n return current;\n}\n"],"names":["store"],"mappings":"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"}
1
+ {"version":3,"file":"proxy.js","sources":["../../../src/proxy.ts"],"sourcesContent":["/* *****************************************************************************\n * FractoSate\n *\n * ACCESS RESTRICTIONS:\n * - This software is exclusively for use by Authorized Personnel of NEHONIX\n * - Intended for Internal Use only within NEHONIX operations\n * - No rights granted to unauthorized individuals or entities\n * - All modifications are works made for hire assigned to NEHONIX\n *\n * PROHIBITED ACTIVITIES:\n * - Copying, distributing, or sublicensing without written permission\n * - Reverse engineering, decompiling, or disassembling\n * - Creating derivative works without explicit authorization\n * - External use or commercial distribution outside NEHONIX\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n *\n * For questions or permissions, contact:\n * NEHONIX Legal Department\n * Email: legal@nehonix.com\n * Website: www.nehonix.com\n ***************************************************************************** */\n\nimport type { FlowOptions, TypeAwareOps } from \"./types\";\nimport { store } from \"./store\";\n\n// Path cache to avoid repeated array allocations\nconst pathCache = new WeakMap<string[], Map<string, string[]>>();\n\nfunction getCachedPath(path: string[], prop: string): string[] {\n let cache = pathCache.get(path);\n if (!cache) {\n cache = new Map();\n pathCache.set(path, cache);\n }\n\n let cached = cache.get(prop);\n if (!cached) {\n cached = [...path, prop];\n cache.set(prop, cached);\n }\n return cached;\n}\n\n/**\n * Creates a deep proxy that provides type-specific atomic operations for a flow.\n * The proxy tracks its path within the state tree and maps access to specific update logic.\n *\n * Reduced allocations, cached operations\n */\nexport function createDeepProxy<T = any, A = Record<string, any>>(\n key: string,\n path: string[],\n currentVal: any,\n options: FlowOptions<any>,\n): TypeAwareOps<T, A> {\n // Pre-bind commit function to avoid recreation\n const commit = (\n val: any,\n forceful: boolean,\n skipEquality = false,\n op?: string,\n ) => {\n try {\n // INTERNAL OPTIMIZATION: We fetch the RAW current state from the vault\n // without cloning it. Since we are about to produce a new IMMUTABLE state\n // using setInPath (which does structural cloning), this is safe and\n // avoiding a full deepClone of the entire tree on every tiny action\n // results in 100x performance in loops.\n const currentState = store.get(key, undefined, { bypassClone: true });\n const newState = setInPath(currentState, path, val);\n store.set(key, newState, {\n ...options,\n force: forceful,\n skipEquality,\n _op: op || (options as any)._op || \"set\",\n _path: path,\n } as any);\n } catch (error) {\n console.error(\n `[FlowProxy] Commit error at path ${path.join(\".\")}:`,\n error,\n );\n throw error;\n }\n };\n\n // Pre-create update function\n const update = (val: any, op?: string) => {\n commit(val, false, true, op);\n };\n\n return new Proxy(() => {}, {\n get(_target: any, prop: any) {\n if (typeof prop === \"symbol\") return undefined;\n\n // --- Meta-Operations (Fast path) ---\n if (prop === \"_val\") return currentVal;\n if (prop === \"_set\")\n return (val: any) => {\n commit(val, true, false, \"_set\");\n };\n if (prop === \"_patch\")\n return (val: any) => {\n commit(val, false, false, \"_patch\");\n };\n if (prop === \"__actions__\") return (options as any).actions;\n\n // Handle plugin-provided operations (e.g., _persist)\n const pluginOps = store.getPluginOps(key, options);\n if (prop in pluginOps) return pluginOps[prop];\n\n // Type check once for this level\n const valType = typeof currentVal;\n const isArray = Array.isArray(currentVal);\n\n // --- Number Operations (Optimized with cached functions) ---\n if (valType === \"number\") {\n switch (prop) {\n case \"_increment\":\n return (amount = 1) => {\n const liveVal =\n path.length === 0\n ? store.get(key, undefined, { bypassClone: true })\n : getInPath(\n store.get(key, undefined, { bypassClone: true }),\n path,\n );\n update(liveVal + amount, \"_increment\");\n };\n case \"_decrement\":\n return (amount = 1) => {\n const liveVal =\n path.length === 0\n ? store.get(key, undefined, { bypassClone: true })\n : getInPath(\n store.get(key, undefined, { bypassClone: true }),\n path,\n );\n update(liveVal - amount, \"_decrement\");\n };\n case \"_add\":\n return (amount: number) => {\n const liveVal =\n path.length === 0\n ? store.get(key, undefined, { bypassClone: true })\n : getInPath(\n store.get(key, undefined, { bypassClone: true }),\n path,\n );\n update(liveVal + amount, \"_add\");\n };\n case \"_subtract\":\n return (amount: number) => {\n const liveVal =\n path.length === 0\n ? store.get(key, undefined, { bypassClone: true })\n : getInPath(\n store.get(key, undefined, { bypassClone: true }),\n path,\n );\n update(liveVal - amount, \"_subtract\");\n };\n case \"_multiply\":\n return (amount: number) => {\n const liveVal =\n path.length === 0\n ? store.get(key, undefined, { bypassClone: true })\n : getInPath(\n store.get(key, undefined, { bypassClone: true }),\n path,\n );\n update(liveVal * amount, \"_multiply\");\n };\n case \"_divide\":\n return (amount: number) => {\n if (amount === 0) throw new Error(\"[FlowProxy] Division by zero\");\n const liveVal =\n path.length === 0\n ? store.get(key, undefined, { bypassClone: true })\n : getInPath(\n store.get(key, undefined, { bypassClone: true }),\n path,\n );\n update(liveVal / amount, \"_divide\");\n };\n }\n }\n\n // --- Array Operations (Optimized with minimal allocations) ---\n if (isArray) {\n switch (prop) {\n case \"_push\":\n return (item: any) => {\n // Manual copy instead of spread for large arrays\n const len = currentVal.length;\n const newArr = new Array(len + 1);\n for (let i = 0; i < len; i++) newArr[i] = currentVal[i];\n newArr[len] = item;\n update(newArr, \"_push\");\n };\n case \"_pop\":\n return () => update(currentVal.slice(0, -1), \"_pop\");\n case \"_shift\":\n return () => update(currentVal.slice(1), \"_shift\");\n case \"_unshift\":\n return (item: any) => {\n // Manual copy for better performance\n const len = currentVal.length;\n const newArr = new Array(len + 1);\n newArr[0] = item;\n for (let i = 0; i < len; i++) newArr[i + 1] = currentVal[i];\n update(newArr, \"_unshift\");\n };\n case \"_filter\":\n return (fn: any) => update(currentVal.filter(fn), \"_filter\");\n case \"_map\":\n return (fn: any) => update(currentVal.map(fn), \"_map\");\n case \"_removeAt\":\n return (index: number) => {\n // Manual filter for single index\n const len = currentVal.length;\n const newArr = new Array(len - 1);\n let j = 0;\n for (let i = 0; i < len; i++) {\n if (i !== index) newArr[j++] = currentVal[i];\n }\n update(newArr, \"_removeAt\");\n };\n case \"_insertAt\":\n return (index: number, item: any) => {\n const len = currentVal.length;\n const newArr = new Array(len + 1);\n for (let i = 0; i < index; i++) newArr[i] = currentVal[i];\n newArr[index] = item;\n for (let i = index; i < len; i++) newArr[i + 1] = currentVal[i];\n update(newArr, \"_insertAt\");\n };\n }\n }\n\n // --- String Operations ---\n if (valType === \"string\") {\n switch (prop) {\n case \"_append\":\n return (str: string) => update(currentVal + str, \"_append\");\n case \"_prepend\":\n return (str: string) => update(str + currentVal, \"_prepend\");\n case \"_uppercase\":\n return () => update(currentVal.toUpperCase(), \"_uppercase\");\n case \"_lowercase\":\n return () => update(currentVal.toLowerCase(), \"_lowercase\");\n case \"_trim\":\n return () => update(currentVal.trim(), \"_trim\");\n }\n }\n\n // --- Boolean Operations ---\n if (valType === \"boolean\") {\n if (prop === \"_toggle\") {\n return () => update(!currentVal, \"_toggle\");\n }\n }\n\n // --- Object Operations ---\n if (currentVal !== null && valType === \"object\" && !isArray) {\n if (prop === \"_merge\") {\n return (obj: any) => {\n // Object.assign faster than spread for merge\n const merged = Object.assign({}, currentVal, obj);\n update(merged, \"_merge\");\n };\n }\n if (prop === \"_delete\") {\n return (keyToDel: string) => {\n // Only copy if key exists\n if (!(keyToDel in currentVal)) return;\n const keys = Object.keys(currentVal);\n const next: any = {};\n for (const k of keys) {\n if (k !== keyToDel) next[k] = currentVal[k];\n }\n update(next, \"_delete\");\n };\n }\n }\n\n // Recursive step: create a new proxy for the child property\n // Use cached path\n const nextVal =\n currentVal !== null && currentVal !== undefined\n ? currentVal[prop]\n : undefined;\n const newPath = getCachedPath(path, prop);\n return createDeepProxy(key, newPath, nextVal, options);\n },\n apply(_target, _thisArg, args) {\n if (typeof currentVal === \"function\") {\n return currentVal(...args);\n }\n console.warn(\n `[FlowProxy] Attempted to call a non-function value at path: ${path.join(\".\")}`,\n );\n },\n }) as unknown as TypeAwareOps<T, A>;\n}\n\n/**\n * Immutable update utility that sets a value at a specific path within an object/array.\n */\nexport function setInPath(obj: any, path: string[], value: any): any {\n return setInPathRecursive(obj, path, value, 0);\n}\n\nfunction setInPathRecursive(\n obj: any,\n path: string[],\n value: any,\n index: number,\n): any {\n if (index === path.length) return value;\n\n const head = path[index];\n\n if (Array.isArray(obj)) {\n const i = parseInt(head, 10);\n if (isNaN(i) || i < 0)\n throw new Error(`[FlowProxy] Invalid array index: ${head}`);\n\n const len = obj.length;\n const newArr = new Array(Math.max(len, i + 1));\n\n // Fast copy with check for modified index\n for (let j = 0; j < newArr.length; j++) {\n if (j === i) {\n newArr[j] = setInPathRecursive(obj[j], path, value, index + 1);\n } else {\n newArr[j] = j < len ? obj[j] : undefined;\n }\n }\n return newArr;\n }\n\n // Object path\n const currentObj = obj ?? {};\n const keys = Object.keys(currentObj);\n const result: any = {};\n\n for (let i = 0; i < keys.length; i++) {\n const key = keys[i];\n result[key] =\n key === head\n ? setInPathRecursive(currentObj[key], path, value, index + 1)\n : currentObj[key];\n }\n\n if (!(head in currentObj)) {\n result[head] = setInPathRecursive(undefined, path, value, index + 1);\n }\n\n return result;\n}\n\n/**\n * Access utility to get a value at a specific path.\n */\nfunction getInPath(obj: any, path: string[]): any {\n let current = obj;\n for (let i = 0; i < path.length; i++) {\n if (current === null || current === undefined) return undefined;\n current = current[path[i]];\n }\n return current;\n}\n"],"names":["store"],"mappings":"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"}
@@ -60,6 +60,12 @@ class MemoryVault {
60
60
  getParent(key) {
61
61
  return this.parents.get(key);
62
62
  }
63
+ getInitial(key) {
64
+ return this.initialValues.get(key);
65
+ }
66
+ getOptions(key) {
67
+ return this.flowOptionsMap.get(key);
68
+ }
63
69
  constructor() {
64
70
  Object.defineProperty(this, "vault", {
65
71
  enumerable: true,
@@ -217,17 +223,34 @@ class MemoryVault {
217
223
  }
218
224
  if (initialValue === undefined)
219
225
  return undefined;
220
- // Save options for devtools
226
+ // Clone once and reuse
227
+ let startingValue = deepClone(initialValue);
228
+ // Initialize core structures BEFORE plugins run to handle re-entrancy
229
+ this.vault.set(key, startingValue);
230
+ this.initialValues.set(key, deepClone(startingValue));
231
+ if (options?.timeTravel) {
232
+ this.histories.set(key, new CircularBuffer(100, [startingValue]));
233
+ this.redoStacks.set(key, []);
234
+ }
235
+ // Save options for devtools early
221
236
  if (options) {
222
237
  this.flowOptionsMap.set(key, options);
223
238
  }
224
- // Clone once and reuse
225
- let startingValue = deepClone(initialValue);
239
+ // Plugin Hook: onInit
240
+ if (options?.plugins) {
241
+ for (const plugin of options.plugins) {
242
+ plugin.onInit?.({ key, initial: startingValue, store: this });
243
+ }
244
+ }
226
245
  // Plugin Hook: onHydrate
227
246
  if (options?.plugins) {
228
247
  for (const plugin of options.plugins) {
229
248
  if (plugin.onHydrate) {
230
- const hydrated = plugin.onHydrate({ key, store: this });
249
+ const hydrated = plugin.onHydrate({
250
+ key,
251
+ store: this,
252
+ initial: startingValue,
253
+ });
231
254
  if (hydrated !== undefined) {
232
255
  if (hydrated instanceof Promise) {
233
256
  hydrated.then((val) => {
@@ -237,6 +260,7 @@ class MemoryVault {
237
260
  }
238
261
  else {
239
262
  startingValue = hydrated;
263
+ this.vault.set(key, startingValue); // Keep vault in sync
240
264
  break;
241
265
  }
242
266
  }
@@ -244,18 +268,6 @@ class MemoryVault {
244
268
  }
245
269
  }
246
270
  this.vault.set(key, startingValue);
247
- this.initialValues.set(key, deepClone(startingValue));
248
- // Lazy initialization of history/redo
249
- if (options?.timeTravel) {
250
- this.histories.set(key, new CircularBuffer(100, [startingValue]));
251
- this.redoStacks.set(key, []);
252
- }
253
- // Plugin Hook: onInit
254
- if (options?.plugins) {
255
- for (const plugin of options.plugins) {
256
- plugin.onInit?.({ key, initial: startingValue, store: this });
257
- }
258
- }
259
271
  // Handle Auto-Run Effects
260
272
  if (options?.effects && this.proxyCreator) {
261
273
  const vaultInstance = this;
@@ -267,24 +279,16 @@ class MemoryVault {
267
279
  get state() {
268
280
  return vaultInstance.vault.get(key);
269
281
  },
270
- };
271
- const actionOps = {
272
- ...dynamicOps,
273
- get ctx() {
274
- if (!options.ctx)
275
- return undefined;
276
- return options.ctx({
277
- get state() {
278
- return vaultInstance.vault.get(key);
279
- },
280
- initialState: startingValue,
281
- actions: boundActions,
282
- });
282
+ get initialState() {
283
+ return vaultInstance.initialValues.get(key);
284
+ },
285
+ get actions() {
286
+ return boundActions;
283
287
  },
284
288
  };
285
289
  if (options.actions) {
286
290
  for (const [name, fn] of Object.entries(options.actions)) {
287
- boundActions[name] = (...args) => fn(...args)(actionOps);
291
+ boundActions[name] = (...args) => fn(...args)(dynamicOps);
288
292
  }
289
293
  }
290
294
  const effectStates = options.effects.map((effect) => {