@angular/core 13.0.0-rc.0 → 13.0.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.
- package/core.d.ts +224 -221
- package/esm2020/index.mjs +6 -5
- package/esm2020/src/application_module.mjs +2 -7
- package/esm2020/src/core_render3_private_export.mjs +2 -1
- package/esm2020/src/linker/component_factory_resolver.mjs +5 -5
- package/esm2020/src/linker/ng_module_factory.mjs +1 -1
- package/esm2020/src/render3/definition.mjs +2 -5
- package/esm2020/src/render3/di.mjs +3 -3
- package/esm2020/src/render3/error_code.mjs +2 -5
- package/esm2020/src/render3/error_details_base_url.mjs +16 -0
- package/esm2020/src/render3/fields.mjs +1 -2
- package/esm2020/src/render3/ng_module_ref.mjs +2 -5
- package/esm2020/src/render3/util/global_utils.mjs +2 -3
- package/esm2020/src/version.mjs +1 -1
- package/esm2020/testing/src/logger.mjs +3 -3
- package/esm2020/testing/src/ng_zone_mock.mjs +3 -3
- package/esm2020/testing/src/test_compiler.mjs +3 -3
- package/fesm2015/core.mjs +26 -25
- package/fesm2015/core.mjs.map +1 -1
- package/fesm2015/testing.mjs +4 -4
- package/fesm2020/core.mjs +26 -25
- package/fesm2020/core.mjs.map +1 -1
- package/fesm2020/testing.mjs +4 -4
- package/package.json +1 -1
- package/schematics/migrations/router-link-empty-expression/index.js +2 -2
- package/schematics/migrations.json +0 -100
- package/schematics/utils/ng_component_template.d.ts +4 -1
- package/schematics/utils/ng_component_template.js +28 -14
- package/testing/testing.d.ts +1 -1
- package/schematics/migrations/abstract-control-parent/index.d.ts +0 -11
- package/schematics/migrations/abstract-control-parent/index.js +0 -69
- package/schematics/migrations/abstract-control-parent/util.d.ts +0 -14
- package/schematics/migrations/abstract-control-parent/util.js +0 -67
- package/schematics/migrations/activated-route-snapshot-fragment/index.d.ts +0 -13
- package/schematics/migrations/activated-route-snapshot-fragment/index.js +0 -73
- package/schematics/migrations/activated-route-snapshot-fragment/util.d.ts +0 -16
- package/schematics/migrations/activated-route-snapshot-fragment/util.js +0 -51
- package/schematics/migrations/can-activate-with-redirect-to/index.d.ts +0 -11
- package/schematics/migrations/can-activate-with-redirect-to/index.js +0 -69
- package/schematics/migrations/can-activate-with-redirect-to/util.d.ts +0 -11
- package/schematics/migrations/can-activate-with-redirect-to/util.js +0 -73
- package/schematics/migrations/deep-shadow-piercing-selector/index.d.ts +0 -10
- package/schematics/migrations/deep-shadow-piercing-selector/index.js +0 -49
- package/schematics/migrations/dynamic-queries/index.d.ts +0 -13
- package/schematics/migrations/dynamic-queries/index.js +0 -76
- package/schematics/migrations/dynamic-queries/util.d.ts +0 -25
- package/schematics/migrations/dynamic-queries/util.js +0 -84
- package/schematics/migrations/initial-navigation/collector.d.ts +0 -22
- package/schematics/migrations/initial-navigation/collector.js +0 -122
- package/schematics/migrations/initial-navigation/index.d.ts +0 -11
- package/schematics/migrations/initial-navigation/index.js +0 -83
- package/schematics/migrations/initial-navigation/transform.d.ts +0 -20
- package/schematics/migrations/initial-navigation/transform.js +0 -71
- package/schematics/migrations/initial-navigation/update_recorder.d.ts +0 -18
- package/schematics/migrations/initial-navigation/update_recorder.js +0 -20
- package/schematics/migrations/initial-navigation/util.d.ts +0 -12
- package/schematics/migrations/initial-navigation/util.js +0 -46
- package/schematics/migrations/missing-injectable/definition_collector.d.ts +0 -37
- package/schematics/migrations/missing-injectable/definition_collector.js +0 -92
- package/schematics/migrations/missing-injectable/index.d.ts +0 -11
- package/schematics/migrations/missing-injectable/index.js +0 -136
- package/schematics/migrations/missing-injectable/providers_evaluator.d.ts +0 -26
- package/schematics/migrations/missing-injectable/providers_evaluator.js +0 -71
- package/schematics/migrations/missing-injectable/transform.d.ts +0 -70
- package/schematics/migrations/missing-injectable/transform.js +0 -203
- package/schematics/migrations/missing-injectable/update_recorder.d.ts +0 -21
- package/schematics/migrations/missing-injectable/update_recorder.js +0 -20
- package/schematics/migrations/module-with-providers/collector.d.ts +0 -34
- package/schematics/migrations/module-with-providers/collector.js +0 -76
- package/schematics/migrations/module-with-providers/index.d.ts +0 -13
- package/schematics/migrations/module-with-providers/index.js +0 -107
- package/schematics/migrations/module-with-providers/transform.d.ts +0 -50
- package/schematics/migrations/module-with-providers/transform.js +0 -149
- package/schematics/migrations/module-with-providers/util.d.ts +0 -13
- package/schematics/migrations/module-with-providers/util.js +0 -43
- package/schematics/migrations/move-document/document_import_visitor.d.ts +0 -27
- package/schematics/migrations/move-document/document_import_visitor.js +0 -77
- package/schematics/migrations/move-document/index.d.ts +0 -11
- package/schematics/migrations/move-document/index.js +0 -93
- package/schematics/migrations/move-document/move-import.d.ts +0 -12
- package/schematics/migrations/move-document/move-import.js +0 -64
- package/schematics/migrations/native-view-encapsulation/index.d.ts +0 -11
- package/schematics/migrations/native-view-encapsulation/index.js +0 -63
- package/schematics/migrations/native-view-encapsulation/util.d.ts +0 -11
- package/schematics/migrations/native-view-encapsulation/util.js +0 -51
- package/schematics/migrations/navigation-extras-omissions/index.d.ts +0 -11
- package/schematics/migrations/navigation-extras-omissions/index.js +0 -72
- package/schematics/migrations/navigation-extras-omissions/util.d.ts +0 -11
- package/schematics/migrations/navigation-extras-omissions/util.js +0 -129
- package/schematics/migrations/relative-link-resolution/collector.d.ts +0 -22
- package/schematics/migrations/relative-link-resolution/collector.js +0 -98
- package/schematics/migrations/relative-link-resolution/index.d.ts +0 -11
- package/schematics/migrations/relative-link-resolution/index.js +0 -84
- package/schematics/migrations/relative-link-resolution/transform.d.ts +0 -22
- package/schematics/migrations/relative-link-resolution/transform.js +0 -68
- package/schematics/migrations/relative-link-resolution/update_recorder.d.ts +0 -18
- package/schematics/migrations/relative-link-resolution/update_recorder.js +0 -20
- package/schematics/migrations/relative-link-resolution/util.d.ts +0 -12
- package/schematics/migrations/relative-link-resolution/util.js +0 -46
- package/schematics/migrations/renderer-to-renderer2/helpers.d.ts +0 -25
- package/schematics/migrations/renderer-to-renderer2/helpers.js +0 -241
- package/schematics/migrations/renderer-to-renderer2/index.d.ts +0 -14
- package/schematics/migrations/renderer-to-renderer2/index.js +0 -138
- package/schematics/migrations/renderer-to-renderer2/migration.d.ts +0 -18
- package/schematics/migrations/renderer-to-renderer2/migration.js +0 -228
- package/schematics/migrations/renderer-to-renderer2/util.d.ts +0 -18
- package/schematics/migrations/renderer-to-renderer2/util.js +0 -86
- package/schematics/migrations/router-preserve-query-params/index.d.ts +0 -14
- package/schematics/migrations/router-preserve-query-params/index.js +0 -75
- package/schematics/migrations/router-preserve-query-params/util.d.ts +0 -11
- package/schematics/migrations/router-preserve-query-params/util.js +0 -106
- package/schematics/migrations/static-queries/angular/directive_inputs.d.ts +0 -11
- package/schematics/migrations/static-queries/angular/directive_inputs.js +0 -87
- package/schematics/migrations/static-queries/angular/ng_query_visitor.d.ts +0 -45
- package/schematics/migrations/static-queries/angular/ng_query_visitor.js +0 -130
- package/schematics/migrations/static-queries/angular/query-definition.d.ts +0 -37
- package/schematics/migrations/static-queries/angular/query-definition.js +0 -33
- package/schematics/migrations/static-queries/angular/super_class.d.ts +0 -15
- package/schematics/migrations/static-queries/angular/super_class.js +0 -35
- package/schematics/migrations/static-queries/index.d.ts +0 -11
- package/schematics/migrations/static-queries/index.js +0 -244
- package/schematics/migrations/static-queries/strategies/template_strategy/template_strategy.d.ts +0 -41
- package/schematics/migrations/static-queries/strategies/template_strategy/template_strategy.js +0 -210
- package/schematics/migrations/static-queries/strategies/test_strategy/test_strategy.d.ts +0 -24
- package/schematics/migrations/static-queries/strategies/test_strategy/test_strategy.js +0 -38
- package/schematics/migrations/static-queries/strategies/timing-strategy.d.ts +0 -19
- package/schematics/migrations/static-queries/strategies/timing-strategy.js +0 -20
- package/schematics/migrations/static-queries/strategies/usage_strategy/declaration_usage_visitor.d.ts +0 -82
- package/schematics/migrations/static-queries/strategies/usage_strategy/declaration_usage_visitor.js +0 -372
- package/schematics/migrations/static-queries/strategies/usage_strategy/super_class_context.d.ts +0 -18
- package/schematics/migrations/static-queries/strategies/usage_strategy/super_class_context.js +0 -55
- package/schematics/migrations/static-queries/strategies/usage_strategy/template_usage_visitor.d.ts +0 -27
- package/schematics/migrations/static-queries/strategies/usage_strategy/template_usage_visitor.js +0 -93
- package/schematics/migrations/static-queries/strategies/usage_strategy/usage_strategy.d.ts +0 -34
- package/schematics/migrations/static-queries/strategies/usage_strategy/usage_strategy.js +0 -172
- package/schematics/migrations/static-queries/transform.d.ts +0 -21
- package/schematics/migrations/static-queries/transform.js +0 -105
- package/schematics/migrations/template-var-assignment/analyze_template.d.ts +0 -20
- package/schematics/migrations/template-var-assignment/analyze_template.js +0 -38
- package/schematics/migrations/template-var-assignment/angular/html_variable_assignment_visitor.d.ts +0 -28
- package/schematics/migrations/template-var-assignment/angular/html_variable_assignment_visitor.js +0 -80
- package/schematics/migrations/template-var-assignment/index.d.ts +0 -11
- package/schematics/migrations/template-var-assignment/index.js +0 -101
- package/schematics/migrations/undecorated-classes-with-decorated-fields/index.d.ts +0 -14
- package/schematics/migrations/undecorated-classes-with-decorated-fields/index.js +0 -128
- package/schematics/migrations/undecorated-classes-with-decorated-fields/transform.d.ts +0 -64
- package/schematics/migrations/undecorated-classes-with-decorated-fields/transform.js +0 -302
- package/schematics/migrations/undecorated-classes-with-decorated-fields/update_recorder.d.ts +0 -19
- package/schematics/migrations/undecorated-classes-with-decorated-fields/update_recorder.js +0 -20
- package/schematics/migrations/undecorated-classes-with-di/create_ngc_program.d.ts +0 -18
- package/schematics/migrations/undecorated-classes-with-di/create_ngc_program.js +0 -56
- package/schematics/migrations/undecorated-classes-with-di/decorator_rewrite/convert_directive_metadata.d.ts +0 -18
- package/schematics/migrations/undecorated-classes-with-di/decorator_rewrite/convert_directive_metadata.js +0 -99
- package/schematics/migrations/undecorated-classes-with-di/decorator_rewrite/decorator_rewriter.d.ts +0 -37
- package/schematics/migrations/undecorated-classes-with-di/decorator_rewrite/decorator_rewriter.js +0 -118
- package/schematics/migrations/undecorated-classes-with-di/decorator_rewrite/import_rewrite_visitor.d.ts +0 -37
- package/schematics/migrations/undecorated-classes-with-di/decorator_rewrite/import_rewrite_visitor.js +0 -129
- package/schematics/migrations/undecorated-classes-with-di/decorator_rewrite/path_format.d.ts +0 -10
- package/schematics/migrations/undecorated-classes-with-di/decorator_rewrite/path_format.js +0 -31
- package/schematics/migrations/undecorated-classes-with-di/decorator_rewrite/source_file_exports.d.ts +0 -16
- package/schematics/migrations/undecorated-classes-with-di/decorator_rewrite/source_file_exports.js +0 -68
- package/schematics/migrations/undecorated-classes-with-di/index.d.ts +0 -11
- package/schematics/migrations/undecorated-classes-with-di/index.js +0 -226
- package/schematics/migrations/undecorated-classes-with-di/ng_declaration_collector.d.ts +0 -38
- package/schematics/migrations/undecorated-classes-with-di/ng_declaration_collector.js +0 -135
- package/schematics/migrations/undecorated-classes-with-di/transform.d.ts +0 -97
- package/schematics/migrations/undecorated-classes-with-di/transform.js +0 -373
- package/schematics/migrations/undecorated-classes-with-di/update_recorder.d.ts +0 -20
- package/schematics/migrations/undecorated-classes-with-di/update_recorder.js +0 -20
- package/schematics/migrations/wait-for-async/index.d.ts +0 -11
- package/schematics/migrations/wait-for-async/index.js +0 -101
- package/schematics/migrations/wait-for-async/util.d.ts +0 -11
- package/schematics/migrations/wait-for-async/util.js +0 -40
- package/schematics/migrations/xhr-factory/index.d.ts +0 -10
- package/schematics/migrations/xhr-factory/index.js +0 -107
|
@@ -1,373 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* @license
|
|
3
|
-
* Copyright Google LLC All Rights Reserved.
|
|
4
|
-
*
|
|
5
|
-
* Use of this source code is governed by an MIT-style license that can be
|
|
6
|
-
* found in the LICENSE file at https://angular.io/license
|
|
7
|
-
*/
|
|
8
|
-
var __rest = (this && this.__rest) || function (s, e) {
|
|
9
|
-
var t = {};
|
|
10
|
-
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
|
|
11
|
-
t[p] = s[p];
|
|
12
|
-
if (s != null && typeof Object.getOwnPropertySymbols === "function")
|
|
13
|
-
for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
|
|
14
|
-
if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))
|
|
15
|
-
t[p[i]] = s[p[i]];
|
|
16
|
-
}
|
|
17
|
-
return t;
|
|
18
|
-
};
|
|
19
|
-
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
20
|
-
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
21
|
-
};
|
|
22
|
-
(function (factory) {
|
|
23
|
-
if (typeof module === "object" && typeof module.exports === "object") {
|
|
24
|
-
var v = factory(require, exports);
|
|
25
|
-
if (v !== undefined) module.exports = v;
|
|
26
|
-
}
|
|
27
|
-
else if (typeof define === "function" && define.amd) {
|
|
28
|
-
define("@angular/core/schematics/migrations/undecorated-classes-with-di/transform", ["require", "exports", "typescript", "@angular/core/schematics/utils/import_manager", "@angular/core/schematics/utils/ng_decorators", "@angular/core/schematics/utils/typescript/class_declaration", "@angular/core/schematics/utils/typescript/find_base_classes", "@angular/core/schematics/utils/typescript/imports", "@angular/core/schematics/migrations/undecorated-classes-with-di/decorator_rewrite/convert_directive_metadata", "@angular/core/schematics/migrations/undecorated-classes-with-di/decorator_rewrite/decorator_rewriter", "@angular/core/schematics/migrations/undecorated-classes-with-di/ng_declaration_collector"], factory);
|
|
29
|
-
}
|
|
30
|
-
})(function (require, exports) {
|
|
31
|
-
"use strict";
|
|
32
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
33
|
-
exports.UndecoratedClassesTransform = void 0;
|
|
34
|
-
const typescript_1 = __importDefault(require("typescript"));
|
|
35
|
-
const import_manager_1 = require("@angular/core/schematics/utils/import_manager");
|
|
36
|
-
const ng_decorators_1 = require("@angular/core/schematics/utils/ng_decorators");
|
|
37
|
-
const class_declaration_1 = require("@angular/core/schematics/utils/typescript/class_declaration");
|
|
38
|
-
const find_base_classes_1 = require("@angular/core/schematics/utils/typescript/find_base_classes");
|
|
39
|
-
const imports_1 = require("@angular/core/schematics/utils/typescript/imports");
|
|
40
|
-
const convert_directive_metadata_1 = require("@angular/core/schematics/migrations/undecorated-classes-with-di/decorator_rewrite/convert_directive_metadata");
|
|
41
|
-
const decorator_rewriter_1 = require("@angular/core/schematics/migrations/undecorated-classes-with-di/decorator_rewrite/decorator_rewriter");
|
|
42
|
-
const ng_declaration_collector_1 = require("@angular/core/schematics/migrations/undecorated-classes-with-di/ng_declaration_collector");
|
|
43
|
-
class UndecoratedClassesTransform {
|
|
44
|
-
constructor(typeChecker, compiler, getUpdateRecorder, compilerModule, coreModule) {
|
|
45
|
-
this.typeChecker = typeChecker;
|
|
46
|
-
this.compiler = compiler;
|
|
47
|
-
this.getUpdateRecorder = getUpdateRecorder;
|
|
48
|
-
this.compilerModule = compilerModule;
|
|
49
|
-
this.coreModule = coreModule;
|
|
50
|
-
this.printer = typescript_1.default.createPrinter({ newLine: typescript_1.default.NewLineKind.LineFeed });
|
|
51
|
-
this.importManager = new import_manager_1.ImportManager(this.getUpdateRecorder, this.printer);
|
|
52
|
-
this.decoratorRewriter = new decorator_rewriter_1.DecoratorRewriter(this.importManager, this.typeChecker, this.compiler);
|
|
53
|
-
/** Set of class declarations which have been decorated with "@Directive". */
|
|
54
|
-
this.decoratedDirectives = new Set();
|
|
55
|
-
/** Set of class declarations which have been decorated with "@Injectable" */
|
|
56
|
-
this.decoratedProviders = new Set();
|
|
57
|
-
/**
|
|
58
|
-
* Set of class declarations which have been analyzed and need to specify
|
|
59
|
-
* an explicit constructor.
|
|
60
|
-
*/
|
|
61
|
-
this.missingExplicitConstructorClasses = new Set();
|
|
62
|
-
this.symbolResolver = compiler['_symbolResolver'];
|
|
63
|
-
this.compilerHost = compiler['_host'];
|
|
64
|
-
this.metadataResolver = compiler['_metadataResolver'];
|
|
65
|
-
// Unset the default error recorder so that the reflector will throw an exception
|
|
66
|
-
// if metadata cannot be resolved.
|
|
67
|
-
this.compiler.reflector['errorRecorder'] = undefined;
|
|
68
|
-
// Disables that static symbols are resolved through summaries from within the static
|
|
69
|
-
// reflector. Summaries cannot be used for decorator serialization as decorators are
|
|
70
|
-
// omitted in summaries and the decorator can't be reconstructed from the directive summary.
|
|
71
|
-
this._disableSummaryResolution();
|
|
72
|
-
}
|
|
73
|
-
/**
|
|
74
|
-
* Migrates decorated directives which can potentially inherit a constructor
|
|
75
|
-
* from an undecorated base class. All base classes until the first one
|
|
76
|
-
* with an explicit constructor will be decorated with the abstract "@Directive()"
|
|
77
|
-
* decorator. See case 1 in the migration plan: https://hackmd.io/@alx/S1XKqMZeS
|
|
78
|
-
*/
|
|
79
|
-
migrateDecoratedDirectives(directives) {
|
|
80
|
-
return directives.reduce((failures, node) => failures.concat(this._migrateDirectiveBaseClass(node)), []);
|
|
81
|
-
}
|
|
82
|
-
/**
|
|
83
|
-
* Migrates decorated providers which can potentially inherit a constructor
|
|
84
|
-
* from an undecorated base class. All base classes until the first one
|
|
85
|
-
* with an explicit constructor will be decorated with the "@Injectable()".
|
|
86
|
-
*/
|
|
87
|
-
migrateDecoratedProviders(providers) {
|
|
88
|
-
return providers.reduce((failures, node) => failures.concat(this._migrateProviderBaseClass(node)), []);
|
|
89
|
-
}
|
|
90
|
-
_migrateProviderBaseClass(node) {
|
|
91
|
-
return this._migrateDecoratedClassWithInheritedCtor(node, symbol => this.metadataResolver.isInjectable(symbol), node => this._addInjectableDecorator(node));
|
|
92
|
-
}
|
|
93
|
-
_migrateDirectiveBaseClass(node) {
|
|
94
|
-
return this._migrateDecoratedClassWithInheritedCtor(node, symbol => this.metadataResolver.isDirective(symbol), node => this._addAbstractDirectiveDecorator(node));
|
|
95
|
-
}
|
|
96
|
-
_migrateDecoratedClassWithInheritedCtor(node, isClassDecorated, addClassDecorator) {
|
|
97
|
-
// In case the provider has an explicit constructor, we don't need to do anything
|
|
98
|
-
// because the class is already decorated and does not inherit a constructor.
|
|
99
|
-
if ((0, class_declaration_1.hasExplicitConstructor)(node)) {
|
|
100
|
-
return [];
|
|
101
|
-
}
|
|
102
|
-
const orderedBaseClasses = (0, find_base_classes_1.findBaseClassDeclarations)(node, this.typeChecker);
|
|
103
|
-
const undecoratedBaseClasses = [];
|
|
104
|
-
for (let { node: baseClass, identifier } of orderedBaseClasses) {
|
|
105
|
-
const baseClassFile = baseClass.getSourceFile();
|
|
106
|
-
if ((0, class_declaration_1.hasExplicitConstructor)(baseClass)) {
|
|
107
|
-
// All classes in between the decorated class and the undecorated class
|
|
108
|
-
// that defines the constructor need to be decorated as well.
|
|
109
|
-
undecoratedBaseClasses.forEach(b => addClassDecorator(b));
|
|
110
|
-
if (baseClassFile.isDeclarationFile) {
|
|
111
|
-
const staticSymbol = this._getStaticSymbolOfIdentifier(identifier);
|
|
112
|
-
// If the base class is decorated through metadata files, we don't
|
|
113
|
-
// need to add a comment to the derived class for the external base class.
|
|
114
|
-
if (staticSymbol && isClassDecorated(staticSymbol)) {
|
|
115
|
-
break;
|
|
116
|
-
}
|
|
117
|
-
// Find the last class in the inheritance chain that is decorated and will be
|
|
118
|
-
// used as anchor for a comment explaining that the class that defines the
|
|
119
|
-
// constructor cannot be decorated automatically.
|
|
120
|
-
const lastDecoratedClass = undecoratedBaseClasses[undecoratedBaseClasses.length - 1] || node;
|
|
121
|
-
return this._addMissingExplicitConstructorTodo(lastDecoratedClass);
|
|
122
|
-
}
|
|
123
|
-
// Decorate the class that defines the constructor that is inherited.
|
|
124
|
-
addClassDecorator(baseClass);
|
|
125
|
-
break;
|
|
126
|
-
}
|
|
127
|
-
// Add the class decorator for all base classes in the inheritance chain until
|
|
128
|
-
// the base class with the explicit constructor. The decorator will be only
|
|
129
|
-
// added for base classes which can be modified.
|
|
130
|
-
if (!baseClassFile.isDeclarationFile) {
|
|
131
|
-
undecoratedBaseClasses.push(baseClass);
|
|
132
|
-
}
|
|
133
|
-
}
|
|
134
|
-
return [];
|
|
135
|
-
}
|
|
136
|
-
/**
|
|
137
|
-
* Adds the abstract "@Directive()" decorator to the given class in case there
|
|
138
|
-
* is no existing directive decorator.
|
|
139
|
-
*/
|
|
140
|
-
_addAbstractDirectiveDecorator(baseClass) {
|
|
141
|
-
if ((0, ng_declaration_collector_1.hasDirectiveDecorator)(baseClass, this.typeChecker) ||
|
|
142
|
-
this.decoratedDirectives.has(baseClass)) {
|
|
143
|
-
return;
|
|
144
|
-
}
|
|
145
|
-
const baseClassFile = baseClass.getSourceFile();
|
|
146
|
-
const recorder = this.getUpdateRecorder(baseClassFile);
|
|
147
|
-
const directiveExpr = this.importManager.addImportToSourceFile(baseClassFile, 'Directive', '@angular/core');
|
|
148
|
-
const newDecorator = typescript_1.default.createDecorator(typescript_1.default.createCall(directiveExpr, undefined, []));
|
|
149
|
-
const newDecoratorText = this.printer.printNode(typescript_1.default.EmitHint.Unspecified, newDecorator, baseClassFile);
|
|
150
|
-
recorder.addClassDecorator(baseClass, newDecoratorText);
|
|
151
|
-
this.decoratedDirectives.add(baseClass);
|
|
152
|
-
}
|
|
153
|
-
/**
|
|
154
|
-
* Adds the abstract "@Injectable()" decorator to the given class in case there
|
|
155
|
-
* is no existing directive decorator.
|
|
156
|
-
*/
|
|
157
|
-
_addInjectableDecorator(baseClass) {
|
|
158
|
-
if ((0, ng_declaration_collector_1.hasInjectableDecorator)(baseClass, this.typeChecker) ||
|
|
159
|
-
this.decoratedProviders.has(baseClass)) {
|
|
160
|
-
return;
|
|
161
|
-
}
|
|
162
|
-
const baseClassFile = baseClass.getSourceFile();
|
|
163
|
-
const recorder = this.getUpdateRecorder(baseClassFile);
|
|
164
|
-
const injectableExpr = this.importManager.addImportToSourceFile(baseClassFile, 'Injectable', '@angular/core');
|
|
165
|
-
const newDecorator = typescript_1.default.createDecorator(typescript_1.default.createCall(injectableExpr, undefined, []));
|
|
166
|
-
const newDecoratorText = this.printer.printNode(typescript_1.default.EmitHint.Unspecified, newDecorator, baseClassFile);
|
|
167
|
-
recorder.addClassDecorator(baseClass, newDecoratorText);
|
|
168
|
-
this.decoratedProviders.add(baseClass);
|
|
169
|
-
}
|
|
170
|
-
/** Adds a comment for adding an explicit constructor to the given class declaration. */
|
|
171
|
-
_addMissingExplicitConstructorTodo(node) {
|
|
172
|
-
// In case a todo comment has been already inserted to the given class, we don't
|
|
173
|
-
// want to add a comment or transform failure multiple times.
|
|
174
|
-
if (this.missingExplicitConstructorClasses.has(node)) {
|
|
175
|
-
return [];
|
|
176
|
-
}
|
|
177
|
-
this.missingExplicitConstructorClasses.add(node);
|
|
178
|
-
const recorder = this.getUpdateRecorder(node.getSourceFile());
|
|
179
|
-
recorder.addClassComment(node, 'TODO: add explicit constructor');
|
|
180
|
-
return [{ node: node, message: 'Class needs to declare an explicit constructor.' }];
|
|
181
|
-
}
|
|
182
|
-
/**
|
|
183
|
-
* Migrates undecorated directives which were referenced in NgModule declarations.
|
|
184
|
-
* These directives inherit the metadata from a parent base class, but with Ivy
|
|
185
|
-
* these classes need to explicitly have a decorator for locality. The migration
|
|
186
|
-
* determines the inherited decorator and copies it to the undecorated declaration.
|
|
187
|
-
*
|
|
188
|
-
* Note that the migration serializes the metadata for external declarations
|
|
189
|
-
* where the decorator is not part of the source file AST.
|
|
190
|
-
*
|
|
191
|
-
* See case 2 in the migration plan: https://hackmd.io/@alx/S1XKqMZeS
|
|
192
|
-
*/
|
|
193
|
-
migrateUndecoratedDeclarations(directives) {
|
|
194
|
-
return directives.reduce((failures, node) => failures.concat(this._migrateDerivedDeclaration(node)), []);
|
|
195
|
-
}
|
|
196
|
-
_migrateDerivedDeclaration(node) {
|
|
197
|
-
const targetSourceFile = node.getSourceFile();
|
|
198
|
-
const orderedBaseClasses = (0, find_base_classes_1.findBaseClassDeclarations)(node, this.typeChecker);
|
|
199
|
-
let newDecoratorText = null;
|
|
200
|
-
for (let { node: baseClass, identifier } of orderedBaseClasses) {
|
|
201
|
-
// Before looking for decorators within the metadata or summary files, we
|
|
202
|
-
// try to determine the directive decorator through the source file AST.
|
|
203
|
-
if (baseClass.decorators) {
|
|
204
|
-
const ngDecorator = (0, ng_decorators_1.getAngularDecorators)(this.typeChecker, baseClass.decorators)
|
|
205
|
-
.find(({ name }) => name === 'Component' || name === 'Directive' || name === 'Pipe');
|
|
206
|
-
if (ngDecorator) {
|
|
207
|
-
const newDecorator = this.decoratorRewriter.rewrite(ngDecorator, node.getSourceFile());
|
|
208
|
-
newDecoratorText = this.printer.printNode(typescript_1.default.EmitHint.Unspecified, newDecorator, ngDecorator.node.getSourceFile());
|
|
209
|
-
break;
|
|
210
|
-
}
|
|
211
|
-
}
|
|
212
|
-
// If no metadata could be found within the source-file AST, try to find
|
|
213
|
-
// decorator data through Angular metadata and summary files.
|
|
214
|
-
const staticSymbol = this._getStaticSymbolOfIdentifier(identifier);
|
|
215
|
-
// Check if the static symbol resolves to a class declaration with
|
|
216
|
-
// pipe or directive metadata.
|
|
217
|
-
if (!staticSymbol ||
|
|
218
|
-
!(this.metadataResolver.isPipe(staticSymbol) ||
|
|
219
|
-
this.metadataResolver.isDirective(staticSymbol))) {
|
|
220
|
-
continue;
|
|
221
|
-
}
|
|
222
|
-
const metadata = this._resolveDeclarationMetadata(staticSymbol);
|
|
223
|
-
// If no metadata could be resolved for the static symbol, print a failure message
|
|
224
|
-
// and ask the developer to manually migrate the class. This case is rare because
|
|
225
|
-
// usually decorator metadata is always present but just can't be read if a program
|
|
226
|
-
// only has access to summaries (this is a special case in google3).
|
|
227
|
-
if (!metadata) {
|
|
228
|
-
return [{
|
|
229
|
-
node,
|
|
230
|
-
message: `Class cannot be migrated as the inherited metadata from ` +
|
|
231
|
-
`${identifier.getText()} cannot be converted into a decorator. Please manually
|
|
232
|
-
decorate the class.`,
|
|
233
|
-
}];
|
|
234
|
-
}
|
|
235
|
-
const newDecorator = this._constructDecoratorFromMetadata(metadata, targetSourceFile);
|
|
236
|
-
if (!newDecorator) {
|
|
237
|
-
const annotationType = metadata.type;
|
|
238
|
-
return [{
|
|
239
|
-
node,
|
|
240
|
-
message: `Class cannot be migrated as the inherited @${annotationType} decorator ` +
|
|
241
|
-
`cannot be copied. Please manually add a @${annotationType} decorator.`,
|
|
242
|
-
}];
|
|
243
|
-
}
|
|
244
|
-
// In case the decorator could be constructed from the resolved metadata, use
|
|
245
|
-
// that decorator for the derived undecorated classes.
|
|
246
|
-
newDecoratorText =
|
|
247
|
-
this.printer.printNode(typescript_1.default.EmitHint.Unspecified, newDecorator, targetSourceFile);
|
|
248
|
-
break;
|
|
249
|
-
}
|
|
250
|
-
if (!newDecoratorText) {
|
|
251
|
-
return [{
|
|
252
|
-
node,
|
|
253
|
-
message: 'Class cannot be migrated as no directive/component/pipe metadata could be found. ' +
|
|
254
|
-
'Please manually add a @Directive, @Component or @Pipe decorator.'
|
|
255
|
-
}];
|
|
256
|
-
}
|
|
257
|
-
this.getUpdateRecorder(targetSourceFile).addClassDecorator(node, newDecoratorText);
|
|
258
|
-
return [];
|
|
259
|
-
}
|
|
260
|
-
/** Records all changes that were made in the import manager. */
|
|
261
|
-
recordChanges() {
|
|
262
|
-
this.importManager.recordChanges();
|
|
263
|
-
}
|
|
264
|
-
/**
|
|
265
|
-
* Constructs a TypeScript decorator node from the specified declaration metadata. Returns
|
|
266
|
-
* null if the metadata could not be simplified/resolved.
|
|
267
|
-
*/
|
|
268
|
-
_constructDecoratorFromMetadata(directiveMetadata, targetSourceFile) {
|
|
269
|
-
try {
|
|
270
|
-
const decoratorExpr = (0, convert_directive_metadata_1.convertDirectiveMetadataToExpression)(this.compilerModule, directiveMetadata.metadata, staticSymbol => this.compilerHost
|
|
271
|
-
.fileNameToModuleName(staticSymbol.filePath, targetSourceFile.fileName)
|
|
272
|
-
.replace(/\/index$/, ''), (moduleName, name) => this.importManager.addImportToSourceFile(targetSourceFile, name, moduleName), (propertyName, value) => {
|
|
273
|
-
// Only normalize properties called "changeDetection" and "encapsulation"
|
|
274
|
-
// for "@Directive" and "@Component" annotations.
|
|
275
|
-
if (directiveMetadata.type === 'Pipe') {
|
|
276
|
-
return null;
|
|
277
|
-
}
|
|
278
|
-
// Instead of using the number as value for the "changeDetection" and
|
|
279
|
-
// "encapsulation" properties, we want to use the actual enum symbols.
|
|
280
|
-
if (propertyName === 'changeDetection' && typeof value === 'number') {
|
|
281
|
-
return typescript_1.default.createPropertyAccess(this.importManager.addImportToSourceFile(targetSourceFile, 'ChangeDetectionStrategy', '@angular/core'), this.coreModule.ChangeDetectionStrategy[value]);
|
|
282
|
-
}
|
|
283
|
-
else if (propertyName === 'encapsulation' && typeof value === 'number') {
|
|
284
|
-
return typescript_1.default.createPropertyAccess(this.importManager.addImportToSourceFile(targetSourceFile, 'ViewEncapsulation', '@angular/core'), this.coreModule.ViewEncapsulation[value]);
|
|
285
|
-
}
|
|
286
|
-
return null;
|
|
287
|
-
});
|
|
288
|
-
return typescript_1.default.createDecorator(typescript_1.default.createCall(this.importManager.addImportToSourceFile(targetSourceFile, directiveMetadata.type, '@angular/core'), undefined, [decoratorExpr]));
|
|
289
|
-
}
|
|
290
|
-
catch (e) {
|
|
291
|
-
if (e instanceof convert_directive_metadata_1.UnexpectedMetadataValueError) {
|
|
292
|
-
return null;
|
|
293
|
-
}
|
|
294
|
-
throw e;
|
|
295
|
-
}
|
|
296
|
-
}
|
|
297
|
-
/**
|
|
298
|
-
* Resolves the declaration metadata of a given static symbol. The metadata
|
|
299
|
-
* is determined by resolving metadata for the static symbol.
|
|
300
|
-
*/
|
|
301
|
-
_resolveDeclarationMetadata(symbol) {
|
|
302
|
-
try {
|
|
303
|
-
// Note that this call can throw if the metadata is not computable. In that
|
|
304
|
-
// case we are not able to serialize the metadata into a decorator and we return
|
|
305
|
-
// null.
|
|
306
|
-
const annotations = this.compiler.reflector.annotations(symbol).find(s => s.ngMetadataName === 'Component' || s.ngMetadataName === 'Directive' ||
|
|
307
|
-
s.ngMetadataName === 'Pipe');
|
|
308
|
-
if (!annotations) {
|
|
309
|
-
return null;
|
|
310
|
-
}
|
|
311
|
-
const { ngMetadataName } = annotations, metadata = __rest(annotations, ["ngMetadataName"]);
|
|
312
|
-
// Delete the "ngMetadataName" property as we don't want to generate
|
|
313
|
-
// a property assignment in the new decorator for that internal property.
|
|
314
|
-
delete metadata['ngMetadataName'];
|
|
315
|
-
return { type: ngMetadataName, metadata };
|
|
316
|
-
}
|
|
317
|
-
catch (e) {
|
|
318
|
-
return null;
|
|
319
|
-
}
|
|
320
|
-
}
|
|
321
|
-
_getStaticSymbolOfIdentifier(node) {
|
|
322
|
-
const sourceFile = node.getSourceFile();
|
|
323
|
-
const resolvedImport = (0, imports_1.getImportOfIdentifier)(this.typeChecker, node);
|
|
324
|
-
if (!resolvedImport) {
|
|
325
|
-
return null;
|
|
326
|
-
}
|
|
327
|
-
const moduleName = this.compilerHost.moduleNameToFileName(resolvedImport.importModule, sourceFile.fileName);
|
|
328
|
-
if (!moduleName) {
|
|
329
|
-
return null;
|
|
330
|
-
}
|
|
331
|
-
// Find the declaration symbol as symbols could be aliased due to
|
|
332
|
-
// metadata re-exports.
|
|
333
|
-
return this.compiler.reflector.findSymbolDeclaration(this.symbolResolver.getStaticSymbol(moduleName, resolvedImport.name));
|
|
334
|
-
}
|
|
335
|
-
/**
|
|
336
|
-
* Disables that static symbols are resolved through summaries. Summaries
|
|
337
|
-
* cannot be used for decorator analysis as decorators are omitted in summaries.
|
|
338
|
-
*/
|
|
339
|
-
_disableSummaryResolution() {
|
|
340
|
-
// We never want to resolve symbols through summaries. Summaries never contain
|
|
341
|
-
// decorators for class symbols and therefore summaries will cause every class
|
|
342
|
-
// to be considered as undecorated. See reason for this in: "ToJsonSerializer".
|
|
343
|
-
// In order to ensure that metadata is not retrieved through summaries, we
|
|
344
|
-
// need to disable summary resolution, clear previous symbol caches. This way
|
|
345
|
-
// future calls to "StaticReflector#annotations" are based on metadata files.
|
|
346
|
-
this.symbolResolver['_resolveSymbolFromSummary'] = () => null;
|
|
347
|
-
this.symbolResolver['resolvedSymbols'].clear();
|
|
348
|
-
this.symbolResolver['symbolFromFile'].clear();
|
|
349
|
-
this.compiler.reflector['annotationCache'].clear();
|
|
350
|
-
// Original summary resolver used by the AOT compiler.
|
|
351
|
-
const summaryResolver = this.symbolResolver['summaryResolver'];
|
|
352
|
-
// Additionally we need to ensure that no files are treated as "library" files when
|
|
353
|
-
// resolving metadata. This is necessary because by default the symbol resolver discards
|
|
354
|
-
// class metadata for library files. See "StaticSymbolResolver#createResolvedSymbol".
|
|
355
|
-
// Patching this function **only** for the static symbol resolver ensures that metadata
|
|
356
|
-
// is not incorrectly omitted. Note that we only want to do this for the symbol resolver
|
|
357
|
-
// because otherwise we could break the summary loading logic which is used to detect
|
|
358
|
-
// if a static symbol is either a directive, component or pipe (see MetadataResolver).
|
|
359
|
-
this.symbolResolver['summaryResolver'] = {
|
|
360
|
-
fromSummaryFileName: summaryResolver.fromSummaryFileName.bind(summaryResolver),
|
|
361
|
-
addSummary: summaryResolver.addSummary.bind(summaryResolver),
|
|
362
|
-
getImportAs: summaryResolver.getImportAs.bind(summaryResolver),
|
|
363
|
-
getKnownModuleName: summaryResolver.getKnownModuleName.bind(summaryResolver),
|
|
364
|
-
resolveSummary: summaryResolver.resolveSummary.bind(summaryResolver),
|
|
365
|
-
toSummaryFileName: summaryResolver.toSummaryFileName.bind(summaryResolver),
|
|
366
|
-
getSymbolsOf: summaryResolver.getSymbolsOf.bind(summaryResolver),
|
|
367
|
-
isLibraryFile: () => false,
|
|
368
|
-
};
|
|
369
|
-
}
|
|
370
|
-
}
|
|
371
|
-
exports.UndecoratedClassesTransform = UndecoratedClassesTransform;
|
|
372
|
-
});
|
|
373
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhbnNmb3JtLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vcGFja2FnZXMvY29yZS9zY2hlbWF0aWNzL21pZ3JhdGlvbnMvdW5kZWNvcmF0ZWQtY2xhc3Nlcy13aXRoLWRpL3RyYW5zZm9ybS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7O0dBTUc7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztJQUdILDREQUE0QjtJQUU1QixrRkFBeUQ7SUFDekQsZ0ZBQStEO0lBQy9ELG1HQUFnRjtJQUNoRixtR0FBbUY7SUFDbkYsK0VBQXFFO0lBRXJFLDZKQUFrSTtJQUNsSSw2SUFBeUU7SUFDekUsdUlBQXlGO0lBZ0J6RixNQUFhLDJCQUEyQjtRQW9CdEMsWUFDWSxXQUEyQixFQUFVLFFBQXFCLEVBQzFELGlCQUF3RCxFQUN4RCxjQUFrRCxFQUNsRCxVQUEwQztZQUgxQyxnQkFBVyxHQUFYLFdBQVcsQ0FBZ0I7WUFBVSxhQUFRLEdBQVIsUUFBUSxDQUFhO1lBQzFELHNCQUFpQixHQUFqQixpQkFBaUIsQ0FBdUM7WUFDeEQsbUJBQWMsR0FBZCxjQUFjLENBQW9DO1lBQ2xELGVBQVUsR0FBVixVQUFVLENBQWdDO1lBdkI5QyxZQUFPLEdBQUcsb0JBQUUsQ0FBQyxhQUFhLENBQUMsRUFBQyxPQUFPLEVBQUUsb0JBQUUsQ0FBQyxXQUFXLENBQUMsUUFBUSxFQUFDLENBQUMsQ0FBQztZQUMvRCxrQkFBYSxHQUFHLElBQUksOEJBQWEsQ0FBQyxJQUFJLENBQUMsaUJBQWlCLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBQ3hFLHNCQUFpQixHQUNyQixJQUFJLHNDQUFpQixDQUFDLElBQUksQ0FBQyxhQUFhLEVBQUUsSUFBSSxDQUFDLFdBQVcsRUFBRSxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7WUFNL0UsNkVBQTZFO1lBQ3JFLHdCQUFtQixHQUFHLElBQUksR0FBRyxFQUF1QixDQUFDO1lB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RSxDQUFDO1lBQy9DLElBQUksQ0FBQyxjQUFjLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQztZQUM5QyxJQUFJLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLEtBQUssRUFBRSxDQUFDO1lBRW5ELHNEQUFzRDtZQUN0RCxNQUFNLGVBQWUsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLGlCQUFpQixDQUFDLENBQUM7WUFFL0QsbUZBQW1GO1lBQ25GLHdGQUF3RjtZQUN4RixxRkFBcUY7WUFDckYsdUZBQXVGO1lBQ3ZGLHdGQUF3RjtZQUN4RixxRkFBcUY7WUFDckYsc0ZBQXNGO1lBQ3RGLElBQUksQ0FBQyxjQUFjLENBQUMsaUJBQWlCLENBQUMsR0FBa0M7Z0JBQ3RFLG1CQUFtQixFQUFFLGVBQWUsQ0FBQyxtQkFBbUIsQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDO2dCQUM5RSxVQUFVLEVBQUUsZUFBZSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDO2dCQUM1RCxXQUFXLEVBQUUsZUFBZSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDO2dCQUM5RCxrQkFBa0IsRUFBRSxlQUFlLENBQUMsa0JBQWtCLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQztnQkFDNUUsY0FBYyxFQUFFLGVBQWUsQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQztnQkFDcEUsaUJBQWlCLEVBQUUsZUFBZSxDQUFDLGlCQUFpQixDQUFDLElBQUksQ0FBQyxlQUFlLENBQUM7Z0JBQzFFLFlBQVksRUFBRSxlQUFlLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUM7Z0JBQ2hFLGFBQWEsRUFBRSxHQUFHLEVBQUUsQ0FBQyxLQUFLO2FBQzNCLENBQUM7UUFDSixDQUFDO0tBQ0Y7SUF2YUQsa0VBdWFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IEdvb2dsZSBMTEMgQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqXG4gKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZVxuICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZVxuICovXG5cbmltcG9ydCB0eXBlIHtBb3RDb21waWxlciwgQW90Q29tcGlsZXJIb3N0LCBDb21waWxlTWV0YWRhdGFSZXNvbHZlciwgU3RhdGljU3ltYm9sLCBTdGF0aWNTeW1ib2xSZXNvbHZlciwgU3VtbWFyeVJlc29sdmVyfSBmcm9tICdAYW5ndWxhci9jb21waWxlcic7XG5pbXBvcnQgdHMgZnJvbSAndHlwZXNjcmlwdCc7XG5cbmltcG9ydCB7SW1wb3J0TWFuYWdlcn0gZnJvbSAnLi4vLi4vdXRpbHMvaW1wb3J0X21hbmFnZXInO1xuaW1wb3J0IHtnZXRBbmd1bGFyRGVjb3JhdG9yc30gZnJvbSAnLi4vLi4vdXRpbHMvbmdfZGVjb3JhdG9ycyc7XG5pbXBvcnQge2hhc0V4cGxpY2l0Q29uc3RydWN0b3J9IGZyb20gJy4uLy4uL3V0aWxzL3R5cGVzY3JpcHQvY2xhc3NfZGVjbGFyYXRpb24nO1xuaW1wb3J0IHtmaW5kQmFzZUNsYXNzRGVjbGFyYXRpb25zfSBmcm9tICcuLi8uLi91dGlscy90eXBlc2NyaXB0L2ZpbmRfYmFzZV9jbGFzc2VzJztcbmltcG9ydCB7Z2V0SW1wb3J0T2ZJZGVudGlmaWVyfSBmcm9tICcuLi8uLi91dGlscy90eXBlc2NyaXB0L2ltcG9ydHMnO1xuXG5pbXBvcnQge2NvbnZlcnREaXJlY3RpdmVNZXRhZGF0YVRvRXhwcmVzc2lvbiwgVW5leHBlY3RlZE1ldGFkYXRhVmFsdWVFcnJvcn0gZnJvbSAnLi9kZWNvcmF0b3JfcmV3cml0ZS9jb252ZXJ0X2RpcmVjdGl2ZV9tZXRhZGF0YSc7XG5pbXBvcnQge0RlY29yYXRvclJld3JpdGVyfSBmcm9tICcuL2RlY29yYXRvcl9yZXdyaXRlL2RlY29yYXRvcl9yZXdyaXRlcic7XG5pbXBvcnQge2hhc0RpcmVjdGl2ZURlY29yYXRvciwgaGFzSW5qZWN0YWJsZURlY29yYXRvcn0gZnJvbSAnLi9uZ19kZWNsYXJhdGlvbl9jb2xsZWN0b3InO1xuaW1wb3J0IHtVcGRhdGVSZWNvcmRlcn0gZnJvbSAnLi91cGRhdGVfcmVjb3JkZXInO1xuXG5cblxuLyoqIFJlc29sdmVkIG1ldGFkYXRhIG9mIGEgZGVjbGFyYXRpb24uICovXG5pbnRlcmZhY2UgRGVjbGFyYXRpb25NZXRhZGF0YSB7XG4gIG1ldGFkYXRhOiBhbnk7XG4gIHR5cGU6ICdDb21wb25lbnQnfCdEaXJlY3RpdmUnfCdQaXBlJztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBUcmFuc2Zvcm1GYWlsdXJlIHtcbiAgbm9kZTogdHMuTm9kZTtcbiAgbWVzc2FnZTogc3RyaW5nO1xufVxuXG5leHBvcnQgY2xhc3MgVW5kZWNvcmF0ZWRDbGFzc2VzVHJhbnNmb3JtIHtcbiAgcHJpdmF0ZSBwcmludGVyID0gdHMuY3JlYXRlUHJpbnRlcih7bmV3TGluZTogdHMuTmV3TGluZUtpbmQuTGluZUZlZWR9KTtcbiAgcHJpdmF0ZSBpbXBvcnRNYW5hZ2VyID0gbmV3IEltcG9ydE1hbmFnZXIodGhpcy5nZXRVcGRhdGVSZWNvcmRlciwgdGhpcy5wcmludGVyKTtcbiAgcHJpdmF0ZSBkZWNvcmF0b3JSZXdyaXRlciA9XG4gICAgICBuZXcgRGVjb3JhdG9yUmV3cml0ZXIodGhpcy5pbXBvcnRNYW5hZ2VyLCB0aGlzLnR5cGVDaGVja2VyLCB0aGlzLmNvbXBpbGVyKTtcblxuICBwcml2YXRlIGNvbXBpbGVySG9zdDogQW90Q29tcGlsZXJIb3N0O1xuICBwcml2YXRlIHN5bWJvbFJlc29sdmVyOiBTdGF0aWNTeW1ib2xSZXNvbHZlcjtcbiAgcHJpdmF0ZSBtZXRhZGF0YVJlc29sdmVyOiBDb21waWxlTWV0YWRhdGFSZXNvbHZlcjtcblxuICAvKiogU2V0IG9mIGNsYXNzIGRlY2xhcmF0aW9ucyB3aGljaCBoYXZlIGJlZW4gZGVjb3JhdGVkIHdpdGggXCJARGlyZWN0aXZlXCIuICovXG4gIHByaXZhdGUgZGVjb3JhdGVkRGlyZWN0aXZlcyA9IG5ldyBTZXQ8dHMuQ2xhc3NEZWNsYXJhdGlvbj4oKTtcbiAgLyoqIFNldCBvZiBjbGFzcyBkZWNsYXJhdGlvbnMgd2hpY2ggaGF2ZSBiZWVuIGRlY29yYXRlZCB3aXRoIFwiQEluamVjdGFibGVcIiAqL1xuICBwcml2YXRlIGRlY29yYXRlZFByb3ZpZGVycyA9IG5ldyBTZXQ8dHMuQ2xhc3NEZWNsYXJhdGlvbj4oKTtcbiAgLyoqXG4gICAqIFNldCBvZiBjbGFzcyBkZWNsYXJhdGlvbnMgd2hpY2ggaGF2ZSBiZWVuIGFuYWx5emVkIGFuZCBuZWVkIHRvIHNwZWNpZnlcbiAgICogYW4gZXhwbGljaXQgY29uc3RydWN0b3IuXG4gICAqL1xuICBwcml2YXRlIG1pc3NpbmdFeHBsaWNpdENvbnN0cnVjdG9yQ2xhc3NlcyA9IG5ldyBTZXQ8dHMuQ2xhc3NEZWNsYXJhdGlvbj4oKTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICAgIHByaXZhdGUgdHlwZUNoZWNrZXI6IHRzLlR5cGVDaGVja2VyLCBwcml2YXRlIGNvbXBpbGVyOiBBb3RDb21waWxlcixcbiAgICAgIHByaXZhdGUgZ2V0VXBkYXRlUmVjb3JkZXI6IChzZjogdHMuU291cmNlRmlsZSkgPT4gVXBkYXRlUmVjb3JkZXIsXG4gICAgICBwcml2YXRlIGNvbXBpbGVyTW9kdWxlOiB0eXBlb2YgaW1wb3J0KCdAYW5ndWxhci9jb21waWxlcicpLFxuICAgICAgcHJpdmF0ZSBjb3JlTW9kdWxlOiB0eXBlb2YgaW1wb3J0KCdAYW5ndWxhci9jb3JlJykpIHtcbiAgICB0aGlzLnN5bWJvbFJlc29sdmVyID0gY29tcGlsZXJbJ19zeW1ib2xSZXNvbHZlciddO1xuICAgIHRoaXMuY29tcGlsZXJIb3N0ID0gY29tcGlsZXJbJ19ob3N0J107XG4gICAgdGhpcy5tZXRhZGF0YVJlc29sdmVyID0gY29tcGlsZXJbJ19tZXRhZGF0YVJlc29sdmVyJ107XG5cbiAgICAvLyBVbnNldCB0aGUgZGVmYXVsdCBlcnJvciByZWNvcmRlciBzbyB0aGF0IHRoZSByZWZsZWN0b3Igd2lsbCB0aHJvdyBhbiBleGNlcHRpb25cbiAgICAvLyBpZiBtZXRhZGF0YSBjYW5ub3QgYmUgcmVzb2x2ZWQuXG4gICAgdGhpcy5jb21waWxlci5yZWZsZWN0b3JbJ2Vycm9yUmVjb3JkZXInXSA9IHVuZGVmaW5lZDtcblxuICAgIC8vIERpc2FibGVzIHRoYXQgc3RhdGljIHN5bWJvbHMgYXJlIHJlc29sdmVkIHRocm91Z2ggc3VtbWFyaWVzIGZyb20gd2l0aGluIHRoZSBzdGF0aWNcbiAgICAvLyByZWZsZWN0b3IuIFN1bW1hcmllcyBjYW5ub3QgYmUgdXNlZCBmb3IgZGVjb3JhdG9yIHNlcmlhbGl6YXRpb24gYXMgZGVjb3JhdG9ycyBhcmVcbiAgICAvLyBvbWl0dGVkIGluIHN1bW1hcmllcyBhbmQgdGhlIGRlY29yYXRvciBjYW4ndCBiZSByZWNvbnN0cnVjdGVkIGZyb20gdGhlIGRpcmVjdGl2ZSBzdW1tYXJ5LlxuICAgIHRoaXMuX2Rpc2FibGVTdW1tYXJ5UmVzb2x1dGlvbigpO1xuICB9XG5cbiAgLyoqXG4gICAqIE1pZ3JhdGVzIGRlY29yYXRlZCBkaXJlY3RpdmVzIHdoaWNoIGNhbiBwb3RlbnRpYWxseSBpbmhlcml0IGEgY29uc3RydWN0b3JcbiAgICogZnJvbSBhbiB1bmRlY29yYXRlZCBiYXNlIGNsYXNzLiBBbGwgYmFzZSBjbGFzc2VzIHVudGlsIHRoZSBmaXJzdCBvbmVcbiAgICogd2l0aCBhbiBleHBsaWNpdCBjb25zdHJ1Y3RvciB3aWxsIGJlIGRlY29yYXRlZCB3aXRoIHRoZSBhYnN0cmFjdCBcIkBEaXJlY3RpdmUoKVwiXG4gICAqIGRlY29yYXRvci4gU2VlIGNhc2UgMSBpbiB0aGUgbWlncmF0aW9uIHBsYW46IGh0dHBzOi8vaGFja21kLmlvL0BhbHgvUzFYS3FNWmVTXG4gICAqL1xuICBtaWdyYXRlRGVjb3JhdGVkRGlyZWN0aXZlcyhkaXJlY3RpdmVzOiB0cy5DbGFzc0RlY2xhcmF0aW9uW10pOiBUcmFuc2Zvcm1GYWlsdXJlW10ge1xuICAgIHJldHVybiBkaXJlY3RpdmVzLnJlZHVjZShcbiAgICAgICAgKGZhaWx1cmVzLCBub2RlKSA9PiBmYWlsdXJlcy5jb25jYXQodGhpcy5fbWlncmF0ZURpcmVjdGl2ZUJhc2VDbGFzcyhub2RlKSksXG4gICAgICAgIFtdIGFzIFRyYW5zZm9ybUZhaWx1cmVbXSk7XG4gIH1cblxuICAvKipcbiAgICogTWlncmF0ZXMgZGVjb3JhdGVkIHByb3ZpZGVycyB3aGljaCBjYW4gcG90ZW50aWFsbHkgaW5oZXJpdCBhIGNvbnN0cnVjdG9yXG4gICAqIGZyb20gYW4gdW5kZWNvcmF0ZWQgYmFzZSBjbGFzcy4gQWxsIGJhc2UgY2xhc3NlcyB1bnRpbCB0aGUgZmlyc3Qgb25lXG4gICAqIHdpdGggYW4gZXhwbGljaXQgY29uc3RydWN0b3Igd2lsbCBiZSBkZWNvcmF0ZWQgd2l0aCB0aGUgXCJASW5qZWN0YWJsZSgpXCIuXG4gICAqL1xuICBtaWdyYXRlRGVjb3JhdGVkUHJvdmlkZXJzKHByb3ZpZGVyczogdHMuQ2xhc3NEZWNsYXJhdGlvbltdKTogVHJhbnNmb3JtRmFpbHVyZVtdIHtcbiAgICByZXR1cm4gcHJvdmlkZXJzLnJlZHVjZShcbiAgICAgICAgKGZhaWx1cmVzLCBub2RlKSA9PiBmYWlsdXJlcy5jb25jYXQodGhpcy5fbWlncmF0ZVByb3ZpZGVyQmFzZUNsYXNzKG5vZGUpKSxcbiAgICAgICAgW10gYXMgVHJhbnNmb3JtRmFpbHVyZVtdKTtcbiAgfVxuXG4gIHByaXZhdGUgX21pZ3JhdGVQcm92aWRlckJhc2VDbGFzcyhub2RlOiB0cy5DbGFzc0RlY2xhcmF0aW9uKTogVHJhbnNmb3JtRmFpbHVyZVtdIHtcbiAgICByZXR1cm4gdGhpcy5fbWlncmF0ZURlY29yYXRlZENsYXNzV2l0aEluaGVyaXRlZEN0b3IoXG4gICAgICAgIG5vZGUsIHN5bWJvbCA9PiB0aGlzLm1ldGFkYXRhUmVzb2x2ZXIuaXNJbmplY3RhYmxlKHN5bWJvbCksXG4gICAgICAgIG5vZGUgPT4gdGhpcy5fYWRkSW5qZWN0YWJsZURlY29yYXRvcihub2RlKSk7XG4gIH1cblxuICBwcml2YXRlIF9taWdyYXRlRGlyZWN0aXZlQmFzZUNsYXNzKG5vZGU6IHRzLkNsYXNzRGVjbGFyYXRpb24pOiBUcmFuc2Zvcm1GYWlsdXJlW10ge1xuICAgIHJldHVybiB0aGlzLl9taWdyYXRlRGVjb3JhdGVkQ2xhc3NXaXRoSW5oZXJpdGVkQ3RvcihcbiAgICAgICAgbm9kZSwgc3ltYm9sID0+IHRoaXMubWV0YWRhdGFSZXNvbHZlci5pc0RpcmVjdGl2ZShzeW1ib2wpLFxuICAgICAgICBub2RlID0+IHRoaXMuX2FkZEFic3RyYWN0RGlyZWN0aXZlRGVjb3JhdG9yKG5vZGUpKTtcbiAgfVxuXG5cbiAgcHJpdmF0ZSBfbWlncmF0ZURlY29yYXRlZENsYXNzV2l0aEluaGVyaXRlZEN0b3IoXG4gICAgICBub2RlOiB0cy5DbGFzc0RlY2xhcmF0aW9uLCBpc0NsYXNzRGVjb3JhdGVkOiAoc3ltYm9sOiBTdGF0aWNTeW1ib2wpID0+IGJvb2xlYW4sXG4gICAgICBhZGRDbGFzc0RlY29yYXRvcjogKG5vZGU6IHRzLkNsYXNzRGVjbGFyYXRpb24pID0+IHZvaWQpOiBUcmFuc2Zvcm1GYWlsdXJlW10ge1xuICAgIC8vIEluIGNhc2UgdGhlIHByb3ZpZGVyIGhhcyBhbiBleHBsaWNpdCBjb25zdHJ1Y3Rvciwgd2UgZG9uJ3QgbmVlZCB0byBkbyBhbnl0aGluZ1xuICAgIC8vIGJlY2F1c2UgdGhlIGNsYXNzIGlzIGFscmVhZHkgZGVjb3JhdGVkIGFuZCBkb2VzIG5vdCBpbmhlcml0IGEgY29uc3RydWN0b3IuXG4gICAgaWYgKGhhc0V4cGxpY2l0Q29uc3RydWN0b3Iobm9kZSkpIHtcbiAgICAgIHJldHVybiBbXTtcbiAgICB9XG5cbiAgICBjb25zdCBvcmRlcmVkQmFzZUNsYXNzZXMgPSBmaW5kQmFzZUNsYXNzRGVjbGFyYXRpb25zKG5vZGUsIHRoaXMudHlwZUNoZWNrZXIpO1xuICAgIGNvbnN0IHVuZGVjb3JhdGVkQmFzZUNsYXNzZXM6IHRzLkNsYXNzRGVjbGFyYXRpb25bXSA9IFtdO1xuXG4gICAgZm9yIChsZXQge25vZGU6IGJhc2VDbGFzcywgaWRlbnRpZmllcn0gb2Ygb3JkZXJlZEJhc2VDbGFzc2VzKSB7XG4gICAgICBjb25zdCBiYXNlQ2xhc3NGaWxlID0gYmFzZUNsYXNzLmdldFNvdXJjZUZpbGUoKTtcblxuICAgICAgaWYgKGhhc0V4cGxpY2l0Q29uc3RydWN0b3IoYmFzZUNsYXNzKSkge1xuICAgICAgICAvLyBBbGwgY2xhc3NlcyBpbiBiZXR3ZWVuIHRoZSBkZWNvcmF0ZWQgY2xhc3MgYW5kIHRoZSB1bmRlY29yYXRlZCBjbGFzc1xuICAgICAgICAvLyB0aGF0IGRlZmluZXMgdGhlIGNvbnN0cnVjdG9yIG5lZWQgdG8gYmUgZGVjb3JhdGVkIGFzIHdlbGwuXG4gICAgICAgIHVuZGVjb3JhdGVkQmFzZUNsYXNzZXMuZm9yRWFjaChiID0+IGFkZENsYXNzRGVjb3JhdG9yKGIpKTtcblxuICAgICAgICBpZiAoYmFzZUNsYXNzRmlsZS5pc0RlY2xhcmF0aW9uRmlsZSkge1xuICAgICAgICAgIGNvbnN0IHN0YXRpY1N5bWJvbCA9IHRoaXMuX2dldFN0YXRpY1N5bWJvbE9mSWRlbnRpZmllcihpZGVudGlmaWVyKTtcblxuICAgICAgICAgIC8vIElmIHRoZSBiYXNlIGNsYXNzIGlzIGRlY29yYXRlZCB0aHJvdWdoIG1ldGFkYXRhIGZpbGVzLCB3ZSBkb24ndFxuICAgICAgICAgIC8vIG5lZWQgdG8gYWRkIGEgY29tbWVudCB0byB0aGUgZGVyaXZlZCBjbGFzcyBmb3IgdGhlIGV4dGVybmFsIGJhc2UgY2xhc3MuXG4gICAgICAgICAgaWYgKHN0YXRpY1N5bWJvbCAmJiBpc0NsYXNzRGVjb3JhdGVkKHN0YXRpY1N5bWJvbCkpIHtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIEZpbmQgdGhlIGxhc3QgY2xhc3MgaW4gdGhlIGluaGVyaXRhbmNlIGNoYWluIHRoYXQgaXMgZGVjb3JhdGVkIGFuZCB3aWxsIGJlXG4gICAgICAgICAgLy8gdXNlZCBhcyBhbmNob3IgZm9yIGEgY29tbWVudCBleHBsYWluaW5nIHRoYXQgdGhlIGNsYXNzIHRoYXQgZGVmaW5lcyB0aGVcbiAgICAgICAgICAvLyBjb25zdHJ1Y3RvciBjYW5ub3QgYmUgZGVjb3JhdGVkIGF1dG9tYXRpY2FsbHkuXG4gICAgICAgICAgY29uc3QgbGFzdERlY29yYXRlZENsYXNzID1cbiAgICAgICAgICAgICAgdW5kZWNvcmF0ZWRCYXNlQ2xhc3Nlc1t1bmRlY29yYXRlZEJhc2VDbGFzc2VzLmxlbmd0aCAtIDFdIHx8IG5vZGU7XG4gICAgICAgICAgcmV0dXJuIHRoaXMuX2FkZE1pc3NpbmdFeHBsaWNpdENvbnN0cnVjdG9yVG9kbyhsYXN0RGVjb3JhdGVkQ2xhc3MpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gRGVjb3JhdGUgdGhlIGNsYXNzIHRoYXQgZGVmaW5lcyB0aGUgY29uc3RydWN0b3IgdGhhdCBpcyBpbmhlcml0ZWQuXG4gICAgICAgIGFkZENsYXNzRGVjb3JhdG9yKGJhc2VDbGFzcyk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuXG4gICAgICAvLyBBZGQgdGhlIGNsYXNzIGRlY29yYXRvciBmb3IgYWxsIGJhc2UgY2xhc3NlcyBpbiB0aGUgaW5oZXJpdGFuY2UgY2hhaW4gdW50aWxcbiAgICAgIC8vIHRoZSBiYXNlIGNsYXNzIHdpdGggdGhlIGV4cGxpY2l0IGNvbnN0cnVjdG9yLiBUaGUgZGVjb3JhdG9yIHdpbGwgYmUgb25seVxuICAgICAgLy8gYWRkZWQgZm9yIGJhc2UgY2xhc3NlcyB3aGljaCBjYW4gYmUgbW9kaWZpZWQuXG4gICAgICBpZiAoIWJhc2VDbGFzc0ZpbGUuaXNEZWNsYXJhdGlvbkZpbGUpIHtcbiAgICAgICAgdW5kZWNvcmF0ZWRCYXNlQ2xhc3Nlcy5wdXNoKGJhc2VDbGFzcyk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBbXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGRzIHRoZSBhYnN0cmFjdCBcIkBEaXJlY3RpdmUoKVwiIGRlY29yYXRvciB0byB0aGUgZ2l2ZW4gY2xhc3MgaW4gY2FzZSB0aGVyZVxuICAgKiBpcyBubyBleGlzdGluZyBkaXJlY3RpdmUgZGVjb3JhdG9yLlxuICAgKi9cbiAgcHJpdmF0ZSBfYWRkQWJzdHJhY3REaXJlY3RpdmVEZWNvcmF0b3IoYmFzZUNsYXNzOiB0cy5DbGFzc0RlY2xhcmF0aW9uKSB7XG4gICAgaWYgKGhhc0RpcmVjdGl2ZURlY29yYXRvcihiYXNlQ2xhc3MsIHRoaXMudHlwZUNoZWNrZXIpIHx8XG4gICAgICAgIHRoaXMuZGVjb3JhdGVkRGlyZWN0aXZlcy5oYXMoYmFzZUNsYXNzKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGJhc2VDbGFzc0ZpbGUgPSBiYXNlQ2xhc3MuZ2V0U291cmNlRmlsZSgpO1xuICAgIGNvbnN0IHJlY29yZGVyID0gdGhpcy5nZXRVcGRhdGVSZWNvcmRlcihiYXNlQ2xhc3NGaWxlKTtcbiAgICBjb25zdCBkaXJlY3RpdmVFeHByID1cbiAgICAgICAgdGhpcy5pbXBvcnRNYW5hZ2VyLmFkZEltcG9ydFRvU291cmNlRmlsZShiYXNlQ2xhc3NGaWxlLCAnRGlyZWN0aXZlJywgJ0Bhbmd1bGFyL2NvcmUnKTtcblxuICAgIGNvbnN0IG5ld0RlY29yYXRvciA9IHRzLmNyZWF0ZURlY29yYXRvcih0cy5jcmVhdGVDYWxsKGRpcmVjdGl2ZUV4cHIsIHVuZGVmaW5lZCwgW10pKTtcbiAgICBjb25zdCBuZXdEZWNvcmF0b3JUZXh0ID1cbiAgICAgICAgdGhpcy5wcmludGVyLnByaW50Tm9kZSh0cy5FbWl0SGludC5VbnNwZWNpZmllZCwgbmV3RGVjb3JhdG9yLCBiYXNlQ2xhc3NGaWxlKTtcblxuICAgIHJlY29yZGVyLmFkZENsYXNzRGVjb3JhdG9yKGJhc2VDbGFzcywgbmV3RGVjb3JhdG9yVGV4dCk7XG4gICAgdGhpcy5kZWNvcmF0ZWREaXJlY3RpdmVzLmFkZChiYXNlQ2xhc3MpO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZHMgdGhlIGFic3RyYWN0IFwiQEluamVjdGFibGUoKVwiIGRlY29yYXRvciB0byB0aGUgZ2l2ZW4gY2xhc3MgaW4gY2FzZSB0aGVyZVxuICAgKiBpcyBubyBleGlzdGluZyBkaXJlY3RpdmUgZGVjb3JhdG9yLlxuICAgKi9cbiAgcHJpdmF0ZSBfYWRkSW5qZWN0YWJsZURlY29yYXRvcihiYXNlQ2xhc3M6IHRzLkNsYXNzRGVjbGFyYXRpb24pIHtcbiAgICBpZiAoaGFzSW5qZWN0YWJsZURlY29yYXRvcihiYXNlQ2xhc3MsIHRoaXMudHlwZUNoZWNrZXIpIHx8XG4gICAgICAgIHRoaXMuZGVjb3JhdGVkUHJvdmlkZXJzLmhhcyhiYXNlQ2xhc3MpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgYmFzZUNsYXNzRmlsZSA9IGJhc2VDbGFzcy5nZXRTb3VyY2VGaWxlKCk7XG4gICAgY29uc3QgcmVjb3JkZXIgPSB0aGlzLmdldFVwZGF0ZVJlY29yZGVyKGJhc2VDbGFzc0ZpbGUpO1xuICAgIGNvbnN0IGluamVjdGFibGVFeHByID1cbiAgICAgICAgdGhpcy5pbXBvcnRNYW5hZ2VyLmFkZEltcG9ydFRvU291cmNlRmlsZShiYXNlQ2xhc3NGaWxlLCAnSW5qZWN0YWJsZScsICdAYW5ndWxhci9jb3JlJyk7XG5cbiAgICBjb25zdCBuZXdEZWNvcmF0b3IgPSB0cy5jcmVhdGVEZWNvcmF0b3IodHMuY3JlYXRlQ2FsbChpbmplY3RhYmxlRXhwciwgdW5kZWZpbmVkLCBbXSkpO1xuICAgIGNvbnN0IG5ld0RlY29yYXRvclRleHQgPVxuICAgICAgICB0aGlzLnByaW50ZXIucHJpbnROb2RlKHRzLkVtaXRIaW50LlVuc3BlY2lmaWVkLCBuZXdEZWNvcmF0b3IsIGJhc2VDbGFzc0ZpbGUpO1xuXG4gICAgcmVjb3JkZXIuYWRkQ2xhc3NEZWNvcmF0b3IoYmFzZUNsYXNzLCBuZXdEZWNvcmF0b3JUZXh0KTtcbiAgICB0aGlzLmRlY29yYXRlZFByb3ZpZGVycy5hZGQoYmFzZUNsYXNzKTtcbiAgfVxuXG4gIC8qKiBBZGRzIGEgY29tbWVudCBmb3IgYWRkaW5nIGFuIGV4cGxpY2l0IGNvbnN0cnVjdG9yIHRvIHRoZSBnaXZlbiBjbGFzcyBkZWNsYXJhdGlvbi4gKi9cbiAgcHJpdmF0ZSBfYWRkTWlzc2luZ0V4cGxpY2l0Q29uc3RydWN0b3JUb2RvKG5vZGU6IHRzLkNsYXNzRGVjbGFyYXRpb24pOiBUcmFuc2Zvcm1GYWlsdXJlW10ge1xuICAgIC8vIEluIGNhc2UgYSB0b2RvIGNvbW1lbnQgaGFzIGJlZW4gYWxyZWFkeSBpbnNlcnRlZCB0byB0aGUgZ2l2ZW4gY2xhc3MsIHdlIGRvbid0XG4gICAgLy8gd2FudCB0byBhZGQgYSBjb21tZW50IG9yIHRyYW5zZm9ybSBmYWlsdXJlIG11bHRpcGxlIHRpbWVzLlxuICAgIGlmICh0aGlzLm1pc3NpbmdFeHBsaWNpdENvbnN0cnVjdG9yQ2xhc3Nlcy5oYXMobm9kZSkpIHtcbiAgICAgIHJldHVybiBbXTtcbiAgICB9XG4gICAgdGhpcy5taXNzaW5nRXhwbGljaXRDb25zdHJ1Y3RvckNsYXNzZXMuYWRkKG5vZGUpO1xuICAgIGNvbnN0IHJlY29yZGVyID0gdGhpcy5nZXRVcGRhdGVSZWNvcmRlcihub2RlLmdldFNvdXJjZUZpbGUoKSk7XG4gICAgcmVjb3JkZXIuYWRkQ2xhc3NDb21tZW50KG5vZGUsICdUT0RPOiBhZGQgZXhwbGljaXQgY29uc3RydWN0b3InKTtcbiAgICByZXR1cm4gW3tub2RlOiBub2RlLCBtZXNzYWdlOiAnQ2xhc3MgbmVlZHMgdG8gZGVjbGFyZSBhbiBleHBsaWNpdCBjb25zdHJ1Y3Rvci4nfV07XG4gIH1cblxuICAvKipcbiAgICogTWlncmF0ZXMgdW5kZWNvcmF0ZWQgZGlyZWN0aXZlcyB3aGljaCB3ZXJlIHJlZmVyZW5jZWQgaW4gTmdNb2R1bGUgZGVjbGFyYXRpb25zLlxuICAgKiBUaGVzZSBkaXJlY3RpdmVzIGluaGVyaXQgdGhlIG1ldGFkYXRhIGZyb20gYSBwYXJlbnQgYmFzZSBjbGFzcywgYnV0IHdpdGggSXZ5XG4gICAqIHRoZXNlIGNsYXNzZXMgbmVlZCB0byBleHBsaWNpdGx5IGhhdmUgYSBkZWNvcmF0b3IgZm9yIGxvY2FsaXR5LiBUaGUgbWlncmF0aW9uXG4gICAqIGRldGVybWluZXMgdGhlIGluaGVyaXRlZCBkZWNvcmF0b3IgYW5kIGNvcGllcyBpdCB0byB0aGUgdW5kZWNvcmF0ZWQgZGVjbGFyYXRpb24uXG4gICAqXG4gICAqIE5vdGUgdGhhdCB0aGUgbWlncmF0aW9uIHNlcmlhbGl6ZXMgdGhlIG1ldGFkYXRhIGZvciBleHRlcm5hbCBkZWNsYXJhdGlvbnNcbiAgICogd2hlcmUgdGhlIGRlY29yYXRvciBpcyBub3QgcGFydCBvZiB0aGUgc291cmNlIGZpbGUgQVNULlxuICAgKlxuICAgKiBTZWUgY2FzZSAyIGluIHRoZSBtaWdyYXRpb24gcGxhbjogaHR0cHM6Ly9oYWNrbWQuaW8vQGFseC9TMVhLcU1aZVNcbiAgICovXG4gIG1pZ3JhdGVVbmRlY29yYXRlZERlY2xhcmF0aW9ucyhkaXJlY3RpdmVzOiB0cy5DbGFzc0RlY2xhcmF0aW9uW10pOiBUcmFuc2Zvcm1GYWlsdXJlW10ge1xuICAgIHJldHVybiBkaXJlY3RpdmVzLnJlZHVjZShcbiAgICAgICAgKGZhaWx1cmVzLCBub2RlKSA9PiBmYWlsdXJlcy5jb25jYXQodGhpcy5fbWlncmF0ZURlcml2ZWREZWNsYXJhdGlvbihub2RlKSksXG4gICAgICAgIFtdIGFzIFRyYW5zZm9ybUZhaWx1cmVbXSk7XG4gIH1cblxuICBwcml2YXRlIF9taWdyYXRlRGVyaXZlZERlY2xhcmF0aW9uKG5vZGU6IHRzLkNsYXNzRGVjbGFyYXRpb24pOiBUcmFuc2Zvcm1GYWlsdXJlW10ge1xuICAgIGNvbnN0IHRhcmdldFNvdXJjZUZpbGUgPSBub2RlLmdldFNvdXJjZUZpbGUoKTtcbiAgICBjb25zdCBvcmRlcmVkQmFzZUNsYXNzZXMgPSBmaW5kQmFzZUNsYXNzRGVjbGFyYXRpb25zKG5vZGUsIHRoaXMudHlwZUNoZWNrZXIpO1xuICAgIGxldCBuZXdEZWNvcmF0b3JUZXh0OiBzdHJpbmd8bnVsbCA9IG51bGw7XG5cbiAgICBmb3IgKGxldCB7bm9kZTogYmFzZUNsYXNzLCBpZGVudGlmaWVyfSBvZiBvcmRlcmVkQmFzZUNsYXNzZXMpIHtcbiAgICAgIC8vIEJlZm9yZSBsb29raW5nIGZvciBkZWNvcmF0b3JzIHdpdGhpbiB0aGUgbWV0YWRhdGEgb3Igc3VtbWFyeSBmaWxlcywgd2VcbiAgICAgIC8vIHRyeSB0byBkZXRlcm1pbmUgdGhlIGRpcmVjdGl2ZSBkZWNvcmF0b3IgdGhyb3VnaCB0aGUgc291cmNlIGZpbGUgQVNULlxuICAgICAgaWYgKGJhc2VDbGFzcy5kZWNvcmF0b3JzKSB7XG4gICAgICAgIGNvbnN0IG5nRGVjb3JhdG9yID1cbiAgICAgICAgICAgIGdldEFuZ3VsYXJEZWNvcmF0b3JzKHRoaXMudHlwZUNoZWNrZXIsIGJhc2VDbGFzcy5kZWNvcmF0b3JzKVxuICAgICAgICAgICAgICAgIC5maW5kKCh7bmFtZX0pID0+IG5hbWUgPT09ICdDb21wb25lbnQnIHx8IG5hbWUgPT09ICdEaXJlY3RpdmUnIHx8IG5hbWUgPT09ICdQaXBlJyk7XG5cbiAgICAgICAgaWYgKG5nRGVjb3JhdG9yKSB7XG4gICAgICAgICAgY29uc3QgbmV3RGVjb3JhdG9yID0gdGhpcy5kZWNvcmF0b3JSZXdyaXRlci5yZXdyaXRlKG5nRGVjb3JhdG9yLCBub2RlLmdldFNvdXJjZUZpbGUoKSk7XG4gICAgICAgICAgbmV3RGVjb3JhdG9yVGV4dCA9IHRoaXMucHJpbnRlci5wcmludE5vZGUoXG4gICAgICAgICAgICAgIHRzLkVtaXRIaW50LlVuc3BlY2lmaWVkLCBuZXdEZWNvcmF0b3IsIG5nRGVjb3JhdG9yLm5vZGUuZ2V0U291cmNlRmlsZSgpKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBJZiBubyBtZXRhZGF0YSBjb3VsZCBiZSBmb3VuZCB3aXRoaW4gdGhlIHNvdXJjZS1maWxlIEFTVCwgdHJ5IHRvIGZpbmRcbiAgICAgIC8vIGRlY29yYXRvciBkYXRhIHRocm91Z2ggQW5ndWxhciBtZXRhZGF0YSBhbmQgc3VtbWFyeSBmaWxlcy5cbiAgICAgIGNvbnN0IHN0YXRpY1N5bWJvbCA9IHRoaXMuX2dldFN0YXRpY1N5bWJvbE9mSWRlbnRpZmllcihpZGVudGlmaWVyKTtcblxuICAgICAgLy8gQ2hlY2sgaWYgdGhlIHN0YXRpYyBzeW1ib2wgcmVzb2x2ZXMgdG8gYSBjbGFzcyBkZWNsYXJhdGlvbiB3aXRoXG4gICAgICAvLyBwaXBlIG9yIGRpcmVjdGl2ZSBtZXRhZGF0YS5cbiAgICAgIGlmICghc3RhdGljU3ltYm9sIHx8XG4gICAgICAgICAgISh0aGlzLm1ldGFkYXRhUmVzb2x2ZXIuaXNQaXBlKHN0YXRpY1N5bWJvbCkgfHxcbiAgICAgICAgICAgIHRoaXMubWV0YWRhdGFSZXNvbHZlci5pc0RpcmVjdGl2ZShzdGF0aWNTeW1ib2wpKSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgbWV0YWRhdGEgPSB0aGlzLl9yZXNvbHZlRGVjbGFyYXRpb25NZXRhZGF0YShzdGF0aWNTeW1ib2wpO1xuXG4gICAgICAvLyBJZiBubyBtZXRhZGF0YSBjb3VsZCBiZSByZXNvbHZlZCBmb3IgdGhlIHN0YXRpYyBzeW1ib2wsIHByaW50IGEgZmFpbHVyZSBtZXNzYWdlXG4gICAgICAvLyBhbmQgYXNrIHRoZSBkZXZlbG9wZXIgdG8gbWFudWFsbHkgbWlncmF0ZSB0aGUgY2xhc3MuIFRoaXMgY2FzZSBpcyByYXJlIGJlY2F1c2VcbiAgICAgIC8vIHVzdWFsbHkgZGVjb3JhdG9yIG1ldGFkYXRhIGlzIGFsd2F5cyBwcmVzZW50IGJ1dCBqdXN0IGNhbid0IGJlIHJlYWQgaWYgYSBwcm9ncmFtXG4gICAgICAvLyBvbmx5IGhhcyBhY2Nlc3MgdG8gc3VtbWFyaWVzICh0aGlzIGlzIGEgc3BlY2lhbCBjYXNlIGluIGdvb2dsZTMpLlxuICAgICAgaWYgKCFtZXRhZGF0YSkge1xuICAgICAgICByZXR1cm4gW3tcbiAgICAgICAgICBub2RlLFxuICAgICAgICAgIG1lc3NhZ2U6IGBDbGFzcyBjYW5ub3QgYmUgbWlncmF0ZWQgYXMgdGhlIGluaGVyaXRlZCBtZXRhZGF0YSBmcm9tIGAgK1xuICAgICAgICAgICAgICBgJHtpZGVudGlmaWVyLmdldFRleHQoKX0gY2Fubm90IGJlIGNvbnZlcnRlZCBpbnRvIGEgZGVjb3JhdG9yLiBQbGVhc2UgbWFudWFsbHlcbiAgICAgICAgICAgIGRlY29yYXRlIHRoZSBjbGFzcy5gLFxuICAgICAgICB9XTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgbmV3RGVjb3JhdG9yID0gdGhpcy5fY29uc3RydWN0RGVjb3JhdG9yRnJvbU1ldGFkYXRhKG1ldGFkYXRhLCB0YXJnZXRTb3VyY2VGaWxlKTtcbiAgICAgIGlmICghbmV3RGVjb3JhdG9yKSB7XG4gICAgICAgIGNvbnN0IGFubm90YXRpb25UeXBlID0gbWV0YWRhdGEudHlwZTtcbiAgICAgICAgcmV0dXJuIFt7XG4gICAgICAgICAgbm9kZSxcbiAgICAgICAgICBtZXNzYWdlOiBgQ2xhc3MgY2Fubm90IGJlIG1pZ3JhdGVkIGFzIHRoZSBpbmhlcml0ZWQgQCR7YW5ub3RhdGlvblR5cGV9IGRlY29yYXRvciBgICtcbiAgICAgICAgICAgICAgYGNhbm5vdCBiZSBjb3BpZWQuIFBsZWFzZSBtYW51YWxseSBhZGQgYSBAJHthbm5vdGF0aW9uVHlwZX0gZGVjb3JhdG9yLmAsXG4gICAgICAgIH1dO1xuICAgICAgfVxuXG4gICAgICAvLyBJbiBjYXNlIHRoZSBkZWNvcmF0b3IgY291bGQgYmUgY29uc3RydWN0ZWQgZnJvbSB0aGUgcmVzb2x2ZWQgbWV0YWRhdGEsIHVzZVxuICAgICAgLy8gdGhhdCBkZWNvcmF0b3IgZm9yIHRoZSBkZXJpdmVkIHVuZGVjb3JhdGVkIGNsYXNzZXMuXG4gICAgICBuZXdEZWNvcmF0b3JUZXh0ID1cbiAgICAgICAgICB0aGlzLnByaW50ZXIucHJpbnROb2RlKHRzLkVtaXRIaW50LlVuc3BlY2lmaWVkLCBuZXdEZWNvcmF0b3IsIHRhcmdldFNvdXJjZUZpbGUpO1xuICAgICAgYnJlYWs7XG4gICAgfVxuXG4gICAgaWYgKCFuZXdEZWNvcmF0b3JUZXh0KSB7XG4gICAgICByZXR1cm4gW3tcbiAgICAgICAgbm9kZSxcbiAgICAgICAgbWVzc2FnZTpcbiAgICAgICAgICAgICdDbGFzcyBjYW5ub3QgYmUgbWlncmF0ZWQgYXMgbm8gZGlyZWN0aXZlL2NvbXBvbmVudC9waXBlIG1ldGFkYXRhIGNvdWxkIGJlIGZvdW5kLiAnICtcbiAgICAgICAgICAgICdQbGVhc2UgbWFudWFsbHkgYWRkIGEgQERpcmVjdGl2ZSwgQENvbXBvbmVudCBvciBAUGlwZSBkZWNvcmF0b3IuJ1xuICAgICAgfV07XG4gICAgfVxuXG4gICAgdGhpcy5nZXRVcGRhdGVSZWNvcmRlcih0YXJnZXRTb3VyY2VGaWxlKS5hZGRDbGFzc0RlY29yYXRvcihub2RlLCBuZXdEZWNvcmF0b3JUZXh0KTtcbiAgICByZXR1cm4gW107XG4gIH1cblxuICAvKiogUmVjb3JkcyBhbGwgY2hhbmdlcyB0aGF0IHdlcmUgbWFkZSBpbiB0aGUgaW1wb3J0IG1hbmFnZXIuICovXG4gIHJlY29yZENoYW5nZXMoKSB7XG4gICAgdGhpcy5pbXBvcnRNYW5hZ2VyLnJlY29yZENoYW5nZXMoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb25zdHJ1Y3RzIGEgVHlwZVNjcmlwdCBkZWNvcmF0b3Igbm9kZSBmcm9tIHRoZSBzcGVjaWZpZWQgZGVjbGFyYXRpb24gbWV0YWRhdGEuIFJldHVybnNcbiAgICogbnVsbCBpZiB0aGUgbWV0YWRhdGEgY291bGQgbm90IGJlIHNpbXBsaWZpZWQvcmVzb2x2ZWQuXG4gICAqL1xuICBwcml2YXRlIF9jb25zdHJ1Y3REZWNvcmF0b3JGcm9tTWV0YWRhdGEoXG4gICAgICBkaXJlY3RpdmVNZXRhZGF0YTogRGVjbGFyYXRpb25NZXRhZGF0YSwgdGFyZ2V0U291cmNlRmlsZTogdHMuU291cmNlRmlsZSk6IHRzLkRlY29yYXRvcnxudWxsIHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgZGVjb3JhdG9yRXhwciA9IGNvbnZlcnREaXJlY3RpdmVNZXRhZGF0YVRvRXhwcmVzc2lvbihcbiAgICAgICAgICB0aGlzLmNvbXBpbGVyTW9kdWxlLCBkaXJlY3RpdmVNZXRhZGF0YS5tZXRhZGF0YSxcbiAgICAgICAgICBzdGF0aWNTeW1ib2wgPT5cbiAgICAgICAgICAgICAgdGhpcy5jb21waWxlckhvc3RcbiAgICAgICAgICAgICAgICAgIC5maWxlTmFtZVRvTW9kdWxlTmFtZShzdGF0aWNTeW1ib2wuZmlsZVBhdGgsIHRhcmdldFNvdXJjZUZpbGUuZmlsZU5hbWUpXG4gICAgICAgICAgICAgICAgICAucmVwbGFjZSgvXFwvaW5kZXgkLywgJycpLFxuICAgICAgICAgIChtb2R1bGVOYW1lOiBzdHJpbmcsIG5hbWU6IHN0cmluZykgPT5cbiAgICAgICAgICAgICAgdGhpcy5pbXBvcnRNYW5hZ2VyLmFkZEltcG9ydFRvU291cmNlRmlsZSh0YXJnZXRTb3VyY2VGaWxlLCBuYW1lLCBtb2R1bGVOYW1lKSxcbiAgICAgICAgICAocHJvcGVydHlOYW1lLCB2YWx1ZSkgPT4ge1xuICAgICAgICAgICAgLy8gT25seSBub3JtYWxpemUgcHJvcGVydGllcyBjYWxsZWQgXCJjaGFuZ2VEZXRlY3Rpb25cIiBhbmQgXCJlbmNhcHN1bGF0aW9uXCJcbiAgICAgICAgICAgIC8vIGZvciBcIkBEaXJlY3RpdmVcIiBhbmQgXCJAQ29tcG9uZW50XCIgYW5ub3RhdGlvbnMuXG4gICAgICAgICAgICBpZiAoZGlyZWN0aXZlTWV0YWRhdGEudHlwZSA9PT0gJ1BpcGUnKSB7XG4gICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBJbnN0ZWFkIG9mIHVzaW5nIHRoZSBudW1iZXIgYXMgdmFsdWUgZm9yIHRoZSBcImNoYW5nZURldGVjdGlvblwiIGFuZFxuICAgICAgICAgICAgLy8gXCJlbmNhcHN1bGF0aW9uXCIgcHJvcGVydGllcywgd2Ugd2FudCB0byB1c2UgdGhlIGFjdHVhbCBlbnVtIHN5bWJvbHMuXG4gICAgICAgICAgICBpZiAocHJvcGVydHlOYW1lID09PSAnY2hhbmdlRGV0ZWN0aW9uJyAmJiB0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInKSB7XG4gICAgICAgICAgICAgIHJldHVybiB0cy5jcmVhdGVQcm9wZXJ0eUFjY2VzcyhcbiAgICAgICAgICAgICAgICAgIHRoaXMuaW1wb3J0TWFuYWdlci5hZGRJbXBvcnRUb1NvdXJjZUZpbGUoXG4gICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0U291cmNlRmlsZSwgJ0NoYW5nZURldGVjdGlvblN0cmF0ZWd5JywgJ0Bhbmd1bGFyL2NvcmUnKSxcbiAgICAgICAgICAgICAgICAgIHRoaXMuY29yZU1vZHVsZS5DaGFuZ2VEZXRlY3Rpb25TdHJhdGVneVt2YWx1ZV0pO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChwcm9wZXJ0eU5hbWUgPT09ICdlbmNhcHN1bGF0aW9uJyAmJiB0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInKSB7XG4gICAgICAgICAgICAgIHJldHVybiB0cy5jcmVhdGVQcm9wZXJ0eUFjY2VzcyhcbiAgICAgICAgICAgICAgICAgIHRoaXMuaW1wb3J0TWFuYWdlci5hZGRJbXBvcnRUb1NvdXJjZUZpbGUoXG4gICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0U291cmNlRmlsZSwgJ1ZpZXdFbmNhcHN1bGF0aW9uJywgJ0Bhbmd1bGFyL2NvcmUnKSxcbiAgICAgICAgICAgICAgICAgIHRoaXMuY29yZU1vZHVsZS5WaWV3RW5jYXBzdWxhdGlvblt2YWx1ZV0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgfSk7XG5cbiAgICAgIHJldHVybiB0cy5jcmVhdGVEZWNvcmF0b3IodHMuY3JlYXRlQ2FsbChcbiAgICAgICAgICB0aGlzLmltcG9ydE1hbmFnZXIuYWRkSW1wb3J0VG9Tb3VyY2VGaWxlKFxuICAgICAgICAgICAgICB0YXJnZXRTb3VyY2VGaWxlLCBkaXJlY3RpdmVNZXRhZGF0YS50eXBlLCAnQGFuZ3VsYXIvY29yZScpLFxuICAgICAgICAgIHVuZGVmaW5lZCwgW2RlY29yYXRvckV4cHJdKSk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgaWYgKGUgaW5zdGFuY2VvZiBVbmV4cGVjdGVkTWV0YWRhdGFWYWx1ZUVycm9yKSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuICAgICAgdGhyb3cgZTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUmVzb2x2ZXMgdGhlIGRlY2xhcmF0aW9uIG1ldGFkYXRhIG9mIGEgZ2l2ZW4gc3RhdGljIHN5bWJvbC4gVGhlIG1ldGFkYXRhXG4gICAqIGlzIGRldGVybWluZWQgYnkgcmVzb2x2aW5nIG1ldGFkYXRhIGZvciB0aGUgc3RhdGljIHN5bWJvbC5cbiAgICovXG4gIHByaXZhdGUgX3Jlc29sdmVEZWNsYXJhdGlvbk1ldGFkYXRhKHN5bWJvbDogU3RhdGljU3ltYm9sKTogbnVsbHxEZWNsYXJhdGlvbk1ldGFkYXRhIHtcbiAgICB0cnkge1xuICAgICAgLy8gTm90ZSB0aGF0IHRoaXMgY2FsbCBjYW4gdGhyb3cgaWYgdGhlIG1ldGFkYXRhIGlzIG5vdCBjb21wdXRhYmxlLiBJbiB0aGF0XG4gICAgICAvLyBjYXNlIHdlIGFyZSBub3QgYWJsZSB0byBzZXJpYWxpemUgdGhlIG1ldGFkYXRhIGludG8gYSBkZWNvcmF0b3IgYW5kIHdlIHJldHVyblxuICAgICAgLy8gbnVsbC5cbiAgICAgIGNvbnN0IGFubm90YXRpb25zID0gdGhpcy5jb21waWxlci5yZWZsZWN0b3IuYW5ub3RhdGlvbnMoc3ltYm9sKS5maW5kKFxuICAgICAgICAgIHMgPT4gcy5uZ01ldGFkYXRhTmFtZSA9PT0gJ0NvbXBvbmVudCcgfHwgcy5uZ01ldGFkYXRhTmFtZSA9PT0gJ0RpcmVjdGl2ZScgfHxcbiAgICAgICAgICAgICAgcy5uZ01ldGFkYXRhTmFtZSA9PT0gJ1BpcGUnKTtcblxuICAgICAgaWYgKCFhbm5vdGF0aW9ucykge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cblxuICAgICAgY29uc3Qge25nTWV0YWRhdGFOYW1lLCAuLi5tZXRhZGF0YX0gPSBhbm5vdGF0aW9ucztcblxuICAgICAgLy8gRGVsZXRlIHRoZSBcIm5nTWV0YWRhdGFOYW1lXCIgcHJvcGVydHkgYXMgd2UgZG9uJ3Qgd2FudCB0byBnZW5lcmF0ZVxuICAgICAgLy8gYSBwcm9wZXJ0eSBhc3NpZ25tZW50IGluIHRoZSBuZXcgZGVjb3JhdG9yIGZvciB0aGF0IGludGVybmFsIHByb3BlcnR5LlxuICAgICAgZGVsZXRlIG1ldGFkYXRhWyduZ01ldGFkYXRhTmFtZSddO1xuXG4gICAgICByZXR1cm4ge3R5cGU6IG5nTWV0YWRhdGFOYW1lLCBtZXRhZGF0YX07XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBfZ2V0U3RhdGljU3ltYm9sT2ZJZGVudGlmaWVyKG5vZGU6IHRzLklkZW50aWZpZXIpOiBTdGF0aWNTeW1ib2x8bnVsbCB7XG4gICAgY29uc3Qgc291cmNlRmlsZSA9IG5vZGUuZ2V0U291cmNlRmlsZSgpO1xuICAgIGNvbnN0IHJlc29sdmVkSW1wb3J0ID0gZ2V0SW1wb3J0T2ZJZGVudGlmaWVyKHRoaXMudHlwZUNoZWNrZXIsIG5vZGUpO1xuXG4gICAgaWYgKCFyZXNvbHZlZEltcG9ydCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgY29uc3QgbW9kdWxlTmFtZSA9XG4gICAgICAgIHRoaXMuY29tcGlsZXJIb3N0Lm1vZHVsZU5hbWVUb0ZpbGVOYW1lKHJlc29sdmVkSW1wb3J0LmltcG9ydE1vZHVsZSwgc291cmNlRmlsZS5maWxlTmFtZSk7XG5cbiAgICBpZiAoIW1vZHVsZU5hbWUpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIC8vIEZpbmQgdGhlIGRlY2xhcmF0aW9uIHN5bWJvbCBhcyBzeW1ib2xzIGNvdWxkIGJlIGFsaWFzZWQgZHVlIHRvXG4gICAgLy8gbWV0YWRhdGEgcmUtZXhwb3J0cy5cbiAgICByZXR1cm4gdGhpcy5jb21waWxlci5yZWZsZWN0b3IuZmluZFN5bWJvbERlY2xhcmF0aW9uKFxuICAgICAgICB0aGlzLnN5bWJvbFJlc29sdmVyLmdldFN0YXRpY1N5bWJvbChtb2R1bGVOYW1lLCByZXNvbHZlZEltcG9ydC5uYW1lKSk7XG4gIH1cblxuICAvKipcbiAgICogRGlzYWJsZXMgdGhhdCBzdGF0aWMgc3ltYm9scyBhcmUgcmVzb2x2ZWQgdGhyb3VnaCBzdW1tYXJpZXMuIFN1bW1hcmllc1xuICAgKiBjYW5ub3QgYmUgdXNlZCBmb3IgZGVjb3JhdG9yIGFuYWx5c2lzIGFzIGRlY29yYXRvcnMgYXJlIG9taXR0ZWQgaW4gc3VtbWFyaWVzLlxuICAgKi9cbiAgcHJpdmF0ZSBfZGlzYWJsZVN1bW1hcnlSZXNvbHV0aW9uKCkge1xuICAgIC8vIFdlIG5ldmVyIHdhbnQgdG8gcmVzb2x2ZSBzeW1ib2xzIHRocm91Z2ggc3VtbWFyaWVzLiBTdW1tYXJpZXMgbmV2ZXIgY29udGFpblxuICAgIC8vIGRlY29yYXRvcnMgZm9yIGNsYXNzIHN5bWJvbHMgYW5kIHRoZXJlZm9yZSBzdW1tYXJpZXMgd2lsbCBjYXVzZSBldmVyeSBjbGFzc1xuICAgIC8vIHRvIGJlIGNvbnNpZGVyZWQgYXMgdW5kZWNvcmF0ZWQuIFNlZSByZWFzb24gZm9yIHRoaXMgaW46IFwiVG9Kc29uU2VyaWFsaXplclwiLlxuICAgIC8vIEluIG9yZGVyIHRvIGVuc3VyZSB0aGF0IG1ldGFkYXRhIGlzIG5vdCByZXRyaWV2ZWQgdGhyb3VnaCBzdW1tYXJpZXMsIHdlXG4gICAgLy8gbmVlZCB0byBkaXNhYmxlIHN1bW1hcnkgcmVzb2x1dGlvbiwgY2xlYXIgcHJldmlvdXMgc3ltYm9sIGNhY2hlcy4gVGhpcyB3YXlcbiAgICAvLyBmdXR1cmUgY2FsbHMgdG8gXCJTdGF0aWNSZWZsZWN0b3IjYW5ub3RhdGlvbnNcIiBhcmUgYmFzZWQgb24gbWV0YWRhdGEgZmlsZXMuXG4gICAgdGhpcy5zeW1ib2xSZXNvbHZlclsnX3Jlc29sdmVTeW1ib2xGcm9tU3VtbWFyeSddID0gKCkgPT4gbnVsbDtcbiAgICB0aGlzLnN5bWJvbFJlc29sdmVyWydyZXNvbHZlZFN5bWJvbHMnXS5jbGVhcigpO1xuICAgIHRoaXMuc3ltYm9sUmVzb2x2ZXJbJ3N5bWJvbEZyb21GaWxlJ10uY2xlYXIoKTtcbiAgICB0aGlzLmNvbXBpbGVyLnJlZmxlY3RvclsnYW5ub3RhdGlvbkNhY2hlJ10uY2xlYXIoKTtcblxuICAgIC8vIE9yaWdpbmFsIHN1bW1hcnkgcmVzb2x2ZXIgdXNlZCBieSB0aGUgQU9UIGNvbXBpbGVyLlxuICAgIGNvbnN0IHN1bW1hcnlSZXNvbHZlciA9IHRoaXMuc3ltYm9sUmVzb2x2ZXJbJ3N1bW1hcnlSZXNvbHZlciddO1xuXG4gICAgLy8gQWRkaXRpb25hbGx5IHdlIG5lZWQgdG8gZW5zdXJlIHRoYXQgbm8gZmlsZXMgYXJlIHRyZWF0ZWQgYXMgXCJsaWJyYXJ5XCIgZmlsZXMgd2hlblxuICAgIC8vIHJlc29sdmluZyBtZXRhZGF0YS4gVGhpcyBpcyBuZWNlc3NhcnkgYmVjYXVzZSBieSBkZWZhdWx0IHRoZSBzeW1ib2wgcmVzb2x2ZXIgZGlzY2FyZHNcbiAgICAvLyBjbGFzcyBtZXRhZGF0YSBmb3IgbGlicmFyeSBmaWxlcy4gU2VlIFwiU3RhdGljU3ltYm9sUmVzb2x2ZXIjY3JlYXRlUmVzb2x2ZWRTeW1ib2xcIi5cbiAgICAvLyBQYXRjaGluZyB0aGlzIGZ1bmN0aW9uICoqb25seSoqIGZvciB0aGUgc3RhdGljIHN5bWJvbCByZXNvbHZlciBlbnN1cmVzIHRoYXQgbWV0YWRhdGFcbiAgICAvLyBpcyBub3QgaW5jb3JyZWN0bHkgb21pdHRlZC4gTm90ZSB0aGF0IHdlIG9ubHkgd2FudCB0byBkbyB0aGlzIGZvciB0aGUgc3ltYm9sIHJlc29sdmVyXG4gICAgLy8gYmVjYXVzZSBvdGhlcndpc2Ugd2UgY291bGQgYnJlYWsgdGhlIHN1bW1hcnkgbG9hZGluZyBsb2dpYyB3aGljaCBpcyB1c2VkIHRvIGRldGVjdFxuICAgIC8vIGlmIGEgc3RhdGljIHN5bWJvbCBpcyBlaXRoZXIgYSBkaXJlY3RpdmUsIGNvbXBvbmVudCBvciBwaXBlIChzZWUgTWV0YWRhdGFSZXNvbHZlcikuXG4gICAgdGhpcy5zeW1ib2xSZXNvbHZlclsnc3VtbWFyeVJlc29sdmVyJ10gPSA8U3VtbWFyeVJlc29sdmVyPFN0YXRpY1N5bWJvbD4+e1xuICAgICAgZnJvbVN1bW1hcnlGaWxlTmFtZTogc3VtbWFyeVJlc29sdmVyLmZyb21TdW1tYXJ5RmlsZU5hbWUuYmluZChzdW1tYXJ5UmVzb2x2ZXIpLFxuICAgICAgYWRkU3VtbWFyeTogc3VtbWFyeVJlc29sdmVyLmFkZFN1bW1hcnkuYmluZChzdW1tYXJ5UmVzb2x2ZXIpLFxuICAgICAgZ2V0SW1wb3J0QXM6IHN1bW1hcnlSZXNvbHZlci5nZXRJbXBvcnRBcy5iaW5kKHN1bW1hcnlSZXNvbHZlciksXG4gICAgICBnZXRLbm93bk1vZHVsZU5hbWU6IHN1bW1hcnlSZXNvbHZlci5nZXRLbm93bk1vZHVsZU5hbWUuYmluZChzdW1tYXJ5UmVzb2x2ZXIpLFxuICAgICAgcmVzb2x2ZVN1bW1hcnk6IHN1bW1hcnlSZXNvbHZlci5yZXNvbHZlU3VtbWFyeS5iaW5kKHN1bW1hcnlSZXNvbHZlciksXG4gICAgICB0b1N1bW1hcnlGaWxlTmFtZTogc3VtbWFyeVJlc29sdmVyLnRvU3VtbWFyeUZpbGVOYW1lLmJpbmQoc3VtbWFyeVJlc29sdmVyKSxcbiAgICAgIGdldFN5bWJvbHNPZjogc3VtbWFyeVJlc29sdmVyLmdldFN5bWJvbHNPZi5iaW5kKHN1bW1hcnlSZXNvbHZlciksXG4gICAgICBpc0xpYnJhcnlGaWxlOiAoKSA9PiBmYWxzZSxcbiAgICB9O1xuICB9XG59XG4iXX0=
|
|
@@ -1,20 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* @license
|
|
3
|
-
* Copyright Google LLC All Rights Reserved.
|
|
4
|
-
*
|
|
5
|
-
* Use of this source code is governed by an MIT-style license that can be
|
|
6
|
-
* found in the LICENSE file at https://angular.io/license
|
|
7
|
-
*/
|
|
8
|
-
/// <amd-module name="@angular/core/schematics/migrations/undecorated-classes-with-di/update_recorder" />
|
|
9
|
-
import ts from 'typescript';
|
|
10
|
-
import { ImportManagerUpdateRecorder } from '../../utils/import_manager';
|
|
11
|
-
/**
|
|
12
|
-
* Update recorder interface that is used to transform source files in a non-colliding
|
|
13
|
-
* way. Also this indirection makes it possible to re-use transformation logic with
|
|
14
|
-
* different replacement tools (e.g. TSLint or CLI devkit).
|
|
15
|
-
*/
|
|
16
|
-
export interface UpdateRecorder extends ImportManagerUpdateRecorder {
|
|
17
|
-
addClassDecorator(node: ts.ClassDeclaration, text: string): void;
|
|
18
|
-
addClassComment(node: ts.ClassDeclaration, text: string): void;
|
|
19
|
-
commitUpdate(): void;
|
|
20
|
-
}
|
|
@@ -1,20 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* @license
|
|
3
|
-
* Copyright Google LLC All Rights Reserved.
|
|
4
|
-
*
|
|
5
|
-
* Use of this source code is governed by an MIT-style license that can be
|
|
6
|
-
* found in the LICENSE file at https://angular.io/license
|
|
7
|
-
*/
|
|
8
|
-
(function (factory) {
|
|
9
|
-
if (typeof module === "object" && typeof module.exports === "object") {
|
|
10
|
-
var v = factory(require, exports);
|
|
11
|
-
if (v !== undefined) module.exports = v;
|
|
12
|
-
}
|
|
13
|
-
else if (typeof define === "function" && define.amd) {
|
|
14
|
-
define("@angular/core/schematics/migrations/undecorated-classes-with-di/update_recorder", ["require", "exports"], factory);
|
|
15
|
-
}
|
|
16
|
-
})(function (require, exports) {
|
|
17
|
-
"use strict";
|
|
18
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
19
|
-
});
|
|
20
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXBkYXRlX3JlY29yZGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vcGFja2FnZXMvY29yZS9zY2hlbWF0aWNzL21pZ3JhdGlvbnMvdW5kZWNvcmF0ZWQtY2xhc3Nlcy13aXRoLWRpL3VwZGF0ZV9yZWNvcmRlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQTs7Ozs7O0dBTUciLCJzb3VyY2VzQ29udGVudCI6WyJcbi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCBHb29nbGUgTExDIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKlxuICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmVcbiAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2VcbiAqL1xuXG5pbXBvcnQgdHMgZnJvbSAndHlwZXNjcmlwdCc7XG5pbXBvcnQge0ltcG9ydE1hbmFnZXJVcGRhdGVSZWNvcmRlcn0gZnJvbSAnLi4vLi4vdXRpbHMvaW1wb3J0X21hbmFnZXInO1xuXG4vKipcbiAqIFVwZGF0ZSByZWNvcmRlciBpbnRlcmZhY2UgdGhhdCBpcyB1c2VkIHRvIHRyYW5zZm9ybSBzb3VyY2UgZmlsZXMgaW4gYSBub24tY29sbGlkaW5nXG4gKiB3YXkuIEFsc28gdGhpcyBpbmRpcmVjdGlvbiBtYWtlcyBpdCBwb3NzaWJsZSB0byByZS11c2UgdHJhbnNmb3JtYXRpb24gbG9naWMgd2l0aFxuICogZGlmZmVyZW50IHJlcGxhY2VtZW50IHRvb2xzIChlLmcuIFRTTGludCBvciBDTEkgZGV2a2l0KS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBVcGRhdGVSZWNvcmRlciBleHRlbmRzIEltcG9ydE1hbmFnZXJVcGRhdGVSZWNvcmRlciB7XG4gIGFkZENsYXNzRGVjb3JhdG9yKG5vZGU6IHRzLkNsYXNzRGVjbGFyYXRpb24sIHRleHQ6IHN0cmluZyk6IHZvaWQ7XG4gIGFkZENsYXNzQ29tbWVudChub2RlOiB0cy5DbGFzc0RlY2xhcmF0aW9uLCB0ZXh0OiBzdHJpbmcpOiB2b2lkO1xuICBjb21taXRVcGRhdGUoKTogdm9pZDtcbn1cbiJdfQ==
|
|
@@ -1,11 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* @license
|
|
3
|
-
* Copyright Google LLC All Rights Reserved.
|
|
4
|
-
*
|
|
5
|
-
* Use of this source code is governed by an MIT-style license that can be
|
|
6
|
-
* found in the LICENSE file at https://angular.io/license
|
|
7
|
-
*/
|
|
8
|
-
/// <amd-module name="@angular/core/schematics/migrations/wait-for-async" />
|
|
9
|
-
import { Rule } from '@angular-devkit/schematics';
|
|
10
|
-
/** Migration that switches from `async` to `waitForAsync`. */
|
|
11
|
-
export default function (): Rule;
|