@composy/store-core 0.0.1 → 0.0.2
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/CHANGELOG.md +64 -3
- package/README.md +196 -172
- package/dist/index.js +1331 -1115
- package/dist/index.js.map +1 -1
- package/dist/index.min.js +578 -417
- package/dist/index.min.js.map +1 -1
- package/es/.dts-output-manifest.json +1 -0
- package/es/.dts.tsbuildinfo +1 -0
- package/es/core/async-action.d.ts +1 -71
- package/es/core/async-action.js +83 -35
- package/es/core/async-action.js.map +1 -1
- package/es/core/base-store.d.ts +27 -62
- package/es/core/base-store.js +174 -74
- package/es/core/base-store.js.map +1 -1
- package/es/core/batch-manager.d.ts +0 -1
- package/es/core/batch-manager.js +15 -2
- package/es/core/batch-manager.js.map +1 -1
- package/es/core/create-store.d.ts +3 -3
- package/es/core/create-store.js +3 -3
- package/es/core/create-store.js.map +1 -1
- package/es/core/event-bus.d.ts +0 -1
- package/es/core/event-bus.js +1 -1
- package/es/core/event-bus.js.map +1 -1
- package/es/core/index.d.ts +1 -2
- package/es/core/index.js +2 -2
- package/es/core/pub-sub.d.ts +0 -1
- package/es/core/pub-sub.js +1 -1
- package/es/core/pub-sub.js.map +1 -1
- package/es/engine/index.d.ts +0 -1
- package/es/engine/index.js +1 -1
- package/es/engine/plugin.d.ts +0 -1
- package/es/engine/plugin.js +11 -2
- package/es/engine/plugin.js.map +1 -1
- package/es/engine/types.d.ts +0 -1
- package/es/engine/types.js +1 -1
- package/es/errors/index.d.ts +0 -1
- package/es/errors/index.js +17 -1
- package/es/errors/index.js.map +1 -1
- package/es/index.d.ts +3 -4
- package/es/index.js +8 -8
- package/es/index.js.map +1 -1
- package/es/middleware/index.d.ts +3 -4
- package/es/middleware/index.js +2 -2
- package/es/middleware/logger.d.ts +0 -1
- package/es/middleware/logger.js +2 -2
- package/es/middleware/logger.js.map +1 -1
- package/es/middleware/middleware-manager.d.ts +0 -1
- package/es/middleware/middleware-manager.js +5 -2
- package/es/middleware/middleware-manager.js.map +1 -1
- package/es/middleware/persist.d.ts +0 -1
- package/es/middleware/persist.js +3 -3
- package/es/middleware/persist.js.map +1 -1
- package/es/middleware/time-travel.d.ts +0 -1
- package/es/middleware/time-travel.js +1 -1
- package/es/middleware/time-travel.js.map +1 -1
- package/es/middleware/validation.d.ts +0 -1
- package/es/middleware/validation.js +2 -2
- package/es/middleware/validation.js.map +1 -1
- package/es/plugins/define-plugin.d.ts +1 -2
- package/es/plugins/define-plugin.js +2 -2
- package/es/plugins/define-plugin.js.map +1 -1
- package/es/plugins/index.d.ts +0 -1
- package/es/plugins/index.js +2 -2
- package/es/plugins/plugin-manager.d.ts +1 -31
- package/es/plugins/plugin-manager.js +58 -27
- package/es/plugins/plugin-manager.js.map +1 -1
- package/es/types/action.d.ts +2 -0
- package/es/types/action.js +10 -0
- package/es/types/batch.d.ts +2 -0
- package/es/types/batch.js +10 -0
- package/es/types/event.d.ts +2 -0
- package/es/types/event.js +10 -0
- package/es/types/index.d.ts +2 -3
- package/es/types/index.js +1 -1
- package/es/types/middleware.d.ts +10 -2
- package/es/types/middleware.js +1 -1
- package/es/types/mutation.d.ts +2 -0
- package/es/types/mutation.js +10 -0
- package/es/types/plugin.d.ts +4 -1
- package/es/types/plugin.js +1 -1
- package/es/types/state.d.ts +2 -0
- package/es/types/state.js +10 -0
- package/es/types/store.d.ts +19 -1
- package/es/types/store.js +1 -1
- package/es/types/subscription.d.ts +7 -2
- package/es/types/subscription.js +1 -1
- package/es/types/time-travel.d.ts +2 -0
- package/es/types/time-travel.js +10 -0
- package/es/types/utility.d.ts +3 -4
- package/es/types/utility.js +1 -1
- package/es/utils/debounce-throttle.d.ts +0 -1
- package/es/utils/debounce-throttle.js +1 -1
- package/es/utils/debounce-throttle.js.map +1 -1
- package/es/utils/deep-clone.d.ts +0 -1
- package/es/utils/deep-clone.js +1 -1
- package/es/utils/deep-clone.js.map +1 -1
- package/es/utils/index.d.ts +4 -5
- package/es/utils/index.js +1 -1
- package/es/utils/selector.d.ts +0 -1
- package/es/utils/selector.js +1 -1
- package/es/utils/selector.js.map +1 -1
- package/esm/core/async-action.js +83 -35
- package/esm/core/async-action.js.map +1 -1
- package/esm/core/base-store.js +174 -74
- package/esm/core/base-store.js.map +1 -1
- package/esm/core/batch-manager.js +15 -2
- package/esm/core/batch-manager.js.map +1 -1
- package/esm/core/create-store.js +3 -3
- package/esm/core/create-store.js.map +1 -1
- package/esm/core/event-bus.js +1 -1
- package/esm/core/event-bus.js.map +1 -1
- package/esm/core/index.js +2 -2
- package/esm/core/pub-sub.js +1 -1
- package/esm/core/pub-sub.js.map +1 -1
- package/esm/engine/index.js +1 -1
- package/esm/engine/plugin.js +11 -2
- package/esm/engine/plugin.js.map +1 -1
- package/esm/errors/index.js +17 -1
- package/esm/errors/index.js.map +1 -1
- package/esm/index.js +8 -8
- package/esm/index.js.map +1 -1
- package/esm/middleware/logger.js +2 -2
- package/esm/middleware/logger.js.map +1 -1
- package/esm/middleware/middleware-manager.js +5 -2
- package/esm/middleware/middleware-manager.js.map +1 -1
- package/esm/middleware/persist.js +3 -3
- package/esm/middleware/persist.js.map +1 -1
- package/esm/middleware/time-travel.js +1 -1
- package/esm/middleware/time-travel.js.map +1 -1
- package/esm/middleware/validation.js +2 -2
- package/esm/middleware/validation.js.map +1 -1
- package/esm/plugins/define-plugin.js +2 -2
- package/esm/plugins/define-plugin.js.map +1 -1
- package/esm/plugins/plugin-manager.js +58 -27
- package/esm/plugins/plugin-manager.js.map +1 -1
- package/esm/utils/debounce-throttle.js +1 -1
- package/esm/utils/debounce-throttle.js.map +1 -1
- package/esm/utils/deep-clone.js +1 -1
- package/esm/utils/deep-clone.js.map +1 -1
- package/esm/utils/selector.js +1 -1
- package/esm/utils/selector.js.map +1 -1
- package/lib/core/async-action.cjs +83 -35
- package/lib/core/async-action.cjs.map +1 -1
- package/lib/core/async-action.d.cts +25 -0
- package/lib/core/base-store.cjs +174 -74
- package/lib/core/base-store.cjs.map +1 -1
- package/lib/core/base-store.d.cts +50 -0
- package/lib/core/batch-manager.cjs +15 -2
- package/lib/core/batch-manager.cjs.map +1 -1
- package/{esm/core/batch-manager.d.ts → lib/core/batch-manager.d.cts} +0 -1
- package/lib/core/create-store.cjs +3 -3
- package/lib/core/create-store.cjs.map +1 -1
- package/lib/core/{create-store.d.ts → create-store.d.cts} +3 -3
- package/lib/core/event-bus.cjs +1 -1
- package/lib/core/event-bus.cjs.map +1 -1
- package/lib/core/{event-bus.d.ts → event-bus.d.cts} +0 -1
- package/lib/core/index.cjs +2 -2
- package/{esm/core/index.d.ts → lib/core/index.d.cts} +1 -2
- package/lib/core/pub-sub.cjs +1 -1
- package/lib/core/pub-sub.cjs.map +1 -1
- package/lib/core/{pub-sub.d.ts → pub-sub.d.cts} +0 -1
- package/lib/engine/index.cjs +1 -1
- package/{esm/engine/index.d.ts → lib/engine/index.d.cts} +0 -1
- package/lib/engine/plugin.cjs +11 -2
- package/lib/engine/plugin.cjs.map +1 -1
- package/{esm/engine/plugin.d.ts → lib/engine/plugin.d.cts} +0 -1
- package/lib/engine/types.cjs +1 -1
- package/lib/engine/{types.d.ts → types.d.cts} +0 -1
- package/lib/errors/index.cjs +17 -1
- package/lib/errors/index.cjs.map +1 -1
- package/lib/errors/{index.d.ts → index.d.cts} +0 -1
- package/lib/index.cjs +8 -8
- package/lib/index.cjs.map +1 -1
- package/lib/{index.d.ts → index.d.cts} +3 -4
- package/lib/middleware/index.cjs +2 -2
- package/lib/middleware/{index.d.ts → index.d.cts} +3 -4
- package/lib/middleware/logger.cjs +2 -2
- package/lib/middleware/logger.cjs.map +1 -1
- package/lib/middleware/{logger.d.ts → logger.d.cts} +0 -1
- package/lib/middleware/middleware-manager.cjs +5 -2
- package/lib/middleware/middleware-manager.cjs.map +1 -1
- package/lib/middleware/{middleware-manager.d.ts → middleware-manager.d.cts} +0 -1
- package/lib/middleware/persist.cjs +3 -3
- package/lib/middleware/persist.cjs.map +1 -1
- package/{esm/middleware/persist.d.ts → lib/middleware/persist.d.cts} +0 -1
- package/lib/middleware/time-travel.cjs +1 -1
- package/lib/middleware/time-travel.cjs.map +1 -1
- package/{esm/middleware/time-travel.d.ts → lib/middleware/time-travel.d.cts} +0 -1
- package/lib/middleware/validation.cjs +2 -2
- package/lib/middleware/validation.cjs.map +1 -1
- package/{esm/middleware/validation.d.ts → lib/middleware/validation.d.cts} +0 -1
- package/lib/plugins/define-plugin.cjs +2 -2
- package/lib/plugins/define-plugin.cjs.map +1 -1
- package/{esm/plugins/define-plugin.d.ts → lib/plugins/define-plugin.d.cts} +1 -2
- package/lib/plugins/index.cjs +2 -2
- package/{esm/plugins/index.d.ts → lib/plugins/index.d.cts} +0 -1
- package/lib/plugins/plugin-manager.cjs +58 -27
- package/lib/plugins/plugin-manager.cjs.map +1 -1
- package/lib/plugins/plugin-manager.d.cts +5 -0
- package/lib/types/action.cjs +12 -0
- package/lib/types/action.d.cts +2 -0
- package/lib/types/batch.cjs +12 -0
- package/lib/types/batch.d.cts +2 -0
- package/lib/types/event.cjs +12 -0
- package/lib/types/event.d.cts +2 -0
- package/lib/types/index.cjs +1 -1
- package/{esm/types/index.d.ts → lib/types/index.d.cts} +2 -3
- package/lib/types/middleware.cjs +1 -1
- package/lib/types/{middleware.d.ts → middleware.d.cts} +10 -2
- package/lib/types/mutation.cjs +12 -0
- package/lib/types/mutation.d.cts +2 -0
- package/lib/types/plugin.cjs +1 -1
- package/lib/types/{plugin.d.ts → plugin.d.cts} +4 -1
- package/lib/types/state.cjs +12 -0
- package/lib/types/state.d.cts +2 -0
- package/lib/types/store.cjs +1 -1
- package/lib/types/{store.d.ts → store.d.cts} +19 -1
- package/lib/types/subscription.cjs +1 -1
- package/lib/types/{subscription.d.ts → subscription.d.cts} +7 -2
- package/lib/types/time-travel.cjs +12 -0
- package/lib/types/time-travel.d.cts +2 -0
- package/lib/types/utility.cjs +1 -1
- package/lib/types/{utility.d.ts → utility.d.cts} +3 -4
- package/lib/utils/debounce-throttle.cjs +1 -1
- package/lib/utils/debounce-throttle.cjs.map +1 -1
- package/{esm/utils/debounce-throttle.d.ts → lib/utils/debounce-throttle.d.cts} +0 -1
- package/lib/utils/deep-clone.cjs +1 -1
- package/lib/utils/deep-clone.cjs.map +1 -1
- package/lib/utils/{deep-clone.d.ts → deep-clone.d.cts} +0 -1
- package/lib/utils/index.cjs +1 -1
- package/lib/utils/{index.d.ts → index.d.cts} +4 -5
- package/lib/utils/selector.cjs +1 -1
- package/lib/utils/selector.cjs.map +1 -1
- package/lib/utils/{selector.d.ts → selector.d.cts} +0 -1
- package/package.json +14 -11
- package/es/core/async-action.d.ts.map +0 -1
- package/es/core/base-store.d.ts.map +0 -1
- package/es/core/batch-manager.d.ts.map +0 -1
- package/es/core/create-store.d.ts.map +0 -1
- package/es/core/event-bus.d.ts.map +0 -1
- package/es/core/index.d.ts.map +0 -1
- package/es/core/pub-sub.d.ts.map +0 -1
- package/es/engine/index.d.ts.map +0 -1
- package/es/engine/plugin.d.ts.map +0 -1
- package/es/engine/types.d.ts.map +0 -1
- package/es/errors/index.d.ts.map +0 -1
- package/es/index.d.ts.map +0 -1
- package/es/middleware/index.d.ts.map +0 -1
- package/es/middleware/logger.d.ts.map +0 -1
- package/es/middleware/middleware-manager.d.ts.map +0 -1
- package/es/middleware/persist.d.ts.map +0 -1
- package/es/middleware/time-travel.d.ts.map +0 -1
- package/es/middleware/validation.d.ts.map +0 -1
- package/es/plugins/define-plugin.d.ts.map +0 -1
- package/es/plugins/index.d.ts.map +0 -1
- package/es/plugins/plugin-manager.d.ts.map +0 -1
- package/es/types/index.d.ts.map +0 -1
- package/es/types/middleware.d.ts.map +0 -1
- package/es/types/plugin.d.ts.map +0 -1
- package/es/types/store.d.ts.map +0 -1
- package/es/types/subscription.d.ts.map +0 -1
- package/es/types/utility.d.ts.map +0 -1
- package/es/utils/debounce-throttle.d.ts.map +0 -1
- package/es/utils/deep-clone.d.ts.map +0 -1
- package/es/utils/index.d.ts.map +0 -1
- package/es/utils/selector.d.ts.map +0 -1
- package/esm/core/async-action.d.ts +0 -95
- package/esm/core/base-store.d.ts +0 -85
- package/esm/core/create-store.d.ts +0 -66
- package/esm/core/event-bus.d.ts +0 -34
- package/esm/core/pub-sub.d.ts +0 -41
- package/esm/engine/types.d.ts +0 -81
- package/esm/errors/index.d.ts +0 -208
- package/esm/index.d.ts +0 -27
- package/esm/middleware/index.d.ts +0 -13
- package/esm/middleware/logger.d.ts +0 -67
- package/esm/middleware/middleware-manager.d.ts +0 -40
- package/esm/plugins/plugin-manager.d.ts +0 -35
- package/esm/types/middleware.d.ts +0 -172
- package/esm/types/plugin.d.ts +0 -136
- package/esm/types/store.d.ts +0 -198
- package/esm/types/subscription.d.ts +0 -158
- package/esm/types/utility.d.ts +0 -312
- package/esm/utils/deep-clone.d.ts +0 -143
- package/esm/utils/index.d.ts +0 -13
- package/esm/utils/selector.d.ts +0 -213
- package/lib/core/async-action.d.ts +0 -95
- package/lib/core/base-store.d.ts +0 -85
- package/lib/core/batch-manager.d.ts +0 -46
- package/lib/core/index.d.ts +0 -14
- package/lib/engine/index.d.ts +0 -10
- package/lib/engine/plugin.d.ts +0 -20
- package/lib/middleware/persist.d.ts +0 -34
- package/lib/middleware/time-travel.d.ts +0 -30
- package/lib/middleware/validation.d.ts +0 -100
- package/lib/plugins/define-plugin.d.ts +0 -74
- package/lib/plugins/index.d.ts +0 -8
- package/lib/plugins/plugin-manager.d.ts +0 -35
- package/lib/types/index.d.ts +0 -12
- package/lib/utils/debounce-throttle.d.ts +0 -86
package/lib/core/base-store.cjs
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
* ***********************************
|
|
3
3
|
* @composy/store-core v0.0.1 *
|
|
4
4
|
* Built with rollup *
|
|
5
|
-
* Build time: 2024-
|
|
5
|
+
* Build time: 2024-10-12 17:23:58 *
|
|
6
6
|
* Build mode: production *
|
|
7
7
|
* Minified: No *
|
|
8
8
|
* ***********************************
|
|
@@ -10,8 +10,20 @@
|
|
|
10
10
|
"use strict";
|
|
11
11
|
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
12
12
|
const require_pub_sub = require("./pub-sub.cjs");
|
|
13
|
+
const require_middleware_manager = require("../middleware/middleware-manager.cjs");
|
|
14
|
+
const require_plugin_manager = require("../plugins/plugin-manager.cjs");
|
|
15
|
+
const require_deep_clone = require("../utils/deep-clone.cjs");
|
|
16
|
+
const require_batch_manager = require("./batch-manager.cjs");
|
|
13
17
|
const require_event_bus = require("./event-bus.cjs");
|
|
14
18
|
//#region src/core/base-store.ts
|
|
19
|
+
var __defProp = Object.defineProperty;
|
|
20
|
+
var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, {
|
|
21
|
+
enumerable: true,
|
|
22
|
+
configurable: true,
|
|
23
|
+
writable: true,
|
|
24
|
+
value
|
|
25
|
+
}) : obj[key] = value;
|
|
26
|
+
var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value);
|
|
15
27
|
function isPromiseLike(value) {
|
|
16
28
|
return !!value && typeof value.then === "function";
|
|
17
29
|
}
|
|
@@ -19,123 +31,208 @@ async function runCallbacks(callbacks, value) {
|
|
|
19
31
|
for (const callback of callbacks) await callback(value);
|
|
20
32
|
}
|
|
21
33
|
var BaseStore = class {
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
this
|
|
31
|
-
|
|
32
|
-
this
|
|
33
|
-
|
|
34
|
-
this
|
|
34
|
+
constructor(definition, options = {}) {
|
|
35
|
+
__publicField(this, "$id");
|
|
36
|
+
__publicField(this, "getters");
|
|
37
|
+
__publicField(this, "actions");
|
|
38
|
+
__publicField(this, "stateSubscribers", require_pub_sub.createPubSub());
|
|
39
|
+
__publicField(this, "actionSubscribers", require_pub_sub.createPubSub());
|
|
40
|
+
__publicField(this, "initialStateFactory");
|
|
41
|
+
__publicField(this, "middlewareManager");
|
|
42
|
+
__publicField(this, "pluginManager");
|
|
43
|
+
__publicField(this, "batchManager");
|
|
44
|
+
__publicField(this, "pendingBatchMutation", null);
|
|
45
|
+
__publicField(this, "stopBatchFlush");
|
|
46
|
+
__publicField(this, "mutationQueue", Promise.resolve());
|
|
47
|
+
__publicField(this, "pendingMutations", 0);
|
|
48
|
+
__publicField(this, "_state");
|
|
49
|
+
__publicField(this, "disposed", false);
|
|
35
50
|
this.$id = definition.id;
|
|
36
51
|
this.initialStateFactory = definition.state;
|
|
37
52
|
this._state = definition.state();
|
|
53
|
+
this.middlewareManager = options.middleware ?? require_middleware_manager.getGlobalMiddlewareManager();
|
|
54
|
+
this.pluginManager = options.plugins ?? require_plugin_manager.getGlobalPluginManager();
|
|
55
|
+
this.batchManager = options.batch ?? require_batch_manager.getGlobalBatchManager();
|
|
38
56
|
this.getters = this.createGetters(definition.getters || {});
|
|
39
57
|
this.actions = this.createActions(definition.actions || {});
|
|
58
|
+
this.stopBatchFlush = this.batchManager.onFlush?.((storeIds) => {
|
|
59
|
+
if (!storeIds.has(this.$id) || !this.pendingBatchMutation) return;
|
|
60
|
+
const mutation = this.pendingBatchMutation;
|
|
61
|
+
this.pendingBatchMutation = null;
|
|
62
|
+
this.publishStateChange(mutation);
|
|
63
|
+
});
|
|
40
64
|
require_event_bus.globalEventBus.emit("store:created", { storeId: this.$id });
|
|
65
|
+
this.notifyPluginStoreCreated();
|
|
41
66
|
}
|
|
42
|
-
/**
|
|
43
|
-
* 获取当前状态
|
|
44
|
-
*/
|
|
45
67
|
get $state() {
|
|
46
68
|
return this._state;
|
|
47
69
|
}
|
|
48
|
-
/**
|
|
49
|
-
* 设置状态
|
|
50
|
-
*/
|
|
51
70
|
set $state(newState) {
|
|
52
|
-
this.
|
|
71
|
+
this.checkDisposed();
|
|
72
|
+
const nextState = require_deep_clone.deepClone(newState);
|
|
73
|
+
const operation = () => this.runStateMutation(nextState, newState);
|
|
74
|
+
this.scheduleMutation(operation).catch((error) => {
|
|
75
|
+
console.error(`[Store] Failed to replace state for "${this.$id}":`, error);
|
|
76
|
+
});
|
|
53
77
|
}
|
|
54
|
-
/**
|
|
55
|
-
* 重置状态到初始值
|
|
56
|
-
*/
|
|
57
78
|
$reset() {
|
|
58
79
|
this.checkDisposed();
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
this.notifyStateChange({
|
|
62
|
-
type: "direct",
|
|
63
|
-
storeId: this.$id,
|
|
64
|
-
oldState
|
|
80
|
+
this.scheduleMutation(() => this.runStateMutation()).catch((error) => {
|
|
81
|
+
console.error(`[Store] Failed to reset "${this.$id}":`, error);
|
|
65
82
|
});
|
|
66
83
|
}
|
|
67
|
-
/**
|
|
68
|
-
* 批量更新状态
|
|
69
|
-
*/
|
|
70
84
|
$patch(partialState) {
|
|
71
85
|
this.checkDisposed();
|
|
72
|
-
const
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
Object.assign(this._state, partialState);
|
|
82
|
-
this.notifyStateChange({
|
|
83
|
-
type: "patch object",
|
|
84
|
-
storeId: this.$id,
|
|
85
|
-
oldState,
|
|
86
|
-
events: Object.keys(partialState)
|
|
87
|
-
});
|
|
88
|
-
}
|
|
86
|
+
const patch = typeof partialState === "function" ? partialState : require_deep_clone.deepClone(partialState);
|
|
87
|
+
this.scheduleMutation(() => this.runPatchMutation(patch)).catch((error) => {
|
|
88
|
+
console.error(`[Store] Failed to patch "${this.$id}":`, error);
|
|
89
|
+
});
|
|
90
|
+
}
|
|
91
|
+
async $patchAsync(partialState) {
|
|
92
|
+
this.checkDisposed();
|
|
93
|
+
const patch = typeof partialState === "function" ? partialState : require_deep_clone.deepClone(partialState);
|
|
94
|
+
await this.scheduleMutation(() => this.runPatchMutation(patch));
|
|
89
95
|
}
|
|
90
|
-
/**
|
|
91
|
-
* 订阅状态变化
|
|
92
|
-
*/
|
|
93
96
|
$subscribe(callback, options = {}) {
|
|
94
97
|
this.checkDisposed();
|
|
95
|
-
|
|
98
|
+
const unsubscribe = this.stateSubscribers.subscribe(({ mutation, state }) => callback(mutation, state), { immediate: options.immediate });
|
|
99
|
+
if (options.immediate) try {
|
|
100
|
+
callback({
|
|
101
|
+
type: "direct",
|
|
102
|
+
storeId: this.$id
|
|
103
|
+
}, require_deep_clone.deepClone(this._state));
|
|
104
|
+
} catch (error) {
|
|
105
|
+
console.error("[Store] immediate subscriber failed:", error);
|
|
106
|
+
}
|
|
107
|
+
return unsubscribe;
|
|
96
108
|
}
|
|
97
|
-
/**
|
|
98
|
-
* 订阅 Action 调用
|
|
99
|
-
*/
|
|
100
109
|
$onAction(callback) {
|
|
101
110
|
this.checkDisposed();
|
|
102
111
|
return this.actionSubscribers.subscribe(callback);
|
|
103
112
|
}
|
|
104
|
-
/**
|
|
105
|
-
* 销毁 Store
|
|
106
|
-
*/
|
|
107
113
|
$dispose() {
|
|
108
114
|
if (this.disposed) return;
|
|
109
115
|
this.disposed = true;
|
|
116
|
+
this.stopBatchFlush?.();
|
|
117
|
+
this.stopBatchFlush = void 0;
|
|
118
|
+
this.mutationQueue = Promise.resolve();
|
|
119
|
+
this.pendingMutations = 0;
|
|
110
120
|
this.stateSubscribers.clear();
|
|
111
121
|
this.actionSubscribers.clear();
|
|
122
|
+
this.notifyPluginStoreDisposed();
|
|
112
123
|
require_event_bus.globalEventBus.emit("store:disposed", { storeId: this.$id });
|
|
113
124
|
}
|
|
114
|
-
/**
|
|
115
|
-
* 通知状态变化
|
|
116
|
-
*/
|
|
117
125
|
notifyStateChange(mutation) {
|
|
126
|
+
this.publishStateChange(mutation);
|
|
127
|
+
}
|
|
128
|
+
publishStateChange(mutation) {
|
|
129
|
+
const stateSnapshot = require_deep_clone.deepClone(this._state);
|
|
118
130
|
this.stateSubscribers.publish({
|
|
119
131
|
mutation,
|
|
120
|
-
state:
|
|
132
|
+
state: stateSnapshot
|
|
121
133
|
});
|
|
122
134
|
require_event_bus.globalEventBus.emit("state:changed", {
|
|
123
135
|
storeId: this.$id,
|
|
124
|
-
state:
|
|
136
|
+
state: stateSnapshot,
|
|
125
137
|
mutation
|
|
126
138
|
});
|
|
127
139
|
}
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
140
|
+
async runMutation(candidate, mutation, payload, previousState) {
|
|
141
|
+
this.checkDisposed();
|
|
142
|
+
let committed = false;
|
|
143
|
+
const commit = () => {
|
|
144
|
+
if (committed || this.disposed) return;
|
|
145
|
+
committed = true;
|
|
146
|
+
this._state = candidate;
|
|
147
|
+
this.notifyPluginStateChange(candidate, previousState);
|
|
148
|
+
if (this.batchManager.isBatching() && this.batchManager.onFlush) {
|
|
149
|
+
this.pendingBatchMutation = this.pendingBatchMutation ? {
|
|
150
|
+
...mutation,
|
|
151
|
+
oldState: this.pendingBatchMutation.oldState
|
|
152
|
+
} : mutation;
|
|
153
|
+
this.batchManager.markDirty(this.$id);
|
|
154
|
+
} else this.publishStateChange(mutation);
|
|
155
|
+
};
|
|
156
|
+
if (this.middlewareManager.getAll().length === 0) {
|
|
157
|
+
commit();
|
|
158
|
+
return;
|
|
159
|
+
}
|
|
160
|
+
await this.middlewareManager.execute({
|
|
161
|
+
storeId: this.$id,
|
|
162
|
+
state: candidate,
|
|
163
|
+
type: mutation.type === "direct" ? "state:reset" : "state:patch",
|
|
164
|
+
payload,
|
|
165
|
+
meta: {
|
|
166
|
+
candidateState: candidate,
|
|
167
|
+
previousState,
|
|
168
|
+
commit
|
|
169
|
+
}
|
|
170
|
+
});
|
|
171
|
+
commit();
|
|
172
|
+
}
|
|
173
|
+
runStateMutation(nextState, payload) {
|
|
174
|
+
this.checkDisposed();
|
|
175
|
+
const previousState = require_deep_clone.deepClone(this._state);
|
|
176
|
+
const mutation = {
|
|
177
|
+
type: "direct",
|
|
178
|
+
storeId: this.$id,
|
|
179
|
+
oldState: previousState
|
|
180
|
+
};
|
|
181
|
+
return this.runMutation(require_deep_clone.deepClone(nextState ?? this.initialStateFactory()), mutation, payload, previousState);
|
|
182
|
+
}
|
|
183
|
+
runPatchMutation(partialState) {
|
|
184
|
+
this.checkDisposed();
|
|
185
|
+
const previousState = require_deep_clone.deepClone(this._state);
|
|
186
|
+
const candidate = require_deep_clone.deepClone(this._state);
|
|
187
|
+
const mutation = typeof partialState === "function" ? {
|
|
188
|
+
type: "patch function",
|
|
189
|
+
storeId: this.$id,
|
|
190
|
+
oldState: previousState
|
|
191
|
+
} : {
|
|
192
|
+
type: "patch object",
|
|
193
|
+
storeId: this.$id,
|
|
194
|
+
oldState: previousState,
|
|
195
|
+
events: Object.keys(partialState)
|
|
196
|
+
};
|
|
197
|
+
if (typeof partialState === "function") partialState(candidate);
|
|
198
|
+
else Object.assign(candidate, partialState);
|
|
199
|
+
return this.runMutation(candidate, mutation, partialState, previousState);
|
|
200
|
+
}
|
|
201
|
+
scheduleMutation(operation) {
|
|
202
|
+
if (this.pendingMutations === 0 && this.middlewareManager.getAll().length === 0) return operation();
|
|
203
|
+
this.pendingMutations += 1;
|
|
204
|
+
const queuedOperation = this.mutationQueue.then(operation);
|
|
205
|
+
this.mutationQueue = queuedOperation.catch(() => void 0);
|
|
206
|
+
queuedOperation.then(() => {
|
|
207
|
+
this.pendingMutations -= 1;
|
|
208
|
+
}, () => {
|
|
209
|
+
this.pendingMutations -= 1;
|
|
210
|
+
});
|
|
211
|
+
return queuedOperation;
|
|
212
|
+
}
|
|
213
|
+
notifyPluginStoreCreated() {
|
|
214
|
+
if (this.pluginManager.notifyStoreCreated) {
|
|
215
|
+
this.pluginManager.notifyStoreCreated(this);
|
|
216
|
+
return;
|
|
217
|
+
}
|
|
218
|
+
this.pluginManager.getAll().forEach((plugin) => plugin.onStoreCreated?.(this));
|
|
219
|
+
}
|
|
220
|
+
notifyPluginStoreDisposed() {
|
|
221
|
+
if (this.pluginManager.notifyStoreDisposed) {
|
|
222
|
+
this.pluginManager.notifyStoreDisposed(this);
|
|
223
|
+
return;
|
|
224
|
+
}
|
|
225
|
+
this.pluginManager.getAll().forEach((plugin) => plugin.onStoreDisposed?.(this));
|
|
226
|
+
}
|
|
227
|
+
notifyPluginStateChange(state, previousState) {
|
|
228
|
+
if (this.pluginManager.notifyStateChange) {
|
|
229
|
+
this.pluginManager.notifyStateChange(this.$id, require_deep_clone.deepClone(state), require_deep_clone.deepClone(previousState));
|
|
230
|
+
return;
|
|
231
|
+
}
|
|
232
|
+
this.pluginManager.getAll().forEach((plugin) => plugin.onStateChange?.(this.$id, require_deep_clone.deepClone(state), require_deep_clone.deepClone(previousState)));
|
|
133
233
|
}
|
|
134
|
-
/**
|
|
135
|
-
* 检查是否已销毁
|
|
136
|
-
*/
|
|
137
234
|
checkDisposed() {
|
|
138
|
-
if (this.disposed) throw new Error(`[Store] Store "${this.$id}"
|
|
235
|
+
if (this.disposed) throw new Error(`[Store] Store "${this.$id}" has been disposed`);
|
|
139
236
|
}
|
|
140
237
|
createGetters(gettersDefinition) {
|
|
141
238
|
const getterCache = {};
|
|
@@ -180,6 +277,9 @@ var BaseStore = class {
|
|
|
180
277
|
}
|
|
181
278
|
return actionCache;
|
|
182
279
|
}
|
|
280
|
+
notifyAction(context) {
|
|
281
|
+
this.actionSubscribers.publish(context);
|
|
282
|
+
}
|
|
183
283
|
};
|
|
184
284
|
//#endregion
|
|
185
285
|
exports.BaseStore = BaseStore;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"base-store.cjs","names":[],"sources":["../../src/core/base-store.ts"],"sourcesContent":["/**\n * 基础 Store 抽象类\n *\n * 提供框架无关的 Store 基础实现\n * @module core/base-store\n */\n\nimport type {\n ActionContext,\n ActionSubscriber,\n StateMutation,\n StateSubscriber,\n StateTree,\n StoreActions,\n StoreDefinition,\n StoreGetters,\n StoreId,\n StoreInstance,\n StoreOptions,\n SubscribeOptions,\n Unsubscribe,\n} from '../types'\nimport { globalEventBus } from './event-bus'\nimport { createPubSub } from './pub-sub'\n\ntype ActionCallback = (value: unknown) => void | Promise<void>\n\nfunction isPromiseLike(value: unknown): value is Promise<unknown> {\n return !!value && typeof (value as { then?: unknown }).then === 'function'\n}\n\nasync function runCallbacks(callbacks: ActionCallback[], value: unknown): Promise<void> {\n for (const callback of callbacks) {\n await callback(value)\n }\n}\n\n/**\n * 基础 Store 类\n *\n * @template Id - Store ID 类型\n * @template S - 状态类型\n * @template G - Getters 类型\n * @template A - Actions 类型\n */\nexport class BaseStore<\n Id extends StoreId = StoreId,\n S extends StateTree = StateTree,\n G extends StoreGetters<S> = StoreGetters<S>,\n A extends StoreActions = StoreActions,\n> implements StoreInstance<Id, S, G, A> {\n /** Store ID */\n readonly $id: Id\n\n /** Getter 计算结果 */\n readonly getters: { [K in keyof G]: ReturnType<G[K]> }\n\n /** Action 方法集合 */\n readonly actions: A\n\n /** 状态订阅管理器 */\n private stateSubscribers = createPubSub<{ mutation: StateMutation<S>, state: S }>()\n\n /** Action 订阅管理器 */\n private actionSubscribers = createPubSub<ActionContext<A>>()\n\n /** 初始状态工厂 */\n private initialStateFactory: () => S\n\n /** 当前状态 */\n private _state: S\n\n /** 是否已销毁 */\n private disposed = false\n\n /**\n * 构造函数\n *\n * @param definition - Store 定义\n * @param _options - Store 配置选项\n */\n constructor(\n definition: StoreDefinition<Id, S, G, A>,\n _options: StoreOptions = {},\n ) {\n this.$id = definition.id\n this.initialStateFactory = definition.state\n this._state = definition.state()\n this.getters = this.createGetters((definition.getters || {}) as G)\n this.actions = this.createActions((definition.actions || {}) as A)\n\n // 发送 Store 创建事件\n globalEventBus.emit('store:created', { storeId: this.$id })\n }\n\n /**\n * 获取当前状态\n */\n get $state(): S {\n return this._state\n }\n\n /**\n * 设置状态\n */\n set $state(newState: S) {\n this._state = newState\n }\n\n /**\n * 重置状态到初始值\n */\n $reset(): void {\n this.checkDisposed()\n const oldState = { ...this._state }\n this._state = this.initialStateFactory()\n\n this.notifyStateChange({\n type: 'direct',\n storeId: this.$id,\n oldState,\n })\n }\n\n /**\n * 批量更新状态\n */\n $patch(partialState: Partial<S> | ((state: S) => void)): void {\n this.checkDisposed()\n const oldState = { ...this._state }\n\n if (typeof partialState === 'function') {\n partialState(this._state)\n this.notifyStateChange({\n type: 'patch function',\n storeId: this.$id,\n oldState,\n })\n }\n else {\n Object.assign(this._state, partialState)\n this.notifyStateChange({\n type: 'patch object',\n storeId: this.$id,\n oldState,\n events: Object.keys(partialState),\n })\n }\n }\n\n /**\n * 订阅状态变化\n */\n $subscribe(\n callback: StateSubscriber<S>,\n options: SubscribeOptions = {},\n ): Unsubscribe {\n this.checkDisposed()\n\n return this.stateSubscribers.subscribe(\n ({ mutation, state }) => callback(mutation, state),\n { immediate: options.immediate },\n )\n }\n\n /**\n * 订阅 Action 调用\n */\n $onAction(callback: ActionSubscriber<A>): Unsubscribe {\n this.checkDisposed()\n\n return this.actionSubscribers.subscribe(callback)\n }\n\n /**\n * 销毁 Store\n */\n $dispose(): void {\n if (this.disposed) return\n\n this.disposed = true\n this.stateSubscribers.clear()\n this.actionSubscribers.clear()\n\n globalEventBus.emit('store:disposed', { storeId: this.$id })\n }\n\n /**\n * 通知状态变化\n */\n protected notifyStateChange(mutation: StateMutation<S>): void {\n this.stateSubscribers.publish({ mutation, state: this._state })\n globalEventBus.emit('state:changed', {\n storeId: this.$id,\n state: this._state,\n mutation,\n })\n }\n\n /**\n * 通知 Action 调用\n */\n protected notifyAction(context: ActionContext<A>): void {\n this.actionSubscribers.publish(context)\n }\n\n /**\n * 检查是否已销毁\n */\n private checkDisposed(): void {\n if (this.disposed) {\n throw new Error(`[Store] Store \"${this.$id}\" 已被销毁`)\n }\n }\n\n private createGetters(\n gettersDefinition: G,\n ): { [K in keyof G]: ReturnType<G[K]> } {\n const getterCache = {} as { [K in keyof G]: ReturnType<G[K]> }\n\n for (const key of Object.keys(gettersDefinition) as Array<keyof G>) {\n Object.defineProperty(getterCache, key, {\n enumerable: true,\n get: () => gettersDefinition[key](this._state),\n })\n }\n\n return getterCache\n }\n\n private createActions(actionsDefinition: A): A {\n const actionCache = {} as A\n\n for (const key of Object.keys(actionsDefinition) as Array<keyof A>) {\n const action = actionsDefinition[key]\n actionCache[key] = ((...args: unknown[]) => {\n this.checkDisposed()\n\n const afterCallbacks: ActionCallback[] = []\n const errorCallbacks: ActionCallback[] = []\n const context: ActionContext<A> = {\n after: callback => afterCallbacks.push(callback),\n args,\n name: key,\n onError: callback => errorCallbacks.push(callback),\n storeId: this.$id,\n }\n\n this.notifyAction(context)\n\n try {\n const result = action.apply(this, args)\n\n if (isPromiseLike(result)) {\n return result\n .then(async (resolvedResult) => {\n await runCallbacks(afterCallbacks, resolvedResult)\n return resolvedResult\n })\n .catch(async (error: unknown) => {\n await runCallbacks(errorCallbacks, error)\n throw error\n }) as ReturnType<A[typeof key]>\n }\n\n void runCallbacks(afterCallbacks, result)\n return result\n }\n catch (error) {\n void runCallbacks(errorCallbacks, error)\n throw error\n }\n }) as A[typeof key]\n }\n\n return actionCache\n }\n}\n\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"base-store.cjs","names":[],"sources":["../../src/core/base-store.ts"],"sourcesContent":["/** Framework-independent Store runtime. */\n\nimport type {\n ActionContext,\n ActionSubscriber,\n BatchManager,\n MiddlewareManager,\n PluginManager,\n StateMutation,\n StateSubscriber,\n StateTree,\n StoreActions,\n StoreDefinition,\n StoreGetters,\n StoreId,\n StoreInstance,\n StoreOptions,\n SubscribeOptions,\n Unsubscribe,\n} from '../types'\nimport { getGlobalMiddlewareManager } from '../middleware/middleware-manager'\nimport { getGlobalPluginManager } from '../plugins/plugin-manager'\nimport { deepClone } from '../utils'\nimport { getGlobalBatchManager } from './batch-manager'\nimport { globalEventBus } from './event-bus'\nimport { createPubSub } from './pub-sub'\n\ntype ActionCallback = (value: unknown) => void | Promise<void>\n\nfunction isPromiseLike(value: unknown): value is Promise<unknown> {\n return !!value && typeof (value as { then?: unknown }).then === 'function'\n}\n\nasync function runCallbacks(\n callbacks: ActionCallback[],\n value: unknown\n): Promise<void> {\n for (const callback of callbacks) {\n await callback(value)\n }\n}\n\n/**\n * Base Store implementation.\n *\n * State changes are built on a candidate state. Middleware can reject the\n * candidate before it is committed, while stores without middleware retain\n * synchronous patch semantics.\n */\nexport class BaseStore<\n Id extends StoreId = StoreId,\n S extends StateTree = StateTree,\n G extends StoreGetters<S> = StoreGetters<S>,\n A extends StoreActions = StoreActions,\n> implements StoreInstance<Id, S, G, A> {\n readonly $id: Id\n readonly getters: { [K in keyof G]: ReturnType<G[K]> }\n readonly actions: A\n\n private readonly stateSubscribers = createPubSub<{\n mutation: StateMutation<S>\n state: S\n }>()\n private readonly actionSubscribers = createPubSub<ActionContext<A>>()\n private readonly initialStateFactory: () => S\n private readonly middlewareManager: MiddlewareManager\n private readonly pluginManager: PluginManager\n private readonly batchManager: BatchManager\n private pendingBatchMutation: StateMutation<S> | null = null\n private stopBatchFlush: Unsubscribe | undefined\n private mutationQueue: Promise<void> = Promise.resolve()\n private pendingMutations = 0\n private _state: S\n private disposed = false\n\n constructor(\n definition: StoreDefinition<Id, S, G, A>,\n options: StoreOptions = {}\n ) {\n this.$id = definition.id\n this.initialStateFactory = definition.state\n this._state = definition.state()\n this.middlewareManager = options.middleware ?? getGlobalMiddlewareManager()\n this.pluginManager = options.plugins ?? getGlobalPluginManager()\n this.batchManager = options.batch ?? getGlobalBatchManager()\n this.getters = this.createGetters((definition.getters || {}) as G)\n this.actions = this.createActions((definition.actions || {}) as A)\n\n this.stopBatchFlush = this.batchManager.onFlush?.(storeIds => {\n if (!storeIds.has(this.$id) || !this.pendingBatchMutation) {\n return\n }\n\n const mutation = this.pendingBatchMutation\n this.pendingBatchMutation = null\n this.publishStateChange(mutation)\n })\n\n globalEventBus.emit('store:created', { storeId: this.$id })\n this.notifyPluginStoreCreated()\n }\n\n get $state(): S {\n return this._state\n }\n\n set $state(newState: S) {\n this.checkDisposed()\n const nextState = deepClone(newState)\n const operation = () => this.runStateMutation(nextState, newState)\n void this.scheduleMutation(operation).catch((error: unknown) => {\n console.error(`[Store] Failed to replace state for \"${this.$id}\":`, error)\n })\n }\n\n $reset(): void {\n this.checkDisposed()\n void this.scheduleMutation(() => this.runStateMutation()).catch(\n (error: unknown) => {\n console.error(`[Store] Failed to reset \"${this.$id}\":`, error)\n }\n )\n }\n\n $patch(partialState: Partial<S> | ((state: S) => void)): void {\n this.checkDisposed()\n const patch =\n typeof partialState === 'function'\n ? partialState\n : deepClone(partialState)\n void this.scheduleMutation(() => this.runPatchMutation(patch)).catch(\n (error: unknown) => {\n console.error(`[Store] Failed to patch \"${this.$id}\":`, error)\n }\n )\n }\n\n async $patchAsync(\n partialState: Partial<S> | ((state: S) => void)\n ): Promise<void> {\n this.checkDisposed()\n const patch =\n typeof partialState === 'function'\n ? partialState\n : deepClone(partialState)\n await this.scheduleMutation(() => this.runPatchMutation(patch))\n }\n\n $subscribe(\n callback: StateSubscriber<S>,\n options: SubscribeOptions = {}\n ): Unsubscribe {\n this.checkDisposed()\n const unsubscribe = this.stateSubscribers.subscribe(\n ({ mutation, state }) => callback(mutation, state),\n { immediate: options.immediate }\n )\n\n if (options.immediate) {\n try {\n callback({ type: 'direct', storeId: this.$id }, deepClone(this._state))\n } catch (error) {\n console.error('[Store] immediate subscriber failed:', error)\n }\n }\n\n return unsubscribe\n }\n\n $onAction(callback: ActionSubscriber<A>): Unsubscribe {\n this.checkDisposed()\n return this.actionSubscribers.subscribe(callback)\n }\n\n $dispose(): void {\n if (this.disposed) return\n\n this.disposed = true\n this.stopBatchFlush?.()\n this.stopBatchFlush = undefined\n this.mutationQueue = Promise.resolve()\n this.pendingMutations = 0\n this.stateSubscribers.clear()\n this.actionSubscribers.clear()\n this.notifyPluginStoreDisposed()\n globalEventBus.emit('store:disposed', { storeId: this.$id })\n }\n\n protected notifyStateChange(mutation: StateMutation<S>): void {\n this.publishStateChange(mutation)\n }\n\n private publishStateChange(mutation: StateMutation<S>): void {\n const stateSnapshot = deepClone(this._state)\n this.stateSubscribers.publish({ mutation, state: stateSnapshot })\n globalEventBus.emit('state:changed', {\n storeId: this.$id,\n state: stateSnapshot,\n mutation,\n })\n }\n\n private async runMutation(\n candidate: S,\n mutation: StateMutation<S>,\n payload: unknown,\n previousState: S\n ): Promise<void> {\n this.checkDisposed()\n let committed = false\n const commit = (): void => {\n if (committed || this.disposed) return\n\n committed = true\n this._state = candidate\n this.notifyPluginStateChange(candidate, previousState)\n\n if (this.batchManager.isBatching() && this.batchManager.onFlush) {\n this.pendingBatchMutation = this.pendingBatchMutation\n ? { ...mutation, oldState: this.pendingBatchMutation.oldState }\n : mutation\n this.batchManager.markDirty(this.$id)\n } else {\n this.publishStateChange(mutation)\n }\n }\n\n const middlewares = this.middlewareManager.getAll()\n if (middlewares.length === 0) {\n commit()\n return\n }\n\n await this.middlewareManager.execute({\n storeId: this.$id,\n state: candidate,\n type: mutation.type === 'direct' ? 'state:reset' : 'state:patch',\n payload,\n meta: {\n candidateState: candidate,\n previousState,\n commit,\n },\n })\n commit()\n }\n\n private runStateMutation(nextState?: S, payload?: unknown): Promise<void> {\n this.checkDisposed()\n const previousState = deepClone(this._state)\n const mutation: StateMutation<S> = {\n type: 'direct',\n storeId: this.$id,\n oldState: previousState,\n }\n return this.runMutation(\n deepClone(nextState ?? this.initialStateFactory()),\n mutation,\n payload,\n previousState\n )\n }\n\n private runPatchMutation(\n partialState: Partial<S> | ((state: S) => void)\n ): Promise<void> {\n this.checkDisposed()\n const previousState = deepClone(this._state)\n const candidate = deepClone(this._state)\n const mutation: StateMutation<S> =\n typeof partialState === 'function'\n ? { type: 'patch function', storeId: this.$id, oldState: previousState }\n : {\n type: 'patch object',\n storeId: this.$id,\n oldState: previousState,\n events: Object.keys(partialState),\n }\n\n if (typeof partialState === 'function') {\n partialState(candidate)\n } else {\n Object.assign(candidate, partialState)\n }\n\n return this.runMutation(candidate, mutation, partialState, previousState)\n }\n\n private scheduleMutation(operation: () => Promise<void>): Promise<void> {\n if (\n this.pendingMutations === 0 &&\n this.middlewareManager.getAll().length === 0\n ) {\n return operation()\n }\n\n this.pendingMutations += 1\n const queuedOperation = this.mutationQueue.then(operation)\n this.mutationQueue = queuedOperation.catch(() => undefined)\n void queuedOperation.then(\n () => {\n this.pendingMutations -= 1\n },\n () => {\n this.pendingMutations -= 1\n }\n )\n return queuedOperation\n }\n\n private notifyPluginStoreCreated(): void {\n if (this.pluginManager.notifyStoreCreated) {\n this.pluginManager.notifyStoreCreated(this)\n return\n }\n this.pluginManager.getAll().forEach(plugin => plugin.onStoreCreated?.(this))\n }\n\n private notifyPluginStoreDisposed(): void {\n if (this.pluginManager.notifyStoreDisposed) {\n this.pluginManager.notifyStoreDisposed(this)\n return\n }\n this.pluginManager\n .getAll()\n .forEach(plugin => plugin.onStoreDisposed?.(this))\n }\n\n private notifyPluginStateChange(state: S, previousState: S): void {\n if (this.pluginManager.notifyStateChange) {\n this.pluginManager.notifyStateChange(\n this.$id,\n deepClone(state),\n deepClone(previousState)\n )\n return\n }\n this.pluginManager\n .getAll()\n .forEach(plugin =>\n plugin.onStateChange?.(\n this.$id,\n deepClone(state),\n deepClone(previousState)\n )\n )\n }\n\n private checkDisposed(): void {\n if (this.disposed) {\n throw new Error(`[Store] Store \"${this.$id}\" has been disposed`)\n }\n }\n\n private createGetters(gettersDefinition: G): {\n [K in keyof G]: ReturnType<G[K]>\n } {\n const getterCache = {} as { [K in keyof G]: ReturnType<G[K]> }\n\n for (const key of Object.keys(gettersDefinition) as Array<keyof G>) {\n Object.defineProperty(getterCache, key, {\n enumerable: true,\n get: () => gettersDefinition[key](this._state),\n })\n }\n\n return getterCache\n }\n\n private createActions(actionsDefinition: A): A {\n const actionCache = {} as A\n\n for (const key of Object.keys(actionsDefinition) as Array<keyof A>) {\n const action = actionsDefinition[key]\n actionCache[key] = ((...args: unknown[]) => {\n this.checkDisposed()\n\n const afterCallbacks: ActionCallback[] = []\n const errorCallbacks: ActionCallback[] = []\n const context: ActionContext<A> = {\n after: callback => afterCallbacks.push(callback),\n args,\n name: key,\n onError: callback => errorCallbacks.push(callback),\n storeId: this.$id,\n }\n\n this.notifyAction(context)\n\n try {\n const result = action.apply(this, args)\n if (isPromiseLike(result)) {\n return result\n .then(async resolvedResult => {\n await runCallbacks(afterCallbacks, resolvedResult)\n return resolvedResult\n })\n .catch(async (error: unknown) => {\n await runCallbacks(errorCallbacks, error)\n throw error\n }) as ReturnType<A[typeof key]>\n }\n\n void runCallbacks(afterCallbacks, result)\n return result\n } catch (error) {\n void runCallbacks(errorCallbacks, error)\n throw error\n }\n }) as A[typeof key]\n }\n\n return actionCache\n }\n\n private notifyAction(context: ActionContext<A>): void {\n this.actionSubscribers.publish(context)\n }\n}\n"],"mappings":"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"}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
/** Framework-independent Store runtime. */
|
|
2
|
+
import type { ActionSubscriber, StateMutation, StateSubscriber, StateTree, StoreActions, StoreDefinition, StoreGetters, StoreId, StoreInstance, StoreOptions, SubscribeOptions, Unsubscribe } from '../types';
|
|
3
|
+
/**
|
|
4
|
+
* Base Store implementation.
|
|
5
|
+
*
|
|
6
|
+
* State changes are built on a candidate state. Middleware can reject the
|
|
7
|
+
* candidate before it is committed, while stores without middleware retain
|
|
8
|
+
* synchronous patch semantics.
|
|
9
|
+
*/
|
|
10
|
+
export declare class BaseStore<Id extends StoreId = StoreId, S extends StateTree = StateTree, G extends StoreGetters<S> = StoreGetters<S>, A extends StoreActions = StoreActions> implements StoreInstance<Id, S, G, A> {
|
|
11
|
+
readonly $id: Id;
|
|
12
|
+
readonly getters: {
|
|
13
|
+
[K in keyof G]: ReturnType<G[K]>;
|
|
14
|
+
};
|
|
15
|
+
readonly actions: A;
|
|
16
|
+
private readonly stateSubscribers;
|
|
17
|
+
private readonly actionSubscribers;
|
|
18
|
+
private readonly initialStateFactory;
|
|
19
|
+
private readonly middlewareManager;
|
|
20
|
+
private readonly pluginManager;
|
|
21
|
+
private readonly batchManager;
|
|
22
|
+
private pendingBatchMutation;
|
|
23
|
+
private stopBatchFlush;
|
|
24
|
+
private mutationQueue;
|
|
25
|
+
private pendingMutations;
|
|
26
|
+
private _state;
|
|
27
|
+
private disposed;
|
|
28
|
+
constructor(definition: StoreDefinition<Id, S, G, A>, options?: StoreOptions);
|
|
29
|
+
get $state(): S;
|
|
30
|
+
set $state(newState: S);
|
|
31
|
+
$reset(): void;
|
|
32
|
+
$patch(partialState: Partial<S> | ((state: S) => void)): void;
|
|
33
|
+
$patchAsync(partialState: Partial<S> | ((state: S) => void)): Promise<void>;
|
|
34
|
+
$subscribe(callback: StateSubscriber<S>, options?: SubscribeOptions): Unsubscribe;
|
|
35
|
+
$onAction(callback: ActionSubscriber<A>): Unsubscribe;
|
|
36
|
+
$dispose(): void;
|
|
37
|
+
protected notifyStateChange(mutation: StateMutation<S>): void;
|
|
38
|
+
private publishStateChange;
|
|
39
|
+
private runMutation;
|
|
40
|
+
private runStateMutation;
|
|
41
|
+
private runPatchMutation;
|
|
42
|
+
private scheduleMutation;
|
|
43
|
+
private notifyPluginStoreCreated;
|
|
44
|
+
private notifyPluginStoreDisposed;
|
|
45
|
+
private notifyPluginStateChange;
|
|
46
|
+
private checkDisposed;
|
|
47
|
+
private createGetters;
|
|
48
|
+
private createActions;
|
|
49
|
+
private notifyAction;
|
|
50
|
+
}
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
* ***********************************
|
|
3
3
|
* @composy/store-core v0.0.1 *
|
|
4
4
|
* Built with rollup *
|
|
5
|
-
* Build time: 2024-
|
|
5
|
+
* Build time: 2024-10-12 17:23:58 *
|
|
6
6
|
* Build mode: production *
|
|
7
7
|
* Minified: No *
|
|
8
8
|
* ***********************************
|
|
@@ -12,12 +12,20 @@ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
|
12
12
|
//#region src/core/batch-manager.ts
|
|
13
13
|
function createBatchManager(onFlush) {
|
|
14
14
|
let batchDepth = 0;
|
|
15
|
+
const flushListeners = /* @__PURE__ */ new Set();
|
|
15
16
|
const pendingStores = /* @__PURE__ */ new Set();
|
|
16
17
|
const flush = () => {
|
|
17
18
|
if (pendingStores.size > 0) {
|
|
18
19
|
const stores = new Set(pendingStores);
|
|
19
20
|
pendingStores.clear();
|
|
20
21
|
onFlush?.(stores);
|
|
22
|
+
flushListeners.forEach((listener) => {
|
|
23
|
+
try {
|
|
24
|
+
listener(stores);
|
|
25
|
+
} catch (error) {
|
|
26
|
+
console.error("[Batch] flush listener failed:", error);
|
|
27
|
+
}
|
|
28
|
+
});
|
|
21
29
|
}
|
|
22
30
|
};
|
|
23
31
|
const start = () => {
|
|
@@ -41,12 +49,17 @@ function createBatchManager(onFlush) {
|
|
|
41
49
|
}
|
|
42
50
|
};
|
|
43
51
|
const isBatching = () => batchDepth > 0;
|
|
52
|
+
const onFlushListener = (listener) => {
|
|
53
|
+
flushListeners.add(listener);
|
|
54
|
+
return () => flushListeners.delete(listener);
|
|
55
|
+
};
|
|
44
56
|
return {
|
|
45
57
|
start,
|
|
46
58
|
end,
|
|
47
59
|
markDirty,
|
|
48
60
|
batch: batch2,
|
|
49
|
-
isBatching
|
|
61
|
+
isBatching,
|
|
62
|
+
onFlush: onFlushListener
|
|
50
63
|
};
|
|
51
64
|
}
|
|
52
65
|
let globalBatchManager = null;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"batch-manager.cjs","names":["batch"],"sources":["../../src/core/batch-manager.ts"],"sourcesContent":["/**\n * 批量更新管理器\n *\n * 用于优化多个状态更新的性能\n * @module core/batch-manager\n */\n\nimport type { BatchManager, StoreId } from '../types'\n\n/**\n * 创建批量更新管理器\n *\n * @param onFlush - 刷新回调,接收所有待更新的 Store ID\n * @returns 批量更新管理器实例\n *\n * @example\n * ```typescript\n * const batchManager = createBatchManager((storeIds) => {\n * storeIds.forEach(id => {\n * // 通知订阅者更新\n * notifySubscribers(id)\n * })\n * })\n *\n * // 批量更新\n * batchManager.batch(() => {\n * store1.count++\n * store2.name = 'new name'\n * })\n * ```\n */\nexport function createBatchManager(\n onFlush?: (storeIds: Set<StoreId>) => void
|
|
1
|
+
{"version":3,"file":"batch-manager.cjs","names":["batch"],"sources":["../../src/core/batch-manager.ts"],"sourcesContent":["/**\r\n * 批量更新管理器\r\n *\r\n * 用于优化多个状态更新的性能\r\n * @module core/batch-manager\r\n */\r\n\r\nimport type { BatchManager, StoreId, Unsubscribe } from '../types'\r\n\r\n/**\r\n * 创建批量更新管理器\r\n *\r\n * @param onFlush - 刷新回调,接收所有待更新的 Store ID\r\n * @returns 批量更新管理器实例\r\n *\r\n * @example\r\n * ```typescript\r\n * const batchManager = createBatchManager((storeIds) => {\r\n * storeIds.forEach(id => {\r\n * // 通知订阅者更新\r\n * notifySubscribers(id)\r\n * })\r\n * })\r\n *\r\n * // 批量更新\r\n * batchManager.batch(() => {\r\n * store1.count++\r\n * store2.name = 'new name'\r\n * })\r\n * ```\r\n */\r\nexport function createBatchManager(\r\n onFlush?: (storeIds: Set<StoreId>) => void\r\n): BatchManager {\r\n /** 批处理嵌套深度,0 表示不在批处理上下文。 */\r\n let batchDepth = 0\r\n\r\n /** 批处理完成监听器,允许 Store Runtime 延迟一次通知 */\r\n const flushListeners = new Set<(storeIds: Set<StoreId>) => void>()\r\n\r\n /** 待更新的 Store ID 集合 */\r\n const pendingStores = new Set<StoreId>()\r\n\r\n /**\r\n * 刷新待更新的 Store\r\n */\r\n const flush = (): void => {\r\n if (pendingStores.size > 0) {\r\n const stores = new Set(pendingStores)\r\n pendingStores.clear()\r\n onFlush?.(stores)\r\n flushListeners.forEach(listener => {\r\n try {\r\n listener(stores)\r\n } catch (error) {\r\n console.error('[Batch] flush listener failed:', error)\r\n }\r\n })\r\n }\r\n }\r\n\r\n /**\r\n * 开始批量更新\r\n */\r\n const start = (): void => {\r\n batchDepth++\r\n }\r\n\r\n /**\r\n * 结束批量更新\r\n */\r\n const end = (): void => {\r\n if (batchDepth === 0) {\r\n return\r\n }\r\n\r\n batchDepth--\r\n if (batchDepth === 0) {\r\n flush()\r\n }\r\n }\r\n\r\n /**\r\n * 标记 Store 需要更新\r\n */\r\n const markDirty = (storeId: StoreId): void => {\r\n pendingStores.add(storeId)\r\n\r\n // 如果不在批量更新中,立即刷新\r\n if (batchDepth === 0) {\r\n flush()\r\n }\r\n }\r\n\r\n /**\r\n * 在批量上下文中执行\r\n */\r\n const batch = <T>(fn: () => T): T => {\r\n start()\r\n try {\r\n return fn()\r\n } finally {\r\n end()\r\n }\r\n }\r\n\r\n /**\r\n * 是否正在批量更新\r\n */\r\n const isBatching = (): boolean => batchDepth > 0\r\n\r\n const onFlushListener = (\r\n listener: (storeIds: Set<StoreId>) => void\r\n ): Unsubscribe => {\r\n flushListeners.add(listener)\r\n return () => flushListeners.delete(listener)\r\n }\r\n\r\n return {\r\n start,\r\n end,\r\n markDirty,\r\n batch,\r\n isBatching,\r\n onFlush: onFlushListener,\r\n }\r\n}\r\n\r\n/**\r\n * 全局批量更新管理器\r\n */\r\nlet globalBatchManager: BatchManager | null = null\r\n\r\n/**\r\n * 获取全局批量更新管理器\r\n */\r\nexport function getGlobalBatchManager(): BatchManager {\r\n if (!globalBatchManager) {\r\n globalBatchManager = createBatchManager()\r\n }\r\n return globalBatchManager\r\n}\r\n\r\n/**\r\n * 设置全局批量更新管理器\r\n */\r\nexport function setGlobalBatchManager(manager: BatchManager): void {\r\n globalBatchManager = manager\r\n}\r\n\r\n/**\r\n * 批量更新辅助函数\r\n *\r\n * @param fn - 执行函数\r\n * @returns 执行结果\r\n */\r\nexport function batch<T>(fn: () => T): T {\r\n return getGlobalBatchManager().batch(fn)\r\n}\r\n"],"mappings":";;;;;;;;;;;;AA+BO,SAAS,mBACd,SACc;CAEd,IAAI,aAAa;CAGjB,MAAM,iCAAiB,IAAI,IAAsC;CAGjE,MAAM,gCAAgB,IAAI,IAAa;CAKvC,MAAM,cAAoB;EACxB,IAAI,cAAc,OAAO,GAAG;GAC1B,MAAM,SAAS,IAAI,IAAI,aAAa;GACpC,cAAc,MAAM;GACpB,UAAU,MAAM;GAChB,eAAe,SAAQ,aAAY;IACjC,IAAI;KACF,SAAS,MAAM;IACjB,SAAS,OAAO;KACd,QAAQ,MAAM,kCAAkC,KAAK;IACvD;GACF,CAAC;EACH;CACF;CAKA,MAAM,cAAoB;EACxB;CACF;CAKA,MAAM,YAAkB;EACtB,IAAI,eAAe,GACjB;EAGF;EACA,IAAI,eAAe,GACjB,MAAM;CAEV;CAKA,MAAM,aAAa,YAA2B;EAC5C,cAAc,IAAI,OAAO;EAGzB,IAAI,eAAe,GACjB,MAAM;CAEV;CAKA,MAAMA,UAAY,OAAmB;EACnC,MAAM;EACN,IAAI;GACF,OAAO,GAAG;EACZ,UAAE;GACA,IAAI;EACN;CACF;CAKA,MAAM,mBAA4B,aAAa;CAE/C,MAAM,mBACJ,aACgB;EAChB,eAAe,IAAI,QAAQ;EAC3B,aAAa,eAAe,OAAO,QAAQ;CAC7C;CAEA,OAAO;EACL;EACA;EACA;EACA,OAAAA;EACA;EACA,SAAS;CACX;AACF;AAKA,IAAI,qBAA0C;AAKvC,SAAS,wBAAsC;CACpD,IAAI,CAAC,oBACH,qBAAqB,mBAAmB;CAE1C,OAAO;AACT;AAKO,SAAS,sBAAsB,SAA6B;CACjE,qBAAqB;AACvB;AAQO,SAAS,MAAS,IAAgB;CACvC,OAAO,sBAAsB,CAAA,CAAE,MAAM,EAAE;AACzC"}
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
* ***********************************
|
|
3
3
|
* @composy/store-core v0.0.1 *
|
|
4
4
|
* Built with rollup *
|
|
5
|
-
* Build time: 2024-
|
|
5
|
+
* Build time: 2024-10-12 17:23:58 *
|
|
6
6
|
* Build mode: production *
|
|
7
7
|
* Minified: No *
|
|
8
8
|
* ***********************************
|
|
@@ -11,11 +11,11 @@
|
|
|
11
11
|
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
12
12
|
const require_base_store = require("./base-store.cjs");
|
|
13
13
|
//#region src/core/create-store.ts
|
|
14
|
-
function createStore(definition) {
|
|
14
|
+
function createStore(definition, options = {}) {
|
|
15
15
|
let instance = null;
|
|
16
16
|
return () => {
|
|
17
17
|
if (instance) return instance;
|
|
18
|
-
const store = new require_base_store.BaseStore(definition);
|
|
18
|
+
const store = new require_base_store.BaseStore(definition, options);
|
|
19
19
|
const originalDispose = store.$dispose.bind(store);
|
|
20
20
|
store.$dispose = () => {
|
|
21
21
|
originalDispose();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"create-store.cjs","names":[],"sources":["../../src/core/create-store.ts"],"sourcesContent":["/**\n * @module store/core/create-store\n *\n * Store 工厂函数,用于创建单例 Store 的惰性初始化函数。\n * 基于 BaseStore 实现,返回的工厂函数在首次调用时创建 Store 实例,\n * 后续调用返回同一实例,直到调用 $dispose() 后重置。\n */\n\nimport type {\n ActionSubscriber,\n StateMutation,\n StateSubscriber,\n StateTree,\n StoreId,\n Unsubscribe,\n} from '../types'\nimport { BaseStore } from './base-store'\n\n/**\n * Store 定义描述接口\n *\n * @typeParam Id - Store 唯一标识符类型\n * @typeParam S - 状态树类型\n * @typeParam G - 计算属性定义类型\n * @typeParam A - Action 定义类型\n */\nexport interface CreateStoreDefinition<\n Id extends StoreId,\n S extends StateTree,\n G extends Record<string, (state: S) => unknown>,\n A extends Record
|
|
1
|
+
{"version":3,"file":"create-store.cjs","names":[],"sources":["../../src/core/create-store.ts"],"sourcesContent":["/**\r\n * @module store/core/create-store\r\n *\r\n * Store 工厂函数,用于创建单例 Store 的惰性初始化函数。\r\n * 基于 BaseStore 实现,返回的工厂函数在首次调用时创建 Store 实例,\r\n * 后续调用返回同一实例,直到调用 $dispose() 后重置。\r\n */\r\n\r\nimport type {\r\n ActionSubscriber,\r\n StateMutation,\r\n StateSubscriber,\r\n StateTree,\r\n StoreId,\r\n StoreOptions,\r\n Unsubscribe,\r\n} from '../types'\r\nimport { BaseStore } from './base-store'\r\n\r\n/**\r\n * Store 定义描述接口\r\n *\r\n * @typeParam Id - Store 唯一标识符类型\r\n * @typeParam S - 状态树类型\r\n * @typeParam G - 计算属性定义类型\r\n * @typeParam A - Action 定义类型\r\n */\r\nexport interface CreateStoreDefinition<\r\n Id extends StoreId,\r\n S extends StateTree,\r\n G extends Record<string, (state: S) => unknown>,\r\n A extends Record<\r\n string,\r\n (this: StoreAPI<Id, S, G, A>, ...args: unknown[]) => unknown\r\n >,\r\n> {\r\n id: Id\r\n state: () => S\r\n getters?: G\r\n actions?: A\r\n}\r\n\r\n/**\r\n * Store 实例的公共 API 接口\r\n *\r\n * 提供状态读取、订阅、补丁、重置、Action 监听和生命周期管理等能力。\r\n *\r\n * @typeParam Id - Store 唯一标识符类型\r\n * @typeParam S - 状态树类型\r\n * @typeParam G - 计算属性定义类型\r\n * @typeParam A - Action 定义类型\r\n */\r\nexport interface StoreAPI<\r\n Id extends StoreId = StoreId,\r\n S extends StateTree = StateTree,\r\n G extends Record<string, (state: S) => unknown> = Record<string, never>,\r\n A extends Record<string, (...args: unknown[]) => unknown> = Record<\r\n string,\r\n never\r\n >,\r\n> {\r\n readonly $id: Id\r\n readonly $state: S\r\n $reset: () => void\r\n $patch: (partial: Partial<S> | ((state: S) => void)) => void\r\n $patchAsync: (partial: Partial<S> | ((state: S) => void)) => Promise<void>\r\n $subscribe: (\r\n callback: StateSubscriber<S>,\r\n options?: { immediate?: boolean }\r\n ) => Unsubscribe\r\n $onAction: (callback: ActionSubscriber<A>) => Unsubscribe\r\n $dispose: () => void\r\n readonly getters: { [K in keyof G]: ReturnType<G[K]> }\r\n readonly actions: { [K in keyof A]: A[K] }\r\n}\r\n\r\n/**\r\n * 创建 Store 的工厂函数\r\n *\r\n * 返回一个惰性初始化的工厂函数。首次调用时基于定义创建 Store 实例,\r\n * 后续调用返回缓存的单例,直到 $dispose() 被调用后重置。\r\n *\r\n * @typeParam Id - Store 唯一标识符类型\r\n * @typeParam S - 状态树类型\r\n * @typeParam G - 计算属性定义类型\r\n * @typeParam A - Action 定义类型\r\n * @param definition - Store 定义,包含 id、state 工厂、getters 和 actions\r\n * @returns 惰性初始化的 Store 工厂函数,调用后返回 StoreAPI 实例\r\n */\r\nexport function createStore<\r\n Id extends StoreId,\r\n S extends StateTree,\r\n G extends Record<string, (state: S) => unknown> = Record<string, never>,\r\n A extends Record<\r\n string,\r\n (this: StoreAPI<Id, S, G, A>, ...args: unknown[]) => unknown\r\n > = Record<string, never>,\r\n>(\r\n definition: CreateStoreDefinition<Id, S, G, A>,\r\n options: StoreOptions = {}\r\n): () => StoreAPI<Id, S, G, A> {\r\n let instance: StoreAPI<Id, S, G, A> | null = null\r\n\r\n return (): StoreAPI<Id, S, G, A> => {\r\n if (instance) {\r\n return instance\r\n }\r\n\r\n const store = new BaseStore<Id, S, G, A>(definition, options)\r\n const originalDispose = store.$dispose.bind(store)\r\n store.$dispose = (): void => {\r\n originalDispose()\r\n instance = null\r\n }\r\n\r\n instance = store as unknown as StoreAPI<Id, S, G, A>\r\n\r\n return store\r\n }\r\n}\r\n\r\n/** 状态变更类型,支持部分更新或通过函数直接修改状态 */\r\nexport type { StateMutation }\r\n"],"mappings":";;;;;;;;;;;;;AAyFO,SAAS,YASd,YACA,UAAwB,CAAC,GACI;CAC7B,IAAI,WAAyC;CAE7C,aAAoC;EAClC,IAAI,UACF,OAAO;EAGT,MAAM,QAAQ,IAAI,mBAAA,UAAuB,YAAY,OAAO;EAC5D,MAAM,kBAAkB,MAAM,SAAS,KAAK,KAAK;EACjD,MAAM,iBAAuB;GAC3B,gBAAgB;GAChB,WAAW;EACb;EAEA,WAAW;EAEX,OAAO;CACT;AACF"}
|
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
* 基于 BaseStore 实现,返回的工厂函数在首次调用时创建 Store 实例,
|
|
6
6
|
* 后续调用返回同一实例,直到调用 $dispose() 后重置。
|
|
7
7
|
*/
|
|
8
|
-
import type { ActionSubscriber, StateMutation, StateSubscriber, StateTree, StoreId, Unsubscribe } from '../types';
|
|
8
|
+
import type { ActionSubscriber, StateMutation, StateSubscriber, StateTree, StoreId, StoreOptions, Unsubscribe } from '../types';
|
|
9
9
|
/**
|
|
10
10
|
* Store 定义描述接口
|
|
11
11
|
*
|
|
@@ -35,6 +35,7 @@ export interface StoreAPI<Id extends StoreId = StoreId, S extends StateTree = St
|
|
|
35
35
|
readonly $state: S;
|
|
36
36
|
$reset: () => void;
|
|
37
37
|
$patch: (partial: Partial<S> | ((state: S) => void)) => void;
|
|
38
|
+
$patchAsync: (partial: Partial<S> | ((state: S) => void)) => Promise<void>;
|
|
38
39
|
$subscribe: (callback: StateSubscriber<S>, options?: {
|
|
39
40
|
immediate?: boolean;
|
|
40
41
|
}) => Unsubscribe;
|
|
@@ -60,7 +61,6 @@ export interface StoreAPI<Id extends StoreId = StoreId, S extends StateTree = St
|
|
|
60
61
|
* @param definition - Store 定义,包含 id、state 工厂、getters 和 actions
|
|
61
62
|
* @returns 惰性初始化的 Store 工厂函数,调用后返回 StoreAPI 实例
|
|
62
63
|
*/
|
|
63
|
-
export declare function createStore<Id extends StoreId, S extends StateTree, G extends Record<string, (state: S) => unknown> = Record<string, never>, A extends Record<string, (this: StoreAPI<Id, S, G, A>, ...args: unknown[]) => unknown> = Record<string, never>>(definition: CreateStoreDefinition<Id, S, G, A
|
|
64
|
+
export declare function createStore<Id extends StoreId, S extends StateTree, G extends Record<string, (state: S) => unknown> = Record<string, never>, A extends Record<string, (this: StoreAPI<Id, S, G, A>, ...args: unknown[]) => unknown> = Record<string, never>>(definition: CreateStoreDefinition<Id, S, G, A>, options?: StoreOptions): () => StoreAPI<Id, S, G, A>;
|
|
64
65
|
/** 状态变更类型,支持部分更新或通过函数直接修改状态 */
|
|
65
66
|
export type { StateMutation };
|
|
66
|
-
//# sourceMappingURL=create-store.d.ts.map
|
package/lib/core/event-bus.cjs
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"event-bus.cjs","names":[],"sources":["../../src/core/event-bus.ts"],"sourcesContent":["/**\n * 事件总线实现\n *\n * 提供事件的发布/订阅功能\n * @module core/event-bus\n */\n\nimport type {
|
|
1
|
+
{"version":3,"file":"event-bus.cjs","names":[],"sources":["../../src/core/event-bus.ts"],"sourcesContent":["/**\r\n * 事件总线实现\r\n *\r\n * 提供事件的发布/订阅功能\r\n * @module core/event-bus\r\n */\r\n\r\nimport type {\r\n EventBus,\r\n EventData,\r\n EventListener,\r\n EventType,\r\n Unsubscribe,\r\n} from '../types'\r\n\r\n/**\r\n * 创建事件总线\r\n *\r\n * @returns 事件总线实例\r\n *\r\n * @example\r\n * ```typescript\r\n * const bus = createEventBus()\r\n *\r\n * // 监听事件\r\n * const unsubscribe = bus.on('state:changed', (data) => {\r\n * console.log('状态变化:', data)\r\n * })\r\n *\r\n * // 发送事件\r\n * bus.emit('state:changed', { storeId: 'counter', newValue: 1 })\r\n *\r\n * // 取消监听\r\n * unsubscribe()\r\n * ```\r\n */\r\nexport function createEventBus(): EventBus {\r\n /** 事件监听器映射 */\r\n const listeners = new Map<EventType | '*', Set<EventListener>>()\r\n\r\n /**\r\n * 获取或创建监听器集合\r\n */\r\n const getListeners = (type: EventType | '*'): Set<EventListener> => {\r\n let set = listeners.get(type)\r\n if (!set) {\r\n set = new Set()\r\n listeners.set(type, set)\r\n }\r\n return set\r\n }\r\n\r\n /**\r\n * 监听事件\r\n */\r\n const on = (type: EventType | '*', listener: EventListener): Unsubscribe => {\r\n const set = getListeners(type)\r\n set.add(listener)\r\n\r\n return () => {\r\n set.delete(listener)\r\n if (set.size === 0) {\r\n listeners.delete(type)\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * 取消监听\r\n */\r\n const off = (type: EventType | '*', listener?: EventListener): void => {\r\n if (listener) {\r\n const set = listeners.get(type)\r\n if (set) {\r\n set.delete(listener)\r\n if (set.size === 0) {\r\n listeners.delete(type)\r\n }\r\n }\r\n } else {\r\n listeners.delete(type)\r\n }\r\n }\r\n\r\n /**\r\n * 监听一次\r\n */\r\n const once = (type: EventType, listener: EventListener): Unsubscribe => {\r\n const wrappedListener: EventListener = data => {\r\n listener(data)\r\n off(type, wrappedListener)\r\n }\r\n return on(type, wrappedListener)\r\n }\r\n\r\n /**\r\n * 发送事件\r\n */\r\n const emit = (type: EventType, payload?: unknown): void => {\r\n const data: EventData = {\r\n type,\r\n payload,\r\n timestamp: Date.now(),\r\n }\r\n\r\n // 触发特定类型的监听器\r\n const typeListeners = listeners.get(type)\r\n if (typeListeners) {\r\n typeListeners.forEach(listener => listener(data))\r\n }\r\n\r\n // 触发通配符监听器\r\n const wildcardListeners = listeners.get('*')\r\n if (wildcardListeners) {\r\n wildcardListeners.forEach(listener => listener(data))\r\n }\r\n }\r\n\r\n /**\r\n * 清空所有监听器\r\n */\r\n const clear = (): void => {\r\n listeners.clear()\r\n }\r\n\r\n return {\r\n on,\r\n once,\r\n off,\r\n emit,\r\n clear,\r\n }\r\n}\r\n\r\n/**\r\n * 全局事件总线实例\r\n */\r\nexport const globalEventBus = createEventBus()\r\n"],"mappings":";;;;;;;;;;;;AAoCO,SAAS,iBAA2B;CAEzC,MAAM,4BAAY,IAAI,IAAyC;CAK/D,MAAM,gBAAgB,SAA8C;EAClE,IAAI,MAAM,UAAU,IAAI,IAAI;EAC5B,IAAI,CAAC,KAAK;GACR,sBAAM,IAAI,IAAI;GACd,UAAU,IAAI,MAAM,GAAG;EACzB;EACA,OAAO;CACT;CAKA,MAAM,MAAM,MAAuB,aAAyC;EAC1E,MAAM,MAAM,aAAa,IAAI;EAC7B,IAAI,IAAI,QAAQ;EAEhB,aAAa;GACX,IAAI,OAAO,QAAQ;GACnB,IAAI,IAAI,SAAS,GACf,UAAU,OAAO,IAAI;EAEzB;CACF;CAKA,MAAM,OAAO,MAAuB,aAAmC;EACrE,IAAI,UAAU;GACZ,MAAM,MAAM,UAAU,IAAI,IAAI;GAC9B,IAAI,KAAK;IACP,IAAI,OAAO,QAAQ;IACnB,IAAI,IAAI,SAAS,GACf,UAAU,OAAO,IAAI;GAEzB;EACF,OACE,UAAU,OAAO,IAAI;CAEzB;CAKA,MAAM,QAAQ,MAAiB,aAAyC;EACtE,MAAM,mBAAiC,SAAQ;GAC7C,SAAS,IAAI;GACb,IAAI,MAAM,eAAe;EAC3B;EACA,OAAO,GAAG,MAAM,eAAe;CACjC;CAKA,MAAM,QAAQ,MAAiB,YAA4B;EACzD,MAAM,OAAkB;GACtB;GACA;GACA,WAAW,KAAK,IAAI;EACtB;EAGA,MAAM,gBAAgB,UAAU,IAAI,IAAI;EACxC,IAAI,eACF,cAAc,SAAQ,aAAY,SAAS,IAAI,CAAC;EAIlD,MAAM,oBAAoB,UAAU,IAAI,GAAG;EAC3C,IAAI,mBACF,kBAAkB,SAAQ,aAAY,SAAS,IAAI,CAAC;CAExD;CAKA,MAAM,cAAoB;EACxB,UAAU,MAAM;CAClB;CAEA,OAAO;EACL;EACA;EACA;EACA;EACA;CACF;AACF;AAKO,MAAM,iBAAiB,eAAe"}
|