@derivesome/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 (217) hide show
  1. package/.README.md.~undo-tree~ +4 -0
  2. package/.package.json.~undo-tree~ +30 -0
  3. package/.tsconfig.cjs.json.~undo-tree~ +8 -0
  4. package/.tsconfig.json.~undo-tree~ +14 -0
  5. package/README.md +355 -0
  6. package/README.md~ +355 -0
  7. package/dist/cjs/array-proxy.d.ts +56 -0
  8. package/dist/cjs/array-proxy.d.ts.map +1 -0
  9. package/dist/cjs/array-proxy.js +72 -0
  10. package/dist/cjs/array-proxy.js.map +1 -0
  11. package/dist/cjs/common/array.d.ts +11 -0
  12. package/dist/cjs/common/array.d.ts.map +1 -0
  13. package/dist/cjs/common/array.js +57 -0
  14. package/dist/cjs/common/array.js.map +1 -0
  15. package/dist/cjs/common/compare.d.ts +2 -0
  16. package/dist/cjs/common/compare.d.ts.map +1 -0
  17. package/dist/cjs/common/compare.js +8 -0
  18. package/dist/cjs/common/compare.js.map +1 -0
  19. package/dist/cjs/common/diff.d.ts +9 -0
  20. package/dist/cjs/common/diff.d.ts.map +1 -0
  21. package/dist/cjs/common/diff.js +63 -0
  22. package/dist/cjs/common/diff.js.map +1 -0
  23. package/dist/cjs/common/has.d.ts +4 -0
  24. package/dist/cjs/common/has.d.ts.map +1 -0
  25. package/dist/cjs/common/has.js +11 -0
  26. package/dist/cjs/common/has.js.map +1 -0
  27. package/dist/cjs/common/index.d.ts +12 -0
  28. package/dist/cjs/common/index.d.ts.map +1 -0
  29. package/dist/cjs/common/index.js +28 -0
  30. package/dist/cjs/common/index.js.map +1 -0
  31. package/dist/cjs/common/is.d.ts +5 -0
  32. package/dist/cjs/common/is.d.ts.map +1 -0
  33. package/dist/cjs/common/is.js +18 -0
  34. package/dist/cjs/common/is.js.map +1 -0
  35. package/dist/cjs/common/match.d.ts +23 -0
  36. package/dist/cjs/common/match.d.ts.map +1 -0
  37. package/dist/cjs/common/match.js +49 -0
  38. package/dist/cjs/common/match.js.map +1 -0
  39. package/dist/cjs/common/patch.d.ts +3 -0
  40. package/dist/cjs/common/patch.d.ts.map +1 -0
  41. package/dist/cjs/common/patch.js +44 -0
  42. package/dist/cjs/common/patch.js.map +1 -0
  43. package/dist/cjs/common/stack.d.ts +8 -0
  44. package/dist/cjs/common/stack.d.ts.map +1 -0
  45. package/dist/cjs/common/stack.js +24 -0
  46. package/dist/cjs/common/stack.js.map +1 -0
  47. package/dist/cjs/common/string.d.ts +2 -0
  48. package/dist/cjs/common/string.d.ts.map +1 -0
  49. package/dist/cjs/common/string.js +36 -0
  50. package/dist/cjs/common/string.js.map +1 -0
  51. package/dist/cjs/common/types.d.ts +27 -0
  52. package/dist/cjs/common/types.d.ts.map +1 -0
  53. package/dist/cjs/common/types.js +3 -0
  54. package/dist/cjs/common/types.js.map +1 -0
  55. package/dist/cjs/common/unique-array.d.ts +17 -0
  56. package/dist/cjs/common/unique-array.d.ts.map +1 -0
  57. package/dist/cjs/common/unique-array.js +73 -0
  58. package/dist/cjs/common/unique-array.js.map +1 -0
  59. package/dist/cjs/context.d.ts +15 -0
  60. package/dist/cjs/context.d.ts.map +1 -0
  61. package/dist/cjs/context.js +33 -0
  62. package/dist/cjs/context.js.map +1 -0
  63. package/dist/cjs/derived.d.ts +11 -0
  64. package/dist/cjs/derived.d.ts.map +1 -0
  65. package/dist/cjs/derived.js +26 -0
  66. package/dist/cjs/derived.js.map +1 -0
  67. package/dist/cjs/effect.d.ts +7 -0
  68. package/dist/cjs/effect.d.ts.map +1 -0
  69. package/dist/cjs/effect.js +7 -0
  70. package/dist/cjs/effect.js.map +1 -0
  71. package/dist/cjs/index.d.ts +8 -0
  72. package/dist/cjs/index.d.ts.map +1 -0
  73. package/dist/cjs/index.js +24 -0
  74. package/dist/cjs/index.js.map +1 -0
  75. package/dist/cjs/observable.d.ts +12 -0
  76. package/dist/cjs/observable.d.ts.map +1 -0
  77. package/dist/cjs/observable.js +24 -0
  78. package/dist/cjs/observable.js.map +1 -0
  79. package/dist/cjs/pubsub.d.ts +11 -0
  80. package/dist/cjs/pubsub.d.ts.map +1 -0
  81. package/dist/cjs/pubsub.js +50 -0
  82. package/dist/cjs/pubsub.js.map +1 -0
  83. package/dist/cjs/reference.d.ts +15 -0
  84. package/dist/cjs/reference.d.ts.map +1 -0
  85. package/dist/cjs/reference.js +49 -0
  86. package/dist/cjs/reference.js.map +1 -0
  87. package/dist/cjs/utils/findRefs.d.ts +3 -0
  88. package/dist/cjs/utils/findRefs.d.ts.map +1 -0
  89. package/dist/cjs/utils/findRefs.js +23 -0
  90. package/dist/cjs/utils/findRefs.js.map +1 -0
  91. package/dist/cjs/utils/index.d.ts +2 -0
  92. package/dist/cjs/utils/index.d.ts.map +1 -0
  93. package/dist/cjs/utils/index.js +18 -0
  94. package/dist/cjs/utils/index.js.map +1 -0
  95. package/dist/esm/array-proxy.d.ts +56 -0
  96. package/dist/esm/array-proxy.d.ts.map +1 -0
  97. package/dist/esm/array-proxy.js +68 -0
  98. package/dist/esm/array-proxy.js.map +1 -0
  99. package/dist/esm/common/array.d.ts +11 -0
  100. package/dist/esm/common/array.d.ts.map +1 -0
  101. package/dist/esm/common/array.js +48 -0
  102. package/dist/esm/common/array.js.map +1 -0
  103. package/dist/esm/common/compare.d.ts +2 -0
  104. package/dist/esm/common/compare.d.ts.map +1 -0
  105. package/dist/esm/common/compare.js +4 -0
  106. package/dist/esm/common/compare.js.map +1 -0
  107. package/dist/esm/common/diff.d.ts +9 -0
  108. package/dist/esm/common/diff.d.ts.map +1 -0
  109. package/dist/esm/common/diff.js +59 -0
  110. package/dist/esm/common/diff.js.map +1 -0
  111. package/dist/esm/common/has.d.ts +4 -0
  112. package/dist/esm/common/has.d.ts.map +1 -0
  113. package/dist/esm/common/has.js +8 -0
  114. package/dist/esm/common/has.js.map +1 -0
  115. package/dist/esm/common/index.d.ts +12 -0
  116. package/dist/esm/common/index.d.ts.map +1 -0
  117. package/dist/esm/common/index.js +12 -0
  118. package/dist/esm/common/index.js.map +1 -0
  119. package/dist/esm/common/is.d.ts +5 -0
  120. package/dist/esm/common/is.d.ts.map +1 -0
  121. package/dist/esm/common/is.js +13 -0
  122. package/dist/esm/common/is.js.map +1 -0
  123. package/dist/esm/common/match.d.ts +23 -0
  124. package/dist/esm/common/match.d.ts.map +1 -0
  125. package/dist/esm/common/match.js +46 -0
  126. package/dist/esm/common/match.js.map +1 -0
  127. package/dist/esm/common/patch.d.ts +3 -0
  128. package/dist/esm/common/patch.d.ts.map +1 -0
  129. package/dist/esm/common/patch.js +40 -0
  130. package/dist/esm/common/patch.js.map +1 -0
  131. package/dist/esm/common/stack.d.ts +8 -0
  132. package/dist/esm/common/stack.d.ts.map +1 -0
  133. package/dist/esm/common/stack.js +20 -0
  134. package/dist/esm/common/stack.js.map +1 -0
  135. package/dist/esm/common/string.d.ts +2 -0
  136. package/dist/esm/common/string.d.ts.map +1 -0
  137. package/dist/esm/common/string.js +32 -0
  138. package/dist/esm/common/string.js.map +1 -0
  139. package/dist/esm/common/types.d.ts +27 -0
  140. package/dist/esm/common/types.d.ts.map +1 -0
  141. package/dist/esm/common/types.js +2 -0
  142. package/dist/esm/common/types.js.map +1 -0
  143. package/dist/esm/common/unique-array.d.ts +17 -0
  144. package/dist/esm/common/unique-array.d.ts.map +1 -0
  145. package/dist/esm/common/unique-array.js +69 -0
  146. package/dist/esm/common/unique-array.js.map +1 -0
  147. package/dist/esm/context.d.ts +15 -0
  148. package/dist/esm/context.d.ts.map +1 -0
  149. package/dist/esm/context.js +28 -0
  150. package/dist/esm/context.js.map +1 -0
  151. package/dist/esm/derived.d.ts +11 -0
  152. package/dist/esm/derived.d.ts.map +1 -0
  153. package/dist/esm/derived.js +21 -0
  154. package/dist/esm/derived.js.map +1 -0
  155. package/dist/esm/effect.d.ts +7 -0
  156. package/dist/esm/effect.d.ts.map +1 -0
  157. package/dist/esm/effect.js +3 -0
  158. package/dist/esm/effect.js.map +1 -0
  159. package/dist/esm/index.d.ts +8 -0
  160. package/dist/esm/index.d.ts.map +1 -0
  161. package/dist/esm/index.js +8 -0
  162. package/dist/esm/index.js.map +1 -0
  163. package/dist/esm/observable.d.ts +12 -0
  164. package/dist/esm/observable.d.ts.map +1 -0
  165. package/dist/esm/observable.js +19 -0
  166. package/dist/esm/observable.js.map +1 -0
  167. package/dist/esm/package.json +1 -0
  168. package/dist/esm/pubsub.d.ts +11 -0
  169. package/dist/esm/pubsub.d.ts.map +1 -0
  170. package/dist/esm/pubsub.js +47 -0
  171. package/dist/esm/pubsub.js.map +1 -0
  172. package/dist/esm/reference.d.ts +15 -0
  173. package/dist/esm/reference.d.ts.map +1 -0
  174. package/dist/esm/reference.js +44 -0
  175. package/dist/esm/reference.js.map +1 -0
  176. package/dist/esm/utils/findRefs.d.ts +3 -0
  177. package/dist/esm/utils/findRefs.d.ts.map +1 -0
  178. package/dist/esm/utils/findRefs.js +19 -0
  179. package/dist/esm/utils/findRefs.js.map +1 -0
  180. package/dist/esm/utils/index.d.ts +2 -0
  181. package/dist/esm/utils/index.d.ts.map +1 -0
  182. package/dist/esm/utils/index.js +2 -0
  183. package/dist/esm/utils/index.js.map +1 -0
  184. package/package.json +41 -0
  185. package/package.json~ +42 -0
  186. package/src/array-proxy.ts +94 -0
  187. package/src/common/array.ts +72 -0
  188. package/src/common/compare.ts +3 -0
  189. package/src/common/diff.test.ts +114 -0
  190. package/src/common/diff.ts +85 -0
  191. package/src/common/has.ts +7 -0
  192. package/src/common/index.ts +11 -0
  193. package/src/common/is.ts +14 -0
  194. package/src/common/match.ts +90 -0
  195. package/src/common/patch.test.ts +118 -0
  196. package/src/common/patch.ts +47 -0
  197. package/src/common/stack.ts +22 -0
  198. package/src/common/string.test.ts +46 -0
  199. package/src/common/string.ts +35 -0
  200. package/src/common/types.ts +61 -0
  201. package/src/common/unique-array.ts +80 -0
  202. package/src/context.ts +36 -0
  203. package/src/derived.test.ts +45 -0
  204. package/src/derived.ts +35 -0
  205. package/src/effect.ts +9 -0
  206. package/src/index.ts +7 -0
  207. package/src/observable.ts +40 -0
  208. package/src/pubsub.test.ts +29 -0
  209. package/src/pubsub.ts +71 -0
  210. package/src/reference.test.ts +32 -0
  211. package/src/reference.ts +63 -0
  212. package/src/utils/findRefs.ts +22 -0
  213. package/src/utils/index.ts +1 -0
  214. package/tsconfig.cjs.json +8 -0
  215. package/tsconfig.cjs.json~ +0 -0
  216. package/tsconfig.json +24 -0
  217. package/tsconfig.json~ +24 -0
