@vlian/framework 1.2.55 → 1.2.57
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.
- package/dist/analytics.umd.js +1 -1
- package/dist/core/initialization/initialization.cjs.map +1 -1
- package/dist/core/initialization/initialization.js +3 -3
- package/dist/core/initialization/initialization.js.map +1 -1
- package/dist/core/router/validation/RouterConfigValidator.d.ts +2 -2
- package/dist/core/router/validation/schema.d.ts +3 -3
- package/dist/index.umd.js +295 -229
- package/dist/index.umd.js.map +1 -1
- package/dist/kernel/kernel.cjs +1 -1
- package/dist/kernel/kernel.cjs.map +1 -1
- package/dist/kernel/kernel.js +1 -1
- package/dist/kernel/kernel.js.map +1 -1
- package/dist/kernel/manager/i18n/I18nManager.cjs +93 -0
- package/dist/kernel/manager/i18n/I18nManager.cjs.map +1 -0
- package/dist/kernel/manager/i18n/I18nManager.d.ts +15 -0
- package/dist/kernel/manager/i18n/I18nManager.js +83 -0
- package/dist/kernel/manager/i18n/I18nManager.js.map +1 -0
- package/dist/kernel/manager/i18n/i18n.persistence.cjs +62 -0
- package/dist/kernel/manager/i18n/i18n.persistence.cjs.map +1 -0
- package/dist/kernel/manager/i18n/i18n.persistence.d.ts +5 -0
- package/dist/kernel/manager/i18n/i18n.persistence.js +41 -0
- package/dist/kernel/manager/i18n/i18n.persistence.js.map +1 -0
- package/dist/kernel/manager/i18n/i18n.schema.cjs +88 -0
- package/dist/kernel/manager/i18n/i18n.schema.cjs.map +1 -0
- package/dist/kernel/manager/i18n/i18n.schema.d.ts +6 -0
- package/dist/kernel/manager/i18n/i18n.schema.js +64 -0
- package/dist/kernel/manager/i18n/i18n.schema.js.map +1 -0
- package/dist/kernel/manager/i18n/index.cjs +13 -0
- package/dist/kernel/manager/i18n/index.cjs.map +1 -0
- package/dist/kernel/manager/i18n/index.d.ts +1 -0
- package/dist/kernel/manager/i18n/index.js +3 -0
- package/dist/kernel/manager/i18n/index.js.map +1 -0
- package/dist/kernel/manager/i18nManager.cjs +2 -77
- package/dist/kernel/manager/i18nManager.cjs.map +1 -1
- package/dist/kernel/manager/i18nManager.d.ts +1 -13
- package/dist/kernel/manager/i18nManager.js +1 -76
- package/dist/kernel/manager/i18nManager.js.map +1 -1
- package/dist/kernel/manager/logger/LoggerManager.cjs +109 -0
- package/dist/kernel/manager/logger/LoggerManager.cjs.map +1 -0
- package/dist/kernel/manager/logger/LoggerManager.d.ts +21 -0
- package/dist/kernel/manager/logger/LoggerManager.js +99 -0
- package/dist/kernel/manager/logger/LoggerManager.js.map +1 -0
- package/dist/kernel/manager/logger/index.cjs +13 -0
- package/dist/kernel/manager/logger/index.cjs.map +1 -0
- package/dist/kernel/manager/logger/index.d.ts +1 -0
- package/dist/kernel/manager/logger/index.js +3 -0
- package/dist/kernel/manager/logger/index.js.map +1 -0
- package/dist/kernel/manager/logger/logger.persistence.cjs +64 -0
- package/dist/kernel/manager/logger/logger.persistence.cjs.map +1 -0
- package/dist/kernel/manager/logger/logger.persistence.d.ts +6 -0
- package/dist/kernel/manager/logger/logger.persistence.js +43 -0
- package/dist/kernel/manager/logger/logger.persistence.js.map +1 -0
- package/dist/kernel/manager/logger/logger.schema.cjs +76 -0
- package/dist/kernel/manager/logger/logger.schema.cjs.map +1 -0
- package/dist/kernel/manager/logger/logger.schema.d.ts +8 -0
- package/dist/kernel/manager/logger/logger.schema.js +55 -0
- package/dist/kernel/manager/logger/logger.schema.js.map +1 -0
- package/dist/kernel/manager/loggerManager.cjs +2 -103
- package/dist/kernel/manager/loggerManager.cjs.map +1 -1
- package/dist/kernel/manager/loggerManager.d.ts +1 -18
- package/dist/kernel/manager/loggerManager.js +1 -102
- package/dist/kernel/manager/loggerManager.js.map +1 -1
- package/dist/kernel/types.d.ts +3 -3
- package/dist/kernel/types.js.map +1 -1
- package/dist/library/locale/index.cjs +8 -34
- package/dist/library/locale/index.cjs.map +1 -1
- package/dist/library/locale/index.d.ts +4 -4
- package/dist/library/locale/index.js +5 -34
- package/dist/library/locale/index.js.map +1 -1
- package/dist/state.umd.js +1 -1
- package/package.json +3 -1
package/dist/kernel/kernel.cjs
CHANGED
|
@@ -203,7 +203,7 @@ let Kernel = class Kernel {
|
|
|
203
203
|
..._constants.DEFAULT_I18N,
|
|
204
204
|
...loadedI18nInitial,
|
|
205
205
|
...options.config?.i18n?.initial || {},
|
|
206
|
-
resources: isRecord(optionLocale) ? optionLocale : loadedI18nInitial.resources
|
|
206
|
+
resources: isRecord(optionLocale) ? optionLocale : loadedI18nInitial.resources ?? options.config?.i18n?.initial?.resources
|
|
207
207
|
}
|
|
208
208
|
}
|
|
209
209
|
};
|
|
@@ -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 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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"}
|
|
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 ?? options.config?.i18n?.initial?.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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"}
|
package/dist/kernel/kernel.js
CHANGED
|
@@ -179,7 +179,7 @@ export class Kernel {
|
|
|
179
179
|
...DEFAULT_I18N,
|
|
180
180
|
...loadedI18nInitial,
|
|
181
181
|
...options.config?.i18n?.initial || {},
|
|
182
|
-
resources: isRecord(optionLocale) ? optionLocale : loadedI18nInitial.resources
|
|
182
|
+
resources: isRecord(optionLocale) ? optionLocale : loadedI18nInitial.resources ?? options.config?.i18n?.initial?.resources
|
|
183
183
|
}
|
|
184
184
|
}
|
|
185
185
|
};
|
|
@@ -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 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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"}
|
|
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 ?? options.config?.i18n?.initial?.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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"}
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", {
|
|
3
|
+
value: true
|
|
4
|
+
});
|
|
5
|
+
Object.defineProperty(exports, "I18nManager", {
|
|
6
|
+
enumerable: true,
|
|
7
|
+
get: function() {
|
|
8
|
+
return I18nManager;
|
|
9
|
+
}
|
|
10
|
+
});
|
|
11
|
+
const _library = require("../../../library");
|
|
12
|
+
const _constants = require("../../constants");
|
|
13
|
+
const _i18npersistence = require("./i18n.persistence");
|
|
14
|
+
const _i18nschema = require("./i18n.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 I18nManager = class I18nManager {
|
|
29
|
+
async initialize(context) {
|
|
30
|
+
this.config = context.config.i18n;
|
|
31
|
+
this.cacheManager = context.cacheManager;
|
|
32
|
+
const initialSnapshot = (0, _i18nschema.normalizeI18nSnapshot)(this.config.initial || {}, _constants.DEFAULT_I18N);
|
|
33
|
+
this.snapshot = await (0, _i18npersistence.loadI18nFromCache)(this.cacheManager, this.config.persistence, initialSnapshot);
|
|
34
|
+
await (0, _library.setupI18n)({
|
|
35
|
+
interpolation: {
|
|
36
|
+
escapeValue: false
|
|
37
|
+
},
|
|
38
|
+
lng: this.snapshot.locale || "zh-CN",
|
|
39
|
+
resources: this.snapshot.resources
|
|
40
|
+
});
|
|
41
|
+
await (0, _library.setLang)(this.snapshot.locale);
|
|
42
|
+
this.initialized = true;
|
|
43
|
+
}
|
|
44
|
+
getSnapshot() {
|
|
45
|
+
return (0, _i18nschema.cloneI18nSnapshot)(this.snapshot);
|
|
46
|
+
}
|
|
47
|
+
subscribe(listener) {
|
|
48
|
+
this.listeners.add(listener);
|
|
49
|
+
return ()=>{
|
|
50
|
+
this.listeners.delete(listener);
|
|
51
|
+
};
|
|
52
|
+
}
|
|
53
|
+
async setLocale(locale) {
|
|
54
|
+
this.ensureInitialized();
|
|
55
|
+
const prevSnapshot = this.snapshot;
|
|
56
|
+
const nextSnapshot = (0, _i18nschema.mergeI18nSnapshot)(prevSnapshot, {
|
|
57
|
+
locale
|
|
58
|
+
});
|
|
59
|
+
if ((0, _i18nschema.isI18nEqual)(prevSnapshot, nextSnapshot)) {
|
|
60
|
+
return;
|
|
61
|
+
}
|
|
62
|
+
this.snapshot = nextSnapshot;
|
|
63
|
+
// set lang
|
|
64
|
+
await (0, _library.setLang)(this.snapshot.locale);
|
|
65
|
+
if (this.cacheManager) {
|
|
66
|
+
await (0, _i18npersistence.saveI18nToCache)(this.cacheManager, this.config.persistence, this.snapshot);
|
|
67
|
+
}
|
|
68
|
+
this.emit(this.snapshot, prevSnapshot);
|
|
69
|
+
}
|
|
70
|
+
ensureInitialized() {
|
|
71
|
+
if (!this.initialized) {
|
|
72
|
+
throw new Error('I18nManager must be initialized before use.');
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
emit(next, prev) {
|
|
76
|
+
for (const listener of this.listeners){
|
|
77
|
+
try {
|
|
78
|
+
listener((0, _i18nschema.cloneI18nSnapshot)(next), (0, _i18nschema.cloneI18nSnapshot)(prev));
|
|
79
|
+
} catch {
|
|
80
|
+
// Keep notifying remaining listeners even if one fails.
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
constructor(){
|
|
85
|
+
_define_property(this, "snapshot", (0, _i18nschema.cloneI18nSnapshot)(_constants.DEFAULT_I18N));
|
|
86
|
+
_define_property(this, "config", _constants.DEFAULT_CONFIG.i18n);
|
|
87
|
+
_define_property(this, "listeners", new Set());
|
|
88
|
+
_define_property(this, "cacheManager", null);
|
|
89
|
+
_define_property(this, "initialized", false);
|
|
90
|
+
}
|
|
91
|
+
};
|
|
92
|
+
|
|
93
|
+
//# sourceMappingURL=I18nManager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../../src/kernel/manager/i18n/I18nManager.ts"],"sourcesContent":["import type { StorageInstance } from '@vlian/utils';\nimport { setupI18n, setLang } from '../../../library';\nimport { DEFAULT_CONFIG, DEFAULT_I18N } from '../../constants';\nimport type { I18nSnapshot, KernelConfig, KernelManager, KernelManagerContext } from '../../types';\nimport { loadI18nFromCache, saveI18nToCache } from './i18n.persistence';\nimport {\n cloneI18nSnapshot,\n isI18nEqual,\n mergeI18nSnapshot,\n normalizeI18nSnapshot,\n type I18nListener,\n} from './i18n.schema';\n\nexport class I18nManager implements KernelManager<I18nSnapshot> {\n private snapshot: I18nSnapshot = cloneI18nSnapshot(DEFAULT_I18N);\n private config: KernelConfig['i18n'] = DEFAULT_CONFIG.i18n;\n private listeners = new Set<I18nListener>();\n private cacheManager: StorageInstance | null = null;\n private initialized = false;\n\n public async initialize(context: KernelManagerContext): Promise<void> {\n this.config = context.config.i18n;\n this.cacheManager = context.cacheManager;\n\n const initialSnapshot = normalizeI18nSnapshot(this.config.initial || {}, DEFAULT_I18N);\n this.snapshot = await loadI18nFromCache(this.cacheManager, this.config.persistence, initialSnapshot);\n\n await setupI18n({\n interpolation: {\n escapeValue: false,\n },\n lng: this.snapshot.locale || \"zh-CN\",\n resources: this.snapshot.resources\n });\n await setLang(this.snapshot.locale);\n this.initialized = true;\n }\n\n public getSnapshot(): I18nSnapshot {\n return cloneI18nSnapshot(this.snapshot);\n }\n\n public subscribe(listener: I18nListener): () => void {\n this.listeners.add(listener);\n\n return () => {\n this.listeners.delete(listener);\n };\n }\n\n public async setLocale(locale: I18nSnapshot['locale']): Promise<void> {\n this.ensureInitialized();\n\n const prevSnapshot = this.snapshot;\n const nextSnapshot = mergeI18nSnapshot(prevSnapshot, { locale });\n\n if (isI18nEqual(prevSnapshot, nextSnapshot)) {\n return;\n }\n\n this.snapshot = nextSnapshot;\n\n // set lang\n await setLang(this.snapshot.locale);\n\n if (this.cacheManager) {\n await saveI18nToCache(this.cacheManager, this.config.persistence, this.snapshot);\n }\n\n this.emit(this.snapshot, prevSnapshot);\n }\n\n private ensureInitialized(): void {\n if (!this.initialized) {\n throw new Error('I18nManager must be initialized before use.');\n }\n }\n\n private emit(next: I18nSnapshot, prev: I18nSnapshot): void {\n for (const listener of this.listeners) {\n try {\n listener(cloneI18nSnapshot(next), cloneI18nSnapshot(prev));\n } catch {\n // Keep notifying remaining listeners even if one fails.\n }\n }\n }\n}\n"],"names":["I18nManager","initialize","context","config","i18n","cacheManager","initialSnapshot","normalizeI18nSnapshot","initial","DEFAULT_I18N","snapshot","loadI18nFromCache","persistence","setupI18n","interpolation","escapeValue","lng","locale","resources","setLang","initialized","getSnapshot","cloneI18nSnapshot","subscribe","listener","listeners","add","delete","setLocale","ensureInitialized","prevSnapshot","nextSnapshot","mergeI18nSnapshot","isI18nEqual","saveI18nToCache","emit","Error","next","prev","DEFAULT_CONFIG","Set"],"mappings":";;;;+BAaaA;;;eAAAA;;;yBAZsB;2BACU;iCAEM;4BAO5C;;;;;;;;;;;;;;AAEA,IAAA,AAAMA,cAAN,MAAMA;IAOX,MAAaC,WAAWC,OAA6B,EAAiB;QACpE,IAAI,CAACC,MAAM,GAAGD,QAAQC,MAAM,CAACC,IAAI;QACjC,IAAI,CAACC,YAAY,GAAGH,QAAQG,YAAY;QAExC,MAAMC,kBAAkBC,IAAAA,iCAAqB,EAAC,IAAI,CAACJ,MAAM,CAACK,OAAO,IAAI,CAAC,GAAGC,uBAAY;QACrF,IAAI,CAACC,QAAQ,GAAG,MAAMC,IAAAA,kCAAiB,EAAC,IAAI,CAACN,YAAY,EAAE,IAAI,CAACF,MAAM,CAACS,WAAW,EAAEN;QAEpF,MAAMO,IAAAA,kBAAS,EAAC;YACdC,eAAe;gBACbC,aAAa;YACf;YACAC,KAAK,IAAI,CAACN,QAAQ,CAACO,MAAM,IAAI;YAC7BC,WAAW,IAAI,CAACR,QAAQ,CAACQ,SAAS;QACpC;QACA,MAAMC,IAAAA,gBAAO,EAAC,IAAI,CAACT,QAAQ,CAACO,MAAM;QAClC,IAAI,CAACG,WAAW,GAAG;IACrB;IAEOC,cAA4B;QACjC,OAAOC,IAAAA,6BAAiB,EAAC,IAAI,CAACZ,QAAQ;IACxC;IAEOa,UAAUC,QAAsB,EAAc;QACnD,IAAI,CAACC,SAAS,CAACC,GAAG,CAACF;QAEnB,OAAO;YACL,IAAI,CAACC,SAAS,CAACE,MAAM,CAACH;QACxB;IACF;IAEA,MAAaI,UAAUX,MAA8B,EAAiB;QACpE,IAAI,CAACY,iBAAiB;QAEtB,MAAMC,eAAe,IAAI,CAACpB,QAAQ;QAClC,MAAMqB,eAAeC,IAAAA,6BAAiB,EAACF,cAAc;YAAEb;QAAO;QAE9D,IAAIgB,IAAAA,uBAAW,EAACH,cAAcC,eAAe;YAC3C;QACF;QAEA,IAAI,CAACrB,QAAQ,GAAGqB;QAEhB,WAAW;QACX,MAAMZ,IAAAA,gBAAO,EAAC,IAAI,CAACT,QAAQ,CAACO,MAAM;QAElC,IAAI,IAAI,CAACZ,YAAY,EAAE;YACrB,MAAM6B,IAAAA,gCAAe,EAAC,IAAI,CAAC7B,YAAY,EAAE,IAAI,CAACF,MAAM,CAACS,WAAW,EAAE,IAAI,CAACF,QAAQ;QACjF;QAEA,IAAI,CAACyB,IAAI,CAAC,IAAI,CAACzB,QAAQ,EAAEoB;IAC3B;IAEQD,oBAA0B;QAChC,IAAI,CAAC,IAAI,CAACT,WAAW,EAAE;YACrB,MAAM,IAAIgB,MAAM;QAClB;IACF;IAEQD,KAAKE,IAAkB,EAAEC,IAAkB,EAAQ;QACzD,KAAK,MAAMd,YAAY,IAAI,CAACC,SAAS,CAAE;YACrC,IAAI;gBACFD,SAASF,IAAAA,6BAAiB,EAACe,OAAOf,IAAAA,6BAAiB,EAACgB;YACtD,EAAE,OAAM;YACN,wDAAwD;YAC1D;QACF;IACF;;QAxEA,uBAAQ5B,YAAyBY,IAAAA,6BAAiB,EAACb,uBAAY;QAC/D,uBAAQN,UAA+BoC,yBAAc,CAACnC,IAAI;QAC1D,uBAAQqB,aAAY,IAAIe;QACxB,uBAAQnC,gBAAuC;QAC/C,uBAAQe,eAAc;;AAqExB"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import type { I18nSnapshot, KernelManager, KernelManagerContext } from '../../types';
|
|
2
|
+
import { type I18nListener } from './i18n.schema';
|
|
3
|
+
export declare class I18nManager implements KernelManager<I18nSnapshot> {
|
|
4
|
+
private snapshot;
|
|
5
|
+
private config;
|
|
6
|
+
private listeners;
|
|
7
|
+
private cacheManager;
|
|
8
|
+
private initialized;
|
|
9
|
+
initialize(context: KernelManagerContext): Promise<void>;
|
|
10
|
+
getSnapshot(): I18nSnapshot;
|
|
11
|
+
subscribe(listener: I18nListener): () => void;
|
|
12
|
+
setLocale(locale: I18nSnapshot['locale']): Promise<void>;
|
|
13
|
+
private ensureInitialized;
|
|
14
|
+
private emit;
|
|
15
|
+
}
|
|
@@ -0,0 +1,83 @@
|
|
|
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 { setupI18n, setLang } from "../../../library";
|
|
15
|
+
import { DEFAULT_CONFIG, DEFAULT_I18N } from "../../constants";
|
|
16
|
+
import { loadI18nFromCache, saveI18nToCache } from "./i18n.persistence";
|
|
17
|
+
import { cloneI18nSnapshot, isI18nEqual, mergeI18nSnapshot, normalizeI18nSnapshot } from "./i18n.schema";
|
|
18
|
+
export class I18nManager {
|
|
19
|
+
async initialize(context) {
|
|
20
|
+
this.config = context.config.i18n;
|
|
21
|
+
this.cacheManager = context.cacheManager;
|
|
22
|
+
const initialSnapshot = normalizeI18nSnapshot(this.config.initial || {}, DEFAULT_I18N);
|
|
23
|
+
this.snapshot = await loadI18nFromCache(this.cacheManager, this.config.persistence, initialSnapshot);
|
|
24
|
+
await setupI18n({
|
|
25
|
+
interpolation: {
|
|
26
|
+
escapeValue: false
|
|
27
|
+
},
|
|
28
|
+
lng: this.snapshot.locale || "zh-CN",
|
|
29
|
+
resources: this.snapshot.resources
|
|
30
|
+
});
|
|
31
|
+
await setLang(this.snapshot.locale);
|
|
32
|
+
this.initialized = true;
|
|
33
|
+
}
|
|
34
|
+
getSnapshot() {
|
|
35
|
+
return cloneI18nSnapshot(this.snapshot);
|
|
36
|
+
}
|
|
37
|
+
subscribe(listener) {
|
|
38
|
+
this.listeners.add(listener);
|
|
39
|
+
return ()=>{
|
|
40
|
+
this.listeners.delete(listener);
|
|
41
|
+
};
|
|
42
|
+
}
|
|
43
|
+
async setLocale(locale) {
|
|
44
|
+
this.ensureInitialized();
|
|
45
|
+
const prevSnapshot = this.snapshot;
|
|
46
|
+
const nextSnapshot = mergeI18nSnapshot(prevSnapshot, {
|
|
47
|
+
locale
|
|
48
|
+
});
|
|
49
|
+
if (isI18nEqual(prevSnapshot, nextSnapshot)) {
|
|
50
|
+
return;
|
|
51
|
+
}
|
|
52
|
+
this.snapshot = nextSnapshot;
|
|
53
|
+
// set lang
|
|
54
|
+
await setLang(this.snapshot.locale);
|
|
55
|
+
if (this.cacheManager) {
|
|
56
|
+
await saveI18nToCache(this.cacheManager, this.config.persistence, this.snapshot);
|
|
57
|
+
}
|
|
58
|
+
this.emit(this.snapshot, prevSnapshot);
|
|
59
|
+
}
|
|
60
|
+
ensureInitialized() {
|
|
61
|
+
if (!this.initialized) {
|
|
62
|
+
throw new Error('I18nManager must be initialized before use.');
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
emit(next, prev) {
|
|
66
|
+
for (const listener of this.listeners){
|
|
67
|
+
try {
|
|
68
|
+
listener(cloneI18nSnapshot(next), cloneI18nSnapshot(prev));
|
|
69
|
+
} catch {
|
|
70
|
+
// Keep notifying remaining listeners even if one fails.
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
constructor(){
|
|
75
|
+
_define_property(this, "snapshot", cloneI18nSnapshot(DEFAULT_I18N));
|
|
76
|
+
_define_property(this, "config", DEFAULT_CONFIG.i18n);
|
|
77
|
+
_define_property(this, "listeners", new Set());
|
|
78
|
+
_define_property(this, "cacheManager", null);
|
|
79
|
+
_define_property(this, "initialized", false);
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
//# sourceMappingURL=I18nManager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../../src/kernel/manager/i18n/I18nManager.ts"],"sourcesContent":["import type { StorageInstance } from '@vlian/utils';\nimport { setupI18n, setLang } from '../../../library';\nimport { DEFAULT_CONFIG, DEFAULT_I18N } from '../../constants';\nimport type { I18nSnapshot, KernelConfig, KernelManager, KernelManagerContext } from '../../types';\nimport { loadI18nFromCache, saveI18nToCache } from './i18n.persistence';\nimport {\n cloneI18nSnapshot,\n isI18nEqual,\n mergeI18nSnapshot,\n normalizeI18nSnapshot,\n type I18nListener,\n} from './i18n.schema';\n\nexport class I18nManager implements KernelManager<I18nSnapshot> {\n private snapshot: I18nSnapshot = cloneI18nSnapshot(DEFAULT_I18N);\n private config: KernelConfig['i18n'] = DEFAULT_CONFIG.i18n;\n private listeners = new Set<I18nListener>();\n private cacheManager: StorageInstance | null = null;\n private initialized = false;\n\n public async initialize(context: KernelManagerContext): Promise<void> {\n this.config = context.config.i18n;\n this.cacheManager = context.cacheManager;\n\n const initialSnapshot = normalizeI18nSnapshot(this.config.initial || {}, DEFAULT_I18N);\n this.snapshot = await loadI18nFromCache(this.cacheManager, this.config.persistence, initialSnapshot);\n\n await setupI18n({\n interpolation: {\n escapeValue: false,\n },\n lng: this.snapshot.locale || \"zh-CN\",\n resources: this.snapshot.resources\n });\n await setLang(this.snapshot.locale);\n this.initialized = true;\n }\n\n public getSnapshot(): I18nSnapshot {\n return cloneI18nSnapshot(this.snapshot);\n }\n\n public subscribe(listener: I18nListener): () => void {\n this.listeners.add(listener);\n\n return () => {\n this.listeners.delete(listener);\n };\n }\n\n public async setLocale(locale: I18nSnapshot['locale']): Promise<void> {\n this.ensureInitialized();\n\n const prevSnapshot = this.snapshot;\n const nextSnapshot = mergeI18nSnapshot(prevSnapshot, { locale });\n\n if (isI18nEqual(prevSnapshot, nextSnapshot)) {\n return;\n }\n\n this.snapshot = nextSnapshot;\n\n // set lang\n await setLang(this.snapshot.locale);\n\n if (this.cacheManager) {\n await saveI18nToCache(this.cacheManager, this.config.persistence, this.snapshot);\n }\n\n this.emit(this.snapshot, prevSnapshot);\n }\n\n private ensureInitialized(): void {\n if (!this.initialized) {\n throw new Error('I18nManager must be initialized before use.');\n }\n }\n\n private emit(next: I18nSnapshot, prev: I18nSnapshot): void {\n for (const listener of this.listeners) {\n try {\n listener(cloneI18nSnapshot(next), cloneI18nSnapshot(prev));\n } catch {\n // Keep notifying remaining listeners even if one fails.\n }\n }\n }\n}\n"],"names":["setupI18n","setLang","DEFAULT_CONFIG","DEFAULT_I18N","loadI18nFromCache","saveI18nToCache","cloneI18nSnapshot","isI18nEqual","mergeI18nSnapshot","normalizeI18nSnapshot","I18nManager","initialize","context","config","i18n","cacheManager","initialSnapshot","initial","snapshot","persistence","interpolation","escapeValue","lng","locale","resources","initialized","getSnapshot","subscribe","listener","listeners","add","delete","setLocale","ensureInitialized","prevSnapshot","nextSnapshot","emit","Error","next","prev","Set"],"mappings":";;;;;;;;;;;;;AACA,SAASA,SAAS,EAAEC,OAAO,QAAQ,mBAAmB;AACtD,SAASC,cAAc,EAAEC,YAAY,QAAQ,kBAAkB;AAE/D,SAASC,iBAAiB,EAAEC,eAAe,QAAQ,qBAAqB;AACxE,SACEC,iBAAiB,EACjBC,WAAW,EACXC,iBAAiB,EACjBC,qBAAqB,QAEhB,gBAAgB;AAEvB,OAAO,MAAMC;IAOX,MAAaC,WAAWC,OAA6B,EAAiB;QACpE,IAAI,CAACC,MAAM,GAAGD,QAAQC,MAAM,CAACC,IAAI;QACjC,IAAI,CAACC,YAAY,GAAGH,QAAQG,YAAY;QAExC,MAAMC,kBAAkBP,sBAAsB,IAAI,CAACI,MAAM,CAACI,OAAO,IAAI,CAAC,GAAGd;QACzE,IAAI,CAACe,QAAQ,GAAG,MAAMd,kBAAkB,IAAI,CAACW,YAAY,EAAE,IAAI,CAACF,MAAM,CAACM,WAAW,EAAEH;QAEpF,MAAMhB,UAAU;YACdoB,eAAe;gBACbC,aAAa;YACf;YACAC,KAAK,IAAI,CAACJ,QAAQ,CAACK,MAAM,IAAI;YAC7BC,WAAW,IAAI,CAACN,QAAQ,CAACM,SAAS;QACpC;QACA,MAAMvB,QAAQ,IAAI,CAACiB,QAAQ,CAACK,MAAM;QAClC,IAAI,CAACE,WAAW,GAAG;IACrB;IAEOC,cAA4B;QACjC,OAAOpB,kBAAkB,IAAI,CAACY,QAAQ;IACxC;IAEOS,UAAUC,QAAsB,EAAc;QACnD,IAAI,CAACC,SAAS,CAACC,GAAG,CAACF;QAEnB,OAAO;YACL,IAAI,CAACC,SAAS,CAACE,MAAM,CAACH;QACxB;IACF;IAEA,MAAaI,UAAUT,MAA8B,EAAiB;QACpE,IAAI,CAACU,iBAAiB;QAEtB,MAAMC,eAAe,IAAI,CAAChB,QAAQ;QAClC,MAAMiB,eAAe3B,kBAAkB0B,cAAc;YAAEX;QAAO;QAE9D,IAAIhB,YAAY2B,cAAcC,eAAe;YAC3C;QACF;QAEA,IAAI,CAACjB,QAAQ,GAAGiB;QAEhB,WAAW;QACX,MAAMlC,QAAQ,IAAI,CAACiB,QAAQ,CAACK,MAAM;QAElC,IAAI,IAAI,CAACR,YAAY,EAAE;YACrB,MAAMV,gBAAgB,IAAI,CAACU,YAAY,EAAE,IAAI,CAACF,MAAM,CAACM,WAAW,EAAE,IAAI,CAACD,QAAQ;QACjF;QAEA,IAAI,CAACkB,IAAI,CAAC,IAAI,CAAClB,QAAQ,EAAEgB;IAC3B;IAEQD,oBAA0B;QAChC,IAAI,CAAC,IAAI,CAACR,WAAW,EAAE;YACrB,MAAM,IAAIY,MAAM;QAClB;IACF;IAEQD,KAAKE,IAAkB,EAAEC,IAAkB,EAAQ;QACzD,KAAK,MAAMX,YAAY,IAAI,CAACC,SAAS,CAAE;YACrC,IAAI;gBACFD,SAAStB,kBAAkBgC,OAAOhC,kBAAkBiC;YACtD,EAAE,OAAM;YACN,wDAAwD;YAC1D;QACF;IACF;;QAxEA,uBAAQrB,YAAyBZ,kBAAkBH;QACnD,uBAAQU,UAA+BX,eAAeY,IAAI;QAC1D,uBAAQe,aAAY,IAAIW;QACxB,uBAAQzB,gBAAuC;QAC/C,uBAAQU,eAAc;;AAqExB"}
|
|
@@ -0,0 +1,62 @@
|
|
|
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 DEFAULT_I18N_CACHE_KEY () {
|
|
13
|
+
return DEFAULT_I18N_CACHE_KEY;
|
|
14
|
+
},
|
|
15
|
+
get loadI18nFromCache () {
|
|
16
|
+
return loadI18nFromCache;
|
|
17
|
+
},
|
|
18
|
+
get saveI18nToCache () {
|
|
19
|
+
return saveI18nToCache;
|
|
20
|
+
}
|
|
21
|
+
});
|
|
22
|
+
const _i18nschema = require("./i18n.schema");
|
|
23
|
+
const DEFAULT_I18N_CACHE_KEY = 'vlian:kernel:i18n';
|
|
24
|
+
function resolvePersistenceContext(persistence) {
|
|
25
|
+
if (persistence?.enabled !== true) {
|
|
26
|
+
return null;
|
|
27
|
+
}
|
|
28
|
+
return {
|
|
29
|
+
key: persistence.key || DEFAULT_I18N_CACHE_KEY
|
|
30
|
+
};
|
|
31
|
+
}
|
|
32
|
+
async function loadI18nFromCache(cacheManager, persistence, fallback) {
|
|
33
|
+
const persistenceContext = resolvePersistenceContext(persistence);
|
|
34
|
+
const safeFallback = (0, _i18nschema.cloneI18nSnapshot)(fallback);
|
|
35
|
+
if (!persistenceContext) {
|
|
36
|
+
return safeFallback;
|
|
37
|
+
}
|
|
38
|
+
try {
|
|
39
|
+
const cached = await cacheManager.get(persistenceContext.key, {
|
|
40
|
+
defaultValue: safeFallback
|
|
41
|
+
});
|
|
42
|
+
return (0, _i18nschema.normalizeI18nSnapshot)(cached, safeFallback);
|
|
43
|
+
} catch {
|
|
44
|
+
return safeFallback;
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
async function saveI18nToCache(cacheManager, persistence, snapshot) {
|
|
48
|
+
const persistenceContext = resolvePersistenceContext(persistence);
|
|
49
|
+
if (!persistenceContext) {
|
|
50
|
+
return;
|
|
51
|
+
}
|
|
52
|
+
try {
|
|
53
|
+
const persistedSnapshot = {
|
|
54
|
+
locale: (0, _i18nschema.cloneI18nSnapshot)(snapshot).locale
|
|
55
|
+
};
|
|
56
|
+
await cacheManager.set(persistenceContext.key, persistedSnapshot);
|
|
57
|
+
} catch {
|
|
58
|
+
// Ignore persistence failures and keep i18n updates in memory.
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
//# sourceMappingURL=i18n.persistence.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../../src/kernel/manager/i18n/i18n.persistence.ts"],"sourcesContent":["import type { StorageInstance } from '@vlian/utils';\nimport type { I18nSnapshot, PersistenceOptions } from '../../types';\nimport { cloneI18nSnapshot, normalizeI18nSnapshot } from './i18n.schema';\n\nexport const DEFAULT_I18N_CACHE_KEY = 'vlian:kernel:i18n';\n\ntype ResolvedPersistenceContext = {\n key: string;\n};\n\ntype PersistedI18nSnapshot = Pick<I18nSnapshot, 'locale'>;\n\nfunction resolvePersistenceContext(\n persistence: PersistenceOptions | undefined\n): ResolvedPersistenceContext | null {\n if (persistence?.enabled !== true) {\n return null;\n }\n\n return {\n key: persistence.key || DEFAULT_I18N_CACHE_KEY,\n };\n}\n\nexport async function loadI18nFromCache(\n cacheManager: StorageInstance,\n persistence: PersistenceOptions | undefined,\n fallback: I18nSnapshot\n): Promise<I18nSnapshot> {\n const persistenceContext = resolvePersistenceContext(persistence);\n const safeFallback = cloneI18nSnapshot(fallback);\n\n if (!persistenceContext) {\n return safeFallback;\n }\n\n try {\n const cached = await cacheManager.get<I18nSnapshot>(persistenceContext.key, {\n defaultValue: safeFallback,\n });\n return normalizeI18nSnapshot(cached, safeFallback);\n } catch {\n return safeFallback;\n }\n}\n\nexport async function saveI18nToCache(\n cacheManager: StorageInstance,\n persistence: PersistenceOptions | undefined,\n snapshot: I18nSnapshot\n): Promise<void> {\n const persistenceContext = resolvePersistenceContext(persistence);\n\n if (!persistenceContext) {\n return;\n }\n\n try {\n const persistedSnapshot: PersistedI18nSnapshot = {\n locale: cloneI18nSnapshot(snapshot).locale,\n };\n await cacheManager.set(persistenceContext.key, persistedSnapshot);\n } catch {\n // Ignore persistence failures and keep i18n updates in memory.\n }\n}\n"],"names":["DEFAULT_I18N_CACHE_KEY","loadI18nFromCache","saveI18nToCache","resolvePersistenceContext","persistence","enabled","key","cacheManager","fallback","persistenceContext","safeFallback","cloneI18nSnapshot","cached","get","defaultValue","normalizeI18nSnapshot","snapshot","persistedSnapshot","locale","set"],"mappings":";;;;;;;;;;;QAIaA;eAAAA;;QAoBSC;eAAAA;;QAsBAC;eAAAA;;;4BA5CmC;AAElD,MAAMF,yBAAyB;AAQtC,SAASG,0BACPC,WAA2C;IAE3C,IAAIA,aAAaC,YAAY,MAAM;QACjC,OAAO;IACT;IAEA,OAAO;QACLC,KAAKF,YAAYE,GAAG,IAAIN;IAC1B;AACF;AAEO,eAAeC,kBACpBM,YAA6B,EAC7BH,WAA2C,EAC3CI,QAAsB;IAEtB,MAAMC,qBAAqBN,0BAA0BC;IACrD,MAAMM,eAAeC,IAAAA,6BAAiB,EAACH;IAEvC,IAAI,CAACC,oBAAoB;QACvB,OAAOC;IACT;IAEA,IAAI;QACF,MAAME,SAAS,MAAML,aAAaM,GAAG,CAAeJ,mBAAmBH,GAAG,EAAE;YAC1EQ,cAAcJ;QAChB;QACA,OAAOK,IAAAA,iCAAqB,EAACH,QAAQF;IACvC,EAAE,OAAM;QACN,OAAOA;IACT;AACF;AAEO,eAAeR,gBACpBK,YAA6B,EAC7BH,WAA2C,EAC3CY,QAAsB;IAEtB,MAAMP,qBAAqBN,0BAA0BC;IAErD,IAAI,CAACK,oBAAoB;QACvB;IACF;IAEA,IAAI;QACF,MAAMQ,oBAA2C;YAC/CC,QAAQP,IAAAA,6BAAiB,EAACK,UAAUE,MAAM;QAC5C;QACA,MAAMX,aAAaY,GAAG,CAACV,mBAAmBH,GAAG,EAAEW;IACjD,EAAE,OAAM;IACN,+DAA+D;IACjE;AACF"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import type { StorageInstance } from '@vlian/utils';
|
|
2
|
+
import type { I18nSnapshot, PersistenceOptions } from '../../types';
|
|
3
|
+
export declare const DEFAULT_I18N_CACHE_KEY = "vlian:kernel:i18n";
|
|
4
|
+
export declare function loadI18nFromCache(cacheManager: StorageInstance, persistence: PersistenceOptions | undefined, fallback: I18nSnapshot): Promise<I18nSnapshot>;
|
|
5
|
+
export declare function saveI18nToCache(cacheManager: StorageInstance, persistence: PersistenceOptions | undefined, snapshot: I18nSnapshot): Promise<void>;
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import { cloneI18nSnapshot, normalizeI18nSnapshot } from "./i18n.schema";
|
|
2
|
+
export const DEFAULT_I18N_CACHE_KEY = 'vlian:kernel:i18n';
|
|
3
|
+
function resolvePersistenceContext(persistence) {
|
|
4
|
+
if (persistence?.enabled !== true) {
|
|
5
|
+
return null;
|
|
6
|
+
}
|
|
7
|
+
return {
|
|
8
|
+
key: persistence.key || DEFAULT_I18N_CACHE_KEY
|
|
9
|
+
};
|
|
10
|
+
}
|
|
11
|
+
export async function loadI18nFromCache(cacheManager, persistence, fallback) {
|
|
12
|
+
const persistenceContext = resolvePersistenceContext(persistence);
|
|
13
|
+
const safeFallback = cloneI18nSnapshot(fallback);
|
|
14
|
+
if (!persistenceContext) {
|
|
15
|
+
return safeFallback;
|
|
16
|
+
}
|
|
17
|
+
try {
|
|
18
|
+
const cached = await cacheManager.get(persistenceContext.key, {
|
|
19
|
+
defaultValue: safeFallback
|
|
20
|
+
});
|
|
21
|
+
return normalizeI18nSnapshot(cached, safeFallback);
|
|
22
|
+
} catch {
|
|
23
|
+
return safeFallback;
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
export async function saveI18nToCache(cacheManager, persistence, snapshot) {
|
|
27
|
+
const persistenceContext = resolvePersistenceContext(persistence);
|
|
28
|
+
if (!persistenceContext) {
|
|
29
|
+
return;
|
|
30
|
+
}
|
|
31
|
+
try {
|
|
32
|
+
const persistedSnapshot = {
|
|
33
|
+
locale: cloneI18nSnapshot(snapshot).locale
|
|
34
|
+
};
|
|
35
|
+
await cacheManager.set(persistenceContext.key, persistedSnapshot);
|
|
36
|
+
} catch {
|
|
37
|
+
// Ignore persistence failures and keep i18n updates in memory.
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
//# sourceMappingURL=i18n.persistence.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../../src/kernel/manager/i18n/i18n.persistence.ts"],"sourcesContent":["import type { StorageInstance } from '@vlian/utils';\nimport type { I18nSnapshot, PersistenceOptions } from '../../types';\nimport { cloneI18nSnapshot, normalizeI18nSnapshot } from './i18n.schema';\n\nexport const DEFAULT_I18N_CACHE_KEY = 'vlian:kernel:i18n';\n\ntype ResolvedPersistenceContext = {\n key: string;\n};\n\ntype PersistedI18nSnapshot = Pick<I18nSnapshot, 'locale'>;\n\nfunction resolvePersistenceContext(\n persistence: PersistenceOptions | undefined\n): ResolvedPersistenceContext | null {\n if (persistence?.enabled !== true) {\n return null;\n }\n\n return {\n key: persistence.key || DEFAULT_I18N_CACHE_KEY,\n };\n}\n\nexport async function loadI18nFromCache(\n cacheManager: StorageInstance,\n persistence: PersistenceOptions | undefined,\n fallback: I18nSnapshot\n): Promise<I18nSnapshot> {\n const persistenceContext = resolvePersistenceContext(persistence);\n const safeFallback = cloneI18nSnapshot(fallback);\n\n if (!persistenceContext) {\n return safeFallback;\n }\n\n try {\n const cached = await cacheManager.get<I18nSnapshot>(persistenceContext.key, {\n defaultValue: safeFallback,\n });\n return normalizeI18nSnapshot(cached, safeFallback);\n } catch {\n return safeFallback;\n }\n}\n\nexport async function saveI18nToCache(\n cacheManager: StorageInstance,\n persistence: PersistenceOptions | undefined,\n snapshot: I18nSnapshot\n): Promise<void> {\n const persistenceContext = resolvePersistenceContext(persistence);\n\n if (!persistenceContext) {\n return;\n }\n\n try {\n const persistedSnapshot: PersistedI18nSnapshot = {\n locale: cloneI18nSnapshot(snapshot).locale,\n };\n await cacheManager.set(persistenceContext.key, persistedSnapshot);\n } catch {\n // Ignore persistence failures and keep i18n updates in memory.\n }\n}\n"],"names":["cloneI18nSnapshot","normalizeI18nSnapshot","DEFAULT_I18N_CACHE_KEY","resolvePersistenceContext","persistence","enabled","key","loadI18nFromCache","cacheManager","fallback","persistenceContext","safeFallback","cached","get","defaultValue","saveI18nToCache","snapshot","persistedSnapshot","locale","set"],"mappings":"AAEA,SAASA,iBAAiB,EAAEC,qBAAqB,QAAQ,gBAAgB;AAEzE,OAAO,MAAMC,yBAAyB,oBAAoB;AAQ1D,SAASC,0BACPC,WAA2C;IAE3C,IAAIA,aAAaC,YAAY,MAAM;QACjC,OAAO;IACT;IAEA,OAAO;QACLC,KAAKF,YAAYE,GAAG,IAAIJ;IAC1B;AACF;AAEA,OAAO,eAAeK,kBACpBC,YAA6B,EAC7BJ,WAA2C,EAC3CK,QAAsB;IAEtB,MAAMC,qBAAqBP,0BAA0BC;IACrD,MAAMO,eAAeX,kBAAkBS;IAEvC,IAAI,CAACC,oBAAoB;QACvB,OAAOC;IACT;IAEA,IAAI;QACF,MAAMC,SAAS,MAAMJ,aAAaK,GAAG,CAAeH,mBAAmBJ,GAAG,EAAE;YAC1EQ,cAAcH;QAChB;QACA,OAAOV,sBAAsBW,QAAQD;IACvC,EAAE,OAAM;QACN,OAAOA;IACT;AACF;AAEA,OAAO,eAAeI,gBACpBP,YAA6B,EAC7BJ,WAA2C,EAC3CY,QAAsB;IAEtB,MAAMN,qBAAqBP,0BAA0BC;IAErD,IAAI,CAACM,oBAAoB;QACvB;IACF;IAEA,IAAI;QACF,MAAMO,oBAA2C;YAC/CC,QAAQlB,kBAAkBgB,UAAUE,MAAM;QAC5C;QACA,MAAMV,aAAaW,GAAG,CAACT,mBAAmBJ,GAAG,EAAEW;IACjD,EAAE,OAAM;IACN,+DAA+D;IACjE;AACF"}
|
|
@@ -0,0 +1,88 @@
|
|
|
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 cloneI18nSnapshot () {
|
|
13
|
+
return cloneI18nSnapshot;
|
|
14
|
+
},
|
|
15
|
+
get isI18nEqual () {
|
|
16
|
+
return isI18nEqual;
|
|
17
|
+
},
|
|
18
|
+
get mergeI18nSnapshot () {
|
|
19
|
+
return mergeI18nSnapshot;
|
|
20
|
+
},
|
|
21
|
+
get normalizeI18nSnapshot () {
|
|
22
|
+
return normalizeI18nSnapshot;
|
|
23
|
+
}
|
|
24
|
+
});
|
|
25
|
+
function isPlainObject(value) {
|
|
26
|
+
return Object.prototype.toString.call(value) === '[object Object]';
|
|
27
|
+
}
|
|
28
|
+
function cloneI18nSnapshot(snapshot) {
|
|
29
|
+
const resources = snapshot.resources ? Object.fromEntries(Object.entries(snapshot.resources).map(([locale, value])=>[
|
|
30
|
+
locale,
|
|
31
|
+
{
|
|
32
|
+
...value
|
|
33
|
+
}
|
|
34
|
+
])) : undefined;
|
|
35
|
+
return {
|
|
36
|
+
locale: snapshot.locale,
|
|
37
|
+
...resources ? {
|
|
38
|
+
resources
|
|
39
|
+
} : {}
|
|
40
|
+
};
|
|
41
|
+
}
|
|
42
|
+
function normalizeI18nSnapshot(value, fallback) {
|
|
43
|
+
const source = isPlainObject(value) ? value : {};
|
|
44
|
+
const locale = typeof source.locale === 'string' && source.locale.trim() ? source.locale : fallback.locale;
|
|
45
|
+
const fallbackResources = fallback.resources;
|
|
46
|
+
const incomingResources = isPlainObject(source.resources) ? Object.fromEntries(Object.entries(source.resources).filter(([, resourceValue])=>isPlainObject(resourceValue)).map(([locale, resourceValue])=>[
|
|
47
|
+
locale,
|
|
48
|
+
{
|
|
49
|
+
...resourceValue
|
|
50
|
+
}
|
|
51
|
+
])) : undefined;
|
|
52
|
+
const resources = incomingResources || fallbackResources ? {
|
|
53
|
+
...fallbackResources || {},
|
|
54
|
+
...incomingResources || {}
|
|
55
|
+
} : undefined;
|
|
56
|
+
return {
|
|
57
|
+
locale,
|
|
58
|
+
...resources ? {
|
|
59
|
+
resources
|
|
60
|
+
} : {}
|
|
61
|
+
};
|
|
62
|
+
}
|
|
63
|
+
function mergeI18nSnapshot(current, next) {
|
|
64
|
+
return normalizeI18nSnapshot({
|
|
65
|
+
locale: next.locale ?? current.locale,
|
|
66
|
+
resources: next.resources ?? current.resources
|
|
67
|
+
}, current);
|
|
68
|
+
}
|
|
69
|
+
function isI18nEqual(left, right) {
|
|
70
|
+
if (left.locale !== right.locale) {
|
|
71
|
+
return false;
|
|
72
|
+
}
|
|
73
|
+
const leftResources = left.resources || {};
|
|
74
|
+
const rightResources = right.resources || {};
|
|
75
|
+
const leftLocales = Object.keys(leftResources);
|
|
76
|
+
const rightLocales = Object.keys(rightResources);
|
|
77
|
+
if (leftLocales.length !== rightLocales.length) {
|
|
78
|
+
return false;
|
|
79
|
+
}
|
|
80
|
+
for (const locale of leftLocales){
|
|
81
|
+
if (leftResources[locale] !== rightResources[locale]) {
|
|
82
|
+
return false;
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
return true;
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
//# sourceMappingURL=i18n.schema.js.map
|