@composy/store-core 0.0.1 → 0.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (300) hide show
  1. package/CHANGELOG.md +64 -3
  2. package/README.md +196 -172
  3. package/dist/index.js +1331 -1115
  4. package/dist/index.js.map +1 -1
  5. package/dist/index.min.js +578 -417
  6. package/dist/index.min.js.map +1 -1
  7. package/es/.dts-output-manifest.json +1 -0
  8. package/es/.dts.tsbuildinfo +1 -0
  9. package/es/core/async-action.d.ts +1 -71
  10. package/es/core/async-action.js +83 -35
  11. package/es/core/async-action.js.map +1 -1
  12. package/es/core/base-store.d.ts +27 -62
  13. package/es/core/base-store.js +174 -74
  14. package/es/core/base-store.js.map +1 -1
  15. package/es/core/batch-manager.d.ts +0 -1
  16. package/es/core/batch-manager.js +15 -2
  17. package/es/core/batch-manager.js.map +1 -1
  18. package/es/core/create-store.d.ts +3 -3
  19. package/es/core/create-store.js +3 -3
  20. package/es/core/create-store.js.map +1 -1
  21. package/es/core/event-bus.d.ts +0 -1
  22. package/es/core/event-bus.js +1 -1
  23. package/es/core/event-bus.js.map +1 -1
  24. package/es/core/index.d.ts +1 -2
  25. package/es/core/index.js +2 -2
  26. package/es/core/pub-sub.d.ts +0 -1
  27. package/es/core/pub-sub.js +1 -1
  28. package/es/core/pub-sub.js.map +1 -1
  29. package/es/engine/index.d.ts +0 -1
  30. package/es/engine/index.js +1 -1
  31. package/es/engine/plugin.d.ts +0 -1
  32. package/es/engine/plugin.js +11 -2
  33. package/es/engine/plugin.js.map +1 -1
  34. package/es/engine/types.d.ts +0 -1
  35. package/es/engine/types.js +1 -1
  36. package/es/errors/index.d.ts +0 -1
  37. package/es/errors/index.js +17 -1
  38. package/es/errors/index.js.map +1 -1
  39. package/es/index.d.ts +3 -4
  40. package/es/index.js +8 -8
  41. package/es/index.js.map +1 -1
  42. package/es/middleware/index.d.ts +3 -4
  43. package/es/middleware/index.js +2 -2
  44. package/es/middleware/logger.d.ts +0 -1
  45. package/es/middleware/logger.js +2 -2
  46. package/es/middleware/logger.js.map +1 -1
  47. package/es/middleware/middleware-manager.d.ts +0 -1
  48. package/es/middleware/middleware-manager.js +5 -2
  49. package/es/middleware/middleware-manager.js.map +1 -1
  50. package/es/middleware/persist.d.ts +0 -1
  51. package/es/middleware/persist.js +3 -3
  52. package/es/middleware/persist.js.map +1 -1
  53. package/es/middleware/time-travel.d.ts +0 -1
  54. package/es/middleware/time-travel.js +1 -1
  55. package/es/middleware/time-travel.js.map +1 -1
  56. package/es/middleware/validation.d.ts +0 -1
  57. package/es/middleware/validation.js +2 -2
  58. package/es/middleware/validation.js.map +1 -1
  59. package/es/plugins/define-plugin.d.ts +1 -2
  60. package/es/plugins/define-plugin.js +2 -2
  61. package/es/plugins/define-plugin.js.map +1 -1
  62. package/es/plugins/index.d.ts +0 -1
  63. package/es/plugins/index.js +2 -2
  64. package/es/plugins/plugin-manager.d.ts +1 -31
  65. package/es/plugins/plugin-manager.js +58 -27
  66. package/es/plugins/plugin-manager.js.map +1 -1
  67. package/es/types/action.d.ts +2 -0
  68. package/es/types/action.js +10 -0
  69. package/es/types/batch.d.ts +2 -0
  70. package/es/types/batch.js +10 -0
  71. package/es/types/event.d.ts +2 -0
  72. package/es/types/event.js +10 -0
  73. package/es/types/index.d.ts +2 -3
  74. package/es/types/index.js +1 -1
  75. package/es/types/middleware.d.ts +10 -2
  76. package/es/types/middleware.js +1 -1
  77. package/es/types/mutation.d.ts +2 -0
  78. package/es/types/mutation.js +10 -0
  79. package/es/types/plugin.d.ts +4 -1
  80. package/es/types/plugin.js +1 -1
  81. package/es/types/state.d.ts +2 -0
  82. package/es/types/state.js +10 -0
  83. package/es/types/store.d.ts +19 -1
  84. package/es/types/store.js +1 -1
  85. package/es/types/subscription.d.ts +7 -2
  86. package/es/types/subscription.js +1 -1
  87. package/es/types/time-travel.d.ts +2 -0
  88. package/es/types/time-travel.js +10 -0
  89. package/es/types/utility.d.ts +3 -4
  90. package/es/types/utility.js +1 -1
  91. package/es/utils/debounce-throttle.d.ts +0 -1
  92. package/es/utils/debounce-throttle.js +1 -1
  93. package/es/utils/debounce-throttle.js.map +1 -1
  94. package/es/utils/deep-clone.d.ts +0 -1
  95. package/es/utils/deep-clone.js +1 -1
  96. package/es/utils/deep-clone.js.map +1 -1
  97. package/es/utils/index.d.ts +4 -5
  98. package/es/utils/index.js +1 -1
  99. package/es/utils/selector.d.ts +0 -1
  100. package/es/utils/selector.js +1 -1
  101. package/es/utils/selector.js.map +1 -1
  102. package/esm/core/async-action.js +83 -35
  103. package/esm/core/async-action.js.map +1 -1
  104. package/esm/core/base-store.js +174 -74
  105. package/esm/core/base-store.js.map +1 -1
  106. package/esm/core/batch-manager.js +15 -2
  107. package/esm/core/batch-manager.js.map +1 -1
  108. package/esm/core/create-store.js +3 -3
  109. package/esm/core/create-store.js.map +1 -1
  110. package/esm/core/event-bus.js +1 -1
  111. package/esm/core/event-bus.js.map +1 -1
  112. package/esm/core/index.js +2 -2
  113. package/esm/core/pub-sub.js +1 -1
  114. package/esm/core/pub-sub.js.map +1 -1
  115. package/esm/engine/index.js +1 -1
  116. package/esm/engine/plugin.js +11 -2
  117. package/esm/engine/plugin.js.map +1 -1
  118. package/esm/errors/index.js +17 -1
  119. package/esm/errors/index.js.map +1 -1
  120. package/esm/index.js +8 -8
  121. package/esm/index.js.map +1 -1
  122. package/esm/middleware/logger.js +2 -2
  123. package/esm/middleware/logger.js.map +1 -1
  124. package/esm/middleware/middleware-manager.js +5 -2
  125. package/esm/middleware/middleware-manager.js.map +1 -1
  126. package/esm/middleware/persist.js +3 -3
  127. package/esm/middleware/persist.js.map +1 -1
  128. package/esm/middleware/time-travel.js +1 -1
  129. package/esm/middleware/time-travel.js.map +1 -1
  130. package/esm/middleware/validation.js +2 -2
  131. package/esm/middleware/validation.js.map +1 -1
  132. package/esm/plugins/define-plugin.js +2 -2
  133. package/esm/plugins/define-plugin.js.map +1 -1
  134. package/esm/plugins/plugin-manager.js +58 -27
  135. package/esm/plugins/plugin-manager.js.map +1 -1
  136. package/esm/utils/debounce-throttle.js +1 -1
  137. package/esm/utils/debounce-throttle.js.map +1 -1
  138. package/esm/utils/deep-clone.js +1 -1
  139. package/esm/utils/deep-clone.js.map +1 -1
  140. package/esm/utils/selector.js +1 -1
  141. package/esm/utils/selector.js.map +1 -1
  142. package/lib/core/async-action.cjs +83 -35
  143. package/lib/core/async-action.cjs.map +1 -1
  144. package/lib/core/async-action.d.cts +25 -0
  145. package/lib/core/base-store.cjs +174 -74
  146. package/lib/core/base-store.cjs.map +1 -1
  147. package/lib/core/base-store.d.cts +50 -0
  148. package/lib/core/batch-manager.cjs +15 -2
  149. package/lib/core/batch-manager.cjs.map +1 -1
  150. package/{esm/core/batch-manager.d.ts → lib/core/batch-manager.d.cts} +0 -1
  151. package/lib/core/create-store.cjs +3 -3
  152. package/lib/core/create-store.cjs.map +1 -1
  153. package/lib/core/{create-store.d.ts → create-store.d.cts} +3 -3
  154. package/lib/core/event-bus.cjs +1 -1
  155. package/lib/core/event-bus.cjs.map +1 -1
  156. package/lib/core/{event-bus.d.ts → event-bus.d.cts} +0 -1
  157. package/lib/core/index.cjs +2 -2
  158. package/{esm/core/index.d.ts → lib/core/index.d.cts} +1 -2
  159. package/lib/core/pub-sub.cjs +1 -1
  160. package/lib/core/pub-sub.cjs.map +1 -1
  161. package/lib/core/{pub-sub.d.ts → pub-sub.d.cts} +0 -1
  162. package/lib/engine/index.cjs +1 -1
  163. package/{esm/engine/index.d.ts → lib/engine/index.d.cts} +0 -1
  164. package/lib/engine/plugin.cjs +11 -2
  165. package/lib/engine/plugin.cjs.map +1 -1
  166. package/{esm/engine/plugin.d.ts → lib/engine/plugin.d.cts} +0 -1
  167. package/lib/engine/types.cjs +1 -1
  168. package/lib/engine/{types.d.ts → types.d.cts} +0 -1
  169. package/lib/errors/index.cjs +17 -1
  170. package/lib/errors/index.cjs.map +1 -1
  171. package/lib/errors/{index.d.ts → index.d.cts} +0 -1
  172. package/lib/index.cjs +8 -8
  173. package/lib/index.cjs.map +1 -1
  174. package/lib/{index.d.ts → index.d.cts} +3 -4
  175. package/lib/middleware/index.cjs +2 -2
  176. package/lib/middleware/{index.d.ts → index.d.cts} +3 -4
  177. package/lib/middleware/logger.cjs +2 -2
  178. package/lib/middleware/logger.cjs.map +1 -1
  179. package/lib/middleware/{logger.d.ts → logger.d.cts} +0 -1
  180. package/lib/middleware/middleware-manager.cjs +5 -2
  181. package/lib/middleware/middleware-manager.cjs.map +1 -1
  182. package/lib/middleware/{middleware-manager.d.ts → middleware-manager.d.cts} +0 -1
  183. package/lib/middleware/persist.cjs +3 -3
  184. package/lib/middleware/persist.cjs.map +1 -1
  185. package/{esm/middleware/persist.d.ts → lib/middleware/persist.d.cts} +0 -1
  186. package/lib/middleware/time-travel.cjs +1 -1
  187. package/lib/middleware/time-travel.cjs.map +1 -1
  188. package/{esm/middleware/time-travel.d.ts → lib/middleware/time-travel.d.cts} +0 -1
  189. package/lib/middleware/validation.cjs +2 -2
  190. package/lib/middleware/validation.cjs.map +1 -1
  191. package/{esm/middleware/validation.d.ts → lib/middleware/validation.d.cts} +0 -1
  192. package/lib/plugins/define-plugin.cjs +2 -2
  193. package/lib/plugins/define-plugin.cjs.map +1 -1
  194. package/{esm/plugins/define-plugin.d.ts → lib/plugins/define-plugin.d.cts} +1 -2
  195. package/lib/plugins/index.cjs +2 -2
  196. package/{esm/plugins/index.d.ts → lib/plugins/index.d.cts} +0 -1
  197. package/lib/plugins/plugin-manager.cjs +58 -27
  198. package/lib/plugins/plugin-manager.cjs.map +1 -1
  199. package/lib/plugins/plugin-manager.d.cts +5 -0
  200. package/lib/types/action.cjs +12 -0
  201. package/lib/types/action.d.cts +2 -0
  202. package/lib/types/batch.cjs +12 -0
  203. package/lib/types/batch.d.cts +2 -0
  204. package/lib/types/event.cjs +12 -0
  205. package/lib/types/event.d.cts +2 -0
  206. package/lib/types/index.cjs +1 -1
  207. package/{esm/types/index.d.ts → lib/types/index.d.cts} +2 -3
  208. package/lib/types/middleware.cjs +1 -1
  209. package/lib/types/{middleware.d.ts → middleware.d.cts} +10 -2
  210. package/lib/types/mutation.cjs +12 -0
  211. package/lib/types/mutation.d.cts +2 -0
  212. package/lib/types/plugin.cjs +1 -1
  213. package/lib/types/{plugin.d.ts → plugin.d.cts} +4 -1
  214. package/lib/types/state.cjs +12 -0
  215. package/lib/types/state.d.cts +2 -0
  216. package/lib/types/store.cjs +1 -1
  217. package/lib/types/{store.d.ts → store.d.cts} +19 -1
  218. package/lib/types/subscription.cjs +1 -1
  219. package/lib/types/{subscription.d.ts → subscription.d.cts} +7 -2
  220. package/lib/types/time-travel.cjs +12 -0
  221. package/lib/types/time-travel.d.cts +2 -0
  222. package/lib/types/utility.cjs +1 -1
  223. package/lib/types/{utility.d.ts → utility.d.cts} +3 -4
  224. package/lib/utils/debounce-throttle.cjs +1 -1
  225. package/lib/utils/debounce-throttle.cjs.map +1 -1
  226. package/{esm/utils/debounce-throttle.d.ts → lib/utils/debounce-throttle.d.cts} +0 -1
  227. package/lib/utils/deep-clone.cjs +1 -1
  228. package/lib/utils/deep-clone.cjs.map +1 -1
  229. package/lib/utils/{deep-clone.d.ts → deep-clone.d.cts} +0 -1
  230. package/lib/utils/index.cjs +1 -1
  231. package/lib/utils/{index.d.ts → index.d.cts} +4 -5
  232. package/lib/utils/selector.cjs +1 -1
  233. package/lib/utils/selector.cjs.map +1 -1
  234. package/lib/utils/{selector.d.ts → selector.d.cts} +0 -1
  235. package/package.json +14 -11
  236. package/es/core/async-action.d.ts.map +0 -1
  237. package/es/core/base-store.d.ts.map +0 -1
  238. package/es/core/batch-manager.d.ts.map +0 -1
  239. package/es/core/create-store.d.ts.map +0 -1
  240. package/es/core/event-bus.d.ts.map +0 -1
  241. package/es/core/index.d.ts.map +0 -1
  242. package/es/core/pub-sub.d.ts.map +0 -1
  243. package/es/engine/index.d.ts.map +0 -1
  244. package/es/engine/plugin.d.ts.map +0 -1
  245. package/es/engine/types.d.ts.map +0 -1
  246. package/es/errors/index.d.ts.map +0 -1
  247. package/es/index.d.ts.map +0 -1
  248. package/es/middleware/index.d.ts.map +0 -1
  249. package/es/middleware/logger.d.ts.map +0 -1
  250. package/es/middleware/middleware-manager.d.ts.map +0 -1
  251. package/es/middleware/persist.d.ts.map +0 -1
  252. package/es/middleware/time-travel.d.ts.map +0 -1
  253. package/es/middleware/validation.d.ts.map +0 -1
  254. package/es/plugins/define-plugin.d.ts.map +0 -1
  255. package/es/plugins/index.d.ts.map +0 -1
  256. package/es/plugins/plugin-manager.d.ts.map +0 -1
  257. package/es/types/index.d.ts.map +0 -1
  258. package/es/types/middleware.d.ts.map +0 -1
  259. package/es/types/plugin.d.ts.map +0 -1
  260. package/es/types/store.d.ts.map +0 -1
  261. package/es/types/subscription.d.ts.map +0 -1
  262. package/es/types/utility.d.ts.map +0 -1
  263. package/es/utils/debounce-throttle.d.ts.map +0 -1
  264. package/es/utils/deep-clone.d.ts.map +0 -1
  265. package/es/utils/index.d.ts.map +0 -1
  266. package/es/utils/selector.d.ts.map +0 -1
  267. package/esm/core/async-action.d.ts +0 -95
  268. package/esm/core/base-store.d.ts +0 -85
  269. package/esm/core/create-store.d.ts +0 -66
  270. package/esm/core/event-bus.d.ts +0 -34
  271. package/esm/core/pub-sub.d.ts +0 -41
  272. package/esm/engine/types.d.ts +0 -81
  273. package/esm/errors/index.d.ts +0 -208
  274. package/esm/index.d.ts +0 -27
  275. package/esm/middleware/index.d.ts +0 -13
  276. package/esm/middleware/logger.d.ts +0 -67
  277. package/esm/middleware/middleware-manager.d.ts +0 -40
  278. package/esm/plugins/plugin-manager.d.ts +0 -35
  279. package/esm/types/middleware.d.ts +0 -172
  280. package/esm/types/plugin.d.ts +0 -136
  281. package/esm/types/store.d.ts +0 -198
  282. package/esm/types/subscription.d.ts +0 -158
  283. package/esm/types/utility.d.ts +0 -312
  284. package/esm/utils/deep-clone.d.ts +0 -143
  285. package/esm/utils/index.d.ts +0 -13
  286. package/esm/utils/selector.d.ts +0 -213
  287. package/lib/core/async-action.d.ts +0 -95
  288. package/lib/core/base-store.d.ts +0 -85
  289. package/lib/core/batch-manager.d.ts +0 -46
  290. package/lib/core/index.d.ts +0 -14
  291. package/lib/engine/index.d.ts +0 -10
  292. package/lib/engine/plugin.d.ts +0 -20
  293. package/lib/middleware/persist.d.ts +0 -34
  294. package/lib/middleware/time-travel.d.ts +0 -30
  295. package/lib/middleware/validation.d.ts +0 -100
  296. package/lib/plugins/define-plugin.d.ts +0 -74
  297. package/lib/plugins/index.d.ts +0 -8
  298. package/lib/plugins/plugin-manager.d.ts +0 -35
  299. package/lib/types/index.d.ts +0 -12
  300. package/lib/utils/debounce-throttle.d.ts +0 -86
