@vlian/framework 1.2.56 → 1.2.59

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 (685) hide show
  1. package/README.md +15 -3
  2. package/dist/analytics/index.cjs +0 -2
  3. package/dist/analytics/index.js +1 -3
  4. package/dist/analytics.umd.js +8 -208
  5. package/dist/components/LocaleSwitch.cjs +0 -2
  6. package/dist/components/LocaleSwitch.js +1 -103
  7. package/dist/components/ThemeSwitch.cjs +0 -2
  8. package/dist/components/ThemeSwitch.js +1 -102
  9. package/dist/components/index.cjs +0 -2
  10. package/dist/components/index.js +1 -4
  11. package/dist/components/persistence.cjs +0 -2
  12. package/dist/components/persistence.js +1 -39
  13. package/dist/core/Test.cjs +0 -2
  14. package/dist/core/Test.js +1 -15
  15. package/dist/core/app/AppContext.cjs +0 -2
  16. package/dist/core/app/AppContext.js +1 -339
  17. package/dist/core/app/AppContext.types.cjs +0 -2
  18. package/dist/core/app/AppContext.types.js +1 -5
  19. package/dist/core/app/BasicLayout.cjs +0 -2
  20. package/dist/core/app/BasicLayout.js +1 -74
  21. package/dist/core/app/DefaultApp.cjs +0 -2
  22. package/dist/core/app/DefaultApp.js +1 -143
  23. package/dist/core/app/index.cjs +0 -2
  24. package/dist/core/app/index.js +1 -7
  25. package/dist/core/config/AppConfig.cjs +0 -2
  26. package/dist/core/config/AppConfig.js +1 -133
  27. package/dist/core/config/ConfigLoader.cjs +0 -2
  28. package/dist/core/config/ConfigLoader.js +1 -311
  29. package/dist/core/config/ConfigValidator.cjs +0 -2
  30. package/dist/core/config/ConfigValidator.js +2 -121
  31. package/dist/core/config/index.cjs +0 -2
  32. package/dist/core/config/index.js +1 -7
  33. package/dist/core/dev/DevTools.cjs +0 -2
  34. package/dist/core/dev/DevTools.js +1 -210
  35. package/dist/core/error/ErrorBoundary.cjs +0 -2
  36. package/dist/core/error/ErrorBoundary.js +1 -399
  37. package/dist/core/error/ErrorHandler.cjs +0 -2
  38. package/dist/core/error/ErrorHandler.js +1 -261
  39. package/dist/core/error/index.cjs +0 -2
  40. package/dist/core/error/index.js +1 -6
  41. package/dist/core/event/AppEventBus.cjs +0 -2
  42. package/dist/core/event/AppEventBus.js +1 -438
  43. package/dist/core/event/frameworkEvents.cjs +0 -2
  44. package/dist/core/event/frameworkEvents.js +1 -135
  45. package/dist/core/event/hooks.cjs +0 -2
  46. package/dist/core/event/hooks.js +1 -95
  47. package/dist/core/event/index.cjs +0 -2
  48. package/dist/core/event/index.js +1 -10
  49. package/dist/core/event/types.cjs +0 -2
  50. package/dist/core/event/types.js +1 -56
  51. package/dist/core/event/useEventBus.cjs +0 -2
  52. package/dist/core/event/useEventBus.js +1 -39
  53. package/dist/core/index.cjs +0 -2
  54. package/dist/core/index.js +1 -69
  55. package/dist/core/initialization/InitializationErrorThrower.cjs +0 -2
  56. package/dist/core/initialization/InitializationErrorThrower.js +1 -30
  57. package/dist/core/initialization/index.cjs +0 -2
  58. package/dist/core/initialization/index.js +1 -7
  59. package/dist/core/initialization/initialization.cjs +0 -2
  60. package/dist/core/initialization/initialization.js +1 -78
  61. package/dist/core/initialization/initializationErrorState.cjs +0 -2
  62. package/dist/core/initialization/initializationErrorState.js +1 -60
  63. package/dist/core/kernel/defaultAdapters.cjs +0 -2
  64. package/dist/core/kernel/defaultAdapters.js +1 -176
  65. package/dist/core/kernel/errors.cjs +0 -2
  66. package/dist/core/kernel/errors.js +1 -53
  67. package/dist/core/kernel/index.cjs +0 -2
  68. package/dist/core/kernel/index.js +1 -4
  69. package/dist/core/kernel/startKernel.cjs +0 -2
  70. package/dist/core/kernel/startKernel.js +1 -192
  71. package/dist/core/kernel/types.cjs +0 -2
  72. package/dist/core/kernel/types.js +1 -3
  73. package/dist/core/middleware.cjs +0 -2
  74. package/dist/core/middleware.js +1 -61
  75. package/dist/core/plugin/PluginEventBus.cjs +0 -2
  76. package/dist/core/plugin/PluginEventBus.js +1 -286
  77. package/dist/core/plugin/PluginSandbox.cjs +0 -2
  78. package/dist/core/plugin/PluginSandbox.js +1 -125
  79. package/dist/core/plugin.cjs +0 -2
  80. package/dist/core/plugin.js +1 -438
  81. package/dist/core/router/RouterManager.cjs +0 -2
  82. package/dist/core/router/RouterManager.js +1 -272
  83. package/dist/core/router/adapter/AdapterManager.cjs +0 -2
  84. package/dist/core/router/adapter/AdapterManager.js +1 -221
  85. package/dist/core/router/adapter/index.cjs +0 -2
  86. package/dist/core/router/adapter/index.js +1 -7
  87. package/dist/core/router/adapter/react-router/ReactRouterAdapter.cjs +0 -2
  88. package/dist/core/router/adapter/react-router/ReactRouterAdapter.js +1 -116
  89. package/dist/core/router/adapter/react-router/index.cjs +0 -2
  90. package/dist/core/router/adapter/react-router/index.js +1 -5
  91. package/dist/core/router/adapter/types.cjs +0 -2
  92. package/dist/core/router/adapter/types.js +1 -7
  93. package/dist/core/router/dev/RouterDevTools.cjs +0 -2
  94. package/dist/core/router/dev/RouterDevTools.js +1 -211
  95. package/dist/core/router/dev/index.cjs +0 -2
  96. package/dist/core/router/dev/index.js +1 -5
  97. package/dist/core/router/dynamic/DynamicRouteManager.cjs +0 -2
  98. package/dist/core/router/dynamic/DynamicRouteManager.js +1 -179
  99. package/dist/core/router/dynamic/index.cjs +0 -2
  100. package/dist/core/router/dynamic/index.js +1 -5
  101. package/dist/core/router/errors/RouterError.cjs +0 -2
  102. package/dist/core/router/errors/RouterError.js +1 -48
  103. package/dist/core/router/errors/index.cjs +0 -2
  104. package/dist/core/router/errors/index.js +1 -5
  105. package/dist/core/router/index.cjs +0 -2
  106. package/dist/core/router/index.js +1 -32
  107. package/dist/core/router/lifecycle/RouterLifecycleManager.cjs +0 -2
  108. package/dist/core/router/lifecycle/RouterLifecycleManager.js +1 -130
  109. package/dist/core/router/lifecycle/index.cjs +0 -2
  110. package/dist/core/router/lifecycle/index.js +1 -5
  111. package/dist/core/router/middleware/RouterMiddlewareManager.cjs +0 -2
  112. package/dist/core/router/middleware/RouterMiddlewareManager.js +1 -179
  113. package/dist/core/router/middleware/auth.cjs +0 -2
  114. package/dist/core/router/middleware/auth.js +1 -63
  115. package/dist/core/router/middleware/index.cjs +0 -2
  116. package/dist/core/router/middleware/index.js +1 -7
  117. package/dist/core/router/middleware/types.cjs +0 -2
  118. package/dist/core/router/middleware/types.js +1 -7
  119. package/dist/core/router/monitoring/RouterMonitoring.cjs +0 -2
  120. package/dist/core/router/monitoring/RouterMonitoring.js +1 -213
  121. package/dist/core/router/monitoring/index.cjs +0 -2
  122. package/dist/core/router/monitoring/index.js +1 -5
  123. package/dist/core/router/navigation/RouterNavigation.cjs +0 -2
  124. package/dist/core/router/navigation/RouterNavigation.js +1 -192
  125. package/dist/core/router/navigation/index.cjs +0 -2
  126. package/dist/core/router/navigation/index.js +1 -5
  127. package/dist/core/router/performance/RouteCache.cjs +0 -2
  128. package/dist/core/router/performance/RouteCache.js +1 -291
  129. package/dist/core/router/performance/RoutePreloader.cjs +0 -2
  130. package/dist/core/router/performance/RoutePreloader.js +1 -277
  131. package/dist/core/router/performance/index.cjs +0 -2
  132. package/dist/core/router/performance/index.js +1 -6
  133. package/dist/core/router/plugin/RouterPluginManager.cjs +0 -2
  134. package/dist/core/router/plugin/RouterPluginManager.js +1 -248
  135. package/dist/core/router/plugin/index.cjs +0 -2
  136. package/dist/core/router/plugin/index.js +1 -6
  137. package/dist/core/router/plugin/types.cjs +0 -2
  138. package/dist/core/router/plugin/types.js +1 -33
  139. package/dist/core/router/types.cjs +0 -2
  140. package/dist/core/router/types.js +1 -5
  141. package/dist/core/router/utils/adapters/react-router/RouteErrorBoundary.cjs +0 -2
  142. package/dist/core/router/utils/adapters/react-router/RouteErrorBoundary.js +1 -121
  143. package/dist/core/router/utils/adapters/react-router/transform.cjs +0 -2
  144. package/dist/core/router/utils/adapters/react-router/transform.js +1 -242
  145. package/dist/core/router/utils/transform.cjs +0 -2
  146. package/dist/core/router/utils/transform.js +1 -791
  147. package/dist/core/router/validation/RouterConfigValidator.cjs +0 -2
  148. package/dist/core/router/validation/RouterConfigValidator.js +2 -77
  149. package/dist/core/router/validation/index.cjs +0 -2
  150. package/dist/core/router/validation/index.js +1 -6
  151. package/dist/core/router/validation/schema.cjs +0 -2
  152. package/dist/core/router/validation/schema.js +1 -151
  153. package/dist/core/router/version/RouteVersionManager.cjs +0 -2
  154. package/dist/core/router/version/RouteVersionManager.js +1 -191
  155. package/dist/core/router/version/index.cjs +0 -2
  156. package/dist/core/router/version/index.js +1 -5
  157. package/dist/core/splash/SplashScreen.cjs +0 -2
  158. package/dist/core/splash/SplashScreen.js +1 -293
  159. package/dist/core/splash/index.cjs +0 -2
  160. package/dist/core/splash/index.js +1 -6
  161. package/dist/core/splash/splashScreenUtils.cjs +0 -2
  162. package/dist/core/splash/splashScreenUtils.js +1 -30
  163. package/dist/core/startup/AppInstance.cjs +0 -2
  164. package/dist/core/startup/AppInstance.js +1 -226
  165. package/dist/core/startup/environment.cjs +0 -2
  166. package/dist/core/startup/environment.js +1 -154
  167. package/dist/core/startup/index.cjs +0 -2
  168. package/dist/core/startup/index.js +1 -8
  169. package/dist/core/startup/initializeServices.cjs +0 -2
  170. package/dist/core/startup/initializeServices.js +1 -188
  171. package/dist/core/startup/performanceTracker.cjs +0 -2
  172. package/dist/core/startup/performanceTracker.js +1 -167
  173. package/dist/core/startup/renderApp.cjs +0 -2
  174. package/dist/core/startup/renderApp.js +1 -267
  175. package/dist/core/startup/startApp.cjs +0 -2
  176. package/dist/core/startup/startApp.js +1 -315
  177. package/dist/core/types.cjs +0 -2
  178. package/dist/core/types.js +1 -5
  179. package/dist/index.cjs +0 -2
  180. package/dist/index.js +1 -11
  181. package/dist/index.umd.cjs +0 -2
  182. package/dist/index.umd.js +362 -13230
  183. package/dist/kernel/constants.cjs +0 -2
  184. package/dist/kernel/constants.js +1 -43
  185. package/dist/kernel/index.cjs +0 -2
  186. package/dist/kernel/index.js +1 -4
  187. package/dist/kernel/kernel.cjs +1 -3
  188. package/dist/kernel/kernel.js +1 -273
  189. package/dist/kernel/manager/cacheManager.cjs +0 -2
  190. package/dist/kernel/manager/cacheManager.js +1 -38
  191. package/dist/kernel/manager/i18n/I18nManager.cjs +0 -2
  192. package/dist/kernel/manager/i18n/I18nManager.js +1 -83
  193. package/dist/kernel/manager/i18n/i18n.persistence.cjs +4 -3
  194. package/dist/kernel/manager/i18n/i18n.persistence.js +1 -38
  195. package/dist/kernel/manager/i18n/i18n.schema.cjs +0 -2
  196. package/dist/kernel/manager/i18n/i18n.schema.js +1 -64
  197. package/dist/kernel/manager/i18n/index.cjs +0 -2
  198. package/dist/kernel/manager/i18n/index.js +1 -3
  199. package/dist/kernel/manager/i18nManager.cjs +0 -2
  200. package/dist/kernel/manager/i18nManager.js +1 -3
  201. package/dist/kernel/manager/index.cjs +0 -2
  202. package/dist/kernel/manager/index.js +1 -6
  203. package/dist/kernel/manager/logger/LoggerManager.cjs +0 -2
  204. package/dist/kernel/manager/logger/LoggerManager.js +1 -99
  205. package/dist/kernel/manager/logger/index.cjs +0 -2
  206. package/dist/kernel/manager/logger/index.js +1 -3
  207. package/dist/kernel/manager/logger/logger.persistence.cjs +0 -2
  208. package/dist/kernel/manager/logger/logger.persistence.js +1 -43
  209. package/dist/kernel/manager/logger/logger.schema.cjs +0 -2
  210. package/dist/kernel/manager/logger/logger.schema.js +1 -55
  211. package/dist/kernel/manager/loggerManager.cjs +0 -2
  212. package/dist/kernel/manager/loggerManager.js +1 -3
  213. package/dist/kernel/manager/theme/ThemeManager.cjs +0 -2
  214. package/dist/kernel/manager/theme/ThemeManager.js +1 -76
  215. package/dist/kernel/manager/theme/index.cjs +0 -2
  216. package/dist/kernel/manager/theme/index.js +1 -3
  217. package/dist/kernel/manager/theme/theme.dom.cjs +0 -2
  218. package/dist/kernel/manager/theme/theme.dom.js +1 -45
  219. package/dist/kernel/manager/theme/theme.persistence.cjs +0 -2
  220. package/dist/kernel/manager/theme/theme.persistence.js +1 -38
  221. package/dist/kernel/manager/theme/theme.schema.cjs +0 -2
  222. package/dist/kernel/manager/theme/theme.schema.js +1 -97
  223. package/dist/kernel/manager/themeManager.cjs +0 -2
  224. package/dist/kernel/manager/themeManager.js +1 -3
  225. package/dist/kernel/types.cjs +0 -2
  226. package/dist/kernel/types.js +1 -3
  227. package/dist/library/index.cjs +0 -2
  228. package/dist/library/index.js +1 -4
  229. package/dist/library/locale/index.cjs +0 -2
  230. package/dist/library/locale/index.js +1 -12
  231. package/dist/library/locale/langs/en-us/index.cjs +0 -2
  232. package/dist/library/locale/langs/en-us/index.js +1 -24
  233. package/dist/library/locale/langs/zh-cn/index.cjs +0 -2
  234. package/dist/library/locale/langs/zh-cn/index.js +1 -24
  235. package/dist/library/locale/types.cjs +0 -2
  236. package/dist/library/locale/types.js +1 -3
  237. package/dist/library/storage/cache.cjs +0 -2
  238. package/dist/library/storage/cache.js +1 -237
  239. package/dist/library/storage/encryption.cjs +0 -2
  240. package/dist/library/storage/encryption.js +1 -141
  241. package/dist/library/storage/index.cjs +0 -2
  242. package/dist/library/storage/index.js +1 -106
  243. package/dist/state/StateManager.cjs +0 -2
  244. package/dist/state/StateManager.js +1 -160
  245. package/dist/state/adapters/AdapterFactory.cjs +0 -2
  246. package/dist/state/adapters/AdapterFactory.js +1 -85
  247. package/dist/state/adapters/DefaultAdapter.cjs +0 -2
  248. package/dist/state/adapters/DefaultAdapter.js +1 -71
  249. package/dist/state/adapters/ReduxAdapter.cjs +0 -2
  250. package/dist/state/adapters/ReduxAdapter.js +1 -439
  251. package/dist/state/adapters/ZustandAdapter.cjs +0 -2
  252. package/dist/state/adapters/ZustandAdapter.js +1 -70
  253. package/dist/state/adapters/index.cjs +0 -2
  254. package/dist/state/adapters/index.js +1 -9
  255. package/dist/state/adapters/types.cjs +0 -2
  256. package/dist/state/adapters/types.js +1 -5
  257. package/dist/state/core/DerivedStateInstance.cjs +0 -2
  258. package/dist/state/core/DerivedStateInstance.js +1 -173
  259. package/dist/state/core/StateInstance.cjs +0 -2
  260. package/dist/state/core/StateInstance.js +1 -168
  261. package/dist/state/core/StateRegistry.cjs +0 -2
  262. package/dist/state/core/StateRegistry.js +1 -106
  263. package/dist/state/core/StateScope.cjs +0 -2
  264. package/dist/state/core/StateScope.js +1 -133
  265. package/dist/state/core/index.cjs +0 -2
  266. package/dist/state/core/index.js +1 -8
  267. package/dist/state/index.cjs +0 -2
  268. package/dist/state/index.js +1 -12
  269. package/dist/state/types.cjs +0 -2
  270. package/dist/state/types.js +1 -13
  271. package/dist/state.umd.js +22 -1395
  272. package/dist/types.cjs +0 -2
  273. package/dist/types.js +1 -3
  274. package/dist/utils/analytics.cjs +0 -2
  275. package/dist/utils/analytics.js +1 -204
  276. package/dist/utils/configSecurity.cjs +0 -2
  277. package/dist/utils/configSecurity.js +3 -176
  278. package/dist/utils/csrf.cjs +0 -2
  279. package/dist/utils/csrf.js +1 -3
  280. package/dist/utils/errors/ErrorCodes.cjs +0 -2
  281. package/dist/utils/errors/ErrorCodes.js +1 -3
  282. package/dist/utils/errors.cjs +0 -2
  283. package/dist/utils/errors.js +1 -18
  284. package/dist/utils/index.cjs +0 -2
  285. package/dist/utils/index.js +1 -48
  286. package/dist/utils/logger.cjs +0 -2
  287. package/dist/utils/logger.js +1 -3
  288. package/dist/utils/logger.types.cjs +0 -2
  289. package/dist/utils/logger.types.js +1 -3
  290. package/dist/utils/monitoring.cjs +0 -2
  291. package/dist/utils/monitoring.js +1 -3
  292. package/dist/utils/performance.cjs +0 -2
  293. package/dist/utils/performance.js +1 -3
  294. package/dist/utils/resourceLoader.cjs +0 -2
  295. package/dist/utils/resourceLoader.js +1 -3
  296. package/dist/utils/runtimeSecurity.cjs +0 -2
  297. package/dist/utils/runtimeSecurity.js +1 -3
  298. package/dist/utils/security.cjs +0 -2
  299. package/dist/utils/security.js +1 -3
  300. package/dist/utils/traceId.cjs +0 -2
  301. package/dist/utils/traceId.js +1 -3
  302. package/dist/utils/validation.cjs +0 -2
  303. package/dist/utils/validation.js +1 -3
  304. package/package.json +3 -4
  305. package/dist/analytics/index.cjs.map +0 -1
  306. package/dist/analytics/index.js.map +0 -1
  307. package/dist/analytics.umd.js.map +0 -1
  308. package/dist/components/LocaleSwitch.cjs.map +0 -1
  309. package/dist/components/LocaleSwitch.js.map +0 -1
  310. package/dist/components/ThemeSwitch.cjs.map +0 -1
  311. package/dist/components/ThemeSwitch.js.map +0 -1
  312. package/dist/components/index.cjs.map +0 -1
  313. package/dist/components/index.js.map +0 -1
  314. package/dist/components/persistence.cjs.map +0 -1
  315. package/dist/components/persistence.js.map +0 -1
  316. package/dist/core/Test.cjs.map +0 -1
  317. package/dist/core/Test.js.map +0 -1
  318. package/dist/core/app/AppContext.cjs.map +0 -1
  319. package/dist/core/app/AppContext.js.map +0 -1
  320. package/dist/core/app/AppContext.types.cjs.map +0 -1
  321. package/dist/core/app/AppContext.types.js.map +0 -1
  322. package/dist/core/app/BasicLayout.cjs.map +0 -1
  323. package/dist/core/app/BasicLayout.js.map +0 -1
  324. package/dist/core/app/DefaultApp.cjs.map +0 -1
  325. package/dist/core/app/DefaultApp.js.map +0 -1
  326. package/dist/core/app/index.cjs.map +0 -1
  327. package/dist/core/app/index.js.map +0 -1
  328. package/dist/core/config/AppConfig.cjs.map +0 -1
  329. package/dist/core/config/AppConfig.js.map +0 -1
  330. package/dist/core/config/ConfigLoader.cjs.map +0 -1
  331. package/dist/core/config/ConfigLoader.js.map +0 -1
  332. package/dist/core/config/ConfigValidator.cjs.map +0 -1
  333. package/dist/core/config/ConfigValidator.js.map +0 -1
  334. package/dist/core/config/index.cjs.map +0 -1
  335. package/dist/core/config/index.js.map +0 -1
  336. package/dist/core/dev/DevTools.cjs.map +0 -1
  337. package/dist/core/dev/DevTools.js.map +0 -1
  338. package/dist/core/error/ErrorBoundary.cjs.map +0 -1
  339. package/dist/core/error/ErrorBoundary.js.map +0 -1
  340. package/dist/core/error/ErrorHandler.cjs.map +0 -1
  341. package/dist/core/error/ErrorHandler.js.map +0 -1
  342. package/dist/core/error/index.cjs.map +0 -1
  343. package/dist/core/error/index.js.map +0 -1
  344. package/dist/core/event/AppEventBus.cjs.map +0 -1
  345. package/dist/core/event/AppEventBus.js.map +0 -1
  346. package/dist/core/event/frameworkEvents.cjs.map +0 -1
  347. package/dist/core/event/frameworkEvents.js.map +0 -1
  348. package/dist/core/event/hooks.cjs.map +0 -1
  349. package/dist/core/event/hooks.js.map +0 -1
  350. package/dist/core/event/index.cjs.map +0 -1
  351. package/dist/core/event/index.js.map +0 -1
  352. package/dist/core/event/types.cjs.map +0 -1
  353. package/dist/core/event/types.js.map +0 -1
  354. package/dist/core/event/useEventBus.cjs.map +0 -1
  355. package/dist/core/event/useEventBus.js.map +0 -1
  356. package/dist/core/index.cjs.map +0 -1
  357. package/dist/core/index.js.map +0 -1
  358. package/dist/core/initialization/InitializationErrorThrower.cjs.map +0 -1
  359. package/dist/core/initialization/InitializationErrorThrower.js.map +0 -1
  360. package/dist/core/initialization/index.cjs.map +0 -1
  361. package/dist/core/initialization/index.js.map +0 -1
  362. package/dist/core/initialization/initialization.cjs.map +0 -1
  363. package/dist/core/initialization/initialization.js.map +0 -1
  364. package/dist/core/initialization/initializationErrorState.cjs.map +0 -1
  365. package/dist/core/initialization/initializationErrorState.js.map +0 -1
  366. package/dist/core/kernel/defaultAdapters.cjs.map +0 -1
  367. package/dist/core/kernel/defaultAdapters.js.map +0 -1
  368. package/dist/core/kernel/errors.cjs.map +0 -1
  369. package/dist/core/kernel/errors.js.map +0 -1
  370. package/dist/core/kernel/index.cjs.map +0 -1
  371. package/dist/core/kernel/index.js.map +0 -1
  372. package/dist/core/kernel/startKernel.cjs.map +0 -1
  373. package/dist/core/kernel/startKernel.js.map +0 -1
  374. package/dist/core/kernel/types.cjs.map +0 -1
  375. package/dist/core/kernel/types.js.map +0 -1
  376. package/dist/core/middleware.cjs.map +0 -1
  377. package/dist/core/middleware.js.map +0 -1
  378. package/dist/core/plugin/PluginEventBus.cjs.map +0 -1
  379. package/dist/core/plugin/PluginEventBus.js.map +0 -1
  380. package/dist/core/plugin/PluginSandbox.cjs.map +0 -1
  381. package/dist/core/plugin/PluginSandbox.js.map +0 -1
  382. package/dist/core/plugin.cjs.map +0 -1
  383. package/dist/core/plugin.js.map +0 -1
  384. package/dist/core/router/RouterManager.cjs.map +0 -1
  385. package/dist/core/router/RouterManager.js.map +0 -1
  386. package/dist/core/router/adapter/AdapterManager.cjs.map +0 -1
  387. package/dist/core/router/adapter/AdapterManager.js.map +0 -1
  388. package/dist/core/router/adapter/index.cjs.map +0 -1
  389. package/dist/core/router/adapter/index.js.map +0 -1
  390. package/dist/core/router/adapter/react-router/ReactRouterAdapter.cjs.map +0 -1
  391. package/dist/core/router/adapter/react-router/ReactRouterAdapter.js.map +0 -1
  392. package/dist/core/router/adapter/react-router/index.cjs.map +0 -1
  393. package/dist/core/router/adapter/react-router/index.js.map +0 -1
  394. package/dist/core/router/adapter/types.cjs.map +0 -1
  395. package/dist/core/router/adapter/types.js.map +0 -1
  396. package/dist/core/router/dev/RouterDevTools.cjs.map +0 -1
  397. package/dist/core/router/dev/RouterDevTools.js.map +0 -1
  398. package/dist/core/router/dev/index.cjs.map +0 -1
  399. package/dist/core/router/dev/index.js.map +0 -1
  400. package/dist/core/router/dynamic/DynamicRouteManager.cjs.map +0 -1
  401. package/dist/core/router/dynamic/DynamicRouteManager.js.map +0 -1
  402. package/dist/core/router/dynamic/index.cjs.map +0 -1
  403. package/dist/core/router/dynamic/index.js.map +0 -1
  404. package/dist/core/router/errors/RouterError.cjs.map +0 -1
  405. package/dist/core/router/errors/RouterError.js.map +0 -1
  406. package/dist/core/router/errors/index.cjs.map +0 -1
  407. package/dist/core/router/errors/index.js.map +0 -1
  408. package/dist/core/router/index.cjs.map +0 -1
  409. package/dist/core/router/index.js.map +0 -1
  410. package/dist/core/router/lifecycle/RouterLifecycleManager.cjs.map +0 -1
  411. package/dist/core/router/lifecycle/RouterLifecycleManager.js.map +0 -1
  412. package/dist/core/router/lifecycle/index.cjs.map +0 -1
  413. package/dist/core/router/lifecycle/index.js.map +0 -1
  414. package/dist/core/router/middleware/RouterMiddlewareManager.cjs.map +0 -1
  415. package/dist/core/router/middleware/RouterMiddlewareManager.js.map +0 -1
  416. package/dist/core/router/middleware/auth.cjs.map +0 -1
  417. package/dist/core/router/middleware/auth.js.map +0 -1
  418. package/dist/core/router/middleware/index.cjs.map +0 -1
  419. package/dist/core/router/middleware/index.js.map +0 -1
  420. package/dist/core/router/middleware/types.cjs.map +0 -1
  421. package/dist/core/router/middleware/types.js.map +0 -1
  422. package/dist/core/router/monitoring/RouterMonitoring.cjs.map +0 -1
  423. package/dist/core/router/monitoring/RouterMonitoring.js.map +0 -1
  424. package/dist/core/router/monitoring/index.cjs.map +0 -1
  425. package/dist/core/router/monitoring/index.js.map +0 -1
  426. package/dist/core/router/navigation/RouterNavigation.cjs.map +0 -1
  427. package/dist/core/router/navigation/RouterNavigation.js.map +0 -1
  428. package/dist/core/router/navigation/index.cjs.map +0 -1
  429. package/dist/core/router/navigation/index.js.map +0 -1
  430. package/dist/core/router/performance/RouteCache.cjs.map +0 -1
  431. package/dist/core/router/performance/RouteCache.js.map +0 -1
  432. package/dist/core/router/performance/RoutePreloader.cjs.map +0 -1
  433. package/dist/core/router/performance/RoutePreloader.js.map +0 -1
  434. package/dist/core/router/performance/index.cjs.map +0 -1
  435. package/dist/core/router/performance/index.js.map +0 -1
  436. package/dist/core/router/plugin/RouterPluginManager.cjs.map +0 -1
  437. package/dist/core/router/plugin/RouterPluginManager.js.map +0 -1
  438. package/dist/core/router/plugin/index.cjs.map +0 -1
  439. package/dist/core/router/plugin/index.js.map +0 -1
  440. package/dist/core/router/plugin/types.cjs.map +0 -1
  441. package/dist/core/router/plugin/types.js.map +0 -1
  442. package/dist/core/router/types.cjs.map +0 -1
  443. package/dist/core/router/types.js.map +0 -1
  444. package/dist/core/router/utils/adapters/react-router/RouteErrorBoundary.cjs.map +0 -1
  445. package/dist/core/router/utils/adapters/react-router/RouteErrorBoundary.js.map +0 -1
  446. package/dist/core/router/utils/adapters/react-router/transform.cjs.map +0 -1
  447. package/dist/core/router/utils/adapters/react-router/transform.js.map +0 -1
  448. package/dist/core/router/utils/transform.cjs.map +0 -1
  449. package/dist/core/router/utils/transform.js.map +0 -1
  450. package/dist/core/router/validation/RouterConfigValidator.cjs.map +0 -1
  451. package/dist/core/router/validation/RouterConfigValidator.js.map +0 -1
  452. package/dist/core/router/validation/index.cjs.map +0 -1
  453. package/dist/core/router/validation/index.js.map +0 -1
  454. package/dist/core/router/validation/schema.cjs.map +0 -1
  455. package/dist/core/router/validation/schema.js.map +0 -1
  456. package/dist/core/router/version/RouteVersionManager.cjs.map +0 -1
  457. package/dist/core/router/version/RouteVersionManager.js.map +0 -1
  458. package/dist/core/router/version/index.cjs.map +0 -1
  459. package/dist/core/router/version/index.js.map +0 -1
  460. package/dist/core/splash/SplashScreen.cjs.map +0 -1
  461. package/dist/core/splash/SplashScreen.js.map +0 -1
  462. package/dist/core/splash/index.cjs.map +0 -1
  463. package/dist/core/splash/index.js.map +0 -1
  464. package/dist/core/splash/splashScreenUtils.cjs.map +0 -1
  465. package/dist/core/splash/splashScreenUtils.js.map +0 -1
  466. package/dist/core/startup/AppInstance.cjs.map +0 -1
  467. package/dist/core/startup/AppInstance.js.map +0 -1
  468. package/dist/core/startup/environment.cjs.map +0 -1
  469. package/dist/core/startup/environment.js.map +0 -1
  470. package/dist/core/startup/index.cjs.map +0 -1
  471. package/dist/core/startup/index.js.map +0 -1
  472. package/dist/core/startup/initializeServices.cjs.map +0 -1
  473. package/dist/core/startup/initializeServices.js.map +0 -1
  474. package/dist/core/startup/performanceTracker.cjs.map +0 -1
  475. package/dist/core/startup/performanceTracker.js.map +0 -1
  476. package/dist/core/startup/renderApp.cjs.map +0 -1
  477. package/dist/core/startup/renderApp.js.map +0 -1
  478. package/dist/core/startup/startApp.cjs.map +0 -1
  479. package/dist/core/startup/startApp.js.map +0 -1
  480. package/dist/core/types.cjs.map +0 -1
  481. package/dist/core/types.js.map +0 -1
  482. package/dist/index.cjs.map +0 -1
  483. package/dist/index.js.map +0 -1
  484. package/dist/index.umd.cjs.map +0 -1
  485. package/dist/index.umd.js.map +0 -1
  486. package/dist/kernel/constants.cjs.map +0 -1
  487. package/dist/kernel/constants.js.map +0 -1
  488. package/dist/kernel/index.cjs.map +0 -1
  489. package/dist/kernel/index.js.map +0 -1
  490. package/dist/kernel/kernel.cjs.map +0 -1
  491. package/dist/kernel/kernel.js.map +0 -1
  492. package/dist/kernel/manager/cacheManager.cjs.map +0 -1
  493. package/dist/kernel/manager/cacheManager.js.map +0 -1
  494. package/dist/kernel/manager/i18n/I18nManager.cjs.map +0 -1
  495. package/dist/kernel/manager/i18n/I18nManager.js.map +0 -1
  496. package/dist/kernel/manager/i18n/i18n.persistence.cjs.map +0 -1
  497. package/dist/kernel/manager/i18n/i18n.persistence.js.map +0 -1
  498. package/dist/kernel/manager/i18n/i18n.schema.cjs.map +0 -1
  499. package/dist/kernel/manager/i18n/i18n.schema.js.map +0 -1
  500. package/dist/kernel/manager/i18n/index.cjs.map +0 -1
  501. package/dist/kernel/manager/i18n/index.js.map +0 -1
  502. package/dist/kernel/manager/i18nManager.cjs.map +0 -1
  503. package/dist/kernel/manager/i18nManager.js.map +0 -1
  504. package/dist/kernel/manager/index.cjs.map +0 -1
  505. package/dist/kernel/manager/index.js.map +0 -1
  506. package/dist/kernel/manager/logger/LoggerManager.cjs.map +0 -1
  507. package/dist/kernel/manager/logger/LoggerManager.js.map +0 -1
  508. package/dist/kernel/manager/logger/index.cjs.map +0 -1
  509. package/dist/kernel/manager/logger/index.js.map +0 -1
  510. package/dist/kernel/manager/logger/logger.persistence.cjs.map +0 -1
  511. package/dist/kernel/manager/logger/logger.persistence.js.map +0 -1
  512. package/dist/kernel/manager/logger/logger.schema.cjs.map +0 -1
  513. package/dist/kernel/manager/logger/logger.schema.js.map +0 -1
  514. package/dist/kernel/manager/loggerManager.cjs.map +0 -1
  515. package/dist/kernel/manager/loggerManager.js.map +0 -1
  516. package/dist/kernel/manager/persistence.cjs +0 -78
  517. package/dist/kernel/manager/persistence.cjs.map +0 -1
  518. package/dist/kernel/manager/persistence.d.ts +0 -3
  519. package/dist/kernel/manager/persistence.js +0 -60
  520. package/dist/kernel/manager/persistence.js.map +0 -1
  521. package/dist/kernel/manager/theme/ThemeManager.cjs.map +0 -1
  522. package/dist/kernel/manager/theme/ThemeManager.js.map +0 -1
  523. package/dist/kernel/manager/theme/index.cjs.map +0 -1
  524. package/dist/kernel/manager/theme/index.js.map +0 -1
  525. package/dist/kernel/manager/theme/theme.dom.cjs.map +0 -1
  526. package/dist/kernel/manager/theme/theme.dom.js.map +0 -1
  527. package/dist/kernel/manager/theme/theme.persistence.cjs.map +0 -1
  528. package/dist/kernel/manager/theme/theme.persistence.js.map +0 -1
  529. package/dist/kernel/manager/theme/theme.schema.cjs.map +0 -1
  530. package/dist/kernel/manager/theme/theme.schema.js.map +0 -1
  531. package/dist/kernel/manager/themeManager.cjs.map +0 -1
  532. package/dist/kernel/manager/themeManager.js.map +0 -1
  533. package/dist/kernel/types.cjs.map +0 -1
  534. package/dist/kernel/types.js.map +0 -1
  535. package/dist/library/index.cjs.map +0 -1
  536. package/dist/library/index.js.map +0 -1
  537. package/dist/library/locale/index.cjs.map +0 -1
  538. package/dist/library/locale/index.js.map +0 -1
  539. package/dist/library/locale/langs/en-us/index.cjs.map +0 -1
  540. package/dist/library/locale/langs/en-us/index.js.map +0 -1
  541. package/dist/library/locale/langs/zh-cn/index.cjs.map +0 -1
  542. package/dist/library/locale/langs/zh-cn/index.js.map +0 -1
  543. package/dist/library/locale/types.cjs.map +0 -1
  544. package/dist/library/locale/types.js.map +0 -1
  545. package/dist/library/storage/cache.cjs.map +0 -1
  546. package/dist/library/storage/cache.js.map +0 -1
  547. package/dist/library/storage/encryption.cjs.map +0 -1
  548. package/dist/library/storage/encryption.js.map +0 -1
  549. package/dist/library/storage/index.cjs.map +0 -1
  550. package/dist/library/storage/index.js.map +0 -1
  551. package/dist/request/adapter/RequestAdapter.d.ts +0 -85
  552. package/dist/request/adapter/RequestAdapter.js +0 -70
  553. package/dist/request/adapter/RequestAdapter.js.map +0 -1
  554. package/dist/request/adapter/axiosAdapter.d.ts +0 -10
  555. package/dist/request/adapter/axiosAdapter.js +0 -115
  556. package/dist/request/adapter/axiosAdapter.js.map +0 -1
  557. package/dist/request/adapter/fetchAdapter.d.ts +0 -10
  558. package/dist/request/adapter/fetchAdapter.js +0 -126
  559. package/dist/request/adapter/fetchAdapter.js.map +0 -1
  560. package/dist/request/adapter/index.d.ts +0 -9
  561. package/dist/request/adapter/index.js +0 -14
  562. package/dist/request/adapter/index.js.map +0 -1
  563. package/dist/request/adapter/kyAdapter.d.ts +0 -10
  564. package/dist/request/adapter/kyAdapter.js +0 -142
  565. package/dist/request/adapter/kyAdapter.js.map +0 -1
  566. package/dist/request/adapter/undiciAdapter.d.ts +0 -10
  567. package/dist/request/adapter/undiciAdapter.js +0 -164
  568. package/dist/request/adapter/undiciAdapter.js.map +0 -1
  569. package/dist/request/adapter.d.ts +0 -1
  570. package/dist/request/core/RequestClient.d.ts +0 -134
  571. package/dist/request/core/RequestClient.js +0 -509
  572. package/dist/request/core/RequestClient.js.map +0 -1
  573. package/dist/request/core/index.d.ts +0 -5
  574. package/dist/request/core/index.js +0 -5
  575. package/dist/request/core/index.js.map +0 -1
  576. package/dist/request/core.d.ts +0 -1
  577. package/dist/request/index.d.ts +0 -1
  578. package/dist/request/index.js +0 -50
  579. package/dist/request/index.js.map +0 -1
  580. package/dist/request/plugin/RequestPlugin.d.ts +0 -170
  581. package/dist/request/plugin/RequestPlugin.js +0 -203
  582. package/dist/request/plugin/RequestPlugin.js.map +0 -1
  583. package/dist/request/plugin/cache.d.ts +0 -33
  584. package/dist/request/plugin/cache.js +0 -264
  585. package/dist/request/plugin/cache.js.map +0 -1
  586. package/dist/request/plugin/csrfPlugin.d.ts +0 -21
  587. package/dist/request/plugin/csrfPlugin.js +0 -44
  588. package/dist/request/plugin/csrfPlugin.js.map +0 -1
  589. package/dist/request/plugin/index.d.ts +0 -11
  590. package/dist/request/plugin/index.js +0 -12
  591. package/dist/request/plugin/index.js.map +0 -1
  592. package/dist/request/plugin/monitoring.d.ts +0 -112
  593. package/dist/request/plugin/monitoring.js +0 -205
  594. package/dist/request/plugin/monitoring.js.map +0 -1
  595. package/dist/request/plugin/queue.d.ts +0 -91
  596. package/dist/request/plugin/queue.js +0 -156
  597. package/dist/request/plugin/queue.js.map +0 -1
  598. package/dist/request/plugin/retry.d.ts +0 -34
  599. package/dist/request/plugin/retry.js +0 -93
  600. package/dist/request/plugin/retry.js.map +0 -1
  601. package/dist/request/plugin/validation.d.ts +0 -26
  602. package/dist/request/plugin/validation.js +0 -116
  603. package/dist/request/plugin/validation.js.map +0 -1
  604. package/dist/request/plugin.d.ts +0 -1
  605. package/dist/request/runtime/RequestContext.d.ts +0 -50
  606. package/dist/request/runtime/RequestContext.js +0 -86
  607. package/dist/request/runtime/RequestContext.js.map +0 -1
  608. package/dist/request/runtime/index.d.ts +0 -4
  609. package/dist/request/runtime/index.js +0 -5
  610. package/dist/request/runtime/index.js.map +0 -1
  611. package/dist/request/runtime.d.ts +0 -1
  612. package/dist/request/types.d.ts +0 -1
  613. package/dist/request/types.js +0 -97
  614. package/dist/request/types.js.map +0 -1
  615. package/dist/request/utils/RequestQueueManager.d.ts +0 -74
  616. package/dist/request/utils/RequestQueueManager.js +0 -160
  617. package/dist/request/utils/RequestQueueManager.js.map +0 -1
  618. package/dist/request/utils/dependencyCheck.d.ts +0 -63
  619. package/dist/request/utils/dependencyCheck.js +0 -192
  620. package/dist/request/utils/dependencyCheck.js.map +0 -1
  621. package/dist/request/utils/index.d.ts +0 -5
  622. package/dist/request/utils/index.js +0 -6
  623. package/dist/request/utils/index.js.map +0 -1
  624. package/dist/request/utils.d.ts +0 -1
  625. package/dist/state/StateManager.cjs.map +0 -1
  626. package/dist/state/StateManager.js.map +0 -1
  627. package/dist/state/adapters/AdapterFactory.cjs.map +0 -1
  628. package/dist/state/adapters/AdapterFactory.js.map +0 -1
  629. package/dist/state/adapters/DefaultAdapter.cjs.map +0 -1
  630. package/dist/state/adapters/DefaultAdapter.js.map +0 -1
  631. package/dist/state/adapters/ReduxAdapter.cjs.map +0 -1
  632. package/dist/state/adapters/ReduxAdapter.js.map +0 -1
  633. package/dist/state/adapters/ZustandAdapter.cjs.map +0 -1
  634. package/dist/state/adapters/ZustandAdapter.js.map +0 -1
  635. package/dist/state/adapters/index.cjs.map +0 -1
  636. package/dist/state/adapters/index.js.map +0 -1
  637. package/dist/state/adapters/types.cjs.map +0 -1
  638. package/dist/state/adapters/types.js.map +0 -1
  639. package/dist/state/core/DerivedStateInstance.cjs.map +0 -1
  640. package/dist/state/core/DerivedStateInstance.js.map +0 -1
  641. package/dist/state/core/StateInstance.cjs.map +0 -1
  642. package/dist/state/core/StateInstance.js.map +0 -1
  643. package/dist/state/core/StateRegistry.cjs.map +0 -1
  644. package/dist/state/core/StateRegistry.js.map +0 -1
  645. package/dist/state/core/StateScope.cjs.map +0 -1
  646. package/dist/state/core/StateScope.js.map +0 -1
  647. package/dist/state/core/index.cjs.map +0 -1
  648. package/dist/state/core/index.js.map +0 -1
  649. package/dist/state/index.cjs.map +0 -1
  650. package/dist/state/index.js.map +0 -1
  651. package/dist/state/types.cjs.map +0 -1
  652. package/dist/state/types.js.map +0 -1
  653. package/dist/state.umd.js.map +0 -1
  654. package/dist/types.cjs.map +0 -1
  655. package/dist/types.js.map +0 -1
  656. package/dist/utils/analytics.cjs.map +0 -1
  657. package/dist/utils/analytics.js.map +0 -1
  658. package/dist/utils/configSecurity.cjs.map +0 -1
  659. package/dist/utils/configSecurity.js.map +0 -1
  660. package/dist/utils/csrf.cjs.map +0 -1
  661. package/dist/utils/csrf.js.map +0 -1
  662. package/dist/utils/errors/ErrorCodes.cjs.map +0 -1
  663. package/dist/utils/errors/ErrorCodes.js.map +0 -1
  664. package/dist/utils/errors.cjs.map +0 -1
  665. package/dist/utils/errors.js.map +0 -1
  666. package/dist/utils/index.cjs.map +0 -1
  667. package/dist/utils/index.js.map +0 -1
  668. package/dist/utils/logger.cjs.map +0 -1
  669. package/dist/utils/logger.js.map +0 -1
  670. package/dist/utils/logger.types.cjs.map +0 -1
  671. package/dist/utils/logger.types.js.map +0 -1
  672. package/dist/utils/monitoring.cjs.map +0 -1
  673. package/dist/utils/monitoring.js.map +0 -1
  674. package/dist/utils/performance.cjs.map +0 -1
  675. package/dist/utils/performance.js.map +0 -1
  676. package/dist/utils/resourceLoader.cjs.map +0 -1
  677. package/dist/utils/resourceLoader.js.map +0 -1
  678. package/dist/utils/runtimeSecurity.cjs.map +0 -1
  679. package/dist/utils/runtimeSecurity.js.map +0 -1
  680. package/dist/utils/security.cjs.map +0 -1
  681. package/dist/utils/security.js.map +0 -1
  682. package/dist/utils/traceId.cjs.map +0 -1
  683. package/dist/utils/traceId.js.map +0 -1
  684. package/dist/utils/validation.cjs.map +0 -1
  685. package/dist/utils/validation.js.map +0 -1
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@vlian/framework",
3
- "version": "1.2.56",
3
+ "version": "1.2.59",
4
4
  "private": false,
