@let-value/translate 1.0.13 → 1.0.15

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.cjs CHANGED
@@ -96,6 +96,31 @@ const pluralFunc = memo(function pluralFunc$1(locale) {
96
96
  return defaultPluralFunc;
97
97
  }
98
98
  });
99
+ function mergeTranslations(primary, ...others) {
100
+ function mergeRecords(target, source) {
101
+ for (const ctx in source) {
102
+ if (!target[ctx]) {
103
+ target[ctx] = source[ctx];
104
+ continue;
105
+ }
106
+ const targetContext = target[ctx];
107
+ const sourceContext = source[ctx];
108
+ for (const id in sourceContext) if (!targetContext[id]) targetContext[id] = sourceContext[id];
109
+ }
110
+ }
111
+ const result = {
112
+ charset: primary.charset,
113
+ headers: { ...primary.headers },
114
+ translations: { ...primary.translations },
115
+ obsolete: primary.obsolete ? { ...primary.obsolete } : void 0
116
+ };
117
+ for (const other of others) {
118
+ if (other?.translations) mergeRecords(result.translations, other.translations);
119
+ if (other?.obsolete) if (!result.obsolete) result.obsolete = other.obsolete;
120
+ else mergeRecords(result.obsolete, other.obsolete);
121
+ }
122
+ return result;
123
+ }
99
124
 
100
125
  //#endregion
101
126
  //#region src/messages.ts
@@ -160,31 +185,6 @@ function context(...args) {
160
185
  };
161
186
  }
162
187
 
163
- //#endregion
164
- //#region ../node_modules/radash/dist/esm/typed.mjs
165
- const isArray = Array.isArray;
166
- const isObject = (value) => {
167
- return !!value && value.constructor === Object;
168
- };
169
-
170
- //#endregion
171
- //#region ../node_modules/radash/dist/esm/object.mjs
172
- const assign = (initial, override) => {
173
- if (!initial || !override) return initial ?? override ?? {};
174
- return Object.entries({
175
- ...initial,
176
- ...override
177
- }).reduce((acc, [key, value]) => {
178
- return {
179
- ...acc,
180
- [key]: (() => {
181
- if (isObject(initial[key])) return assign(initial[key], value);
182
- return value;
183
- })()
184
- };
185
- }, {});
186
- };
187
-
188
188
  //#endregion
189
189
  //#region src/translator.ts
