wevu 7.1.4 → 7.2.1

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.
Files changed (221) hide show
  1. package/README.md +20 -6
  2. package/dist/dev/index.mjs +3 -2
  3. package/dist/dev/package.mjs +1 -1
  4. package/dist/dev/reactivity/computed.mjs +10 -1
  5. package/dist/dev/reactivity/computed.mjs.map +1 -1
  6. package/dist/dev/reactivity/reactive.mjs +27 -20
  7. package/dist/dev/reactivity/reactive.mjs.map +1 -1
  8. package/dist/dev/router/auto-routes.mjs +11 -0
  9. package/dist/dev/router/auto-routes.mjs.map +1 -0
  10. package/dist/dev/router/createRouter.mjs +3 -4
  11. package/dist/dev/router/createRouter.mjs.map +1 -1
  12. package/dist/dev/router/navigationCore.mjs +7 -7
  13. package/dist/dev/router/navigationCore.mjs.map +1 -1
  14. package/dist/dev/router/resolve.mjs.map +1 -1
  15. package/dist/dev/router/types.mjs.map +1 -1
  16. package/dist/dev/router/useRoute.mjs.map +1 -1
  17. package/dist/dev/router/useRouter.mjs.map +1 -1
  18. package/dist/dev/routerInternal/matching.mjs +1 -1
  19. package/dist/dev/routerInternal/matching.mjs.map +1 -1
  20. package/dist/dev/routerInternal/params.mjs.map +1 -1
  21. package/dist/dev/runtime/hooks/base.mjs +5 -5
  22. package/dist/dev/runtime/hooks/base.mjs.map +1 -1
  23. package/dist/dev/runtime/platform.mjs +31 -24
  24. package/dist/dev/runtime/platform.mjs.map +1 -1
  25. package/dist/dev/runtime/register/component/alipay.mjs +72 -0
  26. package/dist/dev/runtime/register/component/alipay.mjs.map +1 -0
  27. package/dist/dev/runtime/register/component/registerNativeDefinition.mjs +5 -2
  28. package/dist/dev/runtime/register/component/registerNativeDefinition.mjs.map +1 -1
  29. package/dist/dev/store/actions.mjs +27 -29
  30. package/dist/dev/store/actions.mjs.map +1 -1
  31. package/dist/dev/store/base.mjs +152 -36
  32. package/dist/dev/store/base.mjs.map +1 -1
  33. package/dist/dev/store/define/create.mjs +92 -0
  34. package/dist/dev/store/define/create.mjs.map +1 -0
  35. package/dist/dev/store/define.mjs +11 -15
  36. package/dist/dev/store/define.mjs.map +1 -1
  37. package/dist/dev/store/manager.mjs +55 -14
  38. package/dist/dev/store/manager.mjs.map +1 -1
  39. package/dist/dev/store/storeToRefs.mjs +10 -18
  40. package/dist/dev/store/storeToRefs.mjs.map +1 -1
  41. package/dist/dev/store/subscriptions.mjs +17 -0
  42. package/dist/dev/store/subscriptions.mjs.map +1 -0
  43. package/dist/dev/store/types.mjs +11 -0
  44. package/dist/dev/store/types.mjs.map +1 -0
  45. package/dist/dev/store/utils.mjs +1 -37
  46. package/dist/dev/store/utils.mjs.map +1 -1
  47. package/dist/dev/store/view.mjs +56 -0
  48. package/dist/dev/store/view.mjs.map +1 -0
  49. package/dist/dev/store.mjs +3 -2
  50. package/dist/dev/vue-demi.mjs +3 -2
  51. package/dist/dev/vue-demi.mjs.map +1 -1
  52. package/dist/index.d.mts +3 -3
  53. package/dist/index.mjs +1 -1
  54. package/dist/package.mjs +1 -1
  55. package/dist/reactivity/computed.d.mts +4 -0
  56. package/dist/reactivity/computed.mjs +1 -1
  57. package/dist/reactivity/reactive.mjs +1 -1
  58. package/dist/router/auto-routes.d.mts +7 -0
  59. package/dist/router/auto-routes.mjs +1 -0
  60. package/dist/router/createRouter.d.mts +2 -1
  61. package/dist/router/createRouter.mjs +1 -1
  62. package/dist/router/navigationCore.d.mts +3 -2
  63. package/dist/router/navigationCore.mjs +1 -1
  64. package/dist/router/resolve.d.mts +3 -2
  65. package/dist/router/routeSync.d.mts +1 -0
  66. package/dist/router/types.d.mts +173 -78
  67. package/dist/router/useRoute.d.mts +4 -3
  68. package/dist/router/useRouter.d.mts +2 -1
  69. package/dist/router.d.mts +18 -3
  70. package/dist/routerInternal/location.d.mts +2 -0
  71. package/dist/routerInternal/matching.d.mts +2 -0
  72. package/dist/routerInternal/matching.mjs +1 -1
  73. package/dist/routerInternal/params.d.mts +2 -0
  74. package/dist/routerInternal/records.d.mts +2 -0
  75. package/dist/routerInternal/recordsWarnings.d.mts +2 -0
  76. package/dist/routerInternal/shared.d.mts +9 -0
  77. package/dist/routerInternal/snapshots.d.mts +2 -0
  78. package/dist/runtime/hooks/base.mjs +1 -1
  79. package/dist/runtime/platform.mjs +1 -1
  80. package/dist/runtime/register/component/alipay.mjs +1 -0
  81. package/dist/runtime/register/component/registerNativeDefinition.mjs +1 -1
  82. package/dist/store/actions.mjs +1 -1
  83. package/dist/store/base.mjs +1 -1
  84. package/dist/store/define/create.mjs +1 -0
  85. package/dist/store/define.d.mts +5 -16
  86. package/dist/store/define.mjs +1 -1
  87. package/dist/store/manager.d.mts +13 -5
  88. package/dist/store/manager.mjs +1 -1
  89. package/dist/store/storeToRefs.d.mts +5 -7
  90. package/dist/store/storeToRefs.mjs +1 -1
  91. package/dist/store/subscriptions.mjs +1 -0
  92. package/dist/store/types.d.mts +85 -59
  93. package/dist/store/types.mjs +1 -0
  94. package/dist/store/utils.mjs +1 -1
  95. package/dist/store/view.mjs +1 -0
  96. package/dist/store.d.mts +3 -3
  97. package/dist/store.mjs +1 -1
  98. package/dist/vue-demi.d.mts +3 -3
  99. package/dist/vue-demi.mjs +1 -1
  100. package/package.json +29 -9
  101. package/dist/dev/api/vitest/setup.d.mts +0 -1
  102. package/dist/dev/api/vitest.d.mts +0 -1
  103. package/dist/dev/api.d.mts +0 -1
  104. package/dist/dev/compiler.d.mts +0 -1
  105. package/dist/dev/fetch.d.mts +0 -9
  106. package/dist/dev/index.d.mts +0 -72
  107. package/dist/dev/internal-reactivity.d.mts +0 -18
  108. package/dist/dev/internal-runtime.d.mts +0 -44
  109. package/dist/dev/internal-template.d.mts +0 -2
  110. package/dist/dev/jsxTypes.d.mts +0 -9
  111. package/dist/dev/macros/shared.d.mts +0 -83
  112. package/dist/dev/macros.d.mts +0 -71
  113. package/dist/dev/reactivity/asyncDerivation.d.mts +0 -41
  114. package/dist/dev/reactivity/computed.d.mts +0 -21
  115. package/dist/dev/reactivity/core.d.mts +0 -35
  116. package/dist/dev/reactivity/index.d.mts +0 -16
  117. package/dist/dev/reactivity/reactive/mutation.d.mts +0 -21
  118. package/dist/dev/reactivity/reactive/patch.d.mts +0 -18
  119. package/dist/dev/reactivity/reactive/shallow.d.mts +0 -22
  120. package/dist/dev/reactivity/reactive/shared.d.mts +0 -4
  121. package/dist/dev/reactivity/reactive.d.mts +0 -42
  122. package/dist/dev/reactivity/readonly.d.mts +0 -27
  123. package/dist/dev/reactivity/ref.d.mts +0 -27
  124. package/dist/dev/reactivity/shallowRef.d.mts +0 -19
  125. package/dist/dev/reactivity/toRefs.d.mts +0 -43
  126. package/dist/dev/reactivity/traverse.d.mts +0 -8
  127. package/dist/dev/reactivity/watch/types.d.mts +0 -43
  128. package/dist/dev/reactivity/watch.d.mts +0 -22
  129. package/dist/dev/router/createRouter.d.mts +0 -8
  130. package/dist/dev/router/navigationCore.d.mts +0 -6
  131. package/dist/dev/router/resolve.d.mts +0 -6
  132. package/dist/dev/router/routeSync.d.mts +0 -1
  133. package/dist/dev/router/types.d.mts +0 -172
  134. package/dist/dev/router/useRoute.d.mts +0 -19
  135. package/dist/dev/router/useRouter.d.mts +0 -8
  136. package/dist/dev/router.d.mts +0 -10
  137. package/dist/dev/routerInternal/query.d.mts +0 -7
  138. package/dist/dev/routerInternal/types.d.mts +0 -9
  139. package/dist/dev/runtime/app/pending.d.mts +0 -10
  140. package/dist/dev/runtime/app/setData/commitTracker.d.mts +0 -13
  141. package/dist/dev/runtime/app/setData/scheduler.d.mts +0 -51
  142. package/dist/dev/runtime/app.d.mts +0 -8
  143. package/dist/dev/runtime/capabilities.d.mts +0 -75
  144. package/dist/dev/runtime/css.d.mts +0 -14
  145. package/dist/dev/runtime/defaults.d.mts +0 -12
  146. package/dist/dev/runtime/define.d.mts +0 -118
  147. package/dist/dev/runtime/disposables.d.mts +0 -31
  148. package/dist/dev/runtime/elementIntersectionObserver.d.mts +0 -26
  149. package/dist/dev/runtime/features/inlineEvents.d.mts +0 -7
  150. package/dist/dev/runtime/features/layout.d.mts +0 -7
  151. package/dist/dev/runtime/features/patchStrategy.d.mts +0 -7
  152. package/dist/dev/runtime/features/publicLayout.d.mts +0 -24
  153. package/dist/dev/runtime/features/scopedSlots.d.mts +0 -23
  154. package/dist/dev/runtime/features/setDataHighFrequencyWarning.d.mts +0 -7
  155. package/dist/dev/runtime/features/templateRefs.d.mts +0 -7
  156. package/dist/dev/runtime/hooks/base.d.mts +0 -27
  157. package/dist/dev/runtime/hooks/register.d.mts +0 -30
  158. package/dist/dev/runtime/hooks/vue.d.mts +0 -52
  159. package/dist/dev/runtime/hooks.d.mts +0 -4
  160. package/dist/dev/runtime/index.d.mts +0 -46
  161. package/dist/dev/runtime/intersectionObserver.d.mts +0 -14
  162. package/dist/dev/runtime/jsxIsland.d.mts +0 -37
  163. package/dist/dev/runtime/layoutBridge.d.mts +0 -55
  164. package/dist/dev/runtime/noSetData.d.mts +0 -5
  165. package/dist/dev/runtime/pageEnvironment.d.mts +0 -50
  166. package/dist/dev/runtime/pageLayout.d.mts +0 -25
  167. package/dist/dev/runtime/pageScroll.d.mts +0 -29
  168. package/dist/dev/runtime/provide.d.mts +0 -60
  169. package/dist/dev/runtime/provideStore.d.mts +0 -7
  170. package/dist/dev/runtime/publicRuntime.d.mts +0 -22
  171. package/dist/dev/runtime/pullDownRefresh.d.mts +0 -12
  172. package/dist/dev/runtime/register/app.d.mts +0 -14
  173. package/dist/dev/runtime/register/component.d.mts +0 -17
  174. package/dist/dev/runtime/register/inline.d.mts +0 -15
  175. package/dist/dev/runtime/register/runtimeInstance.d.mts +0 -26
  176. package/dist/dev/runtime/register/setup.d.mts +0 -11
  177. package/dist/dev/runtime/register/watch.d.mts +0 -12
  178. package/dist/dev/runtime/register.d.mts +0 -5
  179. package/dist/dev/runtime/selectorQuery.d.mts +0 -54
  180. package/dist/dev/runtime/template.d.mts +0 -6
  181. package/dist/dev/runtime/templateRefTypes.d.mts +0 -12
  182. package/dist/dev/runtime/types/core.d.mts +0 -35
  183. package/dist/dev/runtime/types/miniprogram.d.mts +0 -84
  184. package/dist/dev/runtime/types/miniprogramHost.d.mts +0 -45
  185. package/dist/dev/runtime/types/miniprogramHostSources.d.mts +0 -112
  186. package/dist/dev/runtime/types/options.d.mts +0 -138
  187. package/dist/dev/runtime/types/props/propTypes.d.mts +0 -79
  188. package/dist/dev/runtime/types/props/router.d.mts +0 -51
  189. package/dist/dev/runtime/types/props/setup.d.mts +0 -96
  190. package/dist/dev/runtime/types/props.d.mts +0 -4
  191. package/dist/dev/runtime/types/runtime.d.mts +0 -59
  192. package/dist/dev/runtime/types/setData.d.mts +0 -237
  193. package/dist/dev/runtime/types.d.mts +0 -29
  194. package/dist/dev/runtime/uniAppHost.d.mts +0 -8
  195. package/dist/dev/runtime/updatePerformance.d.mts +0 -13
  196. package/dist/dev/runtime/use.d.mts +0 -13
  197. package/dist/dev/runtime/vueCompat/context.d.mts +0 -8
  198. package/dist/dev/runtime/vueCompat/model.d.mts +0 -30
  199. package/dist/dev/runtime/vueCompat/router.d.mts +0 -29
  200. package/dist/dev/runtime/vueCompat/templateRef.d.mts +0 -9
  201. package/dist/dev/runtime/vueCompat.d.mts +0 -5
  202. package/dist/dev/scheduler.d.mts +0 -4
  203. package/dist/dev/store/define/optionsStyle.mjs +0 -117
  204. package/dist/dev/store/define/optionsStyle.mjs.map +0 -1
  205. package/dist/dev/store/define/setupStyle.mjs +0 -137
  206. package/dist/dev/store/define/setupStyle.mjs.map +0 -1
  207. package/dist/dev/store/define/shared.mjs +0 -81
  208. package/dist/dev/store/define/shared.mjs.map +0 -1
  209. package/dist/dev/store/define.d.mts +0 -19
  210. package/dist/dev/store/manager.d.mts +0 -8
  211. package/dist/dev/store/storeToRefs.d.mts +0 -13
  212. package/dist/dev/store/types.d.mts +0 -80
  213. package/dist/dev/store.d.mts +0 -5
  214. package/dist/dev/version.d.mts +0 -4
  215. package/dist/dev/vue-augment.d.mts +0 -8
  216. package/dist/dev/vue-demi.d.mts +0 -87
  217. package/dist/dev/vue-types.d.mts +0 -19
  218. package/dist/dev/web-apis.d.mts +0 -3
  219. package/dist/store/define/optionsStyle.mjs +0 -1
  220. package/dist/store/define/setupStyle.mjs +0 -1
  221. package/dist/store/define/shared.mjs +0 -1