5
5
  "packageManager": "pnpm@10.27.0",
6
6
  "description": "Secra Framework - 一个现代化的低代码框架",
@@ -196,6 +196,7 @@
196
196
  "jsdom": "^27.4.0",
197
197
  "react": "^19.2.3",
198
198
  "react-dom": "^19.2.3",
199
+ "react-error-boundary": "^6.0.2",
199
200
  "react-i18next": "^16.5.8",
200
201
  "react-router-dom": "^7.12.0",
201
202
  "rollup": "^4.55.1",
@@ -214,6 +215,7 @@
214
215
  "react-dom": "^18.0.0 || ^19.0.0",
215
216
  "react-i18next": "^13.0.0 || ^14.0.0 || ^15.0.0 || ^16.0.0",
216
217
  "react-router-dom": "^7.0.0",
218
+ "react-error-boundary": "^6.0.0",
217
219
  "@vlian/csrf": "^0.1.2",
218
220
  "@vlian/logger": "^0.1.0",
219
221
  "@vlian/monitoring": "^0.1.0",
@@ -221,9 +223,6 @@
221
223
  "@vlian/utils": "^1.0.6"
222
224
  },
223
225
  "dependencies": {
224
- "@vlian/router": "^1.0.16",
225
- "dompurify": "^3.3.1",
226
- "react-error-boundary": "^6.0.2",
227
226
  "zod": "^4.3.5"
228
227
  },
