@angular/core 12.1.0-next.6 → 12.1.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/bundles/core-testing.umd.js +239 -46
- package/bundles/core-testing.umd.js.map +1 -1
- package/bundles/core.umd.js +126 -49
- package/bundles/core.umd.js.map +1 -1
- package/core.d.ts +45 -19
- package/core.metadata.json +1 -1
- package/esm2015/src/application_init.js +5 -5
- package/esm2015/src/application_ref.js +34 -9
- 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 +2 -6
- package/esm2015/src/event_emitter.js +1 -1
- 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/metadata/do_boostrap.js +1 -1
- package/esm2015/src/render3/component_ref.js +1 -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.js +84 -7
- 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 +110 -21
- package/esm2015/testing/src/test_bed_common.js +7 -1
- package/esm2015/testing/src/test_hooks.js +45 -0
- package/esm2015/testing/src/testing.js +3 -3
- package/fesm2015/core.js +116 -45
- package/fesm2015/core.js.map +1 -1
- package/fesm2015/testing.js +216 -29
- package/fesm2015/testing.js.map +1 -1
- package/package.json +1 -1
- 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 +64 -5
- package/testing/testing.metadata.json +1 -1
- package/testing.d.ts +1 -1
- package/esm2015/testing/src/before_each.js +0 -33
- 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,224 +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
|
-
/** Gets the string representation of a helper function. */
|
|
10
|
-
export function getHelper(name, sourceFile, printer) {
|
|
11
|
-
const helperDeclaration = getHelperDeclaration(name);
|
|
12
|
-
return '\n' + printer.printNode(ts.EmitHint.Unspecified, helperDeclaration, sourceFile) + '\n';
|
|
13
|
-
}
|
|
14
|
-
/** Creates a function declaration for the specified helper name. */
|
|
15
|
-
function getHelperDeclaration(name) {
|
|
16
|
-
switch (name) {
|
|
17
|
-
case "AnyDuringRendererMigration" /* any */:
|
|
18
|
-
return createAnyTypeHelper();
|
|
19
|
-
case "__ngRendererCreateElementHelper" /* createElement */:
|
|
20
|
-
return getCreateElementHelper();
|
|
21
|
-
case "__ngRendererCreateTextHelper" /* createText */:
|
|
22
|
-
return getCreateTextHelper();
|
|
23
|
-
case "__ngRendererCreateTemplateAnchorHelper" /* createTemplateAnchor */:
|
|
24
|
-
return getCreateTemplateAnchorHelper();
|
|
25
|
-
case "__ngRendererProjectNodesHelper" /* projectNodes */:
|
|
26
|
-
return getProjectNodesHelper();
|
|
27
|
-
case "__ngRendererAnimateHelper" /* animate */:
|
|
28
|
-
return getAnimateHelper();
|
|
29
|
-
case "__ngRendererDestroyViewHelper" /* destroyView */:
|
|
30
|
-
return getDestroyViewHelper();
|
|
31
|
-
case "__ngRendererDetachViewHelper" /* detachView */:
|
|
32
|
-
return getDetachViewHelper();
|
|
33
|
-
case "__ngRendererAttachViewAfterHelper" /* attachViewAfter */:
|
|
34
|
-
return getAttachViewAfterHelper();
|
|
35
|
-
case "__ngRendererSetElementAttributeHelper" /* setElementAttribute */:
|
|
36
|
-
return getSetElementAttributeHelper();
|
|
37
|
-
case "__ngRendererSplitNamespaceHelper" /* splitNamespace */:
|
|
38
|
-
return getSplitNamespaceHelper();
|
|
39
|
-
}
|
|
40
|
-
}
|
|
41
|
-
/** Creates a helper for a custom `any` type during the migration. */
|
|
42
|
-
function createAnyTypeHelper() {
|
|
43
|
-
// type AnyDuringRendererMigration = any;
|
|
44
|
-
return ts.createTypeAliasDeclaration([], [], "AnyDuringRendererMigration" /* any */, [], ts.createKeywordTypeNode(ts.SyntaxKind.AnyKeyword));
|
|
45
|
-
}
|
|
46
|
-
/** Creates a function parameter that is typed as `any`. */
|
|
47
|
-
function getAnyTypedParameter(parameterName, isRequired = true) {
|
|
48
|
-
// Declare the parameter as `any` so we don't have to add extra logic to ensure that the
|
|
49
|
-
// generated code will pass type checking. Use our custom `any` type so people have an incentive
|
|
50
|
-
// to clean it up afterwards and to avoid potentially introducing lint warnings in G3.
|
|
51
|
-
const type = ts.createTypeReferenceNode("AnyDuringRendererMigration" /* any */, []);
|
|
52
|
-
return ts.createParameter([], [], undefined, parameterName, isRequired ? undefined : ts.createToken(ts.SyntaxKind.QuestionToken), type);
|
|
53
|
-
}
|
|
54
|
-
/** Creates a helper for `createElement`. */
|
|
55
|
-
function getCreateElementHelper() {
|
|
56
|
-
const renderer = ts.createIdentifier('renderer');
|
|
57
|
-
const parent = ts.createIdentifier('parent');
|
|
58
|
-
const namespaceAndName = ts.createIdentifier('namespaceAndName');
|
|
59
|
-
const name = ts.createIdentifier('name');
|
|
60
|
-
const namespace = ts.createIdentifier('namespace');
|
|
61
|
-
// [namespace, name] = splitNamespace(namespaceAndName);
|
|
62
|
-
const namespaceAndNameVariable = ts.createVariableDeclaration(ts.createArrayBindingPattern([namespace, name].map(id => ts.createBindingElement(undefined, undefined, id))), undefined, ts.createCall(ts.createIdentifier("__ngRendererSplitNamespaceHelper" /* splitNamespace */), [], [namespaceAndName]));
|
|
63
|
-
// `renderer.createElement(name, namespace)`.
|
|
64
|
-
const creationCall = ts.createCall(ts.createPropertyAccess(renderer, 'createElement'), [], [name, namespace]);
|
|
65
|
-
return getCreationHelper("__ngRendererCreateElementHelper" /* createElement */, creationCall, renderer, parent, [namespaceAndName], [ts.createVariableStatement(undefined, ts.createVariableDeclarationList([namespaceAndNameVariable], ts.NodeFlags.Const))]);
|
|
66
|
-
}
|
|
67
|
-
/** Creates a helper for `createText`. */
|
|
68
|
-
function getCreateTextHelper() {
|
|
69
|
-
const renderer = ts.createIdentifier('renderer');
|
|
70
|
-
const parent = ts.createIdentifier('parent');
|
|
71
|
-
const value = ts.createIdentifier('value');
|
|
72
|
-
// `renderer.createText(value)`.
|
|
73
|
-
const creationCall = ts.createCall(ts.createPropertyAccess(renderer, 'createText'), [], [value]);
|
|
74
|
-
return getCreationHelper("__ngRendererCreateTextHelper" /* createText */, creationCall, renderer, parent, [value]);
|
|
75
|
-
}
|
|
76
|
-
/** Creates a helper for `createTemplateAnchor`. */
|
|
77
|
-
function getCreateTemplateAnchorHelper() {
|
|
78
|
-
const renderer = ts.createIdentifier('renderer');
|
|
79
|
-
const parent = ts.createIdentifier('parent');
|
|
80
|
-
// `renderer.createComment('')`.
|
|
81
|
-
const creationCall = ts.createCall(ts.createPropertyAccess(renderer, 'createComment'), [], [ts.createStringLiteral('')]);
|
|
82
|
-
return getCreationHelper("__ngRendererCreateTemplateAnchorHelper" /* createTemplateAnchor */, creationCall, renderer, parent);
|
|
83
|
-
}
|
|
84
|
-
/**
|
|
85
|
-
* Gets the function declaration for a creation helper. This is reused between `createElement`,
|
|
86
|
-
* `createText` and `createTemplateAnchor` which follow a very similar pattern.
|
|
87
|
-
* @param functionName Function that the helper should have.
|
|
88
|
-
* @param creationCall Expression that is used to create a node inside the function.
|
|
89
|
-
* @param rendererParameter Parameter for the `renderer`.
|
|
90
|
-
* @param parentParameter Parameter for the `parent` inside the function.
|
|
91
|
-
* @param extraParameters Extra parameters to be added to the end.
|
|
92
|
-
* @param precedingVariables Extra variables to be added before the one that creates the `node`.
|
|
93
|
-
*/
|
|
94
|
-
function getCreationHelper(functionName, creationCall, renderer, parent, extraParameters = [], precedingVariables = []) {
|
|
95
|
-
const node = ts.createIdentifier('node');
|
|
96
|
-
// `const node = {{creationCall}}`.
|
|
97
|
-
const nodeVariableStatement = ts.createVariableStatement(undefined, ts.createVariableDeclarationList([ts.createVariableDeclaration(node, undefined, creationCall)], ts.NodeFlags.Const));
|
|
98
|
-
// `if (parent) { renderer.appendChild(parent, node) }`.
|
|
99
|
-
const guardedAppendChildCall = ts.createIf(parent, ts.createBlock([ts.createExpressionStatement(ts.createCall(ts.createPropertyAccess(renderer, 'appendChild'), [], [parent, node]))], true));
|
|
100
|
-
return ts.createFunctionDeclaration([], [], undefined, functionName, [], [renderer, parent, ...extraParameters].map(name => getAnyTypedParameter(name)), undefined, ts.createBlock([
|
|
101
|
-
...precedingVariables, nodeVariableStatement, guardedAppendChildCall,
|
|
102
|
-
ts.createReturn(node)
|
|
103
|
-
], true));
|
|
104
|
-
}
|
|
105
|
-
/** Creates a helper for `projectNodes`. */
|
|
106
|
-
function getProjectNodesHelper() {
|
|
107
|
-
const renderer = ts.createIdentifier('renderer');
|
|
108
|
-
const parent = ts.createIdentifier('parent');
|
|
109
|
-
const nodes = ts.createIdentifier('nodes');
|
|
110
|
-
const incrementor = ts.createIdentifier('i');
|
|
111
|
-
// for (let i = 0; i < nodes.length; i++) {
|
|
112
|
-
// renderer.appendChild(parent, nodes[i]);
|
|
113
|
-
// }
|
|
114
|
-
const loopInitializer = ts.createVariableDeclarationList([ts.createVariableDeclaration(incrementor, undefined, ts.createNumericLiteral('0'))], ts.NodeFlags.Let);
|
|
115
|
-
const loopCondition = ts.createBinary(incrementor, ts.SyntaxKind.LessThanToken, ts.createPropertyAccess(nodes, ts.createIdentifier('length')));
|
|
116
|
-
const appendStatement = ts.createExpressionStatement(ts.createCall(ts.createPropertyAccess(renderer, 'appendChild'), [], [parent, ts.createElementAccess(nodes, incrementor)]));
|
|
117
|
-
const loop = ts.createFor(loopInitializer, loopCondition, ts.createPostfix(incrementor, ts.SyntaxKind.PlusPlusToken), ts.createBlock([appendStatement]));
|
|
118
|
-
return ts.createFunctionDeclaration([], [], undefined, "__ngRendererProjectNodesHelper" /* projectNodes */, [], [renderer, parent, nodes].map(name => getAnyTypedParameter(name)), undefined, ts.createBlock([loop], true));
|
|
119
|
-
}
|
|
120
|
-
/** Creates a helper for `animate`. */
|
|
121
|
-
function getAnimateHelper() {
|
|
122
|
-
// throw new Error('...');
|
|
123
|
-
const throwStatement = ts.createThrow(ts.createNew(ts.createIdentifier('Error'), [], [ts.createStringLiteral('Renderer.animate is no longer supported!')]));
|
|
124
|
-
return ts.createFunctionDeclaration([], [], undefined, "__ngRendererAnimateHelper" /* animate */, [], [], undefined, ts.createBlock([throwStatement], true));
|
|
125
|
-
}
|
|
126
|
-
/** Creates a helper for `destroyView`. */
|
|
127
|
-
function getDestroyViewHelper() {
|
|
128
|
-
const renderer = ts.createIdentifier('renderer');
|
|
129
|
-
const allNodes = ts.createIdentifier('allNodes');
|
|
130
|
-
const incrementor = ts.createIdentifier('i');
|
|
131
|
-
// for (let i = 0; i < allNodes.length; i++) {
|
|
132
|
-
// renderer.destroyNode(allNodes[i]);
|
|
133
|
-
// }
|
|
134
|
-
const loopInitializer = ts.createVariableDeclarationList([ts.createVariableDeclaration(incrementor, undefined, ts.createNumericLiteral('0'))], ts.NodeFlags.Let);
|
|
135
|
-
const loopCondition = ts.createBinary(incrementor, ts.SyntaxKind.LessThanToken, ts.createPropertyAccess(allNodes, ts.createIdentifier('length')));
|
|
136
|
-
const destroyStatement = ts.createExpressionStatement(ts.createCall(ts.createPropertyAccess(renderer, 'destroyNode'), [], [ts.createElementAccess(allNodes, incrementor)]));
|
|
137
|
-
const loop = ts.createFor(loopInitializer, loopCondition, ts.createPostfix(incrementor, ts.SyntaxKind.PlusPlusToken), ts.createBlock([destroyStatement]));
|
|
138
|
-
return ts.createFunctionDeclaration([], [], undefined, "__ngRendererDestroyViewHelper" /* destroyView */, [], [renderer, allNodes].map(name => getAnyTypedParameter(name)), undefined, ts.createBlock([loop], true));
|
|
139
|
-
}
|
|
140
|
-
/** Creates a helper for `detachView`. */
|
|
141
|
-
function getDetachViewHelper() {
|
|
142
|
-
const renderer = ts.createIdentifier('renderer');
|
|
143
|
-
const rootNodes = ts.createIdentifier('rootNodes');
|
|
144
|
-
const incrementor = ts.createIdentifier('i');
|
|
145
|
-
const node = ts.createIdentifier('node');
|
|
146
|
-
// for (let i = 0; i < rootNodes.length; i++) {
|
|
147
|
-
// const node = rootNodes[i];
|
|
148
|
-
// renderer.removeChild(renderer.parentNode(node), node);
|
|
149
|
-
// }
|
|
150
|
-
const loopInitializer = ts.createVariableDeclarationList([ts.createVariableDeclaration(incrementor, undefined, ts.createNumericLiteral('0'))], ts.NodeFlags.Let);
|
|
151
|
-
const loopCondition = ts.createBinary(incrementor, ts.SyntaxKind.LessThanToken, ts.createPropertyAccess(rootNodes, ts.createIdentifier('length')));
|
|
152
|
-
// const node = rootNodes[i];
|
|
153
|
-
const nodeVariableStatement = ts.createVariableStatement(undefined, ts.createVariableDeclarationList([ts.createVariableDeclaration(node, undefined, ts.createElementAccess(rootNodes, incrementor))], ts.NodeFlags.Const));
|
|
154
|
-
// renderer.removeChild(renderer.parentNode(node), node);
|
|
155
|
-
const removeCall = ts.createCall(ts.createPropertyAccess(renderer, 'removeChild'), [], [ts.createCall(ts.createPropertyAccess(renderer, 'parentNode'), [], [node]), node]);
|
|
156
|
-
const loop = ts.createFor(loopInitializer, loopCondition, ts.createPostfix(incrementor, ts.SyntaxKind.PlusPlusToken), ts.createBlock([nodeVariableStatement, ts.createExpressionStatement(removeCall)]));
|
|
157
|
-
return ts.createFunctionDeclaration([], [], undefined, "__ngRendererDetachViewHelper" /* detachView */, [], [renderer, rootNodes].map(name => getAnyTypedParameter(name)), undefined, ts.createBlock([loop], true));
|
|
158
|
-
}
|
|
159
|
-
/** Creates a helper for `attachViewAfter` */
|
|
160
|
-
function getAttachViewAfterHelper() {
|
|
161
|
-
const renderer = ts.createIdentifier('renderer');
|
|
162
|
-
const node = ts.createIdentifier('node');
|
|
163
|
-
const rootNodes = ts.createIdentifier('rootNodes');
|
|
164
|
-
const parent = ts.createIdentifier('parent');
|
|
165
|
-
const nextSibling = ts.createIdentifier('nextSibling');
|
|
166
|
-
const incrementor = ts.createIdentifier('i');
|
|
167
|
-
const createConstWithMethodCallInitializer = (constName, methodToCall) => {
|
|
168
|
-
return ts.createVariableStatement(undefined, ts.createVariableDeclarationList([ts.createVariableDeclaration(constName, undefined, ts.createCall(ts.createPropertyAccess(renderer, methodToCall), [], [node]))], ts.NodeFlags.Const));
|
|
169
|
-
};
|
|
170
|
-
// const parent = renderer.parentNode(node);
|
|
171
|
-
const parentVariableStatement = createConstWithMethodCallInitializer(parent, 'parentNode');
|
|
172
|
-
// const nextSibling = renderer.nextSibling(node);
|
|
173
|
-
const nextSiblingVariableStatement = createConstWithMethodCallInitializer(nextSibling, 'nextSibling');
|
|
174
|
-
// for (let i = 0; i < rootNodes.length; i++) {
|
|
175
|
-
// renderer.insertBefore(parentElement, rootNodes[i], nextSibling);
|
|
176
|
-
// }
|
|
177
|
-
const loopInitializer = ts.createVariableDeclarationList([ts.createVariableDeclaration(incrementor, undefined, ts.createNumericLiteral('0'))], ts.NodeFlags.Let);
|
|
178
|
-
const loopCondition = ts.createBinary(incrementor, ts.SyntaxKind.LessThanToken, ts.createPropertyAccess(rootNodes, ts.createIdentifier('length')));
|
|
179
|
-
const insertBeforeCall = ts.createCall(ts.createPropertyAccess(renderer, 'insertBefore'), [], [parent, ts.createElementAccess(rootNodes, incrementor), nextSibling]);
|
|
180
|
-
const loop = ts.createFor(loopInitializer, loopCondition, ts.createPostfix(incrementor, ts.SyntaxKind.PlusPlusToken), ts.createBlock([ts.createExpressionStatement(insertBeforeCall)]));
|
|
181
|
-
return ts.createFunctionDeclaration([], [], undefined, "__ngRendererAttachViewAfterHelper" /* attachViewAfter */, [], [renderer, node, rootNodes].map(name => getAnyTypedParameter(name)), undefined, ts.createBlock([parentVariableStatement, nextSiblingVariableStatement, loop], true));
|
|
182
|
-
}
|
|
183
|
-
/** Creates a helper for `setElementAttribute` */
|
|
184
|
-
function getSetElementAttributeHelper() {
|
|
185
|
-
const renderer = ts.createIdentifier('renderer');
|
|
186
|
-
const element = ts.createIdentifier('element');
|
|
187
|
-
const namespaceAndName = ts.createIdentifier('namespaceAndName');
|
|
188
|
-
const value = ts.createIdentifier('value');
|
|
189
|
-
const name = ts.createIdentifier('name');
|
|
190
|
-
const namespace = ts.createIdentifier('namespace');
|
|
191
|
-
// [namespace, name] = splitNamespace(namespaceAndName);
|
|
192
|
-
const namespaceAndNameVariable = ts.createVariableDeclaration(ts.createArrayBindingPattern([namespace, name].map(id => ts.createBindingElement(undefined, undefined, id))), undefined, ts.createCall(ts.createIdentifier("__ngRendererSplitNamespaceHelper" /* splitNamespace */), [], [namespaceAndName]));
|
|
193
|
-
// renderer.setAttribute(element, name, value, namespace);
|
|
194
|
-
const setCall = ts.createCall(ts.createPropertyAccess(renderer, 'setAttribute'), [], [element, name, value, namespace]);
|
|
195
|
-
// renderer.removeAttribute(element, name, namespace);
|
|
196
|
-
const removeCall = ts.createCall(ts.createPropertyAccess(renderer, 'removeAttribute'), [], [element, name, namespace]);
|
|
197
|
-
// if (value != null) { setCall() } else { removeCall }
|
|
198
|
-
const ifStatement = ts.createIf(ts.createBinary(value, ts.SyntaxKind.ExclamationEqualsToken, ts.createNull()), ts.createBlock([ts.createExpressionStatement(setCall)], true), ts.createBlock([ts.createExpressionStatement(removeCall)], true));
|
|
199
|
-
const functionBody = ts.createBlock([
|
|
200
|
-
ts.createVariableStatement(undefined, ts.createVariableDeclarationList([namespaceAndNameVariable], ts.NodeFlags.Const)),
|
|
201
|
-
ifStatement
|
|
202
|
-
], true);
|
|
203
|
-
return ts.createFunctionDeclaration([], [], undefined, "__ngRendererSetElementAttributeHelper" /* setElementAttribute */, [], [
|
|
204
|
-
getAnyTypedParameter(renderer), getAnyTypedParameter(element),
|
|
205
|
-
getAnyTypedParameter(namespaceAndName), getAnyTypedParameter(value, false)
|
|
206
|
-
], undefined, functionBody);
|
|
207
|
-
}
|
|
208
|
-
/** Creates a helper for splitting a name that might contain a namespace. */
|
|
209
|
-
function getSplitNamespaceHelper() {
|
|
210
|
-
const name = ts.createIdentifier('name');
|
|
211
|
-
const match = ts.createIdentifier('match');
|
|
212
|
-
const regex = ts.createRegularExpressionLiteral('/^:([^:]+):(.+)$/');
|
|
213
|
-
const matchCall = ts.createCall(ts.createPropertyAccess(name, 'match'), [], [regex]);
|
|
214
|
-
// const match = name.split(regex);
|
|
215
|
-
const matchVariable = ts.createVariableDeclarationList([ts.createVariableDeclaration(match, undefined, matchCall)], ts.NodeFlags.Const);
|
|
216
|
-
// return [match[1], match[2]];
|
|
217
|
-
const matchReturn = ts.createReturn(ts.createArrayLiteral([ts.createElementAccess(match, 1), ts.createElementAccess(match, 2)]));
|
|
218
|
-
// if (name[0] === ':') { const match = ...; return ...; }
|
|
219
|
-
const ifStatement = ts.createIf(ts.createBinary(ts.createElementAccess(name, 0), ts.SyntaxKind.EqualsEqualsEqualsToken, ts.createStringLiteral(':')), ts.createBlock([ts.createVariableStatement([], matchVariable), matchReturn], true));
|
|
220
|
-
// return ['', name];
|
|
221
|
-
const elseReturn = ts.createReturn(ts.createArrayLiteral([ts.createStringLiteral(''), name]));
|
|
222
|
-
return ts.createFunctionDeclaration([], [], undefined, "__ngRendererSplitNamespaceHelper" /* splitNamespace */, [], [getAnyTypedParameter(name)], undefined, ts.createBlock([ifStatement, elseReturn], true));
|
|
223
|
-
}
|
|
224
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaGVscGVycy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL3BhY2thZ2VzL2NvcmUvc2NoZW1hdGljcy9taWdyYXRpb25zL3JlbmRlcmVyLXRvLXJlbmRlcmVyMi9oZWxwZXJzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7R0FNRztBQUVILE9BQU8sS0FBSyxFQUFFLE1BQU0sWUFBWSxDQUFDO0FBaUJqQywyREFBMkQ7QUFDM0QsTUFBTSxVQUFVLFNBQVMsQ0FDckIsSUFBb0IsRUFBRSxVQUF5QixFQUFFLE9BQW1CO0lBQ3RFLE1BQU0saUJBQWlCLEdBQUcsb0JBQW9CLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDckQsT0FBTyxJQUFJLEdBQUcsT0FBTyxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUMsUUFBUSxDQUFDLFdBQVcsRUFBRSxpQkFBaUIsRUFBRSxVQUFVLENBQUMsR0FBRyxJQUFJLENBQUM7QUFDakcsQ0FBQztBQUVELG9FQUFvRTtBQUNwRSxTQUFTLG9CQUFvQixDQUFDLElBQW9CO0lBQ2hELFFBQVEsSUFBSSxFQUFFO1FBQ1o7WUFDRSxPQUFPLG1CQUFtQixFQUFFLENBQUM7UUFDL0I7WUFDRSxPQUFPLHNCQUFzQixFQUFFLENBQUM7UUFDbEM7WUFDRSxPQUFPLG1CQUFtQixFQUFFLENBQUM7UUFDL0I7WUFDRSxPQUFPLDZCQUE2QixFQUFFLENBQUM7UUFDekM7WUFDRSxPQUFPLHFCQUFxQixFQUFFLENBQUM7UUFDakM7WUFDRSxPQUFPLGdCQUFnQixFQUFFLENBQUM7UUFDNUI7WUFDRSxPQUFPLG9CQUFvQixFQUFFLENBQUM7UUFDaEM7WUFDRSxPQUFPLG1CQUFtQixFQUFFLENBQUM7UUFDL0I7WUFDRSxPQUFPLHdCQUF3QixFQUFFLENBQUM7UUFDcEM7WUFDRSxPQUFPLDRCQUE0QixFQUFFLENBQUM7UUFDeEM7WUFDRSxPQUFPLHVCQUF1QixFQUFFLENBQUM7S0FDcEM7QUFD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QUUsQ0FBQyx5QkFBeUIsQ0FDL0IsRUFBRSxFQUFFLEVBQUUsRUFBRSxTQUFTLDJEQUFpQyxFQUFFLEVBQUUsQ0FBQyxvQkFBb0IsQ0FBQyxJQUFJLENBQUMsQ0FBQyxFQUFFLFNBQVMsRUFDN0YsRUFBRSxDQUFDLFdBQVcsQ0FBQyxDQUFDLFdBQVcsRUFBRSxVQUFVLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDO0FBQ3ZELENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgR29vZ2xlIExMQyBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICpcbiAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlXG4gKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlXG4gKi9cblxuaW1wb3J0ICogYXMgdHMgZnJvbSAndHlwZXNjcmlwdCc7XG5cbi8qKiBOYW1lcyBvZiB0aGUgaGVscGVyIGZ1bmN0aW9ucyB0aGF0IGFyZSBzdXBwb3J0ZWQgZm9yIHRoaXMgbWlncmF0aW9uLiAqL1xuZXhwb3J0IGNvbnN0IGVudW0gSGVscGVyRnVuY3Rpb24ge1xuICBhbnkgPSAnQW55RHVyaW5nUmVuZGVyZXJNaWdyYXRpb24nLFxuICBjcmVhdGVFbGVtZW50ID0gJ19fbmdSZW5kZXJlckNyZWF0ZUVsZW1lbnRIZWxwZXInLFxuICBjcmVhdGVUZXh0ID0gJ19fbmdSZW5kZXJlckNyZWF0ZVRleHRIZWxwZXInLFxuICBjcmVhdGVUZW1wbGF0ZUFuY2hvciA9ICdfX25nUmVuZGVyZXJDcmVhdGVUZW1wbGF0ZUFuY2hvckhlbHBlcicsXG4gIHByb2plY3ROb2RlcyA9ICdfX25nUmVuZGVyZXJQcm9qZWN0Tm9kZXNIZWxwZXInLFxuICBhbmltYXRlID0gJ19fbmdSZW5kZXJlckFuaW1hdGVIZWxwZXInLFxuICBkZXN0cm95VmlldyA9ICdfX25nUmVuZGVyZXJEZXN0cm95Vmlld0hlbHBlcicsXG4gIGRldGFjaFZpZXcgPSAnX19uZ1JlbmRlcmVyRGV0YWNoVmlld0hlbHBlcicsXG4gIGF0dGFjaFZpZXdBZnRlciA9ICdfX25nUmVuZGVyZXJBdHRhY2hWaWV3QWZ0ZXJIZWxwZXInLFxuICBzcGxpdE5hbWVzcGFjZSA9ICdfX25nUmVuZGVyZXJTcGxpdE5hbWVzcGFjZUhlbHBlcicsXG4gIHNldEVsZW1lbnRBdHRyaWJ1dGUgPSAnX19uZ1JlbmRlcmVyU2V0RWxlbWVudEF0dHJpYnV0ZUhlbHBlcidcbn1cblxuLyoqIEdldHMgdGhlIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiBhIGhlbHBlciBmdW5jdGlvbi4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRIZWxwZXIoXG4gICAgbmFtZTogSGVscGVyRnVuY3Rpb24sIHNvdXJjZUZpbGU6IHRzLlNvdXJjZUZpbGUsIHByaW50ZXI6IHRzLlByaW50ZXIpOiBzdHJpbmcge1xuICBjb25zdCBoZWxwZXJEZWNsYXJhdGlvbiA9IGdldEhlbHBlckRlY2xhcmF0aW9uKG5hbWUpO1xuICByZXR1cm4gJ1xcbicgKyBwcmludGVyLnByaW50Tm9kZSh0cy5FbWl0SGludC5VbnNwZWNpZmllZCwgaGVscGVyRGVjbGFyYXRpb24sIHNvdXJjZUZpbGUpICsgJ1xcbic7XG59XG5cbi8qKiBDcmVhdGVzIGEgZnVuY3Rpb24gZGVjbGFyYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgaGVscGVyIG5hbWUuICovXG5mdW5jdGlvbiBnZXRIZWxwZXJEZWNsYXJhdGlvbihuYW1lOiBIZWxwZXJGdW5jdGlvbik6IHRzLk5vZGUge1xuICBzd2l0Y2ggKG5hbWUpIHtcbiAgICBjYXNlIEhlbHBlckZ1bmN0aW9uLmFueTpcbiAgICAgIHJldHVybiBjcmVhdGVBbnlUeXBlSGVscGVyKCk7XG4gICAgY2FzZSBIZWxwZXJGdW5jdGlvbi5jcmVhdGVFbGVtZW50OlxuICAgICAgcmV0dXJuIGdldENyZWF0ZUVsZW1lbnRIZWxwZXIoKTtcbiAgICBjYXNlIEhlbHBlckZ1bmN0aW9uLmNyZWF0ZVRleHQ6XG4gICAgICByZXR1cm4gZ2V0Q3JlYXRlVGV4dEhlbHBlcigpO1xuICAgIGNhc2UgSGVscGVyRnVuY3Rpb24uY3JlYXRlVGVtcGxhdGVBbmNob3I6XG4gICAgICByZXR1cm4gZ2V0Q3JlYXRlVGVtcGxhdGVBbmNob3JIZWxwZXIoKTtcbiAgICBjYXNlIEhlbHBlckZ1bmN0aW9uLnByb2plY3ROb2RlczpcbiAgICAgIHJldHVybiBnZXRQcm9qZWN0Tm9kZXNIZWxwZXIoKTtcbiAgICBjYXNlIEhlbHBlckZ1bmN0aW9uLmFuaW1hdGU6XG4gICAgICByZXR1cm4gZ2V0QW5pbWF0ZUhlbHBlcigpO1xuICAgIGNhc2UgSGVscGVyRnVuY3Rpb24uZGVzdHJveVZpZXc6XG4gICAgICByZXR1cm4gZ2V0RGVzdHJveVZpZXdIZWxwZXIoKTtcbiAgICBjYXNlIEhlbHBlckZ1bmN0aW9uLmRldGFjaFZpZXc6XG4gICAgICByZXR1cm4gZ2V0RGV0YWNoVmlld0hlbHBlcigpO1xuICAgIGNhc2UgSGVscGVyRnVuY3Rpb24uYXR0YWNoVmlld0FmdGVyOlxuICAgICAgcmV0dXJuIGdldEF0dGFjaFZpZXdBZnRlckhlbHBlcigpO1xuICAgIGNhc2UgSGVscGVyRnVuY3Rpb24uc2V0RWxlbWVudEF0dHJpYnV0ZTpcbiAgICAgIHJldHVybiBnZXRTZXRFbGVtZW50QXR0cmlidXRlSGVscGVyKCk7XG4gICAgY2FzZSBIZWxwZXJGdW5jdGlvbi5zcGxpdE5hbWVzcGFjZTpcbiAgICAgIHJldHVybiBnZXRTcGxpdE5hbWVzcGFjZUhlbHBlcigpO1xuICB9XG59XG5cbi8qKiBDcmVhdGVzIGEgaGVscGVyIGZvciBhIGN1c3RvbSBgYW55YCB0eXBlIGR1cmluZyB0aGUgbWlncmF0aW9uLiAqL1xuZnVuY3Rpb24gY3JlYXRlQW55VHlwZUhlbHBlcigpOiB0cy5UeXBlQWxpYXNEZWNsYXJhdGlvbiB7XG4gIC8vIHR5cGUgQW55RHVyaW5nUmVuZGVyZXJNaWdyYXRpb24gPSBhbnk7XG4gIHJldHVybiB0cy5jcmVhdGVUeXBlQWxpYXNEZWNsYXJhdGlvbihcbiAgICAgIFtdLCBbXSwgSGVscGVyRnVuY3Rpb24uYW55LCBbXSwgdHMuY3JlYXRlS2V5d29yZFR5cGVOb2RlKHRzLlN5bnRheEtpbmQuQW55S2V5d29yZCkpO1xufVxuXG4vKiogQ3JlYXRlcyBhIGZ1bmN0aW9uIHBhcmFtZXRlciB0aGF0IGlzIHR5cGVkIGFzIGBhbnlgLiAqL1xuZnVuY3Rpb24gZ2V0QW55VHlwZWRQYXJhbWV0ZXIoXG4gICAgcGFyYW1ldGVyTmFtZTogc3RyaW5nfHRzLklkZW50aWZpZXIsIGlzUmVxdWlyZWQgPSB0cnVlKTogdHMuUGFyYW1ldGVyRGVjbGFyYXRpb24ge1xuICAvLyBEZWNsYXJlIHRoZSBwYXJhbWV0ZXIgYXMgYGFueWAgc28gd2UgZG9uJ3QgaGF2ZSB0byBhZGQgZXh0cmEgbG9naWMgdG8gZW5zdXJlIHRoYXQgdGhlXG4gIC8vIGdlbmVyYXRlZCBjb2RlIHdpbGwgcGFzcyB0eXBlIGNoZWNraW5nLiBVc2Ugb3VyIGN1c3RvbSBgYW55YCB0eXBlIHNvIHBlb3BsZSBoYXZlIGFuIGluY2VudGl2ZVxuICAvLyB0byBjbGVhbiBpdCB1cCBhZnRlcndhcmRzIGFuZCB0byBhdm9pZCBwb3RlbnRpYWxseSBpbnRyb2R1Y2luZyBsaW50IHdhcm5pbmdzIGluIEczLlxuICBjb25zdCB0eXBlID0gdHMuY3JlYXRlVHlwZVJlZmVyZW5jZU5vZGUoSGVscGVyRnVuY3Rpb24uYW55LCBbXSk7XG4gIHJldHVybiB0cy5jcmVhdGVQYXJhbWV0ZXIoXG4gICAgICBbXSwgW10sIHVuZGVmaW5lZCwgcGFyYW1ldGVyTmFtZSxcbiAgICAgIGlzUmVxdWlyZWQgPyB1bmRlZmluZWQgOiB0cy5jcmVhdGVUb2tlbih0cy5TeW50YXhLaW5kLlF1ZXN0aW9uVG9rZW4pLCB0eXBlKTtcbn1cblxuLyoqIENyZWF0ZXMgYSBoZWxwZXIgZm9yIGBjcmVhdGVFbGVtZW50YC4gKi9cbmZ1bmN0aW9uIGdldENyZWF0ZUVsZW1lbnRIZWxwZXIoKTogdHMuRnVuY3Rpb25EZWNsYXJhdGlvbiB7XG4gIGNvbnN0IHJlbmRlcmVyID0gdHMuY3JlYXRlSWRlbnRpZmllcigncmVuZGVyZXInKTtcbiAgY29uc3QgcGFyZW50ID0gdHMuY3JlYXRlSWRlbnRpZmllcigncGFyZW50Jyk7XG4gIGNvbnN0IG5hbWVzcGFjZUFuZE5hbWUgPSB0cy5jcmVhdGVJZGVudGlmaWVyKCduYW1lc3BhY2VBbmROYW1lJyk7XG4gIGNvbnN0IG5hbWUgPSB0cy5jcmVhdGVJZGVudGlmaWVyKCduYW1lJyk7XG4gIGNvbnN0IG5hbWVzcGFjZSA9IHRzLmNyZWF0ZUlkZW50aWZpZXIoJ25hbWVzcGFjZScpO1xuXG4gIC8vIFtuYW1lc3BhY2UsIG5hbWVdID0gc3BsaXROYW1lc3BhY2UobmFtZXNwYWNlQW5kTmFtZSk7XG4gIGNvbnN0IG5hbWVzcGFjZUFuZE5hbWVWYXJpYWJsZSA9IHRzLmNyZWF0ZVZhcmlhYmxlRGVjbGFyYXRpb24oXG4gICAgICB0cy5jcmVhdGVBcnJheUJpbmRpbmdQYXR0ZXJuKFxuICAgICAgICAgIFtuYW1lc3BhY2UsIG5hbWVdLm1hcChpZCA9PiB0cy5jcmVhdGVCaW5kaW5nRWxlbWVudCh1bmRlZmluZWQsIHVuZGVmaW5lZCwgaWQpKSksXG4gICAgICB1bmRlZmluZWQsXG4gICAgICB0cy5jcmVhdGVDYWxsKHRzLmNyZWF0ZUlkZW50aWZpZXIoSGVscGVyRnVuY3Rpb24uc3BsaXROYW1lc3BhY2UpLCBbXSwgW25hbWVzcGFjZUFuZE5hbWVdKSk7XG5cbiAgLy8gYHJlbmRlcmVyLmNyZWF0ZUVsZW1lbnQobmFtZSwgbmFtZXNwYWNlKWAuXG4gIGNvbnN0IGNyZWF0aW9uQ2FsbCA9XG4gICAgICB0cy5jcmVhdGVDYWxsKHRzLmNyZWF0ZVByb3BlcnR5QWNjZXNzKHJlbmRlcmVyLCAnY3JlYXRlRWxlbWVudCcpLCBbXSwgW25hbWUsIG5hbWVzcGFjZV0pO1xuXG4gIHJldHVybiBnZXRDcmVhdGlvbkhlbHBlcihcbiAgICAgIEhlbHBlckZ1bmN0aW9uLmNyZWF0ZUVsZW1lbnQsIGNyZWF0aW9uQ2FsbCwgcmVuZGVyZXIsIHBhcmVudCwgW25hbWVzcGFjZUFuZE5hbWVdLFxuICAgICAgW3RzLmNyZWF0ZVZhcmlhYmxlU3RhdGVtZW50KFxuICAgICAgICAgIHVuZGVmaW5lZCxcbiAgICAgICAgICB0cy5jcmVhdGVWYXJpYWJsZURlY2xhcmF0aW9uTGlzdChbbmFtZXNwYWNlQW5kTmFtZVZhcmlhYmxlXSwgdHMuTm9kZUZsYWdzLkNvbnN0KSldKTtcbn1cblxuLyoqIENyZWF0ZXMgYSBoZWxwZXIgZm9yIGBjcmVhdGVUZXh0YC4gKi9cbmZ1bmN0aW9uIGdldENyZWF0ZVRleHRIZWxwZXIoKTogdHMuRnVuY3Rpb25EZWNsYXJhdGlvbiB7XG4gIGNvbnN0IHJlbmRlcmVyID0gdHMuY3JlYXRlSWRlbnRpZmllcigncmVuZGVyZXInKTtcbiAgY29uc3QgcGFyZW50ID0gdHMuY3JlYXRlSWRlbnRpZmllcigncGFyZW50Jyk7XG4gIGNvbnN0IHZhbHVlID0gdHMuY3JlYXRlSWRlbnRpZmllcigndmFsdWUnKTtcblxuICAvLyBgcmVuZGVyZXIuY3JlYXRlVGV4dCh2YWx1ZSlgLlxuICBjb25zdCBjcmVhdGlvbkNhbGwgPSB0cy5jcmVhdGVDYWxsKHRzLmNyZWF0ZVByb3BlcnR5QWNjZXNzKHJlbmRlcmVyLCAnY3JlYXRlVGV4dCcpLCBbXSwgW3ZhbHVlXSk7XG5cbiAgcmV0dXJuIGdldENyZWF0aW9uSGVscGVyKEhlbHBlckZ1bmN0aW9uLmNyZWF0ZVRleHQsIGNyZWF0aW9uQ2FsbCwgcmVuZGVyZXIsIHBhcmVudCwgW3ZhbHVlXSk7XG59XG5cbi8qKiBDcmVhdGVzIGEgaGVscGVyIGZvciBgY3JlYXRlVGVtcGxhdGVBbmNob3JgLiAqL1xuZnVuY3Rpb24gZ2V0Q3JlYXRlVGVtcGxhdGVBbmNob3JIZWxwZXIoKTogdHMuRnVuY3Rpb25EZWNsYXJhdGlvbiB7XG4gIGNvbnN0IHJlbmRlcmVyID0gdHMuY3JlYXRlSWRlbnRpZmllcigncmVuZGVyZXInKTtcbiAgY29uc3QgcGFyZW50ID0gdHMuY3JlYXRlSWRlbnRpZmllcigncGFyZW50Jyk7XG5cbiAgLy8gYHJlbmRlcmVyLmNyZWF0ZUNvbW1lbnQoJycpYC5cbiAgY29uc3QgY3JlYXRpb25DYWxsID0gdHMuY3JlYXRlQ2FsbChcbiAgICAgIHRzLmNyZWF0ZVByb3BlcnR5QWNjZXNzKHJlbmRlcmVyLCAnY3JlYXRlQ29tbWVudCcpLCBbXSwgW3RzLmNyZWF0ZVN0cmluZ0xpdGVyYWwoJycpXSk7XG5cbiAgcmV0dXJuIGdldENyZWF0aW9uSGVscGVyKEhlbHBlckZ1bmN0aW9uLmNyZWF0ZVRlbXBsYXRlQW5jaG9yLCBjcmVhdGlvbkNhbGwsIHJlbmRlcmVyLCBwYXJlbnQpO1xufVxuXG4vKipcbiAqIEdldHMgdGhlIGZ1bmN0aW9uIGRlY2xhcmF0aW9uIGZvciBhIGNyZWF0aW9uIGhlbHBlci4gVGhpcyBpcyByZXVzZWQgYmV0d2VlbiBgY3JlYXRlRWxlbWVudGAsXG4gKiBgY3JlYXRlVGV4dGAgYW5kIGBjcmVhdGVUZW1wbGF0ZUFuY2hvcmAgd2hpY2ggZm9sbG93IGEgdmVyeSBzaW1pbGFyIHBhdHRlcm4uXG4gKiBAcGFyYW0gZnVuY3Rpb25OYW1lIEZ1bmN0aW9uIHRoYXQgdGhlIGhlbHBlciBzaG91bGQgaGF2ZS5cbiAqIEBwYXJhbSBjcmVhdGlvbkNhbGwgRXhwcmVzc2lvbiB0aGF0IGlzIHVzZWQgdG8gY3JlYXRlIGEgbm9kZSBpbnNpZGUgdGhlIGZ1bmN0aW9uLlxuICogQHBhcmFtIHJlbmRlcmVyUGFyYW1ldGVyIFBhcmFtZXRlciBmb3IgdGhlIGByZW5kZXJlcmAuXG4gKiBAcGFyYW0gcGFyZW50UGFyYW1ldGVyIFBhcmFtZXRlciBmb3IgdGhlIGBwYXJlbnRgIGluc2lkZSB0aGUgZnVuY3Rpb24uXG4gKiBAcGFyYW0gZXh0cmFQYXJhbWV0ZXJzIEV4dHJhIHBhcmFtZXRlcnMgdG8gYmUgYWRkZWQgdG8gdGhlIGVuZC5cbiAqIEBwYXJhbSBwcmVjZWRpbmdWYXJpYWJsZXMgRXh0cmEgdmFyaWFibGVzIHRvIGJlIGFkZGVkIGJlZm9yZSB0aGUgb25lIHRoYXQgY3JlYXRlcyB0aGUgYG5vZGVgLlxuICovXG5mdW5jdGlvbiBnZXRDcmVhdGlvbkhlbHBlcihcbiAgICBmdW5jdGlvbk5hbWU6IEhlbHBlckZ1bmN0aW9uLCBjcmVhdGlvbkNhbGw6IHRzLkNhbGxFeHByZXNzaW9uLCByZW5kZXJlcjogdHMuSWRlbnRpZmllcixcbiAgICBwYXJlbnQ6IHRzLklkZW50aWZpZXIsIGV4dHJhUGFyYW1ldGVyczogdHMuSWRlbnRpZmllcltdID0gW10sXG4gICAgcHJlY2VkaW5nVmFyaWFibGVzOiB0cy5WYXJpYWJsZVN0YXRlbWVudFtdID0gW10pOiB0cy5GdW5jdGlvbkRlY2xhcmF0aW9uIHtcbiAgY29uc3Qgbm9kZSA9IHRzLmNyZWF0ZUlkZW50aWZpZXIoJ25vZGUnKTtcblxuICAvLyBgY29uc3Qgbm9kZSA9IHt7Y3JlYXRpb25DYWxsfX1gLlxuICBjb25zdCBub2RlVmFyaWFibGVTdGF0ZW1lbnQgPSB0cy5jcmVhdGVWYXJpYWJsZVN0YXRlbWVudChcbiAgICAgIHVuZGVmaW5lZCxcbiAgICAgIHRzLmNyZWF0ZVZhcmlhYmxlRGVjbGFyYXRpb25MaXN0KFxuICAgICAgICAgIFt0cy5jcmVhdGVWYXJpYWJsZURlY2xhcmF0aW9uKG5vZGUsIHVuZGVmaW5lZCwgY3JlYXRpb25DYWxsKV0sIHRzLk5vZGVGbGFncy5Db25zdCkpO1xuXG4gIC8vIGBpZiAocGFyZW50KSB7IHJlbmRlcmVyLmFwcGVuZENoaWxkKHBhcmVudCwgbm9kZSkgfWAuXG4gIGNvbnN0IGd1YXJkZWRBcHBlbmRDaGlsZENhbGwgPSB0cy5jcmVhdGVJZihcbiAgICAgIHBhcmVudCxcbiAgICAgIHRzLmNyZWF0ZUJsb2NrKFxuICAgICAgICAgIFt0cy5jcmVhdGVFeHByZXNzaW9uU3RhdGVtZW50KFxuICAgICAgICAgICAgICB0cy5jcmVhdGVDYWxsKHRzLmNyZWF0ZVByb3BlcnR5QWNjZXNzKHJlbmRlcmVyLCAnYXBwZW5kQ2hpbGQnKSwgW10sIFtwYXJlbnQsIG5vZGVdKSldLFxuICAgICAgICAgIHRydWUpKTtcblxuICByZXR1cm4gdHMuY3JlYXRlRnVuY3Rpb25EZWNsYXJhdGlvbihcbiAgICAgIFtdLCBbXSwgdW5kZWZpbmVkLCBmdW5jdGlvbk5hbWUsIFtdLFxuICAgICAgW3JlbmRlcmVyLCBwYXJlbnQsIC4uLmV4dHJhUGFyYW1ldGVyc10ubWFwKG5hbWUgPT4gZ2V0QW55VHlwZWRQYXJhbWV0ZXIobmFtZSkpLCB1bmRlZmluZWQsXG4gICAgICB0cy5jcmVhdGVCbG9jayhcbiAgICAgICAgICBbXG4gICAgICAgICAgICAuLi5wcmVjZWRpbmdWYXJpYWJsZXMsIG5vZGVWYXJpYWJsZVN0YXRlbWVudCwgZ3VhcmRlZEFwcGVuZENoaWxkQ2FsbCxcbiAgICAgICAgICAgIHRzLmNyZWF0ZVJldHVybihub2RlKVxuICAgICAgICAgIF0sXG4gICAgICAgICAgdHJ1ZSkpO1xufVxuXG4vKiogQ3JlYXRlcyBhIGhlbHBlciBmb3IgYHByb2plY3ROb2Rlc2AuICovXG5mdW5jdGlvbiBnZXRQcm9qZWN0Tm9kZXNIZWxwZXIoKTogdHMuRnVuY3Rpb25EZWNsYXJhdGlvbiB7XG4gIGNvbnN0IHJlbmRlcmVyID0gdHMuY3JlYXRlSWRlbnRpZmllcigncmVuZGVyZXInKTtcbiAgY29uc3QgcGFyZW50ID0gdHMuY3JlYXRlSWRlbnRpZmllcigncGFyZW50Jyk7XG4gIGNvbnN0IG5vZGVzID0gdHMuY3JlYXRlSWRlbnRpZmllcignbm9kZXMnKTtcbiAgY29uc3QgaW5jcmVtZW50b3IgPSB0cy5jcmVhdGVJZGVudGlmaWVyKCdpJyk7XG5cbiAgLy8gZm9yIChsZXQgaSA9IDA7IGkgPCBub2Rlcy5sZW5ndGg7IGkrKykge1xuICAvLyAgIHJlbmRlcmVyLmFwcGVuZENoaWxkKHBhcmVudCwgbm9kZXNbaV0pO1xuICAvLyB9XG4gIGNvbnN0IGxvb3BJbml0aWFsaXplciA9IHRzLmNyZWF0ZVZhcmlhYmxlRGVjbGFyYXRpb25MaXN0KFxuICAgICAgW3RzLmNyZWF0ZVZhcmlhYmxlRGVjbGFyYXRpb24oaW5jcmVtZW50b3IsIHVuZGVmaW5lZCwgdHMuY3JlYXRlTnVtZXJpY0xpdGVyYWwoJzAnKSldLFxuICAgICAgdHMuTm9kZUZsYWdzLkxldCk7XG4gIGNvbnN0IGxvb3BDb25kaXRpb24gPSB0cy5jcmVhdGVCaW5hcnkoXG4gICAgICBpbmNyZW1lbnRvciwgdHMuU3ludGF4S2luZC5MZXNzVGhhblRva2VuLFxuICAgICAgdHMuY3JlYXRlUHJvcGVydHlBY2Nlc3Mobm9kZXMsIHRzLmNyZWF0ZUlkZW50aWZpZXIoJ2xlbmd0aCcpKSk7XG4gIGNvbnN0IGFwcGVuZFN0YXRlbWVudCA9IHRzLmNyZWF0ZUV4cHJlc3Npb25TdGF0ZW1lbnQodHMuY3JlYXRlQ2FsbChcbiAgICAgIHRzLmNyZWF0ZVByb3BlcnR5QWNjZXNzKHJlbmRlcmVyLCAnYXBwZW5kQ2hpbGQnKSwgW10sXG4gICAgICBbcGFyZW50LCB0cy5jcmVhdGVFbGVtZW50QWNjZXNzKG5vZGVzLCBpbmNyZW1lbnRvcildKSk7XG4gIGNvbnN0IGxvb3AgPSB0cy5jcmVhdGVGb3IoXG4gICAgICBsb29wSW5pdGlhbGl6ZXIsIGxvb3BDb25kaXRpb24sIHRzLmNyZWF0ZVBvc3RmaXgoaW5jcmVtZW50b3IsIHRzLlN5bnRheEtpbmQuUGx1c1BsdXNUb2tlbiksXG4gICAgICB0cy5jcmVhdGVCbG9jayhbYXBwZW5kU3RhdGVtZW50XSkpO1xuXG4gIHJldHVybiB0cy5jcmVhdGVGdW5jdGlvbkRlY2xhcmF0aW9uKFxuICAgICAgW10sIFtdLCB1bmRlZmluZWQsIEhlbHBlckZ1bmN0aW9uLnByb2plY3ROb2RlcywgW10sXG4gICAgICBbcmVuZGVyZXIsIHBhcmVudCwgbm9kZXNdLm1hcChuYW1lID0+IGdldEFueVR5cGVkUGFyYW1ldGVyKG5hbWUpKSwgdW5kZWZpbmVkLFxuICAgICAgdHMuY3JlYXRlQmxvY2soW2xvb3BdLCB0cnVlKSk7XG59XG5cbi8qKiBDcmVhdGVzIGEgaGVscGVyIGZvciBgYW5pbWF0ZWAuICovXG5mdW5jdGlvbiBnZXRBbmltYXRlSGVscGVyKCk6IHRzLkZ1bmN0aW9uRGVjbGFyYXRpb24ge1xuICAvLyB0aHJvdyBuZXcgRXJyb3IoJy4uLicpO1xuICBjb25zdCB0aHJvd1N0YXRlbWVudCA9IHRzLmNyZWF0ZVRocm93KHRzLmNyZWF0ZU5ldyhcbiAgICAgIHRzLmNyZWF0ZUlkZW50aWZpZXIoJ0Vycm9yJyksIFtdLFxuICAgICAgW3RzLmNyZWF0ZVN0cmluZ0xpdGVyYWwoJ1JlbmRlcmVyLmFuaW1hdGUgaXMgbm8gbG9uZ2VyIHN1cHBvcnRlZCEnKV0pKTtcblxuICByZXR1cm4gdHMuY3JlYXRlRnVuY3Rpb25EZWNsYXJhdGlvbihcbiAgICAgIFtdLCBbXSwgdW5kZWZpbmVkLCBIZWxwZXJGdW5jdGlvbi5hbmltYXRlLCBbXSwgW10sIHVuZGVmaW5lZCxcbiAgICAgIHRzLmNyZWF0ZUJsb2NrKFt0aHJvd1N0YXRlbWVudF0sIHRydWUpKTtcbn1cblxuLyoqIENyZWF0ZXMgYSBoZWxwZXIgZm9yIGBkZXN0cm95Vmlld2AuICovXG5mdW5jdGlvbiBnZXREZXN0cm95Vmlld0hlbHBlcigpOiB0cy5GdW5jdGlvbkRlY2xhcmF0aW9uIHtcbiAgY29uc3QgcmVuZGVyZXIgPSB0cy5jcmVhdGVJZGVudGlmaWVyKCdyZW5kZXJlcicpO1xuICBjb25zdCBhbGxOb2RlcyA9IHRzLmNyZWF0ZUlkZW50aWZpZXIoJ2FsbE5vZGVzJyk7XG4gIGNvbnN0IGluY3JlbWVudG9yID0gdHMuY3JlYXRlSWRlbnRpZmllcignaScpO1xuXG4gIC8vIGZvciAobGV0IGkgPSAwOyBpIDwgYWxsTm9kZXMubGVuZ3RoOyBpKyspIHtcbiAgLy8gICByZW5kZXJlci5kZXN0cm95Tm9kZShhbGxOb2Rlc1tpXSk7XG4gIC8vIH1cbiAgY29uc3QgbG9vcEluaXRpYWxpemVyID0gdHMuY3JlYXRlVmFyaWFibGVEZWNsYXJhdGlvbkxpc3QoXG4gICAgICBbdHMuY3JlYXRlVmFyaWFibGVEZWNsYXJhdGlvbihpbmNyZW1lbnRvciwgdW5kZWZpbmVkLCB0cy5jcmVhdGVOdW1lcmljTGl0ZXJhbCgnMCcpKV0sXG4gICAgICB0cy5Ob2RlRmxhZ3MuTGV0KTtcbiAgY29uc3QgbG9vcENvbmRpdGlvbiA9IHRzLmNyZWF0ZUJpbmFyeShcbiAgICAgIGluY3JlbWVudG9yLCB0cy5TeW50YXhLaW5kLkxlc3NUaGFuVG9rZW4sXG4gICAgICB0cy5jcmVhdGVQcm9wZXJ0eUFjY2VzcyhhbGxOb2RlcywgdHMuY3JlYXRlSWRlbnRpZmllcignbGVuZ3RoJykpKTtcbiAgY29uc3QgZGVzdHJveVN0YXRlbWVudCA9IHRzLmNyZWF0ZUV4cHJlc3Npb25TdGF0ZW1lbnQodHMuY3JlYXRlQ2FsbChcbiAgICAgIHRzLmNyZWF0ZVByb3BlcnR5QWNjZXNzKHJlbmRlcmVyLCAnZGVzdHJveU5vZGUnKSwgW10sXG4gICAgICBbdHMuY3JlYXRlRWxlbWVudEFjY2VzcyhhbGxOb2RlcywgaW5jcmVtZW50b3IpXSkpO1xuICBjb25zdCBsb29wID0gdHMuY3JlYXRlRm9yKFxuICAgICAgbG9vcEluaXRpYWxpemVyLCBsb29wQ29uZGl0aW9uLCB0cy5jcmVhdGVQb3N0Zml4KGluY3JlbWVudG9yLCB0cy5TeW50YXhLaW5kLlBsdXNQbHVzVG9rZW4pLFxuICAgICAgdHMuY3JlYXRlQmxvY2soW2Rlc3Ryb3lTdGF0ZW1lbnRdKSk7XG5cbiAgcmV0dXJuIHRzLmNyZWF0ZUZ1bmN0aW9uRGVjbGFyYXRpb24oXG4gICAgICBbXSwgW10sIHVuZGVmaW5lZCwgSGVscGVyRnVuY3Rpb24uZGVzdHJveVZpZXcsIFtdLFxuICAgICAgW3JlbmRlcmVyLCBhbGxOb2Rlc10ubWFwKG5hbWUgPT4gZ2V0QW55VHlwZWRQYXJhbWV0ZXIobmFtZSkpLCB1bmRlZmluZWQsXG4gICAgICB0cy5jcmVhdGVCbG9jayhbbG9vcF0sIHRydWUpKTtcbn1cblxuLyoqIENyZWF0ZXMgYSBoZWxwZXIgZm9yIGBkZXRhY2hWaWV3YC4gKi9cbmZ1bmN0aW9uIGdldERldGFjaFZpZXdIZWxwZXIoKTogdHMuRnVuY3Rpb25EZWNsYXJhdGlvbiB7XG4gIGNvbnN0IHJlbmRlcmVyID0gdHMuY3JlYXRlSWRlbnRpZmllcigncmVuZGVyZXInKTtcbiAgY29uc3Qgcm9vdE5vZGVzID0gdHMuY3JlYXRlSWRlbnRpZmllcigncm9vdE5vZGVzJyk7XG4gIGNvbnN0IGluY3JlbWVudG9yID0gdHMuY3JlYXRlSWRlbnRpZmllcignaScpO1xuICBjb25zdCBub2RlID0gdHMuY3JlYXRlSWRlbnRpZmllcignbm9kZScpO1xuXG4gIC8vIGZvciAobGV0IGkgPSAwOyBpIDwgcm9vdE5vZGVzLmxlbmd0aDsgaSsrKSB7XG4gIC8vICAgY29uc3Qgbm9kZSA9IHJvb3ROb2Rlc1tpXTtcbiAgLy8gICByZW5kZXJlci5yZW1vdmVDaGlsZChyZW5kZXJlci5wYXJlbnROb2RlKG5vZGUpLCBub2RlKTtcbiAgLy8gfVxuICBjb25zdCBsb29wSW5pdGlhbGl6ZXIgPSB0cy5jcmVhdGVWYXJpYWJsZURlY2xhcmF0aW9uTGlzdChcbiAgICAgIFt0cy5jcmVhdGVWYXJpYWJsZURlY2xhcmF0aW9uKGluY3JlbWVudG9yLCB1bmRlZmluZWQsIHRzLmNyZWF0ZU51bWVyaWNMaXRlcmFsKCcwJykpXSxcbiAgICAgIHRzLk5vZGVGbGFncy5MZXQpO1xuICBjb25zdCBsb29wQ29uZGl0aW9uID0gdHMuY3JlYXRlQmluYXJ5KFxuICAgICAgaW5jcmVtZW50b3IsIHRzLlN5bnRheEtpbmQuTGVzc1RoYW5Ub2tlbixcbiAgICAgIHRzLmNyZWF0ZVByb3BlcnR5QWNjZXNzKHJvb3ROb2RlcywgdHMuY3JlYXRlSWRlbnRpZmllcignbGVuZ3RoJykpKTtcblxuICAvLyBjb25zdCBub2RlID0gcm9vdE5vZGVzW2ldO1xuICBjb25zdCBub2RlVmFyaWFibGVTdGF0ZW1lbnQgPSB0cy5jcmVhdGVWYXJpYWJsZVN0YXRlbWVudChcbiAgICAgIHVuZGVmaW5lZCxcbiAgICAgIHRzLmNyZWF0ZVZhcmlhYmxlRGVjbGFyYXRpb25MaXN0KFxuICAgICAgICAgIFt0cy5jcmVhdGVWYXJpYWJsZURlY2xhcmF0aW9uKFxuICAgICAgICAgICAgICBub2RlLCB1bmRlZmluZWQsIHRzLmNyZWF0ZUVsZW1lbnRBY2Nlc3Mocm9vdE5vZGVzLCBpbmNyZW1lbnRvcikpXSxcbiAgICAgICAgICB0cy5Ob2RlRmxhZ3MuQ29uc3QpKTtcbiAgLy8gcmVuZGVyZXIucmVtb3ZlQ2hpbGQocmVuZGVyZXIucGFyZW50Tm9kZShub2RlKSwgbm9kZSk7XG4gIGNvbnN0IHJlbW92ZUNhbGwgPSB0cy5jcmVhdGVDYWxsKFxuICAgICAgdHMuY3JlYXRlUHJvcGVydHlBY2Nlc3MocmVuZGVyZXIsICdyZW1vdmVDaGlsZCcpLCBbXSxcbiAgICAgIFt0cy5jcmVhdGVDYWxsKHRzLmNyZWF0ZVByb3BlcnR5QWNjZXNzKHJlbmRlcmVyLCAncGFyZW50Tm9kZScpLCBbXSwgW25vZGVdKSwgbm9kZV0pO1xuXG4gIGNvbnN0IGxvb3AgPSB0cy5jcmVhdGVGb3IoXG4gICAgICBsb29wSW5pdGlhbGl6ZXIsIGxvb3BDb25kaXRpb24sIHRzLmNyZWF0ZVBvc3RmaXgoaW5jcmVtZW50b3IsIHRzLlN5bnRheEtpbmQuUGx1c1BsdXNUb2tlbiksXG4gICAgICB0cy5jcmVhdGVCbG9jayhbbm9kZVZhcmlhYmxlU3RhdGVtZW50LCB0cy5jcmVhdGVFeHByZXNzaW9uU3RhdGVtZW50KHJlbW92ZUNhbGwpXSkpO1xuXG4gIHJldHVybiB0cy5jcmVhdGVGdW5jdGlvbkRlY2xhcmF0aW9uKFxuICAgICAgW10sIFtdLCB1bmRlZmluZWQsIEhlbHBlckZ1bmN0aW9uLmRldGFjaFZpZXcsIFtdLFxuICAgICAgW3JlbmRlcmVyLCByb290Tm9kZXNdLm1hcChuYW1lID0+IGdldEFueVR5cGVkUGFyYW1ldGVyKG5hbWUpKSwgdW5kZWZpbmVkLFxuICAgICAgdHMuY3JlYXRlQmxvY2soW2xvb3BdLCB0cnVlKSk7XG59XG5cbi8qKiBDcmVhdGVzIGEgaGVscGVyIGZvciBgYXR0YWNoVmlld0FmdGVyYCAqL1xuZnVuY3Rpb24gZ2V0QXR0YWNoVmlld0FmdGVySGVscGVyKCk6IHRzLkZ1bmN0aW9uRGVjbGFyYXRpb24ge1xuICBjb25zdCByZW5kZXJlciA9IHRzLmNyZWF0ZUlkZW50aWZpZXIoJ3JlbmRlcmVyJyk7XG4gIGNvbnN0IG5vZGUgPSB0cy5jcmVhdGVJZGVudGlmaWVyKCdub2RlJyk7XG4gIGNvbnN0IHJvb3ROb2RlcyA9IHRzLmNyZWF0ZUlkZW50aWZpZXIoJ3Jvb3ROb2RlcycpO1xuICBjb25zdCBwYXJlbnQgPSB0cy5jcmVhdGVJZGVudGlmaWVyKCdwYXJlbnQnKTtcbiAgY29uc3QgbmV4dFNpYmxpbmcgPSB0cy5jcmVhdGVJZGVudGlmaWVyKCduZXh0U2libGluZycpO1xuICBjb25zdCBpbmNyZW1lbnRvciA9IHRzLmNyZWF0ZUlkZW50aWZpZXIoJ2knKTtcbiAgY29uc3QgY3JlYXRlQ29uc3RXaXRoTWV0aG9kQ2FsbEluaXRpYWxpemVyID0gKGNvbnN0TmFtZTogdHMuSWRlbnRpZmllciwgbWV0aG9kVG9DYWxsOiBzdHJpbmcpID0+IHtcbiAgICByZXR1cm4gdHMuY3JlYXRlVmFyaWFibGVTdGF0ZW1lbnQoXG4gICAgICAgIHVuZGVmaW5lZCxcbiAgICAgICAgdHMuY3JlYXRlVmFyaWFibGVEZWNsYXJhdGlvbkxpc3QoXG4gICAgICAgICAgICBbdHMuY3JlYXRlVmFyaWFibGVEZWNsYXJhdGlvbihcbiAgICAgICAgICAgICAgICBjb25zdE5hbWUsIHVuZGVmaW5lZCxcbiAgICAgICAgICAgICAgICB0cy5jcmVhdGVDYWxsKHRzLmNyZWF0ZVByb3BlcnR5QWNjZXNzKHJlbmRlcmVyLCBtZXRob2RUb0NhbGwpLCBbXSwgW25vZGVdKSldLFxuICAgICAgICAgICAgdHMuTm9kZUZsYWdzLkNvbnN0KSk7XG4gIH07XG5cbiAgLy8gY29uc3QgcGFyZW50ID0gcmVuZGVyZXIucGFyZW50Tm9kZShub2RlKTtcbiAgY29uc3QgcGFyZW50VmFyaWFibGVTdGF0ZW1lbnQgPSBjcmVhdGVDb25zdFdpdGhNZXRob2RDYWxsSW5pdGlhbGl6ZXIocGFyZW50LCAncGFyZW50Tm9kZScpO1xuXG4gIC8vIGNvbnN0IG5leHRTaWJsaW5nID0gcmVuZGVyZXIubmV4dFNpYmxpbmcobm9kZSk7XG4gIGNvbnN0IG5leHRTaWJsaW5nVmFyaWFibGVTdGF0ZW1lbnQgPVxuICAgICAgY3JlYXRlQ29uc3RXaXRoTWV0aG9kQ2FsbEluaXRpYWxpemVyKG5leHRTaWJsaW5nLCAnbmV4dFNpYmxpbmcnKTtcblxuICAvLyBmb3IgKGxldCBpID0gMDsgaSA8IHJvb3ROb2Rlcy5sZW5ndGg7IGkrKykge1xuICAvLyAgIHJlbmRlcmVyLmluc2VydEJlZm9yZShwYXJlbnRFbGVtZW50LCByb290Tm9kZXNbaV0sIG5leHRTaWJsaW5nKTtcbiAgLy8gfVxuICBjb25zdCBsb29wSW5pdGlhbGl6ZXIgPSB0cy5jcmVhdGVWYXJpYWJsZURlY2xhcmF0aW9uTGlzdChcbiAgICAgIFt0cy5jcmVhdGVWYXJpYWJsZURlY2xhcmF0aW9uKGluY3JlbWVudG9yLCB1bmRlZmluZWQsIHRzLmNyZWF0ZU51bWVyaWNMaXRlcmFsKCcwJykpXSxcbiAgICAgIHRzLk5vZGVGbGFncy5MZXQpO1xuICBjb25zdCBsb29wQ29uZGl0aW9uID0gdHMuY3JlYXRlQmluYXJ5KFxuICAgICAgaW5jcmVtZW50b3IsIHRzLlN5bnRheEtpbmQuTGVzc1RoYW5Ub2tlbixcbiAgICAgIHRzLmNyZWF0ZVByb3BlcnR5QWNjZXNzKHJvb3ROb2RlcywgdHMuY3JlYXRlSWRlbnRpZmllcignbGVuZ3RoJykpKTtcbiAgY29uc3QgaW5zZXJ0QmVmb3JlQ2FsbCA9IHRzLmNyZWF0ZUNhbGwoXG4gICAgICB0cy5jcmVhdGVQcm9wZXJ0eUFjY2VzcyhyZW5kZXJlciwgJ2luc2VydEJlZm9yZScpLCBbXSxcbiAgICAgIFtwYXJlbnQsIHRzLmNyZWF0ZUVsZW1lbnRBY2Nlc3Mocm9vdE5vZGVzLCBpbmNyZW1lbnRvciksIG5leHRTaWJsaW5nXSk7XG4gIGNvbnN0IGxvb3AgPSB0cy5jcmVhdGVGb3IoXG4gICAgICBsb29wSW5pdGlhbGl6ZXIsIGxvb3BDb25kaXRpb24sIHRzLmNyZWF0ZVBvc3RmaXgoaW5jcmVtZW50b3IsIHRzLlN5bnRheEtpbmQuUGx1c1BsdXNUb2tlbiksXG4gICAgICB0cy5jcmVhdGVCbG9jayhbdHMuY3JlYXRlRXhwcmVzc2lvblN0YXRlbWVudChpbnNlcnRCZWZvcmVDYWxsKV0pKTtcblxuICByZXR1cm4gdHMuY3JlYXRlRnVuY3Rpb25EZWNsYXJhdGlvbihcbiAgICAgIFtdLCBbXSwgdW5kZWZpbmVkLCBIZWxwZXJGdW5jdGlvbi5hdHRhY2hWaWV3QWZ0ZXIsIFtdLFxuICAgICAgW3JlbmRlcmVyLCBub2RlLCByb290Tm9kZXNdLm1hcChuYW1lID0+IGdldEFueVR5cGVkUGFyYW1ldGVyKG5hbWUpKSwgdW5kZWZpbmVkLFxuICAgICAgdHMuY3JlYXRlQmxvY2soW3BhcmVudFZhcmlhYmxlU3RhdGVtZW50LCBuZXh0U2libGluZ1ZhcmlhYmxlU3RhdGVtZW50LCBsb29wXSwgdHJ1ZSkpO1xufVxuXG4vKiogQ3JlYXRlcyBhIGhlbHBlciBmb3IgYHNldEVsZW1lbnRBdHRyaWJ1dGVgICovXG5mdW5jdGlvbiBnZXRTZXRFbGVtZW50QXR0cmlidXRlSGVscGVyKCk6IHRzLkZ1bmN0aW9uRGVjbGFyYXRpb24ge1xuICBjb25zdCByZW5kZXJlciA9IHRzLmNyZWF0ZUlkZW50aWZpZXIoJ3JlbmRlcmVyJyk7XG4gIGNvbnN0IGVsZW1lbnQgPSB0cy5jcmVhdGVJZGVudGlmaWVyKCdlbGVtZW50Jyk7XG4gIGNvbnN0IG5hbWVzcGFjZUFuZE5hbWUgPSB0cy5jcmVhdGVJZGVudGlmaWVyKCduYW1lc3BhY2VBbmROYW1lJyk7XG4gIGNvbnN0IHZhbHVlID0gdHMuY3JlYXRlSWRlbnRpZmllcigndmFsdWUnKTtcbiAgY29uc3QgbmFtZSA9IHRzLmNyZWF0ZUlkZW50aWZpZXIoJ25hbWUnKTtcbiAgY29uc3QgbmFtZXNwYWNlID0gdHMuY3JlYXRlSWRlbnRpZmllcignbmFtZXNwYWNlJyk7XG5cbiAgLy8gW25hbWVzcGFjZSwgbmFtZV0gPSBzcGxpdE5hbWVzcGFjZShuYW1lc3BhY2VBbmROYW1lKTtcbiAgY29uc3QgbmFtZXNwYWNlQW5kTmFtZVZhcmlhYmxlID0gdHMuY3JlYXRlVmFyaWFibGVEZWNsYXJhdGlvbihcbiAgICAgIHRzLmNyZWF0ZUFycmF5QmluZGluZ1BhdHRlcm4oXG4gICAgICAgICAgW25hbWVzcGFjZSwgbmFtZV0ubWFwKGlkID0+IHRzLmNyZWF0ZUJpbmRpbmdFbGVtZW50KHVuZGVmaW5lZCwgdW5kZWZpbmVkLCBpZCkpKSxcbiAgICAgIHVuZGVmaW5lZCxcbiAgICAgIHRzLmNyZWF0ZUNhbGwodHMuY3JlYXRlSWRlbnRpZmllcihIZWxwZXJGdW5jdGlvbi5zcGxpdE5hbWVzcGFjZSksIFtdLCBbbmFtZXNwYWNlQW5kTmFtZV0pKTtcblxuICAvLyByZW5kZXJlci5zZXRBdHRyaWJ1dGUoZWxlbWVudCwgbmFtZSwgdmFsdWUsIG5hbWVzcGFjZSk7XG4gIGNvbnN0IHNldENhbGwgPSB0cy5jcmVhdGVDYWxsKFxuICAgICAgdHMuY3JlYXRlUHJvcGVydHlBY2Nlc3MocmVuZGVyZXIsICdzZXRBdHRyaWJ1dGUnKSwgW10sIFtlbGVtZW50LCBuYW1lLCB2YWx1ZSwgbmFtZXNwYWNlXSk7XG5cbiAgLy8gcmVuZGVyZXIucmVtb3ZlQXR0cmlidXRlKGVsZW1lbnQsIG5hbWUsIG5hbWVzcGFjZSk7XG4gIGNvbnN0IHJlbW92ZUNhbGwgPSB0cy5jcmVhdGVDYWxsKFxuICAgICAgdHMuY3JlYXRlUHJvcGVydHlBY2Nlc3MocmVuZGVyZXIsICdyZW1vdmVBdHRyaWJ1dGUnKSwgW10sIFtlbGVtZW50LCBuYW1lLCBuYW1lc3BhY2VdKTtcblxuICAvLyBpZiAodmFsdWUgIT0gbnVsbCkgeyBzZXRDYWxsKCkgfSBlbHNlIHsgcmVtb3ZlQ2FsbCB9XG4gIGNvbnN0IGlmU3RhdGVtZW50ID0gdHMuY3JlYXRlSWYoXG4gICAgICB0cy5jcmVhdGVCaW5hcnkodmFsdWUsIHRzLlN5bnRheEtpbmQuRXhjbGFtYXRpb25FcXVhbHNUb2tlbiwgdHMuY3JlYXRlTnVsbCgpKSxcbiAgICAgIHRzLmNyZWF0ZUJsb2NrKFt0cy5jcmVhdGVFeHByZXNzaW9uU3RhdGVtZW50KHNldENhbGwpXSwgdHJ1ZSksXG4gICAgICB0cy5jcmVhdGVCbG9jayhbdHMuY3JlYXRlRXhwcmVzc2lvblN0YXRlbWVudChyZW1vdmVDYWxsKV0sIHRydWUpKTtcblxuICBjb25zdCBmdW5jdGlvbkJvZHkgPSB0cy5jcmVhdGVCbG9jayhcbiAgICAgIFtcbiAgICAgICAgdHMuY3JlYXRlVmFyaWFibGVTdGF0ZW1lbnQoXG4gICAgICAgICAgICB1bmRlZmluZWQsXG4gICAgICAgICAgICB0cy5jcmVhdGVWYXJpYWJsZURlY2xhcmF0aW9uTGlzdChbbmFtZXNwYWNlQW5kTmFtZVZhcmlhYmxlXSwgdHMuTm9kZUZsYWdzLkNvbnN0KSksXG4gICAgICAgIGlmU3RhdGVtZW50XG4gICAgICBdLFxuICAgICAgdHJ1ZSk7XG5cbiAgcmV0dXJuIHRzLmNyZWF0ZUZ1bmN0aW9uRGVjbGFyYXRpb24oXG4gICAgICBbXSwgW10sIHVuZGVmaW5lZCwgSGVscGVyRnVuY3Rpb24uc2V0RWxlbWVudEF0dHJpYnV0ZSwgW10sXG4gICAgICBbXG4gICAgICAgIGdldEFueVR5cGVkUGFyYW1ldGVyKHJlbmRlcmVyKSwgZ2V0QW55VHlwZWRQYXJhbWV0ZXIoZWxlbWVudCksXG4gICAgICAgIGdldEFueVR5cGVkUGFyYW1ldGVyKG5hbWVzcGFjZUFuZE5hbWUpLCBnZXRBbnlUeXBlZFBhcmFtZXRlcih2YWx1ZSwgZmFsc2UpXG4gICAgICBdLFxuICAgICAgdW5kZWZpbmVkLCBmdW5jdGlvbkJvZHkpO1xufVxuXG4vKiogQ3JlYXRlcyBhIGhlbHBlciBmb3Igc3BsaXR0aW5nIGEgbmFtZSB0aGF0IG1pZ2h0IGNvbnRhaW4gYSBuYW1lc3BhY2UuICovXG5mdW5jdGlvbiBnZXRTcGxpdE5hbWVzcGFjZUhlbHBlcigpOiB0cy5GdW5jdGlvbkRlY2xhcmF0aW9uIHtcbiAgY29uc3QgbmFtZSA9IHRzLmNyZWF0ZUlkZW50aWZpZXIoJ25hbWUnKTtcbiAgY29uc3QgbWF0Y2ggPSB0cy5jcmVhdGVJZGVudGlmaWVyKCdtYXRjaCcpO1xuICBjb25zdCByZWdleCA9IHRzLmNyZWF0ZVJlZ3VsYXJFeHByZXNzaW9uTGl0ZXJhbCgnL146KFteOl0rKTooLispJC8nKTtcbiAgY29uc3QgbWF0Y2hDYWxsID0gdHMuY3JlYXRlQ2FsbCh0cy5jcmVhdGVQcm9wZXJ0eUFjY2VzcyhuYW1lLCAnbWF0Y2gnKSwgW10sIFtyZWdleF0pO1xuXG4gIC8vIGNvbnN0IG1hdGNoID0gbmFtZS5zcGxpdChyZWdleCk7XG4gIGNvbnN0IG1hdGNoVmFyaWFibGUgPSB0cy5jcmVhdGVWYXJpYWJsZURlY2xhcmF0aW9uTGlzdChcbiAgICAgIFt0cy5jcmVhdGVWYXJpYWJsZURlY2xhcmF0aW9uKG1hdGNoLCB1bmRlZmluZWQsIG1hdGNoQ2FsbCldLCB0cy5Ob2RlRmxhZ3MuQ29uc3QpO1xuXG4gIC8vIHJldHVybiBbbWF0Y2hbMV0sIG1hdGNoWzJdXTtcbiAgY29uc3QgbWF0Y2hSZXR1cm4gPSB0cy5jcmVhdGVSZXR1cm4oXG4gICAgICB0cy5jcmVhdGVBcnJheUxpdGVyYWwoW3RzLmNyZWF0ZUVsZW1lbnRBY2Nlc3MobWF0Y2gsIDEpLCB0cy5jcmVhdGVFbGVtZW50QWNjZXNzKG1hdGNoLCAyKV0pKTtcblxuICAvLyBpZiAobmFtZVswXSA9PT0gJzonKSB7IGNvbnN0IG1hdGNoID0gLi4uOyByZXR1cm4gLi4uOyB9XG4gIGNvbnN0IGlmU3RhdGVtZW50ID0gdHMuY3JlYXRlSWYoXG4gICAgICB0cy5jcmVhdGVCaW5hcnkoXG4gICAgICAgICAgdHMuY3JlYXRlRWxlbWVudEFjY2VzcyhuYW1lLCAwKSwgdHMuU3ludGF4S2luZC5FcXVhbHNFcXVhbHNFcXVhbHNUb2tlbixcbiAgICAgICAgICB0cy5jcmVhdGVTdHJpbmdMaXRlcmFsKCc6JykpLFxuICAgICAgdHMuY3JlYXRlQmxvY2soW3RzLmNyZWF0ZVZhcmlhYmxlU3RhdGVtZW50KFtdLCBtYXRjaFZhcmlhYmxlKSwgbWF0Y2hSZXR1cm5dLCB0cnVlKSk7XG5cbiAgLy8gcmV0dXJuIFsnJywgbmFtZV07XG4gIGNvbnN0IGVsc2VSZXR1cm4gPSB0cy5jcmVhdGVSZXR1cm4odHMuY3JlYXRlQXJyYXlMaXRlcmFsKFt0cy5jcmVhdGVTdHJpbmdMaXRlcmFsKCcnKSwgbmFtZV0pKTtcblxuICByZXR1cm4gdHMuY3JlYXRlRnVuY3Rpb25EZWNsYXJhdGlvbihcbiAgICAgIFtdLCBbXSwgdW5kZWZpbmVkLCBIZWxwZXJGdW5jdGlvbi5zcGxpdE5hbWVzcGFjZSwgW10sIFtnZXRBbnlUeXBlZFBhcmFtZXRlcihuYW1lKV0sIHVuZGVmaW5lZCxcbiAgICAgIHRzLmNyZWF0ZUJsb2NrKFtpZlN0YXRlbWVudCwgZWxzZVJldHVybl0sIHRydWUpKTtcbn1cbiJdfQ==
|
|
@@ -1,113 +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 { basename, join, 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 { getImportSpecifier, replaceImport } from '../../utils/typescript/imports';
|
|
14
|
-
import { closestNode } from '../../utils/typescript/nodes';
|
|
15
|
-
import { getHelper } from './helpers';
|
|
16
|
-
import { migrateExpression } from './migration';
|
|
17
|
-
import { findRendererReferences } from './util';
|
|
18
|
-
const MODULE_AUGMENTATION_FILENAME = 'ɵɵRENDERER_MIGRATION_CORE_AUGMENTATION.d.ts';
|
|
19
|
-
/**
|
|
20
|
-
* Migration that switches from `Renderer` to `Renderer2`. More information on how it works:
|
|
21
|
-
* https://hackmd.angular.io/UTzUZTnPRA-cSa_4mHyfYw
|
|
22
|
-
*/
|
|
23
|
-
export default function () {
|
|
24
|
-
return (tree) => {
|
|
25
|
-
const { buildPaths, testPaths } = getProjectTsConfigPaths(tree);
|
|
26
|
-
const basePath = process.cwd();
|
|
27
|
-
const allPaths = [...buildPaths, ...testPaths];
|
|
28
|
-
if (!allPaths.length) {
|
|
29
|
-
throw new SchematicsException('Could not find any tsconfig file. Cannot migrate Renderer usages to Renderer2.');
|
|
30
|
-
}
|
|
31
|
-
for (const tsconfigPath of allPaths) {
|
|
32
|
-
runRendererToRenderer2Migration(tree, tsconfigPath, basePath);
|
|
33
|
-
}
|
|
34
|
-
};
|
|
35
|
-
}
|
|
36
|
-
function runRendererToRenderer2Migration(tree, tsconfigPath, basePath) {
|
|
37
|
-
// Technically we can get away with using `MODULE_AUGMENTATION_FILENAME` as the path, but as of
|
|
38
|
-
// TS 4.2, the module resolution caching seems to be more aggressive which causes the file to be
|
|
39
|
-
// retained between test runs. We can avoid it by using the full path.
|
|
40
|
-
const augmentedFilePath = join(basePath, MODULE_AUGMENTATION_FILENAME);
|
|
41
|
-
const { program } = createMigrationProgram(tree, tsconfigPath, basePath, fileName => {
|
|
42
|
-
// In case the module augmentation file has been requested, we return a source file that
|
|
43
|
-
// augments "@angular/core" to include a named export called "Renderer". This ensures that
|
|
44
|
-
// we can rely on the type checker for this migration in v9 where "Renderer" has been removed.
|
|
45
|
-
if (basename(fileName) === MODULE_AUGMENTATION_FILENAME) {
|
|
46
|
-
return `
|
|
47
|
-
import '@angular/core';
|
|
48
|
-
declare module "@angular/core" {
|
|
49
|
-
class Renderer {}
|
|
50
|
-
}
|
|
51
|
-
`;
|
|
52
|
-
}
|
|
53
|
-
return undefined;
|
|
54
|
-
}, [augmentedFilePath]);
|
|
55
|
-
const typeChecker = program.getTypeChecker();
|
|
56
|
-
const printer = ts.createPrinter();
|
|
57
|
-
const sourceFiles = program.getSourceFiles().filter(sourceFile => canMigrateFile(basePath, sourceFile, program));
|
|
58
|
-
sourceFiles.forEach(sourceFile => {
|
|
59
|
-
const rendererImportSpecifier = getImportSpecifier(sourceFile, '@angular/core', 'Renderer');
|
|
60
|
-
const rendererImport = rendererImportSpecifier ?
|
|
61
|
-
closestNode(rendererImportSpecifier, ts.SyntaxKind.NamedImports) :
|
|
62
|
-
null;
|
|
63
|
-
// If there are no imports for the `Renderer`, we can exit early.
|
|
64
|
-
if (!rendererImportSpecifier || !rendererImport) {
|
|
65
|
-
return;
|
|
66
|
-
}
|
|
67
|
-
const { typedNodes, methodCalls, forwardRefs } = findRendererReferences(sourceFile, typeChecker, rendererImportSpecifier);
|
|
68
|
-
const update = tree.beginUpdate(relative(basePath, sourceFile.fileName));
|
|
69
|
-
const helpersToAdd = new Set();
|
|
70
|
-
// Change the `Renderer` import to `Renderer2`.
|
|
71
|
-
update.remove(rendererImport.getStart(), rendererImport.getWidth());
|
|
72
|
-
update.insertRight(rendererImport.getStart(), printer.printNode(ts.EmitHint.Unspecified, replaceImport(rendererImport, 'Renderer', 'Renderer2'), sourceFile));
|
|
73
|
-
// Change the method parameter and property types to `Renderer2`.
|
|
74
|
-
typedNodes.forEach(node => {
|
|
75
|
-
const type = node.type;
|
|
76
|
-
if (type) {
|
|
77
|
-
update.remove(type.getStart(), type.getWidth());
|
|
78
|
-
update.insertRight(type.getStart(), 'Renderer2');
|
|
79
|
-
}
|
|
80
|
-
});
|
|
81
|
-
// Change all identifiers inside `forwardRef` referring to the `Renderer`.
|
|
82
|
-
forwardRefs.forEach(identifier => {
|
|
83
|
-
update.remove(identifier.getStart(), identifier.getWidth());
|
|
84
|
-
update.insertRight(identifier.getStart(), 'Renderer2');
|
|
85
|
-
});
|
|
86
|
-
// Migrate all of the method calls.
|
|
87
|
-
methodCalls.forEach(call => {
|
|
88
|
-
const { node, requiredHelpers } = migrateExpression(call, typeChecker);
|
|
89
|
-
if (node) {
|
|
90
|
-
// If we migrated the node to a new expression, replace only the call expression.
|
|
91
|
-
update.remove(call.getStart(), call.getWidth());
|
|
92
|
-
update.insertRight(call.getStart(), printer.printNode(ts.EmitHint.Unspecified, node, sourceFile));
|
|
93
|
-
}
|
|
94
|
-
else if (call.parent && ts.isExpressionStatement(call.parent)) {
|
|
95
|
-
// Otherwise if the call is inside an expression statement, drop the entire statement.
|
|
96
|
-
// This takes care of any trailing semicolons. We only need to drop nodes for cases like
|
|
97
|
-
// `setBindingDebugInfo` which have been noop for a while so they can be removed safely.
|
|
98
|
-
update.remove(call.parent.getStart(), call.parent.getWidth());
|
|
99
|
-
}
|
|
100
|
-
if (requiredHelpers) {
|
|
101
|
-
requiredHelpers.forEach(helperName => helpersToAdd.add(helperName));
|
|
102
|
-
}
|
|
103
|
-
});
|
|
104
|
-
// Some of the methods can't be mapped directly to `Renderer2` and need extra logic around them.
|
|
105
|
-
// The safest way to do so is to declare helper functions similar to the ones emitted by TS
|
|
106
|
-
// which encapsulate the extra "glue" logic. We should only emit these functions once per file.
|
|
107
|
-
helpersToAdd.forEach(helperName => {
|
|
108
|
-
update.insertLeft(sourceFile.endOfFileToken.getStart(), getHelper(helperName, sourceFile, printer));
|
|
109
|
-
});
|
|
110
|
-
tree.commitUpdate(update);
|
|
111
|
-
});
|
|
112
|
-
}
|
|
113
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9jb3JlL3NjaGVtYXRpY3MvbWlncmF0aW9ucy9yZW5kZXJlci10by1yZW5kZXJlcjIvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7OztHQU1HO0FBRUgsT0FBTyxFQUFPLG1CQUFtQixFQUFPLE1BQU0sNEJBQTRCLENBQUM7QUFDM0UsT0FBTyxFQUFDLFFBQVEsRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFDLE1BQU0sTUFBTSxDQUFDO0FBQzlDLE9BQU8sS0FBSyxFQUFFLE1BQU0sWUFBWSxDQUFDO0FBRWpDLE9BQU8sRUFBQyx1QkFBdUIsRUFBQyxNQUFNLG9DQUFvQyxDQUFDO0FBQzNFLE9BQU8sRUFBQyxjQUFjLEVBQUUsc0JBQXNCLEVBQUMsTUFBTSxzQ0FBc0MsQ0FBQztBQUM1RixPQUFPLEVBQUMsa0JBQWtCLEVBQUUsYUFBYSxFQUFDLE1BQU0sZ0NBQWdDLENBQUM7QUFDakYsT0FBTyxFQUFDLFdBQVcsRUFBQyxNQUFNLDhCQUE4QixDQUFDO0FBRXpELE9BQU8sRUFBQyxTQUFTLEVBQWlCLE1BQU0sV0FBVyxDQUFDO0FBQ3BELE9BQU8sRUFBQyxpQkFBaUIsRUFBQyxNQUFNLGFBQWEsQ0FBQztBQUM5QyxPQUFPLEVBQUMsc0JBQXNCLEVBQUMsTUFBTSxRQUFRLENBQUM7QUFFOUMsTUFBTSw0QkFBNEIsR0FBRyw2Q0FBNkMsQ0FBQztBQUVuRjs7O0dBR0c7QUFDSCxNQUFNLENBQUMsT0FBTztJQUNaLE9BQU8sQ0FBQyxJQUFVLEVBQUUsRUFBRTtRQUNwQixNQUFNLEVBQUMsVUFBVSxFQUFFLFNBQVMsRUFBQyxHQUFHLHVCQUF1QixDQUFDLElBQUksQ0FBQyxDQUFDO1FBQzlELE1BQU0sUUFBUSxHQUFHLE9BQU8sQ0FBQyxHQUFHLEVBQUUsQ0FBQztRQUMvQixNQUFNLFFBQVEsR0FBRyxDQUFDLEdBQUcs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QUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsRUFBRSxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQzthQUMvRDtZQUVELElBQUksZUFBZSxFQUFFO2dCQUNuQixlQUFlLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxFQUFFLENBQUMsWUFBWSxDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDO2FBQ3JFO1FBQ0gsQ0FBQyxDQUFDLENBQUM7UUFFSCxnR0FBZ0c7UUFDaEcsMkZBQTJGO1FBQzNGLCtGQUErRjtRQUMvRixZQUFZLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxFQUFFO1lBQ2hDLE1BQU0sQ0FBQyxVQUFVLENBQ2IsVUFBVSxDQUFDLGNBQWMsQ0FBQyxRQUFRLEVBQUUsRUFBRSxTQUFTLENBQUMsVUFBVSxFQUFFLFVBQVUsRUFBRSxPQUFPLENBQUMsQ0FBQyxDQUFDO1FBQ3hGLENBQUMsQ0FBQyxDQUFDO1FBRUgsSUFBSSxDQUFDLFlBQVksQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUM1QixDQUFDLENBQUMsQ0FBQztBQUNMLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgR29vZ2xlIExMQyBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICpcbiAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlXG4gKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlXG4gKi9cblxuaW1wb3J0IHtSdWxlLCBTY2hlbWF0aWNzRXhjZXB0aW9uLCBUcmVlfSBmcm9tICdAYW5ndWxhci1kZXZraXQvc2NoZW1hdGljcyc7XG5pbXBvcnQge2Jhc2VuYW1lLCBqb2luLCByZWxhdGl2ZX0gZnJvbSAncGF0aCc7XG5pbXBvcnQgKiBhcyB0cyBmcm9tICd0eXBlc2NyaXB0JztcblxuaW1wb3J0IHtnZXRQcm9qZWN0VHNDb25maWdQYXRoc30gZnJvbSAnLi4vLi4vdXRpbHMvcHJvamVjdF90c2NvbmZpZ19wYXRocyc7XG5pbXBvcnQge2Nhbk1pZ3JhdGVGaWxlLCBjcmVhdGVNaWdyYXRpb25Qcm9ncmFtfSBmcm9tICcuLi8uLi91dGlscy90eXBlc2NyaXB0L2NvbXBpbGVyX2hvc3QnO1xuaW1wb3J0IHtnZXRJbXBvcnRTcGVjaWZpZXIsIHJlcGxhY2VJbXBvcnR9IGZyb20gJy4uLy4uL3V0aWxzL3R5cGVzY3JpcHQvaW1wb3J0cyc7XG5pbXBvcnQge2Nsb3Nlc3ROb2RlfSBmcm9tICcuLi8uLi91dGlscy90eXBlc2NyaXB0L25vZGVzJztcblxuaW1wb3J0IHtnZXRIZWxwZXIsIEhlbHBlckZ1bmN0aW9ufSBmcm9tICcuL2hlbHBlcnMnO1xuaW1wb3J0IHttaWdyYXRlRXhwcmVzc2lvbn0gZnJvbSAnLi9taWdyYXRpb24nO1xuaW1wb3J0IHtmaW5kUmVuZGVyZXJSZWZlcmVuY2VzfSBmcm9tICcuL3V0aWwnO1xuXG5jb25zdCBNT0RVTEVfQVVHTUVOVEFUSU9OX0ZJTEVOQU1FID0gJ8m1ybVSRU5ERVJFUl9NSUdSQVRJT05fQ09SRV9BVUdNRU5UQVRJT04uZC50cyc7XG5cbi8qKlxuICogTWlncmF0aW9uIHRoYXQgc3dpdGNoZXMgZnJvbSBgUmVuZGVyZXJgIHRvIGBSZW5kZXJlcjJgLiBNb3JlIGluZm9ybWF0aW9uIG9uIGhvdyBpdCB3b3JrczpcbiAqIGh0dHBzOi8vaGFja21kLmFuZ3VsYXIuaW8vVVR6VVpUblBSQS1jU2FfNG1IeWZZd1xuICovXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbigpOiBSdWxlIHtcbiAgcmV0dXJuICh0cmVlOiBUcmVlKSA9PiB7XG4gICAgY29uc3Qge2J1aWxkUGF0aHMsIHRlc3RQYXRoc30gPSBnZXRQcm9qZWN0VHNDb25maWdQYXRocyh0cmVlKTtcbiAgICBjb25zdCBiYXNlUGF0aCA9IHByb2Nlc3MuY3dkKCk7XG4gICAgY29uc3QgYWxsUGF0aHMgPSBbLi4uYnVpbGRQYXRocywgLi4udGVzdFBhdGhzXTtcblxuICAgIGlmICghYWxsUGF0aHMubGVuZ3RoKSB7XG4gICAgICB0aHJvdyBuZXcgU2NoZW1hdGljc0V4Y2VwdGlvbihcbiAgICAgICAgICAnQ291bGQgbm90IGZpbmQgYW55IHRzY29uZmlnIGZpbGUuIENhbm5vdCBtaWdyYXRlIFJlbmRlcmVyIHVzYWdlcyB0byBSZW5kZXJlcjIuJyk7XG4gICAgfVxuXG4gICAgZm9yIChjb25zdCB0c2NvbmZpZ1BhdGggb2YgYWxsUGF0aHMpIHtcbiAgICAgIHJ1blJlbmRlcmVyVG9SZW5kZXJlcjJNaWdyYXRpb24odHJlZSwgdHNjb25maWdQYXRoLCBiYXNlUGF0aCk7XG4gICAgfVxuICB9O1xufVxuXG5mdW5jdGlvbiBydW5SZW5kZXJlclRvUmVuZGVyZXIyTWlncmF0aW9uKHRyZWU6IFRyZWUsIHRzY29uZmlnUGF0aDogc3RyaW5nLCBiYXNlUGF0aDogc3RyaW5nKSB7XG4gIC8vIFRlY2huaWNhbGx5IHdlIGNhbiBnZXQgYXdheSB3aXRoIHVzaW5nIGBNT0RVTEVfQVVHTUVOVEFUSU9OX0ZJTEVOQU1FYCBhcyB0aGUgcGF0aCwgYnV0IGFzIG9mXG4gIC8vIFRTIDQuMiwgdGhlIG1vZHVsZSByZXNvbHV0aW9uIGNhY2hpbmcgc2VlbXMgdG8gYmUgbW9yZSBhZ2dyZXNzaXZlIHdoaWNoIGNhdXNlcyB0aGUgZmlsZSB0byBiZVxuICAvLyByZXRhaW5lZCBiZXR3ZWVuIHRlc3QgcnVucy4gV2UgY2FuIGF2b2lkIGl0IGJ5IHVzaW5nIHRoZSBmdWxsIHBhdGguXG4gIGNvbnN0IGF1Z21lbnRlZEZpbGVQYXRoID0gam9pbihiYXNlUGF0aCwgTU9EVUxFX0FVR01FTlRBVElPTl9GSUxFTkFNRSk7XG4gIGNvbnN0IHtwcm9ncmFtfSA9IGNyZWF0ZU1pZ3JhdGlvblByb2dyYW0odHJlZSwgdHNjb25maWdQYXRoLCBiYXNlUGF0aCwgZmlsZU5hbWUgPT4ge1xuICAgIC8vIEluIGNhc2UgdGhlIG1vZHVsZSBhdWdtZW50YXRpb24gZmlsZSBoYXMgYmVlbiByZXF1ZXN0ZWQsIHdlIHJldHVybiBhIHNvdXJjZSBmaWxlIHRoYXRcbiAgICAvLyBhdWdtZW50cyBcIkBhbmd1bGFyL2NvcmVcIiB0byBpbmNsdWRlIGEgbmFtZWQgZXhwb3J0IGNhbGxlZCBcIlJlbmRlcmVyXCIuIFRoaXMgZW5zdXJlcyB0aGF0XG4gICAgLy8gd2UgY2FuIHJlbHkgb24gdGhlIHR5cGUgY2hlY2tlciBmb3IgdGhpcyBtaWdyYXRpb24gaW4gdjkgd2hlcmUgXCJSZW5kZXJlclwiIGhhcyBiZWVuIHJlbW92ZWQuXG4gICAgaWYgKGJhc2VuYW1lKGZpbGVOYW1lKSA9PT0gTU9EVUxFX0FVR01FTlRBVElPTl9GSUxFTkFNRSkge1xuICAgICAgcmV0dXJuIGBcbiAgICAgICAgaW1wb3J0ICdAYW5ndWxhci9jb3JlJztcbiAgICAgICAgZGVjbGFyZSBtb2R1bGUgXCJAYW5ndWxhci9jb3JlXCIge1xuICAgICAgICAgIGNsYXNzIFJlbmRlcmVyIHt9XG4gICAgICAgIH1cbiAgICAgIGA7XG4gICAgfVxuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH0sIFthdWdtZW50ZWRGaWxlUGF0aF0pO1xuICBjb25zdCB0eXBlQ2hlY2tlciA9IHByb2dyYW0uZ2V0VHlwZUNoZWNrZXIoKTtcbiAgY29uc3QgcHJpbnRlciA9IHRzLmNyZWF0ZVByaW50ZXIoKTtcbiAgY29uc3Qgc291cmNlRmlsZXMgPVxuICAgICAgcHJvZ3JhbS5nZXRTb3VyY2VGaWxlcygpLmZpbHRlcihzb3VyY2VGaWxlID0+IGNhbk1pZ3JhdGVGaWxlKGJhc2VQYXRoLCBzb3VyY2VGaWxlLCBwcm9ncmFtKSk7XG5cbiAgc291cmNlRmlsZXMuZm9yRWFjaChzb3VyY2VGaWxlID0+IHtcbiAgICBjb25zdCByZW5kZXJlckltcG9ydFNwZWNpZmllciA9IGdldEltcG9ydFNwZWNpZmllcihzb3VyY2VGaWxlLCAnQGFuZ3VsYXIvY29yZScsICdSZW5kZXJlcicpO1xuICAgIGNvbnN0IHJlbmRlcmVySW1wb3J0ID0gcmVuZGVyZXJJbXBvcnRTcGVjaWZpZXIgP1xuICAgICAgICBjbG9zZXN0Tm9kZTx0cy5OYW1lZEltcG9ydHM+KHJlbmRlcmVySW1wb3J0U3BlY2lmaWVyLCB0cy5TeW50YXhLaW5kLk5hbWVkSW1wb3J0cykgOlxuICAgICAgICBudWxsO1xuXG4gICAgLy8gSWYgdGhlcmUgYXJlIG5vIGltcG9ydHMgZm9yIHRoZSBgUmVuZGVyZXJgLCB3ZSBjYW4gZXhpdCBlYXJseS5cbiAgICBpZiAoIXJlbmRlcmVySW1wb3J0U3BlY2lmaWVyIHx8ICFyZW5kZXJlckltcG9ydCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHt0eXBlZE5vZGVzLCBtZXRob2RDYWxscywgZm9yd2FyZFJlZnN9ID1cbiAgICAgICAgZmluZFJlbmRlcmVyUmVmZXJlbmNlcyhzb3VyY2VGaWxlLCB0eXBlQ2hlY2tlciwgcmVuZGVyZXJJbXBvcnRTcGVjaWZpZXIpO1xuICAgIGNvbnN0IHVwZGF0ZSA9IHRyZWUuYmVnaW5VcGRhdGUocmVsYXRpdmUoYmFzZVBhdGgsIHNvdXJjZUZpbGUuZmlsZU5hbWUpKTtcbiAgICBjb25zdCBoZWxwZXJzVG9BZGQgPSBuZXcgU2V0PEhlbHBlckZ1bmN0aW9uPigpO1xuXG4gICAgLy8gQ2hhbmdlIHRoZSBgUmVuZGVyZXJgIGltcG9ydCB0byBgUmVuZGVyZXIyYC5cbiAgICB1cGRhdGUucmVtb3ZlKHJlbmRlcmVySW1wb3J0LmdldFN0YXJ0KCksIHJlbmRlcmVySW1wb3J0LmdldFdpZHRoKCkpO1xuICAgIHVwZGF0ZS5pbnNlcnRSaWdodChcbiAgICAgICAgcmVuZGVyZXJJbXBvcnQuZ2V0U3RhcnQoKSxcbiAgICAgICAgcHJpbnRlci5wcmludE5vZGUoXG4gICAgICAgICAgICB0cy5FbWl0SGludC5VbnNwZWNpZmllZCwgcmVwbGFjZUltcG9ydChyZW5kZXJlckltcG9ydCwgJ1JlbmRlcmVyJywgJ1JlbmRlcmVyMicpLFxuICAgICAgICAgICAgc291cmNlRmlsZSkpO1xuXG4gICAgLy8gQ2hhbmdlIHRoZSBtZXRob2QgcGFyYW1ldGVyIGFuZCBwcm9wZXJ0eSB0eXBlcyB0byBgUmVuZGVyZXIyYC5cbiAgICB0eXBlZE5vZGVzLmZvckVhY2gobm9kZSA9PiB7XG4gICAgICBjb25zdCB0eXBlID0gbm9kZS50eXBlO1xuXG4gICAgICBpZiAodHlwZSkge1xuICAgICAgICB1cGRhdGUucmVtb3ZlKHR5cGUuZ2V0U3RhcnQoKSwgdHlwZS5nZXRXaWR0aCgpKTtcbiAgICAgICAgdXBkYXRlLmluc2VydFJpZ2h0KHR5cGUuZ2V0U3RhcnQoKSwgJ1JlbmRlcmVyMicpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgLy8gQ2hhbmdlIGFsbCBpZGVudGlmaWVycyBpbnNpZGUgYGZvcndhcmRSZWZgIHJlZmVycmluZyB0byB0aGUgYFJlbmRlcmVyYC5cbiAgICBmb3J3YXJkUmVmcy5mb3JFYWNoKGlkZW50aWZpZXIgPT4ge1xuICAgICAgdXBkYXRlLnJlbW92ZShpZGVudGlmaWVyLmdldFN0YXJ0KCksIGlkZW50aWZpZXIuZ2V0V2lkdGgoKSk7XG4gICAgICB1cGRhdGUuaW5zZXJ0UmlnaHQoaWRlbnRpZmllci5nZXRTdGFydCgpLCAnUmVuZGVyZXIyJyk7XG4gICAgfSk7XG5cbiAgICAvLyBNaWdyYXRlIGFsbCBvZiB0aGUgbWV0aG9kIGNhbGxzLlxuICAgIG1ldGhvZENhbGxzLmZvckVhY2goY2FsbCA9PiB7XG4gICAgICBjb25zdCB7bm9kZSwgcmVxdWlyZWRIZWxwZXJzfSA9IG1pZ3JhdGVFeHByZXNzaW9uKGNhbGwsIHR5cGVDaGVja2VyKTtcblxuICAgICAgaWYgKG5vZGUpIHtcbiAgICAgICAgLy8gSWYgd2UgbWlncmF0ZWQgdGhlIG5vZGUgdG8gYSBuZXcgZXhwcmVzc2lvbiwgcmVwbGFjZSBvbmx5IHRoZSBjYWxsIGV4cHJlc3Npb24uXG4gICAgICAgIHVwZGF0ZS5yZW1vdmUoY2FsbC5nZXRTdGFydCgpLCBjYWxsLmdldFdpZHRoKCkpO1xuICAgICAgICB1cGRhdGUuaW5zZXJ0UmlnaHQoXG4gICAgICAgICAgICBjYWxsLmdldFN0YXJ0KCksIHByaW50ZXIucHJpbnROb2RlKHRzLkVtaXRIaW50LlVuc3BlY2lmaWVkLCBub2RlLCBzb3VyY2VGaWxlKSk7XG4gICAgICB9IGVsc2UgaWYgKGNhbGwucGFyZW50ICYmIHRzLmlzRXhwcmVzc2lvblN0YXRlbWVudChjYWxsLnBhcmVudCkpIHtcbiAgICAgICAgLy8gT3RoZXJ3aXNlIGlmIHRoZSBjYWxsIGlzIGluc2lkZSBhbiBleHByZXNzaW9uIHN0YXRlbWVudCwgZHJvcCB0aGUgZW50aXJlIHN0YXRlbWVudC5cbiAgICAgICAgLy8gVGhpcyB0YWtlcyBjYXJlIG9mIGFueSB0cmFpbGluZyBzZW1pY29sb25zLiBXZSBvbmx5IG5lZWQgdG8gZHJvcCBub2RlcyBmb3IgY2FzZXMgbGlrZVxuICAgICAgICAvLyBgc2V0QmluZGluZ0RlYnVnSW5mb2Agd2hpY2ggaGF2ZSBiZWVuIG5vb3AgZm9yIGEgd2hpbGUgc28gdGhleSBjYW4gYmUgcmVtb3ZlZCBzYWZlbHkuXG4gICAgICAgIHVwZGF0ZS5yZW1vdmUoY2FsbC5wYXJlbnQuZ2V0U3RhcnQoKSwgY2FsbC5wYXJlbnQuZ2V0V2lkdGgoKSk7XG4gICAgICB9XG5cbiAgICAgIGlmIChyZXF1aXJlZEhlbHBlcnMpIHtcbiAgICAgICAgcmVxdWlyZWRIZWxwZXJzLmZvckVhY2goaGVscGVyTmFtZSA9PiBoZWxwZXJzVG9BZGQuYWRkKGhlbHBlck5hbWUpKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIC8vIFNvbWUgb2YgdGhlIG1ldGhvZHMgY2FuJ3QgYmUgbWFwcGVkIGRpcmVjdGx5IHRvIGBSZW5kZXJlcjJgIGFuZCBuZWVkIGV4dHJhIGxvZ2ljIGFyb3VuZCB0aGVtLlxuICAgIC8vIFRoZSBzYWZlc3Qgd2F5IHRvIGRvIHNvIGlzIHRvIGRlY2xhcmUgaGVscGVyIGZ1bmN0aW9ucyBzaW1pbGFyIHRvIHRoZSBvbmVzIGVtaXR0ZWQgYnkgVFNcbiAgICAvLyB3aGljaCBlbmNhcHN1bGF0ZSB0aGUgZXh0cmEgXCJnbHVlXCIgbG9naWMuIFdlIHNob3VsZCBvbmx5IGVtaXQgdGhlc2UgZnVuY3Rpb25zIG9uY2UgcGVyIGZpbGUuXG4gICAgaGVscGVyc1RvQWRkLmZvckVhY2goaGVscGVyTmFtZSA9PiB7XG4gICAgICB1cGRhdGUuaW5zZXJ0TGVmdChcbiAgICAgICAgICBzb3VyY2VGaWxlLmVuZE9mRmlsZVRva2VuLmdldFN0YXJ0KCksIGdldEhlbHBlcihoZWxwZXJOYW1lLCBzb3VyY2VGaWxlLCBwcmludGVyKSk7XG4gICAgfSk7XG5cbiAgICB0cmVlLmNvbW1pdFVwZGF0ZSh1cGRhdGUpO1xuICB9KTtcbn1cbiJdfQ==
|