@storve/core 1.0.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 (196) hide show
  1. package/CHANGELOG.md +151 -0
  2. package/benchmarks/run.ts +102 -0
  3. package/benchmarks/week2.md +9 -0
  4. package/benchmarks/week2.ts +64 -0
  5. package/benchmarks/week4.md +13 -0
  6. package/benchmarks/week4.ts +178 -0
  7. package/benchmarks/week5.md +15 -0
  8. package/benchmarks/week5.ts +184 -0
  9. package/coverage/coverage-summary.json +31 -0
  10. package/dist/adapters/indexedDB.cjs +2 -0
  11. package/dist/adapters/indexedDB.cjs.map +1 -0
  12. package/dist/adapters/indexedDB.mjs +2 -0
  13. package/dist/adapters/indexedDB.mjs.map +1 -0
  14. package/dist/adapters/localStorage.cjs +2 -0
  15. package/dist/adapters/localStorage.cjs.map +1 -0
  16. package/dist/adapters/localStorage.mjs +2 -0
  17. package/dist/adapters/localStorage.mjs.map +1 -0
  18. package/dist/adapters/memory.cjs +2 -0
  19. package/dist/adapters/memory.cjs.map +1 -0
  20. package/dist/adapters/memory.mjs +2 -0
  21. package/dist/adapters/memory.mjs.map +1 -0
  22. package/dist/adapters/sessionStorage.cjs +2 -0
  23. package/dist/adapters/sessionStorage.cjs.map +1 -0
  24. package/dist/adapters/sessionStorage.mjs +2 -0
  25. package/dist/adapters/sessionStorage.mjs.map +1 -0
  26. package/dist/async-entry.d.ts +7 -0
  27. package/dist/async-entry.d.ts.map +1 -0
  28. package/dist/async.cjs +2 -0
  29. package/dist/async.cjs.map +1 -0
  30. package/dist/async.d.ts +52 -0
  31. package/dist/async.d.ts.map +1 -0
  32. package/dist/async.mjs +2 -0
  33. package/dist/async.mjs.map +1 -0
  34. package/dist/batch.d.ts +12 -0
  35. package/dist/batch.d.ts.map +1 -0
  36. package/dist/compose.d.ts +7 -0
  37. package/dist/compose.d.ts.map +1 -0
  38. package/dist/computed-entry.d.ts +7 -0
  39. package/dist/computed-entry.d.ts.map +1 -0
  40. package/dist/computed.cjs +2 -0
  41. package/dist/computed.cjs.map +1 -0
  42. package/dist/computed.d.ts +56 -0
  43. package/dist/computed.d.ts.map +1 -0
  44. package/dist/computed.mjs +2 -0
  45. package/dist/computed.mjs.map +1 -0
  46. package/dist/devtools/history.d.ts +51 -0
  47. package/dist/devtools/history.d.ts.map +1 -0
  48. package/dist/devtools/index.d.ts +5 -0
  49. package/dist/devtools/index.d.ts.map +1 -0
  50. package/dist/devtools/redux-bridge.d.ts +21 -0
  51. package/dist/devtools/redux-bridge.d.ts.map +1 -0
  52. package/dist/devtools/snapshots.d.ts +32 -0
  53. package/dist/devtools/snapshots.d.ts.map +1 -0
  54. package/dist/devtools/withDevtools.d.ts +17 -0
  55. package/dist/devtools/withDevtools.d.ts.map +1 -0
  56. package/dist/devtools.cjs +2 -0
  57. package/dist/devtools.cjs.map +1 -0
  58. package/dist/devtools.mjs +2 -0
  59. package/dist/devtools.mjs.map +1 -0
  60. package/dist/extensions/noop.d.ts +2 -0
  61. package/dist/extensions/noop.d.ts.map +1 -0
  62. package/dist/index.cjs +2 -0
  63. package/dist/index.cjs.js +118 -0
  64. package/dist/index.cjs.js.map +1 -0
  65. package/dist/index.cjs.map +1 -0
  66. package/dist/index.d.ts +5 -0
  67. package/dist/index.d.ts.map +1 -0
  68. package/dist/index.esm.js +116 -0
  69. package/dist/index.esm.js.map +1 -0
  70. package/dist/index.mjs +2 -0
  71. package/dist/index.mjs.map +1 -0
  72. package/dist/persist/adapters/indexedDB.d.ts +12 -0
  73. package/dist/persist/adapters/indexedDB.d.ts.map +1 -0
  74. package/dist/persist/adapters/localStorage.d.ts +11 -0
  75. package/dist/persist/adapters/localStorage.d.ts.map +1 -0
  76. package/dist/persist/adapters/memory.d.ts +11 -0
  77. package/dist/persist/adapters/memory.d.ts.map +1 -0
  78. package/dist/persist/adapters/sessionStorage.d.ts +11 -0
  79. package/dist/persist/adapters/sessionStorage.d.ts.map +1 -0
  80. package/dist/persist/debounce.d.ts +12 -0
  81. package/dist/persist/debounce.d.ts.map +1 -0
  82. package/dist/persist/hydrate.d.ts +15 -0
  83. package/dist/persist/hydrate.d.ts.map +1 -0
  84. package/dist/persist/index.d.ts +34 -0
  85. package/dist/persist/index.d.ts.map +1 -0
  86. package/dist/persist/serialize.d.ts +28 -0
  87. package/dist/persist/serialize.d.ts.map +1 -0
  88. package/dist/persist.cjs +2 -0
  89. package/dist/persist.cjs.map +1 -0
  90. package/dist/persist.mjs +2 -0
  91. package/dist/persist.mjs.map +1 -0
  92. package/dist/proxy.d.ts +2 -0
  93. package/dist/proxy.d.ts.map +1 -0
  94. package/dist/registry-D3X0HSbl.js +26 -0
  95. package/dist/registry-D3X0HSbl.js.map +1 -0
  96. package/dist/registry-RDjbeJdx.js +29 -0
  97. package/dist/registry-RDjbeJdx.js.map +1 -0
  98. package/dist/registry-qtr1UpFU.js +2 -0
  99. package/dist/registry-qtr1UpFU.js.map +1 -0
  100. package/dist/registry-zaKZ1P-s.js +2 -0
  101. package/dist/registry-zaKZ1P-s.js.map +1 -0
  102. package/dist/registry.d.ts +54 -0
  103. package/dist/registry.d.ts.map +1 -0
  104. package/dist/signals/createSignal.d.ts +19 -0
  105. package/dist/signals/createSignal.d.ts.map +1 -0
  106. package/dist/signals/index.d.ts +20 -0
  107. package/dist/signals/index.d.ts.map +1 -0
  108. package/dist/signals/useSignal.d.ts +11 -0
  109. package/dist/signals/useSignal.d.ts.map +1 -0
  110. package/dist/signals.cjs +2 -0
  111. package/dist/signals.cjs.map +1 -0
  112. package/dist/signals.mjs +2 -0
  113. package/dist/signals.mjs.map +1 -0
  114. package/dist/stats.html +4949 -0
  115. package/dist/store.d.ts +12 -0
  116. package/dist/store.d.ts.map +1 -0
  117. package/dist/sync/channel.d.ts +7 -0
  118. package/dist/sync/channel.d.ts.map +1 -0
  119. package/dist/sync/index.d.ts +3 -0
  120. package/dist/sync/index.d.ts.map +1 -0
  121. package/dist/sync/protocol.d.ts +22 -0
  122. package/dist/sync/protocol.d.ts.map +1 -0
  123. package/dist/sync/withSync.d.ts +17 -0
  124. package/dist/sync/withSync.d.ts.map +1 -0
  125. package/dist/sync.cjs +2 -0
  126. package/dist/sync.cjs.map +1 -0
  127. package/dist/sync.mjs +2 -0
  128. package/dist/sync.mjs.map +1 -0
  129. package/dist/types.d.ts +134 -0
  130. package/dist/types.d.ts.map +1 -0
  131. package/package.json +91 -0
  132. package/rollup.config.mjs +44 -0
  133. package/src/async-entry.ts +6 -0
  134. package/src/async.ts +240 -0
  135. package/src/batch.ts +33 -0
  136. package/src/compose.ts +50 -0
  137. package/src/computed-entry.ts +6 -0
  138. package/src/computed.ts +187 -0
  139. package/src/devtools/history.ts +103 -0
  140. package/src/devtools/index.ts +5 -0
  141. package/src/devtools/redux-bridge.ts +70 -0
  142. package/src/devtools/snapshots.ts +54 -0
  143. package/src/devtools/withDevtools.ts +196 -0
  144. package/src/extensions/noop.ts +12 -0
  145. package/src/index.ts +4 -0
  146. package/src/persist/adapters/indexedDB.ts +114 -0
  147. package/src/persist/adapters/localStorage.ts +28 -0
  148. package/src/persist/adapters/memory.ts +26 -0
  149. package/src/persist/adapters/sessionStorage.ts +28 -0
  150. package/src/persist/debounce.ts +28 -0
  151. package/src/persist/hydrate.ts +60 -0
  152. package/src/persist/index.ts +141 -0
  153. package/src/persist/serialize.ts +60 -0
  154. package/src/proxy.ts +87 -0
  155. package/src/registry.ts +67 -0
  156. package/src/signals/createSignal.ts +81 -0
  157. package/src/signals/index.ts +20 -0
  158. package/src/signals/useSignal.ts +18 -0
  159. package/src/store.ts +250 -0
  160. package/src/sync/channel.ts +15 -0
  161. package/src/sync/index.ts +3 -0
  162. package/src/sync/protocol.ts +18 -0
  163. package/src/sync/withSync.ts +147 -0
  164. package/src/types.ts +159 -0
  165. package/tests/async.test.ts +1100 -0
  166. package/tests/batch.test.ts +41 -0
  167. package/tests/compose.test.ts +209 -0
  168. package/tests/computed.test.ts +867 -0
  169. package/tests/devtools.test.ts +1039 -0
  170. package/tests/integration/persist.integration.test.ts +258 -0
  171. package/tests/integration/signals.integration.test.ts +309 -0
  172. package/tests/integration.test.ts +278 -0
  173. package/tests/persist/adapters/indexedDB.adapter.test.ts +185 -0
  174. package/tests/persist/adapters/localStorage.adapter.test.ts +105 -0
  175. package/tests/persist/adapters/memory.adapter.test.ts +112 -0
  176. package/tests/persist/adapters/sessionStorage.adapter.test.ts +128 -0
  177. package/tests/persist/debounce.test.ts +121 -0
  178. package/tests/persist/hydrate.test.ts +120 -0
  179. package/tests/persist/migrate.test.ts +208 -0
  180. package/tests/persist/persist.test.ts +357 -0
  181. package/tests/persist/serialize.test.ts +128 -0
  182. package/tests/proxy.test.ts +473 -0
  183. package/tests/registry.test.ts +67 -0
  184. package/tests/signals/derived.test.ts +244 -0
  185. package/tests/signals/inference.test.ts +108 -0
  186. package/tests/signals/signal.test.ts +348 -0
  187. package/tests/signals/useSignal.test.tsx +275 -0
  188. package/tests/store.test.ts +482 -0
  189. package/tests/stress.test.ts +268 -0
  190. package/tests/sync.test.ts +576 -0
  191. package/tests/types.test.ts +32 -0
  192. package/tests/v0.3.test.ts +813 -0
  193. package/tree-shake-test.js +1 -0
  194. package/tsconfig.json +15 -0
  195. package/vitest.config.ts +22 -0
  196. package/vitest_play.ts +7 -0
