@angular/build 22.2.0-next.4 → 22.2.0-next.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (169) hide show
  1. package/package.json +13 -12
  2. package/src/builders/application/build-action.js +47 -39
  3. package/src/builders/application/build-action.js.map +1 -1
  4. package/src/builders/application/execute-build.js +1 -1
  5. package/src/builders/application/execute-build.js.map +1 -1
  6. package/src/builders/application/execute-post-bundle.js +2 -5
  7. package/src/builders/application/execute-post-bundle.js.map +1 -1
  8. package/src/builders/application/i18n.js +20 -10
  9. package/src/builders/application/i18n.js.map +1 -1
  10. package/src/builders/application/index.js +2 -2
  11. package/src/builders/application/index.js.map +1 -1
  12. package/src/builders/application/results.d.ts +3 -2
  13. package/src/builders/application/setup-bundling.js +3 -1
  14. package/src/builders/application/setup-bundling.js.map +1 -1
  15. package/src/builders/dev-server/vite/index.js +4 -7
  16. package/src/builders/dev-server/vite/index.js.map +1 -1
  17. package/src/builders/dev-server/vite/server.js +1 -1
  18. package/src/builders/dev-server/vite/server.js.map +1 -1
  19. package/src/builders/dev-server/vite/utils.d.ts +1 -1
  20. package/src/builders/dev-server/vite/utils.js +9 -4
  21. package/src/builders/dev-server/vite/utils.js.map +1 -1
  22. package/src/builders/extract-i18n/application-extraction.js +6 -5
  23. package/src/builders/extract-i18n/application-extraction.js.map +1 -1
  24. package/src/builders/karma/application_builder.js +1 -1
  25. package/src/builders/karma/application_builder.js.map +1 -1
  26. package/src/builders/karma/assets-middleware.d.ts +2 -2
  27. package/src/builders/karma/assets-middleware.js +5 -2
  28. package/src/builders/karma/assets-middleware.js.map +1 -1
  29. package/src/builders/karma/progress-reporter.js +7 -5
  30. package/src/builders/karma/progress-reporter.js.map +1 -1
  31. package/src/builders/karma/utils.d.ts +2 -1
  32. package/src/builders/karma/utils.js +2 -2
  33. package/src/builders/karma/utils.js.map +1 -1
  34. package/src/builders/unit-test/builder.js +1 -1
  35. package/src/builders/unit-test/options.d.ts +1 -0
  36. package/src/builders/unit-test/options.js +2 -1
  37. package/src/builders/unit-test/options.js.map +1 -1
  38. package/src/builders/unit-test/runners/vitest/build-options.js +5 -6
  39. package/src/builders/unit-test/runners/vitest/build-options.js.map +1 -1
  40. package/src/builders/unit-test/runners/vitest/executor.js +4 -4
  41. package/src/builders/unit-test/runners/vitest/executor.js.map +1 -1
  42. package/src/builders/unit-test/schema.d.ts +7 -0
  43. package/src/builders/unit-test/schema.js.map +1 -1
  44. package/src/builders/unit-test/schema.json +5 -0
  45. package/src/private.d.ts +1 -1
  46. package/src/private.js +4 -3
  47. package/src/private.js.map +1 -1
  48. package/src/tools/angular/compilation/angular-compilation.d.ts +3 -8
  49. package/src/tools/angular/compilation/angular-compilation.js +2 -88
  50. package/src/tools/angular/compilation/angular-compilation.js.map +1 -1
  51. package/src/tools/angular/compilation/aot-compilation.d.ts +5 -5
  52. package/src/tools/angular/compilation/aot-compilation.js +9 -13
  53. package/src/tools/angular/compilation/aot-compilation.js.map +1 -1
  54. package/src/tools/angular/compilation/compiler-options.d.ts +24 -0
  55. package/src/tools/angular/compilation/compiler-options.js +135 -0
  56. package/src/tools/angular/compilation/compiler-options.js.map +1 -0
  57. package/src/tools/angular/compilation/index.d.ts +1 -1
  58. package/src/tools/angular/compilation/index.js +1 -3
  59. package/src/tools/angular/compilation/index.js.map +1 -1
  60. package/src/tools/angular/compilation/jit-compilation.d.ts +5 -5
  61. package/src/tools/angular/compilation/jit-compilation.js +8 -15
  62. package/src/tools/angular/compilation/jit-compilation.js.map +1 -1
  63. package/src/tools/angular/compilation/parallel-compilation.d.ts +2 -7
  64. package/src/tools/angular/compilation/parallel-compilation.js +39 -41
  65. package/src/tools/angular/compilation/parallel-compilation.js.map +1 -1
  66. package/src/tools/angular/compilation/parallel-worker.d.ts +2 -2
  67. package/src/tools/angular/compilation/parallel-worker.js +79 -63
  68. package/src/tools/angular/compilation/parallel-worker.js.map +1 -1
  69. package/src/tools/angular/compilation/typescript-compilation.d.ts +24 -0
  70. package/src/tools/angular/compilation/typescript-compilation.js +107 -0
  71. package/src/tools/angular/compilation/typescript-compilation.js.map +1 -0
  72. package/src/tools/angular/linker/oxc-linker.d.ts +13 -17
  73. package/src/tools/angular/linker/oxc-linker.js +27 -89
  74. package/src/tools/angular/linker/oxc-linker.js.map +1 -1
  75. package/src/tools/esbuild/angular/compilation-state.d.ts +23 -3
  76. package/src/tools/esbuild/angular/compilation-state.js +51 -13
  77. package/src/tools/esbuild/angular/compilation-state.js.map +1 -1
  78. package/src/tools/esbuild/angular/compiler-plugin.js +36 -101
  79. package/src/tools/esbuild/angular/compiler-plugin.js.map +1 -1
  80. package/src/tools/esbuild/angular/component-stylesheets.d.ts +3 -3
  81. package/src/tools/esbuild/angular/component-stylesheets.js +42 -15
  82. package/src/tools/esbuild/angular/component-stylesheets.js.map +1 -1
  83. package/src/tools/esbuild/application-code-bundle.js +5 -9
  84. package/src/tools/esbuild/application-code-bundle.js.map +1 -1
  85. package/src/tools/esbuild/bundler-context.d.ts +4 -4
  86. package/src/tools/esbuild/bundler-context.js +93 -27
  87. package/src/tools/esbuild/bundler-context.js.map +1 -1
  88. package/src/tools/esbuild/bundler-execution-result.d.ts +1 -0
  89. package/src/tools/esbuild/bundler-execution-result.js +2 -2
  90. package/src/tools/esbuild/bundler-execution-result.js.map +1 -1
  91. package/src/tools/esbuild/cache.d.ts +10 -0
  92. package/src/tools/esbuild/cache.js +18 -0
  93. package/src/tools/esbuild/cache.js.map +1 -1
  94. package/src/tools/esbuild/i18n-inliner-worker.d.ts +82 -37
  95. package/src/tools/esbuild/i18n-inliner-worker.js +134 -97
  96. package/src/tools/esbuild/i18n-inliner-worker.js.map +1 -1
  97. package/src/tools/esbuild/i18n-inliner.d.ts +42 -11
  98. package/src/tools/esbuild/i18n-inliner.js +335 -121
  99. package/src/tools/esbuild/i18n-inliner.js.map +1 -1
  100. package/src/tools/esbuild/i18n-locale-plugin.d.ts +32 -0
  101. package/src/tools/esbuild/i18n-locale-plugin.js +112 -103
  102. package/src/tools/esbuild/i18n-locale-plugin.js.map +1 -1
  103. package/src/tools/esbuild/i18n-translation-encoder.d.ts +21 -0
  104. package/src/tools/esbuild/i18n-translation-encoder.js +92 -0
  105. package/src/tools/esbuild/i18n-translation-encoder.js.map +1 -0
  106. package/src/tools/esbuild/i18n-translation-reader.d.ts +41 -0
  107. package/src/tools/esbuild/i18n-translation-reader.js +164 -0
  108. package/src/tools/esbuild/i18n-translation-reader.js.map +1 -0
  109. package/src/tools/esbuild/javascript-transformer-worker.js +41 -47
  110. package/src/tools/esbuild/javascript-transformer-worker.js.map +1 -1
  111. package/src/tools/esbuild/javascript-transformer.js +53 -1
  112. package/src/tools/esbuild/javascript-transformer.js.map +1 -1
  113. package/src/tools/esbuild/load-result-cache.d.ts +1 -0
  114. package/src/tools/esbuild/load-result-cache.js +24 -11
  115. package/src/tools/esbuild/load-result-cache.js.map +1 -1
  116. package/src/tools/esbuild/sqlite-cache-store.d.ts +8 -0
  117. package/src/tools/esbuild/sqlite-cache-store.js +19 -7
  118. package/src/tools/esbuild/sqlite-cache-store.js.map +1 -1
  119. package/src/tools/esbuild/stylesheets/sass-language.js +19 -14
  120. package/src/tools/esbuild/stylesheets/sass-language.js.map +1 -1
  121. package/src/tools/esbuild/stylesheets/stylesheet-plugin-factory.d.ts +1 -1
  122. package/src/tools/esbuild/utils.d.ts +1 -1
  123. package/src/tools/esbuild/utils.js.map +1 -1
  124. package/src/tools/oxc/oxc-transform.d.ts +3 -0
  125. package/src/tools/oxc/oxc-transform.js +103 -124
  126. package/src/tools/oxc/oxc-transform.js.map +1 -1
  127. package/src/tools/oxc/traversal.d.ts +32 -0
  128. package/src/tools/oxc/traversal.js +299 -0
  129. package/src/tools/oxc/traversal.js.map +1 -0
  130. package/src/tools/sass/rebasing-importer.d.ts +8 -14
  131. package/src/tools/sass/rebasing-importer.js +18 -24
  132. package/src/tools/sass/rebasing-importer.js.map +1 -1
  133. package/src/tools/sass/sass-service.d.ts +11 -38
  134. package/src/tools/sass/sass-service.js +124 -187
  135. package/src/tools/sass/sass-service.js.map +1 -1
  136. package/src/utils/environment-options.d.ts +12 -0
  137. package/src/utils/environment-options.js +20 -12
  138. package/src/utils/environment-options.js.map +1 -1
  139. package/src/utils/i18n-options.d.ts +2 -1
  140. package/src/utils/i18n-options.js.map +1 -1
  141. package/src/utils/normalize-cache.d.ts +11 -1
  142. package/src/utils/normalize-cache.js +6 -3
  143. package/src/utils/normalize-cache.js.map +1 -1
  144. package/src/utils/purge-cache.js +24 -13
  145. package/src/utils/purge-cache.js.map +1 -1
  146. package/src/utils/server-rendering/esm-in-memory-loader/loader-hooks.d.ts +1 -1
  147. package/src/utils/server-rendering/esm-in-memory-loader/loader-hooks.js +12 -9
  148. package/src/utils/server-rendering/esm-in-memory-loader/loader-hooks.js.map +1 -1
  149. package/src/utils/server-rendering/esm-in-memory-loader/utils.d.ts +8 -0
  150. package/src/utils/server-rendering/esm-in-memory-loader/utils.js +30 -0
  151. package/src/utils/server-rendering/esm-in-memory-loader/utils.js.map +1 -1
  152. package/src/utils/server-rendering/prerender.d.ts +2 -1
  153. package/src/utils/server-rendering/prerender.js +83 -30
  154. package/src/utils/server-rendering/prerender.js.map +1 -1
  155. package/src/utils/server-rendering/render-worker.d.ts +10 -5
  156. package/src/utils/server-rendering/render-worker.js +31 -7
  157. package/src/utils/server-rendering/render-worker.js.map +1 -1
  158. package/src/utils/test-files.d.ts +2 -2
  159. package/src/utils/test-files.js +3 -3
  160. package/src/utils/test-files.js.map +1 -1
  161. package/src/tools/angular/compilation/noop-compilation.d.ts +0 -15
  162. package/src/tools/angular/compilation/noop-compilation.js +0 -27
  163. package/src/tools/angular/compilation/noop-compilation.js.map +0 -1
  164. package/src/tools/sass/worker.d.ts +0 -63
  165. package/src/tools/sass/worker.js +0 -202
  166. package/src/tools/sass/worker.js.map +0 -1
  167. /package/src/tools/{esbuild/angular → angular/compilation}/diagnostics.d.ts +0 -0
  168. /package/src/tools/{esbuild/angular → angular/compilation}/diagnostics.js +0 -0
  169. /package/src/tools/{esbuild/angular → angular/compilation}/diagnostics.js.map +0 -0
