@schematics/angular 16.1.0-next.2 → 16.1.0-rc.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.
@@ -0,0 +1,93 @@
1
+ "use strict";
2
+ /**
3
+ * @license
4
+ * Copyright Google LLC All Rights Reserved.
5
+ *
6
+ * Use of this source code is governed by an MIT-style license that can be
7
+ * found in the LICENSE file at https://angular.io/license
8
+ */
9
+ var __importDefault = (this && this.__importDefault) || function (mod) {
10
+ return (mod && mod.__esModule) ? mod : { "default": mod };
11
+ };
12
+ Object.defineProperty(exports, "__esModule", { value: true });
13
+ exports.findAppConfig = void 0;
14
+ const path_1 = require("path");
15
+ const typescript_1 = __importDefault(require("../../third_party/github.com/Microsoft/TypeScript/lib/typescript"));
16
+ const util_1 = require("./util");
17
+ /**
18
+ * Resolves the node that defines the app config from a bootstrap call.
19
+ * @param bootstrapCall Call for which to resolve the config.
20
+ * @param tree File tree of the project.
21
+ * @param filePath File path of the bootstrap call.
22
+ */
23
+ function findAppConfig(bootstrapCall, tree, filePath) {
24
+ if (bootstrapCall.arguments.length > 1) {
25
+ const config = bootstrapCall.arguments[1];
26
+ if (typescript_1.default.isObjectLiteralExpression(config)) {
27
+ return { filePath, node: config };
28
+ }
29
+ if (typescript_1.default.isIdentifier(config)) {
30
+ return resolveAppConfigFromIdentifier(config, tree, filePath);
31
+ }
32
+ }
33
+ return null;
34
+ }
35
+ exports.findAppConfig = findAppConfig;
36
+ /**
37
+ * Resolves the app config from an identifier referring to it.
38
+ * @param identifier Identifier referring to the app config.
39
+ * @param tree File tree of the project.
40
+ * @param bootstapFilePath Path of the bootstrap call.
41
+ */
42
+ function resolveAppConfigFromIdentifier(identifier, tree, bootstapFilePath) {
43
+ const sourceFile = identifier.getSourceFile();
44
+ for (const node of sourceFile.statements) {
45
+ // Only look at relative imports. This will break if the app uses a path
46
+ // mapping to refer to the import, but in order to resolve those, we would
47
+ // need knowledge about the entire program.
48
+ if (!typescript_1.default.isImportDeclaration(node) ||
49
+ !node.importClause?.namedBindings ||
50
+ !typescript_1.default.isNamedImports(node.importClause.namedBindings) ||
51
+ !typescript_1.default.isStringLiteralLike(node.moduleSpecifier) ||
52
+ !node.moduleSpecifier.text.startsWith('.')) {
53
+ continue;
54
+ }
55
+ for (const specifier of node.importClause.namedBindings.elements) {
56
+ if (specifier.name.text !== identifier.text) {
57
+ continue;
58
+ }
59
+ // Look for a variable with the imported name in the file. Note that ideally we would use
60
+ // the type checker to resolve this, but we can't because these utilities are set up to
61
+ // operate on individual files, not the entire program.
62
+ const filePath = (0, path_1.join)((0, path_1.dirname)(bootstapFilePath), node.moduleSpecifier.text + '.ts');
63
+ const importedSourceFile = (0, util_1.getSourceFile)(tree, filePath);
64
+ const resolvedVariable = findAppConfigFromVariableName(importedSourceFile, (specifier.propertyName || specifier.name).text);
65
+ if (resolvedVariable) {
66
+ return { filePath, node: resolvedVariable };
67
+ }
68
+ }
69
+ }
70
+ const variableInSameFile = findAppConfigFromVariableName(sourceFile, identifier.text);
71
+ return variableInSameFile ? { filePath: bootstapFilePath, node: variableInSameFile } : null;
72
+ }
73
+ /**
74
+ * Finds an app config within the top-level variables of a file.
75
+ * @param sourceFile File in which to search for the config.
76
+ * @param variableName Name of the variable containing the config.
77
+ */
78
+ function findAppConfigFromVariableName(sourceFile, variableName) {
79
+ for (const node of sourceFile.statements) {
80
+ if (typescript_1.default.isVariableStatement(node)) {
81
+ for (const decl of node.declarationList.declarations) {
82
+ if (typescript_1.default.isIdentifier(decl.name) &&
83
+ decl.name.text === variableName &&
84
+ decl.initializer &&
85
+ typescript_1.default.isObjectLiteralExpression(decl.initializer)) {
86
+ return decl.initializer;
87
+ }
88
+ }
89
+ }
90
+ }
91
+ return null;
92
+ }
93
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXBwX2NvbmZpZy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL3BhY2thZ2VzL3NjaGVtYXRpY3MvYW5ndWxhci91dGlsaXR5L3N0YW5kYWxvbmUvYXBwX2NvbmZpZy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUE7Ozs7OztHQU1HOzs7Ozs7QUFHSCwrQkFBcUM7QUFDckMsa0hBQWtGO0FBQ2xGLGlDQUF1QztBQVd2Qzs7Ozs7R0FLRztBQUNILFNBQWdCLGFBQWEsQ0FDM0IsYUFBZ0MsRUFDaEMsSUFBVSxFQUNWLFFBQWdCO0lBRWhCLElBQUksYUFBYSxDQUFDLFNBQVMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFO1FBQ3RDLE1BQU0sTUFBTSxHQUFHLGFBQWEsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFFMUMsSUFBSSxvQkFBRSxDQUFDLHlCQUF5QixDQUFDLE1BQU0sQ0FBQyxFQUFFO1lBQ3hDLE9BQU8sRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxDQUFDO1NBQ25DO1FBRUQsSUFBSSxvQkFBRSxDQUFDLFlBQVksQ0FBQyxNQUFNLENBQUMsRUFBRTtZQUMzQixPQUFPLDhCQUE4QixDQUFDLE1BQU0sRUFBRSxJQUFJLEVBQUUsUUFBUSxDQUFDLENBQUM7U0FDL0Q7S0FDRjtJQUVELE9BQU8sSUFBSSxDQUFDO0FBQ2QsQ0FBQztBQWxCRCxzQ0FrQkM7QUFFRDs7Ozs7R0FLRztBQUNILFNBQVMsOEJBQThCLENBQ3JDLFVBQXlCLEVBQ3pCLElBQVUsRUFDVixnQkFBd0I7SUFFeEIsTUFBTSxVQUFVLEdBQUcsVUFBVSxDQUFDLGFBQWEsRUFBRSxDQUFDO0lBRTlDLEtBQUssTUFBTSxJQUFJLElBQUksVUFBVSxDQUFDLFVBQVUsRUFBRTtRQUN4Qyx3RUFBd0U7UUFDeEUsMEVBQTBFO1FBQzFFLDJDQUEyQztRQUMzQyxJQUNFLENBQUMsb0JBQUUsQ0FBQyxtQkFBbUIsQ0FBQyxJQUFJLENBQUM7WUFDN0IsQ0FBQyxJQUFJLENBQUMsWUFBWSxFQUFFLGFBQWE7WUFDakMsQ0FBQyxvQkFBRSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLGFBQWEsQ0FBQztZQUNuRCxDQUFDLG9CQUFFLENBQUMsbUJBQW1CLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQztZQUM3QyxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsRUFDMUM7WUFDQSxTQUFTO1NBQ1Y7UUFFRCxLQUFLLE1BQU0sU0FBUyxJQUFJLElBQUksQ0FBQyxZQUFZLENBQUMsYUFBYSxDQUFDLFFBQVEsRUFBRTtZQUNoRSxJQUFJLFNBQVMsQ0FBQyxJQUFJLENBQUMsSUFBSSxLQUFLLFVBQVUsQ0FBQyxJQUFJLEVBQUU7Z0JBQzNDLFNBQVM7YUFDVjtZQUVELHlGQUF5RjtZQUN6Rix1RkFBdUY7WUFDdkYsdURBQXVEO1lBQ3ZELE1BQU0sUUFBUSxHQUFHLElBQUEsV0FBSSxFQUFDLElBQUEsY0FBTyxFQUFDLGdCQUFnQixDQUFDLEVBQUUsSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLEdBQUcsS0FBSyxDQUFDLENBQUM7WUFDcEYsTUFBTSxrQkFBa0IsR0FBRyxJQUFBLG9CQUFhLEVBQUMsSUFBSSxFQUFFLFFBQVEsQ0FBQyxDQUFDO1lBQ3pELE1BQU0sZ0JBQWdCLEdBQUcsNkJBQTZCLENBQ3BELGtCQUFrQixFQUNsQixDQUFDLFNBQVMsQ0FBQyxZQUFZLElBQUksU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FDaEQsQ0FBQztZQUVGLElBQUksZ0JBQWdCLEVBQUU7Z0JBQ3BCLE9BQU8sRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLGdCQUFnQixFQUFFLENBQUM7YUFDN0M7U0FDRjtLQUNGO0lBRUQsTUFBTSxrQkFBa0IsR0FBRyw2QkFBNkIsQ0FBQyxVQUFVLEVBQUUsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBRXRGLE9BQU8sa0JBQWtCLENBQUMsQ0FBQyxDQUFDLEVBQUUsUUFBUSxFQUFFLGdCQUFnQixFQUFFLElBQUksRUFBRSxrQkFBa0IsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7QUFDOUYsQ0FBQztBQUVEOzs7O0dBSUc7QUFDSCxTQUFTLDZCQUE2QixDQUNwQyxVQUF5QixFQUN6QixZQUFvQjtJQUVwQixLQUFLLE1BQU0sSUFBSSxJQUFJLFVBQVUsQ0FBQyxVQUFVLEVBQUU7UUFDeEMsSUFBSSxvQkFBRSxDQUFDLG1CQUFtQixDQUFDLElBQUksQ0FBQyxFQUFFO1lBQ2hDLEtBQUssTUFBTSxJQUFJLElBQUksSUFBSSxDQUFDLGVBQWUsQ0FBQyxZQUFZLEVBQUU7Z0JBQ3BELElBQ0Usb0JBQUUsQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQztvQkFDMUIsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLEtBQUssWUFBWTtvQkFDL0IsSUFBSSxDQUFDLFdBQVc7b0JBQ2hCLG9CQUFFLENBQUMseUJBQXlCLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxFQUM5QztvQkFDQSxPQUFPLElBQUksQ0FBQyxXQUFXLENBQUM7aUJBQ3pCO2FBQ0Y7U0FDRjtLQUNGO0lBRUQsT0FBTyxJQUFJLENBQUM7QUFDZCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IEdvb2dsZSBMTEMgQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqXG4gKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZVxuICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZVxuICovXG5cbmltcG9ydCB7IFRyZWUgfSBmcm9tICdAYW5ndWxhci1kZXZraXQvc2NoZW1hdGljcyc7XG5pbXBvcnQgeyBkaXJuYW1lLCBqb2luIH0gZnJvbSAncGF0aCc7XG5pbXBvcnQgdHMgZnJvbSAnLi4vLi4vdGhpcmRfcGFydHkvZ2l0aHViLmNvbS9NaWNyb3NvZnQvVHlwZVNjcmlwdC9saWIvdHlwZXNjcmlwdCc7XG5pbXBvcnQgeyBnZXRTb3VyY2VGaWxlIH0gZnJvbSAnLi91dGlsJztcblxuLyoqIEFwcCBjb25maWcgdGhhdCB3YXMgcmVzb2x2ZWQgdG8gaXRzIHNvdXJjZSBub2RlLiAqL1xuZXhwb3J0IGludGVyZmFjZSBSZXNvbHZlZEFwcENvbmZpZyB7XG4gIC8qKiBUcmVlLXJlbGF0aXZlIHBhdGggb2YgdGhlIGZpbGUgY29udGFpbmluZyB0aGUgYXBwIGNvbmZpZy4gKi9cbiAgZmlsZVBhdGg6IHN0cmluZztcblxuICAvKiogTm9kZSBkZWZpbmluZyB0aGUgYXBwIGNvbmZpZy4gKi9cbiAgbm9kZTogdHMuT2JqZWN0TGl0ZXJhbEV4cHJlc3Npb247XG59XG5cbi8qKlxuICogUmVzb2x2ZXMgdGhlIG5vZGUgdGhhdCBkZWZpbmVzIHRoZSBhcHAgY29uZmlnIGZyb20gYSBib290c3RyYXAgY2FsbC5cbiAqIEBwYXJhbSBib290c3RyYXBDYWxsIENhbGwgZm9yIHdoaWNoIHRvIHJlc29sdmUgdGhlIGNvbmZpZy5cbiAqIEBwYXJhbSB0cmVlIEZpbGUgdHJlZSBvZiB0aGUgcHJvamVjdC5cbiAqIEBwYXJhbSBmaWxlUGF0aCBGaWxlIHBhdGggb2YgdGhlIGJvb3RzdHJhcCBjYWxsLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZmluZEFwcENvbmZpZyhcbiAgYm9vdHN0cmFwQ2FsbDogdHMuQ2FsbEV4cHJlc3Npb24sXG4gIHRyZWU6IFRyZWUsXG4gIGZpbGVQYXRoOiBzdHJpbmcsXG4pOiBSZXNvbHZlZEFwcENvbmZpZyB8IG51bGwge1xuICBpZiAoYm9vdHN0cmFwQ2FsbC5hcmd1bWVudHMubGVuZ3RoID4gMSkge1xuICAgIGNvbnN0IGNvbmZpZyA9IGJvb3RzdHJhcENhbGwuYXJndW1lbnRzWzFdO1xuXG4gICAgaWYgKHRzLmlzT2JqZWN0TGl0ZXJhbEV4cHJlc3Npb24oY29uZmlnKSkge1xuICAgICAgcmV0dXJuIHsgZmlsZVBhdGgsIG5vZGU6IGNvbmZpZyB9O1xuICAgIH1cblxuICAgIGlmICh0cy5pc0lkZW50aWZpZXIoY29uZmlnKSkge1xuICAgICAgcmV0dXJuIHJlc29sdmVBcHBDb25maWdGcm9tSWRlbnRpZmllcihjb25maWcsIHRyZWUsIGZpbGVQYXRoKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gbnVsbDtcbn1cblxuLyoqXG4gKiBSZXNvbHZlcyB0aGUgYXBwIGNvbmZpZyBmcm9tIGFuIGlkZW50aWZpZXIgcmVmZXJyaW5nIHRvIGl0LlxuICogQHBhcmFtIGlkZW50aWZpZXIgSWRlbnRpZmllciByZWZlcnJpbmcgdG8gdGhlIGFwcCBjb25maWcuXG4gKiBAcGFyYW0gdHJlZSBGaWxlIHRyZWUgb2YgdGhlIHByb2plY3QuXG4gKiBAcGFyYW0gYm9vdHN0YXBGaWxlUGF0aCBQYXRoIG9mIHRoZSBib290c3RyYXAgY2FsbC5cbiAqL1xuZnVuY3Rpb24gcmVzb2x2ZUFwcENvbmZpZ0Zyb21JZGVudGlmaWVyKFxuICBpZGVudGlmaWVyOiB0cy5JZGVudGlmaWVyLFxuICB0cmVlOiBUcmVlLFxuICBib290c3RhcEZpbGVQYXRoOiBzdHJpbmcsXG4pOiBSZXNvbHZlZEFwcENvbmZpZyB8IG51bGwge1xuICBjb25zdCBzb3VyY2VGaWxlID0gaWRlbnRpZmllci5nZXRTb3VyY2VGaWxlKCk7XG5cbiAgZm9yIChjb25zdCBub2RlIG9mIHNvdXJjZUZpbGUuc3RhdGVtZW50cykge1xuICAgIC8vIE9ubHkgbG9vayBhdCByZWxhdGl2ZSBpbXBvcnRzLiBUaGlzIHdpbGwgYnJlYWsgaWYgdGhlIGFwcCB1c2VzIGEgcGF0aFxuICAgIC8vIG1hcHBpbmcgdG8gcmVmZXIgdG8gdGhlIGltcG9ydCwgYnV0IGluIG9yZGVyIHRvIHJlc29sdmUgdGhvc2UsIHdlIHdvdWxkXG4gICAgLy8gbmVlZCBrbm93bGVkZ2UgYWJvdXQgdGhlIGVudGlyZSBwcm9ncmFtLlxuICAgIGlmIChcbiAgICAgICF0cy5pc0ltcG9ydERlY2xhcmF0aW9uKG5vZGUpIHx8XG4gICAgICAhbm9kZS5pbXBvcnRDbGF1c2U/Lm5hbWVkQmluZGluZ3MgfHxcbiAgICAgICF0cy5pc05hbWVkSW1wb3J0cyhub2RlLmltcG9ydENsYXVzZS5uYW1lZEJpbmRpbmdzKSB8fFxuICAgICAgIXRzLmlzU3RyaW5nTGl0ZXJhbExpa2Uobm9kZS5tb2R1bGVTcGVjaWZpZXIpIHx8XG4gICAgICAhbm9kZS5tb2R1bGVTcGVjaWZpZXIudGV4dC5zdGFydHNXaXRoKCcuJylcbiAgICApIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGZvciAoY29uc3Qgc3BlY2lmaWVyIG9mIG5vZGUuaW1wb3J0Q2xhdXNlLm5hbWVkQmluZGluZ3MuZWxlbWVudHMpIHtcbiAgICAgIGlmIChzcGVjaWZpZXIubmFtZS50ZXh0ICE9PSBpZGVudGlmaWVyLnRleHQpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIC8vIExvb2sgZm9yIGEgdmFyaWFibGUgd2l0aCB0aGUgaW1wb3J0ZWQgbmFtZSBpbiB0aGUgZmlsZS4gTm90ZSB0aGF0IGlkZWFsbHkgd2Ugd291bGQgdXNlXG4gICAgICAvLyB0aGUgdHlwZSBjaGVja2VyIHRvIHJlc29sdmUgdGhpcywgYnV0IHdlIGNhbid0IGJlY2F1c2UgdGhlc2UgdXRpbGl0aWVzIGFyZSBzZXQgdXAgdG9cbiAgICAgIC8vIG9wZXJhdGUgb24gaW5kaXZpZHVhbCBmaWxlcywgbm90IHRoZSBlbnRpcmUgcHJvZ3JhbS5cbiAgICAgIGNvbnN0IGZpbGVQYXRoID0gam9pbihkaXJuYW1lKGJvb3RzdGFwRmlsZVBhdGgpLCBub2RlLm1vZHVsZVNwZWNpZmllci50ZXh0ICsgJy50cycpO1xuICAgICAgY29uc3QgaW1wb3J0ZWRTb3VyY2VGaWxlID0gZ2V0U291cmNlRmlsZSh0cmVlLCBmaWxlUGF0aCk7XG4gICAgICBjb25zdCByZXNvbHZlZFZhcmlhYmxlID0gZmluZEFwcENvbmZpZ0Zyb21WYXJpYWJsZU5hbWUoXG4gICAgICAgIGltcG9ydGVkU291cmNlRmlsZSxcbiAgICAgICAgKHNwZWNpZmllci5wcm9wZXJ0eU5hbWUgfHwgc3BlY2lmaWVyLm5hbWUpLnRleHQsXG4gICAgICApO1xuXG4gICAgICBpZiAocmVzb2x2ZWRWYXJpYWJsZSkge1xuICAgICAgICByZXR1cm4geyBmaWxlUGF0aCwgbm9kZTogcmVzb2x2ZWRWYXJpYWJsZSB9O1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGNvbnN0IHZhcmlhYmxlSW5TYW1lRmlsZSA9IGZpbmRBcHBDb25maWdGcm9tVmFyaWFibGVOYW1lKHNvdXJjZUZpbGUsIGlkZW50aWZpZXIudGV4dCk7XG5cbiAgcmV0dXJuIHZhcmlhYmxlSW5TYW1lRmlsZSA/IHsgZmlsZVBhdGg6IGJvb3RzdGFwRmlsZVBhdGgsIG5vZGU6IHZhcmlhYmxlSW5TYW1lRmlsZSB9IDogbnVsbDtcbn1cblxuLyoqXG4gKiBGaW5kcyBhbiBhcHAgY29uZmlnIHdpdGhpbiB0aGUgdG9wLWxldmVsIHZhcmlhYmxlcyBvZiBhIGZpbGUuXG4gKiBAcGFyYW0gc291cmNlRmlsZSBGaWxlIGluIHdoaWNoIHRvIHNlYXJjaCBmb3IgdGhlIGNvbmZpZy5cbiAqIEBwYXJhbSB2YXJpYWJsZU5hbWUgTmFtZSBvZiB0aGUgdmFyaWFibGUgY29udGFpbmluZyB0aGUgY29uZmlnLlxuICovXG5mdW5jdGlvbiBmaW5kQXBwQ29uZmlnRnJvbVZhcmlhYmxlTmFtZShcbiAgc291cmNlRmlsZTogdHMuU291cmNlRmlsZSxcbiAgdmFyaWFibGVOYW1lOiBzdHJpbmcsXG4pOiB0cy5PYmplY3RMaXRlcmFsRXhwcmVzc2lvbiB8IG51bGwge1xuICBmb3IgKGNvbnN0IG5vZGUgb2Ygc291cmNlRmlsZS5zdGF0ZW1lbnRzKSB7XG4gICAgaWYgKHRzLmlzVmFyaWFibGVTdGF0ZW1lbnQobm9kZSkpIHtcbiAgICAgIGZvciAoY29uc3QgZGVjbCBvZiBub2RlLmRlY2xhcmF0aW9uTGlzdC5kZWNsYXJhdGlvbnMpIHtcbiAgICAgICAgaWYgKFxuICAgICAgICAgIHRzLmlzSWRlbnRpZmllcihkZWNsLm5hbWUpICYmXG4gICAgICAgICAgZGVjbC5uYW1lLnRleHQgPT09IHZhcmlhYmxlTmFtZSAmJlxuICAgICAgICAgIGRlY2wuaW5pdGlhbGl6ZXIgJiZcbiAgICAgICAgICB0cy5pc09iamVjdExpdGVyYWxFeHByZXNzaW9uKGRlY2wuaW5pdGlhbGl6ZXIpXG4gICAgICAgICkge1xuICAgICAgICAgIHJldHVybiBkZWNsLmluaXRpYWxpemVyO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG51bGw7XG59XG4iXX0=
@@ -0,0 +1,53 @@
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 { Rule } from '@angular-devkit/schematics';
9
+ /** Generated code that hasn't been interpolated yet. */
10
+ export interface PendingCode {
11
+ /** Code that will be inserted. */
12
+ expression: string;
13
+ /** Imports that need to be added to the file in which the code is inserted. */
14
+ imports: PendingImports;
15
+ }
16
+ /** Map keeping track of imports and aliases under which they're referred to in an expresion. */
17
+ type PendingImports = Map<string, Map<string, string>>;
18
+ /**
19
+ * Callback invoked by a Rule that produces the code
20
+ * that needs to be inserted somewhere in the app.
21
+ */
22
+ export type CodeBlockCallback = (block: CodeBlock) => PendingCode;
23
+ /**
24
+ * Utility class used to generate blocks of code that
25
+ * can be inserted by the devkit into a user's app.
26
+ */
27
+ export declare class CodeBlock {
28
+ private _imports;
29
+ /** Function used to tag a code block in order to produce a `PendingCode` object. */
30
+ code: (strings: TemplateStringsArray, ...params: unknown[]) => PendingCode;
31
+ /**
32
+ * Used inside of a code block to mark external symbols and which module they should be imported
33
+ * from. When the code is inserted, the required import statements will be produced automatically.
34
+ * @param symbolName Name of the external symbol.
35
+ * @param moduleName Module from which the symbol should be imported.
36
+ */
37
+ external: (symbolName: string, moduleName: string) => string;
38
+ /**
39
+ * Produces the necessary rules to transform a `PendingCode` object into valid code.
40
+ * @param initialCode Code pending transformed.
41
+ * @param filePath Path of the file in which the code will be inserted.
42
+ */
43
+ static transformPendingCode(initialCode: PendingCode, filePath: string): {
44
+ code: {
45
+ /** Code that will be inserted. */
46
+ expression: string;
47
+ /** Imports that need to be added to the file in which the code is inserted. */
48
+ imports: PendingImports;
49
+ };
50
+ rules: Rule[];
51
+ };
52
+ }
53
+ export {};
@@ -0,0 +1,83 @@
1
+ "use strict";
2
+ /**
3
+ * @license
4
+ * Copyright Google LLC All Rights Reserved.
5
+ *
6
+ * Use of this source code is governed by an MIT-style license that can be
7
+ * found in the LICENSE file at https://angular.io/license
8
+ */
9
+ var __importDefault = (this && this.__importDefault) || function (mod) {
10
+ return (mod && mod.__esModule) ? mod : { "default": mod };
11
+ };
12
+ Object.defineProperty(exports, "__esModule", { value: true });
13
+ exports.CodeBlock = void 0;
14
+ const typescript_1 = __importDefault(require("../../third_party/github.com/Microsoft/TypeScript/lib/typescript"));
15
+ const ast_utils_1 = require("../ast-utils");
16
+ const change_1 = require("../change");
17
+ /** Counter used to generate unique IDs. */
18
+ let uniqueIdCounter = 0;
19
+ /**
20
+ * Utility class used to generate blocks of code that
21
+ * can be inserted by the devkit into a user's app.
22
+ */
23
+ class CodeBlock {
24
+ constructor() {
25
+ this._imports = new Map();
26
+ // Note: the methods here are defined as arrow function so that they can be destructured by
27
+ // consumers without losing their context. This makes the API more concise.
28
+ /** Function used to tag a code block in order to produce a `PendingCode` object. */
29
+ this.code = (strings, ...params) => {
30
+ return {
31
+ expression: strings.map((part, index) => part + (params[index] || '')).join(''),
32
+ imports: this._imports,
33
+ };
34
+ };
35
+ /**
36
+ * Used inside of a code block to mark external symbols and which module they should be imported
37
+ * from. When the code is inserted, the required import statements will be produced automatically.
38
+ * @param symbolName Name of the external symbol.
39
+ * @param moduleName Module from which the symbol should be imported.
40
+ */
41
+ this.external = (symbolName, moduleName) => {
42
+ if (!this._imports.has(moduleName)) {
43
+ this._imports.set(moduleName, new Map());
44
+ }
45
+ const symbolsPerModule = this._imports.get(moduleName);
46
+ if (!symbolsPerModule.has(symbolName)) {
47
+ symbolsPerModule.set(symbolName, `@@__SCHEMATIC_PLACEHOLDER_${uniqueIdCounter++}__@@`);
48
+ }
49
+ return symbolsPerModule.get(symbolName);
50
+ };
51
+ }
52
+ /**
53
+ * Produces the necessary rules to transform a `PendingCode` object into valid code.
54
+ * @param initialCode Code pending transformed.
55
+ * @param filePath Path of the file in which the code will be inserted.
56
+ */
57
+ static transformPendingCode(initialCode, filePath) {
58
+ const code = { ...initialCode };
59
+ const rules = [];
60
+ code.imports.forEach((symbols, moduleName) => {
61
+ symbols.forEach((placeholder, symbolName) => {
62
+ rules.push((tree) => {
63
+ const recorder = tree.beginUpdate(filePath);
64
+ const sourceFile = typescript_1.default.createSourceFile(filePath, tree.readText(filePath), typescript_1.default.ScriptTarget.Latest, true);
65
+ // Note that this could still technically clash if there's a top-level symbol called
66
+ // `${symbolName}_alias`, however this is unlikely. We can revisit this if it becomes
67
+ // a problem.
68
+ const alias = (0, ast_utils_1.hasTopLevelIdentifier)(sourceFile, symbolName, moduleName)
69
+ ? symbolName + '_alias'
70
+ : undefined;
71
+ code.expression = code.expression.replace(new RegExp(placeholder, 'g'), alias || symbolName);
72
+ (0, change_1.applyToUpdateRecorder)(recorder, [
73
+ (0, ast_utils_1.insertImport)(sourceFile, filePath, symbolName, moduleName, false, alias),
74
+ ]);
75
+ tree.commitUpdate(recorder);
76
+ });
77
+ });
78
+ });
79
+ return { code, rules };
80
+ }
81
+ }
82
+ exports.CodeBlock = CodeBlock;
83
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29kZV9ibG9jay5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL3BhY2thZ2VzL3NjaGVtYXRpY3MvYW5ndWxhci91dGlsaXR5L3N0YW5kYWxvbmUvY29kZV9ibG9jay50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUE7Ozs7OztHQU1HOzs7Ozs7QUFHSCxrSEFBa0Y7QUFDbEYsNENBQW1FO0FBQ25FLHNDQUFrRDtBQWNsRCwyQ0FBMkM7QUFDM0MsSUFBSSxlQUFlLEdBQUcsQ0FBQyxDQUFDO0FBUXhCOzs7R0FHRztBQUNILE1BQWEsU0FBUztJQUF0QjtRQUNVLGFBQVEsR0FBbUIsSUFBSSxHQUFHLEVBQStCLENBQUM7UUFFMUUsMkZBQTJGO1FBQzNGLDJFQUEyRTtRQUUzRSxvRkFBb0Y7UUFDcEYsU0FBSSxHQUFHLENBQUMsT0FBNkIsRUFBRSxHQUFHLE1BQWlCLEVBQWUsRUFBRTtZQUMxRSxPQUFPO2dCQUNMLFVBQVUsRUFBRSxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxFQUFFLEtBQUssRUFBRSxFQUFFLENBQUMsSUFBSSxHQUFHLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQztnQkFDL0UsT0FBTyxFQUFFLElBQUksQ0FBQyxRQUFRO2FBQ3ZCLENBQUM7UUFDSixDQUFDLENBQUM7UUFFRjs7Ozs7V0FLRztRQUNILGFBQVEsR0FBRyxDQUFDLFVBQWtCLEVBQUUsVUFBa0IsRUFBVSxFQUFFO1lBQzVELElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUMsRUFBRTtnQkFDbEMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsVUFBVSxFQUFFLElBQUksR0FBRyxFQUFFLENBQUMsQ0FBQzthQUMxQztZQUVELE1BQU0sZ0JBQWdCLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUF3QixDQUFDO1lBRTlFLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLEVBQUU7Z0JBQ3JDLGdCQUFnQixDQUFDLEdBQUcsQ0FBQyxVQUFVLEVBQUUsNkJBQTZCLGVBQWUsRUFBRSxNQUFNLENBQUMsQ0FBQzthQUN4RjtZQUVELE9BQU8sZ0JBQWdCLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBVyxDQUFDO1FBQ3BELENBQUMsQ0FBQztJQTRDSixDQUFDO0lBMUNDOzs7O09BSUc7SUFDSCxNQUFNLENBQUMsb0JBQW9CLENBQUMsV0FBd0IsRUFBRSxRQUFnQjtRQUNwRSxNQUFNLElBQUksR0FBRyxFQUFFLEdBQUcsV0FBVyxFQUFFLENBQUM7UUFDaEMsTUFBTSxLQUFLLEdBQVcsRUFBRSxDQUFDO1FBRXpCLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUMsT0FBTyxFQUFFLFVBQVUsRUFBRSxFQUFFO1lBQzNDLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQyxXQUFXLEVBQUUsVUFBVSxFQUFFLEVBQUU7Z0JBQzFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFVLEVBQUUsRUFBRTtvQkFDeEIsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxRQUFRLENBQUMsQ0FBQztvQkFDNUMsTUFBTSxVQUFVLEdBQUcsb0JBQUUsQ0FBQyxnQkFBZ0IsQ0FDcEMsUUFBUSxFQUNSLElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLEVBQ3ZCLG9CQUFFLENBQUMsWUFBWSxDQUFDLE1BQU0sRUFDdEIsSUFBSSxDQUNMLENBQUM7b0JBRUYsb0ZBQW9GO29CQUNwRixxRkFBcUY7b0JBQ3JGLGFBQWE7b0JBQ2IsTUFBTSxLQUFLLEdBQUcsSUFBQSxpQ0FBcUIsRUFBQyxVQUFVLEVBQUUsVUFBVSxFQUFFLFVBQVUsQ0FBQzt3QkFDckUsQ0FBQyxDQUFDLFVBQVUsR0FBRyxRQUFRO3dCQUN2QixDQUFDLENBQUMsU0FBUyxDQUFDO29CQUVkLElBQUksQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQ3ZDLElBQUksTUFBTSxDQUFDLFdBQVcsRUFBRSxHQUFHLENBQUMsRUFDNUIsS0FBSyxJQUFJLFVBQVUsQ0FDcEIsQ0FBQztvQkFFRixJQUFBLDhCQUFxQixFQUFDLFFBQVEsRUFBRTt3QkFDOUIsSUFBQSx3QkFBWSxFQUFDLFVBQVUsRUFBRSxRQUFRLEVBQUUsVUFBVSxFQUFFLFVBQVUsRUFBRSxLQUFLLEVBQUUsS0FBSyxDQUFDO3FCQUN6RSxDQUFDLENBQUM7b0JBQ0gsSUFBSSxDQUFDLFlBQVksQ0FBQyxRQUFRLENBQUMsQ0FBQztnQkFDOUIsQ0FBQyxDQUFDLENBQUM7WUFDTCxDQUFDLENBQUMsQ0FBQztRQUNMLENBQUMsQ0FBQyxDQUFDO1FBRUgsT0FBTyxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsQ0FBQztJQUN6QixDQUFDO0NBQ0Y7QUE1RUQsOEJBNEVDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IEdvb2dsZSBMTEMgQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqXG4gKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZVxuICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZVxuICovXG5cbmltcG9ydCB7IFJ1bGUsIFRyZWUgfSBmcm9tICdAYW5ndWxhci1kZXZraXQvc2NoZW1hdGljcyc7XG5pbXBvcnQgdHMgZnJvbSAnLi4vLi4vdGhpcmRfcGFydHkvZ2l0aHViLmNvbS9NaWNyb3NvZnQvVHlwZVNjcmlwdC9saWIvdHlwZXNjcmlwdCc7XG5pbXBvcnQgeyBoYXNUb3BMZXZlbElkZW50aWZpZXIsIGluc2VydEltcG9ydCB9IGZyb20gJy4uL2FzdC11dGlscyc7XG5pbXBvcnQgeyBhcHBseVRvVXBkYXRlUmVjb3JkZXIgfSBmcm9tICcuLi9jaGFuZ2UnO1xuXG4vKiogR2VuZXJhdGVkIGNvZGUgdGhhdCBoYXNuJ3QgYmVlbiBpbnRlcnBvbGF0ZWQgeWV0LiAqL1xuZXhwb3J0IGludGVyZmFjZSBQZW5kaW5nQ29kZSB7XG4gIC8qKiBDb2RlIHRoYXQgd2lsbCBiZSBpbnNlcnRlZC4gKi9cbiAgZXhwcmVzc2lvbjogc3RyaW5nO1xuXG4gIC8qKiBJbXBvcnRzIHRoYXQgbmVlZCB0byBiZSBhZGRlZCB0byB0aGUgZmlsZSBpbiB3aGljaCB0aGUgY29kZSBpcyBpbnNlcnRlZC4gKi9cbiAgaW1wb3J0czogUGVuZGluZ0ltcG9ydHM7XG59XG5cbi8qKiBNYXAga2VlcGluZyB0cmFjayBvZiBpbXBvcnRzIGFuZCBhbGlhc2VzIHVuZGVyIHdoaWNoIHRoZXkncmUgcmVmZXJyZWQgdG8gaW4gYW4gZXhwcmVzaW9uLiAqL1xudHlwZSBQZW5kaW5nSW1wb3J0cyA9IE1hcDxzdHJpbmcsIE1hcDxzdHJpbmcsIHN0cmluZz4+O1xuXG4vKiogQ291bnRlciB1c2VkIHRvIGdlbmVyYXRlIHVuaXF1ZSBJRHMuICovXG5sZXQgdW5pcXVlSWRDb3VudGVyID0gMDtcblxuLyoqXG4gKiBDYWxsYmFjayBpbnZva2VkIGJ5IGEgUnVsZSB0aGF0IHByb2R1Y2VzIHRoZSBjb2RlXG4gKiB0aGF0IG5lZWRzIHRvIGJlIGluc2VydGVkIHNvbWV3aGVyZSBpbiB0aGUgYXBwLlxuICovXG5leHBvcnQgdHlwZSBDb2RlQmxvY2tDYWxsYmFjayA9IChibG9jazogQ29kZUJsb2NrKSA9PiBQZW5kaW5nQ29kZTtcblxuLyoqXG4gKiBVdGlsaXR5IGNsYXNzIHVzZWQgdG8gZ2VuZXJhdGUgYmxvY2tzIG9mIGNvZGUgdGhhdFxuICogY2FuIGJlIGluc2VydGVkIGJ5IHRoZSBkZXZraXQgaW50byBhIHVzZXIncyBhcHAuXG4gKi9cbmV4cG9ydCBjbGFzcyBDb2RlQmxvY2sge1xuICBwcml2YXRlIF9pbXBvcnRzOiBQZW5kaW5nSW1wb3J0cyA9IG5ldyBNYXA8c3RyaW5nLCBNYXA8c3RyaW5nLCBzdHJpbmc+PigpO1xuXG4gIC8vIE5vdGU6IHRoZSBtZXRob2RzIGhlcmUgYXJlIGRlZmluZWQgYXMgYXJyb3cgZnVuY3Rpb24gc28gdGhhdCB0aGV5IGNhbiBiZSBkZXN0cnVjdHVyZWQgYnlcbiAgLy8gY29uc3VtZXJzIHdpdGhvdXQgbG9zaW5nIHRoZWlyIGNvbnRleHQuIFRoaXMgbWFrZXMgdGhlIEFQSSBtb3JlIGNvbmNpc2UuXG5cbiAgLyoqIEZ1bmN0aW9uIHVzZWQgdG8gdGFnIGEgY29kZSBibG9jayBpbiBvcmRlciB0byBwcm9kdWNlIGEgYFBlbmRpbmdDb2RlYCBvYmplY3QuICovXG4gIGNvZGUgPSAoc3RyaW5nczogVGVtcGxhdGVTdHJpbmdzQXJyYXksIC4uLnBhcmFtczogdW5rbm93bltdKTogUGVuZGluZ0NvZGUgPT4ge1xuICAgIHJldHVybiB7XG4gICAgICBleHByZXNzaW9uOiBzdHJpbmdzLm1hcCgocGFydCwgaW5kZXgpID0+IHBhcnQgKyAocGFyYW1zW2luZGV4XSB8fCAnJykpLmpvaW4oJycpLFxuICAgICAgaW1wb3J0czogdGhpcy5faW1wb3J0cyxcbiAgICB9O1xuICB9O1xuXG4gIC8qKlxuICAgKiBVc2VkIGluc2lkZSBvZiBhIGNvZGUgYmxvY2sgdG8gbWFyayBleHRlcm5hbCBzeW1ib2xzIGFuZCB3aGljaCBtb2R1bGUgdGhleSBzaG91bGQgYmUgaW1wb3J0ZWRcbiAgICogZnJvbS4gV2hlbiB0aGUgY29kZSBpcyBpbnNlcnRlZCwgdGhlIHJlcXVpcmVkIGltcG9ydCBzdGF0ZW1lbnRzIHdpbGwgYmUgcHJvZHVjZWQgYXV0b21hdGljYWxseS5cbiAgICogQHBhcmFtIHN5bWJvbE5hbWUgTmFtZSBvZiB0aGUgZXh0ZXJuYWwgc3ltYm9sLlxuICAgKiBAcGFyYW0gbW9kdWxlTmFtZSBNb2R1bGUgZnJvbSB3aGljaCB0aGUgc3ltYm9sIHNob3VsZCBiZSBpbXBvcnRlZC5cbiAgICovXG4gIGV4dGVybmFsID0gKHN5bWJvbE5hbWU6IHN0cmluZywgbW9kdWxlTmFtZTogc3RyaW5nKTogc3RyaW5nID0+IHtcbiAgICBpZiAoIXRoaXMuX2ltcG9ydHMuaGFzKG1vZHVsZU5hbWUpKSB7XG4gICAgICB0aGlzLl9pbXBvcnRzLnNldChtb2R1bGVOYW1lLCBuZXcgTWFwKCkpO1xuICAgIH1cblxuICAgIGNvbnN0IHN5bWJvbHNQZXJNb2R1bGUgPSB0aGlzLl9pbXBvcnRzLmdldChtb2R1bGVOYW1lKSBhcyBNYXA8c3RyaW5nLCBzdHJpbmc+O1xuXG4gICAgaWYgKCFzeW1ib2xzUGVyTW9kdWxlLmhhcyhzeW1ib2xOYW1lKSkge1xuICAgICAgc3ltYm9sc1Blck1vZHVsZS5zZXQoc3ltYm9sTmFtZSwgYEBAX19TQ0hFTUFUSUNfUExBQ0VIT0xERVJfJHt1bmlxdWVJZENvdW50ZXIrK31fX0BAYCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHN5bWJvbHNQZXJNb2R1bGUuZ2V0KHN5bWJvbE5hbWUpIGFzIHN0cmluZztcbiAgfTtcblxuICAvKipcbiAgICogUHJvZHVjZXMgdGhlIG5lY2Vzc2FyeSBydWxlcyB0byB0cmFuc2Zvcm0gYSBgUGVuZGluZ0NvZGVgIG9iamVjdCBpbnRvIHZhbGlkIGNvZGUuXG4gICAqIEBwYXJhbSBpbml0aWFsQ29kZSBDb2RlIHBlbmRpbmcgdHJhbnNmb3JtZWQuXG4gICAqIEBwYXJhbSBmaWxlUGF0aCBQYXRoIG9mIHRoZSBmaWxlIGluIHdoaWNoIHRoZSBjb2RlIHdpbGwgYmUgaW5zZXJ0ZWQuXG4gICAqL1xuICBzdGF0aWMgdHJhbnNmb3JtUGVuZGluZ0NvZGUoaW5pdGlhbENvZGU6IFBlbmRpbmdDb2RlLCBmaWxlUGF0aDogc3RyaW5nKSB7XG4gICAgY29uc3QgY29kZSA9IHsgLi4uaW5pdGlhbENvZGUgfTtcbiAgICBjb25zdCBydWxlczogUnVsZVtdID0gW107XG5cbiAgICBjb2RlLmltcG9ydHMuZm9yRWFjaCgoc3ltYm9scywgbW9kdWxlTmFtZSkgPT4ge1xuICAgICAgc3ltYm9scy5mb3JFYWNoKChwbGFjZWhvbGRlciwgc3ltYm9sTmFtZSkgPT4ge1xuICAgICAgICBydWxlcy5wdXNoKCh0cmVlOiBUcmVlKSA9PiB7XG4gICAgICAgICAgY29uc3QgcmVjb3JkZXIgPSB0cmVlLmJlZ2luVXBkYXRlKGZpbGVQYXRoKTtcbiAgICAgICAgICBjb25zdCBzb3VyY2VGaWxlID0gdHMuY3JlYXRlU291cmNlRmlsZShcbiAgICAgICAgICAgIGZpbGVQYXRoLFxuICAgICAgICAgICAgdHJlZS5yZWFkVGV4dChmaWxlUGF0aCksXG4gICAgICAgICAgICB0cy5TY3JpcHRUYXJnZXQuTGF0ZXN0LFxuICAgICAgICAgICAgdHJ1ZSxcbiAgICAgICAgICApO1xuXG4gICAgICAgICAgLy8gTm90ZSB0aGF0IHRoaXMgY291bGQgc3RpbGwgdGVjaG5pY2FsbHkgY2xhc2ggaWYgdGhlcmUncyBhIHRvcC1sZXZlbCBzeW1ib2wgY2FsbGVkXG4gICAgICAgICAgLy8gYCR7c3ltYm9sTmFtZX1fYWxpYXNgLCBob3dldmVyIHRoaXMgaXMgdW5saWtlbHkuIFdlIGNhbiByZXZpc2l0IHRoaXMgaWYgaXQgYmVjb21lc1xuICAgICAgICAgIC8vIGEgcHJvYmxlbS5cbiAgICAgICAgICBjb25zdCBhbGlhcyA9IGhhc1RvcExldmVsSWRlbnRpZmllcihzb3VyY2VGaWxlLCBzeW1ib2xOYW1lLCBtb2R1bGVOYW1lKVxuICAgICAgICAgICAgPyBzeW1ib2xOYW1lICsgJ19hbGlhcydcbiAgICAgICAgICAgIDogdW5kZWZpbmVkO1xuXG4gICAgICAgICAgY29kZS5leHByZXNzaW9uID0gY29kZS5leHByZXNzaW9uLnJlcGxhY2UoXG4gICAgICAgICAgICBuZXcgUmVnRXhwKHBsYWNlaG9sZGVyLCAnZycpLFxuICAgICAgICAgICAgYWxpYXMgfHwgc3ltYm9sTmFtZSxcbiAgICAgICAgICApO1xuXG4gICAgICAgICAgYXBwbHlUb1VwZGF0ZVJlY29yZGVyKHJlY29yZGVyLCBbXG4gICAgICAgICAgICBpbnNlcnRJbXBvcnQoc291cmNlRmlsZSwgZmlsZVBhdGgsIHN5bWJvbE5hbWUsIG1vZHVsZU5hbWUsIGZhbHNlLCBhbGlhcyksXG4gICAgICAgICAgXSk7XG4gICAgICAgICAgdHJlZS5jb21taXRVcGRhdGUocmVjb3JkZXIpO1xuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIHsgY29kZSwgcnVsZXMgfTtcbiAgfVxufVxuIl19
@@ -0,0 +1,9 @@
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
+ export { addRootImport, addRootProvider } from './rules';
9
+ export { PendingCode, CodeBlockCallback, type CodeBlock } from './code_block';
@@ -0,0 +1,14 @@
1
+ "use strict";
2
+ /**
3
+ * @license
4
+ * Copyright Google LLC All Rights Reserved.
5
+ *
6
+ * Use of this source code is governed by an MIT-style license that can be
7
+ * found in the LICENSE file at https://angular.io/license
8
+ */
9
+ Object.defineProperty(exports, "__esModule", { value: true });
10
+ exports.addRootProvider = exports.addRootImport = void 0;
11
+ var rules_1 = require("./rules");
12
+ Object.defineProperty(exports, "addRootImport", { enumerable: true, get: function () { return rules_1.addRootImport; } });
13
+ Object.defineProperty(exports, "addRootProvider", { enumerable: true, get: function () { return rules_1.addRootProvider; } });
14
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9zY2hlbWF0aWNzL2FuZ3VsYXIvdXRpbGl0eS9zdGFuZGFsb25lL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQTs7Ozs7O0dBTUc7OztBQUVILGlDQUF5RDtBQUFoRCxzR0FBQSxhQUFhLE9BQUE7QUFBRSx3R0FBQSxlQUFlLE9BQUEiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgR29vZ2xlIExMQyBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICpcbiAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlXG4gKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlXG4gKi9cblxuZXhwb3J0IHsgYWRkUm9vdEltcG9ydCwgYWRkUm9vdFByb3ZpZGVyIH0gZnJvbSAnLi9ydWxlcyc7XG5leHBvcnQgeyBQZW5kaW5nQ29kZSwgQ29kZUJsb2NrQ2FsbGJhY2ssIHR5cGUgQ29kZUJsb2NrIH0gZnJvbSAnLi9jb2RlX2Jsb2NrJztcbiJdfQ==
@@ -0,0 +1,45 @@
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 { Rule } from '@angular-devkit/schematics';
9
+ import { CodeBlockCallback } from './code_block';
10
+ /**
11
+ * Adds an import to the root of the project.
12
+ * @param project Name of the project to which to add the import.
13
+ * @param callback Function that generates the code block which should be inserted.
14
+ * @example
15
+ *
16
+ * ```ts
17
+ * import { Rule } from '@angular-devkit/schematics';
18
+ * import { addRootImport } from '@schematics/angular/utility';
19
+ *
20
+ * export default function(): Rule {
21
+ * return addRootImport('default', ({code, external}) => {
22
+ * return code`${external('MyModule', '@my/module')}.forRoot({})`;
23
+ * });
24
+ * }
25
+ * ```
26
+ */
27
+ export declare function addRootImport(project: string, callback: CodeBlockCallback): Rule;
28
+ /**
29
+ * Adds a provider to the root of the project.
30
+ * @param project Name of the project to which to add the import.
31
+ * @param callback Function that generates the code block which should be inserted.
32
+ * @example
33
+ *
34
+ * ```ts
35
+ * import { Rule } from '@angular-devkit/schematics';
36
+ * import { addRootProvider } from '@schematics/angular/utility';
37
+ *
38
+ * export default function(): Rule {
39
+ * return addRootProvider('default', ({code, external}) => {
40
+ * return code`${external('provideLibrary', '@my/library')}({})`;
41
+ * });
42
+ * }
43
+ * ```
44
+ */
45
+ export declare function addRootProvider(project: string, callback: CodeBlockCallback): Rule;
@@ -0,0 +1,190 @@
1
+ "use strict";
2
+ /**
3
+ * @license
4
+ * Copyright Google LLC All Rights Reserved.
5
+ *
6
+ * Use of this source code is governed by an MIT-style license that can be
7
+ * found in the LICENSE file at https://angular.io/license
8
+ */
9
+ Object.defineProperty(exports, "__esModule", { value: true });
10
+ exports.addRootProvider = exports.addRootImport = void 0;
11
+ const core_1 = require("@angular-devkit/core");
12
+ const schematics_1 = require("@angular-devkit/schematics");
13
+ const ast_utils_1 = require("../ast-utils");
14
+ const change_1 = require("../change");
15
+ const ng_ast_utils_1 = require("../ng-ast-utils");
16
+ const app_config_1 = require("./app_config");
17
+ const code_block_1 = require("./code_block");
18
+ const util_1 = require("./util");
19
+ /**
20
+ * Adds an import to the root of the project.
21
+ * @param project Name of the project to which to add the import.
22
+ * @param callback Function that generates the code block which should be inserted.
23
+ * @example
24
+ *
25
+ * ```ts
26
+ * import { Rule } from '@angular-devkit/schematics';
27
+ * import { addRootImport } from '@schematics/angular/utility';
28
+ *
29
+ * export default function(): Rule {
30
+ * return addRootImport('default', ({code, external}) => {
31
+ * return code`${external('MyModule', '@my/module')}.forRoot({})`;
32
+ * });
33
+ * }
34
+ * ```
35
+ */
36
+ function addRootImport(project, callback) {
37
+ return getRootInsertionRule(project, callback, 'imports', {
38
+ name: 'importProvidersFrom',
39
+ module: '@angular/core',
40
+ });
41
+ }
42
+ exports.addRootImport = addRootImport;
43
+ /**
44
+ * Adds a provider to the root of the project.
45
+ * @param project Name of the project to which to add the import.
46
+ * @param callback Function that generates the code block which should be inserted.
47
+ * @example
48
+ *
49
+ * ```ts
50
+ * import { Rule } from '@angular-devkit/schematics';
51
+ * import { addRootProvider } from '@schematics/angular/utility';
52
+ *
53
+ * export default function(): Rule {
54
+ * return addRootProvider('default', ({code, external}) => {
55
+ * return code`${external('provideLibrary', '@my/library')}({})`;
56
+ * });
57
+ * }
58
+ * ```
59
+ */
60
+ function addRootProvider(project, callback) {
61
+ return getRootInsertionRule(project, callback, 'providers');
62
+ }
63
+ exports.addRootProvider = addRootProvider;
64
+ /**
65
+ * Creates a rule that inserts code at the root of either a standalone or NgModule-based project.
66
+ * @param project Name of the project into which to inser tthe code.
67
+ * @param callback Function that generates the code block which should be inserted.
68
+ * @param ngModuleField Field of the root NgModule into which the code should be inserted, if the
69
+ * app is based on NgModule
70
+ * @param standaloneWrapperFunction Function with which to wrap the code if the app is standalone.
71
+ */
72
+ function getRootInsertionRule(project, callback, ngModuleField, standaloneWrapperFunction) {
73
+ return async (host) => {
74
+ const mainFilePath = await (0, util_1.getMainFilePath)(host, project);
75
+ const codeBlock = new code_block_1.CodeBlock();
76
+ if ((0, ng_ast_utils_1.isStandaloneApp)(host, mainFilePath)) {
77
+ return (tree) => addProviderToStandaloneBootstrap(tree, callback(codeBlock), mainFilePath, standaloneWrapperFunction);
78
+ }
79
+ const modulePath = (0, ng_ast_utils_1.getAppModulePath)(host, mainFilePath);
80
+ const pendingCode = code_block_1.CodeBlock.transformPendingCode(callback(codeBlock), modulePath);
81
+ return (0, schematics_1.chain)([
82
+ ...pendingCode.rules,
83
+ (tree) => {
84
+ const changes = (0, ast_utils_1.addSymbolToNgModuleMetadata)((0, util_1.getSourceFile)(tree, modulePath), modulePath, ngModuleField, pendingCode.code.expression,
85
+ // Explicitly set the import path to null since we deal with imports here separately.
86
+ null);
87
+ (0, util_1.applyChangesToFile)(tree, modulePath, changes);
88
+ },
89
+ ]);
90
+ };
91
+ }
92
+ /**
93
+ * Adds a provider to the root of a standalone project.
94
+ * @param host Tree of the root rule.
95
+ * @param pendingCode Code that should be inserted.
96
+ * @param mainFilePath Path to the project's main file.
97
+ * @param wrapperFunction Optional function with which to wrap the provider.
98
+ */
99
+ function addProviderToStandaloneBootstrap(host, pendingCode, mainFilePath, wrapperFunction) {
100
+ const bootstrapCall = (0, util_1.findBootstrapApplicationCall)(host, mainFilePath);
101
+ const fileToEdit = (0, app_config_1.findAppConfig)(bootstrapCall, host, mainFilePath)?.filePath || mainFilePath;
102
+ const { code, rules } = code_block_1.CodeBlock.transformPendingCode(pendingCode, fileToEdit);
103
+ return (0, schematics_1.chain)([
104
+ ...rules,
105
+ () => {
106
+ let wrapped;
107
+ let additionalRules;
108
+ if (wrapperFunction) {
109
+ const block = new code_block_1.CodeBlock();
110
+ const result = code_block_1.CodeBlock.transformPendingCode(block.code `${block.external(wrapperFunction.name, wrapperFunction.module)}(${code.expression})`, fileToEdit);
111
+ wrapped = result.code;
112
+ additionalRules = result.rules;
113
+ }
114
+ else {
115
+ wrapped = code;
116
+ additionalRules = [];
117
+ }
118
+ return (0, schematics_1.chain)([
119
+ ...additionalRules,
120
+ (tree) => insertStandaloneRootProvider(tree, mainFilePath, wrapped.expression),
121
+ ]);
122
+ },
123
+ ]);
124
+ }
125
+ /**
126
+ * Inserts a string expression into the root of a standalone project.
127
+ * @param tree File tree used to modify the project.
128
+ * @param mainFilePath Path to the main file of the project.
129
+ * @param expression Code expression to be inserted.
130
+ */
131
+ function insertStandaloneRootProvider(tree, mainFilePath, expression) {
132
+ const bootstrapCall = (0, util_1.findBootstrapApplicationCall)(tree, mainFilePath);
133
+ const appConfig = (0, app_config_1.findAppConfig)(bootstrapCall, tree, mainFilePath);
134
+ if (bootstrapCall.arguments.length === 0) {
135
+ throw new schematics_1.SchematicsException(`Cannot add provider to invalid bootstrapApplication call in ${bootstrapCall.getSourceFile().fileName}`);
136
+ }
137
+ if (appConfig) {
138
+ addProvidersExpressionToAppConfig(tree, appConfig, expression);
139
+ return;
140
+ }
141
+ const newAppConfig = `, {\n${core_1.tags.indentBy(2) `providers: [${expression}]`}\n}`;
142
+ let targetCall;
143
+ if (bootstrapCall.arguments.length === 1) {
144
+ targetCall = bootstrapCall;
145
+ }
146
+ else if ((0, util_1.isMergeAppConfigCall)(bootstrapCall.arguments[1])) {
147
+ targetCall = bootstrapCall.arguments[1];
148
+ }
149
+ else {
150
+ throw new schematics_1.SchematicsException(`Cannot statically analyze bootstrapApplication call in ${bootstrapCall.getSourceFile().fileName}`);
151
+ }
152
+ (0, util_1.applyChangesToFile)(tree, mainFilePath, [
153
+ (0, ast_utils_1.insertAfterLastOccurrence)(targetCall.arguments, newAppConfig, mainFilePath, targetCall.getEnd() - 1),
154
+ ]);
155
+ }
156
+ /**
157
+ * Adds a string expression to an app config object.
158
+ * @param tree File tree used to modify the project.
159
+ * @param appConfig Resolved configuration object of the project.
160
+ * @param expression Code expression to be inserted.
161
+ */
162
+ function addProvidersExpressionToAppConfig(tree, appConfig, expression) {
163
+ const { node, filePath } = appConfig;
164
+ const configProps = node.properties;
165
+ const providersLiteral = (0, util_1.findProvidersLiteral)(node);
166
+ // If there's a `providers` property, we can add the provider
167
+ // to it, otherwise we need to declare it ourselves.
168
+ if (providersLiteral) {
169
+ const hasTrailingComma = providersLiteral.elements.hasTrailingComma;
170
+ (0, util_1.applyChangesToFile)(tree, filePath, [
171
+ (0, ast_utils_1.insertAfterLastOccurrence)(providersLiteral.elements, (hasTrailingComma || providersLiteral.elements.length === 0 ? '' : ', ') + expression, filePath, providersLiteral.getStart() + 1),
172
+ ]);
173
+ }
174
+ else {
175
+ const prop = core_1.tags.indentBy(2) `providers: [${expression}]`;
176
+ let toInsert;
177
+ let insertPosition;
178
+ if (configProps.length === 0) {
179
+ toInsert = '\n' + prop + '\n';
180
+ insertPosition = node.getEnd() - 1;
181
+ }
182
+ else {
183
+ const hasTrailingComma = configProps.hasTrailingComma;
184
+ toInsert = (hasTrailingComma ? '' : ',') + '\n' + prop;
185
+ insertPosition = configProps[configProps.length - 1].getEnd() + (hasTrailingComma ? 1 : 0);
186
+ }
187
+ (0, util_1.applyChangesToFile)(tree, filePath, [new change_1.InsertChange(filePath, insertPosition, toInsert)]);
188
+ }
189
+ }
190
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicnVsZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9zY2hlbWF0aWNzL2FuZ3VsYXIvdXRpbGl0eS9zdGFuZGFsb25lL3J1bGVzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQTs7Ozs7O0dBTUc7OztBQUVILCtDQUE0QztBQUM1QywyREFBb0Y7QUFFcEYsNENBQXNGO0FBQ3RGLHNDQUF5QztBQUN6QyxrREFBb0U7QUFDcEUsNkNBQWdFO0FBQ2hFLDZDQUF5RTtBQUN6RSxpQ0FPZ0I7QUFFaEI7Ozs7Ozs7Ozs7Ozs7Ozs7R0FnQkc7QUFDSCxTQUFnQixhQUFhLENBQUMsT0FBZSxFQUFFLFFBQTJCO0lBQ3hFLE9BQU8sb0JBQW9CLENBQUMsT0FBTyxFQUFFLFFBQVEsRUFBRSxTQUFTLEVBQUU7UUFDeEQsSUFBSSxFQUFFLHFCQUFxQjtRQUMzQixNQUFNLEVBQUUsZUFBZTtLQUN4QixDQUFDLENBQUM7QUFDTCxDQUFDO0FBTEQsc0NBS0M7QUFFRDs7Ozs7Ozs7Ozs7Ozs7OztHQWdCRztBQUNILFNBQWdCLGVBQWUsQ0FBQyxPQUFlLEVBQUUsUUFBMkI7SUFDMUUsT0FBTyxvQkFBb0IsQ0FBQyxPQUFPLEVBQUUsUUFBUSxFQUFFLFdBQVcsQ0FBQyxDQUFDO0FBQzlELENBQUM7QUFGRCwwQ0FFQztBQUVEOzs7Ozs7O0dBT0c7QUFDSCxTQUFTLG9CQUFvQixDQUMzQixPQUFlLEVBQ2YsUUFBMkIsRUFDM0IsYUFBcUIsRUFDckIseUJBQTREO0lBRTVELE9BQU8sS0FBSyxFQUFFLElBQUksRUFBRSxFQUFFO1FBQ3BCLE1BQU0sWUFBWSxHQUFHLE1BQU0sSUFBQSxzQkFBZSxFQUFDLElBQUksRUFBRSxPQUFPLENBQUMsQ0FBQztRQUMxRCxNQUFNLFNBQVMsR0FBRyxJQUFJLHNCQUFTLEVBQUUsQ0FBQztRQUVsQyxJQUFJLElBQUEsOEJBQWUsRUFBQyxJQUFJLEVBQUUsWUFBWSxDQUFDLEVBQUU7WUFDdkMsT0FBTyxDQUFDLElBQUksRUFBRSxFQUFFLENBQ2QsZ0NBQWdDLENBQzlCLElBQUksRUFDSixRQUFRLENBQUMsU0FBUyxDQUFDLEVBQ25CLFlBQVksRUFDWix5QkFBeUIsQ0FDMUIsQ0FBQztTQUNMO1FBRUQsTUFBTSxVQUFVLEdBQUcsSUFBQSwrQkFBZ0IsRUFBQyxJQUFJLEVBQUUsWUFBWSxDQUFDLENBQUM7UUFDeEQsTUFBTSxXQUFXLEdBQUcsc0JBQVMsQ0FBQyxvQkFBb0IsQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLEVBQUUsVUFBVSxDQUFDLENBQUM7UUFFcEYsT0FBTyxJQUFBLGtCQUFLLEVBQUM7WUFDWCxHQUFHLFdBQVcsQ0FBQyxLQUFLO1lBQ3BCLENBQUMsSUFBSSxFQUFFLEVBQUU7Z0JBQ1AsTUFBTSxPQUFPLEdBQUcsSUFBQSx1Q0FBMkIsRUFDekMsSUFBQSxvQkFBYSxFQUFDLElBQUksRUFBRSxVQUFVLENBQUMsRUFDL0IsVUFBVSxFQUNWLGFBQWEsRUFDYixXQUFXLENBQUMsSUFBSSxDQUFDLFVBQVU7Z0JBQzNCLHFGQUFxRjtnQkFDckYsSUFBSSxDQUNMLENBQUM7Z0JBRUYsSUFBQSx5QkFBa0IsRUFBQyxJQUFJLEVBQUUsVUFBVSxFQUFFLE9BQU8sQ0FBQyxDQUFDO1lBQ2hELENBQUM7U0FDRixDQUFDLENBQUM7SUFDTCxDQUFDLENBQUM7QUFDSixDQUFDO0FBRUQ7Ozs7OztHQU1HO0FBQ0gsU0FBUyxnQ0FBZ0MsQ0FDdkMsSUFBVSxFQUNWLFdBQXdCLEVBQ3hCLFlBQW9CLEVBQ3BCLGVBQWtEO0lBRWxELE1BQU0sYUFBYSxHQUFHLElBQUEsbUNBQTRCLEVBQUMsSUFBSSxFQUFFLFlBQVksQ0FBQyxDQUFDO0lBQ3ZFLE1BQU0sVUFBVSxHQUFHLElBQUEsMEJBQWEsRUFBQyxhQUFhLEVBQUUsSUFBSSxFQUFFLFlBQVksQ0FBQyxFQUFFLFFBQVEsSUFBSSxZQUFZLENBQUM7SUFDOUYsTUFBTSxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsR0FBRyxzQkFBUyxDQUFDLG9CQUFvQixDQUFDLFdBQVcsRUFBRSxVQUFVLENBQUMsQ0FBQztJQUVoRixPQUFPLElBQUEsa0JBQUssRUFBQztRQUNYLEdBQUcsS0FBSztRQUNSLEdBQUcsRUFBRTtZQUNILElBQUksT0FBb0IsQ0FBQztZQUN6QixJQUFJLGVBQXVCLENBQUM7WUFFNUIsSUFBSSxlQUFlLEVBQUU7Z0JBQ25CLE1BQU0sS0FBSyxHQUFHLElBQUksc0JBQVMsRUFBRSxDQUFDO2dCQUM5QixNQUFNLE1BQU0sR0FBRyxzQkFBUyxDQUFDLG9CQUFvQixDQUMzQyxLQUFLLENBQUMsSUFBSSxDQUFBLEdBQUcsS0FBSyxDQUFDLFFBQVEsQ0FBQyxlQUFlLENBQUMsSUFBSSxFQUFFLGVBQWUsQ0FBQyxNQUFNLENBQUMsSUFDdkUsSUFBSSxDQUFDLFVBQ1AsR0FBRyxFQUNILFVBQVUsQ0FDWCxDQUFDO2dCQUVGLE9BQU8sR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDO2dCQUN0QixlQUFlLEdBQUcsTUFBTSxDQUFDLEtBQUssQ0FBQzthQUNoQztpQkFBTTtnQkFDTCxPQUFPLEdBQUcsSUFBSSxDQUFDO2dCQUNmLGVBQWUsR0FBRyxFQUFFLENBQUM7YUFDdEI7WUFFRCxPQUFPLElBQUEsa0JBQUssRUFBQztnQkFDWCxHQUFHLGVBQWU7Z0JBQ2xCLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyw0QkFBNEIsQ0FBQyxJQUFJLEVBQUUsWUFBWSxFQUFFLE9BQU8sQ0FBQyxVQUFVLENBQUM7YUFDL0UsQ0FBQyxDQUFDO1FBQ0wsQ0FBQztLQUNGLENBQUMsQ0FBQztBQUNMLENBQUM7QUFFRDs7Ozs7R0FLRztBQUNILFNBQVMsNEJBQTRCLENBQUMsSUFBVSxFQUFFLFlBQW9CLEVBQUUsVUFBa0I7SUFDeEYsTUFBTSxhQUFhLEdBQUcsSUFBQSxtQ0FBNEIsRUFBQyxJQUFJLEVBQUUsWUFBWSxDQUFDLENBQUM7SUFDdkUsTUFBTSxTQUFTLEdBQUcsSUFBQSwwQkFBYSxFQUFDLGFBQWEsRUFBRSxJQUFJLEVBQUUsWUFBWSxDQUFDLENBQUM7SUFFbkUsSUFBSSxhQUFhLENBQUMsU0FBUyxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUU7UUFDeEMsTUFBTSxJQUFJLGdDQUFtQixDQUMzQiwrREFDRSxhQUFhLENBQUMsYUFBYSxFQUFFLENBQUMsUUFDaEMsRUFBRSxDQUNILENBQUM7S0FDSDtJQUVELElBQUksU0FBUyxFQUFFO1FBQ2IsaUNBQWlDLENBQUMsSUFBSSxFQUFFLFNBQVMsRUFBRSxVQUFVLENBQUMsQ0FBQztRQUUvRCxPQUFPO0tBQ1I7SUFFRCxNQUFNLFlBQVksR0FBRyxRQUFRLFdBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUEsZUFBZSxVQUFVLEdBQUcsS0FBSyxDQUFDO0lBQy9FLElBQUksVUFBNkIsQ0FBQztJQUVsQyxJQUFJLGFBQWEsQ0FBQyxTQUFTLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRTtRQUN4QyxVQUFVLEdBQUcsYUFBYSxDQUFDO0tBQzVCO1NBQU0sSUFBSSxJQUFBLDJCQUFvQixFQUFDLGFBQWEsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRTtRQUMzRCxVQUFVLEdBQUcsYUFBYSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQztLQUN6QztTQUFNO1FBQ0wsTUFBTSxJQUFJLGdDQUFtQixDQUMzQiwwREFDRSxhQUFhLENBQUMsYUFBYSxFQUFFLENBQUMsUUFDaEMsRUFBRSxDQUNILENBQUM7S0FDSDtJQUVELElBQUEseUJBQWtCLEVBQUMsSUFBSSxFQUFFLFlBQVksRUFBRTtRQUNyQyxJQUFBLHFDQUF5QixFQUN2QixVQUFVLENBQUMsU0FBUyxFQUNwQixZQUFZLEVBQ1osWUFBWSxFQUNaLFVBQVUsQ0FBQyxNQUFNLEVBQUUsR0FBRyxDQUFDLENBQ3hCO0tBQ0YsQ0FBQyxDQUFDO0FBQ0wsQ0FBQztBQUVEOzs7OztHQUtHO0FBQ0gsU0FBUyxpQ0FBaUMsQ0FDeEMsSUFBVSxFQUNWLFNBQTRCLEVBQzVCLFVBQWtCO0lBRWxCLE1BQU0sRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFLEdBQUcsU0FBUyxDQUFDO0lBQ3JDLE1BQU0sV0FBVyxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUM7SUFDcEMsTUFBTSxnQkFBZ0IsR0FBRyxJQUFBLDJCQUFvQixFQUFDLElBQUksQ0FBQyxDQUFDO0lBRXBELDZEQUE2RDtJQUM3RCxvREFBb0Q7SUFDcEQsSUFBSSxnQkFBZ0IsRUFBRTtRQUNwQixNQUFNLGdCQUFnQixHQUFHLGdCQUFnQixDQUFDLFFBQVEsQ0FBQyxnQkFBZ0IsQ0FBQztRQUVwRSxJQUFBLHlCQUFrQixFQUFDLElBQUksRUFBRSxRQUFRLEVBQUU7WUFDakMsSUFBQSxxQ0FBeUIsRUFDdkIsZ0JBQWdCLENBQUMsUUFBUSxFQUN6QixDQUFDLGdCQUFnQixJQUFJLGdCQUFnQixDQUFDLFFBQVEsQ0FBQyxNQUFNLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLFVBQVUsRUFDckYsUUFBUSxFQUNSLGdCQUFnQixDQUFDLFFBQVEsRUFBRSxHQUFHLENBQUMsQ0FDaEM7U0FDRixDQUFDLENBQUM7S0FDSjtTQUFNO1FBQ0wsTUFBTSxJQUFJLEdBQUcsV0FBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQSxlQUFlLFVBQVUsR0FBRyxDQUFDO1FBQzFELElBQUksUUFBZ0IsQ0FBQztRQUNyQixJQUFJLGNBQXNCLENBQUM7UUFFM0IsSUFBSSxXQUFXLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRTtZQUM1QixRQUFRLEdBQUcsSUFBSSxHQUFHLElBQUksR0FBRyxJQUFJLENBQUM7WUFDOUIsY0FBYyxHQUFHLElBQUksQ0FBQyxNQUFNLEVBQUUsR0FBRyxDQUFDLENBQUM7U0FDcEM7YUFBTTtZQUNMLE1BQU0sZ0JBQWdCLEdBQUcsV0FBVyxDQUFDLGdCQUFnQixDQUFDO1lBQ3RELFFBQVEsR0FBRyxDQUFDLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLElBQUksR0FBRyxJQUFJLENBQUM7WUFDdkQsY0FBYyxHQUFHLFdBQVcsQ0FBQyxXQUFXLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDLE1BQU0sRUFBRSxHQUFHLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7U0FDNUY7UUFFRCxJQUFBLHlCQUFrQixFQUFDLElBQUksRUFBRSxRQUFRLEVBQUUsQ0FBQyxJQUFJLHFCQUFZLENBQUMsUUFBUSxFQUFFLGNBQWMsRUFBRSxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUM7S0FDNUY7QUFDSCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IEdvb2dsZSBMTEMgQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqXG4gKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZVxuICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZVxuICovXG5cbmltcG9ydCB7IHRhZ3MgfSBmcm9tICdAYW5ndWxhci1kZXZraXQvY29yZSc7XG5pbXBvcnQgeyBSdWxlLCBTY2hlbWF0aWNzRXhjZXB0aW9uLCBUcmVlLCBjaGFpbiB9IGZyb20gJ0Bhbmd1bGFyLWRldmtpdC9zY2hlbWF0aWNzJztcbmltcG9ydCB0cyBmcm9tICcuLi8uLi90aGlyZF9wYXJ0eS9naXRodWIuY29tL01pY3Jvc29mdC9UeXBlU2NyaXB0L2xpYi90eXBlc2NyaXB0JztcbmltcG9ydCB7IGFkZFN5bWJvbFRvTmdNb2R1bGVNZXRhZGF0YSwgaW5zZXJ0QWZ0ZXJMYXN0T2NjdXJyZW5jZSB9IGZyb20gJy4uL2FzdC11dGlscyc7XG5pbXBvcnQgeyBJbnNlcnRDaGFuZ2UgfSBmcm9tICcuLi9jaGFuZ2UnO1xuaW1wb3J0IHsgZ2V0QXBwTW9kdWxlUGF0aCwgaXNTdGFuZGFsb25lQXBwIH0gZnJvbSAnLi4vbmctYXN0LXV0aWxzJztcbmltcG9ydCB7IFJlc29sdmVkQXBwQ29uZmlnLCBmaW5kQXBwQ29uZmlnIH0gZnJvbSAnLi9hcHBfY29uZmlnJztcbmltcG9ydCB7IENvZGVCbG9jaywgQ29kZUJsb2NrQ2FsbGJhY2ssIFBlbmRpbmdDb2RlIH0gZnJvbSAnLi9jb2RlX2Jsb2NrJztcbmltcG9ydCB7XG4gIGFwcGx5Q2hhbmdlc1RvRmlsZSxcbiAgZmluZEJvb3RzdHJhcEFwcGxpY2F0aW9uQ2FsbCxcbiAgZmluZFByb3ZpZGVyc0xpdGVyYWwsXG4gIGdldE1haW5GaWxlUGF0aCxcbiAgZ2V0U291cmNlRmlsZSxcbiAgaXNNZXJnZUFwcENvbmZpZ0NhbGwsXG59IGZyb20gJy4vdXRpbCc7XG5cbi8qKlxuICogQWRkcyBhbiBpbXBvcnQgdG8gdGhlIHJvb3Qgb2YgdGhlIHByb2plY3QuXG4gKiBAcGFyYW0gcHJvamVjdCBOYW1lIG9mIHRoZSBwcm9qZWN0IHRvIHdoaWNoIHRvIGFkZCB0aGUgaW1wb3J0LlxuICogQHBhcmFtIGNhbGxiYWNrIEZ1bmN0aW9uIHRoYXQgZ2VuZXJhdGVzIHRoZSBjb2RlIGJsb2NrIHdoaWNoIHNob3VsZCBiZSBpbnNlcnRlZC5cbiAqIEBleGFtcGxlXG4gKlxuICogYGBgdHNcbiAqIGltcG9ydCB7IFJ1bGUgfSBmcm9tICdAYW5ndWxhci1kZXZraXQvc2NoZW1hdGljcyc7XG4gKiBpbXBvcnQgeyBhZGRSb290SW1wb3J0IH0gZnJvbSAnQHNjaGVtYXRpY3MvYW5ndWxhci91dGlsaXR5JztcbiAqXG4gKiBleHBvcnQgZGVmYXVsdCBmdW5jdGlvbigpOiBSdWxlIHtcbiAqICAgcmV0dXJuIGFkZFJvb3RJbXBvcnQoJ2RlZmF1bHQnLCAoe2NvZGUsIGV4dGVybmFsfSkgPT4ge1xuICogICAgIHJldHVybiBjb2RlYCR7ZXh0ZXJuYWwoJ015TW9kdWxlJywgJ0BteS9tb2R1bGUnKX0uZm9yUm9vdCh7fSlgO1xuICogICB9KTtcbiAqIH1cbiAqIGBgYFxuICovXG5leHBvcnQgZnVuY3Rpb24gYWRkUm9vdEltcG9ydChwcm9qZWN0OiBzdHJpbmcsIGNhbGxiYWNrOiBDb2RlQmxvY2tDYWxsYmFjayk6IFJ1bGUge1xuICByZXR1cm4gZ2V0Um9vdEluc2VydGlvblJ1bGUocHJvamVjdCwgY2FsbGJhY2ssICdpbXBvcnRzJywge1xuICAgIG5hbWU6ICdpbXBvcnRQcm92aWRlcnNGcm9tJyxcbiAgICBtb2R1bGU6ICdAYW5ndWxhci9jb3JlJyxcbiAgfSk7XG59XG5cbi8qKlxuICogQWRkcyBhIHByb3ZpZGVyIHRvIHRoZSByb290IG9mIHRoZSBwcm9qZWN0LlxuICogQHBhcmFtIHByb2plY3QgTmFtZSBvZiB0aGUgcHJvamVjdCB0byB3aGljaCB0byBhZGQgdGhlIGltcG9ydC5cbiAqIEBwYXJhbSBjYWxsYmFjayBGdW5jdGlvbiB0aGF0IGdlbmVyYXRlcyB0aGUgY29kZSBibG9jayB3aGljaCBzaG91bGQgYmUgaW5zZXJ0ZWQuXG4gKiBAZXhhbXBsZVxuICpcbiAqIGBgYHRzXG4gKiBpbXBvcnQgeyBSdWxlIH0gZnJvbSAnQGFuZ3VsYXItZGV2a2l0L3NjaGVtYXRpY3MnO1xuICogaW1wb3J0IHsgYWRkUm9vdFByb3ZpZGVyIH0gZnJvbSAnQHNjaGVtYXRpY3MvYW5ndWxhci91dGlsaXR5JztcbiAqXG4gKiBleHBvcnQgZGVmYXVsdCBmdW5jdGlvbigpOiBSdWxlIHtcbiAqICAgcmV0dXJuIGFkZFJvb3RQcm92aWRlcignZGVmYXVsdCcsICh7Y29kZSwgZXh0ZXJuYWx9KSA9PiB7XG4gKiAgICAgcmV0dXJuIGNvZGVgJHtleHRlcm5hbCgncHJvdmlkZUxpYnJhcnknLCAnQG15L2xpYnJhcnknKX0oe30pYDtcbiAqICAgfSk7XG4gKiB9XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFkZFJvb3RQcm92aWRlcihwcm9qZWN0OiBzdHJpbmcsIGNhbGxiYWNrOiBDb2RlQmxvY2tDYWxsYmFjayk6IFJ1bGUge1xuICByZXR1cm4gZ2V0Um9vdEluc2VydGlvblJ1bGUocHJvamVjdCwgY2FsbGJhY2ssICdwcm92aWRlcnMnKTtcbn1cblxuLyoqXG4gKiBDcmVhdGVzIGEgcnVsZSB0aGF0IGluc2VydHMgY29kZSBhdCB0aGUgcm9vdCBvZiBlaXRoZXIgYSBzdGFuZGFsb25lIG9yIE5nTW9kdWxlLWJhc2VkIHByb2plY3QuXG4gKiBAcGFyYW0gcHJvamVjdCBOYW1lIG9mIHRoZSBwcm9qZWN0IGludG8gd2hpY2ggdG8gaW5zZXIgdHRoZSBjb2RlLlxuICogQHBhcmFtIGNhbGxiYWNrIEZ1bmN0aW9uIHRoYXQgZ2VuZXJhdGVzIHRoZSBjb2RlIGJsb2NrIHdoaWNoIHNob3VsZCBiZSBpbnNlcnRlZC5cbiAqIEBwYXJhbSBuZ01vZHVsZUZpZWxkIEZpZWxkIG9mIHRoZSByb290IE5nTW9kdWxlIGludG8gd2hpY2ggdGhlIGNvZGUgc2hvdWxkIGJlIGluc2VydGVkLCBpZiB0aGVcbiAqIGFwcCBpcyBiYXNlZCBvbiBOZ01vZHVsZVxuICogQHBhcmFtIHN0YW5kYWxvbmVXcmFwcGVyRnVuY3Rpb24gRnVuY3Rpb24gd2l0aCB3aGljaCB0byB3cmFwIHRoZSBjb2RlIGlmIHRoZSBhcHAgaXMgc3RhbmRhbG9uZS5cbiAqL1xuZnVuY3Rpb24gZ2V0Um9vdEluc2VydGlvblJ1bGUoXG4gIHByb2plY3Q6IHN0cmluZyxcbiAgY2FsbGJhY2s6IENvZGVCbG9ja0NhbGxiYWNrLFxuICBuZ01vZHVsZUZpZWxkOiBzdHJpbmcsXG4gIHN0YW5kYWxvbmVXcmFwcGVyRnVuY3Rpb24/OiB7IG5hbWU6IHN0cmluZzsgbW9kdWxlOiBzdHJpbmcgfSxcbik6IFJ1bGUge1xuICByZXR1cm4gYXN5bmMgKGhvc3QpID0+IHtcbiAgICBjb25zdCBtYWluRmlsZVBhdGggPSBhd2FpdCBnZXRNYWluRmlsZVBhdGgoaG9zdCwgcHJvamVjdCk7XG4gICAgY29uc3QgY29kZUJsb2NrID0gbmV3IENvZGVCbG9jaygpO1xuXG4gICAgaWYgKGlzU3RhbmRhbG9uZUFwcChob3N0LCBtYWluRmlsZVBhdGgpKSB7XG4gICAgICByZXR1cm4gKHRyZWUpID0+XG4gICAgICAgIGFkZFByb3ZpZGVyVG9TdGFuZGFsb25lQm9vdHN0cmFwKFxuICAgICAgICAgIHRyZWUsXG4gICAgICAgICAgY2FsbGJhY2soY29kZUJsb2NrKSxcbiAgICAgICAgICBtYWluRmlsZVBhdGgsXG4gICAgICAgICAgc3RhbmRhbG9uZVdyYXBwZXJGdW5jdGlvbixcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBjb25zdCBtb2R1bGVQYXRoID0gZ2V0QXBwTW9kdWxlUGF0aChob3N0LCBtYWluRmlsZVBhdGgpO1xuICAgIGNvbnN0IHBlbmRpbmdDb2RlID0gQ29kZUJsb2NrLnRyYW5zZm9ybVBlbmRpbmdDb2RlKGNhbGxiYWNrKGNvZGVCbG9jayksIG1vZHVsZVBhdGgpO1xuXG4gICAgcmV0dXJuIGNoYWluKFtcbiAgICAgIC4uLnBlbmRpbmdDb2RlLnJ1bGVzLFxuICAgICAgKHRyZWUpID0+IHtcbiAgICAgICAgY29uc3QgY2hhbmdlcyA9IGFkZFN5bWJvbFRvTmdNb2R1bGVNZXRhZGF0YShcbiAgICAgICAgICBnZXRTb3VyY2VGaWxlKHRyZWUsIG1vZHVsZVBhdGgpLFxuICAgICAgICAgIG1vZHVsZVBhdGgsXG4gICAgICAgICAgbmdNb2R1bGVGaWVsZCxcbiAgICAgICAgICBwZW5kaW5nQ29kZS5jb2RlLmV4cHJlc3Npb24sXG4gICAgICAgICAgLy8gRXhwbGljaXRseSBzZXQgdGhlIGltcG9ydCBwYXRoIHRvIG51bGwgc2luY2Ugd2UgZGVhbCB3aXRoIGltcG9ydHMgaGVyZSBzZXBhcmF0ZWx5LlxuICAgICAgICAgIG51bGwsXG4gICAgICAgICk7XG5cbiAgICAgICAgYXBwbHlDaGFuZ2VzVG9GaWxlKHRyZWUsIG1vZHVsZVBhdGgsIGNoYW5nZXMpO1xuICAgICAgfSxcbiAgICBdKTtcbiAgfTtcbn1cblxuLyoqXG4gKiBBZGRzIGEgcHJvdmlkZXIgdG8gdGhlIHJvb3Qgb2YgYSBzdGFuZGFsb25lIHByb2plY3QuXG4gKiBAcGFyYW0gaG9zdCBUcmVlIG9mIHRoZSByb290IHJ1bGUuXG4gKiBAcGFyYW0gcGVuZGluZ0NvZGUgQ29kZSB0aGF0IHNob3VsZCBiZSBpbnNlcnRlZC5cbiAqIEBwYXJhbSBtYWluRmlsZVBhdGggUGF0aCB0byB0aGUgcHJvamVjdCdzIG1haW4gZmlsZS5cbiAqIEBwYXJhbSB3cmFwcGVyRnVuY3Rpb24gT3B0aW9uYWwgZnVuY3Rpb24gd2l0aCB3aGljaCB0byB3cmFwIHRoZSBwcm92aWRlci5cbiAqL1xuZnVuY3Rpb24gYWRkUHJvdmlkZXJUb1N0YW5kYWxvbmVCb290c3RyYXAoXG4gIGhvc3Q6IFRyZWUsXG4gIHBlbmRpbmdDb2RlOiBQZW5kaW5nQ29kZSxcbiAgbWFpbkZpbGVQYXRoOiBzdHJpbmcsXG4gIHdyYXBwZXJGdW5jdGlvbj86IHsgbmFtZTogc3RyaW5nOyBtb2R1bGU6IHN0cmluZyB9LFxuKTogUnVsZSB7XG4gIGNvbnN0IGJvb3RzdHJhcENhbGwgPSBmaW5kQm9vdHN0cmFwQXBwbGljYXRpb25DYWxsKGhvc3QsIG1haW5GaWxlUGF0aCk7XG4gIGNvbnN0IGZpbGVUb0VkaXQgPSBmaW5kQXBwQ29uZmlnKGJvb3RzdHJhcENhbGwsIGhvc3QsIG1haW5GaWxlUGF0aCk/LmZpbGVQYXRoIHx8IG1haW5GaWxlUGF0aDtcbiAgY29uc3QgeyBjb2RlLCBydWxlcyB9ID0gQ29kZUJsb2NrLnRyYW5zZm9ybVBlbmRpbmdDb2RlKHBlbmRpbmdDb2RlLCBmaWxlVG9FZGl0KTtcblxuICByZXR1cm4gY2hhaW4oW1xuICAgIC4uLnJ1bGVzLFxuICAgICgpID0+IHtcbiAgICAgIGxldCB3cmFwcGVkOiBQZW5kaW5nQ29kZTtcbiAgICAgIGxldCBhZGRpdGlvbmFsUnVsZXM6IFJ1bGVbXTtcblxuICAgICAgaWYgKHdyYXBwZXJGdW5jdGlvbikge1xuICAgICAgICBjb25zdCBibG9jayA9IG5ldyBDb2RlQmxvY2soKTtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gQ29kZUJsb2NrLnRyYW5zZm9ybVBlbmRpbmdDb2RlKFxuICAgICAgICAgIGJsb2NrLmNvZGVgJHtibG9jay5leHRlcm5hbCh3cmFwcGVyRnVuY3Rpb24ubmFtZSwgd3JhcHBlckZ1bmN0aW9uLm1vZHVsZSl9KCR7XG4gICAgICAgICAgICBjb2RlLmV4cHJlc3Npb25cbiAgICAgICAgICB9KWAsXG4gICAgICAgICAgZmlsZVRvRWRpdCxcbiAgICAgICAgKTtcblxuICAgICAgICB3cmFwcGVkID0gcmVzdWx0LmNvZGU7XG4gICAgICAgIGFkZGl0aW9uYWxSdWxlcyA9IHJlc3VsdC5ydWxlcztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHdyYXBwZWQgPSBjb2RlO1xuICAgICAgICBhZGRpdGlvbmFsUnVsZXMgPSBbXTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGNoYWluKFtcbiAgICAgICAgLi4uYWRkaXRpb25hbFJ1bGVzLFxuICAgICAgICAodHJlZSkgPT4gaW5zZXJ0U3RhbmRhbG9uZVJvb3RQcm92aWRlcih0cmVlLCBtYWluRmlsZVBhdGgsIHdyYXBwZWQuZXhwcmVzc2lvbiksXG4gICAgICBdKTtcbiAgICB9LFxuICBdKTtcbn1cblxuLyoqXG4gKiBJbnNlcnRzIGEgc3RyaW5nIGV4cHJlc3Npb24gaW50byB0aGUgcm9vdCBvZiBhIHN0YW5kYWxvbmUgcHJvamVjdC5cbiAqIEBwYXJhbSB0cmVlIEZpbGUgdHJlZSB1c2VkIHRvIG1vZGlmeSB0aGUgcHJvamVjdC5cbiAqIEBwYXJhbSBtYWluRmlsZVBhdGggUGF0aCB0byB0aGUgbWFpbiBmaWxlIG9mIHRoZSBwcm9qZWN0LlxuICogQHBhcmFtIGV4cHJlc3Npb24gQ29kZSBleHByZXNzaW9uIHRvIGJlIGluc2VydGVkLlxuICovXG5mdW5jdGlvbiBpbnNlcnRTdGFuZGFsb25lUm9vdFByb3ZpZGVyKHRyZWU6IFRyZWUsIG1haW5GaWxlUGF0aDogc3RyaW5nLCBleHByZXNzaW9uOiBzdHJpbmcpOiB2b2lkIHtcbiAgY29uc3QgYm9vdHN0cmFwQ2FsbCA9IGZpbmRCb290c3RyYXBBcHBsaWNhdGlvbkNhbGwodHJlZSwgbWFpbkZpbGVQYXRoKTtcbiAgY29uc3QgYXBwQ29uZmlnID0gZmluZEFwcENvbmZpZyhib290c3RyYXBDYWxsLCB0cmVlLCBtYWluRmlsZVBhdGgpO1xuXG4gIGlmIChib290c3RyYXBDYWxsLmFyZ3VtZW50cy5sZW5ndGggPT09IDApIHtcbiAgICB0aHJvdyBuZXcgU2NoZW1hdGljc0V4Y2VwdGlvbihcbiAgICAgIGBDYW5ub3QgYWRkIHByb3ZpZGVyIHRvIGludmFsaWQgYm9vdHN0cmFwQXBwbGljYXRpb24gY2FsbCBpbiAke1xuICAgICAgICBib290c3RyYXBDYWxsLmdldFNvdXJjZUZpbGUoKS5maWxlTmFtZVxuICAgICAgfWAsXG4gICAgKTtcbiAgfVxuXG4gIGlmIChhcHBDb25maWcpIHtcbiAgICBhZGRQcm92aWRlcnNFeHByZXNzaW9uVG9BcHBDb25maWcodHJlZSwgYXBwQ29uZmlnLCBleHByZXNzaW9uKTtcblxuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnN0IG5ld0FwcENvbmZpZyA9IGAsIHtcXG4ke3RhZ3MuaW5kZW50QnkoMilgcHJvdmlkZXJzOiBbJHtleHByZXNzaW9ufV1gfVxcbn1gO1xuICBsZXQgdGFyZ2V0Q2FsbDogdHMuQ2FsbEV4cHJlc3Npb247XG5cbiAgaWYgKGJvb3RzdHJhcENhbGwuYXJndW1lbnRzLmxlbmd0aCA9PT0gMSkge1xuICAgIHRhcmdldENhbGwgPSBib290c3RyYXBDYWxsO1xuICB9IGVsc2UgaWYgKGlzTWVyZ2VBcHBDb25maWdDYWxsKGJvb3RzdHJhcENhbGwuYXJndW1lbnRzWzFdKSkge1xuICAgIHRhcmdldENhbGwgPSBib290c3RyYXBDYWxsLmFyZ3VtZW50c1sxXTtcbiAgfSBlbHNlIHtcbiAgICB0aHJvdyBuZXcgU2NoZW1hdGljc0V4Y2VwdGlvbihcbiAgICAgIGBDYW5ub3Qgc3RhdGljYWxseSBhbmFseXplIGJvb3RzdHJhcEFwcGxpY2F0aW9uIGNhbGwgaW4gJHtcbiAgICAgICAgYm9vdHN0cmFwQ2FsbC5nZXRTb3VyY2VGaWxlKCkuZmlsZU5hbWVcbiAgICAgIH1gLFxuICAgICk7XG4gIH1cblxuICBhcHBseUNoYW5nZXNUb0ZpbGUodHJlZSwgbWFpbkZpbGVQYXRoLCBbXG4gICAgaW5zZXJ0QWZ0ZXJMYXN0T2NjdXJyZW5jZShcbiAgICAgIHRhcmdldENhbGwuYXJndW1lbnRzLFxuICAgICAgbmV3QXBwQ29uZmlnLFxuICAgICAgbWFpbkZpbGVQYXRoLFxuICAgICAgdGFyZ2V0Q2FsbC5nZXRFbmQoKSAtIDEsXG4gICAgKSxcbiAgXSk7XG59XG5cbi8qKlxuICogQWRkcyBhIHN0cmluZyBleHByZXNzaW9uIHRvIGFuIGFwcCBjb25maWcgb2JqZWN0LlxuICogQHBhcmFtIHRyZWUgRmlsZSB0cmVlIHVzZWQgdG8gbW9kaWZ5IHRoZSBwcm9qZWN0LlxuICogQHBhcmFtIGFwcENvbmZpZyBSZXNvbHZlZCBjb25maWd1cmF0aW9uIG9iamVjdCBvZiB0aGUgcHJvamVjdC5cbiAqIEBwYXJhbSBleHByZXNzaW9uIENvZGUgZXhwcmVzc2lvbiB0byBiZSBpbnNlcnRlZC5cbiAqL1xuZnVuY3Rpb24gYWRkUHJvdmlkZXJzRXhwcmVzc2lvblRvQXBwQ29uZmlnKFxuICB0cmVlOiBUcmVlLFxuICBhcHBDb25maWc6IFJlc29sdmVkQXBwQ29uZmlnLFxuICBleHByZXNzaW9uOiBzdHJpbmcsXG4pOiB2b2lkIHtcbiAgY29uc3QgeyBub2RlLCBmaWxlUGF0aCB9ID0gYXBwQ29uZmlnO1xuICBjb25zdCBjb25maWdQcm9wcyA9IG5vZGUucHJvcGVydGllcztcbiAgY29uc3QgcHJvdmlkZXJzTGl0ZXJhbCA9IGZpbmRQcm92aWRlcnNMaXRlcmFsKG5vZGUpO1xuXG4gIC8vIElmIHRoZXJlJ3MgYSBgcHJvdmlkZXJzYCBwcm9wZXJ0eSwgd2UgY2FuIGFkZCB0aGUgcHJvdmlkZXJcbiAgLy8gdG8gaXQsIG90aGVyd2lzZSB3ZSBuZWVkIHRvIGRlY2xhcmUgaXQgb3Vyc2VsdmVzLlxuICBpZiAocHJvdmlkZXJzTGl0ZXJhbCkge1xuICAgIGNvbnN0IGhhc1RyYWlsaW5nQ29tbWEgPSBwcm92aWRlcnNMaXRlcmFsLmVsZW1lbnRzLmhhc1RyYWlsaW5nQ29tbWE7XG5cbiAgICBhcHBseUNoYW5nZXNUb0ZpbGUodHJlZSwgZmlsZVBhdGgsIFtcbiAgICAgIGluc2VydEFmdGVyTGFzdE9jY3VycmVuY2UoXG4gICAgICAgIHByb3ZpZGVyc0xpdGVyYWwuZWxlbWVudHMsXG4gICAgICAgIChoYXNUcmFpbGluZ0NvbW1hIHx8IHByb3ZpZGVyc0xpdGVyYWwuZWxlbWVudHMubGVuZ3RoID09PSAwID8gJycgOiAnLCAnKSArIGV4cHJlc3Npb24sXG4gICAgICAgIGZpbGVQYXRoLFxuICAgICAgICBwcm92aWRlcnNMaXRlcmFsLmdldFN0YXJ0KCkgKyAxLFxuICAgICAgKSxcbiAgICBdKTtcbiAgfSBlbHNlIHtcbiAgICBjb25zdCBwcm9wID0gdGFncy5pbmRlbnRCeSgyKWBwcm92aWRlcnM6IFske2V4cHJlc3Npb259XWA7XG4gICAgbGV0IHRvSW5zZXJ0OiBzdHJpbmc7XG4gICAgbGV0IGluc2VydFBvc2l0aW9uOiBudW1iZXI7XG5cbiAgICBpZiAoY29uZmlnUHJvcHMubGVuZ3RoID09PSAwKSB7XG4gICAgICB0b0luc2VydCA9ICdcXG4nICsgcHJvcCArICdcXG4nO1xuICAgICAgaW5zZXJ0UG9zaXRpb24gPSBub2RlLmdldEVuZCgpIC0gMTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgaGFzVHJhaWxpbmdDb21tYSA9IGNvbmZpZ1Byb3BzLmhhc1RyYWlsaW5nQ29tbWE7XG4gICAgICB0b0luc2VydCA9IChoYXNUcmFpbGluZ0NvbW1hID8gJycgOiAnLCcpICsgJ1xcbicgKyBwcm9wO1xuICAgICAgaW5zZXJ0UG9zaXRpb24gPSBjb25maWdQcm9wc1tjb25maWdQcm9wcy5sZW5ndGggLSAxXS5nZXRFbmQoKSArIChoYXNUcmFpbGluZ0NvbW1hID8gMSA6IDApO1xuICAgIH1cblxuICAgIGFwcGx5Q2hhbmdlc1RvRmlsZSh0cmVlLCBmaWxlUGF0aCwgW25ldyBJbnNlcnRDaGFuZ2UoZmlsZVBhdGgsIGluc2VydFBvc2l0aW9uLCB0b0luc2VydCldKTtcbiAgfVxufVxuIl19
@@ -0,0 +1,35 @@
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 { Tree } from '@angular-devkit/schematics';
9
+ import ts from '../../third_party/github.com/Microsoft/TypeScript/lib/typescript';
10
+ import { Change } from '../change';
11
+ /**
12
+ * Finds the main file of a project.
13
+ * @param tree File tree for the project.
14
+ * @param projectName Name of the project in which to search.
15
+ */
16
+ export declare function getMainFilePath(tree: Tree, projectName: string): Promise<string>;
17
+ /**
18
+ * Gets a TypeScript source file at a specific path.
19
+ * @param tree File tree of a project.
20
+ * @param path Path to the file.
21
+ */
22
+ export declare function getSourceFile(tree: Tree, path: string): ts.SourceFile;
23
+ /** Finds the call to `bootstrapApplication` within a file. */
24
+ export declare function findBootstrapApplicationCall(tree: Tree, mainFilePath: string): ts.CallExpression;
25
+ /**
26
+ * Applies a set of changes to a file.
27
+ * @param tree File tree of the project.
28
+ * @param path Path to the file that is being changed.
29
+ * @param changes Changes that should be applied to the file.
30
+ */
31
+ export declare function applyChangesToFile(tree: Tree, path: string, changes: Change[]): void;
32
+ /** Checks whether a node is a call to `mergeApplicationConfig`. */
33
+ export declare function isMergeAppConfigCall(node: ts.Node): node is ts.CallExpression;
34
+ /** Finds the `providers` array literal within an application config. */
35
+ export declare function findProvidersLiteral(config: ts.ObjectLiteralExpression): ts.ArrayLiteralExpression | null;