@@ -2,7 +2,7 @@
2
2
  * ***********************************
3
3
  * @composy/store-core v0.0.1 *
4
4
  * Built with rollup *
5
- * Build time: 2024-08-17 11:27:33 *
5
+ * Build time: 2024-10-12 17:23:58 *
6
6
  * Build mode: production *
7
7
  * Minified: No *
8
8
  * ***********************************
@@ -11,9 +11,9 @@
11
11
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
12
12
  const require_pub_sub = require("./pub-sub.cjs");
13
13
  const require_async_action = require("./async-action.cjs");
14
+ const require_batch_manager = require("./batch-manager.cjs");
14
15
  const require_event_bus = require("./event-bus.cjs");
15
16
  const require_base_store = require("./base-store.cjs");
16
- const require_batch_manager = require("./batch-manager.cjs");
17
17
  const require_create_store = require("./create-store.cjs");
18
18
  exports.BaseStore = require_base_store.BaseStore;
19
19
  exports.batch = require_batch_manager.batch;
@@ -4,11 +4,10 @@
4
4
  * @module core
5
5
  */
6
6
  export { createAsyncAction } from './async-action';
7
- export type { AsyncAction, AsyncActionOptions, AsyncActionState } from './async-action';
7
+ export type { AsyncAction, AsyncActionOptions, AsyncActionState, } from './async-action';
8
8
  export { BaseStore } from './base-store';
9
9
  export { batch, createBatchManager, getGlobalBatchManager, setGlobalBatchManager, } from './batch-manager';
10
10
  export { createStore } from './create-store';
11
11
  export type { CreateStoreDefinition, StoreAPI } from './create-store';
12
12
  export { createEventBus, globalEventBus } from './event-bus';
13
13
  export { createPubSub, createPubSubWithValue } from './pub-sub';
14
- //# sourceMappingURL=index.d.ts.map
@@ -2,7 +2,7 @@
2
2
  * ***********************************
3
3
  * @composy/store-core v0.0.1 *
4
4
  * Built with rollup *
5
- * Build time: 2024-08-17 11:27:33 *
5
+ * Build time: 2024-10-12 17:23:58 *
6
6
  * Build mode: production *
7
7
  * Minified: No *
8
8
  * ***********************************
@@ -1 +1 @@
1
- {"version":3,"file":"pub-sub.cjs","names":[],"sources":["../../src/core/pub-sub.ts"],"sourcesContent":["/**\n * 发布订阅模式实现\n *\n * @module core/pub-sub\n */\n\nimport type { PubSub, Subscriber, SubscriptionOptions, Unsubscribe } from '../types'\n\n/**\n * 订阅者信息\n */\ninterface SubscriberInfo<T> {\n /** 回调函数 */\n callback: Subscriber<T>\n /** 订阅选项 */\n options: SubscriptionOptions\n}\n\n/**\n * 创建发布订阅管理器\n *\n * @template T - 数据类型\n * @returns 发布订阅管理器实例\n *\n * @example\n * ```typescript\n * const pubsub = createPubSub<number>()\n *\n * // 订阅\n * const unsubscribe = pubsub.subscribe((value, oldValue) => {\n * console.log(`值从 ${oldValue} 变为 ${value}`)\n * })\n *\n * // 发布\n * pubsub.publish(1, 0)\n *\n * // 取消订阅\n * unsubscribe()\n * ```\n */\nexport function createPubSub<T = unknown>(): PubSub<T> {\n /** 订阅者列表 */\n const subscribers = new Set<SubscriberInfo<T>>()\n\n /**\n * 订阅\n */\n const subscribe = (\n callback: Subscriber<T>,\n options: SubscriptionOptions = {},\n ): Unsubscribe => {\n const info: SubscriberInfo<T> = {\n callback,\n options,\n }\n subscribers.add(info)\n\n return () => {\n subscribers.delete(info)\n }\n }\n\n /**\n * 发布\n */\n const publish = (value: T, oldValue?: T): void => {\n subscribers.forEach((info) => {\n try {\n info.callback(value, oldValue)\n }\n catch (error) {\n console.error('[PubSub] 订阅回调执行出错:', error)\n }\n })\n }\n\n /**\n * 清空所有订阅\n */\n const clear = (): void => {\n subscribers.clear()\n }\n\n /**\n * 获取订阅者数量\n */\n const size = (): number => {\n return subscribers.size\n }\n\n return {\n subscribe,\n publish,\n clear,\n size,\n }\n}\n\n/**\n * 创建带立即执行的发布订阅管理器\n *\n * @template T - 数据类型\n * @param initialValue - 初始值\n * @returns 发布订阅管理器实例\n */\nexport function createPubSubWithValue<T>(initialValue: T): PubSub<T> & {\n getValue: () => T\n setValue: (value: T) => void\n} {\n let currentValue = initialValue\n const pubsub = createPubSub<T>()\n\n const getValue = (): T => currentValue\n\n const setValue = (value: T): void => {\n const oldValue = currentValue\n currentValue = value\n pubsub.publish(value, oldValue)\n }\n\n const subscribe = (\n callback: Subscriber<T>,\n options: SubscriptionOptions = {},\n ): Unsubscribe => {\n const unsubscribe = pubsub.subscribe(callback, options)\n\n // 立即执行\n if (options.immediate) {\n callback(currentValue)\n }\n\n return unsubscribe\n }\n\n return {\n subscribe,\n publish: pubsub.publish,\n clear: pubsub.clear,\n size: pubsub.size,\n getValue,\n setValue,\n }\n}\n\n"],"mappings":";;;;;;;;;;;;AAwCO,SAAS,eAAuC;CAErD,MAAM,8BAAc,IAAI,IAAuB;CAK/C,MAAM,aACJ,UACA,UAA+B,CAAC,MAChB;EAChB,MAAM,OAA0B;GAC9B;GACA;EACF;EACA,YAAY,IAAI,IAAI;EAEpB,aAAa;GACX,YAAY,OAAO,IAAI;EACzB;CACF;CAKA,MAAM,WAAW,OAAU,aAAuB;EAChD,YAAY,SAAS,SAAS;GAC5B,IAAI;IACF,KAAK,SAAS,OAAO,QAAQ;GAC/B,SACO,OAAO;IACZ,QAAQ,MAAM,sBAAsB,KAAK;GAC3C;EACF,CAAC;CACH;CAKA,MAAM,cAAoB;EACxB,YAAY,MAAM;CACpB;CAKA,MAAM,aAAqB;EACzB,OAAO,YAAY;CACrB;CAEA,OAAO;EACL;EACA;EACA;EACA;CACF;AACF;AASO,SAAS,sBAAyB,cAGvC;CACA,IAAI,eAAe;CACnB,MAAM,SAAS,aAAgB;CAE/B,MAAM,iBAAoB;CAE1B,MAAM,YAAY,UAAmB;EACnC,MAAM,WAAW;EACjB,eAAe;EACf,OAAO,QAAQ,OAAO,QAAQ;CAChC;CAEA,MAAM,aACJ,UACA,UAA+B,CAAC,MAChB;EAChB,MAAM,cAAc,OAAO,UAAU,UAAU,OAAO;EAGtD,IAAI,QAAQ,WACV,SAAS,YAAY;EAGvB,OAAO;CACT;CAEA,OAAO;EACL;EACA,SAAS,OAAO;EAChB,OAAO,OAAO;EACd,MAAM,OAAO;EACb;EACA;CACF;AACF"}
1
+ {"version":3,"file":"pub-sub.cjs","names":[],"sources":["../../src/core/pub-sub.ts"],"sourcesContent":["/**\r\n * 发布订阅模式实现\r\n *\r\n * @module core/pub-sub\r\n */\r\n\r\nimport type {\r\n PubSub,\r\n Subscriber,\r\n SubscriptionOptions,\r\n Unsubscribe,\r\n} from '../types'\r\n\r\n/**\r\n * 订阅者信息\r\n */\r\ninterface SubscriberInfo<T> {\r\n /** 回调函数 */\r\n callback: Subscriber<T>\r\n /** 订阅选项 */\r\n options: SubscriptionOptions\r\n}\r\n\r\n/**\r\n * 创建发布订阅管理器\r\n *\r\n * @template T - 数据类型\r\n * @returns 发布订阅管理器实例\r\n *\r\n * @example\r\n * ```typescript\r\n * const pubsub = createPubSub<number>()\r\n *\r\n * // 订阅\r\n * const unsubscribe = pubsub.subscribe((value, oldValue) => {\r\n * console.log(`值从 ${oldValue} 变为 ${value}`)\r\n * })\r\n *\r\n * // 发布\r\n * pubsub.publish(1, 0)\r\n *\r\n * // 取消订阅\r\n * unsubscribe()\r\n * ```\r\n */\r\nexport function createPubSub<T = unknown>(): PubSub<T> {\r\n /** 订阅者列表 */\r\n const subscribers = new Set<SubscriberInfo<T>>()\r\n\r\n /**\r\n * 订阅\r\n */\r\n const subscribe = (\r\n callback: Subscriber<T>,\r\n options: SubscriptionOptions = {}\r\n ): Unsubscribe => {\r\n const info: SubscriberInfo<T> = {\r\n callback,\r\n options,\r\n }\r\n subscribers.add(info)\r\n\r\n return () => {\r\n subscribers.delete(info)\r\n }\r\n }\r\n\r\n /**\r\n * 发布\r\n */\r\n const publish = (value: T, oldValue?: T): void => {\r\n subscribers.forEach(info => {\r\n try {\r\n info.callback(value, oldValue)\r\n } catch (error) {\r\n console.error('[PubSub] 订阅回调执行出错:', error)\r\n }\r\n })\r\n }\r\n\r\n /**\r\n * 清空所有订阅\r\n */\r\n const clear = (): void => {\r\n subscribers.clear()\r\n }\r\n\r\n /**\r\n * 获取订阅者数量\r\n */\r\n const size = (): number => {\r\n return subscribers.size\r\n }\r\n\r\n return {\r\n subscribe,\r\n publish,\r\n clear,\r\n size,\r\n }\r\n}\r\n\r\n/**\r\n * 创建带立即执行的发布订阅管理器\r\n *\r\n * @template T - 数据类型\r\n * @param initialValue - 初始值\r\n * @returns 发布订阅管理器实例\r\n */\r\nexport function createPubSubWithValue<T>(initialValue: T): PubSub<T> & {\r\n getValue: () => T\r\n setValue: (value: T) => void\r\n} {\r\n let currentValue = initialValue\r\n const pubsub = createPubSub<T>()\r\n\r\n const getValue = (): T => currentValue\r\n\r\n const setValue = (value: T): void => {\r\n const oldValue = currentValue\r\n currentValue = value\r\n pubsub.publish(value, oldValue)\r\n }\r\n\r\n const subscribe = (\r\n callback: Subscriber<T>,\r\n options: SubscriptionOptions = {}\r\n ): Unsubscribe => {\r\n const unsubscribe = pubsub.subscribe(callback, options)\r\n\r\n // 立即执行\r\n if (options.immediate) {\r\n callback(currentValue)\r\n }\r\n\r\n return unsubscribe\r\n }\r\n\r\n return {\r\n subscribe,\r\n publish: pubsub.publish,\r\n clear: pubsub.clear,\r\n size: pubsub.size,\r\n getValue,\r\n setValue,\r\n }\r\n}\r\n"],"mappings":";;;;;;;;;;;;AA6CO,SAAS,eAAuC;CAErD,MAAM,8BAAc,IAAI,IAAuB;CAK/C,MAAM,aACJ,UACA,UAA+B,CAAC,MAChB;EAChB,MAAM,OAA0B;GAC9B;GACA;EACF;EACA,YAAY,IAAI,IAAI;EAEpB,aAAa;GACX,YAAY,OAAO,IAAI;EACzB;CACF;CAKA,MAAM,WAAW,OAAU,aAAuB;EAChD,YAAY,SAAQ,SAAQ;GAC1B,IAAI;IACF,KAAK,SAAS,OAAO,QAAQ;GAC/B,SAAS,OAAO;IACd,QAAQ,MAAM,sBAAsB,KAAK;GAC3C;EACF,CAAC;CACH;CAKA,MAAM,cAAoB;EACxB,YAAY,MAAM;CACpB;CAKA,MAAM,aAAqB;EACzB,OAAO,YAAY;CACrB;CAEA,OAAO;EACL;EACA;EACA;EACA;CACF;AACF;AASO,SAAS,sBAAyB,cAGvC;CACA,IAAI,eAAe;CACnB,MAAM,SAAS,aAAgB;CAE/B,MAAM,iBAAoB;CAE1B,MAAM,YAAY,UAAmB;EACnC,MAAM,WAAW;EACjB,eAAe;EACf,OAAO,QAAQ,OAAO,QAAQ;CAChC;CAEA,MAAM,aACJ,UACA,UAA+B,CAAC,MAChB;EAChB,MAAM,cAAc,OAAO,UAAU,UAAU,OAAO;EAGtD,IAAI,QAAQ,WACV,SAAS,YAAY;EAGvB,OAAO;CACT;CAEA,OAAO;EACL;EACA,SAAS,OAAO;EAChB,OAAO,OAAO;EACd,MAAM,OAAO;EACb;EACA;CACF;AACF"}
@@ -38,4 +38,3 @@ export declare function createPubSubWithValue<T>(initialValue: T): PubSub<T> & {
38
38
  getValue: () => T;
39
39
  setValue: (value: T) => void;
40
40
  };
