@vlian/framework 2.0.1 → 2.0.3

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 (85) hide show
  1. package/README.md +7 -4
  2. package/dist/i18n.cjs +1 -0
  3. package/dist/i18n.d.ts +2 -0
  4. package/dist/i18n.js +1 -0
  5. package/dist/i18n.lazy.cjs +1 -0
  6. package/dist/i18n.lazy.d.ts +2 -0
  7. package/dist/i18n.lazy.js +1 -0
  8. package/dist/index.umd.js +6 -4
  9. package/dist/kernel/custom-manager/i18n/I18nManager.cjs +1 -0
  10. package/dist/kernel/{manager → custom-manager}/i18n/I18nManager.d.ts +1 -1
  11. package/dist/kernel/custom-manager/i18n/I18nManager.js +1 -0
  12. package/dist/kernel/{manager → custom-manager}/i18n/i18n.persistence.d.ts +1 -1
  13. package/dist/kernel/{manager → custom-manager}/i18n/i18n.schema.cjs +1 -1
  14. package/dist/kernel/{manager → custom-manager}/i18n/i18n.schema.d.ts +1 -1
  15. package/dist/kernel/custom-manager/i18n/i18n.schema.js +1 -0
  16. package/dist/kernel/custom-manager/i18n/index.cjs +1 -1
  17. package/dist/kernel/custom-manager/i18n/index.d.ts +3 -2
  18. package/dist/kernel/custom-manager/i18n/index.js +1 -1
  19. package/dist/kernel/custom-manager/i18n/lazy.cjs +1 -0
  20. package/dist/kernel/custom-manager/i18n/lazy.d.ts +3 -0
  21. package/dist/kernel/custom-manager/i18n/lazy.js +1 -0
  22. package/dist/kernel/custom-manager/index.cjs +1 -1
  23. package/dist/kernel/custom-manager/index.d.ts +2 -2
  24. package/dist/kernel/custom-manager/index.js +1 -1
  25. package/dist/kernel/custom-manager/theme/ThemeManager.cjs +1 -0
  26. package/dist/kernel/{manager → custom-manager}/theme/ThemeManager.d.ts +1 -1
  27. package/dist/kernel/custom-manager/theme/ThemeManager.js +1 -0
  28. package/dist/kernel/custom-manager/theme/index.cjs +1 -1
  29. package/dist/kernel/custom-manager/theme/index.d.ts +3 -2
  30. package/dist/kernel/custom-manager/theme/index.js +1 -1
  31. package/dist/kernel/custom-manager/theme/lazy.cjs +1 -0
  32. package/dist/kernel/custom-manager/theme/lazy.d.ts +3 -0
  33. package/dist/kernel/custom-manager/theme/lazy.js +1 -0
  34. package/dist/kernel/{manager → custom-manager}/theme/theme.dom.d.ts +1 -1
  35. package/dist/kernel/{manager → custom-manager}/theme/theme.persistence.d.ts +1 -1
  36. package/dist/kernel/{manager → custom-manager}/theme/theme.schema.d.ts +1 -1
  37. package/dist/kernel/index.cjs +1 -1
  38. package/dist/kernel/index.d.ts +1 -2
  39. package/dist/kernel/index.js +1 -1
  40. package/dist/kernel/kernel.cjs +1 -1
  41. package/dist/kernel/kernel.d.ts +7 -0
  42. package/dist/kernel/kernel.js +1 -1
  43. package/dist/kernel/manager/cacheManager.cjs +1 -1
  44. package/dist/kernel/manager/cacheManager.js +1 -1
  45. package/dist/kernel/manager/logger/LoggerManager.cjs +1 -1
  46. package/dist/kernel/manager/logger/LoggerManager.js +1 -1
  47. package/dist/kernel/manager-registration.cjs +1 -0
  48. package/dist/kernel/manager-registration.d.ts +25 -0
  49. package/dist/kernel/manager-registration.js +1 -0
  50. package/dist/kernel/types.d.ts +2 -1
  51. package/dist/theme.cjs +1 -0
  52. package/dist/theme.d.ts +2 -0
  53. package/dist/theme.js +1 -0
  54. package/dist/theme.lazy.cjs +1 -0
  55. package/dist/theme.lazy.d.ts +2 -0
  56. package/dist/theme.lazy.js +1 -0
  57. package/package.json +45 -1
  58. package/dist/kernel/manager/i18n/I18nManager.cjs +0 -1
  59. package/dist/kernel/manager/i18n/I18nManager.js +0 -1
  60. package/dist/kernel/manager/i18n/i18n.schema.js +0 -1
  61. package/dist/kernel/manager/i18n/index.cjs +0 -1
  62. package/dist/kernel/manager/i18n/index.d.ts +0 -1
  63. package/dist/kernel/manager/i18n/index.js +0 -1
  64. package/dist/kernel/manager/i18nManager.cjs +0 -1
  65. package/dist/kernel/manager/i18nManager.d.ts +0 -1
  66. package/dist/kernel/manager/i18nManager.js +0 -1
  67. package/dist/kernel/manager/theme/ThemeManager.cjs +0 -1
  68. package/dist/kernel/manager/theme/ThemeManager.js +0 -1
  69. package/dist/kernel/manager/theme/index.cjs +0 -1
  70. package/dist/kernel/manager/theme/index.d.ts +0 -1
  71. package/dist/kernel/manager/theme/index.js +0 -1
  72. package/dist/kernel/manager/themeManager.cjs +0 -1
  73. package/dist/kernel/manager/themeManager.d.ts +0 -1
  74. package/dist/kernel/manager/themeManager.js +0 -1
  75. /package/dist/kernel/{manager → custom-manager}/i18n/i18n.persistence.cjs +0 -0
  76. /package/dist/kernel/{manager → custom-manager}/i18n/i18n.persistence.js +0 -0
  77. /package/dist/kernel/{manager → custom-manager}/i18n/i18n.runtime.cjs +0 -0
  78. /package/dist/kernel/{manager → custom-manager}/i18n/i18n.runtime.d.ts +0 -0
  79. /package/dist/kernel/{manager → custom-manager}/i18n/i18n.runtime.js +0 -0
  80. /package/dist/kernel/{manager → custom-manager}/theme/theme.dom.cjs +0 -0
  81. /package/dist/kernel/{manager → custom-manager}/theme/theme.dom.js +0 -0
  82. /package/dist/kernel/{manager → custom-manager}/theme/theme.persistence.cjs +0 -0
  83. /package/dist/kernel/{manager → custom-manager}/theme/theme.persistence.js +0 -0
  84. /package/dist/kernel/{manager → custom-manager}/theme/theme.schema.cjs +0 -0
  85. /package/dist/kernel/{manager → custom-manager}/theme/theme.schema.js +0 -0
package/README.md CHANGED
@@ -15,7 +15,8 @@ pnpm add @vlian/framework i18next @vlian/logger @vlian/utils
15
15
  ## 快速开始
16
16
 
