1 | /**
|
2 | * @license
|
3 | * Copyright Google LLC All Rights Reserved.
|
4 | *
|
5 | * Use of this source code is governed by an MIT-style license that can be
|
6 | * found in the LICENSE file at https://angular.io/license
|
7 | */
|
8 | (function (factory) {
|
9 | if (typeof module === "object" && typeof module.exports === "object") {
|
10 | var v = factory(require, exports);
|
11 | if (v !== undefined) module.exports = v;
|
12 | }
|
13 | else if (typeof define === "function" && define.amd) {
|
14 | define("@angular/language-service/ivy/definitions", ["require", "exports", "tslib", "@angular/compiler", "@angular/compiler-cli/src/ngtsc/typecheck/api", "typescript", "@angular/language-service/ivy/hybrid_visitor", "@angular/language-service/ivy/utils"], factory);
|
15 | }
|
16 | })(function (require, exports) {
|
17 | ;
|
18 | Object.defineProperty(exports, "__esModule", { value: true });
|
19 | exports.DefinitionBuilder = void 0;
|
20 | var tslib_1 = require("tslib");
|
21 | var compiler_1 = require("@angular/compiler");
|
22 | var api_1 = require("@angular/compiler-cli/src/ngtsc/typecheck/api");
|
23 | var ts = require("typescript");
|
24 | var hybrid_visitor_1 = require("@angular/language-service/ivy/hybrid_visitor");
|
25 | var utils_1 = require("@angular/language-service/ivy/utils");
|
26 | var DefinitionBuilder = /** @class */ (function () {
|
27 | function DefinitionBuilder(tsLS, compiler) {
|
28 | this.tsLS = tsLS;
|
29 | this.compiler = compiler;
|
30 | }
|
31 | DefinitionBuilder.prototype.getDefinitionAndBoundSpan = function (fileName, position) {
|
32 | var templateInfo = utils_1.getTemplateInfoAtPosition(fileName, position, this.compiler);
|
33 | if (templateInfo === undefined) {
|
34 | return;
|
35 | }
|
36 | var definitionMeta = this.getDefinitionMetaAtPosition(templateInfo, position);
|
37 | // The `$event` of event handlers would point to the $event parameter in the shim file, as in
|
38 | // `_outputHelper(_t3["x"]).subscribe(function ($event): any { $event }) ;`
|
39 | // If we wanted to return something for this, it would be more appropriate for something like
|
40 | // `getTypeDefinition`.
|
41 | if (definitionMeta === undefined || utils_1.isDollarEvent(definitionMeta.node)) {
|
42 | return undefined;
|
43 | }
|
44 | var definitions = this.getDefinitionsForSymbol(tslib_1.__assign(tslib_1.__assign({}, definitionMeta), templateInfo));
|
45 | return { definitions: definitions, textSpan: utils_1.getTextSpanOfNode(definitionMeta.node) };
|
46 | };
|
47 | DefinitionBuilder.prototype.getDefinitionsForSymbol = function (_a) {
|
48 | var symbol = _a.symbol, node = _a.node, path = _a.path, component = _a.component;
|
49 | switch (symbol.kind) {
|
50 | case api_1.SymbolKind.Directive:
|
51 | case api_1.SymbolKind.Element:
|
52 | case api_1.SymbolKind.Template:
|
53 | case api_1.SymbolKind.DomBinding:
|
54 | // Though it is generally more appropriate for the above symbol definitions to be
|
55 | // associated with "type definitions" since the location in the template is the
|
56 | // actual definition location, the better user experience would be to allow
|
57 | // LS users to "go to definition" on an item in the template that maps to a class and be
|
58 | // taken to the directive or HTML class.
|
59 | return this.getTypeDefinitionsForTemplateInstance(symbol, node);
|
60 | case api_1.SymbolKind.Output:
|
61 | case api_1.SymbolKind.Input: {
|
62 | var bindingDefs = this.getDefinitionsForSymbols.apply(this, tslib_1.__spread(symbol.bindings));
|
63 | // Also attempt to get directive matches for the input name. If there is a directive that
|
64 | // has the input name as part of the selector, we want to return that as well.
|
65 | var directiveDefs = this.getDirectiveTypeDefsForBindingNode(node, path, component);
|
66 | return tslib_1.__spread(bindingDefs, directiveDefs);
|
67 | }
|
68 | case api_1.SymbolKind.Variable:
|
69 | case api_1.SymbolKind.Reference: {
|
70 | var definitions = [];
|
71 | if (symbol.declaration !== node) {
|
72 | definitions.push({
|
73 | name: symbol.declaration.name,
|
74 | containerName: '',
|
75 | containerKind: ts.ScriptElementKind.unknown,
|
76 | kind: ts.ScriptElementKind.variableElement,
|
77 | textSpan: utils_1.getTextSpanOfNode(symbol.declaration),
|
78 | contextSpan: utils_1.toTextSpan(symbol.declaration.sourceSpan),
|
79 | fileName: symbol.declaration.sourceSpan.start.file.url,
|
80 | });
|
81 | }
|
82 | if (symbol.kind === api_1.SymbolKind.Variable) {
|
83 | definitions.push.apply(definitions, tslib_1.__spread(this.getDefinitionsForSymbols(symbol)));
|
84 | }
|
85 | return definitions;
|
86 | }
|
87 | case api_1.SymbolKind.Expression: {
|
88 | return this.getDefinitionsForSymbols(symbol);
|
89 | }
|
90 | }
|
91 | };
|
92 | DefinitionBuilder.prototype.getDefinitionsForSymbols = function () {
|
93 | var _this = this;
|
94 | var symbols = [];
|
95 | for (var _i = 0; _i < arguments.length; _i++) {
|
96 | symbols[_i] = arguments[_i];
|
97 | }
|
98 | return utils_1.flatMap(symbols, function (_a) {
|
99 | var _b;
|
100 | var shimLocation = _a.shimLocation;
|
101 | var shimPath = shimLocation.shimPath, positionInShimFile = shimLocation.positionInShimFile;
|
102 | return (_b = _this.tsLS.getDefinitionAtPosition(shimPath, positionInShimFile)) !== null && _b !== void 0 ? _b : [];
|
103 | });
|
104 | };
|
105 | DefinitionBuilder.prototype.getTypeDefinitionsAtPosition = function (fileName, position) {
|
106 | var templateInfo = utils_1.getTemplateInfoAtPosition(fileName, position, this.compiler);
|
107 | if (templateInfo === undefined) {
|
108 | return;
|
109 | }
|
110 | var definitionMeta = this.getDefinitionMetaAtPosition(templateInfo, position);
|
111 | if (definitionMeta === undefined) {
|
112 | return undefined;
|
113 | }
|
114 | var symbol = definitionMeta.symbol, node = definitionMeta.node;
|
115 | switch (symbol.kind) {
|
116 | case api_1.SymbolKind.Directive:
|
117 | case api_1.SymbolKind.DomBinding:
|
118 | case api_1.SymbolKind.Element:
|
119 | case api_1.SymbolKind.Template:
|
120 | return this.getTypeDefinitionsForTemplateInstance(symbol, node);
|
121 | case api_1.SymbolKind.Output:
|
122 | case api_1.SymbolKind.Input: {
|
123 | var bindingDefs = this.getTypeDefinitionsForSymbols.apply(this, tslib_1.__spread(symbol.bindings));
|
124 | // Also attempt to get directive matches for the input name. If there is a directive that
|
125 | // has the input name as part of the selector, we want to return that as well.
|
126 | var directiveDefs = this.getDirectiveTypeDefsForBindingNode(node, definitionMeta.path, templateInfo.component);
|
127 | return tslib_1.__spread(bindingDefs, directiveDefs);
|
128 | }
|
129 | case api_1.SymbolKind.Reference:
|
130 | case api_1.SymbolKind.Expression:
|
131 | case api_1.SymbolKind.Variable:
|
132 | return this.getTypeDefinitionsForSymbols(symbol);
|
133 | }
|
134 | };
|
135 | DefinitionBuilder.prototype.getTypeDefinitionsForTemplateInstance = function (symbol, node) {
|
136 | switch (symbol.kind) {
|
137 | case api_1.SymbolKind.Template: {
|
138 | var matches = utils_1.getDirectiveMatchesForElementTag(symbol.templateNode, symbol.directives);
|
139 | return this.getTypeDefinitionsForSymbols.apply(this, tslib_1.__spread(matches));
|
140 | }
|
141 | case api_1.SymbolKind.Element: {
|
142 | var matches = utils_1.getDirectiveMatchesForElementTag(symbol.templateNode, symbol.directives);
|
143 | // If one of the directive matches is a component, we should not include the native element
|
144 | // in the results because it is replaced by the component.
|
145 | return Array.from(matches).some(function (dir) { return dir.isComponent; }) ? this.getTypeDefinitionsForSymbols.apply(this, tslib_1.__spread(matches)) : this.getTypeDefinitionsForSymbols.apply(this, tslib_1.__spread(matches, [symbol]));
|
146 | }
|
147 | case api_1.SymbolKind.DomBinding: {
|
148 | if (!(node instanceof compiler_1.TmplAstTextAttribute)) {
|
149 | return [];
|
150 | }
|
151 | var dirs = utils_1.getDirectiveMatchesForAttribute(node.name, symbol.host.templateNode, symbol.host.directives);
|
152 | return this.getTypeDefinitionsForSymbols.apply(this, tslib_1.__spread(dirs));
|
153 | }
|
154 | case api_1.SymbolKind.Directive:
|
155 | return this.getTypeDefinitionsForSymbols(symbol);
|
156 | }
|
157 | };
|
158 | DefinitionBuilder.prototype.getDirectiveTypeDefsForBindingNode = function (node, pathToNode, component) {
|
159 | if (!(node instanceof compiler_1.TmplAstBoundAttribute) && !(node instanceof compiler_1.TmplAstTextAttribute) &&
|
160 | !(node instanceof compiler_1.TmplAstBoundEvent)) {
|
161 | return [];
|
162 | }
|
163 | var parent = pathToNode[pathToNode.length - 2];
|
164 | if (!(parent instanceof compiler_1.TmplAstTemplate || parent instanceof compiler_1.TmplAstElement)) {
|
165 | return [];
|
166 | }
|
167 | var templateOrElementSymbol = this.compiler.getTemplateTypeChecker().getSymbolOfNode(parent, component);
|
168 | if (templateOrElementSymbol === null ||
|
169 | (templateOrElementSymbol.kind !== api_1.SymbolKind.Template &&
|
170 | templateOrElementSymbol.kind !== api_1.SymbolKind.Element)) {
|
171 | return [];
|
172 | }
|
173 | var dirs = utils_1.getDirectiveMatchesForAttribute(node.name, parent, templateOrElementSymbol.directives);
|
174 | return this.getTypeDefinitionsForSymbols.apply(this, tslib_1.__spread(dirs));
|
175 | };
|
176 | DefinitionBuilder.prototype.getTypeDefinitionsForSymbols = function () {
|
177 | var _this = this;
|
178 | var symbols = [];
|
179 | for (var _i = 0; _i < arguments.length; _i++) {
|
180 | symbols[_i] = arguments[_i];
|
181 | }
|
182 | return utils_1.flatMap(symbols, function (_a) {
|
183 | var _b;
|
184 | var shimLocation = _a.shimLocation;
|
185 | var shimPath = shimLocation.shimPath, positionInShimFile = shimLocation.positionInShimFile;
|
186 | return (_b = _this.tsLS.getTypeDefinitionAtPosition(shimPath, positionInShimFile)) !== null && _b !== void 0 ? _b : [];
|
187 | });
|
188 | };
|
189 | DefinitionBuilder.prototype.getDefinitionMetaAtPosition = function (_a, position) {
|
190 | var template = _a.template, component = _a.component;
|
191 | var path = hybrid_visitor_1.getPathToNodeAtPosition(template, position);
|
192 | if (path === undefined) {
|
193 | return;
|
194 | }
|
195 | var node = path[path.length - 1];
|
196 | var symbol = this.compiler.getTemplateTypeChecker().getSymbolOfNode(node, component);
|
197 | if (symbol === null) {
|
198 | return;
|
199 | }
|
200 | return { node: node, path: path, symbol: symbol };
|
201 | };
|
202 | return DefinitionBuilder;
|
203 | }());
|
204 | exports.DefinitionBuilder = DefinitionBuilder;
|
205 | });
|
206 | //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVmaW5pdGlvbnMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9sYW5ndWFnZS1zZXJ2aWNlL2l2eS9kZWZpbml0aW9ucy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7O0dBTUc7Ozs7Ozs7Ozs7Ozs7O0lBRUgsOENBQW9KO0lBRXBKLHFFQUFpSztJQUNqSywrQkFBaUM7SUFFakMsK0VBQXlEO0lBQ3pELDZEQUEwTDtJQVkxTDtRQUNFLDJCQUE2QixJQUF3QixFQUFtQixRQUFvQjtZQUEvRCxTQUFJLEdBQUosSUFBSSxDQUFvQjtZQUFtQixhQUFRLEdBQVIsUUFBUSxDQUFZO1FBQUcsQ0FBQztRQUVoRyxxREFBeUIsR0FBekIsVUFBMEIsUUFBZ0IsRUFBRSxRQUFnQjtZQUUxRCxJQUFNLFlBQVksR0FBRyxpQ0FBeUIsQ0FBQyxRQUFRLEVBQUUsUUFBUSxFQUFFLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztZQUNsRixJQUFJLFlBQVksS0FBSyxTQUFTLEVBQUU7Z0JBQzlCLE9BQU87YUFDUjtZQUNELElBQU0sY0FBYyxHQUFHLElBQUksQ0FBQywyQkFBMkIsQ0FBQyxZQUFZLEVBQUUsUUFBUSxDQUFDLENBQUM7WUFDaEYsNkZBQTZGO1lBQzdGLDJFQUEyRTtZQUMzRSw2RkFBNkY7WUFDN0YsdUJBQXVCO1lBQ3ZCLElBQUksY0FBYyxLQUFLLFNBQVMsSUFBSSxxQkFBYSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsRUFBRTtnQkFDdEUsT0FBTyxTQUFTLENBQUM7YUFDbEI7WUFFRCxJQUFNLFdBQVcsR0FBRyxJQUFJLENBQUMsdUJBQXVCLHVDQUFLLGNBQWMsR0FBSyxZQUFZLEVBQUUsQ0FBQztZQUN2RixPQUFPLEVBQUMsV0FBVyxhQUFBLEVBQUUsUUFBUSxFQUFFLHlCQUFpQixDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsRUFBQyxDQUFDO1FBQ3pFLENBQUM7UUFFTyxtREFBdUIs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RUFBRSxJQUFJLE1BQUEsRUFBRSxNQUFNLFFBQUEsRUFBQyxDQUFDO1FBQzlCLENBQUM7UUFDSCx3QkFBQztJQUFELENBQUMsQUFyTEQsSUFxTEM7SUFyTFksOENBQWlCIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IEdvb2dsZSBMTEMgQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqXG4gKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZVxuICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZVxuICovXG5cbmltcG9ydCB7QVNULCBUbXBsQXN0Qm91bmRBdHRyaWJ1dGUsIFRtcGxBc3RCb3VuZEV2ZW50LCBUbXBsQXN0RWxlbWVudCwgVG1wbEFzdE5vZGUsIFRtcGxBc3RUZW1wbGF0ZSwgVG1wbEFzdFRleHRBdHRyaWJ1dGV9IGZyb20gJ0Bhbmd1bGFyL2NvbXBpbGVyJztcbmltcG9ydCB7TmdDb21waWxlcn0gZnJvbSAnQGFuZ3VsYXIvY29tcGlsZXItY2xpL3NyYy9uZ3RzYy9jb3JlJztcbmltcG9ydCB7RGlyZWN0aXZlU3ltYm9sLCBEb21CaW5kaW5nU3ltYm9sLCBFbGVtZW50U3ltYm9sLCBTaGltTG9jYXRpb24sIFN5bWJvbCwgU3ltYm9sS2luZCwgVGVtcGxhdGVTeW1ib2x9IGZyb20gJ0Bhbmd1bGFyL2NvbXBpbGVyLWNsaS9zcmMvbmd0c2MvdHlwZWNoZWNrL2FwaSc7XG5pbXBvcnQgKiBhcyB0cyBmcm9tICd0eXBlc2NyaXB0JztcblxuaW1wb3J0IHtnZXRQYXRoVG9Ob2RlQXRQb3NpdGlvbn0gZnJvbSAnLi9oeWJyaWRfdmlzaXRvcic7XG5pbXBvcnQge2ZsYXRNYXAsIGdldERpcmVjdGl2ZU1hdGNoZXNGb3JBdHRyaWJ1dGUsIGdldERpcmVjdGl2ZU1hdGNoZXNGb3JFbGVtZW50VGFnLCBnZXRUZW1wbGF0ZUluZm9BdFBvc2l0aW9uLCBnZXRUZXh0U3Bhbk9mTm9kZSwgaXNEb2xsYXJFdmVudCwgVGVtcGxhdGVJbmZvLCB0b1RleHRTcGFufSBmcm9tICcuL3V0aWxzJztcblxuaW50ZXJmYWNlIERlZmluaXRpb25NZXRhIHtcbiAgbm9kZTogQVNUfFRtcGxBc3ROb2RlO1xuICBwYXRoOiBBcnJheTxBU1R8VG1wbEFzdE5vZGU+O1xuICBzeW1ib2w6IFN5bWJvbDtcbn1cblxuaW50ZXJmYWNlIEhhc1NoaW1Mb2NhdGlvbiB7XG4gIHNoaW1Mb2NhdGlvbjogU2hpbUxvY2F0aW9uO1xufVxuXG5leHBvcnQgY2xhc3MgRGVmaW5pdGlvbkJ1aWxkZXIge1xuICBjb25zdHJ1Y3Rvcihwcml2YXRlIHJlYWRvbmx5IHRzTFM6IHRzLkxhbmd1YWdlU2VydmljZSwgcHJpdmF0ZSByZWFkb25seSBjb21waWxlcjogTmdDb21waWxlcikge31cblxuICBnZXREZWZpbml0aW9uQW5kQm91bmRTcGFuKGZpbGVOYW1lOiBzdHJpbmcsIHBvc2l0aW9uOiBudW1iZXIpOiB0cy5EZWZpbml0aW9uSW5mb0FuZEJvdW5kU3BhblxuICAgICAgfHVuZGVmaW5lZCB7XG4gICAgY29uc3QgdGVtcGxhdGVJbmZvID0gZ2V0VGVtcGxhdGVJbmZvQXRQb3NpdGlvbihmaWxlTmFtZSwgcG9zaXRpb24sIHRoaXMuY29tcGlsZXIpO1xuICAgIGlmICh0ZW1wbGF0ZUluZm8gPT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBkZWZpbml0aW9uTWV0YSA9IHRoaXMuZ2V0RGVmaW5pdGlvbk1ldGFBdFBvc2l0aW9uKHRlbXBsYXRlSW5mbywgcG9zaXRpb24pO1xuICAgIC8vIFRoZSBgJGV2ZW50YCBvZiBldmVudCBoYW5kbGVycyB3b3VsZCBwb2ludCB0byB0aGUgJGV2ZW50IHBhcmFtZXRlciBpbiB0aGUgc2hpbSBmaWxlLCBhcyBpblxuICAgIC8vIGBfb3V0cHV0SGVscGVyKF90M1tcInhcIl0pLnN1YnNjcmliZShmdW5jdGlvbiAoJGV2ZW50KTogYW55IHsgJGV2ZW50IH0pIDtgXG4gICAgLy8gSWYgd2Ugd2FudGVkIHRvIHJldHVybiBzb21ldGhpbmcgZm9yIHRoaXMsIGl0IHdvdWxkIGJlIG1vcmUgYXBwcm9wcmlhdGUgZm9yIHNvbWV0aGluZyBsaWtlXG4gICAgLy8gYGdldFR5cGVEZWZpbml0aW9uYC5cbiAgICBpZiAoZGVmaW5pdGlvbk1ldGEgPT09IHVuZGVmaW5lZCB8fCBpc0RvbGxhckV2ZW50KGRlZmluaXRpb25NZXRhLm5vZGUpKSB7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIGNvbnN0IGRlZmluaXRpb25zID0gdGhpcy5nZXREZWZpbml0aW9uc0ZvclN5bWJvbCh7Li4uZGVmaW5pdGlvbk1ldGEsIC4uLnRlbXBsYXRlSW5mb30pO1xuICAgIHJldHVybiB7ZGVmaW5pdGlvbnMsIHRleHRTcGFuOiBnZXRUZXh0U3Bhbk9mTm9kZShkZWZpbml0aW9uTWV0YS5ub2RlKX07XG4gIH1cblxuICBwcml2YXRlIGdldERlZmluaXRpb25zRm9yU3ltYm9sKHtzeW1ib2wsIG5vZGUsIHBhdGgsIGNvbXBvbmVudH06IERlZmluaXRpb25NZXRhJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRlbXBsYXRlSW5mbyk6IHJlYWRvbmx5IHRzLkRlZmluaXRpb25JbmZvW118dW5kZWZpbmVkIHtcbiAgICBzd2l0Y2ggKHN5bWJvbC5raW5kKSB7XG4gICAgICBjYXNlIFN5bWJvbEtpbmQuRGlyZWN0aXZlOlxuICAgICAgY2FzZSBTeW1ib2xLaW5kLkVsZW1lbnQ6XG4gICAgICBjYXNlIFN5bWJvbEtpbmQuVGVtcGxhdGU6XG4gICAgICBjYXNlIFN5bWJvbEtpbmQuRG9tQmluZGluZzpcbiAgICAgICAgLy8gVGhvdWdoIGl0IGlzIGdlbmVyYWxseSBtb3JlIGFwcHJvcHJpYXRlIGZvciB0aGUgYWJvdmUgc3ltYm9sIGRlZmluaXRpb25zIHRvIGJlXG4gICAgICAgIC8vIGFzc29jaWF0ZWQgd2l0aCBcInR5cGUgZGVmaW5pdGlvbnNcIiBzaW5jZSB0aGUgbG9jYXRpb24gaW4gdGhlIHRlbXBsYXRlIGlzIHRoZVxuICAgICAgICAvLyBhY3R1YWwgZGVmaW5pdGlvbiBsb2NhdGlvbiwgdGhlIGJldHRlciB1c2VyIGV4cGVyaWVuY2Ugd291bGQgYmUgdG8gYWxsb3dcbiAgICAgICAgLy8gTFMgdXNlcnMgdG8gXCJnbyB0byBkZWZpbml0aW9uXCIgb24gYW4gaXRlbSBpbiB0aGUgdGVtcGxhdGUgdGhhdCBtYXBzIHRvIGEgY2xhc3MgYW5kIGJlXG4gICAgICAgIC8vIHRha2VuIHRvIHRoZSBkaXJlY3RpdmUgb3IgSFRNTCBjbGFzcy5cbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0VHlwZURlZmluaXRpb25zRm9yVGVtcGxhdGVJbnN0YW5jZShzeW1ib2wsIG5vZGUpO1xuICAgICAgY2FzZSBTeW1ib2xLaW5kLk91dHB1dDpcbiAgICAgIGNhc2UgU3ltYm9sS2luZC5JbnB1dDoge1xuICAgICAgICBjb25zdCBiaW5kaW5nRGVmcyA9IHRoaXMuZ2V0RGVmaW5pdGlvbnNGb3JTeW1ib2xzKC4uLnN5bWJvbC5iaW5kaW5ncyk7XG4gICAgICAgIC8vIEFsc28gYXR0ZW1wdCB0byBnZXQgZGlyZWN0aXZlIG1hdGNoZXMgZm9yIHRoZSBpbnB1dCBuYW1lLiBJZiB0aGVyZSBpcyBhIGRpcmVjdGl2ZSB0aGF0XG4gICAgICAgIC8vIGhhcyB0aGUgaW5wdXQgbmFtZSBhcyBwYXJ0IG9mIHRoZSBzZWxlY3Rvciwgd2Ugd2FudCB0byByZXR1cm4gdGhhdCBhcyB3ZWxsLlxuICAgICAgICBjb25zdCBkaXJlY3RpdmVEZWZzID0gdGhpcy5nZXREaXJlY3RpdmVUeXBlRGVmc0ZvckJpbmRpbmdOb2RlKG5vZGUsIHBhdGgsIGNvbXBvbmVudCk7XG4gICAgICAgIHJldHVybiBbLi4uYmluZGluZ0RlZnMsIC4uLmRpcmVjdGl2ZURlZnNdO1xuICAgICAgfVxuICAgICAgY2FzZSBTeW1ib2xLaW5kLlZhcmlhYmxlOlxuICAgICAgY2FzZSBTeW1ib2xLaW5kLlJlZmVyZW5jZToge1xuICAgICAgICBjb25zdCBkZWZpbml0aW9uczogdHMuRGVmaW5pdGlvbkluZm9bXSA9IFtdO1xuICAgICAgICBpZiAoc3ltYm9sLmRlY2xhcmF0aW9uICE9PSBub2RlKSB7XG4gICAgICAgICAgZGVmaW5pdGlvbnMucHVzaCh7XG4gICAgICAgICAgICBuYW1lOiBzeW1ib2wuZGVjbGFyYXRpb24ubmFtZSxcbiAgICAgICAgICAgIGNvbnRhaW5lck5hbWU6ICcnLFxuICAgICAgICAgICAgY29udGFpbmVyS2luZDogdHMuU2NyaXB0RWxlbWVudEtpbmQudW5rbm93bixcbiAgICAgICAgICAgIGtpbmQ6IHRzLlNjcmlwdEVsZW1lbnRLaW5kLnZhcmlhYmxlRWxlbWVudCxcbiAgICAgICAgICAgIHRleHRTcGFuOiBnZXRUZXh0U3Bhbk9mTm9kZShzeW1ib2wuZGVjbGFyYXRpb24pLFxuICAgICAgICAgICAgY29udGV4dFNwYW46IHRvVGV4dFNwYW4oc3ltYm9sLmRlY2xhcmF0aW9uLnNvdXJjZVNwYW4pLFxuICAgICAgICAgICAgZmlsZU5hbWU6IHN5bWJvbC5kZWNsYXJhdGlvbi5zb3VyY2VTcGFuLnN0YXJ0LmZpbGUudXJsLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGlmIChzeW1ib2wua2luZCA9PT0gU3ltYm9sS2luZC5WYXJpYWJsZSkge1xuICAgICAgICAgIGRlZmluaXRpb25zLnB1c2goLi4udGhpcy5nZXREZWZpbml0aW9uc0ZvclN5bWJvbHMoc3ltYm9sKSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGRlZmluaXRpb25zO1xuICAgICAgfVxuICAgICAgY2FzZSBTeW1ib2xLaW5kLkV4cHJlc3Npb246IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0RGVmaW5pdGlvbnNGb3JTeW1ib2xzKHN5bWJvbCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBnZXREZWZpbml0aW9uc0ZvclN5bWJvbHMoLi4uc3ltYm9sczogSGFzU2hpbUxvY2F0aW9uW10pOiB0cy5EZWZpbml0aW9uSW5mb1tdIHtcbiAgICByZXR1cm4gZmxhdE1hcChzeW1ib2xzLCAoe3NoaW1Mb2NhdGlvbn0pID0+IHtcbiAgICAgIGNvbnN0IHtzaGltUGF0aCwgcG9zaXRpb25JblNoaW1GaWxlfSA9IHNoaW1Mb2NhdGlvbjtcbiAgICAgIHJldHVybiB0aGlzLnRzTFMuZ2V0RGVmaW5pdGlvbkF0UG9zaXRpb24oc2hpbVBhdGgsIHBvc2l0aW9uSW5TaGltRmlsZSkgPz8gW107XG4gICAgfSk7XG4gIH1cblxuICBnZXRUeXBlRGVmaW5pdGlvbnNBdFBvc2l0aW9uKGZpbGVOYW1lOiBzdHJpbmcsIHBvc2l0aW9uOiBudW1iZXIpOlxuICAgICAgcmVhZG9ubHkgdHMuRGVmaW5pdGlvbkluZm9bXXx1bmRlZmluZWQge1xuICAgIGNvbnN0IHRlbXBsYXRlSW5mbyA9IGdldFRlbXBsYXRlSW5mb0F0UG9zaXRpb24oZmlsZU5hbWUsIHBvc2l0aW9uLCB0aGlzLmNvbXBpbGVyKTtcbiAgICBpZiAodGVtcGxhdGVJbmZvID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgZGVmaW5pdGlvbk1ldGEgPSB0aGlzLmdldERlZmluaXRpb25NZXRhQXRQb3NpdGlvbih0ZW1wbGF0ZUluZm8sIHBvc2l0aW9uKTtcbiAgICBpZiAoZGVmaW5pdGlvbk1ldGEgPT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICBjb25zdCB7c3ltYm9sLCBub2RlfSA9IGRlZmluaXRpb25NZXRhO1xuICAgIHN3aXRjaCAoc3ltYm9sLmtpbmQpIHtcbiAgICAgIGNhc2UgU3ltYm9sS2luZC5EaXJlY3RpdmU6XG4gICAgICBjYXNlIFN5bWJvbEtpbmQuRG9tQmluZGluZzpcbiAgICAgIGNhc2UgU3ltYm9sS2luZC5FbGVtZW50OlxuICAgICAgY2FzZSBTeW1ib2xLaW5kLlRlbXBsYXRlOlxuICAgICAgICByZXR1cm4gdGhpcy5nZXRUeXBlRGVmaW5pdGlvbnNGb3JUZW1wbGF0ZUluc3RhbmNlKHN5bWJvbCwgbm9kZSk7XG4gICAgICBjYXNlIFN5bWJvbEtpbmQuT3V0cHV0OlxuICAgICAgY2FzZSBTeW1ib2xLaW5kLklucHV0OiB7XG4gICAgICAgIGNvbnN0IGJpbmRpbmdEZWZzID0gdGhpcy5nZXRUeXBlRGVmaW5pdGlvbnNGb3JTeW1ib2xzKC4uLnN5bWJvbC5iaW5kaW5ncyk7XG4gICAgICAgIC8vIEFsc28gYXR0ZW1wdCB0byBnZXQgZGlyZWN0aXZlIG1hdGNoZXMgZm9yIHRoZSBpbnB1dCBuYW1lLiBJZiB0aGVyZSBpcyBhIGRpcmVjdGl2ZSB0aGF0XG4gICAgICAgIC8vIGhhcyB0aGUgaW5wdXQgbmFtZSBhcyBwYXJ0IG9mIHRoZSBzZWxlY3Rvciwgd2Ugd2FudCB0byByZXR1cm4gdGhhdCBhcyB3ZWxsLlxuICAgICAgICBjb25zdCBkaXJlY3RpdmVEZWZzID0gdGhpcy5nZXREaXJlY3RpdmVUeXBlRGVmc0ZvckJpbmRpbmdOb2RlKFxuICAgICAgICAgICAgbm9kZSwgZGVmaW5pdGlvbk1ldGEucGF0aCwgdGVtcGxhdGVJbmZvLmNvbXBvbmVudCk7XG4gICAgICAgIHJldHVybiBbLi4uYmluZGluZ0RlZnMsIC4uLmRpcmVjdGl2ZURlZnNdO1xuICAgICAgfVxuICAgICAgY2FzZSBTeW1ib2xLaW5kLlJlZmVyZW5jZTpcbiAgICAgIGNhc2UgU3ltYm9sS2luZC5FeHByZXNzaW9uOlxuICAgICAgY2FzZSBTeW1ib2xLaW5kLlZhcmlhYmxlOlxuICAgICAgICByZXR1cm4gdGhpcy5nZXRUeXBlRGVmaW5pdGlvbnNGb3JTeW1ib2xzKHN5bWJvbCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBnZXRUeXBlRGVmaW5pdGlvbnNGb3JUZW1wbGF0ZUluc3RhbmNlKFxuICAgICAgc3ltYm9sOiBUZW1wbGF0ZVN5bWJvbHxFbGVtZW50U3ltYm9sfERvbUJpbmRpbmdTeW1ib2x8RGlyZWN0aXZlU3ltYm9sLFxuICAgICAgbm9kZTogQVNUfFRtcGxBc3ROb2RlKTogdHMuRGVmaW5pdGlvbkluZm9bXSB7XG4gICAgc3dpdGNoIChzeW1ib2wua2luZCkge1xuICAgICAgY2FzZSBTeW1ib2xLaW5kLlRlbXBsYXRlOiB7XG4gICAgICAgIGNvbnN0IG1hdGNoZXMgPSBnZXREaXJlY3RpdmVNYXRjaGVzRm9yRWxlbWVudFRhZyhzeW1ib2wudGVtcGxhdGVOb2RlLCBzeW1ib2wuZGlyZWN0aXZlcyk7XG4gICAgICAgIHJldHVybiB0aGlzLmdldFR5cGVEZWZpbml0aW9uc0ZvclN5bWJvbHMoLi4ubWF0Y2hlcyk7XG4gICAgICB9XG4gICAgICBjYXNlIFN5bWJvbEtpbmQuRWxlbWVudDoge1xuICAgICAgICBjb25zdCBtYXRjaGVzID0gZ2V0RGlyZWN0aXZlTWF0Y2hlc0ZvckVsZW1lbnRUYWcoc3ltYm9sLnRlbXBsYXRlTm9kZSwgc3ltYm9sLmRpcmVjdGl2ZXMpO1xuICAgICAgICAvLyBJZiBvbmUgb2YgdGhlIGRpcmVjdGl2ZSBtYXRjaGVzIGlzIGEgY29tcG9uZW50LCB3ZSBzaG91bGQgbm90IGluY2x1ZGUgdGhlIG5hdGl2ZSBlbGVtZW50XG4gICAgICAgIC8vIGluIHRoZSByZXN1bHRzIGJlY2F1c2UgaXQgaXMgcmVwbGFjZWQgYnkgdGhlIGNvbXBvbmVudC5cbiAgICAgICAgcmV0dXJuIEFycmF5LmZyb20obWF0Y2hlcykuc29tZShkaXIgPT4gZGlyLmlzQ29tcG9uZW50KSA/XG4gICAgICAgICAgICB0aGlzLmdldFR5cGVEZWZpbml0aW9uc0ZvclN5bWJvbHMoLi4ubWF0Y2hlcykgOlxuICAgICAgICAgICAgdGhpcy5nZXRUeXBlRGVmaW5pdGlvbnNGb3JTeW1ib2xzKC4uLm1hdGNoZXMsIHN5bWJvbCk7XG4gICAgICB9XG4gICAgICBjYXNlIFN5bWJvbEtpbmQuRG9tQmluZGluZzoge1xuICAgICAgICBpZiAoIShub2RlIGluc3RhbmNlb2YgVG1wbEFzdFRleHRBdHRyaWJ1dGUpKSB7XG4gICAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGRpcnMgPSBnZXREaXJlY3RpdmVNYXRjaGVzRm9yQXR0cmlidXRlKFxuICAgICAgICAgICAgbm9kZS5uYW1lLCBzeW1ib2wuaG9zdC50ZW1wbGF0ZU5vZGUsIHN5bWJvbC5ob3N0LmRpcmVjdGl2ZXMpO1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRUeXBlRGVmaW5pdGlvbnNGb3JTeW1ib2xzKC4uLmRpcnMpO1xuICAgICAgfVxuICAgICAgY2FzZSBTeW1ib2xLaW5kLkRpcmVjdGl2ZTpcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0VHlwZURlZmluaXRpb25zRm9yU3ltYm9scyhzeW1ib2wpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgZ2V0RGlyZWN0aXZlVHlwZURlZnNGb3JCaW5kaW5nTm9kZShcbiAgICAgIG5vZGU6IFRtcGxBc3ROb2RlfEFTVCwgcGF0aFRvTm9kZTogQXJyYXk8VG1wbEFzdE5vZGV8QVNUPiwgY29tcG9uZW50OiB0cy5DbGFzc0RlY2xhcmF0aW9uKSB7XG4gICAgaWYgKCEobm9kZSBpbnN0YW5jZW9mIFRtcGxBc3RCb3VuZEF0dHJpYnV0ZSkgJiYgIShub2RlIGluc3RhbmNlb2YgVG1wbEFzdFRleHRBdHRyaWJ1dGUpICYmXG4gICAgICAgICEobm9kZSBpbnN0YW5jZW9mIFRtcGxBc3RCb3VuZEV2ZW50KSkge1xuICAgICAgcmV0dXJuIFtdO1xuICAgIH1cbiAgICBjb25zdCBwYXJlbnQgPSBwYXRoVG9Ob2RlW3BhdGhUb05vZGUubGVuZ3RoIC0gMl07XG4gICAgaWYgKCEocGFyZW50IGluc3RhbmNlb2YgVG1wbEFzdFRlbXBsYXRlIHx8IHBhcmVudCBpbnN0YW5jZW9mIFRtcGxBc3RFbGVtZW50KSkge1xuICAgICAgcmV0dXJuIFtdO1xuICAgIH1cbiAgICBjb25zdCB0ZW1wbGF0ZU9yRWxlbWVudFN5bWJvbCA9XG4gICAgICAgIHRoaXMuY29tcGlsZXIuZ2V0VGVtcGxhdGVUeXBlQ2hlY2tlcigpLmdldFN5bWJvbE9mTm9kZShwYXJlbnQsIGNvbXBvbmVudCk7XG4gICAgaWYgKHRlbXBsYXRlT3JFbGVtZW50U3ltYm9sID09PSBudWxsIHx8XG4gICAgICAgICh0ZW1wbGF0ZU9yRWxlbWVudFN5bWJvbC5raW5kICE9PSBTeW1ib2xLaW5kLlRlbXBsYXRlICYmXG4gICAgICAgICB0ZW1wbGF0ZU9yRWxlbWVudFN5bWJvbC5raW5kICE9PSBTeW1ib2xLaW5kLkVsZW1lbnQpKSB7XG4gICAgICByZXR1cm4gW107XG4gICAgfVxuICAgIGNvbnN0IGRpcnMgPVxuICAgICAgICBnZXREaXJlY3RpdmVNYXRjaGVzRm9yQXR0cmlidXRlKG5vZGUubmFtZSwgcGFyZW50LCB0ZW1wbGF0ZU9yRWxlbWVudFN5bWJvbC5kaXJlY3RpdmVzKTtcbiAgICByZXR1cm4gdGhpcy5nZXRUeXBlRGVmaW5pdGlvbnNGb3JTeW1ib2xzKC4uLmRpcnMpO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRUeXBlRGVmaW5pdGlvbnNGb3JTeW1ib2xzKC4uLnN5bWJvbHM6IEhhc1NoaW1Mb2NhdGlvbltdKTogdHMuRGVmaW5pdGlvbkluZm9bXSB7XG4gICAgcmV0dXJuIGZsYXRNYXAoc3ltYm9scywgKHtzaGltTG9jYXRpb259KSA9PiB7XG4gICAgICBjb25zdCB7c2hpbVBhdGgsIHBvc2l0aW9uSW5TaGltRmlsZX0gPSBzaGltTG9jYXRpb247XG4gICAgICByZXR1cm4gdGhpcy50c0xTLmdldFR5cGVEZWZpbml0aW9uQXRQb3NpdGlvbihzaGltUGF0aCwgcG9zaXRpb25JblNoaW1GaWxlKSA/PyBbXTtcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0RGVmaW5pdGlvbk1ldGFBdFBvc2l0aW9uKHt0ZW1wbGF0ZSwgY29tcG9uZW50fTogVGVtcGxhdGVJbmZvLCBwb3NpdGlvbjogbnVtYmVyKTpcbiAgICAgIERlZmluaXRpb25NZXRhfHVuZGVmaW5lZCB7XG4gICAgY29uc3QgcGF0aCA9IGdldFBhdGhUb05vZGVBdFBvc2l0aW9uKHRlbXBsYXRlLCBwb3NpdGlvbik7XG4gICAgaWYgKHBhdGggPT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IG5vZGUgPSBwYXRoW3BhdGgubGVuZ3RoIC0gMV07XG4gICAgY29uc3Qgc3ltYm9sID0gdGhpcy5jb21waWxlci5nZXRUZW1wbGF0ZVR5cGVDaGVja2VyKCkuZ2V0U3ltYm9sT2ZOb2RlKG5vZGUsIGNvbXBvbmVudCk7XG4gICAgaWYgKHN5bWJvbCA9PT0gbnVsbCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICByZXR1cm4ge25vZGUsIHBhdGgsIHN5bWJvbH07XG4gIH1cbn1cbiJdfQ== |
\ | No newline at end of file |