@angular-devkit/build-angular 16.1.0-rc.0 → 16.1.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 +23 -23
- package/plugins/karma.js +2 -2
- package/src/builders/browser/index.d.ts +1 -1
- package/src/builders/browser/index.js +5 -5
- package/src/builders/browser-esbuild/index.js +27 -376
- package/src/builders/browser-esbuild/options.js +2 -2
- package/src/builders/dev-server/load-proxy-config.d.ts +1 -6
- package/src/builders/dev-server/load-proxy-config.js +52 -13
- package/src/builders/dev-server/vite-server.js +4 -7
- package/src/builders/dev-server/webpack-server.d.ts +1 -1
- package/src/builders/dev-server/webpack-server.js +6 -6
- package/src/builders/extract-i18n/index.js +3 -3
- package/src/builders/karma/index.js +2 -2
- package/src/builders/server/index.js +4 -4
- package/src/tools/babel/plugins/adjust-static-class-members.js +354 -0
- package/src/tools/babel/plugins/adjust-typescript-enums.js +124 -0
- package/src/tools/babel/plugins/elide-angular-metadata.js +68 -0
- package/src/tools/babel/plugins/pure-toplevel-functions.js +91 -0
- package/src/tools/babel/presets/application.js +197 -0
- package/src/{babel → tools/babel}/webpack-loader.d.ts +1 -1
- package/src/tools/babel/webpack-loader.js +189 -0
- package/src/tools/esbuild/angular/angular-compilation.js +51 -0
- package/src/tools/esbuild/angular/angular-host.js +60 -0
- package/src/tools/esbuild/angular/aot-compilation.js +211 -0
- package/src/tools/esbuild/angular/compiler-plugin.js +314 -0
- package/src/tools/esbuild/angular/diagnostics.js +75 -0
- package/src/tools/esbuild/angular/jit-compilation.js +106 -0
- package/src/tools/esbuild/angular/jit-plugin-callbacks.js +113 -0
- package/src/tools/esbuild/angular/jit-resource-transformer.js +185 -0
- package/src/tools/esbuild/angular/uri.js +75 -0
- package/src/tools/esbuild/application-code-bundle.d.ts +11 -0
- package/src/tools/esbuild/application-code-bundle.js +115 -0
- package/src/{builders/browser-esbuild/esbuild.d.ts → tools/esbuild/bundler-context.d.ts} +2 -12
- package/src/tools/esbuild/bundler-context.js +205 -0
- package/src/tools/esbuild/bundler-execution-result.d.ts +44 -0
- package/src/tools/esbuild/bundler-execution-result.js +57 -0
- package/src/tools/esbuild/commonjs-checker.js +141 -0
- package/src/tools/esbuild/external-packages-plugin.d.ts +17 -0
- package/src/tools/esbuild/external-packages-plugin.js +49 -0
- package/src/{builders/browser-esbuild → tools/esbuild}/global-scripts.d.ts +1 -1
- package/src/tools/esbuild/global-scripts.js +139 -0
- package/src/{builders/browser-esbuild → tools/esbuild}/global-styles.d.ts +1 -1
- package/src/tools/esbuild/global-styles.js +67 -0
- package/src/tools/esbuild/index-html-generator.d.ts +12 -0
- package/src/tools/esbuild/index-html-generator.js +70 -0
- package/src/tools/esbuild/javascript-transformer-worker.js +76 -0
- package/src/tools/esbuild/javascript-transformer.js +108 -0
- package/src/tools/esbuild/license-extractor.js +159 -0
- package/src/tools/esbuild/load-result-cache.js +69 -0
- package/src/tools/esbuild/profiling.js +79 -0
- package/src/tools/esbuild/sourcemap-ignorelist-plugin.js +74 -0
- package/src/tools/esbuild/stylesheets/bundle-options.js +159 -0
- package/src/tools/esbuild/stylesheets/css-language.js +16 -0
- package/src/tools/esbuild/stylesheets/css-resource-plugin.js +88 -0
- package/src/tools/esbuild/stylesheets/less-language.js +127 -0
- package/src/tools/esbuild/stylesheets/sass-language.js +169 -0
- package/src/tools/esbuild/stylesheets/stylesheet-plugin-factory.js +234 -0
- package/src/tools/esbuild/utils.d.ts +30 -0
- package/src/tools/esbuild/utils.js +192 -0
- package/src/tools/esbuild/virtual-module-plugin.js +43 -0
- package/src/tools/esbuild/watcher.js +107 -0
- package/src/tools/sass/rebasing-importer.js +445 -0
- package/src/tools/sass/sass-service-legacy.js +176 -0
- package/src/tools/sass/sass-service.js +214 -0
- package/src/tools/sass/worker-legacy.js +44 -0
- package/src/tools/sass/worker.js +158 -0
- package/src/{webpack → tools/webpack}/configs/common.d.ts +1 -1
- package/src/tools/webpack/configs/common.js +421 -0
- package/src/{webpack → tools/webpack}/configs/dev-server.d.ts +1 -1
- package/src/tools/webpack/configs/dev-server.js +304 -0
- package/src/{webpack → tools/webpack}/configs/index.js +1 -1
- package/src/{webpack → tools/webpack}/configs/styles.d.ts +1 -1
- package/src/tools/webpack/configs/styles.js +396 -0
- package/src/{webpack → tools/webpack}/plugins/any-component-style-budget-checker.d.ts +1 -1
- package/src/tools/webpack/plugins/any-component-style-budget-checker.js +92 -0
- package/src/tools/webpack/plugins/builder-watch-plugin.js +99 -0
- package/src/tools/webpack/plugins/common-js-usage-warn-plugin.js +121 -0
- package/src/tools/webpack/plugins/css-optimizer-plugin.js +123 -0
- package/src/tools/webpack/plugins/dedupe-module-resolve-plugin.js +75 -0
- package/src/tools/webpack/plugins/devtools-ignore-plugin.js +57 -0
- package/src/tools/webpack/plugins/esbuild-executor.js +121 -0
- package/src/tools/webpack/plugins/hmr/hmr-accept.js +185 -0
- package/src/tools/webpack/plugins/hmr/hmr-loader.js +25 -0
- package/src/{webpack → tools/webpack}/plugins/index-html-webpack-plugin.d.ts +1 -1
- package/src/tools/webpack/plugins/index-html-webpack-plugin.js +85 -0
- package/src/{webpack → tools/webpack}/plugins/index.js +1 -1
- package/src/tools/webpack/plugins/javascript-optimizer-plugin.js +166 -0
- package/src/tools/webpack/plugins/javascript-optimizer-worker.js +140 -0
- package/src/tools/webpack/plugins/json-stats-plugin.js +61 -0
- package/src/tools/webpack/plugins/karma/karma.js +270 -0
- package/src/tools/webpack/plugins/named-chunks-plugin.js +59 -0
- package/src/tools/webpack/plugins/occurrences-plugin.js +80 -0
- package/src/tools/webpack/plugins/postcss-cli-resources.js +176 -0
- package/src/tools/webpack/plugins/progress-plugin.js +39 -0
- package/src/tools/webpack/plugins/remove-hash-plugin.js +31 -0
- package/src/tools/webpack/plugins/scripts-webpack-plugin.js +180 -0
- package/src/tools/webpack/plugins/service-worker-plugin.js +46 -0
- package/src/tools/webpack/plugins/styles-webpack-plugin.js +73 -0
- package/src/tools/webpack/plugins/suppress-entry-chunks-webpack-plugin.js +52 -0
- package/src/tools/webpack/plugins/transfer-size-plugin.js +50 -0
- package/src/{webpack → tools/webpack}/plugins/typescript.d.ts +1 -1
- package/src/tools/webpack/plugins/typescript.js +51 -0
- package/src/tools/webpack/plugins/watch-files-logs-plugin.js +28 -0
- package/src/tools/webpack/utils/async-chunks.js +46 -0
- package/src/{webpack → tools/webpack}/utils/helpers.d.ts +2 -2
- package/src/tools/webpack/utils/helpers.js +293 -0
- package/src/{webpack → tools/webpack}/utils/stats.d.ts +2 -2
- package/src/tools/webpack/utils/stats.js +443 -0
- package/src/utils/bundle-calculator.js +2 -2
- package/src/utils/index-file/augment-index-html.d.ts +1 -1
- package/src/utils/index-file/augment-index-html.js +1 -1
- package/src/utils/normalize-asset-patterns.d.ts +1 -1
- package/src/utils/normalize-asset-patterns.js +1 -1
- package/src/utils/normalize-file-replacements.d.ts +1 -1
- package/src/utils/normalize-file-replacements.js +1 -1
- package/src/utils/package-chunk-sort.js +2 -2
- package/src/utils/webpack-browser-config.js +2 -2
- package/src/babel/plugins/adjust-static-class-members.js +0 -354
- package/src/babel/plugins/adjust-typescript-enums.js +0 -124
- package/src/babel/plugins/elide-angular-metadata.js +0 -68
- package/src/babel/plugins/pure-toplevel-functions.js +0 -91
- package/src/babel/presets/application.js +0 -197
- package/src/babel/webpack-loader.js +0 -189
- package/src/builders/browser-esbuild/angular/angular-compilation.js +0 -51
- package/src/builders/browser-esbuild/angular/angular-host.js +0 -60
- package/src/builders/browser-esbuild/angular/aot-compilation.js +0 -208
- package/src/builders/browser-esbuild/angular/compiler-plugin.js +0 -314
- package/src/builders/browser-esbuild/angular/diagnostics.js +0 -75
- package/src/builders/browser-esbuild/angular/jit-compilation.js +0 -106
- package/src/builders/browser-esbuild/angular/jit-plugin-callbacks.js +0 -113
- package/src/builders/browser-esbuild/angular/jit-resource-transformer.js +0 -185
- package/src/builders/browser-esbuild/angular/uri.js +0 -75
- package/src/builders/browser-esbuild/commonjs-checker.js +0 -141
- package/src/builders/browser-esbuild/esbuild.js +0 -206
- package/src/builders/browser-esbuild/global-scripts.js +0 -139
- package/src/builders/browser-esbuild/global-styles.js +0 -67
- package/src/builders/browser-esbuild/javascript-transformer-worker.js +0 -76
- package/src/builders/browser-esbuild/javascript-transformer.js +0 -108
- package/src/builders/browser-esbuild/license-extractor.js +0 -159
- package/src/builders/browser-esbuild/load-result-cache.js +0 -69
- package/src/builders/browser-esbuild/profiling.js +0 -79
- package/src/builders/browser-esbuild/sourcemap-ignorelist-plugin.js +0 -74
- package/src/builders/browser-esbuild/stylesheets/bundle-options.js +0 -159
- package/src/builders/browser-esbuild/stylesheets/css-language.js +0 -16
- package/src/builders/browser-esbuild/stylesheets/css-resource-plugin.js +0 -88
- package/src/builders/browser-esbuild/stylesheets/less-language.js +0 -127
- package/src/builders/browser-esbuild/stylesheets/sass-language.js +0 -169
- package/src/builders/browser-esbuild/stylesheets/stylesheet-plugin-factory.js +0 -218
- package/src/builders/browser-esbuild/virtual-module-plugin.js +0 -43
- package/src/builders/browser-esbuild/watcher.js +0 -105
- package/src/sass/rebasing-importer.js +0 -445
- package/src/sass/sass-service-legacy.js +0 -176
- package/src/sass/sass-service.js +0 -214
- package/src/sass/worker-legacy.js +0 -44
- package/src/sass/worker.js +0 -158
- package/src/webpack/configs/common.js +0 -421
- package/src/webpack/configs/dev-server.js +0 -304
- package/src/webpack/configs/styles.js +0 -396
- package/src/webpack/plugins/any-component-style-budget-checker.js +0 -92
- package/src/webpack/plugins/builder-watch-plugin.js +0 -99
- package/src/webpack/plugins/common-js-usage-warn-plugin.js +0 -121
- package/src/webpack/plugins/css-optimizer-plugin.js +0 -123
- package/src/webpack/plugins/dedupe-module-resolve-plugin.js +0 -75
- package/src/webpack/plugins/devtools-ignore-plugin.js +0 -57
- package/src/webpack/plugins/esbuild-executor.js +0 -121
- package/src/webpack/plugins/hmr/hmr-accept.js +0 -185
- package/src/webpack/plugins/hmr/hmr-loader.js +0 -25
- package/src/webpack/plugins/index-html-webpack-plugin.js +0 -85
- package/src/webpack/plugins/javascript-optimizer-plugin.js +0 -166
- package/src/webpack/plugins/javascript-optimizer-worker.js +0 -140
- package/src/webpack/plugins/json-stats-plugin.js +0 -61
- package/src/webpack/plugins/karma/karma.js +0 -270
- package/src/webpack/plugins/named-chunks-plugin.js +0 -59
- package/src/webpack/plugins/occurrences-plugin.js +0 -80
- package/src/webpack/plugins/postcss-cli-resources.js +0 -176
- package/src/webpack/plugins/progress-plugin.js +0 -39
- package/src/webpack/plugins/remove-hash-plugin.js +0 -31
- package/src/webpack/plugins/scripts-webpack-plugin.js +0 -180
- package/src/webpack/plugins/service-worker-plugin.js +0 -46
- package/src/webpack/plugins/styles-webpack-plugin.js +0 -73
- package/src/webpack/plugins/suppress-entry-chunks-webpack-plugin.js +0 -52
- package/src/webpack/plugins/transfer-size-plugin.js +0 -50
- package/src/webpack/plugins/typescript.js +0 -51
- package/src/webpack/plugins/watch-files-logs-plugin.js +0 -28
- package/src/webpack/utils/async-chunks.js +0 -46
- package/src/webpack/utils/helpers.js +0 -293
- package/src/webpack/utils/stats.js +0 -443
- /package/src/{babel → tools/babel}/babel-loader.d.ts +0 -0
- /package/src/{babel → tools/babel}/plugins/adjust-static-class-members.d.ts +0 -0
- /package/src/{babel → tools/babel}/plugins/adjust-typescript-enums.d.ts +0 -0
- /package/src/{babel → tools/babel}/plugins/elide-angular-metadata.d.ts +0 -0
- /package/src/{babel → tools/babel}/plugins/pure-toplevel-functions.d.ts +0 -0
- /package/src/{babel → tools/babel}/presets/application.d.ts +0 -0
- /package/src/{builders/browser-esbuild → tools/esbuild}/angular/angular-compilation.d.ts +0 -0
- /package/src/{builders/browser-esbuild → tools/esbuild}/angular/angular-host.d.ts +0 -0
- /package/src/{builders/browser-esbuild → tools/esbuild}/angular/aot-compilation.d.ts +0 -0
- /package/src/{builders/browser-esbuild → tools/esbuild}/angular/compiler-plugin.d.ts +0 -0
- /package/src/{builders/browser-esbuild → tools/esbuild}/angular/diagnostics.d.ts +0 -0
- /package/src/{builders/browser-esbuild → tools/esbuild}/angular/jit-compilation.d.ts +0 -0
- /package/src/{builders/browser-esbuild → tools/esbuild}/angular/jit-plugin-callbacks.d.ts +0 -0
- /package/src/{builders/browser-esbuild → tools/esbuild}/angular/jit-resource-transformer.d.ts +0 -0
- /package/src/{builders/browser-esbuild → tools/esbuild}/angular/uri.d.ts +0 -0
- /package/src/{builders/browser-esbuild → tools/esbuild}/commonjs-checker.d.ts +0 -0
- /package/src/{builders/browser-esbuild → tools/esbuild}/javascript-transformer-worker.d.ts +0 -0
- /package/src/{builders/browser-esbuild → tools/esbuild}/javascript-transformer.d.ts +0 -0
- /package/src/{builders/browser-esbuild → tools/esbuild}/license-extractor.d.ts +0 -0
- /package/src/{builders/browser-esbuild → tools/esbuild}/load-result-cache.d.ts +0 -0
- /package/src/{builders/browser-esbuild → tools/esbuild}/profiling.d.ts +0 -0
- /package/src/{builders/browser-esbuild → tools/esbuild}/sourcemap-ignorelist-plugin.d.ts +0 -0
- /package/src/{builders/browser-esbuild → tools/esbuild}/stylesheets/bundle-options.d.ts +0 -0
- /package/src/{builders/browser-esbuild → tools/esbuild}/stylesheets/css-language.d.ts +0 -0
- /package/src/{builders/browser-esbuild → tools/esbuild}/stylesheets/css-resource-plugin.d.ts +0 -0
- /package/src/{builders/browser-esbuild → tools/esbuild}/stylesheets/less-language.d.ts +0 -0
- /package/src/{builders/browser-esbuild → tools/esbuild}/stylesheets/sass-language.d.ts +0 -0
- /package/src/{builders/browser-esbuild → tools/esbuild}/stylesheets/stylesheet-plugin-factory.d.ts +0 -0
- /package/src/{builders/browser-esbuild → tools/esbuild}/virtual-module-plugin.d.ts +0 -0
- /package/src/{builders/browser-esbuild → tools/esbuild}/watcher.d.ts +0 -0
- /package/src/{sass → tools/sass}/rebasing-importer.d.ts +0 -0
- /package/src/{sass → tools/sass}/sass-service-legacy.d.ts +0 -0
- /package/src/{sass → tools/sass}/sass-service.d.ts +0 -0
- /package/src/{sass → tools/sass}/worker-legacy.d.ts +0 -0
- /package/src/{sass → tools/sass}/worker.d.ts +0 -0
- /package/src/{webpack → tools/webpack}/configs/index.d.ts +0 -0
- /package/src/{webpack → tools/webpack}/plugins/builder-watch-plugin.d.ts +0 -0
- /package/src/{webpack → tools/webpack}/plugins/common-js-usage-warn-plugin.d.ts +0 -0
- /package/src/{webpack → tools/webpack}/plugins/css-optimizer-plugin.d.ts +0 -0
- /package/src/{webpack → tools/webpack}/plugins/dedupe-module-resolve-plugin.d.ts +0 -0
- /package/src/{webpack → tools/webpack}/plugins/devtools-ignore-plugin.d.ts +0 -0
- /package/src/{webpack → tools/webpack}/plugins/esbuild-executor.d.ts +0 -0
- /package/src/{webpack → tools/webpack}/plugins/hmr/hmr-accept.d.ts +0 -0
- /package/src/{webpack → tools/webpack}/plugins/hmr/hmr-loader.d.ts +0 -0
- /package/src/{webpack → tools/webpack}/plugins/index.d.ts +0 -0
- /package/src/{webpack → tools/webpack}/plugins/javascript-optimizer-plugin.d.ts +0 -0
- /package/src/{webpack → tools/webpack}/plugins/javascript-optimizer-worker.d.ts +0 -0
- /package/src/{webpack → tools/webpack}/plugins/json-stats-plugin.d.ts +0 -0
- /package/src/{webpack → tools/webpack}/plugins/karma/karma-context.html +0 -0
- /package/src/{webpack → tools/webpack}/plugins/karma/karma-debug.html +0 -0
- /package/src/{webpack → tools/webpack}/plugins/karma/karma.d.ts +0 -0
- /package/src/{webpack → tools/webpack}/plugins/named-chunks-plugin.d.ts +0 -0
- /package/src/{webpack → tools/webpack}/plugins/occurrences-plugin.d.ts +0 -0
- /package/src/{webpack → tools/webpack}/plugins/postcss-cli-resources.d.ts +0 -0
- /package/src/{webpack → tools/webpack}/plugins/progress-plugin.d.ts +0 -0
- /package/src/{webpack → tools/webpack}/plugins/remove-hash-plugin.d.ts +0 -0
- /package/src/{webpack → tools/webpack}/plugins/scripts-webpack-plugin.d.ts +0 -0
- /package/src/{webpack → tools/webpack}/plugins/service-worker-plugin.d.ts +0 -0
- /package/src/{webpack → tools/webpack}/plugins/styles-webpack-plugin.d.ts +0 -0
- /package/src/{webpack → tools/webpack}/plugins/suppress-entry-chunks-webpack-plugin.d.ts +0 -0
- /package/src/{webpack → tools/webpack}/plugins/transfer-size-plugin.d.ts +0 -0
- /package/src/{webpack → tools/webpack}/plugins/watch-files-logs-plugin.d.ts +0 -0
- /package/src/{webpack → tools/webpack}/utils/async-chunks.d.ts +0 -0
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* @license
|
|
4
|
+
* Copyright Google LLC All Rights Reserved.
|
|
5
|
+
*
|
|
6
|
+
* Use of this source code is governed by an MIT-style license that can be
|
|
7
|
+
* found in the LICENSE file at https://angular.io/license
|
|
8
|
+
*/
|
|
9
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
10
|
+
exports.createWatcher = exports.ChangedFiles = void 0;
|
|
11
|
+
const chokidar_1 = require("chokidar");
|
|
12
|
+
class ChangedFiles {
|
|
13
|
+
constructor() {
|
|
14
|
+
this.added = new Set();
|
|
15
|
+
this.modified = new Set();
|
|
16
|
+
this.removed = new Set();
|
|
17
|
+
}
|
|
18
|
+
toDebugString() {
|
|
19
|
+
const content = {
|
|
20
|
+
added: Array.from(this.added),
|
|
21
|
+
modified: Array.from(this.modified),
|
|
22
|
+
removed: Array.from(this.removed),
|
|
23
|
+
};
|
|
24
|
+
return JSON.stringify(content, null, 2);
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
exports.ChangedFiles = ChangedFiles;
|
|
28
|
+
function createWatcher(options) {
|
|
29
|
+
const watcher = new chokidar_1.FSWatcher({
|
|
30
|
+
usePolling: options?.polling,
|
|
31
|
+
interval: options?.interval,
|
|
32
|
+
ignored: options?.ignored,
|
|
33
|
+
disableGlobbing: true,
|
|
34
|
+
ignoreInitial: true,
|
|
35
|
+
});
|
|
36
|
+
const nextQueue = [];
|
|
37
|
+
let currentChanges;
|
|
38
|
+
let nextWaitTimeout;
|
|
39
|
+
watcher.on('all', (event, path) => {
|
|
40
|
+
switch (event) {
|
|
41
|
+
case 'add':
|
|
42
|
+
currentChanges ?? (currentChanges = new ChangedFiles());
|
|
43
|
+
currentChanges.added.add(path);
|
|
44
|
+
break;
|
|
45
|
+
case 'change':
|
|
46
|
+
currentChanges ?? (currentChanges = new ChangedFiles());
|
|
47
|
+
currentChanges.modified.add(path);
|
|
48
|
+
break;
|
|
49
|
+
case 'unlink':
|
|
50
|
+
currentChanges ?? (currentChanges = new ChangedFiles());
|
|
51
|
+
currentChanges.removed.add(path);
|
|
52
|
+
break;
|
|
53
|
+
default:
|
|
54
|
+
return;
|
|
55
|
+
}
|
|
56
|
+
// Wait 250ms from next change to better capture groups of file save operations.
|
|
57
|
+
if (!nextWaitTimeout) {
|
|
58
|
+
nextWaitTimeout = setTimeout(() => {
|
|
59
|
+
nextWaitTimeout = undefined;
|
|
60
|
+
const next = nextQueue.shift();
|
|
61
|
+
if (next) {
|
|
62
|
+
const value = currentChanges;
|
|
63
|
+
currentChanges = undefined;
|
|
64
|
+
next(value);
|
|
65
|
+
}
|
|
66
|
+
}, 250);
|
|
67
|
+
nextWaitTimeout?.unref();
|
|
68
|
+
}
|
|
69
|
+
});
|
|
70
|
+
return {
|
|
71
|
+
[Symbol.asyncIterator]() {
|
|
72
|
+
return this;
|
|
73
|
+
},
|
|
74
|
+
async next() {
|
|
75
|
+
if (currentChanges && nextQueue.length === 0) {
|
|
76
|
+
const result = { value: currentChanges };
|
|
77
|
+
currentChanges = undefined;
|
|
78
|
+
return result;
|
|
79
|
+
}
|
|
80
|
+
return new Promise((resolve) => {
|
|
81
|
+
nextQueue.push((value) => resolve(value ? { value } : { done: true, value }));
|
|
82
|
+
});
|
|
83
|
+
},
|
|
84
|
+
add(paths) {
|
|
85
|
+
watcher.add(paths);
|
|
86
|
+
},
|
|
87
|
+
remove(paths) {
|
|
88
|
+
watcher.unwatch(paths);
|
|
89
|
+
},
|
|
90
|
+
async close() {
|
|
91
|
+
try {
|
|
92
|
+
await watcher.close();
|
|
93
|
+
if (nextWaitTimeout) {
|
|
94
|
+
clearTimeout(nextWaitTimeout);
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
finally {
|
|
98
|
+
let next;
|
|
99
|
+
while ((next = nextQueue.shift()) !== undefined) {
|
|
100
|
+
next();
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
},
|
|
104
|
+
};
|
|
105
|
+
}
|
|
106
|
+
exports.createWatcher = createWatcher;
|
|
107
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2F0Y2hlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL3BhY2thZ2VzL2FuZ3VsYXJfZGV2a2l0L2J1aWxkX2FuZ3VsYXIvc3JjL3Rvb2xzL2VzYnVpbGQvd2F0Y2hlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUE7Ozs7OztHQU1HOzs7QUFFSCx1Q0FBcUM7QUFFckMsTUFBYSxZQUFZO0lBQXpCO1FBQ1csVUFBSyxHQUFHLElBQUksR0FBRyxFQUFVLENBQUM7UUFDMUIsYUFBUSxHQUFHLElBQUksR0FBRyxFQUFVLENBQUM7UUFDN0IsWUFBTyxHQUFHLElBQUksR0FBRyxFQUFVLENBQUM7SUFXdkMsQ0FBQztJQVRDLGFBQWE7UUFDWCxNQUFNLE9BQU8sR0FBRztZQUNkLEtBQUssRUFBRSxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUM7WUFDN0IsUUFBUSxFQUFFLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQztZQUNuQyxPQUFPLEVBQUUsS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDO1NBQ2xDLENBQUM7UUFFRixPQUFPLElBQUksQ0FBQyxTQUFTLENBQUMsT0FBTyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQztJQUMxQyxDQUFDO0NBQ0Y7QUFkRCxvQ0FjQztBQVFELFNBQWdCLGFBQWEsQ0FBQyxPQUk3QjtJQUNDLE1BQU0sT0FBTyxHQUFHLElBQUksb0JBQVMsQ0FBQztRQUM1QixVQUFVLEVBQUUsT0FBTyxFQUFFLE9BQU87UUFDNUIsUUFBUSxFQUFFLE9BQU8sRUFBRSxRQUFRO1FBQzNCLE9BQU8sRUFBRSxPQUFPLEVBQUUsT0FBTztRQUN6QixlQUFlLEVBQUUsSUFBSTtRQUNyQixhQUFhLEVBQUUsSUFBSTtLQUNwQixDQUFDLENBQUM7SUFFSCxNQUFNLFNBQVMsR0FBdUMsRUFBRSxDQUFDO0lBQ3pE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QyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCBHb29nbGUgTExDIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKlxuICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmVcbiAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2VcbiAqL1xuXG5pbXBvcnQgeyBGU1dhdGNoZXIgfSBmcm9tICdjaG9raWRhcic7XG5cbmV4cG9ydCBjbGFzcyBDaGFuZ2VkRmlsZXMge1xuICByZWFkb25seSBhZGRlZCA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICByZWFkb25seSBtb2RpZmllZCA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICByZWFkb25seSByZW1vdmVkID0gbmV3IFNldDxzdHJpbmc+KCk7XG5cbiAgdG9EZWJ1Z1N0cmluZygpOiBzdHJpbmcge1xuICAgIGNvbnN0IGNvbnRlbnQgPSB7XG4gICAgICBhZGRlZDogQXJyYXkuZnJvbSh0aGlzLmFkZGVkKSxcbiAgICAgIG1vZGlmaWVkOiBBcnJheS5mcm9tKHRoaXMubW9kaWZpZWQpLFxuICAgICAgcmVtb3ZlZDogQXJyYXkuZnJvbSh0aGlzLnJlbW92ZWQpLFxuICAgIH07XG5cbiAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkoY29udGVudCwgbnVsbCwgMik7XG4gIH1cbn1cblxuZXhwb3J0IGludGVyZmFjZSBCdWlsZFdhdGNoZXIgZXh0ZW5kcyBBc3luY0l0ZXJhYmxlSXRlcmF0b3I8Q2hhbmdlZEZpbGVzPiB7XG4gIGFkZChwYXRoczogc3RyaW5nIHwgcmVhZG9ubHkgc3RyaW5nW10pOiB2b2lkO1xuICByZW1vdmUocGF0aHM6IHN0cmluZyB8IHJlYWRvbmx5IHN0cmluZ1tdKTogdm9pZDtcbiAgY2xvc2UoKTogUHJvbWlzZTx2b2lkPjtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVdhdGNoZXIob3B0aW9ucz86IHtcbiAgcG9sbGluZz86IGJvb2xlYW47XG4gIGludGVydmFsPzogbnVtYmVyO1xuICBpZ25vcmVkPzogc3RyaW5nW107XG59KTogQnVpbGRXYXRjaGVyIHtcbiAgY29uc3Qgd2F0Y2hlciA9IG5ldyBGU1dhdGNoZXIoe1xuICAgIHVzZVBvbGxpbmc6IG9wdGlvbnM/LnBvbGxpbmcsXG4gICAgaW50ZXJ2YWw6IG9wdGlvbnM/LmludGVydmFsLFxuICAgIGlnbm9yZWQ6IG9wdGlvbnM/Lmlnbm9yZWQsXG4gICAgZGlzYWJsZUdsb2JiaW5nOiB0cnVlLFxuICAgIGlnbm9yZUluaXRpYWw6IHRydWUsXG4gIH0pO1xuXG4gIGNvbnN0IG5leHRRdWV1ZTogKCh2YWx1ZT86IENoYW5nZWRGaWxlcykgPT4gdm9pZClbXSA9IFtdO1xuICBsZXQgY3VycmVudENoYW5nZXM6IENoYW5nZWRGaWxlcyB8IHVuZGVmaW5lZDtcbiAgbGV0IG5leHRXYWl0VGltZW91dDogTm9kZUpTLlRpbWVvdXQgfCB1bmRlZmluZWQ7XG5cbiAgd2F0Y2hlci5vbignYWxsJywgKGV2ZW50LCBwYXRoKSA9PiB7XG4gICAgc3dpdGNoIChldmVudCkge1xuICAgICAgY2FzZSAnYWRkJzpcbiAgICAgICAgY3VycmVudENoYW5nZXMgPz89IG5ldyBDaGFuZ2VkRmlsZXMoKTtcbiAgICAgICAgY3VycmVudENoYW5nZXMuYWRkZWQuYWRkKHBhdGgpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ2NoYW5nZSc6XG4gICAgICAgIGN1cnJlbnRDaGFuZ2VzID8/PSBuZXcgQ2hhbmdlZEZpbGVzKCk7XG4gICAgICAgIGN1cnJlbnRDaGFuZ2VzLm1vZGlmaWVkLmFkZChwYXRoKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICd1bmxpbmsnOlxuICAgICAgICBjdXJyZW50Q2hhbmdlcyA/Pz0gbmV3IENoYW5nZWRGaWxlcygpO1xuICAgICAgICBjdXJyZW50Q2hhbmdlcy5yZW1vdmVkLmFkZChwYXRoKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gV2FpdCAyNTBtcyBmcm9tIG5leHQgY2hhbmdlIHRvIGJldHRlciBjYXB0dXJlIGdyb3VwcyBvZiBmaWxlIHNhdmUgb3BlcmF0aW9ucy5cbiAgICBpZiAoIW5leHRXYWl0VGltZW91dCkge1xuICAgICAgbmV4dFdhaXRUaW1lb3V0ID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIG5leHRXYWl0VGltZW91dCA9IHVuZGVmaW5lZDtcbiAgICAgICAgY29uc3QgbmV4dCA9IG5leHRRdWV1ZS5zaGlmdCgpO1xuICAgICAgICBpZiAobmV4dCkge1xuICAgICAgICAgIGNvbnN0IHZhbHVlID0gY3VycmVudENoYW5nZXM7XG4gICAgICAgICAgY3VycmVudENoYW5nZXMgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgbmV4dCh2YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgIH0sIDI1MCk7XG4gICAgICBuZXh0V2FpdFRpbWVvdXQ/LnVucmVmKCk7XG4gICAgfVxuICB9KTtcblxuICByZXR1cm4ge1xuICAgIFtTeW1ib2wuYXN5bmNJdGVyYXRvcl0oKSB7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9LFxuXG4gICAgYXN5bmMgbmV4dCgpIHtcbiAgICAgIGlmIChjdXJyZW50Q2hhbmdlcyAmJiBuZXh0UXVldWUubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IHsgdmFsdWU6IGN1cnJlbnRDaGFuZ2VzIH07XG4gICAgICAgIGN1cnJlbnRDaGFuZ2VzID0gdW5kZWZpbmVkO1xuXG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xuICAgICAgICBuZXh0UXVldWUucHVzaCgodmFsdWUpID0+IHJlc29sdmUodmFsdWUgPyB7IHZhbHVlIH0gOiB7IGRvbmU6IHRydWUsIHZhbHVlIH0pKTtcbiAgICAgIH0pO1xuICAgIH0sXG5cbiAgICBhZGQocGF0aHMpIHtcbiAgICAgIHdhdGNoZXIuYWRkKHBhdGhzKTtcbiAgICB9LFxuXG4gICAgcmVtb3ZlKHBhdGhzKSB7XG4gICAgICB3YXRjaGVyLnVud2F0Y2gocGF0aHMpO1xuICAgIH0sXG5cbiAgICBhc3luYyBjbG9zZSgpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IHdhdGNoZXIuY2xvc2UoKTtcbiAgICAgICAgaWYgKG5leHRXYWl0VGltZW91dCkge1xuICAgICAgICAgIGNsZWFyVGltZW91dChuZXh0V2FpdFRpbWVvdXQpO1xuICAgICAgICB9XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICBsZXQgbmV4dDtcbiAgICAgICAgd2hpbGUgKChuZXh0ID0gbmV4dFF1ZXVlLnNoaWZ0KCkpICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICBuZXh0KCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LFxuICB9O1xufVxuIl19
|
|
@@ -0,0 +1,445 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* @license
|
|
4
|
+
* Copyright Google LLC All Rights Reserved.
|
|
5
|
+
*
|
|
6
|
+
* Use of this source code is governed by an MIT-style license that can be
|
|
7
|
+
* found in the LICENSE file at https://angular.io/license
|
|
8
|
+
*/
|
|
9
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
10
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
11
|
+
};
|
|
12
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
13
|
+
exports.sassBindWorkaround = exports.LoadPathsUrlRebasingImporter = exports.ModuleUrlRebasingImporter = exports.RelativeUrlRebasingImporter = void 0;
|
|
14
|
+
const magic_string_1 = __importDefault(require("magic-string"));
|
|
15
|
+
const node_fs_1 = require("node:fs");
|
|
16
|
+
const node_path_1 = require("node:path");
|
|
17
|
+
const node_url_1 = require("node:url");
|
|
18
|
+
/**
|
|
19
|
+
* A Sass Importer base class that provides the load logic to rebase all `url()` functions
|
|
20
|
+
* within a stylesheet. The rebasing will ensure that the URLs in the output of the Sass compiler
|
|
21
|
+
* reflect the final filesystem location of the output CSS file.
|
|
22
|
+
*
|
|
23
|
+
* This class provides the core of the rebasing functionality. To ensure that each file is processed
|
|
24
|
+
* by this importer's load implementation, the Sass compiler requires the importer's canonicalize
|
|
25
|
+
* function to return a non-null value with the resolved location of the requested stylesheet.
|
|
26
|
+
* Concrete implementations of this class must provide this canonicalize functionality for rebasing
|
|
27
|
+
* to be effective.
|
|
28
|
+
*/
|
|
29
|
+
class UrlRebasingImporter {
|
|
30
|
+
/**
|
|
31
|
+
* @param entryDirectory The directory of the entry stylesheet that was passed to the Sass compiler.
|
|
32
|
+
* @param rebaseSourceMaps When provided, rebased files will have an intermediate sourcemap added to the Map
|
|
33
|
+
* which can be used to generate a final sourcemap that contains original sources.
|
|
34
|
+
*/
|
|
35
|
+
constructor(entryDirectory, rebaseSourceMaps) {
|
|
36
|
+
this.entryDirectory = entryDirectory;
|
|
37
|
+
this.rebaseSourceMaps = rebaseSourceMaps;
|
|
38
|
+
}
|
|
39
|
+
load(canonicalUrl) {
|
|
40
|
+
const stylesheetPath = (0, node_url_1.fileURLToPath)(canonicalUrl);
|
|
41
|
+
const stylesheetDirectory = (0, node_path_1.dirname)(stylesheetPath);
|
|
42
|
+
let contents = (0, node_fs_1.readFileSync)(stylesheetPath, 'utf-8');
|
|
43
|
+
// Rebase any URLs that are found
|
|
44
|
+
let updatedContents;
|
|
45
|
+
for (const { start, end, value } of findUrls(contents)) {
|
|
46
|
+
// Skip if value is empty or a Sass variable
|
|
47
|
+
if (value.length === 0 || value.startsWith('$')) {
|
|
48
|
+
continue;
|
|
49
|
+
}
|
|
50
|
+
// Skip if root-relative, absolute or protocol relative url
|
|
51
|
+
if (/^((?:\w+:)?\/\/|data:|chrome:|#|\/)/.test(value)) {
|
|
52
|
+
continue;
|
|
53
|
+
}
|
|
54
|
+
const rebasedPath = (0, node_path_1.relative)(this.entryDirectory, (0, node_path_1.join)(stylesheetDirectory, value));
|
|
55
|
+
// Normalize path separators and escape characters
|
|
56
|
+
// https://developer.mozilla.org/en-US/docs/Web/CSS/url#syntax
|
|
57
|
+
const rebasedUrl = './' + rebasedPath.replace(/\\/g, '/').replace(/[()\s'"]/g, '\\$&');
|
|
58
|
+
updatedContents ?? (updatedContents = new magic_string_1.default(contents));
|
|
59
|
+
updatedContents.update(start, end, rebasedUrl);
|
|
60
|
+
}
|
|
61
|
+
if (updatedContents) {
|
|
62
|
+
contents = updatedContents.toString();
|
|
63
|
+
if (this.rebaseSourceMaps) {
|
|
64
|
+
// Generate an intermediate source map for the rebasing changes
|
|
65
|
+
const map = updatedContents.generateMap({
|
|
66
|
+
hires: true,
|
|
67
|
+
includeContent: true,
|
|
68
|
+
source: canonicalUrl.href,
|
|
69
|
+
});
|
|
70
|
+
this.rebaseSourceMaps.set(canonicalUrl.href, map);
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
let syntax;
|
|
74
|
+
switch ((0, node_path_1.extname)(stylesheetPath).toLowerCase()) {
|
|
75
|
+
case '.css':
|
|
76
|
+
syntax = 'css';
|
|
77
|
+
break;
|
|
78
|
+
case '.sass':
|
|
79
|
+
syntax = 'indented';
|
|
80
|
+
break;
|
|
81
|
+
default:
|
|
82
|
+
syntax = 'scss';
|
|
83
|
+
break;
|
|
84
|
+
}
|
|
85
|
+
return {
|
|
86
|
+
contents,
|
|
87
|
+
syntax,
|
|
88
|
+
sourceMapUrl: canonicalUrl,
|
|
89
|
+
};
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
/**
|
|
93
|
+
* Determines if a unicode code point is a CSS whitespace character.
|
|
94
|
+
* @param code The unicode code point to test.
|
|
95
|
+
* @returns true, if the code point is CSS whitespace; false, otherwise.
|
|
96
|
+
*/
|
|
97
|
+
function isWhitespace(code) {
|
|
98
|
+
// Based on https://www.w3.org/TR/css-syntax-3/#whitespace
|
|
99
|
+
switch (code) {
|
|
100
|
+
case 0x0009: // tab
|
|
101
|
+
case 0x0020: // space
|
|
102
|
+
case 0x000a: // line feed
|
|
103
|
+
case 0x000c: // form feed
|
|
104
|
+
case 0x000d: // carriage return
|
|
105
|
+
return true;
|
|
106
|
+
default:
|
|
107
|
+
return false;
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
/**
|
|
111
|
+
* Scans a CSS or Sass file and locates all valid url function values as defined by the CSS
|
|
112
|
+
* syntax specification.
|
|
113
|
+
* @param contents A string containing a CSS or Sass file to scan.
|
|
114
|
+
* @returns An iterable that yields each CSS url function value found.
|
|
115
|
+
*/
|
|
116
|
+
function* findUrls(contents) {
|
|
117
|
+
let pos = 0;
|
|
118
|
+
let width = 1;
|
|
119
|
+
let current = -1;
|
|
120
|
+
const next = () => {
|
|
121
|
+
pos += width;
|
|
122
|
+
current = contents.codePointAt(pos) ?? -1;
|
|
123
|
+
width = current > 0xffff ? 2 : 1;
|
|
124
|
+
return current;
|
|
125
|
+
};
|
|
126
|
+
// Based on https://www.w3.org/TR/css-syntax-3/#consume-ident-like-token
|
|
127
|
+
while ((pos = contents.indexOf('url(', pos)) !== -1) {
|
|
128
|
+
// Set to position of the (
|
|
129
|
+
pos += 3;
|
|
130
|
+
width = 1;
|
|
131
|
+
// Consume all leading whitespace
|
|
132
|
+
while (isWhitespace(next())) {
|
|
133
|
+
/* empty */
|
|
134
|
+
}
|
|
135
|
+
// Initialize URL state
|
|
136
|
+
const url = { start: pos, end: -1, value: '' };
|
|
137
|
+
let complete = false;
|
|
138
|
+
// If " or ', then consume the value as a string
|
|
139
|
+
if (current === 0x0022 || current === 0x0027) {
|
|
140
|
+
const ending = current;
|
|
141
|
+
// Based on https://www.w3.org/TR/css-syntax-3/#consume-string-token
|
|
142
|
+
while (!complete) {
|
|
143
|
+
switch (next()) {
|
|
144
|
+
case -1: // EOF
|
|
145
|
+
return;
|
|
146
|
+
case 0x000a: // line feed
|
|
147
|
+
case 0x000c: // form feed
|
|
148
|
+
case 0x000d: // carriage return
|
|
149
|
+
// Invalid
|
|
150
|
+
complete = true;
|
|
151
|
+
break;
|
|
152
|
+
case 0x005c: // \ -- character escape
|
|
153
|
+
// If not EOF or newline, add the character after the escape
|
|
154
|
+
switch (next()) {
|
|
155
|
+
case -1:
|
|
156
|
+
return;
|
|
157
|
+
case 0x000a: // line feed
|
|
158
|
+
case 0x000c: // form feed
|
|
159
|
+
case 0x000d: // carriage return
|
|
160
|
+
// Skip when inside a string
|
|
161
|
+
break;
|
|
162
|
+
default:
|
|
163
|
+
// TODO: Handle hex escape codes
|
|
164
|
+
url.value += String.fromCodePoint(current);
|
|
165
|
+
break;
|
|
166
|
+
}
|
|
167
|
+
break;
|
|
168
|
+
case ending:
|
|
169
|
+
// Full string position should include the quotes for replacement
|
|
170
|
+
url.end = pos + 1;
|
|
171
|
+
complete = true;
|
|
172
|
+
yield url;
|
|
173
|
+
break;
|
|
174
|
+
default:
|
|
175
|
+
url.value += String.fromCodePoint(current);
|
|
176
|
+
break;
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
next();
|
|
180
|
+
continue;
|
|
181
|
+
}
|
|
182
|
+
// Based on https://www.w3.org/TR/css-syntax-3/#consume-url-token
|
|
183
|
+
while (!complete) {
|
|
184
|
+
switch (current) {
|
|
185
|
+
case -1: // EOF
|
|
186
|
+
return;
|
|
187
|
+
case 0x0022: // "
|
|
188
|
+
case 0x0027: // '
|
|
189
|
+
case 0x0028: // (
|
|
190
|
+
// Invalid
|
|
191
|
+
complete = true;
|
|
192
|
+
break;
|
|
193
|
+
case 0x0029: // )
|
|
194
|
+
// URL is valid and complete
|
|
195
|
+
url.end = pos;
|
|
196
|
+
complete = true;
|
|
197
|
+
break;
|
|
198
|
+
case 0x005c: // \ -- character escape
|
|
199
|
+
// If not EOF or newline, add the character after the escape
|
|
200
|
+
switch (next()) {
|
|
201
|
+
case -1: // EOF
|
|
202
|
+
return;
|
|
203
|
+
case 0x000a: // line feed
|
|
204
|
+
case 0x000c: // form feed
|
|
205
|
+
case 0x000d: // carriage return
|
|
206
|
+
// Invalid
|
|
207
|
+
complete = true;
|
|
208
|
+
break;
|
|
209
|
+
default:
|
|
210
|
+
// TODO: Handle hex escape codes
|
|
211
|
+
url.value += String.fromCodePoint(current);
|
|
212
|
+
break;
|
|
213
|
+
}
|
|
214
|
+
break;
|
|
215
|
+
default:
|
|
216
|
+
if (isWhitespace(current)) {
|
|
217
|
+
while (isWhitespace(next())) {
|
|
218
|
+
/* empty */
|
|
219
|
+
}
|
|
220
|
+
// Unescaped whitespace is only valid before the closing )
|
|
221
|
+
if (current === 0x0029) {
|
|
222
|
+
// URL is valid
|
|
223
|
+
url.end = pos;
|
|
224
|
+
}
|
|
225
|
+
complete = true;
|
|
226
|
+
}
|
|
227
|
+
else {
|
|
228
|
+
// Add the character to the url value
|
|
229
|
+
url.value += String.fromCodePoint(current);
|
|
230
|
+
}
|
|
231
|
+
break;
|
|
232
|
+
}
|
|
233
|
+
next();
|
|
234
|
+
}
|
|
235
|
+
// An end position indicates a URL was found
|
|
236
|
+
if (url.end !== -1) {
|
|
237
|
+
yield url;
|
|
238
|
+
}
|
|
239
|
+
}
|
|
240
|
+
}
|
|
241
|
+
/**
|
|
242
|
+
* Provides the Sass importer logic to resolve relative stylesheet imports via both import and use rules
|
|
243
|
+
* and also rebase any `url()` function usage within those stylesheets. The rebasing will ensure that
|
|
244
|
+
* the URLs in the output of the Sass compiler reflect the final filesystem location of the output CSS file.
|
|
245
|
+
*/
|
|
246
|
+
class RelativeUrlRebasingImporter extends UrlRebasingImporter {
|
|
247
|
+
constructor(entryDirectory, directoryCache = new Map(), rebaseSourceMaps) {
|
|
248
|
+
super(entryDirectory, rebaseSourceMaps);
|
|
249
|
+
this.directoryCache = directoryCache;
|
|
250
|
+
}
|
|
251
|
+
canonicalize(url, options) {
|
|
252
|
+
return this.resolveImport(url, options.fromImport, true);
|
|
253
|
+
}
|
|
254
|
+
/**
|
|
255
|
+
* Attempts to resolve a provided URL to a stylesheet file using the Sass compiler's resolution algorithm.
|
|
256
|
+
* Based on https://github.com/sass/dart-sass/blob/44d6bb6ac72fe6b93f5bfec371a1fffb18e6b76d/lib/src/importer/utils.dart
|
|
257
|
+
* @param url The file protocol URL to resolve.
|
|
258
|
+
* @param fromImport If true, URL was from an import rule; otherwise from a use rule.
|
|
259
|
+
* @param checkDirectory If true, try checking for a directory with the base name containing an index file.
|
|
260
|
+
* @returns A full resolved URL of the stylesheet file or `null` if not found.
|
|
261
|
+
*/
|
|
262
|
+
resolveImport(url, fromImport, checkDirectory) {
|
|
263
|
+
let stylesheetPath;
|
|
264
|
+
try {
|
|
265
|
+
stylesheetPath = (0, node_url_1.fileURLToPath)(url);
|
|
266
|
+
}
|
|
267
|
+
catch {
|
|
268
|
+
// Only file protocol URLs are supported by this importer
|
|
269
|
+
return null;
|
|
270
|
+
}
|
|
271
|
+
const directory = (0, node_path_1.dirname)(stylesheetPath);
|
|
272
|
+
const extension = (0, node_path_1.extname)(stylesheetPath);
|
|
273
|
+
const hasStyleExtension = extension === '.scss' || extension === '.sass' || extension === '.css';
|
|
274
|
+
// Remove the style extension if present to allow adding the `.import` suffix
|
|
275
|
+
const filename = (0, node_path_1.basename)(stylesheetPath, hasStyleExtension ? extension : undefined);
|
|
276
|
+
const importPotentials = new Set();
|
|
277
|
+
const defaultPotentials = new Set();
|
|
278
|
+
if (hasStyleExtension) {
|
|
279
|
+
if (fromImport) {
|
|
280
|
+
importPotentials.add(filename + '.import' + extension);
|
|
281
|
+
importPotentials.add('_' + filename + '.import' + extension);
|
|
282
|
+
}
|
|
283
|
+
defaultPotentials.add(filename + extension);
|
|
284
|
+
defaultPotentials.add('_' + filename + extension);
|
|
285
|
+
}
|
|
286
|
+
else {
|
|
287
|
+
if (fromImport) {
|
|
288
|
+
importPotentials.add(filename + '.import.scss');
|
|
289
|
+
importPotentials.add(filename + '.import.sass');
|
|
290
|
+
importPotentials.add(filename + '.import.css');
|
|
291
|
+
importPotentials.add('_' + filename + '.import.scss');
|
|
292
|
+
importPotentials.add('_' + filename + '.import.sass');
|
|
293
|
+
importPotentials.add('_' + filename + '.import.css');
|
|
294
|
+
}
|
|
295
|
+
defaultPotentials.add(filename + '.scss');
|
|
296
|
+
defaultPotentials.add(filename + '.sass');
|
|
297
|
+
defaultPotentials.add(filename + '.css');
|
|
298
|
+
defaultPotentials.add('_' + filename + '.scss');
|
|
299
|
+
defaultPotentials.add('_' + filename + '.sass');
|
|
300
|
+
defaultPotentials.add('_' + filename + '.css');
|
|
301
|
+
}
|
|
302
|
+
let foundDefaults;
|
|
303
|
+
let foundImports;
|
|
304
|
+
let hasPotentialIndex = false;
|
|
305
|
+
let cachedEntries = this.directoryCache.get(directory);
|
|
306
|
+
if (cachedEntries) {
|
|
307
|
+
// If there is a preprocessed cache of the directory, perform an intersection of the potentials
|
|
308
|
+
// and the directory files.
|
|
309
|
+
const { files, directories } = cachedEntries;
|
|
310
|
+
foundDefaults = [...defaultPotentials].filter((potential) => files.has(potential));
|
|
311
|
+
foundImports = [...importPotentials].filter((potential) => files.has(potential));
|
|
312
|
+
hasPotentialIndex = checkDirectory && !hasStyleExtension && directories.has(filename);
|
|
313
|
+
}
|
|
314
|
+
else {
|
|
315
|
+
// If no preprocessed cache exists, get the entries from the file system and, while searching,
|
|
316
|
+
// generate the cache for later requests.
|
|
317
|
+
let entries;
|
|
318
|
+
try {
|
|
319
|
+
entries = (0, node_fs_1.readdirSync)(directory, { withFileTypes: true });
|
|
320
|
+
}
|
|
321
|
+
catch {
|
|
322
|
+
return null;
|
|
323
|
+
}
|
|
324
|
+
foundDefaults = [];
|
|
325
|
+
foundImports = [];
|
|
326
|
+
cachedEntries = { files: new Set(), directories: new Set() };
|
|
327
|
+
for (const entry of entries) {
|
|
328
|
+
const isDirectory = entry.isDirectory();
|
|
329
|
+
if (isDirectory) {
|
|
330
|
+
cachedEntries.directories.add(entry.name);
|
|
331
|
+
}
|
|
332
|
+
// Record if the name should be checked as a directory with an index file
|
|
333
|
+
if (checkDirectory && !hasStyleExtension && entry.name === filename && isDirectory) {
|
|
334
|
+
hasPotentialIndex = true;
|
|
335
|
+
}
|
|
336
|
+
if (!entry.isFile()) {
|
|
337
|
+
continue;
|
|
338
|
+
}
|
|
339
|
+
cachedEntries.files.add(entry.name);
|
|
340
|
+
if (importPotentials.has(entry.name)) {
|
|
341
|
+
foundImports.push(entry.name);
|
|
342
|
+
}
|
|
343
|
+
if (defaultPotentials.has(entry.name)) {
|
|
344
|
+
foundDefaults.push(entry.name);
|
|
345
|
+
}
|
|
346
|
+
}
|
|
347
|
+
this.directoryCache.set(directory, cachedEntries);
|
|
348
|
+
}
|
|
349
|
+
// `foundImports` will only contain elements if `options.fromImport` is true
|
|
350
|
+
const result = this.checkFound(foundImports) ?? this.checkFound(foundDefaults);
|
|
351
|
+
if (result !== null) {
|
|
352
|
+
return (0, node_url_1.pathToFileURL)((0, node_path_1.join)(directory, result));
|
|
353
|
+
}
|
|
354
|
+
if (hasPotentialIndex) {
|
|
355
|
+
// Check for index files using filename as a directory
|
|
356
|
+
return this.resolveImport(url + '/index', fromImport, false);
|
|
357
|
+
}
|
|
358
|
+
return null;
|
|
359
|
+
}
|
|
360
|
+
/**
|
|
361
|
+
* Checks an array of potential stylesheet files to determine if there is a valid
|
|
362
|
+
* stylesheet file. More than one discovered file may indicate an error.
|
|
363
|
+
* @param found An array of discovered stylesheet files.
|
|
364
|
+
* @returns A fully resolved path for a stylesheet file or `null` if not found.
|
|
365
|
+
* @throws If there are ambiguous files discovered.
|
|
366
|
+
*/
|
|
367
|
+
checkFound(found) {
|
|
368
|
+
if (found.length === 0) {
|
|
369
|
+
// Not found
|
|
370
|
+
return null;
|
|
371
|
+
}
|
|
372
|
+
// More than one found file may be an error
|
|
373
|
+
if (found.length > 1) {
|
|
374
|
+
// Presence of CSS files alongside a Sass file does not cause an error
|
|
375
|
+
const foundWithoutCss = found.filter((element) => (0, node_path_1.extname)(element) !== '.css');
|
|
376
|
+
// If the length is zero then there are two or more css files
|
|
377
|
+
// If the length is more than one than there are two or more sass/scss files
|
|
378
|
+
if (foundWithoutCss.length !== 1) {
|
|
379
|
+
throw new Error('Ambiguous import detected.');
|
|
380
|
+
}
|
|
381
|
+
// Return the non-CSS file (sass/scss files have priority)
|
|
382
|
+
// https://github.com/sass/dart-sass/blob/44d6bb6ac72fe6b93f5bfec371a1fffb18e6b76d/lib/src/importer/utils.dart#L44-L47
|
|
383
|
+
return foundWithoutCss[0];
|
|
384
|
+
}
|
|
385
|
+
return found[0];
|
|
386
|
+
}
|
|
387
|
+
}
|
|
388
|
+
exports.RelativeUrlRebasingImporter = RelativeUrlRebasingImporter;
|
|
389
|
+
/**
|
|
390
|
+
* Provides the Sass importer logic to resolve module (npm package) stylesheet imports via both import and
|
|
391
|
+
* use rules and also rebase any `url()` function usage within those stylesheets. The rebasing will ensure that
|
|
392
|
+
* the URLs in the output of the Sass compiler reflect the final filesystem location of the output CSS file.
|
|
393
|
+
*/
|
|
394
|
+
class ModuleUrlRebasingImporter extends RelativeUrlRebasingImporter {
|
|
395
|
+
constructor(entryDirectory, directoryCache, rebaseSourceMaps, finder) {
|
|
396
|
+
super(entryDirectory, directoryCache, rebaseSourceMaps);
|
|
397
|
+
this.finder = finder;
|
|
398
|
+
}
|
|
399
|
+
canonicalize(url, options) {
|
|
400
|
+
if (url.startsWith('file://')) {
|
|
401
|
+
return super.canonicalize(url, options);
|
|
402
|
+
}
|
|
403
|
+
const result = this.finder(url, options);
|
|
404
|
+
return result ? super.canonicalize(result.href, options) : null;
|
|
405
|
+
}
|
|
406
|
+
}
|
|
407
|
+
exports.ModuleUrlRebasingImporter = ModuleUrlRebasingImporter;
|
|
408
|
+
/**
|
|
409
|
+
* Provides the Sass importer logic to resolve load paths located stylesheet imports via both import and
|
|
410
|
+
* use rules and also rebase any `url()` function usage within those stylesheets. The rebasing will ensure that
|
|
411
|
+
* the URLs in the output of the Sass compiler reflect the final filesystem location of the output CSS file.
|
|
412
|
+
*/
|
|
413
|
+
class LoadPathsUrlRebasingImporter extends RelativeUrlRebasingImporter {
|
|
414
|
+
constructor(entryDirectory, directoryCache, rebaseSourceMaps, loadPaths) {
|
|
415
|
+
super(entryDirectory, directoryCache, rebaseSourceMaps);
|
|
416
|
+
this.loadPaths = loadPaths;
|
|
417
|
+
}
|
|
418
|
+
canonicalize(url, options) {
|
|
419
|
+
if (url.startsWith('file://')) {
|
|
420
|
+
return super.canonicalize(url, options);
|
|
421
|
+
}
|
|
422
|
+
let result = null;
|
|
423
|
+
for (const loadPath of this.loadPaths) {
|
|
424
|
+
result = super.canonicalize((0, node_url_1.pathToFileURL)((0, node_path_1.join)(loadPath, url)).href, options);
|
|
425
|
+
if (result !== null) {
|
|
426
|
+
break;
|
|
427
|
+
}
|
|
428
|
+
}
|
|
429
|
+
return result;
|
|
430
|
+
}
|
|
431
|
+
}
|
|
432
|
+
exports.LoadPathsUrlRebasingImporter = LoadPathsUrlRebasingImporter;
|
|
433
|
+
/**
|
|
434
|
+
* Workaround for Sass not calling instance methods with `this`.
|
|
435
|
+
* The `canonicalize` and `load` methods will be bound to the class instance.
|
|
436
|
+
* @param importer A Sass importer to bind.
|
|
437
|
+
* @returns The bound Sass importer.
|
|
438
|
+
*/
|
|
439
|
+
function sassBindWorkaround(importer) {
|
|
440
|
+
importer.canonicalize = importer.canonicalize.bind(importer);
|
|
441
|
+
importer.load = importer.load.bind(importer);
|
|
442
|
+
return importer;
|
|
443
|
+
}
|
|
444
|
+
exports.sassBindWorkaround = sassBindWorkaround;
|
|
445
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmViYXNpbmctaW1wb3J0ZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9hbmd1bGFyX2RldmtpdC9idWlsZF9hbmd1bGFyL3NyYy90b29scy9zYXNzL3JlYmFzaW5nLWltcG9ydGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQTs7Ozs7O0dBTUc7Ozs7OztBQUdILGdFQUF1QztBQUN2QyxxQ0FBb0Q7QUFDcEQseUNBQXVFO0FBQ3ZFLHVDQUF3RDtBQVl4RDs7Ozs7Ozs7OztHQVVHO0FBQ0gsTUFBZSxtQkFBbUI7SUFDaEM7Ozs7T0FJRztJQUNILFlBQ1UsY0FBc0IsRUFDdEIsZ0JBQTRDO1FBRDVDLG1CQUFjLEdBQWQsY0FBYyxDQUFRO1FBQ3RCLHFCQUFnQixHQUFoQixnQkFBZ0IsQ0FBNEI7SUFDbkQsQ0FBQztJQUlKLElBQUksQ0FBQyxZQUFpQjtRQUNwQixNQUFNLGNBQWMsR0FBRyxJQUFBLHdCQUFhLEVBQUMsWUFBWSxDQUFDLENBQUM7UUFDbkQsTUFBTSxtQkFBbUIsR0FBRyxJQUFBLG1CQUFPLEVBQUMsY0FBYyxDQUFDLENBQUM7UUFDcEQsSUFBSSxRQUFRLEdBQUcsSUFBQSxzQkFBWSxFQUFDLGNBQWMsRUFBRSxPQUFPLENBQUMsQ0FBQztRQUVyRCxpQ0FBaUM7UUFDakMsSUFBSSxlQUFlLENBQUM7UUFDcEIsS0FBSyxNQUFNLEVBQUUsS0FBSyxFQUFFLEdBQUcsRUFBRSxLQUFLLEVBQUUsSUFBSSxRQUFRLENBQUMsUUFBUSxDQUFDLEVBQUU7WUFDdEQsNENBQTRDO1lBQzVDLElBQUksS0FBSyxDQUFDLE1BQU0sS0FBSyxDQUFDLElBQUksS0FBSyxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsRUFBRTtnQkFDL0MsU0FBUzthQUNWO1lBRUQsMkRBQTJEO1lBQzNELElBQUkscUNBQXFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUFFO2dCQUNyRCxTQUFT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LElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUU3QyxPQUFPLFFBQVEsQ0FBQztBQUNsQixDQUFDO0FBTEQsZ0RBS0MiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgR29vZ2xlIExMQyBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICpcbiAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlXG4gKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlXG4gKi9cblxuaW1wb3J0IHsgUmF3U291cmNlTWFwIH0gZnJvbSAnQGFtcHByb2plY3QvcmVtYXBwaW5nJztcbmltcG9ydCBNYWdpY1N0cmluZyBmcm9tICdtYWdpYy1zdHJpbmcnO1xuaW1wb3J0IHsgcmVhZEZpbGVTeW5jLCByZWFkZGlyU3luYyB9IGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHsgYmFzZW5hbWUsIGRpcm5hbWUsIGV4dG5hbWUsIGpvaW4sIHJlbGF0aXZlIH0gZnJvbSAnbm9kZTpwYXRoJztcbmltcG9ydCB7IGZpbGVVUkxUb1BhdGgsIHBhdGhUb0ZpbGVVUkwgfSBmcm9tICdub2RlOnVybCc7XG5pbXBvcnQgdHlwZSB7IEZpbGVJbXBvcnRlciwgSW1wb3J0ZXIsIEltcG9ydGVyUmVzdWx0LCBTeW50YXggfSBmcm9tICdzYXNzJztcblxuLyoqXG4gKiBBIHByZXByb2Nlc3NlZCBjYWNoZSBlbnRyeSBmb3IgdGhlIGZpbGVzIGFuZCBkaXJlY3RvcmllcyB3aXRoaW4gYSBwcmV2aW91c2x5IHNlYXJjaGVkXG4gKiBkaXJlY3Rvcnkgd2hlbiBwZXJmb3JtaW5nIFNhc3MgaW1wb3J0IHJlc29sdXRpb24uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRGlyZWN0b3J5RW50cnkge1xuICBmaWxlczogU2V0PHN0cmluZz47XG4gIGRpcmVjdG9yaWVzOiBTZXQ8c3RyaW5nPjtcbn1cblxuLyoqXG4gKiBBIFNhc3MgSW1wb3J0ZXIgYmFzZSBjbGFzcyB0aGF0IHByb3ZpZGVzIHRoZSBsb2FkIGxvZ2ljIHRvIHJlYmFzZSBhbGwgYHVybCgpYCBmdW5jdGlvbnNcbiAqIHdpdGhpbiBhIHN0eWxlc2hlZXQuIFRoZSByZWJhc2luZyB3aWxsIGVuc3VyZSB0aGF0IHRoZSBVUkxzIGluIHRoZSBvdXRwdXQgb2YgdGhlIFNhc3MgY29tcGlsZXJcbiAqIHJlZmxlY3QgdGhlIGZpbmFsIGZpbGVzeXN0ZW0gbG9jYXRpb24gb2YgdGhlIG91dHB1dCBDU1MgZmlsZS5cbiAqXG4gKiBUaGlzIGNsYXNzIHByb3ZpZGVzIHRoZSBjb3JlIG9mIHRoZSByZWJhc2luZyBmdW5jdGlvbmFsaXR5LiBUbyBlbnN1cmUgdGhhdCBlYWNoIGZpbGUgaXMgcHJvY2Vzc2VkXG4gKiBieSB0aGlzIGltcG9ydGVyJ3MgbG9hZCBpbXBsZW1lbnRhdGlvbiwgdGhlIFNhc3MgY29tcGlsZXIgcmVxdWlyZXMgdGhlIGltcG9ydGVyJ3MgY2Fub25pY2FsaXplXG4gKiBmdW5jdGlvbiB0byByZXR1cm4gYSBub24tbnVsbCB2YWx1ZSB3aXRoIHRoZSByZXNvbHZlZCBsb2NhdGlvbiBvZiB0aGUgcmVxdWVzdGVkIHN0eWxlc2hlZXQuXG4gKiBDb25jcmV0ZSBpbXBsZW1lbnRhdGlvbnMgb2YgdGhpcyBjbGFzcyBtdXN0IHByb3ZpZGUgdGhpcyBjYW5vbmljYWxpemUgZnVuY3Rpb25hbGl0eSBmb3IgcmViYXNpbmdcbiAqIHRvIGJlIGVmZmVjdGl2ZS5cbiAqL1xuYWJzdHJhY3QgY2xhc3MgVXJsUmViYXNpbmdJbXBvcnRlciBpbXBsZW1lbnRzIEltcG9ydGVyPCdzeW5jJz4ge1xuICAvKipcbiAgICogQHBhcmFtIGVudHJ5RGlyZWN0b3J5IFRoZSBkaXJlY3Rvcnkgb2YgdGhlIGVudHJ5IHN0eWxlc2hlZXQgdGhhdCB3YXMgcGFzc2VkIHRvIHRoZSBTYXNzIGNvbXBpbGVyLlxuICAgKiBAcGFyYW0gcmViYXNlU291cmNlTWFwcyBXaGVuIHByb3ZpZGVkLCByZWJhc2VkIGZpbGVzIHdpbGwgaGF2ZSBhbiBpbnRlcm1lZGlhdGUgc291cmNlbWFwIGFkZGVkIHRvIHRoZSBNYXBcbiAgICogd2hpY2ggY2FuIGJlIHVzZWQgdG8gZ2VuZXJhdGUgYSBmaW5hbCBzb3VyY2VtYXAgdGhhdCBjb250YWlucyBvcmlnaW5hbCBzb3VyY2VzLlxuICAgKi9cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBlbnRyeURpcmVjdG9yeTogc3RyaW5nLFxuICAgIHByaXZhdGUgcmViYXNlU291cmNlTWFwcz86IE1hcDxzdHJpbmcsIFJhd1NvdXJjZU1hcD4sXG4gICkge31cblxuICBhYnN0cmFjdCBjYW5vbmljYWxpemUodXJsOiBzdHJpbmcsIG9wdGlvbnM6IHsgZnJvbUltcG9ydDogYm9vbGVhbiB9KTogVVJMIHwgbnVsbDtcblxuICBsb2FkKGNhbm9uaWNhbFVybDogVVJMKTogSW1wb3J0ZXJSZXN1bHQgfCBudWxsIHtcbiAgICBjb25zdCBzdHlsZXNoZWV0UGF0aCA9IGZpbGVVUkxUb1BhdGgoY2Fub25pY2FsVXJsKTtcbiAgICBjb25zdCBzdHlsZXNoZWV0RGlyZWN0b3J5ID0gZGlybmFtZShzdHlsZXNoZWV0UGF0aCk7XG4gICAgbGV0IGNvbnRlbnRzID0gcmVhZEZpbGVTeW5jKHN0eWxlc2hlZXRQYXRoLCAndXRmLTgnKTtcblxuICAgIC8vIFJlYmFzZSBhbnkgVVJMcyB0aGF0IGFyZSBmb3VuZFxuICAgIGxldCB1cGRhdGVkQ29udGVudHM7XG4gICAgZm9yIChjb25zdCB7IHN0YXJ0LCBlbmQsIHZhbHVlIH0gb2YgZmluZFVybHMoY29udGVudHMpKSB7XG4gICAgICAvLyBTa2lwIGlmIHZhbHVlIGlzIGVtcHR5IG9yIGEgU2FzcyB2YXJpYWJsZVxuICAgICAgaWYgKHZhbHVlLmxlbmd0aCA9PT0gMCB8fCB2YWx1ZS5zdGFydHNXaXRoKCckJykpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIC8vIFNraXAgaWYgcm9vdC1yZWxhdGl2ZSwgYWJzb2x1dGUgb3IgcHJvdG9jb2wgcmVsYXRpdmUgdXJsXG4gICAgICBpZiAoL14oKD86XFx3KzopP1xcL1xcL3xkYXRhOnxjaHJvbWU6fCN8XFwvKS8udGVzdCh2YWx1ZSkpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHJlYmFzZWRQYXRoID0gcmVsYXRpdmUodGhpcy5lbnRyeURpcmVjdG9yeSwgam9pbihzdHlsZXNoZWV0RGlyZWN0b3J5LCB2YWx1ZSkpO1xuXG4gICAgICAvLyBOb3JtYWxpemUgcGF0aCBzZXBhcmF0b3JzIGFuZCBlc2NhcGUgY2hhcmFjdGVyc1xuICAgICAgLy8gaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQ1NTL3VybCNzeW50YXhcbiAgICAgIGNvbnN0IHJlYmFzZWRVcmwgPSAnLi8nICsgcmViYXNlZFBhdGgucmVwbGFjZSgvXFxcXC9nLCAnLycpLnJlcGxhY2UoL1soKVxccydcIl0vZywgJ1xcXFwkJicpO1xuXG4gICAgICB1cGRhdGVkQ29udGVudHMgPz89IG5ldyBNYWdpY1N0cmluZyhjb250ZW50cyk7XG4gICAgICB1cGRhdGVkQ29udGVudHMudXBkYXRlKHN0YXJ0LCBlbmQsIHJlYmFzZWRVcmwpO1xuICAgIH1cblxuICAgIGlmICh1cGRhdGVkQ29udGVudHMpIHtcbiAgICAgIGNvbnRlbnRzID0gdXBkYXRlZENvbnRlbnRzLnRvU3RyaW5nKCk7XG4gICAgICBpZiAodGhpcy5yZWJhc2VTb3VyY2VNYXBzKSB7XG4gICAgICAgIC8vIEdlbmVyYXRlIGFuIGludGVybWVkaWF0ZSBzb3VyY2UgbWFwIGZvciB0aGUgcmViYXNpbmcgY2hhbmdlc1xuICAgICAgICBjb25zdCBtYXAgPSB1cGRhdGVkQ29udGVudHMuZ2VuZXJhdGVNYXAoe1xuICAgICAgICAgIGhpcmVzOiB0cnVlLFxuICAgICAgICAgIGluY2x1ZGVDb250ZW50OiB0cnVlLFxuICAgICAgICAgIHNvdXJjZTogY2Fub25pY2FsVXJsLmhyZWYsXG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLnJlYmFzZVNvdXJjZU1hcHMuc2V0KGNhbm9uaWNhbFVybC5ocmVmLCBtYXAgYXMgUmF3U291cmNlTWFwKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBsZXQgc3ludGF4OiBTeW50YXggfCB1bmRlZmluZWQ7XG4gICAgc3dpdGNoIChleHRuYW1lKHN0eWxlc2hlZXRQYXRoKS50b0xvd2VyQ2FzZSgpKSB7XG4gICAgICBjYXNlICcuY3NzJzpcbiAgICAgICAgc3ludGF4ID0gJ2Nzcyc7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnLnNhc3MnOlxuICAgICAgICBzeW50YXggPSAnaW5kZW50ZWQnO1xuICAgICAgICBicmVhaztcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHN5bnRheCA9ICdzY3NzJztcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIGNvbnRlbnRzLFxuICAgICAgc3ludGF4LFxuICAgICAgc291cmNlTWFwVXJsOiBjYW5vbmljYWxVcmwsXG4gICAgfTtcbiAgfVxufVxuXG4vKipcbiAqIERldGVybWluZXMgaWYgYSB1bmljb2RlIGNvZGUgcG9pbnQgaXMgYSBDU1Mgd2hpdGVzcGFjZSBjaGFyYWN0ZXIuXG4gKiBAcGFyYW0gY29kZSBUaGUgdW5pY29kZSBjb2RlIHBvaW50IHRvIHRlc3QuXG4gKiBAcmV0dXJucyB0cnVlLCBpZiB0aGUgY29kZSBwb2ludCBpcyBDU1Mgd2hpdGVzcGFjZTsgZmFsc2UsIG90aGVyd2lzZS5cbiAqL1xuZnVuY3Rpb24gaXNXaGl0ZXNwYWNlKGNvZGU6IG51bWJlcik6IGJvb2xlYW4ge1xuICAvLyBCYXNlZCBvbiBodHRwczovL3d3dy53My5vcmcvVFIvY3NzLXN5bnRheC0zLyN3aGl0ZXNwYWNlXG4gIHN3aXRjaCAoY29kZSkge1xuICAgIGNhc2UgMHgwMDA5OiAvLyB0YWJcbiAgICBjYXNlIDB4MDAyMDogLy8gc3BhY2VcbiAgICBjYXNlIDB4MDAwYTogLy8gbGluZSBmZWVkXG4gICAgY2FzZSAweDAwMGM6IC8vIGZvcm0gZmVlZFxuICAgIGNhc2UgMHgwMDBkOiAvLyBjYXJyaWFnZSByZXR1cm5cbiAgICAgIHJldHVybiB0cnVlO1xuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn1cblxuLyoqXG4gKiBTY2FucyBhIENTUyBvciBTYXNzIGZpbGUgYW5kIGxvY2F0ZXMgYWxsIHZhbGlkIHVybCBmdW5jdGlvbiB2YWx1ZXMgYXMgZGVmaW5lZCBieSB0aGUgQ1NTXG4gKiBzeW50YXggc3BlY2lmaWNhdGlvbi5cbiAqIEBwYXJhbSBjb250ZW50cyBBIHN0cmluZyBjb250YWluaW5nIGEgQ1NTIG9yIFNhc3MgZmlsZSB0byBzY2FuLlxuICogQHJldHVybnMgQW4gaXRlcmFibGUgdGhhdCB5aWVsZHMgZWFjaCBDU1MgdXJsIGZ1bmN0aW9uIHZhbHVlIGZvdW5kLlxuICovXG5mdW5jdGlvbiogZmluZFVybHMoY29udGVudHM6IHN0cmluZyk6IEl0ZXJhYmxlPHsgc3RhcnQ6IG51bWJlcjsgZW5kOiBudW1iZXI7IHZhbHVlOiBzdHJpbmcgfT4ge1xuICBsZXQgcG9zID0gMDtcbiAgbGV0IHdpZHRoID0gMTtcbiAgbGV0IGN1cnJlbnQgPSAtMTtcbiAgY29uc3QgbmV4dCA9ICgpID0+IHtcbiAgICBwb3MgKz0gd2lkdGg7XG4gICAgY3VycmVudCA9IGNvbnRlbnRzLmNvZGVQb2ludEF0KHBvcykgPz8gLTE7XG4gICAgd2lkdGggPSBjdXJyZW50ID4gMHhmZmZmID8gMiA6IDE7XG5cbiAgICByZXR1cm4gY3VycmVudDtcbiAgfTtcblxuICAvLyBCYXNlZCBvbiBodHRwczovL3d3dy53My5vcmcvVFIvY3NzLXN5bnRheC0zLyNjb25zdW1lLWlkZW50LWxpa2UtdG9rZW5cbiAgd2hpbGUgKChwb3MgPSBjb250ZW50cy5pbmRleE9mKCd1cmwoJywgcG9zKSkgIT09IC0xKSB7XG4gICAgLy8gU2V0IHRvIHBvc2l0aW9uIG9mIHRoZSAoXG4gICAgcG9zICs9IDM7XG4gICAgd2lkdGggPSAxO1xuXG4gICAgLy8gQ29uc3VtZSBhbGwgbGVhZGluZyB3aGl0ZXNwYWNlXG4gICAgd2hpbGUgKGlzV2hpdGVzcGFjZShuZXh0KCkpKSB7XG4gICAgICAvKiBlbXB0eSAqL1xuICAgIH1cblxuICAgIC8vIEluaXRpYWxpemUgVVJMIHN0YXRlXG4gICAgY29uc3QgdXJsID0geyBzdGFydDogcG9zLCBlbmQ6IC0xLCB2YWx1ZTogJycgfTtcbiAgICBsZXQgY29tcGxldGUgPSBmYWxzZTtcblxuICAgIC8vIElmIFwiIG9yICcsIHRoZW4gY29uc3VtZSB0aGUgdmFsdWUgYXMgYSBzdHJpbmdcbiAgICBpZiAoY3VycmVudCA9PT0gMHgwMDIyIHx8IGN1cnJlbnQgPT09IDB4MDAyNykge1xuICAgICAgY29uc3QgZW5kaW5nID0gY3VycmVudDtcbiAgICAgIC8vIEJhc2VkIG9uIGh0dHBzOi8vd3d3LnczLm9yZy9UUi9jc3Mtc3ludGF4LTMvI2NvbnN1bWUtc3RyaW5nLXRva2VuXG4gICAgICB3aGlsZSAoIWNvbXBsZXRlKSB7XG4gICAgICAgIHN3aXRjaCAobmV4dCgpKSB7XG4gICAgICAgICAgY2FzZSAtMTogLy8gRU9GXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgY2FzZSAweDAwMGE6IC8vIGxpbmUgZmVlZFxuICAgICAgICAgIGNhc2UgMHgwMDBjOiAvLyBmb3JtIGZlZWRcbiAgICAgICAgICBjYXNlIDB4MDAwZDogLy8gY2FycmlhZ2UgcmV0dXJuXG4gICAgICAgICAgICAvLyBJbnZhbGlkXG4gICAgICAgICAgICBjb21wbGV0ZSA9IHRydWU7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlIDB4MDA1YzogLy8gXFwgLS0gY2hhcmFjdGVyIGVzY2FwZVxuICAgICAgICAgICAgLy8gSWYgbm90IEVPRiBvciBuZXdsaW5lLCBhZGQgdGhlIGNoYXJhY3RlciBhZnRlciB0aGUgZXNjYXBlXG4gICAgICAgICAgICBzd2l0Y2ggKG5leHQoKSkge1xuICAgICAgICAgICAgICBjYXNlIC0xOlxuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgY2FzZSAweDAwMGE6IC8vIGxpbmUgZmVlZFxuICAgICAgICAgICAgICBjYXNlIDB4MDAwYzogLy8gZm9ybSBmZWVkXG4gICAgICAgICAgICAgIGNhc2UgMHgwMDBkOiAvLyBjYXJyaWFnZSByZXR1cm5cbiAgICAgICAgICAgICAgICAvLyBTa2lwIHdoZW4gaW5zaWRlIGEgc3RyaW5nXG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgLy8gVE9ETzogSGFuZGxlIGhleCBlc2NhcGUgY29kZXNcbiAgICAgICAgICAgICAgICB1cmwudmFsdWUgKz0gU3RyaW5nLmZyb21Db2RlUG9pbnQoY3VycmVudCk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlIGVuZGluZzpcbiAgICAgICAgICAgIC8vIEZ1bGwgc3RyaW5nIHBvc2l0aW9uIHNob3VsZCBpbmNsdWRlIHRoZSBxdW90ZXMgZm9yIHJlcGxhY2VtZW50XG4gICAgICAgICAgICB1cmwuZW5kID0gcG9zICsgMTtcbiAgICAgICAgICAgIGNvbXBsZXRlID0gdHJ1ZTtcbiAgICAgICAgICAgIHlpZWxkIHVybDtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICB1cmwudmFsdWUgKz0gU3RyaW5nLmZyb21Db2RlUG9pbnQoY3VycmVudCk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBuZXh0KCk7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICAvLyBCYXNlZCBvbiBodHRwczovL3d3dy53My5vcmcvVFIvY3NzLXN5bnRheC0zLyNjb25zdW1lLXVybC10b2tlblxuICAgIHdoaWxlICghY29tcGxldGUpIHtcbiAgICAgIHN3aXRjaCAoY3VycmVudCkge1xuICAgICAgICBjYXNlIC0xOiAvLyBFT0ZcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIGNhc2UgMHgwMDIyOiAvLyBcIlxuICAgICAgICBjYXNlIDB4MDAyNzogLy8gJ1xuICAgICAgICBjYXNlIDB4MDAyODogLy8gKFxuICAgICAgICAgIC8vIEludmFsaWRcbiAgICAgICAgICBjb21wbGV0ZSA9IHRydWU7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgMHgwMDI5OiAvLyApXG4gICAgICAgICAgLy8gVVJMIGlzIHZhbGlkIGFuZCBjb21wbGV0ZVxuICAgICAgICAgIHVybC5lbmQgPSBwb3M7XG4gICAgICAgICAgY29tcGxldGUgPSB0cnVlO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIDB4MDA1YzogLy8gXFwgLS0gY2hhcmFjdGVyIGVzY2FwZVxuICAgICAgICAgIC8vIElmIG5vdCBFT0Ygb3IgbmV3bGluZSwgYWRkIHRoZSBjaGFyYWN0ZXIgYWZ0ZXIgdGhlIGVzY2FwZVxuICAgICAgICAgIHN3aXRjaCAobmV4dCgpKSB7XG4gICAgICAgICAgICBjYXNlIC0xOiAvLyBFT0ZcbiAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgY2FzZSAweDAwMGE6IC8vIGxpbmUgZmVlZFxuICAgICAgICAgICAgY2FzZSAweDAwMGM6IC8vIGZvcm0gZmVlZFxuICAgICAgICAgICAgY2FzZSAweDAwMGQ6IC8vIGNhcnJpYWdlIHJldHVyblxuICAgICAgICAgICAgICAvLyBJbnZhbGlkXG4gICAgICAgICAgICAgIGNvbXBsZXRlID0gdHJ1ZTtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAvLyBUT0RPOiBIYW5kbGUgaGV4IGVzY2FwZSBjb2Rlc1xuICAgICAgICAgICAgICB1cmwudmFsdWUgKz0gU3RyaW5nLmZyb21Db2RlUG9pbnQoY3VycmVudCk7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgICBicmVhaztcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICBpZiAoaXNXaGl0ZXNwYWNlKGN1cnJlbnQpKSB7XG4gICAgICAgICAgICB3aGlsZSAoaXNXaGl0ZXNwYWNlKG5leHQoKSkpIHtcbiAgICAgICAgICAgICAgLyogZW1wdHkgKi9cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIFVuZXNjYXBlZCB3aGl0ZXNwYWNlIGlzIG9ubHkgdmFsaWQgYmVmb3JlIHRoZSBjbG9zaW5nIClcbiAgICAgICAgICAgIGlmIChjdXJyZW50ID09PSAweDAwMjkpIHtcbiAgICAgICAgICAgICAgLy8gVVJMIGlzIHZhbGlkXG4gICAgICAgICAgICAgIHVybC5lbmQgPSBwb3M7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb21wbGV0ZSA9IHRydWU7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIEFkZCB0aGUgY2hhcmFjdGVyIHRvIHRoZSB1cmwgdmFsdWVcbiAgICAgICAgICAgIHVybC52YWx1ZSArPSBTdHJpbmcuZnJvbUNvZGVQb2ludChjdXJyZW50KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBuZXh0KCk7XG4gICAgfVxuXG4gICAgLy8gQW4gZW5kIHBvc2l0aW9uIGluZGljYXRlcyBhIFVSTCB3YXMgZm91bmRcbiAgICBpZiAodXJsLmVuZCAhPT0gLTEpIHtcbiAgICAgIHlpZWxkIHVybDtcbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBQcm92aWRlcyB0aGUgU2FzcyBpbXBvcnRlciBsb2dpYyB0byByZXNvbHZlIHJlbGF0aXZlIHN0eWxlc2hlZXQgaW1wb3J0cyB2aWEgYm90aCBpbXBvcnQgYW5kIHVzZSBydWxlc1xuICogYW5kIGFsc28gcmViYXNlIGFueSBgdXJsKClgIGZ1bmN0aW9uIHVzYWdlIHdpdGhpbiB0aG9zZSBzdHlsZXNoZWV0cy4gVGhlIHJlYmFzaW5nIHdpbGwgZW5zdXJlIHRoYXRcbiAqIHRoZSBVUkxzIGluIHRoZSBvdXRwdXQgb2YgdGhlIFNhc3MgY29tcGlsZXIgcmVmbGVjdCB0aGUgZmluYWwgZmlsZXN5c3RlbSBsb2NhdGlvbiBvZiB0aGUgb3V0cHV0IENTUyBmaWxlLlxuICovXG5leHBvcnQgY2xhc3MgUmVsYXRpdmVVcmxSZWJhc2luZ0ltcG9ydGVyIGV4dGVuZHMgVXJsUmViYXNpbmdJbXBvcnRlciB7XG4gIGNvbnN0cnVjdG9yKFxuICAgIGVudHJ5RGlyZWN0b3J5OiBzdHJpbmcsXG4gICAgcHJpdmF0ZSBkaXJlY3RvcnlDYWNoZSA9IG5ldyBNYXA8c3RyaW5nLCBEaXJlY3RvcnlFbnRyeT4oKSxcbiAgICByZWJhc2VTb3VyY2VNYXBzPzogTWFwPHN0cmluZywgUmF3U291cmNlTWFwPixcbiAgKSB7XG4gICAgc3VwZXIoZW50cnlEaXJlY3RvcnksIHJlYmFzZVNvdXJjZU1hcHMpO1xuICB9XG5cbiAgY2Fub25pY2FsaXplKHVybDogc3RyaW5nLCBvcHRpb25zOiB7IGZyb21JbXBvcnQ6IGJvb2xlYW4gfSk6IFVSTCB8IG51bGwge1xuICAgIHJldHVybiB0aGlzLnJlc29sdmVJbXBvcnQodXJsLCBvcHRpb25zLmZyb21JbXBvcnQsIHRydWUpO1xuICB9XG5cbiAgLyoqXG4gICAqIEF0dGVtcHRzIHRvIHJlc29sdmUgYSBwcm92aWRlZCBVUkwgdG8gYSBzdHlsZXNoZWV0IGZpbGUgdXNpbmcgdGhlIFNhc3MgY29tcGlsZXIncyByZXNvbHV0aW9uIGFsZ29yaXRobS5cbiAgICogQmFzZWQgb24gaHR0cHM6Ly9naXRodWIuY29tL3Nhc3MvZGFydC1zYXNzL2Jsb2IvNDRkNmJiNmFjNzJmZTZiOTNmNWJmZWMzNzFhMWZmZmIxOGU2Yjc2ZC9saWIvc3JjL2ltcG9ydGVyL3V0aWxzLmRhcnRcbiAgICogQHBhcmFtIHVybCBUaGUgZmlsZSBwcm90b2NvbCBVUkwgdG8gcmVzb2x2ZS5cbiAgICogQHBhcmFtIGZyb21JbXBvcnQgSWYgdHJ1ZSwgVVJMIHdhcyBmcm9tIGFuIGltcG9ydCBydWxlOyBvdGhlcndpc2UgZnJvbSBhIHVzZSBydWxlLlxuICAgKiBAcGFyYW0gY2hlY2tEaXJlY3RvcnkgSWYgdHJ1ZSwgdHJ5IGNoZWNraW5nIGZvciBhIGRpcmVjdG9yeSB3aXRoIHRoZSBiYXNlIG5hbWUgY29udGFpbmluZyBhbiBpbmRleCBmaWxlLlxuICAgKiBAcmV0dXJucyBBIGZ1bGwgcmVzb2x2ZWQgVVJMIG9mIHRoZSBzdHlsZXNoZWV0IGZpbGUgb3IgYG51bGxgIGlmIG5vdCBmb3VuZC5cbiAgICovXG4gIHByaXZhdGUgcmVzb2x2ZUltcG9ydCh1cmw6IHN0cmluZywgZnJvbUltcG9ydDogYm9vbGVhbiwgY2hlY2tEaXJlY3Rvcnk6IGJvb2xlYW4pOiBVUkwgfCBudWxsIHtcbiAgICBsZXQgc3R5bGVzaGVldFBhdGg7XG4gICAgdHJ5IHtcbiAgICAgIHN0eWxlc2hlZXRQYXRoID0gZmlsZVVSTFRvUGF0aCh1cmwpO1xuICAgIH0gY2F0Y2gge1xuICAgICAgLy8gT25seSBmaWxlIHByb3RvY29sIFVSTHMgYXJlIHN1cHBvcnRlZCBieSB0aGlzIGltcG9ydGVyXG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBjb25zdCBkaXJlY3RvcnkgPSBkaXJuYW1lKHN0eWxlc2hlZXRQYXRoKTtcbiAgICBjb25zdCBleHRlbnNpb24gPSBleHRuYW1lKHN0eWxlc2hlZXRQYXRoKTtcbiAgICBjb25zdCBoYXNTdHlsZUV4dGVuc2lvbiA9XG4gICAgICBleHRlbnNpb24gPT09ICcuc2NzcycgfHwgZXh0ZW5zaW9uID09PSAnLnNhc3MnIHx8IGV4dGVuc2lvbiA9PT0gJy5jc3MnO1xuICAgIC8vIFJlbW92ZSB0aGUgc3R5bGUgZXh0ZW5zaW9uIGlmIHByZXNlbnQgdG8gYWxsb3cgYWRkaW5nIHRoZSBgLmltcG9ydGAgc3VmZml4XG4gICAgY29uc3QgZmlsZW5hbWUgPSBiYXNlbmFtZShzdHlsZXNoZWV0UGF0aCwgaGFzU3R5bGVFeHRlbnNpb24gPyBleHRlbnNpb24gOiB1bmRlZmluZWQpO1xuXG4gICAgY29uc3QgaW1wb3J0UG90ZW50aWFscyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICAgIGNvbnN0IGRlZmF1bHRQb3RlbnRpYWxzID0gbmV3IFNldDxzdHJpbmc+KCk7XG5cbiAgICBpZiAoaGFzU3R5bGVFeHRlbnNpb24pIHtcbiAgICAgIGlmIChmcm9tSW1wb3J0KSB7XG4gICAgICAgIGltcG9ydFBvdGVudGlhbHMuYWRkKGZpbGVuYW1lICsgJy5pbXBvcnQnICsgZXh0ZW5zaW9uKTtcbiAgICAgICAgaW1wb3J0UG90ZW50aWFscy5hZGQoJ18nICsgZmlsZW5hbWUgKyAnLmltcG9ydCcgKyBleHRlbnNpb24pO1xuICAgICAgfVxuICAgICAgZGVmYXVsdFBvdGVudGlhbHMuYWRkKGZpbGVuYW1lICsgZXh0ZW5zaW9uKTtcbiAgICAgIGRlZmF1bHRQb3RlbnRpYWxzLmFkZCgnXycgKyBmaWxlbmFtZSArIGV4dGVuc2lvbik7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmIChmcm9tSW1wb3J0KSB7XG4gICAgICAgIGltcG9ydFBvdGVudGlhbHMuYWRkKGZpbGVuYW1lICsgJy5pbXBvcnQuc2NzcycpO1xuICAgICAgICBpbXBvcnRQb3RlbnRpYWxzLmFkZChmaWxlbmFtZSArICcuaW1wb3J0LnNhc3MnKTtcbiAgICAgICAgaW1wb3J0UG90ZW50aWFscy5hZGQoZmlsZW5hbWUgKyAnLmltcG9ydC5jc3MnKTtcbiAgICAgICAgaW1wb3J0UG90ZW50aWFscy5hZGQoJ18nICsgZmlsZW5hbWUgKyAnLmltcG9ydC5zY3NzJyk7XG4gICAgICAgIGltcG9ydFBvdGVudGlhbHMuYWRkKCdfJyArIGZpbGVuYW1lICsgJy5pbXBvcnQuc2FzcycpO1xuICAgICAgICBpbXBvcnRQb3RlbnRpYWxzLmFkZCgnXycgKyBmaWxlbmFtZSArICcuaW1wb3J0LmNzcycpO1xuICAgICAgfVxuICAgICAgZGVmYXVsdFBvdGVudGlhbHMuYWRkKGZpbGVuYW1lICsgJy5zY3NzJyk7XG4gICAgICBkZWZhdWx0UG90ZW50aWFscy5hZGQoZmlsZW5hbWUgKyAnLnNhc3MnKTtcbiAgICAgIGRlZmF1bHRQb3RlbnRpYWxzLmFkZChmaWxlbmFtZSArICcuY3NzJyk7XG4gICAgICBkZWZhdWx0UG90ZW50aWFscy5hZGQoJ18nICsgZmlsZW5hbWUgKyAnLnNjc3MnKTtcbiAgICAgIGRlZmF1bHRQb3RlbnRpYWxzLmFkZCgnXycgKyBmaWxlbmFtZSArICcuc2FzcycpO1xuICAgICAgZGVmYXVsdFBvdGVudGlhbHMuYWRkKCdfJyArIGZpbGVuYW1lICsgJy5jc3MnKTtcbiAgICB9XG5cbiAgICBsZXQgZm91bmREZWZhdWx0cztcbiAgICBsZXQgZm91bmRJbXBvcnRzO1xuICAgIGxldCBoYXNQb3RlbnRpYWxJbmRleCA9IGZhbHNlO1xuXG4gICAgbGV0IGNhY2hlZEVudHJpZXMgPSB0aGlzLmRpcmVjdG9yeUNhY2hlLmdldChkaXJlY3RvcnkpO1xuICAgIGlmIChjYWNoZWRFbnRyaWVzKSB7XG4gICAgICAvLyBJZiB0aGVyZSBpcyBhIHByZXByb2Nlc3NlZCBjYWNoZSBvZiB0aGUgZGlyZWN0b3J5LCBwZXJmb3JtIGFuIGludGVyc2VjdGlvbiBvZiB0aGUgcG90ZW50aWFsc1xuICAgICAgLy8gYW5kIHRoZSBkaXJlY3RvcnkgZmlsZXMuXG4gICAgICBjb25zdCB7IGZpbGVzLCBkaXJlY3RvcmllcyB9ID0gY2FjaGVkRW50cmllcztcbiAgICAgIGZvdW5kRGVmYXVsdHMgPSBbLi4uZGVmYXVsdFBvdGVudGlhbHNdLmZpbHRlcigocG90ZW50aWFsKSA9PiBmaWxlcy5oYXMocG90ZW50aWFsKSk7XG4gICAgICBmb3VuZEltcG9ydHMgPSBbLi4uaW1wb3J0UG90ZW50aWFsc10uZmlsdGVyKChwb3RlbnRpYWwpID0+IGZpbGVzLmhhcyhwb3RlbnRpYWwpKTtcbiAgICAgIGhhc1BvdGVudGlhbEluZGV4ID0gY2hlY2tEaXJlY3RvcnkgJiYgIWhhc1N0eWxlRXh0ZW5zaW9uICYmIGRpcmVjdG9yaWVzLmhhcyhmaWxlbmFtZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIElmIG5vIHByZXByb2Nlc3NlZCBjYWNoZSBleGlzdHMsIGdldCB0aGUgZW50cmllcyBmcm9tIHRoZSBmaWxlIHN5c3RlbSBhbmQsIHdoaWxlIHNlYXJjaGluZyxcbiAgICAgIC8vIGdlbmVyYXRlIHRoZSBjYWNoZSBmb3IgbGF0ZXIgcmVxdWVzdHMuXG4gICAgICBsZXQgZW50cmllcztcbiAgICAgIHRyeSB7XG4gICAgICAgIGVudHJpZXMgPSByZWFkZGlyU3luYyhkaXJlY3RvcnksIHsgd2l0aEZpbGVUeXBlczogdHJ1ZSB9KTtcbiAgICAgIH0gY2F0Y2gge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cblxuICAgICAgZm91bmREZWZhdWx0cyA9IFtdO1xuICAgICAgZm91bmRJbXBvcnRzID0gW107XG4gICAgICBjYWNoZWRFbnRyaWVzID0geyBmaWxlczogbmV3IFNldDxzdHJpbmc+KCksIGRpcmVjdG9yaWVzOiBuZXcgU2V0PHN0cmluZz4oKSB9O1xuICAgICAgZm9yIChjb25zdCBlbnRyeSBvZiBlbnRyaWVzKSB7XG4gICAgICAgIGNvbnN0IGlzRGlyZWN0b3J5ID0gZW50cnkuaXNEaXJlY3RvcnkoKTtcbiAgICAgICAgaWYgKGlzRGlyZWN0b3J5KSB7XG4gICAgICAgICAgY2FjaGVkRW50cmllcy5kaXJlY3Rvcmllcy5hZGQoZW50cnkubmFtZSk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBSZWNvcmQgaWYgdGhlIG5hbWUgc2hvdWxkIGJlIGNoZWNrZWQgYXMgYSBkaXJlY3Rvcnkgd2l0aCBhbiBpbmRleCBmaWxlXG4gICAgICAgIGlmIChjaGVja0RpcmVjdG9yeSAmJiAhaGFzU3R5bGVFeHRlbnNpb24gJiYgZW50cnkubmFtZSA9PT0gZmlsZW5hbWUgJiYgaXNEaXJlY3RvcnkpIHtcbiAgICAgICAgICBoYXNQb3RlbnRpYWxJbmRleCA9IHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIWVudHJ5LmlzRmlsZSgpKSB7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICBjYWNoZWRFbnRyaWVzLmZpbGVzLmFkZChlbnRyeS5uYW1lKTtcblxuICAgICAgICBpZiAoaW1wb3J0UG90ZW50aWFscy5oYXMoZW50cnkubmFtZSkpIHtcbiAgICAgICAgICBmb3VuZEltcG9ydHMucHVzaChlbnRyeS5uYW1lKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChkZWZhdWx0UG90ZW50aWFscy5oYXMoZW50cnkubmFtZSkpIHtcbiAgICAgICAgICBmb3VuZERlZmF1bHRzLnB1c2goZW50cnkubmFtZSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgdGhpcy5kaXJlY3RvcnlDYWNoZS5zZXQoZGlyZWN0b3J5LCBjYWNoZWRFbnRyaWVzKTtcbiAgICB9XG5cbiAgICAvLyBgZm91bmRJbXBvcnRzYCB3aWxsIG9ubHkgY29udGFpbiBlbGVtZW50cyBpZiBgb3B0aW9ucy5mcm9tSW1wb3J0YCBpcyB0cnVlXG4gICAgY29uc3QgcmVzdWx0ID0gdGhpcy5jaGVja0ZvdW5kKGZvdW5kSW1wb3J0cykgPz8gdGhpcy5jaGVja0ZvdW5kKGZvdW5kRGVmYXVsdHMpO1xuICAgIGlmIChyZXN1bHQgIT09IG51bGwpIHtcbiAgICAgIHJldHVybiBwYXRoVG9GaWxlVVJMKGpvaW4oZGlyZWN0b3J5LCByZXN1bHQpKTtcbiAgICB9XG5cbiAgICBpZiAoaGFzUG90ZW50aWFsSW5kZXgpIHtcbiAgICAgIC8vIENoZWNrIGZvciBpbmRleCBmaWxlcyB1c2luZyBmaWxlbmFtZSBhcyBhIGRpcmVjdG9yeVxuICAgICAgcmV0dXJuIHRoaXMucmVzb2x2ZUltcG9ydCh1cmwgKyAnL2luZGV4JywgZnJvbUltcG9ydCwgZmFsc2UpO1xuICAgIH1cblxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrcyBhbiBhcnJheSBvZiBwb3RlbnRpYWwgc3R5bGVzaGVldCBmaWxlcyB0byBkZXRlcm1pbmUgaWYgdGhlcmUgaXMgYSB2YWxpZFxuICAgKiBzdHlsZXNoZWV0IGZpbGUuIE1vcmUgdGhhbiBvbmUgZGlzY292ZXJlZCBmaWxlIG1heSBpbmRpY2F0ZSBhbiBlcnJvci5cbiAgICogQHBhcmFtIGZvdW5kIEFuIGFycmF5IG9mIGRpc2NvdmVyZWQgc3R5bGVzaGVldCBmaWxlcy5cbiAgICogQHJldHVybnMgQSBmdWxseSByZXNvbHZlZCBwYXRoIGZvciBhIHN0eWxlc2hlZXQgZmlsZSBvciBgbnVsbGAgaWYgbm90IGZvdW5kLlxuICAgKiBAdGhyb3dzIElmIHRoZXJlIGFyZSBhbWJpZ3VvdXMgZmlsZXMgZGlzY292ZXJlZC5cbiAgICovXG4gIHByaXZhdGUgY2hlY2tGb3VuZChmb3VuZDogc3RyaW5nW10pOiBzdHJpbmcgfCBudWxsIHtcbiAgICBpZiAoZm91bmQubGVuZ3RoID09PSAwKSB7XG4gICAgICAvLyBOb3QgZm91bmRcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIC8vIE1vcmUgdGhhbiBvbmUgZm91bmQgZmlsZSBtYXkgYmUgYW4gZXJyb3JcbiAgICBpZiAoZm91bmQubGVuZ3RoID4gMSkge1xuICAgICAgLy8gUHJlc2VuY2Ugb2YgQ1NTIGZpbGVzIGFsb25nc2lkZSBhIFNhc3MgZmlsZSBkb2VzIG5vdCBjYXVzZSBhbiBlcnJvclxuICAgICAgY29uc3QgZm91bmRXaXRob3V0Q3NzID0gZm91bmQuZmlsdGVyKChlbGVtZW50KSA9PiBleHRuYW1lKGVsZW1lbnQpICE9PSAnLmNzcycpO1xuICAgICAgLy8gSWYgdGhlIGxlbmd0aCBpcyB6ZXJvIHRoZW4gdGhlcmUgYXJlIHR3byBvciBtb3JlIGNzcyBmaWxlc1xuICAgICAgLy8gSWYgdGhlIGxlbmd0aCBpcyBtb3JlIHRoYW4gb25lIHRoYW4gdGhlcmUgYXJlIHR3byBvciBtb3JlIHNhc3Mvc2NzcyBmaWxlc1xuICAgICAgaWYgKGZvdW5kV2l0aG91dENzcy5sZW5ndGggIT09IDEpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdBbWJpZ3VvdXMgaW1wb3J0IGRldGVjdGVkLicpO1xuICAgICAgfVxuXG4gICAgICAvLyBSZXR1cm4gdGhlIG5vbi1DU1MgZmlsZSAoc2Fzcy9zY3NzIGZpbGVzIGhhdmUgcHJpb3JpdHkpXG4gICAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vc2Fzcy9kYXJ0LXNhc3MvYmxvYi80NGQ2YmI2YWM3MmZlNmI5M2Y1YmZlYzM3MWExZmZmYjE4ZTZiNzZkL2xpYi9zcmMvaW1wb3J0ZXIvdXRpbHMuZGFydCNMNDQtTDQ3XG4gICAgICByZXR1cm4gZm91bmRXaXRob3V0Q3NzWzBdO1xuICAgIH1cblxuICAgIHJldHVybiBmb3VuZFswXTtcbiAgfVxufVxuXG4vKipcbiAqIFByb3ZpZGVzIHRoZSBTYXNzIGltcG9ydGVyIGxvZ2ljIHRvIHJlc29sdmUgbW9kdWxlIChucG0gcGFja2FnZSkgc3R5bGVzaGVldCBpbXBvcnRzIHZpYSBib3RoIGltcG9ydCBhbmRcbiAqIHVzZSBydWxlcyBhbmQgYWxzbyByZWJhc2UgYW55IGB1cmwoKWAgZnVuY3Rpb24gdXNhZ2Ugd2l0aGluIHRob3NlIHN0eWxlc2hlZXRzLiBUaGUgcmViYXNpbmcgd2lsbCBlbnN1cmUgdGhhdFxuICogdGhlIFVSTHMgaW4gdGhlIG91dHB1dCBvZiB0aGUgU2FzcyBjb21waWxlciByZWZsZWN0IHRoZSBmaW5hbCBmaWxlc3lzdGVtIGxvY2F0aW9uIG9mIHRoZSBvdXRwdXQgQ1NTIGZpbGUuXG4gKi9cbmV4cG9ydCBjbGFzcyBNb2R1bGVVcmxSZWJhc2luZ0ltcG9ydGVyIGV4dGVuZHMgUmVsYXRpdmVVcmxSZWJhc2luZ0ltcG9ydGVyIHtcbiAgY29uc3RydWN0b3IoXG4gICAgZW50cnlEaXJlY3Rvcnk6IHN0cmluZyxcbiAgICBkaXJlY3RvcnlDYWNoZTogTWFwPHN0cmluZywgRGlyZWN0b3J5RW50cnk+LFxuICAgIHJlYmFzZVNvdXJjZU1hcHM6IE1hcDxzdHJpbmcsIFJhd1NvdXJjZU1hcD4gfCB1bmRlZmluZWQsXG4gICAgcHJpdmF0ZSBmaW5kZXI6IEZpbGVJbXBvcnRlcjwnc3luYyc+WydmaW5kRmlsZVVybCddLFxuICApIHtcbiAgICBzdXBlcihlbnRyeURpcmVjdG9yeSwgZGlyZWN0b3J5Q2FjaGUsIHJlYmFzZVNvdXJjZU1hcHMpO1xuICB9XG5cbiAgb3ZlcnJpZGUgY2Fub25pY2FsaXplKHVybDogc3RyaW5nLCBvcHRpb25zOiB7IGZyb21JbXBvcnQ6IGJvb2xlYW4gfSk6IFVSTCB8IG51bGwge1xuICAgIGlmICh1cmwuc3RhcnRzV2l0aCgnZmlsZTovLycpKSB7XG4gICAgICByZXR1cm4gc3VwZXIuY2Fub25pY2FsaXplKHVybCwgb3B0aW9ucyk7XG4gICAgfVxuXG4gICAgY29uc3QgcmVzdWx0ID0gdGhpcy5maW5kZXIodXJsLCBvcHRpb25zKTtcblxuICAgIHJldHVybiByZXN1bHQgPyBzdXBlci5jYW5vbmljYWxpemUocmVzdWx0LmhyZWYsIG9wdGlvbnMpIDogbnVsbDtcbiAgfVxufVxuXG4vKipcbiAqIFByb3ZpZGVzIHRoZSBTYXNzIGltcG9ydGVyIGxvZ2ljIHRvIHJlc29sdmUgbG9hZCBwYXRocyBsb2NhdGVkIHN0eWxlc2hlZXQgaW1wb3J0cyB2aWEgYm90aCBpbXBvcnQgYW5kXG4gKiB1c2UgcnVsZXMgYW5kIGFsc28gcmViYXNlIGFueSBgdXJsKClgIGZ1bmN0aW9uIHVzYWdlIHdpdGhpbiB0aG9zZSBzdHlsZXNoZWV0cy4gVGhlIHJlYmFzaW5nIHdpbGwgZW5zdXJlIHRoYXRcbiAqIHRoZSBVUkxzIGluIHRoZSBvdXRwdXQgb2YgdGhlIFNhc3MgY29tcGlsZXIgcmVmbGVjdCB0aGUgZmluYWwgZmlsZXN5c3RlbSBsb2NhdGlvbiBvZiB0aGUgb3V0cHV0IENTUyBmaWxlLlxuICovXG5leHBvcnQgY2xhc3MgTG9hZFBhdGhzVXJsUmViYXNpbmdJbXBvcnRlciBleHRlbmRzIFJlbGF0aXZlVXJsUmViYXNpbmdJbXBvcnRlciB7XG4gIGNvbnN0cnVjdG9yKFxuICAgIGVudHJ5RGlyZWN0b3J5OiBzdHJpbmcsXG4gICAgZGlyZWN0b3J5Q2FjaGU6IE1hcDxzdHJpbmcsIERpcmVjdG9yeUVudHJ5PixcbiAgICByZWJhc2VTb3VyY2VNYXBzOiBNYXA8c3RyaW5nLCBSYXdTb3VyY2VNYXA+IHwgdW5kZWZpbmVkLFxuICAgIHByaXZhdGUgbG9hZFBhdGhzOiBJdGVyYWJsZTxzdHJpbmc+LFxuICApIHtcbiAgICBzdXBlcihlbnRyeURpcmVjdG9yeSwgZGlyZWN0b3J5Q2FjaGUsIHJlYmFzZVNvdXJjZU1hcHMpO1xuICB9XG5cbiAgb3ZlcnJpZGUgY2Fub25pY2FsaXplKHVybDogc3RyaW5nLCBvcHRpb25zOiB7IGZyb21JbXBvcnQ6IGJvb2xlYW4gfSk6IFVSTCB8IG51bGwge1xuICAgIGlmICh1cmwuc3RhcnRzV2l0aCgnZmlsZTovLycpKSB7XG4gICAgICByZXR1cm4gc3VwZXIuY2Fub25pY2FsaXplKHVybCwgb3B0aW9ucyk7XG4gICAgfVxuXG4gICAgbGV0IHJlc3VsdCA9IG51bGw7XG4gICAgZm9yIChjb25zdCBsb2FkUGF0aCBvZiB0aGlzLmxvYWRQYXRocykge1xuICAgICAgcmVzdWx0ID0gc3VwZXIuY2Fub25pY2FsaXplKHBhdGhUb0ZpbGVVUkwoam9pbihsb2FkUGF0aCwgdXJsKSkuaHJlZiwgb3B0aW9ucyk7XG4gICAgICBpZiAocmVzdWx0ICE9PSBudWxsKSB7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cbn1cblxuLyoqXG4gKiBXb3JrYXJvdW5kIGZvciBTYXNzIG5vdCBjYWxsaW5nIGluc3RhbmNlIG1ldGhvZHMgd2l0aCBgdGhpc2AuXG4gKiBUaGUgYGNhbm9uaWNhbGl6ZWAgYW5kIGBsb2FkYCBtZXRob2RzIHdpbGwgYmUgYm91bmQgdG8gdGhlIGNsYXNzIGluc3RhbmNlLlxuICogQHBhcmFtIGltcG9ydGVyIEEgU2FzcyBpbXBvcnRlciB0byBiaW5kLlxuICogQHJldHVybnMgVGhlIGJvdW5kIFNhc3MgaW1wb3J0ZXIuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzYXNzQmluZFdvcmthcm91bmQ8VCBleHRlbmRzIEltcG9ydGVyPihpbXBvcnRlcjogVCk6IFQge1xuICBpbXBvcnRlci5jYW5vbmljYWxpemUgPSBpbXBvcnRlci5jYW5vbmljYWxpemUuYmluZChpbXBvcnRlcik7XG4gIGltcG9ydGVyLmxvYWQgPSBpbXBvcnRlci5sb2FkLmJpbmQoaW1wb3J0ZXIpO1xuXG4gIHJldHVybiBpbXBvcnRlcjtcbn1cbiJdfQ==
|