@lingui/core 5.0.0-next.0 → 5.0.0-next.2

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
@@ -61,7 +61,7 @@ const formats = {
61
61
  plural: plural
62
62
  };
63
63
 
64
- const UNICODE_REGEX = /\\u[a-fA-F0-9]{4}|\\x[a-fA-F0-9]{2}/g;
64
+ const UNICODE_REGEX = /\\u[a-fA-F0-9]{4}|\\x[a-fA-F0-9]{2}/;
65
65
  const OCTOTHORPE_PH = "%__lingui_octothorpe__%";
66
66
  const getDefaultFormats = (locale, passedLocales, formats = {}) => {
67
67
  const locales = passedLocales || locale;
@@ -190,10 +190,14 @@ class I18n extends EventEmitter {
190
190
  __publicField(this, "_localeData", {});
191
191
  __publicField(this, "_messages", {});
192
192
  __publicField(this, "_missing");
193
+ __publicField(this, "_messageCompiler");
193
194
  /**
194
195
  * Alias for {@see I18n._}
195
196
  */
196
197
  __publicField(this, "t", this._.bind(this));
198
+ if (process.env.NODE_ENV !== "production") {
199
+ this.setMessagesCompiler(compileMessage.compileMessage);
200
+ }
197
201
  if (params.missing != null)
198
202
  this._missing = params.missing;
199
203
  if (params.messages != null)
@@ -227,6 +231,25 @@ class I18n extends EventEmitter {
227
231
  Object.assign(maybeLocaleData, localeData);
228
232
  }
229
233
  }
234
+ /**
235
+ * Registers a `MessageCompiler` to enable the use of uncompiled catalogs at runtime.
236
+ *
237
+ * In production builds, the `MessageCompiler` is typically excluded to reduce bundle size.
238
+ * By default, message catalogs should be precompiled during the build process. However,
239
+ * if you need to compile catalogs at runtime, you can use this method to set a message compiler.
240
+ *
241
+ * Example usage:
242
+ *
243
+ * ```ts
244
+ * import { compileMessage } from "@lingui/message-utils/compileMessage";
245
+ *
246
+ * i18n.setMessagesCompiler(compileMessage);
247
+ * ```
248
+ */
249
+ setMessagesCompiler(compiler) {
250
+ this._messageCompiler = compiler;
251
+ return this;
252
+ }
230
253
  /**
231
254
  * @deprecated Plurals automatically used from Intl.PluralRules you can safely remove this call. Deprecated in v4
232
255
  */
@@ -297,10 +320,22 @@ class I18n extends EventEmitter {
297
320
  if (messageMissing) {
298
321
  this.emit("missing", { id, locale: this._locale });
299
322
  }
300
- const translation = messageForId || (() => {
301
- const trans = message || id;
302
- return process.env.NODE_ENV !== "production" ? compileMessage.compileMessage(trans) : trans;
303
- })();
323
+ let translation = messageForId || message || id;
324
+ if (isString(translation)) {
325
+ if (this._messageCompiler) {
326
+ translation = this._messageCompiler(translation);
327
+ } else {
328
+ console.warn(`Uncompiled message detected! Message:
329
+
330
+ > ${translation}
331
+
332
+ That means you use raw catalog or your catalog doesn't have a translation for the message and fallback was used.
333
+ ICU features such as interpolation and plurals will not work properly for that message.
334
+
335
+ Please compile your catalog first.
336
+ `);
337
+ }
338
+ }
304
339
  if (isString(translation) && UNICODE_REGEX.test(translation))
305
340
  return JSON.parse(`"${translation}"`);
306
341
  if (isString(translation))
package/dist/index.d.cts CHANGED
@@ -30,7 +30,8 @@ type LocaleData = {
30
30
  * @deprecated Plurals automatically used from Intl.PluralRules you can safely remove this call. Deprecated in v4
31
31
  */
32
32
  type AllLocaleData = Record<Locale, LocaleData>;
33
- type Messages = Record<string, CompiledMessage>;
33
+ type UncompiledMessage = string;
34
+ type Messages = Record<string, UncompiledMessage | CompiledMessage>;
34
35
  type AllMessages = Record<Locale, Messages>;
35
36
  type MessageDescriptor = {
36
37
  id: string;
@@ -65,12 +66,14 @@ type LoadAndActivateOptions = {
65
66
  /** compiled message catalog */
66
67
  messages: Messages;
67
68
  };
69
+ type MessageCompiler = (message: string) => CompiledMessage;
68
70
  declare class I18n extends EventEmitter<Events> {
69
71
  private _locale;
70
72
  private _locales?;
71
73
  private _localeData;
72
74
  private _messages;
73
75
  private _missing?;
76
+ private _messageCompiler?;
74
77
  constructor(params: I18nProps);
75
78
  get locale(): string;
76
79
  get locales(): Locales | undefined;
@@ -80,6 +83,22 @@ declare class I18n extends EventEmitter<Events> {
80
83
  */
81
84
  get localeData(): LocaleData;
82
85
  private _loadLocaleData;
86
+ /**
87
+ * Registers a `MessageCompiler` to enable the use of uncompiled catalogs at runtime.
88
+ *
89
+ * In production builds, the `MessageCompiler` is typically excluded to reduce bundle size.
90
+ * By default, message catalogs should be precompiled during the build process. However,
91
+ * if you need to compile catalogs at runtime, you can use this method to set a message compiler.
92
+ *
93
+ * Example usage:
94
+ *
95
+ * ```ts
96
+ * import { compileMessage } from "@lingui/message-utils/compileMessage";
97
+ *
98
+ * i18n.setMessagesCompiler(compileMessage);
99
+ * ```
100
+ */
101
+ setMessagesCompiler(compiler: MessageCompiler): this;
83
102
  /**
84
103
  * @deprecated Plurals automatically used from Intl.PluralRules you can safely remove this call. Deprecated in v4
85
104
  */
package/dist/index.d.mts CHANGED
@@ -30,7 +30,8 @@ type LocaleData = {
30
30
  * @deprecated Plurals automatically used from Intl.PluralRules you can safely remove this call. Deprecated in v4
31
31
  */
32
32
  type AllLocaleData = Record<Locale, LocaleData>;
33
- type Messages = Record<string, CompiledMessage>;
33
+ type UncompiledMessage = string;
34
+ type Messages = Record<string, UncompiledMessage | CompiledMessage>;
34
35
  type AllMessages = Record<Locale, Messages>;
35
36
  type MessageDescriptor = {
36
37
  id: string;
@@ -65,12 +66,14 @@ type LoadAndActivateOptions = {
65
66
  /** compiled message catalog */
66
67
  messages: Messages;
67
68
  };
69
+ type MessageCompiler = (message: string) => CompiledMessage;
68
70
  declare class I18n extends EventEmitter<Events> {
69
71
  private _locale;
70
72
  private _locales?;
71
73
  private _localeData;
72
74
  private _messages;
73
75
  private _missing?;
76
+ private _messageCompiler?;
74
77
  constructor(params: I18nProps);
75
78
  get locale(): string;
76
79
  get locales(): Locales | undefined;
@@ -80,6 +83,22 @@ declare class I18n extends EventEmitter<Events> {
80
83
  */
81
84
  get localeData(): LocaleData;
82
85
  private _loadLocaleData;
86
+ /**
87
+ * Registers a `MessageCompiler` to enable the use of uncompiled catalogs at runtime.
88
+ *
89
+ * In production builds, the `MessageCompiler` is typically excluded to reduce bundle size.
90
+ * By default, message catalogs should be precompiled during the build process. However,
91
+ * if you need to compile catalogs at runtime, you can use this method to set a message compiler.
92
+ *
93
+ * Example usage:
94
+ *
95
+ * ```ts
96
+ * import { compileMessage } from "@lingui/message-utils/compileMessage";
97
+ *
98
+ * i18n.setMessagesCompiler(compileMessage);
99
+ * ```
100
+ */
101
+ setMessagesCompiler(compiler: MessageCompiler): this;
83
102
  /**
84
103
  * @deprecated Plurals automatically used from Intl.PluralRules you can safely remove this call. Deprecated in v4
85
104
  */
package/dist/index.d.ts CHANGED
@@ -30,7 +30,8 @@ type LocaleData = {
30
30
  * @deprecated Plurals automatically used from Intl.PluralRules you can safely remove this call. Deprecated in v4
31
31
  */
32
32
  type AllLocaleData = Record<Locale, LocaleData>;
33
- type Messages = Record<string, CompiledMessage>;
33
+ type UncompiledMessage = string;
34
+ type Messages = Record<string, UncompiledMessage | CompiledMessage>;
34
35
  type AllMessages = Record<Locale, Messages>;
35
36
  type MessageDescriptor = {
36
37
  id: string;
@@ -65,12 +66,14 @@ type LoadAndActivateOptions = {
65
66
  /** compiled message catalog */
66
67
  messages: Messages;
67
68
  };
69
+ type MessageCompiler = (message: string) => CompiledMessage;
68
70
  declare class I18n extends EventEmitter<Events> {
69
71
  private _locale;
70
72
  private _locales?;
71
73
  private _localeData;
72
74
  private _messages;
73
75
  private _missing?;
76
+ private _messageCompiler?;
74
77
  constructor(params: I18nProps);
75
78
  get locale(): string;
76
79
  get locales(): Locales | undefined;
@@ -80,6 +83,22 @@ declare class I18n extends EventEmitter<Events> {
80
83
  */
81
84
  get localeData(): LocaleData;
82
85
  private _loadLocaleData;
86
+ /**
87
+ * Registers a `MessageCompiler` to enable the use of uncompiled catalogs at runtime.
88
+ *
89
+ * In production builds, the `MessageCompiler` is typically excluded to reduce bundle size.
90
+ * By default, message catalogs should be precompiled during the build process. However,
91
+ * if you need to compile catalogs at runtime, you can use this method to set a message compiler.
92
+ *
93
+ * Example usage:
94
+ *
95
+ * ```ts
96
+ * import { compileMessage } from "@lingui/message-utils/compileMessage";
97
+ *
98
+ * i18n.setMessagesCompiler(compileMessage);
99
+ * ```
100
+ */
101
+ setMessagesCompiler(compiler: MessageCompiler): this;
83
102
  /**
84
103
  * @deprecated Plurals automatically used from Intl.PluralRules you can safely remove this call. Deprecated in v4
85
104
  */
package/dist/index.mjs CHANGED
@@ -59,7 +59,7 @@ const formats = {
59
59
  plural: plural
60
60
  };
61
61
 
62
- const UNICODE_REGEX = /\\u[a-fA-F0-9]{4}|\\x[a-fA-F0-9]{2}/g;
62
+ const UNICODE_REGEX = /\\u[a-fA-F0-9]{4}|\\x[a-fA-F0-9]{2}/;
63
63
  const OCTOTHORPE_PH = "%__lingui_octothorpe__%";
64
64
  const getDefaultFormats = (locale, passedLocales, formats = {}) => {
65
65
  const locales = passedLocales || locale;
@@ -188,10 +188,14 @@ class I18n extends EventEmitter {
188
188
  __publicField(this, "_localeData", {});
189
189
  __publicField(this, "_messages", {});
190
190
  __publicField(this, "_missing");
191
+ __publicField(this, "_messageCompiler");
191
192
  /**
192
193
  * Alias for {@see I18n._}
193
194
  */
194
195
  __publicField(this, "t", this._.bind(this));
196
+ if (process.env.NODE_ENV !== "production") {
197
+ this.setMessagesCompiler(compileMessage);
198
+ }
195
199
  if (params.missing != null)
196
200
  this._missing = params.missing;
197
201
  if (params.messages != null)
@@ -225,6 +229,25 @@ class I18n extends EventEmitter {
225
229
  Object.assign(maybeLocaleData, localeData);
226
230
  }
227
231
  }
232
+ /**
233
+ * Registers a `MessageCompiler` to enable the use of uncompiled catalogs at runtime.
234
+ *
235
+ * In production builds, the `MessageCompiler` is typically excluded to reduce bundle size.
236
+ * By default, message catalogs should be precompiled during the build process. However,
237
+ * if you need to compile catalogs at runtime, you can use this method to set a message compiler.
238
+ *
239
+ * Example usage:
240
+ *
241
+ * ```ts
242
+ * import { compileMessage } from "@lingui/message-utils/compileMessage";
243
+ *
244
+ * i18n.setMessagesCompiler(compileMessage);
245
+ * ```
246
+ */
247
+ setMessagesCompiler(compiler) {
248
+ this._messageCompiler = compiler;
249
+ return this;
250
+ }
228
251
  /**
229
252
  * @deprecated Plurals automatically used from Intl.PluralRules you can safely remove this call. Deprecated in v4
230
253
  */
@@ -295,10 +318,22 @@ class I18n extends EventEmitter {
295
318
  if (messageMissing) {
296
319
  this.emit("missing", { id, locale: this._locale });
297
320
  }
298
- const translation = messageForId || (() => {
299
- const trans = message || id;
300
- return process.env.NODE_ENV !== "production" ? compileMessage(trans) : trans;
301
- })();
321
+ let translation = messageForId || message || id;
322
+ if (isString(translation)) {
323
+ if (this._messageCompiler) {
324
+ translation = this._messageCompiler(translation);
325
+ } else {
326
+ console.warn(`Uncompiled message detected! Message:
327
+
328
+ > ${translation}
329
+
330
+ That means you use raw catalog or your catalog doesn't have a translation for the message and fallback was used.
331
+ ICU features such as interpolation and plurals will not work properly for that message.
332
+
333
+ Please compile your catalog first.
334
+ `);
335
+ }
336
+ }
302
337
  if (isString(translation) && UNICODE_REGEX.test(translation))
303
338
  return JSON.parse(`"${translation}"`);
304
339
  if (isString(translation))
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@lingui/core",
3
- "version": "5.0.0-next.0",
3
+ "version": "5.0.0-next.2",
4
4
  "sideEffects": false,
5
5
  "description": "I18n tools for javascript",
6
6
  "main": "./dist/index.cjs",
@@ -32,7 +32,7 @@
32
32
  "url": "https://github.com/lingui/js-lingui/issues"
33
33
  },
34
34
  "engines": {
35
- "node": ">=16.0.0"
35
+ "node": ">=20.0.0"
36
36
  },
37
37
  "exports": {
38
38
  ".": {
@@ -60,7 +60,7 @@
60
60
  ],
61
61
  "dependencies": {
62
62
  "@babel/runtime": "^7.20.13",
63
- "@lingui/message-utils": "^5.0.0-next.0",
63
+ "@lingui/message-utils": "^5.0.0-next.2",
64
64
  "unraw": "^3.0.0"
65
65
  },
66
66
  "devDependencies": {
@@ -69,7 +69,7 @@
69
69
  "unbuild": "2.0.0"
70
70
  },
71
71
  "peerDependencies": {
72
- "@lingui/babel-plugin-lingui-macro": "5.0.0-next.0",
72
+ "@lingui/babel-plugin-lingui-macro": "5.0.0-next.2",
73
73
  "babel-plugin-macros": "2 || 3"
74
74
  },
75
75
  "peerDependenciesMeta": {
@@ -80,5 +80,5 @@
80
80
  "optional": true
81
81
  }
82
82
  },
83
- "gitHead": "2192f8d54699a3846ff8fe6f3992697be2da68a8"
83
+ "gitHead": "71fa9b0b55deded4b30a25f9bda2a28a7cf4ec12"
84
84
  }