@vlian/framework 1.2.51 → 1.2.55

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 (48) hide show
  1. package/dist/analytics.umd.js +1 -1
  2. package/dist/index.umd.js +222 -65
  3. package/dist/index.umd.js.map +1 -1
  4. package/dist/kernel/kernel.cjs +2 -1
  5. package/dist/kernel/kernel.cjs.map +1 -1
  6. package/dist/kernel/kernel.js +2 -1
  7. package/dist/kernel/kernel.js.map +1 -1
  8. package/dist/kernel/manager/cacheManager.cjs +8 -6
  9. package/dist/kernel/manager/cacheManager.cjs.map +1 -1
  10. package/dist/kernel/manager/cacheManager.d.ts +3 -0
  11. package/dist/kernel/manager/cacheManager.js +8 -6
  12. package/dist/kernel/manager/cacheManager.js.map +1 -1
  13. package/dist/kernel/manager/theme/ThemeManager.cjs +86 -0
  14. package/dist/kernel/manager/theme/ThemeManager.cjs.map +1 -0
  15. package/dist/kernel/manager/theme/ThemeManager.d.ts +16 -0
  16. package/dist/kernel/manager/theme/ThemeManager.js +76 -0
  17. package/dist/kernel/manager/theme/ThemeManager.js.map +1 -0
  18. package/dist/kernel/manager/theme/index.cjs +13 -0
  19. package/dist/kernel/manager/theme/index.cjs.map +1 -0
  20. package/dist/kernel/manager/theme/index.d.ts +1 -0
  21. package/dist/kernel/manager/theme/index.js +3 -0
  22. package/dist/kernel/manager/theme/index.js.map +1 -0
  23. package/dist/kernel/manager/theme/theme.dom.cjs +63 -0
  24. package/dist/kernel/manager/theme/theme.dom.cjs.map +1 -0
  25. package/dist/kernel/manager/theme/theme.dom.d.ts +3 -0
  26. package/dist/kernel/manager/theme/theme.dom.js +45 -0
  27. package/dist/kernel/manager/theme/theme.dom.js.map +1 -0
  28. package/dist/kernel/manager/theme/theme.persistence.cjs +59 -0
  29. package/dist/kernel/manager/theme/theme.persistence.cjs.map +1 -0
  30. package/dist/kernel/manager/theme/theme.persistence.d.ts +5 -0
  31. package/dist/kernel/manager/theme/theme.persistence.js +38 -0
  32. package/dist/kernel/manager/theme/theme.persistence.js.map +1 -0
  33. package/dist/kernel/manager/theme/theme.schema.cjs +124 -0
  34. package/dist/kernel/manager/theme/theme.schema.cjs.map +1 -0
  35. package/dist/kernel/manager/theme/theme.schema.d.ts +7 -0
  36. package/dist/kernel/manager/theme/theme.schema.js +97 -0
  37. package/dist/kernel/manager/theme/theme.schema.js.map +1 -0
  38. package/dist/kernel/manager/themeManager.cjs +2 -95
  39. package/dist/kernel/manager/themeManager.cjs.map +1 -1
  40. package/dist/kernel/manager/themeManager.d.ts +1 -14
  41. package/dist/kernel/manager/themeManager.js +1 -94
  42. package/dist/kernel/manager/themeManager.js.map +1 -1
  43. package/dist/kernel/types.d.ts +2 -0
  44. package/dist/kernel/types.js.map +1 -1
  45. package/dist/state.umd.js +1 -1
  46. package/dist/types.d.ts +2 -0
  47. package/dist/types.js.map +1 -1
  48. package/package.json +1 -1
@@ -223,7 +223,8 @@ let Kernel = class Kernel {
223
223
  }
224
224
  const context = {
225
225
  instanceId: this.instanceId,
226
- config: this.config
226
+ config: this.config,
227
+ cacheManager: this.cacheManager.cache
227
228
  };
