@angular-devkit/build-angular 16.2.1 → 17.0.0-next.3

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 (52) hide show
  1. package/README.md +14 -10
  2. package/builders.json +10 -0
  3. package/package.json +31 -29
  4. package/src/builders/application/options.d.ts +6 -1
  5. package/src/builders/application/options.js +6 -1
  6. package/src/builders/application/schema.d.ts +3 -6
  7. package/src/builders/application/schema.js +1 -1
  8. package/src/builders/application/schema.json +7 -16
  9. package/src/builders/browser-esbuild/index.js +3 -2
  10. package/src/builders/dev-server/vite-server.d.ts +1 -1
  11. package/src/builders/dev-server/vite-server.js +11 -8
  12. package/src/builders/extract-i18n/application-extraction.d.ts +17 -0
  13. package/src/builders/extract-i18n/application-extraction.js +137 -0
  14. package/src/builders/extract-i18n/builder.d.ts +17 -0
  15. package/src/builders/extract-i18n/builder.js +152 -0
  16. package/src/builders/extract-i18n/index.d.ts +4 -14
  17. package/src/builders/extract-i18n/index.js +4 -247
  18. package/src/builders/extract-i18n/options.d.ts +29 -0
  19. package/src/builders/extract-i18n/options.js +82 -0
  20. package/src/builders/extract-i18n/webpack-extraction.d.ts +21 -0
  21. package/src/builders/extract-i18n/webpack-extraction.js +100 -0
  22. package/src/builders/jest/schema.d.ts +3 -6
  23. package/src/builders/jest/schema.js +1 -1
  24. package/src/builders/jest/schema.json +7 -16
  25. package/src/builders/prerender/index.d.ts +20 -0
  26. package/src/builders/prerender/index.js +180 -0
  27. package/src/builders/prerender/render-worker.d.ts +30 -0
  28. package/src/builders/prerender/render-worker.js +126 -0
  29. package/src/builders/prerender/schema.d.ts +22 -0
  30. package/src/builders/prerender/schema.js +5 -0
  31. package/src/builders/prerender/schema.json +39 -0
  32. package/src/builders/prerender/utils.d.ts +22 -0
  33. package/src/builders/prerender/utils.js +79 -0
  34. package/src/builders/ssr-dev-server/index.d.ts +23 -0
  35. package/src/builders/ssr-dev-server/index.js +309 -0
  36. package/src/builders/ssr-dev-server/schema.d.ts +64 -0
  37. package/src/builders/ssr-dev-server/schema.js +5 -0
  38. package/src/builders/ssr-dev-server/schema.json +75 -0
  39. package/src/builders/ssr-dev-server/utils.d.ts +15 -0
  40. package/src/builders/ssr-dev-server/utils.js +75 -0
  41. package/src/tools/babel/plugins/elide-angular-metadata.js +43 -20
  42. package/src/tools/babel/plugins/pure-toplevel-functions.js +3 -2
  43. package/src/tools/babel/webpack-loader.js +2 -2
  44. package/src/tools/esbuild/angular/compilation/angular-compilation.d.ts +7 -2
  45. package/src/tools/esbuild/angular/compilation/angular-compilation.js +21 -1
  46. package/src/tools/esbuild/angular/compiler-plugin.js +8 -13
  47. package/src/tools/esbuild/application-code-bundle.js +3 -5
  48. package/src/tools/esbuild/utils.js +5 -1
  49. package/src/tools/sass/rebasing-importer.js +2 -2
  50. package/src/utils/index-file/inline-critical-css.js +13 -26
  51. package/src/tools/esbuild/external-packages-plugin.d.ts +0 -17
  52. package/src/tools/esbuild/external-packages-plugin.js +0 -49
