@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.
- package/.README.md.~undo-tree~ +4 -0
- package/.package.json.~undo-tree~ +30 -0
- package/.tsconfig.cjs.json.~undo-tree~ +8 -0
- package/.tsconfig.json.~undo-tree~ +14 -0
- package/README.md +355 -0
- package/README.md~ +355 -0
- package/dist/cjs/array-proxy.d.ts +56 -0
- package/dist/cjs/array-proxy.d.ts.map +1 -0
- package/dist/cjs/array-proxy.js +72 -0
- package/dist/cjs/array-proxy.js.map +1 -0
- package/dist/cjs/common/array.d.ts +11 -0
- package/dist/cjs/common/array.d.ts.map +1 -0
- package/dist/cjs/common/array.js +57 -0
- package/dist/cjs/common/array.js.map +1 -0
- package/dist/cjs/common/compare.d.ts +2 -0
- package/dist/cjs/common/compare.d.ts.map +1 -0
- package/dist/cjs/common/compare.js +8 -0
- package/dist/cjs/common/compare.js.map +1 -0
- package/dist/cjs/common/diff.d.ts +9 -0
- package/dist/cjs/common/diff.d.ts.map +1 -0
- package/dist/cjs/common/diff.js +63 -0
- package/dist/cjs/common/diff.js.map +1 -0
- package/dist/cjs/common/has.d.ts +4 -0
- package/dist/cjs/common/has.d.ts.map +1 -0
- package/dist/cjs/common/has.js +11 -0
- package/dist/cjs/common/has.js.map +1 -0
- package/dist/cjs/common/index.d.ts +12 -0
- package/dist/cjs/common/index.d.ts.map +1 -0
- package/dist/cjs/common/index.js +28 -0
- package/dist/cjs/common/index.js.map +1 -0
- package/dist/cjs/common/is.d.ts +5 -0
- package/dist/cjs/common/is.d.ts.map +1 -0
- package/dist/cjs/common/is.js +18 -0
- package/dist/cjs/common/is.js.map +1 -0
- package/dist/cjs/common/match.d.ts +23 -0
- package/dist/cjs/common/match.d.ts.map +1 -0
- package/dist/cjs/common/match.js +49 -0
- package/dist/cjs/common/match.js.map +1 -0
- package/dist/cjs/common/patch.d.ts +3 -0
- package/dist/cjs/common/patch.d.ts.map +1 -0
- package/dist/cjs/common/patch.js +44 -0
- package/dist/cjs/common/patch.js.map +1 -0
- package/dist/cjs/common/stack.d.ts +8 -0
- package/dist/cjs/common/stack.d.ts.map +1 -0
- package/dist/cjs/common/stack.js +24 -0
- package/dist/cjs/common/stack.js.map +1 -0
- package/dist/cjs/common/string.d.ts +2 -0
- package/dist/cjs/common/string.d.ts.map +1 -0
- package/dist/cjs/common/string.js +36 -0
- package/dist/cjs/common/string.js.map +1 -0
- package/dist/cjs/common/types.d.ts +27 -0
- package/dist/cjs/common/types.d.ts.map +1 -0
- package/dist/cjs/common/types.js +3 -0
- package/dist/cjs/common/types.js.map +1 -0
- package/dist/cjs/common/unique-array.d.ts +17 -0
- package/dist/cjs/common/unique-array.d.ts.map +1 -0
- package/dist/cjs/common/unique-array.js +73 -0
- package/dist/cjs/common/unique-array.js.map +1 -0
- package/dist/cjs/context.d.ts +15 -0
- package/dist/cjs/context.d.ts.map +1 -0
- package/dist/cjs/context.js +33 -0
- package/dist/cjs/context.js.map +1 -0
- package/dist/cjs/derived.d.ts +11 -0
- package/dist/cjs/derived.d.ts.map +1 -0
- package/dist/cjs/derived.js +26 -0
- package/dist/cjs/derived.js.map +1 -0
- package/dist/cjs/effect.d.ts +7 -0
- package/dist/cjs/effect.d.ts.map +1 -0
- package/dist/cjs/effect.js +7 -0
- package/dist/cjs/effect.js.map +1 -0
- package/dist/cjs/index.d.ts +8 -0
- package/dist/cjs/index.d.ts.map +1 -0
- package/dist/cjs/index.js +24 -0
- package/dist/cjs/index.js.map +1 -0
- package/dist/cjs/observable.d.ts +12 -0
- package/dist/cjs/observable.d.ts.map +1 -0
- package/dist/cjs/observable.js +24 -0
- package/dist/cjs/observable.js.map +1 -0
- package/dist/cjs/pubsub.d.ts +11 -0
- package/dist/cjs/pubsub.d.ts.map +1 -0
- package/dist/cjs/pubsub.js +50 -0
- package/dist/cjs/pubsub.js.map +1 -0
- package/dist/cjs/reference.d.ts +15 -0
- package/dist/cjs/reference.d.ts.map +1 -0
- package/dist/cjs/reference.js +49 -0
- package/dist/cjs/reference.js.map +1 -0
- package/dist/cjs/utils/findRefs.d.ts +3 -0
- package/dist/cjs/utils/findRefs.d.ts.map +1 -0
- package/dist/cjs/utils/findRefs.js +23 -0
- package/dist/cjs/utils/findRefs.js.map +1 -0
- package/dist/cjs/utils/index.d.ts +2 -0
- package/dist/cjs/utils/index.d.ts.map +1 -0
- package/dist/cjs/utils/index.js +18 -0
- package/dist/cjs/utils/index.js.map +1 -0
- package/dist/esm/array-proxy.d.ts +56 -0
- package/dist/esm/array-proxy.d.ts.map +1 -0
- package/dist/esm/array-proxy.js +68 -0
- package/dist/esm/array-proxy.js.map +1 -0
- package/dist/esm/common/array.d.ts +11 -0
- package/dist/esm/common/array.d.ts.map +1 -0
- package/dist/esm/common/array.js +48 -0
- package/dist/esm/common/array.js.map +1 -0
- package/dist/esm/common/compare.d.ts +2 -0
- package/dist/esm/common/compare.d.ts.map +1 -0
- package/dist/esm/common/compare.js +4 -0
- package/dist/esm/common/compare.js.map +1 -0
- package/dist/esm/common/diff.d.ts +9 -0
- package/dist/esm/common/diff.d.ts.map +1 -0
- package/dist/esm/common/diff.js +59 -0
- package/dist/esm/common/diff.js.map +1 -0
- package/dist/esm/common/has.d.ts +4 -0
- package/dist/esm/common/has.d.ts.map +1 -0
- package/dist/esm/common/has.js +8 -0
- package/dist/esm/common/has.js.map +1 -0
- package/dist/esm/common/index.d.ts +12 -0
- package/dist/esm/common/index.d.ts.map +1 -0
- package/dist/esm/common/index.js +12 -0
- package/dist/esm/common/index.js.map +1 -0
- package/dist/esm/common/is.d.ts +5 -0
- package/dist/esm/common/is.d.ts.map +1 -0
- package/dist/esm/common/is.js +13 -0
- package/dist/esm/common/is.js.map +1 -0
- package/dist/esm/common/match.d.ts +23 -0
- package/dist/esm/common/match.d.ts.map +1 -0
- package/dist/esm/common/match.js +46 -0
- package/dist/esm/common/match.js.map +1 -0
- package/dist/esm/common/patch.d.ts +3 -0
- package/dist/esm/common/patch.d.ts.map +1 -0
- package/dist/esm/common/patch.js +40 -0
- package/dist/esm/common/patch.js.map +1 -0
- package/dist/esm/common/stack.d.ts +8 -0
- package/dist/esm/common/stack.d.ts.map +1 -0
- package/dist/esm/common/stack.js +20 -0
- package/dist/esm/common/stack.js.map +1 -0
- package/dist/esm/common/string.d.ts +2 -0
- package/dist/esm/common/string.d.ts.map +1 -0
- package/dist/esm/common/string.js +32 -0
- package/dist/esm/common/string.js.map +1 -0
- package/dist/esm/common/types.d.ts +27 -0
- package/dist/esm/common/types.d.ts.map +1 -0
- package/dist/esm/common/types.js +2 -0
- package/dist/esm/common/types.js.map +1 -0
- package/dist/esm/common/unique-array.d.ts +17 -0
- package/dist/esm/common/unique-array.d.ts.map +1 -0
- package/dist/esm/common/unique-array.js +69 -0
- package/dist/esm/common/unique-array.js.map +1 -0
- package/dist/esm/context.d.ts +15 -0
- package/dist/esm/context.d.ts.map +1 -0
- package/dist/esm/context.js +28 -0
- package/dist/esm/context.js.map +1 -0
- package/dist/esm/derived.d.ts +11 -0
- package/dist/esm/derived.d.ts.map +1 -0
- package/dist/esm/derived.js +21 -0
- package/dist/esm/derived.js.map +1 -0
- package/dist/esm/effect.d.ts +7 -0
- package/dist/esm/effect.d.ts.map +1 -0
- package/dist/esm/effect.js +3 -0
- package/dist/esm/effect.js.map +1 -0
- package/dist/esm/index.d.ts +8 -0
- package/dist/esm/index.d.ts.map +1 -0
- package/dist/esm/index.js +8 -0
- package/dist/esm/index.js.map +1 -0
- package/dist/esm/observable.d.ts +12 -0
- package/dist/esm/observable.d.ts.map +1 -0
- package/dist/esm/observable.js +19 -0
- package/dist/esm/observable.js.map +1 -0
- package/dist/esm/package.json +1 -0
- package/dist/esm/pubsub.d.ts +11 -0
- package/dist/esm/pubsub.d.ts.map +1 -0
- package/dist/esm/pubsub.js +47 -0
- package/dist/esm/pubsub.js.map +1 -0
- package/dist/esm/reference.d.ts +15 -0
- package/dist/esm/reference.d.ts.map +1 -0
- package/dist/esm/reference.js +44 -0
- package/dist/esm/reference.js.map +1 -0
- package/dist/esm/utils/findRefs.d.ts +3 -0
- package/dist/esm/utils/findRefs.d.ts.map +1 -0
- package/dist/esm/utils/findRefs.js +19 -0
- package/dist/esm/utils/findRefs.js.map +1 -0
- package/dist/esm/utils/index.d.ts +2 -0
- package/dist/esm/utils/index.d.ts.map +1 -0
- package/dist/esm/utils/index.js +2 -0
- package/dist/esm/utils/index.js.map +1 -0
- package/package.json +41 -0
- package/package.json~ +42 -0
- package/src/array-proxy.ts +94 -0
- package/src/common/array.ts +72 -0
- package/src/common/compare.ts +3 -0
- package/src/common/diff.test.ts +114 -0
- package/src/common/diff.ts +85 -0
- package/src/common/has.ts +7 -0
- package/src/common/index.ts +11 -0
- package/src/common/is.ts +14 -0
- package/src/common/match.ts +90 -0
- package/src/common/patch.test.ts +118 -0
- package/src/common/patch.ts +47 -0
- package/src/common/stack.ts +22 -0
- package/src/common/string.test.ts +46 -0
- package/src/common/string.ts +35 -0
- package/src/common/types.ts +61 -0
- package/src/common/unique-array.ts +80 -0
- package/src/context.ts +36 -0
- package/src/derived.test.ts +45 -0
- package/src/derived.ts +35 -0
- package/src/effect.ts +9 -0
- package/src/index.ts +7 -0
- package/src/observable.ts +40 -0
- package/src/pubsub.test.ts +29 -0
- package/src/pubsub.ts +71 -0
- package/src/reference.test.ts +32 -0
- package/src/reference.ts +63 -0
- package/src/utils/findRefs.ts +22 -0
- package/src/utils/index.ts +1 -0
- package/tsconfig.cjs.json +8 -0
- package/tsconfig.cjs.json~ +0 -0
- package/tsconfig.json +24 -0
- 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 @@
|
|
|
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 @@
|
|
|
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 @@
|
|
|
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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"}
|