@hua-labs/i18n-core 2.0.0 โ 2.0.4
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/README.md +57 -597
- package/dist/chunk-F4PDBJLO.mjs +973 -0
- package/dist/chunk-F4PDBJLO.mjs.map +1 -0
- package/dist/index.d.mts +249 -0
- package/dist/index.d.ts +117 -30
- package/dist/index.js +1818 -177
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +845 -0
- package/dist/index.mjs.map +1 -0
- package/dist/server-4TeBq6hp.d.mts +367 -0
- package/dist/server-4TeBq6hp.d.ts +367 -0
- package/dist/server.d.mts +1 -0
- package/dist/server.d.ts +1 -0
- package/dist/server.js +977 -0
- package/dist/server.js.map +1 -0
- package/dist/server.mjs +3 -0
- package/dist/server.mjs.map +1 -0
- package/package.json +42 -19
- package/src/__tests__/debug-tools.test.ts +359 -0
- package/src/__tests__/default-translations.test.ts +179 -0
- package/src/__tests__/i18n-resource.test.ts +137 -0
- package/src/__tests__/lazy-loader.test.ts +109 -0
- package/src/__tests__/missing-key-overlay.test.tsx +339 -0
- package/src/__tests__/translator-factory.test.ts +120 -0
- package/src/__tests__/translator.test.ts +442 -0
- package/src/__tests__/types.test.ts +211 -0
- package/src/__tests__/useI18n.test.tsx +181 -0
- package/src/__tests__/useTranslation.test.tsx +110 -0
- package/src/components/MissingKeyOverlay.tsx +1 -1
- package/src/core/lazy-loader.ts +2 -2
- package/src/core/translator.tsx +151 -62
- package/src/hooks/useI18n.tsx +96 -115
- package/src/hooks/useTranslation.tsx +12 -10
- package/src/index.ts +102 -5
- package/src/server.ts +9 -0
- package/src/types/index.ts +67 -12
- package/LICENSE +0 -21
- package/dist/components/MissingKeyOverlay.d.ts +0 -33
- package/dist/components/MissingKeyOverlay.d.ts.map +0 -1
- package/dist/components/MissingKeyOverlay.js +0 -138
- package/dist/components/MissingKeyOverlay.js.map +0 -1
- package/dist/core/debug-tools.d.ts +0 -37
- package/dist/core/debug-tools.d.ts.map +0 -1
- package/dist/core/debug-tools.js +0 -241
- package/dist/core/debug-tools.js.map +0 -1
- package/dist/core/i18n-resource.d.ts +0 -59
- package/dist/core/i18n-resource.d.ts.map +0 -1
- package/dist/core/i18n-resource.js +0 -153
- package/dist/core/i18n-resource.js.map +0 -1
- package/dist/core/lazy-loader.d.ts +0 -82
- package/dist/core/lazy-loader.d.ts.map +0 -1
- package/dist/core/lazy-loader.js +0 -193
- package/dist/core/lazy-loader.js.map +0 -1
- package/dist/core/translator-factory.d.ts +0 -50
- package/dist/core/translator-factory.d.ts.map +0 -1
- package/dist/core/translator-factory.js +0 -117
- package/dist/core/translator-factory.js.map +0 -1
- package/dist/core/translator.d.ts +0 -202
- package/dist/core/translator.d.ts.map +0 -1
- package/dist/core/translator.js +0 -912
- package/dist/core/translator.js.map +0 -1
- package/dist/hooks/useI18n.d.ts +0 -39
- package/dist/hooks/useI18n.d.ts.map +0 -1
- package/dist/hooks/useI18n.js +0 -531
- package/dist/hooks/useI18n.js.map +0 -1
- package/dist/hooks/useTranslation.d.ts +0 -55
- package/dist/hooks/useTranslation.d.ts.map +0 -1
- package/dist/hooks/useTranslation.js +0 -58
- package/dist/hooks/useTranslation.js.map +0 -1
- package/dist/index.d.ts.map +0 -1
- package/dist/types/index.d.ts +0 -162
- package/dist/types/index.d.ts.map +0 -1
- package/dist/types/index.js +0 -191
- package/dist/types/index.js.map +0 -1
- package/dist/utils/default-translations.d.ts +0 -20
- package/dist/utils/default-translations.d.ts.map +0 -1
- package/dist/utils/default-translations.js +0 -123
- package/dist/utils/default-translations.js.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/types/index.ts","../src/core/translator.tsx"],"names":["key"],"mappings":"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","file":"server.js","sourcesContent":["// ---------------------------------------------------------------------------\n// Plural (ICU / Intl.PluralRules)\n// ---------------------------------------------------------------------------\nexport type PluralCategory = 'zero' | 'one' | 'two' | 'few' | 'many' | 'other';\n\nexport interface PluralValue {\n zero?: string;\n one?: string;\n two?: string;\n few?: string;\n many?: string;\n other: string; // ํ์\n}\n\nconst PLURAL_CATEGORIES = new Set<string>(['zero', 'one', 'two', 'few', 'many', 'other']);\n\nexport function isPluralValue(value: unknown): value is PluralValue {\n if (typeof value !== 'object' || value === null || Array.isArray(value)) return false;\n const obj = value as Record<string, unknown>;\n const keys = Object.keys(obj);\n return (\n keys.length > 0 &&\n keys.every(k => PLURAL_CATEGORIES.has(k)) &&\n Object.values(obj).every(v => typeof v === 'string') &&\n typeof obj.other === 'string'\n );\n}\n\n// ---------------------------------------------------------------------------\n// Translation namespace\n// ---------------------------------------------------------------------------\nexport interface TranslationNamespace {\n [key: string]: string | string[] | PluralValue | TranslationNamespace;\n}\n\nexport interface TranslationData {\n [namespace: string]: TranslationNamespace;\n}\n\nexport interface LanguageConfig {\n code: string;\n name: string;\n nativeName: string;\n tone?: 'emotional' | 'encouraging' | 'calm' | 'gentle' | 'formal' | 'technical' | 'informal';\n formality?: 'informal' | 'casual' | 'formal' | 'polite';\n}\n\n// ๋ ๊ตฌ์ฒด์ ์ธ ์ค์ ํ์
์ ์\nexport interface I18nConfig {\n defaultLanguage: string;\n fallbackLanguage?: string;\n supportedLanguages: LanguageConfig[];\n namespaces?: string[];\n loadTranslations: (language: string, namespace: string) => Promise<TranslationNamespace>;\n // SSR์์ ์ ๋ฌ๋ ์ด๊ธฐ ๋ฒ์ญ ๋ฐ์ดํฐ (๋คํธ์ํฌ ์์ฒญ ์์ด ์ฌ์ฉ)\n initialTranslations?: Record<string, Record<string, TranslationNamespace>>;\n // ๊ฐ๋ฐ ๋ชจ๋ ์ค์ \n debug?: boolean;\n // ๋ฒ์ญ ํค๊ฐ ์์ ๋์ ๋์\n missingKeyHandler?: (key: string, language: string, namespace: string) => string;\n // ๋ฒ์ญ ๋ก๋ฉ ์คํจ ์ ๋์\n errorHandler?: (error: Error, language: string, namespace: string) => void;\n // ์บ์ ์ค์ \n cacheOptions?: {\n maxSize?: number;\n ttl?: number; // Time to live in milliseconds\n };\n // ์ฑ๋ฅ ์ค์ \n performanceOptions?: {\n preloadAll?: boolean;\n lazyLoad?: boolean;\n };\n // ์๋ฌ ์ฒ๋ฆฌ ์ค์ \n errorHandling?: {\n recoveryStrategy?: ErrorRecoveryStrategy;\n logging?: ErrorLoggingConfig;\n userFriendlyMessages?: boolean;\n suppressErrors?: boolean;\n };\n // ์๋ ์ธ์ด ์ ํ ์ด๋ฒคํธ ์ฒ๋ฆฌ (withDefaultConfig์ฉ)\n autoLanguageSync?: boolean;\n}\n\n// ์๋ฌ ํ์
์ ์\nexport interface TranslationError extends Error {\n code: 'MISSING_KEY' | 'LOAD_FAILED' | 'INVALID_KEY' | 'NETWORK_ERROR' | 'INITIALIZATION_ERROR' | 'VALIDATION_ERROR' | 'CACHE_ERROR' | 'FALLBACK_LOAD_FAILED' | 'INITIALIZATION_FAILED' | 'RETRY_FAILED';\n language?: string;\n namespace?: string;\n key?: string;\n originalError?: Error;\n retryCount?: number;\n maxRetries?: number;\n timestamp: number;\n context?: Record<string, unknown>;\n}\n\n// ์๋ฌ ๋ณต๊ตฌ ์ ๋ต\nexport interface ErrorRecoveryStrategy {\n maxRetries: number;\n retryDelay: number; // milliseconds\n backoffMultiplier: number;\n shouldRetry: (error: TranslationError) => boolean;\n onRetry: (error: TranslationError, attempt: number) => void;\n onMaxRetriesExceeded: (error: TranslationError) => void;\n}\n\n// ์๋ฌ ๋ก๊น
์ค์ \nexport interface ErrorLoggingConfig {\n enabled: boolean;\n level: 'error' | 'warn' | 'info' | 'debug';\n includeStack: boolean;\n includeContext: boolean;\n customLogger?: (error: TranslationError) => void;\n}\n\n// ์ฌ์ฉ์ ์นํ์ ์๋ฌ ๋ฉ์์ง\nexport interface UserFriendlyError {\n code: string;\n message: string;\n suggestion?: string;\n action?: string;\n severity: 'low' | 'medium' | 'high' | 'critical';\n}\n\n// ์บ์ ์ํธ๋ฆฌ ํ์
\nexport interface CacheEntry {\n data: TranslationNamespace;\n timestamp: number;\n ttl: number;\n}\n\n// ๋ก๋ฉ ์ํ ํ์
\nexport interface LoadingState {\n isLoading: boolean;\n error: TranslationError | null;\n progress?: {\n loaded: number;\n total: number;\n };\n}\n\n// ๋ฒ์ญ ๊ฒฐ๊ณผ ํ์
\nexport interface TranslationResult {\n text: string;\n language: string;\n namespace: string;\n key: string;\n isFallback: boolean;\n cacheHit: boolean;\n}\n\nexport interface I18nContextType {\n currentLanguage: string;\n setLanguage: (language: string) => void | Promise<void>;\n // ํตํฉ ๋ฒ์ญ ํจ์: t(key), t(key, language), t(key, params), t(key, params, language)\n t: (key: ResolveStringKey, paramsOrLang?: TranslationParams | string, language?: string) => string;\n // ๋ณต์ํ ๋ฒ์ญ ํจ์: tPlural(key, count), tPlural(key, count, params), tPlural(key, count, params, language)\n tPlural: (key: ResolvePluralKey, count: number, params?: Record<string, unknown>, language?: string) => string;\n // ๊ธฐ์กด ๋น๋๊ธฐ ๋ฒ์ญ ํจ์ (ํ์ ํธํ์ฑ)\n tAsync: (key: string, params?: TranslationParams) => Promise<string>;\n // ๊ธฐ์กด ๋๊ธฐ ๋ฒ์ญ ํจ์ (ํ์ ํธํ์ฑ)\n tSync: (key: string, namespace?: string, params?: TranslationParams) => string;\n // ์์ ๊ฐ ๊ฐ์ ธ์ค๊ธฐ (๋ฐฐ์ด, ๊ฐ์ฒด ํฌํจ)\n getRawValue: (key: string, language?: string) => unknown;\n // ๋ฐฐ์ด ๋ฒ์ญ ๊ฐ ๊ฐ์ ธ์ค๊ธฐ (ํ์
์์ )\n tArray: (key: ResolveArrayKey, language?: string) => string[];\n isLoading: boolean;\n error: TranslationError | null;\n supportedLanguages: LanguageConfig[];\n // ์ด๊ธฐํ ์ํ\n isInitialized: boolean;\n // ๊ฐ๋ฐ์ ๋๊ตฌ\n debug: {\n getCurrentLanguage: () => string;\n getSupportedLanguages: () => string[];\n getLoadedNamespaces: () => string[];\n getAllTranslations: () => Record<string, Record<string, unknown>>;\n isReady: () => boolean;\n getInitializationError: () => TranslationError | null;\n clearCache: () => void;\n reloadTranslations: () => Promise<void>;\n getCacheStats: () => {\n size: number;\n hits: number;\n misses: number;\n };\n };\n}\n\nexport interface TranslationParams {\n [key: string]: string | number;\n}\n\n/**\n * ํ์
์์ ํ ๋ฒ์ญ ํค๋ฅผ ์ํ augmentation point.\n *\n * ์ฑ์์ declaration merging์ผ๋ก ์ขํ ์ ์์:\n * ```ts\n * declare module '@hua-labs/i18n-core' {\n * interface TypedTranslationKeys {\n * stringKey: TranslationStringKey;\n * arrayKey: TranslationArrayKey;\n * }\n * }\n * ```\n *\n * augmentation์ด ์์ผ๋ฉด string์ผ๋ก fallback (breaking ์์).\n */\n// eslint-disable-next-line @typescript-eslint/no-empty-interface\nexport interface TypedTranslationKeys {}\n\n/** augmentation ์ ์ขํ์ง ํ์
, ๋ฏธ์ค์ ์ string */\nexport type ResolveStringKey = TypedTranslationKeys extends { stringKey: infer K } ? K & string : string;\nexport type ResolveArrayKey = TypedTranslationKeys extends { arrayKey: infer K } ? K & string : string;\nexport type ResolvePluralKey = TypedTranslationKeys extends { pluralKey: infer K } ? K & string : string;\n\n// ํ์
์์ ํ ๋ฒ์ญ ํค ์์คํ
(๋จ์ํ๋ ๋ฒ์ )\nexport type TranslationKey<T> = T extends Record<string, unknown>\n ? {\n [K in keyof T]: T[K] extends string\n ? K\n : T[K] extends Record<string, unknown>\n ? `${K & string}.${TranslationKey<T[K]> & string}`\n : never;\n }[keyof T]\n : never;\n\n// ํ์
์์ ํ ๋ฒ์ญ ํจ์๋ค\nexport interface TypedI18nContextType<T extends TranslationData> extends Omit<I18nContextType, 't' | 'tSync'> {\n // ํ์
์์ ํ ๋ฒ์ญ ํจ์\n t: <K extends TranslationKey<T>>(key: K, paramsOrLang?: TranslationParams | string, language?: string) => string;\n tSync: <K extends TranslationKey<T>>(key: K, namespace?: string, params?: TranslationParams) => string;\n}\n\n// ๊ฐ๋จํ ๋ฒ์ญ ํค ํ์
(๋ฌดํ ์ฌ๊ท ๋ฐฉ์ง)\nexport type SimpleTranslationKey = string;\n\n// ๊ณ ๊ธ ๋ฒ์ญ ํค ํ์
(์ ํ๋ ๊น์ด)\nexport type TranslationKeyLegacy<T extends Record<string, unknown>, D extends number = 3> = \n [D] extends [never] \n ? never \n : T extends Record<string, unknown>\n ? {\n [K in keyof T]: T[K] extends string \n ? K \n : T[K] extends Record<string, unknown>\n ? `${K & string}.${TranslationKeyLegacy<T[K], Prev<D>> & string}` \n : never;\n }[keyof T]\n : never;\n\ntype Prev<T extends number> = T extends 0 ? never : T extends 1 ? 0 : T extends 2 ? 1 : T extends 3 ? 2 : never;\n\n// ์ ํธ๋ฆฌํฐ ํ์
๋ค\nexport type ExtractTranslationKeys<T> = T extends Record<string, unknown>\n ? {\n [K in keyof T]: T[K] extends string\n ? K\n : T[K] extends Record<string, unknown>\n ? `${K & string}.${ExtractTranslationKeys<T[K]> & string}`\n : never;\n }[keyof T]\n : never;\n\n// ๋ค์์คํ์ด์ค๋ณ ํ์
์ ์๋ฅผ ์ํ ํฌํผ\nexport type NamespaceKeys<T extends TranslationData, N extends keyof T> = ExtractTranslationKeys<T[N]>;\n\n// ํ์
์์ ํ ๋ฒ์ญ ํค ์์ฑ ํฌํผ\nexport const createTranslationKey = <T extends TranslationData, N extends keyof T, K extends NamespaceKeys<T, N>>(\n namespace: N,\n key: K\n): `${N & string}.${K & string}` => `${String(namespace)}.${String(key)}` as `${N & string}.${K & string}`; \n\n// ํ์
๊ฐ๋ ํจ์๋ค\nexport function isTranslationNamespace(value: unknown): value is TranslationNamespace {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\nexport function isLanguageConfig(value: unknown): value is LanguageConfig {\n return (\n typeof value === 'object' &&\n value !== null &&\n typeof (value as LanguageConfig).code === 'string' &&\n typeof (value as LanguageConfig).name === 'string' &&\n typeof (value as LanguageConfig).nativeName === 'string'\n );\n}\n\nexport function isTranslationError(value: unknown): value is TranslationError {\n return (\n value instanceof Error &&\n typeof (value as TranslationError).code === 'string' &&\n ['MISSING_KEY', 'LOAD_FAILED', 'INVALID_KEY', 'NETWORK_ERROR', 'INITIALIZATION_ERROR'].includes(\n (value as TranslationError).code\n )\n );\n}\n\n// ์ค์ ๊ฒ์ฆ ํจ์\nexport function validateI18nConfig(config: unknown): config is I18nConfig {\n if (!config || typeof config !== 'object') {\n return false;\n }\n\n const c = config as I18nConfig;\n \n return (\n typeof c.defaultLanguage === 'string' &&\n Array.isArray(c.supportedLanguages) &&\n c.supportedLanguages.every(isLanguageConfig) &&\n typeof c.loadTranslations === 'function'\n );\n}\n\n// ์๋ฌ ์ฒ๋ฆฌ ์ ํธ๋ฆฌํฐ ํจ์๋ค\nexport function createTranslationError(\n code: TranslationError['code'],\n message: string,\n originalError?: Error,\n context?: {\n language?: string;\n namespace?: string;\n key?: string;\n retryCount?: number;\n maxRetries?: number;\n }\n): TranslationError {\n const error = new Error(message) as TranslationError;\n error.code = code;\n error.language = context?.language;\n error.namespace = context?.namespace;\n error.key = context?.key;\n error.originalError = originalError;\n error.retryCount = context?.retryCount || 0;\n error.maxRetries = context?.maxRetries || 3;\n error.timestamp = Date.now();\n error.name = 'TranslationError';\n return error;\n}\n\n// ์ฌ์ฉ์ ์นํ์ ์๋ฌ ๋ฉ์์ง ์์ฑ\nexport function createUserFriendlyError(error: TranslationError): UserFriendlyError {\n const errorMessages: Record<TranslationError['code'], UserFriendlyError> = {\n MISSING_KEY: {\n code: 'MISSING_KEY',\n message: '๋ฒ์ญ ํค๋ฅผ ์ฐพ์ ์ ์์ต๋๋ค',\n suggestion: '๋ฒ์ญ ํ์ผ์ ํด๋น ํค๊ฐ ์๋์ง ํ์ธํด์ฃผ์ธ์',\n action: '๋ฒ์ญ ํ์ผ ์
๋ฐ์ดํธ',\n severity: 'low'\n },\n LOAD_FAILED: {\n code: 'LOAD_FAILED',\n message: '๋ฒ์ญ ํ์ผ์ ๋ถ๋ฌ์ค๋๋ฐ ์คํจํ์ต๋๋ค',\n suggestion: '๋คํธ์ํฌ ์ฐ๊ฒฐ๊ณผ ํ์ผ ๊ฒฝ๋ก๋ฅผ ํ์ธํด์ฃผ์ธ์',\n action: '์ฌ์๋',\n severity: 'medium'\n },\n INVALID_KEY: {\n code: 'INVALID_KEY',\n message: '์๋ชป๋ ๋ฒ์ญ ํค ํ์์
๋๋ค',\n suggestion: 'ํค ํ์์ \"namespace.key\" ํํ๋ก ์
๋ ฅํด์ฃผ์ธ์',\n action: 'ํค ํ์ ์์ ',\n severity: 'low'\n },\n NETWORK_ERROR: {\n code: 'NETWORK_ERROR',\n message: '๋คํธ์ํฌ ์ค๋ฅ๊ฐ ๋ฐ์ํ์ต๋๋ค',\n suggestion: '์ธํฐ๋ท ์ฐ๊ฒฐ์ ํ์ธํ๊ณ ๋ค์ ์๋ํด์ฃผ์ธ์',\n action: '์ฌ์๋',\n severity: 'high'\n },\n INITIALIZATION_ERROR: {\n code: 'INITIALIZATION_ERROR',\n message: '๋ฒ์ญ ์์คํ
์ด๊ธฐํ์ ์คํจํ์ต๋๋ค',\n suggestion: '์ค์ ์ ํ์ธํ๊ณ ํ์ด์ง๋ฅผ ์๋ก๊ณ ์นจํด์ฃผ์ธ์',\n action: 'ํ์ด์ง ์๋ก๊ณ ์นจ',\n severity: 'critical'\n },\n VALIDATION_ERROR: {\n code: 'VALIDATION_ERROR',\n message: '์ค์ ๊ฒ์ฆ์ ์คํจํ์ต๋๋ค',\n suggestion: '๋ฒ์ญ ์ค์ ์ ํ์ธํด์ฃผ์ธ์',\n action: '์ค์ ์์ ',\n severity: 'medium'\n },\n CACHE_ERROR: {\n code: 'CACHE_ERROR',\n message: '์บ์ ์ฒ๋ฆฌ ์ค ์ค๋ฅ๊ฐ ๋ฐ์ํ์ต๋๋ค',\n suggestion: '์บ์๋ฅผ ์ด๊ธฐํํ๊ณ ๋ค์ ์๋ํด์ฃผ์ธ์',\n action: '์บ์ ์ด๊ธฐํ',\n severity: 'low'\n },\n FALLBACK_LOAD_FAILED: {\n code: 'FALLBACK_LOAD_FAILED',\n message: 'ํด๋ฐฑ ์ธ์ด ๋ก๋ฉ์ ์คํจํ์ต๋๋ค',\n suggestion: 'ํด๋ฐฑ ์ธ์ด ํ์ผ์ ํ์ธํด์ฃผ์ธ์',\n action: 'ํด๋ฐฑ ์ธ์ด ํ์ผ ์์ ',\n severity: 'medium'\n },\n INITIALIZATION_FAILED: {\n code: 'INITIALIZATION_FAILED',\n message: '์ด๊ธฐํ์ ์คํจํ์ต๋๋ค',\n suggestion: '์ค์ ์ ํ์ธํ๊ณ ๋ค์ ์๋ํด์ฃผ์ธ์',\n action: '์ค์ ํ์ธ',\n severity: 'critical'\n },\n RETRY_FAILED: {\n code: 'RETRY_FAILED',\n message: '์ฌ์๋์ ์คํจํ์ต๋๋ค',\n suggestion: '๋คํธ์ํฌ ์ฐ๊ฒฐ์ ํ์ธํด์ฃผ์ธ์',\n action: '์ฌ์๋',\n severity: 'high'\n }\n };\n\n return errorMessages[error.code];\n}\n\n// ์๋ฌ ๋ณต๊ตฌ ๊ฐ๋ฅ ์ฌ๋ถ ํ์ธ\nexport function isRecoverableError(error: TranslationError): boolean {\n const recoverableCodes: TranslationError['code'][] = [\n 'LOAD_FAILED',\n 'NETWORK_ERROR',\n 'CACHE_ERROR'\n ];\n \n return recoverableCodes.includes(error.code) && \n (error.retryCount || 0) < (error.maxRetries || 3);\n}\n\n// ๊ธฐ๋ณธ ์๋ฌ ๋ณต๊ตฌ ์ ๋ต\nexport const defaultErrorRecoveryStrategy: ErrorRecoveryStrategy = {\n maxRetries: 3,\n retryDelay: 1000,\n backoffMultiplier: 2,\n shouldRetry: isRecoverableError,\n onRetry: (error: TranslationError, attempt: number) => {\n if (process.env.NODE_ENV !== 'production') console.warn(`Retrying translation operation (attempt ${attempt}/${error.maxRetries}):`, error.message);\n },\n onMaxRetriesExceeded: (error: TranslationError) => {\n console.error('Max retries exceeded for translation operation:', error.message);\n }\n};\n\n// ๊ธฐ๋ณธ ์๋ฌ ๋ก๊น
์ค์ \nexport const defaultErrorLoggingConfig: ErrorLoggingConfig = {\n enabled: true,\n level: 'error',\n includeStack: true,\n includeContext: true,\n customLogger: undefined\n};\n\n// ์๋ฌ ๋ก๊น
ํจ์\nexport function logTranslationError(\n error: TranslationError, \n config: ErrorLoggingConfig = defaultErrorLoggingConfig\n): void {\n if (!config.enabled) return;\n\n const logData: Record<string, unknown> = {\n code: error.code,\n message: error.message,\n timestamp: error.timestamp,\n retryCount: error.retryCount,\n maxRetries: error.maxRetries\n };\n\n if (config.includeContext) {\n logData.language = error.language;\n logData.namespace = error.namespace;\n logData.key = error.key;\n logData.context = error.context;\n }\n\n if (config.includeStack && error.stack) {\n logData.stack = error.stack;\n }\n\n if (config.customLogger) {\n config.customLogger(error);\n } else {\n switch (config.level) {\n case 'error':\n console.error('Translation Error:', logData);\n break;\n case 'warn':\n if (process.env.NODE_ENV !== 'production') console.warn('Translation Warning:', logData);\n break;\n case 'info':\n console.info('Translation Info:', logData);\n break;\n case 'debug':\n console.debug('Translation Debug:', logData);\n break;\n }\n }\n} ","import {\n I18nConfig,\n TranslationNamespace,\n TranslationError,\n CacheEntry,\n TranslationResult,\n isTranslationNamespace,\n validateI18nConfig,\n createTranslationError,\n logTranslationError,\n defaultErrorRecoveryStrategy,\n defaultErrorLoggingConfig,\n isRecoverableError,\n isPluralValue,\n PluralCategory\n} from '../types';\n\nexport interface TranslatorInterface {\n translate(key: string, paramsOrLang?: Record<string, unknown> | string, language?: string): string;\n tPlural(key: string, count: number, params?: Record<string, unknown>, language?: string): string;\n setLanguage(lang: string): void;\n getCurrentLanguage(): string;\n initialize(): Promise<void>;\n isReady(): boolean;\n debug(): unknown;\n getRawValue(key: string, language?: string): unknown;\n tArray(key: string, language?: string): string[];\n}\n\nexport class Translator implements TranslatorInterface {\n private cache = new Map<string, CacheEntry>();\n private pluralRulesCache = new Map<string, Intl.PluralRules>();\n private loadedNamespaces = new Set<string>();\n private loadingPromises = new Map<string, Promise<TranslationNamespace>>();\n private allTranslations: Record<string, Record<string, TranslationNamespace>> = {};\n private isInitialized = false;\n private initializationError: TranslationError | null = null;\n private config: I18nConfig;\n private currentLang: string = 'en';\n private cacheStats = {\n hits: 0,\n misses: 0,\n };\n // ๋ฒ์ญ ๋ก๋ ์๋ฃ ์ React ๋ฆฌ๋ ๋๋ง์ ์ํ ์ฝ๋ฐฑ\n private onTranslationLoadedCallbacks: Set<() => void> = new Set();\n // ์ธ์ด ๋ณ๊ฒฝ ์ React ๋ฆฌ๋ ๋๋ง์ ์ํ ์ฝ๋ฐฑ\n private onLanguageChangedCallbacks: Set<(language: string) => void> = new Set();\n // ๋๋ฐ์ด์ฑ์ ์ํ ํ์ด๋จธ\n private notifyTimer: NodeJS.Timeout | null = null;\n // ์ต๊ทผ ์๋ฆผํ ๋ค์์คํ์ด์ค (์ค๋ณต ์๋ฆผ ๋ฐฉ์ง)\n private recentlyNotified = new Set<string>();\n \n /**\n * ๋ฒ์ญ ๋ก๋ ์๋ฃ ์ฝ๋ฐฑ ๋ฑ๋ก\n */\n onTranslationLoaded(callback: () => void): () => void {\n this.onTranslationLoadedCallbacks.add(callback);\n return () => {\n this.onTranslationLoadedCallbacks.delete(callback);\n };\n }\n\n /**\n * ์ธ์ด ๋ณ๊ฒฝ ์ฝ๋ฐฑ ๋ฑ๋ก\n */\n onLanguageChanged(callback: (language: string) => void): () => void {\n this.onLanguageChangedCallbacks.add(callback);\n return () => {\n this.onLanguageChangedCallbacks.delete(callback);\n };\n }\n\n /**\n * ์ธ์ด ๋ณ๊ฒฝ ์ด๋ฒคํธ ๋ฐ์\n */\n private notifyLanguageChanged(language: string): void {\n this.onLanguageChangedCallbacks.forEach(callback => {\n try {\n callback(language);\n } catch (error) {\n if (this.config.debug) {\n console.error('Error in language changed callback:', error);\n }\n }\n });\n }\n \n /**\n * ๋ฒ์ญ ๋ก๋ ์๋ฃ ์ด๋ฒคํธ ๋ฐ์ (๋๋ฐ์ด์ฑ ์ ์ฉ)\n */\n private notifyTranslationLoaded(language: string, namespace: string): void {\n const cacheKey = `${language}:${namespace}`;\n \n // ์ต๊ทผ์ ์๋ฆผํ ๋ค์์คํ์ด์ค๋ ์คํต (์ค๋ณต ์๋ฆผ ๋ฐฉ์ง)\n if (this.recentlyNotified.has(cacheKey)) {\n return;\n }\n \n this.recentlyNotified.add(cacheKey);\n \n // ๋๋ฐ์ด์ฑ: ์งง์ ์๊ฐ ๋ด ์ฌ๋ฌ ๋ฒ์ญ์ด ๋ก๋๋๋ฉด ํ ๋ฒ๋ง ์๋ฆผ\n if (this.notifyTimer) {\n clearTimeout(this.notifyTimer);\n }\n \n this.notifyTimer = setTimeout(() => {\n this.onTranslationLoadedCallbacks.forEach(callback => {\n try {\n callback();\n } catch (error) {\n if (this.config.debug) {\n console.warn('Error in translation loaded callback:', error);\n }\n }\n });\n \n // 100ms ํ recentlyNotified ์ด๊ธฐํ (๊ฐ์ ๋ค์์คํ์ด์ค๋ ๋ค์ ์๋ฆผ ๊ฐ๋ฅํ๋๋ก)\n setTimeout(() => {\n this.recentlyNotified.clear();\n }, 100);\n \n this.notifyTimer = null;\n }, 50); // 50ms ๋๋ฐ์ด์ฑ\n }\n\n constructor(config: I18nConfig) {\n if (!validateI18nConfig(config)) {\n throw new Error('Invalid I18nConfig provided');\n }\n\n this.config = {\n fallbackLanguage: 'en',\n namespaces: ['common'],\n debug: false,\n missingKeyHandler: (key: string) => key,\n errorHandler: (error: Error) => {\n // Silent by default, user can override\n },\n ...config\n };\n this.currentLang = config.defaultLanguage;\n \n // SSR์์ ์ ๋ฌ๋ ์ด๊ธฐ ๋ฒ์ญ ๋ฐ์ดํฐ๊ฐ ์์ผ๋ฉด ์ฆ์ ์ค์ (๋คํธ์ํฌ ์์ฒญ ์์)\n if (config.initialTranslations) {\n this.allTranslations = config.initialTranslations;\n // ๋ก๋๋ ๋ค์์คํ์ด์ค ๋งํน\n for (const [language, namespaces] of Object.entries(config.initialTranslations)) {\n for (const namespace of Object.keys(namespaces)) {\n this.loadedNamespaces.add(`${language}:${namespace}`);\n }\n }\n // initialTranslations๊ฐ ์์ผ๋ฉด ์ด๊ธฐํ ์๋ฃ๋ก ๊ฐ์ฃผ (SSR์์ ์ด๋ฏธ ๋ก๋๋จ)\n // ์ด๋ ๊ฒ ํ๋ฉด ์ด๊ธฐํ ์ ์ํ์์๋ ๋ฒ์ญ์ ์ฌ์ฉํ ์ ์์\n this.isInitialized = true;\n }\n }\n\n /**\n * ๋ชจ๋ ๋ฒ์ญ ๋ฐ์ดํฐ๋ฅผ ๋ฏธ๋ฆฌ ๋ก๋ (hua-api ์คํ์ผ)\n */\n async initialize(): Promise<void> {\n if (this.isInitialized) {\n if (this.config.debug) {\n console.log('๐ซ [TRANSLATOR] Already initialized, skipping');\n }\n return;\n }\n\n if (this.config.debug) {\n console.log('๐ [TRANSLATOR] Starting initialization...');\n }\n\n try {\n // Ensure allTranslations is initialized\n if (!this.allTranslations) {\n this.allTranslations = {};\n }\n\n const languages = [this.currentLang];\n if (this.config.fallbackLanguage && this.config.fallbackLanguage !== this.currentLang) {\n languages.push(this.config.fallbackLanguage);\n }\n \n // ์ด๊ธฐ ๋ฒ์ญ ๋ฐ์ดํฐ๊ฐ ์ด๋ฏธ ์์ผ๋ฉด ํด๋น ๋ค์์คํ์ด์ค๋ ์คํต\n const skipNamespaces = new Set<string>();\n for (const language of languages) {\n if (this.allTranslations[language]) {\n for (const namespace of Object.keys(this.allTranslations[language])) {\n skipNamespaces.add(`${language}:${namespace}`);\n }\n }\n }\n\n if (this.config.debug) {\n console.log('๐ [TRANSLATOR] Initializing translator with languages:', languages);\n console.log('๐ [TRANSLATOR] Current language:', this.currentLang);\n console.log('๐ฆ [TRANSLATOR] Config namespaces:', this.config.namespaces);\n }\n\n for (const language of languages) {\n if (this.config.debug) {\n console.log('Processing language:', language);\n }\n\n if (!this.allTranslations[language]) {\n this.allTranslations[language] = {};\n }\n\n for (const namespace of this.config.namespaces || []) {\n const cacheKey = `${language}:${namespace}`;\n \n // ์ด๋ฏธ ์ด๊ธฐ ๋ฒ์ญ ๋ฐ์ดํฐ๊ฐ ์์ผ๋ฉด ์คํต (๋คํธ์ํฌ ์์ฒญ ์์)\n if (skipNamespaces.has(cacheKey)) {\n if (this.config.debug) {\n console.log('โญ๏ธ [TRANSLATOR] Skipping', namespace, 'for', language, '(already loaded from SSR)');\n }\n continue;\n }\n \n if (this.config.debug) {\n console.log('Loading namespace:', namespace, 'for language:', language);\n }\n\n try {\n const data = await this.safeLoadTranslations(language, namespace);\n\n if (this.config.debug) {\n console.log('Loaded data for', language, namespace, ':', data);\n }\n\n this.allTranslations[language][namespace] = data;\n this.loadedNamespaces.add(`${language}:${namespace}`);\n\n } catch (error) {\n const translationError = this.createTranslationError(\n 'LOAD_FAILED',\n error as Error,\n language,\n namespace\n );\n\n this.logError(translationError);\n\n // ๋ณต๊ตฌ ๊ฐ๋ฅํ ์๋ฌ์ธ์ง ํ์ธ\n if (isRecoverableError(translationError)) {\n // ํด๋ฐฑ ์ธ์ด๋ก ์๋\n if (language !== this.config.fallbackLanguage) {\n try {\n const fallbackData = await this.safeLoadTranslations(this.config.fallbackLanguage || 'en', namespace);\n this.allTranslations[language][namespace] = fallbackData;\n this.loadedNamespaces.add(`${language}:${namespace}`);\n\n if (this.config.debug) {\n console.log('Using fallback data for', language, namespace);\n }\n } catch (fallbackError) {\n const fallbackTranslationError = this.createTranslationError(\n 'FALLBACK_LOAD_FAILED',\n fallbackError as Error,\n this.config.fallbackLanguage,\n namespace\n );\n\n this.logError(fallbackTranslationError);\n\n // ๊ธฐ๋ณธ ๋ฒ์ญ ๋ฐ์ดํฐ ์ฌ์ฉ\n this.allTranslations[language][namespace] = {};\n }\n } else {\n // ๊ธฐ๋ณธ ๋ฒ์ญ ๋ฐ์ดํฐ ์ฌ์ฉ\n this.allTranslations[language][namespace] = {};\n }\n } else {\n // ๋ณต๊ตฌ ๋ถ๊ฐ๋ฅํ ์๋ฌ๋ ๊ธฐ๋ณธ ๋ฒ์ญ ๋ฐ์ดํฐ ์ฌ์ฉ\n this.allTranslations[language][namespace] = {};\n }\n }\n }\n }\n\n this.isInitialized = true;\n\n if (this.config.debug) {\n console.log('Translator initialized successfully');\n console.log('Loaded translations:', this.allTranslations);\n }\n\n } catch (error) {\n this.initializationError = this.createTranslationError(\n 'INITIALIZATION_FAILED',\n error as Error\n );\n\n this.logError(this.initializationError);\n\n // ์๋ฌ๊ฐ ๋ฐ์ํด๋ ์ด๊ธฐํ ์๋ฃ๋ก ํ์ (๊ธฐ๋ณธ ๋ฒ์ญ ์ฌ์ฉ)\n this.isInitialized = true;\n\n if (this.config.debug) {\n console.warn('Translator initialized with errors, using fallback translations');\n }\n }\n }\n\n /**\n * ์ด๊ธฐํ๋์ง ์์ ์ํ์์ ๋ฒ์ญ ์๋\n */\n private translateBeforeInitialized(key: string, targetLang: string): string {\n if (this.config.debug) {\n console.warn('Translator not initialized. Call initialize() first.');\n }\n \n // ์ด๊ธฐํ๋์ง ์์์ ๋๋ ๊ธฐ๋ณธ ๋ฒ์ญ ์๋ (initialTranslations ์ฌ์ฉ)\n const { namespace, key: actualKey } = this.parseKey(key);\n \n // findInNamespace๋ฅผ ์ฌ์ฉํ์ฌ ์ค์ฒฉ ํค๋ ์ฒ๋ฆฌ\n const result = this.findInNamespace(namespace, actualKey, targetLang);\n if (result) {\n if (this.config.debug) {\n console.log(`โ
[TRANSLATOR] Found fallback translation from initialTranslations:`, result);\n }\n return result;\n }\n \n if (this.config.debug) {\n const translations = this.allTranslations[targetLang]?.[namespace];\n console.log(`๐ [TRANSLATOR] Not initialized, fallback failed:`, {\n namespace,\n actualKey,\n hasTranslations: !!translations,\n translationsKeys: translations ? Object.keys(translations) : []\n });\n }\n return this.config.missingKeyHandler?.(key, targetLang, 'default') || key;\n }\n\n /**\n * ๋ค๋ฅธ ๋ก๋๋ ์ธ์ด์์ ๋ฒ์ญ ์ฐพ๊ธฐ (์ธ์ด ๋ณ๊ฒฝ ์ค ๊น๋นก์ ๋ฐฉ์ง)\n */\n private findInOtherLanguages(namespace: string, key: string, targetLang: string): string | null {\n if (!this.allTranslations || Object.keys(this.allTranslations).length === 0) {\n return null;\n }\n\n const loadedLanguages = Object.keys(this.allTranslations);\n for (const lang of loadedLanguages) {\n if (lang !== targetLang) {\n const result = this.findInNamespace(namespace, key, lang);\n if (result) {\n return result;\n }\n }\n }\n \n return null;\n }\n\n /**\n * ํด๋ฐฑ ์ธ์ด์์ ๋ฒ์ญ ์ฐพ๊ธฐ\n */\n private findInFallbackLanguage(namespace: string, key: string, targetLang: string): string | null {\n const fallbackLang = this.config.fallbackLanguage || 'en';\n if (targetLang === fallbackLang) {\n return null;\n }\n\n const result = this.findInNamespace(namespace, key, fallbackLang);\n if (result) {\n this.cacheStats.hits++;\n return result;\n }\n \n return null;\n }\n\n /**\n * ๋ฒ์ญ ํค๋ฅผ ๋ฒ์ญ๋ ํ
์คํธ๋ก ๋ณํ\n */\n translate(key: string, paramsOrLang?: Record<string, unknown> | string, language?: string): string {\n // ๋ ๋ฒ์งธ ์ธ์ ํ์
์ผ๋ก ๋ถ๊ธฐ\n let params: Record<string, unknown> | undefined;\n let targetLang: string;\n if (typeof paramsOrLang === 'string') {\n targetLang = paramsOrLang;\n } else if (typeof paramsOrLang === 'object' && paramsOrLang !== null) {\n params = paramsOrLang;\n targetLang = language || this.currentLang;\n } else {\n targetLang = this.currentLang;\n }\n\n // ์ด๊ธฐํ๋์ง ์์ ๊ฒฝ์ฐ ์ฒ๋ฆฌ\n if (!this.isInitialized) {\n const raw = this.translateBeforeInitialized(key, targetLang);\n return params ? this.interpolate(raw, params) : raw;\n }\n\n const { namespace, key: actualKey } = this.parseKey(key);\n\n // 1๋จ๊ณ: ํ์ฌ ์ธ์ด์์ ์ฐพ๊ธฐ\n let result: string | null = this.findInNamespace(namespace, actualKey, targetLang);\n if (result) {\n this.cacheStats.hits++;\n return params ? this.interpolate(result, params) : result;\n }\n\n // 2๋จ๊ณ: ๋ค๋ฅธ ๋ก๋๋ ์ธ์ด์์ ์ฐพ๊ธฐ (์ธ์ด ๋ณ๊ฒฝ ์ค ๊น๋นก์ ๋ฐฉ์ง)\n result = this.findInOtherLanguages(namespace, actualKey, targetLang);\n if (result) {\n return params ? this.interpolate(result, params) : result;\n }\n\n // 3๋จ๊ณ: ํด๋ฐฑ ์ธ์ด์์ ์ฐพ๊ธฐ\n result = this.findInFallbackLanguage(namespace, actualKey, targetLang);\n if (result) {\n return params ? this.interpolate(result, params) : result;\n }\n\n // ๋ชจ๋ ๋จ๊ณ์์ ์ฐพ์ง ๋ชปํ ๊ฒฝ์ฐ\n this.cacheStats.misses++;\n\n if (this.config.debug) {\n const missing = this.config.missingKeyHandler?.(key, targetLang, namespace) || key;\n return params ? this.interpolate(missing, params) : missing;\n }\n\n // ํ๋ก๋์
์์๋ ๋น ๋ฌธ์์ด ๋ฐํ (๋ฏธ์ฑ ํค ๋
ธ์ถ ๋ฐฉ์ง)\n return '';\n }\n\n /**\n * ๋ค์์คํ์ด์ค์์ ํค ์ฐพ๊ธฐ\n */\n private findInNamespace(namespace: string, key: string, language: string): string {\n const translations = this.allTranslations[language]?.[namespace];\n\n if (!translations) {\n // ๋ค์์คํ์ด์ค๊ฐ ์์ผ๋ฉด ์๋์ผ๋ก ๋ก๋ ์๋ (๋น๋๊ธฐ, ๋ฐฑ๊ทธ๋ผ์ด๋)\n const cacheKey = `${language}:${namespace}`;\n if (!this.loadedNamespaces.has(cacheKey) && !this.loadingPromises.has(cacheKey)) {\n // ๋ก๋ฉ ์์ (๋น๋๊ธฐ, ์ฆ์ ๋ฐํํ์ง ์์)\n this.loadTranslationData(language, namespace).catch(error => {\n if (this.config.debug) {\n console.warn(`โ ๏ธ [TRANSLATOR] Auto-load failed for ${language}/${namespace}:`, error);\n }\n });\n \n // ๋๋ฒ๊ทธ ๋ชจ๋์์๋ง ์ฒซ ์๋ ์์๋ง ๊ฒฝ๊ณ ์ถ๋ ฅ (์ค๋ณต ๋ฐฉ์ง)\n if (this.config.debug) {\n console.warn(`โ [TRANSLATOR] No translations found for ${language}/${namespace}, attempting auto-load...`);\n }\n }\n return '';\n }\n\n // ์ง์ ํค ๋งค์นญ\n const directValue = translations[key];\n if (this.isStringValue(directValue)) {\n return directValue;\n }\n if (this.isStringArray(directValue)) {\n return directValue[Math.floor(Math.random() * directValue.length)];\n }\n\n // ์ค์ฒฉ ํค ๋งค์นญ (์: \"user.profile.name\")\n const nestedValue = this.getNestedValue(translations, key);\n if (this.isStringValue(nestedValue)) {\n return nestedValue;\n }\n if (this.isStringArray(nestedValue)) {\n return nestedValue[Math.floor(Math.random() * nestedValue.length)];\n }\n\n if (this.config.debug) {\n console.warn(`โ [TRANSLATOR] No match found for key: ${key} in ${language}/${namespace}`);\n }\n return '';\n }\n\n /**\n * ์ค์ฒฉ๋ ๊ฐ์ฒด์์ ๊ฐ์ ๊ฐ์ ธ์ค๊ธฐ\n * ๋ฐฐ์ด๋ ์ง์: ์ต์ข
๊ฐ์ด string[]์ด๋ฉด ๊ทธ๋๋ก ๋ฐํ\n */\n private getNestedValue(obj: unknown, path: string): unknown {\n if (typeof obj !== 'object' || obj === null || Array.isArray(obj)) {\n return undefined;\n }\n\n return path.split('.').reduce((current: unknown, key: string) => {\n if (current == null) return undefined;\n if (Array.isArray(current)) {\n const idx = Number(key);\n return Number.isInteger(idx) ? current[idx] : undefined;\n }\n if (typeof current === 'object' && key in (current as Record<string, unknown>)) {\n return (current as Record<string, unknown>)[key];\n }\n return undefined;\n }, obj);\n }\n \n /**\n * ๋ฌธ์์ด ๊ฐ์ธ์ง ํ์ธํ๋ ํ์
๊ฐ๋\n */\n private isStringValue(value: unknown): value is string {\n return typeof value === 'string' && value.length > 0;\n }\n\n /**\n * string[] ๋ฐฐ์ด์ธ์ง ํ์ธํ๋ ํ์
๊ฐ๋\n * ๋ฐฐ์ด ๊ฐ์ด t()์ ์ ๋ฌ๋๋ฉด ๋๋ค์ผ๋ก ํ๋๋ฅผ ์ ํํ์ฌ ๋ฐํ\n */\n private isStringArray(value: unknown): value is string[] {\n return Array.isArray(value) && value.length > 0 && value.every(v => typeof v === 'string');\n }\n\n /**\n * ์์ ๊ฐ ๊ฐ์ ธ์ค๊ธฐ (๋ฐฐ์ด, ๊ฐ์ฒด ํฌํจ)\n */\n getRawValue(key: string, language?: string): unknown {\n const targetLang = language || this.currentLang;\n\n if (!this.isInitialized) {\n if (this.config.debug) {\n console.warn('Translator not initialized. Call initialize() first.');\n }\n return undefined;\n }\n\n const { namespace, key: actualKey } = this.parseKey(key);\n const translations = this.allTranslations[targetLang]?.[namespace];\n\n if (!translations) {\n return undefined;\n }\n\n // ์ง์ ํค ๋งค์นญ\n if (actualKey in translations) {\n return translations[actualKey];\n }\n\n // ์ค์ฒฉ ํค ๋งค์นญ\n const nestedValue = this.getNestedValue(translations, actualKey);\n if (nestedValue !== undefined) {\n return nestedValue;\n }\n\n // ํด๋ฐฑ ์ธ์ด์์ ์ฐพ๊ธฐ\n if (targetLang !== this.config.fallbackLanguage) {\n const fallbackTranslations = this.allTranslations[this.config.fallbackLanguage || 'en']?.[namespace];\n if (fallbackTranslations) {\n if (actualKey in fallbackTranslations) {\n return fallbackTranslations[actualKey];\n }\n const fallbackNestedValue = this.getNestedValue(fallbackTranslations, actualKey);\n if (fallbackNestedValue !== undefined) {\n return fallbackNestedValue;\n }\n }\n }\n\n return undefined;\n }\n\n /**\n * ๋ฐฐ์ด ๋ฒ์ญ ๊ฐ ๊ฐ์ ธ์ค๊ธฐ (ํ์
์์ )\n */\n tArray(key: string, language?: string): string[] {\n const raw = this.getRawValue(key, language);\n if (Array.isArray(raw) && raw.every((v: unknown) => typeof v === 'string')) {\n return raw as string[];\n }\n if (process.env.NODE_ENV === 'development') {\n console.warn(`tArray: \"${key}\" is not a string array`);\n }\n return [];\n }\n\n /**\n * Intl.PluralRules ์ธ์คํด์ค (์ธ์ด๋ณ ์บ์)\n */\n private getPluralRules(language: string): Intl.PluralRules {\n let rules = this.pluralRulesCache.get(language);\n if (!rules) {\n rules = new Intl.PluralRules(language);\n this.pluralRulesCache.set(language, rules);\n }\n return rules;\n }\n\n /**\n * ๋ณต์ํ ๋ฒ์ญ (ICU / Intl.PluralRules ๊ธฐ๋ฐ)\n *\n * JSON: { \"other\": \"์ด {count}๊ฐ\" } (ko)\n * { \"one\": \"{count} item\", \"other\": \"{count} items\" } (en)\n *\n * tPlural('common:total_count', 1) โ en: \"1 item\" / ko: \"์ด 1๊ฐ\"\n * tPlural('common:total_count', 5) โ en: \"5 items\" / ko: \"์ด 5๊ฐ\"\n */\n tPlural(key: string, count: number, params?: Record<string, unknown>, language?: string): string {\n const targetLang = language || this.currentLang;\n const raw = this.getRawValue(key, targetLang);\n const mergedParams: Record<string, unknown> = { count, ...params };\n\n // PluralValue ๊ฐ์ฒด์ธ ๊ฒฝ์ฐ: Intl.PluralRules๋ก ์นดํ
๊ณ ๋ฆฌ ๊ฒฐ์ \n if (isPluralValue(raw)) {\n const category = this.getPluralRules(targetLang).select(count) as PluralCategory;\n const text = raw[category] ?? raw.other;\n return this.interpolate(text, mergedParams);\n }\n\n // fallback: plain string์ด๋ฉด interpolate๋ง\n if (typeof raw === 'string') {\n return this.interpolate(raw, mergedParams);\n }\n\n // ํค๋ฅผ ์ฐพ์ง ๋ชปํ ๊ฒฝ์ฐ\n if (this.config.debug) {\n return this.interpolate(key, mergedParams);\n }\n return '';\n }\n\n /**\n * ๋งค๊ฐ๋ณ์ ๋ณด๊ฐ\n *\n * ์ง์ ํ์:\n * - {key} - ๋จ์ผ ์ค๊ดํธ (์ผ๋ฐ์ ์ธ i18n ํ์)\n * - {{key}} - ์ด์ค ์ค๊ดํธ (ํ์ ํธํ์ฑ)\n */\n private interpolate(text: string, params: Record<string, unknown>): string {\n // ๋จ์ผ ์ค๊ดํธ {key} ๋๋ ์ด์ค ์ค๊ดํธ {{key}} ๋ชจ๋ ์ง์\n return text.replace(/\\{\\{?(\\w+)\\}?\\}/g, (match, key) => {\n const value = params[key];\n return value !== undefined ? String(value) : match;\n });\n }\n\n /**\n * ์ธ์ด ์ค์ \n */\n setLanguage(language: string): void {\n if (this.currentLang === language) {\n return;\n }\n\n const previousLanguage = this.currentLang;\n this.currentLang = language;\n\n // ์ธ์ด ๋ณ๊ฒฝ ์ด๋ฒคํธ ๋ฐ์\n this.notifyLanguageChanged(language);\n\n // ์๋ก์ด ์ธ์ด์ ๋ฐ์ดํฐ๊ฐ ๋ก๋๋์ง ์์๋ค๋ฉด ๋ก๋\n if (!this.allTranslations[language]) {\n this.loadLanguageData(language).catch(error => {\n if (this.config.debug) {\n console.warn('Failed to load language data:', error);\n }\n });\n }\n\n if (this.config.debug) {\n console.log(`๐ [TRANSLATOR] Language changed: ${previousLanguage} -> ${language}`);\n }\n }\n\n /**\n * ์ธ์ด ๋ฐ์ดํฐ ๋ก๋\n */\n private async loadLanguageData(language: string): Promise<void> {\n if (!this.allTranslations[language]) {\n this.allTranslations[language] = {};\n }\n\n for (const namespace of this.config.namespaces || []) {\n try {\n const data = await this.safeLoadTranslations(language, namespace);\n this.allTranslations[language][namespace] = data;\n this.loadedNamespaces.add(`${language}:${namespace}`);\n \n // ์ธ์ด ๋ณ๊ฒฝ ์ ๋ฒ์ญ ๋ก๋ ์๋ฃ ์๋ฆผ\n this.notifyTranslationLoaded(language, namespace);\n } catch (error) {\n const translationError = this.createTranslationError(\n 'LOAD_FAILED',\n error as Error,\n language,\n namespace\n );\n\n this.logError(translationError);\n\n // ๋ณต๊ตฌ ๊ฐ๋ฅํ ์๋ฌ์ธ์ง ํ์ธ\n if (isRecoverableError(translationError)) {\n // ์ฌ์๋๋ safeLoadTranslations ๋ด๋ถ์์ ์ฒ๋ฆฌ๋๋ฏ๋ก ์ฌ๊ธฐ์๋ ๊ธฐ๋ณธ๊ฐ ์ฌ์ฉ\n this.allTranslations[language][namespace] = {};\n } else {\n // ๋ณต๊ตฌ ๋ถ๊ฐ๋ฅํ ์๋ฌ๋ ๊ธฐ๋ณธ ๋ฒ์ญ ๋ฐ์ดํฐ ์ฌ์ฉ\n this.allTranslations[language][namespace] = {};\n }\n }\n }\n }\n\n /**\n * ํ์ฌ ์ธ์ด ๊ฐ์ ธ์ค๊ธฐ\n */\n getCurrentLanguage(): string {\n return this.currentLang;\n }\n\n /**\n * ์ง์๋๋ ์ธ์ด ๋ชฉ๋ก ๊ฐ์ ธ์ค๊ธฐ\n */\n getSupportedLanguages(): string[] {\n return this.config.supportedLanguages?.map(lang => lang.code) || [];\n }\n\n /**\n * ์ด๊ธฐํ ์๋ฃ ์ฌ๋ถ ํ์ธ\n */\n isReady(): boolean {\n return this.isInitialized && !this.initializationError;\n }\n\n /**\n * ์ด๊ธฐํ ์ค๋ฅ ๊ฐ์ ธ์ค๊ธฐ\n */\n getInitializationError(): TranslationError | null {\n return this.initializationError;\n }\n\n /**\n * ์บ์ ํด๋ฆฌ์ด\n */\n clearCache(): void {\n this.cache.clear();\n this.cacheStats = { hits: 0, misses: 0 };\n\n if (this.config.debug) {\n console.log('Cache cleared');\n }\n }\n\n /**\n * ์บ์ ์ํธ๋ฆฌ ์ค์ \n */\n private setCacheEntry(key: string, data: TranslationNamespace): void {\n this.cache.set(key, {\n data,\n timestamp: Date.now(),\n ttl: 5 * 60 * 1000 // 5๋ถ\n });\n }\n\n /**\n * ์บ์ ์ํธ๋ฆฌ ๊ฐ์ ธ์ค๊ธฐ\n */\n private getCacheEntry(key: string): TranslationNamespace | null {\n const entry = this.cache.get(key);\n\n if (!entry) {\n return null;\n }\n\n // TTL ์ฒดํฌ\n if (Date.now() - entry.timestamp > entry.ttl) {\n this.cache.delete(key);\n return null;\n }\n\n return entry.data;\n }\n\n /**\n * ๋ฒ์ญ ์ค๋ฅ ์์ฑ\n */\n private createTranslationError(\n code: TranslationError['code'],\n originalError: Error,\n language?: string,\n namespace?: string,\n key?: string\n ): TranslationError {\n return {\n name: 'TranslationError',\n code,\n message: originalError.message,\n originalError,\n language,\n namespace,\n key,\n timestamp: Date.now(),\n stack: originalError.stack\n };\n }\n\n /**\n * ์ค๋ฅ ๋ก๊น
\n */\n private logError(error: TranslationError): void {\n if (this.config.errorHandler) {\n this.config.errorHandler(error, error.language || '', error.namespace || '');\n }\n }\n\n /**\n * ์ฌ์๋ ์์
\n */\n private async retryOperation<T>(\n operation: () => Promise<T>,\n error: TranslationError,\n context: { language?: string; namespace?: string; key?: string }\n ): Promise<T> {\n const maxRetries = 3;\n let lastError = error;\n\n for (let attempt = 1; attempt <= maxRetries; attempt++) {\n try {\n return await operation();\n } catch (retryError) {\n lastError = this.createTranslationError(\n 'RETRY_FAILED',\n retryError as Error,\n context.language,\n context.namespace,\n context.key\n );\n\n if (attempt === maxRetries) {\n break;\n }\n\n // ์ง์ ๋ฐฑ์คํ\n await new Promise(resolve => setTimeout(resolve, Math.pow(2, attempt) * 1000));\n }\n }\n\n throw lastError;\n }\n\n /**\n * ์์ ํ ๋ฒ์ญ ๋ก๋\n */\n private async safeLoadTranslations(language: string, namespace: string): Promise<TranslationNamespace> {\n if (this.config.debug) {\n console.log(`๐ฅ [TRANSLATOR] safeLoadTranslations called:`, { language, namespace });\n }\n\n const loadOperation = async (): Promise<TranslationNamespace> => {\n if (!this.config.loadTranslations) {\n throw new Error('No translation loader configured');\n }\n\n if (this.config.debug) {\n console.log(`๐ [TRANSLATOR] Calling loadTranslations for:`, { language, namespace });\n }\n\n const data = await this.config.loadTranslations(language, namespace);\n\n if (this.config.debug) {\n console.log(`๐ฆ [TRANSLATOR] loadTranslations returned:`, data);\n }\n\n if (!isTranslationNamespace(data)) {\n throw new Error(`Invalid translation data for ${language}:${namespace}`);\n }\n\n return data;\n };\n\n try {\n return await loadOperation();\n } catch (error) {\n const translationError = this.createTranslationError(\n 'LOAD_FAILED',\n error as Error,\n language,\n namespace\n );\n\n return this.retryOperation(loadOperation, translationError, { language, namespace });\n }\n }\n\n /**\n * ๋๋ฒ๊ทธ ์ ๋ณด\n */\n debug() {\n return {\n isInitialized: this.isInitialized,\n currentLanguage: this.currentLang,\n loadedNamespaces: Array.from(this.loadedNamespaces),\n cacheStats: this.cacheStats,\n cacheSize: this.cache.size,\n allTranslations: this.allTranslations,\n initializationError: this.initializationError,\n config: this.config\n };\n }\n\n /**\n * SSR์์ ํ์ด๋๋ ์ด์
\n */\n hydrateFromSSR(translations: Record<string, Record<string, TranslationNamespace>>): void {\n this.allTranslations = translations;\n this.isInitialized = true;\n\n // ๋ก๋๋ ๋ค์์คํ์ด์ค ์
๋ฐ์ดํธ\n for (const [language, namespaces] of Object.entries(translations)) {\n for (const namespace of Object.keys(namespaces)) {\n this.loadedNamespaces.add(`${language}:${namespace}`);\n }\n }\n }\n\n /**\n * ๋น๋๊ธฐ ๋ฒ์ญ (๊ณ ๊ธ ๊ธฐ๋ฅ)\n */\n async translateAsync(key: string, params?: Record<string, unknown>): Promise<string> {\n if (!this.isInitialized) {\n await this.initialize();\n }\n\n const translated = this.translate(key);\n\n if (!params) {\n return translated;\n }\n\n return this.interpolate(translated, params);\n }\n\n /**\n * ๋๊ธฐ ๋ฒ์ญ (๊ณ ๊ธ ๊ธฐ๋ฅ)\n */\n translateSync(key: string, params?: Record<string, unknown>): string {\n if (!this.isInitialized) {\n if (this.config.debug) {\n console.warn('Translator not initialized for sync translation');\n }\n const { namespace } = this.parseKey(key);\n return this.config.missingKeyHandler?.(key, this.currentLang, namespace) || key;\n }\n\n const translated = this.translate(key);\n\n if (!params) {\n return translated;\n }\n\n return this.interpolate(translated, params);\n }\n\n /**\n * ํค ํ์ฑ (๋ค์์คํ์ด์ค:ํค ํ์)\n * \n * - ์ฝ๋ก (:)๋ง ๋ค์์คํ์ด์ค ๊ตฌ๋ถ์๋ก ์ฌ์ฉ\n * - ์ (.)์ ํค ์ด๋ฆ์ ์ผ๋ถ๋ก ์ทจ๊ธ (์ค์ฒฉ ๊ฐ์ฒด ์ ๊ทผ์ฉ)\n * \n * @example\n * parseKey(\"home:hero.badge\") โ { namespace: \"home\", key: \"hero.badge\" }\n * parseKey(\"hero.badge\") โ { namespace: \"common\", key: \"hero.badge\" }\n * parseKey(\"save\") โ { namespace: \"common\", key: \"save\" }\n */\n private parseKey(key: string): { namespace: string; key: string } {\n // ์ฝ๋ก (:)๋ง ๋ค์์คํ์ด์ค ๊ตฌ๋ถ์๋ก ์ฌ์ฉ\n const colonIndex = key.indexOf(':');\n if (colonIndex !== -1) {\n return { namespace: key.substring(0, colonIndex), key: key.substring(colonIndex + 1) };\n }\n\n // ์ฝ๋ก ์ด ์์ผ๋ฉด common ๋ค์์คํ์ด์ค๋ก ๊ฐ์ฃผ\n // ์ (.)์ ํค ์ด๋ฆ์ ์ผ๋ถ (์ค์ฒฉ ๊ฐ์ฒด ์ ๊ทผ์ getNestedValue์์ ์ฒ๋ฆฌ)\n return { namespace: 'common', key };\n }\n\n /**\n * ๋ฒ์ญ ๋ฐ์ดํฐ ๋ก๋ (๊ณ ๊ธ ๊ธฐ๋ฅ)\n */\n private async loadTranslationData(language: string, namespace: string): Promise<TranslationNamespace> {\n const cacheKey = `${language}:${namespace}`;\n\n // ์ด๋ฏธ ๋ก๋๋ ๋ค์์คํ์ด์ค์ธ์ง ํ์ธ\n if (this.loadedNamespaces.has(cacheKey)) {\n const existing = this.allTranslations[language]?.[namespace];\n if (existing) {\n return existing;\n }\n }\n\n // ์บ์์์ ํ์ธ\n const cached = this.getCacheEntry(cacheKey);\n if (cached) {\n // ์บ์์ ์์ผ๋ฉด allTranslations์๋ ์ ์ฅ\n if (!this.allTranslations[language]) {\n this.allTranslations[language] = {};\n }\n this.allTranslations[language][namespace] = cached;\n this.loadedNamespaces.add(cacheKey);\n return cached;\n }\n\n // ๋ก๋ฉ ์ค์ธ์ง ํ์ธ\n const loadingPromise = this.loadingPromises.get(cacheKey);\n if (loadingPromise) {\n return loadingPromise;\n }\n\n // ์๋ก ๋ก๋\n const loadPromise = this._loadTranslationData(language, namespace);\n this.loadingPromises.set(cacheKey, loadPromise);\n\n try {\n const data = await loadPromise;\n \n // allTranslations์ ์ ์ฅ (์ค์: ์ด๋ ๊ฒ ํด์ผ findInNamespace์์ ์ฐพ์ ์ ์์)\n if (!this.allTranslations[language]) {\n this.allTranslations[language] = {};\n }\n this.allTranslations[language][namespace] = data;\n this.loadedNamespaces.add(cacheKey);\n \n // ์บ์์๋ ์ ์ฅ\n this.setCacheEntry(cacheKey, data);\n \n if (this.config.debug) {\n console.log(`โ
[TRANSLATOR] Auto-loaded and saved ${language}/${namespace}`);\n }\n \n // React ๋ฆฌ๋ ๋๋ง ํธ๋ฆฌ๊ฑฐ (๋๋ฐ์ด์ฑ ์ ์ฉ)\n this.notifyTranslationLoaded(language, namespace);\n \n return data;\n } finally {\n this.loadingPromises.delete(cacheKey);\n }\n }\n\n /**\n * ์ค์ ๋ฒ์ญ ๋ฐ์ดํฐ ๋ก๋\n */\n private async _loadTranslationData(language: string, namespace: string): Promise<TranslationNamespace> {\n if (!this.config.loadTranslations) {\n throw new Error('No translation loader configured');\n }\n\n try {\n const data = await this.config.loadTranslations(language, namespace);\n\n if (!isTranslationNamespace(data)) {\n throw new Error(`Invalid translation data for ${language}:${namespace}`);\n }\n\n return data;\n } catch (error) {\n const translationError = this.createTranslationError(\n 'LOAD_FAILED',\n error as Error,\n language,\n namespace\n );\n\n this.logError(translationError);\n\n // ๊ธฐ๋ณธ ๋ฒ์ญ ๋ฐ์ดํฐ ๋ฐํ\n return {};\n }\n }\n}\n\n// SSR ๋ฒ์ญ ํจ์๋ค\nexport function ssrTranslate({\n translations,\n key,\n language = 'ko',\n fallbackLanguage = 'en',\n missingKeyHandler = (key: string) => key\n}: {\n translations: Record<string, Record<string, TranslationNamespace>>;\n key: string;\n language?: string;\n fallbackLanguage?: string;\n missingKeyHandler?: (key: string) => string;\n}): string {\n const { namespace, key: actualKey } = parseKey(key);\n\n // ํ์ฌ ์ธ์ด์์ ์ฐพ๊ธฐ\n let result = ssrFindInNamespace(translations, namespace, actualKey, language, fallbackLanguage, missingKeyHandler);\n\n if (result) {\n return result;\n }\n\n // ํด๋ฐฑ ์ธ์ด์์ ์ฐพ๊ธฐ\n if (language !== fallbackLanguage) {\n result = ssrFindInNamespace(translations, namespace, actualKey, fallbackLanguage, fallbackLanguage, missingKeyHandler);\n if (result) {\n return result;\n }\n }\n\n return missingKeyHandler(key);\n}\n\nfunction ssrFindInNamespace(\n translations: Record<string, Record<string, TranslationNamespace>>,\n namespace: string,\n key: string,\n language: string,\n fallbackLanguage: string,\n missingKeyHandler: (key: string) => string\n): string {\n const namespaceData = translations[language]?.[namespace];\n\n if (!namespaceData) {\n return '';\n }\n\n // ์ง์ ํค ๋งค์นญ\n const directValue = namespaceData[key];\n if (isStringValue(directValue)) {\n return directValue;\n }\n\n // ์ค์ฒฉ ํค ๋งค์นญ\n const nestedValue = getNestedValue(namespaceData, key);\n if (isStringValue(nestedValue)) {\n return nestedValue;\n }\n\n return '';\n}\n\nfunction getNestedValue(obj: unknown, path: string): unknown {\n if (typeof obj !== 'object' || obj === null || Array.isArray(obj)) {\n return undefined;\n }\n\n return path.split('.').reduce((current: unknown, key: string) => {\n if (current && typeof current === 'object' && !Array.isArray(current) && key in current) {\n return (current as Record<string, unknown>)[key];\n }\n return undefined;\n }, obj);\n}\n\n/**\n * ๋ฌธ์์ด ๊ฐ์ธ์ง ํ์ธํ๋ ํ์
๊ฐ๋\n */\nfunction isStringValue(value: unknown): value is string {\n return typeof value === 'string' && value.length > 0;\n}\n\n/**\n * ํค ํ์ฑ (๋ค์์คํ์ด์ค:ํค ํ์) - SSR์ฉ standalone ํจ์\n * \n * - ์ฝ๋ก (:)๋ง ๋ค์์คํ์ด์ค ๊ตฌ๋ถ์๋ก ์ฌ์ฉ\n * - ์ (.)์ ํค ์ด๋ฆ์ ์ผ๋ถ๋ก ์ทจ๊ธ (์ค์ฒฉ ๊ฐ์ฒด ์ ๊ทผ์ฉ)\n */\nfunction parseKey(key: string): { namespace: string; key: string } {\n // ์ฝ๋ก (:)๋ง ๋ค์์คํ์ด์ค ๊ตฌ๋ถ์๋ก ์ฌ์ฉ\n const colonIndex = key.indexOf(':');\n if (colonIndex !== -1) {\n return { namespace: key.substring(0, colonIndex), key: key.substring(colonIndex + 1) };\n }\n\n // ์ฝ๋ก ์ด ์์ผ๋ฉด common ๋ค์์คํ์ด์ค๋ก ๊ฐ์ฃผ\n return { namespace: 'common', key };\n}\n\n// ์๋ฒ ๋ฒ์ญ ํจ์ (๊ณ ๊ธ ๊ธฐ๋ฅ ํฌํจ)\nexport function serverTranslate({\n translations,\n key,\n language = 'ko',\n fallbackLanguage = 'en',\n missingKeyHandler = (key: string) => key,\n options = {}\n}: {\n translations: Record<string, unknown>; // ๋ฒ์ญ ๋ฐ์ดํฐ\n key: string; // ๋ฒ์ญ ํค\n language?: string; // ์ธ์ด ์ฝ๋\n fallbackLanguage?: string; // ํด๋ฐฑ ์ธ์ด\n missingKeyHandler?: (key: string) => string; // ๋๋ฝ ํค ์ฒ๋ฆฌ\n options?: {\n cache?: Map<string, string>; // ์บ์ (์ ํ์ )\n metrics?: { hits: number; misses: number }; // ๋ฉํธ๋ฆญ (์ ํ์ )\n debug?: boolean; // ๋๋ฒ๊ทธ ๋ชจ๋ (์ ํ์ )\n };\n}): string {\n const { cache, metrics, debug } = options;\n\n // ์บ์์์ ํ์ธ\n if (cache) {\n const cacheKey = `${language}:${key}`;\n const cached = cache.get(cacheKey);\n if (cached) {\n if (metrics) metrics.hits++;\n if (debug) console.log(`[CACHE HIT] ${cacheKey}`);\n return cached;\n }\n }\n\n // ๋ฒ์ญ ์ฐพ๊ธฐ\n const result = findInTranslations(translations, key, language, fallbackLanguage, missingKeyHandler);\n\n // ์บ์์ ์ ์ฅ\n if (cache && result) {\n const cacheKey = `${language}:${key}`;\n cache.set(cacheKey, result);\n }\n\n if (metrics) metrics.misses++;\n if (debug) console.log(`[TRANSLATE] ${key} -> ${result}`);\n\n return result;\n}\n\nfunction findInTranslations(\n translations: Record<string, unknown>,\n key: string,\n language: string,\n fallbackLanguage: string,\n missingKeyHandler: (key: string) => string\n): string {\n const { namespace, key: actualKey } = parseKey(key);\n\n // ํ์ฌ ์ธ์ด์์ ์ฐพ๊ธฐ\n let result = findInNamespace(translations, namespace, actualKey, language);\n\n if (result) {\n return result;\n }\n\n // ํด๋ฐฑ ์ธ์ด์์ ์ฐพ๊ธฐ\n if (language !== fallbackLanguage) {\n result = findInNamespace(translations, namespace, actualKey, fallbackLanguage);\n if (result) {\n return result;\n }\n }\n\n return '';\n}\n\nfunction findInNamespace(\n translations: Record<string, unknown>,\n namespace: string,\n key: string,\n language: string\n): string {\n // ์ธ์ด ๋ฐ์ดํฐ ๊ฐ์ ธ์ค๊ธฐ\n const languageData = translations[language];\n\n // ์ธ์ด ๋ฐ์ดํฐ๊ฐ ๊ฐ์ฒด์ธ์ง ํ์ธ\n if (!languageData || typeof languageData !== 'object' || Array.isArray(languageData)) {\n return '';\n }\n\n // ๋ค์์คํ์ด์ค ๋ฐ์ดํฐ ๊ฐ์ ธ์ค๊ธฐ\n const namespaceData = (languageData as Record<string, unknown>)[namespace];\n\n if (!namespaceData || typeof namespaceData !== 'object' || Array.isArray(namespaceData)) {\n return '';\n }\n\n // ํ์
๋จ์ธ: namespaceData๋ ๊ฐ์ฒด์์ ํ์ธํ์ผ๋ฏ๋ก Record๋ก ๋จ์ธ\n const data = namespaceData as Record<string, unknown>;\n\n // ์ง์ ํค ๋งค์นญ\n if (data[key] && typeof data[key] === 'string') {\n return data[key] as string;\n }\n\n // ์ค์ฒฉ ํค ๋งค์นญ\n const nestedValue = getNestedValue(namespaceData, key);\n if (typeof nestedValue === 'string') {\n return nestedValue;\n }\n\n return '';\n}"]}
|
package/dist/server.mjs
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":[],"names":[],"mappings":"","file":"server.mjs"}
|
package/package.json
CHANGED
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@hua-labs/i18n-core",
|
|
3
|
-
"version": "2.0.
|
|
3
|
+
"version": "2.0.4",
|
|
4
4
|
"description": "HUA Labs - Core i18n functionality with SSR/CSR support and state management integration",
|
|
5
5
|
"main": "./dist/index.js",
|
|
6
|
+
"module": "./dist/index.mjs",
|
|
6
7
|
"types": "./dist/index.d.ts",
|
|
7
8
|
"files": [
|
|
8
9
|
"dist",
|
|
@@ -10,34 +11,49 @@
|
|
|
10
11
|
],
|
|
11
12
|
"exports": {
|
|
12
13
|
".": {
|
|
13
|
-
"
|
|
14
|
-
"
|
|
15
|
-
"
|
|
14
|
+
"types": "./dist/index.d.ts",
|
|
15
|
+
"import": "./dist/index.mjs",
|
|
16
|
+
"require": "./dist/index.js"
|
|
17
|
+
},
|
|
18
|
+
"./server": {
|
|
19
|
+
"types": "./dist/server.d.ts",
|
|
20
|
+
"import": "./dist/server.mjs",
|
|
21
|
+
"require": "./dist/server.js"
|
|
16
22
|
}
|
|
17
23
|
},
|
|
18
24
|
"sideEffects": false,
|
|
19
|
-
"
|
|
25
|
+
"engines": {
|
|
26
|
+
"node": ">=20.0.0"
|
|
27
|
+
},
|
|
20
28
|
"devDependencies": {
|
|
21
|
-
"@
|
|
22
|
-
"@
|
|
23
|
-
"@types/
|
|
24
|
-
"
|
|
25
|
-
"
|
|
26
|
-
"
|
|
27
|
-
"
|
|
29
|
+
"@testing-library/jest-dom": "^6.6.3",
|
|
30
|
+
"@testing-library/react": "^16.3.0",
|
|
31
|
+
"@types/node": "^25.2.0",
|
|
32
|
+
"@types/react": "^19.2.10",
|
|
33
|
+
"@vitejs/plugin-react": "^4.5.2",
|
|
34
|
+
"eslint": "^10.0.0",
|
|
35
|
+
"jsdom": "^26.1.0",
|
|
36
|
+
"react": "^19.2.4",
|
|
37
|
+
"react-dom": "^19.2.4",
|
|
38
|
+
"tsup": "^8.5.1",
|
|
39
|
+
"typescript": "^5.9.3",
|
|
40
|
+
"vitest": "^3.2.1"
|
|
28
41
|
},
|
|
29
42
|
"peerDependencies": {
|
|
30
|
-
"react": ">=
|
|
43
|
+
"react": ">=19.0.0"
|
|
31
44
|
},
|
|
32
45
|
"keywords": [
|
|
46
|
+
"hua-labs",
|
|
33
47
|
"i18n",
|
|
34
48
|
"internationalization",
|
|
49
|
+
"localization",
|
|
35
50
|
"react",
|
|
36
51
|
"typescript",
|
|
37
52
|
"ssr",
|
|
38
53
|
"csr",
|
|
39
|
-
"
|
|
40
|
-
"
|
|
54
|
+
"translation",
|
|
55
|
+
"nextjs",
|
|
56
|
+
"zero-flicker"
|
|
41
57
|
],
|
|
42
58
|
"author": "HUA Labs",
|
|
43
59
|
"license": "MIT",
|
|
@@ -49,12 +65,19 @@
|
|
|
49
65
|
"url": "https://github.com/HUA-Labs/HUA-Labs-public/issues"
|
|
50
66
|
},
|
|
51
67
|
"homepage": "https://github.com/HUA-Labs/HUA-Labs-public#readme",
|
|
68
|
+
"publishConfig": {
|
|
69
|
+
"access": "public",
|
|
70
|
+
"provenance": true
|
|
71
|
+
},
|
|
52
72
|
"scripts": {
|
|
53
|
-
"build": "
|
|
54
|
-
"dev": "
|
|
73
|
+
"build": "tsup",
|
|
74
|
+
"dev": "tsup --watch",
|
|
55
75
|
"clean": "rm -rf dist",
|
|
56
|
-
"test": "
|
|
76
|
+
"test": "vitest run",
|
|
77
|
+
"test:watch": "vitest",
|
|
57
78
|
"lint": "echo 'Skipping lint for hua-i18n-core (ESLint 8, needs separate config)'",
|
|
58
|
-
"type-check": "tsc --noEmit"
|
|
79
|
+
"type-check": "tsc --noEmit",
|
|
80
|
+
"generate:types": "tsx scripts/generate-i18n-types.ts",
|
|
81
|
+
"validate:translations": "tsx scripts/validate-translations.ts"
|
|
59
82
|
}
|
|
60
83
|
}
|