@angular/core 12.2.0-next.1 → 12.2.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/bundles/core-testing.umd.js +15 -4
- package/bundles/core-testing.umd.js.map +1 -1
- package/bundles/core.umd.js +94 -77
- package/bundles/core.umd.js.map +1 -1
- package/core.d.ts +12 -12
- package/core.metadata.json +1 -1
- package/esm2015/src/application_init.js +5 -5
- package/esm2015/src/application_ref.js +6 -2
- package/esm2015/src/change_detection/differs/iterable_differs.js +1 -1
- package/esm2015/src/compiler/compiler_facade.js +31 -8
- package/esm2015/src/compiler/compiler_facade_interface.js +1 -1
- package/esm2015/src/di/jit/injectable.js +4 -3
- package/esm2015/src/di/r3_injector.js +5 -2
- package/esm2015/src/error_handler.js +4 -8
- package/esm2015/src/errors.js +2 -2
- package/esm2015/src/event_emitter.js +1 -1
- package/esm2015/src/i18n/locale_en.js +4 -38
- package/esm2015/src/linker/component_factory_resolver.js +1 -1
- package/esm2015/src/linker/template_ref.js +1 -1
- package/esm2015/src/linker/view_container_ref.js +1 -1
- package/esm2015/src/metadata/di.js +1 -1
- package/esm2015/src/render3/component_ref.js +1 -1
- package/esm2015/src/render3/definition.js +1 -1
- package/esm2015/src/render3/instructions/shared.js +2 -1
- package/esm2015/src/render3/jit/directive.js +6 -5
- package/esm2015/src/render3/jit/module.js +7 -4
- package/esm2015/src/render3/jit/partial.js +27 -9
- package/esm2015/src/render3/jit/pipe.js +5 -3
- package/esm2015/src/render3/ng_module_ref.js +1 -1
- package/esm2015/src/render3/view_ref.js +1 -1
- package/esm2015/src/sanitization/bypass.js +1 -1
- package/esm2015/src/version.js +1 -1
- package/esm2015/src/view/entrypoint.js +1 -1
- package/esm2015/src/view/refs.js +1 -1
- package/esm2015/testing/src/ng_zone_mock.js +1 -1
- package/esm2015/testing/src/r3_test_bed_compiler.js +4 -1
- package/esm2015/testing/src/resolvers.js +1 -1
- package/esm2015/testing/src/test_bed.js +12 -4
- package/fesm2015/core.js +95 -78
- package/fesm2015/core.js.map +1 -1
- package/fesm2015/testing.js +15 -4
- package/fesm2015/testing.js.map +1 -1
- package/package.json +2 -2
- package/schematics/migrations/missing-injectable/providers_evaluator.js +1 -1
- package/schematics/migrations/static-queries/strategies/usage_strategy/template_usage_visitor.js +1 -1
- package/schematics/migrations/template-var-assignment/angular/html_variable_assignment_visitor.js +1 -1
- package/schematics/migrations.json +1 -1
- package/src/r3_symbols.d.ts +2 -3
- package/testing/testing.d.ts +2 -1
- package/testing/testing.metadata.json +1 -1
- package/testing.d.ts +1 -1
- package/schematics/migrations/abstract-control-parent/abstract-control-parent.externs.js +0 -0
- package/schematics/migrations/abstract-control-parent/index.mjs +0 -47
- package/schematics/migrations/abstract-control-parent/util.mjs +0 -50
- package/schematics/migrations/activated-route-snapshot-fragment/activated-route-snapshot-fragment.externs.js +0 -0
- package/schematics/migrations/activated-route-snapshot-fragment/index.mjs +0 -48
- package/schematics/migrations/activated-route-snapshot-fragment/util.mjs +0 -33
- package/schematics/migrations/can-activate-with-redirect-to/can-activate-with-redirect-to.externs.js +0 -0
- package/schematics/migrations/can-activate-with-redirect-to/index.mjs +0 -44
- package/schematics/migrations/can-activate-with-redirect-to/util.mjs +0 -55
- package/schematics/migrations/deep-shadow-piercing-selector/deep-shadow-piercing-selector.externs.js +0 -0
- package/schematics/migrations/deep-shadow-piercing-selector/index.mjs +0 -36
- package/schematics/migrations/dynamic-queries/dynamic-queries.externs.js +0 -0
- package/schematics/migrations/dynamic-queries/index.mjs +0 -51
- package/schematics/migrations/dynamic-queries/util.mjs +0 -65
- package/schematics/migrations/initial-navigation/collector.mjs +0 -105
- package/schematics/migrations/initial-navigation/index.mjs +0 -61
- package/schematics/migrations/initial-navigation/initial-navigation.externs.js +0 -0
- package/schematics/migrations/initial-navigation/transform.mjs +0 -54
- package/schematics/migrations/initial-navigation/update_recorder.mjs +0 -9
- package/schematics/migrations/initial-navigation/util.mjs +0 -28
- package/schematics/migrations/missing-injectable/definition_collector.mjs +0 -75
- package/schematics/migrations/missing-injectable/index.mjs +0 -100
- package/schematics/migrations/missing-injectable/missing-injectable.externs.js +0 -0
- package/schematics/migrations/missing-injectable/providers_evaluator.mjs +0 -50
- package/schematics/migrations/missing-injectable/transform.mjs +0 -187
- package/schematics/migrations/missing-injectable/update_recorder.mjs +0 -9
- package/schematics/migrations/module-with-providers/collector.mjs +0 -59
- package/schematics/migrations/module-with-providers/index.mjs +0 -71
- package/schematics/migrations/module-with-providers/module-with-providers.externs.js +0 -0
- package/schematics/migrations/module-with-providers/transform.mjs +0 -134
- package/schematics/migrations/module-with-providers/util.mjs +0 -25
- package/schematics/migrations/move-document/document_import_visitor.mjs +0 -60
- package/schematics/migrations/move-document/index.mjs +0 -71
- package/schematics/migrations/move-document/move-document.externs.js +0 -0
- package/schematics/migrations/move-document/move-import.mjs +0 -45
- package/schematics/migrations/native-view-encapsulation/index.mjs +0 -41
- package/schematics/migrations/native-view-encapsulation/native-view-encapsulation.externs.js +0 -0
- package/schematics/migrations/native-view-encapsulation/util.mjs +0 -34
- package/schematics/migrations/navigation-extras-omissions/index.mjs +0 -47
- package/schematics/migrations/navigation-extras-omissions/navigation-extras-omissions.externs.js +0 -0
- package/schematics/migrations/navigation-extras-omissions/util.mjs +0 -111
- package/schematics/migrations/relative-link-resolution/collector.mjs +0 -81
- package/schematics/migrations/relative-link-resolution/index.mjs +0 -62
- package/schematics/migrations/relative-link-resolution/relative-link-resolution.externs.js +0 -0
- package/schematics/migrations/relative-link-resolution/transform.mjs +0 -51
- package/schematics/migrations/relative-link-resolution/update_recorder.mjs +0 -9
- package/schematics/migrations/relative-link-resolution/util.mjs +0 -28
- package/schematics/migrations/renderer-to-renderer2/helpers.mjs +0 -224
- package/schematics/migrations/renderer-to-renderer2/index.mjs +0 -113
- package/schematics/migrations/renderer-to-renderer2/migration.mjs +0 -211
- package/schematics/migrations/renderer-to-renderer2/renderer-to-renderer2.externs.js +0 -0
- package/schematics/migrations/renderer-to-renderer2/util.mjs +0 -69
- package/schematics/migrations/router-preserve-query-params/index.mjs +0 -50
- package/schematics/migrations/router-preserve-query-params/router-preserve-query-params.externs.js +0 -0
- package/schematics/migrations/router-preserve-query-params/util.mjs +0 -88
- package/schematics/migrations/static-queries/angular/directive_inputs.mjs +0 -70
- package/schematics/migrations/static-queries/angular/ng_query_visitor.mjs +0 -113
- package/schematics/migrations/static-queries/angular/query-definition.mjs +0 -20
- package/schematics/migrations/static-queries/angular/super_class.mjs +0 -21
- package/schematics/migrations/static-queries/index.mjs +0 -206
- package/schematics/migrations/static-queries/static-queries.externs.js +0 -0
- package/schematics/migrations/static-queries/strategies/template_strategy/template_strategy.mjs +0 -200
- package/schematics/migrations/static-queries/strategies/test_strategy/test_strategy.mjs +0 -24
- package/schematics/migrations/static-queries/strategies/timing-strategy.mjs +0 -9
- package/schematics/migrations/static-queries/strategies/usage_strategy/declaration_usage_visitor.mjs +0 -355
- package/schematics/migrations/static-queries/strategies/usage_strategy/super_class_context.mjs +0 -38
- package/schematics/migrations/static-queries/strategies/usage_strategy/template_usage_visitor.mjs +0 -80
- package/schematics/migrations/static-queries/strategies/usage_strategy/usage_strategy.mjs +0 -154
- package/schematics/migrations/static-queries/transform.mjs +0 -88
- package/schematics/migrations/template-var-assignment/analyze_template.mjs +0 -25
- package/schematics/migrations/template-var-assignment/angular/html_variable_assignment_visitor.mjs +0 -65
- package/schematics/migrations/template-var-assignment/index.mjs +0 -68
- package/schematics/migrations/template-var-assignment/template-var-assignment.externs.js +0 -0
- package/schematics/migrations/undecorated-classes-with-decorated-fields/index.mjs +0 -92
- package/schematics/migrations/undecorated-classes-with-decorated-fields/transform.mjs +0 -286
- package/schematics/migrations/undecorated-classes-with-decorated-fields/undecorated-classes-with-decorated-fields.externs.js +0 -0
- package/schematics/migrations/undecorated-classes-with-decorated-fields/update_recorder.mjs +0 -9
- package/schematics/migrations/undecorated-classes-with-di/create_ngc_program.mjs +0 -43
- package/schematics/migrations/undecorated-classes-with-di/decorator_rewrite/convert_directive_metadata.mjs +0 -82
- package/schematics/migrations/undecorated-classes-with-di/decorator_rewrite/decorator_rewriter.mjs +0 -102
- package/schematics/migrations/undecorated-classes-with-di/decorator_rewrite/import_rewrite_visitor.mjs +0 -111
- package/schematics/migrations/undecorated-classes-with-di/decorator_rewrite/path_format.mjs +0 -17
- package/schematics/migrations/undecorated-classes-with-di/decorator_rewrite/source_file_exports.mjs +0 -51
- package/schematics/migrations/undecorated-classes-with-di/index.mjs +0 -162
- package/schematics/migrations/undecorated-classes-with-di/ng_declaration_collector.mjs +0 -124
- package/schematics/migrations/undecorated-classes-with-di/transform.mjs +0 -356
- package/schematics/migrations/undecorated-classes-with-di/undecorated-classes-with-di.externs.js +0 -0
- package/schematics/migrations/undecorated-classes-with-di/update_recorder.mjs +0 -9
- package/schematics/migrations/wait-for-async/index.mjs +0 -76
- package/schematics/migrations/wait-for-async/util.mjs +0 -23
- package/schematics/migrations/wait-for-async/wait-for-async.externs.js +0 -0
- package/schematics/migrations/xhr-factory/index.mjs +0 -91
- package/schematics/migrations/xhr-factory/xhr-factory.externs.js +0 -0
- package/schematics/utils/import_manager.mjs +0 -197
- package/schematics/utils/line_mappings.mjs +0 -60
- package/schematics/utils/ng_component_template.mjs +0 -96
- package/schematics/utils/ng_decorators.mjs +0 -23
- package/schematics/utils/parse_html.mjs +0 -24
- package/schematics/utils/project_tsconfig_paths.mjs +0 -74
- package/schematics/utils/schematics_prompt.mjs +0 -30
- package/schematics/utils/typescript/class_declaration.mjs +0 -33
- package/schematics/utils/typescript/compiler_host.mjs +0 -66
- package/schematics/utils/typescript/decorators.mjs +0 -20
- package/schematics/utils/typescript/find_base_classes.mjs +0 -30
- package/schematics/utils/typescript/functions.mjs +0 -28
- package/schematics/utils/typescript/imports.mjs +0 -91
- package/schematics/utils/typescript/nodes.mjs +0 -57
- package/schematics/utils/typescript/parse_tsconfig.mjs +0 -26
- package/schematics/utils/typescript/property_name.mjs +0 -23
- package/schematics/utils/typescript/symbol.mjs +0 -72
- package/schematics/utils/utils.externs.js +0 -0
|
@@ -1,154 +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
|
-
import * as ts from 'typescript';
|
|
9
|
-
import { parseHtmlGracefully } from '../../../../utils/parse_html';
|
|
10
|
-
import { hasPropertyNameText } from '../../../../utils/typescript/property_name';
|
|
11
|
-
import { QueryTiming, QueryType } from '../../angular/query-definition';
|
|
12
|
-
import { DeclarationUsageVisitor, ResolvedUsage } from './declaration_usage_visitor';
|
|
13
|
-
import { updateSuperClassAbstractMembersContext } from './super_class_context';
|
|
14
|
-
import { TemplateUsageVisitor } from './template_usage_visitor';
|
|
15
|
-
/**
|
|
16
|
-
* Object that maps a given type of query to a list of lifecycle hooks that
|
|
17
|
-
* could be used to access such a query statically.
|
|
18
|
-
*/
|
|
19
|
-
const STATIC_QUERY_LIFECYCLE_HOOKS = {
|
|
20
|
-
[QueryType.ViewChild]: ['ngOnChanges', 'ngOnInit', 'ngDoCheck', 'ngAfterContentInit', 'ngAfterContentChecked'],
|
|
21
|
-
[QueryType.ContentChild]: ['ngOnChanges', 'ngOnInit', 'ngDoCheck'],
|
|
22
|
-
};
|
|
23
|
-
/**
|
|
24
|
-
* Query timing strategy that determines the timing of a given query by inspecting how
|
|
25
|
-
* the query is accessed within the project's TypeScript source files. Read more about
|
|
26
|
-
* this strategy here: https://hackmd.io/s/Hymvc2OKE
|
|
27
|
-
*/
|
|
28
|
-
export class QueryUsageStrategy {
|
|
29
|
-
constructor(classMetadata, typeChecker) {
|
|
30
|
-
this.classMetadata = classMetadata;
|
|
31
|
-
this.typeChecker = typeChecker;
|
|
32
|
-
}
|
|
33
|
-
setup() { }
|
|
34
|
-
/**
|
|
35
|
-
* Analyzes the usage of the given query and determines the query timing based
|
|
36
|
-
* on the current usage of the query.
|
|
37
|
-
*/
|
|
38
|
-
detectTiming(query) {
|
|
39
|
-
if (query.property === null) {
|
|
40
|
-
return { timing: null, message: 'Queries defined on accessors cannot be analyzed.' };
|
|
41
|
-
}
|
|
42
|
-
const usage = this.analyzeQueryUsage(query.container, query, []);
|
|
43
|
-
if (usage === ResolvedUsage.AMBIGUOUS) {
|
|
44
|
-
return {
|
|
45
|
-
timing: QueryTiming.STATIC,
|
|
46
|
-
message: 'Query timing is ambiguous. Please check if the query can be marked as dynamic.'
|
|
47
|
-
};
|
|
48
|
-
}
|
|
49
|
-
else if (usage === ResolvedUsage.SYNCHRONOUS) {
|
|
50
|
-
return { timing: QueryTiming.STATIC };
|
|
51
|
-
}
|
|
52
|
-
else {
|
|
53
|
-
return { timing: QueryTiming.DYNAMIC };
|
|
54
|
-
}
|
|
55
|
-
}
|
|
56
|
-
/**
|
|
57
|
-
* Checks whether a given query is used statically within the given class, its super
|
|
58
|
-
* class or derived classes.
|
|
59
|
-
*/
|
|
60
|
-
analyzeQueryUsage(classDecl, query, knownInputNames, functionCtx = new Map(), visitInheritedClasses = true) {
|
|
61
|
-
const usageVisitor = new DeclarationUsageVisitor(query.property, this.typeChecker, functionCtx);
|
|
62
|
-
const classMetadata = this.classMetadata.get(classDecl);
|
|
63
|
-
let usage = ResolvedUsage.ASYNCHRONOUS;
|
|
64
|
-
// In case there is metadata for the current class, we collect all resolved Angular input
|
|
65
|
-
// names and add them to the list of known inputs that need to be checked for usages of
|
|
66
|
-
// the current query. e.g. queries used in an @Input() *setter* are always static.
|
|
67
|
-
if (classMetadata) {
|
|
68
|
-
knownInputNames.push(...classMetadata.ngInputNames);
|
|
69
|
-
}
|
|
70
|
-
// Array of TypeScript nodes which can contain usages of the given query in
|
|
71
|
-
// order to access it statically.
|
|
72
|
-
const possibleStaticQueryNodes = filterQueryClassMemberNodes(classDecl, query, knownInputNames);
|
|
73
|
-
// In case nodes that can possibly access a query statically have been found, check
|
|
74
|
-
// if the query declaration is synchronously used within any of these nodes.
|
|
75
|
-
if (possibleStaticQueryNodes.length) {
|
|
76
|
-
possibleStaticQueryNodes.forEach(n => usage = combineResolvedUsage(usage, usageVisitor.getResolvedNodeUsage(n)));
|
|
77
|
-
}
|
|
78
|
-
if (!classMetadata) {
|
|
79
|
-
return usage;
|
|
80
|
-
}
|
|
81
|
-
// In case there is a component template for the current class, we check if the
|
|
82
|
-
// template statically accesses the current query. In case that's true, the query
|
|
83
|
-
// can be marked as static.
|
|
84
|
-
if (classMetadata.template && hasPropertyNameText(query.property.name)) {
|
|
85
|
-
const template = classMetadata.template;
|
|
86
|
-
const parsedHtml = parseHtmlGracefully(template.content, template.filePath);
|
|
87
|
-
const htmlVisitor = new TemplateUsageVisitor(query.property.name.text);
|
|
88
|
-
if (parsedHtml && htmlVisitor.isQueryUsedStatically(parsedHtml)) {
|
|
89
|
-
return ResolvedUsage.SYNCHRONOUS;
|
|
90
|
-
}
|
|
91
|
-
}
|
|
92
|
-
// In case derived classes should also be analyzed, we determine the classes that derive
|
|
93
|
-
// from the current class and check if these have input setters or lifecycle hooks that
|
|
94
|
-
// use the query statically.
|
|
95
|
-
if (visitInheritedClasses) {
|
|
96
|
-
classMetadata.derivedClasses.forEach(derivedClass => {
|
|
97
|
-
usage = combineResolvedUsage(usage, this.analyzeQueryUsage(derivedClass, query, knownInputNames));
|
|
98
|
-
});
|
|
99
|
-
}
|
|
100
|
-
// In case the current class has a super class, we determine declared abstract function-like
|
|
101
|
-
// declarations in the super-class that are implemented in the current class. The super class
|
|
102
|
-
// will then be analyzed with the abstract declarations mapped to the implemented TypeScript
|
|
103
|
-
// nodes. This allows us to handle queries which are used in super classes through derived
|
|
104
|
-
// abstract method declarations.
|
|
105
|
-
if (classMetadata.superClass) {
|
|
106
|
-
const superClassDecl = classMetadata.superClass;
|
|
107
|
-
// Update the function context to map abstract declaration nodes to their implementation
|
|
108
|
-
// node in the base class. This ensures that the declaration usage visitor can analyze
|
|
109
|
-
// abstract class member declarations.
|
|
110
|
-
updateSuperClassAbstractMembersContext(classDecl, functionCtx, this.classMetadata);
|
|
111
|
-
usage = combineResolvedUsage(usage, this.analyzeQueryUsage(superClassDecl, query, [], functionCtx, false));
|
|
112
|
-
}
|
|
113
|
-
return usage;
|
|
114
|
-
}
|
|
115
|
-
}
|
|
116
|
-
/**
|
|
117
|
-
* Combines two resolved usages based on a fixed priority. "Synchronous" takes
|
|
118
|
-
* precedence over "Ambiguous" whereas ambiguous takes precedence over "Asynchronous".
|
|
119
|
-
*/
|
|
120
|
-
function combineResolvedUsage(base, target) {
|
|
121
|
-
if (base === ResolvedUsage.SYNCHRONOUS) {
|
|
122
|
-
return base;
|
|
123
|
-
}
|
|
124
|
-
else if (target !== ResolvedUsage.ASYNCHRONOUS) {
|
|
125
|
-
return target;
|
|
126
|
-
}
|
|
127
|
-
else {
|
|
128
|
-
return ResolvedUsage.ASYNCHRONOUS;
|
|
129
|
-
}
|
|
130
|
-
}
|
|
131
|
-
/**
|
|
132
|
-
* Filters all class members from the class declaration that can access the
|
|
133
|
-
* given query statically (e.g. ngOnInit lifecycle hook or @Input setters)
|
|
134
|
-
*/
|
|
135
|
-
function filterQueryClassMemberNodes(classDecl, query, knownInputNames) {
|
|
136
|
-
// Returns an array of TypeScript nodes which can contain usages of the given query
|
|
137
|
-
// in order to access it statically. e.g.
|
|
138
|
-
// (1) queries used in the "ngOnInit" lifecycle hook are static.
|
|
139
|
-
// (2) inputs with setters can access queries statically.
|
|
140
|
-
return classDecl.members
|
|
141
|
-
.filter((m) => {
|
|
142
|
-
if (ts.isMethodDeclaration(m) && m.body && hasPropertyNameText(m.name) &&
|
|
143
|
-
STATIC_QUERY_LIFECYCLE_HOOKS[query.type].indexOf(m.name.text) !== -1) {
|
|
144
|
-
return true;
|
|
145
|
-
}
|
|
146
|
-
else if (knownInputNames && ts.isSetAccessor(m) && m.body &&
|
|
147
|
-
hasPropertyNameText(m.name) && knownInputNames.indexOf(m.name.text) !== -1) {
|
|
148
|
-
return true;
|
|
149
|
-
}
|
|
150
|
-
return false;
|
|
151
|
-
})
|
|
152
|
-
.map(member => member.body);
|
|
153
|
-
}
|
|
154
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXNhZ2Vfc3RyYXRlZ3kuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9jb3JlL3NjaGVtYXRpY3MvbWlncmF0aW9ucy9zdGF0aWMtcXVlcmllcy9zdHJhdGVnaWVzL3VzYWdlX3N0cmF0ZWd5L3VzYWdlX3N0cmF0ZWd5LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7R0FNRztBQUVILE9BQU8sS0FBSyxFQUFFLE1BQU0sWUFBWSxDQUFDO0FBRWpDLE9BQU8sRUFBQyxtQkFBbUIsRUFBQyxNQUFNLDhCQUE4QixDQUFDO0FBQ2pFLE9BQU8sRUFBQyxtQkFBbUIsRUFBQyxNQUFNLDRDQUE0QyxDQUFDO0FBRS9FLE9BQU8sRUFBb0IsV0FBVyxFQUFFLFNBQVMsRUFBQyxNQUFNLGdDQUFnQyxDQUFDO0FBR3pGLE9BQU8sRUFBQyx1QkFBdUIsRUFBbUIsYUFBYSxFQUFDLE1BQU0sNkJBQTZCLENBQUM7QUFDcEcsT0FBTyxFQUFDLHNDQUFzQyxFQUFDLE1BQU0sdUJBQXVCLENBQUM7QUFDN0UsT0FBTyxFQUFDLG9CQUFvQixFQUFDLE1BQU0sMEJBQTBCLENBQUM7QUFHOUQ7OztHQUdHO0FBQ0gsTUFBTSw0QkFBNEIsR0FBRztJQUNuQyxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsRUFDakIsQ0FBQyxhQUFhLEVBQUUsVUFBVSxFQUFFLFdBQVcsRUFBRSxvQkFBb0IsRUFBRSx1QkFBdUIsQ0FBQztJQUMzRixDQUFDLFNBQVMsQ0FBQyxZQUFZLENBQUMsRUFBRSxDQUFDLGFBQWEsRUFBRSxVQUFVLEVBQUUsV0FBVyxDQUFDO0NBQ25FLENBQUM7QUFFRjs7OztHQUlHO0FBQ0gsTUFBTSxPQUFPLGtCQUFrQjtJQUM3QixZQUFvQixhQUErQixFQUFVLFdBQTJCO1FBQXBFLGtCQUFhLEdBQWIsYUFBYSxDQUFrQjtRQUFVLGdCQUFXLEdBQVgsV0FBVyxDQUFnQjtJQUFHLENBQUM7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LGlFQUFpRTtJQUNqRSwwREFBMEQ7SUFDMUQsT0FBTyxTQUFTLENBQUMsT0FBTztTQUNuQixNQUFNLENBQ0gsQ0FBQyxDQUFDLEVBQ3lELEVBQUU7UUFDdkQsSUFBSSxFQUFFLENBQUMsbUJBQW1CLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksSUFBSSxtQkFBbUIsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO1lBQ2xFLDRCQUE0QixDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRTtZQUN4RSxPQUFPLElBQUksQ0FBQztTQUNiO2FBQU0sSUFDSCxlQUFlLElBQUksRUFBRSxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSTtZQUNoRCxtQkFBbUIsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksZUFBZSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFO1lBQzlFLE9BQU8sSUFBSSxDQUFDO1NBQ2I7UUFDRCxPQUFPLEtBQUssQ0FBQztJQUNmLENBQUMsQ0FBQztTQUNULEdBQUcsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLE1BQU0sQ0FBQyxJQUFLLENBQUMsQ0FBQztBQUNuQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IEdvb2dsZSBMTEMgQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqXG4gKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZVxuICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZVxuICovXG5cbmltcG9ydCAqIGFzIHRzIGZyb20gJ3R5cGVzY3JpcHQnO1xuXG5pbXBvcnQge3BhcnNlSHRtbEdyYWNlZnVsbHl9IGZyb20gJy4uLy4uLy4uLy4uL3V0aWxzL3BhcnNlX2h0bWwnO1xuaW1wb3J0IHtoYXNQcm9wZXJ0eU5hbWVUZXh0fSBmcm9tICcuLi8uLi8uLi8uLi91dGlscy90eXBlc2NyaXB0L3Byb3BlcnR5X25hbWUnO1xuaW1wb3J0IHtDbGFzc01ldGFkYXRhTWFwfSBmcm9tICcuLi8uLi9hbmd1bGFyL25nX3F1ZXJ5X3Zpc2l0b3InO1xuaW1wb3J0IHtOZ1F1ZXJ5RGVmaW5pdGlvbiwgUXVlcnlUaW1pbmcsIFF1ZXJ5VHlwZX0gZnJvbSAnLi4vLi4vYW5ndWxhci9xdWVyeS1kZWZpbml0aW9uJztcbmltcG9ydCB7VGltaW5nUmVzdWx0LCBUaW1pbmdTdHJhdGVneX0gZnJvbSAnLi4vdGltaW5nLXN0cmF0ZWd5JztcblxuaW1wb3J0IHtEZWNsYXJhdGlvblVzYWdlVmlzaXRvciwgRnVuY3Rpb25Db250ZXh0LCBSZXNvbHZlZFVzYWdlfSBmcm9tICcuL2RlY2xhcmF0aW9uX3VzYWdlX3Zpc2l0b3InO1xuaW1wb3J0IHt1cGRhdGVTdXBlckNsYXNzQWJzdHJhY3RNZW1iZXJzQ29udGV4dH0gZnJvbSAnLi9zdXBlcl9jbGFzc19jb250ZXh0JztcbmltcG9ydCB7VGVtcGxhdGVVc2FnZVZpc2l0b3J9IGZyb20gJy4vdGVtcGxhdGVfdXNhZ2VfdmlzaXRvcic7XG5cblxuLyoqXG4gKiBPYmplY3QgdGhhdCBtYXBzIGEgZ2l2ZW4gdHlwZSBvZiBxdWVyeSB0byBhIGxpc3Qgb2YgbGlmZWN5Y2xlIGhvb2tzIHRoYXRcbiAqIGNvdWxkIGJlIHVzZWQgdG8gYWNjZXNzIHN1Y2ggYSBxdWVyeSBzdGF0aWNhbGx5LlxuICovXG5jb25zdCBTVEFUSUNfUVVFUllfTElGRUNZQ0xFX0hPT0tTID0ge1xuICBbUXVlcnlUeXBlLlZpZXdDaGlsZF06XG4gICAgICBbJ25nT25DaGFuZ2VzJywgJ25nT25Jbml0JywgJ25nRG9DaGVjaycsICduZ0FmdGVyQ29udGVudEluaXQnLCAnbmdBZnRlckNvbnRlbnRDaGVja2VkJ10sXG4gIFtRdWVyeVR5cGUuQ29udGVudENoaWxkXTogWyduZ09uQ2hhbmdlcycsICduZ09uSW5pdCcsICduZ0RvQ2hlY2snXSxcbn07XG5cbi8qKlxuICogUXVlcnkgdGltaW5nIHN0cmF0ZWd5IHRoYXQgZGV0ZXJtaW5lcyB0aGUgdGltaW5nIG9mIGEgZ2l2ZW4gcXVlcnkgYnkgaW5zcGVjdGluZyBob3dcbiAqIHRoZSBxdWVyeSBpcyBhY2Nlc3NlZCB3aXRoaW4gdGhlIHByb2plY3QncyBUeXBlU2NyaXB0IHNvdXJjZSBmaWxlcy4gUmVhZCBtb3JlIGFib3V0XG4gKiB0aGlzIHN0cmF0ZWd5IGhlcmU6IGh0dHBzOi8vaGFja21kLmlvL3MvSHltdmMyT0tFXG4gKi9cbmV4cG9ydCBjbGFzcyBRdWVyeVVzYWdlU3RyYXRlZ3kgaW1wbGVtZW50cyBUaW1pbmdTdHJhdGVneSB7XG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgY2xhc3NNZXRhZGF0YTogQ2xhc3NNZXRhZGF0YU1hcCwgcHJpdmF0ZSB0eXBlQ2hlY2tlcjogdHMuVHlwZUNoZWNrZXIpIHt9XG5cbiAgc2V0dXAoKSB7fVxuXG4gIC8qKlxuICAgKiBBbmFseXplcyB0aGUgdXNhZ2Ugb2YgdGhlIGdpdmVuIHF1ZXJ5IGFuZCBkZXRlcm1pbmVzIHRoZSBxdWVyeSB0aW1pbmcgYmFzZWRcbiAgICogb24gdGhlIGN1cnJlbnQgdXNhZ2Ugb2YgdGhlIHF1ZXJ5LlxuICAgKi9cbiAgZGV0ZWN0VGltaW5nKHF1ZXJ5OiBOZ1F1ZXJ5RGVmaW5pdGlvbik6IFRpbWluZ1Jlc3VsdCB7XG4gICAgaWYgKHF1ZXJ5LnByb3BlcnR5ID09PSBudWxsKSB7XG4gICAgICByZXR1cm4ge3RpbWluZzogbnVsbCwgbWVzc2FnZTogJ1F1ZXJpZXMgZGVmaW5lZCBvbiBhY2Nlc3NvcnMgY2Fubm90IGJlIGFuYWx5emVkLid9O1xuICAgIH1cblxuICAgIGNvbnN0IHVzYWdlID0gdGhpcy5hbmFseXplUXVlcnlVc2FnZShxdWVyeS5jb250YWluZXIsIHF1ZXJ5LCBbXSk7XG5cbiAgICBpZiAodXNhZ2UgPT09IFJlc29sdmVkVXNhZ2UuQU1CSUdVT1VTKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICB0aW1pbmc6IFF1ZXJ5VGltaW5nLlNUQVRJQyxcbiAgICAgICAgbWVzc2FnZTogJ1F1ZXJ5IHRpbWluZyBpcyBhbWJpZ3VvdXMuIFBsZWFzZSBjaGVjayBpZiB0aGUgcXVlcnkgY2FuIGJlIG1hcmtlZCBhcyBkeW5hbWljLidcbiAgICAgIH07XG4gICAgfSBlbHNlIGlmICh1c2FnZSA9PT0gUmVzb2x2ZWRVc2FnZS5TWU5DSFJPTk9VUykge1xuICAgICAgcmV0dXJuIHt0aW1pbmc6IFF1ZXJ5VGltaW5nLlNUQVRJQ307XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiB7dGltaW5nOiBRdWVyeVRpbWluZy5EWU5BTUlDfTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2tzIHdoZXRoZXIgYSBnaXZlbiBxdWVyeSBpcyB1c2VkIHN0YXRpY2FsbHkgd2l0aGluIHRoZSBnaXZlbiBjbGFzcywgaXRzIHN1cGVyXG4gICAqIGNsYXNzIG9yIGRlcml2ZWQgY2xhc3Nlcy5cbiAgICovXG4gIHByaXZhdGUgYW5hbHl6ZVF1ZXJ5VXNhZ2UoXG4gICAgICBjbGFzc0RlY2w6IHRzLkNsYXNzRGVjbGFyYXRpb24sIHF1ZXJ5OiBOZ1F1ZXJ5RGVmaW5pdGlvbiwga25vd25JbnB1dE5hbWVzOiBzdHJpbmdbXSxcbiAgICAgIGZ1bmN0aW9uQ3R4OiBGdW5jdGlvbkNvbnRleHQgPSBuZXcgTWFwKCksIHZpc2l0SW5oZXJpdGVkQ2xhc3NlcyA9IHRydWUpOiBSZXNvbHZlZFVzYWdlIHtcbiAgICBjb25zdCB1c2FnZVZpc2l0b3IgPVxuICAgICAgICBuZXcgRGVjbGFyYXRpb25Vc2FnZVZpc2l0b3IocXVlcnkucHJvcGVydHkhLCB0aGlzLnR5cGVDaGVja2VyLCBmdW5jdGlvbkN0eCk7XG4gICAgY29uc3QgY2xhc3NNZXRhZGF0YSA9IHRoaXMuY2xhc3NNZXRhZGF0YS5nZXQoY2xhc3NEZWNsKTtcbiAgICBsZXQgdXNhZ2U6IFJlc29sdmVkVXNhZ2UgPSBSZXNvbHZlZFVzYWdlLkFTWU5DSFJPTk9VUztcblxuICAgIC8vIEluIGNhc2UgdGhlcmUgaXMgbWV0YWRhdGEgZm9yIHRoZSBjdXJyZW50IGNsYXNzLCB3ZSBjb2xsZWN0IGFsbCByZXNvbHZlZCBBbmd1bGFyIGlucHV0XG4gICAgLy8gbmFtZXMgYW5kIGFkZCB0aGVtIHRvIHRoZSBsaXN0IG9mIGtub3duIGlucHV0cyB0aGF0IG5lZWQgdG8gYmUgY2hlY2tlZCBmb3IgdXNhZ2VzIG9mXG4gICAgLy8gdGhlIGN1cnJlbnQgcXVlcnkuIGUuZy4gcXVlcmllcyB1c2VkIGluIGFuIEBJbnB1dCgpICpzZXR0ZXIqIGFyZSBhbHdheXMgc3RhdGljLlxuICAgIGlmIChjbGFzc01ldGFkYXRhKSB7XG4gICAgICBrbm93bklucHV0TmFtZXMucHVzaCguLi5jbGFzc01ldGFkYXRhLm5nSW5wdXROYW1lcyk7XG4gICAgfVxuXG4gICAgLy8gQXJyYXkgb2YgVHlwZVNjcmlwdCBub2RlcyB3aGljaCBjYW4gY29udGFpbiB1c2FnZXMgb2YgdGhlIGdpdmVuIHF1ZXJ5IGluXG4gICAgLy8gb3JkZXIgdG8gYWNjZXNzIGl0IHN0YXRpY2FsbHkuXG4gICAgY29uc3QgcG9zc2libGVTdGF0aWNRdWVyeU5vZGVzID0gZmlsdGVyUXVlcnlDbGFzc01lbWJlck5vZGVzKGNsYXNzRGVjbCwgcXVlcnksIGtub3duSW5wdXROYW1lcyk7XG5cbiAgICAvLyBJbiBjYXNlIG5vZGVzIHRoYXQgY2FuIHBvc3NpYmx5IGFjY2VzcyBhIHF1ZXJ5IHN0YXRpY2FsbHkgaGF2ZSBiZWVuIGZvdW5kLCBjaGVja1xuICAgIC8vIGlmIHRoZSBxdWVyeSBkZWNsYXJhdGlvbiBpcyBzeW5jaHJvbm91c2x5IHVzZWQgd2l0aGluIGFueSBvZiB0aGVzZSBub2Rlcy5cbiAgICBpZiAocG9zc2libGVTdGF0aWNRdWVyeU5vZGVzLmxlbmd0aCkge1xuICAgICAgcG9zc2libGVTdGF0aWNRdWVyeU5vZGVzLmZvckVhY2goXG4gICAgICAgICAgbiA9PiB1c2FnZSA9IGNvbWJpbmVSZXNvbHZlZFVzYWdlKHVzYWdlLCB1c2FnZVZpc2l0b3IuZ2V0UmVzb2x2ZWROb2RlVXNhZ2UobikpKTtcbiAgICB9XG5cbiAgICBpZiAoIWNsYXNzTWV0YWRhdGEpIHtcbiAgICAgIHJldHVybiB1c2FnZTtcbiAgICB9XG5cbiAgICAvLyBJbiBjYXNlIHRoZXJlIGlzIGEgY29tcG9uZW50IHRlbXBsYXRlIGZvciB0aGUgY3VycmVudCBjbGFzcywgd2UgY2hlY2sgaWYgdGhlXG4gICAgLy8gdGVtcGxhdGUgc3RhdGljYWxseSBhY2Nlc3NlcyB0aGUgY3VycmVudCBxdWVyeS4gSW4gY2FzZSB0aGF0J3MgdHJ1ZSwgdGhlIHF1ZXJ5XG4gICAgLy8gY2FuIGJlIG1hcmtlZCBhcyBzdGF0aWMuXG4gICAgaWYgKGNsYXNzTWV0YWRhdGEudGVtcGxhdGUgJiYgaGFzUHJvcGVydHlOYW1lVGV4dChxdWVyeS5wcm9wZXJ0eSEubmFtZSkpIHtcbiAgICAgIGNvbnN0IHRlbXBsYXRlID0gY2xhc3NNZXRhZGF0YS50ZW1wbGF0ZTtcbiAgICAgIGNvbnN0IHBhcnNlZEh0bWwgPSBwYXJzZUh0bWxHcmFjZWZ1bGx5KHRlbXBsYXRlLmNvbnRlbnQsIHRlbXBsYXRlLmZpbGVQYXRoKTtcbiAgICAgIGNvbnN0IGh0bWxWaXNpdG9yID0gbmV3IFRlbXBsYXRlVXNhZ2VWaXNpdG9yKHF1ZXJ5LnByb3BlcnR5IS5uYW1lLnRleHQpO1xuXG4gICAgICBpZiAocGFyc2VkSHRtbCAmJiBodG1sVmlzaXRvci5pc1F1ZXJ5VXNlZFN0YXRpY2FsbHkocGFyc2VkSHRtbCkpIHtcbiAgICAgICAgcmV0dXJuIFJlc29sdmVkVXNhZ2UuU1lOQ0hST05PVVM7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gSW4gY2FzZSBkZXJpdmVkIGNsYXNzZXMgc2hvdWxkIGFsc28gYmUgYW5hbHl6ZWQsIHdlIGRldGVybWluZSB0aGUgY2xhc3NlcyB0aGF0IGRlcml2ZVxuICAgIC8vIGZyb20gdGhlIGN1cnJlbnQgY2xhc3MgYW5kIGNoZWNrIGlmIHRoZXNlIGhhdmUgaW5wdXQgc2V0dGVycyBvciBsaWZlY3ljbGUgaG9va3MgdGhhdFxuICAgIC8vIHVzZSB0aGUgcXVlcnkgc3RhdGljYWxseS5cbiAgICBpZiAodmlzaXRJbmhlcml0ZWRDbGFzc2VzKSB7XG4gICAgICBjbGFzc01ldGFkYXRhLmRlcml2ZWRDbGFzc2VzLmZvckVhY2goZGVyaXZlZENsYXNzID0+IHtcbiAgICAgICAgdXNhZ2UgPSBjb21iaW5lUmVzb2x2ZWRVc2FnZShcbiAgICAgICAgICAgIHVzYWdlLCB0aGlzLmFuYWx5emVRdWVyeVVzYWdlKGRlcml2ZWRDbGFzcywgcXVlcnksIGtub3duSW5wdXROYW1lcykpO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgLy8gSW4gY2FzZSB0aGUgY3VycmVudCBjbGFzcyBoYXMgYSBzdXBlciBjbGFzcywgd2UgZGV0ZXJtaW5lIGRlY2xhcmVkIGFic3RyYWN0IGZ1bmN0aW9uLWxpa2VcbiAgICAvLyBkZWNsYXJhdGlvbnMgaW4gdGhlIHN1cGVyLWNsYXNzIHRoYXQgYXJlIGltcGxlbWVudGVkIGluIHRoZSBjdXJyZW50IGNsYXNzLiBUaGUgc3VwZXIgY2xhc3NcbiAgICAvLyB3aWxsIHRoZW4gYmUgYW5hbHl6ZWQgd2l0aCB0aGUgYWJzdHJhY3QgZGVjbGFyYXRpb25zIG1hcHBlZCB0byB0aGUgaW1wbGVtZW50ZWQgVHlwZVNjcmlwdFxuICAgIC8vIG5vZGVzLiBUaGlzIGFsbG93cyB1cyB0byBoYW5kbGUgcXVlcmllcyB3aGljaCBhcmUgdXNlZCBpbiBzdXBlciBjbGFzc2VzIHRocm91Z2ggZGVyaXZlZFxuICAgIC8vIGFic3RyYWN0IG1ldGhvZCBkZWNsYXJhdGlvbnMuXG4gICAgaWYgKGNsYXNzTWV0YWRhdGEuc3VwZXJDbGFzcykge1xuICAgICAgY29uc3Qgc3VwZXJDbGFzc0RlY2wgPSBjbGFzc01ldGFkYXRhLnN1cGVyQ2xhc3M7XG5cbiAgICAgIC8vIFVwZGF0ZSB0aGUgZnVuY3Rpb24gY29udGV4dCB0byBtYXAgYWJzdHJhY3QgZGVjbGFyYXRpb24gbm9kZXMgdG8gdGhlaXIgaW1wbGVtZW50YXRpb25cbiAgICAgIC8vIG5vZGUgaW4gdGhlIGJhc2UgY2xhc3MuIFRoaXMgZW5zdXJlcyB0aGF0IHRoZSBkZWNsYXJhdGlvbiB1c2FnZSB2aXNpdG9yIGNhbiBhbmFseXplXG4gICAgICAvLyBhYnN0cmFjdCBjbGFzcyBtZW1iZXIgZGVjbGFyYXRpb25zLlxuICAgICAgdXBkYXRlU3VwZXJDbGFzc0Fic3RyYWN0TWVtYmVyc0NvbnRleHQoY2xhc3NEZWNsLCBmdW5jdGlvbkN0eCwgdGhpcy5jbGFzc01ldGFkYXRhKTtcblxuICAgICAgdXNhZ2UgPSBjb21iaW5lUmVzb2x2ZWRVc2FnZShcbiAgICAgICAgICB1c2FnZSwgdGhpcy5hbmFseXplUXVlcnlVc2FnZShzdXBlckNsYXNzRGVjbCwgcXVlcnksIFtdLCBmdW5jdGlvbkN0eCwgZmFsc2UpKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdXNhZ2U7XG4gIH1cbn1cblxuLyoqXG4gKiBDb21iaW5lcyB0d28gcmVzb2x2ZWQgdXNhZ2VzIGJhc2VkIG9uIGEgZml4ZWQgcHJpb3JpdHkuIFwiU3luY2hyb25vdXNcIiB0YWtlc1xuICogcHJlY2VkZW5jZSBvdmVyIFwiQW1iaWd1b3VzXCIgd2hlcmVhcyBhbWJpZ3VvdXMgdGFrZXMgcHJlY2VkZW5jZSBvdmVyIFwiQXN5bmNocm9ub3VzXCIuXG4gKi9cbmZ1bmN0aW9uIGNvbWJpbmVSZXNvbHZlZFVzYWdlKGJhc2U6IFJlc29sdmVkVXNhZ2UsIHRhcmdldDogUmVzb2x2ZWRVc2FnZSk6IFJlc29sdmVkVXNhZ2Uge1xuICBpZiAoYmFzZSA9PT0gUmVzb2x2ZWRVc2FnZS5TWU5DSFJPTk9VUykge1xuICAgIHJldHVybiBiYXNlO1xuICB9IGVsc2UgaWYgKHRhcmdldCAhPT0gUmVzb2x2ZWRVc2FnZS5BU1lOQ0hST05PVVMpIHtcbiAgICByZXR1cm4gdGFyZ2V0O1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBSZXNvbHZlZFVzYWdlLkFTWU5DSFJPTk9VUztcbiAgfVxufVxuXG4vKipcbiAqIEZpbHRlcnMgYWxsIGNsYXNzIG1lbWJlcnMgZnJvbSB0aGUgY2xhc3MgZGVjbGFyYXRpb24gdGhhdCBjYW4gYWNjZXNzIHRoZVxuICogZ2l2ZW4gcXVlcnkgc3RhdGljYWxseSAoZS5nLiBuZ09uSW5pdCBsaWZlY3ljbGUgaG9vayBvciBASW5wdXQgc2V0dGVycylcbiAqL1xuZnVuY3Rpb24gZmlsdGVyUXVlcnlDbGFzc01lbWJlck5vZGVzKFxuICAgIGNsYXNzRGVjbDogdHMuQ2xhc3NEZWNsYXJhdGlvbiwgcXVlcnk6IE5nUXVlcnlEZWZpbml0aW9uLFxuICAgIGtub3duSW5wdXROYW1lczogc3RyaW5nW10pOiB0cy5CbG9ja1tdIHtcbiAgLy8gUmV0dXJucyBhbiBhcnJheSBvZiBUeXBlU2NyaXB0IG5vZGVzIHdoaWNoIGNhbiBjb250YWluIHVzYWdlcyBvZiB0aGUgZ2l2ZW4gcXVlcnlcbiAgLy8gaW4gb3JkZXIgdG8gYWNjZXNzIGl0IHN0YXRpY2FsbHkuIGUuZy5cbiAgLy8gICgxKSBxdWVyaWVzIHVzZWQgaW4gdGhlIFwibmdPbkluaXRcIiBsaWZlY3ljbGUgaG9vayBhcmUgc3RhdGljLlxuICAvLyAgKDIpIGlucHV0cyB3aXRoIHNldHRlcnMgY2FuIGFjY2VzcyBxdWVyaWVzIHN0YXRpY2FsbHkuXG4gIHJldHVybiBjbGFzc0RlY2wubWVtYmVyc1xuICAgICAgLmZpbHRlcihcbiAgICAgICAgICAobSk6XG4gICAgICAgICAgICAgIG0gaXModHMuU2V0QWNjZXNzb3JEZWNsYXJhdGlvbiB8IHRzLk1ldGhvZERlY2xhcmF0aW9uKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKHRzLmlzTWV0aG9kRGVjbGFyYXRpb24obSkgJiYgbS5ib2R5ICYmIGhhc1Byb3BlcnR5TmFtZVRleHQobS5uYW1lKSAmJlxuICAgICAgICAgICAgICAgICAgICBTVEFUSUNfUVVFUllfTElGRUNZQ0xFX0hPT0tTW3F1ZXJ5LnR5cGVdLmluZGV4T2YobS5uYW1lLnRleHQpICE9PSAtMSkge1xuICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgICAgICAgICAgICAga25vd25JbnB1dE5hbWVzICYmIHRzLmlzU2V0QWNjZXNzb3IobSkgJiYgbS5ib2R5ICYmXG4gICAgICAgICAgICAgICAgICAgIGhhc1Byb3BlcnR5TmFtZVRleHQobS5uYW1lKSAmJiBrbm93bklucHV0TmFtZXMuaW5kZXhPZihtLm5hbWUudGV4dCkgIT09IC0xKSB7XG4gICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICB9KVxuICAgICAgLm1hcChtZW1iZXIgPT4gbWVtYmVyLmJvZHkhKTtcbn1cbiJdfQ==
|
|
@@ -1,88 +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
|
-
import * as ts from 'typescript';
|
|
9
|
-
import { getPropertyNameText } from '../../utils/typescript/property_name';
|
|
10
|
-
import { QueryTiming } from './angular/query-definition';
|
|
11
|
-
const TODO_SPECIFY_COMMENT = 'TODO: add static flag';
|
|
12
|
-
const TODO_CHECK_COMMENT = 'TODO: check static flag';
|
|
13
|
-
/**
|
|
14
|
-
* Transforms the given query decorator by explicitly specifying the timing based on the
|
|
15
|
-
* determined timing. The updated decorator call expression node will be returned.
|
|
16
|
-
*/
|
|
17
|
-
export function getTransformedQueryCallExpr(query, timing, createTodo) {
|
|
18
|
-
const queryExpr = query.decorator.node.expression;
|
|
19
|
-
const queryArguments = queryExpr.arguments;
|
|
20
|
-
const queryPropertyAssignments = timing === null ?
|
|
21
|
-
[] :
|
|
22
|
-
[ts.createPropertyAssignment('static', timing === QueryTiming.STATIC ? ts.createTrue() : ts.createFalse())];
|
|
23
|
-
// If the query decorator is already called with two arguments, we need to
|
|
24
|
-
// keep the existing options untouched and just add the new property if possible.
|
|
25
|
-
if (queryArguments.length === 2) {
|
|
26
|
-
const existingOptions = queryArguments[1];
|
|
27
|
-
const existingOptionsText = existingOptions.getFullText();
|
|
28
|
-
const hasTodoComment = existingOptionsText.includes(TODO_SPECIFY_COMMENT) ||
|
|
29
|
-
existingOptionsText.includes(TODO_CHECK_COMMENT);
|
|
30
|
-
let newOptionsNode;
|
|
31
|
-
let failureMessage = null;
|
|
32
|
-
if (ts.isObjectLiteralExpression(existingOptions)) {
|
|
33
|
-
// In case the options already contains a property for the "static" flag,
|
|
34
|
-
// we just skip this query and leave it untouched.
|
|
35
|
-
if (existingOptions.properties.some(p => !!p.name && getPropertyNameText(p.name) === 'static')) {
|
|
36
|
-
return null;
|
|
37
|
-
}
|
|
38
|
-
newOptionsNode = ts.updateObjectLiteral(existingOptions, existingOptions.properties.concat(queryPropertyAssignments));
|
|
39
|
-
// In case we want to add a todo and the options do not have the todo
|
|
40
|
-
// yet, we add the query timing todo as synthetic multi-line comment.
|
|
41
|
-
if (createTodo && !hasTodoComment) {
|
|
42
|
-
addQueryTimingTodoToNode(newOptionsNode, timing === null);
|
|
43
|
-
}
|
|
44
|
-
}
|
|
45
|
-
else {
|
|
46
|
-
// In case the options query parameter is not an object literal expression, and
|
|
47
|
-
// we want to set the query timing, we just preserve the existing query parameter.
|
|
48
|
-
newOptionsNode = existingOptions;
|
|
49
|
-
// We always want to add a TODO in case the query options cannot be updated.
|
|
50
|
-
if (!hasTodoComment) {
|
|
51
|
-
addQueryTimingTodoToNode(existingOptions, true);
|
|
52
|
-
}
|
|
53
|
-
// If there is a new explicit timing that has been determined for the given query,
|
|
54
|
-
// we create a transformation failure message that shows developers that they need
|
|
55
|
-
// to set the query timing manually to the determined query timing.
|
|
56
|
-
if (timing !== null) {
|
|
57
|
-
failureMessage = 'Cannot update query to set explicit timing. Please manually ' +
|
|
58
|
-
`set the query timing to: "{static: ${(timing === QueryTiming.STATIC).toString()}}"`;
|
|
59
|
-
}
|
|
60
|
-
}
|
|
61
|
-
return {
|
|
62
|
-
failureMessage,
|
|
63
|
-
node: ts.updateCall(queryExpr, queryExpr.expression, queryExpr.typeArguments, [queryArguments[0], newOptionsNode])
|
|
64
|
-
};
|
|
65
|
-
}
|
|
66
|
-
const optionsNode = ts.createObjectLiteral(queryPropertyAssignments);
|
|
67
|
-
if (createTodo) {
|
|
68
|
-
addQueryTimingTodoToNode(optionsNode, timing === null);
|
|
69
|
-
}
|
|
70
|
-
return {
|
|
71
|
-
failureMessage: null,
|
|
72
|
-
node: ts.updateCall(queryExpr, queryExpr.expression, queryExpr.typeArguments, [queryArguments[0], optionsNode])
|
|
73
|
-
};
|
|
74
|
-
}
|
|
75
|
-
/**
|
|
76
|
-
* Adds a to-do to the given TypeScript node which reminds developers to specify
|
|
77
|
-
* an explicit query timing or to double-check the updated timing.
|
|
78
|
-
*/
|
|
79
|
-
function addQueryTimingTodoToNode(node, addSpecifyTimingTodo) {
|
|
80
|
-
ts.setSyntheticLeadingComments(node, [{
|
|
81
|
-
pos: -1,
|
|
82
|
-
end: -1,
|
|
83
|
-
hasTrailingNewLine: false,
|
|
84
|
-
kind: ts.SyntaxKind.MultiLineCommentTrivia,
|
|
85
|
-
text: ` ${addSpecifyTimingTodo ? TODO_SPECIFY_COMMENT : TODO_CHECK_COMMENT} `
|
|
86
|
-
}]);
|
|
87
|
-
}
|
|
88
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhbnNmb3JtLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vcGFja2FnZXMvY29yZS9zY2hlbWF0aWNzL21pZ3JhdGlvbnMvc3RhdGljLXF1ZXJpZXMvdHJhbnNmb3JtLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7R0FNRztBQUVILE9BQU8sS0FBSyxFQUFFLE1BQU0sWUFBWSxDQUFDO0FBQ2pDLE9BQU8sRUFBQyxtQkFBbUIsRUFBQyxNQUFNLHNDQUFzQyxDQUFDO0FBQ3pFLE9BQU8sRUFBb0IsV0FBVyxFQUFDLE1BQU0sNEJBQTRCLENBQUM7QUFTMUUsTUFBTSxvQkFBb0IsR0FBRyx1QkFBdUIsQ0FBQztBQUNyRCxNQUFNLGtCQUFrQixHQUFHLHlCQUF5QixDQUFDO0FBRXJEOzs7R0FHRztBQUNILE1BQU0sVUFBVSwyQkFBMkIsQ0FDdkMsS0FBd0IsRUFBRSxNQUF3QixFQUNsRCxVQUFtQjtJQUNyQixNQUFNLFNBQVMsR0FBRyxLQUFLLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUM7SUFDbEQsTUFBTSxjQUFjLEdBQUcsU0FBUyxDQUFDLFNBQVMsQ0FBQztJQUMzQyxNQUFNLHdCQUF3QixHQUFHLE1BQU0sS0FBSyxJQUFJLENBQUMsQ0FBQztRQUM5QyxFQUFFLENBQUMsQ0FBQztRQUNKLENBQUMsRUFBRSxDQUFDLHdCQUF3QixDQUN4QixRQUFRLEVBQUUsTUFBTSxLQUFLLFdBQVcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxVQUFVLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLFdBQVcsRUFBRSxDQUFDLENBQUMsQ0FBQztJQUV2RiwwRUFBMEU7SUFDMUUsaUZBQWlGO0lBQ2pGLElBQUksY0FBYyxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUU7UUFDL0IsTUFBTSxlQUFlLEdBQUcsY0FBYyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzFDLE1BQU0sbUJBQW1CLEdBQUcsZUFBZSxDQUFDLFdBQVcsRUFBRSxDQUFDO1FBQzFELE1BQU0sY0FBYyxHQUFHLG1CQUFtQixDQUFDLFFBQVEsQ0FBQyxvQkFBb0IsQ0FBQztZQUNyRSxtQkFBbUIsQ0FBQyxRQUFRLENBQUMsa0JBQWtCLENBQUMsQ0FBQztRQUNyRCxJQUFJLGNBQTZCLENBQUM7UUFDbEMsSUFBSSxjQUFjLEdBQWdCLElBQUksQ0FBQztRQUV2QyxJQUFJLEVBQUUsQ0FBQyx5QkFBeUIsQ0FBQyxlQUFlLENBQUMsRUFBRTtZQUNqRCx5RUFBeUU7WUFDekUsa0RBQWtEO1lBQ2xELElBQUksZUFBZSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQzNCLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLElBQUksbUJBQW1CLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLFFBQVEsQ0FBQyxFQUFFO2dCQUNsRSxPQUFPLElBQUksQ0FBQzthQUNiO1lBRUQsY0FBYyxHQUFHLEVBQUUsQ0FBQyxtQkFBbUIsQ0FDbkMsZUFBZSxFQUFFLGVBQWUsQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLHdCQUF3QixDQUFDLENBQUMsQ0FBQztZQUVsRixxRUFBcUU7WUFDckUscUVBQXFFO1lBQ3JFLElBQUksVUFBVSxJQUFJLENBQUMsY0FBYyxFQUFFO2dCQUNqQyx3QkFBd0IsQ0FBQyxjQUFjLEVBQUUsTUFBTSxLQUFLLElBQUksQ0FBQyxDQUFDO2FBQzNEO1NBQ0Y7YUFBTTtZQUNMLCtFQUErRTtZQUMvRSxrRkFBa0Y7WUFDbEYsY0FBYyxHQUFHLGVBQWUsQ0FBQztZQUNqQyw0RUFBNEU7WUFDNUUsSUFBSSxDQUFDLGNBQWMsRUFBRTtnQkFDbkIsd0JBQXdCLENBQUMsZUFBZSxFQUFFLElBQUksQ0FBQyxDQUFDO2FBQ2pEO1lBQ0Qsa0ZBQWtGO1lBQ2xGLGtGQUFrRjtZQUNsRixtRUFBbUU7WUFDbkUsSUFBSSxNQUFNLEtBQUssSUFBSSxFQUFFO2dCQUNuQixjQUFjLEdBQUcsOERBQThEO29CQUMzRSxzQ0FBc0MsQ0FBQyxNQUFNLEtBQUssV0FBVyxDQUFDLE1BQU0sQ0FBQyxDQUFDLFFBQVEsRUFBRSxJQUFJLENBQUM7YUFDMUY7U0FDRjtRQUVELE9BQU87WUFDTCxjQUFjO1lBQ2QsSUFBSSxFQUFFLEVBQUUsQ0FBQyxVQUFVLENBQ2YsU0FBUyxFQUFFLFNBQVMsQ0FBQyxVQUFVLEVBQUUsU0FBUyxDQUFDLGFBQWEsRUFDeEQsQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLEVBQUUsY0FBZSxDQUFDLENBQUM7U0FDMUMsQ0FBQztLQUNIO0lBRUQsTUFBTSxXQUFXLEdBQUcsRUFBRSxDQUFDLG1CQUFtQixDQUFDLHdCQUF3QixDQUFDLENBQUM7SUFFckUsSUFBSSxVQUFVLEVBQUU7UUFDZCx3QkFBd0IsQ0FBQyxXQUFXLEVBQUUsTUFBTSxLQUFLLElBQUksQ0FBQyxDQUFDO0tBQ3hEO0lBRUQsT0FBTztRQUNMLGNBQWMsRUFBRSxJQUFJO1FBQ3BCLElBQUksRUFBRSxFQUFFLENBQUMsVUFBVSxDQUNmLFNBQVMsRUFBRSxTQUFTLENBQUMsVUFBVSxFQUFFLFNBQVMsQ0FBQyxhQUFhLEVBQUUsQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLEVBQUUsV0FBVyxDQUFDLENBQUM7S0FDaEcsQ0FBQztBQUNKLENBQUM7QUFFRDs7O0dBR0c7QUFDSCxTQUFTLHdCQUF3QixDQUFDLElBQWEsRUFBRSxvQkFBNkI7SUFDNUUsRUFBRSxDQUFDLDJCQUEyQixDQUMxQixJQUFJLEVBQUUsQ0FBQztZQUNMLEdBQUcsRUFBRSxDQUFDLENBQUM7WUFDUCxHQUFHLEVBQUUsQ0FBQyxDQUFDO1lBQ1Asa0JBQWtCLEVBQUUsS0FBSztZQUN6QixJQUFJLEVBQUUsRUFBRSxDQUFDLFVBQVUsQ0FBQyxzQkFBc0I7WUFDMUMsSUFBSSxFQUFFLElBQUksb0JBQW9CLENBQUMsQ0FBQyxDQUFDLG9CQUFvQixDQUFDLENBQUMsQ0FBQyxrQkFBa0IsR0FBRztTQUM5RSxDQUFDLENBQUMsQ0FBQztBQUNWLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgR29vZ2xlIExMQyBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICpcbiAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlXG4gKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlXG4gKi9cblxuaW1wb3J0ICogYXMgdHMgZnJvbSAndHlwZXNjcmlwdCc7XG5pbXBvcnQge2dldFByb3BlcnR5TmFtZVRleHR9IGZyb20gJy4uLy4uL3V0aWxzL3R5cGVzY3JpcHQvcHJvcGVydHlfbmFtZSc7XG5pbXBvcnQge05nUXVlcnlEZWZpbml0aW9uLCBRdWVyeVRpbWluZ30gZnJvbSAnLi9hbmd1bGFyL3F1ZXJ5LWRlZmluaXRpb24nO1xuXG5leHBvcnQgdHlwZSBUcmFuc2Zvcm1lZFF1ZXJ5UmVzdWx0ID0gbnVsbHx7XG4gIC8qKiBUcmFuc2Zvcm1lZCBjYWxsIGV4cHJlc3Npb24uICovXG4gIG5vZGU6IHRzLkNhbGxFeHByZXNzaW9uO1xuICAvKiogRmFpbHVyZSBtZXNzYWdlIHdoaWNoIGlzIHNldCB3aGVuIHRoZSBxdWVyeSBjb3VsZCBub3QgYmUgdHJhbnNmb3JtZWQgc3VjY2Vzc2Z1bGx5LiAqL1xuICBmYWlsdXJlTWVzc2FnZTogc3RyaW5nfG51bGw7XG59O1xuXG5jb25zdCBUT0RPX1NQRUNJRllfQ09NTUVOVCA9ICdUT0RPOiBhZGQgc3RhdGljIGZsYWcnO1xuY29uc3QgVE9ET19DSEVDS19DT01NRU5UID0gJ1RPRE86IGNoZWNrIHN0YXRpYyBmbGFnJztcblxuLyoqXG4gKiBUcmFuc2Zvcm1zIHRoZSBnaXZlbiBxdWVyeSBkZWNvcmF0b3IgYnkgZXhwbGljaXRseSBzcGVjaWZ5aW5nIHRoZSB0aW1pbmcgYmFzZWQgb24gdGhlXG4gKiBkZXRlcm1pbmVkIHRpbWluZy4gVGhlIHVwZGF0ZWQgZGVjb3JhdG9yIGNhbGwgZXhwcmVzc2lvbiBub2RlIHdpbGwgYmUgcmV0dXJuZWQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRUcmFuc2Zvcm1lZFF1ZXJ5Q2FsbEV4cHIoXG4gICAgcXVlcnk6IE5nUXVlcnlEZWZpbml0aW9uLCB0aW1pbmc6IFF1ZXJ5VGltaW5nfG51bGwsXG4gICAgY3JlYXRlVG9kbzogYm9vbGVhbik6IFRyYW5zZm9ybWVkUXVlcnlSZXN1bHQge1xuICBjb25zdCBxdWVyeUV4cHIgPSBxdWVyeS5kZWNvcmF0b3Iubm9kZS5leHByZXNzaW9uO1xuICBjb25zdCBxdWVyeUFyZ3VtZW50cyA9IHF1ZXJ5RXhwci5hcmd1bWVudHM7XG4gIGNvbnN0IHF1ZXJ5UHJvcGVydHlBc3NpZ25tZW50cyA9IHRpbWluZyA9PT0gbnVsbCA/XG4gICAgICBbXSA6XG4gICAgICBbdHMuY3JlYXRlUHJvcGVydHlBc3NpZ25tZW50KFxuICAgICAgICAgICdzdGF0aWMnLCB0aW1pbmcgPT09IFF1ZXJ5VGltaW5nLlNUQVRJQyA/IHRzLmNyZWF0ZVRydWUoKSA6IHRzLmNyZWF0ZUZhbHNlKCkpXTtcblxuICAvLyBJZiB0aGUgcXVlcnkgZGVjb3JhdG9yIGlzIGFscmVhZHkgY2FsbGVkIHdpdGggdHdvIGFyZ3VtZW50cywgd2UgbmVlZCB0b1xuICAvLyBrZWVwIHRoZSBleGlzdGluZyBvcHRpb25zIHVudG91Y2hlZCBhbmQganVzdCBhZGQgdGhlIG5ldyBwcm9wZXJ0eSBpZiBwb3NzaWJsZS5cbiAgaWYgKHF1ZXJ5QXJndW1lbnRzLmxlbmd0aCA9PT0gMikge1xuICAgIGNvbnN0IGV4aXN0aW5nT3B0aW9ucyA9IHF1ZXJ5QXJndW1lbnRzWzFdO1xuICAgIGNvbnN0IGV4aXN0aW5nT3B0aW9uc1RleHQgPSBleGlzdGluZ09wdGlvbnMuZ2V0RnVsbFRleHQoKTtcbiAgICBjb25zdCBoYXNUb2RvQ29tbWVudCA9IGV4aXN0aW5nT3B0aW9uc1RleHQuaW5jbHVkZXMoVE9ET19TUEVDSUZZX0NPTU1FTlQpIHx8XG4gICAgICAgIGV4aXN0aW5nT3B0aW9uc1RleHQuaW5jbHVkZXMoVE9ET19DSEVDS19DT01NRU5UKTtcbiAgICBsZXQgbmV3T3B0aW9uc05vZGU6IHRzLkV4cHJlc3Npb247XG4gICAgbGV0IGZhaWx1cmVNZXNzYWdlOiBzdHJpbmd8bnVsbCA9IG51bGw7XG5cbiAgICBpZiAodHMuaXNPYmplY3RMaXRlcmFsRXhwcmVzc2lvbihleGlzdGluZ09wdGlvbnMpKSB7XG4gICAgICAvLyBJbiBjYXNlIHRoZSBvcHRpb25zIGFscmVhZHkgY29udGFpbnMgYSBwcm9wZXJ0eSBmb3IgdGhlIFwic3RhdGljXCIgZmxhZyxcbiAgICAgIC8vIHdlIGp1c3Qgc2tpcCB0aGlzIHF1ZXJ5IGFuZCBsZWF2ZSBpdCB1bnRvdWNoZWQuXG4gICAgICBpZiAoZXhpc3RpbmdPcHRpb25zLnByb3BlcnRpZXMuc29tZShcbiAgICAgICAgICAgICAgcCA9PiAhIXAubmFtZSAmJiBnZXRQcm9wZXJ0eU5hbWVUZXh0KHAubmFtZSkgPT09ICdzdGF0aWMnKSkge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cblxuICAgICAgbmV3T3B0aW9uc05vZGUgPSB0cy51cGRhdGVPYmplY3RMaXRlcmFsKFxuICAgICAgICAgIGV4aXN0aW5nT3B0aW9ucywgZXhpc3RpbmdPcHRpb25zLnByb3BlcnRpZXMuY29uY2F0KHF1ZXJ5UHJvcGVydHlBc3NpZ25tZW50cykpO1xuXG4gICAgICAvLyBJbiBjYXNlIHdlIHdhbnQgdG8gYWRkIGEgdG9kbyBhbmQgdGhlIG9wdGlvbnMgZG8gbm90IGhhdmUgdGhlIHRvZG9cbiAgICAgIC8vIHlldCwgd2UgYWRkIHRoZSBxdWVyeSB0aW1pbmcgdG9kbyBhcyBzeW50aGV0aWMgbXVsdGktbGluZSBjb21tZW50LlxuICAgICAgaWYgKGNyZWF0ZVRvZG8gJiYgIWhhc1RvZG9Db21tZW50KSB7XG4gICAgICAgIGFkZFF1ZXJ5VGltaW5nVG9kb1RvTm9kZShuZXdPcHRpb25zTm9kZSwgdGltaW5nID09PSBudWxsKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgLy8gSW4gY2FzZSB0aGUgb3B0aW9ucyBxdWVyeSBwYXJhbWV0ZXIgaXMgbm90IGFuIG9iamVjdCBsaXRlcmFsIGV4cHJlc3Npb24sIGFuZFxuICAgICAgLy8gd2Ugd2FudCB0byBzZXQgdGhlIHF1ZXJ5IHRpbWluZywgd2UganVzdCBwcmVzZXJ2ZSB0aGUgZXhpc3RpbmcgcXVlcnkgcGFyYW1ldGVyLlxuICAgICAgbmV3T3B0aW9uc05vZGUgPSBleGlzdGluZ09wdGlvbnM7XG4gICAgICAvLyBXZSBhbHdheXMgd2FudCB0byBhZGQgYSBUT0RPIGluIGNhc2UgdGhlIHF1ZXJ5IG9wdGlvbnMgY2Fubm90IGJlIHVwZGF0ZWQuXG4gICAgICBpZiAoIWhhc1RvZG9Db21tZW50KSB7XG4gICAgICAgIGFkZFF1ZXJ5VGltaW5nVG9kb1RvTm9kZShleGlzdGluZ09wdGlvbnMsIHRydWUpO1xuICAgICAgfVxuICAgICAgLy8gSWYgdGhlcmUgaXMgYSBuZXcgZXhwbGljaXQgdGltaW5nIHRoYXQgaGFzIGJlZW4gZGV0ZXJtaW5lZCBmb3IgdGhlIGdpdmVuIHF1ZXJ5LFxuICAgICAgLy8gd2UgY3JlYXRlIGEgdHJhbnNmb3JtYXRpb24gZmFpbHVyZSBtZXNzYWdlIHRoYXQgc2hvd3MgZGV2ZWxvcGVycyB0aGF0IHRoZXkgbmVlZFxuICAgICAgLy8gdG8gc2V0IHRoZSBxdWVyeSB0aW1pbmcgbWFudWFsbHkgdG8gdGhlIGRldGVybWluZWQgcXVlcnkgdGltaW5nLlxuICAgICAgaWYgKHRpbWluZyAhPT0gbnVsbCkge1xuICAgICAgICBmYWlsdXJlTWVzc2FnZSA9ICdDYW5ub3QgdXBkYXRlIHF1ZXJ5IHRvIHNldCBleHBsaWNpdCB0aW1pbmcuIFBsZWFzZSBtYW51YWxseSAnICtcbiAgICAgICAgICAgIGBzZXQgdGhlIHF1ZXJ5IHRpbWluZyB0bzogXCJ7c3RhdGljOiAkeyh0aW1pbmcgPT09IFF1ZXJ5VGltaW5nLlNUQVRJQykudG9TdHJpbmcoKX19XCJgO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICBmYWlsdXJlTWVzc2FnZSxcbiAgICAgIG5vZGU6IHRzLnVwZGF0ZUNhbGwoXG4gICAgICAgICAgcXVlcnlFeHByLCBxdWVyeUV4cHIuZXhwcmVzc2lvbiwgcXVlcnlFeHByLnR5cGVBcmd1bWVudHMsXG4gICAgICAgICAgW3F1ZXJ5QXJndW1lbnRzWzBdLCBuZXdPcHRpb25zTm9kZSFdKVxuICAgIH07XG4gIH1cblxuICBjb25zdCBvcHRpb25zTm9kZSA9IHRzLmNyZWF0ZU9iamVjdExpdGVyYWwocXVlcnlQcm9wZXJ0eUFzc2lnbm1lbnRzKTtcblxuICBpZiAoY3JlYXRlVG9kbykge1xuICAgIGFkZFF1ZXJ5VGltaW5nVG9kb1RvTm9kZShvcHRpb25zTm9kZSwgdGltaW5nID09PSBudWxsKTtcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgZmFpbHVyZU1lc3NhZ2U6IG51bGwsXG4gICAgbm9kZTogdHMudXBkYXRlQ2FsbChcbiAgICAgICAgcXVlcnlFeHByLCBxdWVyeUV4cHIuZXhwcmVzc2lvbiwgcXVlcnlFeHByLnR5cGVBcmd1bWVudHMsIFtxdWVyeUFyZ3VtZW50c1swXSwgb3B0aW9uc05vZGVdKVxuICB9O1xufVxuXG4vKipcbiAqIEFkZHMgYSB0by1kbyB0byB0aGUgZ2l2ZW4gVHlwZVNjcmlwdCBub2RlIHdoaWNoIHJlbWluZHMgZGV2ZWxvcGVycyB0byBzcGVjaWZ5XG4gKiBhbiBleHBsaWNpdCBxdWVyeSB0aW1pbmcgb3IgdG8gZG91YmxlLWNoZWNrIHRoZSB1cGRhdGVkIHRpbWluZy5cbiAqL1xuZnVuY3Rpb24gYWRkUXVlcnlUaW1pbmdUb2RvVG9Ob2RlKG5vZGU6IHRzLk5vZGUsIGFkZFNwZWNpZnlUaW1pbmdUb2RvOiBib29sZWFuKSB7XG4gIHRzLnNldFN5bnRoZXRpY0xlYWRpbmdDb21tZW50cyhcbiAgICAgIG5vZGUsIFt7XG4gICAgICAgIHBvczogLTEsXG4gICAgICAgIGVuZDogLTEsXG4gICAgICAgIGhhc1RyYWlsaW5nTmV3TGluZTogZmFsc2UsXG4gICAgICAgIGtpbmQ6IHRzLlN5bnRheEtpbmQuTXVsdGlMaW5lQ29tbWVudFRyaXZpYSxcbiAgICAgICAgdGV4dDogYCAke2FkZFNwZWNpZnlUaW1pbmdUb2RvID8gVE9ET19TUEVDSUZZX0NPTU1FTlQgOiBUT0RPX0NIRUNLX0NPTU1FTlR9IGBcbiAgICAgIH1dKTtcbn1cbiJdfQ==
|
|
@@ -1,25 +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
|
-
import { visitAll } from '@angular/compiler/src/render3/r3_ast';
|
|
9
|
-
import { parseHtmlGracefully } from '../../utils/parse_html';
|
|
10
|
-
import { HtmlVariableAssignmentVisitor } from './angular/html_variable_assignment_visitor';
|
|
11
|
-
/**
|
|
12
|
-
* Analyzes a given resolved template by looking for property assignments to local
|
|
13
|
-
* template variables within bound events.
|
|
14
|
-
*/
|
|
15
|
-
export function analyzeResolvedTemplate(template) {
|
|
16
|
-
const templateNodes = parseHtmlGracefully(template.content, template.filePath);
|
|
17
|
-
if (!templateNodes) {
|
|
18
|
-
return null;
|
|
19
|
-
}
|
|
20
|
-
const visitor = new HtmlVariableAssignmentVisitor();
|
|
21
|
-
// Analyze the Angular Render3 HTML AST and collect all template variable assignments.
|
|
22
|
-
visitAll(visitor, templateNodes);
|
|
23
|
-
return visitor.variableAssignments.map(({ node, start, end }) => ({ node, start: start + node.span.start, end }));
|
|
24
|
-
}
|
|
25
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYW5hbHl6ZV90ZW1wbGF0ZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL3BhY2thZ2VzL2NvcmUvc2NoZW1hdGljcy9taWdyYXRpb25zL3RlbXBsYXRlLXZhci1hc3NpZ25tZW50L2FuYWx5emVfdGVtcGxhdGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7OztHQU1HO0FBR0gsT0FBTyxFQUFDLFFBQVEsRUFBQyxNQUFNLHNDQUFzQyxDQUFDO0FBRTlELE9BQU8sRUFBQyxtQkFBbUIsRUFBQyxNQUFNLHdCQUF3QixDQUFDO0FBQzNELE9BQU8sRUFBQyw2QkFBNkIsRUFBQyxNQUFNLDRDQUE0QyxDQUFDO0FBUXpGOzs7R0FHRztBQUNILE1BQU0sVUFBVSx1QkFBdUIsQ0FBQyxRQUEwQjtJQUVoRSxNQUFNLGFBQWEsR0FBRyxtQkFBbUIsQ0FBQyxRQUFRLENBQUMsT0FBTyxFQUFFLFFBQVEsQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUUvRSxJQUFJLENBQUMsYUFBYSxFQUFFO1FBQ2xCLE9BQU8sSUFBSSxDQUFDO0tBQ2I7SUFFRCxNQUFNLE9BQU8sR0FBRyxJQUFJLDZCQUE2QixFQUFFLENBQUM7SUFFcEQsc0ZBQXNGO0lBQ3RGLFFBQVEsQ0FBQyxPQUFPLEVBQUUsYUFBYSxDQUFDLENBQUM7SUFFakMsT0FBTyxPQUFPLENBQUMsbUJBQW1CLENBQUMsR0FBRyxDQUNsQyxDQUFDLEVBQUMsSUFBSSxFQUFFLEtBQUssRUFBRSxHQUFHLEVBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFDLElBQUksRUFBRSxLQUFLLEVBQUUsS0FBSyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLEdBQUcsRUFBQyxDQUFDLENBQUMsQ0FBQztBQUM3RSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IEdvb2dsZSBMTEMgQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqXG4gKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZVxuICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZVxuICovXG5cbmltcG9ydCB7UHJvcGVydHlXcml0ZX0gZnJvbSAnQGFuZ3VsYXIvY29tcGlsZXInO1xuaW1wb3J0IHt2aXNpdEFsbH0gZnJvbSAnQGFuZ3VsYXIvY29tcGlsZXIvc3JjL3JlbmRlcjMvcjNfYXN0JztcbmltcG9ydCB7UmVzb2x2ZWRUZW1wbGF0ZX0gZnJvbSAnLi4vLi4vdXRpbHMvbmdfY29tcG9uZW50X3RlbXBsYXRlJztcbmltcG9ydCB7cGFyc2VIdG1sR3JhY2VmdWxseX0gZnJvbSAnLi4vLi4vdXRpbHMvcGFyc2VfaHRtbCc7XG5pbXBvcnQge0h0bWxWYXJpYWJsZUFzc2lnbm1lbnRWaXNpdG9yfSBmcm9tICcuL2FuZ3VsYXIvaHRtbF92YXJpYWJsZV9hc3NpZ25tZW50X3Zpc2l0b3InO1xuXG5leHBvcnQgaW50ZXJmYWNlIFRlbXBsYXRlVmFyaWFibGVBc3NpZ25tZW50IHtcbiAgbm9kZTogUHJvcGVydHlXcml0ZTtcbiAgc3RhcnQ6IG51bWJlcjtcbiAgZW5kOiBudW1iZXI7XG59XG5cbi8qKlxuICogQW5hbHl6ZXMgYSBnaXZlbiByZXNvbHZlZCB0ZW1wbGF0ZSBieSBsb29raW5nIGZvciBwcm9wZXJ0eSBhc3NpZ25tZW50cyB0byBsb2NhbFxuICogdGVtcGxhdGUgdmFyaWFibGVzIHdpdGhpbiBib3VuZCBldmVudHMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhbmFseXplUmVzb2x2ZWRUZW1wbGF0ZSh0ZW1wbGF0ZTogUmVzb2x2ZWRUZW1wbGF0ZSk6IFRlbXBsYXRlVmFyaWFibGVBc3NpZ25tZW50W118XG4gICAgbnVsbCB7XG4gIGNvbnN0IHRlbXBsYXRlTm9kZXMgPSBwYXJzZUh0bWxHcmFjZWZ1bGx5KHRlbXBsYXRlLmNvbnRlbnQsIHRlbXBsYXRlLmZpbGVQYXRoKTtcblxuICBpZiAoIXRlbXBsYXRlTm9kZXMpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIGNvbnN0IHZpc2l0b3IgPSBuZXcgSHRtbFZhcmlhYmxlQXNzaWdubWVudFZpc2l0b3IoKTtcblxuICAvLyBBbmFseXplIHRoZSBBbmd1bGFyIFJlbmRlcjMgSFRNTCBBU1QgYW5kIGNvbGxlY3QgYWxsIHRlbXBsYXRlIHZhcmlhYmxlIGFzc2lnbm1lbnRzLlxuICB2aXNpdEFsbCh2aXNpdG9yLCB0ZW1wbGF0ZU5vZGVzKTtcblxuICByZXR1cm4gdmlzaXRvci52YXJpYWJsZUFzc2lnbm1lbnRzLm1hcChcbiAgICAgICh7bm9kZSwgc3RhcnQsIGVuZH0pID0+ICh7bm9kZSwgc3RhcnQ6IHN0YXJ0ICsgbm9kZS5zcGFuLnN0YXJ0LCBlbmR9KSk7XG59XG4iXX0=
|
package/schematics/migrations/template-var-assignment/angular/html_variable_assignment_visitor.mjs
DELETED
|
@@ -1,65 +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
|
-
import { ImplicitReceiver, RecursiveAstVisitor } from '@angular/compiler';
|
|
9
|
-
import { NullVisitor, visitAll } from '@angular/compiler/src/render3/r3_ast';
|
|
10
|
-
/**
|
|
11
|
-
* HTML AST visitor that traverses the Render3 HTML AST in order to find all
|
|
12
|
-
* expressions that write to local template variables within bound events.
|
|
13
|
-
*/
|
|
14
|
-
export class HtmlVariableAssignmentVisitor extends NullVisitor {
|
|
15
|
-
constructor() {
|
|
16
|
-
super(...arguments);
|
|
17
|
-
this.variableAssignments = [];
|
|
18
|
-
this.currentVariables = [];
|
|
19
|
-
this.expressionAstVisitor = new ExpressionAstVisitor(this.variableAssignments, this.currentVariables);
|
|
20
|
-
}
|
|
21
|
-
visitElement(element) {
|
|
22
|
-
visitAll(this, element.outputs);
|
|
23
|
-
visitAll(this, element.children);
|
|
24
|
-
}
|
|
25
|
-
visitTemplate(template) {
|
|
26
|
-
// Keep track of the template variables which can be accessed by the template
|
|
27
|
-
// child nodes through the implicit receiver.
|
|
28
|
-
this.currentVariables.push(...template.variables);
|
|
29
|
-
// Visit all children of the template. The template proxies the outputs of the
|
|
30
|
-
// immediate child elements, so we just ignore outputs on the "Template" in order
|
|
31
|
-
// to not visit similar bound events twice.
|
|
32
|
-
visitAll(this, template.children);
|
|
33
|
-
// Remove all previously added variables since all children that could access
|
|
34
|
-
// these have been visited already.
|
|
35
|
-
template.variables.forEach(v => {
|
|
36
|
-
const variableIdx = this.currentVariables.indexOf(v);
|
|
37
|
-
if (variableIdx !== -1) {
|
|
38
|
-
this.currentVariables.splice(variableIdx, 1);
|
|
39
|
-
}
|
|
40
|
-
});
|
|
41
|
-
}
|
|
42
|
-
visitBoundEvent(node) {
|
|
43
|
-
node.handler.visit(this.expressionAstVisitor, node.handlerSpan);
|
|
44
|
-
}
|
|
45
|
-
}
|
|
46
|
-
/** AST visitor that resolves all variable assignments within a given expression AST. */
|
|
47
|
-
class ExpressionAstVisitor extends RecursiveAstVisitor {
|
|
48
|
-
constructor(variableAssignments, currentVariables) {
|
|
49
|
-
super();
|
|
50
|
-
this.variableAssignments = variableAssignments;
|
|
51
|
-
this.currentVariables = currentVariables;
|
|
52
|
-
}
|
|
53
|
-
visitPropertyWrite(node, span) {
|
|
54
|
-
if (node.receiver instanceof ImplicitReceiver &&
|
|
55
|
-
this.currentVariables.some(v => v.name === node.name)) {
|
|
56
|
-
this.variableAssignments.push({
|
|
57
|
-
node: node,
|
|
58
|
-
start: span.start.offset,
|
|
59
|
-
end: span.end.offset,
|
|
60
|
-
});
|
|
61
|
-
}
|
|
62
|
-
super.visitPropertyWrite(node, span);
|
|
63
|
-
}
|
|
64
|
-
}
|
|
65
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaHRtbF92YXJpYWJsZV9hc3NpZ25tZW50X3Zpc2l0b3IuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9jb3JlL3NjaGVtYXRpY3MvbWlncmF0aW9ucy90ZW1wbGF0ZS12YXItYXNzaWdubWVudC9hbmd1bGFyL2h0bWxfdmFyaWFibGVfYXNzaWdubWVudF92aXNpdG9yLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7R0FNRztBQUVILE9BQU8sRUFBQyxnQkFBZ0IsRUFBa0MsbUJBQW1CLEVBQUMsTUFBTSxtQkFBbUIsQ0FBQztBQUN4RyxPQUFPLEVBQXNCLFdBQVcsRUFBc0IsUUFBUSxFQUFDLE1BQU0sc0NBQXNDLENBQUM7QUFRcEg7OztHQUdHO0FBQ0gsTUFBTSxPQUFPLDZCQUE4QixTQUFRLFdBQVc7SUFBOUQ7O1FBQ0Usd0JBQW1CLEdBQWlDLEVBQUUsQ0FBQztRQUUvQyxxQkFBZ0IsR0FBZSxFQUFFLENBQUM7UUFDbEMseUJBQW9CLEdBQ3hCLElBQUksb0JBQW9CLENBQUMsSUFBSSxDQUFDLG1CQUFtQixFQUFFLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO0lBK0JoRixDQUFDO0lBN0JDLFlBQVksQ0FBQyxPQUFnQjtRQUMzQixRQUFRLENBQUMsSUFBSSxFQUFFLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUNoQyxRQUFRLENBQUMsSUFBSSxFQUFFLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUNuQyxDQUFDO0lBRUQsYUFBYSxDQUFDLFFBQWtCO1FBQzlCLDZFQUE2RTtRQUM3RSw2Q0FBNkM7UUFDN0MsSUFBSSxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxHQUFHLFFBQVEsQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUVsRCw4RUFBOEU7UUFDOUUsaUZBQWlGO1FBQ2pGLDJDQUEyQztRQUMzQyxRQUFRLENBQUMsSUFBSSxFQUFFLFFBQVEsQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUVsQyw2RUFBNkU7UUFDN0UsbUNBQW1DO1FBQ25DLFFBQVEsQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFO1lBQzdCLE1BQU0sV0FBVyxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFFckQsSUFBSSxXQUFXLEtBQUssQ0FBQyxDQUFDLEVBQUU7Z0JBQ3RCLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxNQUFNLENBQUMsV0FBVyxFQUFFLENBQUMsQ0FBQyxDQUFDO2FBQzlDO1FBQ0gsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQsZUFBZSxDQUFDLElBQWdCO1FBQzlCLElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxvQkFBb0IsRUFBRSxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUM7SUFDbEUsQ0FBQztDQUNGO0FBRUQsd0ZBQXdGO0FBQ3hGLE1BQU0sb0JBQXFCLFNBQVEsbUJBQW1CO0lBQ3BELFlBQ1ksbUJBQWlELEVBQ2pELGdCQUE0QjtRQUN0QyxLQUFLLEVBQUUsQ0FBQztRQUZFLHdCQUFtQixHQUFuQixtQkFBbUIsQ0FBOEI7UUFDakQscUJBQWdCLEdBQWhCLGdCQUFnQixDQUFZO0lBRXhDLENBQUM7SUFFRCxrQkFBa0IsQ0FBQyxJQUFtQixFQUFFLElBQXFCO1FBQzNELElBQUksSUFBSSxDQUFDLFFBQVEsWUFBWSxnQkFBZ0I7WUFDekMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLEtBQUssSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFO1lBQ3pELElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxJQUFJLENBQUM7Z0JBQzVCLElBQUksRUFBRSxJQUFJO2dCQUNWLEtBQUssRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU07Z0JBQ3hCLEdBQUcsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLE1BQU07YUFDckIsQ0FBQyxDQUFDO1NBQ0o7UUFDRCxLQUFLLENBQUMsa0JBQWtCLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDO0lBQ3ZDLENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCBHb29nbGUgTExDIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKlxuICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmVcbiAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2VcbiAqL1xuXG5pbXBvcnQge0ltcGxpY2l0UmVjZWl2ZXIsIFBhcnNlU291cmNlU3BhbiwgUHJvcGVydHlXcml0ZSwgUmVjdXJzaXZlQXN0VmlzaXRvcn0gZnJvbSAnQGFuZ3VsYXIvY29tcGlsZXInO1xuaW1wb3J0IHtCb3VuZEV2ZW50LCBFbGVtZW50LCBOdWxsVmlzaXRvciwgVGVtcGxhdGUsIFZhcmlhYmxlLCB2aXNpdEFsbH0gZnJvbSAnQGFuZ3VsYXIvY29tcGlsZXIvc3JjL3JlbmRlcjMvcjNfYXN0JztcblxuZXhwb3J0IGludGVyZmFjZSBUZW1wbGF0ZVZhcmlhYmxlQXNzaWdubWVudCB7XG4gIHN0YXJ0OiBudW1iZXI7XG4gIGVuZDogbnVtYmVyO1xuICBub2RlOiBQcm9wZXJ0eVdyaXRlO1xufVxuXG4vKipcbiAqIEhUTUwgQVNUIHZpc2l0b3IgdGhhdCB0cmF2ZXJzZXMgdGhlIFJlbmRlcjMgSFRNTCBBU1QgaW4gb3JkZXIgdG8gZmluZCBhbGxcbiAqIGV4cHJlc3Npb25zIHRoYXQgd3JpdGUgdG8gbG9jYWwgdGVtcGxhdGUgdmFyaWFibGVzIHdpdGhpbiBib3VuZCBldmVudHMuXG4gKi9cbmV4cG9ydCBjbGFzcyBIdG1sVmFyaWFibGVBc3NpZ25tZW50VmlzaXRvciBleHRlbmRzIE51bGxWaXNpdG9yIHtcbiAgdmFyaWFibGVBc3NpZ25tZW50czogVGVtcGxhdGVWYXJpYWJsZUFzc2lnbm1lbnRbXSA9IFtdO1xuXG4gIHByaXZhdGUgY3VycmVudFZhcmlhYmxlczogVmFyaWFibGVbXSA9IFtdO1xuICBwcml2YXRlIGV4cHJlc3Npb25Bc3RWaXNpdG9yID1cbiAgICAgIG5ldyBFeHByZXNzaW9uQXN0VmlzaXRvcih0aGlzLnZhcmlhYmxlQXNzaWdubWVudHMsIHRoaXMuY3VycmVudFZhcmlhYmxlcyk7XG5cbiAgdmlzaXRFbGVtZW50KGVsZW1lbnQ6IEVsZW1lbnQpOiB2b2lkIHtcbiAgICB2aXNpdEFsbCh0aGlzLCBlbGVtZW50Lm91dHB1dHMpO1xuICAgIHZpc2l0QWxsKHRoaXMsIGVsZW1lbnQuY2hpbGRyZW4pO1xuICB9XG5cbiAgdmlzaXRUZW1wbGF0ZSh0ZW1wbGF0ZTogVGVtcGxhdGUpOiB2b2lkIHtcbiAgICAvLyBLZWVwIHRyYWNrIG9mIHRoZSB0ZW1wbGF0ZSB2YXJpYWJsZXMgd2hpY2ggY2FuIGJlIGFjY2Vzc2VkIGJ5IHRoZSB0ZW1wbGF0ZVxuICAgIC8vIGNoaWxkIG5vZGVzIHRocm91Z2ggdGhlIGltcGxpY2l0IHJlY2VpdmVyLlxuICAgIHRoaXMuY3VycmVudFZhcmlhYmxlcy5wdXNoKC4uLnRlbXBsYXRlLnZhcmlhYmxlcyk7XG5cbiAgICAvLyBWaXNpdCBhbGwgY2hpbGRyZW4gb2YgdGhlIHRlbXBsYXRlLiBUaGUgdGVtcGxhdGUgcHJveGllcyB0aGUgb3V0cHV0cyBvZiB0aGVcbiAgICAvLyBpbW1lZGlhdGUgY2hpbGQgZWxlbWVudHMsIHNvIHdlIGp1c3QgaWdub3JlIG91dHB1dHMgb24gdGhlIFwiVGVtcGxhdGVcIiBpbiBvcmRlclxuICAgIC8vIHRvIG5vdCB2aXNpdCBzaW1pbGFyIGJvdW5kIGV2ZW50cyB0d2ljZS5cbiAgICB2aXNpdEFsbCh0aGlzLCB0ZW1wbGF0ZS5jaGlsZHJlbik7XG5cbiAgICAvLyBSZW1vdmUgYWxsIHByZXZpb3VzbHkgYWRkZWQgdmFyaWFibGVzIHNpbmNlIGFsbCBjaGlsZHJlbiB0aGF0IGNvdWxkIGFjY2Vzc1xuICAgIC8vIHRoZXNlIGhhdmUgYmVlbiB2aXNpdGVkIGFscmVhZHkuXG4gICAgdGVtcGxhdGUudmFyaWFibGVzLmZvckVhY2godiA9PiB7XG4gICAgICBjb25zdCB2YXJpYWJsZUlkeCA9IHRoaXMuY3VycmVudFZhcmlhYmxlcy5pbmRleE9mKHYpO1xuXG4gICAgICBpZiAodmFyaWFibGVJZHggIT09IC0xKSB7XG4gICAgICAgIHRoaXMuY3VycmVudFZhcmlhYmxlcy5zcGxpY2UodmFyaWFibGVJZHgsIDEpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgdmlzaXRCb3VuZEV2ZW50KG5vZGU6IEJvdW5kRXZlbnQpIHtcbiAgICBub2RlLmhhbmRsZXIudmlzaXQodGhpcy5leHByZXNzaW9uQXN0VmlzaXRvciwgbm9kZS5oYW5kbGVyU3Bhbik7XG4gIH1cbn1cblxuLyoqIEFTVCB2aXNpdG9yIHRoYXQgcmVzb2x2ZXMgYWxsIHZhcmlhYmxlIGFzc2lnbm1lbnRzIHdpdGhpbiBhIGdpdmVuIGV4cHJlc3Npb24gQVNULiAqL1xuY2xhc3MgRXhwcmVzc2lvbkFzdFZpc2l0b3IgZXh0ZW5kcyBSZWN1cnNpdmVBc3RWaXNpdG9yIHtcbiAgY29uc3RydWN0b3IoXG4gICAgICBwcml2YXRlIHZhcmlhYmxlQXNzaWdubWVudHM6IFRlbXBsYXRlVmFyaWFibGVBc3NpZ25tZW50W10sXG4gICAgICBwcml2YXRlIGN1cnJlbnRWYXJpYWJsZXM6IFZhcmlhYmxlW10pIHtcbiAgICBzdXBlcigpO1xuICB9XG5cbiAgdmlzaXRQcm9wZXJ0eVdyaXRlKG5vZGU6IFByb3BlcnR5V3JpdGUsIHNwYW46IFBhcnNlU291cmNlU3Bhbikge1xuICAgIGlmIChub2RlLnJlY2VpdmVyIGluc3RhbmNlb2YgSW1wbGljaXRSZWNlaXZlciAmJlxuICAgICAgICB0aGlzLmN1cnJlbnRWYXJpYWJsZXMuc29tZSh2ID0+IHYubmFtZSA9PT0gbm9kZS5uYW1lKSkge1xuICAgICAgdGhpcy52YXJpYWJsZUFzc2lnbm1lbnRzLnB1c2goe1xuICAgICAgICBub2RlOiBub2RlLFxuICAgICAgICBzdGFydDogc3Bhbi5zdGFydC5vZmZzZXQsXG4gICAgICAgIGVuZDogc3Bhbi5lbmQub2Zmc2V0LFxuICAgICAgfSk7XG4gICAgfVxuICAgIHN1cGVyLnZpc2l0UHJvcGVydHlXcml0ZShub2RlLCBzcGFuKTtcbiAgfVxufVxuIl19
|
|
@@ -1,68 +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
|
-
import { normalize } from '@angular-devkit/core';
|
|
9
|
-
import { SchematicsException } from '@angular-devkit/schematics';
|
|
10
|
-
import { relative } from 'path';
|
|
11
|
-
import { NgComponentTemplateVisitor } from '../../utils/ng_component_template';
|
|
12
|
-
import { getProjectTsConfigPaths } from '../../utils/project_tsconfig_paths';
|
|
13
|
-
import { canMigrateFile, createMigrationProgram } from '../../utils/typescript/compiler_host';
|
|
14
|
-
import { analyzeResolvedTemplate } from './analyze_template';
|
|
15
|
-
const README_URL = 'https://v8.angular.io/guide/deprecations#cannot-assign-to-template-variables';
|
|
16
|
-
const FAILURE_MESSAGE = `Found assignment to template variable.`;
|
|
17
|
-
/** Entry point for the V8 template variable assignment schematic. */
|
|
18
|
-
export default function () {
|
|
19
|
-
return (tree, context) => {
|
|
20
|
-
const { buildPaths, testPaths } = getProjectTsConfigPaths(tree);
|
|
21
|
-
const basePath = process.cwd();
|
|
22
|
-
if (!buildPaths.length && !testPaths.length) {
|
|
23
|
-
throw new SchematicsException('Could not find any tsconfig file. Cannot check templates for template variable ' +
|
|
24
|
-
'assignments.');
|
|
25
|
-
}
|
|
26
|
-
for (const tsconfigPath of [...buildPaths, ...testPaths]) {
|
|
27
|
-
runTemplateVariableAssignmentCheck(tree, tsconfigPath, basePath, context.logger);
|
|
28
|
-
}
|
|
29
|
-
};
|
|
30
|
-
}
|
|
31
|
-
/**
|
|
32
|
-
* Runs the template variable assignment check. Warns developers
|
|
33
|
-
* if values are assigned to template variables within output bindings.
|
|
34
|
-
*/
|
|
35
|
-
function runTemplateVariableAssignmentCheck(tree, tsconfigPath, basePath, logger) {
|
|
36
|
-
const { program } = createMigrationProgram(tree, tsconfigPath, basePath);
|
|
37
|
-
const typeChecker = program.getTypeChecker();
|
|
38
|
-
const templateVisitor = new NgComponentTemplateVisitor(typeChecker);
|
|
39
|
-
const sourceFiles = program.getSourceFiles().filter(sourceFile => canMigrateFile(basePath, sourceFile, program));
|
|
40
|
-
// Analyze source files by detecting HTML templates.
|
|
41
|
-
sourceFiles.forEach(sourceFile => templateVisitor.visitNode(sourceFile));
|
|
42
|
-
const { resolvedTemplates } = templateVisitor;
|
|
43
|
-
const collectedFailures = [];
|
|
44
|
-
// Analyze each resolved template and print a warning for property writes to
|
|
45
|
-
// template variables.
|
|
46
|
-
resolvedTemplates.forEach(template => {
|
|
47
|
-
const filePath = template.filePath;
|
|
48
|
-
const nodes = analyzeResolvedTemplate(template);
|
|
49
|
-
if (!nodes) {
|
|
50
|
-
return;
|
|
51
|
-
}
|
|
52
|
-
const displayFilePath = normalize(relative(basePath, filePath));
|
|
53
|
-
nodes.forEach(n => {
|
|
54
|
-
const { line, character } = template.getCharacterAndLineOfPosition(n.start);
|
|
55
|
-
collectedFailures.push(`${displayFilePath}@${line + 1}:${character + 1}: ${FAILURE_MESSAGE}`);
|
|
56
|
-
});
|
|
57
|
-
});
|
|
58
|
-
if (collectedFailures.length) {
|
|
59
|
-
logger.info('---- Template Variable Assignment schematic ----');
|
|
60
|
-
logger.info('Assignments to template variables will no longer work with Ivy as');
|
|
61
|
-
logger.info('template variables are effectively constants in Ivy. Read more about');
|
|
62
|
-
logger.info(`this change here: ${README_URL}`);
|
|
63
|
-
logger.info('');
|
|
64
|
-
logger.info('The following template assignments were found:');
|
|
65
|
-
collectedFailures.forEach(failure => logger.warn(`⮑ ${failure}`));
|
|
66
|
-
}
|
|
67
|
-
}
|
|
68
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9jb3JlL3NjaGVtYXRpY3MvbWlncmF0aW9ucy90ZW1wbGF0ZS12YXItYXNzaWdubWVudC9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7O0dBTUc7QUFFSCxPQUFPLEVBQVUsU0FBUyxFQUFDLE1BQU0sc0JBQXNCLENBQUM7QUFDeEQsT0FBTyxFQUF5QixtQkFBbUIsRUFBTyxNQUFNLDRCQUE0QixDQUFDO0FBQzdGLE9BQU8sRUFBQyxRQUFRLEVBQUMsTUFBTSxNQUFNLENBQUM7QUFFOUIsT0FBTyxFQUFDLDBCQUEwQixFQUFDLE1BQU0sbUNBQW1DLENBQUM7QUFDN0UsT0FBTyxFQUFDLHVCQUF1QixFQUFDLE1BQU0sb0NBQW9DLENBQUM7QUFDM0UsT0FBTyxFQUFDLGNBQWMsRUFBRSxzQkFBc0IsRUFBQyxNQUFNLHNDQUFzQyxDQUFDO0FBRTVGLE9BQU8sRUFBQyx1QkFBdUIsRUFBQyxNQUFNLG9CQUFvQixDQUFDO0FBSTNELE1BQU0sVUFBVSxHQUFHLDhFQUE4RSxDQUFDO0FBQ2xHLE1BQU0sZUFBZSxHQUFHLHdDQUF3QyxDQUFDO0FBRWpFLHFFQUFxRTtBQUNyRSxNQUFNLENBQUMsT0FBTztJQUNaLE9BQU8sQ0FBQyxJQUFVLEVBQUUsT0FBeUIsRUFBRSxFQUFFO1FBQy9DLE1BQU0sRUFBQyxVQUFVLEVBQUUsU0FBUyxFQUFDLEdBQUcsdUJBQXVCLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDOUQsTUFBTSxRQUFRLEdBQUcsT0FBTyxDQUFDLEdBQUcsRUFBRSxDQUFDO1FBRS9CLElBQUksQ0FBQyxVQUFVLENBQUMsTUFBTSxJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sRUFBRTtZQUMzQyxNQUFNLElBQUksbUJBQW1CLENBQ3pCLGlGQUFpRjtnQkFDakYsY0FBYyxDQUFDLENBQUM7U0FDckI7UUFFRCxLQUFLLE1BQU0sWUFBWSxJQUFJLENBQUMsR0FBRyxVQUFVLEVBQUUsR0FBRyxTQUFTLENBQUMsRUFBRTtZQUN4RCxrQ0FBa0MsQ0FBQyxJQUFJLEVBQUUsWUFBWSxFQUFFLFFBQVEsRUFBRSxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUM7U0FDbEY7SUFDSCxDQUFDLENBQUM7QUFDSixDQUFDO0FBRUQ7OztHQUdHO0FBQ0gsU0FBUyxrQ0FBa0MsQ0FDdkMsSUFBVSxFQUFFLFlBQW9CLEVBQUUsUUFBZ0IsRUFBRSxNQUFjO0lBQ3BFLE1BQU0sRUFBQyxPQUFPLEVBQUMsR0FBRyxzQkFBc0IsQ0FBQyxJQUFJLEVBQUUsWUFBWSxFQUFFLFFBQVEsQ0FBQyxDQUFDO0lBQ3ZFLE1BQU0sV0FBVyxHQUFHLE9BQU8sQ0FBQyxjQUFjLEVBQUUsQ0FBQztJQUM3QyxNQUFNLGVBQWUsR0FBRyxJQUFJLDBCQUEwQixDQUFDLFdBQVcsQ0FBQyxDQUFDO0lBQ3BFLE1BQU0sV0FBVyxHQUNiLE9BQU8sQ0FBQyxjQUFjLEVBQUUsQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLEVBQUUsQ0FBQyxjQUFjLENBQUMsUUFBUSxFQUFFLFVBQVUsRUFBRSxPQUFPLENBQUMsQ0FBQyxDQUFDO0lBRWpHLG9EQUFvRDtJQUNwRCxXQUFXLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxFQUFFLENBQUMsZUFBZSxDQUFDLFNBQVMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDO0lBRXpFLE1BQU0sRUFBQyxpQkFBaUIsRUFBQyxHQUFHLGVBQWUsQ0FBQztJQUM1QyxNQUFNLGlCQUFpQixHQUFhLEVBQUUsQ0FBQztJQUV2Qyw0RUFBNEU7SUFDNUUsc0JBQXNCO0lBQ3RCLGlCQUFpQixDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsRUFBRTtRQUNuQyxNQUFNLFFBQVEsR0FBRyxRQUFRLENBQUMsUUFBUSxDQUFDO1FBQ25DLE1BQU0sS0FBSyxHQUFHLHVCQUF1QixDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBRWhELElBQUksQ0FBQyxLQUFLLEVBQUU7WUFDVixPQUFPO1NBQ1I7UUFFRCxNQUFNLGVBQWUsR0FBRyxTQUFTLENBQUMsUUFBUSxDQUFDLFFBQVEsRUFBRSxRQUFRLENBQUMsQ0FBQyxDQUFDO1FBRWhFLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUU7WUFDaEIsTUFBTSxFQUFDLElBQUksRUFBRSxTQUFTLEVBQUMsR0FBRyxRQUFRLENBQUMsNkJBQTZCLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQzFFLGlCQUFpQixDQUFDLElBQUksQ0FBQyxHQUFHLGVBQWUsSUFBSSxJQUFJLEdBQUcsQ0FBQyxJQUFJLFNBQVMsR0FBRyxDQUFDLEtBQUssZUFBZSxFQUFFLENBQUMsQ0FBQztRQUNoRyxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUMsQ0FBQyxDQUFDO0lBRUgsSUFBSSxpQkFBaUIsQ0FBQyxNQUFNLEVBQUU7UUFDNUIsTUFBTSxDQUFDLElBQUksQ0FBQyxrREFBa0QsQ0FBQyxDQUFDO1FBQ2hFLE1BQU0sQ0FBQyxJQUFJLENBQUMsbUVBQW1FLENBQUMsQ0FBQztRQUNqRixNQUFNLENBQUMsSUFBSSxDQUFDLHNFQUFzRSxDQUFDLENBQUM7UUFDcEYsTUFBTSxDQUFDLElBQUksQ0FBQyxxQkFBcUIsVUFBVSxFQUFFLENBQUMsQ0FBQztRQUMvQyxNQUFNLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQ2hCLE1BQU0sQ0FBQyxJQUFJLENBQUMsZ0RBQWdELENBQUMsQ0FBQztRQUM5RCxpQkFBaUIsQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLE9BQU8sT0FBTyxFQUFFLENBQUMsQ0FBQyxDQUFDO0tBQ3JFO0FBQ0gsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCBHb29nbGUgTExDIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKlxuICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmVcbiAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2VcbiAqL1xuXG5pbXBvcnQge2xvZ2dpbmcsIG5vcm1hbGl6ZX0gZnJvbSAnQGFuZ3VsYXItZGV2a2l0L2NvcmUnO1xuaW1wb3J0IHtSdWxlLCBTY2hlbWF0aWNDb250ZXh0LCBTY2hlbWF0aWNzRXhjZXB0aW9uLCBUcmVlfSBmcm9tICdAYW5ndWxhci1kZXZraXQvc2NoZW1hdGljcyc7XG5pbXBvcnQge3JlbGF0aXZlfSBmcm9tICdwYXRoJztcblxuaW1wb3J0IHtOZ0NvbXBvbmVudFRlbXBsYXRlVmlzaXRvcn0gZnJvbSAnLi4vLi4vdXRpbHMvbmdfY29tcG9uZW50X3RlbXBsYXRlJztcbmltcG9ydCB7Z2V0UHJvamVjdFRzQ29uZmlnUGF0aHN9IGZyb20gJy4uLy4uL3V0aWxzL3Byb2plY3RfdHNjb25maWdfcGF0aHMnO1xuaW1wb3J0IHtjYW5NaWdyYXRlRmlsZSwgY3JlYXRlTWlncmF0aW9uUHJvZ3JhbX0gZnJvbSAnLi4vLi4vdXRpbHMvdHlwZXNjcmlwdC9jb21waWxlcl9ob3N0JztcblxuaW1wb3J0IHthbmFseXplUmVzb2x2ZWRUZW1wbGF0ZX0gZnJvbSAnLi9hbmFseXplX3RlbXBsYXRlJztcblxudHlwZSBMb2dnZXIgPSBsb2dnaW5nLkxvZ2dlckFwaTtcblxuY29uc3QgUkVBRE1FX1VSTCA9ICdodHRwczovL3Y4LmFuZ3VsYXIuaW8vZ3VpZGUvZGVwcmVjYXRpb25zI2Nhbm5vdC1hc3NpZ24tdG8tdGVtcGxhdGUtdmFyaWFibGVzJztcbmNvbnN0IEZBSUxVUkVfTUVTU0FHRSA9IGBGb3VuZCBhc3NpZ25tZW50IHRvIHRlbXBsYXRlIHZhcmlhYmxlLmA7XG5cbi8qKiBFbnRyeSBwb2ludCBmb3IgdGhlIFY4IHRlbXBsYXRlIHZhcmlhYmxlIGFzc2lnbm1lbnQgc2NoZW1hdGljLiAqL1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oKTogUnVsZSB7XG4gIHJldHVybiAodHJlZTogVHJlZSwgY29udGV4dDogU2NoZW1hdGljQ29udGV4dCkgPT4ge1xuICAgIGNvbnN0IHtidWlsZFBhdGhzLCB0ZXN0UGF0aHN9ID0gZ2V0UHJvamVjdFRzQ29uZmlnUGF0aHModHJlZSk7XG4gICAgY29uc3QgYmFzZVBhdGggPSBwcm9jZXNzLmN3ZCgpO1xuXG4gICAgaWYgKCFidWlsZFBhdGhzLmxlbmd0aCAmJiAhdGVzdFBhdGhzLmxlbmd0aCkge1xuICAgICAgdGhyb3cgbmV3IFNjaGVtYXRpY3NFeGNlcHRpb24oXG4gICAgICAgICAgJ0NvdWxkIG5vdCBmaW5kIGFueSB0c2NvbmZpZyBmaWxlLiBDYW5ub3QgY2hlY2sgdGVtcGxhdGVzIGZvciB0ZW1wbGF0ZSB2YXJpYWJsZSAnICtcbiAgICAgICAgICAnYXNzaWdubWVudHMuJyk7XG4gICAgfVxuXG4gICAgZm9yIChjb25zdCB0c2NvbmZpZ1BhdGggb2YgWy4uLmJ1aWxkUGF0aHMsIC4uLnRlc3RQYXRoc10pIHtcbiAgICAgIHJ1blRlbXBsYXRlVmFyaWFibGVBc3NpZ25tZW50Q2hlY2sodHJlZSwgdHNjb25maWdQYXRoLCBiYXNlUGF0aCwgY29udGV4dC5sb2dnZXIpO1xuICAgIH1cbiAgfTtcbn1cblxuLyoqXG4gKiBSdW5zIHRoZSB0ZW1wbGF0ZSB2YXJpYWJsZSBhc3NpZ25tZW50IGNoZWNrLiBXYXJucyBkZXZlbG9wZXJzXG4gKiBpZiB2YWx1ZXMgYXJlIGFzc2lnbmVkIHRvIHRlbXBsYXRlIHZhcmlhYmxlcyB3aXRoaW4gb3V0cHV0IGJpbmRpbmdzLlxuICovXG5mdW5jdGlvbiBydW5UZW1wbGF0ZVZhcmlhYmxlQXNzaWdubWVudENoZWNrKFxuICAgIHRyZWU6IFRyZWUsIHRzY29uZmlnUGF0aDogc3RyaW5nLCBiYXNlUGF0aDogc3RyaW5nLCBsb2dnZXI6IExvZ2dlcikge1xuICBjb25zdCB7cHJvZ3JhbX0gPSBjcmVhdGVNaWdyYXRpb25Qcm9ncmFtKHRyZWUsIHRzY29uZmlnUGF0aCwgYmFzZVBhdGgpO1xuICBjb25zdCB0eXBlQ2hlY2tlciA9IHByb2dyYW0uZ2V0VHlwZUNoZWNrZXIoKTtcbiAgY29uc3QgdGVtcGxhdGVWaXNpdG9yID0gbmV3IE5nQ29tcG9uZW50VGVtcGxhdGVWaXNpdG9yKHR5cGVDaGVja2VyKTtcbiAgY29uc3Qgc291cmNlRmlsZXMgPVxuICAgICAgcHJvZ3JhbS5nZXRTb3VyY2VGaWxlcygpLmZpbHRlcihzb3VyY2VGaWxlID0+IGNhbk1pZ3JhdGVGaWxlKGJhc2VQYXRoLCBzb3VyY2VGaWxlLCBwcm9ncmFtKSk7XG5cbiAgLy8gQW5hbHl6ZSBzb3VyY2UgZmlsZXMgYnkgZGV0ZWN0aW5nIEhUTUwgdGVtcGxhdGVzLlxuICBzb3VyY2VGaWxlcy5mb3JFYWNoKHNvdXJjZUZpbGUgPT4gdGVtcGxhdGVWaXNpdG9yLnZpc2l0Tm9kZShzb3VyY2VGaWxlKSk7XG5cbiAgY29uc3Qge3Jlc29sdmVkVGVtcGxhdGVzfSA9IHRlbXBsYXRlVmlzaXRvcjtcbiAgY29uc3QgY29sbGVjdGVkRmFpbHVyZXM6IHN0cmluZ1tdID0gW107XG5cbiAgLy8gQW5hbHl6ZSBlYWNoIHJlc29sdmVkIHRlbXBsYXRlIGFuZCBwcmludCBhIHdhcm5pbmcgZm9yIHByb3BlcnR5IHdyaXRlcyB0b1xuICAvLyB0ZW1wbGF0ZSB2YXJpYWJsZXMuXG4gIHJlc29sdmVkVGVtcGxhdGVzLmZvckVhY2godGVtcGxhdGUgPT4ge1xuICAgIGNvbnN0IGZpbGVQYXRoID0gdGVtcGxhdGUuZmlsZVBhdGg7XG4gICAgY29uc3Qgbm9kZXMgPSBhbmFseXplUmVzb2x2ZWRUZW1wbGF0ZSh0ZW1wbGF0ZSk7XG5cbiAgICBpZiAoIW5vZGVzKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgZGlzcGxheUZpbGVQYXRoID0gbm9ybWFsaXplKHJlbGF0aXZlKGJhc2VQYXRoLCBmaWxlUGF0aCkpO1xuXG4gICAgbm9kZXMuZm9yRWFjaChuID0+IHtcbiAgICAgIGNvbnN0IHtsaW5lLCBjaGFyYWN0ZXJ9ID0gdGVtcGxhdGUuZ2V0Q2hhcmFjdGVyQW5kTGluZU9mUG9zaXRpb24obi5zdGFydCk7XG4gICAgICBjb2xsZWN0ZWRGYWlsdXJlcy5wdXNoKGAke2Rpc3BsYXlGaWxlUGF0aH1AJHtsaW5lICsgMX06JHtjaGFyYWN0ZXIgKyAxfTogJHtGQUlMVVJFX01FU1NBR0V9YCk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGlmIChjb2xsZWN0ZWRGYWlsdXJlcy5sZW5ndGgpIHtcbiAgICBsb2dnZXIuaW5mbygnLS0tLSBUZW1wbGF0ZSBWYXJpYWJsZSBBc3NpZ25tZW50IHNjaGVtYXRpYyAtLS0tJyk7XG4gICAgbG9nZ2VyLmluZm8oJ0Fzc2lnbm1lbnRzIHRvIHRlbXBsYXRlIHZhcmlhYmxlcyB3aWxsIG5vIGxvbmdlciB3b3JrIHdpdGggSXZ5IGFzJyk7XG4gICAgbG9nZ2VyLmluZm8oJ3RlbXBsYXRlIHZhcmlhYmxlcyBhcmUgZWZmZWN0aXZlbHkgY29uc3RhbnRzIGluIEl2eS4gUmVhZCBtb3JlIGFib3V0Jyk7XG4gICAgbG9nZ2VyLmluZm8oYHRoaXMgY2hhbmdlIGhlcmU6ICR7UkVBRE1FX1VSTH1gKTtcbiAgICBsb2dnZXIuaW5mbygnJyk7XG4gICAgbG9nZ2VyLmluZm8oJ1RoZSBmb2xsb3dpbmcgdGVtcGxhdGUgYXNzaWdubWVudHMgd2VyZSBmb3VuZDonKTtcbiAgICBjb2xsZWN0ZWRGYWlsdXJlcy5mb3JFYWNoKGZhaWx1cmUgPT4gbG9nZ2VyLndhcm4oYOKukSAgICR7ZmFpbHVyZX1gKSk7XG4gIH1cbn1cbiJdfQ==
|
|
File without changes
|
|
@@ -1,92 +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
|
-
import { SchematicsException, } from '@angular-devkit/schematics';
|
|
9
|
-
import { relative } from 'path';
|
|
10
|
-
import * as ts from 'typescript';
|
|
11
|
-
import { getProjectTsConfigPaths } from '../../utils/project_tsconfig_paths';
|
|
12
|
-
import { canMigrateFile, createMigrationProgram } from '../../utils/typescript/compiler_host';
|
|
13
|
-
import { UndecoratedClassesWithDecoratedFieldsTransform } from './transform';
|
|
14
|
-
/**
|
|
15
|
-
* Migration that adds an Angular decorator to classes that have Angular field decorators.
|
|
16
|
-
* https://hackmd.io/vuQfavzfRG6KUCtU7oK_EA
|
|
17
|
-
*/
|
|
18
|
-
export default function () {
|
|
19
|
-
return (tree, ctx) => {
|
|
20
|
-
const { buildPaths, testPaths } = getProjectTsConfigPaths(tree);
|
|
21
|
-
const basePath = process.cwd();
|
|
22
|
-
const allPaths = [...buildPaths, ...testPaths];
|
|
23
|
-
const failures = [];
|
|
24
|
-
if (!allPaths.length) {
|
|
25
|
-
throw new SchematicsException('Could not find any tsconfig file. Cannot add an Angular decorator to undecorated classes.');
|
|
26
|
-
}
|
|
27
|
-
for (const tsconfigPath of allPaths) {
|
|
28
|
-
failures.push(...runUndecoratedClassesMigration(tree, tsconfigPath, basePath));
|
|
29
|
-
}
|
|
30
|
-
if (failures.length) {
|
|
31
|
-
ctx.logger.info('Could not migrate all undecorated classes that use Angular features.');
|
|
32
|
-
ctx.logger.info('Please manually fix the following failures:');
|
|
33
|
-
failures.forEach(message => ctx.logger.warn(`⮑ ${message}`));
|
|
34
|
-
}
|
|
35
|
-
};
|
|
36
|
-
}
|
|
37
|
-
function runUndecoratedClassesMigration(tree, tsconfigPath, basePath) {
|
|
38
|
-
const failures = [];
|
|
39
|
-
const { program } = createMigrationProgram(tree, tsconfigPath, basePath);
|
|
40
|
-
const typeChecker = program.getTypeChecker();
|
|
41
|
-
const sourceFiles = program.getSourceFiles().filter(sourceFile => canMigrateFile(basePath, sourceFile, program));
|
|
42
|
-
const updateRecorders = new Map();
|
|
43
|
-
const transform = new UndecoratedClassesWithDecoratedFieldsTransform(typeChecker, getUpdateRecorder);
|
|
44
|
-
// Migrate all source files in the project.
|
|
45
|
-
transform.migrate(sourceFiles).forEach(({ node, message }) => {
|
|
46
|
-
const nodeSourceFile = node.getSourceFile();
|
|
47
|
-
const relativeFilePath = relative(basePath, nodeSourceFile.fileName);
|
|
48
|
-
const { line, character } = ts.getLineAndCharacterOfPosition(node.getSourceFile(), node.getStart());
|
|
49
|
-
failures.push(`${relativeFilePath}@${line + 1}:${character + 1}: ${message}`);
|
|
50
|
-
});
|
|
51
|
-
// Record the changes collected in the import manager.
|
|
52
|
-
transform.recordChanges();
|
|
53
|
-
// Walk through each update recorder and commit the update. We need to commit the
|
|
54
|
-
// updates in batches per source file as there can be only one recorder per source
|
|
55
|
-
// file in order to avoid shifted character offsets.
|
|
56
|
-
updateRecorders.forEach(recorder => recorder.commitUpdate());
|
|
57
|
-
return failures;
|
|
58
|
-
/** Gets the update recorder for the specified source file. */
|
|
59
|
-
function getUpdateRecorder(sourceFile) {
|
|
60
|
-
if (updateRecorders.has(sourceFile)) {
|
|
61
|
-
return updateRecorders.get(sourceFile);
|
|
62
|
-
}
|
|
63
|
-
const treeRecorder = tree.beginUpdate(relative(basePath, sourceFile.fileName));
|
|
64
|
-
const recorder = {
|
|
65
|
-
addClassTodo(node, message) {
|
|
66
|
-
treeRecorder.insertRight(node.getStart(), `// TODO: ${message}\n`);
|
|
67
|
-
},
|
|
68
|
-
addClassDecorator(node, text) {
|
|
69
|
-
// New imports should be inserted at the left while decorators should be inserted
|
|
70
|
-
// at the right in order to ensure that imports are inserted before the decorator
|
|
71
|
-
// if the start position of import and decorator is the source file start.
|
|
72
|
-
treeRecorder.insertRight(node.getStart(), `${text}\n`);
|
|
73
|
-
},
|
|
74
|
-
addNewImport(start, importText) {
|
|
75
|
-
// New imports should be inserted at the left while decorators should be inserted
|
|
76
|
-
// at the right in order to ensure that imports are inserted before the decorator
|
|
77
|
-
// if the start position of import and decorator is the source file start.
|
|
78
|
-
treeRecorder.insertLeft(start, importText);
|
|
79
|
-
},
|
|
80
|
-
updateExistingImport(namedBindings, newNamedBindings) {
|
|
81
|
-
treeRecorder.remove(namedBindings.getStart(), namedBindings.getWidth());
|
|
82
|
-
treeRecorder.insertRight(namedBindings.getStart(), newNamedBindings);
|
|
83
|
-
},
|
|
84
|
-
commitUpdate() {
|
|
85
|
-
tree.commitUpdate(treeRecorder);
|
|
86
|
-
}
|
|
87
|
-
};
|
|
88
|
-
updateRecorders.set(sourceFile, recorder);
|
|
89
|
-
return recorder;
|
|
90
|
-
}
|
|
91
|
-
}
|
|
92
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9jb3JlL3NjaGVtYXRpY3MvbWlncmF0aW9ucy91bmRlY29yYXRlZC1jbGFzc2VzLXdpdGgtZGVjb3JhdGVkLWZpZWxkcy9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7O0dBTUc7QUFFSCxPQUFPLEVBQXlCLG1CQUFtQixHQUFRLE1BQU0sNEJBQTRCLENBQUM7QUFDOUYsT0FBTyxFQUFDLFFBQVEsRUFBQyxNQUFNLE1BQU0sQ0FBQztBQUM5QixPQUFPLEtBQUssRUFBRSxNQUFNLFlBQVksQ0FBQztBQUVqQyxPQUFPLEVBQUMsdUJBQXVCLEVBQUMsTUFBTSxvQ0FBb0MsQ0FBQztBQUMzRSxPQUFPLEVBQUMsY0FBYyxFQUFFLHNCQUFzQixFQUFDLE1BQU0sc0NBQXNDLENBQUM7QUFFNUYsT0FBTyxFQUFDLDhDQUE4QyxFQUFDLE1BQU0sYUFBYSxDQUFDO0FBRzNFOzs7R0FHRztBQUNILE1BQU0sQ0FBQyxPQUFPO0lBQ1osT0FBTyxDQUFDLElBQVUsRUFBRSxHQUFxQixFQUFFLEVBQUU7UUFDM0MsTUFBTSxFQUFDLFVBQVUsRUFBRSxTQUFTLEVBQUMsR0FBRyx1QkFBdUIsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUM5RCxNQUFNLFFBQVEsR0FBRyxPQUFPLENBQUMsR0FBRyxFQUFFLENBQUM7UUFDL0IsTUFBTSxRQUFRLEdBQUcsQ0FBQyxHQUFHLFVBQVUsRUFBRSxHQUFHLFNBQVMsQ0FBQyxDQUFDO1FBQy9DLE1BQU0sUUFBUSxHQUFhLEVBQUUsQ0FBQztRQUU5QixJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sRUFBRTtZQUNwQixNQUFNLElBQUksbUJBQW1CLENBQ3pCLDJGQUEyRixDQUFDLENBQUM7U0FDbEc7UUFFRCxLQUFLLE1BQU0sWUFBWSxJQUFJLFFBQVEsRUFBRTtZQUNuQyxRQUFRLENBQUMsSUFBSSxD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QixDQUFDLElBQXlCLEVBQUUsSUFBWTtnQkFDdkQsaUZBQWlGO2dCQUNqRixpRkFBaUY7Z0JBQ2pGLDBFQUEwRTtnQkFDMUUsWUFBWSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLEVBQUUsR0FBRyxJQUFJLElBQUksQ0FBQyxDQUFDO1lBQ3pELENBQUM7WUFDRCxZQUFZLENBQUMsS0FBYSxFQUFFLFVBQWtCO2dCQUM1QyxpRkFBaUY7Z0JBQ2pGLGlGQUFpRjtnQkFDakYsMEVBQTBFO2dCQUMxRSxZQUFZLENBQUMsVUFBVSxDQUFDLEtBQUssRUFBRSxVQUFVLENBQUMsQ0FBQztZQUM3QyxDQUFDO1lBQ0Qsb0JBQW9CLENBQUMsYUFBOEIsRUFBRSxnQkFBd0I7Z0JBQzNFLFlBQVksQ0FBQyxNQUFNLENBQUMsYUFBYSxDQUFDLFFBQVEsRUFBRSxFQUFFLGFBQWEsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDO2dCQUN4RSxZQUFZLENBQUMsV0FBVyxDQUFDLGFBQWEsQ0FBQyxRQUFRLEVBQUUsRUFBRSxnQkFBZ0IsQ0FBQyxDQUFDO1lBQ3ZFLENBQUM7WUFDRCxZQUFZO2dCQUNWLElBQUksQ0FBQyxZQUFZLENBQUMsWUFBWSxDQUFDLENBQUM7WUFDbEMsQ0FBQztTQUNGLENBQUM7UUFDRixlQUFlLENBQUMsR0FBRyxDQUFDLFVBQVUsRUFBRSxRQUFRLENBQUMsQ0FBQztRQUMxQyxPQUFPLFFBQVEsQ0FBQztJQUNsQixDQUFDO0FBQ0gsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCBHb29nbGUgTExDIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKlxuICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmVcbiAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2VcbiAqL1xuXG5pbXBvcnQge1J1bGUsIFNjaGVtYXRpY0NvbnRleHQsIFNjaGVtYXRpY3NFeGNlcHRpb24sIFRyZWUsfSBmcm9tICdAYW5ndWxhci1kZXZraXQvc2NoZW1hdGljcyc7XG5pbXBvcnQge3JlbGF0aXZlfSBmcm9tICdwYXRoJztcbmltcG9ydCAqIGFzIHRzIGZyb20gJ3R5cGVzY3JpcHQnO1xuXG5pbXBvcnQge2dldFByb2plY3RUc0NvbmZpZ1BhdGhzfSBmcm9tICcuLi8uLi91dGlscy9wcm9qZWN0X3RzY29uZmlnX3BhdGhzJztcbmltcG9ydCB7Y2FuTWlncmF0ZUZpbGUsIGNyZWF0ZU1pZ3JhdGlvblByb2dyYW19IGZyb20gJy4uLy4uL3V0aWxzL3R5cGVzY3JpcHQvY29tcGlsZXJfaG9zdCc7XG5cbmltcG9ydCB7VW5kZWNvcmF0ZWRDbGFzc2VzV2l0aERlY29yYXRlZEZpZWxkc1RyYW5zZm9ybX0gZnJvbSAnLi90cmFuc2Zvcm0nO1xuaW1wb3J0IHtVcGRhdGVSZWNvcmRlcn0gZnJvbSAnLi91cGRhdGVfcmVjb3JkZXInO1xuXG4vKipcbiAqIE1pZ3JhdGlvbiB0aGF0IGFkZHMgYW4gQW5ndWxhciBkZWNvcmF0b3IgdG8gY2xhc3NlcyB0aGF0IGhhdmUgQW5ndWxhciBmaWVsZCBkZWNvcmF0b3JzLlxuICogaHR0cHM6Ly9oYWNrbWQuaW8vdnVRZmF2emZSRzZLVUN0VTdvS19FQVxuICovXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbigpOiBSdWxlIHtcbiAgcmV0dXJuICh0cmVlOiBUcmVlLCBjdHg6IFNjaGVtYXRpY0NvbnRleHQpID0+IHtcbiAgICBjb25zdCB7YnVpbGRQYXRocywgdGVzdFBhdGhzfSA9IGdldFByb2plY3RUc0NvbmZpZ1BhdGhzKHRyZWUpO1xuICAgIGNvbnN0IGJhc2VQYXRoID0gcHJvY2Vzcy5jd2QoKTtcbiAgICBjb25zdCBhbGxQYXRocyA9IFsuLi5idWlsZFBhdGhzLCAuLi50ZXN0UGF0aHNdO1xuICAgIGNvbnN0IGZhaWx1cmVzOiBzdHJpbmdbXSA9IFtdO1xuXG4gICAgaWYgKCFhbGxQYXRocy5sZW5ndGgpIHtcbiAgICAgIHRocm93IG5ldyBTY2hlbWF0aWNzRXhjZXB0aW9uKFxuICAgICAgICAgICdDb3VsZCBub3QgZmluZCBhbnkgdHNjb25maWcgZmlsZS4gQ2Fubm90IGFkZCBhbiBBbmd1bGFyIGRlY29yYXRvciB0byB1bmRlY29yYXRlZCBjbGFzc2VzLicpO1xuICAgIH1cblxuICAgIGZvciAoY29uc3QgdHNjb25maWdQYXRoIG9mIGFsbFBhdGhzKSB7XG4gICAgICBmYWlsdXJlcy5wdXNoKC4uLnJ1blVuZGVjb3JhdGVkQ2xhc3Nlc01pZ3JhdGlvbih0cmVlLCB0c2NvbmZpZ1BhdGgsIGJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgaWYgKGZhaWx1cmVzLmxlbmd0aCkge1xuICAgICAgY3R4LmxvZ2dlci5pbmZvKCdDb3VsZCBub3QgbWlncmF0ZSBhbGwgdW5kZWNvcmF0ZWQgY2xhc3NlcyB0aGF0IHVzZSBBbmd1bGFyIGZlYXR1cmVzLicpO1xuICAgICAgY3R4LmxvZ2dlci5pbmZvKCdQbGVhc2UgbWFudWFsbHkgZml4IHRoZSBmb2xsb3dpbmcgZmFpbHVyZXM6Jyk7XG4gICAgICBmYWlsdXJlcy5mb3JFYWNoKG1lc3NhZ2UgPT4gY3R4LmxvZ2dlci53YXJuKGDirpEgICAke21lc3NhZ2V9YCkpO1xuICAgIH1cbiAgfTtcbn1cblxuZnVuY3Rpb24gcnVuVW5kZWNvcmF0ZWRDbGFzc2VzTWlncmF0aW9uKFxuICAgIHRyZWU6IFRyZWUsIHRzY29uZmlnUGF0aDogc3RyaW5nLCBiYXNlUGF0aDogc3RyaW5nKTogc3RyaW5nW10ge1xuICBjb25zdCBmYWlsdXJlczogc3RyaW5nW10gPSBbXTtcbiAgY29uc3Qge3Byb2dyYW19ID0gY3JlYXRlTWlncmF0aW9uUHJvZ3JhbSh0cmVlLCB0c2NvbmZpZ1BhdGgsIGJhc2VQYXRoKTtcbiAgY29uc3QgdHlwZUNoZWNrZXIgPSBwcm9ncmFtLmdldFR5cGVDaGVja2VyKCk7XG4gIGNvbnN0IHNvdXJjZUZpbGVzID1cbiAgICAgIHByb2dyYW0uZ2V0U291cmNlRmlsZXMoKS5maWx0ZXIoc291cmNlRmlsZSA9PiBjYW5NaWdyYXRlRmlsZShiYXNlUGF0aCwgc291cmNlRmlsZSwgcHJvZ3JhbSkpO1xuICBjb25zdCB1cGRhdGVSZWNvcmRlcnMgPSBuZXcgTWFwPHRzLlNvdXJjZUZpbGUsIFVwZGF0ZVJlY29yZGVyPigpO1xuICBjb25zdCB0cmFuc2Zvcm0gPVxuICAgICAgbmV3IFVuZGVjb3JhdGVkQ2xhc3Nlc1dpdGhEZWNvcmF0ZWRGaWVsZHNUcmFuc2Zvcm0odHlwZUNoZWNrZXIsIGdldFVwZGF0ZVJlY29yZGVyKTtcblxuICAvLyBNaWdyYXRlIGFsbCBzb3VyY2UgZmlsZXMgaW4gdGhlIHByb2plY3QuXG4gIHRyYW5zZm9ybS5taWdyYXRlKHNvdXJjZUZpbGVzKS5mb3JFYWNoKCh7bm9kZSwgbWVzc2FnZX0pID0+IHtcbiAgICBjb25zdCBub2RlU291cmNlRmlsZSA9IG5vZGUuZ2V0U291cmNlRmlsZSgpO1xuICAgIGNvbnN0IHJlbGF0aXZlRmlsZVBhdGggPSByZWxhdGl2ZShiYXNlUGF0aCwgbm9kZVNvdXJjZUZpbGUuZmlsZU5hbWUpO1xuICAgIGNvbnN0IHtsaW5lLCBjaGFyYWN0ZXJ9ID1cbiAgICAgICAgdHMuZ2V0TGluZUFuZENoYXJhY3Rlck9mUG9zaXRpb24obm9kZS5nZXRTb3VyY2VGaWxlKCksIG5vZGUuZ2V0U3RhcnQoKSk7XG4gICAgZmFpbHVyZXMucHVzaChgJHtyZWxhdGl2ZUZpbGVQYXRofUAke2xpbmUgKyAxfToke2NoYXJhY3RlciArIDF9OiAke21lc3NhZ2V9YCk7XG4gIH0pO1xuXG4gIC8vIFJlY29yZCB0aGUgY2hhbmdlcyBjb2xsZWN0ZWQgaW4gdGhlIGltcG9ydCBtYW5hZ2VyLlxuICB0cmFuc2Zvcm0ucmVjb3JkQ2hhbmdlcygpO1xuXG4gIC8vIFdhbGsgdGhyb3VnaCBlYWNoIHVwZGF0ZSByZWNvcmRlciBhbmQgY29tbWl0IHRoZSB1cGRhdGUuIFdlIG5lZWQgdG8gY29tbWl0IHRoZVxuICAvLyB1cGRhdGVzIGluIGJhdGNoZXMgcGVyIHNvdXJjZSBmaWxlIGFzIHRoZXJlIGNhbiBiZSBvbmx5IG9uZSByZWNvcmRlciBwZXIgc291cmNlXG4gIC8vIGZpbGUgaW4gb3JkZXIgdG8gYXZvaWQgc2hpZnRlZCBjaGFyYWN0ZXIgb2Zmc2V0cy5cbiAgdXBkYXRlUmVjb3JkZXJzLmZvckVhY2gocmVjb3JkZXIgPT4gcmVjb3JkZXIuY29tbWl0VXBkYXRlKCkpO1xuXG4gIHJldHVybiBmYWlsdXJlcztcblxuICAvKiogR2V0cyB0aGUgdXBkYXRlIHJlY29yZGVyIGZvciB0aGUgc3BlY2lmaWVkIHNvdXJjZSBmaWxlLiAqL1xuICBmdW5jdGlvbiBnZXRVcGRhdGVSZWNvcmRlcihzb3VyY2VGaWxlOiB0cy5Tb3VyY2VGaWxlKTogVXBkYXRlUmVjb3JkZXIge1xuICAgIGlmICh1cGRhdGVSZWNvcmRlcnMuaGFzKHNvdXJjZUZpbGUpKSB7XG4gICAgICByZXR1cm4gdXBkYXRlUmVjb3JkZXJzLmdldChzb3VyY2VGaWxlKSE7XG4gICAgfVxuICAgIGNvbnN0IHRyZWVSZWNvcmRlciA9IHRyZWUuYmVnaW5VcGRhdGUocmVsYXRpdmUoYmFzZVBhdGgsIHNvdXJjZUZpbGUuZmlsZU5hbWUpKTtcbiAgICBjb25zdCByZWNvcmRlcjogVXBkYXRlUmVjb3JkZXIgPSB7XG4gICAgICBhZGRDbGFzc1RvZG8obm9kZTogdHMuQ2xhc3NEZWNsYXJhdGlvbiwgbWVzc2FnZTogc3RyaW5nKSB7XG4gICAgICAgIHRyZWVSZWNvcmRlci5pbnNlcnRSaWdodChub2RlLmdldFN0YXJ0KCksIGAvLyBUT0RPOiAke21lc3NhZ2V9XFxuYCk7XG4gICAgICB9LFxuICAgICAgYWRkQ2xhc3NEZWNvcmF0b3Iobm9kZTogdHMuQ2xhc3NEZWNsYXJhdGlvbiwgdGV4dDogc3RyaW5nKSB7XG4gICAgICAgIC8vIE5ldyBpbXBvcnRzIHNob3VsZCBiZSBpbnNlcnRlZCBhdCB0aGUgbGVmdCB3aGlsZSBkZWNvcmF0b3JzIHNob3VsZCBiZSBpbnNlcnRlZFxuICAgICAgICAvLyBhdCB0aGUgcmlnaHQgaW4gb3JkZXIgdG8gZW5zdXJlIHRoYXQgaW1wb3J0cyBhcmUgaW5zZXJ0ZWQgYmVmb3JlIHRoZSBkZWNvcmF0b3JcbiAgICAgICAgLy8gaWYgdGhlIHN0YXJ0IHBvc2l0aW9uIG9mIGltcG9ydCBhbmQgZGVjb3JhdG9yIGlzIHRoZSBzb3VyY2UgZmlsZSBzdGFydC5cbiAgICAgICAgdHJlZVJlY29yZGVyLmluc2VydFJpZ2h0KG5vZGUuZ2V0U3RhcnQoKSwgYCR7dGV4dH1cXG5gKTtcbiAgICAgIH0sXG4gICAgICBhZGROZXdJbXBvcnQoc3RhcnQ6IG51bWJlciwgaW1wb3J0VGV4dDogc3RyaW5nKSB7XG4gICAgICAgIC8vIE5ldyBpbXBvcnRzIHNob3VsZCBiZSBpbnNlcnRlZCBhdCB0aGUgbGVmdCB3aGlsZSBkZWNvcmF0b3JzIHNob3VsZCBiZSBpbnNlcnRlZFxuICAgICAgICAvLyBhdCB0aGUgcmlnaHQgaW4gb3JkZXIgdG8gZW5zdXJlIHRoYXQgaW1wb3J0cyBhcmUgaW5zZXJ0ZWQgYmVmb3JlIHRoZSBkZWNvcmF0b3JcbiAgICAgICAgLy8gaWYgdGhlIHN0YXJ0IHBvc2l0aW9uIG9mIGltcG9ydCBhbmQgZGVjb3JhdG9yIGlzIHRoZSBzb3VyY2UgZmlsZSBzdGFydC5cbiAgICAgICAgdHJlZVJlY29yZGVyLmluc2VydExlZnQoc3RhcnQsIGltcG9ydFRleHQpO1xuICAgICAgfSxcbiAgICAgIHVwZGF0ZUV4aXN0aW5nSW1wb3J0KG5hbWVkQmluZGluZ3M6IHRzLk5hbWVkSW1wb3J0cywgbmV3TmFtZWRCaW5kaW5nczogc3RyaW5nKSB7XG4gICAgICAgIHRyZWVSZWNvcmRlci5yZW1vdmUobmFtZWRCaW5kaW5ncy5nZXRTdGFydCgpLCBuYW1lZEJpbmRpbmdzLmdldFdpZHRoKCkpO1xuICAgICAgICB0cmVlUmVjb3JkZXIuaW5zZXJ0UmlnaHQobmFtZWRCaW5kaW5ncy5nZXRTdGFydCgpLCBuZXdOYW1lZEJpbmRpbmdzKTtcbiAgICAgIH0sXG4gICAgICBjb21taXRVcGRhdGUoKSB7XG4gICAgICAgIHRyZWUuY29tbWl0VXBkYXRlKHRyZWVSZWNvcmRlcik7XG4gICAgICB9XG4gICAgfTtcbiAgICB1cGRhdGVSZWNvcmRlcnMuc2V0KHNvdXJjZUZpbGUsIHJlY29yZGVyKTtcbiAgICByZXR1cm4gcmVjb3JkZXI7XG4gIH1cbn1cbiJdfQ==
|