package/README.md~ ADDED
@@ -0,0 +1,355 @@
1
+ # @derivesome/core
2
+
3
+ A lightweight reactive state management library with automatic dependency tracking.
4
+
5
+ ## Table of Contents
6
+
7
+ - [Core Concepts](#core-concepts)
8
+ - [ref](#ref)
9
+ - [derived](#derived)
10
+ - [effect](#effect)
11
+ - [Observable / observe](#observable--observe)
12
+ - [PubSub](#pubsub)
13
+ - [ArrayProxy](#arrayproxy)
14
+ - [Utilities](#utilities)
15
+ - [findRefs](#findrefs)
16
+ - [match](#match)
17
+ - [diff / patch](#diff--patch)
18
+ - [Stack](#stack)
19
+
20
+ ---
21
+
22
+ ## Core Concepts
23
+
24
+ Reactivity is built on **automatic dependency tracking**. When a `ref.get()` is called inside an `effect` or `derived`, that ref registers the running effect as a subscriber. When the ref's value changes, all subscribed effects re-run automatically. This means you never manually declare dependencies — the system infers them at runtime.
25
+
26
+ ---
27
+
28
+ ## ref
29
+
30
+ `ref(value)` creates a reactive reference holding a single value.
31
+
32
+ ```ts
33
+ import { ref } from '@derivesome/core';
34
+
35
+ const count = ref(0);
36
+
37
+ count.get(); // read and subscribe (inside an effect/derived)
38
+ count.peek(); // read without subscribing
39
+ count.set(1); // update value — notifies subscribers only if value changed
40
+ count.set(n => n + 1); // functional update
41
+ ```
42
+
43
+ Values are compared with strict equality (`===`). If the new value is the same as the previous one, no notification is sent.
44
+
45
+ `ref` also supports `dispose()` to remove all subscribers and effects:
46
+
47
+ ```ts
48
+ count.dispose(); // tears down all subscriptions
49
+ ```
50
+
51
+ ### isReference
52
+
53
+ ```ts
54
+ import { isReference } from '@derivesome/core';
55
+
56
+ isReference(count); // true
57
+ isReference(42); // false
58
+ ```
59
+
60
+ ---
61
+
62
+ ## derived
63
+
64
+ `derived(fn)` creates a computed value that re-evaluates automatically when its reactive dependencies change. It is itself a `Reference`, so it can be used anywhere a ref can.
65
+
66
+ ```ts
67
+ import { ref, derived } from '@derivesome/core';
68
+
69
+ const count = ref(0);
70
+ const doubled = derived(() => count.get() * 2);
71
+ const label = derived(() => `Count is: ${doubled.get()}`);
72
+
73
+ doubled.peek(); // 0
74
+ count.set(5);
75
+ doubled.peek(); // 10
76
+ label.peek(); // "Count is: 10"
77
+ ```
78
+
79
+ Dependencies are tracked dynamically per evaluation. If a branch is not taken, its refs are not subscribed:
80
+
81
+ ```ts
82
+ const enabled = ref(false);
83
+ const value = ref(42);
84
+
85
+ const result = derived(() => {
86
+ if (!enabled.get()) return -1;
87
+ return value.get() * 2; // only subscribed when enabled is true
88
+ });
89
+ ```
90
+
91
+ ### isDerived
92
+
93
+ ```ts
94
+ import { isDerived } from '@derivesome/core';
95
+
96
+ isDerived(doubled); // true
97
+ isDerived(count); // false
98
+ ```
99
+
100
+ ---
101
+
102
+ ## effect
103
+
104
+ `effect(fn)` runs a function immediately and re-runs it whenever any `ref.get()` called inside it changes.
105
+
106
+ ```ts
107
+ import { ref, effect } from '@derivesome/core';
108
+
109
+ const name = ref('Alice');
110
+
111
+ effect(() => {
112
+ console.log('Hello,', name.get());
113
+ });
114
+ // logs: "Hello, Alice"
115
+
116
+ name.set('Bob');
117
+ // logs: "Hello, Bob"
118
+ ```
119
+
120
+ Effects are the primary way to cause side effects in response to reactive state changes. Unlike `derived`, they don't return a value.
121
+
122
+ ---
123
+
124
+ ## Observable / observe
125
+
126
+ Every `ref` implements the `Observable` interface, which provides `observe` — a way to subscribe to value changes outside of the effect/derived system.
127
+
128
+ ```ts
129
+ import { ref } from '@derivesome/core';
130
+
131
+ const count = ref(0);
132
+
133
+ const unsubscribe = count.observe((value) => {
134
+ console.log('count changed to', value);
135
+ });
136
+
137
+ count.set(1); // logs: "count changed to 1"
138
+
139
+ unsubscribe(); // stop listening
140
+
141
+ count.set(2); // nothing logged
142
+ ```
143
+
144
+ `observe` accepts an optional options object:
145
+
146
+ ```ts
147
+ count.observe(
148
+ (value) => console.log(value),
149
+ {
150
+ immediate: true, // call the callback immediately with the current value
151
+ cleanup: () => { // called when the subscription is removed
152
+ console.log('cleaned up');
153
+ },
154
+ }
155
+ );
156
+ ```
157
+
158
+ ### isObservable
159
+
160
+ ```ts
161
+ import { isObservable } from '@derivesome/core';
162
+
163
+ isObservable(count); // true
164
+ ```
165
+
166
+ ---
167
+
168
+ ## PubSub
169
+
170
+ `pubsub()` is the low-level primitive underlying `ref`. It provides a typed publish/subscribe channel with no built-in value storage.
171
+
172
+ ```ts
173
+ import { pubsub } from '@derivesome/core';
174
+
175
+ const ps = pubsub<number>();
176
+
177
+ const unsub = ps.subscribe((value) => {
178
+ console.log('received', value);
179
+ });
180
+
181
+ ps.publish(42); // logs: "received 42"
182
+
183
+ unsub(); // unsubscribe
184
+
185
+ ps.publish(99); // nothing logged
186
+
187
+ ps.dispose(); // remove all subscribers and effects
188
+ ```
189
+
190
+ `addEffect` registers a function that participates in the reactive context system (re-runs through `Context.runEffect`):
191
+
192
+ ```ts
193
+ ps.addEffect(() => {
194
+ // re-run as a tracked effect when published
195
+ });
196
+ ```
197
+
198
+ ---
199
+
200
+ ## ArrayProxy
201
+
202
+ `ArrayProxy<T>` extends the native `Array` and emits a typed mutation event whenever the array is modified. Useful for building reactive list state.
203
+
204
+ ```ts
205
+ import { ArrayProxy } from '@derivesome/core';
206
+
207
+ const items = new ArrayProxy('a', 'b', 'c');
208
+
209
+ const unsub = items.subscribe((mutation) => {
210
+ console.log(mutation);
211
+ });
212
+
213
+ items.push('d');
214
+ // { type: 'push', items: ['d'] }
215
+
216
+ items.pop();
217
+ // { type: 'pop', removed: 'd' }
218
+
219
+ items.splice(0, 1, 'z');
220
+ // { type: 'splice', start: 0, deleteCount: 1, removed: ['a'], added: ['z'] }
221
+
222
+ items.set(0, 'x');
223
+ // { type: 'set', index: 0, value: 'x' }
224
+
225
+ items.sort();
226
+ // { type: 'sort' }
227
+
228
+ items.reverse();
229
+ // { type: 'reverse' }
230
+
231
+ items.dispose(); // remove all subscribers
232
+ ```
233
+
234
+ ### Mutation types
235
+
236
+ | Method | Mutation type | Extra fields |
237
+ |---------------|----------------|-------------------------------------------------|
238
+ | `push` | `push` | `items: T[]` |
239
+ | `pop` | `pop` | `removed: T \| undefined` |
240
+ | `shift` | `shift` | `removed: T \| undefined` |
241
+ | `unshift` | `unshift` | `items: T[]` |
242
+ | `splice` | `splice` | `start`, `deleteCount`, `removed`, `added` |
243
+ | `sort` | `sort` | — |
244
+ | `reverse` | `reverse` | — |
245
+ | `fill` | `fill` | `value`, `start`, `end` |
246
+ | `copyWithin` | `copyWithin` | `target`, `start`, `end` |
247
+ | `.set(i, v)` | `set` | `index`, `value` |
248
+
249
+ ---
250
+
251
+ ## Utilities
252
+
253
+ ### findRefs
254
+
255
+ Recursively walks any value (object, array, or primitive) and returns all `Reference` instances found within it.
256
+
257
+ ```ts
258
+ import { ref, findRefs } from '@derivesome/core';
259
+
260
+ const a = ref(1);
261
+ const b = ref(2);
262
+
263
+ findRefs({ a, b, nested: { c: ref(3) } });
264
+ // [Reference<1>, Reference<2>, Reference<3>]
265
+
266
+ findRefs([a, b]);
267
+ // [Reference<1>, Reference<2>]
268
+
269
+ findRefs(42); // []
270
+ ```
271
+
272
+ ---
273
+
274
+ ### match
275
+
276
+ `match(input, pattern)` is a structural pattern matching utility. It checks whether `input` structurally matches `pattern`, working as a type guard.
277
+
278
+ ```ts
279
+ import { match } from '@derivesome/core';
280
+
281
+ // Primitive matching
282
+ match('hello', 'hello'); // true
283
+ match(42, 42); // true
284
+ match(42, 99); // false
285
+
286
+ // Object structural matching (partial — only pattern keys are checked)
287
+ const user = { role: 'admin', name: 'Alice' };
288
+ match(user, { role: 'admin' }); // true — narrows type
289
+ match(user, { role: 'guest' }); // false
290
+
291
+ // Array matching (positional)
292
+ match([1, 2, 3], [1, 2]); // true (pattern checked index-by-index)
293
+
294
+ // Type narrowing
295
+ type Shape =
296
+ | { kind: 'circle'; radius: number }
297
+ | { kind: 'square'; side: number };
298
+
299
+ function area(shape: Shape): number {
300
+ if (match(shape, { kind: 'circle' as const })) {
301
+ return Math.PI * shape.radius ** 2; // shape is narrowed to circle
302
+ }
303
+ return shape.side ** 2;
304
+ }
305
+ ```
306
+
307
+ ---
308
+
309
+ ### diff / patch
310
+
311
+ `diff(a, b)` computes a list of structural differences between two values. `patch(target, diffs)` applies those diffs to produce a new value.
312
+
313
+ ```ts
314
+ import { diff, patch } from '@derivesome/core';
315
+
316
+ const a = { x: 1, y: 2 };
317
+ const b = { x: 1, y: 3, z: 4 };
318
+
319
+ const diffs = diff(a, b);
320
+ // [
321
+ // { type: 'changed', path: ['y'], oldValue: 2, newValue: 3 },
322
+ // { type: 'added', path: ['z'], newValue: 4 },
323
+ // ]
324
+
325
+ const result = patch({ ...a }, diffs);
326
+ // { x: 1, y: 3, z: 4 }
327
+ ```
328
+
329
+ Works recursively on nested objects and arrays:
330
+
331
+ ```ts
332
+ diff([1, 2, 3], [1, 2, 3, 4]);
333
+ // [{ type: 'added', path: [3], newValue: 4 }]
334
+
335
+ diff({ a: { b: 1 } }, { a: { b: 2 } });
336
+ // [{ type: 'changed', path: ['a', 'b'], oldValue: 1, newValue: 2 }]
337
+ ```
338
+
339
+ ---
340
+
341
+ ### Stack
342
+
343
+ A simple typed stack used internally by the context system. Exported for external use.
344
+
345
+ ```ts
346
+ import { Stack } from '@derivesome/core';
347
+
348
+ const stack = new Stack([1, 2, 3]);
349
+
350
+ stack.current; // 3 (top of stack)
351
+ stack.push(4);
352
+ stack.current; // 4
353
+ stack.pop(); // 4
354
+ stack.current; // 3
355
+ ```
@@ -0,0 +1,56 @@
1
+ import { PubSub } from "./pubsub";
2
+ import { VoidFunction } from "./common/types";
3
+ export type ArrayMutation<T> = {
4
+ type: "push";
5
+ items: T[];
6
+ } | {
7
+ type: "pop";
8
+ removed: T | undefined;
9
+ } | {
10
+ type: "shift";
11
+ removed: T | undefined;
12
+ } | {
13
+ type: "unshift";
14
+ items: T[];
15
+ } | {
16
+ type: "splice";
17
+ start: number;
18
+ deleteCount: number;
19
+ removed: T[];
20
+ added: T[];
21
+ } | {
22
+ type: "sort";
23
+ } | {
24
+ type: "reverse";
25
+ } | {
26
+ type: "fill";
27
+ value: T;
28
+ start: number;
29
+ end: number;
30
+ } | {
31
+ type: "copyWithin";
32
+ target: number;
33
+ start: number;
34
+ end: number;
35
+ } | {
36
+ type: "set";
37
+ index: number;
38
+ value: T;
39
+ };
40
+ export declare class ArrayProxy<T> extends Array<T> {
41
+ readonly ps: PubSub<ArrayMutation<T>>;
42
+ constructor(...items: T[]);
43
+ subscribe(fn: (mutation: ArrayMutation<T>) => void, cleanup?: VoidFunction): VoidFunction;
44
+ push(...items: T[]): number;
45
+ pop(): T | undefined;
46
+ shift(): T | undefined;
47
+ unshift(...items: T[]): number;
48
+ splice(start: number, deleteCount?: number, ...items: T[]): T[];
49
+ sort(compareFn?: (a: T, b: T) => number): this;
50
+ reverse(): this;
51
+ fill(value: T, start?: number, end?: number): this;
52
+ copyWithin(target: number, start: number, end?: number): this;
53
+ set(index: number, value: T): void;
54
+ dispose(): void;
55
+ }
56
+ //# sourceMappingURL=array-proxy.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"array-proxy.d.ts","sourceRoot":"","sources":["../../src/array-proxy.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAU,MAAM,UAAU,CAAC;AAC1C,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAE9C,MAAM,MAAM,aAAa,CAAC,CAAC,IACvB;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,CAAC,EAAE,CAAA;CAAE,GAC5B;IAAE,IAAI,EAAE,KAAK,CAAC;IAAC,OAAO,EAAE,CAAC,GAAG,SAAS,CAAA;CAAE,GACvC;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,OAAO,EAAE,CAAC,GAAG,SAAS,CAAA;CAAE,GACzC;IAAE,IAAI,EAAE,SAAS,CAAC;IAAC,KAAK,EAAE,CAAC,EAAE,CAAA;CAAE,GAC/B;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,CAAC,EAAE,CAAC;IAAC,KAAK,EAAE,CAAC,EAAE,CAAA;CAAE,GAChF;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,GAChB;IAAE,IAAI,EAAE,SAAS,CAAA;CAAE,GACnB;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,CAAC,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAE,GACtD;IAAE,IAAI,EAAE,YAAY,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAE,GAClE;IAAE,IAAI,EAAE,KAAK,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,CAAC,CAAA;CAAE,CAAC;AAE7C,qBAAa,UAAU,CAAC,CAAC,CAAE,SAAQ,KAAK,CAAC,CAAC,CAAC;IACzC,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC;gBAE1B,GAAG,KAAK,EAAE,CAAC,EAAE;IAKzB,SAAS,CAAC,EAAE,EAAE,CAAC,QAAQ,EAAE,aAAa,CAAC,CAAC,CAAC,KAAK,IAAI,EAAE,OAAO,CAAC,EAAE,YAAY,GAAG,YAAY;IAIhF,IAAI,CAAC,GAAG,KAAK,EAAE,CAAC,EAAE,GAAG,MAAM;IAM3B,GAAG,IAAI,CAAC,GAAG,SAAS;IAMpB,KAAK,IAAI,CAAC,GAAG,SAAS;IAMtB,OAAO,CAAC,GAAG,KAAK,EAAE,CAAC,EAAE,GAAG,MAAM;IAM9B,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,WAAW,CAAC,EAAE,MAAM,EAAE,GAAG,KAAK,EAAE,CAAC,EAAE,GAAG,CAAC,EAAE;IAO/D,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,KAAK,MAAM,GAAG,IAAI;IAM9C,OAAO,IAAI,IAAI;IAMf,IAAI,CAAC,KAAK,EAAE,CAAC,EAAE,KAAK,CAAC,EAAE,MAAM,EAAE,GAAG,CAAC,EAAE,MAAM,GAAG,IAAI;IAQlD,UAAU,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,CAAC,EAAE,MAAM,GAAG,IAAI;IAOtE,GAAG,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,GAAG,IAAI;IAKlC,OAAO,IAAI,IAAI;CAGhB"}
@@ -0,0 +1,72 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ArrayProxy = void 0;
4
+ const pubsub_1 = require("./pubsub");
5
+ class ArrayProxy extends Array {
6
+ ps;
7
+ constructor(...items) {
8
+ super(...items);
9
+ this.ps = (0, pubsub_1.pubsub)();
10
+ }
11
+ subscribe(fn, cleanup) {
12
+ return this.ps.subscribe(fn, cleanup);
13
+ }
14
+ push(...items) {
15
+ const result = super.push(...items);
16
+ this.ps.publish({ type: "push", items });
17
+ return result;
18
+ }
19
+ pop() {
20
+ const removed = super.pop();
21
+ this.ps.publish({ type: "pop", removed });
22
+ return removed;
23
+ }
24
+ shift() {
25
+ const removed = super.shift();
26
+ this.ps.publish({ type: "shift", removed });
27
+ return removed;
28
+ }
29
+ unshift(...items) {
30
+ const result = super.unshift(...items);
31
+ this.ps.publish({ type: "unshift", items });
32
+ return result;
33
+ }
34
+ splice(start, deleteCount, ...items) {
35
+ const dc = deleteCount ?? this.length - start;
36
+ const removed = super.splice(start, dc, ...items);
37
+ this.ps.publish({ type: "splice", start, deleteCount: dc, removed, added: items });
38
+ return removed;
39
+ }
40
+ sort(compareFn) {
41
+ super.sort(compareFn);
42
+ this.ps.publish({ type: "sort" });
43
+ return this;
44
+ }
45
+ reverse() {
46
+ super.reverse();
47
+ this.ps.publish({ type: "reverse" });
48
+ return this;
49
+ }
50
+ fill(value, start, end) {
51
+ const s = start ?? 0;
52
+ const e = end ?? this.length;
53
+ super.fill(value, s, e);
54
+ this.ps.publish({ type: "fill", value, start: s, end: e });
55
+ return this;
56
+ }
57
+ copyWithin(target, start, end) {
58
+ const e = end ?? this.length;
59
+ super.copyWithin(target, start, e);
60
+ this.ps.publish({ type: "copyWithin", target, start, end: e });
61
+ return this;
62
+ }
63
+ set(index, value) {
64
+ this[index] = value;
65
+ this.ps.publish({ type: "set", index, value });
66
+ }
67
+ dispose() {
68
+ this.ps.dispose();
69
+ }
70
+ }
71
+ exports.ArrayProxy = ArrayProxy;
72
+ //# sourceMappingURL=array-proxy.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"array-proxy.js","sourceRoot":"","sources":["../../src/array-proxy.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ export declare const range: (n: number) => Array<number>;
2
+ export declare const enumerate: <T>(arr: T[]) => Array<[number, T]>;
3
+ export declare const zipMin: <A, B>(a: A[], b: B[]) => Array<[A, B]>;
4
+ export declare const zipMax: <A, B>(a: A[], b: B[]) => Array<[A | undefined, B | undefined]>;
5
+ export declare const zipByKey: <A, B>(a: A[], b: B[], getKey: <T extends A | B>(item: T) => PropertyKey | null) => {
6
+ pairs: Array<[A, B]>;
7
+ restA: A[];
8
+ restB: B[];
9
+ };
10
+ export declare const unique: <T>(arr: T[]) => T[];
11
+ //# sourceMappingURL=array.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"array.d.ts","sourceRoot":"","sources":["../../../src/common/array.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,KAAK,GAAI,GAAG,MAAM,KAAG,KAAK,CAAC,MAAM,CACS,CAAC;AAExD,eAAO,MAAM,SAAS,GAAI,CAAC,EAAE,KAAK,CAAC,EAAE,KAAG,KAAK,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,CAExD,CAAC;AAEF,eAAO,MAAM,MAAM,GAAI,CAAC,EAAE,CAAC,EAAE,GAAG,CAAC,EAAE,EAAE,GAAG,CAAC,EAAE,KAAG,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAGzD,CAAC;AAEF,eAAO,MAAM,MAAM,GAAI,CAAC,EAAE,CAAC,EAAE,GAAG,CAAC,EAAE,EAAE,GAAG,CAAC,EAAE,KAAG,KAAK,CAAC,CAAC,CAAC,GAAG,SAAS,EAAE,CAAC,GAAG,SAAS,CAAC,CAGjF,CAAC;AAEF,eAAO,MAAM,QAAQ,GAAI,CAAC,EAAE,CAAC,EAC3B,GAAG,CAAC,EAAE,EACN,GAAG,CAAC,EAAE,EACN,QAAQ,CAAC,CAAC,SAAS,CAAC,GAAG,CAAC,EAAE,IAAI,EAAE,CAAC,KAAK,WAAW,GAAG,IAAI,KACvD;IAAE,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IAAC,KAAK,EAAE,CAAC,EAAE,CAAC;IAAC,KAAK,EAAE,CAAC,EAAE,CAAA;CA6ChD,CAAC;AAGF,eAAO,MAAM,MAAM,GAAI,CAAC,EAAE,KAAK,CAAC,EAAE,KAAG,CAAC,EAErC,CAAA"}
@@ -0,0 +1,57 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.unique = exports.zipByKey = exports.zipMax = exports.zipMin = exports.enumerate = exports.range = void 0;
4
+ const range = (n) => n <= 0 ? [] : Array.from(Array(Math.floor(n)).keys());
5
+ exports.range = range;
6
+ const enumerate = (arr) => {
7
+ return arr.map((v, i) => [i, v]);
8
+ };
9
+ exports.enumerate = enumerate;
10
+ const zipMin = (a, b) => {
11
+ const length = Math.min(a.length, b.length);
12
+ return (0, exports.range)(length).map((i) => [a[i], b[i]]);
13
+ };
14
+ exports.zipMin = zipMin;
15
+ const zipMax = (a, b) => {
16
+ const length = Math.max(a.length, b.length);
17
+ return (0, exports.range)(length).map((i) => [a[i], b[i]]);
18
+ };
19
+ exports.zipMax = zipMax;
20
+ const zipByKey = (a, b, getKey) => {
21
+ const keys = Array.from(new Set([...a.map((x) => getKey(x)), ...b.map((x) => getKey(x))].filter((x) => x !== null)));
22
+ const ma = new Map(a
23
+ .map((x) => [getKey(x), x])
24
+ .filter(([k, _]) => k !== null));
25
+ const mb = new Map(b
26
+ .map((x) => [getKey(x), x])
27
+ .filter(([k, _]) => k !== null));
28
+ const z = [];
29
+ const restA = [];
30
+ const restB = [];
31
+ const seenA = new Set();
32
+ const seenB = new Set();
33
+ for (const k of keys) {
34
+ const va = ma.get(k) ?? null;
35
+ const vb = mb.get(k) ?? null;
36
+ if (va !== null && vb === null) {
37
+ restA.push(va);
38
+ seenA.add(va);
39
+ }
40
+ else if (va === null && vb !== null) {
41
+ restB.push(vb);
42
+ seenB.add(vb);
43
+ }
44
+ else if (va !== null && vb !== null) {
45
+ z.push([va, vb]);
46
+ seenA.add(va);
47
+ seenB.add(vb);
48
+ }
49
+ }
50
+ return { pairs: z, restA, restB };
51
+ };
52
+ exports.zipByKey = zipByKey;
53
+ const unique = (arr) => {
54
+ return Array.from(new Set(arr));
55
+ };
56
+ exports.unique = unique;
57
+ //# sourceMappingURL=array.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"array.js","sourceRoot":"","sources":["../../../src/common/array.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare const compare: (a: unknown, b: unknown) => boolean;
2
+ //# sourceMappingURL=compare.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"compare.d.ts","sourceRoot":"","sources":["../../../src/common/compare.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,OAAO,GAAI,GAAG,OAAO,EAAE,GAAG,OAAO,KAAG,OAEhD,CAAC"}
@@ -0,0 +1,8 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.compare = void 0;
4
+ const compare = (a, b) => {
5
+ return a === b;
6
+ };
7
+ exports.compare = compare;
8
+ //# sourceMappingURL=compare.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"compare.js","sourceRoot":"","sources":["../../../src/common/compare.ts"],"names":[],"mappings":";;;AAAO,MAAM,OAAO,GAAG,CAAC,CAAU,EAAE,CAAU,EAAW,EAAE;IACzD,OAAO,CAAC,KAAK,CAAC,CAAC;AACjB,CAAC,CAAC;AAFW,QAAA,OAAO,WAElB"}
@@ -0,0 +1,9 @@
1
+ export type DiffType = 'added' | 'removed' | 'changed';
2
+ export type Diff = {
3
+ type: DiffType;
4
+ path: PropertyKey[];
5
+ oldValue?: unknown;
6
+ newValue?: unknown;
7
+ };
8
+ export declare const diff: <T>(a: T, b: T) => Diff[];
9
+ //# sourceMappingURL=diff.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"diff.d.ts","sourceRoot":"","sources":["../../../src/common/diff.ts"],"names":[],"mappings":"AAEA,MAAM,MAAM,QAAQ,GAAG,OAAO,GAAG,SAAS,GAAG,SAAS,CAAC;AAEvD,MAAM,MAAM,IAAI,GAAG;IACjB,IAAI,EAAE,QAAQ,CAAC;IACf,IAAI,EAAE,WAAW,EAAE,CAAC;IACpB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB,CAAC;AAEF,eAAO,MAAM,IAAI,GAAI,CAAC,EAAE,GAAG,CAAC,EAAE,GAAG,CAAC,KAAG,IAAI,EAIxC,CAAC"}
@@ -0,0 +1,63 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.diff = void 0;
4
+ const is_1 = require("./is");
5
+ const diff = (a, b) => {
6
+ const diffs = [];
7
+ diffRecursive(a, b, [], diffs);
8
+ return diffs;
9
+ };
10
+ exports.diff = diff;
11
+ const diffRecursive = (a, b, path, diffs) => {
12
+ if (a === b)
13
+ return;
14
+ const aIsArray = Array.isArray(a);
15
+ const bIsArray = Array.isArray(b);
16
+ if (aIsArray && bIsArray) {
17
+ diffArrays(a, b, path, diffs);
18
+ return;
19
+ }
20
+ const aIsObject = (0, is_1.isPlainObject)(a);
21
+ const bIsObject = (0, is_1.isPlainObject)(b);
22
+ if (aIsObject && bIsObject) {
23
+ diffObjects(a, b, path, diffs);
24
+ return;
25
+ }
26
+ diffs.push({ type: 'changed', path, oldValue: a, newValue: b });
27
+ };
28
+ const diffObjects = (a, b, path, diffs) => {
29
+ const aKeys = Reflect.ownKeys(a);
30
+ const bKeys = Reflect.ownKeys(b);
31
+ const bKeySet = new Set(bKeys);
32
+ for (const key of aKeys) {
33
+ const childPath = [...path, key];
34
+ if (!bKeySet.has(key)) {
35
+ diffs.push({ type: 'removed', path: childPath, oldValue: a[key] });
36
+ }
37
+ else {
38
+ diffRecursive(a[key], b[key], childPath, diffs);
39
+ }
40
+ }
41
+ const aKeySet = new Set(aKeys);
42
+ for (const key of bKeys) {
43
+ if (!aKeySet.has(key)) {
44
+ diffs.push({ type: 'added', path: [...path, key], newValue: b[key] });
45
+ }
46
+ }
47
+ };
48
+ const diffArrays = (a, b, path, diffs) => {
49
+ const maxLen = Math.max(a.length, b.length);
50
+ for (let i = 0; i < maxLen; i++) {
51
+ const childPath = [...path, i];
52
+ if (i >= a.length) {
53
+ diffs.push({ type: 'added', path: childPath, newValue: b[i] });
54
+ }
55
+ else if (i >= b.length) {
56
+ diffs.push({ type: 'removed', path: childPath, oldValue: a[i] });
57
+ }
58
+ else {
59
+ diffRecursive(a[i], b[i], childPath, diffs);
60
+ }
61
+ }
62
+ };
63
+ //# sourceMappingURL=diff.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"diff.js","sourceRoot":"","sources":["../../../src/common/diff.ts"],"names":[],"mappings":"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"}