@@ -43,16 +43,15 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
43
43
  return (mod && mod.__esModule) ? mod : { "default": mod };
44
44
  };
45
45
  Object.defineProperty(exports, "__esModule", { value: true });
46
- exports.default = inlineFile;
46
+ exports.inlineFileBatch = inlineFileBatch;
47
47
  exports.inlineCode = inlineCode;
48
48
  const remapping_1 = __importDefault(require("@ampproject/remapping"));
49
49
  const magic_string_1 = require("magic-string");
50
- const node_assert_1 = __importDefault(require("node:assert"));
51
50
  const node_v8_1 = require("node:v8");
52
- const node_worker_threads_1 = require("node:worker_threads");
53
51
  const oxc_parser_1 = require("oxc-parser");
54
- // Extract the application files and common options used for inline requests from the Worker context
55
- const { files, missingTranslation } = (node_worker_threads_1.workerData || {});
52
+ const traversal_1 = require("../oxc/traversal");
53
+ const i18n_locale_plugin_1 = require("./i18n-locale-plugin");
54
+ const i18n_translation_reader_1 = require("./i18n-translation-reader");
56
55
  /**
57
56
  * Cache of file data promises keyed by filename.
58
57
  */
@@ -62,66 +61,121 @@ const fileDataCache = new Map();
62
61
  */
