@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
@@ -1,304 +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
- Object.defineProperty(exports, "__esModule", { value: true });
33
- exports.buildServePath = exports.getDevServerConfig = void 0;
34
- const core_1 = require("@angular-devkit/core");
35
- const fs_1 = require("fs");
36
- const path_1 = require("path");
37
- const url_1 = require("url");
38
- const error_1 = require("../../utils/error");
39
- const load_esm_1 = require("../../utils/load-esm");
40
- const webpack_browser_config_1 = require("../../utils/webpack-browser-config");
41
- const hmr_loader_1 = require("../plugins/hmr/hmr-loader");
42
- async function getDevServerConfig(wco) {
43
- const { buildOptions: { host, port, index, headers, watch, hmr, main, liveReload, proxyConfig }, logger, root, } = wco;
44
- const servePath = buildServePath(wco.buildOptions, logger);
45
- const extraRules = [];
46
- if (hmr) {
47
- extraRules.push({
48
- loader: hmr_loader_1.HmrLoader,
49
- include: [(0, path_1.resolve)(wco.root, main)],
50
- });
51
- }
52
- const extraPlugins = [];
53
- if (!watch) {
54
- // There's no option to turn off file watching in webpack-dev-server, but
55
- // we can override the file watcher instead.
56
- extraPlugins.push({
57
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
58
- apply: (compiler) => {
59
- compiler.hooks.afterEnvironment.tap('angular-cli', () => {
60
- // eslint-disable-next-line @typescript-eslint/no-empty-function
61
- compiler.watchFileSystem = { watch: () => { } };
62
- });
63
- },
64
- });
65
- }
66
- return {
67
- plugins: extraPlugins,
68
- module: {
69
- rules: extraRules,
70
- },
71
- devServer: {
72
- host,
73
- port,
74
- headers: {
75
- 'Access-Control-Allow-Origin': '*',
76
- ...headers,
77
- },
78
- historyApiFallback: !!index && {
79
- index: path_1.posix.join(servePath, (0, webpack_browser_config_1.getIndexOutputFile)(index)),
80
- disableDotRule: true,
81
- htmlAcceptHeaders: ['text/html', 'application/xhtml+xml'],
82
- rewrites: [
83
- {
84
- from: new RegExp(`^(?!${servePath})/.*`),
85
- to: (context) => context.parsedUrl.href,
86
- },
87
- ],
88
- },
89
- // When setupExitSignals is enabled webpack-dev-server will shutdown gracefully which would
90
- // require CTRL+C to be pressed multiple times to exit.
91
- // See: https://github.com/webpack/webpack-dev-server/blob/c76b6d11a3821436c5e20207c8a38deb6ab7e33c/lib/Server.js#L1801-L1827
92
- setupExitSignals: false,
93
- compress: false,
94
- static: false,
95
- server: getServerConfig(root, wco.buildOptions),
96
- allowedHosts: getAllowedHostsConfig(wco.buildOptions),
97
- devMiddleware: {
98
- publicPath: servePath,
99
- stats: false,
100
- },
101
- liveReload,
102
- hot: hmr && !liveReload ? 'only' : hmr,
103
- proxy: await addProxyConfig(root, proxyConfig),
104
- ...getWebSocketSettings(wco.buildOptions, servePath),
105
- },
106
- };
107
- }
108
- exports.getDevServerConfig = getDevServerConfig;
109
- /**
110
- * Resolve and build a URL _path_ that will be the root of the server. This resolved base href and
111
- * deploy URL from the browser options and returns a path from the root.
112
- */
113
- function buildServePath(options, logger) {
114
- let servePath = options.servePath;
115
- if (servePath === undefined) {
116
- const defaultPath = findDefaultServePath(options.baseHref, options.deployUrl);
117
- if (defaultPath == null) {
118
- logger.warn(core_1.tags.oneLine `
119
- Warning: --deploy-url and/or --base-href contain unsupported values for ng serve. Default
120
- serve path of '/' used. Use --serve-path to override.
121
- `);
122
- }
123
- servePath = defaultPath || '';
124
- }
125
- if (servePath.endsWith('/')) {
126
- servePath = servePath.slice(0, -1);
127
- }
128
- if (!servePath.startsWith('/')) {
129
- servePath = `/${servePath}`;
130
- }
131
- return servePath;
132
- }
133
- exports.buildServePath = buildServePath;
134
- /**
135
- * Private method to enhance a webpack config with SSL configuration.
136
- * @private
137
- */
138
- function getServerConfig(root, options) {
139
- const { ssl, sslCert, sslKey } = options;
140
- if (!ssl) {
141
- return 'http';
142
- }
143
- return {
144
- type: 'https',
145
- options: sslCert && sslKey
146
- ? {
147
- key: (0, path_1.resolve)(root, sslKey),
148
- cert: (0, path_1.resolve)(root, sslCert),
149
- }
150
- : undefined,
151
- };
152
- }
153
- /**
154
- * Private method to enhance a webpack config with Proxy configuration.
155
- * @private
156
- */
157
- async function addProxyConfig(root, proxyConfig) {
158
- if (!proxyConfig) {
159
- return undefined;
160
- }
161
- const proxyPath = (0, path_1.resolve)(root, proxyConfig);
162
- if (!(0, fs_1.existsSync)(proxyPath)) {
163
- throw new Error(`Proxy configuration file ${proxyPath} does not exist.`);
164
- }
165
- switch ((0, path_1.extname)(proxyPath)) {
166
- case '.json': {
167
- const content = await fs_1.promises.readFile(proxyPath, 'utf-8');
168
- const { parse, printParseErrorCode } = await Promise.resolve().then(() => __importStar(require('jsonc-parser')));
169
- const parseErrors = [];
170
- const proxyConfiguration = parse(content, parseErrors, { allowTrailingComma: true });
171
- if (parseErrors.length > 0) {
172
- let errorMessage = `Proxy configuration file ${proxyPath} contains parse errors:`;
173
- for (const parseError of parseErrors) {
174
- const { line, column } = getJsonErrorLineColumn(parseError.offset, content);
175
- errorMessage += `\n[${line}, ${column}] ${printParseErrorCode(parseError.error)}`;
176
- }
177
- throw new Error(errorMessage);
178
- }
179
- return proxyConfiguration;
180
- }
181
- case '.mjs':
182
- // Load the ESM configuration file using the TypeScript dynamic import workaround.
183
- // Once TypeScript provides support for keeping the dynamic import this workaround can be
184
- // changed to a direct dynamic import.
185
- return (await (0, load_esm_1.loadEsmModule)((0, url_1.pathToFileURL)(proxyPath))).default;
186
- case '.cjs':
187
- return require(proxyPath);
188
- default:
189
- // The file could be either CommonJS or ESM.
190
- // CommonJS is tried first then ESM if loading fails.
191
- try {
192
- return require(proxyPath);
193
- }
194
- catch (e) {
195
- (0, error_1.assertIsError)(e);
196
- if (e.code === 'ERR_REQUIRE_ESM') {
197
- // Load the ESM configuration file using the TypeScript dynamic import workaround.
198
- // Once TypeScript provides support for keeping the dynamic import this workaround can be
199
- // changed to a direct dynamic import.
200
- return (await (0, load_esm_1.loadEsmModule)((0, url_1.pathToFileURL)(proxyPath))).default;
201
- }
202
- throw e;
203
- }
204
- }
205
- }
206
- /**
207
- * Calculates the line and column for an error offset in the content of a JSON file.
208
- * @param location The offset error location from the beginning of the content.
209
- * @param content The full content of the file containing the error.
210
- * @returns An object containing the line and column
211
- */
212
- function getJsonErrorLineColumn(offset, content) {
213
- if (offset === 0) {
214
- return { line: 1, column: 1 };
215
- }
216
- let line = 0;
217
- let position = 0;
218
- // eslint-disable-next-line no-constant-condition
219
- while (true) {
220
- ++line;
221
- const nextNewline = content.indexOf('\n', position);
222
- if (nextNewline === -1 || nextNewline > offset) {
223
- break;
224
- }
225
- position = nextNewline + 1;
226
- }
227
- return { line, column: offset - position + 1 };
228
- }
229
- /**
230
- * Find the default server path. We don't want to expose baseHref and deployUrl as arguments, only
231
- * the browser options where needed. This method should stay private (people who want to resolve
232
- * baseHref and deployUrl should use the buildServePath exported function.
233
- * @private
234
- */
235
- function findDefaultServePath(baseHref, deployUrl) {
236
- if (!baseHref && !deployUrl) {
237
- return '';
238
- }
239
- if (/^(\w+:)?\/\//.test(baseHref || '') || /^(\w+:)?\/\//.test(deployUrl || '')) {
240
- // If baseHref or deployUrl is absolute, unsupported by ng serve
241
- return null;
242
- }
243
- // normalize baseHref
244
- // for ng serve the starting base is always `/` so a relative
245
- // and root relative value are identical
246
- const baseHrefParts = (baseHref || '').split('/').filter((part) => part !== '');
247
- if (baseHref && !baseHref.endsWith('/')) {
248
- baseHrefParts.pop();
249
- }
250
- const normalizedBaseHref = baseHrefParts.length === 0 ? '/' : `/${baseHrefParts.join('/')}/`;
251
- if (deployUrl && deployUrl[0] === '/') {
252
- if (baseHref && baseHref[0] === '/' && normalizedBaseHref !== deployUrl) {
253
- // If baseHref and deployUrl are root relative and not equivalent, unsupported by ng serve
254
- return null;
255
- }
256
- return deployUrl;
257
- }
258
- // Join together baseHref and deployUrl
259
- return `${normalizedBaseHref}${deployUrl || ''}`;
260
- }
261
- function getAllowedHostsConfig(options) {
262
- if (options.disableHostCheck) {
263
- return 'all';
264
- }
265
- else if (options.allowedHosts?.length) {
266
- return options.allowedHosts;
267
- }
268
- return undefined;
269
- }
270
- function getWebSocketSettings(options, servePath) {
271
- const { hmr, liveReload } = options;
272
- if (!hmr && !liveReload) {
273
- return {
274
- webSocketServer: false,
275
- client: undefined,
276
- };
277
- }
278
- const webSocketPath = path_1.posix.join(servePath, 'ng-cli-ws');
279
- return {
280
- webSocketServer: {
281
- options: {
282
- path: webSocketPath,
283
- },
284
- },
285
- client: {
286
- logging: 'info',
287
- webSocketURL: getPublicHostOptions(options, webSocketPath),
288
- overlay: {
289
- errors: true,
290
- warnings: false,
291
- runtimeErrors: false,
292
- },
293
- },
294
- };
295
- }
296
- function getPublicHostOptions(options, webSocketPath) {
297
- let publicHost = options.publicHost;
298
- if (publicHost) {
299
- const hostWithProtocol = !/^\w+:\/\//.test(publicHost) ? `https://${publicHost}` : publicHost;
300
- publicHost = new url_1.URL(hostWithProtocol).host;
301
- }
302
- return `auto://${publicHost || '0.0.0.0:0'}${webSocketPath}`;
303
- }
304
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGV2LXNlcnZlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL3BhY2thZ2VzL2FuZ3VsYXJfZGV2a2l0L2J1aWxkX2FuZ3VsYXIvc3JjL3dlYnBhY2svY29uZmlncy9kZXYtc2VydmVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQTs7Ozs7O0dBTUc7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBRUgsK0NBQXFEO0FBQ3JELDJCQUF3RDtBQUN4RCwrQkFBK0M7QUFDL0MsNkJBQXlDO0FBSXpDLDZDQUFrRDtBQUNsRCxtREFBcUQ7QUFDckQsK0VBQXdFO0FBQ3hFLDBEQUFzRDtBQUUvQyxLQUFLLFVBQVUsa0JBQWtCLENBQ3RDLEdBQWtEO0lBRWxELE1BQU0sRUFDSixZQUFZLEVBQUUsRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLEdBQUcsRUFBRSxJQUFJLEVBQUUsVUFBVSxFQUFFLFdBQVcsRUFBRSxFQUN2RixNQUFNLEVBQ04sSUFBSSxHQUNMLEdBQUcsR0FBRyxDQUFDO0lBRVIsTUFBTSxTQUFTLEdBQUcsY0FBYyxDQUFDLEdBQUcsQ0FBQyxZQUFZLEVBQUUsTUFBTSxDQUFDLENBQUM7SUFFM0QsTUFBTSxVQUFVLEdBQWtCLEVBQUUsQ0FBQztJQUNyQyxJQUFJLEdBQUcsRUFBRTtRQUNQLFVBQVUsQ0FBQyxJQUFJLENBQUM7WUFDZCxNQUFNLEVBQUUsc0JBQVM7WUFDakIsT0FBTyxFQUFFLENBQUMsSUFBQSxjQUFPLEVBQUMsR0FBRyxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQztTQUNuQyxDQUFDLENBQUM7S0FDSjtJQUVELE1BQU0sWUFBWSxHQUFHLEVBQUUsQ0FBQztJQUN4QixJQUFJLENBQUMsS0FBSyxFQUFFO1FBQ1YseUVBQXlFO1FBQ3pFLDRDQUE0QztRQUM1QyxZQUFZLENBQUMsSUFBSSxDQUFDO1lBQ2hCLDhE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b250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCBHb29nbGUgTExDIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKlxuICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmVcbiAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2VcbiAqL1xuXG5pbXBvcnQgeyBsb2dnaW5nLCB0YWdzIH0gZnJvbSAnQGFuZ3VsYXItZGV2a2l0L2NvcmUnO1xuaW1wb3J0IHsgZXhpc3RzU3luYywgcHJvbWlzZXMgYXMgZnNQcm9taXNlcyB9IGZyb20gJ2ZzJztcbmltcG9ydCB7IGV4dG5hbWUsIHBvc2l4LCByZXNvbHZlIH0gZnJvbSAncGF0aCc7XG5pbXBvcnQgeyBVUkwsIHBhdGhUb0ZpbGVVUkwgfSBmcm9tICd1cmwnO1xuaW1wb3J0IHsgQ29uZmlndXJhdGlvbiwgUnVsZVNldFJ1bGUgfSBmcm9tICd3ZWJwYWNrJztcbmltcG9ydCB0eXBlIHsgQ29uZmlndXJhdGlvbiBhcyBEZXZTZXJ2ZXJDb25maWd1cmF0aW9uIH0gZnJvbSAnd2VicGFjay1kZXYtc2VydmVyJztcbmltcG9ydCB7IFdlYnBhY2tDb25maWdPcHRpb25zLCBXZWJwYWNrRGV2U2VydmVyT3B0aW9ucyB9IGZyb20gJy4uLy4uL3V0aWxzL2J1aWxkLW9wdGlvbnMnO1xuaW1wb3J0IHsgYXNzZXJ0SXNFcnJvciB9IGZyb20gJy4uLy4uL3V0aWxzL2Vycm9yJztcbmltcG9ydCB7IGxvYWRFc21Nb2R1bGUgfSBmcm9tICcuLi8uLi91dGlscy9sb2FkLWVzbSc7XG5pbXBvcnQgeyBnZXRJbmRleE91dHB1dEZpbGUgfSBmcm9tICcuLi8uLi91dGlscy93ZWJwYWNrLWJyb3dzZXItY29uZmlnJztcbmltcG9ydCB7IEhtckxvYWRlciB9IGZyb20gJy4uL3BsdWdpbnMvaG1yL2htci1sb2FkZXInO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0RGV2U2VydmVyQ29uZmlnKFxuICB3Y286IFdlYnBhY2tDb25maWdPcHRpb25zPFdlYnBhY2tEZXZTZXJ2ZXJPcHRpb25zPixcbik6IFByb21pc2U8Q29uZmlndXJhdGlvbj4ge1xuICBjb25zdCB7XG4gICAgYnVpbGRPcHRpb25zOiB7IGhvc3QsIHBvcnQsIGluZGV4LCBoZWFkZXJzLCB3YXRjaCwgaG1yLCBtYWluLCBsaXZlUmVsb2FkLCBwcm94eUNvbmZpZyB9LFxuICAgIGxvZ2dlcixcbiAgICByb290LFxuICB9ID0gd2NvO1xuXG4gIGNvbnN0IHNlcnZlUGF0aCA9IGJ1aWxkU2VydmVQYXRoKHdjby5idWlsZE9wdGlvbnMsIGxvZ2dlcik7XG5cbiAgY29uc3QgZXh0cmFSdWxlczogUnVsZVNldFJ1bGVbXSA9IFtdO1xuICBpZiAoaG1yKSB7XG4gICAgZXh0cmFSdWxlcy5wdXNoKHtcbiAgICAgIGxvYWRlcjogSG1yTG9hZGVyLFxuICAgICAgaW5jbHVkZTogW3Jlc29sdmUod2NvLnJvb3QsIG1haW4pXSxcbiAgICB9KTtcbiAgfVxuXG4gIGNvbnN0IGV4dHJhUGx1Z2lucyA9IFtdO1xuICBpZiAoIXdhdGNoKSB7XG4gICAgLy8gVGhlcmUncyBubyBvcHRpb24gdG8gdHVybiBvZmYgZmlsZSB3YXRjaGluZyBpbiB3ZWJwYWNrLWRldi1zZXJ2ZXIsIGJ1dFxuICAgIC8vIHdlIGNhbiBvdmVycmlkZSB0aGUgZmlsZSB3YXRjaGVyIGluc3RlYWQuXG4gICAgZXh0cmFQbHVnaW5zLnB1c2goe1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICAgIGFwcGx5OiAoY29tcGlsZXI6IGFueSkgPT4ge1xuICAgICAgICBjb21waWxlci5ob29rcy5hZnRlckVudmlyb25tZW50LnRhcCgnYW5ndWxhci1jbGknLCAoKSA9PiB7XG4gICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1lbXB0eS1mdW5jdGlvblxuICAgICAgICAgIGNvbXBpbGVyLndhdGNoRmlsZVN5c3RlbSA9IHsgd2F0Y2g6ICgpID0+IHt9IH07XG4gICAgICAgIH0pO1xuICAgICAgfSxcbiAgICB9KTtcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgcGx1Z2luczogZXh0cmFQbHVnaW5zLFxuICAgIG1vZHVsZToge1xuICAgICAgcnVsZXM6IGV4dHJhUnVsZXMsXG4gICAgfSxcbiAgICBkZXZTZXJ2ZXI6IHtcbiAgICAgIGhvc3QsXG4gICAgICBwb3J0LFxuICAgICAgaGVhZGVyczoge1xuICAgICAgICAnQWNjZXNzLUNvbnRyb2wtQWxsb3ctT3JpZ2luJzogJyonLFxuICAgICAgICAuLi5oZWFkZXJzLFxuICAgICAgfSxcbiAgICAgIGhpc3RvcnlBcGlGYWxsYmFjazogISFpbmRleCAmJiB7XG4gICAgICAgIGluZGV4OiBwb3NpeC5qb2luKHNlcnZlUGF0aCwgZ2V0SW5kZXhPdXRwdXRGaWxlKGluZGV4KSksXG4gICAgICAgIGRpc2FibGVEb3RSdWxlOiB0cnVlLFxuICAgICAgICBodG1sQWNjZXB0SGVhZGVyczogWyd0ZXh0L2h0bWwnLCAnYXBwbGljYXRpb24veGh0bWwreG1sJ10sXG4gICAgICAgIHJld3JpdGVzOiBbXG4gICAgICAgICAge1xuICAgICAgICAgICAgZnJvbTogbmV3IFJlZ0V4cChgXig/ISR7c2VydmVQYXRofSkvLipgKSxcbiAgICAgICAgICAgIHRvOiAoY29udGV4dCkgPT4gY29udGV4dC5wYXJzZWRVcmwuaHJlZixcbiAgICAgICAgICB9LFxuICAgICAgICBdLFxuICAgICAgfSxcbiAgICAgIC8vIFdoZW4gc2V0dXBFeGl0U2lnbmFscyBpcyBlbmFibGVkIHdlYnBhY2stZGV2LXNlcnZlciB3aWxsIHNodXRkb3duIGdyYWNlZnVsbHkgd2hpY2ggd291bGRcbiAgICAgIC8vIHJlcXVpcmUgQ1RSTCtDIHRvIGJlIHByZXNzZWQgbXVsdGlwbGUgdGltZXMgdG8gZXhpdC5cbiAgICAgIC8vIFNlZTogaHR0cHM6Ly9naXRodWIuY29tL3dlYnBhY2svd2VicGFjay1kZXYtc2VydmVyL2Jsb2IvYzc2YjZkMTFhMzgyMTQzNmM1ZTIwMjA3YzhhMzhkZWI2YWI3ZTMzYy9saWIvU2VydmVyLmpzI0wxODAxLUwxODI3XG4gICAgICBzZXR1cEV4aXRTaWduYWxzOiBmYWxzZSxcbiAgICAgIGNvbXByZXNzOiBmYWxzZSxcbiAgICAgIHN0YXRpYzogZmFsc2UsXG4gICAgICBzZXJ2ZXI6IGdldFNlcnZlckNvbmZpZyhyb290LCB3Y28uYnVpbGRPcHRpb25zKSxcbiAgICAgIGFsbG93ZWRIb3N0czogZ2V0QWxsb3dlZEhvc3RzQ29uZmlnKHdjby5idWlsZE9wdGlvbnMpLFxuICAgICAgZGV2TWlkZGxld2FyZToge1xuICAgICAgICBwdWJsaWNQYXRoOiBzZXJ2ZVBhdGgsXG4gICAgICAgIHN0YXRzOiBmYWxzZSxcbiAgICAgIH0sXG4gICAgICBsaXZlUmVsb2FkLFxuICAgICAgaG90OiBobXIgJiYgIWxpdmVSZWxvYWQgPyAnb25seScgOiBobXIsXG4gICAgICBwcm94eTogYXdhaXQgYWRkUHJveHlDb25maWcocm9vdCwgcHJveHlDb25maWcpLFxuICAgICAgLi4uZ2V0V2ViU29ja2V0U2V0dGluZ3Mod2NvLmJ1aWxkT3B0aW9ucywgc2VydmVQYXRoKSxcbiAgICB9LFxuICB9O1xufVxuXG4vKipcbiAqIFJlc29sdmUgYW5kIGJ1aWxkIGEgVVJMIF9wYXRoXyB0aGF0IHdpbGwgYmUgdGhlIHJvb3Qgb2YgdGhlIHNlcnZlci4gVGhpcyByZXNvbHZlZCBiYXNlIGhyZWYgYW5kXG4gKiBkZXBsb3kgVVJMIGZyb20gdGhlIGJyb3dzZXIgb3B0aW9ucyBhbmQgcmV0dXJucyBhIHBhdGggZnJvbSB0aGUgcm9vdC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGJ1aWxkU2VydmVQYXRoKFxuICBvcHRpb25zOiBXZWJwYWNrRGV2U2VydmVyT3B0aW9ucyxcbiAgbG9nZ2VyOiBsb2dnaW5nLkxvZ2dlckFwaSxcbik6IHN0cmluZyB7XG4gIGxldCBzZXJ2ZVBhdGggPSBvcHRpb25zLnNlcnZlUGF0aDtcbiAgaWYgKHNlcnZlUGF0aCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgY29uc3QgZGVmYXVsdFBhdGggPSBmaW5kRGVmYXVsdFNlcnZlUGF0aChvcHRpb25zLmJhc2VIcmVmLCBvcHRpb25zLmRlcGxveVVybCk7XG4gICAgaWYgKGRlZmF1bHRQYXRoID09IG51bGwpIHtcbiAgICAgIGxvZ2dlci53YXJuKHRhZ3Mub25lTGluZWBcbiAgICAgICAgV2FybmluZzogLS1kZXBsb3ktdXJsIGFuZC9vciAtLWJhc2UtaHJlZiBjb250YWluIHVuc3VwcG9ydGVkIHZhbHVlcyBmb3Igbmcgc2VydmUuIERlZmF1bHRcbiAgICAgICAgc2VydmUgcGF0aCBvZiAnLycgdXNlZC4gVXNlIC0tc2VydmUtcGF0aCB0byBvdmVycmlkZS5cbiAgICAgIGApO1xuICAgIH1cbiAgICBzZXJ2ZVBhdGggPSBkZWZhdWx0UGF0aCB8fCAnJztcbiAgfVxuXG4gIGlmIChzZXJ2ZVBhdGguZW5kc1dpdGgoJy8nKSkge1xuICAgIHNlcnZlUGF0aCA9IHNlcnZlUGF0aC5zbGljZSgwLCAtMSk7XG4gIH1cblxuICBpZiAoIXNlcnZlUGF0aC5zdGFydHNXaXRoKCcvJykpIHtcbiAgICBzZXJ2ZVBhdGggPSBgLyR7c2VydmVQYXRofWA7XG4gIH1cblxuICByZXR1cm4gc2VydmVQYXRoO1xufVxuXG4vKipcbiAqIFByaXZhdGUgbWV0aG9kIHRvIGVuaGFuY2UgYSB3ZWJwYWNrIGNvbmZpZyB3aXRoIFNTTCBjb25maWd1cmF0aW9uLlxuICogQHByaXZhdGVcbiAqL1xuZnVuY3Rpb24gZ2V0U2VydmVyQ29uZmlnKFxuICByb290OiBzdHJpbmcsXG4gIG9wdGlvbnM6IFdlYnBhY2tEZXZTZXJ2ZXJPcHRpb25zLFxuKTogRGV2U2VydmVyQ29uZmlndXJhdGlvblsnc2VydmVyJ10ge1xuICBjb25zdCB7IHNzbCwgc3NsQ2VydCwgc3NsS2V5IH0gPSBvcHRpb25zO1xuICBpZiAoIXNzbCkge1xuICAgIHJldHVybiAnaHR0cCc7XG4gIH1cblxuICByZXR1cm4ge1xuICAgIHR5cGU6ICdodHRwcycsXG4gICAgb3B0aW9uczpcbiAgICAgIHNzbENlcnQgJiYgc3NsS2V5XG4gICAgICAgID8ge1xuICAgICAgICAgICAga2V5OiByZXNvbHZlKHJvb3QsIHNzbEtleSksXG4gICAgICAgICAgICBjZXJ0OiByZXNvbHZlKHJvb3QsIHNzbENlcnQpLFxuICAgICAgICAgIH1cbiAgICAgICAgOiB1bmRlZmluZWQsXG4gIH07XG59XG5cbi8qKlxuICogUHJpdmF0ZSBtZXRob2QgdG8gZW5oYW5jZSBhIHdlYnBhY2sgY29uZmlnIHdpdGggUHJveHkgY29uZmlndXJhdGlvbi5cbiAqIEBwcml2YXRlXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGFkZFByb3h5Q29uZmlnKHJvb3Q6IHN0cmluZywgcHJveHlDb25maWc6IHN0cmluZyB8IHVuZGVmaW5lZCkge1xuICBpZiAoIXByb3h5Q29uZmlnKSB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIGNvbnN0IHByb3h5UGF0aCA9IHJlc29sdmUocm9vdCwgcHJveHlDb25maWcpO1xuXG4gIGlmICghZXhpc3RzU3luYyhwcm94eVBhdGgpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBQcm94eSBjb25maWd1cmF0aW9uIGZpbGUgJHtwcm94eVBhdGh9IGRvZXMgbm90IGV4aXN0LmApO1xuICB9XG5cbiAgc3dpdGNoIChleHRuYW1lKHByb3h5UGF0aCkpIHtcbiAgICBjYXNlICcuanNvbic6IHtcbiAgICAgIGNvbnN0IGNvbnRlbnQgPSBhd2FpdCBmc1Byb21pc2VzLnJlYWRGaWxlKHByb3h5UGF0aCwgJ3V0Zi04Jyk7XG5cbiAgICAgIGNvbnN0IHsgcGFyc2UsIHByaW50UGFyc2VFcnJvckNvZGUgfSA9IGF3YWl0IGltcG9ydCgnanNvbmMtcGFyc2VyJyk7XG4gICAgICBjb25zdCBwYXJzZUVycm9yczogaW1wb3J0KCdqc29uYy1wYXJzZXInKS5QYXJzZUVycm9yW10gPSBbXTtcbiAgICAgIGNvbnN0IHByb3h5Q29uZmlndXJhdGlvbiA9IHBhcnNlKGNvbnRlbnQsIHBhcnNlRXJyb3JzLCB7IGFsbG93VHJhaWxpbmdDb21tYTogdHJ1ZSB9KTtcblxuICAgICAgaWYgKHBhcnNlRXJyb3JzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgbGV0IGVycm9yTWVzc2FnZSA9IGBQcm94eSBjb25maWd1cmF0aW9uIGZpbGUgJHtwcm94eVBhdGh9IGNvbnRhaW5zIHBhcnNlIGVycm9yczpgO1xuICAgICAgICBmb3IgKGNvbnN0IHBhcnNlRXJyb3Igb2YgcGFyc2VFcnJvcnMpIHtcbiAgICAgICAgICBjb25zdCB7IGxpbmUsIGNvbHVtbiB9ID0gZ2V0SnNvbkVycm9yTGluZUNvbHVtbihwYXJzZUVycm9yLm9mZnNldCwgY29udGVudCk7XG4gICAgICAgICAgZXJyb3JNZXNzYWdlICs9IGBcXG5bJHtsaW5lfSwgJHtjb2x1bW59XSAke3ByaW50UGFyc2VFcnJvckNvZGUocGFyc2VFcnJvci5lcnJvcil9YDtcbiAgICAgICAgfVxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoZXJyb3JNZXNzYWdlKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHByb3h5Q29uZmlndXJhdGlvbjtcbiAgICB9XG4gICAgY2FzZSAnLm1qcyc6XG4gICAgICAvLyBMb2FkIHRoZSBFU00gY29uZmlndXJhdGlvbiBmaWxlIHVzaW5nIHRoZSBUeXBlU2NyaXB0IGR5bmFtaWMgaW1wb3J0IHdvcmthcm91bmQuXG4gICAgICAvLyBPbmNlIFR5cGVTY3JpcHQgcHJvdmlkZXMgc3VwcG9ydCBmb3Iga2VlcGluZyB0aGUgZHluYW1pYyBpbXBvcnQgdGhpcyB3b3JrYXJvdW5kIGNhbiBiZVxuICAgICAgLy8gY2hhbmdlZCB0byBhIGRpcmVjdCBkeW5hbWljIGltcG9ydC5cbiAgICAgIHJldHVybiAoYXdhaXQgbG9hZEVzbU1vZHVsZTx7IGRlZmF1bHQ6IHVua25vd24gfT4ocGF0aFRvRmlsZVVSTChwcm94eVBhdGgpKSkuZGVmYXVsdDtcbiAgICBjYXNlICcuY2pzJzpcbiAgICAgIHJldHVybiByZXF1aXJlKHByb3h5UGF0aCk7XG4gICAgZGVmYXVsdDpcbiAgICAgIC8vIFRoZSBmaWxlIGNvdWxkIGJlIGVpdGhlciBDb21tb25KUyBvciBFU00uXG4gICAgICAvLyBDb21tb25KUyBpcyB0cmllZCBmaXJzdCB0aGVuIEVTTSBpZiBsb2FkaW5nIGZhaWxzLlxuICAgICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIHJlcXVpcmUocHJveHlQYXRoKTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgYXNzZXJ0SXNFcnJvcihlKTtcbiAgICAgICAgaWYgKGUuY29kZSA9PT0gJ0VSUl9SRVFVSVJFX0VTTScpIHtcbiAgICAgICAgICAvLyBMb2FkIHRoZSBFU00gY29uZmlndXJhdGlvbiBmaWxlIHVzaW5nIHRoZSBUeXBlU2NyaXB0IGR5bmFtaWMgaW1wb3J0IHdvcmthcm91bmQuXG4gICAgICAgICAgLy8gT25jZSBUeXBlU2NyaXB0IHByb3ZpZGVzIHN1cHBvcnQgZm9yIGtlZXBpbmcgdGhlIGR5bmFtaWMgaW1wb3J0IHRoaXMgd29ya2Fyb3VuZCBjYW4gYmVcbiAgICAgICAgICAvLyBjaGFuZ2VkIHRvIGEgZGlyZWN0IGR5bmFtaWMgaW1wb3J0LlxuICAgICAgICAgIHJldHVybiAoYXdhaXQgbG9hZEVzbU1vZHVsZTx7IGRlZmF1bHQ6IHVua25vd24gfT4ocGF0aFRvRmlsZVVSTChwcm94eVBhdGgpKSkuZGVmYXVsdDtcbiAgICAgICAgfVxuXG4gICAgICAgIHRocm93IGU7XG4gICAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBDYWxjdWxhdGVzIHRoZSBsaW5lIGFuZCBjb2x1bW4gZm9yIGFuIGVycm9yIG9mZnNldCBpbiB0aGUgY29udGVudCBvZiBhIEpTT04gZmlsZS5cbiAqIEBwYXJhbSBsb2NhdGlvbiBUaGUgb2Zmc2V0IGVycm9yIGxvY2F0aW9uIGZyb20gdGhlIGJlZ2lubmluZyBvZiB0aGUgY29udGVudC5cbiAqIEBwYXJhbSBjb250ZW50IFRoZSBmdWxsIGNvbnRlbnQgb2YgdGhlIGZpbGUgY29udGFpbmluZyB0aGUgZXJyb3IuXG4gKiBAcmV0dXJucyBBbiBvYmplY3QgY29udGFpbmluZyB0aGUgbGluZSBhbmQgY29sdW1uXG4gKi9cbmZ1bmN0aW9uIGdldEpzb25FcnJvckxpbmVDb2x1bW4ob2Zmc2V0OiBudW1iZXIsIGNvbnRlbnQ6IHN0cmluZykge1xuICBpZiAob2Zmc2V0ID09PSAwKSB7XG4gICAgcmV0dXJuIHsgbGluZTogMSwgY29sdW1uOiAxIH07XG4gIH1cblxuICBsZXQgbGluZSA9IDA7XG4gIGxldCBwb3NpdGlvbiA9IDA7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1jb25zdGFudC1jb25kaXRpb25cbiAgd2hpbGUgKHRydWUpIHtcbiAgICArK2xpbmU7XG5cbiAgICBjb25zdCBuZXh0TmV3bGluZSA9IGNvbnRlbnQuaW5kZXhPZignXFxuJywgcG9zaXRpb24pO1xuICAgIGlmIChuZXh0TmV3bGluZSA9PT0gLTEgfHwgbmV4dE5ld2xpbmUgPiBvZmZzZXQpIHtcbiAgICAgIGJyZWFrO1xuICAgIH1cblxuICAgIHBvc2l0aW9uID0gbmV4dE5ld2xpbmUgKyAxO1xuICB9XG5cbiAgcmV0dXJuIHsgbGluZSwgY29sdW1uOiBvZmZzZXQgLSBwb3NpdGlvbiArIDEgfTtcbn1cblxuLyoqXG4gKiBGaW5kIHRoZSBkZWZhdWx0IHNlcnZlciBwYXRoLiBXZSBkb24ndCB3YW50IHRvIGV4cG9zZSBiYXNlSHJlZiBhbmQgZGVwbG95VXJsIGFzIGFyZ3VtZW50cywgb25seVxuICogdGhlIGJyb3dzZXIgb3B0aW9ucyB3aGVyZSBuZWVkZWQuIFRoaXMgbWV0aG9kIHNob3VsZCBzdGF5IHByaXZhdGUgKHBlb3BsZSB3aG8gd2FudCB0byByZXNvbHZlXG4gKiBiYXNlSHJlZiBhbmQgZGVwbG95VXJsIHNob3VsZCB1c2UgdGhlIGJ1aWxkU2VydmVQYXRoIGV4cG9ydGVkIGZ1bmN0aW9uLlxuICogQHByaXZhdGVcbiAqL1xuZnVuY3Rpb24gZmluZERlZmF1bHRTZXJ2ZVBhdGgoYmFzZUhyZWY/OiBzdHJpbmcsIGRlcGxveVVybD86IHN0cmluZyk6IHN0cmluZyB8IG51bGwge1xuICBpZiAoIWJhc2VIcmVmICYmICFkZXBsb3lVcmwpIHtcbiAgICByZXR1cm4gJyc7XG4gIH1cblxuICBpZiAoL14oXFx3KzopP1xcL1xcLy8udGVzdChiYXNlSHJlZiB8fCAnJykgfHwgL14oXFx3KzopP1xcL1xcLy8udGVzdChkZXBsb3lVcmwgfHwgJycpKSB7XG4gICAgLy8gSWYgYmFzZUhyZWYgb3IgZGVwbG95VXJsIGlzIGFic29sdXRlLCB1bnN1cHBvcnRlZCBieSBuZyBzZXJ2ZVxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgLy8gbm9ybWFsaXplIGJhc2VIcmVmXG4gIC8vIGZvciBuZyBzZXJ2ZSB0aGUgc3RhcnRpbmcgYmFzZSBpcyBhbHdheXMgYC9gIHNvIGEgcmVsYXRpdmVcbiAgLy8gYW5kIHJvb3QgcmVsYXRpdmUgdmFsdWUgYXJlIGlkZW50aWNhbFxuICBjb25zdCBiYXNlSHJlZlBhcnRzID0gKGJhc2VIcmVmIHx8ICcnKS5zcGxpdCgnLycpLmZpbHRlcigocGFydCkgPT4gcGFydCAhPT0gJycpO1xuICBpZiAoYmFzZUhyZWYgJiYgIWJhc2VIcmVmLmVuZHNXaXRoKCcvJykpIHtcbiAgICBiYXNlSHJlZlBhcnRzLnBvcCgpO1xuICB9XG4gIGNvbnN0IG5vcm1hbGl6ZWRCYXNlSHJlZiA9IGJhc2VIcmVmUGFydHMubGVuZ3RoID09PSAwID8gJy8nIDogYC8ke2Jhc2VIcmVmUGFydHMuam9pbignLycpfS9gO1xuXG4gIGlmIChkZXBsb3lVcmwgJiYgZGVwbG95VXJsWzBdID09PSAnLycpIHtcbiAgICBpZiAoYmFzZUhyZWYgJiYgYmFzZUhyZWZbMF0gPT09ICcvJyAmJiBub3JtYWxpemVkQmFzZUhyZWYgIT09IGRlcGxveVVybCkge1xuICAgICAgLy8gSWYgYmFzZUhyZWYgYW5kIGRlcGxveVVybCBhcmUgcm9vdCByZWxhdGl2ZSBhbmQgbm90IGVxdWl2YWxlbnQsIHVuc3VwcG9ydGVkIGJ5IG5nIHNlcnZlXG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICByZXR1cm4gZGVwbG95VXJsO1xuICB9XG5cbiAgLy8gSm9pbiB0b2dldGhlciBiYXNlSHJlZiBhbmQgZGVwbG95VXJsXG4gIHJldHVybiBgJHtub3JtYWxpemVkQmFzZUhyZWZ9JHtkZXBsb3lVcmwgfHwgJyd9YDtcbn1cblxuZnVuY3Rpb24gZ2V0QWxsb3dlZEhvc3RzQ29uZmlnKFxuICBvcHRpb25zOiBXZWJwYWNrRGV2U2VydmVyT3B0aW9ucyxcbik6IERldlNlcnZlckNvbmZpZ3VyYXRpb25bJ2FsbG93ZWRIb3N0cyddIHtcbiAgaWYgKG9wdGlvbnMuZGlzYWJsZUhvc3RDaGVjaykge1xuICAgIHJldHVybiAnYWxsJztcbiAgfSBlbHNlIGlmIChvcHRpb25zLmFsbG93ZWRIb3N0cz8ubGVuZ3RoKSB7XG4gICAgcmV0dXJuIG9wdGlvbnMuYWxsb3dlZEhvc3RzO1xuICB9XG5cbiAgcmV0dXJuIHVuZGVmaW5lZDtcbn1cblxuZnVuY3Rpb24gZ2V0V2ViU29ja2V0U2V0dGluZ3MoXG4gIG9wdGlvbnM6IFdlYnBhY2tEZXZTZXJ2ZXJPcHRpb25zLFxuICBzZXJ2ZVBhdGg6IHN0cmluZyxcbik6IHtcbiAgd2ViU29ja2V0U2VydmVyPzogRGV2U2VydmVyQ29uZmlndXJhdGlvblsnd2ViU29ja2V0U2VydmVyJ107XG4gIGNsaWVudD86IERldlNlcnZlckNvbmZpZ3VyYXRpb25bJ2NsaWVudCddO1xufSB7XG4gIGNvbnN0IHsgaG1yLCBsaXZlUmVsb2FkIH0gPSBvcHRpb25zO1xuICBpZiAoIWhtciAmJiAhbGl2ZVJlbG9hZCkge1xuICAgIHJldHVybiB7XG4gICAgICB3ZWJTb2NrZXRTZXJ2ZXI6IGZhbHNlLFxuICAgICAgY2xpZW50OiB1bmRlZmluZWQsXG4gICAgfTtcbiAgfVxuXG4gIGNvbnN0IHdlYlNvY2tldFBhdGggPSBwb3NpeC5qb2luKHNlcnZlUGF0aCwgJ25nLWNsaS13cycpO1xuXG4gIHJldHVybiB7XG4gICAgd2ViU29ja2V0U2VydmVyOiB7XG4gICAgICBvcHRpb25zOiB7XG4gICAgICAgIHBhdGg6IHdlYlNvY2tldFBhdGgsXG4gICAgICB9LFxuICAgIH0sXG4gICAgY2xpZW50OiB7XG4gICAgICBsb2dnaW5nOiAnaW5mbycsXG4gICAgICB3ZWJTb2NrZXRVUkw6IGdldFB1YmxpY0hvc3RPcHRpb25zKG9wdGlvbnMsIHdlYlNvY2tldFBhdGgpLFxuICAgICAgb3ZlcmxheToge1xuICAgICAgICBlcnJvcnM6IHRydWUsXG4gICAgICAgIHdhcm5pbmdzOiBmYWxzZSxcbiAgICAgICAgcnVudGltZUVycm9yczogZmFsc2UsXG4gICAgICB9LFxuICAgIH0sXG4gIH07XG59XG5cbmZ1bmN0aW9uIGdldFB1YmxpY0hvc3RPcHRpb25zKG9wdGlvbnM6IFdlYnBhY2tEZXZTZXJ2ZXJPcHRpb25zLCB3ZWJTb2NrZXRQYXRoOiBzdHJpbmcpOiBzdHJpbmcge1xuICBsZXQgcHVibGljSG9zdDogc3RyaW5nIHwgbnVsbCB8IHVuZGVmaW5lZCA9IG9wdGlvbnMucHVibGljSG9zdDtcbiAgaWYgKHB1YmxpY0hvc3QpIHtcbiAgICBjb25zdCBob3N0V2l0aFByb3RvY29sID0gIS9eXFx3KzpcXC9cXC8vLnRlc3QocHVibGljSG9zdCkgPyBgaHR0cHM6Ly8ke3B1YmxpY0hvc3R9YCA6IHB1YmxpY0hvc3Q7XG4gICAgcHVibGljSG9zdCA9IG5ldyBVUkwoaG9zdFdpdGhQcm90b2NvbCkuaG9zdDtcbiAgfVxuXG4gIHJldHVybiBgYXV0bzovLyR7cHVibGljSG9zdCB8fCAnMC4wLjAuMDowJ30ke3dlYlNvY2tldFBhdGh9YDtcbn1cbiJdfQ==