@composy/store-core 0.0.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 (272) hide show
  1. package/CHANGELOG.md +5 -0
  2. package/README.md +172 -0
  3. package/dist/index.js +1852 -0
  4. package/dist/index.js.map +1 -0
  5. package/dist/index.min.js +1082 -0
  6. package/dist/index.min.js.map +1 -0
  7. package/es/core/async-action.d.ts +95 -0
  8. package/es/core/async-action.d.ts.map +1 -0
  9. package/es/core/async-action.js +116 -0
  10. package/es/core/async-action.js.map +1 -0
  11. package/es/core/base-store.d.ts +85 -0
  12. package/es/core/base-store.d.ts.map +1 -0
  13. package/es/core/base-store.js +185 -0
  14. package/es/core/base-store.js.map +1 -0
  15. package/es/core/batch-manager.d.ts +46 -0
  16. package/es/core/batch-manager.d.ts.map +1 -0
  17. package/es/core/batch-manager.js +64 -0
  18. package/es/core/batch-manager.js.map +1 -0
  19. package/es/core/create-store.d.ts +66 -0
  20. package/es/core/create-store.d.ts.map +1 -0
  21. package/es/core/create-store.js +29 -0
  22. package/es/core/create-store.js.map +1 -0
  23. package/es/core/event-bus.d.ts +34 -0
  24. package/es/core/event-bus.d.ts.map +1 -0
  25. package/es/core/event-bus.js +71 -0
  26. package/es/core/event-bus.js.map +1 -0
  27. package/es/core/index.d.ts +14 -0
  28. package/es/core/index.d.ts.map +1 -0
  29. package/es/core/index.js +17 -0
  30. package/es/core/pub-sub.d.ts +41 -0
  31. package/es/core/pub-sub.d.ts.map +1 -0
  32. package/es/core/pub-sub.js +71 -0
  33. package/es/core/pub-sub.js.map +1 -0
  34. package/es/engine/index.d.ts +10 -0
  35. package/es/engine/index.d.ts.map +1 -0
  36. package/es/engine/index.js +12 -0
  37. package/es/engine/plugin.d.ts +20 -0
  38. package/es/engine/plugin.d.ts.map +1 -0
  39. package/es/engine/plugin.js +153 -0
  40. package/es/engine/plugin.js.map +1 -0
  41. package/es/engine/types.d.ts +81 -0
  42. package/es/engine/types.d.ts.map +1 -0
  43. package/es/engine/types.js +10 -0
  44. package/es/errors/index.d.ts +208 -0
  45. package/es/errors/index.d.ts.map +1 -0
  46. package/es/errors/index.js +217 -0
  47. package/es/errors/index.js.map +1 -0
  48. package/es/index.d.ts +27 -0
  49. package/es/index.d.ts.map +1 -0
  50. package/es/index.js +34 -0
  51. package/es/index.js.map +1 -0
  52. package/es/middleware/index.d.ts +13 -0
  53. package/es/middleware/index.d.ts.map +1 -0
  54. package/es/middleware/index.js +16 -0
  55. package/es/middleware/logger.d.ts +67 -0
  56. package/es/middleware/logger.d.ts.map +1 -0
  57. package/es/middleware/logger.js +136 -0
  58. package/es/middleware/logger.js.map +1 -0
  59. package/es/middleware/middleware-manager.d.ts +40 -0
  60. package/es/middleware/middleware-manager.d.ts.map +1 -0
  61. package/es/middleware/middleware-manager.js +79 -0
  62. package/es/middleware/middleware-manager.js.map +1 -0
  63. package/es/middleware/persist.d.ts +34 -0
  64. package/es/middleware/persist.d.ts.map +1 -0
  65. package/es/middleware/persist.js +102 -0
  66. package/es/middleware/persist.js.map +1 -0
  67. package/es/middleware/time-travel.d.ts +30 -0
  68. package/es/middleware/time-travel.d.ts.map +1 -0
  69. package/es/middleware/time-travel.js +151 -0
  70. package/es/middleware/time-travel.js.map +1 -0
  71. package/es/middleware/validation.d.ts +100 -0
  72. package/es/middleware/validation.d.ts.map +1 -0
  73. package/es/middleware/validation.js +74 -0
  74. package/es/middleware/validation.js.map +1 -0
  75. package/es/plugins/define-plugin.d.ts +74 -0
  76. package/es/plugins/define-plugin.d.ts.map +1 -0
  77. package/es/plugins/define-plugin.js +52 -0
  78. package/es/plugins/define-plugin.js.map +1 -0
  79. package/es/plugins/index.d.ts +8 -0
  80. package/es/plugins/index.d.ts.map +1 -0
  81. package/es/plugins/index.js +13 -0
  82. package/es/plugins/plugin-manager.d.ts +35 -0
  83. package/es/plugins/plugin-manager.d.ts.map +1 -0
  84. package/es/plugins/plugin-manager.js +77 -0
  85. package/es/plugins/plugin-manager.js.map +1 -0
  86. package/es/types/index.d.ts +12 -0
  87. package/es/types/index.d.ts.map +1 -0
  88. package/es/types/index.js +10 -0
  89. package/es/types/middleware.d.ts +172 -0
  90. package/es/types/middleware.d.ts.map +1 -0
  91. package/es/types/middleware.js +10 -0
  92. package/es/types/plugin.d.ts +136 -0
  93. package/es/types/plugin.d.ts.map +1 -0
  94. package/es/types/plugin.js +10 -0
  95. package/es/types/store.d.ts +198 -0
  96. package/es/types/store.d.ts.map +1 -0
  97. package/es/types/store.js +10 -0
  98. package/es/types/subscription.d.ts +158 -0
  99. package/es/types/subscription.d.ts.map +1 -0
  100. package/es/types/subscription.js +10 -0
  101. package/es/types/utility.d.ts +312 -0
  102. package/es/types/utility.d.ts.map +1 -0
  103. package/es/types/utility.js +10 -0
  104. package/es/utils/debounce-throttle.d.ts +86 -0
  105. package/es/utils/debounce-throttle.d.ts.map +1 -0
  106. package/es/utils/debounce-throttle.js +86 -0
  107. package/es/utils/debounce-throttle.js.map +1 -0
  108. package/es/utils/deep-clone.d.ts +143 -0
  109. package/es/utils/deep-clone.d.ts.map +1 -0
  110. package/es/utils/deep-clone.js +193 -0
  111. package/es/utils/deep-clone.js.map +1 -0
  112. package/es/utils/index.d.ts +13 -0
  113. package/es/utils/index.d.ts.map +1 -0
  114. package/es/utils/index.js +14 -0
  115. package/es/utils/selector.d.ts +213 -0
  116. package/es/utils/selector.d.ts.map +1 -0
  117. package/es/utils/selector.js +151 -0
  118. package/es/utils/selector.js.map +1 -0
  119. package/esm/core/async-action.d.ts +95 -0
  120. package/esm/core/async-action.js +116 -0
  121. package/esm/core/async-action.js.map +1 -0
  122. package/esm/core/base-store.d.ts +85 -0
  123. package/esm/core/base-store.js +185 -0
  124. package/esm/core/base-store.js.map +1 -0
  125. package/esm/core/batch-manager.d.ts +46 -0
  126. package/esm/core/batch-manager.js +64 -0
  127. package/esm/core/batch-manager.js.map +1 -0
  128. package/esm/core/create-store.d.ts +66 -0
  129. package/esm/core/create-store.js +29 -0
  130. package/esm/core/create-store.js.map +1 -0
  131. package/esm/core/event-bus.d.ts +34 -0
  132. package/esm/core/event-bus.js +71 -0
  133. package/esm/core/event-bus.js.map +1 -0
  134. package/esm/core/index.d.ts +14 -0
  135. package/esm/core/index.js +17 -0
  136. package/esm/core/pub-sub.d.ts +41 -0
  137. package/esm/core/pub-sub.js +71 -0
  138. package/esm/core/pub-sub.js.map +1 -0
  139. package/esm/engine/index.d.ts +10 -0
  140. package/esm/engine/index.js +12 -0
  141. package/esm/engine/plugin.d.ts +20 -0
  142. package/esm/engine/plugin.js +153 -0
  143. package/esm/engine/plugin.js.map +1 -0
  144. package/esm/engine/types.d.ts +81 -0
  145. package/esm/errors/index.d.ts +208 -0
  146. package/esm/errors/index.js +217 -0
  147. package/esm/errors/index.js.map +1 -0
  148. package/esm/index.d.ts +27 -0
  149. package/esm/index.js +36 -0
  150. package/esm/index.js.map +1 -0
  151. package/esm/middleware/index.d.ts +13 -0
  152. package/esm/middleware/logger.d.ts +67 -0
  153. package/esm/middleware/logger.js +119 -0
  154. package/esm/middleware/logger.js.map +1 -0
  155. package/esm/middleware/middleware-manager.d.ts +40 -0
  156. package/esm/middleware/middleware-manager.js +79 -0
  157. package/esm/middleware/middleware-manager.js.map +1 -0
  158. package/esm/middleware/persist.d.ts +34 -0
  159. package/esm/middleware/persist.js +102 -0
  160. package/esm/middleware/persist.js.map +1 -0
  161. package/esm/middleware/time-travel.d.ts +30 -0
  162. package/esm/middleware/time-travel.js +151 -0
  163. package/esm/middleware/time-travel.js.map +1 -0
  164. package/esm/middleware/validation.d.ts +100 -0
  165. package/esm/middleware/validation.js +74 -0
  166. package/esm/middleware/validation.js.map +1 -0
  167. package/esm/plugins/define-plugin.d.ts +74 -0
  168. package/esm/plugins/define-plugin.js +52 -0
  169. package/esm/plugins/define-plugin.js.map +1 -0
  170. package/esm/plugins/index.d.ts +8 -0
  171. package/esm/plugins/plugin-manager.d.ts +35 -0
  172. package/esm/plugins/plugin-manager.js +77 -0
  173. package/esm/plugins/plugin-manager.js.map +1 -0
  174. package/esm/types/index.d.ts +12 -0
  175. package/esm/types/middleware.d.ts +172 -0
  176. package/esm/types/plugin.d.ts +136 -0
  177. package/esm/types/store.d.ts +198 -0
  178. package/esm/types/subscription.d.ts +158 -0
  179. package/esm/types/utility.d.ts +312 -0
  180. package/esm/utils/debounce-throttle.d.ts +86 -0
  181. package/esm/utils/debounce-throttle.js +86 -0
  182. package/esm/utils/debounce-throttle.js.map +1 -0
  183. package/esm/utils/deep-clone.d.ts +143 -0
  184. package/esm/utils/deep-clone.js +193 -0
  185. package/esm/utils/deep-clone.js.map +1 -0
  186. package/esm/utils/index.d.ts +13 -0
  187. package/esm/utils/selector.d.ts +213 -0
  188. package/esm/utils/selector.js +151 -0
  189. package/esm/utils/selector.js.map +1 -0
  190. package/lib/core/async-action.cjs +118 -0
  191. package/lib/core/async-action.cjs.map +1 -0
  192. package/lib/core/async-action.d.ts +95 -0
  193. package/lib/core/base-store.cjs +187 -0
  194. package/lib/core/base-store.cjs.map +1 -0
  195. package/lib/core/base-store.d.ts +85 -0
  196. package/lib/core/batch-manager.cjs +69 -0
  197. package/lib/core/batch-manager.cjs.map +1 -0
  198. package/lib/core/batch-manager.d.ts +46 -0
  199. package/lib/core/create-store.cjs +31 -0
  200. package/lib/core/create-store.cjs.map +1 -0
  201. package/lib/core/create-store.d.ts +66 -0
  202. package/lib/core/event-bus.cjs +74 -0
  203. package/lib/core/event-bus.cjs.map +1 -0
  204. package/lib/core/event-bus.d.ts +34 -0
  205. package/lib/core/index.cjs +29 -0
  206. package/lib/core/index.d.ts +14 -0
  207. package/lib/core/pub-sub.cjs +74 -0
  208. package/lib/core/pub-sub.cjs.map +1 -0
  209. package/lib/core/pub-sub.d.ts +41 -0
  210. package/lib/engine/index.cjs +16 -0
  211. package/lib/engine/index.d.ts +10 -0
  212. package/lib/engine/plugin.cjs +157 -0
  213. package/lib/engine/plugin.cjs.map +1 -0
  214. package/lib/engine/plugin.d.ts +20 -0
  215. package/lib/engine/types.cjs +12 -0
  216. package/lib/engine/types.d.ts +81 -0
  217. package/lib/errors/index.cjs +233 -0
  218. package/lib/errors/index.cjs.map +1 -0
  219. package/lib/errors/index.d.ts +208 -0
  220. package/lib/index.cjs +101 -0
  221. package/lib/index.cjs.map +1 -0
  222. package/lib/index.d.ts +27 -0
  223. package/lib/middleware/index.cjs +28 -0
  224. package/lib/middleware/index.d.ts +13 -0
  225. package/lib/middleware/logger.cjs +140 -0
  226. package/lib/middleware/logger.cjs.map +1 -0
  227. package/lib/middleware/logger.d.ts +67 -0
  228. package/lib/middleware/middleware-manager.cjs +83 -0
  229. package/lib/middleware/middleware-manager.cjs.map +1 -0
  230. package/lib/middleware/middleware-manager.d.ts +40 -0
  231. package/lib/middleware/persist.cjs +105 -0
  232. package/lib/middleware/persist.cjs.map +1 -0
  233. package/lib/middleware/persist.d.ts +34 -0
  234. package/lib/middleware/time-travel.cjs +154 -0
  235. package/lib/middleware/time-travel.cjs.map +1 -0
  236. package/lib/middleware/time-travel.d.ts +30 -0
  237. package/lib/middleware/validation.cjs +76 -0
  238. package/lib/middleware/validation.cjs.map +1 -0
  239. package/lib/middleware/validation.d.ts +100 -0
  240. package/lib/package.json +3 -0
  241. package/lib/plugins/define-plugin.cjs +56 -0
  242. package/lib/plugins/define-plugin.cjs.map +1 -0
  243. package/lib/plugins/define-plugin.d.ts +74 -0
  244. package/lib/plugins/index.cjs +20 -0
  245. package/lib/plugins/index.d.ts +8 -0
  246. package/lib/plugins/plugin-manager.cjs +81 -0
  247. package/lib/plugins/plugin-manager.cjs.map +1 -0
  248. package/lib/plugins/plugin-manager.d.ts +35 -0
  249. package/lib/types/index.cjs +12 -0
  250. package/lib/types/index.d.ts +12 -0
  251. package/lib/types/middleware.cjs +12 -0
  252. package/lib/types/middleware.d.ts +172 -0
  253. package/lib/types/plugin.cjs +12 -0
  254. package/lib/types/plugin.d.ts +136 -0
  255. package/lib/types/store.cjs +12 -0
  256. package/lib/types/store.d.ts +198 -0
  257. package/lib/types/subscription.cjs +12 -0
  258. package/lib/types/subscription.d.ts +158 -0
  259. package/lib/types/utility.cjs +12 -0
  260. package/lib/types/utility.d.ts +312 -0
  261. package/lib/utils/debounce-throttle.cjs +89 -0
  262. package/lib/utils/debounce-throttle.cjs.map +1 -0
  263. package/lib/utils/debounce-throttle.d.ts +86 -0
  264. package/lib/utils/deep-clone.cjs +202 -0
  265. package/lib/utils/deep-clone.cjs.map +1 -0
  266. package/lib/utils/deep-clone.d.ts +143 -0
  267. package/lib/utils/index.cjs +34 -0
  268. package/lib/utils/index.d.ts +13 -0
  269. package/lib/utils/selector.cjs +161 -0
  270. package/lib/utils/selector.cjs.map +1 -0
  271. package/lib/utils/selector.d.ts +213 -0
  272. package/package.json +155 -0
