@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.
Files changed (175) hide show
  1. package/core.d.ts +224 -221
  2. package/esm2020/index.mjs +6 -5
  3. package/esm2020/src/application_module.mjs +2 -7
  4. package/esm2020/src/core_render3_private_export.mjs +2 -1
  5. package/esm2020/src/linker/component_factory_resolver.mjs +5 -5
  6. package/esm2020/src/linker/ng_module_factory.mjs +1 -1
  7. package/esm2020/src/render3/definition.mjs +2 -5
  8. package/esm2020/src/render3/di.mjs +3 -3
  9. package/esm2020/src/render3/error_code.mjs +2 -5
  10. package/esm2020/src/render3/error_details_base_url.mjs +16 -0
  11. package/esm2020/src/render3/fields.mjs +1 -2
  12. package/esm2020/src/render3/ng_module_ref.mjs +2 -5
  13. package/esm2020/src/render3/util/global_utils.mjs +2 -3
  14. package/esm2020/src/version.mjs +1 -1
  15. package/esm2020/testing/src/logger.mjs +3 -3
  16. package/esm2020/testing/src/ng_zone_mock.mjs +3 -3
  17. package/esm2020/testing/src/test_compiler.mjs +3 -3
  18. package/fesm2015/core.mjs +26 -25
  19. package/fesm2015/core.mjs.map +1 -1
  20. package/fesm2015/testing.mjs +4 -4
  21. package/fesm2020/core.mjs +26 -25
  22. package/fesm2020/core.mjs.map +1 -1
  23. package/fesm2020/testing.mjs +4 -4
  24. package/package.json +1 -1
  25. package/schematics/migrations/router-link-empty-expression/index.js +2 -2
  26. package/schematics/migrations.json +0 -100
  27. package/schematics/utils/ng_component_template.d.ts +4 -1
  28. package/schematics/utils/ng_component_template.js +28 -14
  29. package/testing/testing.d.ts +1 -1
  30. package/schematics/migrations/abstract-control-parent/index.d.ts +0 -11
  31. package/schematics/migrations/abstract-control-parent/index.js +0 -69
  32. package/schematics/migrations/abstract-control-parent/util.d.ts +0 -14
  33. package/schematics/migrations/abstract-control-parent/util.js +0 -67
  34. package/schematics/migrations/activated-route-snapshot-fragment/index.d.ts +0 -13
  35. package/schematics/migrations/activated-route-snapshot-fragment/index.js +0 -73
  36. package/schematics/migrations/activated-route-snapshot-fragment/util.d.ts +0 -16
  37. package/schematics/migrations/activated-route-snapshot-fragment/util.js +0 -51
  38. package/schematics/migrations/can-activate-with-redirect-to/index.d.ts +0 -11
  39. package/schematics/migrations/can-activate-with-redirect-to/index.js +0 -69
  40. package/schematics/migrations/can-activate-with-redirect-to/util.d.ts +0 -11
  41. package/schematics/migrations/can-activate-with-redirect-to/util.js +0 -73
  42. package/schematics/migrations/deep-shadow-piercing-selector/index.d.ts +0 -10
  43. package/schematics/migrations/deep-shadow-piercing-selector/index.js +0 -49
  44. package/schematics/migrations/dynamic-queries/index.d.ts +0 -13
  45. package/schematics/migrations/dynamic-queries/index.js +0 -76
  46. package/schematics/migrations/dynamic-queries/util.d.ts +0 -25
  47. package/schematics/migrations/dynamic-queries/util.js +0 -84
  48. package/schematics/migrations/initial-navigation/collector.d.ts +0 -22
  49. package/schematics/migrations/initial-navigation/collector.js +0 -122
  50. package/schematics/migrations/initial-navigation/index.d.ts +0 -11
  51. package/schematics/migrations/initial-navigation/index.js +0 -83
  52. package/schematics/migrations/initial-navigation/transform.d.ts +0 -20
  53. package/schematics/migrations/initial-navigation/transform.js +0 -71
  54. package/schematics/migrations/initial-navigation/update_recorder.d.ts +0 -18
  55. package/schematics/migrations/initial-navigation/update_recorder.js +0 -20
  56. package/schematics/migrations/initial-navigation/util.d.ts +0 -12
  57. package/schematics/migrations/initial-navigation/util.js +0 -46
  58. package/schematics/migrations/missing-injectable/definition_collector.d.ts +0 -37
  59. package/schematics/migrations/missing-injectable/definition_collector.js +0 -92
  60. package/schematics/migrations/missing-injectable/index.d.ts +0 -11
  61. package/schematics/migrations/missing-injectable/index.js +0 -136
  62. package/schematics/migrations/missing-injectable/providers_evaluator.d.ts +0 -26
  63. package/schematics/migrations/missing-injectable/providers_evaluator.js +0 -71
  64. package/schematics/migrations/missing-injectable/transform.d.ts +0 -70
  65. package/schematics/migrations/missing-injectable/transform.js +0 -203
  66. package/schematics/migrations/missing-injectable/update_recorder.d.ts +0 -21
  67. package/schematics/migrations/missing-injectable/update_recorder.js +0 -20
  68. package/schematics/migrations/module-with-providers/collector.d.ts +0 -34
  69. package/schematics/migrations/module-with-providers/collector.js +0 -76
  70. package/schematics/migrations/module-with-providers/index.d.ts +0 -13
  71. package/schematics/migrations/module-with-providers/index.js +0 -107
  72. package/schematics/migrations/module-with-providers/transform.d.ts +0 -50
  73. package/schematics/migrations/module-with-providers/transform.js +0 -149
  74. package/schematics/migrations/module-with-providers/util.d.ts +0 -13
  75. package/schematics/migrations/module-with-providers/util.js +0 -43
  76. package/schematics/migrations/move-document/document_import_visitor.d.ts +0 -27
  77. package/schematics/migrations/move-document/document_import_visitor.js +0 -77
  78. package/schematics/migrations/move-document/index.d.ts +0 -11
  79. package/schematics/migrations/move-document/index.js +0 -93
  80. package/schematics/migrations/move-document/move-import.d.ts +0 -12
  81. package/schematics/migrations/move-document/move-import.js +0 -64
  82. package/schematics/migrations/native-view-encapsulation/index.d.ts +0 -11
  83. package/schematics/migrations/native-view-encapsulation/index.js +0 -63
  84. package/schematics/migrations/native-view-encapsulation/util.d.ts +0 -11
  85. package/schematics/migrations/native-view-encapsulation/util.js +0 -51
  86. package/schematics/migrations/navigation-extras-omissions/index.d.ts +0 -11
  87. package/schematics/migrations/navigation-extras-omissions/index.js +0 -72
  88. package/schematics/migrations/navigation-extras-omissions/util.d.ts +0 -11
  89. package/schematics/migrations/navigation-extras-omissions/util.js +0 -129
  90. package/schematics/migrations/relative-link-resolution/collector.d.ts +0 -22
  91. package/schematics/migrations/relative-link-resolution/collector.js +0 -98
  92. package/schematics/migrations/relative-link-resolution/index.d.ts +0 -11
  93. package/schematics/migrations/relative-link-resolution/index.js +0 -84
  94. package/schematics/migrations/relative-link-resolution/transform.d.ts +0 -22
  95. package/schematics/migrations/relative-link-resolution/transform.js +0 -68
  96. package/schematics/migrations/relative-link-resolution/update_recorder.d.ts +0 -18
  97. package/schematics/migrations/relative-link-resolution/update_recorder.js +0 -20
  98. package/schematics/migrations/relative-link-resolution/util.d.ts +0 -12
  99. package/schematics/migrations/relative-link-resolution/util.js +0 -46
  100. package/schematics/migrations/renderer-to-renderer2/helpers.d.ts +0 -25
  101. package/schematics/migrations/renderer-to-renderer2/helpers.js +0 -241
  102. package/schematics/migrations/renderer-to-renderer2/index.d.ts +0 -14
  103. package/schematics/migrations/renderer-to-renderer2/index.js +0 -138
  104. package/schematics/migrations/renderer-to-renderer2/migration.d.ts +0 -18
  105. package/schematics/migrations/renderer-to-renderer2/migration.js +0 -228
  106. package/schematics/migrations/renderer-to-renderer2/util.d.ts +0 -18
  107. package/schematics/migrations/renderer-to-renderer2/util.js +0 -86
  108. package/schematics/migrations/router-preserve-query-params/index.d.ts +0 -14
  109. package/schematics/migrations/router-preserve-query-params/index.js +0 -75
  110. package/schematics/migrations/router-preserve-query-params/util.d.ts +0 -11
  111. package/schematics/migrations/router-preserve-query-params/util.js +0 -106
  112. package/schematics/migrations/static-queries/angular/directive_inputs.d.ts +0 -11
  113. package/schematics/migrations/static-queries/angular/directive_inputs.js +0 -87
  114. package/schematics/migrations/static-queries/angular/ng_query_visitor.d.ts +0 -45
  115. package/schematics/migrations/static-queries/angular/ng_query_visitor.js +0 -130
  116. package/schematics/migrations/static-queries/angular/query-definition.d.ts +0 -37
  117. package/schematics/migrations/static-queries/angular/query-definition.js +0 -33
  118. package/schematics/migrations/static-queries/angular/super_class.d.ts +0 -15
  119. package/schematics/migrations/static-queries/angular/super_class.js +0 -35
  120. package/schematics/migrations/static-queries/index.d.ts +0 -11
  121. package/schematics/migrations/static-queries/index.js +0 -244
  122. package/schematics/migrations/static-queries/strategies/template_strategy/template_strategy.d.ts +0 -41
  123. package/schematics/migrations/static-queries/strategies/template_strategy/template_strategy.js +0 -210
  124. package/schematics/migrations/static-queries/strategies/test_strategy/test_strategy.d.ts +0 -24
  125. package/schematics/migrations/static-queries/strategies/test_strategy/test_strategy.js +0 -38
  126. package/schematics/migrations/static-queries/strategies/timing-strategy.d.ts +0 -19
  127. package/schematics/migrations/static-queries/strategies/timing-strategy.js +0 -20
  128. package/schematics/migrations/static-queries/strategies/usage_strategy/declaration_usage_visitor.d.ts +0 -82
  129. package/schematics/migrations/static-queries/strategies/usage_strategy/declaration_usage_visitor.js +0 -372
  130. package/schematics/migrations/static-queries/strategies/usage_strategy/super_class_context.d.ts +0 -18
  131. package/schematics/migrations/static-queries/strategies/usage_strategy/super_class_context.js +0 -55
  132. package/schematics/migrations/static-queries/strategies/usage_strategy/template_usage_visitor.d.ts +0 -27
  133. package/schematics/migrations/static-queries/strategies/usage_strategy/template_usage_visitor.js +0 -93
  134. package/schematics/migrations/static-queries/strategies/usage_strategy/usage_strategy.d.ts +0 -34
  135. package/schematics/migrations/static-queries/strategies/usage_strategy/usage_strategy.js +0 -172
  136. package/schematics/migrations/static-queries/transform.d.ts +0 -21
  137. package/schematics/migrations/static-queries/transform.js +0 -105
  138. package/schematics/migrations/template-var-assignment/analyze_template.d.ts +0 -20
  139. package/schematics/migrations/template-var-assignment/analyze_template.js +0 -38
  140. package/schematics/migrations/template-var-assignment/angular/html_variable_assignment_visitor.d.ts +0 -28
  141. package/schematics/migrations/template-var-assignment/angular/html_variable_assignment_visitor.js +0 -80
  142. package/schematics/migrations/template-var-assignment/index.d.ts +0 -11
  143. package/schematics/migrations/template-var-assignment/index.js +0 -101
  144. package/schematics/migrations/undecorated-classes-with-decorated-fields/index.d.ts +0 -14
  145. package/schematics/migrations/undecorated-classes-with-decorated-fields/index.js +0 -128
  146. package/schematics/migrations/undecorated-classes-with-decorated-fields/transform.d.ts +0 -64
  147. package/schematics/migrations/undecorated-classes-with-decorated-fields/transform.js +0 -302
  148. package/schematics/migrations/undecorated-classes-with-decorated-fields/update_recorder.d.ts +0 -19
  149. package/schematics/migrations/undecorated-classes-with-decorated-fields/update_recorder.js +0 -20
  150. package/schematics/migrations/undecorated-classes-with-di/create_ngc_program.d.ts +0 -18
  151. package/schematics/migrations/undecorated-classes-with-di/create_ngc_program.js +0 -56
  152. package/schematics/migrations/undecorated-classes-with-di/decorator_rewrite/convert_directive_metadata.d.ts +0 -18
  153. package/schematics/migrations/undecorated-classes-with-di/decorator_rewrite/convert_directive_metadata.js +0 -99
  154. package/schematics/migrations/undecorated-classes-with-di/decorator_rewrite/decorator_rewriter.d.ts +0 -37
  155. package/schematics/migrations/undecorated-classes-with-di/decorator_rewrite/decorator_rewriter.js +0 -118
  156. package/schematics/migrations/undecorated-classes-with-di/decorator_rewrite/import_rewrite_visitor.d.ts +0 -37
  157. package/schematics/migrations/undecorated-classes-with-di/decorator_rewrite/import_rewrite_visitor.js +0 -129
  158. package/schematics/migrations/undecorated-classes-with-di/decorator_rewrite/path_format.d.ts +0 -10
  159. package/schematics/migrations/undecorated-classes-with-di/decorator_rewrite/path_format.js +0 -31
  160. package/schematics/migrations/undecorated-classes-with-di/decorator_rewrite/source_file_exports.d.ts +0 -16
  161. package/schematics/migrations/undecorated-classes-with-di/decorator_rewrite/source_file_exports.js +0 -68
  162. package/schematics/migrations/undecorated-classes-with-di/index.d.ts +0 -11
  163. package/schematics/migrations/undecorated-classes-with-di/index.js +0 -226
  164. package/schematics/migrations/undecorated-classes-with-di/ng_declaration_collector.d.ts +0 -38
  165. package/schematics/migrations/undecorated-classes-with-di/ng_declaration_collector.js +0 -135
  166. package/schematics/migrations/undecorated-classes-with-di/transform.d.ts +0 -97
  167. package/schematics/migrations/undecorated-classes-with-di/transform.js +0 -373
  168. package/schematics/migrations/undecorated-classes-with-di/update_recorder.d.ts +0 -20
  169. package/schematics/migrations/undecorated-classes-with-di/update_recorder.js +0 -20
  170. package/schematics/migrations/wait-for-async/index.d.ts +0 -11
  171. package/schematics/migrations/wait-for-async/index.js +0 -101
  172. package/schematics/migrations/wait-for-async/util.d.ts +0 -11
  173. package/schematics/migrations/wait-for-async/util.js +0 -40
  174. package/schematics/migrations/xhr-factory/index.d.ts +0 -10
  175. package/schematics/migrations/xhr-factory/index.js +0 -107