41
- //# sourceMappingURL=pub-sub.d.ts.map
@@ -2,7 +2,7 @@
2
2
  * ***********************************
3
3
  * @composy/store-core v0.0.1 *
4
4
  * Built with rollup *
5
- * Build time: 2024-08-17 11:27:33 *
5
+ * Build time: 2024-10-12 17:23:58 *
6
6
  * Build mode: production *
7
7
  * Minified: No *
8
8
  * ***********************************
@@ -7,4 +7,3 @@
7
7
  */
8
8
  export { createStoreEngineBridge, storeEventKeys, storeStateKeys, } from './plugin';
9
9
  export type { StoreEngineApi, StoreEngineApiLike, StoreEngineBridge, StoreEngineBridgeOptions, StoreEngineContainerLike, StoreEngineEventsLike, StoreEngineLike, StoreEngineLoggerLike, StoreEnginePluginContextLike, StoreEnginePluginOptions, StoreEngineRegisteredApi, StoreEngineStateLike, StoreRuntimeLike, } from './types';
10
- //# sourceMappingURL=index.d.ts.map
@@ -2,7 +2,7 @@
2
2
  * ***********************************
3
3
  * @composy/store-core v0.0.1 *
4
4
  * Built with rollup *
5
- * Build time: 2024-08-17 11:27:33 *
5
+ * Build time: 2024-10-12 17:23:58 *
6
6
  * Build mode: production *
7
7
  * Minified: No *
8
8
  * ***********************************
@@ -83,11 +83,13 @@ function registerContainerServices(context, runtime) {
83
83
  } catch {}
84
84
  }
