source: trip-planner-front/node_modules/@angular/compiler-cli/ngcc/src/migrations/missing_injectable_migration.js

Last change on this file was 6a3a178, checked in by Ema <ema_spirova@…>, 3 years ago

initial commit

  • Property mode set to 100644
File size: 24.3 KB
Line 
1(function (factory) {
2 if (typeof module === "object" && typeof module.exports === "object") {
3 var v = factory(require, exports);
4 if (v !== undefined) module.exports = v;
5 }
6 else if (typeof define === "function" && define.amd) {
7 define("@angular/compiler-cli/ngcc/src/migrations/missing_injectable_migration", ["require", "exports", "tslib", "@angular/compiler-cli/src/ngtsc/annotations", "@angular/compiler-cli/src/ngtsc/imports", "@angular/compiler-cli/ngcc/src/migrations/utils"], factory);
8 }
9})(function (require, exports) {
10 "use strict";
11 Object.defineProperty(exports, "__esModule", { value: true });
12 exports.getAngularCoreDecoratorName = exports.MissingInjectableMigration = void 0;
13 var tslib_1 = require("tslib");
14 var annotations_1 = require("@angular/compiler-cli/src/ngtsc/annotations");
15 var imports_1 = require("@angular/compiler-cli/src/ngtsc/imports");
16 var utils_1 = require("@angular/compiler-cli/ngcc/src/migrations/utils");
17 /**
18 * Ensures that classes that are provided as an Angular service in either `NgModule.providers` or
19 * `Directive.providers`/`Component.viewProviders` are decorated with one of the `@Injectable`,
20 * `@Directive`, `@Component` or `@Pipe` decorators, adding an `@Injectable()` decorator when none
21 * are present.
22 *
23 * At least one decorator is now mandatory, as otherwise the compiler would not compile an
24 * injectable definition for the service. This is unlike View Engine, where having just an unrelated
25 * decorator may have been sufficient for the service to become injectable.
26 *
27 * In essence, this migration operates on classes that are themselves an NgModule, Directive or
28 * Component. Their metadata is statically evaluated so that their "providers"/"viewProviders"
29 * properties can be analyzed. For any provider that refers to an undecorated class, the class will
30 * be migrated to have an `@Injectable()` decorator.
31 *
32 * This implementation mirrors the "missing-injectable" schematic.
33 */
34 var MissingInjectableMigration = /** @class */ (function () {
35 function MissingInjectableMigration() {
36 }
37 MissingInjectableMigration.prototype.apply = function (clazz, host) {
38 var e_1, _a;
39 var decorators = host.reflectionHost.getDecoratorsOfDeclaration(clazz);
40 if (decorators === null) {
41 return null;
42 }
43 try {
44 for (var decorators_1 = tslib_1.__values(decorators), decorators_1_1 = decorators_1.next(); !decorators_1_1.done; decorators_1_1 = decorators_1.next()) {
45 var decorator = decorators_1_1.value;
46 var name = getAngularCoreDecoratorName(decorator);
47 if (name === 'NgModule') {
48 migrateNgModuleProviders(decorator, host);
49 }
50 else if (name === 'Directive') {
51 migrateDirectiveProviders(decorator, host, /* isComponent */ false);
52 }
53 else if (name === 'Component') {
54 migrateDirectiveProviders(decorator, host, /* isComponent */ true);
55 }
56 }
57 }
58 catch (e_1_1) { e_1 = { error: e_1_1 }; }
59 finally {
60 try {
61 if (decorators_1_1 && !decorators_1_1.done && (_a = decorators_1.return)) _a.call(decorators_1);
62 }
63 finally { if (e_1) throw e_1.error; }
64 }
65 return null;
66 };
67 return MissingInjectableMigration;
68 }());
69 exports.MissingInjectableMigration = MissingInjectableMigration;
70 /**
71 * Iterates through all `NgModule.providers` and adds the `@Injectable()` decorator to any provider
72 * that is not otherwise decorated.
73 */
74 function migrateNgModuleProviders(decorator, host) {
75 if (decorator.args === null || decorator.args.length !== 1) {
76 return;
77 }
78 var metadata = host.evaluator.evaluate(decorator.args[0], annotations_1.forwardRefResolver);
79 if (!(metadata instanceof Map)) {
80 return;
81 }
82 migrateProviders(metadata, 'providers', host);
83 // TODO(alxhub): we should probably also check for `ModuleWithProviders` here.
84 }
85 /**
86 * Iterates through all `Directive.providers` and if `isComponent` is set to true also
87 * `Component.viewProviders` and adds the `@Injectable()` decorator to any provider that is not
88 * otherwise decorated.
89 */
90 function migrateDirectiveProviders(decorator, host, isComponent) {
91 if (decorator.args === null || decorator.args.length !== 1) {
92 return;
93 }
94 var metadata = host.evaluator.evaluate(decorator.args[0], annotations_1.forwardRefResolver);
95 if (!(metadata instanceof Map)) {
96 return;
97 }
98 migrateProviders(metadata, 'providers', host);
99 if (isComponent) {
100 migrateProviders(metadata, 'viewProviders', host);
101 }
102 }
103 /**
104 * Given an object with decorator metadata, iterates through the list of providers to add
105 * `@Injectable()` to any provider that is not otherwise decorated.
106 */
107 function migrateProviders(metadata, field, host) {
108 var e_2, _a;
109 if (!metadata.has(field)) {
110 return;
111 }
112 var providers = metadata.get(field);
113 if (!Array.isArray(providers)) {
114 return;
115 }
116 try {
117 for (var providers_1 = tslib_1.__values(providers), providers_1_1 = providers_1.next(); !providers_1_1.done; providers_1_1 = providers_1.next()) {
118 var provider = providers_1_1.value;
119 migrateProvider(provider, host);
120 }
121 }
122 catch (e_2_1) { e_2 = { error: e_2_1 }; }
123 finally {
124 try {
125 if (providers_1_1 && !providers_1_1.done && (_a = providers_1.return)) _a.call(providers_1);
126 }
127 finally { if (e_2) throw e_2.error; }
128 }
129 }
130 /**
131 * Analyzes a single provider entry and determines the class that is required to have an
132 * `@Injectable()` decorator.
133 */
134 function migrateProvider(provider, host) {
135 var e_3, _a;
136 if (provider instanceof Map) {
137 if (!provider.has('provide') || provider.has('useValue') || provider.has('useFactory') ||
138 provider.has('useExisting')) {
139 return;
140 }
141 if (provider.has('useClass')) {
142 // {provide: ..., useClass: SomeClass, deps: [...]} does not require a decorator on SomeClass,
143 // as the provider itself configures 'deps'. Only if 'deps' is missing will this require a
144 // factory to exist on SomeClass.
145 if (!provider.has('deps')) {
146 migrateProviderClass(provider.get('useClass'), host);
147 }
148 }
149 else {
150 migrateProviderClass(provider.get('provide'), host);
151 }
152 }
153 else if (Array.isArray(provider)) {
154 try {
155 for (var provider_1 = tslib_1.__values(provider), provider_1_1 = provider_1.next(); !provider_1_1.done; provider_1_1 = provider_1.next()) {
156 var v = provider_1_1.value;
157 migrateProvider(v, host);
158 }
159 }
160 catch (e_3_1) { e_3 = { error: e_3_1 }; }
161 finally {
162 try {
163 if (provider_1_1 && !provider_1_1.done && (_a = provider_1.return)) _a.call(provider_1);
164 }
165 finally { if (e_3) throw e_3.error; }
166 }
167 }
168 else {
169 migrateProviderClass(provider, host);
170 }
171 }
172 /**
173 * Given a provider class, adds the `@Injectable()` decorator if no other relevant Angular decorator
174 * is present on the class.
175 */
176 function migrateProviderClass(provider, host) {
177 // Providers that do not refer to a class cannot be migrated.
178 if (!(provider instanceof imports_1.Reference)) {
179 return;
180 }
181 var clazz = provider.node;
182 if (utils_1.isClassDeclaration(clazz) && host.isInScope(clazz) && needsInjectableDecorator(clazz, host)) {
183 host.injectSyntheticDecorator(clazz, utils_1.createInjectableDecorator(clazz));
184 }
185 }
186 var NO_MIGRATE_DECORATORS = new Set(['Injectable', 'Directive', 'Component', 'Pipe']);
187 /**
188 * Determines if the given class needs to be decorated with `@Injectable()` based on whether it
189 * already has an Angular decorator applied.
190 */
191 function needsInjectableDecorator(clazz, host) {
192 var e_4, _a;
193 var decorators = host.getAllDecorators(clazz);
194 if (decorators === null) {
195 return true;
196 }
197 try {
198 for (var decorators_2 = tslib_1.__values(decorators), decorators_2_1 = decorators_2.next(); !decorators_2_1.done; decorators_2_1 = decorators_2.next()) {
199 var decorator = decorators_2_1.value;
200 var name = getAngularCoreDecoratorName(decorator);
201 if (name !== null && NO_MIGRATE_DECORATORS.has(name)) {
202 return false;
203 }
204 }
205 }
206 catch (e_4_1) { e_4 = { error: e_4_1 }; }
207 finally {
208 try {
209 if (decorators_2_1 && !decorators_2_1.done && (_a = decorators_2.return)) _a.call(decorators_2);
210 }
211 finally { if (e_4) throw e_4.error; }
212 }
213 return true;
214 }
215 /**
216 * Determines the original name of a decorator if it is from '@angular/core'. For other decorators,
217 * null is returned.
218 */
219 function getAngularCoreDecoratorName(decorator) {
220 if (decorator.import === null || decorator.import.from !== '@angular/core') {
221 return null;
222 }
223 return decorator.import.name;
224 }
225 exports.getAngularCoreDecoratorName = getAngularCoreDecoratorName;
226});
227//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWlzc2luZ19pbmplY3RhYmxlX21pZ3JhdGlvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL3BhY2thZ2VzL2NvbXBpbGVyLWNsaS9uZ2NjL3NyYy9taWdyYXRpb25zL21pc3NpbmdfaW5qZWN0YWJsZV9taWdyYXRpb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7OztJQVNBLDJFQUFrRTtJQUNsRSxtRUFBcUQ7SUFLckQseUVBQXNFO0lBRXRFOzs7Ozs7Ozs7Ozs7Ozs7O09BZ0JHO0lBQ0g7UUFBQTtRQW9CQSxDQUFDO1FBbkJDLDBDQUFLLEdBQUwsVUFBTSxLQUF1QixFQUFFLElBQW1COztZQUNoRCxJQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLDBCQUEwQixDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQ3pFLElBQUksVUFBVSxLQUFLLElBQUksRUFBRTtnQkFDdkIsT0FBTyxJQUFJLENBQUM7YUFDYjs7Z0JBRUQsS0FBd0IsSUFBQSxlQUFBLGlCQUFBLFVBQVUsQ0FBQSxzQ0FBQSw4REFBRTtvQkFBL0IsSUFBTSxTQUFTLHVCQUFBO29CQUNsQixJQUFNLElBQUksR0FBRywyQkFBMkIsQ0FBQyxTQUFTLENBQUMsQ0FBQztvQkFDcEQsSUFBSSxJQUFJLEtBQUssVUFBVSxFQUFFO3dCQUN2Qix3QkFBd0IsQ0FBQyxTQUFTLEVBQUUsSUFBSSxDQUFDLENBQUM7cUJBQzNDO3lCQUFNLElBQUksSUFBSSxLQUFLLFdBQVcsRUFBRTt3QkFDL0IseUJBQXlCLENBQUMsU0FBUyxFQUFFLElBQUksRUFBRSxpQkFBaUIsQ0FBQyxLQUFLLENBQUMsQ0FBQztxQkFDckU7eUJBQU0sSUFBSSxJQUFJLEtBQUssV0FBVyxFQUFFO3dCQUMvQix5QkFBeUIsQ0FBQyxTQUFTLEVBQUUsSUFBSSxFQUFFLGlCQUFpQixDQUFDLElBQUksQ0FBQyxDQUFDO3FCQUNwRTtpQkFDRjs7Ozs7Ozs7O1lB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SSxVQUFVLEtBQUssSUFBSSxFQUFFO1lBQ3ZCLE9BQU8sSUFBSSxDQUFDO1NBQ2I7O1lBRUQsS0FBd0IsSUFBQSxlQUFBLGlCQUFBLFVBQVUsQ0FBQSxzQ0FBQSw4REFBRTtnQkFBL0IsSUFBTSxTQUFTLHVCQUFBO2dCQUNsQixJQUFNLElBQUksR0FBRywyQkFBMkIsQ0FBQyxTQUFTLENBQUMsQ0FBQztnQkFDcEQsSUFBSSxJQUFJLEtBQUssSUFBSSxJQUFJLHFCQUFxQixDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsRUFBRTtvQkFDcEQsT0FBTyxLQUFLLENBQUM7aUJBQ2Q7YUFDRjs7Ozs7Ozs7O1FBRUQsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsU0FBZ0IsMkJBQTJCLENBQUMsU0FBb0I7UUFDOUQsSUFBSSxTQUFTLENBQUMsTUFBTSxLQUFLLElBQUksSUFBSSxTQUFTLENBQUMsTUFBTSxDQUFDLElBQUksS0FBSyxlQUFlLEVBQUU7WUFDMUUsT0FBTyxJQUFJLENBQUM7U0FDYjtRQUVELE9BQU8sU0FBUyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUM7SUFDL0IsQ0FBQztJQU5ELGtFQU1DIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IEdvb2dsZSBMTEMgQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqXG4gKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZVxuICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZVxuICovXG5pbXBvcnQgKiBhcyB0cyBmcm9tICd0eXBlc2NyaXB0JztcblxuaW1wb3J0IHtmb3J3YXJkUmVmUmVzb2x2ZXJ9IGZyb20gJy4uLy4uLy4uL3NyYy9uZ3RzYy9hbm5vdGF0aW9ucyc7XG5pbXBvcnQge1JlZmVyZW5jZX0gZnJvbSAnLi4vLi4vLi4vc3JjL25ndHNjL2ltcG9ydHMnO1xuaW1wb3J0IHtSZXNvbHZlZFZhbHVlLCBSZXNvbHZlZFZhbHVlTWFwfSBmcm9tICcuLi8uLi8uLi9zcmMvbmd0c2MvcGFydGlhbF9ldmFsdWF0b3InO1xuaW1wb3J0IHtDbGFzc0RlY2xhcmF0aW9uLCBEZWNvcmF0b3J9IGZyb20gJy4uLy4uLy4uL3NyYy9uZ3RzYy9yZWZsZWN0aW9uJztcblxuaW1wb3J0IHtNaWdyYXRpb24sIE1pZ3JhdGlvbkhvc3R9IGZyb20gJy4vbWlncmF0aW9uJztcbmltcG9ydCB7Y3JlYXRlSW5qZWN0YWJsZURlY29yYXRvciwgaXNDbGFzc0RlY2xhcmF0aW9ufSBmcm9tICcuL3V0aWxzJztcblxuLyoqXG4gKiBFbnN1cmVzIHRoYXQgY2xhc3NlcyB0aGF0IGFyZSBwcm92aWRlZCBhcyBhbiBBbmd1bGFyIHNlcnZpY2UgaW4gZWl0aGVyIGBOZ01vZHVsZS5wcm92aWRlcnNgIG9yXG4gKiBgRGlyZWN0aXZlLnByb3ZpZGVyc2AvYENvbXBvbmVudC52aWV3UHJvdmlkZXJzYCBhcmUgZGVjb3JhdGVkIHdpdGggb25lIG9mIHRoZSBgQEluamVjdGFibGVgLFxuICogYEBEaXJlY3RpdmVgLCBgQENvbXBvbmVudGAgb3IgYEBQaXBlYCBkZWNvcmF0b3JzLCBhZGRpbmcgYW4gYEBJbmplY3RhYmxlKClgIGRlY29yYXRvciB3aGVuIG5vbmVcbiAqIGFyZSBwcmVzZW50LlxuICpcbiAqIEF0IGxlYXN0IG9uZSBkZWNvcmF0b3IgaXMgbm93IG1hbmRhdG9yeSwgYXMgb3RoZXJ3aXNlIHRoZSBjb21waWxlciB3b3VsZCBub3QgY29tcGlsZSBhblxuICogaW5qZWN0YWJsZSBkZWZpbml0aW9uIGZvciB0aGUgc2VydmljZS4gVGhpcyBpcyB1bmxpa2UgVmlldyBFbmdpbmUsIHdoZXJlIGhhdmluZyBqdXN0IGFuIHVucmVsYXRlZFxuICogZGVjb3JhdG9yIG1heSBoYXZlIGJlZW4gc3VmZmljaWVudCBmb3IgdGhlIHNlcnZpY2UgdG8gYmVjb21lIGluamVjdGFibGUuXG4gKlxuICogSW4gZXNzZW5jZSwgdGhpcyBtaWdyYXRpb24gb3BlcmF0ZXMgb24gY2xhc3NlcyB0aGF0IGFyZSB0aGVtc2VsdmVzIGFuIE5nTW9kdWxlLCBEaXJlY3RpdmUgb3JcbiAqIENvbXBvbmVudC4gVGhlaXIgbWV0YWRhdGEgaXMgc3RhdGljYWxseSBldmFsdWF0ZWQgc28gdGhhdCB0aGVpciBcInByb3ZpZGVyc1wiL1widmlld1Byb3ZpZGVyc1wiXG4gKiBwcm9wZXJ0aWVzIGNhbiBiZSBhbmFseXplZC4gRm9yIGFueSBwcm92aWRlciB0aGF0IHJlZmVycyB0byBhbiB1bmRlY29yYXRlZCBjbGFzcywgdGhlIGNsYXNzIHdpbGxcbiAqIGJlIG1pZ3JhdGVkIHRvIGhhdmUgYW4gYEBJbmplY3RhYmxlKClgIGRlY29yYXRvci5cbiAqXG4gKiBUaGlzIGltcGxlbWVudGF0aW9uIG1pcnJvcnMgdGhlIFwibWlzc2luZy1pbmplY3RhYmxlXCIgc2NoZW1hdGljLlxuICovXG5leHBvcnQgY2xhc3MgTWlzc2luZ0luamVjdGFibGVNaWdyYXRpb24gaW1wbGVtZW50cyBNaWdyYXRpb24ge1xuICBhcHBseShjbGF6ejogQ2xhc3NEZWNsYXJhdGlvbiwgaG9zdDogTWlncmF0aW9uSG9zdCk6IHRzLkRpYWdub3N0aWN8bnVsbCB7XG4gICAgY29uc3QgZGVjb3JhdG9ycyA9IGhvc3QucmVmbGVjdGlvbkhvc3QuZ2V0RGVjb3JhdG9yc09mRGVjbGFyYXRpb24oY2xhenopO1xuICAgIGlmIChkZWNvcmF0b3JzID09PSBudWxsKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IGRlY29yYXRvciBvZiBkZWNvcmF0b3JzKSB7XG4gICAgICBjb25zdCBuYW1lID0gZ2V0QW5ndWxhckNvcmVEZWNvcmF0b3JOYW1lKGRlY29yYXRvcik7XG4gICAgICBpZiAobmFtZSA9PT0gJ05nTW9kdWxlJykge1xuICAgICAgICBtaWdyYXRlTmdNb2R1bGVQcm92aWRlcnMoZGVjb3JhdG9yLCBob3N0KTtcbiAgICAgIH0gZWxzZSBpZiAobmFtZSA9PT0gJ0RpcmVjdGl2ZScpIHtcbiAgICAgICAgbWlncmF0ZURpcmVjdGl2ZVByb3ZpZGVycyhkZWNvcmF0b3IsIGhvc3QsIC8qIGlzQ29tcG9uZW50ICovIGZhbHNlKTtcbiAgICAgIH0gZWxzZSBpZiAobmFtZSA9PT0gJ0NvbXBvbmVudCcpIHtcbiAgICAgICAgbWlncmF0ZURpcmVjdGl2ZVByb3ZpZGVycyhkZWNvcmF0b3IsIGhvc3QsIC8qIGlzQ29tcG9uZW50ICovIHRydWUpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBudWxsO1xuICB9XG59XG5cbi8qKlxuICogSXRlcmF0ZXMgdGhyb3VnaCBhbGwgYE5nTW9kdWxlLnByb3ZpZGVyc2AgYW5kIGFkZHMgdGhlIGBASW5qZWN0YWJsZSgpYCBkZWNvcmF0b3IgdG8gYW55IHByb3ZpZGVyXG4gKiB0aGF0IGlzIG5vdCBvdGhlcndpc2UgZGVjb3JhdGVkLlxuICovXG5mdW5jdGlvbiBtaWdyYXRlTmdNb2R1bGVQcm92aWRlcnMoZGVjb3JhdG9yOiBEZWNvcmF0b3IsIGhvc3Q6IE1pZ3JhdGlvbkhvc3QpOiB2b2lkIHtcbiAgaWYgKGRlY29yYXRvci5hcmdzID09PSBudWxsIHx8IGRlY29yYXRvci5hcmdzLmxlbmd0aCAhPT0gMSkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnN0IG1ldGFkYXRhID0gaG9zdC5ldmFsdWF0b3IuZXZhbHVhdGUoZGVjb3JhdG9yLmFyZ3NbMF0sIGZvcndhcmRSZWZSZXNvbHZlcik7XG4gIGlmICghKG1ldGFkYXRhIGluc3RhbmNlb2YgTWFwKSkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIG1pZ3JhdGVQcm92aWRlcnMobWV0YWRhdGEsICdwcm92aWRlcnMnLCBob3N0KTtcbiAgLy8gVE9ETyhhbHhodWIpOiB3ZSBzaG91bGQgcHJvYmFibHkgYWxzbyBjaGVjayBmb3IgYE1vZHVsZVdpdGhQcm92aWRlcnNgIGhlcmUuXG59XG5cbi8qKlxuICogSXRlcmF0ZXMgdGhyb3VnaCBhbGwgYERpcmVjdGl2ZS5wcm92aWRlcnNgIGFuZCBpZiBgaXNDb21wb25lbnRgIGlzIHNldCB0byB0cnVlIGFsc29cbiAqIGBDb21wb25lbnQudmlld1Byb3ZpZGVyc2AgYW5kIGFkZHMgdGhlIGBASW5qZWN0YWJsZSgpYCBkZWNvcmF0b3IgdG8gYW55IHByb3ZpZGVyIHRoYXQgaXMgbm90XG4gKiBvdGhlcndpc2UgZGVjb3JhdGVkLlxuICovXG5mdW5jdGlvbiBtaWdyYXRlRGlyZWN0aXZlUHJvdmlkZXJzKFxuICAgIGRlY29yYXRvcjogRGVjb3JhdG9yLCBob3N0OiBNaWdyYXRpb25Ib3N0LCBpc0NvbXBvbmVudDogYm9vbGVhbik6IHZvaWQge1xuICBpZiAoZGVjb3JhdG9yLmFyZ3MgPT09IG51bGwgfHwgZGVjb3JhdG9yLmFyZ3MubGVuZ3RoICE9PSAxKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY29uc3QgbWV0YWRhdGEgPSBob3N0LmV2YWx1YXRvci5ldmFsdWF0ZShkZWNvcmF0b3IuYXJnc1swXSwgZm9yd2FyZFJlZlJlc29sdmVyKTtcbiAgaWYgKCEobWV0YWRhdGEgaW5zdGFuY2VvZiBNYXApKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgbWlncmF0ZVByb3ZpZGVycyhtZXRhZGF0YSwgJ3Byb3ZpZGVycycsIGhvc3QpO1xuICBpZiAoaXNDb21wb25lbnQpIHtcbiAgICBtaWdyYXRlUHJvdmlkZXJzKG1ldGFkYXRhLCAndmlld1Byb3ZpZGVycycsIGhvc3QpO1xuICB9XG59XG5cbi8qKlxuICogR2l2ZW4gYW4gb2JqZWN0IHdpdGggZGVjb3JhdG9yIG1ldGFkYXRhLCBpdGVyYXRlcyB0aHJvdWdoIHRoZSBsaXN0IG9mIHByb3ZpZGVycyB0byBhZGRcbiAqIGBASW5qZWN0YWJsZSgpYCB0byBhbnkgcHJvdmlkZXIgdGhhdCBpcyBub3Qgb3RoZXJ3aXNlIGRlY29yYXRlZC5cbiAqL1xuZnVuY3Rpb24gbWlncmF0ZVByb3ZpZGVycyhtZXRhZGF0YTogUmVzb2x2ZWRWYWx1ZU1hcCwgZmllbGQ6IHN0cmluZywgaG9zdDogTWlncmF0aW9uSG9zdCk6IHZvaWQge1xuICBpZiAoIW1ldGFkYXRhLmhhcyhmaWVsZCkpIHtcbiAgICByZXR1cm47XG4gIH1cbiAgY29uc3QgcHJvdmlkZXJzID0gbWV0YWRhdGEuZ2V0KGZpZWxkKSE7XG4gIGlmICghQXJyYXkuaXNBcnJheShwcm92aWRlcnMpKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgZm9yIChjb25zdCBwcm92aWRlciBvZiBwcm92aWRlcnMpIHtcbiAgICBtaWdyYXRlUHJvdmlkZXIocHJvdmlkZXIsIGhvc3QpO1xuICB9XG59XG5cbi8qKlxuICogQW5hbHl6ZXMgYSBzaW5nbGUgcHJvdmlkZXIgZW50cnkgYW5kIGRldGVybWluZXMgdGhlIGNsYXNzIHRoYXQgaXMgcmVxdWlyZWQgdG8gaGF2ZSBhblxuICogYEBJbmplY3RhYmxlKClgIGRlY29yYXRvci5cbiAqL1xuZnVuY3Rpb24gbWlncmF0ZVByb3ZpZGVyKHByb3ZpZGVyOiBSZXNvbHZlZFZhbHVlLCBob3N0OiBNaWdyYXRpb25Ib3N0KTogdm9pZCB7XG4gIGlmIChwcm92aWRlciBpbnN0YW5jZW9mIE1hcCkge1xuICAgIGlmICghcHJvdmlkZXIuaGFzKCdwcm92aWRlJykgfHwgcHJvdmlkZXIuaGFzKCd1c2VWYWx1ZScpIHx8IHByb3ZpZGVyLmhhcygndXNlRmFjdG9yeScpIHx8XG4gICAgICAgIHByb3ZpZGVyLmhhcygndXNlRXhpc3RpbmcnKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAocHJvdmlkZXIuaGFzKCd1c2VDbGFzcycpKSB7XG4gICAgICAvLyB7cHJvdmlkZTogLi4uLCB1c2VDbGFzczogU29tZUNsYXNzLCBkZXBzOiBbLi4uXX0gZG9lcyBub3QgcmVxdWlyZSBhIGRlY29yYXRvciBvbiBTb21lQ2xhc3MsXG4gICAgICAvLyBhcyB0aGUgcHJvdmlkZXIgaXRzZWxmIGNvbmZpZ3VyZXMgJ2RlcHMnLiBPbmx5IGlmICdkZXBzJyBpcyBtaXNzaW5nIHdpbGwgdGhpcyByZXF1aXJlIGFcbiAgICAgIC8vIGZhY3RvcnkgdG8gZXhpc3Qgb24gU29tZUNsYXNzLlxuICAgICAgaWYgKCFwcm92aWRlci5oYXMoJ2RlcHMnKSkge1xuICAgICAgICBtaWdyYXRlUHJvdmlkZXJDbGFzcyhwcm92aWRlci5nZXQoJ3VzZUNsYXNzJykhLCBob3N0KTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgbWlncmF0ZVByb3ZpZGVyQ2xhc3MocHJvdmlkZXIuZ2V0KCdwcm92aWRlJykhLCBob3N0KTtcbiAgICB9XG4gIH0gZWxzZSBpZiAoQXJyYXkuaXNBcnJheShwcm92aWRlcikpIHtcbiAgICBmb3IgKGNvbnN0IHYgb2YgcHJvdmlkZXIpIHtcbiAgICAgIG1pZ3JhdGVQcm92aWRlcih2LCBob3N0KTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgbWlncmF0ZVByb3ZpZGVyQ2xhc3MocHJvdmlkZXIsIGhvc3QpO1xuICB9XG59XG5cbi8qKlxuICogR2l2ZW4gYSBwcm92aWRlciBjbGFzcywgYWRkcyB0aGUgYEBJbmplY3RhYmxlKClgIGRlY29yYXRvciBpZiBubyBvdGhlciByZWxldmFudCBBbmd1bGFyIGRlY29yYXRvclxuICogaXMgcHJlc2VudCBvbiB0aGUgY2xhc3MuXG4gKi9cbmZ1bmN0aW9uIG1pZ3JhdGVQcm92aWRlckNsYXNzKHByb3ZpZGVyOiBSZXNvbHZlZFZhbHVlLCBob3N0OiBNaWdyYXRpb25Ib3N0KTogdm9pZCB7XG4gIC8vIFByb3ZpZGVycyB0aGF0IGRvIG5vdCByZWZlciB0byBhIGNsYXNzIGNhbm5vdCBiZSBtaWdyYXRlZC5cbiAgaWYgKCEocHJvdmlkZXIgaW5zdGFuY2VvZiBSZWZlcmVuY2UpKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY29uc3QgY2xhenogPSBwcm92aWRlci5ub2RlO1xuICBpZiAoaXNDbGFzc0RlY2xhcmF0aW9uKGNsYXp6KSAmJiBob3N0LmlzSW5TY29wZShjbGF6eikgJiYgbmVlZHNJbmplY3RhYmxlRGVjb3JhdG9yKGNsYXp6LCBob3N0KSkge1xuICAgIGhvc3QuaW5qZWN0U3ludGhldGljRGVjb3JhdG9yKGNsYXp6LCBjcmVhdGVJbmplY3RhYmxlRGVjb3JhdG9yKGNsYXp6KSk7XG4gIH1cbn1cblxuY29uc3QgTk9fTUlHUkFURV9ERUNPUkFUT1JTID0gbmV3IFNldChbJ0luamVjdGFibGUnLCAnRGlyZWN0aXZlJywgJ0NvbXBvbmVudCcsICdQaXBlJ10pO1xuXG4vKipcbiAqIERldGVybWluZXMgaWYgdGhlIGdpdmVuIGNsYXNzIG5lZWRzIHRvIGJlIGRlY29yYXRlZCB3aXRoIGBASW5qZWN0YWJsZSgpYCBiYXNlZCBvbiB3aGV0aGVyIGl0XG4gKiBhbHJlYWR5IGhhcyBhbiBBbmd1bGFyIGRlY29yYXRvciBhcHBsaWVkLlxuICovXG5mdW5jdGlvbiBuZWVkc0luamVjdGFibGVEZWNvcmF0b3IoY2xheno6IENsYXNzRGVjbGFyYXRpb24sIGhvc3Q6IE1pZ3JhdGlvbkhvc3QpOiBib29sZWFuIHtcbiAgY29uc3QgZGVjb3JhdG9ycyA9IGhvc3QuZ2V0QWxsRGVjb3JhdG9ycyhjbGF6eik7XG4gIGlmIChkZWNvcmF0b3JzID09PSBudWxsKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBmb3IgKGNvbnN0IGRlY29yYXRvciBvZiBkZWNvcmF0b3JzKSB7XG4gICAgY29uc3QgbmFtZSA9IGdldEFuZ3VsYXJDb3JlRGVjb3JhdG9yTmFtZShkZWNvcmF0b3IpO1xuICAgIGlmIChuYW1lICE9PSBudWxsICYmIE5PX01JR1JBVEVfREVDT1JBVE9SUy5oYXMobmFtZSkpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gdHJ1ZTtcbn1cblxuLyoqXG4gKiBEZXRlcm1pbmVzIHRoZSBvcmlnaW5hbCBuYW1lIG9mIGEgZGVjb3JhdG9yIGlmIGl0IGlzIGZyb20gJ0Bhbmd1bGFyL2NvcmUnLiBGb3Igb3RoZXIgZGVjb3JhdG9ycyxcbiAqIG51bGwgaXMgcmV0dXJuZWQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRBbmd1bGFyQ29yZURlY29yYXRvck5hbWUoZGVjb3JhdG9yOiBEZWNvcmF0b3IpOiBzdHJpbmd8bnVsbCB7XG4gIGlmIChkZWNvcmF0b3IuaW1wb3J0ID09PSBudWxsIHx8IGRlY29yYXRvci5pbXBvcnQuZnJvbSAhPT0gJ0Bhbmd1bGFyL2NvcmUnKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICByZXR1cm4gZGVjb3JhdG9yLmltcG9ydC5uYW1lO1xufVxuIl19
Note: See TracBrowser for help on using the repository browser.