informa 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/.vscode/settings.json +3 -0
- package/README.md +238 -0
- package/dist/EnumerableWeakMap.d.ts +13 -0
- package/dist/EnumerableWeakMap.d.ts.map +1 -0
- package/dist/EnumerableWeakMap.js +56 -0
- package/dist/EnumerableWeakMap.js.map +1 -0
- package/dist/clone.d.ts +2 -0
- package/dist/clone.d.ts.map +1 -0
- package/dist/clone.js +30 -0
- package/dist/clone.js.map +1 -0
- package/dist/high.d.ts +60 -0
- package/dist/high.d.ts.map +1 -0
- package/dist/high.js +107 -0
- package/dist/high.js.map +1 -0
- package/dist/internals.d.ts +14 -0
- package/dist/internals.d.ts.map +1 -0
- package/dist/internals.js +24 -0
- package/dist/internals.js.map +1 -0
- package/dist/low.d.ts +57 -0
- package/dist/low.d.ts.map +1 -0
- package/dist/low.js +260 -0
- package/dist/low.js.map +1 -0
- package/dist/quirks/array.d.ts +21 -0
- package/dist/quirks/array.d.ts.map +1 -0
- package/dist/quirks/array.js +176 -0
- package/dist/quirks/array.js.map +1 -0
- package/dist/quirks/basestatified.d.ts +5 -0
- package/dist/quirks/basestatified.d.ts.map +1 -0
- package/dist/quirks/basestatified.js +117 -0
- package/dist/quirks/basestatified.js.map +1 -0
- package/dist/quirks/set.d.ts +12 -0
- package/dist/quirks/set.d.ts.map +1 -0
- package/dist/quirks/set.js +37 -0
- package/dist/quirks/set.js.map +1 -0
- package/dist/test.d.ts +2 -0
- package/dist/test.d.ts.map +1 -0
- package/dist/test.js +37 -0
- package/dist/test.js.map +1 -0
- package/dist/utils.d.ts +5 -0
- package/dist/utils.d.ts.map +1 -0
- package/dist/utils.js +23 -0
- package/dist/utils.js.map +1 -0
- package/package.json +28 -0
- package/src/EnumerableWeakMap.ts +63 -0
- package/src/high.ts +163 -0
- package/src/internals.ts +32 -0
- package/src/low.ts +411 -0
- package/src/quirks/array.ts +211 -0
- package/src/quirks/basestatified.ts +194 -0
- package/src/quirks/set.ts +48 -0
- package/src/test.ts +49 -0
- package/src/utils.ts +31 -0
- package/tsconfig.json +44 -0
package/README.md
ADDED
|
@@ -0,0 +1,238 @@
|
|
|
1
|
+
# informa
|
|
2
|
+
|
|
3
|
+
Informa is an explicit state management library for JavaScript and TypeScript.
|
|
4
|
+
|
|
5
|
+
It lets you:
|
|
6
|
+
|
|
7
|
+
- create statified objects, arrays, sets, and class instances
|
|
8
|
+
- subscribe to changes at precise property paths
|
|
9
|
+
- observe structural collection events like array insertion and set addition
|
|
10
|
+
- keep nested subscriptions working when parents are replaced
|
|
11
|
+
|
|
12
|
+
## Philosophy
|
|
13
|
+
|
|
14
|
+
Informa is path-based.
|
|
15
|
+
|
|
16
|
+
Instead of subscribing to "everything changed", you subscribe to a selector such as:
|
|
17
|
+
|
|
18
|
+
- `() => desktop.monitors`
|
|
19
|
+
- `() => window.position.x`
|
|
20
|
+
- `() => stateful.b?.c?.d`
|
|
21
|
+
|
|
22
|
+
The selector is used to extract a path from a statified root, and listeners are attached to that path.
|
|
23
|
+
|
|
24
|
+
## Quick example
|
|
25
|
+
|
|
26
|
+
```ts
|
|
27
|
+
import $ from "informa";
|
|
28
|
+
|
|
29
|
+
interface Rectangle {
|
|
30
|
+
x: number;
|
|
31
|
+
y: number;
|
|
32
|
+
w: number;
|
|
33
|
+
h: number;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
const desktop = $.state({
|
|
37
|
+
monitors: new Set<Rectangle>(),
|
|
38
|
+
focused: undefined as Rectangle | undefined,
|
|
39
|
+
});
|
|
40
|
+
|
|
41
|
+
$.onAddItem(() => desktop.monitors, (monitor) => {
|
|
42
|
+
console.log("monitor added", monitor);
|
|
43
|
+
});
|
|
44
|
+
|
|
45
|
+
$.onSet(() => desktop.focused?.x, (x) => {
|
|
46
|
+
console.log("focused x is now", x);
|
|
47
|
+
});
|
|
48
|
+
|
|
49
|
+
desktop.monitors.add($.state({ x: 0, y: 0, w: 1920, h: 1080 }));
|
|
50
|
+
desktop.focused = $.state({ x: 100, y: 50, w: 800, h: 600 });
|
|
51
|
+
```
|
|
52
|
+
|
|
53
|
+
## Creating state
|
|
54
|
+
|
|
55
|
+
Use `$.state(...)` to create statified values.
|
|
56
|
+
|
|
57
|
+
Supported shapes include:
|
|
58
|
+
|
|
59
|
+
- plain objects
|
|
60
|
+
- arrays
|
|
61
|
+
- sets
|
|
62
|
+
- class instances that extend a statified base
|
|
63
|
+
|
|
64
|
+
```ts
|
|
65
|
+
const model = $.state({
|
|
66
|
+
count: 0,
|
|
67
|
+
items: [],
|
|
68
|
+
tags: new Set<string>(),
|
|
69
|
+
});
|
|
70
|
+
```
|
|
71
|
+
|
|
72
|
+
Nested objects are statified recursively.
|
|
73
|
+
|
|
74
|
+
## Selectors
|
|
75
|
+
|
|
76
|
+
Selectors should be simple property-path selectors.
|
|
77
|
+
|
|
78
|
+
Good selectors:
|
|
79
|
+
|
|
80
|
+
```ts
|
|
81
|
+
() => model.count
|
|
82
|
+
() => model.user.name
|
|
83
|
+
() => model.items
|
|
84
|
+
() => model.settings?.theme
|
|
85
|
+
```
|
|
86
|
+
|
|
87
|
+
Selectors describe a path. These will not work:
|
|
88
|
+
|
|
89
|
+
```ts
|
|
90
|
+
() => model.items.map(x => x.id)
|
|
91
|
+
() => fn(model.user)
|
|
92
|
+
() => [model.user, model.id]
|
|
93
|
+
```
|
|
94
|
+
|
|
95
|
+
## Events
|
|
96
|
+
|
|
97
|
+
### `onSet`
|
|
98
|
+
|
|
99
|
+
Called when a path receives a value.
|
|
100
|
+
|
|
101
|
+
```ts
|
|
102
|
+
$.onSet(() => model.count, (value) => {
|
|
103
|
+
console.log("count =", value);
|
|
104
|
+
});
|
|
105
|
+
|
|
106
|
+
model.count = 1;
|
|
107
|
+
```
|
|
108
|
+
|
|
109
|
+
If you subscribe to a deep path and later assign an ancestor, Informa replays the descendant path with the current value.
|
|
110
|
+
|
|
111
|
+
```ts
|
|
112
|
+
$.onSet(() => model.user?.profile?.name, (value) => {
|
|
113
|
+
console.log("name =", value);
|
|
114
|
+
});
|
|
115
|
+
|
|
116
|
+
model.user = $.state({
|
|
117
|
+
profile: $.state({ name: "Ada" }),
|
|
118
|
+
});
|
|
119
|
+
```
|
|
120
|
+
|
|
121
|
+
The listener above should receive `"Ada"` when `user` is assigned.
|
|
122
|
+
|
|
123
|
+
### `onReplace`
|
|
124
|
+
|
|
125
|
+
Called when a path already existed and is replaced.
|
|
126
|
+
|
|
127
|
+
### `onSetProp`, `onReplaceProp`, `onDeleteProp`
|
|
128
|
+
|
|
129
|
+
Property-level listeners for objects.
|
|
130
|
+
|
|
131
|
+
### Array events
|
|
132
|
+
|
|
133
|
+
Use array-specific listeners for structural changes.
|
|
134
|
+
|
|
135
|
+
```ts
|
|
136
|
+
const stateful = $.state({
|
|
137
|
+
items: [] as { value: number }[],
|
|
138
|
+
});
|
|
139
|
+
|
|
140
|
+
$.onSpliceInElement(() => stateful.items, (item, index) => {
|
|
141
|
+
console.log("inserted", index, item);
|
|
142
|
+
|
|
143
|
+
$.onSet(() => item.value, (value) => {
|
|
144
|
+
console.log("item value =", value);
|
|
145
|
+
});
|
|
146
|
+
});
|
|
147
|
+
```
|
|
148
|
+
|
|
149
|
+
Available array events include:
|
|
150
|
+
|
|
151
|
+
- `onSpliceInElement`
|
|
152
|
+
- `onSpliceOutElement`
|
|
153
|
+
- `onReplaceElement`
|
|
154
|
+
- `onLengthChanged`
|
|
155
|
+
|
|
156
|
+
### Set events
|
|
157
|
+
|
|
158
|
+
```ts
|
|
159
|
+
$.onAddItem(() => model.tags, (tag) => {
|
|
160
|
+
console.log("added", tag);
|
|
161
|
+
});
|
|
162
|
+
|
|
163
|
+
$.onDeleteItem(() => model.tags, (tag) => {
|
|
164
|
+
console.log("deleted", tag);
|
|
165
|
+
});
|
|
166
|
+
```
|
|
167
|
+
|
|
168
|
+
Available set events include:
|
|
169
|
+
|
|
170
|
+
- `onAddItem`
|
|
171
|
+
- `onDeleteItem`
|
|
172
|
+
- `onSizeChanged`
|
|
173
|
+
|
|
174
|
+
## Classes
|
|
175
|
+
|
|
176
|
+
Class instances can participate in the same selector model.
|
|
177
|
+
|
|
178
|
+
```ts
|
|
179
|
+
class Wayland extends BaseStatified {
|
|
180
|
+
#state = 0;
|
|
181
|
+
|
|
182
|
+
get state() { return this.#state; }
|
|
183
|
+
set state(v: number) {
|
|
184
|
+
this.#state = v;
|
|
185
|
+
super.state = v;
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
const w = new Wayland();
|
|
190
|
+
$.onSet(() => w.state, (value) => console.log(value));
|
|
191
|
+
```
|
|
192
|
+
|
|
193
|
+
Informa uses a prototype blanket layer so selectors like `() => w.state` can still be extracted even when the property lives on a class prototype.
|
|
194
|
+
|
|
195
|
+
## Semantics
|
|
196
|
+
|
|
197
|
+
A few important rules:
|
|
198
|
+
|
|
199
|
+
- selectors are path-based
|
|
200
|
+
- nested listeners continue to work when statified children are linked into parents
|
|
201
|
+
- assigning an ancestor may trigger listeners on deeper subscribed descendants using the current nested value
|
|
202
|
+
- collection events are structural; property events are path-based
|
|
203
|
+
|
|
204
|
+
## Current limitations
|
|
205
|
+
|
|
206
|
+
- selectors should stay close to plain property access
|
|
207
|
+
- arbitrary computed selectors are not guaranteed to work
|
|
208
|
+
- method-call selectors are not part of the core model
|
|
209
|
+
- non-statified foreign objects may not participate in parent-child propagation
|
|
210
|
+
- array elements cannot be selected (yet)
|
|
211
|
+
|
|
212
|
+
## API summary
|
|
213
|
+
|
|
214
|
+
```ts
|
|
215
|
+
$.state(...)
|
|
216
|
+
$.on(...)
|
|
217
|
+
$.onSet(...)
|
|
218
|
+
$.onReplace(...)
|
|
219
|
+
$.onReplaceProp(...)
|
|
220
|
+
$.onDeleteProp(...)
|
|
221
|
+
$.onSetProp(...)
|
|
222
|
+
$.onLengthChanged(...)
|
|
223
|
+
$.onSpliceInElement(...)
|
|
224
|
+
$.onSpliceOutElement(...)
|
|
225
|
+
$.onReplaceElement(...)
|
|
226
|
+
$.onSizeChanged(...)
|
|
227
|
+
$.onAddItem(...)
|
|
228
|
+
$.onDeleteItem(...)
|
|
229
|
+
```
|
|
230
|
+
|
|
231
|
+
## Goals
|
|
232
|
+
|
|
233
|
+
Informa is built for cases where you want:
|
|
234
|
+
|
|
235
|
+
- explicit subscriptions
|
|
236
|
+
- precise change notifications
|
|
237
|
+
- propagation through nested state graphs
|
|
238
|
+
- support for objects, arrays, sets, and class instances
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
export declare class EnumerableWeakMap<K extends WeakKey, V> implements WeakMap<K, V>, Iterable<[K, V]> {
|
|
2
|
+
#private;
|
|
3
|
+
constructor(iterable?: Iterable<[K, V]> | null);
|
|
4
|
+
get [Symbol.toStringTag](): string;
|
|
5
|
+
get(key: K): V | undefined;
|
|
6
|
+
getOrInsert(key: K, defaultValue: V): V;
|
|
7
|
+
getOrInsertComputed(key: K, callback: (k: K) => V): V;
|
|
8
|
+
set(key: K, value: V): this;
|
|
9
|
+
delete(value: K): boolean;
|
|
10
|
+
has(value: K): boolean;
|
|
11
|
+
[Symbol.iterator](): Generator<[K, NonNullable<V>], void, unknown>;
|
|
12
|
+
}
|
|
13
|
+
//# sourceMappingURL=EnumerableWeakMap.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"EnumerableWeakMap.d.ts","sourceRoot":"","sources":["../src/EnumerableWeakMap.ts"],"names":[],"mappings":"AAAA,qBAAa,iBAAiB,CAAC,CAAC,SAAS,OAAO,EAAE,CAAC,CAAE,YAAW,OAAO,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;;IAK7F,YAAY,QAAQ,GAAE,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,IAAW,EAEnD;IAED,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,WAEvB;IAED,GAAG,CAAC,GAAG,EAAE,CAAC,iBAET;IAED,WAAW,CAAC,GAAG,EAAE,CAAC,EAAE,YAAY,EAAE,CAAC,GAAG,CAAC,CAOtC;IAED,mBAAmB,CAAC,GAAG,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAQpD;IAED,GAAG,CAAC,GAAG,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,GAAG,IAAI,CAK1B;IAED,MAAM,CAAC,KAAK,EAAE,CAAC,WAEd;IAED,GAAG,CAAC,KAAK,EAAE,CAAC,WAEX;IAEA,CAAC,MAAM,CAAC,QAAQ,CAAC,kDAUjB;CACF"}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
export class EnumerableWeakMap {
|
|
2
|
+
#map = new WeakMap();
|
|
3
|
+
#refs = [];
|
|
4
|
+
constructor(iterable = null) {
|
|
5
|
+
if (iterable)
|
|
6
|
+
for (const [key, value] of iterable)
|
|
7
|
+
this.set(key, value);
|
|
8
|
+
}
|
|
9
|
+
get [Symbol.toStringTag]() {
|
|
10
|
+
return "WeakerableMapByWebReflection";
|
|
11
|
+
}
|
|
12
|
+
get(key) {
|
|
13
|
+
return this.#map.get(key);
|
|
14
|
+
}
|
|
15
|
+
getOrInsert(key, defaultValue) {
|
|
16
|
+
if (this.#map.has(key)) {
|
|
17
|
+
return this.#map.get(key);
|
|
18
|
+
}
|
|
19
|
+
this.#map.set(key, defaultValue);
|
|
20
|
+
this.#refs.push(new WeakRef(key));
|
|
21
|
+
return defaultValue;
|
|
22
|
+
}
|
|
23
|
+
getOrInsertComputed(key, callback) {
|
|
24
|
+
if (this.#map.has(key)) {
|
|
25
|
+
return this.#map.get(key);
|
|
26
|
+
}
|
|
27
|
+
const value = callback(key);
|
|
28
|
+
this.#map.set(key, value);
|
|
29
|
+
this.#refs.push(new WeakRef(key));
|
|
30
|
+
return value;
|
|
31
|
+
}
|
|
32
|
+
set(key, value) {
|
|
33
|
+
if (!this.#map.has(key))
|
|
34
|
+
this.#refs.push(new WeakRef(key));
|
|
35
|
+
this.#map.set(key, value);
|
|
36
|
+
return this;
|
|
37
|
+
}
|
|
38
|
+
delete(value) {
|
|
39
|
+
return this.#map.delete(value);
|
|
40
|
+
}
|
|
41
|
+
has(value) {
|
|
42
|
+
return this.#map.has(value);
|
|
43
|
+
}
|
|
44
|
+
*[Symbol.iterator]() {
|
|
45
|
+
const map = this.#map, refs = [];
|
|
46
|
+
for (const wr of this.#refs) {
|
|
47
|
+
const key = wr.deref();
|
|
48
|
+
if (key && map.has(key)) {
|
|
49
|
+
refs.push(wr);
|
|
50
|
+
yield [key, map.get(key)];
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
this.#refs = refs;
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
//# sourceMappingURL=EnumerableWeakMap.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"EnumerableWeakMap.js","sourceRoot":"","sources":["../src/EnumerableWeakMap.ts"],"names":[],"mappings":"AAAA,MAAM,OAAO,iBAAiB;IAC5B,IAAI,GAAG,IAAI,OAAO,EAAQ,CAAC;IAE3B,KAAK,GAAiB,EAAE,CAAC;IAEzB,YAAY,QAAQ,GAA4B,IAAI;QAClD,IAAI,QAAQ;YAAE,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,QAAQ;gBAAE,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;IAC1E,CAAC;IAED,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC;QACtB,OAAO,8BAA8B,CAAC;IACxC,CAAC;IAED,GAAG,CAAC,GAAM;QACR,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IAC5B,CAAC;IAED,WAAW,CAAC,GAAM,EAAE,YAAe;QACjC,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;YACvB,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAE,CAAC;QAC7B,CAAC;QACD,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,YAAY,CAAC,CAAC;QACjC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC;QAClC,OAAO,YAAY,CAAC;IACtB,CAAC;IAED,mBAAmB,CAAC,GAAM,EAAE,QAAqB;QAC/C,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;YACvB,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAE,CAAC;QAC7B,CAAC;QACD,MAAM,KAAK,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC;QAC5B,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;QAC1B,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC;QAClC,OAAO,KAAK,CAAC;IACf,CAAC;IAED,GAAG,CAAC,GAAM,EAAE,KAAQ;QAClB,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC;YAAE,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC;QAC3D,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;QAE1B,OAAO,IAAI,CAAC;IACd,CAAC;IAED,MAAM,CAAC,KAAQ;QACb,OAAO,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IACjC,CAAC;IAED,GAAG,CAAC,KAAQ;QACV,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;IAC9B,CAAC;IAED,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC;QAChB,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,EAAE,IAAI,GAAG,EAAE,CAAC;QACjC,KAAK,MAAM,EAAE,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;YAC5B,MAAM,GAAG,GAAG,EAAE,CAAC,KAAK,EAAE,CAAC;YACvB,IAAI,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;gBACxB,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;gBACd,MAAM,CAAC,GAAG,EAAE,GAAG,CAAC,GAAG,CAAC,GAAG,CAAE,CAAkB,CAAC;YAC9C,CAAC;QACH,CAAC;QACD,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC;IACpB,CAAC;CACF"}
|
package/dist/clone.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"clone.d.ts","sourceRoot":"","sources":["../src/clone.ts"],"names":[],"mappings":"AAGA,wBAAgB,KAAK,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,GAAG,CAAC,CAmChC"}
|
package/dist/clone.js
ADDED
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { StatifiedArray } from "./quirks/array.js";
|
|
2
|
+
import { StatifiedSet } from "./quirks/set.js";
|
|
3
|
+
export function clone(v) {
|
|
4
|
+
if (typeof v === 'function') {
|
|
5
|
+
throw new Error();
|
|
6
|
+
}
|
|
7
|
+
if (typeof v !== 'object' || v === null) {
|
|
8
|
+
return v;
|
|
9
|
+
}
|
|
10
|
+
switch (Reflect.getPrototypeOf(v)) {
|
|
11
|
+
case Set.prototype:
|
|
12
|
+
const set = v;
|
|
13
|
+
return new Set(set[Symbol.iterator]().map(clone));
|
|
14
|
+
case Array.prototype:
|
|
15
|
+
const array = v;
|
|
16
|
+
return [...array.map(clone)];
|
|
17
|
+
case StatifiedArray.prototype:
|
|
18
|
+
case StatifiedSet.prototype:
|
|
19
|
+
return v;
|
|
20
|
+
case Object.prototype:
|
|
21
|
+
const newObj = v;
|
|
22
|
+
return Object.fromEntries(Object.entries(newObj)
|
|
23
|
+
.map(([k, v]) => [k, clone(v)]));
|
|
24
|
+
}
|
|
25
|
+
if (Array.isArray(v)) {
|
|
26
|
+
return [...v.map(clone)];
|
|
27
|
+
}
|
|
28
|
+
throw new Error(`Cannot clone object with prototype`);
|
|
29
|
+
}
|
|
30
|
+
//# sourceMappingURL=clone.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"clone.js","sourceRoot":"","sources":["../src/clone.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AACnD,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAE/C,MAAM,UAAU,KAAK,CAAI,CAAI;IAC3B,IAAI,OAAO,CAAC,KAAK,UAAU,EAAE,CAAC;QAC5B,MAAM,IAAI,KAAK,EAAE,CAAC;IACpB,CAAC;IAED,IAAI,OAAO,CAAC,KAAK,QAAQ,IAAI,CAAC,KAAK,IAAI,EAAE,CAAC;QACxC,OAAO,CAAC,CAAC;IACX,CAAC;IAED,QAAQ,OAAO,CAAC,cAAc,CAAC,CAAC,CAAC,EAAE,CAAC;QAClC,KAAK,GAAG,CAAC,SAAS;YAChB,MAAM,GAAG,GAAG,CAAwB,CAAC;YACrC,OAAO,IAAI,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC,GAAG,CAAC,KAAK,CAAC,CAAM,CAAC;QAEzD,KAAK,KAAK,CAAC,SAAS;YAClB,MAAM,KAAK,GAAG,CAAqB,CAAC;YACpC,OAAO,CAAC,GAAG,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,CAAM,CAAC;QAEpC,KAAK,cAAc,CAAC,SAAS,CAAC;QAC9B,KAAK,YAAY,CAAC,SAAS;YACzB,OAAO,CAAC,CAAC;QAEX,KAAK,MAAM,CAAC,SAAS;YACnB,MAAM,MAAM,GAAG,CAA4C,CAAC;YAC5D,OAAO,MAAM,CAAC,WAAW,CACvB,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC;iBACnB,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAC7B,CAAC;IACX,CAAC;IAED,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC;QACrB,OAAO,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,CAAM,CAAC;IAChC,CAAC;IAED,MAAM,IAAI,KAAK,CAAC,oCAAoC,CAAC,CAAC;AACxD,CAAC"}
|
package/dist/high.d.ts
ADDED
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
import { type Statify } from "./internals.js";
|
|
2
|
+
import { type StatifiableObj, type StatifiableProp, type Statified } from "./low.js";
|
|
3
|
+
export declare function stateInner<T extends StatifiableProp>(original: T): Statified<T>;
|
|
4
|
+
export declare function state<T extends StatifiableObj>(original: T): Statified<T>;
|
|
5
|
+
interface Options {
|
|
6
|
+
}
|
|
7
|
+
interface Listeners<T> {
|
|
8
|
+
set?(v: T): void;
|
|
9
|
+
replace?(v: T): void;
|
|
10
|
+
}
|
|
11
|
+
interface ObjectListeners<K extends string | number | symbol, V> extends Listeners<Record<K, V>> {
|
|
12
|
+
setProp?(v: V, i: string | symbol): void;
|
|
13
|
+
replaceProp?(v: V, i: string | symbol): void;
|
|
14
|
+
deleteProp?(v: V, i: string | symbol): void;
|
|
15
|
+
}
|
|
16
|
+
interface ArrayListeners<T> extends ObjectListeners<number, T> {
|
|
17
|
+
spliceInElement?(v: T, i: number): void;
|
|
18
|
+
spliceOutElement?(v: T, i: number): void;
|
|
19
|
+
replaceElement?(v: T, i: number): void;
|
|
20
|
+
lengthChanged?(): void;
|
|
21
|
+
}
|
|
22
|
+
interface SetListeners<T> extends ObjectListeners<keyof Set<T>, Set<T>[keyof Set<T>]> {
|
|
23
|
+
addItem?(v: T): void;
|
|
24
|
+
deleteItem?(v: T): void;
|
|
25
|
+
sizeChanged?(): void;
|
|
26
|
+
}
|
|
27
|
+
export declare function on<T, K extends string | number | symbol, V, U>(...[selector, listeners, options]: [
|
|
28
|
+
() => T,
|
|
29
|
+
Listeners<T>
|
|
30
|
+
] | [() => T, Listeners<T>, Options | undefined] | [() => Statify<Record<K, V>>, ObjectListeners<K, V>] | [() => Statify<Record<K, V>>, ObjectListeners<K, V>, Options | undefined] | [() => Statify<U[]>, ArrayListeners<U>] | [() => Statify<U[]>, ArrayListeners<U>, Options | undefined] | [() => Statify<Set<U>>, SetListeners<U>] | [() => Statify<Set<U>>, SetListeners<U>, Options | undefined]): () => void;
|
|
31
|
+
declare function onSet<T>(s: () => T, l: (v: T) => void, o?: Options): () => void;
|
|
32
|
+
declare function onReplace<T>(s: () => T, l: (v: T) => void, o?: Options): () => void;
|
|
33
|
+
declare function onReplaceProp<T extends Record<string | number | symbol, StatifiableProp>>(s: () => Statify<T>, l: (v: T[keyof T], k: keyof T) => void, o?: Options): () => void;
|
|
34
|
+
declare function onDeleteProp<T extends Record<string | number | symbol, StatifiableProp>>(s: () => Statify<T>, l: (v: T[keyof T], k: keyof T) => void, o?: Options): () => void;
|
|
35
|
+
declare function onSetProp<T extends Record<string | number | symbol, StatifiableProp>>(s: () => Statify<T>, l: (v: T[keyof T], k: keyof T) => void, o?: Options): () => void;
|
|
36
|
+
declare function onLengthChanged(s: () => Statify<StatifiableObj[]>, l: () => void, o?: Options): () => void;
|
|
37
|
+
declare function onSpliceInElement<T extends StatifiableObj>(s: () => Statify<T[]>, l: (v: T, k: number) => void, o?: Options): () => void;
|
|
38
|
+
declare function onSpliceOutElement<T extends StatifiableObj>(s: () => Statify<T[]>, l: (v: T, k: number) => void, o?: Options): () => void;
|
|
39
|
+
declare function onReplaceElement<T extends StatifiableObj>(s: () => Statify<T[]>, l: (v: T, k: number) => void, o?: Options): () => void;
|
|
40
|
+
declare function onSizeChanged<T extends StatifiableObj>(s: () => Statify<Set<T>>, l: () => void, o?: Options): () => void;
|
|
41
|
+
declare function onAddItem<T extends StatifiableObj>(s: () => Statify<Set<T>>, l: (v: T) => void, o?: Options): () => void;
|
|
42
|
+
declare function onDeleteItem<T extends StatifiableObj>(s: () => Statify<Set<T>>, l: (v: T) => void, o?: Options): () => void;
|
|
43
|
+
declare const _default: {
|
|
44
|
+
on: typeof on;
|
|
45
|
+
onSet: typeof onSet;
|
|
46
|
+
onReplace: typeof onReplace;
|
|
47
|
+
onReplaceProp: typeof onReplaceProp;
|
|
48
|
+
onDeleteProp: typeof onDeleteProp;
|
|
49
|
+
onSetProp: typeof onSetProp;
|
|
50
|
+
onLengthChanged: typeof onLengthChanged;
|
|
51
|
+
onSpliceInElement: typeof onSpliceInElement;
|
|
52
|
+
onSpliceOutElement: typeof onSpliceOutElement;
|
|
53
|
+
onReplaceElement: typeof onReplaceElement;
|
|
54
|
+
onSizeChanged: typeof onSizeChanged;
|
|
55
|
+
onAddItem: typeof onAddItem;
|
|
56
|
+
onDeleteItem: typeof onDeleteItem;
|
|
57
|
+
state: typeof state;
|
|
58
|
+
};
|
|
59
|
+
export default _default;
|
|
60
|
+
//# sourceMappingURL=high.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"high.d.ts","sourceRoot":"","sources":["../src/high.ts"],"names":[],"mappings":"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"}
|
package/dist/high.js
ADDED
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
import { getMetadataOf, isStatified, proxyMemoized } from "./internals.js";
|
|
2
|
+
import { hook, selectorToRootAndPath, statifyObject } from "./low.js";
|
|
3
|
+
import { StatifiedArray } from "./quirks/array.js";
|
|
4
|
+
import { StatifiedSet } from "./quirks/set.js";
|
|
5
|
+
export function stateInner(original) {
|
|
6
|
+
if (typeof original !== 'object' || original === null) {
|
|
7
|
+
return original;
|
|
8
|
+
}
|
|
9
|
+
if (proxyMemoized.has(original))
|
|
10
|
+
return proxyMemoized.get(original);
|
|
11
|
+
const unmemoed = (() => {
|
|
12
|
+
switch (Reflect.getPrototypeOf(original)) {
|
|
13
|
+
case Set.prototype:
|
|
14
|
+
const set = original;
|
|
15
|
+
return new StatifiedSet(set[Symbol.iterator]().map(stateInner));
|
|
16
|
+
case Array.prototype:
|
|
17
|
+
const array = original;
|
|
18
|
+
return new StatifiedArray(...array.map(stateInner));
|
|
19
|
+
case StatifiedArray.prototype:
|
|
20
|
+
case StatifiedSet.prototype:
|
|
21
|
+
return original;
|
|
22
|
+
case Object.prototype:
|
|
23
|
+
const newObj = original;
|
|
24
|
+
const entries = Object.entries(newObj)
|
|
25
|
+
.map(([k, v]) => [k, stateInner(v)]);
|
|
26
|
+
const result = statifyObject(Object.fromEntries(entries));
|
|
27
|
+
entries.forEach(([k, v]) => isStatified(v) && hook(getMetadataOf(result), k, getMetadataOf(v)));
|
|
28
|
+
return result;
|
|
29
|
+
}
|
|
30
|
+
if (Array.isArray(original)) {
|
|
31
|
+
return new StatifiedArray(...original.map(stateInner));
|
|
32
|
+
}
|
|
33
|
+
throw new Error(`Cannot clone object with prototype`);
|
|
34
|
+
})();
|
|
35
|
+
proxyMemoized.set(original, unmemoed);
|
|
36
|
+
return unmemoed;
|
|
37
|
+
}
|
|
38
|
+
export function state(original) {
|
|
39
|
+
return stateInner(original);
|
|
40
|
+
}
|
|
41
|
+
export function on(...[selector, listeners, options]) {
|
|
42
|
+
const { path, stateRoot } = selectorToRootAndPath(selector);
|
|
43
|
+
const metadata = getMetadataOf(stateRoot);
|
|
44
|
+
const eventEmitter = metadata.eventEmitterAtPath(path);
|
|
45
|
+
for (const [key, value] of Object.entries(listeners)) {
|
|
46
|
+
eventEmitter.on(key, value);
|
|
47
|
+
}
|
|
48
|
+
return () => {
|
|
49
|
+
for (const [key, value] of Object.entries(listeners)) {
|
|
50
|
+
eventEmitter.off(key, value);
|
|
51
|
+
}
|
|
52
|
+
};
|
|
53
|
+
}
|
|
54
|
+
function onSet(s, l, o) {
|
|
55
|
+
// TODO Handle `once` option
|
|
56
|
+
return on(s, { set: l }, o);
|
|
57
|
+
}
|
|
58
|
+
function onReplace(s, l, o) {
|
|
59
|
+
return on(s, { replace: l }, o);
|
|
60
|
+
}
|
|
61
|
+
function onReplaceProp(s, l, o) {
|
|
62
|
+
return on(s, { replaceProp: l }, o);
|
|
63
|
+
}
|
|
64
|
+
function onDeleteProp(s, l, o) {
|
|
65
|
+
return on(s, { deleteProp: l }, o);
|
|
66
|
+
}
|
|
67
|
+
function onSetProp(s, l, o) {
|
|
68
|
+
return on(s, { setProp: l }, o);
|
|
69
|
+
}
|
|
70
|
+
function onLengthChanged(s, l, o) {
|
|
71
|
+
return on(s, { lengthChanged: l }, o);
|
|
72
|
+
}
|
|
73
|
+
function onSpliceInElement(s, l, o) {
|
|
74
|
+
return on(s, { spliceInElement: l }, o);
|
|
75
|
+
}
|
|
76
|
+
function onSpliceOutElement(s, l, o) {
|
|
77
|
+
return on(s, { spliceOutElement: l }, o);
|
|
78
|
+
}
|
|
79
|
+
function onReplaceElement(s, l, o) {
|
|
80
|
+
return on(s, { replaceElement: l }, o);
|
|
81
|
+
}
|
|
82
|
+
function onSizeChanged(s, l, o) {
|
|
83
|
+
return on(s, { sizeChanged: l }, o);
|
|
84
|
+
}
|
|
85
|
+
function onAddItem(s, l, o) {
|
|
86
|
+
return on(s, { addItem: l }, o);
|
|
87
|
+
}
|
|
88
|
+
function onDeleteItem(s, l, o) {
|
|
89
|
+
return on(s, { deleteItem: l }, o);
|
|
90
|
+
}
|
|
91
|
+
export default {
|
|
92
|
+
on,
|
|
93
|
+
onSet,
|
|
94
|
+
onReplace,
|
|
95
|
+
onReplaceProp,
|
|
96
|
+
onDeleteProp,
|
|
97
|
+
onSetProp,
|
|
98
|
+
onLengthChanged,
|
|
99
|
+
onSpliceInElement,
|
|
100
|
+
onSpliceOutElement,
|
|
101
|
+
onReplaceElement,
|
|
102
|
+
onSizeChanged,
|
|
103
|
+
onAddItem,
|
|
104
|
+
onDeleteItem,
|
|
105
|
+
state,
|
|
106
|
+
};
|
|
107
|
+
//# sourceMappingURL=high.js.map
|
package/dist/high.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"high.js","sourceRoot":"","sources":["../src/high.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type { StateMetadata, Exitable, StatifiableObj } from "./low.js";
|
|
2
|
+
export declare const exitProxySymbol: unique symbol;
|
|
3
|
+
export declare let globalStateMode: "normal" | "extract-proxy-path";
|
|
4
|
+
export declare function setGlobalStateMode(mode: "normal" | "extract-proxy-path"): void;
|
|
5
|
+
export declare const metadataMap: WeakMap<Statify<StatifiableObj>, StateMetadata>;
|
|
6
|
+
export declare function getMetadataOf(v: Statify<StatifiableObj>): StateMetadata;
|
|
7
|
+
export declare function setMetadataOf(v: Statify<StatifiableObj>, s: StateMetadata): StateMetadata;
|
|
8
|
+
export declare const proxyMemoized: WeakMap<object, Statify<StatifiableObj>>;
|
|
9
|
+
export declare const statifySealKey: unique symbol;
|
|
10
|
+
export declare function isStatified<T extends StatifiableObj>(v: T): v is Statify<T>;
|
|
11
|
+
export type Statify<T extends StatifiableObj> = T & {
|
|
12
|
+
[statifySealKey]: true;
|
|
13
|
+
} & Exitable;
|
|
14
|
+
//# sourceMappingURL=internals.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"internals.d.ts","sourceRoot":"","sources":["../src/internals.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,QAAQ,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AAExE,eAAO,MAAM,eAAe,eAAW,CAAC;AAIxC,eAAO,IAAI,eAAe,EAAE,QAAQ,GAAG,oBAA+B,CAAC;AACvE,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,QAAQ,GAAG,oBAAoB,QAEvE;AAED,eAAO,MAAM,WAAW,iDAAwD,CAAC;AACjF,wBAAgB,aAAa,CAAC,CAAC,EAAE,OAAO,CAAC,cAAc,CAAC,iBAMvD;AACD,wBAAgB,aAAa,CAAC,CAAC,EAAE,OAAO,CAAC,cAAc,CAAC,EAAE,CAAC,EAAE,aAAa,iBAIzE;AAED,eAAO,MAAM,aAAa,0CAAiD,CAAC;AAE5E,eAAO,MAAM,cAAc,eAAW,CAAC;AACvC,wBAAgB,WAAW,CAAC,CAAC,SAAS,cAAc,EAAE,CAAC,EAAE,CAAC,GAAG,CAAC,IAAI,OAAO,CAAC,CAAC,CAAC,CAE3E;AACD,MAAM,MAAM,OAAO,CAAC,CAAC,SAAS,cAAc,IAAI,CAAC,GAAG;IAAE,CAAC,cAAc,CAAC,EAAE,IAAI,CAAA;CAAE,GAAG,QAAQ,CAAC"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
export const exitProxySymbol = Symbol();
|
|
2
|
+
// The mode is used by the functions exposed by informa,
|
|
3
|
+
// no concurrency issues arise because of the unique call stack.
|
|
4
|
+
export let globalStateMode = "normal";
|
|
5
|
+
export function setGlobalStateMode(mode) {
|
|
6
|
+
globalStateMode = mode;
|
|
7
|
+
}
|
|
8
|
+
export const metadataMap = new WeakMap();
|
|
9
|
+
export function getMetadataOf(v) {
|
|
10
|
+
const result = metadataMap.get(v);
|
|
11
|
+
if (!result)
|
|
12
|
+
throw new Error("Assertion failed: Metadata should have been created alongside statified object");
|
|
13
|
+
return result;
|
|
14
|
+
}
|
|
15
|
+
export function setMetadataOf(v, s) {
|
|
16
|
+
metadataMap.set(v, s);
|
|
17
|
+
return s;
|
|
18
|
+
}
|
|
19
|
+
export const proxyMemoized = new WeakMap();
|
|
20
|
+
export const statifySealKey = Symbol();
|
|
21
|
+
export function isStatified(v) {
|
|
22
|
+
return v[statifySealKey];
|
|
23
|
+
}
|
|
24
|
+
//# sourceMappingURL=internals.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"internals.js","sourceRoot":"","sources":["../src/internals.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,eAAe,GAAG,MAAM,EAAE,CAAC;AAExC,wDAAwD;AACxD,gEAAgE;AAChE,MAAM,CAAC,IAAI,eAAe,GAAoC,QAAQ,CAAC;AACvE,MAAM,UAAU,kBAAkB,CAAC,IAAqC;IACtE,eAAe,GAAG,IAAI,CAAC;AACzB,CAAC;AAED,MAAM,CAAC,MAAM,WAAW,GAAG,IAAI,OAAO,EAA0C,CAAC;AACjF,MAAM,UAAU,aAAa,CAAC,CAA0B;IACtD,MAAM,MAAM,GAAG,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;IAElC,IAAI,CAAC,MAAM;QAAE,MAAM,IAAI,KAAK,CAAC,gFAAgF,CAAC,CAAC;IAE/G,OAAO,MAAM,CAAC;AAChB,CAAC;AACD,MAAM,UAAU,aAAa,CAAC,CAA0B,EAAE,CAAgB;IACxE,WAAW,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IAEtB,OAAO,CAAC,CAAC;AACX,CAAC;AAED,MAAM,CAAC,MAAM,aAAa,GAAG,IAAI,OAAO,EAAmC,CAAC;AAE5E,MAAM,CAAC,MAAM,cAAc,GAAG,MAAM,EAAE,CAAC;AACvC,MAAM,UAAU,WAAW,CAA2B,CAAI;IACxD,OAAQ,CAAgB,CAAC,cAAc,CAAC,CAAC;AAC3C,CAAC"}
|
package/dist/low.d.ts
ADDED
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import { exitProxySymbol, type Statify } from "./internals.js";
|
|
2
|
+
import { EventEmitter } from "node:events";
|
|
3
|
+
import { StatifiedSet } from "./quirks/set.js";
|
|
4
|
+
import { EnumerableWeakMap } from "./EnumerableWeakMap.js";
|
|
5
|
+
type ProxyEventEmitterEvents = {
|
|
6
|
+
"set": [any];
|
|
7
|
+
"replace": [any];
|
|
8
|
+
"deleteProp": [any, string | symbol];
|
|
9
|
+
"setProp": [any, string | symbol];
|
|
10
|
+
"replaceProp": [any, string | symbol];
|
|
11
|
+
"lengthChanged": [];
|
|
12
|
+
"spliceInElement": [any, number];
|
|
13
|
+
"spliceOutElement": [any, number];
|
|
14
|
+
"replaceElement": [any, number];
|
|
15
|
+
"sizeChanged": [];
|
|
16
|
+
"addItem": [any];
|
|
17
|
+
"deleteItem": [any];
|
|
18
|
+
} & Record<string, never>;
|
|
19
|
+
declare class Tree<T, U> {
|
|
20
|
+
value: U;
|
|
21
|
+
children: Map<T, Tree<T, U>>;
|
|
22
|
+
constructor(value: U);
|
|
23
|
+
get(key: T): Tree<T, U> | undefined;
|
|
24
|
+
getOrCreate(key: T, creation: (k: T) => U): Tree<T, U>;
|
|
25
|
+
}
|
|
26
|
+
export declare class StateMetadata extends EventEmitter<ProxyEventEmitterEvents> {
|
|
27
|
+
#private;
|
|
28
|
+
eventEmitterTree: Tree<string | symbol, StateMetadata>;
|
|
29
|
+
parents: EnumerableWeakMap<StateMetadata, Set<string | symbol>>;
|
|
30
|
+
eventEmitterAtPath(path: (string | symbol)[]): StateMetadata;
|
|
31
|
+
eventEmitterAtPathMaybe(path: (string | symbol)[]): StateMetadata | undefined;
|
|
32
|
+
emit<E extends string | symbol>(eventName: string | E, ...args: E extends string ? ProxyEventEmitterEvents[E] : E extends keyof EventEmitter.EventEmitterEventMap ? EventEmitter.EventEmitterEventMap[E] : any[]): boolean;
|
|
33
|
+
}
|
|
34
|
+
export interface ExitProxyValue {
|
|
35
|
+
path: (string | symbol)[];
|
|
36
|
+
stateRoot: Statify<StatifiableObj>;
|
|
37
|
+
}
|
|
38
|
+
export interface Exitable {
|
|
39
|
+
[exitProxySymbol]: ExitProxyValue;
|
|
40
|
+
}
|
|
41
|
+
export type StatifiableProp = boolean | string | number | bigint | symbol | null | undefined | StatifiableObj | Statify<StatifiableObj>;
|
|
42
|
+
export type StatifiableObj = {
|
|
43
|
+
[k: string | symbol]: StatifiableProp;
|
|
44
|
+
} | {};
|
|
45
|
+
export type Statified<T extends StatifiableProp> = T extends object ? T extends Set<infer U> ? StatifiedSet<Statified<U>> : T extends Set<any> ? never : Statify<{
|
|
46
|
+
[K in keyof T]: Statified<T[K]>;
|
|
47
|
+
}> : T;
|
|
48
|
+
export declare function statifyObject<T extends {
|
|
49
|
+
[k: string | symbol]: Statified<StatifiableProp>;
|
|
50
|
+
}>(target: T): Statified<T>;
|
|
51
|
+
export declare function extract(targetMaybePrimitive: unknown, stateRoot: Statify<StatifiableObj>, path: (string | symbol)[]): Record<string | symbol, unknown> & Exitable;
|
|
52
|
+
export declare function selectorToRootAndPath(selector: () => Statify<StatifiableObj>): ExitProxyValue;
|
|
53
|
+
export declare function hook(fromMetadata: StateMetadata, prop: string | symbol, toMetadata: StateMetadata): void;
|
|
54
|
+
export declare function unhook(fromMetadata: StateMetadata, prop: string | symbol, toMetadata: StateMetadata): void;
|
|
55
|
+
export declare function emitDescendantPathEvents(rootMetadata: StateMetadata, prefixPath: (string | symbol)[], nextRootValue: unknown, emitReplace: boolean): void;
|
|
56
|
+
export {};
|
|
57
|
+
//# sourceMappingURL=low.d.ts.map
|