17
17
  ```typescript
18
- import { getKernel, startup, registerThemeManager } from '@vlian/framework';
18
+ import { getKernel, startup } from '@vlian/framework';
19
+ import { registerThemeManager } from '@vlian/framework/theme';
19
20
 
20
21
  const kernel = await startup({}, 'app');
21
22
 
@@ -30,15 +31,17 @@ await registerThemeManager(kernel, {
30
31
 
31
32
  - `@vlian/framework`
32
33
  - `@vlian/framework/kernel`
34
+ - `@vlian/framework/theme`
35
+ - `@vlian/framework/i18n`
33
36
 
34
- 两者导出相同的 kernel API,包括 `Kernel`、`startup`、`getKernel`、`kernelStartApp` 以及相关类型。
35
- `theme`、`i18n` 现在作为可选自定义管理器导出,按需注册到 kernel
37
+ `@vlian/framework` 与 `@vlian/framework/kernel` 导出相同的 kernel API,包括 `Kernel`、`startup`、`getKernel`、`kernelStartApp` 以及相关类型。
38
+ `theme`、`i18n` 改为独立子路径导出,按需从 `@vlian/framework/theme`、`@vlian/framework/i18n` 引入并注册到 kernel,可让消费方在 Vite 打包时获得更稳定的分包边界。
36
39
 
37
40
  ## 迁移说明
38
41
 
39
42
  - 删除所有 `@vlian/framework/utils`、`@vlian/framework/state`、`@vlian/framework/library`、`@vlian/framework/components`、`@vlian/framework/analytics` 的导入。
40
43
  - 旧模块如果仍有业务价值,需要迁移到应用侧或拆分为独立包维护。
41
- - `theme`、`i18n` 不再默认随 kernel 启动;需要时请显式注册自定义管理器。
44
+ - `theme`、`i18n` 不再从根入口或 `kernel` 入口聚合导出;需要时请显式从 `@vlian/framework/theme`、`@vlian/framework/i18n` 引入并注册自定义管理器。
42
45
  - 推荐围绕 kernel manager 收口日志、缓存,以及按需挂载的主题和国际化能力。
43
46
 
44
47
  ## 依赖要求
package/dist/i18n.cjs ADDED
@@ -0,0 +1 @@
1
+ "use strict";Object.defineProperty(exports,"__esModule",{value:true});function _export(target,all){for(var name in all)Object.defineProperty(target,name,{enumerable:true,get:Object.getOwnPropertyDescriptor(all,name).get})}_export(exports,{get DEFAULT_I18N(){return _i18n.DEFAULT_I18N},get DEFAULT_I18N_MANAGER_CONFIG(){return _i18n.DEFAULT_I18N_MANAGER_CONFIG},get I18N_MANAGER_NAME(){return _i18n.I18N_MANAGER_NAME},get I18nManager(){return _i18n.I18nManager},get registerI18nManager(){return _i18n.registerI18nManager},get registerLazyI18nManager(){return _i18n.registerLazyI18nManager}});const _i18n=require("./kernel/custom-manager/i18n");
package/dist/i18n.d.ts ADDED
@@ -0,0 +1,2 @@
1
+ export { I18nManager, DEFAULT_I18N, DEFAULT_I18N_MANAGER_CONFIG, I18N_MANAGER_NAME, registerLazyI18nManager, registerI18nManager, } from './kernel/custom-manager/i18n';
2
+ export type { I18nManagerConfig, I18nSnapshot } from './kernel/custom-manager/i18n';
package/dist/i18n.js ADDED
@@ -0,0 +1 @@
1
+ export{I18nManager,DEFAULT_I18N,DEFAULT_I18N_MANAGER_CONFIG,I18N_MANAGER_NAME,registerLazyI18nManager,registerI18nManager}from"./kernel/custom-manager/i18n";
@@ -0,0 +1 @@
1
+ "use strict";Object.defineProperty(exports,"__esModule",{value:true});Object.defineProperty(exports,"registerLazyI18nManager",{enumerable:true,get:function(){return _lazy.registerLazyI18nManager}});const _lazy=require("./kernel/custom-manager/i18n/lazy");
@@ -0,0 +1,2 @@
1
+ export { registerLazyI18nManager } from './kernel/custom-manager/i18n/lazy';
2
+ export type { I18nManagerConfig } from './kernel/custom-manager/i18n';
@@ -0,0 +1 @@
1
+ export{registerLazyI18nManager}from"./kernel/custom-manager/i18n/lazy";
package/dist/index.umd.js CHANGED
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * @vlian/framework v2.0.0
2
+ * @vlian/framework v2.0.2
3
3
  * Secra Framework - 一个现代化的低代码框架
4
4
  * (c) 2026 Secra Framework Contributors
5
5
  * Licensed under Apache-2.0
@@ -16,11 +16,13 @@
16
16
 
17
17
  const DEFAULT_LOGGER_CACHE_KEY="vlian:kernel:logger-level";function resolvePersistenceContext(persistence){if(persistence?.enabled!==true){return null}return {key:persistence.key||DEFAULT_LOGGER_CACHE_KEY}}async function loadLoggerFromCache(cacheManager,persistence,fallback){const persistenceContext=resolvePersistenceContext(persistence);if(!persistenceContext){return {...fallback}}try{const cached=await cacheManager.get(persistenceContext.key,{defaultValue:fallback});return normalizeLoggerSnapshot(cached,fallback)}catch{return {...fallback}}}async function saveLoggerToCache(cacheManager,persistence,snapshot){const persistenceContext=resolvePersistenceContext(persistence);if(!persistenceContext){return}try{await cacheManager.set(persistenceContext.key,{...snapshot});}catch{}}
18
18
 
19
- function _define_property$2(obj,key,value){if(key in obj){Object.defineProperty(obj,key,{value:value,enumerable:true,configurable:true,writable:true});}else {obj[key]=value;}return obj}class LoggerManager{async initialize(context){this.config=context.config.logger;this.cacheManager=context.cacheManager;const initialSnapshot=normalizeLoggerSnapshot({level:this.config.level},{level:logger.LogLevel.INFO});this.snapshot=await loadLoggerFromCache(this.cacheManager,this.config.persistence,initialSnapshot);logger.logger.setLevel(this.snapshot.level);this.initialized=true;}subscribe(listener){this.listeners.add(listener);return ()=>{this.listeners.delete(listener);}}debug(...args){logger.logger.debug(...args);}info(...args){logger.logger.info(...args);}warn(...args){logger.logger.warn(...args);}error(...args){logger.logger.error(...args);}async setLevel(level){this.ensureInitialized();const prevSnapshot=this.snapshot;const nextSnapshot=normalizeLoggerSnapshot({level},prevSnapshot);if(isLoggerEqual(prevSnapshot,nextSnapshot)){return}this.snapshot=nextSnapshot;logger.logger.setLevel(this.snapshot.level);if(this.cacheManager){await saveLoggerToCache(this.cacheManager,this.config.persistence,this.snapshot);}this.emit(this.snapshot,prevSnapshot);}getSnapshot(){return {...this.snapshot}}ensureInitialized(){if(!this.initialized){throw new Error("LoggerManager must be initialized before use.")}}emit(next,prev){for(const listener of this.listeners){try{listener({...next},{...prev});}catch{}}}constructor(){_define_property$2(this,"snapshot",{level:logger.LogLevel.INFO});_define_property$2(this,"config",DEFAULT_CONFIG.logger);_define_property$2(this,"listeners",new Set);_define_property$2(this,"cacheManager",null);_define_property$2(this,"initialized",false);}}
19
+ class LoggerManager{snapshot={level:logger.LogLevel.INFO};config=DEFAULT_CONFIG.logger;listeners=new Set;cacheManager=null;initialized=false;async initialize(context){this.config=context.config.logger;this.cacheManager=context.cacheManager;const initialSnapshot=normalizeLoggerSnapshot({level:this.config.level},{level:logger.LogLevel.INFO});this.snapshot=await loadLoggerFromCache(this.cacheManager,this.config.persistence,initialSnapshot);logger.logger.setLevel(this.snapshot.level);this.initialized=true;}subscribe(listener){this.listeners.add(listener);return ()=>{this.listeners.delete(listener);}}debug(...args){logger.logger.debug(...args);}info(...args){logger.logger.info(...args);}warn(...args){logger.logger.warn(...args);}error(...args){logger.logger.error(...args);}async setLevel(level){this.ensureInitialized();const prevSnapshot=this.snapshot;const nextSnapshot=normalizeLoggerSnapshot({level},prevSnapshot);if(isLoggerEqual(prevSnapshot,nextSnapshot)){return}this.snapshot=nextSnapshot;logger.logger.setLevel(this.snapshot.level);if(this.cacheManager){await saveLoggerToCache(this.cacheManager,this.config.persistence,this.snapshot);}this.emit(this.snapshot,prevSnapshot);}getSnapshot(){return {...this.snapshot}}ensureInitialized(){if(!this.initialized){throw new Error("LoggerManager must be initialized before use.")}}emit(next,prev){for(const listener of this.listeners){try{listener({...next},{...prev});}catch{}}}}
20
20
 
21
- function _define_property$1(obj,key,value){if(key in obj){Object.defineProperty(obj,key,{value:value,enumerable:true,configurable:true,writable:true});}else {obj[key]=value;}return obj}class CacheManager{initialize(context){this.snapshot=context.config.cache;this.cacheIn=utils.createStorage({type:this.snapshot.storageOptions?.type||"local",prefix:this.snapshot.storageOptions?.prefix||"vlian",defaultExpire:this.snapshot.storageOptions?.defaultExpire||24*60*60*1e3,dbName:this.snapshot.storageOptions?.tableName});}get cache(){return this.cacheIn}getSnapshot(){return this.snapshot}constructor(){_define_property$1(this,"snapshot",DEFAULT_CONFIG.cache);_define_property$1(this,"cacheIn",void 0);}}
21
+ class CacheManager{snapshot=DEFAULT_CONFIG.cache;cacheIn;initialize(context){this.snapshot=context.config.cache;this.cacheIn=utils.createStorage({type:this.snapshot.storageOptions?.type||"local",prefix:this.snapshot.storageOptions?.prefix||"vlian",defaultExpire:this.snapshot.storageOptions?.defaultExpire||24*60*60*1e3,dbName:this.snapshot.storageOptions?.tableName});}get cache(){return this.cacheIn}getSnapshot(){return this.snapshot}}
22
22
 
23
- function _define_property(obj,key,value){if(key in obj){Object.defineProperty(obj,key,{value:value,enumerable:true,configurable:true,writable:true});}else {obj[key]=value;}return obj}function now(){return typeof performance!=="undefined"?performance.now():Date.now()}class Kernel{static getInstance(instanceId=DEFAULT_INSTANCE_ID){const existing=Kernel.instances.get(instanceId);if(existing){return existing}const created=new Kernel(instanceId);Kernel.instances.set(instanceId,created);return created}getId(){return this.instanceId}getConfig(){return this.config}getMetrics(){return [...this.metrics]}getLoggerManager(){return this.loggerManager}getCacheManager(){return this.cacheManager}getManager(name){return this.managers.get(name)}registerManager(name,manager){if(this.managers.has(name)){throw new Error(`Kernel manager "${name}" 已存在`)}this.managers.set(name,manager);}getManagerConfig(name){return this.config.managerConfigs[name]}setManagerConfig(name,config){this.config={...this.config,managerConfigs:{...this.config.managerConfigs,[name]:config}};}async startup(options={}){if(this.started){this.logDebug("kernel.startup.skip.already-started",{instanceId:this.instanceId});return this}if(this.startupPromise){return this.startupPromise}this.startupPromise=this.bootstrap(options).finally(()=>{this.startupPromise=null;});return this.startupPromise}async bootstrap(options){await this.measurePhase("startup.begin",async()=>{this.logDebug("kernel.startup.begin",{instanceId:this.instanceId});});await this.measurePhase("config.load",async()=>{this.config=await this.resolveConfig(options);});await this.measurePhase("manager.register.custom",async()=>{if(options.customManagers){Object.entries(options.customManagers).forEach(([name,manager])=>{if(!this.managers.has(name)){this.managers.set(name,manager);}});}});await this.measurePhase("manager.initialize.default",async()=>{await this.initializeManager("cache");await this.initializeManager("logger");});await this.measurePhase("manager.initialize.custom",async()=>{const customManagerNames=[...this.managers.keys()].filter(name=>name!=="logger"&&name!=="cache");for(const name of customManagerNames){await this.initializeManager(name);}});await this.measurePhase("hooks.initialize",async()=>{await options.hooks?.initialize?.();await options.lifecycle?.initialization?.();});await this.measurePhase("render.custom",async()=>{if(options.render){await options.render({instanceId:this.instanceId,config:this.config});}});this.started=true;this.logDebug("kernel.startup.end",{instanceId:this.instanceId,metrics:this.metrics});return this}async resolveConfig(options){let loaded={};if(options.configLoader){const loaderResult=await options.configLoader();loaded=loaderResult||{};}return {logger:{...DEFAULT_CONFIG.logger,...loaded.logger,...options.config?.logger||{},level:options.loggerLevel??options.config?.logger?.level??loaded.logger?.level},cache:{...DEFAULT_CONFIG.cache,...loaded.cache,...options.config?.cache||{},storageOptions:{...DEFAULT_CONFIG.cache.storageOptions,...loaded.cache?.storageOptions||{},...options.config?.cache?.storageOptions||{},...options.storageOptions||{}}},managerConfigs:{...DEFAULT_CONFIG.managerConfigs,...loaded.managerConfigs||{},...options.config?.managerConfigs||{},...options.managerConfigs||{}}}}async initializeManager(name){if(this.initializedManagers.has(name)){return}const existingPromise=this.managerInitPromises.get(name);if(existingPromise){await existingPromise;return}const manager=this.managers.get(name);if(!manager){throw new Error(`Kernel manager "${name}" 不存在`)}if(name!=="cache"&&!this.initializedManagers.has("cache")){await this.initializeManager("cache");}const context={instanceId:this.instanceId,config:this.config,cacheManager:this.cacheManager.cache,getManagerConfig:managerName=>this.config.managerConfigs[managerName]};const initPromise=(async()=>{await manager.initialize(context);this.initializedManagers.add(name);this.logDebug("kernel.manager.initialized",{name,instanceId:this.instanceId});})();this.managerInitPromises.set(name,initPromise);try{await initPromise;}finally{this.managerInitPromises.delete(name);}}async measurePhase(phase,task){const startTime=now();this.logDebug("kernel.phase.start",{phase,startTime,instanceId:this.instanceId});await task();const endTime=now();const metric={phase,startTime,endTime,duration:endTime-startTime};this.metrics.push(metric);this.logDebug("kernel.phase.end",metric);}logDebug(message,payload){this.loggerManager.debug(message,payload);}constructor(instanceId){_define_property(this,"instanceId",void 0);_define_property(this,"metrics",[]);_define_property(this,"managers",new Map);_define_property(this,"managerInitPromises",new Map);_define_property(this,"initializedManagers",new Set);_define_property(this,"loggerManager",new LoggerManager);_define_property(this,"cacheManager",new CacheManager);_define_property(this,"config",DEFAULT_CONFIG);_define_property(this,"startupPromise",null);_define_property(this,"started",false);this.instanceId=instanceId;this.managers.set("logger",this.loggerManager);this.managers.set("cache",this.cacheManager);}}_define_property(Kernel,"instances",new Map);async function startup(options={},instanceId=DEFAULT_INSTANCE_ID){const kernel=Kernel.getInstance(instanceId);return kernel.startup(options)}function getKernel(instanceId=DEFAULT_INSTANCE_ID){return Kernel.getInstance(instanceId)}async function kernelStartApp(options={},instanceId=DEFAULT_INSTANCE_ID){return startup(options,instanceId)}
23
+ function isKernelManager(value){return typeof value==="object"&&value!==null&&typeof value.initialize==="function"}function isLazyKernelManagerRegistration(value){return typeof value==="object"&&value!==null&&"load"in value}function isEagerKernelManagerRegistration(value){return typeof value==="object"&&value!==null&&"manager"in value}function resolveKernelManagerModule(module){if(isKernelManager(module)){return module}if("manager"in module&&isKernelManager(module.manager)){return module.manager}if("default"in module&&isKernelManager(module.default)){return module.default}throw new Error("Invalid lazy kernel manager module")}
24
+
25
+ function now(){return typeof performance!=="undefined"?performance.now():Date.now()}class Kernel{static instances=new Map;static getInstance(instanceId=DEFAULT_INSTANCE_ID){const existing=Kernel.instances.get(instanceId);if(existing){return existing}const created=new Kernel(instanceId);Kernel.instances.set(instanceId,created);return created}instanceId;metrics=[];managers=new Map;managerLoaders=new Map;eagerManagers=new Set;managerInitPromises=new Map;initializedManagers=new Set;loggerManager=new LoggerManager;cacheManager=new CacheManager;config=DEFAULT_CONFIG;startupPromise=null;started=false;constructor(instanceId){this.instanceId=instanceId;this.managers.set("logger",this.loggerManager);this.managers.set("cache",this.cacheManager);}getId(){return this.instanceId}getConfig(){return this.config}getMetrics(){return [...this.metrics]}getLoggerManager(){return this.loggerManager}getCacheManager(){return this.cacheManager}getManager(name){return this.managers.get(name)}hasManager(name){return this.managers.has(name)||this.managerLoaders.has(name)}registerManager(name,manager){if(this.hasManager(name)){throw new Error(`Kernel manager "${name}" 已存在`)}this.managers.set(name,manager);}registerLazyManager(name,load,options={}){if(this.hasManager(name)){throw new Error(`Kernel manager "${name}" 已存在`)}this.managerLoaders.set(name,load);if(options.eager){this.eagerManagers.add(name);}}getManagerConfig(name){return this.config.managerConfigs[name]}setManagerConfig(name,config){this.config={...this.config,managerConfigs:{...this.config.managerConfigs,[name]:config}};}async startup(options={}){if(this.started){this.logDebug("kernel.startup.skip.already-started",{instanceId:this.instanceId});return this}if(this.startupPromise){return this.startupPromise}this.startupPromise=this.bootstrap(options).finally(()=>{this.startupPromise=null;});return this.startupPromise}async bootstrap(options){await this.measurePhase("startup.begin",async()=>{this.logDebug("kernel.startup.begin",{instanceId:this.instanceId});});await this.measurePhase("config.load",async()=>{this.config=await this.resolveConfig(options);});await this.measurePhase("manager.register.custom",async()=>{if(options.customManagers){Object.entries(options.customManagers).forEach(([name,registration])=>{if(!this.hasManager(name)){this.registerConfiguredManager(name,registration);}});}});await this.measurePhase("manager.initialize.default",async()=>{await this.initializeManager("cache");await this.initializeManager("logger");});await this.measurePhase("manager.initialize.custom",async()=>{const customManagerNames=[...this.eagerManagers].filter(name=>name!=="logger"&&name!=="cache");await Promise.all(customManagerNames.map(name=>this.initializeManager(name)));});await this.measurePhase("hooks.initialize",async()=>{await options.hooks?.initialize?.();await options.lifecycle?.initialization?.();});await this.measurePhase("render.custom",async()=>{if(options.render){await options.render({instanceId:this.instanceId,config:this.config});}});this.started=true;this.logDebug("kernel.startup.end",{instanceId:this.instanceId,metrics:this.metrics});return this}async resolveConfig(options){let loaded={};if(options.configLoader){const loaderResult=await options.configLoader();loaded=loaderResult||{};}return {logger:{...DEFAULT_CONFIG.logger,...loaded.logger,...options.config?.logger||{},level:options.loggerLevel??options.config?.logger?.level??loaded.logger?.level},cache:{...DEFAULT_CONFIG.cache,...loaded.cache,...options.config?.cache||{},storageOptions:{...DEFAULT_CONFIG.cache.storageOptions,...loaded.cache?.storageOptions||{},...options.config?.cache?.storageOptions||{},...options.storageOptions||{}}},managerConfigs:{...DEFAULT_CONFIG.managerConfigs,...loaded.managerConfigs||{},...options.config?.managerConfigs||{},...options.managerConfigs||{}}}}async initializeManager(name){if(this.initializedManagers.has(name)){return}const existingPromise=this.managerInitPromises.get(name);if(existingPromise){await existingPromise;return}let manager=this.managers.get(name);if(!manager){manager=await this.loadManager(name);}if(!manager){throw new Error(`Kernel manager "${name}" 不存在`)}if(name!=="cache"&&!this.initializedManagers.has("cache")){await this.initializeManager("cache");}const context={instanceId:this.instanceId,config:this.config,cacheManager:this.cacheManager.cache,getManagerConfig:managerName=>this.config.managerConfigs[managerName]};const initPromise=(async()=>{await manager.initialize(context);this.initializedManagers.add(name);this.logDebug("kernel.manager.initialized",{name,instanceId:this.instanceId});})();this.managerInitPromises.set(name,initPromise);try{await initPromise;}finally{this.managerInitPromises.delete(name);}}registerConfiguredManager(name,registration){if(isKernelManager(registration)){this.registerManager(name,registration);this.eagerManagers.add(name);return}if(isLazyKernelManagerRegistration(registration)){if(registration.config!==undefined){this.setManagerConfig(name,registration.config);}this.registerLazyManager(name,registration.load,{eager:registration.eager});return}if(isEagerKernelManagerRegistration(registration)){if(registration.config!==undefined){this.setManagerConfig(name,registration.config);}this.registerManager(name,registration.manager);if(registration.eager!==false){this.eagerManagers.add(name);}}}async loadManager(name){const load=this.managerLoaders.get(name);if(!load){return undefined}const loaded=resolveKernelManagerModule(await load());this.managerLoaders.delete(name);this.managers.set(name,loaded);return loaded}async measurePhase(phase,task){const startTime=now();this.logDebug("kernel.phase.start",{phase,startTime,instanceId:this.instanceId});await task();const endTime=now();const metric={phase,startTime,endTime,duration:endTime-startTime};this.metrics.push(metric);this.logDebug("kernel.phase.end",metric);}logDebug(message,payload){this.loggerManager.debug(message,payload);}}async function startup(options={},instanceId=DEFAULT_INSTANCE_ID){const kernel=Kernel.getInstance(instanceId);return kernel.startup(options)}function getKernel(instanceId=DEFAULT_INSTANCE_ID){return Kernel.getInstance(instanceId)}async function kernelStartApp(options={},instanceId=DEFAULT_INSTANCE_ID){return startup(options,instanceId)}
24
26
 
25
27
  exports.Kernel = Kernel;
26
28
  exports.getKernel = getKernel;
@@ -0,0 +1 @@
1
+ "use strict";Object.defineProperty(exports,"__esModule",{value:true});Object.defineProperty(exports,"I18nManager",{enumerable:true,get:function(){return I18nManager}});const _constants=require("./constants");const _i18npersistence=require("./i18n.persistence");const _i18nruntime=require("./i18n.runtime");const _i18nschema=require("./i18n.schema");let I18nManager=class I18nManager{snapshot=(0,_i18nschema.cloneI18nSnapshot)(_constants.DEFAULT_I18N);config=_constants.DEFAULT_I18N_MANAGER_CONFIG;listeners=new Set;cacheManager=null;initialized=false;async initialize(context){this.config=context.getManagerConfig(_constants.I18N_MANAGER_NAME)||_constants.DEFAULT_I18N_MANAGER_CONFIG;this.cacheManager=context.cacheManager;const initialSnapshot=(0,_i18nschema.normalizeI18nSnapshot)(this.config.initial||{},_constants.DEFAULT_I18N);this.snapshot=await (0,_i18npersistence.loadI18nFromCache)(this.cacheManager,this.config.persistence,initialSnapshot);await (0,_i18nruntime.initializeI18nRuntime)({locale:this.snapshot.locale||"zh-CN",resources:this.snapshot.resources});this.initialized=true}getSnapshot(){return(0,_i18nschema.cloneI18nSnapshot)(this.snapshot)}subscribe(listener){this.listeners.add(listener);return()=>{this.listeners.delete(listener)}}async setLocale(locale){this.ensureInitialized();const prevSnapshot=this.snapshot;const nextSnapshot=(0,_i18nschema.mergeI18nSnapshot)(prevSnapshot,{locale});if((0,_i18nschema.isI18nEqual)(prevSnapshot,nextSnapshot)){return}this.snapshot=nextSnapshot;await (0,_i18nruntime.switchI18nLocale)(this.snapshot.locale);if(this.cacheManager){await (0,_i18npersistence.saveI18nToCache)(this.cacheManager,this.config.persistence,this.snapshot)}this.emit(this.snapshot,prevSnapshot)}ensureInitialized(){if(!this.initialized){throw new Error("I18nManager must be initialized before use.")}}emit(next,prev){for(const listener of this.listeners){try{listener((0,_i18nschema.cloneI18nSnapshot)(next),(0,_i18nschema.cloneI18nSnapshot)(prev))}catch{}}}};
@@ -1,5 +1,5 @@
1
1
  import type { KernelManager, KernelManagerContext } from '../../types';
2
- import type { I18nSnapshot } from '../../custom-manager/i18n/types';
2
+ import type { I18nSnapshot } from './types';
3
3
  import { type I18nListener } from './i18n.schema';
4
4
  export declare class I18nManager implements KernelManager<I18nSnapshot> {
5
5
  private snapshot;
@@ -0,0 +1 @@
1
+ import{DEFAULT_I18N,DEFAULT_I18N_MANAGER_CONFIG,I18N_MANAGER_NAME}from"./constants";import{loadI18nFromCache,saveI18nToCache}from"./i18n.persistence";import{initializeI18nRuntime,switchI18nLocale}from"./i18n.runtime";import{cloneI18nSnapshot,isI18nEqual,mergeI18nSnapshot,normalizeI18nSnapshot}from"./i18n.schema";export class I18nManager{snapshot=cloneI18nSnapshot(DEFAULT_I18N);config=DEFAULT_I18N_MANAGER_CONFIG;listeners=new Set;cacheManager=null;initialized=false;async initialize(context){this.config=context.getManagerConfig(I18N_MANAGER_NAME)||DEFAULT_I18N_MANAGER_CONFIG;this.cacheManager=context.cacheManager;const initialSnapshot=normalizeI18nSnapshot(this.config.initial||{},DEFAULT_I18N);this.snapshot=await loadI18nFromCache(this.cacheManager,this.config.persistence,initialSnapshot);await initializeI18nRuntime({locale:this.snapshot.locale||"zh-CN",resources:this.snapshot.resources});this.initialized=true}getSnapshot(){return cloneI18nSnapshot(this.snapshot)}subscribe(listener){this.listeners.add(listener);return()=>{this.listeners.delete(listener)}}async setLocale(locale){this.ensureInitialized();const prevSnapshot=this.snapshot;const nextSnapshot=mergeI18nSnapshot(prevSnapshot,{locale});if(isI18nEqual(prevSnapshot,nextSnapshot)){return}this.snapshot=nextSnapshot;await switchI18nLocale(this.snapshot.locale);if(this.cacheManager){await saveI18nToCache(this.cacheManager,this.config.persistence,this.snapshot)}this.emit(this.snapshot,prevSnapshot)}ensureInitialized(){if(!this.initialized){throw new Error("I18nManager must be initialized before use.")}}emit(next,prev){for(const listener of this.listeners){try{listener(cloneI18nSnapshot(next),cloneI18nSnapshot(prev))}catch{}}}}
@@ -1,6 +1,6 @@
1
1
  import type { StorageInstance } from '@vlian/utils';
2
2
  import type { PersistenceOptions } from '../../types';
3
- import type { I18nSnapshot } from '../../custom-manager/i18n/types';
3
+ import type { I18nSnapshot } from './types';
4
4
  export declare const DEFAULT_I18N_CACHE_KEY = "vlian:kernel:i18n";
5
5
  export declare function loadI18nFromCache(cacheManager: StorageInstance, persistence: PersistenceOptions | undefined, fallback: I18nSnapshot): Promise<I18nSnapshot>;
6
6
  export declare function saveI18nToCache(cacheManager: StorageInstance, persistence: PersistenceOptions | undefined, snapshot: I18nSnapshot): Promise<void>;
@@ -1 +1 @@
1
- "use strict";Object.defineProperty(exports,"__esModule",{value:true});function _export(target,all){for(var name in all)Object.defineProperty(target,name,{enumerable:true,get:Object.getOwnPropertyDescriptor(all,name).get})}_export(exports,{get cloneI18nSnapshot(){return cloneI18nSnapshot},get isI18nEqual(){return isI18nEqual},get mergeI18nSnapshot(){return mergeI18nSnapshot},get normalizeI18nSnapshot(){return normalizeI18nSnapshot}});function isPlainObject(value){return Object.prototype.toString.call(value)==="[object Object]"}function cloneI18nSnapshot(snapshot){const resources=snapshot.resources?Object.fromEntries(Object.entries(snapshot.resources).map(([locale,value])=>[locale,{...value}])):undefined;return{locale:snapshot.locale,...resources?{resources}:{}}}function normalizeI18nSnapshot(value,fallback){const source=isPlainObject(value)?value:{};const locale=typeof source.locale==="string"&&source.locale.trim()?source.locale:fallback.locale;const fallbackResources=fallback.resources;const incomingResources=isPlainObject(source.resources)?Object.fromEntries(Object.entries(source.resources).filter(([,resourceValue])=>isPlainObject(resourceValue)).map(([locale,resourceValue])=>[locale,{...resourceValue}])):undefined;const resources=incomingResources||fallbackResources?{...fallbackResources||{},...incomingResources||{}}:undefined;return{locale,...resources?{resources}:{}}}function mergeI18nSnapshot(current,next){return normalizeI18nSnapshot({locale:next.locale??current.locale,resources:next.resources??current.resources},current)}function isI18nEqual(left,right){if(left.locale!==right.locale){return false}const leftResources=left.resources||{};const rightResources=right.resources||{};const leftLocales=Object.keys(leftResources);const rightLocales=Object.keys(rightResources);if(leftLocales.length!==rightLocales.length){return false}for(const locale of leftLocales){if(leftResources[locale]!==rightResources[locale]){return false}}return true}
1
+ "use strict";Object.defineProperty(exports,"__esModule",{value:true});function _export(target,all){for(var name in all)Object.defineProperty(target,name,{enumerable:true,get:Object.getOwnPropertyDescriptor(all,name).get})}_export(exports,{get cloneI18nSnapshot(){return cloneI18nSnapshot},get isI18nEqual(){return isI18nEqual},get mergeI18nSnapshot(){return mergeI18nSnapshot},get normalizeI18nSnapshot(){return normalizeI18nSnapshot}});function isPlainObject(value){return Object.prototype.toString.call(value)==="[object Object]"}function cloneI18nSnapshot(snapshot){const resources=snapshot.resources?Object.fromEntries(Object.entries(snapshot.resources).map(([locale,value])=>[locale,{...value}])):undefined;return{locale:snapshot.locale,...resources?{resources}:{}}}function normalizeI18nSnapshot(value,fallback){const source=isPlainObject(value)?value:{};const locale=typeof source.locale==="string"&&source.locale.trim()?source.locale:fallback.locale;const fallbackResources=fallback.resources;const incomingResources=isPlainObject(source.resources)?Object.fromEntries(Object.entries(source.resources).filter(([,resourceValue])=>isPlainObject(resourceValue)).map(([resourceLocale,resourceValue])=>[resourceLocale,{...resourceValue}])):undefined;const resources=incomingResources||fallbackResources?{...fallbackResources||{},...incomingResources||{}}:undefined;return{locale,...resources?{resources}:{}}}function mergeI18nSnapshot(current,next){return normalizeI18nSnapshot({locale:next.locale??current.locale,resources:next.resources??current.resources},current)}function isI18nEqual(left,right){if(left.locale!==right.locale){return false}const leftResources=left.resources||{};const rightResources=right.resources||{};const leftLocales=Object.keys(leftResources);const rightLocales=Object.keys(rightResources);if(leftLocales.length!==rightLocales.length){return false}for(const locale of leftLocales){if(leftResources[locale]!==rightResources[locale]){return false}}return true}
@@ -1,4 +1,4 @@
1
- import type { I18nSnapshot } from '../../custom-manager/i18n/types';
1
+ import type { I18nSnapshot } from './types';
2
2
  export type I18nListener = (next: I18nSnapshot, prev: I18nSnapshot) => void;
3
3
  export declare function cloneI18nSnapshot(snapshot: I18nSnapshot): I18nSnapshot;
4
4
  export declare function normalizeI18nSnapshot(value: unknown, fallback: I18nSnapshot): I18nSnapshot;
@@ -0,0 +1 @@
1
+ function isPlainObject(value){return Object.prototype.toString.call(value)==="[object Object]"}export function cloneI18nSnapshot(snapshot){const resources=snapshot.resources?Object.fromEntries(Object.entries(snapshot.resources).map(([locale,value])=>[locale,{...value}])):undefined;return{locale:snapshot.locale,...resources?{resources}:{}}}export function normalizeI18nSnapshot(value,fallback){const source=isPlainObject(value)?value:{};const locale=typeof source.locale==="string"&&source.locale.trim()?source.locale:fallback.locale;const fallbackResources=fallback.resources;const incomingResources=isPlainObject(source.resources)?Object.fromEntries(Object.entries(source.resources).filter(([,resourceValue])=>isPlainObject(resourceValue)).map(([resourceLocale,resourceValue])=>[resourceLocale,{...resourceValue}])):undefined;const resources=incomingResources||fallbackResources?{...fallbackResources||{},...incomingResources||{}}:undefined;return{locale,...resources?{resources}:{}}}export function mergeI18nSnapshot(current,next){return normalizeI18nSnapshot({locale:next.locale??current.locale,resources:next.resources??current.resources},current)}export function isI18nEqual(left,right){if(left.locale!==right.locale){return false}const leftResources=left.resources||{};const rightResources=right.resources||{};const leftLocales=Object.keys(leftResources);const rightLocales=Object.keys(rightResources);if(leftLocales.length!==rightLocales.length){return false}for(const locale of leftLocales){if(leftResources[locale]!==rightResources[locale]){return false}}return true}
@@ -1 +1 @@
1
- "use strict";Object.defineProperty(exports,"__esModule",{value:true});function _export(target,all){for(var name in all)Object.defineProperty(target,name,{enumerable:true,get:Object.getOwnPropertyDescriptor(all,name).get})}_export(exports,{get DEFAULT_I18N(){return _constants.DEFAULT_I18N},get DEFAULT_I18N_MANAGER_CONFIG(){return _constants.DEFAULT_I18N_MANAGER_CONFIG},get I18N_MANAGER_NAME(){return _constants.I18N_MANAGER_NAME},get I18nManager(){return _I18nManager.I18nManager},get registerI18nManager(){return registerI18nManager}});const _I18nManager=require("../../manager/i18n/I18nManager");const _constants=require("./constants");async function registerI18nManager(kernel,config=_constants.DEFAULT_I18N_MANAGER_CONFIG){const existing=kernel.getManager(_constants.I18N_MANAGER_NAME);if(existing instanceof _I18nManager.I18nManager){kernel.setManagerConfig(_constants.I18N_MANAGER_NAME,config);await kernel.initializeManager(_constants.I18N_MANAGER_NAME);return existing}const manager=new _I18nManager.I18nManager;kernel.setManagerConfig(_constants.I18N_MANAGER_NAME,config);kernel.registerManager(_constants.I18N_MANAGER_NAME,manager);await kernel.initializeManager(_constants.I18N_MANAGER_NAME);return manager}
1
+ "use strict";Object.defineProperty(exports,"__esModule",{value:true});function _export(target,all){for(var name in all)Object.defineProperty(target,name,{enumerable:true,get:Object.getOwnPropertyDescriptor(all,name).get})}_export(exports,{get DEFAULT_I18N(){return _constants.DEFAULT_I18N},get DEFAULT_I18N_MANAGER_CONFIG(){return _constants.DEFAULT_I18N_MANAGER_CONFIG},get I18N_MANAGER_NAME(){return _constants.I18N_MANAGER_NAME},get I18nManager(){return _I18nManager.I18nManager},get registerI18nManager(){return registerI18nManager},get registerLazyI18nManager(){return _lazy.registerLazyI18nManager}});const _I18nManager=require("./I18nManager");const _constants=require("./constants");const _lazy=require("./lazy");async function registerI18nManager(kernel,config=_constants.DEFAULT_I18N_MANAGER_CONFIG){if(kernel.hasManager(_constants.I18N_MANAGER_NAME)){kernel.setManagerConfig(_constants.I18N_MANAGER_NAME,config);await kernel.initializeManager(_constants.I18N_MANAGER_NAME);const existing=kernel.getManager(_constants.I18N_MANAGER_NAME);if(existing instanceof _I18nManager.I18nManager){return existing}throw new Error(`Kernel manager "${_constants.I18N_MANAGER_NAME}" is not an I18nManager`)}const existing=kernel.getManager(_constants.I18N_MANAGER_NAME);if(existing instanceof _I18nManager.I18nManager){kernel.setManagerConfig(_constants.I18N_MANAGER_NAME,config);await kernel.initializeManager(_constants.I18N_MANAGER_NAME);return existing}const manager=new _I18nManager.I18nManager;kernel.setManagerConfig(_constants.I18N_MANAGER_NAME,config);kernel.registerManager(_constants.I18N_MANAGER_NAME,manager);await kernel.initializeManager(_constants.I18N_MANAGER_NAME);return manager}
@@ -1,7 +1,8 @@
1
1
  import type { Kernel } from '../../kernel';
2
- import { I18nManager } from '../../manager/i18n/I18nManager';
2
+ import { I18nManager } from './I18nManager';
3
3
  import type { I18nManagerConfig } from './types';
4
- export { I18nManager } from '../../manager/i18n/I18nManager';
4
+ export { I18nManager } from './I18nManager';
5
5
  export { DEFAULT_I18N, DEFAULT_I18N_MANAGER_CONFIG, I18N_MANAGER_NAME } from './constants';
6
+ export { registerLazyI18nManager } from './lazy';
6
7
  export type { I18nManagerConfig, I18nSnapshot } from './types';
7
8
  export declare function registerI18nManager(kernel: Kernel, config?: I18nManagerConfig): Promise<I18nManager>;
@@ -1 +1 @@
1
- import{I18nManager}from"../../manager/i18n/I18nManager";import{DEFAULT_I18N_MANAGER_CONFIG,I18N_MANAGER_NAME}from"./constants";export{I18nManager}from"../../manager/i18n/I18nManager";export{DEFAULT_I18N,DEFAULT_I18N_MANAGER_CONFIG,I18N_MANAGER_NAME}from"./constants";export async function registerI18nManager(kernel,config=DEFAULT_I18N_MANAGER_CONFIG){const existing=kernel.getManager(I18N_MANAGER_NAME);if(existing instanceof I18nManager){kernel.setManagerConfig(I18N_MANAGER_NAME,config);await kernel.initializeManager(I18N_MANAGER_NAME);return existing}const manager=new I18nManager;kernel.setManagerConfig(I18N_MANAGER_NAME,config);kernel.registerManager(I18N_MANAGER_NAME,manager);await kernel.initializeManager(I18N_MANAGER_NAME);return manager}
1
+ import{I18nManager}from"./I18nManager";import{DEFAULT_I18N_MANAGER_CONFIG,I18N_MANAGER_NAME}from"./constants";export{I18nManager}from"./I18nManager";export{DEFAULT_I18N,DEFAULT_I18N_MANAGER_CONFIG,I18N_MANAGER_NAME}from"./constants";export{registerLazyI18nManager}from"./lazy";export async function registerI18nManager(kernel,config=DEFAULT_I18N_MANAGER_CONFIG){if(kernel.hasManager(I18N_MANAGER_NAME)){kernel.setManagerConfig(I18N_MANAGER_NAME,config);await kernel.initializeManager(I18N_MANAGER_NAME);const existing=kernel.getManager(I18N_MANAGER_NAME);if(existing instanceof I18nManager){return existing}throw new Error(`Kernel manager "${I18N_MANAGER_NAME}" is not an I18nManager`)}const existing=kernel.getManager(I18N_MANAGER_NAME);if(existing instanceof I18nManager){kernel.setManagerConfig(I18N_MANAGER_NAME,config);await kernel.initializeManager(I18N_MANAGER_NAME);return existing}const manager=new I18nManager;kernel.setManagerConfig(I18N_MANAGER_NAME,config);kernel.registerManager(I18N_MANAGER_NAME,manager);await kernel.initializeManager(I18N_MANAGER_NAME);return manager}
@@ -0,0 +1 @@
1
+ "use strict";Object.defineProperty(exports,"__esModule",{value:true});Object.defineProperty(exports,"registerLazyI18nManager",{enumerable:true,get:function(){return registerLazyI18nManager}});const _constants=require("./constants");function _getRequireWildcardCache(nodeInterop){if(typeof WeakMap!=="function")return null;var cacheBabelInterop=new WeakMap;var cacheNodeInterop=new WeakMap;return(_getRequireWildcardCache=function(nodeInterop){return nodeInterop?cacheNodeInterop:cacheBabelInterop})(nodeInterop)}function _interop_require_wildcard(obj,nodeInterop){if(!nodeInterop&&obj&&obj.__esModule){return obj}if(obj===null||typeof obj!=="object"&&typeof obj!=="function"){return{default:obj}}var cache=_getRequireWildcardCache(nodeInterop);if(cache&&cache.has(obj)){return cache.get(obj)}var newObj={__proto__:null};var hasPropertyDescriptor=Object.defineProperty&&Object.getOwnPropertyDescriptor;for(var key in obj){if(key!=="default"&&Object.prototype.hasOwnProperty.call(obj,key)){var desc=hasPropertyDescriptor?Object.getOwnPropertyDescriptor(obj,key):null;if(desc&&(desc.get||desc.set)){Object.defineProperty(newObj,key,desc)}else{newObj[key]=obj[key]}}}newObj.default=obj;if(cache){cache.set(obj,newObj)}return newObj}function registerLazyI18nManager(kernel,config=_constants.DEFAULT_I18N_MANAGER_CONFIG){if(kernel.hasManager(_constants.I18N_MANAGER_NAME)){kernel.setManagerConfig(_constants.I18N_MANAGER_NAME,config);return}kernel.setManagerConfig(_constants.I18N_MANAGER_NAME,config);kernel.registerLazyManager(_constants.I18N_MANAGER_NAME,async()=>{const module=await Promise.resolve().then(()=>/*#__PURE__*/_interop_require_wildcard(require("./I18nManager")));return new module.I18nManager})}
@@ -0,0 +1,3 @@
1
+ import type { Kernel } from '../../kernel';
2
+ import type { I18nManagerConfig } from './types';
3
+ export declare function registerLazyI18nManager(kernel: Kernel, config?: I18nManagerConfig): void;
@@ -0,0 +1 @@
1
+ import{DEFAULT_I18N_MANAGER_CONFIG,I18N_MANAGER_NAME}from"./constants";export function registerLazyI18nManager(kernel,config=DEFAULT_I18N_MANAGER_CONFIG){if(kernel.hasManager(I18N_MANAGER_NAME)){kernel.setManagerConfig(I18N_MANAGER_NAME,config);return}kernel.setManagerConfig(I18N_MANAGER_NAME,config);kernel.registerLazyManager(I18N_MANAGER_NAME,async()=>{const module=await import("./I18nManager");return new module.I18nManager})}
@@ -1 +1 @@
1
- "use strict";Object.defineProperty(exports,"__esModule",{value:true});function _export(target,all){for(var name in all)Object.defineProperty(target,name,{enumerable:true,get:Object.getOwnPropertyDescriptor(all,name).get})}_export(exports,{get DEFAULT_I18N(){return _i18n.DEFAULT_I18N},get DEFAULT_I18N_MANAGER_CONFIG(){return _i18n.DEFAULT_I18N_MANAGER_CONFIG},get DEFAULT_THEME(){return _theme.DEFAULT_THEME},get DEFAULT_THEME_MANAGER_CONFIG(){return _theme.DEFAULT_THEME_MANAGER_CONFIG},get I18N_MANAGER_NAME(){return _i18n.I18N_MANAGER_NAME},get I18nManager(){return _i18n.I18nManager},get THEME_MANAGER_NAME(){return _theme.THEME_MANAGER_NAME},get ThemeManager(){return _theme.ThemeManager},get registerI18nManager(){return _i18n.registerI18nManager},get registerThemeManager(){return _theme.registerThemeManager}});const _theme=require("./theme");const _i18n=require("./i18n");
1
+ "use strict";Object.defineProperty(exports,"__esModule",{value:true});function _export(target,all){for(var name in all)Object.defineProperty(target,name,{enumerable:true,get:Object.getOwnPropertyDescriptor(all,name).get})}_export(exports,{get DEFAULT_I18N(){return _i18n.DEFAULT_I18N},get DEFAULT_I18N_MANAGER_CONFIG(){return _i18n.DEFAULT_I18N_MANAGER_CONFIG},get DEFAULT_THEME(){return _theme.DEFAULT_THEME},get DEFAULT_THEME_MANAGER_CONFIG(){return _theme.DEFAULT_THEME_MANAGER_CONFIG},get I18N_MANAGER_NAME(){return _i18n.I18N_MANAGER_NAME},get I18nManager(){return _i18n.I18nManager},get THEME_MANAGER_NAME(){return _theme.THEME_MANAGER_NAME},get ThemeManager(){return _theme.ThemeManager},get registerI18nManager(){return _i18n.registerI18nManager},get registerLazyI18nManager(){return _i18n.registerLazyI18nManager},get registerLazyThemeManager(){return _theme.registerLazyThemeManager},get registerThemeManager(){return _theme.registerThemeManager}});const _theme=require("./theme");const _i18n=require("./i18n");
@@ -1,4 +1,4 @@
1
- export { ThemeManager, DEFAULT_THEME, DEFAULT_THEME_MANAGER_CONFIG, THEME_MANAGER_NAME, registerThemeManager, } from './theme';
2
- export { I18nManager, DEFAULT_I18N, DEFAULT_I18N_MANAGER_CONFIG, I18N_MANAGER_NAME, registerI18nManager, } from './i18n';
1
+ export { ThemeManager, DEFAULT_THEME, DEFAULT_THEME_MANAGER_CONFIG, THEME_MANAGER_NAME, registerLazyThemeManager, registerThemeManager, } from './theme';
2
+ export { I18nManager, DEFAULT_I18N, DEFAULT_I18N_MANAGER_CONFIG, I18N_MANAGER_NAME, registerLazyI18nManager, registerI18nManager, } from './i18n';
3
3
  export type { ResolvedThemeMode, ResolvedThemeSnapshot, ThemeManagerConfig, ThemeSnapshot } from './theme';
4
4
  export type { I18nManagerConfig, I18nSnapshot } from './i18n';
@@ -1 +1 @@
1
- export{ThemeManager,DEFAULT_THEME,DEFAULT_THEME_MANAGER_CONFIG,THEME_MANAGER_NAME,registerThemeManager}from"./theme";export{I18nManager,DEFAULT_I18N,DEFAULT_I18N_MANAGER_CONFIG,I18N_MANAGER_NAME,registerI18nManager}from"./i18n";
1
+ export{ThemeManager,DEFAULT_THEME,DEFAULT_THEME_MANAGER_CONFIG,THEME_MANAGER_NAME,registerLazyThemeManager,registerThemeManager}from"./theme";export{I18nManager,DEFAULT_I18N,DEFAULT_I18N_MANAGER_CONFIG,I18N_MANAGER_NAME,registerLazyI18nManager,registerI18nManager}from"./i18n";
@@ -0,0 +1 @@
1
+ "use strict";Object.defineProperty(exports,"__esModule",{value:true});Object.defineProperty(exports,"ThemeManager",{enumerable:true,get:function(){return ThemeManager}});const _constants=require("./constants");const _themedom=require("./theme.dom");const _themepersistence=require("./theme.persistence");const _themeschema=require("./theme.schema");let ThemeManager=class ThemeManager{theme=(0,_themeschema.cloneTheme)(_constants.DEFAULT_THEME);resolvedMode=(0,_themedom.resolveThemeMode)(_constants.DEFAULT_THEME);config=_constants.DEFAULT_THEME_MANAGER_CONFIG;listeners=new Set;cacheManager=null;stopSystemThemeObserver=null;initialized=false;async initialize(context){this.config=context.getManagerConfig(_constants.THEME_MANAGER_NAME)||_constants.DEFAULT_THEME_MANAGER_CONFIG;this.cacheManager=context.cacheManager;const initialTheme=(0,_themeschema.normalizeTheme)(this.config.initial||{},_constants.DEFAULT_THEME);this.theme=await (0,_themepersistence.loadThemeFromCache)(this.cacheManager,this.config.persistence,initialTheme);this.resolvedMode=(0,_themedom.resolveThemeMode)(this.theme);(0,_themedom.applyThemeToDocument)(this.theme,{nextResolvedMode:this.resolvedMode});this.bindSystemThemeObserver();this.initialized=true}getTheme(){return(0,_themeschema.cloneTheme)(this.theme)}getSnapshot(){return this.getTheme()}getResolvedMode(){this.ensureInitialized();return this.resolvedMode}getResolvedTheme(){this.ensureInitialized();return(0,_themeschema.cloneResolvedTheme)({...this.getTheme(),resolvedMode:this.resolvedMode})}subscribe(listener){this.listeners.add(listener);return()=>{this.listeners.delete(listener)}}async setTheme(nextTheme){this.ensureInitialized();const prevTheme=this.theme;const prevResolvedMode=this.resolvedMode;const mergedTheme=(0,_themeschema.mergeTheme)(prevTheme,nextTheme);const nextResolvedMode=(0,_themedom.resolveThemeMode)(mergedTheme);if((0,_themeschema.isThemeEqual)(prevTheme,mergedTheme)&&(0,_themeschema.isResolvedThemeModeEqual)(prevResolvedMode,nextResolvedMode)){return}this.theme=mergedTheme;this.resolvedMode=nextResolvedMode;(0,_themedom.applyThemeToDocument)(this.theme,{prevTheme,prevResolvedMode,nextResolvedMode});if(this.cacheManager){await (0,_themepersistence.saveThemeToCache)(this.cacheManager,this.config.persistence,this.theme)}this.emit(this.theme,prevTheme)}ensureInitialized(){if(!this.initialized){throw new Error("ThemeManager must be initialized before use.")}}destroy(){this.stopSystemThemeObserver?.();this.stopSystemThemeObserver=null;this.listeners.clear();this.initialized=false}bindSystemThemeObserver(){this.stopSystemThemeObserver?.();this.stopSystemThemeObserver=(0,_themedom.observeSystemThemeChange)(nextResolvedMode=>{if(this.theme.mode!=="system"){return}const prevResolvedMode=this.resolvedMode;if((0,_themeschema.isResolvedThemeModeEqual)(prevResolvedMode,nextResolvedMode)){return}this.resolvedMode=nextResolvedMode;(0,_themedom.applyThemeToDocument)(this.theme,{prevTheme:this.theme,prevResolvedMode,nextResolvedMode});this.emit(this.theme,this.theme)})||null}emit(next,prev){for(const listener of this.listeners){try{listener((0,_themeschema.cloneTheme)(next),(0,_themeschema.cloneTheme)(prev))}catch{}}}};
@@ -1,5 +1,5 @@
1
1
  import type { KernelManager, KernelManagerContext } from '../../types';
2
- import type { ResolvedThemeMode, ResolvedThemeSnapshot, ThemeSnapshot } from '../../custom-manager/theme/types';
2
+ import type { ResolvedThemeMode, ResolvedThemeSnapshot, ThemeSnapshot } from './types';
3
3
  import { type ThemeListener } from './theme.schema';
4
4
  export declare class ThemeManager implements KernelManager<ThemeSnapshot> {
5
5
  private theme;
@@ -0,0 +1 @@
1
+ import{DEFAULT_THEME,DEFAULT_THEME_MANAGER_CONFIG,THEME_MANAGER_NAME}from"./constants";import{applyThemeToDocument,observeSystemThemeChange,resolveThemeMode}from"./theme.dom";import{loadThemeFromCache,saveThemeToCache}from"./theme.persistence";import{cloneResolvedTheme,cloneTheme,isResolvedThemeModeEqual,isThemeEqual,mergeTheme,normalizeTheme}from"./theme.schema";export class ThemeManager{theme=cloneTheme(DEFAULT_THEME);resolvedMode=resolveThemeMode(DEFAULT_THEME);config=DEFAULT_THEME_MANAGER_CONFIG;listeners=new Set;cacheManager=null;stopSystemThemeObserver=null;initialized=false;async initialize(context){this.config=context.getManagerConfig(THEME_MANAGER_NAME)||DEFAULT_THEME_MANAGER_CONFIG;this.cacheManager=context.cacheManager;const initialTheme=normalizeTheme(this.config.initial||{},DEFAULT_THEME);this.theme=await loadThemeFromCache(this.cacheManager,this.config.persistence,initialTheme);this.resolvedMode=resolveThemeMode(this.theme);applyThemeToDocument(this.theme,{nextResolvedMode:this.resolvedMode});this.bindSystemThemeObserver();this.initialized=true}getTheme(){return cloneTheme(this.theme)}getSnapshot(){return this.getTheme()}getResolvedMode(){this.ensureInitialized();return this.resolvedMode}getResolvedTheme(){this.ensureInitialized();return cloneResolvedTheme({...this.getTheme(),resolvedMode:this.resolvedMode})}subscribe(listener){this.listeners.add(listener);return()=>{this.listeners.delete(listener)}}async setTheme(nextTheme){this.ensureInitialized();const prevTheme=this.theme;const prevResolvedMode=this.resolvedMode;const mergedTheme=mergeTheme(prevTheme,nextTheme);const nextResolvedMode=resolveThemeMode(mergedTheme);if(isThemeEqual(prevTheme,mergedTheme)&&isResolvedThemeModeEqual(prevResolvedMode,nextResolvedMode)){return}this.theme=mergedTheme;this.resolvedMode=nextResolvedMode;applyThemeToDocument(this.theme,{prevTheme,prevResolvedMode,nextResolvedMode});if(this.cacheManager){await saveThemeToCache(this.cacheManager,this.config.persistence,this.theme)}this.emit(this.theme,prevTheme)}ensureInitialized(){if(!this.initialized){throw new Error("ThemeManager must be initialized before use.")}}destroy(){this.stopSystemThemeObserver?.();this.stopSystemThemeObserver=null;this.listeners.clear();this.initialized=false}bindSystemThemeObserver(){this.stopSystemThemeObserver?.();this.stopSystemThemeObserver=observeSystemThemeChange(nextResolvedMode=>{if(this.theme.mode!=="system"){return}const prevResolvedMode=this.resolvedMode;if(isResolvedThemeModeEqual(prevResolvedMode,nextResolvedMode)){return}this.resolvedMode=nextResolvedMode;applyThemeToDocument(this.theme,{prevTheme:this.theme,prevResolvedMode,nextResolvedMode});this.emit(this.theme,this.theme)})||null}emit(next,prev){for(const listener of this.listeners){try{listener(cloneTheme(next),cloneTheme(prev))}catch{}}}}
@@ -1 +1 @@
1
- "use strict";Object.defineProperty(exports,"__esModule",{value:true});function _export(target,all){for(var name in all)Object.defineProperty(target,name,{enumerable:true,get:Object.getOwnPropertyDescriptor(all,name).get})}_export(exports,{get DEFAULT_THEME(){return _constants.DEFAULT_THEME},get DEFAULT_THEME_MANAGER_CONFIG(){return _constants.DEFAULT_THEME_MANAGER_CONFIG},get THEME_MANAGER_NAME(){return _constants.THEME_MANAGER_NAME},get ThemeManager(){return _ThemeManager.ThemeManager},get registerThemeManager(){return registerThemeManager}});const _ThemeManager=require("../../manager/theme/ThemeManager");const _constants=require("./constants");async function registerThemeManager(kernel,config=_constants.DEFAULT_THEME_MANAGER_CONFIG){const existing=kernel.getManager(_constants.THEME_MANAGER_NAME);if(existing instanceof _ThemeManager.ThemeManager){kernel.setManagerConfig(_constants.THEME_MANAGER_NAME,config);await kernel.initializeManager(_constants.THEME_MANAGER_NAME);return existing}const manager=new _ThemeManager.ThemeManager;kernel.setManagerConfig(_constants.THEME_MANAGER_NAME,config);kernel.registerManager(_constants.THEME_MANAGER_NAME,manager);await kernel.initializeManager(_constants.THEME_MANAGER_NAME);return manager}
1
+ "use strict";Object.defineProperty(exports,"__esModule",{value:true});function _export(target,all){for(var name in all)Object.defineProperty(target,name,{enumerable:true,get:Object.getOwnPropertyDescriptor(all,name).get})}_export(exports,{get DEFAULT_THEME(){return _constants.DEFAULT_THEME},get DEFAULT_THEME_MANAGER_CONFIG(){return _constants.DEFAULT_THEME_MANAGER_CONFIG},get THEME_MANAGER_NAME(){return _constants.THEME_MANAGER_NAME},get ThemeManager(){return _ThemeManager.ThemeManager},get registerLazyThemeManager(){return _lazy.registerLazyThemeManager},get registerThemeManager(){return registerThemeManager}});const _ThemeManager=require("./ThemeManager");const _constants=require("./constants");const _lazy=require("./lazy");async function registerThemeManager(kernel,config=_constants.DEFAULT_THEME_MANAGER_CONFIG){if(kernel.hasManager(_constants.THEME_MANAGER_NAME)){kernel.setManagerConfig(_constants.THEME_MANAGER_NAME,config);await kernel.initializeManager(_constants.THEME_MANAGER_NAME);const existing=kernel.getManager(_constants.THEME_MANAGER_NAME);if(existing instanceof _ThemeManager.ThemeManager){return existing}throw new Error(`Kernel manager "${_constants.THEME_MANAGER_NAME}" is not a ThemeManager`)}const existing=kernel.getManager(_constants.THEME_MANAGER_NAME);if(existing instanceof _ThemeManager.ThemeManager){kernel.setManagerConfig(_constants.THEME_MANAGER_NAME,config);await kernel.initializeManager(_constants.THEME_MANAGER_NAME);return existing}const manager=new _ThemeManager.ThemeManager;kernel.setManagerConfig(_constants.THEME_MANAGER_NAME,config);kernel.registerManager(_constants.THEME_MANAGER_NAME,manager);await kernel.initializeManager(_constants.THEME_MANAGER_NAME);return manager}
@@ -1,7 +1,8 @@
1
1
  import type { Kernel } from '../../kernel';
2
- import { ThemeManager } from '../../manager/theme/ThemeManager';
2
+ import { ThemeManager } from './ThemeManager';
3
3
  import type { ThemeManagerConfig } from './types';
4
- export { ThemeManager } from '../../manager/theme/ThemeManager';
4
+ export { ThemeManager } from './ThemeManager';
5
5
  export { DEFAULT_THEME, DEFAULT_THEME_MANAGER_CONFIG, THEME_MANAGER_NAME } from './constants';
6
+ export { registerLazyThemeManager } from './lazy';
6
7
  export type { ResolvedThemeMode, ResolvedThemeSnapshot, ThemeManagerConfig, ThemeSnapshot } from './types';
7
8
  export declare function registerThemeManager(kernel: Kernel, config?: ThemeManagerConfig): Promise<ThemeManager>;
@@ -1 +1 @@
1
- import{ThemeManager}from"../../manager/theme/ThemeManager";import{DEFAULT_THEME_MANAGER_CONFIG,THEME_MANAGER_NAME}from"./constants";export{ThemeManager}from"../../manager/theme/ThemeManager";export{DEFAULT_THEME,DEFAULT_THEME_MANAGER_CONFIG,THEME_MANAGER_NAME}from"./constants";export async function registerThemeManager(kernel,config=DEFAULT_THEME_MANAGER_CONFIG){const existing=kernel.getManager(THEME_MANAGER_NAME);if(existing instanceof ThemeManager){kernel.setManagerConfig(THEME_MANAGER_NAME,config);await kernel.initializeManager(THEME_MANAGER_NAME);return existing}const manager=new ThemeManager;kernel.setManagerConfig(THEME_MANAGER_NAME,config);kernel.registerManager(THEME_MANAGER_NAME,manager);await kernel.initializeManager(THEME_MANAGER_NAME);return manager}
1
+ import{ThemeManager}from"./ThemeManager";import{DEFAULT_THEME_MANAGER_CONFIG,THEME_MANAGER_NAME}from"./constants";export{ThemeManager}from"./ThemeManager";export{DEFAULT_THEME,DEFAULT_THEME_MANAGER_CONFIG,THEME_MANAGER_NAME}from"./constants";export{registerLazyThemeManager}from"./lazy";export async function registerThemeManager(kernel,config=DEFAULT_THEME_MANAGER_CONFIG){if(kernel.hasManager(THEME_MANAGER_NAME)){kernel.setManagerConfig(THEME_MANAGER_NAME,config);await kernel.initializeManager(THEME_MANAGER_NAME);const existing=kernel.getManager(THEME_MANAGER_NAME);if(existing instanceof ThemeManager){return existing}throw new Error(`Kernel manager "${THEME_MANAGER_NAME}" is not a ThemeManager`)}const existing=kernel.getManager(THEME_MANAGER_NAME);if(existing instanceof ThemeManager){kernel.setManagerConfig(THEME_MANAGER_NAME,config);await kernel.initializeManager(THEME_MANAGER_NAME);return existing}const manager=new ThemeManager;kernel.setManagerConfig(THEME_MANAGER_NAME,config);kernel.registerManager(THEME_MANAGER_NAME,manager);await kernel.initializeManager(THEME_MANAGER_NAME);return manager}
@@ -0,0 +1 @@
1
+ "use strict";Object.defineProperty(exports,"__esModule",{value:true});Object.defineProperty(exports,"registerLazyThemeManager",{enumerable:true,get:function(){return registerLazyThemeManager}});const _constants=require("./constants");function _getRequireWildcardCache(nodeInterop){if(typeof WeakMap!=="function")return null;var cacheBabelInterop=new WeakMap;var cacheNodeInterop=new WeakMap;return(_getRequireWildcardCache=function(nodeInterop){return nodeInterop?cacheNodeInterop:cacheBabelInterop})(nodeInterop)}function _interop_require_wildcard(obj,nodeInterop){if(!nodeInterop&&obj&&obj.__esModule){return obj}if(obj===null||typeof obj!=="object"&&typeof obj!=="function"){return{default:obj}}var cache=_getRequireWildcardCache(nodeInterop);if(cache&&cache.has(obj)){return cache.get(obj)}var newObj={__proto__:null};var hasPropertyDescriptor=Object.defineProperty&&Object.getOwnPropertyDescriptor;for(var key in obj){if(key!=="default"&&Object.prototype.hasOwnProperty.call(obj,key)){var desc=hasPropertyDescriptor?Object.getOwnPropertyDescriptor(obj,key):null;if(desc&&(desc.get||desc.set)){Object.defineProperty(newObj,key,desc)}else{newObj[key]=obj[key]}}}newObj.default=obj;if(cache){cache.set(obj,newObj)}return newObj}function registerLazyThemeManager(kernel,config=_constants.DEFAULT_THEME_MANAGER_CONFIG){if(kernel.hasManager(_constants.THEME_MANAGER_NAME)){kernel.setManagerConfig(_constants.THEME_MANAGER_NAME,config);return}kernel.setManagerConfig(_constants.THEME_MANAGER_NAME,config);kernel.registerLazyManager(_constants.THEME_MANAGER_NAME,async()=>{const module=await Promise.resolve().then(()=>/*#__PURE__*/_interop_require_wildcard(require("./ThemeManager")));return new module.ThemeManager})}
@@ -0,0 +1,3 @@
1
+ import type { Kernel } from '../../kernel';
2
+ import type { ThemeManagerConfig } from './types';
3
+ export declare function registerLazyThemeManager(kernel: Kernel, config?: ThemeManagerConfig): void;
@@ -0,0 +1 @@
1
+ import{DEFAULT_THEME_MANAGER_CONFIG,THEME_MANAGER_NAME}from"./constants";export function registerLazyThemeManager(kernel,config=DEFAULT_THEME_MANAGER_CONFIG){if(kernel.hasManager(THEME_MANAGER_NAME)){kernel.setManagerConfig(THEME_MANAGER_NAME,config);return}kernel.setManagerConfig(THEME_MANAGER_NAME,config);kernel.registerLazyManager(THEME_MANAGER_NAME,async()=>{const module=await import("./ThemeManager");return new module.ThemeManager})}
@@ -1,4 +1,4 @@
1
- import type { ResolvedThemeMode, ThemeSnapshot } from '../../custom-manager/theme/types';
1
+ import type { ResolvedThemeMode, ThemeSnapshot } from './types';
2
2
  type ThemeDomApplyOptions = {
3
3
  prevTheme?: ThemeSnapshot;
4
4
  nextResolvedMode?: ResolvedThemeMode;
@@ -1,6 +1,6 @@
1
1
  import type { StorageInstance } from '@vlian/utils';
2
2
  import type { PersistenceOptions } from '../../types';
3
- import type { ThemeSnapshot } from '../../custom-manager/theme/types';
3
+ import type { ThemeSnapshot } from './types';
4
4
  export declare const DEFAULT_THEME_CACHE_KEY = "vlian:kernel:theme";
5
5
  export declare function loadThemeFromCache(cacheManager: StorageInstance, persistence: PersistenceOptions | undefined, fallback: ThemeSnapshot): Promise<ThemeSnapshot>;
6
6
  export declare function saveThemeToCache(cacheManager: StorageInstance, persistence: PersistenceOptions | undefined, theme: ThemeSnapshot): Promise<void>;
@@ -1,4 +1,4 @@
1
- import type { ResolvedThemeMode, ResolvedThemeSnapshot, ThemeSnapshot } from '../../custom-manager/theme/types';
1
+ import type { ResolvedThemeMode, ResolvedThemeSnapshot, ThemeSnapshot } from './types';
2
2
  export type ThemeListener = (next: ThemeSnapshot, prev: ThemeSnapshot) => void;
3
3
  export declare function cloneTheme(theme: ThemeSnapshot): ThemeSnapshot;
4
4
  export declare function cloneResolvedTheme(theme: ResolvedThemeSnapshot): ResolvedThemeSnapshot;
@@ -1 +1 @@
1
- "use strict";Object.defineProperty(exports,"__esModule",{value:true});function _export(target,all){for(var name in all)Object.defineProperty(target,name,{enumerable:true,get:Object.getOwnPropertyDescriptor(all,name).get})}_export(exports,{get CacheManager(){return _manager.CacheManager},get DEFAULT_I18N(){return _custommanager.DEFAULT_I18N},get DEFAULT_I18N_MANAGER_CONFIG(){return _custommanager.DEFAULT_I18N_MANAGER_CONFIG},get DEFAULT_THEME(){return _custommanager.DEFAULT_THEME},get DEFAULT_THEME_MANAGER_CONFIG(){return _custommanager.DEFAULT_THEME_MANAGER_CONFIG},get I18N_MANAGER_NAME(){return _custommanager.I18N_MANAGER_NAME},get I18nManager(){return _custommanager.I18nManager},get Kernel(){return _kernel.Kernel},get LoggerManager(){return _manager.LoggerManager},get THEME_MANAGER_NAME(){return _custommanager.THEME_MANAGER_NAME},get ThemeManager(){return _custommanager.ThemeManager},get getKernel(){return _kernel.getKernel},get kernelStartApp(){return _kernel.kernelStartApp},get registerI18nManager(){return _custommanager.registerI18nManager},get registerThemeManager(){return _custommanager.registerThemeManager},get startup(){return _kernel.startup}});const _kernel=require("./kernel");const _manager=require("./manager");const _custommanager=require("./custom-manager");
1
+ "use strict";Object.defineProperty(exports,"__esModule",{value:true});function _export(target,all){for(var name in all)Object.defineProperty(target,name,{enumerable:true,get:Object.getOwnPropertyDescriptor(all,name).get})}_export(exports,{get CacheManager(){return _manager.CacheManager},get Kernel(){return _kernel.Kernel},get LoggerManager(){return _manager.LoggerManager},get getKernel(){return _kernel.getKernel},get kernelStartApp(){return _kernel.kernelStartApp},get startup(){return _kernel.startup}});const _kernel=require("./kernel");const _manager=require("./manager");
@@ -1,5 +1,4 @@
1
1
  export { Kernel, startup, getKernel, kernelStartApp } from './kernel';
2
2
  export { LoggerManager, CacheManager } from './manager';
3
- export { ThemeManager, I18nManager, THEME_MANAGER_NAME, I18N_MANAGER_NAME, DEFAULT_THEME, DEFAULT_I18N, DEFAULT_THEME_MANAGER_CONFIG, DEFAULT_I18N_MANAGER_CONFIG, registerThemeManager, registerI18nManager, } from './custom-manager';
3
+ export type { EagerKernelManagerRegistration, KernelLazyManagerOptions, KernelManagerLoader, KernelManagerModule, KernelManagerRegistration, LazyKernelManagerRegistration, } from './manager-registration';
4
4
  export type { KernelInstanceId, KernelStorageDriver, StorageOptions, PersistenceOptions, LoggerManagerConfig, CacheManagerConfig, KernelConfig, KernelTimingMetric, KernelManager, KernelManagerContext, KernelRenderContext, StartupHooks, StartOptions, KernelStartOptions, } from './types';
5
- export type { ResolvedThemeMode, ResolvedThemeSnapshot, ThemeSnapshot, ThemeManagerConfig, I18nSnapshot, I18nManagerConfig, } from './custom-manager';
@@ -1 +1 @@
1
- export{Kernel,startup,getKernel,kernelStartApp}from"./kernel";export{LoggerManager,CacheManager}from"./manager";export{ThemeManager,I18nManager,THEME_MANAGER_NAME,I18N_MANAGER_NAME,DEFAULT_THEME,DEFAULT_I18N,DEFAULT_THEME_MANAGER_CONFIG,DEFAULT_I18N_MANAGER_CONFIG,registerThemeManager,registerI18nManager}from"./custom-manager";
1
+ export{Kernel,startup,getKernel,kernelStartApp}from"./kernel";export{LoggerManager,CacheManager}from"./manager";
@@ -1 +1 @@
1
- "use strict";Object.defineProperty(exports,"__esModule",{value:true});function _export(target,all){for(var name in all)Object.defineProperty(target,name,{enumerable:true,get:Object.getOwnPropertyDescriptor(all,name).get})}_export(exports,{get Kernel(){return Kernel},get getKernel(){return getKernel},get kernelStartApp(){return kernelStartApp},get startup(){return startup}});const _constants=require("./constants");const _loggerManager=require("./manager/loggerManager");const _cacheManager=require("./manager/cacheManager");function _define_property(obj,key,value){if(key in obj){Object.defineProperty(obj,key,{value:value,enumerable:true,configurable:true,writable:true})}else{obj[key]=value}return obj}function now(){return typeof performance!=="undefined"?performance.now():Date.now()}let Kernel=class Kernel{static getInstance(instanceId=_constants.DEFAULT_INSTANCE_ID){const existing=Kernel.instances.get(instanceId);if(existing){return existing}const created=new Kernel(instanceId);Kernel.instances.set(instanceId,created);return created}getId(){return this.instanceId}getConfig(){return this.config}getMetrics(){return[...this.metrics]}getLoggerManager(){return this.loggerManager}getCacheManager(){return this.cacheManager}getManager(name){return this.managers.get(name)}registerManager(name,manager){if(this.managers.has(name)){throw new Error(`Kernel manager "${name}" 已存在`)}this.managers.set(name,manager)}getManagerConfig(name){return this.config.managerConfigs[name]}setManagerConfig(name,config){this.config={...this.config,managerConfigs:{...this.config.managerConfigs,[name]:config}}}async startup(options={}){if(this.started){this.logDebug("kernel.startup.skip.already-started",{instanceId:this.instanceId});return this}if(this.startupPromise){return this.startupPromise}this.startupPromise=this.bootstrap(options).finally(()=>{this.startupPromise=null});return this.startupPromise}async bootstrap(options){await this.measurePhase("startup.begin",async()=>{this.logDebug("kernel.startup.begin",{instanceId:this.instanceId})});await this.measurePhase("config.load",async()=>{this.config=await this.resolveConfig(options)});await this.measurePhase("manager.register.custom",async()=>{if(options.customManagers){Object.entries(options.customManagers).forEach(([name,manager])=>{if(!this.managers.has(name)){this.managers.set(name,manager)}})}});await this.measurePhase("manager.initialize.default",async()=>{await this.initializeManager("cache");await this.initializeManager("logger")});await this.measurePhase("manager.initialize.custom",async()=>{const customManagerNames=[...this.managers.keys()].filter(name=>name!=="logger"&&name!=="cache");for(const name of customManagerNames){await this.initializeManager(name)}});await this.measurePhase("hooks.initialize",async()=>{await options.hooks?.initialize?.();await options.lifecycle?.initialization?.()});await this.measurePhase("render.custom",async()=>{if(options.render){await options.render({instanceId:this.instanceId,config:this.config})}});this.started=true;this.logDebug("kernel.startup.end",{instanceId:this.instanceId,metrics:this.metrics});return this}async resolveConfig(options){let loaded={};if(options.configLoader){const loaderResult=await options.configLoader();loaded=loaderResult||{}}return{logger:{..._constants.DEFAULT_CONFIG.logger,...loaded.logger,...options.config?.logger||{},level:options.loggerLevel??options.config?.logger?.level??loaded.logger?.level},cache:{..._constants.DEFAULT_CONFIG.cache,...loaded.cache,...options.config?.cache||{},storageOptions:{..._constants.DEFAULT_CONFIG.cache.storageOptions,...loaded.cache?.storageOptions||{},...options.config?.cache?.storageOptions||{},...options.storageOptions||{}}},managerConfigs:{..._constants.DEFAULT_CONFIG.managerConfigs,...loaded.managerConfigs||{},...options.config?.managerConfigs||{},...options.managerConfigs||{}}}}async initializeManager(name){if(this.initializedManagers.has(name)){return}const existingPromise=this.managerInitPromises.get(name);if(existingPromise){await existingPromise;return}const manager=this.managers.get(name);if(!manager){throw new Error(`Kernel manager "${name}" 不存在`)}if(name!=="cache"&&!this.initializedManagers.has("cache")){await this.initializeManager("cache")}const context={instanceId:this.instanceId,config:this.config,cacheManager:this.cacheManager.cache,getManagerConfig:managerName=>this.config.managerConfigs[managerName]};const initPromise=(async()=>{await manager.initialize(context);this.initializedManagers.add(name);this.logDebug("kernel.manager.initialized",{name,instanceId:this.instanceId})})();this.managerInitPromises.set(name,initPromise);try{await initPromise}finally{this.managerInitPromises.delete(name)}}async measurePhase(phase,task){const startTime=now();this.logDebug("kernel.phase.start",{phase,startTime,instanceId:this.instanceId});await task();const endTime=now();const metric={phase,startTime,endTime,duration:endTime-startTime};this.metrics.push(metric);this.logDebug("kernel.phase.end",metric)}logDebug(message,payload){this.loggerManager.debug(message,payload)}constructor(instanceId){_define_property(this,"instanceId",void 0);_define_property(this,"metrics",[]);_define_property(this,"managers",new Map);_define_property(this,"managerInitPromises",new Map);_define_property(this,"initializedManagers",new Set);_define_property(this,"loggerManager",new _loggerManager.LoggerManager);_define_property(this,"cacheManager",new _cacheManager.CacheManager);_define_property(this,"config",_constants.DEFAULT_CONFIG);_define_property(this,"startupPromise",null);_define_property(this,"started",false);this.instanceId=instanceId;this.managers.set("logger",this.loggerManager);this.managers.set("cache",this.cacheManager)}};_define_property(Kernel,"instances",new Map);async function startup(options={},instanceId=_constants.DEFAULT_INSTANCE_ID){const kernel=Kernel.getInstance(instanceId);return kernel.startup(options)}function getKernel(instanceId=_constants.DEFAULT_INSTANCE_ID){return Kernel.getInstance(instanceId)}async function kernelStartApp(options={},instanceId=_constants.DEFAULT_INSTANCE_ID){return startup(options,instanceId)}
1
+ "use strict";Object.defineProperty(exports,"__esModule",{value:true});function _export(target,all){for(var name in all)Object.defineProperty(target,name,{enumerable:true,get:Object.getOwnPropertyDescriptor(all,name).get})}_export(exports,{get Kernel(){return Kernel},get getKernel(){return getKernel},get kernelStartApp(){return kernelStartApp},get startup(){return startup}});const _constants=require("./constants");const _loggerManager=require("./manager/loggerManager");const _cacheManager=require("./manager/cacheManager");const _managerregistration=require("./manager-registration");function now(){return typeof performance!=="undefined"?performance.now():Date.now()}let Kernel=class Kernel{static instances=new Map;static getInstance(instanceId=_constants.DEFAULT_INSTANCE_ID){const existing=Kernel.instances.get(instanceId);if(existing){return existing}const created=new Kernel(instanceId);Kernel.instances.set(instanceId,created);return created}instanceId;metrics=[];managers=new Map;managerLoaders=new Map;eagerManagers=new Set;managerInitPromises=new Map;initializedManagers=new Set;loggerManager=new _loggerManager.LoggerManager;cacheManager=new _cacheManager.CacheManager;config=_constants.DEFAULT_CONFIG;startupPromise=null;started=false;constructor(instanceId){this.instanceId=instanceId;this.managers.set("logger",this.loggerManager);this.managers.set("cache",this.cacheManager)}getId(){return this.instanceId}getConfig(){return this.config}getMetrics(){return[...this.metrics]}getLoggerManager(){return this.loggerManager}getCacheManager(){return this.cacheManager}getManager(name){return this.managers.get(name)}hasManager(name){return this.managers.has(name)||this.managerLoaders.has(name)}registerManager(name,manager){if(this.hasManager(name)){throw new Error(`Kernel manager "${name}" 已存在`)}this.managers.set(name,manager)}registerLazyManager(name,load,options={}){if(this.hasManager(name)){throw new Error(`Kernel manager "${name}" 已存在`)}this.managerLoaders.set(name,load);if(options.eager){this.eagerManagers.add(name)}}getManagerConfig(name){return this.config.managerConfigs[name]}setManagerConfig(name,config){this.config={...this.config,managerConfigs:{...this.config.managerConfigs,[name]:config}}}async startup(options={}){if(this.started){this.logDebug("kernel.startup.skip.already-started",{instanceId:this.instanceId});return this}if(this.startupPromise){return this.startupPromise}this.startupPromise=this.bootstrap(options).finally(()=>{this.startupPromise=null});return this.startupPromise}async bootstrap(options){await this.measurePhase("startup.begin",async()=>{this.logDebug("kernel.startup.begin",{instanceId:this.instanceId})});await this.measurePhase("config.load",async()=>{this.config=await this.resolveConfig(options)});await this.measurePhase("manager.register.custom",async()=>{if(options.customManagers){Object.entries(options.customManagers).forEach(([name,registration])=>{if(!this.hasManager(name)){this.registerConfiguredManager(name,registration)}})}});await this.measurePhase("manager.initialize.default",async()=>{await this.initializeManager("cache");await this.initializeManager("logger")});await this.measurePhase("manager.initialize.custom",async()=>{const customManagerNames=[...this.eagerManagers].filter(name=>name!=="logger"&&name!=="cache");await Promise.all(customManagerNames.map(name=>this.initializeManager(name)))});await this.measurePhase("hooks.initialize",async()=>{await options.hooks?.initialize?.();await options.lifecycle?.initialization?.()});await this.measurePhase("render.custom",async()=>{if(options.render){await options.render({instanceId:this.instanceId,config:this.config})}});this.started=true;this.logDebug("kernel.startup.end",{instanceId:this.instanceId,metrics:this.metrics});return this}async resolveConfig(options){let loaded={};if(options.configLoader){const loaderResult=await options.configLoader();loaded=loaderResult||{}}return{logger:{..._constants.DEFAULT_CONFIG.logger,...loaded.logger,...options.config?.logger||{},level:options.loggerLevel??options.config?.logger?.level??loaded.logger?.level},cache:{..._constants.DEFAULT_CONFIG.cache,...loaded.cache,...options.config?.cache||{},storageOptions:{..._constants.DEFAULT_CONFIG.cache.storageOptions,...loaded.cache?.storageOptions||{},...options.config?.cache?.storageOptions||{},...options.storageOptions||{}}},managerConfigs:{..._constants.DEFAULT_CONFIG.managerConfigs,...loaded.managerConfigs||{},...options.config?.managerConfigs||{},...options.managerConfigs||{}}}}async initializeManager(name){if(this.initializedManagers.has(name)){return}const existingPromise=this.managerInitPromises.get(name);if(existingPromise){await existingPromise;return}let manager=this.managers.get(name);if(!manager){manager=await this.loadManager(name)}if(!manager){throw new Error(`Kernel manager "${name}" 不存在`)}if(name!=="cache"&&!this.initializedManagers.has("cache")){await this.initializeManager("cache")}const context={instanceId:this.instanceId,config:this.config,cacheManager:this.cacheManager.cache,getManagerConfig:managerName=>this.config.managerConfigs[managerName]};const initPromise=(async()=>{await manager.initialize(context);this.initializedManagers.add(name);this.logDebug("kernel.manager.initialized",{name,instanceId:this.instanceId})})();this.managerInitPromises.set(name,initPromise);try{await initPromise}finally{this.managerInitPromises.delete(name)}}registerConfiguredManager(name,registration){if((0,_managerregistration.isKernelManager)(registration)){this.registerManager(name,registration);this.eagerManagers.add(name);return}if((0,_managerregistration.isLazyKernelManagerRegistration)(registration)){if(registration.config!==undefined){this.setManagerConfig(name,registration.config)}this.registerLazyManager(name,registration.load,{eager:registration.eager});return}if((0,_managerregistration.isEagerKernelManagerRegistration)(registration)){if(registration.config!==undefined){this.setManagerConfig(name,registration.config)}this.registerManager(name,registration.manager);if(registration.eager!==false){this.eagerManagers.add(name)}}}async loadManager(name){const load=this.managerLoaders.get(name);if(!load){return undefined}const loaded=(0,_managerregistration.resolveKernelManagerModule)(await load());this.managerLoaders.delete(name);this.managers.set(name,loaded);return loaded}async measurePhase(phase,task){const startTime=now();this.logDebug("kernel.phase.start",{phase,startTime,instanceId:this.instanceId});await task();const endTime=now();const metric={phase,startTime,endTime,duration:endTime-startTime};this.metrics.push(metric);this.logDebug("kernel.phase.end",metric)}logDebug(message,payload){this.loggerManager.debug(message,payload)}};async function startup(options={},instanceId=_constants.DEFAULT_INSTANCE_ID){const kernel=Kernel.getInstance(instanceId);return kernel.startup(options)}function getKernel(instanceId=_constants.DEFAULT_INSTANCE_ID){return Kernel.getInstance(instanceId)}async function kernelStartApp(options={},instanceId=_constants.DEFAULT_INSTANCE_ID){return startup(options,instanceId)}
@@ -1,12 +1,15 @@
1
1
  import type { KernelConfig, KernelInstanceId, KernelManager, KernelTimingMetric, StartOptions } from './types';
2
2
  import { LoggerManager } from './manager/loggerManager';
3
3
  import { CacheManager } from './manager/cacheManager';
4
+ import type { KernelLazyManagerOptions, KernelManagerLoader } from './manager-registration';
4
5
  export declare class Kernel {
5
6
  private static readonly instances;
6
7
  static getInstance(instanceId?: KernelInstanceId): Kernel;
7
8
  private readonly instanceId;
8
9
  private readonly metrics;
9
10
  private readonly managers;
11
+ private readonly managerLoaders;
12
+ private readonly eagerManagers;
10
13
  private readonly managerInitPromises;
11
14
  private readonly initializedManagers;
12
15
  private readonly loggerManager;
@@ -21,13 +24,17 @@ export declare class Kernel {
21
24
  getLoggerManager(): LoggerManager;
22
25
  getCacheManager(): CacheManager;
23
26
  getManager(name: string): KernelManager | undefined;
27
+ hasManager(name: string): boolean;
24
28
  registerManager(name: string, manager: KernelManager): void;
29
+ registerLazyManager(name: string, load: KernelManagerLoader, options?: KernelLazyManagerOptions): void;
25
30
  getManagerConfig<TConfig = unknown>(name: string): TConfig | undefined;
26
31
  setManagerConfig(name: string, config: unknown): void;
27
32
  startup(options?: StartOptions): Promise<Kernel>;
28
33
  private bootstrap;
29
34
  private resolveConfig;
30
35
  initializeManager(name: string): Promise<void>;
36
+ private registerConfiguredManager;
37
+ private loadManager;
31
38
  private measurePhase;
32
39
  private logDebug;
33
40
  }
@@ -1 +1 @@
1
- function _define_property(obj,key,value){if(key in obj){Object.defineProperty(obj,key,{value:value,enumerable:true,configurable:true,writable:true})}else{obj[key]=value}return obj}import{DEFAULT_CONFIG,DEFAULT_INSTANCE_ID}from"./constants";import{LoggerManager}from"./manager/loggerManager";import{CacheManager}from"./manager/cacheManager";function now(){return typeof performance!=="undefined"?performance.now():Date.now()}export class Kernel{static getInstance(instanceId=DEFAULT_INSTANCE_ID){const existing=Kernel.instances.get(instanceId);if(existing){return existing}const created=new Kernel(instanceId);Kernel.instances.set(instanceId,created);return created}getId(){return this.instanceId}getConfig(){return this.config}getMetrics(){return[...this.metrics]}getLoggerManager(){return this.loggerManager}getCacheManager(){return this.cacheManager}getManager(name){return this.managers.get(name)}registerManager(name,manager){if(this.managers.has(name)){throw new Error(`Kernel manager "${name}" 已存在`)}this.managers.set(name,manager)}getManagerConfig(name){return this.config.managerConfigs[name]}setManagerConfig(name,config){this.config={...this.config,managerConfigs:{...this.config.managerConfigs,[name]:config}}}async startup(options={}){if(this.started){this.logDebug("kernel.startup.skip.already-started",{instanceId:this.instanceId});return this}if(this.startupPromise){return this.startupPromise}this.startupPromise=this.bootstrap(options).finally(()=>{this.startupPromise=null});return this.startupPromise}async bootstrap(options){await this.measurePhase("startup.begin",async()=>{this.logDebug("kernel.startup.begin",{instanceId:this.instanceId})});await this.measurePhase("config.load",async()=>{this.config=await this.resolveConfig(options)});await this.measurePhase("manager.register.custom",async()=>{if(options.customManagers){Object.entries(options.customManagers).forEach(([name,manager])=>{if(!this.managers.has(name)){this.managers.set(name,manager)}})}});await this.measurePhase("manager.initialize.default",async()=>{await this.initializeManager("cache");await this.initializeManager("logger")});await this.measurePhase("manager.initialize.custom",async()=>{const customManagerNames=[...this.managers.keys()].filter(name=>name!=="logger"&&name!=="cache");for(const name of customManagerNames){await this.initializeManager(name)}});await this.measurePhase("hooks.initialize",async()=>{await options.hooks?.initialize?.();await options.lifecycle?.initialization?.()});await this.measurePhase("render.custom",async()=>{if(options.render){await options.render({instanceId:this.instanceId,config:this.config})}});this.started=true;this.logDebug("kernel.startup.end",{instanceId:this.instanceId,metrics:this.metrics});return this}async resolveConfig(options){let loaded={};if(options.configLoader){const loaderResult=await options.configLoader();loaded=loaderResult||{}}return{logger:{...DEFAULT_CONFIG.logger,...loaded.logger,...options.config?.logger||{},level:options.loggerLevel??options.config?.logger?.level??loaded.logger?.level},cache:{...DEFAULT_CONFIG.cache,...loaded.cache,...options.config?.cache||{},storageOptions:{...DEFAULT_CONFIG.cache.storageOptions,...loaded.cache?.storageOptions||{},...options.config?.cache?.storageOptions||{},...options.storageOptions||{}}},managerConfigs:{...DEFAULT_CONFIG.managerConfigs,...loaded.managerConfigs||{},...options.config?.managerConfigs||{},...options.managerConfigs||{}}}}async initializeManager(name){if(this.initializedManagers.has(name)){return}const existingPromise=this.managerInitPromises.get(name);if(existingPromise){await existingPromise;return}const manager=this.managers.get(name);if(!manager){throw new Error(`Kernel manager "${name}" 不存在`)}if(name!=="cache"&&!this.initializedManagers.has("cache")){await this.initializeManager("cache")}const context={instanceId:this.instanceId,config:this.config,cacheManager:this.cacheManager.cache,getManagerConfig:managerName=>this.config.managerConfigs[managerName]};const initPromise=(async()=>{await manager.initialize(context);this.initializedManagers.add(name);this.logDebug("kernel.manager.initialized",{name,instanceId:this.instanceId})})();this.managerInitPromises.set(name,initPromise);try{await initPromise}finally{this.managerInitPromises.delete(name)}}async measurePhase(phase,task){const startTime=now();this.logDebug("kernel.phase.start",{phase,startTime,instanceId:this.instanceId});await task();const endTime=now();const metric={phase,startTime,endTime,duration:endTime-startTime};this.metrics.push(metric);this.logDebug("kernel.phase.end",metric)}logDebug(message,payload){this.loggerManager.debug(message,payload)}constructor(instanceId){_define_property(this,"instanceId",void 0);_define_property(this,"metrics",[]);_define_property(this,"managers",new Map);_define_property(this,"managerInitPromises",new Map);_define_property(this,"initializedManagers",new Set);_define_property(this,"loggerManager",new LoggerManager);_define_property(this,"cacheManager",new CacheManager);_define_property(this,"config",DEFAULT_CONFIG);_define_property(this,"startupPromise",null);_define_property(this,"started",false);this.instanceId=instanceId;this.managers.set("logger",this.loggerManager);this.managers.set("cache",this.cacheManager)}}_define_property(Kernel,"instances",new Map);export async function startup(options={},instanceId=DEFAULT_INSTANCE_ID){const kernel=Kernel.getInstance(instanceId);return kernel.startup(options)}export function getKernel(instanceId=DEFAULT_INSTANCE_ID){return Kernel.getInstance(instanceId)}export async function kernelStartApp(options={},instanceId=DEFAULT_INSTANCE_ID){return startup(options,instanceId)}
1
+ import{DEFAULT_CONFIG,DEFAULT_INSTANCE_ID}from"./constants";import{LoggerManager}from"./manager/loggerManager";import{CacheManager}from"./manager/cacheManager";import{isEagerKernelManagerRegistration,isKernelManager,isLazyKernelManagerRegistration,resolveKernelManagerModule}from"./manager-registration";function now(){return typeof performance!=="undefined"?performance.now():Date.now()}export class Kernel{static instances=new Map;static getInstance(instanceId=DEFAULT_INSTANCE_ID){const existing=Kernel.instances.get(instanceId);if(existing){return existing}const created=new Kernel(instanceId);Kernel.instances.set(instanceId,created);return created}instanceId;metrics=[];managers=new Map;managerLoaders=new Map;eagerManagers=new Set;managerInitPromises=new Map;initializedManagers=new Set;loggerManager=new LoggerManager;cacheManager=new CacheManager;config=DEFAULT_CONFIG;startupPromise=null;started=false;constructor(instanceId){this.instanceId=instanceId;this.managers.set("logger",this.loggerManager);this.managers.set("cache",this.cacheManager)}getId(){return this.instanceId}getConfig(){return this.config}getMetrics(){return[...this.metrics]}getLoggerManager(){return this.loggerManager}getCacheManager(){return this.cacheManager}getManager(name){return this.managers.get(name)}hasManager(name){return this.managers.has(name)||this.managerLoaders.has(name)}registerManager(name,manager){if(this.hasManager(name)){throw new Error(`Kernel manager "${name}" 已存在`)}this.managers.set(name,manager)}registerLazyManager(name,load,options={}){if(this.hasManager(name)){throw new Error(`Kernel manager "${name}" 已存在`)}this.managerLoaders.set(name,load);if(options.eager){this.eagerManagers.add(name)}}getManagerConfig(name){return this.config.managerConfigs[name]}setManagerConfig(name,config){this.config={...this.config,managerConfigs:{...this.config.managerConfigs,[name]:config}}}async startup(options={}){if(this.started){this.logDebug("kernel.startup.skip.already-started",{instanceId:this.instanceId});return this}if(this.startupPromise){return this.startupPromise}this.startupPromise=this.bootstrap(options).finally(()=>{this.startupPromise=null});return this.startupPromise}async bootstrap(options){await this.measurePhase("startup.begin",async()=>{this.logDebug("kernel.startup.begin",{instanceId:this.instanceId})});await this.measurePhase("config.load",async()=>{this.config=await this.resolveConfig(options)});await this.measurePhase("manager.register.custom",async()=>{if(options.customManagers){Object.entries(options.customManagers).forEach(([name,registration])=>{if(!this.hasManager(name)){this.registerConfiguredManager(name,registration)}})}});await this.measurePhase("manager.initialize.default",async()=>{await this.initializeManager("cache");await this.initializeManager("logger")});await this.measurePhase("manager.initialize.custom",async()=>{const customManagerNames=[...this.eagerManagers].filter(name=>name!=="logger"&&name!=="cache");await Promise.all(customManagerNames.map(name=>this.initializeManager(name)))});await this.measurePhase("hooks.initialize",async()=>{await options.hooks?.initialize?.();await options.lifecycle?.initialization?.()});await this.measurePhase("render.custom",async()=>{if(options.render){await options.render({instanceId:this.instanceId,config:this.config})}});this.started=true;this.logDebug("kernel.startup.end",{instanceId:this.instanceId,metrics:this.metrics});return this}async resolveConfig(options){let loaded={};if(options.configLoader){const loaderResult=await options.configLoader();loaded=loaderResult||{}}return{logger:{...DEFAULT_CONFIG.logger,...loaded.logger,...options.config?.logger||{},level:options.loggerLevel??options.config?.logger?.level??loaded.logger?.level},cache:{...DEFAULT_CONFIG.cache,...loaded.cache,...options.config?.cache||{},storageOptions:{...DEFAULT_CONFIG.cache.storageOptions,...loaded.cache?.storageOptions||{},...options.config?.cache?.storageOptions||{},...options.storageOptions||{}}},managerConfigs:{...DEFAULT_CONFIG.managerConfigs,...loaded.managerConfigs||{},...options.config?.managerConfigs||{},...options.managerConfigs||{}}}}async initializeManager(name){if(this.initializedManagers.has(name)){return}const existingPromise=this.managerInitPromises.get(name);if(existingPromise){await existingPromise;return}let manager=this.managers.get(name);if(!manager){manager=await this.loadManager(name)}if(!manager){throw new Error(`Kernel manager "${name}" 不存在`)}if(name!=="cache"&&!this.initializedManagers.has("cache")){await this.initializeManager("cache")}const context={instanceId:this.instanceId,config:this.config,cacheManager:this.cacheManager.cache,getManagerConfig:managerName=>this.config.managerConfigs[managerName]};const initPromise=(async()=>{await manager.initialize(context);this.initializedManagers.add(name);this.logDebug("kernel.manager.initialized",{name,instanceId:this.instanceId})})();this.managerInitPromises.set(name,initPromise);try{await initPromise}finally{this.managerInitPromises.delete(name)}}registerConfiguredManager(name,registration){if(isKernelManager(registration)){this.registerManager(name,registration);this.eagerManagers.add(name);return}if(isLazyKernelManagerRegistration(registration)){if(registration.config!==undefined){this.setManagerConfig(name,registration.config)}this.registerLazyManager(name,registration.load,{eager:registration.eager});return}if(isEagerKernelManagerRegistration(registration)){if(registration.config!==undefined){this.setManagerConfig(name,registration.config)}this.registerManager(name,registration.manager);if(registration.eager!==false){this.eagerManagers.add(name)}}}async loadManager(name){const load=this.managerLoaders.get(name);if(!load){return undefined}const loaded=resolveKernelManagerModule(await load());this.managerLoaders.delete(name);this.managers.set(name,loaded);return loaded}async measurePhase(phase,task){const startTime=now();this.logDebug("kernel.phase.start",{phase,startTime,instanceId:this.instanceId});await task();const endTime=now();const metric={phase,startTime,endTime,duration:endTime-startTime};this.metrics.push(metric);this.logDebug("kernel.phase.end",metric)}logDebug(message,payload){this.loggerManager.debug(message,payload)}}export async function startup(options={},instanceId=DEFAULT_INSTANCE_ID){const kernel=Kernel.getInstance(instanceId);return kernel.startup(options)}export function getKernel(instanceId=DEFAULT_INSTANCE_ID){return Kernel.getInstance(instanceId)}export async function kernelStartApp(options={},instanceId=DEFAULT_INSTANCE_ID){return startup(options,instanceId)}
@@ -1 +1 @@
1
- "use strict";Object.defineProperty(exports,"__esModule",{value:true});Object.defineProperty(exports,"CacheManager",{enumerable:true,get:function(){return CacheManager}});const _constants=require("../constants");const _utils=require("@vlian/utils");function _define_property(obj,key,value){if(key in obj){Object.defineProperty(obj,key,{value:value,enumerable:true,configurable:true,writable:true})}else{obj[key]=value}return obj}let CacheManager=class CacheManager{initialize(context){this.snapshot=context.config.cache;this.cacheIn=(0,_utils.createStorage)({type:this.snapshot.storageOptions?.type||"local",prefix:this.snapshot.storageOptions?.prefix||"vlian",defaultExpire:this.snapshot.storageOptions?.defaultExpire||24*60*60*1e3,dbName:this.snapshot.storageOptions?.tableName})}get cache(){return this.cacheIn}getSnapshot(){return this.snapshot}constructor(){_define_property(this,"snapshot",_constants.DEFAULT_CONFIG.cache);_define_property(this,"cacheIn",void 0)}};
1
+ "use strict";Object.defineProperty(exports,"__esModule",{value:true});Object.defineProperty(exports,"CacheManager",{enumerable:true,get:function(){return CacheManager}});const _constants=require("../constants");const _utils=require("@vlian/utils");let CacheManager=class CacheManager{snapshot=_constants.DEFAULT_CONFIG.cache;cacheIn;initialize(context){this.snapshot=context.config.cache;this.cacheIn=(0,_utils.createStorage)({type:this.snapshot.storageOptions?.type||"local",prefix:this.snapshot.storageOptions?.prefix||"vlian",defaultExpire:this.snapshot.storageOptions?.defaultExpire||24*60*60*1e3,dbName:this.snapshot.storageOptions?.tableName})}get cache(){return this.cacheIn}getSnapshot(){return this.snapshot}};
@@ -1 +1 @@
1
- function _define_property(obj,key,value){if(key in obj){Object.defineProperty(obj,key,{value:value,enumerable:true,configurable:true,writable:true})}else{obj[key]=value}return obj}import{DEFAULT_CONFIG}from"../constants";import{createStorage}from"@vlian/utils";export class CacheManager{initialize(context){this.snapshot=context.config.cache;this.cacheIn=createStorage({type:this.snapshot.storageOptions?.type||"local",prefix:this.snapshot.storageOptions?.prefix||"vlian",defaultExpire:this.snapshot.storageOptions?.defaultExpire||24*60*60*1e3,dbName:this.snapshot.storageOptions?.tableName})}get cache(){return this.cacheIn}getSnapshot(){return this.snapshot}constructor(){_define_property(this,"snapshot",DEFAULT_CONFIG.cache);_define_property(this,"cacheIn",void 0)}}
1
+ import{DEFAULT_CONFIG}from"../constants";import{createStorage}from"@vlian/utils";export class CacheManager{snapshot=DEFAULT_CONFIG.cache;cacheIn;initialize(context){this.snapshot=context.config.cache;this.cacheIn=createStorage({type:this.snapshot.storageOptions?.type||"local",prefix:this.snapshot.storageOptions?.prefix||"vlian",defaultExpire:this.snapshot.storageOptions?.defaultExpire||24*60*60*1e3,dbName:this.snapshot.storageOptions?.tableName})}get cache(){return this.cacheIn}getSnapshot(){return this.snapshot}}
@@ -1 +1 @@
1
- "use strict";Object.defineProperty(exports,"__esModule",{value:true});Object.defineProperty(exports,"LoggerManager",{enumerable:true,get:function(){return LoggerManager}});const _logger=require("@vlian/logger");const _constants=require("../../constants");const _loggerschema=require("./logger.schema");const _loggerpersistence=require("./logger.persistence");function _define_property(obj,key,value){if(key in obj){Object.defineProperty(obj,key,{value:value,enumerable:true,configurable:true,writable:true})}else{obj[key]=value}return obj}let LoggerManager=class LoggerManager{async initialize(context){this.config=context.config.logger;this.cacheManager=context.cacheManager;const initialSnapshot=(0,_loggerschema.normalizeLoggerSnapshot)({level:this.config.level},{level:_logger.LogLevel.INFO});this.snapshot=await (0,_loggerpersistence.loadLoggerFromCache)(this.cacheManager,this.config.persistence,initialSnapshot);_logger.logger.setLevel(this.snapshot.level);this.initialized=true}subscribe(listener){this.listeners.add(listener);return()=>{this.listeners.delete(listener)}}debug(...args){_logger.logger.debug(...args)}info(...args){_logger.logger.info(...args)}warn(...args){_logger.logger.warn(...args)}error(...args){_logger.logger.error(...args)}async setLevel(level){this.ensureInitialized();const prevSnapshot=this.snapshot;const nextSnapshot=(0,_loggerschema.normalizeLoggerSnapshot)({level},prevSnapshot);if((0,_loggerschema.isLoggerEqual)(prevSnapshot,nextSnapshot)){return}this.snapshot=nextSnapshot;_logger.logger.setLevel(this.snapshot.level);if(this.cacheManager){await (0,_loggerpersistence.saveLoggerToCache)(this.cacheManager,this.config.persistence,this.snapshot)}this.emit(this.snapshot,prevSnapshot)}getSnapshot(){return{...this.snapshot}}ensureInitialized(){if(!this.initialized){throw new Error("LoggerManager must be initialized before use.")}}emit(next,prev){for(const listener of this.listeners){try{listener({...next},{...prev})}catch{}}}constructor(){_define_property(this,"snapshot",{level:_logger.LogLevel.INFO});_define_property(this,"config",_constants.DEFAULT_CONFIG.logger);_define_property(this,"listeners",new Set);_define_property(this,"cacheManager",null);_define_property(this,"initialized",false)}};
1
+ "use strict";Object.defineProperty(exports,"__esModule",{value:true});Object.defineProperty(exports,"LoggerManager",{enumerable:true,get:function(){return LoggerManager}});const _logger=require("@vlian/logger");const _constants=require("../../constants");const _loggerschema=require("./logger.schema");const _loggerpersistence=require("./logger.persistence");let LoggerManager=class LoggerManager{snapshot={level:_logger.LogLevel.INFO};config=_constants.DEFAULT_CONFIG.logger;listeners=new Set;cacheManager=null;initialized=false;async initialize(context){this.config=context.config.logger;this.cacheManager=context.cacheManager;const initialSnapshot=(0,_loggerschema.normalizeLoggerSnapshot)({level:this.config.level},{level:_logger.LogLevel.INFO});this.snapshot=await (0,_loggerpersistence.loadLoggerFromCache)(this.cacheManager,this.config.persistence,initialSnapshot);_logger.logger.setLevel(this.snapshot.level);this.initialized=true}subscribe(listener){this.listeners.add(listener);return()=>{this.listeners.delete(listener)}}debug(...args){_logger.logger.debug(...args)}info(...args){_logger.logger.info(...args)}warn(...args){_logger.logger.warn(...args)}error(...args){_logger.logger.error(...args)}async setLevel(level){this.ensureInitialized();const prevSnapshot=this.snapshot;const nextSnapshot=(0,_loggerschema.normalizeLoggerSnapshot)({level},prevSnapshot);if((0,_loggerschema.isLoggerEqual)(prevSnapshot,nextSnapshot)){return}this.snapshot=nextSnapshot;_logger.logger.setLevel(this.snapshot.level);if(this.cacheManager){await (0,_loggerpersistence.saveLoggerToCache)(this.cacheManager,this.config.persistence,this.snapshot)}this.emit(this.snapshot,prevSnapshot)}getSnapshot(){return{...this.snapshot}}ensureInitialized(){if(!this.initialized){throw new Error("LoggerManager must be initialized before use.")}}emit(next,prev){for(const listener of this.listeners){try{listener({...next},{...prev})}catch{}}}};
@@ -1 +1 @@
1
- function _define_property(obj,key,value){if(key in obj){Object.defineProperty(obj,key,{value:value,enumerable:true,configurable:true,writable:true})}else{obj[key]=value}return obj}import{logger,LogLevel}from"@vlian/logger";import{DEFAULT_CONFIG}from"../../constants";import{isLoggerEqual,normalizeLoggerSnapshot}from"./logger.schema";import{loadLoggerFromCache,saveLoggerToCache}from"./logger.persistence";export class LoggerManager{async initialize(context){this.config=context.config.logger;this.cacheManager=context.cacheManager;const initialSnapshot=normalizeLoggerSnapshot({level:this.config.level},{level:LogLevel.INFO});this.snapshot=await loadLoggerFromCache(this.cacheManager,this.config.persistence,initialSnapshot);logger.setLevel(this.snapshot.level);this.initialized=true}subscribe(listener){this.listeners.add(listener);return()=>{this.listeners.delete(listener)}}debug(...args){logger.debug(...args)}info(...args){logger.info(...args)}warn(...args){logger.warn(...args)}error(...args){logger.error(...args)}async setLevel(level){this.ensureInitialized();const prevSnapshot=this.snapshot;const nextSnapshot=normalizeLoggerSnapshot({level},prevSnapshot);if(isLoggerEqual(prevSnapshot,nextSnapshot)){return}this.snapshot=nextSnapshot;logger.setLevel(this.snapshot.level);if(this.cacheManager){await saveLoggerToCache(this.cacheManager,this.config.persistence,this.snapshot)}this.emit(this.snapshot,prevSnapshot)}getSnapshot(){return{...this.snapshot}}ensureInitialized(){if(!this.initialized){throw new Error("LoggerManager must be initialized before use.")}}emit(next,prev){for(const listener of this.listeners){try{listener({...next},{...prev})}catch{}}}constructor(){_define_property(this,"snapshot",{level:LogLevel.INFO});_define_property(this,"config",DEFAULT_CONFIG.logger);_define_property(this,"listeners",new Set);_define_property(this,"cacheManager",null);_define_property(this,"initialized",false)}}
1
+ import{logger,LogLevel}from"@vlian/logger";import{DEFAULT_CONFIG}from"../../constants";import{isLoggerEqual,normalizeLoggerSnapshot}from"./logger.schema";import{loadLoggerFromCache,saveLoggerToCache}from"./logger.persistence";export class LoggerManager{snapshot={level:LogLevel.INFO};config=DEFAULT_CONFIG.logger;listeners=new Set;cacheManager=null;initialized=false;async initialize(context){this.config=context.config.logger;this.cacheManager=context.cacheManager;const initialSnapshot=normalizeLoggerSnapshot({level:this.config.level},{level:LogLevel.INFO});this.snapshot=await loadLoggerFromCache(this.cacheManager,this.config.persistence,initialSnapshot);logger.setLevel(this.snapshot.level);this.initialized=true}subscribe(listener){this.listeners.add(listener);return()=>{this.listeners.delete(listener)}}debug(...args){logger.debug(...args)}info(...args){logger.info(...args)}warn(...args){logger.warn(...args)}error(...args){logger.error(...args)}async setLevel(level){this.ensureInitialized();const prevSnapshot=this.snapshot;const nextSnapshot=normalizeLoggerSnapshot({level},prevSnapshot);if(isLoggerEqual(prevSnapshot,nextSnapshot)){return}this.snapshot=nextSnapshot;logger.setLevel(this.snapshot.level);if(this.cacheManager){await saveLoggerToCache(this.cacheManager,this.config.persistence,this.snapshot)}this.emit(this.snapshot,prevSnapshot)}getSnapshot(){return{...this.snapshot}}ensureInitialized(){if(!this.initialized){throw new Error("LoggerManager must be initialized before use.")}}emit(next,prev){for(const listener of this.listeners){try{listener({...next},{...prev})}catch{}}}}
@@ -0,0 +1 @@
1
+ "use strict";Object.defineProperty(exports,"__esModule",{value:true});function _export(target,all){for(var name in all)Object.defineProperty(target,name,{enumerable:true,get:Object.getOwnPropertyDescriptor(all,name).get})}_export(exports,{get isEagerKernelManagerRegistration(){return isEagerKernelManagerRegistration},get isKernelManager(){return isKernelManager},get isLazyKernelManagerRegistration(){return isLazyKernelManagerRegistration},get resolveKernelManagerModule(){return resolveKernelManagerModule}});function isKernelManager(value){return typeof value==="object"&&value!==null&&typeof value.initialize==="function"}function isLazyKernelManagerRegistration(value){return typeof value==="object"&&value!==null&&"load"in value}function isEagerKernelManagerRegistration(value){return typeof value==="object"&&value!==null&&"manager"in value}function resolveKernelManagerModule(module){if(isKernelManager(module)){return module}if("manager"in module&&isKernelManager(module.manager)){return module.manager}if("default"in module&&isKernelManager(module.default)){return module.default}throw new Error("Invalid lazy kernel manager module")}
@@ -0,0 +1,25 @@
1
+ import type { KernelManager } from './types';
2
+ export type KernelManagerModule = KernelManager | {
3
+ default: KernelManager;
4
+ } | {
5
+ manager: KernelManager;
6
+ };
7
+ export type KernelManagerLoader = () => Promise<KernelManagerModule> | KernelManagerModule;
8
+ export interface LazyKernelManagerRegistration {
9
+ load: KernelManagerLoader;
10
+ eager?: boolean;
11
+ config?: unknown;
12
+ }
13
+ export interface EagerKernelManagerRegistration {
14
+ manager: KernelManager;
15
+ eager?: boolean;
16
+ config?: unknown;
17
+ }
18
+ export type KernelManagerRegistration = KernelManager | LazyKernelManagerRegistration | EagerKernelManagerRegistration;
19
+ export interface KernelLazyManagerOptions {
20
+ eager?: boolean;
21
+ }
22
+ export declare function isKernelManager(value: unknown): value is KernelManager;
23
+ export declare function isLazyKernelManagerRegistration(value: KernelManagerRegistration): value is LazyKernelManagerRegistration;
24
+ export declare function isEagerKernelManagerRegistration(value: KernelManagerRegistration): value is EagerKernelManagerRegistration;
25
+ export declare function resolveKernelManagerModule(module: KernelManagerModule): KernelManager;
@@ -0,0 +1 @@
1
+ export function isKernelManager(value){return typeof value==="object"&&value!==null&&typeof value.initialize==="function"}export function isLazyKernelManagerRegistration(value){return typeof value==="object"&&value!==null&&"load"in value}export function isEagerKernelManagerRegistration(value){return typeof value==="object"&&value!==null&&"manager"in value}export function resolveKernelManagerModule(module){if(isKernelManager(module)){return module}if("manager"in module&&isKernelManager(module.manager)){return module.manager}if("default"in module&&isKernelManager(module.default)){return module.default}throw new Error("Invalid lazy kernel manager module")}
@@ -1,6 +1,7 @@
1
1
  import type { LogLevel } from '@vlian/logger';
2
2
  import type { StorageInstance } from '@vlian/utils';
3
3
  import type { StorageType } from '@vlian/utils';
4
+ import type { KernelManagerRegistration } from './manager-registration';
4
5
  export type StorageOptions = {
5
6
  prefix: string;
6
7
  defaultExpire: number;
@@ -81,7 +82,7 @@ export interface StartOptions extends CoreStartOptions {
81
82
  config?: Partial<KernelConfig>;
82
83
  configLoader?: () => Promise<Partial<KernelConfig> | void> | Partial<KernelConfig> | void;
83
84
  render?: (context: KernelRenderContext) => Promise<void> | void;
84
- customManagers?: Record<string, KernelManager>;
85
+ customManagers?: Record<string, KernelManagerRegistration>;
85
86
  managerConfigs?: Record<string, unknown>;
86
87
  hooks?: StartupHooks;
87
88
  }
package/dist/theme.cjs ADDED
@@ -0,0 +1 @@
1
+ "use strict";Object.defineProperty(exports,"__esModule",{value:true});function _export(target,all){for(var name in all)Object.defineProperty(target,name,{enumerable:true,get:Object.getOwnPropertyDescriptor(all,name).get})}_export(exports,{get DEFAULT_THEME(){return _theme.DEFAULT_THEME},get DEFAULT_THEME_MANAGER_CONFIG(){return _theme.DEFAULT_THEME_MANAGER_CONFIG},get THEME_MANAGER_NAME(){return _theme.THEME_MANAGER_NAME},get ThemeManager(){return _theme.ThemeManager},get registerLazyThemeManager(){return _theme.registerLazyThemeManager},get registerThemeManager(){return _theme.registerThemeManager}});const _theme=require("./kernel/custom-manager/theme");
@@ -0,0 +1,2 @@
1
+ export { ThemeManager, DEFAULT_THEME, DEFAULT_THEME_MANAGER_CONFIG, THEME_MANAGER_NAME, registerLazyThemeManager, registerThemeManager, } from './kernel/custom-manager/theme';
2
+ export type { ResolvedThemeMode, ResolvedThemeSnapshot, ThemeManagerConfig, ThemeSnapshot, } from './kernel/custom-manager/theme';
package/dist/theme.js ADDED
@@ -0,0 +1 @@
1
+ export{ThemeManager,DEFAULT_THEME,DEFAULT_THEME_MANAGER_CONFIG,THEME_MANAGER_NAME,registerLazyThemeManager,registerThemeManager}from"./kernel/custom-manager/theme";
@@ -0,0 +1 @@
1
+ "use strict";Object.defineProperty(exports,"__esModule",{value:true});Object.defineProperty(exports,"registerLazyThemeManager",{enumerable:true,get:function(){return _lazy.registerLazyThemeManager}});const _lazy=require("./kernel/custom-manager/theme/lazy");
@@ -0,0 +1,2 @@
1
+ export { registerLazyThemeManager } from './kernel/custom-manager/theme/lazy';
2
+ export type { ThemeManagerConfig } from './kernel/custom-manager/theme';
@@ -0,0 +1 @@
1
+ export{registerLazyThemeManager}from"./kernel/custom-manager/theme/lazy";
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@vlian/framework",
3
- "version": "2.0.1",
3
+ "version": "2.0.3",
4
4
  "private": false,
5
5
  "packageManager": "pnpm@10.27.0",
6
6
  "description": "Secra Framework - 一个现代化的低代码框架",
@@ -15,6 +15,26 @@
15
15
  "require": "./dist/index.cjs",
16
16
  "browser": "./dist/index.umd.js"
17
17
  },
18
+ "./theme": {
19
+ "types": "./dist/theme.d.ts",
20
+ "import": "./dist/theme.js",
21
+ "require": "./dist/theme.cjs"
22
+ },
23
+ "./theme/lazy": {
24
+ "types": "./dist/theme.lazy.d.ts",
25
+ "import": "./dist/theme.lazy.js",
26
+ "require": "./dist/theme.lazy.cjs"
27
+ },
28
+ "./i18n": {
29
+ "types": "./dist/i18n.d.ts",
30
+ "import": "./dist/i18n.js",
31
+ "require": "./dist/i18n.cjs"
32
+ },
33
+ "./i18n/lazy": {
34
+ "types": "./dist/i18n.lazy.d.ts",
35
+ "import": "./dist/i18n.lazy.js",
36
+ "require": "./dist/i18n.lazy.cjs"
37
+ },
18
38
  "./kernel": {
19
39
  "types": "./dist/kernel/index.d.ts",
20
40
  "import": "./dist/kernel/index.js",
@@ -29,6 +49,18 @@
29
49
  },
30
50
  "typesVersions": {
31
51
  "*": {
52
+ "theme": [
53
+ "dist/theme.d.ts"
54
+ ],
55
+ "theme/lazy": [
56
+ "dist/theme.lazy.d.ts"
57
+ ],
58
+ "i18n": [
59
+ "dist/i18n.d.ts"
60
+ ],
61
+ "i18n/lazy": [
62
+ "dist/i18n.lazy.d.ts"
63
+ ],
32
64
  "kernel": [
33
65
  "dist/kernel/index.d.ts"
34
66
  ],
@@ -45,6 +77,18 @@
45
77
  "dist/index.d.ts",
46
78
  "dist/index.js",
47
79
  "dist/index.umd.js",
80
+ "dist/theme.cjs",
81
+ "dist/theme.d.ts",
82
+ "dist/theme.js",
83
+ "dist/theme.lazy.cjs",
84
+ "dist/theme.lazy.d.ts",
85
+ "dist/theme.lazy.js",
86
+ "dist/i18n.cjs",
87
+ "dist/i18n.d.ts",
88
+ "dist/i18n.js",
89
+ "dist/i18n.lazy.cjs",
90
+ "dist/i18n.lazy.d.ts",
91
+ "dist/i18n.lazy.js",
48
92
  "dist/kernel",
49
93
  "README.md",
50
94
  "LICENSE"
@@ -1 +0,0 @@
1
- "use strict";Object.defineProperty(exports,"__esModule",{value:true});Object.defineProperty(exports,"I18nManager",{enumerable:true,get:function(){return I18nManager}});const _constants=require("../../custom-manager/i18n/constants");const _i18npersistence=require("./i18n.persistence");const _i18nruntime=require("./i18n.runtime");const _i18nschema=require("./i18n.schema");function _define_property(obj,key,value){if(key in obj){Object.defineProperty(obj,key,{value:value,enumerable:true,configurable:true,writable:true})}else{obj[key]=value}return obj}let I18nManager=class I18nManager{async initialize(context){this.config=context.getManagerConfig(_constants.I18N_MANAGER_NAME)||_constants.DEFAULT_I18N_MANAGER_CONFIG;this.cacheManager=context.cacheManager;const initialSnapshot=(0,_i18nschema.normalizeI18nSnapshot)(this.config.initial||{},_constants.DEFAULT_I18N);this.snapshot=await (0,_i18npersistence.loadI18nFromCache)(this.cacheManager,this.config.persistence,initialSnapshot);await (0,_i18nruntime.initializeI18nRuntime)({locale:this.snapshot.locale||"zh-CN",resources:this.snapshot.resources});this.initialized=true}getSnapshot(){return(0,_i18nschema.cloneI18nSnapshot)(this.snapshot)}subscribe(listener){this.listeners.add(listener);return()=>{this.listeners.delete(listener)}}async setLocale(locale){this.ensureInitialized();const prevSnapshot=this.snapshot;const nextSnapshot=(0,_i18nschema.mergeI18nSnapshot)(prevSnapshot,{locale});if((0,_i18nschema.isI18nEqual)(prevSnapshot,nextSnapshot)){return}this.snapshot=nextSnapshot;await (0,_i18nruntime.switchI18nLocale)(this.snapshot.locale);if(this.cacheManager){await (0,_i18npersistence.saveI18nToCache)(this.cacheManager,this.config.persistence,this.snapshot)}this.emit(this.snapshot,prevSnapshot)}ensureInitialized(){if(!this.initialized){throw new Error("I18nManager must be initialized before use.")}}emit(next,prev){for(const listener of this.listeners){try{listener((0,_i18nschema.cloneI18nSnapshot)(next),(0,_i18nschema.cloneI18nSnapshot)(prev))}catch{}}}constructor(){_define_property(this,"snapshot",(0,_i18nschema.cloneI18nSnapshot)(_constants.DEFAULT_I18N));_define_property(this,"config",_constants.DEFAULT_I18N_MANAGER_CONFIG);_define_property(this,"listeners",new Set);_define_property(this,"cacheManager",null);_define_property(this,"initialized",false)}};
@@ -1 +0,0 @@
1
- function _define_property(obj,key,value){if(key in obj){Object.defineProperty(obj,key,{value:value,enumerable:true,configurable:true,writable:true})}else{obj[key]=value}return obj}import{DEFAULT_I18N,DEFAULT_I18N_MANAGER_CONFIG,I18N_MANAGER_NAME}from"../../custom-manager/i18n/constants";import{loadI18nFromCache,saveI18nToCache}from"./i18n.persistence";import{initializeI18nRuntime,switchI18nLocale}from"./i18n.runtime";import{cloneI18nSnapshot,isI18nEqual,mergeI18nSnapshot,normalizeI18nSnapshot}from"./i18n.schema";export class I18nManager{async initialize(context){this.config=context.getManagerConfig(I18N_MANAGER_NAME)||DEFAULT_I18N_MANAGER_CONFIG;this.cacheManager=context.cacheManager;const initialSnapshot=normalizeI18nSnapshot(this.config.initial||{},DEFAULT_I18N);this.snapshot=await loadI18nFromCache(this.cacheManager,this.config.persistence,initialSnapshot);await initializeI18nRuntime({locale:this.snapshot.locale||"zh-CN",resources:this.snapshot.resources});this.initialized=true}getSnapshot(){return cloneI18nSnapshot(this.snapshot)}subscribe(listener){this.listeners.add(listener);return()=>{this.listeners.delete(listener)}}async setLocale(locale){this.ensureInitialized();const prevSnapshot=this.snapshot;const nextSnapshot=mergeI18nSnapshot(prevSnapshot,{locale});if(isI18nEqual(prevSnapshot,nextSnapshot)){return}this.snapshot=nextSnapshot;await switchI18nLocale(this.snapshot.locale);if(this.cacheManager){await saveI18nToCache(this.cacheManager,this.config.persistence,this.snapshot)}this.emit(this.snapshot,prevSnapshot)}ensureInitialized(){if(!this.initialized){throw new Error("I18nManager must be initialized before use.")}}emit(next,prev){for(const listener of this.listeners){try{listener(cloneI18nSnapshot(next),cloneI18nSnapshot(prev))}catch{}}}constructor(){_define_property(this,"snapshot",cloneI18nSnapshot(DEFAULT_I18N));_define_property(this,"config",DEFAULT_I18N_MANAGER_CONFIG);_define_property(this,"listeners",new Set);_define_property(this,"cacheManager",null);_define_property(this,"initialized",false)}}
@@ -1 +0,0 @@
1
- function isPlainObject(value){return Object.prototype.toString.call(value)==="[object Object]"}export function cloneI18nSnapshot(snapshot){const resources=snapshot.resources?Object.fromEntries(Object.entries(snapshot.resources).map(([locale,value])=>[locale,{...value}])):undefined;return{locale:snapshot.locale,...resources?{resources}:{}}}export function normalizeI18nSnapshot(value,fallback){const source=isPlainObject(value)?value:{};const locale=typeof source.locale==="string"&&source.locale.trim()?source.locale:fallback.locale;const fallbackResources=fallback.resources;const incomingResources=isPlainObject(source.resources)?Object.fromEntries(Object.entries(source.resources).filter(([,resourceValue])=>isPlainObject(resourceValue)).map(([locale,resourceValue])=>[locale,{...resourceValue}])):undefined;const resources=incomingResources||fallbackResources?{...fallbackResources||{},...incomingResources||{}}:undefined;return{locale,...resources?{resources}:{}}}export function mergeI18nSnapshot(current,next){return normalizeI18nSnapshot({locale:next.locale??current.locale,resources:next.resources??current.resources},current)}export function isI18nEqual(left,right){if(left.locale!==right.locale){return false}const leftResources=left.resources||{};const rightResources=right.resources||{};const leftLocales=Object.keys(leftResources);const rightLocales=Object.keys(rightResources);if(leftLocales.length!==rightLocales.length){return false}for(const locale of leftLocales){if(leftResources[locale]!==rightResources[locale]){return false}}return true}
@@ -1 +0,0 @@
1
- "use strict";Object.defineProperty(exports,"__esModule",{value:true});Object.defineProperty(exports,"I18nManager",{enumerable:true,get:function(){return _I18nManager.I18nManager}});const _I18nManager=require("./I18nManager");
@@ -1 +0,0 @@
1
- export { I18nManager } from './I18nManager';
@@ -1 +0,0 @@
1
- export{I18nManager}from"./I18nManager";
@@ -1 +0,0 @@
1
- "use strict";Object.defineProperty(exports,"__esModule",{value:true});Object.defineProperty(exports,"I18nManager",{enumerable:true,get:function(){return _i18n.I18nManager}});const _i18n=require("../custom-manager/i18n");
@@ -1 +0,0 @@
1
- export { I18nManager } from '../custom-manager/i18n';
@@ -1 +0,0 @@
1
- export{I18nManager}from"../custom-manager/i18n";
@@ -1 +0,0 @@
1
- "use strict";Object.defineProperty(exports,"__esModule",{value:true});Object.defineProperty(exports,"ThemeManager",{enumerable:true,get:function(){return ThemeManager}});const _constants=require("../../custom-manager/theme/constants");const _themedom=require("./theme.dom");const _themepersistence=require("./theme.persistence");const _themeschema=require("./theme.schema");function _define_property(obj,key,value){if(key in obj){Object.defineProperty(obj,key,{value:value,enumerable:true,configurable:true,writable:true})}else{obj[key]=value}return obj}let ThemeManager=class ThemeManager{async initialize(context){this.config=context.getManagerConfig(_constants.THEME_MANAGER_NAME)||_constants.DEFAULT_THEME_MANAGER_CONFIG;this.cacheManager=context.cacheManager;const initialTheme=(0,_themeschema.normalizeTheme)(this.config.initial||{},_constants.DEFAULT_THEME);this.theme=await (0,_themepersistence.loadThemeFromCache)(this.cacheManager,this.config.persistence,initialTheme);this.resolvedMode=(0,_themedom.resolveThemeMode)(this.theme);(0,_themedom.applyThemeToDocument)(this.theme,{nextResolvedMode:this.resolvedMode});this.bindSystemThemeObserver();this.initialized=true}getTheme(){return(0,_themeschema.cloneTheme)(this.theme)}getSnapshot(){return this.getTheme()}getResolvedMode(){this.ensureInitialized();return this.resolvedMode}getResolvedTheme(){this.ensureInitialized();return(0,_themeschema.cloneResolvedTheme)({...this.getTheme(),resolvedMode:this.resolvedMode})}subscribe(listener){this.listeners.add(listener);return()=>{this.listeners.delete(listener)}}async setTheme(nextTheme){this.ensureInitialized();const prevTheme=this.theme;const prevResolvedMode=this.resolvedMode;const mergedTheme=(0,_themeschema.mergeTheme)(prevTheme,nextTheme);const nextResolvedMode=(0,_themedom.resolveThemeMode)(mergedTheme);if((0,_themeschema.isThemeEqual)(prevTheme,mergedTheme)&&(0,_themeschema.isResolvedThemeModeEqual)(prevResolvedMode,nextResolvedMode)){return}this.theme=mergedTheme;this.resolvedMode=nextResolvedMode;(0,_themedom.applyThemeToDocument)(this.theme,{prevTheme,prevResolvedMode,nextResolvedMode});if(this.cacheManager){await (0,_themepersistence.saveThemeToCache)(this.cacheManager,this.config.persistence,this.theme)}this.emit(this.theme,prevTheme)}ensureInitialized(){if(!this.initialized){throw new Error("ThemeManager must be initialized before use.")}}destroy(){this.stopSystemThemeObserver?.();this.stopSystemThemeObserver=null;this.listeners.clear();this.initialized=false}bindSystemThemeObserver(){this.stopSystemThemeObserver?.();this.stopSystemThemeObserver=(0,_themedom.observeSystemThemeChange)(nextResolvedMode=>{if(this.theme.mode!=="system"){return}const prevResolvedMode=this.resolvedMode;if((0,_themeschema.isResolvedThemeModeEqual)(prevResolvedMode,nextResolvedMode)){return}this.resolvedMode=nextResolvedMode;(0,_themedom.applyThemeToDocument)(this.theme,{prevTheme:this.theme,prevResolvedMode,nextResolvedMode});this.emit(this.theme,this.theme)})||null}emit(next,prev){for(const listener of this.listeners){try{listener((0,_themeschema.cloneTheme)(next),(0,_themeschema.cloneTheme)(prev))}catch{}}}constructor(){_define_property(this,"theme",(0,_themeschema.cloneTheme)(_constants.DEFAULT_THEME));_define_property(this,"resolvedMode",(0,_themedom.resolveThemeMode)(_constants.DEFAULT_THEME));_define_property(this,"config",_constants.DEFAULT_THEME_MANAGER_CONFIG);_define_property(this,"listeners",new Set);_define_property(this,"cacheManager",null);_define_property(this,"stopSystemThemeObserver",null);_define_property(this,"initialized",false)}};
@@ -1 +0,0 @@
1
- function _define_property(obj,key,value){if(key in obj){Object.defineProperty(obj,key,{value:value,enumerable:true,configurable:true,writable:true})}else{obj[key]=value}return obj}import{DEFAULT_THEME,DEFAULT_THEME_MANAGER_CONFIG,THEME_MANAGER_NAME}from"../../custom-manager/theme/constants";import{applyThemeToDocument,observeSystemThemeChange,resolveThemeMode}from"./theme.dom";import{loadThemeFromCache,saveThemeToCache}from"./theme.persistence";import{cloneResolvedTheme,cloneTheme,isResolvedThemeModeEqual,isThemeEqual,mergeTheme,normalizeTheme}from"./theme.schema";export class ThemeManager{async initialize(context){this.config=context.getManagerConfig(THEME_MANAGER_NAME)||DEFAULT_THEME_MANAGER_CONFIG;this.cacheManager=context.cacheManager;const initialTheme=normalizeTheme(this.config.initial||{},DEFAULT_THEME);this.theme=await loadThemeFromCache(this.cacheManager,this.config.persistence,initialTheme);this.resolvedMode=resolveThemeMode(this.theme);applyThemeToDocument(this.theme,{nextResolvedMode:this.resolvedMode});this.bindSystemThemeObserver();this.initialized=true}getTheme(){return cloneTheme(this.theme)}getSnapshot(){return this.getTheme()}getResolvedMode(){this.ensureInitialized();return this.resolvedMode}getResolvedTheme(){this.ensureInitialized();return cloneResolvedTheme({...this.getTheme(),resolvedMode:this.resolvedMode})}subscribe(listener){this.listeners.add(listener);return()=>{this.listeners.delete(listener)}}async setTheme(nextTheme){this.ensureInitialized();const prevTheme=this.theme;const prevResolvedMode=this.resolvedMode;const mergedTheme=mergeTheme(prevTheme,nextTheme);const nextResolvedMode=resolveThemeMode(mergedTheme);if(isThemeEqual(prevTheme,mergedTheme)&&isResolvedThemeModeEqual(prevResolvedMode,nextResolvedMode)){return}this.theme=mergedTheme;this.resolvedMode=nextResolvedMode;applyThemeToDocument(this.theme,{prevTheme,prevResolvedMode,nextResolvedMode});if(this.cacheManager){await saveThemeToCache(this.cacheManager,this.config.persistence,this.theme)}this.emit(this.theme,prevTheme)}ensureInitialized(){if(!this.initialized){throw new Error("ThemeManager must be initialized before use.")}}destroy(){this.stopSystemThemeObserver?.();this.stopSystemThemeObserver=null;this.listeners.clear();this.initialized=false}bindSystemThemeObserver(){this.stopSystemThemeObserver?.();this.stopSystemThemeObserver=observeSystemThemeChange(nextResolvedMode=>{if(this.theme.mode!=="system"){return}const prevResolvedMode=this.resolvedMode;if(isResolvedThemeModeEqual(prevResolvedMode,nextResolvedMode)){return}this.resolvedMode=nextResolvedMode;applyThemeToDocument(this.theme,{prevTheme:this.theme,prevResolvedMode,nextResolvedMode});this.emit(this.theme,this.theme)})||null}emit(next,prev){for(const listener of this.listeners){try{listener(cloneTheme(next),cloneTheme(prev))}catch{}}}constructor(){_define_property(this,"theme",cloneTheme(DEFAULT_THEME));_define_property(this,"resolvedMode",resolveThemeMode(DEFAULT_THEME));_define_property(this,"config",DEFAULT_THEME_MANAGER_CONFIG);_define_property(this,"listeners",new Set);_define_property(this,"cacheManager",null);_define_property(this,"stopSystemThemeObserver",null);_define_property(this,"initialized",false)}}
@@ -1 +0,0 @@
1
- "use strict";Object.defineProperty(exports,"__esModule",{value:true});Object.defineProperty(exports,"ThemeManager",{enumerable:true,get:function(){return _ThemeManager.ThemeManager}});const _ThemeManager=require("./ThemeManager");
@@ -1 +0,0 @@
1
- export { ThemeManager } from './ThemeManager';
@@ -1 +0,0 @@
1
- export{ThemeManager}from"./ThemeManager";
@@ -1 +0,0 @@
1
- "use strict";Object.defineProperty(exports,"__esModule",{value:true});Object.defineProperty(exports,"ThemeManager",{enumerable:true,get:function(){return _theme.ThemeManager}});const _theme=require("../custom-manager/theme");
@@ -1 +0,0 @@
1
- export { ThemeManager } from '../custom-manager/theme';
@@ -1 +0,0 @@
1
- export{ThemeManager}from"../custom-manager/theme";