@vielzeug/lingua 26.11.11 → 26.11.13

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (49) hide show
  1. package/dist/_resources.cjs +1 -1
  2. package/dist/_resources.cjs.map +1 -1
  3. package/dist/_resources.d.ts +2 -3
  4. package/dist/_resources.d.ts.map +1 -1
  5. package/dist/_resources.js +2 -4
  6. package/dist/_resources.js.map +1 -1
  7. package/dist/_template.cjs +1 -1
  8. package/dist/_template.cjs.map +1 -1
  9. package/dist/_template.d.ts +0 -2
  10. package/dist/_template.d.ts.map +1 -1
  11. package/dist/_template.js +1 -15
  12. package/dist/_template.js.map +1 -1
  13. package/dist/errors.cjs +1 -1
  14. package/dist/errors.cjs.map +1 -1
  15. package/dist/errors.d.ts +0 -2
  16. package/dist/errors.d.ts.map +1 -1
  17. package/dist/errors.js +2 -2
  18. package/dist/errors.js.map +1 -1
  19. package/dist/i18n.cjs +1 -1
  20. package/dist/i18n.cjs.map +1 -1
  21. package/dist/i18n.d.ts +5 -14
  22. package/dist/i18n.d.ts.map +1 -1
  23. package/dist/i18n.js +38 -55
  24. package/dist/i18n.js.map +1 -1
  25. package/dist/index.cjs +1 -1
  26. package/dist/index.d.ts +3 -3
  27. package/dist/index.d.ts.map +1 -1
  28. package/dist/index.js +4 -4
  29. package/dist/lingua.cjs +1 -1
  30. package/dist/lingua.cjs.map +1 -1
  31. package/dist/lingua.iife.js +1 -1
  32. package/dist/lingua.iife.js.map +1 -1
  33. package/dist/lingua.js +55 -107
  34. package/dist/lingua.js.map +1 -1
  35. package/dist/ripple.cjs +1 -1
  36. package/dist/ripple.cjs.map +1 -1
  37. package/dist/ripple.d.ts +6 -7
  38. package/dist/ripple.d.ts.map +1 -1
  39. package/dist/ripple.js +3 -4
  40. package/dist/ripple.js.map +1 -1
  41. package/dist/translator.cjs +1 -1
  42. package/dist/translator.cjs.map +1 -1
  43. package/dist/translator.d.ts +8 -12
  44. package/dist/translator.d.ts.map +1 -1
  45. package/dist/translator.js +28 -45
  46. package/dist/translator.js.map +1 -1
  47. package/dist/types.d.ts +7 -23
  48. package/dist/types.d.ts.map +1 -1
  49. package/package.json +3 -3
@@ -1,2 +1,2 @@
1
- const e=require("./_catalog.cjs"),t=require("./_locale.cjs"),n=require("./errors.cjs");function createCatalogStore(r){let i=new Map,a=new Map,hydrate=(n,r)=>{i.set(t.canonicalLocale(n),{catalog:r,compiled:e.compileCatalog(r)})};for(let[e,t]of Object.entries(r.catalogs??{}))hydrate(e,t);let load=async e=>{let o=t.canonicalLocale(e);if(i.has(o))return!1;let s=a.get(o);if(s)return await s,!1;if(!r.loadCatalog)throw new n.LinguaMissingCatalogError(`No catalog source provided for locale "${o}".`);let c=Promise.resolve(r.loadCatalog(o)).then(e=>{hydrate(o,e),a.delete(o)},e=>{throw a.delete(o),e});return a.set(o,c),await c,!0};return{catalogMap(){return new Map([...i].map(([e,{compiled:t}])=>[e,t]))},hydrate,isLoaded(e){return i.has(t.canonicalLocale(e))},load,state(e){let t={};for(let[e,{catalog:n}]of i)t[e]=n;return{catalogs:t,locale:e,version:1}}}}exports.createCatalogStore=createCatalogStore;
1
+ const e=require("./_catalog.cjs"),t=require("./_locale.cjs"),n=require("./errors.cjs");function createCatalogStore(r){let i=new Map,a=new Map,hydrate=(n,r)=>{i.set(t.canonicalLocale(n),{catalog:r,compiled:e.compileCatalog(r)})};for(let[e,t]of Object.entries(r.catalogs??{}))hydrate(e,t);let load=async e=>{let o=t.canonicalLocale(e);if(i.has(o))return!1;let s=a.get(o);if(s)return await s,!1;if(!r.loadCatalog)throw new n.LinguaMissingCatalogError(`No catalog source provided for locale "${o}".`);let c=Promise.resolve(r.loadCatalog(o)).then(e=>{hydrate(o,e),a.delete(o)},e=>{throw a.delete(o),e});return a.set(o,c),await c,!0};return{catalogMap(){return new Map([...i].map(([e,{compiled:t}])=>[e,t]))},isLoaded(e){return i.has(t.canonicalLocale(e))},load,serialized(e){let t={};for(let[e,{catalog:n}]of i)t[e]=n;return{catalogs:t,locale:e}}}}exports.createCatalogStore=createCatalogStore;
2
2
  //# sourceMappingURL=_resources.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"_resources.cjs","names":["canonicalLocale","compileCatalog","LinguaMissingCatalogError","require__catalog","require__locale","require_errors","loaded","tasks","locale","catalog","options","requestedLocale","existing","task","error","compiled","catalogs","loadedLocale"],"sources":["../src/_resources.ts"],"sourcesContent":["import { type CompiledCatalog, compileCatalog } from './_catalog';\nimport { canonicalLocale } from './_locale';\nimport { LinguaMissingCatalogError } from './errors';\nimport type { Catalog, Catalogs, Locale, TranslationState } from './types';\n\ntype CatalogStoreOptions<C extends Catalog> = {\n readonly catalogs?: Catalogs<C>;\n readonly loadCatalog?: (locale: Locale) => Promise<C> | C;\n};\n\n/** One catalog state machine owns loaded catalogs and in-flight loading work. */\nexport function createCatalogStore<C extends Catalog>(options: CatalogStoreOptions<C>) {\n const loaded = new Map<Locale, { readonly catalog: C; readonly compiled: CompiledCatalog }>();\n const tasks = new Map<Locale, Promise<void>>();\n\n const hydrate = (locale: Locale, catalog: C): void => {\n loaded.set(canonicalLocale(locale), { catalog, compiled: compileCatalog(catalog) });\n };\n\n for (const [locale, catalog] of Object.entries(options.catalogs ?? {})) hydrate(locale, catalog);\n\n const load = async (requestedLocale: Locale): Promise<boolean> => {\n const locale = canonicalLocale(requestedLocale);\n\n if (loaded.has(locale)) return false;\n\n const existing = tasks.get(locale);\n\n if (existing) {\n await existing;\n\n return false;\n }\n\n if (!options.loadCatalog) {\n throw new LinguaMissingCatalogError(`No catalog source provided for locale \"${locale}\".`);\n }\n\n const task = Promise.resolve(options.loadCatalog(locale)).then(\n (catalog) => {\n hydrate(locale, catalog);\n tasks.delete(locale);\n },\n (error: unknown) => {\n tasks.delete(locale);\n throw error;\n },\n );\n\n tasks.set(locale, task);\n await task;\n\n return true;\n };\n\n return {\n catalogMap(): ReadonlyMap<Locale, CompiledCatalog> {\n return new Map([...loaded].map(([locale, { compiled }]) => [locale, compiled]));\n },\n hydrate,\n isLoaded(locale: Locale): boolean {\n return loaded.has(canonicalLocale(locale));\n },\n load,\n state(locale: Locale): TranslationState<C> {\n const catalogs: Catalogs<C> = {};\n\n for (const [loadedLocale, { catalog }] of loaded) catalogs[loadedLocale] = catalog;\n\n return { catalogs, locale, version: 1 };\n },\n };\n}\n"],"mappings":"A,uFAWA,SAAgB,mBAAsC,EAAiC,CACrF,IAAMM,EAAS,IAAI,IACbC,EAAQ,IAAI,IAEZ,SAAW,EAAgB,IAAqB,CACpDD,EAAO,IAAIN,EAAAA,gBAAgBQ,CAAM,EAAG,CAAE,UAAS,SAAUP,EAAAA,eAAeQ,CAAO,CAAE,CAAC,CACpF,EAEA,IAAK,GAAM,CAACD,EAAQC,KAAY,OAAO,QAAQC,EAAQ,UAAY,CAAC,CAAC,EAAG,QAAQF,EAAQC,CAAO,EAE/F,IAAM,KAAO,KAAO,IAA8C,CAChE,IAAMD,EAASR,EAAAA,gBAAgBW,CAAe,EAE9C,GAAIL,EAAO,IAAIE,CAAM,EAAG,MAAO,GAE/B,IAAMI,EAAWL,EAAM,IAAIC,CAAM,EAEjC,GAAII,EAGF,OAFA,MAAMA,EAEC,GAGT,GAAI,CAACF,EAAQ,YACX,MAAM,IAAIR,EAAAA,0BAA0B,0CAA0CM,EAAO,GAAG,EAG1F,IAAMK,EAAO,QAAQ,QAAQH,EAAQ,YAAYF,CAAM,CAAC,CAAC,CAAC,KACvD,GAAY,CACX,QAAQA,EAAQC,CAAO,EACvBF,EAAM,OAAOC,CAAM,CACrB,EACC,GAAmB,CAElB,MADAD,EAAM,OAAOC,CAAM,EACbM,CACR,CACF,EAKA,OAHAP,EAAM,IAAIC,EAAQK,CAAI,EACtB,MAAMA,EAEC,EACT,EAEA,MAAO,CACL,YAAmD,CACjD,OAAO,IAAI,IAAI,CAAC,GAAGP,CAAM,CAAC,CAAC,KAAK,CAACE,EAAQ,CAAE,eAAgB,CAACA,EAAQO,CAAQ,CAAC,CAAC,CAChF,EACA,QACA,SAAS,EAAyB,CAChC,OAAOT,EAAO,IAAIN,EAAAA,gBAAgBQ,CAAM,CAAC,CAC3C,EACA,KACA,MAAM,EAAqC,CACzC,IAAMQ,EAAwB,CAAC,EAE/B,IAAK,GAAM,CAACC,EAAc,CAAE,cAAcX,EAAQ,EAASW,GAAgBR,EAE3E,MAAO,CAAE,WAAU,SAAQ,QAAS,CAAE,CACxC,CACF,CACF,C"}
1
+ {"version":3,"file":"_resources.cjs","names":["canonicalLocale","compileCatalog","LinguaMissingCatalogError","require__catalog","require__locale","require_errors","loaded","tasks","locale","catalog","options","requestedLocale","existing","task","error","compiled","catalogs","loadedLocale"],"sources":["../src/_resources.ts"],"sourcesContent":["import { type CompiledCatalog, compileCatalog } from './_catalog';\nimport { canonicalLocale } from './_locale';\nimport { LinguaMissingCatalogError } from './errors';\nimport type { Catalog, Catalogs, Locale, SerializedI18n } from './types';\n\ntype CatalogStoreOptions<C extends Catalog> = {\n readonly catalogs?: Catalogs<C>;\n readonly loadCatalog?: (locale: Locale) => Promise<C> | C;\n};\n\n/** One catalog state machine owns loaded catalogs and in-flight loading work. */\nexport function createCatalogStore<C extends Catalog>(options: CatalogStoreOptions<C>) {\n const loaded = new Map<Locale, { readonly catalog: C; readonly compiled: CompiledCatalog }>();\n const tasks = new Map<Locale, Promise<void>>();\n\n const hydrate = (locale: Locale, catalog: C): void => {\n loaded.set(canonicalLocale(locale), { catalog, compiled: compileCatalog(catalog) });\n };\n\n for (const [locale, catalog] of Object.entries(options.catalogs ?? {})) hydrate(locale, catalog);\n\n const load = async (requestedLocale: Locale): Promise<boolean> => {\n const locale = canonicalLocale(requestedLocale);\n\n if (loaded.has(locale)) return false;\n\n const existing = tasks.get(locale);\n\n if (existing) {\n await existing;\n\n return false;\n }\n\n if (!options.loadCatalog) {\n throw new LinguaMissingCatalogError(`No catalog source provided for locale \"${locale}\".`);\n }\n\n const task = Promise.resolve(options.loadCatalog(locale)).then(\n (catalog) => {\n hydrate(locale, catalog);\n tasks.delete(locale);\n },\n (error: unknown) => {\n tasks.delete(locale);\n throw error;\n },\n );\n\n tasks.set(locale, task);\n await task;\n\n return true;\n };\n\n return {\n catalogMap(): ReadonlyMap<Locale, CompiledCatalog> {\n return new Map([...loaded].map(([locale, { compiled }]) => [locale, compiled]));\n },\n isLoaded(locale: Locale): boolean {\n return loaded.has(canonicalLocale(locale));\n },\n load,\n serialized(locale: Locale): SerializedI18n<C> {\n const catalogs: Catalogs<C> = {};\n\n for (const [loadedLocale, { catalog }] of loaded) catalogs[loadedLocale] = catalog;\n\n return { catalogs, locale };\n },\n };\n}\n"],"mappings":"A,uFAWA,SAAgB,mBAAsC,EAAiC,CACrF,IAAMM,EAAS,IAAI,IACbC,EAAQ,IAAI,IAEZ,SAAW,EAAgB,IAAqB,CACpDD,EAAO,IAAIN,EAAAA,gBAAgBQ,CAAM,EAAG,CAAE,UAAS,SAAUP,EAAAA,eAAeQ,CAAO,CAAE,CAAC,CACpF,EAEA,IAAK,GAAM,CAACD,EAAQC,KAAY,OAAO,QAAQC,EAAQ,UAAY,CAAC,CAAC,EAAG,QAAQF,EAAQC,CAAO,EAE/F,IAAM,KAAO,KAAO,IAA8C,CAChE,IAAMD,EAASR,EAAAA,gBAAgBW,CAAe,EAE9C,GAAIL,EAAO,IAAIE,CAAM,EAAG,MAAO,GAE/B,IAAMI,EAAWL,EAAM,IAAIC,CAAM,EAEjC,GAAII,EAGF,OAFA,MAAMA,EAEC,GAGT,GAAI,CAACF,EAAQ,YACX,MAAM,IAAIR,EAAAA,0BAA0B,0CAA0CM,EAAO,GAAG,EAG1F,IAAMK,EAAO,QAAQ,QAAQH,EAAQ,YAAYF,CAAM,CAAC,CAAC,CAAC,KACvD,GAAY,CACX,QAAQA,EAAQC,CAAO,EACvBF,EAAM,OAAOC,CAAM,CACrB,EACC,GAAmB,CAElB,MADAD,EAAM,OAAOC,CAAM,EACbM,CACR,CACF,EAKA,OAHAP,EAAM,IAAIC,EAAQK,CAAI,EACtB,MAAMA,EAEC,EACT,EAEA,MAAO,CACL,YAAmD,CACjD,OAAO,IAAI,IAAI,CAAC,GAAGP,CAAM,CAAC,CAAC,KAAK,CAACE,EAAQ,CAAE,eAAgB,CAACA,EAAQO,CAAQ,CAAC,CAAC,CAChF,EACA,SAAS,EAAyB,CAChC,OAAOT,EAAO,IAAIN,EAAAA,gBAAgBQ,CAAM,CAAC,CAC3C,EACA,KACA,WAAW,EAAmC,CAC5C,IAAMQ,EAAwB,CAAC,EAE/B,IAAK,GAAM,CAACC,EAAc,CAAE,cAAcX,EAAQ,EAASW,GAAgBR,EAE3E,MAAO,CAAE,WAAU,QAAO,CAC5B,CACF,CACF,C"}
@@ -1,5 +1,5 @@
1
1
  import { type CompiledCatalog } from './_catalog';