85
85
  function createStoreEngineBridge(options) {
86
- const { createRuntime, debug = false, name = "store", onRuntimeChange, version = "1.0.0" } = options;
86
+ const { createRuntime, debug = false, name = "store", onRuntimeChange, version = "0.0.1" } = options;
87
87
  let activeEngine = {};
88
88
  let activeContext;
89
89
  let runtime = null;
90
90
  let runtimeOwner = null;
91
+ let lifecycleToken = 0;
92
+ let pendingAppCreatedToken = null;
91
93
  const bindRuntime = (nextRuntime, owner) => {
92
94
  const previousRuntime = runtime;
93
95
  const previousOwner = runtimeOwner;
@@ -112,13 +114,18 @@ function createStoreEngineBridge(options) {
112
114
  return bindRuntime(mountedRuntime, mountedRuntime === nextRuntime ? "engine" : "external");
113
115
  };
114
116
  const install = async (context) => {
117
+ const installToken = ++lifecycleToken;
118
+ pendingAppCreatedToken = null;
115
119
  activeEngine = resolveEngine(context);
116
120
  activeContext = resolvePluginContext(context);
117
121
  const app = options.resolveApp ? options.resolveApp(activeEngine, activeContext ?? {}, void 0) : resolveDefaultApp(activeEngine, activeContext);
118
122
  if (app && (!options.isApp || options.isApp(app))) attachToApp(app);
119
123
  else {
120
124
  bindRuntime(ensureRuntime(), "engine");
125
+ pendingAppCreatedToken = installToken;
121
126
  activeEngine.events?.once?.("app:created", (payload) => {
127
+ if (pendingAppCreatedToken !== installToken || lifecycleToken !== installToken || !runtime) return;
128
+ pendingAppCreatedToken = null;
122
129
  const createdApp = options.resolveApp ? options.resolveApp(activeEngine, activeContext ?? {}, payload) : resolveDefaultApp(activeEngine, activeContext, payload);
123
130
  if (createdApp && (!options.isApp || options.isApp(createdApp))) attachToApp(createdApp);
124
131
  });
@@ -132,6 +139,8 @@ function createStoreEngineBridge(options) {
132
139
  if (debug) activeEngine.logger?.info?.("[StoreEngineBridge] installed");
133
140
  };
134
141
  const uninstall = async (context) => {
142
+ lifecycleToken++;
143
+ pendingAppCreatedToken = null;
135
144
  const engine = context ? resolveEngine(context) : activeEngine;
136
145
  engine.api?.unregister?.(name);
137
146
  clearEngineState(engine, name);
@@ -1 +1 @@
1
- {"version":3,"file":"plugin.cjs","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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"}
1
+ {"version":3,"file":"plugin.cjs","names":[],"sources":["../../src/engine/plugin.ts"],"sourcesContent":["/**\r\n * @composy/store-core Engine 桥接能力\r\n *\r\n * Core 负责 engine 生命周期、state/API 同步和事件派发;框架适配层只提供 runtime 创建与 App 挂载。\r\n * @module engine/plugin\r\n */\r\n\r\nimport type {\r\n StoreEngineBridge,\r\n StoreEngineBridgeOptions,\r\n StoreEngineLike,\r\n StoreEnginePluginContextLike,\r\n StoreEngineRegisteredApi,\r\n StoreRuntimeLike,\r\n} from './types'\r\nimport { globalEventBus } from '../core/event-bus'\r\n\r\nexport const storeStateKeys = {\r\n BUS: 'store:bus' as const,\r\n PINIA: 'store:pinia' as const,\r\n API: 'store:api' as const,\r\n REGISTRY: 'store:registry' as const,\r\n RUNTIME: 'store:runtime' as const,\r\n} as const\r\n\r\nexport const storeEventKeys = {\r\n INSTALLED: 'store:installed' as const,\r\n UNINSTALLED: 'store:uninstalled' as const,\r\n} as const\r\n\r\ntype RuntimeOwner = 'engine' | 'external'\r\n\r\nfunction resolveEngine(context: unknown): StoreEngineLike {\r\n const value = context as\r\n StoreEnginePluginContextLike | StoreEngineLike | null | undefined\r\n if (value && typeof value === 'object' && 'engine' in value) {\r\n return value.engine ?? {}\r\n }\r\n\r\n return (value ?? {}) as StoreEngineLike\r\n}\r\n\r\nfunction resolvePluginContext(\r\n context: unknown\r\n): StoreEnginePluginContextLike | undefined {\r\n return context && typeof context === 'object'\r\n ? (context as StoreEnginePluginContextLike)\r\n : undefined\r\n}\r\n\r\nfunction resolveDefaultApp(\r\n engine: StoreEngineLike,\r\n context: StoreEnginePluginContextLike | undefined,\r\n payload?: unknown\r\n): unknown {\r\n const payloadObject = payload as\r\n { app?: unknown; framework?: { app?: unknown } } | undefined\r\n return (\r\n payloadObject?.app ??\r\n payloadObject?.framework?.app ??\r\n engine.getApp?.() ??\r\n context?.framework?.app\r\n )\r\n}\r\n\r\nfunction createRegisteredApi(\r\n name: string,\r\n version: string,\r\n runtime: StoreRuntimeLike\r\n): StoreEngineRegisteredApi {\r\n return {\r\n name,\r\n version,\r\n pinia: runtime.pinia,\r\n getStore: runtime.storeAPI.getStore,\r\n hasStore: runtime.storeAPI.hasStore,\r\n getStoreIds: runtime.storeAPI.getStoreIds,\r\n resetAll: runtime.storeAPI.resetAll,\r\n }\r\n}\r\n\r\nfunction registerEngineApi(\r\n engine: StoreEngineLike,\r\n name: string,\r\n version: string,\r\n runtime: StoreRuntimeLike\r\n): void {\r\n if (!engine.api?.register) {\r\n return\r\n }\r\n\r\n const api = createRegisteredApi(name, version, runtime)\r\n engine.api.unregister?.(name)\r\n\r\n if (engine.api.register.length >= 2) {\r\n ;(\r\n engine.api.register as (\r\n name: string,\r\n api: StoreEngineRegisteredApi\r\n ) => void\r\n )(name, api)\r\n return\r\n }\r\n\r\n ;(engine.api.register as (api: StoreEngineRegisteredApi) => void)(api)\r\n}\r\n\r\nfunction syncEngineState<Runtime extends StoreRuntimeLike>(\r\n engine: StoreEngineLike,\r\n name: string,\r\n options: StoreEngineBridgeOptions<Runtime>,\r\n runtime: Runtime\r\n): void {\r\n engine.state?.set?.(storeStateKeys.RUNTIME, runtime)\r\n engine.state?.set?.(storeStateKeys.PINIA, runtime.pinia)\r\n engine.state?.set?.(storeStateKeys.API, runtime.storeAPI)\r\n engine.state?.set?.(storeStateKeys.REGISTRY, runtime.registry)\r\n engine.state?.set?.(storeStateKeys.BUS, globalEventBus)\r\n engine.state?.set?.(`plugins.${name}`, runtime.storeAPI)\r\n engine.state?.set?.(`plugins.${name}.config`, options)\r\n}\r\n\r\nfunction clearEngineState(engine: StoreEngineLike, name: string): void {\r\n engine.state?.delete?.(storeStateKeys.RUNTIME)\r\n engine.state?.delete?.(storeStateKeys.PINIA)\r\n engine.state?.delete?.(storeStateKeys.API)\r\n engine.state?.delete?.(storeStateKeys.REGISTRY)\r\n engine.state?.delete?.(storeStateKeys.BUS)\r\n engine.state?.delete?.(`plugins.${name}`)\r\n engine.state?.delete?.(`plugins.${name}.config`)\r\n}\r\n\r\nfunction registerContainerServices(\r\n context: StoreEnginePluginContextLike | undefined,\r\n runtime: StoreRuntimeLike\r\n): void {\r\n if (!context?.container?.singleton) {\r\n return\r\n }\r\n\r\n try {\r\n context.container.singleton('pinia', runtime.pinia)\r\n context.container.singleton('storeAPI', runtime.storeAPI)\r\n context.container.singleton('storeRegistry', runtime.registry)\r\n context.container.singleton('storeRuntime', runtime)\r\n } catch {\r\n // 同一个 engine 重复安装时可能已存在单例,保持幂等即可。\r\n }\r\n}\r\n\r\nexport function createStoreEngineBridge<Runtime extends StoreRuntimeLike>(\r\n options: StoreEngineBridgeOptions<Runtime>\r\n): StoreEngineBridge {\r\n const {\r\n createRuntime,\r\n debug = false,\r\n name = 'store',\r\n onRuntimeChange,\r\n version = '0.0.1',\r\n } = options\r\n\r\n let activeEngine: StoreEngineLike = {}\r\n let activeContext: StoreEnginePluginContextLike | undefined\r\n let runtime: Runtime | null = null\r\n let runtimeOwner: RuntimeOwner | null = null\r\n let lifecycleToken = 0\r\n let pendingAppCreatedToken: number | null = null\r\n\r\n const bindRuntime = (nextRuntime: Runtime, owner: RuntimeOwner): Runtime => {\r\n const previousRuntime = runtime\r\n const previousOwner = runtimeOwner\r\n\r\n runtime = nextRuntime\r\n runtimeOwner = owner\r\n onRuntimeChange?.(nextRuntime)\r\n\r\n syncEngineState(activeEngine, name, options, nextRuntime)\r\n registerEngineApi(activeEngine, name, version, nextRuntime)\r\n registerContainerServices(activeContext, nextRuntime)\r\n\r\n if (\r\n previousRuntime &&\r\n previousRuntime !== nextRuntime &&\r\n previousOwner === 'engine'\r\n ) {\r\n previousRuntime.dispose?.()\r\n }\r\n\r\n return nextRuntime\r\n }\r\n\r\n const ensureRuntime = (): Runtime => {\r\n if (runtime && runtimeOwner === 'engine') {\r\n return runtime\r\n }\r\n\r\n return createRuntime()\r\n }\r\n\r\n const attachToApp = (app: unknown): Runtime => {\r\n const installedRuntime = options.getRuntimeFromApp?.(app)\r\n if (installedRuntime) {\r\n return bindRuntime(installedRuntime, 'external')\r\n }\r\n\r\n const nextRuntime = ensureRuntime()\r\n const mountedRuntime = options.attachToApp\r\n ? options.attachToApp(app, nextRuntime)\r\n : nextRuntime\r\n const owner: RuntimeOwner =\r\n mountedRuntime === nextRuntime ? 'engine' : 'external'\r\n return bindRuntime(mountedRuntime, owner)\r\n }\r\n\r\n const install = async (context: unknown): Promise<void> => {\r\n const installToken = ++lifecycleToken\r\n pendingAppCreatedToken = null\r\n activeEngine = resolveEngine(context)\r\n activeContext = resolvePluginContext(context)\r\n\r\n const app = options.resolveApp\r\n ? options.resolveApp(activeEngine, activeContext ?? {}, undefined)\r\n : resolveDefaultApp(activeEngine, activeContext)\r\n\r\n if (app && (!options.isApp || options.isApp(app))) {\r\n attachToApp(app)\r\n } else {\r\n bindRuntime(ensureRuntime(), 'engine')\r\n pendingAppCreatedToken = installToken\r\n activeEngine.events?.once?.('app:created', (payload?: unknown) => {\r\n if (\r\n pendingAppCreatedToken !== installToken ||\r\n lifecycleToken !== installToken ||\r\n !runtime\r\n ) {\r\n return\r\n }\r\n\r\n pendingAppCreatedToken = null\r\n const createdApp = options.resolveApp\r\n ? options.resolveApp(activeEngine, activeContext ?? {}, payload)\r\n : resolveDefaultApp(activeEngine, activeContext, payload)\r\n if (createdApp && (!options.isApp || options.isApp(createdApp))) {\r\n attachToApp(createdApp)\r\n }\r\n })\r\n }\r\n\r\n await activeEngine.events?.emit?.(storeEventKeys.INSTALLED, {\r\n name,\r\n version,\r\n pinia: runtime?.pinia,\r\n storeAPI: runtime?.storeAPI,\r\n })\r\n\r\n if (debug) {\r\n activeEngine.logger?.info?.('[StoreEngineBridge] installed')\r\n }\r\n }\r\n\r\n const uninstall = async (context?: unknown): Promise<void> => {\r\n lifecycleToken++\r\n pendingAppCreatedToken = null\r\n const engine = context ? resolveEngine(context) : activeEngine\r\n\r\n engine.api?.unregister?.(name)\r\n clearEngineState(engine, name)\r\n await engine.events?.emit?.(storeEventKeys.UNINSTALLED, { name })\r\n\r\n if (runtime && runtimeOwner === 'engine') {\r\n runtime.dispose?.()\r\n }\r\n\r\n runtime = null\r\n runtimeOwner = null\r\n onRuntimeChange?.(null)\r\n\r\n if (debug) {\r\n engine.logger?.info?.('[StoreEngineBridge] uninstalled')\r\n }\r\n }\r\n\r\n return {\r\n attachToApp,\r\n getRuntime: () => runtime,\r\n install,\r\n uninstall,\r\n }\r\n}\r\n"],"mappings":"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"}
@@ -17,4 +17,3 @@ export declare const storeEventKeys: {
17
17
  readonly UNINSTALLED: "store:uninstalled";
18
18
  };
19
19
  export declare function createStoreEngineBridge<Runtime extends StoreRuntimeLike>(options: StoreEngineBridgeOptions<Runtime>): StoreEngineBridge;
20
- //# sourceMappingURL=plugin.d.ts.map
@@ -2,7 +2,7 @@
2
2
  * ***********************************
3
3
  * @composy/store-core v0.0.1 *
4
4
  * Built with rollup *
5
- * Build time: 2024-08-17 11:27:33 *
5
+ * Build time: 2024-10-12 17:23:58 *
6
6
  * Build mode: production *
7
7
  * Minified: No *
8
8
  * ***********************************
@@ -78,4 +78,3 @@ export interface StoreEngineBridge {
78
78
  uninstall: (context?: unknown) => Promise<void>;
79
79
  }
80
80
  export type { EventBus };
81
- //# sourceMappingURL=types.d.ts.map
@@ -2,7 +2,7 @@
2
2
  * ***********************************
3
3
  * @composy/store-core v0.0.1 *
4
4
  * Built with rollup *
5
- * Build time: 2024-08-17 11:27:33 *
5
+ * Build time: 2024-10-12 17:23:58 *
6
6
  * Build mode: production *
7
7
  * Minified: No *
8
8
  * ***********************************
@@ -10,6 +10,14 @@
10
10
  "use strict";
11
11
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
12
12
  //#region src/errors/index.ts
13
+ var __defProp = Object.defineProperty;
14
+ var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, {
15
+ enumerable: true,
16
+ configurable: true,
17
+ writable: true,
18
+ value
19
+ }) : obj[key] = value;
20
+ var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value);
13
21
  var StoreErrorCode = /* @__PURE__ */ ((StoreErrorCode2) => {
14
22
  StoreErrorCode2["STORE_DISPOSED"] = "STORE_DISPOSED";
15
23
  StoreErrorCode2["STORE_NOT_FOUND"] = "STORE_NOT_FOUND";
@@ -44,6 +52,14 @@ var StoreError = class StoreError extends Error {
44
52
  */
45
53
  constructor(message, code = "UNKNOWN_ERROR", context = {}, severity = "error", cause) {
46
54
  super(message);
55
+ /** 错误代码 */
56
+ __publicField(this, "code");
57
+ /** 错误上下文 */
58
+ __publicField(this, "context");
59
+ /** 错误严重级别 */
60
+ __publicField(this, "severity");
61
+ /** 原始错误 */
62
+ __publicField(this, "cause");
47
63
  this.name = "StoreError";
48
64
  this.code = code;
49
65
  this.context = {
@@ -1 +1 @@
1
- {"version":3,"file":"index.cjs","names":["StoreErrorCode","ErrorSeverity"],"sources":["../../src/errors/index.ts"],"sourcesContent":["/**\n * 自定义错误类\n *\n * 提供统一的错误处理模式\n * @module errors\n */\n\n/**\n * Store 错误代码\n */\nexport enum StoreErrorCode {\n /** Store 已销毁 */\n STORE_DISPOSED = 'STORE_DISPOSED',\n /** Store 不存在 */\n STORE_NOT_FOUND = 'STORE_NOT_FOUND',\n /** Store 已存在 */\n STORE_ALREADY_EXISTS = 'STORE_ALREADY_EXISTS',\n /** 无效的状态 */\n INVALID_STATE = 'INVALID_STATE',\n /** 无效的 Action */\n INVALID_ACTION = 'INVALID_ACTION',\n /** 序列化错误 */\n SERIALIZATION_ERROR = 'SERIALIZATION_ERROR',\n /** 反序列化错误 */\n DESERIALIZATION_ERROR = 'DESERIALIZATION_ERROR',\n /** 存储错误 */\n STORAGE_ERROR = 'STORAGE_ERROR',\n /** 插件错误 */\n PLUGIN_ERROR = 'PLUGIN_ERROR',\n /** 中间件错误 */\n MIDDLEWARE_ERROR = 'MIDDLEWARE_ERROR',\n /** 订阅错误 */\n SUBSCRIPTION_ERROR = 'SUBSCRIPTION_ERROR',\n /** 超时错误 */\n TIMEOUT_ERROR = 'TIMEOUT_ERROR',\n /** 未知错误 */\n UNKNOWN_ERROR = 'UNKNOWN_ERROR',\n}\n\n/**\n * 错误严重级别\n */\nexport enum ErrorSeverity {\n /** 警告 - 不影响功能,但需要注意 */\n WARNING = 'warning',\n /** 错误 - 影响部分功能 */\n ERROR = 'error',\n /** 致命 - 导致系统无法正常运行 */\n FATAL = 'fatal',\n}\n\n/**\n * Store 错误上下文\n */\nexport interface StoreErrorContext {\n /** Store ID */\n storeId?: string\n /** Action 名称 */\n action?: string\n /** 插件名称 */\n plugin?: string\n /** 中间件名称 */\n middleware?: string\n /** 额外数据 */\n data?: unknown\n /** 时间戳 */\n timestamp?: number\n}\n\n/**\n * Store 基础错误类\n *\n * 所有 Store 相关错误的基类\n *\n * @example\n * ```typescript\n * try {\n * store.someAction()\n * } catch (error) {\n * if (error instanceof StoreError) {\n * console.log('Store error:', error.code, error.message)\n * console.log('Context:', error.context)\n * }\n * }\n * ```\n */\nexport class StoreError extends Error {\n /** 错误代码 */\n readonly code: StoreErrorCode\n\n /** 错误上下文 */\n readonly context: StoreErrorContext\n\n /** 错误严重级别 */\n readonly severity: ErrorSeverity\n\n /** 原始错误 */\n readonly cause?: Error\n\n /**\n * 创建 Store 错误\n *\n * @param message - 错误消息\n * @param code - 错误代码\n * @param context - 错误上下文\n * @param severity - 错误严重级别\n * @param cause - 原始错误\n */\n constructor(\n message: string,\n code: StoreErrorCode = StoreErrorCode.UNKNOWN_ERROR,\n context: StoreErrorContext = {},\n severity: ErrorSeverity = ErrorSeverity.ERROR,\n cause?: Error,\n ) {\n super(message)\n this.name = 'StoreError'\n this.code = code\n this.context = {\n ...context,\n timestamp: context.timestamp ?? Date.now(),\n }\n this.severity = severity\n this.cause = cause\n\n // 保持正确的原型链\n Object.setPrototypeOf(this, StoreError.prototype)\n\n // 捕获堆栈跟踪\n if (Error.captureStackTrace) {\n Error.captureStackTrace(this, StoreError)\n }\n }\n\n /**\n * 转换为 JSON\n */\n toJSON(): Record<string, unknown> {\n return {\n name: this.name,\n message: this.message,\n code: this.code,\n context: this.context,\n severity: this.severity,\n stack: this.stack,\n }\n }\n\n /**\n * 格式化错误信息\n */\n format(): string {\n const parts = [`[${this.code}] ${this.message}`]\n\n if (this.context.storeId) {\n parts.push(`Store: ${this.context.storeId}`)\n }\n\n if (this.context.action) {\n parts.push(`Action: ${this.context.action}`)\n }\n\n return parts.join(' | ')\n }\n}\n\n/**\n * Store 销毁错误\n *\n * 当尝试操作已销毁的 Store 时抛出\n */\nexport class StoreDisposedError extends StoreError {\n constructor(storeId: string, action?: string) {\n super(\n `Store \"${storeId}\" 已被销毁,无法执行操作${action ? `: ${action}` : ''}`,\n StoreErrorCode.STORE_DISPOSED,\n { storeId, action },\n ErrorSeverity.ERROR,\n )\n this.name = 'StoreDisposedError'\n Object.setPrototypeOf(this, StoreDisposedError.prototype)\n }\n}\n\n/**\n * Store 不存在错误\n */\nexport class StoreNotFoundError extends StoreError {\n constructor(storeId: string) {\n super(\n `Store \"${storeId}\" 不存在`,\n StoreErrorCode.STORE_NOT_FOUND,\n { storeId },\n ErrorSeverity.ERROR,\n )\n this.name = 'StoreNotFoundError'\n Object.setPrototypeOf(this, StoreNotFoundError.prototype)\n }\n}\n\n/**\n * Store 已存在错误\n */\nexport class StoreAlreadyExistsError extends StoreError {\n constructor(storeId: string) {\n super(\n `Store \"${storeId}\" 已存在`,\n StoreErrorCode.STORE_ALREADY_EXISTS,\n { storeId },\n ErrorSeverity.WARNING,\n )\n this.name = 'StoreAlreadyExistsError'\n Object.setPrototypeOf(this, StoreAlreadyExistsError.prototype)\n }\n}\n\n/**\n * 无效状态错误\n */\nexport class InvalidStateError extends StoreError {\n constructor(message: string, storeId?: string, data?: unknown) {\n super(\n message,\n StoreErrorCode.INVALID_STATE,\n { storeId, data },\n ErrorSeverity.ERROR,\n )\n this.name = 'InvalidStateError'\n Object.setPrototypeOf(this, InvalidStateError.prototype)\n }\n}\n\n/**\n * 序列化错误\n */\nexport class SerializationError extends StoreError {\n constructor(message: string, cause?: Error, storeId?: string) {\n super(\n message,\n StoreErrorCode.SERIALIZATION_ERROR,\n { storeId },\n ErrorSeverity.ERROR,\n cause,\n )\n this.name = 'SerializationError'\n Object.setPrototypeOf(this, SerializationError.prototype)\n }\n}\n\n/**\n * 反序列化错误\n */\nexport class DeserializationError extends StoreError {\n constructor(message: string, cause?: Error, storeId?: string) {\n super(\n message,\n StoreErrorCode.DESERIALIZATION_ERROR,\n { storeId },\n ErrorSeverity.ERROR,\n cause,\n )\n this.name = 'DeserializationError'\n Object.setPrototypeOf(this, DeserializationError.prototype)\n }\n}\n\n/**\n * 存储错误\n */\nexport class StorageError extends StoreError {\n constructor(message: string, cause?: Error, storeId?: string) {\n super(\n message,\n StoreErrorCode.STORAGE_ERROR,\n { storeId },\n ErrorSeverity.ERROR,\n cause,\n )\n this.name = 'StorageError'\n Object.setPrototypeOf(this, StorageError.prototype)\n }\n}\n\n/**\n * 插件错误\n */\nexport class PluginError extends StoreError {\n constructor(message: string, pluginName: string, cause?: Error) {\n super(\n message,\n StoreErrorCode.PLUGIN_ERROR,\n { plugin: pluginName },\n ErrorSeverity.ERROR,\n cause,\n )\n this.name = 'PluginError'\n Object.setPrototypeOf(this, PluginError.prototype)\n }\n}\n\n/**\n * 中间件错误\n */\nexport class MiddlewareError extends StoreError {\n constructor(message: string, middlewareName: string, cause?: Error) {\n super(\n message,\n StoreErrorCode.MIDDLEWARE_ERROR,\n { middleware: middlewareName },\n ErrorSeverity.ERROR,\n cause,\n )\n this.name = 'MiddlewareError'\n Object.setPrototypeOf(this, MiddlewareError.prototype)\n }\n}\n\n/**\n * 订阅错误\n */\nexport class SubscriptionError extends StoreError {\n constructor(message: string, cause?: Error, storeId?: string) {\n super(\n message,\n StoreErrorCode.SUBSCRIPTION_ERROR,\n { storeId },\n ErrorSeverity.WARNING,\n cause,\n )\n this.name = 'SubscriptionError'\n Object.setPrototypeOf(this, SubscriptionError.prototype)\n }\n}\n\n/**\n * 超时错误\n */\nexport class TimeoutError extends StoreError {\n constructor(message: string, storeId?: string, action?: string) {\n super(\n message,\n StoreErrorCode.TIMEOUT_ERROR,\n { storeId, action },\n ErrorSeverity.ERROR,\n )\n this.name = 'TimeoutError'\n Object.setPrototypeOf(this, TimeoutError.prototype)\n }\n}\n\n/**\n * 错误处理工具\n */\nexport const errorUtils = {\n /**\n * 判断是否为 Store 错误\n */\n isStoreError(error: unknown): error is StoreError {\n return error instanceof StoreError\n },\n\n /**\n * 判断是否为特定类型的错误\n */\n isErrorCode(error: unknown, code: StoreErrorCode): boolean {\n return error instanceof StoreError && error.code === code\n },\n\n /**\n * 包装错误为 Store 错误\n */\n wrap(error: unknown, code: StoreErrorCode = StoreErrorCode.UNKNOWN_ERROR, context: StoreErrorContext = {}): StoreError {\n if (error instanceof StoreError) {\n return error\n }\n\n const message = error instanceof Error ? error.message : String(error)\n const cause = error instanceof Error ? error : undefined\n\n return new StoreError(message, code, context, ErrorSeverity.ERROR, cause)\n },\n\n /**\n * 安全执行函数,捕获并包装错误\n */\n async tryCatch<T>(\n fn: () => T | Promise<T>,\n code: StoreErrorCode = StoreErrorCode.UNKNOWN_ERROR,\n context: StoreErrorContext = {},\n ): Promise<T> {\n try {\n return await fn()\n }\n catch (error) {\n throw errorUtils.wrap(error, code, context)\n }\n },\n\n /**\n * 创建错误日志记录器\n */\n createLogger(prefix: string) {\n return {\n error(error: StoreError): void {\n console.error(`[${prefix}]`, error.format())\n if (error.cause) {\n console.error(`[${prefix}] Caused by:`, error.cause)\n }\n },\n\n warn(error: StoreError): void {\n console.warn(`[${prefix}]`, error.format())\n },\n\n log(error: StoreError): void {\n if (error.severity === ErrorSeverity.FATAL || error.severity === ErrorSeverity.ERROR) {\n this.error(error)\n }\n else {\n this.warn(error)\n }\n },\n }\n },\n}\n\n"],"mappings":"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"}
1
+ {"version":3,"file":"index.cjs","names":["StoreErrorCode","ErrorSeverity"],"sources":["../../src/errors/index.ts"],"sourcesContent":["/**\r\n * 自定义错误类\r\n *\r\n * 提供统一的错误处理模式\r\n * @module errors\r\n */\r\n\r\n/**\r\n * Store 错误代码\r\n */\r\nexport enum StoreErrorCode {\r\n /** Store 已销毁 */\r\n STORE_DISPOSED = 'STORE_DISPOSED',\r\n /** Store 不存在 */\r\n STORE_NOT_FOUND = 'STORE_NOT_FOUND',\r\n /** Store 已存在 */\r\n STORE_ALREADY_EXISTS = 'STORE_ALREADY_EXISTS',\r\n /** 无效的状态 */\r\n INVALID_STATE = 'INVALID_STATE',\r\n /** 无效的 Action */\r\n INVALID_ACTION = 'INVALID_ACTION',\r\n /** 序列化错误 */\r\n SERIALIZATION_ERROR = 'SERIALIZATION_ERROR',\r\n /** 反序列化错误 */\r\n DESERIALIZATION_ERROR = 'DESERIALIZATION_ERROR',\r\n /** 存储错误 */\r\n STORAGE_ERROR = 'STORAGE_ERROR',\r\n /** 插件错误 */\r\n PLUGIN_ERROR = 'PLUGIN_ERROR',\r\n /** 中间件错误 */\r\n MIDDLEWARE_ERROR = 'MIDDLEWARE_ERROR',\r\n /** 订阅错误 */\r\n SUBSCRIPTION_ERROR = 'SUBSCRIPTION_ERROR',\r\n /** 超时错误 */\r\n TIMEOUT_ERROR = 'TIMEOUT_ERROR',\r\n /** 未知错误 */\r\n UNKNOWN_ERROR = 'UNKNOWN_ERROR',\r\n}\r\n\r\n/**\r\n * 错误严重级别\r\n */\r\nexport enum ErrorSeverity {\r\n /** 警告 - 不影响功能,但需要注意 */\r\n WARNING = 'warning',\r\n /** 错误 - 影响部分功能 */\r\n ERROR = 'error',\r\n /** 致命 - 导致系统无法正常运行 */\r\n FATAL = 'fatal',\r\n}\r\n\r\n/**\r\n * Store 错误上下文\r\n */\r\nexport interface StoreErrorContext {\r\n /** Store ID */\r\n storeId?: string\r\n /** Action 名称 */\r\n action?: string\r\n /** 插件名称 */\r\n plugin?: string\r\n /** 中间件名称 */\r\n middleware?: string\r\n /** 额外数据 */\r\n data?: unknown\r\n /** 时间戳 */\r\n timestamp?: number\r\n}\r\n\r\n/**\r\n * Store 基础错误类\r\n *\r\n * 所有 Store 相关错误的基类\r\n *\r\n * @example\r\n * ```typescript\r\n * try {\r\n * store.someAction()\r\n * } catch (error) {\r\n * if (error instanceof StoreError) {\r\n * console.log('Store error:', error.code, error.message)\r\n * console.log('Context:', error.context)\r\n * }\r\n * }\r\n * ```\r\n */\r\nexport class StoreError extends Error {\r\n /** 错误代码 */\r\n readonly code: StoreErrorCode\r\n\r\n /** 错误上下文 */\r\n readonly context: StoreErrorContext\r\n\r\n /** 错误严重级别 */\r\n readonly severity: ErrorSeverity\r\n\r\n /** 原始错误 */\r\n readonly cause?: Error\r\n\r\n /**\r\n * 创建 Store 错误\r\n *\r\n * @param message - 错误消息\r\n * @param code - 错误代码\r\n * @param context - 错误上下文\r\n * @param severity - 错误严重级别\r\n * @param cause - 原始错误\r\n */\r\n constructor(\r\n message: string,\r\n code: StoreErrorCode = StoreErrorCode.UNKNOWN_ERROR,\r\n context: StoreErrorContext = {},\r\n severity: ErrorSeverity = ErrorSeverity.ERROR,\r\n cause?: Error\r\n ) {\r\n super(message)\r\n this.name = 'StoreError'\r\n this.code = code\r\n this.context = {\r\n ...context,\r\n timestamp: context.timestamp ?? Date.now(),\r\n }\r\n this.severity = severity\r\n this.cause = cause\r\n\r\n // 保持正确的原型链\r\n Object.setPrototypeOf(this, StoreError.prototype)\r\n\r\n // 捕获堆栈跟踪\r\n if (Error.captureStackTrace) {\r\n Error.captureStackTrace(this, StoreError)\r\n }\r\n }\r\n\r\n /**\r\n * 转换为 JSON\r\n */\r\n toJSON(): Record<string, unknown> {\r\n return {\r\n name: this.name,\r\n message: this.message,\r\n code: this.code,\r\n context: this.context,\r\n severity: this.severity,\r\n stack: this.stack,\r\n }\r\n }\r\n\r\n /**\r\n * 格式化错误信息\r\n */\r\n format(): string {\r\n const parts = [`[${this.code}] ${this.message}`]\r\n\r\n if (this.context.storeId) {\r\n parts.push(`Store: ${this.context.storeId}`)\r\n }\r\n\r\n if (this.context.action) {\r\n parts.push(`Action: ${this.context.action}`)\r\n }\r\n\r\n return parts.join(' | ')\r\n }\r\n}\r\n\r\n/**\r\n * Store 销毁错误\r\n *\r\n * 当尝试操作已销毁的 Store 时抛出\r\n */\r\nexport class StoreDisposedError extends StoreError {\r\n constructor(storeId: string, action?: string) {\r\n super(\r\n `Store \"${storeId}\" 已被销毁,无法执行操作${action ? `: ${action}` : ''}`,\r\n StoreErrorCode.STORE_DISPOSED,\r\n { storeId, action },\r\n ErrorSeverity.ERROR\r\n )\r\n this.name = 'StoreDisposedError'\r\n Object.setPrototypeOf(this, StoreDisposedError.prototype)\r\n }\r\n}\r\n\r\n/**\r\n * Store 不存在错误\r\n */\r\nexport class StoreNotFoundError extends StoreError {\r\n constructor(storeId: string) {\r\n super(\r\n `Store \"${storeId}\" 不存在`,\r\n StoreErrorCode.STORE_NOT_FOUND,\r\n { storeId },\r\n ErrorSeverity.ERROR\r\n )\r\n this.name = 'StoreNotFoundError'\r\n Object.setPrototypeOf(this, StoreNotFoundError.prototype)\r\n }\r\n}\r\n\r\n/**\r\n * Store 已存在错误\r\n */\r\nexport class StoreAlreadyExistsError extends StoreError {\r\n constructor(storeId: string) {\r\n super(\r\n `Store \"${storeId}\" 已存在`,\r\n StoreErrorCode.STORE_ALREADY_EXISTS,\r\n { storeId },\r\n ErrorSeverity.WARNING\r\n )\r\n this.name = 'StoreAlreadyExistsError'\r\n Object.setPrototypeOf(this, StoreAlreadyExistsError.prototype)\r\n }\r\n}\r\n\r\n/**\r\n * 无效状态错误\r\n */\r\nexport class InvalidStateError extends StoreError {\r\n constructor(message: string, storeId?: string, data?: unknown) {\r\n super(\r\n message,\r\n StoreErrorCode.INVALID_STATE,\r\n { storeId, data },\r\n ErrorSeverity.ERROR\r\n )\r\n this.name = 'InvalidStateError'\r\n Object.setPrototypeOf(this, InvalidStateError.prototype)\r\n }\r\n}\r\n\r\n/**\r\n * 序列化错误\r\n */\r\nexport class SerializationError extends StoreError {\r\n constructor(message: string, cause?: Error, storeId?: string) {\r\n super(\r\n message,\r\n StoreErrorCode.SERIALIZATION_ERROR,\r\n { storeId },\r\n ErrorSeverity.ERROR,\r\n cause\r\n )\r\n this.name = 'SerializationError'\r\n Object.setPrototypeOf(this, SerializationError.prototype)\r\n }\r\n}\r\n\r\n/**\r\n * 反序列化错误\r\n */\r\nexport class DeserializationError extends StoreError {\r\n constructor(message: string, cause?: Error, storeId?: string) {\r\n super(\r\n message,\r\n StoreErrorCode.DESERIALIZATION_ERROR,\r\n { storeId },\r\n ErrorSeverity.ERROR,\r\n cause\r\n )\r\n this.name = 'DeserializationError'\r\n Object.setPrototypeOf(this, DeserializationError.prototype)\r\n }\r\n}\r\n\r\n/**\r\n * 存储错误\r\n */\r\nexport class StorageError extends StoreError {\r\n constructor(message: string, cause?: Error, storeId?: string) {\r\n super(\r\n message,\r\n StoreErrorCode.STORAGE_ERROR,\r\n { storeId },\r\n ErrorSeverity.ERROR,\r\n cause\r\n )\r\n this.name = 'StorageError'\r\n Object.setPrototypeOf(this, StorageError.prototype)\r\n }\r\n}\r\n\r\n/**\r\n * 插件错误\r\n */\r\nexport class PluginError extends StoreError {\r\n constructor(message: string, pluginName: string, cause?: Error) {\r\n super(\r\n message,\r\n StoreErrorCode.PLUGIN_ERROR,\r\n { plugin: pluginName },\r\n ErrorSeverity.ERROR,\r\n cause\r\n )\r\n this.name = 'PluginError'\r\n Object.setPrototypeOf(this, PluginError.prototype)\r\n }\r\n}\r\n\r\n/**\r\n * 中间件错误\r\n */\r\nexport class MiddlewareError extends StoreError {\r\n constructor(message: string, middlewareName: string, cause?: Error) {\r\n super(\r\n message,\r\n StoreErrorCode.MIDDLEWARE_ERROR,\r\n { middleware: middlewareName },\r\n ErrorSeverity.ERROR,\r\n cause\r\n )\r\n this.name = 'MiddlewareError'\r\n Object.setPrototypeOf(this, MiddlewareError.prototype)\r\n }\r\n}\r\n\r\n/**\r\n * 订阅错误\r\n */\r\nexport class SubscriptionError extends StoreError {\r\n constructor(message: string, cause?: Error, storeId?: string) {\r\n super(\r\n message,\r\n StoreErrorCode.SUBSCRIPTION_ERROR,\r\n { storeId },\r\n ErrorSeverity.WARNING,\r\n cause\r\n )\r\n this.name = 'SubscriptionError'\r\n Object.setPrototypeOf(this, SubscriptionError.prototype)\r\n }\r\n}\r\n\r\n/**\r\n * 超时错误\r\n */\r\nexport class TimeoutError extends StoreError {\r\n constructor(message: string, storeId?: string, action?: string) {\r\n super(\r\n message,\r\n StoreErrorCode.TIMEOUT_ERROR,\r\n { storeId, action },\r\n ErrorSeverity.ERROR\r\n )\r\n this.name = 'TimeoutError'\r\n Object.setPrototypeOf(this, TimeoutError.prototype)\r\n }\r\n}\r\n\r\n/**\r\n * 错误处理工具\r\n */\r\nexport const errorUtils = {\r\n /**\r\n * 判断是否为 Store 错误\r\n */\r\n isStoreError(error: unknown): error is StoreError {\r\n return error instanceof StoreError\r\n },\r\n\r\n /**\r\n * 判断是否为特定类型的错误\r\n */\r\n isErrorCode(error: unknown, code: StoreErrorCode): boolean {\r\n return error instanceof StoreError && error.code === code\r\n },\r\n\r\n /**\r\n * 包装错误为 Store 错误\r\n */\r\n wrap(\r\n error: unknown,\r\n code: StoreErrorCode = StoreErrorCode.UNKNOWN_ERROR,\r\n context: StoreErrorContext = {}\r\n ): StoreError {\r\n if (error instanceof StoreError) {\r\n return error\r\n }\r\n\r\n const message = error instanceof Error ? error.message : String(error)\r\n const cause = error instanceof Error ? error : undefined\r\n\r\n return new StoreError(message, code, context, ErrorSeverity.ERROR, cause)\r\n },\r\n\r\n /**\r\n * 安全执行函数,捕获并包装错误\r\n */\r\n async tryCatch<T>(\r\n fn: () => T | Promise<T>,\r\n code: StoreErrorCode = StoreErrorCode.UNKNOWN_ERROR,\r\n context: StoreErrorContext = {}\r\n ): Promise<T> {\r\n try {\r\n return await fn()\r\n } catch (error) {\r\n throw errorUtils.wrap(error, code, context)\r\n }\r\n },\r\n\r\n /**\r\n * 创建错误日志记录器\r\n */\r\n createLogger(prefix: string) {\r\n return {\r\n error(error: StoreError): void {\r\n console.error(`[${prefix}]`, error.format())\r\n if (error.cause) {\r\n console.error(`[${prefix}] Caused by:`, error.cause)\r\n }\r\n },\r\n\r\n warn(error: StoreError): void {\r\n console.warn(`[${prefix}]`, error.format())\r\n },\r\n\r\n log(error: StoreError): void {\r\n if (\r\n error.severity === ErrorSeverity.FATAL ||\r\n error.severity === ErrorSeverity.ERROR\r\n ) {\r\n this.error(error)\r\n } else {\r\n this.warn(error)\r\n }\r\n },\r\n }\r\n },\r\n}\r\n"],"mappings":"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"}
@@ -205,4 +205,3 @@ export declare const errorUtils: {
205
205
  log(error: StoreError): void;
206
206
  };
207
207
  };
208
- //# sourceMappingURL=index.d.ts.map
package/lib/index.cjs CHANGED
@@ -2,7 +2,7 @@
2
2
  * ***********************************
3
3
  * @composy/store-core v0.0.1 *
4
4
  * Built with rollup *
5
- * Build time: 2024-08-17 11:27:33 *
5
+ * Build time: 2024-10-12 17:23:58 *
6
6
  * Build mode: production *
7
7
  * Minified: No *
8
8
  * ***********************************
@@ -11,24 +11,24 @@
11
11
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
12
12
  const require_pub_sub = require("./core/pub-sub.cjs");
13
13
  const require_async_action = require("./core/async-action.cjs");
14
+ const require_middleware_manager = require("./middleware/middleware-manager.cjs");
15
+ const require_plugin_manager = require("./plugins/plugin-manager.cjs");
16
+ const require_debounce_throttle = require("./utils/debounce-throttle.cjs");
17
+ const require_deep_clone = require("./utils/deep-clone.cjs");
18
+ const require_selector = require("./utils/selector.cjs");
19
+ const require_batch_manager = require("./core/batch-manager.cjs");
14
20
  const require_event_bus = require("./core/event-bus.cjs");
15
21
  const require_base_store = require("./core/base-store.cjs");
16
- const require_batch_manager = require("./core/batch-manager.cjs");
17
22
  const require_create_store = require("./core/create-store.cjs");
18
23
  const require_plugin = require("./engine/plugin.cjs");
19
24
  const require_index = require("./errors/index.cjs");
20
- const require_debounce_throttle = require("./utils/debounce-throttle.cjs");
21
- const require_deep_clone = require("./utils/deep-clone.cjs");
22
- const require_selector = require("./utils/selector.cjs");
23
25
  const require_logger = require("./middleware/logger.cjs");
24
- const require_middleware_manager = require("./middleware/middleware-manager.cjs");
25
26
  const require_persist = require("./middleware/persist.cjs");
26
27
  const require_time_travel = require("./middleware/time-travel.cjs");
27
28
  const require_validation = require("./middleware/validation.cjs");
28
29
  const require_define_plugin = require("./plugins/define-plugin.cjs");
29
- const require_plugin_manager = require("./plugins/plugin-manager.cjs");
30
30
  //#region src/index.ts
31
- const version = "1.0.0";
31
+ const version = "0.0.1";
32
32
  const name = "@composy/store-core";
33
33
  //#endregion
34
34
  exports.BaseStore = require_base_store.BaseStore;
package/lib/index.cjs.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.cjs","names":[],"sources":["../src/index.ts"],"sourcesContent":["/**\n * @composy/store-core - 框架无关的状态管理核心库\n *\n * 主要功能模块:\n * - 核心抽象:Store、State、Action、Getter 等核心概念\n * - 插件系统:可扩展的插件机制\n * - 中间件:日志、持久化、时间旅行等\n * - 订阅发布:状态变化订阅、事件总线\n * - 批量更新:性能优化的批量状态更新\n * - 工具函数:深拷贝、选择器等\n *\n * @module @composy/store-core\n */\n\n// === 核心模块 ===\nexport {\n BaseStore,\n batch,\n createAsyncAction,\n createBatchManager,\n createEventBus,\n createPubSub,\n createPubSubWithValue,\n createStore,\n getGlobalBatchManager,\n globalEventBus,\n setGlobalBatchManager,\n} from './core'\n\nexport type {\n AsyncAction,\n AsyncActionOptions,\n AsyncActionState,\n CreateStoreDefinition,\n StoreAPI,\n} from './core'\n\n// Engine 插件\nexport * from './engine'\n\n// === 错误处理 ===\nexport {\n DeserializationError,\n ErrorSeverity,\n errorUtils,\n InvalidStateError,\n MiddlewareError,\n PluginError,\n SerializationError,\n StorageError,\n StoreAlreadyExistsError,\n StoreDisposedError,\n StoreError,\n StoreErrorCode,\n StoreNotFoundError,\n SubscriptionError,\n TimeoutError,\n} from './errors'\n\nexport type {\n StoreErrorContext,\n} from './errors'\n\n// === 中间件模块 ===\nexport {\n createLoggerMiddleware,\n createMiddlewareManager,\n createPersistMiddleware,\n createSimpleLoggerMiddleware,\n createTimeTravelMiddleware,\n createValidationMiddleware,\n getGlobalMiddlewareManager,\n restoreState,\n setGlobalMiddlewareManager,\n setRestoreCallback,\n} from './middleware'\n\nexport type {\n StoreValidationRules,\n ValidationError,\n ValidationMiddlewareOptions,\n ValidationResult,\n ValidationRule,\n} from './middleware'\n\n// === 插件模块 ===\nexport {\n composePlugins,\n createPluginFactory,\n createPluginManager,\n defineStorePlugin,\n getGlobalPluginManager,\n setGlobalPluginManager,\n} from './plugins'\n\n// === 类型定义 ===\nexport type {\n // Store 类型\n ActionContext,\n ActionSubscriber,\n // 订阅类型\n BatchContext,\n BatchManager,\n // 插件类型\n DefinePluginOptions,\n EventBus,\n EventData,\n EventListener,\n EventType,\n // 中间件类型\n LoggerMiddlewareOptions,\n Middleware,\n MiddlewareActionType,\n MiddlewareContext,\n MiddlewareFunction,\n MiddlewareManager,\n PersistMiddlewareOptions,\n PersistOptions,\n PluginContext,\n PluginFactory,\n PluginManager,\n PubSub,\n Selector,\n SelectorOptions,\n StateMutation,\n StateSnapshot,\n StateSubscriber,\n StateTree,\n StorageAdapter,\n StoreAction,\n StoreActions,\n StoreDefinition,\n StoreGetter,\n StoreGetters,\n StoreId,\n StoreInstance,\n StoreManagerLike,\n StoreOptions,\n StorePlugin,\n SubscribeOptions,\n Subscriber,\n SubscriptionOptions,\n TimeTravelController,\n TimeTravelMiddlewareOptions,\n Unsubscribe,\n} from './types'\n\n// === 工具函数 ===\nexport {\n combineSelectors,\n createCachedSelector,\n createMemoizedSelector,\n createSelector,\n createSelectorWithDeps,\n debounce,\n deepClone,\n deepEqual,\n deepFreeze,\n deepMerge,\n deepMergeWithOptions,\n deleteByPath,\n getByPath,\n hasPath,\n isObject,\n isPlainObject,\n setByPath,\n shallowClone,\n throttle,\n} from './utils'\n\n// === 版本信息 ===\nexport const version = '1.0.0'\nexport const name = '@composy/store-core'\n\nexport type {\n DebouncedFunction,\n DeepCloneOptions,\n DeepMergeOptions,\n MemoizedSelectorOptions,\n SelectorEqualityFn,\n ThrottledFunction,\n} from './utils'\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA2KO,MAAM,UAAU;AAChB,MAAM,OAAO"}
1
+ {"version":3,"file":"index.cjs","names":[],"sources":["../src/index.ts"],"sourcesContent":["/**\r\n * @composy/store-core - 框架无关的状态管理核心库\r\n *\r\n * 主要功能模块:\r\n * - 核心抽象:Store、State、Action、Getter 等核心概念\r\n * - 插件系统:可扩展的插件机制\r\n * - 中间件:日志、持久化、时间旅行等\r\n * - 订阅发布:状态变化订阅、事件总线\r\n * - 批量更新:性能优化的批量状态更新\r\n * - 工具函数:深拷贝、选择器等\r\n *\r\n * @module @composy/store-core\r\n */\r\n\r\n// === 核心模块 ===\r\nexport {\r\n BaseStore,\r\n batch,\r\n createAsyncAction,\r\n createBatchManager,\r\n createEventBus,\r\n createPubSub,\r\n createPubSubWithValue,\r\n createStore,\r\n getGlobalBatchManager,\r\n globalEventBus,\r\n setGlobalBatchManager,\r\n} from './core'\r\n\r\nexport type {\r\n AsyncAction,\r\n AsyncActionOptions,\r\n AsyncActionState,\r\n CreateStoreDefinition,\r\n StoreAPI,\r\n} from './core'\r\n\r\n// Engine 插件\r\nexport * from './engine'\r\n\r\n// === 错误处理 ===\r\nexport {\r\n DeserializationError,\r\n ErrorSeverity,\r\n errorUtils,\r\n InvalidStateError,\r\n MiddlewareError,\r\n PluginError,\r\n SerializationError,\r\n StorageError,\r\n StoreAlreadyExistsError,\r\n StoreDisposedError,\r\n StoreError,\r\n StoreErrorCode,\r\n StoreNotFoundError,\r\n SubscriptionError,\r\n TimeoutError,\r\n} from './errors'\r\n\r\nexport type { StoreErrorContext } from './errors'\r\n\r\n// === 中间件模块 ===\r\nexport {\r\n createLoggerMiddleware,\r\n createMiddlewareManager,\r\n createPersistMiddleware,\r\n createSimpleLoggerMiddleware,\r\n createTimeTravelMiddleware,\r\n createValidationMiddleware,\r\n getGlobalMiddlewareManager,\r\n restoreState,\r\n setGlobalMiddlewareManager,\r\n setRestoreCallback,\r\n} from './middleware'\r\n\r\nexport type {\r\n StoreValidationRules,\r\n ValidationError,\r\n ValidationMiddlewareOptions,\r\n ValidationResult,\r\n ValidationRule,\r\n} from './middleware'\r\n\r\n// === 插件模块 ===\r\nexport {\r\n composePlugins,\r\n createPluginFactory,\r\n createPluginManager,\r\n defineStorePlugin,\r\n getGlobalPluginManager,\r\n setGlobalPluginManager,\r\n} from './plugins'\r\n\r\n// === 类型定义 ===\r\nexport type {\r\n // Store 类型\r\n ActionContext,\r\n ActionSubscriber,\r\n // 订阅类型\r\n BatchContext,\r\n BatchManager,\r\n // 插件类型\r\n DefinePluginOptions,\r\n EventBus,\r\n EventData,\r\n EventListener,\r\n EventType,\r\n // 中间件类型\r\n LoggerMiddlewareOptions,\r\n Middleware,\r\n MiddlewareActionType,\r\n MiddlewareContext,\r\n MiddlewareFunction,\r\n MiddlewareManager,\r\n PersistMiddlewareOptions,\r\n PersistOptions,\r\n PluginContext,\r\n PluginFactory,\r\n PluginManager,\r\n PubSub,\r\n Selector,\r\n SelectorOptions,\r\n StateMutation,\r\n StateSnapshot,\r\n StateSubscriber,\r\n StateTree,\r\n StorageAdapter,\r\n Store,\r\n StoreAction,\r\n StoreActions,\r\n StoreDefinition,\r\n StoreGetter,\r\n StoreGetters,\r\n StoreId,\r\n StoreInstance,\r\n StoreManagerLike,\r\n StoreMiddleware,\r\n StoreMutation,\r\n StoreOptions,\r\n StorePlugin,\r\n StoreState,\r\n StoreSubscription,\r\n SubscribeOptions,\r\n Subscriber,\r\n SubscriptionOptions,\r\n TimeTravelController,\r\n TimeTravelMiddlewareOptions,\r\n Unsubscribe,\r\n} from './types'\r\n\r\n// === 工具函数 ===\r\nexport {\r\n combineSelectors,\r\n createCachedSelector,\r\n createMemoizedSelector,\r\n createSelector,\r\n createSelectorWithDeps,\r\n debounce,\r\n deepClone,\r\n deepEqual,\r\n deepFreeze,\r\n deepMerge,\r\n deepMergeWithOptions,\r\n deleteByPath,\r\n getByPath,\r\n hasPath,\r\n isObject,\r\n isPlainObject,\r\n setByPath,\r\n shallowClone,\r\n throttle,\r\n} from './utils'\r\n\r\n// === 版本信息 ===\r\nexport const version = '0.0.1'\r\nexport const name = '@composy/store-core'\r\n\r\nexport type {\r\n DebouncedFunction,\r\n DeepCloneOptions,\r\n DeepMergeOptions,\r\n MemoizedSelectorOptions,\r\n SelectorEqualityFn,\r\n ThrottledFunction,\r\n} from './utils'\r\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA8KO,MAAM,UAAU;AAChB,MAAM,OAAO"}
@@ -15,13 +15,12 @@ export { BaseStore, batch, createAsyncAction, createBatchManager, createEventBus
15
15
  export type { AsyncAction, AsyncActionOptions, AsyncActionState, CreateStoreDefinition, StoreAPI, } from './core';
16
16
  export * from './engine';
17
17
  export { DeserializationError, ErrorSeverity, errorUtils, InvalidStateError, MiddlewareError, PluginError, SerializationError, StorageError, StoreAlreadyExistsError, StoreDisposedError, StoreError, StoreErrorCode, StoreNotFoundError, SubscriptionError, TimeoutError, } from './errors';
18
- export type { StoreErrorContext, } from './errors';
18
+ export type { StoreErrorContext } from './errors';
19
19
  export { createLoggerMiddleware, createMiddlewareManager, createPersistMiddleware, createSimpleLoggerMiddleware, createTimeTravelMiddleware, createValidationMiddleware, getGlobalMiddlewareManager, restoreState, setGlobalMiddlewareManager, setRestoreCallback, } from './middleware';
20
20
  export type { StoreValidationRules, ValidationError, ValidationMiddlewareOptions, ValidationResult, ValidationRule, } from './middleware';
21
21
  export { composePlugins, createPluginFactory, createPluginManager, defineStorePlugin, getGlobalPluginManager, setGlobalPluginManager, } from './plugins';
22
- export type { ActionContext, ActionSubscriber, BatchContext, BatchManager, DefinePluginOptions, EventBus, EventData, EventListener, EventType, LoggerMiddlewareOptions, Middleware, MiddlewareActionType, MiddlewareContext, MiddlewareFunction, MiddlewareManager, PersistMiddlewareOptions, PersistOptions, PluginContext, PluginFactory, PluginManager, PubSub, Selector, SelectorOptions, StateMutation, StateSnapshot, StateSubscriber, StateTree, StorageAdapter, StoreAction, StoreActions, StoreDefinition, StoreGetter, StoreGetters, StoreId, StoreInstance, StoreManagerLike, StoreOptions, StorePlugin, SubscribeOptions, Subscriber, SubscriptionOptions, TimeTravelController, TimeTravelMiddlewareOptions, Unsubscribe, } from './types';
22
+ export type { ActionContext, ActionSubscriber, BatchContext, BatchManager, DefinePluginOptions, EventBus, EventData, EventListener, EventType, LoggerMiddlewareOptions, Middleware, MiddlewareActionType, MiddlewareContext, MiddlewareFunction, MiddlewareManager, PersistMiddlewareOptions, PersistOptions, PluginContext, PluginFactory, PluginManager, PubSub, Selector, SelectorOptions, StateMutation, StateSnapshot, StateSubscriber, StateTree, StorageAdapter, Store, StoreAction, StoreActions, StoreDefinition, StoreGetter, StoreGetters, StoreId, StoreInstance, StoreManagerLike, StoreMiddleware, StoreMutation, StoreOptions, StorePlugin, StoreState, StoreSubscription, SubscribeOptions, Subscriber, SubscriptionOptions, TimeTravelController, TimeTravelMiddlewareOptions, Unsubscribe, } from './types';
23
23
  export { combineSelectors, createCachedSelector, createMemoizedSelector, createSelector, createSelectorWithDeps, debounce, deepClone, deepEqual, deepFreeze, deepMerge, deepMergeWithOptions, deleteByPath, getByPath, hasPath, isObject, isPlainObject, setByPath, shallowClone, throttle, } from './utils';
24
- export declare const version = "1.0.0";
24
+ export declare const version = "0.0.1";
25
25
  export declare const name = "@composy/store-core";
26
26
  export type { DebouncedFunction, DeepCloneOptions, DeepMergeOptions, MemoizedSelectorOptions, SelectorEqualityFn, ThrottledFunction, } from './utils';
27
- //# sourceMappingURL=index.d.ts.map
@@ -2,15 +2,15 @@
2
2
  * ***********************************
3
3
  * @composy/store-core v0.0.1 *
4
4
  * Built with rollup *
5
- * Build time: 2024-08-17 11:27:33 *
5
+ * Build time: 2024-10-12 17:23:58 *
6
6
  * Build mode: production *
7
7
  * Minified: No *
8
8
  * ***********************************
9
9
  */
10
10
  "use strict";
11
11
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
12
- const require_logger = require("./logger.cjs");
13
12
  const require_middleware_manager = require("./middleware-manager.cjs");
13
+ const require_logger = require("./logger.cjs");
14
14
  const require_persist = require("./persist.cjs");
15
15
  const require_time_travel = require("./time-travel.cjs");
16
16
  const require_validation = require("./validation.cjs");
@@ -6,8 +6,7 @@
6
6
  */
7
7
  export { createLoggerMiddleware, createProductionLoggerMiddleware, createSimpleLoggerMiddleware, } from './logger';
8
8
  export { createMiddlewareManager, getGlobalMiddlewareManager, setGlobalMiddlewareManager, } from './middleware-manager';
9
- export { createPersistMiddleware, restoreState, } from './persist';
10
- export { createTimeTravelMiddleware, setRestoreCallback, } from './time-travel';
11
- export { createValidationMiddleware, } from './validation';
9
+ export { createPersistMiddleware, restoreState } from './persist';
10
+ export { createTimeTravelMiddleware, setRestoreCallback } from './time-travel';
11
+ export { createValidationMiddleware } from './validation';
12
12
  export type { StoreValidationRules, ValidationError, ValidationMiddlewareOptions, ValidationResult, ValidationRule, } from './validation';
13
- //# sourceMappingURL=index.d.ts.map
@@ -2,15 +2,15 @@
2
2
  * ***********************************
3
3
  * @composy/store-core v0.0.1 *
4
4
  * Built with rollup *
5
- * Build time: 2024-08-17 11:27:33 *
5
+ * Build time: 2024-10-12 17:23:58 *
6
6
  * Build mode: production *
7
7
  * Minified: No *
8
8
  * ***********************************
9
9
  */
10
10
  "use strict";
11
11
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
12
- const require_index = require("../errors/index.cjs");
13
12
  const require_deep_clone = require("../utils/deep-clone.cjs");
13
+ const require_index = require("../errors/index.cjs");
14
14
  //#region src/middleware/logger.ts
15
15
  const defaultOptions = {
16
16
  logState: true,
@@ -1 +1 @@
1
- {"version":3,"file":"logger.cjs","names":[],"sources":["../../src/middleware/logger.ts"],"sourcesContent":["/**\n * 日志中间件\n *\n * 提供状态变化和 Action 调用的日志记录,支持多种日志级别和格式化选项\n * @module middleware/logger\n */\n\nimport type { LoggerMiddlewareOptions, Middleware, MiddlewareContext, StateTree } from '../types'\nimport { MiddlewareError } from '../errors'\nimport { deepClone } from '../utils'\n\n/**\n * 默认日志选项\n */\nconst defaultOptions: Required<Omit<LoggerMiddlewareOptions, 'logger' | 'filter'>> = {\n logState: true,\n logAction: true,\n collapsed: true,\n timestamp: true,\n level: 'log',\n}\n\n/**\n * 日志颜色配置\n */\nconst LOG_COLORS = {\n prevState: 'color: #9E9E9E; font-weight: bold',\n action: 'color: #03A9F4; font-weight: bold',\n nextState: 'color: #4CAF50; font-weight: bold',\n error: 'color: #F44336; font-weight: bold',\n duration: 'color: #9C27B0; font-weight: normal',\n title: 'color: inherit; font-weight: bold',\n} as const\n\n/**\n * 格式化时间戳\n *\n * @param date - 日期对象\n * @returns 格式化的时间字符串\n */\nfunction formatTime(date: Date): string {\n const hours = date.getHours().toString().padStart(2, '0')\n const minutes = date.getMinutes().toString().padStart(2, '0')\n const seconds = date.getSeconds().toString().padStart(2, '0')\n const ms = date.getMilliseconds().toString().padStart(3, '0')\n return `${hours}:${minutes}:${seconds}.${ms}`\n}\n\n/**\n * 格式化时间差\n *\n * @param startTime - 开始时间\n * @param endTime - 结束时间\n * @returns 格式化的时间差字符串\n */\nfunction formatDuration(startTime: number, endTime: number): string {\n const duration = endTime - startTime\n if (duration < 1) {\n return '< 1ms'\n }\n return `${duration.toFixed(2)}ms`\n}\n\n/**\n * 安全克隆状态(防止日志中的对象被修改)\n *\n * @param state - 状态对象\n * @returns 克隆后的状态\n */\nfunction safeCloneState<S extends StateTree>(state: S): S {\n try {\n return deepClone(state)\n }\n catch {\n // 如果克隆失败,返回浅拷贝\n return { ...state }\n }\n}\n\n/**\n * 创建日志中间件\n *\n * 提供完整的状态变化和 Action 调用日志记录,支持时间戳、分组和性能计时\n *\n * @param options - 日志选项\n * @returns 日志中间件\n *\n * @example\n * ```typescript\n * const logger = createLoggerMiddleware({\n * logState: true,\n * collapsed: true,\n * timestamp: true,\n * filter: (context) => context.storeId !== 'internal'\n * })\n *\n * middlewareManager.use(logger)\n * ```\n */\nexport function createLoggerMiddleware(\n options: LoggerMiddlewareOptions = {},\n): Middleware {\n const opts = { ...defaultOptions, ...options }\n const logger = opts.logger ?? console\n\n return {\n name: 'logger',\n priority: 0, // 最先执行,确保能记录所有操作\n\n handler: async (context: MiddlewareContext, next: () => void | Promise<void>) => {\n const { storeId, type, state, payload } = context\n\n // 应用自定义过滤器\n if (opts.filter && !opts.filter(context)) {\n await next()\n return\n }\n\n // 判断是否需要记录\n const isStateChange = type.startsWith('state:')\n const isAction = type.startsWith('action:')\n\n if ((isStateChange && !opts.logState) || (isAction && !opts.logAction)) {\n await next()\n return\n }\n\n const timestamp = opts.timestamp ? formatTime(new Date()) : ''\n const prefix = `[Store: ${storeId}]`\n const startTime = performance.now()\n\n // 保存操作前的状态\n const prevState = safeCloneState(state)\n\n // 开始分组\n const groupTitle = timestamp ? `${timestamp} ${prefix} ${type}` : `${prefix} ${type}`\n\n const startGroup = (): void => {\n if (opts.collapsed && typeof logger.groupCollapsed === 'function') {\n logger.groupCollapsed(`%c${groupTitle}`, LOG_COLORS.title)\n }\n else if (typeof logger.group === 'function') {\n logger.group(`%c${groupTitle}`, LOG_COLORS.title)\n }\n }\n\n const endGroup = (): void => {\n if (typeof logger.groupEnd === 'function') {\n logger.groupEnd()\n }\n }\n\n startGroup()\n\n try {\n // 记录操作前的状态\n const logFn = logger[opts.level ?? 'log'] ?? logger.log\n\n if (typeof logFn === 'function') {\n logFn.call(logger, '%c prev state', LOG_COLORS.prevState, prevState)\n\n if (payload !== undefined) {\n logFn.call(logger, '%c payload', LOG_COLORS.action, payload)\n }\n }\n\n // 执行下一个中间件\n await next()\n\n const endTime = performance.now()\n\n // 记录操作后的状态\n if (typeof logFn === 'function') {\n logFn.call(logger, '%c next state', LOG_COLORS.nextState, safeCloneState(context.state))\n logFn.call(logger, '%c duration', LOG_COLORS.duration, formatDuration(startTime, endTime))\n }\n }\n catch (error) {\n // 记录错误\n if (typeof logger.error === 'function') {\n logger.error('%c error', LOG_COLORS.error, error)\n }\n\n // 包装并重新抛出错误\n throw new MiddlewareError(\n `日志中间件执行错误: ${error instanceof Error ? error.message : String(error)}`,\n 'logger',\n error instanceof Error ? error : undefined,\n )\n }\n finally {\n endGroup()\n }\n },\n }\n}\n\n/**\n * 简单日志中间件(不使用分组,适合生产环境)\n *\n * @param options - 配置选项\n * @param options.includePayload - 是否输出 payload\n * @param options.format - 自定义日志格式化函数\n * @param options.filter - 日志过滤器\n * @returns 简单日志中间件\n *\n * @example\n * ```typescript\n * const logger = createSimpleLoggerMiddleware({\n * includePayload: true,\n * format: (ctx) => `${ctx.storeId}: ${ctx.type}`\n * })\n * ```\n */\nexport function createSimpleLoggerMiddleware(options: {\n /** 是否包含 payload */\n includePayload?: boolean\n /** 自定义格式化函数 */\n format?: (context: MiddlewareContext) => string\n /** 过滤器 */\n filter?: (context: MiddlewareContext) => boolean\n} = {}): Middleware {\n const { includePayload = true, format, filter } = options\n\n return {\n name: 'simple-logger',\n priority: 0,\n\n handler: async (context: MiddlewareContext, next: () => void | Promise<void>) => {\n const { storeId, type, payload } = context\n\n // 应用过滤器\n if (filter && !filter(context)) {\n await next()\n return\n }\n\n // 使用自定义格式化或默认格式\n const message = format\n ? format(context)\n : `[Store: ${storeId}] ${type}`\n\n if (includePayload && payload !== undefined) {\n console.info(message, payload)\n }\n else {\n console.info(message)\n }\n\n await next()\n },\n }\n}\n\n/**\n * 创建生产环境日志中间件\n *\n * 只记录错误和警告,不记录正常状态变化\n *\n * @param options - 配置选项\n * @param options.onError - 自定义错误处理器\n * @returns 生产环境日志中间件\n */\nexport function createProductionLoggerMiddleware(options: {\n /** 自定义错误处理器 */\n onError?: (error: Error, context: MiddlewareContext) => void\n} = {}): Middleware {\n const { onError } = options\n\n return {\n name: 'production-logger',\n priority: 0,\n\n handler: async (context: MiddlewareContext, next: () => void | Promise<void>) => {\n try {\n await next()\n }\n catch (error) {\n const err = error instanceof Error ? error : new Error(String(error))\n\n if (onError) {\n onError(err, context)\n }\n else {\n console.error(`[Store Error] ${context.storeId}:`, err)\n }\n\n throw error\n }\n },\n }\n}\n\n"],"mappings":"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"}
1
+ {"version":3,"file":"logger.cjs","names":[],"sources":["../../src/middleware/logger.ts"],"sourcesContent":["/**\r\n * 日志中间件\r\n *\r\n * 提供状态变化和 Action 调用的日志记录,支持多种日志级别和格式化选项\r\n * @module middleware/logger\r\n */\r\n\r\nimport type {\r\n LoggerMiddlewareOptions,\r\n Middleware,\r\n MiddlewareContext,\r\n StateTree,\r\n} from '../types'\r\nimport { MiddlewareError } from '../errors'\r\nimport { deepClone } from '../utils'\r\n\r\n/**\r\n * 默认日志选项\r\n */\r\nconst defaultOptions: Required<\r\n Omit<LoggerMiddlewareOptions, 'logger' | 'filter'>\r\n> = {\r\n logState: true,\r\n logAction: true,\r\n collapsed: true,\r\n timestamp: true,\r\n level: 'log',\r\n}\r\n\r\n/**\r\n * 日志颜色配置\r\n */\r\nconst LOG_COLORS = {\r\n prevState: 'color: #9E9E9E; font-weight: bold',\r\n action: 'color: #03A9F4; font-weight: bold',\r\n nextState: 'color: #4CAF50; font-weight: bold',\r\n error: 'color: #F44336; font-weight: bold',\r\n duration: 'color: #9C27B0; font-weight: normal',\r\n title: 'color: inherit; font-weight: bold',\r\n} as const\r\n\r\n/**\r\n * 格式化时间戳\r\n *\r\n * @param date - 日期对象\r\n * @returns 格式化的时间字符串\r\n */\r\nfunction formatTime(date: Date): string {\r\n const hours = date.getHours().toString().padStart(2, '0')\r\n const minutes = date.getMinutes().toString().padStart(2, '0')\r\n const seconds = date.getSeconds().toString().padStart(2, '0')\r\n const ms = date.getMilliseconds().toString().padStart(3, '0')\r\n return `${hours}:${minutes}:${seconds}.${ms}`\r\n}\r\n\r\n/**\r\n * 格式化时间差\r\n *\r\n * @param startTime - 开始时间\r\n * @param endTime - 结束时间\r\n * @returns 格式化的时间差字符串\r\n */\r\nfunction formatDuration(startTime: number, endTime: number): string {\r\n const duration = endTime - startTime\r\n if (duration < 1) {\r\n return '< 1ms'\r\n }\r\n return `${duration.toFixed(2)}ms`\r\n}\r\n\r\n/**\r\n * 安全克隆状态(防止日志中的对象被修改)\r\n *\r\n * @param state - 状态对象\r\n * @returns 克隆后的状态\r\n */\r\nfunction safeCloneState<S extends StateTree>(state: S): S {\r\n try {\r\n return deepClone(state)\r\n } catch {\r\n // 如果克隆失败,返回浅拷贝\r\n return { ...state }\r\n }\r\n}\r\n\r\n/**\r\n * 创建日志中间件\r\n *\r\n * 提供完整的状态变化和 Action 调用日志记录,支持时间戳、分组和性能计时\r\n *\r\n * @param options - 日志选项\r\n * @returns 日志中间件\r\n *\r\n * @example\r\n * ```typescript\r\n * const logger = createLoggerMiddleware({\r\n * logState: true,\r\n * collapsed: true,\r\n * timestamp: true,\r\n * filter: (context) => context.storeId !== 'internal'\r\n * })\r\n *\r\n * middlewareManager.use(logger)\r\n * ```\r\n */\r\nexport function createLoggerMiddleware(\r\n options: LoggerMiddlewareOptions = {}\r\n): Middleware {\r\n const opts = { ...defaultOptions, ...options }\r\n const logger = opts.logger ?? console\r\n\r\n return {\r\n name: 'logger',\r\n priority: 0, // 最先执行,确保能记录所有操作\r\n\r\n handler: async (\r\n context: MiddlewareContext,\r\n next: () => void | Promise<void>\r\n ) => {\r\n const { storeId, type, state, payload } = context\r\n\r\n // 应用自定义过滤器\r\n if (opts.filter && !opts.filter(context)) {\r\n await next()\r\n return\r\n }\r\n\r\n // 判断是否需要记录\r\n const isStateChange = type.startsWith('state:')\r\n const isAction = type.startsWith('action:')\r\n\r\n if ((isStateChange && !opts.logState) || (isAction && !opts.logAction)) {\r\n await next()\r\n return\r\n }\r\n\r\n const timestamp = opts.timestamp ? formatTime(new Date()) : ''\r\n const prefix = `[Store: ${storeId}]`\r\n const startTime = performance.now()\r\n\r\n // 保存操作前的状态\r\n const prevState = safeCloneState(state)\r\n\r\n // 开始分组\r\n const groupTitle = timestamp\r\n ? `${timestamp} ${prefix} ${type}`\r\n : `${prefix} ${type}`\r\n\r\n const startGroup = (): void => {\r\n if (opts.collapsed && typeof logger.groupCollapsed === 'function') {\r\n logger.groupCollapsed(`%c${groupTitle}`, LOG_COLORS.title)\r\n } else if (typeof logger.group === 'function') {\r\n logger.group(`%c${groupTitle}`, LOG_COLORS.title)\r\n }\r\n }\r\n\r\n const endGroup = (): void => {\r\n if (typeof logger.groupEnd === 'function') {\r\n logger.groupEnd()\r\n }\r\n }\r\n\r\n startGroup()\r\n\r\n try {\r\n // 记录操作前的状态\r\n const logFn = logger[opts.level ?? 'log'] ?? logger.log\r\n\r\n if (typeof logFn === 'function') {\r\n logFn.call(logger, '%c prev state', LOG_COLORS.prevState, prevState)\r\n\r\n if (payload !== undefined) {\r\n logFn.call(logger, '%c payload', LOG_COLORS.action, payload)\r\n }\r\n }\r\n\r\n // 执行下一个中间件\r\n await next()\r\n\r\n const endTime = performance.now()\r\n\r\n // 记录操作后的状态\r\n if (typeof logFn === 'function') {\r\n logFn.call(\r\n logger,\r\n '%c next state',\r\n LOG_COLORS.nextState,\r\n safeCloneState(context.state)\r\n )\r\n logFn.call(\r\n logger,\r\n '%c duration',\r\n LOG_COLORS.duration,\r\n formatDuration(startTime, endTime)\r\n )\r\n }\r\n } catch (error) {\r\n // 记录错误\r\n if (typeof logger.error === 'function') {\r\n logger.error('%c error', LOG_COLORS.error, error)\r\n }\r\n\r\n // 包装并重新抛出错误\r\n throw new MiddlewareError(\r\n `日志中间件执行错误: ${error instanceof Error ? error.message : String(error)}`,\r\n 'logger',\r\n error instanceof Error ? error : undefined\r\n )\r\n } finally {\r\n endGroup()\r\n }\r\n },\r\n }\r\n}\r\n\r\n/**\r\n * 简单日志中间件(不使用分组,适合生产环境)\r\n *\r\n * @param options - 配置选项\r\n * @param options.includePayload - 是否输出 payload\r\n * @param options.format - 自定义日志格式化函数\r\n * @param options.filter - 日志过滤器\r\n * @returns 简单日志中间件\r\n *\r\n * @example\r\n * ```typescript\r\n * const logger = createSimpleLoggerMiddleware({\r\n * includePayload: true,\r\n * format: (ctx) => `${ctx.storeId}: ${ctx.type}`\r\n * })\r\n * ```\r\n */\r\nexport function createSimpleLoggerMiddleware(\r\n options: {\r\n /** 是否包含 payload */\r\n includePayload?: boolean\r\n /** 自定义格式化函数 */\r\n format?: (context: MiddlewareContext) => string\r\n /** 过滤器 */\r\n filter?: (context: MiddlewareContext) => boolean\r\n } = {}\r\n): Middleware {\r\n const { includePayload = true, format, filter } = options\r\n\r\n return {\r\n name: 'simple-logger',\r\n priority: 0,\r\n\r\n handler: async (\r\n context: MiddlewareContext,\r\n next: () => void | Promise<void>\r\n ) => {\r\n const { storeId, type, payload } = context\r\n\r\n // 应用过滤器\r\n if (filter && !filter(context)) {\r\n await next()\r\n return\r\n }\r\n\r\n // 使用自定义格式化或默认格式\r\n const message = format ? format(context) : `[Store: ${storeId}] ${type}`\r\n\r\n if (includePayload && payload !== undefined) {\r\n console.info(message, payload)\r\n } else {\r\n console.info(message)\r\n }\r\n\r\n await next()\r\n },\r\n }\r\n}\r\n\r\n/**\r\n * 创建生产环境日志中间件\r\n *\r\n * 只记录错误和警告,不记录正常状态变化\r\n *\r\n * @param options - 配置选项\r\n * @param options.onError - 自定义错误处理器\r\n * @returns 生产环境日志中间件\r\n */\r\nexport function createProductionLoggerMiddleware(\r\n options: {\r\n /** 自定义错误处理器 */\r\n onError?: (error: Error, context: MiddlewareContext) => void\r\n } = {}\r\n): Middleware {\r\n const { onError } = options\r\n\r\n return {\r\n name: 'production-logger',\r\n priority: 0,\r\n\r\n handler: async (\r\n context: MiddlewareContext,\r\n next: () => void | Promise<void>\r\n ) => {\r\n try {\r\n await next()\r\n } catch (error) {\r\n const err = error instanceof Error ? error : new Error(String(error))\r\n\r\n if (onError) {\r\n onError(err, context)\r\n } else {\r\n console.error(`[Store Error] ${context.storeId}:`, err)\r\n }\r\n\r\n throw error\r\n }\r\n },\r\n }\r\n}\r\n"],"mappings":"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"}
@@ -64,4 +64,3 @@ export declare function createProductionLoggerMiddleware(options?: {
64
64
  /** 自定义错误处理器 */
65
65
  onError?: (error: Error, context: MiddlewareContext) => void;
66
66
  }): Middleware;
67
- //# sourceMappingURL=logger.d.ts.map
@@ -2,7 +2,7 @@
2
2
  * ***********************************
3
3
  * @composy/store-core v0.0.1 *
4
4
  * Built with rollup *
5
- * Build time: 2024-08-17 11:27:33 *
5
+ * Build time: 2024-10-12 17:23:58 *
6
6
  * Build mode: production *
7
7
  * Minified: No *
8
8
  * ***********************************
@@ -39,7 +39,10 @@ function createMiddlewareManager() {
39
39
  if (sorted.length === 0) return;
40
40
  const dispatch = async (index) => {
41
41
  const middleware = sorted[index];
42
- if (!middleware) return;
42
+ if (!middleware) {
43
+ context.meta?.commit?.();
44
+ return;
45
+ }
43
46
  let called = false;
44
47
  const next = async () => {
45
48
  if (called) throw new Error(`[Middleware] next() called multiple times in "${middleware.name}"`);