@vlian/framework 1.2.50 → 1.2.54

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.
@@ -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"}
@@ -17,6 +17,7 @@ _export(exports, {
17
17
  }
18
18
  });
19
19
  const _library = require("../../library");
20
+ const _utils = require("@/utils");
20
21
  function resolveStorageInstance(driver) {
21
22
  if (driver === 'none' || typeof window === 'undefined') {
22
23
  return null;
@@ -68,7 +69,8 @@ async function writePersistedValue(persistence, value) {
68
69
  }
69
70
  try {
70
71
  await targetStorage.set(key, value);
71
- } catch {
72
+ } catch (e) {
73
+ _utils.logger.error(e);
72
74
  // ignore persistence errors
73
75
  }
74
76
  }
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/kernel/manager/persistence.ts"],"sourcesContent":["import { storage } from '../../library';\nimport type { KernelStorageDriver, PersistenceOptions } from '../types';\n\ntype StorageLike = {\n get: (key: string) => Promise<unknown>;\n set: (key: string, value: unknown) => Promise<void>;\n};\n\nfunction resolveStorageInstance(driver: KernelStorageDriver): StorageLike | null {\n if (driver === 'none' || typeof window === 'undefined') {\n return null;\n }\n\n const instance = driver === 'localStorage'\n ? storage.local\n : driver === 'sessionStorage'\n ? storage.session\n : storage.indexedDB;\n\n if (!instance || typeof (instance as any).get !== 'function' || typeof (instance as any).set !== 'function') {\n return null;\n }\n\n return instance as unknown as StorageLike;\n}\n\nexport async function readPersistedValue(\n persistence: PersistenceOptions | undefined\n): Promise<string | null> {\n if (!persistence || persistence.enabled === false) {\n return null;\n }\n\n const driver = persistence.storage ?? 'localStorage';\n const key = persistence.key;\n if (!key) {\n return null;\n }\n\n const targetStorage = resolveStorageInstance(driver);\n if (!targetStorage) {\n return null;\n }\n\n try {\n const value = await targetStorage.get(key);\n if (value === null || value === undefined) {\n return null;\n }\n if (typeof value === 'string') {\n return value;\n }\n return JSON.stringify(value);\n } catch {\n return null;\n }\n}\n\nexport async function writePersistedValue(\n persistence: PersistenceOptions | undefined,\n value: string\n): Promise<void> {\n if (!persistence || persistence.enabled === false) {\n return;\n }\n\n const driver = persistence.storage ?? 'localStorage';\n const key = persistence.key;\n if (!key) {\n return;\n }\n\n const targetStorage = resolveStorageInstance(driver);\n if (!targetStorage) {\n return;\n }\n\n try {\n await targetStorage.set(key, value);\n } catch {\n // ignore persistence errors\n }\n}\n"],"names":["readPersistedValue","writePersistedValue","resolveStorageInstance","driver","window","instance","storage","local","session","indexedDB","get","set","persistence","enabled","key","targetStorage","value","undefined","JSON","stringify"],"mappings":";;;;;;;;;;;QA0BsBA;eAAAA;;QAgCAC;eAAAA;;;yBA1DE;AAQxB,SAASC,uBAAuBC,MAA2B;IACzD,IAAIA,WAAW,UAAU,OAAOC,WAAW,aAAa;QACtD,OAAO;IACT;IAEA,MAAMC,WAAWF,WAAW,iBACxBG,gBAAO,CAACC,KAAK,GACbJ,WAAW,mBACTG,gBAAO,CAACE,OAAO,GACfF,gBAAO,CAACG,SAAS;IAEvB,IAAI,CAACJ,YAAY,OAAO,AAACA,SAAiBK,GAAG,KAAK,cAAc,OAAO,AAACL,SAAiBM,GAAG,KAAK,YAAY;QAC3G,OAAO;IACT;IAEA,OAAON;AACT;AAEO,eAAeL,mBACpBY,WAA2C;IAE3C,IAAI,CAACA,eAAeA,YAAYC,OAAO,KAAK,OAAO;QACjD,OAAO;IACT;IAEA,MAAMV,SAASS,YAAYN,OAAO,IAAI;IACtC,MAAMQ,MAAMF,YAAYE,GAAG;IAC3B,IAAI,CAACA,KAAK;QACR,OAAO;IACT;IAEA,MAAMC,gBAAgBb,uBAAuBC;IAC7C,IAAI,CAACY,eAAe;QAClB,OAAO;IACT;IAEA,IAAI;QACF,MAAMC,QAAQ,MAAMD,cAAcL,GAAG,CAACI;QACtC,IAAIE,UAAU,QAAQA,UAAUC,WAAW;YACzC,OAAO;QACT;QACA,IAAI,OAAOD,UAAU,UAAU;YAC7B,OAAOA;QACT;QACA,OAAOE,KAAKC,SAAS,CAACH;IACxB,EAAE,OAAM;QACN,OAAO;IACT;AACF;AAEO,eAAef,oBACpBW,WAA2C,EAC3CI,KAAa;IAEb,IAAI,CAACJ,eAAeA,YAAYC,OAAO,KAAK,OAAO;QACjD;IACF;IAEA,MAAMV,SAASS,YAAYN,OAAO,IAAI;IACtC,MAAMQ,MAAMF,YAAYE,GAAG;IAC3B,IAAI,CAACA,KAAK;QACR;IACF;IAEA,MAAMC,gBAAgBb,uBAAuBC;IAC7C,IAAI,CAACY,eAAe;QAClB;IACF;IAEA,IAAI;QACF,MAAMA,cAAcJ,GAAG,CAACG,KAAKE;IAC/B,EAAE,OAAM;IACN,4BAA4B;IAC9B;AACF"}
1
+ {"version":3,"sources":["../../../src/kernel/manager/persistence.ts"],"sourcesContent":["import { storage } from '../../library';\nimport type { KernelStorageDriver, PersistenceOptions } from '../types';\nimport {logger} from \"@/utils\";\n\ntype StorageLike = {\n get: (key: string) => Promise<unknown>;\n set: (key: string, value: unknown) => Promise<void>;\n};\n\nfunction resolveStorageInstance(driver: KernelStorageDriver): StorageLike | null {\n if (driver === 'none' || typeof window === 'undefined') {\n return null;\n }\n\n const instance = driver === 'localStorage'\n ? storage.local\n : driver === 'sessionStorage'\n ? storage.session\n : storage.indexedDB;\n\n if (!instance || typeof (instance as any).get !== 'function' || typeof (instance as any).set !== 'function') {\n return null;\n }\n\n return instance as unknown as StorageLike;\n}\n\nexport async function readPersistedValue(\n persistence: PersistenceOptions | undefined\n): Promise<string | null> {\n if (!persistence || persistence.enabled === false) {\n return null;\n }\n\n const driver = persistence.storage ?? 'localStorage';\n const key = persistence.key;\n if (!key) {\n return null;\n }\n\n const targetStorage = resolveStorageInstance(driver);\n if (!targetStorage) {\n return null;\n }\n\n try {\n const value = await targetStorage.get(key);\n if (value === null || value === undefined) {\n return null;\n }\n if (typeof value === 'string') {\n return value;\n }\n return JSON.stringify(value);\n } catch {\n return null;\n }\n}\n\nexport async function writePersistedValue(\n persistence: PersistenceOptions | undefined,\n value: string\n): Promise<void> {\n if (!persistence || persistence.enabled === false) {\n return;\n }\n\n const driver = persistence.storage ?? 'localStorage';\n const key = persistence.key;\n if (!key) {\n return;\n }\n\n const targetStorage = resolveStorageInstance(driver);\n if (!targetStorage) {\n return;\n }\n\n try {\n await targetStorage.set(key, value);\n } catch(e) {\n logger.error(e);\n // ignore persistence errors\n }\n}\n"],"names":["readPersistedValue","writePersistedValue","resolveStorageInstance","driver","window","instance","storage","local","session","indexedDB","get","set","persistence","enabled","key","targetStorage","value","undefined","JSON","stringify","e","logger","error"],"mappings":";;;;;;;;;;;QA2BsBA;eAAAA;;QAgCAC;eAAAA;;;yBA3DE;uBAEH;AAOrB,SAASC,uBAAuBC,MAA2B;IACzD,IAAIA,WAAW,UAAU,OAAOC,WAAW,aAAa;QACtD,OAAO;IACT;IAEA,MAAMC,WAAWF,WAAW,iBACxBG,gBAAO,CAACC,KAAK,GACbJ,WAAW,mBACTG,gBAAO,CAACE,OAAO,GACfF,gBAAO,CAACG,SAAS;IAEvB,IAAI,CAACJ,YAAY,OAAO,AAACA,SAAiBK,GAAG,KAAK,cAAc,OAAO,AAACL,SAAiBM,GAAG,KAAK,YAAY;QAC3G,OAAO;IACT;IAEA,OAAON;AACT;AAEO,eAAeL,mBACpBY,WAA2C;IAE3C,IAAI,CAACA,eAAeA,YAAYC,OAAO,KAAK,OAAO;QACjD,OAAO;IACT;IAEA,MAAMV,SAASS,YAAYN,OAAO,IAAI;IACtC,MAAMQ,MAAMF,YAAYE,GAAG;IAC3B,IAAI,CAACA,KAAK;QACR,OAAO;IACT;IAEA,MAAMC,gBAAgBb,uBAAuBC;IAC7C,IAAI,CAACY,eAAe;QAClB,OAAO;IACT;IAEA,IAAI;QACF,MAAMC,QAAQ,MAAMD,cAAcL,GAAG,CAACI;QACtC,IAAIE,UAAU,QAAQA,UAAUC,WAAW;YACzC,OAAO;QACT;QACA,IAAI,OAAOD,UAAU,UAAU;YAC7B,OAAOA;QACT;QACA,OAAOE,KAAKC,SAAS,CAACH;IACxB,EAAE,OAAM;QACN,OAAO;IACT;AACF;AAEO,eAAef,oBACpBW,WAA2C,EAC3CI,KAAa;IAEb,IAAI,CAACJ,eAAeA,YAAYC,OAAO,KAAK,OAAO;QACjD;IACF;IAEA,MAAMV,SAASS,YAAYN,OAAO,IAAI;IACtC,MAAMQ,MAAMF,YAAYE,GAAG;IAC3B,IAAI,CAACA,KAAK;QACR;IACF;IAEA,MAAMC,gBAAgBb,uBAAuBC;IAC7C,IAAI,CAACY,eAAe;QAClB;IACF;IAEA,IAAI;QACF,MAAMA,cAAcJ,GAAG,CAACG,KAAKE;IAC/B,EAAE,OAAMI,GAAG;QACTC,aAAM,CAACC,KAAK,CAACF;IACb,4BAA4B;IAC9B;AACF"}
@@ -1,4 +1,5 @@
1
1
  import { storage } from "../../library";
2
+ import { logger } from "@/utils";
2
3
  function resolveStorageInstance(driver) {
3
4
  if (driver === 'none' || typeof window === 'undefined') {
4
5
  return null;
@@ -50,7 +51,8 @@ export async function writePersistedValue(persistence, value) {
50
51
  }
51
52
  try {
52
53
  await targetStorage.set(key, value);
53
- } catch {
54
+ } catch (e) {
55
+ logger.error(e);
54
56
  // ignore persistence errors
55
57
  }
56
58
  }
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/kernel/manager/persistence.ts"],"sourcesContent":["import { storage } from '../../library';\nimport type { KernelStorageDriver, PersistenceOptions } from '../types';\n\ntype StorageLike = {\n get: (key: string) => Promise<unknown>;\n set: (key: string, value: unknown) => Promise<void>;\n};\n\nfunction resolveStorageInstance(driver: KernelStorageDriver): StorageLike | null {\n if (driver === 'none' || typeof window === 'undefined') {\n return null;\n }\n\n const instance = driver === 'localStorage'\n ? storage.local\n : driver === 'sessionStorage'\n ? storage.session\n : storage.indexedDB;\n\n if (!instance || typeof (instance as any).get !== 'function' || typeof (instance as any).set !== 'function') {\n return null;\n }\n\n return instance as unknown as StorageLike;\n}\n\nexport async function readPersistedValue(\n persistence: PersistenceOptions | undefined\n): Promise<string | null> {\n if (!persistence || persistence.enabled === false) {\n return null;\n }\n\n const driver = persistence.storage ?? 'localStorage';\n const key = persistence.key;\n if (!key) {\n return null;\n }\n\n const targetStorage = resolveStorageInstance(driver);\n if (!targetStorage) {\n return null;\n }\n\n try {\n const value = await targetStorage.get(key);\n if (value === null || value === undefined) {\n return null;\n }\n if (typeof value === 'string') {\n return value;\n }\n return JSON.stringify(value);\n } catch {\n return null;\n }\n}\n\nexport async function writePersistedValue(\n persistence: PersistenceOptions | undefined,\n value: string\n): Promise<void> {\n if (!persistence || persistence.enabled === false) {\n return;\n }\n\n const driver = persistence.storage ?? 'localStorage';\n const key = persistence.key;\n if (!key) {\n return;\n }\n\n const targetStorage = resolveStorageInstance(driver);\n if (!targetStorage) {\n return;\n }\n\n try {\n await targetStorage.set(key, value);\n } catch {\n // ignore persistence errors\n }\n}\n"],"names":["storage","resolveStorageInstance","driver","window","instance","local","session","indexedDB","get","set","readPersistedValue","persistence","enabled","key","targetStorage","value","undefined","JSON","stringify","writePersistedValue"],"mappings":"AAAA,SAASA,OAAO,QAAQ,gBAAgB;AAQxC,SAASC,uBAAuBC,MAA2B;IACzD,IAAIA,WAAW,UAAU,OAAOC,WAAW,aAAa;QACtD,OAAO;IACT;IAEA,MAAMC,WAAWF,WAAW,iBACxBF,QAAQK,KAAK,GACbH,WAAW,mBACTF,QAAQM,OAAO,GACfN,QAAQO,SAAS;IAEvB,IAAI,CAACH,YAAY,OAAO,AAACA,SAAiBI,GAAG,KAAK,cAAc,OAAO,AAACJ,SAAiBK,GAAG,KAAK,YAAY;QAC3G,OAAO;IACT;IAEA,OAAOL;AACT;AAEA,OAAO,eAAeM,mBACpBC,WAA2C;IAE3C,IAAI,CAACA,eAAeA,YAAYC,OAAO,KAAK,OAAO;QACjD,OAAO;IACT;IAEA,MAAMV,SAASS,YAAYX,OAAO,IAAI;IACtC,MAAMa,MAAMF,YAAYE,GAAG;IAC3B,IAAI,CAACA,KAAK;QACR,OAAO;IACT;IAEA,MAAMC,gBAAgBb,uBAAuBC;IAC7C,IAAI,CAACY,eAAe;QAClB,OAAO;IACT;IAEA,IAAI;QACF,MAAMC,QAAQ,MAAMD,cAAcN,GAAG,CAACK;QACtC,IAAIE,UAAU,QAAQA,UAAUC,WAAW;YACzC,OAAO;QACT;QACA,IAAI,OAAOD,UAAU,UAAU;YAC7B,OAAOA;QACT;QACA,OAAOE,KAAKC,SAAS,CAACH;IACxB,EAAE,OAAM;QACN,OAAO;IACT;AACF;AAEA,OAAO,eAAeI,oBACpBR,WAA2C,EAC3CI,KAAa;IAEb,IAAI,CAACJ,eAAeA,YAAYC,OAAO,KAAK,OAAO;QACjD;IACF;IAEA,MAAMV,SAASS,YAAYX,OAAO,IAAI;IACtC,MAAMa,MAAMF,YAAYE,GAAG;IAC3B,IAAI,CAACA,KAAK;QACR;IACF;IAEA,MAAMC,gBAAgBb,uBAAuBC;IAC7C,IAAI,CAACY,eAAe;QAClB;IACF;IAEA,IAAI;QACF,MAAMA,cAAcL,GAAG,CAACI,KAAKE;IAC/B,EAAE,OAAM;IACN,4BAA4B;IAC9B;AACF"}
1
+ {"version":3,"sources":["../../../src/kernel/manager/persistence.ts"],"sourcesContent":["import { storage } from '../../library';\nimport type { KernelStorageDriver, PersistenceOptions } from '../types';\nimport {logger} from \"@/utils\";\n\ntype StorageLike = {\n get: (key: string) => Promise<unknown>;\n set: (key: string, value: unknown) => Promise<void>;\n};\n\nfunction resolveStorageInstance(driver: KernelStorageDriver): StorageLike | null {\n if (driver === 'none' || typeof window === 'undefined') {\n return null;\n }\n\n const instance = driver === 'localStorage'\n ? storage.local\n : driver === 'sessionStorage'\n ? storage.session\n : storage.indexedDB;\n\n if (!instance || typeof (instance as any).get !== 'function' || typeof (instance as any).set !== 'function') {\n return null;\n }\n\n return instance as unknown as StorageLike;\n}\n\nexport async function readPersistedValue(\n persistence: PersistenceOptions | undefined\n): Promise<string | null> {\n if (!persistence || persistence.enabled === false) {\n return null;\n }\n\n const driver = persistence.storage ?? 'localStorage';\n const key = persistence.key;\n if (!key) {\n return null;\n }\n\n const targetStorage = resolveStorageInstance(driver);\n if (!targetStorage) {\n return null;\n }\n\n try {\n const value = await targetStorage.get(key);\n if (value === null || value === undefined) {\n return null;\n }\n if (typeof value === 'string') {\n return value;\n }\n return JSON.stringify(value);\n } catch {\n return null;\n }\n}\n\nexport async function writePersistedValue(\n persistence: PersistenceOptions | undefined,\n value: string\n): Promise<void> {\n if (!persistence || persistence.enabled === false) {\n return;\n }\n\n const driver = persistence.storage ?? 'localStorage';\n const key = persistence.key;\n if (!key) {\n return;\n }\n\n const targetStorage = resolveStorageInstance(driver);\n if (!targetStorage) {\n return;\n }\n\n try {\n await targetStorage.set(key, value);\n } catch(e) {\n logger.error(e);\n // ignore persistence errors\n }\n}\n"],"names":["storage","logger","resolveStorageInstance","driver","window","instance","local","session","indexedDB","get","set","readPersistedValue","persistence","enabled","key","targetStorage","value","undefined","JSON","stringify","writePersistedValue","e","error"],"mappings":"AAAA,SAASA,OAAO,QAAQ,gBAAgB;AAExC,SAAQC,MAAM,QAAO,UAAU;AAO/B,SAASC,uBAAuBC,MAA2B;IACzD,IAAIA,WAAW,UAAU,OAAOC,WAAW,aAAa;QACtD,OAAO;IACT;IAEA,MAAMC,WAAWF,WAAW,iBACxBH,QAAQM,KAAK,GACbH,WAAW,mBACTH,QAAQO,OAAO,GACfP,QAAQQ,SAAS;IAEvB,IAAI,CAACH,YAAY,OAAO,AAACA,SAAiBI,GAAG,KAAK,cAAc,OAAO,AAACJ,SAAiBK,GAAG,KAAK,YAAY;QAC3G,OAAO;IACT;IAEA,OAAOL;AACT;AAEA,OAAO,eAAeM,mBACpBC,WAA2C;IAE3C,IAAI,CAACA,eAAeA,YAAYC,OAAO,KAAK,OAAO;QACjD,OAAO;IACT;IAEA,MAAMV,SAASS,YAAYZ,OAAO,IAAI;IACtC,MAAMc,MAAMF,YAAYE,GAAG;IAC3B,IAAI,CAACA,KAAK;QACR,OAAO;IACT;IAEA,MAAMC,gBAAgBb,uBAAuBC;IAC7C,IAAI,CAACY,eAAe;QAClB,OAAO;IACT;IAEA,IAAI;QACF,MAAMC,QAAQ,MAAMD,cAAcN,GAAG,CAACK;QACtC,IAAIE,UAAU,QAAQA,UAAUC,WAAW;YACzC,OAAO;QACT;QACA,IAAI,OAAOD,UAAU,UAAU;YAC7B,OAAOA;QACT;QACA,OAAOE,KAAKC,SAAS,CAACH;IACxB,EAAE,OAAM;QACN,OAAO;IACT;AACF;AAEA,OAAO,eAAeI,oBACpBR,WAA2C,EAC3CI,KAAa;IAEb,IAAI,CAACJ,eAAeA,YAAYC,OAAO,KAAK,OAAO;QACjD;IACF;IAEA,MAAMV,SAASS,YAAYZ,OAAO,IAAI;IACtC,MAAMc,MAAMF,YAAYE,GAAG;IAC3B,IAAI,CAACA,KAAK;QACR;IACF;IAEA,MAAMC,gBAAgBb,uBAAuBC;IAC7C,IAAI,CAACY,eAAe;QAClB;IACF;IAEA,IAAI;QACF,MAAMA,cAAcL,GAAG,CAACI,KAAKE;IAC/B,EAAE,OAAMK,GAAG;QACTpB,OAAOqB,KAAK,CAACD;IACb,4BAA4B;IAC9B;AACF"}
@@ -9,7 +9,6 @@ Object.defineProperty(exports, "ThemeManager", {
9
9
  }
10
10
  });
11
11
  const _constants = require("../constants");
12
- const _persistence = require("./persistence");
13
12
  function _define_property(obj, key, value) {
14
13
  if (key in obj) {
15
14
  Object.defineProperty(obj, key, {
@@ -47,19 +46,18 @@ let ThemeManager = class ThemeManager {
47
46
  ..._constants.DEFAULT_THEME,
48
47
  ...this.config.initial || {}
49
48
  };
50
- const persisted = await (0, _persistence.readPersistedValue)(this.config.persistence);
49
+ this.cache = context.cacheManager;
50
+ const { key = "vlian:kernel:theme" } = this.config.persistence || {};
51
+ const persisted = await this.cache.get(key, {
52
+ defaultValue: this.theme
53
+ });
51
54
  if (persisted !== null) {
52
- try {
53
- const parsed = JSON.parse(persisted);
54
- this.theme = {
55
- ...this.theme,
56
- ...parsed
57
- };
58
- } catch {
59
- // ignore parse errors
60
- }
55
+ this.theme = {
56
+ ...this.theme,
57
+ ...persisted
58
+ };
61
59
  } else {
62
- await (0, _persistence.writePersistedValue)(this.config.persistence, JSON.stringify(this.theme));
60
+ await this.cache.set(key, persisted);
63
61
  }
64
62
  applyThemeToDocument(this.theme);
65
63
  }
@@ -90,7 +88,8 @@ let ThemeManager = class ThemeManager {
90
88
  ...nextTheme
91
89
  };
92
90
  applyThemeToDocument(this.theme);
93
- await (0, _persistence.writePersistedValue)(this.config.persistence, JSON.stringify(this.theme));
91
+ const { key = "vlian:kernel:theme" } = this.config.persistence || {};
92
+ await this.cache?.set(key, this.theme);
94
93
  this.emit(this.theme, prev);
95
94
  }
96
95
  getSnapshot() {
@@ -100,6 +99,7 @@ let ThemeManager = class ThemeManager {
100
99
  _define_property(this, "theme", _constants.DEFAULT_THEME);
101
100
  _define_property(this, "config", _constants.DEFAULT_CONFIG.theme);
102
101
  _define_property(this, "listeners", new Set());
102
+ _define_property(this, "cache", undefined);
103
103
  }
104
104
  };
105
105
 
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/kernel/manager/themeManager.ts"],"sourcesContent":["import type { KernelConfig, KernelManager, KernelManagerContext, ThemeSnapshot } from '../types';\nimport { DEFAULT_CONFIG, DEFAULT_THEME } from '../constants';\nimport { readPersistedValue, writePersistedValue } from './persistence';\n\ntype ThemeListener = (next: ThemeSnapshot, prev: ThemeSnapshot) => void;\n\nfunction applyThemeToDocument(theme: ThemeSnapshot): void {\n if (typeof document === 'undefined') {\n return;\n }\n\n const root = document.documentElement;\n root.classList.remove('light', 'dark');\n\n const resolvedMode = theme.mode === 'system'\n ? (typeof window !== 'undefined' && window.matchMedia('(prefers-color-scheme: dark)').matches\n ? 'dark'\n : 'light')\n : theme.mode;\n\n root.classList.add(resolvedMode);\n\n if (theme.primaryColor) {\n root.style.setProperty('--app-primary-color', theme.primaryColor);\n }\n\n if (theme.tokens) {\n Object.entries(theme.tokens).forEach(([token, tokenValue]) => {\n root.style.setProperty(`--${token}`, String(tokenValue));\n });\n }\n}\n\nexport class ThemeManager implements KernelManager<ThemeSnapshot> {\n private theme: ThemeSnapshot = DEFAULT_THEME;\n private config: KernelConfig['theme'] = DEFAULT_CONFIG.theme;\n private listeners = new Set<ThemeListener>();\n\n public async initialize(context: KernelManagerContext): Promise<void> {\n this.config = context.config.theme;\n this.theme = { ...DEFAULT_THEME, ...(this.config.initial || {}) };\n\n const persisted = await readPersistedValue(this.config.persistence);\n if (persisted !== null) {\n try {\n const parsed = JSON.parse(persisted) as Partial<ThemeSnapshot>;\n this.theme = { ...this.theme, ...parsed };\n } catch {\n // ignore parse errors\n }\n } else {\n await writePersistedValue(this.config.persistence, JSON.stringify(this.theme));\n }\n\n applyThemeToDocument(this.theme);\n }\n\n public getTheme(): ThemeSnapshot {\n return { ...this.theme };\n }\n\n public subscribe(listener: ThemeListener): () => void {\n this.listeners.add(listener);\n return () => {\n this.listeners.delete(listener);\n };\n }\n\n private emit(next: ThemeSnapshot, prev: ThemeSnapshot): void {\n this.listeners.forEach((listener) => {\n listener({ ...next }, { ...prev });\n });\n }\n\n public async setTheme(nextTheme: ThemeSnapshot): Promise<void> {\n const prev = this.theme;\n this.theme = { ...this.theme, ...nextTheme };\n applyThemeToDocument(this.theme);\n await writePersistedValue(this.config.persistence, JSON.stringify(this.theme));\n this.emit(this.theme, prev);\n }\n\n public getSnapshot(): ThemeSnapshot {\n return this.getTheme();\n }\n}\n"],"names":["ThemeManager","applyThemeToDocument","theme","document","root","documentElement","classList","remove","resolvedMode","mode","window","matchMedia","matches","add","primaryColor","style","setProperty","tokens","Object","entries","forEach","token","tokenValue","String","initialize","context","config","DEFAULT_THEME","initial","persisted","readPersistedValue","persistence","parsed","JSON","parse","writePersistedValue","stringify","getTheme","subscribe","listener","listeners","delete","emit","next","prev","setTheme","nextTheme","getSnapshot","DEFAULT_CONFIG","Set"],"mappings":"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"}
1
+ {"version":3,"sources":["../../../src/kernel/manager/themeManager.ts"],"sourcesContent":["import type { KernelConfig, KernelManager, KernelManagerContext, ThemeSnapshot } from '../types';\nimport { DEFAULT_CONFIG, DEFAULT_THEME } from '../constants';\nimport type{StorageInstance} from \"@vlian/utils\";\n\ntype ThemeListener = (next: ThemeSnapshot, prev: ThemeSnapshot) => void;\n\nfunction applyThemeToDocument(theme: ThemeSnapshot): void {\n if (typeof document === 'undefined') {\n return;\n }\n\n const root = document.documentElement;\n root.classList.remove('light', 'dark');\n\n const resolvedMode = theme.mode === 'system'\n ? (typeof window !== 'undefined' && window.matchMedia('(prefers-color-scheme: dark)').matches\n ? 'dark'\n : 'light')\n : theme.mode;\n\n root.classList.add(resolvedMode);\n\n if (theme.primaryColor) {\n root.style.setProperty('--app-primary-color', theme.primaryColor);\n }\n\n if (theme.tokens) {\n Object.entries(theme.tokens).forEach(([token, tokenValue]) => {\n root.style.setProperty(`--${token}`, String(tokenValue));\n });\n }\n}\n\nexport class ThemeManager implements KernelManager<ThemeSnapshot> {\n private theme: ThemeSnapshot = DEFAULT_THEME;\n private config: KernelConfig['theme'] = DEFAULT_CONFIG.theme;\n private listeners = new Set<ThemeListener>();\n private cache: StorageInstance|undefined = undefined;\n\n public async initialize(context: KernelManagerContext): Promise<void> {\n this.config = context.config.theme;\n this.theme = { ...DEFAULT_THEME, ...(this.config.initial || {}) };\n\n this.cache = context.cacheManager;\n\n const { key = \"vlian:kernel:theme\" } = this.config.persistence || {};\n\n const persisted = await this.cache.get<ThemeSnapshot>(key, {\n defaultValue: this.theme\n })\n\n if (persisted !== null) {\n this.theme = { ...this.theme, ...persisted };\n } else {\n await this.cache.set(key, persisted);\n }\n\n applyThemeToDocument(this.theme);\n }\n\n public getTheme(): ThemeSnapshot {\n return { ...this.theme };\n }\n\n public subscribe(listener: ThemeListener): () => void {\n this.listeners.add(listener);\n return () => {\n this.listeners.delete(listener);\n };\n }\n\n private emit(next: ThemeSnapshot, prev: ThemeSnapshot): void {\n this.listeners.forEach((listener) => {\n listener({ ...next }, { ...prev });\n });\n }\n\n public async setTheme(nextTheme: ThemeSnapshot): Promise<void> {\n const prev = this.theme;\n this.theme = { ...this.theme, ...nextTheme };\n applyThemeToDocument(this.theme);\n\n const { key = \"vlian:kernel:theme\" } = this.config.persistence || {};\n\n await this.cache?.set(key, this.theme)\n\n this.emit(this.theme, prev);\n }\n\n public getSnapshot(): ThemeSnapshot {\n return this.getTheme();\n }\n}\n"],"names":["ThemeManager","applyThemeToDocument","theme","document","root","documentElement","classList","remove","resolvedMode","mode","window","matchMedia","matches","add","primaryColor","style","setProperty","tokens","Object","entries","forEach","token","tokenValue","String","initialize","context","config","DEFAULT_THEME","initial","cache","cacheManager","key","persistence","persisted","get","defaultValue","set","getTheme","subscribe","listener","listeners","delete","emit","next","prev","setTheme","nextTheme","getSnapshot","DEFAULT_CONFIG","Set","undefined"],"mappings":"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"}
@@ -4,6 +4,7 @@ export declare class ThemeManager implements KernelManager<ThemeSnapshot> {
4
4
  private theme;
5
5
  private config;
6
6
  private listeners;
7
+ private cache;
7
8
  initialize(context: KernelManagerContext): Promise<void>;
8
9
  getTheme(): ThemeSnapshot;
9
10
  subscribe(listener: ThemeListener): () => void;
@@ -12,7 +12,6 @@ function _define_property(obj, key, value) {
12
12
  return obj;
13
13
  }
14
14
  import { DEFAULT_CONFIG, DEFAULT_THEME } from "../constants";
15
- import { readPersistedValue, writePersistedValue } from "./persistence";
16
15
  function applyThemeToDocument(theme) {
17
16
  if (typeof document === 'undefined') {
18
17
  return;
@@ -37,19 +36,18 @@ export class ThemeManager {
37
36
  ...DEFAULT_THEME,
38
37
  ...this.config.initial || {}
39
38
  };
40
- const persisted = await readPersistedValue(this.config.persistence);
39
+ this.cache = context.cacheManager;
40
+ const { key = "vlian:kernel:theme" } = this.config.persistence || {};
41
+ const persisted = await this.cache.get(key, {
42
+ defaultValue: this.theme
43
+ });
41
44
  if (persisted !== null) {
42
- try {
43
- const parsed = JSON.parse(persisted);
44
- this.theme = {
45
- ...this.theme,
46
- ...parsed
47
- };
48
- } catch {
49
- // ignore parse errors
50
- }
45
+ this.theme = {
46
+ ...this.theme,
47
+ ...persisted
48
+ };
51
49
  } else {
52
- await writePersistedValue(this.config.persistence, JSON.stringify(this.theme));
50
+ await this.cache.set(key, persisted);
53
51
  }
54
52
  applyThemeToDocument(this.theme);
55
53
  }
@@ -80,7 +78,8 @@ export class ThemeManager {
80
78
  ...nextTheme
81
79
  };
82
80
  applyThemeToDocument(this.theme);
83
- await writePersistedValue(this.config.persistence, JSON.stringify(this.theme));
81
+ const { key = "vlian:kernel:theme" } = this.config.persistence || {};
82
+ await this.cache?.set(key, this.theme);
84
83
  this.emit(this.theme, prev);
85
84
  }
86
85
  getSnapshot() {
@@ -90,6 +89,7 @@ export class ThemeManager {
90
89
  _define_property(this, "theme", DEFAULT_THEME);
91
90
  _define_property(this, "config", DEFAULT_CONFIG.theme);
92
91
  _define_property(this, "listeners", new Set());
92
+ _define_property(this, "cache", undefined);
93
93
  }
94
94
  }
95
95
 
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/kernel/manager/themeManager.ts"],"sourcesContent":["import type { KernelConfig, KernelManager, KernelManagerContext, ThemeSnapshot } from '../types';\nimport { DEFAULT_CONFIG, DEFAULT_THEME } from '../constants';\nimport { readPersistedValue, writePersistedValue } from './persistence';\n\ntype ThemeListener = (next: ThemeSnapshot, prev: ThemeSnapshot) => void;\n\nfunction applyThemeToDocument(theme: ThemeSnapshot): void {\n if (typeof document === 'undefined') {\n return;\n }\n\n const root = document.documentElement;\n root.classList.remove('light', 'dark');\n\n const resolvedMode = theme.mode === 'system'\n ? (typeof window !== 'undefined' && window.matchMedia('(prefers-color-scheme: dark)').matches\n ? 'dark'\n : 'light')\n : theme.mode;\n\n root.classList.add(resolvedMode);\n\n if (theme.primaryColor) {\n root.style.setProperty('--app-primary-color', theme.primaryColor);\n }\n\n if (theme.tokens) {\n Object.entries(theme.tokens).forEach(([token, tokenValue]) => {\n root.style.setProperty(`--${token}`, String(tokenValue));\n });\n }\n}\n\nexport class ThemeManager implements KernelManager<ThemeSnapshot> {\n private theme: ThemeSnapshot = DEFAULT_THEME;\n private config: KernelConfig['theme'] = DEFAULT_CONFIG.theme;\n private listeners = new Set<ThemeListener>();\n\n public async initialize(context: KernelManagerContext): Promise<void> {\n this.config = context.config.theme;\n this.theme = { ...DEFAULT_THEME, ...(this.config.initial || {}) };\n\n const persisted = await readPersistedValue(this.config.persistence);\n if (persisted !== null) {\n try {\n const parsed = JSON.parse(persisted) as Partial<ThemeSnapshot>;\n this.theme = { ...this.theme, ...parsed };\n } catch {\n // ignore parse errors\n }\n } else {\n await writePersistedValue(this.config.persistence, JSON.stringify(this.theme));\n }\n\n applyThemeToDocument(this.theme);\n }\n\n public getTheme(): ThemeSnapshot {\n return { ...this.theme };\n }\n\n public subscribe(listener: ThemeListener): () => void {\n this.listeners.add(listener);\n return () => {\n this.listeners.delete(listener);\n };\n }\n\n private emit(next: ThemeSnapshot, prev: ThemeSnapshot): void {\n this.listeners.forEach((listener) => {\n listener({ ...next }, { ...prev });\n });\n }\n\n public async setTheme(nextTheme: ThemeSnapshot): Promise<void> {\n const prev = this.theme;\n this.theme = { ...this.theme, ...nextTheme };\n applyThemeToDocument(this.theme);\n await writePersistedValue(this.config.persistence, JSON.stringify(this.theme));\n this.emit(this.theme, prev);\n }\n\n public getSnapshot(): ThemeSnapshot {\n return this.getTheme();\n }\n}\n"],"names":["DEFAULT_CONFIG","DEFAULT_THEME","readPersistedValue","writePersistedValue","applyThemeToDocument","theme","document","root","documentElement","classList","remove","resolvedMode","mode","window","matchMedia","matches","add","primaryColor","style","setProperty","tokens","Object","entries","forEach","token","tokenValue","String","ThemeManager","initialize","context","config","initial","persisted","persistence","parsed","JSON","parse","stringify","getTheme","subscribe","listener","listeners","delete","emit","next","prev","setTheme","nextTheme","getSnapshot","Set"],"mappings":"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"}
1
+ {"version":3,"sources":["../../../src/kernel/manager/themeManager.ts"],"sourcesContent":["import type { KernelConfig, KernelManager, KernelManagerContext, ThemeSnapshot } from '../types';\nimport { DEFAULT_CONFIG, DEFAULT_THEME } from '../constants';\nimport type{StorageInstance} from \"@vlian/utils\";\n\ntype ThemeListener = (next: ThemeSnapshot, prev: ThemeSnapshot) => void;\n\nfunction applyThemeToDocument(theme: ThemeSnapshot): void {\n if (typeof document === 'undefined') {\n return;\n }\n\n const root = document.documentElement;\n root.classList.remove('light', 'dark');\n\n const resolvedMode = theme.mode === 'system'\n ? (typeof window !== 'undefined' && window.matchMedia('(prefers-color-scheme: dark)').matches\n ? 'dark'\n : 'light')\n : theme.mode;\n\n root.classList.add(resolvedMode);\n\n if (theme.primaryColor) {\n root.style.setProperty('--app-primary-color', theme.primaryColor);\n }\n\n if (theme.tokens) {\n Object.entries(theme.tokens).forEach(([token, tokenValue]) => {\n root.style.setProperty(`--${token}`, String(tokenValue));\n });\n }\n}\n\nexport class ThemeManager implements KernelManager<ThemeSnapshot> {\n private theme: ThemeSnapshot = DEFAULT_THEME;\n private config: KernelConfig['theme'] = DEFAULT_CONFIG.theme;\n private listeners = new Set<ThemeListener>();\n private cache: StorageInstance|undefined = undefined;\n\n public async initialize(context: KernelManagerContext): Promise<void> {\n this.config = context.config.theme;\n this.theme = { ...DEFAULT_THEME, ...(this.config.initial || {}) };\n\n this.cache = context.cacheManager;\n\n const { key = \"vlian:kernel:theme\" } = this.config.persistence || {};\n\n const persisted = await this.cache.get<ThemeSnapshot>(key, {\n defaultValue: this.theme\n })\n\n if (persisted !== null) {\n this.theme = { ...this.theme, ...persisted };\n } else {\n await this.cache.set(key, persisted);\n }\n\n applyThemeToDocument(this.theme);\n }\n\n public getTheme(): ThemeSnapshot {\n return { ...this.theme };\n }\n\n public subscribe(listener: ThemeListener): () => void {\n this.listeners.add(listener);\n return () => {\n this.listeners.delete(listener);\n };\n }\n\n private emit(next: ThemeSnapshot, prev: ThemeSnapshot): void {\n this.listeners.forEach((listener) => {\n listener({ ...next }, { ...prev });\n });\n }\n\n public async setTheme(nextTheme: ThemeSnapshot): Promise<void> {\n const prev = this.theme;\n this.theme = { ...this.theme, ...nextTheme };\n applyThemeToDocument(this.theme);\n\n const { key = \"vlian:kernel:theme\" } = this.config.persistence || {};\n\n await this.cache?.set(key, this.theme)\n\n this.emit(this.theme, prev);\n }\n\n public getSnapshot(): ThemeSnapshot {\n return this.getTheme();\n }\n}\n"],"names":["DEFAULT_CONFIG","DEFAULT_THEME","applyThemeToDocument","theme","document","root","documentElement","classList","remove","resolvedMode","mode","window","matchMedia","matches","add","primaryColor","style","setProperty","tokens","Object","entries","forEach","token","tokenValue","String","ThemeManager","initialize","context","config","initial","cache","cacheManager","key","persistence","persisted","get","defaultValue","set","getTheme","subscribe","listener","listeners","delete","emit","next","prev","setTheme","nextTheme","getSnapshot","Set","undefined"],"mappings":"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"}
@@ -2,6 +2,7 @@ import type { LogLevel } from '@vlian/logger';
2
2
  import type { LangType } from '../library/locale/types';
3
3
  import type { StartOptions as CoreStartOptions } from '../core/types';
4
4
  import type { StorageOptions } from '../types';
5
+ import type { StorageInstance } from "@vlian/utils";
5
6
  export type KernelInstanceId = string;
6
7
  export type KernelStorageDriver = 'localStorage' | 'sessionStorage' | 'indexedDB' | 'none';
7
8
  export interface ThemeSnapshot {
@@ -49,6 +50,7 @@ export interface KernelTimingMetric {
49
50
  export interface KernelManagerContext {
50
51
  instanceId: KernelInstanceId;
51
52
  config: KernelConfig;
53
+ cacheManager: StorageInstance;
52
54
  }
53
55
  export interface KernelManager<TSnapshot = unknown> {
54
56
  initialize: (context: KernelManagerContext) => Promise<void> | void;