@angular-devkit/build-angular 16.1.0-next.0 → 16.1.0-next.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (44) hide show
  1. package/package.json +26 -26
  2. package/src/builders/browser-esbuild/angular/angular-compilation.d.ts +1 -0
  3. package/src/builders/browser-esbuild/angular/angular-compilation.js +1 -1
  4. package/src/builders/browser-esbuild/angular/aot-compilation.d.ts +1 -0
  5. package/src/builders/browser-esbuild/angular/aot-compilation.js +10 -6
  6. package/src/builders/browser-esbuild/angular/compiler-plugin.d.ts +1 -0
  7. package/src/builders/browser-esbuild/angular/compiler-plugin.js +6 -2
  8. package/src/builders/browser-esbuild/angular/jit-compilation.d.ts +1 -0
  9. package/src/builders/browser-esbuild/angular/jit-compilation.js +5 -2
  10. package/src/builders/browser-esbuild/global-scripts.d.ts +3 -2
  11. package/src/builders/browser-esbuild/global-scripts.js +9 -4
  12. package/src/builders/browser-esbuild/index.js +52 -4
  13. package/src/builders/browser-esbuild/load-result-cache.d.ts +2 -1
  14. package/src/builders/browser-esbuild/load-result-cache.js +20 -2
  15. package/src/builders/browser-esbuild/options.d.ts +6 -0
  16. package/src/builders/browser-esbuild/options.js +3 -2
  17. package/src/builders/browser-esbuild/stylesheets/bundle-options.js +22 -22
  18. package/src/builders/browser-esbuild/stylesheets/css-language.d.ts +9 -0
  19. package/src/builders/browser-esbuild/stylesheets/css-language.js +16 -0
  20. package/src/builders/browser-esbuild/stylesheets/css-resource-plugin.d.ts +2 -1
  21. package/src/builders/browser-esbuild/stylesheets/css-resource-plugin.js +8 -5
  22. package/src/builders/browser-esbuild/stylesheets/less-language.d.ts +9 -0
  23. package/src/builders/browser-esbuild/stylesheets/less-language.js +127 -0
  24. package/src/builders/browser-esbuild/stylesheets/sass-language.d.ts +10 -0
  25. package/src/builders/browser-esbuild/stylesheets/sass-language.js +169 -0
  26. package/src/builders/browser-esbuild/stylesheets/{css-plugin.d.ts → stylesheet-plugin-factory.d.ts} +18 -9
  27. package/src/builders/browser-esbuild/stylesheets/stylesheet-plugin-factory.js +218 -0
  28. package/src/builders/browser-esbuild/watcher.d.ts +2 -2
  29. package/src/builders/browser-esbuild/watcher.js +1 -1
  30. package/src/builders/dev-server/load-proxy-config.js +3 -3
  31. package/src/builders/dev-server/vite-server.d.ts +1 -2
  32. package/src/builders/dev-server/vite-server.js +43 -10
  33. package/src/builders/jest/test-files.d.ts +2 -3
  34. package/src/builders/jest/test-files.js +8 -9
  35. package/src/builders/karma/find-tests-plugin.js +4 -8
  36. package/src/utils/copy-assets.js +15 -43
  37. package/src/webpack/configs/common.js +2 -1
  38. package/src/webpack/plugins/typescript.js +3 -4
  39. package/src/webpack/utils/helpers.js +4 -5
  40. package/src/builders/browser-esbuild/stylesheets/css-plugin.js +0 -164
  41. package/src/builders/browser-esbuild/stylesheets/less-plugin.d.ts +0 -14
  42. package/src/builders/browser-esbuild/stylesheets/less-plugin.js +0 -142
  43. package/src/builders/browser-esbuild/stylesheets/sass-plugin.d.ts +0 -16
  44. package/src/builders/browser-esbuild/stylesheets/sass-plugin.js +0 -201
