@storve/core 1.0.1 → 1.0.3

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 (198) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +993 -26
  3. package/dist/adapters/indexedDB.cjs +0 -1
  4. package/dist/adapters/indexedDB.mjs +0 -1
  5. package/dist/adapters/localStorage.cjs +0 -1
  6. package/dist/adapters/localStorage.mjs +0 -1
  7. package/dist/adapters/memory.cjs +0 -1
  8. package/dist/adapters/memory.mjs +0 -1
  9. package/dist/adapters/sessionStorage.cjs +0 -1
  10. package/dist/adapters/sessionStorage.mjs +0 -1
  11. package/dist/async-entry.d.ts +0 -1
  12. package/dist/async.cjs +0 -1
  13. package/dist/async.d.ts +0 -1
  14. package/dist/async.mjs +0 -1
  15. package/dist/batch.d.ts +0 -1
  16. package/dist/compose.d.ts +0 -1
  17. package/dist/computed-entry.d.ts +0 -1
  18. package/dist/computed.cjs +0 -1
  19. package/dist/computed.d.ts +0 -1
  20. package/dist/computed.mjs +0 -1
  21. package/dist/devtools/history.d.ts +0 -1
  22. package/dist/devtools/index.d.ts +0 -1
  23. package/dist/devtools/redux-bridge.d.ts +0 -1
  24. package/dist/devtools/snapshots.d.ts +0 -1
  25. package/dist/devtools/withDevtools.d.ts +0 -1
  26. package/dist/devtools.cjs +0 -1
  27. package/dist/devtools.mjs +0 -1
  28. package/dist/extensions/noop.d.ts +0 -1
  29. package/dist/index.cjs +0 -1
  30. package/dist/index.d.ts +0 -1
  31. package/dist/index.mjs +0 -1
  32. package/dist/persist/adapters/indexedDB.d.ts +0 -1
  33. package/dist/persist/adapters/localStorage.d.ts +0 -1
  34. package/dist/persist/adapters/memory.d.ts +0 -1
  35. package/dist/persist/adapters/sessionStorage.d.ts +0 -1
  36. package/dist/persist/debounce.d.ts +0 -1
  37. package/dist/persist/hydrate.d.ts +0 -1
  38. package/dist/persist/index.d.ts +0 -1
  39. package/dist/persist/serialize.d.ts +0 -1
  40. package/dist/persist.cjs +0 -1
  41. package/dist/persist.mjs +0 -1
  42. package/dist/proxy.d.ts +0 -1
  43. package/dist/registry-qtr1UpFU.js +0 -1
  44. package/dist/registry-zaKZ1P-s.js +0 -1
  45. package/dist/registry.d.ts +0 -1
  46. package/dist/signals/createSignal.d.ts +0 -1
  47. package/dist/signals/index.d.ts +0 -1
  48. package/dist/signals/useSignal.d.ts +0 -1
  49. package/dist/signals.cjs +0 -1
  50. package/dist/signals.mjs +0 -1
  51. package/dist/store.d.ts +0 -1
  52. package/dist/sync/channel.d.ts +0 -1
  53. package/dist/sync/index.d.ts +0 -1
  54. package/dist/sync/protocol.d.ts +0 -1
  55. package/dist/sync/withSync.d.ts +0 -1
  56. package/dist/sync.cjs +0 -1
  57. package/dist/sync.mjs +0 -1
  58. package/dist/types.d.ts +0 -1
  59. package/package.json +9 -3
  60. package/CHANGELOG.md +0 -151
  61. package/benchmarks/run.ts +0 -102
  62. package/benchmarks/week2.md +0 -9
  63. package/benchmarks/week2.ts +0 -64
  64. package/benchmarks/week4.md +0 -13
  65. package/benchmarks/week4.ts +0 -178
  66. package/benchmarks/week5.md +0 -15
  67. package/benchmarks/week5.ts +0 -184
  68. package/coverage/coverage-summary.json +0 -31
  69. package/dist/adapters/indexedDB.cjs.map +0 -1
  70. package/dist/adapters/indexedDB.mjs.map +0 -1
  71. package/dist/adapters/localStorage.cjs.map +0 -1
  72. package/dist/adapters/localStorage.mjs.map +0 -1
  73. package/dist/adapters/memory.cjs.map +0 -1
  74. package/dist/adapters/memory.mjs.map +0 -1
  75. package/dist/adapters/sessionStorage.cjs.map +0 -1
  76. package/dist/adapters/sessionStorage.mjs.map +0 -1
  77. package/dist/async-entry.d.ts.map +0 -1
  78. package/dist/async.cjs.map +0 -1
  79. package/dist/async.d.ts.map +0 -1
  80. package/dist/async.mjs.map +0 -1
  81. package/dist/batch.d.ts.map +0 -1
  82. package/dist/compose.d.ts.map +0 -1
  83. package/dist/computed-entry.d.ts.map +0 -1
  84. package/dist/computed.cjs.map +0 -1
  85. package/dist/computed.d.ts.map +0 -1
  86. package/dist/computed.mjs.map +0 -1
  87. package/dist/devtools/history.d.ts.map +0 -1
  88. package/dist/devtools/index.d.ts.map +0 -1
  89. package/dist/devtools/redux-bridge.d.ts.map +0 -1
  90. package/dist/devtools/snapshots.d.ts.map +0 -1
  91. package/dist/devtools/withDevtools.d.ts.map +0 -1
  92. package/dist/devtools.cjs.map +0 -1
  93. package/dist/devtools.mjs.map +0 -1
  94. package/dist/extensions/noop.d.ts.map +0 -1
  95. package/dist/index.cjs.js +0 -118
  96. package/dist/index.cjs.js.map +0 -1
  97. package/dist/index.cjs.map +0 -1
  98. package/dist/index.d.ts.map +0 -1
  99. package/dist/index.esm.js +0 -116
  100. package/dist/index.esm.js.map +0 -1
  101. package/dist/index.mjs.map +0 -1
  102. package/dist/persist/adapters/indexedDB.d.ts.map +0 -1
  103. package/dist/persist/adapters/localStorage.d.ts.map +0 -1
  104. package/dist/persist/adapters/memory.d.ts.map +0 -1
  105. package/dist/persist/adapters/sessionStorage.d.ts.map +0 -1
  106. package/dist/persist/debounce.d.ts.map +0 -1
  107. package/dist/persist/hydrate.d.ts.map +0 -1
  108. package/dist/persist/index.d.ts.map +0 -1
  109. package/dist/persist/serialize.d.ts.map +0 -1
  110. package/dist/persist.cjs.map +0 -1
  111. package/dist/persist.mjs.map +0 -1
  112. package/dist/proxy.d.ts.map +0 -1
  113. package/dist/registry-D3X0HSbl.js +0 -26
  114. package/dist/registry-D3X0HSbl.js.map +0 -1
  115. package/dist/registry-RDjbeJdx.js +0 -29
  116. package/dist/registry-RDjbeJdx.js.map +0 -1
  117. package/dist/registry-qtr1UpFU.js.map +0 -1
  118. package/dist/registry-zaKZ1P-s.js.map +0 -1
  119. package/dist/registry.d.ts.map +0 -1
  120. package/dist/signals/createSignal.d.ts.map +0 -1
  121. package/dist/signals/index.d.ts.map +0 -1
  122. package/dist/signals/useSignal.d.ts.map +0 -1
  123. package/dist/signals.cjs.map +0 -1
  124. package/dist/signals.mjs.map +0 -1
  125. package/dist/stats.html +0 -4949
  126. package/dist/store.d.ts.map +0 -1
  127. package/dist/sync/channel.d.ts.map +0 -1
  128. package/dist/sync/index.d.ts.map +0 -1
  129. package/dist/sync/protocol.d.ts.map +0 -1
  130. package/dist/sync/withSync.d.ts.map +0 -1
  131. package/dist/sync.cjs.map +0 -1
  132. package/dist/sync.mjs.map +0 -1
  133. package/dist/types.d.ts.map +0 -1
  134. package/rollup.config.mjs +0 -44
  135. package/src/async-entry.ts +0 -6
  136. package/src/async.ts +0 -240
  137. package/src/batch.ts +0 -33
  138. package/src/compose.ts +0 -50
  139. package/src/computed-entry.ts +0 -6
  140. package/src/computed.ts +0 -187
  141. package/src/devtools/history.ts +0 -103
  142. package/src/devtools/index.ts +0 -5
  143. package/src/devtools/redux-bridge.ts +0 -70
  144. package/src/devtools/snapshots.ts +0 -54
  145. package/src/devtools/withDevtools.ts +0 -196
  146. package/src/extensions/noop.ts +0 -12
  147. package/src/index.ts +0 -4
  148. package/src/persist/adapters/indexedDB.ts +0 -114
  149. package/src/persist/adapters/localStorage.ts +0 -28
  150. package/src/persist/adapters/memory.ts +0 -26
  151. package/src/persist/adapters/sessionStorage.ts +0 -28
  152. package/src/persist/debounce.ts +0 -28
  153. package/src/persist/hydrate.ts +0 -60
  154. package/src/persist/index.ts +0 -141
  155. package/src/persist/serialize.ts +0 -60
  156. package/src/proxy.ts +0 -87
  157. package/src/registry.ts +0 -67
  158. package/src/signals/createSignal.ts +0 -81
  159. package/src/signals/index.ts +0 -20
  160. package/src/signals/useSignal.ts +0 -18
  161. package/src/store.ts +0 -250
  162. package/src/sync/channel.ts +0 -15
  163. package/src/sync/index.ts +0 -3
  164. package/src/sync/protocol.ts +0 -18
  165. package/src/sync/withSync.ts +0 -147
  166. package/src/types.ts +0 -159
  167. package/tests/async.test.ts +0 -1100
  168. package/tests/batch.test.ts +0 -41
  169. package/tests/compose.test.ts +0 -209
  170. package/tests/computed.test.ts +0 -867
  171. package/tests/devtools.test.ts +0 -1039
  172. package/tests/integration/persist.integration.test.ts +0 -258
  173. package/tests/integration/signals.integration.test.ts +0 -309
  174. package/tests/integration.test.ts +0 -278
  175. package/tests/persist/adapters/indexedDB.adapter.test.ts +0 -185
  176. package/tests/persist/adapters/localStorage.adapter.test.ts +0 -105
  177. package/tests/persist/adapters/memory.adapter.test.ts +0 -112
  178. package/tests/persist/adapters/sessionStorage.adapter.test.ts +0 -128
  179. package/tests/persist/debounce.test.ts +0 -121
  180. package/tests/persist/hydrate.test.ts +0 -120
  181. package/tests/persist/migrate.test.ts +0 -208
  182. package/tests/persist/persist.test.ts +0 -357
  183. package/tests/persist/serialize.test.ts +0 -128
  184. package/tests/proxy.test.ts +0 -473
  185. package/tests/registry.test.ts +0 -67
  186. package/tests/signals/derived.test.ts +0 -244
  187. package/tests/signals/inference.test.ts +0 -108
  188. package/tests/signals/signal.test.ts +0 -348
  189. package/tests/signals/useSignal.test.tsx +0 -275
  190. package/tests/store.test.ts +0 -482
  191. package/tests/stress.test.ts +0 -268
  192. package/tests/sync.test.ts +0 -576
  193. package/tests/types.test.ts +0 -32
  194. package/tests/v0.3.test.ts +0 -813
  195. package/tree-shake-test.js +0 -1
  196. package/tsconfig.json +0 -15
  197. package/vitest.config.ts +0 -22
  198. package/vitest_play.ts +0 -7
