@akashjs/runtime 0.1.10 → 0.1.11

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 (55) hide show
  1. package/dist/chunk-5PZHDZ6H.cjs +2 -0
  2. package/dist/chunk-5PZHDZ6H.cjs.map +1 -0
  3. package/dist/chunk-ABRPXTHE.js +2 -0
  4. package/dist/chunk-ABRPXTHE.js.map +1 -0
  5. package/dist/{chunk-IH54XQBC.cjs → chunk-AS2LLR6T.cjs} +2 -2
  6. package/dist/{chunk-IH54XQBC.cjs.map → chunk-AS2LLR6T.cjs.map} +1 -1
  7. package/dist/{chunk-ONEN7EMK.cjs → chunk-BXTEZJDO.cjs} +2 -2
  8. package/dist/{chunk-ONEN7EMK.cjs.map → chunk-BXTEZJDO.cjs.map} +1 -1
  9. package/dist/chunk-F2MANNOP.js +2 -0
  10. package/dist/chunk-F2MANNOP.js.map +1 -0
  11. package/dist/{chunk-PGZQFMX2.cjs → chunk-F57HJQAZ.cjs} +3 -3
  12. package/dist/{chunk-PGZQFMX2.cjs.map → chunk-F57HJQAZ.cjs.map} +1 -1
  13. package/dist/{chunk-TXBFQLNL.js → chunk-K7ZSZXEF.js} +3 -3
  14. package/dist/{chunk-TXBFQLNL.js.map → chunk-K7ZSZXEF.js.map} +1 -1
  15. package/dist/{chunk-IXRAKXD7.js → chunk-LAWZZ7JW.js} +2 -2
  16. package/dist/{chunk-IXRAKXD7.js.map → chunk-LAWZZ7JW.js.map} +1 -1
  17. package/dist/{chunk-FB3CM2UH.cjs → chunk-NG3F5KZG.cjs} +2 -2
  18. package/dist/{chunk-FB3CM2UH.cjs.map → chunk-NG3F5KZG.cjs.map} +1 -1
  19. package/dist/{chunk-6QGDKBPX.js → chunk-PQKI432Q.js} +3 -3
  20. package/dist/{chunk-6QGDKBPX.js.map → chunk-PQKI432Q.js.map} +1 -1
  21. package/dist/{chunk-6G3EALVL.js → chunk-S37V44GX.js} +2 -2
  22. package/dist/{chunk-6G3EALVL.js.map → chunk-S37V44GX.js.map} +1 -1
  23. package/dist/{chunk-VRPYKCVU.cjs → chunk-SZ3HD5NP.cjs} +3 -3
  24. package/dist/{chunk-VRPYKCVU.cjs.map → chunk-SZ3HD5NP.cjs.map} +1 -1
  25. package/dist/chunk-U6G4NYUT.cjs +2 -0
  26. package/dist/chunk-U6G4NYUT.cjs.map +1 -0
  27. package/dist/{chunk-UID3D5XB.js → chunk-VXWWYPWW.js} +2 -2
  28. package/dist/{chunk-UID3D5XB.js.map → chunk-VXWWYPWW.js.map} +1 -1
  29. package/dist/core.cjs +1 -1
  30. package/dist/core.js +1 -1
  31. package/dist/index.cjs +6 -6
  32. package/dist/index.js +1 -1
  33. package/dist/machine.cjs +1 -1
  34. package/dist/machine.js +1 -1
  35. package/dist/offline.cjs +1 -1
  36. package/dist/offline.js +1 -1
  37. package/dist/pwa.cjs +1 -1
  38. package/dist/pwa.js +1 -1
  39. package/dist/ssr.cjs +1 -1
  40. package/dist/ssr.js +1 -1
  41. package/dist/store.cjs +1 -1
  42. package/dist/store.js +1 -1
  43. package/dist/sync.cjs +1 -1
  44. package/dist/sync.js +1 -1
  45. package/dist/test.cjs +1 -1
  46. package/dist/test.js +1 -1
  47. package/package.json +1 -1
  48. package/dist/chunk-3Q7GK4DL.cjs +0 -2
  49. package/dist/chunk-3Q7GK4DL.cjs.map +0 -1
  50. package/dist/chunk-7R4T4V3T.cjs +0 -2
  51. package/dist/chunk-7R4T4V3T.cjs.map +0 -1
  52. package/dist/chunk-FX7RHVM5.js +0 -2
  53. package/dist/chunk-FX7RHVM5.js.map +0 -1
  54. package/dist/chunk-JKO64Z6H.js +0 -2
  55. package/dist/chunk-JKO64Z6H.js.map +0 -1
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/store.ts"],"names":["storeInstances","defineStore","id","definition","initialState","store","createStoreInstance","stateSignals","stateKeys","key","signal","getterComputeds","getterFn","computed","comp","actionFn","args","fresh","snapshot","subscribers","callback","clearStores"],"mappings":"mEA4EA,IAAMA,CAAAA,CAAiB,IAAI,GAAA,CAQpB,SAASC,EAKdC,CAAAA,CACAC,CAAAA,CACsB,CACtB,OAAO,IAAM,CAEX,GAAIH,CAAAA,CAAe,GAAA,CAAIE,CAAE,CAAA,CACvB,OAAOF,EAAe,GAAA,CAAIE,CAAE,CAAA,CAG9B,IAAME,CAAAA,CAAeD,CAAAA,CAAW,OAAM,CAChCE,CAAAA,CAAQC,EAAoBJ,CAAAA,CAAIE,CAAAA,CAAcD,CAAU,CAAA,CAC9D,OAAAH,CAAAA,CAAe,GAAA,CAAIE,CAAAA,CAAIG,CAAK,EACrBA,CACT,CACF,CAEA,SAASC,CAAAA,CAKPJ,CAAAA,CACAE,EACAD,CAAAA,CACgB,CAEhB,IAAMI,CAAAA,CAAgD,EAAC,CACjDC,EAAY,MAAA,CAAO,IAAA,CAAKJ,CAAY,CAAA,CAE1C,IAAA,IAAWK,KAAOD,CAAAA,CAChBD,CAAAA,CAAaE,CAAG,CAAA,CAAIC,mBAAAA,CAAON,CAAAA,CAAaK,CAAG,CAAC,CAAA,CAI9C,IAAME,CAAAA,CAA2D,EAAC,CAClE,GAAIR,CAAAA,CAAW,OAAA,CACb,IAAA,GAAW,CAACM,CAAAA,CAAKG,CAAQ,IAAK,MAAA,CAAO,OAAA,CAAQT,EAAW,OAAO,CAAA,CAC7DQ,EAAgBF,CAAG,CAAA,CAAII,mBAAAA,CAAS,IAC7BD,CAAAA,CAAsBL,CAAY,CACrC,CAAA,CAKJ,IAAMF,CAAAA,CAAa,CAAE,GAAA,CAAKH,CAAG,EAG7B,IAAA,IAAWO,CAAAA,IAAOD,CAAAA,CAChBH,CAAAA,CAAMI,CAAG,CAAA,CAAIF,EAAaE,CAAG,CAAA,CAI/B,OAAW,CAACA,CAAAA,CAAKK,CAAI,CAAA,GAAK,MAAA,CAAO,OAAA,CAAQH,CAAe,CAAA,CACtDN,CAAAA,CAAMI,CAAG,CAAA,CAAIK,CAAAA,CAIf,GAAIX,CAAAA,CAAW,OAAA,CACb,OAAW,CAACM,CAAAA,CAAKM,CAAQ,CAAA,GAAK,MAAA,CAAO,OAAA,CAAQZ,EAAW,OAAO,CAAA,CAC7DE,EAAMI,CAAG,CAAA,CAAI,IAAIO,CAAAA,GACdD,CAAAA,CAAsB,KAAA,CAAMV,CAAAA,CAAOW,CAAI,CAAA,CAK9CX,EAAM,MAAA,CAAS,IAAM,CACnB,IAAMY,CAAAA,CAAQd,CAAAA,CAAW,OAAM,CAC/B,IAAA,IAAWM,CAAAA,IAAOD,CAAAA,CAChBD,CAAAA,CAAaE,CAAG,EAAE,GAAA,CAAIQ,CAAAA,CAAMR,CAAc,CAAC,EAE/C,EAGAJ,CAAAA,CAAM,SAAA,CAAY,IAAS,CACzB,IAAMa,CAAAA,CAAoC,EAAC,CAC3C,IAAA,IAAWT,CAAAA,IAAOD,CAAAA,CAChBU,CAAAA,CAAST,CAAG,EAAIF,CAAAA,CAAaE,CAAG,CAAA,EAAE,CAEpC,OAAOS,CACT,EAGA,IAAMC,CAAAA,CAAc,IAAI,GAAA,CACxB,OAAAd,EAAM,UAAA,CAAce,CAAAA,GAClBD,CAAAA,CAAY,GAAA,CAAIC,CAAQ,CAAA,CACjB,IAAMD,CAAAA,CAAY,MAAA,CAAOC,CAAQ,CAAA,CAAA,CAGnCf,CACT,CAKO,SAASgB,CAAAA,EAAoB,CAClCrB,CAAAA,CAAe,KAAA,GACjB","file":"chunk-7R4T4V3T.cjs","sourcesContent":["/**\n * Global state management via defineStore().\n *\n * Stores are singleton signal containers that persist across\n * components. They provide shared state, computed getters,\n * and actions — no external library needed.\n *\n * ```ts\n * const useCounterStore = defineStore('counter', {\n * state: () => ({ count: 0, name: 'Counter' }),\n * getters: {\n * doubled: (state) => state.count() * 2,\n * },\n * actions: {\n * increment() { this.count.update(c => c + 1); },\n * reset() { this.count.set(0); },\n * },\n * });\n *\n * // In any component:\n * const store = useCounterStore();\n * store.count(); // 0\n * store.doubled(); // 0\n * store.increment();\n * store.count(); // 1\n * ```\n */\n\nimport { signal, computed } from './signals.js';\nimport type { Signal, ReadonlySignal } from './signals.js';\n\n// --- Types ---\n\ntype StateFactory<S> = () => S;\n\ntype Getters<S, G> = {\n [K in keyof G]: (state: SignalifiedState<S>) => G[K];\n};\n\ntype Actions<A> = {\n [K in keyof A]: A[K] extends (...args: infer P) => infer R\n ? (...args: P) => R\n : never;\n};\n\n/** Maps plain state values to signals */\ntype SignalifiedState<S> = {\n [K in keyof S]: Signal<S[K]>;\n};\n\n/** The store instance returned to consumers */\nexport type Store<S, G, A> = SignalifiedState<S> & {\n [K in keyof G]: ReadonlySignal<G[K]>;\n} & {\n [K in keyof A]: A[K] extends (...args: infer P) => infer R\n ? (...args: P) => R\n : never;\n} & {\n /** Reset all state to initial values */\n $reset(): void;\n /** Subscribe to all state changes */\n $subscribe(callback: (state: S) => void): () => void;\n /** Get a plain snapshot of current state */\n $snapshot(): S;\n /** Store ID */\n $id: string;\n};\n\nexport interface StoreDefinition<S, G, A> {\n state: StateFactory<S>;\n getters?: Getters<S, G>;\n actions?: A;\n}\n\n// --- Store registry (singleton) ---\n\nconst storeInstances = new Map<string, Store<any, any, any>>();\n\n// --- defineStore ---\n\n/**\n * Define a global store. Returns a composable function that\n * always returns the same store instance (singleton).\n */\nexport function defineStore<\n S extends Record<string, unknown>,\n G extends Record<string, unknown> = {},\n A extends Record<string, (...args: any[]) => any> = {},\n>(\n id: string,\n definition: StoreDefinition<S, G, A>,\n): () => Store<S, G, A> {\n return () => {\n // Return existing instance if already created\n if (storeInstances.has(id)) {\n return storeInstances.get(id) as Store<S, G, A>;\n }\n\n const initialState = definition.state();\n const store = createStoreInstance(id, initialState, definition);\n storeInstances.set(id, store);\n return store;\n };\n}\n\nfunction createStoreInstance<\n S extends Record<string, unknown>,\n G extends Record<string, unknown>,\n A extends Record<string, (...args: any[]) => any>,\n>(\n id: string,\n initialState: S,\n definition: StoreDefinition<S, G, A>,\n): Store<S, G, A> {\n // Create signals for each state property\n const stateSignals: Record<string, Signal<unknown>> = {};\n const stateKeys = Object.keys(initialState);\n\n for (const key of stateKeys) {\n stateSignals[key] = signal(initialState[key]);\n }\n\n // Create computed getters\n const getterComputeds: Record<string, ReadonlySignal<unknown>> = {};\n if (definition.getters) {\n for (const [key, getterFn] of Object.entries(definition.getters)) {\n getterComputeds[key] = computed(() =>\n (getterFn as Function)(stateSignals),\n );\n }\n }\n\n // Build the store object\n const store: any = { $id: id };\n\n // Add state signals\n for (const key of stateKeys) {\n store[key] = stateSignals[key];\n }\n\n // Add getters\n for (const [key, comp] of Object.entries(getterComputeds)) {\n store[key] = comp;\n }\n\n // Bind actions with `this` pointing to the full store (state + getters + actions)\n if (definition.actions) {\n for (const [key, actionFn] of Object.entries(definition.actions)) {\n store[key] = (...args: unknown[]) =>\n (actionFn as Function).apply(store, args);\n }\n }\n\n // $reset\n store.$reset = () => {\n const fresh = definition.state();\n for (const key of stateKeys) {\n stateSignals[key].set(fresh[key as keyof S]);\n }\n };\n\n // $snapshot\n store.$snapshot = (): S => {\n const snapshot: Record<string, unknown> = {};\n for (const key of stateKeys) {\n snapshot[key] = stateSignals[key]();\n }\n return snapshot as S;\n };\n\n // $subscribe\n const subscribers = new Set<(state: S) => void>();\n store.$subscribe = (callback: (state: S) => void): (() => void) => {\n subscribers.add(callback);\n return () => subscribers.delete(callback);\n };\n\n return store as Store<S, G, A>;\n}\n\n/**\n * Clear all store instances (useful for testing).\n */\nexport function clearStores(): void {\n storeInstances.clear();\n}\n"]}
@@ -1,2 +0,0 @@
1
- var r=new Set,c=new Set,i=false,f=0,a=false,b=1e3;function l(){if(i)return;i=true,a=false;let e=0;for(;(r.size>0||c.size>0)&&e<b;){if(e++,r.size>0){let u=[...r].sort(p);r.clear();for(let t of u)t.run();}if(c.size>0){let u=[...c].sort(p);c.clear();for(let t of u)t.run();}}e>=b&&console.error("[AkashJS] Effect flush limit reached. Possible circular dependency."),i=false;}function S(e){e.isRender?r.add(e):c.add(e),f===0&&!i&&!a&&(a=true,queueMicrotask(l));}function y(e){f++;try{e();}finally{f--,f===0&&l();}}function p(e,u){return (e.depth??0)-(u.depth??0)}function m(){l();}var s=null;function w(e,u){let t={value:e,subscribers:new Set,equals:u?.equals??Object.is},n=()=>(g(t),t.value);return n.set=o=>{t.equals(t.value,o)||(t.value=o,d(t));},n.update=o=>{n.set(o(t.value));},n.peek=()=>t.value,n}function k(e,u){let t={_tag:"computed",fn:e,value:void 0,state:1,subscribers:new Set,sources:new Set,equals:u?.equals??Object.is};return ()=>(s&&(t.subscribers.add(s),"sources"in s&&s.sources.add(t)),t.state!==0&&T(t),t.value)}function T(e){for(let t of e.sources)t.subscribers.delete(e);e.sources.clear();let u=s;s=e;try{let t=e.fn(),n=e.value===void 0||!e.equals(e.value,t);e.value=t,e.state=0,n&&d(e);}finally{s=u;}}function q(e,u){let t={_tag:"effect",fn:e,cleanup:null,sources:new Set,disposed:false,isRender:u?.render??false,run(){v(t);}};return v(t),()=>{t.disposed=true,h(t);for(let n of t.sources)n.subscribers.delete(t);t.sources.clear();}}function v(e){if(e.disposed)return;if(e.sources.size>0){let t=false;for(let n of e.sources)if("_tag"in n&&n._tag==="computed"){if(n.state===1){let o=n.value;T(n),n.equals(o,n.value)||(t=true);}}else t=true;if(!t)return}h(e);for(let t of e.sources)t.subscribers.delete(e);e.sources.clear();let u=s;s=e;try{let t=e.fn();typeof t=="function"&&(e.cleanup=t);}finally{s=u;}}function h(e){e.cleanup&&(e.cleanup(),e.cleanup=null);}function C(e){let u=s;s=null;try{return e()}finally{s=u;}}function g(e){s&&(e.subscribers.add(s),"sources"in s&&s.sources.add(e));}function d(e){for(let u of e.subscribers)u._tag==="computed"?(u.state=1,d(u)):u._tag==="effect"&&S(u);}export{y as a,m as b,w as c,k as d,q as e,C as f};//# sourceMappingURL=chunk-FX7RHVM5.js.map
2
- //# sourceMappingURL=chunk-FX7RHVM5.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/scheduler.ts","../src/signals.ts"],"names":["pendingRender","pendingUser","flushing","batchDepth","flushScheduled","MAX_FLUSH_ITERATIONS","flush","iterations","queue","byDepth","fx","scheduleEffect","batch","fn","a","b","flushSync","currentSubscriber","signal","initialValue","options","node","read","trackSubscriber","value","notifySubscribers","computed","recompute","source","prevSubscriber","newValue","changed","effect","runEffect","cleanupEffect","anyChanged","oldValue","result","untrack","prev","sub"],"mappings":"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","file":"chunk-FX7RHVM5.js","sourcesContent":["/**\n * Microtask-based effect scheduler with priority levels and deduplication.\n *\n * Render effects (DOM bindings) run before user effects to ensure\n * DOM is consistent before user-side effects execute.\n */\n\nexport interface ScheduledEffect {\n run(): void;\n isRender: boolean;\n /** Depth in the dependency graph (0 = root). Lower depth runs first. */\n depth?: number;\n}\n\nconst pendingRender = new Set<ScheduledEffect>();\nconst pendingUser = new Set<ScheduledEffect>();\nlet flushing = false;\nlet batchDepth = 0;\nlet flushScheduled = false;\n\nconst MAX_FLUSH_ITERATIONS = 1000;\n\nfunction flush(): void {\n if (flushing) return;\n flushing = true;\n flushScheduled = false;\n\n // Process render effects first, then user effects.\n // Effects may enqueue more effects during flush, so loop until empty.\n let iterations = 0;\n while ((pendingRender.size > 0 || pendingUser.size > 0) && iterations < MAX_FLUSH_ITERATIONS) {\n iterations++;\n\n // Drain render effects (sorted by depth — parents before children)\n if (pendingRender.size > 0) {\n const queue = [...pendingRender].sort(byDepth);\n pendingRender.clear();\n for (const fx of queue) {\n fx.run();\n }\n }\n\n // Drain user effects (sorted by depth)\n if (pendingUser.size > 0) {\n const queue = [...pendingUser].sort(byDepth);\n pendingUser.clear();\n for (const fx of queue) {\n fx.run();\n }\n }\n }\n\n if (iterations >= MAX_FLUSH_ITERATIONS) {\n console.error('[AkashJS] Effect flush limit reached. Possible circular dependency.');\n }\n\n flushing = false;\n}\n\nexport function scheduleEffect(fx: ScheduledEffect): void {\n if (fx.isRender) {\n pendingRender.add(fx);\n } else {\n pendingUser.add(fx);\n }\n\n if (batchDepth === 0 && !flushing && !flushScheduled) {\n flushScheduled = true;\n queueMicrotask(flush);\n }\n}\n\n/**\n * Batch multiple signal writes — subscribers are notified only once\n * at the end of the batch.\n */\nexport function batch(fn: () => void): void {\n batchDepth++;\n try {\n fn();\n } finally {\n batchDepth--;\n if (batchDepth === 0) {\n flush();\n }\n }\n}\n\n/** Sort effects by depth (lower depth first = parents before children) */\nfunction byDepth(a: ScheduledEffect, b: ScheduledEffect): number {\n return (a.depth ?? 0) - (b.depth ?? 0);\n}\n\n/** Synchronously flush all pending effects. Useful for testing. */\nexport function flushSync(): void {\n flush();\n}\n","/**\n * Fine-grained reactivity system.\n *\n * Inspired by SolidJS/Preact Signals. Provides signal(), computed(),\n * effect(), and untrack() primitives with automatic dependency tracking\n * and glitch-free diamond dependency resolution.\n */\n\nimport { scheduleEffect, type ScheduledEffect } from './scheduler.js';\n\n// --- Tracking scope ---\n\ntype Subscriber = EffectNode | ComputedNode<unknown>;\n\nlet currentSubscriber: Subscriber | null = null;\n\n// --- Signal ---\n\nexport interface Signal<T> {\n /** Read the current value (tracks dependency if inside a reactive scope) */\n (): T;\n /** Set a new value */\n set(value: T): void;\n /** Update the value using the previous value */\n update(fn: (prev: T) => T): void;\n /** Read without tracking (no dependency registered) */\n peek(): T;\n}\n\nexport type ReadonlySignal<T> = () => T;\n\ninterface SignalNode<T> {\n value: T;\n subscribers: Set<Subscriber>;\n equals: (a: T, b: T) => boolean;\n}\n\nexport function signal<T>(\n initialValue: T,\n options?: { equals?: (a: T, b: T) => boolean },\n): Signal<T> {\n const node: SignalNode<T> = {\n value: initialValue,\n subscribers: new Set(),\n equals: options?.equals ?? Object.is,\n };\n\n const read = (): T => {\n trackSubscriber(node);\n return node.value;\n };\n\n read.set = (value: T): void => {\n if (node.equals(node.value, value)) return;\n node.value = value;\n notifySubscribers(node);\n };\n\n read.update = (fn: (prev: T) => T): void => {\n read.set(fn(node.value));\n };\n\n read.peek = (): T => node.value;\n\n return read;\n}\n\n// --- Computed ---\n\nconst enum ComputedState {\n Clean = 0,\n Dirty = 1,\n}\n\ninterface ComputedNode<T> {\n _tag: 'computed';\n fn: () => T;\n value: T | undefined;\n state: ComputedState;\n subscribers: Set<Subscriber>;\n sources: Set<SignalNode<unknown> | ComputedNode<unknown>>;\n equals: (a: T, b: T) => boolean;\n}\n\nexport function computed<T>(\n fn: () => T,\n options?: { equals?: (a: T, b: T) => boolean },\n): ReadonlySignal<T> {\n const node: ComputedNode<T> = {\n _tag: 'computed',\n fn,\n value: undefined,\n state: ComputedState.Dirty,\n subscribers: new Set(),\n sources: new Set(),\n equals: options?.equals ?? Object.is,\n };\n\n const read = (): T => {\n // Track this computed as a dependency of the current subscriber\n if (currentSubscriber) {\n node.subscribers.add(currentSubscriber);\n if ('sources' in currentSubscriber) {\n currentSubscriber.sources.add(node);\n }\n }\n\n if (node.state !== ComputedState.Clean) {\n recompute(node);\n }\n\n return node.value as T;\n };\n\n return read;\n}\n\nfunction recompute<T>(node: ComputedNode<T>): void {\n // Clean up old source subscriptions\n for (const source of node.sources) {\n source.subscribers.delete(node);\n }\n node.sources.clear();\n\n const prevSubscriber = currentSubscriber;\n currentSubscriber = node;\n\n try {\n const newValue = node.fn();\n const changed =\n node.value === undefined || !node.equals(node.value, newValue);\n node.value = newValue;\n node.state = ComputedState.Clean;\n\n // Only propagate if value actually changed\n if (changed) {\n notifySubscribers(node);\n }\n } finally {\n currentSubscriber = prevSubscriber;\n }\n}\n\n// --- Effect ---\n\ninterface EffectNode extends ScheduledEffect {\n _tag: 'effect';\n fn: () => void | (() => void);\n cleanup: (() => void) | null;\n sources: Set<SignalNode<unknown> | ComputedNode<unknown>>;\n disposed: boolean;\n isRender: boolean;\n}\n\nexport function effect(\n fn: () => void | (() => void),\n options?: { render?: boolean },\n): () => void {\n const node: EffectNode = {\n _tag: 'effect',\n fn,\n cleanup: null,\n sources: new Set(),\n disposed: false,\n isRender: options?.render ?? false,\n run() {\n runEffect(node);\n },\n };\n\n // Run immediately to establish dependencies\n runEffect(node);\n\n // Return dispose function\n return () => {\n node.disposed = true;\n cleanupEffect(node);\n for (const source of node.sources) {\n source.subscribers.delete(node);\n }\n node.sources.clear();\n };\n}\n\nfunction runEffect(node: EffectNode): void {\n if (node.disposed) return;\n\n // Before re-running, check if any dirty computed source actually changed.\n // If all computed sources resolved to the same value, skip the re-run.\n if (node.sources.size > 0) {\n let anyChanged = false;\n for (const source of node.sources) {\n if ('_tag' in source && source._tag === 'computed') {\n if (source.state === ComputedState.Dirty) {\n const oldValue = source.value;\n recompute(source);\n if (!source.equals(oldValue as never, source.value as never)) {\n anyChanged = true;\n }\n }\n } else {\n // Plain signal source — if we got scheduled, something changed\n anyChanged = true;\n }\n }\n if (!anyChanged) return;\n }\n\n // Clean up previous run\n cleanupEffect(node);\n\n // Clean up old source subscriptions\n for (const source of node.sources) {\n source.subscribers.delete(node);\n }\n node.sources.clear();\n\n const prevSubscriber = currentSubscriber;\n currentSubscriber = node;\n\n try {\n const result = node.fn();\n if (typeof result === 'function') {\n node.cleanup = result;\n }\n } finally {\n currentSubscriber = prevSubscriber;\n }\n}\n\nfunction cleanupEffect(node: EffectNode): void {\n if (node.cleanup) {\n node.cleanup();\n node.cleanup = null;\n }\n}\n\n// --- Untrack ---\n\n/** Execute a function without tracking any signal reads */\nexport function untrack<T>(fn: () => T): T {\n const prev = currentSubscriber;\n currentSubscriber = null;\n try {\n return fn();\n } finally {\n currentSubscriber = prev;\n }\n}\n\n// --- Internal helpers ---\n\nfunction trackSubscriber(\n node: SignalNode<unknown> | ComputedNode<unknown>,\n): void {\n if (currentSubscriber) {\n node.subscribers.add(currentSubscriber);\n\n if ('sources' in currentSubscriber) {\n currentSubscriber.sources.add(node);\n }\n }\n}\n\nfunction notifySubscribers(\n node: SignalNode<unknown> | ComputedNode<unknown>,\n): void {\n for (const sub of node.subscribers) {\n if (sub._tag === 'computed') {\n // Mark dirty. The computed will re-evaluate lazily when read.\n sub.state = ComputedState.Dirty;\n // Propagate through the computed chain to reach effects.\n // The effects will re-read the computed, triggering recompute,\n // and only update DOM if the value actually changed.\n notifySubscribers(sub);\n } else if (sub._tag === 'effect') {\n scheduleEffect(sub);\n }\n }\n}\n"]}
@@ -1,2 +0,0 @@
1
- import {c,d}from'./chunk-FX7RHVM5.js';var S=new Map;function p(r,a){return ()=>{if(S.has(r))return S.get(r);let o=a.state(),n=u(r,o,a);return S.set(r,n),n}}function u(r,a,o){let n={},i=Object.keys(a);for(let e of i)n[e]=c(a[e]);let c$1={};if(o.getters)for(let[e,t]of Object.entries(o.getters))c$1[e]=d(()=>t(n));let s={$id:r};for(let e of i)s[e]=n[e];for(let[e,t]of Object.entries(c$1))s[e]=t;if(o.actions)for(let[e,t]of Object.entries(o.actions))s[e]=(...d)=>t.apply(s,d);s.$reset=()=>{let e=o.state();for(let t of i)n[t].set(e[t]);},s.$snapshot=()=>{let e={};for(let t of i)e[t]=n[t]();return e};let g=new Set;return s.$subscribe=e=>(g.add(e),()=>g.delete(e)),s}function l(){S.clear();}export{p as a,l as b};//# sourceMappingURL=chunk-JKO64Z6H.js.map
2
- //# sourceMappingURL=chunk-JKO64Z6H.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/store.ts"],"names":["storeInstances","defineStore","id","definition","initialState","store","createStoreInstance","stateSignals","stateKeys","key","signal","getterComputeds","getterFn","computed","comp","actionFn","args","fresh","snapshot","subscribers","callback","clearStores"],"mappings":"sCA4EA,IAAMA,CAAAA,CAAiB,IAAI,GAAA,CAQpB,SAASC,EAKdC,CAAAA,CACAC,CAAAA,CACsB,CACtB,OAAO,IAAM,CAEX,GAAIH,CAAAA,CAAe,GAAA,CAAIE,CAAE,CAAA,CACvB,OAAOF,EAAe,GAAA,CAAIE,CAAE,CAAA,CAG9B,IAAME,CAAAA,CAAeD,CAAAA,CAAW,OAAM,CAChCE,CAAAA,CAAQC,EAAoBJ,CAAAA,CAAIE,CAAAA,CAAcD,CAAU,CAAA,CAC9D,OAAAH,CAAAA,CAAe,GAAA,CAAIE,CAAAA,CAAIG,CAAK,EACrBA,CACT,CACF,CAEA,SAASC,CAAAA,CAKPJ,CAAAA,CACAE,EACAD,CAAAA,CACgB,CAEhB,IAAMI,CAAAA,CAAgD,EAAC,CACjDC,EAAY,MAAA,CAAO,IAAA,CAAKJ,CAAY,CAAA,CAE1C,IAAA,IAAWK,KAAOD,CAAAA,CAChBD,CAAAA,CAAaE,CAAG,CAAA,CAAIC,CAAAA,CAAON,CAAAA,CAAaK,CAAG,CAAC,CAAA,CAI9C,IAAME,GAAAA,CAA2D,EAAC,CAClE,GAAIR,CAAAA,CAAW,OAAA,CACb,IAAA,GAAW,CAACM,CAAAA,CAAKG,CAAQ,IAAK,MAAA,CAAO,OAAA,CAAQT,EAAW,OAAO,CAAA,CAC7DQ,IAAgBF,CAAG,CAAA,CAAII,CAAAA,CAAS,IAC7BD,CAAAA,CAAsBL,CAAY,CACrC,CAAA,CAKJ,IAAMF,CAAAA,CAAa,CAAE,GAAA,CAAKH,CAAG,EAG7B,IAAA,IAAWO,CAAAA,IAAOD,CAAAA,CAChBH,CAAAA,CAAMI,CAAG,CAAA,CAAIF,EAAaE,CAAG,CAAA,CAI/B,OAAW,CAACA,CAAAA,CAAKK,CAAI,CAAA,GAAK,MAAA,CAAO,OAAA,CAAQH,GAAe,CAAA,CACtDN,CAAAA,CAAMI,CAAG,CAAA,CAAIK,CAAAA,CAIf,GAAIX,CAAAA,CAAW,OAAA,CACb,OAAW,CAACM,CAAAA,CAAKM,CAAQ,CAAA,GAAK,MAAA,CAAO,OAAA,CAAQZ,EAAW,OAAO,CAAA,CAC7DE,EAAMI,CAAG,CAAA,CAAI,IAAIO,CAAAA,GACdD,CAAAA,CAAsB,KAAA,CAAMV,CAAAA,CAAOW,CAAI,CAAA,CAK9CX,EAAM,MAAA,CAAS,IAAM,CACnB,IAAMY,CAAAA,CAAQd,CAAAA,CAAW,OAAM,CAC/B,IAAA,IAAWM,CAAAA,IAAOD,CAAAA,CAChBD,CAAAA,CAAaE,CAAG,EAAE,GAAA,CAAIQ,CAAAA,CAAMR,CAAc,CAAC,EAE/C,EAGAJ,CAAAA,CAAM,SAAA,CAAY,IAAS,CACzB,IAAMa,CAAAA,CAAoC,EAAC,CAC3C,IAAA,IAAWT,CAAAA,IAAOD,CAAAA,CAChBU,CAAAA,CAAST,CAAG,EAAIF,CAAAA,CAAaE,CAAG,CAAA,EAAE,CAEpC,OAAOS,CACT,EAGA,IAAMC,CAAAA,CAAc,IAAI,GAAA,CACxB,OAAAd,EAAM,UAAA,CAAce,CAAAA,GAClBD,CAAAA,CAAY,GAAA,CAAIC,CAAQ,CAAA,CACjB,IAAMD,CAAAA,CAAY,MAAA,CAAOC,CAAQ,CAAA,CAAA,CAGnCf,CACT,CAKO,SAASgB,CAAAA,EAAoB,CAClCrB,CAAAA,CAAe,KAAA,GACjB","file":"chunk-JKO64Z6H.js","sourcesContent":["/**\n * Global state management via defineStore().\n *\n * Stores are singleton signal containers that persist across\n * components. They provide shared state, computed getters,\n * and actions — no external library needed.\n *\n * ```ts\n * const useCounterStore = defineStore('counter', {\n * state: () => ({ count: 0, name: 'Counter' }),\n * getters: {\n * doubled: (state) => state.count() * 2,\n * },\n * actions: {\n * increment() { this.count.update(c => c + 1); },\n * reset() { this.count.set(0); },\n * },\n * });\n *\n * // In any component:\n * const store = useCounterStore();\n * store.count(); // 0\n * store.doubled(); // 0\n * store.increment();\n * store.count(); // 1\n * ```\n */\n\nimport { signal, computed } from './signals.js';\nimport type { Signal, ReadonlySignal } from './signals.js';\n\n// --- Types ---\n\ntype StateFactory<S> = () => S;\n\ntype Getters<S, G> = {\n [K in keyof G]: (state: SignalifiedState<S>) => G[K];\n};\n\ntype Actions<A> = {\n [K in keyof A]: A[K] extends (...args: infer P) => infer R\n ? (...args: P) => R\n : never;\n};\n\n/** Maps plain state values to signals */\ntype SignalifiedState<S> = {\n [K in keyof S]: Signal<S[K]>;\n};\n\n/** The store instance returned to consumers */\nexport type Store<S, G, A> = SignalifiedState<S> & {\n [K in keyof G]: ReadonlySignal<G[K]>;\n} & {\n [K in keyof A]: A[K] extends (...args: infer P) => infer R\n ? (...args: P) => R\n : never;\n} & {\n /** Reset all state to initial values */\n $reset(): void;\n /** Subscribe to all state changes */\n $subscribe(callback: (state: S) => void): () => void;\n /** Get a plain snapshot of current state */\n $snapshot(): S;\n /** Store ID */\n $id: string;\n};\n\nexport interface StoreDefinition<S, G, A> {\n state: StateFactory<S>;\n getters?: Getters<S, G>;\n actions?: A;\n}\n\n// --- Store registry (singleton) ---\n\nconst storeInstances = new Map<string, Store<any, any, any>>();\n\n// --- defineStore ---\n\n/**\n * Define a global store. Returns a composable function that\n * always returns the same store instance (singleton).\n */\nexport function defineStore<\n S extends Record<string, unknown>,\n G extends Record<string, unknown> = {},\n A extends Record<string, (...args: any[]) => any> = {},\n>(\n id: string,\n definition: StoreDefinition<S, G, A>,\n): () => Store<S, G, A> {\n return () => {\n // Return existing instance if already created\n if (storeInstances.has(id)) {\n return storeInstances.get(id) as Store<S, G, A>;\n }\n\n const initialState = definition.state();\n const store = createStoreInstance(id, initialState, definition);\n storeInstances.set(id, store);\n return store;\n };\n}\n\nfunction createStoreInstance<\n S extends Record<string, unknown>,\n G extends Record<string, unknown>,\n A extends Record<string, (...args: any[]) => any>,\n>(\n id: string,\n initialState: S,\n definition: StoreDefinition<S, G, A>,\n): Store<S, G, A> {\n // Create signals for each state property\n const stateSignals: Record<string, Signal<unknown>> = {};\n const stateKeys = Object.keys(initialState);\n\n for (const key of stateKeys) {\n stateSignals[key] = signal(initialState[key]);\n }\n\n // Create computed getters\n const getterComputeds: Record<string, ReadonlySignal<unknown>> = {};\n if (definition.getters) {\n for (const [key, getterFn] of Object.entries(definition.getters)) {\n getterComputeds[key] = computed(() =>\n (getterFn as Function)(stateSignals),\n );\n }\n }\n\n // Build the store object\n const store: any = { $id: id };\n\n // Add state signals\n for (const key of stateKeys) {\n store[key] = stateSignals[key];\n }\n\n // Add getters\n for (const [key, comp] of Object.entries(getterComputeds)) {\n store[key] = comp;\n }\n\n // Bind actions with `this` pointing to the full store (state + getters + actions)\n if (definition.actions) {\n for (const [key, actionFn] of Object.entries(definition.actions)) {\n store[key] = (...args: unknown[]) =>\n (actionFn as Function).apply(store, args);\n }\n }\n\n // $reset\n store.$reset = () => {\n const fresh = definition.state();\n for (const key of stateKeys) {\n stateSignals[key].set(fresh[key as keyof S]);\n }\n };\n\n // $snapshot\n store.$snapshot = (): S => {\n const snapshot: Record<string, unknown> = {};\n for (const key of stateKeys) {\n snapshot[key] = stateSignals[key]();\n }\n return snapshot as S;\n };\n\n // $subscribe\n const subscribers = new Set<(state: S) => void>();\n store.$subscribe = (callback: (state: S) => void): (() => void) => {\n subscribers.add(callback);\n return () => subscribers.delete(callback);\n };\n\n return store as Store<S, G, A>;\n}\n\n/**\n * Clear all store instances (useful for testing).\n */\nexport function clearStores(): void {\n storeInstances.clear();\n}\n"]}