2
- import type { Catalog, Catalogs, Locale, TranslationState } from './types';
2
+ import type { Catalog, Catalogs, Locale, SerializedI18n } from './types';
3
3
  type CatalogStoreOptions<C extends Catalog> = {
4
4
  readonly catalogs?: Catalogs<C>;
5
5
  readonly loadCatalog?: (locale: Locale) => Promise<C> | C;
@@ -7,10 +7,9 @@ type CatalogStoreOptions<C extends Catalog> = {
7
7
  /** One catalog state machine owns loaded catalogs and in-flight loading work. */
8
8
  export declare function createCatalogStore<C extends Catalog>(options: CatalogStoreOptions<C>): {
9
9
  catalogMap(): ReadonlyMap<Locale, CompiledCatalog>;
10
- hydrate: (locale: Locale, catalog: C) => void;
11
10
  isLoaded(locale: Locale): boolean;
12
11
  load: (requestedLocale: Locale) => Promise<boolean>;
13
- state(locale: Locale): TranslationState<C>;
12
+ serialized(locale: Locale): SerializedI18n<C>;
14
13
  };
15
14
  export {};
16
15
  //# sourceMappingURL=_resources.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"_resources.d.ts","sourceRoot":"","sources":["../src/_resources.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,eAAe,EAAkB,MAAM,YAAY,CAAC;AAGlE,OAAO,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,gBAAgB,EAAE,MAAM,SAAS,CAAC;AAE3E,KAAK,mBAAmB,CAAC,CAAC,SAAS,OAAO,IAAI;IAC5C,QAAQ,CAAC,QAAQ,CAAC,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC;IAChC,QAAQ,CAAC,WAAW,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;CAC3D,CAAC;AAEF,iFAAiF;AACjF,wBAAgB,kBAAkB,CAAC,CAAC,SAAS,OAAO,EAAE,OAAO,EAAE,mBAAmB,CAAC,CAAC,CAAC;kBA6CnE,WAAW,CAAC,MAAM,EAAE,eAAe,CAAC;sBAzC3B,MAAM,WAAW,CAAC,KAAG,IAAI;qBA6C/B,MAAM,GAAG,OAAO;4BAvCE,MAAM,KAAG,OAAO,CAAC,OAAO,CAAC;kBA2C9C,MAAM,GAAG,gBAAgB,CAAC,CAAC,CAAC;EAQ7C"}
1
+ {"version":3,"file":"_resources.d.ts","sourceRoot":"","sources":["../src/_resources.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,eAAe,EAAkB,MAAM,YAAY,CAAC;AAGlE,OAAO,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AAEzE,KAAK,mBAAmB,CAAC,CAAC,SAAS,OAAO,IAAI;IAC5C,QAAQ,CAAC,QAAQ,CAAC,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC;IAChC,QAAQ,CAAC,WAAW,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;CAC3D,CAAC;AAEF,iFAAiF;AACjF,wBAAgB,kBAAkB,CAAC,CAAC,SAAS,OAAO,EAAE,OAAO,EAAE,mBAAmB,CAAC,CAAC,CAAC;kBA6CnE,WAAW,CAAC,MAAM,EAAE,eAAe,CAAC;qBAGjC,MAAM,GAAG,OAAO;4BAtCE,MAAM,KAAG,OAAO,CAAC,OAAO,CAAC;uBA0CzC,MAAM,GAAG,cAAc,CAAC,CAAC,CAAC;EAQhD"}
@@ -27,18 +27,16 @@ function createCatalogStore(r) {
27
27
  catalogMap() {
28
28
  return new Map([...i].map(([e, { compiled: t }]) => [e, t]));
29
29
  },
30
- hydrate,
31
30
  isLoaded(e) {
32
31
  return i.has(t(e));
33
32
  },
34
33
  load,
35
- state(e) {
34
+ serialized(e) {
36
35
  let t = {};
37
36
  for (let [e, { catalog: n }] of i) t[e] = n;
38
37
  return {
39
38
  catalogs: t,
40
- locale: e,
41
- version: 1
39
+ locale: e
42
40
  };
43
41
  }
44
42
  };
@@ -1 +1 @@
1
- {"version":3,"file":"_resources.js","names":["loaded","tasks","canonicalLocale","locale","compileCatalog","catalog","options","requestedLocale","existing","LinguaMissingCatalogError","task","error","compiled","catalogs","loadedLocale"],"sources":["../src/_resources.ts"],"sourcesContent":["import { type CompiledCatalog, compileCatalog } from './_catalog';\nimport { canonicalLocale } from './_locale';\nimport { LinguaMissingCatalogError } from './errors';\nimport type { Catalog, Catalogs, Locale, TranslationState } from './types';\n\ntype CatalogStoreOptions<C extends Catalog> = {\n readonly catalogs?: Catalogs<C>;\n readonly loadCatalog?: (locale: Locale) => Promise<C> | C;\n};\n\n/** One catalog state machine owns loaded catalogs and in-flight loading work. */\nexport function createCatalogStore<C extends Catalog>(options: CatalogStoreOptions<C>) {\n const loaded = new Map<Locale, { readonly catalog: C; readonly compiled: CompiledCatalog }>();\n const tasks = new Map<Locale, Promise<void>>();\n\n const hydrate = (locale: Locale, catalog: C): void => {\n loaded.set(canonicalLocale(locale), { catalog, compiled: compileCatalog(catalog) });\n };\n\n for (const [locale, catalog] of Object.entries(options.catalogs ?? {})) hydrate(locale, catalog);\n\n const load = async (requestedLocale: Locale): Promise<boolean> => {\n const locale = canonicalLocale(requestedLocale);\n\n if (loaded.has(locale)) return false;\n\n const existing = tasks.get(locale);\n\n if (existing) {\n await existing;\n\n return false;\n }\n\n if (!options.loadCatalog) {\n throw new LinguaMissingCatalogError(`No catalog source provided for locale \"${locale}\".`);\n }\n\n const task = Promise.resolve(options.loadCatalog(locale)).then(\n (catalog) => {\n hydrate(locale, catalog);\n tasks.delete(locale);\n },\n (error: unknown) => {\n tasks.delete(locale);\n throw error;\n },\n );\n\n tasks.set(locale, task);\n await task;\n\n return true;\n };\n\n return {\n catalogMap(): ReadonlyMap<Locale, CompiledCatalog> {\n return new Map([...loaded].map(([locale, { compiled }]) => [locale, compiled]));\n },\n hydrate,\n isLoaded(locale: Locale): boolean {\n return loaded.has(canonicalLocale(locale));\n },\n load,\n state(locale: Locale): TranslationState<C> {\n const catalogs: Catalogs<C> = {};\n\n for (const [loadedLocale, { catalog }] of loaded) catalogs[loadedLocale] = catalog;\n\n return { catalogs, locale, version: 1 };\n },\n };\n}\n"],"mappings":";;;;AAWA,SAAgB,mBAAsC,GAAiC;CACrF,IAAMA,oBAAS,IAAI,IAAyE,GACtFC,oBAAQ,IAAI,IAA2B,GAEvC,WAAW,GAAgB,MAAqB;EACpD,EAAO,IAAIC,EAAgBC,CAAM,GAAG;GAAE;GAAS,UAAUC,EAAeC,CAAO;EAAE,CAAC;CACpF;CAEA,KAAK,IAAM,CAACF,GAAQE,MAAY,OAAO,QAAQC,EAAQ,YAAY,CAAC,CAAC,GAAG,QAAQH,GAAQE,CAAO;CAE/F,IAAM,OAAO,OAAO,MAA8C;EAChE,IAAMF,IAASD,EAAgBK,CAAe;EAE9C,IAAIP,EAAO,IAAIG,CAAM,GAAG,OAAO;EAE/B,IAAMK,IAAWP,EAAM,IAAIE,CAAM;EAEjC,IAAIK,GAGF,OAFA,MAAMA,GAEC;EAGT,IAAI,CAACF,EAAQ,aACX,MAAM,IAAIG,EAA0B,0CAA0CN,EAAO,GAAG;EAG1F,IAAMO,IAAO,QAAQ,QAAQJ,EAAQ,YAAYH,CAAM,CAAC,CAAC,CAAC,MACvD,MAAY;GAEX,AADA,QAAQA,GAAQE,CAAO,GACvBJ,EAAM,OAAOE,CAAM;EACrB,IACC,MAAmB;GAElB,MADAF,EAAM,OAAOE,CAAM,GACbQ;EACR,CACF;EAKA,OAHAV,EAAM,IAAIE,GAAQO,CAAI,GACtB,MAAMA,GAEC;CACT;CAEA,OAAO;EACL,aAAmD;GACjD,OAAO,IAAI,IAAI,CAAC,GAAGV,CAAM,CAAC,CAAC,KAAK,CAACG,GAAQ,EAAE,mBAAgB,CAACA,GAAQS,CAAQ,CAAC,CAAC;EAChF;EACA;EACA,SAAS,GAAyB;GAChC,OAAOZ,EAAO,IAAIE,EAAgBC,CAAM,CAAC;EAC3C;EACA;EACA,MAAM,GAAqC;GACzC,IAAMU,IAAwB,CAAC;GAE/B,KAAK,IAAM,CAACC,GAAc,EAAE,iBAAcd,GAAQ,EAASc,KAAgBT;GAE3E,OAAO;IAAE;IAAU;IAAQ,SAAS;GAAE;EACxC;CACF;AACF"}
1
+ {"version":3,"file":"_resources.js","names":["loaded","tasks","canonicalLocale","locale","compileCatalog","catalog","options","requestedLocale","existing","LinguaMissingCatalogError","task","error","compiled","catalogs","loadedLocale"],"sources":["../src/_resources.ts"],"sourcesContent":["import { type CompiledCatalog, compileCatalog } from './_catalog';\nimport { canonicalLocale } from './_locale';\nimport { LinguaMissingCatalogError } from './errors';\nimport type { Catalog, Catalogs, Locale, SerializedI18n } from './types';\n\ntype CatalogStoreOptions<C extends Catalog> = {\n readonly catalogs?: Catalogs<C>;\n readonly loadCatalog?: (locale: Locale) => Promise<C> | C;\n};\n\n/** One catalog state machine owns loaded catalogs and in-flight loading work. */\nexport function createCatalogStore<C extends Catalog>(options: CatalogStoreOptions<C>) {\n const loaded = new Map<Locale, { readonly catalog: C; readonly compiled: CompiledCatalog }>();\n const tasks = new Map<Locale, Promise<void>>();\n\n const hydrate = (locale: Locale, catalog: C): void => {\n loaded.set(canonicalLocale(locale), { catalog, compiled: compileCatalog(catalog) });\n };\n\n for (const [locale, catalog] of Object.entries(options.catalogs ?? {})) hydrate(locale, catalog);\n\n const load = async (requestedLocale: Locale): Promise<boolean> => {\n const locale = canonicalLocale(requestedLocale);\n\n if (loaded.has(locale)) return false;\n\n const existing = tasks.get(locale);\n\n if (existing) {\n await existing;\n\n return false;\n }\n\n if (!options.loadCatalog) {\n throw new LinguaMissingCatalogError(`No catalog source provided for locale \"${locale}\".`);\n }\n\n const task = Promise.resolve(options.loadCatalog(locale)).then(\n (catalog) => {\n hydrate(locale, catalog);\n tasks.delete(locale);\n },\n (error: unknown) => {\n tasks.delete(locale);\n throw error;\n },\n );\n\n tasks.set(locale, task);\n await task;\n\n return true;\n };\n\n return {\n catalogMap(): ReadonlyMap<Locale, CompiledCatalog> {\n return new Map([...loaded].map(([locale, { compiled }]) => [locale, compiled]));\n },\n isLoaded(locale: Locale): boolean {\n return loaded.has(canonicalLocale(locale));\n },\n load,\n serialized(locale: Locale): SerializedI18n<C> {\n const catalogs: Catalogs<C> = {};\n\n for (const [loadedLocale, { catalog }] of loaded) catalogs[loadedLocale] = catalog;\n\n return { catalogs, locale };\n },\n };\n}\n"],"mappings":";;;;AAWA,SAAgB,mBAAsC,GAAiC;CACrF,IAAMA,oBAAS,IAAI,IAAyE,GACtFC,oBAAQ,IAAI,IAA2B,GAEvC,WAAW,GAAgB,MAAqB;EACpD,EAAO,IAAIC,EAAgBC,CAAM,GAAG;GAAE;GAAS,UAAUC,EAAeC,CAAO;EAAE,CAAC;CACpF;CAEA,KAAK,IAAM,CAACF,GAAQE,MAAY,OAAO,QAAQC,EAAQ,YAAY,CAAC,CAAC,GAAG,QAAQH,GAAQE,CAAO;CAE/F,IAAM,OAAO,OAAO,MAA8C;EAChE,IAAMF,IAASD,EAAgBK,CAAe;EAE9C,IAAIP,EAAO,IAAIG,CAAM,GAAG,OAAO;EAE/B,IAAMK,IAAWP,EAAM,IAAIE,CAAM;EAEjC,IAAIK,GAGF,OAFA,MAAMA,GAEC;EAGT,IAAI,CAACF,EAAQ,aACX,MAAM,IAAIG,EAA0B,0CAA0CN,EAAO,GAAG;EAG1F,IAAMO,IAAO,QAAQ,QAAQJ,EAAQ,YAAYH,CAAM,CAAC,CAAC,CAAC,MACvD,MAAY;GAEX,AADA,QAAQA,GAAQE,CAAO,GACvBJ,EAAM,OAAOE,CAAM;EACrB,IACC,MAAmB;GAElB,MADAF,EAAM,OAAOE,CAAM,GACbQ;EACR,CACF;EAKA,OAHAV,EAAM,IAAIE,GAAQO,CAAI,GACtB,MAAMA,GAEC;CACT;CAEA,OAAO;EACL,aAAmD;GACjD,OAAO,IAAI,IAAI,CAAC,GAAGV,CAAM,CAAC,CAAC,KAAK,CAACG,GAAQ,EAAE,mBAAgB,CAACA,GAAQS,CAAQ,CAAC,CAAC;EAChF;EACA,SAAS,GAAyB;GAChC,OAAOZ,EAAO,IAAIE,EAAgBC,CAAM,CAAC;EAC3C;EACA;EACA,WAAW,GAAmC;GAC5C,IAAMU,IAAwB,CAAC;GAE/B,KAAK,IAAM,CAACC,GAAc,EAAE,iBAAcd,GAAQ,EAASc,KAAgBT;GAE3E,OAAO;IAAE;IAAU;GAAO;EAC5B;CACF;AACF"}
@@ -1,2 +1,2 @@
1
- var e=/\{([\p{ID_Continue}-]+)\}/gu;function compileTemplate(t){let n=[],r=0;for(let i of t.matchAll(e)){let e=i.index??0;e>r&&n.push(t.slice(r,e)),n.push({value:i[1]}),r=e+i[0].length}return r<t.length&&n.push(t.slice(r)),n}function renderText(e,t,n){return e.map(e=>{if(typeof e==`string`)return e;let r=Object.hasOwn(t,e.value)?t[e.value]:void 0;return r==null?n(e.value):String(r)}).join(``)}function renderParts(e,t,n){let r=[];for(let i of e)typeof i==`string`?i!==``&&r.push({type:`text`,value:i}):Object.hasOwn(t,i.value)?r.push({type:`value`,value:t[i.value]}):r.push({type:`text`,value:n(i.value)});return r}exports.compileTemplate=compileTemplate,exports.renderParts=renderParts,exports.renderText=renderText;
1
+ var e=/\{([\p{ID_Continue}-]+)\}/gu;function compileTemplate(t){let n=[],r=0;for(let i of t.matchAll(e)){let e=i.index??0;e>r&&n.push(t.slice(r,e)),n.push({value:i[1]}),r=e+i[0].length}return r<t.length&&n.push(t.slice(r)),n}function renderText(e,t,n){return e.map(e=>{if(typeof e==`string`)return e;let r=Object.hasOwn(t,e.value)?t[e.value]:void 0;return r==null?n(e.value):String(r)}).join(``)}exports.compileTemplate=compileTemplate,exports.renderText=renderText;
2
2
  //# sourceMappingURL=_template.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"_template.cjs","names":["interpolation","parts","offset","match","value","index","part","values","missing","result"],"sources":["../src/_template.ts"],"sourcesContent":["import type { Part } from './types';\n\nexport type TemplatePart = string | { readonly value: string };\nexport type Template = readonly TemplatePart[];\n\nconst interpolation = /\\{([\\p{ID_Continue}-]+)\\}/gu;\n\nexport function compileTemplate(value: string): Template {\n const parts: TemplatePart[] = [];\n let offset = 0;\n\n for (const match of value.matchAll(interpolation)) {\n const index = match.index ?? 0;\n\n if (index > offset) parts.push(value.slice(offset, index));\n\n parts.push({ value: match[1] });\n offset = index + match[0].length;\n }\n\n if (offset < value.length) parts.push(value.slice(offset));\n\n return parts;\n}\n\nexport function renderText(\n parts: Template,\n values: Record<string, unknown>,\n missing: (name: string) => string,\n): string {\n return parts\n .map((part) => {\n if (typeof part === 'string') return part;\n\n const value = Object.hasOwn(values, part.value) ? values[part.value] : undefined;\n\n return value == null ? missing(part.value) : String(value);\n })\n .join('');\n}\n\nexport function renderParts<V>(\n parts: Template,\n values: Record<string, V | number>,\n missing: (name: string) => string,\n): Array<Part<V | number>> {\n const result: Array<Part<V | number>> = [];\n\n for (const part of parts) {\n if (typeof part === 'string') {\n if (part !== '') result.push({ type: 'text', value: part });\n\n continue;\n }\n\n if (Object.hasOwn(values, part.value)) {\n result.push({ type: 'value', value: values[part.value]! as V | number });\n } else {\n result.push({ type: 'text', value: missing(part.value) });\n }\n }\n\n return result;\n}\n"],"mappings":"AAKA,IAAMA,EAAgB,8BAEtB,SAAgB,gBAAgB,EAAyB,CACvD,IAAMC,EAAwB,CAAC,EAC3BC,EAAS,EAEb,IAAK,IAAMC,KAASC,EAAM,SAASJ,CAAa,EAAG,CACjD,IAAMK,EAAQF,EAAM,OAAS,EAEzBE,EAAQH,GAAQD,EAAM,KAAKG,EAAM,MAAMF,EAAQG,CAAK,CAAC,EAEzDJ,EAAM,KAAK,CAAE,MAAOE,EAAM,EAAG,CAAC,EAC9B,EAASE,EAAQF,EAAM,EAAE,CAAC,MAC5B,CAIA,OAFID,EAASE,EAAM,QAAQH,EAAM,KAAKG,EAAM,MAAMF,CAAM,CAAC,EAElDD,CACT,CAEA,SAAgB,WACd,EACA,EACA,EACQ,CACR,OAAOA,EACJ,IAAK,GAAS,CACb,GAAI,OAAOK,GAAS,SAAU,OAAOA,EAErC,IAAMF,EAAQ,OAAO,OAAOG,EAAQD,EAAK,KAAK,EAAIC,EAAOD,EAAK,OAAS,IAAA,GAEvE,OAAOF,GAAS,KAAOI,EAAQF,EAAK,KAAK,EAAI,OAAOF,CAAK,CAC3D,CAAC,CAAC,CACD,KAAK,EAAE,CACZ,CAEA,SAAgB,YACd,EACA,EACA,EACyB,CACzB,IAAMK,EAAkC,CAAC,EAEzC,IAAK,IAAMH,KAAQL,EACb,OAAOK,GAAS,SACdA,IAAS,IAAIG,EAAO,KAAK,CAAE,KAAM,OAAQ,MAAOH,CAAK,CAAC,EAKxD,OAAO,OAAOC,EAAQD,EAAK,KAAK,EAClCG,EAAO,KAAK,CAAE,KAAM,QAAS,MAAOF,EAAOD,EAAK,MAAsB,CAAC,EAEvEG,EAAO,KAAK,CAAE,KAAM,OAAQ,MAAOD,EAAQF,EAAK,KAAK,CAAE,CAAC,EAI5D,OAAOG,CACT,C"}
1
+ {"version":3,"file":"_template.cjs","names":["interpolation","parts","offset","match","value","index","part","values","missing"],"sources":["../src/_template.ts"],"sourcesContent":["export type TemplatePart = string | { readonly value: string };\nexport type Template = readonly TemplatePart[];\n\nconst interpolation = /\\{([\\p{ID_Continue}-]+)\\}/gu;\n\nexport function compileTemplate(value: string): Template {\n const parts: TemplatePart[] = [];\n let offset = 0;\n\n for (const match of value.matchAll(interpolation)) {\n const index = match.index ?? 0;\n\n if (index > offset) parts.push(value.slice(offset, index));\n\n parts.push({ value: match[1] });\n offset = index + match[0].length;\n }\n\n if (offset < value.length) parts.push(value.slice(offset));\n\n return parts;\n}\n\nexport function renderText(\n parts: Template,\n values: Record<string, unknown>,\n missing: (name: string) => string,\n): string {\n return parts\n .map((part) => {\n if (typeof part === 'string') return part;\n\n const value = Object.hasOwn(values, part.value) ? values[part.value] : undefined;\n\n return value == null ? missing(part.value) : String(value);\n })\n .join('');\n}\n"],"mappings":"AAGA,IAAMA,EAAgB,8BAEtB,SAAgB,gBAAgB,EAAyB,CACvD,IAAMC,EAAwB,CAAC,EAC3BC,EAAS,EAEb,IAAK,IAAMC,KAASC,EAAM,SAASJ,CAAa,EAAG,CACjD,IAAMK,EAAQF,EAAM,OAAS,EAEzBE,EAAQH,GAAQD,EAAM,KAAKG,EAAM,MAAMF,EAAQG,CAAK,CAAC,EAEzDJ,EAAM,KAAK,CAAE,MAAOE,EAAM,EAAG,CAAC,EAC9B,EAASE,EAAQF,EAAM,EAAE,CAAC,MAC5B,CAIA,OAFID,EAASE,EAAM,QAAQH,EAAM,KAAKG,EAAM,MAAMF,CAAM,CAAC,EAElDD,CACT,CAEA,SAAgB,WACd,EACA,EACA,EACQ,CACR,OAAOA,EACJ,IAAK,GAAS,CACb,GAAI,OAAOK,GAAS,SAAU,OAAOA,EAErC,IAAMF,EAAQ,OAAO,OAAOG,EAAQD,EAAK,KAAK,EAAIC,EAAOD,EAAK,OAAS,IAAA,GAEvE,OAAOF,GAAS,KAAOI,EAAQF,EAAK,KAAK,EAAI,OAAOF,CAAK,CAC3D,CAAC,CAAC,CACD,KAAK,EAAE,CACZ,C"}
@@ -1,9 +1,7 @@
1
- import type { Part } from './types';
2
1
  export type TemplatePart = string | {
3
2
  readonly value: string;
4
3
  };
5
4
  export type Template = readonly TemplatePart[];
6
5
  export declare function compileTemplate(value: string): Template;
7
6
  export declare function renderText(parts: Template, values: Record<string, unknown>, missing: (name: string) => string): string;
8
- export declare function renderParts<V>(parts: Template, values: Record<string, V | number>, missing: (name: string) => string): Array<Part<V | number>>;
9
7
  //# sourceMappingURL=_template.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"_template.d.ts","sourceRoot":"","sources":["../src/_template.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,SAAS,CAAC;AAEpC,MAAM,MAAM,YAAY,GAAG,MAAM,GAAG;IAAE,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC;AAC/D,MAAM,MAAM,QAAQ,GAAG,SAAS,YAAY,EAAE,CAAC;AAI/C,wBAAgB,eAAe,CAAC,KAAK,EAAE,MAAM,GAAG,QAAQ,CAgBvD;AAED,wBAAgB,UAAU,CACxB,KAAK,EAAE,QAAQ,EACf,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC/B,OAAO,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,MAAM,GAChC,MAAM,CAUR;AAED,wBAAgB,WAAW,CAAC,CAAC,EAC3B,KAAK,EAAE,QAAQ,EACf,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,GAAG,MAAM,CAAC,EAClC,OAAO,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,MAAM,GAChC,KAAK,CAAC,IAAI,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,CAkBzB"}
1
+ {"version":3,"file":"_template.d.ts","sourceRoot":"","sources":["../src/_template.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,YAAY,GAAG,MAAM,GAAG;IAAE,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC;AAC/D,MAAM,MAAM,QAAQ,GAAG,SAAS,YAAY,EAAE,CAAC;AAI/C,wBAAgB,eAAe,CAAC,KAAK,EAAE,MAAM,GAAG,QAAQ,CAgBvD;AAED,wBAAgB,UAAU,CACxB,KAAK,EAAE,QAAQ,EACf,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC/B,OAAO,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,MAAM,GAChC,MAAM,CAUR"}
package/dist/_template.js CHANGED
@@ -15,20 +15,6 @@ function renderText(e, t, n) {
15
15
  return r == null ? n(e.value) : String(r);
16
16
  }).join("");
17
17
  }
18
- function renderParts(e, t, n) {
19
- let r = [];
20
- for (let i of e) typeof i == "string" ? i !== "" && r.push({
21
- type: "text",
22
- value: i
23
- }) : Object.hasOwn(t, i.value) ? r.push({
24
- type: "value",
25
- value: t[i.value]
26
- }) : r.push({
27
- type: "text",
28
- value: n(i.value)
29
- });
30
- return r;
31
- }
32
- export { compileTemplate, renderParts, renderText };
18
+ export { compileTemplate, renderText };
33
19
 
34
20
  //# sourceMappingURL=_template.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"_template.js","names":["interpolation","parts","offset","match","value","index","part","values","missing","result"],"sources":["../src/_template.ts"],"sourcesContent":["import type { Part } from './types';\n\nexport type TemplatePart = string | { readonly value: string };\nexport type Template = readonly TemplatePart[];\n\nconst interpolation = /\\{([\\p{ID_Continue}-]+)\\}/gu;\n\nexport function compileTemplate(value: string): Template {\n const parts: TemplatePart[] = [];\n let offset = 0;\n\n for (const match of value.matchAll(interpolation)) {\n const index = match.index ?? 0;\n\n if (index > offset) parts.push(value.slice(offset, index));\n\n parts.push({ value: match[1] });\n offset = index + match[0].length;\n }\n\n if (offset < value.length) parts.push(value.slice(offset));\n\n return parts;\n}\n\nexport function renderText(\n parts: Template,\n values: Record<string, unknown>,\n missing: (name: string) => string,\n): string {\n return parts\n .map((part) => {\n if (typeof part === 'string') return part;\n\n const value = Object.hasOwn(values, part.value) ? values[part.value] : undefined;\n\n return value == null ? missing(part.value) : String(value);\n })\n .join('');\n}\n\nexport function renderParts<V>(\n parts: Template,\n values: Record<string, V | number>,\n missing: (name: string) => string,\n): Array<Part<V | number>> {\n const result: Array<Part<V | number>> = [];\n\n for (const part of parts) {\n if (typeof part === 'string') {\n if (part !== '') result.push({ type: 'text', value: part });\n\n continue;\n }\n\n if (Object.hasOwn(values, part.value)) {\n result.push({ type: 'value', value: values[part.value]! as V | number });\n } else {\n result.push({ type: 'text', value: missing(part.value) });\n }\n }\n\n return result;\n}\n"],"mappings":";AAKA,IAAMA,IAAgB;AAEtB,SAAgB,gBAAgB,GAAyB;CACvD,IAAMC,IAAwB,CAAC,GAC3BC,IAAS;CAEb,KAAK,IAAMC,KAASC,EAAM,SAASJ,CAAa,GAAG;EACjD,IAAMK,IAAQF,EAAM,SAAS;EAK7B,AAHIE,IAAQH,KAAQD,EAAM,KAAKG,EAAM,MAAMF,GAAQG,CAAK,CAAC,GAEzDJ,EAAM,KAAK,EAAE,OAAOE,EAAM,GAAG,CAAC,GAC9B,IAASE,IAAQF,EAAM,EAAE,CAAC;CAC5B;CAIA,OAFID,IAASE,EAAM,UAAQH,EAAM,KAAKG,EAAM,MAAMF,CAAM,CAAC,GAElDD;AACT;AAEA,SAAgB,WACd,GACA,GACA,GACQ;CACR,OAAOA,EACJ,KAAK,MAAS;EACb,IAAI,OAAOK,KAAS,UAAU,OAAOA;EAErC,IAAMF,IAAQ,OAAO,OAAOG,GAAQD,EAAK,KAAK,IAAIC,EAAOD,EAAK,SAAS,KAAA;EAEvE,OAAOF,KAAS,OAAOI,EAAQF,EAAK,KAAK,IAAI,OAAOF,CAAK;CAC3D,CAAC,CAAC,CACD,KAAK,EAAE;AACZ;AAEA,SAAgB,YACd,GACA,GACA,GACyB;CACzB,IAAMK,IAAkC,CAAC;CAEzC,KAAK,IAAMH,KAAQL,GACjB,AAAI,OAAOK,KAAS,WACdA,MAAS,MAAIG,EAAO,KAAK;EAAE,MAAM;EAAQ,OAAOH;CAAK,CAAC,IAKxD,OAAO,OAAOC,GAAQD,EAAK,KAAK,IAClCG,EAAO,KAAK;EAAE,MAAM;EAAS,OAAOF,EAAOD,EAAK;CAAsB,CAAC,IAEvEG,EAAO,KAAK;EAAE,MAAM;EAAQ,OAAOD,EAAQF,EAAK,KAAK;CAAE,CAAC;CAI5D,OAAOG;AACT"}
1
+ {"version":3,"file":"_template.js","names":["interpolation","parts","offset","match","value","index","part","values","missing"],"sources":["../src/_template.ts"],"sourcesContent":["export type TemplatePart = string | { readonly value: string };\nexport type Template = readonly TemplatePart[];\n\nconst interpolation = /\\{([\\p{ID_Continue}-]+)\\}/gu;\n\nexport function compileTemplate(value: string): Template {\n const parts: TemplatePart[] = [];\n let offset = 0;\n\n for (const match of value.matchAll(interpolation)) {\n const index = match.index ?? 0;\n\n if (index > offset) parts.push(value.slice(offset, index));\n\n parts.push({ value: match[1] });\n offset = index + match[0].length;\n }\n\n if (offset < value.length) parts.push(value.slice(offset));\n\n return parts;\n}\n\nexport function renderText(\n parts: Template,\n values: Record<string, unknown>,\n missing: (name: string) => string,\n): string {\n return parts\n .map((part) => {\n if (typeof part === 'string') return part;\n\n const value = Object.hasOwn(values, part.value) ? values[part.value] : undefined;\n\n return value == null ? missing(part.value) : String(value);\n })\n .join('');\n}\n"],"mappings":";AAGA,IAAMA,IAAgB;AAEtB,SAAgB,gBAAgB,GAAyB;CACvD,IAAMC,IAAwB,CAAC,GAC3BC,IAAS;CAEb,KAAK,IAAMC,KAASC,EAAM,SAASJ,CAAa,GAAG;EACjD,IAAMK,IAAQF,EAAM,SAAS;EAK7B,AAHIE,IAAQH,KAAQD,EAAM,KAAKG,EAAM,MAAMF,GAAQG,CAAK,CAAC,GAEzDJ,EAAM,KAAK,EAAE,OAAOE,EAAM,GAAG,CAAC,GAC9B,IAASE,IAAQF,EAAM,EAAE,CAAC;CAC5B;CAIA,OAFID,IAASE,EAAM,UAAQH,EAAM,KAAKG,EAAM,MAAMF,CAAM,CAAC,GAElDD;AACT;AAEA,SAAgB,WACd,GACA,GACA,GACQ;CACR,OAAOA,EACJ,KAAK,MAAS;EACb,IAAI,OAAOK,KAAS,UAAU,OAAOA;EAErC,IAAMF,IAAQ,OAAO,OAAOG,GAAQD,EAAK,KAAK,IAAIC,EAAOD,EAAK,SAAS,KAAA;EAEvE,OAAOF,KAAS,OAAOI,EAAQF,EAAK,KAAK,IAAI,OAAOF,CAAK;CAC3D,CAAC,CAAC,CACD,KAAK,EAAE;AACZ"}
package/dist/errors.cjs CHANGED
@@ -1,2 +1,2 @@
1
- var LinguaError=class extends Error{constructor(e,t){super(e,t),this.name=new.target.name,Object.setPrototypeOf(this,new.target.prototype)}},LinguaDisposedError=class extends LinguaError{constructor(){super(`Operation called on a disposed i18n instance.`)}},LinguaInvalidCatalogError=class extends LinguaError{},LinguaInvalidLocaleError=class extends LinguaError{},LinguaInvalidPluralCountError=class extends LinguaError{},LinguaInvalidStateError=class extends LinguaError{},LinguaMissingCatalogError=class extends LinguaError{},LinguaMissingKeyError=class extends LinguaError{},LinguaMissingValueError=class extends LinguaError{};exports.LinguaDisposedError=LinguaDisposedError,exports.LinguaError=LinguaError,exports.LinguaInvalidCatalogError=LinguaInvalidCatalogError,exports.LinguaInvalidLocaleError=LinguaInvalidLocaleError,exports.LinguaInvalidPluralCountError=LinguaInvalidPluralCountError,exports.LinguaInvalidStateError=LinguaInvalidStateError,exports.LinguaMissingCatalogError=LinguaMissingCatalogError,exports.LinguaMissingKeyError=LinguaMissingKeyError,exports.LinguaMissingValueError=LinguaMissingValueError;
1
+ var LinguaError=class extends Error{constructor(e,t){super(e,t),this.name=new.target.name,Object.setPrototypeOf(this,new.target.prototype)}},LinguaDisposedError=class extends LinguaError{constructor(){super(`Operation called on a disposed i18n instance.`)}},LinguaInvalidCatalogError=class extends LinguaError{},LinguaInvalidLocaleError=class extends LinguaError{},LinguaInvalidPluralCountError=class extends LinguaError{},LinguaMissingCatalogError=class extends LinguaError{},LinguaMissingKeyError=class extends LinguaError{},LinguaMissingValueError=class extends LinguaError{};exports.LinguaDisposedError=LinguaDisposedError,exports.LinguaError=LinguaError,exports.LinguaInvalidCatalogError=LinguaInvalidCatalogError,exports.LinguaInvalidLocaleError=LinguaInvalidLocaleError,exports.LinguaInvalidPluralCountError=LinguaInvalidPluralCountError,exports.LinguaMissingCatalogError=LinguaMissingCatalogError,exports.LinguaMissingKeyError=LinguaMissingKeyError,exports.LinguaMissingValueError=LinguaMissingValueError;
2
2
  //# sourceMappingURL=errors.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"errors.cjs","names":["message","opts"],"sources":["../src/errors.ts"],"sourcesContent":["export class LinguaError extends Error {\n constructor(message: string, opts?: ErrorOptions) {\n super(message, opts);\n this.name = new.target.name;\n Object.setPrototypeOf(this, new.target.prototype);\n }\n}\n\nexport class LinguaDisposedError extends LinguaError {\n constructor() {\n super('Operation called on a disposed i18n instance.');\n }\n}\n\nexport class LinguaInvalidCatalogError extends LinguaError {}\nexport class LinguaInvalidLocaleError extends LinguaError {}\nexport class LinguaInvalidPluralCountError extends LinguaError {}\nexport class LinguaInvalidStateError extends LinguaError {}\nexport class LinguaMissingCatalogError extends LinguaError {}\nexport class LinguaMissingKeyError extends LinguaError {}\nexport class LinguaMissingValueError extends LinguaError {}\n"],"mappings":"AAAA,IAAa,YAAb,cAAiC,KAAM,CACrC,YAAY,EAAiB,EAAqB,CAChD,MAAMA,EAASC,CAAI,EACnB,KAAK,KAAO,WAAW,KACvB,OAAO,eAAe,KAAM,WAAW,SAAS,CAClD,CACF,EAEa,oBAAb,cAAyC,WAAY,CACnD,aAAc,CACZ,MAAM,+CAA+C,CACvD,CACF,EAEa,0BAAb,cAA+C,WAAY,CAAC,EAC/C,yBAAb,cAA8C,WAAY,CAAC,EAC9C,8BAAb,cAAmD,WAAY,CAAC,EACnD,wBAAb,cAA6C,WAAY,CAAC,EAC7C,0BAAb,cAA+C,WAAY,CAAC,EAC/C,sBAAb,cAA2C,WAAY,CAAC,EAC3C,wBAAb,cAA6C,WAAY,CAAC,E"}
1
+ {"version":3,"file":"errors.cjs","names":["message","opts"],"sources":["../src/errors.ts"],"sourcesContent":["export class LinguaError extends Error {\n constructor(message: string, opts?: ErrorOptions) {\n super(message, opts);\n this.name = new.target.name;\n Object.setPrototypeOf(this, new.target.prototype);\n }\n}\n\nexport class LinguaDisposedError extends LinguaError {\n constructor() {\n super('Operation called on a disposed i18n instance.');\n }\n}\n\nexport class LinguaInvalidCatalogError extends LinguaError {}\nexport class LinguaInvalidLocaleError extends LinguaError {}\nexport class LinguaInvalidPluralCountError extends LinguaError {}\nexport class LinguaMissingCatalogError extends LinguaError {}\nexport class LinguaMissingKeyError extends LinguaError {}\nexport class LinguaMissingValueError extends LinguaError {}\n"],"mappings":"AAAA,IAAa,YAAb,cAAiC,KAAM,CACrC,YAAY,EAAiB,EAAqB,CAChD,MAAMA,EAASC,CAAI,EACnB,KAAK,KAAO,WAAW,KACvB,OAAO,eAAe,KAAM,WAAW,SAAS,CAClD,CACF,EAEa,oBAAb,cAAyC,WAAY,CACnD,aAAc,CACZ,MAAM,+CAA+C,CACvD,CACF,EAEa,0BAAb,cAA+C,WAAY,CAAC,EAC/C,yBAAb,cAA8C,WAAY,CAAC,EAC9C,8BAAb,cAAmD,WAAY,CAAC,EACnD,0BAAb,cAA+C,WAAY,CAAC,EAC/C,sBAAb,cAA2C,WAAY,CAAC,EAC3C,wBAAb,cAA6C,WAAY,CAAC,E"}
package/dist/errors.d.ts CHANGED
@@ -10,8 +10,6 @@ export declare class LinguaInvalidLocaleError extends LinguaError {
10
10
  }
11
11
  export declare class LinguaInvalidPluralCountError extends LinguaError {
12
12
  }
13
- export declare class LinguaInvalidStateError extends LinguaError {
14
- }
15
13
  export declare class LinguaMissingCatalogError extends LinguaError {
16
14
  }
17
15
  export declare class LinguaMissingKeyError extends LinguaError {
@@ -1 +1 @@
1
- {"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAAA,qBAAa,WAAY,SAAQ,KAAK;gBACxB,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,YAAY;CAKjD;AAED,qBAAa,mBAAoB,SAAQ,WAAW;;CAInD;AAED,qBAAa,yBAA0B,SAAQ,WAAW;CAAG;AAC7D,qBAAa,wBAAyB,SAAQ,WAAW;CAAG;AAC5D,qBAAa,6BAA8B,SAAQ,WAAW;CAAG;AACjE,qBAAa,uBAAwB,SAAQ,WAAW;CAAG;AAC3D,qBAAa,yBAA0B,SAAQ,WAAW;CAAG;AAC7D,qBAAa,qBAAsB,SAAQ,WAAW;CAAG;AACzD,qBAAa,uBAAwB,SAAQ,WAAW;CAAG"}
1
+ {"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAAA,qBAAa,WAAY,SAAQ,KAAK;gBACxB,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,YAAY;CAKjD;AAED,qBAAa,mBAAoB,SAAQ,WAAW;;CAInD;AAED,qBAAa,yBAA0B,SAAQ,WAAW;CAAG;AAC7D,qBAAa,wBAAyB,SAAQ,WAAW;CAAG;AAC5D,qBAAa,6BAA8B,SAAQ,WAAW;CAAG;AACjE,qBAAa,yBAA0B,SAAQ,WAAW;CAAG;AAC7D,qBAAa,qBAAsB,SAAQ,WAAW;CAAG;AACzD,qBAAa,uBAAwB,SAAQ,WAAW;CAAG"}
package/dist/errors.js CHANGED
@@ -7,7 +7,7 @@ var LinguaError = class extends Error {
7
7
  constructor() {
8
8
  super("Operation called on a disposed i18n instance.");
9
9
  }
10
- }, LinguaInvalidCatalogError = class extends LinguaError {}, LinguaInvalidLocaleError = class extends LinguaError {}, LinguaInvalidPluralCountError = class extends LinguaError {}, LinguaInvalidStateError = class extends LinguaError {}, LinguaMissingCatalogError = class extends LinguaError {}, LinguaMissingKeyError = class extends LinguaError {}, LinguaMissingValueError = class extends LinguaError {};
11
- export { LinguaDisposedError, LinguaError, LinguaInvalidCatalogError, LinguaInvalidLocaleError, LinguaInvalidPluralCountError, LinguaInvalidStateError, LinguaMissingCatalogError, LinguaMissingKeyError, LinguaMissingValueError };
10
+ }, LinguaInvalidCatalogError = class extends LinguaError {}, LinguaInvalidLocaleError = class extends LinguaError {}, LinguaInvalidPluralCountError = class extends LinguaError {}, LinguaMissingCatalogError = class extends LinguaError {}, LinguaMissingKeyError = class extends LinguaError {}, LinguaMissingValueError = class extends LinguaError {};
11
+ export { LinguaDisposedError, LinguaError, LinguaInvalidCatalogError, LinguaInvalidLocaleError, LinguaInvalidPluralCountError, LinguaMissingCatalogError, LinguaMissingKeyError, LinguaMissingValueError };
12
12
 
13
13
  //# sourceMappingURL=errors.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"errors.js","names":["message","opts"],"sources":["../src/errors.ts"],"sourcesContent":["export class LinguaError extends Error {\n constructor(message: string, opts?: ErrorOptions) {\n super(message, opts);\n this.name = new.target.name;\n Object.setPrototypeOf(this, new.target.prototype);\n }\n}\n\nexport class LinguaDisposedError extends LinguaError {\n constructor() {\n super('Operation called on a disposed i18n instance.');\n }\n}\n\nexport class LinguaInvalidCatalogError extends LinguaError {}\nexport class LinguaInvalidLocaleError extends LinguaError {}\nexport class LinguaInvalidPluralCountError extends LinguaError {}\nexport class LinguaInvalidStateError extends LinguaError {}\nexport class LinguaMissingCatalogError extends LinguaError {}\nexport class LinguaMissingKeyError extends LinguaError {}\nexport class LinguaMissingValueError extends LinguaError {}\n"],"mappings":";AAAA,IAAa,cAAb,cAAiC,MAAM;CACrC,YAAY,GAAiB,GAAqB;EAGhD,AAFA,MAAMA,GAASC,CAAI,GACnB,KAAK,OAAO,WAAW,MACvB,OAAO,eAAe,MAAM,WAAW,SAAS;CAClD;AACF,GAEa,sBAAb,cAAyC,YAAY;CACnD,cAAc;EACZ,MAAM,+CAA+C;CACvD;AACF,GAEa,4BAAb,cAA+C,YAAY,CAAC,GAC/C,2BAAb,cAA8C,YAAY,CAAC,GAC9C,gCAAb,cAAmD,YAAY,CAAC,GACnD,0BAAb,cAA6C,YAAY,CAAC,GAC7C,4BAAb,cAA+C,YAAY,CAAC,GAC/C,wBAAb,cAA2C,YAAY,CAAC,GAC3C,0BAAb,cAA6C,YAAY,CAAC"}
1
+ {"version":3,"file":"errors.js","names":["message","opts"],"sources":["../src/errors.ts"],"sourcesContent":["export class LinguaError extends Error {\n constructor(message: string, opts?: ErrorOptions) {\n super(message, opts);\n this.name = new.target.name;\n Object.setPrototypeOf(this, new.target.prototype);\n }\n}\n\nexport class LinguaDisposedError extends LinguaError {\n constructor() {\n super('Operation called on a disposed i18n instance.');\n }\n}\n\nexport class LinguaInvalidCatalogError extends LinguaError {}\nexport class LinguaInvalidLocaleError extends LinguaError {}\nexport class LinguaInvalidPluralCountError extends LinguaError {}\nexport class LinguaMissingCatalogError extends LinguaError {}\nexport class LinguaMissingKeyError extends LinguaError {}\nexport class LinguaMissingValueError extends LinguaError {}\n"],"mappings":";AAAA,IAAa,cAAb,cAAiC,MAAM;CACrC,YAAY,GAAiB,GAAqB;EAGhD,AAFA,MAAMA,GAASC,CAAI,GACnB,KAAK,OAAO,WAAW,MACvB,OAAO,eAAe,MAAM,WAAW,SAAS;CAClD;AACF,GAEa,sBAAb,cAAyC,YAAY;CACnD,cAAc;EACZ,MAAM,+CAA+C;CACvD;AACF,GAEa,4BAAb,cAA+C,YAAY,CAAC,GAC/C,2BAAb,cAA8C,YAAY,CAAC,GAC9C,gCAAb,cAAmD,YAAY,CAAC,GACnD,4BAAb,cAA+C,YAAY,CAAC,GAC/C,wBAAb,cAA2C,YAAY,CAAC,GAC3C,0BAAb,cAA6C,YAAY,CAAC"}
package/dist/i18n.cjs CHANGED
@@ -1,2 +1,2 @@
1
- require("./_dev.cjs");const e=require("./_locale.cjs"),t=require("./_resources.cjs"),n=require("./errors.cjs"),r=require("./translator.cjs");function createI18n(i){if(i.state&&i.state.version!==1)throw new n.LinguaInvalidStateError(`Unsupported lingua state version: ${String(i.state.version)}.`);let a=i.fallback,o=(Array.isArray(a)?a:a?[a]:[]).map(e.canonicalLocale),s=new AbortController,c=new Set,l=!1,u=e.canonicalLocale(i.locale??i.state?.locale??`en`),d=0,f=0,p=t.createCatalogStore({catalogs:i.catalogs,loadCatalog:i.loadCatalog});if(i.state)for(let[e,t]of Object.entries(i.state.catalogs))p.hydrate(e,t);let loadTargets=async e=>{let t=[];for(let n of new Set([e,...o]))await p.load(n)&&t.push(n);return t},buildTranslator=()=>{let t=e.localeChain(u,o).some(p.isLoaded)?i.missing:()=>{throw new n.LinguaMissingCatalogError(`No catalog loaded for locale "${u}". Call load() before translating.`)};return r.createTranslatorFromCompiled(p.catalogMap(),{fallback:a,locale:u,missing:t})},buildSnapshot=()=>({locale:u,revision:d,translator:buildTranslator()}),m=buildSnapshot(),assertLive=()=>{if(l)throw new n.LinguaDisposedError},dispose=()=>{l||(l=!0,c.clear(),s.abort())},dispatch=e=>{try{e(m)}catch{}},notify=()=>{d++,m=buildSnapshot();for(let e of[...c])dispatch(e)},relevant=t=>e.localeChain(u,o).includes(t);return{get disposalSignal(){return s.signal},dispose,get disposed(){return l},getSnapshot(){return m},isLoaded(e){return!l&&p.isLoaded(e?.locale??u)},async load(t){assertLive();let n=e.canonicalLocale(t?.locale??u),r=await loadTargets(n);assertLive(),r.some(relevant)&&notify()},get locale(){return u},parts(e,t){return m.translator.partsDynamic(e,t)},partsDynamic(e,t){return m.translator.partsDynamic(e,t)},serialize(){return assertLive(),p.state(u)},async setLocale(t){assertLive();let n=e.canonicalLocale(t),r=++f,i=await loadTargets(n);assertLive(),r===f&&(n===u?i.some(relevant)&&notify():(u=n,notify()))},subscribe(e,t){if(assertLive(),t?.signal?.aborted)return()=>{};let unsubscribe=()=>{c.delete(e),t?.signal?.removeEventListener(`abort`,unsubscribe)};return t?.signal?.addEventListener(`abort`,unsubscribe,{once:!0}),c.add(e),t?.immediate&&dispatch(e),unsubscribe},[Symbol.dispose]:dispose,translate(e,t={}){return m.translator.translateDynamic(e,t)},translateDynamic(e,t){return m.translator.translateDynamic(e,t)}}}exports.createI18n=createI18n;
1
+ require("./_dev.cjs");const e=require("./_locale.cjs"),t=require("./_resources.cjs"),n=require("./errors.cjs"),r=require("./translator.cjs");function createI18n(i){let a=(Array.isArray(i.fallback)?i.fallback:i.fallback?[i.fallback]:[]).map(e.canonicalLocale),o=new AbortController,s=new Set,c=!1,l=e.canonicalLocale(i.locale??`en`),u=0,d=t.createCatalogStore({catalogs:i.catalogs,loadCatalog:i.loadCatalog}),loadTargets=async e=>{let t=[];for(let n of new Set([e,...a]))await d.load(n)&&t.push(n);return t},buildEngine=()=>{let t=e.localeChain(l,a).some(d.isLoaded)?i.missing:()=>{throw new n.LinguaMissingCatalogError(`No catalog loaded for locale "${l}". Call load() before translating.`)};return r.createTranslateEngine(d.catalogMap(),{...i,locale:l,missing:t})},assertLive=()=>{if(c)throw new n.LinguaDisposedError},dispose=()=>{c||(c=!0,s.clear(),o.abort())},notify=()=>{f=buildEngine();for(let e of[...s])try{e(l)}catch{}},relevant=t=>e.localeChain(l,a).includes(t),f=buildEngine();return{get disposalSignal(){return o.signal},dispose,get disposed(){return c},getSnapshot(){return l},isLoaded(e){return!c&&d.isLoaded(e?.locale??l)},async load(t){assertLive();let n=e.canonicalLocale(t?.locale??l),r=await loadTargets(n);assertLive(),r.some(relevant)&&notify()},get locale(){return l},serialize(){return assertLive(),d.serialized(l)},async setLocale(t){assertLive();let n=e.canonicalLocale(t),r=++u,i=await loadTargets(n);assertLive(),r===u&&(n===l?i.some(relevant)&&notify():(l=n,notify()))},subscribe(e,t){if(assertLive(),t?.signal?.aborted)return()=>{};let unsubscribe=()=>{s.delete(e),t?.signal?.removeEventListener(`abort`,unsubscribe)};if(t?.signal?.addEventListener(`abort`,unsubscribe,{once:!0}),s.add(e),t?.immediate)try{e(l)}catch{}return unsubscribe},translate:(e,t)=>f.translate(e,t),[Symbol.dispose]:dispose}}exports.createI18n=createI18n;
2
2
  //# sourceMappingURL=i18n.cjs.map
package/dist/i18n.cjs.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"i18n.cjs","names":["LinguaInvalidStateError","canonicalLocale","createCatalogStore","localeChain","LinguaMissingCatalogError","createTranslatorFromCompiled","LinguaDisposedError","error","require__locale","require__resources","require_errors","require_translator","options","fallback","fallbackLocales","controller","subscribers","disposed","locale","revision","transition","catalogs","stateLocale","catalog","changed","candidate","target","missing","snapshot","listener","loadOptions","targetLocale","key","translateOptions","next","nextLocale","request","subscribeOptions"],"sources":["../src/i18n.ts"],"sourcesContent":["import { error as logError } from './_dev';\nimport { canonicalLocale, localeChain } from './_locale';\nimport { createCatalogStore } from './_resources';\nimport { LinguaDisposedError, LinguaInvalidStateError, LinguaMissingCatalogError } from './errors';\nimport { createTranslatorFromCompiled, type Translator } from './translator';\nimport type { Catalog, I18nOptions, Locale, SubscribeOptions, TranslationState } from './types';\n\nexport type I18nSnapshot<C extends Catalog = Catalog> = {\n readonly locale: Locale;\n readonly revision: number;\n /**\n * Translator for this snapshot's locale and loaded catalogs. Components can hold the\n * snapshot and translate through it without importing the whole i18n instance; always\n * re-read it after a notification instead of caching a translator across snapshots.\n */\n readonly translator: Translator<C>;\n};\n\nexport type I18n<C extends Catalog = Catalog> = Translator<C> & {\n [Symbol.dispose](): void;\n readonly disposalSignal: AbortSignal;\n dispose(): void;\n readonly disposed: boolean;\n getSnapshot(): I18nSnapshot<C>;\n isLoaded(options?: { locale?: Locale }): boolean;\n load(options?: { locale?: Locale }): Promise<void>;\n serialize(): TranslationState<C>;\n setLocale(locale: Locale): Promise<void>;\n subscribe(listener: (snapshot: I18nSnapshot<C>) => void, options?: SubscribeOptions): () => void;\n};\n\nexport function createI18n<C extends Catalog>(options: I18nOptions<C>): I18n<C> {\n if (options.state && options.state.version !== 1) {\n throw new LinguaInvalidStateError(`Unsupported lingua state version: ${String(options.state.version)}.`);\n }\n\n const fallback = options.fallback;\n const fallbackLocales = (Array.isArray(fallback) ? fallback : fallback ? [fallback] : []).map(canonicalLocale);\n const controller = new AbortController();\n const subscribers = new Set<(snapshot: I18nSnapshot<C>) => void>();\n let disposed = false;\n let locale = canonicalLocale(options.locale ?? options.state?.locale ?? 'en');\n let revision = 0;\n let transition = 0;\n\n const catalogs = createCatalogStore<C>({ catalogs: options.catalogs, loadCatalog: options.loadCatalog });\n\n // Hydrate from serialized state (SSR).\n if (options.state) {\n for (const [stateLocale, catalog] of Object.entries(options.state.catalogs)) {\n catalogs.hydrate(stateLocale, catalog);\n }\n }\n\n const loadTargets = async (target: Locale): Promise<readonly Locale[]> => {\n const changed: Locale[] = [];\n\n for (const candidate of new Set([target, ...fallbackLocales])) {\n if (await catalogs.load(candidate)) changed.push(candidate);\n }\n\n return changed;\n };\n\n const buildTranslator = (): Translator<C> => {\n const ready = localeChain(locale, fallbackLocales).some(catalogs.isLoaded);\n const missing = ready\n ? options.missing\n : () => {\n throw new LinguaMissingCatalogError(\n `No catalog loaded for locale \"${locale}\". Call load() before translating.`,\n );\n };\n\n return createTranslatorFromCompiled<C>(catalogs.catalogMap(), { fallback, locale, missing });\n };\n\n const buildSnapshot = (): I18nSnapshot<C> => ({ locale, revision, translator: buildTranslator() });\n\n let snapshot = buildSnapshot();\n\n const assertLive = (): void => {\n if (disposed) throw new LinguaDisposedError();\n };\n\n const dispose = (): void => {\n if (disposed) return;\n\n disposed = true;\n subscribers.clear();\n controller.abort();\n };\n\n const dispatch = (listener: (next: I18nSnapshot<C>) => void): void => {\n try {\n listener(snapshot);\n } catch (error) {\n logError('subscriber error', error);\n }\n };\n\n const notify = (): void => {\n revision++;\n snapshot = buildSnapshot();\n\n for (const listener of [...subscribers]) dispatch(listener);\n };\n\n const relevant = (candidate: Locale): boolean => localeChain(locale, fallbackLocales).includes(candidate);\n\n return {\n get disposalSignal() {\n return controller.signal;\n },\n dispose,\n get disposed() {\n return disposed;\n },\n getSnapshot() {\n return snapshot;\n },\n isLoaded(loadOptions) {\n return !disposed && catalogs.isLoaded(loadOptions?.locale ?? locale);\n },\n async load(loadOptions) {\n assertLive();\n\n const targetLocale = canonicalLocale(loadOptions?.locale ?? locale);\n const changed = await loadTargets(targetLocale);\n\n assertLive();\n if (changed.some(relevant)) notify();\n },\n get locale() {\n return locale;\n },\n parts(key: string, translateOptions) {\n return snapshot.translator.partsDynamic(key, translateOptions);\n },\n partsDynamic(key, translateOptions) {\n return snapshot.translator.partsDynamic(key, translateOptions);\n },\n serialize() {\n assertLive();\n\n return catalogs.state(locale);\n },\n async setLocale(nextLocale) {\n assertLive();\n\n const next = canonicalLocale(nextLocale);\n const request = ++transition;\n const changed = await loadTargets(next);\n\n assertLive();\n if (request !== transition) return;\n\n if (next === locale) {\n if (changed.some(relevant)) notify();\n\n return;\n }\n\n locale = next;\n notify();\n },\n subscribe(listener, subscribeOptions) {\n assertLive();\n\n if (subscribeOptions?.signal?.aborted) return () => {};\n\n const unsubscribe = (): void => {\n subscribers.delete(listener);\n subscribeOptions?.signal?.removeEventListener('abort', unsubscribe);\n };\n\n subscribeOptions?.signal?.addEventListener('abort', unsubscribe, { once: true });\n subscribers.add(listener);\n\n if (subscribeOptions?.immediate) dispatch(listener);\n\n return unsubscribe;\n },\n [Symbol.dispose]: dispose,\n translate(key: string, translateOptions = {}) {\n return snapshot.translator.translateDynamic(key, translateOptions);\n },\n translateDynamic(key, translateOptions) {\n return snapshot.translator.translateDynamic(key, translateOptions);\n },\n } as I18n<C>;\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"i18n.cjs","names":["canonicalLocale","createCatalogStore","localeChain","LinguaMissingCatalogError","createTranslateEngine","LinguaDisposedError","error","require__locale","require__resources","require_errors","require_translator","fallbackLocales","options","controller","subscribers","disposed","locale","transition","catalogs","changed","candidate","target","effectiveMissing","listener","engine","loadOptions","targetLocale","next","nextLocale","request","subscribeOptions","key","translateOptions"],"sources":["../src/i18n.ts"],"sourcesContent":["import { error as logError } from './_dev';\nimport { canonicalLocale, localeChain } from './_locale';\nimport { createCatalogStore } from './_resources';\nimport { LinguaDisposedError, LinguaMissingCatalogError } from './errors';\nimport { createTranslateEngine, type Translator } from './translator';\nimport type {\n Catalog,\n I18nOptions,\n Locale,\n PluralOptions,\n SerializedI18n,\n SubscribeOptions,\n TranslateOptions,\n} from './types';\n\nexport type I18n<C extends Catalog = Catalog> = Translator<C> & {\n [Symbol.dispose](): void;\n readonly disposalSignal: AbortSignal;\n dispose(): void;\n readonly disposed: boolean;\n /** Current locale. Referentially stable until the locale changes, so frameworks can use it directly as a store snapshot. */\n getSnapshot(): Locale;\n isLoaded(options?: { locale?: Locale }): boolean;\n load(options?: { locale?: Locale }): Promise<void>;\n serialize(): SerializedI18n<C>;\n setLocale(locale: Locale): Promise<void>;\n subscribe(listener: (locale: Locale) => void, options?: SubscribeOptions): () => void;\n};\n\nexport function createI18n<C extends Catalog>(options: I18nOptions<C>): I18n<C> {\n const fallbackLocales = (\n Array.isArray(options.fallback) ? options.fallback : options.fallback ? [options.fallback] : []\n ).map(canonicalLocale);\n const controller = new AbortController();\n const subscribers = new Set<(locale: Locale) => void>();\n let disposed = false;\n let locale = canonicalLocale(options.locale ?? 'en');\n let transition = 0;\n\n const catalogs = createCatalogStore<C>({ catalogs: options.catalogs, loadCatalog: options.loadCatalog });\n\n const loadTargets = async (target: Locale): Promise<readonly Locale[]> => {\n const changed: Locale[] = [];\n\n for (const candidate of new Set([target, ...fallbackLocales])) {\n if (await catalogs.load(candidate)) changed.push(candidate);\n }\n\n return changed;\n };\n\n const buildEngine = () => {\n const ready = localeChain(locale, fallbackLocales).some(catalogs.isLoaded);\n const effectiveMissing = ready\n ? options.missing\n : (): never => {\n throw new LinguaMissingCatalogError(\n `No catalog loaded for locale \"${locale}\". Call load() before translating.`,\n );\n };\n\n return createTranslateEngine(catalogs.catalogMap(), { ...options, locale, missing: effectiveMissing });\n };\n\n const assertLive = (): void => {\n if (disposed) throw new LinguaDisposedError();\n };\n\n const dispose = (): void => {\n if (disposed) return;\n\n disposed = true;\n subscribers.clear();\n controller.abort();\n };\n\n const notify = (): void => {\n engine = buildEngine();\n\n for (const listener of [...subscribers]) {\n try {\n listener(locale);\n } catch (error) {\n logError('subscriber error', error);\n }\n }\n };\n\n const relevant = (candidate: Locale): boolean => localeChain(locale, fallbackLocales).includes(candidate);\n\n let engine = buildEngine();\n\n const instance: I18n<C> = {\n get disposalSignal() {\n return controller.signal;\n },\n dispose,\n get disposed() {\n return disposed;\n },\n getSnapshot() {\n return locale;\n },\n isLoaded(loadOptions) {\n return !disposed && catalogs.isLoaded(loadOptions?.locale ?? locale);\n },\n async load(loadOptions) {\n assertLive();\n\n const targetLocale = canonicalLocale(loadOptions?.locale ?? locale);\n const changed = await loadTargets(targetLocale);\n\n assertLive();\n if (changed.some(relevant)) notify();\n },\n get locale() {\n return locale;\n },\n serialize() {\n assertLive();\n\n return catalogs.serialized(locale);\n },\n async setLocale(nextLocale) {\n assertLive();\n\n const next = canonicalLocale(nextLocale);\n const request = ++transition;\n const changed = await loadTargets(next);\n\n assertLive();\n if (request !== transition) return;\n\n if (next === locale) {\n if (changed.some(relevant)) notify();\n\n return;\n }\n\n locale = next;\n notify();\n },\n subscribe(listener, subscribeOptions) {\n assertLive();\n\n if (subscribeOptions?.signal?.aborted) return () => {};\n\n const unsubscribe = (): void => {\n subscribers.delete(listener);\n subscribeOptions?.signal?.removeEventListener('abort', unsubscribe);\n };\n\n subscribeOptions?.signal?.addEventListener('abort', unsubscribe, { once: true });\n subscribers.add(listener);\n\n if (subscribeOptions?.immediate) {\n try {\n listener(locale);\n } catch (error) {\n logError('subscriber error', error);\n }\n }\n\n return unsubscribe;\n },\n translate: (key: string, translateOptions?: TranslateOptions | PluralOptions): string =>\n engine.translate(key, translateOptions),\n [Symbol.dispose]: dispose,\n };\n\n return instance;\n}\n"],"mappings":"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"}
package/dist/i18n.d.ts CHANGED
@@ -1,30 +1,21 @@
1
1
  import { type Translator } from './translator';
2
- import type { Catalog, I18nOptions, Locale, SubscribeOptions, TranslationState } from './types';
3
- export type I18nSnapshot<C extends Catalog = Catalog> = {
4
- readonly locale: Locale;
5
- readonly revision: number;
6
- /**
7
- * Translator for this snapshot's locale and loaded catalogs. Components can hold the
8
- * snapshot and translate through it without importing the whole i18n instance; always
9
- * re-read it after a notification instead of caching a translator across snapshots.
10
- */
11
- readonly translator: Translator<C>;
12
- };
2
+ import type { Catalog, I18nOptions, Locale, SerializedI18n, SubscribeOptions } from './types';
13
3
  export type I18n<C extends Catalog = Catalog> = Translator<C> & {
14
4
  [Symbol.dispose](): void;
15
5
  readonly disposalSignal: AbortSignal;
16
6
  dispose(): void;
17
7
  readonly disposed: boolean;
18
- getSnapshot(): I18nSnapshot<C>;
8
+ /** Current locale. Referentially stable until the locale changes, so frameworks can use it directly as a store snapshot. */
9
+ getSnapshot(): Locale;
19
10
  isLoaded(options?: {
20
11
  locale?: Locale;
21
12
  }): boolean;
22
13
  load(options?: {
23
14
  locale?: Locale;
24
15
  }): Promise<void>;
25
- serialize(): TranslationState<C>;
16
+ serialize(): SerializedI18n<C>;
26
17
  setLocale(locale: Locale): Promise<void>;
27
- subscribe(listener: (snapshot: I18nSnapshot<C>) => void, options?: SubscribeOptions): () => void;
18
+ subscribe(listener: (locale: Locale) => void, options?: SubscribeOptions): () => void;
28
19
  };
29
20
  export declare function createI18n<C extends Catalog>(options: I18nOptions<C>): I18n<C>;
30
21
  //# sourceMappingURL=i18n.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"i18n.d.ts","sourceRoot":"","sources":["../src/i18n.ts"],"names":[],"mappings":"AAIA,OAAO,EAAgC,KAAK,UAAU,EAAE,MAAM,cAAc,CAAC;AAC7E,OAAO,KAAK,EAAE,OAAO,EAAE,WAAW,EAAE,MAAM,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,MAAM,SAAS,CAAC;AAEhG,MAAM,MAAM,YAAY,CAAC,CAAC,SAAS,OAAO,GAAG,OAAO,IAAI;IACtD,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B;;;;OAIG;IACH,QAAQ,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC,CAAC,CAAC;CACpC,CAAC;AAEF,MAAM,MAAM,IAAI,CAAC,CAAC,SAAS,OAAO,GAAG,OAAO,IAAI,UAAU,CAAC,CAAC,CAAC,GAAG;IAC9D,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,IAAI,CAAC;IACzB,QAAQ,CAAC,cAAc,EAAE,WAAW,CAAC;IACrC,OAAO,IAAI,IAAI,CAAC;IAChB,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC;IAC3B,WAAW,IAAI,YAAY,CAAC,CAAC,CAAC,CAAC;IAC/B,QAAQ,CAAC,OAAO,CAAC,EAAE;QAAE,MAAM,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC;IACjD,IAAI,CAAC,OAAO,CAAC,EAAE;QAAE,MAAM,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACnD,SAAS,IAAI,gBAAgB,CAAC,CAAC,CAAC,CAAC;IACjC,SAAS,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACzC,SAAS,CAAC,QAAQ,EAAE,CAAC,QAAQ,EAAE,YAAY,CAAC,CAAC,CAAC,KAAK,IAAI,EAAE,OAAO,CAAC,EAAE,gBAAgB,GAAG,MAAM,IAAI,CAAC;CAClG,CAAC;AAEF,wBAAgB,UAAU,CAAC,CAAC,SAAS,OAAO,EAAE,OAAO,EAAE,WAAW,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,CAgK9E"}
1
+ {"version":3,"file":"i18n.d.ts","sourceRoot":"","sources":["../src/i18n.ts"],"names":[],"mappings":"AAIA,OAAO,EAAyB,KAAK,UAAU,EAAE,MAAM,cAAc,CAAC;AACtE,OAAO,KAAK,EACV,OAAO,EACP,WAAW,EACX,MAAM,EAEN,cAAc,EACd,gBAAgB,EAEjB,MAAM,SAAS,CAAC;AAEjB,MAAM,MAAM,IAAI,CAAC,CAAC,SAAS,OAAO,GAAG,OAAO,IAAI,UAAU,CAAC,CAAC,CAAC,GAAG;IAC9D,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,IAAI,CAAC;IACzB,QAAQ,CAAC,cAAc,EAAE,WAAW,CAAC;IACrC,OAAO,IAAI,IAAI,CAAC;IAChB,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC;IAC3B,4HAA4H;IAC5H,WAAW,IAAI,MAAM,CAAC;IACtB,QAAQ,CAAC,OAAO,CAAC,EAAE;QAAE,MAAM,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC;IACjD,IAAI,CAAC,OAAO,CAAC,EAAE;QAAE,MAAM,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACnD,SAAS,IAAI,cAAc,CAAC,CAAC,CAAC,CAAC;IAC/B,SAAS,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACzC,SAAS,CAAC,QAAQ,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,EAAE,OAAO,CAAC,EAAE,gBAAgB,GAAG,MAAM,IAAI,CAAC;CACvF,CAAC;AAEF,wBAAgB,UAAU,CAAC,CAAC,SAAS,OAAO,EAAE,OAAO,EAAE,WAAW,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,CA8I9E"}
package/dist/i18n.js CHANGED
@@ -1,95 +1,78 @@
1
1
  import "./_dev.js";
2
2
  import { canonicalLocale as e, localeChain as t } from "./_locale.js";
3
3
  import { createCatalogStore as n } from "./_resources.js";
4
- import { LinguaDisposedError as r, LinguaInvalidStateError as i, LinguaMissingCatalogError as a } from "./errors.js";
5
- import { createTranslatorFromCompiled as o } from "./translator.js";
4
+ import { LinguaDisposedError as r, LinguaMissingCatalogError as i } from "./errors.js";
5
+ import { createTranslateEngine as a } from "./translator.js";
6
6
  // src/i18n.ts
7
- function createI18n(s) {
8
- if (s.state && s.state.version !== 1) throw new i(`Unsupported lingua state version: ${String(s.state.version)}.`);
9
- let c = s.fallback, l = (Array.isArray(c) ? c : c ? [c] : []).map(e), u = new AbortController(), d = /* @__PURE__ */ new Set(), f = !1, p = e(s.locale ?? s.state?.locale ?? "en"), m = 0, h = 0, g = n({
10
- catalogs: s.catalogs,
11
- loadCatalog: s.loadCatalog
12
- });
13
- if (s.state) for (let [e, t] of Object.entries(s.state.catalogs)) g.hydrate(e, t);
14
- let loadTargets = async (e) => {
7
+ function createI18n(o) {
8
+ let s = (Array.isArray(o.fallback) ? o.fallback : o.fallback ? [o.fallback] : []).map(e), c = new AbortController(), l = /* @__PURE__ */ new Set(), u = !1, d = e(o.locale ?? "en"), f = 0, p = n({
9
+ catalogs: o.catalogs,
10
+ loadCatalog: o.loadCatalog
11
+ }), loadTargets = async (e) => {
15
12
  let t = [];
16
- for (let n of /* @__PURE__ */ new Set([e, ...l])) await g.load(n) && t.push(n);
13
+ for (let n of /* @__PURE__ */ new Set([e, ...s])) await p.load(n) && t.push(n);
17
14
  return t;
18
- }, buildTranslator = () => {
19
- let e = t(p, l).some(g.isLoaded) ? s.missing : () => {
20
- throw new a(`No catalog loaded for locale "${p}". Call load() before translating.`);
15
+ }, buildEngine = () => {
16
+ let e = t(d, s).some(p.isLoaded) ? o.missing : () => {
17
+ throw new i(`No catalog loaded for locale "${d}". Call load() before translating.`);
21
18
  };
22
- return o(g.catalogMap(), {
23
- fallback: c,
24
- locale: p,
19
+ return a(p.catalogMap(), {
20
+ ...o,
21
+ locale: d,
25
22
  missing: e
26
23
  });
27
- }, buildSnapshot = () => ({
28
- locale: p,
29
- revision: m,
30
- translator: buildTranslator()
31
- }), _ = buildSnapshot(), assertLive = () => {
32
- if (f) throw new r();
24
+ }, assertLive = () => {
25
+ if (u) throw new r();
33
26
  }, dispose = () => {
34
- f || (f = !0, d.clear(), u.abort());
35
- }, dispatch = (e) => {
36
- try {
37
- e(_);
38
- } catch {}
27
+ u || (u = !0, l.clear(), c.abort());
39
28
  }, notify = () => {
40
- m++, _ = buildSnapshot();
41
- for (let e of [...d]) dispatch(e);
42
- }, relevant = (e) => t(p, l).includes(e);
29
+ m = buildEngine();
30
+ for (let e of [...l]) try {
31
+ e(d);
32
+ } catch {}
33
+ }, relevant = (e) => t(d, s).includes(e), m = buildEngine();
43
34
  return {
44
35
  get disposalSignal() {
45
- return u.signal;
36
+ return c.signal;
46
37
  },
47
38
  dispose,
48
39
  get disposed() {
49
- return f;
40
+ return u;
50
41
  },
51
42
  getSnapshot() {
52
- return _;
43
+ return d;
53
44
  },
54
45
  isLoaded(e) {
55
- return !f && g.isLoaded(e?.locale ?? p);
46
+ return !u && p.isLoaded(e?.locale ?? d);
56
47
  },
57
48
  async load(t) {
58
49
  assertLive();
59
- let n = e(t?.locale ?? p), r = await loadTargets(n);
50
+ let n = e(t?.locale ?? d), r = await loadTargets(n);
60
51
  assertLive(), r.some(relevant) && notify();
61
52
  },
62
53
  get locale() {
63
- return p;
64
- },
65
- parts(e, t) {
66
- return _.translator.partsDynamic(e, t);
67
- },
68
- partsDynamic(e, t) {
69
- return _.translator.partsDynamic(e, t);
54
+ return d;
70
55
  },
71
56
  serialize() {
72
- return assertLive(), g.state(p);
57
+ return assertLive(), p.serialized(d);
73
58
  },
74
59
  async setLocale(t) {
75
60
  assertLive();
76
- let n = e(t), r = ++h, i = await loadTargets(n);
77
- assertLive(), r === h && (n === p ? i.some(relevant) && notify() : (p = n, notify()));
61
+ let n = e(t), r = ++f, i = await loadTargets(n);
62
+ assertLive(), r === f && (n === d ? i.some(relevant) && notify() : (d = n, notify()));
78
63
  },
79
64
  subscribe(e, t) {
80
65
  if (assertLive(), t?.signal?.aborted) return () => {};
81
66
  let unsubscribe = () => {
82
- d.delete(e), t?.signal?.removeEventListener("abort", unsubscribe);
67
+ l.delete(e), t?.signal?.removeEventListener("abort", unsubscribe);
83
68
  };
84
- return t?.signal?.addEventListener("abort", unsubscribe, { once: !0 }), d.add(e), t?.immediate && dispatch(e), unsubscribe;
85
- },
86
- [Symbol.dispose]: dispose,
87
- translate(e, t = {}) {
88
- return _.translator.translateDynamic(e, t);
69
+ if (t?.signal?.addEventListener("abort", unsubscribe, { once: !0 }), l.add(e), t?.immediate) try {
70
+ e(d);
71
+ } catch {}
72
+ return unsubscribe;
89
73
  },
90
- translateDynamic(e, t) {
91
- return _.translator.translateDynamic(e, t);
92
- }
74
+ translate: (e, t) => m.translate(e, t),
75
+ [Symbol.dispose]: dispose
93
76
  };
94
77
  }
95
78
  export { createI18n };
package/dist/i18n.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"i18n.js","names":["error","options","LinguaInvalidStateError","fallback","fallbackLocales","canonicalLocale","controller","subscribers","disposed","locale","revision","transition","catalogs","createCatalogStore","stateLocale","catalog","changed","candidate","target","missing","localeChain","LinguaMissingCatalogError","createTranslatorFromCompiled","snapshot","LinguaDisposedError","listener","loadOptions","targetLocale","key","translateOptions","next","nextLocale","request","subscribeOptions"],"sources":["../src/i18n.ts"],"sourcesContent":["import { error as logError } from './_dev';\nimport { canonicalLocale, localeChain } from './_locale';\nimport { createCatalogStore } from './_resources';\nimport { LinguaDisposedError, LinguaInvalidStateError, LinguaMissingCatalogError } from './errors';\nimport { createTranslatorFromCompiled, type Translator } from './translator';\nimport type { Catalog, I18nOptions, Locale, SubscribeOptions, TranslationState } from './types';\n\nexport type I18nSnapshot<C extends Catalog = Catalog> = {\n readonly locale: Locale;\n readonly revision: number;\n /**\n * Translator for this snapshot's locale and loaded catalogs. Components can hold the\n * snapshot and translate through it without importing the whole i18n instance; always\n * re-read it after a notification instead of caching a translator across snapshots.\n */\n readonly translator: Translator<C>;\n};\n\nexport type I18n<C extends Catalog = Catalog> = Translator<C> & {\n [Symbol.dispose](): void;\n readonly disposalSignal: AbortSignal;\n dispose(): void;\n readonly disposed: boolean;\n getSnapshot(): I18nSnapshot<C>;\n isLoaded(options?: { locale?: Locale }): boolean;\n load(options?: { locale?: Locale }): Promise<void>;\n serialize(): TranslationState<C>;\n setLocale(locale: Locale): Promise<void>;\n subscribe(listener: (snapshot: I18nSnapshot<C>) => void, options?: SubscribeOptions): () => void;\n};\n\nexport function createI18n<C extends Catalog>(options: I18nOptions<C>): I18n<C> {\n if (options.state && options.state.version !== 1) {\n throw new LinguaInvalidStateError(`Unsupported lingua state version: ${String(options.state.version)}.`);\n }\n\n const fallback = options.fallback;\n const fallbackLocales = (Array.isArray(fallback) ? fallback : fallback ? [fallback] : []).map(canonicalLocale);\n const controller = new AbortController();\n const subscribers = new Set<(snapshot: I18nSnapshot<C>) => void>();\n let disposed = false;\n let locale = canonicalLocale(options.locale ?? options.state?.locale ?? 'en');\n let revision = 0;\n let transition = 0;\n\n const catalogs = createCatalogStore<C>({ catalogs: options.catalogs, loadCatalog: options.loadCatalog });\n\n // Hydrate from serialized state (SSR).\n if (options.state) {\n for (const [stateLocale, catalog] of Object.entries(options.state.catalogs)) {\n catalogs.hydrate(stateLocale, catalog);\n }\n }\n\n const loadTargets = async (target: Locale): Promise<readonly Locale[]> => {\n const changed: Locale[] = [];\n\n for (const candidate of new Set([target, ...fallbackLocales])) {\n if (await catalogs.load(candidate)) changed.push(candidate);\n }\n\n return changed;\n };\n\n const buildTranslator = (): Translator<C> => {\n const ready = localeChain(locale, fallbackLocales).some(catalogs.isLoaded);\n const missing = ready\n ? options.missing\n : () => {\n throw new LinguaMissingCatalogError(\n `No catalog loaded for locale \"${locale}\". Call load() before translating.`,\n );\n };\n\n return createTranslatorFromCompiled<C>(catalogs.catalogMap(), { fallback, locale, missing });\n };\n\n const buildSnapshot = (): I18nSnapshot<C> => ({ locale, revision, translator: buildTranslator() });\n\n let snapshot = buildSnapshot();\n\n const assertLive = (): void => {\n if (disposed) throw new LinguaDisposedError();\n };\n\n const dispose = (): void => {\n if (disposed) return;\n\n disposed = true;\n subscribers.clear();\n controller.abort();\n };\n\n const dispatch = (listener: (next: I18nSnapshot<C>) => void): void => {\n try {\n listener(snapshot);\n } catch (error) {\n logError('subscriber error', error);\n }\n };\n\n const notify = (): void => {\n revision++;\n snapshot = buildSnapshot();\n\n for (const listener of [...subscribers]) dispatch(listener);\n };\n\n const relevant = (candidate: Locale): boolean => localeChain(locale, fallbackLocales).includes(candidate);\n\n return {\n get disposalSignal() {\n return controller.signal;\n },\n dispose,\n get disposed() {\n return disposed;\n },\n getSnapshot() {\n return snapshot;\n },\n isLoaded(loadOptions) {\n return !disposed && catalogs.isLoaded(loadOptions?.locale ?? locale);\n },\n async load(loadOptions) {\n assertLive();\n\n const targetLocale = canonicalLocale(loadOptions?.locale ?? locale);\n const changed = await loadTargets(targetLocale);\n\n assertLive();\n if (changed.some(relevant)) notify();\n },\n get locale() {\n return locale;\n },\n parts(key: string, translateOptions) {\n return snapshot.translator.partsDynamic(key, translateOptions);\n },\n partsDynamic(key, translateOptions) {\n return snapshot.translator.partsDynamic(key, translateOptions);\n },\n serialize() {\n assertLive();\n\n return catalogs.state(locale);\n },\n async setLocale(nextLocale) {\n assertLive();\n\n const next = canonicalLocale(nextLocale);\n const request = ++transition;\n const changed = await loadTargets(next);\n\n assertLive();\n if (request !== transition) return;\n\n if (next === locale) {\n if (changed.some(relevant)) notify();\n\n return;\n }\n\n locale = next;\n notify();\n },\n subscribe(listener, subscribeOptions) {\n assertLive();\n\n if (subscribeOptions?.signal?.aborted) return () => {};\n\n const unsubscribe = (): void => {\n subscribers.delete(listener);\n subscribeOptions?.signal?.removeEventListener('abort', unsubscribe);\n };\n\n subscribeOptions?.signal?.addEventListener('abort', unsubscribe, { once: true });\n subscribers.add(listener);\n\n if (subscribeOptions?.immediate) dispatch(listener);\n\n return unsubscribe;\n },\n [Symbol.dispose]: dispose,\n translate(key: string, translateOptions = {}) {\n return snapshot.translator.translateDynamic(key, translateOptions);\n },\n translateDynamic(key, translateOptions) {\n return snapshot.translator.translateDynamic(key, translateOptions);\n },\n } as I18n<C>;\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"i18n.js","names":["error","fallbackLocales","options","canonicalLocale","controller","subscribers","disposed","locale","transition","catalogs","createCatalogStore","changed","candidate","target","effectiveMissing","localeChain","LinguaMissingCatalogError","createTranslateEngine","LinguaDisposedError","listener","engine","loadOptions","targetLocale","next","nextLocale","request","subscribeOptions","key","translateOptions"],"sources":["../src/i18n.ts"],"sourcesContent":["import { error as logError } from './_dev';\nimport { canonicalLocale, localeChain } from './_locale';\nimport { createCatalogStore } from './_resources';\nimport { LinguaDisposedError, LinguaMissingCatalogError } from './errors';\nimport { createTranslateEngine, type Translator } from './translator';\nimport type {\n Catalog,\n I18nOptions,\n Locale,\n PluralOptions,\n SerializedI18n,\n SubscribeOptions,\n TranslateOptions,\n} from './types';\n\nexport type I18n<C extends Catalog = Catalog> = Translator<C> & {\n [Symbol.dispose](): void;\n readonly disposalSignal: AbortSignal;\n dispose(): void;\n readonly disposed: boolean;\n /** Current locale. Referentially stable until the locale changes, so frameworks can use it directly as a store snapshot. */\n getSnapshot(): Locale;\n isLoaded(options?: { locale?: Locale }): boolean;\n load(options?: { locale?: Locale }): Promise<void>;\n serialize(): SerializedI18n<C>;\n setLocale(locale: Locale): Promise<void>;\n subscribe(listener: (locale: Locale) => void, options?: SubscribeOptions): () => void;\n};\n\nexport function createI18n<C extends Catalog>(options: I18nOptions<C>): I18n<C> {\n const fallbackLocales = (\n Array.isArray(options.fallback) ? options.fallback : options.fallback ? [options.fallback] : []\n ).map(canonicalLocale);\n const controller = new AbortController();\n const subscribers = new Set<(locale: Locale) => void>();\n let disposed = false;\n let locale = canonicalLocale(options.locale ?? 'en');\n let transition = 0;\n\n const catalogs = createCatalogStore<C>({ catalogs: options.catalogs, loadCatalog: options.loadCatalog });\n\n const loadTargets = async (target: Locale): Promise<readonly Locale[]> => {\n const changed: Locale[] = [];\n\n for (const candidate of new Set([target, ...fallbackLocales])) {\n if (await catalogs.load(candidate)) changed.push(candidate);\n }\n\n return changed;\n };\n\n const buildEngine = () => {\n const ready = localeChain(locale, fallbackLocales).some(catalogs.isLoaded);\n const effectiveMissing = ready\n ? options.missing\n : (): never => {\n throw new LinguaMissingCatalogError(\n `No catalog loaded for locale \"${locale}\". Call load() before translating.`,\n );\n };\n\n return createTranslateEngine(catalogs.catalogMap(), { ...options, locale, missing: effectiveMissing });\n };\n\n const assertLive = (): void => {\n if (disposed) throw new LinguaDisposedError();\n };\n\n const dispose = (): void => {\n if (disposed) return;\n\n disposed = true;\n subscribers.clear();\n controller.abort();\n };\n\n const notify = (): void => {\n engine = buildEngine();\n\n for (const listener of [...subscribers]) {\n try {\n listener(locale);\n } catch (error) {\n logError('subscriber error', error);\n }\n }\n };\n\n const relevant = (candidate: Locale): boolean => localeChain(locale, fallbackLocales).includes(candidate);\n\n let engine = buildEngine();\n\n const instance: I18n<C> = {\n get disposalSignal() {\n return controller.signal;\n },\n dispose,\n get disposed() {\n return disposed;\n },\n getSnapshot() {\n return locale;\n },\n isLoaded(loadOptions) {\n return !disposed && catalogs.isLoaded(loadOptions?.locale ?? locale);\n },\n async load(loadOptions) {\n assertLive();\n\n const targetLocale = canonicalLocale(loadOptions?.locale ?? locale);\n const changed = await loadTargets(targetLocale);\n\n assertLive();\n if (changed.some(relevant)) notify();\n },\n get locale() {\n return locale;\n },\n serialize() {\n assertLive();\n\n return catalogs.serialized(locale);\n },\n async setLocale(nextLocale) {\n assertLive();\n\n const next = canonicalLocale(nextLocale);\n const request = ++transition;\n const changed = await loadTargets(next);\n\n assertLive();\n if (request !== transition) return;\n\n if (next === locale) {\n if (changed.some(relevant)) notify();\n\n return;\n }\n\n locale = next;\n notify();\n },\n subscribe(listener, subscribeOptions) {\n assertLive();\n\n if (subscribeOptions?.signal?.aborted) return () => {};\n\n const unsubscribe = (): void => {\n subscribers.delete(listener);\n subscribeOptions?.signal?.removeEventListener('abort', unsubscribe);\n };\n\n subscribeOptions?.signal?.addEventListener('abort', unsubscribe, { once: true });\n subscribers.add(listener);\n\n if (subscribeOptions?.immediate) {\n try {\n listener(locale);\n } catch (error) {\n logError('subscriber error', error);\n }\n }\n\n return unsubscribe;\n },\n translate: (key: string, translateOptions?: TranslateOptions | PluralOptions): string =>\n engine.translate(key, translateOptions),\n [Symbol.dispose]: dispose,\n };\n\n return instance;\n}\n"],"mappings":"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"}
package/dist/index.cjs CHANGED
@@ -1 +1 @@
1
- Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require("./catalog.cjs"),t=require("./errors.cjs"),n=require("./i18n.cjs"),r=require("./translator.cjs");exports.LinguaDisposedError=t.LinguaDisposedError,exports.LinguaError=t.LinguaError,exports.LinguaInvalidCatalogError=t.LinguaInvalidCatalogError,exports.LinguaInvalidLocaleError=t.LinguaInvalidLocaleError,exports.LinguaInvalidPluralCountError=t.LinguaInvalidPluralCountError,exports.LinguaInvalidStateError=t.LinguaInvalidStateError,exports.LinguaMissingCatalogError=t.LinguaMissingCatalogError,exports.LinguaMissingKeyError=t.LinguaMissingKeyError,exports.LinguaMissingValueError=t.LinguaMissingValueError,exports.catalogKeys=e.catalogKeys,exports.createI18n=n.createI18n,exports.createTranslator=r.createTranslator;
1
+ Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require("./catalog.cjs"),t=require("./errors.cjs"),n=require("./i18n.cjs"),r=require("./translator.cjs");exports.LinguaDisposedError=t.LinguaDisposedError,exports.LinguaError=t.LinguaError,exports.LinguaInvalidCatalogError=t.LinguaInvalidCatalogError,exports.LinguaInvalidLocaleError=t.LinguaInvalidLocaleError,exports.LinguaInvalidPluralCountError=t.LinguaInvalidPluralCountError,exports.LinguaMissingCatalogError=t.LinguaMissingCatalogError,exports.LinguaMissingKeyError=t.LinguaMissingKeyError,exports.LinguaMissingValueError=t.LinguaMissingValueError,exports.catalogKeys=e.catalogKeys,exports.createI18n=n.createI18n,exports.createTranslator=r.createTranslator;
package/dist/index.d.ts CHANGED
@@ -1,6 +1,6 @@
1
1
  export { catalogKeys } from './catalog';
2
- export { LinguaDisposedError, LinguaError, LinguaInvalidCatalogError, LinguaInvalidLocaleError, LinguaInvalidPluralCountError, LinguaInvalidStateError, LinguaMissingCatalogError, LinguaMissingKeyError, LinguaMissingValueError, } from './errors';
3
- export { createI18n, type I18n, type I18nSnapshot } from './i18n';
2
+ export { LinguaDisposedError, LinguaError, LinguaInvalidCatalogError, LinguaInvalidLocaleError, LinguaInvalidPluralCountError, LinguaMissingCatalogError, LinguaMissingKeyError, LinguaMissingValueError, } from './errors';
3
+ export { createI18n, type I18n } from './i18n';
4
4
  export { createTranslator, type Translator } from './translator';
5
- export type { Catalog, CatalogNode, Catalogs, I18nOptions, Locale, MessageKey, MissingHandler, MissingInfo, MissingStrategy, Part, PluralCategory, PluralKey, PluralMessage, PluralOptions, SubscribeOptions, TextKey, TextPart, TranslateOptions, TranslationState, TranslatorOptions, ValuePart, Values, } from './types';
5
+ export type { Catalog, CatalogNode, Catalogs, I18nOptions, Locale, MessageKey, MissingHandler, MissingInfo, MissingStrategy, PluralCategory, PluralKey, PluralMessage, PluralOptions, SerializedI18n, SubscribeOptions, TextKey, TranslateOptions, TranslatorOptions, Values, } from './types';
6
6
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AACxC,OAAO,EACL,mBAAmB,EACnB,WAAW,EACX,yBAAyB,EACzB,wBAAwB,EACxB,6BAA6B,EAC7B,uBAAuB,EACvB,yBAAyB,EACzB,qBAAqB,EACrB,uBAAuB,GACxB,MAAM,UAAU,CAAC;AAClB,OAAO,EAAE,UAAU,EAAE,KAAK,IAAI,EAAE,KAAK,YAAY,EAAE,MAAM,QAAQ,CAAC;AAClE,OAAO,EAAE,gBAAgB,EAAE,KAAK,UAAU,EAAE,MAAM,cAAc,CAAC;AACjE,YAAY,EACV,OAAO,EACP,WAAW,EACX,QAAQ,EACR,WAAW,EACX,MAAM,EACN,UAAU,EACV,cAAc,EACd,WAAW,EACX,eAAe,EACf,IAAI,EACJ,cAAc,EACd,SAAS,EACT,aAAa,EACb,aAAa,EACb,gBAAgB,EAChB,OAAO,EACP,QAAQ,EACR,gBAAgB,EAChB,gBAAgB,EAChB,iBAAiB,EACjB,SAAS,EACT,MAAM,GACP,MAAM,SAAS,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AACxC,OAAO,EACL,mBAAmB,EACnB,WAAW,EACX,yBAAyB,EACzB,wBAAwB,EACxB,6BAA6B,EAC7B,yBAAyB,EACzB,qBAAqB,EACrB,uBAAuB,GACxB,MAAM,UAAU,CAAC;AAClB,OAAO,EAAE,UAAU,EAAE,KAAK,IAAI,EAAE,MAAM,QAAQ,CAAC;AAC/C,OAAO,EAAE,gBAAgB,EAAE,KAAK,UAAU,EAAE,MAAM,cAAc,CAAC;AACjE,YAAY,EACV,OAAO,EACP,WAAW,EACX,QAAQ,EACR,WAAW,EACX,MAAM,EACN,UAAU,EACV,cAAc,EACd,WAAW,EACX,eAAe,EACf,cAAc,EACd,SAAS,EACT,aAAa,EACb,aAAa,EACb,cAAc,EACd,gBAAgB,EAChB,OAAO,EACP,gBAAgB,EAChB,iBAAiB,EACjB,MAAM,GACP,MAAM,SAAS,CAAC"}
package/dist/index.js CHANGED
@@ -1,5 +1,5 @@
1
1
  import { catalogKeys as e } from "./catalog.js";
2
- import { LinguaDisposedError as t, LinguaError as n, LinguaInvalidCatalogError as r, LinguaInvalidLocaleError as i, LinguaInvalidPluralCountError as a, LinguaInvalidStateError as o, LinguaMissingCatalogError as s, LinguaMissingKeyError as c, LinguaMissingValueError as l } from "./errors.js";
3
- import { createI18n as u } from "./i18n.js";
4
- import { createTranslator as d } from "./translator.js";
5
- export { t as LinguaDisposedError, n as LinguaError, r as LinguaInvalidCatalogError, i as LinguaInvalidLocaleError, a as LinguaInvalidPluralCountError, o as LinguaInvalidStateError, s as LinguaMissingCatalogError, c as LinguaMissingKeyError, l as LinguaMissingValueError, e as catalogKeys, u as createI18n, d as createTranslator };
2
+ import { LinguaDisposedError as t, LinguaError as n, LinguaInvalidCatalogError as r, LinguaInvalidLocaleError as i, LinguaInvalidPluralCountError as a, LinguaMissingCatalogError as o, LinguaMissingKeyError as s, LinguaMissingValueError as c } from "./errors.js";
3
+ import { createI18n as l } from "./i18n.js";
4
+ import { createTranslator as u } from "./translator.js";
5
+ export { t as LinguaDisposedError, n as LinguaError, r as LinguaInvalidCatalogError, i as LinguaInvalidLocaleError, a as LinguaInvalidPluralCountError, o as LinguaMissingCatalogError, s as LinguaMissingKeyError, c as LinguaMissingValueError, e as catalogKeys, l as createI18n, u as createTranslator };