190
190
  function resolveTranslationModule(module$1) {
@@ -282,7 +282,7 @@ var Translator = class {
282
282
  const base = this.translations[key];
283
283
  if (base) {
284
284
  const parentTranslations = this.parent?.getLocale(locale)?.translations;
285
- const translations = assign(base, parentTranslations);
285
+ const translations = mergeTranslations(base, parentTranslations);
286
286
  delete this.translations[key];
287
287
  const translator = new LocaleTranslator(key, translations);
288
288
  this.translators[key] = translator;
@@ -314,6 +314,13 @@ var Translator = class {
314
314
  //#endregion
315
315
  exports.LocaleTranslator = LocaleTranslator;
316
316
  exports.Translator = Translator;
317
+ exports.assert = assert;
317
318
  exports.context = context;
319
+ exports.memo = memo;
320
+ exports.mergeTranslations = mergeTranslations;
318
321
  exports.message = message;
319
- exports.plural = plural;
322
+ exports.normalizeMessageId = normalizeMessageId;
323
+ exports.normalizeTranslations = normalizeTranslations;
324
+ exports.plural = plural;
325
+ exports.pluralFunc = pluralFunc;
326
+ exports.substitute = substitute;
package/dist/index.d.cts CHANGED
@@ -32,11 +32,18 @@ interface Configuration extends BaseConfiguration {}
32
32
  * A locale identifier
33
33
  * @see {@link PluralFormsLocale} for available locales
34
34
  */
35
- type Locale = Configuration & {};
35
+ type Locale = Configuration["locales"][number] & {};
36
36
  //#endregion
37
37
  //#region src/utils.d.ts
38
38
  type IsUnion<T, U = T> = (T extends any ? (x: T) => 0 : never) extends ((x: U) => 0) ? false : true;
39
39
  type StrictStaticString<T extends string> = string extends T ? never : IsUnion<T> extends true ? never : T;
40
+ declare function assert<T>(value: T, message?: string): asserts value is T;
41
+ declare function memo<T extends (...args: any[]) => any>(fn: T): T;
42
+ declare function substitute(text: string, values?: unknown[]): string;
43
+ declare function normalizeMessageId(msgid: string): string;
44
+ declare function normalizeTranslations(translations: GetTextTranslations): GetTextTranslations;
45
+ declare const pluralFunc: (locale: Locale) => (n: number) => number;
46
+ declare function mergeTranslations(primary: GetTextTranslations, ...others: (GetTextTranslations | undefined)[]): GetTextTranslations;
40
47
  //#endregion
41
48
  //#region src/messages.d.ts
42
49
  interface MessageDescriptor {
@@ -117,8 +124,8 @@ declare class Translator<T extends TranslationRecord = TranslationRecord> {
117
124
  constructor(translations: T, parent?: Translator);
118
125
  loadLocale(locale: Locale, loader?: TranslationLoader): Promise<LocaleTranslator>;
119
126
  getLocale<L extends SyncLocaleKeys<T>>(locale: L): LocaleTranslator;
120
- fetchLocale<L extends keyof T>(locale: L): any;
127
+ fetchLocale<L extends keyof T>(locale: L): LocaleTranslator | Promise<LocaleTranslator>;
121
128
  }
122
129
  //#endregion
123
- export { Configuration, ContextBuilder, ContextMessage, ContextMessageFunction, ContextPluralFunction, ContextPluralMessage, Locale, LocaleTranslator, Message, MessageArgs, MessageDescriptor, MessageFunction, MessageInput, PluralArgs, type PluralFormsLocale, PluralFunction, PluralInput, PluralMessage, Translator, context, message, plural };
130
+ export { Configuration, ContextBuilder, ContextMessage, ContextMessageFunction, ContextPluralFunction, ContextPluralMessage, IsUnion, Locale, LocaleTranslator, Message, MessageArgs, MessageDescriptor, MessageFunction, MessageInput, PluralArgs, type PluralFormsLocale, PluralFunction, PluralInput, PluralMessage, StrictStaticString, Translator, assert, context, memo, mergeTranslations, message, normalizeMessageId, normalizeTranslations, plural, pluralFunc, substitute };
124
131
  //# sourceMappingURL=index.d.cts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.cts","names":[],"sources":["../src/locales.ts","../src/config.ts","../src/utils.ts","../src/messages.ts","../src/translator.ts"],"sourcesContent":[],"mappings":";;;KAAY,iBAAA;;;KCEP,iBAAA;;ADFL;;;iBCOmB;EALd;;;;SAeyB,EALjB,iBAKiB,EAAA;;;;;EASb,QAAA,CAAA,EATF,OASgB,CATR,MASQ,CATD,iBASS,EATU,iBASO,CAAA,CAAA;AAQxD,CAAA;;;;AC7BA;;;AAAiC,UDqBhB,aAAA,SAAsB,iBCrBN,CAAA;;AAEjC;;;AAAsF,KD2B1E,MAAA,GAAS,aC3BiE,GAAA,CAAA,CAAA;;;KAF1E,eAAe,MAAM,oBAAoB,8BAA6B;AFLtE,KEOA,kBFPiB,CAAA,UAAA,MAAA,CAAA,GAAA,MAAA,SEOqC,CFPrC,GAAA,KAAA,GEOiD,OFPjD,CEOyD,CFPzD,CAAA,SAAA,IAAA,GAAA,KAAA,GEOmF,CFPnF;;;UGEZ,iBAAA;;EHFL,OAAA,CAAA,EAAA,MAAA;;UGOK,OAAA;;EFLZ,MAAA,EAAA,MAAA;EAAiB,MAAA,CAAA,EAAA,GAAA,EAAA;;AAUT,UEEI,aAAA,CFFJ;OAKiB,EEFnB,OFEmB,EAAA;KAAmB,MAAA;;AAAlC,UEEE,cAAA,CFFF;EAAO,OAAA,EAAA,MAAA;EASL,EAAA,EELT,OFKS;AAQjB;UEViB,oBAAA;;MAET;ADrBR;AAAmB,KCiCP,WDjCO,CAAA,UAAA,MAAA,CAAA,GAAA,CAAA,EAAA,ECkCR,kBDlCQ,CCkCW,CDlCX,CAAA,CAAA,GAAA,CAAA,UAAA,ECmCA,iBDnCA,CAAA,GAAA,CAAA,OAAA,ECoCH,oBDpCG,EAAA,GAAA,MAAA,EAAA,OAAA,EAAA,CAAA;AAAQ,KCsCf,eAAA,GDtCe,CAAA,UAAA,MAAA,CAAA,CAAA,GAAA,IAAA,ECsC+B,WDtC/B,CCsC2C,CDtC3C,CAAA,EAAA,GCsCkD,ODtClD;AAAM,iBCwCjB,ODxCiB,CAAA,UAAA,MAAA,CAAA,CAAA,GAAA,IAAA,ECwCkB,WDxClB,CCwC8B,CDxC9B,CAAA,CAAA,ECwCmC,ODxCnC;AAAoB,KCyDzC,UAAA,GDzDyC,CAAA,GAAA,KAAA,ECyDjB,ODzDiB,EAAA,EAAA,CAAA,EAAA,MAAA,CAAA;AAA6B,iBC2DlE,MAAA,CD3DkE,GAAA,IAAA,EC2DlD,UD3DkD,CAAA,EC2DrC,aD3DqC;AAAC,KCsEvE,cAAA,GDtEuE,CAAA,GAAA,IAAA,ECsE5C,UDtE4C,EAAA,GCsE7B,aDtE6B;AAEvE,KCqEA,YDrEA,CAAkB,UAAA,MAAA,GAAA,MAAA,CAAA,GAAA,CCqEyB,ODrEzB,CAAA,GCqEoC,WDrEpC,CCqEgD,CDrEhD,CAAA;AAAA,KCsElB,WAAA,GDtEkB,CCsEH,aDtEG,CAAA,GCsEc,UDtEd;AAAoC,KCwEtD,sBAAA,GDxEsD,CAAA,UAAA,MAAA,CAAA,CAAA,GAAA,IAAA,ECwED,WDxEC,CCwEW,CDxEX,CAAA,EAAA,GCwEkB,cDxElB;AAAoB,KC0E1E,qBAAA,GD1E0E,CAAA,GAAA,IAAA,EC0ExC,UD1EwC,EAAA,GC0EzB,oBD1EyB;AAAR,UC4E7D,cAAA,CD5E6D;SAAkC,EC6EnG,sBD7EmG;EAAC,MAAA,EC8ErG,qBD9EqG;;iBCoFjG,mCAAmC,mBAAmB,KAAK;iBAC3D,OAAA,UAAiB,2CAA2C;;;KC1EvE,iBAAA,GAAoB;WAAiC;;AHlBJ,KGmBjD,iBAAA,GHjBiB,GAAA,GGiBS,OHjBT,CGiBiB,iBHjBjB,CAAA;KGkBjB,gBAAA,GAAmB,iBHlBF,GGkBsB,OHlBtB,CGkB8B,iBHlB9B,CAAA,GGkBmD,iBHlBnD;KGmBjB,iBAAA,GAAoB,OHdN,CGcc,MHdd,CGcqB,MHdrB,EGc6B,gBHd7B,CAAA,CAAA;KGed,cHVQ,CAAA,CAAA,CAAA,GAAA,QAKiB,MGMd,CHNc,GGMV,CHNU,CGMR,CHNQ,CAAA,SGMG,mBHNH,GGMyB,CHNzB,GAAA,KAAA,SGOtB,CHPyC,CAAA;KGS5C,mBHTkB,CAAA,UAAA,MAAA,CAAA,GAAA,CGSuB,cHTvB,CAAA,GGSyC,YHTzC,CGSsD,CHTtD,CAAA;KGUlB,kBAAA,GHVU,CGUY,oBHVZ,CAAA,GGUoC,WHVpC;AAAO,cGgBT,gBAAA,CHhBS;EASL,MAAA,EGQL,MHRK;EAQL,YAAM,CAAA,EGCC,mBHDe;sBGGV,uBAAuB;;;EFhCnC,OAAA,EAAA,CAAO,UAAA,MAAA,CAAA,CAAA,GAAA,IAAA,EEqDuB,YFrDvB,CEqDoC,CFrDpC,CAAA,EAAA,GAAA,MAAA;EAAA,MAAA,EAAA,CAAA,GAAA,IAAA,EE6DI,WF7DJ,EAAA,GAAA,MAAA;SAAQ,CAAA,UAAA,MAAA,CAAA,CAAA,OAAA,EEsEV,kBFtEU,CEsES,CFtET,CAAA,CAAA,EAAA;IAAM,OAAA,EAAA,CAAA,UAAA,MAAA,CAAA,CAAA,GAAA,IAAA,EEwEY,mBFxEZ,CEwEgC,CFxEhC,CAAA,EAAA,GAAA,MAAA;IAAoB,MAAA,EAAA,CAAA,GAAA,IAAA,EEyE3B,kBFzE2B,EAAA,GAAA,MAAA;;EAA8B,OAAA,CAAA,OAAA,EE4ElE,oBF5EkE,EAAA,GAAA,MAAA,EAAA,KAAA,EAAA,CAAA,EAAA;IAEvE,OAAA,EAAA,CAAA,UAAkB,MAAA,CAAA,CAAA,GAAA,IAAA,EE6Ee,mBF7Ef,CE6EmC,CF7EnC,CAAA,EAAA,GAAA,MAAA;IAAA,MAAA,EAAA,CAAA,GAAA,IAAA,EE8EJ,kBF9EI,EAAA,GAAA,MAAA;;SAAwD,CAAA,UAAA,MAAA,CAAA,CAAA,GAAA,IAAA,EEiH/C,YFjH+C,CEiHlC,CFjHkC,CAAA,CAAA,EAAA,MAAA;UAAR,CAAA,GAAA,IAAA,EEqHxD,WFrHwD,CAAA,EAAA,MAAA;UAAkC,CAAA,UAAA,MAAA,EAAA,UAAA,MAAA,CAAA,CAAA,OAAA,EE0H/F,cF1H+F,GE0H9E,kBF1H8E,CE0H3D,CF1H2D,CAAA,EAAA,GAAA,IAAA,EE2H/F,YF3H+F,CE2HlF,CF3HkF,CAAA,GAAA,EAAA,CAAA,EAAA,MAAA;EAAC,SAAA,CAAA,UAAA,MAAA,CAAA,CAAA,OAAA,EEoIhG,oBFpIgG,GEoIzE,kBFpIyE,CEoItD,CFpIsD,CAAA,EAAA,GAAA,IAAA,EEqIhG,WFrIgG,GAAA,EAAA,CAAA,EAAA,MAAA;;cE8IpG,qBAAqB,oBAAoB;UAC1C;EDpJK,OAAA,ECqJJ,ODrJI,CCqJI,MDrJa,CCqJN,MDrJM,ECqJE,iBDrJF,CAAA,CAAA;EAKjB,YAAO,ECiJN,ODjJM,CCiJE,MDjJF,CCiJS,MDjJT,ECiJiB,mBDjJjB,CAAA,CAAA;EAOP,OAAA,EC2IJ,OD3IiB,CC2IT,MD3IS,CC2IF,MD1IjB,EC0IyB,OD1IlB,CC0I0B,gBD1I1B,CAAA,CAAA,CAAA;EAID,WAAA,ECuIA,ODvIc,CCuIN,MDvIM,CCuIC,MDrIxB,ECqIgC,gBDrIzB,CAAA,CAAA;EAGE,WAAA,CAAA,YAAoB,ECoIP,CDpIO,EAAA,MAEhB,CAAb,ECkIkC,UDlIrB;EAYT,UAAA,CAAA,MAAW,ECoIM,MDpIN,EAAA,MAAA,CAAA,ECoIuB,iBDpIvB,CAAA,ECoI2C,ODpI3C,CCoImD,gBDpInD,CAAA;EAAA,SAAA,CAAA,UC0IC,cD1ID,CC0IgB,CD1IhB,CAAA,CAAA,CAAA,MAAA,EC0I4B,CD1I5B,CAAA,EC0IgC,gBD1IhC;aACO,CAAA,UAAA,MCmKE,CDnKF,CAAA,CAAA,MAAA,ECmKa,CDnKb,CAAA,EAAA,GAAA"}
1
+ {"version":3,"file":"index.d.cts","names":[],"sources":["../src/locales.ts","../src/config.ts","../src/utils.ts","../src/messages.ts","../src/translator.ts"],"sourcesContent":[],"mappings":"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"}
package/dist/index.d.ts CHANGED
@@ -32,11 +32,18 @@ interface Configuration extends BaseConfiguration {}
32
32
  * A locale identifier
33
33
  * @see {@link PluralFormsLocale} for available locales
34
34
  */
35
- type Locale = Configuration & {};
35
+ type Locale = Configuration["locales"][number] & {};
36
36
  //#endregion
37
37
  //#region src/utils.d.ts
38
38
  type IsUnion<T, U = T> = (T extends any ? (x: T) => 0 : never) extends ((x: U) => 0) ? false : true;
39
39
  type StrictStaticString<T extends string> = string extends T ? never : IsUnion<T> extends true ? never : T;
40
+ declare function assert<T>(value: T, message?: string): asserts value is T;
41
+ declare function memo<T extends (...args: any[]) => any>(fn: T): T;
42
+ declare function substitute(text: string, values?: unknown[]): string;
43
+ declare function normalizeMessageId(msgid: string): string;
44
+ declare function normalizeTranslations(translations: GetTextTranslations): GetTextTranslations;
45
+ declare const pluralFunc: (locale: Locale) => (n: number) => number;
46
+ declare function mergeTranslations(primary: GetTextTranslations, ...others: (GetTextTranslations | undefined)[]): GetTextTranslations;
40
47
  //#endregion
41
48
  //#region src/messages.d.ts
42
49
  interface MessageDescriptor {
@@ -117,8 +124,8 @@ declare class Translator<T extends TranslationRecord = TranslationRecord> {
117
124
  constructor(translations: T, parent?: Translator);
118
125
  loadLocale(locale: Locale, loader?: TranslationLoader): Promise<LocaleTranslator>;
119
126
  getLocale<L extends SyncLocaleKeys<T>>(locale: L): LocaleTranslator;
120
- fetchLocale<L extends keyof T>(locale: L): any;
127
+ fetchLocale<L extends keyof T>(locale: L): LocaleTranslator | Promise<LocaleTranslator>;
121
128
  }
122
129
  //#endregion
123
- export { Configuration, ContextBuilder, ContextMessage, ContextMessageFunction, ContextPluralFunction, ContextPluralMessage, Locale, LocaleTranslator, Message, MessageArgs, MessageDescriptor, MessageFunction, MessageInput, PluralArgs, type PluralFormsLocale, PluralFunction, PluralInput, PluralMessage, Translator, context, message, plural };
130
+ export { Configuration, ContextBuilder, ContextMessage, ContextMessageFunction, ContextPluralFunction, ContextPluralMessage, IsUnion, Locale, LocaleTranslator, Message, MessageArgs, MessageDescriptor, MessageFunction, MessageInput, PluralArgs, type PluralFormsLocale, PluralFunction, PluralInput, PluralMessage, StrictStaticString, Translator, assert, context, memo, mergeTranslations, message, normalizeMessageId, normalizeTranslations, plural, pluralFunc, substitute };
124
131
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","names":[],"sources":["../src/locales.ts","../src/config.ts","../src/utils.ts","../src/messages.ts","../src/translator.ts"],"sourcesContent":[],"mappings":";;;KAAY,iBAAA;;;KCEP,iBAAA;;ADFL;;;iBCOmB;EALd;;;;SAeyB,EALjB,iBAKiB,EAAA;;;;;EASb,QAAA,CAAA,EATF,OASgB,CATR,MASQ,CATD,iBASS,EATU,iBASO,CAAA,CAAA;AAQxD,CAAA;;;;AC7BA;;;AAAiC,UDqBhB,aAAA,SAAsB,iBCrBN,CAAA;;AAEjC;;;AAAsF,KD2B1E,MAAA,GAAS,aC3BiE,GAAA,CAAA,CAAA;;;KAF1E,eAAe,MAAM,oBAAoB,8BAA6B;AFLtE,KEOA,kBFPiB,CAAA,UAAA,MAAA,CAAA,GAAA,MAAA,SEOqC,CFPrC,GAAA,KAAA,GEOiD,OFPjD,CEOyD,CFPzD,CAAA,SAAA,IAAA,GAAA,KAAA,GEOmF,CFPnF;;;UGEZ,iBAAA;;EHFL,OAAA,CAAA,EAAA,MAAA;;UGOK,OAAA;;EFLZ,MAAA,EAAA,MAAA;EAAiB,MAAA,CAAA,EAAA,GAAA,EAAA;;AAUT,UEEI,aAAA,CFFJ;OAKiB,EEFnB,OFEmB,EAAA;KAAmB,MAAA;;AAAlC,UEEE,cAAA,CFFF;EAAO,OAAA,EAAA,MAAA;EASL,EAAA,EELT,OFKS;AAQjB;UEViB,oBAAA;;MAET;ADrBR;AAAmB,KCiCP,WDjCO,CAAA,UAAA,MAAA,CAAA,GAAA,CAAA,EAAA,ECkCR,kBDlCQ,CCkCW,CDlCX,CAAA,CAAA,GAAA,CAAA,UAAA,ECmCA,iBDnCA,CAAA,GAAA,CAAA,OAAA,ECoCH,oBDpCG,EAAA,GAAA,MAAA,EAAA,OAAA,EAAA,CAAA;AAAQ,KCsCf,eAAA,GDtCe,CAAA,UAAA,MAAA,CAAA,CAAA,GAAA,IAAA,ECsC+B,WDtC/B,CCsC2C,CDtC3C,CAAA,EAAA,GCsCkD,ODtClD;AAAM,iBCwCjB,ODxCiB,CAAA,UAAA,MAAA,CAAA,CAAA,GAAA,IAAA,ECwCkB,WDxClB,CCwC8B,CDxC9B,CAAA,CAAA,ECwCmC,ODxCnC;AAAoB,KCyDzC,UAAA,GDzDyC,CAAA,GAAA,KAAA,ECyDjB,ODzDiB,EAAA,EAAA,CAAA,EAAA,MAAA,CAAA;AAA6B,iBC2DlE,MAAA,CD3DkE,GAAA,IAAA,EC2DlD,UD3DkD,CAAA,EC2DrC,aD3DqC;AAAC,KCsEvE,cAAA,GDtEuE,CAAA,GAAA,IAAA,ECsE5C,UDtE4C,EAAA,GCsE7B,aDtE6B;AAEvE,KCqEA,YDrEA,CAAkB,UAAA,MAAA,GAAA,MAAA,CAAA,GAAA,CCqEyB,ODrEzB,CAAA,GCqEoC,WDrEpC,CCqEgD,CDrEhD,CAAA;AAAA,KCsElB,WAAA,GDtEkB,CCsEH,aDtEG,CAAA,GCsEc,UDtEd;AAAoC,KCwEtD,sBAAA,GDxEsD,CAAA,UAAA,MAAA,CAAA,CAAA,GAAA,IAAA,ECwED,WDxEC,CCwEW,CDxEX,CAAA,EAAA,GCwEkB,cDxElB;AAAoB,KC0E1E,qBAAA,GD1E0E,CAAA,GAAA,IAAA,EC0ExC,UD1EwC,EAAA,GC0EzB,oBD1EyB;AAAR,UC4E7D,cAAA,CD5E6D;SAAkC,EC6EnG,sBD7EmG;EAAC,MAAA,EC8ErG,qBD9EqG;;iBCoFjG,mCAAmC,mBAAmB,KAAK;iBAC3D,OAAA,UAAiB,2CAA2C;;;KC1EvE,iBAAA,GAAoB;WAAiC;;AHlBJ,KGmBjD,iBAAA,GHjBiB,GAAA,GGiBS,OHjBT,CGiBiB,iBHjBjB,CAAA;KGkBjB,gBAAA,GAAmB,iBHlBF,GGkBsB,OHlBtB,CGkB8B,iBHlB9B,CAAA,GGkBmD,iBHlBnD;KGmBjB,iBAAA,GAAoB,OHdN,CGcc,MHdd,CGcqB,MHdrB,EGc6B,gBHd7B,CAAA,CAAA;KGed,cHVQ,CAAA,CAAA,CAAA,GAAA,QAKiB,MGMd,CHNc,GGMV,CHNU,CGMR,CHNQ,CAAA,SGMG,mBHNH,GGMyB,CHNzB,GAAA,KAAA,SGOtB,CHPyC,CAAA;KGS5C,mBHTkB,CAAA,UAAA,MAAA,CAAA,GAAA,CGSuB,cHTvB,CAAA,GGSyC,YHTzC,CGSsD,CHTtD,CAAA;KGUlB,kBAAA,GHVU,CGUY,oBHVZ,CAAA,GGUoC,WHVpC;AAAO,cGgBT,gBAAA,CHhBS;EASL,MAAA,EGQL,MHRK;EAQL,YAAM,CAAA,EGCC,mBHDe;sBGGV,uBAAuB;;;EFhCnC,OAAA,EAAA,CAAO,UAAA,MAAA,CAAA,CAAA,GAAA,IAAA,EEqDuB,YFrDvB,CEqDoC,CFrDpC,CAAA,EAAA,GAAA,MAAA;EAAA,MAAA,EAAA,CAAA,GAAA,IAAA,EE6DI,WF7DJ,EAAA,GAAA,MAAA;SAAQ,CAAA,UAAA,MAAA,CAAA,CAAA,OAAA,EEsEV,kBFtEU,CEsES,CFtET,CAAA,CAAA,EAAA;IAAM,OAAA,EAAA,CAAA,UAAA,MAAA,CAAA,CAAA,GAAA,IAAA,EEwEY,mBFxEZ,CEwEgC,CFxEhC,CAAA,EAAA,GAAA,MAAA;IAAoB,MAAA,EAAA,CAAA,GAAA,IAAA,EEyE3B,kBFzE2B,EAAA,GAAA,MAAA;;EAA8B,OAAA,CAAA,OAAA,EE4ElE,oBF5EkE,EAAA,GAAA,MAAA,EAAA,KAAA,EAAA,CAAA,EAAA;IAEvE,OAAA,EAAA,CAAA,UAAkB,MAAA,CAAA,CAAA,GAAA,IAAA,EE6Ee,mBF7Ef,CE6EmC,CF7EnC,CAAA,EAAA,GAAA,MAAA;IAAA,MAAA,EAAA,CAAA,GAAA,IAAA,EE8EJ,kBF9EI,EAAA,GAAA,MAAA;;SAAwD,CAAA,UAAA,MAAA,CAAA,CAAA,GAAA,IAAA,EEiH/C,YFjH+C,CEiHlC,CFjHkC,CAAA,CAAA,EAAA,MAAA;UAAR,CAAA,GAAA,IAAA,EEqHxD,WFrHwD,CAAA,EAAA,MAAA;UAAkC,CAAA,UAAA,MAAA,EAAA,UAAA,MAAA,CAAA,CAAA,OAAA,EE0H/F,cF1H+F,GE0H9E,kBF1H8E,CE0H3D,CF1H2D,CAAA,EAAA,GAAA,IAAA,EE2H/F,YF3H+F,CE2HlF,CF3HkF,CAAA,GAAA,EAAA,CAAA,EAAA,MAAA;EAAC,SAAA,CAAA,UAAA,MAAA,CAAA,CAAA,OAAA,EEoIhG,oBFpIgG,GEoIzE,kBFpIyE,CEoItD,CFpIsD,CAAA,EAAA,GAAA,IAAA,EEqIhG,WFrIgG,GAAA,EAAA,CAAA,EAAA,MAAA;;cE8IpG,qBAAqB,oBAAoB;UAC1C;EDpJK,OAAA,ECqJJ,ODrJI,CCqJI,MDrJa,CCqJN,MDrJM,ECqJE,iBDrJF,CAAA,CAAA;EAKjB,YAAO,ECiJN,ODjJM,CCiJE,MDjJF,CCiJS,MDjJT,ECiJiB,mBDjJjB,CAAA,CAAA;EAOP,OAAA,EC2IJ,OD3IiB,CC2IT,MD3IS,CC2IF,MD1IjB,EC0IyB,OD1IlB,CC0I0B,gBD1I1B,CAAA,CAAA,CAAA;EAID,WAAA,ECuIA,ODvIc,CCuIN,MDvIM,CCuIC,MDrIxB,ECqIgC,gBDrIzB,CAAA,CAAA;EAGE,WAAA,CAAA,YAAoB,ECoIP,CDpIO,EAAA,MAEhB,CAAb,ECkIkC,UDlIrB;EAYT,UAAA,CAAA,MAAW,ECoIM,MDpIN,EAAA,MAAA,CAAA,ECoIuB,iBDpIvB,CAAA,ECoI2C,ODpI3C,CCoImD,gBDpInD,CAAA;EAAA,SAAA,CAAA,UC0IC,cD1ID,CC0IgB,CD1IhB,CAAA,CAAA,CAAA,MAAA,EC0I4B,CD1I5B,CAAA,EC0IgC,gBD1IhC;aACO,CAAA,UAAA,MCmKE,CDnKF,CAAA,CAAA,MAAA,ECmKa,CDnKb,CAAA,EAAA,GAAA"}
1
+ {"version":3,"file":"index.d.ts","names":[],"sources":["../src/locales.ts","../src/config.ts","../src/utils.ts","../src/messages.ts","../src/translator.ts"],"sourcesContent":[],"mappings":"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"}
package/dist/index.js CHANGED
@@ -72,6 +72,31 @@ const pluralFunc = memo(function pluralFunc$1(locale) {
72
72
  return defaultPluralFunc;
73
73
  }
74
74
  });
75
+ function mergeTranslations(primary, ...others) {
76
+ function mergeRecords(target, source) {
77
+ for (const ctx in source) {
78
+ if (!target[ctx]) {
79
+ target[ctx] = source[ctx];
80
+ continue;
81
+ }
82
+ const targetContext = target[ctx];
83
+ const sourceContext = source[ctx];
84
+ for (const id in sourceContext) if (!targetContext[id]) targetContext[id] = sourceContext[id];
85
+ }
86
+ }
87
+ const result = {
88
+ charset: primary.charset,
89
+ headers: { ...primary.headers },
90
+ translations: { ...primary.translations },
91
+ obsolete: primary.obsolete ? { ...primary.obsolete } : void 0
92
+ };
93
+ for (const other of others) {
94
+ if (other?.translations) mergeRecords(result.translations, other.translations);
95
+ if (other?.obsolete) if (!result.obsolete) result.obsolete = other.obsolete;
96
+ else mergeRecords(result.obsolete, other.obsolete);
97
+ }
98
+ return result;
99
+ }
75
100
 
76
101
  //#endregion
77
102
  //#region src/messages.ts
@@ -136,31 +161,6 @@ function context(...args) {
136
161
  };
137
162
  }
138
163
 
139
- //#endregion
140
- //#region ../node_modules/radash/dist/esm/typed.mjs
141
- const isArray = Array.isArray;
142
- const isObject = (value) => {
143
- return !!value && value.constructor === Object;
144
- };
145
-
146
- //#endregion
147
- //#region ../node_modules/radash/dist/esm/object.mjs
148
- const assign = (initial, override) => {
149
- if (!initial || !override) return initial ?? override ?? {};
150
- return Object.entries({
151
- ...initial,
152
- ...override
153
- }).reduce((acc, [key, value]) => {
154
- return {
155
- ...acc,
156
- [key]: (() => {
157
- if (isObject(initial[key])) return assign(initial[key], value);
158
- return value;
159
- })()
160
- };
161
- }, {});
162
- };
163
-
164
164
  //#endregion
165
165
  //#region src/translator.ts
166
166
  function resolveTranslationModule(module) {
@@ -258,7 +258,7 @@ var Translator = class {
258
258
  const base = this.translations[key];
259
259
  if (base) {
260
260
  const parentTranslations = this.parent?.getLocale(locale)?.translations;
261
- const translations = assign(base, parentTranslations);
261
+ const translations = mergeTranslations(base, parentTranslations);
262
262
  delete this.translations[key];
263
263
  const translator = new LocaleTranslator(key, translations);
264
264
  this.translators[key] = translator;
@@ -288,5 +288,5 @@ var Translator = class {
288
288
  };
289
289
 
290
290
  //#endregion
291
- export { LocaleTranslator, Translator, context, message, plural };
291
+ export { LocaleTranslator, Translator, assert, context, memo, mergeTranslations, message, normalizeMessageId, normalizeTranslations, plural, pluralFunc, substitute };
292
292
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":["message","placeholders: string[]","index","normalized: GetTextTranslations","context","pluralFunc","id","message","args","plural","buildMessage","buildPlural","args","context"],"sources":["../src/utils.ts","../src/messages.ts","../../node_modules/radash/dist/esm/typed.mjs","../../node_modules/radash/dist/esm/object.mjs","../src/translator.ts"],"sourcesContent":["import type { GetTextTranslations } from \"gettext-parser\";\nimport { getNPlurals, getPluralFunc } from \"plural-forms\";\nimport type { Locale } from \"./config.ts\";\n\n// biome-ignore lint/suspicious/noExplicitAny: true\nexport type IsUnion<T, U = T> = (T extends any ? (x: T) => 0 : never) extends (x: U) => 0 ? false : true;\n\nexport type StrictStaticString<T extends string> = string extends T ? never : IsUnion<T> extends true ? never : T;\n\nexport function assert<T>(value: T, message?: string): asserts value is T {\n if (!value) {\n throw new Error(message || \"Assertion failed\");\n }\n}\n\n// biome-ignore lint/suspicious/noExplicitAny: true\nexport function memo<T extends (...args: any[]) => any>(fn: T): T {\n const cache = new Map<string, ReturnType<T>>();\n return ((...args: Parameters<T>): ReturnType<T> => {\n const key = JSON.stringify(args);\n if (cache.has(key)) {\n // biome-ignore lint/style/noNonNullAssertion: true\n return cache.get(key)!;\n }\n const result = fn(...args);\n cache.set(key, result);\n return result;\n }) as T;\n}\n\nexport function substitute(text: string, values: unknown[] = []): string {\n const placeholders: string[] = [];\n\n return text.replace(/\\$\\{([^}]+)\\}/g, (match, placeholder) => {\n if (/^\\d+$/.test(placeholder)) {\n const index = Number(placeholder);\n return index < values.length ? String(values[index]) : match;\n }\n\n let index = placeholders.indexOf(placeholder);\n if (index === -1) {\n index = placeholders.length;\n placeholders.push(placeholder);\n }\n\n return index < values.length ? String(values[index]) : match;\n });\n}\n\nexport function normalizeMessageId(msgid: string): string {\n const placeholders: string[] = [];\n return msgid.replace(/\\$\\{([^}]+)\\}/g, (match, placeholder) => {\n if (/^\\d+$/.test(placeholder)) {\n return match;\n }\n\n let index = placeholders.indexOf(placeholder);\n if (index === -1) {\n index = placeholders.length;\n placeholders.push(placeholder);\n }\n return `\\${${index}}`;\n });\n}\n\nexport function normalizeTranslations(translations: GetTextTranslations): GetTextTranslations {\n const normalized: GetTextTranslations = {\n ...translations,\n translations: {},\n };\n\n for (const [context, messages] of Object.entries(translations.translations)) {\n normalized.translations[context] = {};\n for (const [msgid, entry] of Object.entries(messages)) {\n const normalizedId = normalizeMessageId(msgid);\n normalized.translations[context][normalizedId] = entry;\n }\n }\n\n return normalized;\n}\n\nconst defaultPluralFunc = (n: number) => (n !== 1 ? 1 : 0);\n\nexport const pluralFunc = memo(function pluralFunc(locale: Locale) {\n try {\n const length = Number(getNPlurals(locale));\n if (length === 1) {\n return () => 0;\n }\n const pluralFunc = getPluralFunc(locale);\n const forms = Array.from({ length }, (_, i) => String(i));\n return (n: number) => {\n const idx = Number(pluralFunc(n, forms));\n if (!Number.isFinite(idx) || idx < 0) return 0;\n if (idx >= length) return length - 1;\n return Math.floor(idx);\n };\n } catch {\n return defaultPluralFunc;\n }\n});\n","import { assert, type StrictStaticString } from \"./utils.ts\";\n\nexport interface MessageDescriptor {\n id?: string;\n message?: string;\n}\n\nexport interface Message {\n msgid: string;\n msgstr: string;\n // biome-ignore lint/suspicious/noExplicitAny: true\n values?: any[];\n}\n\nexport interface PluralMessage {\n forms: Message[];\n n: number;\n}\n\nexport interface ContextMessage {\n context: string;\n id: Message;\n}\n\nexport interface ContextPluralMessage {\n context: string;\n id: PluralMessage;\n}\n\nfunction buildFromTemplate(strings: TemplateStringsArray): string {\n let result = \"\";\n for (let i = 0; i < strings.length; i++) {\n result += strings[i];\n if (i < strings.length - 1) result += `\\${${i}}`;\n }\n return result;\n}\n\nexport type MessageArgs<T extends string> =\n | [id: StrictStaticString<T>]\n | [descriptor: MessageDescriptor]\n | [strings: TemplateStringsArray, ...values: unknown[]];\n\nexport type MessageFunction = <T extends string>(...args: MessageArgs<T>) => Message;\n\nexport function message<T extends string>(...args: MessageArgs<T>): Message {\n const [source, ...values] = args as [MessageDescriptor | TemplateStringsArray, ...unknown[]];\n\n if (typeof source === \"string\") {\n return { msgid: source, msgstr: source };\n }\n\n if (typeof source === \"object\" && \"reduce\" in source) {\n const id = buildFromTemplate(source);\n return { msgid: id, msgstr: id, values };\n }\n\n const id = source.id ?? source.message ?? \"\";\n const message = source.message ?? source.id ?? \"\";\n return { msgid: id, msgstr: message };\n}\n\nexport type PluralArgs = [...forms: Message[], n: number];\n\nexport function plural(...args: PluralArgs): PluralMessage {\n assert(args.length > 1, \"At least one plural form and n are required\");\n\n const n = args[args.length - 1] as number;\n assert(typeof n === \"number\", \"The last argument must be a number\");\n\n const forms = args.slice(0, -1) as Message[];\n\n return { forms, n };\n}\n\nexport type PluralFunction = (...args: PluralArgs) => PluralMessage;\nexport type MessageInput<T extends string = string> = [Message] | MessageArgs<T>;\nexport type PluralInput = [PluralMessage] | PluralArgs;\n\nexport type ContextMessageFunction = <T extends string>(...args: MessageArgs<T>) => ContextMessage;\n\nexport type ContextPluralFunction = (...args: PluralArgs) => ContextPluralMessage;\n\nexport interface ContextBuilder {\n message: ContextMessageFunction;\n plural: ContextPluralFunction;\n}\n\nconst baseMessage = message;\nconst basePlural = plural;\n\nexport function context<T extends string>(context: StrictStaticString<T>): ContextBuilder;\nexport function context(strings: TemplateStringsArray, ...values: never[]): ContextBuilder;\nexport function context<T extends string>(\n ...args: [StrictStaticString<T>] | [TemplateStringsArray, ...never[]]\n): ContextBuilder {\n const [source] = args as [StrictStaticString<T> | TemplateStringsArray];\n\n const ctx = typeof source === \"string\" ? source : source[0];\n\n function message<T extends string>(...args: MessageArgs<T>): ContextMessage {\n return { id: baseMessage(...args), context: ctx };\n }\n\n function plural(...forms: PluralArgs): ContextPluralMessage {\n return { id: basePlural(...forms), context: ctx };\n }\n\n return {\n message,\n plural,\n };\n}\n","const isSymbol = (value) => {\n return !!value && value.constructor === Symbol;\n};\nconst isArray = Array.isArray;\nconst isObject = (value) => {\n return !!value && value.constructor === Object;\n};\nconst isPrimitive = (value) => {\n return value === void 0 || value === null || typeof value !== \"object\" && typeof value !== \"function\";\n};\nconst isFunction = (value) => {\n return !!(value && value.constructor && value.call && value.apply);\n};\nconst isString = (value) => {\n return typeof value === \"string\" || value instanceof String;\n};\nconst isInt = (value) => {\n return isNumber(value) && value % 1 === 0;\n};\nconst isFloat = (value) => {\n return isNumber(value) && value % 1 !== 0;\n};\nconst isNumber = (value) => {\n try {\n return Number(value) === value;\n } catch {\n return false;\n }\n};\nconst isDate = (value) => {\n return Object.prototype.toString.call(value) === \"[object Date]\";\n};\nconst isPromise = (value) => {\n if (!value)\n return false;\n if (!value.then)\n return false;\n if (!isFunction(value.then))\n return false;\n return true;\n};\nconst isEmpty = (value) => {\n if (value === true || value === false)\n return true;\n if (value === null || value === void 0)\n return true;\n if (isNumber(value))\n return value === 0;\n if (isDate(value))\n return isNaN(value.getTime());\n if (isFunction(value))\n return false;\n if (isSymbol(value))\n return false;\n const length = value.length;\n if (isNumber(length))\n return length === 0;\n const size = value.size;\n if (isNumber(size))\n return size === 0;\n const keys = Object.keys(value).length;\n return keys === 0;\n};\nconst isEqual = (x, y) => {\n if (Object.is(x, y))\n return true;\n if (x instanceof Date && y instanceof Date) {\n return x.getTime() === y.getTime();\n }\n if (x instanceof RegExp && y instanceof RegExp) {\n return x.toString() === y.toString();\n }\n if (typeof x !== \"object\" || x === null || typeof y !== \"object\" || y === null) {\n return false;\n }\n const keysX = Reflect.ownKeys(x);\n const keysY = Reflect.ownKeys(y);\n if (keysX.length !== keysY.length)\n return false;\n for (let i = 0; i < keysX.length; i++) {\n if (!Reflect.has(y, keysX[i]))\n return false;\n if (!isEqual(x[keysX[i]], y[keysX[i]]))\n return false;\n }\n return true;\n};\n\nexport { isArray, isDate, isEmpty, isEqual, isFloat, isFunction, isInt, isNumber, isObject, isPrimitive, isPromise, isString, isSymbol };\n//# sourceMappingURL=typed.mjs.map\n","import { objectify } from './array.mjs';\nimport { isPrimitive, isObject, isArray } from './typed.mjs';\n\nconst shake = (obj, filter = (x) => x === void 0) => {\n if (!obj)\n return {};\n const keys2 = Object.keys(obj);\n return keys2.reduce((acc, key) => {\n if (filter(obj[key])) {\n return acc;\n } else {\n acc[key] = obj[key];\n return acc;\n }\n }, {});\n};\nconst mapKeys = (obj, mapFunc) => {\n const keys2 = Object.keys(obj);\n return keys2.reduce((acc, key) => {\n acc[mapFunc(key, obj[key])] = obj[key];\n return acc;\n }, {});\n};\nconst mapValues = (obj, mapFunc) => {\n const keys2 = Object.keys(obj);\n return keys2.reduce((acc, key) => {\n acc[key] = mapFunc(obj[key], key);\n return acc;\n }, {});\n};\nconst mapEntries = (obj, toEntry) => {\n if (!obj)\n return {};\n return Object.entries(obj).reduce((acc, [key, value]) => {\n const [newKey, newValue] = toEntry(key, value);\n acc[newKey] = newValue;\n return acc;\n }, {});\n};\nconst invert = (obj) => {\n if (!obj)\n return {};\n const keys2 = Object.keys(obj);\n return keys2.reduce((acc, key) => {\n acc[obj[key]] = key;\n return acc;\n }, {});\n};\nconst lowerize = (obj) => mapKeys(obj, (k) => k.toLowerCase());\nconst upperize = (obj) => mapKeys(obj, (k) => k.toUpperCase());\nconst clone = (obj) => {\n if (isPrimitive(obj)) {\n return obj;\n }\n if (typeof obj === \"function\") {\n return obj.bind({});\n }\n const newObj = new obj.constructor();\n Object.getOwnPropertyNames(obj).forEach((prop) => {\n newObj[prop] = obj[prop];\n });\n return newObj;\n};\nconst listify = (obj, toItem) => {\n if (!obj)\n return [];\n const entries = Object.entries(obj);\n if (entries.length === 0)\n return [];\n return entries.reduce((acc, entry) => {\n acc.push(toItem(entry[0], entry[1]));\n return acc;\n }, []);\n};\nconst pick = (obj, keys2) => {\n if (!obj)\n return {};\n return keys2.reduce((acc, key) => {\n if (Object.prototype.hasOwnProperty.call(obj, key))\n acc[key] = obj[key];\n return acc;\n }, {});\n};\nconst omit = (obj, keys2) => {\n if (!obj)\n return {};\n if (!keys2 || keys2.length === 0)\n return obj;\n return keys2.reduce(\n (acc, key) => {\n delete acc[key];\n return acc;\n },\n { ...obj }\n );\n};\nconst get = (value, path, defaultValue) => {\n const segments = path.split(/[\\.\\[\\]]/g);\n let current = value;\n for (const key of segments) {\n if (current === null)\n return defaultValue;\n if (current === void 0)\n return defaultValue;\n const dequoted = key.replace(/['\"]/g, \"\");\n if (dequoted.trim() === \"\")\n continue;\n current = current[dequoted];\n }\n if (current === void 0)\n return defaultValue;\n return current;\n};\nconst set = (initial, path, value) => {\n if (!initial)\n return {};\n if (!path || value === void 0)\n return initial;\n const segments = path.split(/[\\.\\[\\]]/g).filter((x) => !!x.trim());\n const _set = (node) => {\n if (segments.length > 1) {\n const key = segments.shift();\n const nextIsNum = /^\\d+$/.test(segments[0]);\n node[key] = node[key] === void 0 ? nextIsNum ? [] : {} : node[key];\n _set(node[key]);\n } else {\n node[segments[0]] = value;\n }\n };\n const cloned = clone(initial);\n _set(cloned);\n return cloned;\n};\nconst assign = (initial, override) => {\n if (!initial || !override)\n return initial ?? override ?? {};\n return Object.entries({ ...initial, ...override }).reduce(\n (acc, [key, value]) => {\n return {\n ...acc,\n [key]: (() => {\n if (isObject(initial[key]))\n return assign(initial[key], value);\n return value;\n })()\n };\n },\n {}\n );\n};\nconst keys = (value) => {\n if (!value)\n return [];\n const getKeys = (nested, paths) => {\n if (isObject(nested)) {\n return Object.entries(nested).flatMap(\n ([k, v]) => getKeys(v, [...paths, k])\n );\n }\n if (isArray(nested)) {\n return nested.flatMap((item, i) => getKeys(item, [...paths, `${i}`]));\n }\n return [paths.join(\".\")];\n };\n return getKeys(value, []);\n};\nconst crush = (value) => {\n if (!value)\n return {};\n return objectify(\n keys(value),\n (k) => k,\n (k) => get(value, k)\n );\n};\nconst construct = (obj) => {\n if (!obj)\n return {};\n return Object.keys(obj).reduce((acc, path) => {\n return set(acc, path, obj[path]);\n }, {});\n};\n\nexport { assign, clone, construct, crush, get, invert, keys, listify, lowerize, mapEntries, mapKeys, mapValues, omit, pick, set, shake, upperize };\n//# sourceMappingURL=object.mjs.map\n","import type { GetTextTranslations } from \"gettext-parser\";\nimport { assign } from \"radash\";\nimport type { Locale } from \"./config.ts\";\n\nimport {\n message as buildMessage,\n plural as buildPlural,\n type ContextMessage,\n type ContextPluralMessage,\n type Message,\n type MessageArgs,\n type MessageInput,\n type PluralArgs,\n type PluralInput,\n type PluralMessage,\n} from \"./messages.ts\";\nimport { normalizeTranslations, pluralFunc, type StrictStaticString, substitute } from \"./utils.ts\";\n\ntype TranslationModule = GetTextTranslations | { default: GetTextTranslations };\ntype TranslationLoader = () => Promise<TranslationModule>;\ntype TranslationEntry = TranslationModule | Promise<TranslationModule> | TranslationLoader;\ntype TranslationRecord = Partial<Record<Locale, TranslationEntry>>;\ntype SyncLocaleKeys<T> = {\n [K in keyof T]: T[K] extends GetTextTranslations ? K : never;\n}[keyof T];\n\ntype ContextMessageInput<T extends string> = [ContextMessage] | MessageInput<T>;\ntype ContextPluralInput = [ContextPluralMessage] | PluralInput;\n\nfunction resolveTranslationModule(module: TranslationModule): GetTextTranslations {\n return \"default\" in module ? module.default : module;\n}\n\nexport class LocaleTranslator {\n locale: Locale;\n translations?: GetTextTranslations;\n\n constructor(locale: Locale, translations?: GetTextTranslations) {\n this.locale = locale;\n this.translations = translations ? normalizeTranslations(translations) : undefined;\n }\n\n private translateMessage({ msgid, msgstr, values }: Message, msgctxt = \"\"): string {\n const translated = this.translations?.translations?.[msgctxt]?.[msgid];\n const result = translated?.msgstr?.[0] || msgstr;\n return values ? substitute(result, values) : result;\n }\n\n private translatePlural({ forms, n }: PluralMessage, msgctxt = \"\"): string {\n const entry = this.translations?.translations?.[msgctxt]?.[forms[0].msgid];\n const index = pluralFunc(this.locale)(n);\n const form = forms[index] ?? forms[forms.length - 1];\n const translated = entry?.msgstr ? (entry.msgstr[index] ?? entry.msgstr[entry.msgstr.length - 1]) : undefined;\n const result = translated || form.msgstr;\n const usedVals = form.values?.length ? form.values : forms[0].values;\n return usedVals?.length ? substitute(result, usedVals) : result;\n }\n\n message = <T extends string>(...args: MessageInput<T>): string => {\n const [source] = args;\n if (typeof source === \"object\" && \"msgid\" in source) {\n return this.translateMessage(source);\n }\n return this.translateMessage(buildMessage(...(args as MessageArgs<T>)));\n };\n\n plural = (...args: PluralInput): string => {\n const [source] = args;\n if (typeof source === \"object\" && \"forms\" in source) {\n return this.translatePlural(source);\n }\n return this.translatePlural(buildPlural(...(args as PluralArgs)));\n };\n\n context<T extends string>(\n context: StrictStaticString<T>,\n ): {\n message: <T extends string>(...args: ContextMessageInput<T>) => string;\n plural: (...args: ContextPluralInput) => string;\n };\n context(\n strings: TemplateStringsArray,\n ...values: never[]\n ): {\n message: <T extends string>(...args: ContextMessageInput<T>) => string;\n plural: (...args: ContextPluralInput) => string;\n };\n context<T extends string>(...args: [StrictStaticString<T>] | [TemplateStringsArray, ...never[]]) {\n const [source] = args as [StrictStaticString<T> | TemplateStringsArray];\n\n const ctx = typeof source === \"string\" ? source : source[0];\n\n return {\n message: <T extends string>(...args: ContextMessageInput<T>): string => {\n const [src] = args;\n if (typeof src === \"object\") {\n if (\"id\" in src && \"context\" in src) {\n return this.translateMessage(src.id, src.context);\n }\n if (\"msgid\" in src) {\n return this.translateMessage(src, ctx);\n }\n }\n return this.translateMessage(buildMessage(...(args as MessageArgs<T>)), ctx);\n },\n plural: (...args: ContextPluralInput): string => {\n const [src] = args;\n if (typeof src === \"object\") {\n if (\"id\" in src && \"context\" in src) {\n return this.translatePlural(src.id, src.context);\n }\n if (\"forms\" in src) {\n return this.translatePlural(src, ctx);\n }\n }\n return this.translatePlural(buildPlural(...(args as PluralArgs)), ctx);\n },\n };\n }\n\n gettext<T extends string>(...args: MessageInput<T>): string {\n return this.message(...args);\n }\n\n ngettext(...args: PluralInput): string {\n return this.plural(...args);\n }\n\n pgettext<C extends string, T extends string>(\n context: ContextMessage | StrictStaticString<C>,\n ...args: MessageInput<T> | []\n ): string {\n if (typeof context === \"object\") {\n return this.translateMessage(context.id, context.context);\n }\n return this.context(context).message(...(args as ContextMessageInput<T>));\n }\n\n npgettext<C extends string>(\n context: ContextPluralMessage | StrictStaticString<C>,\n ...args: PluralInput | []\n ): string {\n if (typeof context === \"object\") {\n return this.translatePlural(context.id, context.context);\n }\n return this.context(context).plural(...(args as ContextPluralInput));\n }\n}\n\nexport class Translator<T extends TranslationRecord = TranslationRecord> {\n parent: Translator | undefined;\n loaders: Partial<Record<Locale, TranslationLoader>> = {};\n translations: Partial<Record<Locale, GetTextTranslations>> = {};\n pending: Partial<Record<Locale, Promise<LocaleTranslator>>> = {};\n translators: Partial<Record<Locale, LocaleTranslator>> = {};\n\n constructor(translations: T, parent?: Translator) {\n this.parent = parent;\n for (const [locale, value] of Object.entries(translations) as [Locale, TranslationEntry][]) {\n if (!value) continue;\n if (typeof value === \"function\") {\n this.loaders[locale] = value;\n } else if (\"then\" in value) {\n this.loaders[locale] = () => value;\n } else {\n this.translations[locale] = resolveTranslationModule(value);\n }\n }\n }\n\n async loadLocale(locale: Locale, loader?: TranslationLoader): Promise<LocaleTranslator> {\n this.loaders[locale] = loader ?? this.loaders[locale];\n\n return this.fetchLocale(locale as never);\n }\n\n getLocale<L extends SyncLocaleKeys<T>>(locale: L): LocaleTranslator {\n const key = locale as Locale;\n const existing = this.translators[key];\n if (existing) {\n return existing;\n }\n\n const base = this.translations[key];\n if (base) {\n const parentTranslations = this.parent?.getLocale(locale as never)?.translations;\n const translations = assign<GetTextTranslations>(base, parentTranslations as never);\n delete this.translations[key];\n\n const translator = new LocaleTranslator(key, translations);\n this.translators[key] = translator;\n return translator;\n }\n\n if (this.pending[key] || this.loaders[key]) {\n throw new Error(\"async locale cannot be loaded synchronously\");\n }\n\n this.translators[key] ??= new LocaleTranslator(key);\n return this.translators[key];\n }\n\n fetchLocale<L extends keyof T>(locale: L) {\n const key = locale as Locale;\n\n const pending = this.pending[key];\n if (pending) {\n return pending;\n }\n\n const loader = this.loaders[key];\n if (loader) {\n const promise = loader().then((translations) => {\n this.translations[key] ??= resolveTranslationModule(translations);\n delete this.pending[key];\n\n return this.getLocale(key as never);\n });\n this.pending[key] = promise;\n delete this.loaders[key];\n\n return promise;\n }\n\n return this.getLocale(key as never);\n }\n}\n"],"x_google_ignoreList":[2,3],"mappings":"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"}
1
+ {"version":3,"file":"index.js","names":["message","placeholders: string[]","index","normalized: GetTextTranslations","context","pluralFunc","result: GetTextTranslations","id","message","args","plural","buildMessage","buildPlural","args","context"],"sources":["../src/utils.ts","../src/messages.ts","../src/translator.ts"],"sourcesContent":["import type { GetTextTranslationRecord, GetTextTranslations } from \"gettext-parser\";\nimport { getNPlurals, getPluralFunc } from \"plural-forms\";\n\nimport type { Locale } from \"./config.ts\";\n\n// biome-ignore lint/suspicious/noExplicitAny: true\nexport type IsUnion<T, U = T> = (T extends any ? (x: T) => 0 : never) extends (x: U) => 0 ? false : true;\n\nexport type StrictStaticString<T extends string> = string extends T ? never : IsUnion<T> extends true ? never : T;\n\nexport function assert<T>(value: T, message?: string): asserts value is T {\n if (!value) {\n throw new Error(message || \"Assertion failed\");\n }\n}\n\n// biome-ignore lint/suspicious/noExplicitAny: true\nexport function memo<T extends (...args: any[]) => any>(fn: T): T {\n const cache = new Map<string, ReturnType<T>>();\n return ((...args: Parameters<T>): ReturnType<T> => {\n const key = JSON.stringify(args);\n if (cache.has(key)) {\n // biome-ignore lint/style/noNonNullAssertion: true\n return cache.get(key)!;\n }\n const result = fn(...args);\n cache.set(key, result);\n return result;\n }) as T;\n}\n\nexport function substitute(text: string, values: unknown[] = []): string {\n const placeholders: string[] = [];\n\n return text.replace(/\\$\\{([^}]+)\\}/g, (match, placeholder) => {\n if (/^\\d+$/.test(placeholder)) {\n const index = Number(placeholder);\n return index < values.length ? String(values[index]) : match;\n }\n\n let index = placeholders.indexOf(placeholder);\n if (index === -1) {\n index = placeholders.length;\n placeholders.push(placeholder);\n }\n\n return index < values.length ? String(values[index]) : match;\n });\n}\n\nexport function normalizeMessageId(msgid: string): string {\n const placeholders: string[] = [];\n return msgid.replace(/\\$\\{([^}]+)\\}/g, (match, placeholder) => {\n if (/^\\d+$/.test(placeholder)) {\n return match;\n }\n\n let index = placeholders.indexOf(placeholder);\n if (index === -1) {\n index = placeholders.length;\n placeholders.push(placeholder);\n }\n return `\\${${index}}`;\n });\n}\n\nexport function normalizeTranslations(translations: GetTextTranslations): GetTextTranslations {\n const normalized: GetTextTranslations = {\n ...translations,\n translations: {},\n };\n\n for (const [context, messages] of Object.entries(translations.translations)) {\n normalized.translations[context] = {};\n for (const [msgid, entry] of Object.entries(messages)) {\n const normalizedId = normalizeMessageId(msgid);\n normalized.translations[context][normalizedId] = entry;\n }\n }\n\n return normalized;\n}\n\nconst defaultPluralFunc = (n: number) => (n !== 1 ? 1 : 0);\n\nexport const pluralFunc = memo(function pluralFunc(locale: Locale) {\n try {\n const length = Number(getNPlurals(locale));\n if (length === 1) {\n return () => 0;\n }\n const pluralFunc = getPluralFunc(locale);\n const forms = Array.from({ length }, (_, i) => String(i));\n return (n: number) => {\n const idx = Number(pluralFunc(n, forms));\n if (!Number.isFinite(idx) || idx < 0) return 0;\n if (idx >= length) return length - 1;\n return Math.floor(idx);\n };\n } catch {\n return defaultPluralFunc;\n }\n});\n\nexport function mergeTranslations(\n primary: GetTextTranslations,\n ...others: (GetTextTranslations | undefined)[]\n): GetTextTranslations {\n function mergeRecords(target: GetTextTranslationRecord, source: GetTextTranslationRecord): void {\n for (const ctx in source) {\n if (!target[ctx]) {\n target[ctx] = source[ctx];\n continue;\n }\n\n const targetContext = target[ctx];\n const sourceContext = source[ctx];\n for (const id in sourceContext) {\n if (!targetContext[id]) {\n targetContext[id] = sourceContext[id];\n }\n }\n }\n }\n\n const result: GetTextTranslations = {\n charset: primary.charset,\n headers: { ...primary.headers },\n translations: { ...primary.translations },\n obsolete: primary.obsolete ? { ...primary.obsolete } : undefined,\n };\n\n for (const other of others) {\n if (other?.translations) {\n mergeRecords(result.translations, other.translations);\n }\n\n if (other?.obsolete) {\n if (!result.obsolete) {\n result.obsolete = other.obsolete;\n } else {\n mergeRecords(result.obsolete, other.obsolete);\n }\n }\n }\n\n return result;\n}\n","import { assert, type StrictStaticString } from \"./utils.ts\";\n\nexport interface MessageDescriptor {\n id?: string;\n message?: string;\n}\n\nexport interface Message {\n msgid: string;\n msgstr: string;\n // biome-ignore lint/suspicious/noExplicitAny: true\n values?: any[];\n}\n\nexport interface PluralMessage {\n forms: Message[];\n n: number;\n}\n\nexport interface ContextMessage {\n context: string;\n id: Message;\n}\n\nexport interface ContextPluralMessage {\n context: string;\n id: PluralMessage;\n}\n\nfunction buildFromTemplate(strings: TemplateStringsArray): string {\n let result = \"\";\n for (let i = 0; i < strings.length; i++) {\n result += strings[i];\n if (i < strings.length - 1) result += `\\${${i}}`;\n }\n return result;\n}\n\nexport type MessageArgs<T extends string> =\n | [id: StrictStaticString<T>]\n | [descriptor: MessageDescriptor]\n | [strings: TemplateStringsArray, ...values: unknown[]];\n\nexport type MessageFunction = <T extends string>(...args: MessageArgs<T>) => Message;\n\nexport function message<T extends string>(...args: MessageArgs<T>): Message {\n const [source, ...values] = args as [MessageDescriptor | TemplateStringsArray, ...unknown[]];\n\n if (typeof source === \"string\") {\n return { msgid: source, msgstr: source };\n }\n\n if (typeof source === \"object\" && \"reduce\" in source) {\n const id = buildFromTemplate(source);\n return { msgid: id, msgstr: id, values };\n }\n\n const id = source.id ?? source.message ?? \"\";\n const message = source.message ?? source.id ?? \"\";\n return { msgid: id, msgstr: message };\n}\n\nexport type PluralArgs = [...forms: Message[], n: number];\n\nexport function plural(...args: PluralArgs): PluralMessage {\n assert(args.length > 1, \"At least one plural form and n are required\");\n\n const n = args[args.length - 1] as number;\n assert(typeof n === \"number\", \"The last argument must be a number\");\n\n const forms = args.slice(0, -1) as Message[];\n\n return { forms, n };\n}\n\nexport type PluralFunction = (...args: PluralArgs) => PluralMessage;\nexport type MessageInput<T extends string = string> = [Message] | MessageArgs<T>;\nexport type PluralInput = [PluralMessage] | PluralArgs;\n\nexport type ContextMessageFunction = <T extends string>(...args: MessageArgs<T>) => ContextMessage;\n\nexport type ContextPluralFunction = (...args: PluralArgs) => ContextPluralMessage;\n\nexport interface ContextBuilder {\n message: ContextMessageFunction;\n plural: ContextPluralFunction;\n}\n\nconst baseMessage = message;\nconst basePlural = plural;\n\nexport function context<T extends string>(context: StrictStaticString<T>): ContextBuilder;\nexport function context(strings: TemplateStringsArray, ...values: never[]): ContextBuilder;\nexport function context<T extends string>(\n ...args: [StrictStaticString<T>] | [TemplateStringsArray, ...never[]]\n): ContextBuilder {\n const [source] = args as [StrictStaticString<T> | TemplateStringsArray];\n\n const ctx = typeof source === \"string\" ? source : source[0];\n\n function message<T extends string>(...args: MessageArgs<T>): ContextMessage {\n return { id: baseMessage(...args), context: ctx };\n }\n\n function plural(...forms: PluralArgs): ContextPluralMessage {\n return { id: basePlural(...forms), context: ctx };\n }\n\n return {\n message,\n plural,\n };\n}\n","import type { GetTextTranslations } from \"gettext-parser\";\nimport type { Locale } from \"./config.ts\";\n\nimport {\n message as buildMessage,\n plural as buildPlural,\n type ContextMessage,\n type ContextPluralMessage,\n type Message,\n type MessageArgs,\n type MessageInput,\n type PluralArgs,\n type PluralInput,\n type PluralMessage,\n} from \"./messages.ts\";\nimport { mergeTranslations, normalizeTranslations, pluralFunc, type StrictStaticString, substitute } from \"./utils.ts\";\n\ntype TranslationModule = GetTextTranslations | { default: GetTextTranslations };\ntype TranslationLoader = () => Promise<TranslationModule>;\ntype TranslationEntry = TranslationModule | Promise<TranslationModule> | TranslationLoader;\ntype TranslationRecord = Partial<Record<Locale, TranslationEntry>>;\ntype SyncLocaleKeys<T> = {\n [K in keyof T]: T[K] extends GetTextTranslations ? K : never;\n}[keyof T];\n\ntype ContextMessageInput<T extends string> = [ContextMessage] | MessageInput<T>;\ntype ContextPluralInput = [ContextPluralMessage] | PluralInput;\n\nfunction resolveTranslationModule(module: TranslationModule): GetTextTranslations {\n return \"default\" in module ? module.default : module;\n}\n\nexport class LocaleTranslator {\n locale: Locale;\n translations?: GetTextTranslations;\n\n constructor(locale: Locale, translations?: GetTextTranslations) {\n this.locale = locale;\n this.translations = translations ? normalizeTranslations(translations) : undefined;\n }\n\n private translateMessage({ msgid, msgstr, values }: Message, msgctxt = \"\"): string {\n const translated = this.translations?.translations?.[msgctxt]?.[msgid];\n const result = translated?.msgstr?.[0] || msgstr;\n return values ? substitute(result, values) : result;\n }\n\n private translatePlural({ forms, n }: PluralMessage, msgctxt = \"\"): string {\n const entry = this.translations?.translations?.[msgctxt]?.[forms[0].msgid];\n const index = pluralFunc(this.locale)(n);\n const form = forms[index] ?? forms[forms.length - 1];\n const translated = entry?.msgstr ? (entry.msgstr[index] ?? entry.msgstr[entry.msgstr.length - 1]) : undefined;\n const result = translated || form.msgstr;\n const usedVals = form.values?.length ? form.values : forms[0].values;\n return usedVals?.length ? substitute(result, usedVals) : result;\n }\n\n message = <T extends string>(...args: MessageInput<T>): string => {\n const [source] = args;\n if (typeof source === \"object\" && \"msgid\" in source) {\n return this.translateMessage(source);\n }\n return this.translateMessage(buildMessage(...(args as MessageArgs<T>)));\n };\n\n plural = (...args: PluralInput): string => {\n const [source] = args;\n if (typeof source === \"object\" && \"forms\" in source) {\n return this.translatePlural(source);\n }\n return this.translatePlural(buildPlural(...(args as PluralArgs)));\n };\n\n context<T extends string>(\n context: StrictStaticString<T>,\n ): {\n message: <T extends string>(...args: ContextMessageInput<T>) => string;\n plural: (...args: ContextPluralInput) => string;\n };\n context(\n strings: TemplateStringsArray,\n ...values: never[]\n ): {\n message: <T extends string>(...args: ContextMessageInput<T>) => string;\n plural: (...args: ContextPluralInput) => string;\n };\n context<T extends string>(...args: [StrictStaticString<T>] | [TemplateStringsArray, ...never[]]) {\n const [source] = args as [StrictStaticString<T> | TemplateStringsArray];\n\n const ctx = typeof source === \"string\" ? source : source[0];\n\n return {\n message: <T extends string>(...args: ContextMessageInput<T>): string => {\n const [src] = args;\n if (typeof src === \"object\") {\n if (\"id\" in src && \"context\" in src) {\n return this.translateMessage(src.id, src.context);\n }\n if (\"msgid\" in src) {\n return this.translateMessage(src, ctx);\n }\n }\n return this.translateMessage(buildMessage(...(args as MessageArgs<T>)), ctx);\n },\n plural: (...args: ContextPluralInput): string => {\n const [src] = args;\n if (typeof src === \"object\") {\n if (\"id\" in src && \"context\" in src) {\n return this.translatePlural(src.id, src.context);\n }\n if (\"forms\" in src) {\n return this.translatePlural(src, ctx);\n }\n }\n return this.translatePlural(buildPlural(...(args as PluralArgs)), ctx);\n },\n };\n }\n\n gettext<T extends string>(...args: MessageInput<T>): string {\n return this.message(...args);\n }\n\n ngettext(...args: PluralInput): string {\n return this.plural(...args);\n }\n\n pgettext<C extends string, T extends string>(\n context: ContextMessage | StrictStaticString<C>,\n ...args: MessageInput<T> | []\n ): string {\n if (typeof context === \"object\") {\n return this.translateMessage(context.id, context.context);\n }\n return this.context(context).message(...(args as ContextMessageInput<T>));\n }\n\n npgettext<C extends string>(\n context: ContextPluralMessage | StrictStaticString<C>,\n ...args: PluralInput | []\n ): string {\n if (typeof context === \"object\") {\n return this.translatePlural(context.id, context.context);\n }\n return this.context(context).plural(...(args as ContextPluralInput));\n }\n}\n\nexport class Translator<T extends TranslationRecord = TranslationRecord> {\n parent: Translator | undefined;\n loaders: Partial<Record<Locale, TranslationLoader>> = {};\n translations: Partial<Record<Locale, GetTextTranslations>> = {};\n pending: Partial<Record<Locale, Promise<LocaleTranslator>>> = {};\n translators: Partial<Record<Locale, LocaleTranslator>> = {};\n\n constructor(translations: T, parent?: Translator) {\n this.parent = parent;\n for (const [locale, value] of Object.entries(translations) as [Locale, TranslationEntry][]) {\n if (!value) continue;\n if (typeof value === \"function\") {\n this.loaders[locale] = value;\n } else if (\"then\" in value) {\n this.loaders[locale] = () => value;\n } else {\n this.translations[locale] = resolveTranslationModule(value);\n }\n }\n }\n\n async loadLocale(locale: Locale, loader?: TranslationLoader): Promise<LocaleTranslator> {\n this.loaders[locale] = loader ?? this.loaders[locale];\n\n return this.fetchLocale(locale as never);\n }\n\n getLocale<L extends SyncLocaleKeys<T>>(locale: L): LocaleTranslator {\n const key = locale as Locale;\n const existing = this.translators[key];\n if (existing) {\n return existing;\n }\n\n const base = this.translations[key];\n if (base) {\n const parentTranslations = this.parent?.getLocale(locale as never)?.translations;\n const translations = mergeTranslations(base, parentTranslations);\n delete this.translations[key];\n\n const translator = new LocaleTranslator(key, translations);\n this.translators[key] = translator;\n return translator;\n }\n\n if (this.pending[key] || this.loaders[key]) {\n throw new Error(\"async locale cannot be loaded synchronously\");\n }\n\n this.translators[key] ??= new LocaleTranslator(key);\n return this.translators[key];\n }\n\n fetchLocale<L extends keyof T>(locale: L) {\n const key = locale as Locale;\n\n const pending = this.pending[key];\n if (pending) {\n return pending;\n }\n\n const loader = this.loaders[key];\n if (loader) {\n const promise = loader().then((translations) => {\n this.translations[key] ??= resolveTranslationModule(translations);\n delete this.pending[key];\n\n return this.getLocale(key as never);\n });\n this.pending[key] = promise;\n delete this.loaders[key];\n\n return promise;\n }\n\n return this.getLocale(key as never);\n }\n}\n"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@let-value/translate",
3
- "version": "1.0.13",
3
+ "version": "1.0.15",
4
4
  "type": "module",
5
5
  "main": "dist/index.cjs",
6
6
  "module": "dist/index.js",
@@ -24,7 +24,6 @@
24
24
  "test": "node --test"
25
25
  },
26
26
  "dependencies": {
27
- "glob": "11.0.3",
28
27
  "plural-forms": "0.5.5"
29
28
  },
30
29
  "devDependencies": {