@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
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":["batch","StoreErrorCode","ErrorSeverity","result"],"sources":["../src/core/pub-sub.ts","../src/core/async-action.ts","../src/core/event-bus.ts","../src/core/base-store.ts","../src/core/batch-manager.ts","../src/core/create-store.ts","../src/engine/plugin.ts","../src/errors/index.ts","../src/utils/debounce-throttle.ts","../src/utils/deep-clone.ts","../src/utils/selector.ts","../src/middleware/logger.ts","../src/middleware/middleware-manager.ts","../src/middleware/persist.ts","../src/middleware/time-travel.ts","../src/middleware/validation.ts","../src/plugins/define-plugin.ts","../src/plugins/plugin-manager.ts","../src/index.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","/**\n * 异步 Action 工具\n *\n * 提供框架无关的异步操作状态管理\n * @module core/async-action\n */\n\nimport type { Unsubscribe } from '../types'\nimport { createPubSub } from './pub-sub'\n\n/**\n * 异步 Action 配置\n */\nexport interface AsyncActionOptions {\n /** 重试次数 (默认 0) */\n retryCount?: number\n /** 重试间隔 (毫秒, 默认 1000) */\n retryDelay?: number\n /** 超时时间 (毫秒, 0=不限) */\n timeout?: number\n /** 执行前是否自动清除上次错误 */\n resetOnExecute?: boolean\n}\n\n/**\n * 异步 Action 状态\n */\nexport interface AsyncActionState<T> {\n /** 返回数据 */\n data: T | null\n /** 错误信息 */\n error: Error | null\n /** 是否加载中 */\n loading: boolean\n /** 执行次数 */\n executionCount: number\n /** 最后执行时间 */\n lastExecutedAt: number | null\n}\n\n/**\n * 异步 Action 实例\n */\nexport interface AsyncAction<T, Args extends unknown[]> {\n /** 当前状态 */\n readonly state: AsyncActionState<T>\n /** 执行异步操作 */\n execute: (...args: Args) => Promise<T>\n /** 重置状态 */\n reset: () => void\n /** 取消当前执行 */\n abort: () => void\n /** 订阅状态变化 */\n subscribe: (callback: (state: AsyncActionState<T>) => void) => Unsubscribe\n /** 设置成功回调 */\n onSuccess: (callback: (data: T) => void) => Unsubscribe\n /** 设置错误回调 */\n onError: (callback: (error: Error) => void) => Unsubscribe\n}\n\n/**\n * 延迟工具函数\n */\nfunction delay(ms: number): Promise<void> {\n return new Promise(resolve => setTimeout(resolve, ms))\n}\n\n/**\n * 创建异步 Action\n *\n * 将异步函数包装为带状态追踪的 Action,自动管理 loading/data/error 状态\n *\n * @template T - 返回数据类型\n * @template Args - 参数类型\n * @param fn - 异步函数\n * @param options - 配置选项\n * @returns AsyncAction 实例\n *\n * @example\n * ```typescript\n * // 基本用法\n * const fetchUsers = createAsyncAction(async (page: number) => {\n * const res = await fetch(`/api/users?page=${page}`)\n * return res.json()\n * })\n *\n * await fetchUsers.execute(1)\n * console.log(fetchUsers.state.data) // 用户列表\n * console.log(fetchUsers.state.loading) // false\n *\n * // 带重试\n * const fetchWithRetry = createAsyncAction(\n * async () => fetch('/api/unstable').then(r => r.json()),\n * { retryCount: 3, retryDelay: 1000 }\n * )\n *\n * // 订阅状态变化\n * fetchUsers.subscribe((state) => {\n * console.log('loading:', state.loading, 'data:', state.data)\n * })\n *\n * // 成功/错误回调\n * fetchUsers.onSuccess((data) => console.log('Got:', data))\n * fetchUsers.onError((err) => console.error('Failed:', err))\n * ```\n */\nexport function createAsyncAction<T, Args extends unknown[] = []>(\n fn: (...args: Args) => Promise<T>,\n options: AsyncActionOptions = {},\n): AsyncAction<T, Args> {\n const {\n retryCount = 0,\n retryDelay = 1000,\n timeout = 0,\n resetOnExecute = true,\n } = options\n\n // 内部状态\n const _state: AsyncActionState<T> = {\n data: null,\n error: null,\n loading: false,\n executionCount: 0,\n lastExecutedAt: null,\n }\n\n // 发布/订阅\n const statePubSub = createPubSub<AsyncActionState<T>>()\n const successPubSub = createPubSub<T>()\n const errorPubSub = createPubSub<Error>()\n\n // 当前 AbortController\n let abortController: AbortController | null = null\n\n /** 通知状态变化 */\n const notify = (): void => {\n statePubSub.publish({ ..._state })\n }\n\n /** 执行带重试的异步函数 */\n const executeWithRetry = async (args: Args, retriesLeft: number): Promise<T> => {\n try {\n return await fn(...args)\n }\n catch (error) {\n if (retriesLeft > 0 && !abortController?.signal.aborted) {\n await delay(retryDelay)\n if (abortController?.signal.aborted) {\n throw new Error('Aborted')\n }\n return executeWithRetry(args, retriesLeft - 1)\n }\n throw error\n }\n }\n\n /** 执行 */\n const execute = async (...args: Args): Promise<T> => {\n // 取消上一次执行\n if (abortController) {\n abortController.abort()\n }\n abortController = new AbortController()\n\n if (resetOnExecute) {\n _state.error = null\n }\n\n _state.loading = true\n _state.executionCount++\n _state.lastExecutedAt = Date.now()\n notify()\n\n try {\n let result: T\n\n if (timeout > 0) {\n const timeoutPromise = new Promise<never>((_, reject) => {\n setTimeout(() => reject(new Error(`Timeout after ${timeout}ms`)), timeout)\n })\n result = await Promise.race([\n executeWithRetry(args, retryCount),\n timeoutPromise,\n ])\n }\n else {\n result = await executeWithRetry(args, retryCount)\n }\n\n if (!abortController.signal.aborted) {\n _state.data = result\n _state.error = null\n _state.loading = false\n notify()\n successPubSub.publish(result)\n }\n\n return result\n }\n catch (error) {\n if (!abortController.signal.aborted) {\n const err = error instanceof Error ? error : new Error(String(error))\n _state.error = err\n _state.loading = false\n notify()\n errorPubSub.publish(err)\n }\n throw error\n }\n }\n\n /** 重置 */\n const reset = (): void => {\n if (abortController) {\n abortController.abort()\n abortController = null\n }\n _state.data = null\n _state.error = null\n _state.loading = false\n _state.executionCount = 0\n _state.lastExecutedAt = null\n notify()\n }\n\n /** 取消 */\n const abort = (): void => {\n if (abortController) {\n abortController.abort()\n abortController = null\n }\n if (_state.loading) {\n _state.loading = false\n _state.error = new Error('Aborted')\n notify()\n }\n }\n\n return {\n get state() { return { ..._state } },\n execute,\n reset,\n abort,\n subscribe: (callback) => statePubSub.subscribe(callback),\n onSuccess: (callback) => successPubSub.subscribe(callback),\n onError: (callback) => errorPubSub.subscribe(callback),\n }\n}\n","/**\n * 事件总线实现\n *\n * 提供事件的发布/订阅功能\n * @module core/event-bus\n */\n\nimport type { EventBus, EventData, EventListener, EventType, Unsubscribe } from '../types'\n\n/**\n * 创建事件总线\n *\n * @returns 事件总线实例\n *\n * @example\n * ```typescript\n * const bus = createEventBus()\n *\n * // 监听事件\n * const unsubscribe = bus.on('state:changed', (data) => {\n * console.log('状态变化:', data)\n * })\n *\n * // 发送事件\n * bus.emit('state:changed', { storeId: 'counter', newValue: 1 })\n *\n * // 取消监听\n * unsubscribe()\n * ```\n */\nexport function createEventBus(): EventBus {\n /** 事件监听器映射 */\n const listeners = new Map<EventType | '*', Set<EventListener>>()\n\n /**\n * 获取或创建监听器集合\n */\n const getListeners = (type: EventType | '*'): Set<EventListener> => {\n let set = listeners.get(type)\n if (!set) {\n set = new Set()\n listeners.set(type, set)\n }\n return set\n }\n\n /**\n * 监听事件\n */\n const on = (type: EventType | '*', listener: EventListener): Unsubscribe => {\n const set = getListeners(type)\n set.add(listener)\n\n return () => {\n set.delete(listener)\n if (set.size === 0) {\n listeners.delete(type)\n }\n }\n }\n\n /**\n * 取消监听\n */\n const off = (type: EventType | '*', listener?: EventListener): void => {\n if (listener) {\n const set = listeners.get(type)\n if (set) {\n set.delete(listener)\n if (set.size === 0) {\n listeners.delete(type)\n }\n }\n }\n else {\n listeners.delete(type)\n }\n }\n\n /**\n * 监听一次\n */\n const once = (type: EventType, listener: EventListener): Unsubscribe => {\n const wrappedListener: EventListener = (data) => {\n listener(data)\n off(type, wrappedListener)\n }\n return on(type, wrappedListener)\n }\n\n /**\n * 发送事件\n */\n const emit = (type: EventType, payload?: unknown): void => {\n const data: EventData = {\n type,\n payload,\n timestamp: Date.now(),\n }\n\n // 触发特定类型的监听器\n const typeListeners = listeners.get(type)\n if (typeListeners) {\n typeListeners.forEach(listener => listener(data))\n }\n\n // 触发通配符监听器\n const wildcardListeners = listeners.get('*')\n if (wildcardListeners) {\n wildcardListeners.forEach(listener => listener(data))\n }\n }\n\n /**\n * 清空所有监听器\n */\n const clear = (): void => {\n listeners.clear()\n }\n\n return {\n on,\n once,\n off,\n emit,\n clear,\n }\n}\n\n/**\n * 全局事件总线实例\n */\nexport const globalEventBus = createEventBus()\n\n","/**\n * 基础 Store 抽象类\n *\n * 提供框架无关的 Store 基础实现\n * @module core/base-store\n */\n\nimport type {\n ActionContext,\n ActionSubscriber,\n StateMutation,\n StateSubscriber,\n StateTree,\n StoreActions,\n StoreDefinition,\n StoreGetters,\n StoreId,\n StoreInstance,\n StoreOptions,\n SubscribeOptions,\n Unsubscribe,\n} from '../types'\nimport { globalEventBus } from './event-bus'\nimport { createPubSub } from './pub-sub'\n\ntype ActionCallback = (value: unknown) => void | Promise<void>\n\nfunction isPromiseLike(value: unknown): value is Promise<unknown> {\n return !!value && typeof (value as { then?: unknown }).then === 'function'\n}\n\nasync function runCallbacks(callbacks: ActionCallback[], value: unknown): Promise<void> {\n for (const callback of callbacks) {\n await callback(value)\n }\n}\n\n/**\n * 基础 Store 类\n *\n * @template Id - Store ID 类型\n * @template S - 状态类型\n * @template G - Getters 类型\n * @template A - Actions 类型\n */\nexport class BaseStore<\n Id extends StoreId = StoreId,\n S extends StateTree = StateTree,\n G extends StoreGetters<S> = StoreGetters<S>,\n A extends StoreActions = StoreActions,\n> implements StoreInstance<Id, S, G, A> {\n /** Store ID */\n readonly $id: Id\n\n /** Getter 计算结果 */\n readonly getters: { [K in keyof G]: ReturnType<G[K]> }\n\n /** Action 方法集合 */\n readonly actions: A\n\n /** 状态订阅管理器 */\n private stateSubscribers = createPubSub<{ mutation: StateMutation<S>, state: S }>()\n\n /** Action 订阅管理器 */\n private actionSubscribers = createPubSub<ActionContext<A>>()\n\n /** 初始状态工厂 */\n private initialStateFactory: () => S\n\n /** 当前状态 */\n private _state: S\n\n /** 是否已销毁 */\n private disposed = false\n\n /**\n * 构造函数\n *\n * @param definition - Store 定义\n * @param _options - Store 配置选项\n */\n constructor(\n definition: StoreDefinition<Id, S, G, A>,\n _options: StoreOptions = {},\n ) {\n this.$id = definition.id\n this.initialStateFactory = definition.state\n this._state = definition.state()\n this.getters = this.createGetters((definition.getters || {}) as G)\n this.actions = this.createActions((definition.actions || {}) as A)\n\n // 发送 Store 创建事件\n globalEventBus.emit('store:created', { storeId: this.$id })\n }\n\n /**\n * 获取当前状态\n */\n get $state(): S {\n return this._state\n }\n\n /**\n * 设置状态\n */\n set $state(newState: S) {\n this._state = newState\n }\n\n /**\n * 重置状态到初始值\n */\n $reset(): void {\n this.checkDisposed()\n const oldState = { ...this._state }\n this._state = this.initialStateFactory()\n\n this.notifyStateChange({\n type: 'direct',\n storeId: this.$id,\n oldState,\n })\n }\n\n /**\n * 批量更新状态\n */\n $patch(partialState: Partial<S> | ((state: S) => void)): void {\n this.checkDisposed()\n const oldState = { ...this._state }\n\n if (typeof partialState === 'function') {\n partialState(this._state)\n this.notifyStateChange({\n type: 'patch function',\n storeId: this.$id,\n oldState,\n })\n }\n else {\n Object.assign(this._state, partialState)\n this.notifyStateChange({\n type: 'patch object',\n storeId: this.$id,\n oldState,\n events: Object.keys(partialState),\n })\n }\n }\n\n /**\n * 订阅状态变化\n */\n $subscribe(\n callback: StateSubscriber<S>,\n options: SubscribeOptions = {},\n ): Unsubscribe {\n this.checkDisposed()\n\n return this.stateSubscribers.subscribe(\n ({ mutation, state }) => callback(mutation, state),\n { immediate: options.immediate },\n )\n }\n\n /**\n * 订阅 Action 调用\n */\n $onAction(callback: ActionSubscriber<A>): Unsubscribe {\n this.checkDisposed()\n\n return this.actionSubscribers.subscribe(callback)\n }\n\n /**\n * 销毁 Store\n */\n $dispose(): void {\n if (this.disposed) return\n\n this.disposed = true\n this.stateSubscribers.clear()\n this.actionSubscribers.clear()\n\n globalEventBus.emit('store:disposed', { storeId: this.$id })\n }\n\n /**\n * 通知状态变化\n */\n protected notifyStateChange(mutation: StateMutation<S>): void {\n this.stateSubscribers.publish({ mutation, state: this._state })\n globalEventBus.emit('state:changed', {\n storeId: this.$id,\n state: this._state,\n mutation,\n })\n }\n\n /**\n * 通知 Action 调用\n */\n protected notifyAction(context: ActionContext<A>): void {\n this.actionSubscribers.publish(context)\n }\n\n /**\n * 检查是否已销毁\n */\n private checkDisposed(): void {\n if (this.disposed) {\n throw new Error(`[Store] Store \"${this.$id}\" 已被销毁`)\n }\n }\n\n private createGetters(\n gettersDefinition: G,\n ): { [K in keyof G]: ReturnType<G[K]> } {\n const getterCache = {} as { [K in keyof G]: ReturnType<G[K]> }\n\n for (const key of Object.keys(gettersDefinition) as Array<keyof G>) {\n Object.defineProperty(getterCache, key, {\n enumerable: true,\n get: () => gettersDefinition[key](this._state),\n })\n }\n\n return getterCache\n }\n\n private createActions(actionsDefinition: A): A {\n const actionCache = {} as A\n\n for (const key of Object.keys(actionsDefinition) as Array<keyof A>) {\n const action = actionsDefinition[key]\n actionCache[key] = ((...args: unknown[]) => {\n this.checkDisposed()\n\n const afterCallbacks: ActionCallback[] = []\n const errorCallbacks: ActionCallback[] = []\n const context: ActionContext<A> = {\n after: callback => afterCallbacks.push(callback),\n args,\n name: key,\n onError: callback => errorCallbacks.push(callback),\n storeId: this.$id,\n }\n\n this.notifyAction(context)\n\n try {\n const result = action.apply(this, args)\n\n if (isPromiseLike(result)) {\n return result\n .then(async (resolvedResult) => {\n await runCallbacks(afterCallbacks, resolvedResult)\n return resolvedResult\n })\n .catch(async (error: unknown) => {\n await runCallbacks(errorCallbacks, error)\n throw error\n }) as ReturnType<A[typeof key]>\n }\n\n void runCallbacks(afterCallbacks, result)\n return result\n }\n catch (error) {\n void runCallbacks(errorCallbacks, error)\n throw error\n }\n }) as A[typeof key]\n }\n\n return actionCache\n }\n}\n\n","/**\n * 批量更新管理器\n *\n * 用于优化多个状态更新的性能\n * @module core/batch-manager\n */\n\nimport type { BatchManager, StoreId } from '../types'\n\n/**\n * 创建批量更新管理器\n *\n * @param onFlush - 刷新回调,接收所有待更新的 Store ID\n * @returns 批量更新管理器实例\n *\n * @example\n * ```typescript\n * const batchManager = createBatchManager((storeIds) => {\n * storeIds.forEach(id => {\n * // 通知订阅者更新\n * notifySubscribers(id)\n * })\n * })\n *\n * // 批量更新\n * batchManager.batch(() => {\n * store1.count++\n * store2.name = 'new name'\n * })\n * ```\n */\nexport function createBatchManager(\n onFlush?: (storeIds: Set<StoreId>) => void,\n): BatchManager {\n /** 批处理嵌套深度,0 表示不在批处理上下文。 */\n let batchDepth = 0\n\n /** 待更新的 Store ID 集合 */\n const pendingStores = new Set<StoreId>()\n\n /**\n * 刷新待更新的 Store\n */\n const flush = (): void => {\n if (pendingStores.size > 0) {\n const stores = new Set(pendingStores)\n pendingStores.clear()\n onFlush?.(stores)\n }\n }\n\n /**\n * 开始批量更新\n */\n const start = (): void => {\n batchDepth++\n }\n\n /**\n * 结束批量更新\n */\n const end = (): void => {\n if (batchDepth === 0) {\n return\n }\n\n batchDepth--\n if (batchDepth === 0) {\n flush()\n }\n }\n\n /**\n * 标记 Store 需要更新\n */\n const markDirty = (storeId: StoreId): void => {\n pendingStores.add(storeId)\n\n // 如果不在批量更新中,立即刷新\n if (batchDepth === 0) {\n flush()\n }\n }\n\n /**\n * 在批量上下文中执行\n */\n const batch = <T>(fn: () => T): T => {\n start()\n try {\n return fn()\n }\n finally {\n end()\n }\n }\n\n /**\n * 是否正在批量更新\n */\n const isBatching = (): boolean => batchDepth > 0\n\n return {\n start,\n end,\n markDirty,\n batch,\n isBatching,\n }\n}\n\n/**\n * 全局批量更新管理器\n */\nlet globalBatchManager: BatchManager | null = null\n\n/**\n * 获取全局批量更新管理器\n */\nexport function getGlobalBatchManager(): BatchManager {\n if (!globalBatchManager) {\n globalBatchManager = createBatchManager()\n }\n return globalBatchManager\n}\n\n/**\n * 设置全局批量更新管理器\n */\nexport function setGlobalBatchManager(manager: BatchManager): void {\n globalBatchManager = manager\n}\n\n/**\n * 批量更新辅助函数\n *\n * @param fn - 执行函数\n * @returns 执行结果\n */\nexport function batch<T>(fn: () => T): T {\n return getGlobalBatchManager().batch(fn)\n}\n\n","/**\n * @module store/core/create-store\n *\n * Store 工厂函数,用于创建单例 Store 的惰性初始化函数。\n * 基于 BaseStore 实现,返回的工厂函数在首次调用时创建 Store 实例,\n * 后续调用返回同一实例,直到调用 $dispose() 后重置。\n */\n\nimport type {\n ActionSubscriber,\n StateMutation,\n StateSubscriber,\n StateTree,\n StoreId,\n Unsubscribe,\n} from '../types'\nimport { BaseStore } from './base-store'\n\n/**\n * Store 定义描述接口\n *\n * @typeParam Id - Store 唯一标识符类型\n * @typeParam S - 状态树类型\n * @typeParam G - 计算属性定义类型\n * @typeParam A - Action 定义类型\n */\nexport interface CreateStoreDefinition<\n Id extends StoreId,\n S extends StateTree,\n G extends Record<string, (state: S) => unknown>,\n A extends Record<string, (this: StoreAPI<Id, S, G, A>, ...args: unknown[]) => unknown>,\n> {\n id: Id\n state: () => S\n getters?: G\n actions?: A\n}\n\n/**\n * Store 实例的公共 API 接口\n *\n * 提供状态读取、订阅、补丁、重置、Action 监听和生命周期管理等能力。\n *\n * @typeParam Id - Store 唯一标识符类型\n * @typeParam S - 状态树类型\n * @typeParam G - 计算属性定义类型\n * @typeParam A - Action 定义类型\n */\nexport interface StoreAPI<\n Id extends StoreId = StoreId,\n S extends StateTree = StateTree,\n G extends Record<string, (state: S) => unknown> = Record<string, never>,\n A extends Record<string, (...args: unknown[]) => unknown> = Record<string, never>,\n> {\n readonly $id: Id\n readonly $state: S\n $reset: () => void\n $patch: (partial: Partial<S> | ((state: S) => void)) => void\n $subscribe: (callback: StateSubscriber<S>, options?: { immediate?: boolean }) => Unsubscribe\n $onAction: (callback: ActionSubscriber<A>) => Unsubscribe\n $dispose: () => void\n readonly getters: { [K in keyof G]: ReturnType<G[K]> }\n readonly actions: { [K in keyof A]: A[K] }\n}\n\n/**\n * 创建 Store 的工厂函数\n *\n * 返回一个惰性初始化的工厂函数。首次调用时基于定义创建 Store 实例,\n * 后续调用返回缓存的单例,直到 $dispose() 被调用后重置。\n *\n * @typeParam Id - Store 唯一标识符类型\n * @typeParam S - 状态树类型\n * @typeParam G - 计算属性定义类型\n * @typeParam A - Action 定义类型\n * @param definition - Store 定义,包含 id、state 工厂、getters 和 actions\n * @returns 惰性初始化的 Store 工厂函数,调用后返回 StoreAPI 实例\n */\nexport function createStore<\n Id extends StoreId,\n S extends StateTree,\n G extends Record<string, (state: S) => unknown> = Record<string, never>,\n A extends Record<string, (this: StoreAPI<Id, S, G, A>, ...args: unknown[]) => unknown> = Record<string, never>,\n>(\n definition: CreateStoreDefinition<Id, S, G, A>,\n): () => StoreAPI<Id, S, G, A> {\n let instance: StoreAPI<Id, S, G, A> | null = null\n\n return (): StoreAPI<Id, S, G, A> => {\n if (instance) {\n return instance\n }\n\n const store = new BaseStore<Id, S, G, A>(definition)\n const originalDispose = store.$dispose.bind(store)\n store.$dispose = (): void => {\n originalDispose()\n instance = null\n }\n\n instance = store as unknown as StoreAPI<Id, S, G, A>\n\n return store\n }\n}\n\n/** 状态变更类型,支持部分更新或通过函数直接修改状态 */\nexport type { StateMutation }\n","/**\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","/**\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","/**\n * 防抖和节流工具函数\n *\n * 提供性能优化的防抖、节流功能\n * @module utils/debounce-throttle\n */\n\n/**\n * 防抖函数返回类型\n */\nexport interface DebouncedFunction<T extends (...args: never[]) => void> {\n (...args: Parameters<T>): void\n /** 取消待执行的调用 */\n cancel: () => void\n /** 立即执行待处理的调用 */\n flush: () => void\n /** 是否有待处理的调用 */\n pending: () => boolean\n}\n\n/**\n * 节流函数返回类型\n */\nexport interface ThrottledFunction<T extends (...args: never[]) => void> {\n (...args: Parameters<T>): void\n /** 取消待执行的调用 */\n cancel: () => void\n}\n\n/**\n * 创建防抖函数\n *\n * 在连续调用停止后,延迟指定时间执行函数\n *\n * @template T - 函数类型\n * @param fn - 需要防抖的函数\n * @param delay - 延迟时间(毫秒)\n * @param immediate - 是否在首次调用时立即执行\n * @returns 防抖后的函数\n *\n * @example\n * ```typescript\n * const debouncedSearch = debounce((query: string) => {\n * fetchResults(query)\n * }, 300)\n *\n * // 连续调用只会在最后一次调用后 300ms 执行\n * debouncedSearch('a')\n * debouncedSearch('ab')\n * debouncedSearch('abc') // 只有这次会触发\n *\n * // 取消待执行的调用\n * debouncedSearch.cancel()\n * ```\n */\nexport function debounce<T extends (...args: never[]) => void>(\n fn: T,\n delay: number,\n immediate = false,\n): DebouncedFunction<T> {\n let timer: ReturnType<typeof setTimeout> | null = null\n let lastArgs: Parameters<T> | null = null\n\n const debounced = ((...args: Parameters<T>) => {\n lastArgs = args\n\n if (timer) {\n clearTimeout(timer)\n }\n\n if (immediate && !timer) {\n fn(...args)\n timer = setTimeout(() => {\n timer = null\n lastArgs = null\n }, delay)\n }\n else {\n timer = setTimeout(() => {\n fn(...args)\n timer = null\n lastArgs = null\n }, delay)\n }\n }) as DebouncedFunction<T>\n\n debounced.cancel = () => {\n if (timer) {\n clearTimeout(timer)\n timer = null\n lastArgs = null\n }\n }\n\n debounced.flush = () => {\n if (timer && lastArgs) {\n clearTimeout(timer)\n fn(...lastArgs)\n timer = null\n lastArgs = null\n }\n }\n\n debounced.pending = () => timer !== null\n\n return debounced\n}\n\n/**\n * 创建节流函数\n *\n * 在指定时间间隔内最多执行一次函数\n *\n * @template T - 函数类型\n * @param fn - 需要节流的函数\n * @param interval - 间隔时间(毫秒)\n * @param options - 节流选项\n * @param options.leading - 是否在时间窗开始时立即执行\n * @param options.trailing - 是否在时间窗结束时补执行最后一次调用\n * @returns 节流后的函数\n *\n * @example\n * ```typescript\n * const throttledUpdate = throttle((x: number, y: number) => {\n * updatePosition(x, y)\n * }, 100)\n *\n * // 在 100ms 内多次调用,只会执行一次\n * window.addEventListener('mousemove', (e) => {\n * throttledUpdate(e.clientX, e.clientY)\n * })\n *\n * // 取消\n * throttledUpdate.cancel()\n * ```\n */\nexport function throttle<T extends (...args: never[]) => void>(\n fn: T,\n interval: number,\n options: { leading?: boolean, trailing?: boolean } = {},\n): ThrottledFunction<T> {\n const { leading = true, trailing = true } = options\n let timer: ReturnType<typeof setTimeout> | null = null\n let lastTime = 0\n let lastArgs: Parameters<T> | null = null\n\n const throttled = ((...args: Parameters<T>) => {\n const now = Date.now()\n const remaining = interval - (now - lastTime)\n\n lastArgs = args\n\n if (remaining <= 0 || remaining > interval) {\n if (timer) {\n clearTimeout(timer)\n timer = null\n }\n lastTime = now\n if (leading || lastTime !== 0) {\n fn(...args)\n }\n lastArgs = null\n }\n else if (!timer && trailing) {\n timer = setTimeout(() => {\n lastTime = trailing ? Date.now() : 0\n timer = null\n if (lastArgs) {\n fn(...lastArgs)\n lastArgs = null\n }\n }, remaining)\n }\n }) as ThrottledFunction<T>\n\n throttled.cancel = () => {\n if (timer) {\n clearTimeout(timer)\n timer = null\n }\n lastTime = 0\n lastArgs = null\n }\n\n return throttled\n}\n","/**\n * 深拷贝工具\n *\n * 提供高性能的深拷贝、浅拷贝和深度合并功能\n * @module utils/deep-clone\n */\n\nconst hasOwnProperty = Object.prototype.hasOwnProperty\n\nfunction hasOwnKey(value: object, key: PropertyKey): boolean {\n return hasOwnProperty.call(value, key)\n}\n\n/**\n * 判断是否为对象\n *\n * @param value - 待检查的值\n * @returns 是否为对象\n */\nexport function isObject(value: unknown): value is Record<string, unknown> {\n return value !== null && typeof value === 'object'\n}\n\n/**\n * 判断是否为普通对象(非数组、非内置对象)\n *\n * @param value - 待检查的值\n * @returns 是否为普通对象\n */\nexport function isPlainObject(value: unknown): value is Record<string, unknown> {\n if (!isObject(value)) return false\n const proto = Object.getPrototypeOf(value)\n return proto === null || proto === Object.prototype\n}\n\n/**\n * 判断值是否可以被 structuredClone 处理\n *\n * @param value - 待检查的值\n * @returns 是否可以使用 structuredClone\n */\nfunction isStructuredCloneable(value: unknown): boolean {\n // 基础类型\n if (value === null || value === undefined) return true\n if (typeof value === 'boolean' || typeof value === 'number' || typeof value === 'string') return true\n if (typeof value === 'bigint') return true\n\n // 函数和 Symbol 不可克隆\n if (typeof value === 'function' || typeof value === 'symbol') return false\n\n // 内置可克隆对象\n if (value instanceof Date || value instanceof RegExp) return true\n if (value instanceof ArrayBuffer || value instanceof DataView) return true\n if (value instanceof Map || value instanceof Set) return true\n if (ArrayBuffer.isView(value)) return true\n\n // 普通对象和数组递归检查\n if (Array.isArray(value)) {\n return value.every(item => isStructuredCloneable(item))\n }\n\n if (isPlainObject(value)) {\n return Object.values(value).every(v => isStructuredCloneable(v))\n }\n\n return false\n}\n\n/**\n * 深拷贝配置选项\n */\nexport interface DeepCloneOptions {\n /** 是否优先使用 structuredClone(默认 true) */\n useStructuredClone?: boolean\n /** 是否克隆函数(默认 false,函数保持引用) */\n cloneFunctions?: boolean\n /** 是否克隆 Symbol 属性(默认 false) */\n cloneSymbols?: boolean\n /** 最大深度(默认无限制) */\n maxDepth?: number\n /** 自定义克隆器 */\n customCloner?: <T>(value: T, clone: <U>(v: U) => U) => T | undefined\n}\n\n/**\n * 深拷贝\n *\n * 高性能深拷贝实现,优先使用原生 structuredClone(如果可用)\n *\n * @template T - 值类型\n * @param value - 要拷贝的值\n * @param options - 配置选项\n * @returns 拷贝后的值\n *\n * @example\n * ```typescript\n * const obj = { a: 1, b: { c: 2 } }\n * const cloned = deepClone(obj)\n * cloned.b.c = 3\n * console.log(obj.b.c) // 2\n * ```\n *\n * @example\n * ```typescript\n * // 带配置的深拷贝\n * const cloned = deepClone(obj, {\n * maxDepth: 5,\n * cloneSymbols: true\n * })\n * ```\n */\nexport function deepClone<T>(value: T, options: DeepCloneOptions = {}): T {\n const {\n useStructuredClone: preferStructuredClone = true,\n cloneFunctions = false,\n cloneSymbols = false,\n maxDepth = Infinity,\n customCloner,\n } = options\n\n // 尝试使用 structuredClone(性能更好)\n if (preferStructuredClone && typeof structuredClone === 'function' && isStructuredCloneable(value)) {\n try {\n return structuredClone(value)\n }\n catch {\n // structuredClone 失败,回退到手动实现\n }\n }\n\n const cache = new WeakMap<object, unknown>()\n\n function cloneInternal<U>(val: U, depth: number): U {\n // 基础类型直接返回\n if (val === null || val === undefined) return val\n if (typeof val === 'boolean' || typeof val === 'number' || typeof val === 'string') return val\n if (typeof val === 'bigint') return val\n\n // Symbol 处理\n if (typeof val === 'symbol') {\n return cloneSymbols ? Symbol(val.description) as U : val\n }\n\n // 函数处理\n if (typeof val === 'function') {\n return cloneFunctions ? (val.bind({}) as U) : val\n }\n\n // 深度检查\n if (depth > maxDepth) {\n return val\n }\n\n // 自定义克隆器\n if (customCloner) {\n const customResult = customCloner(val, v => cloneInternal(v, depth + 1))\n if (customResult !== undefined) {\n return customResult\n }\n }\n\n // 检查循环引用\n if (typeof val === 'object' && val !== null) {\n if (cache.has(val)) {\n return cache.get(val) as U\n }\n }\n\n // 处理日期\n if (val instanceof Date) {\n return new Date(val.getTime()) as U\n }\n\n // 处理正则\n if (val instanceof RegExp) {\n const result = new RegExp(val.source, val.flags)\n ;(result as RegExp).lastIndex = val.lastIndex\n return result as U\n }\n\n // 处理 Error\n if (val instanceof Error) {\n const result = new (val.constructor as ErrorConstructor)(val.message)\n result.stack = val.stack\n result.name = val.name\n return result as U\n }\n\n // 处理 Map\n if (val instanceof Map) {\n const result = new Map()\n cache.set(val, result)\n val.forEach((v, k) => {\n result.set(cloneInternal(k, depth + 1), cloneInternal(v, depth + 1))\n })\n return result as U\n }\n\n // 处理 Set\n if (val instanceof Set) {\n const result = new Set()\n cache.set(val, result)\n val.forEach((v) => {\n result.add(cloneInternal(v, depth + 1))\n })\n return result as U\n }\n\n // 处理 ArrayBuffer\n if (val instanceof ArrayBuffer) {\n return val.slice(0) as U\n }\n\n // 处理 TypedArray\n if (ArrayBuffer.isView(val) && !(val instanceof DataView)) {\n const TypedArrayConstructor = val.constructor as new (buffer: ArrayBuffer) => typeof val\n return new TypedArrayConstructor((val as unknown as { buffer: ArrayBuffer }).buffer.slice(0)) as U\n }\n\n // 处理数组\n if (Array.isArray(val)) {\n const result: unknown[] = []\n cache.set(val, result)\n for (let i = 0; i < val.length; i++) {\n result[i] = cloneInternal(val[i], depth + 1)\n }\n return result as U\n }\n\n // 处理普通对象\n if (isPlainObject(val)) {\n const result: Record<string | symbol, unknown> = {}\n cache.set(val, result)\n\n // 克隆字符串键\n const keys = Object.keys(val)\n for (const key of keys) {\n result[key] = cloneInternal((val as Record<string, unknown>)[key], depth + 1)\n }\n\n // 克隆 Symbol 键\n if (cloneSymbols) {\n const symbolKeys = Object.getOwnPropertySymbols(val)\n for (const sym of symbolKeys) {\n result[sym] = cloneInternal((val as Record<symbol, unknown>)[sym], depth + 1)\n }\n }\n\n return result as U\n }\n\n // 其他对象类型(如自定义类实例)直接返回\n return val\n }\n\n return cloneInternal(value, 0)\n}\n\n/**\n * 浅拷贝\n *\n * @template T - 值类型\n * @param value - 要拷贝的值\n * @returns 拷贝后的值\n *\n * @example\n * ```typescript\n * const arr = [1, 2, { a: 3 }]\n * const cloned = shallowClone(arr)\n * cloned[2].a = 4\n * console.log(arr[2].a) // 4 (浅拷贝,嵌套对象共享引用)\n * ```\n */\nexport function shallowClone<T>(value: T): T {\n if (value === null || value === undefined) return value\n if (typeof value !== 'object') return value\n\n if (Array.isArray(value)) {\n return [...value] as T\n }\n\n if (value instanceof Map) {\n return new Map(value) as T\n }\n\n if (value instanceof Set) {\n return new Set(value) as T\n }\n\n if (value instanceof Date) {\n return new Date(value.getTime()) as T\n }\n\n return { ...value }\n}\n\n/**\n * 深度合并配置选项\n */\nexport interface DeepMergeOptions {\n /** 数组合并策略:'replace' 替换 | 'concat' 连接 | 'merge' 按索引合并 */\n arrayStrategy?: 'replace' | 'concat' | 'merge'\n /** 是否克隆源对象(默认 true) */\n clone?: boolean\n /** 最大深度 */\n maxDepth?: number\n}\n\n/**\n * 深度合并对象\n *\n * 将多个源对象深度合并到目标对象\n *\n * @template T - 目标对象类型\n * @param target - 目标对象\n * @param sources - 源对象列表\n * @returns 合并后的对象\n *\n * @example\n * ```typescript\n * const target = { a: 1, b: { c: 2 } }\n * const source = { b: { d: 3 }, e: 4 }\n * const result = deepMerge(target, source)\n * // { a: 1, b: { c: 2, d: 3 }, e: 4 }\n * ```\n */\nexport function deepMerge<T extends Record<string, unknown>>(\n target: T,\n ...sources: Array<Partial<T>>\n): T {\n return deepMergeWithOptions(target, {}, ...sources)\n}\n\n/**\n * 带配置的深度合并\n *\n * @template T - 目标对象类型\n * @param target - 目标对象\n * @param options - 合并配置\n * @param sources - 源对象列表\n * @returns 合并后的对象\n */\nexport function deepMergeWithOptions<T extends Record<string, unknown>>(\n target: T,\n options: DeepMergeOptions,\n ...sources: Array<Partial<T>>\n): T {\n const {\n arrayStrategy = 'replace',\n clone = true,\n maxDepth = Infinity,\n } = options\n\n function mergeInternal(\n targetObj: Record<string, unknown>,\n sourceObj: Record<string, unknown>,\n depth: number,\n ): Record<string, unknown> {\n if (depth > maxDepth) {\n return targetObj\n }\n\n for (const key of Object.keys(sourceObj)) {\n const sourceValue = sourceObj[key]\n const targetValue = targetObj[key]\n\n // 处理数组\n if (Array.isArray(sourceValue)) {\n if (arrayStrategy === 'concat' && Array.isArray(targetValue)) {\n targetObj[key] = [...targetValue, ...sourceValue]\n }\n else if (arrayStrategy === 'merge' && Array.isArray(targetValue)) {\n const result = [...targetValue]\n sourceValue.forEach((item, index) => {\n if (isPlainObject(item) && isPlainObject(result[index])) {\n result[index] = mergeInternal(result[index] as Record<string, unknown>, item, depth + 1)\n }\n else {\n result[index] = clone ? deepClone(item) : item\n }\n })\n targetObj[key] = result\n }\n else {\n targetObj[key] = clone ? deepClone(sourceValue) : sourceValue\n }\n }\n // 处理普通对象\n else if (isPlainObject(sourceValue)) {\n if (isPlainObject(targetValue)) {\n targetObj[key] = mergeInternal(\n targetValue as Record<string, unknown>,\n sourceValue,\n depth + 1,\n )\n }\n else {\n targetObj[key] = clone ? deepClone(sourceValue) : sourceValue\n }\n }\n // 其他类型直接赋值\n else {\n targetObj[key] = clone && isObject(sourceValue) ? deepClone(sourceValue) : sourceValue\n }\n }\n\n return targetObj\n }\n\n let result = target\n\n for (const source of sources) {\n if (source !== null && source !== undefined) {\n result = mergeInternal(result, source, 0) as T\n }\n }\n\n return result\n}\n\n/**\n * 比较两个值是否深度相等\n *\n * @param a - 第一个值\n * @param b - 第二个值\n * @returns 是否相等\n *\n * @example\n * ```typescript\n * deepEqual({ a: 1 }, { a: 1 }) // true\n * deepEqual([1, 2], [1, 2]) // true\n * deepEqual({ a: { b: 1 } }, { a: { b: 2 } }) // false\n * ```\n */\nexport function deepEqual(a: unknown, b: unknown): boolean {\n // 严格相等\n if (a === b) return true\n\n // null/undefined 检查\n if (a === null || b === null || a === undefined || b === undefined) {\n return a === b\n }\n\n // 类型不同\n if (typeof a !== typeof b) return false\n\n // 基础类型\n if (typeof a !== 'object') return a === b\n\n // 日期比较\n if (a instanceof Date && b instanceof Date) {\n return a.getTime() === b.getTime()\n }\n\n // 正则比较\n if (a instanceof RegExp && b instanceof RegExp) {\n return a.source === b.source && a.flags === b.flags\n }\n\n // Map 比较\n if (a instanceof Map && b instanceof Map) {\n if (a.size !== b.size) return false\n for (const [key, value] of a) {\n if (!b.has(key) || !deepEqual(value, b.get(key))) {\n return false\n }\n }\n return true\n }\n\n // Set 比较\n if (a instanceof Set && b instanceof Set) {\n if (a.size !== b.size) return false\n for (const value of a) {\n if (!b.has(value)) return false\n }\n return true\n }\n\n // 数组比较\n if (Array.isArray(a) && Array.isArray(b)) {\n if (a.length !== b.length) return false\n for (let i = 0; i < a.length; i++) {\n if (!deepEqual(a[i], b[i])) return false\n }\n return true\n }\n\n // 对象比较\n if (isPlainObject(a) && isPlainObject(b)) {\n const keysA = Object.keys(a)\n const keysB = Object.keys(b)\n if (keysA.length !== keysB.length) return false\n for (const key of keysA) {\n if (!hasOwnKey(b, key)) return false\n if (!deepEqual(a[key], b[key])) return false\n }\n return true\n }\n\n return false\n}\n\n/**\n * 冻结对象(深度)\n *\n * @template T - 对象类型\n * @param obj - 要冻结的对象\n * @returns 冻结后的对象\n */\nexport function deepFreeze<T extends object>(obj: T): Readonly<T> {\n const propNames = Object.getOwnPropertyNames(obj)\n\n for (const name of propNames) {\n const value = (obj as Record<string, unknown>)[name]\n if (value && typeof value === 'object') {\n deepFreeze(value)\n }\n }\n\n return Object.freeze(obj)\n}\n\n","/**\n * 状态选择器工具\n *\n * 提供高性能的状态选择器和路径操作工具\n * @module utils/selector\n */\n\nimport type { Selector, StateTree } from '../types'\n\nconst ARRAY_INDEX_RE = /^\\d+$/\n\n/**\n * 选择器相等性比较函数类型\n */\nexport type SelectorEqualityFn<R> = (a: R, b: R) => boolean\n\n/**\n * 记忆化选择器配置选项\n */\nexport interface MemoizedSelectorOptions<R> {\n /** 相等性比较函数 */\n equalityFn?: SelectorEqualityFn<R>\n /** 最大缓存大小(默认 1) */\n maxSize?: number\n /** 是否在开发模式下记录缓存命中率 */\n trackHitRate?: boolean\n}\n\n/**\n * 创建记忆化选择器\n *\n * 基本的记忆化选择器,只缓存最后一次结果\n *\n * @template S - 状态类型\n * @template R - 返回值类型\n * @param selector - 选择器函数\n * @param equalityFn - 相等性比较函数(默认使用 Object.is)\n * @returns 记忆化的选择器\n *\n * @example\n * ```typescript\n * const selectTodos = createSelector(\n * (state: AppState) => state.todos,\n * )\n *\n * const selectCompletedTodos = createSelector(\n * (state: AppState) => state.todos.filter(t => t.completed),\n * (a, b) => a.length === b.length && a.every((v, i) => v === b[i])\n * )\n * ```\n */\nexport function createSelector<S extends StateTree, R>(\n selector: Selector<S, R>,\n equalityFn: SelectorEqualityFn<R> = Object.is\n): Selector<S, R> {\n let lastState: S | undefined\n let lastResult: R | undefined\n let initialized = false\n\n return (state: S): R => {\n // 如果状态引用未变,直接返回缓存结果\n if (initialized && lastState === state) {\n return lastResult as R\n }\n\n const result = selector(state)\n\n // 检查结果是否改变\n if (!initialized || !equalityFn(result, lastResult as R)) {\n lastResult = result\n }\n\n lastState = state\n initialized = true\n\n return lastResult as R\n }\n}\n\n/**\n * 创建带依赖的选择器\n *\n * 类似 reselect 的实现,支持多个输入选择器\n *\n * @template S - 状态类型\n * @template Deps - 依赖结果类型\n * @template R - 返回值类型\n * @param dependencies - 依赖选择器数组\n * @param combiner - 组合函数\n * @param options - 配置选项\n * @returns 记忆化的选择器\n *\n * @example\n * ```typescript\n * const selectVisibleTodos = createSelectorWithDeps(\n * [\n * (state) => state.todos,\n * (state) => state.visibilityFilter,\n * ],\n * (todos, filter) => {\n * switch (filter) {\n * case 'SHOW_COMPLETED': return todos.filter(t => t.completed)\n * case 'SHOW_ACTIVE': return todos.filter(t => !t.completed)\n * default: return todos\n * }\n * }\n * )\n * ```\n */\nexport function createSelectorWithDeps<\n S extends StateTree,\n Deps extends unknown[],\n R,\n>(\n dependencies: { [K in keyof Deps]: Selector<S, Deps[K]> },\n combiner: (...args: Deps) => R,\n options: MemoizedSelectorOptions<R> = {}\n): Selector<S, R> {\n const { equalityFn = Object.is, trackHitRate = false } = options\n\n let lastDeps: Deps | undefined\n let lastResult: R | undefined\n let initialized = false\n\n // 缓存统计(仅开发模式)\n let hits = 0\n let calls = 0\n\n const selector = (state: S): R => {\n if (trackHitRate) calls++\n\n // 计算所有依赖的结果\n const deps = dependencies.map(dep => dep(state)) as Deps\n\n // 检查依赖是否改变\n if (initialized && lastDeps) {\n let changed = false\n for (let i = 0; i < deps.length; i++) {\n if (!Object.is(deps[i], lastDeps[i])) {\n changed = true\n break\n }\n }\n\n if (!changed) {\n if (trackHitRate) hits++\n return lastResult as R\n }\n }\n\n // 计算新结果\n const result = combiner(...deps)\n\n // 检查结果是否改变\n if (!initialized || !equalityFn(result, lastResult as R)) {\n lastResult = result\n }\n\n lastDeps = deps\n initialized = true\n\n return lastResult as R\n }\n\n // 添加缓存统计方法\n if (trackHitRate) {\n ;(selector as Selector<S, R> & { getHitRate: () => number }).getHitRate =\n () => {\n return calls > 0 ? hits / calls : 0\n }\n }\n\n return selector\n}\n\n/**\n * 组合多个选择器\n *\n * 简单的选择器组合,不带记忆化\n *\n * @template S - 状态类型\n * @template R - 结果类型数组\n * @template C - 组合结果类型\n * @param selectors - 选择器数组\n * @param combiner - 组合函数\n * @returns 组合后的选择器\n *\n * @example\n * ```typescript\n * const selectUserAndTodos = combineSelectors(\n * [\n * (state) => state.user,\n * (state) => state.todos,\n * ],\n * (user, todos) => ({ user, todos })\n * )\n * ```\n */\nexport function combineSelectors<S extends StateTree, R extends unknown[], C>(\n selectors: { [K in keyof R]: Selector<S, R[K]> },\n combiner: (...results: R) => C\n): Selector<S, C> {\n return (state: S): C => {\n const results = selectors.map(selector => selector(state)) as R\n return combiner(...results)\n }\n}\n\n/**\n * 创建带高级缓存的选择器\n *\n * 支持多个缓存条目,使用 LRU 策略\n *\n * @template S - 状态类型\n * @template R - 返回值类型\n * @param selector - 选择器函数\n * @param options - 配置选项\n * @returns 带缓存的选择器\n *\n * @example\n * ```typescript\n * const selectFilteredItems = createCachedSelector(\n * (state, filter) => state.items.filter(item => item.type === filter),\n * { maxSize: 5 }\n * )\n * ```\n */\nexport function createCachedSelector<S extends StateTree, R>(\n selector: Selector<S, R>,\n options: MemoizedSelectorOptions<R> = {}\n): Selector<S, R> & { clearCache: () => void; getCacheSize: () => number } {\n const { maxSize = 10 } = options\n\n // 使用 Map 保持插入顺序(LRU 策略)\n const cache = new Map<S, R>()\n\n const memoizedSelector = (state: S): R => {\n // 检查缓存\n if (cache.has(state)) {\n const cached = cache.get(state) as R\n // 移到末尾(最近使用)\n cache.delete(state)\n cache.set(state, cached)\n return cached\n }\n\n // 计算结果\n const result = selector(state)\n\n // 管理缓存大小(LRU 淘汰)\n if (cache.size >= maxSize) {\n const firstKey = cache.keys().next().value\n if (firstKey !== undefined) {\n cache.delete(firstKey)\n }\n }\n\n cache.set(state, result)\n return result\n }\n\n // 添加缓存管理方法\n memoizedSelector.clearCache = () => cache.clear()\n memoizedSelector.getCacheSize = () => cache.size\n\n return memoizedSelector\n}\n\n/**\n * 创建记忆化选择器(别名,同 createSelector)\n *\n * @template S - 状态类型\n * @template R - 返回值类型\n * @param selector - 选择器函数\n * @param options - 配置选项\n * @returns 记忆化的选择器\n */\nexport function createMemoizedSelector<S extends StateTree, R>(\n selector: Selector<S, R>,\n options: MemoizedSelectorOptions<R> = {}\n): Selector<S, R> {\n return createSelector(selector, options.equalityFn)\n}\n\n/**\n * 获取嵌套对象的值\n *\n * 支持点表示法和数组索引\n *\n * @template T - 返回值类型\n * @param obj - 对象\n * @param path - 路径(支持 'a.b.c' 或 'a[0].b')\n * @param defaultValue - 默认值(当路径不存在时返回)\n * @returns 值\n *\n * @example\n * ```typescript\n * const value = getByPath({ a: { b: { c: 1 } } }, 'a.b.c')\n * // value: 1\n *\n * const arr = getByPath({ items: [{ name: 'test' }] }, 'items[0].name')\n * // arr: 'test'\n *\n * const missing = getByPath({ a: 1 }, 'b.c', 'default')\n * // missing: 'default'\n * ```\n */\nexport function getByPath<T = unknown>(\n obj: unknown,\n path: string,\n defaultValue?: T\n): T | undefined {\n if (!path || path.length === 0) {\n return obj as T\n }\n\n // 解析路径(支持 'a.b.c' 和 'a[0].b')\n const keys = path\n .replace(/\\[([^\\]]+)\\]/g, '.$1') // 将 [0] 转换为 .0\n .split('.')\n .filter(Boolean)\n\n let result: unknown = obj\n\n for (const key of keys) {\n if (result === null || result === undefined) {\n return defaultValue\n }\n\n if (typeof result !== 'object') {\n return defaultValue\n }\n\n result = (result as Record<string, unknown>)[key]\n }\n\n return result === undefined ? defaultValue : (result as T)\n}\n\n/**\n * 设置嵌套对象的值\n *\n * 支持自动创建中间路径\n *\n * @param obj - 对象\n * @param path - 路径\n * @param value - 值\n * @returns 是否成功\n *\n * @example\n * ```typescript\n * const obj = {}\n * setByPath(obj, 'a.b.c', 1)\n * // obj: { a: { b: { c: 1 } } }\n *\n * setByPath(obj, 'items[0].name', 'test')\n * // obj: { a: { b: { c: 1 } }, items: [{ name: 'test' }] }\n * ```\n */\nexport function setByPath(\n obj: Record<string, unknown>,\n path: string,\n value: unknown\n): boolean {\n if (!path || path.length === 0) {\n return false\n }\n\n // 解析路径\n const keys = path\n .replace(/\\[([^\\]]+)\\]/g, '.$1')\n .split('.')\n .filter(Boolean)\n\n let current: Record<string, unknown> = obj\n\n for (let i = 0; i < keys.length - 1; i++) {\n const key = keys[i]\n const nextKey = keys[i + 1] ?? ''\n\n const nextValue = current[key] ?? (ARRAY_INDEX_RE.test(nextKey) ? [] : {})\n // 根据下一个键决定创建对象还是数组\n current[key] = nextValue\n current = current[key] as Record<string, unknown>\n }\n\n const lastKey = keys[keys.length - 1]\n current[lastKey] = value\n return true\n}\n\n/**\n * 删除嵌套对象的值\n *\n * @param obj - 对象\n * @param path - 路径\n * @returns 是否成功删除\n *\n * @example\n * ```typescript\n * const obj = { a: { b: { c: 1 } } }\n * deleteByPath(obj, 'a.b.c')\n * // obj: { a: { b: {} } }\n * ```\n */\nexport function deleteByPath(\n obj: Record<string, unknown>,\n path: string\n): boolean {\n if (!path || path.length === 0) {\n return false\n }\n\n const keys = path\n .replace(/\\[([^\\]]+)\\]/g, '.$1')\n .split('.')\n .filter(Boolean)\n\n let current: Record<string, unknown> = obj\n\n for (let i = 0; i < keys.length - 1; i++) {\n const key = keys[i]\n if (current[key] === undefined || current[key] === null) {\n return false\n }\n current = current[key] as Record<string, unknown>\n }\n\n const lastKey = keys[keys.length - 1]\n if (lastKey in current) {\n if (Array.isArray(current)) {\n const index = Number.parseInt(lastKey, 10)\n if (!Number.isNaN(index)) {\n current.splice(index, 1)\n return true\n }\n }\n delete current[lastKey]\n return true\n }\n\n return false\n}\n\n/**\n * 检查嵌套对象中是否存在指定路径\n *\n * @param obj - 对象\n * @param path - 路径\n * @returns 是否存在\n *\n * @example\n * ```typescript\n * hasPath({ a: { b: 1 } }, 'a.b') // true\n * hasPath({ a: { b: 1 } }, 'a.c') // false\n * ```\n */\nexport function hasPath(obj: unknown, path: string): boolean {\n if (!path || path.length === 0) {\n return true\n }\n\n const keys = path\n .replace(/\\[([^\\]]+)\\]/g, '.$1')\n .split('.')\n .filter(Boolean)\n\n let current: unknown = obj\n\n for (const key of keys) {\n if (current === null || current === undefined) {\n return false\n }\n\n if (typeof current !== 'object') {\n return false\n }\n\n if (!(key in (current as Record<string, unknown>))) {\n return false\n }\n\n current = (current as Record<string, unknown>)[key]\n }\n\n return true\n}\n","/**\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","/**\n * 中间件管理器\n *\n * @module middleware/middleware-manager\n */\n\nimport type { Middleware, MiddlewareContext, MiddlewareManager } from '../types'\n\n/**\n * 创建中间件管理器\n *\n * @returns 中间件管理器实例\n *\n * @example\n * ```typescript\n * const manager = createMiddlewareManager()\n *\n * // 添加日志中间件\n * manager.use({\n * name: 'logger',\n * priority: 1,\n * handler: async (ctx, next) => {\n * console.log('Before:', ctx.type)\n * await next()\n * console.log('After:', ctx.type)\n * }\n * })\n *\n * // 执行中间件链\n * await manager.execute({ storeId: 'test', state: {}, type: 'state:patch' })\n * ```\n */\nexport function createMiddlewareManager(): MiddlewareManager {\n /** 中间件列表 */\n const middlewares = new Map<string, Middleware>()\n\n /** 已排序的中间件列表缓存 */\n let sortedMiddlewares: Middleware[] | null = null\n\n /**\n * 获取排序后的中间件列表\n */\n const getSortedMiddlewares = (): Middleware[] => {\n if (sortedMiddlewares === null) {\n sortedMiddlewares = Array.from(middlewares.values()).sort(\n (a, b) => (a.priority ?? 100) - (b.priority ?? 100),\n )\n }\n return sortedMiddlewares\n }\n\n /**\n * 使中间件缓存失效\n */\n const invalidateCache = (): void => {\n sortedMiddlewares = null\n }\n\n /**\n * 添加中间件\n */\n const use = (middleware: Middleware): void => {\n if (middlewares.has(middleware.name)) {\n console.warn(`[Middleware] 中间件 \"${middleware.name}\" 已存在,将被覆盖`)\n }\n middlewares.set(middleware.name, middleware)\n invalidateCache()\n }\n\n /**\n * 移除中间件\n */\n const remove = (name: string): void => {\n if (middlewares.delete(name)) {\n invalidateCache()\n }\n }\n\n /**\n * 获取中间件\n */\n const get = (name: string): Middleware | undefined => {\n return middlewares.get(name)\n }\n\n /**\n * 是否存在中间件\n */\n const has = (name: string): boolean => {\n return middlewares.has(name)\n }\n\n /**\n * 执行中间件链\n */\n const execute = async (context: MiddlewareContext): Promise<void> => {\n const sorted = getSortedMiddlewares()\n\n if (sorted.length === 0) {\n return\n }\n\n const dispatch = async (index: number): Promise<void> => {\n const middleware = sorted[index]\n if (!middleware) {\n return\n }\n\n let called = false\n const next = async (): Promise<void> => {\n if (called) {\n throw new Error(`[Middleware] next() called multiple times in \"${middleware.name}\"`)\n }\n\n called = true\n await dispatch(index + 1)\n }\n\n await middleware.handler(context, next)\n }\n\n await dispatch(0)\n }\n\n /**\n * 获取所有中间件\n */\n const getAll = (): Middleware[] => {\n return getSortedMiddlewares()\n }\n\n /**\n * 清空所有中间件\n */\n const clear = (): void => {\n middlewares.clear()\n invalidateCache()\n }\n\n return {\n use,\n remove,\n get,\n has,\n execute,\n getAll,\n clear,\n }\n}\n\n/**\n * 全局中间件管理器\n */\nlet globalMiddlewareManager: MiddlewareManager | null = null\n\n/**\n * 获取全局中间件管理器\n */\nexport function getGlobalMiddlewareManager(): MiddlewareManager {\n if (!globalMiddlewareManager) {\n globalMiddlewareManager = createMiddlewareManager()\n }\n return globalMiddlewareManager\n}\n\n/**\n * 设置全局中间件管理器\n */\nexport function setGlobalMiddlewareManager(manager: MiddlewareManager): void {\n globalMiddlewareManager = manager\n}\n\n","/**\n * 持久化中间件\n *\n * 提供状态持久化功能\n * @module middleware/persist\n */\n\nimport type { Middleware, MiddlewareContext, PersistMiddlewareOptions, StateTree, StoreId } from '../types'\nimport { debounce } from '../utils/debounce-throttle'\n\ntype ResolvedPersistMiddlewareOptions = Required<\n Pick<PersistMiddlewareOptions, 'debounce' | 'deserialize' | 'keyPrefix' | 'serialize' | 'storage'>\n> & Omit<PersistMiddlewareOptions, 'debounce' | 'deserialize' | 'keyPrefix' | 'serialize' | 'storage'>\n\n/**\n * 默认持久化选项\n */\nconst defaultOptions: ResolvedPersistMiddlewareOptions = {\n keyPrefix: 'ldesign-store:',\n storage: 'localStorage',\n debounce: 100,\n serialize: JSON.stringify,\n deserialize: JSON.parse,\n}\n\nfunction resolveOptions(options: PersistMiddlewareOptions): ResolvedPersistMiddlewareOptions {\n return { ...defaultOptions, ...options }\n}\n\n/**\n * 获取存储对象\n */\nfunction getStorage(type: 'localStorage' | 'sessionStorage'): Storage | null {\n if (typeof window === 'undefined') {\n return null\n }\n return type === 'localStorage' ? localStorage : sessionStorage\n}\n\n/**\n * 创建持久化中间件\n *\n * @param options - 持久化选项\n * @returns 持久化中间件\n *\n * @example\n * ```typescript\n * const persist = createPersistMiddleware({\n * storage: 'localStorage',\n * stores: ['user', 'settings'],\n * debounce: 200,\n * })\n *\n * middlewareManager.use(persist)\n * ```\n */\nexport function createPersistMiddleware(\n options: PersistMiddlewareOptions = {},\n): Middleware {\n const opts = resolveOptions(options)\n const storage = getStorage(opts.storage)\n\n /** 保存状态的防抖函数映射 */\n const debouncedSave = new Map<StoreId, (state: StateTree) => void>()\n\n /**\n * 获取存储键名\n */\n const getKey = (storeId: StoreId): string => {\n return `${opts.keyPrefix}${storeId}`\n }\n\n /**\n * 筛选需要持久化的状态路径\n */\n const filterState = (storeId: StoreId, state: StateTree): StateTree => {\n const paths = opts.paths?.[storeId]\n if (!paths || paths.length === 0) {\n return state\n }\n\n const filtered: StateTree = {}\n for (const path of paths) {\n const keys = path.split('.')\n let source: unknown = state\n let target: StateTree = filtered\n\n for (let i = 0; i < keys.length; i++) {\n const key = keys[i]\n if (i === keys.length - 1) {\n target[key] = (source as StateTree)?.[key]\n }\n else {\n target[key] = target[key] || {}\n target = target[key] as StateTree\n source = (source as StateTree)?.[key]\n }\n }\n }\n\n return filtered\n }\n\n /**\n * 保存状态到存储\n */\n const saveState = (storeId: StoreId, state: StateTree): void => {\n if (!storage) return\n\n try {\n const filteredState = filterState(storeId, state)\n const serialized = opts.serialize(filteredState)\n storage.setItem(getKey(storeId), serialized)\n }\n catch (error) {\n console.error(`[Persist] 保存状态失败 (${storeId}):`, error)\n }\n }\n\n /**\n * 获取或创建防抖保存函数\n */\n const getDebouncedSave = (storeId: StoreId): (state: StateTree) => void => {\n let fn = debouncedSave.get(storeId)\n if (!fn) {\n fn = debounce((state: StateTree) => saveState(storeId, state), opts.debounce)\n debouncedSave.set(storeId, fn)\n }\n return fn\n }\n\n return {\n name: 'persist',\n priority: 100, // 最后执行\n\n handler: async (context: MiddlewareContext, next: () => void | Promise<void>) => {\n await next()\n\n const { storeId, type, state } = context\n\n // 只在状态变化时持久化\n if (!type.startsWith('state:')) {\n return\n }\n\n // 检查是否需要持久化此 Store\n if (opts.stores && !opts.stores.includes(storeId)) {\n return\n }\n\n // 使用防抖保存\n getDebouncedSave(storeId)(state)\n },\n }\n}\n\n/**\n * 从存储恢复状态\n *\n * @param storeId - Store ID\n * @param options - 持久化选项\n * @returns 恢复的状态或 null\n */\nexport function restoreState<S extends StateTree>(\n storeId: StoreId,\n options: PersistMiddlewareOptions = {},\n): S | null {\n const opts = resolveOptions(options)\n const storage = getStorage(opts.storage)\n\n if (!storage) return null\n\n try {\n const key = `${opts.keyPrefix}${storeId}`\n const data = storage.getItem(key)\n if (data) {\n return opts.deserialize(data) as S\n }\n }\n catch (error) {\n console.error(`[Persist] 恢复状态失败 (${storeId}):`, error)\n }\n\n return null\n}\n\n","/* ============================================================\n * time-travel.ts\n * 时间旅行中间件\n * 提供状态快照历史记录、撤销(undo)、重做(redo)、跳转(goto)等能力\n * 用于实现 Store 状态的可回溯调试与操作历史管理\n * ============================================================ */\n\n/* 从类型文件导入中间件、上下文、快照、状态树等核心类型 */\nimport type {\n Middleware, // 中间件接口\n MiddlewareContext, // 中间件执行上下文接口\n StateSnapshot, // 状态快照接口\n StateTree, // 状态树类型\n StoreId, // Store 标识类型\n TimeTravelController, // 时间旅行控制器接口\n TimeTravelMiddlewareOptions, // 时间旅行中间件配置选项接口\n} from '../types'\n/* 从工具库导入深拷贝函数,用于快照的隔离存储 */\nimport { deepClone } from '../utils/deep-clone'\n\n/* ── 内部类型定义 ── */\n\n/**\n * 恢复回调函数类型\n * 当执行 undo/redo/goto 操作时,通过此回调将历史快照状态应用到对应 Store\n * @param storeId - 目标 Store 的标识\n * @param state - 要恢复的状态树(已深拷贝,可安全修改)\n */\ntype RestoreCallback = (storeId: StoreId, state: StateTree) => void\n\n/**\n * 带有内部恢复回调设置器的控制器扩展类型\n * 在 TimeTravelController 基础上增加 __setRestoreCallback 内部方法\n * 用于在创建后注入实际的恢复回调(由 Store 运行时提供)\n */\ntype TimeTravelControllerWithRestoreSetter = TimeTravelController & {\n __setRestoreCallback?: (callback: RestoreCallback) => void\n}\n\n/* ── 默认配置 ── */\n\n/** 中间件默认选项:最多保留 100 条历史记录,功能默认启用 */\nconst defaultOptions: TimeTravelMiddlewareOptions = {\n maxHistory: 100,\n enabled: true,\n}\n\n/**\n * 创建时间旅行中间件\n *\n * 返回一个中间件函数和一个控制器对象:\n * - 中间件负责拦截 state: 类型的操作,在操作前后记录状态快照\n * - 控制器提供 undo/redo/goto/clear 等方法,用于在历史快照之间跳转\n *\n * @param options - 中间件配置选项(可选,与默认值合并)\n * @returns 包含 middleware(中间件)和 controller(控制器)的对象\n */\nexport function createTimeTravelMiddleware(\n options: TimeTravelMiddlewareOptions = {},\n): {\n middleware: Middleware\n controller: TimeTravelController\n} {\n /* 将用户选项与默认选项合并 */\n const opts = { ...defaultOptions, ...options }\n /* 最大历史记录条数,确保至少为 1 */\n const maxHistory = opts.maxHistory ?? defaultOptions.maxHistory ?? 100\n /* 历史快照数组,存储所有状态变更的快照 */\n const history: StateSnapshot[] = []\n\n /* 当前快照指针,指向 history 数组中的当前位置,-1 表示无快照 */\n let currentIndex = -1\n /* 标记是否正在进行时间旅行(undo/redo/goto),防止在恢复过程中重复记录快照 */\n let isTraveling = false\n /* 恢复回调函数,初始为空函数,后续通过 __setRestoreCallback 注入实际实现 */\n let restoreCallback: RestoreCallback = () => {}\n\n /**\n * 添加新的状态快照到历史记录\n * 业务处理过程:\n * 1. 如果中间件未启用或正在时间旅行中,则跳过\n * 2. 如果当前指针不在末尾(即之前执行过 undo),则丢弃指针之后的快照(分支覆盖)\n * 3. 推入新快照并更新指针\n * 4. 如果超过最大历史条数,移除最早的快照并调整指针\n *\n * @param snapshot - 要添加的状态快照\n */\n const addSnapshot = (snapshot: StateSnapshot): void => {\n /* 中间件未启用或正在时间旅行中,不记录快照 */\n if (!opts.enabled || isTraveling) {\n return\n }\n\n /* 如果当前指针不在历史末尾(之前执行过 undo),丢弃后续快照(创建新分支) */\n if (currentIndex < history.length - 1) {\n history.splice(currentIndex + 1)\n }\n\n /* 将新快照推入历史数组 */\n history.push(snapshot)\n /* 更新指针到最新快照 */\n currentIndex = history.length - 1\n\n /* 如果历史记录超过上限,移除最早的快照 */\n if (history.length > maxHistory) {\n history.shift()\n /* 移除头部元素后指针需要前移一位 */\n currentIndex--\n }\n }\n\n /**\n * 时间旅行控制器\n * 提供 undo(撤销)、redo(重做)、goto(跳转)、clear(清除)等操作\n * 所有恢复操作都通过 restoreCallback 将历史快照应用到 Store\n */\n const controller: TimeTravelControllerWithRestoreSetter = {\n /**\n * 撤销操作\n * 将当前指针前移一步,恢复到上一个历史快照状态\n */\n undo: () => {\n /* 无法撤销(已到最早快照)则跳过 */\n if (!controller.canUndo()) {\n return\n }\n\n /* 标记进入时间旅行模式,防止恢复过程触发新的快照记录 */\n isTraveling = true\n /* 指针前移 */\n currentIndex--\n /* 获取目标快照 */\n const snapshot = history[currentIndex]\n /* 通过恢复回调将快照状态(深拷贝)应用到 Store,避免污染历史记录 */\n restoreCallback(snapshot.storeId, deepClone(snapshot.state))\n /* 退出时间旅行模式 */\n isTraveling = false\n },\n\n /**\n * 重做操作\n * 将当前指针后移一步,恢复到下一个历史快照状态\n */\n redo: () => {\n /* 无法重做(已到最新快照)则跳过 */\n if (!controller.canRedo()) {\n return\n }\n\n /* 标记进入时间旅行模式 */\n isTraveling = true\n /* 指针后移 */\n currentIndex++\n /* 获取目标快照 */\n const snapshot = history[currentIndex]\n /* 恢复快照状态(深拷贝) */\n restoreCallback(snapshot.storeId, deepClone(snapshot.state))\n /* 退出时间旅行模式 */\n isTraveling = false\n },\n\n /**\n * 跳转到指定历史索引\n * 将当前指针直接移动到指定位置,恢复对应的快照状态\n *\n * @param index - 目标历史索引(0-based)\n */\n goto: (index: number) => {\n /* 索引越界检查 */\n if (index < 0 || index >= history.length) {\n return\n }\n\n /* 标记进入时间旅行模式 */\n isTraveling = true\n /* 直接设置指针到目标索引 */\n currentIndex = index\n /* 获取目标快照 */\n const snapshot = history[currentIndex]\n /* 恢复快照状态(深拷贝) */\n restoreCallback(snapshot.storeId, deepClone(snapshot.state))\n /* 退出时间旅行模式 */\n isTraveling = false\n },\n\n /**\n * 获取完整的快照历史(返回深拷贝,防止外部修改内部历史记录)\n * @returns 历史快照数组的深拷贝\n */\n getHistory: () => deepClone(history),\n\n /**\n * 获取当前快照指针索引\n * @returns 当前索引值,-1 表示无快照\n */\n getCurrentIndex: () => currentIndex,\n\n /**\n * 判断是否可以撤销\n * 当前索引大于 0 时,说明前面还有历史快照\n * @returns 是否可以执行 undo 操作\n */\n canUndo: () => currentIndex > 0,\n\n /**\n * 判断是否可以重做\n * 当前索引小于历史长度 - 1 时,说明后面还有快照\n * @returns 是否可以执行 redo 操作\n */\n canRedo: () => currentIndex < history.length - 1,\n\n /**\n * 清除所有历史快照并重置指针\n * 通常在 Store 销毁或需要重置历史时调用\n */\n clear: () => {\n /* 清空历史数组 */\n history.length = 0\n /* 重置指针到初始状态 */\n currentIndex = -1\n },\n }\n\n /**\n * 在控制器上挂载内部恢复回调设置器\n * 允许 Store 运行时在初始化时注入实际的状态恢复逻辑\n * 使用 __ 前缀表示这是内部方法,不建议外部直接调用\n */\n controller.__setRestoreCallback = (callback: RestoreCallback) => {\n restoreCallback = callback\n }\n\n /**\n * 时间旅行中间件\n * 拦截所有 \"state:\" 前缀的操作(如 state:update),在操作执行前后\n * 记录状态快照,从而构建可回溯的状态历史\n */\n const middleware: Middleware = {\n /* 中间件名称,用于调试和日志 */\n name: 'time-travel',\n /* 中间件优先级,50 为中等优先级(数值越小越先执行) */\n priority: 50,\n /**\n * 中间件处理函数\n * 只拦截 \"state:\" 类型的操作(状态变更操作),其他类型直接放行\n * 正在时间旅行时也不记录快照,避免循环\n *\n * @param context - 中间件上下文,包含 storeId、操作类型、状态等信息\n * @param next - 调用下一个中间件或最终操作的函数\n */\n handler: async (context: MiddlewareContext, next: () => void | Promise<void>) => {\n /* 解构上下文:Store 标识、操作类型、当前状态 */\n const { storeId, type, state } = context\n\n /* 非状态变更操作(不以 \"state:\" 开头)或正在时间旅行中,直接执行后续操作 */\n if (!type.startsWith('state:') || isTraveling) {\n await next()\n return\n }\n\n /* 在执行操作前,创建当前状态的快照(before snapshot) */\n const snapshot: StateSnapshot = {\n timestamp: Date.now(), /* 快照时间戳 */\n state: deepClone(state), /* 深拷贝当前状态,隔离引用 */\n type, /* 操作类型 */\n storeId, /* Store 标识 */\n }\n\n /* 执行后续中间件或最终操作 */\n await next()\n\n /* 操作执行完成后,将快照添加到历史记录 */\n addSnapshot(snapshot)\n },\n }\n\n /* 返回中间件和控制器 */\n return {\n middleware,\n controller,\n }\n}\n\n/**\n * 外部设置恢复回调的辅助函数\n * 将外部提供的状态恢复函数注入到时间旅行控制器中\n *\n * 使用场景:Store 运行时初始化时调用此函数,将控制器与 Store 的状态恢复逻辑连接\n *\n * @param controller - 时间旅行控制器实例\n * @param callback - 恢复回调函数,接收 storeId 和已深拷贝的状态树\n */\nexport function setRestoreCallback(\n controller: TimeTravelController,\n callback: (storeId: StoreId, state: StateTree) => void,\n): void {\n /* 将通用控制器类型断言为带内部设置器的扩展类型 */\n const controllerWithSetter = controller as TimeTravelControllerWithRestoreSetter\n /* 检查控制器是否支持 __setRestoreCallback 方法 */\n if (typeof controllerWithSetter.__setRestoreCallback === 'function') {\n /* 注入恢复回调 */\n controllerWithSetter.__setRestoreCallback(callback)\n return\n }\n\n /* 如果控制器不支持,输出警告(说明传入的不是 createTimeTravelMiddleware 创建的控制器) */\n console.warn('[TimeTravel] 请使用 createTimeTravelMiddleware 返回的 controller')\n}\n","/**\n * 验证中间件\n *\n * 对状态变化进行规则校验,支持同步/异步校验器\n * @module middleware/validation\n */\n\nimport type { Middleware, MiddlewareContext, StateTree, StoreId } from '../types'\n\n/**\n * 单个字段校验规则\n */\nexport interface ValidationRule<T = unknown> {\n /** 校验函数,返回 true 表示通过 */\n validate: (value: T, state: StateTree) => boolean | Promise<boolean>\n /** 校验失败时的错误信息 */\n message: string\n}\n\n/**\n * Store 校验规则集\n */\nexport type StoreValidationRules = Record<string, ValidationRule | ValidationRule[]>\n\n/**\n * 校验错误\n */\nexport interface ValidationError {\n /** Store ID */\n storeId: StoreId\n /** 字段路径 */\n field: string\n /** 错误信息 */\n message: string\n /** 字段值 */\n value: unknown\n}\n\n/**\n * 校验结果\n */\nexport interface ValidationResult {\n /** 是否全部通过 */\n valid: boolean\n /** 错误列表 */\n errors: ValidationError[]\n}\n\n/**\n * 验证中间件选项\n */\nexport interface ValidationMiddlewareOptions {\n /** 按 Store ID 配置的校验规则 */\n rules: Record<StoreId, StoreValidationRules>\n /** 校验失败时的回调 */\n onValidationError?: (result: ValidationResult) => void\n /** 校验失败是否阻止状态变化 (默认 false,仅报告) */\n blocking?: boolean\n /** 是否只在 state:patch 时校验 (默认 false,所有 state: 前缀均校验) */\n patchOnly?: boolean\n}\n\n/**\n * 创建验证中间件\n *\n * 对状态变化进行规则校验,可选择阻止无效变化或仅报告错误\n *\n * @param options - 验证配置\n * @returns 中间件实例和校验辅助 API\n *\n * @example\n * ```typescript\n * const { middleware, validate, getErrors, clearErrors } = createValidationMiddleware({\n * rules: {\n * 'user-form': {\n * name: {\n * validate: (v) => typeof v === 'string' && v.length >= 2,\n * message: 'Name must be at least 2 characters',\n * },\n * age: [\n * { validate: (v) => typeof v === 'number', message: 'Age must be a number' },\n * { validate: (v) => (v as number) >= 0 && (v as number) <= 150, message: 'Age must be 0-150' },\n * ],\n * email: {\n * validate: (v) => /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/.test(String(v)),\n * message: 'Invalid email format',\n * },\n * },\n * },\n * onValidationError: (result) => {\n * console.warn('Validation failed:', result.errors)\n * },\n * })\n *\n * manager.use(middleware)\n * ```\n */\nexport function createValidationMiddleware(options: ValidationMiddlewareOptions): {\n middleware: Middleware\n /** 手动校验某个 store 的当前状态 */\n validate: (storeId: StoreId, state: StateTree) => Promise<ValidationResult>\n /** 获取最近一次的校验错误 */\n getErrors: () => ValidationError[]\n /** 清空错误 */\n clearErrors: () => void\n} {\n const {\n rules,\n onValidationError,\n blocking = false,\n patchOnly = false,\n } = options\n\n let lastErrors: ValidationError[] = []\n\n /**\n * 校验单个 store 状态\n */\n async function validateState(storeId: StoreId, state: StateTree): Promise<ValidationResult> {\n const storeRules = rules[storeId]\n if (!storeRules) return { valid: true, errors: [] }\n\n const errors: ValidationError[] = []\n\n for (const [field, fieldRules] of Object.entries(storeRules)) {\n const ruleList = Array.isArray(fieldRules) ? fieldRules : [fieldRules]\n const value = state[field]\n\n for (const rule of ruleList) {\n try {\n const isValid = await rule.validate(value, state)\n if (!isValid) {\n errors.push({\n storeId,\n field,\n message: rule.message,\n value,\n })\n }\n }\n catch {\n errors.push({\n storeId,\n field,\n message: rule.message || `Validation error on field \"${field}\"`,\n value,\n })\n }\n }\n }\n\n return { valid: errors.length === 0, errors }\n }\n\n const middleware: Middleware = {\n name: 'validation',\n priority: 5, // 在 logger (0) 之后、大多数业务中间件之前\n\n handler: async (context: MiddlewareContext, next: () => void | Promise<void>) => {\n const { storeId, type, state } = context\n\n // 检查是否需要校验\n const shouldValidate = patchOnly\n ? type === 'state:patch'\n : type.startsWith('state:')\n\n if (!shouldValidate || !rules[storeId]) {\n await next()\n return\n }\n\n // 先执行状态变化\n await next()\n\n // 校验变化后的状态\n const result = await validateState(storeId, state)\n\n if (!result.valid) {\n lastErrors = result.errors\n onValidationError?.(result)\n\n if (blocking) {\n throw new Error(\n `[Validation] ${storeId}: ${result.errors.map(e => e.message).join('; ')}`,\n )\n }\n }\n else {\n // 校验通过,清除该 store 的错误\n lastErrors = lastErrors.filter(e => e.storeId !== storeId)\n }\n },\n }\n\n return {\n middleware,\n validate: validateState,\n getErrors: () => [...lastErrors],\n clearErrors: () => { lastErrors = [] },\n }\n}\n","/**\n * 插件定义辅助函数\n *\n * @module plugins/define-plugin\n */\n\nimport type { DefinePluginOptions, PluginFactory, StorePlugin } from '../types'\n\n/**\n * 定义 Store 插件\n *\n * 提供类型安全的插件定义方式\n *\n * @template Options - 插件选项类型\n * @param options - 插件定义选项\n * @returns 插件实例\n *\n * @example\n * ```typescript\n * // 定义一个简单的日志插件\n * const loggerPlugin = defineStorePlugin({\n * name: 'logger',\n * version: '1.0.0',\n * install(context) {\n * console.log('Logger plugin installed')\n * },\n * onStateChange(storeId, state, oldState) {\n * console.log(`[${storeId}] State changed:`, state)\n * },\n * })\n * ```\n */\nexport function defineStorePlugin<Options = Record<string, unknown>>(\n options: DefinePluginOptions<Options>,\n): StorePlugin<Options> {\n return {\n name: options.name,\n version: options.version,\n description: options.description,\n install: options.install,\n uninstall: options.uninstall,\n onStoreCreated: options.onStoreCreated,\n onStoreDisposed: options.onStoreDisposed,\n onStateChange: options.onStateChange,\n }\n}\n\n/**\n * 创建插件工厂函数\n *\n * 用于创建可配置的插件\n *\n * @template Options - 插件选项类型\n * @param factory - 插件工厂函数\n * @returns 插件工厂\n *\n * @example\n * ```typescript\n * // 创建可配置的持久化插件\n * const createPersistPlugin = createPluginFactory<{ key: string }>(\n * (options) => ({\n * name: 'persist',\n * install(context) {\n * console.log('Persist key:', options?.key)\n * },\n * })\n * )\n *\n * // 使用\n * const plugin = createPersistPlugin({ key: 'my-store' })\n * ```\n */\nexport function createPluginFactory<Options = Record<string, unknown>>(\n factory: (options?: Options) => DefinePluginOptions<Options>,\n): PluginFactory<Options> {\n return (options?: Options): StorePlugin<Options> => {\n return defineStorePlugin(factory(options))\n }\n}\n\n/**\n * 组合多个插件\n *\n * @param plugins - 插件列表\n * @returns 组合后的插件\n *\n * @example\n * ```typescript\n * const combinedPlugin = composePlugins([\n * loggerPlugin,\n * persistPlugin,\n * devtoolsPlugin,\n * ])\n * ```\n */\nexport function composePlugins(\n plugins: StorePlugin[],\n): StorePlugin {\n return {\n name: 'composed-plugins',\n version: '1.0.0',\n\n async install(context, options) {\n for (const plugin of plugins) {\n await plugin.install(context, options)\n }\n },\n\n async uninstall(context) {\n // 逆序卸载\n for (let i = plugins.length - 1; i >= 0; i--) {\n await plugins[i].uninstall?.(context)\n }\n },\n\n onStoreCreated(store) {\n plugins.forEach(plugin => plugin.onStoreCreated?.(store))\n },\n\n onStoreDisposed(store) {\n plugins.forEach(plugin => plugin.onStoreDisposed?.(store))\n },\n\n onStateChange(storeId, state, oldState) {\n plugins.forEach(plugin => plugin.onStateChange?.(storeId, state, oldState))\n },\n }\n}\n\n","/**\n * 插件管理器\n *\n * @module plugins/plugin-manager\n */\n\nimport type { PluginContext, PluginManager, StorePlugin } from '../types'\n\n/**\n * 创建插件管理器\n *\n * @returns 插件管理器实例\n *\n * @example\n * ```typescript\n * const manager = createPluginManager()\n *\n * // 注册插件\n * manager.use(myPlugin, { option: 'value' })\n *\n * // 获取插件\n * const plugin = manager.get('my-plugin')\n *\n * // 移除插件\n * manager.remove('my-plugin')\n * ```\n */\nexport function createPluginManager(): PluginManager {\n /** 已注册的插件 */\n const plugins = new Map<string, StorePlugin>()\n\n /** 插件上下文缓存 */\n const contexts = new Map<string, PluginContext>()\n\n /**\n * 注册插件\n */\n const use = <Options>(\n plugin: StorePlugin<Options>,\n options?: Options,\n ): void => {\n if (plugins.has(plugin.name)) {\n console.warn(`[Plugin] 插件 \"${plugin.name}\" 已存在,将被覆盖`)\n }\n\n plugins.set(plugin.name, plugin as StorePlugin)\n\n // 创建插件上下文\n const context: PluginContext = {\n storeManager: {\n getStore: () => null,\n hasStore: () => false,\n getStoreIds: () => [],\n },\n storeId: '',\n store: null,\n options: (options || {}) as Record<string, unknown>,\n }\n\n contexts.set(plugin.name, context)\n }\n\n /**\n * 移除插件\n */\n const remove = (name: string): void => {\n const plugin = plugins.get(name)\n const context = contexts.get(name)\n\n if (plugin && context) {\n // 调用卸载钩子\n plugin.uninstall?.(context)\n }\n\n plugins.delete(name)\n contexts.delete(name)\n }\n\n /**\n * 获取插件\n */\n const get = (name: string): StorePlugin | undefined => {\n return plugins.get(name)\n }\n\n /**\n * 是否已注册插件\n */\n const has = (name: string): boolean => {\n return plugins.has(name)\n }\n\n /**\n * 获取所有插件\n */\n const getAll = (): Map<string, StorePlugin> => {\n return new Map(plugins)\n }\n\n /**\n * 获取插件数量\n */\n const size = (): number => {\n return plugins.size\n }\n\n /**\n * 清空所有插件\n */\n const clear = (): void => {\n // 调用所有插件的卸载钩子\n plugins.forEach((plugin, name) => {\n const context = contexts.get(name)\n if (context) {\n plugin.uninstall?.(context)\n }\n })\n\n plugins.clear()\n contexts.clear()\n }\n\n return {\n use,\n remove,\n get,\n has,\n getAll,\n size,\n clear,\n }\n}\n\n/**\n * 全局插件管理器\n */\nlet globalPluginManager: PluginManager | null = null\n\n/**\n * 获取全局插件管理器\n */\nexport function getGlobalPluginManager(): PluginManager {\n if (!globalPluginManager) {\n globalPluginManager = createPluginManager()\n }\n return globalPluginManager\n}\n\n/**\n * 设置全局插件管理器\n */\nexport function setGlobalPluginManager(manager: PluginManager): void {\n globalPluginManager = manager\n}\n\n","/**\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":"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"}
1
+ {"version":3,"file":"index.js","names":["result","batch","StoreErrorCode","ErrorSeverity"],"sources":["../src/core/pub-sub.ts","../src/core/async-action.ts","../src/middleware/middleware-manager.ts","../src/plugins/plugin-manager.ts","../src/utils/debounce-throttle.ts","../src/utils/deep-clone.ts","../src/utils/selector.ts","../src/core/batch-manager.ts","../src/core/event-bus.ts","../src/core/base-store.ts","../src/core/create-store.ts","../src/engine/plugin.ts","../src/errors/index.ts","../src/middleware/logger.ts","../src/middleware/persist.ts","../src/middleware/time-travel.ts","../src/middleware/validation.ts","../src/plugins/define-plugin.ts","../src/index.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","/** Race-safe asynchronous action helper. */\n\nimport type { Unsubscribe } from '../types'\nimport { createPubSub } from './pub-sub'\n\nexport interface AsyncActionOptions {\n retryCount?: number\n retryDelay?: number\n timeout?: number\n resetOnExecute?: boolean\n}\n\nexport interface AsyncActionState<T> {\n data: T | null\n error: Error | null\n loading: boolean\n executionCount: number\n lastExecutedAt: number | null\n}\n\nexport interface AsyncAction<T, Args extends unknown[]> {\n readonly state: AsyncActionState<T>\n execute: (...args: Args) => Promise<T>\n reset: () => void\n abort: () => void\n subscribe: (callback: (state: AsyncActionState<T>) => void) => Unsubscribe\n onSuccess: (callback: (data: T) => void) => Unsubscribe\n onError: (callback: (error: Error) => void) => Unsubscribe\n}\n\ninterface Execution<T> {\n id: number\n controller: AbortController\n timeoutId?: ReturnType<typeof setTimeout>\n rejectAbort?: (error: Error) => void\n abortReason?: Error\n result?: Promise<T>\n}\n\nfunction abortError(): Error {\n return new Error('Aborted')\n}\n\nfunction delay(ms: number, signal: AbortSignal): Promise<void> {\n if (signal.aborted) {\n return Promise.reject(abortError())\n }\n\n return new Promise((resolve, reject) => {\n let timer: ReturnType<typeof setTimeout>\n const onAbort = (): void => {\n clearTimeout(timer)\n signal.removeEventListener('abort', onAbort)\n reject(abortError())\n }\n timer = setTimeout(() => {\n signal.removeEventListener('abort', onAbort)\n resolve()\n }, ms)\n signal.addEventListener('abort', onAbort, { once: true })\n })\n}\n\nexport function createAsyncAction<T, Args extends unknown[] = []>(\n fn: (...args: Args) => Promise<T>,\n options: AsyncActionOptions = {}\n): AsyncAction<T, Args> {\n const {\n retryCount = 0,\n retryDelay = 1000,\n timeout = 0,\n resetOnExecute = true,\n } = options\n\n const _state: AsyncActionState<T> = {\n data: null,\n error: null,\n loading: false,\n executionCount: 0,\n lastExecutedAt: null,\n }\n const statePubSub = createPubSub<AsyncActionState<T>>()\n const successPubSub = createPubSub<T>()\n const errorPubSub = createPubSub<Error>()\n let nextExecutionId = 0\n let activeExecution: Execution<T> | null = null\n\n const notify = (): void => statePubSub.publish({ ..._state })\n\n const invoke = fn as unknown as (\n ...args: [...Args, AbortSignal]\n ) => Promise<T>\n const executeWithRetry = async (\n args: Args,\n retriesLeft: number,\n execution: Execution<T>\n ): Promise<T> => {\n if (execution.controller.signal.aborted) {\n throw execution.abortReason ?? abortError()\n }\n\n try {\n const result = await invoke(...args, execution.controller.signal)\n if (execution.controller.signal.aborted) {\n throw execution.abortReason ?? abortError()\n }\n return result\n } catch (error) {\n if (execution.controller.signal.aborted) {\n throw execution.abortReason ?? abortError()\n }\n if (retriesLeft <= 0) {\n throw error\n }\n await delay(retryDelay, execution.controller.signal)\n return executeWithRetry(args, retriesLeft - 1, execution)\n }\n }\n\n const cancelExecution = (execution: Execution<T>, reason: Error): void => {\n execution.abortReason = reason\n if (!execution.controller.signal.aborted) {\n execution.controller.abort()\n }\n execution.rejectAbort?.(reason)\n if (execution.timeoutId) {\n clearTimeout(execution.timeoutId)\n execution.timeoutId = undefined\n }\n }\n\n const execute = async (...args: Args): Promise<T> => {\n if (activeExecution) {\n cancelExecution(activeExecution, abortError())\n }\n\n const execution: Execution<T> = {\n id: ++nextExecutionId,\n controller: new AbortController(),\n }\n activeExecution = execution\n\n if (resetOnExecute) {\n _state.error = null\n }\n _state.loading = true\n _state.executionCount++\n _state.lastExecutedAt = Date.now()\n notify()\n\n try {\n const work = executeWithRetry(args, retryCount, execution)\n const abortPromise = new Promise<never>((_, reject) => {\n execution.rejectAbort = reject\n })\n const timeoutPromise =\n timeout > 0\n ? new Promise<never>((_, reject) => {\n execution.timeoutId = setTimeout(() => {\n const error = new Error(`Timeout after ${timeout}ms`)\n execution.abortReason = error\n execution.controller.abort()\n reject(error)\n }, timeout)\n })\n : null\n\n execution.result = timeoutPromise\n ? Promise.race([work, abortPromise, timeoutPromise])\n : Promise.race([work, abortPromise])\n const result = await execution.result\n\n if (\n activeExecution?.id === execution.id &&\n !execution.controller.signal.aborted\n ) {\n _state.data = result\n _state.error = null\n _state.loading = false\n notify()\n successPubSub.publish(result)\n }\n\n return result\n } catch (error) {\n if (activeExecution?.id === execution.id) {\n const err = error instanceof Error ? error : new Error(String(error))\n _state.error = err\n _state.loading = false\n notify()\n if (execution.abortReason?.message !== 'Aborted') {\n errorPubSub.publish(err)\n }\n }\n throw error\n } finally {\n if (execution.timeoutId) {\n clearTimeout(execution.timeoutId)\n execution.timeoutId = undefined\n }\n if (activeExecution?.id === execution.id) {\n activeExecution = null\n }\n }\n }\n\n const reset = (): void => {\n if (activeExecution) {\n const execution = activeExecution\n activeExecution = null\n cancelExecution(execution, abortError())\n }\n _state.data = null\n _state.error = null\n _state.loading = false\n _state.executionCount = 0\n _state.lastExecutedAt = null\n notify()\n }\n\n const abort = (): void => {\n const execution = activeExecution\n if (!execution) return\n\n activeExecution = null\n cancelExecution(execution, abortError())\n if (_state.loading) {\n _state.loading = false\n _state.error = execution.abortReason ?? abortError()\n notify()\n }\n }\n\n return {\n get state() {\n return { ..._state }\n },\n execute,\n reset,\n abort,\n subscribe: callback => statePubSub.subscribe(callback),\n onSuccess: callback => successPubSub.subscribe(callback),\n onError: callback => errorPubSub.subscribe(callback),\n }\n}\n","/**\r\n * 中间件管理器\r\n *\r\n * @module middleware/middleware-manager\r\n */\r\n\r\nimport type { Middleware, MiddlewareContext, MiddlewareManager } from '../types'\r\n\r\n/**\r\n * 创建中间件管理器\r\n *\r\n * @returns 中间件管理器实例\r\n *\r\n * @example\r\n * ```typescript\r\n * const manager = createMiddlewareManager()\r\n *\r\n * // 添加日志中间件\r\n * manager.use({\r\n * name: 'logger',\r\n * priority: 1,\r\n * handler: async (ctx, next) => {\r\n * console.log('Before:', ctx.type)\r\n * await next()\r\n * console.log('After:', ctx.type)\r\n * }\r\n * })\r\n *\r\n * // 执行中间件链\r\n * await manager.execute({ storeId: 'test', state: {}, type: 'state:patch' })\r\n * ```\r\n */\r\nexport function createMiddlewareManager(): MiddlewareManager {\r\n /** 中间件列表 */\r\n const middlewares = new Map<string, Middleware>()\r\n\r\n /** 已排序的中间件列表缓存 */\r\n let sortedMiddlewares: Middleware[] | null = null\r\n\r\n /**\r\n * 获取排序后的中间件列表\r\n */\r\n const getSortedMiddlewares = (): Middleware[] => {\r\n if (sortedMiddlewares === null) {\r\n sortedMiddlewares = Array.from(middlewares.values()).sort(\r\n (a, b) => (a.priority ?? 100) - (b.priority ?? 100)\r\n )\r\n }\r\n return sortedMiddlewares\r\n }\r\n\r\n /**\r\n * 使中间件缓存失效\r\n */\r\n const invalidateCache = (): void => {\r\n sortedMiddlewares = null\r\n }\r\n\r\n /**\r\n * 添加中间件\r\n */\r\n const use = (middleware: Middleware): void => {\r\n if (middlewares.has(middleware.name)) {\r\n console.warn(`[Middleware] 中间件 \"${middleware.name}\" 已存在,将被覆盖`)\r\n }\r\n middlewares.set(middleware.name, middleware)\r\n invalidateCache()\r\n }\r\n\r\n /**\r\n * 移除中间件\r\n */\r\n const remove = (name: string): void => {\r\n if (middlewares.delete(name)) {\r\n invalidateCache()\r\n }\r\n }\r\n\r\n /**\r\n * 获取中间件\r\n */\r\n const get = (name: string): Middleware | undefined => {\r\n return middlewares.get(name)\r\n }\r\n\r\n /**\r\n * 是否存在中间件\r\n */\r\n const has = (name: string): boolean => {\r\n return middlewares.has(name)\r\n }\r\n\r\n /**\r\n * 执行中间件链\r\n */\r\n const execute = async (context: MiddlewareContext): Promise<void> => {\r\n const sorted = getSortedMiddlewares()\r\n\r\n if (sorted.length === 0) {\r\n return\r\n }\r\n\r\n const dispatch = async (index: number): Promise<void> => {\r\n const middleware = sorted[index]\r\n if (!middleware) {\r\n context.meta?.commit?.()\r\n return\r\n }\r\n\r\n let called = false\r\n const next = async (): Promise<void> => {\r\n if (called) {\r\n throw new Error(\r\n `[Middleware] next() called multiple times in \"${middleware.name}\"`\r\n )\r\n }\r\n\r\n called = true\r\n await dispatch(index + 1)\r\n }\r\n\r\n await middleware.handler(context, next)\r\n }\r\n\r\n await dispatch(0)\r\n }\r\n\r\n /**\r\n * 获取所有中间件\r\n */\r\n const getAll = (): Middleware[] => {\r\n return getSortedMiddlewares()\r\n }\r\n\r\n /**\r\n * 清空所有中间件\r\n */\r\n const clear = (): void => {\r\n middlewares.clear()\r\n invalidateCache()\r\n }\r\n\r\n return {\r\n use,\r\n remove,\r\n get,\r\n has,\r\n execute,\r\n getAll,\r\n clear,\r\n }\r\n}\r\n\r\n/**\r\n * 全局中间件管理器\r\n */\r\nlet globalMiddlewareManager: MiddlewareManager | null = null\r\n\r\n/**\r\n * 获取全局中间件管理器\r\n */\r\nexport function getGlobalMiddlewareManager(): MiddlewareManager {\r\n if (!globalMiddlewareManager) {\r\n globalMiddlewareManager = createMiddlewareManager()\r\n }\r\n return globalMiddlewareManager\r\n}\r\n\r\n/**\r\n * 设置全局中间件管理器\r\n */\r\nexport function setGlobalMiddlewareManager(manager: MiddlewareManager): void {\r\n globalMiddlewareManager = manager\r\n}\r\n","/** Store plugin registry and lifecycle host. */\n\nimport type {\n PluginContext,\n PluginManager,\n StateTree,\n StoreId,\n StorePlugin,\n} from '../types'\n\nfunction reportPluginError(action: string, name: string, error: unknown): void {\n console.error(`[Plugin] ${action} failed for \"${name}\":`, error)\n}\n\nexport function createPluginManager(): PluginManager {\n const plugins = new Map<string, StorePlugin>()\n const contexts = new Map<string, PluginContext>()\n const stores = new Map<StoreId, unknown>()\n\n const storeManager = {\n getStore: (id: StoreId): unknown => stores.get(id),\n hasStore: (id: StoreId): boolean => stores.has(id),\n getStoreIds: (): StoreId[] => Array.from(stores.keys()),\n }\n\n const createContext = <Options>(options?: Options): PluginContext => ({\n storeManager,\n storeId: '',\n store: null,\n options: (options || {}) as Record<string, unknown>,\n })\n\n const use = <Options>(\n plugin: StorePlugin<Options>,\n options?: Options\n ): void => {\n const previous = plugins.get(plugin.name)\n const previousContext = contexts.get(plugin.name)\n if (previous && previousContext) {\n void Promise.resolve(previous.uninstall?.(previousContext)).catch(\n error => {\n reportPluginError('uninstall', plugin.name, error)\n }\n )\n }\n\n const context = createContext(options)\n plugins.set(plugin.name, plugin as StorePlugin)\n contexts.set(plugin.name, context)\n\n void Promise.resolve(plugin.install(context, options)).catch(error => {\n reportPluginError('install', plugin.name, error)\n })\n\n stores.forEach(store => plugin.onStoreCreated?.(store))\n }\n\n const remove = (name: string): void => {\n const plugin = plugins.get(name)\n const context = contexts.get(name)\n if (plugin && context) {\n void Promise.resolve(plugin.uninstall?.(context)).catch(error => {\n reportPluginError('uninstall', name, error)\n })\n }\n plugins.delete(name)\n contexts.delete(name)\n }\n\n const get = (name: string): StorePlugin | undefined => plugins.get(name)\n const has = (name: string): boolean => plugins.has(name)\n const getAll = (): Map<string, StorePlugin> => new Map(plugins)\n const size = (): number => plugins.size\n\n const clear = (): void => {\n plugins.forEach((plugin, name) => {\n const context = contexts.get(name)\n if (context) {\n void Promise.resolve(plugin.uninstall?.(context)).catch(error => {\n reportPluginError('uninstall', name, error)\n })\n }\n })\n plugins.clear()\n contexts.clear()\n }\n\n const notifyStoreCreated = (store: unknown): void => {\n const id = readStoreId(store)\n if (id) stores.set(id, store)\n plugins.forEach(plugin => plugin.onStoreCreated?.(store))\n }\n\n const notifyStoreDisposed = (store: unknown): void => {\n const id = readStoreId(store)\n if (id) stores.delete(id)\n plugins.forEach(plugin => plugin.onStoreDisposed?.(store))\n }\n\n const notifyStateChange = <S extends StateTree>(\n storeId: StoreId,\n state: S,\n oldState: S\n ): void => {\n plugins.forEach(plugin => plugin.onStateChange?.(storeId, state, oldState))\n }\n\n return {\n use,\n remove,\n get,\n has,\n getAll,\n size,\n clear,\n notifyStoreCreated,\n notifyStoreDisposed,\n notifyStateChange,\n }\n}\n\nfunction readStoreId(store: unknown): StoreId | undefined {\n if (!store || typeof store !== 'object') return undefined\n const id = (store as { $id?: unknown }).$id\n return typeof id === 'string' ? id : undefined\n}\n\nlet globalPluginManager: PluginManager | null = null\n\nexport function getGlobalPluginManager(): PluginManager {\n if (!globalPluginManager) {\n globalPluginManager = createPluginManager()\n }\n return globalPluginManager\n}\n\nexport function setGlobalPluginManager(manager: PluginManager): void {\n globalPluginManager = manager\n}\n","/**\r\n * 防抖和节流工具函数\r\n *\r\n * 提供性能优化的防抖、节流功能\r\n * @module utils/debounce-throttle\r\n */\r\n\r\n/**\r\n * 防抖函数返回类型\r\n */\r\nexport interface DebouncedFunction<T extends (...args: never[]) => void> {\r\n (...args: Parameters<T>): void\r\n /** 取消待执行的调用 */\r\n cancel: () => void\r\n /** 立即执行待处理的调用 */\r\n flush: () => void\r\n /** 是否有待处理的调用 */\r\n pending: () => boolean\r\n}\r\n\r\n/**\r\n * 节流函数返回类型\r\n */\r\nexport interface ThrottledFunction<T extends (...args: never[]) => void> {\r\n (...args: Parameters<T>): void\r\n /** 取消待执行的调用 */\r\n cancel: () => void\r\n}\r\n\r\n/**\r\n * 创建防抖函数\r\n *\r\n * 在连续调用停止后,延迟指定时间执行函数\r\n *\r\n * @template T - 函数类型\r\n * @param fn - 需要防抖的函数\r\n * @param delay - 延迟时间(毫秒)\r\n * @param immediate - 是否在首次调用时立即执行\r\n * @returns 防抖后的函数\r\n *\r\n * @example\r\n * ```typescript\r\n * const debouncedSearch = debounce((query: string) => {\r\n * fetchResults(query)\r\n * }, 300)\r\n *\r\n * // 连续调用只会在最后一次调用后 300ms 执行\r\n * debouncedSearch('a')\r\n * debouncedSearch('ab')\r\n * debouncedSearch('abc') // 只有这次会触发\r\n *\r\n * // 取消待执行的调用\r\n * debouncedSearch.cancel()\r\n * ```\r\n */\r\nexport function debounce<T extends (...args: never[]) => void>(\r\n fn: T,\r\n delay: number,\r\n immediate = false\r\n): DebouncedFunction<T> {\r\n let timer: ReturnType<typeof setTimeout> | null = null\r\n let lastArgs: Parameters<T> | null = null\r\n\r\n const debounced = ((...args: Parameters<T>) => {\r\n lastArgs = args\r\n\r\n if (timer) {\r\n clearTimeout(timer)\r\n }\r\n\r\n if (immediate && !timer) {\r\n fn(...args)\r\n timer = setTimeout(() => {\r\n timer = null\r\n lastArgs = null\r\n }, delay)\r\n } else {\r\n timer = setTimeout(() => {\r\n fn(...args)\r\n timer = null\r\n lastArgs = null\r\n }, delay)\r\n }\r\n }) as DebouncedFunction<T>\r\n\r\n debounced.cancel = () => {\r\n if (timer) {\r\n clearTimeout(timer)\r\n timer = null\r\n lastArgs = null\r\n }\r\n }\r\n\r\n debounced.flush = () => {\r\n if (timer && lastArgs) {\r\n clearTimeout(timer)\r\n fn(...lastArgs)\r\n timer = null\r\n lastArgs = null\r\n }\r\n }\r\n\r\n debounced.pending = () => timer !== null\r\n\r\n return debounced\r\n}\r\n\r\n/**\r\n * 创建节流函数\r\n *\r\n * 在指定时间间隔内最多执行一次函数\r\n *\r\n * @template T - 函数类型\r\n * @param fn - 需要节流的函数\r\n * @param interval - 间隔时间(毫秒)\r\n * @param options - 节流选项\r\n * @param options.leading - 是否在时间窗开始时立即执行\r\n * @param options.trailing - 是否在时间窗结束时补执行最后一次调用\r\n * @returns 节流后的函数\r\n *\r\n * @example\r\n * ```typescript\r\n * const throttledUpdate = throttle((x: number, y: number) => {\r\n * updatePosition(x, y)\r\n * }, 100)\r\n *\r\n * // 在 100ms 内多次调用,只会执行一次\r\n * window.addEventListener('mousemove', (e) => {\r\n * throttledUpdate(e.clientX, e.clientY)\r\n * })\r\n *\r\n * // 取消\r\n * throttledUpdate.cancel()\r\n * ```\r\n */\r\nexport function throttle<T extends (...args: never[]) => void>(\r\n fn: T,\r\n interval: number,\r\n options: { leading?: boolean; trailing?: boolean } = {}\r\n): ThrottledFunction<T> {\r\n const { leading = true, trailing = true } = options\r\n let timer: ReturnType<typeof setTimeout> | null = null\r\n let lastTime = 0\r\n let lastArgs: Parameters<T> | null = null\r\n\r\n const throttled = ((...args: Parameters<T>) => {\r\n const now = Date.now()\r\n const remaining = interval - (now - lastTime)\r\n\r\n lastArgs = args\r\n\r\n if (remaining <= 0 || remaining > interval) {\r\n if (timer) {\r\n clearTimeout(timer)\r\n timer = null\r\n }\r\n lastTime = now\r\n if (leading || lastTime !== 0) {\r\n fn(...args)\r\n }\r\n lastArgs = null\r\n } else if (!timer && trailing) {\r\n timer = setTimeout(() => {\r\n lastTime = trailing ? Date.now() : 0\r\n timer = null\r\n if (lastArgs) {\r\n fn(...lastArgs)\r\n lastArgs = null\r\n }\r\n }, remaining)\r\n }\r\n }) as ThrottledFunction<T>\r\n\r\n throttled.cancel = () => {\r\n if (timer) {\r\n clearTimeout(timer)\r\n timer = null\r\n }\r\n lastTime = 0\r\n lastArgs = null\r\n }\r\n\r\n return throttled\r\n}\r\n","/**\r\n * 深拷贝工具\r\n *\r\n * 提供高性能的深拷贝、浅拷贝和深度合并功能\r\n * @module utils/deep-clone\r\n */\r\n\r\nconst hasOwnProperty = Object.prototype.hasOwnProperty\r\n\r\nfunction hasOwnKey(value: object, key: PropertyKey): boolean {\r\n return hasOwnProperty.call(value, key)\r\n}\r\n\r\n/**\r\n * 判断是否为对象\r\n *\r\n * @param value - 待检查的值\r\n * @returns 是否为对象\r\n */\r\nexport function isObject(value: unknown): value is Record<string, unknown> {\r\n return value !== null && typeof value === 'object'\r\n}\r\n\r\n/**\r\n * 判断是否为普通对象(非数组、非内置对象)\r\n *\r\n * @param value - 待检查的值\r\n * @returns 是否为普通对象\r\n */\r\nexport function isPlainObject(\r\n value: unknown\r\n): value is Record<string, unknown> {\r\n if (!isObject(value)) return false\r\n const proto = Object.getPrototypeOf(value)\r\n return proto === null || proto === Object.prototype\r\n}\r\n\r\n/**\r\n * 判断值是否可以被 structuredClone 处理\r\n *\r\n * @param value - 待检查的值\r\n * @returns 是否可以使用 structuredClone\r\n */\r\nfunction isStructuredCloneable(value: unknown): boolean {\r\n // 基础类型\r\n if (value === null || value === undefined) return true\r\n if (\r\n typeof value === 'boolean' ||\r\n typeof value === 'number' ||\r\n typeof value === 'string'\r\n )\r\n return true\r\n if (typeof value === 'bigint') return true\r\n\r\n // 函数和 Symbol 不可克隆\r\n if (typeof value === 'function' || typeof value === 'symbol') return false\r\n\r\n // 内置可克隆对象\r\n if (value instanceof Date || value instanceof RegExp) return true\r\n if (value instanceof ArrayBuffer || value instanceof DataView) return true\r\n if (value instanceof Map || value instanceof Set) return true\r\n if (ArrayBuffer.isView(value)) return true\r\n\r\n // 普通对象和数组递归检查\r\n if (Array.isArray(value)) {\r\n return value.every(item => isStructuredCloneable(item))\r\n }\r\n\r\n if (isPlainObject(value)) {\r\n return Object.values(value).every(v => isStructuredCloneable(v))\r\n }\r\n\r\n return false\r\n}\r\n\r\n/**\r\n * 深拷贝配置选项\r\n */\r\nexport interface DeepCloneOptions {\r\n /** 是否优先使用 structuredClone(默认 true) */\r\n useStructuredClone?: boolean\r\n /** 是否克隆函数(默认 false,函数保持引用) */\r\n cloneFunctions?: boolean\r\n /** 是否克隆 Symbol 属性(默认 false) */\r\n cloneSymbols?: boolean\r\n /** 最大深度(默认无限制) */\r\n maxDepth?: number\r\n /** 自定义克隆器 */\r\n customCloner?: <T>(value: T, clone: <U>(v: U) => U) => T | undefined\r\n}\r\n\r\n/**\r\n * 深拷贝\r\n *\r\n * 高性能深拷贝实现,优先使用原生 structuredClone(如果可用)\r\n *\r\n * @template T - 值类型\r\n * @param value - 要拷贝的值\r\n * @param options - 配置选项\r\n * @returns 拷贝后的值\r\n *\r\n * @example\r\n * ```typescript\r\n * const obj = { a: 1, b: { c: 2 } }\r\n * const cloned = deepClone(obj)\r\n * cloned.b.c = 3\r\n * console.log(obj.b.c) // 2\r\n * ```\r\n *\r\n * @example\r\n * ```typescript\r\n * // 带配置的深拷贝\r\n * const cloned = deepClone(obj, {\r\n * maxDepth: 5,\r\n * cloneSymbols: true\r\n * })\r\n * ```\r\n */\r\nexport function deepClone<T>(value: T, options: DeepCloneOptions = {}): T {\r\n const {\r\n useStructuredClone: preferStructuredClone = true,\r\n cloneFunctions = false,\r\n cloneSymbols = false,\r\n maxDepth = Infinity,\r\n customCloner,\r\n } = options\r\n\r\n // 尝试使用 structuredClone(性能更好)\r\n if (\r\n preferStructuredClone &&\r\n typeof structuredClone === 'function' &&\r\n isStructuredCloneable(value)\r\n ) {\r\n try {\r\n return structuredClone(value)\r\n } catch {\r\n // structuredClone 失败,回退到手动实现\r\n }\r\n }\r\n\r\n const cache = new WeakMap<object, unknown>()\r\n\r\n function cloneInternal<U>(val: U, depth: number): U {\r\n // 基础类型直接返回\r\n if (val === null || val === undefined) return val\r\n if (\r\n typeof val === 'boolean' ||\r\n typeof val === 'number' ||\r\n typeof val === 'string'\r\n )\r\n return val\r\n if (typeof val === 'bigint') return val\r\n\r\n // Symbol 处理\r\n if (typeof val === 'symbol') {\r\n return cloneSymbols ? (Symbol(val.description) as U) : val\r\n }\r\n\r\n // 函数处理\r\n if (typeof val === 'function') {\r\n return cloneFunctions ? (val.bind({}) as U) : val\r\n }\r\n\r\n // 深度检查\r\n if (depth > maxDepth) {\r\n return val\r\n }\r\n\r\n // 自定义克隆器\r\n if (customCloner) {\r\n const customResult = customCloner(val, v => cloneInternal(v, depth + 1))\r\n if (customResult !== undefined) {\r\n return customResult\r\n }\r\n }\r\n\r\n // 检查循环引用\r\n if (typeof val === 'object' && val !== null) {\r\n if (cache.has(val)) {\r\n return cache.get(val) as U\r\n }\r\n }\r\n\r\n // 处理日期\r\n if (val instanceof Date) {\r\n return new Date(val.getTime()) as U\r\n }\r\n\r\n // 处理正则\r\n if (val instanceof RegExp) {\r\n const result = new RegExp(val.source, val.flags)\r\n ;(result as RegExp).lastIndex = val.lastIndex\r\n return result as U\r\n }\r\n\r\n // 处理 Error\r\n if (val instanceof Error) {\r\n const result = new (val.constructor as ErrorConstructor)(val.message)\r\n result.stack = val.stack\r\n result.name = val.name\r\n return result as U\r\n }\r\n\r\n // 处理 Map\r\n if (val instanceof Map) {\r\n const result = new Map()\r\n cache.set(val, result)\r\n val.forEach((v, k) => {\r\n result.set(cloneInternal(k, depth + 1), cloneInternal(v, depth + 1))\r\n })\r\n return result as U\r\n }\r\n\r\n // 处理 Set\r\n if (val instanceof Set) {\r\n const result = new Set()\r\n cache.set(val, result)\r\n val.forEach(v => {\r\n result.add(cloneInternal(v, depth + 1))\r\n })\r\n return result as U\r\n }\r\n\r\n // 处理 ArrayBuffer\r\n if (val instanceof ArrayBuffer) {\r\n return val.slice(0) as U\r\n }\r\n\r\n // 处理 TypedArray\r\n if (ArrayBuffer.isView(val) && !(val instanceof DataView)) {\r\n const TypedArrayConstructor = val.constructor as new (\r\n buffer: ArrayBuffer\r\n ) => typeof val\r\n return new TypedArrayConstructor(\r\n (val as unknown as { buffer: ArrayBuffer }).buffer.slice(0)\r\n ) as U\r\n }\r\n\r\n // 处理数组\r\n if (Array.isArray(val)) {\r\n const result: unknown[] = []\r\n cache.set(val, result)\r\n for (let i = 0; i < val.length; i++) {\r\n result[i] = cloneInternal(val[i], depth + 1)\r\n }\r\n return result as U\r\n }\r\n\r\n // 处理普通对象\r\n if (isPlainObject(val)) {\r\n const result: Record<string | symbol, unknown> = {}\r\n cache.set(val, result)\r\n\r\n // 克隆字符串键\r\n const keys = Object.keys(val)\r\n for (const key of keys) {\r\n result[key] = cloneInternal(\r\n (val as Record<string, unknown>)[key],\r\n depth + 1\r\n )\r\n }\r\n\r\n // 克隆 Symbol 键\r\n if (cloneSymbols) {\r\n const symbolKeys = Object.getOwnPropertySymbols(val)\r\n for (const sym of symbolKeys) {\r\n result[sym] = cloneInternal(\r\n (val as Record<symbol, unknown>)[sym],\r\n depth + 1\r\n )\r\n }\r\n }\r\n\r\n return result as U\r\n }\r\n\r\n // 其他对象类型(如自定义类实例)直接返回\r\n return val\r\n }\r\n\r\n return cloneInternal(value, 0)\r\n}\r\n\r\n/**\r\n * 浅拷贝\r\n *\r\n * @template T - 值类型\r\n * @param value - 要拷贝的值\r\n * @returns 拷贝后的值\r\n *\r\n * @example\r\n * ```typescript\r\n * const arr = [1, 2, { a: 3 }]\r\n * const cloned = shallowClone(arr)\r\n * cloned[2].a = 4\r\n * console.log(arr[2].a) // 4 (浅拷贝,嵌套对象共享引用)\r\n * ```\r\n */\r\nexport function shallowClone<T>(value: T): T {\r\n if (value === null || value === undefined) return value\r\n if (typeof value !== 'object') return value\r\n\r\n if (Array.isArray(value)) {\r\n return [...value] as T\r\n }\r\n\r\n if (value instanceof Map) {\r\n return new Map(value) as T\r\n }\r\n\r\n if (value instanceof Set) {\r\n return new Set(value) as T\r\n }\r\n\r\n if (value instanceof Date) {\r\n return new Date(value.getTime()) as T\r\n }\r\n\r\n return { ...value }\r\n}\r\n\r\n/**\r\n * 深度合并配置选项\r\n */\r\nexport interface DeepMergeOptions {\r\n /** 数组合并策略:'replace' 替换 | 'concat' 连接 | 'merge' 按索引合并 */\r\n arrayStrategy?: 'replace' | 'concat' | 'merge'\r\n /** 是否克隆源对象(默认 true) */\r\n clone?: boolean\r\n /** 最大深度 */\r\n maxDepth?: number\r\n}\r\n\r\n/**\r\n * 深度合并对象\r\n *\r\n * 将多个源对象深度合并到目标对象\r\n *\r\n * @template T - 目标对象类型\r\n * @param target - 目标对象\r\n * @param sources - 源对象列表\r\n * @returns 合并后的对象\r\n *\r\n * @example\r\n * ```typescript\r\n * const target = { a: 1, b: { c: 2 } }\r\n * const source = { b: { d: 3 }, e: 4 }\r\n * const result = deepMerge(target, source)\r\n * // { a: 1, b: { c: 2, d: 3 }, e: 4 }\r\n * ```\r\n */\r\nexport function deepMerge<T extends Record<string, unknown>>(\r\n target: T,\r\n ...sources: Array<Partial<T>>\r\n): T {\r\n return deepMergeWithOptions(target, {}, ...sources)\r\n}\r\n\r\n/**\r\n * 带配置的深度合并\r\n *\r\n * @template T - 目标对象类型\r\n * @param target - 目标对象\r\n * @param options - 合并配置\r\n * @param sources - 源对象列表\r\n * @returns 合并后的对象\r\n */\r\nexport function deepMergeWithOptions<T extends Record<string, unknown>>(\r\n target: T,\r\n options: DeepMergeOptions,\r\n ...sources: Array<Partial<T>>\r\n): T {\r\n const {\r\n arrayStrategy = 'replace',\r\n clone = true,\r\n maxDepth = Infinity,\r\n } = options\r\n\r\n function mergeInternal(\r\n targetObj: Record<string, unknown>,\r\n sourceObj: Record<string, unknown>,\r\n depth: number\r\n ): Record<string, unknown> {\r\n if (depth > maxDepth) {\r\n return targetObj\r\n }\r\n\r\n for (const key of Object.keys(sourceObj)) {\r\n const sourceValue = sourceObj[key]\r\n const targetValue = targetObj[key]\r\n\r\n // 处理数组\r\n if (Array.isArray(sourceValue)) {\r\n if (arrayStrategy === 'concat' && Array.isArray(targetValue)) {\r\n targetObj[key] = [...targetValue, ...sourceValue]\r\n } else if (arrayStrategy === 'merge' && Array.isArray(targetValue)) {\r\n const result = [...targetValue]\r\n sourceValue.forEach((item, index) => {\r\n if (isPlainObject(item) && isPlainObject(result[index])) {\r\n result[index] = mergeInternal(\r\n result[index] as Record<string, unknown>,\r\n item,\r\n depth + 1\r\n )\r\n } else {\r\n result[index] = clone ? deepClone(item) : item\r\n }\r\n })\r\n targetObj[key] = result\r\n } else {\r\n targetObj[key] = clone ? deepClone(sourceValue) : sourceValue\r\n }\r\n }\r\n // 处理普通对象\r\n else if (isPlainObject(sourceValue)) {\r\n if (isPlainObject(targetValue)) {\r\n targetObj[key] = mergeInternal(\r\n targetValue as Record<string, unknown>,\r\n sourceValue,\r\n depth + 1\r\n )\r\n } else {\r\n targetObj[key] = clone ? deepClone(sourceValue) : sourceValue\r\n }\r\n }\r\n // 其他类型直接赋值\r\n else {\r\n targetObj[key] =\r\n clone && isObject(sourceValue) ? deepClone(sourceValue) : sourceValue\r\n }\r\n }\r\n\r\n return targetObj\r\n }\r\n\r\n let result = target\r\n\r\n for (const source of sources) {\r\n if (source !== null && source !== undefined) {\r\n result = mergeInternal(result, source, 0) as T\r\n }\r\n }\r\n\r\n return result\r\n}\r\n\r\n/**\r\n * 比较两个值是否深度相等\r\n *\r\n * @param a - 第一个值\r\n * @param b - 第二个值\r\n * @returns 是否相等\r\n *\r\n * @example\r\n * ```typescript\r\n * deepEqual({ a: 1 }, { a: 1 }) // true\r\n * deepEqual([1, 2], [1, 2]) // true\r\n * deepEqual({ a: { b: 1 } }, { a: { b: 2 } }) // false\r\n * ```\r\n */\r\nexport function deepEqual(a: unknown, b: unknown): boolean {\r\n // 严格相等\r\n if (a === b) return true\r\n\r\n // null/undefined 检查\r\n if (a === null || b === null || a === undefined || b === undefined) {\r\n return a === b\r\n }\r\n\r\n // 类型不同\r\n if (typeof a !== typeof b) return false\r\n\r\n // 基础类型\r\n if (typeof a !== 'object') return a === b\r\n\r\n // 日期比较\r\n if (a instanceof Date && b instanceof Date) {\r\n return a.getTime() === b.getTime()\r\n }\r\n\r\n // 正则比较\r\n if (a instanceof RegExp && b instanceof RegExp) {\r\n return a.source === b.source && a.flags === b.flags\r\n }\r\n\r\n // Map 比较\r\n if (a instanceof Map && b instanceof Map) {\r\n if (a.size !== b.size) return false\r\n for (const [key, value] of a) {\r\n if (!b.has(key) || !deepEqual(value, b.get(key))) {\r\n return false\r\n }\r\n }\r\n return true\r\n }\r\n\r\n // Set 比较\r\n if (a instanceof Set && b instanceof Set) {\r\n if (a.size !== b.size) return false\r\n for (const value of a) {\r\n if (!b.has(value)) return false\r\n }\r\n return true\r\n }\r\n\r\n // 数组比较\r\n if (Array.isArray(a) && Array.isArray(b)) {\r\n if (a.length !== b.length) return false\r\n for (let i = 0; i < a.length; i++) {\r\n if (!deepEqual(a[i], b[i])) return false\r\n }\r\n return true\r\n }\r\n\r\n // 对象比较\r\n if (isPlainObject(a) && isPlainObject(b)) {\r\n const keysA = Object.keys(a)\r\n const keysB = Object.keys(b)\r\n if (keysA.length !== keysB.length) return false\r\n for (const key of keysA) {\r\n if (!hasOwnKey(b, key)) return false\r\n if (!deepEqual(a[key], b[key])) return false\r\n }\r\n return true\r\n }\r\n\r\n return false\r\n}\r\n\r\n/**\r\n * 冻结对象(深度)\r\n *\r\n * @template T - 对象类型\r\n * @param obj - 要冻结的对象\r\n * @returns 冻结后的对象\r\n */\r\nexport function deepFreeze<T extends object>(obj: T): Readonly<T> {\r\n const propNames = Object.getOwnPropertyNames(obj)\r\n\r\n for (const name of propNames) {\r\n const value = (obj as Record<string, unknown>)[name]\r\n if (value && typeof value === 'object') {\r\n deepFreeze(value)\r\n }\r\n }\r\n\r\n return Object.freeze(obj)\r\n}\r\n","/**\r\n * 状态选择器工具\r\n *\r\n * 提供高性能的状态选择器和路径操作工具\r\n * @module utils/selector\r\n */\r\n\r\nimport type { Selector, StateTree } from '../types'\r\n\r\nconst ARRAY_INDEX_RE = /^\\d+$/\r\n\r\n/**\r\n * 选择器相等性比较函数类型\r\n */\r\nexport type SelectorEqualityFn<R> = (a: R, b: R) => boolean\r\n\r\n/**\r\n * 记忆化选择器配置选项\r\n */\r\nexport interface MemoizedSelectorOptions<R> {\r\n /** 相等性比较函数 */\r\n equalityFn?: SelectorEqualityFn<R>\r\n /** 最大缓存大小(默认 1) */\r\n maxSize?: number\r\n /** 是否在开发模式下记录缓存命中率 */\r\n trackHitRate?: boolean\r\n}\r\n\r\n/**\r\n * 创建记忆化选择器\r\n *\r\n * 基本的记忆化选择器,只缓存最后一次结果\r\n *\r\n * @template S - 状态类型\r\n * @template R - 返回值类型\r\n * @param selector - 选择器函数\r\n * @param equalityFn - 相等性比较函数(默认使用 Object.is)\r\n * @returns 记忆化的选择器\r\n *\r\n * @example\r\n * ```typescript\r\n * const selectTodos = createSelector(\r\n * (state: AppState) => state.todos,\r\n * )\r\n *\r\n * const selectCompletedTodos = createSelector(\r\n * (state: AppState) => state.todos.filter(t => t.completed),\r\n * (a, b) => a.length === b.length && a.every((v, i) => v === b[i])\r\n * )\r\n * ```\r\n */\r\nexport function createSelector<S extends StateTree, R>(\r\n selector: Selector<S, R>,\r\n equalityFn: SelectorEqualityFn<R> = Object.is\r\n): Selector<S, R> {\r\n let lastState: S | undefined\r\n let lastResult: R | undefined\r\n let initialized = false\r\n\r\n return (state: S): R => {\r\n // 如果状态引用未变,直接返回缓存结果\r\n if (initialized && lastState === state) {\r\n return lastResult as R\r\n }\r\n\r\n const result = selector(state)\r\n\r\n // 检查结果是否改变\r\n if (!initialized || !equalityFn(result, lastResult as R)) {\r\n lastResult = result\r\n }\r\n\r\n lastState = state\r\n initialized = true\r\n\r\n return lastResult as R\r\n }\r\n}\r\n\r\n/**\r\n * 创建带依赖的选择器\r\n *\r\n * 类似 reselect 的实现,支持多个输入选择器\r\n *\r\n * @template S - 状态类型\r\n * @template Deps - 依赖结果类型\r\n * @template R - 返回值类型\r\n * @param dependencies - 依赖选择器数组\r\n * @param combiner - 组合函数\r\n * @param options - 配置选项\r\n * @returns 记忆化的选择器\r\n *\r\n * @example\r\n * ```typescript\r\n * const selectVisibleTodos = createSelectorWithDeps(\r\n * [\r\n * (state) => state.todos,\r\n * (state) => state.visibilityFilter,\r\n * ],\r\n * (todos, filter) => {\r\n * switch (filter) {\r\n * case 'SHOW_COMPLETED': return todos.filter(t => t.completed)\r\n * case 'SHOW_ACTIVE': return todos.filter(t => !t.completed)\r\n * default: return todos\r\n * }\r\n * }\r\n * )\r\n * ```\r\n */\r\nexport function createSelectorWithDeps<\r\n S extends StateTree,\r\n Deps extends unknown[],\r\n R,\r\n>(\r\n dependencies: { [K in keyof Deps]: Selector<S, Deps[K]> },\r\n combiner: (...args: Deps) => R,\r\n options: MemoizedSelectorOptions<R> = {}\r\n): Selector<S, R> {\r\n const { equalityFn = Object.is, trackHitRate = false } = options\r\n\r\n let lastDeps: Deps | undefined\r\n let lastResult: R | undefined\r\n let initialized = false\r\n\r\n // 缓存统计(仅开发模式)\r\n let hits = 0\r\n let calls = 0\r\n\r\n const selector = (state: S): R => {\r\n if (trackHitRate) calls++\r\n\r\n // 计算所有依赖的结果\r\n const deps = dependencies.map(dep => dep(state)) as Deps\r\n\r\n // 检查依赖是否改变\r\n if (initialized && lastDeps) {\r\n let changed = false\r\n for (let i = 0; i < deps.length; i++) {\r\n if (!Object.is(deps[i], lastDeps[i])) {\r\n changed = true\r\n break\r\n }\r\n }\r\n\r\n if (!changed) {\r\n if (trackHitRate) hits++\r\n return lastResult as R\r\n }\r\n }\r\n\r\n // 计算新结果\r\n const result = combiner(...deps)\r\n\r\n // 检查结果是否改变\r\n if (!initialized || !equalityFn(result, lastResult as R)) {\r\n lastResult = result\r\n }\r\n\r\n lastDeps = deps\r\n initialized = true\r\n\r\n return lastResult as R\r\n }\r\n\r\n // 添加缓存统计方法\r\n if (trackHitRate) {\r\n ;(selector as Selector<S, R> & { getHitRate: () => number }).getHitRate =\r\n () => {\r\n return calls > 0 ? hits / calls : 0\r\n }\r\n }\r\n\r\n return selector\r\n}\r\n\r\n/**\r\n * 组合多个选择器\r\n *\r\n * 简单的选择器组合,不带记忆化\r\n *\r\n * @template S - 状态类型\r\n * @template R - 结果类型数组\r\n * @template C - 组合结果类型\r\n * @param selectors - 选择器数组\r\n * @param combiner - 组合函数\r\n * @returns 组合后的选择器\r\n *\r\n * @example\r\n * ```typescript\r\n * const selectUserAndTodos = combineSelectors(\r\n * [\r\n * (state) => state.user,\r\n * (state) => state.todos,\r\n * ],\r\n * (user, todos) => ({ user, todos })\r\n * )\r\n * ```\r\n */\r\nexport function combineSelectors<S extends StateTree, R extends unknown[], C>(\r\n selectors: { [K in keyof R]: Selector<S, R[K]> },\r\n combiner: (...results: R) => C\r\n): Selector<S, C> {\r\n return (state: S): C => {\r\n const results = selectors.map(selector => selector(state)) as R\r\n return combiner(...results)\r\n }\r\n}\r\n\r\n/**\r\n * 创建带高级缓存的选择器\r\n *\r\n * 支持多个缓存条目,使用 LRU 策略\r\n *\r\n * @template S - 状态类型\r\n * @template R - 返回值类型\r\n * @param selector - 选择器函数\r\n * @param options - 配置选项\r\n * @returns 带缓存的选择器\r\n *\r\n * @example\r\n * ```typescript\r\n * const selectFilteredItems = createCachedSelector(\r\n * (state, filter) => state.items.filter(item => item.type === filter),\r\n * { maxSize: 5 }\r\n * )\r\n * ```\r\n */\r\nexport function createCachedSelector<S extends StateTree, R>(\r\n selector: Selector<S, R>,\r\n options: MemoizedSelectorOptions<R> = {}\r\n): Selector<S, R> & { clearCache: () => void; getCacheSize: () => number } {\r\n const { maxSize = 10 } = options\r\n\r\n // 使用 Map 保持插入顺序(LRU 策略)\r\n const cache = new Map<S, R>()\r\n\r\n const memoizedSelector = (state: S): R => {\r\n // 检查缓存\r\n if (cache.has(state)) {\r\n const cached = cache.get(state) as R\r\n // 移到末尾(最近使用)\r\n cache.delete(state)\r\n cache.set(state, cached)\r\n return cached\r\n }\r\n\r\n // 计算结果\r\n const result = selector(state)\r\n\r\n // 管理缓存大小(LRU 淘汰)\r\n if (cache.size >= maxSize) {\r\n const firstKey = cache.keys().next().value\r\n if (firstKey !== undefined) {\r\n cache.delete(firstKey)\r\n }\r\n }\r\n\r\n cache.set(state, result)\r\n return result\r\n }\r\n\r\n // 添加缓存管理方法\r\n memoizedSelector.clearCache = () => cache.clear()\r\n memoizedSelector.getCacheSize = () => cache.size\r\n\r\n return memoizedSelector\r\n}\r\n\r\n/**\r\n * 创建记忆化选择器(别名,同 createSelector)\r\n *\r\n * @template S - 状态类型\r\n * @template R - 返回值类型\r\n * @param selector - 选择器函数\r\n * @param options - 配置选项\r\n * @returns 记忆化的选择器\r\n */\r\nexport function createMemoizedSelector<S extends StateTree, R>(\r\n selector: Selector<S, R>,\r\n options: MemoizedSelectorOptions<R> = {}\r\n): Selector<S, R> {\r\n return createSelector(selector, options.equalityFn)\r\n}\r\n\r\n/**\r\n * 获取嵌套对象的值\r\n *\r\n * 支持点表示法和数组索引\r\n *\r\n * @template T - 返回值类型\r\n * @param obj - 对象\r\n * @param path - 路径(支持 'a.b.c' 或 'a[0].b')\r\n * @param defaultValue - 默认值(当路径不存在时返回)\r\n * @returns 值\r\n *\r\n * @example\r\n * ```typescript\r\n * const value = getByPath({ a: { b: { c: 1 } } }, 'a.b.c')\r\n * // value: 1\r\n *\r\n * const arr = getByPath({ items: [{ name: 'test' }] }, 'items[0].name')\r\n * // arr: 'test'\r\n *\r\n * const missing = getByPath({ a: 1 }, 'b.c', 'default')\r\n * // missing: 'default'\r\n * ```\r\n */\r\nexport function getByPath<T = unknown>(\r\n obj: unknown,\r\n path: string,\r\n defaultValue?: T\r\n): T | undefined {\r\n if (!path || path.length === 0) {\r\n return obj as T\r\n }\r\n\r\n // 解析路径(支持 'a.b.c' 和 'a[0].b')\r\n const keys = path\r\n .replace(/\\[([^\\]]+)\\]/g, '.$1') // 将 [0] 转换为 .0\r\n .split('.')\r\n .filter(Boolean)\r\n\r\n let result: unknown = obj\r\n\r\n for (const key of keys) {\r\n if (result === null || result === undefined) {\r\n return defaultValue\r\n }\r\n\r\n if (typeof result !== 'object') {\r\n return defaultValue\r\n }\r\n\r\n result = (result as Record<string, unknown>)[key]\r\n }\r\n\r\n return result === undefined ? defaultValue : (result as T)\r\n}\r\n\r\n/**\r\n * 设置嵌套对象的值\r\n *\r\n * 支持自动创建中间路径\r\n *\r\n * @param obj - 对象\r\n * @param path - 路径\r\n * @param value - 值\r\n * @returns 是否成功\r\n *\r\n * @example\r\n * ```typescript\r\n * const obj = {}\r\n * setByPath(obj, 'a.b.c', 1)\r\n * // obj: { a: { b: { c: 1 } } }\r\n *\r\n * setByPath(obj, 'items[0].name', 'test')\r\n * // obj: { a: { b: { c: 1 } }, items: [{ name: 'test' }] }\r\n * ```\r\n */\r\nexport function setByPath(\r\n obj: Record<string, unknown>,\r\n path: string,\r\n value: unknown\r\n): boolean {\r\n if (!path || path.length === 0) {\r\n return false\r\n }\r\n\r\n // 解析路径\r\n const keys = path\r\n .replace(/\\[([^\\]]+)\\]/g, '.$1')\r\n .split('.')\r\n .filter(Boolean)\r\n\r\n let current: Record<string, unknown> = obj\r\n\r\n for (let i = 0; i < keys.length - 1; i++) {\r\n const key = keys[i]\r\n const nextKey = keys[i + 1] ?? ''\r\n\r\n const nextValue = current[key] ?? (ARRAY_INDEX_RE.test(nextKey) ? [] : {})\r\n // 根据下一个键决定创建对象还是数组\r\n current[key] = nextValue\r\n current = current[key] as Record<string, unknown>\r\n }\r\n\r\n const lastKey = keys[keys.length - 1]\r\n current[lastKey] = value\r\n return true\r\n}\r\n\r\n/**\r\n * 删除嵌套对象的值\r\n *\r\n * @param obj - 对象\r\n * @param path - 路径\r\n * @returns 是否成功删除\r\n *\r\n * @example\r\n * ```typescript\r\n * const obj = { a: { b: { c: 1 } } }\r\n * deleteByPath(obj, 'a.b.c')\r\n * // obj: { a: { b: {} } }\r\n * ```\r\n */\r\nexport function deleteByPath(\r\n obj: Record<string, unknown>,\r\n path: string\r\n): boolean {\r\n if (!path || path.length === 0) {\r\n return false\r\n }\r\n\r\n const keys = path\r\n .replace(/\\[([^\\]]+)\\]/g, '.$1')\r\n .split('.')\r\n .filter(Boolean)\r\n\r\n let current: Record<string, unknown> = obj\r\n\r\n for (let i = 0; i < keys.length - 1; i++) {\r\n const key = keys[i]\r\n if (current[key] === undefined || current[key] === null) {\r\n return false\r\n }\r\n current = current[key] as Record<string, unknown>\r\n }\r\n\r\n const lastKey = keys[keys.length - 1]\r\n if (lastKey in current) {\r\n if (Array.isArray(current)) {\r\n const index = Number.parseInt(lastKey, 10)\r\n if (!Number.isNaN(index)) {\r\n current.splice(index, 1)\r\n return true\r\n }\r\n }\r\n delete current[lastKey]\r\n return true\r\n }\r\n\r\n return false\r\n}\r\n\r\n/**\r\n * 检查嵌套对象中是否存在指定路径\r\n *\r\n * @param obj - 对象\r\n * @param path - 路径\r\n * @returns 是否存在\r\n *\r\n * @example\r\n * ```typescript\r\n * hasPath({ a: { b: 1 } }, 'a.b') // true\r\n * hasPath({ a: { b: 1 } }, 'a.c') // false\r\n * ```\r\n */\r\nexport function hasPath(obj: unknown, path: string): boolean {\r\n if (!path || path.length === 0) {\r\n return true\r\n }\r\n\r\n const keys = path\r\n .replace(/\\[([^\\]]+)\\]/g, '.$1')\r\n .split('.')\r\n .filter(Boolean)\r\n\r\n let current: unknown = obj\r\n\r\n for (const key of keys) {\r\n if (current === null || current === undefined) {\r\n return false\r\n }\r\n\r\n if (typeof current !== 'object') {\r\n return false\r\n }\r\n\r\n if (!(key in (current as Record<string, unknown>))) {\r\n return false\r\n }\r\n\r\n current = (current as Record<string, unknown>)[key]\r\n }\r\n\r\n return true\r\n}\r\n","/**\r\n * 批量更新管理器\r\n *\r\n * 用于优化多个状态更新的性能\r\n * @module core/batch-manager\r\n */\r\n\r\nimport type { BatchManager, StoreId, Unsubscribe } from '../types'\r\n\r\n/**\r\n * 创建批量更新管理器\r\n *\r\n * @param onFlush - 刷新回调,接收所有待更新的 Store ID\r\n * @returns 批量更新管理器实例\r\n *\r\n * @example\r\n * ```typescript\r\n * const batchManager = createBatchManager((storeIds) => {\r\n * storeIds.forEach(id => {\r\n * // 通知订阅者更新\r\n * notifySubscribers(id)\r\n * })\r\n * })\r\n *\r\n * // 批量更新\r\n * batchManager.batch(() => {\r\n * store1.count++\r\n * store2.name = 'new name'\r\n * })\r\n * ```\r\n */\r\nexport function createBatchManager(\r\n onFlush?: (storeIds: Set<StoreId>) => void\r\n): BatchManager {\r\n /** 批处理嵌套深度,0 表示不在批处理上下文。 */\r\n let batchDepth = 0\r\n\r\n /** 批处理完成监听器,允许 Store Runtime 延迟一次通知 */\r\n const flushListeners = new Set<(storeIds: Set<StoreId>) => void>()\r\n\r\n /** 待更新的 Store ID 集合 */\r\n const pendingStores = new Set<StoreId>()\r\n\r\n /**\r\n * 刷新待更新的 Store\r\n */\r\n const flush = (): void => {\r\n if (pendingStores.size > 0) {\r\n const stores = new Set(pendingStores)\r\n pendingStores.clear()\r\n onFlush?.(stores)\r\n flushListeners.forEach(listener => {\r\n try {\r\n listener(stores)\r\n } catch (error) {\r\n console.error('[Batch] flush listener failed:', error)\r\n }\r\n })\r\n }\r\n }\r\n\r\n /**\r\n * 开始批量更新\r\n */\r\n const start = (): void => {\r\n batchDepth++\r\n }\r\n\r\n /**\r\n * 结束批量更新\r\n */\r\n const end = (): void => {\r\n if (batchDepth === 0) {\r\n return\r\n }\r\n\r\n batchDepth--\r\n if (batchDepth === 0) {\r\n flush()\r\n }\r\n }\r\n\r\n /**\r\n * 标记 Store 需要更新\r\n */\r\n const markDirty = (storeId: StoreId): void => {\r\n pendingStores.add(storeId)\r\n\r\n // 如果不在批量更新中,立即刷新\r\n if (batchDepth === 0) {\r\n flush()\r\n }\r\n }\r\n\r\n /**\r\n * 在批量上下文中执行\r\n */\r\n const batch = <T>(fn: () => T): T => {\r\n start()\r\n try {\r\n return fn()\r\n } finally {\r\n end()\r\n }\r\n }\r\n\r\n /**\r\n * 是否正在批量更新\r\n */\r\n const isBatching = (): boolean => batchDepth > 0\r\n\r\n const onFlushListener = (\r\n listener: (storeIds: Set<StoreId>) => void\r\n ): Unsubscribe => {\r\n flushListeners.add(listener)\r\n return () => flushListeners.delete(listener)\r\n }\r\n\r\n return {\r\n start,\r\n end,\r\n markDirty,\r\n batch,\r\n isBatching,\r\n onFlush: onFlushListener,\r\n }\r\n}\r\n\r\n/**\r\n * 全局批量更新管理器\r\n */\r\nlet globalBatchManager: BatchManager | null = null\r\n\r\n/**\r\n * 获取全局批量更新管理器\r\n */\r\nexport function getGlobalBatchManager(): BatchManager {\r\n if (!globalBatchManager) {\r\n globalBatchManager = createBatchManager()\r\n }\r\n return globalBatchManager\r\n}\r\n\r\n/**\r\n * 设置全局批量更新管理器\r\n */\r\nexport function setGlobalBatchManager(manager: BatchManager): void {\r\n globalBatchManager = manager\r\n}\r\n\r\n/**\r\n * 批量更新辅助函数\r\n *\r\n * @param fn - 执行函数\r\n * @returns 执行结果\r\n */\r\nexport function batch<T>(fn: () => T): T {\r\n return getGlobalBatchManager().batch(fn)\r\n}\r\n","/**\r\n * 事件总线实现\r\n *\r\n * 提供事件的发布/订阅功能\r\n * @module core/event-bus\r\n */\r\n\r\nimport type {\r\n EventBus,\r\n EventData,\r\n EventListener,\r\n EventType,\r\n Unsubscribe,\r\n} from '../types'\r\n\r\n/**\r\n * 创建事件总线\r\n *\r\n * @returns 事件总线实例\r\n *\r\n * @example\r\n * ```typescript\r\n * const bus = createEventBus()\r\n *\r\n * // 监听事件\r\n * const unsubscribe = bus.on('state:changed', (data) => {\r\n * console.log('状态变化:', data)\r\n * })\r\n *\r\n * // 发送事件\r\n * bus.emit('state:changed', { storeId: 'counter', newValue: 1 })\r\n *\r\n * // 取消监听\r\n * unsubscribe()\r\n * ```\r\n */\r\nexport function createEventBus(): EventBus {\r\n /** 事件监听器映射 */\r\n const listeners = new Map<EventType | '*', Set<EventListener>>()\r\n\r\n /**\r\n * 获取或创建监听器集合\r\n */\r\n const getListeners = (type: EventType | '*'): Set<EventListener> => {\r\n let set = listeners.get(type)\r\n if (!set) {\r\n set = new Set()\r\n listeners.set(type, set)\r\n }\r\n return set\r\n }\r\n\r\n /**\r\n * 监听事件\r\n */\r\n const on = (type: EventType | '*', listener: EventListener): Unsubscribe => {\r\n const set = getListeners(type)\r\n set.add(listener)\r\n\r\n return () => {\r\n set.delete(listener)\r\n if (set.size === 0) {\r\n listeners.delete(type)\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * 取消监听\r\n */\r\n const off = (type: EventType | '*', listener?: EventListener): void => {\r\n if (listener) {\r\n const set = listeners.get(type)\r\n if (set) {\r\n set.delete(listener)\r\n if (set.size === 0) {\r\n listeners.delete(type)\r\n }\r\n }\r\n } else {\r\n listeners.delete(type)\r\n }\r\n }\r\n\r\n /**\r\n * 监听一次\r\n */\r\n const once = (type: EventType, listener: EventListener): Unsubscribe => {\r\n const wrappedListener: EventListener = data => {\r\n listener(data)\r\n off(type, wrappedListener)\r\n }\r\n return on(type, wrappedListener)\r\n }\r\n\r\n /**\r\n * 发送事件\r\n */\r\n const emit = (type: EventType, payload?: unknown): void => {\r\n const data: EventData = {\r\n type,\r\n payload,\r\n timestamp: Date.now(),\r\n }\r\n\r\n // 触发特定类型的监听器\r\n const typeListeners = listeners.get(type)\r\n if (typeListeners) {\r\n typeListeners.forEach(listener => listener(data))\r\n }\r\n\r\n // 触发通配符监听器\r\n const wildcardListeners = listeners.get('*')\r\n if (wildcardListeners) {\r\n wildcardListeners.forEach(listener => listener(data))\r\n }\r\n }\r\n\r\n /**\r\n * 清空所有监听器\r\n */\r\n const clear = (): void => {\r\n listeners.clear()\r\n }\r\n\r\n return {\r\n on,\r\n once,\r\n off,\r\n emit,\r\n clear,\r\n }\r\n}\r\n\r\n/**\r\n * 全局事件总线实例\r\n */\r\nexport const globalEventBus = createEventBus()\r\n","/** Framework-independent Store runtime. */\n\nimport type {\n ActionContext,\n ActionSubscriber,\n BatchManager,\n MiddlewareManager,\n PluginManager,\n StateMutation,\n StateSubscriber,\n StateTree,\n StoreActions,\n StoreDefinition,\n StoreGetters,\n StoreId,\n StoreInstance,\n StoreOptions,\n SubscribeOptions,\n Unsubscribe,\n} from '../types'\nimport { getGlobalMiddlewareManager } from '../middleware/middleware-manager'\nimport { getGlobalPluginManager } from '../plugins/plugin-manager'\nimport { deepClone } from '../utils'\nimport { getGlobalBatchManager } from './batch-manager'\nimport { globalEventBus } from './event-bus'\nimport { createPubSub } from './pub-sub'\n\ntype ActionCallback = (value: unknown) => void | Promise<void>\n\nfunction isPromiseLike(value: unknown): value is Promise<unknown> {\n return !!value && typeof (value as { then?: unknown }).then === 'function'\n}\n\nasync function runCallbacks(\n callbacks: ActionCallback[],\n value: unknown\n): Promise<void> {\n for (const callback of callbacks) {\n await callback(value)\n }\n}\n\n/**\n * Base Store implementation.\n *\n * State changes are built on a candidate state. Middleware can reject the\n * candidate before it is committed, while stores without middleware retain\n * synchronous patch semantics.\n */\nexport class BaseStore<\n Id extends StoreId = StoreId,\n S extends StateTree = StateTree,\n G extends StoreGetters<S> = StoreGetters<S>,\n A extends StoreActions = StoreActions,\n> implements StoreInstance<Id, S, G, A> {\n readonly $id: Id\n readonly getters: { [K in keyof G]: ReturnType<G[K]> }\n readonly actions: A\n\n private readonly stateSubscribers = createPubSub<{\n mutation: StateMutation<S>\n state: S\n }>()\n private readonly actionSubscribers = createPubSub<ActionContext<A>>()\n private readonly initialStateFactory: () => S\n private readonly middlewareManager: MiddlewareManager\n private readonly pluginManager: PluginManager\n private readonly batchManager: BatchManager\n private pendingBatchMutation: StateMutation<S> | null = null\n private stopBatchFlush: Unsubscribe | undefined\n private mutationQueue: Promise<void> = Promise.resolve()\n private pendingMutations = 0\n private _state: S\n private disposed = false\n\n constructor(\n definition: StoreDefinition<Id, S, G, A>,\n options: StoreOptions = {}\n ) {\n this.$id = definition.id\n this.initialStateFactory = definition.state\n this._state = definition.state()\n this.middlewareManager = options.middleware ?? getGlobalMiddlewareManager()\n this.pluginManager = options.plugins ?? getGlobalPluginManager()\n this.batchManager = options.batch ?? getGlobalBatchManager()\n this.getters = this.createGetters((definition.getters || {}) as G)\n this.actions = this.createActions((definition.actions || {}) as A)\n\n this.stopBatchFlush = this.batchManager.onFlush?.(storeIds => {\n if (!storeIds.has(this.$id) || !this.pendingBatchMutation) {\n return\n }\n\n const mutation = this.pendingBatchMutation\n this.pendingBatchMutation = null\n this.publishStateChange(mutation)\n })\n\n globalEventBus.emit('store:created', { storeId: this.$id })\n this.notifyPluginStoreCreated()\n }\n\n get $state(): S {\n return this._state\n }\n\n set $state(newState: S) {\n this.checkDisposed()\n const nextState = deepClone(newState)\n const operation = () => this.runStateMutation(nextState, newState)\n void this.scheduleMutation(operation).catch((error: unknown) => {\n console.error(`[Store] Failed to replace state for \"${this.$id}\":`, error)\n })\n }\n\n $reset(): void {\n this.checkDisposed()\n void this.scheduleMutation(() => this.runStateMutation()).catch(\n (error: unknown) => {\n console.error(`[Store] Failed to reset \"${this.$id}\":`, error)\n }\n )\n }\n\n $patch(partialState: Partial<S> | ((state: S) => void)): void {\n this.checkDisposed()\n const patch =\n typeof partialState === 'function'\n ? partialState\n : deepClone(partialState)\n void this.scheduleMutation(() => this.runPatchMutation(patch)).catch(\n (error: unknown) => {\n console.error(`[Store] Failed to patch \"${this.$id}\":`, error)\n }\n )\n }\n\n async $patchAsync(\n partialState: Partial<S> | ((state: S) => void)\n ): Promise<void> {\n this.checkDisposed()\n const patch =\n typeof partialState === 'function'\n ? partialState\n : deepClone(partialState)\n await this.scheduleMutation(() => this.runPatchMutation(patch))\n }\n\n $subscribe(\n callback: StateSubscriber<S>,\n options: SubscribeOptions = {}\n ): Unsubscribe {\n this.checkDisposed()\n const unsubscribe = this.stateSubscribers.subscribe(\n ({ mutation, state }) => callback(mutation, state),\n { immediate: options.immediate }\n )\n\n if (options.immediate) {\n try {\n callback({ type: 'direct', storeId: this.$id }, deepClone(this._state))\n } catch (error) {\n console.error('[Store] immediate subscriber failed:', error)\n }\n }\n\n return unsubscribe\n }\n\n $onAction(callback: ActionSubscriber<A>): Unsubscribe {\n this.checkDisposed()\n return this.actionSubscribers.subscribe(callback)\n }\n\n $dispose(): void {\n if (this.disposed) return\n\n this.disposed = true\n this.stopBatchFlush?.()\n this.stopBatchFlush = undefined\n this.mutationQueue = Promise.resolve()\n this.pendingMutations = 0\n this.stateSubscribers.clear()\n this.actionSubscribers.clear()\n this.notifyPluginStoreDisposed()\n globalEventBus.emit('store:disposed', { storeId: this.$id })\n }\n\n protected notifyStateChange(mutation: StateMutation<S>): void {\n this.publishStateChange(mutation)\n }\n\n private publishStateChange(mutation: StateMutation<S>): void {\n const stateSnapshot = deepClone(this._state)\n this.stateSubscribers.publish({ mutation, state: stateSnapshot })\n globalEventBus.emit('state:changed', {\n storeId: this.$id,\n state: stateSnapshot,\n mutation,\n })\n }\n\n private async runMutation(\n candidate: S,\n mutation: StateMutation<S>,\n payload: unknown,\n previousState: S\n ): Promise<void> {\n this.checkDisposed()\n let committed = false\n const commit = (): void => {\n if (committed || this.disposed) return\n\n committed = true\n this._state = candidate\n this.notifyPluginStateChange(candidate, previousState)\n\n if (this.batchManager.isBatching() && this.batchManager.onFlush) {\n this.pendingBatchMutation = this.pendingBatchMutation\n ? { ...mutation, oldState: this.pendingBatchMutation.oldState }\n : mutation\n this.batchManager.markDirty(this.$id)\n } else {\n this.publishStateChange(mutation)\n }\n }\n\n const middlewares = this.middlewareManager.getAll()\n if (middlewares.length === 0) {\n commit()\n return\n }\n\n await this.middlewareManager.execute({\n storeId: this.$id,\n state: candidate,\n type: mutation.type === 'direct' ? 'state:reset' : 'state:patch',\n payload,\n meta: {\n candidateState: candidate,\n previousState,\n commit,\n },\n })\n commit()\n }\n\n private runStateMutation(nextState?: S, payload?: unknown): Promise<void> {\n this.checkDisposed()\n const previousState = deepClone(this._state)\n const mutation: StateMutation<S> = {\n type: 'direct',\n storeId: this.$id,\n oldState: previousState,\n }\n return this.runMutation(\n deepClone(nextState ?? this.initialStateFactory()),\n mutation,\n payload,\n previousState\n )\n }\n\n private runPatchMutation(\n partialState: Partial<S> | ((state: S) => void)\n ): Promise<void> {\n this.checkDisposed()\n const previousState = deepClone(this._state)\n const candidate = deepClone(this._state)\n const mutation: StateMutation<S> =\n typeof partialState === 'function'\n ? { type: 'patch function', storeId: this.$id, oldState: previousState }\n : {\n type: 'patch object',\n storeId: this.$id,\n oldState: previousState,\n events: Object.keys(partialState),\n }\n\n if (typeof partialState === 'function') {\n partialState(candidate)\n } else {\n Object.assign(candidate, partialState)\n }\n\n return this.runMutation(candidate, mutation, partialState, previousState)\n }\n\n private scheduleMutation(operation: () => Promise<void>): Promise<void> {\n if (\n this.pendingMutations === 0 &&\n this.middlewareManager.getAll().length === 0\n ) {\n return operation()\n }\n\n this.pendingMutations += 1\n const queuedOperation = this.mutationQueue.then(operation)\n this.mutationQueue = queuedOperation.catch(() => undefined)\n void queuedOperation.then(\n () => {\n this.pendingMutations -= 1\n },\n () => {\n this.pendingMutations -= 1\n }\n )\n return queuedOperation\n }\n\n private notifyPluginStoreCreated(): void {\n if (this.pluginManager.notifyStoreCreated) {\n this.pluginManager.notifyStoreCreated(this)\n return\n }\n this.pluginManager.getAll().forEach(plugin => plugin.onStoreCreated?.(this))\n }\n\n private notifyPluginStoreDisposed(): void {\n if (this.pluginManager.notifyStoreDisposed) {\n this.pluginManager.notifyStoreDisposed(this)\n return\n }\n this.pluginManager\n .getAll()\n .forEach(plugin => plugin.onStoreDisposed?.(this))\n }\n\n private notifyPluginStateChange(state: S, previousState: S): void {\n if (this.pluginManager.notifyStateChange) {\n this.pluginManager.notifyStateChange(\n this.$id,\n deepClone(state),\n deepClone(previousState)\n )\n return\n }\n this.pluginManager\n .getAll()\n .forEach(plugin =>\n plugin.onStateChange?.(\n this.$id,\n deepClone(state),\n deepClone(previousState)\n )\n )\n }\n\n private checkDisposed(): void {\n if (this.disposed) {\n throw new Error(`[Store] Store \"${this.$id}\" has been disposed`)\n }\n }\n\n private createGetters(gettersDefinition: G): {\n [K in keyof G]: ReturnType<G[K]>\n } {\n const getterCache = {} as { [K in keyof G]: ReturnType<G[K]> }\n\n for (const key of Object.keys(gettersDefinition) as Array<keyof G>) {\n Object.defineProperty(getterCache, key, {\n enumerable: true,\n get: () => gettersDefinition[key](this._state),\n })\n }\n\n return getterCache\n }\n\n private createActions(actionsDefinition: A): A {\n const actionCache = {} as A\n\n for (const key of Object.keys(actionsDefinition) as Array<keyof A>) {\n const action = actionsDefinition[key]\n actionCache[key] = ((...args: unknown[]) => {\n this.checkDisposed()\n\n const afterCallbacks: ActionCallback[] = []\n const errorCallbacks: ActionCallback[] = []\n const context: ActionContext<A> = {\n after: callback => afterCallbacks.push(callback),\n args,\n name: key,\n onError: callback => errorCallbacks.push(callback),\n storeId: this.$id,\n }\n\n this.notifyAction(context)\n\n try {\n const result = action.apply(this, args)\n if (isPromiseLike(result)) {\n return result\n .then(async resolvedResult => {\n await runCallbacks(afterCallbacks, resolvedResult)\n return resolvedResult\n })\n .catch(async (error: unknown) => {\n await runCallbacks(errorCallbacks, error)\n throw error\n }) as ReturnType<A[typeof key]>\n }\n\n void runCallbacks(afterCallbacks, result)\n return result\n } catch (error) {\n void runCallbacks(errorCallbacks, error)\n throw error\n }\n }) as A[typeof key]\n }\n\n return actionCache\n }\n\n private notifyAction(context: ActionContext<A>): void {\n this.actionSubscribers.publish(context)\n }\n}\n","/**\r\n * @module store/core/create-store\r\n *\r\n * Store 工厂函数,用于创建单例 Store 的惰性初始化函数。\r\n * 基于 BaseStore 实现,返回的工厂函数在首次调用时创建 Store 实例,\r\n * 后续调用返回同一实例,直到调用 $dispose() 后重置。\r\n */\r\n\r\nimport type {\r\n ActionSubscriber,\r\n StateMutation,\r\n StateSubscriber,\r\n StateTree,\r\n StoreId,\r\n StoreOptions,\r\n Unsubscribe,\r\n} from '../types'\r\nimport { BaseStore } from './base-store'\r\n\r\n/**\r\n * Store 定义描述接口\r\n *\r\n * @typeParam Id - Store 唯一标识符类型\r\n * @typeParam S - 状态树类型\r\n * @typeParam G - 计算属性定义类型\r\n * @typeParam A - Action 定义类型\r\n */\r\nexport interface CreateStoreDefinition<\r\n Id extends StoreId,\r\n S extends StateTree,\r\n G extends Record<string, (state: S) => unknown>,\r\n A extends Record<\r\n string,\r\n (this: StoreAPI<Id, S, G, A>, ...args: unknown[]) => unknown\r\n >,\r\n> {\r\n id: Id\r\n state: () => S\r\n getters?: G\r\n actions?: A\r\n}\r\n\r\n/**\r\n * Store 实例的公共 API 接口\r\n *\r\n * 提供状态读取、订阅、补丁、重置、Action 监听和生命周期管理等能力。\r\n *\r\n * @typeParam Id - Store 唯一标识符类型\r\n * @typeParam S - 状态树类型\r\n * @typeParam G - 计算属性定义类型\r\n * @typeParam A - Action 定义类型\r\n */\r\nexport interface StoreAPI<\r\n Id extends StoreId = StoreId,\r\n S extends StateTree = StateTree,\r\n G extends Record<string, (state: S) => unknown> = Record<string, never>,\r\n A extends Record<string, (...args: unknown[]) => unknown> = Record<\r\n string,\r\n never\r\n >,\r\n> {\r\n readonly $id: Id\r\n readonly $state: S\r\n $reset: () => void\r\n $patch: (partial: Partial<S> | ((state: S) => void)) => void\r\n $patchAsync: (partial: Partial<S> | ((state: S) => void)) => Promise<void>\r\n $subscribe: (\r\n callback: StateSubscriber<S>,\r\n options?: { immediate?: boolean }\r\n ) => Unsubscribe\r\n $onAction: (callback: ActionSubscriber<A>) => Unsubscribe\r\n $dispose: () => void\r\n readonly getters: { [K in keyof G]: ReturnType<G[K]> }\r\n readonly actions: { [K in keyof A]: A[K] }\r\n}\r\n\r\n/**\r\n * 创建 Store 的工厂函数\r\n *\r\n * 返回一个惰性初始化的工厂函数。首次调用时基于定义创建 Store 实例,\r\n * 后续调用返回缓存的单例,直到 $dispose() 被调用后重置。\r\n *\r\n * @typeParam Id - Store 唯一标识符类型\r\n * @typeParam S - 状态树类型\r\n * @typeParam G - 计算属性定义类型\r\n * @typeParam A - Action 定义类型\r\n * @param definition - Store 定义,包含 id、state 工厂、getters 和 actions\r\n * @returns 惰性初始化的 Store 工厂函数,调用后返回 StoreAPI 实例\r\n */\r\nexport function createStore<\r\n Id extends StoreId,\r\n S extends StateTree,\r\n G extends Record<string, (state: S) => unknown> = Record<string, never>,\r\n A extends Record<\r\n string,\r\n (this: StoreAPI<Id, S, G, A>, ...args: unknown[]) => unknown\r\n > = Record<string, never>,\r\n>(\r\n definition: CreateStoreDefinition<Id, S, G, A>,\r\n options: StoreOptions = {}\r\n): () => StoreAPI<Id, S, G, A> {\r\n let instance: StoreAPI<Id, S, G, A> | null = null\r\n\r\n return (): StoreAPI<Id, S, G, A> => {\r\n if (instance) {\r\n return instance\r\n }\r\n\r\n const store = new BaseStore<Id, S, G, A>(definition, options)\r\n const originalDispose = store.$dispose.bind(store)\r\n store.$dispose = (): void => {\r\n originalDispose()\r\n instance = null\r\n }\r\n\r\n instance = store as unknown as StoreAPI<Id, S, G, A>\r\n\r\n return store\r\n }\r\n}\r\n\r\n/** 状态变更类型,支持部分更新或通过函数直接修改状态 */\r\nexport type { StateMutation }\r\n","/**\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","/**\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","/**\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","/**\r\n * 持久化中间件\r\n *\r\n * 提供状态持久化功能\r\n * @module middleware/persist\r\n */\r\n\r\nimport type {\r\n Middleware,\r\n MiddlewareContext,\r\n PersistMiddlewareOptions,\r\n StateTree,\r\n StoreId,\r\n} from '../types'\r\nimport { debounce } from '../utils/debounce-throttle'\r\n\r\ntype ResolvedPersistMiddlewareOptions = Required<\r\n Pick<\r\n PersistMiddlewareOptions,\r\n 'debounce' | 'deserialize' | 'keyPrefix' | 'serialize' | 'storage'\r\n >\r\n> &\r\n Omit<\r\n PersistMiddlewareOptions,\r\n 'debounce' | 'deserialize' | 'keyPrefix' | 'serialize' | 'storage'\r\n >\r\n\r\n/**\r\n * 默认持久化选项\r\n */\r\nconst defaultOptions: ResolvedPersistMiddlewareOptions = {\r\n keyPrefix: 'ldesign-store:',\r\n storage: 'localStorage',\r\n debounce: 100,\r\n serialize: (value: unknown) => JSON.stringify(value),\r\n deserialize: (value: string) => JSON.parse(value) as unknown,\r\n}\r\n\r\nfunction resolveOptions(\r\n options: PersistMiddlewareOptions\r\n): ResolvedPersistMiddlewareOptions {\r\n return { ...defaultOptions, ...options }\r\n}\r\n\r\n/**\r\n * 获取存储对象\r\n */\r\nfunction getStorage(type: 'localStorage' | 'sessionStorage'): Storage | null {\r\n if (typeof window === 'undefined') {\r\n return null\r\n }\r\n return type === 'localStorage' ? localStorage : sessionStorage\r\n}\r\n\r\n/**\r\n * 创建持久化中间件\r\n *\r\n * @param options - 持久化选项\r\n * @returns 持久化中间件\r\n *\r\n * @example\r\n * ```typescript\r\n * const persist = createPersistMiddleware({\r\n * storage: 'localStorage',\r\n * stores: ['user', 'settings'],\r\n * debounce: 200,\r\n * })\r\n *\r\n * middlewareManager.use(persist)\r\n * ```\r\n */\r\nexport function createPersistMiddleware(\r\n options: PersistMiddlewareOptions = {}\r\n): Middleware {\r\n const opts = resolveOptions(options)\r\n const storage = getStorage(opts.storage)\r\n\r\n /** 保存状态的防抖函数映射 */\r\n const debouncedSave = new Map<StoreId, (state: StateTree) => void>()\r\n\r\n /**\r\n * 获取存储键名\r\n */\r\n const getKey = (storeId: StoreId): string => {\r\n return `${opts.keyPrefix}${storeId}`\r\n }\r\n\r\n /**\r\n * 筛选需要持久化的状态路径\r\n */\r\n const filterState = (storeId: StoreId, state: StateTree): StateTree => {\r\n const paths = opts.paths?.[storeId]\r\n if (!paths || paths.length === 0) {\r\n return state\r\n }\r\n\r\n const filtered: StateTree = {}\r\n for (const path of paths) {\r\n const keys = path.split('.')\r\n let source: unknown = state\r\n let target: StateTree = filtered\r\n\r\n for (let i = 0; i < keys.length; i++) {\r\n const key = keys[i]\r\n if (i === keys.length - 1) {\r\n target[key] = (source as StateTree)?.[key]\r\n } else {\r\n target[key] = target[key] || {}\r\n target = target[key] as StateTree\r\n source = (source as StateTree)?.[key]\r\n }\r\n }\r\n }\r\n\r\n return filtered\r\n }\r\n\r\n /**\r\n * 保存状态到存储\r\n */\r\n const saveState = (storeId: StoreId, state: StateTree): void => {\r\n if (!storage) return\r\n\r\n try {\r\n const filteredState = filterState(storeId, state)\r\n const serialized = opts.serialize(filteredState)\r\n storage.setItem(getKey(storeId), serialized)\r\n } catch (error) {\r\n console.error(`[Persist] 保存状态失败 (${storeId}):`, error)\r\n }\r\n }\r\n\r\n /**\r\n * 获取或创建防抖保存函数\r\n */\r\n const getDebouncedSave = (storeId: StoreId): ((state: StateTree) => void) => {\r\n let fn = debouncedSave.get(storeId)\r\n if (!fn) {\r\n fn = debounce(\r\n (state: StateTree) => saveState(storeId, state),\r\n opts.debounce\r\n )\r\n debouncedSave.set(storeId, fn)\r\n }\r\n return fn\r\n }\r\n\r\n return {\r\n name: 'persist',\r\n priority: 100, // 最后执行\r\n\r\n handler: async (\r\n context: MiddlewareContext,\r\n next: () => void | Promise<void>\r\n ) => {\r\n await next()\r\n\r\n const { storeId, type, state } = context\r\n\r\n // 只在状态变化时持久化\r\n if (!type.startsWith('state:')) {\r\n return\r\n }\r\n\r\n // 检查是否需要持久化此 Store\r\n if (opts.stores && !opts.stores.includes(storeId)) {\r\n return\r\n }\r\n\r\n // 使用防抖保存\r\n getDebouncedSave(storeId)(state)\r\n },\r\n }\r\n}\r\n\r\n/**\r\n * 从存储恢复状态\r\n *\r\n * @param storeId - Store ID\r\n * @param options - 持久化选项\r\n * @returns 恢复的状态或 null\r\n */\r\nexport function restoreState<S extends StateTree>(\r\n storeId: StoreId,\r\n options: PersistMiddlewareOptions = {}\r\n): S | null {\r\n const opts = resolveOptions(options)\r\n const storage = getStorage(opts.storage)\r\n\r\n if (!storage) return null\r\n\r\n try {\r\n const key = `${opts.keyPrefix}${storeId}`\r\n const data = storage.getItem(key)\r\n if (data) {\r\n return opts.deserialize(data) as S\r\n }\r\n } catch (error) {\r\n console.error(`[Persist] 恢复状态失败 (${storeId}):`, error)\r\n }\r\n\r\n return null\r\n}\r\n","/* ============================================================\r\n * time-travel.ts\r\n * 时间旅行中间件\r\n * 提供状态快照历史记录、撤销(undo)、重做(redo)、跳转(goto)等能力\r\n * 用于实现 Store 状态的可回溯调试与操作历史管理\r\n * ============================================================ */\r\n\r\n/* 从类型文件导入中间件、上下文、快照、状态树等核心类型 */\r\nimport type {\r\n Middleware, // 中间件接口\r\n MiddlewareContext, // 中间件执行上下文接口\r\n StateSnapshot, // 状态快照接口\r\n StateTree, // 状态树类型\r\n StoreId, // Store 标识类型\r\n TimeTravelController, // 时间旅行控制器接口\r\n TimeTravelMiddlewareOptions, // 时间旅行中间件配置选项接口\r\n} from '../types'\r\n/* 从工具库导入深拷贝函数,用于快照的隔离存储 */\r\nimport { deepClone } from '../utils/deep-clone'\r\n\r\n/* ── 内部类型定义 ── */\r\n\r\n/**\r\n * 恢复回调函数类型\r\n * 当执行 undo/redo/goto 操作时,通过此回调将历史快照状态应用到对应 Store\r\n * @param storeId - 目标 Store 的标识\r\n * @param state - 要恢复的状态树(已深拷贝,可安全修改)\r\n */\r\ntype RestoreCallback = (storeId: StoreId, state: StateTree) => void\r\n\r\n/**\r\n * 带有内部恢复回调设置器的控制器扩展类型\r\n * 在 TimeTravelController 基础上增加 __setRestoreCallback 内部方法\r\n * 用于在创建后注入实际的恢复回调(由 Store 运行时提供)\r\n */\r\ntype TimeTravelControllerWithRestoreSetter = TimeTravelController & {\r\n __setRestoreCallback?: (callback: RestoreCallback) => void\r\n}\r\n\r\n/* ── 默认配置 ── */\r\n\r\n/** 中间件默认选项:最多保留 100 条历史记录,功能默认启用 */\r\nconst defaultOptions: TimeTravelMiddlewareOptions = {\r\n maxHistory: 100,\r\n enabled: true,\r\n}\r\n\r\n/**\r\n * 创建时间旅行中间件\r\n *\r\n * 返回一个中间件函数和一个控制器对象:\r\n * - 中间件负责拦截 state: 类型的操作,在操作前后记录状态快照\r\n * - 控制器提供 undo/redo/goto/clear 等方法,用于在历史快照之间跳转\r\n *\r\n * @param options - 中间件配置选项(可选,与默认值合并)\r\n * @returns 包含 middleware(中间件)和 controller(控制器)的对象\r\n */\r\nexport function createTimeTravelMiddleware(\r\n options: TimeTravelMiddlewareOptions = {}\r\n): {\r\n middleware: Middleware\r\n controller: TimeTravelController\r\n} {\r\n /* 将用户选项与默认选项合并 */\r\n const opts = { ...defaultOptions, ...options }\r\n /* 最大历史记录条数,确保至少为 1 */\r\n const maxHistory = opts.maxHistory ?? defaultOptions.maxHistory ?? 100\r\n /* 历史快照数组,存储所有状态变更的快照 */\r\n const history: StateSnapshot[] = []\r\n\r\n /* 当前快照指针,指向 history 数组中的当前位置,-1 表示无快照 */\r\n let currentIndex = -1\r\n /* 标记是否正在进行时间旅行(undo/redo/goto),防止在恢复过程中重复记录快照 */\r\n let isTraveling = false\r\n /* 恢复回调函数,初始为空函数,后续通过 __setRestoreCallback 注入实际实现 */\r\n let restoreCallback: RestoreCallback = () => {}\r\n\r\n /**\r\n * 添加新的状态快照到历史记录\r\n * 业务处理过程:\r\n * 1. 如果中间件未启用或正在时间旅行中,则跳过\r\n * 2. 如果当前指针不在末尾(即之前执行过 undo),则丢弃指针之后的快照(分支覆盖)\r\n * 3. 推入新快照并更新指针\r\n * 4. 如果超过最大历史条数,移除最早的快照并调整指针\r\n *\r\n * @param snapshot - 要添加的状态快照\r\n */\r\n const addSnapshot = (snapshot: StateSnapshot): void => {\r\n /* 中间件未启用或正在时间旅行中,不记录快照 */\r\n if (!opts.enabled || isTraveling) {\r\n return\r\n }\r\n\r\n /* 如果当前指针不在历史末尾(之前执行过 undo),丢弃后续快照(创建新分支) */\r\n if (currentIndex < history.length - 1) {\r\n history.splice(currentIndex + 1)\r\n }\r\n\r\n /* 将新快照推入历史数组 */\r\n history.push(snapshot)\r\n /* 更新指针到最新快照 */\r\n currentIndex = history.length - 1\r\n\r\n /* 如果历史记录超过上限,移除最早的快照 */\r\n if (history.length > maxHistory) {\r\n history.shift()\r\n /* 移除头部元素后指针需要前移一位 */\r\n currentIndex--\r\n }\r\n }\r\n\r\n /**\r\n * 时间旅行控制器\r\n * 提供 undo(撤销)、redo(重做)、goto(跳转)、clear(清除)等操作\r\n * 所有恢复操作都通过 restoreCallback 将历史快照应用到 Store\r\n */\r\n const controller: TimeTravelControllerWithRestoreSetter = {\r\n /**\r\n * 撤销操作\r\n * 将当前指针前移一步,恢复到上一个历史快照状态\r\n */\r\n undo: () => {\r\n /* 无法撤销(已到最早快照)则跳过 */\r\n if (!controller.canUndo()) {\r\n return\r\n }\r\n\r\n /* 标记进入时间旅行模式,防止恢复过程触发新的快照记录 */\r\n isTraveling = true\r\n /* 指针前移 */\r\n currentIndex--\r\n /* 获取目标快照 */\r\n const snapshot = history[currentIndex]\r\n /* 通过恢复回调将快照状态(深拷贝)应用到 Store,避免污染历史记录 */\r\n restoreCallback(snapshot.storeId, deepClone(snapshot.state))\r\n /* 退出时间旅行模式 */\r\n isTraveling = false\r\n },\r\n\r\n /**\r\n * 重做操作\r\n * 将当前指针后移一步,恢复到下一个历史快照状态\r\n */\r\n redo: () => {\r\n /* 无法重做(已到最新快照)则跳过 */\r\n if (!controller.canRedo()) {\r\n return\r\n }\r\n\r\n /* 标记进入时间旅行模式 */\r\n isTraveling = true\r\n /* 指针后移 */\r\n currentIndex++\r\n /* 获取目标快照 */\r\n const snapshot = history[currentIndex]\r\n /* 恢复快照状态(深拷贝) */\r\n restoreCallback(snapshot.storeId, deepClone(snapshot.state))\r\n /* 退出时间旅行模式 */\r\n isTraveling = false\r\n },\r\n\r\n /**\r\n * 跳转到指定历史索引\r\n * 将当前指针直接移动到指定位置,恢复对应的快照状态\r\n *\r\n * @param index - 目标历史索引(0-based)\r\n */\r\n goto: (index: number) => {\r\n /* 索引越界检查 */\r\n if (index < 0 || index >= history.length) {\r\n return\r\n }\r\n\r\n /* 标记进入时间旅行模式 */\r\n isTraveling = true\r\n /* 直接设置指针到目标索引 */\r\n currentIndex = index\r\n /* 获取目标快照 */\r\n const snapshot = history[currentIndex]\r\n /* 恢复快照状态(深拷贝) */\r\n restoreCallback(snapshot.storeId, deepClone(snapshot.state))\r\n /* 退出时间旅行模式 */\r\n isTraveling = false\r\n },\r\n\r\n /**\r\n * 获取完整的快照历史(返回深拷贝,防止外部修改内部历史记录)\r\n * @returns 历史快照数组的深拷贝\r\n */\r\n getHistory: () => deepClone(history),\r\n\r\n /**\r\n * 获取当前快照指针索引\r\n * @returns 当前索引值,-1 表示无快照\r\n */\r\n getCurrentIndex: () => currentIndex,\r\n\r\n /**\r\n * 判断是否可以撤销\r\n * 当前索引大于 0 时,说明前面还有历史快照\r\n * @returns 是否可以执行 undo 操作\r\n */\r\n canUndo: () => currentIndex > 0,\r\n\r\n /**\r\n * 判断是否可以重做\r\n * 当前索引小于历史长度 - 1 时,说明后面还有快照\r\n * @returns 是否可以执行 redo 操作\r\n */\r\n canRedo: () => currentIndex < history.length - 1,\r\n\r\n /**\r\n * 清除所有历史快照并重置指针\r\n * 通常在 Store 销毁或需要重置历史时调用\r\n */\r\n clear: () => {\r\n /* 清空历史数组 */\r\n history.length = 0\r\n /* 重置指针到初始状态 */\r\n currentIndex = -1\r\n },\r\n }\r\n\r\n /**\r\n * 在控制器上挂载内部恢复回调设置器\r\n * 允许 Store 运行时在初始化时注入实际的状态恢复逻辑\r\n * 使用 __ 前缀表示这是内部方法,不建议外部直接调用\r\n */\r\n controller.__setRestoreCallback = (callback: RestoreCallback) => {\r\n restoreCallback = callback\r\n }\r\n\r\n /**\r\n * 时间旅行中间件\r\n * 拦截所有 \"state:\" 前缀的操作(如 state:update),在操作执行前后\r\n * 记录状态快照,从而构建可回溯的状态历史\r\n */\r\n const middleware: Middleware = {\r\n /* 中间件名称,用于调试和日志 */\r\n name: 'time-travel',\r\n /* 中间件优先级,50 为中等优先级(数值越小越先执行) */\r\n priority: 50,\r\n /**\r\n * 中间件处理函数\r\n * 只拦截 \"state:\" 类型的操作(状态变更操作),其他类型直接放行\r\n * 正在时间旅行时也不记录快照,避免循环\r\n *\r\n * @param context - 中间件上下文,包含 storeId、操作类型、状态等信息\r\n * @param next - 调用下一个中间件或最终操作的函数\r\n */\r\n handler: async (\r\n context: MiddlewareContext,\r\n next: () => void | Promise<void>\r\n ) => {\r\n /* 解构上下文:Store 标识、操作类型、当前状态 */\r\n const { storeId, type, state } = context\r\n\r\n /* 非状态变更操作(不以 \"state:\" 开头)或正在时间旅行中,直接执行后续操作 */\r\n if (!type.startsWith('state:') || isTraveling) {\r\n await next()\r\n return\r\n }\r\n\r\n /* 在执行操作前,创建当前状态的快照(before snapshot) */\r\n const snapshot: StateSnapshot = {\r\n timestamp: Date.now() /* 快照时间戳 */,\r\n state: deepClone(state) /* 深拷贝当前状态,隔离引用 */,\r\n type /* 操作类型 */,\r\n storeId /* Store 标识 */,\r\n }\r\n\r\n /* 执行后续中间件或最终操作 */\r\n await next()\r\n\r\n /* 操作执行完成后,将快照添加到历史记录 */\r\n addSnapshot(snapshot)\r\n },\r\n }\r\n\r\n /* 返回中间件和控制器 */\r\n return {\r\n middleware,\r\n controller,\r\n }\r\n}\r\n\r\n/**\r\n * 外部设置恢复回调的辅助函数\r\n * 将外部提供的状态恢复函数注入到时间旅行控制器中\r\n *\r\n * 使用场景:Store 运行时初始化时调用此函数,将控制器与 Store 的状态恢复逻辑连接\r\n *\r\n * @param controller - 时间旅行控制器实例\r\n * @param callback - 恢复回调函数,接收 storeId 和已深拷贝的状态树\r\n */\r\nexport function setRestoreCallback(\r\n controller: TimeTravelController,\r\n callback: (storeId: StoreId, state: StateTree) => void\r\n): void {\r\n /* 将通用控制器类型断言为带内部设置器的扩展类型 */\r\n const controllerWithSetter =\r\n controller as TimeTravelControllerWithRestoreSetter\r\n /* 检查控制器是否支持 __setRestoreCallback 方法 */\r\n if (typeof controllerWithSetter.__setRestoreCallback === 'function') {\r\n /* 注入恢复回调 */\r\n controllerWithSetter.__setRestoreCallback(callback)\r\n return\r\n }\r\n\r\n /* 如果控制器不支持,输出警告(说明传入的不是 createTimeTravelMiddleware 创建的控制器) */\r\n console.warn(\r\n '[TimeTravel] 请使用 createTimeTravelMiddleware 返回的 controller'\r\n )\r\n}\r\n","/**\r\n * 验证中间件\r\n *\r\n * 对状态变化进行规则校验,支持同步/异步校验器\r\n * @module middleware/validation\r\n */\r\n\r\nimport type {\r\n Middleware,\r\n MiddlewareContext,\r\n StateTree,\r\n StoreId,\r\n} from '../types'\r\n\r\n/**\r\n * 单个字段校验规则\r\n */\r\nexport interface ValidationRule<T = unknown> {\r\n /** 校验函数,返回 true 表示通过 */\r\n validate: (value: T, state: StateTree) => boolean | Promise<boolean>\r\n /** 校验失败时的错误信息 */\r\n message: string\r\n}\r\n\r\n/**\r\n * Store 校验规则集\r\n */\r\nexport type StoreValidationRules = Record<\r\n string,\r\n ValidationRule | ValidationRule[]\r\n>\r\n\r\n/**\r\n * 校验错误\r\n */\r\nexport interface ValidationError {\r\n /** Store ID */\r\n storeId: StoreId\r\n /** 字段路径 */\r\n field: string\r\n /** 错误信息 */\r\n message: string\r\n /** 字段值 */\r\n value: unknown\r\n}\r\n\r\n/**\r\n * 校验结果\r\n */\r\nexport interface ValidationResult {\r\n /** 是否全部通过 */\r\n valid: boolean\r\n /** 错误列表 */\r\n errors: ValidationError[]\r\n}\r\n\r\n/**\r\n * 验证中间件选项\r\n */\r\nexport interface ValidationMiddlewareOptions {\r\n /** 按 Store ID 配置的校验规则 */\r\n rules: Record<StoreId, StoreValidationRules>\r\n /** 校验失败时的回调 */\r\n onValidationError?: (result: ValidationResult) => void\r\n /** 校验失败是否阻止状态变化 (默认 false,仅报告) */\r\n blocking?: boolean\r\n /** 是否只在 state:patch 时校验 (默认 false,所有 state: 前缀均校验) */\r\n patchOnly?: boolean\r\n}\r\n\r\n/**\r\n * 创建验证中间件\r\n *\r\n * 对状态变化进行规则校验,可选择阻止无效变化或仅报告错误\r\n *\r\n * @param options - 验证配置\r\n * @returns 中间件实例和校验辅助 API\r\n *\r\n * @example\r\n * ```typescript\r\n * const { middleware, validate, getErrors, clearErrors } = createValidationMiddleware({\r\n * rules: {\r\n * 'user-form': {\r\n * name: {\r\n * validate: (v) => typeof v === 'string' && v.length >= 2,\r\n * message: 'Name must be at least 2 characters',\r\n * },\r\n * age: [\r\n * { validate: (v) => typeof v === 'number', message: 'Age must be a number' },\r\n * { validate: (v) => (v as number) >= 0 && (v as number) <= 150, message: 'Age must be 0-150' },\r\n * ],\r\n * email: {\r\n * validate: (v) => /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/.test(String(v)),\r\n * message: 'Invalid email format',\r\n * },\r\n * },\r\n * },\r\n * onValidationError: (result) => {\r\n * console.warn('Validation failed:', result.errors)\r\n * },\r\n * })\r\n *\r\n * manager.use(middleware)\r\n * ```\r\n */\r\nexport function createValidationMiddleware(\r\n options: ValidationMiddlewareOptions\r\n): {\r\n middleware: Middleware\r\n /** 手动校验某个 store 的当前状态 */\r\n validate: (storeId: StoreId, state: StateTree) => Promise<ValidationResult>\r\n /** 获取最近一次的校验错误 */\r\n getErrors: () => ValidationError[]\r\n /** 清空错误 */\r\n clearErrors: () => void\r\n} {\r\n const {\r\n rules,\r\n onValidationError,\r\n blocking = false,\r\n patchOnly = false,\r\n } = options\r\n\r\n let lastErrors: ValidationError[] = []\r\n\r\n /**\r\n * 校验单个 store 状态\r\n */\r\n async function validateState(\r\n storeId: StoreId,\r\n state: StateTree\r\n ): Promise<ValidationResult> {\r\n const storeRules = rules[storeId]\r\n if (!storeRules) return { valid: true, errors: [] }\r\n\r\n const errors: ValidationError[] = []\r\n\r\n for (const [field, fieldRules] of Object.entries(storeRules)) {\r\n const ruleList = Array.isArray(fieldRules) ? fieldRules : [fieldRules]\r\n const value = state[field]\r\n\r\n for (const rule of ruleList) {\r\n try {\r\n const isValid = await rule.validate(value, state)\r\n if (!isValid) {\r\n errors.push({\r\n storeId,\r\n field,\r\n message: rule.message,\r\n value,\r\n })\r\n }\r\n } catch {\r\n errors.push({\r\n storeId,\r\n field,\r\n message: rule.message || `Validation error on field \"${field}\"`,\r\n value,\r\n })\r\n }\r\n }\r\n }\r\n\r\n return { valid: errors.length === 0, errors }\r\n }\r\n\r\n const middleware: Middleware = {\r\n name: 'validation',\r\n priority: 5, // 在 logger (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 } = context\r\n\r\n // 检查是否需要校验\r\n const shouldValidate = patchOnly\r\n ? type === 'state:patch'\r\n : type.startsWith('state:')\r\n\r\n if (!shouldValidate || !rules[storeId]) {\r\n await next()\r\n return\r\n }\r\n\r\n // 先执行状态变化\r\n const result = await validateState(storeId, state)\r\n\r\n if (!result.valid) {\r\n lastErrors = result.errors\r\n onValidationError?.(result)\r\n\r\n if (blocking) {\r\n throw new Error(\r\n `[Validation] ${storeId}: ${result.errors.map(e => e.message).join('; ')}`\r\n )\r\n }\r\n } else {\r\n // 校验通过,清除该 store 的错误\r\n lastErrors = lastErrors.filter(e => e.storeId !== storeId)\r\n }\r\n\r\n await next()\r\n },\r\n }\r\n\r\n return {\r\n middleware,\r\n validate: validateState,\r\n getErrors: () => [...lastErrors],\r\n clearErrors: () => {\r\n lastErrors = []\r\n },\r\n }\r\n}\r\n","/**\r\n * 插件定义辅助函数\r\n *\r\n * @module plugins/define-plugin\r\n */\r\n\r\nimport type { DefinePluginOptions, PluginFactory, StorePlugin } from '../types'\r\n\r\n/**\r\n * 定义 Store 插件\r\n *\r\n * 提供类型安全的插件定义方式\r\n *\r\n * @template Options - 插件选项类型\r\n * @param options - 插件定义选项\r\n * @returns 插件实例\r\n *\r\n * @example\r\n * ```typescript\r\n * // 定义一个简单的日志插件\r\n * const loggerPlugin = defineStorePlugin({\r\n * name: 'logger',\r\n * version: '0.0.1',\r\n * install(context) {\r\n * console.log('Logger plugin installed')\r\n * },\r\n * onStateChange(storeId, state, oldState) {\r\n * console.log(`[${storeId}] State changed:`, state)\r\n * },\r\n * })\r\n * ```\r\n */\r\nexport function defineStorePlugin<Options = Record<string, unknown>>(\r\n options: DefinePluginOptions<Options>\r\n): StorePlugin<Options> {\r\n return {\r\n name: options.name,\r\n version: options.version,\r\n description: options.description,\r\n install: options.install,\r\n uninstall: options.uninstall,\r\n onStoreCreated: options.onStoreCreated,\r\n onStoreDisposed: options.onStoreDisposed,\r\n onStateChange: options.onStateChange,\r\n }\r\n}\r\n\r\n/**\r\n * 创建插件工厂函数\r\n *\r\n * 用于创建可配置的插件\r\n *\r\n * @template Options - 插件选项类型\r\n * @param factory - 插件工厂函数\r\n * @returns 插件工厂\r\n *\r\n * @example\r\n * ```typescript\r\n * // 创建可配置的持久化插件\r\n * const createPersistPlugin = createPluginFactory<{ key: string }>(\r\n * (options) => ({\r\n * name: 'persist',\r\n * install(context) {\r\n * console.log('Persist key:', options?.key)\r\n * },\r\n * })\r\n * )\r\n *\r\n * // 使用\r\n * const plugin = createPersistPlugin({ key: 'my-store' })\r\n * ```\r\n */\r\nexport function createPluginFactory<Options = Record<string, unknown>>(\r\n factory: (options?: Options) => DefinePluginOptions<Options>\r\n): PluginFactory<Options> {\r\n return (options?: Options): StorePlugin<Options> => {\r\n return defineStorePlugin(factory(options))\r\n }\r\n}\r\n\r\n/**\r\n * 组合多个插件\r\n *\r\n * @param plugins - 插件列表\r\n * @returns 组合后的插件\r\n *\r\n * @example\r\n * ```typescript\r\n * const combinedPlugin = composePlugins([\r\n * loggerPlugin,\r\n * persistPlugin,\r\n * devtoolsPlugin,\r\n * ])\r\n * ```\r\n */\r\nexport function composePlugins(plugins: StorePlugin[]): StorePlugin {\r\n return {\r\n name: 'composed-plugins',\r\n version: '0.0.1',\r\n\r\n async install(context, options) {\r\n for (const plugin of plugins) {\r\n await plugin.install(context, options)\r\n }\r\n },\r\n\r\n async uninstall(context) {\r\n // 逆序卸载\r\n for (let i = plugins.length - 1; i >= 0; i--) {\r\n await plugins[i].uninstall?.(context)\r\n }\r\n },\r\n\r\n onStoreCreated(store) {\r\n plugins.forEach(plugin => plugin.onStoreCreated?.(store))\r\n },\r\n\r\n onStoreDisposed(store) {\r\n plugins.forEach(plugin => plugin.onStoreDisposed?.(store))\r\n },\r\n\r\n onStateChange(storeId, state, oldState) {\r\n plugins.forEach(plugin =>\r\n plugin.onStateChange?.(storeId, state, oldState)\r\n )\r\n },\r\n }\r\n}\r\n","/**\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":"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"}