63
62
  const deserializedTranslations = new Map();
64
63
  /**
65
- * Retrieves the cached file data for a filename, loading and extracting it on the first request.
64
+ * The current inlining generation for this worker.
65
+ */
66
+ let currentGeneration;
67
+ /**
68
+ * Retrieves the file data for a filename, loading and extracting localization metadata.
69
+ * If `cache` is true, the result is cached in `fileDataCache` across requests in this Worker.
70
+ * If `cache` is false (ephemeral), the result is not retained in `fileDataCache`, allowing it
71
+ * to be garbage-collected once the batch request finishes.
66
72
  *
67
73
  * @param filename The name of the file to load.
68
- * @returns The cached code and localization metadata.
74
+ * @param codeBlob The source code file as a Blob.
75
+ * @param cache Whether to cache the loaded file data in the Worker's long-term cache.
76
+ * @returns The cached or newly extracted code and localization metadata.
69
77
  */
70
- function getFileData(filename) {
71
- let fileDataPromise = fileDataCache.get(filename);
72
- if (!fileDataPromise) {
73
- fileDataPromise = (async () => {
74
- const data = files.get(filename);
75
- (0, node_assert_1.default)(data !== undefined, `Invalid inline request for file '${filename}'.`);
76
- const code = await data.text();
77
- const metadata = extractLocalizeMetadata(filename, code);
78
- return { code, metadata };
79
- })();
78
+ function loadFileData(filename, codeBlob, cache = true) {
79
+ const existing = fileDataCache.get(filename);
80
+ if (existing) {
81
+ if (!cache) {
82
+ fileDataCache.delete(filename);
83
+ }
84
+ return existing;
85
+ }
86
+ const fileDataPromise = (async () => {
87
+ const code = await codeBlob.text();
88
+ const metadata = extractLocalizeMetadata(filename, code);
89
+ return { code, metadata };
90
+ })();
91
+ if (cache) {
92
+ fileDataPromise.catch(() => {
93
+ fileDataCache.delete(filename);
94
+ });
80
95
  fileDataCache.set(filename, fileDataPromise);
81
96
  }
82
97
  return fileDataPromise;
83
98
  }
84
99
  /**
85
- * Deserializes the translation messages for an inline request, reusing the result for any
100
+ * Deserializes or wraps the translation messages for a locale, reusing the result for any
86
101
  * subsequent request that targets the same locale.
87
- * @param request An inline request containing the locale and its serialized messages.
102
+ * @param locale The locale identifier.
103
+ * @param translation Optional serialized translation messages (SharedArrayBuffer or Blob).
88
104
  * @returns The translation messages, or undefined if the locale has no translations.
89
105
  */
90
- function loadTranslation(request) {
91
- const { locale, translation } = request;
106
+ function loadTranslation(locale, translation) {
92
107
  if (!translation) {
93
108
  return undefined;
94
109
  }
95
110
  let messagesPromise = deserializedTranslations.get(locale);
96
111
  if (!messagesPromise) {
97
- messagesPromise = translation
98
- .arrayBuffer()
99
- .then((buffer) => (0, node_v8_1.deserialize)(new Uint8Array(buffer)));
112
+ if (translation instanceof Blob) {
113
+ messagesPromise = translation
114
+ .arrayBuffer()
115
+ .then((buffer) => (0, node_v8_1.deserialize)(new Uint8Array(buffer)))
116
+ .catch((error) => {
117
+ deserializedTranslations.delete(locale);
118
+ throw error;
119
+ });
120
+ }
121
+ else {
122
+ messagesPromise = Promise.resolve((0, i18n_translation_reader_1.createSharedTranslationProxy)(translation));
123
+ }
100
124
  deserializedTranslations.set(locale, messagesPromise);
101
125
  }
102
126
  return messagesPromise;
103
127
  }
104
128
  /**
105
- * Inlines the provided locale and translation into a JavaScript file that contains `$localize` usage.
106
- * This function is the main entry for the Worker's action that is called by the worker pool.
129
+ * Inlines multiple locales and translations into a JavaScript file that contains `$localize` usage.
107
130
  *
108
- * @param request An InlineRequest object representing the options for inlining
109
- * @returns An object containing the inlined file and optional map content.
131
+ * @param request An InlineFileBatchRequest object representing the options for inlining.
132
+ * @returns An object containing the inlined results for each requested locale.
110
133
  */
111
- async function inlineFile(request) {
112
- const { code, metadata } = await getFileData(request.filename);
113
- // Sourcemaps are parsed on demand per request rather than cached long-term to prevent
114
- // monotonic memory growth as a worker processes multiple files across the build.
115
- // When multi-locale batching is implemented, the sourcemap can be parsed once per batch and released
116
- // upon batch completion.
117
- const rawMap = await files.get(request.filename + '.map')?.text();
118
- const map = rawMap ? JSON.parse(rawMap) : undefined;
119
- const result = await inlineLocalize(code, map, metadata, request.locale, await loadTranslation(request), request.filename);
134
+ async function inlineFileBatch(request) {
135
+ if (request.generation !== undefined && request.generation !== currentGeneration) {
136
+ currentGeneration = request.generation;
137
+ fileDataCache.clear();
138
+ deserializedTranslations.clear();
139
+ }
140
+ if (request.activeLocales) {
141
+ const activeSet = new Set(request.activeLocales);
142
+ for (const locale of deserializedTranslations.keys()) {
143
+ if (!activeSet.has(locale)) {
144
+ deserializedTranslations.delete(locale);
145
+ }
146
+ }
147
+ }
148
+ const { code, metadata } = await loadFileData(request.filename, request.code, !request.ephemeral);
149
+ // Fast path: file has no $localize call sites or locale insert sites
150
+ if (metadata.callSites.length === 0 && metadata.localeInsertSites.length === 0) {
151
+ return {
152
+ file: request.filename,
153
+ unmodified: true,
154
+ messages: (metadata.diagnostics ?? []).map((message) => ({
155
+ type: 'error',
156
+ message,
157
+ })),
158
+ };
159
+ }
160
+ // Parse the sourcemap once for the entire batch if provided.
161
+ // It will naturally be garbage-collected after this batch action returns.
162
+ let map;
163
+ if (request.map) {
164
+ const rawMap = await request.map.text();
165
+ map = rawMap ? JSON.parse(rawMap) : undefined;
166
+ }
167
+ const results = await Promise.all(Array.from(request.locales, async ([locale, translation]) => {
168
+ const result = await inlineLocalize(code, map, metadata, locale, await loadTranslation(locale, translation), request.filename, request.missingTranslation);
169
+ return {
170
+ locale,
171
+ code: result.code,
172
+ map: result.map,
173
+ messages: result.diagnostics.messages,
174
+ };
175
+ }));
120
176
  return {
121
177
  file: request.filename,
122
- code: result.code,
123
- map: result.map,
124
- messages: result.diagnostics.messages,
178
+ results,
125
179
  };
126
180
  }
127
181
  /**
@@ -133,9 +187,9 @@ async function inlineFile(request) {
133
187
  */
134
188
  async function inlineCode(request) {
135
189
  const metadata = extractLocalizeMetadata(request.filename, request.code);
136
- const result = await inlineLocalize(request.code, undefined, metadata, request.locale, await loadTranslation(request), request.filename);
190
+ const result = await inlineLocalize(request.code, undefined, metadata, request.locale, await loadTranslation(request.locale, request.translation), request.filename, request.missingTranslation);
137
191
  return {
138
- output: result.code,
192
+ output: result.code ?? request.code,
139
193
  messages: result.diagnostics.messages,
140
194
  };
141
195
  }
@@ -156,49 +210,6 @@ async function loadLocalizeTools() {
156
210
  localizeToolsModule ??= await Promise.resolve().then(() => __importStar(require('@angular/localize/tools')));
157
211
  return localizeToolsModule;
158
212
  }
159
- /**
160
- * Traverses ESTree AST nodes in post-order (bottom-up) without recursion.
161
- * Bottom-up traversal ensures that nested `$localize` expressions are transformed and
162
- * written to MagicString before outer containing templates are evaluated.
163
- *
164
- * @param root The root AST node to traverse.
165
- * @param onExit Callback invoked on each AST node in post-order.
166
- */
167
- function walkAstPostOrder(root, onExit) {
168
- const traverseStack = [root];
169
- const postOrderNodes = [];
170
- while (traverseStack.length > 0) {
171
- const current = traverseStack.pop();
172
- if (!current) {
173
- continue;
174
- }
175
- postOrderNodes.push(current);
176
- const keys = oxc_parser_1.visitorKeys[current.type];
177
- if (!keys) {
178
- continue;
179
- }
180
- for (let i = 0; i < keys.length; i++) {
181
- const child = current[keys[i]];
182
- if (!child) {
183
- continue;
184
- }
185
- if (Array.isArray(child)) {
186
- for (const item of child) {
187
- if (item) {
188
- traverseStack.push(item);
189
- }
190
- }
191
- }
192
- else {
193
- traverseStack.push(child);
194
- }
195
- }
196
- }
197
- // Process collected nodes in reverse order to achieve bottom-up (post-order) traversal
198
- for (let i = postOrderNodes.length - 1; i >= 0; i--) {
199
- onExit(postOrderNodes[i]);
200
- }
201
- }
202
213
  /**
203
214
  * Extracts localization call sites and locale insertion points from JavaScript code using OXC.
204
215
  *
@@ -216,7 +227,7 @@ function extractLocalizeMetadata(filename, code) {
216
227
  const callSites = [];
217
228
  const localeInsertSites = [];
218
229
  let diagnostics;
219
- walkAstPostOrder(program, (node) => {
230
+ (0, traversal_1.traversePostOrder)(program, (node) => {
220
231
  if (node.type === 'Literal') {
221
232
  if (typeof node.value === 'string' && node.value === '___NG_LOCALE_INSERT___') {
222
233
  localeInsertSites.push({ start: node.start, end: node.end });
@@ -242,11 +253,13 @@ function extractLocalizeMetadata(filename, code) {
242
253
  start: expr.start,
243
254
  end: expr.end,
244
255
  }));
256
+ const expressionIndexes = expressions.map((_, index) => index);
245
257
  callSites.push({
246
258
  start: node.start,
247
259
  end: node.end,
248
260
  messageParts,
249
261
  expressions,
262
+ expressionIndexes,
250
263
  });
251
264
  }
252
265
  }
@@ -254,6 +267,16 @@ function extractLocalizeMetadata(filename, code) {
254
267
  });
255
268
  return { callSites, localeInsertSites, diagnostics };
256
269
  }
270
+ /**
271
+ * Escapes a template literal string part for insertion into an ES template literal (backticks).
272
+ * Uses JSON.stringify for base escaping of control characters and backslashes, then unescapes
273
+ * double quotes and escapes backticks and `${` expression delimiters in a single pass.
274
+ */
275
+ function escapeTemplatePart(part) {
276
+ return JSON.stringify(part)
277
+ .slice(1, -1)
278
+ .replace(/\\"|`|\$\{/g, (match) => (match === '\\"' ? '"' : '\\' + match));
279
+ }
257
280
  /**
258
281
  * Inlines translations into code using previously extracted localization metadata.
259
282
  *
@@ -263,9 +286,10 @@ function extractLocalizeMetadata(filename, code) {
263
286
  * @param locale The target locale identifier.
264
287
  * @param translation The translation messages dictionary, or undefined for untranslated locale.
265
288
  * @param filename The name of the file being transformed.
289
+ * @param missingTranslation How to handle missing translations.
266
290
  * @returns The transformed code, optional remapped source map, and diagnostics.
267
291
  */
268
- async function inlineLocalize(code, map, metadata, locale, translation, filename) {
292
+ async function inlineLocalize(code, map, metadata, locale, translation, filename, missingTranslation = 'warning') {
269
293
  const magicString = new magic_string_1.MagicString(code);
270
294
  const { Diagnostics, translate } = await loadLocalizeTools();
271
295
  const diagnostics = new Diagnostics();
@@ -274,11 +298,22 @@ async function inlineLocalize(code, map, metadata, locale, translation, filename
274
298
  diagnostics.error(message);
275
299
  }
276
300
  }
277
- for (const site of metadata.localeInsertSites) {
278
- magicString.overwrite(site.start, site.end, JSON.stringify(locale));
301
+ if (metadata.localeInsertSites.length > 0) {
302
+ const localeData = await (0, i18n_locale_plugin_1.loadLocaleData)(locale);
303
+ if (localeData.error) {
304
+ diagnostics.error(localeData.error);
305
+ }
306
+ else if (localeData.warning) {
307
+ diagnostics.warn(localeData.warning);
308
+ }
309
+ let injected = false;
310
+ for (const site of metadata.localeInsertSites) {
311
+ magicString.overwrite(site.start, site.end, JSON.stringify(locale) + (localeData.code && !injected ? `;\n${localeData.code}\n;` : ''));
312
+ injected = true;
313
+ }
279
314
  }
280
315
  for (const callSite of metadata.callSites) {
281
- const [translatedParts, translatedSubstitutions] = translate(diagnostics, translation || {}, callSite.messageParts, callSite.expressions.map((_, index) => index), translation === undefined ? 'ignore' : missingTranslation);
316
+ const [translatedParts, translatedSubstitutions] = translate(diagnostics, translation || {}, callSite.messageParts, callSite.expressionIndexes, translation === undefined ? 'ignore' : missingTranslation);
282
317
  // Reconstruct the new template/string literal replacement
283
318
  let replacement;
284
319
  if (translatedSubstitutions.length === 0) {
@@ -287,12 +322,7 @@ async function inlineLocalize(code, map, metadata, locale, translation, filename
287
322
  else {
288
323
  replacement = '`';
289
324
  for (let i = 0; i < translatedParts.length; i++) {
290
- const escapedPart = JSON.stringify(translatedParts[i])
291
- .slice(1, -1)
292
- .replace(/\\"/g, '"')
293
- .replace(/`/g, '\\`')
294
- .replace(/\$\{/g, '\\${');
295
- replacement += escapedPart;
325
+ replacement += escapeTemplatePart(translatedParts[i]);
296
326
  if (i < translatedSubstitutions.length) {
297
327
  const originalIndex = translatedSubstitutions[i];
298
328
  const expr = callSite.expressions[originalIndex];
@@ -304,9 +334,16 @@ async function inlineLocalize(code, map, metadata, locale, translation, filename
304
334
  }
305
335
  magicString.overwrite(callSite.start, callSite.end, replacement);
306
336
  }
337
+ if (!magicString.hasChanged()) {
338
+ return {
339
+ code: undefined,
340
+ map: undefined,
341
+ diagnostics,
342
+ };
343
+ }
307
344
  const outputCode = magicString.toString();
308
345
  let outputMap;
309
- if (map && magicString.hasChanged()) {
346
+ if (map) {
310
347
  // A decoded map is generated here rather than an encoded one because remapping decodes its
311
348
  // inputs. Encoding the mappings only for remapping to immediately decode them again doubles
312
349
  // the peak memory of the largest structure involved in inlining a file.
@@ -1 +1 @@
1
- {"version":3,"file":"i18n-inliner-worker.js","sourceRoot":"","sources":["i18n-inliner-worker.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"i18n-inliner-worker.js","sourceRoot":"","sources":["i18n-inliner-worker.ts"],"names":[],"mappings":"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"}
@@ -5,17 +5,41 @@
5
5
  * Use of this source code is governed by an MIT-style license that can be
6
6
  * found in the LICENSE file at https://angular.dev/license
7
7
  */
8
+ import type { ɵParsedTranslation } from '@angular/localize';
8
9
  import { type BuildOutputFile } from './bundler-files';
9
10
  /**
10
11
  * Inlining options that should apply to all transformed code.
11
12
  */
12
13
  export interface I18nInlinerOptions {
13
14
  missingTranslation: 'error' | 'warning' | 'ignore';
14
- outputFiles: BuildOutputFile[];
15
- shouldOptimize?: boolean;
16
15
  persistentCachePath?: string;
17
16
  localizeVersion?: string;
18
17
  }
18
+ /**
19
+ * Options for inlining a specific locale.
20
+ */
21
+ export interface LocaleInlineOptions {
22
+ /**
23
+ * The locale specifier string.
24
+ */
25
+ locale: string;
26
+ /**
27
+ * The translation messages for the locale, or undefined for the source/untranslated locale.
28
+ */
29
+ translation?: Record<string, ɵParsedTranslation>;
30
+ /**
31
+ * An optional content integrity hash of the translation file(s) for fast cache key calculation.
32
+ */
33
+ translationIntegrity?: string;
34
+ }
35
+ /**
36
+ * Result of inlining for a specific locale.
37
+ */
38
+ export interface LocaleInlineResult {
39
+ outputFiles: BuildOutputFile[];
40
+ errors: string[];
41
+ warnings: string[];
42
+ }
19
43
  /**
20
44
  * A class that performs i18n translation inlining of JavaScript code.
21
45
  * A worker pool is used to distribute the transformation actions and allow
@@ -27,20 +51,27 @@ export declare class I18nInliner {
27
51
  private readonly options;
28
52
  constructor(options: I18nInlinerOptions, maxThreads?: number);
29
53
  /**
30
- * Performs inlining of translations for the provided locale and translations. The files that
31
- * are processed originate from the files passed to the class constructor and filter by presence
32
- * of the localize function keyword.
54
+ * Performs inlining of translations across multiple locales in parallel.
55
+ *
56
+ * An adaptive 2D task-partitioning algorithm distributes (files x locales) work units
57
+ * across all worker threads while caching AST metadata and sourcemaps in worker memory.
58
+ *
59
+ * @param files The build output files to transform.
60
+ * @param locales The locales and translations to inline.
61
+ * @returns A map of locale names to their inlined output files and diagnostics.
62
+ */
63
+ inlineAll(files: Iterable<BuildOutputFile>, locales: Iterable<LocaleInlineOptions>): Promise<Map<string, LocaleInlineResult>>;
64
+ /**
65
+ * Performs inlining of translations for the provided locale and translations.
66
+ *
67
+ * @param files The build output files to transform.
33
68
  * @param locale The string representing the locale to inline.
34
69
  * @param translation The translation messages to use when inlining.
35
70
  * @param translationIntegrity An optional integrity value for the translation messages to use for caching.
36
71
  * @returns A promise that resolves to an array of OutputFiles representing a translated result.
37
72
  */
38
- inlineForLocale(locale: string, translation: Record<string, unknown> | undefined, translationIntegrity?: string): Promise<{
39
- outputFiles: BuildOutputFile[];
40
- errors: string[];
41
- warnings: string[];
42
- }>;
43
- inlineTemplateUpdate(locale: string, translation: Record<string, unknown> | undefined, templateCode: string, templateId: string): Promise<{
73
+ inlineForLocale(files: Iterable<BuildOutputFile>, locale: string, translation: Record<string, ɵParsedTranslation> | undefined, translationIntegrity?: string): Promise<LocaleInlineResult>;
74
+ inlineTemplateUpdate(locale: string, translation: Record<string, ɵParsedTranslation> | undefined, templateCode: string, templateId: string, translationIntegrity?: string): Promise<{
44
75
  code: string;
45
76
  errors: string[];
46
77
  warnings: string[];