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