coaction 0.1.4 → 0.2.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/dist/index.mjs ADDED
@@ -0,0 +1,818 @@
1
+ // src/create.ts
2
+ import { apply as applyWithMutative } from "mutative";
3
+
4
+ // src/global.ts
5
+ var getGlobal = () => {
6
+ let _global2;
7
+ if (typeof window !== "undefined") {
8
+ _global2 = window;
9
+ } else if (typeof global !== "undefined") {
10
+ _global2 = global;
11
+ } else if (typeof self !== "undefined") {
12
+ _global2 = self;
13
+ } else {
14
+ _global2 = {};
15
+ }
16
+ return _global2;
17
+ };
18
+ var _global = getGlobal();
19
+
20
+ // src/constant.ts
21
+ var WorkerType = _global.SharedWorkerGlobalScope ? "SharedWorkerInternal" : globalThis.WorkerGlobalScope ? "WebWorkerInternal" : null;
22
+ var bindSymbol = /* @__PURE__ */ Symbol("bind");
23
+ var defaultName = "default";
24
+
25
+ // src/asyncClientStore.ts
26
+ import { createTransport } from "data-transport";
27
+
28
+ // src/wrapStore.ts
29
+ var wrapStore = (store, getState = () => store.getState()) => {
30
+ const { name, ..._store } = store;
31
+ return Object.assign(
32
+ {
33
+ [name]: (...args) => getState(...args)
34
+ }[name],
35
+ _store
36
+ );
37
+ };
38
+
39
+ // src/asyncClientStore.ts
40
+ var createAsyncClientStore = (createStore, asyncStoreClientOption) => {
41
+ const { store: asyncClientStore, internal } = createStore({
42
+ share: "client"
43
+ });
44
+ const transport = asyncStoreClientOption.worker ? createTransport(
45
+ asyncStoreClientOption.worker instanceof SharedWorker ? "SharedWorkerClient" : "WebWorkerClient",
46
+ {
47
+ worker: asyncStoreClientOption.worker,
48
+ prefix: asyncClientStore.name
49
+ }
50
+ ) : asyncStoreClientOption.clientTransport;
51
+ if (!transport) {
52
+ throw new Error("transport is required");
53
+ }
54
+ asyncClientStore.transport = transport;
55
+ const fullSync = async () => {
56
+ const latest = await transport.emit("fullSync");
57
+ asyncClientStore.apply(JSON.parse(latest.state));
58
+ internal.sequence = latest.sequence;
59
+ };
60
+ if (typeof transport.onConnect !== "function") {
61
+ throw new Error("transport.onConnect is required");
62
+ }
63
+ transport.onConnect?.(async () => {
64
+ await fullSync();
65
+ });
66
+ transport.listen("update", async (options) => {
67
+ if (typeof options.sequence === "number" && options.sequence === internal.sequence + 1) {
68
+ internal.sequence = options.sequence;
69
+ asyncClientStore.apply(void 0, options.patches);
70
+ } else {
71
+ await fullSync();
72
+ }
73
+ });
74
+ return wrapStore(asyncClientStore, () => asyncClientStore.getState());
75
+ };
76
+ var emit = (store, internal, patches) => {
77
+ if (store.transport && patches?.length) {
78
+ internal.sequence += 1;
79
+ store.transport.emit(
80
+ {
81
+ name: "update",
82
+ respond: false
83
+ },
84
+ {
85
+ patches,
86
+ sequence: internal.sequence
87
+ }
88
+ );
89
+ }
90
+ };
91
+ var handleDraft = (store, internal) => {
92
+ internal.rootState = internal.backupState;
93
+ const [, patches, inversePatches] = internal.finalizeDraft();
94
+ const finalPatches = store.patch ? store.patch({ patches, inversePatches }) : { patches, inversePatches };
95
+ if (finalPatches.patches.length) {
96
+ store.apply(internal.rootState, finalPatches.patches);
97
+ emit(store, internal, finalPatches.patches);
98
+ }
99
+ };
100
+
101
+ // src/getInitialState.ts
102
+ var isObject = (value) => typeof value === "object" && value !== null;
103
+ var isStateFactory = (value) => typeof value === "function";
104
+ var hasGetState = (value) => (typeof value === "object" || typeof value === "function") && value !== null && typeof value.getState === "function";
105
+ var hasBindState = (value) => isObject(value) && !!value[bindSymbol];
106
+ var getInitialState = (store, createState, internal) => {
107
+ const makeState = (stateOrFn, key) => {
108
+ let state;
109
+ if (isStateFactory(stateOrFn)) {
110
+ state = stateOrFn(store.setState, store.getState, store);
111
+ } else if (isObject(stateOrFn)) {
112
+ state = stateOrFn;
113
+ } else {
114
+ if (process.env.NODE_ENV !== "production") {
115
+ throw new Error(
116
+ `Invalid state value encountered in makeState: ${key ? `for key ${key}, ` : ""}${typeof stateOrFn}`
117
+ );
118
+ }
119
+ return {};
120
+ }
121
+ if (hasGetState(state)) {
122
+ state = state.getState();
123
+ } else if (typeof state === "function") {
124
+ state = state();
125
+ }
126
+ if (hasBindState(state)) {
127
+ if (store.isSliceStore) {
128
+ throw new Error(
129
+ "Third-party state binding does not support Slices mode. Please inject a whole store instead."
130
+ );
131
+ }
132
+ const binder = state[bindSymbol];
133
+ const rawState = binder.bind(state);
134
+ binder.handleStore(
135
+ store,
136
+ rawState,
137
+ state,
138
+ internal,
139
+ key
140
+ );
141
+ delete state[bindSymbol];
142
+ return rawState;
143
+ }
144
+ return state;
145
+ };
146
+ return store.isSliceStore ? Object.entries(createState).reduce(
147
+ (stateTree, [key, value]) => Object.assign(stateTree, {
148
+ [key]: makeState(value, key)
149
+ }),
150
+ {}
151
+ ) : makeState(createState);
152
+ };
153
+
154
+ // src/getRawState.ts
155
+ import {
156
+ create as createWithMutative,
157
+ isDraft
158
+ } from "mutative";
159
+
160
+ // src/utils.ts
161
+ var isEqual = (x, y) => {
162
+ if (x === y) {
163
+ return x !== 0 || y !== 0 || 1 / x === 1 / y;
164
+ }
165
+ return x !== x && y !== y;
166
+ };
167
+ var areShallowEqualWithArray = (prev, next) => {
168
+ if (prev === null || next === null || prev.length !== next.length) {
169
+ return false;
170
+ }
171
+ const { length } = prev;
172
+ for (let i = 0; i < length; i += 1) {
173
+ if (!isEqual(prev[i], next[i])) {
174
+ return false;
175
+ }
176
+ }
177
+ return true;
178
+ };
179
+ var mergeObject = (target, source, isSlice) => {
180
+ if (isSlice) {
181
+ if (typeof source === "object" && source !== null) {
182
+ for (const key in source) {
183
+ if (typeof source[key] === "object" && source[key] !== null) {
184
+ Object.assign(target[key], source[key]);
185
+ }
186
+ }
187
+ }
188
+ } else {
189
+ Object.assign(target, source);
190
+ }
191
+ };
192
+ var uuid = () => {
193
+ let timestamp = (/* @__PURE__ */ new Date()).getTime();
194
+ const uuidTemplate = "xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx";
195
+ const uuid2 = uuidTemplate.replace(/[xy]/g, (char) => {
196
+ let randomNum = (timestamp + Math.random() * 16) % 16 | 0;
197
+ timestamp = Math.floor(timestamp / 16);
198
+ return (char === "x" ? randomNum : randomNum & 3 | 8).toString(16);
199
+ });
200
+ return uuid2;
201
+ };
202
+
203
+ // src/computed.ts
204
+ var Computed = class {
205
+ constructor(deps, fn) {
206
+ this.deps = deps;
207
+ this.fn = fn;
208
+ }
209
+ };
210
+ var defaultMemoize = (func) => {
211
+ const lastArgs = /* @__PURE__ */ new WeakMap();
212
+ const lastResult = /* @__PURE__ */ new WeakMap();
213
+ return function() {
214
+ if (!areShallowEqualWithArray(lastArgs.get(this) ?? [], arguments)) {
215
+ lastResult.set(this, func.apply(this, arguments));
216
+ }
217
+ lastArgs.set(this, arguments);
218
+ return lastResult.get(this);
219
+ };
220
+ };
221
+ var createSelectorCreatorWithArray = (memoize = defaultMemoize) => {
222
+ return (dependenciesFunc, resultFunc) => {
223
+ const memoizedResultFunc = memoize(function() {
224
+ return resultFunc.apply(this, arguments);
225
+ });
226
+ return function() {
227
+ return memoizedResultFunc.apply(
228
+ this,
229
+ dependenciesFunc.apply(null, [this])
230
+ );
231
+ };
232
+ };
233
+ };
234
+ var createSelectorWithArray = createSelectorCreatorWithArray();
235
+
236
+ // src/getRawState.ts
237
+ var getRawState = (store, internal, initialState, options) => {
238
+ const rawState = {};
239
+ const handle = (_rawState, _initialState, sliceKey) => {
240
+ internal.mutableInstance = internal.toMutableRaw?.(_initialState);
241
+ const descriptors = Object.getOwnPropertyDescriptors(_initialState);
242
+ Object.entries(descriptors).forEach(([key, descriptor]) => {
243
+ if (Object.prototype.hasOwnProperty.call(descriptor, "value")) {
244
+ if (typeof descriptor.value !== "function") {
245
+ const isComputed = descriptor.value instanceof Computed;
246
+ if (internal.mutableInstance) {
247
+ Object.defineProperty(_rawState, key, {
248
+ get: () => internal.mutableInstance[key],
249
+ set: (value) => {
250
+ internal.mutableInstance[key] = value;
251
+ },
252
+ enumerable: true
253
+ });
254
+ } else if (!isComputed) {
255
+ _rawState[key] = descriptor.value;
256
+ }
257
+ if (isComputed) {
258
+ if (internal.mutableInstance) {
259
+ throw new Error(
260
+ "Computed is not supported with mutable instance"
261
+ );
262
+ }
263
+ const { deps, fn } = descriptor.value;
264
+ const depsCallbackSelector = createSelectorWithArray(
265
+ // the root state should be updated, and the computed property will be updated.
266
+ () => [internal.rootState],
267
+ () => {
268
+ return deps(internal.module);
269
+ }
270
+ );
271
+ const selector = createSelectorWithArray(
272
+ (that) => depsCallbackSelector.call(that),
273
+ fn
274
+ );
275
+ descriptor.get = function() {
276
+ return selector.call(this);
277
+ };
278
+ } else {
279
+ if (sliceKey) {
280
+ descriptor.get = () => internal.rootState[sliceKey][key];
281
+ descriptor.set = (value) => {
282
+ internal.rootState[sliceKey][key] = value;
283
+ };
284
+ } else {
285
+ descriptor.get = () => internal.rootState[key];
286
+ descriptor.set = (value) => {
287
+ internal.rootState[key] = value;
288
+ };
289
+ }
290
+ }
291
+ delete descriptor.value;
292
+ delete descriptor.writable;
293
+ } else if (store.share === "client") {
294
+ descriptor.value = (...args) => {
295
+ let actionId;
296
+ let done;
297
+ if (store.trace) {
298
+ actionId = uuid();
299
+ store.trace({
300
+ method: key,
301
+ parameters: args,
302
+ id: actionId,
303
+ sliceKey
304
+ });
305
+ done = (result) => {
306
+ store.trace({
307
+ method: key,
308
+ id: actionId,
309
+ result,
310
+ sliceKey
311
+ });
312
+ };
313
+ }
314
+ const keys = sliceKey ? [sliceKey, key] : [key];
315
+ return store.transport.emit("execute", keys, args).then(([result, sequence]) => {
316
+ if (internal.sequence >= sequence) {
317
+ if (result?.$$Error) {
318
+ done?.(result);
319
+ throw new Error(result.$$Error);
320
+ }
321
+ done?.(result);
322
+ return result;
323
+ }
324
+ if (process.env.NODE_ENV === "development") {
325
+ console.warn(
326
+ `The sequence of the action is not consistent.`,
327
+ sequence,
328
+ internal.sequence
329
+ );
330
+ }
331
+ return new Promise((resolve) => {
332
+ const unsubscribe = store.subscribe(() => {
333
+ if (internal.sequence >= sequence) {
334
+ unsubscribe();
335
+ done?.(result);
336
+ resolve(result);
337
+ }
338
+ });
339
+ });
340
+ });
341
+ };
342
+ } else {
343
+ const fn = descriptor.value;
344
+ descriptor.value = (...args) => {
345
+ let actionId;
346
+ let done;
347
+ if (store.trace) {
348
+ actionId = uuid();
349
+ store.trace({
350
+ method: key,
351
+ parameters: args,
352
+ id: actionId,
353
+ sliceKey
354
+ });
355
+ done = (result2) => {
356
+ store.trace({
357
+ method: key,
358
+ id: actionId,
359
+ result: result2,
360
+ sliceKey
361
+ });
362
+ };
363
+ }
364
+ const enablePatches = store.transport ?? options.enablePatches;
365
+ if (internal.mutableInstance && !internal.isBatching && enablePatches) {
366
+ let result2;
367
+ const handleResult = (isDrafted2) => {
368
+ handleDraft(store, internal);
369
+ if (isDrafted2) {
370
+ internal.backupState = internal.rootState;
371
+ const [draft2, finalize2] = createWithMutative(
372
+ internal.rootState,
373
+ {
374
+ enablePatches: true
375
+ }
376
+ );
377
+ internal.finalizeDraft = finalize2;
378
+ internal.rootState = draft2;
379
+ }
380
+ };
381
+ const isDrafted = isDraft(internal.rootState);
382
+ if (isDrafted) {
383
+ handleResult();
384
+ }
385
+ internal.backupState = internal.rootState;
386
+ const [draft, finalize] = createWithMutative(internal.rootState, {
387
+ enablePatches: true
388
+ });
389
+ internal.finalizeDraft = finalize;
390
+ internal.rootState = draft;
391
+ try {
392
+ result2 = fn.apply(
393
+ sliceKey ? store.getState()[sliceKey] : store.getState(),
394
+ args
395
+ );
396
+ } finally {
397
+ if (result2 instanceof Promise) {
398
+ return result2.finally(() => {
399
+ const result3 = handleResult(isDrafted);
400
+ done?.(result3);
401
+ return result3;
402
+ });
403
+ }
404
+ handleResult(isDrafted);
405
+ }
406
+ done?.(result2);
407
+ return result2;
408
+ }
409
+ if (internal.mutableInstance && internal.actMutable) {
410
+ const result2 = internal.actMutable(() => {
411
+ return fn.apply(
412
+ sliceKey ? store.getState()[sliceKey] : store.getState(),
413
+ args
414
+ );
415
+ });
416
+ done?.(result2);
417
+ return result2;
418
+ }
419
+ const result = fn.apply(
420
+ sliceKey ? store.getState()[sliceKey] : store.getState(),
421
+ args
422
+ );
423
+ done?.(result);
424
+ return result;
425
+ };
426
+ }
427
+ }
428
+ });
429
+ const slice = Object.defineProperties({}, descriptors);
430
+ return slice;
431
+ };
432
+ if (store.isSliceStore) {
433
+ internal.module = {};
434
+ Object.entries(initialState).forEach(([key, value]) => {
435
+ rawState[key] = {};
436
+ internal.module[key] = handle(rawState[key], value, key);
437
+ });
438
+ } else {
439
+ internal.module = handle(rawState, initialState);
440
+ }
441
+ return rawState;
442
+ };
443
+
444
+ // src/handleState.ts
445
+ import {
446
+ create as createWithMutative2,
447
+ isDraft as isDraft2
448
+ } from "mutative";
449
+ var handleState = (store, internal, options) => {
450
+ const setState = (next, updater = (next2) => {
451
+ const merge = (_next = next2) => {
452
+ mergeObject(internal.rootState, _next, store.isSliceStore);
453
+ };
454
+ const fn = typeof next2 === "function" ? () => {
455
+ const returnValue = next2(internal.module);
456
+ if (returnValue instanceof Promise) {
457
+ throw new Error(
458
+ "setState with async function is not supported"
459
+ );
460
+ }
461
+ if (typeof returnValue === "object" && returnValue !== null) {
462
+ merge(returnValue);
463
+ }
464
+ } : merge;
465
+ const enablePatches = store.transport ?? options.enablePatches;
466
+ if (!enablePatches && internal.mutableInstance) {
467
+ if (internal.actMutable) {
468
+ internal.actMutable(() => {
469
+ fn.apply(null);
470
+ });
471
+ return [];
472
+ }
473
+ fn.apply(null);
474
+ return [];
475
+ }
476
+ internal.backupState = internal.rootState;
477
+ let patches;
478
+ let inversePatches;
479
+ try {
480
+ const result = createWithMutative2(
481
+ internal.rootState,
482
+ (draft) => {
483
+ internal.rootState = draft;
484
+ return fn.apply(null);
485
+ },
486
+ {
487
+ enablePatches: true
488
+ }
489
+ );
490
+ patches = result[1];
491
+ inversePatches = result[2];
492
+ } finally {
493
+ internal.rootState = internal.backupState;
494
+ }
495
+ const finalPatches = store.patch ? store.patch({ patches, inversePatches }) : { patches, inversePatches };
496
+ if (finalPatches.patches.length) {
497
+ store.apply(internal.rootState, finalPatches.patches);
498
+ if (!internal.mutableInstance) {
499
+ if (internal.updateImmutable) {
500
+ internal.updateImmutable(internal.rootState);
501
+ } else {
502
+ internal.listeners.forEach((listener) => listener());
503
+ }
504
+ }
505
+ }
506
+ return [internal.rootState, patches, inversePatches];
507
+ }) => {
508
+ if (store.share === "client") {
509
+ throw new Error(
510
+ `setState() cannot be called in the client store. To update the state, please trigger a store method with setState() instead.`
511
+ );
512
+ }
513
+ if (internal.isBatching) {
514
+ throw new Error("setState cannot be called within the updater");
515
+ }
516
+ internal.isBatching = true;
517
+ if (!store.share && !options.enablePatches && !internal.mutableInstance) {
518
+ if (typeof next === "function") {
519
+ try {
520
+ internal.backupState = internal.rootState;
521
+ internal.rootState = createWithMutative2(
522
+ internal.rootState,
523
+ (draft) => {
524
+ internal.rootState = draft;
525
+ return next(internal.module);
526
+ }
527
+ );
528
+ } catch (error) {
529
+ internal.rootState = internal.backupState;
530
+ internal.isBatching = false;
531
+ throw error;
532
+ }
533
+ } else {
534
+ const copy = {};
535
+ const rootState = internal.rootState;
536
+ for (const key of Object.keys(rootState)) {
537
+ copy[key] = rootState[key];
538
+ }
539
+ for (const key of Object.keys(next)) {
540
+ copy[key] = next[key];
541
+ }
542
+ internal.rootState = copy;
543
+ }
544
+ if (internal.updateImmutable) {
545
+ internal.updateImmutable(internal.rootState);
546
+ } else {
547
+ internal.listeners.forEach((listener) => listener());
548
+ }
549
+ internal.isBatching = false;
550
+ return [];
551
+ }
552
+ let result;
553
+ try {
554
+ const isDrafted = internal.mutableInstance && isDraft2(internal.rootState);
555
+ if (isDrafted) {
556
+ handleDraft(store, internal);
557
+ }
558
+ result = updater(next);
559
+ if (isDrafted) {
560
+ internal.backupState = internal.rootState;
561
+ const [draft, finalize] = createWithMutative2(
562
+ internal.rootState,
563
+ {
564
+ enablePatches: true
565
+ }
566
+ );
567
+ internal.finalizeDraft = finalize;
568
+ internal.rootState = draft;
569
+ }
570
+ } finally {
571
+ internal.isBatching = false;
572
+ }
573
+ emit(store, internal, result?.[1]);
574
+ return result;
575
+ };
576
+ const getState = (deps, selector) => deps && selector ? new Computed(deps, selector) : internal.module;
577
+ return { setState, getState };
578
+ };
579
+
580
+ // src/applyMiddlewares.ts
581
+ var isStoreLike = (value) => {
582
+ if (!value || typeof value !== "object") {
583
+ return false;
584
+ }
585
+ const candidate = value;
586
+ return typeof candidate.setState === "function" && typeof candidate.getState === "function" && typeof candidate.subscribe === "function" && typeof candidate.destroy === "function" && typeof candidate.apply === "function" && typeof candidate.getPureState === "function";
587
+ };
588
+ var applyMiddlewares = (store, middlewares) => {
589
+ return middlewares.reduce((store2, middleware, index) => {
590
+ if (process.env.NODE_ENV === "development") {
591
+ if (typeof middleware !== "function") {
592
+ throw new Error(`middlewares[${index}] should be a function`);
593
+ }
594
+ }
595
+ const nextStore = middleware(store2);
596
+ if (process.env.NODE_ENV === "development") {
597
+ if (!isStoreLike(nextStore)) {
598
+ throw new Error(
599
+ `middlewares[${index}] should return a store-like object`
600
+ );
601
+ }
602
+ }
603
+ return nextStore;
604
+ }, store);
605
+ };
606
+
607
+ // src/handleMainTransport.ts
608
+ import { createTransport as createTransport2 } from "data-transport";
609
+ var getErrorMessage = (error) => {
610
+ if (error instanceof Error) {
611
+ return error.message;
612
+ }
613
+ return String(error);
614
+ };
615
+ var handleMainTransport = (store, internal, storeTransport, workerType, checkEnablePatches) => {
616
+ const transport = storeTransport ?? (workerType === "SharedWorkerInternal" || workerType === "WebWorkerInternal" ? createTransport2(workerType, {
617
+ prefix: store.name
618
+ }) : void 0);
619
+ if (!transport) return;
620
+ if (typeof transport.onConnect !== "function") {
621
+ throw new Error("transport.onConnect is required");
622
+ }
623
+ if (checkEnablePatches) {
624
+ throw new Error(`enablePatches: true is required for the transport`);
625
+ }
626
+ transport.listen("execute", async (keys, args) => {
627
+ let base = store.getState();
628
+ let obj = base;
629
+ try {
630
+ for (const key of keys) {
631
+ base = base[key];
632
+ if (typeof base === "function") {
633
+ base = base.bind(obj);
634
+ }
635
+ obj = base;
636
+ }
637
+ if (typeof base !== "function") {
638
+ throw new Error("The function is not found");
639
+ }
640
+ return [base(...args), internal.sequence];
641
+ } catch (error) {
642
+ if (process.env.NODE_ENV === "development") {
643
+ console.error(error);
644
+ }
645
+ return [{ $$Error: getErrorMessage(error) }, internal.sequence];
646
+ }
647
+ });
648
+ transport.listen("fullSync", async () => {
649
+ return {
650
+ state: JSON.stringify(internal.rootState),
651
+ sequence: internal.sequence
652
+ };
653
+ });
654
+ store.transport = transport;
655
+ };
656
+
657
+ // src/create.ts
658
+ var namespaceMap = /* @__PURE__ */ new Map();
659
+ var create = (createState, options = {}) => {
660
+ const checkEnablePatches = Object.hasOwnProperty.call(options, "enablePatches") && !options.enablePatches;
661
+ const workerType = options.workerType ?? WorkerType;
662
+ if (process.env.NODE_ENV === "development" && options.transport && options.clientTransport) {
663
+ throw new Error(
664
+ `transport and clientTransport cannot be used together, please use one of them.`
665
+ );
666
+ }
667
+ const storeTransport = options.transport;
668
+ const share = workerType === "WebWorkerInternal" || workerType === "SharedWorkerInternal" || storeTransport ? "main" : void 0;
669
+ const createStore = ({ share: share2 }) => {
670
+ const store2 = {};
671
+ const internal2 = {
672
+ sequence: 0,
673
+ isBatching: false,
674
+ listeners: /* @__PURE__ */ new Set()
675
+ };
676
+ const name = options.name ?? defaultName;
677
+ const shouldTrackName = process.env.NODE_ENV === "development" && share2 === "main";
678
+ const releaseStoreName = () => {
679
+ if (shouldTrackName) {
680
+ namespaceMap.delete(name);
681
+ }
682
+ };
683
+ if (shouldTrackName) {
684
+ if (namespaceMap.get(name)) {
685
+ throw new Error(`Store name '${name}' is not unique.`);
686
+ }
687
+ namespaceMap.set(name, true);
688
+ }
689
+ try {
690
+ const { setState, getState } = handleState(store2, internal2, options);
691
+ const subscribe = (listener) => {
692
+ internal2.listeners.add(listener);
693
+ return () => internal2.listeners.delete(listener);
694
+ };
695
+ let isDestroyed = false;
696
+ const destroy = () => {
697
+ if (isDestroyed) {
698
+ return;
699
+ }
700
+ isDestroyed = true;
701
+ internal2.listeners.clear();
702
+ store2.transport?.dispose();
703
+ releaseStoreName();
704
+ };
705
+ const apply = (state = internal2.rootState, patches) => {
706
+ internal2.rootState = patches ? applyWithMutative(state, patches) : state;
707
+ if (internal2.updateImmutable) {
708
+ internal2.updateImmutable(internal2.rootState);
709
+ } else {
710
+ internal2.listeners.forEach((listener) => listener());
711
+ }
712
+ };
713
+ const getPureState = () => internal2.rootState;
714
+ const inferSliceStore = () => {
715
+ if (typeof createState === "object" && createState !== null) {
716
+ const values = Object.values(createState);
717
+ return values.length > 0 && values.every((value) => typeof value === "function");
718
+ }
719
+ return false;
720
+ };
721
+ const isValidSliceObject = () => {
722
+ if (typeof createState !== "object" || createState === null) {
723
+ return false;
724
+ }
725
+ const values = Object.values(createState);
726
+ return values.length > 0 && values.every((value) => typeof value === "function");
727
+ };
728
+ const getIsSliceStore = () => {
729
+ const sliceMode = options.sliceMode ?? "auto";
730
+ if (sliceMode === "single") {
731
+ return false;
732
+ }
733
+ if (sliceMode === "slices") {
734
+ if (!isValidSliceObject()) {
735
+ throw new Error(
736
+ `sliceMode: 'slices' requires createState to be an object of slice functions.`
737
+ );
738
+ }
739
+ return true;
740
+ }
741
+ return inferSliceStore();
742
+ };
743
+ const isSliceStore = getIsSliceStore();
744
+ Object.assign(store2, {
745
+ name,
746
+ share: share2 ?? false,
747
+ setState,
748
+ getState,
749
+ subscribe,
750
+ destroy,
751
+ apply,
752
+ isSliceStore,
753
+ getPureState
754
+ });
755
+ const middlewareStore = applyMiddlewares(
756
+ store2,
757
+ options.middlewares ?? []
758
+ );
759
+ if (middlewareStore !== store2) {
760
+ Object.assign(store2, middlewareStore);
761
+ }
762
+ const initialState = getInitialState(store2, createState, internal2);
763
+ store2.getInitialState = () => initialState;
764
+ internal2.rootState = getRawState(
765
+ store2,
766
+ internal2,
767
+ initialState,
768
+ options
769
+ );
770
+ return { store: store2, internal: internal2 };
771
+ } catch (error) {
772
+ releaseStoreName();
773
+ throw error;
774
+ }
775
+ };
776
+ if (options.clientTransport || options.worker || options.workerType === "WebWorkerClient" || options.workerType === "SharedWorkerClient") {
777
+ if (checkEnablePatches) {
778
+ throw new Error(`enablePatches: true is required for the async store`);
779
+ }
780
+ const store2 = createAsyncClientStore(
781
+ createStore,
782
+ options
783
+ );
784
+ return wrapStore(store2);
785
+ }
786
+ const { store, internal } = createStore({
787
+ share
788
+ });
789
+ handleMainTransport(
790
+ store,
791
+ internal,
792
+ storeTransport,
793
+ workerType,
794
+ checkEnablePatches
795
+ );
796
+ return wrapStore(store);
797
+ };
798
+
799
+ // src/binder.ts
800
+ function createBinder({
801
+ handleState: handleState2,
802
+ handleStore
803
+ }) {
804
+ return ((state) => {
805
+ const { copyState, key, bind } = handleState2(state);
806
+ const value = key ? copyState[key] : copyState;
807
+ value[bindSymbol] = {
808
+ handleStore,
809
+ bind
810
+ };
811
+ return copyState;
812
+ });
813
+ }
814
+ export {
815
+ create,
816
+ createBinder,
817
+ wrapStore
818
+ };