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 |
---|