@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.
- package/CHANGELOG.md +151 -0
- package/benchmarks/run.ts +102 -0
- package/benchmarks/week2.md +9 -0
- package/benchmarks/week2.ts +64 -0
- package/benchmarks/week4.md +13 -0
- package/benchmarks/week4.ts +178 -0
- package/benchmarks/week5.md +15 -0
- package/benchmarks/week5.ts +184 -0
- package/coverage/coverage-summary.json +31 -0
- package/dist/adapters/indexedDB.cjs +2 -0
- package/dist/adapters/indexedDB.cjs.map +1 -0
- package/dist/adapters/indexedDB.mjs +2 -0
- package/dist/adapters/indexedDB.mjs.map +1 -0
- package/dist/adapters/localStorage.cjs +2 -0
- package/dist/adapters/localStorage.cjs.map +1 -0
- package/dist/adapters/localStorage.mjs +2 -0
- package/dist/adapters/localStorage.mjs.map +1 -0
- package/dist/adapters/memory.cjs +2 -0
- package/dist/adapters/memory.cjs.map +1 -0
- package/dist/adapters/memory.mjs +2 -0
- package/dist/adapters/memory.mjs.map +1 -0
- package/dist/adapters/sessionStorage.cjs +2 -0
- package/dist/adapters/sessionStorage.cjs.map +1 -0
- package/dist/adapters/sessionStorage.mjs +2 -0
- package/dist/adapters/sessionStorage.mjs.map +1 -0
- package/dist/async-entry.d.ts +7 -0
- package/dist/async-entry.d.ts.map +1 -0
- package/dist/async.cjs +2 -0
- package/dist/async.cjs.map +1 -0
- package/dist/async.d.ts +52 -0
- package/dist/async.d.ts.map +1 -0
- package/dist/async.mjs +2 -0
- package/dist/async.mjs.map +1 -0
- package/dist/batch.d.ts +12 -0
- package/dist/batch.d.ts.map +1 -0
- package/dist/compose.d.ts +7 -0
- package/dist/compose.d.ts.map +1 -0
- package/dist/computed-entry.d.ts +7 -0
- package/dist/computed-entry.d.ts.map +1 -0
- package/dist/computed.cjs +2 -0
- package/dist/computed.cjs.map +1 -0
- package/dist/computed.d.ts +56 -0
- package/dist/computed.d.ts.map +1 -0
- package/dist/computed.mjs +2 -0
- package/dist/computed.mjs.map +1 -0
- package/dist/devtools/history.d.ts +51 -0
- package/dist/devtools/history.d.ts.map +1 -0
- package/dist/devtools/index.d.ts +5 -0
- package/dist/devtools/index.d.ts.map +1 -0
- package/dist/devtools/redux-bridge.d.ts +21 -0
- package/dist/devtools/redux-bridge.d.ts.map +1 -0
- package/dist/devtools/snapshots.d.ts +32 -0
- package/dist/devtools/snapshots.d.ts.map +1 -0
- package/dist/devtools/withDevtools.d.ts +17 -0
- package/dist/devtools/withDevtools.d.ts.map +1 -0
- package/dist/devtools.cjs +2 -0
- package/dist/devtools.cjs.map +1 -0
- package/dist/devtools.mjs +2 -0
- package/dist/devtools.mjs.map +1 -0
- package/dist/extensions/noop.d.ts +2 -0
- package/dist/extensions/noop.d.ts.map +1 -0
- package/dist/index.cjs +2 -0
- package/dist/index.cjs.js +118 -0
- package/dist/index.cjs.js.map +1 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.ts +5 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.esm.js +116 -0
- package/dist/index.esm.js.map +1 -0
- package/dist/index.mjs +2 -0
- package/dist/index.mjs.map +1 -0
- package/dist/persist/adapters/indexedDB.d.ts +12 -0
- package/dist/persist/adapters/indexedDB.d.ts.map +1 -0
- package/dist/persist/adapters/localStorage.d.ts +11 -0
- package/dist/persist/adapters/localStorage.d.ts.map +1 -0
- package/dist/persist/adapters/memory.d.ts +11 -0
- package/dist/persist/adapters/memory.d.ts.map +1 -0
- package/dist/persist/adapters/sessionStorage.d.ts +11 -0
- package/dist/persist/adapters/sessionStorage.d.ts.map +1 -0
- package/dist/persist/debounce.d.ts +12 -0
- package/dist/persist/debounce.d.ts.map +1 -0
- package/dist/persist/hydrate.d.ts +15 -0
- package/dist/persist/hydrate.d.ts.map +1 -0
- package/dist/persist/index.d.ts +34 -0
- package/dist/persist/index.d.ts.map +1 -0
- package/dist/persist/serialize.d.ts +28 -0
- package/dist/persist/serialize.d.ts.map +1 -0
- package/dist/persist.cjs +2 -0
- package/dist/persist.cjs.map +1 -0
- package/dist/persist.mjs +2 -0
- package/dist/persist.mjs.map +1 -0
- package/dist/proxy.d.ts +2 -0
- package/dist/proxy.d.ts.map +1 -0
- package/dist/registry-D3X0HSbl.js +26 -0
- package/dist/registry-D3X0HSbl.js.map +1 -0
- package/dist/registry-RDjbeJdx.js +29 -0
- package/dist/registry-RDjbeJdx.js.map +1 -0
- package/dist/registry-qtr1UpFU.js +2 -0
- package/dist/registry-qtr1UpFU.js.map +1 -0
- package/dist/registry-zaKZ1P-s.js +2 -0
- package/dist/registry-zaKZ1P-s.js.map +1 -0
- package/dist/registry.d.ts +54 -0
- package/dist/registry.d.ts.map +1 -0
- package/dist/signals/createSignal.d.ts +19 -0
- package/dist/signals/createSignal.d.ts.map +1 -0
- package/dist/signals/index.d.ts +20 -0
- package/dist/signals/index.d.ts.map +1 -0
- package/dist/signals/useSignal.d.ts +11 -0
- package/dist/signals/useSignal.d.ts.map +1 -0
- package/dist/signals.cjs +2 -0
- package/dist/signals.cjs.map +1 -0
- package/dist/signals.mjs +2 -0
- package/dist/signals.mjs.map +1 -0
- package/dist/stats.html +4949 -0
- package/dist/store.d.ts +12 -0
- package/dist/store.d.ts.map +1 -0
- package/dist/sync/channel.d.ts +7 -0
- package/dist/sync/channel.d.ts.map +1 -0
- package/dist/sync/index.d.ts +3 -0
- package/dist/sync/index.d.ts.map +1 -0
- package/dist/sync/protocol.d.ts +22 -0
- package/dist/sync/protocol.d.ts.map +1 -0
- package/dist/sync/withSync.d.ts +17 -0
- package/dist/sync/withSync.d.ts.map +1 -0
- package/dist/sync.cjs +2 -0
- package/dist/sync.cjs.map +1 -0
- package/dist/sync.mjs +2 -0
- package/dist/sync.mjs.map +1 -0
- package/dist/types.d.ts +134 -0
- package/dist/types.d.ts.map +1 -0
- package/package.json +91 -0
- package/rollup.config.mjs +44 -0
- package/src/async-entry.ts +6 -0
- package/src/async.ts +240 -0
- package/src/batch.ts +33 -0
- package/src/compose.ts +50 -0
- package/src/computed-entry.ts +6 -0
- package/src/computed.ts +187 -0
- package/src/devtools/history.ts +103 -0
- package/src/devtools/index.ts +5 -0
- package/src/devtools/redux-bridge.ts +70 -0
- package/src/devtools/snapshots.ts +54 -0
- package/src/devtools/withDevtools.ts +196 -0
- package/src/extensions/noop.ts +12 -0
- package/src/index.ts +4 -0
- package/src/persist/adapters/indexedDB.ts +114 -0
- package/src/persist/adapters/localStorage.ts +28 -0
- package/src/persist/adapters/memory.ts +26 -0
- package/src/persist/adapters/sessionStorage.ts +28 -0
- package/src/persist/debounce.ts +28 -0
- package/src/persist/hydrate.ts +60 -0
- package/src/persist/index.ts +141 -0
- package/src/persist/serialize.ts +60 -0
- package/src/proxy.ts +87 -0
- package/src/registry.ts +67 -0
- package/src/signals/createSignal.ts +81 -0
- package/src/signals/index.ts +20 -0
- package/src/signals/useSignal.ts +18 -0
- package/src/store.ts +250 -0
- package/src/sync/channel.ts +15 -0
- package/src/sync/index.ts +3 -0
- package/src/sync/protocol.ts +18 -0
- package/src/sync/withSync.ts +147 -0
- package/src/types.ts +159 -0
- package/tests/async.test.ts +1100 -0
- package/tests/batch.test.ts +41 -0
- package/tests/compose.test.ts +209 -0
- package/tests/computed.test.ts +867 -0
- package/tests/devtools.test.ts +1039 -0
- package/tests/integration/persist.integration.test.ts +258 -0
- package/tests/integration/signals.integration.test.ts +309 -0
- package/tests/integration.test.ts +278 -0
- package/tests/persist/adapters/indexedDB.adapter.test.ts +185 -0
- package/tests/persist/adapters/localStorage.adapter.test.ts +105 -0
- package/tests/persist/adapters/memory.adapter.test.ts +112 -0
- package/tests/persist/adapters/sessionStorage.adapter.test.ts +128 -0
- package/tests/persist/debounce.test.ts +121 -0
- package/tests/persist/hydrate.test.ts +120 -0
- package/tests/persist/migrate.test.ts +208 -0
- package/tests/persist/persist.test.ts +357 -0
- package/tests/persist/serialize.test.ts +128 -0
- package/tests/proxy.test.ts +473 -0
- package/tests/registry.test.ts +67 -0
- package/tests/signals/derived.test.ts +244 -0
- package/tests/signals/inference.test.ts +108 -0
- package/tests/signals/signal.test.ts +348 -0
- package/tests/signals/useSignal.test.tsx +275 -0
- package/tests/store.test.ts +482 -0
- package/tests/stress.test.ts +268 -0
- package/tests/sync.test.ts +576 -0
- package/tests/types.test.ts +32 -0
- package/tests/v0.3.test.ts +813 -0
- package/tree-shake-test.js +1 -0
- package/tsconfig.json +15 -0
- package/vitest.config.ts +22 -0
- 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 @@
|
|
|
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 @@
|
|
|
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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"}
|
package/dist/async.d.ts
ADDED
|
@@ -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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"}
|
package/dist/batch.d.ts
ADDED
|
@@ -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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"}
|