228
229
  const initPromise = (async ()=>{
229
230
  await manager.initialize(context);
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/kernel/kernel.tsx"],"sourcesContent":["import type {\n I18nSnapshot,\n KernelConfig,\n KernelInstanceId,\n KernelManager,\n KernelManagerContext,\n KernelTimingMetric,\n StartOptions,\n ThemeSnapshot,\n} from './types';\nimport { DEFAULT_CONFIG, DEFAULT_I18N, DEFAULT_INSTANCE_ID, DEFAULT_THEME } from './constants';\nimport { LoggerManager } from './manager/loggerManager';\nimport { CacheManager } from './manager/cacheManager';\nimport { ThemeManager } from './manager/themeManager';\nimport { I18nManager } from './manager/i18nManager';\n\nfunction now(): number {\n return typeof performance !== 'undefined' ? performance.now() : Date.now();\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null;\n}\n\nexport class Kernel {\n private static readonly instances = new Map<KernelInstanceId, Kernel>();\n\n public static getInstance(instanceId: KernelInstanceId = DEFAULT_INSTANCE_ID): Kernel {\n const existing = Kernel.instances.get(instanceId);\n if (existing) {\n return existing;\n }\n const created = new Kernel(instanceId);\n Kernel.instances.set(instanceId, created);\n return created;\n }\n\n private readonly instanceId: KernelInstanceId;\n private readonly metrics: KernelTimingMetric[] = [];\n private readonly managers = new Map<string, KernelManager>();\n private readonly managerInitPromises = new Map<string, Promise<void>>();\n private readonly initializedManagers = new Set<string>();\n private readonly loggerManager = new LoggerManager();\n private readonly cacheManager = new CacheManager();\n private readonly themeManager = new ThemeManager();\n private readonly i18nManager = new I18nManager();\n private config: KernelConfig = DEFAULT_CONFIG;\n private startupPromise: Promise<Kernel> | null = null;\n private started = false;\n\n private constructor(instanceId: KernelInstanceId) {\n this.instanceId = instanceId;\n this.managers.set('logger', this.loggerManager);\n this.managers.set('cache', this.cacheManager);\n this.managers.set('theme', this.themeManager);\n this.managers.set('i18n', this.i18nManager);\n }\n\n public getId(): string {\n return this.instanceId;\n }\n\n public getConfig(): KernelConfig {\n return this.config;\n }\n\n public getMetrics(): KernelTimingMetric[] {\n return [...this.metrics];\n }\n\n public getLoggerManager(): LoggerManager {\n return this.loggerManager;\n }\n\n public getCacheManager(): CacheManager {\n return this.cacheManager;\n }\n\n public getThemeManager(): ThemeManager {\n return this.themeManager;\n }\n\n public getI18nManager(): I18nManager {\n return this.i18nManager;\n }\n\n public getManager(name: string): KernelManager | undefined {\n return this.managers.get(name);\n }\n\n public registerManager(name: string, manager: KernelManager): void {\n if (this.managers.has(name)) {\n throw new Error(`Kernel manager \"${name}\" 已存在`);\n }\n this.managers.set(name, manager);\n }\n\n public async startup(options: StartOptions = {}): Promise<Kernel> {\n if (this.started) {\n this.logDebug('kernel.startup.skip.already-started', { instanceId: this.instanceId });\n return this;\n }\n\n if (this.startupPromise) {\n return this.startupPromise;\n }\n\n this.startupPromise = this.bootstrap(options).finally(() => {\n this.startupPromise = null;\n });\n return this.startupPromise;\n }\n\n private async bootstrap(options: StartOptions): Promise<Kernel> {\n await this.measurePhase('startup.begin', async () => {\n this.logDebug('kernel.startup.begin', { instanceId: this.instanceId });\n });\n\n await this.measurePhase('config.load', async () => {\n this.config = await this.resolveConfig(options);\n });\n\n await this.measurePhase('manager.register.custom', async () => {\n if (options.customManagers) {\n Object.entries(options.customManagers).forEach(([name, manager]) => {\n if (!this.managers.has(name)) {\n this.managers.set(name, manager);\n }\n });\n }\n });\n\n await this.measurePhase('manager.initialize.default', async () => {\n await this.initializeManager('cache');\n await Promise.all([\n this.initializeManager('logger'),\n this.initializeManager('theme'),\n this.initializeManager('i18n'),\n ]);\n });\n\n await this.measurePhase('manager.initialize.custom', async () => {\n const customManagerNames = [...this.managers.keys()].filter(\n (name) => name !== 'logger' && name !== 'cache' && name !== 'theme' && name !== 'i18n'\n );\n for (const name of customManagerNames) {\n await this.initializeManager(name);\n }\n });\n\n await this.measurePhase('hooks.initialize', async () => {\n await options.hooks?.initialize?.();\n await options.lifecycle?.initialization?.();\n });\n\n await this.measurePhase('render.custom', async () => {\n if (options.render) {\n await options.render({\n instanceId: this.instanceId,\n config: this.config,\n });\n }\n });\n\n this.started = true;\n this.logDebug('kernel.startup.end', { instanceId: this.instanceId, metrics: this.metrics });\n return this;\n }\n\n private async resolveConfig(options: StartOptions): Promise<KernelConfig> {\n let loaded: Partial<KernelConfig> = {};\n if (options.configLoader) {\n const loaderResult = await options.configLoader();\n loaded = loaderResult || {};\n }\n\n const loadedThemeInitial: Partial<ThemeSnapshot> = loaded.theme?.initial || {};\n const loadedI18nInitial: Partial<I18nSnapshot> = loaded.i18n?.initial || {};\n const optionTheme = options.theme || {};\n const optionLocale = options.locale;\n\n return {\n logger: {\n ...DEFAULT_CONFIG.logger,\n ...loaded.logger,\n ...(options.config?.logger || {}),\n level:\n options.loggerLevel ??\n options.config?.logger?.level ??\n loaded.logger?.level,\n },\n cache: {\n ...DEFAULT_CONFIG.cache,\n ...loaded.cache,\n ...(options.config?.cache || {}),\n storageOptions: {\n ...DEFAULT_CONFIG.cache.storageOptions,\n ...(loaded.cache?.storageOptions || {}),\n ...(options.config?.cache?.storageOptions || {}),\n ...(options.storageOptions || {}),\n },\n },\n theme: {\n ...DEFAULT_CONFIG.theme,\n ...loaded.theme,\n ...(options.config?.theme || {}),\n initial: {\n ...DEFAULT_THEME,\n ...loadedThemeInitial,\n ...(options.config?.theme?.initial || {}),\n ...(isRecord(optionTheme) ? optionTheme : {}),\n },\n },\n i18n: {\n ...DEFAULT_CONFIG.i18n,\n ...loaded.i18n,\n ...(options.config?.i18n || {}),\n initial: {\n ...DEFAULT_I18N,\n ...loadedI18nInitial,\n ...(options.config?.i18n?.initial || {}),\n resources: isRecord(optionLocale)\n ? (optionLocale as I18nSnapshot['resources'])\n : loadedI18nInitial.resources,\n },\n },\n };\n }\n\n private async initializeManager(name: string): Promise<void> {\n if (this.initializedManagers.has(name)) {\n return;\n }\n\n const existingPromise = this.managerInitPromises.get(name);\n if (existingPromise) {\n await existingPromise;\n return;\n }\n\n const manager = this.managers.get(name);\n if (!manager) {\n throw new Error(`Kernel manager \"${name}\" 不存在`);\n }\n\n const context: KernelManagerContext = {\n instanceId: this.instanceId,\n config: this.config,\n };\n\n const initPromise = (async () => {\n await manager.initialize(context);\n this.initializedManagers.add(name);\n this.logDebug('kernel.manager.initialized', { name, instanceId: this.instanceId });\n })();\n\n this.managerInitPromises.set(name, initPromise);\n try {\n await initPromise;\n } finally {\n this.managerInitPromises.delete(name);\n }\n }\n\n private async measurePhase(phase: string, task: () => Promise<void>): Promise<void> {\n const startTime = now();\n this.logDebug('kernel.phase.start', { phase, startTime, instanceId: this.instanceId });\n await task();\n const endTime = now();\n const metric: KernelTimingMetric = {\n phase,\n startTime,\n endTime,\n duration: endTime - startTime,\n };\n this.metrics.push(metric);\n this.logDebug('kernel.phase.end', metric);\n }\n\n private logDebug(message: string, payload?: unknown): void {\n this.loggerManager.debug(message, payload);\n }\n}\n\nexport async function startup(\n options: StartOptions = {},\n instanceId: KernelInstanceId = DEFAULT_INSTANCE_ID\n): Promise<Kernel> {\n const kernel = Kernel.getInstance(instanceId);\n return kernel.startup(options);\n}\n\nexport function getKernel(instanceId: KernelInstanceId = DEFAULT_INSTANCE_ID): Kernel {\n return Kernel.getInstance(instanceId);\n}\n\nexport async function kernelStartApp(\n options: StartOptions = {},\n instanceId: KernelInstanceId = DEFAULT_INSTANCE_ID\n): Promise<Kernel> {\n return startup(options, instanceId);\n}\n"],"names":["Kernel","getKernel","kernelStartApp","startup","now","performance","Date","isRecord","value","getInstance","instanceId","DEFAULT_INSTANCE_ID","existing","instances","get","created","set","getId","getConfig","config","getMetrics","metrics","getLoggerManager","loggerManager","getCacheManager","cacheManager","getThemeManager","themeManager","getI18nManager","i18nManager","getManager","name","managers","registerManager","manager","has","Error","options","started","logDebug","startupPromise","bootstrap","finally","measurePhase","resolveConfig","customManagers","Object","entries","forEach","initializeManager","Promise","all","customManagerNames","keys","filter","hooks","initialize","lifecycle","initialization","render","loaded","configLoader","loaderResult","loadedThemeInitial","theme","initial","loadedI18nInitial","i18n","optionTheme","optionLocale","locale","logger","DEFAULT_CONFIG","level","loggerLevel","cache","storageOptions","DEFAULT_THEME","DEFAULT_I18N","resources","initializedManagers","existingPromise","managerInitPromises","context","initPromise","add","delete","phase","task","startTime","endTime","metric","duration","push","message","payload","debug","Map","Set","LoggerManager","CacheManager","ThemeManager","I18nManager","kernel"],"mappings":"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"}
1
+ {"version":3,"sources":["../../src/kernel/kernel.tsx"],"sourcesContent":["import type {\n I18nSnapshot,\n KernelConfig,\n KernelInstanceId,\n KernelManager,\n KernelManagerContext,\n KernelTimingMetric,\n StartOptions,\n ThemeSnapshot,\n} from './types';\nimport { DEFAULT_CONFIG, DEFAULT_I18N, DEFAULT_INSTANCE_ID, DEFAULT_THEME } from './constants';\nimport { LoggerManager } from './manager/loggerManager';\nimport { CacheManager } from './manager/cacheManager';\nimport { ThemeManager } from './manager/themeManager';\nimport { I18nManager } from './manager/i18nManager';\n\nfunction now(): number {\n return typeof performance !== 'undefined' ? performance.now() : Date.now();\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null;\n}\n\nexport class Kernel {\n private static readonly instances = new Map<KernelInstanceId, Kernel>();\n\n public static getInstance(instanceId: KernelInstanceId = DEFAULT_INSTANCE_ID): Kernel {\n const existing = Kernel.instances.get(instanceId);\n if (existing) {\n return existing;\n }\n const created = new Kernel(instanceId);\n Kernel.instances.set(instanceId, created);\n return created;\n }\n\n private readonly instanceId: KernelInstanceId;\n private readonly metrics: KernelTimingMetric[] = [];\n private readonly managers = new Map<string, KernelManager>();\n private readonly managerInitPromises = new Map<string, Promise<void>>();\n private readonly initializedManagers = new Set<string>();\n private readonly loggerManager = new LoggerManager();\n private readonly cacheManager = new CacheManager();\n private readonly themeManager = new ThemeManager();\n private readonly i18nManager = new I18nManager();\n private config: KernelConfig = DEFAULT_CONFIG;\n private startupPromise: Promise<Kernel> | null = null;\n private started = false;\n\n private constructor(instanceId: KernelInstanceId) {\n this.instanceId = instanceId;\n this.managers.set('logger', this.loggerManager);\n this.managers.set('cache', this.cacheManager);\n this.managers.set('theme', this.themeManager);\n this.managers.set('i18n', this.i18nManager);\n }\n\n public getId(): string {\n return this.instanceId;\n }\n\n public getConfig(): KernelConfig {\n return this.config;\n }\n\n public getMetrics(): KernelTimingMetric[] {\n return [...this.metrics];\n }\n\n public getLoggerManager(): LoggerManager {\n return this.loggerManager;\n }\n\n public getCacheManager(): CacheManager {\n return this.cacheManager;\n }\n\n public getThemeManager(): ThemeManager {\n return this.themeManager;\n }\n\n public getI18nManager(): I18nManager {\n return this.i18nManager;\n }\n\n public getManager(name: string): KernelManager | undefined {\n return this.managers.get(name);\n }\n\n public registerManager(name: string, manager: KernelManager): void {\n if (this.managers.has(name)) {\n throw new Error(`Kernel manager \"${name}\" 已存在`);\n }\n this.managers.set(name, manager);\n }\n\n public async startup(options: StartOptions = {}): Promise<Kernel> {\n if (this.started) {\n this.logDebug('kernel.startup.skip.already-started', { instanceId: this.instanceId });\n return this;\n }\n\n if (this.startupPromise) {\n return this.startupPromise;\n }\n\n this.startupPromise = this.bootstrap(options).finally(() => {\n this.startupPromise = null;\n });\n return this.startupPromise;\n }\n\n private async bootstrap(options: StartOptions): Promise<Kernel> {\n await this.measurePhase('startup.begin', async () => {\n this.logDebug('kernel.startup.begin', { instanceId: this.instanceId });\n });\n\n await this.measurePhase('config.load', async () => {\n this.config = await this.resolveConfig(options);\n });\n\n await this.measurePhase('manager.register.custom', async () => {\n if (options.customManagers) {\n Object.entries(options.customManagers).forEach(([name, manager]) => {\n if (!this.managers.has(name)) {\n this.managers.set(name, manager);\n }\n });\n }\n });\n\n await this.measurePhase('manager.initialize.default', async () => {\n await this.initializeManager('cache');\n await Promise.all([\n this.initializeManager('logger'),\n this.initializeManager('theme'),\n this.initializeManager('i18n'),\n ]);\n });\n\n await this.measurePhase('manager.initialize.custom', async () => {\n const customManagerNames = [...this.managers.keys()].filter(\n (name) => name !== 'logger' && name !== 'cache' && name !== 'theme' && name !== 'i18n'\n );\n for (const name of customManagerNames) {\n await this.initializeManager(name);\n }\n });\n\n await this.measurePhase('hooks.initialize', async () => {\n await options.hooks?.initialize?.();\n await options.lifecycle?.initialization?.();\n });\n\n await this.measurePhase('render.custom', async () => {\n if (options.render) {\n await options.render({\n instanceId: this.instanceId,\n config: this.config,\n });\n }\n });\n\n this.started = true;\n this.logDebug('kernel.startup.end', { instanceId: this.instanceId, metrics: this.metrics });\n return this;\n }\n\n private async resolveConfig(options: StartOptions): Promise<KernelConfig> {\n let loaded: Partial<KernelConfig> = {};\n if (options.configLoader) {\n const loaderResult = await options.configLoader();\n loaded = loaderResult || {};\n }\n\n const loadedThemeInitial: Partial<ThemeSnapshot> = loaded.theme?.initial || {};\n const loadedI18nInitial: Partial<I18nSnapshot> = loaded.i18n?.initial || {};\n const optionTheme = options.theme || {};\n const optionLocale = options.locale;\n\n return {\n logger: {\n ...DEFAULT_CONFIG.logger,\n ...loaded.logger,\n ...(options.config?.logger || {}),\n level:\n options.loggerLevel ??\n options.config?.logger?.level ??\n loaded.logger?.level,\n },\n cache: {\n ...DEFAULT_CONFIG.cache,\n ...loaded.cache,\n ...(options.config?.cache || {}),\n storageOptions: {\n ...DEFAULT_CONFIG.cache.storageOptions,\n ...(loaded.cache?.storageOptions || {}),\n ...(options.config?.cache?.storageOptions || {}),\n ...(options.storageOptions || {}),\n },\n },\n theme: {\n ...DEFAULT_CONFIG.theme,\n ...loaded.theme,\n ...(options.config?.theme || {}),\n initial: {\n ...DEFAULT_THEME,\n ...loadedThemeInitial,\n ...(options.config?.theme?.initial || {}),\n ...(isRecord(optionTheme) ? optionTheme : {}),\n },\n },\n i18n: {\n ...DEFAULT_CONFIG.i18n,\n ...loaded.i18n,\n ...(options.config?.i18n || {}),\n initial: {\n ...DEFAULT_I18N,\n ...loadedI18nInitial,\n ...(options.config?.i18n?.initial || {}),\n resources: isRecord(optionLocale)\n ? (optionLocale as I18nSnapshot['resources'])\n : loadedI18nInitial.resources,\n },\n },\n };\n }\n\n private async initializeManager(name: string): Promise<void> {\n if (this.initializedManagers.has(name)) {\n return;\n }\n\n const existingPromise = this.managerInitPromises.get(name);\n if (existingPromise) {\n await existingPromise;\n return;\n }\n\n const manager = this.managers.get(name);\n if (!manager) {\n throw new Error(`Kernel manager \"${name}\" 不存在`);\n }\n\n const context: KernelManagerContext = {\n instanceId: this.instanceId,\n config: this.config,\n cacheManager: this.cacheManager.cache!,\n };\n\n const initPromise = (async () => {\n await manager.initialize(context);\n this.initializedManagers.add(name);\n this.logDebug('kernel.manager.initialized', { name, instanceId: this.instanceId });\n })();\n\n this.managerInitPromises.set(name, initPromise);\n try {\n await initPromise;\n } finally {\n this.managerInitPromises.delete(name);\n }\n }\n\n private async measurePhase(phase: string, task: () => Promise<void>): Promise<void> {\n const startTime = now();\n this.logDebug('kernel.phase.start', { phase, startTime, instanceId: this.instanceId });\n await task();\n const endTime = now();\n const metric: KernelTimingMetric = {\n phase,\n startTime,\n endTime,\n duration: endTime - startTime,\n };\n this.metrics.push(metric);\n this.logDebug('kernel.phase.end', metric);\n }\n\n private logDebug(message: string, payload?: unknown): void {\n this.loggerManager.debug(message, payload);\n }\n}\n\nexport async function startup(\n options: StartOptions = {},\n instanceId: KernelInstanceId = DEFAULT_INSTANCE_ID\n): Promise<Kernel> {\n const kernel = Kernel.getInstance(instanceId);\n return kernel.startup(options);\n}\n\nexport function getKernel(instanceId: KernelInstanceId = DEFAULT_INSTANCE_ID): Kernel {\n return Kernel.getInstance(instanceId);\n}\n\nexport async function kernelStartApp(\n options: StartOptions = {},\n instanceId: KernelInstanceId = DEFAULT_INSTANCE_ID\n): Promise<Kernel> {\n return startup(options, instanceId);\n}\n"],"names":["Kernel","getKernel","kernelStartApp","startup","now","performance","Date","isRecord","value","getInstance","instanceId","DEFAULT_INSTANCE_ID","existing","instances","get","created","set","getId","getConfig","config","getMetrics","metrics","getLoggerManager","loggerManager","getCacheManager","cacheManager","getThemeManager","themeManager","getI18nManager","i18nManager","getManager","name","managers","registerManager","manager","has","Error","options","started","logDebug","startupPromise","bootstrap","finally","measurePhase","resolveConfig","customManagers","Object","entries","forEach","initializeManager","Promise","all","customManagerNames","keys","filter","hooks","initialize","lifecycle","initialization","render","loaded","configLoader","loaderResult","loadedThemeInitial","theme","initial","loadedI18nInitial","i18n","optionTheme","optionLocale","locale","logger","DEFAULT_CONFIG","level","loggerLevel","cache","storageOptions","DEFAULT_THEME","DEFAULT_I18N","resources","initializedManagers","existingPromise","managerInitPromises","context","initPromise","add","delete","phase","task","startTime","endTime","metric","duration","push","message","payload","debug","Map","Set","LoggerManager","CacheManager","ThemeManager","I18nManager","kernel"],"mappings":"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"}
@@ -199,7 +199,8 @@ export class Kernel {
199
199
  }
200
200
  const context = {
201
201
  instanceId: this.instanceId,
202
- config: this.config
202
+ config: this.config,
203
+ cacheManager: this.cacheManager.cache
203
204
  };
204
205
  const initPromise = (async ()=>{
205
206
  await manager.initialize(context);
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/kernel/kernel.tsx"],"sourcesContent":["import type {\n I18nSnapshot,\n KernelConfig,\n KernelInstanceId,\n KernelManager,\n KernelManagerContext,\n KernelTimingMetric,\n StartOptions,\n ThemeSnapshot,\n} from './types';\nimport { DEFAULT_CONFIG, DEFAULT_I18N, DEFAULT_INSTANCE_ID, DEFAULT_THEME } from './constants';\nimport { LoggerManager } from './manager/loggerManager';\nimport { CacheManager } from './manager/cacheManager';\nimport { ThemeManager } from './manager/themeManager';\nimport { I18nManager } from './manager/i18nManager';\n\nfunction now(): number {\n return typeof performance !== 'undefined' ? performance.now() : Date.now();\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null;\n}\n\nexport class Kernel {\n private static readonly instances = new Map<KernelInstanceId, Kernel>();\n\n public static getInstance(instanceId: KernelInstanceId = DEFAULT_INSTANCE_ID): Kernel {\n const existing = Kernel.instances.get(instanceId);\n if (existing) {\n return existing;\n }\n const created = new Kernel(instanceId);\n Kernel.instances.set(instanceId, created);\n return created;\n }\n\n private readonly instanceId: KernelInstanceId;\n private readonly metrics: KernelTimingMetric[] = [];\n private readonly managers = new Map<string, KernelManager>();\n private readonly managerInitPromises = new Map<string, Promise<void>>();\n private readonly initializedManagers = new Set<string>();\n private readonly loggerManager = new LoggerManager();\n private readonly cacheManager = new CacheManager();\n private readonly themeManager = new ThemeManager();\n private readonly i18nManager = new I18nManager();\n private config: KernelConfig = DEFAULT_CONFIG;\n private startupPromise: Promise<Kernel> | null = null;\n private started = false;\n\n private constructor(instanceId: KernelInstanceId) {\n this.instanceId = instanceId;\n this.managers.set('logger', this.loggerManager);\n this.managers.set('cache', this.cacheManager);\n this.managers.set('theme', this.themeManager);\n this.managers.set('i18n', this.i18nManager);\n }\n\n public getId(): string {\n return this.instanceId;\n }\n\n public getConfig(): KernelConfig {\n return this.config;\n }\n\n public getMetrics(): KernelTimingMetric[] {\n return [...this.metrics];\n }\n\n public getLoggerManager(): LoggerManager {\n return this.loggerManager;\n }\n\n public getCacheManager(): CacheManager {\n return this.cacheManager;\n }\n\n public getThemeManager(): ThemeManager {\n return this.themeManager;\n }\n\n public getI18nManager(): I18nManager {\n return this.i18nManager;\n }\n\n public getManager(name: string): KernelManager | undefined {\n return this.managers.get(name);\n }\n\n public registerManager(name: string, manager: KernelManager): void {\n if (this.managers.has(name)) {\n throw new Error(`Kernel manager \"${name}\" 已存在`);\n }\n this.managers.set(name, manager);\n }\n\n public async startup(options: StartOptions = {}): Promise<Kernel> {\n if (this.started) {\n this.logDebug('kernel.startup.skip.already-started', { instanceId: this.instanceId });\n return this;\n }\n\n if (this.startupPromise) {\n return this.startupPromise;\n }\n\n this.startupPromise = this.bootstrap(options).finally(() => {\n this.startupPromise = null;\n });\n return this.startupPromise;\n }\n\n private async bootstrap(options: StartOptions): Promise<Kernel> {\n await this.measurePhase('startup.begin', async () => {\n this.logDebug('kernel.startup.begin', { instanceId: this.instanceId });\n });\n\n await this.measurePhase('config.load', async () => {\n this.config = await this.resolveConfig(options);\n });\n\n await this.measurePhase('manager.register.custom', async () => {\n if (options.customManagers) {\n Object.entries(options.customManagers).forEach(([name, manager]) => {\n if (!this.managers.has(name)) {\n this.managers.set(name, manager);\n }\n });\n }\n });\n\n await this.measurePhase('manager.initialize.default', async () => {\n await this.initializeManager('cache');\n await Promise.all([\n this.initializeManager('logger'),\n this.initializeManager('theme'),\n this.initializeManager('i18n'),\n ]);\n });\n\n await this.measurePhase('manager.initialize.custom', async () => {\n const customManagerNames = [...this.managers.keys()].filter(\n (name) => name !== 'logger' && name !== 'cache' && name !== 'theme' && name !== 'i18n'\n );\n for (const name of customManagerNames) {\n await this.initializeManager(name);\n }\n });\n\n await this.measurePhase('hooks.initialize', async () => {\n await options.hooks?.initialize?.();\n await options.lifecycle?.initialization?.();\n });\n\n await this.measurePhase('render.custom', async () => {\n if (options.render) {\n await options.render({\n instanceId: this.instanceId,\n config: this.config,\n });\n }\n });\n\n this.started = true;\n this.logDebug('kernel.startup.end', { instanceId: this.instanceId, metrics: this.metrics });\n return this;\n }\n\n private async resolveConfig(options: StartOptions): Promise<KernelConfig> {\n let loaded: Partial<KernelConfig> = {};\n if (options.configLoader) {\n const loaderResult = await options.configLoader();\n loaded = loaderResult || {};\n }\n\n const loadedThemeInitial: Partial<ThemeSnapshot> = loaded.theme?.initial || {};\n const loadedI18nInitial: Partial<I18nSnapshot> = loaded.i18n?.initial || {};\n const optionTheme = options.theme || {};\n const optionLocale = options.locale;\n\n return {\n logger: {\n ...DEFAULT_CONFIG.logger,\n ...loaded.logger,\n ...(options.config?.logger || {}),\n level:\n options.loggerLevel ??\n options.config?.logger?.level ??\n loaded.logger?.level,\n },\n cache: {\n ...DEFAULT_CONFIG.cache,\n ...loaded.cache,\n ...(options.config?.cache || {}),\n storageOptions: {\n ...DEFAULT_CONFIG.cache.storageOptions,\n ...(loaded.cache?.storageOptions || {}),\n ...(options.config?.cache?.storageOptions || {}),\n ...(options.storageOptions || {}),\n },\n },\n theme: {\n ...DEFAULT_CONFIG.theme,\n ...loaded.theme,\n ...(options.config?.theme || {}),\n initial: {\n ...DEFAULT_THEME,\n ...loadedThemeInitial,\n ...(options.config?.theme?.initial || {}),\n ...(isRecord(optionTheme) ? optionTheme : {}),\n },\n },\n i18n: {\n ...DEFAULT_CONFIG.i18n,\n ...loaded.i18n,\n ...(options.config?.i18n || {}),\n initial: {\n ...DEFAULT_I18N,\n ...loadedI18nInitial,\n ...(options.config?.i18n?.initial || {}),\n resources: isRecord(optionLocale)\n ? (optionLocale as I18nSnapshot['resources'])\n : loadedI18nInitial.resources,\n },\n },\n };\n }\n\n private async initializeManager(name: string): Promise<void> {\n if (this.initializedManagers.has(name)) {\n return;\n }\n\n const existingPromise = this.managerInitPromises.get(name);\n if (existingPromise) {\n await existingPromise;\n return;\n }\n\n const manager = this.managers.get(name);\n if (!manager) {\n throw new Error(`Kernel manager \"${name}\" 不存在`);\n }\n\n const context: KernelManagerContext = {\n instanceId: this.instanceId,\n config: this.config,\n };\n\n const initPromise = (async () => {\n await manager.initialize(context);\n this.initializedManagers.add(name);\n this.logDebug('kernel.manager.initialized', { name, instanceId: this.instanceId });\n })();\n\n this.managerInitPromises.set(name, initPromise);\n try {\n await initPromise;\n } finally {\n this.managerInitPromises.delete(name);\n }\n }\n\n private async measurePhase(phase: string, task: () => Promise<void>): Promise<void> {\n const startTime = now();\n this.logDebug('kernel.phase.start', { phase, startTime, instanceId: this.instanceId });\n await task();\n const endTime = now();\n const metric: KernelTimingMetric = {\n phase,\n startTime,\n endTime,\n duration: endTime - startTime,\n };\n this.metrics.push(metric);\n this.logDebug('kernel.phase.end', metric);\n }\n\n private logDebug(message: string, payload?: unknown): void {\n this.loggerManager.debug(message, payload);\n }\n}\n\nexport async function startup(\n options: StartOptions = {},\n instanceId: KernelInstanceId = DEFAULT_INSTANCE_ID\n): Promise<Kernel> {\n const kernel = Kernel.getInstance(instanceId);\n return kernel.startup(options);\n}\n\nexport function getKernel(instanceId: KernelInstanceId = DEFAULT_INSTANCE_ID): Kernel {\n return Kernel.getInstance(instanceId);\n}\n\nexport async function kernelStartApp(\n options: StartOptions = {},\n instanceId: KernelInstanceId = DEFAULT_INSTANCE_ID\n): Promise<Kernel> {\n return startup(options, instanceId);\n}\n"],"names":["DEFAULT_CONFIG","DEFAULT_I18N","DEFAULT_INSTANCE_ID","DEFAULT_THEME","LoggerManager","CacheManager","ThemeManager","I18nManager","now","performance","Date","isRecord","value","Kernel","getInstance","instanceId","existing","instances","get","created","set","getId","getConfig","config","getMetrics","metrics","getLoggerManager","loggerManager","getCacheManager","cacheManager","getThemeManager","themeManager","getI18nManager","i18nManager","getManager","name","managers","registerManager","manager","has","Error","startup","options","started","logDebug","startupPromise","bootstrap","finally","measurePhase","resolveConfig","customManagers","Object","entries","forEach","initializeManager","Promise","all","customManagerNames","keys","filter","hooks","initialize","lifecycle","initialization","render","loaded","configLoader","loaderResult","loadedThemeInitial","theme","initial","loadedI18nInitial","i18n","optionTheme","optionLocale","locale","logger","level","loggerLevel","cache","storageOptions","resources","initializedManagers","existingPromise","managerInitPromises","context","initPromise","add","delete","phase","task","startTime","endTime","metric","duration","push","message","payload","debug","Map","Set","kernel","getKernel","kernelStartApp"],"mappings":"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"}
1
+ {"version":3,"sources":["../../src/kernel/kernel.tsx"],"sourcesContent":["import type {\n I18nSnapshot,\n KernelConfig,\n KernelInstanceId,\n KernelManager,\n KernelManagerContext,\n KernelTimingMetric,\n StartOptions,\n ThemeSnapshot,\n} from './types';\nimport { DEFAULT_CONFIG, DEFAULT_I18N, DEFAULT_INSTANCE_ID, DEFAULT_THEME } from './constants';\nimport { LoggerManager } from './manager/loggerManager';\nimport { CacheManager } from './manager/cacheManager';\nimport { ThemeManager } from './manager/themeManager';\nimport { I18nManager } from './manager/i18nManager';\n\nfunction now(): number {\n return typeof performance !== 'undefined' ? performance.now() : Date.now();\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null;\n}\n\nexport class Kernel {\n private static readonly instances = new Map<KernelInstanceId, Kernel>();\n\n public static getInstance(instanceId: KernelInstanceId = DEFAULT_INSTANCE_ID): Kernel {\n const existing = Kernel.instances.get(instanceId);\n if (existing) {\n return existing;\n }\n const created = new Kernel(instanceId);\n Kernel.instances.set(instanceId, created);\n return created;\n }\n\n private readonly instanceId: KernelInstanceId;\n private readonly metrics: KernelTimingMetric[] = [];\n private readonly managers = new Map<string, KernelManager>();\n private readonly managerInitPromises = new Map<string, Promise<void>>();\n private readonly initializedManagers = new Set<string>();\n private readonly loggerManager = new LoggerManager();\n private readonly cacheManager = new CacheManager();\n private readonly themeManager = new ThemeManager();\n private readonly i18nManager = new I18nManager();\n private config: KernelConfig = DEFAULT_CONFIG;\n private startupPromise: Promise<Kernel> | null = null;\n private started = false;\n\n private constructor(instanceId: KernelInstanceId) {\n this.instanceId = instanceId;\n this.managers.set('logger', this.loggerManager);\n this.managers.set('cache', this.cacheManager);\n this.managers.set('theme', this.themeManager);\n this.managers.set('i18n', this.i18nManager);\n }\n\n public getId(): string {\n return this.instanceId;\n }\n\n public getConfig(): KernelConfig {\n return this.config;\n }\n\n public getMetrics(): KernelTimingMetric[] {\n return [...this.metrics];\n }\n\n public getLoggerManager(): LoggerManager {\n return this.loggerManager;\n }\n\n public getCacheManager(): CacheManager {\n return this.cacheManager;\n }\n\n public getThemeManager(): ThemeManager {\n return this.themeManager;\n }\n\n public getI18nManager(): I18nManager {\n return this.i18nManager;\n }\n\n public getManager(name: string): KernelManager | undefined {\n return this.managers.get(name);\n }\n\n public registerManager(name: string, manager: KernelManager): void {\n if (this.managers.has(name)) {\n throw new Error(`Kernel manager \"${name}\" 已存在`);\n }\n this.managers.set(name, manager);\n }\n\n public async startup(options: StartOptions = {}): Promise<Kernel> {\n if (this.started) {\n this.logDebug('kernel.startup.skip.already-started', { instanceId: this.instanceId });\n return this;\n }\n\n if (this.startupPromise) {\n return this.startupPromise;\n }\n\n this.startupPromise = this.bootstrap(options).finally(() => {\n this.startupPromise = null;\n });\n return this.startupPromise;\n }\n\n private async bootstrap(options: StartOptions): Promise<Kernel> {\n await this.measurePhase('startup.begin', async () => {\n this.logDebug('kernel.startup.begin', { instanceId: this.instanceId });\n });\n\n await this.measurePhase('config.load', async () => {\n this.config = await this.resolveConfig(options);\n });\n\n await this.measurePhase('manager.register.custom', async () => {\n if (options.customManagers) {\n Object.entries(options.customManagers).forEach(([name, manager]) => {\n if (!this.managers.has(name)) {\n this.managers.set(name, manager);\n }\n });\n }\n });\n\n await this.measurePhase('manager.initialize.default', async () => {\n await this.initializeManager('cache');\n await Promise.all([\n this.initializeManager('logger'),\n this.initializeManager('theme'),\n this.initializeManager('i18n'),\n ]);\n });\n\n await this.measurePhase('manager.initialize.custom', async () => {\n const customManagerNames = [...this.managers.keys()].filter(\n (name) => name !== 'logger' && name !== 'cache' && name !== 'theme' && name !== 'i18n'\n );\n for (const name of customManagerNames) {\n await this.initializeManager(name);\n }\n });\n\n await this.measurePhase('hooks.initialize', async () => {\n await options.hooks?.initialize?.();\n await options.lifecycle?.initialization?.();\n });\n\n await this.measurePhase('render.custom', async () => {\n if (options.render) {\n await options.render({\n instanceId: this.instanceId,\n config: this.config,\n });\n }\n });\n\n this.started = true;\n this.logDebug('kernel.startup.end', { instanceId: this.instanceId, metrics: this.metrics });\n return this;\n }\n\n private async resolveConfig(options: StartOptions): Promise<KernelConfig> {\n let loaded: Partial<KernelConfig> = {};\n if (options.configLoader) {\n const loaderResult = await options.configLoader();\n loaded = loaderResult || {};\n }\n\n const loadedThemeInitial: Partial<ThemeSnapshot> = loaded.theme?.initial || {};\n const loadedI18nInitial: Partial<I18nSnapshot> = loaded.i18n?.initial || {};\n const optionTheme = options.theme || {};\n const optionLocale = options.locale;\n\n return {\n logger: {\n ...DEFAULT_CONFIG.logger,\n ...loaded.logger,\n ...(options.config?.logger || {}),\n level:\n options.loggerLevel ??\n options.config?.logger?.level ??\n loaded.logger?.level,\n },\n cache: {\n ...DEFAULT_CONFIG.cache,\n ...loaded.cache,\n ...(options.config?.cache || {}),\n storageOptions: {\n ...DEFAULT_CONFIG.cache.storageOptions,\n ...(loaded.cache?.storageOptions || {}),\n ...(options.config?.cache?.storageOptions || {}),\n ...(options.storageOptions || {}),\n },\n },\n theme: {\n ...DEFAULT_CONFIG.theme,\n ...loaded.theme,\n ...(options.config?.theme || {}),\n initial: {\n ...DEFAULT_THEME,\n ...loadedThemeInitial,\n ...(options.config?.theme?.initial || {}),\n ...(isRecord(optionTheme) ? optionTheme : {}),\n },\n },\n i18n: {\n ...DEFAULT_CONFIG.i18n,\n ...loaded.i18n,\n ...(options.config?.i18n || {}),\n initial: {\n ...DEFAULT_I18N,\n ...loadedI18nInitial,\n ...(options.config?.i18n?.initial || {}),\n resources: isRecord(optionLocale)\n ? (optionLocale as I18nSnapshot['resources'])\n : loadedI18nInitial.resources,\n },\n },\n };\n }\n\n private async initializeManager(name: string): Promise<void> {\n if (this.initializedManagers.has(name)) {\n return;\n }\n\n const existingPromise = this.managerInitPromises.get(name);\n if (existingPromise) {\n await existingPromise;\n return;\n }\n\n const manager = this.managers.get(name);\n if (!manager) {\n throw new Error(`Kernel manager \"${name}\" 不存在`);\n }\n\n const context: KernelManagerContext = {\n instanceId: this.instanceId,\n config: this.config,\n cacheManager: this.cacheManager.cache!,\n };\n\n const initPromise = (async () => {\n await manager.initialize(context);\n this.initializedManagers.add(name);\n this.logDebug('kernel.manager.initialized', { name, instanceId: this.instanceId });\n })();\n\n this.managerInitPromises.set(name, initPromise);\n try {\n await initPromise;\n } finally {\n this.managerInitPromises.delete(name);\n }\n }\n\n private async measurePhase(phase: string, task: () => Promise<void>): Promise<void> {\n const startTime = now();\n this.logDebug('kernel.phase.start', { phase, startTime, instanceId: this.instanceId });\n await task();\n const endTime = now();\n const metric: KernelTimingMetric = {\n phase,\n startTime,\n endTime,\n duration: endTime - startTime,\n };\n this.metrics.push(metric);\n this.logDebug('kernel.phase.end', metric);\n }\n\n private logDebug(message: string, payload?: unknown): void {\n this.loggerManager.debug(message, payload);\n }\n}\n\nexport async function startup(\n options: StartOptions = {},\n instanceId: KernelInstanceId = DEFAULT_INSTANCE_ID\n): Promise<Kernel> {\n const kernel = Kernel.getInstance(instanceId);\n return kernel.startup(options);\n}\n\nexport function getKernel(instanceId: KernelInstanceId = DEFAULT_INSTANCE_ID): Kernel {\n return Kernel.getInstance(instanceId);\n}\n\nexport async function kernelStartApp(\n options: StartOptions = {},\n instanceId: KernelInstanceId = DEFAULT_INSTANCE_ID\n): Promise<Kernel> {\n return startup(options, instanceId);\n}\n"],"names":["DEFAULT_CONFIG","DEFAULT_I18N","DEFAULT_INSTANCE_ID","DEFAULT_THEME","LoggerManager","CacheManager","ThemeManager","I18nManager","now","performance","Date","isRecord","value","Kernel","getInstance","instanceId","existing","instances","get","created","set","getId","getConfig","config","getMetrics","metrics","getLoggerManager","loggerManager","getCacheManager","cacheManager","getThemeManager","themeManager","getI18nManager","i18nManager","getManager","name","managers","registerManager","manager","has","Error","startup","options","started","logDebug","startupPromise","bootstrap","finally","measurePhase","resolveConfig","customManagers","Object","entries","forEach","initializeManager","Promise","all","customManagerNames","keys","filter","hooks","initialize","lifecycle","initialization","render","loaded","configLoader","loaderResult","loadedThemeInitial","theme","initial","loadedI18nInitial","i18n","optionTheme","optionLocale","locale","logger","level","loggerLevel","cache","storageOptions","resources","initializedManagers","existingPromise","managerInitPromises","context","initPromise","add","delete","phase","task","startTime","endTime","metric","duration","push","message","payload","debug","Map","Set","kernel","getKernel","kernelStartApp"],"mappings":"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"}
@@ -8,8 +8,8 @@ Object.defineProperty(exports, "CacheManager", {
8
8
  return CacheManager;
9
9
  }
10
10
  });
11
- const _library = require("../../library");
12
11
  const _constants = require("../constants");
12
+ const _utils = require("@vlian/utils");
13
13
  function _define_property(obj, key, value) {
14
14
  if (key in obj) {
15
15
  Object.defineProperty(obj, key, {
@@ -26,20 +26,22 @@ function _define_property(obj, key, value) {
26
26
  let CacheManager = class CacheManager {
27
27
  initialize(context) {
28
28
  this.snapshot = context.config.cache;
29
- _library.storage.initialize({
29
+ this.cacheIn = (0, _utils.createStorage)({
30
+ type: this.snapshot.storageOptions?.type || 'local',
30
31
  prefix: this.snapshot.storageOptions?.prefix || 'vlian',
31
32
  defaultExpire: this.snapshot.storageOptions?.defaultExpire || 24 * 60 * 60 * 1000,
32
- tableName: this.snapshot.storageOptions?.tableName,
33
- cache: {
34
- enabled: this.snapshot.enabled
35
- }
33
+ dbName: this.snapshot.storageOptions?.tableName
36
34
  });
37
35
  }
36
+ get cache() {
37
+ return this.cacheIn;
38
+ }
38
39
  getSnapshot() {
39
40
  return this.snapshot;
40
41
  }
41
42
  constructor(){
42
43
  _define_property(this, "snapshot", _constants.DEFAULT_CONFIG.cache);
44
+ _define_property(this, "cacheIn", void 0);
43
45
  }
44
46
  };
45
47
 
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/kernel/manager/cacheManager.ts"],"sourcesContent":["import { storage } from '../../library';\nimport type { KernelConfig, KernelManager, KernelManagerContext } from '../types';\nimport { DEFAULT_CONFIG } from '../constants';\n\nexport class CacheManager implements KernelManager<KernelConfig['cache']> {\n private snapshot: KernelConfig['cache'] = DEFAULT_CONFIG.cache;\n\n public initialize(context: KernelManagerContext): void {\n this.snapshot = context.config.cache;\n\n storage.initialize({\n prefix: this.snapshot.storageOptions?.prefix || 'vlian',\n defaultExpire: this.snapshot.storageOptions?.defaultExpire || 24 * 60 * 60 * 1000,\n tableName: this.snapshot.storageOptions?.tableName,\n cache: {\n enabled: this.snapshot.enabled,\n },\n });\n }\n\n public getSnapshot(): KernelConfig['cache'] {\n return this.snapshot;\n }\n}\n"],"names":["CacheManager","initialize","context","snapshot","config","cache","storage","prefix","storageOptions","defaultExpire","tableName","enabled","getSnapshot","DEFAULT_CONFIG"],"mappings":";;;;+BAIaA;;;eAAAA;;;yBAJW;2BAEO;;;;;;;;;;;;;;AAExB,IAAA,AAAMA,eAAN,MAAMA;IAGJC,WAAWC,OAA6B,EAAQ;QACrD,IAAI,CAACC,QAAQ,GAAGD,QAAQE,MAAM,CAACC,KAAK;QAEpCC,gBAAO,CAACL,UAAU,CAAC;YACjBM,QAAQ,IAAI,CAACJ,QAAQ,CAACK,cAAc,EAAED,UAAU;YAChDE,eAAe,IAAI,CAACN,QAAQ,CAACK,cAAc,EAAEC,iBAAiB,KAAK,KAAK,KAAK;YAC7EC,WAAW,IAAI,CAACP,QAAQ,CAACK,cAAc,EAAEE;YACzCL,OAAO;gBACLM,SAAS,IAAI,CAACR,QAAQ,CAACQ,OAAO;YAChC;QACF;IACF;IAEOC,cAAqC;QAC1C,OAAO,IAAI,CAACT,QAAQ;IACtB;;QAjBA,uBAAQA,YAAkCU,yBAAc,CAACR,KAAK;;AAkBhE"}
1
+ {"version":3,"sources":["../../../src/kernel/manager/cacheManager.ts"],"sourcesContent":["import type {KernelConfig, KernelManager, KernelManagerContext} from '../types';\nimport {DEFAULT_CONFIG} from '../constants';\nimport type {StorageInstance} from \"@vlian/utils\";\nimport {createStorage} from \"@vlian/utils\";\n\nexport class CacheManager implements KernelManager<KernelConfig['cache']> {\n private snapshot: KernelConfig['cache'] = DEFAULT_CONFIG.cache;\n private cacheIn: StorageInstance | undefined;\n\n public initialize(context: KernelManagerContext): void {\n this.snapshot = context.config.cache;\n\n this.cacheIn = createStorage({\n type: this.snapshot.storageOptions?.type || 'local',\n prefix: this.snapshot.storageOptions?.prefix || 'vlian',\n defaultExpire: this.snapshot.storageOptions?.defaultExpire || 24 * 60 * 60 * 1000,\n dbName: this.snapshot.storageOptions?.tableName,\n });\n }\n\n get cache() {\n return this.cacheIn;\n }\n\n public getSnapshot(): KernelConfig['cache'] {\n return this.snapshot;\n }\n}\n"],"names":["CacheManager","initialize","context","snapshot","config","cache","cacheIn","createStorage","type","storageOptions","prefix","defaultExpire","dbName","tableName","getSnapshot","DEFAULT_CONFIG"],"mappings":";;;;+BAKaA;;;eAAAA;;;2BAJgB;uBAED;;;;;;;;;;;;;;AAErB,IAAA,AAAMA,eAAN,MAAMA;IAIFC,WAAWC,OAA6B,EAAQ;QACnD,IAAI,CAACC,QAAQ,GAAGD,QAAQE,MAAM,CAACC,KAAK;QAEpC,IAAI,CAACC,OAAO,GAAGC,IAAAA,oBAAa,EAAC;YACzBC,MAAM,IAAI,CAACL,QAAQ,CAACM,cAAc,EAAED,QAAQ;YAC5CE,QAAQ,IAAI,CAACP,QAAQ,CAACM,cAAc,EAAEC,UAAU;YAChDC,eAAe,IAAI,CAACR,QAAQ,CAACM,cAAc,EAAEE,iBAAiB,KAAK,KAAK,KAAK;YAC7EC,QAAQ,IAAI,CAACT,QAAQ,CAACM,cAAc,EAAEI;QAC1C;IACJ;IAEA,IAAIR,QAAQ;QACR,OAAO,IAAI,CAACC,OAAO;IACvB;IAEOQ,cAAqC;QACxC,OAAO,IAAI,CAACX,QAAQ;IACxB;;QApBA,uBAAQA,YAAkCY,yBAAc,CAACV,KAAK;QAC9D,uBAAQC,WAAR,KAAA;;AAoBJ"}
@@ -1,6 +1,9 @@
1
1
  import type { KernelConfig, KernelManager, KernelManagerContext } from '../types';
2
+ import type { StorageInstance } from "@vlian/utils";
2
3
  export declare class CacheManager implements KernelManager<KernelConfig['cache']> {
3
4
  private snapshot;
5
+ private cacheIn;
4
6
  initialize(context: KernelManagerContext): void;
7
+ get cache(): StorageInstance | undefined;
5
8
  getSnapshot(): KernelConfig['cache'];
6
9
  }
@@ -11,25 +11,27 @@ function _define_property(obj, key, value) {
11
11
  }
12
12
  return obj;
13
13
  }
14
- import { storage } from "../../library";
15
14
  import { DEFAULT_CONFIG } from "../constants";
15
+ import { createStorage } from "@vlian/utils";
16
16
  export class CacheManager {
17
17
  initialize(context) {
18
18
  this.snapshot = context.config.cache;
19
- storage.initialize({
19
+ this.cacheIn = createStorage({
20
+ type: this.snapshot.storageOptions?.type || 'local',
20
21
  prefix: this.snapshot.storageOptions?.prefix || 'vlian',
21
22
  defaultExpire: this.snapshot.storageOptions?.defaultExpire || 24 * 60 * 60 * 1000,
22
- tableName: this.snapshot.storageOptions?.tableName,
23
- cache: {
24
- enabled: this.snapshot.enabled
25
- }
23
+ dbName: this.snapshot.storageOptions?.tableName
26
24
  });
27
25
  }
26
+ get cache() {
27
+ return this.cacheIn;
28
+ }
28
29
  getSnapshot() {
29
30
  return this.snapshot;
30
31
  }
31
32
  constructor(){
32
33
  _define_property(this, "snapshot", DEFAULT_CONFIG.cache);
34
+ _define_property(this, "cacheIn", void 0);
33
35
  }
34
36
  }
35
37
 
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/kernel/manager/cacheManager.ts"],"sourcesContent":["import { storage } from '../../library';\nimport type { KernelConfig, KernelManager, KernelManagerContext } from '../types';\nimport { DEFAULT_CONFIG } from '../constants';\n\nexport class CacheManager implements KernelManager<KernelConfig['cache']> {\n private snapshot: KernelConfig['cache'] = DEFAULT_CONFIG.cache;\n\n public initialize(context: KernelManagerContext): void {\n this.snapshot = context.config.cache;\n\n storage.initialize({\n prefix: this.snapshot.storageOptions?.prefix || 'vlian',\n defaultExpire: this.snapshot.storageOptions?.defaultExpire || 24 * 60 * 60 * 1000,\n tableName: this.snapshot.storageOptions?.tableName,\n cache: {\n enabled: this.snapshot.enabled,\n },\n });\n }\n\n public getSnapshot(): KernelConfig['cache'] {\n return this.snapshot;\n }\n}\n"],"names":["storage","DEFAULT_CONFIG","CacheManager","initialize","context","snapshot","config","cache","prefix","storageOptions","defaultExpire","tableName","enabled","getSnapshot"],"mappings":";;;;;;;;;;;;;AAAA,SAASA,OAAO,QAAQ,gBAAgB;AAExC,SAASC,cAAc,QAAQ,eAAe;AAE9C,OAAO,MAAMC;IAGJC,WAAWC,OAA6B,EAAQ;QACrD,IAAI,CAACC,QAAQ,GAAGD,QAAQE,MAAM,CAACC,KAAK;QAEpCP,QAAQG,UAAU,CAAC;YACjBK,QAAQ,IAAI,CAACH,QAAQ,CAACI,cAAc,EAAED,UAAU;YAChDE,eAAe,IAAI,CAACL,QAAQ,CAACI,cAAc,EAAEC,iBAAiB,KAAK,KAAK,KAAK;YAC7EC,WAAW,IAAI,CAACN,QAAQ,CAACI,cAAc,EAAEE;YACzCJ,OAAO;gBACLK,SAAS,IAAI,CAACP,QAAQ,CAACO,OAAO;YAChC;QACF;IACF;IAEOC,cAAqC;QAC1C,OAAO,IAAI,CAACR,QAAQ;IACtB;;QAjBA,uBAAQA,YAAkCJ,eAAeM,KAAK;;AAkBhE"}
1
+ {"version":3,"sources":["../../../src/kernel/manager/cacheManager.ts"],"sourcesContent":["import type {KernelConfig, KernelManager, KernelManagerContext} from '../types';\nimport {DEFAULT_CONFIG} from '../constants';\nimport type {StorageInstance} from \"@vlian/utils\";\nimport {createStorage} from \"@vlian/utils\";\n\nexport class CacheManager implements KernelManager<KernelConfig['cache']> {\n private snapshot: KernelConfig['cache'] = DEFAULT_CONFIG.cache;\n private cacheIn: StorageInstance | undefined;\n\n public initialize(context: KernelManagerContext): void {\n this.snapshot = context.config.cache;\n\n this.cacheIn = createStorage({\n type: this.snapshot.storageOptions?.type || 'local',\n prefix: this.snapshot.storageOptions?.prefix || 'vlian',\n defaultExpire: this.snapshot.storageOptions?.defaultExpire || 24 * 60 * 60 * 1000,\n dbName: this.snapshot.storageOptions?.tableName,\n });\n }\n\n get cache() {\n return this.cacheIn;\n }\n\n public getSnapshot(): KernelConfig['cache'] {\n return this.snapshot;\n }\n}\n"],"names":["DEFAULT_CONFIG","createStorage","CacheManager","initialize","context","snapshot","config","cache","cacheIn","type","storageOptions","prefix","defaultExpire","dbName","tableName","getSnapshot"],"mappings":";;;;;;;;;;;;;AACA,SAAQA,cAAc,QAAO,eAAe;AAE5C,SAAQC,aAAa,QAAO,eAAe;AAE3C,OAAO,MAAMC;IAIFC,WAAWC,OAA6B,EAAQ;QACnD,IAAI,CAACC,QAAQ,GAAGD,QAAQE,MAAM,CAACC,KAAK;QAEpC,IAAI,CAACC,OAAO,GAAGP,cAAc;YACzBQ,MAAM,IAAI,CAACJ,QAAQ,CAACK,cAAc,EAAED,QAAQ;YAC5CE,QAAQ,IAAI,CAACN,QAAQ,CAACK,cAAc,EAAEC,UAAU;YAChDC,eAAe,IAAI,CAACP,QAAQ,CAACK,cAAc,EAAEE,iBAAiB,KAAK,KAAK,KAAK;YAC7EC,QAAQ,IAAI,CAACR,QAAQ,CAACK,cAAc,EAAEI;QAC1C;IACJ;IAEA,IAAIP,QAAQ;QACR,OAAO,IAAI,CAACC,OAAO;IACvB;IAEOO,cAAqC;QACxC,OAAO,IAAI,CAACV,QAAQ;IACxB;;QApBA,uBAAQA,YAAkCL,eAAeO,KAAK;QAC9D,uBAAQC,WAAR,KAAA;;AAoBJ"}
@@ -0,0 +1,86 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", {
3
+ value: true
4
+ });
5
+ Object.defineProperty(exports, "ThemeManager", {
6
+ enumerable: true,
7
+ get: function() {
8
+ return ThemeManager;
9
+ }
10
+ });
11
+ const _constants = require("../../constants");
12
+ const _themedom = require("./theme.dom");
13
+ const _themepersistence = require("./theme.persistence");
14
+ const _themeschema = require("./theme.schema");
15
+ function _define_property(obj, key, value) {
16
+ if (key in obj) {
17
+ Object.defineProperty(obj, key, {
18
+ value: value,
19
+ enumerable: true,
20
+ configurable: true,
21
+ writable: true
22
+ });
23
+ } else {
24
+ obj[key] = value;
25
+ }
26
+ return obj;
27
+ }
28
+ let ThemeManager = class ThemeManager {
29
+ async initialize(context) {
30
+ this.config = context.config.theme;
31
+ this.cacheManager = context.cacheManager;
32
+ const initialTheme = (0, _themeschema.normalizeTheme)(this.config.initial || {}, _constants.DEFAULT_THEME);
33
+ this.theme = await (0, _themepersistence.loadThemeFromCache)(this.cacheManager, this.config.persistence, initialTheme);
34
+ (0, _themedom.applyThemeToDocument)(this.theme);
35
+ this.initialized = true;
36
+ }
37
+ getTheme() {
38
+ return (0, _themeschema.cloneTheme)(this.theme);
39
+ }
40
+ getSnapshot() {
41
+ return this.getTheme();
42
+ }
43
+ subscribe(listener) {
44
+ this.listeners.add(listener);
45
+ return ()=>{
46
+ this.listeners.delete(listener);
47
+ };
48
+ }
49
+ async setTheme(nextTheme) {
50
+ this.ensureInitialized();
51
+ const prevTheme = this.theme;
52
+ const mergedTheme = (0, _themeschema.mergeTheme)(prevTheme, nextTheme);
53
+ if ((0, _themeschema.isThemeEqual)(prevTheme, mergedTheme)) {
54
+ return;
55
+ }
56
+ this.theme = mergedTheme;
57
+ (0, _themedom.applyThemeToDocument)(this.theme, prevTheme);
58
+ if (this.cacheManager) {
59
+ await (0, _themepersistence.saveThemeToCache)(this.cacheManager, this.config.persistence, this.theme);
60
+ }
61
+ this.emit(this.theme, prevTheme);
62
+ }
63
+ ensureInitialized() {
64
+ if (!this.initialized) {
65
+ throw new Error('ThemeManager must be initialized before use.');
66
+ }
67
+ }
68
+ emit(next, prev) {
69
+ for (const listener of this.listeners){
70
+ try {
71
+ listener((0, _themeschema.cloneTheme)(next), (0, _themeschema.cloneTheme)(prev));
72
+ } catch {
73
+ // Keep notifying remaining listeners even if one fails.
74
+ }
75
+ }
76
+ }
77
+ constructor(){
78
+ _define_property(this, "theme", (0, _themeschema.cloneTheme)(_constants.DEFAULT_THEME));
79
+ _define_property(this, "config", _constants.DEFAULT_CONFIG.theme);
80
+ _define_property(this, "listeners", new Set());
81
+ _define_property(this, "cacheManager", null);
82
+ _define_property(this, "initialized", false);
83
+ }
84
+ };
85
+
86
+ //# sourceMappingURL=ThemeManager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../src/kernel/manager/theme/ThemeManager.ts"],"sourcesContent":["import type { StorageInstance } from '@vlian/utils';\nimport { DEFAULT_CONFIG, DEFAULT_THEME } from '../../constants';\nimport type { KernelConfig, KernelManager, KernelManagerContext, ThemeSnapshot } from '../../types';\nimport { applyThemeToDocument } from './theme.dom';\nimport { loadThemeFromCache, saveThemeToCache } from './theme.persistence';\nimport { cloneTheme, isThemeEqual, mergeTheme, normalizeTheme, type ThemeListener } from './theme.schema';\n\nexport class ThemeManager implements KernelManager<ThemeSnapshot> {\n private theme: ThemeSnapshot = cloneTheme(DEFAULT_THEME);\n private config: KernelConfig['theme'] = DEFAULT_CONFIG.theme;\n private listeners = new Set<ThemeListener>();\n private cacheManager: StorageInstance | null = null;\n private initialized = false;\n\n public async initialize(context: KernelManagerContext): Promise<void> {\n this.config = context.config.theme;\n this.cacheManager = context.cacheManager;\n\n const initialTheme = normalizeTheme(this.config.initial || {}, DEFAULT_THEME);\n this.theme = await loadThemeFromCache(this.cacheManager, this.config.persistence, initialTheme);\n\n applyThemeToDocument(this.theme);\n this.initialized = true;\n }\n\n public getTheme(): ThemeSnapshot {\n return cloneTheme(this.theme);\n }\n\n public getSnapshot(): ThemeSnapshot {\n return this.getTheme();\n }\n\n public subscribe(listener: ThemeListener): () => void {\n this.listeners.add(listener);\n\n return () => {\n this.listeners.delete(listener);\n };\n }\n\n public async setTheme(nextTheme: ThemeSnapshot): Promise<void> {\n this.ensureInitialized();\n\n const prevTheme = this.theme;\n const mergedTheme = mergeTheme(prevTheme, nextTheme);\n\n if (isThemeEqual(prevTheme, mergedTheme)) {\n return;\n }\n\n this.theme = mergedTheme;\n applyThemeToDocument(this.theme, prevTheme);\n\n if (this.cacheManager) {\n await saveThemeToCache(this.cacheManager, this.config.persistence, this.theme);\n }\n\n this.emit(this.theme, prevTheme);\n }\n\n private ensureInitialized(): void {\n if (!this.initialized) {\n throw new Error('ThemeManager must be initialized before use.');\n }\n }\n\n private emit(next: ThemeSnapshot, prev: ThemeSnapshot): void {\n for (const listener of this.listeners) {\n try {\n listener(cloneTheme(next), cloneTheme(prev));\n } catch {\n // Keep notifying remaining listeners even if one fails.\n }\n }\n }\n}\n"],"names":["ThemeManager","initialize","context","config","theme","cacheManager","initialTheme","normalizeTheme","initial","DEFAULT_THEME","loadThemeFromCache","persistence","applyThemeToDocument","initialized","getTheme","cloneTheme","getSnapshot","subscribe","listener","listeners","add","delete","setTheme","nextTheme","ensureInitialized","prevTheme","mergedTheme","mergeTheme","isThemeEqual","saveThemeToCache","emit","Error","next","prev","DEFAULT_CONFIG","Set"],"mappings":";;;;+BAOaA;;;eAAAA;;;2BANiC;0BAET;kCACgB;6BACoC;;;;;;;;;;;;;;AAElF,IAAA,AAAMA,eAAN,MAAMA;IAOX,MAAaC,WAAWC,OAA6B,EAAiB;QACpE,IAAI,CAACC,MAAM,GAAGD,QAAQC,MAAM,CAACC,KAAK;QAClC,IAAI,CAACC,YAAY,GAAGH,QAAQG,YAAY;QAExC,MAAMC,eAAeC,IAAAA,2BAAc,EAAC,IAAI,CAACJ,MAAM,CAACK,OAAO,IAAI,CAAC,GAAGC,wBAAa;QAC5E,IAAI,CAACL,KAAK,GAAG,MAAMM,IAAAA,oCAAkB,EAAC,IAAI,CAACL,YAAY,EAAE,IAAI,CAACF,MAAM,CAACQ,WAAW,EAAEL;QAElFM,IAAAA,8BAAoB,EAAC,IAAI,CAACR,KAAK;QAC/B,IAAI,CAACS,WAAW,GAAG;IACrB;IAEOC,WAA0B;QAC/B,OAAOC,IAAAA,uBAAU,EAAC,IAAI,CAACX,KAAK;IAC9B;IAEOY,cAA6B;QAClC,OAAO,IAAI,CAACF,QAAQ;IACtB;IAEOG,UAAUC,QAAuB,EAAc;QACpD,IAAI,CAACC,SAAS,CAACC,GAAG,CAACF;QAEnB,OAAO;YACL,IAAI,CAACC,SAAS,CAACE,MAAM,CAACH;QACxB;IACF;IAEA,MAAaI,SAASC,SAAwB,EAAiB;QAC7D,IAAI,CAACC,iBAAiB;QAEtB,MAAMC,YAAY,IAAI,CAACrB,KAAK;QAC5B,MAAMsB,cAAcC,IAAAA,uBAAU,EAACF,WAAWF;QAE1C,IAAIK,IAAAA,yBAAY,EAACH,WAAWC,cAAc;YACxC;QACF;QAEA,IAAI,CAACtB,KAAK,GAAGsB;QACbd,IAAAA,8BAAoB,EAAC,IAAI,CAACR,KAAK,EAAEqB;QAEjC,IAAI,IAAI,CAACpB,YAAY,EAAE;YACrB,MAAMwB,IAAAA,kCAAgB,EAAC,IAAI,CAACxB,YAAY,EAAE,IAAI,CAACF,MAAM,CAACQ,WAAW,EAAE,IAAI,CAACP,KAAK;QAC/E;QAEA,IAAI,CAAC0B,IAAI,CAAC,IAAI,CAAC1B,KAAK,EAAEqB;IACxB;IAEQD,oBAA0B;QAChC,IAAI,CAAC,IAAI,CAACX,WAAW,EAAE;YACrB,MAAM,IAAIkB,MAAM;QAClB;IACF;IAEQD,KAAKE,IAAmB,EAAEC,IAAmB,EAAQ;QAC3D,KAAK,MAAMf,YAAY,IAAI,CAACC,SAAS,CAAE;YACrC,IAAI;gBACFD,SAASH,IAAAA,uBAAU,EAACiB,OAAOjB,IAAAA,uBAAU,EAACkB;YACxC,EAAE,OAAM;YACN,wDAAwD;YAC1D;QACF;IACF;;QAnEA,uBAAQ7B,SAAuBW,IAAAA,uBAAU,EAACN,wBAAa;QACvD,uBAAQN,UAAgC+B,yBAAc,CAAC9B,KAAK;QAC5D,uBAAQe,aAAY,IAAIgB;QACxB,uBAAQ9B,gBAAuC;QAC/C,uBAAQQ,eAAc;;AAgExB"}
@@ -0,0 +1,16 @@
1
+ import type { KernelManager, KernelManagerContext, ThemeSnapshot } from '../../types';
2
+ import { type ThemeListener } from './theme.schema';
3
+ export declare class ThemeManager implements KernelManager<ThemeSnapshot> {
4
+ private theme;
5
+ private config;
6
+ private listeners;
7
+ private cacheManager;
8
+ private initialized;
9
+ initialize(context: KernelManagerContext): Promise<void>;
10
+ getTheme(): ThemeSnapshot;
11
+ getSnapshot(): ThemeSnapshot;
12
+ subscribe(listener: ThemeListener): () => void;
13
+ setTheme(nextTheme: ThemeSnapshot): Promise<void>;
14
+ private ensureInitialized;
15
+ private emit;
16
+ }
@@ -0,0 +1,76 @@
1
+ function _define_property(obj, key, value) {
2
+ if (key in obj) {
3
+ Object.defineProperty(obj, key, {
4
+ value: value,
5
+ enumerable: true,
6
+ configurable: true,
7
+ writable: true
8
+ });
9
+ } else {
10
+ obj[key] = value;
11
+ }
12
+ return obj;
13
+ }
14
+ import { DEFAULT_CONFIG, DEFAULT_THEME } from "../../constants";
15
+ import { applyThemeToDocument } from "./theme.dom";
16
+ import { loadThemeFromCache, saveThemeToCache } from "./theme.persistence";
17
+ import { cloneTheme, isThemeEqual, mergeTheme, normalizeTheme } from "./theme.schema";
18
+ export class ThemeManager {
19
+ async initialize(context) {
20
+ this.config = context.config.theme;
21
+ this.cacheManager = context.cacheManager;
22
+ const initialTheme = normalizeTheme(this.config.initial || {}, DEFAULT_THEME);
23
+ this.theme = await loadThemeFromCache(this.cacheManager, this.config.persistence, initialTheme);
24
+ applyThemeToDocument(this.theme);
25
+ this.initialized = true;
26
+ }
27
+ getTheme() {
28
+ return cloneTheme(this.theme);
29
+ }
30
+ getSnapshot() {
31
+ return this.getTheme();
32
+ }
33
+ subscribe(listener) {
34
+ this.listeners.add(listener);
35
+ return ()=>{
36
+ this.listeners.delete(listener);
37
+ };
38
+ }
39
+ async setTheme(nextTheme) {
40
+ this.ensureInitialized();
41
+ const prevTheme = this.theme;
42
+ const mergedTheme = mergeTheme(prevTheme, nextTheme);
43
+ if (isThemeEqual(prevTheme, mergedTheme)) {
44
+ return;
45
+ }
46
+ this.theme = mergedTheme;
47
+ applyThemeToDocument(this.theme, prevTheme);
48
+ if (this.cacheManager) {
49
+ await saveThemeToCache(this.cacheManager, this.config.persistence, this.theme);
50
+ }
51
+ this.emit(this.theme, prevTheme);
52
+ }
53
+ ensureInitialized() {
54
+ if (!this.initialized) {
55
+ throw new Error('ThemeManager must be initialized before use.');
56
+ }
57
+ }
58
+ emit(next, prev) {
59
+ for (const listener of this.listeners){
60
+ try {
61
+ listener(cloneTheme(next), cloneTheme(prev));
62
+ } catch {
63
+ // Keep notifying remaining listeners even if one fails.
64
+ }
65
+ }
66
+ }
67
+ constructor(){
68
+ _define_property(this, "theme", cloneTheme(DEFAULT_THEME));
69
+ _define_property(this, "config", DEFAULT_CONFIG.theme);
70
+ _define_property(this, "listeners", new Set());
71
+ _define_property(this, "cacheManager", null);
72
+ _define_property(this, "initialized", false);
73
+ }
74
+ }
75
+
76
+ //# sourceMappingURL=ThemeManager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../src/kernel/manager/theme/ThemeManager.ts"],"sourcesContent":["import type { StorageInstance } from '@vlian/utils';\nimport { DEFAULT_CONFIG, DEFAULT_THEME } from '../../constants';\nimport type { KernelConfig, KernelManager, KernelManagerContext, ThemeSnapshot } from '../../types';\nimport { applyThemeToDocument } from './theme.dom';\nimport { loadThemeFromCache, saveThemeToCache } from './theme.persistence';\nimport { cloneTheme, isThemeEqual, mergeTheme, normalizeTheme, type ThemeListener } from './theme.schema';\n\nexport class ThemeManager implements KernelManager<ThemeSnapshot> {\n private theme: ThemeSnapshot = cloneTheme(DEFAULT_THEME);\n private config: KernelConfig['theme'] = DEFAULT_CONFIG.theme;\n private listeners = new Set<ThemeListener>();\n private cacheManager: StorageInstance | null = null;\n private initialized = false;\n\n public async initialize(context: KernelManagerContext): Promise<void> {\n this.config = context.config.theme;\n this.cacheManager = context.cacheManager;\n\n const initialTheme = normalizeTheme(this.config.initial || {}, DEFAULT_THEME);\n this.theme = await loadThemeFromCache(this.cacheManager, this.config.persistence, initialTheme);\n\n applyThemeToDocument(this.theme);\n this.initialized = true;\n }\n\n public getTheme(): ThemeSnapshot {\n return cloneTheme(this.theme);\n }\n\n public getSnapshot(): ThemeSnapshot {\n return this.getTheme();\n }\n\n public subscribe(listener: ThemeListener): () => void {\n this.listeners.add(listener);\n\n return () => {\n this.listeners.delete(listener);\n };\n }\n\n public async setTheme(nextTheme: ThemeSnapshot): Promise<void> {\n this.ensureInitialized();\n\n const prevTheme = this.theme;\n const mergedTheme = mergeTheme(prevTheme, nextTheme);\n\n if (isThemeEqual(prevTheme, mergedTheme)) {\n return;\n }\n\n this.theme = mergedTheme;\n applyThemeToDocument(this.theme, prevTheme);\n\n if (this.cacheManager) {\n await saveThemeToCache(this.cacheManager, this.config.persistence, this.theme);\n }\n\n this.emit(this.theme, prevTheme);\n }\n\n private ensureInitialized(): void {\n if (!this.initialized) {\n throw new Error('ThemeManager must be initialized before use.');\n }\n }\n\n private emit(next: ThemeSnapshot, prev: ThemeSnapshot): void {\n for (const listener of this.listeners) {\n try {\n listener(cloneTheme(next), cloneTheme(prev));\n } catch {\n // Keep notifying remaining listeners even if one fails.\n }\n }\n }\n}\n"],"names":["DEFAULT_CONFIG","DEFAULT_THEME","applyThemeToDocument","loadThemeFromCache","saveThemeToCache","cloneTheme","isThemeEqual","mergeTheme","normalizeTheme","ThemeManager","initialize","context","config","theme","cacheManager","initialTheme","initial","persistence","initialized","getTheme","getSnapshot","subscribe","listener","listeners","add","delete","setTheme","nextTheme","ensureInitialized","prevTheme","mergedTheme","emit","Error","next","prev","Set"],"mappings":";;;;;;;;;;;;;AACA,SAASA,cAAc,EAAEC,aAAa,QAAQ,kBAAkB;AAEhE,SAASC,oBAAoB,QAAQ,cAAc;AACnD,SAASC,kBAAkB,EAAEC,gBAAgB,QAAQ,sBAAsB;AAC3E,SAASC,UAAU,EAAEC,YAAY,EAAEC,UAAU,EAAEC,cAAc,QAA4B,iBAAiB;AAE1G,OAAO,MAAMC;IAOX,MAAaC,WAAWC,OAA6B,EAAiB;QACpE,IAAI,CAACC,MAAM,GAAGD,QAAQC,MAAM,CAACC,KAAK;QAClC,IAAI,CAACC,YAAY,GAAGH,QAAQG,YAAY;QAExC,MAAMC,eAAeP,eAAe,IAAI,CAACI,MAAM,CAACI,OAAO,IAAI,CAAC,GAAGf;QAC/D,IAAI,CAACY,KAAK,GAAG,MAAMV,mBAAmB,IAAI,CAACW,YAAY,EAAE,IAAI,CAACF,MAAM,CAACK,WAAW,EAAEF;QAElFb,qBAAqB,IAAI,CAACW,KAAK;QAC/B,IAAI,CAACK,WAAW,GAAG;IACrB;IAEOC,WAA0B;QAC/B,OAAOd,WAAW,IAAI,CAACQ,KAAK;IAC9B;IAEOO,cAA6B;QAClC,OAAO,IAAI,CAACD,QAAQ;IACtB;IAEOE,UAAUC,QAAuB,EAAc;QACpD,IAAI,CAACC,SAAS,CAACC,GAAG,CAACF;QAEnB,OAAO;YACL,IAAI,CAACC,SAAS,CAACE,MAAM,CAACH;QACxB;IACF;IAEA,MAAaI,SAASC,SAAwB,EAAiB;QAC7D,IAAI,CAACC,iBAAiB;QAEtB,MAAMC,YAAY,IAAI,CAAChB,KAAK;QAC5B,MAAMiB,cAAcvB,WAAWsB,WAAWF;QAE1C,IAAIrB,aAAauB,WAAWC,cAAc;YACxC;QACF;QAEA,IAAI,CAACjB,KAAK,GAAGiB;QACb5B,qBAAqB,IAAI,CAACW,KAAK,EAAEgB;QAEjC,IAAI,IAAI,CAACf,YAAY,EAAE;YACrB,MAAMV,iBAAiB,IAAI,CAACU,YAAY,EAAE,IAAI,CAACF,MAAM,CAACK,WAAW,EAAE,IAAI,CAACJ,KAAK;QAC/E;QAEA,IAAI,CAACkB,IAAI,CAAC,IAAI,CAAClB,KAAK,EAAEgB;IACxB;IAEQD,oBAA0B;QAChC,IAAI,CAAC,IAAI,CAACV,WAAW,EAAE;YACrB,MAAM,IAAIc,MAAM;QAClB;IACF;IAEQD,KAAKE,IAAmB,EAAEC,IAAmB,EAAQ;QAC3D,KAAK,MAAMZ,YAAY,IAAI,CAACC,SAAS,CAAE;YACrC,IAAI;gBACFD,SAASjB,WAAW4B,OAAO5B,WAAW6B;YACxC,EAAE,OAAM;YACN,wDAAwD;YAC1D;QACF;IACF;;QAnEA,uBAAQrB,SAAuBR,WAAWJ;QAC1C,uBAAQW,UAAgCZ,eAAea,KAAK;QAC5D,uBAAQU,aAAY,IAAIY;QACxB,uBAAQrB,gBAAuC;QAC/C,uBAAQI,eAAc;;AAgExB"}
@@ -0,0 +1,13 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", {
3
+ value: true
4
+ });
5
+ Object.defineProperty(exports, "ThemeManager", {
6
+ enumerable: true,
7
+ get: function() {
8
+ return _ThemeManager.ThemeManager;
9
+ }
10
+ });
11
+ const _ThemeManager = require("./ThemeManager");
12
+
13
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../src/kernel/manager/theme/index.ts"],"sourcesContent":["export { ThemeManager } from './ThemeManager';\n"],"names":["ThemeManager"],"mappings":";;;;+BAASA;;;eAAAA,0BAAY;;;8BAAQ"}
@@ -0,0 +1 @@
1
+ export { ThemeManager } from './ThemeManager';
@@ -0,0 +1,3 @@
1
+ export { ThemeManager } from "./ThemeManager";
2
+
3
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../src/kernel/manager/theme/index.ts"],"sourcesContent":["export { ThemeManager } from './ThemeManager';\n"],"names":["ThemeManager"],"mappings":"AAAA,SAASA,YAAY,QAAQ,iBAAiB"}
@@ -0,0 +1,63 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", {
3
+ value: true
4
+ });
5
+ function _export(target, all) {
6
+ for(var name in all)Object.defineProperty(target, name, {
7
+ enumerable: true,
8
+ get: Object.getOwnPropertyDescriptor(all, name).get
9
+ });
10
+ }
11
+ _export(exports, {
12
+ get applyThemeToDocument () {
13
+ return applyThemeToDocument;
14
+ },
15
+ get resolveThemeMode () {
16
+ return resolveThemeMode;
17
+ }
18
+ });
19
+ function canUseDom() {
20
+ return typeof document !== 'undefined';
21
+ }
22
+ function resolveThemeMode(theme) {
23
+ if (theme.mode !== 'system') {
24
+ return theme.mode;
25
+ }
26
+ if (typeof window !== 'undefined' && window.matchMedia('(prefers-color-scheme: dark)').matches) {
27
+ return 'dark';
28
+ }
29
+ return 'light';
30
+ }
31
+ function applyThemeToDocument(nextTheme, prevTheme) {
32
+ if (!canUseDom()) {
33
+ return;
34
+ }
35
+ const root = document.documentElement;
36
+ const nextMode = resolveThemeMode(nextTheme);
37
+ const prevMode = prevTheme ? resolveThemeMode(prevTheme) : undefined;
38
+ if (!prevMode || prevMode !== nextMode) {
39
+ root.classList.remove('light', 'dark');
40
+ root.classList.add(nextMode);
41
+ }
42
+ if (!prevTheme || prevTheme.primaryColor !== nextTheme.primaryColor) {
43
+ if (nextTheme.primaryColor) {
44
+ root.style.setProperty('--app-primary-color', nextTheme.primaryColor);
45
+ } else {
46
+ root.style.removeProperty('--app-primary-color');
47
+ }
48
+ }
49
+ const prevTokens = prevTheme?.tokens || {};
50
+ const nextTokens = nextTheme.tokens || {};
51
+ for (const token of Object.keys(prevTokens)){
52
+ if (!(token in nextTokens)) {
53
+ root.style.removeProperty(`--${token}`);
54
+ }
55
+ }
56
+ for (const [token, value] of Object.entries(nextTokens)){
57
+ if (!prevTheme || prevTokens[token] !== value) {
58
+ root.style.setProperty(`--${token}`, String(value));
59
+ }
60
+ }
61
+ }
62
+
63
+ //# sourceMappingURL=theme.dom.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../src/kernel/manager/theme/theme.dom.ts"],"sourcesContent":["import type { ThemeSnapshot } from '../../types';\n\nfunction canUseDom(): boolean {\n return typeof document !== 'undefined';\n}\n\nexport function resolveThemeMode(theme: ThemeSnapshot): 'light' | 'dark' {\n if (theme.mode !== 'system') {\n return theme.mode;\n }\n\n if (typeof window !== 'undefined' && window.matchMedia('(prefers-color-scheme: dark)').matches) {\n return 'dark';\n }\n\n return 'light';\n}\n\nexport function applyThemeToDocument(nextTheme: ThemeSnapshot, prevTheme?: ThemeSnapshot): void {\n if (!canUseDom()) {\n return;\n }\n\n const root = document.documentElement;\n const nextMode = resolveThemeMode(nextTheme);\n const prevMode = prevTheme ? resolveThemeMode(prevTheme) : undefined;\n\n if (!prevMode || prevMode !== nextMode) {\n root.classList.remove('light', 'dark');\n root.classList.add(nextMode);\n }\n\n if (!prevTheme || prevTheme.primaryColor !== nextTheme.primaryColor) {\n if (nextTheme.primaryColor) {\n root.style.setProperty('--app-primary-color', nextTheme.primaryColor);\n } else {\n root.style.removeProperty('--app-primary-color');\n }\n }\n\n const prevTokens = prevTheme?.tokens || {};\n const nextTokens = nextTheme.tokens || {};\n\n for (const token of Object.keys(prevTokens)) {\n if (!(token in nextTokens)) {\n root.style.removeProperty(`--${token}`);\n }\n }\n\n for (const [token, value] of Object.entries(nextTokens)) {\n if (!prevTheme || prevTokens[token] !== value) {\n root.style.setProperty(`--${token}`, String(value));\n }\n }\n}\n"],"names":["applyThemeToDocument","resolveThemeMode","canUseDom","document","theme","mode","window","matchMedia","matches","nextTheme","prevTheme","root","documentElement","nextMode","prevMode","undefined","classList","remove","add","primaryColor","style","setProperty","removeProperty","prevTokens","tokens","nextTokens","token","Object","keys","value","entries","String"],"mappings":";;;;;;;;;;;QAkBgBA;eAAAA;;QAZAC;eAAAA;;;AAJhB,SAASC;IACP,OAAO,OAAOC,aAAa;AAC7B;AAEO,SAASF,iBAAiBG,KAAoB;IACnD,IAAIA,MAAMC,IAAI,KAAK,UAAU;QAC3B,OAAOD,MAAMC,IAAI;IACnB;IAEA,IAAI,OAAOC,WAAW,eAAeA,OAAOC,UAAU,CAAC,gCAAgCC,OAAO,EAAE;QAC9F,OAAO;IACT;IAEA,OAAO;AACT;AAEO,SAASR,qBAAqBS,SAAwB,EAAEC,SAAyB;IACtF,IAAI,CAACR,aAAa;QAChB;IACF;IAEA,MAAMS,OAAOR,SAASS,eAAe;IACrC,MAAMC,WAAWZ,iBAAiBQ;IAClC,MAAMK,WAAWJ,YAAYT,iBAAiBS,aAAaK;IAE3D,IAAI,CAACD,YAAYA,aAAaD,UAAU;QACtCF,KAAKK,SAAS,CAACC,MAAM,CAAC,SAAS;QAC/BN,KAAKK,SAAS,CAACE,GAAG,CAACL;IACrB;IAEA,IAAI,CAACH,aAAaA,UAAUS,YAAY,KAAKV,UAAUU,YAAY,EAAE;QACnE,IAAIV,UAAUU,YAAY,EAAE;YAC1BR,KAAKS,KAAK,CAACC,WAAW,CAAC,uBAAuBZ,UAAUU,YAAY;QACtE,OAAO;YACLR,KAAKS,KAAK,CAACE,cAAc,CAAC;QAC5B;IACF;IAEA,MAAMC,aAAab,WAAWc,UAAU,CAAC;IACzC,MAAMC,aAAahB,UAAUe,MAAM,IAAI,CAAC;IAExC,KAAK,MAAME,SAASC,OAAOC,IAAI,CAACL,YAAa;QAC3C,IAAI,CAAEG,CAAAA,SAASD,UAAS,GAAI;YAC1Bd,KAAKS,KAAK,CAACE,cAAc,CAAC,CAAC,EAAE,EAAEI,OAAO;QACxC;IACF;IAEA,KAAK,MAAM,CAACA,OAAOG,MAAM,IAAIF,OAAOG,OAAO,CAACL,YAAa;QACvD,IAAI,CAACf,aAAaa,UAAU,CAACG,MAAM,KAAKG,OAAO;YAC7ClB,KAAKS,KAAK,CAACC,WAAW,CAAC,CAAC,EAAE,EAAEK,OAAO,EAAEK,OAAOF;QAC9C;IACF;AACF"}