@@ -1,302 +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 __importDefault = (this && this.__importDefault) || function (mod) {
9
- return (mod && mod.__esModule) ? mod : { "default": mod };
10
- };
11
- (function (factory) {
12
- if (typeof module === "object" && typeof module.exports === "object") {
13
- var v = factory(require, exports);
14
- if (v !== undefined) module.exports = v;
15
- }
16
- else if (typeof define === "function" && define.amd) {
17
- define("@angular/core/schematics/migrations/undecorated-classes-with-decorated-fields/transform", ["require", "exports", "typescript", "@angular/core/schematics/utils/import_manager", "@angular/core/schematics/utils/ng_decorators", "@angular/core/schematics/utils/typescript/find_base_classes", "@angular/core/schematics/utils/typescript/functions", "@angular/core/schematics/utils/typescript/property_name"], factory);
18
- }
19
- })(function (require, exports) {
20
- "use strict";
21
- Object.defineProperty(exports, "__esModule", { value: true });
22
- exports.UndecoratedClassesWithDecoratedFieldsTransform = void 0;
23
- const typescript_1 = __importDefault(require("typescript"));
24
- const import_manager_1 = require("@angular/core/schematics/utils/import_manager");
25
- const ng_decorators_1 = require("@angular/core/schematics/utils/ng_decorators");
26
- const find_base_classes_1 = require("@angular/core/schematics/utils/typescript/find_base_classes");
27
- const functions_1 = require("@angular/core/schematics/utils/typescript/functions");
28
- const property_name_1 = require("@angular/core/schematics/utils/typescript/property_name");
29
- /**
30
- * Set of known decorators that indicate that the current class needs a directive
31
- * definition. These decorators are always specific to directives.
32
- */
33
- const DIRECTIVE_FIELD_DECORATORS = new Set([
34
- 'Input', 'Output', 'ViewChild', 'ViewChildren', 'ContentChild', 'ContentChildren', 'HostBinding',
35
- 'HostListener'
36
- ]);
37
- /**
38
- * Set of known lifecycle hooks that indicate that the current class needs a directive
39
- * definition. These lifecycle hooks are always specific to directives.
40
- */
41
- const DIRECTIVE_LIFECYCLE_HOOKS = new Set([
42
- 'ngOnChanges', 'ngOnInit', 'ngDoCheck', 'ngAfterViewInit', 'ngAfterViewChecked',
43
- 'ngAfterContentInit', 'ngAfterContentChecked'
44
- ]);
45
- /**
46
- * Set of known lifecycle hooks that indicate that a given class uses Angular
47
- * features, but it's ambiguous whether it is a directive or service.
48
- */
49
- const AMBIGUOUS_LIFECYCLE_HOOKS = new Set(['ngOnDestroy']);
50
- /** Describes how a given class is used in the context of Angular. */
51
- var InferredKind;
52
- (function (InferredKind) {
53
- InferredKind[InferredKind["DIRECTIVE"] = 0] = "DIRECTIVE";
54
- InferredKind[InferredKind["AMBIGUOUS"] = 1] = "AMBIGUOUS";
55
- InferredKind[InferredKind["UNKNOWN"] = 2] = "UNKNOWN";
56
- })(InferredKind || (InferredKind = {}));
57
- /** Describes possible types of Angular declarations. */
58
- var DeclarationType;
59
- (function (DeclarationType) {
60
- DeclarationType[DeclarationType["DIRECTIVE"] = 0] = "DIRECTIVE";
61
- DeclarationType[DeclarationType["COMPONENT"] = 1] = "COMPONENT";
62
- DeclarationType[DeclarationType["ABSTRACT_DIRECTIVE"] = 2] = "ABSTRACT_DIRECTIVE";
63
- DeclarationType[DeclarationType["PIPE"] = 3] = "PIPE";
64
- DeclarationType[DeclarationType["INJECTABLE"] = 4] = "INJECTABLE";
65
- })(DeclarationType || (DeclarationType = {}));
66
- /** TODO message that is added to ambiguous classes using Angular features. */
67
- const AMBIGUOUS_CLASS_TODO = 'Add Angular decorator.';
68
- class UndecoratedClassesWithDecoratedFieldsTransform {
69
- constructor(typeChecker, getUpdateRecorder, compilerCliMigrationsModule) {
70
- this.typeChecker = typeChecker;
71
- this.getUpdateRecorder = getUpdateRecorder;
72
- this.compilerCliMigrationsModule = compilerCliMigrationsModule;
73
- this.printer = typescript_1.default.createPrinter();
74
- this.importManager = new import_manager_1.ImportManager(this.getUpdateRecorder, this.printer);
75
- this.reflectionHost = new this.compilerCliMigrationsModule.TypeScriptReflectionHost(this.typeChecker);
76
- this.partialEvaluator = new this.compilerCliMigrationsModule.PartialEvaluator(this.reflectionHost, this.typeChecker, null);
77
- }
78
- /**
79
- * Migrates the specified source files. The transform adds the abstract `@Directive`
80
- * decorator to undecorated classes that use Angular features. Class members which
81
- * are decorated with any Angular decorator, or class members for lifecycle hooks are
82
- * indicating that a given class uses Angular features. https://hackmd.io/vuQfavzfRG6KUCtU7oK_EA
83
- */
84
- migrate(sourceFiles) {
85
- const { detectedAbstractDirectives, ambiguousClasses } = this._findUndecoratedAbstractDirectives(sourceFiles);
86
- detectedAbstractDirectives.forEach(node => {
87
- const sourceFile = node.getSourceFile();
88
- const recorder = this.getUpdateRecorder(sourceFile);
89
- const directiveExpr = this.importManager.addImportToSourceFile(sourceFile, 'Directive', '@angular/core');
90
- const decoratorExpr = typescript_1.default.createDecorator(typescript_1.default.createCall(directiveExpr, undefined, undefined));
91
- recorder.addClassDecorator(node, this.printer.printNode(typescript_1.default.EmitHint.Unspecified, decoratorExpr, sourceFile));
92
- });
93
- // Ambiguous classes clearly use Angular features, but the migration is unable to
94
- // determine whether the class is used as directive, service or pipe. The migration
95
- // could potentially determine the type by checking NgModule definitions or inheritance
96
- // of other known declarations, but this is out of scope and a TODO/failure is sufficient.
97
- return Array.from(ambiguousClasses).reduce((failures, node) => {
98
- // If the class has been reported as ambiguous before, skip adding a TODO and
99
- // printing an error. A class could be visited multiple times when it's part
100
- // of multiple build targets in the CLI project.
101
- if (this._hasBeenReportedAsAmbiguous(node)) {
102
- return failures;
103
- }
104
- const sourceFile = node.getSourceFile();
105
- const recorder = this.getUpdateRecorder(sourceFile);
106
- // Add a TODO to the class that uses Angular features but is not decorated.
107
- recorder.addClassTodo(node, AMBIGUOUS_CLASS_TODO);
108
- // Add an error for the class that will be printed in the `ng update` output.
109
- return failures.concat({
110
- node,
111
- message: 'Class uses Angular features but cannot be migrated automatically. Please ' +
112
- 'add an appropriate Angular decorator.'
113
- });
114
- }, []);
115
- }
116
- /** Records all changes that were made in the import manager. */
117
- recordChanges() {
118
- this.importManager.recordChanges();
119
- }
120
- /**
121
- * Finds undecorated abstract directives in the specified source files. Also returns
122
- * a set of undecorated classes which could not be detected as guaranteed abstract
123
- * directives. Those are ambiguous and could be either Directive, Pipe or service.
124
- */
125
- _findUndecoratedAbstractDirectives(sourceFiles) {
126
- const ambiguousClasses = new Set();
127
- const declarations = new WeakMap();
128
- const detectedAbstractDirectives = new Set();
129
- const undecoratedClasses = new Set();
130
- const visitNode = (node) => {
131
- node.forEachChild(visitNode);
132
- if (!typescript_1.default.isClassDeclaration(node)) {
133
- return;
134
- }
135
- const { inferredKind, decoratedType } = this._analyzeClassDeclaration(node);
136
- if (decoratedType !== null) {
137
- declarations.set(node, decoratedType);
138
- return;
139
- }
140
- if (inferredKind === InferredKind.DIRECTIVE) {
141
- detectedAbstractDirectives.add(node);
142
- }
143
- else if (inferredKind === InferredKind.AMBIGUOUS) {
144
- ambiguousClasses.add(node);
145
- }
146
- else {
147
- undecoratedClasses.add(node);
148
- }
149
- };
150
- sourceFiles.forEach(sourceFile => sourceFile.forEachChild(visitNode));
151
- /**
152
- * Checks the inheritance of the given set of classes. It removes classes from the
153
- * detected abstract directives set when they inherit from a non-abstract Angular
154
- * declaration. e.g. an abstract directive can never extend from a component.
155
- *
156
- * If a class inherits from an abstract directive though, we will migrate them too
157
- * as derived classes also need to be decorated. This has been done for a simpler mental
158
- * model and reduced complexity in the Angular compiler. See migration plan document.
159
- */
160
- const checkInheritanceOfClasses = (classes) => {
161
- classes.forEach(node => {
162
- for (const { node: baseClass } of (0, find_base_classes_1.findBaseClassDeclarations)(node, this.typeChecker)) {
163
- if (!declarations.has(baseClass)) {
164
- continue;
165
- }
166
- // If the undecorated class inherits from an abstract directive, always migrate it.
167
- // Derived undecorated classes of abstract directives are always also considered
168
- // abstract directives and need to be decorated too. This is necessary as otherwise
169
- // the inheritance chain cannot be resolved by the Angular compiler. e.g. when it
170
- // flattens directive metadata for type checking. In the other case, we never want
171
- // to migrate a class if it extends from a non-abstract Angular declaration. That
172
- // is an unsupported pattern as of v9 and was previously handled with the
173
- // `undecorated-classes-with-di` migration (which copied the inherited decorator).
174
- if (declarations.get(baseClass) === DeclarationType.ABSTRACT_DIRECTIVE) {
175
- detectedAbstractDirectives.add(node);
176
- }
177
- else {
178
- detectedAbstractDirectives.delete(node);
179
- }
180
- ambiguousClasses.delete(node);
181
- break;
182
- }
183
- });
184
- };
185
- // Check inheritance of any detected abstract directive. We want to remove
186
- // classes that are not eligible abstract directives due to inheritance. i.e.
187
- // if a class extends from a component, it cannot be a derived abstract directive.
188
- checkInheritanceOfClasses(detectedAbstractDirectives);
189
- // Update the class declarations to reflect the detected abstract directives. This is
190
- // then used later when we check for undecorated classes that inherit from an abstract
191
- // directive and need to be decorated.
192
- detectedAbstractDirectives.forEach(n => declarations.set(n, DeclarationType.ABSTRACT_DIRECTIVE));
193
- // Check ambiguous and undecorated classes if they inherit from an abstract directive.
194
- // If they do, we want to migrate them too. See function definition for more details.
195
- checkInheritanceOfClasses(ambiguousClasses);
196
- checkInheritanceOfClasses(undecoratedClasses);
197
- return { detectedAbstractDirectives, ambiguousClasses };
198
- }
199
- /**
200
- * Analyzes the given class declaration by determining whether the class
201
- * is a directive, is an abstract directive, or uses Angular features.
202
- */
203
- _analyzeClassDeclaration(node) {
204
- const ngDecorators = node.decorators && (0, ng_decorators_1.getAngularDecorators)(this.typeChecker, node.decorators);
205
- const inferredKind = this._determineClassKind(node);
206
- if (ngDecorators === undefined || ngDecorators.length === 0) {
207
- return { decoratedType: null, inferredKind };
208
- }
209
- const directiveDecorator = ngDecorators.find(({ name }) => name === 'Directive');
210
- const componentDecorator = ngDecorators.find(({ name }) => name === 'Component');
211
- const pipeDecorator = ngDecorators.find(({ name }) => name === 'Pipe');
212
- const injectableDecorator = ngDecorators.find(({ name }) => name === 'Injectable');
213
- const isAbstractDirective = directiveDecorator !== undefined && this._isAbstractDirective(directiveDecorator);
214
- let decoratedType = null;
215
- if (isAbstractDirective) {
216
- decoratedType = DeclarationType.ABSTRACT_DIRECTIVE;
217
- }
218
- else if (componentDecorator !== undefined) {
219
- decoratedType = DeclarationType.COMPONENT;
220
- }
221
- else if (directiveDecorator !== undefined) {
222
- decoratedType = DeclarationType.DIRECTIVE;
223
- }
224
- else if (pipeDecorator !== undefined) {
225
- decoratedType = DeclarationType.PIPE;
226
- }
227
- else if (injectableDecorator !== undefined) {
228
- decoratedType = DeclarationType.INJECTABLE;
229
- }
230
- return { decoratedType, inferredKind };
231
- }
232
- /**
233
- * Checks whether the given decorator resolves to an abstract directive. An directive is
234
- * considered "abstract" if there is no selector specified.
235
- */
236
- _isAbstractDirective({ node }) {
237
- const metadataArgs = node.expression.arguments;
238
- if (metadataArgs.length === 0) {
239
- return true;
240
- }
241
- const metadataExpr = (0, functions_1.unwrapExpression)(metadataArgs[0]);
242
- if (!typescript_1.default.isObjectLiteralExpression(metadataExpr)) {
243
- return false;
244
- }
245
- const metadata = this.compilerCliMigrationsModule.reflectObjectLiteral(metadataExpr);
246
- if (!metadata.has('selector')) {
247
- return false;
248
- }
249
- const selector = this.partialEvaluator.evaluate(metadata.get('selector'));
250
- return selector == null;
251
- }
252
- /**
253
- * Determines the kind of a given class in terms of Angular. The method checks
254
- * whether the given class has members that indicate the use of Angular features.
255
- * e.g. lifecycle hooks or decorated members like `@Input` or `@Output` are
256
- * considered Angular features..
257
- */
258
- _determineClassKind(node) {
259
- let usage = InferredKind.UNKNOWN;
260
- for (const member of node.members) {
261
- const propertyName = member.name !== undefined ? (0, property_name_1.getPropertyNameText)(member.name) : null;
262
- // If the class declares any of the known directive lifecycle hooks, we can
263
- // immediately exit the loop as the class is guaranteed to be a directive.
264
- if (propertyName !== null && DIRECTIVE_LIFECYCLE_HOOKS.has(propertyName)) {
265
- return InferredKind.DIRECTIVE;
266
- }
267
- const ngDecorators = member.decorators !== undefined ?
268
- (0, ng_decorators_1.getAngularDecorators)(this.typeChecker, member.decorators) :
269
- [];
270
- for (const { name } of ngDecorators) {
271
- if (DIRECTIVE_FIELD_DECORATORS.has(name)) {
272
- return InferredKind.DIRECTIVE;
273
- }
274
- }
275
- // If the class declares any of the lifecycle hooks that do not guarantee that
276
- // the given class is a directive, update the kind and continue looking for other
277
- // members that would unveil a more specific kind (i.e. being a directive).
278
- if (propertyName !== null && AMBIGUOUS_LIFECYCLE_HOOKS.has(propertyName)) {
279
- usage = InferredKind.AMBIGUOUS;
280
- }
281
- }
282
- return usage;
283
- }
284
- /**
285
- * Checks whether a given class has been reported as ambiguous in previous
286
- * migration run. e.g. when build targets are migrated first, and then test
287
- * targets that have an overlap with build source files, the same class
288
- * could be detected as ambiguous.
289
- */
290
- _hasBeenReportedAsAmbiguous(node) {
291
- const sourceFile = node.getSourceFile();
292
- const leadingComments = typescript_1.default.getLeadingCommentRanges(sourceFile.text, node.pos);
293
- if (leadingComments === undefined) {
294
- return false;
295
- }
296
- return leadingComments.some(({ kind, pos, end }) => kind === typescript_1.default.SyntaxKind.SingleLineCommentTrivia &&
297
- sourceFile.text.substring(pos, end).includes(`TODO: ${AMBIGUOUS_CLASS_TODO}`));
298
- }
299
- }
300
- exports.UndecoratedClassesWithDecoratedFieldsTransform = UndecoratedClassesWithDecoratedFieldsTransform;
301
- });
302
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhbnNmb3JtLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vcGFja2FnZXMvY29yZS9zY2hlbWF0aWNzL21pZ3JhdGlvbnMvdW5kZWNvcmF0ZWQtY2xhc3Nlcy13aXRoLWRlY29yYXRlZC1maWVsZHMvdHJhbnNmb3JtLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7R0FNRzs7Ozs7Ozs7Ozs7Ozs7OztJQUVILDREQUE0QjtJQUU1QixrRkFBeUQ7SUFDekQsZ0ZBQTRFO0lBQzVFLG1HQUFtRjtJQUNuRixtRkFBa0U7SUFDbEUsMkZBQXlFO0lBSXpFOzs7T0FHRztJQUNILE1BQU0sMEJBQTBCLEdBQUcsSUFBSSxHQUFHLENBQUM7UUFDekMsT0FBTyxFQUFFLFFBQVEsRUFBRSxXQUFXLEVBQUUsY0FBYyxFQUFFLGNBQWMsRUFBRSxpQkFBaUIsRUFBRSxhQUFhO1FBQ2hHLGNBQWM7S0FDZixDQUFDLENBQUM7SUFFSDs7O09BR0c7SUFDSCxNQUFNLHlCQUF5QixHQUFHLElBQUksR0FBRyxDQUFDO1FBQ3hDLGFBQWEsRUFBRSxVQUFVLEVBQUUsV0FBVyxFQUFFLGlCQUFpQixFQUFFLG9CQUFvQjtRQUMvRSxvQkFBb0IsRUFBRSx1QkFBdUI7S0FDOUMsQ0FBQyxDQUFDO0lBRUg7OztPQUdHO0lBQ0gsTUFBTSx5QkFBeUIsR0FBRyxJQUFJLEdBQUcsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUM7SUFFM0QscUVBQXFFO0lBQ3JFLElBQUssWUFJSjtJQUpELFdBQUssWUFBWTtRQUNmLHlEQUFTLENBQUE7UUFDVCx5REFBUyxDQUFBO1FBQ1QscURBQU8sQ0FBQTtJQUNULENBQUMsRUFKSSxZQUFZLEtBQVosWUFBWSxRQUloQjtJQUVELHdEQUF3RDtJQUN4RCxJQUFLLGVBTUo7SUFORCxXQUFLLGVBQWU7UUFDbEIsK0RBQVMsQ0FBQTtRQUNULCtEQUFTLENBQUE7UUFDVCxpRkFBa0IsQ0FBQTtR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QUMvQjtpQkFDRjtnQkFFRCw4RUFBOEU7Z0JBQzlFLGlGQUFpRjtnQkFDakYsMkVBQTJFO2dCQUMzRSxJQUFJLFlBQVksS0FBSyxJQUFJLElBQUkseUJBQXlCLENBQUMsR0FBRyxDQUFDLFlBQVksQ0FBQyxFQUFFO29CQUN4RSxLQUFLLEdBQUcsWUFBWSxDQUFDLFNBQVMsQ0FBQztpQkFDaEM7YUFDRjtZQUVELE9BQU8sS0FBSyxDQUFDO1FBQ2YsQ0FBQztRQUVEOzs7OztXQUtHO1FBQ0ssMkJBQTJCLENBQUMsSUFBeUI7WUFDM0QsTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO1lBQ3hDLE1BQU0sZUFBZSxHQUFHLG9CQUFFLENBQUMsdUJBQXVCLENBQUMsVUFBVSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDOUUsSUFBSSxlQUFlLEtBQUssU0FBUyxFQUFFO2dCQUNqQyxPQUFPLEtBQUssQ0FBQzthQUNkO1lBQ0QsT0FBTyxlQUFlLENBQUMsSUFBSSxDQUN2QixDQUFDLEVBQUMsSUFBSSxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUMsRUFBRSxFQUFFLENBQUMsSUFBSSxLQUFLLG9CQUFFLENBQUMsVUFBVSxDQUFDLHVCQUF1QjtnQkFDaEUsVUFBVSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxTQUFTLG9CQUFvQixFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQ3pGLENBQUM7S0FDRjtJQWxRRCx3R0FrUUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgR29vZ2xlIExMQyBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICpcbiAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlXG4gKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlXG4gKi9cblxuaW1wb3J0IHRzIGZyb20gJ3R5cGVzY3JpcHQnO1xuXG5pbXBvcnQge0ltcG9ydE1hbmFnZXJ9IGZyb20gJy4uLy4uL3V0aWxzL2ltcG9ydF9tYW5hZ2VyJztcbmltcG9ydCB7Z2V0QW5ndWxhckRlY29yYXRvcnMsIE5nRGVjb3JhdG9yfSBmcm9tICcuLi8uLi91dGlscy9uZ19kZWNvcmF0b3JzJztcbmltcG9ydCB7ZmluZEJhc2VDbGFzc0RlY2xhcmF0aW9uc30gZnJvbSAnLi4vLi4vdXRpbHMvdHlwZXNjcmlwdC9maW5kX2Jhc2VfY2xhc3Nlcyc7XG5pbXBvcnQge3Vud3JhcEV4cHJlc3Npb259IGZyb20gJy4uLy4uL3V0aWxzL3R5cGVzY3JpcHQvZnVuY3Rpb25zJztcbmltcG9ydCB7Z2V0UHJvcGVydHlOYW1lVGV4dH0gZnJvbSAnLi4vLi4vdXRpbHMvdHlwZXNjcmlwdC9wcm9wZXJ0eV9uYW1lJztcblxuaW1wb3J0IHtVcGRhdGVSZWNvcmRlcn0gZnJvbSAnLi91cGRhdGVfcmVjb3JkZXInO1xuXG4vKipcbiAqIFNldCBvZiBrbm93biBkZWNvcmF0b3JzIHRoYXQgaW5kaWNhdGUgdGhhdCB0aGUgY3VycmVudCBjbGFzcyBuZWVkcyBhIGRpcmVjdGl2ZVxuICogZGVmaW5pdGlvbi4gVGhlc2UgZGVjb3JhdG9ycyBhcmUgYWx3YXlzIHNwZWNpZmljIHRvIGRpcmVjdGl2ZXMuXG4gKi9cbmNvbnN0IERJUkVDVElWRV9GSUVMRF9ERUNPUkFUT1JTID0gbmV3IFNldChbXG4gICdJbnB1dCcsICdPdXRwdXQnLCAnVmlld0NoaWxkJywgJ1ZpZXdDaGlsZHJlbicsICdDb250ZW50Q2hpbGQnLCAnQ29udGVudENoaWxkcmVuJywgJ0hvc3RCaW5kaW5nJyxcbiAgJ0hvc3RMaXN0ZW5lcidcbl0pO1xuXG4vKipcbiAqIFNldCBvZiBrbm93biBsaWZlY3ljbGUgaG9va3MgdGhhdCBpbmRpY2F0ZSB0aGF0IHRoZSBjdXJyZW50IGNsYXNzIG5lZWRzIGEgZGlyZWN0aXZlXG4gKiBkZWZpbml0aW9uLiBUaGVzZSBsaWZlY3ljbGUgaG9va3MgYXJlIGFsd2F5cyBzcGVjaWZpYyB0byBkaXJlY3RpdmVzLlxuICovXG5jb25zdCBESVJFQ1RJVkVfTElGRUNZQ0xFX0hPT0tTID0gbmV3IFNldChbXG4gICduZ09uQ2hhbmdlcycsICduZ09uSW5pdCcsICduZ0RvQ2hlY2snLCAnbmdBZnRlclZpZXdJbml0JywgJ25nQWZ0ZXJWaWV3Q2hlY2tlZCcsXG4gICduZ0FmdGVyQ29udGVudEluaXQnLCAnbmdBZnRlckNvbnRlbnRDaGVja2VkJ1xuXSk7XG5cbi8qKlxuICogU2V0IG9mIGtub3duIGxpZmVjeWNsZSBob29rcyB0aGF0IGluZGljYXRlIHRoYXQgYSBnaXZlbiBjbGFzcyB1c2VzIEFuZ3VsYXJcbiAqIGZlYXR1cmVzLCBidXQgaXQncyBhbWJpZ3VvdXMgd2hldGhlciBpdCBpcyBhIGRpcmVjdGl2ZSBvciBzZXJ2aWNlLlxuICovXG5jb25zdCBBTUJJR1VPVVNfTElGRUNZQ0xFX0hPT0tTID0gbmV3IFNldChbJ25nT25EZXN0cm95J10pO1xuXG4vKiogRGVzY3JpYmVzIGhvdyBhIGdpdmVuIGNsYXNzIGlzIHVzZWQgaW4gdGhlIGNvbnRleHQgb2YgQW5ndWxhci4gKi9cbmVudW0gSW5mZXJyZWRLaW5kIHtcbiAgRElSRUNUSVZFLFxuICBBTUJJR1VPVVMsXG4gIFVOS05PV04sXG59XG5cbi8qKiBEZXNjcmliZXMgcG9zc2libGUgdHlwZXMgb2YgQW5ndWxhciBkZWNsYXJhdGlvbnMuICovXG5lbnVtIERlY2xhcmF0aW9uVHlwZSB7XG4gIERJUkVDVElWRSxcbiAgQ09NUE9ORU5ULFxuICBBQlNUUkFDVF9ESVJFQ1RJVkUsXG4gIFBJUEUsXG4gIElOSkVDVEFCTEUsXG59XG5cbi8qKiBBbmFseXplZCBjbGFzcyBkZWNsYXJhdGlvbi4gKi9cbmludGVyZmFjZSBBbmFseXplZENsYXNzIHtcbiAgLyoqIFR5cGUgb2YgZGVjbGFyYXRpb24gdGhhdCBpcyBkZXRlcm1pbmVkIHRocm91Z2ggYW4gYXBwbGllZCBkZWNvcmF0b3IuICovXG4gIGRlY29yYXRlZFR5cGU6IERlY2xhcmF0aW9uVHlwZXxudWxsO1xuICAvKiogSW5mZXJyZWQgY2xhc3Mga2luZCBpbiB0ZXJtcyBvZiBBbmd1bGFyLiAqL1xuICBpbmZlcnJlZEtpbmQ6IEluZmVycmVkS2luZDtcbn1cblxuaW50ZXJmYWNlIEFuYWx5c2lzRmFpbHVyZSB7XG4gIG5vZGU6IHRzLk5vZGU7XG4gIG1lc3NhZ2U6IHN0cmluZztcbn1cblxuLyoqIFRPRE8gbWVzc2FnZSB0aGF0IGlzIGFkZGVkIHRvIGFtYmlndW91cyBjbGFzc2VzIHVzaW5nIEFuZ3VsYXIgZmVhdHVyZXMuICovXG5jb25zdCBBTUJJR1VPVVNfQ0xBU1NfVE9ETyA9ICdBZGQgQW5ndWxhciBkZWNvcmF0b3IuJztcblxuZXhwb3J0IGNsYXNzIFVuZGVjb3JhdGVkQ2xhc3Nlc1dpdGhEZWNvcmF0ZWRGaWVsZHNUcmFuc2Zvcm0ge1xuICBwcml2YXRlIHByaW50ZXIgPSB0cy5jcmVhdGVQcmludGVyKCk7XG4gIHByaXZhdGUgaW1wb3J0TWFuYWdlciA9IG5ldyBJbXBvcnRNYW5hZ2VyKHRoaXMuZ2V0VXBkYXRlUmVjb3JkZXIsIHRoaXMucHJpbnRlcik7XG4gIHByaXZhdGUgcmVmbGVjdGlvbkhvc3QgPVxuICAgICAgbmV3IHRoaXMuY29tcGlsZXJDbGlNaWdyYXRpb25zTW9kdWxlLlR5cGVTY3JpcHRSZWZsZWN0aW9uSG9zdCh0aGlzLnR5cGVDaGVja2VyKTtcbiAgcHJpdmF0ZSBwYXJ0aWFsRXZhbHVhdG9yID0gbmV3IHRoaXMuY29tcGlsZXJDbGlNaWdyYXRpb25zTW9kdWxlLlBhcnRpYWxFdmFsdWF0b3IoXG4gICAgICB0aGlzLnJlZmxlY3Rpb25Ib3N0LCB0aGlzLnR5cGVDaGVja2VyLCBudWxsKTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICAgIHByaXZhdGUgdHlwZUNoZWNrZXI6IHRzLlR5cGVDaGVja2VyLFxuICAgICAgcHJpdmF0ZSBnZXRVcGRhdGVSZWNvcmRlcjogKHNmOiB0cy5Tb3VyY2VGaWxlKSA9PiBVcGRhdGVSZWNvcmRlcixcbiAgICAgIHByaXZhdGUgY29tcGlsZXJDbGlNaWdyYXRpb25zTW9kdWxlOlxuICAgICAgICAgIHR5cGVvZiBpbXBvcnQoJ0Bhbmd1bGFyL2NvbXBpbGVyLWNsaS9wcml2YXRlL21pZ3JhdGlvbnMnKSkge31cblxuICAvKipcbiAgICogTWlncmF0ZXMgdGhlIHNwZWNpZmllZCBzb3VyY2UgZmlsZXMuIFRoZSB0cmFuc2Zvcm0gYWRkcyB0aGUgYWJzdHJhY3QgYEBEaXJlY3RpdmVgXG4gICAqIGRlY29yYXRvciB0byB1bmRlY29yYXRlZCBjbGFzc2VzIHRoYXQgdXNlIEFuZ3VsYXIgZmVhdHVyZXMuIENsYXNzIG1lbWJlcnMgd2hpY2hcbiAgICogYXJlIGRlY29yYXRlZCB3aXRoIGFueSBBbmd1bGFyIGRlY29yYXRvciwgb3IgY2xhc3MgbWVtYmVycyBmb3IgbGlmZWN5Y2xlIGhvb2tzIGFyZVxuICAgKiBpbmRpY2F0aW5nIHRoYXQgYSBnaXZlbiBjbGFzcyB1c2VzIEFuZ3VsYXIgZmVhdHVyZXMuIGh0dHBzOi8vaGFja21kLmlvL3Z1UWZhdnpmUkc2S1VDdFU3b0tfRUFcbiAgICovXG4gIG1pZ3JhdGUoc291cmNlRmlsZXM6IHRzLlNvdXJjZUZpbGVbXSk6IEFuYWx5c2lzRmFpbHVyZVtdIHtcbiAgICBjb25zdCB7ZGV0ZWN0ZWRBYnN0cmFjdERpcmVjdGl2ZXMsIGFtYmlndW91c0NsYXNzZXN9ID1cbiAgICAgICAgdGhpcy5fZmluZFVuZGVjb3JhdGVkQWJzdHJhY3REaXJlY3RpdmVzKHNvdXJjZUZpbGVzKTtcblxuICAgIGRldGVjdGVkQWJzdHJhY3REaXJlY3RpdmVzLmZvckVhY2gobm9kZSA9PiB7XG4gICAgICBjb25zdCBzb3VyY2VGaWxlID0gbm9kZS5nZXRTb3VyY2VGaWxlKCk7XG4gICAgICBjb25zdCByZWNvcmRlciA9IHRoaXMuZ2V0VXBkYXRlUmVjb3JkZXIoc291cmNlRmlsZSk7XG4gICAgICBjb25zdCBkaXJlY3RpdmVFeHByID1cbiAgICAgICAgICB0aGlzLmltcG9ydE1hbmFnZXIuYWRkSW1wb3J0VG9Tb3VyY2VGaWxlKHNvdXJjZUZpbGUsICdEaXJlY3RpdmUnLCAnQGFuZ3VsYXIvY29yZScpO1xuICAgICAgY29uc3QgZGVjb3JhdG9yRXhwciA9IHRzLmNyZWF0ZURlY29yYXRvcih0cy5jcmVhdGVDYWxsKGRpcmVjdGl2ZUV4cHIsIHVuZGVmaW5lZCwgdW5kZWZpbmVkKSk7XG4gICAgICByZWNvcmRlci5hZGRDbGFzc0RlY29yYXRvcihcbiAgICAgICAgICBub2RlLCB0aGlzLnByaW50ZXIucHJpbnROb2RlKHRzLkVtaXRIaW50LlVuc3BlY2lmaWVkLCBkZWNvcmF0b3JFeHByLCBzb3VyY2VGaWxlKSk7XG4gICAgfSk7XG5cbiAgICAvLyBBbWJpZ3VvdXMgY2xhc3NlcyBjbGVhcmx5IHVzZSBBbmd1bGFyIGZlYXR1cmVzLCBidXQgdGhlIG1pZ3JhdGlvbiBpcyB1bmFibGUgdG9cbiAgICAvLyBkZXRlcm1pbmUgd2hldGhlciB0aGUgY2xhc3MgaXMgdXNlZCBhcyBkaXJlY3RpdmUsIHNlcnZpY2Ugb3IgcGlwZS4gVGhlIG1pZ3JhdGlvblxuICAgIC8vIGNvdWxkIHBvdGVudGlhbGx5IGRldGVybWluZSB0aGUgdHlwZSBieSBjaGVja2luZyBOZ01vZHVsZSBkZWZpbml0aW9ucyBvciBpbmhlcml0YW5jZVxuICAgIC8vIG9mIG90aGVyIGtub3duIGRlY2xhcmF0aW9ucywgYnV0IHRoaXMgaXMgb3V0IG9mIHNjb3BlIGFuZCBhIFRPRE8vZmFpbHVyZSBpcyBzdWZmaWNpZW50LlxuICAgIHJldHVybiBBcnJheS5mcm9tKGFtYmlndW91c0NsYXNzZXMpLnJlZHVjZSgoZmFpbHVyZXMsIG5vZGUpID0+IHtcbiAgICAgIC8vIElmIHRoZSBjbGFzcyBoYXMgYmVlbiByZXBvcnRlZCBhcyBhbWJpZ3VvdXMgYmVmb3JlLCBza2lwIGFkZGluZyBhIFRPRE8gYW5kXG4gICAgICAvLyBwcmludGluZyBhbiBlcnJvci4gQSBjbGFzcyBjb3VsZCBiZSB2aXNpdGVkIG11bHRpcGxlIHRpbWVzIHdoZW4gaXQncyBwYXJ0XG4gICAgICAvLyBvZiBtdWx0aXBsZSBidWlsZCB0YXJnZXRzIGluIHRoZSBDTEkgcHJvamVjdC5cbiAgICAgIGlmICh0aGlzLl9oYXNCZWVuUmVwb3J0ZWRBc0FtYmlndW91cyhub2RlKSkge1xuICAgICAgICByZXR1cm4gZmFpbHVyZXM7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHNvdXJjZUZpbGUgPSBub2RlLmdldFNvdXJjZUZpbGUoKTtcbiAgICAgIGNvbnN0IHJlY29yZGVyID0gdGhpcy5nZXRVcGRhdGVSZWNvcmRlcihzb3VyY2VGaWxlKTtcblxuICAgICAgLy8gQWRkIGEgVE9ETyB0byB0aGUgY2xhc3MgdGhhdCB1c2VzIEFuZ3VsYXIgZmVhdHVyZXMgYnV0IGlzIG5vdCBkZWNvcmF0ZWQuXG4gICAgICByZWNvcmRlci5hZGRDbGFzc1RvZG8obm9kZSwgQU1CSUdVT1VTX0NMQVNTX1RPRE8pO1xuXG4gICAgICAvLyBBZGQgYW4gZXJyb3IgZm9yIHRoZSBjbGFzcyB0aGF0IHdpbGwgYmUgcHJpbnRlZCBpbiB0aGUgYG5nIHVwZGF0ZWAgb3V0cHV0LlxuICAgICAgcmV0dXJuIGZhaWx1cmVzLmNvbmNhdCh7XG4gICAgICAgIG5vZGUsXG4gICAgICAgIG1lc3NhZ2U6ICdDbGFzcyB1c2VzIEFuZ3VsYXIgZmVhdHVyZXMgYnV0IGNhbm5vdCBiZSBtaWdyYXRlZCBhdXRvbWF0aWNhbGx5LiBQbGVhc2UgJyArXG4gICAgICAgICAgICAnYWRkIGFuIGFwcHJvcHJpYXRlIEFuZ3VsYXIgZGVjb3JhdG9yLidcbiAgICAgIH0pO1xuICAgIH0sIFtdIGFzIEFuYWx5c2lzRmFpbHVyZVtdKTtcbiAgfVxuXG4gIC8qKiBSZWNvcmRzIGFsbCBjaGFuZ2VzIHRoYXQgd2VyZSBtYWRlIGluIHRoZSBpbXBvcnQgbWFuYWdlci4gKi9cbiAgcmVjb3JkQ2hhbmdlcygpIHtcbiAgICB0aGlzLmltcG9ydE1hbmFnZXIucmVjb3JkQ2hhbmdlcygpO1xuICB9XG5cbiAgLyoqXG4gICAqIEZpbmRzIHVuZGVjb3JhdGVkIGFic3RyYWN0IGRpcmVjdGl2ZXMgaW4gdGhlIHNwZWNpZmllZCBzb3VyY2UgZmlsZXMuIEFsc28gcmV0dXJuc1xuICAgKiBhIHNldCBvZiB1bmRlY29yYXRlZCBjbGFzc2VzIHdoaWNoIGNvdWxkIG5vdCBiZSBkZXRlY3RlZCBhcyBndWFyYW50ZWVkIGFic3RyYWN0XG4gICAqIGRpcmVjdGl2ZXMuIFRob3NlIGFyZSBhbWJpZ3VvdXMgYW5kIGNvdWxkIGJlIGVpdGhlciBEaXJlY3RpdmUsIFBpcGUgb3Igc2VydmljZS5cbiAgICovXG4gIHByaXZhdGUgX2ZpbmRVbmRlY29yYXRlZEFic3RyYWN0RGlyZWN0aXZlcyhzb3VyY2VGaWxlczogdHMuU291cmNlRmlsZVtdKSB7XG4gICAgY29uc3QgYW1iaWd1b3VzQ2xhc3NlcyA9IG5ldyBTZXQ8dHMuQ2xhc3NEZWNsYXJhdGlvbj4oKTtcbiAgICBjb25zdCBkZWNsYXJhdGlvbnMgPSBuZXcgV2Vha01hcDx0cy5DbGFzc0RlY2xhcmF0aW9uLCBEZWNsYXJhdGlvblR5cGU+KCk7XG4gICAgY29uc3QgZGV0ZWN0ZWRBYnN0cmFjdERpcmVjdGl2ZXMgPSBuZXcgU2V0PHRzLkNsYXNzRGVjbGFyYXRpb24+KCk7XG4gICAgY29uc3QgdW5kZWNvcmF0ZWRDbGFzc2VzID0gbmV3IFNldDx0cy5DbGFzc0RlY2xhcmF0aW9uPigpO1xuXG4gICAgY29uc3QgdmlzaXROb2RlID0gKG5vZGU6IHRzLk5vZGUpID0+IHtcbiAgICAgIG5vZGUuZm9yRWFjaENoaWxkKHZpc2l0Tm9kZSk7XG4gICAgICBpZiAoIXRzLmlzQ2xhc3NEZWNsYXJhdGlvbihub2RlKSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBjb25zdCB7aW5mZXJyZWRLaW5kLCBkZWNvcmF0ZWRUeXBlfSA9IHRoaXMuX2FuYWx5emVDbGFzc0RlY2xhcmF0aW9uKG5vZGUpO1xuXG4gICAgICBpZiAoZGVjb3JhdGVkVHlwZSAhPT0gbnVsbCkge1xuICAgICAgICBkZWNsYXJhdGlvbnMuc2V0KG5vZGUsIGRlY29yYXRlZFR5cGUpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGlmIChpbmZlcnJlZEtpbmQgPT09IEluZmVycmVkS2luZC5ESVJFQ1RJVkUpIHtcbiAgICAgICAgZGV0ZWN0ZWRBYnN0cmFjdERpcmVjdGl2ZXMuYWRkKG5vZGUpO1xuICAgICAgfSBlbHNlIGlmIChpbmZlcnJlZEtpbmQgPT09IEluZmVycmVkS2luZC5BTUJJR1VPVVMpIHtcbiAgICAgICAgYW1iaWd1b3VzQ2xhc3Nlcy5hZGQobm9kZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB1bmRlY29yYXRlZENsYXNzZXMuYWRkKG5vZGUpO1xuICAgICAgfVxuICAgIH07XG5cbiAgICBzb3VyY2VGaWxlcy5mb3JFYWNoKHNvdXJjZUZpbGUgPT4gc291cmNlRmlsZS5mb3JFYWNoQ2hpbGQodmlzaXROb2RlKSk7XG5cbiAgICAvKipcbiAgICAgKiBDaGVja3MgdGhlIGluaGVyaXRhbmNlIG9mIHRoZSBnaXZlbiBzZXQgb2YgY2xhc3Nlcy4gSXQgcmVtb3ZlcyBjbGFzc2VzIGZyb20gdGhlXG4gICAgICogZGV0ZWN0ZWQgYWJzdHJhY3QgZGlyZWN0aXZlcyBzZXQgd2hlbiB0aGV5IGluaGVyaXQgZnJvbSBhIG5vbi1hYnN0cmFjdCBBbmd1bGFyXG4gICAgICogZGVjbGFyYXRpb24uIGUuZy4gYW4gYWJzdHJhY3QgZGlyZWN0aXZlIGNhbiBuZXZlciBleHRlbmQgZnJvbSBhIGNvbXBvbmVudC5cbiAgICAgKlxuICAgICAqIElmIGEgY2xhc3MgaW5oZXJpdHMgZnJvbSBhbiBhYnN0cmFjdCBkaXJlY3RpdmUgdGhvdWdoLCB3ZSB3aWxsIG1pZ3JhdGUgdGhlbSB0b29cbiAgICAgKiBhcyBkZXJpdmVkIGNsYXNzZXMgYWxzbyBuZWVkIHRvIGJlIGRlY29yYXRlZC4gVGhpcyBoYXMgYmVlbiBkb25lIGZvciBhIHNpbXBsZXIgbWVudGFsXG4gICAgICogbW9kZWwgYW5kIHJlZHVjZWQgY29tcGxleGl0eSBpbiB0aGUgQW5ndWxhciBjb21waWxlci4gU2VlIG1pZ3JhdGlvbiBwbGFuIGRvY3VtZW50LlxuICAgICAqL1xuICAgIGNvbnN0IGNoZWNrSW5oZXJpdGFuY2VPZkNsYXNzZXMgPSAoY2xhc3NlczogU2V0PHRzLkNsYXNzRGVjbGFyYXRpb24+KSA9PiB7XG4gICAgICBjbGFzc2VzLmZvckVhY2gobm9kZSA9PiB7XG4gICAgICAgIGZvciAoY29uc3Qge25vZGU6IGJhc2VDbGFzc30gb2YgZmluZEJhc2VDbGFzc0RlY2xhcmF0aW9ucyhub2RlLCB0aGlzLnR5cGVDaGVja2VyKSkge1xuICAgICAgICAgIGlmICghZGVjbGFyYXRpb25zLmhhcyhiYXNlQ2xhc3MpKSB7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgLy8gSWYgdGhlIHVuZGVjb3JhdGVkIGNsYXNzIGluaGVyaXRzIGZyb20gYW4gYWJzdHJhY3QgZGlyZWN0aXZlLCBhbHdheXMgbWlncmF0ZSBpdC5cbiAgICAgICAgICAvLyBEZXJpdmVkIHVuZGVjb3JhdGVkIGNsYXNzZXMgb2YgYWJzdHJhY3QgZGlyZWN0aXZlcyBhcmUgYWx3YXlzIGFsc28gY29uc2lkZXJlZFxuICAgICAgICAgIC8vIGFic3RyYWN0IGRpcmVjdGl2ZXMgYW5kIG5lZWQgdG8gYmUgZGVjb3JhdGVkIHRvby4gVGhpcyBpcyBuZWNlc3NhcnkgYXMgb3RoZXJ3aXNlXG4gICAgICAgICAgLy8gdGhlIGluaGVyaXRhbmNlIGNoYWluIGNhbm5vdCBiZSByZXNvbHZlZCBieSB0aGUgQW5ndWxhciBjb21waWxlci4gZS5nLiB3aGVuIGl0XG4gICAgICAgICAgLy8gZmxhdHRlbnMgZGlyZWN0aXZlIG1ldGFkYXRhIGZvciB0eXBlIGNoZWNraW5nLiBJbiB0aGUgb3RoZXIgY2FzZSwgd2UgbmV2ZXIgd2FudFxuICAgICAgICAgIC8vIHRvIG1pZ3JhdGUgYSBjbGFzcyBpZiBpdCBleHRlbmRzIGZyb20gYSBub24tYWJzdHJhY3QgQW5ndWxhciBkZWNsYXJhdGlvbi4gVGhhdFxuICAgICAgICAgIC8vIGlzIGFuIHVuc3VwcG9ydGVkIHBhdHRlcm4gYXMgb2YgdjkgYW5kIHdhcyBwcmV2aW91c2x5IGhhbmRsZWQgd2l0aCB0aGVcbiAgICAgICAgICAvLyBgdW5kZWNvcmF0ZWQtY2xhc3Nlcy13aXRoLWRpYCBtaWdyYXRpb24gKHdoaWNoIGNvcGllZCB0aGUgaW5oZXJpdGVkIGRlY29yYXRvcikuXG4gICAgICAgICAgaWYgKGRlY2xhcmF0aW9ucy5nZXQoYmFzZUNsYXNzKSA9PT0gRGVjbGFyYXRpb25UeXBlLkFCU1RSQUNUX0RJUkVDVElWRSkge1xuICAgICAgICAgICAgZGV0ZWN0ZWRBYnN0cmFjdERpcmVjdGl2ZXMuYWRkKG5vZGUpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBkZXRlY3RlZEFic3RyYWN0RGlyZWN0aXZlcy5kZWxldGUobm9kZSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGFtYmlndW91c0NsYXNzZXMuZGVsZXRlKG5vZGUpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9O1xuXG4gICAgLy8gQ2hlY2sgaW5oZXJpdGFuY2Ugb2YgYW55IGRldGVjdGVkIGFic3RyYWN0IGRpcmVjdGl2ZS4gV2Ugd2FudCB0byByZW1vdmVcbiAgICAvLyBjbGFzc2VzIHRoYXQgYXJlIG5vdCBlbGlnaWJsZSBhYnN0cmFjdCBkaXJlY3RpdmVzIGR1ZSB0byBpbmhlcml0YW5jZS4gaS5lLlxuICAgIC8vIGlmIGEgY2xhc3MgZXh0ZW5kcyBmcm9tIGEgY29tcG9uZW50LCBpdCBjYW5ub3QgYmUgYSBkZXJpdmVkIGFic3RyYWN0IGRpcmVjdGl2ZS5cbiAgICBjaGVja0luaGVyaXRhbmNlT2ZDbGFzc2VzKGRldGVjdGVkQWJzdHJhY3REaXJlY3RpdmVzKTtcbiAgICAvLyBVcGRhdGUgdGhlIGNsYXNzIGRlY2xhcmF0aW9ucyB0byByZWZsZWN0IHRoZSBkZXRlY3RlZCBhYnN0cmFjdCBkaXJlY3RpdmVzLiBUaGlzIGlzXG4gICAgLy8gdGhlbiB1c2VkIGxhdGVyIHdoZW4gd2UgY2hlY2sgZm9yIHVuZGVjb3JhdGVkIGNsYXNzZXMgdGhhdCBpbmhlcml0IGZyb20gYW4gYWJzdHJhY3RcbiAgICAvLyBkaXJlY3RpdmUgYW5kIG5lZWQgdG8gYmUgZGVjb3JhdGVkLlxuICAgIGRldGVjdGVkQWJzdHJhY3REaXJlY3RpdmVzLmZvckVhY2goXG4gICAgICAgIG4gPT4gZGVjbGFyYXRpb25zLnNldChuLCBEZWNsYXJhdGlvblR5cGUuQUJTVFJBQ1RfRElSRUNUSVZFKSk7XG4gICAgLy8gQ2hlY2sgYW1iaWd1b3VzIGFuZCB1bmRlY29yYXRlZCBjbGFzc2VzIGlmIHRoZXkgaW5oZXJpdCBmcm9tIGFuIGFic3RyYWN0IGRpcmVjdGl2ZS5cbiAgICAvLyBJZiB0aGV5IGRvLCB3ZSB3YW50IHRvIG1pZ3JhdGUgdGhlbSB0b28uIFNlZSBmdW5jdGlvbiBkZWZpbml0aW9uIGZvciBtb3JlIGRldGFpbHMuXG4gICAgY2hlY2tJbmhlcml0YW5jZU9mQ2xhc3NlcyhhbWJpZ3VvdXNDbGFzc2VzKTtcbiAgICBjaGVja0luaGVyaXRhbmNlT2ZDbGFzc2VzKHVuZGVjb3JhdGVkQ2xhc3Nlcyk7XG5cbiAgICByZXR1cm4ge2RldGVjdGVkQWJzdHJhY3REaXJlY3RpdmVzLCBhbWJpZ3VvdXNDbGFzc2VzfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBbmFseXplcyB0aGUgZ2l2ZW4gY2xhc3MgZGVjbGFyYXRpb24gYnkgZGV0ZXJtaW5pbmcgd2hldGhlciB0aGUgY2xhc3NcbiAgICogaXMgYSBkaXJlY3RpdmUsIGlzIGFuIGFic3RyYWN0IGRpcmVjdGl2ZSwgb3IgdXNlcyBBbmd1bGFyIGZlYXR1cmVzLlxuICAgKi9cbiAgcHJpdmF0ZSBfYW5hbHl6ZUNsYXNzRGVjbGFyYXRpb24obm9kZTogdHMuQ2xhc3NEZWNsYXJhdGlvbik6IEFuYWx5emVkQ2xhc3Mge1xuICAgIGNvbnN0IG5nRGVjb3JhdG9ycyA9IG5vZGUuZGVjb3JhdG9ycyAmJiBnZXRBbmd1bGFyRGVjb3JhdG9ycyh0aGlzLnR5cGVDaGVja2VyLCBub2RlLmRlY29yYXRvcnMpO1xuICAgIGNvbnN0IGluZmVycmVkS2luZCA9IHRoaXMuX2RldGVybWluZUNsYXNzS2luZChub2RlKTtcbiAgICBpZiAobmdEZWNvcmF0b3JzID09PSB1bmRlZmluZWQgfHwgbmdEZWNvcmF0b3JzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuIHtkZWNvcmF0ZWRUeXBlOiBudWxsLCBpbmZlcnJlZEtpbmR9O1xuICAgIH1cbiAgICBjb25zdCBkaXJlY3RpdmVEZWNvcmF0b3IgPSBuZ0RlY29yYXRvcnMuZmluZCgoe25hbWV9KSA9PiBuYW1lID09PSAnRGlyZWN0aXZlJyk7XG4gICAgY29uc3QgY29tcG9uZW50RGVjb3JhdG9yID0gbmdEZWNvcmF0b3JzLmZpbmQoKHtuYW1lfSkgPT4gbmFtZSA9PT0gJ0NvbXBvbmVudCcpO1xuICAgIGNvbnN0IHBpcGVEZWNvcmF0b3IgPSBuZ0RlY29yYXRvcnMuZmluZCgoe25hbWV9KSA9PiBuYW1lID09PSAnUGlwZScpO1xuICAgIGNvbnN0IGluamVjdGFibGVEZWNvcmF0b3IgPSBuZ0RlY29yYXRvcnMuZmluZCgoe25hbWV9KSA9PiBuYW1lID09PSAnSW5qZWN0YWJsZScpO1xuICAgIGNvbnN0IGlzQWJzdHJhY3REaXJlY3RpdmUgPVxuICAgICAgICBkaXJlY3RpdmVEZWNvcmF0b3IgIT09IHVuZGVmaW5lZCAmJiB0aGlzLl9pc0Fic3RyYWN0RGlyZWN0aXZlKGRpcmVjdGl2ZURlY29yYXRvcik7XG5cbiAgICBsZXQgZGVjb3JhdGVkVHlwZTogRGVjbGFyYXRpb25UeXBlfG51bGwgPSBudWxsO1xuICAgIGlmIChpc0Fic3RyYWN0RGlyZWN0aXZlKSB7XG4gICAgICBkZWNvcmF0ZWRUeXBlID0gRGVjbGFyYXRpb25UeXBlLkFCU1RSQUNUX0RJUkVDVElWRTtcbiAgICB9IGVsc2UgaWYgKGNvbXBvbmVudERlY29yYXRvciAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBkZWNvcmF0ZWRUeXBlID0gRGVjbGFyYXRpb25UeXBlLkNPTVBPTkVOVDtcbiAgICB9IGVsc2UgaWYgKGRpcmVjdGl2ZURlY29yYXRvciAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBkZWNvcmF0ZWRUeXBlID0gRGVjbGFyYXRpb25UeXBlLkRJUkVDVElWRTtcbiAgICB9IGVsc2UgaWYgKHBpcGVEZWNvcmF0b3IgIT09IHVuZGVmaW5lZCkge1xuICAgICAgZGVjb3JhdGVkVHlwZSA9IERlY2xhcmF0aW9uVHlwZS5QSVBFO1xuICAgIH0gZWxzZSBpZiAoaW5qZWN0YWJsZURlY29yYXRvciAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBkZWNvcmF0ZWRUeXBlID0gRGVjbGFyYXRpb25UeXBlLklOSkVDVEFCTEU7XG4gICAgfVxuICAgIHJldHVybiB7ZGVjb3JhdGVkVHlwZSwgaW5mZXJyZWRLaW5kfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVja3Mgd2hldGhlciB0aGUgZ2l2ZW4gZGVjb3JhdG9yIHJlc29sdmVzIHRvIGFuIGFic3RyYWN0IGRpcmVjdGl2ZS4gQW4gZGlyZWN0aXZlIGlzXG4gICAqIGNvbnNpZGVyZWQgXCJhYnN0cmFjdFwiIGlmIHRoZXJlIGlzIG5vIHNlbGVjdG9yIHNwZWNpZmllZC5cbiAgICovXG4gIHByaXZhdGUgX2lzQWJzdHJhY3REaXJlY3RpdmUoe25vZGV9OiBOZ0RlY29yYXRvcik6IGJvb2xlYW4ge1xuICAgIGNvbnN0IG1ldGFkYXRhQXJncyA9IG5vZGUuZXhwcmVzc2lvbi5hcmd1bWVudHM7XG4gICAgaWYgKG1ldGFkYXRhQXJncy5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBjb25zdCBtZXRhZGF0YUV4cHIgPSB1bndyYXBFeHByZXNzaW9uKG1ldGFkYXRhQXJnc1swXSk7XG4gICAgaWYgKCF0cy5pc09iamVjdExpdGVyYWxFeHByZXNzaW9uKG1ldGFkYXRhRXhwcikpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgY29uc3QgbWV0YWRhdGEgPSB0aGlzLmNvbXBpbGVyQ2xpTWlncmF0aW9uc01vZHVsZS5yZWZsZWN0T2JqZWN0TGl0ZXJhbChtZXRhZGF0YUV4cHIpO1xuICAgIGlmICghbWV0YWRhdGEuaGFzKCdzZWxlY3RvcicpKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGNvbnN0IHNlbGVjdG9yID0gdGhpcy5wYXJ0aWFsRXZhbHVhdG9yLmV2YWx1YXRlKG1ldGFkYXRhLmdldCgnc2VsZWN0b3InKSEpO1xuICAgIHJldHVybiBzZWxlY3RvciA9PSBudWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIERldGVybWluZXMgdGhlIGtpbmQgb2YgYSBnaXZlbiBjbGFzcyBpbiB0ZXJtcyBvZiBBbmd1bGFyLiBUaGUgbWV0aG9kIGNoZWNrc1xuICAgKiB3aGV0aGVyIHRoZSBnaXZlbiBjbGFzcyBoYXMgbWVtYmVycyB0aGF0IGluZGljYXRlIHRoZSB1c2Ugb2YgQW5ndWxhciBmZWF0dXJlcy5cbiAgICogZS5nLiBsaWZlY3ljbGUgaG9va3Mgb3IgZGVjb3JhdGVkIG1lbWJlcnMgbGlrZSBgQElucHV0YCBvciBgQE91dHB1dGAgYXJlXG4gICAqIGNvbnNpZGVyZWQgQW5ndWxhciBmZWF0dXJlcy4uXG4gICAqL1xuICBwcml2YXRlIF9kZXRlcm1pbmVDbGFzc0tpbmQobm9kZTogdHMuQ2xhc3NEZWNsYXJhdGlvbik6IEluZmVycmVkS2luZCB7XG4gICAgbGV0IHVzYWdlID0gSW5mZXJyZWRLaW5kLlVOS05PV047XG5cbiAgICBmb3IgKGNvbnN0IG1lbWJlciBvZiBub2RlLm1lbWJlcnMpIHtcbiAgICAgIGNvbnN0IHByb3BlcnR5TmFtZSA9IG1lbWJlci5uYW1lICE9PSB1bmRlZmluZWQgPyBnZXRQcm9wZXJ0eU5hbWVUZXh0KG1lbWJlci5uYW1lKSA6IG51bGw7XG5cbiAgICAgIC8vIElmIHRoZSBjbGFzcyBkZWNsYXJlcyBhbnkgb2YgdGhlIGtub3duIGRpcmVjdGl2ZSBsaWZlY3ljbGUgaG9va3MsIHdlIGNhblxuICAgICAgLy8gaW1tZWRpYXRlbHkgZXhpdCB0aGUgbG9vcCBhcyB0aGUgY2xhc3MgaXMgZ3VhcmFudGVlZCB0byBiZSBhIGRpcmVjdGl2ZS5cbiAgICAgIGlmIChwcm9wZXJ0eU5hbWUgIT09IG51bGwgJiYgRElSRUNUSVZFX0xJRkVDWUNMRV9IT09LUy5oYXMocHJvcGVydHlOYW1lKSkge1xuICAgICAgICByZXR1cm4gSW5mZXJyZWRLaW5kLkRJUkVDVElWRTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgbmdEZWNvcmF0b3JzID0gbWVtYmVyLmRlY29yYXRvcnMgIT09IHVuZGVmaW5lZCA/XG4gICAgICAgICAgZ2V0QW5ndWxhckRlY29yYXRvcnModGhpcy50eXBlQ2hlY2tlciwgbWVtYmVyLmRlY29yYXRvcnMpIDpcbiAgICAgICAgICBbXTtcbiAgICAgIGZvciAoY29uc3Qge25hbWV9IG9mIG5nRGVjb3JhdG9ycykge1xuICAgICAgICBpZiAoRElSRUNUSVZFX0ZJRUxEX0RFQ09SQVRPUlMuaGFzKG5hbWUpKSB7XG4gICAgICAgICAgcmV0dXJuIEluZmVycmVkS2luZC5ESVJFQ1RJVkU7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gSWYgdGhlIGNsYXNzIGRlY2xhcmVzIGFueSBvZiB0aGUgbGlmZWN5Y2xlIGhvb2tzIHRoYXQgZG8gbm90IGd1YXJhbnRlZSB0aGF0XG4gICAgICAvLyB0aGUgZ2l2ZW4gY2xhc3MgaXMgYSBkaXJlY3RpdmUsIHVwZGF0ZSB0aGUga2luZCBhbmQgY29udGludWUgbG9va2luZyBmb3Igb3RoZXJcbiAgICAgIC8vIG1lbWJlcnMgdGhhdCB3b3VsZCB1bnZlaWwgYSBtb3JlIHNwZWNpZmljIGtpbmQgKGkuZS4gYmVpbmcgYSBkaXJlY3RpdmUpLlxuICAgICAgaWYgKHByb3BlcnR5TmFtZSAhPT0gbnVsbCAmJiBBTUJJR1VPVVNfTElGRUNZQ0xFX0hPT0tTLmhhcyhwcm9wZXJ0eU5hbWUpKSB7XG4gICAgICAgIHVzYWdlID0gSW5mZXJyZWRLaW5kLkFNQklHVU9VUztcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gdXNhZ2U7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2tzIHdoZXRoZXIgYSBnaXZlbiBjbGFzcyBoYXMgYmVlbiByZXBvcnRlZCBhcyBhbWJpZ3VvdXMgaW4gcHJldmlvdXNcbiAgICogbWlncmF0aW9uIHJ1bi4gZS5nLiB3aGVuIGJ1aWxkIHRhcmdldHMgYXJlIG1pZ3JhdGVkIGZpcnN0LCBhbmQgdGhlbiB0ZXN0XG4gICAqIHRhcmdldHMgdGhhdCBoYXZlIGFuIG92ZXJsYXAgd2l0aCBidWlsZCBzb3VyY2UgZmlsZXMsIHRoZSBzYW1lIGNsYXNzXG4gICAqIGNvdWxkIGJlIGRldGVjdGVkIGFzIGFtYmlndW91cy5cbiAgICovXG4gIHByaXZhdGUgX2hhc0JlZW5SZXBvcnRlZEFzQW1iaWd1b3VzKG5vZGU6IHRzLkNsYXNzRGVjbGFyYXRpb24pOiBib29sZWFuIHtcbiAgICBjb25zdCBzb3VyY2VGaWxlID0gbm9kZS5nZXRTb3VyY2VGaWxlKCk7XG4gICAgY29uc3QgbGVhZGluZ0NvbW1lbnRzID0gdHMuZ2V0TGVhZGluZ0NvbW1lbnRSYW5nZXMoc291cmNlRmlsZS50ZXh0LCBub2RlLnBvcyk7XG4gICAgaWYgKGxlYWRpbmdDb21tZW50cyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHJldHVybiBsZWFkaW5nQ29tbWVudHMuc29tZShcbiAgICAgICAgKHtraW5kLCBwb3MsIGVuZH0pID0+IGtpbmQgPT09IHRzLlN5bnRheEtpbmQuU2luZ2xlTGluZUNvbW1lbnRUcml2aWEgJiZcbiAgICAgICAgICAgIHNvdXJjZUZpbGUudGV4dC5zdWJzdHJpbmcocG9zLCBlbmQpLmluY2x1ZGVzKGBUT0RPOiAke0FNQklHVU9VU19DTEFTU19UT0RPfWApKTtcbiAgfVxufVxuIl19
@@ -1,19 +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-decorated-fields/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
13
- * in a non-colliding way.
14
- */
15
- export interface UpdateRecorder extends ImportManagerUpdateRecorder {
16
- addClassDecorator(node: ts.ClassDeclaration, text: string): void;
17
- addClassTodo(node: ts.ClassDeclaration, message: string): void;
18
- commitUpdate(): void;
19
- }
@@ -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-decorated-fields/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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXBkYXRlX3JlY29yZGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vcGFja2FnZXMvY29yZS9zY2hlbWF0aWNzL21pZ3JhdGlvbnMvdW5kZWNvcmF0ZWQtY2xhc3Nlcy13aXRoLWRlY29yYXRlZC1maWVsZHMvdXBkYXRlX3JlY29yZGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7R0FNRyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCBHb29nbGUgTExDIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKlxuICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmVcbiAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2VcbiAqL1xuXG5pbXBvcnQgdHMgZnJvbSAndHlwZXNjcmlwdCc7XG5pbXBvcnQge0ltcG9ydE1hbmFnZXJVcGRhdGVSZWNvcmRlcn0gZnJvbSAnLi4vLi4vdXRpbHMvaW1wb3J0X21hbmFnZXInO1xuXG4vKipcbiAqIFVwZGF0ZSByZWNvcmRlciBpbnRlcmZhY2UgdGhhdCBpcyB1c2VkIHRvIHRyYW5zZm9ybSBzb3VyY2UgZmlsZXNcbiAqIGluIGEgbm9uLWNvbGxpZGluZyB3YXkuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVXBkYXRlUmVjb3JkZXIgZXh0ZW5kcyBJbXBvcnRNYW5hZ2VyVXBkYXRlUmVjb3JkZXIge1xuICBhZGRDbGFzc0RlY29yYXRvcihub2RlOiB0cy5DbGFzc0RlY2xhcmF0aW9uLCB0ZXh0OiBzdHJpbmcpOiB2b2lkO1xuICBhZGRDbGFzc1RvZG8obm9kZTogdHMuQ2xhc3NEZWNsYXJhdGlvbiwgbWVzc2FnZTogc3RyaW5nKTogdm9pZDtcbiAgY29tbWl0VXBkYXRlKCk6IHZvaWQ7XG59XG4iXX0=
@@ -1,18 +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/create_ngc_program" />
9
- import type { AotCompiler } from '@angular/compiler';
10
- import type { CompilerHost } from '@angular/compiler-cli';
11
- import ts from 'typescript';
12
- /** Creates an NGC program that can be used to read and parse metadata for files. */
13
- export declare function createNgcProgram(compilerCliModule: typeof import('@angular/compiler-cli'), createHost: (options: ts.CompilerOptions) => CompilerHost, tsconfigPath: string): {
14
- host: CompilerHost;
15
- ngcProgram: import("@angular/compiler-cli").Program;
16
- program: ts.Program;
17
- compiler: AotCompiler;
18
- };
@@ -1,56 +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/create_ngc_program", ["require", "exports"], factory);
15
- }
16
- })(function (require, exports) {
17
- "use strict";
18
- Object.defineProperty(exports, "__esModule", { value: true });
19
- exports.createNgcProgram = void 0;
20
- /** Creates an NGC program that can be used to read and parse metadata for files. */
21
- function createNgcProgram(compilerCliModule, createHost, tsconfigPath) {
22
- const { rootNames, options } = compilerCliModule.readConfiguration(tsconfigPath);
23
- // https://github.com/angular/angular/commit/ec4381dd401f03bded652665b047b6b90f2b425f made Ivy
24
- // the default. This breaks the assumption that "createProgram" from compiler-cli returns the
25
- // NGC program. In order to ensure that the migration runs properly, we set "enableIvy" to false.
26
- options.enableIvy = false;
27
- // Libraries which have been generated with CLI versions past v6.2.0, explicitly set the
28
- // flat-module options in their tsconfig files. This is problematic because by default,
29
- // those tsconfig files do not specify explicit source files which can be considered as
30
- // entry point for the flat-module bundle. Therefore the `@angular/compiler-cli` is unable
31
- // to determine the flat module entry point and throws a compile error. This is not an issue
32
- // for the libraries built with `ng-packagr`, because the tsconfig files are modified in-memory
33
- // to specify an explicit flat module entry-point. Our migrations don't distinguish between
34
- // libraries and applications, and also don't run `ng-packagr`. To ensure that such libraries
35
- // can be successfully migrated, we remove the flat-module options to eliminate the flat module
36
- // entry-point requirement. More context: https://github.com/angular/angular/issues/34985.
37
- options.flatModuleId = undefined;
38
- options.flatModuleOutFile = undefined;
39
- const host = createHost(options);
40
- // For this migration, we never need to read resources and can just return
41
- // an empty string for requested resources. We need to handle requested resources
42
- // because our created NGC compiler program does not know about special resolutions
43
- // which are set up by the Angular CLI. i.e. resolving stylesheets through "tilde".
44
- host.readResource = () => '';
45
- host.resourceNameToFileName = () => '$fake-file$';
46
- const ngcProgram = compilerCliModule.createProgram({ rootNames, options, host });
47
- // The "AngularCompilerProgram" does not expose the "AotCompiler" instance, nor does it
48
- // expose the logic that is necessary to analyze the determined modules. We work around
49
- // this by just accessing the necessary private properties using the bracket notation.
50
- const compiler = ngcProgram['compiler'];
51
- const program = ngcProgram.getTsProgram();
52
- return { host, ngcProgram, program, compiler };
53
- }
54
- exports.createNgcProgram = createNgcProgram;
55
- });
56
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3JlYXRlX25nY19wcm9ncmFtLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vcGFja2FnZXMvY29yZS9zY2hlbWF0aWNzL21pZ3JhdGlvbnMvdW5kZWNvcmF0ZWQtY2xhc3Nlcy13aXRoLWRpL2NyZWF0ZV9uZ2NfcHJvZ3JhbS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7O0dBTUc7Ozs7Ozs7Ozs7Ozs7SUFNSCxvRkFBb0Y7SUFDcEYsU0FBZ0IsZ0JBQWdCLENBQzVCLGlCQUF5RCxFQUN6RCxVQUF5RCxFQUFFLFlBQW9CO1FBQ2pGLE1BQU0sRUFBQyxTQUFTLEVBQUUsT0FBTyxFQUFDLEdBQUcsaUJBQWlCLENBQUMsaUJBQWlCLENBQUMsWUFBWSxDQUFDLENBQUM7UUFFL0UsOEZBQThGO1FBQzlGLDZGQUE2RjtRQUM3RixpR0FBaUc7UUFDakcsT0FBTyxDQUFDLFNBQVMsR0FBRyxLQUFLLENBQUM7UUFFMUIsd0ZBQXdGO1FBQ3hGLHVGQUF1RjtRQUN2Rix1RkFBdUY7UUFDdkYsMEZBQTBGO1FBQzFGLDRGQUE0RjtRQUM1RiwrRkFBK0Y7UUFDL0YsMkZBQTJGO1FBQzNGLDZGQUE2RjtRQUM3RiwrRkFBK0Y7UUFDL0YsMEZBQTBGO1FBQzFGLE9BQU8sQ0FBQyxZQUFZLEdBQUcsU0FBUyxDQUFDO1FBQ2pDLE9BQU8sQ0FBQyxpQkFBaUIsR0FBRyxTQUFTLENBQUM7UUFFdEMsTUFBTSxJQUFJLEdBQUcsVUFBVSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBRWpDLDBFQUEwRTtRQUMxRSxpRkFBaUY7UUFDakYsbUZBQW1GO1FBQ25GLG1GQUFtRjtRQUNuRixJQUFJLENBQUMsWUFBWSxHQUFHLEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FBQztRQUM3QixJQUFJLENBQUMsc0JBQXNCLEdBQUcsR0FBRyxFQUFFLENBQUMsYUFBYSxDQUFDO1FBRWxELE1BQU0sVUFBVSxHQUFHLGlCQUFpQixDQUFDLGFBQWEsQ0FBQyxFQUFDLFNBQVMsRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFDLENBQUMsQ0FBQztRQUUvRSx1RkFBdUY7UUFDdkYsdUZBQXVGO1FBQ3ZGLHNGQUFzRjtRQUN0RixNQUFNLFFBQVEsR0FBaUIsVUFBa0IsQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUM5RCxNQUFNLE9BQU8sR0FBRyxVQUFVLENBQUMsWUFBWSxFQUFFLENBQUM7UUFFMUMsT0FBTyxFQUFDLElBQUksRUFBRSxVQUFVLEVBQUUsT0FBTyxFQUFFLFFBQVEsRUFBQyxDQUFDO0lBQy9DLENBQUM7SUF6Q0QsNENBeUNDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IEdvb2dsZSBMTEMgQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqXG4gKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZVxuICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZVxuICovXG5cbmltcG9ydCB0eXBlIHtBb3RDb21waWxlcn0gZnJvbSAnQGFuZ3VsYXIvY29tcGlsZXInO1xuaW1wb3J0IHR5cGUge0NvbXBpbGVySG9zdH0gZnJvbSAnQGFuZ3VsYXIvY29tcGlsZXItY2xpJztcbmltcG9ydCB0cyBmcm9tICd0eXBlc2NyaXB0JztcblxuLyoqIENyZWF0ZXMgYW4gTkdDIHByb2dyYW0gdGhhdCBjYW4gYmUgdXNlZCB0byByZWFkIGFuZCBwYXJzZSBtZXRhZGF0YSBmb3IgZmlsZXMuICovXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlTmdjUHJvZ3JhbShcbiAgICBjb21waWxlckNsaU1vZHVsZTogdHlwZW9mIGltcG9ydCgnQGFuZ3VsYXIvY29tcGlsZXItY2xpJyksXG4gICAgY3JlYXRlSG9zdDogKG9wdGlvbnM6IHRzLkNvbXBpbGVyT3B0aW9ucykgPT4gQ29tcGlsZXJIb3N0LCB0c2NvbmZpZ1BhdGg6IHN0cmluZykge1xuICBjb25zdCB7cm9vdE5hbWVzLCBvcHRpb25zfSA9IGNvbXBpbGVyQ2xpTW9kdWxlLnJlYWRDb25maWd1cmF0aW9uKHRzY29uZmlnUGF0aCk7XG5cbiAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2FuZ3VsYXIvYW5ndWxhci9jb21taXQvZWM0MzgxZGQ0MDFmMDNiZGVkNjUyNjY1YjA0N2I2YjkwZjJiNDI1ZiBtYWRlIEl2eVxuICAvLyB0aGUgZGVmYXVsdC4gVGhpcyBicmVha3MgdGhlIGFzc3VtcHRpb24gdGhhdCBcImNyZWF0ZVByb2dyYW1cIiBmcm9tIGNvbXBpbGVyLWNsaSByZXR1cm5zIHRoZVxuICAvLyBOR0MgcHJvZ3JhbS4gSW4gb3JkZXIgdG8gZW5zdXJlIHRoYXQgdGhlIG1pZ3JhdGlvbiBydW5zIHByb3Blcmx5LCB3ZSBzZXQgXCJlbmFibGVJdnlcIiB0byBmYWxzZS5cbiAgb3B0aW9ucy5lbmFibGVJdnkgPSBmYWxzZTtcblxuICAvLyBMaWJyYXJpZXMgd2hpY2ggaGF2ZSBiZWVuIGdlbmVyYXRlZCB3aXRoIENMSSB2ZXJzaW9ucyBwYXN0IHY2LjIuMCwgZXhwbGljaXRseSBzZXQgdGhlXG4gIC8vIGZsYXQtbW9kdWxlIG9wdGlvbnMgaW4gdGhlaXIgdHNjb25maWcgZmlsZXMuIFRoaXMgaXMgcHJvYmxlbWF0aWMgYmVjYXVzZSBieSBkZWZhdWx0LFxuICAvLyB0aG9zZSB0c2NvbmZpZyBmaWxlcyBkbyBub3Qgc3BlY2lmeSBleHBsaWNpdCBzb3VyY2UgZmlsZXMgd2hpY2ggY2FuIGJlIGNvbnNpZGVyZWQgYXNcbiAgLy8gZW50cnkgcG9pbnQgZm9yIHRoZSBmbGF0LW1vZHVsZSBidW5kbGUuIFRoZXJlZm9yZSB0aGUgYEBhbmd1bGFyL2NvbXBpbGVyLWNsaWAgaXMgdW5hYmxlXG4gIC8vIHRvIGRldGVybWluZSB0aGUgZmxhdCBtb2R1bGUgZW50cnkgcG9pbnQgYW5kIHRocm93cyBhIGNvbXBpbGUgZXJyb3IuIFRoaXMgaXMgbm90IGFuIGlzc3VlXG4gIC8vIGZvciB0aGUgbGlicmFyaWVzIGJ1aWx0IHdpdGggYG5nLXBhY2thZ3JgLCBiZWNhdXNlIHRoZSB0c2NvbmZpZyBmaWxlcyBhcmUgbW9kaWZpZWQgaW4tbWVtb3J5XG4gIC8vIHRvIHNwZWNpZnkgYW4gZXhwbGljaXQgZmxhdCBtb2R1bGUgZW50cnktcG9pbnQuIE91ciBtaWdyYXRpb25zIGRvbid0IGRpc3Rpbmd1aXNoIGJldHdlZW5cbiAgLy8gbGlicmFyaWVzIGFuZCBhcHBsaWNhdGlvbnMsIGFuZCBhbHNvIGRvbid0IHJ1biBgbmctcGFja2FncmAuIFRvIGVuc3VyZSB0aGF0IHN1Y2ggbGlicmFyaWVzXG4gIC8vIGNhbiBiZSBzdWNjZXNzZnVsbHkgbWlncmF0ZWQsIHdlIHJlbW92ZSB0aGUgZmxhdC1tb2R1bGUgb3B0aW9ucyB0byBlbGltaW5hdGUgdGhlIGZsYXQgbW9kdWxlXG4gIC8vIGVudHJ5LXBvaW50IHJlcXVpcmVtZW50LiBNb3JlIGNvbnRleHQ6IGh0dHBzOi8vZ2l0aHViLmNvbS9hbmd1bGFyL2FuZ3VsYXIvaXNzdWVzLzM0OTg1LlxuICBvcHRpb25zLmZsYXRNb2R1bGVJZCA9IHVuZGVmaW5lZDtcbiAgb3B0aW9ucy5mbGF0TW9kdWxlT3V0RmlsZSA9IHVuZGVmaW5lZDtcblxuICBjb25zdCBob3N0ID0gY3JlYXRlSG9zdChvcHRpb25zKTtcblxuICAvLyBGb3IgdGhpcyBtaWdyYXRpb24sIHdlIG5ldmVyIG5lZWQgdG8gcmVhZCByZXNvdXJjZXMgYW5kIGNhbiBqdXN0IHJldHVyblxuICAvLyBhbiBlbXB0eSBzdHJpbmcgZm9yIHJlcXVlc3RlZCByZXNvdXJjZXMuIFdlIG5lZWQgdG8gaGFuZGxlIHJlcXVlc3RlZCByZXNvdXJjZXNcbiAgLy8gYmVjYXVzZSBvdXIgY3JlYXRlZCBOR0MgY29tcGlsZXIgcHJvZ3JhbSBkb2VzIG5vdCBrbm93IGFib3V0IHNwZWNpYWwgcmVzb2x1dGlvbnNcbiAgLy8gd2hpY2ggYXJlIHNldCB1cCBieSB0aGUgQW5ndWxhciBDTEkuIGkuZS4gcmVzb2x2aW5nIHN0eWxlc2hlZXRzIHRocm91Z2ggXCJ0aWxkZVwiLlxuICBob3N0LnJlYWRSZXNvdXJjZSA9ICgpID0+ICcnO1xuICBob3N0LnJlc291cmNlTmFtZVRvRmlsZU5hbWUgPSAoKSA9PiAnJGZha2UtZmlsZSQnO1xuXG4gIGNvbnN0IG5nY1Byb2dyYW0gPSBjb21waWxlckNsaU1vZHVsZS5jcmVhdGVQcm9ncmFtKHtyb290TmFtZXMsIG9wdGlvbnMsIGhvc3R9KTtcblxuICAvLyBUaGUgXCJBbmd1bGFyQ29tcGlsZXJQcm9ncmFtXCIgZG9lcyBub3QgZXhwb3NlIHRoZSBcIkFvdENvbXBpbGVyXCIgaW5zdGFuY2UsIG5vciBkb2VzIGl0XG4gIC8vIGV4cG9zZSB0aGUgbG9naWMgdGhhdCBpcyBuZWNlc3NhcnkgdG8gYW5hbHl6ZSB0aGUgZGV0ZXJtaW5lZCBtb2R1bGVzLiBXZSB3b3JrIGFyb3VuZFxuICAvLyB0aGlzIGJ5IGp1c3QgYWNjZXNzaW5nIHRoZSBuZWNlc3NhcnkgcHJpdmF0ZSBwcm9wZXJ0aWVzIHVzaW5nIHRoZSBicmFja2V0IG5vdGF0aW9uLlxuICBjb25zdCBjb21waWxlcjogQW90Q29tcGlsZXIgPSAobmdjUHJvZ3JhbSBhcyBhbnkpWydjb21waWxlciddO1xuICBjb25zdCBwcm9ncmFtID0gbmdjUHJvZ3JhbS5nZXRUc1Byb2dyYW0oKTtcblxuICByZXR1cm4ge2hvc3QsIG5nY1Byb2dyYW0sIHByb2dyYW0sIGNvbXBpbGVyfTtcbn1cbiJdfQ==
@@ -1,18 +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/decorator_rewrite/convert_directive_metadata" />
9
- import type { StaticSymbol } from '@angular/compiler';
10
- import ts from 'typescript';
11
- /** Error that will be thrown if an unexpected value needs to be converted. */
12
- export declare class UnexpectedMetadataValueError extends Error {
13
- }
14
- /**
15
- * Converts a directive metadata object into a TypeScript expression. Throws
16
- * if metadata cannot be cleanly converted.
17
- */
18
- export declare function convertDirectiveMetadataToExpression(compilerModule: typeof import('@angular/compiler'), metadata: any, resolveSymbolImport: (symbol: StaticSymbol) => string | null, createImport: (moduleName: string, name: string) => ts.Expression, convertProperty?: (key: string, value: any) => ts.Expression | null): ts.Expression;
@@ -1,99 +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 __importDefault = (this && this.__importDefault) || function (mod) {
9
- return (mod && mod.__esModule) ? mod : { "default": mod };
10
- };
11
- (function (factory) {
12
- if (typeof module === "object" && typeof module.exports === "object") {
13
- var v = factory(require, exports);
14
- if (v !== undefined) module.exports = v;
15
- }
16
- else if (typeof define === "function" && define.amd) {
17
- define("@angular/core/schematics/migrations/undecorated-classes-with-di/decorator_rewrite/convert_directive_metadata", ["require", "exports", "typescript"], factory);
18
- }
19
- })(function (require, exports) {
20
- "use strict";
21
- Object.defineProperty(exports, "__esModule", { value: true });
22
- exports.convertDirectiveMetadataToExpression = exports.UnexpectedMetadataValueError = void 0;
23
- const typescript_1 = __importDefault(require("typescript"));
24
- /** Error that will be thrown if an unexpected value needs to be converted. */
25
- class UnexpectedMetadataValueError extends Error {
26
- }
27
- exports.UnexpectedMetadataValueError = UnexpectedMetadataValueError;
28
- /**
29
- * Converts a directive metadata object into a TypeScript expression. Throws
30
- * if metadata cannot be cleanly converted.
31
- */
32
- function convertDirectiveMetadataToExpression(compilerModule, metadata, resolveSymbolImport, createImport, convertProperty) {
33
- if (typeof metadata === 'string') {
34
- return typescript_1.default.createStringLiteral(metadata);
35
- }
36
- else if (Array.isArray(metadata)) {
37
- return typescript_1.default.createArrayLiteral(metadata.map(el => convertDirectiveMetadataToExpression(compilerModule, el, resolveSymbolImport, createImport, convertProperty)));
38
- }
39
- else if (typeof metadata === 'number') {
40
- return typescript_1.default.createNumericLiteral(metadata.toString());
41
- }
42
- else if (typeof metadata === 'boolean') {
43
- return metadata ? typescript_1.default.createTrue() : typescript_1.default.createFalse();
44
- }
45
- else if (typeof metadata === 'undefined') {
46
- return typescript_1.default.createIdentifier('undefined');
47
- }
48
- else if (typeof metadata === 'bigint') {
49
- return typescript_1.default.createBigIntLiteral(metadata.toString());
50
- }
51
- else if (typeof metadata === 'object') {
52
- // In case there is a static symbol object part of the metadata, try to resolve
53
- // the import expression of the symbol. If no import path could be resolved, an
54
- // error will be thrown as the symbol cannot be converted into TypeScript AST.
55
- if (metadata instanceof compilerModule.StaticSymbol) {
56
- const resolvedImport = resolveSymbolImport(metadata);
57
- if (resolvedImport === null) {
58
- throw new UnexpectedMetadataValueError();
59
- }
60
- return createImport(resolvedImport, metadata.name);
61
- }
62
- const literalProperties = [];
63
- for (const key of Object.keys(metadata)) {
64
- const metadataValue = metadata[key];
65
- let propertyValue = null;
66
- // Allows custom conversion of properties in an object. This is useful for special
67
- // cases where we don't want to store the enum values as integers, but rather use the
68
- // real enum symbol. e.g. instead of `2` we want to use `ViewEncapsulation.None`.
69
- if (convertProperty) {
70
- propertyValue = convertProperty(key, metadataValue);
71
- }
72
- // In case the property value has not been assigned to an expression, we convert
73
- // the resolved metadata value into a TypeScript expression.
74
- if (propertyValue === null) {
75
- propertyValue = convertDirectiveMetadataToExpression(compilerModule, metadataValue, resolveSymbolImport, createImport, convertProperty);
76
- }
77
- literalProperties.push(typescript_1.default.createPropertyAssignment(getPropertyName(key), propertyValue));
78
- }
79
- return typescript_1.default.createObjectLiteral(literalProperties, true);
80
- }
81
- throw new UnexpectedMetadataValueError();
82
- }
83
- exports.convertDirectiveMetadataToExpression = convertDirectiveMetadataToExpression;
84
- /**
85
- * Gets a valid property name from the given text. If the text cannot be used
86
- * as unquoted identifier, the name will be wrapped in a string literal.
87
- */
88
- function getPropertyName(name) {
89
- // Matches the most common identifiers that do not need quotes. Constructing a
90
- // regular expression that matches the ECMAScript specification in order to determine
91
- // whether quotes are needed is out of scope for this migration. For those more complex
92
- // property names, we just always use quotes (when constructing AST from metadata).
93
- if (/^[a-zA-Z_$]+$/.test(name)) {
94
- return name;
95
- }
96
- return typescript_1.default.createStringLiteral(name);
97
- }
98
- });
99
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29udmVydF9kaXJlY3RpdmVfbWV0YWRhdGEuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9jb3JlL3NjaGVtYXRpY3MvbWlncmF0aW9ucy91bmRlY29yYXRlZC1jbGFzc2VzLXdpdGgtZGkvZGVjb3JhdG9yX3Jld3JpdGUvY29udmVydF9kaXJlY3RpdmVfbWV0YWRhdGEudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7OztHQU1HOzs7Ozs7Ozs7Ozs7Ozs7O0lBR0gsNERBQTRCO0lBRTVCLDhFQUE4RTtJQUM5RSxNQUFhLDRCQUE2QixTQUFRLEtBQUs7S0FBRztJQUExRCxvRUFBMEQ7SUFFMUQ7OztPQUdHO0lBQ0gsU0FBZ0Isb0NBQW9DLENBQ2hELGNBQWtELEVBQUUsUUFBYSxFQUNqRSxtQkFBNEQsRUFDNUQsWUFBaUUsRUFDakUsZUFBbUU7UUFDckUsSUFBSSxPQUFPLFFBQVEsS0FBSyxRQUFRLEVBQUU7WUFDaEMsT0FBTyxvQkFBRSxDQUFDLG1CQUFtQixDQUFDLFFBQVEsQ0FBQyxDQUFDO1NBQ3pDO2FBQU0sSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxFQUFFO1lBQ2xDLE9BQU8sb0JBQUUsQ0FBQyxrQkFBa0IsQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUNyQyxFQUFFLENBQUMsRUFBRSxDQUFDLG9DQUFvQyxDQUN0QyxjQUFjLEVBQUUsRUFBRSxFQUFFLG1CQUFtQixFQUFFLFlBQVksRUFBRSxlQUFlLENBQUMsQ0FBQyxDQUFDLENBQUM7U0FDbkY7YUFBTSxJQUFJLE9BQU8sUUFBUSxLQUFLLFFBQVEsRUFBRTtZQUN2QyxPQUFPLG9CQUFFLENBQUMsb0JBQW9CLENBQUMsUUFBUSxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUM7U0FDckQ7YUFBTSxJQUFJLE9BQU8sUUFBUSxLQUFLLFNBQVMsRUFBRTtZQUN4QyxPQUFPLFFBQVEsQ0FBQyxDQUFDLENBQUMsb0JBQUUsQ0FBQyxVQUFVLEVBQUUsQ0FBQyxDQUFDLENBQUMsb0JBQUUsQ0FBQyxXQUFXLEVBQUUsQ0FBQztTQUN0RDthQUFNLElBQUksT0FBTyxRQUFRLEtBQUssV0FBVyxFQUFFO1lBQzFDLE9BQU8sb0JBQUUsQ0FBQyxnQkFBZ0IsQ0FBQyxXQUFXLENBQUMsQ0FBQztTQUN6QzthQUFNLElBQUksT0FBTyxRQUFRLEtBQUssUUFBUSxFQUFFO1lBQ3ZDLE9BQU8sb0JBQUUsQ0FBQyxtQkFBbUIsQ0FBQyxRQUFRLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQztTQUNwRDthQUFNLElBQUksT0FBTyxRQUFRLEtBQUssUUFBUSxFQUFFO1lBQ3ZDLCtFQUErRTtZQUMvRSwrRUFBK0U7WUFDL0UsOEVBQThFO1lBQzlFLElBQUksUUFBUSxZQUFZLGNBQWMsQ0FBQyxZQUFZLEVBQUU7Z0JBQ25ELE1BQU0sY0FBYyxHQUFHLG1CQUFtQixDQUFDLFFBQVEsQ0FBQyxDQUFDO2dCQUNyRCxJQUFJLGNBQWMsS0FBSyxJQUFJLEVBQUU7b0JBQzNCLE1BQU0sSUFBSSw0QkFBNEIsRUFBRSxDQUFDO2lCQUMxQztnQkFDRCxPQUFPLFlBQVksQ0FBQyxjQUFjLEVBQUUsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDO2FBQ3BEO1lBRUQsTUFBTSxpQkFBaUIsR0FBNEIsRUFBRSxDQUFDO1lBRXRELEtBQUssTUFBTSxHQUFHLElBQUksTUFBTSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsRUFBRTtnQkFDdkMsTUFBTSxhQUFhLEdBQUcsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDO2dCQUNwQyxJQUFJLGFBQWEsR0FBdUIsSUFBSSxDQUFDO2dCQUU3QyxrRkFBa0Y7Z0JBQ2xGLHFGQUFxRjtnQkFDckYsaUZBQWlGO2dCQUNqRixJQUFJLGVBQWUsRUFBRTtvQkFDbkIsYUFBYSxHQUFHLGVBQWUsQ0FBQyxHQUFHLEVBQUUsYUFBYSxDQUFDLENBQUM7aUJBQ3JEO2dCQUVELGdGQUFnRjtnQkFDaEYsNERBQTREO2dCQUM1RCxJQUFJLGFBQWEsS0FBSyxJQUFJLEVBQUU7b0JBQzFCLGFBQWEsR0FBRyxvQ0FBb0MsQ0FDaEQsY0FBYyxFQUFFLGFBQWEsRUFBRSxtQkFBbUIsRUFBRSxZQUFZLEVBQUUsZUFBZSxDQUFDLENBQUM7aUJBQ3hGO2dCQUVELGlCQUFpQixDQUFDLElBQUksQ0FBQyxvQkFBRSxDQUFDLHdCQUF3QixDQUFDLGVBQWUsQ0FBQyxHQUFHLENBQUMsRUFBRSxhQUFhLENBQUMsQ0FBQyxDQUFDO2FBQzFGO1lBRUQsT0FBTyxvQkFBRSxDQUFDLG1CQUFtQixDQUFDLGlCQUFpQixFQUFFLElBQUksQ0FBQyxDQUFDO1NBQ3hEO1FBRUQsTUFBTSxJQUFJLDRCQUE0QixFQUFFLENBQUM7SUFDM0MsQ0FBQztJQTFERCxvRkEwREM7SUFFRDs7O09BR0c7SUFDSCxTQUFTLGVBQWUsQ0FBQyxJQUFZO1FBQ25DLDhFQUE4RTtRQUM5RSxxRkFBcUY7UUFDckYsdUZBQXVGO1FBQ3ZGLG1GQUFtRjtRQUNuRixJQUFJLGVBQWUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUU7WUFDOUIsT0FBTyxJQUFJLENBQUM7U0FDYjtRQUNELE9BQU8sb0JBQUUsQ0FBQyxtQkFBbUIsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUN0QyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IEdvb2dsZSBMTEMgQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqXG4gKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZVxuICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZVxuICovXG5cbmltcG9ydCB0eXBlIHtTdGF0aWNTeW1ib2x9IGZyb20gJ0Bhbmd1bGFyL2NvbXBpbGVyJztcbmltcG9ydCB0cyBmcm9tICd0eXBlc2NyaXB0JztcblxuLyoqIEVycm9yIHRoYXQgd2lsbCBiZSB0aHJvd24gaWYgYW4gdW5leHBlY3RlZCB2YWx1ZSBuZWVkcyB0byBiZSBjb252ZXJ0ZWQuICovXG5leHBvcnQgY2xhc3MgVW5leHBlY3RlZE1ldGFkYXRhVmFsdWVFcnJvciBleHRlbmRzIEVycm9yIHt9XG5cbi8qKlxuICogQ29udmVydHMgYSBkaXJlY3RpdmUgbWV0YWRhdGEgb2JqZWN0IGludG8gYSBUeXBlU2NyaXB0IGV4cHJlc3Npb24uIFRocm93c1xuICogaWYgbWV0YWRhdGEgY2Fubm90IGJlIGNsZWFubHkgY29udmVydGVkLlxuICovXG5leHBvcnQgZnVuY3Rpb24gY29udmVydERpcmVjdGl2ZU1ldGFkYXRhVG9FeHByZXNzaW9uKFxuICAgIGNvbXBpbGVyTW9kdWxlOiB0eXBlb2YgaW1wb3J0KCdAYW5ndWxhci9jb21waWxlcicpLCBtZXRhZGF0YTogYW55LFxuICAgIHJlc29sdmVTeW1ib2xJbXBvcnQ6IChzeW1ib2w6IFN0YXRpY1N5bWJvbCkgPT4gc3RyaW5nIHwgbnVsbCxcbiAgICBjcmVhdGVJbXBvcnQ6IChtb2R1bGVOYW1lOiBzdHJpbmcsIG5hbWU6IHN0cmluZykgPT4gdHMuRXhwcmVzc2lvbixcbiAgICBjb252ZXJ0UHJvcGVydHk/OiAoa2V5OiBzdHJpbmcsIHZhbHVlOiBhbnkpID0+IHRzLkV4cHJlc3Npb24gfCBudWxsKTogdHMuRXhwcmVzc2lvbiB7XG4gIGlmICh0eXBlb2YgbWV0YWRhdGEgPT09ICdzdHJpbmcnKSB7XG4gICAgcmV0dXJuIHRzLmNyZWF0ZVN0cmluZ0xpdGVyYWwobWV0YWRhdGEpO1xuICB9IGVsc2UgaWYgKEFycmF5LmlzQXJyYXkobWV0YWRhdGEpKSB7XG4gICAgcmV0dXJuIHRzLmNyZWF0ZUFycmF5TGl0ZXJhbChtZXRhZGF0YS5tYXAoXG4gICAgICAgIGVsID0+IGNvbnZlcnREaXJlY3RpdmVNZXRhZGF0YVRvRXhwcmVzc2lvbihcbiAgICAgICAgICAgIGNvbXBpbGVyTW9kdWxlLCBlbCwgcmVzb2x2ZVN5bWJvbEltcG9ydCwgY3JlYXRlSW1wb3J0LCBjb252ZXJ0UHJvcGVydHkpKSk7XG4gIH0gZWxzZSBpZiAodHlwZW9mIG1ldGFkYXRhID09PSAnbnVtYmVyJykge1xuICAgIHJldHVybiB0cy5jcmVhdGVOdW1lcmljTGl0ZXJhbChtZXRhZGF0YS50b1N0cmluZygpKTtcbiAgfSBlbHNlIGlmICh0eXBlb2YgbWV0YWRhdGEgPT09ICdib29sZWFuJykge1xuICAgIHJldHVybiBtZXRhZGF0YSA/IHRzLmNyZWF0ZVRydWUoKSA6IHRzLmNyZWF0ZUZhbHNlKCk7XG4gIH0gZWxzZSBpZiAodHlwZW9mIG1ldGFkYXRhID09PSAndW5kZWZpbmVkJykge1xuICAgIHJldHVybiB0cy5jcmVhdGVJZGVudGlmaWVyKCd1bmRlZmluZWQnKTtcbiAgfSBlbHNlIGlmICh0eXBlb2YgbWV0YWRhdGEgPT09ICdiaWdpbnQnKSB7XG4gICAgcmV0dXJuIHRzLmNyZWF0ZUJpZ0ludExpdGVyYWwobWV0YWRhdGEudG9TdHJpbmcoKSk7XG4gIH0gZWxzZSBpZiAodHlwZW9mIG1ldGFkYXRhID09PSAnb2JqZWN0Jykge1xuICAgIC8vIEluIGNhc2UgdGhlcmUgaXMgYSBzdGF0aWMgc3ltYm9sIG9iamVjdCBwYXJ0IG9mIHRoZSBtZXRhZGF0YSwgdHJ5IHRvIHJlc29sdmVcbiAgICAvLyB0aGUgaW1wb3J0IGV4cHJlc3Npb24gb2YgdGhlIHN5bWJvbC4gSWYgbm8gaW1wb3J0IHBhdGggY291bGQgYmUgcmVzb2x2ZWQsIGFuXG4gICAgLy8gZXJyb3Igd2lsbCBiZSB0aHJvd24gYXMgdGhlIHN5bWJvbCBjYW5ub3QgYmUgY29udmVydGVkIGludG8gVHlwZVNjcmlwdCBBU1QuXG4gICAgaWYgKG1ldGFkYXRhIGluc3RhbmNlb2YgY29tcGlsZXJNb2R1bGUuU3RhdGljU3ltYm9sKSB7XG4gICAgICBjb25zdCByZXNvbHZlZEltcG9ydCA9IHJlc29sdmVTeW1ib2xJbXBvcnQobWV0YWRhdGEpO1xuICAgICAgaWYgKHJlc29sdmVkSW1wb3J0ID09PSBudWxsKSB7XG4gICAgICAgIHRocm93IG5ldyBVbmV4cGVjdGVkTWV0YWRhdGFWYWx1ZUVycm9yKCk7XG4gICAgICB9XG4gICAgICByZXR1cm4gY3JlYXRlSW1wb3J0KHJlc29sdmVkSW1wb3J0LCBtZXRhZGF0YS5uYW1lKTtcbiAgICB9XG5cbiAgICBjb25zdCBsaXRlcmFsUHJvcGVydGllczogdHMuUHJvcGVydHlBc3NpZ25tZW50W10gPSBbXTtcblxuICAgIGZvciAoY29uc3Qga2V5IG9mIE9iamVjdC5rZXlzKG1ldGFkYXRhKSkge1xuICAgICAgY29uc3QgbWV0YWRhdGFWYWx1ZSA9IG1ldGFkYXRhW2tleV07XG4gICAgICBsZXQgcHJvcGVydHlWYWx1ZTogdHMuRXhwcmVzc2lvbnxudWxsID0gbnVsbDtcblxuICAgICAgLy8gQWxsb3dzIGN1c3RvbSBjb252ZXJzaW9uIG9mIHByb3BlcnRpZXMgaW4gYW4gb2JqZWN0LiBUaGlzIGlzIHVzZWZ1bCBmb3Igc3BlY2lhbFxuICAgICAgLy8gY2FzZXMgd2hlcmUgd2UgZG9uJ3Qgd2FudCB0byBzdG9yZSB0aGUgZW51bSB2YWx1ZXMgYXMgaW50ZWdlcnMsIGJ1dCByYXRoZXIgdXNlIHRoZVxuICAgICAgLy8gcmVhbCBlbnVtIHN5bWJvbC4gZS5nLiBpbnN0ZWFkIG9mIGAyYCB3ZSB3YW50IHRvIHVzZSBgVmlld0VuY2Fwc3VsYXRpb24uTm9uZWAuXG4gICAgICBpZiAoY29udmVydFByb3BlcnR5KSB7XG4gICAgICAgIHByb3BlcnR5VmFsdWUgPSBjb252ZXJ0UHJvcGVydHkoa2V5LCBtZXRhZGF0YVZhbHVlKTtcbiAgICAgIH1cblxuICAgICAgLy8gSW4gY2FzZSB0aGUgcHJvcGVydHkgdmFsdWUgaGFzIG5vdCBiZWVuIGFzc2lnbmVkIHRvIGFuIGV4cHJlc3Npb24sIHdlIGNvbnZlcnRcbiAgICAgIC8vIHRoZSByZXNvbHZlZCBtZXRhZGF0YSB2YWx1ZSBpbnRvIGEgVHlwZVNjcmlwdCBleHByZXNzaW9uLlxuICAgICAgaWYgKHByb3BlcnR5VmFsdWUgPT09IG51bGwpIHtcbiAgICAgICAgcHJvcGVydHlWYWx1ZSA9IGNvbnZlcnREaXJlY3RpdmVNZXRhZGF0YVRvRXhwcmVzc2lvbihcbiAgICAgICAgICAgIGNvbXBpbGVyTW9kdWxlLCBtZXRhZGF0YVZhbHVlLCByZXNvbHZlU3ltYm9sSW1wb3J0LCBjcmVhdGVJbXBvcnQsIGNvbnZlcnRQcm9wZXJ0eSk7XG4gICAgICB9XG5cbiAgICAgIGxpdGVyYWxQcm9wZXJ0aWVzLnB1c2godHMuY3JlYXRlUHJvcGVydHlBc3NpZ25tZW50KGdldFByb3BlcnR5TmFtZShrZXkpLCBwcm9wZXJ0eVZhbHVlKSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRzLmNyZWF0ZU9iamVjdExpdGVyYWwobGl0ZXJhbFByb3BlcnRpZXMsIHRydWUpO1xuICB9XG5cbiAgdGhyb3cgbmV3IFVuZXhwZWN0ZWRNZXRhZGF0YVZhbHVlRXJyb3IoKTtcbn1cblxuLyoqXG4gKiBHZXRzIGEgdmFsaWQgcHJvcGVydHkgbmFtZSBmcm9tIHRoZSBnaXZlbiB0ZXh0LiBJZiB0aGUgdGV4dCBjYW5ub3QgYmUgdXNlZFxuICogYXMgdW5xdW90ZWQgaWRlbnRpZmllciwgdGhlIG5hbWUgd2lsbCBiZSB3cmFwcGVkIGluIGEgc3RyaW5nIGxpdGVyYWwuXG4gKi9cbmZ1bmN0aW9uIGdldFByb3BlcnR5TmFtZShuYW1lOiBzdHJpbmcpOiBzdHJpbmd8dHMuU3RyaW5nTGl0ZXJhbCB7XG4gIC8vIE1hdGNoZXMgdGhlIG1vc3QgY29tbW9uIGlkZW50aWZpZXJzIHRoYXQgZG8gbm90IG5lZWQgcXVvdGVzLiBDb25zdHJ1Y3RpbmcgYVxuICAvLyByZWd1bGFyIGV4cHJlc3Npb24gdGhhdCBtYXRjaGVzIHRoZSBFQ01BU2NyaXB0IHNwZWNpZmljYXRpb24gaW4gb3JkZXIgdG8gZGV0ZXJtaW5lXG4gIC8vIHdoZXRoZXIgcXVvdGVzIGFyZSBuZWVkZWQgaXMgb3V0IG9mIHNjb3BlIGZvciB0aGlzIG1pZ3JhdGlvbi4gRm9yIHRob3NlIG1vcmUgY29tcGxleFxuICAvLyBwcm9wZXJ0eSBuYW1lcywgd2UganVzdCBhbHdheXMgdXNlIHF1b3RlcyAod2hlbiBjb25zdHJ1Y3RpbmcgQVNUIGZyb20gbWV0YWRhdGEpLlxuICBpZiAoL15bYS16QS1aXyRdKyQvLnRlc3QobmFtZSkpIHtcbiAgICByZXR1cm4gbmFtZTtcbiAgfVxuICByZXR1cm4gdHMuY3JlYXRlU3RyaW5nTGl0ZXJhbChuYW1lKTtcbn1cbiJdfQ==