@@ -0,0 +1,39 @@
1
+ {
2
+ "$schema": "http://json-schema.org/draft-07/schema",
3
+ "title": "Prerender Target",
4
+ "type": "object",
5
+ "properties": {
6
+ "browserTarget": {
7
+ "type": "string",
8
+ "description": "Target to build.",
9
+ "pattern": "^[^:\\s]+:[^:\\s]+(:[^\\s]+)?$"
10
+ },
11
+ "serverTarget": {
12
+ "type": "string",
13
+ "description": "Server target to use for prerendering the app.",
14
+ "pattern": "^[^:\\s]+:[^:\\s]+(:[^\\s]+)?$"
15
+ },
16
+ "routesFile": {
17
+ "type": "string",
18
+ "description": "The path to a file containing routes separated by newlines."
19
+ },
20
+ "routes": {
21
+ "type": "array",
22
+ "description": "The routes to render.",
23
+ "items": {
24
+ "minItems": 1,
25
+ "type": "string",
26
+ "uniqueItems": true
27
+ },
28
+ "default": []
29
+ },
30
+ "guessRoutes": {
31
+ "type": "boolean",
32
+ "description": "Whether or not the builder should extract routes and guess which paths to render.",
33
+ "default": true
34
+ }
35
+ },
36
+ "required": ["browserTarget", "serverTarget"],
37
+ "anyOf": [{ "required": ["routes"] }, { "required": ["routesFile"] }],
38
+ "additionalProperties": false
39
+ }
@@ -0,0 +1,22 @@
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 { BrowserBuilderOptions } from '@angular-devkit/build-angular';
10
+ import { json } from '@angular-devkit/core';
11
+ import { Schema } from './schema';
12
+ type PrerenderBuilderOptions = Schema & json.JsonObject;
13
+ /**
14
+ * Returns the union of routes, the contents of routesFile if given,
15
+ * and the static routes extracted if guessRoutes is set to true.
16
+ */
17
+ export declare function getRoutes(options: PrerenderBuilderOptions, tsConfigPath: string | undefined, context: BuilderContext): Promise<string[]>;
18
+ /**
19
+ * Returns the name of the index file outputted by the browser builder.
20
+ */
21
+ export declare function getIndexOutputFile(options: BrowserBuilderOptions): string;
22
+ export {};
@@ -0,0 +1,79 @@
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.getIndexOutputFile = exports.getRoutes = void 0;
34
+ const fs = __importStar(require("fs"));
35
+ const guess_parser_1 = require("guess-parser");
36
+ const path = __importStar(require("path"));
37
+ const error_1 = require("../../utils/error");
38
+ /**
39
+ * Returns the union of routes, the contents of routesFile if given,
40
+ * and the static routes extracted if guessRoutes is set to true.
41
+ */
42
+ async function getRoutes(options, tsConfigPath, context) {
43
+ let routes = options.routes || [];
44
+ const { logger, workspaceRoot } = context;
45
+ if (options.routesFile) {
46
+ const routesFilePath = path.join(workspaceRoot, options.routesFile);
47
+ routes = routes.concat(fs
48
+ .readFileSync(routesFilePath, 'utf8')
49
+ .split(/\r?\n/)
50
+ .filter((v) => !!v));
51
+ }
52
+ if (options.guessRoutes && tsConfigPath) {
53
+ try {
54
+ routes = routes.concat((0, guess_parser_1.parseAngularRoutes)(path.join(workspaceRoot, tsConfigPath))
55
+ .map((routeObj) => routeObj.path)
56
+ .filter((route) => !route.includes('*') && !route.includes(':')));
57
+ }
58
+ catch (e) {
59
+ (0, error_1.assertIsError)(e);
60
+ logger.error('Unable to extract routes from application.', { ...e });
61
+ }
62
+ }
63
+ routes = routes.map((r) => (r === '' ? '/' : r));
64
+ return [...new Set(routes)];
65
+ }
66
+ exports.getRoutes = getRoutes;
67
+ /**
68
+ * Returns the name of the index file outputted by the browser builder.
69
+ */
70
+ function getIndexOutputFile(options) {
71
+ if (typeof options.index === 'string') {
72
+ return path.basename(options.index);
73
+ }
74
+ else {
75
+ return options.index.output || 'index.html';
76
+ }
77
+ }
78
+ exports.getIndexOutputFile = getIndexOutputFile;
79
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9hbmd1bGFyX2RldmtpdC9idWlsZF9hbmd1bGFyL3NyYy9idWlsZGVycy9wcmVyZW5kZXIvdXRpbHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBOzs7Ozs7R0FNRzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFLSCx1Q0FBeUI7QUFDekIsK0NBQWtEO0FBQ2xELDJDQUE2QjtBQUM3Qiw2Q0FBa0Q7QUFLbEQ7OztHQUdHO0FBQ0ksS0FBSyxVQUFVLFNBQVMsQ0FDN0IsT0FBZ0MsRUFDaEMsWUFBZ0MsRUFDaEMsT0FBdUI7SUFFdkIsSUFBSSxNQUFNLEdBQUcsT0FBTyxDQUFDLE1BQU0sSUFBSSxFQUFFLENBQUM7SUFDbEMsTUFBTSxFQUFFLE1BQU0sRUFBRSxhQUFhLEVBQUUsR0FBRyxPQUFPLENBQUM7SUFDMUMsSUFBSSxPQUFPLENBQUMsVUFBVSxFQUFFO1FBQ3RCLE1BQU0sY0FBYyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsYUFBYSxFQUFFLE9BQU8sQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUNwRSxNQUFNLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FDcEIsRUFBRTthQUNDLFlBQVksQ0FBQyxjQUFjLEVBQUUsTUFBTSxDQUFDO2FBQ3BDLEtBQUssQ0FBQyxPQUFPLENBQUM7YUFDZCxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FDdEIsQ0FBQztLQUNIO0lBRUQsSUFBSSxPQUFPLENBQUMsV0FBVyxJQUFJLFlBQVksRUFBRTtRQUN2QyxJQUFJO1lBQ0YsTUFBTSxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQ3BCLElBQUEsaUNBQWtCLEVBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxhQUFhLEVBQUUsWUFBWSxDQUFDLENBQUM7aUJBQ3ZELEdBQUcsQ0FBQyxDQUFDLFFBQVEsRUFBRSxFQUFFLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQztpQkFDaEMsTUFBTSxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQ25FLENBQUM7U0FDSDtRQUFDLE9BQU8sQ0FBQyxFQUFFO1lBQ1YsSUFBQSxxQkFBYSxFQUFDLENBQUMsQ0FBQyxDQUFDO1lBRWpCLE1BQU0sQ0FBQyxLQUFLLENBQUMsNENBQTRDLEVBQUUsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUM7U0FDdEU7S0FDRjtJQUVELE1BQU0sR0FBRyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUVqRCxPQUFPLENBQUMsR0FBRyxJQUFJLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDO0FBQzlCLENBQUM7QUFsQ0QsOEJBa0NDO0FBRUQ7O0dBRUc7QUFDSCxTQUFnQixrQkFBa0IsQ0FBQyxPQUE4QjtJQUMvRCxJQUFJLE9BQU8sT0FBTyxDQUFDLEtBQUssS0FBSyxRQUFRLEVBQUU7UUFDckMsT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQztLQUNyQztTQUFNO1FBQ0wsT0FBTyxPQUFPLENBQUMsS0FBSyxDQUFDLE1BQU0sSUFBSSxZQUFZLENBQUM7S0FDN0M7QUFDSCxDQUFDO0FBTkQsZ0RBTUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgR29vZ2xlIExMQyBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICpcbiAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlXG4gKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlXG4gKi9cblxuaW1wb3J0IHsgQnVpbGRlckNvbnRleHQgfSBmcm9tICdAYW5ndWxhci1kZXZraXQvYXJjaGl0ZWN0JztcbmltcG9ydCB7IEJyb3dzZXJCdWlsZGVyT3B0aW9ucyB9IGZyb20gJ0Bhbmd1bGFyLWRldmtpdC9idWlsZC1hbmd1bGFyJztcbmltcG9ydCB7IGpzb24gfSBmcm9tICdAYW5ndWxhci1kZXZraXQvY29yZSc7XG5pbXBvcnQgKiBhcyBmcyBmcm9tICdmcyc7XG5pbXBvcnQgeyBwYXJzZUFuZ3VsYXJSb3V0ZXMgfSBmcm9tICdndWVzcy1wYXJzZXInO1xuaW1wb3J0ICogYXMgcGF0aCBmcm9tICdwYXRoJztcbmltcG9ydCB7IGFzc2VydElzRXJyb3IgfSBmcm9tICcuLi8uLi91dGlscy9lcnJvcic7XG5pbXBvcnQgeyBTY2hlbWEgfSBmcm9tICcuL3NjaGVtYSc7XG5cbnR5cGUgUHJlcmVuZGVyQnVpbGRlck9wdGlvbnMgPSBTY2hlbWEgJiBqc29uLkpzb25PYmplY3Q7XG5cbi8qKlxuICogUmV0dXJucyB0aGUgdW5pb24gb2Ygcm91dGVzLCB0aGUgY29udGVudHMgb2Ygcm91dGVzRmlsZSBpZiBnaXZlbixcbiAqIGFuZCB0aGUgc3RhdGljIHJvdXRlcyBleHRyYWN0ZWQgaWYgZ3Vlc3NSb3V0ZXMgaXMgc2V0IHRvIHRydWUuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZXRSb3V0ZXMoXG4gIG9wdGlvbnM6IFByZXJlbmRlckJ1aWxkZXJPcHRpb25zLFxuICB0c0NvbmZpZ1BhdGg6IHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgY29udGV4dDogQnVpbGRlckNvbnRleHQsXG4pOiBQcm9taXNlPHN0cmluZ1tdPiB7XG4gIGxldCByb3V0ZXMgPSBvcHRpb25zLnJvdXRlcyB8fCBbXTtcbiAgY29uc3QgeyBsb2dnZXIsIHdvcmtzcGFjZVJvb3QgfSA9IGNvbnRleHQ7XG4gIGlmIChvcHRpb25zLnJvdXRlc0ZpbGUpIHtcbiAgICBjb25zdCByb3V0ZXNGaWxlUGF0aCA9IHBhdGguam9pbih3b3Jrc3BhY2VSb290LCBvcHRpb25zLnJvdXRlc0ZpbGUpO1xuICAgIHJvdXRlcyA9IHJvdXRlcy5jb25jYXQoXG4gICAgICBmc1xuICAgICAgICAucmVhZEZpbGVTeW5jKHJvdXRlc0ZpbGVQYXRoLCAndXRmOCcpXG4gICAgICAgIC5zcGxpdCgvXFxyP1xcbi8pXG4gICAgICAgIC5maWx0ZXIoKHYpID0+ICEhdiksXG4gICAgKTtcbiAgfVxuXG4gIGlmIChvcHRpb25zLmd1ZXNzUm91dGVzICYmIHRzQ29uZmlnUGF0aCkge1xuICAgIHRyeSB7XG4gICAgICByb3V0ZXMgPSByb3V0ZXMuY29uY2F0KFxuICAgICAgICBwYXJzZUFuZ3VsYXJSb3V0ZXMocGF0aC5qb2luKHdvcmtzcGFjZVJvb3QsIHRzQ29uZmlnUGF0aCkpXG4gICAgICAgICAgLm1hcCgocm91dGVPYmopID0+IHJvdXRlT2JqLnBhdGgpXG4gICAgICAgICAgLmZpbHRlcigocm91dGUpID0+ICFyb3V0ZS5pbmNsdWRlcygnKicpICYmICFyb3V0ZS5pbmNsdWRlcygnOicpKSxcbiAgICAgICk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgYXNzZXJ0SXNFcnJvcihlKTtcblxuICAgICAgbG9nZ2VyLmVycm9yKCdVbmFibGUgdG8gZXh0cmFjdCByb3V0ZXMgZnJvbSBhcHBsaWNhdGlvbi4nLCB7IC4uLmUgfSk7XG4gICAgfVxuICB9XG5cbiAgcm91dGVzID0gcm91dGVzLm1hcCgocikgPT4gKHIgPT09ICcnID8gJy8nIDogcikpO1xuXG4gIHJldHVybiBbLi4ubmV3IFNldChyb3V0ZXMpXTtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBuYW1lIG9mIHRoZSBpbmRleCBmaWxlIG91dHB1dHRlZCBieSB0aGUgYnJvd3NlciBidWlsZGVyLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0SW5kZXhPdXRwdXRGaWxlKG9wdGlvbnM6IEJyb3dzZXJCdWlsZGVyT3B0aW9ucyk6IHN0cmluZyB7XG4gIGlmICh0eXBlb2Ygb3B0aW9ucy5pbmRleCA9PT0gJ3N0cmluZycpIHtcbiAgICByZXR1cm4gcGF0aC5iYXNlbmFtZShvcHRpb25zLmluZGV4KTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gb3B0aW9ucy5pbmRleC5vdXRwdXQgfHwgJ2luZGV4Lmh0bWwnO1xuICB9XG59XG4iXX0=
@@ -0,0 +1,23 @@
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, BuilderOutput } from '@angular-devkit/architect';
9
+ import { json, logging } from '@angular-devkit/core';
10
+ import { Observable } from 'rxjs';
11
+ import { Schema } from './schema';
12
+ type SSRDevServerBuilderOptions = Schema & json.JsonObject;
13
+ export type SSRDevServerBuilderOutput = BuilderOutput & {
14
+ baseUrl?: string;
15
+ port?: string;
16
+ };
17
+ export declare function execute(options: SSRDevServerBuilderOptions, context: BuilderContext): Observable<SSRDevServerBuilderOutput>;
18
+ export declare function log({ stderr, stdout }: {
19
+ stderr: string | undefined;
20
+ stdout: string | undefined;
21
+ }, logger: logging.LoggerApi): void;
22
+ declare const _default: import("../../../../architect/src/internal").Builder<Schema & json.JsonObject>;
23
+ export default _default;
@@ -0,0 +1,309 @@
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.log = exports.execute = void 0;
34
+ const architect_1 = require("@angular-devkit/architect");
35
+ const core_1 = require("@angular-devkit/core");
36
+ const path_1 = require("path");
37
+ const rxjs_1 = require("rxjs");
38
+ const operators_1 = require("rxjs/operators");
39
+ const url = __importStar(require("url"));
40
+ const error_1 = require("../../utils/error");
41
+ const utils_1 = require("./utils");
42
+ /** Log messages to ignore and not rely to the logger */
43
+ const IGNORED_STDOUT_MESSAGES = [
44
+ 'server listening on',
45
+ 'Angular is running in development mode. Call enableProdMode() to enable production mode.',
46
+ ];
47
+ function execute(options, context) {
48
+ const browserTarget = (0, architect_1.targetFromTargetString)(options.browserTarget);
49
+ const serverTarget = (0, architect_1.targetFromTargetString)(options.serverTarget);
50
+ const getBaseUrl = (bs) => `${bs.getOption('scheme')}://${bs.getOption('host')}:${bs.getOption('port')}`;
51
+ const browserTargetRun = context.scheduleTarget(browserTarget, {
52
+ watch: options.watch,
53
+ progress: options.progress,
54
+ verbose: options.verbose,
55
+ // Disable bundle budgets are these are not meant to be used with a dev-server as this will add extra JavaScript for live-reloading.
56
+ budgets: [],
57
+ });
58
+ const serverTargetRun = context.scheduleTarget(serverTarget, {
59
+ watch: options.watch,
60
+ progress: options.progress,
61
+ verbose: options.verbose,
62
+ });
63
+ const bsInstance = require('browser-sync').create();
64
+ context.logger.error(core_1.tags.stripIndents `
65
+ ****************************************************************************************
66
+ This is a simple server for use in testing or debugging Angular applications locally.
67
+ It hasn't been reviewed for security issues.
68
+
69
+ DON'T USE IT FOR PRODUCTION!
70
+ ****************************************************************************************
71
+ `);
72
+ return (0, rxjs_1.zip)(browserTargetRun, serverTargetRun, (0, utils_1.getAvailablePort)()).pipe((0, operators_1.switchMap)(([br, sr, nodeServerPort]) => {
73
+ return (0, rxjs_1.combineLatest)([br.output, sr.output]).pipe(
74
+ // This is needed so that if both server and browser emit close to each other
75
+ // we only emit once. This typically happens on the first build.
76
+ (0, operators_1.debounceTime)(120), (0, operators_1.switchMap)(([b, s]) => {
77
+ if (!s.success || !b.success) {
78
+ return (0, rxjs_1.of)([b, s]);
79
+ }
80
+ return startNodeServer(s, nodeServerPort, context.logger, !!options.inspect).pipe((0, operators_1.mapTo)([b, s]), (0, operators_1.catchError)((err) => {
81
+ context.logger.error(`A server error has occurred.\n${mapErrorToMessage(err)}`);
82
+ return rxjs_1.EMPTY;
83
+ }));
84
+ }), (0, operators_1.map)(([b, s]) => [
85
+ {
86
+ success: b.success && s.success,
87
+ error: b.error || s.error,
88
+ },
89
+ nodeServerPort,
90
+ ]), (0, operators_1.tap)(([builderOutput]) => {
91
+ if (builderOutput.success) {
92
+ context.logger.info('\nCompiled successfully.');
93
+ }
94
+ }), (0, operators_1.debounce)(([builderOutput]) => builderOutput.success && !options.inspect
95
+ ? (0, utils_1.waitUntilServerIsListening)(nodeServerPort)
96
+ : rxjs_1.EMPTY), (0, operators_1.finalize)(() => {
97
+ void br.stop();
98
+ void sr.stop();
99
+ }));
100
+ }), (0, operators_1.concatMap)(([builderOutput, nodeServerPort]) => {
101
+ if (!builderOutput.success) {
102
+ return (0, rxjs_1.of)(builderOutput);
103
+ }
104
+ if (bsInstance.active) {
105
+ bsInstance.reload();
106
+ return (0, rxjs_1.of)(builderOutput);
107
+ }
108
+ else {
109
+ return (0, rxjs_1.from)(initBrowserSync(bsInstance, nodeServerPort, options, context)).pipe((0, operators_1.tap)((bs) => {
110
+ const baseUrl = getBaseUrl(bs);
111
+ context.logger.info(core_1.tags.oneLine `
112
+ **
113
+ Angular Universal Live Development Server is listening on ${baseUrl},
114
+ open your browser on ${baseUrl}
115
+ **
116
+ `);
117
+ }), (0, operators_1.mapTo)(builderOutput));
118
+ }
119
+ }), (0, operators_1.map)((builderOutput) => ({
120
+ success: builderOutput.success,
121
+ error: builderOutput.error,
122
+ baseUrl: getBaseUrl(bsInstance),
123
+ port: bsInstance.getOption('port'),
124
+ })), (0, operators_1.finalize)(() => {
125
+ if (bsInstance) {
126
+ bsInstance.exit();
127
+ bsInstance.cleanup();
128
+ }
129
+ }), (0, operators_1.catchError)((error) => (0, rxjs_1.of)({
130
+ success: false,
131
+ error: mapErrorToMessage(error),
132
+ })));
133
+ }
134
+ exports.execute = execute;
135
+ // Logs output to the terminal.
136
+ // Removes any trailing new lines from the output.
137
+ function log({ stderr, stdout }, logger) {
138
+ if (stderr) {
139
+ // Strip the webpack scheme (webpack://) from error log.
140
+ logger.error(stderr.replace(/\n?$/, '').replace(/webpack:\/\//g, '.'));
141
+ }
142
+ if (stdout && !IGNORED_STDOUT_MESSAGES.some((x) => stdout.includes(x))) {
143
+ logger.info(stdout.replace(/\n?$/, ''));
144
+ }
145
+ }
146
+ exports.log = log;
147
+ function startNodeServer(serverOutput, port, logger, inspectMode = false) {
148
+ const outputPath = serverOutput.outputPath;
149
+ const path = (0, path_1.join)(outputPath, 'main.js');
150
+ const env = { ...process.env, PORT: '' + port };
151
+ const args = ['--enable-source-maps', `"${path}"`];
152
+ if (inspectMode) {
153
+ args.unshift('--inspect-brk');
154
+ }
155
+ return (0, rxjs_1.of)(null).pipe((0, operators_1.delay)(0), // Avoid EADDRINUSE error since it will cause the kill event to be finish.
156
+ (0, operators_1.switchMap)(() => (0, utils_1.spawnAsObservable)('node', args, { env, shell: true })), (0, operators_1.tap)((res) => log({ stderr: res.stderr, stdout: res.stdout }, logger)), (0, operators_1.ignoreElements)(),
157
+ // Emit a signal after the process has been started
158
+ (0, operators_1.startWith)(undefined));
159
+ }
160
+ async function initBrowserSync(browserSyncInstance, nodeServerPort, options, context) {
161
+ if (browserSyncInstance.active) {
162
+ return browserSyncInstance;
163
+ }
164
+ const { port: browserSyncPort, open, host, publicHost, proxyConfig } = options;
165
+ const bsPort = browserSyncPort || (await (0, utils_1.getAvailablePort)());
166
+ const bsOptions = {
167
+ proxy: {
168
+ target: `localhost:${nodeServerPort}`,
169
+ proxyOptions: {
170
+ xfwd: true,
171
+ },
172
+ proxyRes: [
173
+ (proxyRes) => {
174
+ if ('headers' in proxyRes) {
175
+ proxyRes.headers['cache-control'] = undefined;
176
+ }
177
+ },
178
+ ],
179
+ // proxyOptions is not in the typings
180
+ },
181
+ host,
182
+ port: bsPort,
183
+ ui: false,
184
+ server: false,
185
+ notify: false,
186
+ ghostMode: false,
187
+ logLevel: options.verbose ? 'debug' : 'silent',
188
+ open,
189
+ https: getSslConfig(context.workspaceRoot, options),
190
+ };
191
+ const publicHostNormalized = publicHost && publicHost.endsWith('/')
192
+ ? publicHost.substring(0, publicHost.length - 1)
193
+ : publicHost;
194
+ if (publicHostNormalized) {
195
+ const { protocol, hostname, port, pathname } = url.parse(publicHostNormalized);
196
+ const defaultSocketIoPath = '/browser-sync/socket.io';
197
+ const defaultNamespace = '/browser-sync';
198
+ const hasPathname = !!(pathname && pathname !== '/');
199
+ const namespace = hasPathname ? pathname + defaultNamespace : defaultNamespace;
200
+ const path = hasPathname ? pathname + defaultSocketIoPath : defaultSocketIoPath;
201
+ bsOptions.socket = {
202
+ namespace,
203
+ path,
204
+ domain: url.format({
205
+ protocol,
206
+ hostname,
207
+ port,
208
+ }),
209
+ };
210
+ // When having a pathname we also need to create a reverse proxy because socket.io
211
+ // will be listening on: 'http://localhost:4200/ssr/browser-sync/socket.io'
212
+ // However users will typically have a reverse proxy that will redirect all matching requests
213
+ // ex: http://testinghost.com/ssr -> http://localhost:4200 which will result in a 404.
214
+ if (hasPathname) {
215
+ const { createProxyMiddleware } = await Promise.resolve().then(() => __importStar(require('http-proxy-middleware')));
216
+ // Remove leading slash
217
+ // eslint-disable-next-line @typescript-eslint/no-unused-expressions
218
+ (bsOptions.scriptPath = (p) => p.substring(1)),
219
+ (bsOptions.middleware = [
220
+ createProxyMiddleware(defaultSocketIoPath, {
221
+ target: url.format({
222
+ protocol: 'http',
223
+ hostname: host,
224
+ port: bsPort,
225
+ pathname: path,
226
+ }),
227
+ ws: true,
228
+ logLevel: 'silent',
229
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
230
+ }),
231
+ ]);
232
+ }
233
+ }
234
+ if (proxyConfig) {
235
+ if (!bsOptions.middleware) {
236
+ bsOptions.middleware = [];
237
+ }
238
+ else if (!Array.isArray(bsOptions.middleware)) {
239
+ bsOptions.middleware = [bsOptions.middleware];
240
+ }
241
+ bsOptions.middleware = [
242
+ ...bsOptions.middleware,
243
+ ...(await getProxyConfig(context.workspaceRoot, proxyConfig)),
244
+ ];
245
+ }
246
+ return new Promise((resolve, reject) => {
247
+ browserSyncInstance.init(bsOptions, (error, bs) => {
248
+ if (error) {
249
+ reject(error);
250
+ }
251
+ else {
252
+ resolve(bs);
253
+ }
254
+ });
255
+ });
256
+ }
257
+ function mapErrorToMessage(error) {
258
+ if (error instanceof Error) {
259
+ return error.message;
260
+ }
261
+ if (typeof error === 'string') {
262
+ return error;
263
+ }
264
+ return '';
265
+ }
266
+ function getSslConfig(root, options) {
267
+ const { ssl, sslCert, sslKey } = options;
268
+ if (ssl && sslCert && sslKey) {
269
+ return {
270
+ key: (0, path_1.resolve)(root, sslKey),
271
+ cert: (0, path_1.resolve)(root, sslCert),
272
+ };
273
+ }
274
+ return ssl;
275
+ }
276
+ async function getProxyConfig(root, proxyConfig) {
277
+ const proxyPath = (0, path_1.resolve)(root, proxyConfig);
278
+ let proxySettings;
279
+ try {
280
+ proxySettings = require(proxyPath);
281
+ }
282
+ catch (error) {
283
+ (0, error_1.assertIsError)(error);
284
+ if (error.code === 'MODULE_NOT_FOUND') {
285
+ throw new Error(`Proxy config file ${proxyPath} does not exist.`);
286
+ }
287
+ throw error;
288
+ }
289
+ const proxies = Array.isArray(proxySettings) ? proxySettings : [proxySettings];
290
+ const createdProxies = [];
291
+ const { createProxyMiddleware } = await Promise.resolve().then(() => __importStar(require('http-proxy-middleware')));
292
+ for (const proxy of proxies) {
293
+ for (const [key, context] of Object.entries(proxy)) {
294
+ if (typeof key === 'string') {
295
+ createdProxies.push(createProxyMiddleware(key.replace(/^\*$/, '**').replace(/\/\*$/, ''),
296
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
297
+ context));
298
+ }
299
+ else {
300
+ createdProxies.push(
301
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
302
+ createProxyMiddleware(key, context));
303
+ }
304
+ }
305
+ }
306
+ return createdProxies;
307
+ }
308
+ exports.default = (0, architect_1.createBuilder)(execute);
309
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9hbmd1bGFyX2RldmtpdC9idWlsZF9hbmd1bGFyL3NyYy9idWlsZGVycy9zc3ItZGV2LXNlcnZlci9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUE7Ozs7OztHQU1HOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUVILHlEQUttQztBQUNuQywrQ0FBMkQ7QUFRM0QsK0JBQW9EO0FBQ3BELCtCQUF1RTtBQUN2RSw4Q0Fhd0I7QUFDeEIseUNBQTJCO0FBQzNCLDZDQUFrRDtBQUdsRCxtQ0FBMEY7QUFFMUYsd0RBQXdEO0FBQ3hELE1BQU0sdUJBQXVCLEdBQUc7SUFDOUIscUJBQXFCO0lBQ3JCLDBGQUEwRjtDQUMzRixDQUFDO0FBUUYsU0FBZ0IsT0FBTyxDQUNyQixPQUFtQyxFQUNuQyxPQUF1QjtJQUV2QixNQUFNLGFBQWEsR0FBRyxJQUFBLGtDQUFzQixFQUFDLE9BQU8sQ0FBQyxhQUFhLENBQUMsQ0FBQztJQUNwRSxNQUFNLFlBQVksR0FBRyxJQUFBLGtDQUFzQixFQUFDLE9BQU8sQ0FBQyxZQUFZLENBQUMsQ0FBQztJQUNsRSxNQUFNLFVBQVUsR0FBRyxDQUFDLEVBQXVCLEVBQUUsRUFBRSxDQUM3QyxHQUFHLEVBQUUsQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLE1BQU0sRUFBRSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsSUFBSSxFQUFFLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUM7SUFDaEYsTUFBTSxnQkFBZ0IsR0FBRyxPQUFPLENBQUMsY0FBYyxDQUFDLGFBQWEsRUFBRTtRQUM3RCxLQUFLLEVBQUUsT0FBTyxDQUFDLEtBQUs7UUFDcEIsUUFBUSxFQUFFLE9BQU8sQ0FBQyxRQUFRO1FBQzFCLE9BQU8sRUFBRSxPQUFPLENBQUMsT0FBTztRQUN4QixvSUFBb0k7UUFDcEksT0FB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R0FBRyxLQUFLLFFBQVEsRUFBRTtnQkFDM0IsY0FBYyxDQUFDLElBQUksQ0FDakIscUJBQXFCLENBQ25CLEdBQUcsQ0FBQyxPQUFPLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxDQUFDLE9BQU8sQ0FBQyxPQUFPLEVBQUUsRUFBRSxDQUFDO2dCQUM5Qyw4REFBOEQ7Z0JBQzlELE9BQWMsQ0FDTSxDQUN2QixDQUFDO2FBQ0g7aUJBQU07Z0JBQ0wsY0FBYyxDQUFDLElBQUk7Z0JBQ2pCLDhEQUE4RDtnQkFDOUQscUJBQXFCLENBQUMsR0FBRyxFQUFFLE9BQWMsQ0FBc0IsQ0FDaEUsQ0FBQzthQUNIO1NBQ0Y7S0FDRjtJQUVELE9BQU8sY0FBYyxDQUFDO0FBQ3hCLENBQUM7QUFFRCxrQkFBZSxJQUFBLHlCQUFhLEVBQTRDLE9BQU8sQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IEdvb2dsZSBMTEMgQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqXG4gKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZVxuICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZVxuICovXG5cbmltcG9ydCB7XG4gIEJ1aWxkZXJDb250ZXh0LFxuICBCdWlsZGVyT3V0cHV0LFxuICBjcmVhdGVCdWlsZGVyLFxuICB0YXJnZXRGcm9tVGFyZ2V0U3RyaW5nLFxufSBmcm9tICdAYW5ndWxhci1kZXZraXQvYXJjaGl0ZWN0JztcbmltcG9ydCB7IGpzb24sIGxvZ2dpbmcsIHRhZ3MgfSBmcm9tICdAYW5ndWxhci1kZXZraXQvY29yZSc7XG5pbXBvcnQgdHlwZSB7XG4gIEJyb3dzZXJTeW5jSW5zdGFuY2UsXG4gIE9wdGlvbnMgYXMgQnJvd3NlclN5bmNPcHRpb25zLFxuICBIdHRwc09wdGlvbnMsXG4gIE1pZGRsZXdhcmVIYW5kbGVyLFxuICBQcm94eU9wdGlvbnMsXG59IGZyb20gJ2Jyb3dzZXItc3luYyc7XG5pbXBvcnQgeyBqb2luLCByZXNvbHZlIGFzIHBhdGhSZXNvbHZlIH0gZnJvbSAncGF0aCc7XG5pbXBvcnQgeyBFTVBUWSwgT2JzZXJ2YWJsZSwgY29tYmluZUxhdGVzdCwgZnJvbSwgb2YsIHppcCB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHtcbiAgY2F0Y2hFcnJvcixcbiAgY29uY2F0TWFwLFxuICBkZWJvdW5jZSxcbiAgZGVib3VuY2VUaW1lLFxuICBkZWxheSxcbiAgZmluYWxpemUsXG4gIGlnbm9yZUVsZW1lbnRzLFxuICBtYXAsXG4gIG1hcFRvLFxuICBzdGFydFdpdGgsXG4gIHN3aXRjaE1hcCxcbiAgdGFwLFxufSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQgKiBhcyB1cmwgZnJvbSAndXJsJztcbmltcG9ydCB7IGFzc2VydElzRXJyb3IgfSBmcm9tICcuLi8uLi91dGlscy9lcnJvcic7XG5pbXBvcnQgeyBTY2hlbWEgfSBmcm9tICcuL3NjaGVtYSc7XG5cbmltcG9ydCB7IGdldEF2YWlsYWJsZVBvcnQsIHNwYXduQXNPYnNlcnZhYmxlLCB3YWl0VW50aWxTZXJ2ZXJJc0xpc3RlbmluZyB9IGZyb20gJy4vdXRpbHMnO1xuXG4vKiogTG9nIG1lc3NhZ2VzIHRvIGlnbm9yZSBhbmQgbm90IHJlbHkgdG8gdGhlIGxvZ2dlciAqL1xuY29uc3QgSUdOT1JFRF9TVERPVVRfTUVTU0FHRVMgPSBbXG4gICdzZXJ2ZXIgbGlzdGVuaW5nIG9uJyxcbiAgJ0FuZ3VsYXIgaXMgcnVubmluZyBpbiBkZXZlbG9wbWVudCBtb2RlLiBDYWxsIGVuYWJsZVByb2RNb2RlKCkgdG8gZW5hYmxlIHByb2R1Y3Rpb24gbW9kZS4nLFxuXTtcblxudHlwZSBTU1JEZXZTZXJ2ZXJCdWlsZGVyT3B0aW9ucyA9IFNjaGVtYSAmIGpzb24uSnNvbk9iamVjdDtcbmV4cG9ydCB0eXBlIFNTUkRldlNlcnZlckJ1aWxkZXJPdXRwdXQgPSBCdWlsZGVyT3V0cHV0ICYge1xuICBiYXNlVXJsPzogc3RyaW5nO1xuICBwb3J0Pzogc3RyaW5nO1xufTtcblxuZXhwb3J0IGZ1bmN0aW9uIGV4ZWN1dGUoXG4gIG9wdGlvbnM6IFNTUkRldlNlcnZlckJ1aWxkZXJPcHRpb25zLFxuICBjb250ZXh0OiBCdWlsZGVyQ29udGV4dCxcbik6IE9ic2VydmFibGU8U1NSRGV2U2VydmVyQnVpbGRlck91dHB1dD4ge1xuICBjb25zdCBicm93c2VyVGFyZ2V0ID0gdGFyZ2V0RnJvbVRhcmdldFN0cmluZyhvcHRpb25zLmJyb3dzZXJUYXJnZXQpO1xuICBjb25zdCBzZXJ2ZXJUYXJnZXQgPSB0YXJnZXRGcm9tVGFyZ2V0U3RyaW5nKG9wdGlvbnMuc2VydmVyVGFyZ2V0KTtcbiAgY29uc3QgZ2V0QmFzZVVybCA9IChiczogQnJvd3NlclN5bmNJbnN0YW5jZSkgPT5cbiAgICBgJHticy5nZXRPcHRpb24oJ3NjaGVtZScpfTovLyR7YnMuZ2V0T3B0aW9uKCdob3N0Jyl9OiR7YnMuZ2V0T3B0aW9uKCdwb3J0Jyl9YDtcbiAgY29uc3QgYnJvd3NlclRhcmdldFJ1biA9IGNvbnRleHQuc2NoZWR1bGVUYXJnZXQoYnJvd3NlclRhcmdldCwge1xuICAgIHdhdGNoOiBvcHRpb25zLndhdGNoLFxuICAgIHByb2dyZXNzOiBvcHRpb25zLnByb2dyZXNzLFxuICAgIHZlcmJvc2U6IG9wdGlvbnMudmVyYm9zZSxcbiAgICAvLyBEaXNhYmxlIGJ1bmRsZSBidWRnZXRzIGFyZSB0aGVzZSBhcmUgbm90IG1lYW50IHRvIGJlIHVzZWQgd2l0aCBhIGRldi1zZXJ2ZXIgYXMgdGhpcyB3aWxsIGFkZCBleHRyYSBKYXZhU2NyaXB0IGZvciBsaXZlLXJlbG9hZGluZy5cbiAgICBidWRnZXRzOiBbXSxcbiAgfSBhcyBqc29uLkpzb25PYmplY3QpO1xuXG4gIGNvbnN0IHNlcnZlclRhcmdldFJ1biA9IGNvbnRleHQuc2NoZWR1bGVUYXJnZXQoc2VydmVyVGFyZ2V0LCB7XG4gICAgd2F0Y2g6IG9wdGlvbnMud2F0Y2gsXG4gICAgcHJvZ3Jlc3M6IG9wdGlvbnMucHJvZ3Jlc3MsXG4gICAgdmVyYm9zZTogb3B0aW9ucy52ZXJib3NlLFxuICB9IGFzIGpzb24uSnNvbk9iamVjdCk7XG5cbiAgY29uc3QgYnNJbnN0YW5jZSA9IHJlcXVpcmUoJ2Jyb3dzZXItc3luYycpLmNyZWF0ZSgpO1xuXG4gIGNvbnRleHQubG9nZ2VyLmVycm9yKHRhZ3Muc3RyaXBJbmRlbnRzYFxuICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIFRoaXMgaXMgYSBzaW1wbGUgc2VydmVyIGZvciB1c2UgaW4gdGVzdGluZyBvciBkZWJ1Z2dpbmcgQW5ndWxhciBhcHBsaWNhdGlvbnMgbG9jYWxseS5cbiAgSXQgaGFzbid0IGJlZW4gcmV2aWV3ZWQgZm9yIHNlY3VyaXR5IGlzc3Vlcy5cblxuICBET04nVCBVU0UgSVQgRk9SIFBST0RVQ1RJT04hXG4gICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiBgKTtcblxuICByZXR1cm4gemlwKGJyb3dzZXJUYXJnZXRSdW4sIHNlcnZlclRhcmdldFJ1biwgZ2V0QXZhaWxhYmxlUG9ydCgpKS5waXBlKFxuICAgIHN3aXRjaE1hcCgoW2JyLCBzciwgbm9kZVNlcnZlclBvcnRdKSA9PiB7XG4gICAgICByZXR1cm4gY29tYmluZUxhdGVzdChbYnIub3V0cHV0LCBzci5vdXRwdXRdKS5waXBlKFxuICAgICAgICAvLyBUaGlzIGlzIG5lZWRlZCBzbyB0aGF0IGlmIGJvdGggc2VydmVyIGFuZCBicm93c2VyIGVtaXQgY2xvc2UgdG8gZWFjaCBvdGhlclxuICAgICAgICAvLyB3ZSBvbmx5IGVtaXQgb25jZS4gVGhpcyB0eXBpY2FsbHkgaGFwcGVucyBvbiB0aGUgZmlyc3QgYnVpbGQuXG4gICAgICAgIGRlYm91bmNlVGltZSgxMjApLFxuICAgICAgICBzd2l0Y2hNYXAoKFtiLCBzXSkgPT4ge1xuICAgICAgICAgIGlmICghcy5zdWNjZXNzIHx8ICFiLnN1Y2Nlc3MpIHtcbiAgICAgICAgICAgIHJldHVybiBvZihbYiwgc10pO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHJldHVybiBzdGFydE5vZGVTZXJ2ZXIocywgbm9kZVNlcnZlclBvcnQsIGNvbnRleHQubG9nZ2VyLCAhIW9wdGlvbnMuaW5zcGVjdCkucGlwZShcbiAgICAgICAgICAgIG1hcFRvKFtiLCBzXSksXG4gICAgICAgICAgICBjYXRjaEVycm9yKChlcnIpID0+IHtcbiAgICAgICAgICAgICAgY29udGV4dC5sb2dnZXIuZXJyb3IoYEEgc2VydmVyIGVycm9yIGhhcyBvY2N1cnJlZC5cXG4ke21hcEVycm9yVG9NZXNzYWdlKGVycil9YCk7XG5cbiAgICAgICAgICAgICAgcmV0dXJuIEVNUFRZO1xuICAgICAgICAgICAgfSksXG4gICAgICAgICAgKTtcbiAgICAgICAgfSksXG4gICAgICAgIG1hcChcbiAgICAgICAgICAoW2IsIHNdKSA9PlxuICAgICAgICAgICAgW1xuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgc3VjY2VzczogYi5zdWNjZXNzICYmIHMuc3VjY2VzcyxcbiAgICAgICAgICAgICAgICBlcnJvcjogYi5lcnJvciB8fCBzLmVycm9yLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICBub2RlU2VydmVyUG9ydCxcbiAgICAgICAgICAgIF0gYXMgW1NTUkRldlNlcnZlckJ1aWxkZXJPdXRwdXQsIG51bWJlcl0sXG4gICAgICAgICksXG4gICAgICAgIHRhcCgoW2J1aWxkZXJPdXRwdXRdKSA9PiB7XG4gICAgICAgICAgaWYgKGJ1aWxkZXJPdXRwdXQuc3VjY2Vzcykge1xuICAgICAgICAgICAgY29udGV4dC5sb2dnZXIuaW5mbygnXFxuQ29tcGlsZWQgc3VjY2Vzc2Z1bGx5LicpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSksXG4gICAgICAgIGRlYm91bmNlKChbYnVpbGRlck91dHB1dF0pID0+XG4gICAgICAgICAgYnVpbGRlck91dHB1dC5zdWNjZXNzICYmICFvcHRpb25zLmluc3BlY3RcbiAgICAgICAgICAgID8gd2FpdFVudGlsU2VydmVySXNMaXN0ZW5pbmcobm9kZVNlcnZlclBvcnQpXG4gICAgICAgICAgICA6IEVNUFRZLFxuICAgICAgICApLFxuICAgICAgICBmaW5hbGl6ZSgoKSA9PiB7XG4gICAgICAgICAgdm9pZCBici5zdG9wKCk7XG4gICAgICAgICAgdm9pZCBzci5zdG9wKCk7XG4gICAgICAgIH0pLFxuICAgICAgKTtcbiAgICB9KSxcbiAgICBjb25jYXRNYXAoKFtidWlsZGVyT3V0cHV0LCBub2RlU2VydmVyUG9ydF0pID0+IHtcbiAgICAgIGlmICghYnVpbGRlck91dHB1dC5zdWNjZXNzKSB7XG4gICAgICAgIHJldHVybiBvZihidWlsZGVyT3V0cHV0KTtcbiAgICAgIH1cblxuICAgICAgaWYgKGJzSW5zdGFuY2UuYWN0aXZlKSB7XG4gICAgICAgIGJzSW5zdGFuY2UucmVsb2FkKCk7XG5cbiAgICAgICAgcmV0dXJuIG9mKGJ1aWxkZXJPdXRwdXQpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIGZyb20oaW5pdEJyb3dzZXJTeW5jKGJzSW5zdGFuY2UsIG5vZGVTZXJ2ZXJQb3J0LCBvcHRpb25zLCBjb250ZXh0KSkucGlwZShcbiAgICAgICAgICB0YXAoKGJzKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBiYXNlVXJsID0gZ2V0QmFzZVVybChicyk7XG4gICAgICAgICAgICBjb250ZXh0LmxvZ2dlci5pbmZvKHRhZ3Mub25lTGluZWBcbiAgICAgICAgICAgICAgICAqKlxuICAgICAgICAgICAgICAgIEFuZ3VsYXIgVW5pdmVyc2FsIExpdmUgRGV2ZWxvcG1lbnQgU2VydmVyIGlzIGxpc3RlbmluZyBvbiAke2Jhc2VVcmx9LFxuICAgICAgICAgICAgICAgIG9wZW4geW91ciBicm93c2VyIG9uICR7YmFzZVVybH1cbiAgICAgICAgICAgICAgICAqKlxuICAgICAgICAgICAgICBgKTtcbiAgICAgICAgICB9KSxcbiAgICAgICAgICBtYXBUbyhidWlsZGVyT3V0cHV0KSxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9KSxcbiAgICBtYXAoXG4gICAgICAoYnVpbGRlck91dHB1dCkgPT5cbiAgICAgICAgKHtcbiAgICAgICAgICBzdWNjZXNzOiBidWlsZGVyT3V0cHV0LnN1Y2Nlc3MsXG4gICAgICAgICAgZXJyb3I6IGJ1aWxkZXJPdXRwdXQuZXJyb3IsXG4gICAgICAgICAgYmFzZVVybDogZ2V0QmFzZVVybChic0luc3RhbmNlKSxcbiAgICAgICAgICBwb3J0OiBic0luc3RhbmNlLmdldE9wdGlvbigncG9ydCcpLFxuICAgICAgICB9KSBhcyBTU1JEZXZTZXJ2ZXJCdWlsZGVyT3V0cHV0LFxuICAgICksXG4gICAgZmluYWxpemUoKCkgPT4ge1xuICAgICAgaWYgKGJzSW5zdGFuY2UpIHtcbiAgICAgICAgYnNJbnN0YW5jZS5leGl0KCk7XG4gICAgICAgIGJzSW5zdGFuY2UuY2xlYW51cCgpO1xuICAgICAgfVxuICAgIH0pLFxuICAgIGNhdGNoRXJyb3IoKGVycm9yKSA9PlxuICAgICAgb2Yoe1xuICAgICAgICBzdWNjZXNzOiBmYWxzZSxcbiAgICAgICAgZXJyb3I6IG1hcEVycm9yVG9NZXNzYWdlKGVycm9yKSxcbiAgICAgIH0pLFxuICAgICksXG4gICk7XG59XG5cbi8vIExvZ3Mgb3V0cHV0IHRvIHRoZSB0ZXJtaW5hbC5cbi8vIFJlbW92ZXMgYW55IHRyYWlsaW5nIG5ldyBsaW5lcyBmcm9tIHRoZSBvdXRwdXQuXG5leHBvcnQgZnVuY3Rpb24gbG9nKFxuICB7IHN0ZGVyciwgc3Rkb3V0IH06IHsgc3RkZXJyOiBzdHJpbmcgfCB1bmRlZmluZWQ7IHN0ZG91dDogc3RyaW5nIHwgdW5kZWZpbmVkIH0sXG4gIGxvZ2dlcjogbG9nZ2luZy5Mb2dnZXJBcGksXG4pIHtcbiAgaWYgKHN0ZGVycikge1xuICAgIC8vIFN0cmlwIHRoZSB3ZWJwYWNrIHNjaGVtZSAod2VicGFjazovLykgZnJvbSBlcnJvciBsb2cuXG4gICAgbG9nZ2VyLmVycm9yKHN0ZGVyci5yZXBsYWNlKC9cXG4/JC8sICcnKS5yZXBsYWNlKC93ZWJwYWNrOlxcL1xcLy9nLCAnLicpKTtcbiAgfVxuXG4gIGlmIChzdGRvdXQgJiYgIUlHTk9SRURfU1RET1VUX01FU1NBR0VTLnNvbWUoKHgpID0+IHN0ZG91dC5pbmNsdWRlcyh4KSkpIHtcbiAgICBsb2dnZXIuaW5mbyhzdGRvdXQucmVwbGFjZSgvXFxuPyQvLCAnJykpO1xuICB9XG59XG5cbmZ1bmN0aW9uIHN0YXJ0Tm9kZVNlcnZlcihcbiAgc2VydmVyT3V0cHV0OiBCdWlsZGVyT3V0cHV0LFxuICBwb3J0OiBudW1iZXIsXG4gIGxvZ2dlcjogbG9nZ2luZy5Mb2dnZXJBcGksXG4gIGluc3BlY3RNb2RlID0gZmFsc2UsXG4pOiBPYnNlcnZhYmxlPHZvaWQ+IHtcbiAgY29uc3Qgb3V0cHV0UGF0aCA9IHNlcnZlck91dHB1dC5vdXRwdXRQYXRoIGFzIHN0cmluZztcbiAgY29uc3QgcGF0aCA9IGpvaW4ob3V0cHV0UGF0aCwgJ21haW4uanMnKTtcbiAgY29uc3QgZW52ID0geyAuLi5wcm9jZXNzLmVudiwgUE9SVDogJycgKyBwb3J0IH07XG5cbiAgY29uc3QgYXJncyA9IFsnLS1lbmFibGUtc291cmNlLW1hcHMnLCBgXCIke3BhdGh9XCJgXTtcbiAgaWYgKGluc3BlY3RNb2RlKSB7XG4gICAgYXJncy51bnNoaWZ0KCctLWluc3BlY3QtYnJrJyk7XG4gIH1cblxuICByZXR1cm4gb2YobnVsbCkucGlwZShcbiAgICBkZWxheSgwKSwgLy8gQXZvaWQgRUFERFJJTlVTRSBlcnJvciBzaW5jZSBpdCB3aWxsIGNhdXNlIHRoZSBraWxsIGV2ZW50IHRvIGJlIGZpbmlzaC5cbiAgICBzd2l0Y2hNYXAoKCkgPT4gc3Bhd25Bc09ic2VydmFibGUoJ25vZGUnLCBhcmdzLCB7IGVudiwgc2hlbGw6IHRydWUgfSkpLFxuICAgIHRhcCgocmVzKSA9PiBsb2coeyBzdGRlcnI6IHJlcy5zdGRlcnIsIHN0ZG91dDogcmVzLnN0ZG91dCB9LCBsb2dnZXIpKSxcbiAgICBpZ25vcmVFbGVtZW50cygpLFxuICAgIC8vIEVtaXQgYSBzaWduYWwgYWZ0ZXIgdGhlIHByb2Nlc3MgaGFzIGJlZW4gc3RhcnRlZFxuICAgIHN0YXJ0V2l0aCh1bmRlZmluZWQpLFxuICApO1xufVxuXG5hc3luYyBmdW5jdGlvbiBpbml0QnJvd3NlclN5bmMoXG4gIGJyb3dzZXJTeW5jSW5zdGFuY2U6IEJyb3dzZXJTeW5jSW5zdGFuY2UsXG4gIG5vZGVTZXJ2ZXJQb3J0OiBudW1iZXIsXG4gIG9wdGlvbnM6IFNTUkRldlNlcnZlckJ1aWxkZXJPcHRpb25zLFxuICBjb250ZXh0OiBCdWlsZGVyQ29udGV4dCxcbik6IFByb21pc2U8QnJvd3NlclN5bmNJbnN0YW5jZT4ge1xuICBpZiAoYnJvd3NlclN5bmNJbnN0YW5jZS5hY3RpdmUpIHtcbiAgICByZXR1cm4gYnJvd3NlclN5bmNJbnN0YW5jZTtcbiAgfVxuXG4gIGNvbnN0IHsgcG9ydDogYnJvd3NlclN5bmNQb3J0LCBvcGVuLCBob3N0LCBwdWJsaWNIb3N0LCBwcm94eUNvbmZpZyB9ID0gb3B0aW9ucztcbiAgY29uc3QgYnNQb3J0ID0gYnJvd3NlclN5bmNQb3J0IHx8IChhd2FpdCBnZXRBdmFpbGFibGVQb3J0KCkpO1xuICBjb25zdCBic09wdGlvbnM6IEJyb3dzZXJTeW5jT3B0aW9ucyA9IHtcbiAgICBwcm94eToge1xuICAgICAgdGFyZ2V0OiBgbG9jYWxob3N0OiR7bm9kZVNlcnZlclBvcnR9YCxcbiAgICAgIHByb3h5T3B0aW9uczoge1xuICAgICAgICB4ZndkOiB0cnVlLFxuICAgICAgfSxcbiAgICAgIHByb3h5UmVzOiBbXG4gICAgICAgIChwcm94eVJlcykgPT4ge1xuICAgICAgICAgIGlmICgnaGVhZGVycycgaW4gcHJveHlSZXMpIHtcbiAgICAgICAgICAgIHByb3h5UmVzLmhlYWRlcnNbJ2NhY2hlLWNvbnRyb2wnXSA9IHVuZGVmaW5lZDtcbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICBdLFxuICAgICAgLy8gcHJveHlPcHRpb25zIGlzIG5vdCBpbiB0aGUgdHlwaW5nc1xuICAgIH0gYXMgUHJveHlPcHRpb25zICYgeyBwcm94eU9wdGlvbnM6IHsgeGZ3ZDogYm9vbGVhbiB9IH0sXG4gICAgaG9zdCxcbiAgICBwb3J0OiBic1BvcnQsXG4gICAgdWk6IGZhbHNlLFxuICAgIHNlcnZlcjogZmFsc2UsXG4gICAgbm90aWZ5OiBmYWxzZSxcbiAgICBnaG9zdE1vZGU6IGZhbHNlLFxuICAgIGxvZ0xldmVsOiBvcHRpb25zLnZlcmJvc2UgPyAnZGVidWcnIDogJ3NpbGVudCcsXG4gICAgb3BlbixcbiAgICBodHRwczogZ2V0U3NsQ29uZmlnKGNvbnRleHQud29ya3NwYWNlUm9vdCwgb3B0aW9ucyksXG4gIH07XG5cbiAgY29uc3QgcHVibGljSG9zdE5vcm1hbGl6ZWQgPVxuICAgIHB1YmxpY0hvc3QgJiYgcHVibGljSG9zdC5lbmRzV2l0aCgnLycpXG4gICAgICA/IHB1YmxpY0hvc3Quc3Vic3RyaW5nKDAsIHB1YmxpY0hvc3QubGVuZ3RoIC0gMSlcbiAgICAgIDogcHVibGljSG9zdDtcblxuICBpZiAocHVibGljSG9zdE5vcm1hbGl6ZWQpIHtcbiAgICBjb25zdCB7IHByb3RvY29sLCBob3N0bmFtZSwgcG9ydCwgcGF0aG5hbWUgfSA9IHVybC5wYXJzZShwdWJsaWNIb3N0Tm9ybWFsaXplZCk7XG4gICAgY29uc3QgZGVmYXVsdFNvY2tldElvUGF0aCA9ICcvYnJvd3Nlci1zeW5jL3NvY2tldC5pbyc7XG4gICAgY29uc3QgZGVmYXVsdE5hbWVzcGFjZSA9ICcvYnJvd3Nlci1zeW5jJztcbiAgICBjb25zdCBoYXNQYXRobmFtZSA9ICEhKHBhdGhuYW1lICYmIHBhdGhuYW1lICE9PSAnLycpO1xuICAgIGNvbnN0IG5hbWVzcGFjZSA9IGhhc1BhdGhuYW1lID8gcGF0aG5hbWUgKyBkZWZhdWx0TmFtZXNwYWNlIDogZGVmYXVsdE5hbWVzcGFjZTtcbiAgICBjb25zdCBwYXRoID0gaGFzUGF0aG5hbWUgPyBwYXRobmFtZSArIGRlZmF1bHRTb2NrZXRJb1BhdGggOiBkZWZhdWx0U29ja2V0SW9QYXRoO1xuXG4gICAgYnNPcHRpb25zLnNvY2tldCA9IHtcbiAgICAgIG5hbWVzcGFjZSxcbiAgICAgIHBhdGgsXG4gICAgICBkb21haW46IHVybC5mb3JtYXQoe1xuICAgICAgICBwcm90b2NvbCxcbiAgICAgICAgaG9zdG5hbWUsXG4gICAgICAgIHBvcnQsXG4gICAgICB9KSxcbiAgICB9O1xuXG4gICAgLy8gV2hlbiBoYXZpbmcgYSBwYXRobmFtZSB3ZSBhbHNvIG5lZWQgdG8gY3JlYXRlIGEgcmV2ZXJzZSBwcm94eSBiZWNhdXNlIHNvY2tldC5pb1xuICAgIC8vIHdpbGwgYmUgbGlzdGVuaW5nIG9uOiAnaHR0cDovL2xvY2FsaG9zdDo0MjAwL3Nzci9icm93c2VyLXN5bmMvc29ja2V0LmlvJ1xuICAgIC8vIEhvd2V2ZXIgdXNlcnMgd2lsbCB0eXBpY2FsbHkgaGF2ZSBhIHJldmVyc2UgcHJveHkgdGhhdCB3aWxsIHJlZGlyZWN0IGFsbCBtYXRjaGluZyByZXF1ZXN0c1xuICAgIC8vIGV4OiBodHRwOi8vdGVzdGluZ2hvc3QuY29tL3NzciAtPiBodHRwOi8vbG9jYWxob3N0OjQyMDAgd2hpY2ggd2lsbCByZXN1bHQgaW4gYSA0MDQuXG4gICAgaWYgKGhhc1BhdGhuYW1lKSB7XG4gICAgICBjb25zdCB7IGNyZWF0ZVByb3h5TWlkZGxld2FyZSB9ID0gYXdhaXQgaW1wb3J0KCdodHRwLXByb3h5LW1pZGRsZXdhcmUnKTtcblxuICAgICAgLy8gUmVtb3ZlIGxlYWRpbmcgc2xhc2hcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLWV4cHJlc3Npb25zXG4gICAgICAoYnNPcHRpb25zLnNjcmlwdFBhdGggPSAocCkgPT4gcC5zdWJzdHJpbmcoMSkpLFxuICAgICAgICAoYnNPcHRpb25zLm1pZGRsZXdhcmUgPSBbXG4gICAgICAgICAgY3JlYXRlUHJveHlNaWRkbGV3YXJlKGRlZmF1bHRTb2NrZXRJb1BhdGgsIHtcbiAgICAgICAgICAgIHRhcmdldDogdXJsLmZvcm1hdCh7XG4gICAgICAgICAgICAgIHByb3RvY29sOiAnaHR0cCcsXG4gICAgICAgICAgICAgIGhvc3RuYW1lOiBob3N0LFxuICAgICAgICAgICAgICBwb3J0OiBic1BvcnQsXG4gICAgICAgICAgICAgIHBhdGhuYW1lOiBwYXRoLFxuICAgICAgICAgICAgfSksXG4gICAgICAgICAgICB3czogdHJ1ZSxcbiAgICAgICAgICAgIGxvZ0xldmVsOiAnc2lsZW50JyxcbiAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAgICAgICAgfSkgYXMgYW55LFxuICAgICAgICBdKTtcbiAgICB9XG4gIH1cblxuICBpZiAocHJveHlDb25maWcpIHtcbiAgICBpZiAoIWJzT3B0aW9ucy5taWRkbGV3YXJlKSB7XG4gICAgICBic09wdGlvbnMubWlkZGxld2FyZSA9IFtdO1xuICAgIH0gZWxzZSBpZiAoIUFycmF5LmlzQXJyYXkoYnNPcHRpb25zLm1pZGRsZXdhcmUpKSB7XG4gICAgICBic09wdGlvbnMubWlkZGxld2FyZSA9IFtic09wdGlvbnMubWlkZGxld2FyZV07XG4gICAgfVxuXG4gICAgYnNPcHRpb25zLm1pZGRsZXdhcmUgPSBbXG4gICAgICAuLi5ic09wdGlvbnMubWlkZGxld2FyZSxcbiAgICAgIC4uLihhd2FpdCBnZXRQcm94eUNvbmZpZyhjb250ZXh0LndvcmtzcGFjZVJvb3QsIHByb3h5Q29uZmlnKSksXG4gICAgXTtcbiAgfVxuXG4gIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgYnJvd3NlclN5bmNJbnN0YW5jZS5pbml0KGJzT3B0aW9ucywgKGVycm9yLCBicykgPT4ge1xuICAgICAgaWYgKGVycm9yKSB7XG4gICAgICAgIHJlamVjdChlcnJvcik7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXNvbHZlKGJzKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIG1hcEVycm9yVG9NZXNzYWdlKGVycm9yOiB1bmtub3duKTogc3RyaW5nIHtcbiAgaWYgKGVycm9yIGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICByZXR1cm4gZXJyb3IubWVzc2FnZTtcbiAgfVxuXG4gIGlmICh0eXBlb2YgZXJyb3IgPT09ICdzdHJpbmcnKSB7XG4gICAgcmV0dXJuIGVycm9yO1xuICB9XG5cbiAgcmV0dXJuICcnO1xufVxuXG5mdW5jdGlvbiBnZXRTc2xDb25maWcoXG4gIHJvb3Q6IHN0cmluZyxcbiAgb3B0aW9uczogU1NSRGV2U2VydmVyQnVpbGRlck9wdGlvbnMsXG4pOiBIdHRwc09wdGlvbnMgfCB1bmRlZmluZWQgfCBib29sZWFuIHtcbiAgY29uc3QgeyBzc2wsIHNzbENlcnQsIHNzbEtleSB9ID0gb3B0aW9ucztcbiAgaWYgKHNzbCAmJiBzc2xDZXJ0ICYmIHNzbEtleSkge1xuICAgIHJldHVybiB7XG4gICAgICBrZXk6IHBhdGhSZXNvbHZlKHJvb3QsIHNzbEtleSksXG4gICAgICBjZXJ0OiBwYXRoUmVzb2x2ZShyb290LCBzc2xDZXJ0KSxcbiAgICB9O1xuICB9XG5cbiAgcmV0dXJuIHNzbDtcbn1cblxuYXN5bmMgZnVuY3Rpb24gZ2V0UHJveHlDb25maWcocm9vdDogc3RyaW5nLCBwcm94eUNvbmZpZzogc3RyaW5nKTogUHJvbWlzZTxNaWRkbGV3YXJlSGFuZGxlcltdPiB7XG4gIGNvbnN0IHByb3h5UGF0aCA9IHBhdGhSZXNvbHZlKHJvb3QsIHByb3h5Q29uZmlnKTtcbiAgbGV0IHByb3h5U2V0dGluZ3M6IHVua25vd247XG4gIHRyeSB7XG4gICAgcHJveHlTZXR0aW5ncyA9IHJlcXVpcmUocHJveHlQYXRoKTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBhc3NlcnRJc0Vycm9yKGVycm9yKTtcblxuICAgIGlmIChlcnJvci5jb2RlID09PSAnTU9EVUxFX05PVF9GT1VORCcpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgUHJveHkgY29uZmlnIGZpbGUgJHtwcm94eVBhdGh9IGRvZXMgbm90IGV4aXN0LmApO1xuICAgIH1cblxuICAgIHRocm93IGVycm9yO1xuICB9XG5cbiAgY29uc3QgcHJveGllcyA9IEFycmF5LmlzQXJyYXkocHJveHlTZXR0aW5ncykgPyBwcm94eVNldHRpbmdzIDogW3Byb3h5U2V0dGluZ3NdO1xuICBjb25zdCBjcmVhdGVkUHJveGllcyA9IFtdO1xuICBjb25zdCB7IGNyZWF0ZVByb3h5TWlkZGxld2FyZSB9ID0gYXdhaXQgaW1wb3J0KCdodHRwLXByb3h5LW1pZGRsZXdhcmUnKTtcbiAgZm9yIChjb25zdCBwcm94eSBvZiBwcm94aWVzKSB7XG4gICAgZm9yIChjb25zdCBba2V5LCBjb250ZXh0XSBvZiBPYmplY3QuZW50cmllcyhwcm94eSkpIHtcbiAgICAgIGlmICh0eXBlb2Yga2V5ID09PSAnc3RyaW5nJykge1xuICAgICAgICBjcmVhdGVkUHJveGllcy5wdXNoKFxuICAgICAgICAgIGNyZWF0ZVByb3h5TWlkZGxld2FyZShcbiAgICAgICAgICAgIGtleS5yZXBsYWNlKC9eXFwqJC8sICcqKicpLnJlcGxhY2UoL1xcL1xcKiQvLCAnJyksXG4gICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICAgICAgICAgICAgY29udGV4dCBhcyBhbnksXG4gICAgICAgICAgKSBhcyBNaWRkbGV3YXJlSGFuZGxlcixcbiAgICAgICAgKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNyZWF0ZWRQcm94aWVzLnB1c2goXG4gICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICAgICAgICBjcmVhdGVQcm94eU1pZGRsZXdhcmUoa2V5LCBjb250ZXh0IGFzIGFueSkgYXMgTWlkZGxld2FyZUhhbmRsZXIsXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGNyZWF0ZWRQcm94aWVzO1xufVxuXG5leHBvcnQgZGVmYXVsdCBjcmVhdGVCdWlsZGVyPFNTUkRldlNlcnZlckJ1aWxkZXJPcHRpb25zLCBCdWlsZGVyT3V0cHV0PihleGVjdXRlKTtcbiJdfQ==
@@ -0,0 +1,64 @@
1
+ /**
2
+ * SSR Dev Server target options for Build Facade.
3
+ */
4
+ export interface Schema {
5
+ /**
6
+ * Browser target to build.
7
+ */
8
+ browserTarget: string;
9
+ /**
10
+ * Host to listen on.
11
+ */
12
+ host?: string;
13
+ /**
14
+ * Launch the development server in inspector mode and listen on address and port
15
+ * '127.0.0.1:9229'.
16
+ */
17
+ inspect?: boolean;
18
+ /**
19
+ * Opens the url in default browser.
20
+ */
21
+ open?: boolean;
22
+ /**
23
+ * Port to start the development server at. Default is 4200. Pass 0 to get a dynamically
24
+ * assigned port.
25
+ */
26
+ port?: number;
27
+ /**
28
+ * Log progress to the console while building.
29
+ */
30
+ progress?: boolean;
31
+ /**
32
+ * Proxy configuration file.
33
+ */
34
+ proxyConfig?: string;
35
+ /**
36
+ * The URL that the browser client should use to connect to the development server. Use for
37
+ * a complex dev server setup, such as one with reverse proxies.
38
+ */
39
+ publicHost?: string;
40
+ /**
41
+ * Server target to build.
42
+ */
43
+ serverTarget: string;
44
+ /**
45
+ * Serve using HTTPS.
46
+ */
47
+ ssl?: boolean;
48
+ /**
49
+ * SSL certificate to use for serving HTTPS.
50
+ */
51
+ sslCert?: string;
52
+ /**
53
+ * SSL key to use for serving HTTPS.
54
+ */
55
+ sslKey?: string;
56
+ /**
57
+ * Adds more details to output logging.
58
+ */
59
+ verbose?: boolean;
60
+ /**
61
+ * Rebuild on change.
62
+ */
63
+ watch?: boolean;
64
+ }
@@ -0,0 +1,5 @@
1
+ "use strict";
2
+ // THIS FILE IS AUTOMATICALLY GENERATED. TO UPDATE THIS FILE YOU NEED TO CHANGE THE
3
+ // CORRESPONDING JSON SCHEMA FILE, THEN RUN devkit-admin build (or bazel build ...).
4
+ Object.defineProperty(exports, "__esModule", { value: true });
5
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2NoZW1hLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vcGFja2FnZXMvYW5ndWxhcl9kZXZraXQvYnVpbGRfYW5ndWxhci9zcmMvYnVpbGRlcnMvc3NyLWRldi1zZXJ2ZXIvc2NoZW1hLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFDQSxtRkFBbUY7QUFDbkYsb0ZBQW9GIiwic291cmNlc0NvbnRlbnQiOlsiXG4vLyBUSElTIEZJTEUgSVMgQVVUT01BVElDQUxMWSBHRU5FUkFURUQuIFRPIFVQREFURSBUSElTIEZJTEUgWU9VIE5FRUQgVE8gQ0hBTkdFIFRIRVxuLy8gQ09SUkVTUE9ORElORyBKU09OIFNDSEVNQSBGSUxFLCBUSEVOIFJVTiBkZXZraXQtYWRtaW4gYnVpbGQgKG9yIGJhemVsIGJ1aWxkIC4uLikuXG5cbi8qKlxuICogU1NSIERldiBTZXJ2ZXIgdGFyZ2V0IG9wdGlvbnMgZm9yIEJ1aWxkIEZhY2FkZS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTY2hlbWEge1xuICAgIC8qKlxuICAgICAqIEJyb3dzZXIgdGFyZ2V0IHRvIGJ1aWxkLlxuICAgICAqL1xuICAgIGJyb3dzZXJUYXJnZXQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBIb3N0IHRvIGxpc3RlbiBvbi5cbiAgICAgKi9cbiAgICBob3N0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIExhdW5jaCB0aGUgZGV2ZWxvcG1lbnQgc2VydmVyIGluIGluc3BlY3RvciBtb2RlIGFuZCBsaXN0ZW4gb24gYWRkcmVzcyBhbmQgcG9ydFxuICAgICAqICcxMjcuMC4wLjE6OTIyOScuXG4gICAgICovXG4gICAgaW5zcGVjdD86IGJvb2xlYW47XG4gICAgLyoqXG4gICAgICogT3BlbnMgdGhlIHVybCBpbiBkZWZhdWx0IGJyb3dzZXIuXG4gICAgICovXG4gICAgb3Blbj86IGJvb2xlYW47XG4gICAgLyoqXG4gICAgICogUG9ydCB0byBzdGFydCB0aGUgZGV2ZWxvcG1lbnQgc2VydmVyIGF0LiBEZWZhdWx0IGlzIDQyMDAuIFBhc3MgMCB0byBnZXQgYSBkeW5hbWljYWxseVxuICAgICAqIGFzc2lnbmVkIHBvcnQuXG4gICAgICovXG4gICAgcG9ydD86IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBMb2cgcHJvZ3Jlc3MgdG8gdGhlIGNvbnNvbGUgd2hpbGUgYnVpbGRpbmcuXG4gICAgICovXG4gICAgcHJvZ3Jlc3M/OiBib29sZWFuO1xuICAgIC8qKlxuICAgICAqIFByb3h5IGNvbmZpZ3VyYXRpb24gZmlsZS5cbiAgICAgKi9cbiAgICBwcm94eUNvbmZpZz86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgVVJMIHRoYXQgdGhlIGJyb3dzZXIgY2xpZW50IHNob3VsZCB1c2UgdG8gY29ubmVjdCB0byB0aGUgZGV2ZWxvcG1lbnQgc2VydmVyLiBVc2UgZm9yXG4gICAgICogYSBjb21wbGV4IGRldiBzZXJ2ZXIgc2V0dXAsIHN1Y2ggYXMgb25lIHdpdGggcmV2ZXJzZSBwcm94aWVzLlxuICAgICAqL1xuICAgIHB1YmxpY0hvc3Q/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogU2VydmVyIHRhcmdldCB0byBidWlsZC5cbiAgICAgKi9cbiAgICBzZXJ2ZXJUYXJnZXQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBTZXJ2ZSB1c2luZyBIVFRQUy5cbiAgICAgKi9cbiAgICBzc2w/OiBib29sZWFuO1xuICAgIC8qKlxuICAgICAqIFNTTCBjZXJ0aWZpY2F0ZSB0byB1c2UgZm9yIHNlcnZpbmcgSFRUUFMuXG4gICAgICovXG4gICAgc3NsQ2VydD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBTU0wga2V5IHRvIHVzZSBmb3Igc2VydmluZyBIVFRQUy5cbiAgICAgKi9cbiAgICBzc2xLZXk/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQWRkcyBtb3JlIGRldGFpbHMgdG8gb3V0cHV0IGxvZ2dpbmcuXG4gICAgICovXG4gICAgdmVyYm9zZT86IGJvb2xlYW47XG4gICAgLyoqXG4gICAgICogUmVidWlsZCBvbiBjaGFuZ2UuXG4gICAgICovXG4gICAgd2F0Y2g/OiBib29sZWFuO1xufVxuIl19