@@ -0,0 +1,153 @@
1
+ /*!
2
+ * ***********************************
3
+ * @composy/store-core v0.0.1 *
4
+ * Built with rollup *
5
+ * Build time: 2024-08-17 11:27:33 *
6
+ * Build mode: production *
7
+ * Minified: No *
8
+ * ***********************************
9
+ */
10
+ import { globalEventBus } from "../core/event-bus.js";
11
+ //#region src/engine/plugin.ts
12
+ const storeStateKeys = {
13
+ BUS: "store:bus",
14
+ PINIA: "store:pinia",
15
+ API: "store:api",
16
+ REGISTRY: "store:registry",
17
+ RUNTIME: "store:runtime"
18
+ };
19
+ const storeEventKeys = {
20
+ INSTALLED: "store:installed",
21
+ UNINSTALLED: "store:uninstalled"
22
+ };
23
+ function resolveEngine(context) {
24
+ const value = context;
25
+ if (value && typeof value === "object" && "engine" in value) return value.engine ?? {};
26
+ return value ?? {};
27
+ }
28
+ function resolvePluginContext(context) {
29
+ return context && typeof context === "object" ? context : void 0;
30
+ }
31
+ function resolveDefaultApp(engine, context, payload) {
32
+ const payloadObject = payload;
33
+ return payloadObject?.app ?? payloadObject?.framework?.app ?? engine.getApp?.() ?? context?.framework?.app;
34
+ }
35
+ function createRegisteredApi(name, version, runtime) {
36
+ return {
37
+ name,
38
+ version,
39
+ pinia: runtime.pinia,
40
+ getStore: runtime.storeAPI.getStore,
41
+ hasStore: runtime.storeAPI.hasStore,
42
+ getStoreIds: runtime.storeAPI.getStoreIds,
43
+ resetAll: runtime.storeAPI.resetAll
44
+ };
45
+ }
46
+ function registerEngineApi(engine, name, version, runtime) {
47
+ if (!engine.api?.register) return;
48
+ const api = createRegisteredApi(name, version, runtime);
49
+ engine.api.unregister?.(name);
50
+ if (engine.api.register.length >= 2) {
51
+ engine.api.register(name, api);
52
+ return;
53
+ }
54
+ engine.api.register(api);
55
+ }
56
+ function syncEngineState(engine, name, options, runtime) {
57
+ engine.state?.set?.(storeStateKeys.RUNTIME, runtime);
58
+ engine.state?.set?.(storeStateKeys.PINIA, runtime.pinia);
59
+ engine.state?.set?.(storeStateKeys.API, runtime.storeAPI);
60
+ engine.state?.set?.(storeStateKeys.REGISTRY, runtime.registry);
61
+ engine.state?.set?.(storeStateKeys.BUS, globalEventBus);
62
+ engine.state?.set?.(`plugins.${name}`, runtime.storeAPI);
63
+ engine.state?.set?.(`plugins.${name}.config`, options);
64
+ }
65
+ function clearEngineState(engine, name) {
66
+ engine.state?.delete?.(storeStateKeys.RUNTIME);
67
+ engine.state?.delete?.(storeStateKeys.PINIA);
68
+ engine.state?.delete?.(storeStateKeys.API);
69
+ engine.state?.delete?.(storeStateKeys.REGISTRY);
70
+ engine.state?.delete?.(storeStateKeys.BUS);
71
+ engine.state?.delete?.(`plugins.${name}`);
72
+ engine.state?.delete?.(`plugins.${name}.config`);
73
+ }
74
+ function registerContainerServices(context, runtime) {
75
+ if (!context?.container?.singleton) return;
76
+ try {
77
+ context.container.singleton("pinia", runtime.pinia);
78
+ context.container.singleton("storeAPI", runtime.storeAPI);
79
+ context.container.singleton("storeRegistry", runtime.registry);
80
+ context.container.singleton("storeRuntime", runtime);
81
+ } catch {}
82
+ }
83
+ function createStoreEngineBridge(options) {
84
+ const { createRuntime, debug = false, name = "store", onRuntimeChange, version = "1.0.0" } = options;
85
+ let activeEngine = {};
86
+ let activeContext;
87
+ let runtime = null;
88
+ let runtimeOwner = null;
89
+ const bindRuntime = (nextRuntime, owner) => {
90
+ const previousRuntime = runtime;
91
+ const previousOwner = runtimeOwner;
92
+ runtime = nextRuntime;
93
+ runtimeOwner = owner;
94
+ onRuntimeChange?.(nextRuntime);
95
+ syncEngineState(activeEngine, name, options, nextRuntime);
96
+ registerEngineApi(activeEngine, name, version, nextRuntime);
97
+ registerContainerServices(activeContext, nextRuntime);
98
+ if (previousRuntime && previousRuntime !== nextRuntime && previousOwner === "engine") previousRuntime.dispose?.();
99
+ return nextRuntime;
100
+ };
101
+ const ensureRuntime = () => {
102
+ if (runtime && runtimeOwner === "engine") return runtime;
103
+ return createRuntime();
104
+ };
105
+ const attachToApp = (app) => {
106
+ const installedRuntime = options.getRuntimeFromApp?.(app);
107
+ if (installedRuntime) return bindRuntime(installedRuntime, "external");
108
+ const nextRuntime = ensureRuntime();
109
+ const mountedRuntime = options.attachToApp ? options.attachToApp(app, nextRuntime) : nextRuntime;
110
+ return bindRuntime(mountedRuntime, mountedRuntime === nextRuntime ? "engine" : "external");
111
+ };
112
+ const install = async (context) => {
113
+ activeEngine = resolveEngine(context);
114
+ activeContext = resolvePluginContext(context);
115
+ const app = options.resolveApp ? options.resolveApp(activeEngine, activeContext ?? {}, void 0) : resolveDefaultApp(activeEngine, activeContext);
116
+ if (app && (!options.isApp || options.isApp(app))) attachToApp(app);
117
+ else {
118
+ bindRuntime(ensureRuntime(), "engine");
119
+ activeEngine.events?.once?.("app:created", (payload) => {
120
+ const createdApp = options.resolveApp ? options.resolveApp(activeEngine, activeContext ?? {}, payload) : resolveDefaultApp(activeEngine, activeContext, payload);
121
+ if (createdApp && (!options.isApp || options.isApp(createdApp))) attachToApp(createdApp);
122
+ });
123
+ }
124
+ await activeEngine.events?.emit?.(storeEventKeys.INSTALLED, {
125
+ name,
126
+ version,
127
+ pinia: runtime?.pinia,
128
+ storeAPI: runtime?.storeAPI
129
+ });
130
+ if (debug) activeEngine.logger?.info?.("[StoreEngineBridge] installed");
131
+ };
132
+ const uninstall = async (context) => {
133
+ const engine = context ? resolveEngine(context) : activeEngine;
134
+ engine.api?.unregister?.(name);
135
+ clearEngineState(engine, name);
136
+ await engine.events?.emit?.(storeEventKeys.UNINSTALLED, { name });
137
+ if (runtime && runtimeOwner === "engine") runtime.dispose?.();
138
+ runtime = null;
139
+ runtimeOwner = null;
140
+ onRuntimeChange?.(null);
141
+ if (debug) engine.logger?.info?.("[StoreEngineBridge] uninstalled");
142
+ };
143
+ return {
144
+ attachToApp,
145
+ getRuntime: () => runtime,
146
+ install,
147
+ uninstall
148
+ };
149
+ }
150
+ //#endregion
151
+ export { createStoreEngineBridge, storeEventKeys, storeStateKeys };
152
+ /*! End of @composy/store-core | Powered by @composy/builder */
153
+ //# sourceMappingURL=plugin.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plugin.js","names":[],"sources":["../../src/engine/plugin.ts"],"sourcesContent":["/**\n * @composy/store-core Engine 桥接能力\n *\n * Core 负责 engine 生命周期、state/API 同步和事件派发;框架适配层只提供 runtime 创建与 App 挂载。\n * @module engine/plugin\n */\n\nimport type {\n StoreEngineBridge,\n StoreEngineBridgeOptions,\n StoreEngineLike,\n StoreEnginePluginContextLike,\n StoreEngineRegisteredApi,\n StoreRuntimeLike,\n} from './types'\nimport { globalEventBus } from '../core/event-bus'\n\nexport const storeStateKeys = {\n BUS: 'store:bus' as const,\n PINIA: 'store:pinia' as const,\n API: 'store:api' as const,\n REGISTRY: 'store:registry' as const,\n RUNTIME: 'store:runtime' as const,\n} as const\n\nexport const storeEventKeys = {\n INSTALLED: 'store:installed' as const,\n UNINSTALLED: 'store:uninstalled' as const,\n} as const\n\ntype RuntimeOwner = 'engine' | 'external'\n\nfunction resolveEngine(context: unknown): StoreEngineLike {\n const value = context as StoreEnginePluginContextLike | StoreEngineLike | null | undefined\n if (value && typeof value === 'object' && 'engine' in value) {\n return value.engine ?? {}\n }\n\n return (value ?? {}) as StoreEngineLike\n}\n\nfunction resolvePluginContext(context: unknown): StoreEnginePluginContextLike | undefined {\n return context && typeof context === 'object'\n ? context as StoreEnginePluginContextLike\n : undefined\n}\n\nfunction resolveDefaultApp(\n engine: StoreEngineLike,\n context: StoreEnginePluginContextLike | undefined,\n payload?: unknown,\n): unknown {\n const payloadObject = payload as { app?: unknown; framework?: { app?: unknown } } | undefined\n return payloadObject?.app\n ?? payloadObject?.framework?.app\n ?? engine.getApp?.()\n ?? context?.framework?.app\n}\n\nfunction createRegisteredApi(\n name: string,\n version: string,\n runtime: StoreRuntimeLike,\n): StoreEngineRegisteredApi {\n return {\n name,\n version,\n pinia: runtime.pinia,\n getStore: runtime.storeAPI.getStore,\n hasStore: runtime.storeAPI.hasStore,\n getStoreIds: runtime.storeAPI.getStoreIds,\n resetAll: runtime.storeAPI.resetAll,\n }\n}\n\nfunction registerEngineApi(\n engine: StoreEngineLike,\n name: string,\n version: string,\n runtime: StoreRuntimeLike,\n): void {\n if (!engine.api?.register) {\n return\n }\n\n const api = createRegisteredApi(name, version, runtime)\n engine.api.unregister?.(name)\n\n if (engine.api.register.length >= 2) {\n ;(engine.api.register as (name: string, api: StoreEngineRegisteredApi) => void)(name, api)\n return\n }\n\n ;(engine.api.register as (api: StoreEngineRegisteredApi) => void)(api)\n}\n\nfunction syncEngineState<Runtime extends StoreRuntimeLike>(\n engine: StoreEngineLike,\n name: string,\n options: StoreEngineBridgeOptions<Runtime>,\n runtime: Runtime,\n): void {\n engine.state?.set?.(storeStateKeys.RUNTIME, runtime)\n engine.state?.set?.(storeStateKeys.PINIA, runtime.pinia)\n engine.state?.set?.(storeStateKeys.API, runtime.storeAPI)\n engine.state?.set?.(storeStateKeys.REGISTRY, runtime.registry)\n engine.state?.set?.(storeStateKeys.BUS, globalEventBus)\n engine.state?.set?.(`plugins.${name}`, runtime.storeAPI)\n engine.state?.set?.(`plugins.${name}.config`, options)\n}\n\nfunction clearEngineState(engine: StoreEngineLike, name: string): void {\n engine.state?.delete?.(storeStateKeys.RUNTIME)\n engine.state?.delete?.(storeStateKeys.PINIA)\n engine.state?.delete?.(storeStateKeys.API)\n engine.state?.delete?.(storeStateKeys.REGISTRY)\n engine.state?.delete?.(storeStateKeys.BUS)\n engine.state?.delete?.(`plugins.${name}`)\n engine.state?.delete?.(`plugins.${name}.config`)\n}\n\nfunction registerContainerServices(\n context: StoreEnginePluginContextLike | undefined,\n runtime: StoreRuntimeLike,\n): void {\n if (!context?.container?.singleton) {\n return\n }\n\n try {\n context.container.singleton('pinia', runtime.pinia)\n context.container.singleton('storeAPI', runtime.storeAPI)\n context.container.singleton('storeRegistry', runtime.registry)\n context.container.singleton('storeRuntime', runtime)\n }\n catch {\n // 同一个 engine 重复安装时可能已存在单例,保持幂等即可。\n }\n}\n\nexport function createStoreEngineBridge<Runtime extends StoreRuntimeLike>(\n options: StoreEngineBridgeOptions<Runtime>,\n): StoreEngineBridge {\n const {\n createRuntime,\n debug = false,\n name = 'store',\n onRuntimeChange,\n version = '1.0.0',\n } = options\n\n let activeEngine: StoreEngineLike = {}\n let activeContext: StoreEnginePluginContextLike | undefined\n let runtime: Runtime | null = null\n let runtimeOwner: RuntimeOwner | null = null\n\n const bindRuntime = (\n nextRuntime: Runtime,\n owner: RuntimeOwner,\n ): Runtime => {\n const previousRuntime = runtime\n const previousOwner = runtimeOwner\n\n runtime = nextRuntime\n runtimeOwner = owner\n onRuntimeChange?.(nextRuntime)\n\n syncEngineState(activeEngine, name, options, nextRuntime)\n registerEngineApi(activeEngine, name, version, nextRuntime)\n registerContainerServices(activeContext, nextRuntime)\n\n if (\n previousRuntime\n && previousRuntime !== nextRuntime\n && previousOwner === 'engine'\n ) {\n previousRuntime.dispose?.()\n }\n\n return nextRuntime\n }\n\n const ensureRuntime = (): Runtime => {\n if (runtime && runtimeOwner === 'engine') {\n return runtime\n }\n\n return createRuntime()\n }\n\n const attachToApp = (app: unknown): Runtime => {\n const installedRuntime = options.getRuntimeFromApp?.(app)\n if (installedRuntime) {\n return bindRuntime(installedRuntime, 'external')\n }\n\n const nextRuntime = ensureRuntime()\n const mountedRuntime = options.attachToApp\n ? options.attachToApp(app, nextRuntime)\n : nextRuntime\n const owner: RuntimeOwner = mountedRuntime === nextRuntime ? 'engine' : 'external'\n return bindRuntime(mountedRuntime, owner)\n }\n\n const install = async (context: unknown): Promise<void> => {\n activeEngine = resolveEngine(context)\n activeContext = resolvePluginContext(context)\n\n const app = options.resolveApp\n ? options.resolveApp(activeEngine, activeContext ?? {}, undefined)\n : resolveDefaultApp(activeEngine, activeContext)\n\n if (app && (!options.isApp || options.isApp(app))) {\n attachToApp(app)\n }\n else {\n bindRuntime(ensureRuntime(), 'engine')\n activeEngine.events?.once?.('app:created', (payload?: unknown) => {\n const createdApp = options.resolveApp\n ? options.resolveApp(activeEngine, activeContext ?? {}, payload)\n : resolveDefaultApp(activeEngine, activeContext, payload)\n if (createdApp && (!options.isApp || options.isApp(createdApp))) {\n attachToApp(createdApp)\n }\n })\n }\n\n await activeEngine.events?.emit?.(storeEventKeys.INSTALLED, {\n name,\n version,\n pinia: runtime?.pinia,\n storeAPI: runtime?.storeAPI,\n })\n\n if (debug) {\n activeEngine.logger?.info?.('[StoreEngineBridge] installed')\n }\n }\n\n const uninstall = async (context?: unknown): Promise<void> => {\n const engine = context ? resolveEngine(context) : activeEngine\n\n engine.api?.unregister?.(name)\n clearEngineState(engine, name)\n await engine.events?.emit?.(storeEventKeys.UNINSTALLED, { name })\n\n if (runtime && runtimeOwner === 'engine') {\n runtime.dispose?.()\n }\n\n runtime = null\n runtimeOwner = null\n onRuntimeChange?.(null)\n\n if (debug) {\n engine.logger?.info?.('[StoreEngineBridge] uninstalled')\n }\n }\n\n return {\n attachToApp,\n getRuntime: () => runtime,\n install,\n uninstall,\n }\n}\n"],"mappings":"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"}
@@ -0,0 +1,81 @@
1
+ /**
2
+ * Store Engine 集成类型
3
+ *
4
+ * 这里仅描述框架无关的 engine 契约;Vue/React 等适配层负责提供真实 runtime。
5
+ * @module engine/types
6
+ */
7
+ import type { EventBus, StoreId } from '../types';
8
+ export interface StoreRuntimeLike {
9
+ pinia?: unknown;
10
+ registry?: unknown;
11
+ storeAPI: StoreEngineApi;
12
+ dispose?: () => void;
13
+ }
14
+ export interface StoreEngineApi {
15
+ pinia?: unknown;
16
+ getStore: <T = unknown>(id: StoreId) => T | undefined;
17
+ hasStore: (id: StoreId) => boolean;
18
+ getStoreIds: () => StoreId[];
19
+ resetAll: () => void;
20
+ }
21
+ export interface StoreEngineApiLike {
22
+ register?: ((api: StoreEngineRegisteredApi) => void) | ((name: string, api: StoreEngineRegisteredApi) => void);
23
+ unregister?: (name: string) => void;
24
+ }
25
+ export interface StoreEngineEventsLike {
26
+ emit?: (event: string, payload: unknown) => void | Promise<void>;
27
+ once?: (event: string, listener: (payload?: unknown) => void | Promise<void>) => void;
28
+ }
29
+ export interface StoreEngineStateLike {
30
+ delete?: (key: string) => void;
31
+ set?: (key: string, value: unknown) => void;
32
+ }
33
+ export interface StoreEngineLoggerLike {
34
+ info?: (...args: unknown[]) => void;
35
+ }
36
+ export interface StoreEngineContainerLike {
37
+ has?: (identifier: string | symbol) => boolean;
38
+ resolve?: <T = unknown>(identifier: string | symbol) => T;
39
+ singleton?: (identifier: string | symbol, implementation: unknown) => void;
40
+ }
41
+ export interface StoreEngineLike {
42
+ api?: StoreEngineApiLike;
43
+ container?: StoreEngineContainerLike;
44
+ events?: StoreEngineEventsLike;
45
+ getApp?: () => unknown;
46
+ logger?: StoreEngineLoggerLike;
47
+ state?: StoreEngineStateLike;
48
+ }
49
+ export interface StoreEnginePluginContextLike {
50
+ container?: StoreEngineContainerLike;
51
+ engine?: StoreEngineLike;
52
+ framework?: {
53
+ app?: unknown;
54
+ };
55
+ }
56
+ export interface StoreEngineRegisteredApi extends StoreEngineApi {
57
+ name: string;
58
+ version: string;
59
+ }
60
+ export interface StoreEnginePluginOptions {
61
+ debug?: boolean;
62
+ dependencies?: string[];
63
+ name?: string;
64
+ version?: string;
65
+ }
66
+ export interface StoreEngineBridgeOptions<Runtime extends StoreRuntimeLike = StoreRuntimeLike> extends StoreEnginePluginOptions {
67
+ createRuntime: () => Runtime;
68
+ attachToApp?: (app: unknown, runtime: Runtime) => Runtime;
69
+ getRuntimeFromApp?: (app: unknown) => Runtime | null | undefined;
70
+ isApp?: (value: unknown) => boolean;
71
+ onRuntimeChange?: (runtime: Runtime | null) => void;
72
+ resolveApp?: (engine: StoreEngineLike, context: StoreEnginePluginContextLike, payload?: unknown) => unknown;
73
+ }
74
+ export interface StoreEngineBridge {
75
+ attachToApp: (app: unknown) => StoreRuntimeLike;
76
+ getRuntime: () => StoreRuntimeLike | null;
77
+ install: (context: unknown) => Promise<void>;
78
+ uninstall: (context?: unknown) => Promise<void>;
79
+ }
80
+ export type { EventBus };
81
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1,208 @@
1
+ /**
2
+ * 自定义错误类
3
+ *
4
+ * 提供统一的错误处理模式
5
+ * @module errors
6
+ */
7
+ /**
8
+ * Store 错误代码
9
+ */
10
+ export declare enum StoreErrorCode {
11
+ /** Store 已销毁 */
12
+ STORE_DISPOSED = "STORE_DISPOSED",
13
+ /** Store 不存在 */
14
+ STORE_NOT_FOUND = "STORE_NOT_FOUND",
15
+ /** Store 已存在 */
16
+ STORE_ALREADY_EXISTS = "STORE_ALREADY_EXISTS",
17
+ /** 无效的状态 */
18
+ INVALID_STATE = "INVALID_STATE",
19
+ /** 无效的 Action */
20
+ INVALID_ACTION = "INVALID_ACTION",
21
+ /** 序列化错误 */
22
+ SERIALIZATION_ERROR = "SERIALIZATION_ERROR",
23
+ /** 反序列化错误 */
24
+ DESERIALIZATION_ERROR = "DESERIALIZATION_ERROR",
25
+ /** 存储错误 */
26
+ STORAGE_ERROR = "STORAGE_ERROR",
27
+ /** 插件错误 */
28
+ PLUGIN_ERROR = "PLUGIN_ERROR",
29
+ /** 中间件错误 */
30
+ MIDDLEWARE_ERROR = "MIDDLEWARE_ERROR",
31
+ /** 订阅错误 */
32
+ SUBSCRIPTION_ERROR = "SUBSCRIPTION_ERROR",
33
+ /** 超时错误 */
34
+ TIMEOUT_ERROR = "TIMEOUT_ERROR",
35
+ /** 未知错误 */
36
+ UNKNOWN_ERROR = "UNKNOWN_ERROR"
37
+ }
38
+ /**
39
+ * 错误严重级别
40
+ */
41
+ export declare enum ErrorSeverity {
42
+ /** 警告 - 不影响功能,但需要注意 */
43
+ WARNING = "warning",
44
+ /** 错误 - 影响部分功能 */
45
+ ERROR = "error",
46
+ /** 致命 - 导致系统无法正常运行 */
47
+ FATAL = "fatal"
48
+ }
49
+ /**
50
+ * Store 错误上下文
51
+ */
52
+ export interface StoreErrorContext {
53
+ /** Store ID */
54
+ storeId?: string;
55
+ /** Action 名称 */
56
+ action?: string;
57
+ /** 插件名称 */
58
+ plugin?: string;
59
+ /** 中间件名称 */
60
+ middleware?: string;
61
+ /** 额外数据 */
62
+ data?: unknown;
63
+ /** 时间戳 */
64
+ timestamp?: number;
65
+ }
66
+ /**
67
+ * Store 基础错误类
68
+ *
69
+ * 所有 Store 相关错误的基类
70
+ *
71
+ * @example
72
+ * ```typescript
73
+ * try {
74
+ * store.someAction()
75
+ * } catch (error) {
76
+ * if (error instanceof StoreError) {
77
+ * console.log('Store error:', error.code, error.message)
78
+ * console.log('Context:', error.context)
79
+ * }
80
+ * }
81
+ * ```
82
+ */
83
+ export declare class StoreError extends Error {
84
+ /** 错误代码 */
85
+ readonly code: StoreErrorCode;
86
+ /** 错误上下文 */
87
+ readonly context: StoreErrorContext;
88
+ /** 错误严重级别 */
89
+ readonly severity: ErrorSeverity;
90
+ /** 原始错误 */
91
+ readonly cause?: Error;
92
+ /**
93
+ * 创建 Store 错误
94
+ *
95
+ * @param message - 错误消息
96
+ * @param code - 错误代码
97
+ * @param context - 错误上下文
98
+ * @param severity - 错误严重级别
99
+ * @param cause - 原始错误
100
+ */
101
+ constructor(message: string, code?: StoreErrorCode, context?: StoreErrorContext, severity?: ErrorSeverity, cause?: Error);
102
+ /**
103
+ * 转换为 JSON
104
+ */
105
+ toJSON(): Record<string, unknown>;
106
+ /**
107
+ * 格式化错误信息
108
+ */
109
+ format(): string;
110
+ }
111
+ /**
112
+ * Store 销毁错误
113
+ *
114
+ * 当尝试操作已销毁的 Store 时抛出
115
+ */
116
+ export declare class StoreDisposedError extends StoreError {
117
+ constructor(storeId: string, action?: string);
118
+ }
119
+ /**
120
+ * Store 不存在错误
121
+ */
122
+ export declare class StoreNotFoundError extends StoreError {
123
+ constructor(storeId: string);
124
+ }
125
+ /**
126
+ * Store 已存在错误
127
+ */
128
+ export declare class StoreAlreadyExistsError extends StoreError {
129
+ constructor(storeId: string);
130
+ }
131
+ /**
132
+ * 无效状态错误
133
+ */
134
+ export declare class InvalidStateError extends StoreError {
135
+ constructor(message: string, storeId?: string, data?: unknown);
136
+ }
137
+ /**
138
+ * 序列化错误
139
+ */
140
+ export declare class SerializationError extends StoreError {
141
+ constructor(message: string, cause?: Error, storeId?: string);
142
+ }
143
+ /**
144
+ * 反序列化错误
145
+ */
146
+ export declare class DeserializationError extends StoreError {
147
+ constructor(message: string, cause?: Error, storeId?: string);
148
+ }
149
+ /**
150
+ * 存储错误
151
+ */
152
+ export declare class StorageError extends StoreError {
153
+ constructor(message: string, cause?: Error, storeId?: string);
154
+ }
155
+ /**
156
+ * 插件错误
157
+ */
158
+ export declare class PluginError extends StoreError {
159
+ constructor(message: string, pluginName: string, cause?: Error);
160
+ }
161
+ /**
162
+ * 中间件错误
163
+ */
164
+ export declare class MiddlewareError extends StoreError {
165
+ constructor(message: string, middlewareName: string, cause?: Error);
166
+ }
167
+ /**
168
+ * 订阅错误
169
+ */
170
+ export declare class SubscriptionError extends StoreError {
171
+ constructor(message: string, cause?: Error, storeId?: string);
172
+ }
173
+ /**
174
+ * 超时错误
175
+ */
176
+ export declare class TimeoutError extends StoreError {
177
+ constructor(message: string, storeId?: string, action?: string);
178
+ }
179
+ /**
180
+ * 错误处理工具
181
+ */
182
+ export declare const errorUtils: {
183
+ /**
184
+ * 判断是否为 Store 错误
185
+ */
186
+ isStoreError(error: unknown): error is StoreError;
187
+ /**
188
+ * 判断是否为特定类型的错误
189
+ */
190
+ isErrorCode(error: unknown, code: StoreErrorCode): boolean;
191
+ /**
192
+ * 包装错误为 Store 错误
193
+ */
194
+ wrap(error: unknown, code?: StoreErrorCode, context?: StoreErrorContext): StoreError;
195
+ /**
196
+ * 安全执行函数,捕获并包装错误
197
+ */
198
+ tryCatch<T>(fn: () => T | Promise<T>, code?: StoreErrorCode, context?: StoreErrorContext): Promise<T>;
199
+ /**
200
+ * 创建错误日志记录器
201
+ */
202
+ createLogger(prefix: string): {
203
+ error(error: StoreError): void;
204
+ warn(error: StoreError): void;
205
+ log(error: StoreError): void;
206
+ };
207
+ };
208
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1,217 @@
1
+ /*!
2
+ * ***********************************
3
+ * @composy/store-core v0.0.1 *
4
+ * Built with rollup *
5
+ * Build time: 2024-08-17 11:27:33 *
6
+ * Build mode: production *
7
+ * Minified: No *
8
+ * ***********************************
9
+ */
10
+ //#region src/errors/index.ts
11
+ var StoreErrorCode = /* @__PURE__ */ ((StoreErrorCode2) => {
12
+ StoreErrorCode2["STORE_DISPOSED"] = "STORE_DISPOSED";
13
+ StoreErrorCode2["STORE_NOT_FOUND"] = "STORE_NOT_FOUND";
14
+ StoreErrorCode2["STORE_ALREADY_EXISTS"] = "STORE_ALREADY_EXISTS";
15
+ StoreErrorCode2["INVALID_STATE"] = "INVALID_STATE";
16
+ StoreErrorCode2["INVALID_ACTION"] = "INVALID_ACTION";
17
+ StoreErrorCode2["SERIALIZATION_ERROR"] = "SERIALIZATION_ERROR";
18
+ StoreErrorCode2["DESERIALIZATION_ERROR"] = "DESERIALIZATION_ERROR";
19
+ StoreErrorCode2["STORAGE_ERROR"] = "STORAGE_ERROR";
20
+ StoreErrorCode2["PLUGIN_ERROR"] = "PLUGIN_ERROR";
21
+ StoreErrorCode2["MIDDLEWARE_ERROR"] = "MIDDLEWARE_ERROR";
22
+ StoreErrorCode2["SUBSCRIPTION_ERROR"] = "SUBSCRIPTION_ERROR";
23
+ StoreErrorCode2["TIMEOUT_ERROR"] = "TIMEOUT_ERROR";
24
+ StoreErrorCode2["UNKNOWN_ERROR"] = "UNKNOWN_ERROR";
25
+ return StoreErrorCode2;
26
+ })(StoreErrorCode || {});
27
+ var ErrorSeverity = /* @__PURE__ */ ((ErrorSeverity2) => {
28
+ ErrorSeverity2["WARNING"] = "warning";
29
+ ErrorSeverity2["ERROR"] = "error";
30
+ ErrorSeverity2["FATAL"] = "fatal";
31
+ return ErrorSeverity2;
32
+ })(ErrorSeverity || {});
33
+ var StoreError = class StoreError extends Error {
34
+ /**
35
+ * 创建 Store 错误
36
+ *
37
+ * @param message - 错误消息
38
+ * @param code - 错误代码
39
+ * @param context - 错误上下文
40
+ * @param severity - 错误严重级别
41
+ * @param cause - 原始错误
42
+ */
43
+ constructor(message, code = "UNKNOWN_ERROR", context = {}, severity = "error", cause) {
44
+ super(message);
45
+ this.name = "StoreError";
46
+ this.code = code;
47
+ this.context = {
48
+ ...context,
49
+ timestamp: context.timestamp ?? Date.now()
50
+ };
51
+ this.severity = severity;
52
+ this.cause = cause;
53
+ Object.setPrototypeOf(this, StoreError.prototype);
54
+ if (Error.captureStackTrace) Error.captureStackTrace(this, StoreError);
55
+ }
56
+ /**
57
+ * 转换为 JSON
58
+ */
59
+ toJSON() {
60
+ return {
61
+ name: this.name,
62
+ message: this.message,
63
+ code: this.code,
64
+ context: this.context,
65
+ severity: this.severity,
66
+ stack: this.stack
67
+ };
68
+ }
69
+ /**
70
+ * 格式化错误信息
71
+ */
72
+ format() {
73
+ const parts = [`[${this.code}] ${this.message}`];
74
+ if (this.context.storeId) parts.push(`Store: ${this.context.storeId}`);
75
+ if (this.context.action) parts.push(`Action: ${this.context.action}`);
76
+ return parts.join(" | ");
77
+ }
78
+ };
79
+ var StoreDisposedError = class StoreDisposedError extends StoreError {
80
+ constructor(storeId, action) {
81
+ super(`Store "${storeId}" \u5DF2\u88AB\u9500\u6BC1\uFF0C\u65E0\u6CD5\u6267\u884C\u64CD\u4F5C${action ? `: ${action}` : ""}`, "STORE_DISPOSED", {
82
+ storeId,
83
+ action
84
+ }, "error");
85
+ this.name = "StoreDisposedError";
86
+ Object.setPrototypeOf(this, StoreDisposedError.prototype);
87
+ }
88
+ };
89
+ var StoreNotFoundError = class StoreNotFoundError extends StoreError {
90
+ constructor(storeId) {
91
+ super(`Store "${storeId}" \u4E0D\u5B58\u5728`, "STORE_NOT_FOUND", { storeId }, "error");
92
+ this.name = "StoreNotFoundError";
93
+ Object.setPrototypeOf(this, StoreNotFoundError.prototype);
94
+ }
95
+ };
96
+ var StoreAlreadyExistsError = class StoreAlreadyExistsError extends StoreError {
97
+ constructor(storeId) {
98
+ super(`Store "${storeId}" \u5DF2\u5B58\u5728`, "STORE_ALREADY_EXISTS", { storeId }, "warning");
99
+ this.name = "StoreAlreadyExistsError";
100
+ Object.setPrototypeOf(this, StoreAlreadyExistsError.prototype);
101
+ }
102
+ };
103
+ var InvalidStateError = class InvalidStateError extends StoreError {
104
+ constructor(message, storeId, data) {
105
+ super(message, "INVALID_STATE", {
106
+ storeId,
107
+ data
108
+ }, "error");
109
+ this.name = "InvalidStateError";
110
+ Object.setPrototypeOf(this, InvalidStateError.prototype);
111
+ }
112
+ };
113
+ var SerializationError = class SerializationError extends StoreError {
114
+ constructor(message, cause, storeId) {
115
+ super(message, "SERIALIZATION_ERROR", { storeId }, "error", cause);
116
+ this.name = "SerializationError";
117
+ Object.setPrototypeOf(this, SerializationError.prototype);
118
+ }
119
+ };
120
+ var DeserializationError = class DeserializationError extends StoreError {
121
+ constructor(message, cause, storeId) {
122
+ super(message, "DESERIALIZATION_ERROR", { storeId }, "error", cause);
123
+ this.name = "DeserializationError";
124
+ Object.setPrototypeOf(this, DeserializationError.prototype);
125
+ }
126
+ };
127
+ var StorageError = class StorageError extends StoreError {
128
+ constructor(message, cause, storeId) {
129
+ super(message, "STORAGE_ERROR", { storeId }, "error", cause);
130
+ this.name = "StorageError";
131
+ Object.setPrototypeOf(this, StorageError.prototype);
132
+ }
133
+ };
134
+ var PluginError = class PluginError extends StoreError {
135
+ constructor(message, pluginName, cause) {
136
+ super(message, "PLUGIN_ERROR", { plugin: pluginName }, "error", cause);
137
+ this.name = "PluginError";
138
+ Object.setPrototypeOf(this, PluginError.prototype);
139
+ }
140
+ };
141
+ var MiddlewareError = class MiddlewareError extends StoreError {
142
+ constructor(message, middlewareName, cause) {
143
+ super(message, "MIDDLEWARE_ERROR", { middleware: middlewareName }, "error", cause);
144
+ this.name = "MiddlewareError";
145
+ Object.setPrototypeOf(this, MiddlewareError.prototype);
146
+ }
147
+ };
148
+ var SubscriptionError = class SubscriptionError extends StoreError {
149
+ constructor(message, cause, storeId) {
150
+ super(message, "SUBSCRIPTION_ERROR", { storeId }, "warning", cause);
151
+ this.name = "SubscriptionError";
152
+ Object.setPrototypeOf(this, SubscriptionError.prototype);
153
+ }
154
+ };
155
+ var TimeoutError = class TimeoutError extends StoreError {
156
+ constructor(message, storeId, action) {
157
+ super(message, "TIMEOUT_ERROR", {
158
+ storeId,
159
+ action
160
+ }, "error");
161
+ this.name = "TimeoutError";
162
+ Object.setPrototypeOf(this, TimeoutError.prototype);
163
+ }
164
+ };
165
+ const errorUtils = {
166
+ /**
167
+ * 判断是否为 Store 错误
168
+ */
169
+ isStoreError(error) {
170
+ return error instanceof StoreError;
171
+ },
172
+ /**
173
+ * 判断是否为特定类型的错误
174
+ */
175
+ isErrorCode(error, code) {
176
+ return error instanceof StoreError && error.code === code;
177
+ },
178
+ /**
179
+ * 包装错误为 Store 错误
180
+ */
181
+ wrap(error, code = "UNKNOWN_ERROR", context = {}) {
182
+ if (error instanceof StoreError) return error;
183
+ return new StoreError(error instanceof Error ? error.message : String(error), code, context, "error", error instanceof Error ? error : void 0);
184
+ },
185
+ /**
186
+ * 安全执行函数,捕获并包装错误
187
+ */
188
+ async tryCatch(fn, code = "UNKNOWN_ERROR", context = {}) {
189
+ try {
190
+ return await fn();
191
+ } catch (error) {
192
+ throw errorUtils.wrap(error, code, context);
193
+ }
194
+ },
195
+ /**
196
+ * 创建错误日志记录器
197
+ */
198
+ createLogger(prefix) {
199
+ return {
200
+ error(error) {
201
+ console.error(`[${prefix}]`, error.format());
202
+ if (error.cause) console.error(`[${prefix}] Caused by:`, error.cause);
203
+ },
204
+ warn(error) {
205
+ console.warn(`[${prefix}]`, error.format());
206
+ },
207
+ log(error) {
208
+ if (error.severity === "fatal" || error.severity === "error") this.error(error);
209
+ else this.warn(error);
210
+ }
211
+ };
212
+ }
213
+ };
214
+ //#endregion
215
+ export { DeserializationError, ErrorSeverity, InvalidStateError, MiddlewareError, PluginError, SerializationError, StorageError, StoreAlreadyExistsError, StoreDisposedError, StoreError, StoreErrorCode, StoreNotFoundError, SubscriptionError, TimeoutError, errorUtils };
216
+ /*! End of @composy/store-core | Powered by @composy/builder */
217
+ //# sourceMappingURL=index.js.map