@@ -1,142 +0,0 @@
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 __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
10
- if (k2 === undefined) k2 = k;
11
- var desc = Object.getOwnPropertyDescriptor(m, k);
12
- if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
13
- desc = { enumerable: true, get: function() { return m[k]; } };
14
- }
15
- Object.defineProperty(o, k2, desc);
16
- }) : (function(o, m, k, k2) {
17
- if (k2 === undefined) k2 = k;
18
- o[k2] = m[k];
19
- }));
20
- var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
21
- Object.defineProperty(o, "default", { enumerable: true, value: v });
22
- }) : function(o, v) {
23
- o["default"] = v;
24
- });
25
- var __importStar = (this && this.__importStar) || function (mod) {
26
- if (mod && mod.__esModule) return mod;
27
- var result = {};
28
- if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
29
- __setModuleDefault(result, mod);
30
- return result;
31
- };
32
- var __importDefault = (this && this.__importDefault) || function (mod) {
33
- return (mod && mod.__esModule) ? mod : { "default": mod };
34
- };
35
- Object.defineProperty(exports, "__esModule", { value: true });
36
- exports.createLessPlugin = void 0;
37
- const node_assert_1 = __importDefault(require("node:assert"));
38
- const promises_1 = require("node:fs/promises");
39
- /**
40
- * The lazy-loaded instance of the less stylesheet preprocessor.
41
- * It is only imported and initialized if a less stylesheet is used.
42
- */
43
- let lessPreprocessor;
44
- function isLessException(error) {
45
- return !!error && typeof error === 'object' && 'column' in error;
46
- }
47
- function createLessPlugin(options) {
48
- return {
49
- name: 'angular-less',
50
- setup(build) {
51
- // Add a load callback to support inline Component styles
52
- build.onLoad({ filter: /^less;/, namespace: 'angular:styles/component' }, async (args) => {
53
- const data = options.inlineComponentData?.[args.path];
54
- (0, node_assert_1.default)(typeof data === 'string', `component style name should always be found [${args.path}]`);
55
- const [, , filePath] = args.path.split(';', 3);
56
- return compileString(data, filePath, options, build.resolve.bind(build));
57
- });
58
- // Add a load callback to support files from disk
59
- build.onLoad({ filter: /\.less$/ }, async (args) => {
60
- const data = await (0, promises_1.readFile)(args.path, 'utf-8');
61
- return compileString(data, args.path, options, build.resolve.bind(build));
62
- });
63
- },
64
- };
65
- }
66
- exports.createLessPlugin = createLessPlugin;
67
- async function compileString(data, filename, options, resolver) {
68
- const less = (lessPreprocessor ?? (lessPreprocessor = (await Promise.resolve().then(() => __importStar(require('less')))).default));
69
- const resolverPlugin = {
70
- install({ FileManager }, pluginManager) {
71
- const resolverFileManager = new (class extends FileManager {
72
- supportsSync() {
73
- return false;
74
- }
75
- supports() {
76
- return true;
77
- }
78
- async loadFile(filename, currentDirectory, options, environment) {
79
- // Attempt direct loading as a relative path to avoid resolution overhead
80
- try {
81
- return await super.loadFile(filename, currentDirectory, options, environment);
82
- }
83
- catch (error) {
84
- // Attempt a full resolution if not found
85
- const fullResult = await resolver(filename, {
86
- kind: 'import-rule',
87
- resolveDir: currentDirectory,
88
- });
89
- if (fullResult.path) {
90
- return {
91
- filename: fullResult.path,
92
- contents: await (0, promises_1.readFile)(fullResult.path, 'utf-8'),
93
- };
94
- }
95
- // Otherwise error by throwing the failing direct result
96
- throw error;
97
- }
98
- }
99
- })();
100
- pluginManager.addFileManager(resolverFileManager);
101
- },
102
- };
103
- try {
104
- const result = await less.render(data, {
105
- filename,
106
- paths: options.includePaths,
107
- plugins: [resolverPlugin],
108
- rewriteUrls: 'all',
109
- sourceMap: options.sourcemap
110
- ? {
111
- sourceMapFileInline: true,
112
- outputSourceFiles: true,
113
- }
114
- : undefined,
115
- });
116
- return {
117
- contents: result.css,
118
- loader: 'css',
119
- };
120
- }
121
- catch (error) {
122
- if (isLessException(error)) {
123
- return {
124
- errors: [
125
- {
126
- text: error.message,
127
- location: {
128
- file: error.filename,
129
- line: error.line,
130
- column: error.column,
131
- // Middle element represents the line containing the error
132
- lineText: error.extract && error.extract[Math.trunc(error.extract.length / 2)],
133
- },
134
- },
135
- ],
136
- loader: 'css',
137
- };
138
- }
139
- throw error;
140
- }
141
- }
142
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGVzcy1wbHVnaW4uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9hbmd1bGFyX2RldmtpdC9idWlsZF9hbmd1bGFyL3NyYy9idWlsZGVycy9icm93c2VyLWVzYnVpbGQvc3R5bGVzaGVldHMvbGVzcy1wbHVnaW4udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBOzs7Ozs7R0FNRzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFHSCw4REFBaUM7QUFDakMsK0NBQTRDO0FBRTVDOzs7R0FHRztBQUNILElBQUksZ0JBQW1ELENBQUM7QUFleEQsU0FBUyxlQUFlLENBQUMsS0FBYztJQUNyQyxPQUFPLENBQUMsQ0FBQyxLQUFLLElBQUksT0FBTyxLQUFLLEtBQUssUUFBUSxJQUFJLFFBQVEsSUFBSSxLQUFLLENBQUM7QUFDbkUsQ0FBQztBQUVELFNBQWdCLGdCQUFnQixDQUFDLE9BQTBCO0lBQ3pELE9BQU87UUFDTCxJQUFJLEVBQUUsY0FBYztRQUNwQixLQUFLLENBQUMsS0FBa0I7WUFDdEIseURBQXlEO1lBQ3pELEtBQUssQ0FBQyxNQUFNLENBQUMsRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUFFLFNBQVMsRUFBRSwwQkFBMEIsRUFBRSxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsRUFBRTtnQkFDdkYsTUFBTSxJQUFJLEdBQUcsT0FBTyxDQUFDLG1CQUFtQixFQUFFLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO2dCQUN0RCxJQUFBLHFCQUFNLEVBQ0osT0FBTyxJQUFJLEtBQUssUUFBUSxFQUN4QixnREFBZ0QsSUFBSSxDQUFDLElBQUksR0FBRyxDQUM3RCxDQUFDO2dCQUVGLE1BQU0sQ0FBQyxFQUFFLEFBQUQsRUFBRyxRQUFRLENBQUMsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUM7Z0JBRS9DLE9B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LEtBQUs7U0FDZCxDQUFDO0tBQ0g7SUFBQyxPQUFPLEtBQUssRUFBRTtRQUNkLElBQUksZUFBZSxDQUFDLEtBQUssQ0FBQyxFQUFFO1lBQzFCLE9BQU87Z0JBQ0wsTUFBTSxFQUFFO29CQUNOO3dCQUNFLElBQUksRUFBRSxLQUFLLENBQUMsT0FBTzt3QkFDbkIsUUFBUSxFQUFFOzRCQUNSLElBQUksRUFBRSxLQUFLLENBQUMsUUFBUTs0QkFDcEIsSUFBSSxFQUFFLEtBQUssQ0FBQyxJQUFJOzRCQUNoQixNQUFNLEVBQUUsS0FBSyxDQUFDLE1BQU07NEJBQ3BCLDBEQUEwRDs0QkFDMUQsUUFBUSxFQUFFLEtBQUssQ0FBQyxPQUFPLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDO3lCQUMvRTtxQkFDRjtpQkFDRjtnQkFDRCxNQUFNLEVBQUUsS0FBSzthQUNkLENBQUM7U0FDSDtRQUVELE1BQU0sS0FBSyxDQUFDO0tBQ2I7QUFDSCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IEdvb2dsZSBMTEMgQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqXG4gKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZVxuICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZVxuICovXG5cbmltcG9ydCB0eXBlIHsgT25Mb2FkUmVzdWx0LCBQbHVnaW4sIFBsdWdpbkJ1aWxkIH0gZnJvbSAnZXNidWlsZCc7XG5pbXBvcnQgYXNzZXJ0IGZyb20gJ25vZGU6YXNzZXJ0JztcbmltcG9ydCB7IHJlYWRGaWxlIH0gZnJvbSAnbm9kZTpmcy9wcm9taXNlcyc7XG5cbi8qKlxuICogVGhlIGxhenktbG9hZGVkIGluc3RhbmNlIG9mIHRoZSBsZXNzIHN0eWxlc2hlZXQgcHJlcHJvY2Vzc29yLlxuICogSXQgaXMgb25seSBpbXBvcnRlZCBhbmQgaW5pdGlhbGl6ZWQgaWYgYSBsZXNzIHN0eWxlc2hlZXQgaXMgdXNlZC5cbiAqL1xubGV0IGxlc3NQcmVwcm9jZXNzb3I6IHR5cGVvZiBpbXBvcnQoJ2xlc3MnKSB8IHVuZGVmaW5lZDtcblxuZXhwb3J0IGludGVyZmFjZSBMZXNzUGx1Z2luT3B0aW9ucyB7XG4gIHNvdXJjZW1hcDogYm9vbGVhbjtcbiAgaW5jbHVkZVBhdGhzPzogc3RyaW5nW107XG4gIGlubGluZUNvbXBvbmVudERhdGE/OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+O1xufVxuXG5pbnRlcmZhY2UgTGVzc0V4Y2VwdGlvbiBleHRlbmRzIEVycm9yIHtcbiAgZmlsZW5hbWU6IHN0cmluZztcbiAgbGluZTogbnVtYmVyO1xuICBjb2x1bW46IG51bWJlcjtcbiAgZXh0cmFjdD86IHN0cmluZ1tdO1xufVxuXG5mdW5jdGlvbiBpc0xlc3NFeGNlcHRpb24oZXJyb3I6IHVua25vd24pOiBlcnJvciBpcyBMZXNzRXhjZXB0aW9uIHtcbiAgcmV0dXJuICEhZXJyb3IgJiYgdHlwZW9mIGVycm9yID09PSAnb2JqZWN0JyAmJiAnY29sdW1uJyBpbiBlcnJvcjtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUxlc3NQbHVnaW4ob3B0aW9uczogTGVzc1BsdWdpbk9wdGlvbnMpOiBQbHVnaW4ge1xuICByZXR1cm4ge1xuICAgIG5hbWU6ICdhbmd1bGFyLWxlc3MnLFxuICAgIHNldHVwKGJ1aWxkOiBQbHVnaW5CdWlsZCk6IHZvaWQge1xuICAgICAgLy8gQWRkIGEgbG9hZCBjYWxsYmFjayB0byBzdXBwb3J0IGlubGluZSBDb21wb25lbnQgc3R5bGVzXG4gICAgICBidWlsZC5vbkxvYWQoeyBmaWx0ZXI6IC9ebGVzczsvLCBuYW1lc3BhY2U6ICdhbmd1bGFyOnN0eWxlcy9jb21wb25lbnQnIH0sIGFzeW5jIChhcmdzKSA9PiB7XG4gICAgICAgIGNvbnN0IGRhdGEgPSBvcHRpb25zLmlubGluZUNvbXBvbmVudERhdGE/LlthcmdzLnBhdGhdO1xuICAgICAgICBhc3NlcnQoXG4gICAgICAgICAgdHlwZW9mIGRhdGEgPT09ICdzdHJpbmcnLFxuICAgICAgICAgIGBjb21wb25lbnQgc3R5bGUgbmFtZSBzaG91bGQgYWx3YXlzIGJlIGZvdW5kIFske2FyZ3MucGF0aH1dYCxcbiAgICAgICAgKTtcblxuICAgICAgICBjb25zdCBbLCAsIGZpbGVQYXRoXSA9IGFyZ3MucGF0aC5zcGxpdCgnOycsIDMpO1xuXG4gICAgICAgIHJldHVybiBjb21waWxlU3RyaW5nKGRhdGEsIGZpbGVQYXRoLCBvcHRpb25zLCBidWlsZC5yZXNvbHZlLmJpbmQoYnVpbGQpKTtcbiAgICAgIH0pO1xuXG4gICAgICAvLyBBZGQgYSBsb2FkIGNhbGxiYWNrIHRvIHN1cHBvcnQgZmlsZXMgZnJvbSBkaXNrXG4gICAgICBidWlsZC5vbkxvYWQoeyBmaWx0ZXI6IC9cXC5sZXNzJC8gfSwgYXN5bmMgKGFyZ3MpID0+IHtcbiAgICAgICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlYWRGaWxlKGFyZ3MucGF0aCwgJ3V0Zi04Jyk7XG5cbiAgICAgICAgcmV0dXJuIGNvbXBpbGVTdHJpbmcoZGF0YSwgYXJncy5wYXRoLCBvcHRpb25zLCBidWlsZC5yZXNvbHZlLmJpbmQoYnVpbGQpKTtcbiAgICAgIH0pO1xuICAgIH0sXG4gIH07XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGNvbXBpbGVTdHJpbmcoXG4gIGRhdGE6IHN0cmluZyxcbiAgZmlsZW5hbWU6IHN0cmluZyxcbiAgb3B0aW9uczogTGVzc1BsdWdpbk9wdGlvbnMsXG4gIHJlc29sdmVyOiBQbHVnaW5CdWlsZFsncmVzb2x2ZSddLFxuKTogUHJvbWlzZTxPbkxvYWRSZXN1bHQ+IHtcbiAgY29uc3QgbGVzcyA9IChsZXNzUHJlcHJvY2Vzc29yID8/PSAoYXdhaXQgaW1wb3J0KCdsZXNzJykpLmRlZmF1bHQpO1xuXG4gIGNvbnN0IHJlc29sdmVyUGx1Z2luOiBMZXNzLlBsdWdpbiA9IHtcbiAgICBpbnN0YWxsKHsgRmlsZU1hbmFnZXIgfSwgcGx1Z2luTWFuYWdlcik6IHZvaWQge1xuICAgICAgY29uc3QgcmVzb2x2ZXJGaWxlTWFuYWdlciA9IG5ldyAoY2xhc3MgZXh0ZW5kcyBGaWxlTWFuYWdlciB7XG4gICAgICAgIG92ZXJyaWRlIHN1cHBvcnRzU3luYygpOiBib29sZWFuIHtcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICBvdmVycmlkZSBzdXBwb3J0cygpOiBib29sZWFuIHtcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIG92ZXJyaWRlIGFzeW5jIGxvYWRGaWxlKFxuICAgICAgICAgIGZpbGVuYW1lOiBzdHJpbmcsXG4gICAgICAgICAgY3VycmVudERpcmVjdG9yeTogc3RyaW5nLFxuICAgICAgICAgIG9wdGlvbnM6IExlc3MuTG9hZEZpbGVPcHRpb25zLFxuICAgICAgICAgIGVudmlyb25tZW50OiBMZXNzLkVudmlyb25tZW50LFxuICAgICAgICApOiBQcm9taXNlPExlc3MuRmlsZUxvYWRSZXN1bHQ+IHtcbiAgICAgICAgICAvLyBBdHRlbXB0IGRpcmVjdCBsb2FkaW5nIGFzIGEgcmVsYXRpdmUgcGF0aCB0byBhdm9pZCByZXNvbHV0aW9uIG92ZXJoZWFkXG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHJldHVybiBhd2FpdCBzdXBlci5sb2FkRmlsZShmaWxlbmFtZSwgY3VycmVudERpcmVjdG9yeSwgb3B0aW9ucywgZW52aXJvbm1lbnQpO1xuICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICAvLyBBdHRlbXB0IGEgZnVsbCByZXNvbHV0aW9uIGlmIG5vdCBmb3VuZFxuICAgICAgICAgICAgY29uc3QgZnVsbFJlc3VsdCA9IGF3YWl0IHJlc29sdmVyKGZpbGVuYW1lLCB7XG4gICAgICAgICAgICAgIGtpbmQ6ICdpbXBvcnQtcnVsZScsXG4gICAgICAgICAgICAgIHJlc29sdmVEaXI6IGN1cnJlbnREaXJlY3RvcnksXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGlmIChmdWxsUmVzdWx0LnBhdGgpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICBmaWxlbmFtZTogZnVsbFJlc3VsdC5wYXRoLFxuICAgICAgICAgICAgICAgIGNvbnRlbnRzOiBhd2FpdCByZWFkRmlsZShmdWxsUmVzdWx0LnBhdGgsICd1dGYtOCcpLFxuICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gT3RoZXJ3aXNlIGVycm9yIGJ5IHRocm93aW5nIHRoZSBmYWlsaW5nIGRpcmVjdCByZXN1bHRcbiAgICAgICAgICAgIHRocm93IGVycm9yO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSkoKTtcblxuICAgICAgcGx1Z2luTWFuYWdlci5hZGRGaWxlTWFuYWdlcihyZXNvbHZlckZpbGVNYW5hZ2VyKTtcbiAgICB9LFxuICB9O1xuXG4gIHRyeSB7XG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgbGVzcy5yZW5kZXIoZGF0YSwge1xuICAgICAgZmlsZW5hbWUsXG4gICAgICBwYXRoczogb3B0aW9ucy5pbmNsdWRlUGF0aHMsXG4gICAgICBwbHVnaW5zOiBbcmVzb2x2ZXJQbHVnaW5dLFxuICAgICAgcmV3cml0ZVVybHM6ICdhbGwnLFxuICAgICAgc291cmNlTWFwOiBvcHRpb25zLnNvdXJjZW1hcFxuICAgICAgICA/IHtcbiAgICAgICAgICAgIHNvdXJjZU1hcEZpbGVJbmxpbmU6IHRydWUsXG4gICAgICAgICAgICBvdXRwdXRTb3VyY2VGaWxlczogdHJ1ZSxcbiAgICAgICAgICB9XG4gICAgICAgIDogdW5kZWZpbmVkLFxuICAgIH0gYXMgTGVzcy5PcHRpb25zKTtcblxuICAgIHJldHVybiB7XG4gICAgICBjb250ZW50czogcmVzdWx0LmNzcyxcbiAgICAgIGxvYWRlcjogJ2NzcycsXG4gICAgfTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBpZiAoaXNMZXNzRXhjZXB0aW9uKGVycm9yKSkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgZXJyb3JzOiBbXG4gICAgICAgICAge1xuICAgICAgICAgICAgdGV4dDogZXJyb3IubWVzc2FnZSxcbiAgICAgICAgICAgIGxvY2F0aW9uOiB7XG4gICAgICAgICAgICAgIGZpbGU6IGVycm9yLmZpbGVuYW1lLFxuICAgICAgICAgICAgICBsaW5lOiBlcnJvci5saW5lLFxuICAgICAgICAgICAgICBjb2x1bW46IGVycm9yLmNvbHVtbixcbiAgICAgICAgICAgICAgLy8gTWlkZGxlIGVsZW1lbnQgcmVwcmVzZW50cyB0aGUgbGluZSBjb250YWluaW5nIHRoZSBlcnJvclxuICAgICAgICAgICAgICBsaW5lVGV4dDogZXJyb3IuZXh0cmFjdCAmJiBlcnJvci5leHRyYWN0W01hdGgudHJ1bmMoZXJyb3IuZXh0cmFjdC5sZW5ndGggLyAyKV0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH0sXG4gICAgICAgIF0sXG4gICAgICAgIGxvYWRlcjogJ2NzcycsXG4gICAgICB9O1xuICAgIH1cblxuICAgIHRocm93IGVycm9yO1xuICB9XG59XG4iXX0=
@@ -1,16 +0,0 @@
1
- /**
2
- * @license
3
- * Copyright Google LLC All Rights Reserved.
4
- *
5
- * Use of this source code is governed by an MIT-style license that can be
6
- * found in the LICENSE file at https://angular.io/license
7
- */
8
- import type { Plugin } from 'esbuild';
9
- import type { LoadResultCache } from '../load-result-cache';
10
- export interface SassPluginOptions {
11
- sourcemap: boolean;
12
- loadPaths?: string[];
13
- inlineComponentData?: Record<string, string>;
14
- }
15
- export declare function shutdownSassWorkerPool(): void;
16
- export declare function createSassPlugin(options: SassPluginOptions, cache?: LoadResultCache): Plugin;
@@ -1,201 +0,0 @@
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 __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
10
- if (k2 === undefined) k2 = k;
11
- var desc = Object.getOwnPropertyDescriptor(m, k);
12
- if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
13
- desc = { enumerable: true, get: function() { return m[k]; } };
14
- }
15
- Object.defineProperty(o, k2, desc);
16
- }) : (function(o, m, k, k2) {
17
- if (k2 === undefined) k2 = k;
18
- o[k2] = m[k];
19
- }));
20
- var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
21
- Object.defineProperty(o, "default", { enumerable: true, value: v });
22
- }) : function(o, v) {
23
- o["default"] = v;
24
- });
25
- var __importStar = (this && this.__importStar) || function (mod) {
26
- if (mod && mod.__esModule) return mod;
27
- var result = {};
28
- if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
29
- __setModuleDefault(result, mod);
30
- return result;
31
- };
32
- var __importDefault = (this && this.__importDefault) || function (mod) {
33
- return (mod && mod.__esModule) ? mod : { "default": mod };
34
- };
35
- Object.defineProperty(exports, "__esModule", { value: true });
36
- exports.createSassPlugin = exports.shutdownSassWorkerPool = void 0;
37
- const node_assert_1 = __importDefault(require("node:assert"));
38
- const promises_1 = require("node:fs/promises");
39
- const node_path_1 = require("node:path");
40
- const node_url_1 = require("node:url");
41
- let sassWorkerPool;
42
- function isSassException(error) {
43
- return !!error && typeof error === 'object' && 'sassMessage' in error;
44
- }
45
- function shutdownSassWorkerPool() {
46
- sassWorkerPool?.close();
47
- sassWorkerPool = undefined;
48
- }
49
- exports.shutdownSassWorkerPool = shutdownSassWorkerPool;
50
- function createSassPlugin(options, cache) {
51
- return {
52
- name: 'angular-sass',
53
- setup(build) {
54
- const resolveUrl = async (url, previousResolvedModules) => {
55
- let result = await build.resolve(url, {
56
- kind: 'import-rule',
57
- // This should ideally be the directory of the importer file from Sass
58
- // but that is not currently available from the Sass importer API.
59
- resolveDir: build.initialOptions.absWorkingDir,
60
- });
61
- // Workaround to support Yarn PnP without access to the importer file from Sass
62
- if (!result.path && previousResolvedModules?.size) {
63
- for (const previous of previousResolvedModules) {
64
- result = await build.resolve(url, {
65
- kind: 'import-rule',
66
- resolveDir: previous,
67
- });
68
- if (result.path) {
69
- break;
70
- }
71
- }
72
- }
73
- return result;
74
- };
75
- build.onLoad({ filter: /^s[ac]ss;/, namespace: 'angular:styles/component' }, async (args) => {
76
- const data = options.inlineComponentData?.[args.path];
77
- (0, node_assert_1.default)(typeof data === 'string', `component style name should always be found [${args.path}]`);
78
- let result = cache?.get(data);
79
- if (result === undefined) {
80
- const [language, , filePath] = args.path.split(';', 3);
81
- const syntax = language === 'sass' ? 'indented' : 'scss';
82
- result = await compileString(data, filePath, syntax, options, resolveUrl);
83
- if (result.errors === undefined) {
84
- // Cache the result if there were no errors
85
- await cache?.put(data, result);
86
- }
87
- }
88
- return result;
89
- });
90
- build.onLoad({ filter: /\.s[ac]ss$/ }, async (args) => {
91
- let result = cache?.get(args.path);
92
- if (result === undefined) {
93
- const data = await (0, promises_1.readFile)(args.path, 'utf-8');
94
- const syntax = (0, node_path_1.extname)(args.path).toLowerCase() === '.sass' ? 'indented' : 'scss';
95
- result = await compileString(data, args.path, syntax, options, resolveUrl);
96
- if (result.errors === undefined) {
97
- // Cache the result if there were no errors
98
- await cache?.put(args.path, result);
99
- }
100
- }
101
- return result;
102
- });
103
- },
104
- };
105
- }
106
- exports.createSassPlugin = createSassPlugin;
107
- async function compileString(data, filePath, syntax, options, resolveUrl) {
108
- // Lazily load Sass when a Sass file is found
109
- if (sassWorkerPool === undefined) {
110
- const sassService = await Promise.resolve().then(() => __importStar(require('../../../sass/sass-service')));
111
- sassWorkerPool = new sassService.SassWorkerImplementation(true);
112
- }
113
- const warnings = [];
114
- try {
115
- const { css, sourceMap, loadedUrls } = await sassWorkerPool.compileStringAsync(data, {
116
- url: (0, node_url_1.pathToFileURL)(filePath),
117
- style: 'expanded',
118
- syntax,
119
- loadPaths: options.loadPaths,
120
- sourceMap: options.sourcemap,
121
- sourceMapIncludeSources: options.sourcemap,
122
- quietDeps: true,
123
- importers: [
124
- {
125
- findFileUrl: async (url, { previousResolvedModules }) => {
126
- let result = await resolveUrl(url);
127
- if (result.path) {
128
- return (0, node_url_1.pathToFileURL)(result.path);
129
- }
130
- // Check for package deep imports
131
- const parts = url.split('/');
132
- const hasScope = parts.length >= 2 && parts[0].startsWith('@');
133
- const [nameOrScope, nameOrFirstPath, ...pathPart] = parts;
134
- const packageName = hasScope ? `${nameOrScope}/${nameOrFirstPath}` : nameOrScope;
135
- let packageResult = await resolveUrl(packageName + '/package.json');
136
- if (packageResult.path) {
137
- return (0, node_url_1.pathToFileURL)((0, node_path_1.join)((0, node_path_1.dirname)(packageResult.path), !hasScope && nameOrFirstPath ? nameOrFirstPath : '', ...pathPart));
138
- }
139
- // Check with Yarn PnP workaround using previous resolved modules.
140
- // This is done last to avoid a performance penalty for common cases.
141
- result = await resolveUrl(url, previousResolvedModules);
142
- if (result.path) {
143
- return (0, node_url_1.pathToFileURL)(result.path);
144
- }
145
- packageResult = await resolveUrl(packageName + '/package.json', previousResolvedModules);
146
- if (packageResult.path) {
147
- return (0, node_url_1.pathToFileURL)((0, node_path_1.join)((0, node_path_1.dirname)(packageResult.path), !hasScope && nameOrFirstPath ? nameOrFirstPath : '', ...pathPart));
148
- }
149
- // Not found
150
- return null;
151
- },
152
- },
153
- ],
154
- logger: {
155
- warn: (text, { deprecation, span }) => {
156
- warnings.push({
157
- text: deprecation ? 'Deprecation' : text,
158
- location: span && {
159
- file: span.url && (0, node_url_1.fileURLToPath)(span.url),
160
- lineText: span.context,
161
- // Sass line numbers are 0-based while esbuild's are 1-based
162
- line: span.start.line + 1,
163
- column: span.start.column,
164
- },
165
- notes: deprecation ? [{ text }] : undefined,
166
- });
167
- },
168
- },
169
- });
170
- return {
171
- loader: 'css',
172
- contents: sourceMap ? `${css}\n${sourceMapToUrlComment(sourceMap, (0, node_path_1.dirname)(filePath))}` : css,
173
- watchFiles: loadedUrls.map((url) => (0, node_url_1.fileURLToPath)(url)),
174
- warnings,
175
- };
176
- }
177
- catch (error) {
178
- if (isSassException(error)) {
179
- const file = error.span.url ? (0, node_url_1.fileURLToPath)(error.span.url) : undefined;
180
- return {
181
- loader: 'css',
182
- errors: [
183
- {
184
- text: error.message,
185
- },
186
- ],
187
- warnings,
188
- watchFiles: file ? [file] : undefined,
189
- };
190
- }
191
- throw error;
192
- }
193
- }
194
- function sourceMapToUrlComment(sourceMap, root) {
195
- // Remove `file` protocol from all sourcemap sources and adjust to be relative to the input file.
196
- // This allows esbuild to correctly process the paths.
197
- sourceMap.sources = sourceMap.sources.map((source) => (0, node_path_1.relative)(root, (0, node_url_1.fileURLToPath)(source)));
198
- const urlSourceMap = Buffer.from(JSON.stringify(sourceMap), 'utf-8').toString('base64');
199
- return `/*# sourceMappingURL=data:application/json;charset=utf-8;base64,${urlSourceMap} */`;
200
- }
201
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2Fzcy1wbHVnaW4uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9hbmd1bGFyX2RldmtpdC9idWlsZF9hbmd1bGFyL3NyYy9idWlsZGVycy9icm93c2VyLWVzYnVpbGQvc3R5bGVzaGVldHMvc2Fzcy1wbHVnaW4udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBOzs7Ozs7R0FNRzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFHSCw4REFBaUM7QUFDakMsK0NBQTRDO0FBQzVDLHlDQUE2RDtBQUM3RCx1Q0FBd0Q7QUFjeEQsSUFBSSxjQUFvRCxDQUFDO0FBRXpELFNBQVMsZUFBZSxDQUFDLEtBQWM7SUFDckMsT0FBTyxDQUFDLENBQUMsS0FBSyxJQUFJLE9BQU8sS0FBSyxLQUFLLFFBQVEsSUFBSSxhQUFhLElBQUksS0FBSyxDQUFDO0FBQ3hFLENBQUM7QUFFRCxTQUFnQixzQkFBc0I7SUFDcEMsY0FBYyxFQUFFLEtBQUssRUFBRSxDQUFDO0lBQ3hCLGNBQWMsR0FBRyxTQUFTLENBQUM7QUFDN0IsQ0FBQztBQUhELHdEQUdDO0FBRUQsU0FBZ0IsZ0JBQWdCLENBQUMsT0FBMEIsRUFBRSxLQUF1QjtJQUNsRixPQUFPO1FBQ0wsSUFBSSxFQUFFLGNBQWM7UUFDcEIsS0FBSyxDQUFDLEtBQWtCO1lBQ3RCLE1BQU0sVUFBVSxHQUFHLEtBQUssRUFBRSxHQUFXLEVBQUUsdUJBQXFDLEVBQUUsRUFBRTtnQkFDOUUsSUFBSSxNQUFNLEdBQUcsTUFBTSxLQUFLLENBQUMsT0FBTyxDQUFDLEdBQUcsRUFBRTtvQkFDcEMsSUFBSSxFQUFFLGFBQWE7b0JBQ25CLHNFQUFzRTtvQkFDdEUsa0VBQWtFO29CQUNsRSxVQUFVLEVBQUUsS0FBSyxDQUFDLGNBQWMsQ0FBQyxhQUFhO2lCQUMvQyxDQUFDLENBQUM7Z0JBRUgsK0VBQStFO2dCQUMvRSxJQUFJLENBQUMsTUFBTSxDQUFDLElB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SUFBQyxPQUFPLEtBQUssRUFBRTtRQUNkLElBQUksZUFBZSxDQUFDLEtBQUssQ0FBQyxFQUFFO1lBQzFCLE1BQU0sSUFBSSxHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxJQUFBLHdCQUFhLEVBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO1lBRXhFLE9BQU87Z0JBQ0wsTUFBTSxFQUFFLEtBQUs7Z0JBQ2IsTUFBTSxFQUFFO29CQUNOO3dCQUNFLElBQUksRUFBRSxLQUFLLENBQUMsT0FBTztxQkFDcEI7aUJBQ0Y7Z0JBQ0QsUUFBUTtnQkFDUixVQUFVLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTO2FBQ3RDLENBQUM7U0FDSDtRQUVELE1BQU0sS0FBSyxDQUFDO0tBQ2I7QUFDSCxDQUFDO0FBRUQsU0FBUyxxQkFBcUIsQ0FDNUIsU0FBeUQsRUFDekQsSUFBWTtJQUVaLGlHQUFpRztJQUNqRyxzREFBc0Q7SUFDdEQsU0FBUyxDQUFDLE9BQU8sR0FBRyxTQUFTLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUMsSUFBQSxvQkFBUSxFQUFDLElBQUksRUFBRSxJQUFBLHdCQUFhLEVBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBRTdGLE1BQU0sWUFBWSxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsRUFBRSxPQUFPLENBQUMsQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLENBQUM7SUFFeEYsT0FBTyxtRUFBbUUsWUFBWSxLQUFLLENBQUM7QUFDOUYsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCBHb29nbGUgTExDIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKlxuICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmVcbiAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2VcbiAqL1xuXG5pbXBvcnQgdHlwZSB7IE9uTG9hZFJlc3VsdCwgUGFydGlhbE1lc3NhZ2UsIFBsdWdpbiwgUGx1Z2luQnVpbGQsIFJlc29sdmVSZXN1bHQgfSBmcm9tICdlc2J1aWxkJztcbmltcG9ydCBhc3NlcnQgZnJvbSAnbm9kZTphc3NlcnQnO1xuaW1wb3J0IHsgcmVhZEZpbGUgfSBmcm9tICdub2RlOmZzL3Byb21pc2VzJztcbmltcG9ydCB7IGRpcm5hbWUsIGV4dG5hbWUsIGpvaW4sIHJlbGF0aXZlIH0gZnJvbSAnbm9kZTpwYXRoJztcbmltcG9ydCB7IGZpbGVVUkxUb1BhdGgsIHBhdGhUb0ZpbGVVUkwgfSBmcm9tICdub2RlOnVybCc7XG5pbXBvcnQgdHlwZSB7IENvbXBpbGVSZXN1bHQsIEV4Y2VwdGlvbiwgU3ludGF4IH0gZnJvbSAnc2Fzcyc7XG5pbXBvcnQgdHlwZSB7XG4gIEZpbGVJbXBvcnRlcldpdGhSZXF1ZXN0Q29udGV4dE9wdGlvbnMsXG4gIFNhc3NXb3JrZXJJbXBsZW1lbnRhdGlvbixcbn0gZnJvbSAnLi4vLi4vLi4vc2Fzcy9zYXNzLXNlcnZpY2UnO1xuaW1wb3J0IHR5cGUgeyBMb2FkUmVzdWx0Q2FjaGUgfSBmcm9tICcuLi9sb2FkLXJlc3VsdC1jYWNoZSc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgU2Fzc1BsdWdpbk9wdGlvbnMge1xuICBzb3VyY2VtYXA6IGJvb2xlYW47XG4gIGxvYWRQYXRocz86IHN0cmluZ1tdO1xuICBpbmxpbmVDb21wb25lbnREYXRhPzogUmVjb3JkPHN0cmluZywgc3RyaW5nPjtcbn1cblxubGV0IHNhc3NXb3JrZXJQb29sOiBTYXNzV29ya2VySW1wbGVtZW50YXRpb24gfCB1bmRlZmluZWQ7XG5cbmZ1bmN0aW9uIGlzU2Fzc0V4Y2VwdGlvbihlcnJvcjogdW5rbm93bik6IGVycm9yIGlzIEV4Y2VwdGlvbiB7XG4gIHJldHVybiAhIWVycm9yICYmIHR5cGVvZiBlcnJvciA9PT0gJ29iamVjdCcgJiYgJ3Nhc3NNZXNzYWdlJyBpbiBlcnJvcjtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHNodXRkb3duU2Fzc1dvcmtlclBvb2woKTogdm9pZCB7XG4gIHNhc3NXb3JrZXJQb29sPy5jbG9zZSgpO1xuICBzYXNzV29ya2VyUG9vbCA9IHVuZGVmaW5lZDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVNhc3NQbHVnaW4ob3B0aW9uczogU2Fzc1BsdWdpbk9wdGlvbnMsIGNhY2hlPzogTG9hZFJlc3VsdENhY2hlKTogUGx1Z2luIHtcbiAgcmV0dXJuIHtcbiAgICBuYW1lOiAnYW5ndWxhci1zYXNzJyxcbiAgICBzZXR1cChidWlsZDogUGx1Z2luQnVpbGQpOiB2b2lkIHtcbiAgICAgIGNvbnN0IHJlc29sdmVVcmwgPSBhc3luYyAodXJsOiBzdHJpbmcsIHByZXZpb3VzUmVzb2x2ZWRNb2R1bGVzPzogU2V0PHN0cmluZz4pID0+IHtcbiAgICAgICAgbGV0IHJlc3VsdCA9IGF3YWl0IGJ1aWxkLnJlc29sdmUodXJsLCB7XG4gICAgICAgICAga2luZDogJ2ltcG9ydC1ydWxlJyxcbiAgICAgICAgICAvLyBUaGlzIHNob3VsZCBpZGVhbGx5IGJlIHRoZSBkaXJlY3Rvcnkgb2YgdGhlIGltcG9ydGVyIGZpbGUgZnJvbSBTYXNzXG4gICAgICAgICAgLy8gYnV0IHRoYXQgaXMgbm90IGN1cnJlbnRseSBhdmFpbGFibGUgZnJvbSB0aGUgU2FzcyBpbXBvcnRlciBBUEkuXG4gICAgICAgICAgcmVzb2x2ZURpcjogYnVpbGQuaW5pdGlhbE9wdGlvbnMuYWJzV29ya2luZ0RpcixcbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gV29ya2Fyb3VuZCB0byBzdXBwb3J0IFlhcm4gUG5QIHdpdGhvdXQgYWNjZXNzIHRvIHRoZSBpbXBvcnRlciBmaWxlIGZyb20gU2Fzc1xuICAgICAgICBpZiAoIXJlc3VsdC5wYXRoICYmIHByZXZpb3VzUmVzb2x2ZWRNb2R1bGVzPy5zaXplKSB7XG4gICAgICAgICAgZm9yIChjb25zdCBwcmV2aW91cyBvZiBwcmV2aW91c1Jlc29sdmVkTW9kdWxlcykge1xuICAgICAgICAgICAgcmVzdWx0ID0gYXdhaXQgYnVpbGQucmVzb2x2ZSh1cmwsIHtcbiAgICAgICAgICAgICAga2luZDogJ2ltcG9ydC1ydWxlJyxcbiAgICAgICAgICAgICAgcmVzb2x2ZURpcjogcHJldmlvdXMsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGlmIChyZXN1bHQucGF0aCkge1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgfTtcblxuICAgICAgYnVpbGQub25Mb2FkKHsgZmlsdGVyOiAvXnNbYWNdc3M7LywgbmFtZXNwYWNlOiAnYW5ndWxhcjpzdHlsZXMvY29tcG9uZW50JyB9LCBhc3luYyAoYXJncykgPT4ge1xuICAgICAgICBjb25zdCBkYXRhID0gb3B0aW9ucy5pbmxpbmVDb21wb25lbnREYXRhPy5bYXJncy5wYXRoXTtcbiAgICAgICAgYXNzZXJ0KFxuICAgICAgICAgIHR5cGVvZiBkYXRhID09PSAnc3RyaW5nJyxcbiAgICAgICAgICBgY29tcG9uZW50IHN0eWxlIG5hbWUgc2hvdWxkIGFsd2F5cyBiZSBmb3VuZCBbJHthcmdzLnBhdGh9XWAsXG4gICAgICAgICk7XG5cbiAgICAgICAgbGV0IHJlc3VsdCA9IGNhY2hlPy5nZXQoZGF0YSk7XG4gICAgICAgIGlmIChyZXN1bHQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIGNvbnN0IFtsYW5ndWFnZSwgLCBmaWxlUGF0aF0gPSBhcmdzLnBhdGguc3BsaXQoJzsnLCAzKTtcbiAgICAgICAgICBjb25zdCBzeW50YXggPSBsYW5ndWFnZSA9PT0gJ3Nhc3MnID8gJ2luZGVudGVkJyA6ICdzY3NzJztcblxuICAgICAgICAgIHJlc3VsdCA9IGF3YWl0IGNvbXBpbGVTdHJpbmcoZGF0YSwgZmlsZVBhdGgsIHN5bnRheCwgb3B0aW9ucywgcmVzb2x2ZVVybCk7XG4gICAgICAgICAgaWYgKHJlc3VsdC5lcnJvcnMgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgLy8gQ2FjaGUgdGhlIHJlc3VsdCBpZiB0aGVyZSB3ZXJlIG5vIGVycm9yc1xuICAgICAgICAgICAgYXdhaXQgY2FjaGU/LnB1dChkYXRhLCByZXN1bHQpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICB9KTtcblxuICAgICAgYnVpbGQub25Mb2FkKHsgZmlsdGVyOiAvXFwuc1thY11zcyQvIH0sIGFzeW5jIChhcmdzKSA9PiB7XG4gICAgICAgIGxldCByZXN1bHQgPSBjYWNoZT8uZ2V0KGFyZ3MucGF0aCk7XG4gICAgICAgIGlmIChyZXN1bHQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZWFkRmlsZShhcmdzLnBhdGgsICd1dGYtOCcpO1xuICAgICAgICAgIGNvbnN0IHN5bnRheCA9IGV4dG5hbWUoYXJncy5wYXRoKS50b0xvd2VyQ2FzZSgpID09PSAnLnNhc3MnID8gJ2luZGVudGVkJyA6ICdzY3NzJztcblxuICAgICAgICAgIHJlc3VsdCA9IGF3YWl0IGNvbXBpbGVTdHJpbmcoZGF0YSwgYXJncy5wYXRoLCBzeW50YXgsIG9wdGlvbnMsIHJlc29sdmVVcmwpO1xuICAgICAgICAgIGlmIChyZXN1bHQuZXJyb3JzID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIC8vIENhY2hlIHRoZSByZXN1bHQgaWYgdGhlcmUgd2VyZSBubyBlcnJvcnNcbiAgICAgICAgICAgIGF3YWl0IGNhY2hlPy5wdXQoYXJncy5wYXRoLCByZXN1bHQpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICB9KTtcbiAgICB9LFxuICB9O1xufVxuXG5hc3luYyBmdW5jdGlvbiBjb21waWxlU3RyaW5nKFxuICBkYXRhOiBzdHJpbmcsXG4gIGZpbGVQYXRoOiBzdHJpbmcsXG4gIHN5bnRheDogU3ludGF4LFxuICBvcHRpb25zOiBTYXNzUGx1Z2luT3B0aW9ucyxcbiAgcmVzb2x2ZVVybDogKHVybDogc3RyaW5nLCBwcmV2aW91c1Jlc29sdmVkTW9kdWxlcz86IFNldDxzdHJpbmc+KSA9PiBQcm9taXNlPFJlc29sdmVSZXN1bHQ+LFxuKTogUHJvbWlzZTxPbkxvYWRSZXN1bHQ+IHtcbiAgLy8gTGF6aWx5IGxvYWQgU2FzcyB3aGVuIGEgU2FzcyBmaWxlIGlzIGZvdW5kXG4gIGlmIChzYXNzV29ya2VyUG9vbCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgY29uc3Qgc2Fzc1NlcnZpY2UgPSBhd2FpdCBpbXBvcnQoJy4uLy4uLy4uL3Nhc3Mvc2Fzcy1zZXJ2aWNlJyk7XG4gICAgc2Fzc1dvcmtlclBvb2wgPSBuZXcgc2Fzc1NlcnZpY2UuU2Fzc1dvcmtlckltcGxlbWVudGF0aW9uKHRydWUpO1xuICB9XG5cbiAgY29uc3Qgd2FybmluZ3M6IFBhcnRpYWxNZXNzYWdlW10gPSBbXTtcbiAgdHJ5IHtcbiAgICBjb25zdCB7IGNzcywgc291cmNlTWFwLCBsb2FkZWRVcmxzIH0gPSBhd2FpdCBzYXNzV29ya2VyUG9vbC5jb21waWxlU3RyaW5nQXN5bmMoZGF0YSwge1xuICAgICAgdXJsOiBwYXRoVG9GaWxlVVJMKGZpbGVQYXRoKSxcbiAgICAgIHN0eWxlOiAnZXhwYW5kZWQnLFxuICAgICAgc3ludGF4LFxuICAgICAgbG9hZFBhdGhzOiBvcHRpb25zLmxvYWRQYXRocyxcbiAgICAgIHNvdXJjZU1hcDogb3B0aW9ucy5zb3VyY2VtYXAsXG4gICAgICBzb3VyY2VNYXBJbmNsdWRlU291cmNlczogb3B0aW9ucy5zb3VyY2VtYXAsXG4gICAgICBxdWlldERlcHM6IHRydWUsXG4gICAgICBpbXBvcnRlcnM6IFtcbiAgICAgICAge1xuICAgICAgICAgIGZpbmRGaWxlVXJsOiBhc3luYyAoXG4gICAgICAgICAgICB1cmwsXG4gICAgICAgICAgICB7IHByZXZpb3VzUmVzb2x2ZWRNb2R1bGVzIH06IEZpbGVJbXBvcnRlcldpdGhSZXF1ZXN0Q29udGV4dE9wdGlvbnMsXG4gICAgICAgICAgKTogUHJvbWlzZTxVUkwgfCBudWxsPiA9PiB7XG4gICAgICAgICAgICBsZXQgcmVzdWx0ID0gYXdhaXQgcmVzb2x2ZVVybCh1cmwpO1xuICAgICAgICAgICAgaWYgKHJlc3VsdC5wYXRoKSB7XG4gICAgICAgICAgICAgIHJldHVybiBwYXRoVG9GaWxlVVJMKHJlc3VsdC5wYXRoKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gQ2hlY2sgZm9yIHBhY2thZ2UgZGVlcCBpbXBvcnRzXG4gICAgICAgICAgICBjb25zdCBwYXJ0cyA9IHVybC5zcGxpdCgnLycpO1xuICAgICAgICAgICAgY29uc3QgaGFzU2NvcGUgPSBwYXJ0cy5sZW5ndGggPj0gMiAmJiBwYXJ0c1swXS5zdGFydHNXaXRoKCdAJyk7XG4gICAgICAgICAgICBjb25zdCBbbmFtZU9yU2NvcGUsIG5hbWVPckZpcnN0UGF0aCwgLi4ucGF0aFBhcnRdID0gcGFydHM7XG4gICAgICAgICAgICBjb25zdCBwYWNrYWdlTmFtZSA9IGhhc1Njb3BlID8gYCR7bmFtZU9yU2NvcGV9LyR7bmFtZU9yRmlyc3RQYXRofWAgOiBuYW1lT3JTY29wZTtcblxuICAgICAgICAgICAgbGV0IHBhY2thZ2VSZXN1bHQgPSBhd2FpdCByZXNvbHZlVXJsKHBhY2thZ2VOYW1lICsgJy9wYWNrYWdlLmpzb24nKTtcblxuICAgICAgICAgICAgaWYgKHBhY2thZ2VSZXN1bHQucGF0aCkge1xuICAgICAgICAgICAgICByZXR1cm4gcGF0aFRvRmlsZVVSTChcbiAgICAgICAgICAgICAgICBqb2luKFxuICAgICAgICAgICAgICAgICAgZGlybmFtZShwYWNrYWdlUmVzdWx0LnBhdGgpLFxuICAgICAgICAgICAgICAgICAgIWhhc1Njb3BlICYmIG5hbWVPckZpcnN0UGF0aCA/IG5hbWVPckZpcnN0UGF0aCA6ICcnLFxuICAgICAgICAgICAgICAgICAgLi4ucGF0aFBhcnQsXG4gICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gQ2hlY2sgd2l0aCBZYXJuIFBuUCB3b3JrYXJvdW5kIHVzaW5nIHByZXZpb3VzIHJlc29sdmVkIG1vZHVsZXMuXG4gICAgICAgICAgICAvLyBUaGlzIGlzIGRvbmUgbGFzdCB0byBhdm9pZCBhIHBlcmZvcm1hbmNlIHBlbmFsdHkgZm9yIGNvbW1vbiBjYXNlcy5cblxuICAgICAgICAgICAgcmVzdWx0ID0gYXdhaXQgcmVzb2x2ZVVybCh1cmwsIHByZXZpb3VzUmVzb2x2ZWRNb2R1bGVzKTtcbiAgICAgICAgICAgIGlmIChyZXN1bHQucGF0aCkge1xuICAgICAgICAgICAgICByZXR1cm4gcGF0aFRvRmlsZVVSTChyZXN1bHQucGF0aCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHBhY2thZ2VSZXN1bHQgPSBhd2FpdCByZXNvbHZlVXJsKFxuICAgICAgICAgICAgICBwYWNrYWdlTmFtZSArICcvcGFja2FnZS5qc29uJyxcbiAgICAgICAgICAgICAgcHJldmlvdXNSZXNvbHZlZE1vZHVsZXMsXG4gICAgICAgICAgICApO1xuXG4gICAgICAgICAgICBpZiAocGFja2FnZVJlc3VsdC5wYXRoKSB7XG4gICAgICAgICAgICAgIHJldHVybiBwYXRoVG9GaWxlVVJMKFxuICAgICAgICAgICAgICAgIGpvaW4oXG4gICAgICAgICAgICAgICAgICBkaXJuYW1lKHBhY2thZ2VSZXN1bHQucGF0aCksXG4gICAgICAgICAgICAgICAgICAhaGFzU2NvcGUgJiYgbmFtZU9yRmlyc3RQYXRoID8gbmFtZU9yRmlyc3RQYXRoIDogJycsXG4gICAgICAgICAgICAgICAgICAuLi5wYXRoUGFydCxcbiAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBOb3QgZm91bmRcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICBdLFxuICAgICAgbG9nZ2VyOiB7XG4gICAgICAgIHdhcm46ICh0ZXh0LCB7IGRlcHJlY2F0aW9uLCBzcGFuIH0pID0+IHtcbiAgICAgICAgICB3YXJuaW5ncy5wdXNoKHtcbiAgICAgICAgICAgIHRleHQ6IGRlcHJlY2F0aW9uID8gJ0RlcHJlY2F0aW9uJyA6IHRleHQsXG4gICAgICAgICAgICBsb2NhdGlvbjogc3BhbiAmJiB7XG4gICAgICAgICAgICAgIGZpbGU6IHNwYW4udXJsICYmIGZpbGVVUkxUb1BhdGgoc3Bhbi51cmwpLFxuICAgICAgICAgICAgICBsaW5lVGV4dDogc3Bhbi5jb250ZXh0LFxuICAgICAgICAgICAgICAvLyBTYXNzIGxpbmUgbnVtYmVycyBhcmUgMC1iYXNlZCB3aGlsZSBlc2J1aWxkJ3MgYXJlIDEtYmFzZWRcbiAgICAgICAgICAgICAgbGluZTogc3Bhbi5zdGFydC5saW5lICsgMSxcbiAgICAgICAgICAgICAgY29sdW1uOiBzcGFuLnN0YXJ0LmNvbHVtbixcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBub3RlczogZGVwcmVjYXRpb24gPyBbeyB0ZXh0IH1dIDogdW5kZWZpbmVkLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9LFxuICAgICAgfSxcbiAgICB9KTtcblxuICAgIHJldHVybiB7XG4gICAgICBsb2FkZXI6ICdjc3MnLFxuICAgICAgY29udGVudHM6IHNvdXJjZU1hcCA/IGAke2Nzc31cXG4ke3NvdXJjZU1hcFRvVXJsQ29tbWVudChzb3VyY2VNYXAsIGRpcm5hbWUoZmlsZVBhdGgpKX1gIDogY3NzLFxuICAgICAgd2F0Y2hGaWxlczogbG9hZGVkVXJscy5tYXAoKHVybCkgPT4gZmlsZVVSTFRvUGF0aCh1cmwpKSxcbiAgICAgIHdhcm5pbmdzLFxuICAgIH07XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgaWYgKGlzU2Fzc0V4Y2VwdGlvbihlcnJvcikpIHtcbiAgICAgIGNvbnN0IGZpbGUgPSBlcnJvci5zcGFuLnVybCA/IGZpbGVVUkxUb1BhdGgoZXJyb3Iuc3Bhbi51cmwpIDogdW5kZWZpbmVkO1xuXG4gICAgICByZXR1cm4ge1xuICAgICAgICBsb2FkZXI6ICdjc3MnLFxuICAgICAgICBlcnJvcnM6IFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICB0ZXh0OiBlcnJvci5tZXNzYWdlLFxuICAgICAgICAgIH0sXG4gICAgICAgIF0sXG4gICAgICAgIHdhcm5pbmdzLFxuICAgICAgICB3YXRjaEZpbGVzOiBmaWxlID8gW2ZpbGVdIDogdW5kZWZpbmVkLFxuICAgICAgfTtcbiAgICB9XG5cbiAgICB0aHJvdyBlcnJvcjtcbiAgfVxufVxuXG5mdW5jdGlvbiBzb3VyY2VNYXBUb1VybENvbW1lbnQoXG4gIHNvdXJjZU1hcDogRXhjbHVkZTxDb21waWxlUmVzdWx0Wydzb3VyY2VNYXAnXSwgdW5kZWZpbmVkPixcbiAgcm9vdDogc3RyaW5nLFxuKTogc3RyaW5nIHtcbiAgLy8gUmVtb3ZlIGBmaWxlYCBwcm90b2NvbCBmcm9tIGFsbCBzb3VyY2VtYXAgc291cmNlcyBhbmQgYWRqdXN0IHRvIGJlIHJlbGF0aXZlIHRvIHRoZSBpbnB1dCBmaWxlLlxuICAvLyBUaGlzIGFsbG93cyBlc2J1aWxkIHRvIGNvcnJlY3RseSBwcm9jZXNzIHRoZSBwYXRocy5cbiAgc291cmNlTWFwLnNvdXJjZXMgPSBzb3VyY2VNYXAuc291cmNlcy5tYXAoKHNvdXJjZSkgPT4gcmVsYXRpdmUocm9vdCwgZmlsZVVSTFRvUGF0aChzb3VyY2UpKSk7XG5cbiAgY29uc3QgdXJsU291cmNlTWFwID0gQnVmZmVyLmZyb20oSlNPTi5zdHJpbmdpZnkoc291cmNlTWFwKSwgJ3V0Zi04JykudG9TdHJpbmcoJ2Jhc2U2NCcpO1xuXG4gIHJldHVybiBgLyojIHNvdXJjZU1hcHBpbmdVUkw9ZGF0YTphcHBsaWNhdGlvbi9qc29uO2NoYXJzZXQ9dXRmLTg7YmFzZTY0LCR7dXJsU291cmNlTWFwfSAqL2A7XG59XG4iXX0=