@angular-devkit/build-angular 17.0.0-next.9 → 17.0.0-rc.1

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 (244) hide show
  1. package/package.json +13 -13
  2. package/plugins/karma.js +0 -1
  3. package/src/builders/app-shell/index.js +8 -6
  4. package/src/builders/app-shell/render-worker.js +0 -1
  5. package/src/builders/app-shell/schema.js +0 -1
  6. package/src/builders/application/build-action.js +0 -1
  7. package/src/builders/application/execute-build.js +37 -14
  8. package/src/builders/application/execute-post-bundle.d.ts +1 -0
  9. package/src/builders/application/execute-post-bundle.js +5 -3
  10. package/src/builders/application/i18n.d.ts +1 -0
  11. package/src/builders/application/i18n.js +4 -2
  12. package/src/builders/application/index.js +8 -2
  13. package/src/builders/application/options.d.ts +1 -1
  14. package/src/builders/application/options.js +3 -3
  15. package/src/builders/application/schema.d.ts +15 -5
  16. package/src/builders/application/schema.js +0 -1
  17. package/src/builders/application/schema.json +10 -4
  18. package/src/builders/browser/index.js +0 -1
  19. package/src/builders/browser/schema.js +0 -1
  20. package/src/builders/browser-esbuild/builder-status-warnings.js +0 -1
  21. package/src/builders/browser-esbuild/index.js +14 -13
  22. package/src/builders/browser-esbuild/schema.js +0 -1
  23. package/src/builders/dev-server/builder.js +0 -1
  24. package/src/builders/dev-server/index.js +0 -1
  25. package/src/builders/dev-server/load-proxy-config.js +0 -1
  26. package/src/builders/dev-server/options.js +0 -1
  27. package/src/builders/dev-server/schema.js +0 -1
  28. package/src/builders/dev-server/vite-server.d.ts +5 -2
  29. package/src/builders/dev-server/vite-server.js +78 -45
  30. package/src/builders/dev-server/webpack-server.js +0 -1
  31. package/src/builders/extract-i18n/application-extraction.js +0 -1
  32. package/src/builders/extract-i18n/builder.js +0 -1
  33. package/src/builders/extract-i18n/empty-loader.js +0 -1
  34. package/src/builders/extract-i18n/index.js +0 -1
  35. package/src/builders/extract-i18n/ivy-extract-loader.js +0 -1
  36. package/src/builders/extract-i18n/options.js +0 -1
  37. package/src/builders/extract-i18n/schema.js +0 -1
  38. package/src/builders/extract-i18n/webpack-extraction.js +0 -1
  39. package/src/builders/jest/index.js +0 -1
  40. package/src/builders/jest/options.js +0 -1
  41. package/src/builders/jest/schema.js +0 -1
  42. package/src/builders/jest/test-files.js +0 -1
  43. package/src/builders/karma/find-tests-plugin.js +0 -1
  44. package/src/builders/karma/index.js +0 -1
  45. package/src/builders/karma/schema.js +0 -1
  46. package/src/builders/ng-packagr/index.js +0 -1
  47. package/src/builders/ng-packagr/schema.js +0 -1
  48. package/src/builders/prerender/index.js +2 -1
  49. package/src/builders/prerender/render-worker.js +2 -3
  50. package/src/builders/prerender/routes-extractor-worker.js +1 -2
  51. package/src/builders/prerender/schema.d.ts +4 -2
  52. package/src/builders/prerender/schema.js +0 -1
  53. package/src/builders/prerender/schema.json +2 -2
  54. package/src/builders/protractor/index.js +0 -1
  55. package/src/builders/protractor/schema.js +0 -1
  56. package/src/builders/server/index.js +0 -1
  57. package/src/builders/server/platform-server-exports-loader.js +0 -1
  58. package/src/builders/server/schema.js +0 -1
  59. package/src/builders/ssr-dev-server/index.js +0 -1
  60. package/src/builders/ssr-dev-server/schema.js +0 -1
  61. package/src/builders/ssr-dev-server/utils.js +0 -1
  62. package/src/index.js +0 -1
  63. package/src/tools/babel/plugins/adjust-static-class-members.js +0 -1
  64. package/src/tools/babel/plugins/adjust-typescript-enums.js +0 -1
  65. package/src/tools/babel/plugins/elide-angular-metadata.js +0 -1
  66. package/src/tools/babel/plugins/pure-toplevel-functions.js +0 -1
  67. package/src/tools/babel/presets/application.js +0 -1
  68. package/src/tools/babel/webpack-loader.js +0 -1
  69. package/src/tools/esbuild/angular/angular-host.js +0 -1
  70. package/src/tools/esbuild/angular/compilation/angular-compilation.d.ts +6 -3
  71. package/src/tools/esbuild/angular/compilation/angular-compilation.js +36 -9
  72. package/src/tools/esbuild/angular/compilation/aot-compilation.js +2 -1
  73. package/src/tools/esbuild/angular/compilation/factory.d.ts +16 -0
  74. package/src/tools/esbuild/angular/compilation/factory.js +56 -0
  75. package/src/tools/esbuild/angular/compilation/index.d.ts +1 -2
  76. package/src/tools/esbuild/angular/compilation/index.js +3 -6
  77. package/src/tools/esbuild/angular/compilation/jit-compilation.js +0 -1
  78. package/src/tools/esbuild/angular/compilation/noop-compilation.d.ts +1 -1
  79. package/src/tools/esbuild/angular/compilation/noop-compilation.js +0 -1
  80. package/src/tools/esbuild/angular/compilation/parallel-compilation.d.ts +42 -0
  81. package/src/tools/esbuild/angular/compilation/parallel-compilation.js +121 -0
  82. package/src/tools/esbuild/angular/compilation/parallel-worker.d.ts +32 -0
  83. package/src/tools/esbuild/angular/compilation/parallel-worker.js +90 -0
  84. package/src/tools/esbuild/angular/compilation-state.js +0 -1
  85. package/src/tools/esbuild/angular/compiler-plugin.d.ts +1 -0
  86. package/src/tools/esbuild/angular/compiler-plugin.js +111 -52
  87. package/src/tools/esbuild/angular/component-stylesheets.d.ts +3 -3
  88. package/src/tools/esbuild/angular/component-stylesheets.js +47 -32
  89. package/src/tools/esbuild/angular/diagnostics.d.ts +2 -2
  90. package/src/tools/esbuild/angular/diagnostics.js +9 -15
  91. package/src/tools/esbuild/angular/file-reference-tracker.d.ts +17 -0
  92. package/src/tools/esbuild/angular/file-reference-tracker.js +53 -0
  93. package/src/tools/esbuild/angular/jit-plugin-callbacks.d.ts +6 -3
  94. package/src/tools/esbuild/angular/jit-plugin-callbacks.js +4 -5
  95. package/src/tools/esbuild/angular/jit-resource-transformer.js +0 -1
  96. package/src/tools/esbuild/angular/source-file-cache.d.ts +1 -1
  97. package/src/tools/esbuild/angular/source-file-cache.js +3 -2
  98. package/src/tools/esbuild/angular/uri.js +0 -1
  99. package/src/tools/esbuild/angular/web-worker-transformer.js +0 -1
  100. package/src/tools/esbuild/application-code-bundle.d.ts +2 -0
  101. package/src/tools/esbuild/application-code-bundle.js +209 -150
  102. package/src/tools/esbuild/budget-stats.js +0 -1
  103. package/src/tools/esbuild/bundler-context.d.ts +12 -1
  104. package/src/tools/esbuild/bundler-context.js +105 -10
  105. package/src/tools/esbuild/bundler-execution-result.d.ts +19 -0
  106. package/src/tools/esbuild/bundler-execution-result.js +18 -3
  107. package/src/tools/esbuild/commonjs-checker.js +3 -1
  108. package/src/tools/esbuild/compiler-plugin-options.js +1 -1
  109. package/src/tools/esbuild/global-scripts.js +0 -1
  110. package/src/tools/esbuild/global-styles.js +0 -1
  111. package/src/tools/esbuild/i18n-inliner-worker.js +0 -1
  112. package/src/tools/esbuild/i18n-inliner.js +2 -1
  113. package/src/tools/esbuild/i18n-locale-plugin.js +0 -1
  114. package/src/tools/esbuild/index-html-generator.js +25 -3
  115. package/src/tools/esbuild/javascript-transfomer-plugin.d.ts +19 -0
  116. package/src/tools/esbuild/javascript-transfomer-plugin.js +51 -0
  117. package/src/tools/esbuild/javascript-transformer-worker.js +0 -1
  118. package/src/tools/esbuild/javascript-transformer.d.ts +1 -1
  119. package/src/tools/esbuild/javascript-transformer.js +5 -1
  120. package/src/tools/esbuild/license-extractor.js +0 -1
  121. package/src/tools/esbuild/load-result-cache.d.ts +2 -0
  122. package/src/tools/esbuild/load-result-cache.js +3 -1
  123. package/src/tools/esbuild/profiling.js +0 -1
  124. package/src/tools/esbuild/rxjs-esm-resolution-plugin.js +0 -1
  125. package/src/tools/esbuild/sourcemap-ignorelist-plugin.js +0 -1
  126. package/src/tools/esbuild/stylesheets/bundle-options.js +0 -1
  127. package/src/tools/esbuild/stylesheets/css-language.js +0 -1
  128. package/src/tools/esbuild/stylesheets/css-resource-plugin.js +25 -7
  129. package/src/tools/esbuild/stylesheets/less-language.js +0 -1
  130. package/src/tools/esbuild/stylesheets/sass-language.js +6 -20
  131. package/src/tools/esbuild/stylesheets/stylesheet-plugin-factory.js +25 -11
  132. package/src/tools/esbuild/utils.d.ts +4 -4
  133. package/src/tools/esbuild/utils.js +47 -34
  134. package/src/tools/esbuild/virtual-module-plugin.d.ts +3 -0
  135. package/src/tools/esbuild/virtual-module-plugin.js +3 -3
  136. package/src/tools/esbuild/watcher.js +0 -1
  137. package/src/tools/sass/lexer.js +0 -1
  138. package/src/tools/sass/rebasing-importer.d.ts +3 -8
  139. package/src/tools/sass/rebasing-importer.js +3 -52
  140. package/src/tools/sass/sass-service-legacy.js +0 -1
  141. package/src/tools/sass/sass-service.d.ts +1 -17
  142. package/src/tools/sass/sass-service.js +4 -6
  143. package/src/tools/sass/worker-legacy.js +0 -1
  144. package/src/tools/sass/worker.js +8 -2
  145. package/src/tools/vite/i18n-locale-plugin.js +0 -1
  146. package/src/tools/webpack/configs/common.js +0 -1
  147. package/src/tools/webpack/configs/dev-server.js +0 -1
  148. package/src/tools/webpack/configs/index.js +0 -1
  149. package/src/tools/webpack/configs/styles.js +6 -12
  150. package/src/tools/webpack/plugins/any-component-style-budget-checker.js +0 -1
  151. package/src/tools/webpack/plugins/builder-watch-plugin.js +0 -1
  152. package/src/tools/webpack/plugins/common-js-usage-warn-plugin.js +0 -1
  153. package/src/tools/webpack/plugins/css-optimizer-plugin.js +0 -1
  154. package/src/tools/webpack/plugins/dedupe-module-resolve-plugin.js +0 -1
  155. package/src/tools/webpack/plugins/devtools-ignore-plugin.js +0 -1
  156. package/src/tools/webpack/plugins/esbuild-executor.js +0 -1
  157. package/src/tools/webpack/plugins/hmr/hmr-accept.js +0 -1
  158. package/src/tools/webpack/plugins/hmr/hmr-loader.js +0 -1
  159. package/src/tools/webpack/plugins/index-html-webpack-plugin.js +0 -1
  160. package/src/tools/webpack/plugins/index.js +0 -1
  161. package/src/tools/webpack/plugins/javascript-optimizer-plugin.js +2 -1
  162. package/src/tools/webpack/plugins/javascript-optimizer-worker.js +0 -1
  163. package/src/tools/webpack/plugins/json-stats-plugin.js +0 -1
  164. package/src/tools/webpack/plugins/karma/karma.js +0 -1
  165. package/src/tools/webpack/plugins/named-chunks-plugin.js +0 -1
  166. package/src/tools/webpack/plugins/occurrences-plugin.js +0 -1
  167. package/src/tools/webpack/plugins/postcss-cli-resources.js +0 -1
  168. package/src/tools/webpack/plugins/progress-plugin.js +0 -1
  169. package/src/tools/webpack/plugins/remove-hash-plugin.js +0 -1
  170. package/src/tools/webpack/plugins/scripts-webpack-plugin.js +0 -1
  171. package/src/tools/webpack/plugins/service-worker-plugin.js +0 -1
  172. package/src/tools/webpack/plugins/styles-webpack-plugin.js +0 -1
  173. package/src/tools/webpack/plugins/suppress-entry-chunks-webpack-plugin.js +0 -1
  174. package/src/tools/webpack/plugins/transfer-size-plugin.js +0 -1
  175. package/src/tools/webpack/plugins/typescript.js +0 -1
  176. package/src/tools/webpack/plugins/watch-files-logs-plugin.js +0 -1
  177. package/src/tools/webpack/utils/async-chunks.js +0 -1
  178. package/src/tools/webpack/utils/helpers.js +0 -1
  179. package/src/tools/webpack/utils/stats.js +0 -1
  180. package/src/transforms.js +0 -1
  181. package/src/utils/action-executor.js +5 -2
  182. package/src/utils/build-options.js +0 -1
  183. package/src/utils/bundle-calculator.js +0 -1
  184. package/src/utils/bundle-inline-options.js +0 -1
  185. package/src/utils/check-port.js +0 -1
  186. package/src/utils/color.js +0 -1
  187. package/src/utils/copy-assets.js +0 -1
  188. package/src/utils/default-progress.js +0 -1
  189. package/src/utils/delete-output-dir.js +0 -1
  190. package/src/utils/environment-options.d.ts +1 -0
  191. package/src/utils/environment-options.js +3 -2
  192. package/src/utils/error.js +0 -1
  193. package/src/utils/i18n-inlining.js +0 -1
  194. package/src/utils/i18n-options.js +0 -1
  195. package/src/utils/index-file/augment-index-html.js +0 -1
  196. package/src/utils/index-file/html-rewriting-stream.js +0 -1
  197. package/src/utils/index-file/index-html-generator.js +0 -1
  198. package/src/utils/index-file/inline-critical-css.js +5 -3
  199. package/src/utils/index-file/inline-fonts.js +0 -1
  200. package/src/utils/index-file/style-nonce.js +0 -1
  201. package/src/utils/index.js +0 -1
  202. package/src/utils/load-esm.js +0 -1
  203. package/src/utils/load-translations.js +0 -1
  204. package/src/utils/normalize-asset-patterns.js +0 -1
  205. package/src/utils/normalize-builder-schema.js +0 -1
  206. package/src/utils/normalize-cache.js +0 -1
  207. package/src/utils/normalize-file-replacements.js +0 -1
  208. package/src/utils/normalize-optimization.js +0 -1
  209. package/src/utils/normalize-polyfills.js +0 -1
  210. package/src/utils/normalize-source-maps.js +0 -1
  211. package/src/utils/output-paths.js +0 -1
  212. package/src/utils/package-chunk-sort.js +0 -1
  213. package/src/utils/package-version.js +0 -1
  214. package/src/utils/process-bundle.js +0 -1
  215. package/src/utils/purge-cache.js +0 -1
  216. package/src/utils/read-tsconfig.js +0 -1
  217. package/src/utils/routes-extractor/extractor.d.ts +1 -1
  218. package/src/utils/routes-extractor/extractor.js +20 -8
  219. package/src/utils/run-module-as-observable-fork.js +0 -1
  220. package/src/utils/server-rendering/esm-in-memory-loader/loader-hooks.js +0 -1
  221. package/src/utils/server-rendering/esm-in-memory-loader/node-18-utils.js +0 -1
  222. package/src/utils/server-rendering/esm-in-memory-loader/register-hooks.js +0 -1
  223. package/src/utils/server-rendering/main-bundle-exports.d.ts +7 -3
  224. package/src/utils/server-rendering/main-bundle-exports.js +0 -1
  225. package/src/utils/server-rendering/prerender-server.d.ts +21 -0
  226. package/src/utils/server-rendering/prerender-server.js +102 -0
  227. package/src/utils/server-rendering/prerender.d.ts +3 -1
  228. package/src/utils/server-rendering/prerender.js +84 -22
  229. package/src/utils/server-rendering/render-page.d.ts +2 -2
  230. package/src/utils/server-rendering/render-page.js +42 -4
  231. package/src/utils/server-rendering/render-worker.d.ts +2 -0
  232. package/src/utils/server-rendering/render-worker.js +9 -3
  233. package/src/utils/server-rendering/routes-extractor-worker.d.ts +2 -0
  234. package/src/utils/server-rendering/routes-extractor-worker.js +4 -4
  235. package/src/utils/service-worker.js +0 -1
  236. package/src/utils/spinner.js +0 -1
  237. package/src/utils/strip-bom.js +0 -1
  238. package/src/utils/supported-browsers.js +0 -1
  239. package/src/utils/tailwind.js +0 -1
  240. package/src/utils/tty.js +0 -1
  241. package/src/utils/url.js +0 -1
  242. package/src/utils/version.js +0 -1
  243. package/src/utils/webpack-browser-config.js +0 -1
  244. package/src/utils/webpack-diagnostics.js +0 -1