@@ -0,0 +1,184 @@
1
+ import { createStore } from '../src'
2
+ import { createAsync } from '../src/async'
3
+ import { computed } from '../src/computed'
4
+
5
+ interface BenchmarkResult {
6
+ operation: string
7
+ averageMs: string
8
+ status: string
9
+ }
10
+
11
+ async function benchAsync(
12
+ label: string,
13
+ fn: () => Promise<void>,
14
+ iterations = 1000
15
+ ): Promise<BenchmarkResult> {
16
+ // Warmup
17
+ for (let i = 0; i < 100; i++) await fn()
18
+
19
+ const start = performance.now()
20
+ for (let i = 0; i < iterations; i++) await fn()
21
+ const end = performance.now()
22
+
23
+ const avg = (end - start) / iterations
24
+
25
+ const limits: Record<string, number> = {
26
+ 'createAsync() initialization': 0.1,
27
+ 'fetch() - cache hit (TTL)': 0.1,
28
+ 'fetch() - cache miss (resolved)': 1.0,
29
+ 'refetch() - overhead': 0.1,
30
+ 'optimistic update - immediate state change': 0.2,
31
+ }
32
+
33
+ const limit = limits[label] ?? 1.0
34
+ const status = avg <= limit ? '✅ PASS' : '❌ FAIL'
35
+ return { operation: label, averageMs: avg.toFixed(8) + 'ms', status }
36
+ }
37
+
38
+ function benchSync(
39
+ label: string,
40
+ fn: () => void,
41
+ iterations = 100_000
42
+ ): BenchmarkResult {
43
+ // Warmup
44
+ for (let i = 0; i < 1000; i++) fn()
45
+
46
+ const start = performance.now()
47
+ for (let i = 0; i < iterations; i++) fn()
48
+ const end = performance.now()
49
+
50
+ const avg = (end - start) / iterations
51
+
52
+ const limits: Record<string, number> = {
53
+ 'createAsync() initialization': 0.1,
54
+ 'optimistic update - immediate state change': 0.2,
55
+ 'computed read (getState().computed)': 0.1,
56
+ 'computed recompute (1 dep)': 0.1,
57
+ 'computed three-level chain recompute': 0.5,
58
+ }
59
+
60
+ const limit = limits[label] ?? 1.0
61
+ const status = avg <= limit ? '✅ PASS' : '❌ FAIL'
62
+ return { operation: label, averageMs: avg.toFixed(8) + 'ms', status }
63
+ }
64
+
65
+ async function runBenchmarks(): Promise<void> {
66
+ console.log('\n⚡ Storve Core — Week 5 Benchmark Results (v0.4 Async + v0.5 Computed)\n')
67
+
68
+ const results: BenchmarkResult[] = []
69
+
70
+ // ── 1. createAsync initialization
71
+ results.push(benchSync('createAsync() initialization', () => {
72
+ createAsync(async () => 42)
73
+ }))
74
+
75
+ // ── 2. fetch() - cache hit (TTL)
76
+ const store2 = createStore({
77
+ data: createAsync(async () => 42, { ttl: 10000 })
78
+ })
79
+ // @ts-expect-error - internal access for benchmark
80
+ await store2.fetch('data') // Fill cache
81
+
82
+ results.push(await benchAsync('fetch() - cache hit (TTL)', async () => {
83
+ // @ts-expect-error - internal access for benchmark
84
+ await store2.fetch('data')
85
+ }))
86
+
87
+ // ── 3. fetch() - cache miss (resolved)
88
+ // We use a pre-resolved promise to measure the engine overhead rather than network/timer latency
89
+ const store3 = createStore({
90
+ data: createAsync(() => Promise.resolve(42))
91
+ })
92
+ results.push(await benchAsync('fetch() - cache miss (resolved)', async () => {
93
+ // @ts-expect-error - internal access for benchmark
94
+ await store3.fetch('data')
95
+ }))
96
+
97
+ // ── 4. refetch() overhead
98
+ const store4 = createStore({
99
+ data: createAsync(() => Promise.resolve(42))
100
+ })
101
+ // @ts-expect-error - internal access for benchmark
102
+ await store4.fetch('data')
103
+ results.push(await benchAsync('refetch() - overhead', async () => {
104
+ // @ts-expect-error - internal access for benchmark
105
+ await store4.refetch('data')
106
+ }))
107
+
108
+ // ── 5. Optimistic update - immediate state change
109
+ const store5 = createStore({
110
+ data: createAsync(async (val: number) => {
111
+ await new Promise(r => setTimeout(r, 10))
112
+ return val
113
+ })
114
+ })
115
+ results.push(benchSync('optimistic update - immediate state change', () => {
116
+ // @ts-expect-error - internal access for benchmark
117
+ store5.fetch('data', 100, { optimistic: { data: 100 } })
118
+ }, 10_000))
119
+
120
+ // ── 6. Computed read
121
+ const store6 = createStore({
122
+ n: 1,
123
+ sum: computed((s: { n: number }) => s.n + 1),
124
+ })
125
+ results.push(benchSync('computed read (getState().computed)', () => {
126
+ store6.getState().sum
127
+ }))
128
+
129
+ // ── 7. Computed recompute (one dependency)
130
+ const store7 = createStore({
131
+ x: 0,
132
+ doubled: computed((s: { x: number }) => s.x * 2),
133
+ })
134
+ let x = 0
135
+ results.push(benchSync('computed recompute (1 dep)', () => {
136
+ store7.setState({ x: ++x })
137
+ }, 10_000))
138
+
139
+ // ── 8. Three-level chain recompute
140
+ const store8 = createStore({
141
+ base: 0,
142
+ c1: computed((s: { base: number }) => s.base + 1),
143
+ c2: computed((s: { c1: number }) => (s as { c1: number }).c1 * 2),
144
+ c3: computed((s: { c2: number }) => (s as { c2: number }).c2 + 10),
145
+ })
146
+ let base = 0
147
+ results.push(benchSync('computed three-level chain recompute', () => {
148
+ store8.setState({ base: ++base })
149
+ }, 10_000))
150
+
151
+ // ── Print results
152
+ const colWidths = { operation: 48, averageMs: 22, status: 10 }
153
+ const header =
154
+ 'Operation'.padEnd(colWidths.operation) +
155
+ 'Average Time'.padEnd(colWidths.averageMs) +
156
+ 'Status'
157
+ const divider = '─'.repeat(header.length)
158
+
159
+ console.log(header)
160
+ console.log(divider)
161
+
162
+ let allPassed = true
163
+ for (const r of results) {
164
+ if (r.status.includes('FAIL')) allPassed = false
165
+ console.log(
166
+ r.operation.padEnd(colWidths.operation) +
167
+ r.averageMs.padEnd(colWidths.averageMs) +
168
+ r.status
169
+ )
170
+ }
171
+
172
+ console.log(divider)
173
+ console.log(allPassed
174
+ ? '\n✅ All Week 5 benchmarks passed!\n'
175
+ : '\n❌ Some benchmarks failed — investigate performance regressions.\n'
176
+ )
177
+
178
+ if (!allPassed) process.exit(1)
179
+ }
180
+
181
+ runBenchmarks().catch(err => {
182
+ console.error(err)
183
+ process.exit(1)
184
+ })
@@ -0,0 +1,31 @@
1
+ {"total": {"lines":{"total":2273,"covered":2204,"skipped":0,"pct":96.96},"statements":{"total":2273,"covered":2204,"skipped":0,"pct":96.96},"functions":{"total":134,"covered":127,"skipped":0,"pct":94.77},"branches":{"total":466,"covered":441,"skipped":0,"pct":94.63},"branchesTrue":{"total":0,"covered":0,"skipped":0,"pct":100}}
2
+ ,"/Users/dipanshusrivastava/Desktop/React Flux/packages/storve/src/async.ts": {"lines":{"total":239,"covered":236,"skipped":0,"pct":98.74},"functions":{"total":18,"covered":18,"skipped":0,"pct":100},"statements":{"total":239,"covered":236,"skipped":0,"pct":98.74},"branches":{"total":63,"covered":60,"skipped":0,"pct":95.23}}
3
+ ,"/Users/dipanshusrivastava/Desktop/React Flux/packages/storve/src/batch.ts": {"lines":{"total":33,"covered":33,"skipped":0,"pct":100},"functions":{"total":3,"covered":3,"skipped":0,"pct":100},"statements":{"total":33,"covered":33,"skipped":0,"pct":100},"branches":{"total":6,"covered":6,"skipped":0,"pct":100}}
4
+ ,"/Users/dipanshusrivastava/Desktop/React Flux/packages/storve/src/compose.ts": {"lines":{"total":50,"covered":50,"skipped":0,"pct":100},"functions":{"total":1,"covered":1,"skipped":0,"pct":100},"statements":{"total":50,"covered":50,"skipped":0,"pct":100},"branches":{"total":5,"covered":5,"skipped":0,"pct":100}}
5
+ ,"/Users/dipanshusrivastava/Desktop/React Flux/packages/storve/src/computed.ts": {"lines":{"total":187,"covered":187,"skipped":0,"pct":100},"functions":{"total":11,"covered":11,"skipped":0,"pct":100},"statements":{"total":187,"covered":187,"skipped":0,"pct":100},"branches":{"total":42,"covered":42,"skipped":0,"pct":100}}
6
+ ,"/Users/dipanshusrivastava/Desktop/React Flux/packages/storve/src/proxy.ts": {"lines":{"total":87,"covered":87,"skipped":0,"pct":100},"functions":{"total":5,"covered":5,"skipped":0,"pct":100},"statements":{"total":87,"covered":87,"skipped":0,"pct":100},"branches":{"total":31,"covered":31,"skipped":0,"pct":100}}
7
+ ,"/Users/dipanshusrivastava/Desktop/React Flux/packages/storve/src/registry.ts": {"lines":{"total":67,"covered":67,"skipped":0,"pct":100},"functions":{"total":3,"covered":3,"skipped":0,"pct":100},"statements":{"total":67,"covered":67,"skipped":0,"pct":100},"branches":{"total":8,"covered":5,"skipped":0,"pct":62.5}}
8
+ ,"/Users/dipanshusrivastava/Desktop/React Flux/packages/storve/src/store.ts": {"lines":{"total":250,"covered":244,"skipped":0,"pct":97.6},"functions":{"total":15,"covered":15,"skipped":0,"pct":100},"statements":{"total":250,"covered":244,"skipped":0,"pct":97.6},"branches":{"total":63,"covered":62,"skipped":0,"pct":98.41}}
9
+ ,"/Users/dipanshusrivastava/Desktop/React Flux/packages/storve/src/types.ts": {"lines":{"total":159,"covered":159,"skipped":0,"pct":100},"functions":{"total":0,"covered":0,"skipped":0,"pct":100},"statements":{"total":159,"covered":159,"skipped":0,"pct":100},"branches":{"total":0,"covered":0,"skipped":0,"pct":100}}
10
+ ,"/Users/dipanshusrivastava/Desktop/React Flux/packages/storve/src/devtools/history.ts": {"lines":{"total":103,"covered":103,"skipped":0,"pct":100},"functions":{"total":6,"covered":6,"skipped":0,"pct":100},"statements":{"total":103,"covered":103,"skipped":0,"pct":100},"branches":{"total":11,"covered":11,"skipped":0,"pct":100}}
11
+ ,"/Users/dipanshusrivastava/Desktop/React Flux/packages/storve/src/devtools/index.ts": {"lines":{"total":0,"covered":0,"skipped":0,"pct":100},"functions":{"total":1,"covered":1,"skipped":0,"pct":100},"statements":{"total":0,"covered":0,"skipped":0,"pct":100},"branches":{"total":1,"covered":1,"skipped":0,"pct":100}}
12
+ ,"/Users/dipanshusrivastava/Desktop/React Flux/packages/storve/src/devtools/redux-bridge.ts": {"lines":{"total":70,"covered":67,"skipped":0,"pct":95.71},"functions":{"total":3,"covered":1,"skipped":0,"pct":33.33},"statements":{"total":70,"covered":67,"skipped":0,"pct":95.71},"branches":{"total":13,"covered":12,"skipped":0,"pct":92.3}}
13
+ ,"/Users/dipanshusrivastava/Desktop/React Flux/packages/storve/src/devtools/snapshots.ts": {"lines":{"total":54,"covered":54,"skipped":0,"pct":100},"functions":{"total":5,"covered":5,"skipped":0,"pct":100},"statements":{"total":54,"covered":54,"skipped":0,"pct":100},"branches":{"total":6,"covered":6,"skipped":0,"pct":100}}
14
+ ,"/Users/dipanshusrivastava/Desktop/React Flux/packages/storve/src/devtools/withDevtools.ts": {"lines":{"total":195,"covered":177,"skipped":0,"pct":90.76},"functions":{"total":14,"covered":14,"skipped":0,"pct":100},"statements":{"total":195,"covered":177,"skipped":0,"pct":90.76},"branches":{"total":33,"covered":30,"skipped":0,"pct":90.9}}
15
+ ,"/Users/dipanshusrivastava/Desktop/React Flux/packages/storve/src/extensions/noop.ts": {"lines":{"total":12,"covered":12,"skipped":0,"pct":100},"functions":{"total":1,"covered":1,"skipped":0,"pct":100},"statements":{"total":12,"covered":12,"skipped":0,"pct":100},"branches":{"total":1,"covered":1,"skipped":0,"pct":100}}
16
+ ,"/Users/dipanshusrivastava/Desktop/React Flux/packages/storve/src/persist/debounce.ts": {"lines":{"total":28,"covered":28,"skipped":0,"pct":100},"functions":{"total":1,"covered":1,"skipped":0,"pct":100},"statements":{"total":28,"covered":28,"skipped":0,"pct":100},"branches":{"total":8,"covered":8,"skipped":0,"pct":100}}
17
+ ,"/Users/dipanshusrivastava/Desktop/React Flux/packages/storve/src/persist/hydrate.ts": {"lines":{"total":60,"covered":60,"skipped":0,"pct":100},"functions":{"total":1,"covered":1,"skipped":0,"pct":100},"statements":{"total":60,"covered":60,"skipped":0,"pct":100},"branches":{"total":17,"covered":17,"skipped":0,"pct":100}}
18
+ ,"/Users/dipanshusrivastava/Desktop/React Flux/packages/storve/src/persist/index.ts": {"lines":{"total":127,"covered":126,"skipped":0,"pct":99.21},"functions":{"total":3,"covered":3,"skipped":0,"pct":100},"statements":{"total":127,"covered":126,"skipped":0,"pct":99.21},"branches":{"total":28,"covered":25,"skipped":0,"pct":89.28}}
19
+ ,"/Users/dipanshusrivastava/Desktop/React Flux/packages/storve/src/persist/serialize.ts": {"lines":{"total":60,"covered":60,"skipped":0,"pct":100},"functions":{"total":3,"covered":3,"skipped":0,"pct":100},"statements":{"total":60,"covered":60,"skipped":0,"pct":100},"branches":{"total":15,"covered":13,"skipped":0,"pct":86.66}}
20
+ ,"/Users/dipanshusrivastava/Desktop/React Flux/packages/storve/src/persist/adapters/indexedDB.ts": {"lines":{"total":114,"covered":98,"skipped":0,"pct":85.96},"functions":{"total":14,"covered":10,"skipped":0,"pct":71.42},"statements":{"total":114,"covered":98,"skipped":0,"pct":85.96},"branches":{"total":29,"covered":25,"skipped":0,"pct":86.2}}
21
+ ,"/Users/dipanshusrivastava/Desktop/React Flux/packages/storve/src/persist/adapters/localStorage.ts": {"lines":{"total":28,"covered":28,"skipped":0,"pct":100},"functions":{"total":4,"covered":4,"skipped":0,"pct":100},"statements":{"total":28,"covered":28,"skipped":0,"pct":100},"branches":{"total":11,"covered":11,"skipped":0,"pct":100}}
22
+ ,"/Users/dipanshusrivastava/Desktop/React Flux/packages/storve/src/persist/adapters/memory.ts": {"lines":{"total":26,"covered":26,"skipped":0,"pct":100},"functions":{"total":4,"covered":4,"skipped":0,"pct":100},"statements":{"total":26,"covered":26,"skipped":0,"pct":100},"branches":{"total":6,"covered":6,"skipped":0,"pct":100}}
23
+ ,"/Users/dipanshusrivastava/Desktop/React Flux/packages/storve/src/persist/adapters/sessionStorage.ts": {"lines":{"total":28,"covered":28,"skipped":0,"pct":100},"functions":{"total":4,"covered":4,"skipped":0,"pct":100},"statements":{"total":28,"covered":28,"skipped":0,"pct":100},"branches":{"total":10,"covered":10,"skipped":0,"pct":100}}
24
+ ,"/Users/dipanshusrivastava/Desktop/React Flux/packages/storve/src/signals/createSignal.ts": {"lines":{"total":81,"covered":80,"skipped":0,"pct":98.76},"functions":{"total":5,"covered":5,"skipped":0,"pct":100},"statements":{"total":81,"covered":80,"skipped":0,"pct":98.76},"branches":{"total":19,"covered":19,"skipped":0,"pct":100}}
25
+ ,"/Users/dipanshusrivastava/Desktop/React Flux/packages/storve/src/signals/index.ts": {"lines":{"total":20,"covered":0,"skipped":0,"pct":0},"functions":{"total":1,"covered":0,"skipped":0,"pct":0},"statements":{"total":20,"covered":0,"skipped":0,"pct":0},"branches":{"total":1,"covered":0,"skipped":0,"pct":0}}
26
+ ,"/Users/dipanshusrivastava/Desktop/React Flux/packages/storve/src/signals/useSignal.ts": {"lines":{"total":18,"covered":18,"skipped":0,"pct":100},"functions":{"total":1,"covered":1,"skipped":0,"pct":100},"statements":{"total":18,"covered":18,"skipped":0,"pct":100},"branches":{"total":3,"covered":3,"skipped":0,"pct":100}}
27
+ ,"/Users/dipanshusrivastava/Desktop/React Flux/packages/storve/src/sync/channel.ts": {"lines":{"total":12,"covered":12,"skipped":0,"pct":100},"functions":{"total":1,"covered":1,"skipped":0,"pct":100},"statements":{"total":12,"covered":12,"skipped":0,"pct":100},"branches":{"total":6,"covered":5,"skipped":0,"pct":83.33}}
28
+ ,"/Users/dipanshusrivastava/Desktop/React Flux/packages/storve/src/sync/index.ts": {"lines":{"total":0,"covered":0,"skipped":0,"pct":100},"functions":{"total":1,"covered":1,"skipped":0,"pct":100},"statements":{"total":0,"covered":0,"skipped":0,"pct":100},"branches":{"total":1,"covered":1,"skipped":0,"pct":100}}
29
+ ,"/Users/dipanshusrivastava/Desktop/React Flux/packages/storve/src/sync/protocol.ts": {"lines":{"total":18,"covered":17,"skipped":0,"pct":94.44},"functions":{"total":0,"covered":0,"skipped":0,"pct":100},"statements":{"total":18,"covered":17,"skipped":0,"pct":94.44},"branches":{"total":2,"covered":1,"skipped":0,"pct":50}}
30
+ ,"/Users/dipanshusrivastava/Desktop/React Flux/packages/storve/src/sync/withSync.ts": {"lines":{"total":147,"covered":147,"skipped":0,"pct":100},"functions":{"total":5,"covered":5,"skipped":0,"pct":100},"statements":{"total":147,"covered":147,"skipped":0,"pct":100},"branches":{"total":27,"covered":25,"skipped":0,"pct":92.59}}
31
+ }
@@ -0,0 +1,2 @@
1
+ "use strict";exports.indexedDBAdapter=function(e="storve-persist"){const n="keyval",t="undefined"==typeof indexedDB;let o=null;function r(){return t?Promise.resolve(null):(null!==o||(o=new Promise(t=>{try{const o=indexedDB.open(e,1);o.onupgradeneeded=()=>{const e=o.result;e.objectStoreNames.contains(n)||e.createObjectStore(n)},o.onsuccess=()=>{t(o.result)},o.onerror=()=>{console.warn(`[storve] Failed to open IndexedDB "${e}"`),t(null)}}catch(n){console.warn(`[storve] Exception opening IndexedDB "${e}":`,n),t(null)}})),o)}return{async getItem(e){const t=await r();return null===t?null:new Promise(o=>{try{const r=t.transaction(n,"readonly"),s=r.objectStore(n).get(e);s.onsuccess=()=>{const e=s.result;o("string"==typeof e?e:null)},s.onerror=()=>{o(null)}}catch{o(null)}})},async setItem(e,t){const o=await r();if(null!==o)return new Promise(r=>{try{const s=o.transaction(n,"readwrite"),c=s.objectStore(n).put(t,e);c.onsuccess=()=>r(),c.onerror=()=>r()}catch{r()}})},async removeItem(e){const t=await r();if(null!==t)return new Promise(o=>{try{const r=t.transaction(n,"readwrite"),s=r.objectStore(n).delete(e);s.onsuccess=()=>o(),s.onerror=()=>o()}catch{o()}})}}};
2
+ //# sourceMappingURL=indexedDB.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"indexedDB.cjs","sources":["../../src/persist/adapters/indexedDB.ts"],"sourcesContent":[null],"names":["dbName","STORE_NAME","isServer","indexedDB","dbPromise","getDB","Promise","resolve","request","open","onupgradeneeded","db","result","objectStoreNames","contains","createObjectStore","onsuccess","onerror","console","warn","err","getItem","key","transaction","objectStore","get","setItem","value","put","removeItem","delete"],"mappings":"sCAWM,SAA2BA,EAAiB,kBAChD,MAAMC,EAAa,SACbC,EAAgC,oBAAdC,UACxB,IAAIC,EAAgD,KAEpD,SAASC,IACP,OAAIH,EAAiBI,QAAQC,QAAQ,OACnB,OAAdH,IAEJA,EAAY,IAAIE,QAASC,IACvB,IACE,MAAMC,EAAUL,UAAUM,KAAKT,EAAQ,GAEvCQ,EAAQE,gBAAkB,KACxB,MAAMC,EAAKH,EAAQI,OACdD,EAAGE,iBAAiBC,SAASb,IAChCU,EAAGI,kBAAkBd,IAIzBO,EAAQQ,UAAY,KAClBT,EAAQC,EAAQI,SAGlBJ,EAAQS,QAAU,KAChBC,QAAQC,KAAK,sCAAsCnB,MACnDO,EAAQ,MAEZ,CAAE,MAAOa,GACPF,QAAQC,KAAK,yCAAyCnB,MAAYoB,GAClEb,EAAQ,KACV,KAxB6BH,EA4BjC,CAEA,MAAO,CACL,aAAMiB,CAAQC,GACZ,MAAMX,QAAWN,IACjB,OAAW,OAAPM,EAAoB,KAEjB,IAAIL,QAASC,IAClB,IACE,MAAMgB,EAAcZ,EAAGY,YAAYtB,EAAY,YAEzCO,EADQe,EAAYC,YAAYvB,GAChBwB,IAAIH,GAE1Bd,EAAQQ,UAAY,KAClB,MAAMJ,EAASJ,EAAQI,OAErBL,EADoB,iBAAXK,EACDA,EAEA,OAIZJ,EAAQS,QAAU,KAChBV,EAAQ,MAEZ,CAAE,MACAA,EAAQ,KACV,GAEJ,EAEA,aAAMmB,CAAQJ,EAAaK,GACzB,MAAMhB,QAAWN,IACjB,GAAW,OAAPM,EAEJ,OAAO,IAAIL,QAASC,IAClB,IACE,MAAMgB,EAAcZ,EAAGY,YAAYtB,EAAY,aAEzCO,EADQe,EAAYC,YAAYvB,GAChB2B,IAAID,EAAOL,GAEjCd,EAAQQ,UAAY,IAAMT,IAC1BC,EAAQS,QAAU,IAAMV,GAC1B,CAAE,MACAA,GACF,GAEJ,EAEA,gBAAMsB,CAAWP,GACf,MAAMX,QAAWN,IACjB,GAAW,OAAPM,EAEJ,OAAO,IAAIL,QAASC,IAClB,IACE,MAAMgB,EAAcZ,EAAGY,YAAYtB,EAAY,aAEzCO,EADQe,EAAYC,YAAYvB,GAChB6B,OAAOR,GAE7Bd,EAAQQ,UAAY,IAAMT,IAC1BC,EAAQS,QAAU,IAAMV,GAC1B,CAAE,MACAA,GACF,GAEJ,EAEJ"}
@@ -0,0 +1,2 @@
1
+ function e(e="storve-persist"){const n="keyval",t="undefined"==typeof indexedDB;let o=null;function r(){return t?Promise.resolve(null):(null!==o||(o=new Promise(t=>{try{const o=indexedDB.open(e,1);o.onupgradeneeded=()=>{const e=o.result;e.objectStoreNames.contains(n)||e.createObjectStore(n)},o.onsuccess=()=>{t(o.result)},o.onerror=()=>{console.warn(`[storve] Failed to open IndexedDB "${e}"`),t(null)}}catch(n){console.warn(`[storve] Exception opening IndexedDB "${e}":`,n),t(null)}})),o)}return{async getItem(e){const t=await r();return null===t?null:new Promise(o=>{try{const r=t.transaction(n,"readonly"),s=r.objectStore(n).get(e);s.onsuccess=()=>{const e=s.result;o("string"==typeof e?e:null)},s.onerror=()=>{o(null)}}catch{o(null)}})},async setItem(e,t){const o=await r();if(null!==o)return new Promise(r=>{try{const s=o.transaction(n,"readwrite"),c=s.objectStore(n).put(t,e);c.onsuccess=()=>r(),c.onerror=()=>r()}catch{r()}})},async removeItem(e){const t=await r();if(null!==t)return new Promise(o=>{try{const r=t.transaction(n,"readwrite"),s=r.objectStore(n).delete(e);s.onsuccess=()=>o(),s.onerror=()=>o()}catch{o()}})}}}export{e as indexedDBAdapter};
2
+ //# sourceMappingURL=indexedDB.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"indexedDB.mjs","sources":["../../src/persist/adapters/indexedDB.ts"],"sourcesContent":[null],"names":["indexedDBAdapter","dbName","STORE_NAME","isServer","indexedDB","dbPromise","getDB","Promise","resolve","request","open","onupgradeneeded","db","result","objectStoreNames","contains","createObjectStore","onsuccess","onerror","console","warn","err","getItem","key","transaction","objectStore","get","setItem","value","put","removeItem","delete"],"mappings":"AAWM,SAAUA,EAAiBC,EAAiB,kBAChD,MAAMC,EAAa,SACbC,EAAgC,oBAAdC,UACxB,IAAIC,EAAgD,KAEpD,SAASC,IACP,OAAIH,EAAiBI,QAAQC,QAAQ,OACnB,OAAdH,IAEJA,EAAY,IAAIE,QAASC,IACvB,IACE,MAAMC,EAAUL,UAAUM,KAAKT,EAAQ,GAEvCQ,EAAQE,gBAAkB,KACxB,MAAMC,EAAKH,EAAQI,OACdD,EAAGE,iBAAiBC,SAASb,IAChCU,EAAGI,kBAAkBd,IAIzBO,EAAQQ,UAAY,KAClBT,EAAQC,EAAQI,SAGlBJ,EAAQS,QAAU,KAChBC,QAAQC,KAAK,sCAAsCnB,MACnDO,EAAQ,MAEZ,CAAE,MAAOa,GACPF,QAAQC,KAAK,yCAAyCnB,MAAYoB,GAClEb,EAAQ,KACV,KAxB6BH,EA4BjC,CAEA,MAAO,CACL,aAAMiB,CAAQC,GACZ,MAAMX,QAAWN,IACjB,OAAW,OAAPM,EAAoB,KAEjB,IAAIL,QAASC,IAClB,IACE,MAAMgB,EAAcZ,EAAGY,YAAYtB,EAAY,YAEzCO,EADQe,EAAYC,YAAYvB,GAChBwB,IAAIH,GAE1Bd,EAAQQ,UAAY,KAClB,MAAMJ,EAASJ,EAAQI,OAErBL,EADoB,iBAAXK,EACDA,EAEA,OAIZJ,EAAQS,QAAU,KAChBV,EAAQ,MAEZ,CAAE,MACAA,EAAQ,KACV,GAEJ,EAEA,aAAMmB,CAAQJ,EAAaK,GACzB,MAAMhB,QAAWN,IACjB,GAAW,OAAPM,EAEJ,OAAO,IAAIL,QAASC,IAClB,IACE,MAAMgB,EAAcZ,EAAGY,YAAYtB,EAAY,aAEzCO,EADQe,EAAYC,YAAYvB,GAChB2B,IAAID,EAAOL,GAEjCd,EAAQQ,UAAY,IAAMT,IAC1BC,EAAQS,QAAU,IAAMV,GAC1B,CAAE,MACAA,GACF,GAEJ,EAEA,gBAAMsB,CAAWP,GACf,MAAMX,QAAWN,IACjB,GAAW,OAAPM,EAEJ,OAAO,IAAIL,QAASC,IAClB,IACE,MAAMgB,EAAcZ,EAAGY,YAAYtB,EAAY,aAEzCO,EADQe,EAAYC,YAAYvB,GAChB6B,OAAOR,GAE7Bd,EAAQQ,UAAY,IAAMT,IAC1BC,EAAQS,QAAU,IAAMV,GAC1B,CAAE,MACAA,GACF,GAEJ,EAEJ"}
@@ -0,0 +1,2 @@
1
+ "use strict";exports.localStorageAdapter=function(){const e="undefined"==typeof window;return{getItem:t=>e?null:window.localStorage.getItem(t),setItem(t,o){e||window.localStorage.setItem(t,o)},removeItem(t){e||window.localStorage.removeItem(t)}}};
2
+ //# sourceMappingURL=localStorage.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"localStorage.cjs","sources":["../../src/persist/adapters/localStorage.ts"],"sourcesContent":[null],"names":["isServer","window","getItem","key","localStorage","setItem","value","removeItem"],"mappings":"oDAWE,MAAMA,EAA6B,oBAAXC,OAExB,MAAO,CACLC,QAAQC,GACFH,EAAiB,KACdC,OAAOG,aAAaF,QAAQC,GAErC,OAAAE,CAAQF,EAAaG,GACfN,GACJC,OAAOG,aAAaC,QAAQF,EAAKG,EACnC,EACA,UAAAC,CAAWJ,GACLH,GACJC,OAAOG,aAAaG,WAAWJ,EACjC,EAEJ"}
@@ -0,0 +1,2 @@
1
+ function e(){const e="undefined"==typeof window;return{getItem:t=>e?null:window.localStorage.getItem(t),setItem(t,o){e||window.localStorage.setItem(t,o)},removeItem(t){e||window.localStorage.removeItem(t)}}}export{e as localStorageAdapter};
2
+ //# sourceMappingURL=localStorage.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"localStorage.mjs","sources":["../../src/persist/adapters/localStorage.ts"],"sourcesContent":[null],"names":["localStorageAdapter","isServer","window","getItem","key","localStorage","setItem","value","removeItem"],"mappings":"SAUgBA,IACd,MAAMC,EAA6B,oBAAXC,OAExB,MAAO,CACLC,QAAQC,GACFH,EAAiB,KACdC,OAAOG,aAAaF,QAAQC,GAErC,OAAAE,CAAQF,EAAaG,GACfN,GACJC,OAAOG,aAAaC,QAAQF,EAAKG,EACnC,EACA,UAAAC,CAAWJ,GACLH,GACJC,OAAOG,aAAaG,WAAWJ,EACjC,EAEJ"}
@@ -0,0 +1,2 @@
1
+ "use strict";exports.memoryAdapter=function(){const e=new Map;return{getItem(t){const r=e.get(t);return void 0!==r?r:null},setItem(t,r){e.set(t,r)},removeItem(t){e.delete(t)}}};
2
+ //# sourceMappingURL=memory.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"memory.cjs","sources":["../../src/persist/adapters/memory.ts"],"sourcesContent":[null],"names":["store","Map","getItem","key","value","get","undefined","setItem","set","removeItem","delete"],"mappings":"8CAWE,MAAMA,EAAQ,IAAIC,IAElB,MAAO,CACL,OAAAC,CAAQC,GACN,MAAMC,EAAQJ,EAAMK,IAAIF,GACxB,YAAiBG,IAAVF,EAAsBA,EAAQ,IACvC,EACA,OAAAG,CAAQJ,EAAaC,GACnBJ,EAAMQ,IAAIL,EAAKC,EACjB,EACA,UAAAK,CAAWN,GACTH,EAAMU,OAAOP,EACf,EAEJ"}
@@ -0,0 +1,2 @@
1
+ function e(){const e=new Map;return{getItem(t){const n=e.get(t);return void 0!==n?n:null},setItem(t,n){e.set(t,n)},removeItem(t){e.delete(t)}}}export{e as memoryAdapter};
2
+ //# sourceMappingURL=memory.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"memory.mjs","sources":["../../src/persist/adapters/memory.ts"],"sourcesContent":[null],"names":["memoryAdapter","store","Map","getItem","key","value","get","undefined","setItem","set","removeItem","delete"],"mappings":"SAUgBA,IACd,MAAMC,EAAQ,IAAIC,IAElB,MAAO,CACL,OAAAC,CAAQC,GACN,MAAMC,EAAQJ,EAAMK,IAAIF,GACxB,YAAiBG,IAAVF,EAAsBA,EAAQ,IACvC,EACA,OAAAG,CAAQJ,EAAaC,GACnBJ,EAAMQ,IAAIL,EAAKC,EACjB,EACA,UAAAK,CAAWN,GACTH,EAAMU,OAAOP,EACf,EAEJ"}
@@ -0,0 +1,2 @@
1
+ "use strict";exports.sessionStorageAdapter=function(){const e="undefined"==typeof window;return{getItem:t=>e?null:window.sessionStorage.getItem(t),setItem(t,o){e||window.sessionStorage.setItem(t,o)},removeItem(t){e||window.sessionStorage.removeItem(t)}}};
2
+ //# sourceMappingURL=sessionStorage.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sessionStorage.cjs","sources":["../../src/persist/adapters/sessionStorage.ts"],"sourcesContent":[null],"names":["isServer","window","getItem","key","sessionStorage","setItem","value","removeItem"],"mappings":"sDAWE,MAAMA,EAA6B,oBAAXC,OAExB,MAAO,CACLC,QAAQC,GACFH,EAAiB,KACdC,OAAOG,eAAeF,QAAQC,GAEvC,OAAAE,CAAQF,EAAaG,GACfN,GACJC,OAAOG,eAAeC,QAAQF,EAAKG,EACrC,EACA,UAAAC,CAAWJ,GACLH,GACJC,OAAOG,eAAeG,WAAWJ,EACnC,EAEJ"}
@@ -0,0 +1,2 @@
1
+ function e(){const e="undefined"==typeof window;return{getItem:t=>e?null:window.sessionStorage.getItem(t),setItem(t,o){e||window.sessionStorage.setItem(t,o)},removeItem(t){e||window.sessionStorage.removeItem(t)}}}export{e as sessionStorageAdapter};
2
+ //# sourceMappingURL=sessionStorage.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sessionStorage.mjs","sources":["../../src/persist/adapters/sessionStorage.ts"],"sourcesContent":[null],"names":["sessionStorageAdapter","isServer","window","getItem","key","sessionStorage","setItem","value","removeItem"],"mappings":"SAUgBA,IACd,MAAMC,EAA6B,oBAAXC,OAExB,MAAO,CACLC,QAAQC,GACFH,EAAiB,KACdC,OAAOG,eAAeF,QAAQC,GAEvC,OAAAE,CAAQF,EAAaG,GACfN,GACJC,OAAOG,eAAeC,QAAQF,EAAKG,EACrC,EACA,UAAAC,CAAWJ,GACLH,GACJC,OAAOG,eAAeG,WAAWJ,EACnC,EAEJ"}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * Async entry point. Import from 'storve/async'.
3
+ * Side-effect: registers async extension so createStore handles createAsync values.
4
+ */
5
+ export { createAsync } from './async';
6
+ export type { AsyncState, AsyncOptions, AsyncStatus } from './types';
7
+ //# sourceMappingURL=async-entry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"async-entry.d.ts","sourceRoot":"","sources":["../src/async-entry.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AACtC,YAAY,EAAE,UAAU,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC"}
package/dist/async.cjs ADDED
@@ -0,0 +1,2 @@
1
+ "use strict";var t=require("./registry-qtr1UpFU.js");const s="__rf_async";class i{fn;options;onUpdate;lastRequestId=0;lastArgs=[];cache=new Map;status="idle";data=null;error=null;previousData=null;previousStatus="idle";hasPrevious=!1;lastState=null;stableRefetch=()=>this.refetch();constructor(t,s,i){this.fn=t,this.options=s,this.onUpdate=i}getState(){return this.lastState||(this.lastState={data:this.data,error:this.error,status:this.status,loading:"loading"===this.status,refetch:this.stableRefetch}),this.lastState}async fetch(...t){let s,i=t;if(t.length>0){const e=t[t.length-1];e&&"object"==typeof e&&"optimistic"in e&&(s=e,i=t.slice(0,-1))}const e=Date.now(),{ttl:a=0,staleWhileRevalidate:n=!1}=this.options,r=JSON.stringify(i),h=this.cache.get(r);let o=!1;if(s?.optimistic)this.previousData=this.data,this.previousStatus=this.status,this.hasPrevious=!0,this.data=s.optimistic.data,this.status=s.optimistic.status||"success",this.lastArgs=i,this.notify(),o=!0;else{if(a>0&&h&&e<h.expiresAt&&"success"===this.status)return void(this.data!==h.data&&(this.data=h.data,this.lastArgs=i,this.notify()));if(a>0&&h&&e>=h.expiresAt&&"success"===this.status&&n)return this.data=h.data,this.lastArgs=i,this.runFetch(i,!0)}return this.lastArgs=i,this.runFetch(i,o)}async refetch(){return this.runFetch(this.lastArgs,!1)}invalidate(){this.cache.clear()}async runFetch(t,s){const i=++this.lastRequestId;s||(this.status="loading",this.notify());try{const s=await this.fn(...t);if(i!==this.lastRequestId)return;this.data=s,this.error=null,this.status="success",this.hasPrevious=!1;const e=this.options.ttl||0;if(e>0){const i=JSON.stringify(t);this.cache.set(i,{data:s,expiresAt:Date.now()+e})}}catch(t){if(i!==this.lastRequestId)return;this.error=t instanceof Error?t.message:String(t),this.hasPrevious?(this.data=this.previousData,this.status=this.previousStatus,this.hasPrevious=!1):(s||(this.data=null),this.status="error")}this.notify()}notify(){this.lastState=null,this.onUpdate(this.getState())}}t.registerExtension({key:"async",order:0,processDefinition:t=>{const i={},e=[];for(const a of Object.keys(t)){const n=t[a];if(n&&"object"==typeof n&&s in n){const t=n;e.push({key:a,init:t.init})}else i[a]=n}return{state:i,asyncInits:e}},extendStore:t=>{const s=t.engines;return{fetch:async(t,...i)=>{if(!s.has(t))throw new Error(`Storve: no async key "${t}" found in store`);const e=s.get(t);e&&await e.fetch(...i)},refetch:async t=>{const i=s.get(t);i&&await i.refetch()},invalidate:t=>{const i=s.get(t);i&&i.invalidate()},invalidateAll:()=>{s.forEach(t=>t.invalidate())},getAsyncState:t=>{const i=s.get(t);return i?i.getState():void 0}}}}),exports.createAsync=function(t,e={}){return{[s]:!0,init:s=>new i(t,e,s)}};
2
+ //# sourceMappingURL=async.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"async.cjs","sources":["../src/types.ts","../src/async.ts"],"sourcesContent":[null,null],"names":["ASYNC_VALUE_MARKER","AsyncEngine","fn","options","onUpdate","lastRequestId","lastArgs","cache","Map","status","data","error","previousData","previousStatus","hasPrevious","lastState","stableRefetch","this","refetch","constructor","getState","loading","fetch","args","fetchOptions","actualArgs","length","lastArg","slice","now","Date","ttl","staleWhileRevalidate","cacheKey","JSON","stringify","cached","get","fromOptimistic","optimistic","notify","expiresAt","runFetch","invalidate","clear","background","requestId","result","set","err","Error","message","String","registerExtension","key","order","processDefinition","definition","state","asyncInits","Object","keys","val","asyncVal","push","init","extendStore","ctx","engines","async","has","engine","invalidateAll","forEach","getAsyncState","undefined"],"mappings":"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"}
@@ -0,0 +1,52 @@
1
+ import { AsyncValue, AsyncOptions, AsyncState, IAsyncEngine } from './types';
2
+ /**
3
+ * Creates an async value definition for use in createStore.
4
+ *
5
+ * @param fn - The async function to execute.
6
+ * @param options - Optional configuration (ttl, staleWhileRevalidate).
7
+ */
8
+ export declare function createAsync<T, Args extends unknown[] = unknown[]>(fn: (...args: Args) => Promise<T>, options?: AsyncOptions): AsyncValue<T>;
9
+ /**
10
+ * Internal engine that manages the state of a single async key.
11
+ * Handles fetching, caching, and race condition protection.
12
+ * @internal
13
+ */
14
+ export declare class AsyncEngine<T> implements IAsyncEngine<T> {
15
+ private fn;
16
+ private options;
17
+ private onUpdate;
18
+ private lastRequestId;
19
+ private lastArgs;
20
+ private cache;
21
+ private status;
22
+ private data;
23
+ private error;
24
+ private previousData;
25
+ private previousStatus;
26
+ private hasPrevious;
27
+ private lastState;
28
+ private stableRefetch;
29
+ constructor(fn: (...args: unknown[]) => Promise<T>, options: AsyncOptions, onUpdate: (state: AsyncState<T>) => void);
30
+ /**
31
+ * Returns the current public state shape for this async key.
32
+ */
33
+ getState(): AsyncState<T>;
34
+ /**
35
+ * Triggers a fetch. Handles TTL caching and SWR.
36
+ */
37
+ fetch(...args: unknown[]): Promise<void>;
38
+ /**
39
+ * Re-runs the operation with last used arguments. Bypasses TTL.
40
+ */
41
+ refetch(): Promise<void>;
42
+ /**
43
+ * Clears the cache for this key.
44
+ */
45
+ invalidate(): void;
46
+ /**
47
+ * Internal runner for the async function with race protection.
48
+ */
49
+ private runFetch;
50
+ private notify;
51
+ }
52
+ //# sourceMappingURL=async.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"async.d.ts","sourceRoot":"","sources":["../src/async.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,UAAU,EAAmC,YAAY,EAAE,MAAM,SAAS,CAAC;AAG9G;;;;;GAKG;AACH,wBAAgB,WAAW,CAAC,CAAC,EAAE,IAAI,SAAS,OAAO,EAAE,GAAG,OAAO,EAAE,EAC7D,EAAE,EAAE,CAAC,GAAG,IAAI,EAAE,IAAI,KAAK,OAAO,CAAC,CAAC,CAAC,EACjC,OAAO,GAAE,YAAiB,GAC3B,UAAU,CAAC,CAAC,CAAC,CAMf;AAED;;;;GAIG;AACH,qBAAa,WAAW,CAAC,CAAC,CAAE,YAAW,YAAY,CAAC,CAAC,CAAC;IAkB9C,OAAO,CAAC,EAAE;IACV,OAAO,CAAC,OAAO;IACf,OAAO,CAAC,QAAQ;IAnBpB,OAAO,CAAC,aAAa,CAAK;IAC1B,OAAO,CAAC,QAAQ,CAAiB;IACjC,OAAO,CAAC,KAAK,CAAqD;IAClE,OAAO,CAAC,MAAM,CAAuB;IACrC,OAAO,CAAC,IAAI,CAAkB;IAC9B,OAAO,CAAC,KAAK,CAAuB;IAGpC,OAAO,CAAC,YAAY,CAAkB;IACtC,OAAO,CAAC,cAAc,CAAuB;IAC7C,OAAO,CAAC,WAAW,CAAS;IAG5B,OAAO,CAAC,SAAS,CAA8B;IAC/C,OAAO,CAAC,aAAa,CAAwB;gBAGjC,EAAE,EAAE,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,OAAO,CAAC,CAAC,CAAC,EACtC,OAAO,EAAE,YAAY,EACrB,QAAQ,EAAE,CAAC,KAAK,EAAE,UAAU,CAAC,CAAC,CAAC,KAAK,IAAI;IAGpD;;OAEG;IACH,QAAQ,IAAI,UAAU,CAAC,CAAC,CAAC;IAazB;;OAEG;IACG,KAAK,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAwD9C;;OAEG;IACG,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAI9B;;OAEG;IACH,UAAU,IAAI,IAAI;IAIlB;;OAEG;YACW,QAAQ;IA+CtB,OAAO,CAAC,MAAM;CAIjB"}
package/dist/async.mjs ADDED
@@ -0,0 +1,2 @@
1
+ import{r as t}from"./registry-zaKZ1P-s.js";const s="__rf_async";function i(t,i={}){return{[s]:!0,init:s=>new e(t,i,s)}}class e{fn;options;onUpdate;lastRequestId=0;lastArgs=[];cache=new Map;status="idle";data=null;error=null;previousData=null;previousStatus="idle";hasPrevious=!1;lastState=null;stableRefetch=()=>this.refetch();constructor(t,s,i){this.fn=t,this.options=s,this.onUpdate=i}getState(){return this.lastState||(this.lastState={data:this.data,error:this.error,status:this.status,loading:"loading"===this.status,refetch:this.stableRefetch}),this.lastState}async fetch(...t){let s,i=t;if(t.length>0){const e=t[t.length-1];e&&"object"==typeof e&&"optimistic"in e&&(s=e,i=t.slice(0,-1))}const e=Date.now(),{ttl:a=0,staleWhileRevalidate:n=!1}=this.options,r=JSON.stringify(i),h=this.cache.get(r);let o=!1;if(s?.optimistic)this.previousData=this.data,this.previousStatus=this.status,this.hasPrevious=!0,this.data=s.optimistic.data,this.status=s.optimistic.status||"success",this.lastArgs=i,this.notify(),o=!0;else{if(a>0&&h&&e<h.expiresAt&&"success"===this.status)return void(this.data!==h.data&&(this.data=h.data,this.lastArgs=i,this.notify()));if(a>0&&h&&e>=h.expiresAt&&"success"===this.status&&n)return this.data=h.data,this.lastArgs=i,this.runFetch(i,!0)}return this.lastArgs=i,this.runFetch(i,o)}async refetch(){return this.runFetch(this.lastArgs,!1)}invalidate(){this.cache.clear()}async runFetch(t,s){const i=++this.lastRequestId;s||(this.status="loading",this.notify());try{const s=await this.fn(...t);if(i!==this.lastRequestId)return;this.data=s,this.error=null,this.status="success",this.hasPrevious=!1;const e=this.options.ttl||0;if(e>0){const i=JSON.stringify(t);this.cache.set(i,{data:s,expiresAt:Date.now()+e})}}catch(t){if(i!==this.lastRequestId)return;this.error=t instanceof Error?t.message:String(t),this.hasPrevious?(this.data=this.previousData,this.status=this.previousStatus,this.hasPrevious=!1):(s||(this.data=null),this.status="error")}this.notify()}notify(){this.lastState=null,this.onUpdate(this.getState())}}t({key:"async",order:0,processDefinition:t=>{const i={},e=[];for(const a of Object.keys(t)){const n=t[a];if(n&&"object"==typeof n&&s in n){const t=n;e.push({key:a,init:t.init})}else i[a]=n}return{state:i,asyncInits:e}},extendStore:t=>{const s=t.engines;return{fetch:async(t,...i)=>{if(!s.has(t))throw new Error(`Storve: no async key "${t}" found in store`);const e=s.get(t);e&&await e.fetch(...i)},refetch:async t=>{const i=s.get(t);i&&await i.refetch()},invalidate:t=>{const i=s.get(t);i&&i.invalidate()},invalidateAll:()=>{s.forEach(t=>t.invalidate())},getAsyncState:t=>{const i=s.get(t);return i?i.getState():void 0}}}});export{i as createAsync};
2
+ //# sourceMappingURL=async.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"async.mjs","sources":["../src/types.ts","../src/async.ts"],"sourcesContent":[null,null],"names":["ASYNC_VALUE_MARKER","createAsync","fn","options","init","onUpdate","AsyncEngine","lastRequestId","lastArgs","cache","Map","status","data","error","previousData","previousStatus","hasPrevious","lastState","stableRefetch","this","refetch","constructor","getState","loading","fetch","args","fetchOptions","actualArgs","length","lastArg","slice","now","Date","ttl","staleWhileRevalidate","cacheKey","JSON","stringify","cached","get","fromOptimistic","optimistic","notify","expiresAt","runFetch","invalidate","clear","background","requestId","result","set","err","Error","message","String","registerExtension","key","order","processDefinition","definition","state","asyncInits","Object","keys","val","asyncVal","push","extendStore","ctx","engines","async","has","engine","invalidateAll","forEach","getAsyncState","undefined"],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ /**
2
+ * Batches multiple state updates across any number of stores.
3
+ * Listeners will only be notified once after the batch function completes.
4
+ *
5
+ * @param fn - The function containing state updates to batch.
6
+ */
7
+ export declare function batch(fn: () => void): void;
8
+ /** @internal */
9
+ export declare function isBatching(): boolean;
10
+ /** @internal */
11
+ export declare function subscribeToBatch(cb: () => void): () => void;
12
+ //# sourceMappingURL=batch.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"batch.d.ts","sourceRoot":"","sources":["../src/batch.ts"],"names":[],"mappings":"AAGA;;;;;GAKG;AACH,wBAAgB,KAAK,CAAC,EAAE,EAAE,MAAM,IAAI,GAAG,IAAI,CAU1C;AAED,gBAAgB;AAChB,wBAAgB,UAAU,IAAI,OAAO,CAEpC;AAED,gBAAgB;AAChB,wBAAgB,gBAAgB,CAAC,EAAE,EAAE,MAAM,IAAI,GAAG,MAAM,IAAI,CAK3D"}
@@ -0,0 +1,7 @@
1
+ import type { Store } from './types.js';
2
+ export declare function compose<D extends object, S extends Store<D>>(store: S): S;
3
+ export declare function compose<D extends object, S extends Store<D>, R1>(store: S, f1: (store: S) => R1): R1;
4
+ export declare function compose<D extends object, S extends Store<D>, R1, R2>(store: S, f1: (store: S) => R1, f2: (store: R1) => R2): R2;
5
+ export declare function compose<D extends object, S extends Store<D>, R1, R2, R3>(store: S, f1: (store: S) => R1, f2: (store: R1) => R2, f3: (store: R2) => R3): R3;
6
+ export declare function compose<D extends object>(store: Store<D>, ...enhancers: Array<(store: unknown) => unknown>): unknown;
7
+ //# sourceMappingURL=compose.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"compose.d.ts","sourceRoot":"","sources":["../src/compose.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,YAAY,CAAA;AAEvC,wBAAgB,OAAO,CAAC,CAAC,SAAS,MAAM,EAAE,CAAC,SAAS,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,GAAG,CAAC,CAAA;AAE1E,wBAAgB,OAAO,CAAC,CAAC,SAAS,MAAM,EAAE,CAAC,SAAS,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,EAC9D,KAAK,EAAE,CAAC,EACR,EAAE,EAAE,CAAC,KAAK,EAAE,CAAC,KAAK,EAAE,GACnB,EAAE,CAAA;AAEL,wBAAgB,OAAO,CAAC,CAAC,SAAS,MAAM,EAAE,CAAC,SAAS,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,EAAE,EAClE,KAAK,EAAE,CAAC,EACR,EAAE,EAAE,CAAC,KAAK,EAAE,CAAC,KAAK,EAAE,EACpB,EAAE,EAAE,CAAC,KAAK,EAAE,EAAE,KAAK,EAAE,GACpB,EAAE,CAAA;AAEL,wBAAgB,OAAO,CAAC,CAAC,SAAS,MAAM,EAAE,CAAC,SAAS,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EACtE,KAAK,EAAE,CAAC,EACR,EAAE,EAAE,CAAC,KAAK,EAAE,CAAC,KAAK,EAAE,EACpB,EAAE,EAAE,CAAC,KAAK,EAAE,EAAE,KAAK,EAAE,EACrB,EAAE,EAAE,CAAC,KAAK,EAAE,EAAE,KAAK,EAAE,GACpB,EAAE,CAAA;AAEL,wBAAgB,OAAO,CAAC,CAAC,SAAS,MAAM,EACtC,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC,EACf,GAAG,SAAS,EAAE,KAAK,CAAC,CAAC,KAAK,EAAE,OAAO,KAAK,OAAO,CAAC,GAC/C,OAAO,CAAA"}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * Computed entry point. Import from 'storve/computed'.
3
+ * Side-effect: registers computed extension so createStore handles computed values.
4
+ */
5
+ export { computed, COMPUTED_MARKER } from './computed';
6
+ export type { ComputedValue } from './types';
7
+ //# sourceMappingURL=computed-entry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"computed-entry.d.ts","sourceRoot":"","sources":["../src/computed-entry.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,EAAE,QAAQ,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AACvD,YAAY,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC"}
@@ -0,0 +1,2 @@
1
+ "use strict";var e=require("./registry-qtr1UpFU.js");const t="__rf_computed";function n(e,t){const n=new Set;return{result:t(new Proxy(e,{get:(e,t)=>(n.add(t),e[t])})),deps:n}}e.registerExtension({key:"computed",order:1,processDefinition:e=>{const o={...e},s=new Set,r=new Map;for(const c of Object.keys(e)){const f=e[c];if(f&&"object"==typeof f&&t in f){const e=f;s.add(c),delete o[c];const{result:t,deps:d}=n(o,e.fn);r.set(c,{fn:e.fn,value:t,deps:d,dirty:!1})}}const c=Array.from(s);let f=[];if(c.length>0){const e=e=>r.get(e).deps;!function(e,t){const n=new Set(e),o=[],s=new Set;function r(e){if(o.includes(e))throw new Error(`Storve: circular dependency in computed values: ${[...o,e].join(" → ")}`);if(!s.has(e)){o.push(e);for(const o of t(e))n.has(o)&&r(o);o.pop(),s.add(e)}}for(const t of e)s.has(t)||r(t)}(c,e),f=function(e,t){const n=[],o=new Set,s=new Set(e);function r(e){if(!o.has(e)){o.add(e);for(const n of t(e))s.has(n)&&r(n);n.push(e)}}for(const t of e)r(t);return n}(c,e);for(const e of f){const t=r.get(e),{result:s,deps:c}=n(o,t.fn);t.value=s,t.deps=c,o[e]=s}}return{state:o,readOnlyKeys:s,onStateChanged:e=>{return t=e.changedKeys,o=e.getState,s=e.setComputed,f.forEach(e=>{const n=r.get(e);for(const e of n.deps)if(t.has(e)){n.dirty=!0;break}}),void f.forEach(e=>{const t=r.get(e);if(!t.dirty)return;const c=o(),{result:d,deps:i}=n(c,t.fn);t.value=d,t.deps=i,t.dirty=!1,s(e,d),f.forEach(t=>{t!==e&&r.get(t).deps.has(e)&&(r.get(t).dirty=!0)})});var t,o,s}}}}),exports.COMPUTED_MARKER=t,exports.computed=function(e){return{[t]:!0,fn:e}};
2
+ //# sourceMappingURL=computed.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"computed.cjs","sources":["../src/computed.ts"],"sourcesContent":[null],"names":["COMPUTED_MARKER","trackDependencies","state","fn","deps","Set","result","Proxy","get","target","key","add","registerExtension","order","processDefinition","definition","computedKeys","computedEngines","Map","Object","keys","val","comp","set","value","dirty","computedKeysList","Array","from","topoOrder","length","getDeps","k","keySet","path","visited","visit","includes","Error","join","has","push","d","pop","detectCircular","topologicalSort","engine","readOnlyKeys","onStateChanged","ctx","runRecompute","changedKeys","getState","setComputed","forEach","currentState","other"],"mappings":"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"}
@@ -0,0 +1,56 @@
1
+ /**
2
+ * Computed values implementation for Storve.
3
+ * Provides synchronous derived state with automatic dependency tracking.
4
+ */
5
+ /** Marker constant used to identify computed definitions in store definitions. */
6
+ export declare const COMPUTED_MARKER: "__rf_computed";
7
+ /**
8
+ * Type representing a computed value definition.
9
+ * Used as a value in the store definition; the store unwraps it to the computed result type T.
10
+ */
11
+ export type ComputedValue<T> = {
12
+ [COMPUTED_MARKER]: true;
13
+ fn: (state: unknown) => T;
14
+ };
15
+ /**
16
+ * Internal engine shape for a single computed value.
17
+ * @internal
18
+ */
19
+ export interface ComputedEngine<T> {
20
+ fn: (state: unknown) => T;
21
+ value: T;
22
+ deps: Set<string>;
23
+ dirty: boolean;
24
+ }
25
+ /**
26
+ * Creates a computed value definition. When used in a store definition, the store
27
+ * will run the function against the current state, track which keys were read,
28
+ * and recompute when those dependencies change. Supports chaining (computed can
29
+ * depend on other computeds). Circular dependencies are detected and throw at creation.
30
+ *
31
+ * @param fn - Function that receives the current state and returns the derived value.
32
+ * @returns A marker object that the store recognizes as a computed definition.
33
+ *
34
+ * @example
35
+ * const store = createStore({
36
+ * a: 1,
37
+ * b: 2,
38
+ * sum: computed((s) => s.a + s.b),
39
+ * });
40
+ * store.getState().sum; // 3
41
+ */
42
+ export declare function computed<T>(fn: (state: unknown) => T): ComputedValue<T>;
43
+ /**
44
+ * Tracks which top-level state keys are accessed during the execution of a computed function.
45
+ * Runs the function against a shallow Proxy of the state and returns the result plus the set of keys read.
46
+ * Used internally by the store for dependency tracking and dirty marking.
47
+ *
48
+ * @param state - Current state object (base + resolved computeds).
49
+ * @param fn - The computed function to run.
50
+ * @returns The computed result and a Set of dependency keys (top-level only).
51
+ */
52
+ export declare function trackDependencies<S extends object, T>(state: S, fn: (state: S) => T): {
53
+ result: T;
54
+ deps: Set<string>;
55
+ };
56
+ //# sourceMappingURL=computed.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"computed.d.ts","sourceRoot":"","sources":["../src/computed.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,kFAAkF;AAClF,eAAO,MAAM,eAAe,EAAG,eAAwB,CAAC;AAExD;;;GAGG;AACH,MAAM,MAAM,aAAa,CAAC,CAAC,IAAI;IAC3B,CAAC,eAAe,CAAC,EAAE,IAAI,CAAC;IACxB,EAAE,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,CAAC,CAAC;CAC7B,CAAC;AAEF;;;GAGG;AACH,MAAM,WAAW,cAAc,CAAC,CAAC;IAC7B,EAAE,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,CAAC,CAAC;IAC1B,KAAK,EAAE,CAAC,CAAC;IACT,IAAI,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IAClB,KAAK,EAAE,OAAO,CAAC;CAClB;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,QAAQ,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,CAAC,GAAG,aAAa,CAAC,CAAC,CAAC,CAKvE;AAED;;;;;;;;GAQG;AACH,wBAAgB,iBAAiB,CAAC,CAAC,SAAS,MAAM,EAAE,CAAC,EACjD,KAAK,EAAE,CAAC,EACR,EAAE,EAAE,CAAC,KAAK,EAAE,CAAC,KAAK,CAAC,GACpB;IAAE,MAAM,EAAE,CAAC,CAAC;IAAC,IAAI,EAAE,GAAG,CAAC,MAAM,CAAC,CAAA;CAAE,CAUlC"}
@@ -0,0 +1,2 @@
1
+ import{r as e}from"./registry-zaKZ1P-s.js";const t="__rf_computed";function n(e){return{[t]:!0,fn:e}}function o(e,t){const n=new Set;return{result:t(new Proxy(e,{get:(e,t)=>(n.add(t),e[t])})),deps:n}}e({key:"computed",order:1,processDefinition:e=>{const n={...e},s=new Set,r=new Map;for(const c of Object.keys(e)){const f=e[c];if(f&&"object"==typeof f&&t in f){const e=f;s.add(c),delete n[c];const{result:t,deps:d}=o(n,e.fn);r.set(c,{fn:e.fn,value:t,deps:d,dirty:!1})}}const c=Array.from(s);let f=[];if(c.length>0){const e=e=>r.get(e).deps;!function(e,t){const n=new Set(e),o=[],s=new Set;function r(e){if(o.includes(e))throw new Error(`Storve: circular dependency in computed values: ${[...o,e].join(" → ")}`);if(!s.has(e)){o.push(e);for(const o of t(e))n.has(o)&&r(o);o.pop(),s.add(e)}}for(const t of e)s.has(t)||r(t)}(c,e),f=function(e,t){const n=[],o=new Set,s=new Set(e);function r(e){if(!o.has(e)){o.add(e);for(const n of t(e))s.has(n)&&r(n);n.push(e)}}for(const t of e)r(t);return n}(c,e);for(const e of f){const t=r.get(e),{result:s,deps:c}=o(n,t.fn);t.value=s,t.deps=c,n[e]=s}}return{state:n,readOnlyKeys:s,onStateChanged:e=>{return t=e.changedKeys,n=e.getState,s=e.setComputed,f.forEach(e=>{const n=r.get(e);for(const e of n.deps)if(t.has(e)){n.dirty=!0;break}}),void f.forEach(e=>{const t=r.get(e);if(!t.dirty)return;const c=n(),{result:d,deps:a}=o(c,t.fn);t.value=d,t.deps=a,t.dirty=!1,s(e,d),f.forEach(t=>{t!==e&&r.get(t).deps.has(e)&&(r.get(t).dirty=!0)})});var t,n,s}}}});export{t as COMPUTED_MARKER,n as computed};
2
+ //# sourceMappingURL=computed.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"computed.mjs","sources":["../src/computed.ts"],"sourcesContent":[null],"names":["COMPUTED_MARKER","computed","fn","trackDependencies","state","deps","Set","result","Proxy","get","target","key","add","registerExtension","order","processDefinition","definition","computedKeys","computedEngines","Map","Object","keys","val","comp","set","value","dirty","computedKeysList","Array","from","topoOrder","length","getDeps","k","keySet","path","visited","visit","includes","Error","join","has","push","d","pop","detectCircular","topologicalSort","engine","readOnlyKeys","onStateChanged","ctx","runRecompute","changedKeys","getState","setComputed","forEach","currentState","other"],"mappings":"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"}