@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.
- package/package.json +13 -13
- package/plugins/karma.js +0 -1
- package/src/builders/app-shell/index.js +8 -6
- 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 +37 -14
- package/src/builders/application/execute-post-bundle.d.ts +1 -0
- package/src/builders/application/execute-post-bundle.js +5 -3
- package/src/builders/application/i18n.d.ts +1 -0
- package/src/builders/application/i18n.js +4 -2
- package/src/builders/application/index.js +8 -2
- package/src/builders/application/options.d.ts +1 -1
- package/src/builders/application/options.js +3 -3
- package/src/builders/application/schema.d.ts +15 -5
- package/src/builders/application/schema.js +0 -1
- package/src/builders/application/schema.json +10 -4
- 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 +14 -13
- 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 +78 -45
- 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 +2 -3
- 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 +6 -3
- package/src/tools/esbuild/angular/compilation/angular-compilation.js +36 -9
- package/src/tools/esbuild/angular/compilation/aot-compilation.js +2 -1
- package/src/tools/esbuild/angular/compilation/factory.d.ts +16 -0
- package/src/tools/esbuild/angular/compilation/factory.js +56 -0
- package/src/tools/esbuild/angular/compilation/index.d.ts +1 -2
- package/src/tools/esbuild/angular/compilation/index.js +3 -6
- 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.d.ts +42 -0
- package/src/tools/esbuild/angular/compilation/parallel-compilation.js +121 -0
- package/src/tools/esbuild/angular/compilation/parallel-worker.d.ts +32 -0
- package/src/tools/esbuild/angular/compilation/parallel-worker.js +90 -0
- package/src/tools/esbuild/angular/compilation-state.js +0 -1
- package/src/tools/esbuild/angular/compiler-plugin.d.ts +1 -0
- package/src/tools/esbuild/angular/compiler-plugin.js +111 -52
- package/src/tools/esbuild/angular/component-stylesheets.d.ts +3 -3
- package/src/tools/esbuild/angular/component-stylesheets.js +47 -32
- package/src/tools/esbuild/angular/diagnostics.d.ts +2 -2
- package/src/tools/esbuild/angular/diagnostics.js +9 -15
- package/src/tools/esbuild/angular/file-reference-tracker.d.ts +17 -0
- package/src/tools/esbuild/angular/file-reference-tracker.js +53 -0
- package/src/tools/esbuild/angular/jit-plugin-callbacks.d.ts +6 -3
- package/src/tools/esbuild/angular/jit-plugin-callbacks.js +4 -5
- 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 +3 -2
- 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 +2 -0
- package/src/tools/esbuild/application-code-bundle.js +209 -150
- package/src/tools/esbuild/budget-stats.js +0 -1
- package/src/tools/esbuild/bundler-context.d.ts +12 -1
- package/src/tools/esbuild/bundler-context.js +105 -10
- package/src/tools/esbuild/bundler-execution-result.d.ts +19 -0
- package/src/tools/esbuild/bundler-execution-result.js +18 -3
- package/src/tools/esbuild/commonjs-checker.js +3 -1
- package/src/tools/esbuild/compiler-plugin-options.js +1 -1
- package/src/tools/esbuild/global-scripts.js +0 -1
- package/src/tools/esbuild/global-styles.js +0 -1
- 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 +25 -3
- package/src/tools/esbuild/javascript-transfomer-plugin.d.ts +19 -0
- package/src/tools/esbuild/javascript-transfomer-plugin.js +51 -0
- package/src/tools/esbuild/javascript-transformer-worker.js +0 -1
- 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 +25 -11
- package/src/tools/esbuild/utils.d.ts +4 -4
- package/src/tools/esbuild/utils.js +47 -34
- 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.js +0 -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 +0 -1
- 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.d.ts +1 -0
- package/src/utils/environment-options.js +3 -2
- 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 +5 -3
- 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.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 +20 -8
- 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 +7 -3
- 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 +3 -1
- package/src/utils/server-rendering/prerender.js +84 -22
- package/src/utils/server-rendering/render-page.d.ts +2 -2
- package/src/utils/server-rendering/render-page.js +42 -4
- 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
|
@@ -38,13 +38,13 @@ const node_assert_1 = __importDefault(require("node:assert"));
|
|
|
38
38
|
const promises_1 = require("node:fs/promises");
|
|
39
39
|
const path = __importStar(require("node:path"));
|
|
40
40
|
const node_url_1 = require("node:url");
|
|
41
|
-
const typescript_1 = __importDefault(require("typescript"));
|
|
42
41
|
const environment_options_1 = require("../../../utils/environment-options");
|
|
43
42
|
const javascript_transformer_1 = require("../javascript-transformer");
|
|
44
43
|
const profiling_1 = require("../profiling");
|
|
45
44
|
const compilation_1 = require("./compilation");
|
|
46
45
|
const compilation_state_1 = require("./compilation-state");
|
|
47
46
|
const component_stylesheets_1 = require("./component-stylesheets");
|
|
47
|
+
const file_reference_tracker_1 = require("./file-reference-tracker");
|
|
48
48
|
const jit_plugin_callbacks_1 = require("./jit-plugin-callbacks");
|
|
49
49
|
// eslint-disable-next-line max-lines-per-function
|
|
50
50
|
function createCompilerPlugin(pluginOptions, styleOptions) {
|
|
@@ -72,20 +72,20 @@ function createCompilerPlugin(pluginOptions, styleOptions) {
|
|
|
72
72
|
// A string value indicates direct TS/NG output and a Uint8Array indicates fully transformed code.
|
|
73
73
|
const typeScriptFileCache = pluginOptions.sourceFileCache?.typeScriptFileCache ??
|
|
74
74
|
new Map();
|
|
75
|
-
// The
|
|
76
|
-
|
|
77
|
-
let additionalMetafiles;
|
|
75
|
+
// The resources from component stylesheets and web workers that will be added to the build results output files
|
|
76
|
+
const additionalResults = new Map();
|
|
78
77
|
// Create new reusable compilation for the appropriate mode based on the `jit` plugin option
|
|
79
78
|
const compilation = pluginOptions.noopTypeScriptCompilation
|
|
80
79
|
? new compilation_1.NoopCompilation()
|
|
81
|
-
: pluginOptions.jit
|
|
82
|
-
? new compilation_1.JitCompilation()
|
|
83
|
-
: new compilation_1.AotCompilation();
|
|
80
|
+
: await (0, compilation_1.createAngularCompilation)(!!pluginOptions.jit);
|
|
84
81
|
// Determines if TypeScript should process JavaScript files based on tsconfig `allowJs` option
|
|
85
82
|
let shouldTsIgnoreJs = true;
|
|
86
83
|
// Track incremental component stylesheet builds
|
|
87
|
-
const stylesheetBundler = new component_stylesheets_1.ComponentStylesheetBundler(styleOptions, pluginOptions.
|
|
84
|
+
const stylesheetBundler = new component_stylesheets_1.ComponentStylesheetBundler(styleOptions, pluginOptions.incremental);
|
|
88
85
|
let sharedTSCompilationState;
|
|
86
|
+
// To fully invalidate files, track resource referenced files and their referencing source
|
|
87
|
+
const referencedFileTracker = new file_reference_tracker_1.FileReferenceTracker();
|
|
88
|
+
// eslint-disable-next-line max-lines-per-function
|
|
89
89
|
build.onStart(async () => {
|
|
90
90
|
sharedTSCompilationState = (0, compilation_state_1.getSharedCompilationState)();
|
|
91
91
|
if (!(compilation instanceof compilation_1.NoopCompilation)) {
|
|
@@ -96,13 +96,27 @@ function createCompilerPlugin(pluginOptions, styleOptions) {
|
|
|
96
96
|
};
|
|
97
97
|
// Reset debug performance tracking
|
|
98
98
|
(0, profiling_1.resetCumulativeDurations)();
|
|
99
|
-
//
|
|
100
|
-
|
|
101
|
-
|
|
99
|
+
// Update the reference tracker and generate a full set of modified files for the
|
|
100
|
+
// Angular compiler which does not have direct knowledge of transitive resource
|
|
101
|
+
// dependencies or web worker processing.
|
|
102
|
+
let modifiedFiles;
|
|
103
|
+
if (pluginOptions.sourceFileCache?.modifiedFiles.size &&
|
|
104
|
+
referencedFileTracker &&
|
|
105
|
+
!pluginOptions.noopTypeScriptCompilation) {
|
|
106
|
+
// TODO: Differentiate between changed input files and stale output files
|
|
107
|
+
modifiedFiles = referencedFileTracker.update(pluginOptions.sourceFileCache.modifiedFiles);
|
|
108
|
+
pluginOptions.sourceFileCache.invalidate(modifiedFiles);
|
|
109
|
+
stylesheetBundler.invalidate(modifiedFiles);
|
|
110
|
+
}
|
|
111
|
+
if (!pluginOptions.noopTypeScriptCompilation &&
|
|
112
|
+
compilation.update &&
|
|
113
|
+
pluginOptions.sourceFileCache?.modifiedFiles.size) {
|
|
114
|
+
await compilation.update(modifiedFiles ?? pluginOptions.sourceFileCache.modifiedFiles);
|
|
115
|
+
}
|
|
102
116
|
// Create Angular compiler host options
|
|
103
117
|
const hostOptions = {
|
|
104
118
|
fileReplacements: pluginOptions.fileReplacements,
|
|
105
|
-
modifiedFiles
|
|
119
|
+
modifiedFiles,
|
|
106
120
|
sourceFileCache: pluginOptions.sourceFileCache,
|
|
107
121
|
async transformStylesheet(data, containingFile, stylesheetFile) {
|
|
108
122
|
let stylesheetResult;
|
|
@@ -113,14 +127,21 @@ function createCompilerPlugin(pluginOptions, styleOptions) {
|
|
|
113
127
|
else {
|
|
114
128
|
stylesheetResult = await stylesheetBundler.bundleInline(data, containingFile, styleOptions.inlineStyleLanguage);
|
|
115
129
|
}
|
|
116
|
-
const { contents, resourceFiles, errors, warnings } = stylesheetResult;
|
|
130
|
+
const { contents, resourceFiles, referencedFiles, errors, warnings } = stylesheetResult;
|
|
117
131
|
if (errors) {
|
|
118
132
|
(result.errors ??= []).push(...errors);
|
|
119
133
|
}
|
|
120
134
|
(result.warnings ??= []).push(...warnings);
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
135
|
+
additionalResults.set(stylesheetFile ?? containingFile, {
|
|
136
|
+
outputFiles: resourceFiles,
|
|
137
|
+
metafile: stylesheetResult.metafile,
|
|
138
|
+
});
|
|
139
|
+
if (referencedFiles) {
|
|
140
|
+
referencedFileTracker.add(containingFile, referencedFiles);
|
|
141
|
+
if (stylesheetFile) {
|
|
142
|
+
// Angular AOT compiler needs modified direct resource files to correctly invalidate its analysis
|
|
143
|
+
referencedFileTracker.add(stylesheetFile, referencedFiles);
|
|
144
|
+
}
|
|
124
145
|
}
|
|
125
146
|
return contents;
|
|
126
147
|
},
|
|
@@ -129,33 +150,25 @@ function createCompilerPlugin(pluginOptions, styleOptions) {
|
|
|
129
150
|
// The synchronous API must be used due to the TypeScript compilation currently being
|
|
130
151
|
// fully synchronous and this process callback being called from within a TypeScript
|
|
131
152
|
// transformer.
|
|
132
|
-
const workerResult = build
|
|
133
|
-
platform: 'browser',
|
|
134
|
-
write: false,
|
|
135
|
-
bundle: true,
|
|
136
|
-
metafile: true,
|
|
137
|
-
format: 'esm',
|
|
138
|
-
mainFields: ['es2020', 'es2015', 'browser', 'module', 'main'],
|
|
139
|
-
sourcemap: pluginOptions.sourcemap,
|
|
140
|
-
entryNames: 'worker-[hash]',
|
|
141
|
-
entryPoints: [fullWorkerPath],
|
|
142
|
-
absWorkingDir: build.initialOptions.absWorkingDir,
|
|
143
|
-
outdir: build.initialOptions.outdir,
|
|
144
|
-
minifyIdentifiers: build.initialOptions.minifyIdentifiers,
|
|
145
|
-
minifySyntax: build.initialOptions.minifySyntax,
|
|
146
|
-
minifyWhitespace: build.initialOptions.minifyWhitespace,
|
|
147
|
-
target: build.initialOptions.target,
|
|
148
|
-
});
|
|
153
|
+
const workerResult = bundleWebWorker(build, pluginOptions, fullWorkerPath);
|
|
149
154
|
(result.warnings ??= []).push(...workerResult.warnings);
|
|
150
|
-
additionalOutputFiles.push(...workerResult.outputFiles);
|
|
151
|
-
if (workerResult.metafile) {
|
|
152
|
-
additionalMetafiles.push(workerResult.metafile);
|
|
153
|
-
}
|
|
154
155
|
if (workerResult.errors.length > 0) {
|
|
155
156
|
(result.errors ??= []).push(...workerResult.errors);
|
|
157
|
+
// Track worker file errors to allow rebuilds on changes
|
|
158
|
+
referencedFileTracker.add(containingFile, workerResult.errors
|
|
159
|
+
.map((error) => error.location?.file)
|
|
160
|
+
.filter((file) => !!file)
|
|
161
|
+
.map((file) => path.join(build.initialOptions.absWorkingDir ?? '', file)));
|
|
162
|
+
additionalResults.set(fullWorkerPath, { errors: result.errors });
|
|
156
163
|
// Return the original path if the build failed
|
|
157
164
|
return workerFile;
|
|
158
165
|
}
|
|
166
|
+
(0, node_assert_1.default)('outputFiles' in workerResult, 'Invalid web worker bundle result.');
|
|
167
|
+
additionalResults.set(fullWorkerPath, {
|
|
168
|
+
outputFiles: workerResult.outputFiles,
|
|
169
|
+
metafile: workerResult.metafile,
|
|
170
|
+
});
|
|
171
|
+
referencedFileTracker.add(containingFile, Object.keys(workerResult.metafile.inputs).map((input) => path.join(build.initialOptions.absWorkingDir ?? '', input)));
|
|
159
172
|
// Return bundled worker file entry name to be used in the built output
|
|
160
173
|
const workerCodeFile = workerResult.outputFiles.find((file) => file.path.endsWith('.js'));
|
|
161
174
|
(0, node_assert_1.default)(workerCodeFile, 'Web Worker bundled code file should always be present.');
|
|
@@ -165,12 +178,12 @@ function createCompilerPlugin(pluginOptions, styleOptions) {
|
|
|
165
178
|
// Initialize the Angular compilation for the current build.
|
|
166
179
|
// In watch mode, previous build state will be reused.
|
|
167
180
|
const { compilerOptions: { allowJs }, referencedFiles, } = await compilation.initialize(tsconfigPath, hostOptions, (compilerOptions) => {
|
|
168
|
-
|
|
169
|
-
|
|
181
|
+
// target of 9 is ES2022 (using the number avoids an expensive import of typescript just for an enum)
|
|
182
|
+
if (compilerOptions.target === undefined || compilerOptions.target < 9) {
|
|
170
183
|
// If 'useDefineForClassFields' is already defined in the users project leave the value as is.
|
|
171
184
|
// Otherwise fallback to false due to https://github.com/microsoft/TypeScript/issues/45995
|
|
172
185
|
// which breaks the deprecated `@Effects` NGRX decorator and potentially other existing code as well.
|
|
173
|
-
compilerOptions.target =
|
|
186
|
+
compilerOptions.target = 9;
|
|
174
187
|
compilerOptions.useDefineForClassFields ??= false;
|
|
175
188
|
// Only add the warning on the initial build
|
|
176
189
|
setupWarnings?.push({
|
|
@@ -185,6 +198,14 @@ function createCompilerPlugin(pluginOptions, styleOptions) {
|
|
|
185
198
|
],
|
|
186
199
|
});
|
|
187
200
|
}
|
|
201
|
+
if (compilerOptions.compilationMode === 'partial') {
|
|
202
|
+
setupWarnings?.push({
|
|
203
|
+
text: 'Angular partial compilation mode is not supported when building applications.',
|
|
204
|
+
location: null,
|
|
205
|
+
notes: [{ text: 'Full compilation mode will be used instead.' }],
|
|
206
|
+
});
|
|
207
|
+
compilerOptions.compilationMode = 'full';
|
|
208
|
+
}
|
|
188
209
|
// Enable incremental compilation by default if caching is enabled
|
|
189
210
|
if (pluginOptions.sourceFileCache?.persistentCachePath) {
|
|
190
211
|
compilerOptions.incremental ??= true;
|
|
@@ -217,14 +238,24 @@ function createCompilerPlugin(pluginOptions, styleOptions) {
|
|
|
217
238
|
(result.warnings ??= []).push(...diagnostics.warnings);
|
|
218
239
|
}
|
|
219
240
|
// Update TypeScript file output cache for all affected files
|
|
220
|
-
(0, profiling_1.
|
|
221
|
-
for (const { filename, contents } of compilation.emitAffectedFiles()) {
|
|
241
|
+
await (0, profiling_1.profileAsync)('NG_EMIT_TS', async () => {
|
|
242
|
+
for (const { filename, contents } of await compilation.emitAffectedFiles()) {
|
|
222
243
|
typeScriptFileCache.set((0, node_url_1.pathToFileURL)(filename).href, contents);
|
|
223
244
|
}
|
|
224
245
|
});
|
|
246
|
+
// Add errors from failed additional results.
|
|
247
|
+
// This must be done after emit to capture latest web worker results.
|
|
248
|
+
for (const { errors } of additionalResults.values()) {
|
|
249
|
+
if (errors) {
|
|
250
|
+
(result.errors ??= []).push(...errors);
|
|
251
|
+
}
|
|
252
|
+
}
|
|
225
253
|
// Store referenced files for updated file watching if enabled
|
|
226
254
|
if (pluginOptions.sourceFileCache) {
|
|
227
|
-
pluginOptions.sourceFileCache.referencedFiles =
|
|
255
|
+
pluginOptions.sourceFileCache.referencedFiles = [
|
|
256
|
+
...referencedFiles,
|
|
257
|
+
...referencedFileTracker.referencedFiles,
|
|
258
|
+
];
|
|
228
259
|
}
|
|
229
260
|
// Reset the setup warnings so that they are only shown during the first build.
|
|
230
261
|
setupWarnings = undefined;
|
|
@@ -283,16 +314,16 @@ function createCompilerPlugin(pluginOptions, styleOptions) {
|
|
|
283
314
|
}, true));
|
|
284
315
|
// Setup bundling of component templates and stylesheets when in JIT mode
|
|
285
316
|
if (pluginOptions.jit) {
|
|
286
|
-
(0, jit_plugin_callbacks_1.setupJitPluginCallbacks)(build, stylesheetBundler,
|
|
317
|
+
(0, jit_plugin_callbacks_1.setupJitPluginCallbacks)(build, stylesheetBundler, additionalResults, styleOptions.inlineStyleLanguage);
|
|
287
318
|
}
|
|
288
319
|
build.onEnd((result) => {
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
320
|
+
for (const { outputFiles, metafile } of additionalResults.values()) {
|
|
321
|
+
// Add any additional output files to the main output files
|
|
322
|
+
if (outputFiles?.length) {
|
|
323
|
+
result.outputFiles?.push(...outputFiles);
|
|
324
|
+
}
|
|
325
|
+
// Combine additional metafiles with main metafile
|
|
326
|
+
if (result.metafile && metafile) {
|
|
296
327
|
result.metafile.inputs = { ...result.metafile.inputs, ...metafile.inputs };
|
|
297
328
|
result.metafile.outputs = { ...result.metafile.outputs, ...metafile.outputs };
|
|
298
329
|
}
|
|
@@ -302,11 +333,40 @@ function createCompilerPlugin(pluginOptions, styleOptions) {
|
|
|
302
333
|
build.onDispose(() => {
|
|
303
334
|
sharedTSCompilationState?.dispose();
|
|
304
335
|
void stylesheetBundler.dispose();
|
|
336
|
+
void compilation.close?.();
|
|
305
337
|
});
|
|
306
338
|
},
|
|
307
339
|
};
|
|
308
340
|
}
|
|
309
341
|
exports.createCompilerPlugin = createCompilerPlugin;
|
|
342
|
+
function bundleWebWorker(build, pluginOptions, workerFile) {
|
|
343
|
+
try {
|
|
344
|
+
return build.esbuild.buildSync({
|
|
345
|
+
platform: 'browser',
|
|
346
|
+
write: false,
|
|
347
|
+
bundle: true,
|
|
348
|
+
metafile: true,
|
|
349
|
+
format: 'esm',
|
|
350
|
+
mainFields: ['es2020', 'es2015', 'browser', 'module', 'main'],
|
|
351
|
+
logLevel: 'silent',
|
|
352
|
+
sourcemap: pluginOptions.sourcemap,
|
|
353
|
+
entryNames: 'worker-[hash]',
|
|
354
|
+
entryPoints: [workerFile],
|
|
355
|
+
absWorkingDir: build.initialOptions.absWorkingDir,
|
|
356
|
+
outdir: build.initialOptions.outdir,
|
|
357
|
+
minifyIdentifiers: build.initialOptions.minifyIdentifiers,
|
|
358
|
+
minifySyntax: build.initialOptions.minifySyntax,
|
|
359
|
+
minifyWhitespace: build.initialOptions.minifyWhitespace,
|
|
360
|
+
target: build.initialOptions.target,
|
|
361
|
+
});
|
|
362
|
+
}
|
|
363
|
+
catch (error) {
|
|
364
|
+
if (error && typeof error === 'object' && 'errors' in error && 'warnings' in error) {
|
|
365
|
+
return error;
|
|
366
|
+
}
|
|
367
|
+
throw error;
|
|
368
|
+
}
|
|
369
|
+
}
|
|
310
370
|
function createMissingFileError(request, original, root) {
|
|
311
371
|
const error = {
|
|
312
372
|
text: `File '${path.relative(root, request)}' is missing from the TypeScript compilation.`,
|
|
@@ -323,4 +383,3 @@ function createMissingFileError(request, original, root) {
|
|
|
323
383
|
}
|
|
324
384
|
return error;
|
|
325
385
|
}
|
|
326
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tcGlsZXItcGx1Z2luLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vcGFja2FnZXMvYW5ndWxhcl9kZXZraXQvYnVpbGRfYW5ndWxhci9zcmMvdG9vbHMvZXNidWlsZC9hbmd1bGFyL2NvbXBpbGVyLXBsdWdpbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUE7Ozs7OztHQU1HOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQVVILDhEQUFpQztBQUNqQywrQ0FBNEM7QUFDNUMsZ0RBQWtDO0FBQ2xDLHVDQUF5QztBQUN6Qyw0REFBNEI7QUFDNUIsNEVBQWdFO0FBQ2hFLHNFQUFrRTtBQUVsRSw0Q0FLc0I7QUFHdEIsK0NBQW9HO0FBQ3BHLDJEQUEwRjtBQUMxRixtRUFBcUU7QUFDckUsaUVBQWlFO0FBZ0JqRSxrREFBa0Q7QUFDbEQsU0FBZ0Isb0JBQW9CLENBQ2xDLGFBQW9DLEVBQ3BDLFlBQXVFO0lBRXZFLE9BQU87UUFDTCxJQUFJLEVBQUUsa0JBQWtCO1FBQ3hCLGtEQUFrRDtRQUNsRCxLQUFLLENBQUMsS0FBSyxDQUFDLEtBQWtCO1lBQzVCLElBQUksYUFBYSxHQUFpQyxFQUFFLENBQUM7WUFDckQsTUFBTSxnQkFBZ0IsR0FBRyxLQUFLLENBQUMsY0FBYyxDQUFDLGdCQUFnQixDQUFDO1lBRS9ELElBQUksWUFBWSxHQUFHLGFBQWEsQ0FBQyxRQUFRLENBQUM7WUFDMUMsSUFBSSxDQUFDLGdCQUFnQixFQUFFO2dCQUNyQixnRUFBZ0U7Z0JBQ2hFLHlGQUF5RjtnQkFDekYsSUFBSTtvQkFDRixZQUFZLEdBQUcsTUFBTSxJQUFBLG1CQUFRLEVBQUMsWUFBWSxDQUFDLENBQUM7aUJBQzdDO2dCQUFDLE1BQU0sR0FBRTthQUNYO1lBRUQsMERBQTBEO1lBQzFELE1BQU0scUJBQXFCLEdBQUcsSUFBSSw4Q0FBcUIsQ0FBQyxhQUFhLEVBQUUsZ0NBQVUsQ0FBQyxDQUFDO1lBRW5G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STtTQUN6RixDQUFDLENBQUM7S0FDSjtJQUVELE9BQU8sS0FBSyxDQUFDO0FBQ2YsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCBHb29nbGUgTExDIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKlxuICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmVcbiAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2VcbiAqL1xuXG5pbXBvcnQgdHlwZSB7XG4gIE1ldGFmaWxlLFxuICBPblN0YXJ0UmVzdWx0LFxuICBPdXRwdXRGaWxlLFxuICBQYXJ0aWFsTWVzc2FnZSxcbiAgUGx1Z2luLFxuICBQbHVnaW5CdWlsZCxcbn0gZnJvbSAnZXNidWlsZCc7XG5pbXBvcnQgYXNzZXJ0IGZyb20gJ25vZGU6YXNzZXJ0JztcbmltcG9ydCB7IHJlYWxwYXRoIH0gZnJvbSAnbm9kZTpmcy9wcm9taXNlcyc7XG5pbXBvcnQgKiBhcyBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5pbXBvcnQgeyBwYXRoVG9GaWxlVVJMIH0gZnJvbSAnbm9kZTp1cmwnO1xuaW1wb3J0IHRzIGZyb20gJ3R5cGVzY3JpcHQnO1xuaW1wb3J0IHsgbWF4V29ya2VycyB9IGZyb20gJy4uLy4uLy4uL3V0aWxzL2Vudmlyb25tZW50LW9wdGlvbnMnO1xuaW1wb3J0IHsgSmF2YVNjcmlwdFRyYW5zZm9ybWVyIH0gZnJvbSAnLi4vamF2YXNjcmlwdC10cmFuc2Zvcm1lcic7XG5pbXBvcnQgeyBMb2FkUmVzdWx0Q2FjaGUgfSBmcm9tICcuLi9sb2FkLXJlc3VsdC1jYWNoZSc7XG5pbXBvcnQge1xuICBsb2dDdW11bGF0aXZlRHVyYXRpb25zLFxuICBwcm9maWxlQXN5bmMsXG4gIHByb2ZpbGVTeW5jLFxuICByZXNldEN1bXVsYXRpdmVEdXJhdGlvbnMsXG59IGZyb20gJy4uL3Byb2ZpbGluZyc7XG5pbXBvcnQgeyBCdW5kbGVTdHlsZXNoZWV0T3B0aW9ucyB9IGZyb20gJy4uL3N0eWxlc2hlZXRzL2J1bmRsZS1vcHRpb25zJztcbmltcG9ydCB7IEFuZ3VsYXJIb3N0T3B0aW9ucyB9IGZyb20gJy4vYW5ndWxhci1ob3N0JztcbmltcG9ydCB7IEFuZ3VsYXJDb21waWxhdGlvbiwgQW90Q29tcGlsYXRpb24sIEppdENvbXBpbGF0aW9uLCBOb29wQ29tcGlsYXRpb24gfSBmcm9tICcuL2NvbXBpbGF0aW9uJztcbmltcG9ydCB7IFNoYXJlZFRTQ29tcGlsYXRpb25TdGF0ZSwgZ2V0U2hhcmVkQ29tcGlsYXRpb25TdGF0ZSB9IGZyb20gJy4vY29tcGlsYXRpb24tc3RhdGUnO1xuaW1wb3J0IHsgQ29tcG9uZW50U3R5bGVzaGVldEJ1bmRsZXIgfSBmcm9tICcuL2NvbXBvbmVudC1zdHlsZXNoZWV0cyc7XG5pbXBvcnQgeyBzZXR1cEppdFBsdWdpbkNhbGxiYWNrcyB9IGZyb20gJy4vaml0LXBsdWdpbi1jYWxsYmFja3MnO1xuaW1wb3J0IHsgU291cmNlRmlsZUNhY2hlIH0gZnJvbSAnLi9zb3VyY2UtZmlsZS1jYWNoZSc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ29tcGlsZXJQbHVnaW5PcHRpb25zIHtcbiAgc291cmNlbWFwOiBib29sZWFuO1xuICB0c2NvbmZpZzogc3RyaW5nO1xuICBqaXQ/OiBib29sZWFuO1xuICAvKiogU2tpcCBUeXBlU2NyaXB0IGNvbXBpbGF0aW9uIHNldHVwLiBUaGlzIGlzIHVzZWZ1bCB0byByZS11c2UgdGhlIFR5cGVTY3JpcHQgY29tcGlsYXRpb24gZnJvbSBhbm90aGVyIHBsdWdpbi4gKi9cbiAgbm9vcFR5cGVTY3JpcHRDb21waWxhdGlvbj86IGJvb2xlYW47XG4gIGFkdmFuY2VkT3B0aW1pemF0aW9ucz86IGJvb2xlYW47XG4gIHRoaXJkUGFydHlTb3VyY2VtYXBzPzogYm9vbGVhbjtcbiAgZmlsZVJlcGxhY2VtZW50cz86IFJlY29yZDxzdHJpbmcsIHN0cmluZz47XG4gIHNvdXJjZUZpbGVDYWNoZT86IFNvdXJjZUZpbGVDYWNoZTtcbiAgbG9hZFJlc3VsdENhY2hlPzogTG9hZFJlc3VsdENhY2hlO1xufVxuXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbWF4LWxpbmVzLXBlci1mdW5jdGlvblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUNvbXBpbGVyUGx1Z2luKFxuICBwbHVnaW5PcHRpb25zOiBDb21waWxlclBsdWdpbk9wdGlvbnMsXG4gIHN0eWxlT3B0aW9uczogQnVuZGxlU3R5bGVzaGVldE9wdGlvbnMgJiB7IGlubGluZVN0eWxlTGFuZ3VhZ2U6IHN0cmluZyB9LFxuKTogUGx1Z2luIHtcbiAgcmV0dXJuIHtcbiAgICBuYW1lOiAnYW5ndWxhci1jb21waWxlcicsXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG1heC1saW5lcy1wZXItZnVuY3Rpb25cbiAgICBhc3luYyBzZXR1cChidWlsZDogUGx1Z2luQnVpbGQpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgIGxldCBzZXR1cFdhcm5pbmdzOiBQYXJ0aWFsTWVzc2FnZVtdIHwgdW5kZWZpbmVkID0gW107XG4gICAgICBjb25zdCBwcmVzZXJ2ZVN5bWxpbmtzID0gYnVpbGQuaW5pdGlhbE9wdGlvbnMucHJlc2VydmVTeW1saW5rcztcblxuICAgICAgbGV0IHRzY29uZmlnUGF0aCA9IHBsdWdpbk9wdGlvbnMudHNjb25maWc7XG4gICAgICBpZiAoIXByZXNlcnZlU3ltbGlua3MpIHtcbiAgICAgICAgLy8gVXNlIHRoZSByZWFsIHBhdGggb2YgdGhlIHRzY29uZmlnIGlmIG5vdCBwcmVzZXJ2aW5nIHN5bWxpbmtzLlxuICAgICAgICAvLyBUaGlzIGVuc3VyZXMgdGhlIFRTIHNvdXJjZSBmaWxlIHBhdGhzIGFyZSBiYXNlZCBvbiB0aGUgcmVhbCBwYXRoIG9mIHRoZSBjb25maWd1cmF0aW9uLlxuICAgICAgICB0cnkge1xuICAgICAgICAgIHRzY29uZmlnUGF0aCA9IGF3YWl0IHJlYWxwYXRoKHRzY29uZmlnUGF0aCk7XG4gICAgICAgIH0gY2F0Y2gge31cbiAgICAgIH1cblxuICAgICAgLy8gSW5pdGlhbGl6ZSBhIHdvcmtlciBwb29sIGZvciBKYXZhU2NyaXB0IHRyYW5zZm9ybWF0aW9uc1xuICAgICAgY29uc3QgamF2YXNjcmlwdFRyYW5zZm9ybWVyID0gbmV3IEphdmFTY3JpcHRUcmFuc2Zvcm1lcihwbHVnaW5PcHRpb25zLCBtYXhXb3JrZXJzKTtcblxuICAgICAgLy8gU2V0dXAgZGVmaW5lcyBiYXNlZCBvbiB0aGUgdmFsdWVzIHVzZWQgYnkgdGhlIEFuZ3VsYXIgY29tcGlsZXItY2xpXG4gICAgICBidWlsZC5pbml0aWFsT3B0aW9ucy5kZWZpbmUgPz89IHt9O1xuICAgICAgYnVpbGQuaW5pdGlhbE9wdGlvbnMuZGVmaW5lWyduZ0kxOG5DbG9zdXJlTW9kZSddID8/PSAnZmFsc2UnO1xuXG4gICAgICAvLyBUaGUgaW4tbWVtb3J5IGNhY2hlIG9mIFR5cGVTY3JpcHQgZmlsZSBvdXRwdXRzIHdpbGwgYmUgdXNlZCBkdXJpbmcgdGhlIGJ1aWxkIGluIGBvbkxvYWRgIGNhbGxiYWNrcyBmb3IgVFMgZmlsZXMuXG4gICAgICAvLyBBIHN0cmluZyB2YWx1ZSBpbmRpY2F0ZXMgZGlyZWN0IFRTL05HIG91dHB1dCBhbmQgYSBVaW50OEFycmF5IGluZGljYXRlcyBmdWxseSB0cmFuc2Zvcm1lZCBjb2RlLlxuICAgICAgY29uc3QgdHlwZVNjcmlwdEZpbGVDYWNoZSA9XG4gICAgICAgIHBsdWdpbk9wdGlvbnMuc291cmNlRmlsZUNhY2hlPy50eXBlU2NyaXB0RmlsZUNhY2hlID8/XG4gICAgICAgIG5ldyBNYXA8c3RyaW5nLCBzdHJpbmcgfCBVaW50OEFycmF5PigpO1xuXG4gICAgICAvLyBUaGUgc3R5bGVzaGVldCByZXNvdXJjZXMgZnJvbSBjb21wb25lbnQgc3R5bGVzaGVldHMgdGhhdCB3aWxsIGJlIGFkZGVkIHRvIHRoZSBidWlsZCByZXN1bHRzIG91dHB1dCBmaWxlc1xuICAgICAgbGV0IGFkZGl0aW9uYWxPdXRwdXRGaWxlczogT3V0cHV0RmlsZVtdID0gW107XG4gICAgICBsZXQgYWRkaXRpb25hbE1ldGFmaWxlczogTWV0YWZpbGVbXTtcblxuICAgICAgLy8gQ3JlYXRlIG5ldyByZXVzYWJsZSBjb21waWxhdGlvbiBmb3IgdGhlIGFwcHJvcHJpYXRlIG1vZGUgYmFzZWQgb24gdGhlIGBqaXRgIHBsdWdpbiBvcHRpb25cbiAgICAgIGNvbnN0IGNvbXBpbGF0aW9uOiBBbmd1bGFyQ29tcGlsYXRpb24gPSBwbHVnaW5PcHRpb25zLm5vb3BUeXBlU2NyaXB0Q29tcGlsYXRpb25cbiAgICAgICAgPyBuZXcgTm9vcENvbXBpbGF0aW9uKClcbiAgICAgICAgOiBwbHVnaW5PcHRpb25zLmppdFxuICAgICAgICA/IG5ldyBKaXRDb21waWxhdGlvbigpXG4gICAgICAgIDogbmV3IEFvdENvbXBpbGF0aW9uKCk7XG5cbiAgICAgIC8vIERldGVybWluZXMgaWYgVHlwZVNjcmlwdCBzaG91bGQgcHJvY2VzcyBKYXZhU2NyaXB0IGZpbGVzIGJhc2VkIG9uIHRzY29uZmlnIGBhbGxvd0pzYCBvcHRpb25cbiAgICAgIGxldCBzaG91bGRUc0lnbm9yZUpzID0gdHJ1ZTtcblxuICAgICAgLy8gVHJhY2sgaW5jcmVtZW50YWwgY29tcG9uZW50IHN0eWxlc2hlZXQgYnVpbGRzXG4gICAgICBjb25zdCBzdHlsZXNoZWV0QnVuZGxlciA9IG5ldyBDb21wb25lbnRTdHlsZXNoZWV0QnVuZGxlcihcbiAgICAgICAgc3R5bGVPcHRpb25zLFxuICAgICAgICBwbHVnaW5PcHRpb25zLmxvYWRSZXN1bHRDYWNoZSxcbiAgICAgICk7XG4gICAgICBsZXQgc2hhcmVkVFNDb21waWxhdGlvblN0YXRlOiBTaGFyZWRUU0NvbXBpbGF0aW9uU3RhdGUgfCB1bmRlZmluZWQ7XG5cbiAgICAgIGJ1aWxkLm9uU3RhcnQoYXN5bmMgKCkgPT4ge1xuICAgICAgICBzaGFyZWRUU0NvbXBpbGF0aW9uU3RhdGUgPSBnZXRTaGFyZWRDb21waWxhdGlvblN0YXRlKCk7XG4gICAgICAgIGlmICghKGNvbXBpbGF0aW9uIGluc3RhbmNlb2YgTm9vcENvbXBpbGF0aW9uKSkge1xuICAgICAgICAgIHNoYXJlZFRTQ29tcGlsYXRpb25TdGF0ZS5tYXJrQXNJblByb2dyZXNzKCk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCByZXN1bHQ6IE9uU3RhcnRSZXN1bHQgPSB7XG4gICAgICAgICAgd2FybmluZ3M6IHNldHVwV2FybmluZ3MsXG4gICAgICAgIH07XG5cbiAgICAgICAgLy8gUmVzZXQgZGVidWcgcGVyZm9ybWFuY2UgdHJhY2tpbmdcbiAgICAgICAgcmVzZXRDdW11bGF0aXZlRHVyYXRpb25zKCk7XG5cbiAgICAgICAgLy8gUmVzZXQgYWRkaXRpb25hbCBvdXRwdXQgZmlsZXNcbiAgICAgICAgYWRkaXRpb25hbE91dHB1dEZpbGVzID0gW107XG4gICAgICAgIGFkZGl0aW9uYWxNZXRhZmlsZXMgPSBbXTtcblxuICAgICAgICAvLyBDcmVhdGUgQW5ndWxhciBjb21waWxlciBob3N0IG9wdGlvbnNcbiAgICAgICAgY29uc3QgaG9zdE9wdGlvbnM6IEFuZ3VsYXJIb3N0T3B0aW9ucyA9IHtcbiAgICAgICAgICBmaWxlUmVwbGFjZW1lbnRzOiBwbHVnaW5PcHRpb25zLmZpbGVSZXBsYWNlbWVudHMsXG4gICAgICAgICAgbW9kaWZpZWRGaWxlczogcGx1Z2luT3B0aW9ucy5zb3VyY2VGaWxlQ2FjaGU/Lm1vZGlmaWVkRmlsZXMsXG4gICAgICAgICAgc291cmNlRmlsZUNhY2hlOiBwbHVnaW5PcHRpb25zLnNvdXJjZUZpbGVDYWNoZSxcbiAgICAgICAgICBhc3luYyB0cmFuc2Zvcm1TdHlsZXNoZWV0KGRhdGEsIGNvbnRhaW5pbmdGaWxlLCBzdHlsZXNoZWV0RmlsZSkge1xuICAgICAgICAgICAgbGV0IHN0eWxlc2hlZXRSZXN1bHQ7XG5cbiAgICAgICAgICAgIC8vIFN0eWxlc2hlZXQgZmlsZSBvbmx5IGV4aXN0cyBmb3IgZXh0ZXJuYWwgc3R5bGVzaGVldHNcbiAgICAgICAgICAgIGlmIChzdHlsZXNoZWV0RmlsZSkge1xuICAgICAgICAgICAgICBzdHlsZXNoZWV0UmVzdWx0ID0gYXdhaXQgc3R5bGVzaGVldEJ1bmRsZXIuYnVuZGxlRmlsZShzdHlsZXNoZWV0RmlsZSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBzdHlsZXNoZWV0UmVzdWx0ID0gYXdhaXQgc3R5bGVzaGVldEJ1bmRsZXIuYnVuZGxlSW5saW5lKFxuICAgICAgICAgICAgICAgIGRhdGEsXG4gICAgICAgICAgICAgICAgY29udGFpbmluZ0ZpbGUsXG4gICAgICAgICAgICAgICAgc3R5bGVPcHRpb25zLmlubGluZVN0eWxlTGFuZ3VhZ2UsXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IHsgY29udGVudHMsIHJlc291cmNlRmlsZXMsIGVycm9ycywgd2FybmluZ3MgfSA9IHN0eWxlc2hlZXRSZXN1bHQ7XG4gICAgICAgICAgICBpZiAoZXJyb3JzKSB7XG4gICAgICAgICAgICAgIChyZXN1bHQuZXJyb3JzID8/PSBbXSkucHVzaCguLi5lcnJvcnMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgKHJlc3VsdC53YXJuaW5ncyA/Pz0gW10pLnB1c2goLi4ud2FybmluZ3MpO1xuICAgICAgICAgICAgYWRkaXRpb25hbE91dHB1dEZpbGVzLnB1c2goLi4ucmVzb3VyY2VGaWxlcyk7XG4gICAgICAgICAgICBpZiAoc3R5bGVzaGVldFJlc3VsdC5tZXRhZmlsZSkge1xuICAgICAgICAgICAgICBhZGRpdGlvbmFsTWV0YWZpbGVzLnB1c2goc3R5bGVzaGVldFJlc3VsdC5tZXRhZmlsZSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiBjb250ZW50cztcbiAgICAgICAgICB9LFxuICAgICAgICAgIHByb2Nlc3NXZWJXb3JrZXIod29ya2VyRmlsZSwgY29udGFpbmluZ0ZpbGUpIHtcbiAgICAgICAgICAgIGNvbnN0IGZ1bGxXb3JrZXJQYXRoID0gcGF0aC5qb2luKHBhdGguZGlybmFtZShjb250YWluaW5nRmlsZSksIHdvcmtlckZpbGUpO1xuICAgICAgICAgICAgLy8gVGhlIHN5bmNocm9ub3VzIEFQSSBtdXN0IGJlIHVzZWQgZHVlIHRvIHRoZSBUeXBlU2NyaXB0IGNvbXBpbGF0aW9uIGN1cnJlbnRseSBiZWluZ1xuICAgICAgICAgICAgLy8gZnVsbHkgc3luY2hyb25vdXMgYW5kIHRoaXMgcHJvY2VzcyBjYWxsYmFjayBiZWluZyBjYWxsZWQgZnJvbSB3aXRoaW4gYSBUeXBlU2NyaXB0XG4gICAgICAgICAgICAvLyB0cmFuc2Zvcm1lci5cbiAgICAgICAgICAgIGNvbnN0IHdvcmtlclJlc3VsdCA9IGJ1aWxkLmVzYnVpbGQuYnVpbGRTeW5jKHtcbiAgICAgICAgICAgICAgcGxhdGZvcm06ICdicm93c2VyJyxcbiAgICAgICAgICAgICAgd3JpdGU6IGZhbHNlLFxuICAgICAgICAgICAgICBidW5kbGU6IHRydWUsXG4gICAgICAgICAgICAgIG1ldGFmaWxlOiB0cnVlLFxuICAgICAgICAgICAgICBmb3JtYXQ6ICdlc20nLFxuICAgICAgICAgICAgICBtYWluRmllbGRzOiBbJ2VzMjAyMCcsICdlczIwMTUnLCAnYnJvd3NlcicsICdtb2R1bGUnLCAnbWFpbiddLFxuICAgICAgICAgICAgICBzb3VyY2VtYXA6IHBsdWdpbk9wdGlvbnMuc291cmNlbWFwLFxuICAgICAgICAgICAgICBlbnRyeU5hbWVzOiAnd29ya2VyLVtoYXNoXScsXG4gICAgICAgICAgICAgIGVudHJ5UG9pbnRzOiBbZnVsbFdvcmtlclBhdGhdLFxuICAgICAgICAgICAgICBhYnNXb3JraW5nRGlyOiBidWlsZC5pbml0aWFsT3B0aW9ucy5hYnNXb3JraW5nRGlyLFxuICAgICAgICAgICAgICBvdXRkaXI6IGJ1aWxkLmluaXRpYWxPcHRpb25zLm91dGRpcixcbiAgICAgICAgICAgICAgbWluaWZ5SWRlbnRpZmllcnM6IGJ1aWxkLmluaXRpYWxPcHRpb25zLm1pbmlmeUlkZW50aWZpZXJzLFxuICAgICAgICAgICAgICBtaW5pZnlTeW50YXg6IGJ1aWxkLmluaXRpYWxPcHRpb25zLm1pbmlmeVN5bnRheCxcbiAgICAgICAgICAgICAgbWluaWZ5V2hpdGVzcGFjZTogYnVpbGQuaW5pdGlhbE9wdGlvbnMubWluaWZ5V2hpdGVzcGFjZSxcbiAgICAgICAgICAgICAgdGFyZ2V0OiBidWlsZC5pbml0aWFsT3B0aW9ucy50YXJnZXQsXG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgKHJlc3VsdC53YXJuaW5ncyA/Pz0gW10pLnB1c2goLi4ud29ya2VyUmVzdWx0Lndhcm5pbmdzKTtcbiAgICAgICAgICAgIGFkZGl0aW9uYWxPdXRwdXRGaWxlcy5wdXNoKC4uLndvcmtlclJlc3VsdC5vdXRwdXRGaWxlcyk7XG4gICAgICAgICAgICBpZiAod29ya2VyUmVzdWx0Lm1ldGFmaWxlKSB7XG4gICAgICAgICAgICAgIGFkZGl0aW9uYWxNZXRhZmlsZXMucHVzaCh3b3JrZXJSZXN1bHQubWV0YWZpbGUpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAod29ya2VyUmVzdWx0LmVycm9ycy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgIChyZXN1bHQuZXJyb3JzID8/PSBbXSkucHVzaCguLi53b3JrZXJSZXN1bHQuZXJyb3JzKTtcblxuICAgICAgICAgICAgICAvLyBSZXR1cm4gdGhlIG9yaWdpbmFsIHBhdGggaWYgdGhlIGJ1aWxkIGZhaWxlZFxuICAgICAgICAgICAgICByZXR1cm4gd29ya2VyRmlsZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gUmV0dXJuIGJ1bmRsZWQgd29ya2VyIGZpbGUgZW50cnkgbmFtZSB0byBiZSB1c2VkIGluIHRoZSBidWlsdCBvdXRwdXRcbiAgICAgICAgICAgIGNvbnN0IHdvcmtlckNvZGVGaWxlID0gd29ya2VyUmVzdWx0Lm91dHB1dEZpbGVzLmZpbmQoKGZpbGUpID0+XG4gICAgICAgICAgICAgIGZpbGUucGF0aC5lbmRzV2l0aCgnLmpzJyksXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgYXNzZXJ0KHdvcmtlckNvZGVGaWxlLCAnV2ViIFdvcmtlciBidW5kbGVkIGNvZGUgZmlsZSBzaG91bGQgYWx3YXlzIGJlIHByZXNlbnQuJyk7XG5cbiAgICAgICAgICAgIHJldHVybiBwYXRoLnJlbGF0aXZlKGJ1aWxkLmluaXRpYWxPcHRpb25zLm91dGRpciA/PyAnJywgd29ya2VyQ29kZUZpbGUucGF0aCk7XG4gICAgICAgICAgfSxcbiAgICAgICAgfTtcblxuICAgICAgICAvLyBJbml0aWFsaXplIHRoZSBBbmd1bGFyIGNvbXBpbGF0aW9uIGZvciB0aGUgY3VycmVudCBidWlsZC5cbiAgICAgICAgLy8gSW4gd2F0Y2ggbW9kZSwgcHJldmlvdXMgYnVpbGQgc3RhdGUgd2lsbCBiZSByZXVzZWQuXG4gICAgICAgIGNvbnN0IHtcbiAgICAgICAgICBjb21waWxlck9wdGlvbnM6IHsgYWxsb3dKcyB9LFxuICAgICAgICAgIHJlZmVyZW5jZWRGaWxlcyxcbiAgICAgICAgfSA9IGF3YWl0IGNvbXBpbGF0aW9uLmluaXRpYWxpemUodHNjb25maWdQYXRoLCBob3N0T3B0aW9ucywgKGNvbXBpbGVyT3B0aW9ucykgPT4ge1xuICAgICAgICAgIGlmIChcbiAgICAgICAgICAgIGNvbXBpbGVyT3B0aW9ucy50YXJnZXQgPT09IHVuZGVmaW5lZCB8fFxuICAgICAgICAgICAgY29tcGlsZXJPcHRpb25zLnRhcmdldCA8IHRzLlNjcmlwdFRhcmdldC5FUzIwMjJcbiAgICAgICAgICApIHtcbiAgICAgICAgICAgIC8vIElmICd1c2VEZWZpbmVGb3JDbGFzc0ZpZWxkcycgaXMgYWxyZWFkeSBkZWZpbmVkIGluIHRoZSB1c2VycyBwcm9qZWN0IGxlYXZlIHRoZSB2YWx1ZSBhcyBpcy5cbiAgICAgICAgICAgIC8vIE90aGVyd2lzZSBmYWxsYmFjayB0byBmYWxzZSBkdWUgdG8gaHR0cHM6Ly9naXRodWIuY29tL21pY3Jvc29mdC9UeXBlU2NyaXB0L2lzc3Vlcy80NTk5NVxuICAgICAgICAgICAgLy8gd2hpY2ggYnJlYWtzIHRoZSBkZXByZWNhdGVkIGBARWZmZWN0c2AgTkdSWCBkZWNvcmF0b3IgYW5kIHBvdGVudGlhbGx5IG90aGVyIGV4aXN0aW5nIGNvZGUgYXMgd2VsbC5cbiAgICAgICAgICAgIGNvbXBpbGVyT3B0aW9ucy50YXJnZXQgPSB0cy5TY3JpcHRUYXJnZXQuRVMyMDIyO1xuICAgICAgICAgICAgY29tcGlsZXJPcHRpb25zLnVzZURlZmluZUZvckNsYXNzRmllbGRzID8/PSBmYWxzZTtcblxuICAgICAgICAgICAgLy8gT25seSBhZGQgdGhlIHdhcm5pbmcgb24gdGhlIGluaXRpYWwgYnVpbGRcbiAgICAgICAgICAgIHNldHVwV2FybmluZ3M/LnB1c2goe1xuICAgICAgICAgICAgICB0ZXh0OlxuICAgICAgICAgICAgICAgICdUeXBlU2NyaXB0IGNvbXBpbGVyIG9wdGlvbnMgXCJ0YXJnZXRcIiBhbmQgXCJ1c2VEZWZpbmVGb3JDbGFzc0ZpZWxkc1wiIGFyZSBzZXQgdG8gXCJFUzIwMjJcIiBhbmQgJyArXG4gICAgICAgICAgICAgICAgJ1wiZmFsc2VcIiByZXNwZWN0aXZlbHkgYnkgdGhlIEFuZ3VsYXIgQ0xJLicsXG4gICAgICAgICAgICAgIGxvY2F0aW9uOiB7IGZpbGU6IHBsdWdpbk9wdGlvbnMudHNjb25maWcgfSxcbiAgICAgICAgICAgICAgbm90ZXM6IFtcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICB0ZXh0OlxuICAgICAgICAgICAgICAgICAgICAnVG8gY29udHJvbCBFQ01BIHZlcnNpb24gYW5kIGZlYXR1cmVzIHVzZSB0aGUgQnJvd2Vyc2xpc3QgY29uZmlndXJhdGlvbi4gJyArXG4gICAgICAgICAgICAgICAgICAgICdGb3IgbW9yZSBpbmZvcm1hdGlvbiwgc2VlIGh0dHBzOi8vYW5ndWxhci5pby9ndWlkZS9idWlsZCNjb25maWd1cmluZy1icm93c2VyLWNvbXBhdGliaWxpdHknLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBFbmFibGUgaW5jcmVtZW50YWwgY29tcGlsYXRpb24gYnkgZGVmYXVsdCBpZiBjYWNoaW5nIGlzIGVuYWJsZWRcbiAgICAgICAgICBpZiAocGx1Z2luT3B0aW9ucy5zb3VyY2VGaWxlQ2FjaGU/LnBlcnNpc3RlbnRDYWNoZVBhdGgpIHtcbiAgICAgICAgICAgIGNvbXBpbGVyT3B0aW9ucy5pbmNyZW1lbnRhbCA/Pz0gdHJ1ZTtcbiAgICAgICAgICAgIC8vIFNldCB0aGUgYnVpbGQgaW5mbyBmaWxlIGxvY2F0aW9uIHRvIHRoZSBjb25maWd1cmVkIGNhY2hlIGRpcmVjdG9yeVxuICAgICAgICAgICAgY29tcGlsZXJPcHRpb25zLnRzQnVpbGRJbmZvRmlsZSA9IHBhdGguam9pbihcbiAgICAgICAgICAgICAgcGx1Z2luT3B0aW9ucy5zb3VyY2VGaWxlQ2FjaGU/LnBlcnNpc3RlbnRDYWNoZVBhdGgsXG4gICAgICAgICAgICAgICcudHNidWlsZGluZm8nLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29tcGlsZXJPcHRpb25zLmluY3JlbWVudGFsID0gZmFsc2U7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIC4uLmNvbXBpbGVyT3B0aW9ucyxcbiAgICAgICAgICAgIG5vRW1pdE9uRXJyb3I6IGZhbHNlLFxuICAgICAgICAgICAgaW5saW5lU291cmNlczogcGx1Z2luT3B0aW9ucy5zb3VyY2VtYXAsXG4gICAgICAgICAgICBpbmxpbmVTb3VyY2VNYXA6IHBsdWdpbk9wdGlvbnMuc291cmNlbWFwLFxuICAgICAgICAgICAgbWFwUm9vdDogdW5kZWZpbmVkLFxuICAgICAgICAgICAgc291cmNlUm9vdDogdW5kZWZpbmVkLFxuICAgICAgICAgICAgcHJlc2VydmVTeW1saW5rcyxcbiAgICAgICAgICB9O1xuICAgICAgICB9KTtcbiAgICAgICAgc2hvdWxkVHNJZ25vcmVKcyA9ICFhbGxvd0pzO1xuXG4gICAgICAgIGlmIChjb21waWxhdGlvbiBpbnN0YW5jZW9mIE5vb3BDb21waWxhdGlvbikge1xuICAgICAgICAgIGF3YWl0IHNoYXJlZFRTQ29tcGlsYXRpb25TdGF0ZS53YWl0VW50aWxSZWFkeTtcblxuICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBkaWFnbm9zdGljcyA9IGF3YWl0IGNvbXBpbGF0aW9uLmRpYWdub3NlRmlsZXMoKTtcbiAgICAgICAgaWYgKGRpYWdub3N0aWNzLmVycm9ycykge1xuICAgICAgICAgIChyZXN1bHQuZXJyb3JzID8/PSBbXSkucHVzaCguLi5kaWFnbm9zdGljcy5lcnJvcnMpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChkaWFnbm9zdGljcy53YXJuaW5ncykge1xuICAgICAgICAgIChyZXN1bHQud2FybmluZ3MgPz89IFtdKS5wdXNoKC4uLmRpYWdub3N0aWNzLndhcm5pbmdzKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFVwZGF0ZSBUeXBlU2NyaXB0IGZpbGUgb3V0cHV0IGNhY2hlIGZvciBhbGwgYWZmZWN0ZWQgZmlsZXNcbiAgICAgICAgcHJvZmlsZVN5bmMoJ05HX0VNSVRfVFMnLCAoKSA9PiB7XG4gICAgICAgICAgZm9yIChjb25zdCB7IGZpbGVuYW1lLCBjb250ZW50cyB9IG9mIGNvbXBpbGF0aW9uLmVtaXRBZmZlY3RlZEZpbGVzKCkpIHtcbiAgICAgICAgICAgIHR5cGVTY3JpcHRGaWxlQ2FjaGUuc2V0KHBhdGhUb0ZpbGVVUkwoZmlsZW5hbWUpLmhyZWYsIGNvbnRlbnRzKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIFN0b3JlIHJlZmVyZW5jZWQgZmlsZXMgZm9yIHVwZGF0ZWQgZmlsZSB3YXRjaGluZyBpZiBlbmFibGVkXG4gICAgICAgIGlmIChwbHVnaW5PcHRpb25zLnNvdXJjZUZpbGVDYWNoZSkge1xuICAgICAgICAgIHBsdWdpbk9wdGlvbnMuc291cmNlRmlsZUNhY2hlLnJlZmVyZW5jZWRGaWxlcyA9IHJlZmVyZW5jZWRGaWxlcztcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFJlc2V0IHRoZSBzZXR1cCB3YXJuaW5ncyBzbyB0aGF0IHRoZXkgYXJlIG9ubHkgc2hvd24gZHVyaW5nIHRoZSBmaXJzdCBidWlsZC5cbiAgICAgICAgc2V0dXBXYXJuaW5ncyA9IHVuZGVmaW5lZDtcblxuICAgICAgICBzaGFyZWRUU0NvbXBpbGF0aW9uU3RhdGUubWFya0FzUmVhZHkoKTtcblxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgfSk7XG5cbiAgICAgIGJ1aWxkLm9uTG9hZCh7IGZpbHRlcjogL1xcLltjbV0/W2p0XXN4PyQvIH0sIGFzeW5jIChhcmdzKSA9PiB7XG4gICAgICAgIGNvbnN0IHJlcXVlc3QgPSBwbHVnaW5PcHRpb25zLmZpbGVSZXBsYWNlbWVudHM/LlthcmdzLnBhdGhdID8/IGFyZ3MucGF0aDtcblxuICAgICAgICAvLyBTa2lwIFRTIGxvYWQgYXR0ZW1wdCBpZiBKUyBUeXBlU2NyaXB0IGNvbXBpbGF0aW9uIG5vdCBlbmFibGVkIGFuZCBmaWxlIGlzIEpTXG4gICAgICAgIGlmIChzaG91bGRUc0lnbm9yZUpzICYmIC9cXC5bY21dP2pzJC8udGVzdChyZXF1ZXN0KSkge1xuICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBUaGUgZmlsZW5hbWUgaXMgY3VycmVudGx5IHVzZWQgYXMgYSBjYWNoZSBrZXkuIFNpbmNlIHRoZSBjYWNoZSBpcyBtZW1vcnkgb25seSxcbiAgICAgICAgLy8gdGhlIG9wdGlvbnMgY2Fubm90IGNoYW5nZSBhbmQgZG8gbm90IG5lZWQgdG8gYmUgcmVwcmVzZW50ZWQgaW4gdGhlIGtleS4gSWYgdGhlXG4gICAgICAgIC8vIGNhY2hlIGlzIGxhdGVyIHN0b3JlZCB0byBkaXNrLCB0aGVuIHRoZSBvcHRpb25zIHRoYXQgYWZmZWN0IHRyYW5zZm9ybSBvdXRwdXRcbiAgICAgICAgLy8gd291bGQgbmVlZCB0byBiZSBhZGRlZCB0byB0aGUga2V5IGFzIHdlbGwgYXMgYSBjaGVjayBmb3IgYW55IGNoYW5nZSBvZiBjb250ZW50LlxuICAgICAgICBsZXQgY29udGVudHMgPSB0eXBlU2NyaXB0RmlsZUNhY2hlLmdldChwYXRoVG9GaWxlVVJMKHJlcXVlc3QpLmhyZWYpO1xuXG4gICAgICAgIGlmIChjb250ZW50cyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgLy8gTm8gVFMgcmVzdWx0IGluZGljYXRlcyB0aGUgZmlsZSBpcyBub3QgcGFydCBvZiB0aGUgVHlwZVNjcmlwdCBwcm9ncmFtLlxuICAgICAgICAgIC8vIElmIGFsbG93SnMgaXMgZW5hYmxlZCBhbmQgdGhlIGZpbGUgaXMgSlMgdGhlbiBkZWZlciB0byB0aGUgbmV4dCBsb2FkIGhvb2suXG4gICAgICAgICAgaWYgKCFzaG91bGRUc0lnbm9yZUpzICYmIC9cXC5bY21dP2pzJC8udGVzdChyZXF1ZXN0KSkge1xuICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBPdGhlcndpc2UgcmV0dXJuIGFuIGVycm9yXG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGVycm9yczogW1xuICAgICAgICAgICAgICBjcmVhdGVNaXNzaW5nRmlsZUVycm9yKHJlcXVlc3QsIGFyZ3MucGF0aCwgYnVpbGQuaW5pdGlhbE9wdGlvbnMuYWJzV29ya2luZ0RpciA/PyAnJyksXG4gICAgICAgICAgICBdLFxuICAgICAgICAgIH07XG4gICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIGNvbnRlbnRzID09PSAnc3RyaW5nJykge1xuICAgICAgICAgIC8vIEEgc3RyaW5nIGluZGljYXRlcyB1bnRyYW5zZm9ybWVkIG91dHB1dCBmcm9tIHRoZSBUUy9ORyBjb21waWxlclxuICAgICAgICAgIGNvbnRlbnRzID0gYXdhaXQgamF2YXNjcmlwdFRyYW5zZm9ybWVyLnRyYW5zZm9ybURhdGEoXG4gICAgICAgICAgICByZXF1ZXN0LFxuICAgICAgICAgICAgY29udGVudHMsXG4gICAgICAgICAgICB0cnVlIC8qIHNraXBMaW5rZXIgKi8sXG4gICAgICAgICAgKTtcblxuICAgICAgICAgIC8vIFN0b3JlIGFzIHRoZSByZXR1cm5lZCBVaW50OEFycmF5IHRvIGFsbG93IGNhY2hpbmcgdGhlIGZ1bGx5IHRyYW5zZm9ybWVkIGNvZGVcbiAgICAgICAgICB0eXBlU2NyaXB0RmlsZUNhY2hlLnNldChwYXRoVG9GaWxlVVJMKHJlcXVlc3QpLmhyZWYsIGNvbnRlbnRzKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgY29udGVudHMsXG4gICAgICAgICAgbG9hZGVyOiAnanMnLFxuICAgICAgICB9O1xuICAgICAgfSk7XG5cbiAgICAgIGJ1aWxkLm9uTG9hZCh7IGZpbHRlcjogL1xcLltjbV0/anMkLyB9LCAoYXJncykgPT5cbiAgICAgICAgcHJvZmlsZUFzeW5jKFxuICAgICAgICAgICdOR19FTUlUX0pTKicsXG4gICAgICAgICAgYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgLy8gVGhlIGZpbGVuYW1lIGlzIGN1cnJlbnRseSB1c2VkIGFzIGEgY2FjaGUga2V5LiBTaW5jZSB0aGUgY2FjaGUgaXMgbWVtb3J5IG9ubHksXG4gICAgICAgICAgICAvLyB0aGUgb3B0aW9ucyBjYW5ub3QgY2hhbmdlIGFuZCBkbyBub3QgbmVlZCB0byBiZSByZXByZXNlbnRlZCBpbiB0aGUga2V5LiBJZiB0aGVcbiAgICAgICAgICAgIC8vIGNhY2hlIGlzIGxhdGVyIHN0b3JlZCB0byBkaXNrLCB0aGVuIHRoZSBvcHRpb25zIHRoYXQgYWZmZWN0IHRyYW5zZm9ybSBvdXRwdXRcbiAgICAgICAgICAgIC8vIHdvdWxkIG5lZWQgdG8gYmUgYWRkZWQgdG8gdGhlIGtleSBhcyB3ZWxsIGFzIGEgY2hlY2sgZm9yIGFueSBjaGFuZ2Ugb2YgY29udGVudC5cbiAgICAgICAgICAgIGxldCBjb250ZW50cyA9IHBsdWdpbk9wdGlvbnMuc291cmNlRmlsZUNhY2hlPy5iYWJlbEZpbGVDYWNoZS5nZXQoYXJncy5wYXRoKTtcbiAgICAgICAgICAgIGlmIChjb250ZW50cyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgIGNvbnRlbnRzID0gYXdhaXQgamF2YXNjcmlwdFRyYW5zZm9ybWVyLnRyYW5zZm9ybUZpbGUoYXJncy5wYXRoLCBwbHVnaW5PcHRpb25zLmppdCk7XG4gICAgICAgICAgICAgIHBsdWdpbk9wdGlvbnMuc291cmNlRmlsZUNhY2hlPy5iYWJlbEZpbGVDYWNoZS5zZXQoYXJncy5wYXRoLCBjb250ZW50cyk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgIGNvbnRlbnRzLFxuICAgICAgICAgICAgICBsb2FkZXI6ICdqcycsXG4gICAgICAgICAgICB9O1xuICAgICAgICAgIH0sXG4gICAgICAgICAgdHJ1ZSxcbiAgICAgICAgKSxcbiAgICAgICk7XG5cbiAgICAgIC8vIFNldHVwIGJ1bmRsaW5nIG9mIGNvbXBvbmVudCB0ZW1wbGF0ZXMgYW5kIHN0eWxlc2hlZXRzIHdoZW4gaW4gSklUIG1vZGVcbiAgICAgIGlmIChwbHVnaW5PcHRpb25zLmppdCkge1xuICAgICAgICBzZXR1cEppdFBsdWdpbkNhbGxiYWNrcyhcbiAgICAgICAgICBidWlsZCxcbiAgICAgICAgICBzdHlsZXNoZWV0QnVuZGxlcixcbiAgICAgICAgICBhZGRpdGlvbmFsT3V0cHV0RmlsZXMsXG4gICAgICAgICAgc3R5bGVPcHRpb25zLmlubGluZVN0eWxlTGFuZ3VhZ2UsXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIGJ1aWxkLm9uRW5kKChyZXN1bHQpID0+IHtcbiAgICAgICAgLy8gQWRkIGFueSBhZGRpdGlvbmFsIG91dHB1dCBmaWxlcyB0byB0aGUgbWFpbiBvdXRwdXQgZmlsZXNcbiAgICAgICAgaWYgKGFkZGl0aW9uYWxPdXRwdXRGaWxlcy5sZW5ndGgpIHtcbiAgICAgICAgICByZXN1bHQub3V0cHV0RmlsZXM/LnB1c2goLi4uYWRkaXRpb25hbE91dHB1dEZpbGVzKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIENvbWJpbmUgYWRkaXRpb25hbCBtZXRhZmlsZXMgd2l0aCBtYWluIG1ldGFmaWxlXG4gICAgICAgIGlmIChyZXN1bHQubWV0YWZpbGUgJiYgYWRkaXRpb25hbE1ldGFmaWxlcy5sZW5ndGgpIHtcbiAgICAgICAgICBmb3IgKGNvbnN0IG1ldGFmaWxlIG9mIGFkZGl0aW9uYWxNZXRhZmlsZXMpIHtcbiAgICAgICAgICAgIHJlc3VsdC5tZXRhZmlsZS5pbnB1dHMgPSB7IC4uLnJlc3VsdC5tZXRhZmlsZS5pbnB1dHMsIC4uLm1ldGFmaWxlLmlucHV0cyB9O1xuICAgICAgICAgICAgcmVzdWx0Lm1ldGFmaWxlLm91dHB1dHMgPSB7IC4uLnJlc3VsdC5tZXRhZmlsZS5vdXRwdXRzLCAuLi5tZXRhZmlsZS5vdXRwdXRzIH07XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgbG9nQ3VtdWxhdGl2ZUR1cmF0aW9ucygpO1xuICAgICAgfSk7XG5cbiAgICAgIGJ1aWxkLm9uRGlzcG9zZSgoKSA9PiB7XG4gICAgICAgIHNoYXJlZFRTQ29tcGlsYXRpb25TdGF0ZT8uZGlzcG9zZSgpO1xuICAgICAgICB2b2lkIHN0eWxlc2hlZXRCdW5kbGVyLmRpc3Bvc2UoKTtcbiAgICAgIH0pO1xuICAgIH0sXG4gIH07XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZU1pc3NpbmdGaWxlRXJyb3IocmVxdWVzdDogc3RyaW5nLCBvcmlnaW5hbDogc3RyaW5nLCByb290OiBzdHJpbmcpOiBQYXJ0aWFsTWVzc2FnZSB7XG4gIGNvbnN0IGVycm9yID0ge1xuICAgIHRleHQ6IGBGaWxlICcke3BhdGgucmVsYXRpdmUocm9vdCwgcmVxdWVzdCl9JyBpcyBtaXNzaW5nIGZyb20gdGhlIFR5cGVTY3JpcHQgY29tcGlsYXRpb24uYCxcbiAgICBub3RlczogW1xuICAgICAge1xuICAgICAgICB0ZXh0OiBgRW5zdXJlIHRoZSBmaWxlIGlzIHBhcnQgb2YgdGhlIFR5cGVTY3JpcHQgcHJvZ3JhbSB2aWEgdGhlICdmaWxlcycgb3IgJ2luY2x1ZGUnIHByb3BlcnR5LmAsXG4gICAgICB9LFxuICAgIF0sXG4gIH07XG5cbiAgaWYgKHJlcXVlc3QgIT09IG9yaWdpbmFsKSB7XG4gICAgZXJyb3Iubm90ZXMucHVzaCh7XG4gICAgICB0ZXh0OiBgRmlsZSBpcyByZXF1ZXN0ZWQgZnJvbSBhIGZpbGUgcmVwbGFjZW1lbnQgb2YgJyR7cGF0aC5yZWxhdGl2ZShyb290LCBvcmlnaW5hbCl9Jy5gLFxuICAgIH0pO1xuICB9XG5cbiAgcmV0dXJuIGVycm9yO1xufVxuIl19
|
|
@@ -6,7 +6,6 @@
|
|
|
6
6
|
* found in the LICENSE file at https://angular.io/license
|
|
7
7
|
*/
|
|
8
8
|
import { OutputFile } from 'esbuild';
|
|
9
|
-
import { LoadResultCache } from '../load-result-cache';
|
|
10
9
|
import { BundleStylesheetOptions } from '../stylesheets/bundle-options';
|
|
11
10
|
/**
|
|
12
11
|
* Bundles component stylesheets. A stylesheet can be either an inline stylesheet that
|
|
@@ -16,13 +15,13 @@ import { BundleStylesheetOptions } from '../stylesheets/bundle-options';
|
|
|
16
15
|
export declare class ComponentStylesheetBundler {
|
|
17
16
|
#private;
|
|
18
17
|
private readonly options;
|
|
19
|
-
private readonly
|
|
18
|
+
private readonly incremental;
|
|
20
19
|
/**
|
|
21
20
|
*
|
|
22
21
|
* @param options An object containing the stylesheet bundling options.
|
|
23
22
|
* @param cache A load result cache to use when bundling.
|
|
24
23
|
*/
|
|
25
|
-
constructor(options: BundleStylesheetOptions,
|
|
24
|
+
constructor(options: BundleStylesheetOptions, incremental: boolean);
|
|
26
25
|
bundleFile(entry: string): Promise<{
|
|
27
26
|
errors: import("esbuild").Message[] | undefined;
|
|
28
27
|
warnings: import("esbuild").Message[];
|
|
@@ -43,5 +42,6 @@ export declare class ComponentStylesheetBundler {
|
|
|
43
42
|
metafile: import("esbuild").Metafile | undefined;
|
|
44
43
|
referencedFiles: Set<string> | undefined;
|
|
45
44
|
}>;
|
|
45
|
+
invalidate(files: Iterable<string>): void;
|
|
46
46
|
dispose(): Promise<void>;
|
|
47
47
|
}
|
|
@@ -32,7 +32,7 @@ class BundlerContextCache extends Map {
|
|
|
32
32
|
*/
|
|
33
33
|
class ComponentStylesheetBundler {
|
|
34
34
|
options;
|
|
35
|
-
|
|
35
|
+
incremental;
|
|
36
36
|
#fileContexts = new BundlerContextCache();
|
|
37
37
|
#inlineContexts = new BundlerContextCache();
|
|
38
38
|
/**
|
|
@@ -40,15 +40,17 @@ class ComponentStylesheetBundler {
|
|
|
40
40
|
* @param options An object containing the stylesheet bundling options.
|
|
41
41
|
* @param cache A load result cache to use when bundling.
|
|
42
42
|
*/
|
|
43
|
-
constructor(options,
|
|
43
|
+
constructor(options, incremental) {
|
|
44
44
|
this.options = options;
|
|
45
|
-
this.
|
|
45
|
+
this.incremental = incremental;
|
|
46
46
|
}
|
|
47
47
|
async bundleFile(entry) {
|
|
48
48
|
const bundlerContext = this.#fileContexts.getOrCreate(entry, () => {
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
49
|
+
return new bundler_context_1.BundlerContext(this.options.workspaceRoot, this.incremental, (loadCache) => {
|
|
50
|
+
const buildOptions = (0, bundle_options_1.createStylesheetBundleOptions)(this.options, loadCache);
|
|
51
|
+
buildOptions.entryPoints = [entry];
|
|
52
|
+
return buildOptions;
|
|
53
|
+
});
|
|
52
54
|
});
|
|
53
55
|
return extractResult(await bundlerContext.bundle(), bundlerContext.watchFiles);
|
|
54
56
|
}
|
|
@@ -60,36 +62,50 @@ class ComponentStylesheetBundler {
|
|
|
60
62
|
const entry = [language, id, filename].join(';');
|
|
61
63
|
const bundlerContext = this.#inlineContexts.getOrCreate(entry, () => {
|
|
62
64
|
const namespace = 'angular:styles/component';
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
build
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
65
|
+
return new bundler_context_1.BundlerContext(this.options.workspaceRoot, this.incremental, (loadCache) => {
|
|
66
|
+
const buildOptions = (0, bundle_options_1.createStylesheetBundleOptions)(this.options, loadCache, {
|
|
67
|
+
[entry]: data,
|
|
68
|
+
});
|
|
69
|
+
buildOptions.entryPoints = [`${namespace};${entry}`];
|
|
70
|
+
buildOptions.plugins.push({
|
|
71
|
+
name: 'angular-component-styles',
|
|
72
|
+
setup(build) {
|
|
73
|
+
build.onResolve({ filter: /^angular:styles\/component;/ }, (args) => {
|
|
74
|
+
if (args.kind !== 'entry-point') {
|
|
75
|
+
return null;
|
|
76
|
+
}
|
|
77
|
+
return {
|
|
78
|
+
path: entry,
|
|
79
|
+
namespace,
|
|
80
|
+
};
|
|
81
|
+
});
|
|
82
|
+
build.onLoad({ filter: /^css;/, namespace }, async () => {
|
|
83
|
+
return {
|
|
84
|
+
contents: data,
|
|
85
|
+
loader: 'css',
|
|
86
|
+
resolveDir: node_path_1.default.dirname(filename),
|
|
87
|
+
};
|
|
88
|
+
});
|
|
89
|
+
},
|
|
90
|
+
});
|
|
91
|
+
return buildOptions;
|
|
87
92
|
});
|
|
88
|
-
return new bundler_context_1.BundlerContext(this.options.workspaceRoot, true, buildOptions);
|
|
89
93
|
});
|
|
90
94
|
// Extract the result of the bundling from the output files
|
|
91
95
|
return extractResult(await bundlerContext.bundle(), bundlerContext.watchFiles);
|
|
92
96
|
}
|
|
97
|
+
invalidate(files) {
|
|
98
|
+
if (!this.incremental) {
|
|
99
|
+
return;
|
|
100
|
+
}
|
|
101
|
+
const normalizedFiles = [...files].map(node_path_1.default.normalize);
|
|
102
|
+
for (const bundler of this.#fileContexts.values()) {
|
|
103
|
+
bundler.invalidate(normalizedFiles);
|
|
104
|
+
}
|
|
105
|
+
for (const bundler of this.#inlineContexts.values()) {
|
|
106
|
+
bundler.invalidate(normalizedFiles);
|
|
107
|
+
}
|
|
108
|
+
}
|
|
93
109
|
async dispose() {
|
|
94
110
|
const contexts = [...this.#fileContexts.values(), ...this.#inlineContexts.values()];
|
|
95
111
|
this.#fileContexts.clear();
|
|
@@ -144,4 +160,3 @@ function extractResult(result, referencedFiles) {
|
|
|
144
160
|
referencedFiles,
|
|
145
161
|
};
|
|
146
162
|
}
|
|
147
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tcG9uZW50LXN0eWxlc2hlZXRzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vcGFja2FnZXMvYW5ndWxhcl9kZXZraXQvYnVpbGRfYW5ndWxhci9zcmMvdG9vbHMvZXNidWlsZC9hbmd1bGFyL2NvbXBvbmVudC1zdHlsZXNoZWV0cy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUE7Ozs7OztHQU1HOzs7Ozs7QUFHSCw2Q0FBeUM7QUFDekMsMERBQTZCO0FBQzdCLHdEQUE4RjtBQUU5RixrRUFHdUM7QUFFdkMsTUFBTSxtQkFBb0IsU0FBUSxHQUEyQjtJQUMzRCxXQUFXLENBQUMsR0FBVyxFQUFFLE9BQTZCO1FBQ3BELElBQUksS0FBSyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7UUFFMUIsSUFBSSxLQUFLLEtBQUssU0FBUyxFQUFFO1lBQ3ZCLEtBQUssR0FBRyxPQUFPLEVBQUUsQ0FBQztZQUNsQixJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxLQUFLLENBQUMsQ0FBQztTQUN0QjtRQUVELE9BQU8sS0FBSyxDQUFDO0lBQ2YsQ0FBQztDQUNGO0FBRUQ7Ozs7R0FJRztBQUNILE1BQWEsMEJBQTBCO0lBVWxCO0lBQ0E7SUFWVixhQUFhLEdBQUcsSUFBSSxtQkFBbUIsRUFBRSxDQUFDO0lBQzFDLGVBQWUsR0FBRyxJQUFJLG1CQUFtQixFQUFFLENBQUM7SUFFckQ7Ozs7T0FJRztJQUNILFlBQ21CLE9BQWdDLEVBQ2hDLEtBQXVCO1FBRHZCLFlBQU8sR0FBUCxPQUFPLENBQXlCO1FBQ2hDLFVBQUssR0FBTCxLQUFLLENBQWtCO0lBQ3ZDLENBQUM7SUFFSixLQUFLLENBQUMsVUFBVSxDQUFDLEtBQWE7UUFDNUIsTUFBTSxjQUFjLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxXQUFXLENBQUMsS0FBSyxFQUFFLEdBQUcsRUFBRTtZQUNoRSxNQUFNLFlB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QUksQ0FBQyxNQUFNLENBQUMsTUFBTSxFQUFFO1FBQ2xCLFFBQVEsR0FBRyxNQUFNLENBQUMsUUFBUSxDQUFDO1FBQzNCLDRGQUE0RjtRQUM1Riw0RkFBNEY7UUFDNUYsTUFBTSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsTUFBTSxFQUFFLEVBQUU7WUFDakQsT0FBTyxNQUFNLENBQUMsVUFBVSxDQUFDO1lBQ3pCLDhEQUE4RDtZQUM3RCxNQUFjLENBQUMsY0FBYyxDQUFDLEdBQUcsSUFBSSxDQUFDO1FBQ3pDLENBQUMsQ0FBQyxDQUFDO0tBQ0o7SUFFRCxPQUFPO1FBQ0wsTUFBTSxFQUFFLE1BQU0sQ0FBQyxNQUFNO1FBQ3JCLFFBQVEsRUFBRSxNQUFNLENBQUMsUUFBUTtRQUN6QixRQUFRO1FBQ1IsR0FBRztRQUNILElBQUksRUFBRSxVQUFVO1FBQ2hCLGFBQWE7UUFDYixRQUFRO1FBQ1IsZUFBZTtLQUNoQixDQUFDO0FBQ0osQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCBHb29nbGUgTExDIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKlxuICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmVcbiAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2VcbiAqL1xuXG5pbXBvcnQgeyBPdXRwdXRGaWxlIH0gZnJvbSAnZXNidWlsZCc7XG5pbXBvcnQgeyBjcmVhdGVIYXNoIH0gZnJvbSAnbm9kZTpjcnlwdG8nO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcbmltcG9ydCB7IEJ1aWxkT3V0cHV0RmlsZVR5cGUsIEJ1bmRsZUNvbnRleHRSZXN1bHQsIEJ1bmRsZXJDb250ZXh0IH0gZnJvbSAnLi4vYnVuZGxlci1jb250ZXh0JztcbmltcG9ydCB7IExvYWRSZXN1bHRDYWNoZSB9IGZyb20gJy4uL2xvYWQtcmVzdWx0LWNhY2hlJztcbmltcG9ydCB7XG4gIEJ1bmRsZVN0eWxlc2hlZXRPcHRpb25zLFxuICBjcmVhdGVTdHlsZXNoZWV0QnVuZGxlT3B0aW9ucyxcbn0gZnJvbSAnLi4vc3R5bGVzaGVldHMvYnVuZGxlLW9wdGlvbnMnO1xuXG5jbGFzcyBCdW5kbGVyQ29udGV4dENhY2hlIGV4dGVuZHMgTWFwPHN0cmluZywgQnVuZGxlckNvbnRleHQ+IHtcbiAgZ2V0T3JDcmVhdGUoa2V5OiBzdHJpbmcsIGNyZWF0b3I6ICgpID0+IEJ1bmRsZXJDb250ZXh0KTogQnVuZGxlckNvbnRleHQge1xuICAgIGxldCB2YWx1ZSA9IHRoaXMuZ2V0KGtleSk7XG5cbiAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgdmFsdWUgPSBjcmVhdG9yKCk7XG4gICAgICB0aGlzLnNldChrZXksIHZhbHVlKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdmFsdWU7XG4gIH1cbn1cblxuLyoqXG4gKiBCdW5kbGVzIGNvbXBvbmVudCBzdHlsZXNoZWV0cy4gQSBzdHlsZXNoZWV0IGNhbiBiZSBlaXRoZXIgYW4gaW5saW5lIHN0eWxlc2hlZXQgdGhhdFxuICogaXMgY29udGFpbmVkIHdpdGhpbiB0aGUgQ29tcG9uZW50J3MgbWV0YWRhdGEgZGVmaW5pdGlvbiBvciBhbiBleHRlcm5hbCBmaWxlIHJlZmVyZW5jZWRcbiAqIGZyb20gdGhlIENvbXBvbmVudCdzIG1ldGFkYXRhIGRlZmluaXRpb24uXG4gKi9cbmV4cG9ydCBjbGFzcyBDb21wb25lbnRTdHlsZXNoZWV0QnVuZGxlciB7XG4gIHJlYWRvbmx5ICNmaWxlQ29udGV4dHMgPSBuZXcgQnVuZGxlckNvbnRleHRDYWNoZSgpO1xuICByZWFkb25seSAjaW5saW5lQ29udGV4dHMgPSBuZXcgQnVuZGxlckNvbnRleHRDYWNoZSgpO1xuXG4gIC8qKlxuICAgKlxuICAgKiBAcGFyYW0gb3B0aW9ucyBBbiBvYmplY3QgY29udGFpbmluZyB0aGUgc3R5bGVzaGVldCBidW5kbGluZyBvcHRpb25zLlxuICAgKiBAcGFyYW0gY2FjaGUgQSBsb2FkIHJlc3VsdCBjYWNoZSB0byB1c2Ugd2hlbiBidW5kbGluZy5cbiAgICovXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgcmVhZG9ubHkgb3B0aW9uczogQnVuZGxlU3R5bGVzaGVldE9wdGlvbnMsXG4gICAgcHJpdmF0ZSByZWFkb25seSBjYWNoZT86IExvYWRSZXN1bHRDYWNoZSxcbiAgKSB7fVxuXG4gIGFzeW5jIGJ1bmRsZUZpbGUoZW50cnk6IHN0cmluZykge1xuICAgIGNvbnN0IGJ1bmRsZXJDb250ZXh0ID0gdGhpcy4jZmlsZUNvbnRleHRzLmdldE9yQ3JlYXRlKGVudHJ5LCAoKSA9PiB7XG4gICAgICBjb25zdCBidWlsZE9wdGlvbnMgPSBjcmVhdGVTdHlsZXNoZWV0QnVuZGxlT3B0aW9ucyh0aGlzLm9wdGlvbnMsIHRoaXMuY2FjaGUpO1xuICAgICAgYnVpbGRPcHRpb25zLmVudHJ5UG9pbnRzID0gW2VudHJ5XTtcblxuICAgICAgcmV0dXJuIG5ldyBCdW5kbGVyQ29udGV4dCh0aGlzLm9wdGlvbnMud29ya3NwYWNlUm9vdCwgdHJ1ZSwgYnVpbGRPcHRpb25zKTtcbiAgICB9KTtcblxuICAgIHJldHVybiBleHRyYWN0UmVzdWx0KGF3YWl0IGJ1bmRsZXJDb250ZXh0LmJ1bmRsZSgpLCBidW5kbGVyQ29udGV4dC53YXRjaEZpbGVzKTtcbiAgfVxuXG4gIGFzeW5jIGJ1bmRsZUlubGluZShkYXRhOiBzdHJpbmcsIGZpbGVuYW1lOiBzdHJpbmcsIGxhbmd1YWdlOiBzdHJpbmcpIHtcbiAgICAvLyBVc2UgYSBoYXNoIG9mIHRoZSBpbmxpbmUgc3R5bGVzaGVldCBjb250ZW50IHRvIGVuc3VyZSBhIGNvbnNpc3RlbnQgaWRlbnRpZmllci4gRXh0ZXJuYWwgc3R5bGVzaGVldHMgd2lsbCByZXNvbHZlXG4gICAgLy8gdG8gdGhlIGFjdHVhbCBzdHlsZXNoZWV0IGZpbGUgcGF0aC5cbiAgICAvLyBUT0RPOiBDb25zaWRlciB4eGhhc2ggaW5zdGVhZCBmb3IgaGFzaGluZ1xuICAgIGNvbnN0IGlkID0gY3JlYXRlSGFzaCgnc2hhMjU2JykudXBkYXRlKGRhdGEpLmRpZ2VzdCgnaGV4Jyk7XG4gICAgY29uc3QgZW50cnkgPSBbbGFuZ3VhZ2UsIGlkLCBmaWxlbmFtZV0uam9pbignOycpO1xuXG4gICAgY29uc3QgYnVuZGxlckNvbnRleHQgPSB0aGlzLiNpbmxpbmVDb250ZXh0cy5nZXRPckNyZWF0ZShlbnRyeSwgKCkgPT4ge1xuICAgICAgY29uc3QgbmFtZXNwYWNlID0gJ2FuZ3VsYXI6c3R5bGVzL2NvbXBvbmVudCc7XG4gICAgICBjb25zdCBidWlsZE9wdGlvbnMgPSBjcmVhdGVTdHlsZXNoZWV0QnVuZGxlT3B0aW9ucyh0aGlzLm9wdGlvbnMsIHRoaXMuY2FjaGUsIHtcbiAgICAgICAgW2VudHJ5XTogZGF0YSxcbiAgICAgIH0pO1xuICAgICAgYnVpbGRPcHRpb25zLmVudHJ5UG9pbnRzID0gW2Ake25hbWVzcGFjZX07JHtlbnRyeX1gXTtcbiAgICAgIGJ1aWxkT3B0aW9ucy5wbHVnaW5zLnB1c2goe1xuICAgICAgICBuYW1lOiAnYW5ndWxhci1jb21wb25lbnQtc3R5bGVzJyxcbiAgICAgICAgc2V0dXAoYnVpbGQpIHtcbiAgICAgICAgICBidWlsZC5vblJlc29sdmUoeyBmaWx0ZXI6IC9eYW5ndWxhcjpzdHlsZXNcXC9jb21wb25lbnQ7LyB9LCAoYXJncykgPT4ge1xuICAgICAgICAgICAgaWYgKGFyZ3Mua2luZCAhPT0gJ2VudHJ5LXBvaW50Jykge1xuICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgcGF0aDogZW50cnksXG4gICAgICAgICAgICAgIG5hbWVzcGFjZSxcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgYnVpbGQub25Mb2FkKHsgZmlsdGVyOiAvXmNzczsvLCBuYW1lc3BhY2UgfSwgYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgY29udGVudHM6IGRhdGEsXG4gICAgICAgICAgICAgIGxvYWRlcjogJ2NzcycsXG4gICAgICAgICAgICAgIHJlc29sdmVEaXI6IHBhdGguZGlybmFtZShmaWxlbmFtZSksXG4gICAgICAgICAgICB9O1xuICAgICAgICAgIH0pO1xuICAgICAgICB9LFxuICAgICAgfSk7XG5cbiAgICAgIHJldHVybiBuZXcgQnVuZGxlckNvbnRleHQodGhpcy5vcHRpb25zLndvcmtzcGFjZVJvb3QsIHRydWUsIGJ1aWxkT3B0aW9ucyk7XG4gICAgfSk7XG5cbiAgICAvLyBFeHRyYWN0IHRoZSByZXN1bHQgb2YgdGhlIGJ1bmRsaW5nIGZyb20gdGhlIG91dHB1dCBmaWxlc1xuICAgIHJldHVybiBleHRyYWN0UmVzdWx0KGF3YWl0IGJ1bmRsZXJDb250ZXh0LmJ1bmRsZSgpLCBidW5kbGVyQ29udGV4dC53YXRjaEZpbGVzKTtcbiAgfVxuXG4gIGFzeW5jIGRpc3Bvc2UoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgY29udGV4dHMgPSBbLi4udGhpcy4jZmlsZUNvbnRleHRzLnZhbHVlcygpLCAuLi50aGlzLiNpbmxpbmVDb250ZXh0cy52YWx1ZXMoKV07XG4gICAgdGhpcy4jZmlsZUNvbnRleHRzLmNsZWFyKCk7XG4gICAgdGhpcy4jaW5saW5lQ29udGV4dHMuY2xlYXIoKTtcblxuICAgIGF3YWl0IFByb21pc2UuYWxsU2V0dGxlZChjb250ZXh0cy5tYXAoKGNvbnRleHQpID0+IGNvbnRleHQuZGlzcG9zZSgpKSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gZXh0cmFjdFJlc3VsdChyZXN1bHQ6IEJ1bmRsZUNvbnRleHRSZXN1bHQsIHJlZmVyZW5jZWRGaWxlcz86IFNldDxzdHJpbmc+KSB7XG4gIGxldCBjb250ZW50cyA9ICcnO1xuICBsZXQgbWFwO1xuICBsZXQgb3V0cHV0UGF0aDtcbiAgY29uc3QgcmVzb3VyY2VGaWxlczogT3V0cHV0RmlsZVtdID0gW107XG4gIGlmICghcmVzdWx0LmVycm9ycykge1xuICAgIGZvciAoY29uc3Qgb3V0cHV0RmlsZSBvZiByZXN1bHQub3V0cHV0RmlsZXMpIHtcbiAgICAgIGNvbnN0IGZpbGVuYW1lID0gcGF0aC5iYXNlbmFtZShvdXRwdXRGaWxlLnBhdGgpO1xuICAgICAgaWYgKG91dHB1dEZpbGUudHlwZSA9PT0gQnVpbGRPdXRwdXRGaWxlVHlwZS5NZWRpYSkge1xuICAgICAgICAvLyBUaGUgb3V0cHV0IGZpbGVzIGNvdWxkIGFsc28gY29udGFpbiByZXNvdXJjZXMgKGltYWdlcy9mb250cy9ldGMuKSB0aGF0IHdlcmUgcmVmZXJlbmNlZFxuICAgICAgICByZXNvdXJjZUZpbGVzLnB1c2gob3V0cHV0RmlsZSk7XG4gICAgICB9IGVsc2UgaWYgKGZpbGVuYW1lLmVuZHNXaXRoKCcuY3NzJykpIHtcbiAgICAgICAgb3V0cHV0UGF0aCA9IG91dHB1dEZpbGUucGF0aDtcbiAgICAgICAgY29udGVudHMgPSBvdXRwdXRGaWxlLnRleHQ7XG4gICAgICB9IGVsc2UgaWYgKGZpbGVuYW1lLmVuZHNXaXRoKCcuY3NzLm1hcCcpKSB7XG4gICAgICAgIG1hcCA9IG91dHB1dEZpbGUudGV4dDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICBgVW5leHBlY3RlZCBub24gQ1NTL01lZGlhIGZpbGUgXCIke2ZpbGVuYW1lfVwiIG91dHB1dHRlZCBkdXJpbmcgY29tcG9uZW50IHN0eWxlc2hlZXQgcHJvY2Vzc2luZy5gLFxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGxldCBtZXRhZmlsZTtcbiAgaWYgKCFyZXN1bHQuZXJyb3JzKSB7XG4gICAgbWV0YWZpbGUgPSByZXN1bHQubWV0YWZpbGU7XG4gICAgLy8gUmVtb3ZlIGVudHJ5UG9pbnQgZmllbGRzIGZyb20gb3V0cHV0cyB0byBwcmV2ZW50IHRoZSBpbnRlcm5hbCBjb21wb25lbnQgc3R5bGVzIGZyb20gYmVpbmdcbiAgICAvLyB0cmVhdGVkIGFzIGluaXRpYWwgZmlsZXMuIEFsc28gbWFyayB0aGUgZW50cnkgYXMgYSBjb21wb25lbnQgcmVzb3VyY2UgZm9yIHN0YXQgcmVwb3J0aW5nLlxuICAgIE9iamVjdC52YWx1ZXMobWV0YWZpbGUub3V0cHV0cykuZm9yRWFjaCgob3V0cHV0KSA9PiB7XG4gICAgICBkZWxldGUgb3V0cHV0LmVudHJ5UG9pbnQ7XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICAgICAgKG91dHB1dCBhcyBhbnkpWyduZy1jb21wb25lbnQnXSA9IHRydWU7XG4gICAgfSk7XG4gIH1cblxuICByZXR1cm4ge1xuICAgIGVycm9yczogcmVzdWx0LmVycm9ycyxcbiAgICB3YXJuaW5nczogcmVzdWx0Lndhcm5pbmdzLFxuICAgIGNvbnRlbnRzLFxuICAgIG1hcCxcbiAgICBwYXRoOiBvdXRwdXRQYXRoLFxuICAgIHJlc291cmNlRmlsZXMsXG4gICAgbWV0YWZpbGUsXG4gICAgcmVmZXJlbmNlZEZpbGVzLFxuICB9O1xufVxuIl19
|
|
@@ -6,10 +6,10 @@
|
|
|
6
6
|
* found in the LICENSE file at https://angular.io/license
|
|
7
7
|
*/
|
|
8
8
|
import type { PartialMessage } from 'esbuild';
|
|
9
|
-
import
|
|
9
|
+
import type ts from 'typescript';
|
|
10
10
|
/**
|
|
11
11
|
* Converts a TypeScript Diagnostic message into an esbuild compatible message object.
|
|
12
12
|
* @param diagnostic The TypeScript diagnostic to convert.
|
|
13
13
|
* @returns An esbuild diagnostic message as a PartialMessage object
|
|
14
14
|
*/
|
|
15
|
-
export declare function convertTypeScriptDiagnostic(diagnostic: Diagnostic): PartialMessage;
|
|
15
|
+
export declare function convertTypeScriptDiagnostic(typescript: typeof ts, diagnostic: ts.Diagnostic): PartialMessage;
|
|
@@ -9,7 +9,6 @@
|
|
|
9
9
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
10
10
|
exports.convertTypeScriptDiagnostic = void 0;
|
|
11
11
|
const node_os_1 = require("node:os");
|
|
12
|
-
const typescript_1 = require("typescript");
|
|
13
12
|
/**
|
|
14
13
|
* Converts TypeScript Diagnostic related information into an esbuild compatible note object.
|
|
15
14
|
* Related information is a subset of a full TypeScript Diagnostic and also used for diagnostic
|
|
@@ -17,9 +16,9 @@ const typescript_1 = require("typescript");
|
|
|
17
16
|
* @param info The TypeScript diagnostic relative information to convert.
|
|
18
17
|
* @returns An esbuild diagnostic message as a PartialMessage object
|
|
19
18
|
*/
|
|
20
|
-
function convertTypeScriptDiagnosticInfo(info, textPrefix) {
|
|
19
|
+
function convertTypeScriptDiagnosticInfo(typescript, info, textPrefix) {
|
|
21
20
|
const newLine = (0, node_os_1.platform)() === 'win32' ? '\r\n' : '\n';
|
|
22
|
-
let text =
|
|
21
|
+
let text = typescript.flattenDiagnosticMessageText(info.messageText, newLine);
|
|
23
22
|
if (textPrefix) {
|
|
24
23
|
text = textPrefix + text;
|
|
25
24
|
}
|
|
@@ -31,17 +30,17 @@ function convertTypeScriptDiagnosticInfo(info, textPrefix) {
|
|
|
31
30
|
};
|
|
32
31
|
// Calculate the line/column location and extract the full line text that has the diagnostic
|
|
33
32
|
if (info.start) {
|
|
34
|
-
const { line, character } =
|
|
33
|
+
const { line, character } = typescript.getLineAndCharacterOfPosition(info.file, info.start);
|
|
35
34
|
note.location.line = line + 1;
|
|
36
35
|
note.location.column = character;
|
|
37
36
|
// The start position for the slice is the first character of the error line
|
|
38
|
-
const lineStartPosition =
|
|
37
|
+
const lineStartPosition = typescript.getPositionOfLineAndCharacter(info.file, line, 0);
|
|
39
38
|
// The end position for the slice is the first character of the next line or the length of
|
|
40
39
|
// the entire file if the line is the last line of the file (getPositionOfLineAndCharacter
|
|
41
40
|
// will error if a nonexistent line is passed).
|
|
42
|
-
const { line: lastLineOfFile } =
|
|
41
|
+
const { line: lastLineOfFile } = typescript.getLineAndCharacterOfPosition(info.file, info.file.text.length - 1);
|
|
43
42
|
const lineEndPosition = line < lastLineOfFile
|
|
44
|
-
?
|
|
43
|
+
? typescript.getPositionOfLineAndCharacter(info.file, line + 1, 0)
|
|
45
44
|
: info.file.text.length;
|
|
46
45
|
note.location.lineText = info.file.text.slice(lineStartPosition, lineEndPosition).trimEnd();
|
|
47
46
|
}
|
|
@@ -53,7 +52,7 @@ function convertTypeScriptDiagnosticInfo(info, textPrefix) {
|
|
|
53
52
|
* @param diagnostic The TypeScript diagnostic to convert.
|
|
54
53
|
* @returns An esbuild diagnostic message as a PartialMessage object
|
|
55
54
|
*/
|
|
56
|
-
function convertTypeScriptDiagnostic(diagnostic) {
|
|
55
|
+
function convertTypeScriptDiagnostic(typescript, diagnostic) {
|
|
57
56
|
let codePrefix = 'TS';
|
|
58
57
|
let code = `${diagnostic.code}`;
|
|
59
58
|
if (diagnostic.source === 'ngtsc') {
|
|
@@ -61,15 +60,10 @@ function convertTypeScriptDiagnostic(diagnostic) {
|
|
|
61
60
|
// Remove `-99` Angular prefix from diagnostic code
|
|
62
61
|
code = code.slice(3);
|
|
63
62
|
}
|
|
64
|
-
const message = {
|
|
65
|
-
...convertTypeScriptDiagnosticInfo(diagnostic, `${codePrefix}${code}: `),
|
|
66
|
-
// Store original diagnostic for reference if needed downstream
|
|
67
|
-
detail: diagnostic,
|
|
68
|
-
};
|
|
63
|
+
const message = convertTypeScriptDiagnosticInfo(typescript, diagnostic, `${codePrefix}${code}: `);
|
|
69
64
|
if (diagnostic.relatedInformation?.length) {
|
|
70
|
-
message.notes = diagnostic.relatedInformation.map((info) => convertTypeScriptDiagnosticInfo(info));
|
|
65
|
+
message.notes = diagnostic.relatedInformation.map((info) => convertTypeScriptDiagnosticInfo(typescript, info));
|
|
71
66
|
}
|
|
72
67
|
return message;
|
|
73
68
|
}
|
|
74
69
|
exports.convertTypeScriptDiagnostic = convertTypeScriptDiagnostic;
|
|
75
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGlhZ25vc3RpY3MuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9hbmd1bGFyX2RldmtpdC9idWlsZF9hbmd1bGFyL3NyYy90b29scy9lc2J1aWxkL2FuZ3VsYXIvZGlhZ25vc3RpY3MudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBOzs7Ozs7R0FNRzs7O0FBR0gscUNBQW1DO0FBQ25DLDJDQU1vQjtBQUVwQjs7Ozs7O0dBTUc7QUFDSCxTQUFTLCtCQUErQixDQUN0QyxJQUFrQyxFQUNsQyxVQUFtQjtJQUVuQixNQUFNLE9BQU8sR0FBRyxJQUFBLGtCQUFRLEdBQUUsS0FBSyxPQUFPLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO0lBQ3ZELElBQUksSUFBSSxHQUFHLElBQUEseUNBQTRCLEVBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRSxPQUFPLENBQUMsQ0FBQztJQUNuRSxJQUFJLFVBQVUsRUFBRTtRQUNkLElBQUksR0FBRyxVQUFVLEdBQUcsSUFBSSxDQUFDO0tBQzFCO0lBRUQsTUFBTSxJQUFJLEdBQWdCLEVBQUUsSUFBSSxFQUFFLENBQUM7SUFFbkMsSUFBSSxJQUFJLENBQUMsSUFBSSxFQUFFO1FBQ2IsSUFBSSxDQUFDLFFBQVEsR0FBRztZQUNkLElBQUksRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVE7WUFDeEIsTUFBTSxFQUFFLElBQUksQ0FBQyxNQUFNO1NBQ3BCLENBQUM7UUFFRiw0RkFBNEY7UUFDNUYsSUFBSSxJQUFJLENBQUMsS0FBSyxFQUFFO1lBQ2QsTUFBTSxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsR0FBRyxJQUFBLDBDQUE2QixFQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQ2pGLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxHQUFHLElBQUksR0FBRyxDQUFDLENBQUM7WUFDOUIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLEdBQUcsU0FBUyxDQUFDO1lBRWpDLDRFQUE0RTtZQUM1RSxNQUFNLGlCQUFpQixHQUFHLElBQUEsMENBQTZCLEVBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUM7WUFFNUUsMEZBQTBGO1lBQzFGLDBGQUEwRjtZQUMxRiwrQ0FBK0M7WUFDL0MsTUFBTSxFQUFFLElBQUksRUFBRSxjQUFjLEVBQUUsR0FBRyxJQUFBLDBDQUE2QixFQUM1RCxJQUFJLENBQUMsSUFBSSxFQUNULElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQzFCLENBQUM7WUFDRixNQUFNLGVBQWUsR0FDbkIsSUFBSSxHQUFHLGNBQWM7Z0JBQ25CLENBQUMsQ0FBQyxJQUFBLDBDQUE2QixFQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsSUFBSSxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUM7Z0JBQ3ZELENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUM7WUFFNUIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLGlCQUFpQixFQUFFLGVBQWUsQ0FBQyxDQUFDLE9BQU8sRUFBRSxDQUFDO1NBQzdGO0tBQ0Y7SUFFRCxPQUFPLElBQUksQ0FBQztBQUNkLENBQUM7QUFFRDs7OztHQUlHO0FBQ0gsU0FBZ0IsMkJBQTJCLENBQUMsVUFBc0I7SUFDaEUsSUFBSSxVQUFVLEdBQUcsSUFBSSxDQUFDO0lBQ3RCLElBQUksSUFBSSxHQUFHLEdBQUcsVUFBVSxDQUFDLElBQUksRUFBRSxDQUFDO0lBQ2hDLElBQUksVUFBVSxDQUFDLE1BQU0sS0FBSyxPQUFPLEVBQUU7UUFDakMsVUFBVSxHQUFHLElBQUksQ0FBQztRQUNsQixtREFBbUQ7UUFDbkQsSUFBSSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7S0FDdEI7SUFFRCxNQUFNLE9BQU8sR0FBbUI7UUFDOUIsR0FBRywrQkFBK0IsQ0FBQyxVQUFVLEVBQUUsR0FBRyxVQUFVLEdBQUcsSUFBSSxJQUFJLENBQUM7UUFDeEUsK0RBQStEO1FBQy9ELE1BQU0sRUFBRSxVQUFVO0tBQ25CLENBQUM7SUFFRixJQUFJLFVBQVUsQ0FBQyxrQkFBa0IsRUFBRSxNQUFNLEVBQUU7UUFDekMsT0FBTyxDQUFDLEtBQUssR0FBRyxVQUFVLENBQUMsa0JBQWtCLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FDekQsK0JBQStCLENBQUMsSUFBSSxDQUFDLENBQ3RDLENBQUM7S0FDSDtJQUVELE9BQU8sT0FBTyxDQUFDO0FBQ2pCLENBQUM7QUF0QkQsa0VBc0JDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IEdvb2dsZSBMTEMgQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqXG4gKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZVxuICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZVxuICovXG5cbmltcG9ydCB0eXBlIHsgUGFydGlhbE1lc3NhZ2UsIFBhcnRpYWxOb3RlIH0gZnJvbSAnZXNidWlsZCc7XG5pbXBvcnQgeyBwbGF0Zm9ybSB9IGZyb20gJ25vZGU6b3MnO1xuaW1wb3J0IHtcbiAgRGlhZ25vc3RpYyxcbiAgRGlhZ25vc3RpY1JlbGF0ZWRJbmZvcm1hdGlvbixcbiAgZmxhdHRlbkRpYWdub3N0aWNNZXNzYWdlVGV4dCxcbiAgZ2V0TGluZUFuZENoYXJhY3Rlck9mUG9zaXRpb24sXG4gIGdldFBvc2l0aW9uT2ZMaW5lQW5kQ2hhcmFjdGVyLFxufSBmcm9tICd0eXBlc2NyaXB0JztcblxuLyoqXG4gKiBDb252ZXJ0cyBUeXBlU2NyaXB0IERpYWdub3N0aWMgcmVsYXRlZCBpbmZvcm1hdGlvbiBpbnRvIGFuIGVzYnVpbGQgY29tcGF0aWJsZSBub3RlIG9iamVjdC5cbiAqIFJlbGF0ZWQgaW5mb3JtYXRpb24gaXMgYSBzdWJzZXQgb2YgYSBmdWxsIFR5cGVTY3JpcHQgRGlhZ25vc3RpYyBhbmQgYWxzbyB1c2VkIGZvciBkaWFnbm9zdGljXG4gKiBub3RlcyBhc3NvY2lhdGVkIHdpdGggdGhlIG1haW4gRGlhZ25vc3RpYy5cbiAqIEBwYXJhbSBpbmZvIFRoZSBUeXBlU2NyaXB0IGRpYWdub3N0aWMgcmVsYXRpdmUgaW5mb3JtYXRpb24gdG8gY29udmVydC5cbiAqIEByZXR1cm5zIEFuIGVzYnVpbGQgZGlhZ25vc3RpYyBtZXNzYWdlIGFzIGEgUGFydGlhbE1lc3NhZ2Ugb2JqZWN0XG4gKi9cbmZ1bmN0aW9uIGNvbnZlcnRUeXBlU2NyaXB0RGlhZ25vc3RpY0luZm8oXG4gIGluZm86IERpYWdub3N0aWNSZWxhdGVkSW5mb3JtYXRpb24sXG4gIHRleHRQcmVmaXg/OiBzdHJpbmcsXG4pOiBQYXJ0aWFsTm90ZSB7XG4gIGNvbnN0IG5ld0xpbmUgPSBwbGF0Zm9ybSgpID09PSAnd2luMzInID8gJ1xcclxcbicgOiAnXFxuJztcbiAgbGV0IHRleHQgPSBmbGF0dGVuRGlhZ25vc3RpY01lc3NhZ2VUZXh0KGluZm8ubWVzc2FnZVRleHQsIG5ld0xpbmUpO1xuICBpZiAodGV4dFByZWZpeCkge1xuICAgIHRleHQgPSB0ZXh0UHJlZml4ICsgdGV4dDtcbiAgfVxuXG4gIGNvbnN0IG5vdGU6IFBhcnRpYWxOb3RlID0geyB0ZXh0IH07XG5cbiAgaWYgKGluZm8uZmlsZSkge1xuICAgIG5vdGUubG9jYXRpb24gPSB7XG4gICAgICBmaWxlOiBpbmZvLmZpbGUuZmlsZU5hbWUsXG4gICAgICBsZW5ndGg6IGluZm8ubGVuZ3RoLFxuICAgIH07XG5cbiAgICAvLyBDYWxjdWxhdGUgdGhlIGxpbmUvY29sdW1uIGxvY2F0aW9uIGFuZCBleHRyYWN0IHRoZSBmdWxsIGxpbmUgdGV4dCB0aGF0IGhhcyB0aGUgZGlhZ25vc3RpY1xuICAgIGlmIChpbmZvLnN0YXJ0KSB7XG4gICAgICBjb25zdCB7IGxpbmUsIGNoYXJhY3RlciB9ID0gZ2V0TGluZUFuZENoYXJhY3Rlck9mUG9zaXRpb24oaW5mby5maWxlLCBpbmZvLnN0YXJ0KTtcbiAgICAgIG5vdGUubG9jYXRpb24ubGluZSA9IGxpbmUgKyAxO1xuICAgICAgbm90ZS5sb2NhdGlvbi5jb2x1bW4gPSBjaGFyYWN0ZXI7XG5cbiAgICAgIC8vIFRoZSBzdGFydCBwb3NpdGlvbiBmb3IgdGhlIHNsaWNlIGlzIHRoZSBmaXJzdCBjaGFyYWN0ZXIgb2YgdGhlIGVycm9yIGxpbmVcbiAgICAgIGNvbnN0IGxpbmVTdGFydFBvc2l0aW9uID0gZ2V0UG9zaXRpb25PZkxpbmVBbmRDaGFyYWN0ZXIoaW5mby5maWxlLCBsaW5lLCAwKTtcblxuICAgICAgLy8gVGhlIGVuZCBwb3NpdGlvbiBmb3IgdGhlIHNsaWNlIGlzIHRoZSBmaXJzdCBjaGFyYWN0ZXIgb2YgdGhlIG5leHQgbGluZSBvciB0aGUgbGVuZ3RoIG9mXG4gICAgICAvLyB0aGUgZW50aXJlIGZpbGUgaWYgdGhlIGxpbmUgaXMgdGhlIGxhc3QgbGluZSBvZiB0aGUgZmlsZSAoZ2V0UG9zaXRpb25PZkxpbmVBbmRDaGFyYWN0ZXJcbiAgICAgIC8vIHdpbGwgZXJyb3IgaWYgYSBub25leGlzdGVudCBsaW5lIGlzIHBhc3NlZCkuXG4gICAgICBjb25zdCB7IGxpbmU6IGxhc3RMaW5lT2ZGaWxlIH0gPSBnZXRMaW5lQW5kQ2hhcmFjdGVyT2ZQb3NpdGlvbihcbiAgICAgICAgaW5mby5maWxlLFxuICAgICAgICBpbmZvLmZpbGUudGV4dC5sZW5ndGggLSAxLFxuICAgICAgKTtcbiAgICAgIGNvbnN0IGxpbmVFbmRQb3NpdGlvbiA9XG4gICAgICAgIGxpbmUgPCBsYXN0TGluZU9mRmlsZVxuICAgICAgICAgID8gZ2V0UG9zaXRpb25PZkxpbmVBbmRDaGFyYWN0ZXIoaW5mby5maWxlLCBsaW5lICsgMSwgMClcbiAgICAgICAgICA6IGluZm8uZmlsZS50ZXh0Lmxlbmd0aDtcblxuICAgICAgbm90ZS5sb2NhdGlvbi5saW5lVGV4dCA9IGluZm8uZmlsZS50ZXh0LnNsaWNlKGxpbmVTdGFydFBvc2l0aW9uLCBsaW5lRW5kUG9zaXRpb24pLnRyaW1FbmQoKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gbm90ZTtcbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBhIFR5cGVTY3JpcHQgRGlhZ25vc3RpYyBtZXNzYWdlIGludG8gYW4gZXNidWlsZCBjb21wYXRpYmxlIG1lc3NhZ2Ugb2JqZWN0LlxuICogQHBhcmFtIGRpYWdub3N0aWMgVGhlIFR5cGVTY3JpcHQgZGlhZ25vc3RpYyB0byBjb252ZXJ0LlxuICogQHJldHVybnMgQW4gZXNidWlsZCBkaWFnbm9zdGljIG1lc3NhZ2UgYXMgYSBQYXJ0aWFsTWVzc2FnZSBvYmplY3RcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNvbnZlcnRUeXBlU2NyaXB0RGlhZ25vc3RpYyhkaWFnbm9zdGljOiBEaWFnbm9zdGljKTogUGFydGlhbE1lc3NhZ2Uge1xuICBsZXQgY29kZVByZWZpeCA9ICdUUyc7XG4gIGxldCBjb2RlID0gYCR7ZGlhZ25vc3RpYy5jb2RlfWA7XG4gIGlmIChkaWFnbm9zdGljLnNvdXJjZSA9PT0gJ25ndHNjJykge1xuICAgIGNvZGVQcmVmaXggPSAnTkcnO1xuICAgIC8vIFJlbW92ZSBgLTk5YCBBbmd1bGFyIHByZWZpeCBmcm9tIGRpYWdub3N0aWMgY29kZVxuICAgIGNvZGUgPSBjb2RlLnNsaWNlKDMpO1xuICB9XG5cbiAgY29uc3QgbWVzc2FnZTogUGFydGlhbE1lc3NhZ2UgPSB7XG4gICAgLi4uY29udmVydFR5cGVTY3JpcHREaWFnbm9zdGljSW5mbyhkaWFnbm9zdGljLCBgJHtjb2RlUHJlZml4fSR7Y29kZX06IGApLFxuICAgIC8vIFN0b3JlIG9yaWdpbmFsIGRpYWdub3N0aWMgZm9yIHJlZmVyZW5jZSBpZiBuZWVkZWQgZG93bnN0cmVhbVxuICAgIGRldGFpbDogZGlhZ25vc3RpYyxcbiAgfTtcblxuICBpZiAoZGlhZ25vc3RpYy5yZWxhdGVkSW5mb3JtYXRpb24/Lmxlbmd0aCkge1xuICAgIG1lc3NhZ2Uubm90ZXMgPSBkaWFnbm9zdGljLnJlbGF0ZWRJbmZvcm1hdGlvbi5tYXAoKGluZm8pID0+XG4gICAgICBjb252ZXJ0VHlwZVNjcmlwdERpYWdub3N0aWNJbmZvKGluZm8pLFxuICAgICk7XG4gIH1cblxuICByZXR1cm4gbWVzc2FnZTtcbn1cbiJdfQ==
|