@@ -10,22 +10,22 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
10
10
  return (mod && mod.__esModule) ? mod : { "default": mod };
11
11
  };
12
12
  Object.defineProperty(exports, "__esModule", { value: true });
13
- exports.createServerCodeBundleOptions = exports.createBrowserCodeBundleOptions = void 0;
13
+ exports.createServerPolyfillBundleOptions = exports.createServerCodeBundleOptions = exports.createBrowserPolyfillBundleOptions = exports.createBrowserCodeBundleOptions = void 0;
14
14
  const node_assert_1 = __importDefault(require("node:assert"));
15
15
  const node_crypto_1 = require("node:crypto");
16
16
  const promises_1 = require("node:fs/promises");
17
- const node_module_1 = require("node:module");
18
17
  const node_path_1 = require("node:path");
19
18
  const environment_options_1 = require("../../utils/environment-options");
20
19
  const compiler_plugin_1 = require("./angular/compiler-plugin");
21
20
  const compiler_plugin_options_1 = require("./compiler-plugin-options");
22
21
  const i18n_locale_plugin_1 = require("./i18n-locale-plugin");
22
+ const javascript_transfomer_plugin_1 = require("./javascript-transfomer-plugin");
23
23
  const rxjs_esm_resolution_plugin_1 = require("./rxjs-esm-resolution-plugin");
24
24
  const sourcemap_ignorelist_plugin_1 = require("./sourcemap-ignorelist-plugin");
25
25
  const utils_1 = require("./utils");
26
26
  const virtual_module_plugin_1 = require("./virtual-module-plugin");
