inline-i18n-multi 0.7.0 → 0.8.0

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 CHANGED
@@ -70,6 +70,9 @@ See "Hello" in your app? Just search for "Hello" in your codebase. **Done.**
70
70
  - **ICU Message Cache** - Memoize parsed ICU ASTs for performance (`icuCacheSize`, `clearICUCache()`)
71
71
  - **Plural Shorthand** - Concise plural syntax (`{count, p, item|items}`)
72
72
  - **Locale Persistence** - Auto-save/restore locale to cookie or localStorage (`persistLocale`, `restoreLocale()`)
73
+ - **Translation Scope** - Namespace scoping with `createScope` (`createScope('common')` returns a scoped `t()`)
74
+ - **Unused Key Detection** - CLI `--unused` flag to detect unused translation keys
75
+ - **TypeScript Type Generation** - `typegen` command for auto-generating translation key type definitions
73
76
 
74
77
  ---
75
78
 
@@ -657,6 +660,47 @@ setLocale('ja') // saves 'ja' to localStorage
657
660
 
658
661
  ---
659
662
 
663
+ ## Translation Scope
664
+
665
+ Create a scoped translation function bound to a specific namespace with `createScope`:
666
+
667
+ ```typescript
668
+ import { createScope, loadDictionaries } from 'inline-i18n-multi'
669
+
670
+ loadDictionaries({ en: { greeting: 'Hello' }, ko: { greeting: '안녕하세요' } }, 'common')
671
+
672
+ const tc = createScope('common')
673
+ tc('greeting') // → "Hello"
674
+ ```
675
+
676
+ Eliminates the need to write namespace prefixes (`t('common:greeting')`) every time, keeping your code cleaner.
677
+
678
+ ---
679
+
680
+ ## Unused Key Detection
681
+
682
+ Use the `--unused` flag to detect translation keys defined in dictionaries but not used in your code:
683
+
684
+ ```bash
685
+ npx inline-i18n validate --unused
686
+ ```
687
+
688
+ Helps identify and clean up translations that are no longer needed.
689
+
690
+ ---
691
+
692
+ ## TypeScript Type Generation
693
+
694
+ Auto-generate TypeScript type definition files for your translation keys with the `typegen` command:
695
+
696
+ ```bash
697
+ npx inline-i18n typegen --output src/i18n.d.ts
698
+ ```
699
+
700
+ The generated types enable autocomplete and type checking for `t()` function key arguments.
701
+
702
+ ---
703
+
660
704
  ## Configuration
661
705
 
662
706
  Configure global settings for fallback behavior and warnings:
@@ -750,6 +794,7 @@ Available helpers:
750
794
  | `parseRichText(template, names)` | Parse rich text template into segments |
751
795
  | `clearICUCache()` | Clear the ICU message AST cache |
752
796
  | `restoreLocale()` | Restore locale from configured persistent storage (cookie or localStorage) |
797
+ | `createScope(namespace)` | Return a translation function scoped to the given namespace |
753
798
 
754
799
  ### Custom Formatters
755
800
 
package/dist/index.d.mts CHANGED
@@ -295,6 +295,21 @@ interface DetectLocaleOptions {
295
295
  */
296
296
  declare function detectLocale(options: DetectLocaleOptions): Locale;
297
297
 
298
+ /**
299
+ * Create a scoped translation function for a given namespace.
300
+ * Returns a `t()` wrapper that auto-prepends the namespace prefix.
301
+ *
302
+ * @param namespace - Namespace to scope to
303
+ * @returns Scoped translation function
304
+ *
305
+ * @example
306
+ * const tc = createScope('common')
307
+ * tc('greeting') // equivalent to t('common:greeting')
308
+ * tc('nav.home') // equivalent to t('common:nav.home')
309
+ * tc('welcome', { name: 'John' })
310
+ */
311
+ declare function createScope(namespace: string): (key: string, vars?: TranslationVars, locale?: Locale) => string;
312
+
298
313
  /**
299
314
  * Rich Text segment types
300
315
  */
@@ -323,4 +338,4 @@ interface RichTextSegment {
323
338
  */
324
339
  declare function parseRichText(template: string, componentNames: string[]): RichTextSegment[];
325
340
 
326
- export { type Config, type CustomFormatter, type DebugModeOptions, type DetectLocaleOptions, type DetectSource, type Dictionaries, type Dictionary, type Locale, type PluralRules, type RichTextSegment, type TranslationVars, type TranslationWarning, type Translations, type WarningHandler, __i18n_lookup, clearDictionaries, clearFormatters, clearICUCache, configure, detectLocale, en_de, en_es, en_fr, en_ja, en_zh, getConfig, getDictionary, getLoadedLocales, getLoadedNamespaces, getLocale, hasTranslation, isLoaded, it, it_de, it_es, it_fr, it_ja, it_zh, ja_es, ja_zh, loadAsync, loadDictionaries, loadDictionary, parseRichText, registerFormatter, resetConfig, restoreLocale, setLocale, t, zh_es };
341
+ export { type Config, type CustomFormatter, type DebugModeOptions, type DetectLocaleOptions, type DetectSource, type Dictionaries, type Dictionary, type Locale, type PluralRules, type RichTextSegment, type TranslationVars, type TranslationWarning, type Translations, type WarningHandler, __i18n_lookup, clearDictionaries, clearFormatters, clearICUCache, configure, createScope, detectLocale, en_de, en_es, en_fr, en_ja, en_zh, getConfig, getDictionary, getLoadedLocales, getLoadedNamespaces, getLocale, hasTranslation, isLoaded, it, it_de, it_es, it_fr, it_ja, it_zh, ja_es, ja_zh, loadAsync, loadDictionaries, loadDictionary, parseRichText, registerFormatter, resetConfig, restoreLocale, setLocale, t, zh_es };
package/dist/index.d.ts CHANGED
@@ -295,6 +295,21 @@ interface DetectLocaleOptions {
295
295
  */
296
296
  declare function detectLocale(options: DetectLocaleOptions): Locale;
297
297
 
298
+ /**
299
+ * Create a scoped translation function for a given namespace.
300
+ * Returns a `t()` wrapper that auto-prepends the namespace prefix.
301
+ *
302
+ * @param namespace - Namespace to scope to
303
+ * @returns Scoped translation function
304
+ *
305
+ * @example
306
+ * const tc = createScope('common')
307
+ * tc('greeting') // equivalent to t('common:greeting')
308
+ * tc('nav.home') // equivalent to t('common:nav.home')
309
+ * tc('welcome', { name: 'John' })
310
+ */
311
+ declare function createScope(namespace: string): (key: string, vars?: TranslationVars, locale?: Locale) => string;
312
+
298
313
  /**
299
314
  * Rich Text segment types
300
315
  */
@@ -323,4 +338,4 @@ interface RichTextSegment {
323
338
  */
324
339
  declare function parseRichText(template: string, componentNames: string[]): RichTextSegment[];
325
340
 
326
- export { type Config, type CustomFormatter, type DebugModeOptions, type DetectLocaleOptions, type DetectSource, type Dictionaries, type Dictionary, type Locale, type PluralRules, type RichTextSegment, type TranslationVars, type TranslationWarning, type Translations, type WarningHandler, __i18n_lookup, clearDictionaries, clearFormatters, clearICUCache, configure, detectLocale, en_de, en_es, en_fr, en_ja, en_zh, getConfig, getDictionary, getLoadedLocales, getLoadedNamespaces, getLocale, hasTranslation, isLoaded, it, it_de, it_es, it_fr, it_ja, it_zh, ja_es, ja_zh, loadAsync, loadDictionaries, loadDictionary, parseRichText, registerFormatter, resetConfig, restoreLocale, setLocale, t, zh_es };
341
+ export { type Config, type CustomFormatter, type DebugModeOptions, type DetectLocaleOptions, type DetectSource, type Dictionaries, type Dictionary, type Locale, type PluralRules, type RichTextSegment, type TranslationVars, type TranslationWarning, type Translations, type WarningHandler, __i18n_lookup, clearDictionaries, clearFormatters, clearICUCache, configure, createScope, detectLocale, en_de, en_es, en_fr, en_ja, en_zh, getConfig, getDictionary, getLoadedLocales, getLoadedNamespaces, getLocale, hasTranslation, isLoaded, it, it_de, it_es, it_fr, it_ja, it_zh, ja_es, ja_zh, loadAsync, loadDictionaries, loadDictionary, parseRichText, registerFormatter, resetConfig, restoreLocale, setLocale, t, zh_es };
package/dist/index.js CHANGED
@@ -1050,6 +1050,13 @@ function detectLocale(options) {
1050
1050
  return defaultLocale;
1051
1051
  }
1052
1052
 
1053
+ // src/scope.ts
1054
+ function createScope(namespace) {
1055
+ return (key, vars, locale) => {
1056
+ return t(`${namespace}:${key}`, vars, locale);
1057
+ };
1058
+ }
1059
+
1053
1060
  // src/richtext.ts
1054
1061
  function escapeRegExp(str) {
1055
1062
  return str.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
@@ -1091,6 +1098,7 @@ exports.clearDictionaries = clearDictionaries;
1091
1098
  exports.clearFormatters = clearFormatters;
1092
1099
  exports.clearICUCache = clearICUCache;
1093
1100
  exports.configure = configure;
1101
+ exports.createScope = createScope;
1094
1102
  exports.detectLocale = detectLocale;
1095
1103
  exports.en_de = en_de;
1096
1104
  exports.en_es = en_es;
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/config.ts","../src/context.ts","../src/icu.ts","../src/interpolation.ts","../src/translate.ts","../src/runtime.ts","../src/pairs.ts","../src/dictionary.ts","../src/detect.ts","../src/richtext.ts"],"names":["parse","isLiteralElement","isArgumentElement","isPoundElement","isPluralElement","isSelectElement","isNumberElement","isDateElement","isTimeElement","translations","vars","template","locale","debugInfo","result","currentLocale"],"mappings":";;;;;AAKA,SAAS,sBAAsB,OAAA,EAAmC;AAChE,EAAA,MAAM,KAAA,GAAQ,CAAC,CAAA,8CAAA,EAAiD,OAAA,CAAQ,eAAe,CAAA,CAAA,CAAG,CAAA;AAE1F,EAAA,IAAI,QAAQ,GAAA,EAAK;AACf,IAAA,KAAA,CAAM,IAAA,CAAK,CAAA,MAAA,EAAS,OAAA,CAAQ,GAAG,CAAA,CAAA,CAAG,CAAA;AAAA,EACpC;AAEA,EAAA,KAAA,CAAM,KAAK,CAAA,YAAA,EAAe,OAAA,CAAQ,iBAAiB,IAAA,CAAK,IAAI,CAAC,CAAA,CAAA,CAAG,CAAA;AAEhE,EAAA,IAAI,QAAQ,YAAA,EAAc;AACxB,IAAA,KAAA,CAAM,IAAA,CAAK,CAAA,iBAAA,EAAoB,OAAA,CAAQ,YAAY,CAAA,CAAA,CAAG,CAAA;AAAA,EACxD;AAEA,EAAA,OAAA,CAAQ,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,KAAK,CAAC,CAAA;AAChC;AAKA,SAAS,SAAA,GAAqB;AAC5B,EAAA,IAAI;AAEF,IAAA,IAAI,OAAO,UAAA,KAAe,WAAA,IAAe,SAAA,IAAa,UAAA,EAAY;AAChE,MAAA,MAAM,OAAQ,UAAA,CAA6D,OAAA;AAC3E,MAAA,OAAO,IAAA,EAAM,KAAK,QAAA,KAAa,YAAA;AAAA,IACjC;AACA,IAAA,OAAO,KAAA;AAAA,EACT,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,KAAA;AAAA,EACT;AACF;AAIA,IAAM,aAAA,GAA4B;AAAA,EAChC,aAAA,EAAe,IAAA;AAAA,EACf,cAAA,EAAgB,IAAA;AAAA,EAChB,gBAAA,EAAkB,IAAA;AAAA,EAClB,eAAe,EAAC;AAAA,EAChB,eAAe,SAAA,EAAU;AAAA,EACzB,oBAAA,EAAsB,qBAAA;AAAA,EACtB,SAAA,EAAW,KAAA;AAAA,EACX,MAAA,EAAQ,MAAA;AAAA,EACR,YAAA,EAAc;AAChB,CAAA;AAEA,IAAI,MAAA,GAAiB,EAAE,GAAG,aAAA,EAAc;AAYjC,SAAS,UAAU,OAAA,EAAgC;AACxD,EAAA,MAAA,GAAS,EAAE,GAAG,MAAA,EAAQ,GAAG,OAAA,EAAQ;AACnC;AAKO,SAAS,SAAA,GAAwB;AACtC,EAAA,OAAO;AAAA,IACL,GAAG,aAAA;AAAA,IACH,GAAG;AAAA,GACL;AACF;AAKO,SAAS,WAAA,GAAoB;AAClC,EAAA,MAAA,GAAS,EAAE,GAAG,aAAA,EAAc;AAC9B;AAUO,SAAS,gBAAgB,MAAA,EAAoC;AAClE,EAAA,MAAM,SAAA,GAAY,MAAA,CAAO,OAAA,CAAQ,GAAG,CAAA;AACpC,EAAA,IAAI,YAAY,CAAA,EAAG;AACjB,IAAA,OAAO,MAAA,CAAO,SAAA,CAAU,CAAA,EAAG,SAAS,CAAA;AAAA,EACtC;AACA,EAAA,OAAO,MAAA;AACT;AAcO,SAAS,mBAAmB,MAAA,EAA0B;AAC3D,EAAA,MAAM,MAAM,SAAA,EAAU;AAGtB,EAAA,IAAI,GAAA,CAAI,aAAA,CAAc,MAAM,CAAA,EAAG;AAC7B,IAAA,OAAO,CAAC,MAAA,EAAQ,GAAG,GAAA,CAAI,aAAA,CAAc,MAAM,CAAC,CAAA;AAAA,EAC9C;AAEA,EAAA,MAAM,KAAA,GAAkB,CAAC,MAAM,CAAA;AAG/B,EAAA,IAAI,IAAI,gBAAA,EAAkB;AACxB,IAAA,IAAI,OAAA,GAAU,MAAA;AACd,IAAA,OAAO,IAAA,EAAM;AACX,MAAA,MAAM,MAAA,GAAS,gBAAgB,OAAO,CAAA;AACtC,MAAA,IAAI,MAAA,IAAU,CAAC,KAAA,CAAM,QAAA,CAAS,MAAM,CAAA,EAAG;AACrC,QAAA,KAAA,CAAM,KAAK,MAAM,CAAA;AACjB,QAAA,OAAA,GAAU,MAAA;AAAA,MACZ,CAAA,MAAO;AACL,QAAA;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAGA,EAAA,MAAM,gBAAgB,GAAA,CAAI,cAAA;AAC1B,EAAA,IAAI,aAAA,IAAiB,CAAC,KAAA,CAAM,QAAA,CAAS,aAAa,CAAA,EAAG;AACnD,IAAA,KAAA,CAAM,KAAK,aAAa,CAAA;AAAA,EAC1B;AAEA,EAAA,OAAO,KAAA;AACT;AAKO,SAAS,YAAY,OAAA,EAAmC;AAC7D,EAAA,MAAM,MAAM,SAAA,EAAU;AACtB,EAAA,IAAI,GAAA,CAAI,aAAA,IAAiB,GAAA,CAAI,oBAAA,EAAsB;AACjD,IAAA,GAAA,CAAI,qBAAqB,OAAO,CAAA;AAAA,EAClC;AACF;AAyBO,SAAS,gBAAA,CAAiB,QAAgB,SAAA,EAA8B;AAC7E,EAAA,MAAM,MAAM,SAAA,EAAU;AAEtB,EAAA,IAAI,CAAC,IAAI,SAAA,EAAW;AAClB,IAAA,OAAO,MAAA;AAAA,EACT;AAEA,EAAA,MAAM,OAAA,GACJ,OAAO,GAAA,CAAI,SAAA,KAAc,QAAA,GACrB,GAAA,CAAI,SAAA,GACJ,EAAE,iBAAA,EAAmB,IAAA,EAAM,kBAAA,EAAoB,IAAA,EAAK;AAG1D,EAAA,IAAI,SAAA,CAAU,SAAA,IAAa,OAAA,CAAQ,iBAAA,KAAsB,KAAA,EAAO;AAC9D,IAAA,MAAM,MAAA,GAAS,OAAA,CAAQ,mBAAA,GACnB,OAAA,CAAQ,mBAAA,CAAoB,SAAA,CAAU,eAAA,EAAiB,SAAA,CAAU,GAAG,CAAA,GACpE,CAAA,UAAA,EAAa,SAAA,CAAU,eAAe,CAAA,EAAA,CAAA;AAC1C,IAAA,OAAO,MAAA,GAAS,MAAA;AAAA,EAClB;AAGA,EAAA,IAAI,UAAU,UAAA,IAAc,OAAA,CAAQ,kBAAA,KAAuB,KAAA,IAAS,UAAU,UAAA,EAAY;AACxF,IAAA,MAAM,SAAS,OAAA,CAAQ,oBAAA,GACnB,OAAA,CAAQ,oBAAA,CAAqB,UAAU,eAAA,EAAiB,SAAA,CAAU,UAAA,EAAY,SAAA,CAAU,GAAG,CAAA,GAC3F,CAAA,CAAA,EAAI,UAAU,eAAe,CAAA,IAAA,EAAO,UAAU,UAAU,CAAA,EAAA,CAAA;AAC5D,IAAA,OAAO,MAAA,GAAS,MAAA;AAAA,EAClB;AAEA,EAAA,OAAO,MAAA;AACT;;;AC5MA,IAAI,aAAA,GAAwB,IAAA;AAE5B,SAAS,SAAA,CAAU,IAAA,EAAc,KAAA,EAAe,IAAA,EAAoB;AAClE,EAAA,IAAI,OAAO,aAAa,WAAA,EAAa;AACrC,EAAA,MAAM,OAAA,GAAU,IAAI,IAAA,CAAK,IAAA,CAAK,KAAI,GAAI,IAAA,GAAO,KAAK,CAAA,CAAE,WAAA,EAAY;AAChE,EAAA,QAAA,CAAS,SAAS,CAAA,EAAG,IAAI,CAAA,CAAA,EAAI,KAAK,aAAa,OAAO,CAAA,sBAAA,CAAA;AACxD;AAEA,SAAS,UAAU,IAAA,EAAkC;AACnD,EAAA,IAAI,OAAO,QAAA,KAAa,WAAA,EAAa,OAAO,MAAA;AAC5C,EAAA,MAAM,KAAA,GAAQ,SAAS,MAAA,CAAO,KAAA,CAAM,IAAI,MAAA,CAAO,CAAA,WAAA,EAAc,IAAI,CAAA,QAAA,CAAU,CAAC,CAAA;AAC5E,EAAA,OAAO,QAAQ,CAAC,CAAA;AAClB;AAEA,SAAS,uBAAuB,MAAA,EAAsB;AACpD,EAAA,MAAM,MAAM,SAAA,EAAU;AACtB,EAAA,IAAI,CAAC,IAAI,aAAA,EAAe;AAExB,EAAA,MAAM,EAAE,OAAA,EAAS,GAAA,GAAM,UAAU,OAAA,GAAU,GAAA,KAAQ,GAAA,CAAI,aAAA;AAEvD,EAAA,IAAI,YAAY,QAAA,EAAU;AACxB,IAAA,SAAA,CAAU,GAAA,EAAK,QAAQ,OAAO,CAAA;AAAA,EAChC,CAAA,MAAA,IAAW,YAAY,cAAA,EAAgB;AACrC,IAAA,IAAI,OAAO,iBAAiB,WAAA,EAAa;AACvC,MAAA,IAAI;AACF,QAAA,YAAA,CAAa,OAAA,CAAQ,KAAK,MAAM,CAAA;AAAA,MAClC,CAAA,CAAA,MAAQ;AAAA,MAER;AAAA,IACF;AAAA,EACF;AACF;AAEO,SAAS,UAAU,MAAA,EAAsB;AAC9C,EAAA,aAAA,GAAgB,MAAA;AAChB,EAAA,sBAAA,CAAuB,MAAM,CAAA;AAC/B;AAEO,SAAS,SAAA,GAAoB;AAClC,EAAA,OAAO,aAAA;AACT;AAMO,SAAS,aAAA,GAAoC;AAClD,EAAA,MAAM,MAAM,SAAA,EAAU;AACtB,EAAA,IAAI,CAAC,GAAA,CAAI,aAAA,EAAe,OAAO,MAAA;AAE/B,EAAA,MAAM,EAAE,OAAA,EAAS,GAAA,GAAM,QAAA,KAAa,GAAA,CAAI,aAAA;AACxC,EAAA,IAAI,MAAA;AAEJ,EAAA,IAAI,YAAY,QAAA,EAAU;AACxB,IAAA,MAAA,GAAS,UAAU,GAAG,CAAA;AAAA,EACxB,CAAA,MAAA,IAAW,YAAY,cAAA,EAAgB;AACrC,IAAA,IAAI,OAAO,iBAAiB,WAAA,EAAa;AACvC,MAAA,IAAI;AACF,QAAA,MAAA,GAAS,YAAA,CAAa,OAAA,CAAQ,GAAG,CAAA,IAAK,KAAA,CAAA;AAAA,MACxC,CAAA,CAAA,MAAQ;AAAA,MAER;AAAA,IACF;AAAA,EACF;AAEA,EAAA,IAAI,MAAA,EAAQ;AACV,IAAA,aAAA,GAAgB,MAAA;AAChB,IAAA,OAAO,MAAA;AAAA,EACT;AAEA,EAAA,OAAO,MAAA;AACT;AChDA,IAAM,QAAA,uBAAe,GAAA,EAAoC;AAKlD,SAAS,aAAA,GAAsB;AACpC,EAAA,QAAA,CAAS,KAAA,EAAM;AACjB;AAMA,SAAS,YAAY,QAAA,EAA0C;AAC7D,EAAA,MAAM,MAAA,GAAS,QAAA,CAAS,GAAA,CAAI,QAAQ,CAAA;AACpC,EAAA,IAAI,QAAQ,OAAO,MAAA;AAEnB,EAAA,MAAM,GAAA,GAAMA,6BAAM,QAAQ,CAAA;AAE1B,EAAA,MAAM,MAAM,SAAA,EAAU;AACtB,EAAA,IAAI,GAAA,CAAI,eAAe,CAAA,EAAG;AACxB,IAAA,IAAI,QAAA,CAAS,IAAA,IAAQ,GAAA,CAAI,YAAA,EAAc;AACrC,MAAA,MAAM,QAAA,GAAW,QAAA,CAAS,IAAA,EAAK,CAAE,MAAK,CAAE,KAAA;AACxC,MAAA,IAAI,aAAa,MAAA,EAAW;AAC1B,QAAA,QAAA,CAAS,OAAO,QAAQ,CAAA;AAAA,MAC1B;AAAA,IACF;AACA,IAAA,QAAA,CAAS,GAAA,CAAI,UAAU,GAAG,CAAA;AAAA,EAC5B;AAEA,EAAA,OAAO,GAAA;AACT;AAKA,SAAS,gBAAA,CAAiB,SAAiB,MAAA,EAAwB;AACjE,EAAA,MAAM,MAAM,SAAA,EAAU;AACtB,EAAA,IAAI,IAAI,iBAAA,EAAmB;AACzB,IAAA,OAAO,GAAA,CAAI,iBAAA,CAAkB,OAAA,EAAS,MAAM,CAAA;AAAA,EAC9C;AACA,EAAA,OAAO,IAAI,OAAO,CAAA,CAAA,CAAA;AACpB;AAQA,IAAM,gBAAA,uBAAuB,GAAA,EAA6B;AAE1D,IAAM,wBAAA,uBAA+B,GAAA,CAAI;AAAA,EACvC,QAAA;AAAA,EAAU,QAAA;AAAA,EAAU,eAAA;AAAA,EACpB,QAAA;AAAA,EAAU,MAAA;AAAA,EAAQ,MAAA;AAAA,EAClB,cAAA;AAAA,EAAgB,MAAA;AAAA,EAAQ;AAC1B,CAAC,CAAA;AAWM,SAAS,iBAAA,CAAkB,MAAc,SAAA,EAAkC;AAChF,EAAA,IAAI,wBAAA,CAAyB,GAAA,CAAI,IAAI,CAAA,EAAG;AACtC,IAAA,MAAM,IAAI,KAAA,CAAM,CAAA,2BAAA,EAA8B,IAAI,CAAA,yBAAA,CAA2B,CAAA;AAAA,EAC/E;AACA,EAAA,gBAAA,CAAiB,GAAA,CAAI,MAAM,SAAS,CAAA;AACtC;AAKO,SAAS,eAAA,GAAwB;AACtC,EAAA,gBAAA,CAAiB,KAAA,EAAM;AACzB;AAWA,SAAS,2BAAA,GAA6C;AACpD,EAAA,IAAI,gBAAA,CAAiB,IAAA,KAAS,CAAA,EAAG,OAAO,IAAA;AACxC,EAAA,MAAM,QAAQ,CAAC,GAAG,gBAAA,CAAiB,IAAA,EAAM,CAAA,CAAE,GAAA,CAAI,CAAA,CAAA,KAAK,CAAA,CAAE,QAAQ,qBAAA,EAAuB,MAAM,CAAC,CAAA,CAAE,KAAK,GAAG,CAAA;AACtG,EAAA,OAAO,IAAI,MAAA,CAAO,CAAA,eAAA,EAAkB,KAAK,wBAAwB,GAAG,CAAA;AACtE;AAKA,SAAS,2BAA2B,QAAA,EAGlC;AACA,EAAA,MAAM,YAAA,uBAAmB,GAAA,EAAwC;AACjE,EAAA,MAAM,UAAU,2BAAA,EAA4B;AAC5C,EAAA,IAAI,CAAC,OAAA,EAAS,OAAO,EAAE,SAAA,EAAW,UAAU,YAAA,EAAa;AAEzD,EAAA,IAAI,OAAA,GAAU,CAAA;AACd,EAAA,MAAM,SAAA,GAAY,SAAS,OAAA,CAAQ,OAAA,EAAS,CAAC,CAAA,EAAG,QAAA,EAAU,eAAe,KAAA,KAAU;AACjF,IAAA,MAAM,WAAA,GAAc,YAAY,OAAA,EAAS,CAAA,EAAA,CAAA;AACzC,IAAA,YAAA,CAAa,IAAI,WAAA,EAAa,EAAE,QAAA,EAAU,aAAA,EAAe,OAAO,CAAA;AAChE,IAAA,OAAO,IAAI,WAAW,CAAA,CAAA,CAAA;AAAA,EACxB,CAAC,CAAA;AACD,EAAA,OAAO,EAAE,WAAW,YAAA,EAAa;AACnC;AAKO,SAAS,mBAAmB,QAAA,EAA2B;AAC5D,EAAA,MAAM,UAAU,2BAAA,EAA4B;AAC5C,EAAA,IAAI,CAAC,SAAS,OAAO,KAAA;AACrB,EAAA,OAAO,OAAA,CAAQ,KAAK,QAAQ,CAAA;AAC9B;AAKA,IAAM,WAAA,GAA0D;AAAA,EAC9D,KAAA,EAAO,EAAE,SAAA,EAAW,OAAA,EAAQ;AAAA,EAC5B,MAAA,EAAQ,EAAE,SAAA,EAAW,QAAA,EAAS;AAAA,EAC9B,IAAA,EAAM,EAAE,SAAA,EAAW,MAAA,EAAO;AAAA,EAC1B,IAAA,EAAM,EAAE,SAAA,EAAW,MAAA;AACrB,CAAA;AAKA,IAAM,WAAA,GAA0D;AAAA,EAC9D,KAAA,EAAO,EAAE,SAAA,EAAW,OAAA,EAAQ;AAAA,EAC5B,MAAA,EAAQ,EAAE,SAAA,EAAW,QAAA,EAAS;AAAA,EAC9B,IAAA,EAAM,EAAE,SAAA,EAAW,MAAA,EAAO;AAAA,EAC1B,IAAA,EAAM,EAAE,SAAA,EAAW,MAAA;AACrB,CAAA;AAKA,IAAM,aAAA,GAA0D;AAAA,EAC9D,OAAA,EAAS,EAAE,KAAA,EAAO,SAAA,EAAU;AAAA,EAC5B,OAAA,EAAS,EAAE,KAAA,EAAO,SAAA,EAAU;AAAA,EAC5B,OAAA,EAAS,EAAE,KAAA,EAAO,SAAA,EAAW,uBAAuB,CAAA;AACtD,CAAA;AAKA,IAAM,oBAAA,GAAuE;AAAA,EAC3E,IAAA,EAAM,EAAE,KAAA,EAAO,MAAA,EAAQ,SAAS,MAAA,EAAO;AAAA,EACvC,KAAA,EAAO,EAAE,KAAA,EAAO,OAAA,EAAS,SAAS,MAAA,EAAO;AAAA,EACzC,MAAA,EAAQ,EAAE,KAAA,EAAO,QAAA,EAAU,SAAS,MAAA;AACtC,CAAA;AAKA,IAAM,UAAA,GAAkD;AAAA,EACtD,WAAA,EAAa,aAAA;AAAA,EACb,WAAA,EAAa,aAAA;AAAA,EACb,IAAA,EAAM;AACR,CAAA;AAEA,IAAM,WAAA,GAAoD;AAAA,EACxD,IAAA,EAAM,MAAA;AAAA,EACN,KAAA,EAAO,OAAA;AAAA,EACP,MAAA,EAAQ;AACV,CAAA;AAKA,SAAS,OAAO,KAAA,EAAqC;AACnD,EAAA,IAAI,iBAAiB,IAAA,EAAM;AACzB,IAAA,OAAO,KAAA;AAAA,EACT;AACA,EAAA,OAAO,IAAI,KAAK,KAAK,CAAA;AACvB;AAKA,SAAS,mBAAA,CACP,EAAA,EACA,IAAA,EACA,MAAA,EACQ;AACR,EAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,EAAA,CAAG,KAAK,CAAA;AAC3B,EAAA,IAAI,UAAU,MAAA,EAAW;AACvB,IAAA,OAAO,gBAAA,CAAiB,EAAA,CAAG,KAAA,EAAO,MAAM,CAAA;AAAA,EAC1C;AAEA,EAAA,MAAM,MAAM,OAAO,KAAA,KAAU,QAAA,GAAW,KAAA,GAAQ,OAAO,KAAK,CAAA;AAC5D,EAAA,IAAI,KAAA,CAAM,GAAG,CAAA,EAAG;AACd,IAAA,OAAO,gBAAA,CAAiB,EAAA,CAAG,KAAA,EAAO,MAAM,CAAA;AAAA,EAC1C;AAEA,EAAA,IAAI,UAAoC,EAAC;AAEzC,EAAA,IAAI,GAAG,KAAA,EAAO;AACZ,IAAA,IAAI,OAAO,EAAA,CAAG,KAAA,KAAU,QAAA,EAAU;AAEhC,MAAA,IAAI,EAAA,CAAG,UAAU,UAAA,EAAY;AAC3B,QAAA,OAAA,GAAU,EAAE,KAAA,EAAO,UAAA,EAAY,QAAA,EAAU,KAAA,EAAM;AAAA,MACjD,CAAA,MAAA,IAAW,aAAA,CAAc,EAAA,CAAG,KAAK,CAAA,EAAG;AAClC,QAAA,OAAA,GAAU,aAAA,CAAc,GAAG,KAAK,CAAA;AAAA,MAClC;AAAA,IACF,CAAA,MAAA,IAAW,eAAA,IAAmB,EAAA,CAAG,KAAA,EAAO;AAEtC,MAAA,OAAA,GAAU,GAAG,KAAA,CAAM,aAAA;AAAA,IACrB;AAAA,EACF;AAEA,EAAA,IAAI;AACF,IAAA,OAAO,IAAI,IAAA,CAAK,YAAA,CAAa,QAAQ,OAAO,CAAA,CAAE,OAAO,GAAG,CAAA;AAAA,EAC1D,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,OAAO,GAAG,CAAA;AAAA,EACnB;AACF;AAKA,SAAS,iBAAA,CACP,EAAA,EACA,IAAA,EACA,MAAA,EACQ;AACR,EAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,EAAA,CAAG,KAAK,CAAA;AAC3B,EAAA,IAAI,UAAU,MAAA,EAAW;AACvB,IAAA,OAAO,gBAAA,CAAiB,EAAA,CAAG,KAAA,EAAO,MAAM,CAAA;AAAA,EAC1C;AAEA,EAAA,IAAI,UAAsC,EAAC;AAE3C,EAAA,IAAI,GAAG,KAAA,EAAO;AACZ,IAAA,IAAI,OAAO,EAAA,CAAG,KAAA,KAAU,QAAA,EAAU;AAChC,MAAA,OAAA,GAAU,WAAA,CAAY,EAAA,CAAG,KAAK,CAAA,IAAK,EAAC;AAAA,IACtC,CAAA,MAAA,IAAW,eAAA,IAAmB,EAAA,CAAG,KAAA,EAAO;AAEtC,MAAA,OAAA,GAAU,GAAG,KAAA,CAAM,aAAA;AAAA,IACrB;AAAA,EACF;AAEA,EAAA,IAAI;AACF,IAAA,MAAM,IAAA,GAAO,OAAO,KAA+B,CAAA;AACnD,IAAA,OAAO,IAAI,IAAA,CAAK,cAAA,CAAe,QAAQ,OAAO,CAAA,CAAE,OAAO,IAAI,CAAA;AAAA,EAC7D,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,gBAAA,CAAiB,EAAA,CAAG,KAAA,EAAO,MAAM,CAAA;AAAA,EAC1C;AACF;AAKA,SAAS,iBAAA,CACP,EAAA,EACA,IAAA,EACA,MAAA,EACQ;AACR,EAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,EAAA,CAAG,KAAK,CAAA;AAC3B,EAAA,IAAI,UAAU,MAAA,EAAW;AACvB,IAAA,OAAO,gBAAA,CAAiB,EAAA,CAAG,KAAA,EAAO,MAAM,CAAA;AAAA,EAC1C;AAEA,EAAA,IAAI,UAAsC,EAAC;AAE3C,EAAA,IAAI,GAAG,KAAA,EAAO;AACZ,IAAA,IAAI,OAAO,EAAA,CAAG,KAAA,KAAU,QAAA,EAAU;AAChC,MAAA,OAAA,GAAU,WAAA,CAAY,EAAA,CAAG,KAAK,CAAA,IAAK,EAAC;AAAA,IACtC,CAAA,MAAA,IAAW,eAAA,IAAmB,EAAA,CAAG,KAAA,EAAO;AAEtC,MAAA,OAAA,GAAU,GAAG,KAAA,CAAM,aAAA;AAAA,IACrB;AAAA,EACF;AAEA,EAAA,IAAI;AACF,IAAA,MAAM,IAAA,GAAO,OAAO,KAA+B,CAAA;AACnD,IAAA,OAAO,IAAI,IAAA,CAAK,cAAA,CAAe,QAAQ,OAAO,CAAA,CAAE,OAAO,IAAI,CAAA;AAAA,EAC7D,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,gBAAA,CAAiB,EAAA,CAAG,KAAA,EAAO,MAAM,CAAA;AAAA,EAC1C;AACF;AAWA,IAAM,gBAAA,GAAmB,sCAAA;AAKzB,SAAS,mBAAmB,QAAA,EAG1B;AACA,EAAA,MAAM,YAAA,uBAAmB,GAAA,EAAiC;AAC1D,EAAA,IAAI,OAAA,GAAU,CAAA;AACd,EAAA,MAAM,YAAY,QAAA,CAAS,OAAA,CAAQ,kBAAkB,CAAC,CAAA,EAAG,UAAU,YAAA,KAAiB;AAClF,IAAA,MAAM,WAAA,GAAc,cAAc,OAAA,EAAS,CAAA,EAAA,CAAA;AAC3C,IAAA,YAAA,CAAa,IAAI,WAAA,EAAa,EAAE,UAAU,YAAA,EAAc,YAAA,IAAgB,OAAO,CAAA;AAC/E,IAAA,OAAO,IAAI,WAAW,CAAA,CAAA,CAAA;AAAA,EACxB,CAAC,CAAA;AACD,EAAA,OAAO,EAAE,WAAW,YAAA,EAAa;AACnC;AAKA,SAAS,mBAAA,CACP,YAAA,EACA,YAAA,EACA,IAAA,EACA,MAAA,EACQ;AACR,EAAA,MAAM,KAAA,GAAQ,KAAK,YAAY,CAAA;AAC/B,EAAA,IAAI,UAAU,MAAA,EAAW;AACvB,IAAA,OAAO,gBAAA,CAAiB,cAAc,MAAM,CAAA;AAAA,EAC9C;AAEA,EAAA,MAAM,MAAM,OAAO,KAAA,KAAU,QAAA,GAAW,KAAA,GAAQ,OAAO,KAAK,CAAA;AAC5D,EAAA,IAAI,KAAA,CAAM,GAAG,CAAA,EAAG;AACd,IAAA,OAAO,gBAAA,CAAiB,cAAc,MAAM,CAAA;AAAA,EAC9C;AAEA,EAAA,IAAI;AACF,IAAA,OAAO,IAAI,IAAA,CAAK,YAAA,CAAa,MAAA,EAAQ;AAAA,MACnC,KAAA,EAAO,UAAA;AAAA,MACP,QAAA,EAAU;AAAA,KACX,CAAA,CAAE,MAAA,CAAO,GAAG,CAAA;AAAA,EACf,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,OAAO,GAAG,CAAA;AAAA,EACnB;AACF;AAWA,IAAM,sBAAA,GAAyB,+CAAA;AAK/B,SAAS,wBAAwB,QAAA,EAG/B;AACA,EAAA,MAAM,YAAA,uBAAmB,GAAA,EAAsC;AAC/D,EAAA,IAAI,OAAA,GAAU,CAAA;AACd,EAAA,MAAM,YAAY,QAAA,CAAS,OAAA,CAAQ,wBAAwB,CAAC,CAAA,EAAG,UAAU,KAAA,KAAU;AACjF,IAAA,MAAM,WAAA,GAAc,aAAa,OAAA,EAAS,CAAA,EAAA,CAAA;AAC1C,IAAA,YAAA,CAAa,IAAI,WAAA,EAAa;AAAA,MAC5B,QAAA;AAAA,MACA,OAAA,EAAS,KAAA,KAAU,aAAA,GAAgB,MAAA,GAAS;AAAA,KAC7C,CAAA;AACD,IAAA,OAAO,IAAI,WAAW,CAAA,CAAA,CAAA;AAAA,EACxB,CAAC,CAAA;AACD,EAAA,OAAO,EAAE,WAAW,YAAA,EAAa;AACnC;AAKA,SAAS,mBAAA,CACP,YAAA,EACA,OAAA,EACA,IAAA,EACA,MAAA,EACQ;AACR,EAAA,MAAM,KAAA,GAAQ,KAAK,YAAY,CAAA;AAC/B,EAAA,IAAI,UAAU,MAAA,EAAW;AACvB,IAAA,OAAO,gBAAA,CAAiB,cAAc,MAAM,CAAA;AAAA,EAC9C;AAEA,EAAA,MAAM,MAAM,OAAO,KAAA,KAAU,QAAA,GAAW,KAAA,GAAQ,OAAO,KAAK,CAAA;AAC5D,EAAA,IAAI,KAAA,CAAM,GAAG,CAAA,EAAG;AACd,IAAA,OAAO,gBAAA,CAAiB,cAAc,MAAM,CAAA;AAAA,EAC9C;AAEA,EAAA,IAAI;AACF,IAAA,OAAO,IAAI,IAAA,CAAK,YAAA,CAAa,MAAA,EAAQ;AAAA,MACnC,QAAA,EAAU,SAAA;AAAA,MACV,cAAA,EAAgB;AAAA,KACjB,CAAA,CAAE,MAAA,CAAO,GAAG,CAAA;AAAA,EACf,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,OAAO,GAAG,CAAA;AAAA,EACnB;AACF;AAcA,SAAS,mBAAA,CAAoB,IAAA,EAAY,GAAA,mBAAY,IAAI,MAAK,EAAqB;AACjF,EAAA,MAAM,MAAA,GAAS,IAAA,CAAK,OAAA,EAAQ,GAAI,IAAI,OAAA,EAAQ;AAC5C,EAAA,MAAM,WAAA,GAAc,IAAA,CAAK,KAAA,CAAM,MAAA,GAAS,GAAI,CAAA;AAC5C,EAAA,MAAM,WAAA,GAAc,IAAA,CAAK,KAAA,CAAM,WAAA,GAAc,EAAE,CAAA;AAC/C,EAAA,MAAM,SAAA,GAAY,IAAA,CAAK,KAAA,CAAM,WAAA,GAAc,EAAE,CAAA;AAC7C,EAAA,MAAM,QAAA,GAAW,IAAA,CAAK,KAAA,CAAM,SAAA,GAAY,EAAE,CAAA;AAC1C,EAAA,MAAM,SAAA,GAAY,IAAA,CAAK,KAAA,CAAM,QAAA,GAAW,CAAC,CAAA;AACzC,EAAA,MAAM,UAAA,GAAa,IAAA,CAAK,KAAA,CAAM,QAAA,GAAW,EAAE,CAAA;AAC3C,EAAA,MAAM,SAAA,GAAY,IAAA,CAAK,KAAA,CAAM,QAAA,GAAW,GAAG,CAAA;AAE3C,EAAA,IAAI,IAAA,CAAK,GAAA,CAAI,WAAW,CAAA,GAAI,EAAA,SAAW,EAAE,KAAA,EAAO,WAAA,EAAa,IAAA,EAAM,QAAA,EAAS;AAC5E,EAAA,IAAI,IAAA,CAAK,GAAA,CAAI,WAAW,CAAA,GAAI,EAAA,SAAW,EAAE,KAAA,EAAO,WAAA,EAAa,IAAA,EAAM,QAAA,EAAS;AAC5E,EAAA,IAAI,IAAA,CAAK,GAAA,CAAI,SAAS,CAAA,GAAI,EAAA,SAAW,EAAE,KAAA,EAAO,SAAA,EAAW,IAAA,EAAM,MAAA,EAAO;AACtE,EAAA,IAAI,IAAA,CAAK,GAAA,CAAI,QAAQ,CAAA,GAAI,CAAA,SAAU,EAAE,KAAA,EAAO,QAAA,EAAU,IAAA,EAAM,KAAA,EAAM;AAClE,EAAA,IAAI,IAAA,CAAK,GAAA,CAAI,SAAS,CAAA,GAAI,CAAA,SAAU,EAAE,KAAA,EAAO,SAAA,EAAW,IAAA,EAAM,MAAA,EAAO;AACrE,EAAA,IAAI,IAAA,CAAK,GAAA,CAAI,UAAU,CAAA,GAAI,EAAA,SAAW,EAAE,KAAA,EAAO,UAAA,EAAY,IAAA,EAAM,OAAA,EAAQ;AACzE,EAAA,OAAO,EAAE,KAAA,EAAO,SAAA,EAAW,IAAA,EAAM,MAAA,EAAO;AAC1C;AAOA,IAAM,qBAAA,GAAwB,0CAAA;AAK9B,SAAS,uBAAuB,QAAA,EAG9B;AACA,EAAA,MAAM,YAAA,uBAAmB,GAAA,EAAqC;AAC9D,EAAA,IAAI,OAAA,GAAU,CAAA;AACd,EAAA,MAAM,YAAY,QAAA,CAAS,OAAA,CAAQ,uBAAuB,CAAC,CAAA,EAAG,UAAU,KAAA,KAAU;AAChF,IAAA,MAAM,WAAA,GAAc,aAAa,OAAA,EAAS,CAAA,EAAA,CAAA;AAC1C,IAAA,YAAA,CAAa,GAAA,CAAI,WAAA,EAAa,EAAE,QAAA,EAAU,OAAO,CAAA;AACjD,IAAA,OAAO,IAAI,WAAW,CAAA,CAAA,CAAA;AAAA,EACxB,CAAC,CAAA;AACD,EAAA,OAAO,EAAE,WAAW,YAAA,EAAa;AACnC;AAKA,SAAS,uBAAA,CACP,YAAA,EACA,KAAA,EACA,IAAA,EACA,MAAA,EACQ;AACR,EAAA,MAAM,KAAA,GAAQ,KAAK,YAAY,CAAA;AAC/B,EAAA,IAAI,UAAU,MAAA,EAAW;AACvB,IAAA,OAAO,gBAAA,CAAiB,cAAc,MAAM,CAAA;AAAA,EAC9C;AAEA,EAAA,IAAI;AACF,IAAA,MAAM,IAAA,GAAO,OAAO,KAA+B,CAAA;AACnD,IAAA,MAAM,EAAE,KAAA,EAAO,QAAA,EAAU,IAAA,EAAK,GAAI,oBAAoB,IAAI,CAAA;AAC1D,IAAA,MAAM,OAAA,GAAW,KAAA,IAAS,oBAAA,CAAqB,KAAK,KAAM,oBAAA,CAAqB,IAAA;AAC/E,IAAA,OAAO,IAAI,KAAK,kBAAA,CAAmB,MAAA,EAAQ,OAAO,CAAA,CAAE,MAAA,CAAO,UAAU,IAAI,CAAA;AAAA,EAC3E,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,gBAAA,CAAiB,cAAc,MAAM,CAAA;AAAA,EAC9C;AACF;AAYA,IAAM,YAAA,GAAe,gDAAA;AAKrB,SAAS,eAAe,QAAA,EAGtB;AACA,EAAA,MAAM,YAAA,uBAAmB,GAAA,EAA6B;AACtD,EAAA,IAAI,OAAA,GAAU,CAAA;AACd,EAAA,MAAM,SAAA,GAAY,SAAS,OAAA,CAAQ,YAAA,EAAc,CAAC,CAAA,EAAG,QAAA,EAAU,MAAM,IAAA,KAAS;AAC5E,IAAA,MAAM,WAAA,GAAc,UAAU,OAAA,EAAS,CAAA,EAAA,CAAA;AACvC,IAAA,IAAI,IAAA;AACJ,IAAA,IAAI,KAAA;AAEJ,IAAA,IAAI,IAAA,EAAM;AACR,MAAA,IAAI,UAAA,CAAW,IAAI,CAAA,EAAG;AACpB,QAAA,IAAA,GAAO,IAAA;AACP,QAAA,KAAA,GAAQ,IAAA;AAAA,MACV,CAAA,MAAA,IAAW,WAAA,CAAY,IAAI,CAAA,EAAG;AAC5B,QAAA,KAAA,GAAQ,IAAA;AAAA,MACV;AAAA,IACF;AAEA,IAAA,YAAA,CAAa,IAAI,WAAA,EAAa,EAAE,QAAA,EAAU,IAAA,EAAM,OAAO,CAAA;AACvD,IAAA,OAAO,IAAI,WAAW,CAAA,CAAA,CAAA;AAAA,EACxB,CAAC,CAAA;AACD,EAAA,OAAO,EAAE,WAAW,YAAA,EAAa;AACnC;AAKA,SAAS,eAAA,CACP,YAAA,EACA,IAAA,EACA,KAAA,EACA,MACA,MAAA,EACQ;AACR,EAAA,MAAM,KAAA,GAAQ,KAAK,YAAY,CAAA;AAC/B,EAAA,IAAI,UAAU,MAAA,IAAa,CAAC,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA,EAAG;AAChD,IAAA,OAAO,gBAAA,CAAiB,cAAc,MAAM,CAAA;AAAA,EAC9C;AAEA,EAAA,MAAM,OAAA,GAAkC;AAAA,IACtC,MAAO,IAAA,IAAgC,aAAA;AAAA,IACvC,OAAQ,KAAA,IAAkC;AAAA,GAC5C;AAEA,EAAA,IAAI;AACF,IAAA,OAAO,IAAI,IAAA,CAAK,UAAA,CAAW,QAAQ,OAAO,CAAA,CAAE,OAAO,KAAK,CAAA;AAAA,EAC1D,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,KAAA,CAAM,KAAK,IAAI,CAAA;AAAA,EACxB;AACF;AAMA,IAAM,wBAAA,GAA2B,4BAAA;AAK1B,SAAS,mBAAmB,QAAA,EAA2B;AAC5D,EAAA,wBAAA,CAAyB,SAAA,GAAY,CAAA;AACrC,EAAA,OAAO,wBAAA,CAAyB,KAAK,QAAQ,CAAA;AAC/C;AAQA,SAAS,0BAA0B,QAAA,EAA0B;AAC3D,EAAA,wBAAA,CAAyB,SAAA,GAAY,CAAA;AACrC,EAAA,OAAO,SAAS,OAAA,CAAQ,wBAAA,EAA0B,CAAC,CAAA,EAAG,UAAU,IAAA,KAAS;AACvE,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,KAAA,CAAM,GAAG,CAAA,CAAE,IAAI,CAAC,CAAA,KAAc,CAAA,CAAE,IAAA,EAAM,CAAA;AAEzD,IAAA,IAAI,KAAA,CAAM,WAAW,CAAA,EAAG;AACtB,MAAA,MAAM,CAAC,QAAA,EAAU,MAAM,CAAA,GAAI,KAAA;AAC3B,MAAA,OAAO,CAAA,CAAA,EAAI,QAAQ,CAAA,iBAAA,EAAoB,QAAQ,cAAc,MAAM,CAAA,EAAA,CAAA;AAAA,IACrE;AAEA,IAAA,IAAI,KAAA,CAAM,WAAW,CAAA,EAAG;AACtB,MAAA,MAAM,CAAC,IAAA,EAAM,QAAA,EAAU,MAAM,CAAA,GAAI,KAAA;AACjC,MAAA,OAAO,IAAI,QAAQ,CAAA,cAAA,EAAiB,IAAI,CAAA,SAAA,EAAY,QAAQ,cAAc,MAAM,CAAA,EAAA,CAAA;AAAA,IAClF;AAGA,IAAA,OAAO,CAAA,CAAA,EAAI,QAAQ,CAAA,KAAA,EAAQ,IAAI,CAAA,CAAA,CAAA;AAAA,EACjC,CAAC,CAAA;AACH;AAKO,SAAS,cAAA,CACd,QAAA,EACA,IAAA,EACA,MAAA,EACQ;AAER,EAAA,MAAM,oBAAA,GAAuB,0BAA0B,QAAQ,CAAA;AAG/D,EAAA,MAAM,EAAE,SAAA,EAAW,WAAA,EAAa,cAAc,kBAAA,EAAmB,GAAI,2BAA2B,oBAAoB,CAAA;AACpH,EAAA,MAAM,EAAE,SAAA,EAAW,aAAA,EAAe,cAAc,oBAAA,EAAqB,GAAI,mBAAmB,WAAW,CAAA;AACvG,EAAA,MAAM,EAAE,SAAA,EAAW,YAAA,EAAc,cAAc,mBAAA,EAAoB,GAAI,wBAAwB,aAAa,CAAA;AAC5G,EAAA,MAAM,EAAE,SAAA,EAAW,YAAA,EAAc,cAAc,mBAAA,EAAoB,GAAI,uBAAuB,YAAY,CAAA;AAC1G,EAAA,MAAM,EAAE,SAAA,EAAW,SAAA,EAAW,cAAc,gBAAA,EAAiB,GAAI,eAAe,YAAY,CAAA;AAE5F,EAAA,MAAM,GAAA,GAAM,YAAY,SAAS,CAAA;AACjC,EAAA,IAAI,MAAA,GAAS,cAAA,CAAe,GAAA,EAAK,IAAA,EAAM,QAAQ,IAAI,CAAA;AAGnD,EAAA,KAAA,MAAW,CAAC,aAAa,EAAE,QAAA,EAAU,eAAe,KAAA,EAAO,KAAK,kBAAA,EAAoB;AAClF,IAAA,MAAM,KAAA,GAAQ,KAAK,QAAQ,CAAA;AAC3B,IAAA,IAAI,SAAA;AACJ,IAAA,IAAI,UAAU,MAAA,EAAW;AACvB,MAAA,SAAA,GAAY,gBAAA,CAAiB,UAAU,MAAM,CAAA;AAAA,IAC/C,CAAA,MAAO;AACL,MAAA,MAAM,SAAA,GAAY,gBAAA,CAAiB,GAAA,CAAI,aAAa,CAAA;AACpD,MAAA,SAAA,GAAY,YAAY,SAAA,CAAU,KAAA,EAAO,QAAQ,KAAK,CAAA,GAAI,OAAO,KAAK,CAAA;AAAA,IACxE;AACA,IAAA,MAAA,GAAS,MAAA,CAAO,OAAA,CAAQ,CAAA,CAAA,EAAI,WAAW,KAAK,SAAS,CAAA;AAAA,EACvD;AAGA,EAAA,KAAA,MAAW,CAAC,WAAA,EAAa,EAAE,UAAU,YAAA,EAAc,KAAK,oBAAA,EAAsB;AAC5E,IAAA,MAAM,SAAA,GAAY,mBAAA,CAAoB,QAAA,EAAU,YAAA,EAAc,MAAM,MAAM,CAAA;AAC1E,IAAA,MAAA,GAAS,MAAA,CAAO,OAAA,CAAQ,CAAA,CAAA,EAAI,WAAW,KAAK,SAAS,CAAA;AAAA,EACvD;AAGA,EAAA,KAAA,MAAW,CAAC,WAAA,EAAa,EAAE,UAAU,OAAA,EAAS,KAAK,mBAAA,EAAqB;AACtE,IAAA,MAAM,SAAA,GAAY,mBAAA,CAAoB,QAAA,EAAU,OAAA,EAAS,MAAM,MAAM,CAAA;AACrE,IAAA,MAAA,GAAS,MAAA,CAAO,OAAA,CAAQ,CAAA,CAAA,EAAI,WAAW,KAAK,SAAS,CAAA;AAAA,EACvD;AAGA,EAAA,KAAA,MAAW,CAAC,WAAA,EAAa,EAAE,UAAU,KAAA,EAAO,KAAK,mBAAA,EAAqB;AACpE,IAAA,MAAM,SAAA,GAAY,uBAAA,CAAwB,QAAA,EAAU,KAAA,EAAO,MAAM,MAAM,CAAA;AACvE,IAAA,MAAA,GAAS,MAAA,CAAO,OAAA,CAAQ,CAAA,CAAA,EAAI,WAAW,KAAK,SAAS,CAAA;AAAA,EACvD;AAGA,EAAA,KAAA,MAAW,CAAC,aAAa,EAAE,QAAA,EAAU,MAAM,KAAA,EAAO,KAAK,gBAAA,EAAkB;AACvE,IAAA,MAAM,YAAY,eAAA,CAAgB,QAAA,EAAU,IAAA,EAAM,KAAA,EAAO,MAAM,MAAM,CAAA;AACrE,IAAA,MAAA,GAAS,MAAA,CAAO,OAAA,CAAQ,CAAA,CAAA,EAAI,WAAW,KAAK,SAAS,CAAA;AAAA,EACvD;AAEA,EAAA,OAAO,MAAA;AACT;AAEA,SAAS,cAAA,CACP,QAAA,EACA,IAAA,EACA,MAAA,EACA,kBAAA,EACQ;AACR,EAAA,OAAO,QAAA,CACJ,GAAA,CAAI,CAAC,EAAA,KAAO,aAAA,CAAc,EAAA,EAAI,IAAA,EAAM,MAAA,EAAQ,kBAAkB,CAAC,CAAA,CAC/D,IAAA,CAAK,EAAE,CAAA;AACZ;AAEA,SAAS,aAAA,CACP,EAAA,EACA,IAAA,EACA,MAAA,EACA,kBAAA,EACQ;AACR,EAAA,IAAIC,uCAAA,CAAiB,EAAE,CAAA,EAAG;AACxB,IAAA,OAAO,EAAA,CAAG,KAAA;AAAA,EACZ;AAEA,EAAA,IAAIC,wCAAA,CAAkB,EAAE,CAAA,EAAG;AACzB,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,EAAA,CAAG,KAAK,CAAA;AAC3B,IAAA,IAAI,KAAA,KAAU,MAAA,EAAW,OAAO,MAAA,CAAO,KAAK,CAAA;AAG5C,IAAA,IAAI,EAAA,CAAG,MAAM,UAAA,CAAW,IAAI,KAAK,EAAA,CAAG,KAAA,CAAM,QAAA,CAAS,IAAI,CAAA,EAAG;AACxD,MAAA,OAAO,CAAA,CAAA,EAAI,GAAG,KAAK,CAAA,CAAA,CAAA;AAAA,IACrB;AACA,IAAA,OAAO,gBAAA,CAAiB,EAAA,CAAG,KAAA,EAAO,MAAM,CAAA;AAAA,EAC1C;AAEA,EAAA,IAAIC,qCAAA,CAAe,EAAE,CAAA,EAAG;AAEtB,IAAA,OAAO,kBAAA,KAAuB,IAAA,GAAO,MAAA,CAAO,kBAAkB,CAAA,GAAI,GAAA;AAAA,EACpE;AAEA,EAAA,IAAIC,sCAAA,CAAgB,EAAE,CAAA,EAAG;AACvB,IAAA,OAAO,YAAA,CAAa,EAAA,EAAI,IAAA,EAAM,MAAM,CAAA;AAAA,EACtC;AAEA,EAAA,IAAIC,sCAAA,CAAgB,EAAE,CAAA,EAAG;AACvB,IAAA,OAAO,YAAA,CAAa,EAAA,EAAI,IAAA,EAAM,MAAM,CAAA;AAAA,EACtC;AAEA,EAAA,IAAIC,sCAAA,CAAgB,EAAE,CAAA,EAAG;AACvB,IAAA,OAAO,mBAAA,CAAoB,EAAA,EAAI,IAAA,EAAM,MAAM,CAAA;AAAA,EAC7C;AAEA,EAAA,IAAIC,oCAAA,CAAc,EAAE,CAAA,EAAG;AACrB,IAAA,OAAO,iBAAA,CAAkB,EAAA,EAAI,IAAA,EAAM,MAAM,CAAA;AAAA,EAC3C;AAEA,EAAA,IAAIC,oCAAA,CAAc,EAAE,CAAA,EAAG;AACrB,IAAA,OAAO,iBAAA,CAAkB,EAAA,EAAI,IAAA,EAAM,MAAM,CAAA;AAAA,EAC3C;AAGA,EAAA,OAAO,EAAA;AACT;AAEA,SAAS,YAAA,CACP,EAAA,EACA,IAAA,EACA,MAAA,EACQ;AACR,EAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,EAAA,CAAG,KAAK,CAAA;AAC3B,EAAA,IAAI,OAAO,UAAU,QAAA,EAAU;AAC7B,IAAA,OAAO,gBAAA,CAAiB,EAAA,CAAG,KAAA,EAAO,MAAM,CAAA;AAAA,EAC1C;AAEA,EAAA,MAAM,aAAA,GAAgB,QAAQ,EAAA,CAAG,MAAA;AACjC,EAAA,MAAM,WAAA,GAAc,IAAI,IAAA,CAAK,WAAA,CAAY,QAAQ,EAAE,IAAA,EAAM,EAAA,CAAG,UAAA,EAAY,CAAA;AACxE,EAAA,MAAM,QAAA,GAAW,WAAA,CAAY,MAAA,CAAO,aAAa,CAAA;AAGjD,EAAA,MAAM,QAAA,GAAW,IAAI,KAAK,CAAA,CAAA;AAC1B,EAAA,IAAI,EAAA,CAAG,OAAA,CAAQ,QAAQ,CAAA,EAAG;AACxB,IAAA,OAAO,cAAA,CAAe,GAAG,OAAA,CAAQ,QAAQ,EAAE,KAAA,EAAO,IAAA,EAAM,QAAQ,aAAa,CAAA;AAAA,EAC/E;AAGA,EAAA,IAAI,EAAA,CAAG,OAAA,CAAQ,QAAQ,CAAA,EAAG;AACxB,IAAA,OAAO,cAAA,CAAe,GAAG,OAAA,CAAQ,QAAQ,EAAE,KAAA,EAAO,IAAA,EAAM,QAAQ,aAAa,CAAA;AAAA,EAC/E;AAGA,EAAA,IAAI,EAAA,CAAG,QAAQ,KAAA,EAAO;AACpB,IAAA,OAAO,eAAe,EAAA,CAAG,OAAA,CAAQ,MAAM,KAAA,EAAO,IAAA,EAAM,QAAQ,aAAa,CAAA;AAAA,EAC3E;AAEA,EAAA,OAAO,gBAAA,CAAiB,EAAA,CAAG,KAAA,EAAO,MAAM,CAAA;AAC1C;AAEA,SAAS,YAAA,CACP,EAAA,EACA,IAAA,EACA,MAAA,EACQ;AACR,EAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,EAAA,CAAG,KAAK,CAAA;AAC3B,EAAA,MAAM,GAAA,GAAM,OAAO,KAAK,CAAA;AAGxB,EAAA,IAAI,EAAA,CAAG,OAAA,CAAQ,GAAG,CAAA,EAAG;AACnB,IAAA,OAAO,cAAA,CAAe,GAAG,OAAA,CAAQ,GAAG,EAAE,KAAA,EAAO,IAAA,EAAM,QAAQ,IAAI,CAAA;AAAA,EACjE;AAGA,EAAA,IAAI,EAAA,CAAG,QAAQ,KAAA,EAAO;AACpB,IAAA,OAAO,eAAe,EAAA,CAAG,OAAA,CAAQ,MAAM,KAAA,EAAO,IAAA,EAAM,QAAQ,IAAI,CAAA;AAAA,EAClE;AAEA,EAAA,OAAO,gBAAA,CAAiB,EAAA,CAAG,KAAA,EAAO,MAAM,CAAA;AAC1C;AAGO,IAAM,WAAA,GAAc,+FAAA;AAKpB,SAAS,cAAc,QAAA,EAA2B;AACvD,EAAA,OAAO,WAAA,CAAY,KAAK,QAAQ,CAAA;AAClC;;;ACnyBA,IAAM,gBAAA,GAAmB,YAAA;AAElB,SAAS,WAAA,CACd,QAAA,EACA,IAAA,EACA,MAAA,EACQ;AACR,EAAA,MAAM,iBAAiB,MAAA,IAAU,IAAA;AAGjC,EAAA,IAAI,aAAA,CAAc,QAAQ,CAAA,IAAK,kBAAA,CAAmB,QAAQ,CAAA,IAAK,kBAAA,CAAmB,QAAQ,CAAA,EAAG;AAC3F,IAAA,IAAI,CAAC,IAAA,EAAM;AAET,MAAA,MAAM,MAAM,SAAA,EAAU;AACtB,MAAA,IAAI,IAAI,iBAAA,EAAmB;AACzB,QAAA,OAAO,cAAA,CAAe,QAAA,EAAU,EAAC,EAAG,cAAc,CAAA;AAAA,MACpD;AACA,MAAA,OAAO,QAAA;AAAA,IACT;AACA,IAAA,OAAO,cAAA,CAAe,QAAA,EAAU,IAAA,EAAM,cAAc,CAAA;AAAA,EACtD;AAGA,EAAA,IAAI,CAAC,IAAA,EAAM;AACT,IAAA,MAAM,MAAM,SAAA,EAAU;AACtB,IAAA,IAAI,IAAI,iBAAA,EAAmB;AACzB,MAAA,OAAO,QAAA,CAAS,OAAA,CAAQ,gBAAA,EAAkB,CAAC,GAAG,GAAA,KAAQ;AACpD,QAAA,OAAO,GAAA,CAAI,iBAAA,CAAmB,GAAA,EAAK,cAAc,CAAA;AAAA,MACnD,CAAC,CAAA;AAAA,IACH;AACA,IAAA,OAAO,QAAA;AAAA,EACT;AAEA,EAAA,OAAO,QAAA,CAAS,OAAA,CAAQ,gBAAA,EAAkB,CAAC,GAAG,GAAA,KAAQ;AACpD,IAAA,MAAM,KAAA,GAAQ,KAAK,GAAG,CAAA;AACtB,IAAA,IAAI,KAAA,KAAU,MAAA,EAAW,OAAO,MAAA,CAAO,KAAK,CAAA;AAC5C,IAAA,MAAM,MAAM,SAAA,EAAU;AACtB,IAAA,IAAI,IAAI,iBAAA,EAAmB;AACzB,MAAA,OAAO,GAAA,CAAI,iBAAA,CAAkB,GAAA,EAAK,cAAc,CAAA;AAAA,IAClD;AACA,IAAA,OAAO,IAAI,GAAG,CAAA,CAAA,CAAA;AAAA,EAChB,CAAC,CAAA;AACH;;;ACnCA,SAAS,gBAAgB,YAAA,EAA2C;AAClE,EAAA,MAAM,SAAS,SAAA,EAAU;AACzB,EAAA,MAAM,gBAAA,GAAmB,MAAA,CAAO,IAAA,CAAK,YAAY,CAAA;AACjD,EAAA,MAAM,aAAA,GAAgB,mBAAmB,MAAM,CAAA;AAG/C,EAAA,KAAA,MAAW,aAAa,aAAA,EAAe;AACrC,IAAA,MAAM,QAAA,GAAW,aAAa,SAAS,CAAA;AACvC,IAAA,IAAI,QAAA,EAAU;AACZ,MAAA,MAAM,aAAa,SAAA,KAAc,MAAA;AAEjC,MAAA,IAAI,UAAA,EAAY;AACd,QAAA,WAAA,CAAY;AAAA,UACV,IAAA,EAAM,qBAAA;AAAA,UACN,eAAA,EAAiB,MAAA;AAAA,UACjB,gBAAA;AAAA,UACA,YAAA,EAAc;AAAA,SACf,CAAA;AAAA,MACH;AACA,MAAA,OAAO;AAAA,QACL,QAAA;AAAA,QACA,MAAA,EAAQ,SAAA;AAAA,QACR,SAAA,EAAW;AAAA,UACT,SAAA,EAAW,KAAA;AAAA,UACX,UAAA;AAAA,UACA,eAAA,EAAiB,MAAA;AAAA,UACjB,UAAA,EAAY;AAAA;AACd,OACF;AAAA,IACF;AAAA,EACF;AAGA,EAAA,MAAM,cAAA,GAAiB,MAAA,CAAO,OAAA,CAAQ,YAAY,EAAE,CAAC,CAAA;AACrD,EAAA,IAAI,cAAA,EAAgB;AAClB,IAAA,WAAA,CAAY;AAAA,MACV,IAAA,EAAM,qBAAA;AAAA,MACN,eAAA,EAAiB,MAAA;AAAA,MACjB,gBAAA;AAAA,MACA,YAAA,EAAc,eAAe,CAAC;AAAA,KAC/B,CAAA;AACD,IAAA,OAAO;AAAA,MACL,QAAA,EAAU,eAAe,CAAC,CAAA;AAAA,MAC1B,MAAA,EAAQ,eAAe,CAAC,CAAA;AAAA,MACxB,SAAA,EAAW;AAAA,QACT,SAAA,EAAW,KAAA;AAAA,QACX,UAAA,EAAY,IAAA;AAAA,QACZ,eAAA,EAAiB,MAAA;AAAA,QACjB,UAAA,EAAY,eAAe,CAAC;AAAA;AAC9B,KACF;AAAA,EACF;AAEA,EAAA,MAAM,IAAI,KAAA;AAAA,IACR,oCAAoC,MAAM,CAAA,cAAA,EAAiB,gBAAA,CAAiB,IAAA,CAAK,IAAI,CAAC,CAAA;AAAA,GACxF;AACF;AAiBO,SAAS,EAAA,CACd,KAAA,EACA,MAAA,EACA,KAAA,EACQ;AAER,EAAA,IAAI,OAAO,UAAU,QAAA,EAAU;AAC7B,IAAA,MAAMC,aAAAA,GAAe,KAAA;AACrB,IAAA,MAAMC,KAAAA,GAAO,MAAA;AACb,IAAA,MAAM,EAAE,UAAAC,SAAAA,EAAU,MAAA,EAAAC,SAAQ,SAAA,EAAAC,UAAAA,EAAU,GAAI,eAAA,CAAgBJ,aAAY,CAAA;AACpE,IAAA,MAAMK,OAAAA,GAAS,WAAA,CAAYH,SAAAA,EAAUD,KAAAA,EAAME,OAAM,CAAA;AACjD,IAAA,OAAO,gBAAA,CAAiBE,SAAQD,UAAS,CAAA;AAAA,EAC3C;AAGA,EAAA,MAAM,EAAA,GAAK,KAAA;AACX,EAAA,MAAM,EAAA,GAAK,MAAA;AACX,EAAA,MAAM,IAAA,GAAO,KAAA;AAEb,EAAA,MAAM,YAAA,GAA6B,EAAE,EAAA,EAAI,EAAA,EAAG;AAC5C,EAAA,MAAM,EAAE,QAAA,EAAU,MAAA,EAAQ,SAAA,EAAU,GAAI,gBAAgB,YAAY,CAAA;AACpE,EAAA,MAAM,MAAA,GAAS,WAAA,CAAY,QAAA,EAAU,IAAA,EAAM,MAAM,CAAA;AACjD,EAAA,OAAO,gBAAA,CAAiB,QAAQ,SAAS,CAAA;AAC3C;;;AC9FO,SAAS,aAAA,CACd,KAAA,EACA,YAAA,EACA,IAAA,EACQ;AACR,EAAA,MAAM,SAAS,SAAA,EAAU;AACzB,EAAA,MAAM,gBAAA,GAAmB,MAAA,CAAO,IAAA,CAAK,YAAY,CAAA;AACjD,EAAA,MAAM,aAAA,GAAgB,mBAAmB,MAAM,CAAA;AAG/C,EAAA,KAAA,MAAW,aAAa,aAAA,EAAe;AACrC,IAAA,MAAM,QAAA,GAAW,aAAa,SAAS,CAAA;AACvC,IAAA,IAAI,QAAA,EAAU;AAEZ,MAAA,IAAI,cAAc,MAAA,EAAQ;AACxB,QAAA,WAAA,CAAY;AAAA,UACV,IAAA,EAAM,qBAAA;AAAA,UACN,eAAA,EAAiB,MAAA;AAAA,UACjB,gBAAA;AAAA,UACA,YAAA,EAAc;AAAA,SACf,CAAA;AAAA,MACH;AACA,MAAA,OAAO,WAAA,CAAY,QAAA,EAAU,IAAA,EAAM,SAAS,CAAA;AAAA,IAC9C;AAAA,EACF;AAGA,EAAA,MAAM,cAAA,GAAiB,MAAA,CAAO,OAAA,CAAQ,YAAY,EAAE,CAAC,CAAA;AACrD,EAAA,IAAI,cAAA,EAAgB;AAClB,IAAA,WAAA,CAAY;AAAA,MACV,IAAA,EAAM,qBAAA;AAAA,MACN,eAAA,EAAiB,MAAA;AAAA,MACjB,gBAAA;AAAA,MACA,YAAA,EAAc,eAAe,CAAC;AAAA,KAC/B,CAAA;AACD,IAAA,OAAO,YAAY,cAAA,CAAe,CAAC,GAAG,IAAA,EAAM,cAAA,CAAe,CAAC,CAAC,CAAA;AAAA,EAC/D;AAEA,EAAA,MAAM,IAAI,KAAA;AAAA,IACR,oCAAoC,MAAM,CAAA,cAAA,EAAiB,gBAAA,CAAiB,IAAA,CAAK,IAAI,CAAC,CAAA;AAAA,GACxF;AACF;AAIA,IAAI,OAAO,eAAe,WAAA,EAAa;AACrC,EAAC,WAAuC,aAAA,GAAgB,aAAA;AAC1D;;;ACnDA,SAAS,UAAA,CAAW,OAAe,KAAA,EAA6B;AAC9D,EAAA,OAAO,CAAC,KAAA,EAAO,KAAA,EAAO,IAAA,KAAS;AAC7B,IAAA,MAAM,YAAA,GAA6B;AAAA,MACjC,CAAC,KAAK,GAAG,KAAA;AAAA,MACT,CAAC,KAAK,GAAG;AAAA,KACX;AACA,IAAA,OAAO,EAAA,CAAG,cAAc,IAAI,CAAA;AAAA,EAC9B,CAAA;AACF;AAGO,IAAM,KAAA,GAAQ,UAAA,CAAW,IAAA,EAAM,IAAI;AACnC,IAAM,KAAA,GAAQ,UAAA,CAAW,IAAA,EAAM,IAAI;AACnC,IAAM,KAAA,GAAQ,UAAA,CAAW,IAAA,EAAM,IAAI;AACnC,IAAM,KAAA,GAAQ,UAAA,CAAW,IAAA,EAAM,IAAI;AACnC,IAAM,KAAA,GAAQ,UAAA,CAAW,IAAA,EAAM,IAAI;AAGnC,IAAM,KAAA,GAAQ,UAAA,CAAW,IAAA,EAAM,IAAI;AACnC,IAAM,KAAA,GAAQ,UAAA,CAAW,IAAA,EAAM,IAAI;AACnC,IAAM,KAAA,GAAQ,UAAA,CAAW,IAAA,EAAM,IAAI;AACnC,IAAM,KAAA,GAAQ,UAAA,CAAW,IAAA,EAAM,IAAI;AACnC,IAAM,KAAA,GAAQ,UAAA,CAAW,IAAA,EAAM,IAAI;AAGnC,IAAM,KAAA,GAAQ,UAAA,CAAW,IAAA,EAAM,IAAI;AACnC,IAAM,KAAA,GAAQ,UAAA,CAAW,IAAA,EAAM,IAAI;AACnC,IAAM,KAAA,GAAQ,UAAA,CAAW,IAAA,EAAM,IAAI;;;ACC1C,IAAM,iBAAA,GAAoB,SAAA;AAG1B,IAAM,mBAAA,GAAsB,GAAA;AAG5B,IAAI,yBAAiD,EAAC;AAGtD,IAAI,eAA+D,EAAC;AACpE,IAAM,eAAA,uBAAsB,GAAA,EAA2B;AAEvD,SAAS,aAAA,CAAc,QAAgB,SAAA,EAA2B;AAChE,EAAA,OAAO,CAAA,EAAG,SAAS,CAAA,CAAA,EAAI,MAAM,CAAA,CAAA;AAC/B;AAQA,SAAS,SAAS,OAAA,EAAqD;AACrE,EAAA,MAAM,cAAA,GAAiB,OAAA,CAAQ,OAAA,CAAQ,mBAAmB,CAAA;AAC1D,EAAA,IAAI,iBAAiB,CAAA,EAAG;AACtB,IAAA,OAAO;AAAA,MACL,SAAA,EAAW,OAAA,CAAQ,SAAA,CAAU,CAAA,EAAG,cAAc,CAAA;AAAA,MAC9C,GAAA,EAAK,OAAA,CAAQ,SAAA,CAAU,cAAA,GAAiB,CAAC;AAAA,KAC3C;AAAA,EACF;AACA,EAAA,OAAO;AAAA,IACL,SAAA,EAAW,iBAAA;AAAA,IACX,GAAA,EAAK;AAAA,GACP;AACF;AAmBO,SAAS,gBAAA,CAAiB,OAAqB,SAAA,EAA0B;AAC9E,EAAA,MAAM,KAAK,SAAA,IAAa,iBAAA;AACxB,EAAA,IAAI,CAAC,sBAAA,CAAuB,EAAE,CAAA,EAAG;AAC/B,IAAA,sBAAA,CAAuB,EAAE,IAAI,EAAC;AAAA,EAChC;AACA,EAAA,sBAAA,CAAuB,EAAE,CAAA,GAAI;AAAA,IAC3B,GAAG,uBAAuB,EAAE,CAAA;AAAA,IAC5B,GAAG;AAAA,GACL;AACF;AAQO,SAAS,cAAA,CAAe,MAAA,EAAgB,IAAA,EAAkB,SAAA,EAA0B;AACzF,EAAA,MAAM,KAAK,SAAA,IAAa,iBAAA;AACxB,EAAA,IAAI,CAAC,sBAAA,CAAuB,EAAE,CAAA,EAAG;AAC/B,IAAA,sBAAA,CAAuB,EAAE,IAAI,EAAC;AAAA,EAChC;AACA,EAAA,sBAAA,CAAuB,EAAE,CAAA,CAAE,MAAM,CAAA,GAAI;AAAA,IACnC,GAAG,sBAAA,CAAuB,EAAE,CAAA,CAAE,MAAM,CAAA;AAAA,IACpC,GAAG;AAAA,GACL;AACF;AAMO,SAAS,kBAAkB,SAAA,EAA0B;AAC1D,EAAA,IAAI,SAAA,EAAW;AACb,IAAA,OAAO,uBAAuB,SAAS,CAAA;AAEvC,IAAA,KAAA,MAAW,GAAA,IAAO,MAAA,CAAO,IAAA,CAAK,YAAY,CAAA,EAAG;AAC3C,MAAA,IAAI,GAAA,CAAI,UAAA,CAAW,CAAA,EAAG,SAAS,GAAG,CAAA,EAAG;AACnC,QAAA,OAAO,aAAa,GAAG,CAAA;AACvB,QAAA,eAAA,CAAgB,OAAO,GAAG,CAAA;AAAA,MAC5B;AAAA,IACF;AAAA,EACF,CAAA,MAAO;AACL,IAAA,sBAAA,GAAyB,EAAC;AAC1B,IAAA,YAAA,GAAe,EAAC;AAChB,IAAA,eAAA,CAAgB,KAAA,EAAM;AAAA,EACxB;AACF;AAaA,eAAsB,SAAA,CAAU,QAAgB,SAAA,EAAmC;AACjF,EAAA,MAAM,KAAK,SAAA,IAAa,iBAAA;AACxB,EAAA,MAAM,MAAM,SAAA,EAAU;AAEtB,EAAA,IAAI,CAAC,IAAI,MAAA,EAAQ;AACf,IAAA,MAAM,IAAI,MAAM,8DAA8D,CAAA;AAAA,EAChF;AAEA,EAAA,MAAM,GAAA,GAAM,aAAA,CAAc,MAAA,EAAQ,EAAE,CAAA;AAGpC,EAAA,IAAI,YAAA,CAAa,GAAG,CAAA,KAAM,QAAA,EAAU;AAGpC,EAAA,IAAI,eAAA,CAAgB,GAAA,CAAI,GAAG,CAAA,EAAG;AAC5B,IAAA,OAAO,eAAA,CAAgB,IAAI,GAAG,CAAA;AAAA,EAChC;AAEA,EAAA,MAAM,WAAW,YAAY;AAC3B,IAAA,YAAA,CAAa,GAAG,CAAA,GAAI,SAAA;AACpB,IAAA,IAAI;AACF,MAAA,MAAM,IAAA,GAAO,MAAM,GAAA,CAAI,MAAA,CAAQ,QAAQ,EAAE,CAAA;AACzC,MAAA,cAAA,CAAe,MAAA,EAAQ,MAAoB,EAAE,CAAA;AAC7C,MAAA,YAAA,CAAa,GAAG,CAAA,GAAI,QAAA;AAAA,IACtB,SAAS,KAAA,EAAO;AACd,MAAA,YAAA,CAAa,GAAG,CAAA,GAAI,OAAA;AACpB,MAAA,MAAM,KAAA;AAAA,IACR,CAAA,SAAE;AACA,MAAA,eAAA,CAAgB,OAAO,GAAG,CAAA;AAAA,IAC5B;AAAA,EACF,CAAA,GAAG;AAEH,EAAA,eAAA,CAAgB,GAAA,CAAI,KAAK,OAAO,CAAA;AAChC,EAAA,OAAO,OAAA;AACT;AAOO,SAAS,QAAA,CAAS,QAAgB,SAAA,EAA6B;AACpE,EAAA,MAAM,KAAK,SAAA,IAAa,iBAAA;AACxB,EAAA,MAAM,GAAA,GAAM,aAAA,CAAc,MAAA,EAAQ,EAAE,CAAA;AACpC,EAAA,OAAO,YAAA,CAAa,GAAG,CAAA,KAAM,QAAA;AAC/B;AAOA,SAAS,cAAA,CAAe,MAAkB,GAAA,EAAiC;AACzE,EAAA,MAAM,KAAA,GAAQ,GAAA,CAAI,KAAA,CAAM,GAAG,CAAA;AAC3B,EAAA,IAAI,OAAA,GAA2C,IAAA;AAE/C,EAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACxB,IAAA,IAAI,OAAO,OAAA,KAAY,QAAA,IAAY,OAAA,KAAY,IAAA,EAAM;AACnD,MAAA,OAAO,MAAA;AAAA,IACT;AACA,IAAA,OAAA,GAAU,QAAQ,IAAI,CAAA;AACtB,IAAA,IAAI,YAAY,MAAA,EAAW;AACzB,MAAA,OAAO,MAAA;AAAA,IACT;AAAA,EACF;AAEA,EAAA,OAAO,OAAO,OAAA,KAAY,QAAA,GAAW,OAAA,GAAU,MAAA;AACjD;AAKA,SAAS,iBAAA,CAAkB,OAAe,MAAA,EAAqC;AAC7E,EAAA,MAAM,KAAA,GAAQ,IAAI,IAAA,CAAK,WAAA,CAAY,MAAM,CAAA;AACzC,EAAA,OAAO,KAAA,CAAM,OAAO,KAAK,CAAA;AAC3B;AAKA,SAAS,gBAAA,CACP,IAAA,EACA,GAAA,EACA,IAAA,EACA,MAAA,EACoB;AACpB,EAAA,IAAI,QAAA,GAAW,cAAA,CAAe,IAAA,EAAM,GAAG,CAAA;AAGvC,EAAA,IAAI,IAAA,IAAQ,OAAO,IAAA,CAAK,KAAA,KAAU,QAAA,EAAU;AAC1C,IAAA,MAAM,SAAA,GAAY,GAAG,GAAG,CAAA,CAAA,EAAI,kBAAkB,IAAA,CAAK,KAAA,EAAO,MAAM,CAAC,CAAA,CAAA;AACjE,IAAA,MAAM,cAAA,GAAiB,cAAA,CAAe,IAAA,EAAM,SAAS,CAAA;AACrD,IAAA,IAAI,cAAA,EAAgB;AAClB,MAAA,QAAA,GAAW,cAAA;AAAA,IACb;AAAA,EACF;AAEA,EAAA,OAAO,QAAA;AACT;AAYO,SAAS,CAAA,CACd,GAAA,EACA,IAAA,EACA,MAAA,EACQ;AACR,EAAA,MAAM,EAAE,SAAA,EAAW,GAAA,EAAK,SAAA,EAAU,GAAI,SAAS,GAAG,CAAA;AAClD,EAAA,MAAME,cAAAA,GAAgB,UAAU,SAAA,EAAU;AAC1C,EAAA,MAAM,aAAA,GAAgB,mBAAmBA,cAAa,CAAA;AAEtD,EAAA,MAAM,cAAA,GAAiB,sBAAA,CAAuB,SAAS,CAAA,IAAK,EAAC;AAC7D,EAAA,MAAM,gBAAA,GAAmB,MAAA,CAAO,IAAA,CAAK,cAAc,CAAA;AAEnD,EAAA,IAAI,QAAA;AACJ,EAAA,IAAI,UAAA;AAGJ,EAAA,KAAA,MAAW,aAAa,aAAA,EAAe;AACrC,IAAA,MAAM,IAAA,GAAO,eAAe,SAAS,CAAA;AACrC,IAAA,IAAI,CAAC,IAAA,EAAM;AAEX,IAAA,MAAM,KAAA,GAAQ,gBAAA,CAAiB,IAAA,EAAM,SAAA,EAAW,MAAM,SAAS,CAAA;AAC/D,IAAA,IAAI,KAAA,EAAO;AACT,MAAA,QAAA,GAAW,KAAA;AACX,MAAA,UAAA,GAAa,SAAA;AACb,MAAA;AAAA,IACF;AAAA,EACF;AAEA,EAAA,IAAI,CAAC,QAAA,EAAU;AACb,IAAA,WAAA,CAAY;AAAA,MACV,IAAA,EAAM,qBAAA;AAAA,MACN,GAAA;AAAA,MACA,eAAA,EAAiBA,cAAAA;AAAA,MACjB;AAAA,KACD,CAAA;AAED,IAAA,MAAMF,UAAAA,GAAuB;AAAA,MAC3B,SAAA,EAAW,IAAA;AAAA,MACX,UAAA,EAAY,KAAA;AAAA,MACZ,eAAA,EAAiBE,cAAAA;AAAA,MACjB;AAAA,KACF;AACA,IAAA,OAAO,gBAAA,CAAiB,KAAKF,UAAS,CAAA;AAAA,EACxC;AAEA,EAAA,MAAM,aAAa,UAAA,KAAeE,cAAAA;AAGlC,EAAA,IAAI,UAAA,EAAY;AACd,IAAA,WAAA,CAAY;AAAA,MACV,IAAA,EAAM,qBAAA;AAAA,MACN,GAAA;AAAA,MACA,eAAA,EAAiBA,cAAAA;AAAA,MACjB,gBAAA;AAAA,MACA,YAAA,EAAc;AAAA,KACf,CAAA;AAAA,EACH;AAEA,EAAA,MAAM,MAAA,GAAS,WAAA,CAAY,QAAA,EAAU,IAAA,EAAM,cAAcA,cAAa,CAAA;AAEtE,EAAA,MAAM,SAAA,GAAuB;AAAA,IAC3B,SAAA,EAAW,KAAA;AAAA,IACX,UAAA;AAAA,IACA,eAAA,EAAiBA,cAAAA;AAAA,IACjB,UAAA;AAAA,IACA;AAAA,GACF;AAEA,EAAA,OAAO,gBAAA,CAAiB,QAAQ,SAAS,CAAA;AAC3C;AAOO,SAAS,cAAA,CAAe,KAAa,MAAA,EAA0B;AACpE,EAAA,MAAM,EAAE,SAAA,EAAW,GAAA,EAAK,SAAA,EAAU,GAAI,SAAS,GAAG,CAAA;AAClD,EAAA,MAAMA,cAAAA,GAAgB,UAAU,SAAA,EAAU;AAC1C,EAAA,MAAM,cAAA,GAAiB,sBAAA,CAAuB,SAAS,CAAA,IAAK,EAAC;AAC7D,EAAA,MAAM,IAAA,GAAO,eAAeA,cAAa,CAAA;AACzC,EAAA,OAAO,IAAA,GAAO,cAAA,CAAe,IAAA,EAAM,SAAS,MAAM,MAAA,GAAY,KAAA;AAChE;AAMO,SAAS,iBAAiB,SAAA,EAA8B;AAC7D,EAAA,IAAI,SAAA,EAAW;AACb,IAAA,OAAO,OAAO,IAAA,CAAK,sBAAA,CAAuB,SAAS,CAAA,IAAK,EAAE,CAAA;AAAA,EAC5D;AAEA,EAAA,MAAM,OAAA,uBAAc,GAAA,EAAY;AAChC,EAAA,KAAA,MAAW,EAAA,IAAM,MAAA,CAAO,MAAA,CAAO,sBAAsB,CAAA,EAAG;AACtD,IAAA,KAAA,MAAW,MAAA,IAAU,MAAA,CAAO,IAAA,CAAK,EAAE,CAAA,EAAG;AACpC,MAAA,OAAA,CAAQ,IAAI,MAAM,CAAA;AAAA,IACpB;AAAA,EACF;AACA,EAAA,OAAO,KAAA,CAAM,KAAK,OAAO,CAAA;AAC3B;AAOO,SAAS,aAAA,CAAc,QAAgB,SAAA,EAA4C;AACxF,EAAA,MAAM,KAAK,SAAA,IAAa,iBAAA;AACxB,EAAA,OAAO,sBAAA,CAAuB,EAAE,CAAA,GAAI,MAAM,CAAA;AAC5C;AAKO,SAAS,mBAAA,GAAgC;AAC9C,EAAA,OAAO,MAAA,CAAO,KAAK,sBAAsB,CAAA;AAC3C;;;ACnWA,SAAS,WAAA,CAAY,WAAmB,gBAAA,EAAgD;AACtF,EAAA,MAAM,UAAA,GAAa,SAAA,CAAU,IAAA,EAAK,CAAE,WAAA,EAAY;AAEhD,EAAA,MAAM,QAAQ,gBAAA,CAAiB,IAAA,CAAK,OAAK,CAAA,CAAE,WAAA,OAAkB,UAAU,CAAA;AACvE,EAAA,IAAI,OAAO,OAAO,KAAA;AAGlB,EAAA,MAAM,MAAA,GAAS,gBAAgB,SAAS,CAAA;AACxC,EAAA,IAAI,MAAA,EAAQ;AACV,IAAA,MAAM,WAAA,GAAc,iBAAiB,IAAA,CAAK,CAAA,CAAA,KAAK,EAAE,WAAA,EAAY,KAAM,MAAA,CAAO,WAAA,EAAa,CAAA;AACvF,IAAA,IAAI,aAAa,OAAO,WAAA;AAAA,EAC1B;AAEA,EAAA,OAAO,MAAA;AACT;AAKA,SAAS,oBAAoB,gBAAA,EAAgD;AAC3E,EAAA,IAAI,OAAO,UAAA,KAAe,WAAA,EAAa,OAAO,MAAA;AAC9C,EAAA,MAAM,MAAO,UAAA,CAAoF,SAAA;AACjG,EAAA,IAAI,CAAC,KAAK,OAAO,MAAA;AAEjB,EAAA,MAAM,SAAA,GAAY,IAAI,SAAA,KAAc,GAAA,CAAI,WAAW,CAAC,GAAA,CAAI,QAAQ,CAAA,GAAI,EAAC,CAAA;AACrE,EAAA,KAAA,MAAW,QAAQ,SAAA,EAAW;AAC5B,IAAA,MAAM,KAAA,GAAQ,WAAA,CAAY,IAAA,EAAM,gBAAgB,CAAA;AAChD,IAAA,IAAI,OAAO,OAAO,KAAA;AAAA,EACpB;AACA,EAAA,OAAO,MAAA;AACT;AAKA,SAAS,gBAAA,CAAiB,kBAA4B,UAAA,EAAwC;AAC5F,EAAA,IAAI,OAAO,QAAA,KAAa,WAAA,EAAa,OAAO,MAAA;AAE5C,EAAA,MAAM,OAAA,GAAU,QAAA,CAAS,MAAA,CAAO,KAAA,CAAM,GAAG,CAAA;AACzC,EAAA,KAAA,MAAW,UAAU,OAAA,EAAS;AAC5B,IAAA,MAAM,CAAC,GAAA,EAAK,KAAK,CAAA,GAAI,MAAA,CAAO,KAAA,CAAM,GAAG,CAAA,CAAE,GAAA,CAAI,CAAA,CAAA,KAAK,CAAA,CAAE,IAAA,EAAM,CAAA;AACxD,IAAA,IAAI,GAAA,KAAQ,cAAc,KAAA,EAAO;AAC/B,MAAA,OAAO,WAAA,CAAY,OAAO,gBAAgB,CAAA;AAAA,IAC5C;AAAA,EACF;AACA,EAAA,OAAO,MAAA;AACT;AAKA,SAAS,cAAc,gBAAA,EAAgD;AACrE,EAAA,IAAI,OAAO,QAAA,KAAa,WAAA,EAAa,OAAO,MAAA;AAE5C,EAAA,MAAM,WAAW,QAAA,CAAS,QAAA;AAE1B,EAAA,MAAM,KAAA,GAAQ,QAAA,CAAS,KAAA,CAAM,4CAA4C,CAAA;AACzE,EAAA,IAAI,KAAA,GAAQ,CAAC,CAAA,EAAG;AACd,IAAA,OAAO,WAAA,CAAY,KAAA,CAAM,CAAC,CAAA,EAAG,gBAAgB,CAAA;AAAA,EAC/C;AACA,EAAA,OAAO,MAAA;AACT;AAMA,SAAS,gBAAA,CAAiB,kBAA4B,WAAA,EAA0C;AAC9F,EAAA,IAAI,CAAC,aAAa,OAAO,MAAA;AAEzB,EAAA,MAAM,UAAU,WAAA,CACb,KAAA,CAAM,GAAG,CAAA,CACT,IAAI,CAAA,IAAA,KAAQ;AACX,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,IAAA,EAAK,CAAE,MAAM,GAAG,CAAA;AACnC,IAAA,MAAM,IAAA,GAAO,KAAA,CAAM,CAAC,CAAA,EAAG,MAAK,IAAK,EAAA;AACjC,IAAA,MAAM,IAAA,GAAO,MAAM,CAAC,CAAA;AACpB,IAAA,MAAM,CAAA,GAAI,OAAO,UAAA,CAAW,IAAA,CAAK,QAAQ,IAAA,EAAM,EAAE,CAAC,CAAA,GAAI,CAAA;AACtD,IAAA,OAAO,EAAE,MAAM,CAAA,EAAE;AAAA,EACnB,CAAC,EACA,IAAA,CAAK,CAAC,GAAG,CAAA,KAAM,CAAA,CAAE,CAAA,GAAI,CAAA,CAAE,CAAC,CAAA;AAE3B,EAAA,KAAA,MAAW,EAAE,IAAA,EAAK,IAAK,OAAA,EAAS;AAC9B,IAAA,MAAM,KAAA,GAAQ,WAAA,CAAY,IAAA,EAAM,gBAAgB,CAAA;AAChD,IAAA,IAAI,OAAO,OAAO,KAAA;AAAA,EACpB;AACA,EAAA,OAAO,MAAA;AACT;AAaO,SAAS,aAAa,OAAA,EAAsC;AACjE,EAAA,MAAM;AAAA,IACJ,gBAAA;AAAA,IACA,aAAA;AAAA,IACA,OAAA,GAAU,CAAC,WAAW,CAAA;AAAA,IACtB,UAAA,GAAa,aAAA;AAAA,IACb;AAAA,GACF,GAAI,OAAA;AAEJ,EAAA,KAAA,MAAW,UAAU,OAAA,EAAS;AAC5B,IAAA,IAAI,QAAA;AACJ,IAAA,QAAQ,MAAA;AAAQ,MACd,KAAK,WAAA;AACH,QAAA,QAAA,GAAW,oBAAoB,gBAAgB,CAAA;AAC/C,QAAA;AAAA,MACF,KAAK,QAAA;AACH,QAAA,QAAA,GAAW,gBAAA,CAAiB,kBAAkB,UAAU,CAAA;AACxD,QAAA;AAAA,MACF,KAAK,KAAA;AACH,QAAA,QAAA,GAAW,cAAc,gBAAgB,CAAA;AACzC,QAAA;AAAA,MACF,KAAK,QAAA;AACH,QAAA,QAAA,GAAW,gBAAA,CAAiB,kBAAkB,WAAW,CAAA;AACzD,QAAA;AAAA;AAEJ,IAAA,IAAI,UAAU,OAAO,QAAA;AAAA,EACvB;AAEA,EAAA,OAAO,aAAA;AACT;;;ACzIA,SAAS,aAAa,GAAA,EAAqB;AACzC,EAAA,OAAO,GAAA,CAAI,OAAA,CAAQ,qBAAA,EAAuB,MAAM,CAAA;AAClD;AAmBO,SAAS,aAAA,CACd,UACA,cAAA,EACmB;AACnB,EAAA,IAAI,cAAA,CAAe,WAAW,CAAA,EAAG;AAC/B,IAAA,OAAO,CAAC,EAAE,IAAA,EAAM,MAAA,EAAQ,OAAA,EAAS,UAAU,CAAA;AAAA,EAC7C;AAEA,EAAA,MAAM,WAA8B,EAAC;AACrC,EAAA,MAAM,eAAe,cAAA,CAAe,GAAA,CAAI,YAAY,CAAA,CAAE,KAAK,GAAG,CAAA;AAC9D,EAAA,MAAM,QAAQ,IAAI,MAAA,CAAO,CAAA,EAAA,EAAK,YAAY,iBAAiB,IAAI,CAAA;AAE/D,EAAA,IAAI,SAAA,GAAY,CAAA;AAChB,EAAA,IAAI,KAAA;AAEJ,EAAA,OAAA,CAAQ,KAAA,GAAQ,KAAA,CAAM,IAAA,CAAK,QAAQ,OAAO,IAAA,EAAM;AAE9C,IAAA,IAAI,KAAA,CAAM,QAAQ,SAAA,EAAW;AAC3B,MAAA,QAAA,CAAS,IAAA,CAAK;AAAA,QACZ,IAAA,EAAM,MAAA;AAAA,QACN,OAAA,EAAS,QAAA,CAAS,KAAA,CAAM,SAAA,EAAW,MAAM,KAAK;AAAA,OAC/C,CAAA;AAAA,IACH;AAGA,IAAA,QAAA,CAAS,IAAA,CAAK;AAAA,MACZ,IAAA,EAAM,WAAA;AAAA,MACN,OAAA,EAAS,KAAA,CAAM,CAAC,CAAA,IAAK,EAAA;AAAA,MACrB,aAAA,EAAe,MAAM,CAAC;AAAA,KACvB,CAAA;AAED,IAAA,SAAA,GAAY,KAAA,CAAM,KAAA,GAAQ,KAAA,CAAM,CAAC,CAAA,CAAE,MAAA;AAAA,EACrC;AAGA,EAAA,IAAI,SAAA,GAAY,SAAS,MAAA,EAAQ;AAC/B,IAAA,QAAA,CAAS,IAAA,CAAK;AAAA,MACZ,IAAA,EAAM,MAAA;AAAA,MACN,OAAA,EAAS,QAAA,CAAS,KAAA,CAAM,SAAS;AAAA,KAClC,CAAA;AAAA,EACH;AAEA,EAAA,OAAO,QAAA;AACT","file":"index.js","sourcesContent":["import type { Config, Locale, TranslationWarning, DebugModeOptions } from './types'\n\n/**\n * Default warning handler - logs to console\n */\nfunction defaultWarningHandler(warning: TranslationWarning): void {\n const parts = [`[inline-i18n] Missing translation for locale \"${warning.requestedLocale}\"`]\n\n if (warning.key) {\n parts.push(`key: \"${warning.key}\"`)\n }\n\n parts.push(`Available: [${warning.availableLocales.join(', ')}]`)\n\n if (warning.fallbackUsed) {\n parts.push(`Using fallback: \"${warning.fallbackUsed}\"`)\n }\n\n console.warn(parts.join(' | '))\n}\n\n/**\n * Check if we're in development mode\n */\nfunction isDevMode(): boolean {\n try {\n // Check for Node.js environment\n if (typeof globalThis !== 'undefined' && 'process' in globalThis) {\n const proc = (globalThis as { process?: { env?: { NODE_ENV?: string } } }).process\n return proc?.env?.NODE_ENV !== 'production'\n }\n return false\n } catch {\n return false\n }\n}\n\ntype FullConfig = Required<Omit<Config, 'loader' | 'missingVarHandler' | 'persistLocale'>> & Pick<Config, 'loader' | 'missingVarHandler' | 'persistLocale'>\n\nconst defaultConfig: FullConfig = {\n defaultLocale: 'en',\n fallbackLocale: 'en',\n autoParentLocale: true,\n fallbackChain: {},\n warnOnMissing: isDevMode(),\n onMissingTranslation: defaultWarningHandler,\n debugMode: false,\n loader: undefined,\n icuCacheSize: 500,\n}\n\nlet config: Config = { ...defaultConfig }\n\n/**\n * Configure inline-i18n-multi settings\n *\n * @example\n * configure({\n * fallbackLocale: 'en',\n * fallbackChain: { 'pt-BR': ['pt', 'es', 'en'] },\n * warnOnMissing: true,\n * })\n */\nexport function configure(options: Partial<Config>): void {\n config = { ...config, ...options }\n}\n\n/**\n * Get current configuration\n */\nexport function getConfig(): FullConfig {\n return {\n ...defaultConfig,\n ...config,\n }\n}\n\n/**\n * Reset configuration to defaults\n */\nexport function resetConfig(): void {\n config = { ...defaultConfig }\n}\n\n/**\n * Derive parent locale from BCP 47 tag\n *\n * @example\n * getParentLocale('zh-TW') // => 'zh'\n * getParentLocale('en-US') // => 'en'\n * getParentLocale('en') // => undefined\n */\nexport function getParentLocale(locale: Locale): Locale | undefined {\n const dashIndex = locale.indexOf('-')\n if (dashIndex > 0) {\n return locale.substring(0, dashIndex)\n }\n return undefined\n}\n\n/**\n * Build fallback chain for a locale\n *\n * @example\n * // With autoParentLocale enabled (default)\n * buildFallbackChain('zh-TW') // => ['zh-TW', 'zh', 'en']\n * buildFallbackChain('en-US') // => ['en-US', 'en']\n *\n * // With custom fallback chain\n * configure({ fallbackChain: { 'pt-BR': ['pt', 'es', 'en'] } })\n * buildFallbackChain('pt-BR') // => ['pt-BR', 'pt', 'es', 'en']\n */\nexport function buildFallbackChain(locale: Locale): Locale[] {\n const cfg = getConfig()\n\n // Check for custom chain first\n if (cfg.fallbackChain[locale]) {\n return [locale, ...cfg.fallbackChain[locale]]\n }\n\n const chain: Locale[] = [locale]\n\n // Auto-derive parent locales if enabled\n if (cfg.autoParentLocale) {\n let current = locale\n while (true) {\n const parent = getParentLocale(current)\n if (parent && !chain.includes(parent)) {\n chain.push(parent)\n current = parent\n } else {\n break\n }\n }\n }\n\n // Add final fallback if not already in chain\n const finalFallback = cfg.fallbackLocale\n if (finalFallback && !chain.includes(finalFallback)) {\n chain.push(finalFallback)\n }\n\n return chain\n}\n\n/**\n * Emit a missing translation warning\n */\nexport function emitWarning(warning: TranslationWarning): void {\n const cfg = getConfig()\n if (cfg.warnOnMissing && cfg.onMissingTranslation) {\n cfg.onMissingTranslation(warning)\n }\n}\n\n// ============================================================================\n// Debug Mode (v0.4.0)\n// ============================================================================\n\n/**\n * Debug information for translation output\n */\nexport interface DebugInfo {\n /** True if no translation was found */\n isMissing: boolean\n /** True if a fallback locale was used */\n isFallback: boolean\n /** The locale that was requested */\n requestedLocale: string\n /** The locale that was actually used */\n usedLocale?: string\n /** The translation key (for t() function) */\n key?: string\n}\n\n/**\n * Format translation output with debug information if enabled\n */\nexport function applyDebugFormat(output: string, debugInfo: DebugInfo): string {\n const cfg = getConfig()\n\n if (!cfg.debugMode) {\n return output\n }\n\n const options: DebugModeOptions =\n typeof cfg.debugMode === 'object'\n ? cfg.debugMode\n : { showMissingPrefix: true, showFallbackPrefix: true }\n\n // Handle missing translation\n if (debugInfo.isMissing && options.showMissingPrefix !== false) {\n const prefix = options.missingPrefixFormat\n ? options.missingPrefixFormat(debugInfo.requestedLocale, debugInfo.key)\n : `[MISSING: ${debugInfo.requestedLocale}] `\n return prefix + output\n }\n\n // Handle fallback translation\n if (debugInfo.isFallback && options.showFallbackPrefix !== false && debugInfo.usedLocale) {\n const prefix = options.fallbackPrefixFormat\n ? options.fallbackPrefixFormat(debugInfo.requestedLocale, debugInfo.usedLocale, debugInfo.key)\n : `[${debugInfo.requestedLocale} -> ${debugInfo.usedLocale}] `\n return prefix + output\n }\n\n return output\n}\n","import type { Locale } from './types'\nimport { getConfig } from './config'\n\nlet currentLocale: Locale = 'en'\n\nfunction setCookie(name: string, value: string, days: number): void {\n if (typeof document === 'undefined') return\n const expires = new Date(Date.now() + days * 864e5).toUTCString()\n document.cookie = `${name}=${value}; expires=${expires}; path=/; SameSite=Lax`\n}\n\nfunction getCookie(name: string): string | undefined {\n if (typeof document === 'undefined') return undefined\n const match = document.cookie.match(new RegExp(`(?:^|;\\\\s*)${name}=([^;]*)`))\n return match?.[1]\n}\n\nfunction persistLocaleToStorage(locale: Locale): void {\n const cfg = getConfig()\n if (!cfg.persistLocale) return\n\n const { storage, key = 'LOCALE', expires = 365 } = cfg.persistLocale\n\n if (storage === 'cookie') {\n setCookie(key, locale, expires)\n } else if (storage === 'localStorage') {\n if (typeof localStorage !== 'undefined') {\n try {\n localStorage.setItem(key, locale)\n } catch {\n // localStorage may be full or blocked\n }\n }\n }\n}\n\nexport function setLocale(locale: Locale): void {\n currentLocale = locale\n persistLocaleToStorage(locale)\n}\n\nexport function getLocale(): Locale {\n return currentLocale\n}\n\n/**\n * Restore locale from configured persistent storage.\n * Returns the restored locale, or undefined if nothing was found.\n */\nexport function restoreLocale(): Locale | undefined {\n const cfg = getConfig()\n if (!cfg.persistLocale) return undefined\n\n const { storage, key = 'LOCALE' } = cfg.persistLocale\n let stored: string | undefined\n\n if (storage === 'cookie') {\n stored = getCookie(key)\n } else if (storage === 'localStorage') {\n if (typeof localStorage !== 'undefined') {\n try {\n stored = localStorage.getItem(key) ?? undefined\n } catch {\n // localStorage may be blocked\n }\n }\n }\n\n if (stored) {\n currentLocale = stored\n return stored\n }\n\n return undefined\n}\n","import {\n parse,\n type MessageFormatElement,\n type PluralElement,\n type SelectElement,\n type NumberElement,\n type DateElement,\n type TimeElement,\n isLiteralElement,\n isArgumentElement,\n isPluralElement,\n isSelectElement,\n isPoundElement,\n isNumberElement,\n isDateElement,\n isTimeElement,\n} from '@formatjs/icu-messageformat-parser'\n\nimport { getConfig } from './config'\n\nexport type ICUVars = Record<string, string | number | Date | string[]>\n\n// ============================================================================\n// ICU Parse Cache (v0.7.0)\n// ============================================================================\n\nconst icuCache = new Map<string, MessageFormatElement[]>()\n\n/**\n * Clear the ICU message AST cache\n */\nexport function clearICUCache(): void {\n icuCache.clear()\n}\n\n/**\n * Get a parsed AST from cache, or parse and cache it.\n * Respects the configured icuCacheSize limit (FIFO eviction).\n */\nfunction cachedParse(template: string): MessageFormatElement[] {\n const cached = icuCache.get(template)\n if (cached) return cached\n\n const ast = parse(template)\n\n const cfg = getConfig()\n if (cfg.icuCacheSize > 0) {\n if (icuCache.size >= cfg.icuCacheSize) {\n const firstKey = icuCache.keys().next().value\n if (firstKey !== undefined) {\n icuCache.delete(firstKey)\n }\n }\n icuCache.set(template, ast)\n }\n\n return ast\n}\n\n/**\n * Handle a missing variable — uses custom handler if configured, otherwise returns {varName}\n */\nfunction handleMissingVar(varName: string, locale: string): string {\n const cfg = getConfig()\n if (cfg.missingVarHandler) {\n return cfg.missingVarHandler(varName, locale)\n }\n return `{${varName}}`\n}\n\n// ============================================================================\n// Custom Formatter Registry (v0.6.0)\n// ============================================================================\n\nexport type CustomFormatter = (value: unknown, locale: string, style?: string) => string\n\nconst customFormatters = new Map<string, CustomFormatter>()\n\nconst RESERVED_FORMATTER_NAMES = new Set([\n 'plural', 'select', 'selectordinal',\n 'number', 'date', 'time',\n 'relativeTime', 'list', 'currency',\n])\n\n/**\n * Register a custom formatter\n *\n * @example\n * registerFormatter('phone', (value, locale, style?) => {\n * const s = String(value)\n * return `(${s.slice(0,3)}) ${s.slice(3,6)}-${s.slice(6)}`\n * })\n */\nexport function registerFormatter(name: string, formatter: CustomFormatter): void {\n if (RESERVED_FORMATTER_NAMES.has(name)) {\n throw new Error(`Cannot register formatter \"${name}\": reserved ICU type name`)\n }\n customFormatters.set(name, formatter)\n}\n\n/**\n * Clear all custom formatters\n */\nexport function clearFormatters(): void {\n customFormatters.clear()\n}\n\ninterface CustomFormatterReplacement {\n variable: string\n formatterName: string\n style?: string\n}\n\n/**\n * Build a regex that matches custom formatter patterns\n */\nfunction buildCustomFormatterPattern(): RegExp | null {\n if (customFormatters.size === 0) return null\n const names = [...customFormatters.keys()].map(n => n.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&')).join('|')\n return new RegExp(`\\\\{(\\\\w+),\\\\s*(${names})(?:,\\\\s*(\\\\w+))?\\\\}`, 'g')\n}\n\n/**\n * Preprocess custom formatter patterns before ICU parsing\n */\nfunction preprocessCustomFormatters(template: string): {\n processed: string\n replacements: Map<string, CustomFormatterReplacement>\n} {\n const replacements = new Map<string, CustomFormatterReplacement>()\n const pattern = buildCustomFormatterPattern()\n if (!pattern) return { processed: template, replacements }\n\n let counter = 0\n const processed = template.replace(pattern, (_, variable, formatterName, style) => {\n const placeholder = `__CUSTOM_${counter++}__`\n replacements.set(placeholder, { variable, formatterName, style })\n return `{${placeholder}}`\n })\n return { processed, replacements }\n}\n\n/**\n * Check if template contains custom formatter patterns\n */\nexport function hasCustomFormatter(template: string): boolean {\n const pattern = buildCustomFormatterPattern()\n if (!pattern) return false\n return pattern.test(template)\n}\n\n/**\n * Map ICU date style names to Intl.DateTimeFormat options\n */\nconst DATE_STYLES: Record<string, Intl.DateTimeFormatOptions> = {\n short: { dateStyle: 'short' },\n medium: { dateStyle: 'medium' },\n long: { dateStyle: 'long' },\n full: { dateStyle: 'full' },\n}\n\n/**\n * Map ICU time style names to Intl.DateTimeFormat options\n */\nconst TIME_STYLES: Record<string, Intl.DateTimeFormatOptions> = {\n short: { timeStyle: 'short' },\n medium: { timeStyle: 'medium' },\n long: { timeStyle: 'long' },\n full: { timeStyle: 'full' },\n}\n\n/**\n * Map ICU number style names to Intl.NumberFormat options\n */\nconst NUMBER_STYLES: Record<string, Intl.NumberFormatOptions> = {\n decimal: { style: 'decimal' },\n percent: { style: 'percent' },\n integer: { style: 'decimal', maximumFractionDigits: 0 },\n}\n\n/**\n * Map ICU relative time style names to Intl.RelativeTimeFormat options\n */\nconst RELATIVE_TIME_STYLES: Record<string, Intl.RelativeTimeFormatOptions> = {\n long: { style: 'long', numeric: 'auto' },\n short: { style: 'short', numeric: 'auto' },\n narrow: { style: 'narrow', numeric: 'auto' },\n}\n\n/**\n * Map ICU list type/style names to Intl.ListFormat options\n */\nconst LIST_TYPES: Record<string, Intl.ListFormatType> = {\n conjunction: 'conjunction',\n disjunction: 'disjunction',\n unit: 'unit',\n}\n\nconst LIST_STYLES: Record<string, Intl.ListFormatStyle> = {\n long: 'long',\n short: 'short',\n narrow: 'narrow',\n}\n\n/**\n * Convert value to Date\n */\nfunction toDate(value: string | number | Date): Date {\n if (value instanceof Date) {\n return value\n }\n return new Date(value)\n}\n\n/**\n * Format a number element\n */\nfunction formatNumberElement(\n el: NumberElement,\n vars: ICUVars,\n locale: string\n): string {\n const value = vars[el.value]\n if (value === undefined) {\n return handleMissingVar(el.value, locale)\n }\n\n const num = typeof value === 'number' ? value : Number(value)\n if (isNaN(num)) {\n return handleMissingVar(el.value, locale)\n }\n\n let options: Intl.NumberFormatOptions = {}\n\n if (el.style) {\n if (typeof el.style === 'string') {\n // Check for currency format: \"currency\" or specific currency like \"USD\"\n if (el.style === 'currency') {\n options = { style: 'currency', currency: 'USD' }\n } else if (NUMBER_STYLES[el.style]) {\n options = NUMBER_STYLES[el.style]!\n }\n } else if ('parsedOptions' in el.style) {\n // NumberSkeleton with parsed options\n options = el.style.parsedOptions as Intl.NumberFormatOptions\n }\n }\n\n try {\n return new Intl.NumberFormat(locale, options).format(num)\n } catch {\n return String(num)\n }\n}\n\n/**\n * Format a date element\n */\nfunction formatDateElement(\n el: DateElement,\n vars: ICUVars,\n locale: string\n): string {\n const value = vars[el.value]\n if (value === undefined) {\n return handleMissingVar(el.value, locale)\n }\n\n let options: Intl.DateTimeFormatOptions = {}\n\n if (el.style) {\n if (typeof el.style === 'string') {\n options = DATE_STYLES[el.style] || {}\n } else if ('parsedOptions' in el.style) {\n // DateTimeSkeleton with parsed options\n options = el.style.parsedOptions as Intl.DateTimeFormatOptions\n }\n }\n\n try {\n const date = toDate(value as string | number | Date)\n return new Intl.DateTimeFormat(locale, options).format(date)\n } catch {\n return handleMissingVar(el.value, locale)\n }\n}\n\n/**\n * Format a time element\n */\nfunction formatTimeElement(\n el: TimeElement,\n vars: ICUVars,\n locale: string\n): string {\n const value = vars[el.value]\n if (value === undefined) {\n return handleMissingVar(el.value, locale)\n }\n\n let options: Intl.DateTimeFormatOptions = {}\n\n if (el.style) {\n if (typeof el.style === 'string') {\n options = TIME_STYLES[el.style] || {}\n } else if ('parsedOptions' in el.style) {\n // DateTimeSkeleton with parsed options\n options = el.style.parsedOptions as Intl.DateTimeFormatOptions\n }\n }\n\n try {\n const date = toDate(value as string | number | Date)\n return new Intl.DateTimeFormat(locale, options).format(date)\n } catch {\n return handleMissingVar(el.value, locale)\n }\n}\n\n// ============================================================================\n// Currency Formatting (v0.5.0)\n// ============================================================================\n\ninterface CurrencyReplacement {\n variable: string\n currencyCode: string\n}\n\nconst CURRENCY_PATTERN = /\\{(\\w+),\\s*currency(?:,\\s*(\\w+))?\\}/g\n\n/**\n * Preprocess currency formats before ICU parsing\n */\nfunction preprocessCurrency(template: string): {\n processed: string\n replacements: Map<string, CurrencyReplacement>\n} {\n const replacements = new Map<string, CurrencyReplacement>()\n let counter = 0\n const processed = template.replace(CURRENCY_PATTERN, (_, variable, currencyCode) => {\n const placeholder = `__CURRENCY_${counter++}__`\n replacements.set(placeholder, { variable, currencyCode: currencyCode || 'USD' })\n return `{${placeholder}}`\n })\n return { processed, replacements }\n}\n\n/**\n * Format a currency value\n */\nfunction formatCurrencyValue(\n variableName: string,\n currencyCode: string,\n vars: ICUVars,\n locale: string\n): string {\n const value = vars[variableName]\n if (value === undefined) {\n return handleMissingVar(variableName, locale)\n }\n\n const num = typeof value === 'number' ? value : Number(value)\n if (isNaN(num)) {\n return handleMissingVar(variableName, locale)\n }\n\n try {\n return new Intl.NumberFormat(locale, {\n style: 'currency',\n currency: currencyCode,\n }).format(num)\n } catch {\n return String(num)\n }\n}\n\n// ============================================================================\n// Compact Number Formatting (v0.5.0)\n// ============================================================================\n\ninterface CompactNumberReplacement {\n variable: string\n display: 'short' | 'long'\n}\n\nconst COMPACT_NUMBER_PATTERN = /\\{(\\w+),\\s*number,\\s*(compact|compactLong)\\}/g\n\n/**\n * Preprocess compact number formats before ICU parsing\n */\nfunction preprocessCompactNumber(template: string): {\n processed: string\n replacements: Map<string, CompactNumberReplacement>\n} {\n const replacements = new Map<string, CompactNumberReplacement>()\n let counter = 0\n const processed = template.replace(COMPACT_NUMBER_PATTERN, (_, variable, style) => {\n const placeholder = `__COMPACT_${counter++}__`\n replacements.set(placeholder, {\n variable,\n display: style === 'compactLong' ? 'long' : 'short',\n })\n return `{${placeholder}}`\n })\n return { processed, replacements }\n}\n\n/**\n * Format a compact number value\n */\nfunction formatCompactNumber(\n variableName: string,\n display: 'short' | 'long',\n vars: ICUVars,\n locale: string\n): string {\n const value = vars[variableName]\n if (value === undefined) {\n return handleMissingVar(variableName, locale)\n }\n\n const num = typeof value === 'number' ? value : Number(value)\n if (isNaN(num)) {\n return handleMissingVar(variableName, locale)\n }\n\n try {\n return new Intl.NumberFormat(locale, {\n notation: 'compact',\n compactDisplay: display,\n }).format(num)\n } catch {\n return String(num)\n }\n}\n\n// ============================================================================\n// Relative Time Formatting (v0.4.0)\n// ============================================================================\n\ninterface RelativeTimeUnit {\n value: number\n unit: Intl.RelativeTimeFormatUnit\n}\n\n/**\n * Calculate the best unit for relative time display\n */\nfunction getRelativeTimeUnit(date: Date, now: Date = new Date()): RelativeTimeUnit {\n const diffMs = date.getTime() - now.getTime()\n const diffSeconds = Math.round(diffMs / 1000)\n const diffMinutes = Math.round(diffSeconds / 60)\n const diffHours = Math.round(diffMinutes / 60)\n const diffDays = Math.round(diffHours / 24)\n const diffWeeks = Math.round(diffDays / 7)\n const diffMonths = Math.round(diffDays / 30)\n const diffYears = Math.round(diffDays / 365)\n\n if (Math.abs(diffSeconds) < 60) return { value: diffSeconds, unit: 'second' }\n if (Math.abs(diffMinutes) < 60) return { value: diffMinutes, unit: 'minute' }\n if (Math.abs(diffHours) < 24) return { value: diffHours, unit: 'hour' }\n if (Math.abs(diffDays) < 7) return { value: diffDays, unit: 'day' }\n if (Math.abs(diffWeeks) < 4) return { value: diffWeeks, unit: 'week' }\n if (Math.abs(diffMonths) < 12) return { value: diffMonths, unit: 'month' }\n return { value: diffYears, unit: 'year' }\n}\n\ninterface RelativeTimeReplacement {\n variable: string\n style?: string\n}\n\nconst RELATIVE_TIME_PATTERN = /\\{(\\w+),\\s*relativeTime(?:,\\s*(\\w+))?\\}/g\n\n/**\n * Preprocess relative time formats before ICU parsing\n */\nfunction preprocessRelativeTime(template: string): {\n processed: string\n replacements: Map<string, RelativeTimeReplacement>\n} {\n const replacements = new Map<string, RelativeTimeReplacement>()\n let counter = 0\n const processed = template.replace(RELATIVE_TIME_PATTERN, (_, variable, style) => {\n const placeholder = `__RELTIME_${counter++}__`\n replacements.set(placeholder, { variable, style })\n return `{${placeholder}}`\n })\n return { processed, replacements }\n}\n\n/**\n * Format a relative time value\n */\nfunction formatRelativeTimeValue(\n variableName: string,\n style: string | undefined,\n vars: ICUVars,\n locale: string\n): string {\n const value = vars[variableName]\n if (value === undefined) {\n return handleMissingVar(variableName, locale)\n }\n\n try {\n const date = toDate(value as string | number | Date)\n const { value: relValue, unit } = getRelativeTimeUnit(date)\n const options = (style && RELATIVE_TIME_STYLES[style]) || RELATIVE_TIME_STYLES.long\n return new Intl.RelativeTimeFormat(locale, options).format(relValue, unit)\n } catch {\n return handleMissingVar(variableName, locale)\n }\n}\n\n// ============================================================================\n// List Formatting (v0.4.0)\n// ============================================================================\n\ninterface ListReplacement {\n variable: string\n type?: string\n style?: string\n}\n\nconst LIST_PATTERN = /\\{(\\w+),\\s*list(?:,\\s*(\\w+))?(?:,\\s*(\\w+))?\\}/g\n\n/**\n * Preprocess list formats before ICU parsing\n */\nfunction preprocessList(template: string): {\n processed: string\n replacements: Map<string, ListReplacement>\n} {\n const replacements = new Map<string, ListReplacement>()\n let counter = 0\n const processed = template.replace(LIST_PATTERN, (_, variable, arg1, arg2) => {\n const placeholder = `__LIST_${counter++}__`\n let type: string | undefined\n let style: string | undefined\n\n if (arg1) {\n if (LIST_TYPES[arg1]) {\n type = arg1\n style = arg2\n } else if (LIST_STYLES[arg1]) {\n style = arg1\n }\n }\n\n replacements.set(placeholder, { variable, type, style })\n return `{${placeholder}}`\n })\n return { processed, replacements }\n}\n\n/**\n * Format a list value\n */\nfunction formatListValue(\n variableName: string,\n type: string | undefined,\n style: string | undefined,\n vars: ICUVars,\n locale: string\n): string {\n const value = vars[variableName]\n if (value === undefined || !Array.isArray(value)) {\n return handleMissingVar(variableName, locale)\n }\n\n const options: Intl.ListFormatOptions = {\n type: (type as Intl.ListFormatType) || 'conjunction',\n style: (style as Intl.ListFormatStyle) || 'long',\n }\n\n try {\n return new Intl.ListFormat(locale, options).format(value)\n } catch {\n return value.join(', ')\n }\n}\n\n// ============================================================================\n// Plural Shorthand (v0.7.0)\n// ============================================================================\n\nconst PLURAL_SHORTHAND_PATTERN = /\\{(\\w+),\\s*p,\\s*([^}]+)\\}/g\n\n/**\n * Check if template contains plural shorthand patterns\n */\nexport function hasPluralShorthand(template: string): boolean {\n PLURAL_SHORTHAND_PATTERN.lastIndex = 0\n return PLURAL_SHORTHAND_PATTERN.test(template)\n}\n\n/**\n * Preprocess plural shorthand syntax before ICU parsing.\n *\n * {count, p, item|items} -> {count, plural, one {# item} other {# items}}\n * {count, p, none|item|items} -> {count, plural, =0 {none} one {# item} other {# items}}\n */\nfunction preprocessPluralShorthand(template: string): string {\n PLURAL_SHORTHAND_PATTERN.lastIndex = 0\n return template.replace(PLURAL_SHORTHAND_PATTERN, (_, variable, args) => {\n const parts = args.split('|').map((s: string) => s.trim())\n\n if (parts.length === 2) {\n const [singular, plural] = parts\n return `{${variable}, plural, one {# ${singular}} other {# ${plural}}}`\n }\n\n if (parts.length === 3) {\n const [zero, singular, plural] = parts\n return `{${variable}, plural, =0 {${zero}} one {# ${singular}} other {# ${plural}}}`\n }\n\n // If not 2 or 3 parts, return original\n return `{${variable}, p, ${args}}`\n })\n}\n\n/**\n * Parse and format an ICU Message Format string\n */\nexport function interpolateICU(\n template: string,\n vars: ICUVars,\n locale: string\n): string {\n // Expand plural shorthand to standard ICU plural (must be first)\n const afterPluralShorthand = preprocessPluralShorthand(template)\n\n // Pre-process custom formats (not natively supported by ICU parser)\n const { processed: afterCustom, replacements: customReplacements } = preprocessCustomFormatters(afterPluralShorthand)\n const { processed: afterCurrency, replacements: currencyReplacements } = preprocessCurrency(afterCustom)\n const { processed: afterCompact, replacements: compactReplacements } = preprocessCompactNumber(afterCurrency)\n const { processed: afterRelTime, replacements: relTimeReplacements } = preprocessRelativeTime(afterCompact)\n const { processed: afterList, replacements: listReplacements } = preprocessList(afterRelTime)\n\n const ast = cachedParse(afterList)\n let result = formatElements(ast, vars, locale, null)\n\n // Post-process custom formatter placeholders\n for (const [placeholder, { variable, formatterName, style }] of customReplacements) {\n const value = vars[variable]\n let formatted: string\n if (value === undefined) {\n formatted = handleMissingVar(variable, locale)\n } else {\n const formatter = customFormatters.get(formatterName)\n formatted = formatter ? formatter(value, locale, style) : String(value)\n }\n result = result.replace(`{${placeholder}}`, formatted)\n }\n\n // Post-process currency placeholders\n for (const [placeholder, { variable, currencyCode }] of currencyReplacements) {\n const formatted = formatCurrencyValue(variable, currencyCode, vars, locale)\n result = result.replace(`{${placeholder}}`, formatted)\n }\n\n // Post-process compact number placeholders\n for (const [placeholder, { variable, display }] of compactReplacements) {\n const formatted = formatCompactNumber(variable, display, vars, locale)\n result = result.replace(`{${placeholder}}`, formatted)\n }\n\n // Post-process relativeTime placeholders\n for (const [placeholder, { variable, style }] of relTimeReplacements) {\n const formatted = formatRelativeTimeValue(variable, style, vars, locale)\n result = result.replace(`{${placeholder}}`, formatted)\n }\n\n // Post-process list placeholders\n for (const [placeholder, { variable, type, style }] of listReplacements) {\n const formatted = formatListValue(variable, type, style, vars, locale)\n result = result.replace(`{${placeholder}}`, formatted)\n }\n\n return result\n}\n\nfunction formatElements(\n elements: MessageFormatElement[],\n vars: ICUVars,\n locale: string,\n currentPluralValue: number | null\n): string {\n return elements\n .map((el) => formatElement(el, vars, locale, currentPluralValue))\n .join('')\n}\n\nfunction formatElement(\n el: MessageFormatElement,\n vars: ICUVars,\n locale: string,\n currentPluralValue: number | null\n): string {\n if (isLiteralElement(el)) {\n return el.value\n }\n\n if (isArgumentElement(el)) {\n const value = vars[el.value]\n if (value !== undefined) return String(value)\n // Preprocessor placeholders (__CURRENCY_0__, __COMPACT_0__, etc.) must keep\n // their {placeholder} format so postprocessing can find and replace them\n if (el.value.startsWith('__') && el.value.endsWith('__')) {\n return `{${el.value}}`\n }\n return handleMissingVar(el.value, locale)\n }\n\n if (isPoundElement(el)) {\n // # is replaced with the current plural value\n return currentPluralValue !== null ? String(currentPluralValue) : '#'\n }\n\n if (isPluralElement(el)) {\n return formatPlural(el, vars, locale)\n }\n\n if (isSelectElement(el)) {\n return formatSelect(el, vars, locale)\n }\n\n if (isNumberElement(el)) {\n return formatNumberElement(el, vars, locale)\n }\n\n if (isDateElement(el)) {\n return formatDateElement(el, vars, locale)\n }\n\n if (isTimeElement(el)) {\n return formatTimeElement(el, vars, locale)\n }\n\n // Tag elements - not supported yet\n return ''\n}\n\nfunction formatPlural(\n el: PluralElement,\n vars: ICUVars,\n locale: string\n): string {\n const value = vars[el.value]\n if (typeof value !== 'number') {\n return handleMissingVar(el.value, locale)\n }\n\n const adjustedValue = value - el.offset\n const pluralRules = new Intl.PluralRules(locale, { type: el.pluralType })\n const category = pluralRules.select(adjustedValue)\n\n // Try exact match first (=0, =1, =2, etc.)\n const exactKey = `=${value}`\n if (el.options[exactKey]) {\n return formatElements(el.options[exactKey].value, vars, locale, adjustedValue)\n }\n\n // Then try plural category (zero, one, two, few, many, other)\n if (el.options[category]) {\n return formatElements(el.options[category].value, vars, locale, adjustedValue)\n }\n\n // Fallback to 'other'\n if (el.options.other) {\n return formatElements(el.options.other.value, vars, locale, adjustedValue)\n }\n\n return handleMissingVar(el.value, locale)\n}\n\nfunction formatSelect(\n el: SelectElement,\n vars: ICUVars,\n locale: string\n): string {\n const value = vars[el.value]\n const key = String(value)\n\n // Try exact match\n if (el.options[key]) {\n return formatElements(el.options[key].value, vars, locale, null)\n }\n\n // Fallback to 'other'\n if (el.options.other) {\n return formatElements(el.options.other.value, vars, locale, null)\n }\n\n return handleMissingVar(el.value, locale)\n}\n\n// Pattern to detect ICU format (plural, select, selectordinal, number, date, time, relativeTime, list)\nexport const ICU_PATTERN = /\\{[^}]+,\\s*(plural|select|selectordinal|number|date|time|relativeTime|list|currency|p)\\s*[,}]/\n\n/**\n * Check if a template contains ICU Message Format patterns\n */\nexport function hasICUPattern(template: string): boolean {\n return ICU_PATTERN.test(template)\n}\n","import type { TranslationVars } from './types'\nimport { getConfig } from './config'\nimport { hasICUPattern, hasCustomFormatter, hasPluralShorthand, interpolateICU } from './icu'\n\nconst VARIABLE_PATTERN = /\\{(\\w+)\\}/g\n\nexport function interpolate(\n template: string,\n vars?: TranslationVars,\n locale?: string,\n): string {\n const resolvedLocale = locale || 'en'\n\n // ICU Message Format (plural, select) or custom formatters\n if (hasICUPattern(template) || hasCustomFormatter(template) || hasPluralShorthand(template)) {\n if (!vars) {\n // Even without vars, handler should process missing variables\n const cfg = getConfig()\n if (cfg.missingVarHandler) {\n return interpolateICU(template, {}, resolvedLocale)\n }\n return template\n }\n return interpolateICU(template, vars, resolvedLocale)\n }\n\n // Simple variable substitution\n if (!vars) {\n const cfg = getConfig()\n if (cfg.missingVarHandler) {\n return template.replace(VARIABLE_PATTERN, (_, key) => {\n return cfg.missingVarHandler!(key, resolvedLocale)\n })\n }\n return template\n }\n\n return template.replace(VARIABLE_PATTERN, (_, key) => {\n const value = vars[key]\n if (value !== undefined) return String(value)\n const cfg = getConfig()\n if (cfg.missingVarHandler) {\n return cfg.missingVarHandler(key, resolvedLocale)\n }\n return `{${key}}`\n })\n}\n","import type { Translations, TranslationVars } from './types'\nimport { getLocale } from './context'\nimport { interpolate } from './interpolation'\nimport { buildFallbackChain, emitWarning, applyDebugFormat, type DebugInfo } from './config'\n\ninterface ResolveResult {\n template: string\n locale: string\n debugInfo: DebugInfo\n}\n\nfunction resolveTemplate(translations: Translations): ResolveResult {\n const locale = getLocale()\n const availableLocales = Object.keys(translations)\n const fallbackChain = buildFallbackChain(locale)\n\n // Try each locale in the fallback chain\n for (const tryLocale of fallbackChain) {\n const template = translations[tryLocale]\n if (template) {\n const isFallback = tryLocale !== locale\n // Warn if we had to fall back\n if (isFallback) {\n emitWarning({\n type: 'missing_translation',\n requestedLocale: locale,\n availableLocales,\n fallbackUsed: tryLocale,\n })\n }\n return {\n template,\n locale: tryLocale,\n debugInfo: {\n isMissing: false,\n isFallback,\n requestedLocale: locale,\n usedLocale: tryLocale,\n },\n }\n }\n }\n\n // Last resort: use first available translation\n const firstAvailable = Object.entries(translations)[0]\n if (firstAvailable) {\n emitWarning({\n type: 'missing_translation',\n requestedLocale: locale,\n availableLocales,\n fallbackUsed: firstAvailable[0],\n })\n return {\n template: firstAvailable[1],\n locale: firstAvailable[0],\n debugInfo: {\n isMissing: false,\n isFallback: true,\n requestedLocale: locale,\n usedLocale: firstAvailable[0],\n },\n }\n }\n\n throw new Error(\n `No translation found for locale \"${locale}\". Available: ${availableLocales.join(', ')}`\n )\n}\n\n/**\n * Translate with two languages (shorthand)\n * @param ko - Korean text\n * @param en - English text\n * @param vars - Variables for interpolation\n */\nexport function it(ko: string, en: string, vars?: TranslationVars): string\n\n/**\n * Translate with multiple languages (object syntax)\n * @param translations - Translation map with locale keys\n * @param vars - Variables for interpolation\n */\nexport function it(translations: Translations, vars?: TranslationVars): string\n\nexport function it(\n first: string | Translations,\n second?: string | TranslationVars,\n third?: TranslationVars,\n): string {\n // object syntax: it({ ko: '...', en: '...' }, vars?)\n if (typeof first === 'object') {\n const translations = first\n const vars = second as TranslationVars | undefined\n const { template, locale, debugInfo } = resolveTemplate(translations)\n const result = interpolate(template, vars, locale)\n return applyDebugFormat(result, debugInfo)\n }\n\n // shorthand syntax: it('한글', 'English', vars?)\n const ko = first\n const en = second as string\n const vars = third\n\n const translations: Translations = { ko, en }\n const { template, locale, debugInfo } = resolveTemplate(translations)\n const result = interpolate(template, vars, locale)\n return applyDebugFormat(result, debugInfo)\n}\n","import type { Translations, TranslationVars } from './types'\nimport { getLocale } from './context'\nimport { interpolate } from './interpolation'\nimport { buildFallbackChain, emitWarning } from './config'\n\n/**\n * Runtime lookup function for build-tool-transformed code.\n *\n * @deprecated Will be removed in v1.0.0\n * @param _hash - Content hash (for caching/debugging, unused at runtime)\n * @param translations - Translation map with locale keys\n * @param vars - Variables for interpolation\n */\nexport function __i18n_lookup(\n _hash: string,\n translations: Translations,\n vars?: TranslationVars\n): string {\n const locale = getLocale()\n const availableLocales = Object.keys(translations)\n const fallbackChain = buildFallbackChain(locale)\n\n // Try each locale in the fallback chain\n for (const tryLocale of fallbackChain) {\n const template = translations[tryLocale]\n if (template) {\n // Warn if we had to fall back\n if (tryLocale !== locale) {\n emitWarning({\n type: 'missing_translation',\n requestedLocale: locale,\n availableLocales,\n fallbackUsed: tryLocale,\n })\n }\n return interpolate(template, vars, tryLocale)\n }\n }\n\n // Last resort: use first available translation\n const firstAvailable = Object.entries(translations)[0]\n if (firstAvailable) {\n emitWarning({\n type: 'missing_translation',\n requestedLocale: locale,\n availableLocales,\n fallbackUsed: firstAvailable[0],\n })\n return interpolate(firstAvailable[1], vars, firstAvailable[0])\n }\n\n throw new Error(\n `No translation found for locale \"${locale}\". Available: ${availableLocales.join(', ')}`\n )\n}\n\n// @deprecated - Will be removed in v1.0.0\n// Register __i18n_lookup globally for backward compatibility\nif (typeof globalThis !== 'undefined') {\n (globalThis as Record<string, unknown>).__i18n_lookup = __i18n_lookup\n}\n","import type { Locale, Translations, TranslationVars } from './types'\nimport { it } from './translate'\n\ntype PairFunction = (\n text1: string,\n text2: string,\n vars?: TranslationVars,\n) => string\n\nfunction createPair(lang1: Locale, lang2: Locale): PairFunction {\n return (text1, text2, vars) => {\n const translations: Translations = {\n [lang1]: text1,\n [lang2]: text2,\n }\n return it(translations, vars)\n }\n}\n\n// Korean combinations\nexport const it_ja = createPair('ko', 'ja')\nexport const it_zh = createPair('ko', 'zh')\nexport const it_es = createPair('ko', 'es')\nexport const it_fr = createPair('ko', 'fr')\nexport const it_de = createPair('ko', 'de')\n\n// English combinations\nexport const en_ja = createPair('en', 'ja')\nexport const en_zh = createPair('en', 'zh')\nexport const en_es = createPair('en', 'es')\nexport const en_fr = createPair('en', 'fr')\nexport const en_de = createPair('en', 'de')\n\n// Other combinations\nexport const ja_zh = createPair('ja', 'zh')\nexport const ja_es = createPair('ja', 'es')\nexport const zh_es = createPair('zh', 'es')\n","import { getLocale } from './context'\nimport type { Locale, TranslationVars } from './types'\nimport { interpolate } from './interpolation'\nimport { buildFallbackChain, emitWarning, applyDebugFormat, getConfig, type DebugInfo } from './config'\n\n/**\n * Nested dictionary structure for translations\n * @example { greeting: { hello: \"Hello\", goodbye: \"Goodbye\" } }\n */\nexport type Dictionary = {\n [key: string]: string | Dictionary\n}\n\n/**\n * All loaded dictionaries by locale\n */\nexport type Dictionaries = Record<Locale, Dictionary>\n\n/**\n * Namespaced dictionaries storage\n * Structure: { namespace: { locale: Dictionary } }\n */\ntype NamespacedDictionaries = Record<string, Dictionaries>\n\n/**\n * Plural rules configuration\n */\nexport interface PluralRules {\n zero?: string\n one?: string\n two?: string\n few?: string\n many?: string\n other: string\n}\n\n// Default namespace for backward compatibility\nconst DEFAULT_NAMESPACE = 'default'\n\n// Namespace separator in keys\nconst NAMESPACE_SEPARATOR = ':'\n\n// Global dictionary storage - now namespaced\nlet namespacedDictionaries: NamespacedDictionaries = {}\n\n// Lazy loading state tracking (v0.5.0)\nlet loadingState: Record<string, 'loading' | 'loaded' | 'error'> = {}\nconst loadingPromises = new Map<string, Promise<void>>()\n\nfunction getLoadingKey(locale: Locale, namespace: string): string {\n return `${namespace}:${locale}`\n}\n\n/**\n * Parse a key that may contain a namespace prefix\n * @example\n * parseKey('common:greeting') // { namespace: 'common', key: 'greeting' }\n * parseKey('greeting') // { namespace: 'default', key: 'greeting' }\n */\nfunction parseKey(fullKey: string): { namespace: string; key: string } {\n const separatorIndex = fullKey.indexOf(NAMESPACE_SEPARATOR)\n if (separatorIndex > 0) {\n return {\n namespace: fullKey.substring(0, separatorIndex),\n key: fullKey.substring(separatorIndex + 1),\n }\n }\n return {\n namespace: DEFAULT_NAMESPACE,\n key: fullKey,\n }\n}\n\n/**\n * Load translations from dictionary objects\n * @param dicts - Dictionary objects keyed by locale\n * @param namespace - Optional namespace (defaults to 'default')\n * @example\n * // Without namespace (backward compatible)\n * loadDictionaries({\n * en: { greeting: { hello: \"Hello\" } },\n * ko: { greeting: { hello: \"안녕하세요\" } }\n * })\n *\n * // With namespace\n * loadDictionaries({\n * en: { hello: \"Hello\" },\n * ko: { hello: \"안녕하세요\" }\n * }, 'common')\n */\nexport function loadDictionaries(dicts: Dictionaries, namespace?: string): void {\n const ns = namespace || DEFAULT_NAMESPACE\n if (!namespacedDictionaries[ns]) {\n namespacedDictionaries[ns] = {}\n }\n namespacedDictionaries[ns] = {\n ...namespacedDictionaries[ns],\n ...dicts,\n }\n}\n\n/**\n * Load a single locale's dictionary\n * @param locale - Locale code\n * @param dict - Dictionary object\n * @param namespace - Optional namespace (defaults to 'default')\n */\nexport function loadDictionary(locale: Locale, dict: Dictionary, namespace?: string): void {\n const ns = namespace || DEFAULT_NAMESPACE\n if (!namespacedDictionaries[ns]) {\n namespacedDictionaries[ns] = {}\n }\n namespacedDictionaries[ns][locale] = {\n ...namespacedDictionaries[ns][locale],\n ...dict,\n }\n}\n\n/**\n * Clear loaded dictionaries\n * @param namespace - Optional namespace to clear (clears all if not specified)\n */\nexport function clearDictionaries(namespace?: string): void {\n if (namespace) {\n delete namespacedDictionaries[namespace]\n // Clear loading state for this namespace\n for (const key of Object.keys(loadingState)) {\n if (key.startsWith(`${namespace}:`)) {\n delete loadingState[key]\n loadingPromises.delete(key)\n }\n }\n } else {\n namespacedDictionaries = {}\n loadingState = {}\n loadingPromises.clear()\n }\n}\n\n/**\n * Asynchronously load a dictionary using the configured loader\n * @param locale - Locale to load\n * @param namespace - Optional namespace (defaults to 'default')\n * @throws Error if no loader is configured\n *\n * @example\n * configure({ loader: (locale, ns) => import(`./locales/${locale}/${ns}.json`) })\n * await loadAsync('ko', 'dashboard')\n * t('dashboard:title')\n */\nexport async function loadAsync(locale: Locale, namespace?: string): Promise<void> {\n const ns = namespace || DEFAULT_NAMESPACE\n const cfg = getConfig()\n\n if (!cfg.loader) {\n throw new Error('No loader configured. Call configure({ loader: ... }) first.')\n }\n\n const key = getLoadingKey(locale, ns)\n\n // Skip if already loaded\n if (loadingState[key] === 'loaded') return\n\n // Deduplicate concurrent calls\n if (loadingPromises.has(key)) {\n return loadingPromises.get(key)!\n }\n\n const promise = (async () => {\n loadingState[key] = 'loading'\n try {\n const dict = await cfg.loader!(locale, ns)\n loadDictionary(locale, dict as Dictionary, ns)\n loadingState[key] = 'loaded'\n } catch (error) {\n loadingState[key] = 'error'\n throw error\n } finally {\n loadingPromises.delete(key)\n }\n })()\n\n loadingPromises.set(key, promise)\n return promise\n}\n\n/**\n * Check if a dictionary has been loaded for a locale/namespace\n * @param locale - Locale to check\n * @param namespace - Optional namespace (defaults to 'default')\n */\nexport function isLoaded(locale: Locale, namespace?: string): boolean {\n const ns = namespace || DEFAULT_NAMESPACE\n const key = getLoadingKey(locale, ns)\n return loadingState[key] === 'loaded'\n}\n\n/**\n * Get a nested value from dictionary using dot notation\n * @param dict - Dictionary object\n * @param key - Dot-separated key path\n */\nfunction getNestedValue(dict: Dictionary, key: string): string | undefined {\n const parts = key.split('.')\n let current: string | Dictionary | undefined = dict\n\n for (const part of parts) {\n if (typeof current !== 'object' || current === null) {\n return undefined\n }\n current = current[part]\n if (current === undefined) {\n return undefined\n }\n }\n\n return typeof current === 'string' ? current : undefined\n}\n\n/**\n * Get plural category using Intl.PluralRules\n */\nfunction getPluralCategory(count: number, locale: Locale): Intl.LDMLPluralRule {\n const rules = new Intl.PluralRules(locale)\n return rules.select(count)\n}\n\n/**\n * Try to find a translation in a dictionary, handling plurals\n */\nfunction findInDictionary(\n dict: Dictionary,\n key: string,\n vars: TranslationVars | undefined,\n locale: Locale\n): string | undefined {\n let template = getNestedValue(dict, key)\n\n // Handle plurals if count is provided\n if (vars && typeof vars.count === 'number') {\n const pluralKey = `${key}_${getPluralCategory(vars.count, locale)}`\n const pluralTemplate = getNestedValue(dict, pluralKey)\n if (pluralTemplate) {\n template = pluralTemplate\n }\n }\n\n return template\n}\n\n/**\n * Translate using key-based lookup (i18n compatible)\n * @param key - Dot-separated translation key, optionally prefixed with namespace\n * @param vars - Variables for interpolation (including 'count' for plurals)\n * @param locale - Override locale (optional)\n * @example\n * t('greeting.hello') // Uses default namespace\n * t('common:greeting.hello') // Uses 'common' namespace\n * t('items.count', { count: 5 }) // \"5 items\"\n */\nexport function t(\n key: string,\n vars?: TranslationVars,\n locale?: Locale\n): string {\n const { namespace, key: actualKey } = parseKey(key)\n const currentLocale = locale ?? getLocale()\n const fallbackChain = buildFallbackChain(currentLocale)\n\n const nsDictionaries = namespacedDictionaries[namespace] || {}\n const availableLocales = Object.keys(nsDictionaries)\n\n let template: string | undefined\n let usedLocale: Locale | undefined\n\n // Try each locale in the fallback chain\n for (const tryLocale of fallbackChain) {\n const dict = nsDictionaries[tryLocale]\n if (!dict) continue\n\n const found = findInDictionary(dict, actualKey, vars, tryLocale)\n if (found) {\n template = found\n usedLocale = tryLocale\n break\n }\n }\n\n if (!template) {\n emitWarning({\n type: 'missing_translation',\n key,\n requestedLocale: currentLocale,\n availableLocales,\n })\n\n const debugInfo: DebugInfo = {\n isMissing: true,\n isFallback: false,\n requestedLocale: currentLocale,\n key,\n }\n return applyDebugFormat(key, debugInfo)\n }\n\n const isFallback = usedLocale !== currentLocale\n\n // Warn if we used a fallback\n if (isFallback) {\n emitWarning({\n type: 'missing_translation',\n key,\n requestedLocale: currentLocale,\n availableLocales,\n fallbackUsed: usedLocale,\n })\n }\n\n const result = interpolate(template, vars, usedLocale || currentLocale)\n\n const debugInfo: DebugInfo = {\n isMissing: false,\n isFallback,\n requestedLocale: currentLocale,\n usedLocale,\n key,\n }\n\n return applyDebugFormat(result, debugInfo)\n}\n\n/**\n * Check if a translation key exists\n * @param key - Translation key (may include namespace prefix)\n * @param locale - Optional locale to check\n */\nexport function hasTranslation(key: string, locale?: Locale): boolean {\n const { namespace, key: actualKey } = parseKey(key)\n const currentLocale = locale ?? getLocale()\n const nsDictionaries = namespacedDictionaries[namespace] || {}\n const dict = nsDictionaries[currentLocale]\n return dict ? getNestedValue(dict, actualKey) !== undefined : false\n}\n\n/**\n * Get all loaded locales\n * @param namespace - Optional namespace (returns from all if not specified)\n */\nexport function getLoadedLocales(namespace?: string): Locale[] {\n if (namespace) {\n return Object.keys(namespacedDictionaries[namespace] || {})\n }\n // Return unique locales across all namespaces\n const locales = new Set<Locale>()\n for (const ns of Object.values(namespacedDictionaries)) {\n for (const locale of Object.keys(ns)) {\n locales.add(locale)\n }\n }\n return Array.from(locales)\n}\n\n/**\n * Get dictionary for a specific locale\n * @param locale - Locale code\n * @param namespace - Optional namespace (defaults to 'default')\n */\nexport function getDictionary(locale: Locale, namespace?: string): Dictionary | undefined {\n const ns = namespace || DEFAULT_NAMESPACE\n return namespacedDictionaries[ns]?.[locale]\n}\n\n/**\n * Get all loaded namespaces\n */\nexport function getLoadedNamespaces(): string[] {\n return Object.keys(namespacedDictionaries)\n}\n","import type { Locale } from './types'\nimport { getParentLocale } from './config'\n\nexport type DetectSource = 'navigator' | 'cookie' | 'url' | 'header'\n\nexport interface DetectLocaleOptions {\n /** Locales your app supports */\n supportedLocales: Locale[]\n /** Fallback when no source matches */\n defaultLocale: Locale\n /** Detection sources in priority order (default: ['navigator']) */\n sources?: DetectSource[]\n /** Cookie name to read (default: 'NEXT_LOCALE') */\n cookieName?: string\n /** Accept-Language header value (for SSR) */\n headerValue?: string\n}\n\n/**\n * Try to match a candidate locale against supported locales\n * Supports exact match and BCP 47 parent matching (e.g., en-US → en)\n */\nfunction matchLocale(candidate: string, supportedLocales: Locale[]): Locale | undefined {\n const normalized = candidate.trim().toLowerCase()\n // Exact match (case-insensitive)\n const exact = supportedLocales.find(l => l.toLowerCase() === normalized)\n if (exact) return exact\n\n // BCP 47 parent match\n const parent = getParentLocale(candidate)\n if (parent) {\n const parentMatch = supportedLocales.find(l => l.toLowerCase() === parent.toLowerCase())\n if (parentMatch) return parentMatch\n }\n\n return undefined\n}\n\n/**\n * Detect locale from browser navigator.languages\n */\nfunction detectFromNavigator(supportedLocales: Locale[]): Locale | undefined {\n if (typeof globalThis === 'undefined') return undefined\n const nav = (globalThis as { navigator?: { languages?: readonly string[]; language?: string } }).navigator\n if (!nav) return undefined\n\n const languages = nav.languages || (nav.language ? [nav.language] : [])\n for (const lang of languages) {\n const match = matchLocale(lang, supportedLocales)\n if (match) return match\n }\n return undefined\n}\n\n/**\n * Detect locale from document.cookie\n */\nfunction detectFromCookie(supportedLocales: Locale[], cookieName: string): Locale | undefined {\n if (typeof document === 'undefined') return undefined\n\n const cookies = document.cookie.split(';')\n for (const cookie of cookies) {\n const [key, value] = cookie.split('=').map(s => s.trim())\n if (key === cookieName && value) {\n return matchLocale(value, supportedLocales)\n }\n }\n return undefined\n}\n\n/**\n * Detect locale from URL pathname (e.g., /ko/about → ko)\n */\nfunction detectFromUrl(supportedLocales: Locale[]): Locale | undefined {\n if (typeof location === 'undefined') return undefined\n\n const pathname = location.pathname\n // Match first path segment: /ko/... or /en-US/...\n const match = pathname.match(/^\\/([a-zA-Z]{2}(?:-[a-zA-Z]{2,})?)(?:\\/|$)/)\n if (match?.[1]) {\n return matchLocale(match[1], supportedLocales)\n }\n return undefined\n}\n\n/**\n * Parse Accept-Language header value\n * e.g., \"ko-KR,ko;q=0.9,en-US;q=0.8,en;q=0.7\"\n */\nfunction detectFromHeader(supportedLocales: Locale[], headerValue?: string): Locale | undefined {\n if (!headerValue) return undefined\n\n const entries = headerValue\n .split(',')\n .map(part => {\n const parts = part.trim().split(';')\n const lang = parts[0]?.trim() || ''\n const qStr = parts[1]\n const q = qStr ? parseFloat(qStr.replace(/q=/, '')) : 1.0\n return { lang, q }\n })\n .sort((a, b) => b.q - a.q)\n\n for (const { lang } of entries) {\n const match = matchLocale(lang, supportedLocales)\n if (match) return match\n }\n return undefined\n}\n\n/**\n * Auto-detect the user's locale from multiple sources\n *\n * @example\n * const locale = detectLocale({\n * supportedLocales: ['en', 'ko', 'ja'],\n * defaultLocale: 'en',\n * sources: ['cookie', 'navigator'],\n * cookieName: 'NEXT_LOCALE',\n * })\n */\nexport function detectLocale(options: DetectLocaleOptions): Locale {\n const {\n supportedLocales,\n defaultLocale,\n sources = ['navigator'],\n cookieName = 'NEXT_LOCALE',\n headerValue,\n } = options\n\n for (const source of sources) {\n let detected: Locale | undefined\n switch (source) {\n case 'navigator':\n detected = detectFromNavigator(supportedLocales)\n break\n case 'cookie':\n detected = detectFromCookie(supportedLocales, cookieName)\n break\n case 'url':\n detected = detectFromUrl(supportedLocales)\n break\n case 'header':\n detected = detectFromHeader(supportedLocales, headerValue)\n break\n }\n if (detected) return detected\n }\n\n return defaultLocale\n}\n","/**\n * Rich Text segment types\n */\nexport interface RichTextSegment {\n type: 'text' | 'component'\n content: string\n /** Component name (only for type === 'component') */\n componentName?: string\n}\n\n/**\n * Escape special regex characters\n */\nfunction escapeRegExp(str: string): string {\n return str.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&')\n}\n\n/**\n * Parse a template string into rich text segments.\n * Matches patterns like <name>content</name> for each component name.\n *\n * @param template - The template string with component tags\n * @param componentNames - Array of valid component names to match\n * @returns Array of segments (text or component)\n *\n * @example\n * parseRichText('Read <link>terms</link> and <bold>agree</bold>', ['link', 'bold'])\n * // [\n * // { type: 'text', content: 'Read ' },\n * // { type: 'component', content: 'terms', componentName: 'link' },\n * // { type: 'text', content: ' and ' },\n * // { type: 'component', content: 'agree', componentName: 'bold' },\n * // ]\n */\nexport function parseRichText(\n template: string,\n componentNames: string[]\n): RichTextSegment[] {\n if (componentNames.length === 0) {\n return [{ type: 'text', content: template }]\n }\n\n const segments: RichTextSegment[] = []\n const namesPattern = componentNames.map(escapeRegExp).join('|')\n const regex = new RegExp(`<(${namesPattern})>(.*?)</\\\\1>`, 'gs')\n\n let lastIndex = 0\n let match: RegExpExecArray | null\n\n while ((match = regex.exec(template)) !== null) {\n // Text before the match\n if (match.index > lastIndex) {\n segments.push({\n type: 'text',\n content: template.slice(lastIndex, match.index),\n })\n }\n\n // Component segment\n segments.push({\n type: 'component',\n content: match[2] ?? '',\n componentName: match[1],\n })\n\n lastIndex = match.index + match[0].length\n }\n\n // Trailing text\n if (lastIndex < template.length) {\n segments.push({\n type: 'text',\n content: template.slice(lastIndex),\n })\n }\n\n return segments\n}\n"]}
1
+ {"version":3,"sources":["../src/config.ts","../src/context.ts","../src/icu.ts","../src/interpolation.ts","../src/translate.ts","../src/runtime.ts","../src/pairs.ts","../src/dictionary.ts","../src/detect.ts","../src/scope.ts","../src/richtext.ts"],"names":["parse","isLiteralElement","isArgumentElement","isPoundElement","isPluralElement","isSelectElement","isNumberElement","isDateElement","isTimeElement","translations","vars","template","locale","debugInfo","result","currentLocale"],"mappings":"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","file":"index.js","sourcesContent":["import type { Config, Locale, TranslationWarning, DebugModeOptions } from './types'\n\n/**\n * Default warning handler - logs to console\n */\nfunction defaultWarningHandler(warning: TranslationWarning): void {\n const parts = [`[inline-i18n] Missing translation for locale \"${warning.requestedLocale}\"`]\n\n if (warning.key) {\n parts.push(`key: \"${warning.key}\"`)\n }\n\n parts.push(`Available: [${warning.availableLocales.join(', ')}]`)\n\n if (warning.fallbackUsed) {\n parts.push(`Using fallback: \"${warning.fallbackUsed}\"`)\n }\n\n console.warn(parts.join(' | '))\n}\n\n/**\n * Check if we're in development mode\n */\nfunction isDevMode(): boolean {\n try {\n // Check for Node.js environment\n if (typeof globalThis !== 'undefined' && 'process' in globalThis) {\n const proc = (globalThis as { process?: { env?: { NODE_ENV?: string } } }).process\n return proc?.env?.NODE_ENV !== 'production'\n }\n return false\n } catch {\n return false\n }\n}\n\ntype FullConfig = Required<Omit<Config, 'loader' | 'missingVarHandler' | 'persistLocale'>> & Pick<Config, 'loader' | 'missingVarHandler' | 'persistLocale'>\n\nconst defaultConfig: FullConfig = {\n defaultLocale: 'en',\n fallbackLocale: 'en',\n autoParentLocale: true,\n fallbackChain: {},\n warnOnMissing: isDevMode(),\n onMissingTranslation: defaultWarningHandler,\n debugMode: false,\n loader: undefined,\n icuCacheSize: 500,\n}\n\nlet config: Config = { ...defaultConfig }\n\n/**\n * Configure inline-i18n-multi settings\n *\n * @example\n * configure({\n * fallbackLocale: 'en',\n * fallbackChain: { 'pt-BR': ['pt', 'es', 'en'] },\n * warnOnMissing: true,\n * })\n */\nexport function configure(options: Partial<Config>): void {\n config = { ...config, ...options }\n}\n\n/**\n * Get current configuration\n */\nexport function getConfig(): FullConfig {\n return {\n ...defaultConfig,\n ...config,\n }\n}\n\n/**\n * Reset configuration to defaults\n */\nexport function resetConfig(): void {\n config = { ...defaultConfig }\n}\n\n/**\n * Derive parent locale from BCP 47 tag\n *\n * @example\n * getParentLocale('zh-TW') // => 'zh'\n * getParentLocale('en-US') // => 'en'\n * getParentLocale('en') // => undefined\n */\nexport function getParentLocale(locale: Locale): Locale | undefined {\n const dashIndex = locale.indexOf('-')\n if (dashIndex > 0) {\n return locale.substring(0, dashIndex)\n }\n return undefined\n}\n\n/**\n * Build fallback chain for a locale\n *\n * @example\n * // With autoParentLocale enabled (default)\n * buildFallbackChain('zh-TW') // => ['zh-TW', 'zh', 'en']\n * buildFallbackChain('en-US') // => ['en-US', 'en']\n *\n * // With custom fallback chain\n * configure({ fallbackChain: { 'pt-BR': ['pt', 'es', 'en'] } })\n * buildFallbackChain('pt-BR') // => ['pt-BR', 'pt', 'es', 'en']\n */\nexport function buildFallbackChain(locale: Locale): Locale[] {\n const cfg = getConfig()\n\n // Check for custom chain first\n if (cfg.fallbackChain[locale]) {\n return [locale, ...cfg.fallbackChain[locale]]\n }\n\n const chain: Locale[] = [locale]\n\n // Auto-derive parent locales if enabled\n if (cfg.autoParentLocale) {\n let current = locale\n while (true) {\n const parent = getParentLocale(current)\n if (parent && !chain.includes(parent)) {\n chain.push(parent)\n current = parent\n } else {\n break\n }\n }\n }\n\n // Add final fallback if not already in chain\n const finalFallback = cfg.fallbackLocale\n if (finalFallback && !chain.includes(finalFallback)) {\n chain.push(finalFallback)\n }\n\n return chain\n}\n\n/**\n * Emit a missing translation warning\n */\nexport function emitWarning(warning: TranslationWarning): void {\n const cfg = getConfig()\n if (cfg.warnOnMissing && cfg.onMissingTranslation) {\n cfg.onMissingTranslation(warning)\n }\n}\n\n// ============================================================================\n// Debug Mode (v0.4.0)\n// ============================================================================\n\n/**\n * Debug information for translation output\n */\nexport interface DebugInfo {\n /** True if no translation was found */\n isMissing: boolean\n /** True if a fallback locale was used */\n isFallback: boolean\n /** The locale that was requested */\n requestedLocale: string\n /** The locale that was actually used */\n usedLocale?: string\n /** The translation key (for t() function) */\n key?: string\n}\n\n/**\n * Format translation output with debug information if enabled\n */\nexport function applyDebugFormat(output: string, debugInfo: DebugInfo): string {\n const cfg = getConfig()\n\n if (!cfg.debugMode) {\n return output\n }\n\n const options: DebugModeOptions =\n typeof cfg.debugMode === 'object'\n ? cfg.debugMode\n : { showMissingPrefix: true, showFallbackPrefix: true }\n\n // Handle missing translation\n if (debugInfo.isMissing && options.showMissingPrefix !== false) {\n const prefix = options.missingPrefixFormat\n ? options.missingPrefixFormat(debugInfo.requestedLocale, debugInfo.key)\n : `[MISSING: ${debugInfo.requestedLocale}] `\n return prefix + output\n }\n\n // Handle fallback translation\n if (debugInfo.isFallback && options.showFallbackPrefix !== false && debugInfo.usedLocale) {\n const prefix = options.fallbackPrefixFormat\n ? options.fallbackPrefixFormat(debugInfo.requestedLocale, debugInfo.usedLocale, debugInfo.key)\n : `[${debugInfo.requestedLocale} -> ${debugInfo.usedLocale}] `\n return prefix + output\n }\n\n return output\n}\n","import type { Locale } from './types'\nimport { getConfig } from './config'\n\nlet currentLocale: Locale = 'en'\n\nfunction setCookie(name: string, value: string, days: number): void {\n if (typeof document === 'undefined') return\n const expires = new Date(Date.now() + days * 864e5).toUTCString()\n document.cookie = `${name}=${value}; expires=${expires}; path=/; SameSite=Lax`\n}\n\nfunction getCookie(name: string): string | undefined {\n if (typeof document === 'undefined') return undefined\n const match = document.cookie.match(new RegExp(`(?:^|;\\\\s*)${name}=([^;]*)`))\n return match?.[1]\n}\n\nfunction persistLocaleToStorage(locale: Locale): void {\n const cfg = getConfig()\n if (!cfg.persistLocale) return\n\n const { storage, key = 'LOCALE', expires = 365 } = cfg.persistLocale\n\n if (storage === 'cookie') {\n setCookie(key, locale, expires)\n } else if (storage === 'localStorage') {\n if (typeof localStorage !== 'undefined') {\n try {\n localStorage.setItem(key, locale)\n } catch {\n // localStorage may be full or blocked\n }\n }\n }\n}\n\nexport function setLocale(locale: Locale): void {\n currentLocale = locale\n persistLocaleToStorage(locale)\n}\n\nexport function getLocale(): Locale {\n return currentLocale\n}\n\n/**\n * Restore locale from configured persistent storage.\n * Returns the restored locale, or undefined if nothing was found.\n */\nexport function restoreLocale(): Locale | undefined {\n const cfg = getConfig()\n if (!cfg.persistLocale) return undefined\n\n const { storage, key = 'LOCALE' } = cfg.persistLocale\n let stored: string | undefined\n\n if (storage === 'cookie') {\n stored = getCookie(key)\n } else if (storage === 'localStorage') {\n if (typeof localStorage !== 'undefined') {\n try {\n stored = localStorage.getItem(key) ?? undefined\n } catch {\n // localStorage may be blocked\n }\n }\n }\n\n if (stored) {\n currentLocale = stored\n return stored\n }\n\n return undefined\n}\n","import {\n parse,\n type MessageFormatElement,\n type PluralElement,\n type SelectElement,\n type NumberElement,\n type DateElement,\n type TimeElement,\n isLiteralElement,\n isArgumentElement,\n isPluralElement,\n isSelectElement,\n isPoundElement,\n isNumberElement,\n isDateElement,\n isTimeElement,\n} from '@formatjs/icu-messageformat-parser'\n\nimport { getConfig } from './config'\n\nexport type ICUVars = Record<string, string | number | Date | string[]>\n\n// ============================================================================\n// ICU Parse Cache (v0.7.0)\n// ============================================================================\n\nconst icuCache = new Map<string, MessageFormatElement[]>()\n\n/**\n * Clear the ICU message AST cache\n */\nexport function clearICUCache(): void {\n icuCache.clear()\n}\n\n/**\n * Get a parsed AST from cache, or parse and cache it.\n * Respects the configured icuCacheSize limit (FIFO eviction).\n */\nfunction cachedParse(template: string): MessageFormatElement[] {\n const cached = icuCache.get(template)\n if (cached) return cached\n\n const ast = parse(template)\n\n const cfg = getConfig()\n if (cfg.icuCacheSize > 0) {\n if (icuCache.size >= cfg.icuCacheSize) {\n const firstKey = icuCache.keys().next().value\n if (firstKey !== undefined) {\n icuCache.delete(firstKey)\n }\n }\n icuCache.set(template, ast)\n }\n\n return ast\n}\n\n/**\n * Handle a missing variable — uses custom handler if configured, otherwise returns {varName}\n */\nfunction handleMissingVar(varName: string, locale: string): string {\n const cfg = getConfig()\n if (cfg.missingVarHandler) {\n return cfg.missingVarHandler(varName, locale)\n }\n return `{${varName}}`\n}\n\n// ============================================================================\n// Custom Formatter Registry (v0.6.0)\n// ============================================================================\n\nexport type CustomFormatter = (value: unknown, locale: string, style?: string) => string\n\nconst customFormatters = new Map<string, CustomFormatter>()\n\nconst RESERVED_FORMATTER_NAMES = new Set([\n 'plural', 'select', 'selectordinal',\n 'number', 'date', 'time',\n 'relativeTime', 'list', 'currency',\n])\n\n/**\n * Register a custom formatter\n *\n * @example\n * registerFormatter('phone', (value, locale, style?) => {\n * const s = String(value)\n * return `(${s.slice(0,3)}) ${s.slice(3,6)}-${s.slice(6)}`\n * })\n */\nexport function registerFormatter(name: string, formatter: CustomFormatter): void {\n if (RESERVED_FORMATTER_NAMES.has(name)) {\n throw new Error(`Cannot register formatter \"${name}\": reserved ICU type name`)\n }\n customFormatters.set(name, formatter)\n}\n\n/**\n * Clear all custom formatters\n */\nexport function clearFormatters(): void {\n customFormatters.clear()\n}\n\ninterface CustomFormatterReplacement {\n variable: string\n formatterName: string\n style?: string\n}\n\n/**\n * Build a regex that matches custom formatter patterns\n */\nfunction buildCustomFormatterPattern(): RegExp | null {\n if (customFormatters.size === 0) return null\n const names = [...customFormatters.keys()].map(n => n.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&')).join('|')\n return new RegExp(`\\\\{(\\\\w+),\\\\s*(${names})(?:,\\\\s*(\\\\w+))?\\\\}`, 'g')\n}\n\n/**\n * Preprocess custom formatter patterns before ICU parsing\n */\nfunction preprocessCustomFormatters(template: string): {\n processed: string\n replacements: Map<string, CustomFormatterReplacement>\n} {\n const replacements = new Map<string, CustomFormatterReplacement>()\n const pattern = buildCustomFormatterPattern()\n if (!pattern) return { processed: template, replacements }\n\n let counter = 0\n const processed = template.replace(pattern, (_, variable, formatterName, style) => {\n const placeholder = `__CUSTOM_${counter++}__`\n replacements.set(placeholder, { variable, formatterName, style })\n return `{${placeholder}}`\n })\n return { processed, replacements }\n}\n\n/**\n * Check if template contains custom formatter patterns\n */\nexport function hasCustomFormatter(template: string): boolean {\n const pattern = buildCustomFormatterPattern()\n if (!pattern) return false\n return pattern.test(template)\n}\n\n/**\n * Map ICU date style names to Intl.DateTimeFormat options\n */\nconst DATE_STYLES: Record<string, Intl.DateTimeFormatOptions> = {\n short: { dateStyle: 'short' },\n medium: { dateStyle: 'medium' },\n long: { dateStyle: 'long' },\n full: { dateStyle: 'full' },\n}\n\n/**\n * Map ICU time style names to Intl.DateTimeFormat options\n */\nconst TIME_STYLES: Record<string, Intl.DateTimeFormatOptions> = {\n short: { timeStyle: 'short' },\n medium: { timeStyle: 'medium' },\n long: { timeStyle: 'long' },\n full: { timeStyle: 'full' },\n}\n\n/**\n * Map ICU number style names to Intl.NumberFormat options\n */\nconst NUMBER_STYLES: Record<string, Intl.NumberFormatOptions> = {\n decimal: { style: 'decimal' },\n percent: { style: 'percent' },\n integer: { style: 'decimal', maximumFractionDigits: 0 },\n}\n\n/**\n * Map ICU relative time style names to Intl.RelativeTimeFormat options\n */\nconst RELATIVE_TIME_STYLES: Record<string, Intl.RelativeTimeFormatOptions> = {\n long: { style: 'long', numeric: 'auto' },\n short: { style: 'short', numeric: 'auto' },\n narrow: { style: 'narrow', numeric: 'auto' },\n}\n\n/**\n * Map ICU list type/style names to Intl.ListFormat options\n */\nconst LIST_TYPES: Record<string, Intl.ListFormatType> = {\n conjunction: 'conjunction',\n disjunction: 'disjunction',\n unit: 'unit',\n}\n\nconst LIST_STYLES: Record<string, Intl.ListFormatStyle> = {\n long: 'long',\n short: 'short',\n narrow: 'narrow',\n}\n\n/**\n * Convert value to Date\n */\nfunction toDate(value: string | number | Date): Date {\n if (value instanceof Date) {\n return value\n }\n return new Date(value)\n}\n\n/**\n * Format a number element\n */\nfunction formatNumberElement(\n el: NumberElement,\n vars: ICUVars,\n locale: string\n): string {\n const value = vars[el.value]\n if (value === undefined) {\n return handleMissingVar(el.value, locale)\n }\n\n const num = typeof value === 'number' ? value : Number(value)\n if (isNaN(num)) {\n return handleMissingVar(el.value, locale)\n }\n\n let options: Intl.NumberFormatOptions = {}\n\n if (el.style) {\n if (typeof el.style === 'string') {\n // Check for currency format: \"currency\" or specific currency like \"USD\"\n if (el.style === 'currency') {\n options = { style: 'currency', currency: 'USD' }\n } else if (NUMBER_STYLES[el.style]) {\n options = NUMBER_STYLES[el.style]!\n }\n } else if ('parsedOptions' in el.style) {\n // NumberSkeleton with parsed options\n options = el.style.parsedOptions as Intl.NumberFormatOptions\n }\n }\n\n try {\n return new Intl.NumberFormat(locale, options).format(num)\n } catch {\n return String(num)\n }\n}\n\n/**\n * Format a date element\n */\nfunction formatDateElement(\n el: DateElement,\n vars: ICUVars,\n locale: string\n): string {\n const value = vars[el.value]\n if (value === undefined) {\n return handleMissingVar(el.value, locale)\n }\n\n let options: Intl.DateTimeFormatOptions = {}\n\n if (el.style) {\n if (typeof el.style === 'string') {\n options = DATE_STYLES[el.style] || {}\n } else if ('parsedOptions' in el.style) {\n // DateTimeSkeleton with parsed options\n options = el.style.parsedOptions as Intl.DateTimeFormatOptions\n }\n }\n\n try {\n const date = toDate(value as string | number | Date)\n return new Intl.DateTimeFormat(locale, options).format(date)\n } catch {\n return handleMissingVar(el.value, locale)\n }\n}\n\n/**\n * Format a time element\n */\nfunction formatTimeElement(\n el: TimeElement,\n vars: ICUVars,\n locale: string\n): string {\n const value = vars[el.value]\n if (value === undefined) {\n return handleMissingVar(el.value, locale)\n }\n\n let options: Intl.DateTimeFormatOptions = {}\n\n if (el.style) {\n if (typeof el.style === 'string') {\n options = TIME_STYLES[el.style] || {}\n } else if ('parsedOptions' in el.style) {\n // DateTimeSkeleton with parsed options\n options = el.style.parsedOptions as Intl.DateTimeFormatOptions\n }\n }\n\n try {\n const date = toDate(value as string | number | Date)\n return new Intl.DateTimeFormat(locale, options).format(date)\n } catch {\n return handleMissingVar(el.value, locale)\n }\n}\n\n// ============================================================================\n// Currency Formatting (v0.5.0)\n// ============================================================================\n\ninterface CurrencyReplacement {\n variable: string\n currencyCode: string\n}\n\nconst CURRENCY_PATTERN = /\\{(\\w+),\\s*currency(?:,\\s*(\\w+))?\\}/g\n\n/**\n * Preprocess currency formats before ICU parsing\n */\nfunction preprocessCurrency(template: string): {\n processed: string\n replacements: Map<string, CurrencyReplacement>\n} {\n const replacements = new Map<string, CurrencyReplacement>()\n let counter = 0\n const processed = template.replace(CURRENCY_PATTERN, (_, variable, currencyCode) => {\n const placeholder = `__CURRENCY_${counter++}__`\n replacements.set(placeholder, { variable, currencyCode: currencyCode || 'USD' })\n return `{${placeholder}}`\n })\n return { processed, replacements }\n}\n\n/**\n * Format a currency value\n */\nfunction formatCurrencyValue(\n variableName: string,\n currencyCode: string,\n vars: ICUVars,\n locale: string\n): string {\n const value = vars[variableName]\n if (value === undefined) {\n return handleMissingVar(variableName, locale)\n }\n\n const num = typeof value === 'number' ? value : Number(value)\n if (isNaN(num)) {\n return handleMissingVar(variableName, locale)\n }\n\n try {\n return new Intl.NumberFormat(locale, {\n style: 'currency',\n currency: currencyCode,\n }).format(num)\n } catch {\n return String(num)\n }\n}\n\n// ============================================================================\n// Compact Number Formatting (v0.5.0)\n// ============================================================================\n\ninterface CompactNumberReplacement {\n variable: string\n display: 'short' | 'long'\n}\n\nconst COMPACT_NUMBER_PATTERN = /\\{(\\w+),\\s*number,\\s*(compact|compactLong)\\}/g\n\n/**\n * Preprocess compact number formats before ICU parsing\n */\nfunction preprocessCompactNumber(template: string): {\n processed: string\n replacements: Map<string, CompactNumberReplacement>\n} {\n const replacements = new Map<string, CompactNumberReplacement>()\n let counter = 0\n const processed = template.replace(COMPACT_NUMBER_PATTERN, (_, variable, style) => {\n const placeholder = `__COMPACT_${counter++}__`\n replacements.set(placeholder, {\n variable,\n display: style === 'compactLong' ? 'long' : 'short',\n })\n return `{${placeholder}}`\n })\n return { processed, replacements }\n}\n\n/**\n * Format a compact number value\n */\nfunction formatCompactNumber(\n variableName: string,\n display: 'short' | 'long',\n vars: ICUVars,\n locale: string\n): string {\n const value = vars[variableName]\n if (value === undefined) {\n return handleMissingVar(variableName, locale)\n }\n\n const num = typeof value === 'number' ? value : Number(value)\n if (isNaN(num)) {\n return handleMissingVar(variableName, locale)\n }\n\n try {\n return new Intl.NumberFormat(locale, {\n notation: 'compact',\n compactDisplay: display,\n }).format(num)\n } catch {\n return String(num)\n }\n}\n\n// ============================================================================\n// Relative Time Formatting (v0.4.0)\n// ============================================================================\n\ninterface RelativeTimeUnit {\n value: number\n unit: Intl.RelativeTimeFormatUnit\n}\n\n/**\n * Calculate the best unit for relative time display\n */\nfunction getRelativeTimeUnit(date: Date, now: Date = new Date()): RelativeTimeUnit {\n const diffMs = date.getTime() - now.getTime()\n const diffSeconds = Math.round(diffMs / 1000)\n const diffMinutes = Math.round(diffSeconds / 60)\n const diffHours = Math.round(diffMinutes / 60)\n const diffDays = Math.round(diffHours / 24)\n const diffWeeks = Math.round(diffDays / 7)\n const diffMonths = Math.round(diffDays / 30)\n const diffYears = Math.round(diffDays / 365)\n\n if (Math.abs(diffSeconds) < 60) return { value: diffSeconds, unit: 'second' }\n if (Math.abs(diffMinutes) < 60) return { value: diffMinutes, unit: 'minute' }\n if (Math.abs(diffHours) < 24) return { value: diffHours, unit: 'hour' }\n if (Math.abs(diffDays) < 7) return { value: diffDays, unit: 'day' }\n if (Math.abs(diffWeeks) < 4) return { value: diffWeeks, unit: 'week' }\n if (Math.abs(diffMonths) < 12) return { value: diffMonths, unit: 'month' }\n return { value: diffYears, unit: 'year' }\n}\n\ninterface RelativeTimeReplacement {\n variable: string\n style?: string\n}\n\nconst RELATIVE_TIME_PATTERN = /\\{(\\w+),\\s*relativeTime(?:,\\s*(\\w+))?\\}/g\n\n/**\n * Preprocess relative time formats before ICU parsing\n */\nfunction preprocessRelativeTime(template: string): {\n processed: string\n replacements: Map<string, RelativeTimeReplacement>\n} {\n const replacements = new Map<string, RelativeTimeReplacement>()\n let counter = 0\n const processed = template.replace(RELATIVE_TIME_PATTERN, (_, variable, style) => {\n const placeholder = `__RELTIME_${counter++}__`\n replacements.set(placeholder, { variable, style })\n return `{${placeholder}}`\n })\n return { processed, replacements }\n}\n\n/**\n * Format a relative time value\n */\nfunction formatRelativeTimeValue(\n variableName: string,\n style: string | undefined,\n vars: ICUVars,\n locale: string\n): string {\n const value = vars[variableName]\n if (value === undefined) {\n return handleMissingVar(variableName, locale)\n }\n\n try {\n const date = toDate(value as string | number | Date)\n const { value: relValue, unit } = getRelativeTimeUnit(date)\n const options = (style && RELATIVE_TIME_STYLES[style]) || RELATIVE_TIME_STYLES.long\n return new Intl.RelativeTimeFormat(locale, options).format(relValue, unit)\n } catch {\n return handleMissingVar(variableName, locale)\n }\n}\n\n// ============================================================================\n// List Formatting (v0.4.0)\n// ============================================================================\n\ninterface ListReplacement {\n variable: string\n type?: string\n style?: string\n}\n\nconst LIST_PATTERN = /\\{(\\w+),\\s*list(?:,\\s*(\\w+))?(?:,\\s*(\\w+))?\\}/g\n\n/**\n * Preprocess list formats before ICU parsing\n */\nfunction preprocessList(template: string): {\n processed: string\n replacements: Map<string, ListReplacement>\n} {\n const replacements = new Map<string, ListReplacement>()\n let counter = 0\n const processed = template.replace(LIST_PATTERN, (_, variable, arg1, arg2) => {\n const placeholder = `__LIST_${counter++}__`\n let type: string | undefined\n let style: string | undefined\n\n if (arg1) {\n if (LIST_TYPES[arg1]) {\n type = arg1\n style = arg2\n } else if (LIST_STYLES[arg1]) {\n style = arg1\n }\n }\n\n replacements.set(placeholder, { variable, type, style })\n return `{${placeholder}}`\n })\n return { processed, replacements }\n}\n\n/**\n * Format a list value\n */\nfunction formatListValue(\n variableName: string,\n type: string | undefined,\n style: string | undefined,\n vars: ICUVars,\n locale: string\n): string {\n const value = vars[variableName]\n if (value === undefined || !Array.isArray(value)) {\n return handleMissingVar(variableName, locale)\n }\n\n const options: Intl.ListFormatOptions = {\n type: (type as Intl.ListFormatType) || 'conjunction',\n style: (style as Intl.ListFormatStyle) || 'long',\n }\n\n try {\n return new Intl.ListFormat(locale, options).format(value)\n } catch {\n return value.join(', ')\n }\n}\n\n// ============================================================================\n// Plural Shorthand (v0.7.0)\n// ============================================================================\n\nconst PLURAL_SHORTHAND_PATTERN = /\\{(\\w+),\\s*p,\\s*([^}]+)\\}/g\n\n/**\n * Check if template contains plural shorthand patterns\n */\nexport function hasPluralShorthand(template: string): boolean {\n PLURAL_SHORTHAND_PATTERN.lastIndex = 0\n return PLURAL_SHORTHAND_PATTERN.test(template)\n}\n\n/**\n * Preprocess plural shorthand syntax before ICU parsing.\n *\n * {count, p, item|items} -> {count, plural, one {# item} other {# items}}\n * {count, p, none|item|items} -> {count, plural, =0 {none} one {# item} other {# items}}\n */\nfunction preprocessPluralShorthand(template: string): string {\n PLURAL_SHORTHAND_PATTERN.lastIndex = 0\n return template.replace(PLURAL_SHORTHAND_PATTERN, (_, variable, args) => {\n const parts = args.split('|').map((s: string) => s.trim())\n\n if (parts.length === 2) {\n const [singular, plural] = parts\n return `{${variable}, plural, one {# ${singular}} other {# ${plural}}}`\n }\n\n if (parts.length === 3) {\n const [zero, singular, plural] = parts\n return `{${variable}, plural, =0 {${zero}} one {# ${singular}} other {# ${plural}}}`\n }\n\n // If not 2 or 3 parts, return original\n return `{${variable}, p, ${args}}`\n })\n}\n\n/**\n * Parse and format an ICU Message Format string\n */\nexport function interpolateICU(\n template: string,\n vars: ICUVars,\n locale: string\n): string {\n // Expand plural shorthand to standard ICU plural (must be first)\n const afterPluralShorthand = preprocessPluralShorthand(template)\n\n // Pre-process custom formats (not natively supported by ICU parser)\n const { processed: afterCustom, replacements: customReplacements } = preprocessCustomFormatters(afterPluralShorthand)\n const { processed: afterCurrency, replacements: currencyReplacements } = preprocessCurrency(afterCustom)\n const { processed: afterCompact, replacements: compactReplacements } = preprocessCompactNumber(afterCurrency)\n const { processed: afterRelTime, replacements: relTimeReplacements } = preprocessRelativeTime(afterCompact)\n const { processed: afterList, replacements: listReplacements } = preprocessList(afterRelTime)\n\n const ast = cachedParse(afterList)\n let result = formatElements(ast, vars, locale, null)\n\n // Post-process custom formatter placeholders\n for (const [placeholder, { variable, formatterName, style }] of customReplacements) {\n const value = vars[variable]\n let formatted: string\n if (value === undefined) {\n formatted = handleMissingVar(variable, locale)\n } else {\n const formatter = customFormatters.get(formatterName)\n formatted = formatter ? formatter(value, locale, style) : String(value)\n }\n result = result.replace(`{${placeholder}}`, formatted)\n }\n\n // Post-process currency placeholders\n for (const [placeholder, { variable, currencyCode }] of currencyReplacements) {\n const formatted = formatCurrencyValue(variable, currencyCode, vars, locale)\n result = result.replace(`{${placeholder}}`, formatted)\n }\n\n // Post-process compact number placeholders\n for (const [placeholder, { variable, display }] of compactReplacements) {\n const formatted = formatCompactNumber(variable, display, vars, locale)\n result = result.replace(`{${placeholder}}`, formatted)\n }\n\n // Post-process relativeTime placeholders\n for (const [placeholder, { variable, style }] of relTimeReplacements) {\n const formatted = formatRelativeTimeValue(variable, style, vars, locale)\n result = result.replace(`{${placeholder}}`, formatted)\n }\n\n // Post-process list placeholders\n for (const [placeholder, { variable, type, style }] of listReplacements) {\n const formatted = formatListValue(variable, type, style, vars, locale)\n result = result.replace(`{${placeholder}}`, formatted)\n }\n\n return result\n}\n\nfunction formatElements(\n elements: MessageFormatElement[],\n vars: ICUVars,\n locale: string,\n currentPluralValue: number | null\n): string {\n return elements\n .map((el) => formatElement(el, vars, locale, currentPluralValue))\n .join('')\n}\n\nfunction formatElement(\n el: MessageFormatElement,\n vars: ICUVars,\n locale: string,\n currentPluralValue: number | null\n): string {\n if (isLiteralElement(el)) {\n return el.value\n }\n\n if (isArgumentElement(el)) {\n const value = vars[el.value]\n if (value !== undefined) return String(value)\n // Preprocessor placeholders (__CURRENCY_0__, __COMPACT_0__, etc.) must keep\n // their {placeholder} format so postprocessing can find and replace them\n if (el.value.startsWith('__') && el.value.endsWith('__')) {\n return `{${el.value}}`\n }\n return handleMissingVar(el.value, locale)\n }\n\n if (isPoundElement(el)) {\n // # is replaced with the current plural value\n return currentPluralValue !== null ? String(currentPluralValue) : '#'\n }\n\n if (isPluralElement(el)) {\n return formatPlural(el, vars, locale)\n }\n\n if (isSelectElement(el)) {\n return formatSelect(el, vars, locale)\n }\n\n if (isNumberElement(el)) {\n return formatNumberElement(el, vars, locale)\n }\n\n if (isDateElement(el)) {\n return formatDateElement(el, vars, locale)\n }\n\n if (isTimeElement(el)) {\n return formatTimeElement(el, vars, locale)\n }\n\n // Tag elements - not supported yet\n return ''\n}\n\nfunction formatPlural(\n el: PluralElement,\n vars: ICUVars,\n locale: string\n): string {\n const value = vars[el.value]\n if (typeof value !== 'number') {\n return handleMissingVar(el.value, locale)\n }\n\n const adjustedValue = value - el.offset\n const pluralRules = new Intl.PluralRules(locale, { type: el.pluralType })\n const category = pluralRules.select(adjustedValue)\n\n // Try exact match first (=0, =1, =2, etc.)\n const exactKey = `=${value}`\n if (el.options[exactKey]) {\n return formatElements(el.options[exactKey].value, vars, locale, adjustedValue)\n }\n\n // Then try plural category (zero, one, two, few, many, other)\n if (el.options[category]) {\n return formatElements(el.options[category].value, vars, locale, adjustedValue)\n }\n\n // Fallback to 'other'\n if (el.options.other) {\n return formatElements(el.options.other.value, vars, locale, adjustedValue)\n }\n\n return handleMissingVar(el.value, locale)\n}\n\nfunction formatSelect(\n el: SelectElement,\n vars: ICUVars,\n locale: string\n): string {\n const value = vars[el.value]\n const key = String(value)\n\n // Try exact match\n if (el.options[key]) {\n return formatElements(el.options[key].value, vars, locale, null)\n }\n\n // Fallback to 'other'\n if (el.options.other) {\n return formatElements(el.options.other.value, vars, locale, null)\n }\n\n return handleMissingVar(el.value, locale)\n}\n\n// Pattern to detect ICU format (plural, select, selectordinal, number, date, time, relativeTime, list)\nexport const ICU_PATTERN = /\\{[^}]+,\\s*(plural|select|selectordinal|number|date|time|relativeTime|list|currency|p)\\s*[,}]/\n\n/**\n * Check if a template contains ICU Message Format patterns\n */\nexport function hasICUPattern(template: string): boolean {\n return ICU_PATTERN.test(template)\n}\n","import type { TranslationVars } from './types'\nimport { getConfig } from './config'\nimport { hasICUPattern, hasCustomFormatter, hasPluralShorthand, interpolateICU } from './icu'\n\nconst VARIABLE_PATTERN = /\\{(\\w+)\\}/g\n\nexport function interpolate(\n template: string,\n vars?: TranslationVars,\n locale?: string,\n): string {\n const resolvedLocale = locale || 'en'\n\n // ICU Message Format (plural, select) or custom formatters\n if (hasICUPattern(template) || hasCustomFormatter(template) || hasPluralShorthand(template)) {\n if (!vars) {\n // Even without vars, handler should process missing variables\n const cfg = getConfig()\n if (cfg.missingVarHandler) {\n return interpolateICU(template, {}, resolvedLocale)\n }\n return template\n }\n return interpolateICU(template, vars, resolvedLocale)\n }\n\n // Simple variable substitution\n if (!vars) {\n const cfg = getConfig()\n if (cfg.missingVarHandler) {\n return template.replace(VARIABLE_PATTERN, (_, key) => {\n return cfg.missingVarHandler!(key, resolvedLocale)\n })\n }\n return template\n }\n\n return template.replace(VARIABLE_PATTERN, (_, key) => {\n const value = vars[key]\n if (value !== undefined) return String(value)\n const cfg = getConfig()\n if (cfg.missingVarHandler) {\n return cfg.missingVarHandler(key, resolvedLocale)\n }\n return `{${key}}`\n })\n}\n","import type { Translations, TranslationVars } from './types'\nimport { getLocale } from './context'\nimport { interpolate } from './interpolation'\nimport { buildFallbackChain, emitWarning, applyDebugFormat, type DebugInfo } from './config'\n\ninterface ResolveResult {\n template: string\n locale: string\n debugInfo: DebugInfo\n}\n\nfunction resolveTemplate(translations: Translations): ResolveResult {\n const locale = getLocale()\n const availableLocales = Object.keys(translations)\n const fallbackChain = buildFallbackChain(locale)\n\n // Try each locale in the fallback chain\n for (const tryLocale of fallbackChain) {\n const template = translations[tryLocale]\n if (template) {\n const isFallback = tryLocale !== locale\n // Warn if we had to fall back\n if (isFallback) {\n emitWarning({\n type: 'missing_translation',\n requestedLocale: locale,\n availableLocales,\n fallbackUsed: tryLocale,\n })\n }\n return {\n template,\n locale: tryLocale,\n debugInfo: {\n isMissing: false,\n isFallback,\n requestedLocale: locale,\n usedLocale: tryLocale,\n },\n }\n }\n }\n\n // Last resort: use first available translation\n const firstAvailable = Object.entries(translations)[0]\n if (firstAvailable) {\n emitWarning({\n type: 'missing_translation',\n requestedLocale: locale,\n availableLocales,\n fallbackUsed: firstAvailable[0],\n })\n return {\n template: firstAvailable[1],\n locale: firstAvailable[0],\n debugInfo: {\n isMissing: false,\n isFallback: true,\n requestedLocale: locale,\n usedLocale: firstAvailable[0],\n },\n }\n }\n\n throw new Error(\n `No translation found for locale \"${locale}\". Available: ${availableLocales.join(', ')}`\n )\n}\n\n/**\n * Translate with two languages (shorthand)\n * @param ko - Korean text\n * @param en - English text\n * @param vars - Variables for interpolation\n */\nexport function it(ko: string, en: string, vars?: TranslationVars): string\n\n/**\n * Translate with multiple languages (object syntax)\n * @param translations - Translation map with locale keys\n * @param vars - Variables for interpolation\n */\nexport function it(translations: Translations, vars?: TranslationVars): string\n\nexport function it(\n first: string | Translations,\n second?: string | TranslationVars,\n third?: TranslationVars,\n): string {\n // object syntax: it({ ko: '...', en: '...' }, vars?)\n if (typeof first === 'object') {\n const translations = first\n const vars = second as TranslationVars | undefined\n const { template, locale, debugInfo } = resolveTemplate(translations)\n const result = interpolate(template, vars, locale)\n return applyDebugFormat(result, debugInfo)\n }\n\n // shorthand syntax: it('한글', 'English', vars?)\n const ko = first\n const en = second as string\n const vars = third\n\n const translations: Translations = { ko, en }\n const { template, locale, debugInfo } = resolveTemplate(translations)\n const result = interpolate(template, vars, locale)\n return applyDebugFormat(result, debugInfo)\n}\n","import type { Translations, TranslationVars } from './types'\nimport { getLocale } from './context'\nimport { interpolate } from './interpolation'\nimport { buildFallbackChain, emitWarning } from './config'\n\n/**\n * Runtime lookup function for build-tool-transformed code.\n *\n * @deprecated Will be removed in v1.0.0\n * @param _hash - Content hash (for caching/debugging, unused at runtime)\n * @param translations - Translation map with locale keys\n * @param vars - Variables for interpolation\n */\nexport function __i18n_lookup(\n _hash: string,\n translations: Translations,\n vars?: TranslationVars\n): string {\n const locale = getLocale()\n const availableLocales = Object.keys(translations)\n const fallbackChain = buildFallbackChain(locale)\n\n // Try each locale in the fallback chain\n for (const tryLocale of fallbackChain) {\n const template = translations[tryLocale]\n if (template) {\n // Warn if we had to fall back\n if (tryLocale !== locale) {\n emitWarning({\n type: 'missing_translation',\n requestedLocale: locale,\n availableLocales,\n fallbackUsed: tryLocale,\n })\n }\n return interpolate(template, vars, tryLocale)\n }\n }\n\n // Last resort: use first available translation\n const firstAvailable = Object.entries(translations)[0]\n if (firstAvailable) {\n emitWarning({\n type: 'missing_translation',\n requestedLocale: locale,\n availableLocales,\n fallbackUsed: firstAvailable[0],\n })\n return interpolate(firstAvailable[1], vars, firstAvailable[0])\n }\n\n throw new Error(\n `No translation found for locale \"${locale}\". Available: ${availableLocales.join(', ')}`\n )\n}\n\n// @deprecated - Will be removed in v1.0.0\n// Register __i18n_lookup globally for backward compatibility\nif (typeof globalThis !== 'undefined') {\n (globalThis as Record<string, unknown>).__i18n_lookup = __i18n_lookup\n}\n","import type { Locale, Translations, TranslationVars } from './types'\nimport { it } from './translate'\n\ntype PairFunction = (\n text1: string,\n text2: string,\n vars?: TranslationVars,\n) => string\n\nfunction createPair(lang1: Locale, lang2: Locale): PairFunction {\n return (text1, text2, vars) => {\n const translations: Translations = {\n [lang1]: text1,\n [lang2]: text2,\n }\n return it(translations, vars)\n }\n}\n\n// Korean combinations\nexport const it_ja = createPair('ko', 'ja')\nexport const it_zh = createPair('ko', 'zh')\nexport const it_es = createPair('ko', 'es')\nexport const it_fr = createPair('ko', 'fr')\nexport const it_de = createPair('ko', 'de')\n\n// English combinations\nexport const en_ja = createPair('en', 'ja')\nexport const en_zh = createPair('en', 'zh')\nexport const en_es = createPair('en', 'es')\nexport const en_fr = createPair('en', 'fr')\nexport const en_de = createPair('en', 'de')\n\n// Other combinations\nexport const ja_zh = createPair('ja', 'zh')\nexport const ja_es = createPair('ja', 'es')\nexport const zh_es = createPair('zh', 'es')\n","import { getLocale } from './context'\nimport type { Locale, TranslationVars } from './types'\nimport { interpolate } from './interpolation'\nimport { buildFallbackChain, emitWarning, applyDebugFormat, getConfig, type DebugInfo } from './config'\n\n/**\n * Nested dictionary structure for translations\n * @example { greeting: { hello: \"Hello\", goodbye: \"Goodbye\" } }\n */\nexport type Dictionary = {\n [key: string]: string | Dictionary\n}\n\n/**\n * All loaded dictionaries by locale\n */\nexport type Dictionaries = Record<Locale, Dictionary>\n\n/**\n * Namespaced dictionaries storage\n * Structure: { namespace: { locale: Dictionary } }\n */\ntype NamespacedDictionaries = Record<string, Dictionaries>\n\n/**\n * Plural rules configuration\n */\nexport interface PluralRules {\n zero?: string\n one?: string\n two?: string\n few?: string\n many?: string\n other: string\n}\n\n// Default namespace for backward compatibility\nconst DEFAULT_NAMESPACE = 'default'\n\n// Namespace separator in keys\nconst NAMESPACE_SEPARATOR = ':'\n\n// Global dictionary storage - now namespaced\nlet namespacedDictionaries: NamespacedDictionaries = {}\n\n// Lazy loading state tracking (v0.5.0)\nlet loadingState: Record<string, 'loading' | 'loaded' | 'error'> = {}\nconst loadingPromises = new Map<string, Promise<void>>()\n\nfunction getLoadingKey(locale: Locale, namespace: string): string {\n return `${namespace}:${locale}`\n}\n\n/**\n * Parse a key that may contain a namespace prefix\n * @example\n * parseKey('common:greeting') // { namespace: 'common', key: 'greeting' }\n * parseKey('greeting') // { namespace: 'default', key: 'greeting' }\n */\nfunction parseKey(fullKey: string): { namespace: string; key: string } {\n const separatorIndex = fullKey.indexOf(NAMESPACE_SEPARATOR)\n if (separatorIndex > 0) {\n return {\n namespace: fullKey.substring(0, separatorIndex),\n key: fullKey.substring(separatorIndex + 1),\n }\n }\n return {\n namespace: DEFAULT_NAMESPACE,\n key: fullKey,\n }\n}\n\n/**\n * Load translations from dictionary objects\n * @param dicts - Dictionary objects keyed by locale\n * @param namespace - Optional namespace (defaults to 'default')\n * @example\n * // Without namespace (backward compatible)\n * loadDictionaries({\n * en: { greeting: { hello: \"Hello\" } },\n * ko: { greeting: { hello: \"안녕하세요\" } }\n * })\n *\n * // With namespace\n * loadDictionaries({\n * en: { hello: \"Hello\" },\n * ko: { hello: \"안녕하세요\" }\n * }, 'common')\n */\nexport function loadDictionaries(dicts: Dictionaries, namespace?: string): void {\n const ns = namespace || DEFAULT_NAMESPACE\n if (!namespacedDictionaries[ns]) {\n namespacedDictionaries[ns] = {}\n }\n namespacedDictionaries[ns] = {\n ...namespacedDictionaries[ns],\n ...dicts,\n }\n}\n\n/**\n * Load a single locale's dictionary\n * @param locale - Locale code\n * @param dict - Dictionary object\n * @param namespace - Optional namespace (defaults to 'default')\n */\nexport function loadDictionary(locale: Locale, dict: Dictionary, namespace?: string): void {\n const ns = namespace || DEFAULT_NAMESPACE\n if (!namespacedDictionaries[ns]) {\n namespacedDictionaries[ns] = {}\n }\n namespacedDictionaries[ns][locale] = {\n ...namespacedDictionaries[ns][locale],\n ...dict,\n }\n}\n\n/**\n * Clear loaded dictionaries\n * @param namespace - Optional namespace to clear (clears all if not specified)\n */\nexport function clearDictionaries(namespace?: string): void {\n if (namespace) {\n delete namespacedDictionaries[namespace]\n // Clear loading state for this namespace\n for (const key of Object.keys(loadingState)) {\n if (key.startsWith(`${namespace}:`)) {\n delete loadingState[key]\n loadingPromises.delete(key)\n }\n }\n } else {\n namespacedDictionaries = {}\n loadingState = {}\n loadingPromises.clear()\n }\n}\n\n/**\n * Asynchronously load a dictionary using the configured loader\n * @param locale - Locale to load\n * @param namespace - Optional namespace (defaults to 'default')\n * @throws Error if no loader is configured\n *\n * @example\n * configure({ loader: (locale, ns) => import(`./locales/${locale}/${ns}.json`) })\n * await loadAsync('ko', 'dashboard')\n * t('dashboard:title')\n */\nexport async function loadAsync(locale: Locale, namespace?: string): Promise<void> {\n const ns = namespace || DEFAULT_NAMESPACE\n const cfg = getConfig()\n\n if (!cfg.loader) {\n throw new Error('No loader configured. Call configure({ loader: ... }) first.')\n }\n\n const key = getLoadingKey(locale, ns)\n\n // Skip if already loaded\n if (loadingState[key] === 'loaded') return\n\n // Deduplicate concurrent calls\n if (loadingPromises.has(key)) {\n return loadingPromises.get(key)!\n }\n\n const promise = (async () => {\n loadingState[key] = 'loading'\n try {\n const dict = await cfg.loader!(locale, ns)\n loadDictionary(locale, dict as Dictionary, ns)\n loadingState[key] = 'loaded'\n } catch (error) {\n loadingState[key] = 'error'\n throw error\n } finally {\n loadingPromises.delete(key)\n }\n })()\n\n loadingPromises.set(key, promise)\n return promise\n}\n\n/**\n * Check if a dictionary has been loaded for a locale/namespace\n * @param locale - Locale to check\n * @param namespace - Optional namespace (defaults to 'default')\n */\nexport function isLoaded(locale: Locale, namespace?: string): boolean {\n const ns = namespace || DEFAULT_NAMESPACE\n const key = getLoadingKey(locale, ns)\n return loadingState[key] === 'loaded'\n}\n\n/**\n * Get a nested value from dictionary using dot notation\n * @param dict - Dictionary object\n * @param key - Dot-separated key path\n */\nfunction getNestedValue(dict: Dictionary, key: string): string | undefined {\n const parts = key.split('.')\n let current: string | Dictionary | undefined = dict\n\n for (const part of parts) {\n if (typeof current !== 'object' || current === null) {\n return undefined\n }\n current = current[part]\n if (current === undefined) {\n return undefined\n }\n }\n\n return typeof current === 'string' ? current : undefined\n}\n\n/**\n * Get plural category using Intl.PluralRules\n */\nfunction getPluralCategory(count: number, locale: Locale): Intl.LDMLPluralRule {\n const rules = new Intl.PluralRules(locale)\n return rules.select(count)\n}\n\n/**\n * Try to find a translation in a dictionary, handling plurals\n */\nfunction findInDictionary(\n dict: Dictionary,\n key: string,\n vars: TranslationVars | undefined,\n locale: Locale\n): string | undefined {\n let template = getNestedValue(dict, key)\n\n // Handle plurals if count is provided\n if (vars && typeof vars.count === 'number') {\n const pluralKey = `${key}_${getPluralCategory(vars.count, locale)}`\n const pluralTemplate = getNestedValue(dict, pluralKey)\n if (pluralTemplate) {\n template = pluralTemplate\n }\n }\n\n return template\n}\n\n/**\n * Translate using key-based lookup (i18n compatible)\n * @param key - Dot-separated translation key, optionally prefixed with namespace\n * @param vars - Variables for interpolation (including 'count' for plurals)\n * @param locale - Override locale (optional)\n * @example\n * t('greeting.hello') // Uses default namespace\n * t('common:greeting.hello') // Uses 'common' namespace\n * t('items.count', { count: 5 }) // \"5 items\"\n */\nexport function t(\n key: string,\n vars?: TranslationVars,\n locale?: Locale\n): string {\n const { namespace, key: actualKey } = parseKey(key)\n const currentLocale = locale ?? getLocale()\n const fallbackChain = buildFallbackChain(currentLocale)\n\n const nsDictionaries = namespacedDictionaries[namespace] || {}\n const availableLocales = Object.keys(nsDictionaries)\n\n let template: string | undefined\n let usedLocale: Locale | undefined\n\n // Try each locale in the fallback chain\n for (const tryLocale of fallbackChain) {\n const dict = nsDictionaries[tryLocale]\n if (!dict) continue\n\n const found = findInDictionary(dict, actualKey, vars, tryLocale)\n if (found) {\n template = found\n usedLocale = tryLocale\n break\n }\n }\n\n if (!template) {\n emitWarning({\n type: 'missing_translation',\n key,\n requestedLocale: currentLocale,\n availableLocales,\n })\n\n const debugInfo: DebugInfo = {\n isMissing: true,\n isFallback: false,\n requestedLocale: currentLocale,\n key,\n }\n return applyDebugFormat(key, debugInfo)\n }\n\n const isFallback = usedLocale !== currentLocale\n\n // Warn if we used a fallback\n if (isFallback) {\n emitWarning({\n type: 'missing_translation',\n key,\n requestedLocale: currentLocale,\n availableLocales,\n fallbackUsed: usedLocale,\n })\n }\n\n const result = interpolate(template, vars, usedLocale || currentLocale)\n\n const debugInfo: DebugInfo = {\n isMissing: false,\n isFallback,\n requestedLocale: currentLocale,\n usedLocale,\n key,\n }\n\n return applyDebugFormat(result, debugInfo)\n}\n\n/**\n * Check if a translation key exists\n * @param key - Translation key (may include namespace prefix)\n * @param locale - Optional locale to check\n */\nexport function hasTranslation(key: string, locale?: Locale): boolean {\n const { namespace, key: actualKey } = parseKey(key)\n const currentLocale = locale ?? getLocale()\n const nsDictionaries = namespacedDictionaries[namespace] || {}\n const dict = nsDictionaries[currentLocale]\n return dict ? getNestedValue(dict, actualKey) !== undefined : false\n}\n\n/**\n * Get all loaded locales\n * @param namespace - Optional namespace (returns from all if not specified)\n */\nexport function getLoadedLocales(namespace?: string): Locale[] {\n if (namespace) {\n return Object.keys(namespacedDictionaries[namespace] || {})\n }\n // Return unique locales across all namespaces\n const locales = new Set<Locale>()\n for (const ns of Object.values(namespacedDictionaries)) {\n for (const locale of Object.keys(ns)) {\n locales.add(locale)\n }\n }\n return Array.from(locales)\n}\n\n/**\n * Get dictionary for a specific locale\n * @param locale - Locale code\n * @param namespace - Optional namespace (defaults to 'default')\n */\nexport function getDictionary(locale: Locale, namespace?: string): Dictionary | undefined {\n const ns = namespace || DEFAULT_NAMESPACE\n return namespacedDictionaries[ns]?.[locale]\n}\n\n/**\n * Get all loaded namespaces\n */\nexport function getLoadedNamespaces(): string[] {\n return Object.keys(namespacedDictionaries)\n}\n","import type { Locale } from './types'\nimport { getParentLocale } from './config'\n\nexport type DetectSource = 'navigator' | 'cookie' | 'url' | 'header'\n\nexport interface DetectLocaleOptions {\n /** Locales your app supports */\n supportedLocales: Locale[]\n /** Fallback when no source matches */\n defaultLocale: Locale\n /** Detection sources in priority order (default: ['navigator']) */\n sources?: DetectSource[]\n /** Cookie name to read (default: 'NEXT_LOCALE') */\n cookieName?: string\n /** Accept-Language header value (for SSR) */\n headerValue?: string\n}\n\n/**\n * Try to match a candidate locale against supported locales\n * Supports exact match and BCP 47 parent matching (e.g., en-US → en)\n */\nfunction matchLocale(candidate: string, supportedLocales: Locale[]): Locale | undefined {\n const normalized = candidate.trim().toLowerCase()\n // Exact match (case-insensitive)\n const exact = supportedLocales.find(l => l.toLowerCase() === normalized)\n if (exact) return exact\n\n // BCP 47 parent match\n const parent = getParentLocale(candidate)\n if (parent) {\n const parentMatch = supportedLocales.find(l => l.toLowerCase() === parent.toLowerCase())\n if (parentMatch) return parentMatch\n }\n\n return undefined\n}\n\n/**\n * Detect locale from browser navigator.languages\n */\nfunction detectFromNavigator(supportedLocales: Locale[]): Locale | undefined {\n if (typeof globalThis === 'undefined') return undefined\n const nav = (globalThis as { navigator?: { languages?: readonly string[]; language?: string } }).navigator\n if (!nav) return undefined\n\n const languages = nav.languages || (nav.language ? [nav.language] : [])\n for (const lang of languages) {\n const match = matchLocale(lang, supportedLocales)\n if (match) return match\n }\n return undefined\n}\n\n/**\n * Detect locale from document.cookie\n */\nfunction detectFromCookie(supportedLocales: Locale[], cookieName: string): Locale | undefined {\n if (typeof document === 'undefined') return undefined\n\n const cookies = document.cookie.split(';')\n for (const cookie of cookies) {\n const [key, value] = cookie.split('=').map(s => s.trim())\n if (key === cookieName && value) {\n return matchLocale(value, supportedLocales)\n }\n }\n return undefined\n}\n\n/**\n * Detect locale from URL pathname (e.g., /ko/about → ko)\n */\nfunction detectFromUrl(supportedLocales: Locale[]): Locale | undefined {\n if (typeof location === 'undefined') return undefined\n\n const pathname = location.pathname\n // Match first path segment: /ko/... or /en-US/...\n const match = pathname.match(/^\\/([a-zA-Z]{2}(?:-[a-zA-Z]{2,})?)(?:\\/|$)/)\n if (match?.[1]) {\n return matchLocale(match[1], supportedLocales)\n }\n return undefined\n}\n\n/**\n * Parse Accept-Language header value\n * e.g., \"ko-KR,ko;q=0.9,en-US;q=0.8,en;q=0.7\"\n */\nfunction detectFromHeader(supportedLocales: Locale[], headerValue?: string): Locale | undefined {\n if (!headerValue) return undefined\n\n const entries = headerValue\n .split(',')\n .map(part => {\n const parts = part.trim().split(';')\n const lang = parts[0]?.trim() || ''\n const qStr = parts[1]\n const q = qStr ? parseFloat(qStr.replace(/q=/, '')) : 1.0\n return { lang, q }\n })\n .sort((a, b) => b.q - a.q)\n\n for (const { lang } of entries) {\n const match = matchLocale(lang, supportedLocales)\n if (match) return match\n }\n return undefined\n}\n\n/**\n * Auto-detect the user's locale from multiple sources\n *\n * @example\n * const locale = detectLocale({\n * supportedLocales: ['en', 'ko', 'ja'],\n * defaultLocale: 'en',\n * sources: ['cookie', 'navigator'],\n * cookieName: 'NEXT_LOCALE',\n * })\n */\nexport function detectLocale(options: DetectLocaleOptions): Locale {\n const {\n supportedLocales,\n defaultLocale,\n sources = ['navigator'],\n cookieName = 'NEXT_LOCALE',\n headerValue,\n } = options\n\n for (const source of sources) {\n let detected: Locale | undefined\n switch (source) {\n case 'navigator':\n detected = detectFromNavigator(supportedLocales)\n break\n case 'cookie':\n detected = detectFromCookie(supportedLocales, cookieName)\n break\n case 'url':\n detected = detectFromUrl(supportedLocales)\n break\n case 'header':\n detected = detectFromHeader(supportedLocales, headerValue)\n break\n }\n if (detected) return detected\n }\n\n return defaultLocale\n}\n","import type { Locale, TranslationVars } from './types'\nimport { t } from './dictionary'\n\n/**\n * Create a scoped translation function for a given namespace.\n * Returns a `t()` wrapper that auto-prepends the namespace prefix.\n *\n * @param namespace - Namespace to scope to\n * @returns Scoped translation function\n *\n * @example\n * const tc = createScope('common')\n * tc('greeting') // equivalent to t('common:greeting')\n * tc('nav.home') // equivalent to t('common:nav.home')\n * tc('welcome', { name: 'John' })\n */\nexport function createScope(\n namespace: string\n): (key: string, vars?: TranslationVars, locale?: Locale) => string {\n return (key: string, vars?: TranslationVars, locale?: Locale): string => {\n return t(`${namespace}:${key}`, vars, locale)\n }\n}\n","/**\n * Rich Text segment types\n */\nexport interface RichTextSegment {\n type: 'text' | 'component'\n content: string\n /** Component name (only for type === 'component') */\n componentName?: string\n}\n\n/**\n * Escape special regex characters\n */\nfunction escapeRegExp(str: string): string {\n return str.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&')\n}\n\n/**\n * Parse a template string into rich text segments.\n * Matches patterns like <name>content</name> for each component name.\n *\n * @param template - The template string with component tags\n * @param componentNames - Array of valid component names to match\n * @returns Array of segments (text or component)\n *\n * @example\n * parseRichText('Read <link>terms</link> and <bold>agree</bold>', ['link', 'bold'])\n * // [\n * // { type: 'text', content: 'Read ' },\n * // { type: 'component', content: 'terms', componentName: 'link' },\n * // { type: 'text', content: ' and ' },\n * // { type: 'component', content: 'agree', componentName: 'bold' },\n * // ]\n */\nexport function parseRichText(\n template: string,\n componentNames: string[]\n): RichTextSegment[] {\n if (componentNames.length === 0) {\n return [{ type: 'text', content: template }]\n }\n\n const segments: RichTextSegment[] = []\n const namesPattern = componentNames.map(escapeRegExp).join('|')\n const regex = new RegExp(`<(${namesPattern})>(.*?)</\\\\1>`, 'gs')\n\n let lastIndex = 0\n let match: RegExpExecArray | null\n\n while ((match = regex.exec(template)) !== null) {\n // Text before the match\n if (match.index > lastIndex) {\n segments.push({\n type: 'text',\n content: template.slice(lastIndex, match.index),\n })\n }\n\n // Component segment\n segments.push({\n type: 'component',\n content: match[2] ?? '',\n componentName: match[1],\n })\n\n lastIndex = match.index + match[0].length\n }\n\n // Trailing text\n if (lastIndex < template.length) {\n segments.push({\n type: 'text',\n content: template.slice(lastIndex),\n })\n }\n\n return segments\n}\n"]}
package/dist/index.mjs CHANGED
@@ -1048,6 +1048,13 @@ function detectLocale(options) {
1048
1048
  return defaultLocale;
1049
1049
  }
1050
1050
 
1051
+ // src/scope.ts
1052
+ function createScope(namespace) {
1053
+ return (key, vars, locale) => {
1054
+ return t(`${namespace}:${key}`, vars, locale);
1055
+ };
1056
+ }
1057
+
1051
1058
  // src/richtext.ts
1052
1059
  function escapeRegExp(str) {
1053
1060
  return str.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
@@ -1084,6 +1091,6 @@ function parseRichText(template, componentNames) {
1084
1091
  return segments;
1085
1092
  }
1086
1093
 
1087
- export { __i18n_lookup, clearDictionaries, clearFormatters, clearICUCache, configure, detectLocale, en_de, en_es, en_fr, en_ja, en_zh, getConfig, getDictionary, getLoadedLocales, getLoadedNamespaces, getLocale, hasTranslation, isLoaded, it, it_de, it_es, it_fr, it_ja, it_zh, ja_es, ja_zh, loadAsync, loadDictionaries, loadDictionary, parseRichText, registerFormatter, resetConfig, restoreLocale, setLocale, t, zh_es };
1094
+ export { __i18n_lookup, clearDictionaries, clearFormatters, clearICUCache, configure, createScope, detectLocale, en_de, en_es, en_fr, en_ja, en_zh, getConfig, getDictionary, getLoadedLocales, getLoadedNamespaces, getLocale, hasTranslation, isLoaded, it, it_de, it_es, it_fr, it_ja, it_zh, ja_es, ja_zh, loadAsync, loadDictionaries, loadDictionary, parseRichText, registerFormatter, resetConfig, restoreLocale, setLocale, t, zh_es };
1088
1095
  //# sourceMappingURL=index.mjs.map
1089
1096
  //# sourceMappingURL=index.mjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/config.ts","../src/context.ts","../src/icu.ts","../src/interpolation.ts","../src/translate.ts","../src/runtime.ts","../src/pairs.ts","../src/dictionary.ts","../src/detect.ts","../src/richtext.ts"],"names":["translations","vars","template","locale","debugInfo","result","currentLocale"],"mappings":"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","file":"index.mjs","sourcesContent":["import type { Config, Locale, TranslationWarning, DebugModeOptions } from './types'\n\n/**\n * Default warning handler - logs to console\n */\nfunction defaultWarningHandler(warning: TranslationWarning): void {\n const parts = [`[inline-i18n] Missing translation for locale \"${warning.requestedLocale}\"`]\n\n if (warning.key) {\n parts.push(`key: \"${warning.key}\"`)\n }\n\n parts.push(`Available: [${warning.availableLocales.join(', ')}]`)\n\n if (warning.fallbackUsed) {\n parts.push(`Using fallback: \"${warning.fallbackUsed}\"`)\n }\n\n console.warn(parts.join(' | '))\n}\n\n/**\n * Check if we're in development mode\n */\nfunction isDevMode(): boolean {\n try {\n // Check for Node.js environment\n if (typeof globalThis !== 'undefined' && 'process' in globalThis) {\n const proc = (globalThis as { process?: { env?: { NODE_ENV?: string } } }).process\n return proc?.env?.NODE_ENV !== 'production'\n }\n return false\n } catch {\n return false\n }\n}\n\ntype FullConfig = Required<Omit<Config, 'loader' | 'missingVarHandler' | 'persistLocale'>> & Pick<Config, 'loader' | 'missingVarHandler' | 'persistLocale'>\n\nconst defaultConfig: FullConfig = {\n defaultLocale: 'en',\n fallbackLocale: 'en',\n autoParentLocale: true,\n fallbackChain: {},\n warnOnMissing: isDevMode(),\n onMissingTranslation: defaultWarningHandler,\n debugMode: false,\n loader: undefined,\n icuCacheSize: 500,\n}\n\nlet config: Config = { ...defaultConfig }\n\n/**\n * Configure inline-i18n-multi settings\n *\n * @example\n * configure({\n * fallbackLocale: 'en',\n * fallbackChain: { 'pt-BR': ['pt', 'es', 'en'] },\n * warnOnMissing: true,\n * })\n */\nexport function configure(options: Partial<Config>): void {\n config = { ...config, ...options }\n}\n\n/**\n * Get current configuration\n */\nexport function getConfig(): FullConfig {\n return {\n ...defaultConfig,\n ...config,\n }\n}\n\n/**\n * Reset configuration to defaults\n */\nexport function resetConfig(): void {\n config = { ...defaultConfig }\n}\n\n/**\n * Derive parent locale from BCP 47 tag\n *\n * @example\n * getParentLocale('zh-TW') // => 'zh'\n * getParentLocale('en-US') // => 'en'\n * getParentLocale('en') // => undefined\n */\nexport function getParentLocale(locale: Locale): Locale | undefined {\n const dashIndex = locale.indexOf('-')\n if (dashIndex > 0) {\n return locale.substring(0, dashIndex)\n }\n return undefined\n}\n\n/**\n * Build fallback chain for a locale\n *\n * @example\n * // With autoParentLocale enabled (default)\n * buildFallbackChain('zh-TW') // => ['zh-TW', 'zh', 'en']\n * buildFallbackChain('en-US') // => ['en-US', 'en']\n *\n * // With custom fallback chain\n * configure({ fallbackChain: { 'pt-BR': ['pt', 'es', 'en'] } })\n * buildFallbackChain('pt-BR') // => ['pt-BR', 'pt', 'es', 'en']\n */\nexport function buildFallbackChain(locale: Locale): Locale[] {\n const cfg = getConfig()\n\n // Check for custom chain first\n if (cfg.fallbackChain[locale]) {\n return [locale, ...cfg.fallbackChain[locale]]\n }\n\n const chain: Locale[] = [locale]\n\n // Auto-derive parent locales if enabled\n if (cfg.autoParentLocale) {\n let current = locale\n while (true) {\n const parent = getParentLocale(current)\n if (parent && !chain.includes(parent)) {\n chain.push(parent)\n current = parent\n } else {\n break\n }\n }\n }\n\n // Add final fallback if not already in chain\n const finalFallback = cfg.fallbackLocale\n if (finalFallback && !chain.includes(finalFallback)) {\n chain.push(finalFallback)\n }\n\n return chain\n}\n\n/**\n * Emit a missing translation warning\n */\nexport function emitWarning(warning: TranslationWarning): void {\n const cfg = getConfig()\n if (cfg.warnOnMissing && cfg.onMissingTranslation) {\n cfg.onMissingTranslation(warning)\n }\n}\n\n// ============================================================================\n// Debug Mode (v0.4.0)\n// ============================================================================\n\n/**\n * Debug information for translation output\n */\nexport interface DebugInfo {\n /** True if no translation was found */\n isMissing: boolean\n /** True if a fallback locale was used */\n isFallback: boolean\n /** The locale that was requested */\n requestedLocale: string\n /** The locale that was actually used */\n usedLocale?: string\n /** The translation key (for t() function) */\n key?: string\n}\n\n/**\n * Format translation output with debug information if enabled\n */\nexport function applyDebugFormat(output: string, debugInfo: DebugInfo): string {\n const cfg = getConfig()\n\n if (!cfg.debugMode) {\n return output\n }\n\n const options: DebugModeOptions =\n typeof cfg.debugMode === 'object'\n ? cfg.debugMode\n : { showMissingPrefix: true, showFallbackPrefix: true }\n\n // Handle missing translation\n if (debugInfo.isMissing && options.showMissingPrefix !== false) {\n const prefix = options.missingPrefixFormat\n ? options.missingPrefixFormat(debugInfo.requestedLocale, debugInfo.key)\n : `[MISSING: ${debugInfo.requestedLocale}] `\n return prefix + output\n }\n\n // Handle fallback translation\n if (debugInfo.isFallback && options.showFallbackPrefix !== false && debugInfo.usedLocale) {\n const prefix = options.fallbackPrefixFormat\n ? options.fallbackPrefixFormat(debugInfo.requestedLocale, debugInfo.usedLocale, debugInfo.key)\n : `[${debugInfo.requestedLocale} -> ${debugInfo.usedLocale}] `\n return prefix + output\n }\n\n return output\n}\n","import type { Locale } from './types'\nimport { getConfig } from './config'\n\nlet currentLocale: Locale = 'en'\n\nfunction setCookie(name: string, value: string, days: number): void {\n if (typeof document === 'undefined') return\n const expires = new Date(Date.now() + days * 864e5).toUTCString()\n document.cookie = `${name}=${value}; expires=${expires}; path=/; SameSite=Lax`\n}\n\nfunction getCookie(name: string): string | undefined {\n if (typeof document === 'undefined') return undefined\n const match = document.cookie.match(new RegExp(`(?:^|;\\\\s*)${name}=([^;]*)`))\n return match?.[1]\n}\n\nfunction persistLocaleToStorage(locale: Locale): void {\n const cfg = getConfig()\n if (!cfg.persistLocale) return\n\n const { storage, key = 'LOCALE', expires = 365 } = cfg.persistLocale\n\n if (storage === 'cookie') {\n setCookie(key, locale, expires)\n } else if (storage === 'localStorage') {\n if (typeof localStorage !== 'undefined') {\n try {\n localStorage.setItem(key, locale)\n } catch {\n // localStorage may be full or blocked\n }\n }\n }\n}\n\nexport function setLocale(locale: Locale): void {\n currentLocale = locale\n persistLocaleToStorage(locale)\n}\n\nexport function getLocale(): Locale {\n return currentLocale\n}\n\n/**\n * Restore locale from configured persistent storage.\n * Returns the restored locale, or undefined if nothing was found.\n */\nexport function restoreLocale(): Locale | undefined {\n const cfg = getConfig()\n if (!cfg.persistLocale) return undefined\n\n const { storage, key = 'LOCALE' } = cfg.persistLocale\n let stored: string | undefined\n\n if (storage === 'cookie') {\n stored = getCookie(key)\n } else if (storage === 'localStorage') {\n if (typeof localStorage !== 'undefined') {\n try {\n stored = localStorage.getItem(key) ?? undefined\n } catch {\n // localStorage may be blocked\n }\n }\n }\n\n if (stored) {\n currentLocale = stored\n return stored\n }\n\n return undefined\n}\n","import {\n parse,\n type MessageFormatElement,\n type PluralElement,\n type SelectElement,\n type NumberElement,\n type DateElement,\n type TimeElement,\n isLiteralElement,\n isArgumentElement,\n isPluralElement,\n isSelectElement,\n isPoundElement,\n isNumberElement,\n isDateElement,\n isTimeElement,\n} from '@formatjs/icu-messageformat-parser'\n\nimport { getConfig } from './config'\n\nexport type ICUVars = Record<string, string | number | Date | string[]>\n\n// ============================================================================\n// ICU Parse Cache (v0.7.0)\n// ============================================================================\n\nconst icuCache = new Map<string, MessageFormatElement[]>()\n\n/**\n * Clear the ICU message AST cache\n */\nexport function clearICUCache(): void {\n icuCache.clear()\n}\n\n/**\n * Get a parsed AST from cache, or parse and cache it.\n * Respects the configured icuCacheSize limit (FIFO eviction).\n */\nfunction cachedParse(template: string): MessageFormatElement[] {\n const cached = icuCache.get(template)\n if (cached) return cached\n\n const ast = parse(template)\n\n const cfg = getConfig()\n if (cfg.icuCacheSize > 0) {\n if (icuCache.size >= cfg.icuCacheSize) {\n const firstKey = icuCache.keys().next().value\n if (firstKey !== undefined) {\n icuCache.delete(firstKey)\n }\n }\n icuCache.set(template, ast)\n }\n\n return ast\n}\n\n/**\n * Handle a missing variable — uses custom handler if configured, otherwise returns {varName}\n */\nfunction handleMissingVar(varName: string, locale: string): string {\n const cfg = getConfig()\n if (cfg.missingVarHandler) {\n return cfg.missingVarHandler(varName, locale)\n }\n return `{${varName}}`\n}\n\n// ============================================================================\n// Custom Formatter Registry (v0.6.0)\n// ============================================================================\n\nexport type CustomFormatter = (value: unknown, locale: string, style?: string) => string\n\nconst customFormatters = new Map<string, CustomFormatter>()\n\nconst RESERVED_FORMATTER_NAMES = new Set([\n 'plural', 'select', 'selectordinal',\n 'number', 'date', 'time',\n 'relativeTime', 'list', 'currency',\n])\n\n/**\n * Register a custom formatter\n *\n * @example\n * registerFormatter('phone', (value, locale, style?) => {\n * const s = String(value)\n * return `(${s.slice(0,3)}) ${s.slice(3,6)}-${s.slice(6)}`\n * })\n */\nexport function registerFormatter(name: string, formatter: CustomFormatter): void {\n if (RESERVED_FORMATTER_NAMES.has(name)) {\n throw new Error(`Cannot register formatter \"${name}\": reserved ICU type name`)\n }\n customFormatters.set(name, formatter)\n}\n\n/**\n * Clear all custom formatters\n */\nexport function clearFormatters(): void {\n customFormatters.clear()\n}\n\ninterface CustomFormatterReplacement {\n variable: string\n formatterName: string\n style?: string\n}\n\n/**\n * Build a regex that matches custom formatter patterns\n */\nfunction buildCustomFormatterPattern(): RegExp | null {\n if (customFormatters.size === 0) return null\n const names = [...customFormatters.keys()].map(n => n.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&')).join('|')\n return new RegExp(`\\\\{(\\\\w+),\\\\s*(${names})(?:,\\\\s*(\\\\w+))?\\\\}`, 'g')\n}\n\n/**\n * Preprocess custom formatter patterns before ICU parsing\n */\nfunction preprocessCustomFormatters(template: string): {\n processed: string\n replacements: Map<string, CustomFormatterReplacement>\n} {\n const replacements = new Map<string, CustomFormatterReplacement>()\n const pattern = buildCustomFormatterPattern()\n if (!pattern) return { processed: template, replacements }\n\n let counter = 0\n const processed = template.replace(pattern, (_, variable, formatterName, style) => {\n const placeholder = `__CUSTOM_${counter++}__`\n replacements.set(placeholder, { variable, formatterName, style })\n return `{${placeholder}}`\n })\n return { processed, replacements }\n}\n\n/**\n * Check if template contains custom formatter patterns\n */\nexport function hasCustomFormatter(template: string): boolean {\n const pattern = buildCustomFormatterPattern()\n if (!pattern) return false\n return pattern.test(template)\n}\n\n/**\n * Map ICU date style names to Intl.DateTimeFormat options\n */\nconst DATE_STYLES: Record<string, Intl.DateTimeFormatOptions> = {\n short: { dateStyle: 'short' },\n medium: { dateStyle: 'medium' },\n long: { dateStyle: 'long' },\n full: { dateStyle: 'full' },\n}\n\n/**\n * Map ICU time style names to Intl.DateTimeFormat options\n */\nconst TIME_STYLES: Record<string, Intl.DateTimeFormatOptions> = {\n short: { timeStyle: 'short' },\n medium: { timeStyle: 'medium' },\n long: { timeStyle: 'long' },\n full: { timeStyle: 'full' },\n}\n\n/**\n * Map ICU number style names to Intl.NumberFormat options\n */\nconst NUMBER_STYLES: Record<string, Intl.NumberFormatOptions> = {\n decimal: { style: 'decimal' },\n percent: { style: 'percent' },\n integer: { style: 'decimal', maximumFractionDigits: 0 },\n}\n\n/**\n * Map ICU relative time style names to Intl.RelativeTimeFormat options\n */\nconst RELATIVE_TIME_STYLES: Record<string, Intl.RelativeTimeFormatOptions> = {\n long: { style: 'long', numeric: 'auto' },\n short: { style: 'short', numeric: 'auto' },\n narrow: { style: 'narrow', numeric: 'auto' },\n}\n\n/**\n * Map ICU list type/style names to Intl.ListFormat options\n */\nconst LIST_TYPES: Record<string, Intl.ListFormatType> = {\n conjunction: 'conjunction',\n disjunction: 'disjunction',\n unit: 'unit',\n}\n\nconst LIST_STYLES: Record<string, Intl.ListFormatStyle> = {\n long: 'long',\n short: 'short',\n narrow: 'narrow',\n}\n\n/**\n * Convert value to Date\n */\nfunction toDate(value: string | number | Date): Date {\n if (value instanceof Date) {\n return value\n }\n return new Date(value)\n}\n\n/**\n * Format a number element\n */\nfunction formatNumberElement(\n el: NumberElement,\n vars: ICUVars,\n locale: string\n): string {\n const value = vars[el.value]\n if (value === undefined) {\n return handleMissingVar(el.value, locale)\n }\n\n const num = typeof value === 'number' ? value : Number(value)\n if (isNaN(num)) {\n return handleMissingVar(el.value, locale)\n }\n\n let options: Intl.NumberFormatOptions = {}\n\n if (el.style) {\n if (typeof el.style === 'string') {\n // Check for currency format: \"currency\" or specific currency like \"USD\"\n if (el.style === 'currency') {\n options = { style: 'currency', currency: 'USD' }\n } else if (NUMBER_STYLES[el.style]) {\n options = NUMBER_STYLES[el.style]!\n }\n } else if ('parsedOptions' in el.style) {\n // NumberSkeleton with parsed options\n options = el.style.parsedOptions as Intl.NumberFormatOptions\n }\n }\n\n try {\n return new Intl.NumberFormat(locale, options).format(num)\n } catch {\n return String(num)\n }\n}\n\n/**\n * Format a date element\n */\nfunction formatDateElement(\n el: DateElement,\n vars: ICUVars,\n locale: string\n): string {\n const value = vars[el.value]\n if (value === undefined) {\n return handleMissingVar(el.value, locale)\n }\n\n let options: Intl.DateTimeFormatOptions = {}\n\n if (el.style) {\n if (typeof el.style === 'string') {\n options = DATE_STYLES[el.style] || {}\n } else if ('parsedOptions' in el.style) {\n // DateTimeSkeleton with parsed options\n options = el.style.parsedOptions as Intl.DateTimeFormatOptions\n }\n }\n\n try {\n const date = toDate(value as string | number | Date)\n return new Intl.DateTimeFormat(locale, options).format(date)\n } catch {\n return handleMissingVar(el.value, locale)\n }\n}\n\n/**\n * Format a time element\n */\nfunction formatTimeElement(\n el: TimeElement,\n vars: ICUVars,\n locale: string\n): string {\n const value = vars[el.value]\n if (value === undefined) {\n return handleMissingVar(el.value, locale)\n }\n\n let options: Intl.DateTimeFormatOptions = {}\n\n if (el.style) {\n if (typeof el.style === 'string') {\n options = TIME_STYLES[el.style] || {}\n } else if ('parsedOptions' in el.style) {\n // DateTimeSkeleton with parsed options\n options = el.style.parsedOptions as Intl.DateTimeFormatOptions\n }\n }\n\n try {\n const date = toDate(value as string | number | Date)\n return new Intl.DateTimeFormat(locale, options).format(date)\n } catch {\n return handleMissingVar(el.value, locale)\n }\n}\n\n// ============================================================================\n// Currency Formatting (v0.5.0)\n// ============================================================================\n\ninterface CurrencyReplacement {\n variable: string\n currencyCode: string\n}\n\nconst CURRENCY_PATTERN = /\\{(\\w+),\\s*currency(?:,\\s*(\\w+))?\\}/g\n\n/**\n * Preprocess currency formats before ICU parsing\n */\nfunction preprocessCurrency(template: string): {\n processed: string\n replacements: Map<string, CurrencyReplacement>\n} {\n const replacements = new Map<string, CurrencyReplacement>()\n let counter = 0\n const processed = template.replace(CURRENCY_PATTERN, (_, variable, currencyCode) => {\n const placeholder = `__CURRENCY_${counter++}__`\n replacements.set(placeholder, { variable, currencyCode: currencyCode || 'USD' })\n return `{${placeholder}}`\n })\n return { processed, replacements }\n}\n\n/**\n * Format a currency value\n */\nfunction formatCurrencyValue(\n variableName: string,\n currencyCode: string,\n vars: ICUVars,\n locale: string\n): string {\n const value = vars[variableName]\n if (value === undefined) {\n return handleMissingVar(variableName, locale)\n }\n\n const num = typeof value === 'number' ? value : Number(value)\n if (isNaN(num)) {\n return handleMissingVar(variableName, locale)\n }\n\n try {\n return new Intl.NumberFormat(locale, {\n style: 'currency',\n currency: currencyCode,\n }).format(num)\n } catch {\n return String(num)\n }\n}\n\n// ============================================================================\n// Compact Number Formatting (v0.5.0)\n// ============================================================================\n\ninterface CompactNumberReplacement {\n variable: string\n display: 'short' | 'long'\n}\n\nconst COMPACT_NUMBER_PATTERN = /\\{(\\w+),\\s*number,\\s*(compact|compactLong)\\}/g\n\n/**\n * Preprocess compact number formats before ICU parsing\n */\nfunction preprocessCompactNumber(template: string): {\n processed: string\n replacements: Map<string, CompactNumberReplacement>\n} {\n const replacements = new Map<string, CompactNumberReplacement>()\n let counter = 0\n const processed = template.replace(COMPACT_NUMBER_PATTERN, (_, variable, style) => {\n const placeholder = `__COMPACT_${counter++}__`\n replacements.set(placeholder, {\n variable,\n display: style === 'compactLong' ? 'long' : 'short',\n })\n return `{${placeholder}}`\n })\n return { processed, replacements }\n}\n\n/**\n * Format a compact number value\n */\nfunction formatCompactNumber(\n variableName: string,\n display: 'short' | 'long',\n vars: ICUVars,\n locale: string\n): string {\n const value = vars[variableName]\n if (value === undefined) {\n return handleMissingVar(variableName, locale)\n }\n\n const num = typeof value === 'number' ? value : Number(value)\n if (isNaN(num)) {\n return handleMissingVar(variableName, locale)\n }\n\n try {\n return new Intl.NumberFormat(locale, {\n notation: 'compact',\n compactDisplay: display,\n }).format(num)\n } catch {\n return String(num)\n }\n}\n\n// ============================================================================\n// Relative Time Formatting (v0.4.0)\n// ============================================================================\n\ninterface RelativeTimeUnit {\n value: number\n unit: Intl.RelativeTimeFormatUnit\n}\n\n/**\n * Calculate the best unit for relative time display\n */\nfunction getRelativeTimeUnit(date: Date, now: Date = new Date()): RelativeTimeUnit {\n const diffMs = date.getTime() - now.getTime()\n const diffSeconds = Math.round(diffMs / 1000)\n const diffMinutes = Math.round(diffSeconds / 60)\n const diffHours = Math.round(diffMinutes / 60)\n const diffDays = Math.round(diffHours / 24)\n const diffWeeks = Math.round(diffDays / 7)\n const diffMonths = Math.round(diffDays / 30)\n const diffYears = Math.round(diffDays / 365)\n\n if (Math.abs(diffSeconds) < 60) return { value: diffSeconds, unit: 'second' }\n if (Math.abs(diffMinutes) < 60) return { value: diffMinutes, unit: 'minute' }\n if (Math.abs(diffHours) < 24) return { value: diffHours, unit: 'hour' }\n if (Math.abs(diffDays) < 7) return { value: diffDays, unit: 'day' }\n if (Math.abs(diffWeeks) < 4) return { value: diffWeeks, unit: 'week' }\n if (Math.abs(diffMonths) < 12) return { value: diffMonths, unit: 'month' }\n return { value: diffYears, unit: 'year' }\n}\n\ninterface RelativeTimeReplacement {\n variable: string\n style?: string\n}\n\nconst RELATIVE_TIME_PATTERN = /\\{(\\w+),\\s*relativeTime(?:,\\s*(\\w+))?\\}/g\n\n/**\n * Preprocess relative time formats before ICU parsing\n */\nfunction preprocessRelativeTime(template: string): {\n processed: string\n replacements: Map<string, RelativeTimeReplacement>\n} {\n const replacements = new Map<string, RelativeTimeReplacement>()\n let counter = 0\n const processed = template.replace(RELATIVE_TIME_PATTERN, (_, variable, style) => {\n const placeholder = `__RELTIME_${counter++}__`\n replacements.set(placeholder, { variable, style })\n return `{${placeholder}}`\n })\n return { processed, replacements }\n}\n\n/**\n * Format a relative time value\n */\nfunction formatRelativeTimeValue(\n variableName: string,\n style: string | undefined,\n vars: ICUVars,\n locale: string\n): string {\n const value = vars[variableName]\n if (value === undefined) {\n return handleMissingVar(variableName, locale)\n }\n\n try {\n const date = toDate(value as string | number | Date)\n const { value: relValue, unit } = getRelativeTimeUnit(date)\n const options = (style && RELATIVE_TIME_STYLES[style]) || RELATIVE_TIME_STYLES.long\n return new Intl.RelativeTimeFormat(locale, options).format(relValue, unit)\n } catch {\n return handleMissingVar(variableName, locale)\n }\n}\n\n// ============================================================================\n// List Formatting (v0.4.0)\n// ============================================================================\n\ninterface ListReplacement {\n variable: string\n type?: string\n style?: string\n}\n\nconst LIST_PATTERN = /\\{(\\w+),\\s*list(?:,\\s*(\\w+))?(?:,\\s*(\\w+))?\\}/g\n\n/**\n * Preprocess list formats before ICU parsing\n */\nfunction preprocessList(template: string): {\n processed: string\n replacements: Map<string, ListReplacement>\n} {\n const replacements = new Map<string, ListReplacement>()\n let counter = 0\n const processed = template.replace(LIST_PATTERN, (_, variable, arg1, arg2) => {\n const placeholder = `__LIST_${counter++}__`\n let type: string | undefined\n let style: string | undefined\n\n if (arg1) {\n if (LIST_TYPES[arg1]) {\n type = arg1\n style = arg2\n } else if (LIST_STYLES[arg1]) {\n style = arg1\n }\n }\n\n replacements.set(placeholder, { variable, type, style })\n return `{${placeholder}}`\n })\n return { processed, replacements }\n}\n\n/**\n * Format a list value\n */\nfunction formatListValue(\n variableName: string,\n type: string | undefined,\n style: string | undefined,\n vars: ICUVars,\n locale: string\n): string {\n const value = vars[variableName]\n if (value === undefined || !Array.isArray(value)) {\n return handleMissingVar(variableName, locale)\n }\n\n const options: Intl.ListFormatOptions = {\n type: (type as Intl.ListFormatType) || 'conjunction',\n style: (style as Intl.ListFormatStyle) || 'long',\n }\n\n try {\n return new Intl.ListFormat(locale, options).format(value)\n } catch {\n return value.join(', ')\n }\n}\n\n// ============================================================================\n// Plural Shorthand (v0.7.0)\n// ============================================================================\n\nconst PLURAL_SHORTHAND_PATTERN = /\\{(\\w+),\\s*p,\\s*([^}]+)\\}/g\n\n/**\n * Check if template contains plural shorthand patterns\n */\nexport function hasPluralShorthand(template: string): boolean {\n PLURAL_SHORTHAND_PATTERN.lastIndex = 0\n return PLURAL_SHORTHAND_PATTERN.test(template)\n}\n\n/**\n * Preprocess plural shorthand syntax before ICU parsing.\n *\n * {count, p, item|items} -> {count, plural, one {# item} other {# items}}\n * {count, p, none|item|items} -> {count, plural, =0 {none} one {# item} other {# items}}\n */\nfunction preprocessPluralShorthand(template: string): string {\n PLURAL_SHORTHAND_PATTERN.lastIndex = 0\n return template.replace(PLURAL_SHORTHAND_PATTERN, (_, variable, args) => {\n const parts = args.split('|').map((s: string) => s.trim())\n\n if (parts.length === 2) {\n const [singular, plural] = parts\n return `{${variable}, plural, one {# ${singular}} other {# ${plural}}}`\n }\n\n if (parts.length === 3) {\n const [zero, singular, plural] = parts\n return `{${variable}, plural, =0 {${zero}} one {# ${singular}} other {# ${plural}}}`\n }\n\n // If not 2 or 3 parts, return original\n return `{${variable}, p, ${args}}`\n })\n}\n\n/**\n * Parse and format an ICU Message Format string\n */\nexport function interpolateICU(\n template: string,\n vars: ICUVars,\n locale: string\n): string {\n // Expand plural shorthand to standard ICU plural (must be first)\n const afterPluralShorthand = preprocessPluralShorthand(template)\n\n // Pre-process custom formats (not natively supported by ICU parser)\n const { processed: afterCustom, replacements: customReplacements } = preprocessCustomFormatters(afterPluralShorthand)\n const { processed: afterCurrency, replacements: currencyReplacements } = preprocessCurrency(afterCustom)\n const { processed: afterCompact, replacements: compactReplacements } = preprocessCompactNumber(afterCurrency)\n const { processed: afterRelTime, replacements: relTimeReplacements } = preprocessRelativeTime(afterCompact)\n const { processed: afterList, replacements: listReplacements } = preprocessList(afterRelTime)\n\n const ast = cachedParse(afterList)\n let result = formatElements(ast, vars, locale, null)\n\n // Post-process custom formatter placeholders\n for (const [placeholder, { variable, formatterName, style }] of customReplacements) {\n const value = vars[variable]\n let formatted: string\n if (value === undefined) {\n formatted = handleMissingVar(variable, locale)\n } else {\n const formatter = customFormatters.get(formatterName)\n formatted = formatter ? formatter(value, locale, style) : String(value)\n }\n result = result.replace(`{${placeholder}}`, formatted)\n }\n\n // Post-process currency placeholders\n for (const [placeholder, { variable, currencyCode }] of currencyReplacements) {\n const formatted = formatCurrencyValue(variable, currencyCode, vars, locale)\n result = result.replace(`{${placeholder}}`, formatted)\n }\n\n // Post-process compact number placeholders\n for (const [placeholder, { variable, display }] of compactReplacements) {\n const formatted = formatCompactNumber(variable, display, vars, locale)\n result = result.replace(`{${placeholder}}`, formatted)\n }\n\n // Post-process relativeTime placeholders\n for (const [placeholder, { variable, style }] of relTimeReplacements) {\n const formatted = formatRelativeTimeValue(variable, style, vars, locale)\n result = result.replace(`{${placeholder}}`, formatted)\n }\n\n // Post-process list placeholders\n for (const [placeholder, { variable, type, style }] of listReplacements) {\n const formatted = formatListValue(variable, type, style, vars, locale)\n result = result.replace(`{${placeholder}}`, formatted)\n }\n\n return result\n}\n\nfunction formatElements(\n elements: MessageFormatElement[],\n vars: ICUVars,\n locale: string,\n currentPluralValue: number | null\n): string {\n return elements\n .map((el) => formatElement(el, vars, locale, currentPluralValue))\n .join('')\n}\n\nfunction formatElement(\n el: MessageFormatElement,\n vars: ICUVars,\n locale: string,\n currentPluralValue: number | null\n): string {\n if (isLiteralElement(el)) {\n return el.value\n }\n\n if (isArgumentElement(el)) {\n const value = vars[el.value]\n if (value !== undefined) return String(value)\n // Preprocessor placeholders (__CURRENCY_0__, __COMPACT_0__, etc.) must keep\n // their {placeholder} format so postprocessing can find and replace them\n if (el.value.startsWith('__') && el.value.endsWith('__')) {\n return `{${el.value}}`\n }\n return handleMissingVar(el.value, locale)\n }\n\n if (isPoundElement(el)) {\n // # is replaced with the current plural value\n return currentPluralValue !== null ? String(currentPluralValue) : '#'\n }\n\n if (isPluralElement(el)) {\n return formatPlural(el, vars, locale)\n }\n\n if (isSelectElement(el)) {\n return formatSelect(el, vars, locale)\n }\n\n if (isNumberElement(el)) {\n return formatNumberElement(el, vars, locale)\n }\n\n if (isDateElement(el)) {\n return formatDateElement(el, vars, locale)\n }\n\n if (isTimeElement(el)) {\n return formatTimeElement(el, vars, locale)\n }\n\n // Tag elements - not supported yet\n return ''\n}\n\nfunction formatPlural(\n el: PluralElement,\n vars: ICUVars,\n locale: string\n): string {\n const value = vars[el.value]\n if (typeof value !== 'number') {\n return handleMissingVar(el.value, locale)\n }\n\n const adjustedValue = value - el.offset\n const pluralRules = new Intl.PluralRules(locale, { type: el.pluralType })\n const category = pluralRules.select(adjustedValue)\n\n // Try exact match first (=0, =1, =2, etc.)\n const exactKey = `=${value}`\n if (el.options[exactKey]) {\n return formatElements(el.options[exactKey].value, vars, locale, adjustedValue)\n }\n\n // Then try plural category (zero, one, two, few, many, other)\n if (el.options[category]) {\n return formatElements(el.options[category].value, vars, locale, adjustedValue)\n }\n\n // Fallback to 'other'\n if (el.options.other) {\n return formatElements(el.options.other.value, vars, locale, adjustedValue)\n }\n\n return handleMissingVar(el.value, locale)\n}\n\nfunction formatSelect(\n el: SelectElement,\n vars: ICUVars,\n locale: string\n): string {\n const value = vars[el.value]\n const key = String(value)\n\n // Try exact match\n if (el.options[key]) {\n return formatElements(el.options[key].value, vars, locale, null)\n }\n\n // Fallback to 'other'\n if (el.options.other) {\n return formatElements(el.options.other.value, vars, locale, null)\n }\n\n return handleMissingVar(el.value, locale)\n}\n\n// Pattern to detect ICU format (plural, select, selectordinal, number, date, time, relativeTime, list)\nexport const ICU_PATTERN = /\\{[^}]+,\\s*(plural|select|selectordinal|number|date|time|relativeTime|list|currency|p)\\s*[,}]/\n\n/**\n * Check if a template contains ICU Message Format patterns\n */\nexport function hasICUPattern(template: string): boolean {\n return ICU_PATTERN.test(template)\n}\n","import type { TranslationVars } from './types'\nimport { getConfig } from './config'\nimport { hasICUPattern, hasCustomFormatter, hasPluralShorthand, interpolateICU } from './icu'\n\nconst VARIABLE_PATTERN = /\\{(\\w+)\\}/g\n\nexport function interpolate(\n template: string,\n vars?: TranslationVars,\n locale?: string,\n): string {\n const resolvedLocale = locale || 'en'\n\n // ICU Message Format (plural, select) or custom formatters\n if (hasICUPattern(template) || hasCustomFormatter(template) || hasPluralShorthand(template)) {\n if (!vars) {\n // Even without vars, handler should process missing variables\n const cfg = getConfig()\n if (cfg.missingVarHandler) {\n return interpolateICU(template, {}, resolvedLocale)\n }\n return template\n }\n return interpolateICU(template, vars, resolvedLocale)\n }\n\n // Simple variable substitution\n if (!vars) {\n const cfg = getConfig()\n if (cfg.missingVarHandler) {\n return template.replace(VARIABLE_PATTERN, (_, key) => {\n return cfg.missingVarHandler!(key, resolvedLocale)\n })\n }\n return template\n }\n\n return template.replace(VARIABLE_PATTERN, (_, key) => {\n const value = vars[key]\n if (value !== undefined) return String(value)\n const cfg = getConfig()\n if (cfg.missingVarHandler) {\n return cfg.missingVarHandler(key, resolvedLocale)\n }\n return `{${key}}`\n })\n}\n","import type { Translations, TranslationVars } from './types'\nimport { getLocale } from './context'\nimport { interpolate } from './interpolation'\nimport { buildFallbackChain, emitWarning, applyDebugFormat, type DebugInfo } from './config'\n\ninterface ResolveResult {\n template: string\n locale: string\n debugInfo: DebugInfo\n}\n\nfunction resolveTemplate(translations: Translations): ResolveResult {\n const locale = getLocale()\n const availableLocales = Object.keys(translations)\n const fallbackChain = buildFallbackChain(locale)\n\n // Try each locale in the fallback chain\n for (const tryLocale of fallbackChain) {\n const template = translations[tryLocale]\n if (template) {\n const isFallback = tryLocale !== locale\n // Warn if we had to fall back\n if (isFallback) {\n emitWarning({\n type: 'missing_translation',\n requestedLocale: locale,\n availableLocales,\n fallbackUsed: tryLocale,\n })\n }\n return {\n template,\n locale: tryLocale,\n debugInfo: {\n isMissing: false,\n isFallback,\n requestedLocale: locale,\n usedLocale: tryLocale,\n },\n }\n }\n }\n\n // Last resort: use first available translation\n const firstAvailable = Object.entries(translations)[0]\n if (firstAvailable) {\n emitWarning({\n type: 'missing_translation',\n requestedLocale: locale,\n availableLocales,\n fallbackUsed: firstAvailable[0],\n })\n return {\n template: firstAvailable[1],\n locale: firstAvailable[0],\n debugInfo: {\n isMissing: false,\n isFallback: true,\n requestedLocale: locale,\n usedLocale: firstAvailable[0],\n },\n }\n }\n\n throw new Error(\n `No translation found for locale \"${locale}\". Available: ${availableLocales.join(', ')}`\n )\n}\n\n/**\n * Translate with two languages (shorthand)\n * @param ko - Korean text\n * @param en - English text\n * @param vars - Variables for interpolation\n */\nexport function it(ko: string, en: string, vars?: TranslationVars): string\n\n/**\n * Translate with multiple languages (object syntax)\n * @param translations - Translation map with locale keys\n * @param vars - Variables for interpolation\n */\nexport function it(translations: Translations, vars?: TranslationVars): string\n\nexport function it(\n first: string | Translations,\n second?: string | TranslationVars,\n third?: TranslationVars,\n): string {\n // object syntax: it({ ko: '...', en: '...' }, vars?)\n if (typeof first === 'object') {\n const translations = first\n const vars = second as TranslationVars | undefined\n const { template, locale, debugInfo } = resolveTemplate(translations)\n const result = interpolate(template, vars, locale)\n return applyDebugFormat(result, debugInfo)\n }\n\n // shorthand syntax: it('한글', 'English', vars?)\n const ko = first\n const en = second as string\n const vars = third\n\n const translations: Translations = { ko, en }\n const { template, locale, debugInfo } = resolveTemplate(translations)\n const result = interpolate(template, vars, locale)\n return applyDebugFormat(result, debugInfo)\n}\n","import type { Translations, TranslationVars } from './types'\nimport { getLocale } from './context'\nimport { interpolate } from './interpolation'\nimport { buildFallbackChain, emitWarning } from './config'\n\n/**\n * Runtime lookup function for build-tool-transformed code.\n *\n * @deprecated Will be removed in v1.0.0\n * @param _hash - Content hash (for caching/debugging, unused at runtime)\n * @param translations - Translation map with locale keys\n * @param vars - Variables for interpolation\n */\nexport function __i18n_lookup(\n _hash: string,\n translations: Translations,\n vars?: TranslationVars\n): string {\n const locale = getLocale()\n const availableLocales = Object.keys(translations)\n const fallbackChain = buildFallbackChain(locale)\n\n // Try each locale in the fallback chain\n for (const tryLocale of fallbackChain) {\n const template = translations[tryLocale]\n if (template) {\n // Warn if we had to fall back\n if (tryLocale !== locale) {\n emitWarning({\n type: 'missing_translation',\n requestedLocale: locale,\n availableLocales,\n fallbackUsed: tryLocale,\n })\n }\n return interpolate(template, vars, tryLocale)\n }\n }\n\n // Last resort: use first available translation\n const firstAvailable = Object.entries(translations)[0]\n if (firstAvailable) {\n emitWarning({\n type: 'missing_translation',\n requestedLocale: locale,\n availableLocales,\n fallbackUsed: firstAvailable[0],\n })\n return interpolate(firstAvailable[1], vars, firstAvailable[0])\n }\n\n throw new Error(\n `No translation found for locale \"${locale}\". Available: ${availableLocales.join(', ')}`\n )\n}\n\n// @deprecated - Will be removed in v1.0.0\n// Register __i18n_lookup globally for backward compatibility\nif (typeof globalThis !== 'undefined') {\n (globalThis as Record<string, unknown>).__i18n_lookup = __i18n_lookup\n}\n","import type { Locale, Translations, TranslationVars } from './types'\nimport { it } from './translate'\n\ntype PairFunction = (\n text1: string,\n text2: string,\n vars?: TranslationVars,\n) => string\n\nfunction createPair(lang1: Locale, lang2: Locale): PairFunction {\n return (text1, text2, vars) => {\n const translations: Translations = {\n [lang1]: text1,\n [lang2]: text2,\n }\n return it(translations, vars)\n }\n}\n\n// Korean combinations\nexport const it_ja = createPair('ko', 'ja')\nexport const it_zh = createPair('ko', 'zh')\nexport const it_es = createPair('ko', 'es')\nexport const it_fr = createPair('ko', 'fr')\nexport const it_de = createPair('ko', 'de')\n\n// English combinations\nexport const en_ja = createPair('en', 'ja')\nexport const en_zh = createPair('en', 'zh')\nexport const en_es = createPair('en', 'es')\nexport const en_fr = createPair('en', 'fr')\nexport const en_de = createPair('en', 'de')\n\n// Other combinations\nexport const ja_zh = createPair('ja', 'zh')\nexport const ja_es = createPair('ja', 'es')\nexport const zh_es = createPair('zh', 'es')\n","import { getLocale } from './context'\nimport type { Locale, TranslationVars } from './types'\nimport { interpolate } from './interpolation'\nimport { buildFallbackChain, emitWarning, applyDebugFormat, getConfig, type DebugInfo } from './config'\n\n/**\n * Nested dictionary structure for translations\n * @example { greeting: { hello: \"Hello\", goodbye: \"Goodbye\" } }\n */\nexport type Dictionary = {\n [key: string]: string | Dictionary\n}\n\n/**\n * All loaded dictionaries by locale\n */\nexport type Dictionaries = Record<Locale, Dictionary>\n\n/**\n * Namespaced dictionaries storage\n * Structure: { namespace: { locale: Dictionary } }\n */\ntype NamespacedDictionaries = Record<string, Dictionaries>\n\n/**\n * Plural rules configuration\n */\nexport interface PluralRules {\n zero?: string\n one?: string\n two?: string\n few?: string\n many?: string\n other: string\n}\n\n// Default namespace for backward compatibility\nconst DEFAULT_NAMESPACE = 'default'\n\n// Namespace separator in keys\nconst NAMESPACE_SEPARATOR = ':'\n\n// Global dictionary storage - now namespaced\nlet namespacedDictionaries: NamespacedDictionaries = {}\n\n// Lazy loading state tracking (v0.5.0)\nlet loadingState: Record<string, 'loading' | 'loaded' | 'error'> = {}\nconst loadingPromises = new Map<string, Promise<void>>()\n\nfunction getLoadingKey(locale: Locale, namespace: string): string {\n return `${namespace}:${locale}`\n}\n\n/**\n * Parse a key that may contain a namespace prefix\n * @example\n * parseKey('common:greeting') // { namespace: 'common', key: 'greeting' }\n * parseKey('greeting') // { namespace: 'default', key: 'greeting' }\n */\nfunction parseKey(fullKey: string): { namespace: string; key: string } {\n const separatorIndex = fullKey.indexOf(NAMESPACE_SEPARATOR)\n if (separatorIndex > 0) {\n return {\n namespace: fullKey.substring(0, separatorIndex),\n key: fullKey.substring(separatorIndex + 1),\n }\n }\n return {\n namespace: DEFAULT_NAMESPACE,\n key: fullKey,\n }\n}\n\n/**\n * Load translations from dictionary objects\n * @param dicts - Dictionary objects keyed by locale\n * @param namespace - Optional namespace (defaults to 'default')\n * @example\n * // Without namespace (backward compatible)\n * loadDictionaries({\n * en: { greeting: { hello: \"Hello\" } },\n * ko: { greeting: { hello: \"안녕하세요\" } }\n * })\n *\n * // With namespace\n * loadDictionaries({\n * en: { hello: \"Hello\" },\n * ko: { hello: \"안녕하세요\" }\n * }, 'common')\n */\nexport function loadDictionaries(dicts: Dictionaries, namespace?: string): void {\n const ns = namespace || DEFAULT_NAMESPACE\n if (!namespacedDictionaries[ns]) {\n namespacedDictionaries[ns] = {}\n }\n namespacedDictionaries[ns] = {\n ...namespacedDictionaries[ns],\n ...dicts,\n }\n}\n\n/**\n * Load a single locale's dictionary\n * @param locale - Locale code\n * @param dict - Dictionary object\n * @param namespace - Optional namespace (defaults to 'default')\n */\nexport function loadDictionary(locale: Locale, dict: Dictionary, namespace?: string): void {\n const ns = namespace || DEFAULT_NAMESPACE\n if (!namespacedDictionaries[ns]) {\n namespacedDictionaries[ns] = {}\n }\n namespacedDictionaries[ns][locale] = {\n ...namespacedDictionaries[ns][locale],\n ...dict,\n }\n}\n\n/**\n * Clear loaded dictionaries\n * @param namespace - Optional namespace to clear (clears all if not specified)\n */\nexport function clearDictionaries(namespace?: string): void {\n if (namespace) {\n delete namespacedDictionaries[namespace]\n // Clear loading state for this namespace\n for (const key of Object.keys(loadingState)) {\n if (key.startsWith(`${namespace}:`)) {\n delete loadingState[key]\n loadingPromises.delete(key)\n }\n }\n } else {\n namespacedDictionaries = {}\n loadingState = {}\n loadingPromises.clear()\n }\n}\n\n/**\n * Asynchronously load a dictionary using the configured loader\n * @param locale - Locale to load\n * @param namespace - Optional namespace (defaults to 'default')\n * @throws Error if no loader is configured\n *\n * @example\n * configure({ loader: (locale, ns) => import(`./locales/${locale}/${ns}.json`) })\n * await loadAsync('ko', 'dashboard')\n * t('dashboard:title')\n */\nexport async function loadAsync(locale: Locale, namespace?: string): Promise<void> {\n const ns = namespace || DEFAULT_NAMESPACE\n const cfg = getConfig()\n\n if (!cfg.loader) {\n throw new Error('No loader configured. Call configure({ loader: ... }) first.')\n }\n\n const key = getLoadingKey(locale, ns)\n\n // Skip if already loaded\n if (loadingState[key] === 'loaded') return\n\n // Deduplicate concurrent calls\n if (loadingPromises.has(key)) {\n return loadingPromises.get(key)!\n }\n\n const promise = (async () => {\n loadingState[key] = 'loading'\n try {\n const dict = await cfg.loader!(locale, ns)\n loadDictionary(locale, dict as Dictionary, ns)\n loadingState[key] = 'loaded'\n } catch (error) {\n loadingState[key] = 'error'\n throw error\n } finally {\n loadingPromises.delete(key)\n }\n })()\n\n loadingPromises.set(key, promise)\n return promise\n}\n\n/**\n * Check if a dictionary has been loaded for a locale/namespace\n * @param locale - Locale to check\n * @param namespace - Optional namespace (defaults to 'default')\n */\nexport function isLoaded(locale: Locale, namespace?: string): boolean {\n const ns = namespace || DEFAULT_NAMESPACE\n const key = getLoadingKey(locale, ns)\n return loadingState[key] === 'loaded'\n}\n\n/**\n * Get a nested value from dictionary using dot notation\n * @param dict - Dictionary object\n * @param key - Dot-separated key path\n */\nfunction getNestedValue(dict: Dictionary, key: string): string | undefined {\n const parts = key.split('.')\n let current: string | Dictionary | undefined = dict\n\n for (const part of parts) {\n if (typeof current !== 'object' || current === null) {\n return undefined\n }\n current = current[part]\n if (current === undefined) {\n return undefined\n }\n }\n\n return typeof current === 'string' ? current : undefined\n}\n\n/**\n * Get plural category using Intl.PluralRules\n */\nfunction getPluralCategory(count: number, locale: Locale): Intl.LDMLPluralRule {\n const rules = new Intl.PluralRules(locale)\n return rules.select(count)\n}\n\n/**\n * Try to find a translation in a dictionary, handling plurals\n */\nfunction findInDictionary(\n dict: Dictionary,\n key: string,\n vars: TranslationVars | undefined,\n locale: Locale\n): string | undefined {\n let template = getNestedValue(dict, key)\n\n // Handle plurals if count is provided\n if (vars && typeof vars.count === 'number') {\n const pluralKey = `${key}_${getPluralCategory(vars.count, locale)}`\n const pluralTemplate = getNestedValue(dict, pluralKey)\n if (pluralTemplate) {\n template = pluralTemplate\n }\n }\n\n return template\n}\n\n/**\n * Translate using key-based lookup (i18n compatible)\n * @param key - Dot-separated translation key, optionally prefixed with namespace\n * @param vars - Variables for interpolation (including 'count' for plurals)\n * @param locale - Override locale (optional)\n * @example\n * t('greeting.hello') // Uses default namespace\n * t('common:greeting.hello') // Uses 'common' namespace\n * t('items.count', { count: 5 }) // \"5 items\"\n */\nexport function t(\n key: string,\n vars?: TranslationVars,\n locale?: Locale\n): string {\n const { namespace, key: actualKey } = parseKey(key)\n const currentLocale = locale ?? getLocale()\n const fallbackChain = buildFallbackChain(currentLocale)\n\n const nsDictionaries = namespacedDictionaries[namespace] || {}\n const availableLocales = Object.keys(nsDictionaries)\n\n let template: string | undefined\n let usedLocale: Locale | undefined\n\n // Try each locale in the fallback chain\n for (const tryLocale of fallbackChain) {\n const dict = nsDictionaries[tryLocale]\n if (!dict) continue\n\n const found = findInDictionary(dict, actualKey, vars, tryLocale)\n if (found) {\n template = found\n usedLocale = tryLocale\n break\n }\n }\n\n if (!template) {\n emitWarning({\n type: 'missing_translation',\n key,\n requestedLocale: currentLocale,\n availableLocales,\n })\n\n const debugInfo: DebugInfo = {\n isMissing: true,\n isFallback: false,\n requestedLocale: currentLocale,\n key,\n }\n return applyDebugFormat(key, debugInfo)\n }\n\n const isFallback = usedLocale !== currentLocale\n\n // Warn if we used a fallback\n if (isFallback) {\n emitWarning({\n type: 'missing_translation',\n key,\n requestedLocale: currentLocale,\n availableLocales,\n fallbackUsed: usedLocale,\n })\n }\n\n const result = interpolate(template, vars, usedLocale || currentLocale)\n\n const debugInfo: DebugInfo = {\n isMissing: false,\n isFallback,\n requestedLocale: currentLocale,\n usedLocale,\n key,\n }\n\n return applyDebugFormat(result, debugInfo)\n}\n\n/**\n * Check if a translation key exists\n * @param key - Translation key (may include namespace prefix)\n * @param locale - Optional locale to check\n */\nexport function hasTranslation(key: string, locale?: Locale): boolean {\n const { namespace, key: actualKey } = parseKey(key)\n const currentLocale = locale ?? getLocale()\n const nsDictionaries = namespacedDictionaries[namespace] || {}\n const dict = nsDictionaries[currentLocale]\n return dict ? getNestedValue(dict, actualKey) !== undefined : false\n}\n\n/**\n * Get all loaded locales\n * @param namespace - Optional namespace (returns from all if not specified)\n */\nexport function getLoadedLocales(namespace?: string): Locale[] {\n if (namespace) {\n return Object.keys(namespacedDictionaries[namespace] || {})\n }\n // Return unique locales across all namespaces\n const locales = new Set<Locale>()\n for (const ns of Object.values(namespacedDictionaries)) {\n for (const locale of Object.keys(ns)) {\n locales.add(locale)\n }\n }\n return Array.from(locales)\n}\n\n/**\n * Get dictionary for a specific locale\n * @param locale - Locale code\n * @param namespace - Optional namespace (defaults to 'default')\n */\nexport function getDictionary(locale: Locale, namespace?: string): Dictionary | undefined {\n const ns = namespace || DEFAULT_NAMESPACE\n return namespacedDictionaries[ns]?.[locale]\n}\n\n/**\n * Get all loaded namespaces\n */\nexport function getLoadedNamespaces(): string[] {\n return Object.keys(namespacedDictionaries)\n}\n","import type { Locale } from './types'\nimport { getParentLocale } from './config'\n\nexport type DetectSource = 'navigator' | 'cookie' | 'url' | 'header'\n\nexport interface DetectLocaleOptions {\n /** Locales your app supports */\n supportedLocales: Locale[]\n /** Fallback when no source matches */\n defaultLocale: Locale\n /** Detection sources in priority order (default: ['navigator']) */\n sources?: DetectSource[]\n /** Cookie name to read (default: 'NEXT_LOCALE') */\n cookieName?: string\n /** Accept-Language header value (for SSR) */\n headerValue?: string\n}\n\n/**\n * Try to match a candidate locale against supported locales\n * Supports exact match and BCP 47 parent matching (e.g., en-US → en)\n */\nfunction matchLocale(candidate: string, supportedLocales: Locale[]): Locale | undefined {\n const normalized = candidate.trim().toLowerCase()\n // Exact match (case-insensitive)\n const exact = supportedLocales.find(l => l.toLowerCase() === normalized)\n if (exact) return exact\n\n // BCP 47 parent match\n const parent = getParentLocale(candidate)\n if (parent) {\n const parentMatch = supportedLocales.find(l => l.toLowerCase() === parent.toLowerCase())\n if (parentMatch) return parentMatch\n }\n\n return undefined\n}\n\n/**\n * Detect locale from browser navigator.languages\n */\nfunction detectFromNavigator(supportedLocales: Locale[]): Locale | undefined {\n if (typeof globalThis === 'undefined') return undefined\n const nav = (globalThis as { navigator?: { languages?: readonly string[]; language?: string } }).navigator\n if (!nav) return undefined\n\n const languages = nav.languages || (nav.language ? [nav.language] : [])\n for (const lang of languages) {\n const match = matchLocale(lang, supportedLocales)\n if (match) return match\n }\n return undefined\n}\n\n/**\n * Detect locale from document.cookie\n */\nfunction detectFromCookie(supportedLocales: Locale[], cookieName: string): Locale | undefined {\n if (typeof document === 'undefined') return undefined\n\n const cookies = document.cookie.split(';')\n for (const cookie of cookies) {\n const [key, value] = cookie.split('=').map(s => s.trim())\n if (key === cookieName && value) {\n return matchLocale(value, supportedLocales)\n }\n }\n return undefined\n}\n\n/**\n * Detect locale from URL pathname (e.g., /ko/about → ko)\n */\nfunction detectFromUrl(supportedLocales: Locale[]): Locale | undefined {\n if (typeof location === 'undefined') return undefined\n\n const pathname = location.pathname\n // Match first path segment: /ko/... or /en-US/...\n const match = pathname.match(/^\\/([a-zA-Z]{2}(?:-[a-zA-Z]{2,})?)(?:\\/|$)/)\n if (match?.[1]) {\n return matchLocale(match[1], supportedLocales)\n }\n return undefined\n}\n\n/**\n * Parse Accept-Language header value\n * e.g., \"ko-KR,ko;q=0.9,en-US;q=0.8,en;q=0.7\"\n */\nfunction detectFromHeader(supportedLocales: Locale[], headerValue?: string): Locale | undefined {\n if (!headerValue) return undefined\n\n const entries = headerValue\n .split(',')\n .map(part => {\n const parts = part.trim().split(';')\n const lang = parts[0]?.trim() || ''\n const qStr = parts[1]\n const q = qStr ? parseFloat(qStr.replace(/q=/, '')) : 1.0\n return { lang, q }\n })\n .sort((a, b) => b.q - a.q)\n\n for (const { lang } of entries) {\n const match = matchLocale(lang, supportedLocales)\n if (match) return match\n }\n return undefined\n}\n\n/**\n * Auto-detect the user's locale from multiple sources\n *\n * @example\n * const locale = detectLocale({\n * supportedLocales: ['en', 'ko', 'ja'],\n * defaultLocale: 'en',\n * sources: ['cookie', 'navigator'],\n * cookieName: 'NEXT_LOCALE',\n * })\n */\nexport function detectLocale(options: DetectLocaleOptions): Locale {\n const {\n supportedLocales,\n defaultLocale,\n sources = ['navigator'],\n cookieName = 'NEXT_LOCALE',\n headerValue,\n } = options\n\n for (const source of sources) {\n let detected: Locale | undefined\n switch (source) {\n case 'navigator':\n detected = detectFromNavigator(supportedLocales)\n break\n case 'cookie':\n detected = detectFromCookie(supportedLocales, cookieName)\n break\n case 'url':\n detected = detectFromUrl(supportedLocales)\n break\n case 'header':\n detected = detectFromHeader(supportedLocales, headerValue)\n break\n }\n if (detected) return detected\n }\n\n return defaultLocale\n}\n","/**\n * Rich Text segment types\n */\nexport interface RichTextSegment {\n type: 'text' | 'component'\n content: string\n /** Component name (only for type === 'component') */\n componentName?: string\n}\n\n/**\n * Escape special regex characters\n */\nfunction escapeRegExp(str: string): string {\n return str.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&')\n}\n\n/**\n * Parse a template string into rich text segments.\n * Matches patterns like <name>content</name> for each component name.\n *\n * @param template - The template string with component tags\n * @param componentNames - Array of valid component names to match\n * @returns Array of segments (text or component)\n *\n * @example\n * parseRichText('Read <link>terms</link> and <bold>agree</bold>', ['link', 'bold'])\n * // [\n * // { type: 'text', content: 'Read ' },\n * // { type: 'component', content: 'terms', componentName: 'link' },\n * // { type: 'text', content: ' and ' },\n * // { type: 'component', content: 'agree', componentName: 'bold' },\n * // ]\n */\nexport function parseRichText(\n template: string,\n componentNames: string[]\n): RichTextSegment[] {\n if (componentNames.length === 0) {\n return [{ type: 'text', content: template }]\n }\n\n const segments: RichTextSegment[] = []\n const namesPattern = componentNames.map(escapeRegExp).join('|')\n const regex = new RegExp(`<(${namesPattern})>(.*?)</\\\\1>`, 'gs')\n\n let lastIndex = 0\n let match: RegExpExecArray | null\n\n while ((match = regex.exec(template)) !== null) {\n // Text before the match\n if (match.index > lastIndex) {\n segments.push({\n type: 'text',\n content: template.slice(lastIndex, match.index),\n })\n }\n\n // Component segment\n segments.push({\n type: 'component',\n content: match[2] ?? '',\n componentName: match[1],\n })\n\n lastIndex = match.index + match[0].length\n }\n\n // Trailing text\n if (lastIndex < template.length) {\n segments.push({\n type: 'text',\n content: template.slice(lastIndex),\n })\n }\n\n return segments\n}\n"]}
1
+ {"version":3,"sources":["../src/config.ts","../src/context.ts","../src/icu.ts","../src/interpolation.ts","../src/translate.ts","../src/runtime.ts","../src/pairs.ts","../src/dictionary.ts","../src/detect.ts","../src/scope.ts","../src/richtext.ts"],"names":["translations","vars","template","locale","debugInfo","result","currentLocale"],"mappings":"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","file":"index.mjs","sourcesContent":["import type { Config, Locale, TranslationWarning, DebugModeOptions } from './types'\n\n/**\n * Default warning handler - logs to console\n */\nfunction defaultWarningHandler(warning: TranslationWarning): void {\n const parts = [`[inline-i18n] Missing translation for locale \"${warning.requestedLocale}\"`]\n\n if (warning.key) {\n parts.push(`key: \"${warning.key}\"`)\n }\n\n parts.push(`Available: [${warning.availableLocales.join(', ')}]`)\n\n if (warning.fallbackUsed) {\n parts.push(`Using fallback: \"${warning.fallbackUsed}\"`)\n }\n\n console.warn(parts.join(' | '))\n}\n\n/**\n * Check if we're in development mode\n */\nfunction isDevMode(): boolean {\n try {\n // Check for Node.js environment\n if (typeof globalThis !== 'undefined' && 'process' in globalThis) {\n const proc = (globalThis as { process?: { env?: { NODE_ENV?: string } } }).process\n return proc?.env?.NODE_ENV !== 'production'\n }\n return false\n } catch {\n return false\n }\n}\n\ntype FullConfig = Required<Omit<Config, 'loader' | 'missingVarHandler' | 'persistLocale'>> & Pick<Config, 'loader' | 'missingVarHandler' | 'persistLocale'>\n\nconst defaultConfig: FullConfig = {\n defaultLocale: 'en',\n fallbackLocale: 'en',\n autoParentLocale: true,\n fallbackChain: {},\n warnOnMissing: isDevMode(),\n onMissingTranslation: defaultWarningHandler,\n debugMode: false,\n loader: undefined,\n icuCacheSize: 500,\n}\n\nlet config: Config = { ...defaultConfig }\n\n/**\n * Configure inline-i18n-multi settings\n *\n * @example\n * configure({\n * fallbackLocale: 'en',\n * fallbackChain: { 'pt-BR': ['pt', 'es', 'en'] },\n * warnOnMissing: true,\n * })\n */\nexport function configure(options: Partial<Config>): void {\n config = { ...config, ...options }\n}\n\n/**\n * Get current configuration\n */\nexport function getConfig(): FullConfig {\n return {\n ...defaultConfig,\n ...config,\n }\n}\n\n/**\n * Reset configuration to defaults\n */\nexport function resetConfig(): void {\n config = { ...defaultConfig }\n}\n\n/**\n * Derive parent locale from BCP 47 tag\n *\n * @example\n * getParentLocale('zh-TW') // => 'zh'\n * getParentLocale('en-US') // => 'en'\n * getParentLocale('en') // => undefined\n */\nexport function getParentLocale(locale: Locale): Locale | undefined {\n const dashIndex = locale.indexOf('-')\n if (dashIndex > 0) {\n return locale.substring(0, dashIndex)\n }\n return undefined\n}\n\n/**\n * Build fallback chain for a locale\n *\n * @example\n * // With autoParentLocale enabled (default)\n * buildFallbackChain('zh-TW') // => ['zh-TW', 'zh', 'en']\n * buildFallbackChain('en-US') // => ['en-US', 'en']\n *\n * // With custom fallback chain\n * configure({ fallbackChain: { 'pt-BR': ['pt', 'es', 'en'] } })\n * buildFallbackChain('pt-BR') // => ['pt-BR', 'pt', 'es', 'en']\n */\nexport function buildFallbackChain(locale: Locale): Locale[] {\n const cfg = getConfig()\n\n // Check for custom chain first\n if (cfg.fallbackChain[locale]) {\n return [locale, ...cfg.fallbackChain[locale]]\n }\n\n const chain: Locale[] = [locale]\n\n // Auto-derive parent locales if enabled\n if (cfg.autoParentLocale) {\n let current = locale\n while (true) {\n const parent = getParentLocale(current)\n if (parent && !chain.includes(parent)) {\n chain.push(parent)\n current = parent\n } else {\n break\n }\n }\n }\n\n // Add final fallback if not already in chain\n const finalFallback = cfg.fallbackLocale\n if (finalFallback && !chain.includes(finalFallback)) {\n chain.push(finalFallback)\n }\n\n return chain\n}\n\n/**\n * Emit a missing translation warning\n */\nexport function emitWarning(warning: TranslationWarning): void {\n const cfg = getConfig()\n if (cfg.warnOnMissing && cfg.onMissingTranslation) {\n cfg.onMissingTranslation(warning)\n }\n}\n\n// ============================================================================\n// Debug Mode (v0.4.0)\n// ============================================================================\n\n/**\n * Debug information for translation output\n */\nexport interface DebugInfo {\n /** True if no translation was found */\n isMissing: boolean\n /** True if a fallback locale was used */\n isFallback: boolean\n /** The locale that was requested */\n requestedLocale: string\n /** The locale that was actually used */\n usedLocale?: string\n /** The translation key (for t() function) */\n key?: string\n}\n\n/**\n * Format translation output with debug information if enabled\n */\nexport function applyDebugFormat(output: string, debugInfo: DebugInfo): string {\n const cfg = getConfig()\n\n if (!cfg.debugMode) {\n return output\n }\n\n const options: DebugModeOptions =\n typeof cfg.debugMode === 'object'\n ? cfg.debugMode\n : { showMissingPrefix: true, showFallbackPrefix: true }\n\n // Handle missing translation\n if (debugInfo.isMissing && options.showMissingPrefix !== false) {\n const prefix = options.missingPrefixFormat\n ? options.missingPrefixFormat(debugInfo.requestedLocale, debugInfo.key)\n : `[MISSING: ${debugInfo.requestedLocale}] `\n return prefix + output\n }\n\n // Handle fallback translation\n if (debugInfo.isFallback && options.showFallbackPrefix !== false && debugInfo.usedLocale) {\n const prefix = options.fallbackPrefixFormat\n ? options.fallbackPrefixFormat(debugInfo.requestedLocale, debugInfo.usedLocale, debugInfo.key)\n : `[${debugInfo.requestedLocale} -> ${debugInfo.usedLocale}] `\n return prefix + output\n }\n\n return output\n}\n","import type { Locale } from './types'\nimport { getConfig } from './config'\n\nlet currentLocale: Locale = 'en'\n\nfunction setCookie(name: string, value: string, days: number): void {\n if (typeof document === 'undefined') return\n const expires = new Date(Date.now() + days * 864e5).toUTCString()\n document.cookie = `${name}=${value}; expires=${expires}; path=/; SameSite=Lax`\n}\n\nfunction getCookie(name: string): string | undefined {\n if (typeof document === 'undefined') return undefined\n const match = document.cookie.match(new RegExp(`(?:^|;\\\\s*)${name}=([^;]*)`))\n return match?.[1]\n}\n\nfunction persistLocaleToStorage(locale: Locale): void {\n const cfg = getConfig()\n if (!cfg.persistLocale) return\n\n const { storage, key = 'LOCALE', expires = 365 } = cfg.persistLocale\n\n if (storage === 'cookie') {\n setCookie(key, locale, expires)\n } else if (storage === 'localStorage') {\n if (typeof localStorage !== 'undefined') {\n try {\n localStorage.setItem(key, locale)\n } catch {\n // localStorage may be full or blocked\n }\n }\n }\n}\n\nexport function setLocale(locale: Locale): void {\n currentLocale = locale\n persistLocaleToStorage(locale)\n}\n\nexport function getLocale(): Locale {\n return currentLocale\n}\n\n/**\n * Restore locale from configured persistent storage.\n * Returns the restored locale, or undefined if nothing was found.\n */\nexport function restoreLocale(): Locale | undefined {\n const cfg = getConfig()\n if (!cfg.persistLocale) return undefined\n\n const { storage, key = 'LOCALE' } = cfg.persistLocale\n let stored: string | undefined\n\n if (storage === 'cookie') {\n stored = getCookie(key)\n } else if (storage === 'localStorage') {\n if (typeof localStorage !== 'undefined') {\n try {\n stored = localStorage.getItem(key) ?? undefined\n } catch {\n // localStorage may be blocked\n }\n }\n }\n\n if (stored) {\n currentLocale = stored\n return stored\n }\n\n return undefined\n}\n","import {\n parse,\n type MessageFormatElement,\n type PluralElement,\n type SelectElement,\n type NumberElement,\n type DateElement,\n type TimeElement,\n isLiteralElement,\n isArgumentElement,\n isPluralElement,\n isSelectElement,\n isPoundElement,\n isNumberElement,\n isDateElement,\n isTimeElement,\n} from '@formatjs/icu-messageformat-parser'\n\nimport { getConfig } from './config'\n\nexport type ICUVars = Record<string, string | number | Date | string[]>\n\n// ============================================================================\n// ICU Parse Cache (v0.7.0)\n// ============================================================================\n\nconst icuCache = new Map<string, MessageFormatElement[]>()\n\n/**\n * Clear the ICU message AST cache\n */\nexport function clearICUCache(): void {\n icuCache.clear()\n}\n\n/**\n * Get a parsed AST from cache, or parse and cache it.\n * Respects the configured icuCacheSize limit (FIFO eviction).\n */\nfunction cachedParse(template: string): MessageFormatElement[] {\n const cached = icuCache.get(template)\n if (cached) return cached\n\n const ast = parse(template)\n\n const cfg = getConfig()\n if (cfg.icuCacheSize > 0) {\n if (icuCache.size >= cfg.icuCacheSize) {\n const firstKey = icuCache.keys().next().value\n if (firstKey !== undefined) {\n icuCache.delete(firstKey)\n }\n }\n icuCache.set(template, ast)\n }\n\n return ast\n}\n\n/**\n * Handle a missing variable — uses custom handler if configured, otherwise returns {varName}\n */\nfunction handleMissingVar(varName: string, locale: string): string {\n const cfg = getConfig()\n if (cfg.missingVarHandler) {\n return cfg.missingVarHandler(varName, locale)\n }\n return `{${varName}}`\n}\n\n// ============================================================================\n// Custom Formatter Registry (v0.6.0)\n// ============================================================================\n\nexport type CustomFormatter = (value: unknown, locale: string, style?: string) => string\n\nconst customFormatters = new Map<string, CustomFormatter>()\n\nconst RESERVED_FORMATTER_NAMES = new Set([\n 'plural', 'select', 'selectordinal',\n 'number', 'date', 'time',\n 'relativeTime', 'list', 'currency',\n])\n\n/**\n * Register a custom formatter\n *\n * @example\n * registerFormatter('phone', (value, locale, style?) => {\n * const s = String(value)\n * return `(${s.slice(0,3)}) ${s.slice(3,6)}-${s.slice(6)}`\n * })\n */\nexport function registerFormatter(name: string, formatter: CustomFormatter): void {\n if (RESERVED_FORMATTER_NAMES.has(name)) {\n throw new Error(`Cannot register formatter \"${name}\": reserved ICU type name`)\n }\n customFormatters.set(name, formatter)\n}\n\n/**\n * Clear all custom formatters\n */\nexport function clearFormatters(): void {\n customFormatters.clear()\n}\n\ninterface CustomFormatterReplacement {\n variable: string\n formatterName: string\n style?: string\n}\n\n/**\n * Build a regex that matches custom formatter patterns\n */\nfunction buildCustomFormatterPattern(): RegExp | null {\n if (customFormatters.size === 0) return null\n const names = [...customFormatters.keys()].map(n => n.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&')).join('|')\n return new RegExp(`\\\\{(\\\\w+),\\\\s*(${names})(?:,\\\\s*(\\\\w+))?\\\\}`, 'g')\n}\n\n/**\n * Preprocess custom formatter patterns before ICU parsing\n */\nfunction preprocessCustomFormatters(template: string): {\n processed: string\n replacements: Map<string, CustomFormatterReplacement>\n} {\n const replacements = new Map<string, CustomFormatterReplacement>()\n const pattern = buildCustomFormatterPattern()\n if (!pattern) return { processed: template, replacements }\n\n let counter = 0\n const processed = template.replace(pattern, (_, variable, formatterName, style) => {\n const placeholder = `__CUSTOM_${counter++}__`\n replacements.set(placeholder, { variable, formatterName, style })\n return `{${placeholder}}`\n })\n return { processed, replacements }\n}\n\n/**\n * Check if template contains custom formatter patterns\n */\nexport function hasCustomFormatter(template: string): boolean {\n const pattern = buildCustomFormatterPattern()\n if (!pattern) return false\n return pattern.test(template)\n}\n\n/**\n * Map ICU date style names to Intl.DateTimeFormat options\n */\nconst DATE_STYLES: Record<string, Intl.DateTimeFormatOptions> = {\n short: { dateStyle: 'short' },\n medium: { dateStyle: 'medium' },\n long: { dateStyle: 'long' },\n full: { dateStyle: 'full' },\n}\n\n/**\n * Map ICU time style names to Intl.DateTimeFormat options\n */\nconst TIME_STYLES: Record<string, Intl.DateTimeFormatOptions> = {\n short: { timeStyle: 'short' },\n medium: { timeStyle: 'medium' },\n long: { timeStyle: 'long' },\n full: { timeStyle: 'full' },\n}\n\n/**\n * Map ICU number style names to Intl.NumberFormat options\n */\nconst NUMBER_STYLES: Record<string, Intl.NumberFormatOptions> = {\n decimal: { style: 'decimal' },\n percent: { style: 'percent' },\n integer: { style: 'decimal', maximumFractionDigits: 0 },\n}\n\n/**\n * Map ICU relative time style names to Intl.RelativeTimeFormat options\n */\nconst RELATIVE_TIME_STYLES: Record<string, Intl.RelativeTimeFormatOptions> = {\n long: { style: 'long', numeric: 'auto' },\n short: { style: 'short', numeric: 'auto' },\n narrow: { style: 'narrow', numeric: 'auto' },\n}\n\n/**\n * Map ICU list type/style names to Intl.ListFormat options\n */\nconst LIST_TYPES: Record<string, Intl.ListFormatType> = {\n conjunction: 'conjunction',\n disjunction: 'disjunction',\n unit: 'unit',\n}\n\nconst LIST_STYLES: Record<string, Intl.ListFormatStyle> = {\n long: 'long',\n short: 'short',\n narrow: 'narrow',\n}\n\n/**\n * Convert value to Date\n */\nfunction toDate(value: string | number | Date): Date {\n if (value instanceof Date) {\n return value\n }\n return new Date(value)\n}\n\n/**\n * Format a number element\n */\nfunction formatNumberElement(\n el: NumberElement,\n vars: ICUVars,\n locale: string\n): string {\n const value = vars[el.value]\n if (value === undefined) {\n return handleMissingVar(el.value, locale)\n }\n\n const num = typeof value === 'number' ? value : Number(value)\n if (isNaN(num)) {\n return handleMissingVar(el.value, locale)\n }\n\n let options: Intl.NumberFormatOptions = {}\n\n if (el.style) {\n if (typeof el.style === 'string') {\n // Check for currency format: \"currency\" or specific currency like \"USD\"\n if (el.style === 'currency') {\n options = { style: 'currency', currency: 'USD' }\n } else if (NUMBER_STYLES[el.style]) {\n options = NUMBER_STYLES[el.style]!\n }\n } else if ('parsedOptions' in el.style) {\n // NumberSkeleton with parsed options\n options = el.style.parsedOptions as Intl.NumberFormatOptions\n }\n }\n\n try {\n return new Intl.NumberFormat(locale, options).format(num)\n } catch {\n return String(num)\n }\n}\n\n/**\n * Format a date element\n */\nfunction formatDateElement(\n el: DateElement,\n vars: ICUVars,\n locale: string\n): string {\n const value = vars[el.value]\n if (value === undefined) {\n return handleMissingVar(el.value, locale)\n }\n\n let options: Intl.DateTimeFormatOptions = {}\n\n if (el.style) {\n if (typeof el.style === 'string') {\n options = DATE_STYLES[el.style] || {}\n } else if ('parsedOptions' in el.style) {\n // DateTimeSkeleton with parsed options\n options = el.style.parsedOptions as Intl.DateTimeFormatOptions\n }\n }\n\n try {\n const date = toDate(value as string | number | Date)\n return new Intl.DateTimeFormat(locale, options).format(date)\n } catch {\n return handleMissingVar(el.value, locale)\n }\n}\n\n/**\n * Format a time element\n */\nfunction formatTimeElement(\n el: TimeElement,\n vars: ICUVars,\n locale: string\n): string {\n const value = vars[el.value]\n if (value === undefined) {\n return handleMissingVar(el.value, locale)\n }\n\n let options: Intl.DateTimeFormatOptions = {}\n\n if (el.style) {\n if (typeof el.style === 'string') {\n options = TIME_STYLES[el.style] || {}\n } else if ('parsedOptions' in el.style) {\n // DateTimeSkeleton with parsed options\n options = el.style.parsedOptions as Intl.DateTimeFormatOptions\n }\n }\n\n try {\n const date = toDate(value as string | number | Date)\n return new Intl.DateTimeFormat(locale, options).format(date)\n } catch {\n return handleMissingVar(el.value, locale)\n }\n}\n\n// ============================================================================\n// Currency Formatting (v0.5.0)\n// ============================================================================\n\ninterface CurrencyReplacement {\n variable: string\n currencyCode: string\n}\n\nconst CURRENCY_PATTERN = /\\{(\\w+),\\s*currency(?:,\\s*(\\w+))?\\}/g\n\n/**\n * Preprocess currency formats before ICU parsing\n */\nfunction preprocessCurrency(template: string): {\n processed: string\n replacements: Map<string, CurrencyReplacement>\n} {\n const replacements = new Map<string, CurrencyReplacement>()\n let counter = 0\n const processed = template.replace(CURRENCY_PATTERN, (_, variable, currencyCode) => {\n const placeholder = `__CURRENCY_${counter++}__`\n replacements.set(placeholder, { variable, currencyCode: currencyCode || 'USD' })\n return `{${placeholder}}`\n })\n return { processed, replacements }\n}\n\n/**\n * Format a currency value\n */\nfunction formatCurrencyValue(\n variableName: string,\n currencyCode: string,\n vars: ICUVars,\n locale: string\n): string {\n const value = vars[variableName]\n if (value === undefined) {\n return handleMissingVar(variableName, locale)\n }\n\n const num = typeof value === 'number' ? value : Number(value)\n if (isNaN(num)) {\n return handleMissingVar(variableName, locale)\n }\n\n try {\n return new Intl.NumberFormat(locale, {\n style: 'currency',\n currency: currencyCode,\n }).format(num)\n } catch {\n return String(num)\n }\n}\n\n// ============================================================================\n// Compact Number Formatting (v0.5.0)\n// ============================================================================\n\ninterface CompactNumberReplacement {\n variable: string\n display: 'short' | 'long'\n}\n\nconst COMPACT_NUMBER_PATTERN = /\\{(\\w+),\\s*number,\\s*(compact|compactLong)\\}/g\n\n/**\n * Preprocess compact number formats before ICU parsing\n */\nfunction preprocessCompactNumber(template: string): {\n processed: string\n replacements: Map<string, CompactNumberReplacement>\n} {\n const replacements = new Map<string, CompactNumberReplacement>()\n let counter = 0\n const processed = template.replace(COMPACT_NUMBER_PATTERN, (_, variable, style) => {\n const placeholder = `__COMPACT_${counter++}__`\n replacements.set(placeholder, {\n variable,\n display: style === 'compactLong' ? 'long' : 'short',\n })\n return `{${placeholder}}`\n })\n return { processed, replacements }\n}\n\n/**\n * Format a compact number value\n */\nfunction formatCompactNumber(\n variableName: string,\n display: 'short' | 'long',\n vars: ICUVars,\n locale: string\n): string {\n const value = vars[variableName]\n if (value === undefined) {\n return handleMissingVar(variableName, locale)\n }\n\n const num = typeof value === 'number' ? value : Number(value)\n if (isNaN(num)) {\n return handleMissingVar(variableName, locale)\n }\n\n try {\n return new Intl.NumberFormat(locale, {\n notation: 'compact',\n compactDisplay: display,\n }).format(num)\n } catch {\n return String(num)\n }\n}\n\n// ============================================================================\n// Relative Time Formatting (v0.4.0)\n// ============================================================================\n\ninterface RelativeTimeUnit {\n value: number\n unit: Intl.RelativeTimeFormatUnit\n}\n\n/**\n * Calculate the best unit for relative time display\n */\nfunction getRelativeTimeUnit(date: Date, now: Date = new Date()): RelativeTimeUnit {\n const diffMs = date.getTime() - now.getTime()\n const diffSeconds = Math.round(diffMs / 1000)\n const diffMinutes = Math.round(diffSeconds / 60)\n const diffHours = Math.round(diffMinutes / 60)\n const diffDays = Math.round(diffHours / 24)\n const diffWeeks = Math.round(diffDays / 7)\n const diffMonths = Math.round(diffDays / 30)\n const diffYears = Math.round(diffDays / 365)\n\n if (Math.abs(diffSeconds) < 60) return { value: diffSeconds, unit: 'second' }\n if (Math.abs(diffMinutes) < 60) return { value: diffMinutes, unit: 'minute' }\n if (Math.abs(diffHours) < 24) return { value: diffHours, unit: 'hour' }\n if (Math.abs(diffDays) < 7) return { value: diffDays, unit: 'day' }\n if (Math.abs(diffWeeks) < 4) return { value: diffWeeks, unit: 'week' }\n if (Math.abs(diffMonths) < 12) return { value: diffMonths, unit: 'month' }\n return { value: diffYears, unit: 'year' }\n}\n\ninterface RelativeTimeReplacement {\n variable: string\n style?: string\n}\n\nconst RELATIVE_TIME_PATTERN = /\\{(\\w+),\\s*relativeTime(?:,\\s*(\\w+))?\\}/g\n\n/**\n * Preprocess relative time formats before ICU parsing\n */\nfunction preprocessRelativeTime(template: string): {\n processed: string\n replacements: Map<string, RelativeTimeReplacement>\n} {\n const replacements = new Map<string, RelativeTimeReplacement>()\n let counter = 0\n const processed = template.replace(RELATIVE_TIME_PATTERN, (_, variable, style) => {\n const placeholder = `__RELTIME_${counter++}__`\n replacements.set(placeholder, { variable, style })\n return `{${placeholder}}`\n })\n return { processed, replacements }\n}\n\n/**\n * Format a relative time value\n */\nfunction formatRelativeTimeValue(\n variableName: string,\n style: string | undefined,\n vars: ICUVars,\n locale: string\n): string {\n const value = vars[variableName]\n if (value === undefined) {\n return handleMissingVar(variableName, locale)\n }\n\n try {\n const date = toDate(value as string | number | Date)\n const { value: relValue, unit } = getRelativeTimeUnit(date)\n const options = (style && RELATIVE_TIME_STYLES[style]) || RELATIVE_TIME_STYLES.long\n return new Intl.RelativeTimeFormat(locale, options).format(relValue, unit)\n } catch {\n return handleMissingVar(variableName, locale)\n }\n}\n\n// ============================================================================\n// List Formatting (v0.4.0)\n// ============================================================================\n\ninterface ListReplacement {\n variable: string\n type?: string\n style?: string\n}\n\nconst LIST_PATTERN = /\\{(\\w+),\\s*list(?:,\\s*(\\w+))?(?:,\\s*(\\w+))?\\}/g\n\n/**\n * Preprocess list formats before ICU parsing\n */\nfunction preprocessList(template: string): {\n processed: string\n replacements: Map<string, ListReplacement>\n} {\n const replacements = new Map<string, ListReplacement>()\n let counter = 0\n const processed = template.replace(LIST_PATTERN, (_, variable, arg1, arg2) => {\n const placeholder = `__LIST_${counter++}__`\n let type: string | undefined\n let style: string | undefined\n\n if (arg1) {\n if (LIST_TYPES[arg1]) {\n type = arg1\n style = arg2\n } else if (LIST_STYLES[arg1]) {\n style = arg1\n }\n }\n\n replacements.set(placeholder, { variable, type, style })\n return `{${placeholder}}`\n })\n return { processed, replacements }\n}\n\n/**\n * Format a list value\n */\nfunction formatListValue(\n variableName: string,\n type: string | undefined,\n style: string | undefined,\n vars: ICUVars,\n locale: string\n): string {\n const value = vars[variableName]\n if (value === undefined || !Array.isArray(value)) {\n return handleMissingVar(variableName, locale)\n }\n\n const options: Intl.ListFormatOptions = {\n type: (type as Intl.ListFormatType) || 'conjunction',\n style: (style as Intl.ListFormatStyle) || 'long',\n }\n\n try {\n return new Intl.ListFormat(locale, options).format(value)\n } catch {\n return value.join(', ')\n }\n}\n\n// ============================================================================\n// Plural Shorthand (v0.7.0)\n// ============================================================================\n\nconst PLURAL_SHORTHAND_PATTERN = /\\{(\\w+),\\s*p,\\s*([^}]+)\\}/g\n\n/**\n * Check if template contains plural shorthand patterns\n */\nexport function hasPluralShorthand(template: string): boolean {\n PLURAL_SHORTHAND_PATTERN.lastIndex = 0\n return PLURAL_SHORTHAND_PATTERN.test(template)\n}\n\n/**\n * Preprocess plural shorthand syntax before ICU parsing.\n *\n * {count, p, item|items} -> {count, plural, one {# item} other {# items}}\n * {count, p, none|item|items} -> {count, plural, =0 {none} one {# item} other {# items}}\n */\nfunction preprocessPluralShorthand(template: string): string {\n PLURAL_SHORTHAND_PATTERN.lastIndex = 0\n return template.replace(PLURAL_SHORTHAND_PATTERN, (_, variable, args) => {\n const parts = args.split('|').map((s: string) => s.trim())\n\n if (parts.length === 2) {\n const [singular, plural] = parts\n return `{${variable}, plural, one {# ${singular}} other {# ${plural}}}`\n }\n\n if (parts.length === 3) {\n const [zero, singular, plural] = parts\n return `{${variable}, plural, =0 {${zero}} one {# ${singular}} other {# ${plural}}}`\n }\n\n // If not 2 or 3 parts, return original\n return `{${variable}, p, ${args}}`\n })\n}\n\n/**\n * Parse and format an ICU Message Format string\n */\nexport function interpolateICU(\n template: string,\n vars: ICUVars,\n locale: string\n): string {\n // Expand plural shorthand to standard ICU plural (must be first)\n const afterPluralShorthand = preprocessPluralShorthand(template)\n\n // Pre-process custom formats (not natively supported by ICU parser)\n const { processed: afterCustom, replacements: customReplacements } = preprocessCustomFormatters(afterPluralShorthand)\n const { processed: afterCurrency, replacements: currencyReplacements } = preprocessCurrency(afterCustom)\n const { processed: afterCompact, replacements: compactReplacements } = preprocessCompactNumber(afterCurrency)\n const { processed: afterRelTime, replacements: relTimeReplacements } = preprocessRelativeTime(afterCompact)\n const { processed: afterList, replacements: listReplacements } = preprocessList(afterRelTime)\n\n const ast = cachedParse(afterList)\n let result = formatElements(ast, vars, locale, null)\n\n // Post-process custom formatter placeholders\n for (const [placeholder, { variable, formatterName, style }] of customReplacements) {\n const value = vars[variable]\n let formatted: string\n if (value === undefined) {\n formatted = handleMissingVar(variable, locale)\n } else {\n const formatter = customFormatters.get(formatterName)\n formatted = formatter ? formatter(value, locale, style) : String(value)\n }\n result = result.replace(`{${placeholder}}`, formatted)\n }\n\n // Post-process currency placeholders\n for (const [placeholder, { variable, currencyCode }] of currencyReplacements) {\n const formatted = formatCurrencyValue(variable, currencyCode, vars, locale)\n result = result.replace(`{${placeholder}}`, formatted)\n }\n\n // Post-process compact number placeholders\n for (const [placeholder, { variable, display }] of compactReplacements) {\n const formatted = formatCompactNumber(variable, display, vars, locale)\n result = result.replace(`{${placeholder}}`, formatted)\n }\n\n // Post-process relativeTime placeholders\n for (const [placeholder, { variable, style }] of relTimeReplacements) {\n const formatted = formatRelativeTimeValue(variable, style, vars, locale)\n result = result.replace(`{${placeholder}}`, formatted)\n }\n\n // Post-process list placeholders\n for (const [placeholder, { variable, type, style }] of listReplacements) {\n const formatted = formatListValue(variable, type, style, vars, locale)\n result = result.replace(`{${placeholder}}`, formatted)\n }\n\n return result\n}\n\nfunction formatElements(\n elements: MessageFormatElement[],\n vars: ICUVars,\n locale: string,\n currentPluralValue: number | null\n): string {\n return elements\n .map((el) => formatElement(el, vars, locale, currentPluralValue))\n .join('')\n}\n\nfunction formatElement(\n el: MessageFormatElement,\n vars: ICUVars,\n locale: string,\n currentPluralValue: number | null\n): string {\n if (isLiteralElement(el)) {\n return el.value\n }\n\n if (isArgumentElement(el)) {\n const value = vars[el.value]\n if (value !== undefined) return String(value)\n // Preprocessor placeholders (__CURRENCY_0__, __COMPACT_0__, etc.) must keep\n // their {placeholder} format so postprocessing can find and replace them\n if (el.value.startsWith('__') && el.value.endsWith('__')) {\n return `{${el.value}}`\n }\n return handleMissingVar(el.value, locale)\n }\n\n if (isPoundElement(el)) {\n // # is replaced with the current plural value\n return currentPluralValue !== null ? String(currentPluralValue) : '#'\n }\n\n if (isPluralElement(el)) {\n return formatPlural(el, vars, locale)\n }\n\n if (isSelectElement(el)) {\n return formatSelect(el, vars, locale)\n }\n\n if (isNumberElement(el)) {\n return formatNumberElement(el, vars, locale)\n }\n\n if (isDateElement(el)) {\n return formatDateElement(el, vars, locale)\n }\n\n if (isTimeElement(el)) {\n return formatTimeElement(el, vars, locale)\n }\n\n // Tag elements - not supported yet\n return ''\n}\n\nfunction formatPlural(\n el: PluralElement,\n vars: ICUVars,\n locale: string\n): string {\n const value = vars[el.value]\n if (typeof value !== 'number') {\n return handleMissingVar(el.value, locale)\n }\n\n const adjustedValue = value - el.offset\n const pluralRules = new Intl.PluralRules(locale, { type: el.pluralType })\n const category = pluralRules.select(adjustedValue)\n\n // Try exact match first (=0, =1, =2, etc.)\n const exactKey = `=${value}`\n if (el.options[exactKey]) {\n return formatElements(el.options[exactKey].value, vars, locale, adjustedValue)\n }\n\n // Then try plural category (zero, one, two, few, many, other)\n if (el.options[category]) {\n return formatElements(el.options[category].value, vars, locale, adjustedValue)\n }\n\n // Fallback to 'other'\n if (el.options.other) {\n return formatElements(el.options.other.value, vars, locale, adjustedValue)\n }\n\n return handleMissingVar(el.value, locale)\n}\n\nfunction formatSelect(\n el: SelectElement,\n vars: ICUVars,\n locale: string\n): string {\n const value = vars[el.value]\n const key = String(value)\n\n // Try exact match\n if (el.options[key]) {\n return formatElements(el.options[key].value, vars, locale, null)\n }\n\n // Fallback to 'other'\n if (el.options.other) {\n return formatElements(el.options.other.value, vars, locale, null)\n }\n\n return handleMissingVar(el.value, locale)\n}\n\n// Pattern to detect ICU format (plural, select, selectordinal, number, date, time, relativeTime, list)\nexport const ICU_PATTERN = /\\{[^}]+,\\s*(plural|select|selectordinal|number|date|time|relativeTime|list|currency|p)\\s*[,}]/\n\n/**\n * Check if a template contains ICU Message Format patterns\n */\nexport function hasICUPattern(template: string): boolean {\n return ICU_PATTERN.test(template)\n}\n","import type { TranslationVars } from './types'\nimport { getConfig } from './config'\nimport { hasICUPattern, hasCustomFormatter, hasPluralShorthand, interpolateICU } from './icu'\n\nconst VARIABLE_PATTERN = /\\{(\\w+)\\}/g\n\nexport function interpolate(\n template: string,\n vars?: TranslationVars,\n locale?: string,\n): string {\n const resolvedLocale = locale || 'en'\n\n // ICU Message Format (plural, select) or custom formatters\n if (hasICUPattern(template) || hasCustomFormatter(template) || hasPluralShorthand(template)) {\n if (!vars) {\n // Even without vars, handler should process missing variables\n const cfg = getConfig()\n if (cfg.missingVarHandler) {\n return interpolateICU(template, {}, resolvedLocale)\n }\n return template\n }\n return interpolateICU(template, vars, resolvedLocale)\n }\n\n // Simple variable substitution\n if (!vars) {\n const cfg = getConfig()\n if (cfg.missingVarHandler) {\n return template.replace(VARIABLE_PATTERN, (_, key) => {\n return cfg.missingVarHandler!(key, resolvedLocale)\n })\n }\n return template\n }\n\n return template.replace(VARIABLE_PATTERN, (_, key) => {\n const value = vars[key]\n if (value !== undefined) return String(value)\n const cfg = getConfig()\n if (cfg.missingVarHandler) {\n return cfg.missingVarHandler(key, resolvedLocale)\n }\n return `{${key}}`\n })\n}\n","import type { Translations, TranslationVars } from './types'\nimport { getLocale } from './context'\nimport { interpolate } from './interpolation'\nimport { buildFallbackChain, emitWarning, applyDebugFormat, type DebugInfo } from './config'\n\ninterface ResolveResult {\n template: string\n locale: string\n debugInfo: DebugInfo\n}\n\nfunction resolveTemplate(translations: Translations): ResolveResult {\n const locale = getLocale()\n const availableLocales = Object.keys(translations)\n const fallbackChain = buildFallbackChain(locale)\n\n // Try each locale in the fallback chain\n for (const tryLocale of fallbackChain) {\n const template = translations[tryLocale]\n if (template) {\n const isFallback = tryLocale !== locale\n // Warn if we had to fall back\n if (isFallback) {\n emitWarning({\n type: 'missing_translation',\n requestedLocale: locale,\n availableLocales,\n fallbackUsed: tryLocale,\n })\n }\n return {\n template,\n locale: tryLocale,\n debugInfo: {\n isMissing: false,\n isFallback,\n requestedLocale: locale,\n usedLocale: tryLocale,\n },\n }\n }\n }\n\n // Last resort: use first available translation\n const firstAvailable = Object.entries(translations)[0]\n if (firstAvailable) {\n emitWarning({\n type: 'missing_translation',\n requestedLocale: locale,\n availableLocales,\n fallbackUsed: firstAvailable[0],\n })\n return {\n template: firstAvailable[1],\n locale: firstAvailable[0],\n debugInfo: {\n isMissing: false,\n isFallback: true,\n requestedLocale: locale,\n usedLocale: firstAvailable[0],\n },\n }\n }\n\n throw new Error(\n `No translation found for locale \"${locale}\". Available: ${availableLocales.join(', ')}`\n )\n}\n\n/**\n * Translate with two languages (shorthand)\n * @param ko - Korean text\n * @param en - English text\n * @param vars - Variables for interpolation\n */\nexport function it(ko: string, en: string, vars?: TranslationVars): string\n\n/**\n * Translate with multiple languages (object syntax)\n * @param translations - Translation map with locale keys\n * @param vars - Variables for interpolation\n */\nexport function it(translations: Translations, vars?: TranslationVars): string\n\nexport function it(\n first: string | Translations,\n second?: string | TranslationVars,\n third?: TranslationVars,\n): string {\n // object syntax: it({ ko: '...', en: '...' }, vars?)\n if (typeof first === 'object') {\n const translations = first\n const vars = second as TranslationVars | undefined\n const { template, locale, debugInfo } = resolveTemplate(translations)\n const result = interpolate(template, vars, locale)\n return applyDebugFormat(result, debugInfo)\n }\n\n // shorthand syntax: it('한글', 'English', vars?)\n const ko = first\n const en = second as string\n const vars = third\n\n const translations: Translations = { ko, en }\n const { template, locale, debugInfo } = resolveTemplate(translations)\n const result = interpolate(template, vars, locale)\n return applyDebugFormat(result, debugInfo)\n}\n","import type { Translations, TranslationVars } from './types'\nimport { getLocale } from './context'\nimport { interpolate } from './interpolation'\nimport { buildFallbackChain, emitWarning } from './config'\n\n/**\n * Runtime lookup function for build-tool-transformed code.\n *\n * @deprecated Will be removed in v1.0.0\n * @param _hash - Content hash (for caching/debugging, unused at runtime)\n * @param translations - Translation map with locale keys\n * @param vars - Variables for interpolation\n */\nexport function __i18n_lookup(\n _hash: string,\n translations: Translations,\n vars?: TranslationVars\n): string {\n const locale = getLocale()\n const availableLocales = Object.keys(translations)\n const fallbackChain = buildFallbackChain(locale)\n\n // Try each locale in the fallback chain\n for (const tryLocale of fallbackChain) {\n const template = translations[tryLocale]\n if (template) {\n // Warn if we had to fall back\n if (tryLocale !== locale) {\n emitWarning({\n type: 'missing_translation',\n requestedLocale: locale,\n availableLocales,\n fallbackUsed: tryLocale,\n })\n }\n return interpolate(template, vars, tryLocale)\n }\n }\n\n // Last resort: use first available translation\n const firstAvailable = Object.entries(translations)[0]\n if (firstAvailable) {\n emitWarning({\n type: 'missing_translation',\n requestedLocale: locale,\n availableLocales,\n fallbackUsed: firstAvailable[0],\n })\n return interpolate(firstAvailable[1], vars, firstAvailable[0])\n }\n\n throw new Error(\n `No translation found for locale \"${locale}\". Available: ${availableLocales.join(', ')}`\n )\n}\n\n// @deprecated - Will be removed in v1.0.0\n// Register __i18n_lookup globally for backward compatibility\nif (typeof globalThis !== 'undefined') {\n (globalThis as Record<string, unknown>).__i18n_lookup = __i18n_lookup\n}\n","import type { Locale, Translations, TranslationVars } from './types'\nimport { it } from './translate'\n\ntype PairFunction = (\n text1: string,\n text2: string,\n vars?: TranslationVars,\n) => string\n\nfunction createPair(lang1: Locale, lang2: Locale): PairFunction {\n return (text1, text2, vars) => {\n const translations: Translations = {\n [lang1]: text1,\n [lang2]: text2,\n }\n return it(translations, vars)\n }\n}\n\n// Korean combinations\nexport const it_ja = createPair('ko', 'ja')\nexport const it_zh = createPair('ko', 'zh')\nexport const it_es = createPair('ko', 'es')\nexport const it_fr = createPair('ko', 'fr')\nexport const it_de = createPair('ko', 'de')\n\n// English combinations\nexport const en_ja = createPair('en', 'ja')\nexport const en_zh = createPair('en', 'zh')\nexport const en_es = createPair('en', 'es')\nexport const en_fr = createPair('en', 'fr')\nexport const en_de = createPair('en', 'de')\n\n// Other combinations\nexport const ja_zh = createPair('ja', 'zh')\nexport const ja_es = createPair('ja', 'es')\nexport const zh_es = createPair('zh', 'es')\n","import { getLocale } from './context'\nimport type { Locale, TranslationVars } from './types'\nimport { interpolate } from './interpolation'\nimport { buildFallbackChain, emitWarning, applyDebugFormat, getConfig, type DebugInfo } from './config'\n\n/**\n * Nested dictionary structure for translations\n * @example { greeting: { hello: \"Hello\", goodbye: \"Goodbye\" } }\n */\nexport type Dictionary = {\n [key: string]: string | Dictionary\n}\n\n/**\n * All loaded dictionaries by locale\n */\nexport type Dictionaries = Record<Locale, Dictionary>\n\n/**\n * Namespaced dictionaries storage\n * Structure: { namespace: { locale: Dictionary } }\n */\ntype NamespacedDictionaries = Record<string, Dictionaries>\n\n/**\n * Plural rules configuration\n */\nexport interface PluralRules {\n zero?: string\n one?: string\n two?: string\n few?: string\n many?: string\n other: string\n}\n\n// Default namespace for backward compatibility\nconst DEFAULT_NAMESPACE = 'default'\n\n// Namespace separator in keys\nconst NAMESPACE_SEPARATOR = ':'\n\n// Global dictionary storage - now namespaced\nlet namespacedDictionaries: NamespacedDictionaries = {}\n\n// Lazy loading state tracking (v0.5.0)\nlet loadingState: Record<string, 'loading' | 'loaded' | 'error'> = {}\nconst loadingPromises = new Map<string, Promise<void>>()\n\nfunction getLoadingKey(locale: Locale, namespace: string): string {\n return `${namespace}:${locale}`\n}\n\n/**\n * Parse a key that may contain a namespace prefix\n * @example\n * parseKey('common:greeting') // { namespace: 'common', key: 'greeting' }\n * parseKey('greeting') // { namespace: 'default', key: 'greeting' }\n */\nfunction parseKey(fullKey: string): { namespace: string; key: string } {\n const separatorIndex = fullKey.indexOf(NAMESPACE_SEPARATOR)\n if (separatorIndex > 0) {\n return {\n namespace: fullKey.substring(0, separatorIndex),\n key: fullKey.substring(separatorIndex + 1),\n }\n }\n return {\n namespace: DEFAULT_NAMESPACE,\n key: fullKey,\n }\n}\n\n/**\n * Load translations from dictionary objects\n * @param dicts - Dictionary objects keyed by locale\n * @param namespace - Optional namespace (defaults to 'default')\n * @example\n * // Without namespace (backward compatible)\n * loadDictionaries({\n * en: { greeting: { hello: \"Hello\" } },\n * ko: { greeting: { hello: \"안녕하세요\" } }\n * })\n *\n * // With namespace\n * loadDictionaries({\n * en: { hello: \"Hello\" },\n * ko: { hello: \"안녕하세요\" }\n * }, 'common')\n */\nexport function loadDictionaries(dicts: Dictionaries, namespace?: string): void {\n const ns = namespace || DEFAULT_NAMESPACE\n if (!namespacedDictionaries[ns]) {\n namespacedDictionaries[ns] = {}\n }\n namespacedDictionaries[ns] = {\n ...namespacedDictionaries[ns],\n ...dicts,\n }\n}\n\n/**\n * Load a single locale's dictionary\n * @param locale - Locale code\n * @param dict - Dictionary object\n * @param namespace - Optional namespace (defaults to 'default')\n */\nexport function loadDictionary(locale: Locale, dict: Dictionary, namespace?: string): void {\n const ns = namespace || DEFAULT_NAMESPACE\n if (!namespacedDictionaries[ns]) {\n namespacedDictionaries[ns] = {}\n }\n namespacedDictionaries[ns][locale] = {\n ...namespacedDictionaries[ns][locale],\n ...dict,\n }\n}\n\n/**\n * Clear loaded dictionaries\n * @param namespace - Optional namespace to clear (clears all if not specified)\n */\nexport function clearDictionaries(namespace?: string): void {\n if (namespace) {\n delete namespacedDictionaries[namespace]\n // Clear loading state for this namespace\n for (const key of Object.keys(loadingState)) {\n if (key.startsWith(`${namespace}:`)) {\n delete loadingState[key]\n loadingPromises.delete(key)\n }\n }\n } else {\n namespacedDictionaries = {}\n loadingState = {}\n loadingPromises.clear()\n }\n}\n\n/**\n * Asynchronously load a dictionary using the configured loader\n * @param locale - Locale to load\n * @param namespace - Optional namespace (defaults to 'default')\n * @throws Error if no loader is configured\n *\n * @example\n * configure({ loader: (locale, ns) => import(`./locales/${locale}/${ns}.json`) })\n * await loadAsync('ko', 'dashboard')\n * t('dashboard:title')\n */\nexport async function loadAsync(locale: Locale, namespace?: string): Promise<void> {\n const ns = namespace || DEFAULT_NAMESPACE\n const cfg = getConfig()\n\n if (!cfg.loader) {\n throw new Error('No loader configured. Call configure({ loader: ... }) first.')\n }\n\n const key = getLoadingKey(locale, ns)\n\n // Skip if already loaded\n if (loadingState[key] === 'loaded') return\n\n // Deduplicate concurrent calls\n if (loadingPromises.has(key)) {\n return loadingPromises.get(key)!\n }\n\n const promise = (async () => {\n loadingState[key] = 'loading'\n try {\n const dict = await cfg.loader!(locale, ns)\n loadDictionary(locale, dict as Dictionary, ns)\n loadingState[key] = 'loaded'\n } catch (error) {\n loadingState[key] = 'error'\n throw error\n } finally {\n loadingPromises.delete(key)\n }\n })()\n\n loadingPromises.set(key, promise)\n return promise\n}\n\n/**\n * Check if a dictionary has been loaded for a locale/namespace\n * @param locale - Locale to check\n * @param namespace - Optional namespace (defaults to 'default')\n */\nexport function isLoaded(locale: Locale, namespace?: string): boolean {\n const ns = namespace || DEFAULT_NAMESPACE\n const key = getLoadingKey(locale, ns)\n return loadingState[key] === 'loaded'\n}\n\n/**\n * Get a nested value from dictionary using dot notation\n * @param dict - Dictionary object\n * @param key - Dot-separated key path\n */\nfunction getNestedValue(dict: Dictionary, key: string): string | undefined {\n const parts = key.split('.')\n let current: string | Dictionary | undefined = dict\n\n for (const part of parts) {\n if (typeof current !== 'object' || current === null) {\n return undefined\n }\n current = current[part]\n if (current === undefined) {\n return undefined\n }\n }\n\n return typeof current === 'string' ? current : undefined\n}\n\n/**\n * Get plural category using Intl.PluralRules\n */\nfunction getPluralCategory(count: number, locale: Locale): Intl.LDMLPluralRule {\n const rules = new Intl.PluralRules(locale)\n return rules.select(count)\n}\n\n/**\n * Try to find a translation in a dictionary, handling plurals\n */\nfunction findInDictionary(\n dict: Dictionary,\n key: string,\n vars: TranslationVars | undefined,\n locale: Locale\n): string | undefined {\n let template = getNestedValue(dict, key)\n\n // Handle plurals if count is provided\n if (vars && typeof vars.count === 'number') {\n const pluralKey = `${key}_${getPluralCategory(vars.count, locale)}`\n const pluralTemplate = getNestedValue(dict, pluralKey)\n if (pluralTemplate) {\n template = pluralTemplate\n }\n }\n\n return template\n}\n\n/**\n * Translate using key-based lookup (i18n compatible)\n * @param key - Dot-separated translation key, optionally prefixed with namespace\n * @param vars - Variables for interpolation (including 'count' for plurals)\n * @param locale - Override locale (optional)\n * @example\n * t('greeting.hello') // Uses default namespace\n * t('common:greeting.hello') // Uses 'common' namespace\n * t('items.count', { count: 5 }) // \"5 items\"\n */\nexport function t(\n key: string,\n vars?: TranslationVars,\n locale?: Locale\n): string {\n const { namespace, key: actualKey } = parseKey(key)\n const currentLocale = locale ?? getLocale()\n const fallbackChain = buildFallbackChain(currentLocale)\n\n const nsDictionaries = namespacedDictionaries[namespace] || {}\n const availableLocales = Object.keys(nsDictionaries)\n\n let template: string | undefined\n let usedLocale: Locale | undefined\n\n // Try each locale in the fallback chain\n for (const tryLocale of fallbackChain) {\n const dict = nsDictionaries[tryLocale]\n if (!dict) continue\n\n const found = findInDictionary(dict, actualKey, vars, tryLocale)\n if (found) {\n template = found\n usedLocale = tryLocale\n break\n }\n }\n\n if (!template) {\n emitWarning({\n type: 'missing_translation',\n key,\n requestedLocale: currentLocale,\n availableLocales,\n })\n\n const debugInfo: DebugInfo = {\n isMissing: true,\n isFallback: false,\n requestedLocale: currentLocale,\n key,\n }\n return applyDebugFormat(key, debugInfo)\n }\n\n const isFallback = usedLocale !== currentLocale\n\n // Warn if we used a fallback\n if (isFallback) {\n emitWarning({\n type: 'missing_translation',\n key,\n requestedLocale: currentLocale,\n availableLocales,\n fallbackUsed: usedLocale,\n })\n }\n\n const result = interpolate(template, vars, usedLocale || currentLocale)\n\n const debugInfo: DebugInfo = {\n isMissing: false,\n isFallback,\n requestedLocale: currentLocale,\n usedLocale,\n key,\n }\n\n return applyDebugFormat(result, debugInfo)\n}\n\n/**\n * Check if a translation key exists\n * @param key - Translation key (may include namespace prefix)\n * @param locale - Optional locale to check\n */\nexport function hasTranslation(key: string, locale?: Locale): boolean {\n const { namespace, key: actualKey } = parseKey(key)\n const currentLocale = locale ?? getLocale()\n const nsDictionaries = namespacedDictionaries[namespace] || {}\n const dict = nsDictionaries[currentLocale]\n return dict ? getNestedValue(dict, actualKey) !== undefined : false\n}\n\n/**\n * Get all loaded locales\n * @param namespace - Optional namespace (returns from all if not specified)\n */\nexport function getLoadedLocales(namespace?: string): Locale[] {\n if (namespace) {\n return Object.keys(namespacedDictionaries[namespace] || {})\n }\n // Return unique locales across all namespaces\n const locales = new Set<Locale>()\n for (const ns of Object.values(namespacedDictionaries)) {\n for (const locale of Object.keys(ns)) {\n locales.add(locale)\n }\n }\n return Array.from(locales)\n}\n\n/**\n * Get dictionary for a specific locale\n * @param locale - Locale code\n * @param namespace - Optional namespace (defaults to 'default')\n */\nexport function getDictionary(locale: Locale, namespace?: string): Dictionary | undefined {\n const ns = namespace || DEFAULT_NAMESPACE\n return namespacedDictionaries[ns]?.[locale]\n}\n\n/**\n * Get all loaded namespaces\n */\nexport function getLoadedNamespaces(): string[] {\n return Object.keys(namespacedDictionaries)\n}\n","import type { Locale } from './types'\nimport { getParentLocale } from './config'\n\nexport type DetectSource = 'navigator' | 'cookie' | 'url' | 'header'\n\nexport interface DetectLocaleOptions {\n /** Locales your app supports */\n supportedLocales: Locale[]\n /** Fallback when no source matches */\n defaultLocale: Locale\n /** Detection sources in priority order (default: ['navigator']) */\n sources?: DetectSource[]\n /** Cookie name to read (default: 'NEXT_LOCALE') */\n cookieName?: string\n /** Accept-Language header value (for SSR) */\n headerValue?: string\n}\n\n/**\n * Try to match a candidate locale against supported locales\n * Supports exact match and BCP 47 parent matching (e.g., en-US → en)\n */\nfunction matchLocale(candidate: string, supportedLocales: Locale[]): Locale | undefined {\n const normalized = candidate.trim().toLowerCase()\n // Exact match (case-insensitive)\n const exact = supportedLocales.find(l => l.toLowerCase() === normalized)\n if (exact) return exact\n\n // BCP 47 parent match\n const parent = getParentLocale(candidate)\n if (parent) {\n const parentMatch = supportedLocales.find(l => l.toLowerCase() === parent.toLowerCase())\n if (parentMatch) return parentMatch\n }\n\n return undefined\n}\n\n/**\n * Detect locale from browser navigator.languages\n */\nfunction detectFromNavigator(supportedLocales: Locale[]): Locale | undefined {\n if (typeof globalThis === 'undefined') return undefined\n const nav = (globalThis as { navigator?: { languages?: readonly string[]; language?: string } }).navigator\n if (!nav) return undefined\n\n const languages = nav.languages || (nav.language ? [nav.language] : [])\n for (const lang of languages) {\n const match = matchLocale(lang, supportedLocales)\n if (match) return match\n }\n return undefined\n}\n\n/**\n * Detect locale from document.cookie\n */\nfunction detectFromCookie(supportedLocales: Locale[], cookieName: string): Locale | undefined {\n if (typeof document === 'undefined') return undefined\n\n const cookies = document.cookie.split(';')\n for (const cookie of cookies) {\n const [key, value] = cookie.split('=').map(s => s.trim())\n if (key === cookieName && value) {\n return matchLocale(value, supportedLocales)\n }\n }\n return undefined\n}\n\n/**\n * Detect locale from URL pathname (e.g., /ko/about → ko)\n */\nfunction detectFromUrl(supportedLocales: Locale[]): Locale | undefined {\n if (typeof location === 'undefined') return undefined\n\n const pathname = location.pathname\n // Match first path segment: /ko/... or /en-US/...\n const match = pathname.match(/^\\/([a-zA-Z]{2}(?:-[a-zA-Z]{2,})?)(?:\\/|$)/)\n if (match?.[1]) {\n return matchLocale(match[1], supportedLocales)\n }\n return undefined\n}\n\n/**\n * Parse Accept-Language header value\n * e.g., \"ko-KR,ko;q=0.9,en-US;q=0.8,en;q=0.7\"\n */\nfunction detectFromHeader(supportedLocales: Locale[], headerValue?: string): Locale | undefined {\n if (!headerValue) return undefined\n\n const entries = headerValue\n .split(',')\n .map(part => {\n const parts = part.trim().split(';')\n const lang = parts[0]?.trim() || ''\n const qStr = parts[1]\n const q = qStr ? parseFloat(qStr.replace(/q=/, '')) : 1.0\n return { lang, q }\n })\n .sort((a, b) => b.q - a.q)\n\n for (const { lang } of entries) {\n const match = matchLocale(lang, supportedLocales)\n if (match) return match\n }\n return undefined\n}\n\n/**\n * Auto-detect the user's locale from multiple sources\n *\n * @example\n * const locale = detectLocale({\n * supportedLocales: ['en', 'ko', 'ja'],\n * defaultLocale: 'en',\n * sources: ['cookie', 'navigator'],\n * cookieName: 'NEXT_LOCALE',\n * })\n */\nexport function detectLocale(options: DetectLocaleOptions): Locale {\n const {\n supportedLocales,\n defaultLocale,\n sources = ['navigator'],\n cookieName = 'NEXT_LOCALE',\n headerValue,\n } = options\n\n for (const source of sources) {\n let detected: Locale | undefined\n switch (source) {\n case 'navigator':\n detected = detectFromNavigator(supportedLocales)\n break\n case 'cookie':\n detected = detectFromCookie(supportedLocales, cookieName)\n break\n case 'url':\n detected = detectFromUrl(supportedLocales)\n break\n case 'header':\n detected = detectFromHeader(supportedLocales, headerValue)\n break\n }\n if (detected) return detected\n }\n\n return defaultLocale\n}\n","import type { Locale, TranslationVars } from './types'\nimport { t } from './dictionary'\n\n/**\n * Create a scoped translation function for a given namespace.\n * Returns a `t()` wrapper that auto-prepends the namespace prefix.\n *\n * @param namespace - Namespace to scope to\n * @returns Scoped translation function\n *\n * @example\n * const tc = createScope('common')\n * tc('greeting') // equivalent to t('common:greeting')\n * tc('nav.home') // equivalent to t('common:nav.home')\n * tc('welcome', { name: 'John' })\n */\nexport function createScope(\n namespace: string\n): (key: string, vars?: TranslationVars, locale?: Locale) => string {\n return (key: string, vars?: TranslationVars, locale?: Locale): string => {\n return t(`${namespace}:${key}`, vars, locale)\n }\n}\n","/**\n * Rich Text segment types\n */\nexport interface RichTextSegment {\n type: 'text' | 'component'\n content: string\n /** Component name (only for type === 'component') */\n componentName?: string\n}\n\n/**\n * Escape special regex characters\n */\nfunction escapeRegExp(str: string): string {\n return str.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&')\n}\n\n/**\n * Parse a template string into rich text segments.\n * Matches patterns like <name>content</name> for each component name.\n *\n * @param template - The template string with component tags\n * @param componentNames - Array of valid component names to match\n * @returns Array of segments (text or component)\n *\n * @example\n * parseRichText('Read <link>terms</link> and <bold>agree</bold>', ['link', 'bold'])\n * // [\n * // { type: 'text', content: 'Read ' },\n * // { type: 'component', content: 'terms', componentName: 'link' },\n * // { type: 'text', content: ' and ' },\n * // { type: 'component', content: 'agree', componentName: 'bold' },\n * // ]\n */\nexport function parseRichText(\n template: string,\n componentNames: string[]\n): RichTextSegment[] {\n if (componentNames.length === 0) {\n return [{ type: 'text', content: template }]\n }\n\n const segments: RichTextSegment[] = []\n const namesPattern = componentNames.map(escapeRegExp).join('|')\n const regex = new RegExp(`<(${namesPattern})>(.*?)</\\\\1>`, 'gs')\n\n let lastIndex = 0\n let match: RegExpExecArray | null\n\n while ((match = regex.exec(template)) !== null) {\n // Text before the match\n if (match.index > lastIndex) {\n segments.push({\n type: 'text',\n content: template.slice(lastIndex, match.index),\n })\n }\n\n // Component segment\n segments.push({\n type: 'component',\n content: match[2] ?? '',\n componentName: match[1],\n })\n\n lastIndex = match.index + match[0].length\n }\n\n // Trailing text\n if (lastIndex < template.length) {\n segments.push({\n type: 'text',\n content: template.slice(lastIndex),\n })\n }\n\n return segments\n}\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "inline-i18n-multi",
3
- "version": "0.7.0",
3
+ "version": "0.8.0",
4
4
  "description": "Inline i18n - write translations inline, support multiple languages",
5
5
  "main": "./dist/index.js",
6
6
  "module": "./dist/index.mjs",