wevu 7.1.4 → 7.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/README.md +20 -6
- package/dist/dev/index.d.mts +3 -3
- package/dist/dev/index.mjs +3 -2
- package/dist/dev/package.mjs +1 -1
- package/dist/dev/reactivity/computed.d.mts +4 -0
- package/dist/dev/reactivity/computed.mjs +10 -1
- package/dist/dev/reactivity/computed.mjs.map +1 -1
- package/dist/dev/reactivity/reactive.mjs +27 -20
- package/dist/dev/reactivity/reactive.mjs.map +1 -1
- package/dist/dev/router/auto-routes.d.mts +8 -0
- package/dist/dev/router/auto-routes.mjs +11 -0
- package/dist/dev/router/auto-routes.mjs.map +1 -0
- package/dist/dev/router/createRouter.d.mts +2 -1
- package/dist/dev/router/createRouter.mjs +3 -4
- package/dist/dev/router/createRouter.mjs.map +1 -1
- package/dist/dev/router/navigationCore.d.mts +3 -2
- package/dist/dev/router/navigationCore.mjs +7 -7
- package/dist/dev/router/navigationCore.mjs.map +1 -1
- package/dist/dev/router/resolve.d.mts +3 -2
- package/dist/dev/router/resolve.mjs.map +1 -1
- package/dist/dev/router/routeSync.d.mts +1 -0
- package/dist/dev/router/types.d.mts +173 -78
- package/dist/dev/router/types.mjs.map +1 -1
- package/dist/dev/router/useRoute.d.mts +4 -3
- package/dist/dev/router/useRoute.mjs.map +1 -1
- package/dist/dev/router/useRouter.d.mts +2 -1
- package/dist/dev/router/useRouter.mjs.map +1 -1
- package/dist/dev/router.d.mts +19 -3
- package/dist/dev/routerInternal/location.d.mts +2 -0
- package/dist/dev/routerInternal/matching.d.mts +2 -0
- package/dist/dev/routerInternal/matching.mjs +1 -1
- package/dist/dev/routerInternal/matching.mjs.map +1 -1
- package/dist/dev/routerInternal/params.d.mts +2 -0
- package/dist/dev/routerInternal/params.mjs.map +1 -1
- package/dist/dev/routerInternal/records.d.mts +2 -0
- package/dist/dev/routerInternal/recordsWarnings.d.mts +2 -0
- package/dist/dev/routerInternal/shared.d.mts +9 -0
- package/dist/dev/routerInternal/snapshots.d.mts +2 -0
- package/dist/dev/runtime/hooks/base.mjs +5 -5
- package/dist/dev/runtime/hooks/base.mjs.map +1 -1
- package/dist/dev/runtime/platform.mjs +31 -24
- package/dist/dev/runtime/platform.mjs.map +1 -1
- package/dist/dev/runtime/register/component/alipay.mjs +72 -0
- package/dist/dev/runtime/register/component/alipay.mjs.map +1 -0
- package/dist/dev/runtime/register/component/registerNativeDefinition.mjs +5 -2
- package/dist/dev/runtime/register/component/registerNativeDefinition.mjs.map +1 -1
- package/dist/dev/store/actions.mjs +27 -29
- package/dist/dev/store/actions.mjs.map +1 -1
- package/dist/dev/store/base.mjs +152 -36
- package/dist/dev/store/base.mjs.map +1 -1
- package/dist/dev/store/define/create.mjs +92 -0
- package/dist/dev/store/define/create.mjs.map +1 -0
- package/dist/dev/store/define.d.mts +5 -16
- package/dist/dev/store/define.mjs +11 -15
- package/dist/dev/store/define.mjs.map +1 -1
- package/dist/dev/store/manager.d.mts +13 -5
- package/dist/dev/store/manager.mjs +55 -14
- package/dist/dev/store/manager.mjs.map +1 -1
- package/dist/dev/store/storeToRefs.d.mts +5 -7
- package/dist/dev/store/storeToRefs.mjs +10 -18
- package/dist/dev/store/storeToRefs.mjs.map +1 -1
- package/dist/dev/store/subscriptions.mjs +17 -0
- package/dist/dev/store/subscriptions.mjs.map +1 -0
- package/dist/dev/store/types.d.mts +85 -59
- package/dist/dev/store/types.mjs +11 -0
- package/dist/dev/store/types.mjs.map +1 -0
- package/dist/dev/store/utils.mjs +1 -37
- package/dist/dev/store/utils.mjs.map +1 -1
- package/dist/dev/store/view.mjs +56 -0
- package/dist/dev/store/view.mjs.map +1 -0
- package/dist/dev/store.d.mts +3 -3
- package/dist/dev/store.mjs +3 -2
- package/dist/dev/vue-demi.d.mts +3 -3
- package/dist/dev/vue-demi.mjs +3 -2
- package/dist/dev/vue-demi.mjs.map +1 -1
- package/dist/index.d.mts +3 -3
- package/dist/index.mjs +1 -1
- package/dist/package.mjs +1 -1
- package/dist/reactivity/computed.d.mts +4 -0
- package/dist/reactivity/computed.mjs +1 -1
- package/dist/reactivity/reactive.mjs +1 -1
- package/dist/router/auto-routes.d.mts +7 -0
- package/dist/router/auto-routes.mjs +1 -0
- package/dist/router/createRouter.d.mts +2 -1
- package/dist/router/createRouter.mjs +1 -1
- package/dist/router/navigationCore.d.mts +3 -2
- package/dist/router/navigationCore.mjs +1 -1
- package/dist/router/resolve.d.mts +3 -2
- package/dist/router/routeSync.d.mts +1 -0
- package/dist/router/types.d.mts +173 -78
- package/dist/router/useRoute.d.mts +4 -3
- package/dist/router/useRouter.d.mts +2 -1
- package/dist/router.d.mts +18 -3
- package/dist/routerInternal/location.d.mts +2 -0
- package/dist/routerInternal/matching.d.mts +2 -0
- package/dist/routerInternal/matching.mjs +1 -1
- package/dist/routerInternal/params.d.mts +2 -0
- package/dist/routerInternal/records.d.mts +2 -0
- package/dist/routerInternal/recordsWarnings.d.mts +2 -0
- package/dist/routerInternal/shared.d.mts +9 -0
- package/dist/routerInternal/snapshots.d.mts +2 -0
- package/dist/runtime/hooks/base.mjs +1 -1
- package/dist/runtime/platform.mjs +1 -1
- package/dist/runtime/register/component/alipay.mjs +1 -0
- package/dist/runtime/register/component/registerNativeDefinition.mjs +1 -1
- package/dist/store/actions.mjs +1 -1
- package/dist/store/base.mjs +1 -1
- package/dist/store/define/create.mjs +1 -0
- package/dist/store/define.d.mts +5 -16
- package/dist/store/define.mjs +1 -1
- package/dist/store/manager.d.mts +13 -5
- package/dist/store/manager.mjs +1 -1
- package/dist/store/storeToRefs.d.mts +5 -7
- package/dist/store/storeToRefs.mjs +1 -1
- package/dist/store/subscriptions.mjs +1 -0
- package/dist/store/types.d.mts +85 -59
- package/dist/store/types.mjs +1 -0
- package/dist/store/utils.mjs +1 -1
- package/dist/store/view.mjs +1 -0
- package/dist/store.d.mts +3 -3
- package/dist/store.mjs +1 -1
- package/dist/vue-demi.d.mts +3 -3
- package/dist/vue-demi.mjs +1 -1
- package/package.json +29 -9
- package/dist/dev/store/define/optionsStyle.mjs +0 -117
- package/dist/dev/store/define/optionsStyle.mjs.map +0 -1
- package/dist/dev/store/define/setupStyle.mjs +0 -137
- package/dist/dev/store/define/setupStyle.mjs.map +0 -1
- package/dist/dev/store/define/shared.mjs +0 -81
- package/dist/dev/store/define/shared.mjs.map +0 -1
- package/dist/store/define/optionsStyle.mjs +0 -1
- package/dist/store/define/setupStyle.mjs +0 -1
- package/dist/store/define/shared.mjs +0 -1
package/dist/dev/store/base.mjs
CHANGED
|
@@ -1,47 +1,163 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
1
|
+
import { nextTick, queueJob } from "../scheduler.mjs";
|
|
2
|
+
import { onScopeDispose, queueBatchCallback, track } from "../reactivity/core.mjs";
|
|
3
|
+
import { toRaw } from "../reactivity/reactive/shared.mjs";
|
|
4
|
+
import { isRef } from "../reactivity/ref.mjs";
|
|
5
|
+
import { watch } from "../reactivity/watch.mjs";
|
|
6
|
+
import { mergeState } from "./view.mjs";
|
|
7
|
+
import { addSubscription, noop } from "./subscriptions.mjs";
|
|
8
|
+
import { MutationType } from "./types.mjs";
|
|
3
9
|
|
|
4
10
|
//#region src/store/base.ts
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
11
|
+
/** 逐层追踪公开值与键增删,ref 解包不消耗额外的 state 深度。 */
|
|
12
|
+
function trackState(value, depth, seen = /* @__PURE__ */ new Map()) {
|
|
13
|
+
var _seen$get;
|
|
14
|
+
if (!value || typeof value !== "object" || depth <= 0) return;
|
|
15
|
+
if (((_seen$get = seen.get(value)) !== null && _seen$get !== void 0 ? _seen$get : 0) >= depth) return;
|
|
16
|
+
seen.set(value, depth);
|
|
17
|
+
if (isRef(value)) {
|
|
18
|
+
trackState(value.value, depth, seen);
|
|
19
|
+
return;
|
|
20
|
+
}
|
|
21
|
+
if (value["__r_skip"]) return;
|
|
22
|
+
const raw = toRaw(value);
|
|
23
|
+
track(raw, Symbol.iterator);
|
|
24
|
+
if (Array.isArray(value)) track(raw, "length");
|
|
25
|
+
for (const key of Object.keys(raw)) trackState(value[key], depth - 1, seen);
|
|
26
|
+
}
|
|
27
|
+
/** 管理单个 Store 的事务、订阅和显式释放,状态由 Pinia 持有。 */
|
|
28
|
+
function createBaseApi(id, pinia, scope, getStore) {
|
|
29
|
+
const subscriptions = /* @__PURE__ */ new Set();
|
|
30
|
+
const actionSubscriptions = /* @__PURE__ */ new Set();
|
|
31
|
+
const watchers = /* @__PURE__ */ new Set();
|
|
32
|
+
const syncWatchers = /* @__PURE__ */ new Set();
|
|
33
|
+
let initialized = false;
|
|
34
|
+
let paused = false;
|
|
35
|
+
let listening = false;
|
|
36
|
+
let syncListening = false;
|
|
37
|
+
let listenerVersion = 0;
|
|
38
|
+
let disposed = false;
|
|
39
|
+
scope.run(() => onScopeDispose(() => {
|
|
40
|
+
subscriptions.clear();
|
|
41
|
+
actionSubscriptions.clear();
|
|
42
|
+
watchers.clear();
|
|
43
|
+
syncWatchers.clear();
|
|
44
|
+
}));
|
|
45
|
+
function pauseSubscriptions() {
|
|
46
|
+
if (!initialized) return;
|
|
47
|
+
paused = true;
|
|
48
|
+
watchers.forEach((watcher) => watcher.pause());
|
|
49
|
+
}
|
|
50
|
+
function resumeWatchers(synchronous) {
|
|
51
|
+
let failed = false;
|
|
52
|
+
let failure;
|
|
53
|
+
watchers.forEach((watcher) => {
|
|
54
|
+
if (syncWatchers.has(watcher) !== synchronous) return;
|
|
55
|
+
try {
|
|
56
|
+
watcher.resume();
|
|
57
|
+
} catch (error) {
|
|
58
|
+
if (!failed) failure = error;
|
|
59
|
+
failed = true;
|
|
60
|
+
}
|
|
61
|
+
});
|
|
62
|
+
if (failed) throw failure;
|
|
63
|
+
}
|
|
64
|
+
const refreshAsyncDependencies = () => resumeWatchers(false);
|
|
65
|
+
function restoreSubscriptions() {
|
|
66
|
+
try {
|
|
67
|
+
resumeWatchers(true);
|
|
68
|
+
} finally {
|
|
69
|
+
paused = false;
|
|
70
|
+
queueJob(refreshAsyncDependencies);
|
|
71
|
+
const version = ++listenerVersion;
|
|
72
|
+
syncListening = true;
|
|
73
|
+
const restoreListening = () => {
|
|
74
|
+
if (listenerVersion === version) listening = true;
|
|
75
|
+
};
|
|
76
|
+
nextTick().then(restoreListening, restoreListening);
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
const api = {
|
|
80
|
+
$id: id,
|
|
81
|
+
$patch(patch) {
|
|
82
|
+
listening = syncListening = false;
|
|
83
|
+
pauseSubscriptions();
|
|
84
|
+
try {
|
|
85
|
+
if (typeof patch === "function") patch(pinia.state.value[id]);
|
|
86
|
+
else mergeState(pinia.state.value[id], patch);
|
|
87
|
+
} finally {
|
|
88
|
+
pauseSubscriptions();
|
|
89
|
+
queueBatchCallback(restoreSubscriptions);
|
|
90
|
+
}
|
|
91
|
+
const mutation = typeof patch === "function" ? {
|
|
92
|
+
type: MutationType.patchFunction,
|
|
93
|
+
storeId: id
|
|
94
|
+
} : {
|
|
95
|
+
type: MutationType.patchObject,
|
|
96
|
+
storeId: id,
|
|
97
|
+
payload: patch
|
|
98
|
+
};
|
|
99
|
+
subscriptions.forEach((callback) => callback(mutation, pinia.state.value[id]));
|
|
100
|
+
},
|
|
101
|
+
$subscribe(callback, options = {}) {
|
|
102
|
+
if (subscriptions.has(callback)) return noop;
|
|
103
|
+
let stop = noop;
|
|
104
|
+
let watcher;
|
|
105
|
+
const remove = addSubscription(subscriptions, callback, options.detached, () => {
|
|
106
|
+
if (watcher) {
|
|
107
|
+
watchers.delete(watcher);
|
|
108
|
+
syncWatchers.delete(watcher);
|
|
109
|
+
}
|
|
110
|
+
stop();
|
|
111
|
+
});
|
|
112
|
+
watcher = scope.run(() => watch(() => {
|
|
113
|
+
const state = pinia.state.value[id];
|
|
114
|
+
if (options.deep === false) return state;
|
|
115
|
+
trackState(state, typeof options.deep === "number" ? options.deep : Infinity);
|
|
116
|
+
return { state };
|
|
117
|
+
}, (value) => {
|
|
118
|
+
if (options.flush === "sync" ? syncListening : listening) callback({
|
|
119
|
+
type: MutationType.direct,
|
|
120
|
+
storeId: id
|
|
121
|
+
}, options.deep === false ? value : value.state);
|
|
122
|
+
}, {
|
|
123
|
+
...options,
|
|
124
|
+
deep: false
|
|
125
|
+
}));
|
|
126
|
+
if (watcher) {
|
|
127
|
+
stop = watcher;
|
|
128
|
+
watchers.add(watcher);
|
|
129
|
+
if (options.flush === "sync" || options.scheduler) syncWatchers.add(watcher);
|
|
130
|
+
if (paused) watcher.pause();
|
|
131
|
+
}
|
|
132
|
+
return remove;
|
|
133
|
+
},
|
|
134
|
+
$onAction(callback, detached) {
|
|
135
|
+
return addSubscription(actionSubscriptions, callback, detached);
|
|
10
136
|
},
|
|
11
|
-
|
|
12
|
-
if (
|
|
13
|
-
|
|
14
|
-
|
|
137
|
+
$dispose() {
|
|
138
|
+
if (disposed) return;
|
|
139
|
+
disposed = true;
|
|
140
|
+
try {
|
|
141
|
+
scope.stop();
|
|
142
|
+
} finally {
|
|
143
|
+
subscriptions.clear();
|
|
144
|
+
actionSubscriptions.clear();
|
|
145
|
+
if (pinia._s.get(id) === getStore()) pinia._s.delete(id);
|
|
15
146
|
}
|
|
16
147
|
}
|
|
17
|
-
});
|
|
18
|
-
api.$patch = (patch) => {
|
|
19
|
-
const mutationType = typeof patch === "function" ? "patch function" : "patch object";
|
|
20
|
-
batch(() => {
|
|
21
|
-
const target = stateObj !== null && stateObj !== void 0 ? stateObj : api;
|
|
22
|
-
if (typeof patch === "function") patch(target);
|
|
23
|
-
else mergeShallow(target, patch);
|
|
24
|
-
});
|
|
25
|
-
notify(mutationType);
|
|
26
|
-
};
|
|
27
|
-
if (resetImpl) api.$reset = () => {
|
|
28
|
-
batch(resetImpl);
|
|
29
|
-
notify("patch object");
|
|
30
|
-
};
|
|
31
|
-
const subs = /* @__PURE__ */ new Set();
|
|
32
|
-
api.$subscribe = (cb, _opts) => {
|
|
33
|
-
subs.add(cb);
|
|
34
|
-
return () => subs.delete(cb);
|
|
35
|
-
};
|
|
36
|
-
const actionSubs = /* @__PURE__ */ new Set();
|
|
37
|
-
api.$onAction = (cb) => {
|
|
38
|
-
actionSubs.add(cb);
|
|
39
|
-
return () => actionSubs.delete(cb);
|
|
40
148
|
};
|
|
149
|
+
Object.defineProperty(api, "$state", {
|
|
150
|
+
configurable: true,
|
|
151
|
+
get: () => pinia.state.value[id],
|
|
152
|
+
set: (state) => api.$patch((target) => Object.assign(target, state))
|
|
153
|
+
});
|
|
41
154
|
return {
|
|
42
155
|
api,
|
|
43
|
-
|
|
44
|
-
|
|
156
|
+
actionSubscriptions,
|
|
157
|
+
activateSubscriptions() {
|
|
158
|
+
initialized = true;
|
|
159
|
+
listening = syncListening = true;
|
|
160
|
+
}
|
|
45
161
|
};
|
|
46
162
|
}
|
|
47
163
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"base.mjs","names":[],"sources":["../../../src/store/base.ts"],"sourcesContent":["import type { ActionSubscriber,
|
|
1
|
+
{"version":3,"file":"base.mjs","names":[],"sources":["../../../src/store/base.ts"],"sourcesContent":["import type { EffectScope } from '../reactivity/core'\nimport type { WatchStopHandle } from '../reactivity/watch'\nimport type { ActionSubscriber, Pinia, StoreSubscribeOptions, SubscriptionCallback } from './types'\nimport { isRef, onScopeDispose, toRaw, watch } from '../reactivity'\nimport { queueBatchCallback, queueJob, track } from '../reactivity/core'\nimport { ReactiveFlags } from '../reactivity/reactive/shared'\nimport { nextTick } from '../scheduler'\nimport { addSubscription, noop } from './subscriptions'\nimport { MutationType } from './types'\nimport { mergeState } from './view'\n\n/** 逐层追踪公开值与键增删,ref 解包不消耗额外的 state 深度。 */\nfunction trackState(value: any, depth: number, seen = new Map<object, number>()) {\n if (!value || typeof value !== 'object' || depth <= 0) {\n return\n }\n if ((seen.get(value) ?? 0) >= depth) {\n return\n }\n seen.set(value, depth)\n if (isRef(value)) {\n trackState(value.value, depth, seen)\n return\n }\n if (value[ReactiveFlags.SKIP]) {\n return\n }\n const raw = toRaw(value)\n track(raw, Symbol.iterator)\n if (Array.isArray(value)) {\n track(raw, 'length')\n }\n for (const key of Object.keys(raw)) {\n trackState(value[key], depth - 1, seen)\n }\n}\n\n/** 管理单个 Store 的事务、订阅和显式释放,状态由 Pinia 持有。 */\nexport function createBaseApi(id: string, pinia: Pinia, scope: EffectScope, getStore: () => any) {\n const subscriptions = new Set<SubscriptionCallback>()\n const actionSubscriptions = new Set<ActionSubscriber>()\n const watchers = new Set<WatchStopHandle>()\n const syncWatchers = new Set<WatchStopHandle>()\n let initialized = false\n let paused = false\n let listening = false\n let syncListening = false\n let listenerVersion = 0\n let disposed = false\n scope.run(() => onScopeDispose(() => {\n subscriptions.clear()\n actionSubscriptions.clear()\n watchers.clear()\n syncWatchers.clear()\n }))\n\n function pauseSubscriptions() {\n if (!initialized) {\n return\n }\n paused = true\n watchers.forEach(watcher => watcher.pause())\n }\n\n function resumeWatchers(synchronous: boolean) {\n let failed = false\n let failure: unknown\n watchers.forEach((watcher) => {\n if (syncWatchers.has(watcher) !== synchronous) {\n return\n }\n try {\n watcher.resume()\n }\n catch (error) {\n if (!failed) {\n failure = error\n }\n failed = true\n }\n })\n if (failed) {\n throw failure\n }\n }\n\n const refreshAsyncDependencies = () => resumeWatchers(false)\n\n function restoreSubscriptions() {\n try {\n // 仅重收集 Store 订阅,不合并用户显式注册的同步 watcher。\n resumeWatchers(true)\n }\n finally {\n paused = false\n // 默认订阅跨同一轮的多个 patch 合并收集,避免把异步遍历退化成逐次同步遍历。\n queueJob(refreshAsyncDependencies)\n const version = ++listenerVersion\n syncListening = true\n const restoreListening = () => {\n if (listenerVersion === version) {\n listening = true\n }\n }\n // 调度失败仍须恢复监听;原始 nextTick promise 保留错误供调用方处理。\n void nextTick().then(restoreListening, restoreListening)\n }\n }\n const api: Record<string, any> = {\n $id: id,\n $patch(patch: Record<string, any> | ((state: any) => void)) {\n listening = syncListening = false\n pauseSubscriptions()\n try {\n if (typeof patch === 'function') {\n patch(pinia.state.value[id])\n }\n else {\n mergeState(pinia.state.value[id], patch)\n }\n }\n finally {\n // 取消嵌套 patch 恢复后产生的异步任务,外层 batch 排空后再收集最终依赖。\n pauseSubscriptions()\n queueBatchCallback(restoreSubscriptions)\n }\n const mutation = typeof patch === 'function'\n ? { type: MutationType.patchFunction, storeId: id }\n : { type: MutationType.patchObject, storeId: id, payload: patch }\n subscriptions.forEach(callback => callback(mutation, pinia.state.value[id]))\n },\n $subscribe(callback: SubscriptionCallback, options: StoreSubscribeOptions = {}) {\n if (subscriptions.has(callback)) {\n return noop\n }\n let stop = noop\n let watcher: WatchStopHandle | undefined\n const remove = addSubscription(subscriptions, callback, options.detached, () => {\n if (watcher) {\n watchers.delete(watcher)\n syncWatchers.delete(watcher)\n }\n stop()\n })\n watcher = scope.run(() => watch(\n () => {\n // Store 按公开状态遍历,避免版本树的整树订阅忽略数字 deep 的边界。\n const state = pinia.state.value[id]\n if (options.deep === false) {\n return state\n }\n trackState(state, typeof options.deep === 'number' ? options.deep : Infinity)\n return { state }\n },\n (value) => {\n if (options.flush === 'sync' ? syncListening : listening) {\n callback({ type: MutationType.direct, storeId: id }, options.deep === false ? value : value.state)\n }\n },\n { ...options, deep: false },\n ))\n if (watcher) {\n stop = watcher\n watchers.add(watcher)\n if (options.flush === 'sync' || options.scheduler) {\n syncWatchers.add(watcher)\n }\n if (paused) {\n watcher.pause()\n }\n }\n return remove\n },\n $onAction(callback: ActionSubscriber, detached?: boolean) {\n return addSubscription(actionSubscriptions, callback, detached)\n },\n $dispose() {\n if (disposed) {\n return\n }\n disposed = true\n try {\n scope.stop()\n }\n finally {\n subscriptions.clear()\n actionSubscriptions.clear()\n if (pinia._s.get(id) === getStore()) {\n pinia._s.delete(id)\n }\n }\n },\n }\n Object.defineProperty(api, '$state', {\n configurable: true,\n get: () => pinia.state.value[id],\n set: state => api.$patch((target: any) => Object.assign(target, state)),\n })\n return {\n api,\n actionSubscriptions,\n // 创建流程拥有初始化边界,插件注册的同步订阅不能观察半初始化状态。\n activateSubscriptions() {\n initialized = true\n listening = syncListening = true\n },\n }\n}\n"],"mappings":"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"}
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
import { effectScope } from "../../reactivity/core.mjs";
|
|
2
|
+
import { isReactive } from "../../reactivity/reactive.mjs";
|
|
3
|
+
import { isRef } from "../../reactivity/ref.mjs";
|
|
4
|
+
import { computed, isComputedRef } from "../../reactivity/computed.mjs";
|
|
5
|
+
import { toRef } from "../../reactivity/toRefs.mjs";
|
|
6
|
+
import { mergeState, storeView } from "../view.mjs";
|
|
7
|
+
import { setActivePinia } from "../manager.mjs";
|
|
8
|
+
import { wrapAction } from "../actions.mjs";
|
|
9
|
+
import { createBaseApi } from "../base.mjs";
|
|
10
|
+
|
|
11
|
+
//#region src/store/define/create.ts
|
|
12
|
+
/** 创建 Store 实例;state 与实例缓存分离,释放实例后可继续复用状态。 */
|
|
13
|
+
function createStoreInstance(id, definition, pinia, setupOptions) {
|
|
14
|
+
const scope = pinia._e.run(() => effectScope());
|
|
15
|
+
if (!scope) throw new Error("不能在已释放的 Pinia 上创建 Store");
|
|
16
|
+
const hadState = Object.prototype.hasOwnProperty.call(pinia.state.value, id);
|
|
17
|
+
const isSetup = typeof definition === "function";
|
|
18
|
+
const raw = {};
|
|
19
|
+
const store = storeView(raw);
|
|
20
|
+
const base = createBaseApi(id, pinia, scope, () => store);
|
|
21
|
+
Object.defineProperties(raw, Object.getOwnPropertyDescriptors(base.api));
|
|
22
|
+
pinia._s.set(id, store);
|
|
23
|
+
try {
|
|
24
|
+
scope.run(() => {
|
|
25
|
+
var _definition$actions;
|
|
26
|
+
if (!hadState) {
|
|
27
|
+
var _definition$state, _definition$state2;
|
|
28
|
+
pinia.state.value[id] = storeView(isSetup ? {} : (_definition$state = (_definition$state2 = definition.state) === null || _definition$state2 === void 0 ? void 0 : _definition$state2.call(definition)) !== null && _definition$state !== void 0 ? _definition$state : {});
|
|
29
|
+
}
|
|
30
|
+
const initial = pinia.state.value[id];
|
|
31
|
+
const result = isSetup ? definition() : {};
|
|
32
|
+
const options = isSetup ? {
|
|
33
|
+
...setupOptions,
|
|
34
|
+
actions: {}
|
|
35
|
+
} : { ...definition };
|
|
36
|
+
const actionDefinitions = isSetup ? options.actions : (_definition$actions = definition.actions) !== null && _definition$actions !== void 0 ? _definition$actions : {};
|
|
37
|
+
if (!isSetup) {
|
|
38
|
+
var _definition$getters;
|
|
39
|
+
for (const key of Object.keys(initial)) result[key] = toRef(initial, key);
|
|
40
|
+
for (const [key, getter] of Object.entries((_definition$getters = definition.getters) !== null && _definition$getters !== void 0 ? _definition$getters : {})) result[key] = computed(() => {
|
|
41
|
+
setActivePinia(pinia);
|
|
42
|
+
return getter.call(store, store);
|
|
43
|
+
});
|
|
44
|
+
Object.assign(result, actionDefinitions);
|
|
45
|
+
}
|
|
46
|
+
raw.$reset = isSetup ? () => {
|
|
47
|
+
throw new Error(`Store "${id}" 使用 setup 语法,必须自行实现 $reset()`);
|
|
48
|
+
} : () => store.$patch((state) => {
|
|
49
|
+
var _definition$state3, _definition$state4;
|
|
50
|
+
return Object.assign(state, (_definition$state3 = (_definition$state4 = definition.state) === null || _definition$state4 === void 0 ? void 0 : _definition$state4.call(definition)) !== null && _definition$state3 !== void 0 ? _definition$state3 : {});
|
|
51
|
+
});
|
|
52
|
+
for (const key of Object.keys(result)) {
|
|
53
|
+
const value = result[key];
|
|
54
|
+
if (typeof value === "function") {
|
|
55
|
+
actionDefinitions[key] = value;
|
|
56
|
+
raw[key] = wrapAction(store, key, value, base.actionSubscriptions, pinia);
|
|
57
|
+
} else {
|
|
58
|
+
if (isSetup && (isRef(value) && !isComputedRef(value) || isReactive(value))) {
|
|
59
|
+
if (hadState) {
|
|
60
|
+
if (isRef(value)) value.value = initial[key];
|
|
61
|
+
else mergeState(storeView(value), initial[key]);
|
|
62
|
+
}
|
|
63
|
+
initial[key] = value;
|
|
64
|
+
}
|
|
65
|
+
raw[key] = value;
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
for (const plugin of pinia._p) {
|
|
69
|
+
var _plugin;
|
|
70
|
+
Object.assign(store, (_plugin = plugin({
|
|
71
|
+
store,
|
|
72
|
+
pinia,
|
|
73
|
+
app: pinia._a,
|
|
74
|
+
options
|
|
75
|
+
})) !== null && _plugin !== void 0 ? _plugin : {});
|
|
76
|
+
}
|
|
77
|
+
});
|
|
78
|
+
base.activateSubscriptions();
|
|
79
|
+
return store;
|
|
80
|
+
} catch (error) {
|
|
81
|
+
try {
|
|
82
|
+
scope.stop();
|
|
83
|
+
} catch (_unused) {}
|
|
84
|
+
if (pinia._s.get(id) === store) pinia._s.delete(id);
|
|
85
|
+
if (!hadState) delete pinia.state.value[id];
|
|
86
|
+
throw error;
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
//#endregion
|
|
91
|
+
export { createStoreInstance };
|
|
92
|
+
//# sourceMappingURL=create.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"create.mjs","names":[],"sources":["../../../../src/store/define/create.ts"],"sourcesContent":["import type { Pinia } from '../types'\nimport { computed, effectScope, isReactive, isRef, toRef } from '../../reactivity'\nimport { isComputedRef } from '../../reactivity/computed'\nimport { wrapAction } from '../actions'\nimport { createBaseApi } from '../base'\nimport { setActivePinia } from '../manager'\nimport { mergeState, storeView } from '../view'\n\n/** 创建 Store 实例;state 与实例缓存分离,释放实例后可继续复用状态。 */\nexport function createStoreInstance(id: string, definition: any, pinia: Pinia, setupOptions?: any) {\n const scope = pinia._e.run(() => effectScope())\n if (!scope) {\n throw new Error('不能在已释放的 Pinia 上创建 Store')\n }\n const hadState = Object.prototype.hasOwnProperty.call(pinia.state.value, id)\n const isSetup = typeof definition === 'function'\n const raw: Record<string, any> = {}\n const store = storeView(raw)\n const base = createBaseApi(id, pinia, scope, () => store)\n Object.defineProperties(raw, Object.getOwnPropertyDescriptors(base.api))\n pinia._s.set(id, store)\n\n try {\n scope.run(() => {\n if (!hadState) {\n pinia.state.value[id] = storeView(isSetup ? {} : definition.state?.() ?? {})\n }\n const initial = pinia.state.value[id]\n const result: Record<string, any> = isSetup ? definition() : {}\n const options = isSetup ? { ...setupOptions, actions: {} } : { ...definition }\n const actionDefinitions: Record<string, any> = isSetup ? options.actions : definition.actions ?? {}\n\n if (!isSetup) {\n for (const key of Object.keys(initial)) {\n result[key] = toRef(initial, key)\n }\n for (const [key, getter] of Object.entries(definition.getters ?? {})) {\n result[key] = computed(() => {\n setActivePinia(pinia)\n return (getter as any).call(store, store)\n })\n }\n Object.assign(result, actionDefinitions)\n }\n raw.$reset = isSetup\n ? () => {\n // eslint-disable-next-line mini-program/no-unsupported-runtime-api, node/prefer-global/process -- 构建期常量,两个发布入口分别替换为 production/development\n if (process.env.NODE_ENV !== 'production') {\n throw new Error(`Store \"${id}\" 使用 setup 语法,必须自行实现 $reset()`)\n }\n }\n : () => store.$patch((state: any) => Object.assign(state, definition.state?.() ?? {}))\n\n for (const key of Object.keys(result)) {\n const value = result[key]\n if (typeof value === 'function') {\n actionDefinitions[key] = value\n raw[key] = wrapAction(store, key, value, base.actionSubscriptions, pinia)\n }\n else {\n if (isSetup && ((isRef(value) && !isComputedRef(value)) || isReactive(value))) {\n if (hadState) {\n if (isRef(value)) {\n value.value = initial[key]\n }\n else {\n mergeState(storeView(value), initial[key])\n }\n }\n initial[key] = value\n }\n raw[key] = value\n }\n }\n for (const plugin of pinia._p) {\n Object.assign(store, plugin({ store, pinia, app: pinia._a, options }) ?? {})\n }\n })\n base.activateSubscriptions()\n return store\n }\n catch (error) {\n try {\n scope.stop()\n }\n catch {\n // 初始化异常优先;scope.stop 已逐项执行其余清理。\n }\n if (pinia._s.get(id) === store) {\n pinia._s.delete(id)\n }\n if (!hadState) {\n delete pinia.state.value[id]\n }\n throw error\n }\n}\n"],"mappings":";;;;;;;;;;;;AASA,SAAgB,oBAAoB,IAAY,YAAiB,OAAc,cAAoB;CACjG,MAAM,QAAQ,MAAM,GAAG,UAAU,YAAY,CAAC;CAC9C,IAAI,CAAC,OACH,MAAM,IAAI,MAAM,yBAAyB;CAE3C,MAAM,WAAW,OAAO,UAAU,eAAe,KAAK,MAAM,MAAM,OAAO,EAAE;CAC3E,MAAM,UAAU,OAAO,eAAe;CACtC,MAAM,MAA2B,CAAC;CAClC,MAAM,QAAQ,UAAU,GAAG;CAC3B,MAAM,OAAO,cAAc,IAAI,OAAO,aAAa,KAAK;CACxD,OAAO,iBAAiB,KAAK,OAAO,0BAA0B,KAAK,GAAG,CAAC;CACvE,MAAM,GAAG,IAAI,IAAI,KAAK;CAEtB,IAAI;EACF,MAAM,UAAU;;GACd,IAAI,CAAC,UAAU;;IACb,MAAM,MAAM,MAAM,MAAM,UAAU,UAAU,CAAC,+CAAI,WAAW,8FAAQ,kEAAK,CAAC,CAAC;GAC7E;GACA,MAAM,UAAU,MAAM,MAAM,MAAM;GAClC,MAAM,SAA8B,UAAU,WAAW,IAAI,CAAC;GAC9D,MAAM,UAAU,UAAU;IAAE,GAAG;IAAc,SAAS,CAAC;GAAE,IAAI,EAAE,GAAG,WAAW;GAC7E,MAAM,oBAAyC,UAAU,QAAQ,iCAAU,WAAW,4EAAW,CAAC;GAElG,IAAI,CAAC,SAAS;;IACZ,KAAK,MAAM,OAAO,OAAO,KAAK,OAAO,GACnC,OAAO,OAAO,MAAM,SAAS,GAAG;IAElC,KAAK,MAAM,CAAC,KAAK,WAAW,OAAO,+BAAQ,WAAW,4EAAW,CAAC,CAAC,GACjE,OAAO,OAAO,eAAe;KAC3B,eAAe,KAAK;KACpB,OAAQ,OAAe,KAAK,OAAO,KAAK;IAC1C,CAAC;IAEH,OAAO,OAAO,QAAQ,iBAAiB;GACzC;GACA,IAAI,SAAS,gBACH;IAGF,MAAM,IAAI,MAAM,UAAU,GAAG,8BAA8B;GAE/D,UACM,MAAM,QAAQ,UAAe;;kBAAO,OAAO,mDAAO,WAAW,8FAAQ,oEAAK,CAAC,CAAC;IAAC;GAEvF,KAAK,MAAM,OAAO,OAAO,KAAK,MAAM,GAAG;IACrC,MAAM,QAAQ,OAAO;IACrB,IAAI,OAAO,UAAU,YAAY;KAC/B,kBAAkB,OAAO;KACzB,IAAI,OAAO,WAAW,OAAO,KAAK,OAAO,KAAK,qBAAqB,KAAK;IAC1E,OACK;KACH,IAAI,YAAa,MAAM,KAAK,KAAK,CAAC,cAAc,KAAK,KAAM,WAAW,KAAK,IAAI;MAC7E,IAAI,UAAU;OACZ,IAAI,MAAM,KAAK,GACb,MAAM,QAAQ,QAAQ;YAGtB,WAAW,UAAU,KAAK,GAAG,QAAQ,IAAI;MAE7C;MACA,QAAQ,OAAO;KACjB;KACA,IAAI,OAAO;IACb;GACF;GACA,KAAK,MAAM,UAAU,MAAM,IAAI;;IAC7B,OAAO,OAAO,kBAAO,OAAO;KAAE;KAAO;KAAO,KAAK,MAAM;KAAI;IAAQ,CAAC,8CAAK,CAAC,CAAC;GAC7E;EACF,CAAC;EACD,KAAK,sBAAsB;EAC3B,OAAO;CACT,SACO,OAAO;EACZ,IAAI;GACF,MAAM,KAAK;EACb,kBACM,CAEN;EACA,IAAI,MAAM,GAAG,IAAI,EAAE,MAAM,OACvB,MAAM,GAAG,OAAO,EAAE;EAEpB,IAAI,CAAC,UACH,OAAO,MAAM,MAAM,MAAM;EAE3B,MAAM;CACR;AACF"}
|
|
@@ -1,19 +1,8 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { DefineStoreOptions, OptionsStore, SetupStore, StoreDefinition, StoreSetupOptions } from "./types.mjs";
|
|
2
2
|
//#region src/store/define.d.ts
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
export declare function defineStore<T extends Record<string, any>>(id: string, setup: SetupDefinition<T>): () => T & {
|
|
8
|
-
$id: string;
|
|
9
|
-
$patch: (patch: Record<string, any> | ((state: any) => void)) => void;
|
|
10
|
-
$reset: () => void;
|
|
11
|
-
$subscribe: (cb: SubscriptionCallback<any>, opts?: StoreSubscribeOptions) => () => void;
|
|
12
|
-
$onAction: (cb: ActionSubscriber<any>) => () => void;
|
|
13
|
-
};
|
|
14
|
-
/**
|
|
15
|
-
* @description 定义一个 options 风格的 store
|
|
16
|
-
*/
|
|
17
|
-
export declare function defineStore<S extends Record<string, any>, G extends Record<string, any>, A extends Record<string, any>>(id: string, options: DefineStoreOptions<S, G, A>): () => OptionsStore<S, G, A>;
|
|
3
|
+
/** 定义 Setup Store,返回值在实例上自动解包 ref。 */
|
|
4
|
+
export declare function defineStore<Id extends string, T extends Record<string, any>>(id: Id, setup: () => T, options?: StoreSetupOptions): StoreDefinition<Id, SetupStore<Id, T>>;
|
|
5
|
+
/** 定义 Options Store,共享 state/getters/actions 的 this 类型。 */
|
|
6
|
+
export declare function defineStore<Id extends string, S extends Record<string, any> = Record<never, never>, G extends Record<string, any> = Record<never, never>, A extends Record<string, any> = Record<never, never>>(id: Id, options: DefineStoreOptions<S, G, A>): StoreDefinition<Id, OptionsStore<S, G, A, Id>>;
|
|
18
7
|
//#endregion
|
|
19
8
|
//# sourceMappingURL=define.d.mts.map
|
|
@@ -1,21 +1,17 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
3
|
-
import { createSetupStyleStore } from "./define/setupStyle.mjs";
|
|
4
|
-
import { createStore } from "./manager.mjs";
|
|
1
|
+
import { getActivePinia, setActivePinia } from "./manager.mjs";
|
|
2
|
+
import { createStoreInstance } from "./define/create.mjs";
|
|
5
3
|
|
|
6
4
|
//#region src/store/define.ts
|
|
7
|
-
function defineStore(id, setupOrOptions) {
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
if (
|
|
13
|
-
|
|
14
|
-
instance = effectScope(true).run(() => {
|
|
15
|
-
return typeof setupOrOptions === "function" ? createSetupStyleStore(id, setupOrOptions, manager) : createOptionsStyleStore(id, setupOrOptions, manager);
|
|
16
|
-
});
|
|
17
|
-
return instance;
|
|
5
|
+
function defineStore(id, setupOrOptions, options) {
|
|
6
|
+
const useStore = (pinia) => {
|
|
7
|
+
const owner = pinia !== null && pinia !== void 0 ? pinia : getActivePinia();
|
|
8
|
+
if (!owner) throw new Error("没有活动的 Pinia,请先调用 app.use(createPinia()) 或显式传入 Pinia");
|
|
9
|
+
setActivePinia(owner);
|
|
10
|
+
if (!owner._s.has(id)) createStoreInstance(id, setupOrOptions, owner, options);
|
|
11
|
+
return owner._s.get(id);
|
|
18
12
|
};
|
|
13
|
+
useStore.$id = id;
|
|
14
|
+
return useStore;
|
|
19
15
|
}
|
|
20
16
|
|
|
21
17
|
//#endregion
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"define.mjs","names":[],"sources":["../../../src/store/define.ts"],"sourcesContent":["import type {
|
|
1
|
+
{"version":3,"file":"define.mjs","names":[],"sources":["../../../src/store/define.ts"],"sourcesContent":["import type { DefineStoreOptions, OptionsStore, Pinia, SetupStore, StoreDefinition, StoreSetupOptions } from './types'\nimport { createStoreInstance } from './define/create'\nimport { getActivePinia, setActivePinia } from './manager'\n\n/** 定义 Setup Store,返回值在实例上自动解包 ref。 */\nexport function defineStore<Id extends string, T extends Record<string, any>>(\n id: Id,\n setup: () => T,\n options?: StoreSetupOptions,\n): StoreDefinition<Id, SetupStore<Id, T>>\n/** 定义 Options Store,共享 state/getters/actions 的 this 类型。 */\nexport function defineStore<Id extends string, S extends Record<string, any> = Record<never, never>, G extends Record<string, any> = Record<never, never>, A extends Record<string, any> = Record<never, never>>(\n id: Id,\n options: DefineStoreOptions<S, G, A>,\n): StoreDefinition<Id, OptionsStore<S, G, A, Id>>\nexport function defineStore(id: string, setupOrOptions: any, options?: StoreSetupOptions) {\n const useStore = (pinia?: Pinia | null) => {\n const owner = pinia ?? getActivePinia()\n if (!owner) {\n throw new Error('没有活动的 Pinia,请先调用 app.use(createPinia()) 或显式传入 Pinia')\n }\n setActivePinia(owner)\n if (!owner._s.has(id)) {\n createStoreInstance(id, setupOrOptions, owner, options)\n }\n return owner._s.get(id)\n }\n useStore.$id = id\n return useStore\n}\n"],"mappings":";;;;AAeA,SAAgB,YAAY,IAAY,gBAAqB,SAA6B;CACxF,MAAM,YAAY,UAAyB;EACzC,MAAM,QAAQ,6CAAS,eAAe;EACtC,IAAI,CAAC,OACH,MAAM,IAAI,MAAM,qDAAqD;EAEvE,eAAe,KAAK;EACpB,IAAI,CAAC,MAAM,GAAG,IAAI,EAAE,GAClB,oBAAoB,IAAI,gBAAgB,OAAO,OAAO;EAExD,OAAO,MAAM,GAAG,IAAI,EAAE;CACxB;CACA,SAAS,MAAM;CACf,OAAO;AACT"}
|
|
@@ -1,8 +1,16 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { Pinia } from "./types.mjs";
|
|
2
2
|
//#region src/store/manager.d.ts
|
|
3
|
-
/**
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
export declare function
|
|
3
|
+
/** 设置组件外使用的活动 Store 管理器。 */
|
|
4
|
+
export declare function setActivePinia(pinia: Pinia): Pinia;
|
|
5
|
+
export declare function setActivePinia(pinia: undefined): undefined;
|
|
6
|
+
export declare function setActivePinia(pinia: Pinia | undefined): Pinia | undefined;
|
|
7
|
+
/** 优先读取当前应用的注入上下文,再读取活动管理器。 */
|
|
8
|
+
export declare function getActivePinia(): Pinia | undefined;
|
|
9
|
+
/** 创建独立的状态树与作用域;安装或显式激活后再使用 Store。 */
|
|
10
|
+
export declare function createPinia(): Pinia;
|
|
11
|
+
/** 保留原有创建名称,与推荐的 createPinia 是同一个函数。 */
|
|
12
|
+
export declare const createStore: typeof createPinia;
|
|
13
|
+
/** 释放整个管理器;与单个 Store 的 $dispose 不同,此操作也清除状态。 */
|
|
14
|
+
export declare function disposePinia(pinia: Pinia): void;
|
|
7
15
|
//#endregion
|
|
8
16
|
//# sourceMappingURL=manager.d.mts.map
|
|
@@ -1,21 +1,62 @@
|
|
|
1
|
+
import { effectScope } from "../reactivity/core.mjs";
|
|
2
|
+
import { markRaw } from "../reactivity/reactive.mjs";
|
|
3
|
+
import { ref } from "../reactivity/ref.mjs";
|
|
4
|
+
import { hasInjectionContext, inject } from "../runtime/provide.mjs";
|
|
5
|
+
import { storeView } from "./view.mjs";
|
|
6
|
+
|
|
1
7
|
//#region src/store/manager.ts
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
8
|
+
const piniaKey = Symbol("wevu.pinia");
|
|
9
|
+
let activePinia;
|
|
10
|
+
function setActivePinia(pinia) {
|
|
11
|
+
activePinia = pinia;
|
|
12
|
+
return pinia;
|
|
13
|
+
}
|
|
14
|
+
/** 优先读取当前应用的注入上下文,再读取活动管理器。 */
|
|
15
|
+
function getActivePinia() {
|
|
16
|
+
return hasInjectionContext() && inject(piniaKey, void 0) || activePinia;
|
|
17
|
+
}
|
|
18
|
+
/** 创建独立的状态树与作用域;安装或显式激活后再使用 Store。 */
|
|
19
|
+
function createPinia() {
|
|
20
|
+
const scope = effectScope(true);
|
|
21
|
+
const plugins = [];
|
|
22
|
+
const pending = [];
|
|
23
|
+
const instances = /* @__PURE__ */ new Map();
|
|
24
|
+
const pinia = markRaw({
|
|
25
|
+
state: scope.run(() => ref(storeView({}))),
|
|
26
|
+
_e: scope,
|
|
27
|
+
_s: instances,
|
|
28
|
+
_p: plugins,
|
|
29
|
+
_a: null,
|
|
30
|
+
_stores: instances,
|
|
31
|
+
_plugins: plugins,
|
|
32
|
+
install(app) {
|
|
33
|
+
setActivePinia(pinia);
|
|
34
|
+
pinia._a = app;
|
|
35
|
+
app.provide(piniaKey, pinia);
|
|
36
|
+
app.config.globalProperties.$pinia = pinia;
|
|
37
|
+
plugins.push(...pending.splice(0));
|
|
38
|
+
},
|
|
10
39
|
use(plugin) {
|
|
11
|
-
|
|
12
|
-
return
|
|
40
|
+
(pinia._a ? plugins : pending).push(plugin);
|
|
41
|
+
return pinia;
|
|
13
42
|
}
|
|
14
|
-
};
|
|
15
|
-
|
|
16
|
-
|
|
43
|
+
});
|
|
44
|
+
return pinia;
|
|
45
|
+
}
|
|
46
|
+
/** 保留原有创建名称,与推荐的 createPinia 是同一个函数。 */
|
|
47
|
+
const createStore = createPinia;
|
|
48
|
+
/** 释放整个管理器;与单个 Store 的 $dispose 不同,此操作也清除状态。 */
|
|
49
|
+
function disposePinia(pinia) {
|
|
50
|
+
try {
|
|
51
|
+
pinia._e.stop();
|
|
52
|
+
} finally {
|
|
53
|
+
pinia._s.clear();
|
|
54
|
+
pinia._p.splice(0);
|
|
55
|
+
pinia.state.value = {};
|
|
56
|
+
pinia._a = null;
|
|
57
|
+
}
|
|
17
58
|
}
|
|
18
59
|
|
|
19
60
|
//#endregion
|
|
20
|
-
export { createStore };
|
|
61
|
+
export { createPinia, createStore, disposePinia, getActivePinia, setActivePinia };
|
|
21
62
|
//# sourceMappingURL=manager.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"manager.mjs","names":[],"sources":["../../../src/store/manager.ts"],"sourcesContent":["import type {
|
|
1
|
+
{"version":3,"file":"manager.mjs","names":[],"sources":["../../../src/store/manager.ts"],"sourcesContent":["import type { Pinia, PiniaPlugin } from './types'\nimport { effectScope, markRaw, ref } from '../reactivity'\nimport { hasInjectionContext, inject } from '../runtime/provide'\nimport { storeView } from './view'\n\nconst piniaKey = Symbol('wevu.pinia')\nlet activePinia: Pinia | undefined\n\n/** 设置组件外使用的活动 Store 管理器。 */\nexport function setActivePinia(pinia: Pinia): Pinia\nexport function setActivePinia(pinia: undefined): undefined\nexport function setActivePinia(pinia: Pinia | undefined): Pinia | undefined\nexport function setActivePinia(pinia: Pinia | undefined) {\n activePinia = pinia\n return pinia\n}\n\n/** 优先读取当前应用的注入上下文,再读取活动管理器。 */\nexport function getActivePinia(): Pinia | undefined {\n return (hasInjectionContext() && inject<Pinia | undefined>(piniaKey, undefined)) || activePinia\n}\n\n/** 创建独立的状态树与作用域;安装或显式激活后再使用 Store。 */\nexport function createPinia(): Pinia {\n const scope = effectScope(true)\n const plugins: PiniaPlugin[] = []\n const pending: PiniaPlugin[] = []\n const instances = new Map<string, any>()\n const pinia: Pinia = markRaw({\n state: scope.run(() => ref<Record<string, any>>(storeView({})))!,\n _e: scope,\n _s: instances,\n _p: plugins,\n _a: null,\n _stores: instances,\n _plugins: plugins,\n install(app: any) {\n setActivePinia(pinia)\n pinia._a = app\n app.provide(piniaKey, pinia)\n app.config.globalProperties.$pinia = pinia\n plugins.push(...pending.splice(0))\n },\n use(plugin: PiniaPlugin) {\n (pinia._a ? plugins : pending).push(plugin)\n return pinia\n },\n })\n return pinia\n}\n\n/** 保留原有创建名称,与推荐的 createPinia 是同一个函数。 */\nexport const createStore = createPinia\n\n/** 释放整个管理器;与单个 Store 的 $dispose 不同,此操作也清除状态。 */\nexport function disposePinia(pinia: Pinia) {\n try {\n pinia._e.stop()\n }\n finally {\n pinia._s.clear()\n pinia._p.splice(0)\n pinia.state.value = {}\n pinia._a = null\n }\n}\n"],"mappings":";;;;;;;AAKA,MAAM,WAAW,OAAO,YAAY;AACpC,IAAI;AAMJ,SAAgB,eAAe,OAA0B;CACvD,cAAc;CACd,OAAO;AACT;;AAGA,SAAgB,iBAAoC;CAClD,OAAQ,oBAAoB,KAAK,OAA0B,UAAU,MAAS,KAAM;AACtF;;AAGA,SAAgB,cAAqB;CACnC,MAAM,QAAQ,YAAY,IAAI;CAC9B,MAAM,UAAyB,CAAC;CAChC,MAAM,UAAyB,CAAC;CAChC,MAAM,4BAAY,IAAI,IAAiB;CACvC,MAAM,QAAe,QAAQ;EAC3B,OAAO,MAAM,UAAU,IAAyB,UAAU,CAAC,CAAC,CAAC,CAAC;EAC9D,IAAI;EACJ,IAAI;EACJ,IAAI;EACJ,IAAI;EACJ,SAAS;EACT,UAAU;EACV,QAAQ,KAAU;GAChB,eAAe,KAAK;GACpB,MAAM,KAAK;GACX,IAAI,QAAQ,UAAU,KAAK;GAC3B,IAAI,OAAO,iBAAiB,SAAS;GACrC,QAAQ,KAAK,GAAG,QAAQ,OAAO,CAAC,CAAC;EACnC;EACA,IAAI,QAAqB;GACvB,CAAC,MAAM,KAAK,UAAU,QAAO,CAAE,KAAK,MAAM;GAC1C,OAAO;EACT;CACF,CAAC;CACD,OAAO;AACT;;AAGA,MAAa,cAAc;;AAG3B,SAAgB,aAAa,OAAc;CACzC,IAAI;EACF,MAAM,GAAG,KAAK;CAChB,UACQ;EACN,MAAM,GAAG,MAAM;EACf,MAAM,GAAG,OAAO,CAAC;EACjB,MAAM,MAAM,QAAQ,CAAC;EACrB,MAAM,KAAK;CACb;AACF"}
|
|
@@ -1,13 +1,11 @@
|
|
|
1
1
|
import { Ref } from "../reactivity/ref.mjs";
|
|
2
|
+
import { ComputedRef } from "../reactivity/computed.mjs";
|
|
2
3
|
import "../reactivity/index.mjs";
|
|
4
|
+
import { StoreApi } from "./types.mjs";
|
|
3
5
|
//#region src/store/storeToRefs.d.ts
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
export type StoreToRefsResult<T extends Record<string, any>> = { [K in keyof T]: T[K] extends ((...args: any[]) => any) ? T[K] : T[K] extends Ref<infer V> ? Ref<V> : Ref<T[K]>; };
|
|
8
|
-
/**
|
|
9
|
-
* @description 将 store 状态转换为 Ref
|
|
10
|
-
*/
|
|
6
|
+
type IfEquals<X, Y, Yes, No> = (<T>() => T extends X ? 1 : 2) extends (<T>() => T extends Y ? 1 : 2) ? Yes : No;
|
|
7
|
+
/** 仅提取状态与 getter,保留 getter 的只读类型。 */
|
|
8
|
+
export type StoreToRefsResult<T extends Record<string, any>> = { [K in keyof T as K extends keyof StoreApi<any, any, any, any> ? never : T[K] extends ((...args: any[]) => any) ? never : K]: IfEquals<{ [P in K]: T[P]; }, { -readonly [P in K]: T[P]; }, Ref<T[K]>, ComputedRef<T[K]>>; };
|
|
11
9
|
export declare function storeToRefs<T extends Record<string, any>>(store: T): StoreToRefsResult<T>;
|
|
12
10
|
//#endregion
|
|
13
11
|
//# sourceMappingURL=storeToRefs.d.mts.map
|
|
@@ -1,26 +1,18 @@
|
|
|
1
|
+
import { isReactive } from "../reactivity/reactive.mjs";
|
|
1
2
|
import { isRef } from "../reactivity/ref.mjs";
|
|
2
|
-
import {
|
|
3
|
+
import { isReadonly } from "../reactivity/readonly.mjs";
|
|
4
|
+
import { computed, isComputedRef } from "../reactivity/computed.mjs";
|
|
5
|
+
import { toRef } from "../reactivity/toRefs.mjs";
|
|
6
|
+
import { rawStore } from "./view.mjs";
|
|
3
7
|
|
|
4
8
|
//#region src/store/storeToRefs.ts
|
|
5
|
-
/**
|
|
6
|
-
* @description 将 store 状态转换为 Ref
|
|
7
|
-
*/
|
|
8
9
|
function storeToRefs(store) {
|
|
9
10
|
const result = {};
|
|
10
|
-
for (const key
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
}
|
|
16
|
-
if (isRef(value)) result[key] = value;
|
|
17
|
-
else result[key] = computed({
|
|
18
|
-
get: () => store[key],
|
|
19
|
-
set: (v) => {
|
|
20
|
-
store[key] = v;
|
|
21
|
-
}
|
|
22
|
-
});
|
|
23
|
-
}
|
|
11
|
+
for (const [key, value] of Object.entries(rawStore(store))) if (isComputedRef(value)) result[key] = isReadonly(value) ? computed(() => store[key]) : computed({
|
|
12
|
+
get: () => store[key],
|
|
13
|
+
set: (value) => store[key] = value
|
|
14
|
+
});
|
|
15
|
+
else if (isRef(value) || isReactive(value)) result[key] = toRef(store, key);
|
|
24
16
|
return result;
|
|
25
17
|
}
|
|
26
18
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"storeToRefs.mjs","names":[],"sources":["../../../src/store/storeToRefs.ts"],"sourcesContent":["import type { Ref } from '../reactivity'\nimport { computed, isRef } from '../reactivity'\n\
|
|
1
|
+
{"version":3,"file":"storeToRefs.mjs","names":[],"sources":["../../../src/store/storeToRefs.ts"],"sourcesContent":["import type { ComputedRef, Ref } from '../reactivity'\nimport type { StoreApi } from './types'\nimport { computed, isReactive, isReadonly, isRef, toRef } from '../reactivity'\nimport { isComputedRef } from '../reactivity/computed'\nimport { rawStore } from './view'\n\ntype IfEquals<X, Y, Yes, No> = (<T>() => T extends X ? 1 : 2) extends (<T>() => T extends Y ? 1 : 2) ? Yes : No\n/** 仅提取状态与 getter,保留 getter 的只读类型。 */\nexport type StoreToRefsResult<T extends Record<string, any>> = {\n [K in keyof T as K extends keyof StoreApi<any, any, any, any> ? never : T[K] extends (...args: any[]) => any ? never : K]:\n IfEquals<{ [P in K]: T[P] }, { -readonly [P in K]: T[P] }, Ref<T[K]>, ComputedRef<T[K]>>\n}\nexport function storeToRefs<T extends Record<string, any>>(store: T): StoreToRefsResult<T> {\n const result: Record<string, any> = {}\n for (const [key, value] of Object.entries(rawStore(store))) {\n if (isComputedRef(value)) {\n result[key] = isReadonly(value)\n ? computed(() => store[key])\n : computed({ get: () => store[key], set: value => (store as any)[key] = value })\n }\n else if (isRef(value) || isReactive(value)) {\n result[key] = toRef(store, key)\n }\n }\n return result as StoreToRefsResult<T>\n}\n"],"mappings":";;;;;;;;AAYA,SAAgB,YAA2C,OAAgC;CACzF,MAAM,SAA8B,CAAC;CACrC,KAAK,MAAM,CAAC,KAAK,UAAU,OAAO,QAAQ,SAAS,KAAK,CAAC,GACvD,IAAI,cAAc,KAAK,GACrB,OAAO,OAAO,WAAW,KAAK,IAC1B,eAAe,MAAM,IAAI,IACzB,SAAS;EAAE,WAAW,MAAM;EAAM,MAAK,UAAS,AAAC,MAAc,OAAO;CAAM,CAAC;MAE9E,IAAI,MAAM,KAAK,KAAK,WAAW,KAAK,GACvC,OAAO,OAAO,MAAM,OAAO,GAAG;CAGlC,OAAO;AACT"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { getCurrentScope, onScopeDispose } from "../reactivity/core.mjs";
|
|
2
|
+
|
|
3
|
+
//#region src/store/subscriptions.ts
|
|
4
|
+
function noop() {}
|
|
5
|
+
/** 订阅归注册时的作用域所有,detached 订阅由调用方显式清理。 */
|
|
6
|
+
function addSubscription(subscriptions, callback, detached = false, cleanup = noop) {
|
|
7
|
+
subscriptions.add(callback);
|
|
8
|
+
const remove = () => {
|
|
9
|
+
if (subscriptions.delete(callback)) cleanup();
|
|
10
|
+
};
|
|
11
|
+
if (!detached && getCurrentScope()) onScopeDispose(remove);
|
|
12
|
+
return remove;
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
//#endregion
|
|
16
|
+
export { addSubscription, noop };
|
|
17
|
+
//# sourceMappingURL=subscriptions.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"subscriptions.mjs","names":[],"sources":["../../../src/store/subscriptions.ts"],"sourcesContent":["import { getCurrentScope, onScopeDispose } from '../reactivity'\n\nexport function noop() {}\n\n/** 订阅归注册时的作用域所有,detached 订阅由调用方显式清理。 */\nexport function addSubscription<T extends (...args: any[]) => any>(\n subscriptions: Set<T>,\n callback: T,\n detached = false,\n cleanup: () => void = noop,\n) {\n subscriptions.add(callback)\n const remove = () => {\n if (subscriptions.delete(callback)) {\n cleanup()\n }\n }\n if (!detached && getCurrentScope()) {\n onScopeDispose(remove)\n }\n return remove\n}\n"],"mappings":";;;AAEA,SAAgB,OAAO,CAAC;;AAGxB,SAAgB,gBACd,eACA,UACA,WAAW,OACX,UAAsB,MACtB;CACA,cAAc,IAAI,QAAQ;CAC1B,MAAM,eAAe;EACnB,IAAI,cAAc,OAAO,QAAQ,GAC/B,QAAQ;CAEZ;CACA,IAAI,CAAC,YAAY,gBAAgB,GAC/B,eAAe,MAAM;CAEvB,OAAO;AACT"}
|