27
27
  function createBrowserCodeBundleOptions(options, target, sourceFileCache) {
28
- const { workspaceRoot, entryPoints, outputNames, jit } = options;
28
+ const { entryPoints, outputNames } = options;
29
29
  const { pluginOptions, styleOptions } = (0, compiler_plugin_options_1.createCompilerPluginOptions)(options, target, sourceFileCache);
30
30
  const buildOptions = {
31
31
  ...getEsBuildCommonOptions(options),
@@ -51,97 +51,47 @@ function createBrowserCodeBundleOptions(options, target, sourceFileCache) {
51
51
  if (options.externalPackages) {
52
52
  buildOptions.packages = 'external';
53
53
  }
54
- const polyfills = options.polyfills ? [...options.polyfills] : [];
55
- // Angular JIT mode requires the runtime compiler
56
- if (jit) {
57
- polyfills.push('@angular/compiler');
58
- }
59
- // Add Angular's global locale data if i18n options are present.
60
- // Locale data should go first so that project provided polyfill code can augment if needed.
61
- let needLocaleDataPlugin = false;
62
- if (options.i18nOptions.shouldInline) {
63
- // When inlining, a placeholder is used to allow the post-processing step to inject the $localize locale identifier
64
- polyfills.unshift('angular:locale/placeholder');
65
- buildOptions.plugins?.unshift((0, virtual_module_plugin_1.createVirtualModulePlugin)({
66
- namespace: 'angular:locale/placeholder',
67
- entryPointOnly: false,
68
- loadContent: () => ({
69
- contents: `(globalThis.$localize ??= {}).locale = "___NG_LOCALE_INSERT___";\n`,
70
- loader: 'js',
71
- resolveDir: workspaceRoot,
72
- }),
73
- }));
74
- // Add locale data for all active locales
75
- // TODO: Inject each individually within the inlining process itself
76
- for (const locale of options.i18nOptions.inlineLocales) {
77
- polyfills.unshift(`angular:locale/data:${locale}`);
78
- }
79
- needLocaleDataPlugin = true;
80
- }
81
- else if (options.i18nOptions.hasDefinedSourceLocale) {
82
- // When not inlining and a source local is present, use the source locale data directly
83
- polyfills.unshift(`angular:locale/data:${options.i18nOptions.sourceLocale}`);
84
- needLocaleDataPlugin = true;
85
- }
86
- if (needLocaleDataPlugin) {
87
- buildOptions.plugins?.push((0, i18n_locale_plugin_1.createAngularLocaleDataPlugin)());
88
- }
89
- // Add polyfill entry point if polyfills are present
90
- if (polyfills.length) {
91
- const namespace = 'angular:polyfills';
92
- buildOptions.entryPoints = {
93
- ...buildOptions.entryPoints,
94
- 'polyfills': namespace,
95
- };
96
- buildOptions.plugins?.unshift((0, virtual_module_plugin_1.createVirtualModulePlugin)({
97
- namespace,
98
- loadContent: async (_, build) => {
99
- let hasLocalizePolyfill = false;
100
- const polyfillPaths = await Promise.all(polyfills.map(async (path) => {
101
- hasLocalizePolyfill ||= path.startsWith('@angular/localize');
102
- if (path.startsWith('zone.js') || !(0, node_path_1.extname)(path)) {
103
- return path;
104
- }
105
- const potentialPathRelative = './' + path;
106
- const result = await build.resolve(potentialPathRelative, {
107
- kind: 'import-statement',
108
- resolveDir: workspaceRoot,
109
- });
110
- return result.path ? potentialPathRelative : path;
111
- }));
112
- if (!options.i18nOptions.shouldInline && !hasLocalizePolyfill) {
113
- // Cannot use `build.resolve` here since it does not allow overriding the external options
114
- // and the actual presence of the `@angular/localize` package needs to be checked here.
115
- const workspaceRequire = (0, node_module_1.createRequire)(workspaceRoot + '/');
116
- try {
117
- workspaceRequire.resolve('@angular/localize');
118
- // The resolve call above will throw if not found
119
- polyfillPaths.push('@angular/localize/init');
120
- }
121
- catch { }
122
- }
123
- // Generate module contents with an import statement per defined polyfill
124
- let contents = polyfillPaths
125
- .map((file) => `import '${file.replace(/\\/g, '/')}';`)
126
- .join('\n');
127
- // If not inlining translations and source locale is defined, inject the locale specifier
128
- if (!options.i18nOptions.shouldInline && options.i18nOptions.hasDefinedSourceLocale) {
129
- contents += `(globalThis.$localize ??= {}).locale = "${options.i18nOptions.sourceLocale}";\n`;
130
- }
131
- return {
132
- contents,
133
- loader: 'js',
134
- resolveDir: workspaceRoot,
135
- };
136
- },
137
- }));
138
- }
139
54
  if (options.plugins) {
140
55
  buildOptions.plugins?.push(...options.plugins);
141
56
  }
142
57
  return buildOptions;
143
58
  }
144
59
  exports.createBrowserCodeBundleOptions = createBrowserCodeBundleOptions;
60
+ function createBrowserPolyfillBundleOptions(options, target, sourceFileCache) {
61
+ const namespace = 'angular:polyfills';
62
+ const polyfillBundleOptions = getEsBuildCommonPolyfillsOptions(options, namespace, true, sourceFileCache);
63
+ if (!polyfillBundleOptions) {
64
+ return;
65
+ }
66
+ const { outputNames, polyfills } = options;
67
+ const buildOptions = {
68
+ ...polyfillBundleOptions,
69
+ platform: 'browser',
70
+ // Note: `es2015` is needed for RxJS v6. If not specified, `module` would
71
+ // match and the ES5 distribution would be bundled and ends up breaking at
72
+ // runtime with the RxJS testing library.
73
+ // More details: https://github.com/angular/angular-cli/issues/25405.
74
+ mainFields: ['es2020', 'es2015', 'browser', 'module', 'main'],
75
+ entryNames: outputNames.bundles,
76
+ target,
77
+ entryPoints: {
78
+ 'polyfills': namespace,
79
+ },
80
+ };
81
+ // Only add the Angular TypeScript compiler if TypeScript files are provided in the polyfills
82
+ const hasTypeScriptEntries = polyfills?.some((entry) => /\.[cm]?tsx?$/.test(entry));
83
+ if (hasTypeScriptEntries) {
84
+ buildOptions.plugins ??= [];
85
+ const { pluginOptions, styleOptions } = (0, compiler_plugin_options_1.createCompilerPluginOptions)(options, target, sourceFileCache);
86
+ buildOptions.plugins.push((0, compiler_plugin_1.createCompilerPlugin)(
87
+ // JS/TS options
88
+ { ...pluginOptions, noopTypeScriptCompilation: true },
89
+ // Component stylesheet options are unused for polyfills but required by the plugin
90
+ styleOptions));
91
+ }
92
+ return buildOptions;
93
+ }
94
+ exports.createBrowserPolyfillBundleOptions = createBrowserPolyfillBundleOptions;
145
95
  /**
146
96
  * Create an esbuild 'build' options object for the server bundle.
147
97
  * @param options The builder's user-provider normalized options.
@@ -151,20 +101,19 @@ function createServerCodeBundleOptions(options, target, sourceFileCache) {
151
101
  const { jit, serverEntryPoint, workspaceRoot, ssrOptions, watch, externalPackages, prerenderOptions, } = options;
152
102
  (0, node_assert_1.default)(serverEntryPoint, 'createServerCodeBundleOptions should not be called without a defined serverEntryPoint.');
153
103
  const { pluginOptions, styleOptions } = (0, compiler_plugin_options_1.createCompilerPluginOptions)(options, target, sourceFileCache);
154
- const mainServerNamespace = 'angular:main-server';
155
- const ssrEntryNamespace = 'angular:ssr-entry';
104
+ const mainServerNamespace = 'angular:server-render-utils';
156
105
  const entryPoints = {
157
- 'main.server': mainServerNamespace,
106
+ 'render-utils.server': mainServerNamespace,
107
+ 'main.server': serverEntryPoint,
158
108
  };
159
109
  const ssrEntryPoint = ssrOptions?.entry;
160
110
  if (ssrEntryPoint) {
161
- entryPoints['server'] = ssrEntryNamespace;
111
+ entryPoints['server'] = ssrEntryPoint;
162
112
  }
163
113
  const buildOptions = {
164
114
  ...getEsBuildCommonOptions(options),
165
115
  platform: 'node',
166
- // TODO: Invesigate why enabling `splitting` in JIT mode causes an "'@angular/compiler' is not available" error.
167
- splitting: !jit,
116
+ splitting: true,
168
117
  outExtension: { '.js': '.mjs' },
169
118
  // Note: `es2015` is needed for RxJS v6. If not specified, `module` would
170
119
  // match and the ES5 distribution would be bundled and ends up breaking at
@@ -174,12 +123,7 @@ function createServerCodeBundleOptions(options, target, sourceFileCache) {
174
123
  entryNames: '[name]',
175
124
  target,
176
125
  banner: {
177
- // Note: Needed as esbuild does not provide require shims / proxy from ESModules.
178
- // See: https://github.com/evanw/esbuild/issues/1921.
179
- js: [
180
- `import { createRequire } from 'node:module';`,
181
- `globalThis['require'] ??= createRequire(import.meta.url);`,
182
- ].join('\n'),
126
+ js: `import './polyfills.server.mjs';`,
183
127
  },
184
128
  entryPoints,
185
129
  supported: (0, utils_1.getFeatureSupport)(target),
@@ -199,47 +143,17 @@ function createServerCodeBundleOptions(options, target, sourceFileCache) {
199
143
  else {
200
144
  buildOptions.plugins.push((0, rxjs_esm_resolution_plugin_1.createRxjsEsmResolutionPlugin)());
201
145
  }
202
- const polyfills = [];
203
- if (options.polyfills?.includes('zone.js')) {
204
- polyfills.push(`import 'zone.js/node';`);
205
- }
206
- if (jit) {
207
- polyfills.push(`import '@angular/compiler';`);
208
- }
209
- polyfills.push(`import '@angular/platform-server/init';`);
210
146
  buildOptions.plugins.push((0, virtual_module_plugin_1.createVirtualModulePlugin)({
211
147
  namespace: mainServerNamespace,
148
+ cache: sourceFileCache?.loadResultCache,
212
149
  loadContent: async () => {
213
- const mainServerEntryPoint = (0, node_path_1.relative)(workspaceRoot, serverEntryPoint).replace(/\\/g, '/');
214
150
  const contents = [
215
- ...polyfills,
216
- `import moduleOrBootstrapFn from './${mainServerEntryPoint}';`,
217
- `export default moduleOrBootstrapFn;`,
218
- `export * from './${mainServerEntryPoint}';`,
151
+ `export { ɵConsole } from '@angular/core';`,
219
152
  `export { renderApplication, renderModule, ɵSERVER_CONTEXT } from '@angular/platform-server';`,
220
153
  ];
221
154
  if (watch) {
222
155
  contents.push(`export { ɵresetCompiledComponents } from '@angular/core';`);
223
156
  }
224
- if (!options.i18nOptions.shouldInline) {
225
- // Cannot use `build.resolve` here since it does not allow overriding the external options
226
- // and the actual presence of the `@angular/localize` package needs to be checked here.
227
- const workspaceRequire = (0, node_module_1.createRequire)(workspaceRoot + '/');
228
- try {
229
- workspaceRequire.resolve('@angular/localize');
230
- // The resolve call above will throw if not found
231
- contents.push(`import '@angular/localize/init';`);
232
- }
233
- catch { }
234
- }
235
- if (options.i18nOptions.shouldInline) {
236
- // When inlining, a placeholder is used to allow the post-processing step to inject the $localize locale identifier
237
- contents.push('(globalThis.$localize ??= {}).locale = "___NG_LOCALE_INSERT___";');
238
- }
239
- else if (options.i18nOptions.hasDefinedSourceLocale) {
240
- // If not inlining translations and source locale is defined, inject the locale specifier
241
- contents.push(`(globalThis.$localize ??= {}).locale = "${options.i18nOptions.sourceLocale}";`);
242
- }
243
157
  if (prerenderOptions?.discoverRoutes) {
244
158
  // We do not import it directly so that node.js modules are resolved using the correct context.
245
159
  const routesExtractorCode = await (0, promises_1.readFile)((0, node_path_1.join)(__dirname, '../../utils/routes-extractor/extractor.js'), 'utf-8');
@@ -253,29 +167,81 @@ function createServerCodeBundleOptions(options, target, sourceFileCache) {
253
167
  };
254
168
  },
255
169
  }));
256
- if (ssrEntryPoint) {
257
- buildOptions.plugins.push((0, virtual_module_plugin_1.createVirtualModulePlugin)({
258
- namespace: ssrEntryNamespace,
259
- loadContent: () => {
260
- const serverEntryPoint = (0, node_path_1.relative)(workspaceRoot, ssrEntryPoint).replace(/\\/g, '/');
261
- return {
262
- contents: [
263
- ...polyfills,
264
- `import './${serverEntryPoint}';`,
265
- `export * from './${serverEntryPoint}';`,
266
- ].join('\n'),
267
- loader: 'js',
268
- resolveDir: workspaceRoot,
269
- };
270
- },
271
- }));
272
- }
273
170
  if (options.plugins) {
274
171
  buildOptions.plugins.push(...options.plugins);
275
172
  }
276
173
  return buildOptions;
277
174
  }
278
175
  exports.createServerCodeBundleOptions = createServerCodeBundleOptions;
176
+ function createServerPolyfillBundleOptions(options, target, sourceFileCache) {
177
+ const polyfills = [];
178
+ const zoneFlagsNamespace = 'angular:zone-flags/placeholder';
179
+ const polyfillsFromConfig = new Set(options.polyfills);
180
+ let hasZoneJs = false;
181
+ if (polyfillsFromConfig.has('zone.js')) {
182
+ hasZoneJs = true;
183
+ polyfills.push(zoneFlagsNamespace, 'zone.js/node');
184
+ }
185
+ if (polyfillsFromConfig.has('@angular/localize') ||
186
+ polyfillsFromConfig.has('@angular/localize/init')) {
187
+ polyfills.push('@angular/localize/init');
188
+ }
189
+ polyfills.push('@angular/platform-server/init');
190
+ const namespace = 'angular:polyfills-server';
191
+ const polyfillBundleOptions = getEsBuildCommonPolyfillsOptions({
192
+ ...options,
193
+ polyfills,
194
+ }, namespace, false, sourceFileCache);
195
+ if (!polyfillBundleOptions) {
196
+ return;
197
+ }
198
+ const { workspaceRoot, jit, sourcemapOptions, advancedOptimizations } = options;
199
+ const buildOptions = {
200
+ ...polyfillBundleOptions,
201
+ platform: 'node',
202
+ outExtension: { '.js': '.mjs' },
203
+ // Note: `es2015` is needed for RxJS v6. If not specified, `module` would
204
+ // match and the ES5 distribution would be bundled and ends up breaking at
205
+ // runtime with the RxJS testing library.
206
+ // More details: https://github.com/angular/angular-cli/issues/25405.
207
+ mainFields: ['es2020', 'es2015', 'module', 'main'],
208
+ entryNames: '[name]',
209
+ banner: {
210
+ js: [
211
+ // Note: Needed as esbuild does not provide require shims / proxy from ESModules.
212
+ // See: https://github.com/evanw/esbuild/issues/1921.
213
+ `import { createRequire } from 'node:module';`,
214
+ `globalThis['require'] ??= createRequire(import.meta.url);`,
215
+ ].join('\n'),
216
+ },
217
+ target,
218
+ entryPoints: {
219
+ 'polyfills.server': namespace,
220
+ },
221
+ };
222
+ buildOptions.plugins ??= [];
223
+ // Disable Zone.js uncaught promise rejections to provide cleaner stacktraces.
224
+ if (hasZoneJs) {
225
+ buildOptions.plugins.unshift((0, virtual_module_plugin_1.createVirtualModulePlugin)({
226
+ namespace: zoneFlagsNamespace,
227
+ entryPointOnly: false,
228
+ loadContent: () => ({
229
+ contents: `globalThis.__zone_symbol__DISABLE_WRAPPING_UNCAUGHT_PROMISE_REJECTION = true;`,
230
+ loader: 'js',
231
+ resolveDir: workspaceRoot,
232
+ }),
233
+ }));
234
+ }
235
+ buildOptions.plugins.push((0, rxjs_esm_resolution_plugin_1.createRxjsEsmResolutionPlugin)(), (0, javascript_transfomer_plugin_1.createJavaScriptTransformerPlugin)({
236
+ jit,
237
+ sourcemap: !!sourcemapOptions.scripts,
238
+ babelFileCache: sourceFileCache?.babelFileCache,
239
+ advancedOptimizations,
240
+ maxWorkers: 1,
241
+ }));
242
+ return buildOptions;
243
+ }
244
+ exports.createServerPolyfillBundleOptions = createServerPolyfillBundleOptions;
279
245
  function getEsBuildCommonOptions(options) {
280
246
  const { workspaceRoot, outExtension, optimizationOptions, sourcemapOptions, tsconfig, externalDependencies, outputNames, preserveSymlinks, jit, } = options;
281
247
  // Ensure unique hashes for i18n translation changes when using post-process inlining.
@@ -322,4 +288,97 @@ function getEsBuildCommonOptions(options) {
322
288
  publicPath: options.publicPath,
323
289
  };
324
290
  }
325
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXBwbGljYXRpb24tY29kZS1idW5kbGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9hbmd1bGFyX2RldmtpdC9idWlsZF9hbmd1bGFyL3NyYy90b29scy9lc2J1aWxkL2FwcGxpY2F0aW9uLWNvZGUtYnVuZGxlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQTs7Ozs7O0dBTUc7Ozs7OztBQUdILDhEQUFpQztBQUNqQyw2Q0FBeUM7QUFDekMsK0NBQTRDO0FBQzVDLDZDQUE0QztBQUM1Qyx5Q0FBb0Q7QUFFcEQseUVBQThEO0FBQzlELCtEQUFpRTtBQUVqRSx1RUFBd0U7QUFDeEUsNkRBQXFFO0FBQ3JFLDZFQUE2RTtBQUM3RSwrRUFBZ0Y7QUFDaEYsbUNBQTRDO0FBQzVDLG1FQUFvRTtBQUVwRSxTQUFnQiw4QkFBOEIsQ0FDNUMsT0FBMEMsRUFDMUMsTUFBZ0IsRUFDaEIsZUFBaUM7SUFFakMsTUFBTSxFQUFFLGFBQWEsRUFBRSxXQUFXLEVBQUUsV0FBVyxFQUFFLEdBQUcsRUFBRSxHQUFHLE9BQU8sQ0FBQztJQUVqRSxNQUFNLEVBQUUsYUFBYSxFQUFFLFlBQVksRUFBRSxHQUFHLElBQUEscURBQTJCLEVBQ2pFLE9BQU8sRUFDUCxNQUFNLEVBQ04sZUFBZSxDQUNoQixDQUFDO0lBRUYsTUFBTSxZQUFZLEdBQWlCO1FBQ2pDLEdBQUcsdUJBQXVCLENBQUMsT0FBTyxDQUFDO1FBQ25DLFFBQVEsRUFBRSxTQUFTO1FBQ25CLHlFQUF5RTtRQUN6RSwwRUFBMEU7UUFDMUUseUNBQXlDO1FBQ3pDLHFFQUFxRTtRQUNyRSxVQUFVLEVBQUUsQ0FBQyxRQUFRLEVBQUUsUUFBUSxFQUFFLFNBQVMsRUFBRSxRQUFRLEVBQUUsTUFBTSxDQUFDO1FBQzdELFVBQVUsRUFBRSxXQUFXLENBQUMsT0FBTztRQUMvQixXQUFXO1FBQ1gsTUFBTTtRQUNOLFNBQVMsRUFBRSxJQUFBLHlCQUFpQixF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Q0FBQyxDQUFDLENBQUMsRUFBRSxXQUFXLEVBQUUsT0FBTyxFQUFFLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQztZQUN2RSxXQUFXLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLE9BQU87U0FDcEM7UUFDRCxNQUFNO1FBQ04sVUFBVSxFQUFFLE9BQU8sQ0FBQyxVQUFVO0tBQy9CLENBQUM7QUFDSixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IEdvb2dsZSBMTEMgQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqXG4gKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZVxuICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZVxuICovXG5cbmltcG9ydCB0eXBlIHsgQnVpbGRPcHRpb25zIH0gZnJvbSAnZXNidWlsZCc7XG5pbXBvcnQgYXNzZXJ0IGZyb20gJ25vZGU6YXNzZXJ0JztcbmltcG9ydCB7IGNyZWF0ZUhhc2ggfSBmcm9tICdub2RlOmNyeXB0byc7XG5pbXBvcnQgeyByZWFkRmlsZSB9IGZyb20gJ25vZGU6ZnMvcHJvbWlzZXMnO1xuaW1wb3J0IHsgY3JlYXRlUmVxdWlyZSB9IGZyb20gJ25vZGU6bW9kdWxlJztcbmltcG9ydCB7IGV4dG5hbWUsIGpvaW4sIHJlbGF0aXZlIH0gZnJvbSAnbm9kZTpwYXRoJztcbmltcG9ydCB0eXBlIHsgTm9ybWFsaXplZEFwcGxpY2F0aW9uQnVpbGRPcHRpb25zIH0gZnJvbSAnLi4vLi4vYnVpbGRlcnMvYXBwbGljYXRpb24vb3B0aW9ucyc7XG5pbXBvcnQgeyBhbGxvd01hbmdsZSB9IGZyb20gJy4uLy4uL3V0aWxzL2Vudmlyb25tZW50LW9wdGlvbnMnO1xuaW1wb3J0IHsgY3JlYXRlQ29tcGlsZXJQbHVnaW4gfSBmcm9tICcuL2FuZ3VsYXIvY29tcGlsZXItcGx1Z2luJztcbmltcG9ydCB7IFNvdXJjZUZpbGVDYWNoZSB9IGZyb20gJy4vYW5ndWxhci9zb3VyY2UtZmlsZS1jYWNoZSc7XG5pbXBvcnQgeyBjcmVhdGVDb21waWxlclBsdWdpbk9wdGlvbnMgfSBmcm9tICcuL2NvbXBpbGVyLXBsdWdpbi1vcHRpb25zJztcbmltcG9ydCB7IGNyZWF0ZUFuZ3VsYXJMb2NhbGVEYXRhUGx1Z2luIH0gZnJvbSAnLi9pMThuLWxvY2FsZS1wbHVnaW4nO1xuaW1wb3J0IHsgY3JlYXRlUnhqc0VzbVJlc29sdXRpb25QbHVnaW4gfSBmcm9tICcuL3J4anMtZXNtLXJlc29sdXRpb24tcGx1Z2luJztcbmltcG9ydCB7IGNyZWF0ZVNvdXJjZW1hcElnbm9yZWxpc3RQbHVnaW4gfSBmcm9tICcuL3NvdXJjZW1hcC1pZ25vcmVsaXN0LXBsdWdpbic7XG5pbXBvcnQgeyBnZXRGZWF0dXJlU3VwcG9ydCB9IGZyb20gJy4vdXRpbHMnO1xuaW1wb3J0IHsgY3JlYXRlVmlydHVhbE1vZHVsZVBsdWdpbiB9IGZyb20gJy4vdmlydHVhbC1tb2R1bGUtcGx1Z2luJztcblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUJyb3dzZXJDb2RlQnVuZGxlT3B0aW9ucyhcbiAgb3B0aW9uczogTm9ybWFsaXplZEFwcGxpY2F0aW9uQnVpbGRPcHRpb25zLFxuICB0YXJnZXQ6IHN0cmluZ1tdLFxuICBzb3VyY2VGaWxlQ2FjaGU/OiBTb3VyY2VGaWxlQ2FjaGUsXG4pOiBCdWlsZE9wdGlvbnMge1xuICBjb25zdCB7IHdvcmtzcGFjZVJvb3QsIGVudHJ5UG9pbnRzLCBvdXRwdXROYW1lcywgaml0IH0gPSBvcHRpb25zO1xuXG4gIGNvbnN0IHsgcGx1Z2luT3B0aW9ucywgc3R5bGVPcHRpb25zIH0gPSBjcmVhdGVDb21waWxlclBsdWdpbk9wdGlvbnMoXG4gICAgb3B0aW9ucyxcbiAgICB0YXJnZXQsXG4gICAgc291cmNlRmlsZUNhY2hlLFxuICApO1xuXG4gIGNvbnN0IGJ1aWxkT3B0aW9uczogQnVpbGRPcHRpb25zID0ge1xuICAgIC4uLmdldEVzQnVpbGRDb21tb25PcHRpb25zKG9wdGlvbnMpLFxuICAgIHBsYXRmb3JtOiAnYnJvd3NlcicsXG4gICAgLy8gTm90ZTogYGVzMjAxNWAgaXMgbmVlZGVkIGZvciBSeEpTIHY2LiBJZiBub3Qgc3BlY2lmaWVkLCBgbW9kdWxlYCB3b3VsZFxuICAgIC8vIG1hdGNoIGFuZCB0aGUgRVM1IGRpc3RyaWJ1dGlvbiB3b3VsZCBiZSBidW5kbGVkIGFuZCBlbmRzIHVwIGJyZWFraW5nIGF0XG4gICAgLy8gcnVudGltZSB3aXRoIHRoZSBSeEpTIHRlc3RpbmcgbGlicmFyeS5cbiAgICAvLyBNb3JlIGRldGFpbHM6IGh0dHBzOi8vZ2l0aHViLmNvbS9hbmd1bGFyL2FuZ3VsYXItY2xpL2lzc3Vlcy8yNTQwNS5cbiAgICBtYWluRmllbGRzOiBbJ2VzMjAyMCcsICdlczIwMTUnLCAnYnJvd3NlcicsICdtb2R1bGUnLCAnbWFpbiddLFxuICAgIGVudHJ5TmFtZXM6IG91dHB1dE5hbWVzLmJ1bmRsZXMsXG4gICAgZW50cnlQb2ludHMsXG4gICAgdGFyZ2V0LFxuICAgIHN1cHBvcnRlZDogZ2V0RmVhdHVyZVN1cHBvcnQodGFyZ2V0KSxcbiAgICBwbHVnaW5zOiBbXG4gICAgICBjcmVhdGVTb3VyY2VtYXBJZ25vcmVsaXN0UGx1Z2luKCksXG4gICAgICBjcmVhdGVDb21waWxlclBsdWdpbihcbiAgICAgICAgLy8gSlMvVFMgb3B0aW9uc1xuICAgICAgICBwbHVnaW5PcHRpb25zLFxuICAgICAgICAvLyBDb21wb25lbnQgc3R5bGVzaGVldCBvcHRpb25zXG4gICAgICAgIHN0eWxlT3B0aW9ucyxcbiAgICAgICksXG4gICAgXSxcbiAgfTtcblxuICBpZiAob3B0aW9ucy5leHRlcm5hbFBhY2thZ2VzKSB7XG4gICAgYnVpbGRPcHRpb25zLnBhY2thZ2VzID0gJ2V4dGVybmFsJztcbiAgfVxuXG4gIGNvbnN0IHBvbHlmaWxscyA9IG9wdGlvbnMucG9seWZpbGxzID8gWy4uLm9wdGlvbnMucG9seWZpbGxzXSA6IFtdO1xuXG4gIC8vIEFuZ3VsYXIgSklUIG1vZGUgcmVxdWlyZXMgdGhlIHJ1bnRpbWUgY29tcGlsZXJcbiAgaWYgKGppdCkge1xuICAgIHBvbHlmaWxscy5wdXNoKCdAYW5ndWxhci9jb21waWxlcicpO1xuICB9XG5cbiAgLy8gQWRkIEFuZ3VsYXIncyBnbG9iYWwgbG9jYWxlIGRhdGEgaWYgaTE4biBvcHRpb25zIGFyZSBwcmVzZW50LlxuICAvLyBMb2NhbGUgZGF0YSBzaG91bGQgZ28gZmlyc3Qgc28gdGhhdCBwcm9qZWN0IHByb3ZpZGVkIHBvbHlmaWxsIGNvZGUgY2FuIGF1Z21lbnQgaWYgbmVlZGVkLlxuICBsZXQgbmVlZExvY2FsZURhdGFQbHVnaW4gPSBmYWxzZTtcbiAgaWYgKG9wdGlvbnMuaTE4bk9wdGlvbnMuc2hvdWxkSW5saW5lKSB7XG4gICAgLy8gV2hlbiBpbmxpbmluZywgYSBwbGFjZWhvbGRlciBpcyB1c2VkIHRvIGFsbG93IHRoZSBwb3N0LXByb2Nlc3Npbmcgc3RlcCB0byBpbmplY3QgdGhlICRsb2NhbGl6ZSBsb2NhbGUgaWRlbnRpZmllclxuICAgIHBvbHlmaWxscy51bnNoaWZ0KCdhbmd1bGFyOmxvY2FsZS9wbGFjZWhvbGRlcicpO1xuICAgIGJ1aWxkT3B0aW9ucy5wbHVnaW5zPy51bnNoaWZ0KFxuICAgICAgY3JlYXRlVmlydHVhbE1vZHVsZVBsdWdpbih7XG4gICAgICAgIG5hbWVzcGFjZTogJ2FuZ3VsYXI6bG9jYWxlL3BsYWNlaG9sZGVyJyxcbiAgICAgICAgZW50cnlQb2ludE9ubHk6IGZhbHNlLFxuICAgICAgICBsb2FkQ29udGVudDogKCkgPT4gKHtcbiAgICAgICAgICBjb250ZW50czogYChnbG9iYWxUaGlzLiRsb2NhbGl6ZSA/Pz0ge30pLmxvY2FsZSA9IFwiX19fTkdfTE9DQUxFX0lOU0VSVF9fX1wiO1xcbmAsXG4gICAgICAgICAgbG9hZGVyOiAnanMnLFxuICAgICAgICAgIHJlc29sdmVEaXI6IHdvcmtzcGFjZVJvb3QsXG4gICAgICAgIH0pLFxuICAgICAgfSksXG4gICAgKTtcblxuICAgIC8vIEFkZCBsb2NhbGUgZGF0YSBmb3IgYWxsIGFjdGl2ZSBsb2NhbGVzXG4gICAgLy8gVE9ETzogSW5qZWN0IGVhY2ggaW5kaXZpZHVhbGx5IHdpdGhpbiB0aGUgaW5saW5pbmcgcHJvY2VzcyBpdHNlbGZcbiAgICBmb3IgKGNvbnN0IGxvY2FsZSBvZiBvcHRpb25zLmkxOG5PcHRpb25zLmlubGluZUxvY2FsZXMpIHtcbiAgICAgIHBvbHlmaWxscy51bnNoaWZ0KGBhbmd1bGFyOmxvY2FsZS9kYXRhOiR7bG9jYWxlfWApO1xuICAgIH1cbiAgICBuZWVkTG9jYWxlRGF0YVBsdWdpbiA9IHRydWU7XG4gIH0gZWxzZSBpZiAob3B0aW9ucy5pMThuT3B0aW9ucy5oYXNEZWZpbmVkU291cmNlTG9jYWxlKSB7XG4gICAgLy8gV2hlbiBub3QgaW5saW5pbmcgYW5kIGEgc291cmNlIGxvY2FsIGlzIHByZXNlbnQsIHVzZSB0aGUgc291cmNlIGxvY2FsZSBkYXRhIGRpcmVjdGx5XG4gICAgcG9seWZpbGxzLnVuc2hpZnQoYGFuZ3VsYXI6bG9jYWxlL2RhdGE6JHtvcHRpb25zLmkxOG5PcHRpb25zLnNvdXJjZUxvY2FsZX1gKTtcbiAgICBuZWVkTG9jYWxlRGF0YVBsdWdpbiA9IHRydWU7XG4gIH1cbiAgaWYgKG5lZWRMb2NhbGVEYXRhUGx1Z2luKSB7XG4gICAgYnVpbGRPcHRpb25zLnBsdWdpbnM/LnB1c2goY3JlYXRlQW5ndWxhckxvY2FsZURhdGFQbHVnaW4oKSk7XG4gIH1cblxuICAvLyBBZGQgcG9seWZpbGwgZW50cnkgcG9pbnQgaWYgcG9seWZpbGxzIGFyZSBwcmVzZW50XG4gIGlmIChwb2x5ZmlsbHMubGVuZ3RoKSB7XG4gICAgY29uc3QgbmFtZXNwYWNlID0gJ2FuZ3VsYXI6cG9seWZpbGxzJztcbiAgICBidWlsZE9wdGlvbnMuZW50cnlQb2ludHMgPSB7XG4gICAgICAuLi5idWlsZE9wdGlvbnMuZW50cnlQb2ludHMsXG4gICAgICAncG9seWZpbGxzJzogbmFtZXNwYWNlLFxuICAgIH07XG5cbiAgICBidWlsZE9wdGlvbnMucGx1Z2lucz8udW5zaGlmdChcbiAgICAgIGNyZWF0ZVZpcnR1YWxNb2R1bGVQbHVnaW4oe1xuICAgICAgICBuYW1lc3BhY2UsXG4gICAgICAgIGxvYWRDb250ZW50OiBhc3luYyAoXywgYnVpbGQpID0+IHtcbiAgICAgICAgICBsZXQgaGFzTG9jYWxpemVQb2x5ZmlsbCA9IGZhbHNlO1xuICAgICAgICAgIGNvbnN0IHBvbHlmaWxsUGF0aHMgPSBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgICAgICAgIHBvbHlmaWxscy5tYXAoYXN5bmMgKHBhdGgpID0+IHtcbiAgICAgICAgICAgICAgaGFzTG9jYWxpemVQb2x5ZmlsbCB8fD0gcGF0aC5zdGFydHNXaXRoKCdAYW5ndWxhci9sb2NhbGl6ZScpO1xuXG4gICAgICAgICAgICAgIGlmIChwYXRoLnN0YXJ0c1dpdGgoJ3pvbmUuanMnKSB8fCAhZXh0bmFtZShwYXRoKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBwYXRoO1xuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgY29uc3QgcG90ZW50aWFsUGF0aFJlbGF0aXZlID0gJy4vJyArIHBhdGg7XG4gICAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGJ1aWxkLnJlc29sdmUocG90ZW50aWFsUGF0aFJlbGF0aXZlLCB7XG4gICAgICAgICAgICAgICAga2luZDogJ2ltcG9ydC1zdGF0ZW1lbnQnLFxuICAgICAgICAgICAgICAgIHJlc29sdmVEaXI6IHdvcmtzcGFjZVJvb3QsXG4gICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgIHJldHVybiByZXN1bHQucGF0aCA/IHBvdGVudGlhbFBhdGhSZWxhdGl2ZSA6IHBhdGg7XG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICApO1xuXG4gICAgICAgICAgaWYgKCFvcHRpb25zLmkxOG5PcHRpb25zLnNob3VsZElubGluZSAmJiAhaGFzTG9jYWxpemVQb2x5ZmlsbCkge1xuICAgICAgICAgICAgLy8gQ2Fubm90IHVzZSBgYnVpbGQucmVzb2x2ZWAgaGVyZSBzaW5jZSBpdCBkb2VzIG5vdCBhbGxvdyBvdmVycmlkaW5nIHRoZSBleHRlcm5hbCBvcHRpb25zXG4gICAgICAgICAgICAvLyBhbmQgdGhlIGFjdHVhbCBwcmVzZW5jZSBvZiB0aGUgYEBhbmd1bGFyL2xvY2FsaXplYCBwYWNrYWdlIG5lZWRzIHRvIGJlIGNoZWNrZWQgaGVyZS5cbiAgICAgICAgICAgIGNvbnN0IHdvcmtzcGFjZVJlcXVpcmUgPSBjcmVhdGVSZXF1aXJlKHdvcmtzcGFjZVJvb3QgKyAnLycpO1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgd29ya3NwYWNlUmVxdWlyZS5yZXNvbHZlKCdAYW5ndWxhci9sb2NhbGl6ZScpO1xuICAgICAgICAgICAgICAvLyBUaGUgcmVzb2x2ZSBjYWxsIGFib3ZlIHdpbGwgdGhyb3cgaWYgbm90IGZvdW5kXG4gICAgICAgICAgICAgIHBvbHlmaWxsUGF0aHMucHVzaCgnQGFuZ3VsYXIvbG9jYWxpemUvaW5pdCcpO1xuICAgICAgICAgICAgfSBjYXRjaCB7fVxuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIEdlbmVyYXRlIG1vZHVsZSBjb250ZW50cyB3aXRoIGFuIGltcG9ydCBzdGF0ZW1lbnQgcGVyIGRlZmluZWQgcG9seWZpbGxcbiAgICAgICAgICBsZXQgY29udGVudHMgPSBwb2x5ZmlsbFBhdGhzXG4gICAgICAgICAgICAubWFwKChmaWxlKSA9PiBgaW1wb3J0ICcke2ZpbGUucmVwbGFjZSgvXFxcXC9nLCAnLycpfSc7YClcbiAgICAgICAgICAgIC5qb2luKCdcXG4nKTtcblxuICAgICAgICAgIC8vIElmIG5vdCBpbmxpbmluZyB0cmFuc2xhdGlvbnMgYW5kIHNvdXJjZSBsb2NhbGUgaXMgZGVmaW5lZCwgaW5qZWN0IHRoZSBsb2NhbGUgc3BlY2lmaWVyXG4gICAgICAgICAgaWYgKCFvcHRpb25zLmkxOG5PcHRpb25zLnNob3VsZElubGluZSAmJiBvcHRpb25zLmkxOG5PcHRpb25zLmhhc0RlZmluZWRTb3VyY2VMb2NhbGUpIHtcbiAgICAgICAgICAgIGNvbnRlbnRzICs9IGAoZ2xvYmFsVGhpcy4kbG9jYWxpemUgPz89IHt9KS5sb2NhbGUgPSBcIiR7b3B0aW9ucy5pMThuT3B0aW9ucy5zb3VyY2VMb2NhbGV9XCI7XFxuYDtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgY29udGVudHMsXG4gICAgICAgICAgICBsb2FkZXI6ICdqcycsXG4gICAgICAgICAgICByZXNvbHZlRGlyOiB3b3Jrc3BhY2VSb290LFxuICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICB9KSxcbiAgICApO1xuICB9XG5cbiAgaWYgKG9wdGlvbnMucGx1Z2lucykge1xuICAgIGJ1aWxkT3B0aW9ucy5wbHVnaW5zPy5wdXNoKC4uLm9wdGlvbnMucGx1Z2lucyk7XG4gIH1cblxuICByZXR1cm4gYnVpbGRPcHRpb25zO1xufVxuXG4vKipcbiAqIENyZWF0ZSBhbiBlc2J1aWxkICdidWlsZCcgb3B0aW9ucyBvYmplY3QgZm9yIHRoZSBzZXJ2ZXIgYnVuZGxlLlxuICogQHBhcmFtIG9wdGlvbnMgVGhlIGJ1aWxkZXIncyB1c2VyLXByb3ZpZGVyIG5vcm1hbGl6ZWQgb3B0aW9ucy5cbiAqIEByZXR1cm5zIEFuIGVzYnVpbGQgQnVpbGRPcHRpb25zIG9iamVjdC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVNlcnZlckNvZGVCdW5kbGVPcHRpb25zKFxuICBvcHRpb25zOiBOb3JtYWxpemVkQXBwbGljYXRpb25CdWlsZE9wdGlvbnMsXG4gIHRhcmdldDogc3RyaW5nW10sXG4gIHNvdXJjZUZpbGVDYWNoZTogU291cmNlRmlsZUNhY2hlLFxuKTogQnVpbGRPcHRpb25zIHtcbiAgY29uc3Qge1xuICAgIGppdCxcbiAgICBzZXJ2ZXJFbnRyeVBvaW50LFxuICAgIHdvcmtzcGFjZVJvb3QsXG4gICAgc3NyT3B0aW9ucyxcbiAgICB3YXRjaCxcbiAgICBleHRlcm5hbFBhY2thZ2VzLFxuICAgIHByZXJlbmRlck9wdGlvbnMsXG4gIH0gPSBvcHRpb25zO1xuXG4gIGFzc2VydChcbiAgICBzZXJ2ZXJFbnRyeVBvaW50LFxuICAgICdjcmVhdGVTZXJ2ZXJDb2RlQnVuZGxlT3B0aW9ucyBzaG91bGQgbm90IGJlIGNhbGxlZCB3aXRob3V0IGEgZGVmaW5lZCBzZXJ2ZXJFbnRyeVBvaW50LicsXG4gICk7XG5cbiAgY29uc3QgeyBwbHVnaW5PcHRpb25zLCBzdHlsZU9wdGlvbnMgfSA9IGNyZWF0ZUNvbXBpbGVyUGx1Z2luT3B0aW9ucyhcbiAgICBvcHRpb25zLFxuICAgIHRhcmdldCxcbiAgICBzb3VyY2VGaWxlQ2FjaGUsXG4gICk7XG5cbiAgY29uc3QgbWFpblNlcnZlck5hbWVzcGFjZSA9ICdhbmd1bGFyOm1haW4tc2VydmVyJztcbiAgY29uc3Qgc3NyRW50cnlOYW1lc3BhY2UgPSAnYW5ndWxhcjpzc3ItZW50cnknO1xuXG4gIGNvbnN0IGVudHJ5UG9pbnRzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge1xuICAgICdtYWluLnNlcnZlcic6IG1haW5TZXJ2ZXJOYW1lc3BhY2UsXG4gIH07XG5cbiAgY29uc3Qgc3NyRW50cnlQb2ludCA9IHNzck9wdGlvbnM/LmVudHJ5O1xuICBpZiAoc3NyRW50cnlQb2ludCkge1xuICAgIGVudHJ5UG9pbnRzWydzZXJ2ZXInXSA9IHNzckVudHJ5TmFtZXNwYWNlO1xuICB9XG5cbiAgY29uc3QgYnVpbGRPcHRpb25zOiBCdWlsZE9wdGlvbnMgPSB7XG4gICAgLi4uZ2V0RXNCdWlsZENvbW1vbk9wdGlvbnMob3B0aW9ucyksXG4gICAgcGxhdGZvcm06ICdub2RlJyxcbiAgICAvLyBUT0RPOiBJbnZlc2lnYXRlIHdoeSBlbmFibGluZyBgc3BsaXR0aW5nYCBpbiBKSVQgbW9kZSBjYXVzZXMgYW4gXCInQGFuZ3VsYXIvY29tcGlsZXInIGlzIG5vdCBhdmFpbGFibGVcIiBlcnJvci5cbiAgICBzcGxpdHRpbmc6ICFqaXQsXG4gICAgb3V0RXh0ZW5zaW9uOiB7ICcuanMnOiAnLm1qcycgfSxcbiAgICAvLyBOb3RlOiBgZXMyMDE1YCBpcyBuZWVkZWQgZm9yIFJ4SlMgdjYuIElmIG5vdCBzcGVjaWZpZWQsIGBtb2R1bGVgIHdvdWxkXG4gICAgLy8gbWF0Y2ggYW5kIHRoZSBFUzUgZGlzdHJpYnV0aW9uIHdvdWxkIGJlIGJ1bmRsZWQgYW5kIGVuZHMgdXAgYnJlYWtpbmcgYXRcbiAgICAvLyBydW50aW1lIHdpdGggdGhlIFJ4SlMgdGVzdGluZyBsaWJyYXJ5LlxuICAgIC8vIE1vcmUgZGV0YWlsczogaHR0cHM6Ly9naXRodWIuY29tL2FuZ3VsYXIvYW5ndWxhci1jbGkvaXNzdWVzLzI1NDA1LlxuICAgIG1haW5GaWVsZHM6IFsnZXMyMDIwJywgJ2VzMjAxNScsICdtb2R1bGUnLCAnbWFpbiddLFxuICAgIGVudHJ5TmFtZXM6ICdbbmFtZV0nLFxuICAgIHRhcmdldCxcbiAgICBiYW5uZXI6IHtcbiAgICAgIC8vIE5vdGU6IE5lZWRlZCBhcyBlc2J1aWxkIGRvZXMgbm90IHByb3ZpZGUgcmVxdWlyZSBzaGltcyAvIHByb3h5IGZyb20gRVNNb2R1bGVzLlxuICAgICAgLy8gU2VlOiBodHRwczovL2dpdGh1Yi5jb20vZXZhbncvZXNidWlsZC9pc3N1ZXMvMTkyMS5cbiAgICAgIGpzOiBbXG4gICAgICAgIGBpbXBvcnQgeyBjcmVhdGVSZXF1aXJlIH0gZnJvbSAnbm9kZTptb2R1bGUnO2AsXG4gICAgICAgIGBnbG9iYWxUaGlzWydyZXF1aXJlJ10gPz89IGNyZWF0ZVJlcXVpcmUoaW1wb3J0Lm1ldGEudXJsKTtgLFxuICAgICAgXS5qb2luKCdcXG4nKSxcbiAgICB9LFxuICAgIGVudHJ5UG9pbnRzLFxuICAgIHN1cHBvcnRlZDogZ2V0RmVhdHVyZVN1cHBvcnQodGFyZ2V0KSxcbiAgICBwbHVnaW5zOiBbXG4gICAgICBjcmVhdGVTb3VyY2VtYXBJZ25vcmVsaXN0UGx1Z2luKCksXG4gICAgICBjcmVhdGVDb21waWxlclBsdWdpbihcbiAgICAgICAgLy8gSlMvVFMgb3B0aW9uc1xuICAgICAgICB7IC4uLnBsdWdpbk9wdGlvbnMsIG5vb3BUeXBlU2NyaXB0Q29tcGlsYXRpb246IHRydWUgfSxcbiAgICAgICAgLy8gQ29tcG9uZW50IHN0eWxlc2hlZXQgb3B0aW9uc1xuICAgICAgICBzdHlsZU9wdGlvbnMsXG4gICAgICApLFxuICAgIF0sXG4gIH07XG5cbiAgYnVpbGRPcHRpb25zLnBsdWdpbnMgPz89IFtdO1xuICBpZiAoZXh0ZXJuYWxQYWNrYWdlcykge1xuICAgIGJ1aWxkT3B0aW9ucy5wYWNrYWdlcyA9ICdleHRlcm5hbCc7XG4gIH0gZWxzZSB7XG4gICAgYnVpbGRPcHRpb25zLnBsdWdpbnMucHVzaChjcmVhdGVSeGpzRXNtUmVzb2x1dGlvblBsdWdpbigpKTtcbiAgfVxuXG4gIGNvbnN0IHBvbHlmaWxsczogc3RyaW5nW10gPSBbXTtcbiAgaWYgKG9wdGlvbnMucG9seWZpbGxzPy5pbmNsdWRlcygnem9uZS5qcycpKSB7XG4gICAgcG9seWZpbGxzLnB1c2goYGltcG9ydCAnem9uZS5qcy9ub2RlJztgKTtcbiAgfVxuXG4gIGlmIChqaXQpIHtcbiAgICBwb2x5ZmlsbHMucHVzaChgaW1wb3J0ICdAYW5ndWxhci9jb21waWxlcic7YCk7XG4gIH1cblxuICBwb2x5ZmlsbHMucHVzaChgaW1wb3J0ICdAYW5ndWxhci9wbGF0Zm9ybS1zZXJ2ZXIvaW5pdCc7YCk7XG5cbiAgYnVpbGRPcHRpb25zLnBsdWdpbnMucHVzaChcbiAgICBjcmVhdGVWaXJ0dWFsTW9kdWxlUGx1Z2luKHtcbiAgICAgIG5hbWVzcGFjZTogbWFpblNlcnZlck5hbWVzcGFjZSxcbiAgICAgIGxvYWRDb250ZW50OiBhc3luYyAoKSA9PiB7XG4gICAgICAgIGNvbnN0IG1haW5TZXJ2ZXJFbnRyeVBvaW50ID0gcmVsYXRpdmUod29ya3NwYWNlUm9vdCwgc2VydmVyRW50cnlQb2ludCkucmVwbGFjZSgvXFxcXC9nLCAnLycpO1xuXG4gICAgICAgIGNvbnN0IGNvbnRlbnRzID0gW1xuICAgICAgICAgIC4uLnBvbHlmaWxscyxcbiAgICAgICAgICBgaW1wb3J0IG1vZHVsZU9yQm9vdHN0cmFwRm4gZnJvbSAnLi8ke21haW5TZXJ2ZXJFbnRyeVBvaW50fSc7YCxcbiAgICAgICAgICBgZXhwb3J0IGRlZmF1bHQgbW9kdWxlT3JCb290c3RyYXBGbjtgLFxuICAgICAgICAgIGBleHBvcnQgKiBmcm9tICcuLyR7bWFpblNlcnZlckVudHJ5UG9pbnR9JztgLFxuICAgICAgICAgIGBleHBvcnQgeyByZW5kZXJBcHBsaWNhdGlvbiwgcmVuZGVyTW9kdWxlLCDJtVNFUlZFUl9DT05URVhUIH0gZnJvbSAnQGFuZ3VsYXIvcGxhdGZvcm0tc2VydmVyJztgLFxuICAgICAgICBdO1xuXG4gICAgICAgIGlmICh3YXRjaCkge1xuICAgICAgICAgIGNvbnRlbnRzLnB1c2goYGV4cG9ydCB7IMm1cmVzZXRDb21waWxlZENvbXBvbmVudHMgfSBmcm9tICdAYW5ndWxhci9jb3JlJztgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghb3B0aW9ucy5pMThuT3B0aW9ucy5zaG91bGRJbmxpbmUpIHtcbiAgICAgICAgICAvLyBDYW5ub3QgdXNlIGBidWlsZC5yZXNvbHZlYCBoZXJlIHNpbmNlIGl0IGRvZXMgbm90IGFsbG93IG92ZXJyaWRpbmcgdGhlIGV4dGVybmFsIG9wdGlvbnNcbiAgICAgICAgICAvLyBhbmQgdGhlIGFjdHVhbCBwcmVzZW5jZSBvZiB0aGUgYEBhbmd1bGFyL2xvY2FsaXplYCBwYWNrYWdlIG5lZWRzIHRvIGJlIGNoZWNrZWQgaGVyZS5cbiAgICAgICAgICBjb25zdCB3b3Jrc3BhY2VSZXF1aXJlID0gY3JlYXRlUmVxdWlyZSh3b3Jrc3BhY2VSb290ICsgJy8nKTtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgd29ya3NwYWNlUmVxdWlyZS5yZXNvbHZlKCdAYW5ndWxhci9sb2NhbGl6ZScpO1xuICAgICAgICAgICAgLy8gVGhlIHJlc29sdmUgY2FsbCBhYm92ZSB3aWxsIHRocm93IGlmIG5vdCBmb3VuZFxuICAgICAgICAgICAgY29udGVudHMucHVzaChgaW1wb3J0ICdAYW5ndWxhci9sb2NhbGl6ZS9pbml0JztgKTtcbiAgICAgICAgICB9IGNhdGNoIHt9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAob3B0aW9ucy5pMThuT3B0aW9ucy5zaG91bGRJbmxpbmUpIHtcbiAgICAgICAgICAvLyBXaGVuIGlubGluaW5nLCBhIHBsYWNlaG9sZGVyIGlzIHVzZWQgdG8gYWxsb3cgdGhlIHBvc3QtcHJvY2Vzc2luZyBzdGVwIHRvIGluamVjdCB0aGUgJGxvY2FsaXplIGxvY2FsZSBpZGVudGlmaWVyXG4gICAgICAgICAgY29udGVudHMucHVzaCgnKGdsb2JhbFRoaXMuJGxvY2FsaXplID8/PSB7fSkubG9jYWxlID0gXCJfX19OR19MT0NBTEVfSU5TRVJUX19fXCI7Jyk7XG4gICAgICAgIH0gZWxzZSBpZiAob3B0aW9ucy5pMThuT3B0aW9ucy5oYXNEZWZpbmVkU291cmNlTG9jYWxlKSB7XG4gICAgICAgICAgLy8gSWYgbm90IGlubGluaW5nIHRyYW5zbGF0aW9ucyBhbmQgc291cmNlIGxvY2FsZSBpcyBkZWZpbmVkLCBpbmplY3QgdGhlIGxvY2FsZSBzcGVjaWZpZXJcbiAgICAgICAgICBjb250ZW50cy5wdXNoKFxuICAgICAgICAgICAgYChnbG9iYWxUaGlzLiRsb2NhbGl6ZSA/Pz0ge30pLmxvY2FsZSA9IFwiJHtvcHRpb25zLmkxOG5PcHRpb25zLnNvdXJjZUxvY2FsZX1cIjtgLFxuICAgICAgICAgICk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAocHJlcmVuZGVyT3B0aW9ucz8uZGlzY292ZXJSb3V0ZXMpIHtcbiAgICAgICAgICAvLyBXZSBkbyBub3QgaW1wb3J0IGl0IGRpcmVjdGx5IHNvIHRoYXQgbm9kZS5qcyBtb2R1bGVzIGFyZSByZXNvbHZlZCB1c2luZyB0aGUgY29ycmVjdCBjb250ZXh0LlxuICAgICAgICAgIGNvbnN0IHJvdXRlc0V4dHJhY3RvckNvZGUgPSBhd2FpdCByZWFkRmlsZShcbiAgICAgICAgICAgIGpvaW4oX19kaXJuYW1lLCAnLi4vLi4vdXRpbHMvcm91dGVzLWV4dHJhY3Rvci9leHRyYWN0b3IuanMnKSxcbiAgICAgICAgICAgICd1dGYtOCcsXG4gICAgICAgICAgKTtcblxuICAgICAgICAgIC8vIFJlbW92ZSBzb3VyY2UgbWFwIFVSTCBjb21tZW50cyBmcm9tIHRoZSBjb2RlIGlmIGEgc291cmNlbWFwIGlzIHByZXNlbnQgYXMgdGhpcyB3aWxsIG5vdCBtYXRjaCB0aGUgZmlsZS5cbiAgICAgICAgICBjb250ZW50cy5wdXNoKHJvdXRlc0V4dHJhY3RvckNvZGUucmVwbGFjZSgvXlxcL1xcLyMgc291cmNlTWFwcGluZ1VSTD1bXlxcclxcbl0qL2dtLCAnJykpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBjb250ZW50czogY29udGVudHMuam9pbignXFxuJyksXG4gICAgICAgICAgbG9hZGVyOiAnanMnLFxuICAgICAgICAgIHJlc29sdmVEaXI6IHdvcmtzcGFjZVJvb3QsXG4gICAgICAgIH07XG4gICAgICB9LFxuICAgIH0pLFxuICApO1xuXG4gIGlmIChzc3JFbnRyeVBvaW50KSB7XG4gICAgYnVpbGRPcHRpb25zLnBsdWdpbnMucHVzaChcbiAgICAgIGNyZWF0ZVZpcnR1YWxNb2R1bGVQbHVnaW4oe1xuICAgICAgICBuYW1lc3BhY2U6IHNzckVudHJ5TmFtZXNwYWNlLFxuICAgICAgICBsb2FkQ29udGVudDogKCkgPT4ge1xuICAgICAgICAgIGNvbnN0IHNlcnZlckVudHJ5UG9pbnQgPSByZWxhdGl2ZSh3b3Jrc3BhY2VSb290LCBzc3JFbnRyeVBvaW50KS5yZXBsYWNlKC9cXFxcL2csICcvJyk7XG5cbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgY29udGVudHM6IFtcbiAgICAgICAgICAgICAgLi4ucG9seWZpbGxzLFxuICAgICAgICAgICAgICBgaW1wb3J0ICcuLyR7c2VydmVyRW50cnlQb2ludH0nO2AsXG4gICAgICAgICAgICAgIGBleHBvcnQgKiBmcm9tICcuLyR7c2VydmVyRW50cnlQb2ludH0nO2AsXG4gICAgICAgICAgICBdLmpvaW4oJ1xcbicpLFxuICAgICAgICAgICAgbG9hZGVyOiAnanMnLFxuICAgICAgICAgICAgcmVzb2x2ZURpcjogd29ya3NwYWNlUm9vdCxcbiAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgfSksXG4gICAgKTtcbiAgfVxuXG4gIGlmIChvcHRpb25zLnBsdWdpbnMpIHtcbiAgICBidWlsZE9wdGlvbnMucGx1Z2lucy5wdXNoKC4uLm9wdGlvbnMucGx1Z2lucyk7XG4gIH1cblxuICByZXR1cm4gYnVpbGRPcHRpb25zO1xufVxuXG5mdW5jdGlvbiBnZXRFc0J1aWxkQ29tbW9uT3B0aW9ucyhvcHRpb25zOiBOb3JtYWxpemVkQXBwbGljYXRpb25CdWlsZE9wdGlvbnMpOiBCdWlsZE9wdGlvbnMge1xuICBjb25zdCB7XG4gICAgd29ya3NwYWNlUm9vdCxcbiAgICBvdXRFeHRlbnNpb24sXG4gICAgb3B0aW1pemF0aW9uT3B0aW9ucyxcbiAgICBzb3VyY2VtYXBPcHRpb25zLFxuICAgIHRzY29uZmlnLFxuICAgIGV4dGVybmFsRGVwZW5kZW5jaWVzLFxuICAgIG91dHB1dE5hbWVzLFxuICAgIHByZXNlcnZlU3ltbGlua3MsXG4gICAgaml0LFxuICB9ID0gb3B0aW9ucztcblxuICAvLyBFbnN1cmUgdW5pcXVlIGhhc2hlcyBmb3IgaTE4biB0cmFuc2xhdGlvbiBjaGFuZ2VzIHdoZW4gdXNpbmcgcG9zdC1wcm9jZXNzIGlubGluaW5nLlxuICAvLyBUaGlzIGhhc2ggdmFsdWUgaXMgYWRkZWQgYXMgYSBmb290ZXIgdG8gZWFjaCBmaWxlIGFuZCBlbnN1cmVzIHRoYXQgdGhlIG91dHB1dCBmaWxlIG5hbWVzICh3aXRoIGhhc2hlcylcbiAgLy8gY2hhbmdlIHdoZW4gdHJhbnNsYXRpb24gZmlsZXMgaGF2ZSBjaGFuZ2VkLiBJZiB0aGlzIGlzIG5vdCBkb25lIHRoZSBwb3N0IHByb2Nlc3NlZCBmaWxlcyBtYXkgaGF2ZVxuICAvLyBkaWZmZXJlbnQgY29udGVudCBidXQgd291bGQgcmV0YWluIGlkZW50aWNhbCBwcm9kdWN0aW9uIGZpbGUgbmFtZXMgd2hpY2ggd291bGQgbGVhZCB0byBicm93c2VyIGNhY2hpbmcgcHJvYmxlbXMuXG4gIGxldCBmb290ZXI7XG4gIGlmIChvcHRpb25zLmkxOG5PcHRpb25zLnNob3VsZElubGluZSkge1xuICAgIC8vIFVwZGF0ZSBmaWxlIGhhc2hlcyB0byBpbmNsdWRlIHRyYW5zbGF0aW9uIGZpbGUgY29udGVudFxuICAgIGNvbnN0IGkxOG5IYXNoID0gT2JqZWN0LnZhbHVlcyhvcHRpb25zLmkxOG5PcHRpb25zLmxvY2FsZXMpLnJlZHVjZShcbiAgICAgIChkYXRhLCBsb2NhbGUpID0+IGRhdGEgKyBsb2NhbGUuZmlsZXMubWFwKChmaWxlKSA9PiBmaWxlLmludGVncml0eSB8fCAnJykuam9pbignfCcpLFxuICAgICAgJycsXG4gICAgKTtcblxuICAgIGZvb3RlciA9IHsganM6IGAvKippMThuOiR7Y3JlYXRlSGFzaCgnc2hhMjU2JykudXBkYXRlKGkxOG5IYXNoKS5kaWdlc3QoJ2hleCcpfSovYCB9O1xuICB9XG5cbiAgcmV0dXJuIHtcbiAgICBhYnNXb3JraW5nRGlyOiB3b3Jrc3BhY2VSb290LFxuICAgIGJ1bmRsZTogdHJ1ZSxcbiAgICBmb3JtYXQ6ICdlc20nLFxuICAgIGFzc2V0TmFtZXM6IG91dHB1dE5hbWVzLm1lZGlhLFxuICAgIGNvbmRpdGlvbnM6IFsnZXMyMDIwJywgJ2VzMjAxNScsICdtb2R1bGUnXSxcbiAgICByZXNvbHZlRXh0ZW5zaW9uczogWycudHMnLCAnLnRzeCcsICcubWpzJywgJy5qcyddLFxuICAgIG1ldGFmaWxlOiB0cnVlLFxuICAgIGxlZ2FsQ29tbWVudHM6IG9wdGlvbnMuZXh0cmFjdExpY2Vuc2VzID8gJ25vbmUnIDogJ2VvZicsXG4gICAgbG9nTGV2ZWw6IG9wdGlvbnMudmVyYm9zZSA/ICdkZWJ1ZycgOiAnc2lsZW50JyxcbiAgICBtaW5pZnlJZGVudGlmaWVyczogb3B0aW1pemF0aW9uT3B0aW9ucy5zY3JpcHRzICYmIGFsbG93TWFuZ2xlLFxuICAgIG1pbmlmeVN5bnRheDogb3B0aW1pemF0aW9uT3B0aW9ucy5zY3JpcHRzLFxuICAgIG1pbmlmeVdoaXRlc3BhY2U6IG9wdGltaXphdGlvbk9wdGlvbnMuc2NyaXB0cyxcbiAgICBwdXJlOiBbJ2ZvcndhcmRSZWYnXSxcbiAgICBvdXRkaXI6IHdvcmtzcGFjZVJvb3QsXG4gICAgb3V0RXh0ZW5zaW9uOiBvdXRFeHRlbnNpb24gPyB7ICcuanMnOiBgLiR7b3V0RXh0ZW5zaW9ufWAgfSA6IHVuZGVmaW5lZCxcbiAgICBzb3VyY2VtYXA6IHNvdXJjZW1hcE9wdGlvbnMuc2NyaXB0cyAmJiAoc291cmNlbWFwT3B0aW9ucy5oaWRkZW4gPyAnZXh0ZXJuYWwnIDogdHJ1ZSksXG4gICAgc3BsaXR0aW5nOiB0cnVlLFxuICAgIGNodW5rTmFtZXM6IG9wdGlvbnMubmFtZWRDaHVua3MgPyAnW25hbWVdLVtoYXNoXScgOiAnY2h1bmstW2hhc2hdJyxcbiAgICB0c2NvbmZpZyxcbiAgICBleHRlcm5hbDogZXh0ZXJuYWxEZXBlbmRlbmNpZXMsXG4gICAgd3JpdGU6IGZhbHNlLFxuICAgIHByZXNlcnZlU3ltbGlua3MsXG4gICAgZGVmaW5lOiB7XG4gICAgICAvLyBPbmx5IHNldCB0byBmYWxzZSB3aGVuIHNjcmlwdCBvcHRpbWl6YXRpb25zIGFyZSBlbmFibGVkLiBJdCBzaG91bGQgbm90IGJlIHNldCB0byB0cnVlIGJlY2F1c2VcbiAgICAgIC8vIEFuZ3VsYXIgdHVybnMgYG5nRGV2TW9kZWAgaW50byBhbiBvYmplY3QgZm9yIGRldmVsb3BtZW50IGRlYnVnZ2luZyBwdXJwb3NlcyB3aGVuIG5vdCBkZWZpbmVkXG4gICAgICAvLyB3aGljaCBhIGNvbnN0YW50IHRydWUgdmFsdWUgd291bGQgYnJlYWsuXG4gICAgICAuLi4ob3B0aW1pemF0aW9uT3B0aW9ucy5zY3JpcHRzID8geyAnbmdEZXZNb2RlJzogJ2ZhbHNlJyB9IDogdW5kZWZpbmVkKSxcbiAgICAgICduZ0ppdE1vZGUnOiBqaXQgPyAndHJ1ZScgOiAnZmFsc2UnLFxuICAgIH0sXG4gICAgZm9vdGVyLFxuICAgIHB1YmxpY1BhdGg6IG9wdGlvbnMucHVibGljUGF0aCxcbiAgfTtcbn1cbiJdfQ==
291
+ function getEsBuildCommonPolyfillsOptions(options, namespace, tryToResolvePolyfillsAsRelative, sourceFileCache) {
292
+ const { jit, workspaceRoot, i18nOptions } = options;
293
+ const buildOptions = {
294
+ ...getEsBuildCommonOptions(options),
295
+ splitting: false,
296
+ plugins: [(0, sourcemap_ignorelist_plugin_1.createSourcemapIgnorelistPlugin)()],
297
+ };
298
+ const polyfills = options.polyfills ? [...options.polyfills] : [];
299
+ // Angular JIT mode requires the runtime compiler
300
+ if (jit) {
301
+ polyfills.unshift('@angular/compiler');
302
+ }
303
+ // Add Angular's global locale data if i18n options are present.
304
+ // Locale data should go first so that project provided polyfill code can augment if needed.
305
+ let needLocaleDataPlugin = false;
306
+ if (i18nOptions.shouldInline) {
307
+ // When inlining, a placeholder is used to allow the post-processing step to inject the $localize locale identifier
308
+ polyfills.unshift('angular:locale/placeholder');
309
+ buildOptions.plugins?.push((0, virtual_module_plugin_1.createVirtualModulePlugin)({
310
+ namespace: 'angular:locale/placeholder',
311
+ entryPointOnly: false,
312
+ loadContent: () => ({
313
+ contents: `(globalThis.$localize ??= {}).locale = "___NG_LOCALE_INSERT___";\n`,
314
+ loader: 'js',
315
+ resolveDir: workspaceRoot,
316
+ }),
317
+ }));
318
+ // Add locale data for all active locales
319
+ // TODO: Inject each individually within the inlining process itself
320
+ for (const locale of i18nOptions.inlineLocales) {
321
+ polyfills.unshift(`angular:locale/data:${locale}`);
322
+ }
323
+ needLocaleDataPlugin = true;
324
+ }
325
+ else if (i18nOptions.hasDefinedSourceLocale) {
326
+ // When not inlining and a source local is present, use the source locale data directly
327
+ polyfills.unshift(`angular:locale/data:${i18nOptions.sourceLocale}`);
328
+ needLocaleDataPlugin = true;
329
+ }
330
+ if (needLocaleDataPlugin) {
331
+ buildOptions.plugins?.push((0, i18n_locale_plugin_1.createAngularLocaleDataPlugin)());
332
+ }
333
+ if (polyfills.length === 0) {
334
+ return;
335
+ }
336
+ buildOptions.plugins?.push((0, virtual_module_plugin_1.createVirtualModulePlugin)({
337
+ namespace,
338
+ cache: sourceFileCache?.loadResultCache,
339
+ loadContent: async (_, build) => {
340
+ let hasLocalizePolyfill = false;
341
+ let polyfillPaths = polyfills;
342
+ if (tryToResolvePolyfillsAsRelative) {
343
+ polyfillPaths = await Promise.all(polyfills.map(async (path) => {
344
+ hasLocalizePolyfill ||= path.startsWith('@angular/localize');
345
+ if (path.startsWith('zone.js') || !(0, node_path_1.extname)(path)) {
346
+ return path;
347
+ }
348
+ const potentialPathRelative = './' + path;
349
+ const result = await build.resolve(potentialPathRelative, {
350
+ kind: 'import-statement',
351
+ resolveDir: workspaceRoot,
352
+ });
353
+ return result.path ? potentialPathRelative : path;
354
+ }));
355
+ }
356
+ else {
357
+ hasLocalizePolyfill = polyfills.some((p) => p.startsWith('@angular/localize'));
358
+ }
359
+ if (!i18nOptions.shouldInline && !hasLocalizePolyfill) {
360
+ const result = await build.resolve('@angular/localize', {
361
+ kind: 'import-statement',
362
+ resolveDir: workspaceRoot,
363
+ });
364
+ if (result.path) {
365
+ polyfillPaths.push('@angular/localize/init');
366
+ }
367
+ }
368
+ // Generate module contents with an import statement per defined polyfill
369
+ let contents = polyfillPaths
370
+ .map((file) => `import '${file.replace(/\\/g, '/')}';`)
371
+ .join('\n');
372
+ // If not inlining translations and source locale is defined, inject the locale specifier
373
+ if (!i18nOptions.shouldInline && i18nOptions.hasDefinedSourceLocale) {
374
+ contents += `(globalThis.$localize ??= {}).locale = "${i18nOptions.sourceLocale}";\n`;
375
+ }
376
+ return {
377
+ contents,
378
+ loader: 'js',
379
+ resolveDir: workspaceRoot,
380
+ };
381
+ },
382
+ }));
383
+ return buildOptions;
384
+ }
@@ -52,4 +52,3 @@ function generateBudgetStats(metafile, initialFiles) {
52
52
  return stats;
53
53
  }
54
54
  exports.generateBudgetStats = generateBudgetStats;
55
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYnVkZ2V0LXN0YXRzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vcGFja2FnZXMvYW5ndWxhcl9kZXZraXQvYnVpbGRfYW5ndWxhci9zcmMvdG9vbHMvZXNidWlsZC9idWRnZXQtc3RhdHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBOzs7Ozs7R0FNRzs7O0FBR0gseUNBQXFDO0FBSXJDOzs7Ozs7O0dBT0c7QUFDSCxTQUFnQixtQkFBbUIsQ0FDakMsUUFBa0IsRUFDbEIsWUFBNEM7SUFFNUMsTUFBTSxLQUFLLEdBQTBCO1FBQ25DLE1BQU0sRUFBRSxFQUFFO1FBQ1YsTUFBTSxFQUFFLEVBQUU7S0FDWCxDQUFDO0lBRUYsS0FBSyxNQUFNLENBQUMsSUFBSSxFQUFFLEtBQUssQ0FBQyxJQUFJLE1BQU0sQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxFQUFFO1FBQzVELElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsRUFBRTtZQUNuRCxTQUFTO1NBQ1Y7UUFFRCxNQUFNLGFBQWEsR0FBRyxZQUFZLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQzdDLElBQUksSUFBSSxHQUFHLGFBQWEsRUFBRSxJQUFJLENBQUM7UUFDL0IsSUFBSSxJQUFJLEtBQUssU0FBUyxJQUFJLEtBQUssQ0FBQyxVQUFVLEVBQUU7WUFDMUMsNEZBQTRGO1lBQzVGLElBQUksR0FBRyxJQUFBLG9CQUFRLEVBQUMsS0FBSyxDQUFDLFVBQVUsQ0FBQztpQkFDOUIsT0FBTyxDQUFDLGVBQWUsRUFBRSxFQUFFLENBQUM7aUJBQzVCLE9BQU8sQ0FBQyxTQUFTLEVBQUUsR0FBRyxDQUFDLENBQUM7U0FDNUI7UUFFRCxLQUFLLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQztZQUNoQixLQUFLLEVBQUUsQ0FBQyxJQUFJLENBQUM7WUFDYixPQUFPLEVBQUUsQ0FBQyxDQUFDLGFBQWE7WUFDeEIsS0FBSyxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUztTQUNqQyxDQUFDLENBQUM7UUFFSCw2RUFBNkU7UUFDN0UsOERBQThEO1FBQzlELE1BQU0sY0FBYyxHQUFhLEtBQWEsQ0FBQyxjQUFjLENBQUMsQ0FBQztRQUUvRCxLQUFLLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQztZQUNoQixrRkFBa0Y7WUFDbEYsSUFBSSxFQUFFLENBQUMsY0FBYyxJQUFJLE1BQU0sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSTtZQUM5RCxJQUFJLEVBQUUsS0FBSyxDQUFDLEtBQUs7WUFDakIsY0FBYztTQUNmLENBQUMsQ0FBQztLQUNKO0lBRUQsT0FBTyxLQUFLLENBQUM7QUFDZixDQUFDO0FBMUNELGtEQTBDQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCBHb29nbGUgTExDIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKlxuICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmVcbiAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2VcbiAqL1xuXG5pbXBvcnQgdHlwZSB7IE1ldGFmaWxlIH0gZnJvbSAnZXNidWlsZCc7XG5pbXBvcnQgeyBiYXNlbmFtZSB9IGZyb20gJ25vZGU6cGF0aCc7XG5pbXBvcnQgdHlwZSB7IEJ1ZGdldFN0YXRzIH0gZnJvbSAnLi4vLi4vdXRpbHMvYnVuZGxlLWNhbGN1bGF0b3InO1xuaW1wb3J0IHR5cGUgeyBJbml0aWFsRmlsZVJlY29yZCB9IGZyb20gJy4vYnVuZGxlci1jb250ZXh0JztcblxuLyoqXG4gKiBHZW5lcmF0ZXMgYSBidW5kbGUgYnVkZ2V0IGNhbGN1bGF0b3IgY29tcGF0aWJsZSBzdGF0cyBvYmplY3QgdGhhdCBwcm92aWRlc1xuICogdGhlIG5lY2Vzc2FyeSBpbmZvcm1hdGlvbiBmb3IgdGhlIFdlYnBhY2stYmFzZWQgYnVuZGxlIGJ1ZGdldCBjb2RlIHRvXG4gKiBpbnRlcm9wZXJhdGUgd2l0aCB0aGUgZXNidWlsZC1iYXNlZCBidWlsZGVycy5cbiAqIEBwYXJhbSBtZXRhZmlsZSBUaGUgZXNidWlsZCBtZXRhZmlsZSBvZiBhIGJ1aWxkIHRvIHVzZS5cbiAqIEBwYXJhbSBpbml0aWFsRmlsZXMgVGhlIHJlY29yZHMgb2YgYWxsIGluaXRpYWwgZmlsZXMgb2YgYSBidWlsZC5cbiAqIEByZXR1cm5zIEEgYnVuZGxlIGJ1ZGdldCBjb21wYXRpYmxlIHN0YXRzIG9iamVjdC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdlbmVyYXRlQnVkZ2V0U3RhdHMoXG4gIG1ldGFmaWxlOiBNZXRhZmlsZSxcbiAgaW5pdGlhbEZpbGVzOiBNYXA8c3RyaW5nLCBJbml0aWFsRmlsZVJlY29yZD4sXG4pOiBCdWRnZXRTdGF0cyB7XG4gIGNvbnN0IHN0YXRzOiBSZXF1aXJlZDxCdWRnZXRTdGF0cz4gPSB7XG4gICAgY2h1bmtzOiBbXSxcbiAgICBhc3NldHM6IFtdLFxuICB9O1xuXG4gIGZvciAoY29uc3QgW2ZpbGUsIGVudHJ5XSBvZiBPYmplY3QuZW50cmllcyhtZXRhZmlsZS5vdXRwdXRzKSkge1xuICAgIGlmICghZmlsZS5lbmRzV2l0aCgnLmpzJykgJiYgIWZpbGUuZW5kc1dpdGgoJy5jc3MnKSkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgY29uc3QgaW5pdGlhbFJlY29yZCA9IGluaXRpYWxGaWxlcy5nZXQoZmlsZSk7XG4gICAgbGV0IG5hbWUgPSBpbml0aWFsUmVjb3JkPy5uYW1lO1xuICAgIGlmIChuYW1lID09PSB1bmRlZmluZWQgJiYgZW50cnkuZW50cnlQb2ludCkge1xuICAgICAgLy8gRm9yIG5vbi1pbml0aWFsIGxhenkgbW9kdWxlcywgY29udmVydCB0aGUgZW50cnkgcG9pbnQgZmlsZSBpbnRvIGEgV2VicGFjayBjb21wYXRpYmxlIG5hbWVcbiAgICAgIG5hbWUgPSBiYXNlbmFtZShlbnRyeS5lbnRyeVBvaW50KVxuICAgICAgICAucmVwbGFjZSgvXFwuW2NtXT9banRdcyQvLCAnJylcbiAgICAgICAgLnJlcGxhY2UoL1tcXFxcLy5dL2csICctJyk7XG4gICAgfVxuXG4gICAgc3RhdHMuY2h1bmtzLnB1c2goe1xuICAgICAgZmlsZXM6IFtmaWxlXSxcbiAgICAgIGluaXRpYWw6ICEhaW5pdGlhbFJlY29yZCxcbiAgICAgIG5hbWVzOiBuYW1lID8gW25hbWVdIDogdW5kZWZpbmVkLFxuICAgIH0pO1xuXG4gICAgLy8gJ25nLWNvbXBvbmVudCcgaXMgc2V0IGJ5IHRoZSBhbmd1bGFyIHBsdWdpbidzIGNvbXBvbmVudCBzdHlsZXNoZWV0IGJ1bmRsZXJcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICAgIGNvbnN0IGNvbXBvbmVudFN0eWxlOiBib29sZWFuID0gKGVudHJ5IGFzIGFueSlbJ25nLWNvbXBvbmVudCddO1xuXG4gICAgc3RhdHMuYXNzZXRzLnB1c2goe1xuICAgICAgLy8gQ29tcG9uZW50IHN0eWxlcyB1c2UgdGhlIGlucHV0IGZpbGUgd2hpbGUgYWxsIG90aGVyIG91dHB1dHMgdXNlIHRoZSByZXN1bHQgZmlsZVxuICAgICAgbmFtZTogKGNvbXBvbmVudFN0eWxlICYmIE9iamVjdC5rZXlzKGVudHJ5LmlucHV0cylbMF0pIHx8IGZpbGUsXG4gICAgICBzaXplOiBlbnRyeS5ieXRlcyxcbiAgICAgIGNvbXBvbmVudFN0eWxlLFxuICAgIH0pO1xuICB9XG5cbiAgcmV0dXJuIHN0YXRzO1xufVxuIl19
@@ -6,6 +6,7 @@
6
6
  * found in the LICENSE file at https://angular.io/license
7
7
  */
8
8
  import { BuildOptions, Message, Metafile, OutputFile } from 'esbuild';
9
+ import { LoadResultCache } from './load-result-cache';
9
10
  export type BundleContextResult = {
10
11
  errors: Message[];
11
12
  warnings: Message[];
@@ -15,6 +16,7 @@ export type BundleContextResult = {
15
16
  metafile: Metafile;
16
17
  outputFiles: BuildOutputFile[];
17
18
  initialFiles: Map<string, InitialFileRecord>;
19
+ externalImports: Set<string>;
18
20
  };
19
21
  export interface InitialFileRecord {
20
22
  entrypoint: boolean;
@@ -33,13 +35,14 @@ export interface BuildOutputFile extends OutputFile {
33
35
  fullOutputPath: string;
34
36
  clone: () => BuildOutputFile;
35
37
  }
38
+ export type BundlerOptionsFactory<T extends BuildOptions = BuildOptions> = (loadCache: LoadResultCache | undefined) => T;
36
39
  export declare class BundlerContext {
37
40
  #private;
38
41
  private workspaceRoot;
39
42
  private incremental;
40
43
  private initialFilter?;
41
44
  readonly watchFiles: Set<string>;
42
- constructor(workspaceRoot: string, incremental: boolean, options: BuildOptions, initialFilter?: ((initial: Readonly<InitialFileRecord>) => boolean) | undefined);
45
+ constructor(workspaceRoot: string, incremental: boolean, options: BuildOptions | BundlerOptionsFactory, initialFilter?: ((initial: Readonly<InitialFileRecord>) => boolean) | undefined);
43
46
  static bundleAll(contexts: Iterable<BundlerContext>): Promise<BundleContextResult>;
44
47
  /**
45
48
  * Executes the esbuild build function and normalizes the build result in the event of a
@@ -51,6 +54,14 @@ export declare class BundlerContext {
51
54
  * warnings and errors for the attempted build.
52
55
  */
53
56
  bundle(): Promise<BundleContextResult>;
57
+ /**
58
+ * Invalidate a stored bundler result based on the previous watch files
59
+ * and a list of changed files.
60
+ * The context must be created with incremental mode enabled for results
61
+ * to be stored.
62
+ * @returns True, if the result was invalidated; False, otherwise.
63
+ */
64
+ invalidate(files: Iterable<string>): boolean;
54
65
  /**
55
66
  * Disposes incremental build resources present in the context.
56
67
  *