@@ -1,41 +0,0 @@
1
- import { describe, it, expect, vi } from 'vitest'
2
- import { batch, isBatching, subscribeToBatch } from '../src/batch'
3
-
4
- describe('batch', () => {
5
- it('isBatching returns false when not in batch', () => {
6
- expect(isBatching()).toBe(false)
7
- })
8
-
9
- it('batch runs fn and notifies subscribers when batch ends', () => {
10
- const cb = vi.fn()
11
- const unsub = subscribeToBatch(cb)
12
- expect(isBatching()).toBe(false)
13
- batch(() => {
14
- expect(isBatching()).toBe(true)
15
- })
16
- expect(isBatching()).toBe(false)
17
- expect(cb).toHaveBeenCalledTimes(1)
18
- unsub()
19
- })
20
-
21
- it('unsubscribe removes callback from batch end notifications', () => {
22
- const cb = vi.fn()
23
- const unsub = subscribeToBatch(cb)
24
- batch(() => {})
25
- expect(cb).toHaveBeenCalledTimes(1)
26
- unsub()
27
- batch(() => {})
28
- expect(cb).toHaveBeenCalledTimes(1)
29
- })
30
-
31
- it('nested batch calls only notify when outermost batch ends', () => {
32
- const cb = vi.fn()
33
- const unsub = subscribeToBatch(cb)
34
- batch(() => {
35
- batch(() => {})
36
- expect(cb).not.toHaveBeenCalled()
37
- })
38
- expect(cb).toHaveBeenCalledTimes(1)
39
- unsub()
40
- })
41
- })
@@ -1,209 +0,0 @@
1
- import { describe, it, expect, vi } from 'vitest'
2
- import { createStore } from '../src/store'
3
- import { compose } from '../src/compose'
4
- import { withPersist } from '../src/persist/index'
5
- import { memoryAdapter } from '../src/persist/adapters/memory'
6
-
7
- describe('compose', () => {
8
- it('No enhancers: compose(store) returns the store unchanged', () => {
9
- const store = createStore({ count: 0 })
10
- const composed = compose(store)
11
- expect(composed).toBe(store)
12
- })
13
-
14
- it('No enhancers: returned store is the exact same reference', () => {
15
- const store = createStore({ a: 1 })
16
- const composed = compose(store)
17
- // toBe acts as exact reference check
18
- expect(composed).toBe(store)
19
- })
20
-
21
- it('Single enhancer: compose(store, enhancerA) returns enhancerA(store)', () => {
22
- const store = createStore({ count: 0 })
23
- const enhancerA = vi.fn((s: typeof store) => ({ ...s, enhanced: true }))
24
- const composed = compose(store, enhancerA)
25
-
26
- expect(enhancerA).toHaveBeenCalledWith(store)
27
- expect(composed).toHaveProperty('enhanced', true)
28
- })
29
-
30
- it('Single enhancer: returned store has the enhanced behaviour', () => {
31
- const store = createStore({ count: 0 })
32
- const enhancerA = <T extends object>(s: T) => ({ ...s, foo: 'bar' })
33
- const composed = compose(store, enhancerA)
34
- expect(composed).toHaveProperty('foo', 'bar')
35
- })
36
-
37
- it('Two enhancers: compose(store, enhancerA, enhancerB) applies A first, then B', () => {
38
- const store = createStore({ num: 0 })
39
- const calls: string[] = []
40
-
41
- const enhancerA = <T extends object>(s: T) => {
42
- calls.push('A')
43
- // @ts-expect-error testing enhancement
44
- const val = s.value ?? ''
45
- return { ...s, value: val + 'A' }
46
- }
47
- const enhancerB = <T extends object>(s: T) => {
48
- calls.push('B')
49
- // @ts-expect-error testing enhancement
50
- const val = s.value ?? ''
51
- return { ...s, value: val + 'B' }
52
- }
53
-
54
- // spy enhancer
55
- const composed = compose(store, enhancerA, enhancerB)
56
- expect(calls).toEqual(['A', 'B'])
57
- expect(composed).toHaveProperty('value', 'AB')
58
- })
59
-
60
- it('Two enhancers: enhancerB receives the output of enhancerA (not original store)', () => {
61
- const store = createStore({ num: 0 })
62
- const enhancerA = <T extends object>(s: T) => ({ ...s, stepA: true })
63
- const enhancerB = vi.fn(<T extends object>(s: T) => ({ ...s, stepB: true }))
64
-
65
- // spy enhancer
66
- compose(store, enhancerA, enhancerB)
67
- expect(enhancerB).toHaveBeenCalledWith(expect.objectContaining({ stepA: true }))
68
- })
69
-
70
- it('Two enhancers: order matters: compose(store, A, B) !== compose(store, B, A)', () => {
71
- const store = createStore({ str: '' })
72
- // @ts-expect-error dummy property
73
- const A = <T extends object>(s: T) => ({ ...s, str: (s.str ?? '') + 'A' })
74
- // @ts-expect-error dummy property
75
- const B = <T extends object>(s: T) => ({ ...s, str: (s.str ?? '') + 'B' })
76
-
77
- // spy enhancer
78
- const ab = compose(store, A, B)
79
- // spy enhancer
80
- const ba = compose(store, B, A)
81
-
82
- expect(ab).toHaveProperty('str', 'AB')
83
- expect(ba).toHaveProperty('str', 'BA')
84
- })
85
-
86
- it('Three enhancers: all three are applied in order left to right', () => {
87
- const store = createStore({ str: '' })
88
- // @ts-expect-error dummy property
89
- const A = <T extends object>(s: T) => ({ ...s, str: (s.str ?? '') + '1' })
90
- // @ts-expect-error dummy property
91
- const B = <T extends object>(s: T) => ({ ...s, str: (s.str ?? '') + '2' })
92
- // @ts-expect-error dummy property
93
- const C = <T extends object>(s: T) => ({ ...s, str: (s.str ?? '') + '3' })
94
-
95
- // spy enhancer
96
- const composed = compose(store, A, B, C)
97
- expect(composed).toHaveProperty('str', '123')
98
- })
99
-
100
- it('Three enhancers: each enhancer receives the output of the previous one', () => {
101
- const store = createStore({ count: 0 })
102
- const A = vi.fn(<T extends object>(s: T) => ({ ...s, a: 1 }))
103
- const B = vi.fn(<T extends object>(s: T) => ({ ...s, b: 2 }))
104
- const C = vi.fn(<T extends object>(s: T) => ({ ...s, c: 3 }))
105
-
106
- // spy enhancer
107
- compose(store, A, B, C)
108
-
109
- expect(B).toHaveBeenCalledWith(expect.objectContaining({ a: 1 }))
110
- expect(C).toHaveBeenCalledWith(expect.objectContaining({ a: 1, b: 2 }))
111
- })
112
-
113
- describe('Enhancer correctness', () => {
114
- it('enhancer that adds a method — method is present on composed store', () => {
115
- const store = createStore({ count: 0 })
116
- const addMethod = <T extends object>(s: T) => ({ ...s, doThing: () => 'done' })
117
- // spy enhancer
118
- const composed = compose(store, addMethod)
119
- expect(composed.doThing()).toBe('done')
120
- })
121
-
122
- it('enhancer that wraps setState — wrapped behaviour fires correctly', () => {
123
- const store = createStore({ count: 0 })
124
- let intercepted = false
125
- const wrapSetState = <T extends object>(s: T) => ({
126
- ...s,
127
- setState: (updater: unknown) => {
128
- intercepted = true
129
- // @ts-expect-error dynamic wrapper test
130
- s.setState(updater)
131
- }
132
- })
133
- // spy enhancer
134
- const composed = compose(store, wrapSetState)
135
- composed.setState({ count: 1 })
136
-
137
- expect(intercepted).toBe(true)
138
- expect(composed.getState()).toEqual({ count: 1 })
139
- })
140
-
141
- it('enhancer that wraps subscribe — subscriptions work correctly', () => {
142
- const store = createStore({ count: 0 })
143
- let customSubCalled = false
144
- const wrapSubscribe = <T extends object>(s: T) => ({
145
- ...s,
146
- subscribe: (listener: unknown) => {
147
- customSubCalled = true
148
- // @ts-expect-error dynamic wrapper test
149
- return s.subscribe(listener)
150
- }
151
- })
152
-
153
- // spy enhancer
154
- const composed = compose(store, wrapSubscribe)
155
- composed.subscribe(() => {})
156
-
157
- expect(customSubCalled).toBe(true)
158
- })
159
- })
160
-
161
- describe('Real-world scenario', () => {
162
- it('compose(createStore({count:0}), withPersist({key:\'x\', adapter: memoryAdapter(), debounce: 0})) produces a store with hydrated Promise', () => {
163
- const adapter = memoryAdapter()
164
- const composed = compose(
165
- createStore({ count: 0 }),
166
- withPersist({ key: 'x', adapter, debounce: 0 })
167
- )
168
-
169
- expect(composed.hydrated).toBeInstanceOf(Promise)
170
- })
171
-
172
- it('withPersist setState writes to adapter correctly through compose', async () => {
173
- const adapter = memoryAdapter()
174
- const composed = compose(
175
- createStore({ count: 0 }),
176
- withPersist({ key: 'x', adapter, debounce: 0 })
177
- )
178
-
179
- await composed.hydrated
180
- composed.setState({ count: 42 })
181
-
182
- const raw = await adapter.getItem('x')
183
- expect(raw).toContain('"count":42')
184
- })
185
- })
186
-
187
- describe('Type safety (runtime checks)', () => {
188
- it('composed store still satisfies Store<T> interface', () => {
189
- const store = createStore({ val: 'test' })
190
- const composed = compose(store, s => s) // identity enhancer
191
-
192
- expect(composed).toHaveProperty('getState')
193
- expect(composed).toHaveProperty('setState')
194
- expect(composed).toHaveProperty('subscribe')
195
- })
196
-
197
- it('getState, setState, subscribe all present and functional', () => {
198
- const store = createStore({ count: 0 })
199
- const composed = compose(store)
200
-
201
- const sub = vi.fn()
202
- composed.subscribe(sub)
203
- composed.setState({ count: 5 })
204
-
205
- expect(composed.getState()).toEqual({ count: 5 })
206
- expect(sub).toHaveBeenCalledWith({ count: 5 })
207
- })
208
- })
209
- })