@let-value/translate 1.0.20 → 1.0.23

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md ADDED
@@ -0,0 +1,3 @@
1
+ # @let-value/translate
2
+
3
+ 👋 Agents: start at AGENTS.md → /docs/BASE.md.
package/dist/index.cjs CHANGED
@@ -187,6 +187,31 @@ function context(...args) {
187
187
 
188
188
  //#endregion
189
189
  //#region src/translator.ts
190
+ function selectValues(message$1, fallback) {
191
+ const values = message$1?.values;
192
+ if (values?.length) return values;
193
+ return fallback?.values;
194
+ }
195
+ function selectTemplate(preferred, fallback) {
196
+ return preferred?.length ? preferred : fallback;
197
+ }
198
+ function applyValues(template, message$1, fallback) {
199
+ const values = selectValues(message$1, fallback);
200
+ return values?.length ? substitute(template, values) : template;
201
+ }
202
+ function isPluralMessage(value) {
203
+ return Boolean(value) && typeof value === "object" && "forms" in value;
204
+ }
205
+ function isContextMessage(value) {
206
+ if (!value || typeof value !== "object" || !("id" in value)) return false;
207
+ const candidate = value.id;
208
+ return !isPluralMessage(candidate);
209
+ }
210
+ function isContextPluralMessage(value) {
211
+ if (!value || typeof value !== "object" || !("id" in value)) return false;
212
+ const candidate = value.id;
213
+ return isPluralMessage(candidate);
214
+ }
190
215
  function resolveTranslationModule(module$1) {
191
216
  return "default" in module$1 ? module$1.default : module$1;
192
217
  }
@@ -197,64 +222,52 @@ var LocaleTranslator = class {
197
222
  this.locale = locale;
198
223
  this.translations = translations ? normalizeTranslations(translations) : void 0;
199
224
  }
200
- translateMessage({ msgid, msgstr, values }, msgctxt = "") {
201
- const result = (this.translations?.translations?.[msgctxt]?.[msgid])?.msgstr?.[0] || msgstr;
202
- return values ? substitute(result, values) : result;
203
- }
204
- translatePlural({ forms, n }, msgctxt = "") {
205
- const entry = this.translations?.translations?.[msgctxt]?.[forms[0].msgid];
206
- const index = pluralFunc(this.locale)(n);
207
- const form = forms[index] ?? forms[forms.length - 1];
208
- const result = (entry?.msgstr ? entry.msgstr[index] ?? entry.msgstr[entry.msgstr.length - 1] : void 0) || form.msgstr;
209
- const usedVals = form.values?.length ? form.values : forms[0].values;
210
- return usedVals?.length ? substitute(result, usedVals) : result;
211
- }
212
- message = (...args) => {
213
- const [source] = args;
214
- if (typeof source === "object" && "msgid" in source) return this.translateMessage(source);
215
- return this.translateMessage(message(...args));
225
+ resolveMessage = (message$1, context$1 = "") => {
226
+ const entry = this.translations?.translations?.[context$1]?.[message$1.msgid];
227
+ const template = selectTemplate(entry?.msgstr?.[0], message$1.msgstr);
228
+ return applyValues(template, message$1);
216
229
  };
217
- plural = (...args) => {
218
- const [source] = args;
219
- if (typeof source === "object" && "forms" in source) return this.translatePlural(source);
220
- return this.translatePlural(plural(...args));
230
+ resolvePluralForm = (message$1, context$1 = "") => {
231
+ const entry = this.translations?.translations?.[context$1]?.[message$1.forms[0].msgid];
232
+ const index = pluralFunc(this.locale)(message$1.n);
233
+ const forms = message$1.forms;
234
+ const selectedForm = forms[index] ?? forms[forms.length - 1];
235
+ const translatedForms = entry?.msgstr;
236
+ const templateCandidate = translatedForms?.length ? translatedForms[index] ?? translatedForms[translatedForms.length - 1] : void 0;
237
+ const template = selectTemplate(templateCandidate, selectedForm.msgstr);
238
+ return applyValues(template, selectedForm, forms[0]);
239
+ };
240
+ translateValue = (message$1) => {
241
+ if (isContextPluralMessage(message$1)) return this.resolvePluralForm(message$1.id, message$1.context);
242
+ if (isContextMessage(message$1)) return this.resolveMessage(message$1.id, message$1.context);
243
+ if (isPluralMessage(message$1)) return this.resolvePluralForm(message$1);
244
+ return this.resolveMessage(message$1);
245
+ };
246
+ translateMessage = (args, context$1) => {
247
+ const message$1 = message(...args);
248
+ return this.resolveMessage(message$1, context$1);
249
+ };
250
+ translatePlural = (args, context$1) => {
251
+ const message$1 = plural(...args);
252
+ return this.resolvePluralForm(message$1, context$1);
253
+ };
254
+ translate = (message$1) => {
255
+ return this.translateValue(message$1);
221
256
  };
222
- context(...args) {
257
+ message = (...args) => this.translateMessage(args);
258
+ plural = (...args) => this.translatePlural(args);
259
+ context = (...args) => {
223
260
  const [source] = args;
224
- const ctx = typeof source === "string" ? source : source[0];
261
+ const context$1 = typeof source === "string" ? source : source[0];
225
262
  return {
226
- message: (...args$1) => {
227
- const [src] = args$1;
228
- if (typeof src === "object") {
229
- if ("id" in src && "context" in src) return this.translateMessage(src.id, src.context);
230
- if ("msgid" in src) return this.translateMessage(src, ctx);
231
- }
232
- return this.translateMessage(message(...args$1), ctx);
233
- },
234
- plural: (...args$1) => {
235
- const [src] = args$1;
236
- if (typeof src === "object") {
237
- if ("id" in src && "context" in src) return this.translatePlural(src.id, src.context);
238
- if ("forms" in src) return this.translatePlural(src, ctx);
239
- }
240
- return this.translatePlural(plural(...args$1), ctx);
241
- }
263
+ message: (...args$1) => this.translateMessage(args$1, context$1),
264
+ plural: (...args$1) => this.translatePlural(args$1, context$1)
242
265
  };
243
- }
244
- gettext(...args) {
245
- return this.message(...args);
246
- }
247
- ngettext(...args) {
248
- return this.plural(...args);
249
- }
250
- pgettext(context$1, ...args) {
251
- if (typeof context$1 === "object") return this.translateMessage(context$1.id, context$1.context);
252
- return this.context(context$1).message(...args);
253
- }
254
- npgettext(context$1, ...args) {
255
- if (typeof context$1 === "object") return this.translatePlural(context$1.id, context$1.context);
256
- return this.context(context$1).plural(...args);
257
- }
266
+ };
267
+ gettext = (...args) => this.message(...args);
268
+ ngettext = (...args) => this.plural(...args);
269
+ pgettext = (context$1, ...args) => this.translateMessage(args, context$1);
270
+ npgettext = (context$1, ...args) => this.translatePlural(args, context$1);
258
271
  };
259
272
  var Translator = class {
260
273
  parent;
@@ -271,11 +284,11 @@ var Translator = class {
271
284
  else this.translations[locale] = resolveTranslationModule(value);
272
285
  }
273
286
  }
274
- async loadLocale(locale, loader) {
287
+ loadLocale = async (locale, loader) => {
275
288
  this.loaders[locale] = loader ?? this.loaders[locale];
276
289
  return this.fetchLocale(locale);
277
- }
278
- getLocale(locale) {
290
+ };
291
+ getLocale = (locale) => {
279
292
  const key = locale;
280
293
  const existing = this.translators[key];
281
294
  if (existing) return existing;
@@ -288,11 +301,15 @@ var Translator = class {
288
301
  this.translators[key] = translator;
289
302
  return translator;
290
303
  }
291
- if (this.pending[key] || this.loaders[key]) throw new Error("async locale cannot be loaded synchronously");
304
+ if (this.pending[key] || this.loaders[key]) {
305
+ console.warn(`Translator.getLocale(${key}) called before async locale resolved. Returning untranslated fallback.`);
306
+ this.translators[key] ??= new LocaleTranslator(key);
307
+ return this.translators[key];
308
+ }
292
309
  this.translators[key] ??= new LocaleTranslator(key);
293
310
  return this.translators[key];
294
- }
295
- fetchLocale(locale) {
311
+ };
312
+ fetchLocale = (locale) => {
296
313
  const key = locale;
297
314
  const pending = this.pending[key];
298
315
  if (pending) return pending;
@@ -308,7 +325,7 @@ var Translator = class {
308
325
  return promise;
309
326
  }
310
327
  return this.getLocale(key);
311
- }
328
+ };
312
329
  };
313
330
 
314
331
  //#endregion
package/dist/index.d.cts CHANGED
@@ -92,28 +92,27 @@ type TranslationLoader = () => Promise<TranslationModule>;
92
92
  type TranslationEntry = TranslationModule | Promise<TranslationModule> | TranslationLoader;
93
93
  type TranslationRecord = Partial<Record<Locale, TranslationEntry>>;
94
94
  type SyncLocaleKeys<T> = { [K in keyof T]: T[K] extends GetTextTranslations ? K : never }[keyof T];
95
- type ContextMessageInput<T extends string> = [ContextMessage] | MessageInput<T>;
96
- type ContextPluralInput = [ContextPluralMessage] | PluralInput;
95
+ type AnyTranslationMessage = Message | PluralMessage | ContextMessage | ContextPluralMessage;
97
96
  declare class LocaleTranslator {
98
97
  locale: Locale;
99
98
  translations?: GetTextTranslations;
100
99
  constructor(locale: Locale, translations?: GetTextTranslations);
101
- private translateMessage;
102
- private translatePlural;
103
- message: <T extends string>(...args: MessageInput<T>) => string;
104
- plural: (...args: PluralInput) => string;
105
- context<T extends string>(context: StrictStaticString<T>): {
106
- message: <T extends string>(...args: ContextMessageInput<T>) => string;
107
- plural: (...args: ContextPluralInput) => string;
100
+ resolveMessage: (message: Message, context?: string) => string;
101
+ resolvePluralForm: (message: PluralMessage, context?: string) => string;
102
+ translateValue: (message: AnyTranslationMessage) => string;
103
+ translateMessage: <T extends string>(args: MessageArgs<T>, context?: string) => string;
104
+ translatePlural: (args: PluralArgs, context?: string) => string;
105
+ translate: (message: Message | PluralMessage | ContextMessage | ContextPluralMessage) => string;
106
+ message: <T extends string>(...args: MessageArgs<T>) => string;
107
+ plural: (...args: PluralArgs) => string;
108
+ context: <T extends string>(...args: [StrictStaticString<T>] | [TemplateStringsArray, ...never[]]) => {
109
+ message: <U extends string>(...args: MessageArgs<U>) => string;
110
+ plural: (...args: PluralArgs) => string;
108
111
  };
109
- context(strings: TemplateStringsArray, ...values: never[]): {
110
- message: <T extends string>(...args: ContextMessageInput<T>) => string;
111
- plural: (...args: ContextPluralInput) => string;
112
- };
113
- gettext<T extends string>(...args: MessageInput<T>): string;
114
- ngettext(...args: PluralInput): string;
115
- pgettext<C extends string, T extends string>(context: ContextMessage | StrictStaticString<C>, ...args: MessageInput<T> | []): string;
116
- npgettext<C extends string>(context: ContextPluralMessage | StrictStaticString<C>, ...args: PluralInput | []): string;
112
+ gettext: <T extends string>(...args: MessageArgs<T>) => string;
113
+ ngettext: (...args: PluralArgs) => string;
114
+ pgettext: <C extends string, T extends string>(context: StrictStaticString<C>, ...args: MessageArgs<T>) => string;
115
+ npgettext: <C extends string>(context: StrictStaticString<C>, ...args: PluralArgs) => string;
117
116
  }
118
117
  declare class Translator<T extends TranslationRecord = TranslationRecord> {
119
118
  parent: Translator | undefined;
@@ -122,9 +121,9 @@ declare class Translator<T extends TranslationRecord = TranslationRecord> {
122
121
  pending: Partial<Record<Locale, Promise<LocaleTranslator>>>;
123
122
  translators: Partial<Record<Locale, LocaleTranslator>>;
124
123
  constructor(translations: T, parent?: Translator);
125
- loadLocale(locale: Locale, loader?: TranslationLoader): Promise<LocaleTranslator>;
126
- getLocale<L extends SyncLocaleKeys<T>>(locale: L): LocaleTranslator;
127
- fetchLocale<L extends keyof T>(locale: L): LocaleTranslator | Promise<LocaleTranslator>;
124
+ loadLocale: (locale: Locale, loader?: TranslationLoader) => Promise<LocaleTranslator>;
125
+ getLocale: <L extends SyncLocaleKeys<T>>(locale: L) => LocaleTranslator;
126
+ fetchLocale: <L extends keyof T>(locale: L) => LocaleTranslator | Promise<LocaleTranslator>;
128
127
  }
129
128
  //#endregion
130
129
  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 };
@@ -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":"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"}
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
@@ -92,28 +92,27 @@ type TranslationLoader = () => Promise<TranslationModule>;
92
92
  type TranslationEntry = TranslationModule | Promise<TranslationModule> | TranslationLoader;
93
93
  type TranslationRecord = Partial<Record<Locale, TranslationEntry>>;
94
94
  type SyncLocaleKeys<T> = { [K in keyof T]: T[K] extends GetTextTranslations ? K : never }[keyof T];
95
- type ContextMessageInput<T extends string> = [ContextMessage] | MessageInput<T>;
96
- type ContextPluralInput = [ContextPluralMessage] | PluralInput;
95
+ type AnyTranslationMessage = Message | PluralMessage | ContextMessage | ContextPluralMessage;
97
96
  declare class LocaleTranslator {
98
97
  locale: Locale;
99
98
  translations?: GetTextTranslations;
100
99
  constructor(locale: Locale, translations?: GetTextTranslations);
101
- private translateMessage;
102
- private translatePlural;
103
- message: <T extends string>(...args: MessageInput<T>) => string;
104
- plural: (...args: PluralInput) => string;
105
- context<T extends string>(context: StrictStaticString<T>): {
106
- message: <T extends string>(...args: ContextMessageInput<T>) => string;
107
- plural: (...args: ContextPluralInput) => string;
100
+ resolveMessage: (message: Message, context?: string) => string;
101
+ resolvePluralForm: (message: PluralMessage, context?: string) => string;
102
+ translateValue: (message: AnyTranslationMessage) => string;
103
+ translateMessage: <T extends string>(args: MessageArgs<T>, context?: string) => string;
104
+ translatePlural: (args: PluralArgs, context?: string) => string;
105
+ translate: (message: Message | PluralMessage | ContextMessage | ContextPluralMessage) => string;
106
+ message: <T extends string>(...args: MessageArgs<T>) => string;
107
+ plural: (...args: PluralArgs) => string;
108
+ context: <T extends string>(...args: [StrictStaticString<T>] | [TemplateStringsArray, ...never[]]) => {
109
+ message: <U extends string>(...args: MessageArgs<U>) => string;
110
+ plural: (...args: PluralArgs) => string;
108
111
  };
109
- context(strings: TemplateStringsArray, ...values: never[]): {
110
- message: <T extends string>(...args: ContextMessageInput<T>) => string;
111
- plural: (...args: ContextPluralInput) => string;
112
- };
113
- gettext<T extends string>(...args: MessageInput<T>): string;
114
- ngettext(...args: PluralInput): string;
115
- pgettext<C extends string, T extends string>(context: ContextMessage | StrictStaticString<C>, ...args: MessageInput<T> | []): string;
116
- npgettext<C extends string>(context: ContextPluralMessage | StrictStaticString<C>, ...args: PluralInput | []): string;
112
+ gettext: <T extends string>(...args: MessageArgs<T>) => string;
113
+ ngettext: (...args: PluralArgs) => string;
114
+ pgettext: <C extends string, T extends string>(context: StrictStaticString<C>, ...args: MessageArgs<T>) => string;
115
+ npgettext: <C extends string>(context: StrictStaticString<C>, ...args: PluralArgs) => string;
117
116
  }
118
117
  declare class Translator<T extends TranslationRecord = TranslationRecord> {
119
118
  parent: Translator | undefined;
@@ -122,9 +121,9 @@ declare class Translator<T extends TranslationRecord = TranslationRecord> {
122
121
  pending: Partial<Record<Locale, Promise<LocaleTranslator>>>;
123
122
  translators: Partial<Record<Locale, LocaleTranslator>>;
124
123
  constructor(translations: T, parent?: Translator);
125
- loadLocale(locale: Locale, loader?: TranslationLoader): Promise<LocaleTranslator>;
126
- getLocale<L extends SyncLocaleKeys<T>>(locale: L): LocaleTranslator;
127
- fetchLocale<L extends keyof T>(locale: L): LocaleTranslator | Promise<LocaleTranslator>;
124
+ loadLocale: (locale: Locale, loader?: TranslationLoader) => Promise<LocaleTranslator>;
125
+ getLocale: <L extends SyncLocaleKeys<T>>(locale: L) => LocaleTranslator;
126
+ fetchLocale: <L extends keyof T>(locale: L) => LocaleTranslator | Promise<LocaleTranslator>;
128
127
  }
129
128
  //#endregion
130
129
  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 };
@@ -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":"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"}
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
@@ -163,6 +163,31 @@ function context(...args) {
163
163
 
164
164
  //#endregion
165
165
  //#region src/translator.ts
166
+ function selectValues(message$1, fallback) {
167
+ const values = message$1?.values;
168
+ if (values?.length) return values;
169
+ return fallback?.values;
170
+ }
171
+ function selectTemplate(preferred, fallback) {
172
+ return preferred?.length ? preferred : fallback;
173
+ }
174
+ function applyValues(template, message$1, fallback) {
175
+ const values = selectValues(message$1, fallback);
176
+ return values?.length ? substitute(template, values) : template;
177
+ }
178
+ function isPluralMessage(value) {
179
+ return Boolean(value) && typeof value === "object" && "forms" in value;
180
+ }
181
+ function isContextMessage(value) {
182
+ if (!value || typeof value !== "object" || !("id" in value)) return false;
183
+ const candidate = value.id;
184
+ return !isPluralMessage(candidate);
185
+ }
186
+ function isContextPluralMessage(value) {
187
+ if (!value || typeof value !== "object" || !("id" in value)) return false;
188
+ const candidate = value.id;
189
+ return isPluralMessage(candidate);
190
+ }
166
191
  function resolveTranslationModule(module) {
167
192
  return "default" in module ? module.default : module;
168
193
  }
@@ -173,64 +198,52 @@ var LocaleTranslator = class {
173
198
  this.locale = locale;
174
199
  this.translations = translations ? normalizeTranslations(translations) : void 0;
175
200
  }
176
- translateMessage({ msgid, msgstr, values }, msgctxt = "") {
177
- const result = (this.translations?.translations?.[msgctxt]?.[msgid])?.msgstr?.[0] || msgstr;
178
- return values ? substitute(result, values) : result;
179
- }
180
- translatePlural({ forms, n }, msgctxt = "") {
181
- const entry = this.translations?.translations?.[msgctxt]?.[forms[0].msgid];
182
- const index = pluralFunc(this.locale)(n);
183
- const form = forms[index] ?? forms[forms.length - 1];
184
- const result = (entry?.msgstr ? entry.msgstr[index] ?? entry.msgstr[entry.msgstr.length - 1] : void 0) || form.msgstr;
185
- const usedVals = form.values?.length ? form.values : forms[0].values;
186
- return usedVals?.length ? substitute(result, usedVals) : result;
187
- }
188
- message = (...args) => {
189
- const [source] = args;
190
- if (typeof source === "object" && "msgid" in source) return this.translateMessage(source);
191
- return this.translateMessage(message(...args));
201
+ resolveMessage = (message$1, context$1 = "") => {
202
+ const entry = this.translations?.translations?.[context$1]?.[message$1.msgid];
203
+ const template = selectTemplate(entry?.msgstr?.[0], message$1.msgstr);
204
+ return applyValues(template, message$1);
192
205
  };
193
- plural = (...args) => {
194
- const [source] = args;
195
- if (typeof source === "object" && "forms" in source) return this.translatePlural(source);
196
- return this.translatePlural(plural(...args));
206
+ resolvePluralForm = (message$1, context$1 = "") => {
207
+ const entry = this.translations?.translations?.[context$1]?.[message$1.forms[0].msgid];
208
+ const index = pluralFunc(this.locale)(message$1.n);
209
+ const forms = message$1.forms;
210
+ const selectedForm = forms[index] ?? forms[forms.length - 1];
211
+ const translatedForms = entry?.msgstr;
212
+ const templateCandidate = translatedForms?.length ? translatedForms[index] ?? translatedForms[translatedForms.length - 1] : void 0;
213
+ const template = selectTemplate(templateCandidate, selectedForm.msgstr);
214
+ return applyValues(template, selectedForm, forms[0]);
215
+ };
216
+ translateValue = (message$1) => {
217
+ if (isContextPluralMessage(message$1)) return this.resolvePluralForm(message$1.id, message$1.context);
218
+ if (isContextMessage(message$1)) return this.resolveMessage(message$1.id, message$1.context);
219
+ if (isPluralMessage(message$1)) return this.resolvePluralForm(message$1);
220
+ return this.resolveMessage(message$1);
221
+ };
222
+ translateMessage = (args, context$1) => {
223
+ const message$1 = message(...args);
224
+ return this.resolveMessage(message$1, context$1);
225
+ };
226
+ translatePlural = (args, context$1) => {
227
+ const message$1 = plural(...args);
228
+ return this.resolvePluralForm(message$1, context$1);
229
+ };
230
+ translate = (message$1) => {
231
+ return this.translateValue(message$1);
197
232
  };
198
- context(...args) {
233
+ message = (...args) => this.translateMessage(args);
234
+ plural = (...args) => this.translatePlural(args);
235
+ context = (...args) => {
199
236
  const [source] = args;
200
- const ctx = typeof source === "string" ? source : source[0];
237
+ const context$1 = typeof source === "string" ? source : source[0];
201
238
  return {
202
- message: (...args$1) => {
203
- const [src] = args$1;
204
- if (typeof src === "object") {
205
- if ("id" in src && "context" in src) return this.translateMessage(src.id, src.context);
206
- if ("msgid" in src) return this.translateMessage(src, ctx);
207
- }
208
- return this.translateMessage(message(...args$1), ctx);
209
- },
210
- plural: (...args$1) => {
211
- const [src] = args$1;
212
- if (typeof src === "object") {
213
- if ("id" in src && "context" in src) return this.translatePlural(src.id, src.context);
214
- if ("forms" in src) return this.translatePlural(src, ctx);
215
- }
216
- return this.translatePlural(plural(...args$1), ctx);
217
- }
239
+ message: (...args$1) => this.translateMessage(args$1, context$1),
240
+ plural: (...args$1) => this.translatePlural(args$1, context$1)
218
241
  };
219
- }
220
- gettext(...args) {
221
- return this.message(...args);
222
- }
223
- ngettext(...args) {
224
- return this.plural(...args);
225
- }
226
- pgettext(context$1, ...args) {
227
- if (typeof context$1 === "object") return this.translateMessage(context$1.id, context$1.context);
228
- return this.context(context$1).message(...args);
229
- }
230
- npgettext(context$1, ...args) {
231
- if (typeof context$1 === "object") return this.translatePlural(context$1.id, context$1.context);
232
- return this.context(context$1).plural(...args);
233
- }
242
+ };
243
+ gettext = (...args) => this.message(...args);
244
+ ngettext = (...args) => this.plural(...args);
245
+ pgettext = (context$1, ...args) => this.translateMessage(args, context$1);
246
+ npgettext = (context$1, ...args) => this.translatePlural(args, context$1);
234
247
  };
235
248
  var Translator = class {
236
249
  parent;
@@ -247,11 +260,11 @@ var Translator = class {
247
260
  else this.translations[locale] = resolveTranslationModule(value);
248
261
  }
249
262
  }
250
- async loadLocale(locale, loader) {
263
+ loadLocale = async (locale, loader) => {
251
264
  this.loaders[locale] = loader ?? this.loaders[locale];
252
265
  return this.fetchLocale(locale);
253
- }
254
- getLocale(locale) {
266
+ };
267
+ getLocale = (locale) => {
255
268
  const key = locale;
256
269
  const existing = this.translators[key];
257
270
  if (existing) return existing;
@@ -264,11 +277,15 @@ var Translator = class {
264
277
  this.translators[key] = translator;
265
278
  return translator;
266
279
  }
267
- if (this.pending[key] || this.loaders[key]) throw new Error("async locale cannot be loaded synchronously");
280
+ if (this.pending[key] || this.loaders[key]) {
281
+ console.warn(`Translator.getLocale(${key}) called before async locale resolved. Returning untranslated fallback.`);
282
+ this.translators[key] ??= new LocaleTranslator(key);
283
+ return this.translators[key];
284
+ }
268
285
  this.translators[key] ??= new LocaleTranslator(key);
269
286
  return this.translators[key];
270
- }
271
- fetchLocale(locale) {
287
+ };
288
+ fetchLocale = (locale) => {
272
289
  const key = locale;
273
290
  const pending = this.pending[key];
274
291
  if (pending) return pending;
@@ -284,7 +301,7 @@ var Translator = class {
284
301
  return promise;
285
302
  }
286
303
  return this.getLocale(key);
287
- }
304
+ };
288
305
  };
289
306
 
290
307
  //#endregion
package/dist/index.js.map CHANGED
@@ -1 +1 @@
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":";;;AAUA,SAAgB,OAAU,OAAU,WAAsC;AACtE,KAAI,CAAC,MACD,OAAM,IAAI,MAAMA,aAAW,mBAAmB;;AAKtD,SAAgB,KAAwC,IAAU;CAC9D,MAAM,wBAAQ,IAAI,KAA4B;AAC9C,UAAS,GAAG,SAAuC;EAC/C,MAAM,MAAM,KAAK,UAAU,KAAK;AAChC,MAAI,MAAM,IAAI,IAAI,CAEd,QAAO,MAAM,IAAI,IAAI;EAEzB,MAAM,SAAS,GAAG,GAAG,KAAK;AAC1B,QAAM,IAAI,KAAK,OAAO;AACtB,SAAO;;;AAIf,SAAgB,WAAW,MAAc,SAAoB,EAAE,EAAU;CACrE,MAAMC,eAAyB,EAAE;AAEjC,QAAO,KAAK,QAAQ,mBAAmB,OAAO,gBAAgB;AAC1D,MAAI,QAAQ,KAAK,YAAY,EAAE;GAC3B,MAAMC,UAAQ,OAAO,YAAY;AACjC,UAAOA,UAAQ,OAAO,SAAS,OAAO,OAAOA,SAAO,GAAG;;EAG3D,IAAI,QAAQ,aAAa,QAAQ,YAAY;AAC7C,MAAI,UAAU,IAAI;AACd,WAAQ,aAAa;AACrB,gBAAa,KAAK,YAAY;;AAGlC,SAAO,QAAQ,OAAO,SAAS,OAAO,OAAO,OAAO,GAAG;GACzD;;AAGN,SAAgB,mBAAmB,OAAuB;CACtD,MAAMD,eAAyB,EAAE;AACjC,QAAO,MAAM,QAAQ,mBAAmB,OAAO,gBAAgB;AAC3D,MAAI,QAAQ,KAAK,YAAY,CACzB,QAAO;EAGX,IAAI,QAAQ,aAAa,QAAQ,YAAY;AAC7C,MAAI,UAAU,IAAI;AACd,WAAQ,aAAa;AACrB,gBAAa,KAAK,YAAY;;AAElC,SAAO,MAAM,MAAM;GACrB;;AAGN,SAAgB,sBAAsB,cAAwD;CAC1F,MAAME,aAAkC;EACpC,GAAG;EACH,cAAc,EAAE;EACnB;AAED,MAAK,MAAM,CAACC,WAAS,aAAa,OAAO,QAAQ,aAAa,aAAa,EAAE;AACzE,aAAW,aAAaA,aAAW,EAAE;AACrC,OAAK,MAAM,CAAC,OAAO,UAAU,OAAO,QAAQ,SAAS,EAAE;GACnD,MAAM,eAAe,mBAAmB,MAAM;AAC9C,cAAW,aAAaA,WAAS,gBAAgB;;;AAIzD,QAAO;;AAGX,MAAM,qBAAqB,MAAe,MAAM,IAAI,IAAI;AAExD,MAAa,aAAa,KAAK,SAASC,aAAW,QAAgB;AAC/D,KAAI;EACA,MAAM,SAAS,OAAO,YAAY,OAAO,CAAC;AAC1C,MAAI,WAAW,EACX,cAAa;EAEjB,MAAMA,eAAa,cAAc,OAAO;EACxC,MAAM,QAAQ,MAAM,KAAK,EAAE,QAAQ,GAAG,GAAG,MAAM,OAAO,EAAE,CAAC;AACzD,UAAQ,MAAc;GAClB,MAAM,MAAM,OAAOA,aAAW,GAAG,MAAM,CAAC;AACxC,OAAI,CAAC,OAAO,SAAS,IAAI,IAAI,MAAM,EAAG,QAAO;AAC7C,OAAI,OAAO,OAAQ,QAAO,SAAS;AACnC,UAAO,KAAK,MAAM,IAAI;;SAEtB;AACJ,SAAO;;EAEb;AAEF,SAAgB,kBACZ,SACA,GAAG,QACgB;CACnB,SAAS,aAAa,QAAkC,QAAwC;AAC5F,OAAK,MAAM,OAAO,QAAQ;AACtB,OAAI,CAAC,OAAO,MAAM;AACd,WAAO,OAAO,OAAO;AACrB;;GAGJ,MAAM,gBAAgB,OAAO;GAC7B,MAAM,gBAAgB,OAAO;AAC7B,QAAK,MAAM,MAAM,cACb,KAAI,CAAC,cAAc,IACf,eAAc,MAAM,cAAc;;;CAMlD,MAAMC,SAA8B;EAChC,SAAS,QAAQ;EACjB,SAAS,EAAE,GAAG,QAAQ,SAAS;EAC/B,cAAc,EAAE,GAAG,QAAQ,cAAc;EACzC,UAAU,QAAQ,WAAW,EAAE,GAAG,QAAQ,UAAU,GAAG;EAC1D;AAED,MAAK,MAAM,SAAS,QAAQ;AACxB,MAAI,OAAO,aACP,cAAa,OAAO,cAAc,MAAM,aAAa;AAGzD,MAAI,OAAO,SACP,KAAI,CAAC,OAAO,SACR,QAAO,WAAW,MAAM;MAExB,cAAa,OAAO,UAAU,MAAM,SAAS;;AAKzD,QAAO;;;;;ACrHX,SAAS,kBAAkB,SAAuC;CAC9D,IAAI,SAAS;AACb,MAAK,IAAI,IAAI,GAAG,IAAI,QAAQ,QAAQ,KAAK;AACrC,YAAU,QAAQ;AAClB,MAAI,IAAI,QAAQ,SAAS,EAAG,WAAU,MAAM,EAAE;;AAElD,QAAO;;AAUX,SAAgB,QAA0B,GAAG,MAA+B;CACxE,MAAM,CAAC,QAAQ,GAAG,UAAU;AAE5B,KAAI,OAAO,WAAW,SAClB,QAAO;EAAE,OAAO;EAAQ,QAAQ;EAAQ;AAG5C,KAAI,OAAO,WAAW,YAAY,YAAY,QAAQ;EAClD,MAAMC,OAAK,kBAAkB,OAAO;AACpC,SAAO;GAAE,OAAOA;GAAI,QAAQA;GAAI;GAAQ;;CAG5C,MAAM,KAAK,OAAO,MAAM,OAAO,WAAW;CAC1C,MAAMC,YAAU,OAAO,WAAW,OAAO,MAAM;AAC/C,QAAO;EAAE,OAAO;EAAI,QAAQA;EAAS;;AAKzC,SAAgB,OAAO,GAAG,MAAiC;AACvD,QAAO,KAAK,SAAS,GAAG,8CAA8C;CAEtE,MAAM,IAAI,KAAK,KAAK,SAAS;AAC7B,QAAO,OAAO,MAAM,UAAU,qCAAqC;AAInE,QAAO;EAAE,OAFK,KAAK,MAAM,GAAG,GAAG;EAEf;EAAG;;AAgBvB,MAAM,cAAc;AACpB,MAAM,aAAa;AAInB,SAAgB,QACZ,GAAG,MACW;CACd,MAAM,CAAC,UAAU;CAEjB,MAAM,MAAM,OAAO,WAAW,WAAW,SAAS,OAAO;CAEzD,SAASA,UAA0B,GAAGC,QAAsC;AACxE,SAAO;GAAE,IAAI,YAAY,GAAGA,OAAK;GAAE,SAAS;GAAK;;CAGrD,SAASC,SAAO,GAAG,OAAyC;AACxD,SAAO;GAAE,IAAI,WAAW,GAAG,MAAM;GAAE,SAAS;GAAK;;AAGrD,QAAO;EACH;EACA;EACH;;;;;ACnFL,SAAS,yBAAyB,QAAgD;AAC9E,QAAO,aAAa,SAAS,OAAO,UAAU;;AAGlD,IAAa,mBAAb,MAA8B;CAC1B;CACA;CAEA,YAAY,QAAgB,cAAoC;AAC5D,OAAK,SAAS;AACd,OAAK,eAAe,eAAe,sBAAsB,aAAa,GAAG;;CAG7E,AAAQ,iBAAiB,EAAE,OAAO,QAAQ,UAAmB,UAAU,IAAY;EAE/E,MAAM,UADa,KAAK,cAAc,eAAe,WAAW,SACrC,SAAS,MAAM;AAC1C,SAAO,SAAS,WAAW,QAAQ,OAAO,GAAG;;CAGjD,AAAQ,gBAAgB,EAAE,OAAO,KAAoB,UAAU,IAAY;EACvE,MAAM,QAAQ,KAAK,cAAc,eAAe,WAAW,MAAM,GAAG;EACpE,MAAM,QAAQ,WAAW,KAAK,OAAO,CAAC,EAAE;EACxC,MAAM,OAAO,MAAM,UAAU,MAAM,MAAM,SAAS;EAElD,MAAM,UADa,OAAO,SAAU,MAAM,OAAO,UAAU,MAAM,OAAO,MAAM,OAAO,SAAS,KAAM,WACvE,KAAK;EAClC,MAAM,WAAW,KAAK,QAAQ,SAAS,KAAK,SAAS,MAAM,GAAG;AAC9D,SAAO,UAAU,SAAS,WAAW,QAAQ,SAAS,GAAG;;CAG7D,WAA6B,GAAG,SAAkC;EAC9D,MAAM,CAAC,UAAU;AACjB,MAAI,OAAO,WAAW,YAAY,WAAW,OACzC,QAAO,KAAK,iBAAiB,OAAO;AAExC,SAAO,KAAK,iBAAiBC,QAAa,GAAI,KAAwB,CAAC;;CAG3E,UAAU,GAAG,SAA8B;EACvC,MAAM,CAAC,UAAU;AACjB,MAAI,OAAO,WAAW,YAAY,WAAW,OACzC,QAAO,KAAK,gBAAgB,OAAO;AAEvC,SAAO,KAAK,gBAAgBC,OAAY,GAAI,KAAoB,CAAC;;CAgBrE,QAA0B,GAAG,MAAoE;EAC7F,MAAM,CAAC,UAAU;EAEjB,MAAM,MAAM,OAAO,WAAW,WAAW,SAAS,OAAO;AAEzD,SAAO;GACH,UAA4B,GAAGC,WAAyC;IACpE,MAAM,CAAC,OAAOA;AACd,QAAI,OAAO,QAAQ,UAAU;AACzB,SAAI,QAAQ,OAAO,aAAa,IAC5B,QAAO,KAAK,iBAAiB,IAAI,IAAI,IAAI,QAAQ;AAErD,SAAI,WAAW,IACX,QAAO,KAAK,iBAAiB,KAAK,IAAI;;AAG9C,WAAO,KAAK,iBAAiBF,QAAa,GAAIE,OAAwB,EAAE,IAAI;;GAEhF,SAAS,GAAGA,WAAqC;IAC7C,MAAM,CAAC,OAAOA;AACd,QAAI,OAAO,QAAQ,UAAU;AACzB,SAAI,QAAQ,OAAO,aAAa,IAC5B,QAAO,KAAK,gBAAgB,IAAI,IAAI,IAAI,QAAQ;AAEpD,SAAI,WAAW,IACX,QAAO,KAAK,gBAAgB,KAAK,IAAI;;AAG7C,WAAO,KAAK,gBAAgBD,OAAY,GAAIC,OAAoB,EAAE,IAAI;;GAE7E;;CAGL,QAA0B,GAAG,MAA+B;AACxD,SAAO,KAAK,QAAQ,GAAG,KAAK;;CAGhC,SAAS,GAAG,MAA2B;AACnC,SAAO,KAAK,OAAO,GAAG,KAAK;;CAG/B,SACI,WACA,GAAG,MACG;AACN,MAAI,OAAOC,cAAY,SACnB,QAAO,KAAK,iBAAiBA,UAAQ,IAAIA,UAAQ,QAAQ;AAE7D,SAAO,KAAK,QAAQA,UAAQ,CAAC,QAAQ,GAAI,KAAgC;;CAG7E,UACI,WACA,GAAG,MACG;AACN,MAAI,OAAOA,cAAY,SACnB,QAAO,KAAK,gBAAgBA,UAAQ,IAAIA,UAAQ,QAAQ;AAE5D,SAAO,KAAK,QAAQA,UAAQ,CAAC,OAAO,GAAI,KAA4B;;;AAI5E,IAAa,aAAb,MAAyE;CACrE;CACA,UAAsD,EAAE;CACxD,eAA6D,EAAE;CAC/D,UAA8D,EAAE;CAChE,cAAyD,EAAE;CAE3D,YAAY,cAAiB,QAAqB;AAC9C,OAAK,SAAS;AACd,OAAK,MAAM,CAAC,QAAQ,UAAU,OAAO,QAAQ,aAAa,EAAkC;AACxF,OAAI,CAAC,MAAO;AACZ,OAAI,OAAO,UAAU,WACjB,MAAK,QAAQ,UAAU;YAChB,UAAU,MACjB,MAAK,QAAQ,gBAAgB;OAE7B,MAAK,aAAa,UAAU,yBAAyB,MAAM;;;CAKvE,MAAM,WAAW,QAAgB,QAAuD;AACpF,OAAK,QAAQ,UAAU,UAAU,KAAK,QAAQ;AAE9C,SAAO,KAAK,YAAY,OAAgB;;CAG5C,UAAuC,QAA6B;EAChE,MAAM,MAAM;EACZ,MAAM,WAAW,KAAK,YAAY;AAClC,MAAI,SACA,QAAO;EAGX,MAAM,OAAO,KAAK,aAAa;AAC/B,MAAI,MAAM;GACN,MAAM,qBAAqB,KAAK,QAAQ,UAAU,OAAgB,EAAE;GACpE,MAAM,eAAe,kBAAkB,MAAM,mBAAmB;AAChE,UAAO,KAAK,aAAa;GAEzB,MAAM,aAAa,IAAI,iBAAiB,KAAK,aAAa;AAC1D,QAAK,YAAY,OAAO;AACxB,UAAO;;AAGX,MAAI,KAAK,QAAQ,QAAQ,KAAK,QAAQ,KAClC,OAAM,IAAI,MAAM,8CAA8C;AAGlE,OAAK,YAAY,SAAS,IAAI,iBAAiB,IAAI;AACnD,SAAO,KAAK,YAAY;;CAG5B,YAA+B,QAAW;EACtC,MAAM,MAAM;EAEZ,MAAM,UAAU,KAAK,QAAQ;AAC7B,MAAI,QACA,QAAO;EAGX,MAAM,SAAS,KAAK,QAAQ;AAC5B,MAAI,QAAQ;GACR,MAAM,UAAU,QAAQ,CAAC,MAAM,iBAAiB;AAC5C,SAAK,aAAa,SAAS,yBAAyB,aAAa;AACjE,WAAO,KAAK,QAAQ;AAEpB,WAAO,KAAK,UAAU,IAAa;KACrC;AACF,QAAK,QAAQ,OAAO;AACpB,UAAO,KAAK,QAAQ;AAEpB,UAAO;;AAGX,SAAO,KAAK,UAAU,IAAa"}
1
+ {"version":3,"file":"index.js","names":["message","placeholders: string[]","index","normalized: GetTextTranslations","context","pluralFunc","result: GetTextTranslations","id","message","args","plural","message","context","buildMessage","buildPlural","args"],"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 PluralArgs,\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\nfunction selectValues(message: Message | undefined, fallback?: Message): unknown[] | undefined {\n const values = message?.values;\n if (values?.length) {\n return values;\n }\n return fallback?.values;\n}\n\nfunction selectTemplate(preferred: string | undefined, fallback: string): string {\n return preferred?.length ? preferred : fallback;\n}\n\nfunction applyValues(template: string, message: Message | undefined, fallback?: Message): string {\n const values = selectValues(message, fallback);\n return values?.length ? substitute(template, values) : template;\n}\n\nfunction isPluralMessage(value: unknown): value is PluralMessage {\n return Boolean(value) && typeof value === \"object\" && \"forms\" in (value as PluralMessage);\n}\n\nfunction isContextMessage(value: unknown): value is ContextMessage {\n if (!value || typeof value !== \"object\" || !(\"id\" in value)) {\n return false;\n }\n const candidate = (value as ContextMessage).id;\n return !isPluralMessage(candidate);\n}\n\nfunction isContextPluralMessage(value: unknown): value is ContextPluralMessage {\n if (!value || typeof value !== \"object\" || !(\"id\" in value)) {\n return false;\n }\n const candidate = (value as ContextPluralMessage).id;\n return isPluralMessage(candidate);\n}\n\ntype AnyTranslationMessage = Message | PluralMessage | ContextMessage | ContextPluralMessage;\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 resolveMessage = (message: Message, context = \"\"): string => {\n const entry = this.translations?.translations?.[context]?.[message.msgid];\n const template = selectTemplate(entry?.msgstr?.[0], message.msgstr);\n return applyValues(template, message);\n };\n\n resolvePluralForm = (message: PluralMessage, context = \"\"): string => {\n const entry = this.translations?.translations?.[context]?.[message.forms[0].msgid];\n const index = pluralFunc(this.locale)(message.n);\n const forms = message.forms;\n const selectedForm = forms[index] ?? forms[forms.length - 1];\n const translatedForms = entry?.msgstr;\n const templateCandidate = translatedForms?.length\n ? (translatedForms[index] ?? translatedForms[translatedForms.length - 1])\n : undefined;\n const template = selectTemplate(templateCandidate, selectedForm.msgstr);\n return applyValues(template, selectedForm, forms[0]);\n };\n\n translateValue = (message: AnyTranslationMessage): string => {\n if (isContextPluralMessage(message)) {\n return this.resolvePluralForm(message.id, message.context);\n }\n\n if (isContextMessage(message)) {\n return this.resolveMessage(message.id, message.context);\n }\n\n if (isPluralMessage(message)) {\n return this.resolvePluralForm(message);\n }\n\n return this.resolveMessage(message);\n };\n\n translateMessage = <T extends string>(args: MessageArgs<T>, context?: string): string => {\n const message = buildMessage(...args);\n return this.resolveMessage(message, context);\n };\n\n translatePlural = (args: PluralArgs, context?: string): string => {\n const message = buildPlural(...args);\n return this.resolvePluralForm(message, context);\n };\n\n translate = (message: Message | PluralMessage | ContextMessage | ContextPluralMessage): string => {\n return this.translateValue(message);\n };\n\n message = <T extends string>(...args: MessageArgs<T>): string => this.translateMessage(args);\n plural = (...args: PluralArgs): string => this.translatePlural(args);\n\n context = <T extends string>(...args: [StrictStaticString<T>] | [TemplateStringsArray, ...never[]]) => {\n const [source] = args as [StrictStaticString<T> | TemplateStringsArray];\n\n const context = typeof source === \"string\" ? source : source[0];\n\n return {\n message: <U extends string>(...args: MessageArgs<U>): string => this.translateMessage(args, context),\n plural: (...args: PluralArgs): string => this.translatePlural(args, context),\n };\n };\n\n gettext = <T extends string>(...args: MessageArgs<T>): string => this.message(...args);\n ngettext = (...args: PluralArgs): string => this.plural(...args);\n pgettext = <C extends string, T extends string>(context: StrictStaticString<C>, ...args: MessageArgs<T>): string =>\n this.translateMessage(args, context);\n npgettext = <C extends string>(context: StrictStaticString<C>, ...args: PluralArgs): string =>\n this.translatePlural(args, context);\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 loadLocale = async (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 console.warn(\n `Translator.getLocale(${key}) called before async locale resolved. Returning untranslated fallback.`,\n );\n this.translators[key] ??= new LocaleTranslator(key);\n return this.translators[key];\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.20",
3
+ "version": "1.0.23",
4
4
  "type": "module",
5
5
  "main": "dist/index.cjs",
6
6
  "module": "dist/index.js",
@@ -18,6 +18,7 @@
18
18
  ],
19
19
  "scripts": {
20
20
  "build": "tsdown",
21
+ "pretest": "npm run build",
21
22
  "check": "biome check .",
22
23
  "format": "biome check --write .",
23
24
  "typecheck": "tsc --build",