@shiftbloom-studio/symphony-state 0.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/LICENSE +22 -0
- package/README.md +198 -0
- package/dist/adapters/atom.cjs +36 -0
- package/dist/adapters/atom.cjs.map +1 -0
- package/dist/adapters/atom.d.cts +8 -0
- package/dist/adapters/atom.d.ts +8 -0
- package/dist/adapters/atom.js +34 -0
- package/dist/adapters/atom.js.map +1 -0
- package/dist/adapters/external.cjs +16 -0
- package/dist/adapters/external.cjs.map +1 -0
- package/dist/adapters/external.d.cts +13 -0
- package/dist/adapters/external.d.ts +13 -0
- package/dist/adapters/external.js +14 -0
- package/dist/adapters/external.js.map +1 -0
- package/dist/adapters/query.cjs +17 -0
- package/dist/adapters/query.cjs.map +1 -0
- package/dist/adapters/query.d.cts +16 -0
- package/dist/adapters/query.d.ts +16 -0
- package/dist/adapters/query.js +15 -0
- package/dist/adapters/query.js.map +1 -0
- package/dist/adapters/redux.cjs +20 -0
- package/dist/adapters/redux.cjs.map +1 -0
- package/dist/adapters/redux.d.cts +15 -0
- package/dist/adapters/redux.d.ts +15 -0
- package/dist/adapters/redux.js +18 -0
- package/dist/adapters/redux.js.map +1 -0
- package/dist/adapters/url.cjs +39 -0
- package/dist/adapters/url.cjs.map +1 -0
- package/dist/adapters/url.d.cts +13 -0
- package/dist/adapters/url.d.ts +13 -0
- package/dist/adapters/url.js +37 -0
- package/dist/adapters/url.js.map +1 -0
- package/dist/adapters/zustand.cjs +16 -0
- package/dist/adapters/zustand.cjs.map +1 -0
- package/dist/adapters/zustand.d.cts +10 -0
- package/dist/adapters/zustand.d.ts +10 -0
- package/dist/adapters/zustand.js +14 -0
- package/dist/adapters/zustand.js.map +1 -0
- package/dist/devtools.cjs +159 -0
- package/dist/devtools.cjs.map +1 -0
- package/dist/devtools.d.cts +9 -0
- package/dist/devtools.d.ts +9 -0
- package/dist/devtools.js +157 -0
- package/dist/devtools.js.map +1 -0
- package/dist/index.cjs +560 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +20 -0
- package/dist/index.d.ts +20 -0
- package/dist/index.js +552 -0
- package/dist/index.js.map +1 -0
- package/dist/react.cjs +576 -0
- package/dist/react.cjs.map +1 -0
- package/dist/react.d.cts +40 -0
- package/dist/react.d.ts +40 -0
- package/dist/react.js +569 -0
- package/dist/react.js.map +1 -0
- package/dist/types-B1uzdpYH.d.cts +67 -0
- package/dist/types-B1uzdpYH.d.ts +67 -0
- package/package.json +127 -0
package/dist/index.cjs
ADDED
|
@@ -0,0 +1,560 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
// src/core/scheduler.ts
|
|
4
|
+
var scheduleMicrotask = (flush) => {
|
|
5
|
+
if (typeof queueMicrotask === "function") {
|
|
6
|
+
queueMicrotask(flush);
|
|
7
|
+
return;
|
|
8
|
+
}
|
|
9
|
+
Promise.resolve().then(flush);
|
|
10
|
+
};
|
|
11
|
+
var createScheduler = (scheduler) => {
|
|
12
|
+
if (!scheduler || scheduler === "microtask") {
|
|
13
|
+
return scheduleMicrotask;
|
|
14
|
+
}
|
|
15
|
+
if (scheduler === "sync") {
|
|
16
|
+
return (flush) => flush();
|
|
17
|
+
}
|
|
18
|
+
if (scheduler === "raf") {
|
|
19
|
+
return (flush) => {
|
|
20
|
+
if (typeof requestAnimationFrame === "function") {
|
|
21
|
+
requestAnimationFrame(() => flush());
|
|
22
|
+
return;
|
|
23
|
+
}
|
|
24
|
+
scheduleMicrotask(flush);
|
|
25
|
+
};
|
|
26
|
+
}
|
|
27
|
+
return scheduler;
|
|
28
|
+
};
|
|
29
|
+
|
|
30
|
+
// src/core/conductor.ts
|
|
31
|
+
var defaultPersist = (value, config) => {
|
|
32
|
+
if (!config.storage) {
|
|
33
|
+
return;
|
|
34
|
+
}
|
|
35
|
+
const serialize = config.serialize ?? JSON.stringify;
|
|
36
|
+
config.storage.setItem(config.key, serialize(value));
|
|
37
|
+
};
|
|
38
|
+
var readPersist = (config) => {
|
|
39
|
+
if (!config.storage) {
|
|
40
|
+
return void 0;
|
|
41
|
+
}
|
|
42
|
+
const raw = config.storage.getItem(config.key);
|
|
43
|
+
if (!raw) {
|
|
44
|
+
return void 0;
|
|
45
|
+
}
|
|
46
|
+
const deserialize = config.deserialize ?? JSON.parse;
|
|
47
|
+
return deserialize(raw);
|
|
48
|
+
};
|
|
49
|
+
var now = () => Date.now();
|
|
50
|
+
var isObject = (value) => typeof value === "object" && value !== null;
|
|
51
|
+
var createDependencyOrder = (dependencies) => {
|
|
52
|
+
const indegree = /* @__PURE__ */ new Map();
|
|
53
|
+
const outgoing = /* @__PURE__ */ new Map();
|
|
54
|
+
dependencies.forEach((deps, key) => {
|
|
55
|
+
indegree.set(key, deps.length);
|
|
56
|
+
deps.forEach((dep) => {
|
|
57
|
+
if (!outgoing.has(dep)) {
|
|
58
|
+
outgoing.set(dep, []);
|
|
59
|
+
}
|
|
60
|
+
outgoing.get(dep)?.push(key);
|
|
61
|
+
});
|
|
62
|
+
});
|
|
63
|
+
const queue = [];
|
|
64
|
+
indegree.forEach((count, key) => {
|
|
65
|
+
if (count === 0) {
|
|
66
|
+
queue.push(key);
|
|
67
|
+
}
|
|
68
|
+
});
|
|
69
|
+
const order = [];
|
|
70
|
+
while (queue.length > 0) {
|
|
71
|
+
const current = queue.shift();
|
|
72
|
+
if (!current) {
|
|
73
|
+
continue;
|
|
74
|
+
}
|
|
75
|
+
order.push(current);
|
|
76
|
+
const children = outgoing.get(current) ?? [];
|
|
77
|
+
for (const child of children) {
|
|
78
|
+
const next = (indegree.get(child) ?? 0) - 1;
|
|
79
|
+
indegree.set(child, next);
|
|
80
|
+
if (next === 0) {
|
|
81
|
+
queue.push(child);
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
if (order.length !== dependencies.size) {
|
|
86
|
+
const cycle = [...dependencies.keys()].filter((key) => !order.includes(key));
|
|
87
|
+
throw new Error(
|
|
88
|
+
`Dependency cycle detected in sections: ${cycle.join(", ")}`
|
|
89
|
+
);
|
|
90
|
+
}
|
|
91
|
+
return order;
|
|
92
|
+
};
|
|
93
|
+
var resolveStorage = (persist) => {
|
|
94
|
+
if (!persist) {
|
|
95
|
+
return void 0;
|
|
96
|
+
}
|
|
97
|
+
if (persist.storage) {
|
|
98
|
+
return persist;
|
|
99
|
+
}
|
|
100
|
+
if (typeof window === "undefined") {
|
|
101
|
+
return { ...persist, storage: null };
|
|
102
|
+
}
|
|
103
|
+
return { ...persist, storage: window.localStorage };
|
|
104
|
+
};
|
|
105
|
+
var createConductor = (config) => {
|
|
106
|
+
const sections = /* @__PURE__ */ new Map();
|
|
107
|
+
const updates = /* @__PURE__ */ new Map();
|
|
108
|
+
const effects = /* @__PURE__ */ new Set();
|
|
109
|
+
const dependencies = /* @__PURE__ */ new Map();
|
|
110
|
+
const scheduler = createScheduler(config.scheduler);
|
|
111
|
+
const transactionHistory = [];
|
|
112
|
+
const transactionHistoryLimit = config.transactionHistoryLimit ?? 20;
|
|
113
|
+
const persistValue = (state, value) => {
|
|
114
|
+
if (!state.persist) {
|
|
115
|
+
return;
|
|
116
|
+
}
|
|
117
|
+
const persist = resolveStorage(state.persist);
|
|
118
|
+
if (!persist?.storage) {
|
|
119
|
+
return;
|
|
120
|
+
}
|
|
121
|
+
if (persist.throttleMs && persist.throttleMs > 0) {
|
|
122
|
+
if (state.persistTimer) {
|
|
123
|
+
clearTimeout(state.persistTimer);
|
|
124
|
+
}
|
|
125
|
+
state.persistTimer = setTimeout(() => {
|
|
126
|
+
defaultPersist(value, persist);
|
|
127
|
+
}, persist.throttleMs);
|
|
128
|
+
return;
|
|
129
|
+
}
|
|
130
|
+
defaultPersist(value, persist);
|
|
131
|
+
};
|
|
132
|
+
const hydrateValue = (state) => {
|
|
133
|
+
const persist = resolveStorage(state.persist);
|
|
134
|
+
if (!persist?.storage) {
|
|
135
|
+
return;
|
|
136
|
+
}
|
|
137
|
+
const stored = readPersist(persist);
|
|
138
|
+
if (stored !== void 0) {
|
|
139
|
+
state.value = stored;
|
|
140
|
+
state.adapter?.set(stored);
|
|
141
|
+
}
|
|
142
|
+
};
|
|
143
|
+
const bootstrapValues = (() => {
|
|
144
|
+
if (!config.bootstrap) {
|
|
145
|
+
return void 0;
|
|
146
|
+
}
|
|
147
|
+
if (typeof config.bootstrap === "function") {
|
|
148
|
+
return config.bootstrap();
|
|
149
|
+
}
|
|
150
|
+
return config.bootstrap;
|
|
151
|
+
})();
|
|
152
|
+
for (const definition of config.sections) {
|
|
153
|
+
if (sections.has(definition.key)) {
|
|
154
|
+
throw new Error(`Section with key "${definition.key}" already exists.`);
|
|
155
|
+
}
|
|
156
|
+
const dependsOn = definition.dependsOn ?? [];
|
|
157
|
+
const state = {
|
|
158
|
+
key: definition.key,
|
|
159
|
+
adapter: definition.source,
|
|
160
|
+
subscribers: /* @__PURE__ */ new Set(),
|
|
161
|
+
dependsOn,
|
|
162
|
+
persist: definition.persist,
|
|
163
|
+
value: definition.source.get()
|
|
164
|
+
};
|
|
165
|
+
sections.set(definition.key, state);
|
|
166
|
+
dependencies.set(definition.key, dependsOn);
|
|
167
|
+
}
|
|
168
|
+
const derivedDefinitions = config.derived ?? [];
|
|
169
|
+
for (const definition of derivedDefinitions) {
|
|
170
|
+
if (sections.has(definition.key)) {
|
|
171
|
+
throw new Error(`Section with key "${definition.key}" already exists.`);
|
|
172
|
+
}
|
|
173
|
+
const state = {
|
|
174
|
+
key: definition.key,
|
|
175
|
+
subscribers: /* @__PURE__ */ new Set(),
|
|
176
|
+
dependsOn: definition.inputs,
|
|
177
|
+
value: void 0,
|
|
178
|
+
derived: {
|
|
179
|
+
inputs: definition.inputs,
|
|
180
|
+
compute: definition.compute,
|
|
181
|
+
lastInputs: void 0
|
|
182
|
+
}
|
|
183
|
+
};
|
|
184
|
+
sections.set(definition.key, state);
|
|
185
|
+
dependencies.set(definition.key, definition.inputs);
|
|
186
|
+
}
|
|
187
|
+
const order = createDependencyOrder(dependencies);
|
|
188
|
+
for (const [key, state] of sections) {
|
|
189
|
+
if (bootstrapValues && key in bootstrapValues) {
|
|
190
|
+
const value = bootstrapValues[key];
|
|
191
|
+
state.value = value;
|
|
192
|
+
state.adapter?.set(value);
|
|
193
|
+
continue;
|
|
194
|
+
}
|
|
195
|
+
if (state.persist) {
|
|
196
|
+
hydrateValue(state);
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
const stagedChanges = /* @__PURE__ */ new Set();
|
|
200
|
+
const pendingNotifications = /* @__PURE__ */ new Set();
|
|
201
|
+
let scheduled = false;
|
|
202
|
+
let transactionDepth = 0;
|
|
203
|
+
let lastTransactionLabel;
|
|
204
|
+
const notifySubscribers = () => {
|
|
205
|
+
scheduled = false;
|
|
206
|
+
for (const key of pendingNotifications) {
|
|
207
|
+
const state = sections.get(key);
|
|
208
|
+
if (!state) {
|
|
209
|
+
continue;
|
|
210
|
+
}
|
|
211
|
+
for (const subscriber of state.subscribers) {
|
|
212
|
+
subscriber();
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
pendingNotifications.clear();
|
|
216
|
+
};
|
|
217
|
+
const scheduleNotify = (keys) => {
|
|
218
|
+
for (const key of keys) {
|
|
219
|
+
pendingNotifications.add(key);
|
|
220
|
+
}
|
|
221
|
+
if (scheduled) {
|
|
222
|
+
return;
|
|
223
|
+
}
|
|
224
|
+
scheduled = true;
|
|
225
|
+
scheduler(notifySubscribers);
|
|
226
|
+
};
|
|
227
|
+
const markChanged = (key) => {
|
|
228
|
+
stagedChanges.add(key);
|
|
229
|
+
};
|
|
230
|
+
const applyUpdate = (state, update) => {
|
|
231
|
+
if (update.type === "set") {
|
|
232
|
+
if (Object.is(state.value, update.value)) {
|
|
233
|
+
return false;
|
|
234
|
+
}
|
|
235
|
+
state.adapter?.set(update.value);
|
|
236
|
+
state.value = update.value;
|
|
237
|
+
return true;
|
|
238
|
+
}
|
|
239
|
+
if (state.adapter?.patch) {
|
|
240
|
+
if (isObject(state.value) && isObject(update.value)) {
|
|
241
|
+
const next = { ...state.value, ...update.value };
|
|
242
|
+
const changed = Object.keys(update.value).some(
|
|
243
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
244
|
+
(k) => !Object.is(state.value[k], update.value[k])
|
|
245
|
+
);
|
|
246
|
+
if (!changed) {
|
|
247
|
+
return false;
|
|
248
|
+
}
|
|
249
|
+
state.adapter.patch(update.value);
|
|
250
|
+
state.value = next;
|
|
251
|
+
return true;
|
|
252
|
+
}
|
|
253
|
+
state.adapter.patch(update.value);
|
|
254
|
+
state.value = update.value;
|
|
255
|
+
return true;
|
|
256
|
+
}
|
|
257
|
+
if (isObject(state.value) && isObject(update.value)) {
|
|
258
|
+
const next = { ...state.value, ...update.value };
|
|
259
|
+
const changed = Object.keys(update.value).some(
|
|
260
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
261
|
+
(k) => !Object.is(state.value[k], update.value[k])
|
|
262
|
+
);
|
|
263
|
+
if (!changed) {
|
|
264
|
+
return false;
|
|
265
|
+
}
|
|
266
|
+
state.adapter?.set(next);
|
|
267
|
+
state.value = next;
|
|
268
|
+
return true;
|
|
269
|
+
}
|
|
270
|
+
throw new Error(`Section "${state.key}" does not support patch updates.`);
|
|
271
|
+
};
|
|
272
|
+
const computeDerived = (state) => {
|
|
273
|
+
if (!state.derived) {
|
|
274
|
+
return false;
|
|
275
|
+
}
|
|
276
|
+
const inputs = state.derived.inputs.map((key) => {
|
|
277
|
+
const inputState = sections.get(key);
|
|
278
|
+
if (!inputState) {
|
|
279
|
+
throw new Error(`Missing input section "${key}".`);
|
|
280
|
+
}
|
|
281
|
+
return inputState.value;
|
|
282
|
+
});
|
|
283
|
+
if (state.derived.lastInputs && inputs.every((value, index) => Object.is(value, state.derived?.lastInputs?.[index]))) {
|
|
284
|
+
return false;
|
|
285
|
+
}
|
|
286
|
+
const next = state.derived.compute(...inputs);
|
|
287
|
+
const changed = !Object.is(state.value, next);
|
|
288
|
+
state.value = next;
|
|
289
|
+
state.derived.lastInputs = inputs;
|
|
290
|
+
return changed;
|
|
291
|
+
};
|
|
292
|
+
for (const key of order) {
|
|
293
|
+
const state = sections.get(key);
|
|
294
|
+
if (!state?.derived) {
|
|
295
|
+
continue;
|
|
296
|
+
}
|
|
297
|
+
computeDerived(state);
|
|
298
|
+
}
|
|
299
|
+
const runEffects = (changedKeys) => {
|
|
300
|
+
if (effects.size === 0) {
|
|
301
|
+
return;
|
|
302
|
+
}
|
|
303
|
+
const api = {
|
|
304
|
+
get: (key) => getSectionValue(key),
|
|
305
|
+
set: (key, value) => setSectionValue(key, value),
|
|
306
|
+
patch: (key, value) => patchSectionValue(key, value),
|
|
307
|
+
transaction: (fn, label) => transaction(fn, label)
|
|
308
|
+
};
|
|
309
|
+
for (const effect2 of effects) {
|
|
310
|
+
if (!effect2.when.some((key) => changedKeys.includes(key))) {
|
|
311
|
+
continue;
|
|
312
|
+
}
|
|
313
|
+
const limit = effect2.maxDepth ?? 5;
|
|
314
|
+
if (transactionDepth > limit) {
|
|
315
|
+
throw new Error(
|
|
316
|
+
`Effect depth exceeded while running effect for sections: ${effect2.when.join(", ")}`
|
|
317
|
+
);
|
|
318
|
+
}
|
|
319
|
+
effect2.run(api);
|
|
320
|
+
}
|
|
321
|
+
};
|
|
322
|
+
const commit = () => {
|
|
323
|
+
if (updates.size === 0 && stagedChanges.size === 0) {
|
|
324
|
+
return;
|
|
325
|
+
}
|
|
326
|
+
const changedKeys = [];
|
|
327
|
+
for (const key of order) {
|
|
328
|
+
const state = sections.get(key);
|
|
329
|
+
if (!state) {
|
|
330
|
+
continue;
|
|
331
|
+
}
|
|
332
|
+
const update = updates.get(key);
|
|
333
|
+
if (update && !state.derived) {
|
|
334
|
+
const changed = applyUpdate(state, update);
|
|
335
|
+
if (changed) {
|
|
336
|
+
persistValue(state, state.value);
|
|
337
|
+
changedKeys.push(key);
|
|
338
|
+
}
|
|
339
|
+
updates.delete(key);
|
|
340
|
+
}
|
|
341
|
+
if (state.derived) {
|
|
342
|
+
const derivedChanged = computeDerived(state);
|
|
343
|
+
if (derivedChanged) {
|
|
344
|
+
changedKeys.push(key);
|
|
345
|
+
}
|
|
346
|
+
}
|
|
347
|
+
}
|
|
348
|
+
if (changedKeys.length > 0) {
|
|
349
|
+
scheduleNotify(changedKeys);
|
|
350
|
+
transactionHistory.unshift({
|
|
351
|
+
label: lastTransactionLabel,
|
|
352
|
+
touched: [...new Set(changedKeys)],
|
|
353
|
+
timestamp: now()
|
|
354
|
+
});
|
|
355
|
+
if (transactionHistory.length > transactionHistoryLimit) {
|
|
356
|
+
transactionHistory.length = transactionHistoryLimit;
|
|
357
|
+
}
|
|
358
|
+
}
|
|
359
|
+
stagedChanges.clear();
|
|
360
|
+
lastTransactionLabel = void 0;
|
|
361
|
+
runEffects(changedKeys);
|
|
362
|
+
};
|
|
363
|
+
const beginTransaction = (label) => {
|
|
364
|
+
transactionDepth += 1;
|
|
365
|
+
if (label) {
|
|
366
|
+
lastTransactionLabel = label;
|
|
367
|
+
}
|
|
368
|
+
};
|
|
369
|
+
const endTransaction = () => {
|
|
370
|
+
transactionDepth -= 1;
|
|
371
|
+
if (transactionDepth === 0) {
|
|
372
|
+
commit();
|
|
373
|
+
}
|
|
374
|
+
};
|
|
375
|
+
const transaction = (fn, label) => {
|
|
376
|
+
beginTransaction(label);
|
|
377
|
+
try {
|
|
378
|
+
fn();
|
|
379
|
+
} finally {
|
|
380
|
+
endTransaction();
|
|
381
|
+
}
|
|
382
|
+
};
|
|
383
|
+
const setSectionValue = (key, value) => {
|
|
384
|
+
if (!sections.has(key)) {
|
|
385
|
+
throw new Error(`Unknown section "${key}".`);
|
|
386
|
+
}
|
|
387
|
+
if (transactionDepth === 0) {
|
|
388
|
+
return transaction(() => setSectionValue(key, value));
|
|
389
|
+
}
|
|
390
|
+
const state = sections.get(key);
|
|
391
|
+
if (state?.derived) {
|
|
392
|
+
throw new Error(`Cannot set derived section "${key}".`);
|
|
393
|
+
}
|
|
394
|
+
updates.set(key, { type: "set", value });
|
|
395
|
+
markChanged(key);
|
|
396
|
+
};
|
|
397
|
+
const patchSectionValue = (key, value) => {
|
|
398
|
+
if (!sections.has(key)) {
|
|
399
|
+
throw new Error(`Unknown section "${key}".`);
|
|
400
|
+
}
|
|
401
|
+
if (transactionDepth === 0) {
|
|
402
|
+
return transaction(() => patchSectionValue(key, value));
|
|
403
|
+
}
|
|
404
|
+
const state = sections.get(key);
|
|
405
|
+
if (state?.derived) {
|
|
406
|
+
throw new Error(`Cannot patch derived section "${key}".`);
|
|
407
|
+
}
|
|
408
|
+
updates.set(key, { type: "patch", value });
|
|
409
|
+
markChanged(key);
|
|
410
|
+
};
|
|
411
|
+
const getSectionValue = (key) => {
|
|
412
|
+
const state = sections.get(key);
|
|
413
|
+
if (!state) {
|
|
414
|
+
throw new Error(`Unknown section "${key}".`);
|
|
415
|
+
}
|
|
416
|
+
return state.value;
|
|
417
|
+
};
|
|
418
|
+
const subscribe = (key, cb) => {
|
|
419
|
+
const state = sections.get(key);
|
|
420
|
+
if (!state) {
|
|
421
|
+
throw new Error(`Unknown section "${key}".`);
|
|
422
|
+
}
|
|
423
|
+
state.subscribers.add(cb);
|
|
424
|
+
return () => {
|
|
425
|
+
state.subscribers.delete(cb);
|
|
426
|
+
};
|
|
427
|
+
};
|
|
428
|
+
const getSection = (key) => {
|
|
429
|
+
return {
|
|
430
|
+
get: () => getSectionValue(key),
|
|
431
|
+
set: (next) => setSectionValue(key, next),
|
|
432
|
+
patch: (next) => patchSectionValue(key, next),
|
|
433
|
+
subscribe: (cb) => subscribe(key, cb)
|
|
434
|
+
};
|
|
435
|
+
};
|
|
436
|
+
const effect = (definition) => {
|
|
437
|
+
effects.add(definition);
|
|
438
|
+
return () => effects.delete(definition);
|
|
439
|
+
};
|
|
440
|
+
const getSnapshot = () => {
|
|
441
|
+
const snapshot = { sections: {}, transactions: [] };
|
|
442
|
+
for (const [key, state] of sections) {
|
|
443
|
+
snapshot.sections[key] = state.value;
|
|
444
|
+
}
|
|
445
|
+
snapshot.transactions = [...transactionHistory];
|
|
446
|
+
return snapshot;
|
|
447
|
+
};
|
|
448
|
+
const destroy = () => {
|
|
449
|
+
sections.forEach((state) => {
|
|
450
|
+
state.adapter?.destroy?.();
|
|
451
|
+
if (state.persistTimer) {
|
|
452
|
+
clearTimeout(state.persistTimer);
|
|
453
|
+
}
|
|
454
|
+
state.subscribers.clear();
|
|
455
|
+
});
|
|
456
|
+
sections.clear();
|
|
457
|
+
updates.clear();
|
|
458
|
+
effects.clear();
|
|
459
|
+
};
|
|
460
|
+
return {
|
|
461
|
+
getSection,
|
|
462
|
+
getSectionValue,
|
|
463
|
+
subscribe,
|
|
464
|
+
transaction,
|
|
465
|
+
effect,
|
|
466
|
+
getSnapshot,
|
|
467
|
+
destroy
|
|
468
|
+
};
|
|
469
|
+
};
|
|
470
|
+
|
|
471
|
+
// src/core/section.ts
|
|
472
|
+
var defineSection = (definition) => definition;
|
|
473
|
+
var defineDerivedSection = (definition) => definition;
|
|
474
|
+
var createStorageSink = (options) => options;
|
|
475
|
+
|
|
476
|
+
// src/adapters/atom.ts
|
|
477
|
+
var createAtomAdapter = (initial) => {
|
|
478
|
+
let current = initial;
|
|
479
|
+
const subscribers = /* @__PURE__ */ new Set();
|
|
480
|
+
const notify = () => {
|
|
481
|
+
subscribers.forEach((cb) => cb());
|
|
482
|
+
};
|
|
483
|
+
return {
|
|
484
|
+
kind: "atom",
|
|
485
|
+
get: () => current,
|
|
486
|
+
set: (next) => {
|
|
487
|
+
if (Object.is(current, next)) {
|
|
488
|
+
return;
|
|
489
|
+
}
|
|
490
|
+
current = next;
|
|
491
|
+
notify();
|
|
492
|
+
},
|
|
493
|
+
patch: (partial) => {
|
|
494
|
+
if (typeof current !== "object" || current === null) {
|
|
495
|
+
throw new Error("AtomAdapter patch requires object state.");
|
|
496
|
+
}
|
|
497
|
+
current = { ...current, ...partial };
|
|
498
|
+
notify();
|
|
499
|
+
},
|
|
500
|
+
subscribe: (cb) => {
|
|
501
|
+
subscribers.add(cb);
|
|
502
|
+
return () => subscribers.delete(cb);
|
|
503
|
+
}
|
|
504
|
+
};
|
|
505
|
+
};
|
|
506
|
+
|
|
507
|
+
// src/adapters/external.ts
|
|
508
|
+
var createExternalStoreAdapter = (store, options) => {
|
|
509
|
+
return {
|
|
510
|
+
kind: options?.kind ?? "external",
|
|
511
|
+
get: store.get,
|
|
512
|
+
set: store.set,
|
|
513
|
+
patch: options?.patch,
|
|
514
|
+
subscribe: store.subscribe
|
|
515
|
+
};
|
|
516
|
+
};
|
|
517
|
+
|
|
518
|
+
// src/adapters/url.ts
|
|
519
|
+
var defaultGetParams = () => {
|
|
520
|
+
if (typeof window === "undefined") {
|
|
521
|
+
return new URLSearchParams();
|
|
522
|
+
}
|
|
523
|
+
return new URLSearchParams(window.location.search);
|
|
524
|
+
};
|
|
525
|
+
var defaultSetParams = (params) => {
|
|
526
|
+
if (typeof window === "undefined") {
|
|
527
|
+
return;
|
|
528
|
+
}
|
|
529
|
+
const url = `${window.location.pathname}?${params.toString()}${window.location.hash}`;
|
|
530
|
+
window.history.replaceState({}, "", url);
|
|
531
|
+
};
|
|
532
|
+
var defaultSubscribe = (cb) => {
|
|
533
|
+
if (typeof window === "undefined") {
|
|
534
|
+
return () => void 0;
|
|
535
|
+
}
|
|
536
|
+
const handler = () => cb();
|
|
537
|
+
window.addEventListener("popstate", handler);
|
|
538
|
+
return () => window.removeEventListener("popstate", handler);
|
|
539
|
+
};
|
|
540
|
+
var createUrlParamsAdapter = (options) => {
|
|
541
|
+
const getParams = options.getSearchParams ?? defaultGetParams;
|
|
542
|
+
const setParams = options.setSearchParams ?? defaultSetParams;
|
|
543
|
+
const subscribe = options.subscribe ?? defaultSubscribe;
|
|
544
|
+
return {
|
|
545
|
+
kind: options.kind ?? "url",
|
|
546
|
+
get: () => options.parse(getParams()),
|
|
547
|
+
set: (next) => setParams(options.serialize(next)),
|
|
548
|
+
subscribe
|
|
549
|
+
};
|
|
550
|
+
};
|
|
551
|
+
|
|
552
|
+
exports.createAtomAdapter = createAtomAdapter;
|
|
553
|
+
exports.createConductor = createConductor;
|
|
554
|
+
exports.createExternalStoreAdapter = createExternalStoreAdapter;
|
|
555
|
+
exports.createStorageSink = createStorageSink;
|
|
556
|
+
exports.createUrlParamsAdapter = createUrlParamsAdapter;
|
|
557
|
+
exports.defineDerivedSection = defineDerivedSection;
|
|
558
|
+
exports.defineSection = defineSection;
|
|
559
|
+
//# sourceMappingURL=index.cjs.map
|
|
560
|
+
//# sourceMappingURL=index.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/core/scheduler.ts","../src/core/conductor.ts","../src/core/section.ts","../src/adapters/atom.ts","../src/adapters/external.ts","../src/adapters/url.ts"],"names":["effect"],"mappings":"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","file":"index.cjs","sourcesContent":["import type { Scheduler } from \"./types\";\n\nconst scheduleMicrotask = (flush: () => void) => {\n if (typeof queueMicrotask === \"function\") {\n queueMicrotask(flush);\n return;\n }\n Promise.resolve().then(flush);\n};\n\nexport const createScheduler = (scheduler?: Scheduler) => {\n if (!scheduler || scheduler === \"microtask\") {\n return scheduleMicrotask;\n }\n if (scheduler === \"sync\") {\n return (flush: () => void) => flush();\n }\n if (scheduler === \"raf\") {\n return (flush: () => void) => {\n if (typeof requestAnimationFrame === \"function\") {\n requestAnimationFrame(() => flush());\n return;\n }\n scheduleMicrotask(flush);\n };\n }\n return scheduler;\n};\n","import { createScheduler } from \"./scheduler\";\nimport type {\n Conductor,\n ConductorSnapshot,\n DerivedSectionDefinition,\n EffectDefinition,\n PersistConfig,\n Scheduler,\n SectionDefinition,\n SectionHandle,\n SourceAdapter,\n Subscriber,\n TransactionInfo\n} from \"./types\";\n\nconst defaultPersist = <T,>(value: T, config: PersistConfig<T>) => {\n if (!config.storage) {\n return;\n }\n const serialize = config.serialize ?? JSON.stringify;\n config.storage.setItem(config.key, serialize(value));\n};\n\nconst readPersist = <T,>(config: PersistConfig<T>): T | undefined => {\n if (!config.storage) {\n return undefined;\n }\n const raw = config.storage.getItem(config.key);\n if (!raw) {\n return undefined;\n }\n const deserialize = config.deserialize ?? JSON.parse;\n return deserialize(raw) as T;\n};\n\ntype SectionState<T> = {\n key: string;\n adapter?: SourceAdapter<T>;\n subscribers: Set<Subscriber>;\n dependsOn: string[];\n persist?: PersistConfig<T>;\n persistTimer?: ReturnType<typeof setTimeout>;\n value: T;\n derived?: {\n inputs: string[];\n compute: (...values: unknown[]) => T;\n lastInputs?: unknown[];\n };\n};\n\ntype Update =\n | { type: \"set\"; value: unknown }\n | { type: \"patch\"; value: Partial<unknown> };\n\nconst now = () => Date.now();\n\nconst isObject = (value: unknown): value is Record<string, unknown> =>\n typeof value === \"object\" && value !== null;\n\nconst createDependencyOrder = (dependencies: Map<string, string[]>) => {\n const indegree = new Map<string, number>();\n const outgoing = new Map<string, string[]>();\n dependencies.forEach((deps, key) => {\n indegree.set(key, deps.length);\n deps.forEach((dep) => {\n if (!outgoing.has(dep)) {\n outgoing.set(dep, []);\n }\n outgoing.get(dep)?.push(key);\n });\n });\n\n const queue: string[] = [];\n indegree.forEach((count, key) => {\n if (count === 0) {\n queue.push(key);\n }\n });\n\n const order: string[] = [];\n while (queue.length > 0) {\n const current = queue.shift();\n if (!current) {\n continue;\n }\n order.push(current);\n const children = outgoing.get(current) ?? [];\n for (const child of children) {\n const next = (indegree.get(child) ?? 0) - 1;\n indegree.set(child, next);\n if (next === 0) {\n queue.push(child);\n }\n }\n }\n\n if (order.length !== dependencies.size) {\n const cycle = [...dependencies.keys()].filter((key) => !order.includes(key));\n throw new Error(\n `Dependency cycle detected in sections: ${cycle.join(\", \")}`\n );\n }\n\n return order;\n};\n\nconst resolveStorage = <T,>(persist?: PersistConfig<T>): PersistConfig<T> | undefined => {\n if (!persist) {\n return undefined;\n }\n if (persist.storage) {\n return persist;\n }\n if (typeof window === \"undefined\") {\n return { ...persist, storage: null };\n }\n return { ...persist, storage: window.localStorage };\n};\n\nexport type ConductorConfig = {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n sections: SectionDefinition<any>[];\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n derived?: DerivedSectionDefinition<any>[];\n scheduler?: Scheduler;\n bootstrap?: Record<string, unknown> | (() => Record<string, unknown> | undefined);\n transactionHistoryLimit?: number;\n};\n\nexport const createConductor = (config: ConductorConfig): Conductor => {\n const sections = new Map<string, SectionState<unknown>>();\n const updates = new Map<string, Update>();\n const effects = new Set<EffectDefinition>();\n const dependencies = new Map<string, string[]>();\n const scheduler = createScheduler(config.scheduler);\n const transactionHistory: TransactionInfo[] = [];\n const transactionHistoryLimit = config.transactionHistoryLimit ?? 20;\n\n const persistValue = <T,>(state: SectionState<T>, value: T) => {\n if (!state.persist) {\n return;\n }\n const persist = resolveStorage(state.persist);\n if (!persist?.storage) {\n return;\n }\n if (persist.throttleMs && persist.throttleMs > 0) {\n if (state.persistTimer) {\n clearTimeout(state.persistTimer);\n }\n state.persistTimer = setTimeout(() => {\n defaultPersist(value, persist);\n }, persist.throttleMs);\n return;\n }\n defaultPersist(value, persist);\n };\n\n const hydrateValue = <T,>(state: SectionState<T>) => {\n const persist = resolveStorage(state.persist);\n if (!persist?.storage) {\n return;\n }\n const stored = readPersist<T>(persist);\n if (stored !== undefined) {\n state.value = stored;\n state.adapter?.set(stored);\n }\n };\n\n const bootstrapValues = (() => {\n if (!config.bootstrap) {\n return undefined;\n }\n if (typeof config.bootstrap === \"function\") {\n return config.bootstrap();\n }\n return config.bootstrap;\n })();\n\n for (const definition of config.sections) {\n if (sections.has(definition.key)) {\n throw new Error(`Section with key \"${definition.key}\" already exists.`);\n }\n const dependsOn = definition.dependsOn ?? [];\n const state: SectionState<unknown> = {\n key: definition.key,\n adapter: definition.source,\n subscribers: new Set(),\n dependsOn,\n persist: definition.persist,\n value: definition.source.get()\n };\n sections.set(definition.key, state);\n dependencies.set(definition.key, dependsOn);\n }\n\n const derivedDefinitions = config.derived ?? [];\n for (const definition of derivedDefinitions) {\n if (sections.has(definition.key)) {\n throw new Error(`Section with key \"${definition.key}\" already exists.`);\n }\n const state: SectionState<unknown> = {\n key: definition.key,\n subscribers: new Set(),\n dependsOn: definition.inputs,\n value: undefined,\n derived: {\n inputs: definition.inputs,\n compute: definition.compute,\n lastInputs: undefined\n }\n };\n sections.set(definition.key, state);\n dependencies.set(definition.key, definition.inputs);\n }\n\n const order = createDependencyOrder(dependencies);\n\n for (const [key, state] of sections) {\n if (bootstrapValues && key in bootstrapValues) {\n const value = bootstrapValues[key] as typeof state.value;\n state.value = value;\n state.adapter?.set(value);\n continue;\n }\n if (state.persist) {\n hydrateValue(state);\n }\n }\n\n const stagedChanges = new Set<string>();\n const pendingNotifications = new Set<string>();\n let scheduled = false;\n let transactionDepth = 0;\n let lastTransactionLabel: string | undefined;\n\n const notifySubscribers = () => {\n scheduled = false;\n for (const key of pendingNotifications) {\n const state = sections.get(key);\n if (!state) {\n continue;\n }\n for (const subscriber of state.subscribers) {\n subscriber();\n }\n }\n pendingNotifications.clear();\n };\n\n const scheduleNotify = (keys: string[]) => {\n for (const key of keys) {\n pendingNotifications.add(key);\n }\n if (scheduled) {\n return;\n }\n scheduled = true;\n scheduler(notifySubscribers);\n };\n\n const markChanged = (key: string) => {\n stagedChanges.add(key);\n };\n\n const applyUpdate = (state: SectionState<unknown>, update: Update): boolean => {\n if (update.type === \"set\") {\n if (Object.is(state.value, update.value)) {\n return false;\n }\n state.adapter?.set(update.value);\n state.value = update.value;\n return true;\n }\n\n if (state.adapter?.patch) {\n if (isObject(state.value) && isObject(update.value)) {\n const next = { ...state.value, ...update.value };\n const changed = Object.keys(update.value).some(\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n (k) => !Object.is((state.value as any)[k], (update.value as any)[k])\n );\n\n if (!changed) {\n return false;\n }\n\n state.adapter.patch(update.value as Partial<unknown>);\n state.value = next;\n return true;\n }\n\n state.adapter.patch(update.value as Partial<unknown>);\n state.value = update.value;\n return true;\n }\n\n if (isObject(state.value) && isObject(update.value)) {\n const next = { ...state.value, ...update.value };\n const changed = Object.keys(update.value).some(\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n (k) => !Object.is((state.value as any)[k], (update.value as any)[k])\n );\n\n if (!changed) {\n return false;\n }\n\n state.adapter?.set(next);\n state.value = next;\n return true;\n }\n\n throw new Error(`Section \"${state.key}\" does not support patch updates.`);\n };\n\n const computeDerived = (state: SectionState<unknown>) => {\n if (!state.derived) {\n return false;\n }\n const inputs = state.derived.inputs.map((key) => {\n const inputState = sections.get(key);\n if (!inputState) {\n throw new Error(`Missing input section \"${key}\".`);\n }\n return inputState.value;\n });\n if (\n state.derived.lastInputs &&\n inputs.every((value, index) => Object.is(value, state.derived?.lastInputs?.[index]))\n ) {\n return false;\n }\n const next = state.derived.compute(...inputs);\n const changed = !Object.is(state.value, next);\n state.value = next;\n state.derived.lastInputs = inputs;\n return changed;\n };\n\n for (const key of order) {\n const state = sections.get(key);\n if (!state?.derived) {\n continue;\n }\n computeDerived(state);\n }\n\n const runEffects = (changedKeys: string[]) => {\n if (effects.size === 0) {\n return;\n }\n const api = {\n get: <T,>(key: string) => getSectionValue<T>(key),\n set: <T,>(key: string, value: T) => setSectionValue(key, value),\n patch: <T extends object>(key: string, value: Partial<T>) =>\n patchSectionValue(key, value),\n transaction: (fn: () => void, label?: string) =>\n transaction(fn, label)\n };\n\n for (const effect of effects) {\n if (!effect.when.some((key) => changedKeys.includes(key))) {\n continue;\n }\n const limit = effect.maxDepth ?? 5;\n if (transactionDepth > limit) {\n throw new Error(\n `Effect depth exceeded while running effect for sections: ${effect.when.join(\", \")}`\n );\n }\n effect.run(api);\n }\n };\n\n const commit = () => {\n if (updates.size === 0 && stagedChanges.size === 0) {\n return;\n }\n const changedKeys: string[] = [];\n\n for (const key of order) {\n const state = sections.get(key);\n if (!state) {\n continue;\n }\n const update = updates.get(key);\n if (update && !state.derived) {\n const changed = applyUpdate(state, update);\n if (changed) {\n persistValue(state, state.value);\n changedKeys.push(key);\n }\n updates.delete(key);\n }\n if (state.derived) {\n const derivedChanged = computeDerived(state);\n if (derivedChanged) {\n changedKeys.push(key);\n }\n }\n }\n\n if (changedKeys.length > 0) {\n scheduleNotify(changedKeys);\n transactionHistory.unshift({\n label: lastTransactionLabel,\n touched: [...new Set(changedKeys)],\n timestamp: now()\n });\n if (transactionHistory.length > transactionHistoryLimit) {\n transactionHistory.length = transactionHistoryLimit;\n }\n }\n\n stagedChanges.clear();\n lastTransactionLabel = undefined;\n runEffects(changedKeys);\n };\n\n const beginTransaction = (label?: string) => {\n transactionDepth += 1;\n if (label) {\n lastTransactionLabel = label;\n }\n };\n\n const endTransaction = () => {\n transactionDepth -= 1;\n if (transactionDepth === 0) {\n commit();\n }\n };\n\n const transaction = (fn: () => void, label?: string) => {\n beginTransaction(label);\n try {\n fn();\n } finally {\n endTransaction();\n }\n };\n\n const setSectionValue = (key: string, value: unknown) => {\n if (!sections.has(key)) {\n throw new Error(`Unknown section \"${key}\".`);\n }\n if (transactionDepth === 0) {\n return transaction(() => setSectionValue(key, value));\n }\n const state = sections.get(key);\n if (state?.derived) {\n throw new Error(`Cannot set derived section \"${key}\".`);\n }\n updates.set(key, { type: \"set\", value });\n markChanged(key);\n };\n\n const patchSectionValue = (key: string, value: Partial<unknown>) => {\n if (!sections.has(key)) {\n throw new Error(`Unknown section \"${key}\".`);\n }\n if (transactionDepth === 0) {\n return transaction(() => patchSectionValue(key, value));\n }\n const state = sections.get(key);\n if (state?.derived) {\n throw new Error(`Cannot patch derived section \"${key}\".`);\n }\n updates.set(key, { type: \"patch\", value });\n markChanged(key);\n };\n\n const getSectionValue = <T,>(key: string): T => {\n const state = sections.get(key);\n if (!state) {\n throw new Error(`Unknown section \"${key}\".`);\n }\n return state.value as T;\n };\n\n const subscribe = (key: string, cb: Subscriber) => {\n const state = sections.get(key);\n if (!state) {\n throw new Error(`Unknown section \"${key}\".`);\n }\n state.subscribers.add(cb);\n return () => {\n state.subscribers.delete(cb);\n };\n };\n\n const getSection = <T,>(key: string): SectionHandle<T> => {\n return {\n get: () => getSectionValue<T>(key),\n set: (next) => setSectionValue(key, next),\n patch: (next) => patchSectionValue(key, next as Partial<unknown>),\n subscribe: (cb) => subscribe(key, cb)\n };\n };\n\n const effect = (definition: EffectDefinition) => {\n effects.add(definition);\n return () => effects.delete(definition);\n };\n\n const getSnapshot = (): ConductorSnapshot => {\n const snapshot: ConductorSnapshot = { sections: {}, transactions: [] };\n for (const [key, state] of sections) {\n snapshot.sections[key] = state.value;\n }\n snapshot.transactions = [...transactionHistory];\n return snapshot;\n };\n\n const destroy = () => {\n sections.forEach((state) => {\n state.adapter?.destroy?.();\n if (state.persistTimer) {\n clearTimeout(state.persistTimer);\n }\n state.subscribers.clear();\n });\n sections.clear();\n updates.clear();\n effects.clear();\n };\n\n return {\n getSection,\n getSectionValue,\n subscribe,\n transaction,\n effect,\n getSnapshot,\n destroy\n };\n};\n","import type { DerivedSectionDefinition, PersistConfig, SectionDefinition } from \"./types\";\n\nexport const defineSection = <T>(definition: SectionDefinition<T>) => definition;\n\nexport const defineDerivedSection = <T>(definition: DerivedSectionDefinition<T>) => definition;\n\nexport const createStorageSink = <T>(options: PersistConfig<T>) => options;\n","import type { SourceAdapter, Subscriber, Unsubscribe } from \"../core/types\";\n\nexport type AtomAdapter<T> = SourceAdapter<T> & {\n patch: (partial: Partial<T>) => void;\n};\n\nexport const createAtomAdapter = <T>(initial: T): AtomAdapter<T> => {\n let current = initial;\n const subscribers = new Set<Subscriber>();\n\n const notify = () => {\n subscribers.forEach((cb) => cb());\n };\n\n return {\n kind: \"atom\",\n get: () => current,\n set: (next) => {\n if (Object.is(current, next)) {\n return;\n }\n current = next;\n notify();\n },\n patch: (partial) => {\n if (typeof current !== \"object\" || current === null) {\n throw new Error(\"AtomAdapter patch requires object state.\");\n }\n current = { ...(current as Record<string, unknown>), ...partial } as T;\n notify();\n },\n subscribe: (cb: Subscriber): Unsubscribe => {\n subscribers.add(cb);\n return () => subscribers.delete(cb);\n }\n };\n};\n","import type { SourceAdapter, Subscriber, Unsubscribe } from \"../core/types\";\n\nexport type ExternalStore<T> = {\n get: () => T;\n set: (next: T) => void;\n subscribe: (cb: Subscriber) => Unsubscribe;\n};\n\nexport const createExternalStoreAdapter = <T>(\n store: ExternalStore<T>,\n options?: { kind?: string; patch?: (partial: Partial<T>) => void }\n): SourceAdapter<T> => {\n return {\n kind: options?.kind ?? \"external\",\n get: store.get,\n set: store.set,\n patch: options?.patch,\n subscribe: store.subscribe\n };\n};\n","import type { SourceAdapter, Subscriber, Unsubscribe } from \"../core/types\";\n\nexport type UrlAdapterOptions<T> = {\n parse: (params: URLSearchParams) => T;\n serialize: (value: T) => URLSearchParams;\n getSearchParams?: () => URLSearchParams;\n setSearchParams?: (params: URLSearchParams) => void;\n subscribe?: (cb: Subscriber) => Unsubscribe;\n kind?: string;\n};\n\nconst defaultGetParams = () => {\n if (typeof window === \"undefined\") {\n return new URLSearchParams();\n }\n return new URLSearchParams(window.location.search);\n};\n\nconst defaultSetParams = (params: URLSearchParams) => {\n if (typeof window === \"undefined\") {\n return;\n }\n const url = `${window.location.pathname}?${params.toString()}${window.location.hash}`;\n window.history.replaceState({}, \"\", url);\n};\n\nconst defaultSubscribe = (cb: Subscriber): Unsubscribe => {\n if (typeof window === \"undefined\") {\n return () => undefined;\n }\n const handler = () => cb();\n window.addEventListener(\"popstate\", handler);\n return () => window.removeEventListener(\"popstate\", handler);\n};\n\nexport const createUrlParamsAdapter = <T>(\n options: UrlAdapterOptions<T>\n): SourceAdapter<T> => {\n const getParams = options.getSearchParams ?? defaultGetParams;\n const setParams = options.setSearchParams ?? defaultSetParams;\n const subscribe = options.subscribe ?? defaultSubscribe;\n\n return {\n kind: options.kind ?? \"url\",\n get: () => options.parse(getParams()),\n set: (next) => setParams(options.serialize(next)),\n subscribe\n };\n};\n"]}
|
package/dist/index.d.cts
ADDED
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { S as SectionDefinition, D as DerivedSectionDefinition, a as Scheduler, C as Conductor, P as PersistConfig } from './types-B1uzdpYH.cjs';
|
|
2
|
+
export { b as ConductorSnapshot, E as EffectDefinition, c as SectionHandle, d as SourceAdapter, T as TransactionInfo } from './types-B1uzdpYH.cjs';
|
|
3
|
+
export { AtomAdapter, createAtomAdapter } from './adapters/atom.cjs';
|
|
4
|
+
export { ExternalStore, createExternalStoreAdapter } from './adapters/external.cjs';
|
|
5
|
+
export { UrlAdapterOptions, createUrlParamsAdapter } from './adapters/url.cjs';
|
|
6
|
+
|
|
7
|
+
type ConductorConfig = {
|
|
8
|
+
sections: SectionDefinition<any>[];
|
|
9
|
+
derived?: DerivedSectionDefinition<any>[];
|
|
10
|
+
scheduler?: Scheduler;
|
|
11
|
+
bootstrap?: Record<string, unknown> | (() => Record<string, unknown> | undefined);
|
|
12
|
+
transactionHistoryLimit?: number;
|
|
13
|
+
};
|
|
14
|
+
declare const createConductor: (config: ConductorConfig) => Conductor;
|
|
15
|
+
|
|
16
|
+
declare const defineSection: <T>(definition: SectionDefinition<T>) => SectionDefinition<T>;
|
|
17
|
+
declare const defineDerivedSection: <T>(definition: DerivedSectionDefinition<T>) => DerivedSectionDefinition<T>;
|
|
18
|
+
declare const createStorageSink: <T>(options: PersistConfig<T>) => PersistConfig<T>;
|
|
19
|
+
|
|
20
|
+
export { Conductor, DerivedSectionDefinition, PersistConfig, Scheduler, SectionDefinition, createConductor, createStorageSink, defineDerivedSection, defineSection };
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { S as SectionDefinition, D as DerivedSectionDefinition, a as Scheduler, C as Conductor, P as PersistConfig } from './types-B1uzdpYH.js';
|
|
2
|
+
export { b as ConductorSnapshot, E as EffectDefinition, c as SectionHandle, d as SourceAdapter, T as TransactionInfo } from './types-B1uzdpYH.js';
|
|
3
|
+
export { AtomAdapter, createAtomAdapter } from './adapters/atom.js';
|
|
4
|
+
export { ExternalStore, createExternalStoreAdapter } from './adapters/external.js';
|
|
5
|
+
export { UrlAdapterOptions, createUrlParamsAdapter } from './adapters/url.js';
|
|
6
|
+
|
|
7
|
+
type ConductorConfig = {
|
|
8
|
+
sections: SectionDefinition<any>[];
|
|
9
|
+
derived?: DerivedSectionDefinition<any>[];
|
|
10
|
+
scheduler?: Scheduler;
|
|
11
|
+
bootstrap?: Record<string, unknown> | (() => Record<string, unknown> | undefined);
|
|
12
|
+
transactionHistoryLimit?: number;
|
|
13
|
+
};
|
|
14
|
+
declare const createConductor: (config: ConductorConfig) => Conductor;
|
|
15
|
+
|
|
16
|
+
declare const defineSection: <T>(definition: SectionDefinition<T>) => SectionDefinition<T>;
|
|
17
|
+
declare const defineDerivedSection: <T>(definition: DerivedSectionDefinition<T>) => DerivedSectionDefinition<T>;
|
|
18
|
+
declare const createStorageSink: <T>(options: PersistConfig<T>) => PersistConfig<T>;
|
|
19
|
+
|
|
20
|
+
export { Conductor, DerivedSectionDefinition, PersistConfig, Scheduler, SectionDefinition, createConductor, createStorageSink, defineDerivedSection, defineSection };
|