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

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 (256) hide show
  1. package/package.json +23 -23
  2. package/plugins/karma.js +2 -2
  3. package/src/builders/browser/index.d.ts +1 -1
  4. package/src/builders/browser/index.js +5 -5
  5. package/src/builders/browser/schema.js +6 -6
  6. package/src/builders/browser-esbuild/index.js +28 -390
  7. package/src/builders/browser-esbuild/options.js +2 -2
  8. package/src/builders/browser-esbuild/schema.js +6 -6
  9. package/src/builders/dev-server/load-proxy-config.d.ts +1 -6
  10. package/src/builders/dev-server/load-proxy-config.js +52 -13
  11. package/src/builders/dev-server/vite-server.js +3 -6
  12. package/src/builders/dev-server/webpack-server.d.ts +1 -1
  13. package/src/builders/dev-server/webpack-server.js +6 -6
  14. package/src/builders/extract-i18n/index.js +3 -3
  15. package/src/builders/extract-i18n/schema.js +2 -2
  16. package/src/builders/karma/index.js +2 -2
  17. package/src/builders/karma/schema.js +2 -2
  18. package/src/builders/server/index.js +4 -4
  19. package/src/builders/server/schema.js +4 -4
  20. package/src/tools/babel/plugins/adjust-static-class-members.js +354 -0
  21. package/src/tools/babel/plugins/adjust-typescript-enums.js +124 -0
  22. package/src/tools/babel/plugins/elide-angular-metadata.js +68 -0
  23. package/src/tools/babel/plugins/pure-toplevel-functions.js +91 -0
  24. package/src/tools/babel/presets/application.js +197 -0
  25. package/src/{babel → tools/babel}/webpack-loader.d.ts +1 -1
  26. package/src/tools/babel/webpack-loader.js +189 -0
  27. package/src/tools/esbuild/angular/angular-compilation.js +51 -0
  28. package/src/tools/esbuild/angular/angular-host.js +60 -0
  29. package/src/tools/esbuild/angular/aot-compilation.js +208 -0
  30. package/src/tools/esbuild/angular/compiler-plugin.js +314 -0
  31. package/src/tools/esbuild/angular/diagnostics.js +75 -0
  32. package/src/tools/esbuild/angular/jit-compilation.js +106 -0
  33. package/src/tools/esbuild/angular/jit-plugin-callbacks.js +113 -0
  34. package/src/tools/esbuild/angular/jit-resource-transformer.js +185 -0
  35. package/src/tools/esbuild/angular/uri.js +75 -0
  36. package/src/tools/esbuild/application-code-bundle.d.ts +11 -0
  37. package/src/tools/esbuild/application-code-bundle.js +111 -0
  38. package/src/{builders/browser-esbuild/esbuild.d.ts → tools/esbuild/bundler-context.d.ts} +10 -15
  39. package/src/tools/esbuild/bundler-context.js +194 -0
  40. package/src/tools/esbuild/bundler-execution-result.d.ts +44 -0
  41. package/src/tools/esbuild/bundler-execution-result.js +53 -0
  42. package/src/tools/esbuild/commonjs-checker.js +141 -0
  43. package/src/tools/esbuild/external-packages-plugin.d.ts +17 -0
  44. package/src/tools/esbuild/external-packages-plugin.js +49 -0
  45. package/src/{builders/browser-esbuild → tools/esbuild}/global-scripts.d.ts +1 -1
  46. package/src/tools/esbuild/global-scripts.js +139 -0
  47. package/src/{builders/browser-esbuild → tools/esbuild}/global-styles.d.ts +1 -1
  48. package/src/tools/esbuild/global-styles.js +67 -0
  49. package/src/tools/esbuild/index-html-generator.d.ts +12 -0
  50. package/src/tools/esbuild/index-html-generator.js +70 -0
  51. package/src/tools/esbuild/javascript-transformer-worker.js +76 -0
  52. package/src/tools/esbuild/javascript-transformer.js +108 -0
  53. package/src/tools/esbuild/license-extractor.js +159 -0
  54. package/src/tools/esbuild/load-result-cache.js +69 -0
  55. package/src/tools/esbuild/profiling.js +79 -0
  56. package/src/tools/esbuild/sourcemap-ignorelist-plugin.js +74 -0
  57. package/src/tools/esbuild/stylesheets/bundle-options.js +159 -0
  58. package/src/tools/esbuild/stylesheets/css-language.js +16 -0
  59. package/src/tools/esbuild/stylesheets/css-resource-plugin.js +88 -0
  60. package/src/tools/esbuild/stylesheets/less-language.js +127 -0
  61. package/src/tools/esbuild/stylesheets/sass-language.js +169 -0
  62. package/src/tools/esbuild/stylesheets/stylesheet-plugin-factory.js +218 -0
  63. package/src/tools/esbuild/utils.d.ts +30 -0
  64. package/src/tools/esbuild/utils.js +192 -0
  65. package/src/tools/esbuild/virtual-module-plugin.d.ts +28 -0
  66. package/src/tools/esbuild/virtual-module-plugin.js +43 -0
  67. package/src/tools/esbuild/watcher.js +105 -0
  68. package/src/tools/sass/rebasing-importer.js +445 -0
  69. package/src/tools/sass/sass-service-legacy.js +176 -0
  70. package/src/tools/sass/sass-service.js +214 -0
  71. package/src/tools/sass/worker-legacy.js +44 -0
  72. package/src/tools/sass/worker.js +158 -0
  73. package/src/{webpack → tools/webpack}/configs/common.d.ts +1 -1
  74. package/src/tools/webpack/configs/common.js +421 -0
  75. package/src/{webpack → tools/webpack}/configs/dev-server.d.ts +1 -1
  76. package/src/tools/webpack/configs/dev-server.js +304 -0
  77. package/src/{webpack → tools/webpack}/configs/index.js +1 -1
  78. package/src/{webpack → tools/webpack}/configs/styles.d.ts +1 -1
  79. package/src/tools/webpack/configs/styles.js +396 -0
  80. package/src/{webpack → tools/webpack}/plugins/any-component-style-budget-checker.d.ts +1 -1
  81. package/src/tools/webpack/plugins/any-component-style-budget-checker.js +92 -0
  82. package/src/tools/webpack/plugins/builder-watch-plugin.js +99 -0
  83. package/src/tools/webpack/plugins/common-js-usage-warn-plugin.js +121 -0
  84. package/src/tools/webpack/plugins/css-optimizer-plugin.js +123 -0
  85. package/src/tools/webpack/plugins/dedupe-module-resolve-plugin.js +75 -0
  86. package/src/tools/webpack/plugins/devtools-ignore-plugin.js +57 -0
  87. package/src/tools/webpack/plugins/esbuild-executor.js +121 -0
  88. package/src/tools/webpack/plugins/hmr/hmr-accept.js +185 -0
  89. package/src/tools/webpack/plugins/hmr/hmr-loader.js +25 -0
  90. package/src/{webpack → tools/webpack}/plugins/index-html-webpack-plugin.d.ts +1 -1
  91. package/src/tools/webpack/plugins/index-html-webpack-plugin.js +85 -0
  92. package/src/{webpack → tools/webpack}/plugins/index.js +1 -1
  93. package/src/tools/webpack/plugins/javascript-optimizer-plugin.js +166 -0
  94. package/src/tools/webpack/plugins/javascript-optimizer-worker.js +140 -0
  95. package/src/tools/webpack/plugins/json-stats-plugin.js +61 -0
  96. package/src/tools/webpack/plugins/karma/karma.js +270 -0
  97. package/src/tools/webpack/plugins/named-chunks-plugin.js +59 -0
  98. package/src/tools/webpack/plugins/occurrences-plugin.js +80 -0
  99. package/src/tools/webpack/plugins/postcss-cli-resources.js +176 -0
  100. package/src/tools/webpack/plugins/progress-plugin.js +39 -0
  101. package/src/tools/webpack/plugins/remove-hash-plugin.js +31 -0
  102. package/src/tools/webpack/plugins/scripts-webpack-plugin.js +180 -0
  103. package/src/tools/webpack/plugins/service-worker-plugin.js +46 -0
  104. package/src/tools/webpack/plugins/styles-webpack-plugin.js +73 -0
  105. package/src/tools/webpack/plugins/suppress-entry-chunks-webpack-plugin.js +52 -0
  106. package/src/tools/webpack/plugins/transfer-size-plugin.js +50 -0
  107. package/src/{webpack → tools/webpack}/plugins/typescript.d.ts +1 -1
  108. package/src/tools/webpack/plugins/typescript.js +51 -0
  109. package/src/tools/webpack/plugins/watch-files-logs-plugin.js +28 -0
  110. package/src/tools/webpack/utils/async-chunks.js +46 -0
  111. package/src/{webpack → tools/webpack}/utils/helpers.d.ts +2 -2
  112. package/src/tools/webpack/utils/helpers.js +293 -0
  113. package/src/{webpack → tools/webpack}/utils/stats.d.ts +2 -2
  114. package/src/tools/webpack/utils/stats.js +443 -0
  115. package/src/utils/bundle-calculator.js +3 -3
  116. package/src/utils/index-file/augment-index-html.d.ts +5 -1
  117. package/src/utils/index-file/augment-index-html.js +29 -3
  118. package/src/utils/index-file/index-html-generator.d.ts +5 -0
  119. package/src/utils/index-file/index-html-generator.js +3 -2
  120. package/src/utils/normalize-asset-patterns.d.ts +1 -1
  121. package/src/utils/normalize-asset-patterns.js +1 -1
  122. package/src/utils/normalize-file-replacements.d.ts +1 -1
  123. package/src/utils/normalize-file-replacements.js +1 -1
  124. package/src/utils/package-chunk-sort.js +2 -2
  125. package/src/utils/webpack-browser-config.js +2 -2
  126. package/src/babel/plugins/adjust-static-class-members.js +0 -354
  127. package/src/babel/plugins/adjust-typescript-enums.js +0 -124
  128. package/src/babel/plugins/elide-angular-metadata.js +0 -68
  129. package/src/babel/plugins/pure-toplevel-functions.js +0 -91
  130. package/src/babel/presets/application.js +0 -197
  131. package/src/babel/webpack-loader.js +0 -189
  132. package/src/builders/browser-esbuild/angular/angular-compilation.js +0 -51
  133. package/src/builders/browser-esbuild/angular/angular-host.js +0 -60
  134. package/src/builders/browser-esbuild/angular/aot-compilation.js +0 -208
  135. package/src/builders/browser-esbuild/angular/compiler-plugin.js +0 -314
  136. package/src/builders/browser-esbuild/angular/diagnostics.js +0 -75
  137. package/src/builders/browser-esbuild/angular/jit-compilation.js +0 -106
  138. package/src/builders/browser-esbuild/angular/jit-plugin-callbacks.js +0 -113
  139. package/src/builders/browser-esbuild/angular/jit-resource-transformer.js +0 -185
  140. package/src/builders/browser-esbuild/angular/uri.js +0 -75
  141. package/src/builders/browser-esbuild/commonjs-checker.js +0 -141
  142. package/src/builders/browser-esbuild/esbuild.js +0 -178
  143. package/src/builders/browser-esbuild/global-scripts.js +0 -155
  144. package/src/builders/browser-esbuild/global-styles.js +0 -76
  145. package/src/builders/browser-esbuild/javascript-transformer-worker.js +0 -76
  146. package/src/builders/browser-esbuild/javascript-transformer.js +0 -108
  147. package/src/builders/browser-esbuild/license-extractor.js +0 -159
  148. package/src/builders/browser-esbuild/load-result-cache.js +0 -69
  149. package/src/builders/browser-esbuild/profiling.js +0 -79
  150. package/src/builders/browser-esbuild/sourcemap-ignorelist-plugin.js +0 -74
  151. package/src/builders/browser-esbuild/stylesheets/bundle-options.js +0 -159
  152. package/src/builders/browser-esbuild/stylesheets/css-language.js +0 -16
  153. package/src/builders/browser-esbuild/stylesheets/css-resource-plugin.js +0 -88
  154. package/src/builders/browser-esbuild/stylesheets/less-language.js +0 -127
  155. package/src/builders/browser-esbuild/stylesheets/sass-language.js +0 -169
  156. package/src/builders/browser-esbuild/stylesheets/stylesheet-plugin-factory.js +0 -218
  157. package/src/builders/browser-esbuild/watcher.js +0 -105
  158. package/src/sass/rebasing-importer.js +0 -445
  159. package/src/sass/sass-service-legacy.js +0 -176
  160. package/src/sass/sass-service.js +0 -214
  161. package/src/sass/worker-legacy.js +0 -44
  162. package/src/sass/worker.js +0 -158
  163. package/src/webpack/configs/common.js +0 -421
  164. package/src/webpack/configs/dev-server.js +0 -304
  165. package/src/webpack/configs/styles.js +0 -396
  166. package/src/webpack/plugins/any-component-style-budget-checker.js +0 -92
  167. package/src/webpack/plugins/builder-watch-plugin.js +0 -99
  168. package/src/webpack/plugins/common-js-usage-warn-plugin.js +0 -121
  169. package/src/webpack/plugins/css-optimizer-plugin.js +0 -123
  170. package/src/webpack/plugins/dedupe-module-resolve-plugin.js +0 -75
  171. package/src/webpack/plugins/devtools-ignore-plugin.js +0 -57
  172. package/src/webpack/plugins/esbuild-executor.js +0 -121
  173. package/src/webpack/plugins/hmr/hmr-accept.js +0 -185
  174. package/src/webpack/plugins/hmr/hmr-loader.js +0 -25
  175. package/src/webpack/plugins/index-html-webpack-plugin.js +0 -85
  176. package/src/webpack/plugins/javascript-optimizer-plugin.js +0 -166
  177. package/src/webpack/plugins/javascript-optimizer-worker.js +0 -140
  178. package/src/webpack/plugins/json-stats-plugin.js +0 -61
  179. package/src/webpack/plugins/karma/karma.js +0 -270
  180. package/src/webpack/plugins/named-chunks-plugin.js +0 -59
  181. package/src/webpack/plugins/occurrences-plugin.js +0 -80
  182. package/src/webpack/plugins/postcss-cli-resources.js +0 -176
  183. package/src/webpack/plugins/progress-plugin.js +0 -39
  184. package/src/webpack/plugins/remove-hash-plugin.js +0 -31
  185. package/src/webpack/plugins/scripts-webpack-plugin.js +0 -180
  186. package/src/webpack/plugins/service-worker-plugin.js +0 -46
  187. package/src/webpack/plugins/styles-webpack-plugin.js +0 -73
  188. package/src/webpack/plugins/suppress-entry-chunks-webpack-plugin.js +0 -52
  189. package/src/webpack/plugins/transfer-size-plugin.js +0 -50
  190. package/src/webpack/plugins/typescript.js +0 -51
  191. package/src/webpack/plugins/watch-files-logs-plugin.js +0 -28
  192. package/src/webpack/utils/async-chunks.js +0 -46
  193. package/src/webpack/utils/helpers.js +0 -293
  194. package/src/webpack/utils/stats.js +0 -443
  195. /package/src/{babel → tools/babel}/babel-loader.d.ts +0 -0
  196. /package/src/{babel → tools/babel}/plugins/adjust-static-class-members.d.ts +0 -0
  197. /package/src/{babel → tools/babel}/plugins/adjust-typescript-enums.d.ts +0 -0
  198. /package/src/{babel → tools/babel}/plugins/elide-angular-metadata.d.ts +0 -0
  199. /package/src/{babel → tools/babel}/plugins/pure-toplevel-functions.d.ts +0 -0
  200. /package/src/{babel → tools/babel}/presets/application.d.ts +0 -0
  201. /package/src/{builders/browser-esbuild → tools/esbuild}/angular/angular-compilation.d.ts +0 -0
  202. /package/src/{builders/browser-esbuild → tools/esbuild}/angular/angular-host.d.ts +0 -0
  203. /package/src/{builders/browser-esbuild → tools/esbuild}/angular/aot-compilation.d.ts +0 -0
  204. /package/src/{builders/browser-esbuild → tools/esbuild}/angular/compiler-plugin.d.ts +0 -0
  205. /package/src/{builders/browser-esbuild → tools/esbuild}/angular/diagnostics.d.ts +0 -0
  206. /package/src/{builders/browser-esbuild → tools/esbuild}/angular/jit-compilation.d.ts +0 -0
  207. /package/src/{builders/browser-esbuild → tools/esbuild}/angular/jit-plugin-callbacks.d.ts +0 -0
  208. /package/src/{builders/browser-esbuild → tools/esbuild}/angular/jit-resource-transformer.d.ts +0 -0
  209. /package/src/{builders/browser-esbuild → tools/esbuild}/angular/uri.d.ts +0 -0
  210. /package/src/{builders/browser-esbuild → tools/esbuild}/commonjs-checker.d.ts +0 -0
  211. /package/src/{builders/browser-esbuild → tools/esbuild}/javascript-transformer-worker.d.ts +0 -0
  212. /package/src/{builders/browser-esbuild → tools/esbuild}/javascript-transformer.d.ts +0 -0
  213. /package/src/{builders/browser-esbuild → tools/esbuild}/license-extractor.d.ts +0 -0
  214. /package/src/{builders/browser-esbuild → tools/esbuild}/load-result-cache.d.ts +0 -0
  215. /package/src/{builders/browser-esbuild → tools/esbuild}/profiling.d.ts +0 -0
  216. /package/src/{builders/browser-esbuild → tools/esbuild}/sourcemap-ignorelist-plugin.d.ts +0 -0
  217. /package/src/{builders/browser-esbuild → tools/esbuild}/stylesheets/bundle-options.d.ts +0 -0
  218. /package/src/{builders/browser-esbuild → tools/esbuild}/stylesheets/css-language.d.ts +0 -0
  219. /package/src/{builders/browser-esbuild → tools/esbuild}/stylesheets/css-resource-plugin.d.ts +0 -0
  220. /package/src/{builders/browser-esbuild → tools/esbuild}/stylesheets/less-language.d.ts +0 -0
  221. /package/src/{builders/browser-esbuild → tools/esbuild}/stylesheets/sass-language.d.ts +0 -0
  222. /package/src/{builders/browser-esbuild → tools/esbuild}/stylesheets/stylesheet-plugin-factory.d.ts +0 -0
  223. /package/src/{builders/browser-esbuild → tools/esbuild}/watcher.d.ts +0 -0
  224. /package/src/{sass → tools/sass}/rebasing-importer.d.ts +0 -0
  225. /package/src/{sass → tools/sass}/sass-service-legacy.d.ts +0 -0
  226. /package/src/{sass → tools/sass}/sass-service.d.ts +0 -0
  227. /package/src/{sass → tools/sass}/worker-legacy.d.ts +0 -0
  228. /package/src/{sass → tools/sass}/worker.d.ts +0 -0
  229. /package/src/{webpack → tools/webpack}/configs/index.d.ts +0 -0
  230. /package/src/{webpack → tools/webpack}/plugins/builder-watch-plugin.d.ts +0 -0
  231. /package/src/{webpack → tools/webpack}/plugins/common-js-usage-warn-plugin.d.ts +0 -0
  232. /package/src/{webpack → tools/webpack}/plugins/css-optimizer-plugin.d.ts +0 -0
  233. /package/src/{webpack → tools/webpack}/plugins/dedupe-module-resolve-plugin.d.ts +0 -0
  234. /package/src/{webpack → tools/webpack}/plugins/devtools-ignore-plugin.d.ts +0 -0
  235. /package/src/{webpack → tools/webpack}/plugins/esbuild-executor.d.ts +0 -0
  236. /package/src/{webpack → tools/webpack}/plugins/hmr/hmr-accept.d.ts +0 -0
  237. /package/src/{webpack → tools/webpack}/plugins/hmr/hmr-loader.d.ts +0 -0
  238. /package/src/{webpack → tools/webpack}/plugins/index.d.ts +0 -0
  239. /package/src/{webpack → tools/webpack}/plugins/javascript-optimizer-plugin.d.ts +0 -0
  240. /package/src/{webpack → tools/webpack}/plugins/javascript-optimizer-worker.d.ts +0 -0
  241. /package/src/{webpack → tools/webpack}/plugins/json-stats-plugin.d.ts +0 -0
  242. /package/src/{webpack → tools/webpack}/plugins/karma/karma-context.html +0 -0
  243. /package/src/{webpack → tools/webpack}/plugins/karma/karma-debug.html +0 -0
  244. /package/src/{webpack → tools/webpack}/plugins/karma/karma.d.ts +0 -0
  245. /package/src/{webpack → tools/webpack}/plugins/named-chunks-plugin.d.ts +0 -0
  246. /package/src/{webpack → tools/webpack}/plugins/occurrences-plugin.d.ts +0 -0
  247. /package/src/{webpack → tools/webpack}/plugins/postcss-cli-resources.d.ts +0 -0
  248. /package/src/{webpack → tools/webpack}/plugins/progress-plugin.d.ts +0 -0
  249. /package/src/{webpack → tools/webpack}/plugins/remove-hash-plugin.d.ts +0 -0
  250. /package/src/{webpack → tools/webpack}/plugins/scripts-webpack-plugin.d.ts +0 -0
  251. /package/src/{webpack → tools/webpack}/plugins/service-worker-plugin.d.ts +0 -0
  252. /package/src/{webpack → tools/webpack}/plugins/styles-webpack-plugin.d.ts +0 -0
  253. /package/src/{webpack → tools/webpack}/plugins/suppress-entry-chunks-webpack-plugin.d.ts +0 -0
  254. /package/src/{webpack → tools/webpack}/plugins/transfer-size-plugin.d.ts +0 -0
  255. /package/src/{webpack → tools/webpack}/plugins/watch-files-logs-plugin.d.ts +0 -0
  256. /package/src/{webpack → tools/webpack}/utils/async-chunks.d.ts +0 -0
