@angular/language-service 11.1.1 → 11.1.2
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/api.d.ts +39 -0
- package/api.js +20 -0
- package/bundles/ivy.js +86 -159
- package/bundles/language-service.js +39 -41
- package/index.d.ts +2 -1
- package/index.js +7 -3
- package/ivy/adapters.d.ts +7 -2
- package/ivy/adapters.js +27 -7
- package/ivy/compiler_factory.d.ts +0 -9
- package/ivy/compiler_factory.js +18 -54
- package/ivy/completions.js +7 -7
- package/ivy/language_service.js +7 -7
- package/ivy/ts_plugin.d.ts +2 -1
- package/ivy/ts_plugin.js +6 -2
- package/package.json +1 -1
- package/src/language_service.js +1 -1
- package/src/ts_plugin.d.ts +2 -1
- package/src/ts_plugin.js +7 -2
- package/src/typescript_host.d.ts +1 -5
- package/src/typescript_host.js +3 -13
- package/language-service.d.ts +0 -17
- package/language-service.js +0 -34
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* @license Angular v11.1.
|
|
2
|
+
* @license Angular v11.1.2
|
|
3
3
|
* Copyright Google LLC All Rights Reserved.
|
|
4
4
|
* License: MIT
|
|
5
5
|
*/
|
|
@@ -9881,7 +9881,7 @@ define(['exports', 'typescript/lib/tsserverlibrary', 'typescript', 'path'], func
|
|
|
9881
9881
|
this._advance();
|
|
9882
9882
|
selfClosing = false;
|
|
9883
9883
|
}
|
|
9884
|
-
const end = this._peek.sourceSpan.
|
|
9884
|
+
const end = this._peek.sourceSpan.fullStart;
|
|
9885
9885
|
const span = new ParseSourceSpan(startTagToken.sourceSpan.start, end, startTagToken.sourceSpan.fullStart);
|
|
9886
9886
|
// Create a separate `startSpan` because `span` will be modified when there is an `end` span.
|
|
9887
9887
|
const startSpan = new ParseSourceSpan(startTagToken.sourceSpan.start, end, startTagToken.sourceSpan.fullStart);
|
|
@@ -11015,8 +11015,9 @@ define(['exports', 'typescript/lib/tsserverlibrary', 'typescript', 'path'], func
|
|
|
11015
11015
|
}
|
|
11016
11016
|
parseInterpolation(value, sourceSpan) {
|
|
11017
11017
|
const sourceInfo = sourceSpan.start.toString();
|
|
11018
|
+
const absoluteOffset = sourceSpan.fullStart.offset;
|
|
11018
11019
|
try {
|
|
11019
|
-
const ast = this._exprParser.parseInterpolation(value, sourceInfo,
|
|
11020
|
+
const ast = this._exprParser.parseInterpolation(value, sourceInfo, absoluteOffset, this._interpolationConfig);
|
|
11020
11021
|
if (ast)
|
|
11021
11022
|
this._reportExpressionParserErrors(ast.errors, sourceSpan);
|
|
11022
11023
|
this._checkPipes(ast, sourceSpan);
|
|
@@ -11024,7 +11025,7 @@ define(['exports', 'typescript/lib/tsserverlibrary', 'typescript', 'path'], func
|
|
|
11024
11025
|
}
|
|
11025
11026
|
catch (e) {
|
|
11026
11027
|
this._reportError(`${e}`, sourceSpan);
|
|
11027
|
-
return this._exprParser.wrapLiteralPrimitive('ERROR', sourceInfo,
|
|
11028
|
+
return this._exprParser.wrapLiteralPrimitive('ERROR', sourceInfo, absoluteOffset);
|
|
11028
11029
|
}
|
|
11029
11030
|
}
|
|
11030
11031
|
/**
|
|
@@ -11034,8 +11035,9 @@ define(['exports', 'typescript/lib/tsserverlibrary', 'typescript', 'path'], func
|
|
|
11034
11035
|
*/
|
|
11035
11036
|
parseInterpolationExpression(expression, sourceSpan) {
|
|
11036
11037
|
const sourceInfo = sourceSpan.start.toString();
|
|
11038
|
+
const absoluteOffset = sourceSpan.start.offset;
|
|
11037
11039
|
try {
|
|
11038
|
-
const ast = this._exprParser.parseInterpolationExpression(expression, sourceInfo,
|
|
11040
|
+
const ast = this._exprParser.parseInterpolationExpression(expression, sourceInfo, absoluteOffset);
|
|
11039
11041
|
if (ast)
|
|
11040
11042
|
this._reportExpressionParserErrors(ast.errors, sourceSpan);
|
|
11041
11043
|
this._checkPipes(ast, sourceSpan);
|
|
@@ -11043,7 +11045,7 @@ define(['exports', 'typescript/lib/tsserverlibrary', 'typescript', 'path'], func
|
|
|
11043
11045
|
}
|
|
11044
11046
|
catch (e) {
|
|
11045
11047
|
this._reportError(`${e}`, sourceSpan);
|
|
11046
|
-
return this._exprParser.wrapLiteralPrimitive('ERROR', sourceInfo,
|
|
11048
|
+
return this._exprParser.wrapLiteralPrimitive('ERROR', sourceInfo, absoluteOffset);
|
|
11047
11049
|
}
|
|
11048
11050
|
}
|
|
11049
11051
|
/**
|
|
@@ -13364,13 +13366,10 @@ define(['exports', 'typescript/lib/tsserverlibrary', 'typescript', 'path'], func
|
|
|
13364
13366
|
}
|
|
13365
13367
|
const fullEnd = exprEnd + interpEnd.length;
|
|
13366
13368
|
const text = input.substring(exprStart, exprEnd);
|
|
13367
|
-
if (text.trim().length
|
|
13368
|
-
expressions.push({ text, start: fullStart, end: fullEnd });
|
|
13369
|
-
}
|
|
13370
|
-
else {
|
|
13369
|
+
if (text.trim().length === 0) {
|
|
13371
13370
|
this._reportError('Blank expressions are not allowed in interpolated strings', input, `at column ${i} in`, location);
|
|
13372
|
-
expressions.push({ text: '$implicit', start: fullStart, end: fullEnd });
|
|
13373
13371
|
}
|
|
13372
|
+
expressions.push({ text, start: fullStart, end: fullEnd });
|
|
13374
13373
|
offsets.push(exprStart);
|
|
13375
13374
|
i = fullEnd;
|
|
13376
13375
|
atInterpolation = false;
|
|
@@ -13665,8 +13664,12 @@ define(['exports', 'typescript/lib/tsserverlibrary', 'typescript', 'path'], func
|
|
|
13665
13664
|
this.error(`Unexpected token '${this.next}'`);
|
|
13666
13665
|
}
|
|
13667
13666
|
}
|
|
13668
|
-
if (exprs.length == 0)
|
|
13669
|
-
|
|
13667
|
+
if (exprs.length == 0) {
|
|
13668
|
+
// We have no expressions so create an empty expression that spans the entire input length
|
|
13669
|
+
const artificialStart = this.offset;
|
|
13670
|
+
const artificialEnd = this.offset + this.inputLength;
|
|
13671
|
+
return new EmptyExpr(this.span(artificialStart, artificialEnd), this.sourceSpan(artificialStart, artificialEnd));
|
|
13672
|
+
}
|
|
13670
13673
|
if (exprs.length == 1)
|
|
13671
13674
|
return exprs[0];
|
|
13672
13675
|
return new Chain(this.span(start), this.sourceSpan(start), exprs);
|
|
@@ -19018,7 +19021,7 @@ define(['exports', 'typescript/lib/tsserverlibrary', 'typescript', 'path'], func
|
|
|
19018
19021
|
* Use of this source code is governed by an MIT-style license that can be
|
|
19019
19022
|
* found in the LICENSE file at https://angular.io/license
|
|
19020
19023
|
*/
|
|
19021
|
-
const VERSION$1 = new Version('11.1.
|
|
19024
|
+
const VERSION$1 = new Version('11.1.2');
|
|
19022
19025
|
|
|
19023
19026
|
/**
|
|
19024
19027
|
* @license
|
|
@@ -27661,6 +27664,7 @@ define(['exports', 'typescript/lib/tsserverlibrary', 'typescript', 'path'], func
|
|
|
27661
27664
|
"201" /* PROVIDER_NOT_FOUND */,
|
|
27662
27665
|
"300" /* MULTIPLE_COMPONENTS_MATCH */,
|
|
27663
27666
|
"301" /* EXPORT_NOT_FOUND */,
|
|
27667
|
+
"302" /* PIPE_NOT_FOUND */,
|
|
27664
27668
|
]);
|
|
27665
27669
|
/* tslint:enable:no-toplevel-property-access */
|
|
27666
27670
|
/** Called to format a runtime error */
|
|
@@ -35025,7 +35029,7 @@ define(['exports', 'typescript/lib/tsserverlibrary', 'typescript', 'path'], func
|
|
|
35025
35029
|
/**
|
|
35026
35030
|
* @publicApi
|
|
35027
35031
|
*/
|
|
35028
|
-
const VERSION$2 = new Version$1('11.1.
|
|
35032
|
+
const VERSION$2 = new Version$1('11.1.2');
|
|
35029
35033
|
|
|
35030
35034
|
/**
|
|
35031
35035
|
* @license
|
|
@@ -38297,36 +38301,36 @@ define(['exports', 'typescript/lib/tsserverlibrary', 'typescript', 'path'], func
|
|
|
38297
38301
|
emit(value) {
|
|
38298
38302
|
super.next(value);
|
|
38299
38303
|
}
|
|
38300
|
-
subscribe(
|
|
38304
|
+
subscribe(observerOrNext, error, complete) {
|
|
38301
38305
|
let schedulerFn;
|
|
38302
38306
|
let errorFn = (err) => null;
|
|
38303
38307
|
let completeFn = () => null;
|
|
38304
|
-
if (
|
|
38308
|
+
if (observerOrNext && typeof observerOrNext === 'object') {
|
|
38305
38309
|
schedulerFn = this.__isAsync ? (value) => {
|
|
38306
|
-
setTimeout(() =>
|
|
38310
|
+
setTimeout(() => observerOrNext.next(value));
|
|
38307
38311
|
} : (value) => {
|
|
38308
|
-
|
|
38312
|
+
observerOrNext.next(value);
|
|
38309
38313
|
};
|
|
38310
|
-
if (
|
|
38314
|
+
if (observerOrNext.error) {
|
|
38311
38315
|
errorFn = this.__isAsync ? (err) => {
|
|
38312
|
-
setTimeout(() =>
|
|
38316
|
+
setTimeout(() => observerOrNext.error(err));
|
|
38313
38317
|
} : (err) => {
|
|
38314
|
-
|
|
38318
|
+
observerOrNext.error(err);
|
|
38315
38319
|
};
|
|
38316
38320
|
}
|
|
38317
|
-
if (
|
|
38321
|
+
if (observerOrNext.complete) {
|
|
38318
38322
|
completeFn = this.__isAsync ? () => {
|
|
38319
|
-
setTimeout(() =>
|
|
38323
|
+
setTimeout(() => observerOrNext.complete());
|
|
38320
38324
|
} : () => {
|
|
38321
|
-
|
|
38325
|
+
observerOrNext.complete();
|
|
38322
38326
|
};
|
|
38323
38327
|
}
|
|
38324
38328
|
}
|
|
38325
38329
|
else {
|
|
38326
38330
|
schedulerFn = this.__isAsync ? (value) => {
|
|
38327
|
-
setTimeout(() =>
|
|
38331
|
+
setTimeout(() => observerOrNext(value));
|
|
38328
38332
|
} : (value) => {
|
|
38329
|
-
|
|
38333
|
+
observerOrNext(value);
|
|
38330
38334
|
};
|
|
38331
38335
|
if (error) {
|
|
38332
38336
|
errorFn = this.__isAsync ? (err) => {
|
|
@@ -38344,8 +38348,8 @@ define(['exports', 'typescript/lib/tsserverlibrary', 'typescript', 'path'], func
|
|
|
38344
38348
|
}
|
|
38345
38349
|
}
|
|
38346
38350
|
const sink = super.subscribe(schedulerFn, errorFn, completeFn);
|
|
38347
|
-
if (
|
|
38348
|
-
|
|
38351
|
+
if (observerOrNext instanceof Subscription) {
|
|
38352
|
+
observerOrNext.add(sink);
|
|
38349
38353
|
}
|
|
38350
38354
|
return sink;
|
|
38351
38355
|
}
|
|
@@ -42145,14 +42149,6 @@ define(['exports', 'typescript/lib/tsserverlibrary', 'typescript', 'path'], func
|
|
|
42145
42149
|
* Use of this source code is governed by an MIT-style license that can be
|
|
42146
42150
|
* found in the LICENSE file at https://angular.io/license
|
|
42147
42151
|
*/
|
|
42148
|
-
/**
|
|
42149
|
-
* Create a `LanguageServiceHost`
|
|
42150
|
-
*/
|
|
42151
|
-
function createLanguageServiceFromTypescript(host, service) {
|
|
42152
|
-
const ngHost = new TypeScriptServiceHost(host, service);
|
|
42153
|
-
const ngServer = createLanguageService(ngHost);
|
|
42154
|
-
return ngServer;
|
|
42155
|
-
}
|
|
42156
42152
|
/**
|
|
42157
42153
|
* The language service never needs the normalized versions of the metadata. To avoid parsing
|
|
42158
42154
|
* the content and resolving references, return an empty file. This also allows normalizing
|
|
@@ -42833,6 +42829,10 @@ define(['exports', 'typescript/lib/tsserverlibrary', 'typescript', 'path'], func
|
|
|
42833
42829
|
// not implemented in VE Language Service
|
|
42834
42830
|
return undefined;
|
|
42835
42831
|
}
|
|
42832
|
+
function getTcb(fileName, position) {
|
|
42833
|
+
// Not implemented in VE Language Service
|
|
42834
|
+
return undefined;
|
|
42835
|
+
}
|
|
42836
42836
|
return Object.assign(Object.assign({}, tsLS), {
|
|
42837
42837
|
// Then override the methods supported by Angular language service
|
|
42838
42838
|
getCompletionsAtPosition,
|
|
@@ -42842,13 +42842,11 @@ define(['exports', 'typescript/lib/tsserverlibrary', 'typescript', 'path'], func
|
|
|
42842
42842
|
getDefinitionAndBoundSpan,
|
|
42843
42843
|
getTypeDefinitionAtPosition,
|
|
42844
42844
|
getReferencesAtPosition,
|
|
42845
|
-
findRenameLocations
|
|
42845
|
+
findRenameLocations,
|
|
42846
|
+
getTcb });
|
|
42846
42847
|
}
|
|
42847
42848
|
|
|
42848
|
-
exports.TypeScriptServiceHost = TypeScriptServiceHost;
|
|
42849
42849
|
exports.create = create;
|
|
42850
|
-
exports.createLanguageService = createLanguageService;
|
|
42851
|
-
exports.createLanguageServiceFromTypescript = createLanguageServiceFromTypescript;
|
|
42852
42850
|
exports.getExternalFiles = getExternalFiles;
|
|
42853
42851
|
|
|
42854
42852
|
Object.defineProperty(exports, '__esModule', { value: true });
|
package/index.d.ts
CHANGED
package/index.js
CHANGED
|
@@ -11,12 +11,16 @@
|
|
|
11
11
|
if (v !== undefined) module.exports = v;
|
|
12
12
|
}
|
|
13
13
|
else if (typeof define === "function" && define.amd) {
|
|
14
|
-
define("@angular/language-service", ["require", "exports", "tslib", "@angular/language-service/language-service"], factory);
|
|
14
|
+
define("@angular/language-service", ["require", "exports", "tslib", "@angular/language-service/api", "@angular/language-service/src/ts_plugin"], factory);
|
|
15
15
|
}
|
|
16
16
|
})(function (require, exports) {
|
|
17
17
|
"use strict";
|
|
18
18
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
19
|
+
exports.getExternalFiles = exports.create = void 0;
|
|
19
20
|
var tslib_1 = require("tslib");
|
|
20
|
-
tslib_1.__exportStar(require("@angular/language-service/
|
|
21
|
+
tslib_1.__exportStar(require("@angular/language-service/api"), exports);
|
|
22
|
+
var ts_plugin_1 = require("@angular/language-service/src/ts_plugin");
|
|
23
|
+
Object.defineProperty(exports, "create", { enumerable: true, get: function () { return ts_plugin_1.create; } });
|
|
24
|
+
Object.defineProperty(exports, "getExternalFiles", { enumerable: true, get: function () { return ts_plugin_1.getExternalFiles; } });
|
|
21
25
|
});
|
|
22
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
26
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9sYW5ndWFnZS1zZXJ2aWNlL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7R0FNRzs7Ozs7Ozs7Ozs7Ozs7SUFFSCx3RUFBc0I7SUFDdEIscUVBQXlEO0lBQWpELG1HQUFBLE1BQU0sT0FBQTtJQUFFLDZHQUFBLGdCQUFnQixPQUFBIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IEdvb2dsZSBMTEMgQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqXG4gKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZVxuICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZVxuICovXG5cbmV4cG9ydCAqIGZyb20gJy4vYXBpJztcbmV4cG9ydCB7Y3JlYXRlLCBnZXRFeHRlcm5hbEZpbGVzfSBmcm9tICcuL3NyYy90c19wbHVnaW4nO1xuIl19
|
package/ivy/adapters.d.ts
CHANGED
|
@@ -19,7 +19,12 @@ export declare class LanguageServiceAdapter implements NgCompilerAdapter {
|
|
|
19
19
|
readonly factoryTracker: null;
|
|
20
20
|
readonly unifiedModulesHost: null;
|
|
21
21
|
readonly rootDirs: AbsoluteFsPath[];
|
|
22
|
-
|
|
22
|
+
/**
|
|
23
|
+
* Map of resource filenames to the version of the file last read via `readResource`.
|
|
24
|
+
*
|
|
25
|
+
* Used to implement `getModifiedResourceFiles`.
|
|
26
|
+
*/
|
|
27
|
+
private readonly lastReadResourceVersion;
|
|
23
28
|
constructor(project: ts.server.Project);
|
|
24
29
|
isShim(sf: ts.SourceFile): boolean;
|
|
25
30
|
fileExists(fileName: string): boolean;
|
|
@@ -38,7 +43,7 @@ export declare class LanguageServiceAdapter implements NgCompilerAdapter {
|
|
|
38
43
|
* packages/compiler-cli/src/ngtsc/core/api/src/interfaces.ts
|
|
39
44
|
*/
|
|
40
45
|
readResource(fileName: string): string;
|
|
41
|
-
|
|
46
|
+
getModifiedResourceFiles(): Set<string> | undefined;
|
|
42
47
|
}
|
|
43
48
|
/**
|
|
44
49
|
* Used to read configuration files.
|
package/ivy/adapters.js
CHANGED
|
@@ -30,7 +30,12 @@
|
|
|
30
30
|
this.ignoreForEmit = new Set();
|
|
31
31
|
this.factoryTracker = null; // no .ngfactory shims
|
|
32
32
|
this.unifiedModulesHost = null; // only used in Bazel
|
|
33
|
-
|
|
33
|
+
/**
|
|
34
|
+
* Map of resource filenames to the version of the file last read via `readResource`.
|
|
35
|
+
*
|
|
36
|
+
* Used to implement `getModifiedResourceFiles`.
|
|
37
|
+
*/
|
|
38
|
+
this.lastReadResourceVersion = new Map();
|
|
34
39
|
this.rootDirs = typescript_1.getRootDirs(this, project.getCompilationSettings());
|
|
35
40
|
}
|
|
36
41
|
LanguageServiceAdapter.prototype.isShim = function (sf) {
|
|
@@ -78,13 +83,28 @@
|
|
|
78
83
|
throw new Error("Failed to get script snapshot while trying to read " + fileName);
|
|
79
84
|
}
|
|
80
85
|
var version = this.project.getScriptVersion(fileName);
|
|
81
|
-
this.
|
|
86
|
+
this.lastReadResourceVersion.set(fileName, version);
|
|
82
87
|
return snapshot.getText(0, snapshot.getLength());
|
|
83
88
|
};
|
|
84
|
-
LanguageServiceAdapter.prototype.
|
|
85
|
-
var
|
|
86
|
-
var
|
|
87
|
-
|
|
89
|
+
LanguageServiceAdapter.prototype.getModifiedResourceFiles = function () {
|
|
90
|
+
var e_1, _a;
|
|
91
|
+
var modifiedFiles = new Set();
|
|
92
|
+
try {
|
|
93
|
+
for (var _b = tslib_1.__values(this.lastReadResourceVersion), _c = _b.next(); !_c.done; _c = _b.next()) {
|
|
94
|
+
var _d = tslib_1.__read(_c.value, 2), fileName = _d[0], oldVersion = _d[1];
|
|
95
|
+
if (this.project.getScriptVersion(fileName) !== oldVersion) {
|
|
96
|
+
modifiedFiles.add(fileName);
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
catch (e_1_1) { e_1 = { error: e_1_1 }; }
|
|
101
|
+
finally {
|
|
102
|
+
try {
|
|
103
|
+
if (_c && !_c.done && (_a = _b.return)) _a.call(_b);
|
|
104
|
+
}
|
|
105
|
+
finally { if (e_1) throw e_1.error; }
|
|
106
|
+
}
|
|
107
|
+
return modifiedFiles.size > 0 ? modifiedFiles : undefined;
|
|
88
108
|
};
|
|
89
109
|
return LanguageServiceAdapter;
|
|
90
110
|
}());
|
|
@@ -151,4 +171,4 @@
|
|
|
151
171
|
}());
|
|
152
172
|
exports.LSParseConfigHost = LSParseConfigHost;
|
|
153
173
|
});
|
|
154
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWRhcHRlcnMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9sYW5ndWFnZS1zZXJ2aWNlL2l2eS9hZGFwdGVycy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7O0dBTUc7Ozs7Ozs7Ozs7Ozs7O0lBT0gsK0RBQTZEO0lBQzdELGtGQUFnRjtJQUNoRix3QkFBMEI7SUFHMUIsNkRBQXlDO0lBRXpDO1FBU0UsZ0NBQTZCLE9BQTBCO1lBQTFCLFlBQU8sR0FBUCxPQUFPLENBQW1CO1lBUjlDLGVBQVUsR0FBRyxJQUFJLENBQUM7WUFDbEIsNEJBQXVCLEdBQW9CLEVBQUUsQ0FBQztZQUM5QyxrQkFBYSxHQUF1QixJQUFJLEdBQUcsRUFBRSxDQUFDO1lBQzlDLG1CQUFjLEdBQUcsSUFBSSxDQUFDLENBQU0sc0JBQXNCO1lBQ2xELHVCQUFrQixHQUFHLElBQUksQ0FBQyxDQUFFLHFCQUFxQjtZQUV6QyxvQkFBZSxHQUFHLElBQUksR0FBRyxFQUFrQixDQUFDO1lBRzNELElBQUksQ0FBQyxRQUFRLEdBQUcsd0JBQVcsQ0FBQyxJQUFJLEVBQUUsT0FBTyxDQUFDLHNCQUFzQixFQUFFLENBQUMsQ0FBQztRQUN0RSxDQUFDO1FBRUQsdUNBQU0sR0FBTixVQUFPLEVBQWlCO1lBQ3RCLE9BQU8sY0FBTSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQ3BCLENBQUM7UUFFRCwyQ0FBVSxHQUFWLFVBQVcsUUFBZ0I7WUFDekIsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUMzQyxDQUFDO1FBRUQseUNBQVEsR0FBUixVQUFTLFFBQWdCO1lBQ3ZCLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDekMsQ0FBQztRQUVELG9EQUFtQixHQUFuQjtZQUNFLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxtQkFBbUIsRUFBRSxD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QztRQUNKLENBQUM7UUFDRCwrQkFBRyxHQUFIO1lBQ0UsT0FBTyxJQUFJLENBQUMsVUFBVSxDQUFDLG1CQUFtQixFQUFvQixDQUFDO1FBQ2pFLENBQUM7UUFDRCxtQ0FBTyxHQUFQLFVBQVEsSUFBZ0M7WUFDdEMsT0FBTyxDQUFDLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3pCLENBQUM7UUFDRCxtQ0FBTyxHQUFQO1lBQVEsZUFBa0I7aUJBQWxCLFVBQWtCLEVBQWxCLHFCQUFrQixFQUFsQixJQUFrQjtnQkFBbEIsMEJBQWtCOztZQUN4QixPQUFPLENBQUMsQ0FBQyxPQUFPLE9BQVQsQ0FBQyxtQkFBWSxLQUFLLEVBQW1CLENBQUM7UUFDL0MsQ0FBQztRQUNELG1DQUFPLEdBQVAsVUFBOEIsSUFBTztZQUNuQyxPQUFPLENBQUMsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFNLENBQUM7UUFDOUIsQ0FBQztRQUNELGdDQUFJLEdBQUosVUFBMkIsUUFBVztZQUFFLGVBQWtCO2lCQUFsQixVQUFrQixFQUFsQixxQkFBa0IsRUFBbEIsSUFBa0I7Z0JBQWxCLDhCQUFrQjs7WUFDeEQsT0FBTyxDQUFDLENBQUMsSUFBSSxPQUFOLENBQUMsb0JBQU0sUUFBUSxHQUFLLEtBQUssRUFBTSxDQUFDO1FBQ3pDLENBQUM7UUFDSCx3QkFBQztJQUFELENBQUMsQUF4Q0QsSUF3Q0M7SUF4Q1ksOENBQWlCIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IEdvb2dsZSBMTEMgQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqXG4gKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZVxuICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZVxuICovXG5cbi8qKiBAZmlsZW92ZXJ2aWV3IHByb3ZpZGVzIGFkYXB0ZXJzIGZvciBjb21tdW5pY2F0aW5nIHdpdGggdGhlIG5nIGNvbXBpbGVyICovXG5cbmltcG9ydCB7Q29uZmlndXJhdGlvbkhvc3R9IGZyb20gJ0Bhbmd1bGFyL2NvbXBpbGVyLWNsaSc7XG5pbXBvcnQge05nQ29tcGlsZXJBZGFwdGVyfSBmcm9tICdAYW5ndWxhci9jb21waWxlci1jbGkvc3JjL25ndHNjL2NvcmUvYXBpJztcbmltcG9ydCB7QWJzb2x1dGVGc1BhdGgsIEZpbGVTdGF0cywgUGF0aFNlZ21lbnQsIFBhdGhTdHJpbmd9IGZyb20gJ0Bhbmd1bGFyL2NvbXBpbGVyLWNsaS9zcmMvbmd0c2MvZmlsZV9zeXN0ZW0nO1xuaW1wb3J0IHtpc1NoaW19IGZyb20gJ0Bhbmd1bGFyL2NvbXBpbGVyLWNsaS9zcmMvbmd0c2Mvc2hpbXMnO1xuaW1wb3J0IHtnZXRSb290RGlyc30gZnJvbSAnQGFuZ3VsYXIvY29tcGlsZXItY2xpL3NyYy9uZ3RzYy91dGlsL3NyYy90eXBlc2NyaXB0JztcbmltcG9ydCAqIGFzIHAgZnJvbSAncGF0aCc7XG5pbXBvcnQgKiBhcyB0cyBmcm9tICd0eXBlc2NyaXB0L2xpYi90c3NlcnZlcmxpYnJhcnknO1xuXG5pbXBvcnQge2lzVHlwZVNjcmlwdEZpbGV9IGZyb20gJy4vdXRpbHMnO1xuXG5leHBvcnQgY2xhc3MgTGFuZ3VhZ2VTZXJ2aWNlQWRhcHRlciBpbXBsZW1lbnRzIE5nQ29tcGlsZXJBZGFwdGVyIHtcbiAgcmVhZG9ubHkgZW50cnlQb2ludCA9IG51bGw7XG4gIHJlYWRvbmx5IGNvbnN0cnVjdGlvbkRpYWdub3N0aWNzOiB0cy5EaWFnbm9zdGljW10gPSBbXTtcbiAgcmVhZG9ubHkgaWdub3JlRm9yRW1pdDogU2V0PHRzLlNvdXJjZUZpbGU+ID0gbmV3IFNldCgpO1xuICByZWFkb25seSBmYWN0b3J5VHJhY2tlciA9IG51bGw7ICAgICAgLy8gbm8gLm5nZmFjdG9yeSBzaGltc1xuICByZWFkb25seSB1bmlmaWVkTW9kdWxlc0hvc3QgPSBudWxsOyAgLy8gb25seSB1c2VkIGluIEJhemVsXG4gIHJlYWRvbmx5IHJvb3REaXJzOiBBYnNvbHV0ZUZzUGF0aFtdO1xuICBwcml2YXRlIHJlYWRvbmx5IHRlbXBsYXRlVmVyc2lvbiA9IG5ldyBNYXA8c3RyaW5nLCBzdHJpbmc+KCk7XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSByZWFkb25seSBwcm9qZWN0OiB0cy5zZXJ2ZXIuUHJvamVjdCkge1xuICAgIHRoaXMucm9vdERpcnMgPSBnZXRSb290RGlycyh0aGlzLCBwcm9qZWN0LmdldENvbXBpbGF0aW9uU2V0dGluZ3MoKSk7XG4gIH1cblxuICBpc1NoaW0oc2Y6IHRzLlNvdXJjZUZpbGUpOiBib29sZWFuIHtcbiAgICByZXR1cm4gaXNTaGltKHNmKTtcbiAgfVxuXG4gIGZpbGVFeGlzdHMoZmlsZU5hbWU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLnByb2plY3QuZmlsZUV4aXN0cyhmaWxlTmFtZSk7XG4gIH1cblxuICByZWFkRmlsZShmaWxlTmFtZTogc3RyaW5nKTogc3RyaW5nfHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMucHJvamVjdC5yZWFkRmlsZShmaWxlTmFtZSk7XG4gIH1cblxuICBnZXRDdXJyZW50RGlyZWN0b3J5KCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMucHJvamVjdC5nZXRDdXJyZW50RGlyZWN0b3J5KCk7XG4gIH1cblxuICBnZXRDYW5vbmljYWxGaWxlTmFtZShmaWxlTmFtZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5wcm9qZWN0LnByb2plY3RTZXJ2aWNlLnRvQ2Fub25pY2FsRmlsZU5hbWUoZmlsZU5hbWUpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybiB0aGUgcmVhbCBwYXRoIG9mIGEgc3ltbGluay4gVGhpcyBtZXRob2QgaXMgcmVxdWlyZWQgaW4gb3JkZXIgdG9cbiAgICogcmVzb2x2ZSBzeW1saW5rcyBpbiBub2RlX21vZHVsZXMuXG4gICAqL1xuICByZWFscGF0aChwYXRoOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLnByb2plY3QucmVhbHBhdGg/LihwYXRoKSA/PyBwYXRoO1xuICB9XG5cbiAgLyoqXG4gICAqIHJlYWRSZXNvdXJjZSgpIGlzIGFuIEFuZ3VsYXItc3BlY2lmaWMgbWV0aG9kIGZvciByZWFkaW5nIGZpbGVzIHRoYXQgYXJlIG5vdFxuICAgKiBtYW5hZ2VkIGJ5IHRoZSBUUyBjb21waWxlciBob3N0LCBuYW1lbHkgdGVtcGxhdGVzIGFuZCBzdHlsZXNoZWV0cy5cbiAgICogSXQgaXMgYSBtZXRob2Qgb24gRXh0ZW5kZWRUc0NvbXBpbGVySG9zdCwgc2VlXG4gICAqIHBhY2thZ2VzL2NvbXBpbGVyLWNsaS9zcmMvbmd0c2MvY29yZS9hcGkvc3JjL2ludGVyZmFjZXMudHNcbiAgICovXG4gIHJlYWRSZXNvdXJjZShmaWxlTmFtZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBpZiAoaXNUeXBlU2NyaXB0RmlsZShmaWxlTmFtZSkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgcmVhZFJlc291cmNlKCkgc2hvdWxkIG5vdCBiZSBjYWxsZWQgb24gVFMgZmlsZTogJHtmaWxlTmFtZX1gKTtcbiAgICB9XG4gICAgLy8gQ2FsbGluZyBnZXRTY3JpcHRTbmFwc2hvdCgpIHdpbGwgYWN0dWFsbHkgY3JlYXRlIGEgU2NyaXB0SW5mbyBpZiBpdCBkb2VzXG4gICAgLy8gbm90IGV4aXN0ISBUaGUgc2FtZSBhcHBsaWVzIGZvciBnZXRTY3JpcHRWZXJzaW9uKCkuXG4gICAgLy8gZ2V0U2NyaXB0SW5mbygpIHdpbGwgbm90IGNyZWF0ZSBvbmUgaWYgaXQgZG9lcyBub3QgZXhpc3QuXG4gICAgLy8gSW4gdGhpcyBjYXNlLCB3ZSAqd2FudCogYSBzY3JpcHQgaW5mbyB0byBiZSBjcmVhdGVkIHNvIHRoYXQgd2UgY291bGRcbiAgICAvLyBrZWVwIHRyYWNrIG9mIGl0cyB2ZXJzaW9uLlxuICAgIGNvbnN0IHNuYXBzaG90ID0gdGhpcy5wcm9qZWN0LmdldFNjcmlwdFNuYXBzaG90KGZpbGVOYW1lKTtcbiAgICBpZiAoIXNuYXBzaG90KSB7XG4gICAgICAvLyBUaGlzIHdvdWxkIGZhaWwgaWYgdGhlIGZpbGUgZG9lcyBub3QgZXhpc3QsIG9yIHJlYWRGaWxlKCkgZmFpbHMgZm9yXG4gICAgICAvLyB3aGF0ZXZlciByZWFzb25zLlxuICAgICAgdGhyb3cgbmV3IEVycm9yKGBGYWlsZWQgdG8gZ2V0IHNjcmlwdCBzbmFwc2hvdCB3aGlsZSB0cnlpbmcgdG8gcmVhZCAke2ZpbGVOYW1lfWApO1xuICAgIH1cbiAgICBjb25zdCB2ZXJzaW9uID0gdGhpcy5wcm9qZWN0LmdldFNjcmlwdFZlcnNpb24oZmlsZU5hbWUpO1xuICAgIHRoaXMudGVtcGxhdGVWZXJzaW9uLnNldChmaWxlTmFtZSwgdmVyc2lvbik7XG4gICAgcmV0dXJuIHNuYXBzaG90LmdldFRleHQoMCwgc25hcHNob3QuZ2V0TGVuZ3RoKCkpO1xuICB9XG5cbiAgaXNUZW1wbGF0ZURpcnR5KGZpbGVOYW1lOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICBjb25zdCBsYXN0VmVyc2lvbiA9IHRoaXMudGVtcGxhdGVWZXJzaW9uLmdldChmaWxlTmFtZSk7XG4gICAgY29uc3QgbGF0ZXN0VmVyc2lvbiA9IHRoaXMucHJvamVjdC5nZXRTY3JpcHRWZXJzaW9uKGZpbGVOYW1lKTtcbiAgICByZXR1cm4gbGFzdFZlcnNpb24gIT09IGxhdGVzdFZlcnNpb247XG4gIH1cbn1cblxuLyoqXG4gKiBVc2VkIHRvIHJlYWQgY29uZmlndXJhdGlvbiBmaWxlcy5cbiAqXG4gKiBBIGxhbmd1YWdlIHNlcnZpY2UgcGFyc2UgY29uZmlndXJhdGlvbiBob3N0IGlzIGluZGVwZW5kZW50IG9mIHRoZSBhZGFwdGVyXG4gKiBiZWNhdXNlIHNpZ25hdHVyZXMgb2YgY2FsbHMgbGlrZSBgRmlsZVN5c3RlbSNyZWFkRmlsZWAgYXJlIGEgYml0IHN0cmljdGVyXG4gKiB0aGFuIHRob3NlIG9uIHRoZSBhZGFwdGVyLlxuICovXG5leHBvcnQgY2xhc3MgTFNQYXJzZUNvbmZpZ0hvc3QgaW1wbGVtZW50cyBDb25maWd1cmF0aW9uSG9zdCB7XG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgcmVhZG9ubHkgc2VydmVySG9zdDogdHMuc2VydmVyLlNlcnZlckhvc3QpIHt9XG4gIGV4aXN0cyhwYXRoOiBBYnNvbHV0ZUZzUGF0aCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLnNlcnZlckhvc3QuZmlsZUV4aXN0cyhwYXRoKSB8fCB0aGlzLnNlcnZlckhvc3QuZGlyZWN0b3J5RXhpc3RzKHBhdGgpO1xuICB9XG4gIHJlYWRGaWxlKHBhdGg6IEFic29sdXRlRnNQYXRoKTogc3RyaW5nIHtcbiAgICBjb25zdCBjb250ZW50ID0gdGhpcy5zZXJ2ZXJIb3N0LnJlYWRGaWxlKHBhdGgpO1xuICAgIGlmIChjb250ZW50ID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgTGFuZ3VhZ2VTZXJ2aWNlRlMjcmVhZEZpbGUgY2FsbGVkIG9uIHVuYXZhaWxhYmxlIGZpbGUgJHtwYXRofWApO1xuICAgIH1cbiAgICByZXR1cm4gY29udGVudDtcbiAgfVxuICBsc3RhdChwYXRoOiBBYnNvbHV0ZUZzUGF0aCk6IEZpbGVTdGF0cyB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGlzRmlsZTogKCkgPT4ge1xuICAgICAgICByZXR1cm4gdGhpcy5zZXJ2ZXJIb3N0LmZpbGVFeGlzdHMocGF0aCk7XG4gICAgICB9LFxuICAgICAgaXNEaXJlY3Rvcnk6ICgpID0+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc2VydmVySG9zdC5kaXJlY3RvcnlFeGlzdHMocGF0aCk7XG4gICAgICB9LFxuICAgICAgaXNTeW1ib2xpY0xpbms6ICgpID0+IHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBMYW5ndWFnZVNlcnZpY2VGUyNsc3RhdCNpc1N5bWJvbGljTGluayBub3QgaW1wbGVtZW50ZWRgKTtcbiAgICAgIH0sXG4gICAgfTtcbiAgfVxuICBwd2QoKTogQWJzb2x1dGVGc1BhdGgge1xuICAgIHJldHVybiB0aGlzLnNlcnZlckhvc3QuZ2V0Q3VycmVudERpcmVjdG9yeSgpIGFzIEFic29sdXRlRnNQYXRoO1xuICB9XG4gIGV4dG5hbWUocGF0aDogQWJzb2x1dGVGc1BhdGh8UGF0aFNlZ21lbnQpOiBzdHJpbmcge1xuICAgIHJldHVybiBwLmV4dG5hbWUocGF0aCk7XG4gIH1cbiAgcmVzb2x2ZSguLi5wYXRoczogc3RyaW5nW10pOiBBYnNvbHV0ZUZzUGF0aCB7XG4gICAgcmV0dXJuIHAucmVzb2x2ZSguLi5wYXRocykgYXMgQWJzb2x1dGVGc1BhdGg7XG4gIH1cbiAgZGlybmFtZTxUIGV4dGVuZHMgUGF0aFN0cmluZz4oZmlsZTogVCk6IFQge1xuICAgIHJldHVybiBwLmRpcm5hbWUoZmlsZSkgYXMgVDtcbiAgfVxuICBqb2luPFQgZXh0ZW5kcyBQYXRoU3RyaW5nPihiYXNlUGF0aDogVCwgLi4ucGF0aHM6IHN0cmluZ1tdKTogVCB7XG4gICAgcmV0dXJuIHAuam9pbihiYXNlUGF0aCwgLi4ucGF0aHMpIGFzIFQ7XG4gIH1cbn1cbiJdfQ==
|
|
174
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWRhcHRlcnMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9sYW5ndWFnZS1zZXJ2aWNlL2l2eS9hZGFwdGVycy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7O0dBTUc7Ozs7Ozs7Ozs7Ozs7O0lBT0gsK0RBQTZEO0lBQzdELGtGQUFnRjtJQUNoRix3QkFBMEI7SUFHMUIsNkRBQXlDO0lBRXpDO1FBZUUsZ0NBQTZCLE9BQTBCO1lBQTFCLFlBQU8sR0FBUCxPQUFPLENBQW1CO1lBZDlDLGVBQVUsR0FBRyxJQUFJLENBQUM7WUFDbEIsNEJBQXVCLEdBQW9CLEVBQUUsQ0FBQztZQUM5QyxrQkFBYSxHQUF1QixJQUFJLEdBQUcsRUFBRSxDQUFDO1lBQzlDLG1CQUFjLEdBQUcsSUFBSSxDQUFDLENBQU0sc0JBQXNCO1lBQ2xELHVCQUFrQixHQUFHLElBQUksQ0FBQyxDQUFFLHFCQUFxQjtZQUcxRDs7OztlQUlHO1lBQ2MsNEJBQXVCLEdBQUcsSUFBSSxHQUFHLEVBQWtCLENBQUM7WUFHbkUsSUFBSSxDQUFDLFFBQVEsR0FBRyx3QkFBVyxDQUFDLElBQUksRUFBRSxPQUFPLENBQUMsc0JBQXNCLEVBQUUsQ0FBQyxDQUFDO1FBQ3RFLENBQUM7UUFFRCx1Q0FBTSxHQUFOLFVBQU8sRUFBaUI7WUFDdEIsT0FBTyxjQUFNLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDcEIsQ0FBQztRQUVELDJDQUFVLEdBQVYsVUFBVyxRQUFnQjtZQUN6QixPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQzNDLENBQUM7UUFFRCx5Q0FBUSxHQUFSLFVBQVMsUUFBZ0I7WUFDdkIsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUN6QyxDQUFDO1FBRUQsb0RBQW1CLEdBQW5CO1lBQ0UsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFD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QUMsVUFBVSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQztnQkFDMUMsQ0FBQztnQkFDRCxXQUFXLEVBQUU7b0JBQ1gsT0FBTyxLQUFJLENBQUMsVUFBVSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsQ0FBQztnQkFDL0MsQ0FBQztnQkFDRCxjQUFjLEVBQUU7b0JBQ2QsTUFBTSxJQUFJLEtBQUssQ0FBQyx3REFBd0QsQ0FBQyxDQUFDO2dCQUM1RSxDQUFDO2FBQ0YsQ0FBQztRQUNKLENBQUM7UUFDRCwrQkFBRyxHQUFIO1lBQ0UsT0FBTyxJQUFJLENBQUMsVUFBVSxDQUFDLG1CQUFtQixFQUFvQixDQUFDO1FBQ2pFLENBQUM7UUFDRCxtQ0FBTyxHQUFQLFVBQVEsSUFBZ0M7WUFDdEMsT0FBTyxDQUFDLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3pCLENBQUM7UUFDRCxtQ0FBTyxHQUFQO1lBQVEsZUFBa0I7aUJBQWxCLFVBQWtCLEVBQWxCLHFCQUFrQixFQUFsQixJQUFrQjtnQkFBbEIsMEJBQWtCOztZQUN4QixPQUFPLENBQUMsQ0FBQyxPQUFPLE9BQVQsQ0FBQyxtQkFBWSxLQUFLLEVBQW1CLENBQUM7UUFDL0MsQ0FBQztRQUNELG1DQUFPLEdBQVAsVUFBOEIsSUFBTztZQUNuQyxPQUFPLENBQUMsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFNLENBQUM7UUFDOUIsQ0FBQztRQUNELGdDQUFJLEdBQUosVUFBMkIsUUFBVztZQUFFLGVBQWtCO2lCQUFsQixVQUFrQixFQUFsQixxQkFBa0IsRUFBbEIsSUFBa0I7Z0JBQWxCLDhCQUFrQjs7WUFDeEQsT0FBTyxDQUFDLENBQUMsSUFBSSxPQUFOLENBQUMsb0JBQU0sUUFBUSxHQUFLLEtBQUssRUFBTSxDQUFDO1FBQ3pDLENBQUM7UUFDSCx3QkFBQztJQUFELENBQUMsQUF4Q0QsSUF3Q0M7SUF4Q1ksOENBQWlCIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IEdvb2dsZSBMTEMgQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqXG4gKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZVxuICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZVxuICovXG5cbi8qKiBAZmlsZW92ZXJ2aWV3IHByb3ZpZGVzIGFkYXB0ZXJzIGZvciBjb21tdW5pY2F0aW5nIHdpdGggdGhlIG5nIGNvbXBpbGVyICovXG5cbmltcG9ydCB7Q29uZmlndXJhdGlvbkhvc3R9IGZyb20gJ0Bhbmd1bGFyL2NvbXBpbGVyLWNsaSc7XG5pbXBvcnQge05nQ29tcGlsZXJBZGFwdGVyfSBmcm9tICdAYW5ndWxhci9jb21waWxlci1jbGkvc3JjL25ndHNjL2NvcmUvYXBpJztcbmltcG9ydCB7QWJzb2x1dGVGc1BhdGgsIEZpbGVTdGF0cywgUGF0aFNlZ21lbnQsIFBhdGhTdHJpbmd9IGZyb20gJ0Bhbmd1bGFyL2NvbXBpbGVyLWNsaS9zcmMvbmd0c2MvZmlsZV9zeXN0ZW0nO1xuaW1wb3J0IHtpc1NoaW19IGZyb20gJ0Bhbmd1bGFyL2NvbXBpbGVyLWNsaS9zcmMvbmd0c2Mvc2hpbXMnO1xuaW1wb3J0IHtnZXRSb290RGlyc30gZnJvbSAnQGFuZ3VsYXIvY29tcGlsZXItY2xpL3NyYy9uZ3RzYy91dGlsL3NyYy90eXBlc2NyaXB0JztcbmltcG9ydCAqIGFzIHAgZnJvbSAncGF0aCc7XG5pbXBvcnQgKiBhcyB0cyBmcm9tICd0eXBlc2NyaXB0L2xpYi90c3NlcnZlcmxpYnJhcnknO1xuXG5pbXBvcnQge2lzVHlwZVNjcmlwdEZpbGV9IGZyb20gJy4vdXRpbHMnO1xuXG5leHBvcnQgY2xhc3MgTGFuZ3VhZ2VTZXJ2aWNlQWRhcHRlciBpbXBsZW1lbnRzIE5nQ29tcGlsZXJBZGFwdGVyIHtcbiAgcmVhZG9ubHkgZW50cnlQb2ludCA9IG51bGw7XG4gIHJlYWRvbmx5IGNvbnN0cnVjdGlvbkRpYWdub3N0aWNzOiB0cy5EaWFnbm9zdGljW10gPSBbXTtcbiAgcmVhZG9ubHkgaWdub3JlRm9yRW1pdDogU2V0PHRzLlNvdXJjZUZpbGU+ID0gbmV3IFNldCgpO1xuICByZWFkb25seSBmYWN0b3J5VHJhY2tlciA9IG51bGw7ICAgICAgLy8gbm8gLm5nZmFjdG9yeSBzaGltc1xuICByZWFkb25seSB1bmlmaWVkTW9kdWxlc0hvc3QgPSBudWxsOyAgLy8gb25seSB1c2VkIGluIEJhemVsXG4gIHJlYWRvbmx5IHJvb3REaXJzOiBBYnNvbHV0ZUZzUGF0aFtdO1xuXG4gIC8qKlxuICAgKiBNYXAgb2YgcmVzb3VyY2UgZmlsZW5hbWVzIHRvIHRoZSB2ZXJzaW9uIG9mIHRoZSBmaWxlIGxhc3QgcmVhZCB2aWEgYHJlYWRSZXNvdXJjZWAuXG4gICAqXG4gICAqIFVzZWQgdG8gaW1wbGVtZW50IGBnZXRNb2RpZmllZFJlc291cmNlRmlsZXNgLlxuICAgKi9cbiAgcHJpdmF0ZSByZWFkb25seSBsYXN0UmVhZFJlc291cmNlVmVyc2lvbiA9IG5ldyBNYXA8c3RyaW5nLCBzdHJpbmc+KCk7XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSByZWFkb25seSBwcm9qZWN0OiB0cy5zZXJ2ZXIuUHJvamVjdCkge1xuICAgIHRoaXMucm9vdERpcnMgPSBnZXRSb290RGlycyh0aGlzLCBwcm9qZWN0LmdldENvbXBpbGF0aW9uU2V0dGluZ3MoKSk7XG4gIH1cblxuICBpc1NoaW0oc2Y6IHRzLlNvdXJjZUZpbGUpOiBib29sZWFuIHtcbiAgICByZXR1cm4gaXNTaGltKHNmKTtcbiAgfVxuXG4gIGZpbGVFeGlzdHMoZmlsZU5hbWU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLnByb2plY3QuZmlsZUV4aXN0cyhmaWxlTmFtZSk7XG4gIH1cblxuICByZWFkRmlsZShmaWxlTmFtZTogc3RyaW5nKTogc3RyaW5nfHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMucHJvamVjdC5yZWFkRmlsZShmaWxlTmFtZSk7XG4gIH1cblxuICBnZXRDdXJyZW50RGlyZWN0b3J5KCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMucHJvamVjdC5nZXRDdXJyZW50RGlyZWN0b3J5KCk7XG4gIH1cblxuICBnZXRDYW5vbmljYWxGaWxlTmFtZShmaWxlTmFtZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5wcm9qZWN0LnByb2plY3RTZXJ2aWNlLnRvQ2Fub25pY2FsRmlsZU5hbWUoZmlsZU5hbWUpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybiB0aGUgcmVhbCBwYXRoIG9mIGEgc3ltbGluay4gVGhpcyBtZXRob2QgaXMgcmVxdWlyZWQgaW4gb3JkZXIgdG9cbiAgICogcmVzb2x2ZSBzeW1saW5rcyBpbiBub2RlX21vZHVsZXMuXG4gICAqL1xuICByZWFscGF0aChwYXRoOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLnByb2plY3QucmVhbHBhdGg/LihwYXRoKSA/PyBwYXRoO1xuICB9XG5cbiAgLyoqXG4gICAqIHJlYWRSZXNvdXJjZSgpIGlzIGFuIEFuZ3VsYXItc3BlY2lmaWMgbWV0aG9kIGZvciByZWFkaW5nIGZpbGVzIHRoYXQgYXJlIG5vdFxuICAgKiBtYW5hZ2VkIGJ5IHRoZSBUUyBjb21waWxlciBob3N0LCBuYW1lbHkgdGVtcGxhdGVzIGFuZCBzdHlsZXNoZWV0cy5cbiAgICogSXQgaXMgYSBtZXRob2Qgb24gRXh0ZW5kZWRUc0NvbXBpbGVySG9zdCwgc2VlXG4gICAqIHBhY2thZ2VzL2NvbXBpbGVyLWNsaS9zcmMvbmd0c2MvY29yZS9hcGkvc3JjL2ludGVyZmFjZXMudHNcbiAgICovXG4gIHJlYWRSZXNvdXJjZShmaWxlTmFtZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBpZiAoaXNUeXBlU2NyaXB0RmlsZShmaWxlTmFtZSkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgcmVhZFJlc291cmNlKCkgc2hvdWxkIG5vdCBiZSBjYWxsZWQgb24gVFMgZmlsZTogJHtmaWxlTmFtZX1gKTtcbiAgICB9XG4gICAgLy8gQ2FsbGluZyBnZXRTY3JpcHRTbmFwc2hvdCgpIHdpbGwgYWN0dWFsbHkgY3JlYXRlIGEgU2NyaXB0SW5mbyBpZiBpdCBkb2VzXG4gICAgLy8gbm90IGV4aXN0ISBUaGUgc2FtZSBhcHBsaWVzIGZvciBnZXRTY3JpcHRWZXJzaW9uKCkuXG4gICAgLy8gZ2V0U2NyaXB0SW5mbygpIHdpbGwgbm90IGNyZWF0ZSBvbmUgaWYgaXQgZG9lcyBub3QgZXhpc3QuXG4gICAgLy8gSW4gdGhpcyBjYXNlLCB3ZSAqd2FudCogYSBzY3JpcHQgaW5mbyB0byBiZSBjcmVhdGVkIHNvIHRoYXQgd2UgY291bGRcbiAgICAvLyBrZWVwIHRyYWNrIG9mIGl0cyB2ZXJzaW9uLlxuICAgIGNvbnN0IHNuYXBzaG90ID0gdGhpcy5wcm9qZWN0LmdldFNjcmlwdFNuYXBzaG90KGZpbGVOYW1lKTtcbiAgICBpZiAoIXNuYXBzaG90KSB7XG4gICAgICAvLyBUaGlzIHdvdWxkIGZhaWwgaWYgdGhlIGZpbGUgZG9lcyBub3QgZXhpc3QsIG9yIHJlYWRGaWxlKCkgZmFpbHMgZm9yXG4gICAgICAvLyB3aGF0ZXZlciByZWFzb25zLlxuICAgICAgdGhyb3cgbmV3IEVycm9yKGBGYWlsZWQgdG8gZ2V0IHNjcmlwdCBzbmFwc2hvdCB3aGlsZSB0cnlpbmcgdG8gcmVhZCAke2ZpbGVOYW1lfWApO1xuICAgIH1cbiAgICBjb25zdCB2ZXJzaW9uID0gdGhpcy5wcm9qZWN0LmdldFNjcmlwdFZlcnNpb24oZmlsZU5hbWUpO1xuICAgIHRoaXMubGFzdFJlYWRSZXNvdXJjZVZlcnNpb24uc2V0KGZpbGVOYW1lLCB2ZXJzaW9uKTtcbiAgICByZXR1cm4gc25hcHNob3QuZ2V0VGV4dCgwLCBzbmFwc2hvdC5nZXRMZW5ndGgoKSk7XG4gIH1cblxuICBnZXRNb2RpZmllZFJlc291cmNlRmlsZXMoKTogU2V0PHN0cmluZz58dW5kZWZpbmVkIHtcbiAgICBjb25zdCBtb2RpZmllZEZpbGVzID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gICAgZm9yIChjb25zdCBbZmlsZU5hbWUsIG9sZFZlcnNpb25dIG9mIHRoaXMubGFzdFJlYWRSZXNvdXJjZVZlcnNpb24pIHtcbiAgICAgIGlmICh0aGlzLnByb2plY3QuZ2V0U2NyaXB0VmVyc2lvbihmaWxlTmFtZSkgIT09IG9sZFZlcnNpb24pIHtcbiAgICAgICAgbW9kaWZpZWRGaWxlcy5hZGQoZmlsZU5hbWUpO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gbW9kaWZpZWRGaWxlcy5zaXplID4gMCA/IG1vZGlmaWVkRmlsZXMgOiB1bmRlZmluZWQ7XG4gIH1cbn1cblxuLyoqXG4gKiBVc2VkIHRvIHJlYWQgY29uZmlndXJhdGlvbiBmaWxlcy5cbiAqXG4gKiBBIGxhbmd1YWdlIHNlcnZpY2UgcGFyc2UgY29uZmlndXJhdGlvbiBob3N0IGlzIGluZGVwZW5kZW50IG9mIHRoZSBhZGFwdGVyXG4gKiBiZWNhdXNlIHNpZ25hdHVyZXMgb2YgY2FsbHMgbGlrZSBgRmlsZVN5c3RlbSNyZWFkRmlsZWAgYXJlIGEgYml0IHN0cmljdGVyXG4gKiB0aGFuIHRob3NlIG9uIHRoZSBhZGFwdGVyLlxuICovXG5leHBvcnQgY2xhc3MgTFNQYXJzZUNvbmZpZ0hvc3QgaW1wbGVtZW50cyBDb25maWd1cmF0aW9uSG9zdCB7XG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgcmVhZG9ubHkgc2VydmVySG9zdDogdHMuc2VydmVyLlNlcnZlckhvc3QpIHt9XG4gIGV4aXN0cyhwYXRoOiBBYnNvbHV0ZUZzUGF0aCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLnNlcnZlckhvc3QuZmlsZUV4aXN0cyhwYXRoKSB8fCB0aGlzLnNlcnZlckhvc3QuZGlyZWN0b3J5RXhpc3RzKHBhdGgpO1xuICB9XG4gIHJlYWRGaWxlKHBhdGg6IEFic29sdXRlRnNQYXRoKTogc3RyaW5nIHtcbiAgICBjb25zdCBjb250ZW50ID0gdGhpcy5zZXJ2ZXJIb3N0LnJlYWRGaWxlKHBhdGgpO1xuICAgIGlmIChjb250ZW50ID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgTGFuZ3VhZ2VTZXJ2aWNlRlMjcmVhZEZpbGUgY2FsbGVkIG9uIHVuYXZhaWxhYmxlIGZpbGUgJHtwYXRofWApO1xuICAgIH1cbiAgICByZXR1cm4gY29udGVudDtcbiAgfVxuICBsc3RhdChwYXRoOiBBYnNvbHV0ZUZzUGF0aCk6IEZpbGVTdGF0cyB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGlzRmlsZTogKCkgPT4ge1xuICAgICAgICByZXR1cm4gdGhpcy5zZXJ2ZXJIb3N0LmZpbGVFeGlzdHMocGF0aCk7XG4gICAgICB9LFxuICAgICAgaXNEaXJlY3Rvcnk6ICgpID0+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc2VydmVySG9zdC5kaXJlY3RvcnlFeGlzdHMocGF0aCk7XG4gICAgICB9LFxuICAgICAgaXNTeW1ib2xpY0xpbms6ICgpID0+IHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBMYW5ndWFnZVNlcnZpY2VGUyNsc3RhdCNpc1N5bWJvbGljTGluayBub3QgaW1wbGVtZW50ZWRgKTtcbiAgICAgIH0sXG4gICAgfTtcbiAgfVxuICBwd2QoKTogQWJzb2x1dGVGc1BhdGgge1xuICAgIHJldHVybiB0aGlzLnNlcnZlckhvc3QuZ2V0Q3VycmVudERpcmVjdG9yeSgpIGFzIEFic29sdXRlRnNQYXRoO1xuICB9XG4gIGV4dG5hbWUocGF0aDogQWJzb2x1dGVGc1BhdGh8UGF0aFNlZ21lbnQpOiBzdHJpbmcge1xuICAgIHJldHVybiBwLmV4dG5hbWUocGF0aCk7XG4gIH1cbiAgcmVzb2x2ZSguLi5wYXRoczogc3RyaW5nW10pOiBBYnNvbHV0ZUZzUGF0aCB7XG4gICAgcmV0dXJuIHAucmVzb2x2ZSguLi5wYXRocykgYXMgQWJzb2x1dGVGc1BhdGg7XG4gIH1cbiAgZGlybmFtZTxUIGV4dGVuZHMgUGF0aFN0cmluZz4oZmlsZTogVCk6IFQge1xuICAgIHJldHVybiBwLmRpcm5hbWUoZmlsZSkgYXMgVDtcbiAgfVxuICBqb2luPFQgZXh0ZW5kcyBQYXRoU3RyaW5nPihiYXNlUGF0aDogVCwgLi4ucGF0aHM6IHN0cmluZ1tdKTogVCB7XG4gICAgcmV0dXJuIHAuam9pbihiYXNlUGF0aCwgLi4ucGF0aHMpIGFzIFQ7XG4gIH1cbn1cbiJdfQ==
|
|
@@ -28,14 +28,5 @@ export declare class CompilerFactory {
|
|
|
28
28
|
private lastKnownProgram;
|
|
29
29
|
constructor(adapter: LanguageServiceAdapter, programStrategy: TypeCheckingProgramStrategy, options: NgCompilerOptions);
|
|
30
30
|
getOrCreate(): NgCompiler;
|
|
31
|
-
/**
|
|
32
|
-
* Create a new instance of the Ivy compiler if the program has changed since
|
|
33
|
-
* the last time the compiler was instantiated. If the program has not changed,
|
|
34
|
-
* return the existing instance.
|
|
35
|
-
* @param fileName override the template if this is an external template file
|
|
36
|
-
* @param options angular compiler options
|
|
37
|
-
*/
|
|
38
|
-
getOrCreateWithChangedFile(fileName: string): NgCompiler;
|
|
39
|
-
private overrideTemplate;
|
|
40
31
|
registerLastKnownProgram(): void;
|
|
41
32
|
}
|
package/ivy/compiler_factory.js
CHANGED
|
@@ -11,17 +11,14 @@
|
|
|
11
11
|
if (v !== undefined) module.exports = v;
|
|
12
12
|
}
|
|
13
13
|
else if (typeof define === "function" && define.amd) {
|
|
14
|
-
define("@angular/language-service/ivy/compiler_factory", ["require", "exports", "
|
|
14
|
+
define("@angular/language-service/ivy/compiler_factory", ["require", "exports", "@angular/compiler-cli/src/ngtsc/core", "@angular/compiler-cli/src/ngtsc/incremental"], factory);
|
|
15
15
|
}
|
|
16
16
|
})(function (require, exports) {
|
|
17
17
|
"use strict";
|
|
18
18
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
19
19
|
exports.CompilerFactory = void 0;
|
|
20
|
-
var tslib_1 = require("tslib");
|
|
21
20
|
var core_1 = require("@angular/compiler-cli/src/ngtsc/core");
|
|
22
21
|
var incremental_1 = require("@angular/compiler-cli/src/ngtsc/incremental");
|
|
23
|
-
var ts = require("typescript/lib/tsserverlibrary");
|
|
24
|
-
var utils_1 = require("@angular/language-service/ivy/utils");
|
|
25
22
|
/**
|
|
26
23
|
* Manages the `NgCompiler` instance which backs the language service, updating or replacing it as
|
|
27
24
|
* needed to produce an up-to-date understanding of the current program.
|
|
@@ -41,60 +38,27 @@
|
|
|
41
38
|
this.lastKnownProgram = null;
|
|
42
39
|
}
|
|
43
40
|
CompilerFactory.prototype.getOrCreate = function () {
|
|
41
|
+
var _a;
|
|
44
42
|
var program = this.programStrategy.getProgram();
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
if (
|
|
48
|
-
|
|
43
|
+
var modifiedResourceFiles = (_a = this.adapter.getModifiedResourceFiles()) !== null && _a !== void 0 ? _a : new Set();
|
|
44
|
+
if (this.compiler !== null && program === this.lastKnownProgram) {
|
|
45
|
+
if (modifiedResourceFiles.size > 0) {
|
|
46
|
+
// Only resource files have changed since the last NgCompiler was created.
|
|
47
|
+
var ticket_1 = core_1.resourceChangeTicket(this.compiler, modifiedResourceFiles);
|
|
48
|
+
this.compiler = core_1.NgCompiler.fromTicket(ticket_1, this.adapter);
|
|
49
49
|
}
|
|
50
|
-
|
|
51
|
-
ticket = core_1.incrementalFromCompilerTicket(this.compiler, program, this.incrementalStrategy, this.programStrategy, new Set());
|
|
52
|
-
}
|
|
53
|
-
this.compiler = core_1.NgCompiler.fromTicket(ticket, this.adapter);
|
|
54
|
-
this.lastKnownProgram = program;
|
|
50
|
+
return this.compiler;
|
|
55
51
|
}
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
* Create a new instance of the Ivy compiler if the program has changed since
|
|
60
|
-
* the last time the compiler was instantiated. If the program has not changed,
|
|
61
|
-
* return the existing instance.
|
|
62
|
-
* @param fileName override the template if this is an external template file
|
|
63
|
-
* @param options angular compiler options
|
|
64
|
-
*/
|
|
65
|
-
CompilerFactory.prototype.getOrCreateWithChangedFile = function (fileName) {
|
|
66
|
-
var compiler = this.getOrCreate();
|
|
67
|
-
if (utils_1.isExternalTemplate(fileName)) {
|
|
68
|
-
this.overrideTemplate(fileName, compiler);
|
|
52
|
+
var ticket;
|
|
53
|
+
if (this.compiler === null || this.lastKnownProgram === null) {
|
|
54
|
+
ticket = core_1.freshCompilationTicket(program, this.options, this.incrementalStrategy, this.programStrategy, true, true);
|
|
69
55
|
}
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
CompilerFactory.prototype.overrideTemplate = function (fileName, compiler) {
|
|
73
|
-
var e_1, _a;
|
|
74
|
-
if (!this.adapter.isTemplateDirty(fileName)) {
|
|
75
|
-
return;
|
|
76
|
-
}
|
|
77
|
-
// 1. Get the latest snapshot
|
|
78
|
-
var latestTemplate = this.adapter.readResource(fileName);
|
|
79
|
-
// 2. Find all components that use the template
|
|
80
|
-
var ttc = compiler.getTemplateTypeChecker();
|
|
81
|
-
var components = compiler.getComponentsWithTemplateFile(fileName);
|
|
82
|
-
try {
|
|
83
|
-
// 3. Update component template
|
|
84
|
-
for (var components_1 = tslib_1.__values(components), components_1_1 = components_1.next(); !components_1_1.done; components_1_1 = components_1.next()) {
|
|
85
|
-
var component = components_1_1.value;
|
|
86
|
-
if (ts.isClassDeclaration(component)) {
|
|
87
|
-
ttc.overrideComponentTemplate(component, latestTemplate);
|
|
88
|
-
}
|
|
89
|
-
}
|
|
90
|
-
}
|
|
91
|
-
catch (e_1_1) { e_1 = { error: e_1_1 }; }
|
|
92
|
-
finally {
|
|
93
|
-
try {
|
|
94
|
-
if (components_1_1 && !components_1_1.done && (_a = components_1.return)) _a.call(components_1);
|
|
95
|
-
}
|
|
96
|
-
finally { if (e_1) throw e_1.error; }
|
|
56
|
+
else {
|
|
57
|
+
ticket = core_1.incrementalFromCompilerTicket(this.compiler, program, this.incrementalStrategy, this.programStrategy, modifiedResourceFiles);
|
|
97
58
|
}
|
|
59
|
+
this.compiler = core_1.NgCompiler.fromTicket(ticket, this.adapter);
|
|
60
|
+
this.lastKnownProgram = program;
|
|
61
|
+
return this.compiler;
|
|
98
62
|
};
|
|
99
63
|
CompilerFactory.prototype.registerLastKnownProgram = function () {
|
|
100
64
|
this.lastKnownProgram = this.programStrategy.getProgram();
|
|
@@ -103,4 +67,4 @@
|
|
|
103
67
|
}());
|
|
104
68
|
exports.CompilerFactory = CompilerFactory;
|
|
105
69
|
});
|
|
106
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
70
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tcGlsZXJfZmFjdG9yeS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3BhY2thZ2VzL2xhbmd1YWdlLXNlcnZpY2UvaXZ5L2NvbXBpbGVyX2ZhY3RvcnkudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7OztHQU1HOzs7Ozs7Ozs7Ozs7O0lBRUgsNkRBQWdLO0lBRWhLLDJFQUE0RjtJQU81Rjs7Ozs7Ozs7T0FRRztJQUNIO1FBS0UseUJBQ3FCLE9BQStCLEVBQy9CLGVBQTRDLEVBQzVDLE9BQTBCO1lBRjFCLFlBQU8sR0FBUCxPQUFPLENBQXdCO1lBQy9CLG9CQUFlLEdBQWYsZUFBZSxDQUE2QjtZQUM1QyxZQUFPLEdBQVAsT0FBTyxDQUFtQjtZQVA5Qix3QkFBbUIsR0FBRyxJQUFJLDZDQUErQixFQUFFLENBQUM7WUFDckUsYUFBUSxHQUFvQixJQUFJLENBQUM7WUFDakMscUJBQWdCLEdBQW9CLElBQUksQ0FBQztRQU05QyxDQUFDO1FBRUoscUNBQVcsR0FBWDs7WUFDRSxJQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDLFVBQVUsRUFBRSxDQUFDO1lBQ2xELElBQU0scUJBQXFCLFNBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyx3QkFBd0IsRUFBRSxtQ0FBSSxJQUFJLEdBQUcsRUFBRSxDQUFDO1lBRW5GLElBQUksSUFBSSxDQUFDLFFBQVEsS0FBSyxJQUFJLElBQUksT0FBTyxLQUFLLElBQUksQ0FBQyxnQkFBZ0IsRUFBRTtnQkFDL0QsSUFBSSxxQkFBcUIsQ0FBQyxJQUFJLEdBQUcsQ0FBQyxFQUFFO29CQUNsQywwRUFBMEU7b0JBQzFFLElBQU0sUUFBTSxHQUFHLDJCQUFvQixDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUscUJBQXFCLENBQUMsQ0FBQztvQkFDMUUsSUFBSSxDQUFDLFFBQVEsR0FBRyxpQkFBVSxDQUFDLFVBQVUsQ0FBQyxRQUFNLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO2lCQUM3RDtnQkFFRCxPQUFPLElBQUksQ0FBQyxRQUFRLENBQUM7YUFDdEI7WUFFRCxJQUFJLE1BQXlCLENBQUM7WUFDOUIsSUFBSSxJQUFJLENBQUMsUUFBUSxLQUFLLElBQUksSUFBSSxJQUFJLENBQUMsZ0JBQWdCLEtBQUssSUFBSSxFQUFFO2dCQUM1RCxNQUFNLEdBQUcsNkJBQXNCLENBQzNCLE9BQU8sRUFBRSxJQUFJLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxtQkFBbUIsRUFBRSxJQUFJLENBQUMsZUFBZSxFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQzthQUN4RjtpQkFBTTtnQkFDTCxNQUFNLEdBQUcsb0NBQTZCLENBQ2xDLElBQUksQ0FBQyxRQUFRLEVBQUUsT0FBTyxFQUFFLElBQUksQ0FBQyxtQkFBbUIsRUFBRSxJQUFJLENBQUMsZUFBZSxFQUN0RSxxQkFBcUIsQ0FBQyxDQUFDO2FBQzVCO1lBQ0QsSUFBSSxDQUFDLFFBQVEsR0FBRyxpQkFBVSxDQUFDLFVBQVUsQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBQzVELElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxPQUFPLENBQUM7WUFDaEMsT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDO1FBQ3ZCLENBQUM7UUFFRCxrREFBd0IsR0FBeEI7WUFDRSxJQUFJLENBQUMsZ0JBQWdCLEdBQUcsSUFBSSxDQUFDLGVBQWUsQ0FBQyxVQUFVLEVBQUUsQ0FBQztRQUM1RCxDQUFDO1FBQ0gsc0JBQUM7SUFBRCxDQUFDLEFBMUNELElBMENDO0lBMUNZLDBDQUFlIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IEdvb2dsZSBMTEMgQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqXG4gKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZVxuICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZVxuICovXG5cbmltcG9ydCB7Q29tcGlsYXRpb25UaWNrZXQsIGZyZXNoQ29tcGlsYXRpb25UaWNrZXQsIGluY3JlbWVudGFsRnJvbUNvbXBpbGVyVGlja2V0LCBOZ0NvbXBpbGVyLCByZXNvdXJjZUNoYW5nZVRpY2tldH0gZnJvbSAnQGFuZ3VsYXIvY29tcGlsZXItY2xpL3NyYy9uZ3RzYy9jb3JlJztcbmltcG9ydCB7TmdDb21waWxlck9wdGlvbnN9IGZyb20gJ0Bhbmd1bGFyL2NvbXBpbGVyLWNsaS9zcmMvbmd0c2MvY29yZS9hcGknO1xuaW1wb3J0IHtUcmFja2VkSW5jcmVtZW50YWxCdWlsZFN0cmF0ZWd5fSBmcm9tICdAYW5ndWxhci9jb21waWxlci1jbGkvc3JjL25ndHNjL2luY3JlbWVudGFsJztcbmltcG9ydCB7VHlwZUNoZWNraW5nUHJvZ3JhbVN0cmF0ZWd5fSBmcm9tICdAYW5ndWxhci9jb21waWxlci1jbGkvc3JjL25ndHNjL3R5cGVjaGVjay9hcGknO1xuaW1wb3J0ICogYXMgdHMgZnJvbSAndHlwZXNjcmlwdC9saWIvdHNzZXJ2ZXJsaWJyYXJ5JztcblxuaW1wb3J0IHtMYW5ndWFnZVNlcnZpY2VBZGFwdGVyfSBmcm9tICcuL2FkYXB0ZXJzJztcbmltcG9ydCB7aXNFeHRlcm5hbFRlbXBsYXRlfSBmcm9tICcuL3V0aWxzJztcblxuLyoqXG4gKiBNYW5hZ2VzIHRoZSBgTmdDb21waWxlcmAgaW5zdGFuY2Ugd2hpY2ggYmFja3MgdGhlIGxhbmd1YWdlIHNlcnZpY2UsIHVwZGF0aW5nIG9yIHJlcGxhY2luZyBpdCBhc1xuICogbmVlZGVkIHRvIHByb2R1Y2UgYW4gdXAtdG8tZGF0ZSB1bmRlcnN0YW5kaW5nIG9mIHRoZSBjdXJyZW50IHByb2dyYW0uXG4gKlxuICogVE9ETyhhbHhodWIpOiBjdXJyZW50bHkgdGhlIG9wdGlvbnMgdXNlZCBmb3IgdGhlIGNvbXBpbGVyIGFyZSBzcGVjaWZpZWQgYXQgYENvbXBpbGVyRmFjdG9yeWBcbiAqIGNvbnN0cnVjdGlvbiwgYW5kIGFyZSBub3QgY2hhbmdhYmxlLiBJbiBhIHJlYWwgcHJvamVjdCwgdXNlcnMgY2FuIHVwZGF0ZSBgdHNjb25maWcuanNvbmAuIFdlIG5lZWRcbiAqIHRvIHByb3Blcmx5IGhhbmRsZSBhIGNoYW5nZSBpbiB0aGUgY29tcGlsZXIgb3B0aW9ucywgZWl0aGVyIGJ5IGhhdmluZyBhbiBBUEkgdG8gdXBkYXRlIHRoZVxuICogYENvbXBpbGVyRmFjdG9yeWAgdG8gdXNlIG5ldyBvcHRpb25zLCBvciBieSByZXBsYWNpbmcgaXQgZW50aXJlbHkuXG4gKi9cbmV4cG9ydCBjbGFzcyBDb21waWxlckZhY3Rvcnkge1xuICBwcml2YXRlIHJlYWRvbmx5IGluY3JlbWVudGFsU3RyYXRlZ3kgPSBuZXcgVHJhY2tlZEluY3JlbWVudGFsQnVpbGRTdHJhdGVneSgpO1xuICBwcml2YXRlIGNvbXBpbGVyOiBOZ0NvbXBpbGVyfG51bGwgPSBudWxsO1xuICBwcml2YXRlIGxhc3RLbm93blByb2dyYW06IHRzLlByb2dyYW18bnVsbCA9IG51bGw7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgICBwcml2YXRlIHJlYWRvbmx5IGFkYXB0ZXI6IExhbmd1YWdlU2VydmljZUFkYXB0ZXIsXG4gICAgICBwcml2YXRlIHJlYWRvbmx5IHByb2dyYW1TdHJhdGVneTogVHlwZUNoZWNraW5nUHJvZ3JhbVN0cmF0ZWd5LFxuICAgICAgcHJpdmF0ZSByZWFkb25seSBvcHRpb25zOiBOZ0NvbXBpbGVyT3B0aW9ucyxcbiAgKSB7fVxuXG4gIGdldE9yQ3JlYXRlKCk6IE5nQ29tcGlsZXIge1xuICAgIGNvbnN0IHByb2dyYW0gPSB0aGlzLnByb2dyYW1TdHJhdGVneS5nZXRQcm9ncmFtKCk7XG4gICAgY29uc3QgbW9kaWZpZWRSZXNvdXJjZUZpbGVzID0gdGhpcy5hZGFwdGVyLmdldE1vZGlmaWVkUmVzb3VyY2VGaWxlcygpID8/IG5ldyBTZXQoKTtcblxuICAgIGlmICh0aGlzLmNvbXBpbGVyICE9PSBudWxsICYmIHByb2dyYW0gPT09IHRoaXMubGFzdEtub3duUHJvZ3JhbSkge1xuICAgICAgaWYgKG1vZGlmaWVkUmVzb3VyY2VGaWxlcy5zaXplID4gMCkge1xuICAgICAgICAvLyBPbmx5IHJlc291cmNlIGZpbGVzIGhhdmUgY2hhbmdlZCBzaW5jZSB0aGUgbGFzdCBOZ0NvbXBpbGVyIHdhcyBjcmVhdGVkLlxuICAgICAgICBjb25zdCB0aWNrZXQgPSByZXNvdXJjZUNoYW5nZVRpY2tldCh0aGlzLmNvbXBpbGVyLCBtb2RpZmllZFJlc291cmNlRmlsZXMpO1xuICAgICAgICB0aGlzLmNvbXBpbGVyID0gTmdDb21waWxlci5mcm9tVGlja2V0KHRpY2tldCwgdGhpcy5hZGFwdGVyKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHRoaXMuY29tcGlsZXI7XG4gICAgfVxuXG4gICAgbGV0IHRpY2tldDogQ29tcGlsYXRpb25UaWNrZXQ7XG4gICAgaWYgKHRoaXMuY29tcGlsZXIgPT09IG51bGwgfHwgdGhpcy5sYXN0S25vd25Qcm9ncmFtID09PSBudWxsKSB7XG4gICAgICB0aWNrZXQgPSBmcmVzaENvbXBpbGF0aW9uVGlja2V0KFxuICAgICAgICAgIHByb2dyYW0sIHRoaXMub3B0aW9ucywgdGhpcy5pbmNyZW1lbnRhbFN0cmF0ZWd5LCB0aGlzLnByb2dyYW1TdHJhdGVneSwgdHJ1ZSwgdHJ1ZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRpY2tldCA9IGluY3JlbWVudGFsRnJvbUNvbXBpbGVyVGlja2V0KFxuICAgICAgICAgIHRoaXMuY29tcGlsZXIsIHByb2dyYW0sIHRoaXMuaW5jcmVtZW50YWxTdHJhdGVneSwgdGhpcy5wcm9ncmFtU3RyYXRlZ3ksXG4gICAgICAgICAgbW9kaWZpZWRSZXNvdXJjZUZpbGVzKTtcbiAgICB9XG4gICAgdGhpcy5jb21waWxlciA9IE5nQ29tcGlsZXIuZnJvbVRpY2tldCh0aWNrZXQsIHRoaXMuYWRhcHRlcik7XG4gICAgdGhpcy5sYXN0S25vd25Qcm9ncmFtID0gcHJvZ3JhbTtcbiAgICByZXR1cm4gdGhpcy5jb21waWxlcjtcbiAgfVxuXG4gIHJlZ2lzdGVyTGFzdEtub3duUHJvZ3JhbSgpIHtcbiAgICB0aGlzLmxhc3RLbm93blByb2dyYW0gPSB0aGlzLnByb2dyYW1TdHJhdGVneS5nZXRQcm9ncmFtKCk7XG4gIH1cbn1cbiJdfQ==
|