@fluixi/reactive 1.0.0-alpha.53
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/LICENSE +21 -0
- package/README.md +343 -0
- package/dist/cdn/reactive.cjs +1 -0
- package/dist/cdn/reactive.d.ts +11 -0
- package/dist/cdn/reactive.d.ts.map +1 -0
- package/dist/cdn/reactive.global.js +1 -0
- package/dist/cdn/reactive.js +10 -0
- package/dist/cdn/reactive.mjs +1 -0
- package/dist/cdn/signal.cjs +1 -0
- package/dist/cdn/signal.d.ts +19 -0
- package/dist/cdn/signal.d.ts.map +1 -0
- package/dist/cdn/signal.global.js +1 -0
- package/dist/cdn/signal.js +18 -0
- package/dist/cdn/signal.mjs +1 -0
- package/dist/index.cjs +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +1 -0
- package/dist/index.mjs +1 -0
- package/dist/lib/index.cjs +1 -0
- package/dist/lib/index.d.ts +5 -0
- package/dist/lib/index.d.ts.map +1 -0
- package/dist/lib/index.js +4 -0
- package/dist/lib/index.mjs +1 -0
- package/dist/lib/observable/index.cjs +1 -0
- package/dist/lib/observable/index.d.ts +4 -0
- package/dist/lib/observable/index.d.ts.map +1 -0
- package/dist/lib/observable/index.js +3 -0
- package/dist/lib/observable/index.mjs +1 -0
- package/dist/lib/observable/observable.cjs +1 -0
- package/dist/lib/observable/observable.d.ts +383 -0
- package/dist/lib/observable/observable.d.ts.map +1 -0
- package/dist/lib/observable/observable.js +339 -0
- package/dist/lib/observable/observable.mjs +1 -0
- package/dist/lib/observable/subscription.cjs +1 -0
- package/dist/lib/observable/subscription.d.ts +70 -0
- package/dist/lib/observable/subscription.d.ts.map +1 -0
- package/dist/lib/observable/subscription.js +190 -0
- package/dist/lib/observable/subscription.mjs +1 -0
- package/dist/lib/observable/types.cjs +1 -0
- package/dist/lib/observable/types.d.ts +44 -0
- package/dist/lib/observable/types.d.ts.map +1 -0
- package/dist/lib/observable/types.js +1 -0
- package/dist/lib/observable/types.mjs +0 -0
- package/dist/lib/signal/cached-resource.cjs +1 -0
- package/dist/lib/signal/cached-resource.d.ts +94 -0
- package/dist/lib/signal/cached-resource.d.ts.map +1 -0
- package/dist/lib/signal/cached-resource.js +257 -0
- package/dist/lib/signal/cached-resource.mjs +1 -0
- package/dist/lib/signal/graph/children.cjs +1 -0
- package/dist/lib/signal/graph/children.d.ts +2 -0
- package/dist/lib/signal/graph/children.d.ts.map +1 -0
- package/dist/lib/signal/graph/children.js +30 -0
- package/dist/lib/signal/graph/children.mjs +1 -0
- package/dist/lib/signal/graph/compat.cjs +1 -0
- package/dist/lib/signal/graph/compat.d.ts +64 -0
- package/dist/lib/signal/graph/compat.d.ts.map +1 -0
- package/dist/lib/signal/graph/compat.js +178 -0
- package/dist/lib/signal/graph/compat.mjs +1 -0
- package/dist/lib/signal/graph/core.cjs +1 -0
- package/dist/lib/signal/graph/core.d.ts +95 -0
- package/dist/lib/signal/graph/core.d.ts.map +1 -0
- package/dist/lib/signal/graph/core.js +254 -0
- package/dist/lib/signal/graph/core.mjs +1 -0
- package/dist/lib/signal/graph/derived.cjs +1 -0
- package/dist/lib/signal/graph/derived.d.ts +14 -0
- package/dist/lib/signal/graph/derived.d.ts.map +1 -0
- package/dist/lib/signal/graph/derived.js +81 -0
- package/dist/lib/signal/graph/derived.mjs +1 -0
- package/dist/lib/signal/graph/detect.cjs +1 -0
- package/dist/lib/signal/graph/detect.d.ts +16 -0
- package/dist/lib/signal/graph/detect.d.ts.map +1 -0
- package/dist/lib/signal/graph/detect.js +36 -0
- package/dist/lib/signal/graph/detect.mjs +1 -0
- package/dist/lib/signal/graph/error-boundary.cjs +1 -0
- package/dist/lib/signal/graph/error-boundary.d.ts +16 -0
- package/dist/lib/signal/graph/error-boundary.d.ts.map +1 -0
- package/dist/lib/signal/graph/error-boundary.js +34 -0
- package/dist/lib/signal/graph/error-boundary.mjs +1 -0
- package/dist/lib/signal/graph/index.cjs +1 -0
- package/dist/lib/signal/graph/index.d.ts +21 -0
- package/dist/lib/signal/graph/index.d.ts.map +1 -0
- package/dist/lib/signal/graph/index.js +20 -0
- package/dist/lib/signal/graph/index.mjs +1 -0
- package/dist/lib/signal/graph/resource.cjs +1 -0
- package/dist/lib/signal/graph/resource.d.ts +36 -0
- package/dist/lib/signal/graph/resource.d.ts.map +1 -0
- package/dist/lib/signal/graph/resource.js +156 -0
- package/dist/lib/signal/graph/resource.mjs +1 -0
- package/dist/lib/signal/graph/runtime.cjs +1 -0
- package/dist/lib/signal/graph/runtime.d.ts +56 -0
- package/dist/lib/signal/graph/runtime.d.ts.map +1 -0
- package/dist/lib/signal/graph/runtime.js +277 -0
- package/dist/lib/signal/graph/runtime.mjs +1 -0
- package/dist/lib/signal/graph/signal-next.cjs +1 -0
- package/dist/lib/signal/graph/signal-next.d.ts +37 -0
- package/dist/lib/signal/graph/signal-next.d.ts.map +1 -0
- package/dist/lib/signal/graph/signal-next.js +41 -0
- package/dist/lib/signal/graph/signal-next.mjs +1 -0
- package/dist/lib/signal/graph/ssr-hooks.cjs +1 -0
- package/dist/lib/signal/graph/ssr-hooks.d.ts +28 -0
- package/dist/lib/signal/graph/ssr-hooks.d.ts.map +1 -0
- package/dist/lib/signal/graph/ssr-hooks.js +45 -0
- package/dist/lib/signal/graph/ssr-hooks.mjs +1 -0
- package/dist/lib/signal/graph/state.cjs +1 -0
- package/dist/lib/signal/graph/state.d.ts +43 -0
- package/dist/lib/signal/graph/state.d.ts.map +1 -0
- package/dist/lib/signal/graph/state.js +37 -0
- package/dist/lib/signal/graph/state.mjs +1 -0
- package/dist/lib/signal/graph/suspense.cjs +1 -0
- package/dist/lib/signal/graph/suspense.d.ts +13 -0
- package/dist/lib/signal/graph/suspense.d.ts.map +1 -0
- package/dist/lib/signal/graph/suspense.js +36 -0
- package/dist/lib/signal/graph/suspense.mjs +1 -0
- package/dist/lib/signal/index-legacy.cjs +1 -0
- package/dist/lib/signal/index-legacy.d.ts +12 -0
- package/dist/lib/signal/index-legacy.d.ts.map +1 -0
- package/dist/lib/signal/index-legacy.js +11 -0
- package/dist/lib/signal/index-legacy.mjs +1 -0
- package/dist/lib/signal/index.cjs +1 -0
- package/dist/lib/signal/index.d.ts +12 -0
- package/dist/lib/signal/index.d.ts.map +1 -0
- package/dist/lib/signal/index.js +11 -0
- package/dist/lib/signal/index.mjs +1 -0
- package/dist/lib/signal/list.cjs +1 -0
- package/dist/lib/signal/list.d.ts +39 -0
- package/dist/lib/signal/list.d.ts.map +1 -0
- package/dist/lib/signal/list.js +172 -0
- package/dist/lib/signal/list.mjs +1 -0
- package/dist/lib/signal/signal.cjs +1 -0
- package/dist/lib/signal/signal.d.ts +295 -0
- package/dist/lib/signal/signal.d.ts.map +1 -0
- package/dist/lib/signal/signal.js +1219 -0
- package/dist/lib/signal/signal.mjs +1 -0
- package/dist/lib/signal/types.cjs +1 -0
- package/dist/lib/signal/types.d.ts +133 -0
- package/dist/lib/signal/types.d.ts.map +1 -0
- package/dist/lib/signal/types.js +38 -0
- package/dist/lib/signal/types.mjs +1 -0
- package/dist/lib/signal/utilities.cjs +1 -0
- package/dist/lib/signal/utilities.d.ts +355 -0
- package/dist/lib/signal/utilities.d.ts.map +1 -0
- package/dist/lib/signal/utilities.js +504 -0
- package/dist/lib/signal/utilities.mjs +1 -0
- package/dist/lib/store/index.cjs +1 -0
- package/dist/lib/store/index.d.ts +14 -0
- package/dist/lib/store/index.d.ts.map +1 -0
- package/dist/lib/store/index.js +11 -0
- package/dist/lib/store/index.mjs +1 -0
- package/dist/lib/store/setter.types.cjs +1 -0
- package/dist/lib/store/setter.types.d.ts +79 -0
- package/dist/lib/store/setter.types.d.ts.map +1 -0
- package/dist/lib/store/setter.types.js +65 -0
- package/dist/lib/store/setter.types.mjs +0 -0
- package/dist/lib/store/store.cjs +1 -0
- package/dist/lib/store/store.d.ts +86 -0
- package/dist/lib/store/store.d.ts.map +1 -0
- package/dist/lib/store/store.js +442 -0
- package/dist/lib/store/store.mjs +1 -0
- package/dist/lib/store/types.cjs +1 -0
- package/dist/lib/store/types.d.ts +57 -0
- package/dist/lib/store/types.d.ts.map +1 -0
- package/dist/lib/store/types.js +1 -0
- package/dist/lib/store/types.mjs +0 -0
- package/dist/lib/store/utils.cjs +1 -0
- package/dist/lib/store/utils.d.ts +13 -0
- package/dist/lib/store/utils.d.ts.map +1 -0
- package/dist/lib/store/utils.js +29 -0
- package/dist/lib/store/utils.mjs +1 -0
- package/dist/lib/subject.cjs +1 -0
- package/dist/lib/subject.d.ts +14 -0
- package/dist/lib/subject.d.ts.map +1 -0
- package/dist/lib/subject.js +169 -0
- package/dist/lib/subject.mjs +1 -0
- package/dist/tsconfig.lib.tsbuildinfo +1 -0
- package/package.json +114 -0
|
@@ -0,0 +1,442 @@
|
|
|
1
|
+
import { $PROXY, batch, createEffect, createMemo, createSignal, untrack, } from '@fluixi/reactive/signal';
|
|
2
|
+
export const $RAW = Symbol('store-raw'), $NODE = Symbol('store-node'), $HAS = Symbol('store-has'), $SELF = Symbol('store-self'), $TRACK = Symbol('store-track'), $NAME = Symbol('store-name'), $STORE = Symbol('store-store');
|
|
3
|
+
const NODES = new WeakMap();
|
|
4
|
+
const PROXIES = new WeakMap();
|
|
5
|
+
function createDataNode(initial) {
|
|
6
|
+
const [get, set] = createSignal(initial);
|
|
7
|
+
const node = get;
|
|
8
|
+
node.$ = set;
|
|
9
|
+
return node;
|
|
10
|
+
}
|
|
11
|
+
function nodesOf(target) {
|
|
12
|
+
let ns = NODES.get(target);
|
|
13
|
+
if (!ns)
|
|
14
|
+
NODES.set(target, (ns = { keys: new Map() }));
|
|
15
|
+
return ns;
|
|
16
|
+
}
|
|
17
|
+
function keyNode(ns, key, seed) {
|
|
18
|
+
let node = ns.keys.get(key);
|
|
19
|
+
if (!node)
|
|
20
|
+
ns.keys.set(key, (node = createDataNode(seed)));
|
|
21
|
+
return node;
|
|
22
|
+
}
|
|
23
|
+
function trackKeys(target) {
|
|
24
|
+
const ns = nodesOf(target);
|
|
25
|
+
(ns.all || (ns.all = createDataNode()))();
|
|
26
|
+
}
|
|
27
|
+
// The signal setter reads a function argument as an updater, so a function value
|
|
28
|
+
// has to be handed over wrapped.
|
|
29
|
+
function pokeNode(node, value) {
|
|
30
|
+
node.$(typeof value === 'function' ? () => value : value);
|
|
31
|
+
}
|
|
32
|
+
function isTrackable(value) {
|
|
33
|
+
if (value == null || typeof value !== 'object')
|
|
34
|
+
return false;
|
|
35
|
+
if (Array.isArray(value))
|
|
36
|
+
return true;
|
|
37
|
+
const proto = Object.getPrototypeOf(value);
|
|
38
|
+
return proto === Object.prototype || proto === null;
|
|
39
|
+
}
|
|
40
|
+
function box(value) {
|
|
41
|
+
if (!isTrackable(value))
|
|
42
|
+
return value;
|
|
43
|
+
const existing = PROXIES.get(value);
|
|
44
|
+
if (existing)
|
|
45
|
+
return existing;
|
|
46
|
+
const proxy = new Proxy(value, handler);
|
|
47
|
+
PROXIES.set(value, proxy);
|
|
48
|
+
return proxy;
|
|
49
|
+
}
|
|
50
|
+
const handler = {
|
|
51
|
+
get(target, key, receiver) {
|
|
52
|
+
if (key === $RAW)
|
|
53
|
+
return target;
|
|
54
|
+
if (key === $NODE)
|
|
55
|
+
return target;
|
|
56
|
+
if (key === $PROXY)
|
|
57
|
+
return receiver;
|
|
58
|
+
if (key === $HAS)
|
|
59
|
+
return (k) => k in target;
|
|
60
|
+
if (key === '__proxy')
|
|
61
|
+
return true;
|
|
62
|
+
if (key === $TRACK || key === $SELF) {
|
|
63
|
+
trackKeys(target);
|
|
64
|
+
return receiver;
|
|
65
|
+
}
|
|
66
|
+
const value = target[key];
|
|
67
|
+
// Prototype methods (array iterators/mutators and the like) go back untouched
|
|
68
|
+
// so they run with the proxy as `this` and their element reads track per key.
|
|
69
|
+
if (typeof value === 'function' &&
|
|
70
|
+
!Object.prototype.hasOwnProperty.call(target, key)) {
|
|
71
|
+
return value;
|
|
72
|
+
}
|
|
73
|
+
const desc = Object.getOwnPropertyDescriptor(target, key);
|
|
74
|
+
if (desc && desc.get)
|
|
75
|
+
return desc.get.call(receiver);
|
|
76
|
+
const current = keyNode(nodesOf(target), key, value)();
|
|
77
|
+
return isTrackable(current) ? box(current) : current;
|
|
78
|
+
},
|
|
79
|
+
set() {
|
|
80
|
+
// The proxy is read-only; writes come in through the setter.
|
|
81
|
+
return true;
|
|
82
|
+
},
|
|
83
|
+
deleteProperty(target, key) {
|
|
84
|
+
if (key in target)
|
|
85
|
+
writeKey(target, key, undefined);
|
|
86
|
+
return true;
|
|
87
|
+
},
|
|
88
|
+
has(target, key) {
|
|
89
|
+
if (key === $RAW ||
|
|
90
|
+
key === $PROXY ||
|
|
91
|
+
key === $NODE ||
|
|
92
|
+
key === $HAS ||
|
|
93
|
+
key === $SELF ||
|
|
94
|
+
key === $TRACK)
|
|
95
|
+
return true;
|
|
96
|
+
keyNode(nodesOf(target), key, target[key])();
|
|
97
|
+
return key in target;
|
|
98
|
+
},
|
|
99
|
+
ownKeys(target) {
|
|
100
|
+
trackKeys(target);
|
|
101
|
+
return Reflect.ownKeys(target);
|
|
102
|
+
},
|
|
103
|
+
getOwnPropertyDescriptor(target, key) {
|
|
104
|
+
return Reflect.getOwnPropertyDescriptor(target, key);
|
|
105
|
+
},
|
|
106
|
+
};
|
|
107
|
+
// writes
|
|
108
|
+
// Writes one key on a raw node and pokes what changed: the key's own signal, the
|
|
109
|
+
// array length signal when the length moved, and the iteration signal.
|
|
110
|
+
function writeKey(state, key, value) {
|
|
111
|
+
const prev = state[key];
|
|
112
|
+
if (prev === value && (value !== undefined || key in state))
|
|
113
|
+
return;
|
|
114
|
+
const isArray = Array.isArray(state);
|
|
115
|
+
const len = isArray ? state.length : 0;
|
|
116
|
+
if (value === undefined)
|
|
117
|
+
delete state[key];
|
|
118
|
+
else
|
|
119
|
+
state[key] = value;
|
|
120
|
+
const ns = nodesOf(state);
|
|
121
|
+
const node = ns.keys.get(key);
|
|
122
|
+
if (node)
|
|
123
|
+
pokeNode(node, value);
|
|
124
|
+
if (isArray && state.length !== len) {
|
|
125
|
+
const lengthNode = ns.keys.get('length');
|
|
126
|
+
if (lengthNode)
|
|
127
|
+
pokeNode(lengthNode, state.length);
|
|
128
|
+
}
|
|
129
|
+
if (ns.all)
|
|
130
|
+
ns.all.$(undefined);
|
|
131
|
+
}
|
|
132
|
+
function nextValue(value, prev) {
|
|
133
|
+
return typeof value === 'function' ? value(prev) : value;
|
|
134
|
+
}
|
|
135
|
+
// Per-key merge of a partial object; recurses into plain objects, replaces the rest.
|
|
136
|
+
function mergeInto(state, value) {
|
|
137
|
+
for (const key of Object.keys(value)) {
|
|
138
|
+
const next = value[key];
|
|
139
|
+
const prev = state[key];
|
|
140
|
+
if (next &&
|
|
141
|
+
typeof next === 'object' &&
|
|
142
|
+
!Array.isArray(next) &&
|
|
143
|
+
prev &&
|
|
144
|
+
typeof prev === 'object' &&
|
|
145
|
+
!Array.isArray(prev)) {
|
|
146
|
+
mergeInto(prev, next);
|
|
147
|
+
}
|
|
148
|
+
else {
|
|
149
|
+
writeKey(state, key, next);
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
// "a.b[0].c" -> ["a","b","0","c"], "[*].done" -> ["*","done"], "[0][1]" -> ["0","1"].
|
|
154
|
+
function parsePath(path) {
|
|
155
|
+
const out = [];
|
|
156
|
+
const normalized = path.replace(/\[([^\]]*)\]/g, '.$1');
|
|
157
|
+
for (const part of normalized.split('.'))
|
|
158
|
+
if (part.length)
|
|
159
|
+
out.push(part);
|
|
160
|
+
return out;
|
|
161
|
+
}
|
|
162
|
+
function applyAt(current, segs, value) {
|
|
163
|
+
const last = segs.length - 1;
|
|
164
|
+
for (let i = 0; i < last; i++) {
|
|
165
|
+
const seg = segs[i];
|
|
166
|
+
if (seg === '*') {
|
|
167
|
+
const rest = segs.slice(i + 1);
|
|
168
|
+
if (Array.isArray(current))
|
|
169
|
+
for (let idx = 0; idx < current.length; idx++)
|
|
170
|
+
applyAt(current[idx], rest, value);
|
|
171
|
+
return;
|
|
172
|
+
}
|
|
173
|
+
let next = current[seg];
|
|
174
|
+
if (next == null || typeof next !== 'object') {
|
|
175
|
+
next = /^\d+$/.test(segs[i + 1]) ? [] : {};
|
|
176
|
+
writeKey(current, seg, next);
|
|
177
|
+
}
|
|
178
|
+
current = next;
|
|
179
|
+
}
|
|
180
|
+
const term = segs[last];
|
|
181
|
+
if (term === '*') {
|
|
182
|
+
if (Array.isArray(current))
|
|
183
|
+
for (let idx = 0; idx < current.length; idx++)
|
|
184
|
+
writeKey(current, idx, nextValue(value, current[idx]));
|
|
185
|
+
return;
|
|
186
|
+
}
|
|
187
|
+
writeKey(current, term, nextValue(value, current[term]));
|
|
188
|
+
}
|
|
189
|
+
function applyPath(root, path, value) {
|
|
190
|
+
applyAt(root, parsePath(path), value);
|
|
191
|
+
}
|
|
192
|
+
/**
|
|
193
|
+
* Runs the setter overloads against the raw root:
|
|
194
|
+
* set(state => newState) whole-state updater, merged back
|
|
195
|
+
* set(partialObject) per-key merge
|
|
196
|
+
* set([[path, valOrFn], ...]) batch of path updates
|
|
197
|
+
* set(path, ['seg', ...], val) path plus extra segments
|
|
198
|
+
* set(path, val | updater) the common form (dotted, [n], [*])
|
|
199
|
+
*/
|
|
200
|
+
function applySet(root, args) {
|
|
201
|
+
const first = args[0];
|
|
202
|
+
if (typeof first === 'function' && args.length === 1) {
|
|
203
|
+
const next = first(root);
|
|
204
|
+
if (next && next !== root)
|
|
205
|
+
mergeInto(root, next);
|
|
206
|
+
return;
|
|
207
|
+
}
|
|
208
|
+
if (Array.isArray(first) && args.length === 1) {
|
|
209
|
+
for (const entry of first)
|
|
210
|
+
if (Array.isArray(entry))
|
|
211
|
+
applyPath(root, entry[0], entry[1]);
|
|
212
|
+
return;
|
|
213
|
+
}
|
|
214
|
+
if (first &&
|
|
215
|
+
typeof first === 'object' &&
|
|
216
|
+
!Array.isArray(first) &&
|
|
217
|
+
args.length === 1) {
|
|
218
|
+
mergeInto(root, first);
|
|
219
|
+
return;
|
|
220
|
+
}
|
|
221
|
+
if (Array.isArray(args[1]) && args.length >= 3) {
|
|
222
|
+
applyPath(root, `${first}.${args[1].join('.')}`, args[2]);
|
|
223
|
+
return;
|
|
224
|
+
}
|
|
225
|
+
applyPath(root, String(first), args[1]);
|
|
226
|
+
}
|
|
227
|
+
function clone(value) {
|
|
228
|
+
if (value == null || typeof value !== 'object')
|
|
229
|
+
return value;
|
|
230
|
+
if (Array.isArray(value))
|
|
231
|
+
return value.map(clone);
|
|
232
|
+
const out = {};
|
|
233
|
+
for (const key of Object.keys(value))
|
|
234
|
+
out[key] = clone(value[key]);
|
|
235
|
+
return out;
|
|
236
|
+
}
|
|
237
|
+
// Walks the raw tree along a path without tracking.
|
|
238
|
+
function rawAt(root, path) {
|
|
239
|
+
let cur = root;
|
|
240
|
+
for (const seg of parsePath(path)) {
|
|
241
|
+
if (cur == null)
|
|
242
|
+
return undefined;
|
|
243
|
+
cur = cur[seg];
|
|
244
|
+
}
|
|
245
|
+
return cur;
|
|
246
|
+
}
|
|
247
|
+
// store
|
|
248
|
+
// Thin holder around the raw root and its proxy.
|
|
249
|
+
class Store {
|
|
250
|
+
options;
|
|
251
|
+
root;
|
|
252
|
+
set;
|
|
253
|
+
constructor(initialState, options = { immutable: true }) {
|
|
254
|
+
this.options = options;
|
|
255
|
+
this.root = initialState;
|
|
256
|
+
this.set = ((...args) => batch(() => applySet(this.root, args)));
|
|
257
|
+
}
|
|
258
|
+
get state() {
|
|
259
|
+
return box(this.root);
|
|
260
|
+
}
|
|
261
|
+
get proxy() {
|
|
262
|
+
return box(this.root);
|
|
263
|
+
}
|
|
264
|
+
get accessor() {
|
|
265
|
+
return (() => box(this.root));
|
|
266
|
+
}
|
|
267
|
+
unwrap() {
|
|
268
|
+
return this.root;
|
|
269
|
+
}
|
|
270
|
+
getNode(key) {
|
|
271
|
+
return this.root && this.root[key];
|
|
272
|
+
}
|
|
273
|
+
// Tracked read at a path. Empty path returns the whole (unwrapped) state.
|
|
274
|
+
get(path) {
|
|
275
|
+
if (path == null || path === '')
|
|
276
|
+
return unwrap(this.state);
|
|
277
|
+
let cur = this.state;
|
|
278
|
+
for (const seg of parsePath(path)) {
|
|
279
|
+
if (cur == null)
|
|
280
|
+
return undefined;
|
|
281
|
+
cur = cur[seg];
|
|
282
|
+
}
|
|
283
|
+
return unwrap(cur);
|
|
284
|
+
}
|
|
285
|
+
select(selector) {
|
|
286
|
+
return createMemo(() => selector(this.state));
|
|
287
|
+
}
|
|
288
|
+
subscribe(listener) {
|
|
289
|
+
return createEffect(() => listener(this.state));
|
|
290
|
+
}
|
|
291
|
+
watch(selector, effect) {
|
|
292
|
+
let prev;
|
|
293
|
+
return createEffect(() => {
|
|
294
|
+
const cur = selector(this.state);
|
|
295
|
+
if (!Object.is(cur, prev)) {
|
|
296
|
+
effect(cur, prev);
|
|
297
|
+
prev = cur;
|
|
298
|
+
}
|
|
299
|
+
});
|
|
300
|
+
}
|
|
301
|
+
// Reactive accessor for a top-level key.
|
|
302
|
+
reactive(key) {
|
|
303
|
+
return createMemo(() => this.state[key]);
|
|
304
|
+
}
|
|
305
|
+
produce(producer) {
|
|
306
|
+
this.set(((prev) => {
|
|
307
|
+
const draft = clone(prev);
|
|
308
|
+
producer(draft);
|
|
309
|
+
return draft;
|
|
310
|
+
}));
|
|
311
|
+
}
|
|
312
|
+
reconcile(value, _options = {}) {
|
|
313
|
+
this.set(value);
|
|
314
|
+
}
|
|
315
|
+
push(path, ...items) {
|
|
316
|
+
const arr = rawAt(this.root, path);
|
|
317
|
+
this.set(path, arr.concat(items));
|
|
318
|
+
}
|
|
319
|
+
pop(path) {
|
|
320
|
+
const arr = rawAt(this.root, path).slice();
|
|
321
|
+
const item = arr.pop();
|
|
322
|
+
this.set(path, arr);
|
|
323
|
+
return item;
|
|
324
|
+
}
|
|
325
|
+
shift(path) {
|
|
326
|
+
const arr = rawAt(this.root, path).slice();
|
|
327
|
+
const item = arr.shift();
|
|
328
|
+
this.set(path, arr);
|
|
329
|
+
return item;
|
|
330
|
+
}
|
|
331
|
+
splice(path, start, deleteCount, ...items) {
|
|
332
|
+
const arr = rawAt(this.root, path).slice();
|
|
333
|
+
const removed = arr.splice(start, deleteCount, ...items);
|
|
334
|
+
this.set(path, arr);
|
|
335
|
+
return removed;
|
|
336
|
+
}
|
|
337
|
+
insert(path, index, value) {
|
|
338
|
+
const arr = rawAt(this.root, path).slice();
|
|
339
|
+
arr.splice(index, 0, value);
|
|
340
|
+
this.set(path, arr);
|
|
341
|
+
}
|
|
342
|
+
removeAt(path, index) {
|
|
343
|
+
const arr = rawAt(this.root, path).slice();
|
|
344
|
+
const removed = arr.splice(index, 1);
|
|
345
|
+
this.set(path, arr);
|
|
346
|
+
return removed;
|
|
347
|
+
}
|
|
348
|
+
toObservable() {
|
|
349
|
+
const [get] = createSignal(this.state);
|
|
350
|
+
return get.toObservable();
|
|
351
|
+
}
|
|
352
|
+
dispose() { }
|
|
353
|
+
}
|
|
354
|
+
// The path/array/derivation helpers, attached to the returned setter (as the old
|
|
355
|
+
// API exposed them). Kept off the proxy since the proxy is read-only.
|
|
356
|
+
const SETTER_METHODS = [
|
|
357
|
+
'get',
|
|
358
|
+
'select',
|
|
359
|
+
'watch',
|
|
360
|
+
'subscribe',
|
|
361
|
+
'produce',
|
|
362
|
+
'reconcile',
|
|
363
|
+
'push',
|
|
364
|
+
'pop',
|
|
365
|
+
'shift',
|
|
366
|
+
'splice',
|
|
367
|
+
'insert',
|
|
368
|
+
'removeAt',
|
|
369
|
+
'unwrap',
|
|
370
|
+
'toObservable',
|
|
371
|
+
];
|
|
372
|
+
function attachStoreMethods(target, store) {
|
|
373
|
+
for (const name of SETTER_METHODS)
|
|
374
|
+
target[name] = store[name].bind(store);
|
|
375
|
+
target.$ = store.reactive.bind(store);
|
|
376
|
+
}
|
|
377
|
+
// public api
|
|
378
|
+
function createStore(initialState, options = { immutable: true }) {
|
|
379
|
+
const store = new Store(initialState, options);
|
|
380
|
+
attachStoreMethods(store.set, store);
|
|
381
|
+
return [store.proxy, store.set];
|
|
382
|
+
}
|
|
383
|
+
function createMutableStore(initialState, options = {}) {
|
|
384
|
+
return new Store(initialState, { ...options, immutable: false });
|
|
385
|
+
}
|
|
386
|
+
/** A store whose state is derived from a reactive function. */
|
|
387
|
+
function createComputedStore(fn, options = {}) {
|
|
388
|
+
const store = new Store(fn(), options);
|
|
389
|
+
createEffect(() => store.set(fn()));
|
|
390
|
+
return store;
|
|
391
|
+
}
|
|
392
|
+
/** Runs an effect over a slice of store state. */
|
|
393
|
+
function createStoreEffect(state, selector, effect) {
|
|
394
|
+
return createEffect(() => effect(selector(state)));
|
|
395
|
+
}
|
|
396
|
+
/** Memoises a slice of store state. */
|
|
397
|
+
function createStoreMemo(store, selector, options) {
|
|
398
|
+
return createMemo(() => selector(store), undefined, options);
|
|
399
|
+
}
|
|
400
|
+
/** Wraps a value as an accessor carrying the store helper methods. */
|
|
401
|
+
function wrap(value, options = {}) {
|
|
402
|
+
const store = new Store(value, options);
|
|
403
|
+
const accessor = (() => store.proxy);
|
|
404
|
+
attachStoreMethods(accessor, store);
|
|
405
|
+
return accessor;
|
|
406
|
+
}
|
|
407
|
+
function unwrap(item) {
|
|
408
|
+
if (item == null || typeof item !== 'object')
|
|
409
|
+
return item;
|
|
410
|
+
const raw = item[$RAW];
|
|
411
|
+
return raw !== undefined ? raw : item;
|
|
412
|
+
}
|
|
413
|
+
function untrackStore(store) {
|
|
414
|
+
return untrack(() => unwrap(store));
|
|
415
|
+
}
|
|
416
|
+
export function isStore(store) {
|
|
417
|
+
return isStoreProxy(store);
|
|
418
|
+
}
|
|
419
|
+
export function getNode(store) {
|
|
420
|
+
return isStoreProxy(store) ? store[$NODE] : null;
|
|
421
|
+
}
|
|
422
|
+
export function getStoreNode(store) {
|
|
423
|
+
if (store && typeof store === 'object' && $NODE in store)
|
|
424
|
+
return store[$NODE];
|
|
425
|
+
return null;
|
|
426
|
+
}
|
|
427
|
+
export function isStoreProxy(value) {
|
|
428
|
+
return (!!value &&
|
|
429
|
+
typeof value === 'object' &&
|
|
430
|
+
($PROXY in value || value.__proxy === true));
|
|
431
|
+
}
|
|
432
|
+
export function modifiable(value) {
|
|
433
|
+
return value;
|
|
434
|
+
}
|
|
435
|
+
export const StoreAPI = Object.freeze({
|
|
436
|
+
createStore,
|
|
437
|
+
createMutableStore,
|
|
438
|
+
batch,
|
|
439
|
+
unwrap,
|
|
440
|
+
untrackStore,
|
|
441
|
+
});
|
|
442
|
+
export { createStore, createMutableStore, createComputedStore, createStoreEffect, createStoreMemo, wrap, unwrap, untrackStore, Store, };
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{$PROXY as h,batch as _,createEffect as b,createMemo as A,createSignal as K,untrack as V}from"@fluixi/reactive/signal";var O=Symbol("store-raw"),f=Symbol("store-node"),I=Symbol("store-has"),w=Symbol("store-self"),P=Symbol("store-track"),G=Symbol("store-name"),J=Symbol("store-store"),v=new WeakMap,N=new WeakMap;function R(e){let[t,n]=K(e),r=t;return r.$=n,r}function m(e){let t=v.get(e);return t||v.set(e,t={keys:new Map}),t}function U(e,t,n){let r=e.keys.get(t);return r||e.keys.set(t,r=R(n)),r}function $(e){let t=m(e);(t.all||(t.all=R()))()}function M(e,t){e.$(typeof t=="function"?()=>t:t)}function E(e){if(e==null||typeof e!="object")return!1;if(Array.isArray(e))return!0;let t=Object.getPrototypeOf(e);return t===Object.prototype||t===null}function p(e){if(!E(e))return e;let t=N.get(e);if(t)return t;let n=new Proxy(e,z);return N.set(e,n),n}var z={get(e,t,n){if(t===O||t===f)return e;if(t===h)return n;if(t===I)return i=>i in e;if(t==="__proxy")return!0;if(t===P||t===w)return $(e),n;let r=e[t];if(typeof r=="function"&&!Object.prototype.hasOwnProperty.call(e,t))return r;let o=Object.getOwnPropertyDescriptor(e,t);if(o&&o.get)return o.get.call(n);let s=U(m(e),t,r)();return E(s)?p(s):s},set(){return!0},deleteProperty(e,t){return t in e&&u(e,t,void 0),!0},has(e,t){return t===O||t===h||t===f||t===I||t===w||t===P?!0:(U(m(e),t,e[t])(),t in e)},ownKeys(e){return $(e),Reflect.ownKeys(e)},getOwnPropertyDescriptor(e,t){return Reflect.getOwnPropertyDescriptor(e,t)}};function u(e,t,n){if(e[t]===n&&(n!==void 0||t in e))return;let o=Array.isArray(e),s=o?e.length:0;n===void 0?delete e[t]:e[t]=n;let i=m(e),a=i.keys.get(t);if(a&&M(a,n),o&&e.length!==s){let l=i.keys.get("length");l&&M(l,e.length)}i.all&&i.all.$(void 0)}function D(e,t){return typeof e=="function"?e(t):e}function g(e,t){for(let n of Object.keys(t)){let r=t[n],o=e[n];r&&typeof r=="object"&&!Array.isArray(r)&&o&&typeof o=="object"&&!Array.isArray(o)?g(o,r):u(e,n,r)}}function j(e){let t=[],n=e.replace(/\[([^\]]*)\]/g,".$1");for(let r of n.split("."))r.length&&t.push(r);return t}function W(e,t,n){let r=t.length-1;for(let s=0;s<r;s++){let i=t[s];if(i==="*"){let l=t.slice(s+1);if(Array.isArray(e))for(let T=0;T<e.length;T++)W(e[T],l,n);return}let a=e[i];(a==null||typeof a!="object")&&(a=/^\d+$/.test(t[s+1])?[]:{},u(e,i,a)),e=a}let o=t[r];if(o==="*"){if(Array.isArray(e))for(let s=0;s<e.length;s++)u(e,s,D(n,e[s]));return}u(e,o,D(n,e[o]))}function S(e,t,n){W(e,j(t),n)}function C(e,t){let n=t[0];if(typeof n=="function"&&t.length===1){let r=n(e);r&&r!==e&&g(e,r);return}if(Array.isArray(n)&&t.length===1){for(let r of n)Array.isArray(r)&&S(e,r[0],r[1]);return}if(n&&typeof n=="object"&&!Array.isArray(n)&&t.length===1){g(e,n);return}if(Array.isArray(t[1])&&t.length>=3){S(e,`${n}.${t[1].join(".")}`,t[2]);return}S(e,String(n),t[1])}function x(e){if(e==null||typeof e!="object")return e;if(Array.isArray(e))return e.map(x);let t={};for(let n of Object.keys(e))t[n]=x(e[n]);return t}function c(e,t){let n=e;for(let r of j(t)){if(n==null)return;n=n[r]}return n}var y=class{constructor(t,n={immutable:!0}){this.options=n;this.root=t,this.set=((...r)=>_(()=>C(this.root,r)))}get state(){return p(this.root)}get proxy(){return p(this.root)}get accessor(){return(()=>p(this.root))}unwrap(){return this.root}getNode(t){return this.root&&this.root[t]}get(t){if(t==null||t==="")return d(this.state);let n=this.state;for(let r of j(t)){if(n==null)return;n=n[r]}return d(n)}select(t){return A(()=>t(this.state))}subscribe(t){return b(()=>t(this.state))}watch(t,n){let r;return b(()=>{let o=t(this.state);Object.is(o,r)||(n(o,r),r=o)})}reactive(t){return A(()=>this.state[t])}produce(t){this.set((n=>{let r=x(n);return t(r),r}))}reconcile(t,n={}){this.set(t)}push(t,...n){let r=c(this.root,t);this.set(t,r.concat(n))}pop(t){let n=c(this.root,t).slice(),r=n.pop();return this.set(t,n),r}shift(t){let n=c(this.root,t).slice(),r=n.shift();return this.set(t,n),r}splice(t,n,r,...o){let s=c(this.root,t).slice(),i=s.splice(n,r,...o);return this.set(t,s),i}insert(t,n,r){let o=c(this.root,t).slice();o.splice(n,0,r),this.set(t,o)}removeAt(t,n){let r=c(this.root,t).slice(),o=r.splice(n,1);return this.set(t,r),o}toObservable(){let[t]=K(this.state);return t.toObservable()}dispose(){}},F=["get","select","watch","subscribe","produce","reconcile","push","pop","shift","splice","insert","removeAt","unwrap","toObservable"];function B(e,t){for(let n of F)e[n]=t[n].bind(t);e.$=t.reactive.bind(t)}function X(e,t={immutable:!0}){let n=new y(e,t);return B(n.set,n),[n.proxy,n.set]}function q(e,t={}){return new y(e,{...t,immutable:!1})}function Q(e,t={}){let n=new y(e(),t);return b(()=>n.set(e())),n}function Z(e,t,n){return b(()=>n(t(e)))}function k(e,t,n){return A(()=>t(e),void 0,n)}function tt(e,t={}){let n=new y(e,t),r=(()=>n.proxy);return B(r,n),r}function d(e){if(e==null||typeof e!="object")return e;let t=e[O];return t!==void 0?t:e}function L(e){return V(()=>d(e))}function et(e){return H(e)}function nt(e){return H(e)?e[f]:null}function rt(e){return e&&typeof e=="object"&&f in e?e[f]:null}function H(e){return!!e&&typeof e=="object"&&(h in e||e.__proxy===!0)}function ot(e){return e}var st=Object.freeze({createStore:X,createMutableStore:q,batch:_,unwrap:d,untrackStore:L});export{I as $HAS,G as $NAME,f as $NODE,O as $RAW,w as $SELF,J as $STORE,P as $TRACK,y as Store,st as StoreAPI,Q as createComputedStore,q as createMutableStore,X as createStore,Z as createStoreEffect,k as createStoreMemo,nt as getNode,rt as getStoreNode,et as isStore,H as isStoreProxy,ot as modifiable,L as untrackStore,d as unwrap,tt as wrap};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"use strict";var s=Object.defineProperty;var d=Object.getOwnPropertyDescriptor;var i=Object.getOwnPropertyNames;var x=Object.prototype.hasOwnProperty;var a=(n,e,T,r)=>{if(e&&typeof e=="object"||typeof e=="function")for(let t of i(e))!x.call(n,t)&&t!==T&&s(n,t,{get:()=>e[t],enumerable:!(r=d(e,t))||r.enumerable});return n};var y=n=>a(s({},"__esModule",{value:!0}),n);var K={};module.exports=y(K);
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
export interface ReconcileOptions {
|
|
2
|
+
/** Merge instead of replace (default: false) */
|
|
3
|
+
merge?: boolean;
|
|
4
|
+
/** Key for array reconciliation (default: 'id') */
|
|
5
|
+
key?: string;
|
|
6
|
+
}
|
|
7
|
+
export type Producer<T> = (draft: T) => void;
|
|
8
|
+
export type Primitive = string | number | boolean | undefined | null | symbol | bigint;
|
|
9
|
+
/** Convert a dot-path "a.b.0.c" → ["a","b",0,"c"] */
|
|
10
|
+
export type SinglePath<T, Prev extends string = '', Depth extends number = 4> = Depth extends 0 ? never : T extends Primitive ? Prev : T extends Array<infer U> ? SinglePath<U, Prev, Decrement[Depth]> : {
|
|
11
|
+
[K in keyof T]: SinglePath<T[K], Prev extends '' ? `${Extract<K, string>}` : `${Prev}.${Extract<K, string>}`, Decrement[Depth]>;
|
|
12
|
+
}[keyof T];
|
|
13
|
+
type Decrement = [never, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9];
|
|
14
|
+
export type Path<T> = SinglePath<T> | SinglePath<T>[];
|
|
15
|
+
export type UnionToIntersection<U extends any> = (U extends any ? (k: U) => void : never) extends (k: infer I) => void ? I : never;
|
|
16
|
+
export type GetResult<T extends Record<string, any>, P extends Path<T>> = CreateMutable<UnionToIntersection<_GetResult<T, P>>>;
|
|
17
|
+
type TupleOf<T, N extends number, R extends any[] = []> = R['length'] extends N ? R : TupleOf<T, N, [...R, T]>;
|
|
18
|
+
type Add<A extends number, B extends number> = [
|
|
19
|
+
...TupleOf<0, A>,
|
|
20
|
+
...TupleOf<0, B>
|
|
21
|
+
]['length'] & number;
|
|
22
|
+
export type CreateMutable<T extends any> = ExpandRecursively<{
|
|
23
|
+
[K in keyof T]: T[K] extends object ? CreateMutable<T[K]> : T[K] extends readonly (infer R)[] ? R[] : T[K] extends (infer R)[] ? R[] : T[K] extends [] ? T[K] : T[K];
|
|
24
|
+
}>;
|
|
25
|
+
export type ExpandRecursively<T extends any, level extends number = 0> = T extends object ? level extends 6 ? T extends () => any ? T : {
|
|
26
|
+
[K in keyof T]: ExpandRecursively<T[K], Add<level, 1>>;
|
|
27
|
+
} : T : T;
|
|
28
|
+
type PickPath<T, P extends string> = P extends keyof T ? {
|
|
29
|
+
[K in P]: T[P];
|
|
30
|
+
} : P extends `${infer Key}.${infer Rest}` ? Key extends keyof T ? T[Key] extends (infer U)[] ? {
|
|
31
|
+
[K in Key as `${K}`]: PickPath<U, Rest>[];
|
|
32
|
+
} : {
|
|
33
|
+
[K in Key]: T[K] extends (infer V)[] ? PickPath<V, Rest> : PickPath<T[Key], Rest>;
|
|
34
|
+
} : T extends Record<string, any> ? {
|
|
35
|
+
[K1 in keyof T as K1 extends Key ? K1 : never]: K1 extends Key ? PickPath<T[K1], Rest> : never;
|
|
36
|
+
} : never : T extends Record<any, any> ? {
|
|
37
|
+
[K in keyof T as K extends P ? K : never]: K extends P ? T[K] extends Array<infer U> ? {
|
|
38
|
+
[V in K]: PickPath<U, V>[];
|
|
39
|
+
} : T[K] : never;
|
|
40
|
+
} : never;
|
|
41
|
+
type ValueOf<T> = T extends Record<string, any> ? T[keyof T] : never;
|
|
42
|
+
type _GetResult<T extends Record<string, any>, P extends Path<T>> = T extends Record<string, any> ? P extends string ? PickPath<T, P> : P extends (infer U)[] ? U extends string ? PickPath<T, U> : never : never : never;
|
|
43
|
+
export type PathValue<T, P = SinglePath<T>> = P extends string ? P extends `${infer K}.${infer Rest}` ? K extends Keys<T> ? T[K] extends (infer U)[] ? U extends Record<string, any> ? PathValue<U, Rest>[] : never : T extends Record<string, any> ? PathValue<T[K], Rest> : never : K extends Keys<T> ? PathValue<T[K], Rest> : K extends Keys<T> ? PathValue<T[K], Rest> : false : P extends Keys<T> ? ValueOf<{
|
|
44
|
+
[K1 in keyof T as K1 extends P ? K1 : never]: T[K1];
|
|
45
|
+
}> : never : never;
|
|
46
|
+
type _Keys<T> = T extends Record<string, any> ? NonNullable<{
|
|
47
|
+
[K in keyof T]: K;
|
|
48
|
+
}>[keyof T] : never;
|
|
49
|
+
export type Keys<T> = NonNullable<_Keys<T>> extends string ? NonNullable<_Keys<T>> : never;
|
|
50
|
+
export interface ReconcileOptions {
|
|
51
|
+
/** Merge instead of replace (default: false) */
|
|
52
|
+
merge?: boolean;
|
|
53
|
+
/** Key for array reconciliation (default: 'id') */
|
|
54
|
+
key?: string;
|
|
55
|
+
}
|
|
56
|
+
export {};
|
|
57
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/lib/store/types.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
File without changes
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"use strict";var e=Object.defineProperty;var i=Object.getOwnPropertyDescriptor;var T=Object.getOwnPropertyNames;var y=Object.prototype.hasOwnProperty;var f=(t,n)=>{for(var r in n)e(t,r,{get:n[r],enumerable:!0})},p=(t,n,r,s)=>{if(n&&typeof n=="object"||typeof n=="function")for(let o of T(n))!y.call(t,o)&&o!==r&&e(t,o,{get:()=>n[o],enumerable:!(s=i(n,o))||s.enumerable});return t};var u=t=>p(e({},"__esModule",{value:!0}),t);var j={};f(j,{produce:()=>a,reconcile:()=>d});module.exports=u(j);function c(t){if(t==null||typeof t!="object")return t;if(Array.isArray(t))return t.map(c);let n={};for(let r of Object.keys(t))n[r]=c(t[r]);return n}function a(t){return n=>{let r=c(n);return t(r),r}}function d(t,n={}){return()=>t}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { Producer, ReconcileOptions } from './types.js';
|
|
2
|
+
/**
|
|
3
|
+
* Creates a producer function for immutable updates: `set(produce(draft => …))`.
|
|
4
|
+
* The producer mutates a clone; the result replaces the state.
|
|
5
|
+
*/
|
|
6
|
+
declare function produce<T>(producer: Producer<T>): (state: T) => T;
|
|
7
|
+
/**
|
|
8
|
+
* Creates a reconciler for `set(reconcile(value))`.
|
|
9
|
+
* @param value - Value to reconcile into state
|
|
10
|
+
*/
|
|
11
|
+
declare function reconcile<T>(value: T, _options?: ReconcileOptions): (state: T) => T;
|
|
12
|
+
export { produce, reconcile };
|
|
13
|
+
//# sourceMappingURL=utils.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../../src/lib/store/utils.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAU7D;;;GAGG;AACH,iBAAS,OAAO,CAAC,CAAC,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC,KAAK,CAAC,CAM1D;AAED;;;GAGG;AACH,iBAAS,SAAS,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,QAAQ,GAAE,gBAAqB,GAAG,CAAC,KAAK,EAAE,CAAC,KAAK,CAAC,CAEhF;AAED,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,CAAC"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
function clone(value) {
|
|
2
|
+
if (value == null || typeof value !== 'object')
|
|
3
|
+
return value;
|
|
4
|
+
if (Array.isArray(value))
|
|
5
|
+
return value.map(clone);
|
|
6
|
+
const out = {};
|
|
7
|
+
for (const key of Object.keys(value))
|
|
8
|
+
out[key] = clone(value[key]);
|
|
9
|
+
return out;
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* Creates a producer function for immutable updates: `set(produce(draft => …))`.
|
|
13
|
+
* The producer mutates a clone; the result replaces the state.
|
|
14
|
+
*/
|
|
15
|
+
function produce(producer) {
|
|
16
|
+
return (state) => {
|
|
17
|
+
const draft = clone(state);
|
|
18
|
+
producer(draft);
|
|
19
|
+
return draft;
|
|
20
|
+
};
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Creates a reconciler for `set(reconcile(value))`.
|
|
24
|
+
* @param value - Value to reconcile into state
|
|
25
|
+
*/
|
|
26
|
+
function reconcile(value, _options = {}) {
|
|
27
|
+
return () => value;
|
|
28
|
+
}
|
|
29
|
+
export { produce, reconcile };
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
function o(t){if(t==null||typeof t!="object")return t;if(Array.isArray(t))return t.map(o);let n={};for(let r of Object.keys(t))n[r]=o(t[r]);return n}function e(t){return n=>{let r=o(n);return t(r),r}}function c(t,n={}){return()=>t}export{e as produce,c as reconcile};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"use strict";var a=Object.defineProperty;var d=Object.getOwnPropertyDescriptor;var O=Object.getOwnPropertyNames;var f=Object.prototype.hasOwnProperty;var T=(s,e)=>{for(var r in e)a(s,r,{get:e[r],enumerable:!0})},F=(s,e,r,t)=>{if(e&&typeof e=="object"||typeof e=="function")for(let i of O(e))!f.call(s,i)&&i!==r&&a(s,i,{get:()=>e[i],enumerable:!(t=d(e,i))||t.enumerable});return s};var y=s=>F(a({},"__esModule",{value:!0}),s);var S={};T(S,{Subject:()=>h});module.exports=y(S);var v=require("@fluixi/utils/object"),b=require("@fluixi/utils/functions"),p=class s{constructor(e){this._closed=!1;this._parentOrParents=null;this._subscriptions=null;e&&(this._subscriptions=[e])}get closed(){return this._closed}unsubscribe(){if(this._closed)return;this._closed=!0;let{_parentOrParents:e,_subscriptions:r}=this;if(e instanceof s)e.remove(this);else if(e!==null)for(let t of e)t.remove(this);if(r){for(let t of r)if((0,b.isFunction)(t)&&!(t instanceof s))try{t()}catch(i){console.error("Error in unsubscribe function:",i)}else if((0,v.isObject)(t)&&typeof t.unsubscribe=="function")try{t.unsubscribe()}catch(i){console.error("Error unsubscribing child:",i)}this._subscriptions=null}}add(e){if(!e||e===this)return this;if(e.closed)return this;let{_closed:r,_subscriptions:t}=this;if(r){if((0,b.isFunction)(e))try{e()}catch(i){console.error("Error in unsubscribe function:",i)}else if(e.unsubscribe)try{e.unsubscribe()}catch(i){console.error("Error unsubscribing:",i)}return this}return t||(this._subscriptions=[]),this._subscriptions.push(e),e instanceof s&&e._addParent(this),this}remove(e){let{_subscriptions:r}=this;if(!r)return;let t=r.indexOf(e);t!==-1&&(r.splice(t,1),e._removeParent(this))}_addParent(e){let{_parentOrParents:r}=this;r?Array.isArray(r)?r.push(e):this._parentOrParents=[r,e]:this._parentOrParents=e}_removeParent(e){let{_parentOrParents:r}=this;if(r===e)this._parentOrParents=null;else if(Array.isArray(r)){let t=r.indexOf(e);t!==-1&&(r.splice(t,1),r.length===1&&(this._parentOrParents=r[0]))}}};var u=class extends p{constructor(r,t,i){super();this.isStopped=!1;let o;r?typeof r=="object"?o=r:o={next:r,error:t,complete:i}:o={},this.destination=o}next(r){if(!this.isStopped&&this.destination.next)try{this.destination.next(r)}catch(t){this.error(t)}}error(r){if(!this.isStopped){if(this.isStopped=!0,this.destination.error)try{this.destination.error(r)}catch(t){throw t}else throw r;this.unsubscribe()}}complete(){if(!this.isStopped){if(this.isStopped=!0,this.destination.complete)try{this.destination.complete()}catch(r){this.error(r);return}this.unsubscribe()}}unsubscribe(){this.closed||(this.isStopped=!0,super.unsubscribe())}},l=class extends u{constructor(r,t,i,o){super(r,t,i);this._isUnsubscribing=!1;this._parentSubscriber=null;this._parentSubscriber=o||null}next(r){if(!this.isStopped&&!this._isUnsubscribing)try{super.next(r)}catch(t){this.error(t)}}error(r){if(!this.isStopped&&!this._isUnsubscribing){this._isUnsubscribing=!0;try{super.error(r)}finally{this._isUnsubscribing=!1}}}complete(){if(!this.isStopped&&!this._isUnsubscribing){this._isUnsubscribing=!0;try{super.complete()}finally{this._isUnsubscribing=!1}}}unsubscribe(){this.closed||(this._isUnsubscribing=!0,super.unsubscribe(),this._isUnsubscribing=!1)}};var c=class extends p{constructor(e){if(super(),e)this._subscribe=e;else throw new TypeError("Observable constructor requires a subscribe function")}subscribe(e,r,t){let i;e instanceof u?i=e:i=new l(e,r,t);let{_subscribe:o}=this;try{let n=o.call(this,i);n&&(typeof n=="function"||typeof n.unsubscribe=="function")&&i.add(n)}catch(n){i.error(n)}return i}pipe(...e){return e.length===0?this:e.reduce((r,t)=>t(r),this)}toPromise(){return new Promise((e,r)=>{let t;this.subscribe({next:i=>t=i,error:r,complete:()=>e(t)})})}};var h=class extends c{constructor(){super(r=>{if(this.closed)throw new Error("Subject has been closed");if(this.hasError)r.error(this.thrownError);else if(this.isStopped)r.complete();else return this.observers.push(r),()=>{let t=this.observers.indexOf(r);t!==-1&&this.observers.splice(t,1)}});this.observers=[];this.isStopped=!1;this.hasError=!1;this.thrownError=null}next(r){if(this.isStopped)return;let{observers:t}=this,i=t.length,o=t.slice();for(let n=0;n<i;n++)o[n].next?.(r)}error(r){if(this.isStopped)return;this.hasError=!0,this.thrownError=r,this.isStopped=!0;let{observers:t}=this;this.observers=[];let i=t.length,o=t.slice();for(let n=0;n<i;n++)o[n].error?.(r)}complete(){if(this.isStopped)return;this.isStopped=!0;let{observers:r}=this;this.observers=[];let t=r.length,i=r.slice();for(let o=0;o<t;o++)i[o].complete?.()}unsubscribe(){this.isStopped=!0,this.observers=[]}asObservable(){return new c(t=>this.subscribe(t))}};
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { Observable, type Observer } from './observable/index.js';
|
|
2
|
+
export declare class Subject<T> extends Observable<T> implements Observer<T> {
|
|
3
|
+
private observers;
|
|
4
|
+
isStopped: boolean;
|
|
5
|
+
hasError: boolean;
|
|
6
|
+
thrownError: any;
|
|
7
|
+
constructor();
|
|
8
|
+
next(value: T): void;
|
|
9
|
+
error(err: any): void;
|
|
10
|
+
complete(): void;
|
|
11
|
+
unsubscribe(): void;
|
|
12
|
+
asObservable(): Observable<T>;
|
|
13
|
+
}
|
|
14
|
+
//# sourceMappingURL=subject.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"subject.d.ts","sourceRoot":"","sources":["../../src/lib/subject.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,UAAU,EACV,KAAK,QAAQ,EAEd,MAAM,uBAAuB,CAAC;AAE/B,qBAAa,OAAO,CAAC,CAAC,CAAE,SAAQ,UAAU,CAAC,CAAC,CAAE,YAAW,QAAQ,CAAC,CAAC,CAAC;IAClE,OAAO,CAAC,SAAS,CAAqB;IAEtC,SAAS,UAAS;IAClB,QAAQ,UAAS;IACjB,WAAW,EAAE,GAAG,CAAQ;;IAuBxB,IAAI,CAAC,KAAK,EAAE,CAAC,GAAG,IAAI;IAUpB,KAAK,CAAC,GAAG,EAAE,GAAG,GAAG,IAAI;IAcrB,QAAQ,IAAI,IAAI;IAYP,WAAW,IAAI,IAAI;IAM5B,YAAY,IAAI,UAAU,CAAC,CAAC,CAAC;CAM9B"}
|