@@ -0,0 +1,218 @@
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.StylesheetPluginFactory = void 0;
37
+ const autoprefixer_1 = __importDefault(require("autoprefixer"));
38
+ const node_assert_1 = __importDefault(require("node:assert"));
39
+ const promises_1 = require("node:fs/promises");
40
+ const node_path_1 = require("node:path");
41
+ const load_result_cache_1 = require("../load-result-cache");
42
+ /**
43
+ * The lazy-loaded instance of the postcss stylesheet postprocessor.
44
+ * It is only imported and initialized if postcss is needed.
45
+ */
46
+ let postcss;
47
+ class StylesheetPluginFactory {
48
+ constructor(options, cache) {
49
+ this.options = options;
50
+ this.cache = cache;
51
+ const autoprefixer = (0, autoprefixer_1.default)({
52
+ overrideBrowserslist: options.browsers,
53
+ ignoreUnknownVersions: true,
54
+ });
55
+ // Autoprefixer currently does not contain a method to check if autoprefixer is required
56
+ // based on the provided list of browsers. However, it does contain a method that returns
57
+ // informational text that can be used as a replacement. The text "Awesome!" will be present
58
+ // when autoprefixer determines no actions are needed.
59
+ // ref: https://github.com/postcss/autoprefixer/blob/e2f5c26ff1f3eaca95a21873723ce1cdf6e59f0e/lib/info.js#L118
60
+ const autoprefixerInfo = autoprefixer.info();
61
+ const skipAutoprefixer = autoprefixerInfo.includes('Awesome!');
62
+ if (!skipAutoprefixer) {
63
+ this.autoprefixer = autoprefixer;
64
+ }
65
+ }
66
+ create(language) {
67
+ // Return a noop plugin if no load actions are required
68
+ if (!language.process && !this.autoprefixer && !this.options.tailwindConfiguration) {
69
+ return {
70
+ name: 'angular-' + language.name,
71
+ setup() { },
72
+ };
73
+ }
74
+ const { autoprefixer, cache, options } = this;
75
+ return {
76
+ name: 'angular-' + language.name,
77
+ async setup(build) {
78
+ // Setup postcss if needed by either autoprefixer or tailwind
79
+ // TODO: Move this into the plugin factory to avoid repeat setup per created plugin
80
+ let postcssProcessor;
81
+ if (autoprefixer || options.tailwindConfiguration) {
82
+ postcss ?? (postcss = (await Promise.resolve().then(() => __importStar(require('postcss')))).default);
83
+ postcssProcessor = postcss();
84
+ if (options.tailwindConfiguration) {
85
+ const tailwind = await Promise.resolve(`${options.tailwindConfiguration.package}`).then(s => __importStar(require(s)));
86
+ postcssProcessor.use(tailwind.default({ config: options.tailwindConfiguration.file }));
87
+ }
88
+ if (autoprefixer) {
89
+ postcssProcessor.use(autoprefixer);
90
+ }
91
+ }
92
+ // Add a load callback to support inline Component styles
93
+ build.onLoad({ filter: language.componentFilter, namespace: 'angular:styles/component' }, (0, load_result_cache_1.createCachedLoad)(cache, async (args) => {
94
+ const data = options.inlineComponentData?.[args.path];
95
+ (0, node_assert_1.default)(typeof data === 'string', `component style name should always be found [${args.path}]`);
96
+ const [format, , filename] = args.path.split(';', 3);
97
+ return processStylesheet(language, data, filename, format, options, build, postcssProcessor);
98
+ }));
99
+ // Add a load callback to support files from disk
100
+ build.onLoad({ filter: language.fileFilter }, (0, load_result_cache_1.createCachedLoad)(cache, async (args) => {
101
+ const data = await (0, promises_1.readFile)(args.path, 'utf-8');
102
+ return processStylesheet(language, data, args.path, (0, node_path_1.extname)(args.path).toLowerCase().slice(1), options, build, postcssProcessor);
103
+ }));
104
+ },
105
+ };
106
+ }
107
+ }
108
+ exports.StylesheetPluginFactory = StylesheetPluginFactory;
109
+ async function processStylesheet(language, data, filename, format, options, build, postcssProcessor) {
110
+ let result;
111
+ // Process the input data if the language requires preprocessing
112
+ if (language.process) {
113
+ result = await language.process(data, filename, format, options, build);
114
+ }
115
+ else {
116
+ result = {
117
+ contents: data,
118
+ loader: 'css',
119
+ watchFiles: [filename],
120
+ };
121
+ }
122
+ // Transform with postcss if needed and there are no errors
123
+ if (postcssProcessor && result.contents && !result.errors?.length) {
124
+ const postcssResult = await compileString(typeof result.contents === 'string'
125
+ ? result.contents
126
+ : Buffer.from(result.contents).toString('utf-8'), filename, postcssProcessor, options);
127
+ // Merge results
128
+ if (postcssResult.errors?.length) {
129
+ delete result.contents;
130
+ }
131
+ if (result.warnings && postcssResult.warnings) {
132
+ postcssResult.warnings.unshift(...result.warnings);
133
+ }
134
+ if (result.watchFiles && postcssResult.watchFiles) {
135
+ postcssResult.watchFiles.unshift(...result.watchFiles);
136
+ }
137
+ if (result.watchDirs && postcssResult.watchDirs) {
138
+ postcssResult.watchDirs.unshift(...result.watchDirs);
139
+ }
140
+ result = {
141
+ ...result,
142
+ ...postcssResult,
143
+ };
144
+ }
145
+ return result;
146
+ }
147
+ /**
148
+ * Compiles the provided CSS stylesheet data using a provided postcss processor and provides an
149
+ * esbuild load result that can be used directly by an esbuild Plugin.
150
+ * @param data The stylesheet content to process.
151
+ * @param filename The name of the file that contains the data.
152
+ * @param postcssProcessor A postcss processor instance to use.
153
+ * @param options The plugin options to control the processing.
154
+ * @returns An esbuild OnLoaderResult object with the processed content, warnings, and/or errors.
155
+ */
156
+ async function compileString(data, filename, postcssProcessor, options) {
157
+ try {
158
+ const result = await postcssProcessor.process(data, {
159
+ from: filename,
160
+ to: filename,
161
+ map: options.sourcemap && {
162
+ inline: true,
163
+ sourcesContent: true,
164
+ },
165
+ });
166
+ const rawWarnings = result.warnings();
167
+ let warnings;
168
+ if (rawWarnings.length > 0) {
169
+ const lineMappings = new Map();
170
+ warnings = rawWarnings.map((warning) => {
171
+ const file = warning.node.source?.input.file;
172
+ if (file === undefined) {
173
+ return { text: warning.text };
174
+ }
175
+ let lines = lineMappings.get(file);
176
+ if (lines === undefined) {
177
+ lines = warning.node.source?.input.css.split(/\r?\n/);
178
+ lineMappings.set(file, lines ?? null);
179
+ }
180
+ return {
181
+ text: warning.text,
182
+ location: {
183
+ file,
184
+ line: warning.line,
185
+ column: warning.column - 1,
186
+ lineText: lines?.[warning.line - 1],
187
+ },
188
+ };
189
+ });
190
+ }
191
+ return {
192
+ contents: result.css,
193
+ loader: 'css',
194
+ warnings,
195
+ };
196
+ }
197
+ catch (error) {
198
+ postcss ?? (postcss = (await Promise.resolve().then(() => __importStar(require('postcss')))).default);
199
+ if (error instanceof postcss.CssSyntaxError) {
200
+ const lines = error.source?.split(/\r?\n/);
201
+ return {
202
+ errors: [
203
+ {
204
+ text: error.reason,
205
+ location: {
206
+ file: error.file,
207
+ line: error.line,
208
+ column: error.column && error.column - 1,
209
+ lineText: error.line === undefined ? undefined : lines?.[error.line - 1],
210
+ },
211
+ },
212
+ ],
213
+ };
214
+ }
215
+ throw error;
216
+ }
217
+ }
218
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3R5bGVzaGVldC1wbHVnaW4tZmFjdG9yeS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL3BhY2thZ2VzL2FuZ3VsYXJfZGV2a2l0L2J1aWxkX2FuZ3VsYXIvc3JjL3Rvb2xzL2VzYnVpbGQvc3R5bGVzaGVldHMvc3R5bGVzaGVldC1wbHVnaW4tZmFjdG9yeS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUE7Ozs7OztHQU1HOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUVILGdFQUFvRDtBQUVwRCw4REFBaUM7QUFDakMsK0NBQTRDO0FBQzVDLHlDQUFvQztBQUNwQyw0REFBeUU7QUFFekU7OztHQUdHO0FBQ0gsSUFBSSxPQUF3RCxDQUFDO0FBMkM3RCxNQUFhLHVCQUF1QjtJQUdsQyxZQUNtQixPQUFnQyxFQUNoQyxLQUF1QjtRQUR2QixZQUFPLEdBQVAsT0FBTyxDQUF5QjtRQUNoQyxVQUFLLEdBQUwsS0FBSyxDQUFrQjtRQUV4QyxNQUFNLFlBQVksR0FBRyxJQUFBLHNCQUF3QixFQUFDO1lBQzVDLG9CQUFvQixFQUFFLE9BQU8sQ0FBQyxRQUFRO1lBQ3RDLHFCQUFxQixFQUFFLElBQUk7U0FDNUIsQ0FBQyxDQUFDO1FBRUgsd0ZBQXdGO1FBQ3hGLHlGQUF5RjtRQUN6Riw0RkFBNEY7UUFDNUYsc0RBQXNEO1FBQ3RELDhHQUE4RztRQUM5RyxNQUFNLGdCQUFnQixHQUFHLFlBQVksQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUM3QyxNQUFNLGdCQUFnQixHQUFHLGdCQUFnQixDQUFDLFFBQVEsQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUUvRCxJQUFJLENBQUMsZ0JBQWdCLEVBQUU7WUFDckIsSUFBSSxDQUFDLFlBQVksR0FBRyxZQUFZLENBQUM7U0FDbEM7SUFDSCxDQUFDO0lBRUQsTUFBTSxDQUFDLFFBQXNDO1FBQzNDLHVEQUF1RDtRQUN2RCxJQUFJLENBQUMsUUFBUSxDQUFDLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxZQUFZLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLHFCQUFxQixFQUFFO1lBQ2xGLE9BQU87Z0JBQ0wsSUFBSSxFQUFFLFVBQVUsR0FBRyxRQUFRLENBQUMsSUFBSTtnQkFDaEMsS0FBSyxLQUFJLENBQUM7YUFDWCxDQUFDO1NBQ0g7UUFFRCxNQUFNLEVBQUUsWUFBWSxFQUFFLEtBQUssRUFBRSxPQUFPLEVBQUUsR0FBRyxJQUFJLENBQUM7UUFFOUMsT0FBTztZQUNMLElBQUksRUFBRSxVQUFVLEdBQUcsUUFBUSxDQUFDLElBQUk7WUFDaEMsS0FBSyxDQUFDLEtBQUssQ0FBQyxLQUFLO2dCQUNmLDZEQUE2RDtnQkFDN0QsbUZBQW1GO2dCQUNuRixJQUFJLGdCQUF5RCxDQUFDO2dCQUM5RCxJQUFJLFlBQVksSUFBSSxPQUFPLENBQUMscUJBQXFCLEVBQUU7b0JBQ2pELE9BQU8sS0FBUCxPQUFPLEdBQUssQ0FBQyx3REFBYSxTQUFTLEdBQUMsQ0FBQyxDQUFDLE9BQU8sRUFBQztvQkFDOUMsZ0JBQWdCLEdBQUcsT0FBTyxFQUFFLENBQUM7b0JBQzdCLElBQUksT0FBTyxDQUFDLHFCQUFxQixFQUFFO3dCQUNqQyxNQUFNLFFBQVEsR0FBRyx5QkFBYSxPQUFPLENBQUMscUJBQXFCLENBQUMsT0FBTyx1Q0FBQyxDQUFDO3dCQUNyRSxnQkFBZ0IsQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxFQUFFLE1BQU0sRUFBRSxPQUFPLENBQUMscUJBQXFCLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDO3FCQUN4RjtvQkFDRCxJQUFJLFlBQVksRUFBRTt3QkFDaEIsZ0JBQWdCLENBQUMsR0FBRyxDQUFDLFlBQVksQ0FBQyxDQUFDO3FCQUNwQztpQkFDRjtnQkFFRCx5REFBeUQ7Z0JBQ3pELEtBQUssQ0FBQyxNQUFNLENBQ1YsRUFBRSxNQUFNLEVBQUUsUUFBUSxDQUFDLGVBQWUsRUFBRSxTQUFTLEVBQUUsMEJBQTBCLEVBQUUsRUFDM0UsSUFBQSxvQ0FBZ0IsRUFBQyxLQUFLLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxFQUFFO29CQUNyQyxNQUFNLElBQUksR0FBRyxPQUFPLENBQUMsbUJBQW1CLEVBQUUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7b0JBQ3RELElBQUEscUJBQU0sRUFDSixPQUFPLElBQUksS0FBSyxRQUFRLEVBQ3hCLGdEQUFnRCxJQUFJLENBQUMsSUFBSSxHQUFHLENBQzdELENBQUM7b0JBRUYsTUFBTSxDQUFDLE1BQU0sRUFBRSxBQUFELEVBQUcsUUFBUSxDQUFDLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDO29CQUVyRCxPQUFPLGlCQUFpQixDQUN0QixRQUFRLEVBQ1IsSUFBSSxFQUNKLFFBQVEsRUFDUixNQUFNLEVBQ04sT0FBTyxFQUNQLEtBQUssRUFDTCxnQkFBZ0IsQ0FDakIsQ0FBQztnQkFDSixDQUFDLENBQUMsQ0FDSCxDQUFDO2dCQUVGLGlEQUFpRDtnQkFDakQsS0FBSyxDQUFDLE1BQU0sQ0FDVixFQUFFLE1BQU0sRUFBRSxRQUFRLENBQUMsVUFBVSxFQUFFLEVBQy9CLElBQUEsb0NBQWdCLEVBQUMsS0FBSyxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsRUFBRTtvQkFDckMsTUFBTSxJQUFJLEdBQUcsTUFBTSxJQUFBLG1CQUFRLEVBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxPQUFPLENBQUMsQ0FBQztvQkFFaEQsT0FBTyxpQkFBaUIsQ0FDdEIsUUFBUSxFQUNSLElBQUksRUFDSixJQUFJLENBQUMsSUFBSSxFQUNULElBQUEsbUJBQU8sRUFBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsV0FBVyxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUN6QyxPQUFPLEVBQ1AsS0FBSyxFQUNMLGdCQUFnQixDQUNqQixDQUFDO2dCQUNKLENBQUMsQ0FBQyxDQUNILENBQUM7WUFDSixDQUFDO1NBQ0YsQ0FBQztJQUNKLENBQUM7Q0FDRjtBQWxHRCwwREFrR0M7QUFFRCxLQUFLLFVBQVUsaUJBQWlCLENBQzlCLFFBQXNDLEVBQ3RDLElBQVksRUFDWixRQUFnQixFQUNoQixNQUFjLEVBQ2QsT0FBZ0MsRUFDaEMsS0FBa0IsRUFDbEIsZ0JBQXlEO0lBRXpELElBQUksTUFBb0IsQ0FBQztJQUV6QixnRUFBZ0U7SUFDaEUsSUFBSSxRQUFRLENBQUMsT0FBTyxFQUFFO1FBQ3BCLE1BQU0sR0FBRyxNQUFNLFFBQVEsQ0FBQyxPQUFPLENBQUMsSUFBSSxFQUFFLFFBQVEsRUFBRSxNQUFNLEVBQUUsT0FBTyxFQUFFLEtBQUssQ0FBQyxDQUFDO0tBQ3pFO1NBQU07UUFDTCxNQUFNLEdBQUc7WUFDUCxRQUFRLEVBQUUsSUFBSTtZQUNkLE1BQU0sRUFBRSxLQUFLO1lBQ2IsVUFBVSxFQUFFLENBQUMsUUFBUSxDQUFDO1NBQ3ZCLENBQUM7S0FDSDtJQUVELDJEQUEyRDtJQUMzRCxJQUFJLGdCQUFnQixJQUFJLE1BQU0sQ0FBQyxRQUFRLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxFQUFFLE1BQU0sRUFBRTtRQUNqRSxNQUFNLGFBQWEsR0FBRyxNQUFNLGFBQWEsQ0FDdkMsT0FBTyxNQUFNLENBQUMsUUFBUSxLQUFLLFFBQVE7WUFDakMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxRQUFRO1lBQ2pCLENBQUMsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLEVBQ2xELFFBQVEsRUFDUixnQkFBZ0IsRUFDaEIsT0FBTyxDQUNSLENBQUM7UUFFRixnQkFBZ0I7UUFDaEIsSUFBSSxhQUFhLENBQUMsTUFBTSxFQUFFLE1BQU0sRUFBRTtZQUNoQyxPQUFPLE1BQU0sQ0FBQyxRQUFRLENBQUM7U0FDeEI7UUFDRCxJQUFJLE1BQU0sQ0FBQyxRQUFRLElBQUksYUFBYSxDQUFDLFFBQVEsRUFBRTtZQUM3QyxhQUFhLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxHQUFHLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQztTQUNwRDtRQUNELElBQUksTUFBTSxDQUFDLFVBQVUsSUFBSSxhQUFhLENBQUMsVUFBVSxFQUFFO1lBQ2pELGFBQWEsQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLEdBQUcsTUFBTSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1NBQ3hEO1FBQ0QsSUFBSSxNQUFNLENBQUMsU0FBUyxJQUFJLGFBQWEsQ0FBQyxTQUFTLEVBQUU7WUFDL0MsYUFBYSxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsR0FBRyxNQUFNLENBQUMsU0FBUyxDQUFDLENBQUM7U0FDdEQ7UUFDRCxNQUFNLEdBQUc7WUFDUCxHQUFHLE1BQU07WUFDVCxHQUFHLGFBQWE7U0FDakIsQ0FBQztLQUNIO0lBRUQsT0FBTyxNQUFNLENBQUM7QUFDaEIsQ0FBQztBQUVEOzs7Ozs7OztHQVFHO0FBQ0gsS0FBSyxVQUFVLGFBQWEsQ0FDMUIsSUFBWSxFQUNaLFFBQWdCLEVBQ2hCLGdCQUE2QyxFQUM3QyxPQUFnQztJQUVoQyxJQUFJO1FBQ0YsTUFBTSxNQUFNLEdBQUcsTUFBTSxnQkFBZ0IsQ0FBQyxPQUFPLENBQUMsSUFBSSxFQUFFO1lBQ2xELElBQUksRUFBRSxRQUFRO1lBQ2QsRUFBRSxFQUFFLFFBQVE7WUFDWixHQUFHLEVBQUUsT0FBTyxDQUFDLFNBQVMsSUFBSTtnQkFDeEIsTUFBTSxFQUFFLElBQUk7Z0JBQ1osY0FBYyxFQUFFLElBQUk7YUFDckI7U0FDRixDQUFDLENBQUM7UUFFSCxNQUFNLFdBQVcsR0FBRyxNQUFNLENBQUMsUUFBUSxFQUFFLENBQUM7UUFDdEMsSUFBSSxRQUFRLENBQUM7UUFDYixJQUFJLFdBQVcsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFO1lBQzFCLE1BQU0sWUFBWSxHQUFHLElBQUksR0FBRyxFQUEyQixDQUFDO1lBQ3hELFFBQVEsR0FBRyxXQUFXLENBQUMsR0FBRyxDQUFDLENBQUMsT0FBTyxFQUFFLEVBQUU7Z0JBQ3JDLE1BQU0sSUFBSSxHQUFHLE9BQU8sQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLEtBQUssQ0FBQyxJQUFJLENBQUM7Z0JBQzdDLElBQUksSUFBSSxLQUFLLFNBQVMsRUFBRTtvQkFDdEIsT0FBTyxFQUFFLElBQUksRUFBRSxPQUFPLENBQUMsSUFBSSxFQUFFLENBQUM7aUJBQy9CO2dCQUVELElBQUksS0FBSyxHQUFHLFlBQVksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUM7Z0JBQ25DLElBQUksS0FBSyxLQUFLLFNBQVMsRUFBRTtvQkFDdkIsS0FBSyxHQUFHLE9BQU8sQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLEtBQUssQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDO29CQUN0RCxZQUFZLENBQUMsR0FBRyxDQUFDLElBQUksRUFBRSxLQUFLLElBQUksSUFBSSxDQUFDLENBQUM7aUJBQ3ZDO2dCQUVELE9BQU87b0JBQ0wsSUFBSSxFQUFFLE9BQU8sQ0FBQyxJQUFJO29CQUNsQixRQUFRLEVBQUU7d0JBQ1IsSUFBSTt3QkFDSixJQUFJLEVBQUUsT0FBTyxDQUFDLElBQUk7d0JBQ2xCLE1BQU0sRUFBRSxPQUFPLENBQUMsTUFBTSxHQUFHLENBQUM7d0JBQzFCLFFBQVEsRUFBRSxLQUFLLEVBQUUsQ0FBQyxPQUFPLENBQUMsSUFBSSxHQUFHLENBQUMsQ0FBQztxQkFDcEM7aUJBQ0YsQ0FBQztZQUNKLENBQUMsQ0FBQyxDQUFDO1NBQ0o7UUFFRCxPQUFPO1lBQ0wsUUFBUSxFQUFFLE1BQU0sQ0FBQyxHQUFHO1lBQ3BCLE1BQU0sRUFBRSxLQUFLO1lBQ2IsUUFBUTtTQUNULENBQUM7S0FDSDtJQUFDLE9BQU8sS0FBSyxFQUFFO1FBQ2QsT0FBTyxLQUFQLE9BQU8sR0FBSyxDQUFDLHdEQUFhLFNBQVMsR0FBQyxDQUFDLENBQUMsT0FBTyxFQUFDO1FBQzlDLElBQUksS0FBSyxZQUFZLE9BQU8sQ0FBQyxjQUFjLEVBQUU7WUFDM0MsTUFBTSxLQUFLLEdBQUcsS0FBSyxDQUFDLE1BQU0sRUFBRSxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUM7WUFFM0MsT0FBTztnQkFDTCxNQUFNLEVBQUU7b0JBQ047d0JBQ0UsSUFBSSxFQUFFLEtBQUssQ0FBQyxNQUFNO3dCQUNsQixRQUFRLEVBQUU7NEJBQ1IsSUFBSSxFQUFFLEtBQUssQ0FBQyxJQUFJOzRCQUNoQixJQUFJLEVBQUUsS0FBSyxDQUFDLElBQUk7NEJBQ2hCLE1BQU0sRUFBRSxLQUFLLENBQUMsTUFBTSxJQUFJLEtBQUssQ0FBQyxNQUFNLEdBQUcsQ0FBQzs0QkFDeEMsUUFBUSxFQUFFLEtBQUssQ0FBQyxJQUFJLEtBQUssU0FBUyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLEtBQUssRUFBRSxDQUFDLEtBQUssQ0FBQyxJQUFJLEdBQUcsQ0FBQyxDQUFDO3lCQUN6RTtxQkFDRjtpQkFDRjthQUNGLENBQUM7U0FDSDtRQUVELE1BQU0sS0FBSyxDQUFDO0tBQ2I7QUFDSCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IEdvb2dsZSBMTEMgQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqXG4gKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZVxuICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZVxuICovXG5cbmltcG9ydCBjcmVhdGVBdXRvUHJlZml4ZXJQbHVnaW4gZnJvbSAnYXV0b3ByZWZpeGVyJztcbmltcG9ydCB0eXBlIHsgT25Mb2FkUmVzdWx0LCBQbHVnaW4sIFBsdWdpbkJ1aWxkIH0gZnJvbSAnZXNidWlsZCc7XG5pbXBvcnQgYXNzZXJ0IGZyb20gJ25vZGU6YXNzZXJ0JztcbmltcG9ydCB7IHJlYWRGaWxlIH0gZnJvbSAnbm9kZTpmcy9wcm9taXNlcyc7XG5pbXBvcnQgeyBleHRuYW1lIH0gZnJvbSAnbm9kZTpwYXRoJztcbmltcG9ydCB7IExvYWRSZXN1bHRDYWNoZSwgY3JlYXRlQ2FjaGVkTG9hZCB9IGZyb20gJy4uL2xvYWQtcmVzdWx0LWNhY2hlJztcblxuLyoqXG4gKiBUaGUgbGF6eS1sb2FkZWQgaW5zdGFuY2Ugb2YgdGhlIHBvc3Rjc3Mgc3R5bGVzaGVldCBwb3N0cHJvY2Vzc29yLlxuICogSXQgaXMgb25seSBpbXBvcnRlZCBhbmQgaW5pdGlhbGl6ZWQgaWYgcG9zdGNzcyBpcyBuZWVkZWQuXG4gKi9cbmxldCBwb3N0Y3NzOiB0eXBlb2YgaW1wb3J0KCdwb3N0Y3NzJylbJ2RlZmF1bHQnXSB8IHVuZGVmaW5lZDtcblxuLyoqXG4gKiBBbiBvYmplY3QgY29udGFpbmluZyB0aGUgcGx1Z2luIG9wdGlvbnMgdG8gdXNlIHdoZW4gcHJvY2Vzc2luZyBzdHlsZXNoZWV0cy5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTdHlsZXNoZWV0UGx1Z2luT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBDb250cm9scyB0aGUgdXNlIGFuZCBjcmVhdGlvbiBvZiBzb3VyY2VtYXBzIHdoZW4gcHJvY2Vzc2luZyB0aGUgc3R5bGVzaGVldHMuXG4gICAqIElmIHRydWUsIHNvdXJjZW1hcCBwcm9jZXNzaW5nIGlzIGVuYWJsZWQ7IGlmIGZhbHNlLCBkaXNhYmxlZC5cbiAgICovXG4gIHNvdXJjZW1hcDogYm9vbGVhbjtcblxuICBpbmNsdWRlUGF0aHM/OiBzdHJpbmdbXTtcblxuICAvKipcbiAgICogT3B0aW9uYWwgY29tcG9uZW50IGRhdGEgZm9yIGFueSBpbmxpbmUgc3R5bGVzIGZyb20gQ29tcG9uZW50IGRlY29yYXRvciBgc3R5bGVzYCBmaWVsZHMuXG4gICAqIFRoZSBrZXkgaXMgYW4gaW50ZXJuYWwgYW5ndWxhciByZXNvdXJjZSBVUkkgYW5kIHRoZSB2YWx1ZSBpcyB0aGUgc3R5bGVzaGVldCBjb250ZW50LlxuICAgKi9cbiAgaW5saW5lQ29tcG9uZW50RGF0YT86IFJlY29yZDxzdHJpbmcsIHN0cmluZz47XG5cbiAgLyoqXG4gICAqIFRoZSBicm93c2VycyB0byBzdXBwb3J0IGluIGJyb3dzZXJzbGlzdCBmb3JtYXQgd2hlbiBwcm9jZXNzaW5nIHN0eWxlc2hlZXRzLlxuICAgKiBTb21lIHBvc3Rjc3MgcGx1Z2lucyBzdWNoIGFzIGF1dG9wcmVmaXhlciByZXF1aXJlIHRoZSByYXcgYnJvd3NlcnNsaXN0IGluZm9ybWF0aW9uIGluc3RlYWRcbiAgICogb2YgdGhlIGVzYnVpbGQgZm9ybWF0dGVkIHRhcmdldC5cbiAgICovXG4gIGJyb3dzZXJzOiBzdHJpbmdbXTtcblxuICB0YWlsd2luZENvbmZpZ3VyYXRpb24/OiB7IGZpbGU6IHN0cmluZzsgcGFja2FnZTogc3RyaW5nIH07XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgU3R5bGVzaGVldExhbmd1YWdlIHtcbiAgbmFtZTogc3RyaW5nO1xuICBjb21wb25lbnRGaWx0ZXI6IFJlZ0V4cDtcbiAgZmlsZUZpbHRlcjogUmVnRXhwO1xuICBwcm9jZXNzPyhcbiAgICBkYXRhOiBzdHJpbmcsXG4gICAgZmlsZTogc3RyaW5nLFxuICAgIGZvcm1hdDogc3RyaW5nLFxuICAgIG9wdGlvbnM6IFN0eWxlc2hlZXRQbHVnaW5PcHRpb25zLFxuICAgIGJ1aWxkOiBQbHVnaW5CdWlsZCxcbiAgKTogT25Mb2FkUmVzdWx0IHwgUHJvbWlzZTxPbkxvYWRSZXN1bHQ+O1xufVxuXG5leHBvcnQgY2xhc3MgU3R5bGVzaGVldFBsdWdpbkZhY3Rvcnkge1xuICBwcml2YXRlIGF1dG9wcmVmaXhlcjogaW1wb3J0KCdwb3N0Y3NzJykuUGx1Z2luIHwgdW5kZWZpbmVkO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgcmVhZG9ubHkgb3B0aW9uczogU3R5bGVzaGVldFBsdWdpbk9wdGlvbnMsXG4gICAgcHJpdmF0ZSByZWFkb25seSBjYWNoZT86IExvYWRSZXN1bHRDYWNoZSxcbiAgKSB7XG4gICAgY29uc3QgYXV0b3ByZWZpeGVyID0gY3JlYXRlQXV0b1ByZWZpeGVyUGx1Z2luKHtcbiAgICAgIG92ZXJyaWRlQnJvd3NlcnNsaXN0OiBvcHRpb25zLmJyb3dzZXJzLFxuICAgICAgaWdub3JlVW5rbm93blZlcnNpb25zOiB0cnVlLFxuICAgIH0pO1xuXG4gICAgLy8gQXV0b3ByZWZpeGVyIGN1cnJlbnRseSBkb2VzIG5vdCBjb250YWluIGEgbWV0aG9kIHRvIGNoZWNrIGlmIGF1dG9wcmVmaXhlciBpcyByZXF1aXJlZFxuICAgIC8vIGJhc2VkIG9uIHRoZSBwcm92aWRlZCBsaXN0IG9mIGJyb3dzZXJzLiBIb3dldmVyLCBpdCBkb2VzIGNvbnRhaW4gYSBtZXRob2QgdGhhdCByZXR1cm5zXG4gICAgLy8gaW5mb3JtYXRpb25hbCB0ZXh0IHRoYXQgY2FuIGJlIHVzZWQgYXMgYSByZXBsYWNlbWVudC4gVGhlIHRleHQgXCJBd2Vzb21lIVwiIHdpbGwgYmUgcHJlc2VudFxuICAgIC8vIHdoZW4gYXV0b3ByZWZpeGVyIGRldGVybWluZXMgbm8gYWN0aW9ucyBhcmUgbmVlZGVkLlxuICAgIC8vIHJlZjogaHR0cHM6Ly9naXRodWIuY29tL3Bvc3Rjc3MvYXV0b3ByZWZpeGVyL2Jsb2IvZTJmNWMyNmZmMWYzZWFjYTk1YTIxODczNzIzY2UxY2RmNmU1OWYwZS9saWIvaW5mby5qcyNMMTE4XG4gICAgY29uc3QgYXV0b3ByZWZpeGVySW5mbyA9IGF1dG9wcmVmaXhlci5pbmZvKCk7XG4gICAgY29uc3Qgc2tpcEF1dG9wcmVmaXhlciA9IGF1dG9wcmVmaXhlckluZm8uaW5jbHVkZXMoJ0F3ZXNvbWUhJyk7XG5cbiAgICBpZiAoIXNraXBBdXRvcHJlZml4ZXIpIHtcbiAgICAgIHRoaXMuYXV0b3ByZWZpeGVyID0gYXV0b3ByZWZpeGVyO1xuICAgIH1cbiAgfVxuXG4gIGNyZWF0ZShsYW5ndWFnZTogUmVhZG9ubHk8U3R5bGVzaGVldExhbmd1YWdlPik6IFBsdWdpbiB7XG4gICAgLy8gUmV0dXJuIGEgbm9vcCBwbHVnaW4gaWYgbm8gbG9hZCBhY3Rpb25zIGFyZSByZXF1aXJlZFxuICAgIGlmICghbGFuZ3VhZ2UucHJvY2VzcyAmJiAhdGhpcy5hdXRvcHJlZml4ZXIgJiYgIXRoaXMub3B0aW9ucy50YWlsd2luZENvbmZpZ3VyYXRpb24pIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIG5hbWU6ICdhbmd1bGFyLScgKyBsYW5ndWFnZS5uYW1lLFxuICAgICAgICBzZXR1cCgpIHt9LFxuICAgICAgfTtcbiAgICB9XG5cbiAgICBjb25zdCB7IGF1dG9wcmVmaXhlciwgY2FjaGUsIG9wdGlvbnMgfSA9IHRoaXM7XG5cbiAgICByZXR1cm4ge1xuICAgICAgbmFtZTogJ2FuZ3VsYXItJyArIGxhbmd1YWdlLm5hbWUsXG4gICAgICBhc3luYyBzZXR1cChidWlsZCkge1xuICAgICAgICAvLyBTZXR1cCBwb3N0Y3NzIGlmIG5lZWRlZCBieSBlaXRoZXIgYXV0b3ByZWZpeGVyIG9yIHRhaWx3aW5kXG4gICAgICAgIC8vIFRPRE86IE1vdmUgdGhpcyBpbnRvIHRoZSBwbHVnaW4gZmFjdG9yeSB0byBhdm9pZCByZXBlYXQgc2V0dXAgcGVyIGNyZWF0ZWQgcGx1Z2luXG4gICAgICAgIGxldCBwb3N0Y3NzUHJvY2Vzc29yOiBpbXBvcnQoJ3Bvc3Rjc3MnKS5Qcm9jZXNzb3IgfCB1bmRlZmluZWQ7XG4gICAgICAgIGlmIChhdXRvcHJlZml4ZXIgfHwgb3B0aW9ucy50YWlsd2luZENvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICBwb3N0Y3NzID8/PSAoYXdhaXQgaW1wb3J0KCdwb3N0Y3NzJykpLmRlZmF1bHQ7XG4gICAgICAgICAgcG9zdGNzc1Byb2Nlc3NvciA9IHBvc3Rjc3MoKTtcbiAgICAgICAgICBpZiAob3B0aW9ucy50YWlsd2luZENvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgIGNvbnN0IHRhaWx3aW5kID0gYXdhaXQgaW1wb3J0KG9wdGlvbnMudGFpbHdpbmRDb25maWd1cmF0aW9uLnBhY2thZ2UpO1xuICAgICAgICAgICAgcG9zdGNzc1Byb2Nlc3Nvci51c2UodGFpbHdpbmQuZGVmYXVsdCh7IGNvbmZpZzogb3B0aW9ucy50YWlsd2luZENvbmZpZ3VyYXRpb24uZmlsZSB9KSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChhdXRvcHJlZml4ZXIpIHtcbiAgICAgICAgICAgIHBvc3Rjc3NQcm9jZXNzb3IudXNlKGF1dG9wcmVmaXhlcik7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gQWRkIGEgbG9hZCBjYWxsYmFjayB0byBzdXBwb3J0IGlubGluZSBDb21wb25lbnQgc3R5bGVzXG4gICAgICAgIGJ1aWxkLm9uTG9hZChcbiAgICAgICAgICB7IGZpbHRlcjogbGFuZ3VhZ2UuY29tcG9uZW50RmlsdGVyLCBuYW1lc3BhY2U6ICdhbmd1bGFyOnN0eWxlcy9jb21wb25lbnQnIH0sXG4gICAgICAgICAgY3JlYXRlQ2FjaGVkTG9hZChjYWNoZSwgYXN5bmMgKGFyZ3MpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGRhdGEgPSBvcHRpb25zLmlubGluZUNvbXBvbmVudERhdGE/LlthcmdzLnBhdGhdO1xuICAgICAgICAgICAgYXNzZXJ0KFxuICAgICAgICAgICAgICB0eXBlb2YgZGF0YSA9PT0gJ3N0cmluZycsXG4gICAgICAgICAgICAgIGBjb21wb25lbnQgc3R5bGUgbmFtZSBzaG91bGQgYWx3YXlzIGJlIGZvdW5kIFske2FyZ3MucGF0aH1dYCxcbiAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgIGNvbnN0IFtmb3JtYXQsICwgZmlsZW5hbWVdID0gYXJncy5wYXRoLnNwbGl0KCc7JywgMyk7XG5cbiAgICAgICAgICAgIHJldHVybiBwcm9jZXNzU3R5bGVzaGVldChcbiAgICAgICAgICAgICAgbGFuZ3VhZ2UsXG4gICAgICAgICAgICAgIGRhdGEsXG4gICAgICAgICAgICAgIGZpbGVuYW1lLFxuICAgICAgICAgICAgICBmb3JtYXQsXG4gICAgICAgICAgICAgIG9wdGlvbnMsXG4gICAgICAgICAgICAgIGJ1aWxkLFxuICAgICAgICAgICAgICBwb3N0Y3NzUHJvY2Vzc29yLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9KSxcbiAgICAgICAgKTtcblxuICAgICAgICAvLyBBZGQgYSBsb2FkIGNhbGxiYWNrIHRvIHN1cHBvcnQgZmlsZXMgZnJvbSBkaXNrXG4gICAgICAgIGJ1aWxkLm9uTG9hZChcbiAgICAgICAgICB7IGZpbHRlcjogbGFuZ3VhZ2UuZmlsZUZpbHRlciB9LFxuICAgICAgICAgIGNyZWF0ZUNhY2hlZExvYWQoY2FjaGUsIGFzeW5jIChhcmdzKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBkYXRhID0gYXdhaXQgcmVhZEZpbGUoYXJncy5wYXRoLCAndXRmLTgnKTtcblxuICAgICAgICAgICAgcmV0dXJuIHByb2Nlc3NTdHlsZXNoZWV0KFxuICAgICAgICAgICAgICBsYW5ndWFnZSxcbiAgICAgICAgICAgICAgZGF0YSxcbiAgICAgICAgICAgICAgYXJncy5wYXRoLFxuICAgICAgICAgICAgICBleHRuYW1lKGFyZ3MucGF0aCkudG9Mb3dlckNhc2UoKS5zbGljZSgxKSxcbiAgICAgICAgICAgICAgb3B0aW9ucyxcbiAgICAgICAgICAgICAgYnVpbGQsXG4gICAgICAgICAgICAgIHBvc3Rjc3NQcm9jZXNzb3IsXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH0pLFxuICAgICAgICApO1xuICAgICAgfSxcbiAgICB9O1xuICB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHByb2Nlc3NTdHlsZXNoZWV0KFxuICBsYW5ndWFnZTogUmVhZG9ubHk8U3R5bGVzaGVldExhbmd1YWdlPixcbiAgZGF0YTogc3RyaW5nLFxuICBmaWxlbmFtZTogc3RyaW5nLFxuICBmb3JtYXQ6IHN0cmluZyxcbiAgb3B0aW9uczogU3R5bGVzaGVldFBsdWdpbk9wdGlvbnMsXG4gIGJ1aWxkOiBQbHVnaW5CdWlsZCxcbiAgcG9zdGNzc1Byb2Nlc3NvcjogaW1wb3J0KCdwb3N0Y3NzJykuUHJvY2Vzc29yIHwgdW5kZWZpbmVkLFxuKSB7XG4gIGxldCByZXN1bHQ6IE9uTG9hZFJlc3VsdDtcblxuICAvLyBQcm9jZXNzIHRoZSBpbnB1dCBkYXRhIGlmIHRoZSBsYW5ndWFnZSByZXF1aXJlcyBwcmVwcm9jZXNzaW5nXG4gIGlmIChsYW5ndWFnZS5wcm9jZXNzKSB7XG4gICAgcmVzdWx0ID0gYXdhaXQgbGFuZ3VhZ2UucHJvY2VzcyhkYXRhLCBmaWxlbmFtZSwgZm9ybWF0LCBvcHRpb25zLCBidWlsZCk7XG4gIH0gZWxzZSB7XG4gICAgcmVzdWx0ID0ge1xuICAgICAgY29udGVudHM6IGRhdGEsXG4gICAgICBsb2FkZXI6ICdjc3MnLFxuICAgICAgd2F0Y2hGaWxlczogW2ZpbGVuYW1lXSxcbiAgICB9O1xuICB9XG5cbiAgLy8gVHJhbnNmb3JtIHdpdGggcG9zdGNzcyBpZiBuZWVkZWQgYW5kIHRoZXJlIGFyZSBubyBlcnJvcnNcbiAgaWYgKHBvc3Rjc3NQcm9jZXNzb3IgJiYgcmVzdWx0LmNvbnRlbnRzICYmICFyZXN1bHQuZXJyb3JzPy5sZW5ndGgpIHtcbiAgICBjb25zdCBwb3N0Y3NzUmVzdWx0ID0gYXdhaXQgY29tcGlsZVN0cmluZyhcbiAgICAgIHR5cGVvZiByZXN1bHQuY29udGVudHMgPT09ICdzdHJpbmcnXG4gICAgICAgID8gcmVzdWx0LmNvbnRlbnRzXG4gICAgICAgIDogQnVmZmVyLmZyb20ocmVzdWx0LmNvbnRlbnRzKS50b1N0cmluZygndXRmLTgnKSxcbiAgICAgIGZpbGVuYW1lLFxuICAgICAgcG9zdGNzc1Byb2Nlc3NvcixcbiAgICAgIG9wdGlvbnMsXG4gICAgKTtcblxuICAgIC8vIE1lcmdlIHJlc3VsdHNcbiAgICBpZiAocG9zdGNzc1Jlc3VsdC5lcnJvcnM/Lmxlbmd0aCkge1xuICAgICAgZGVsZXRlIHJlc3VsdC5jb250ZW50cztcbiAgICB9XG4gICAgaWYgKHJlc3VsdC53YXJuaW5ncyAmJiBwb3N0Y3NzUmVzdWx0Lndhcm5pbmdzKSB7XG4gICAgICBwb3N0Y3NzUmVzdWx0Lndhcm5pbmdzLnVuc2hpZnQoLi4ucmVzdWx0Lndhcm5pbmdzKTtcbiAgICB9XG4gICAgaWYgKHJlc3VsdC53YXRjaEZpbGVzICYmIHBvc3Rjc3NSZXN1bHQud2F0Y2hGaWxlcykge1xuICAgICAgcG9zdGNzc1Jlc3VsdC53YXRjaEZpbGVzLnVuc2hpZnQoLi4ucmVzdWx0LndhdGNoRmlsZXMpO1xuICAgIH1cbiAgICBpZiAocmVzdWx0LndhdGNoRGlycyAmJiBwb3N0Y3NzUmVzdWx0LndhdGNoRGlycykge1xuICAgICAgcG9zdGNzc1Jlc3VsdC53YXRjaERpcnMudW5zaGlmdCguLi5yZXN1bHQud2F0Y2hEaXJzKTtcbiAgICB9XG4gICAgcmVzdWx0ID0ge1xuICAgICAgLi4ucmVzdWx0LFxuICAgICAgLi4ucG9zdGNzc1Jlc3VsdCxcbiAgICB9O1xuICB9XG5cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuLyoqXG4gKiBDb21waWxlcyB0aGUgcHJvdmlkZWQgQ1NTIHN0eWxlc2hlZXQgZGF0YSB1c2luZyBhIHByb3ZpZGVkIHBvc3Rjc3MgcHJvY2Vzc29yIGFuZCBwcm92aWRlcyBhblxuICogZXNidWlsZCBsb2FkIHJlc3VsdCB0aGF0IGNhbiBiZSB1c2VkIGRpcmVjdGx5IGJ5IGFuIGVzYnVpbGQgUGx1Z2luLlxuICogQHBhcmFtIGRhdGEgVGhlIHN0eWxlc2hlZXQgY29udGVudCB0byBwcm9jZXNzLlxuICogQHBhcmFtIGZpbGVuYW1lIFRoZSBuYW1lIG9mIHRoZSBmaWxlIHRoYXQgY29udGFpbnMgdGhlIGRhdGEuXG4gKiBAcGFyYW0gcG9zdGNzc1Byb2Nlc3NvciBBIHBvc3Rjc3MgcHJvY2Vzc29yIGluc3RhbmNlIHRvIHVzZS5cbiAqIEBwYXJhbSBvcHRpb25zIFRoZSBwbHVnaW4gb3B0aW9ucyB0byBjb250cm9sIHRoZSBwcm9jZXNzaW5nLlxuICogQHJldHVybnMgQW4gZXNidWlsZCBPbkxvYWRlclJlc3VsdCBvYmplY3Qgd2l0aCB0aGUgcHJvY2Vzc2VkIGNvbnRlbnQsIHdhcm5pbmdzLCBhbmQvb3IgZXJyb3JzLlxuICovXG5hc3luYyBmdW5jdGlvbiBjb21waWxlU3RyaW5nKFxuICBkYXRhOiBzdHJpbmcsXG4gIGZpbGVuYW1lOiBzdHJpbmcsXG4gIHBvc3Rjc3NQcm9jZXNzb3I6IGltcG9ydCgncG9zdGNzcycpLlByb2Nlc3NvcixcbiAgb3B0aW9uczogU3R5bGVzaGVldFBsdWdpbk9wdGlvbnMsXG4pOiBQcm9taXNlPE9uTG9hZFJlc3VsdD4ge1xuICB0cnkge1xuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHBvc3Rjc3NQcm9jZXNzb3IucHJvY2VzcyhkYXRhLCB7XG4gICAgICBmcm9tOiBmaWxlbmFtZSxcbiAgICAgIHRvOiBmaWxlbmFtZSxcbiAgICAgIG1hcDogb3B0aW9ucy5zb3VyY2VtYXAgJiYge1xuICAgICAgICBpbmxpbmU6IHRydWUsXG4gICAgICAgIHNvdXJjZXNDb250ZW50OiB0cnVlLFxuICAgICAgfSxcbiAgICB9KTtcblxuICAgIGNvbnN0IHJhd1dhcm5pbmdzID0gcmVzdWx0Lndhcm5pbmdzKCk7XG4gICAgbGV0IHdhcm5pbmdzO1xuICAgIGlmIChyYXdXYXJuaW5ncy5sZW5ndGggPiAwKSB7XG4gICAgICBjb25zdCBsaW5lTWFwcGluZ3MgPSBuZXcgTWFwPHN0cmluZywgc3RyaW5nW10gfCBudWxsPigpO1xuICAgICAgd2FybmluZ3MgPSByYXdXYXJuaW5ncy5tYXAoKHdhcm5pbmcpID0+IHtcbiAgICAgICAgY29uc3QgZmlsZSA9IHdhcm5pbmcubm9kZS5zb3VyY2U/LmlucHV0LmZpbGU7XG4gICAgICAgIGlmIChmaWxlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICByZXR1cm4geyB0ZXh0OiB3YXJuaW5nLnRleHQgfTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBsaW5lcyA9IGxpbmVNYXBwaW5ncy5nZXQoZmlsZSk7XG4gICAgICAgIGlmIChsaW5lcyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgbGluZXMgPSB3YXJuaW5nLm5vZGUuc291cmNlPy5pbnB1dC5jc3Muc3BsaXQoL1xccj9cXG4vKTtcbiAgICAgICAgICBsaW5lTWFwcGluZ3Muc2V0KGZpbGUsIGxpbmVzID8/IG51bGwpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICB0ZXh0OiB3YXJuaW5nLnRleHQsXG4gICAgICAgICAgbG9jYXRpb246IHtcbiAgICAgICAgICAgIGZpbGUsXG4gICAgICAgICAgICBsaW5lOiB3YXJuaW5nLmxpbmUsXG4gICAgICAgICAgICBjb2x1bW46IHdhcm5pbmcuY29sdW1uIC0gMSxcbiAgICAgICAgICAgIGxpbmVUZXh0OiBsaW5lcz8uW3dhcm5pbmcubGluZSAtIDFdLFxuICAgICAgICAgIH0sXG4gICAgICAgIH07XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgY29udGVudHM6IHJlc3VsdC5jc3MsXG4gICAgICBsb2FkZXI6ICdjc3MnLFxuICAgICAgd2FybmluZ3MsXG4gICAgfTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBwb3N0Y3NzID8/PSAoYXdhaXQgaW1wb3J0KCdwb3N0Y3NzJykpLmRlZmF1bHQ7XG4gICAgaWYgKGVycm9yIGluc3RhbmNlb2YgcG9zdGNzcy5Dc3NTeW50YXhFcnJvcikge1xuICAgICAgY29uc3QgbGluZXMgPSBlcnJvci5zb3VyY2U/LnNwbGl0KC9cXHI/XFxuLyk7XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIGVycm9yczogW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIHRleHQ6IGVycm9yLnJlYXNvbixcbiAgICAgICAgICAgIGxvY2F0aW9uOiB7XG4gICAgICAgICAgICAgIGZpbGU6IGVycm9yLmZpbGUsXG4gICAgICAgICAgICAgIGxpbmU6IGVycm9yLmxpbmUsXG4gICAgICAgICAgICAgIGNvbHVtbjogZXJyb3IuY29sdW1uICYmIGVycm9yLmNvbHVtbiAtIDEsXG4gICAgICAgICAgICAgIGxpbmVUZXh0OiBlcnJvci5saW5lID09PSB1bmRlZmluZWQgPyB1bmRlZmluZWQgOiBsaW5lcz8uW2Vycm9yLmxpbmUgLSAxXSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfSxcbiAgICAgICAgXSxcbiAgICAgIH07XG4gICAgfVxuXG4gICAgdGhyb3cgZXJyb3I7XG4gIH1cbn1cbiJdfQ==
@@ -0,0 +1,30 @@
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 { BuilderContext } from '@angular-devkit/architect';
9
+ import { BuildOptions, Metafile, OutputFile, PartialMessage } from 'esbuild';
10
+ import { InitialFileRecord } from './bundler-context';
11
+ export declare function logBuildStats(context: BuilderContext, metafile: Metafile, initial: Map<string, InitialFileRecord>, estimatedTransferSizes?: Map<string, number>): void;
12
+ export declare function calculateEstimatedTransferSizes(outputFiles: OutputFile[]): Promise<Map<string, number>>;
13
+ export declare function withSpinner<T>(text: string, action: () => T | Promise<T>): Promise<T>;
14
+ export declare function withNoProgress<T>(test: string, action: () => T | Promise<T>): Promise<T>;
15
+ export declare function logMessages(context: BuilderContext, { errors, warnings }: {
16
+ errors?: PartialMessage[];
17
+ warnings?: PartialMessage[];
18
+ }): Promise<void>;
19
+ /**
20
+ * Generates a syntax feature object map for Angular applications based on a list of targets.
21
+ * A full set of feature names can be found here: https://esbuild.github.io/api/#supported
22
+ * @param target An array of browser/engine targets in the format accepted by the esbuild `target` option.
23
+ * @returns An object that can be used with the esbuild build `supported` option.
24
+ */
25
+ export declare function getFeatureSupport(target: string[]): BuildOptions['supported'];
26
+ export declare function writeResultFiles(outputFiles: OutputFile[], assetFiles: {
27
+ source: string;
28
+ destination: string;
29
+ }[] | undefined, outputPath: string): Promise<void>;
30
+ export declare function createOutputFileFromText(path: string, text: string): OutputFile;
@@ -0,0 +1,192 @@
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.createOutputFileFromText = exports.writeResultFiles = exports.getFeatureSupport = exports.logMessages = exports.withNoProgress = exports.withSpinner = exports.calculateEstimatedTransferSizes = exports.logBuildStats = void 0;
14
+ const esbuild_1 = require("esbuild");
15
+ const node_fs_1 = require("node:fs");
16
+ const promises_1 = __importDefault(require("node:fs/promises"));
17
+ const node_path_1 = __importDefault(require("node:path"));
18
+ const node_util_1 = require("node:util");
19
+ const node_zlib_1 = require("node:zlib");
20
+ const spinner_1 = require("../../utils/spinner");
21
+ const stats_1 = require("../webpack/utils/stats");
22
+ const compressAsync = (0, node_util_1.promisify)(node_zlib_1.brotliCompress);
23
+ function logBuildStats(context, metafile, initial, estimatedTransferSizes) {
24
+ const stats = [];
25
+ for (const [file, output] of Object.entries(metafile.outputs)) {
26
+ // Only display JavaScript and CSS files
27
+ if (!file.endsWith('.js') && !file.endsWith('.css')) {
28
+ continue;
29
+ }
30
+ // Skip internal component resources
31
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
32
+ if (output['ng-component']) {
33
+ continue;
34
+ }
35
+ stats.push({
36
+ initial: initial.has(file),
37
+ stats: [
38
+ file,
39
+ initial.get(file)?.name ?? '-',
40
+ output.bytes,
41
+ estimatedTransferSizes?.get(file) ?? '-',
42
+ ],
43
+ });
44
+ }
45
+ const tableText = (0, stats_1.generateBuildStatsTable)(stats, true, true, !!estimatedTransferSizes, undefined);
46
+ context.logger.info('\n' + tableText + '\n');
47
+ }
48
+ exports.logBuildStats = logBuildStats;
49
+ async function calculateEstimatedTransferSizes(outputFiles) {
50
+ const sizes = new Map();
51
+ const pendingCompression = [];
52
+ for (const outputFile of outputFiles) {
53
+ // Only calculate JavaScript and CSS files
54
+ if (!outputFile.path.endsWith('.js') && !outputFile.path.endsWith('.css')) {
55
+ continue;
56
+ }
57
+ // Skip compressing small files which may end being larger once compressed and will most likely not be
58
+ // compressed in actual transit.
59
+ if (outputFile.contents.byteLength < 1024) {
60
+ sizes.set(outputFile.path, outputFile.contents.byteLength);
61
+ continue;
62
+ }
63
+ pendingCompression.push(compressAsync(outputFile.contents).then((result) => sizes.set(outputFile.path, result.byteLength)));
64
+ }
65
+ await Promise.all(pendingCompression);
66
+ return sizes;
67
+ }
68
+ exports.calculateEstimatedTransferSizes = calculateEstimatedTransferSizes;
69
+ async function withSpinner(text, action) {
70
+ const spinner = new spinner_1.Spinner(text);
71
+ spinner.start();
72
+ try {
73
+ return await action();
74
+ }
75
+ finally {
76
+ spinner.stop();
77
+ }
78
+ }
79
+ exports.withSpinner = withSpinner;
80
+ async function withNoProgress(test, action) {
81
+ return action();
82
+ }
83
+ exports.withNoProgress = withNoProgress;
84
+ async function logMessages(context, { errors, warnings }) {
85
+ if (warnings?.length) {
86
+ const warningMessages = await (0, esbuild_1.formatMessages)(warnings, { kind: 'warning', color: true });
87
+ context.logger.warn(warningMessages.join('\n'));
88
+ }
89
+ if (errors?.length) {
90
+ const errorMessages = await (0, esbuild_1.formatMessages)(errors, { kind: 'error', color: true });
91
+ context.logger.error(errorMessages.join('\n'));
92
+ }
93
+ }
94
+ exports.logMessages = logMessages;
95
+ /**
96
+ * Generates a syntax feature object map for Angular applications based on a list of targets.
97
+ * A full set of feature names can be found here: https://esbuild.github.io/api/#supported
98
+ * @param target An array of browser/engine targets in the format accepted by the esbuild `target` option.
99
+ * @returns An object that can be used with the esbuild build `supported` option.
100
+ */
101
+ function getFeatureSupport(target) {
102
+ const supported = {
103
+ // Native async/await is not supported with Zone.js. Disabling support here will cause
104
+ // esbuild to downlevel async/await and for await...of to a Zone.js supported form. However, esbuild
105
+ // does not currently support downleveling async generators. Instead babel is used within the JS/TS
106
+ // loader to perform the downlevel transformation.
107
+ // NOTE: If esbuild adds support in the future, the babel support for async generators can be disabled.
108
+ 'async-await': false,
109
+ // V8 currently has a performance defect involving object spread operations that can cause signficant
110
+ // degradation in runtime performance. By not supporting the language feature here, a downlevel form
111
+ // will be used instead which provides a workaround for the performance issue.
112
+ // For more details: https://bugs.chromium.org/p/v8/issues/detail?id=11536
113
+ 'object-rest-spread': false,
114
+ // esbuild currently has a defect involving self-referencing a class within a static code block or
115
+ // static field initializer. This is not an issue for projects that use the default browserslist as these
116
+ // elements are an ES2022 feature which is not support by all browsers in the default list. However, if a
117
+ // custom browserslist is used that only has newer browsers than the static code elements may be present.
118
+ // This issue is compounded by the default usage of the tsconfig `"useDefineForClassFields": false` option
119
+ // present in generated CLI projects which causes static code blocks to be used instead of static fields.
120
+ // esbuild currently unconditionally downlevels all static fields in top-level classes so to workaround the
121
+ // Angular issue only static code blocks are disabled here.
122
+ // For more details: https://github.com/evanw/esbuild/issues/2950
123
+ 'class-static-blocks': false,
124
+ };
125
+ // Detect Safari browser versions that have a class field behavior bug
126
+ // See: https://github.com/angular/angular-cli/issues/24355#issuecomment-1333477033
127
+ // See: https://github.com/WebKit/WebKit/commit/e8788a34b3d5f5b4edd7ff6450b80936bff396f2
128
+ let safariClassFieldScopeBug = false;
129
+ for (const browser of target) {
130
+ let majorVersion;
131
+ if (browser.startsWith('ios')) {
132
+ majorVersion = Number(browser.slice(3, 5));
133
+ }
134
+ else if (browser.startsWith('safari')) {
135
+ majorVersion = Number(browser.slice(6, 8));
136
+ }
137
+ else {
138
+ continue;
139
+ }
140
+ // Technically, 14.0 is not broken but rather does not have support. However, the behavior
141
+ // is identical since it would be set to false by esbuild if present as a target.
142
+ if (majorVersion === 14 || majorVersion === 15) {
143
+ safariClassFieldScopeBug = true;
144
+ break;
145
+ }
146
+ }
147
+ // If class field support cannot be used set to false; otherwise leave undefined to allow
148
+ // esbuild to use `target` to determine support.
149
+ if (safariClassFieldScopeBug) {
150
+ supported['class-field'] = false;
151
+ supported['class-static-field'] = false;
152
+ }
153
+ return supported;
154
+ }
155
+ exports.getFeatureSupport = getFeatureSupport;
156
+ async function writeResultFiles(outputFiles, assetFiles, outputPath) {
157
+ const directoryExists = new Set();
158
+ await Promise.all(outputFiles.map(async (file) => {
159
+ // Ensure output subdirectories exist
160
+ const basePath = node_path_1.default.dirname(file.path);
161
+ if (basePath && !directoryExists.has(basePath)) {
162
+ await promises_1.default.mkdir(node_path_1.default.join(outputPath, basePath), { recursive: true });
163
+ directoryExists.add(basePath);
164
+ }
165
+ // Write file contents
166
+ await promises_1.default.writeFile(node_path_1.default.join(outputPath, file.path), file.contents);
167
+ }));
168
+ if (assetFiles?.length) {
169
+ await Promise.all(assetFiles.map(async ({ source, destination }) => {
170
+ // Ensure output subdirectories exist
171
+ const basePath = node_path_1.default.dirname(destination);
172
+ if (basePath && !directoryExists.has(basePath)) {
173
+ await promises_1.default.mkdir(node_path_1.default.join(outputPath, basePath), { recursive: true });
174
+ directoryExists.add(basePath);
175
+ }
176
+ // Copy file contents
177
+ await promises_1.default.copyFile(source, node_path_1.default.join(outputPath, destination), node_fs_1.constants.COPYFILE_FICLONE);
178
+ }));
179
+ }
180
+ }
181
+ exports.writeResultFiles = writeResultFiles;
182
+ function createOutputFileFromText(path, text) {
183
+ return {
184
+ path,
185
+ text,
186
+ get contents() {
187
+ return Buffer.from(this.text, 'utf-8');
188
+ },
189
+ };
190
+ }
191
+ exports.createOutputFileFromText = createOutputFileFromText;
192
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9hbmd1bGFyX2RldmtpdC9idWlsZF9hbmd1bGFyL3NyYy90b29scy9lc2J1aWxkL3V0aWxzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQTs7Ozs7O0dBTUc7Ozs7OztBQUdILHFDQUE2RjtBQUM3RixxQ0FBbUQ7QUFDbkQsZ0VBQWtDO0FBQ2xDLDBEQUE2QjtBQUM3Qix5Q0FBc0M7QUFDdEMseUNBQTJDO0FBQzNDLGlEQUE4QztBQUM5QyxrREFBOEU7QUFHOUUsTUFBTSxhQUFhLEdBQUcsSUFBQSxxQkFBUyxFQUFDLDBCQUFjLENBQUMsQ0FBQztBQUVoRCxTQUFnQixhQUFhLENBQzNCLE9BQXVCLEVBQ3ZCLFFBQWtCLEVBQ2xCLE9BQXVDLEVBQ3ZDLHNCQUE0QztJQUU1QyxNQUFNLEtBQUssR0FBa0IsRUFBRSxDQUFDO0lBQ2hDLEtBQUssTUFBTSxDQUFDLElBQUksRUFBRSxNQUFNLENBQUMsSUFBSSxNQUFNLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsRUFBRTtRQUM3RCx3Q0FBd0M7UUFDeEMsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxFQUFFO1lBQ25ELFNBQVM7U0FDVjtRQUNELG9DQUFvQztRQUNwQyw4REFBOEQ7UUFDOUQsSUFBSyxNQUFjLENBQUMsY0FBYyxDQUFDLEVBQUU7WUFDbkMsU0FBUztTQUNWO1FBRUQsS0FBSyxDQUFDLElBQUksQ0FBQztZQUNULE9BQU8sRUFBRSxPQUFPLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQztZQUMxQixLQUFLLEVBQUU7Z0JBQ0wsSUFBSTtnQkFDSixPQUFPLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxFQUFFLElBQUksSUFBSSxHQUFHO2dCQUM5QixN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LEVBQUU7UUFDdEIsTUFBTSxPQUFPLENBQUMsR0FBRyxDQUNmLFVBQVUsQ0FBQyxHQUFHLENBQUMsS0FBSyxFQUFFLEVBQUUsTUFBTSxFQUFFLFdBQVcsRUFBRSxFQUFFLEVBQUU7WUFDL0MscUNBQXFDO1lBQ3JDLE1BQU0sUUFBUSxHQUFHLG1CQUFJLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBQyxDQUFDO1lBQzNDLElBQUksUUFBUSxJQUFJLENBQUMsZUFBZSxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsRUFBRTtnQkFDOUMsTUFBTSxrQkFBRSxDQUFDLEtBQUssQ0FBQyxtQkFBSSxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsUUFBUSxDQUFDLEVBQUUsRUFBRSxTQUFTLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztnQkFDckUsZUFBZSxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsQ0FBQzthQUMvQjtZQUNELHFCQUFxQjtZQUNyQixNQUFNLGtCQUFFLENBQUMsUUFBUSxDQUFDLE1BQU0sRUFBRSxtQkFBSSxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsV0FBVyxDQUFDLEVBQUUsbUJBQVcsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO1FBQzlGLENBQUMsQ0FBQyxDQUNILENBQUM7S0FDSDtBQUNILENBQUM7QUFqQ0QsNENBaUNDO0FBRUQsU0FBZ0Isd0JBQXdCLENBQUMsSUFBWSxFQUFFLElBQVk7SUFDakUsT0FBTztRQUNMLElBQUk7UUFDSixJQUFJO1FBQ0osSUFBSSxRQUFRO1lBQ1YsT0FBTyxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsT0FBTyxDQUFDLENBQUM7UUFDekMsQ0FBQztLQUNGLENBQUM7QUFDSixDQUFDO0FBUkQsNERBUUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgR29vZ2xlIExMQyBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICpcbiAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlXG4gKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlXG4gKi9cblxuaW1wb3J0IHsgQnVpbGRlckNvbnRleHQgfSBmcm9tICdAYW5ndWxhci1kZXZraXQvYXJjaGl0ZWN0JztcbmltcG9ydCB7IEJ1aWxkT3B0aW9ucywgTWV0YWZpbGUsIE91dHB1dEZpbGUsIFBhcnRpYWxNZXNzYWdlLCBmb3JtYXRNZXNzYWdlcyB9IGZyb20gJ2VzYnVpbGQnO1xuaW1wb3J0IHsgY29uc3RhbnRzIGFzIGZzQ29uc3RhbnRzIH0gZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgZnMgZnJvbSAnbm9kZTpmcy9wcm9taXNlcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuaW1wb3J0IHsgcHJvbWlzaWZ5IH0gZnJvbSAnbm9kZTp1dGlsJztcbmltcG9ydCB7IGJyb3RsaUNvbXByZXNzIH0gZnJvbSAnbm9kZTp6bGliJztcbmltcG9ydCB7IFNwaW5uZXIgfSBmcm9tICcuLi8uLi91dGlscy9zcGlubmVyJztcbmltcG9ydCB7IEJ1bmRsZVN0YXRzLCBnZW5lcmF0ZUJ1aWxkU3RhdHNUYWJsZSB9IGZyb20gJy4uL3dlYnBhY2svdXRpbHMvc3RhdHMnO1xuaW1wb3J0IHsgSW5pdGlhbEZpbGVSZWNvcmQgfSBmcm9tICcuL2J1bmRsZXItY29udGV4dCc7XG5cbmNvbnN0IGNvbXByZXNzQXN5bmMgPSBwcm9taXNpZnkoYnJvdGxpQ29tcHJlc3MpO1xuXG5leHBvcnQgZnVuY3Rpb24gbG9nQnVpbGRTdGF0cyhcbiAgY29udGV4dDogQnVpbGRlckNvbnRleHQsXG4gIG1ldGFmaWxlOiBNZXRhZmlsZSxcbiAgaW5pdGlhbDogTWFwPHN0cmluZywgSW5pdGlhbEZpbGVSZWNvcmQ+LFxuICBlc3RpbWF0ZWRUcmFuc2ZlclNpemVzPzogTWFwPHN0cmluZywgbnVtYmVyPixcbik6IHZvaWQge1xuICBjb25zdCBzdGF0czogQnVuZGxlU3RhdHNbXSA9IFtdO1xuICBmb3IgKGNvbnN0IFtmaWxlLCBvdXRwdXRdIG9mIE9iamVjdC5lbnRyaWVzKG1ldGFmaWxlLm91dHB1dHMpKSB7XG4gICAgLy8gT25seSBkaXNwbGF5IEphdmFTY3JpcHQgYW5kIENTUyBmaWxlc1xuICAgIGlmICghZmlsZS5lbmRzV2l0aCgnLmpzJykgJiYgIWZpbGUuZW5kc1dpdGgoJy5jc3MnKSkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIC8vIFNraXAgaW50ZXJuYWwgY29tcG9uZW50IHJlc291cmNlc1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAgaWYgKChvdXRwdXQgYXMgYW55KVsnbmctY29tcG9uZW50J10pIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIHN0YXRzLnB1c2goe1xuICAgICAgaW5pdGlhbDogaW5pdGlhbC5oYXMoZmlsZSksXG4gICAgICBzdGF0czogW1xuICAgICAgICBmaWxlLFxuICAgICAgICBpbml0aWFsLmdldChmaWxlKT8ubmFtZSA/PyAnLScsXG4gICAgICAgIG91dHB1dC5ieXRlcyxcbiAgICAgICAgZXN0aW1hdGVkVHJhbnNmZXJTaXplcz8uZ2V0KGZpbGUpID8/ICctJyxcbiAgICAgIF0sXG4gICAgfSk7XG4gIH1cblxuICBjb25zdCB0YWJsZVRleHQgPSBnZW5lcmF0ZUJ1aWxkU3RhdHNUYWJsZShzdGF0cywgdHJ1ZSwgdHJ1ZSwgISFlc3RpbWF0ZWRUcmFuc2ZlclNpemVzLCB1bmRlZmluZWQpO1xuXG4gIGNvbnRleHQubG9nZ2VyLmluZm8oJ1xcbicgKyB0YWJsZVRleHQgKyAnXFxuJyk7XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBjYWxjdWxhdGVFc3RpbWF0ZWRUcmFuc2ZlclNpemVzKFxuICBvdXRwdXRGaWxlczogT3V0cHV0RmlsZVtdLFxuKTogUHJvbWlzZTxNYXA8c3RyaW5nLCBudW1iZXI+PiB7XG4gIGNvbnN0IHNpemVzID0gbmV3IE1hcDxzdHJpbmcsIG51bWJlcj4oKTtcbiAgY29uc3QgcGVuZGluZ0NvbXByZXNzaW9uID0gW107XG5cbiAgZm9yIChjb25zdCBvdXRwdXRGaWxlIG9mIG91dHB1dEZpbGVzKSB7XG4gICAgLy8gT25seSBjYWxjdWxhdGUgSmF2YVNjcmlwdCBhbmQgQ1NTIGZpbGVzXG4gICAgaWYgKCFvdXRwdXRGaWxlLnBhdGguZW5kc1dpdGgoJy5qcycpICYmICFvdXRwdXRGaWxlLnBhdGguZW5kc1dpdGgoJy5jc3MnKSkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgLy8gU2tpcCBjb21wcmVzc2luZyBzbWFsbCBmaWxlcyB3aGljaCBtYXkgZW5kIGJlaW5nIGxhcmdlciBvbmNlIGNvbXByZXNzZWQgYW5kIHdpbGwgbW9zdCBsaWtlbHkgbm90IGJlXG4gICAgLy8gY29tcHJlc3NlZCBpbiBhY3R1YWwgdHJhbnNpdC5cbiAgICBpZiAob3V0cHV0RmlsZS5jb250ZW50cy5ieXRlTGVuZ3RoIDwgMTAyNCkge1xuICAgICAgc2l6ZXMuc2V0KG91dHB1dEZpbGUucGF0aCwgb3V0cHV0RmlsZS5jb250ZW50cy5ieXRlTGVuZ3RoKTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIHBlbmRpbmdDb21wcmVzc2lvbi5wdXNoKFxuICAgICAgY29tcHJlc3NBc3luYyhvdXRwdXRGaWxlLmNvbnRlbnRzKS50aGVuKChyZXN1bHQpID0+XG4gICAgICAgIHNpemVzLnNldChvdXRwdXRGaWxlLnBhdGgsIHJlc3VsdC5ieXRlTGVuZ3RoKSxcbiAgICAgICksXG4gICAgKTtcbiAgfVxuXG4gIGF3YWl0IFByb21pc2UuYWxsKHBlbmRpbmdDb21wcmVzc2lvbik7XG5cbiAgcmV0dXJuIHNpemVzO1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gd2l0aFNwaW5uZXI8VD4odGV4dDogc3RyaW5nLCBhY3Rpb246ICgpID0+IFQgfCBQcm9taXNlPFQ+KTogUHJvbWlzZTxUPiB7XG4gIGNvbnN0IHNwaW5uZXIgPSBuZXcgU3Bpbm5lcih0ZXh0KTtcbiAgc3Bpbm5lci5zdGFydCgpO1xuXG4gIHRyeSB7XG4gICAgcmV0dXJuIGF3YWl0IGFjdGlvbigpO1xuICB9IGZpbmFsbHkge1xuICAgIHNwaW5uZXIuc3RvcCgpO1xuICB9XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiB3aXRoTm9Qcm9ncmVzczxUPih0ZXN0OiBzdHJpbmcsIGFjdGlvbjogKCkgPT4gVCB8IFByb21pc2U8VD4pOiBQcm9taXNlPFQ+IHtcbiAgcmV0dXJuIGFjdGlvbigpO1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gbG9nTWVzc2FnZXMoXG4gIGNvbnRleHQ6IEJ1aWxkZXJDb250ZXh0LFxuICB7IGVycm9ycywgd2FybmluZ3MgfTogeyBlcnJvcnM/OiBQYXJ0aWFsTWVzc2FnZVtdOyB3YXJuaW5ncz86IFBhcnRpYWxNZXNzYWdlW10gfSxcbik6IFByb21pc2U8dm9pZD4ge1xuICBpZiAod2FybmluZ3M/Lmxlbmd0aCkge1xuICAgIGNvbnN0IHdhcm5pbmdNZXNzYWdlcyA9IGF3YWl0IGZvcm1hdE1lc3NhZ2VzKHdhcm5pbmdzLCB7IGtpbmQ6ICd3YXJuaW5nJywgY29sb3I6IHRydWUgfSk7XG4gICAgY29udGV4dC5sb2dnZXIud2Fybih3YXJuaW5nTWVzc2FnZXMuam9pbignXFxuJykpO1xuICB9XG5cbiAgaWYgKGVycm9ycz8ubGVuZ3RoKSB7XG4gICAgY29uc3QgZXJyb3JNZXNzYWdlcyA9IGF3YWl0IGZvcm1hdE1lc3NhZ2VzKGVycm9ycywgeyBraW5kOiAnZXJyb3InLCBjb2xvcjogdHJ1ZSB9KTtcbiAgICBjb250ZXh0LmxvZ2dlci5lcnJvcihlcnJvck1lc3NhZ2VzLmpvaW4oJ1xcbicpKTtcbiAgfVxufVxuXG4vKipcbiAqIEdlbmVyYXRlcyBhIHN5bnRheCBmZWF0dXJlIG9iamVjdCBtYXAgZm9yIEFuZ3VsYXIgYXBwbGljYXRpb25zIGJhc2VkIG9uIGEgbGlzdCBvZiB0YXJnZXRzLlxuICogQSBmdWxsIHNldCBvZiBmZWF0dXJlIG5hbWVzIGNhbiBiZSBmb3VuZCBoZXJlOiBodHRwczovL2VzYnVpbGQuZ2l0aHViLmlvL2FwaS8jc3VwcG9ydGVkXG4gKiBAcGFyYW0gdGFyZ2V0IEFuIGFycmF5IG9mIGJyb3dzZXIvZW5naW5lIHRhcmdldHMgaW4gdGhlIGZvcm1hdCBhY2NlcHRlZCBieSB0aGUgZXNidWlsZCBgdGFyZ2V0YCBvcHRpb24uXG4gKiBAcmV0dXJucyBBbiBvYmplY3QgdGhhdCBjYW4gYmUgdXNlZCB3aXRoIHRoZSBlc2J1aWxkIGJ1aWxkIGBzdXBwb3J0ZWRgIG9wdGlvbi5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldEZlYXR1cmVTdXBwb3J0KHRhcmdldDogc3RyaW5nW10pOiBCdWlsZE9wdGlvbnNbJ3N1cHBvcnRlZCddIHtcbiAgY29uc3Qgc3VwcG9ydGVkOiBSZWNvcmQ8c3RyaW5nLCBib29sZWFuPiA9IHtcbiAgICAvLyBOYXRpdmUgYXN5bmMvYXdhaXQgaXMgbm90IHN1cHBvcnRlZCB3aXRoIFpvbmUuanMuIERpc2FibGluZyBzdXBwb3J0IGhlcmUgd2lsbCBjYXVzZVxuICAgIC8vIGVzYnVpbGQgdG8gZG93bmxldmVsIGFzeW5jL2F3YWl0IGFuZCBmb3IgYXdhaXQuLi5vZiB0byBhIFpvbmUuanMgc3VwcG9ydGVkIGZvcm0uIEhvd2V2ZXIsIGVzYnVpbGRcbiAgICAvLyBkb2VzIG5vdCBjdXJyZW50bHkgc3VwcG9ydCBkb3dubGV2ZWxpbmcgYXN5bmMgZ2VuZXJhdG9ycy4gSW5zdGVhZCBiYWJlbCBpcyB1c2VkIHdpdGhpbiB0aGUgSlMvVFNcbiAgICAvLyBsb2FkZXIgdG8gcGVyZm9ybSB0aGUgZG93bmxldmVsIHRyYW5zZm9ybWF0aW9uLlxuICAgIC8vIE5PVEU6IElmIGVzYnVpbGQgYWRkcyBzdXBwb3J0IGluIHRoZSBmdXR1cmUsIHRoZSBiYWJlbCBzdXBwb3J0IGZvciBhc3luYyBnZW5lcmF0b3JzIGNhbiBiZSBkaXNhYmxlZC5cbiAgICAnYXN5bmMtYXdhaXQnOiBmYWxzZSxcbiAgICAvLyBWOCBjdXJyZW50bHkgaGFzIGEgcGVyZm9ybWFuY2UgZGVmZWN0IGludm9sdmluZyBvYmplY3Qgc3ByZWFkIG9wZXJhdGlvbnMgdGhhdCBjYW4gY2F1c2Ugc2lnbmZpY2FudFxuICAgIC8vIGRlZ3JhZGF0aW9uIGluIHJ1bnRpbWUgcGVyZm9ybWFuY2UuIEJ5IG5vdCBzdXBwb3J0aW5nIHRoZSBsYW5ndWFnZSBmZWF0dXJlIGhlcmUsIGEgZG93bmxldmVsIGZvcm1cbiAgICAvLyB3aWxsIGJlIHVzZWQgaW5zdGVhZCB3aGljaCBwcm92aWRlcyBhIHdvcmthcm91bmQgZm9yIHRoZSBwZXJmb3JtYW5jZSBpc3N1ZS5cbiAgICAvLyBGb3IgbW9yZSBkZXRhaWxzOiBodHRwczovL2J1Z3MuY2hyb21pdW0ub3JnL3AvdjgvaXNzdWVzL2RldGFpbD9pZD0xMTUzNlxuICAgICdvYmplY3QtcmVzdC1zcHJlYWQnOiBmYWxzZSxcbiAgICAvLyBlc2J1aWxkIGN1cnJlbnRseSBoYXMgYSBkZWZlY3QgaW52b2x2aW5nIHNlbGYtcmVmZXJlbmNpbmcgYSBjbGFzcyB3aXRoaW4gYSBzdGF0aWMgY29kZSBibG9jayBvclxuICAgIC8vIHN0YXRpYyBmaWVsZCBpbml0aWFsaXplci4gVGhpcyBpcyBub3QgYW4gaXNzdWUgZm9yIHByb2plY3RzIHRoYXQgdXNlIHRoZSBkZWZhdWx0IGJyb3dzZXJzbGlzdCBhcyB0aGVzZVxuICAgIC8vIGVsZW1lbnRzIGFyZSBhbiBFUzIwMjIgZmVhdHVyZSB3aGljaCBpcyBub3Qgc3VwcG9ydCBieSBhbGwgYnJvd3NlcnMgaW4gdGhlIGRlZmF1bHQgbGlzdC4gSG93ZXZlciwgaWYgYVxuICAgIC8vIGN1c3RvbSBicm93c2Vyc2xpc3QgaXMgdXNlZCB0aGF0IG9ubHkgaGFzIG5ld2VyIGJyb3dzZXJzIHRoYW4gdGhlIHN0YXRpYyBjb2RlIGVsZW1lbnRzIG1heSBiZSBwcmVzZW50LlxuICAgIC8vIFRoaXMgaXNzdWUgaXMgY29tcG91bmRlZCBieSB0aGUgZGVmYXVsdCB1c2FnZSBvZiB0aGUgdHNjb25maWcgYFwidXNlRGVmaW5lRm9yQ2xhc3NGaWVsZHNcIjogZmFsc2VgIG9wdGlvblxuICAgIC8vIHByZXNlbnQgaW4gZ2VuZXJhdGVkIENMSSBwcm9qZWN0cyB3aGljaCBjYXVzZXMgc3RhdGljIGNvZGUgYmxvY2tzIHRvIGJlIHVzZWQgaW5zdGVhZCBvZiBzdGF0aWMgZmllbGRzLlxuICAgIC8vIGVzYnVpbGQgY3VycmVudGx5IHVuY29uZGl0aW9uYWxseSBkb3dubGV2ZWxzIGFsbCBzdGF0aWMgZmllbGRzIGluIHRvcC1sZXZlbCBjbGFzc2VzIHNvIHRvIHdvcmthcm91bmQgdGhlXG4gICAgLy8gQW5ndWxhciBpc3N1ZSBvbmx5IHN0YXRpYyBjb2RlIGJsb2NrcyBhcmUgZGlzYWJsZWQgaGVyZS5cbiAgICAvLyBGb3IgbW9yZSBkZXRhaWxzOiBodHRwczovL2dpdGh1Yi5jb20vZXZhbncvZXNidWlsZC9pc3N1ZXMvMjk1MFxuICAgICdjbGFzcy1zdGF0aWMtYmxvY2tzJzogZmFsc2UsXG4gIH07XG5cbiAgLy8gRGV0ZWN0IFNhZmFyaSBicm93c2VyIHZlcnNpb25zIHRoYXQgaGF2ZSBhIGNsYXNzIGZpZWxkIGJlaGF2aW9yIGJ1Z1xuICAvLyBTZWU6IGh0dHBzOi8vZ2l0aHViLmNvbS9hbmd1bGFyL2FuZ3VsYXItY2xpL2lzc3Vlcy8yNDM1NSNpc3N1ZWNvbW1lbnQtMTMzMzQ3NzAzM1xuICAvLyBTZWU6IGh0dHBzOi8vZ2l0aHViLmNvbS9XZWJLaXQvV2ViS2l0L2NvbW1pdC9lODc4OGEzNGIzZDVmNWI0ZWRkN2ZmNjQ1MGI4MDkzNmJmZjM5NmYyXG4gIGxldCBzYWZhcmlDbGFzc0ZpZWxkU2NvcGVCdWcgPSBmYWxzZTtcbiAgZm9yIChjb25zdCBicm93c2VyIG9mIHRhcmdldCkge1xuICAgIGxldCBtYWpvclZlcnNpb247XG4gICAgaWYgKGJyb3dzZXIuc3RhcnRzV2l0aCgnaW9zJykpIHtcbiAgICAgIG1ham9yVmVyc2lvbiA9IE51bWJlcihicm93c2VyLnNsaWNlKDMsIDUpKTtcbiAgICB9IGVsc2UgaWYgKGJyb3dzZXIuc3RhcnRzV2l0aCgnc2FmYXJpJykpIHtcbiAgICAgIG1ham9yVmVyc2lvbiA9IE51bWJlcihicm93c2VyLnNsaWNlKDYsIDgpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIC8vIFRlY2huaWNhbGx5LCAxNC4wIGlzIG5vdCBicm9rZW4gYnV0IHJhdGhlciBkb2VzIG5vdCBoYXZlIHN1cHBvcnQuIEhvd2V2ZXIsIHRoZSBiZWhhdmlvclxuICAgIC8vIGlzIGlkZW50aWNhbCBzaW5jZSBpdCB3b3VsZCBiZSBzZXQgdG8gZmFsc2UgYnkgZXNidWlsZCBpZiBwcmVzZW50IGFzIGEgdGFyZ2V0LlxuICAgIGlmIChtYWpvclZlcnNpb24gPT09IDE0IHx8IG1ham9yVmVyc2lvbiA9PT0gMTUpIHtcbiAgICAgIHNhZmFyaUNsYXNzRmllbGRTY29wZUJ1ZyA9IHRydWU7XG4gICAgICBicmVhaztcbiAgICB9XG4gIH1cbiAgLy8gSWYgY2xhc3MgZmllbGQgc3VwcG9ydCBjYW5ub3QgYmUgdXNlZCBzZXQgdG8gZmFsc2U7IG90aGVyd2lzZSBsZWF2ZSB1bmRlZmluZWQgdG8gYWxsb3dcbiAgLy8gZXNidWlsZCB0byB1c2UgYHRhcmdldGAgdG8gZGV0ZXJtaW5lIHN1cHBvcnQuXG4gIGlmIChzYWZhcmlDbGFzc0ZpZWxkU2NvcGVCdWcpIHtcbiAgICBzdXBwb3J0ZWRbJ2NsYXNzLWZpZWxkJ10gPSBmYWxzZTtcbiAgICBzdXBwb3J0ZWRbJ2NsYXNzLXN0YXRpYy1maWVsZCddID0gZmFsc2U7XG4gIH1cblxuICByZXR1cm4gc3VwcG9ydGVkO1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gd3JpdGVSZXN1bHRGaWxlcyhcbiAgb3V0cHV0RmlsZXM6IE91dHB1dEZpbGVbXSxcbiAgYXNzZXRGaWxlczogeyBzb3VyY2U6IHN0cmluZzsgZGVzdGluYXRpb246IHN0cmluZyB9W10gfCB1bmRlZmluZWQsXG4gIG91dHB1dFBhdGg6IHN0cmluZyxcbikge1xuICBjb25zdCBkaXJlY3RvcnlFeGlzdHMgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgb3V0cHV0RmlsZXMubWFwKGFzeW5jIChmaWxlKSA9PiB7XG4gICAgICAvLyBFbnN1cmUgb3V0cHV0IHN1YmRpcmVjdG9yaWVzIGV4aXN0XG4gICAgICBjb25zdCBiYXNlUGF0aCA9IHBhdGguZGlybmFtZShmaWxlLnBhdGgpO1xuICAgICAgaWYgKGJhc2VQYXRoICYmICFkaXJlY3RvcnlFeGlzdHMuaGFzKGJhc2VQYXRoKSkge1xuICAgICAgICBhd2FpdCBmcy5ta2RpcihwYXRoLmpvaW4ob3V0cHV0UGF0aCwgYmFzZVBhdGgpLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgICAgICAgZGlyZWN0b3J5RXhpc3RzLmFkZChiYXNlUGF0aCk7XG4gICAgICB9XG4gICAgICAvLyBXcml0ZSBmaWxlIGNvbnRlbnRzXG4gICAgICBhd2FpdCBmcy53cml0ZUZpbGUocGF0aC5qb2luKG91dHB1dFBhdGgsIGZpbGUucGF0aCksIGZpbGUuY29udGVudHMpO1xuICAgIH0pLFxuICApO1xuXG4gIGlmIChhc3NldEZpbGVzPy5sZW5ndGgpIHtcbiAgICBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgIGFzc2V0RmlsZXMubWFwKGFzeW5jICh7IHNvdXJjZSwgZGVzdGluYXRpb24gfSkgPT4ge1xuICAgICAgICAvLyBFbnN1cmUgb3V0cHV0IHN1YmRpcmVjdG9yaWVzIGV4aXN0XG4gICAgICAgIGNvbnN0IGJhc2VQYXRoID0gcGF0aC5kaXJuYW1lKGRlc3RpbmF0aW9uKTtcbiAgICAgICAgaWYgKGJhc2VQYXRoICYmICFkaXJlY3RvcnlFeGlzdHMuaGFzKGJhc2VQYXRoKSkge1xuICAgICAgICAgIGF3YWl0IGZzLm1rZGlyKHBhdGguam9pbihvdXRwdXRQYXRoLCBiYXNlUGF0aCksIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICAgICAgICAgIGRpcmVjdG9yeUV4aXN0cy5hZGQoYmFzZVBhdGgpO1xuICAgICAgICB9XG4gICAgICAgIC8vIENvcHkgZmlsZSBjb250ZW50c1xuICAgICAgICBhd2FpdCBmcy5jb3B5RmlsZShzb3VyY2UsIHBhdGguam9pbihvdXRwdXRQYXRoLCBkZXN0aW5hdGlvbiksIGZzQ29uc3RhbnRzLkNPUFlGSUxFX0ZJQ0xPTkUpO1xuICAgICAgfSksXG4gICAgKTtcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlT3V0cHV0RmlsZUZyb21UZXh0KHBhdGg6IHN0cmluZywgdGV4dDogc3RyaW5nKTogT3V0cHV0RmlsZSB7XG4gIHJldHVybiB7XG4gICAgcGF0aCxcbiAgICB0ZXh0LFxuICAgIGdldCBjb250ZW50cygpIHtcbiAgICAgIHJldHVybiBCdWZmZXIuZnJvbSh0aGlzLnRleHQsICd1dGYtOCcpO1xuICAgIH0sXG4gIH07XG59XG4iXX0=
@@ -0,0 +1,28 @@
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 { OnLoadArgs, Plugin, PluginBuild } from 'esbuild';
9
+ /**
10
+ * Options for the createVirtualModulePlugin
11
+ * @see createVirtualModulePlugin
12
+ */
13
+ export interface VirtualModulePluginOptions {
14
+ /** Namespace. Example: `angular:polyfills`. */
15
+ namespace: string;
16
+ /** If the generated module should be marked as external. */
17
+ external?: boolean;
18
+ /** Method to transform the onResolve path. */
19
+ transformPath?: (path: string) => string;
20
+ /** Method to provide the module content. */
21
+ loadContent: (args: OnLoadArgs, build: PluginBuild) => ReturnType<Parameters<PluginBuild['onLoad']>[1]>;
22
+ }
23
+ /**
24
+ * Creates an esbuild plugin that generated virtual modules.
25
+ *
26
+ * @returns An esbuild plugin.
27
+ */
28
+ export declare function createVirtualModulePlugin(options: VirtualModulePluginOptions): Plugin;
@@ -0,0 +1,43 @@
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.createVirtualModulePlugin = void 0;
11
+ /**
12
+ * Creates an esbuild plugin that generated virtual modules.
13
+ *
14
+ * @returns An esbuild plugin.
15
+ */
16
+ function createVirtualModulePlugin(options) {
17
+ const { namespace, external, transformPath: pathTransformer, loadContent } = options;
18
+ return {
19
+ name: namespace.replace(/[/:]/g, '-'),
20
+ setup(build) {
21
+ build.onResolve({ filter: new RegExp('^' + namespace) }, ({ kind, path }) => {
22
+ if (kind !== 'entry-point') {
23
+ return null;
24
+ }
25
+ return {
26
+ path: pathTransformer?.(path) ?? path,
27
+ namespace,
28
+ };
29
+ });
30
+ if (external) {
31
+ build.onResolve({ filter: /./, namespace }, ({ path }) => {
32
+ return {
33
+ path,
34
+ external: true,
35
+ };
36
+ });
37
+ }
38
+ build.onLoad({ filter: /./, namespace }, (args) => loadContent(args, build));
39
+ },
40
+ };
41
+ }
42
+ exports.createVirtualModulePlugin = createVirtualModulePlugin;
43
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmlydHVhbC1tb2R1bGUtcGx1Z2luLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vcGFja2FnZXMvYW5ndWxhcl9kZXZraXQvYnVpbGRfYW5ndWxhci9zcmMvdG9vbHMvZXNidWlsZC92aXJ0dWFsLW1vZHVsZS1wbHVnaW4udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBOzs7Ozs7R0FNRzs7O0FBc0JIOzs7O0dBSUc7QUFDSCxTQUFnQix5QkFBeUIsQ0FBQyxPQUFtQztJQUMzRSxNQUFNLEVBQUUsU0FBUyxFQUFFLFFBQVEsRUFBRSxhQUFhLEVBQUUsZUFBZSxFQUFFLFdBQVcsRUFBRSxHQUFHLE9BQU8sQ0FBQztJQUVyRixPQUFPO1FBQ0wsSUFBSSxFQUFFLFNBQVMsQ0FBQyxPQUFPLENBQUMsT0FBTyxFQUFFLEdBQUcsQ0FBQztRQUNyQyxLQUFLLENBQUMsS0FBSztZQUNULEtBQUssQ0FBQyxTQUFTLENBQUMsRUFBRSxNQUFNLEVBQUUsSUFBSSxNQUFNLENBQUMsR0FBRyxHQUFHLFNBQVMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsRUFBRSxFQUFFO2dCQUMxRSxJQUFJLElBQUksS0FBSyxhQUFhLEVBQUU7b0JBQzFCLE9BQU8sSUFBSSxDQUFDO2lCQUNiO2dCQUVELE9BQU87b0JBQ0wsSUFBSSxFQUFFLGVBQWUsRUFBRSxDQUFDLElBQUksQ0FBQyxJQUFJLElBQUk7b0JBQ3JDLFNBQVM7aUJBQ1YsQ0FBQztZQUNKLENBQUMsQ0FBQyxDQUFDO1lBRUgsSUFBSSxRQUFRLEVBQUU7Z0JBQ1osS0FBSyxDQUFDLFNBQVMsQ0FBQyxFQUFFLE1BQU0sRUFBRSxHQUFHLEVBQUUsU0FBUyxFQUFFLEVBQUUsQ0FBQyxFQUFFLElBQUksRUFBRSxFQUFFLEVBQUU7b0JBQ3ZELE9BQU87d0JBQ0wsSUFBSTt3QkFDSixRQUFRLEVBQUUsSUFBSTtxQkFDZixDQUFDO2dCQUNKLENBQUMsQ0FBQyxDQUFDO2FBQ0o7WUFFRCxLQUFLLENBQUMsTUFBTSxDQUFDLEVBQUUsTUFBTSxFQUFFLEdBQUcsRUFBRSxTQUFTLEVBQUUsRUFBRSxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsV0FBVyxDQUFDLElBQUksRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFDO1FBQy9FLENBQUM7S0FDRixDQUFDO0FBQ0osQ0FBQztBQTdCRCw4REE2QkMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgR29vZ2xlIExMQyBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICpcbiAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlXG4gKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlXG4gKi9cblxuaW1wb3J0IHR5cGUgeyBPbkxvYWRBcmdzLCBQbHVnaW4sIFBsdWdpbkJ1aWxkIH0gZnJvbSAnZXNidWlsZCc7XG5cbi8qKlxuICogT3B0aW9ucyBmb3IgdGhlIGNyZWF0ZVZpcnR1YWxNb2R1bGVQbHVnaW5cbiAqIEBzZWUgY3JlYXRlVmlydHVhbE1vZHVsZVBsdWdpblxuICovXG5leHBvcnQgaW50ZXJmYWNlIFZpcnR1YWxNb2R1bGVQbHVnaW5PcHRpb25zIHtcbiAgLyoqIE5hbWVzcGFjZS4gRXhhbXBsZTogYGFuZ3VsYXI6cG9seWZpbGxzYC4gKi9cbiAgbmFtZXNwYWNlOiBzdHJpbmc7XG4gIC8qKiBJZiB0aGUgZ2VuZXJhdGVkIG1vZHVsZSBzaG91bGQgYmUgbWFya2VkIGFzIGV4dGVybmFsLiAqL1xuICBleHRlcm5hbD86IGJvb2xlYW47XG4gIC8qKiBNZXRob2QgdG8gdHJhbnNmb3JtIHRoZSBvblJlc29sdmUgcGF0aC4gKi9cbiAgdHJhbnNmb3JtUGF0aD86IChwYXRoOiBzdHJpbmcpID0+IHN0cmluZztcbiAgLyoqIE1ldGhvZCB0byBwcm92aWRlIHRoZSBtb2R1bGUgY29udGVudC4gKi9cbiAgbG9hZENvbnRlbnQ6IChcbiAgICBhcmdzOiBPbkxvYWRBcmdzLFxuICAgIGJ1aWxkOiBQbHVnaW5CdWlsZCxcbiAgKSA9PiBSZXR1cm5UeXBlPFBhcmFtZXRlcnM8UGx1Z2luQnVpbGRbJ29uTG9hZCddPlsxXT47XG59XG5cbi8qKlxuICogQ3JlYXRlcyBhbiBlc2J1aWxkIHBsdWdpbiB0aGF0IGdlbmVyYXRlZCB2aXJ0dWFsIG1vZHVsZXMuXG4gKlxuICogQHJldHVybnMgQW4gZXNidWlsZCBwbHVnaW4uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVWaXJ0dWFsTW9kdWxlUGx1Z2luKG9wdGlvbnM6IFZpcnR1YWxNb2R1bGVQbHVnaW5PcHRpb25zKTogUGx1Z2luIHtcbiAgY29uc3QgeyBuYW1lc3BhY2UsIGV4dGVybmFsLCB0cmFuc2Zvcm1QYXRoOiBwYXRoVHJhbnNmb3JtZXIsIGxvYWRDb250ZW50IH0gPSBvcHRpb25zO1xuXG4gIHJldHVybiB7XG4gICAgbmFtZTogbmFtZXNwYWNlLnJlcGxhY2UoL1svOl0vZywgJy0nKSxcbiAgICBzZXR1cChidWlsZCk6IHZvaWQge1xuICAgICAgYnVpbGQub25SZXNvbHZlKHsgZmlsdGVyOiBuZXcgUmVnRXhwKCdeJyArIG5hbWVzcGFjZSkgfSwgKHsga2luZCwgcGF0aCB9KSA9PiB7XG4gICAgICAgIGlmIChraW5kICE9PSAnZW50cnktcG9pbnQnKSB7XG4gICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIHBhdGg6IHBhdGhUcmFuc2Zvcm1lcj8uKHBhdGgpID8/IHBhdGgsXG4gICAgICAgICAgbmFtZXNwYWNlLFxuICAgICAgICB9O1xuICAgICAgfSk7XG5cbiAgICAgIGlmIChleHRlcm5hbCkge1xuICAgICAgICBidWlsZC5vblJlc29sdmUoeyBmaWx0ZXI6IC8uLywgbmFtZXNwYWNlIH0sICh7IHBhdGggfSkgPT4ge1xuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBwYXRoLFxuICAgICAgICAgICAgZXh0ZXJuYWw6IHRydWUsXG4gICAgICAgICAgfTtcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIGJ1aWxkLm9uTG9hZCh7IGZpbHRlcjogLy4vLCBuYW1lc3BhY2UgfSwgKGFyZ3MpID0+IGxvYWRDb250ZW50KGFyZ3MsIGJ1aWxkKSk7XG4gICAgfSxcbiAgfTtcbn1cbiJdfQ==