229
228
  "publishConfig": {
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../src/analytics/index.ts"],"sourcesContent":["export { AnalyticsService, initAnalytics, getAnalytics } from '../utils/analytics';\nexport type { AnalyticsConfig, AnalyticsEvent, AnalyticsEventType } from '../utils/analytics';\n"],"names":["AnalyticsService","getAnalytics","initAnalytics"],"mappings":";;;;;;;;;;;QAASA;eAAAA,2BAAgB;;QAAiBC;eAAAA,uBAAY;;QAA3BC;eAAAA,wBAAa;;;2BAAsB"}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../src/analytics/index.ts"],"sourcesContent":["export { AnalyticsService, initAnalytics, getAnalytics } from '../utils/analytics';\nexport type { AnalyticsConfig, AnalyticsEvent, AnalyticsEventType } from '../utils/analytics';\n"],"names":["AnalyticsService","initAnalytics","getAnalytics"],"mappings":"AAAA,SAASA,gBAAgB,EAAEC,aAAa,EAAEC,YAAY,QAAQ,qBAAqB"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"analytics.umd.js","sources":["utils/analytics.js"],"sourcesContent":["function _define_property(obj, key, value) {\n if (key in obj) {\n Object.defineProperty(obj, key, {\n value: value,\n enumerable: true,\n configurable: true,\n writable: true\n });\n } else {\n obj[key] = value;\n }\n return obj;\n}\nimport { logger } from \"./logger\";\nimport { SecurityUtils } from \"./security\";\n/**\n * 分析服务类\n */ export class AnalyticsService {\n /**\n * 启动批量上报定时器\n */ startBatchTimer() {\n if (this.batchTimer) {\n return;\n }\n this.batchTimer = setInterval(()=>{\n this.flush();\n }, this.config.batchInterval);\n }\n /**\n * 停止批量上报定时器\n */ stopBatchTimer() {\n if (this.batchTimer) {\n clearInterval(this.batchTimer);\n this.batchTimer = null;\n }\n }\n /**\n * 记录事件\n */ track(event) {\n if (!this.config.enabled) {\n return;\n }\n // 采样检查\n if (Math.random() > this.config.sampleRate) {\n return;\n }\n // 匿名化处理\n const anonymizedEvent = {\n ...event,\n timestamp: Date.now(),\n properties: this.anonymizeProperties(event.properties)\n };\n // 添加到队列\n this.eventQueue.push(anonymizedEvent);\n // 立即上报单个事件\n if (this.config.onEvent) {\n this.config.onEvent(anonymizedEvent);\n }\n // 检查是否需要批量上报\n if (this.eventQueue.length >= this.config.batchSize) {\n this.flush();\n }\n }\n /**\n * 记录页面浏览\n */ trackPageView(page, properties) {\n this.track({\n type: 'pageview',\n name: 'page_view',\n properties: {\n page,\n ...properties\n }\n });\n }\n /**\n * 记录点击事件\n */ trackClick(element, properties) {\n this.track({\n type: 'click',\n name: 'click',\n properties: {\n element,\n ...properties\n }\n });\n }\n /**\n * 记录自定义事件\n */ trackCustom(name, properties) {\n this.track({\n type: 'custom',\n name,\n properties\n });\n }\n /**\n * 记录错误事件\n */ trackError(error, properties) {\n this.track({\n type: 'error',\n name: 'error',\n properties: {\n errorName: error.name,\n errorMessage: error.message,\n errorStack: error.stack,\n ...properties\n }\n });\n }\n /**\n * 记录性能事件\n */ trackPerformance(metrics, properties) {\n this.track({\n type: 'performance',\n name: 'performance',\n properties: {\n ...metrics,\n ...properties\n }\n });\n }\n /**\n * 匿名化属性(使用深度脱敏)\n */ anonymizeProperties(properties) {\n if (!this.config.anonymize || !properties) {\n return properties;\n }\n // 使用深度脱敏处理\n return SecurityUtils.deepSanitize(properties);\n }\n /**\n * 刷新队列(批量上报)\n */ flush() {\n if (this.eventQueue.length === 0) {\n return;\n }\n const events = [\n ...this.eventQueue\n ];\n this.eventQueue = [];\n if (this.config.onBatch) {\n this.config.onBatch(events);\n }\n logger.debug(`分析服务批量上报 ${events.length} 个事件`);\n }\n /**\n * 启用分析\n */ enable() {\n this.config.enabled = true;\n this.startBatchTimer();\n }\n /**\n * 禁用分析\n */ disable() {\n this.config.enabled = false;\n this.stopBatchTimer();\n this.flush();\n }\n /**\n * 销毁服务\n */ destroy() {\n this.stopBatchTimer();\n this.flush();\n }\n constructor(config = {}){\n _define_property(this, \"config\", void 0);\n _define_property(this, \"eventQueue\", []);\n _define_property(this, \"batchTimer\", null);\n this.config = {\n enabled: config.enabled ?? true,\n sampleRate: config.sampleRate ?? 1.0,\n anonymize: config.anonymize ?? true,\n onEvent: config.onEvent ?? (()=>{}),\n onBatch: config.onBatch ?? (()=>{}),\n batchSize: config.batchSize ?? 10,\n batchInterval: config.batchInterval ?? 5000\n };\n if (this.config.enabled) {\n this.startBatchTimer();\n }\n }\n}\n/**\n * 默认分析服务实例\n */ let defaultAnalyticsService = null;\n/**\n * 初始化默认分析服务\n */ export function initAnalytics(config) {\n if (!defaultAnalyticsService) {\n defaultAnalyticsService = new AnalyticsService(config);\n }\n return defaultAnalyticsService;\n}\n/**\n * 获取默认分析服务\n */ export function getAnalytics() {\n if (!defaultAnalyticsService) {\n return initAnalytics();\n }\n return defaultAnalyticsService;\n}\n\n//# sourceMappingURL=analytics.js.map"],"names":["SecurityUtils","logger"],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../src/components/LocaleSwitch.tsx"],"sourcesContent":["import React from 'react';\nimport type { CSSProperties, ReactNode } from 'react';\nimport { useLocale } from '../core';\nimport type { LangType } from '../library/locale/types';\nimport {\n type PersistenceOptions,\n readPersistedValue,\n writePersistedValue,\n} from './persistence';\n\nconst DEFAULT_LOCALE_STORAGE_KEY = 'vlian:locale';\nconst DEFAULT_LOCALES: LangType[] = ['zh-CN', 'en-US'];\nconst DEFAULT_PERSISTENCE: PersistenceOptions = { enabled: true };\n\nconst DEFAULT_LABELS: Record<LangType, string> = {\n 'zh-CN': '中文',\n 'en-US': 'English',\n};\n\nexport interface LocaleSwitchRenderContext {\n locale: LangType;\n isChanging: boolean;\n setLocale: (locale: LangType) => void;\n locales: LangType[];\n labels: Record<LangType, string>;\n}\n\nexport interface LocaleSwitchProps {\n locales?: LangType[];\n labels?: Partial<Record<LangType, string>>;\n persistence?: PersistenceOptions;\n className?: string;\n style?: CSSProperties;\n onChange?: (locale: LangType) => void;\n render?: (context: LocaleSwitchRenderContext) => ReactNode;\n}\n\nfunction isLocale(value: string): value is LangType {\n return value === 'zh-CN' || value === 'en-US';\n}\n\nexport const LocaleSwitch: React.FC<LocaleSwitchProps> = ({\n locales = DEFAULT_LOCALES,\n labels = DEFAULT_LABELS,\n persistence,\n className,\n style,\n onChange,\n render,\n}) => {\n const { locale, setLocale, isChanging } = useLocale();\n const persistenceOptions = persistence || DEFAULT_PERSISTENCE;\n const hydratedRef = React.useRef(false);\n const lastWrittenLocaleRef = React.useRef<LangType | undefined>(undefined);\n\n const mergedLabels = React.useMemo<Record<LangType, string>>(\n () => ({\n ...DEFAULT_LABELS,\n ...labels,\n }),\n [labels]\n );\n\n React.useEffect(() => {\n if (hydratedRef.current) {\n return;\n }\n hydratedRef.current = true;\n\n const persistedLocale = readPersistedValue(persistenceOptions, DEFAULT_LOCALE_STORAGE_KEY);\n if (!persistedLocale || !isLocale(persistedLocale) || !locales.includes(persistedLocale)) {\n return;\n }\n\n if (persistedLocale !== locale) {\n setLocale(persistedLocale);\n }\n }, [locale, locales, persistenceOptions, setLocale]);\n\n React.useEffect(() => {\n if (lastWrittenLocaleRef.current === locale) {\n return;\n }\n\n writePersistedValue(locale, persistenceOptions, DEFAULT_LOCALE_STORAGE_KEY);\n lastWrittenLocaleRef.current = locale;\n }, [locale, persistenceOptions]);\n\n const handleSetLocale = React.useCallback(\n (nextLocale: LangType) => {\n if (nextLocale === locale) {\n return;\n }\n setLocale(nextLocale);\n onChange?.(nextLocale);\n },\n [locale, onChange, setLocale]\n );\n\n if (render) {\n return render({\n locale,\n isChanging: Boolean(isChanging),\n setLocale: handleSetLocale,\n locales,\n labels: mergedLabels,\n });\n }\n\n return (\n <label className={className} style={style}>\n <span style={{ display: 'none' }}>Language Switch</span>\n <select\n aria-label=\"Language Switch\"\n value={locale}\n onChange={(event) => handleSetLocale(event.target.value as LangType)}\n disabled={Boolean(isChanging)}\n >\n {locales.map((item) => (\n <option key={item} value={item}>\n {mergedLabels[item]}\n </option>\n ))}\n </select>\n </label>\n );\n};\n"],"names":["LocaleSwitch","DEFAULT_LOCALE_STORAGE_KEY","DEFAULT_LOCALES","DEFAULT_PERSISTENCE","enabled","DEFAULT_LABELS","isLocale","value","locales","labels","persistence","className","style","onChange","render","locale","setLocale","isChanging","useLocale","persistenceOptions","hydratedRef","React","useRef","lastWrittenLocaleRef","undefined","mergedLabels","useMemo","useEffect","current","persistedLocale","readPersistedValue","includes","writePersistedValue","handleSetLocale","useCallback","nextLocale","Boolean","label","span","display","select","aria-label","event","target","disabled","map","item","option"],"mappings":";;;;+BAyCaA;;;eAAAA;;;;8DAzCK;sBAEQ;6BAMnB;;;;;;AAEP,MAAMC,6BAA6B;AACnC,MAAMC,kBAA8B;IAAC;IAAS;CAAQ;AACtD,MAAMC,sBAA0C;IAAEC,SAAS;AAAK;AAEhE,MAAMC,iBAA2C;IAC/C,SAAS;IACT,SAAS;AACX;AAoBA,SAASC,SAASC,KAAa;IAC7B,OAAOA,UAAU,WAAWA,UAAU;AACxC;AAEO,MAAMP,eAA4C,CAAC,EACxDQ,UAAUN,eAAe,EACzBO,SAASJ,cAAc,EACvBK,WAAW,EACXC,SAAS,EACTC,KAAK,EACLC,QAAQ,EACRC,MAAM,EACP;IACC,MAAM,EAAEC,MAAM,EAAEC,SAAS,EAAEC,UAAU,EAAE,GAAGC,IAAAA,eAAS;IACnD,MAAMC,qBAAqBT,eAAeP;IAC1C,MAAMiB,cAAcC,cAAK,CAACC,MAAM,CAAC;IACjC,MAAMC,uBAAuBF,cAAK,CAACC,MAAM,CAAuBE;IAEhE,MAAMC,eAAeJ,cAAK,CAACK,OAAO,CAChC,IAAO,CAAA;YACL,GAAGrB,cAAc;YACjB,GAAGI,MAAM;QACX,CAAA,GACA;QAACA;KAAO;IAGVY,cAAK,CAACM,SAAS,CAAC;QACd,IAAIP,YAAYQ,OAAO,EAAE;YACvB;QACF;QACAR,YAAYQ,OAAO,GAAG;QAEtB,MAAMC,kBAAkBC,IAAAA,+BAAkB,EAACX,oBAAoBlB;QAC/D,IAAI,CAAC4B,mBAAmB,CAACvB,SAASuB,oBAAoB,CAACrB,QAAQuB,QAAQ,CAACF,kBAAkB;YACxF;QACF;QAEA,IAAIA,oBAAoBd,QAAQ;YAC9BC,UAAUa;QACZ;IACF,GAAG;QAACd;QAAQP;QAASW;QAAoBH;KAAU;IAEnDK,cAAK,CAACM,SAAS,CAAC;QACd,IAAIJ,qBAAqBK,OAAO,KAAKb,QAAQ;YAC3C;QACF;QAEAiB,IAAAA,gCAAmB,EAACjB,QAAQI,oBAAoBlB;QAChDsB,qBAAqBK,OAAO,GAAGb;IACjC,GAAG;QAACA;QAAQI;KAAmB;IAE/B,MAAMc,kBAAkBZ,cAAK,CAACa,WAAW,CACvC,CAACC;QACC,IAAIA,eAAepB,QAAQ;YACzB;QACF;QACAC,UAAUmB;QACVtB,WAAWsB;IACb,GACA;QAACpB;QAAQF;QAAUG;KAAU;IAG/B,IAAIF,QAAQ;QACV,OAAOA,OAAO;YACZC;YACAE,YAAYmB,QAAQnB;YACpBD,WAAWiB;YACXzB;YACAC,QAAQgB;QACV;IACF;IAEA,qBACE,sBAACY;QAAM1B,WAAWA;QAAWC,OAAOA;;0BAClC,qBAAC0B;gBAAK1B,OAAO;oBAAE2B,SAAS;gBAAO;0BAAG;;0BAClC,qBAACC;gBACCC,cAAW;gBACXlC,OAAOQ;gBACPF,UAAU,CAAC6B,QAAUT,gBAAgBS,MAAMC,MAAM,CAACpC,KAAK;gBACvDqC,UAAUR,QAAQnB;0BAEjBT,QAAQqC,GAAG,CAAC,CAACC,qBACZ,qBAACC;wBAAkBxC,OAAOuC;kCACvBrB,YAAY,CAACqB,KAAK;uBADRA;;;;AAOvB"}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../src/components/LocaleSwitch.tsx"],"sourcesContent":["import React from 'react';\nimport type { CSSProperties, ReactNode } from 'react';\nimport { useLocale } from '../core';\nimport type { LangType } from '../library/locale/types';\nimport {\n type PersistenceOptions,\n readPersistedValue,\n writePersistedValue,\n} from './persistence';\n\nconst DEFAULT_LOCALE_STORAGE_KEY = 'vlian:locale';\nconst DEFAULT_LOCALES: LangType[] = ['zh-CN', 'en-US'];\nconst DEFAULT_PERSISTENCE: PersistenceOptions = { enabled: true };\n\nconst DEFAULT_LABELS: Record<LangType, string> = {\n 'zh-CN': '中文',\n 'en-US': 'English',\n};\n\nexport interface LocaleSwitchRenderContext {\n locale: LangType;\n isChanging: boolean;\n setLocale: (locale: LangType) => void;\n locales: LangType[];\n labels: Record<LangType, string>;\n}\n\nexport interface LocaleSwitchProps {\n locales?: LangType[];\n labels?: Partial<Record<LangType, string>>;\n persistence?: PersistenceOptions;\n className?: string;\n style?: CSSProperties;\n onChange?: (locale: LangType) => void;\n render?: (context: LocaleSwitchRenderContext) => ReactNode;\n}\n\nfunction isLocale(value: string): value is LangType {\n return value === 'zh-CN' || value === 'en-US';\n}\n\nexport const LocaleSwitch: React.FC<LocaleSwitchProps> = ({\n locales = DEFAULT_LOCALES,\n labels = DEFAULT_LABELS,\n persistence,\n className,\n style,\n onChange,\n render,\n}) => {\n const { locale, setLocale, isChanging } = useLocale();\n const persistenceOptions = persistence || DEFAULT_PERSISTENCE;\n const hydratedRef = React.useRef(false);\n const lastWrittenLocaleRef = React.useRef<LangType | undefined>(undefined);\n\n const mergedLabels = React.useMemo<Record<LangType, string>>(\n () => ({\n ...DEFAULT_LABELS,\n ...labels,\n }),\n [labels]\n );\n\n React.useEffect(() => {\n if (hydratedRef.current) {\n return;\n }\n hydratedRef.current = true;\n\n const persistedLocale = readPersistedValue(persistenceOptions, DEFAULT_LOCALE_STORAGE_KEY);\n if (!persistedLocale || !isLocale(persistedLocale) || !locales.includes(persistedLocale)) {\n return;\n }\n\n if (persistedLocale !== locale) {\n setLocale(persistedLocale);\n }\n }, [locale, locales, persistenceOptions, setLocale]);\n\n React.useEffect(() => {\n if (lastWrittenLocaleRef.current === locale) {\n return;\n }\n\n writePersistedValue(locale, persistenceOptions, DEFAULT_LOCALE_STORAGE_KEY);\n lastWrittenLocaleRef.current = locale;\n }, [locale, persistenceOptions]);\n\n const handleSetLocale = React.useCallback(\n (nextLocale: LangType) => {\n if (nextLocale === locale) {\n return;\n }\n setLocale(nextLocale);\n onChange?.(nextLocale);\n },\n [locale, onChange, setLocale]\n );\n\n if (render) {\n return render({\n locale,\n isChanging: Boolean(isChanging),\n setLocale: handleSetLocale,\n locales,\n labels: mergedLabels,\n });\n }\n\n return (\n <label className={className} style={style}>\n <span style={{ display: 'none' }}>Language Switch</span>\n <select\n aria-label=\"Language Switch\"\n value={locale}\n onChange={(event) => handleSetLocale(event.target.value as LangType)}\n disabled={Boolean(isChanging)}\n >\n {locales.map((item) => (\n <option key={item} value={item}>\n {mergedLabels[item]}\n </option>\n ))}\n </select>\n </label>\n );\n};\n"],"names":["React","useLocale","readPersistedValue","writePersistedValue","DEFAULT_LOCALE_STORAGE_KEY","DEFAULT_LOCALES","DEFAULT_PERSISTENCE","enabled","DEFAULT_LABELS","isLocale","value","LocaleSwitch","locales","labels","persistence","className","style","onChange","render","locale","setLocale","isChanging","persistenceOptions","hydratedRef","useRef","lastWrittenLocaleRef","undefined","mergedLabels","useMemo","useEffect","current","persistedLocale","includes","handleSetLocale","useCallback","nextLocale","Boolean","label","span","display","select","aria-label","event","target","disabled","map","item","option"],"mappings":";AAAA,OAAOA,WAAW,QAAQ;AAE1B,SAASC,SAAS,QAAQ,UAAU;AAEpC,SAEEC,kBAAkB,EAClBC,mBAAmB,QACd,gBAAgB;AAEvB,MAAMC,6BAA6B;AACnC,MAAMC,kBAA8B;IAAC;IAAS;CAAQ;AACtD,MAAMC,sBAA0C;IAAEC,SAAS;AAAK;AAEhE,MAAMC,iBAA2C;IAC/C,SAAS;IACT,SAAS;AACX;AAoBA,SAASC,SAASC,KAAa;IAC7B,OAAOA,UAAU,WAAWA,UAAU;AACxC;AAEA,OAAO,MAAMC,eAA4C,CAAC,EACxDC,UAAUP,eAAe,EACzBQ,SAASL,cAAc,EACvBM,WAAW,EACXC,SAAS,EACTC,KAAK,EACLC,QAAQ,EACRC,MAAM,EACP;IACC,MAAM,EAAEC,MAAM,EAAEC,SAAS,EAAEC,UAAU,EAAE,GAAGpB;IAC1C,MAAMqB,qBAAqBR,eAAeR;IAC1C,MAAMiB,cAAcvB,MAAMwB,MAAM,CAAC;IACjC,MAAMC,uBAAuBzB,MAAMwB,MAAM,CAAuBE;IAEhE,MAAMC,eAAe3B,MAAM4B,OAAO,CAChC,IAAO,CAAA;YACL,GAAGpB,cAAc;YACjB,GAAGK,MAAM;QACX,CAAA,GACA;QAACA;KAAO;IAGVb,MAAM6B,SAAS,CAAC;QACd,IAAIN,YAAYO,OAAO,EAAE;YACvB;QACF;QACAP,YAAYO,OAAO,GAAG;QAEtB,MAAMC,kBAAkB7B,mBAAmBoB,oBAAoBlB;QAC/D,IAAI,CAAC2B,mBAAmB,CAACtB,SAASsB,oBAAoB,CAACnB,QAAQoB,QAAQ,CAACD,kBAAkB;YACxF;QACF;QAEA,IAAIA,oBAAoBZ,QAAQ;YAC9BC,UAAUW;QACZ;IACF,GAAG;QAACZ;QAAQP;QAASU;QAAoBF;KAAU;IAEnDpB,MAAM6B,SAAS,CAAC;QACd,IAAIJ,qBAAqBK,OAAO,KAAKX,QAAQ;YAC3C;QACF;QAEAhB,oBAAoBgB,QAAQG,oBAAoBlB;QAChDqB,qBAAqBK,OAAO,GAAGX;IACjC,GAAG;QAACA;QAAQG;KAAmB;IAE/B,MAAMW,kBAAkBjC,MAAMkC,WAAW,CACvC,CAACC;QACC,IAAIA,eAAehB,QAAQ;YACzB;QACF;QACAC,UAAUe;QACVlB,WAAWkB;IACb,GACA;QAAChB;QAAQF;QAAUG;KAAU;IAG/B,IAAIF,QAAQ;QACV,OAAOA,OAAO;YACZC;YACAE,YAAYe,QAAQf;YACpBD,WAAWa;YACXrB;YACAC,QAAQc;QACV;IACF;IAEA,qBACE,MAACU;QAAMtB,WAAWA;QAAWC,OAAOA;;0BAClC,KAACsB;gBAAKtB,OAAO;oBAAEuB,SAAS;gBAAO;0BAAG;;0BAClC,KAACC;gBACCC,cAAW;gBACX/B,OAAOS;gBACPF,UAAU,CAACyB,QAAUT,gBAAgBS,MAAMC,MAAM,CAACjC,KAAK;gBACvDkC,UAAUR,QAAQf;0BAEjBT,QAAQiC,GAAG,CAAC,CAACC,qBACZ,KAACC;wBAAkBrC,OAAOoC;kCACvBnB,YAAY,CAACmB,KAAK;uBADRA;;;;AAOvB,EAAE"}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../src/components/ThemeSwitch.tsx"],"sourcesContent":["import React from 'react';\nimport type { CSSProperties, ReactNode } from 'react';\nimport { useTheme } from '../core';\nimport type { ThemeMode } from '../core/kernel';\nimport {\n type PersistenceOptions,\n readPersistedValue,\n writePersistedValue,\n} from './persistence';\n\nconst DEFAULT_THEME_STORAGE_KEY = 'vlian:theme-mode';\nconst DEFAULT_MODES: ThemeMode[] = ['light', 'dark', 'system'];\nconst DEFAULT_PERSISTENCE: PersistenceOptions = { enabled: true };\n\nconst DEFAULT_LABELS: Record<ThemeMode, string> = {\n light: '浅色',\n dark: '深色',\n system: '跟随系统',\n};\n\nexport interface ThemeSwitchRenderContext {\n mode: ThemeMode;\n setMode: (mode: ThemeMode) => void;\n modes: ThemeMode[];\n labels: Record<ThemeMode, string>;\n}\n\nexport interface ThemeSwitchProps {\n modes?: ThemeMode[];\n labels?: Partial<Record<ThemeMode, string>>;\n persistence?: PersistenceOptions;\n className?: string;\n style?: CSSProperties;\n onChange?: (mode: ThemeMode) => void;\n render?: (context: ThemeSwitchRenderContext) => ReactNode;\n}\n\nfunction isThemeMode(value: string): value is ThemeMode {\n return value === 'light' || value === 'dark' || value === 'system';\n}\n\nexport const ThemeSwitch: React.FC<ThemeSwitchProps> = ({\n modes = DEFAULT_MODES,\n labels = DEFAULT_LABELS,\n persistence,\n className,\n style,\n onChange,\n render,\n}) => {\n const { theme, setTheme } = useTheme();\n const persistenceOptions = persistence || DEFAULT_PERSISTENCE;\n const hydratedRef = React.useRef(false);\n const lastWrittenModeRef = React.useRef<ThemeMode | undefined>(undefined);\n\n const mergedLabels = React.useMemo<Record<ThemeMode, string>>(\n () => ({\n ...DEFAULT_LABELS,\n ...labels,\n }),\n [labels]\n );\n\n React.useEffect(() => {\n if (hydratedRef.current) {\n return;\n }\n hydratedRef.current = true;\n\n const persistedMode = readPersistedValue(persistenceOptions, DEFAULT_THEME_STORAGE_KEY);\n if (!persistedMode || !isThemeMode(persistedMode) || !modes.includes(persistedMode)) {\n return;\n }\n\n if (persistedMode !== theme.mode) {\n setTheme((prev) => ({\n ...prev,\n mode: persistedMode,\n }));\n }\n }, [modes, persistenceOptions, setTheme, theme.mode]);\n\n React.useEffect(() => {\n const mode = theme.mode;\n if (!mode || lastWrittenModeRef.current === mode) {\n return;\n }\n\n writePersistedValue(mode, persistenceOptions, DEFAULT_THEME_STORAGE_KEY);\n lastWrittenModeRef.current = mode;\n }, [persistenceOptions, theme.mode]);\n\n const currentMode: ThemeMode = (theme.mode || 'light') as ThemeMode;\n\n const setMode = React.useCallback(\n (mode: ThemeMode) => {\n if (mode === currentMode) {\n return;\n }\n setTheme((prev) => ({\n ...prev,\n mode,\n }));\n onChange?.(mode);\n },\n [currentMode, onChange, setTheme]\n );\n\n if (render) {\n return render({\n mode: currentMode,\n setMode,\n modes,\n labels: mergedLabels,\n });\n }\n\n return (\n <div className={className} style={style} role=\"group\" aria-label=\"Theme Switch\">\n {modes.map((mode) => (\n <button\n key={mode}\n type=\"button\"\n onClick={() => setMode(mode)}\n aria-pressed={currentMode === mode}\n >\n {mergedLabels[mode]}\n </button>\n ))}\n </div>\n );\n};\n"],"names":["ThemeSwitch","DEFAULT_THEME_STORAGE_KEY","DEFAULT_MODES","DEFAULT_PERSISTENCE","enabled","DEFAULT_LABELS","light","dark","system","isThemeMode","value","modes","labels","persistence","className","style","onChange","render","theme","setTheme","useTheme","persistenceOptions","hydratedRef","React","useRef","lastWrittenModeRef","undefined","mergedLabels","useMemo","useEffect","current","persistedMode","readPersistedValue","includes","mode","prev","writePersistedValue","currentMode","setMode","useCallback","div","role","aria-label","map","button","type","onClick","aria-pressed"],"mappings":";;;;+BAyCaA;;;eAAAA;;;;8DAzCK;sBAEO;6BAMlB;;;;;;AAEP,MAAMC,4BAA4B;AAClC,MAAMC,gBAA6B;IAAC;IAAS;IAAQ;CAAS;AAC9D,MAAMC,sBAA0C;IAAEC,SAAS;AAAK;AAEhE,MAAMC,iBAA4C;IAChDC,OAAO;IACPC,MAAM;IACNC,QAAQ;AACV;AAmBA,SAASC,YAAYC,KAAa;IAChC,OAAOA,UAAU,WAAWA,UAAU,UAAUA,UAAU;AAC5D;AAEO,MAAMV,cAA0C,CAAC,EACtDW,QAAQT,aAAa,EACrBU,SAASP,cAAc,EACvBQ,WAAW,EACXC,SAAS,EACTC,KAAK,EACLC,QAAQ,EACRC,MAAM,EACP;IACC,MAAM,EAAEC,KAAK,EAAEC,QAAQ,EAAE,GAAGC,IAAAA,cAAQ;IACpC,MAAMC,qBAAqBR,eAAeV;IAC1C,MAAMmB,cAAcC,cAAK,CAACC,MAAM,CAAC;IACjC,MAAMC,qBAAqBF,cAAK,CAACC,MAAM,CAAwBE;IAE/D,MAAMC,eAAeJ,cAAK,CAACK,OAAO,CAChC,IAAO,CAAA;YACL,GAAGvB,cAAc;YACjB,GAAGO,MAAM;QACX,CAAA,GACA;QAACA;KAAO;IAGVW,cAAK,CAACM,SAAS,CAAC;QACd,IAAIP,YAAYQ,OAAO,EAAE;YACvB;QACF;QACAR,YAAYQ,OAAO,GAAG;QAEtB,MAAMC,gBAAgBC,IAAAA,+BAAkB,EAACX,oBAAoBpB;QAC7D,IAAI,CAAC8B,iBAAiB,CAACtB,YAAYsB,kBAAkB,CAACpB,MAAMsB,QAAQ,CAACF,gBAAgB;YACnF;QACF;QAEA,IAAIA,kBAAkBb,MAAMgB,IAAI,EAAE;YAChCf,SAAS,CAACgB,OAAU,CAAA;oBAClB,GAAGA,IAAI;oBACPD,MAAMH;gBACR,CAAA;QACF;IACF,GAAG;QAACpB;QAAOU;QAAoBF;QAAUD,MAAMgB,IAAI;KAAC;IAEpDX,cAAK,CAACM,SAAS,CAAC;QACd,MAAMK,OAAOhB,MAAMgB,IAAI;QACvB,IAAI,CAACA,QAAQT,mBAAmBK,OAAO,KAAKI,MAAM;YAChD;QACF;QAEAE,IAAAA,gCAAmB,EAACF,MAAMb,oBAAoBpB;QAC9CwB,mBAAmBK,OAAO,GAAGI;IAC/B,GAAG;QAACb;QAAoBH,MAAMgB,IAAI;KAAC;IAEnC,MAAMG,cAA0BnB,MAAMgB,IAAI,IAAI;IAE9C,MAAMI,UAAUf,cAAK,CAACgB,WAAW,CAC/B,CAACL;QACC,IAAIA,SAASG,aAAa;YACxB;QACF;QACAlB,SAAS,CAACgB,OAAU,CAAA;gBAClB,GAAGA,IAAI;gBACPD;YACF,CAAA;QACAlB,WAAWkB;IACb,GACA;QAACG;QAAarB;QAAUG;KAAS;IAGnC,IAAIF,QAAQ;QACV,OAAOA,OAAO;YACZiB,MAAMG;YACNC;YACA3B;YACAC,QAAQe;QACV;IACF;IAEA,qBACE,qBAACa;QAAI1B,WAAWA;QAAWC,OAAOA;QAAO0B,MAAK;QAAQC,cAAW;kBAC9D/B,MAAMgC,GAAG,CAAC,CAACT,qBACV,qBAACU;gBAECC,MAAK;gBACLC,SAAS,IAAMR,QAAQJ;gBACvBa,gBAAcV,gBAAgBH;0BAE7BP,YAAY,CAACO,KAAK;eALdA;;AAUf"}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../src/components/ThemeSwitch.tsx"],"sourcesContent":["import React from 'react';\nimport type { CSSProperties, ReactNode } from 'react';\nimport { useTheme } from '../core';\nimport type { ThemeMode } from '../core/kernel';\nimport {\n type PersistenceOptions,\n readPersistedValue,\n writePersistedValue,\n} from './persistence';\n\nconst DEFAULT_THEME_STORAGE_KEY = 'vlian:theme-mode';\nconst DEFAULT_MODES: ThemeMode[] = ['light', 'dark', 'system'];\nconst DEFAULT_PERSISTENCE: PersistenceOptions = { enabled: true };\n\nconst DEFAULT_LABELS: Record<ThemeMode, string> = {\n light: '浅色',\n dark: '深色',\n system: '跟随系统',\n};\n\nexport interface ThemeSwitchRenderContext {\n mode: ThemeMode;\n setMode: (mode: ThemeMode) => void;\n modes: ThemeMode[];\n labels: Record<ThemeMode, string>;\n}\n\nexport interface ThemeSwitchProps {\n modes?: ThemeMode[];\n labels?: Partial<Record<ThemeMode, string>>;\n persistence?: PersistenceOptions;\n className?: string;\n style?: CSSProperties;\n onChange?: (mode: ThemeMode) => void;\n render?: (context: ThemeSwitchRenderContext) => ReactNode;\n}\n\nfunction isThemeMode(value: string): value is ThemeMode {\n return value === 'light' || value === 'dark' || value === 'system';\n}\n\nexport const ThemeSwitch: React.FC<ThemeSwitchProps> = ({\n modes = DEFAULT_MODES,\n labels = DEFAULT_LABELS,\n persistence,\n className,\n style,\n onChange,\n render,\n}) => {\n const { theme, setTheme } = useTheme();\n const persistenceOptions = persistence || DEFAULT_PERSISTENCE;\n const hydratedRef = React.useRef(false);\n const lastWrittenModeRef = React.useRef<ThemeMode | undefined>(undefined);\n\n const mergedLabels = React.useMemo<Record<ThemeMode, string>>(\n () => ({\n ...DEFAULT_LABELS,\n ...labels,\n }),\n [labels]\n );\n\n React.useEffect(() => {\n if (hydratedRef.current) {\n return;\n }\n hydratedRef.current = true;\n\n const persistedMode = readPersistedValue(persistenceOptions, DEFAULT_THEME_STORAGE_KEY);\n if (!persistedMode || !isThemeMode(persistedMode) || !modes.includes(persistedMode)) {\n return;\n }\n\n if (persistedMode !== theme.mode) {\n setTheme((prev) => ({\n ...prev,\n mode: persistedMode,\n }));\n }\n }, [modes, persistenceOptions, setTheme, theme.mode]);\n\n React.useEffect(() => {\n const mode = theme.mode;\n if (!mode || lastWrittenModeRef.current === mode) {\n return;\n }\n\n writePersistedValue(mode, persistenceOptions, DEFAULT_THEME_STORAGE_KEY);\n lastWrittenModeRef.current = mode;\n }, [persistenceOptions, theme.mode]);\n\n const currentMode: ThemeMode = (theme.mode || 'light') as ThemeMode;\n\n const setMode = React.useCallback(\n (mode: ThemeMode) => {\n if (mode === currentMode) {\n return;\n }\n setTheme((prev) => ({\n ...prev,\n mode,\n }));\n onChange?.(mode);\n },\n [currentMode, onChange, setTheme]\n );\n\n if (render) {\n return render({\n mode: currentMode,\n setMode,\n modes,\n labels: mergedLabels,\n });\n }\n\n return (\n <div className={className} style={style} role=\"group\" aria-label=\"Theme Switch\">\n {modes.map((mode) => (\n <button\n key={mode}\n type=\"button\"\n onClick={() => setMode(mode)}\n aria-pressed={currentMode === mode}\n >\n {mergedLabels[mode]}\n </button>\n ))}\n </div>\n );\n};\n"],"names":["React","useTheme","readPersistedValue","writePersistedValue","DEFAULT_THEME_STORAGE_KEY","DEFAULT_MODES","DEFAULT_PERSISTENCE","enabled","DEFAULT_LABELS","light","dark","system","isThemeMode","value","ThemeSwitch","modes","labels","persistence","className","style","onChange","render","theme","setTheme","persistenceOptions","hydratedRef","useRef","lastWrittenModeRef","undefined","mergedLabels","useMemo","useEffect","current","persistedMode","includes","mode","prev","currentMode","setMode","useCallback","div","role","aria-label","map","button","type","onClick","aria-pressed"],"mappings":";AAAA,OAAOA,WAAW,QAAQ;AAE1B,SAASC,QAAQ,QAAQ,UAAU;AAEnC,SAEEC,kBAAkB,EAClBC,mBAAmB,QACd,gBAAgB;AAEvB,MAAMC,4BAA4B;AAClC,MAAMC,gBAA6B;IAAC;IAAS;IAAQ;CAAS;AAC9D,MAAMC,sBAA0C;IAAEC,SAAS;AAAK;AAEhE,MAAMC,iBAA4C;IAChDC,OAAO;IACPC,MAAM;IACNC,QAAQ;AACV;AAmBA,SAASC,YAAYC,KAAa;IAChC,OAAOA,UAAU,WAAWA,UAAU,UAAUA,UAAU;AAC5D;AAEA,OAAO,MAAMC,cAA0C,CAAC,EACtDC,QAAQV,aAAa,EACrBW,SAASR,cAAc,EACvBS,WAAW,EACXC,SAAS,EACTC,KAAK,EACLC,QAAQ,EACRC,MAAM,EACP;IACC,MAAM,EAAEC,KAAK,EAAEC,QAAQ,EAAE,GAAGtB;IAC5B,MAAMuB,qBAAqBP,eAAeX;IAC1C,MAAMmB,cAAczB,MAAM0B,MAAM,CAAC;IACjC,MAAMC,qBAAqB3B,MAAM0B,MAAM,CAAwBE;IAE/D,MAAMC,eAAe7B,MAAM8B,OAAO,CAChC,IAAO,CAAA;YACL,GAAGtB,cAAc;YACjB,GAAGQ,MAAM;QACX,CAAA,GACA;QAACA;KAAO;IAGVhB,MAAM+B,SAAS,CAAC;QACd,IAAIN,YAAYO,OAAO,EAAE;YACvB;QACF;QACAP,YAAYO,OAAO,GAAG;QAEtB,MAAMC,gBAAgB/B,mBAAmBsB,oBAAoBpB;QAC7D,IAAI,CAAC6B,iBAAiB,CAACrB,YAAYqB,kBAAkB,CAAClB,MAAMmB,QAAQ,CAACD,gBAAgB;YACnF;QACF;QAEA,IAAIA,kBAAkBX,MAAMa,IAAI,EAAE;YAChCZ,SAAS,CAACa,OAAU,CAAA;oBAClB,GAAGA,IAAI;oBACPD,MAAMF;gBACR,CAAA;QACF;IACF,GAAG;QAAClB;QAAOS;QAAoBD;QAAUD,MAAMa,IAAI;KAAC;IAEpDnC,MAAM+B,SAAS,CAAC;QACd,MAAMI,OAAOb,MAAMa,IAAI;QACvB,IAAI,CAACA,QAAQR,mBAAmBK,OAAO,KAAKG,MAAM;YAChD;QACF;QAEAhC,oBAAoBgC,MAAMX,oBAAoBpB;QAC9CuB,mBAAmBK,OAAO,GAAGG;IAC/B,GAAG;QAACX;QAAoBF,MAAMa,IAAI;KAAC;IAEnC,MAAME,cAA0Bf,MAAMa,IAAI,IAAI;IAE9C,MAAMG,UAAUtC,MAAMuC,WAAW,CAC/B,CAACJ;QACC,IAAIA,SAASE,aAAa;YACxB;QACF;QACAd,SAAS,CAACa,OAAU,CAAA;gBAClB,GAAGA,IAAI;gBACPD;YACF,CAAA;QACAf,WAAWe;IACb,GACA;QAACE;QAAajB;QAAUG;KAAS;IAGnC,IAAIF,QAAQ;QACV,OAAOA,OAAO;YACZc,MAAME;YACNC;YACAvB;YACAC,QAAQa;QACV;IACF;IAEA,qBACE,KAACW;QAAItB,WAAWA;QAAWC,OAAOA;QAAOsB,MAAK;QAAQC,cAAW;kBAC9D3B,MAAM4B,GAAG,CAAC,CAACR,qBACV,KAACS;gBAECC,MAAK;gBACLC,SAAS,IAAMR,QAAQH;gBACvBY,gBAAcV,gBAAgBF;0BAE7BN,YAAY,CAACM,KAAK;eALdA;;AAUf,EAAE"}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../src/components/index.ts"],"sourcesContent":["export { ThemeSwitch } from './ThemeSwitch';\nexport type { ThemeSwitchProps, ThemeSwitchRenderContext } from './ThemeSwitch';\n\nexport { LocaleSwitch } from './LocaleSwitch';\nexport type { LocaleSwitchProps, LocaleSwitchRenderContext } from './LocaleSwitch';\n\nexport type { PersistenceOptions, StorageLike } from './persistence';\n"],"names":["LocaleSwitch","ThemeSwitch"],"mappings":";;;;;;;;;;;QAGSA;eAAAA,0BAAY;;QAHZC;eAAAA,wBAAW;;;6BAAQ;8BAGC"}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../src/components/index.ts"],"sourcesContent":["export { ThemeSwitch } from './ThemeSwitch';\nexport type { ThemeSwitchProps, ThemeSwitchRenderContext } from './ThemeSwitch';\n\nexport { LocaleSwitch } from './LocaleSwitch';\nexport type { LocaleSwitchProps, LocaleSwitchRenderContext } from './LocaleSwitch';\n\nexport type { PersistenceOptions, StorageLike } from './persistence';\n"],"names":["ThemeSwitch","LocaleSwitch"],"mappings":"AAAA,SAASA,WAAW,QAAQ,gBAAgB;AAG5C,SAASC,YAAY,QAAQ,iBAAiB"}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../src/components/persistence.ts"],"sourcesContent":["export interface StorageLike {\n getItem(key: string): string | null;\n setItem(key: string, value: string): void;\n}\n\nexport interface PersistenceOptions {\n enabled?: boolean;\n key?: string;\n storage?: StorageLike;\n}\n\nexport function resolveStorage(storage?: StorageLike): StorageLike | null {\n if (storage) {\n return storage;\n }\n\n if (typeof window === 'undefined' || !window.localStorage) {\n return null;\n }\n\n return window.localStorage;\n}\n\nexport function readPersistedValue(\n options: PersistenceOptions,\n defaultKey: string\n): string | null {\n if (options.enabled === false) {\n return null;\n }\n\n const targetStorage = resolveStorage(options.storage);\n if (!targetStorage) {\n return null;\n }\n\n try {\n return targetStorage.getItem(options.key || defaultKey);\n } catch {\n return null;\n }\n}\n\nexport function writePersistedValue(\n value: string | undefined,\n options: PersistenceOptions,\n defaultKey: string\n): void {\n if (options.enabled === false || !value) {\n return;\n }\n\n const targetStorage = resolveStorage(options.storage);\n if (!targetStorage) {\n return;\n }\n\n try {\n targetStorage.setItem(options.key || defaultKey, value);\n } catch {\n // Ignore storage write failures (private mode / quota / disabled storage).\n }\n}\n"],"names":["readPersistedValue","resolveStorage","writePersistedValue","storage","window","localStorage","options","defaultKey","enabled","targetStorage","getItem","key","value","setItem"],"mappings":";;;;;;;;;;;QAuBgBA;eAAAA;;QAZAC;eAAAA;;QAgCAC;eAAAA;;;AAhCT,SAASD,eAAeE,OAAqB;IAClD,IAAIA,SAAS;QACX,OAAOA;IACT;IAEA,IAAI,OAAOC,WAAW,eAAe,CAACA,OAAOC,YAAY,EAAE;QACzD,OAAO;IACT;IAEA,OAAOD,OAAOC,YAAY;AAC5B;AAEO,SAASL,mBACdM,OAA2B,EAC3BC,UAAkB;IAElB,IAAID,QAAQE,OAAO,KAAK,OAAO;QAC7B,OAAO;IACT;IAEA,MAAMC,gBAAgBR,eAAeK,QAAQH,OAAO;IACpD,IAAI,CAACM,eAAe;QAClB,OAAO;IACT;IAEA,IAAI;QACF,OAAOA,cAAcC,OAAO,CAACJ,QAAQK,GAAG,IAAIJ;IAC9C,EAAE,OAAM;QACN,OAAO;IACT;AACF;AAEO,SAASL,oBACdU,KAAyB,EACzBN,OAA2B,EAC3BC,UAAkB;IAElB,IAAID,QAAQE,OAAO,KAAK,SAAS,CAACI,OAAO;QACvC;IACF;IAEA,MAAMH,gBAAgBR,eAAeK,QAAQH,OAAO;IACpD,IAAI,CAACM,eAAe;QAClB;IACF;IAEA,IAAI;QACFA,cAAcI,OAAO,CAACP,QAAQK,GAAG,IAAIJ,YAAYK;IACnD,EAAE,OAAM;IACN,2EAA2E;IAC7E;AACF"}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../src/components/persistence.ts"],"sourcesContent":["export interface StorageLike {\n getItem(key: string): string | null;\n setItem(key: string, value: string): void;\n}\n\nexport interface PersistenceOptions {\n enabled?: boolean;\n key?: string;\n storage?: StorageLike;\n}\n\nexport function resolveStorage(storage?: StorageLike): StorageLike | null {\n if (storage) {\n return storage;\n }\n\n if (typeof window === 'undefined' || !window.localStorage) {\n return null;\n }\n\n return window.localStorage;\n}\n\nexport function readPersistedValue(\n options: PersistenceOptions,\n defaultKey: string\n): string | null {\n if (options.enabled === false) {\n return null;\n }\n\n const targetStorage = resolveStorage(options.storage);\n if (!targetStorage) {\n return null;\n }\n\n try {\n return targetStorage.getItem(options.key || defaultKey);\n } catch {\n return null;\n }\n}\n\nexport function writePersistedValue(\n value: string | undefined,\n options: PersistenceOptions,\n defaultKey: string\n): void {\n if (options.enabled === false || !value) {\n return;\n }\n\n const targetStorage = resolveStorage(options.storage);\n if (!targetStorage) {\n return;\n }\n\n try {\n targetStorage.setItem(options.key || defaultKey, value);\n } catch {\n // Ignore storage write failures (private mode / quota / disabled storage).\n }\n}\n"],"names":["resolveStorage","storage","window","localStorage","readPersistedValue","options","defaultKey","enabled","targetStorage","getItem","key","writePersistedValue","value","setItem"],"mappings":"AAWA,OAAO,SAASA,eAAeC,OAAqB;IAClD,IAAIA,SAAS;QACX,OAAOA;IACT;IAEA,IAAI,OAAOC,WAAW,eAAe,CAACA,OAAOC,YAAY,EAAE;QACzD,OAAO;IACT;IAEA,OAAOD,OAAOC,YAAY;AAC5B;AAEA,OAAO,SAASC,mBACdC,OAA2B,EAC3BC,UAAkB;IAElB,IAAID,QAAQE,OAAO,KAAK,OAAO;QAC7B,OAAO;IACT;IAEA,MAAMC,gBAAgBR,eAAeK,QAAQJ,OAAO;IACpD,IAAI,CAACO,eAAe;QAClB,OAAO;IACT;IAEA,IAAI;QACF,OAAOA,cAAcC,OAAO,CAACJ,QAAQK,GAAG,IAAIJ;IAC9C,EAAE,OAAM;QACN,OAAO;IACT;AACF;AAEA,OAAO,SAASK,oBACdC,KAAyB,EACzBP,OAA2B,EAC3BC,UAAkB;IAElB,IAAID,QAAQE,OAAO,KAAK,SAAS,CAACK,OAAO;QACvC;IACF;IAEA,MAAMJ,gBAAgBR,eAAeK,QAAQJ,OAAO;IACpD,IAAI,CAACO,eAAe;QAClB;IACF;IAEA,IAAI;QACFA,cAAcK,OAAO,CAACR,QAAQK,GAAG,IAAIJ,YAAYM;IACnD,EAAE,OAAM;IACN,2EAA2E;IAC7E;AACF"}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../src/core/Test.tsx"],"sourcesContent":["import React, { useEffect } from \"react\";\nimport { logger } from '@vlian/logger';\n\nconst App: React.FC<{onComplete: () => void}> = ({onComplete}) => {\n useEffect(() => {\n logger.info('App mounted');\n onComplete()\n }, []);\n return (\n <div>App</div>\n );\n}\n\nexport default App;\n"],"names":["App","onComplete","useEffect","logger","info","div"],"mappings":";;;;+BAaA;;;eAAA;;;;+DAbiC;wBACV;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAEvB,MAAMA,MAA0C,CAAC,EAACC,UAAU,EAAC;IACzDC,IAAAA,gBAAS,EAAC;QACPC,cAAM,CAACC,IAAI,CAAC;QACXH;IACJ,GAAG,EAAE;IACL,qBACI,qBAACI;kBAAI;;AAEb;MAEA,WAAeL"}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../src/core/Test.tsx"],"sourcesContent":["import React, { useEffect } from \"react\";\nimport { logger } from '@vlian/logger';\n\nconst App: React.FC<{onComplete: () => void}> = ({onComplete}) => {\n useEffect(() => {\n logger.info('App mounted');\n onComplete()\n }, []);\n return (\n <div>App</div>\n );\n}\n\nexport default App;\n"],"names":["React","useEffect","logger","App","onComplete","info","div"],"mappings":";AAAA,OAAOA,SAASC,SAAS,QAAQ,QAAQ;AACzC,SAASC,MAAM,QAAQ,gBAAgB;AAEvC,MAAMC,MAA0C,CAAC,EAACC,UAAU,EAAC;IACzDH,UAAU;QACPC,OAAOG,IAAI,CAAC;QACXD;IACJ,GAAG,EAAE;IACL,qBACI,KAACE;kBAAI;;AAEb;AAEA,eAAeH,IAAI"}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../../src/core/app/AppContext.tsx"],"sourcesContent":["import React, { createContext, useContext, useState, useCallback, useMemo, useEffect } from 'react';\nimport type { PropsWithChildren } from 'react';\nimport { setLang } from '../../library';\nimport type { LangType } from '../../library/locale/types';\nimport type { InitializationContext } from '../initialization';\nimport type {\n ThemeContextValue,\n LocaleContextValue,\n ConfigContextValue,\n AppContextValue,\n ThemeConfig,\n} from './AppContext.types';\nimport { appConfig } from '../config/AppConfig';\nimport type { StateManager } from '../../state';\nimport type { UIAppConfig, UIProviderConfig } from '../types';\n\n/**\n * 主题上下文\n */\nconst ThemeContext = createContext<ThemeContextValue | undefined>(undefined);\n\n/**\n * 国际化上下文\n */\nconst LocaleContext = createContext<LocaleContextValue | undefined>(undefined);\n\n/**\n * 配置上下文\n */\nconst ConfigContext = createContext<ConfigContextValue | undefined>(undefined);\n\n/**\n * 状态管理器上下文\n */\nconst StateManagerContext = createContext<import('./AppContext.types').StateManagerContextValue | undefined>(undefined);\n\n/**\n * 主题 Provider 属性\n */\ninterface ThemeProviderProps extends PropsWithChildren {\n /**\n * 初始主题配置\n */\n initialTheme?: ThemeConfig;\n}\n\n/**\n * 主题 Provider 组件\n */\nconst ThemeProvider: React.FC<ThemeProviderProps> = React.memo(({ children, initialTheme }) => {\n const [theme, setThemeState] = useState<ThemeConfig>(initialTheme || appConfig.getTheme());\n\n const applyDocumentThemeClass = useCallback((mode?: ThemeConfig['mode']) => {\n if (typeof window === 'undefined') {\n return;\n }\n\n const html = document.documentElement;\n html.classList.remove('light', 'dark');\n\n const resolvedMode = mode === 'system'\n ? (window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light')\n : (mode || 'light');\n\n html.classList.add(resolvedMode);\n }, []);\n\n // 同步到单例\n useEffect(() => {\n appConfig.setTheme(theme);\n }, [theme]);\n\n // 同步到文档 class,确保首屏与刷新时也能正确反映主题\n useEffect(() => {\n if (typeof window === 'undefined') {\n return;\n }\n\n applyDocumentThemeClass(theme.mode);\n\n if (theme.mode !== 'system') {\n return;\n }\n\n const mediaQuery = window.matchMedia('(prefers-color-scheme: dark)');\n const onSystemThemeChange = () => applyDocumentThemeClass('system');\n\n if (typeof mediaQuery.addEventListener === 'function') {\n mediaQuery.addEventListener('change', onSystemThemeChange);\n return () => mediaQuery.removeEventListener('change', onSystemThemeChange);\n }\n\n mediaQuery.addListener(onSystemThemeChange);\n return () => mediaQuery.removeListener(onSystemThemeChange);\n }, [applyDocumentThemeClass, theme.mode]);\n\n // 更新主题\n const setTheme = useCallback((newTheme: ThemeConfig | ((prev: ThemeConfig) => ThemeConfig)) => {\n setThemeState((prev) => {\n return typeof newTheme === 'function' ? newTheme(prev) : newTheme;\n });\n }, []);\n\n const value: ThemeContextValue = useMemo(\n () => ({\n theme,\n setTheme,\n }),\n [theme, setTheme]\n );\n\n return <ThemeContext.Provider value={value}>{children}</ThemeContext.Provider>;\n});\n\nThemeProvider.displayName = 'ThemeProvider';\n\n/**\n * 国际化 Provider 属性\n */\ninterface LocaleProviderProps extends PropsWithChildren {\n /**\n * 初始语言\n */\n initialLocale?: LangType;\n}\n\n/**\n * 国际化 Provider 组件\n */\nconst LocaleProvider: React.FC<LocaleProviderProps> = React.memo(({ children, initialLocale }) => {\n const [locale, setLocaleState] = useState<LangType>(initialLocale || appConfig.getLocale());\n const [isChanging, setIsChanging] = useState(false);\n\n // 同步到单例\n useEffect(() => {\n appConfig.setLocale(locale);\n }, [locale]);\n\n // 更新语言,添加加载状态\n const setLocale = useCallback(\n (newLocale: LangType) => {\n if (newLocale === locale) {\n return;\n }\n setIsChanging(true);\n setLocaleState(newLocale);\n setLang(newLocale);\n // 使用 requestAnimationFrame 确保状态更新在下一帧\n requestAnimationFrame(() => {\n setIsChanging(false);\n });\n },\n [locale]\n );\n\n const value: LocaleContextValue = useMemo(\n () => ({\n locale,\n setLocale,\n isChanging,\n }),\n [locale, setLocale, isChanging]\n );\n\n return <LocaleContext.Provider value={value}>{children}</LocaleContext.Provider>;\n});\n\nLocaleProvider.displayName = 'LocaleProvider';\n\n/**\n * 配置 Provider 属性\n */\ninterface AppConfigProviderProps extends PropsWithChildren {\n /**\n * 初始 Ant Design 配置\n */\n initialAntdConfig?: UIProviderConfig;\n /**\n * 初始初始化上下文\n */\n initialInitializationContext?: InitializationContext;\n}\n\n/**\n * 配置 Provider 组件\n */\nconst AppConfigProvider: React.FC<AppConfigProviderProps> = React.memo(({\n children,\n initialAntdConfig,\n initialInitializationContext,\n}) => {\n const [antdConfig, setAntdConfigState] = useState<UIProviderConfig | undefined>(\n initialAntdConfig || appConfig.getAntdConfig()\n );\n const [initializationContext, setInitializationContextState] = useState<\n InitializationContext | undefined\n >(initialInitializationContext || appConfig.getInitializationContext());\n\n // 同步到单例\n useEffect(() => {\n appConfig.setAntdConfig(antdConfig);\n }, [antdConfig]);\n\n useEffect(() => {\n appConfig.setInitializationContext(initializationContext);\n }, [initializationContext]);\n\n // 更新 Ant Design 配置\n const setAntdConfig = useCallback((config: UIProviderConfig | undefined) => {\n setAntdConfigState(config);\n }, []);\n\n // 更新初始化上下文\n const setInitializationContext = useCallback((context: InitializationContext | undefined) => {\n setInitializationContextState(context);\n }, []);\n\n const value: ConfigContextValue = useMemo(\n () => ({\n antdConfig,\n initializationContext,\n setAntdConfig,\n setInitializationContext,\n }),\n [antdConfig, initializationContext, setAntdConfig, setInitializationContext]\n );\n\n return <ConfigContext.Provider value={value}>{children}</ConfigContext.Provider>;\n});\n\nAppConfigProvider.displayName = 'AppConfigProvider';\n\n/**\n * 应用上下文 Provider 属性\n */\nexport interface AppContextProviderProps extends PropsWithChildren {\n /**\n * 初始主题配置\n */\n initialTheme?: ThemeConfig;\n /**\n * 初始国际化语言\n */\n initialLocale?: LangType;\n /**\n * 初始 Ant Design 配置\n */\n initialAntdConfig?: UIProviderConfig;\n /**\n * 初始初始化上下文\n */\n initialInitializationContext?: InitializationContext;\n /**\n * 状态管理器实例\n */\n stateManager?: StateManager | null;\n /**\n * UI App 基础配置\n * \n * 用于传递 UI 适配层的应用级配置(如消息、通知、弹窗容器)。\n */\n antdApp?: UIAppConfig;\n /**\n * UI App 配置(无框架绑定)\n */\n uiApp?: UIAppConfig;\n}\n\n/**\n * 应用上下文 Provider 组件\n * \n * 组合所有 Provider,提供统一的全局上下文\n * \n * @example\n * ```tsx\n * <AppContextProvider\n * initialTheme={{ mode: 'light', primaryColor: '#1890ff' }}\n * initialLocale=\"zh-CN\"\n * >\n * <App />\n * </AppContextProvider>\n * ```\n */\n/**\n * 状态管理器 Provider 组件\n */\nconst StateManagerProvider: React.FC<PropsWithChildren<{ stateManager?: StateManager | null }>> = React.memo(({ children, stateManager }) => {\n const value = useMemo(\n () => ({\n stateManager: stateManager ?? null,\n }),\n [stateManager]\n );\n\n return <StateManagerContext.Provider value={value}>{children}</StateManagerContext.Provider>;\n});\n\nStateManagerProvider.displayName = 'StateManagerProvider';\n\nexport const AppContextProvider: React.FC<AppContextProviderProps> = ({\n children,\n initialTheme,\n initialLocale,\n initialAntdConfig,\n initialInitializationContext,\n stateManager,\n antdApp: _antdApp,\n uiApp: _uiApp,\n}) => {\n // 初始化单例配置(仅执行一次)\n const initializedRef = React.useRef(false);\n React.useEffect(() => {\n if (!initializedRef.current) {\n appConfig.initialize({\n theme: initialTheme,\n locale: initialLocale,\n antdConfig: initialAntdConfig,\n initializationContext: initialInitializationContext,\n });\n initializedRef.current = true;\n }\n }, [initialTheme, initialLocale, initialAntdConfig, initialInitializationContext]);\n\n return (\n <ThemeProvider initialTheme={initialTheme}>\n <LocaleProvider initialLocale={initialLocale}>\n <AppConfigProvider\n initialAntdConfig={initialAntdConfig}\n initialInitializationContext={initialInitializationContext}\n >\n <StateManagerProvider stateManager={stateManager}>\n {children}\n </StateManagerProvider>\n </AppConfigProvider>\n </LocaleProvider>\n </ThemeProvider>\n );\n};\n\n/**\n * 使用主题上下文 Hook\n * \n * @returns 主题上下文值\n * @throws 如果不在 ThemeProvider 内使用会抛出错误\n * \n * @example\n * ```tsx\n * const { theme, setTheme } = useTheme();\n * \n * // 切换主题\n * setTheme({ mode: 'dark' });\n * ```\n */\nexport const useTheme = (): ThemeContextValue => {\n const context = useContext(ThemeContext);\n if (context === undefined) {\n throw new Error('useTheme 必须在 AppContextProvider 内使用');\n }\n return context;\n};\n\n/**\n * 使用国际化上下文 Hook\n * \n * @returns 国际化上下文值\n * @throws 如果不在 LocaleProvider 内使用会抛出错误\n * \n * @example\n * ```tsx\n * const { locale, setLocale } = useLocale();\n * \n * // 切换语言\n * setLocale('en-US');\n * ```\n */\nexport const useLocale = (): LocaleContextValue => {\n const context = useContext(LocaleContext);\n if (context === undefined) {\n throw new Error('useLocale 必须在 AppContextProvider 内使用');\n }\n return context;\n};\n\n/**\n * 使用配置上下文 Hook\n * \n * @returns 配置上下文值\n * @throws 如果不在 ConfigProvider 内使用会抛出错误\n */\nexport const useConfig = (): ConfigContextValue => {\n const context = useContext(ConfigContext);\n if (context === undefined) {\n throw new Error('useConfig 必须在 AppContextProvider 内使用');\n }\n return context;\n};\n\n/**\n * 使用应用上下文 Hook(聚合所有上下文)\n * \n * @returns 应用上下文值\n * @throws 如果不在 AppContextProvider 内使用会抛出错误\n * \n * @example\n * ```tsx\n * const { theme, setTheme, locale, setLocale, antdConfig } = useAppContext();\n * \n * // 切换主题\n * setTheme({ mode: 'dark' });\n * \n * // 切换语言\n * setLocale('en-US');\n * ```\n */\n/**\n * 使用状态管理器 Hook\n * \n * @returns 状态管理器实例\n * @throws 如果不在 AppContextProvider 内使用会抛出错误\n * \n * @example\n * ```tsx\n * const stateManager = useStateManager();\n * \n * // 创建状态实例\n * const countState = stateManager?.createState(0);\n * ```\n */\nexport const useStateManager = (): StateManager | null => {\n const context = useContext(StateManagerContext);\n if (context === undefined) {\n throw new Error('useStateManager 必须在 AppContextProvider 内使用');\n }\n return context.stateManager;\n};\n\nexport const useAppContext = (): AppContextValue => {\n const themeContext = useTheme();\n const localeContext = useLocale();\n const configContext = useConfig();\n const stateManagerContext = useStateManager();\n\n // 优化:使用更细粒度的依赖项,避免不必要的重新计算\n // 只依赖实际变化的值,函数引用是稳定的\n return useMemo(\n () => ({\n theme: themeContext.theme,\n locale: localeContext.locale,\n antdConfig: configContext.antdConfig,\n initializationContext: configContext.initializationContext,\n stateManager: stateManagerContext,\n setTheme: themeContext.setTheme,\n setLocale: localeContext.setLocale,\n setAntdConfig: configContext.setAntdConfig,\n setInitializationContext: configContext.setInitializationContext,\n }),\n [\n themeContext.theme,\n localeContext.locale,\n configContext.antdConfig,\n configContext.initializationContext,\n stateManagerContext,\n // 函数引用是稳定的,不需要作为依赖\n themeContext.setTheme,\n localeContext.setLocale,\n configContext.setAntdConfig,\n configContext.setInitializationContext,\n ]\n );\n};\n"],"names":["AppContextProvider","useAppContext","useConfig","useLocale","useStateManager","useTheme","ThemeContext","createContext","undefined","LocaleContext","ConfigContext","StateManagerContext","ThemeProvider","React","memo","children","initialTheme","theme","setThemeState","useState","appConfig","getTheme","applyDocumentThemeClass","useCallback","mode","window","html","document","documentElement","classList","remove","resolvedMode","matchMedia","matches","add","useEffect","setTheme","mediaQuery","onSystemThemeChange","addEventListener","removeEventListener","addListener","removeListener","newTheme","prev","value","useMemo","Provider","displayName","LocaleProvider","initialLocale","locale","setLocaleState","getLocale","isChanging","setIsChanging","setLocale","newLocale","setLang","requestAnimationFrame","AppConfigProvider","initialAntdConfig","initialInitializationContext","antdConfig","setAntdConfigState","getAntdConfig","initializationContext","setInitializationContextState","getInitializationContext","setAntdConfig","setInitializationContext","config","context","StateManagerProvider","stateManager","antdApp","_antdApp","uiApp","_uiApp","initializedRef","useRef","current","initialize","useContext","Error","themeContext","localeContext","configContext","stateManagerContext"],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../../src/core/app/AppContext.tsx"],"sourcesContent":["import React, { createContext, useContext, useState, useCallback, useMemo, useEffect } from 'react';\nimport type { PropsWithChildren } from 'react';\nimport { setLang } from '../../library';\nimport type { LangType } from '../../library/locale/types';\nimport type { InitializationContext } from '../initialization';\nimport type {\n ThemeContextValue,\n LocaleContextValue,\n ConfigContextValue,\n AppContextValue,\n ThemeConfig,\n} from './AppContext.types';\nimport { appConfig } from '../config/AppConfig';\nimport type { StateManager } from '../../state';\nimport type { UIAppConfig, UIProviderConfig } from '../types';\n\n/**\n * 主题上下文\n */\nconst ThemeContext = createContext<ThemeContextValue | undefined>(undefined);\n\n/**\n * 国际化上下文\n */\nconst LocaleContext = createContext<LocaleContextValue | undefined>(undefined);\n\n/**\n * 配置上下文\n */\nconst ConfigContext = createContext<ConfigContextValue | undefined>(undefined);\n\n/**\n * 状态管理器上下文\n */\nconst StateManagerContext = createContext<import('./AppContext.types').StateManagerContextValue | undefined>(undefined);\n\n/**\n * 主题 Provider 属性\n */\ninterface ThemeProviderProps extends PropsWithChildren {\n /**\n * 初始主题配置\n */\n initialTheme?: ThemeConfig;\n}\n\n/**\n * 主题 Provider 组件\n */\nconst ThemeProvider: React.FC<ThemeProviderProps> = React.memo(({ children, initialTheme }) => {\n const [theme, setThemeState] = useState<ThemeConfig>(initialTheme || appConfig.getTheme());\n\n const applyDocumentThemeClass = useCallback((mode?: ThemeConfig['mode']) => {\n if (typeof window === 'undefined') {\n return;\n }\n\n const html = document.documentElement;\n html.classList.remove('light', 'dark');\n\n const resolvedMode = mode === 'system'\n ? (window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light')\n : (mode || 'light');\n\n html.classList.add(resolvedMode);\n }, []);\n\n // 同步到单例\n useEffect(() => {\n appConfig.setTheme(theme);\n }, [theme]);\n\n // 同步到文档 class,确保首屏与刷新时也能正确反映主题\n useEffect(() => {\n if (typeof window === 'undefined') {\n return;\n }\n\n applyDocumentThemeClass(theme.mode);\n\n if (theme.mode !== 'system') {\n return;\n }\n\n const mediaQuery = window.matchMedia('(prefers-color-scheme: dark)');\n const onSystemThemeChange = () => applyDocumentThemeClass('system');\n\n if (typeof mediaQuery.addEventListener === 'function') {\n mediaQuery.addEventListener('change', onSystemThemeChange);\n return () => mediaQuery.removeEventListener('change', onSystemThemeChange);\n }\n\n mediaQuery.addListener(onSystemThemeChange);\n return () => mediaQuery.removeListener(onSystemThemeChange);\n }, [applyDocumentThemeClass, theme.mode]);\n\n // 更新主题\n const setTheme = useCallback((newTheme: ThemeConfig | ((prev: ThemeConfig) => ThemeConfig)) => {\n setThemeState((prev) => {\n return typeof newTheme === 'function' ? newTheme(prev) : newTheme;\n });\n }, []);\n\n const value: ThemeContextValue = useMemo(\n () => ({\n theme,\n setTheme,\n }),\n [theme, setTheme]\n );\n\n return <ThemeContext.Provider value={value}>{children}</ThemeContext.Provider>;\n});\n\nThemeProvider.displayName = 'ThemeProvider';\n\n/**\n * 国际化 Provider 属性\n */\ninterface LocaleProviderProps extends PropsWithChildren {\n /**\n * 初始语言\n */\n initialLocale?: LangType;\n}\n\n/**\n * 国际化 Provider 组件\n */\nconst LocaleProvider: React.FC<LocaleProviderProps> = React.memo(({ children, initialLocale }) => {\n const [locale, setLocaleState] = useState<LangType>(initialLocale || appConfig.getLocale());\n const [isChanging, setIsChanging] = useState(false);\n\n // 同步到单例\n useEffect(() => {\n appConfig.setLocale(locale);\n }, [locale]);\n\n // 更新语言,添加加载状态\n const setLocale = useCallback(\n (newLocale: LangType) => {\n if (newLocale === locale) {\n return;\n }\n setIsChanging(true);\n setLocaleState(newLocale);\n setLang(newLocale);\n // 使用 requestAnimationFrame 确保状态更新在下一帧\n requestAnimationFrame(() => {\n setIsChanging(false);\n });\n },\n [locale]\n );\n\n const value: LocaleContextValue = useMemo(\n () => ({\n locale,\n setLocale,\n isChanging,\n }),\n [locale, setLocale, isChanging]\n );\n\n return <LocaleContext.Provider value={value}>{children}</LocaleContext.Provider>;\n});\n\nLocaleProvider.displayName = 'LocaleProvider';\n\n/**\n * 配置 Provider 属性\n */\ninterface AppConfigProviderProps extends PropsWithChildren {\n /**\n * 初始 Ant Design 配置\n */\n initialAntdConfig?: UIProviderConfig;\n /**\n * 初始初始化上下文\n */\n initialInitializationContext?: InitializationContext;\n}\n\n/**\n * 配置 Provider 组件\n */\nconst AppConfigProvider: React.FC<AppConfigProviderProps> = React.memo(({\n children,\n initialAntdConfig,\n initialInitializationContext,\n}) => {\n const [antdConfig, setAntdConfigState] = useState<UIProviderConfig | undefined>(\n initialAntdConfig || appConfig.getAntdConfig()\n );\n const [initializationContext, setInitializationContextState] = useState<\n InitializationContext | undefined\n >(initialInitializationContext || appConfig.getInitializationContext());\n\n // 同步到单例\n useEffect(() => {\n appConfig.setAntdConfig(antdConfig);\n }, [antdConfig]);\n\n useEffect(() => {\n appConfig.setInitializationContext(initializationContext);\n }, [initializationContext]);\n\n // 更新 Ant Design 配置\n const setAntdConfig = useCallback((config: UIProviderConfig | undefined) => {\n setAntdConfigState(config);\n }, []);\n\n // 更新初始化上下文\n const setInitializationContext = useCallback((context: InitializationContext | undefined) => {\n setInitializationContextState(context);\n }, []);\n\n const value: ConfigContextValue = useMemo(\n () => ({\n antdConfig,\n initializationContext,\n setAntdConfig,\n setInitializationContext,\n }),\n [antdConfig, initializationContext, setAntdConfig, setInitializationContext]\n );\n\n return <ConfigContext.Provider value={value}>{children}</ConfigContext.Provider>;\n});\n\nAppConfigProvider.displayName = 'AppConfigProvider';\n\n/**\n * 应用上下文 Provider 属性\n */\nexport interface AppContextProviderProps extends PropsWithChildren {\n /**\n * 初始主题配置\n */\n initialTheme?: ThemeConfig;\n /**\n * 初始国际化语言\n */\n initialLocale?: LangType;\n /**\n * 初始 Ant Design 配置\n */\n initialAntdConfig?: UIProviderConfig;\n /**\n * 初始初始化上下文\n */\n initialInitializationContext?: InitializationContext;\n /**\n * 状态管理器实例\n */\n stateManager?: StateManager | null;\n /**\n * UI App 基础配置\n * \n * 用于传递 UI 适配层的应用级配置(如消息、通知、弹窗容器)。\n */\n antdApp?: UIAppConfig;\n /**\n * UI App 配置(无框架绑定)\n */\n uiApp?: UIAppConfig;\n}\n\n/**\n * 应用上下文 Provider 组件\n * \n * 组合所有 Provider,提供统一的全局上下文\n * \n * @example\n * ```tsx\n * <AppContextProvider\n * initialTheme={{ mode: 'light', primaryColor: '#1890ff' }}\n * initialLocale=\"zh-CN\"\n * >\n * <App />\n * </AppContextProvider>\n * ```\n */\n/**\n * 状态管理器 Provider 组件\n */\nconst StateManagerProvider: React.FC<PropsWithChildren<{ stateManager?: StateManager | null }>> = React.memo(({ children, stateManager }) => {\n const value = useMemo(\n () => ({\n stateManager: stateManager ?? null,\n }),\n [stateManager]\n );\n\n return <StateManagerContext.Provider value={value}>{children}</StateManagerContext.Provider>;\n});\n\nStateManagerProvider.displayName = 'StateManagerProvider';\n\nexport const AppContextProvider: React.FC<AppContextProviderProps> = ({\n children,\n initialTheme,\n initialLocale,\n initialAntdConfig,\n initialInitializationContext,\n stateManager,\n antdApp: _antdApp,\n uiApp: _uiApp,\n}) => {\n // 初始化单例配置(仅执行一次)\n const initializedRef = React.useRef(false);\n React.useEffect(() => {\n if (!initializedRef.current) {\n appConfig.initialize({\n theme: initialTheme,\n locale: initialLocale,\n antdConfig: initialAntdConfig,\n initializationContext: initialInitializationContext,\n });\n initializedRef.current = true;\n }\n }, [initialTheme, initialLocale, initialAntdConfig, initialInitializationContext]);\n\n return (\n <ThemeProvider initialTheme={initialTheme}>\n <LocaleProvider initialLocale={initialLocale}>\n <AppConfigProvider\n initialAntdConfig={initialAntdConfig}\n initialInitializationContext={initialInitializationContext}\n >\n <StateManagerProvider stateManager={stateManager}>\n {children}\n </StateManagerProvider>\n </AppConfigProvider>\n </LocaleProvider>\n </ThemeProvider>\n );\n};\n\n/**\n * 使用主题上下文 Hook\n * \n * @returns 主题上下文值\n * @throws 如果不在 ThemeProvider 内使用会抛出错误\n * \n * @example\n * ```tsx\n * const { theme, setTheme } = useTheme();\n * \n * // 切换主题\n * setTheme({ mode: 'dark' });\n * ```\n */\nexport const useTheme = (): ThemeContextValue => {\n const context = useContext(ThemeContext);\n if (context === undefined) {\n throw new Error('useTheme 必须在 AppContextProvider 内使用');\n }\n return context;\n};\n\n/**\n * 使用国际化上下文 Hook\n * \n * @returns 国际化上下文值\n * @throws 如果不在 LocaleProvider 内使用会抛出错误\n * \n * @example\n * ```tsx\n * const { locale, setLocale } = useLocale();\n * \n * // 切换语言\n * setLocale('en-US');\n * ```\n */\nexport const useLocale = (): LocaleContextValue => {\n const context = useContext(LocaleContext);\n if (context === undefined) {\n throw new Error('useLocale 必须在 AppContextProvider 内使用');\n }\n return context;\n};\n\n/**\n * 使用配置上下文 Hook\n * \n * @returns 配置上下文值\n * @throws 如果不在 ConfigProvider 内使用会抛出错误\n */\nexport const useConfig = (): ConfigContextValue => {\n const context = useContext(ConfigContext);\n if (context === undefined) {\n throw new Error('useConfig 必须在 AppContextProvider 内使用');\n }\n return context;\n};\n\n/**\n * 使用应用上下文 Hook(聚合所有上下文)\n * \n * @returns 应用上下文值\n * @throws 如果不在 AppContextProvider 内使用会抛出错误\n * \n * @example\n * ```tsx\n * const { theme, setTheme, locale, setLocale, antdConfig } = useAppContext();\n * \n * // 切换主题\n * setTheme({ mode: 'dark' });\n * \n * // 切换语言\n * setLocale('en-US');\n * ```\n */\n/**\n * 使用状态管理器 Hook\n * \n * @returns 状态管理器实例\n * @throws 如果不在 AppContextProvider 内使用会抛出错误\n * \n * @example\n * ```tsx\n * const stateManager = useStateManager();\n * \n * // 创建状态实例\n * const countState = stateManager?.createState(0);\n * ```\n */\nexport const useStateManager = (): StateManager | null => {\n const context = useContext(StateManagerContext);\n if (context === undefined) {\n throw new Error('useStateManager 必须在 AppContextProvider 内使用');\n }\n return context.stateManager;\n};\n\nexport const useAppContext = (): AppContextValue => {\n const themeContext = useTheme();\n const localeContext = useLocale();\n const configContext = useConfig();\n const stateManagerContext = useStateManager();\n\n // 优化:使用更细粒度的依赖项,避免不必要的重新计算\n // 只依赖实际变化的值,函数引用是稳定的\n return useMemo(\n () => ({\n theme: themeContext.theme,\n locale: localeContext.locale,\n antdConfig: configContext.antdConfig,\n initializationContext: configContext.initializationContext,\n stateManager: stateManagerContext,\n setTheme: themeContext.setTheme,\n setLocale: localeContext.setLocale,\n setAntdConfig: configContext.setAntdConfig,\n setInitializationContext: configContext.setInitializationContext,\n }),\n [\n themeContext.theme,\n localeContext.locale,\n configContext.antdConfig,\n configContext.initializationContext,\n stateManagerContext,\n // 函数引用是稳定的,不需要作为依赖\n themeContext.setTheme,\n localeContext.setLocale,\n configContext.setAntdConfig,\n configContext.setInitializationContext,\n ]\n );\n};\n"],"names":["React","createContext","useContext","useState","useCallback","useMemo","useEffect","setLang","appConfig","ThemeContext","undefined","LocaleContext","ConfigContext","StateManagerContext","ThemeProvider","memo","children","initialTheme","theme","setThemeState","getTheme","applyDocumentThemeClass","mode","window","html","document","documentElement","classList","remove","resolvedMode","matchMedia","matches","add","setTheme","mediaQuery","onSystemThemeChange","addEventListener","removeEventListener","addListener","removeListener","newTheme","prev","value","Provider","displayName","LocaleProvider","initialLocale","locale","setLocaleState","getLocale","isChanging","setIsChanging","setLocale","newLocale","requestAnimationFrame","AppConfigProvider","initialAntdConfig","initialInitializationContext","antdConfig","setAntdConfigState","getAntdConfig","initializationContext","setInitializationContextState","getInitializationContext","setAntdConfig","setInitializationContext","config","context","StateManagerProvider","stateManager","AppContextProvider","antdApp","_antdApp","uiApp","_uiApp","initializedRef","useRef","current","initialize","useTheme","Error","useLocale","useConfig","useStateManager","useAppContext","themeContext","localeContext","configContext","stateManagerContext"],"mappings":";AAAA,OAAOA,SAASC,aAAa,EAAEC,UAAU,EAAEC,QAAQ,EAAEC,WAAW,EAAEC,OAAO,EAAEC,SAAS,QAAQ,QAAQ;AAEpG,SAASC,OAAO,QAAQ,gBAAgB;AAUxC,SAASC,SAAS,QAAQ,sBAAsB;AAIhD;;CAEC,GACD,MAAMC,6BAAeR,cAA6CS;AAElE;;CAEC,GACD,MAAMC,8BAAgBV,cAA8CS;AAEpE;;CAEC,GACD,MAAME,8BAAgBX,cAA8CS;AAEpE;;CAEC,GACD,MAAMG,oCAAsBZ,cAAiFS;AAY7G;;CAEC,GACD,MAAMI,8BAA8Cd,MAAMe,IAAI,CAAC,CAAC,EAAEC,QAAQ,EAAEC,YAAY,EAAE;IACtF,MAAM,CAACC,OAAOC,cAAc,GAAGhB,SAAsBc,gBAAgBT,UAAUY,QAAQ;IAEvF,MAAMC,0BAA0BjB,YAAY,CAACkB;QACzC,IAAI,OAAOC,WAAW,aAAa;YAC/B;QACJ;QAEA,MAAMC,OAAOC,SAASC,eAAe;QACrCF,KAAKG,SAAS,CAACC,MAAM,CAAC,SAAS;QAE/B,MAAMC,eAAeP,SAAS,WACvBC,OAAOO,UAAU,CAAC,gCAAgCC,OAAO,GAAG,SAAS,UACrET,QAAQ;QAEfE,KAAKG,SAAS,CAACK,GAAG,CAACH;IACvB,GAAG,EAAE;IAEL,QAAQ;IACRvB,UAAU;QACNE,UAAUyB,QAAQ,CAACf;IACvB,GAAG;QAACA;KAAM;IAEV,+BAA+B;IAC/BZ,UAAU;QACN,IAAI,OAAOiB,WAAW,aAAa;YAC/B;QACJ;QAEAF,wBAAwBH,MAAMI,IAAI;QAElC,IAAIJ,MAAMI,IAAI,KAAK,UAAU;YACzB;QACJ;QAEA,MAAMY,aAAaX,OAAOO,UAAU,CAAC;QACrC,MAAMK,sBAAsB,IAAMd,wBAAwB;QAE1D,IAAI,OAAOa,WAAWE,gBAAgB,KAAK,YAAY;YACnDF,WAAWE,gBAAgB,CAAC,UAAUD;YACtC,OAAO,IAAMD,WAAWG,mBAAmB,CAAC,UAAUF;QAC1D;QAEAD,WAAWI,WAAW,CAACH;QACvB,OAAO,IAAMD,WAAWK,cAAc,CAACJ;IAC3C,GAAG;QAACd;QAAyBH,MAAMI,IAAI;KAAC;IAExC,OAAO;IACP,MAAMW,WAAW7B,YAAY,CAACoC;QAC1BrB,cAAc,CAACsB;YACX,OAAO,OAAOD,aAAa,aAAaA,SAASC,QAAQD;QAC7D;IACJ,GAAG,EAAE;IAEL,MAAME,QAA2BrC,QAC7B,IAAO,CAAA;YACHa;YACAe;QACJ,CAAA,GACA;QAACf;QAAOe;KAAS;IAGrB,qBAAO,KAACxB,aAAakC,QAAQ;QAACD,OAAOA;kBAAQ1B;;AACjD;AAEAF,cAAc8B,WAAW,GAAG;AAY5B;;CAEC,GACD,MAAMC,+BAAgD7C,MAAMe,IAAI,CAAC,CAAC,EAAEC,QAAQ,EAAE8B,aAAa,EAAE;IACzF,MAAM,CAACC,QAAQC,eAAe,GAAG7C,SAAmB2C,iBAAiBtC,UAAUyC,SAAS;IACxF,MAAM,CAACC,YAAYC,cAAc,GAAGhD,SAAS;IAE7C,QAAQ;IACRG,UAAU;QACNE,UAAU4C,SAAS,CAACL;IACxB,GAAG;QAACA;KAAO;IAEX,cAAc;IACd,MAAMK,YAAYhD,YACd,CAACiD;QACG,IAAIA,cAAcN,QAAQ;YACtB;QACJ;QACAI,cAAc;QACdH,eAAeK;QACf9C,QAAQ8C;QACR,sCAAsC;QACtCC,sBAAsB;YAClBH,cAAc;QAClB;IACJ,GACA;QAACJ;KAAO;IAGZ,MAAML,QAA4BrC,QAC9B,IAAO,CAAA;YACH0C;YACAK;YACAF;QACJ,CAAA,GACA;QAACH;QAAQK;QAAWF;KAAW;IAGnC,qBAAO,KAACvC,cAAcgC,QAAQ;QAACD,OAAOA;kBAAQ1B;;AAClD;AAEA6B,eAAeD,WAAW,GAAG;AAgB7B;;CAEC,GACD,MAAMW,kCAAsDvD,MAAMe,IAAI,CAAC,CAAC,EACpEC,QAAQ,EACRwC,iBAAiB,EACjBC,4BAA4B,EAC/B;IACG,MAAM,CAACC,YAAYC,mBAAmB,GAAGxD,SACrCqD,qBAAqBhD,UAAUoD,aAAa;IAEhD,MAAM,CAACC,uBAAuBC,8BAA8B,GAAG3D,SAE7DsD,gCAAgCjD,UAAUuD,wBAAwB;IAEpE,QAAQ;IACRzD,UAAU;QACNE,UAAUwD,aAAa,CAACN;IAC5B,GAAG;QAACA;KAAW;IAEfpD,UAAU;QACNE,UAAUyD,wBAAwB,CAACJ;IACvC,GAAG;QAACA;KAAsB;IAE1B,mBAAmB;IACnB,MAAMG,gBAAgB5D,YAAY,CAAC8D;QAC/BP,mBAAmBO;IACvB,GAAG,EAAE;IAEL,WAAW;IACX,MAAMD,2BAA2B7D,YAAY,CAAC+D;QAC1CL,8BAA8BK;IAClC,GAAG,EAAE;IAEL,MAAMzB,QAA4BrC,QAC9B,IAAO,CAAA;YACHqD;YACAG;YACAG;YACAC;QACJ,CAAA,GACA;QAACP;QAAYG;QAAuBG;QAAeC;KAAyB;IAGhF,qBAAO,KAACrD,cAAc+B,QAAQ;QAACD,OAAOA;kBAAQ1B;;AAClD;AAEAuC,kBAAkBX,WAAW,GAAG;AAsChC;;;;;;;;;;;;;;CAcC,GACD;;CAEC,GACD,MAAMwB,qCAA4FpE,MAAMe,IAAI,CAAC,CAAC,EAAEC,QAAQ,EAAEqD,YAAY,EAAE;IACpI,MAAM3B,QAAQrC,QACV,IAAO,CAAA;YACHgE,cAAcA,gBAAgB;QAClC,CAAA,GACA;QAACA;KAAa;IAGlB,qBAAO,KAACxD,oBAAoB8B,QAAQ;QAACD,OAAOA;kBAAQ1B;;AACxD;AAEAoD,qBAAqBxB,WAAW,GAAG;AAEnC,OAAO,MAAM0B,qBAAwD,CAAC,EAClEtD,QAAQ,EACRC,YAAY,EACZ6B,aAAa,EACbU,iBAAiB,EACjBC,4BAA4B,EAC5BY,YAAY,EACZE,SAASC,QAAQ,EACjBC,OAAOC,MAAM,EAChB;IACG,iBAAiB;IACjB,MAAMC,iBAAiB3E,MAAM4E,MAAM,CAAC;IACpC5E,MAAMM,SAAS,CAAC;QACZ,IAAI,CAACqE,eAAeE,OAAO,EAAE;YACzBrE,UAAUsE,UAAU,CAAC;gBACjB5D,OAAOD;gBACP8B,QAAQD;gBACRY,YAAYF;gBACZK,uBAAuBJ;YAC3B;YACAkB,eAAeE,OAAO,GAAG;QAC7B;IACJ,GAAG;QAAC5D;QAAc6B;QAAeU;QAAmBC;KAA6B;IAEjF,qBACI,KAAC3C;QAAcG,cAAcA;kBACzB,cAAA,KAAC4B;YAAeC,eAAeA;sBAC3B,cAAA,KAACS;gBACGC,mBAAmBA;gBACnBC,8BAA8BA;0BAE9B,cAAA,KAACW;oBAAqBC,cAAcA;8BAC/BrD;;;;;AAMzB,EAAE;AAEF;;;;;;;;;;;;;CAaC,GACD,OAAO,MAAM+D,WAAW;IACpB,MAAMZ,UAAUjE,WAAWO;IAC3B,IAAI0D,YAAYzD,WAAW;QACvB,MAAM,IAAIsE,MAAM;IACpB;IACA,OAAOb;AACX,EAAE;AAEF;;;;;;;;;;;;;CAaC,GACD,OAAO,MAAMc,YAAY;IACrB,MAAMd,UAAUjE,WAAWS;IAC3B,IAAIwD,YAAYzD,WAAW;QACvB,MAAM,IAAIsE,MAAM;IACpB;IACA,OAAOb;AACX,EAAE;AAEF;;;;;CAKC,GACD,OAAO,MAAMe,YAAY;IACrB,MAAMf,UAAUjE,WAAWU;IAC3B,IAAIuD,YAAYzD,WAAW;QACvB,MAAM,IAAIsE,MAAM;IACpB;IACA,OAAOb;AACX,EAAE;AAEF;;;;;;;;;;;;;;;;CAgBC,GACD;;;;;;;;;;;;;CAaC,GACD,OAAO,MAAMgB,kBAAkB;IAC3B,MAAMhB,UAAUjE,WAAWW;IAC3B,IAAIsD,YAAYzD,WAAW;QACvB,MAAM,IAAIsE,MAAM;IACpB;IACA,OAAOb,QAAQE,YAAY;AAC/B,EAAE;AAEF,OAAO,MAAMe,gBAAgB;IACzB,MAAMC,eAAeN;IACrB,MAAMO,gBAAgBL;IACtB,MAAMM,gBAAgBL;IACtB,MAAMM,sBAAsBL;IAE5B,2BAA2B;IAC3B,qBAAqB;IACrB,OAAO9E,QACH,IAAO,CAAA;YACHa,OAAOmE,aAAanE,KAAK;YACzB6B,QAAQuC,cAAcvC,MAAM;YAC5BW,YAAY6B,cAAc7B,UAAU;YACpCG,uBAAuB0B,cAAc1B,qBAAqB;YAC1DQ,cAAcmB;YACdvD,UAAUoD,aAAapD,QAAQ;YAC/BmB,WAAWkC,cAAclC,SAAS;YAClCY,eAAeuB,cAAcvB,aAAa;YAC1CC,0BAA0BsB,cAActB,wBAAwB;QACpE,CAAA,GACA;QACIoB,aAAanE,KAAK;QAClBoE,cAAcvC,MAAM;QACpBwC,cAAc7B,UAAU;QACxB6B,cAAc1B,qBAAqB;QACnC2B;QACA,mBAAmB;QACnBH,aAAapD,QAAQ;QACrBqD,cAAclC,SAAS;QACvBmC,cAAcvB,aAAa;QAC3BuB,cAActB,wBAAwB;KACzC;AAET,EAAE"}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../../src/core/app/AppContext.types.ts"],"names":[],"mappings":""}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../../src/core/app/AppContext.types.ts"],"sourcesContent":["import type { LangType } from '../../library/locale/types';\nimport type { InitializationContext } from '../initialization';\nimport type { StateManager } from '../../state';\nimport type { UIProviderConfig } from '../types';\n\n/**\n * 主题配置\n */\nexport interface ThemeConfig {\n /**\n * 主题模式:'light' | 'dark' | 'system'\n * - 'light': 浅色主题\n * - 'dark': 深色主题\n * - 'system': 跟随系统设置\n */\n mode?: 'light' | 'dark' | 'system';\n\n /**\n * 主题色(主色调)\n */\n primaryColor?: string;\n\n /**\n * 自定义主题配置\n */\n custom?: Record<string, unknown>;\n}\n\n/**\n * 应用配置接口\n */\nexport interface AppConfig {\n /**\n * 主题配置\n */\n theme: ThemeConfig;\n\n /**\n * 国际化语言\n */\n locale: LangType;\n\n /**\n * Ant Design 配置\n */\n antdConfig?: UIProviderConfig;\n\n /**\n * 初始化上下文\n */\n initializationContext?: InitializationContext;\n}\n\n/**\n * 主题上下文值\n */\nexport interface ThemeContextValue {\n /**\n * 主题配置\n */\n theme: ThemeConfig;\n\n /**\n * 更新主题\n */\n setTheme: (theme: ThemeConfig | ((prev: ThemeConfig) => ThemeConfig)) => void;\n}\n\n/**\n * 国际化上下文值\n */\nexport interface LocaleContextValue {\n /**\n * 当前语言\n */\n locale: LangType;\n\n /**\n * 更新语言\n */\n setLocale: (locale: LangType) => void;\n\n /**\n * 是否正在切换语言\n */\n isChanging?: boolean;\n}\n\n/**\n * 配置上下文值\n */\nexport interface ConfigContextValue {\n /**\n * Ant Design 配置\n */\n antdConfig?: UIProviderConfig;\n\n /**\n * 初始化上下文\n */\n initializationContext?: InitializationContext;\n\n /**\n * 更新 Ant Design 配置\n */\n setAntdConfig: (config: UIProviderConfig | undefined) => void;\n\n /**\n * 更新初始化上下文\n */\n setInitializationContext: (context: InitializationContext | undefined) => void;\n}\n\n/**\n * 状态管理器上下文值\n */\nexport interface StateManagerContextValue {\n /**\n * 状态管理器实例\n */\n stateManager: StateManager | null;\n}\n\n/**\n * 应用全局上下文值(聚合所有上下文)\n */\nexport interface AppContextValue {\n /**\n * 主题配置\n */\n theme: ThemeConfig;\n\n /**\n * 国际化语言\n */\n locale: LangType;\n\n /**\n * Ant Design 配置\n */\n antdConfig?: UIProviderConfig;\n\n /**\n * 初始化上下文\n */\n initializationContext?: InitializationContext;\n\n /**\n * 状态管理器实例\n */\n stateManager: StateManager | null;\n\n /**\n * 更新主题\n */\n setTheme: (theme: ThemeConfig | ((prev: ThemeConfig) => ThemeConfig)) => void;\n\n /**\n * 更新国际化语言\n */\n setLocale: (locale: LangType) => void;\n\n /**\n * 更新 Ant Design 配置\n */\n setAntdConfig: (config: UIProviderConfig | undefined) => void;\n\n /**\n * 更新初始化上下文\n */\n setInitializationContext: (context: InitializationContext | undefined) => void;\n}\n"],"names":[],"mappings":"AA2HA;;CAEC,GACD,WA6CC"}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../../src/core/app/BasicLayout.tsx"],"sourcesContent":["import React, { memo } from 'react';\nimport type { PropsWithChildren } from 'react';\nimport { useAppContext } from './AppContext';\nimport type { GlobalProviderLoader, UIProviderConfig } from '../types';\n\ninterface BasicLayoutProps {\n /**\n * 外部传入 UI provider 配置(向后兼容沿用 configProps 命名)\n */\n configProps?: UIProviderConfig;\n /**\n * 全局 UI 包裹组件懒加载器\n */\n globalProvider?: GlobalProviderLoader;\n}\n\nconst BasicLayout: React.FC<PropsWithChildren<BasicLayoutProps>> = memo(({\n children,\n configProps: externalConfigProps,\n globalProvider,\n}) => {\n const { antdConfig, theme } = useAppContext();\n const [isSystemDark, setIsSystemDark] = React.useState<boolean>(() => {\n if (typeof window === 'undefined') {\n return false;\n }\n return window.matchMedia('(prefers-color-scheme: dark)').matches;\n });\n\n const finalConfigProps = antdConfig || externalConfigProps;\n\n React.useEffect(() => {\n if (typeof window === 'undefined') {\n return;\n }\n\n const mediaQuery = window.matchMedia('(prefers-color-scheme: dark)');\n const updateSystemTheme = (event: MediaQueryListEvent) => {\n setIsSystemDark(event.matches);\n };\n\n setIsSystemDark(mediaQuery.matches);\n if (typeof mediaQuery.addEventListener === 'function') {\n mediaQuery.addEventListener('change', updateSystemTheme);\n return () => mediaQuery.removeEventListener('change', updateSystemTheme);\n }\n\n mediaQuery.addListener(updateSystemTheme);\n return () => mediaQuery.removeListener(updateSystemTheme);\n }, []);\n\n const resolvedMode = theme.mode === 'system' ? (isSystemDark ? 'dark' : 'light') : theme.mode;\n\n const cssVars = React.useMemo<Record<string, string>>(() => {\n const vars: Record<string, string> = {};\n\n if (theme.primaryColor) {\n vars['--app-primary-color'] = theme.primaryColor;\n }\n\n if (finalConfigProps && typeof finalConfigProps === 'object') {\n const cssVariables = (finalConfigProps as Record<string, unknown>).cssVariables;\n if (cssVariables && typeof cssVariables === 'object') {\n Object.entries(cssVariables as Record<string, unknown>).forEach(([key, value]) => {\n vars[`--${key}`] = String(value);\n });\n }\n }\n\n return vars;\n }, [finalConfigProps, theme.primaryColor]);\n\n const GlobalProvider = React.useMemo(\n () => (globalProvider ? React.lazy(globalProvider) : null),\n [globalProvider]\n );\n\n const renderedContent = React.useMemo(() => {\n if (!GlobalProvider) {\n return children;\n }\n\n return (\n <React.Suspense fallback={null}>\n <GlobalProvider>{children}</GlobalProvider>\n </React.Suspense>\n );\n }, [GlobalProvider, children]);\n\n return (\n <div\n data-theme-mode={resolvedMode}\n style={cssVars as React.CSSProperties}\n >\n {renderedContent}\n </div>\n );\n});\n\nBasicLayout.displayName = 'BasicLayout';\n\nexport { BasicLayout };\n"],"names":["BasicLayout","memo","children","configProps","externalConfigProps","globalProvider","antdConfig","theme","useAppContext","isSystemDark","setIsSystemDark","React","useState","window","matchMedia","matches","finalConfigProps","useEffect","mediaQuery","updateSystemTheme","event","addEventListener","removeEventListener","addListener","removeListener","resolvedMode","mode","cssVars","useMemo","vars","primaryColor","cssVariables","Object","entries","forEach","key","value","String","GlobalProvider","lazy","renderedContent","Suspense","fallback","div","data-theme-mode","style","displayName"],"mappings":";;;;+BAqGSA;;;eAAAA;;;;+DArGmB;4BAEE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAc9B,MAAMA,4BAA6DC,IAAAA,WAAI,EAAC,CAAC,EACvEC,QAAQ,EACRC,aAAaC,mBAAmB,EAChCC,cAAc,EACf;IACC,MAAM,EAAEC,UAAU,EAAEC,KAAK,EAAE,GAAGC,IAAAA,yBAAa;IAC3C,MAAM,CAACC,cAAcC,gBAAgB,GAAGC,cAAK,CAACC,QAAQ,CAAU;QAC9D,IAAI,OAAOC,WAAW,aAAa;YACjC,OAAO;QACT;QACA,OAAOA,OAAOC,UAAU,CAAC,gCAAgCC,OAAO;IAClE;IAEA,MAAMC,mBAAmBV,cAAcF;IAEvCO,cAAK,CAACM,SAAS,CAAC;QACd,IAAI,OAAOJ,WAAW,aAAa;YACjC;QACF;QAEA,MAAMK,aAAaL,OAAOC,UAAU,CAAC;QACrC,MAAMK,oBAAoB,CAACC;YACzBV,gBAAgBU,MAAML,OAAO;QAC/B;QAEAL,gBAAgBQ,WAAWH,OAAO;QAClC,IAAI,OAAOG,WAAWG,gBAAgB,KAAK,YAAY;YACrDH,WAAWG,gBAAgB,CAAC,UAAUF;YACtC,OAAO,IAAMD,WAAWI,mBAAmB,CAAC,UAAUH;QACxD;QAEAD,WAAWK,WAAW,CAACJ;QACvB,OAAO,IAAMD,WAAWM,cAAc,CAACL;IACzC,GAAG,EAAE;IAEL,MAAMM,eAAelB,MAAMmB,IAAI,KAAK,WAAYjB,eAAe,SAAS,UAAWF,MAAMmB,IAAI;IAE7F,MAAMC,UAAUhB,cAAK,CAACiB,OAAO,CAAyB;QACpD,MAAMC,OAA+B,CAAC;QAEtC,IAAItB,MAAMuB,YAAY,EAAE;YACtBD,IAAI,CAAC,sBAAsB,GAAGtB,MAAMuB,YAAY;QAClD;QAEA,IAAId,oBAAoB,OAAOA,qBAAqB,UAAU;YAC5D,MAAMe,eAAe,AAACf,iBAA6Ce,YAAY;YAC/E,IAAIA,gBAAgB,OAAOA,iBAAiB,UAAU;gBACpDC,OAAOC,OAAO,CAACF,cAAyCG,OAAO,CAAC,CAAC,CAACC,KAAKC,MAAM;oBAC3EP,IAAI,CAAC,CAAC,EAAE,EAAEM,KAAK,CAAC,GAAGE,OAAOD;gBAC5B;YACF;QACF;QAEA,OAAOP;IACT,GAAG;QAACb;QAAkBT,MAAMuB,YAAY;KAAC;IAEzC,MAAMQ,iBAAiB3B,cAAK,CAACiB,OAAO,CAClC,IAAOvB,+BAAiBM,cAAK,CAAC4B,IAAI,CAAClC,kBAAkB,MACrD;QAACA;KAAe;IAGlB,MAAMmC,kBAAkB7B,cAAK,CAACiB,OAAO,CAAC;QACpC,IAAI,CAACU,gBAAgB;YACnB,OAAOpC;QACT;QAEA,qBACE,qBAACS,cAAK,CAAC8B,QAAQ;YAACC,UAAU;sBACxB,cAAA,qBAACJ;0BAAgBpC;;;IAGvB,GAAG;QAACoC;QAAgBpC;KAAS;IAE7B,qBACE,qBAACyC;QACCC,mBAAiBnB;QACjBoB,OAAOlB;kBAENa;;AAGP;AAEAxC,YAAY8C,WAAW,GAAG"}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../../src/core/app/BasicLayout.tsx"],"sourcesContent":["import React, { memo } from 'react';\nimport type { PropsWithChildren } from 'react';\nimport { useAppContext } from './AppContext';\nimport type { GlobalProviderLoader, UIProviderConfig } from '../types';\n\ninterface BasicLayoutProps {\n /**\n * 外部传入 UI provider 配置(向后兼容沿用 configProps 命名)\n */\n configProps?: UIProviderConfig;\n /**\n * 全局 UI 包裹组件懒加载器\n */\n globalProvider?: GlobalProviderLoader;\n}\n\nconst BasicLayout: React.FC<PropsWithChildren<BasicLayoutProps>> = memo(({\n children,\n configProps: externalConfigProps,\n globalProvider,\n}) => {\n const { antdConfig, theme } = useAppContext();\n const [isSystemDark, setIsSystemDark] = React.useState<boolean>(() => {\n if (typeof window === 'undefined') {\n return false;\n }\n return window.matchMedia('(prefers-color-scheme: dark)').matches;\n });\n\n const finalConfigProps = antdConfig || externalConfigProps;\n\n React.useEffect(() => {\n if (typeof window === 'undefined') {\n return;\n }\n\n const mediaQuery = window.matchMedia('(prefers-color-scheme: dark)');\n const updateSystemTheme = (event: MediaQueryListEvent) => {\n setIsSystemDark(event.matches);\n };\n\n setIsSystemDark(mediaQuery.matches);\n if (typeof mediaQuery.addEventListener === 'function') {\n mediaQuery.addEventListener('change', updateSystemTheme);\n return () => mediaQuery.removeEventListener('change', updateSystemTheme);\n }\n\n mediaQuery.addListener(updateSystemTheme);\n return () => mediaQuery.removeListener(updateSystemTheme);\n }, []);\n\n const resolvedMode = theme.mode === 'system' ? (isSystemDark ? 'dark' : 'light') : theme.mode;\n\n const cssVars = React.useMemo<Record<string, string>>(() => {\n const vars: Record<string, string> = {};\n\n if (theme.primaryColor) {\n vars['--app-primary-color'] = theme.primaryColor;\n }\n\n if (finalConfigProps && typeof finalConfigProps === 'object') {\n const cssVariables = (finalConfigProps as Record<string, unknown>).cssVariables;\n if (cssVariables && typeof cssVariables === 'object') {\n Object.entries(cssVariables as Record<string, unknown>).forEach(([key, value]) => {\n vars[`--${key}`] = String(value);\n });\n }\n }\n\n return vars;\n }, [finalConfigProps, theme.primaryColor]);\n\n const GlobalProvider = React.useMemo(\n () => (globalProvider ? React.lazy(globalProvider) : null),\n [globalProvider]\n );\n\n const renderedContent = React.useMemo(() => {\n if (!GlobalProvider) {\n return children;\n }\n\n return (\n <React.Suspense fallback={null}>\n <GlobalProvider>{children}</GlobalProvider>\n </React.Suspense>\n );\n }, [GlobalProvider, children]);\n\n return (\n <div\n data-theme-mode={resolvedMode}\n style={cssVars as React.CSSProperties}\n >\n {renderedContent}\n </div>\n );\n});\n\nBasicLayout.displayName = 'BasicLayout';\n\nexport { BasicLayout };\n"],"names":["React","memo","useAppContext","BasicLayout","children","configProps","externalConfigProps","globalProvider","antdConfig","theme","isSystemDark","setIsSystemDark","useState","window","matchMedia","matches","finalConfigProps","useEffect","mediaQuery","updateSystemTheme","event","addEventListener","removeEventListener","addListener","removeListener","resolvedMode","mode","cssVars","useMemo","vars","primaryColor","cssVariables","Object","entries","forEach","key","value","String","GlobalProvider","lazy","renderedContent","Suspense","fallback","div","data-theme-mode","style","displayName"],"mappings":";AAAA,OAAOA,SAASC,IAAI,QAAQ,QAAQ;AAEpC,SAASC,aAAa,QAAQ,eAAe;AAc7C,MAAMC,4BAA6DF,KAAK,CAAC,EACvEG,QAAQ,EACRC,aAAaC,mBAAmB,EAChCC,cAAc,EACf;IACC,MAAM,EAAEC,UAAU,EAAEC,KAAK,EAAE,GAAGP;IAC9B,MAAM,CAACQ,cAAcC,gBAAgB,GAAGX,MAAMY,QAAQ,CAAU;QAC9D,IAAI,OAAOC,WAAW,aAAa;YACjC,OAAO;QACT;QACA,OAAOA,OAAOC,UAAU,CAAC,gCAAgCC,OAAO;IAClE;IAEA,MAAMC,mBAAmBR,cAAcF;IAEvCN,MAAMiB,SAAS,CAAC;QACd,IAAI,OAAOJ,WAAW,aAAa;YACjC;QACF;QAEA,MAAMK,aAAaL,OAAOC,UAAU,CAAC;QACrC,MAAMK,oBAAoB,CAACC;YACzBT,gBAAgBS,MAAML,OAAO;QAC/B;QAEAJ,gBAAgBO,WAAWH,OAAO;QAClC,IAAI,OAAOG,WAAWG,gBAAgB,KAAK,YAAY;YACrDH,WAAWG,gBAAgB,CAAC,UAAUF;YACtC,OAAO,IAAMD,WAAWI,mBAAmB,CAAC,UAAUH;QACxD;QAEAD,WAAWK,WAAW,CAACJ;QACvB,OAAO,IAAMD,WAAWM,cAAc,CAACL;IACzC,GAAG,EAAE;IAEL,MAAMM,eAAehB,MAAMiB,IAAI,KAAK,WAAYhB,eAAe,SAAS,UAAWD,MAAMiB,IAAI;IAE7F,MAAMC,UAAU3B,MAAM4B,OAAO,CAAyB;QACpD,MAAMC,OAA+B,CAAC;QAEtC,IAAIpB,MAAMqB,YAAY,EAAE;YACtBD,IAAI,CAAC,sBAAsB,GAAGpB,MAAMqB,YAAY;QAClD;QAEA,IAAId,oBAAoB,OAAOA,qBAAqB,UAAU;YAC5D,MAAMe,eAAe,AAACf,iBAA6Ce,YAAY;YAC/E,IAAIA,gBAAgB,OAAOA,iBAAiB,UAAU;gBACpDC,OAAOC,OAAO,CAACF,cAAyCG,OAAO,CAAC,CAAC,CAACC,KAAKC,MAAM;oBAC3EP,IAAI,CAAC,CAAC,EAAE,EAAEM,KAAK,CAAC,GAAGE,OAAOD;gBAC5B;YACF;QACF;QAEA,OAAOP;IACT,GAAG;QAACb;QAAkBP,MAAMqB,YAAY;KAAC;IAEzC,MAAMQ,iBAAiBtC,MAAM4B,OAAO,CAClC,IAAOrB,+BAAiBP,MAAMuC,IAAI,CAAChC,kBAAkB,MACrD;QAACA;KAAe;IAGlB,MAAMiC,kBAAkBxC,MAAM4B,OAAO,CAAC;QACpC,IAAI,CAACU,gBAAgB;YACnB,OAAOlC;QACT;QAEA,qBACE,KAACJ,MAAMyC,QAAQ;YAACC,UAAU;sBACxB,cAAA,KAACJ;0BAAgBlC;;;IAGvB,GAAG;QAACkC;QAAgBlC;KAAS;IAE7B,qBACE,KAACuC;QACCC,mBAAiBnB;QACjBoB,OAAOlB;kBAENa;;AAGP;AAEArC,YAAY2C,WAAW,GAAG;AAE1B,SAAS3C,WAAW,GAAG"}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../../src/core/app/DefaultApp.tsx"],"sourcesContent":["/**\n * 默认应用页面组件\n * 当用户未提供 app 选项时显示的默认页面\n */\n\nimport { memo } from 'react';\nimport { $t } from '../../library';\n\ninterface DefaultAppProps {\n title?: string;\n description?: string;\n}\n\nconst cardStyle: React.CSSProperties = {\n background: 'rgba(255, 255, 255, 0.96)',\n borderRadius: 10,\n boxShadow: '0 6px 20px rgba(0, 0, 0, 0.14)',\n padding: 20,\n};\n\nconst DefaultApp = memo<DefaultAppProps>(({ title, description }) => {\n const displayTitle = title || $t('defaultApp.title');\n const displayDescription = description || $t('defaultApp.description');\n\n return (\n <div\n style={{\n minHeight: '100vh',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n padding: 24,\n background: 'linear-gradient(130deg, #274c77 0%, #2c7da0 42%, #61a5c2 100%)',\n }}\n >\n <div style={{ maxWidth: 860, width: '100%' }}>\n <div style={{ textAlign: 'center', marginBottom: 28, color: '#fff' }}>\n <div style={{ fontSize: 56, lineHeight: '60px', marginBottom: 12 }}>🚀</div>\n <h1 style={{ margin: 0, fontSize: 34 }}>{displayTitle}</h1>\n <p style={{ marginTop: 12, opacity: 0.9 }}>{displayDescription}</p>\n </div>\n\n <div style={{ display: 'grid', gap: 16 }}>\n <section style={cardStyle}>\n <h2 style={{ marginTop: 0 }}>💻 {$t('defaultApp.quickStart.title')}</h2>\n <p>{$t('defaultApp.quickStart.description')}</p>\n <pre\n style={{\n margin: 0,\n background: '#f4f6f8',\n borderRadius: 8,\n padding: 12,\n overflowX: 'auto',\n }}\n >\n {$t('defaultApp.quickStart.code')}\n </pre>\n </section>\n\n <section style={cardStyle}>\n <h2 style={{ marginTop: 0 }}>📚 {$t('defaultApp.nextSteps.title')}</h2>\n <ul style={{ paddingLeft: 20, marginBottom: 0 }}>\n <li>{$t('defaultApp.nextSteps.step1')}</li>\n <li>{$t('defaultApp.nextSteps.step2')}</li>\n <li>{$t('defaultApp.nextSteps.step3')}</li>\n </ul>\n </section>\n </div>\n\n <p style={{ textAlign: 'center', color: 'rgba(255,255,255,0.88)', marginTop: 18 }}>\n {$t('defaultApp.footer')}\n </p>\n </div>\n </div>\n );\n});\n\nDefaultApp.displayName = 'DefaultApp';\n\nexport { DefaultApp };\n"],"names":["DefaultApp","cardStyle","background","borderRadius","boxShadow","padding","memo","title","description","displayTitle","$t","displayDescription","div","style","minHeight","display","alignItems","justifyContent","maxWidth","width","textAlign","marginBottom","color","fontSize","lineHeight","h1","margin","p","marginTop","opacity","gap","section","h2","pre","overflowX","ul","paddingLeft","li","displayName"],"mappings":"AAAA;;;CAGC;;;;+BA4EQA;;;eAAAA;;;;uBA1EY;yBACF;AAOnB,MAAMC,YAAiC;IACrCC,YAAY;IACZC,cAAc;IACdC,WAAW;IACXC,SAAS;AACX;AAEA,MAAML,2BAAaM,IAAAA,WAAI,EAAkB,CAAC,EAAEC,KAAK,EAAEC,WAAW,EAAE;IAC9D,MAAMC,eAAeF,SAASG,IAAAA,WAAE,EAAC;IACjC,MAAMC,qBAAqBH,eAAeE,IAAAA,WAAE,EAAC;IAE7C,qBACE,qBAACE;QACCC,OAAO;YACLC,WAAW;YACXC,SAAS;YACTC,YAAY;YACZC,gBAAgB;YAChBZ,SAAS;YACTH,YAAY;QACd;kBAEA,cAAA,sBAACU;YAAIC,OAAO;gBAAEK,UAAU;gBAAKC,OAAO;YAAO;;8BACzC,sBAACP;oBAAIC,OAAO;wBAAEO,WAAW;wBAAUC,cAAc;wBAAIC,OAAO;oBAAO;;sCACjE,qBAACV;4BAAIC,OAAO;gCAAEU,UAAU;gCAAIC,YAAY;gCAAQH,cAAc;4BAAG;sCAAG;;sCACpE,qBAACI;4BAAGZ,OAAO;gCAAEa,QAAQ;gCAAGH,UAAU;4BAAG;sCAAId;;sCACzC,qBAACkB;4BAAEd,OAAO;gCAAEe,WAAW;gCAAIC,SAAS;4BAAI;sCAAIlB;;;;8BAG9C,sBAACC;oBAAIC,OAAO;wBAAEE,SAAS;wBAAQe,KAAK;oBAAG;;sCACrC,sBAACC;4BAAQlB,OAAOZ;;8CACd,sBAAC+B;oCAAGnB,OAAO;wCAAEe,WAAW;oCAAE;;wCAAG;wCAAIlB,IAAAA,WAAE,EAAC;;;8CACpC,qBAACiB;8CAAGjB,IAAAA,WAAE,EAAC;;8CACP,qBAACuB;oCACCpB,OAAO;wCACLa,QAAQ;wCACRxB,YAAY;wCACZC,cAAc;wCACdE,SAAS;wCACT6B,WAAW;oCACb;8CAECxB,IAAAA,WAAE,EAAC;;;;sCAIR,sBAACqB;4BAAQlB,OAAOZ;;8CACd,sBAAC+B;oCAAGnB,OAAO;wCAAEe,WAAW;oCAAE;;wCAAG;wCAAIlB,IAAAA,WAAE,EAAC;;;8CACpC,sBAACyB;oCAAGtB,OAAO;wCAAEuB,aAAa;wCAAIf,cAAc;oCAAE;;sDAC5C,qBAACgB;sDAAI3B,IAAAA,WAAE,EAAC;;sDACR,qBAAC2B;sDAAI3B,IAAAA,WAAE,EAAC;;sDACR,qBAAC2B;sDAAI3B,IAAAA,WAAE,EAAC;;;;;;;;8BAKd,qBAACiB;oBAAEd,OAAO;wBAAEO,WAAW;wBAAUE,OAAO;wBAA0BM,WAAW;oBAAG;8BAC7ElB,IAAAA,WAAE,EAAC;;;;;AAKd;AAEAV,WAAWsC,WAAW,GAAG"}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../../src/core/app/DefaultApp.tsx"],"sourcesContent":["/**\n * 默认应用页面组件\n * 当用户未提供 app 选项时显示的默认页面\n */\n\nimport { memo } from 'react';\nimport { $t } from '../../library';\n\ninterface DefaultAppProps {\n title?: string;\n description?: string;\n}\n\nconst cardStyle: React.CSSProperties = {\n background: 'rgba(255, 255, 255, 0.96)',\n borderRadius: 10,\n boxShadow: '0 6px 20px rgba(0, 0, 0, 0.14)',\n padding: 20,\n};\n\nconst DefaultApp = memo<DefaultAppProps>(({ title, description }) => {\n const displayTitle = title || $t('defaultApp.title');\n const displayDescription = description || $t('defaultApp.description');\n\n return (\n <div\n style={{\n minHeight: '100vh',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n padding: 24,\n background: 'linear-gradient(130deg, #274c77 0%, #2c7da0 42%, #61a5c2 100%)',\n }}\n >\n <div style={{ maxWidth: 860, width: '100%' }}>\n <div style={{ textAlign: 'center', marginBottom: 28, color: '#fff' }}>\n <div style={{ fontSize: 56, lineHeight: '60px', marginBottom: 12 }}>🚀</div>\n <h1 style={{ margin: 0, fontSize: 34 }}>{displayTitle}</h1>\n <p style={{ marginTop: 12, opacity: 0.9 }}>{displayDescription}</p>\n </div>\n\n <div style={{ display: 'grid', gap: 16 }}>\n <section style={cardStyle}>\n <h2 style={{ marginTop: 0 }}>💻 {$t('defaultApp.quickStart.title')}</h2>\n <p>{$t('defaultApp.quickStart.description')}</p>\n <pre\n style={{\n margin: 0,\n background: '#f4f6f8',\n borderRadius: 8,\n padding: 12,\n overflowX: 'auto',\n }}\n >\n {$t('defaultApp.quickStart.code')}\n </pre>\n </section>\n\n <section style={cardStyle}>\n <h2 style={{ marginTop: 0 }}>📚 {$t('defaultApp.nextSteps.title')}</h2>\n <ul style={{ paddingLeft: 20, marginBottom: 0 }}>\n <li>{$t('defaultApp.nextSteps.step1')}</li>\n <li>{$t('defaultApp.nextSteps.step2')}</li>\n <li>{$t('defaultApp.nextSteps.step3')}</li>\n </ul>\n </section>\n </div>\n\n <p style={{ textAlign: 'center', color: 'rgba(255,255,255,0.88)', marginTop: 18 }}>\n {$t('defaultApp.footer')}\n </p>\n </div>\n </div>\n );\n});\n\nDefaultApp.displayName = 'DefaultApp';\n\nexport { DefaultApp };\n"],"names":["memo","$t","cardStyle","background","borderRadius","boxShadow","padding","DefaultApp","title","description","displayTitle","displayDescription","div","style","minHeight","display","alignItems","justifyContent","maxWidth","width","textAlign","marginBottom","color","fontSize","lineHeight","h1","margin","p","marginTop","opacity","gap","section","h2","pre","overflowX","ul","paddingLeft","li","displayName"],"mappings":";AAAA;;;CAGC,GAED,SAASA,IAAI,QAAQ,QAAQ;AAC7B,SAASC,EAAE,QAAQ,gBAAgB;AAOnC,MAAMC,YAAiC;IACrCC,YAAY;IACZC,cAAc;IACdC,WAAW;IACXC,SAAS;AACX;AAEA,MAAMC,2BAAaP,KAAsB,CAAC,EAAEQ,KAAK,EAAEC,WAAW,EAAE;IAC9D,MAAMC,eAAeF,SAASP,GAAG;IACjC,MAAMU,qBAAqBF,eAAeR,GAAG;IAE7C,qBACE,KAACW;QACCC,OAAO;YACLC,WAAW;YACXC,SAAS;YACTC,YAAY;YACZC,gBAAgB;YAChBX,SAAS;YACTH,YAAY;QACd;kBAEA,cAAA,MAACS;YAAIC,OAAO;gBAAEK,UAAU;gBAAKC,OAAO;YAAO;;8BACzC,MAACP;oBAAIC,OAAO;wBAAEO,WAAW;wBAAUC,cAAc;wBAAIC,OAAO;oBAAO;;sCACjE,KAACV;4BAAIC,OAAO;gCAAEU,UAAU;gCAAIC,YAAY;gCAAQH,cAAc;4BAAG;sCAAG;;sCACpE,KAACI;4BAAGZ,OAAO;gCAAEa,QAAQ;gCAAGH,UAAU;4BAAG;sCAAIb;;sCACzC,KAACiB;4BAAEd,OAAO;gCAAEe,WAAW;gCAAIC,SAAS;4BAAI;sCAAIlB;;;;8BAG9C,MAACC;oBAAIC,OAAO;wBAAEE,SAAS;wBAAQe,KAAK;oBAAG;;sCACrC,MAACC;4BAAQlB,OAAOX;;8CACd,MAAC8B;oCAAGnB,OAAO;wCAAEe,WAAW;oCAAE;;wCAAG;wCAAI3B,GAAG;;;8CACpC,KAAC0B;8CAAG1B,GAAG;;8CACP,KAACgC;oCACCpB,OAAO;wCACLa,QAAQ;wCACRvB,YAAY;wCACZC,cAAc;wCACdE,SAAS;wCACT4B,WAAW;oCACb;8CAECjC,GAAG;;;;sCAIR,MAAC8B;4BAAQlB,OAAOX;;8CACd,MAAC8B;oCAAGnB,OAAO;wCAAEe,WAAW;oCAAE;;wCAAG;wCAAI3B,GAAG;;;8CACpC,MAACkC;oCAAGtB,OAAO;wCAAEuB,aAAa;wCAAIf,cAAc;oCAAE;;sDAC5C,KAACgB;sDAAIpC,GAAG;;sDACR,KAACoC;sDAAIpC,GAAG;;sDACR,KAACoC;sDAAIpC,GAAG;;;;;;;;8BAKd,KAAC0B;oBAAEd,OAAO;wBAAEO,WAAW;wBAAUE,OAAO;wBAA0BM,WAAW;oBAAG;8BAC7E3B,GAAG;;;;;AAKd;AAEAM,WAAW+B,WAAW,GAAG;AAEzB,SAAS/B,UAAU,GAAG"}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../../src/core/app/index.ts"],"sourcesContent":["/**\n * 应用核心模块\n */\n\nexport { AppContextProvider, useAppContext, useTheme, useLocale, useConfig, useStateManager } from './AppContext';\nexport type { AppContextProviderProps } from './AppContext';\nexport type {\n AppContextValue,\n ThemeContextValue,\n LocaleContextValue,\n ConfigContextValue,\n StateManagerContextValue,\n ThemeConfig,\n AppConfig,\n} from './AppContext.types';\nexport { DefaultApp } from './DefaultApp';\nexport { BasicLayout } from './BasicLayout';\n"],"names":["AppContextProvider","BasicLayout","DefaultApp","useAppContext","useConfig","useLocale","useStateManager","useTheme"],"mappings":"AAAA;;CAEC;;;;;;;;;;;QAEQA;eAAAA,8BAAkB;;QAYlBC;eAAAA,wBAAW;;QADXC;eAAAA,sBAAU;;QAXUC;eAAAA,yBAAa;;QAAuBC;eAAAA,qBAAS;;QAApBC;eAAAA,qBAAS;;QAAaC;eAAAA,2BAAe;;QAA/CC;eAAAA,oBAAQ;;;4BAA+C;4BAWxE;6BACC"}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../../src/core/app/index.ts"],"sourcesContent":["/**\n * 应用核心模块\n */\n\nexport { AppContextProvider, useAppContext, useTheme, useLocale, useConfig, useStateManager } from './AppContext';\nexport type { AppContextProviderProps } from './AppContext';\nexport type {\n AppContextValue,\n ThemeContextValue,\n LocaleContextValue,\n ConfigContextValue,\n StateManagerContextValue,\n ThemeConfig,\n AppConfig,\n} from './AppContext.types';\nexport { DefaultApp } from './DefaultApp';\nexport { BasicLayout } from './BasicLayout';\n"],"names":["AppContextProvider","useAppContext","useTheme","useLocale","useConfig","useStateManager","DefaultApp","BasicLayout"],"mappings":"AAAA;;CAEC,GAED,SAASA,kBAAkB,EAAEC,aAAa,EAAEC,QAAQ,EAAEC,SAAS,EAAEC,SAAS,EAAEC,eAAe,QAAQ,eAAe;AAWlH,SAASC,UAAU,QAAQ,eAAe;AAC1C,SAASC,WAAW,QAAQ,gBAAgB"}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../../src/core/config/AppConfig.ts"],"sourcesContent":["import type { LangType } from '../../library/locale/types';\nimport type { InitializationContext } from '../initialization';\nimport type { AppConfig, ThemeConfig } from '../app';\nimport type { UIProviderConfig } from '../types';\n\n/**\n * 应用配置单例\n * \n * 用于在非 React 代码中访问全局配置\n */\nclass AppConfigManager {\n private static instance: AppConfigManager | null = null;\n\n private _config: AppConfig;\n\n /**\n * 私有构造函数,防止外部直接实例化\n */\n private constructor() {\n this._config = {\n theme: { mode: 'light' },\n locale: 'zh-CN',\n };\n }\n\n /**\n * 获取单例实例\n * \n * @returns 单例实例\n */\n public static getInstance(): AppConfigManager {\n if (!AppConfigManager.instance) {\n AppConfigManager.instance = new AppConfigManager();\n }\n return AppConfigManager.instance;\n }\n\n /**\n * 初始化配置\n * \n * @param config - 应用配置\n */\n public initialize(config: Partial<AppConfig>): void {\n this._config = {\n theme: config.theme || { mode: 'light' },\n locale: config.locale || 'zh-CN',\n antdConfig: config.antdConfig,\n initializationContext: config.initializationContext,\n };\n }\n\n /**\n * 获取完整配置\n * \n * @returns 应用配置\n */\n public getConfig(): AppConfig {\n return { ...this._config };\n }\n\n /**\n * 获取主题配置\n * \n * @returns 主题配置\n */\n public getTheme(): ThemeConfig {\n return { ...this._config.theme };\n }\n\n /**\n * 更新主题配置\n * \n * @param theme - 主题配置或更新函数\n */\n public setTheme(theme: ThemeConfig | ((prev: ThemeConfig) => ThemeConfig)): void {\n if (typeof theme === 'function') {\n this._config.theme = theme(this._config.theme);\n } else {\n this._config.theme = { ...theme };\n }\n }\n\n /**\n * 获取当前语言\n * \n * @returns 当前语言\n */\n public getLocale(): LangType {\n return this._config.locale;\n }\n\n /**\n * 更新语言\n * \n * @param locale - 语言类型\n */\n public setLocale(locale: LangType): void {\n this._config.locale = locale;\n }\n\n /**\n * 获取 Ant Design 配置\n * \n * @returns Ant Design 配置\n */\n public getAntdConfig(): UIProviderConfig | undefined {\n return this._config.antdConfig;\n }\n\n /**\n * 更新 Ant Design 配置\n * \n * @param config - Ant Design 配置\n */\n public setAntdConfig(config: UIProviderConfig | undefined): void {\n this._config.antdConfig = config;\n }\n\n /**\n * 获取初始化上下文\n * \n * @returns 初始化上下文\n */\n public getInitializationContext(): InitializationContext | undefined {\n return this._config.initializationContext;\n }\n\n /**\n * 更新初始化上下文\n * \n * @param context - 初始化上下文\n */\n public setInitializationContext(context: InitializationContext | undefined): void {\n this._config.initializationContext = context;\n }\n}\n\n/**\n * 应用配置单例实例\n */\nexport const appConfig = AppConfigManager.getInstance();\n"],"names":["appConfig","AppConfigManager","getInstance","instance","initialize","config","_config","theme","mode","locale","antdConfig","initializationContext","getConfig","getTheme","setTheme","getLocale","setLocale","getAntdConfig","setAntdConfig","getInitializationContext","setInitializationContext","context"],"mappings":";;;;+BA4IaA;;;eAAAA;;;;;;;;;;;;;;;;AAvIb;;;;CAIC,GACD,IAAA,AAAMC,mBAAN,MAAMA;IAeF;;;;KAIC,GACD,OAAcC,cAAgC;QAC1C,IAAI,CAACD,iBAAiBE,QAAQ,EAAE;YAC5BF,iBAAiBE,QAAQ,GAAG,IAAIF;QACpC;QACA,OAAOA,iBAAiBE,QAAQ;IACpC;IAEA;;;;KAIC,GACD,AAAOC,WAAWC,MAA0B,EAAQ;QAChD,IAAI,CAACC,OAAO,GAAG;YACXC,OAAOF,OAAOE,KAAK,IAAI;gBAAEC,MAAM;YAAQ;YACvCC,QAAQJ,OAAOI,MAAM,IAAI;YACzBC,YAAYL,OAAOK,UAAU;YAC7BC,uBAAuBN,OAAOM,qBAAqB;QACvD;IACJ;IAEA;;;;KAIC,GACD,AAAOC,YAAuB;QAC1B,OAAO;YAAE,GAAG,IAAI,CAACN,OAAO;QAAC;IAC7B;IAEA;;;;KAIC,GACD,AAAOO,WAAwB;QAC3B,OAAO;YAAE,GAAG,IAAI,CAACP,OAAO,CAACC,KAAK;QAAC;IACnC;IAEA;;;;KAIC,GACD,AAAOO,SAASP,KAAyD,EAAQ;QAC7E,IAAI,OAAOA,UAAU,YAAY;YAC7B,IAAI,CAACD,OAAO,CAACC,KAAK,GAAGA,MAAM,IAAI,CAACD,OAAO,CAACC,KAAK;QACjD,OAAO;YACH,IAAI,CAACD,OAAO,CAACC,KAAK,GAAG;gBAAE,GAAGA,KAAK;YAAC;QACpC;IACJ;IAEA;;;;KAIC,GACD,AAAOQ,YAAsB;QACzB,OAAO,IAAI,CAACT,OAAO,CAACG,MAAM;IAC9B;IAEA;;;;KAIC,GACD,AAAOO,UAAUP,MAAgB,EAAQ;QACrC,IAAI,CAACH,OAAO,CAACG,MAAM,GAAGA;IAC1B;IAEA;;;;KAIC,GACD,AAAOQ,gBAA8C;QACjD,OAAO,IAAI,CAACX,OAAO,CAACI,UAAU;IAClC;IAEA;;;;KAIC,GACD,AAAOQ,cAAcb,MAAoC,EAAQ;QAC7D,IAAI,CAACC,OAAO,CAACI,UAAU,GAAGL;IAC9B;IAEA;;;;KAIC,GACD,AAAOc,2BAA8D;QACjE,OAAO,IAAI,CAACb,OAAO,CAACK,qBAAqB;IAC7C;IAEA;;;;KAIC,GACD,AAAOS,yBAAyBC,OAA0C,EAAQ;QAC9E,IAAI,CAACf,OAAO,CAACK,qBAAqB,GAAGU;IACzC;IAvHA;;KAEC,GACD,aAAsB;QALtB,uBAAQf,WAAR,KAAA;QAMI,IAAI,CAACA,OAAO,GAAG;YACXC,OAAO;gBAAEC,MAAM;YAAQ;YACvBC,QAAQ;QACZ;IACJ;AAgHJ;AA5HI,iBADER,kBACaE,YAAoC;AAiIhD,MAAMH,YAAYC,iBAAiBC,WAAW"}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../../src/core/config/AppConfig.ts"],"sourcesContent":["import type { LangType } from '../../library/locale/types';\nimport type { InitializationContext } from '../initialization';\nimport type { AppConfig, ThemeConfig } from '../app';\nimport type { UIProviderConfig } from '../types';\n\n/**\n * 应用配置单例\n * \n * 用于在非 React 代码中访问全局配置\n */\nclass AppConfigManager {\n private static instance: AppConfigManager | null = null;\n\n private _config: AppConfig;\n\n /**\n * 私有构造函数,防止外部直接实例化\n */\n private constructor() {\n this._config = {\n theme: { mode: 'light' },\n locale: 'zh-CN',\n };\n }\n\n /**\n * 获取单例实例\n * \n * @returns 单例实例\n */\n public static getInstance(): AppConfigManager {\n if (!AppConfigManager.instance) {\n AppConfigManager.instance = new AppConfigManager();\n }\n return AppConfigManager.instance;\n }\n\n /**\n * 初始化配置\n * \n * @param config - 应用配置\n */\n public initialize(config: Partial<AppConfig>): void {\n this._config = {\n theme: config.theme || { mode: 'light' },\n locale: config.locale || 'zh-CN',\n antdConfig: config.antdConfig,\n initializationContext: config.initializationContext,\n };\n }\n\n /**\n * 获取完整配置\n * \n * @returns 应用配置\n */\n public getConfig(): AppConfig {\n return { ...this._config };\n }\n\n /**\n * 获取主题配置\n * \n * @returns 主题配置\n */\n public getTheme(): ThemeConfig {\n return { ...this._config.theme };\n }\n\n /**\n * 更新主题配置\n * \n * @param theme - 主题配置或更新函数\n */\n public setTheme(theme: ThemeConfig | ((prev: ThemeConfig) => ThemeConfig)): void {\n if (typeof theme === 'function') {\n this._config.theme = theme(this._config.theme);\n } else {\n this._config.theme = { ...theme };\n }\n }\n\n /**\n * 获取当前语言\n * \n * @returns 当前语言\n */\n public getLocale(): LangType {\n return this._config.locale;\n }\n\n /**\n * 更新语言\n * \n * @param locale - 语言类型\n */\n public setLocale(locale: LangType): void {\n this._config.locale = locale;\n }\n\n /**\n * 获取 Ant Design 配置\n * \n * @returns Ant Design 配置\n */\n public getAntdConfig(): UIProviderConfig | undefined {\n return this._config.antdConfig;\n }\n\n /**\n * 更新 Ant Design 配置\n * \n * @param config - Ant Design 配置\n */\n public setAntdConfig(config: UIProviderConfig | undefined): void {\n this._config.antdConfig = config;\n }\n\n /**\n * 获取初始化上下文\n * \n * @returns 初始化上下文\n */\n public getInitializationContext(): InitializationContext | undefined {\n return this._config.initializationContext;\n }\n\n /**\n * 更新初始化上下文\n * \n * @param context - 初始化上下文\n */\n public setInitializationContext(context: InitializationContext | undefined): void {\n this._config.initializationContext = context;\n }\n}\n\n/**\n * 应用配置单例实例\n */\nexport const appConfig = AppConfigManager.getInstance();\n"],"names":["AppConfigManager","getInstance","instance","initialize","config","_config","theme","mode","locale","antdConfig","initializationContext","getConfig","getTheme","setTheme","getLocale","setLocale","getAntdConfig","setAntdConfig","getInitializationContext","setInitializationContext","context","appConfig"],"mappings":";;;;;;;;;;;;;AAKA;;;;CAIC,GACD,IAAA,AAAMA,mBAAN,MAAMA;IAeF;;;;KAIC,GACD,OAAcC,cAAgC;QAC1C,IAAI,CAACD,iBAAiBE,QAAQ,EAAE;YAC5BF,iBAAiBE,QAAQ,GAAG,IAAIF;QACpC;QACA,OAAOA,iBAAiBE,QAAQ;IACpC;IAEA;;;;KAIC,GACD,AAAOC,WAAWC,MAA0B,EAAQ;QAChD,IAAI,CAACC,OAAO,GAAG;YACXC,OAAOF,OAAOE,KAAK,IAAI;gBAAEC,MAAM;YAAQ;YACvCC,QAAQJ,OAAOI,MAAM,IAAI;YACzBC,YAAYL,OAAOK,UAAU;YAC7BC,uBAAuBN,OAAOM,qBAAqB;QACvD;IACJ;IAEA;;;;KAIC,GACD,AAAOC,YAAuB;QAC1B,OAAO;YAAE,GAAG,IAAI,CAACN,OAAO;QAAC;IAC7B;IAEA;;;;KAIC,GACD,AAAOO,WAAwB;QAC3B,OAAO;YAAE,GAAG,IAAI,CAACP,OAAO,CAACC,KAAK;QAAC;IACnC;IAEA;;;;KAIC,GACD,AAAOO,SAASP,KAAyD,EAAQ;QAC7E,IAAI,OAAOA,UAAU,YAAY;YAC7B,IAAI,CAACD,OAAO,CAACC,KAAK,GAAGA,MAAM,IAAI,CAACD,OAAO,CAACC,KAAK;QACjD,OAAO;YACH,IAAI,CAACD,OAAO,CAACC,KAAK,GAAG;gBAAE,GAAGA,KAAK;YAAC;QACpC;IACJ;IAEA;;;;KAIC,GACD,AAAOQ,YAAsB;QACzB,OAAO,IAAI,CAACT,OAAO,CAACG,MAAM;IAC9B;IAEA;;;;KAIC,GACD,AAAOO,UAAUP,MAAgB,EAAQ;QACrC,IAAI,CAACH,OAAO,CAACG,MAAM,GAAGA;IAC1B;IAEA;;;;KAIC,GACD,AAAOQ,gBAA8C;QACjD,OAAO,IAAI,CAACX,OAAO,CAACI,UAAU;IAClC;IAEA;;;;KAIC,GACD,AAAOQ,cAAcb,MAAoC,EAAQ;QAC7D,IAAI,CAACC,OAAO,CAACI,UAAU,GAAGL;IAC9B;IAEA;;;;KAIC,GACD,AAAOc,2BAA8D;QACjE,OAAO,IAAI,CAACb,OAAO,CAACK,qBAAqB;IAC7C;IAEA;;;;KAIC,GACD,AAAOS,yBAAyBC,OAA0C,EAAQ;QAC9E,IAAI,CAACf,OAAO,CAACK,qBAAqB,GAAGU;IACzC;IAvHA;;KAEC,GACD,aAAsB;QALtB,uBAAQf,WAAR,KAAA;QAMI,IAAI,CAACA,OAAO,GAAG;YACXC,OAAO;gBAAEC,MAAM;YAAQ;YACvBC,QAAQ;QACZ;IACJ;AAgHJ;AA5HI,iBADER,kBACaE,YAAoC;AA8HvD;;CAEC,GACD,OAAO,MAAMmB,YAAYrB,iBAAiBC,WAAW,GAAG"}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../../src/core/config/ConfigLoader.ts"],"sourcesContent":["/**\n * 配置文件加载模块\n * 支持从JSON/YAML文件加载配置\n * 优化:支持环境变量配置、配置热更新\n */\n\nimport { logger } from '@vlian/logger';\nimport type { StartOptions } from '../types';\n\n/**\n * 配置文件格式\n */\nexport enum ConfigFileFormat {\n JSON = 'json',\n YAML = 'yaml',\n}\n\n/**\n * 配置文件加载选项\n */\nexport interface ConfigFileLoadOptions {\n /**\n * 配置文件路径\n */\n path?: string;\n\n /**\n * 配置文件格式\n */\n format?: ConfigFileFormat;\n\n /**\n * 是否必需(如果为false,文件不存在时不报错)\n */\n required?: boolean;\n\n /**\n * 默认配置(文件不存在时使用)\n */\n defaultConfig?: Partial<StartOptions>;\n}\n\n/**\n * 配置变更监听器\n */\nexport type ConfigChangeListener = (newConfig: Partial<StartOptions>, oldConfig: Partial<StartOptions>) => void;\n\n/**\n * 配置变更通知管理器\n */\nclass ConfigChangeNotifier {\n private listeners: Set<ConfigChangeListener> = new Set();\n\n /**\n * 添加配置变更监听器\n */\n addListener(listener: ConfigChangeListener): () => void {\n this.listeners.add(listener);\n // 返回取消监听的函数\n return () => {\n this.listeners.delete(listener);\n };\n }\n\n /**\n * 移除配置变更监听器\n */\n removeListener(listener: ConfigChangeListener): void {\n this.listeners.delete(listener);\n }\n\n /**\n * 通知配置变更\n */\n notify(newConfig: Partial<StartOptions>, oldConfig: Partial<StartOptions>): void {\n this.listeners.forEach((listener) => {\n try {\n listener(newConfig, oldConfig);\n } catch (error) {\n logger.warn('配置变更监听器执行失败:', error);\n }\n });\n }\n\n /**\n * 清除所有监听器\n */\n clear(): void {\n this.listeners.clear();\n }\n}\n\n/**\n * 全局配置变更通知器实例\n */\nconst configChangeNotifier = new ConfigChangeNotifier();\n\n/**\n * 配置加载器\n */\nexport class ConfigLoader {\n /**\n * 从JSON文件加载配置\n * \n * @param path - 文件路径\n * @returns 配置对象\n */\n static async loadFromJSON(path: string): Promise<Partial<StartOptions>> {\n try {\n // 在浏览器环境中,需要通过网络请求加载\n if (typeof window !== 'undefined') {\n const response = await fetch(path);\n if (!response.ok) {\n throw new Error(`无法加载配置文件: ${path} (${response.status})`);\n }\n return await response.json();\n }\n\n // 在Node.js环境中,使用fs模块\n if (typeof require !== 'undefined') {\n const fs = require('fs');\n const content = fs.readFileSync(path, 'utf-8');\n return JSON.parse(content);\n }\n\n throw new Error('不支持的环境:无法加载配置文件');\n } catch (error) {\n logger.error(`加载JSON配置文件失败: ${path}`, error);\n throw error;\n }\n }\n\n /**\n * 从YAML文件加载配置\n * \n * @param path - 文件路径\n * @returns 配置对象\n */\n static async loadFromYAML(path: string): Promise<Partial<StartOptions>> {\n try {\n // 在浏览器环境中,需要通过网络请求加载\n if (typeof window !== 'undefined') {\n const response = await fetch(path);\n if (!response.ok) {\n throw new Error(`无法加载配置文件: ${path} (${response.status})`);\n }\n const text = await response.text();\n \n // 需要YAML解析库,这里假设有yaml库\n // 如果没有,可以提示用户安装\n if (typeof (window as any).YAML !== 'undefined') {\n return (window as any).YAML.parse(text);\n }\n \n // 降级:尝试作为JSON解析(如果YAML格式简单)\n try {\n return JSON.parse(text);\n } catch {\n throw new Error('需要YAML解析库,请安装 yaml 包');\n }\n }\n\n // 在Node.js环境中,使用fs模块和yaml库\n if (typeof require !== 'undefined') {\n const fs = require('fs');\n const yaml = require('yaml');\n const content = fs.readFileSync(path, 'utf-8');\n return yaml.parse(content);\n }\n\n throw new Error('不支持的环境:无法加载配置文件');\n } catch (error) {\n logger.error(`加载YAML配置文件失败: ${path}`, error);\n throw error;\n }\n }\n\n /**\n * 从文件加载配置\n * \n * @param options - 加载选项\n * @returns 配置对象\n */\n static async loadFromFile(\n options: ConfigFileLoadOptions\n ): Promise<Partial<StartOptions>> {\n const {\n path,\n format = ConfigFileFormat.JSON,\n required = false,\n defaultConfig = {},\n } = options;\n\n if (!path) {\n if (required) {\n throw new Error('配置文件路径未指定');\n }\n return defaultConfig;\n }\n\n try {\n let config: Partial<StartOptions>;\n\n switch (format) {\n case ConfigFileFormat.JSON:\n config = await this.loadFromJSON(path);\n break;\n case ConfigFileFormat.YAML:\n config = await this.loadFromYAML(path);\n break;\n default:\n throw new Error(`不支持的配置文件格式: ${format}`);\n }\n\n logger.info(`成功加载配置文件: ${path}`);\n return config;\n } catch (error) {\n if (required) {\n throw error;\n }\n\n logger.warn(`配置文件加载失败,使用默认配置: ${path}`, error);\n return defaultConfig;\n }\n }\n\n /**\n * 合并配置(深度合并)\n * \n * @param base - 基础配置\n * @param override - 覆盖配置\n * @returns 合并后的配置\n */\n static mergeConfig(\n base: Partial<StartOptions>,\n override: Partial<StartOptions>\n ): Partial<StartOptions> {\n const merged = { ...base };\n\n for (const key in override) {\n if (!Object.prototype.hasOwnProperty.call(override, key)) {\n continue;\n }\n\n const baseValue = (merged as Record<string, unknown>)[key];\n const overrideValue = (override as Record<string, unknown>)[key];\n\n if (\n baseValue &&\n overrideValue &&\n typeof baseValue === 'object' &&\n typeof overrideValue === 'object' &&\n !Array.isArray(baseValue) &&\n !Array.isArray(overrideValue)\n ) {\n // 深度合并对象\n (merged as Record<string, unknown>)[key] = this.mergeConfig(\n baseValue as Partial<StartOptions>,\n overrideValue as Partial<StartOptions>\n );\n } else {\n // 直接覆盖\n (merged as Record<string, unknown>)[key] = overrideValue;\n }\n }\n\n return merged;\n }\n\n /**\n * 从多个源加载并合并配置\n * \n * @param sources - 配置源列表(按优先级从低到高)\n * @returns 合并后的配置\n */\n static async loadFromMultipleSources(\n sources: Array<Partial<StartOptions> | ConfigFileLoadOptions>\n ): Promise<Partial<StartOptions>> {\n let merged: Partial<StartOptions> = {};\n\n for (const source of sources) {\n if ('path' in source && 'format' in source) {\n // 配置文件\n const fileConfig = await this.loadFromFile(source);\n merged = this.mergeConfig(merged, fileConfig);\n } else if (!('path' in source) && !('format' in source)) {\n // 配置对象\n merged = this.mergeConfig(merged, source as Partial<StartOptions>);\n }\n }\n\n return merged;\n }\n\n /**\n * 从环境变量加载配置\n * \n * 支持以下环境变量格式:\n * - FRAMEWORK_LOGGER_LEVEL=DEBUG\n * - FRAMEWORK_SHOW_SPLASH_SCREEN=always\n * - FRAMEWORK_MIN_SPLASH_SCREEN_TIME=1000\n * \n * @param prefix - 环境变量前缀,默认为 'FRAMEWORK_'\n * @returns 配置对象\n */\n static loadFromEnv(prefix: string = 'FRAMEWORK_'): Partial<StartOptions> {\n const config: Partial<StartOptions> = {};\n\n if (typeof process === 'undefined' || !process.env) {\n return config;\n }\n\n // 遍历所有环境变量\n for (const [key, value] of Object.entries(process.env)) {\n if (!key.startsWith(prefix)) {\n continue;\n }\n\n // 移除前缀并转换为驼峰命名\n const configKey = key\n .slice(prefix.length)\n .toLowerCase()\n .split('_')\n .map((part, index) => \n index === 0 ? part : part.charAt(0).toUpperCase() + part.slice(1)\n )\n .join('');\n\n // 尝试解析值\n let parsedValue: unknown = value;\n if (value === 'true' || value === 'false') {\n parsedValue = value === 'true';\n } else if (!isNaN(Number(value))) {\n parsedValue = Number(value);\n } else if (value?.startsWith('{') || value?.startsWith('[')) {\n try {\n parsedValue = JSON.parse(value);\n } catch {\n // 解析失败,使用原始值\n }\n }\n\n // 设置配置值\n (config as any)[configKey] = parsedValue;\n }\n\n logger.debug('从环境变量加载配置:', config);\n return config;\n }\n\n /**\n * 从多个源加载配置(包括环境变量)\n * \n * 优化:明确优先级,从低到高:\n * 1. 默认配置\n * 2. 配置文件\n * 3. 环境变量\n * 4. 代码配置(通过 sources 参数传入)\n * \n * @param sources - 配置源列表(代码配置,优先级最高)\n * @param defaultConfig - 默认配置(优先级最低)\n * @param includeEnv - 是否包含环境变量,默认为 true\n * @param envPrefix - 环境变量前缀,默认为 'FRAMEWORK_'\n * @returns 合并后的配置\n */\n static async loadFromAllSources(\n sources: Array<Partial<StartOptions> | ConfigFileLoadOptions> = [],\n defaultConfig: Partial<StartOptions> = {},\n includeEnv: boolean = true,\n envPrefix: string = 'FRAMEWORK_'\n ): Promise<Partial<StartOptions>> {\n // 保存旧配置用于变更通知\n const oldConfig: Partial<StartOptions> = { ...defaultConfig };\n\n // 1. 从默认配置开始\n let merged: Partial<StartOptions> = { ...defaultConfig };\n\n // 2. 加载配置文件(优先级高于默认配置)\n const fileConfigs = await this.loadFromMultipleSources(sources.filter(\n (source): source is ConfigFileLoadOptions => \n typeof source === 'object' && 'path' in source\n ));\n merged = this.mergeConfig(merged, fileConfigs);\n\n // 3. 加载环境变量(优先级高于配置文件)\n if (includeEnv) {\n const envConfig = this.loadFromEnv(envPrefix);\n merged = this.mergeConfig(merged, envConfig);\n }\n\n // 4. 合并代码配置(优先级最高)\n const codeConfigs = sources.filter(\n (source): source is Partial<StartOptions> => \n typeof source === 'object' && !('path' in source)\n );\n for (const codeConfig of codeConfigs) {\n merged = this.mergeConfig(merged, codeConfig);\n }\n\n // 通知配置变更\n configChangeNotifier.notify(merged, oldConfig);\n\n return merged;\n }\n\n /**\n * 添加配置变更监听器\n * \n * @param listener - 配置变更监听器\n * @returns 取消监听的函数\n */\n static onConfigChange(listener: ConfigChangeListener): () => void {\n return configChangeNotifier.addListener(listener);\n }\n\n /**\n * 移除配置变更监听器\n */\n static removeConfigChangeListener(listener: ConfigChangeListener): void {\n configChangeNotifier.removeListener(listener);\n }\n}\n"],"names":["ConfigFileFormat","ConfigLoader","ConfigChangeNotifier","addListener","listener","listeners","add","delete","removeListener","notify","newConfig","oldConfig","forEach","error","logger","warn","clear","Set","configChangeNotifier","loadFromJSON","path","window","response","fetch","ok","Error","status","json","require","fs","content","readFileSync","JSON","parse","loadFromYAML","text","YAML","yaml","loadFromFile","options","format","required","defaultConfig","config","info","mergeConfig","base","override","merged","key","Object","prototype","hasOwnProperty","call","baseValue","overrideValue","Array","isArray","loadFromMultipleSources","sources","source","fileConfig","loadFromEnv","prefix","process","env","value","entries","startsWith","configKey","slice","length","toLowerCase","split","map","part","index","charAt","toUpperCase","join","parsedValue","isNaN","Number","debug","loadFromAllSources","includeEnv","envPrefix","fileConfigs","filter","envConfig","codeConfigs","codeConfig","onConfigChange","removeConfigChangeListener"],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../../src/core/config/ConfigLoader.ts"],"sourcesContent":["/**\n * 配置文件加载模块\n * 支持从JSON/YAML文件加载配置\n * 优化:支持环境变量配置、配置热更新\n */\n\nimport { logger } from '@vlian/logger';\nimport type { StartOptions } from '../types';\n\n/**\n * 配置文件格式\n */\nexport enum ConfigFileFormat {\n JSON = 'json',\n YAML = 'yaml',\n}\n\n/**\n * 配置文件加载选项\n */\nexport interface ConfigFileLoadOptions {\n /**\n * 配置文件路径\n */\n path?: string;\n\n /**\n * 配置文件格式\n */\n format?: ConfigFileFormat;\n\n /**\n * 是否必需(如果为false,文件不存在时不报错)\n */\n required?: boolean;\n\n /**\n * 默认配置(文件不存在时使用)\n */\n defaultConfig?: Partial<StartOptions>;\n}\n\n/**\n * 配置变更监听器\n */\nexport type ConfigChangeListener = (newConfig: Partial<StartOptions>, oldConfig: Partial<StartOptions>) => void;\n\n/**\n * 配置变更通知管理器\n */\nclass ConfigChangeNotifier {\n private listeners: Set<ConfigChangeListener> = new Set();\n\n /**\n * 添加配置变更监听器\n */\n addListener(listener: ConfigChangeListener): () => void {\n this.listeners.add(listener);\n // 返回取消监听的函数\n return () => {\n this.listeners.delete(listener);\n };\n }\n\n /**\n * 移除配置变更监听器\n */\n removeListener(listener: ConfigChangeListener): void {\n this.listeners.delete(listener);\n }\n\n /**\n * 通知配置变更\n */\n notify(newConfig: Partial<StartOptions>, oldConfig: Partial<StartOptions>): void {\n this.listeners.forEach((listener) => {\n try {\n listener(newConfig, oldConfig);\n } catch (error) {\n logger.warn('配置变更监听器执行失败:', error);\n }\n });\n }\n\n /**\n * 清除所有监听器\n */\n clear(): void {\n this.listeners.clear();\n }\n}\n\n/**\n * 全局配置变更通知器实例\n */\nconst configChangeNotifier = new ConfigChangeNotifier();\n\n/**\n * 配置加载器\n */\nexport class ConfigLoader {\n /**\n * 从JSON文件加载配置\n * \n * @param path - 文件路径\n * @returns 配置对象\n */\n static async loadFromJSON(path: string): Promise<Partial<StartOptions>> {\n try {\n // 在浏览器环境中,需要通过网络请求加载\n if (typeof window !== 'undefined') {\n const response = await fetch(path);\n if (!response.ok) {\n throw new Error(`无法加载配置文件: ${path} (${response.status})`);\n }\n return await response.json();\n }\n\n // 在Node.js环境中,使用fs模块\n if (typeof require !== 'undefined') {\n const fs = require('fs');\n const content = fs.readFileSync(path, 'utf-8');\n return JSON.parse(content);\n }\n\n throw new Error('不支持的环境:无法加载配置文件');\n } catch (error) {\n logger.error(`加载JSON配置文件失败: ${path}`, error);\n throw error;\n }\n }\n\n /**\n * 从YAML文件加载配置\n * \n * @param path - 文件路径\n * @returns 配置对象\n */\n static async loadFromYAML(path: string): Promise<Partial<StartOptions>> {\n try {\n // 在浏览器环境中,需要通过网络请求加载\n if (typeof window !== 'undefined') {\n const response = await fetch(path);\n if (!response.ok) {\n throw new Error(`无法加载配置文件: ${path} (${response.status})`);\n }\n const text = await response.text();\n \n // 需要YAML解析库,这里假设有yaml库\n // 如果没有,可以提示用户安装\n if (typeof (window as any).YAML !== 'undefined') {\n return (window as any).YAML.parse(text);\n }\n \n // 降级:尝试作为JSON解析(如果YAML格式简单)\n try {\n return JSON.parse(text);\n } catch {\n throw new Error('需要YAML解析库,请安装 yaml 包');\n }\n }\n\n // 在Node.js环境中,使用fs模块和yaml库\n if (typeof require !== 'undefined') {\n const fs = require('fs');\n const yaml = require('yaml');\n const content = fs.readFileSync(path, 'utf-8');\n return yaml.parse(content);\n }\n\n throw new Error('不支持的环境:无法加载配置文件');\n } catch (error) {\n logger.error(`加载YAML配置文件失败: ${path}`, error);\n throw error;\n }\n }\n\n /**\n * 从文件加载配置\n * \n * @param options - 加载选项\n * @returns 配置对象\n */\n static async loadFromFile(\n options: ConfigFileLoadOptions\n ): Promise<Partial<StartOptions>> {\n const {\n path,\n format = ConfigFileFormat.JSON,\n required = false,\n defaultConfig = {},\n } = options;\n\n if (!path) {\n if (required) {\n throw new Error('配置文件路径未指定');\n }\n return defaultConfig;\n }\n\n try {\n let config: Partial<StartOptions>;\n\n switch (format) {\n case ConfigFileFormat.JSON:\n config = await this.loadFromJSON(path);\n break;\n case ConfigFileFormat.YAML:\n config = await this.loadFromYAML(path);\n break;\n default:\n throw new Error(`不支持的配置文件格式: ${format}`);\n }\n\n logger.info(`成功加载配置文件: ${path}`);\n return config;\n } catch (error) {\n if (required) {\n throw error;\n }\n\n logger.warn(`配置文件加载失败,使用默认配置: ${path}`, error);\n return defaultConfig;\n }\n }\n\n /**\n * 合并配置(深度合并)\n * \n * @param base - 基础配置\n * @param override - 覆盖配置\n * @returns 合并后的配置\n */\n static mergeConfig(\n base: Partial<StartOptions>,\n override: Partial<StartOptions>\n ): Partial<StartOptions> {\n const merged = { ...base };\n\n for (const key in override) {\n if (!Object.prototype.hasOwnProperty.call(override, key)) {\n continue;\n }\n\n const baseValue = (merged as Record<string, unknown>)[key];\n const overrideValue = (override as Record<string, unknown>)[key];\n\n if (\n baseValue &&\n overrideValue &&\n typeof baseValue === 'object' &&\n typeof overrideValue === 'object' &&\n !Array.isArray(baseValue) &&\n !Array.isArray(overrideValue)\n ) {\n // 深度合并对象\n (merged as Record<string, unknown>)[key] = this.mergeConfig(\n baseValue as Partial<StartOptions>,\n overrideValue as Partial<StartOptions>\n );\n } else {\n // 直接覆盖\n (merged as Record<string, unknown>)[key] = overrideValue;\n }\n }\n\n return merged;\n }\n\n /**\n * 从多个源加载并合并配置\n * \n * @param sources - 配置源列表(按优先级从低到高)\n * @returns 合并后的配置\n */\n static async loadFromMultipleSources(\n sources: Array<Partial<StartOptions> | ConfigFileLoadOptions>\n ): Promise<Partial<StartOptions>> {\n let merged: Partial<StartOptions> = {};\n\n for (const source of sources) {\n if ('path' in source && 'format' in source) {\n // 配置文件\n const fileConfig = await this.loadFromFile(source);\n merged = this.mergeConfig(merged, fileConfig);\n } else if (!('path' in source) && !('format' in source)) {\n // 配置对象\n merged = this.mergeConfig(merged, source as Partial<StartOptions>);\n }\n }\n\n return merged;\n }\n\n /**\n * 从环境变量加载配置\n * \n * 支持以下环境变量格式:\n * - FRAMEWORK_LOGGER_LEVEL=DEBUG\n * - FRAMEWORK_SHOW_SPLASH_SCREEN=always\n * - FRAMEWORK_MIN_SPLASH_SCREEN_TIME=1000\n * \n * @param prefix - 环境变量前缀,默认为 'FRAMEWORK_'\n * @returns 配置对象\n */\n static loadFromEnv(prefix: string = 'FRAMEWORK_'): Partial<StartOptions> {\n const config: Partial<StartOptions> = {};\n\n if (typeof process === 'undefined' || !process.env) {\n return config;\n }\n\n // 遍历所有环境变量\n for (const [key, value] of Object.entries(process.env)) {\n if (!key.startsWith(prefix)) {\n continue;\n }\n\n // 移除前缀并转换为驼峰命名\n const configKey = key\n .slice(prefix.length)\n .toLowerCase()\n .split('_')\n .map((part, index) => \n index === 0 ? part : part.charAt(0).toUpperCase() + part.slice(1)\n )\n .join('');\n\n // 尝试解析值\n let parsedValue: unknown = value;\n if (value === 'true' || value === 'false') {\n parsedValue = value === 'true';\n } else if (!isNaN(Number(value))) {\n parsedValue = Number(value);\n } else if (value?.startsWith('{') || value?.startsWith('[')) {\n try {\n parsedValue = JSON.parse(value);\n } catch {\n // 解析失败,使用原始值\n }\n }\n\n // 设置配置值\n (config as any)[configKey] = parsedValue;\n }\n\n logger.debug('从环境变量加载配置:', config);\n return config;\n }\n\n /**\n * 从多个源加载配置(包括环境变量)\n * \n * 优化:明确优先级,从低到高:\n * 1. 默认配置\n * 2. 配置文件\n * 3. 环境变量\n * 4. 代码配置(通过 sources 参数传入)\n * \n * @param sources - 配置源列表(代码配置,优先级最高)\n * @param defaultConfig - 默认配置(优先级最低)\n * @param includeEnv - 是否包含环境变量,默认为 true\n * @param envPrefix - 环境变量前缀,默认为 'FRAMEWORK_'\n * @returns 合并后的配置\n */\n static async loadFromAllSources(\n sources: Array<Partial<StartOptions> | ConfigFileLoadOptions> = [],\n defaultConfig: Partial<StartOptions> = {},\n includeEnv: boolean = true,\n envPrefix: string = 'FRAMEWORK_'\n ): Promise<Partial<StartOptions>> {\n // 保存旧配置用于变更通知\n const oldConfig: Partial<StartOptions> = { ...defaultConfig };\n\n // 1. 从默认配置开始\n let merged: Partial<StartOptions> = { ...defaultConfig };\n\n // 2. 加载配置文件(优先级高于默认配置)\n const fileConfigs = await this.loadFromMultipleSources(sources.filter(\n (source): source is ConfigFileLoadOptions => \n typeof source === 'object' && 'path' in source\n ));\n merged = this.mergeConfig(merged, fileConfigs);\n\n // 3. 加载环境变量(优先级高于配置文件)\n if (includeEnv) {\n const envConfig = this.loadFromEnv(envPrefix);\n merged = this.mergeConfig(merged, envConfig);\n }\n\n // 4. 合并代码配置(优先级最高)\n const codeConfigs = sources.filter(\n (source): source is Partial<StartOptions> => \n typeof source === 'object' && !('path' in source)\n );\n for (const codeConfig of codeConfigs) {\n merged = this.mergeConfig(merged, codeConfig);\n }\n\n // 通知配置变更\n configChangeNotifier.notify(merged, oldConfig);\n\n return merged;\n }\n\n /**\n * 添加配置变更监听器\n * \n * @param listener - 配置变更监听器\n * @returns 取消监听的函数\n */\n static onConfigChange(listener: ConfigChangeListener): () => void {\n return configChangeNotifier.addListener(listener);\n }\n\n /**\n * 移除配置变更监听器\n */\n static removeConfigChangeListener(listener: ConfigChangeListener): void {\n configChangeNotifier.removeListener(listener);\n }\n}\n"],"names":["logger","ConfigFileFormat","ConfigChangeNotifier","addListener","listener","listeners","add","delete","removeListener","notify","newConfig","oldConfig","forEach","error","warn","clear","Set","configChangeNotifier","ConfigLoader","loadFromJSON","path","window","response","fetch","ok","Error","status","json","require","fs","content","readFileSync","JSON","parse","loadFromYAML","text","YAML","yaml","loadFromFile","options","format","required","defaultConfig","config","info","mergeConfig","base","override","merged","key","Object","prototype","hasOwnProperty","call","baseValue","overrideValue","Array","isArray","loadFromMultipleSources","sources","source","fileConfig","loadFromEnv","prefix","process","env","value","entries","startsWith","configKey","slice","length","toLowerCase","split","map","part","index","charAt","toUpperCase","join","parsedValue","isNaN","Number","debug","loadFromAllSources","includeEnv","envPrefix","fileConfigs","filter","envConfig","codeConfigs","codeConfig","onConfigChange","removeConfigChangeListener"],"mappings":";;;;;;;;;;;;;AAAA;;;;CAIC,GAED,SAASA,MAAM,QAAQ,gBAAgB;AAGvC;;CAEC,GACD,OAAO,IAAA,AAAKC,0CAAAA;;;WAAAA;MAGX;AAgCD;;CAEC,GACD,IAAA,AAAMC,uBAAN,MAAMA;IAGJ;;GAEC,GACDC,YAAYC,QAA8B,EAAc;QACtD,IAAI,CAACC,SAAS,CAACC,GAAG,CAACF;QACnB,YAAY;QACZ,OAAO;YACL,IAAI,CAACC,SAAS,CAACE,MAAM,CAACH;QACxB;IACF;IAEA;;GAEC,GACDI,eAAeJ,QAA8B,EAAQ;QACnD,IAAI,CAACC,SAAS,CAACE,MAAM,CAACH;IACxB;IAEA;;GAEC,GACDK,OAAOC,SAAgC,EAAEC,SAAgC,EAAQ;QAC/E,IAAI,CAACN,SAAS,CAACO,OAAO,CAAC,CAACR;YACtB,IAAI;gBACFA,SAASM,WAAWC;YACtB,EAAE,OAAOE,OAAO;gBACdb,OAAOc,IAAI,CAAC,gBAAgBD;YAC9B;QACF;IACF;IAEA;;GAEC,GACDE,QAAc;QACZ,IAAI,CAACV,SAAS,CAACU,KAAK;IACtB;;QAtCA,uBAAQV,aAAuC,IAAIW;;AAuCrD;AAEA;;CAEC,GACD,MAAMC,uBAAuB,IAAIf;AAEjC;;CAEC,GACD,OAAO,MAAMgB;IACX;;;;;GAKC,GACD,aAAaC,aAAaC,IAAY,EAAkC;QACtE,IAAI;YACF,qBAAqB;YACrB,IAAI,OAAOC,WAAW,aAAa;gBACjC,MAAMC,WAAW,MAAMC,MAAMH;gBAC7B,IAAI,CAACE,SAASE,EAAE,EAAE;oBAChB,MAAM,IAAIC,MAAM,CAAC,UAAU,EAAEL,KAAK,EAAE,EAAEE,SAASI,MAAM,CAAC,CAAC,CAAC;gBAC1D;gBACA,OAAO,MAAMJ,SAASK,IAAI;YAC5B;YAEA,qBAAqB;YACrB,IAAI,OAAOC,YAAY,aAAa;gBAClC,MAAMC,KAAKD,QAAQ;gBACnB,MAAME,UAAUD,GAAGE,YAAY,CAACX,MAAM;gBACtC,OAAOY,KAAKC,KAAK,CAACH;YACpB;YAEA,MAAM,IAAIL,MAAM;QAClB,EAAE,OAAOZ,OAAO;YACdb,OAAOa,KAAK,CAAC,CAAC,cAAc,EAAEO,MAAM,EAAEP;YACtC,MAAMA;QACR;IACF;IAEA;;;;;GAKC,GACD,aAAaqB,aAAad,IAAY,EAAkC;QACtE,IAAI;YACF,qBAAqB;YACrB,IAAI,OAAOC,WAAW,aAAa;gBACjC,MAAMC,WAAW,MAAMC,MAAMH;gBAC7B,IAAI,CAACE,SAASE,EAAE,EAAE;oBAChB,MAAM,IAAIC,MAAM,CAAC,UAAU,EAAEL,KAAK,EAAE,EAAEE,SAASI,MAAM,CAAC,CAAC,CAAC;gBAC1D;gBACA,MAAMS,OAAO,MAAMb,SAASa,IAAI;gBAEhC,uBAAuB;gBACvB,gBAAgB;gBAChB,IAAI,OAAO,AAACd,OAAee,IAAI,KAAK,aAAa;oBAC/C,OAAO,AAACf,OAAee,IAAI,CAACH,KAAK,CAACE;gBACpC;gBAEA,4BAA4B;gBAC5B,IAAI;oBACF,OAAOH,KAAKC,KAAK,CAACE;gBACpB,EAAE,OAAM;oBACN,MAAM,IAAIV,MAAM;gBAClB;YACF;YAEA,2BAA2B;YAC3B,IAAI,OAAOG,YAAY,aAAa;gBAClC,MAAMC,KAAKD,QAAQ;gBACnB,MAAMS,OAAOT,QAAQ;gBACrB,MAAME,UAAUD,GAAGE,YAAY,CAACX,MAAM;gBACtC,OAAOiB,KAAKJ,KAAK,CAACH;YACpB;YAEA,MAAM,IAAIL,MAAM;QAClB,EAAE,OAAOZ,OAAO;YACdb,OAAOa,KAAK,CAAC,CAAC,cAAc,EAAEO,MAAM,EAAEP;YACtC,MAAMA;QACR;IACF;IAEA;;;;;GAKC,GACD,aAAayB,aACXC,OAA8B,EACE;QAChC,MAAM,EACJnB,IAAI,EACJoB,eAA8B,EAC9BC,WAAW,KAAK,EAChBC,gBAAgB,CAAC,CAAC,EACnB,GAAGH;QAEJ,IAAI,CAACnB,MAAM;YACT,IAAIqB,UAAU;gBACZ,MAAM,IAAIhB,MAAM;YAClB;YACA,OAAOiB;QACT;QAEA,IAAI;YACF,IAAIC;YAEJ,OAAQH;gBACN;oBACEG,SAAS,MAAM,IAAI,CAACxB,YAAY,CAACC;oBACjC;gBACF;oBACEuB,SAAS,MAAM,IAAI,CAACT,YAAY,CAACd;oBACjC;gBACF;oBACE,MAAM,IAAIK,MAAM,CAAC,YAAY,EAAEe,QAAQ;YAC3C;YAEAxC,OAAO4C,IAAI,CAAC,CAAC,UAAU,EAAExB,MAAM;YAC/B,OAAOuB;QACT,EAAE,OAAO9B,OAAO;YACd,IAAI4B,UAAU;gBACZ,MAAM5B;YACR;YAEAb,OAAOc,IAAI,CAAC,CAAC,iBAAiB,EAAEM,MAAM,EAAEP;YACxC,OAAO6B;QACT;IACF;IAEA;;;;;;GAMC,GACD,OAAOG,YACLC,IAA2B,EAC3BC,QAA+B,EACR;QACvB,MAAMC,SAAS;YAAE,GAAGF,IAAI;QAAC;QAEzB,IAAK,MAAMG,OAAOF,SAAU;YAC1B,IAAI,CAACG,OAAOC,SAAS,CAACC,cAAc,CAACC,IAAI,CAACN,UAAUE,MAAM;gBACxD;YACF;YAEA,MAAMK,YAAY,AAACN,MAAkC,CAACC,IAAI;YAC1D,MAAMM,gBAAgB,AAACR,QAAoC,CAACE,IAAI;YAEhE,IACEK,aACAC,iBACA,OAAOD,cAAc,YACrB,OAAOC,kBAAkB,YACzB,CAACC,MAAMC,OAAO,CAACH,cACf,CAACE,MAAMC,OAAO,CAACF,gBACf;gBACA,SAAS;gBACRP,MAAkC,CAACC,IAAI,GAAG,IAAI,CAACJ,WAAW,CACzDS,WACAC;YAEJ,OAAO;gBACL,OAAO;gBACNP,MAAkC,CAACC,IAAI,GAAGM;YAC7C;QACF;QAEA,OAAOP;IACT;IAEA;;;;;GAKC,GACD,aAAaU,wBACXC,OAA6D,EAC7B;QAChC,IAAIX,SAAgC,CAAC;QAErC,KAAK,MAAMY,UAAUD,QAAS;YAC5B,IAAI,UAAUC,UAAU,YAAYA,QAAQ;gBAC1C,OAAO;gBACP,MAAMC,aAAa,MAAM,IAAI,CAACvB,YAAY,CAACsB;gBAC3CZ,SAAS,IAAI,CAACH,WAAW,CAACG,QAAQa;YACpC,OAAO,IAAI,CAAE,CAAA,UAAUD,MAAK,KAAM,CAAE,CAAA,YAAYA,MAAK,GAAI;gBACvD,OAAO;gBACPZ,SAAS,IAAI,CAACH,WAAW,CAACG,QAAQY;YACpC;QACF;QAEA,OAAOZ;IACT;IAEA;;;;;;;;;;GAUC,GACD,OAAOc,YAAYC,SAAiB,YAAY,EAAyB;QACvE,MAAMpB,SAAgC,CAAC;QAEvC,IAAI,OAAOqB,YAAY,eAAe,CAACA,QAAQC,GAAG,EAAE;YAClD,OAAOtB;QACT;QAEA,WAAW;QACX,KAAK,MAAM,CAACM,KAAKiB,MAAM,IAAIhB,OAAOiB,OAAO,CAACH,QAAQC,GAAG,EAAG;YACtD,IAAI,CAAChB,IAAImB,UAAU,CAACL,SAAS;gBAC3B;YACF;YAEA,eAAe;YACf,MAAMM,YAAYpB,IACfqB,KAAK,CAACP,OAAOQ,MAAM,EACnBC,WAAW,GACXC,KAAK,CAAC,KACNC,GAAG,CAAC,CAACC,MAAMC,QACVA,UAAU,IAAID,OAAOA,KAAKE,MAAM,CAAC,GAAGC,WAAW,KAAKH,KAAKL,KAAK,CAAC,IAEhES,IAAI,CAAC;YAER,QAAQ;YACR,IAAIC,cAAuBd;YAC3B,IAAIA,UAAU,UAAUA,UAAU,SAAS;gBACzCc,cAAcd,UAAU;YAC1B,OAAO,IAAI,CAACe,MAAMC,OAAOhB,SAAS;gBAChCc,cAAcE,OAAOhB;YACvB,OAAO,IAAIA,OAAOE,WAAW,QAAQF,OAAOE,WAAW,MAAM;gBAC3D,IAAI;oBACFY,cAAchD,KAAKC,KAAK,CAACiC;gBAC3B,EAAE,OAAM;gBACN,aAAa;gBACf;YACF;YAEA,QAAQ;YACPvB,MAAc,CAAC0B,UAAU,GAAGW;QAC/B;QAEAhF,OAAOmF,KAAK,CAAC,cAAcxC;QAC3B,OAAOA;IACT;IAEA;;;;;;;;;;;;;;GAcC,GACD,aAAayC,mBACXzB,UAAgE,EAAE,EAClEjB,gBAAuC,CAAC,CAAC,EACzC2C,aAAsB,IAAI,EAC1BC,YAAoB,YAAY,EACA;QAChC,cAAc;QACd,MAAM3E,YAAmC;YAAE,GAAG+B,aAAa;QAAC;QAE5D,aAAa;QACb,IAAIM,SAAgC;YAAE,GAAGN,aAAa;QAAC;QAEvD,uBAAuB;QACvB,MAAM6C,cAAc,MAAM,IAAI,CAAC7B,uBAAuB,CAACC,QAAQ6B,MAAM,CACnE,CAAC5B,SACC,OAAOA,WAAW,YAAY,UAAUA;QAE5CZ,SAAS,IAAI,CAACH,WAAW,CAACG,QAAQuC;QAElC,uBAAuB;QACvB,IAAIF,YAAY;YACd,MAAMI,YAAY,IAAI,CAAC3B,WAAW,CAACwB;YACnCtC,SAAS,IAAI,CAACH,WAAW,CAACG,QAAQyC;QACpC;QAEA,mBAAmB;QACnB,MAAMC,cAAc/B,QAAQ6B,MAAM,CAChC,CAAC5B,SACC,OAAOA,WAAW,YAAY,CAAE,CAAA,UAAUA,MAAK;QAEnD,KAAK,MAAM+B,cAAcD,YAAa;YACpC1C,SAAS,IAAI,CAACH,WAAW,CAACG,QAAQ2C;QACpC;QAEA,SAAS;QACT1E,qBAAqBR,MAAM,CAACuC,QAAQrC;QAEpC,OAAOqC;IACT;IAEA;;;;;GAKC,GACD,OAAO4C,eAAexF,QAA8B,EAAc;QAChE,OAAOa,qBAAqBd,WAAW,CAACC;IAC1C;IAEA;;GAEC,GACD,OAAOyF,2BAA2BzF,QAA8B,EAAQ;QACtEa,qBAAqBT,cAAc,CAACJ;IACtC;AACF"}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../../src/core/config/ConfigValidator.ts"],"sourcesContent":["/**\n * 配置验证模块\n * 使用Zod进行配置验证\n */\n\nimport { z } from 'zod';\n\n/**\n * 配置验证错误\n */\nexport class ConfigValidationError extends Error {\n constructor(\n message: string,\n public readonly errors: z.ZodError\n ) {\n super(message);\n this.name = 'ConfigValidationError';\n }\n}\n\n/**\n * 配置验证器\n */\nexport class ConfigValidator {\n /**\n * 验证配置\n * \n * @param config - 要验证的配置\n * @param schema - Zod模式\n * @returns 验证后的配置\n * @throws ConfigValidationError 如果配置验证失败\n */\n static validate<T>(\n config: unknown,\n schema: z.ZodSchema<T>\n ): T {\n const result = schema.safeParse(config);\n\n if (!result.success) {\n throw new ConfigValidationError(\n '配置验证失败',\n result.error\n );\n }\n\n return result.data;\n }\n\n /**\n * 安全验证配置(不抛出异常)\n * \n * @param config - 要验证的配置\n * @param schema - Zod模式\n * @returns 验证结果\n */\n static safeValidate<T>(\n config: unknown,\n schema: z.ZodSchema<T>\n ): { success: true; data: T } | { success: false; error: z.ZodError } {\n const result = schema.safeParse(config);\n\n if (result.success) {\n return { success: true, data: result.data };\n }\n\n return { success: false, error: result.error };\n }\n\n /**\n * 创建StartOptions的部分验证模式\n * 注意:这是一个基础模式,可以根据需要扩展\n */\n static createStartOptionsSchema() {\n return z.object({\n loggerLevel: z.enum(['DEBUG', 'INFO', 'WARN', 'ERROR']).optional(),\n showSplashScreen: z.enum(['auto', 'always', 'never', 'first-time-only']).optional(),\n minSplashScreenTime: z.number().positive().optional(),\n security: z.object({\n enableXSSProtection: z.boolean().optional(),\n validateConfig: z.boolean().optional(),\n sanitizeUserInput: z.boolean().optional(),\n csp: z.object({\n defaultSrc: z.array(z.string()).optional(),\n scriptSrc: z.array(z.string()).optional(),\n styleSrc: z.array(z.string()).optional(),\n imgSrc: z.array(z.string()).optional(),\n connectSrc: z.array(z.string()).optional(),\n fontSrc: z.array(z.string()).optional(),\n frameSrc: z.array(z.string()).optional(),\n allowUnsafeInline: z.boolean().optional(),\n allowUnsafeEval: z.boolean().optional(),\n }).optional(),\n }).optional(),\n }).passthrough(); // passthrough允许其他字段通过\n }\n\n /**\n * 验证配置并提供友好的错误信息\n * \n * @param config - 要验证的配置\n * @param schema - Zod模式\n * @returns 验证后的配置\n * @throws ConfigValidationError 如果配置验证失败,包含详细的错误信息\n */\n static validateWithFriendlyErrors<T>(\n config: unknown,\n schema: z.ZodSchema<T>\n ): T {\n const result = schema.safeParse(config);\n\n if (!result.success) {\n // 构建友好的错误信息\n // 注意:ZodError 使用 issues 属性,不是 errors\n const errorMessages = result.error.issues.map((issue: z.ZodIssue) => {\n const path = issue.path.length > 0 ? issue.path.join('.') : 'root';\n return `配置项 \"${path}\": ${issue.message}`;\n });\n\n const friendlyMessage = `配置验证失败:\\n${errorMessages.join('\\n')}`;\n\n throw new ConfigValidationError(friendlyMessage, result.error);\n }\n\n return result.data;\n }\n}\n"],"names":["ConfigValidationError","ConfigValidator","Error","message","errors","name","validate","config","schema","result","safeParse","success","error","data","safeValidate","createStartOptionsSchema","z","object","loggerLevel","enum","optional","showSplashScreen","minSplashScreenTime","number","positive","security","enableXSSProtection","boolean","validateConfig","sanitizeUserInput","csp","defaultSrc","array","string","scriptSrc","styleSrc","imgSrc","connectSrc","fontSrc","frameSrc","allowUnsafeInline","allowUnsafeEval","passthrough","validateWithFriendlyErrors","errorMessages","issues","map","issue","path","length","join","friendlyMessage"],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../../src/core/config/ConfigValidator.ts"],"sourcesContent":["/**\n * 配置验证模块\n * 使用Zod进行配置验证\n */\n\nimport { z } from 'zod';\n\n/**\n * 配置验证错误\n */\nexport class ConfigValidationError extends Error {\n constructor(\n message: string,\n public readonly errors: z.ZodError\n ) {\n super(message);\n this.name = 'ConfigValidationError';\n }\n}\n\n/**\n * 配置验证器\n */\nexport class ConfigValidator {\n /**\n * 验证配置\n * \n * @param config - 要验证的配置\n * @param schema - Zod模式\n * @returns 验证后的配置\n * @throws ConfigValidationError 如果配置验证失败\n */\n static validate<T>(\n config: unknown,\n schema: z.ZodSchema<T>\n ): T {\n const result = schema.safeParse(config);\n\n if (!result.success) {\n throw new ConfigValidationError(\n '配置验证失败',\n result.error\n );\n }\n\n return result.data;\n }\n\n /**\n * 安全验证配置(不抛出异常)\n * \n * @param config - 要验证的配置\n * @param schema - Zod模式\n * @returns 验证结果\n */\n static safeValidate<T>(\n config: unknown,\n schema: z.ZodSchema<T>\n ): { success: true; data: T } | { success: false; error: z.ZodError } {\n const result = schema.safeParse(config);\n\n if (result.success) {\n return { success: true, data: result.data };\n }\n\n return { success: false, error: result.error };\n }\n\n /**\n * 创建StartOptions的部分验证模式\n * 注意:这是一个基础模式,可以根据需要扩展\n */\n static createStartOptionsSchema() {\n return z.object({\n loggerLevel: z.enum(['DEBUG', 'INFO', 'WARN', 'ERROR']).optional(),\n showSplashScreen: z.enum(['auto', 'always', 'never', 'first-time-only']).optional(),\n minSplashScreenTime: z.number().positive().optional(),\n security: z.object({\n enableXSSProtection: z.boolean().optional(),\n validateConfig: z.boolean().optional(),\n sanitizeUserInput: z.boolean().optional(),\n csp: z.object({\n defaultSrc: z.array(z.string()).optional(),\n scriptSrc: z.array(z.string()).optional(),\n styleSrc: z.array(z.string()).optional(),\n imgSrc: z.array(z.string()).optional(),\n connectSrc: z.array(z.string()).optional(),\n fontSrc: z.array(z.string()).optional(),\n frameSrc: z.array(z.string()).optional(),\n allowUnsafeInline: z.boolean().optional(),\n allowUnsafeEval: z.boolean().optional(),\n }).optional(),\n }).optional(),\n }).passthrough(); // passthrough允许其他字段通过\n }\n\n /**\n * 验证配置并提供友好的错误信息\n * \n * @param config - 要验证的配置\n * @param schema - Zod模式\n * @returns 验证后的配置\n * @throws ConfigValidationError 如果配置验证失败,包含详细的错误信息\n */\n static validateWithFriendlyErrors<T>(\n config: unknown,\n schema: z.ZodSchema<T>\n ): T {\n const result = schema.safeParse(config);\n\n if (!result.success) {\n // 构建友好的错误信息\n // 注意:ZodError 使用 issues 属性,不是 errors\n const errorMessages = result.error.issues.map((issue: z.ZodIssue) => {\n const path = issue.path.length > 0 ? issue.path.join('.') : 'root';\n return `配置项 \"${path}\": ${issue.message}`;\n });\n\n const friendlyMessage = `配置验证失败:\\n${errorMessages.join('\\n')}`;\n\n throw new ConfigValidationError(friendlyMessage, result.error);\n }\n\n return result.data;\n }\n}\n"],"names":["z","ConfigValidationError","Error","message","errors","name","ConfigValidator","validate","config","schema","result","safeParse","success","error","data","safeValidate","createStartOptionsSchema","object","loggerLevel","enum","optional","showSplashScreen","minSplashScreenTime","number","positive","security","enableXSSProtection","boolean","validateConfig","sanitizeUserInput","csp","defaultSrc","array","string","scriptSrc","styleSrc","imgSrc","connectSrc","fontSrc","frameSrc","allowUnsafeInline","allowUnsafeEval","passthrough","validateWithFriendlyErrors","errorMessages","issues","map","issue","path","length","join","friendlyMessage"],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../../src/core/config/index.ts"],"sourcesContent":["/**\n * 配置模块统一导出\n */\n\nexport * from './ConfigValidator';\nexport * from './ConfigLoader';\nexport { appConfig } from './AppConfig';"],"names":["appConfig"],"mappings":"AAAA;;CAEC;;;;+BAIQA;;;eAAAA,oBAAS;;;qBAFJ;qBACA;2BACY"}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../../src/core/config/index.ts"],"sourcesContent":["/**\n * 配置模块统一导出\n */\n\nexport * from './ConfigValidator';\nexport * from './ConfigLoader';\nexport { appConfig } from './AppConfig';"],"names":["appConfig"],"mappings":"AAAA;;CAEC,GAED,cAAc,oBAAoB;AAClC,cAAc,iBAAiB;AAC/B,SAASA,SAAS,QAAQ,cAAc"}