@@ -1,47 +1,163 @@
1
- import { batch } from "../reactivity/core.mjs";
2
- import { isObject, mergeShallow } from "./utils.mjs";
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
- function createBaseApi(id, stateObj, notify, resetImpl) {
6
- const api = { $id: id };
7
- Object.defineProperty(api, "$state", {
8
- get() {
9
- return stateObj;
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
- set(v) {
12
- if (stateObj && isObject(v)) {
13
- mergeShallow(stateObj, v);
14
- notify("patch object");
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
- subs,
44
- actionSubs
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, MutationType, SubscriptionCallback } from './types'\nimport { batch } from '../reactivity'\nimport { isObject, mergeShallow } from './utils'\n\nexport function createBaseApi<S extends Record<string, any>>(\n id: string,\n stateObj: S | undefined,\n notify: (type: MutationType) => void,\n resetImpl?: () => void,\n) {\n const api: any = {\n $id: id,\n }\n Object.defineProperty(api, '$state', {\n get() {\n return stateObj\n },\n set(v: any) {\n if (stateObj && isObject(v)) {\n mergeShallow(stateObj, v)\n notify('patch object')\n }\n },\n })\n api.$patch = (patch: Record<string, unknown> | ((state: S) => void)) => {\n const mutationType: MutationType = typeof patch === 'function' ? 'patch function' : 'patch object'\n batch(() => {\n const target = stateObj ?? (api as S)\n if (typeof patch === 'function') {\n patch(target)\n }\n else {\n mergeShallow(target, patch)\n }\n })\n notify(mutationType)\n }\n if (resetImpl) {\n api.$reset = () => {\n batch(resetImpl)\n notify('patch object')\n }\n }\n const subs = new Set<SubscriptionCallback<S>>()\n api.$subscribe = (cb: SubscriptionCallback<S>, _opts?: { detached?: boolean }) => {\n subs.add(cb)\n return () => subs.delete(cb)\n }\n const actionSubs = new Set<ActionSubscriber<any>>()\n api.$onAction = (cb: ActionSubscriber<any>) => {\n actionSubs.add(cb)\n return () => actionSubs.delete(cb)\n }\n return { api, subs, actionSubs }\n}\n"],"mappings":";;;;AAIA,SAAgB,cACd,IACA,UACA,QACA,WACA;CACA,MAAM,MAAW,EACf,KAAK,GACP;CACA,OAAO,eAAe,KAAK,UAAU;EACnC,MAAM;GACJ,OAAO;EACT;EACA,IAAI,GAAQ;GACV,IAAI,YAAY,SAAS,CAAC,GAAG;IAC3B,aAAa,UAAU,CAAC;IACxB,OAAO,cAAc;GACvB;EACF;CACF,CAAC;CACD,IAAI,UAAU,UAA0D;EACtE,MAAM,eAA6B,OAAO,UAAU,aAAa,mBAAmB;EACpF,YAAY;GACV,MAAM,SAAS,sDAAa;GAC5B,IAAI,OAAO,UAAU,YACnB,MAAM,MAAM;QAGZ,aAAa,QAAQ,KAAK;EAE9B,CAAC;EACD,OAAO,YAAY;CACrB;CACA,IAAI,WACF,IAAI,eAAe;EACjB,MAAM,SAAS;EACf,OAAO,cAAc;CACvB;CAEF,MAAM,uBAAO,IAAI,IAA6B;CAC9C,IAAI,cAAc,IAA6B,UAAmC;EAChF,KAAK,IAAI,EAAE;EACX,aAAa,KAAK,OAAO,EAAE;CAC7B;CACA,MAAM,6BAAa,IAAI,IAA2B;CAClD,IAAI,aAAa,OAA8B;EAC7C,WAAW,IAAI,EAAE;EACjB,aAAa,WAAW,OAAO,EAAE;CACnC;CACA,OAAO;EAAE;EAAK;EAAM;CAAW;AACjC"}
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,21 +1,17 @@
1
- import { effectScope } from "../reactivity/core.mjs";
2
- import { createOptionsStyleStore } from "./define/optionsStyle.mjs";
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
- let instance;
9
- let created = false;
10
- const manager = createStore._instance;
11
- return function useStore() {
12
- if (created && instance) return instance;
13
- created = true;
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 {\n ActionSubscriber,\n DefineStoreOptions,\n OptionsStore,\n StoreManager,\n StoreSubscribeOptions,\n SubscriptionCallback,\n} from './types'\nimport { effectScope } from '../reactivity'\nimport { createOptionsStyleStore } from './define/optionsStyle'\nimport { createSetupStyleStore } from './define/setupStyle'\nimport { createStore } from './manager'\n\ntype SetupDefinition<T> = () => T\n\n/**\n * @description 定义一个 setup 风格的 store\n */\nexport function defineStore<T extends Record<string, any>>(id: string, setup: SetupDefinition<T>): () => T & {\n $id: string\n $patch: (patch: Record<string, any> | ((state: any) => void)) => void\n $reset: () => void\n $subscribe: (cb: SubscriptionCallback<any>, opts?: StoreSubscribeOptions) => () => void\n $onAction: (cb: ActionSubscriber<any>) => () => void\n}\n/**\n * @description 定义一个 options 风格的 store\n */\nexport function defineStore<S extends Record<string, any>, G extends Record<string, any>, A extends Record<string, any>>(\n id: string,\n options: DefineStoreOptions<S, G, A>,\n): () => OptionsStore<S, G, A>\nexport function defineStore(id: string, setupOrOptions: any) {\n let instance: any\n let created = false\n const manager = (createStore as any)._instance as StoreManager | undefined\n\n return function useStore(): any {\n if (created && instance) {\n return instance\n }\n created = true\n\n const storeScope = effectScope(true)\n instance = storeScope.run(() => {\n return typeof setupOrOptions === 'function'\n ? createSetupStyleStore(id, setupOrOptions, manager)\n : createOptionsStyleStore(id, setupOrOptions as DefineStoreOptions<any, any, any>, manager)\n })\n\n return instance\n }\n}\n"],"mappings":";;;;;;AAgCA,SAAgB,YAAY,IAAY,gBAAqB;CAC3D,IAAI;CACJ,IAAI,UAAU;CACd,MAAM,UAAW,YAAoB;CAErC,OAAO,SAAS,WAAgB;EAC9B,IAAI,WAAW,UACb,OAAO;EAET,UAAU;EAGV,WADmB,YAAY,IACX,CAAC,CAAC,UAAU;GAC9B,OAAO,OAAO,mBAAmB,aAC7B,sBAAsB,IAAI,gBAAgB,OAAO,IACjD,wBAAwB,IAAI,gBAAqD,OAAO;EAC9F,CAAC;EAED,OAAO;CACT;AACF"}
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,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
- * @description 创建 store 管理器(插件与共享实例入口)
4
- */
5
- function createStore() {
6
- const manager = {
7
- _stores: /* @__PURE__ */ new Map(),
8
- _plugins: [],
9
- install(_app) {},
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
- if (typeof plugin === "function") manager._plugins.push(plugin);
12
- return manager;
40
+ (pinia._a ? plugins : pending).push(plugin);
41
+ return pinia;
13
42
  }
14
- };
15
- createStore._instance = manager;
16
- return manager;
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 { StoreManager } from './types'\n\n/**\n * @description 创建 store 管理器(插件与共享实例入口)\n */\nexport function createStore(): StoreManager {\n const manager: StoreManager = {\n _stores: new Map(),\n _plugins: [],\n install(_app: any) {\n // 小程序场景不需要注册全局插件入口,这里保留 API 但不执行任何操作\n },\n use(plugin: (context: { store: any }) => void) {\n if (typeof plugin === 'function') {\n manager._plugins.push(plugin)\n }\n return manager\n },\n }\n ;(createStore as any)._instance = manager\n return manager\n}\n"],"mappings":";;;;AAKA,SAAgB,cAA4B;CAC1C,MAAM,UAAwB;EAC5B,yBAAS,IAAI,IAAI;EACjB,UAAU,CAAC;EACX,QAAQ,MAAW,CAEnB;EACA,IAAI,QAA2C;GAC7C,IAAI,OAAO,WAAW,YACpB,QAAQ,SAAS,KAAK,MAAM;GAE9B,OAAO;EACT;CACF;CACC,AAAC,YAAoB,YAAY;CAClC,OAAO;AACT"}
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,26 +1,18 @@
1
+ import { isReactive } from "../reactivity/reactive.mjs";
1
2
  import { isRef } from "../reactivity/ref.mjs";
2
- import { computed } from "../reactivity/computed.mjs";
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 in store) {
11
- const value = store[key];
12
- if (typeof value === "function") {
13
- result[key] = value;
14
- continue;
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\n/**\n * @description storeToRefs 返回类型推导\n */\nexport type StoreToRefsResult<T extends Record<string, any>> = {\n [K in keyof T]:\n T[K] extends (...args: any[]) => any\n ? T[K]\n : T[K] extends Ref<infer V>\n ? Ref<V>\n : Ref<T[K]>\n}\n\n/**\n * @description 将 store 状态转换为 Ref\n */\nexport function storeToRefs<T extends Record<string, any>>(store: T): StoreToRefsResult<T> {\n const result: Record<string, any> = {}\n for (const key in store) {\n const value = (store as any)[key]\n if (typeof value === 'function') {\n result[key] = value\n continue\n }\n if (isRef(value)) {\n result[key] = value\n }\n else {\n result[key] = computed({\n get: () => (store as any)[key],\n set: (v: any) => {\n ;(store as any)[key] = v\n },\n })\n }\n }\n return result as StoreToRefsResult<T>\n}\n"],"mappings":";;;;;;;AAkBA,SAAgB,YAA2C,OAAgC;CACzF,MAAM,SAA8B,CAAC;CACrC,KAAK,MAAM,OAAO,OAAO;EACvB,MAAM,QAAS,MAAc;EAC7B,IAAI,OAAO,UAAU,YAAY;GAC/B,OAAO,OAAO;GACd;EACF;EACA,IAAI,MAAM,KAAK,GACb,OAAO,OAAO;OAGd,OAAO,OAAO,SAAS;GACrB,WAAY,MAAc;GAC1B,MAAM,MAAW;IACd,AAAC,MAAc,OAAO;GACzB;EACF,CAAC;CAEL;CACA,OAAO;AACT"}
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"}
@@ -0,0 +1,11 @@
1
+ //#region src/store/types.ts
2
+ /** 与 Pinia 一致的变更类型和值。 */
3
+ const MutationType = {
4
+ direct: "direct",
5
+ patchObject: "patch object",
6
+ patchFunction: "patch function"
7
+ };
8
+
9
+ //#endregion
10
+ export { MutationType };
11
+ //# sourceMappingURL=types.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.mjs","names":[],"sources":["../../../src/store/types.ts"],"sourcesContent":["import type { UnwrapRef } from 'vue'\nimport type { ComputedRef, Ref, WritableComputedRef } from '../reactivity'\nimport type { EffectScope } from '../reactivity/core'\nimport type { WatchOptions } from '../reactivity/watch/types'\n\n/** 与 Pinia 一致的变更类型和值。 */\nexport const MutationType = {\n direct: 'direct',\n patchObject: 'patch object',\n patchFunction: 'patch function',\n} as const\n// eslint-disable-next-line ts/no-redeclare -- 与 Pinia 一致,同时导出类型和运行时值\nexport type MutationType = typeof MutationType[keyof typeof MutationType]\nexport type StateTree = Record<PropertyKey, any>\nexport type DeepPartial<T> = { [K in keyof T]?: DeepPartial<T[K]> }\nexport type SubscriptionCallbackMutation<S>\n = | { type: 'direct' | 'patch function', storeId: string }\n | { type: 'patch object', storeId: string, payload: DeepPartial<S> }\nexport interface SubscriptionCallback<S = any> {\n (mutation: SubscriptionCallbackMutation<S>, state: S): void\n}\n/** detached 订阅不随注册时的页面或组件作用域卸载。 */\nexport interface StoreSubscribeOptions extends WatchOptions<boolean> {\n detached?: boolean\n}\nexport interface ActionContext<TStore = any, TResult = any> {\n name: string\n store: TStore\n args: any[]\n after: (callback: (result: TResult) => void) => void\n onError: (callback: (error: any) => void) => void\n}\nexport interface ActionSubscriber<TStore = any, TResult = any> {\n (context: ActionContext<TStore, TResult>): void\n}\nexport interface PiniaPluginContext {\n store: any\n pinia: Pinia\n app: any\n options: Record<string, any>\n}\nexport interface PiniaPlugin {\n (context: PiniaPluginContext): Partial<PiniaCustomProperties> & Record<string, any> | void\n}\n/** 应用的 Store 管理器,独立保存实例与状态。 */\nexport interface Pinia {\n state: Ref<Record<string, StateTree>>\n install: (app: any) => void\n use: (plugin: PiniaPlugin) => Pinia\n _e: EffectScope\n _s: Map<string, any>\n _p: PiniaPlugin[]\n _a: any\n /** @deprecated 使用公开的 Pinia API。 */\n _stores: Map<string, any>\n /** @deprecated 使用 use() 注册插件。 */\n _plugins: PiniaPlugin[]\n}\n/** createStore 返回的管理器,与 Pinia 使用同一类型契约。 */\nexport type StoreManager = Pinia\n\nexport interface PiniaCustomProperties {}\n\n// eslint-disable-next-line ts/no-unused-vars -- 保留 Pinia 的泛型参数名,供消费者声明合并\nexport interface PiniaCustomStateProperties<S extends StateTree = StateTree> {}\n\nexport interface StoreDefinition<Id extends string = string, T = any> {\n (pinia?: Pinia | null): T\n $id: Id\n}\nexport interface StoreSetupOptions { [key: string]: any }\nexport type GetterTree<S extends Record<string, any>> = Record<string, (state: S) => any>\nexport type StoreGetters<G> = { readonly [K in keyof G]: G[K] extends (...args: any[]) => infer R ? R : never }\n/** 通过 action 名称同时收窄参数与异步解包后的返回值。 */\ntype StoreActionContext<TStore, A> = {\n [K in keyof A]: A[K] extends (...args: infer Args) => infer Result\n ? Omit<ActionContext<TStore, Awaited<Result>>, 'name' | 'args'> & { name: K, args: Args }\n : never\n}[keyof A]\nexport interface StoreApi<Id extends string, S, TStore, A> {\n $id: Id\n $state: keyof PiniaCustomStateProperties extends never ? S : S & PiniaCustomStateProperties\n $patch: (patch: DeepPartial<S> | ((state: S) => void)) => void\n $reset: () => void\n $subscribe: (callback: SubscriptionCallback<S>, options?: StoreSubscribeOptions) => () => void\n $onAction: (callback: (context: StoreActionContext<TStore, A>) => void, detached?: boolean) => () => void\n $dispose: () => void\n}\nexport type OptionsStore<S extends Record<string, any>, G extends Record<string, any>, A extends Record<string, any>, Id extends string = string>\n = UnwrapRef<S> & StoreGetters<G> & A & PiniaCustomProperties & PiniaCustomStateProperties<S>\n & StoreApi<Id, UnwrapRef<S>, OptionsStore<S, G, A, Id>, A>\nexport interface DefineStoreOptions<S extends Record<string, any>, G extends Record<string, any>, A extends Record<string, any>> {\n state?: () => S\n getters?: G & Record<string, (state: UnwrapRef<S>) => any> & ThisType<OptionsStore<S, G, A>>\n actions?: A & ThisType<OptionsStore<S, G, A>>\n [key: string]: any\n}\ntype SetupActions<T> = { [K in keyof T as T[K] extends (...args: any[]) => any ? K : never]: T[K] }\ntype SetupState<T> = { [K in keyof T as T[K] extends ComputedRef<any> | WritableComputedRef<any> | ((...args: any[]) => any) ? never : K]: UnwrapRef<T[K]> }\ntype SetupValues<T> = { [K in keyof T as T[K] extends ComputedRef<any> ? never : K]: UnwrapRef<T[K]> }\n & { readonly [K in keyof T as T[K] extends ComputedRef<any> ? K : never]: UnwrapRef<T[K]> }\nexport type SetupStore<Id extends string, T extends Record<string, any>> = SetupValues<T> & PiniaCustomProperties\n & StoreApi<Id, SetupState<T>, SetupStore<Id, T>, SetupActions<T>>\nexport type StoreGeneric = Record<string, any> & StoreApi<string, any, any, any>\nexport type StoreState<T extends StoreGeneric> = T['$state']\nexport type StoreActions<T extends StoreGeneric> = SetupActions<Omit<T, keyof StoreApi<any, any, any, any>>>\nexport type StoreGettersType<T extends StoreGeneric> = Omit<T, keyof StoreState<T> | keyof StoreActions<T> | keyof StoreApi<any, any, any, any>>\n"],"mappings":";;AAMA,MAAa,eAAe;CAC1B,QAAQ;CACR,aAAa;CACb,eAAe;AACjB"}
@@ -7,43 +7,7 @@ function isPlainObject(val) {
7
7
  const proto = Object.getPrototypeOf(val);
8
8
  return proto === Object.prototype || proto === null;
9
9
  }
10
- function mergeShallow(target, patch) {
11
- for (const k in patch) target[k] = patch[k];
12
- }
13
- function cloneDeep(value) {
14
- if (Array.isArray(value)) return value.map((item) => cloneDeep(item));
15
- if (isPlainObject(value)) {
16
- const result = {};
17
- for (const key in value) result[key] = cloneDeep(value[key]);
18
- return result;
19
- }
20
- return value;
21
- }
22
- function resetObject(target, snapshot) {
23
- if (Array.isArray(target) && Array.isArray(snapshot)) {
24
- target.length = 0;
25
- snapshot.forEach((item, index) => {
26
- target[index] = cloneDeep(item);
27
- });
28
- return;
29
- }
30
- if (!isObject(snapshot)) return;
31
- for (const key in target) if (!(key in snapshot)) delete target[key];
32
- for (const key in snapshot) {
33
- const snapValue = snapshot[key];
34
- const currentValue = target[key];
35
- if (Array.isArray(snapValue) && Array.isArray(currentValue)) {
36
- resetObject(currentValue, snapValue);
37
- continue;
38
- }
39
- if (isPlainObject(snapValue) && isPlainObject(currentValue)) {
40
- resetObject(currentValue, snapValue);
41
- continue;
42
- }
43
- target[key] = cloneDeep(snapValue);
44
- }
45
- }
46
10
 
47
11
  //#endregion
48
- export { cloneDeep, isObject, isPlainObject, mergeShallow, resetObject };
12
+ export { isObject, isPlainObject };
49
13
  //# sourceMappingURL=utils.mjs.map