@angular/core 15.0.0-next.5 → 15.0.0-next.6
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/esm2020/src/application_ref.mjs +1 -1
- package/esm2020/src/core_private_export.mjs +2 -1
- package/esm2020/src/di/index.mjs +2 -2
- package/esm2020/src/di/interface/defs.mjs +1 -1
- package/esm2020/src/di/interface/provider.mjs +4 -2
- package/esm2020/src/di/provider_collection.mjs +30 -4
- package/esm2020/src/di/r3_injector.mjs +4 -6
- package/esm2020/src/metadata/directives.mjs +1 -1
- package/esm2020/src/metadata/ng_module.mjs +1 -1
- package/esm2020/src/render3/errors_di.mjs +9 -3
- package/esm2020/src/render3/jit/directive.mjs +2 -6
- package/esm2020/src/render3/ng_module_ref.mjs +1 -1
- package/esm2020/src/version.mjs +1 -1
- package/esm2020/testing/src/logger.mjs +3 -3
- package/esm2020/testing/src/ng_zone_mock.mjs +3 -3
- package/esm2020/testing/src/test_bed_compiler.mjs +29 -11
- package/fesm2015/core.mjs +52 -18
- package/fesm2015/core.mjs.map +1 -1
- package/fesm2015/testing.mjs +78 -22
- package/fesm2015/testing.mjs.map +1 -1
- package/fesm2020/core.mjs +52 -18
- package/fesm2020/core.mjs.map +1 -1
- package/fesm2020/testing.mjs +78 -22
- package/fesm2020/testing.mjs.map +1 -1
- package/index.d.ts +58 -13
- package/package.json +2 -2
- package/schematics/migrations/relative-link-resolution/index.d.ts +10 -0
- package/schematics/migrations/relative-link-resolution/index.js +68 -0
- package/schematics/migrations/relative-link-resolution/util.d.ts +20 -0
- package/schematics/migrations/relative-link-resolution/util.js +82 -0
- package/schematics/migrations/router-link-with-href/index.d.ts +10 -0
- package/schematics/migrations/router-link-with-href/index.js +70 -0
- package/schematics/migrations/router-link-with-href/util.d.ts +19 -0
- package/schematics/migrations/router-link-with-href/util.js +111 -0
- package/schematics/migrations.json +10 -0
- package/schematics/utils/typescript/imports.d.ts +10 -0
- package/schematics/utils/typescript/imports.js +17 -2
- package/testing/index.d.ts +1 -1
package/index.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* @license Angular v15.0.0-next.
|
|
2
|
+
* @license Angular v15.0.0-next.6
|
|
3
3
|
* (c) 2010-2022 Google LLC. https://angular.io/
|
|
4
4
|
* License: MIT
|
|
5
5
|
*/
|
|
@@ -1736,7 +1736,7 @@ export declare function createComponent<C>(component: Type<C>, options: {
|
|
|
1736
1736
|
* @publicApi
|
|
1737
1737
|
* @developerPreview
|
|
1738
1738
|
*/
|
|
1739
|
-
export declare function createEnvironmentInjector(providers: Array<Provider |
|
|
1739
|
+
export declare function createEnvironmentInjector(providers: Array<Provider | EnvironmentProviders>, parent: EnvironmentInjector, debugName?: string | null): EnvironmentInjector;
|
|
1740
1740
|
|
|
1741
1741
|
/**
|
|
1742
1742
|
* Returns a new NgModuleRef instance based on the NgModule class and parent injector provided.
|
|
@@ -2390,6 +2390,16 @@ export declare interface Directive {
|
|
|
2390
2390
|
* @developerPreview
|
|
2391
2391
|
*/
|
|
2392
2392
|
standalone?: boolean;
|
|
2393
|
+
/**
|
|
2394
|
+
* Standalone directives that should be applied to the host whenever the directive is matched.
|
|
2395
|
+
* By default none of the inputs or outputs of the host directives will be available on the host,
|
|
2396
|
+
* unless they are specified in the `inputs` or `outputs` properties.
|
|
2397
|
+
*/
|
|
2398
|
+
hostDirectives?: (Type<unknown> | {
|
|
2399
|
+
directive: Type<unknown>;
|
|
2400
|
+
inputs?: string[];
|
|
2401
|
+
outputs?: string[];
|
|
2402
|
+
})[];
|
|
2393
2403
|
}
|
|
2394
2404
|
|
|
2395
2405
|
/**
|
|
@@ -2767,6 +2777,25 @@ export declare abstract class EnvironmentInjector implements Injector {
|
|
|
2767
2777
|
abstract destroy(): void;
|
|
2768
2778
|
}
|
|
2769
2779
|
|
|
2780
|
+
/**
|
|
2781
|
+
* Encapsulated `Provider`s that are only accepted during creation of an `EnvironmentInjector` (e.g.
|
|
2782
|
+
* in an `NgModule`).
|
|
2783
|
+
*
|
|
2784
|
+
* Using this wrapper type prevents providers which are only designed to work in
|
|
2785
|
+
* application/environment injectors from being accidentally included in
|
|
2786
|
+
* `@Component.providers` and ending up in a component injector.
|
|
2787
|
+
*
|
|
2788
|
+
* This wrapper type prevents access to the `Provider`s inside.
|
|
2789
|
+
*
|
|
2790
|
+
* @see `makeEnvironmentProviders`
|
|
2791
|
+
* @see `importProvidersFrom`
|
|
2792
|
+
*
|
|
2793
|
+
* @publicApi
|
|
2794
|
+
*/
|
|
2795
|
+
export declare type EnvironmentProviders = {
|
|
2796
|
+
ɵbrand: 'EnvironmentProviders';
|
|
2797
|
+
};
|
|
2798
|
+
|
|
2770
2799
|
|
|
2771
2800
|
/**
|
|
2772
2801
|
* Provides a hook for centralized exception handling.
|
|
@@ -3650,11 +3679,9 @@ declare const ID = 20;
|
|
|
3650
3679
|
* @see `importProvidersFrom`
|
|
3651
3680
|
*
|
|
3652
3681
|
* @publicApi
|
|
3653
|
-
* @
|
|
3682
|
+
* @deprecated replaced by `EnvironmentProviders`
|
|
3654
3683
|
*/
|
|
3655
|
-
export declare
|
|
3656
|
-
ɵproviders: Provider[];
|
|
3657
|
-
}
|
|
3684
|
+
export declare type ImportedNgModuleProviders = EnvironmentProviders;
|
|
3658
3685
|
|
|
3659
3686
|
/**
|
|
3660
3687
|
* Collects providers from all NgModules and standalone components, including transitively imported
|
|
@@ -3697,7 +3724,7 @@ export declare interface ImportedNgModuleProviders {
|
|
|
3697
3724
|
* @publicApi
|
|
3698
3725
|
* @developerPreview
|
|
3699
3726
|
*/
|
|
3700
|
-
export declare function importProvidersFrom(...sources: ImportProvidersSource[]):
|
|
3727
|
+
export declare function importProvidersFrom(...sources: ImportProvidersSource[]): EnvironmentProviders;
|
|
3701
3728
|
|
|
3702
3729
|
/**
|
|
3703
3730
|
* A source of providers for the `importProvidersFrom` function.
|
|
@@ -4165,7 +4192,7 @@ export declare interface InjectorType<T> extends Type<T> {
|
|
|
4165
4192
|
*/
|
|
4166
4193
|
declare interface InjectorTypeWithProviders<T> {
|
|
4167
4194
|
ngModule: InjectorType<T>;
|
|
4168
|
-
providers?: (Type<any> | ValueProvider | ExistingProvider | FactoryProvider | ConstructorProvider | StaticClassProvider | ClassProvider | any[])[];
|
|
4195
|
+
providers?: (Type<any> | ValueProvider | ExistingProvider | FactoryProvider | ConstructorProvider | StaticClassProvider | ClassProvider | EnvironmentProviders | any[])[];
|
|
4169
4196
|
}
|
|
4170
4197
|
|
|
4171
4198
|
/**
|
|
@@ -5152,6 +5179,12 @@ declare const enum LViewFlags {
|
|
|
5152
5179
|
IndexWithinInitPhaseReset = 2047
|
|
5153
5180
|
}
|
|
5154
5181
|
|
|
5182
|
+
/**
|
|
5183
|
+
* Wrap an array of `Provider`s into `EnvironmentProviders`, preventing them from being accidentally
|
|
5184
|
+
* referenced in `@Component in a component injector.
|
|
5185
|
+
*/
|
|
5186
|
+
export declare function makeEnvironmentProviders(providers: Provider[]): EnvironmentProviders;
|
|
5187
|
+
|
|
5155
5188
|
/**
|
|
5156
5189
|
* Use this enum at bootstrap as an option of `bootstrapModule` to define the strategy
|
|
5157
5190
|
* that the compiler should use in case of missing translations:
|
|
@@ -5207,7 +5240,7 @@ export declare class ModuleWithComponentFactories<T> {
|
|
|
5207
5240
|
*/
|
|
5208
5241
|
export declare interface ModuleWithProviders<T> {
|
|
5209
5242
|
ngModule: Type<T>;
|
|
5210
|
-
providers?: Provider
|
|
5243
|
+
providers?: Array<Provider | EnvironmentProviders>;
|
|
5211
5244
|
}
|
|
5212
5245
|
|
|
5213
5246
|
declare const MOVED_VIEWS = 9;
|
|
@@ -5276,7 +5309,7 @@ export declare interface NgModule {
|
|
|
5276
5309
|
* }
|
|
5277
5310
|
* ```
|
|
5278
5311
|
*/
|
|
5279
|
-
providers?: Provider
|
|
5312
|
+
providers?: Array<Provider | EnvironmentProviders>;
|
|
5280
5313
|
/**
|
|
5281
5314
|
* The set of components, directives, and pipes ([declarables](guide/glossary#declarable))
|
|
5282
5315
|
* that belong to this module.
|
|
@@ -6505,7 +6538,7 @@ declare class R3Injector extends EnvironmentInjector {
|
|
|
6505
6538
|
get destroyed(): boolean;
|
|
6506
6539
|
private _destroyed;
|
|
6507
6540
|
private injectorDefTypes;
|
|
6508
|
-
constructor(providers: Array<Provider |
|
|
6541
|
+
constructor(providers: Array<Provider | EnvironmentProviders>, parent: Injector, source: string | null, scopes: Set<InjectorScope>);
|
|
6509
6542
|
/**
|
|
6510
6543
|
* Destroy the injector and release references to every instance or provider associated with it.
|
|
6511
6544
|
*
|
|
@@ -10442,10 +10475,20 @@ export declare const ɵINJECTOR_SCOPE: InjectionToken<InjectorScope | null>;
|
|
|
10442
10475
|
*/
|
|
10443
10476
|
export declare function ɵinternalCreateApplication(config: {
|
|
10444
10477
|
rootComponent?: Type<unknown>;
|
|
10445
|
-
appProviders?: Array<Provider |
|
|
10478
|
+
appProviders?: Array<Provider | EnvironmentProviders>;
|
|
10446
10479
|
platformProviders?: Provider[];
|
|
10447
10480
|
}): Promise<ApplicationRef>;
|
|
10448
10481
|
|
|
10482
|
+
export declare interface ɵInternalEnvironmentProviders extends EnvironmentProviders {
|
|
10483
|
+
ɵproviders: Provider[];
|
|
10484
|
+
/**
|
|
10485
|
+
* If present, indicates that the `EnvironmentProviders` were derived from NgModule providers.
|
|
10486
|
+
*
|
|
10487
|
+
* This is used to produce clearer error messages.
|
|
10488
|
+
*/
|
|
10489
|
+
ɵfromNgModule?: true;
|
|
10490
|
+
}
|
|
10491
|
+
|
|
10449
10492
|
export declare function ɵisBoundToModule<C>(cf: ComponentFactory<C>): boolean;
|
|
10450
10493
|
|
|
10451
10494
|
/**
|
|
@@ -10457,6 +10500,8 @@ export declare function ɵisBoundToModule<C>(cf: ComponentFactory<C>): boolean;
|
|
|
10457
10500
|
*/
|
|
10458
10501
|
export declare function ɵisDefaultChangeDetectionStrategy(changeDetectionStrategy: ChangeDetectionStrategy): boolean;
|
|
10459
10502
|
|
|
10503
|
+
export declare function ɵisEnvironmentProviders(value: Provider | ɵInternalEnvironmentProviders): value is ɵInternalEnvironmentProviders;
|
|
10504
|
+
|
|
10460
10505
|
export declare function ɵisInjectable(type: any): boolean;
|
|
10461
10506
|
|
|
10462
10507
|
export declare function ɵisListLikeIterable(obj: any): boolean;
|
|
@@ -12956,7 +13001,7 @@ export declare type ɵɵInjectorDeclaration<T> = unknown;
|
|
|
12956
13001
|
* @codeGenApi
|
|
12957
13002
|
*/
|
|
12958
13003
|
export declare interface ɵɵInjectorDef<T> {
|
|
12959
|
-
providers: (Type<any> | ValueProvider | ExistingProvider | FactoryProvider | ConstructorProvider | StaticClassProvider | ClassProvider | any[])[];
|
|
13004
|
+
providers: (Type<any> | ValueProvider | ExistingProvider | FactoryProvider | ConstructorProvider | StaticClassProvider | ClassProvider | EnvironmentProviders | any[])[];
|
|
12960
13005
|
imports: (InjectorType<any> | InjectorTypeWithProviders<any>)[];
|
|
12961
13006
|
}
|
|
12962
13007
|
|
package/package.json
CHANGED
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@angular/core",
|
|
3
|
-
"version": "15.0.0-next.
|
|
3
|
+
"version": "15.0.0-next.6",
|
|
4
4
|
"description": "Angular - the core framework",
|
|
5
5
|
"author": "angular",
|
|
6
6
|
"license": "MIT",
|
|
7
7
|
"engines": {
|
|
8
|
-
"node": "^14.
|
|
8
|
+
"node": "^14.20.0 || ^16.13.0 || >=18.10.0"
|
|
9
9
|
},
|
|
10
10
|
"exports": {
|
|
11
11
|
"./schematics/*": {
|
|
@@ -0,0 +1,10 @@
|
|
|
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
|
+
/// <amd-module name="@angular/core/schematics/migrations/relative-link-resolution" />
|
|
9
|
+
import { Rule } from '@angular-devkit/schematics';
|
|
10
|
+
export default function (): Rule;
|
|
@@ -0,0 +1,68 @@
|
|
|
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
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
9
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
10
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
11
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
12
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
13
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
14
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
15
|
+
});
|
|
16
|
+
};
|
|
17
|
+
(function (factory) {
|
|
18
|
+
if (typeof module === "object" && typeof module.exports === "object") {
|
|
19
|
+
var v = factory(require, exports);
|
|
20
|
+
if (v !== undefined) module.exports = v;
|
|
21
|
+
}
|
|
22
|
+
else if (typeof define === "function" && define.amd) {
|
|
23
|
+
define("@angular/core/schematics/migrations/relative-link-resolution", ["require", "exports", "@angular-devkit/schematics", "path", "@angular/core/schematics/utils/project_tsconfig_paths", "@angular/core/schematics/utils/typescript/compiler_host", "@angular/core/schematics/migrations/relative-link-resolution/util"], factory);
|
|
24
|
+
}
|
|
25
|
+
})(function (require, exports) {
|
|
26
|
+
"use strict";
|
|
27
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
28
|
+
const schematics_1 = require("@angular-devkit/schematics");
|
|
29
|
+
const path_1 = require("path");
|
|
30
|
+
const project_tsconfig_paths_1 = require("@angular/core/schematics/utils/project_tsconfig_paths");
|
|
31
|
+
const compiler_host_1 = require("@angular/core/schematics/utils/typescript/compiler_host");
|
|
32
|
+
const util_1 = require("@angular/core/schematics/migrations/relative-link-resolution/util");
|
|
33
|
+
function default_1() {
|
|
34
|
+
return (tree) => __awaiter(this, void 0, void 0, function* () {
|
|
35
|
+
const { buildPaths, testPaths } = yield (0, project_tsconfig_paths_1.getProjectTsConfigPaths)(tree);
|
|
36
|
+
const basePath = process.cwd();
|
|
37
|
+
const allPaths = [...buildPaths, ...testPaths];
|
|
38
|
+
if (!allPaths.length) {
|
|
39
|
+
throw new schematics_1.SchematicsException('Could not find any tsconfig file. ' +
|
|
40
|
+
'Cannot run a migration to cleanup the deprecated `relativeLinkResolution` config option.');
|
|
41
|
+
}
|
|
42
|
+
for (const tsconfigPath of allPaths) {
|
|
43
|
+
runRelativeLinkResolutionMigration(tree, tsconfigPath, basePath);
|
|
44
|
+
}
|
|
45
|
+
});
|
|
46
|
+
}
|
|
47
|
+
exports.default = default_1;
|
|
48
|
+
function runRelativeLinkResolutionMigration(tree, tsconfigPath, basePath) {
|
|
49
|
+
const { program } = (0, compiler_host_1.createMigrationProgram)(tree, tsconfigPath, basePath);
|
|
50
|
+
const sourceFiles = program.getSourceFiles().filter(sourceFile => (0, compiler_host_1.canMigrateFile)(basePath, sourceFile, program));
|
|
51
|
+
for (const sourceFile of sourceFiles) {
|
|
52
|
+
let update = null;
|
|
53
|
+
const rewriter = (startPos, origLength, text) => {
|
|
54
|
+
if (update === null) {
|
|
55
|
+
// Lazily initialize update, because most files will not require migration.
|
|
56
|
+
update = tree.beginUpdate((0, path_1.relative)(basePath, sourceFile.fileName));
|
|
57
|
+
}
|
|
58
|
+
update.remove(startPos, origLength);
|
|
59
|
+
update.insertLeft(startPos, text);
|
|
60
|
+
};
|
|
61
|
+
(0, util_1.migrateFile)(sourceFile, rewriter);
|
|
62
|
+
if (update !== null) {
|
|
63
|
+
tree.commitUpdate(update);
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
});
|
|
68
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9jb3JlL3NjaGVtYXRpY3MvbWlncmF0aW9ucy9yZWxhdGl2ZS1saW5rLXJlc29sdXRpb24vaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7OztHQU1HOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7SUFFSCwyREFBMkY7SUFDM0YsK0JBQThCO0lBRTlCLGtHQUEyRTtJQUMzRSwyRkFBNEY7SUFFNUYsNEZBQW1DO0lBRW5DO1FBQ0UsT0FBTyxDQUFPLElBQVUsRUFBRSxFQUFFO1lBQzFCLE1BQU0sRUFBQyxVQUFVLEVBQUUsU0FBUyxFQUFDLEdBQUcsTUFBTSxJQUFBLGdEQUF1QixFQUFDLElBQUksQ0FBQyxDQUFDO1lBQ3BFLE1BQU0sUUFBUSxHQUFHLE9BQU8sQ0FBQyxHQUFHLEVBQUUsQ0FBQztZQUMvQixNQUFNLFFBQVEsR0FBRyxDQUFDLEdBQUcsVUFBVSxFQUFFLEdBQUcsU0FBUyxDQUFDLENBQUM7WUFFL0MsSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLEVBQUU7Z0JBQ3BCLE1BQU0sSUFBSSxnQ0FBbUIsQ0FDekIsb0NBQW9DO29CQUNwQywwRkFBMEYsQ0FBQyxDQUFDO2FBQ2pHO1lBRUQsS0FBSyxNQUFNLFlBQVksSUFBSSxRQUFRLEVBQUU7Z0JBQ25DLGtDQUFrQyxDQUFDLElBQUksRUFBRSxZQUFZLEVBQUUsUUFBUSxDQUFDLENBQUM7YUFDbEU7UUFDSCxDQUFDLENBQUEsQ0FBQztJQUNKLENBQUM7SUFoQkQsNEJBZ0JDO0lBRUQsU0FBUyxrQ0FBa0MsQ0FBQyxJQUFVLEVBQUUsWUFBb0IsRUFBRSxRQUFnQjtRQUM1RixNQUFNLEVBQUMsT0FBTyxFQUFDLEdBQUcsSUFBQSxzQ0FBc0IsRUFBQyxJQUFJLEVBQUUsWUFBWSxFQUFFLFFBQVEsQ0FBQyxDQUFDO1FBQ3ZFLE1BQU0sV0FBVyxHQUNiLE9BQU8sQ0FBQyxjQUFjLEVBQUUsQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLEVBQUUsQ0FBQyxJQUFBLDhCQUFjLEVBQUMsUUFBUSxFQUFFLFVBQVUsRUFBRSxPQUFPLENBQUMsQ0FBQyxDQUFDO1FBRWpHLEtBQUssTUFBTSxVQUFVLElBQUksV0FBVyxFQUFFO1lBQ3BDLElBQUksTUFBTSxHQUF3QixJQUFJLENBQUM7WUFFdkMsTUFBTSxRQUFRLEdBQUcsQ0FBQyxRQUFnQixFQUFFLFVBQWtCLEVBQUUsSUFBWSxFQUFFLEVBQUU7Z0JBQ3RFLElBQUksTUFBTSxLQUFLLElBQUksRUFBRTtvQkFDbkIsMkVBQTJFO29CQUMzRSxNQUFNLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFBLGVBQVEsRUFBQyxRQUFRLEVBQUUsVUFBVSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUM7aUJBQ3BFO2dCQUNELE1BQU0sQ0FBQyxNQUFNLENBQUMsUUFBUSxFQUFFLFVBQVUsQ0FBQyxDQUFDO2dCQUNwQyxNQUFNLENBQUMsVUFBVSxDQUFDLFFBQVEsRUFBRSxJQUFJLENBQUMsQ0FBQztZQUNwQyxDQUFDLENBQUM7WUFFRixJQUFBLGtCQUFXLEVBQUMsVUFBVSxFQUFFLFFBQVEsQ0FBQyxDQUFDO1lBRWxDLElBQUksTUFBTSxLQUFLLElBQUksRUFBRTtnQkFDbkIsSUFBSSxDQUFDLFlBQVksQ0FBQyxNQUFNLENBQUMsQ0FBQzthQUMzQjtTQUNGO0lBQ0gsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCBHb29nbGUgTExDIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKlxuICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmVcbiAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2VcbiAqL1xuXG5pbXBvcnQge1J1bGUsIFNjaGVtYXRpY3NFeGNlcHRpb24sIFRyZWUsIFVwZGF0ZVJlY29yZGVyfSBmcm9tICdAYW5ndWxhci1kZXZraXQvc2NoZW1hdGljcyc7XG5pbXBvcnQge3JlbGF0aXZlfSBmcm9tICdwYXRoJztcblxuaW1wb3J0IHtnZXRQcm9qZWN0VHNDb25maWdQYXRoc30gZnJvbSAnLi4vLi4vdXRpbHMvcHJvamVjdF90c2NvbmZpZ19wYXRocyc7XG5pbXBvcnQge2Nhbk1pZ3JhdGVGaWxlLCBjcmVhdGVNaWdyYXRpb25Qcm9ncmFtfSBmcm9tICcuLi8uLi91dGlscy90eXBlc2NyaXB0L2NvbXBpbGVyX2hvc3QnO1xuXG5pbXBvcnQge21pZ3JhdGVGaWxlfSBmcm9tICcuL3V0aWwnO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbigpOiBSdWxlIHtcbiAgcmV0dXJuIGFzeW5jICh0cmVlOiBUcmVlKSA9PiB7XG4gICAgY29uc3Qge2J1aWxkUGF0aHMsIHRlc3RQYXRoc30gPSBhd2FpdCBnZXRQcm9qZWN0VHNDb25maWdQYXRocyh0cmVlKTtcbiAgICBjb25zdCBiYXNlUGF0aCA9IHByb2Nlc3MuY3dkKCk7XG4gICAgY29uc3QgYWxsUGF0aHMgPSBbLi4uYnVpbGRQYXRocywgLi4udGVzdFBhdGhzXTtcblxuICAgIGlmICghYWxsUGF0aHMubGVuZ3RoKSB7XG4gICAgICB0aHJvdyBuZXcgU2NoZW1hdGljc0V4Y2VwdGlvbihcbiAgICAgICAgICAnQ291bGQgbm90IGZpbmQgYW55IHRzY29uZmlnIGZpbGUuICcgK1xuICAgICAgICAgICdDYW5ub3QgcnVuIGEgbWlncmF0aW9uIHRvIGNsZWFudXAgdGhlIGRlcHJlY2F0ZWQgYHJlbGF0aXZlTGlua1Jlc29sdXRpb25gIGNvbmZpZyBvcHRpb24uJyk7XG4gICAgfVxuXG4gICAgZm9yIChjb25zdCB0c2NvbmZpZ1BhdGggb2YgYWxsUGF0aHMpIHtcbiAgICAgIHJ1blJlbGF0aXZlTGlua1Jlc29sdXRpb25NaWdyYXRpb24odHJlZSwgdHNjb25maWdQYXRoLCBiYXNlUGF0aCk7XG4gICAgfVxuICB9O1xufVxuXG5mdW5jdGlvbiBydW5SZWxhdGl2ZUxpbmtSZXNvbHV0aW9uTWlncmF0aW9uKHRyZWU6IFRyZWUsIHRzY29uZmlnUGF0aDogc3RyaW5nLCBiYXNlUGF0aDogc3RyaW5nKSB7XG4gIGNvbnN0IHtwcm9ncmFtfSA9IGNyZWF0ZU1pZ3JhdGlvblByb2dyYW0odHJlZSwgdHNjb25maWdQYXRoLCBiYXNlUGF0aCk7XG4gIGNvbnN0IHNvdXJjZUZpbGVzID1cbiAgICAgIHByb2dyYW0uZ2V0U291cmNlRmlsZXMoKS5maWx0ZXIoc291cmNlRmlsZSA9PiBjYW5NaWdyYXRlRmlsZShiYXNlUGF0aCwgc291cmNlRmlsZSwgcHJvZ3JhbSkpO1xuXG4gIGZvciAoY29uc3Qgc291cmNlRmlsZSBvZiBzb3VyY2VGaWxlcykge1xuICAgIGxldCB1cGRhdGU6IFVwZGF0ZVJlY29yZGVyfG51bGwgPSBudWxsO1xuXG4gICAgY29uc3QgcmV3cml0ZXIgPSAoc3RhcnRQb3M6IG51bWJlciwgb3JpZ0xlbmd0aDogbnVtYmVyLCB0ZXh0OiBzdHJpbmcpID0+IHtcbiAgICAgIGlmICh1cGRhdGUgPT09IG51bGwpIHtcbiAgICAgICAgLy8gTGF6aWx5IGluaXRpYWxpemUgdXBkYXRlLCBiZWNhdXNlIG1vc3QgZmlsZXMgd2lsbCBub3QgcmVxdWlyZSBtaWdyYXRpb24uXG4gICAgICAgIHVwZGF0ZSA9IHRyZWUuYmVnaW5VcGRhdGUocmVsYXRpdmUoYmFzZVBhdGgsIHNvdXJjZUZpbGUuZmlsZU5hbWUpKTtcbiAgICAgIH1cbiAgICAgIHVwZGF0ZS5yZW1vdmUoc3RhcnRQb3MsIG9yaWdMZW5ndGgpO1xuICAgICAgdXBkYXRlLmluc2VydExlZnQoc3RhcnRQb3MsIHRleHQpO1xuICAgIH07XG5cbiAgICBtaWdyYXRlRmlsZShzb3VyY2VGaWxlLCByZXdyaXRlcik7XG5cbiAgICBpZiAodXBkYXRlICE9PSBudWxsKSB7XG4gICAgICB0cmVlLmNvbW1pdFVwZGF0ZSh1cGRhdGUpO1xuICAgIH1cbiAgfVxufVxuIl19
|
|
@@ -0,0 +1,20 @@
|
|
|
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
|
+
/// <amd-module name="@angular/core/schematics/migrations/relative-link-resolution/util" />
|
|
9
|
+
import ts from 'typescript';
|
|
10
|
+
export interface RewriteEntity {
|
|
11
|
+
startPos: number;
|
|
12
|
+
width: number;
|
|
13
|
+
replacement: string;
|
|
14
|
+
}
|
|
15
|
+
export interface MigratableNode {
|
|
16
|
+
objectLiteral: ts.ObjectLiteralExpression;
|
|
17
|
+
property: ts.ObjectLiteralElementLike;
|
|
18
|
+
}
|
|
19
|
+
export declare type RewriteFn = (startPos: number, origLength: number, text: string) => void;
|
|
20
|
+
export declare function migrateFile(sourceFile: ts.SourceFile, rewriteFn: RewriteFn): void;
|
|
@@ -0,0 +1,82 @@
|
|
|
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
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
9
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
10
|
+
};
|
|
11
|
+
(function (factory) {
|
|
12
|
+
if (typeof module === "object" && typeof module.exports === "object") {
|
|
13
|
+
var v = factory(require, exports);
|
|
14
|
+
if (v !== undefined) module.exports = v;
|
|
15
|
+
}
|
|
16
|
+
else if (typeof define === "function" && define.amd) {
|
|
17
|
+
define("@angular/core/schematics/migrations/relative-link-resolution/util", ["require", "exports", "typescript"], factory);
|
|
18
|
+
}
|
|
19
|
+
})(function (require, exports) {
|
|
20
|
+
"use strict";
|
|
21
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
22
|
+
exports.migrateFile = void 0;
|
|
23
|
+
const typescript_1 = __importDefault(require("typescript"));
|
|
24
|
+
const relativeLinkResolution = 'relativeLinkResolution';
|
|
25
|
+
const knownConfigValues = new Set([`'legacy'`, `'corrected'`]);
|
|
26
|
+
function migrateFile(sourceFile, rewriteFn) {
|
|
27
|
+
let rewrites = [];
|
|
28
|
+
const usages = getUsages(sourceFile);
|
|
29
|
+
for (const { objectLiteral, property } of usages) {
|
|
30
|
+
const replacementNode = typescript_1.default.factory.updateObjectLiteralExpression(objectLiteral, objectLiteral.properties.filter(prop => prop !== property));
|
|
31
|
+
const printer = typescript_1.default.createPrinter();
|
|
32
|
+
const replacementText = printer.printNode(typescript_1.default.EmitHint.Unspecified, replacementNode, sourceFile);
|
|
33
|
+
rewrites.push({
|
|
34
|
+
startPos: objectLiteral.getStart(),
|
|
35
|
+
width: objectLiteral.getWidth(),
|
|
36
|
+
replacement: replacementText,
|
|
37
|
+
});
|
|
38
|
+
}
|
|
39
|
+
// Process rewrites last-to-first (based on start pos) to avoid offset shifts during rewrites.
|
|
40
|
+
rewrites = sortByStartPosDescending(rewrites);
|
|
41
|
+
for (const rewrite of rewrites) {
|
|
42
|
+
rewriteFn(rewrite.startPos, rewrite.width, rewrite.replacement);
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
exports.migrateFile = migrateFile;
|
|
46
|
+
function getUsages(sourceFile) {
|
|
47
|
+
const usages = [];
|
|
48
|
+
const visitNode = (node) => {
|
|
49
|
+
if (typescript_1.default.isObjectLiteralExpression(node)) {
|
|
50
|
+
// Look for patterns like the following:
|
|
51
|
+
// ```
|
|
52
|
+
// { ... relativeLinkResolution: 'legacy', ... }
|
|
53
|
+
// ```
|
|
54
|
+
// or:
|
|
55
|
+
// ```
|
|
56
|
+
// { ... relativeLinkResolution: 'corrected', ... }
|
|
57
|
+
// ```
|
|
58
|
+
// If the value is unknown (i.e. not 'legacy' or 'corrected'),
|
|
59
|
+
// do not attempt to rewrite (this might be an application-specific
|
|
60
|
+
// configuration, not a part of Router).
|
|
61
|
+
const property = node.properties.find(prop => typescript_1.default.isPropertyAssignment(prop) && typescript_1.default.isIdentifier(prop.name) &&
|
|
62
|
+
prop.name.text === relativeLinkResolution &&
|
|
63
|
+
knownConfigValues.has(prop.initializer.getText()));
|
|
64
|
+
if (property) {
|
|
65
|
+
usages.push({ objectLiteral: node, property });
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
typescript_1.default.forEachChild(node, visitNode);
|
|
69
|
+
};
|
|
70
|
+
typescript_1.default.forEachChild(sourceFile, visitNode);
|
|
71
|
+
return usages;
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* Sort all found usages based on their start positions in the source file in descending order (i.e.
|
|
75
|
+
* last usage goes first on the list, etc). This is needed to avoid shifting offsets in the source
|
|
76
|
+
* file (in case there are multiple usages) as we rewrite symbols.
|
|
77
|
+
*/
|
|
78
|
+
function sortByStartPosDescending(rewrites) {
|
|
79
|
+
return rewrites.sort((entityA, entityB) => entityB.startPos - entityA.startPos);
|
|
80
|
+
}
|
|
81
|
+
});
|
|
82
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL3BhY2thZ2VzL2NvcmUvc2NoZW1hdGljcy9taWdyYXRpb25zL3JlbGF0aXZlLWxpbmstcmVzb2x1dGlvbi91dGlsLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7R0FNRzs7Ozs7Ozs7Ozs7Ozs7OztJQUVILDREQUE0QjtJQUU1QixNQUFNLHNCQUFzQixHQUFHLHdCQUF3QixDQUFDO0lBQ3hELE1BQU0saUJBQWlCLEdBQUcsSUFBSSxHQUFHLENBQUMsQ0FBQyxVQUFVLEVBQUUsYUFBYSxDQUFDLENBQUMsQ0FBQztJQWUvRCxTQUFnQixXQUFXLENBQUMsVUFBeUIsRUFBRSxTQUFvQjtRQUN6RSxJQUFJLFFBQVEsR0FBb0IsRUFBRSxDQUFDO1FBQ25DLE1BQU0sTUFBTSxHQUFHLFNBQVMsQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUNyQyxLQUFLLE1BQU0sRUFBQyxhQUFhLEVBQUUsUUFBUSxFQUFDLElBQUksTUFBTSxFQUFFO1lBQzlDLE1BQU0sZUFBZSxHQUFHLG9CQUFFLENBQUMsT0FBTyxDQUFDLDZCQUE2QixDQUM1RCxhQUFhLEVBQUUsYUFBYSxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxJQUFJLEtBQUssUUFBUSxDQUFDLENBQUMsQ0FBQztZQUMvRSxNQUFNLE9BQU8sR0FBRyxvQkFBRSxDQUFDLGFBQWEsRUFBRSxDQUFDO1lBQ25DLE1BQU0sZUFBZSxHQUFHLE9BQU8sQ0FBQyxTQUFTLENBQUMsb0JBQUUsQ0FBQyxRQUFRLENBQUMsV0FBVyxFQUFFLGVBQWUsRUFBRSxVQUFVLENBQUMsQ0FBQztZQUNoRyxRQUFRLENBQUMsSUFBSSxDQUFDO2dCQUNaLFFBQVEsRUFBRSxhQUFhLENBQUMsUUFBUSxFQUFFO2dCQUNsQyxLQUFLLEVBQUUsYUFBYSxDQUFDLFFBQVEsRUFBRTtnQkFDL0IsV0FBVyxFQUFFLGVBQWU7YUFDN0IsQ0FBQyxDQUFDO1NBQ0o7UUFFRCw4RkFBOEY7UUFDOUYsUUFBUSxHQUFHLHdCQUF3QixDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQzlDLEtBQUssTUFBTSxPQUFPLElBQUksUUFBUSxFQUFFO1lBQzlCLFNBQVMsQ0FBQyxPQUFPLENBQUMsUUFBUSxFQUFFLE9BQU8sQ0FBQyxLQUFLLEVBQUUsT0FBTyxDQUFDLFdBQVcsQ0FBQyxDQUFDO1NBQ2pFO0lBQ0gsQ0FBQztJQXBCRCxrQ0FvQkM7SUFFRCxTQUFTLFNBQVMsQ0FBQyxVQUF5QjtRQUMxQyxNQUFNLE1BQU0sR0FBcUIsRUFBRSxDQUFDO1FBQ3BDLE1BQU0sU0FBUyxHQUFHLENBQUMsSUFBYSxFQUFFLEVBQUU7WUFDbEMsSUFBSSxvQkFBRSxDQUFDLHlCQUF5QixDQUFDLElBQUksQ0FBQyxFQUFFO2dCQUN0Qyx3Q0FBd0M7Z0JBQ3hDLE1BQU07Z0JBQ04sZ0RBQWdEO2dCQUNoRCxNQUFNO2dCQUNOLE1BQU07Z0JBQ04sTUFBTTtnQkFDTixtREFBbUQ7Z0JBQ25ELE1BQU07Z0JBQ04sOERBQThEO2dCQUM5RCxtRUFBbUU7Z0JBQ25FLHdDQUF3QztnQkFDeEMsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQ2pDLElBQUksQ0FBQyxFQUFFLENBQUMsb0JBQUUsQ0FBQyxvQkFBb0IsQ0FBQyxJQUFJLENBQUMsSUFBSSxvQkFBRSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDO29CQUMvRCxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksS0FBSyxzQkFBc0I7b0JBQ3pDLGlCQUFpQixDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUMsQ0FBQztnQkFDM0QsSUFBSSxRQUFRLEVBQUU7b0JBQ1osTUFBTSxDQUFDLElBQUksQ0FBQyxFQUFDLGFBQWEsRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFDLENBQUMsQ0FBQztpQkFDOUM7YUFDRjtZQUNELG9CQUFFLENBQUMsWUFBWSxDQUFDLElBQUksRUFBRSxTQUFTLENBQUMsQ0FBQztRQUNuQyxDQUFDLENBQUM7UUFDRixvQkFBRSxDQUFDLFlBQVksQ0FBQyxVQUFVLEVBQUUsU0FBUyxDQUFDLENBQUM7UUFDdkMsT0FBTyxNQUFNLENBQUM7SUFDaEIsQ0FBQztJQUVEOzs7O09BSUc7SUFDSCxTQUFTLHdCQUF3QixDQUFDLFFBQXlCO1FBQ3pELE9BQU8sUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDLE9BQU8sRUFBRSxPQUFPLEVBQUUsRUFBRSxDQUFDLE9BQU8sQ0FBQyxRQUFRLEdBQUcsT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQ2xGLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgR29vZ2xlIExMQyBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICpcbiAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlXG4gKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlXG4gKi9cblxuaW1wb3J0IHRzIGZyb20gJ3R5cGVzY3JpcHQnO1xuXG5jb25zdCByZWxhdGl2ZUxpbmtSZXNvbHV0aW9uID0gJ3JlbGF0aXZlTGlua1Jlc29sdXRpb24nO1xuY29uc3Qga25vd25Db25maWdWYWx1ZXMgPSBuZXcgU2V0KFtgJ2xlZ2FjeSdgLCBgJ2NvcnJlY3RlZCdgXSk7XG5cbmV4cG9ydCBpbnRlcmZhY2UgUmV3cml0ZUVudGl0eSB7XG4gIHN0YXJ0UG9zOiBudW1iZXI7XG4gIHdpZHRoOiBudW1iZXI7XG4gIHJlcGxhY2VtZW50OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgTWlncmF0YWJsZU5vZGUge1xuICBvYmplY3RMaXRlcmFsOiB0cy5PYmplY3RMaXRlcmFsRXhwcmVzc2lvbjtcbiAgcHJvcGVydHk6IHRzLk9iamVjdExpdGVyYWxFbGVtZW50TGlrZTtcbn1cblxuZXhwb3J0IHR5cGUgUmV3cml0ZUZuID0gKHN0YXJ0UG9zOiBudW1iZXIsIG9yaWdMZW5ndGg6IG51bWJlciwgdGV4dDogc3RyaW5nKSA9PiB2b2lkO1xuXG5leHBvcnQgZnVuY3Rpb24gbWlncmF0ZUZpbGUoc291cmNlRmlsZTogdHMuU291cmNlRmlsZSwgcmV3cml0ZUZuOiBSZXdyaXRlRm4pIHtcbiAgbGV0IHJld3JpdGVzOiBSZXdyaXRlRW50aXR5W10gPSBbXTtcbiAgY29uc3QgdXNhZ2VzID0gZ2V0VXNhZ2VzKHNvdXJjZUZpbGUpO1xuICBmb3IgKGNvbnN0IHtvYmplY3RMaXRlcmFsLCBwcm9wZXJ0eX0gb2YgdXNhZ2VzKSB7XG4gICAgY29uc3QgcmVwbGFjZW1lbnROb2RlID0gdHMuZmFjdG9yeS51cGRhdGVPYmplY3RMaXRlcmFsRXhwcmVzc2lvbihcbiAgICAgICAgb2JqZWN0TGl0ZXJhbCwgb2JqZWN0TGl0ZXJhbC5wcm9wZXJ0aWVzLmZpbHRlcihwcm9wID0+IHByb3AgIT09IHByb3BlcnR5KSk7XG4gICAgY29uc3QgcHJpbnRlciA9IHRzLmNyZWF0ZVByaW50ZXIoKTtcbiAgICBjb25zdCByZXBsYWNlbWVudFRleHQgPSBwcmludGVyLnByaW50Tm9kZSh0cy5FbWl0SGludC5VbnNwZWNpZmllZCwgcmVwbGFjZW1lbnROb2RlLCBzb3VyY2VGaWxlKTtcbiAgICByZXdyaXRlcy5wdXNoKHtcbiAgICAgIHN0YXJ0UG9zOiBvYmplY3RMaXRlcmFsLmdldFN0YXJ0KCksXG4gICAgICB3aWR0aDogb2JqZWN0TGl0ZXJhbC5nZXRXaWR0aCgpLFxuICAgICAgcmVwbGFjZW1lbnQ6IHJlcGxhY2VtZW50VGV4dCxcbiAgICB9KTtcbiAgfVxuXG4gIC8vIFByb2Nlc3MgcmV3cml0ZXMgbGFzdC10by1maXJzdCAoYmFzZWQgb24gc3RhcnQgcG9zKSB0byBhdm9pZCBvZmZzZXQgc2hpZnRzIGR1cmluZyByZXdyaXRlcy5cbiAgcmV3cml0ZXMgPSBzb3J0QnlTdGFydFBvc0Rlc2NlbmRpbmcocmV3cml0ZXMpO1xuICBmb3IgKGNvbnN0IHJld3JpdGUgb2YgcmV3cml0ZXMpIHtcbiAgICByZXdyaXRlRm4ocmV3cml0ZS5zdGFydFBvcywgcmV3cml0ZS53aWR0aCwgcmV3cml0ZS5yZXBsYWNlbWVudCk7XG4gIH1cbn1cblxuZnVuY3Rpb24gZ2V0VXNhZ2VzKHNvdXJjZUZpbGU6IHRzLlNvdXJjZUZpbGUpOiBNaWdyYXRhYmxlTm9kZVtdIHtcbiAgY29uc3QgdXNhZ2VzOiBNaWdyYXRhYmxlTm9kZVtdID0gW107XG4gIGNvbnN0IHZpc2l0Tm9kZSA9IChub2RlOiB0cy5Ob2RlKSA9PiB7XG4gICAgaWYgKHRzLmlzT2JqZWN0TGl0ZXJhbEV4cHJlc3Npb24obm9kZSkpIHtcbiAgICAgIC8vIExvb2sgZm9yIHBhdHRlcm5zIGxpa2UgdGhlIGZvbGxvd2luZzpcbiAgICAgIC8vIGBgYFxuICAgICAgLy8geyAuLi4gcmVsYXRpdmVMaW5rUmVzb2x1dGlvbjogJ2xlZ2FjeScsIC4uLiB9XG4gICAgICAvLyBgYGBcbiAgICAgIC8vIG9yOlxuICAgICAgLy8gYGBgXG4gICAgICAvLyB7IC4uLiByZWxhdGl2ZUxpbmtSZXNvbHV0aW9uOiAnY29ycmVjdGVkJywgLi4uIH1cbiAgICAgIC8vIGBgYFxuICAgICAgLy8gSWYgdGhlIHZhbHVlIGlzIHVua25vd24gKGkuZS4gbm90ICdsZWdhY3knIG9yICdjb3JyZWN0ZWQnKSxcbiAgICAgIC8vIGRvIG5vdCBhdHRlbXB0IHRvIHJld3JpdGUgKHRoaXMgbWlnaHQgYmUgYW4gYXBwbGljYXRpb24tc3BlY2lmaWNcbiAgICAgIC8vIGNvbmZpZ3VyYXRpb24sIG5vdCBhIHBhcnQgb2YgUm91dGVyKS5cbiAgICAgIGNvbnN0IHByb3BlcnR5ID0gbm9kZS5wcm9wZXJ0aWVzLmZpbmQoXG4gICAgICAgICAgcHJvcCA9PiB0cy5pc1Byb3BlcnR5QXNzaWdubWVudChwcm9wKSAmJiB0cy5pc0lkZW50aWZpZXIocHJvcC5uYW1lKSAmJlxuICAgICAgICAgICAgICBwcm9wLm5hbWUudGV4dCA9PT0gcmVsYXRpdmVMaW5rUmVzb2x1dGlvbiAmJlxuICAgICAgICAgICAgICBrbm93bkNvbmZpZ1ZhbHVlcy5oYXMocHJvcC5pbml0aWFsaXplci5nZXRUZXh0KCkpKTtcbiAgICAgIGlmIChwcm9wZXJ0eSkge1xuICAgICAgICB1c2FnZXMucHVzaCh7b2JqZWN0TGl0ZXJhbDogbm9kZSwgcHJvcGVydHl9KTtcbiAgICAgIH1cbiAgICB9XG4gICAgdHMuZm9yRWFjaENoaWxkKG5vZGUsIHZpc2l0Tm9kZSk7XG4gIH07XG4gIHRzLmZvckVhY2hDaGlsZChzb3VyY2VGaWxlLCB2aXNpdE5vZGUpO1xuICByZXR1cm4gdXNhZ2VzO1xufVxuXG4vKipcbiAqIFNvcnQgYWxsIGZvdW5kIHVzYWdlcyBiYXNlZCBvbiB0aGVpciBzdGFydCBwb3NpdGlvbnMgaW4gdGhlIHNvdXJjZSBmaWxlIGluIGRlc2NlbmRpbmcgb3JkZXIgKGkuZS5cbiAqIGxhc3QgdXNhZ2UgZ29lcyBmaXJzdCBvbiB0aGUgbGlzdCwgZXRjKS4gVGhpcyBpcyBuZWVkZWQgdG8gYXZvaWQgc2hpZnRpbmcgb2Zmc2V0cyBpbiB0aGUgc291cmNlXG4gKiBmaWxlIChpbiBjYXNlIHRoZXJlIGFyZSBtdWx0aXBsZSB1c2FnZXMpIGFzIHdlIHJld3JpdGUgc3ltYm9scy5cbiAqL1xuZnVuY3Rpb24gc29ydEJ5U3RhcnRQb3NEZXNjZW5kaW5nKHJld3JpdGVzOiBSZXdyaXRlRW50aXR5W10pOiBSZXdyaXRlRW50aXR5W10ge1xuICByZXR1cm4gcmV3cml0ZXMuc29ydCgoZW50aXR5QSwgZW50aXR5QikgPT4gZW50aXR5Qi5zdGFydFBvcyAtIGVudGl0eUEuc3RhcnRQb3MpO1xufVxuIl19
|
|
@@ -0,0 +1,10 @@
|
|
|
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
|
+
/// <amd-module name="@angular/core/schematics/migrations/router-link-with-href" />
|
|
9
|
+
import { Rule } from '@angular-devkit/schematics';
|
|
10
|
+
export default function (): Rule;
|
|
@@ -0,0 +1,70 @@
|
|
|
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
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
9
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
10
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
11
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
12
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
13
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
14
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
15
|
+
});
|
|
16
|
+
};
|
|
17
|
+
(function (factory) {
|
|
18
|
+
if (typeof module === "object" && typeof module.exports === "object") {
|
|
19
|
+
var v = factory(require, exports);
|
|
20
|
+
if (v !== undefined) module.exports = v;
|
|
21
|
+
}
|
|
22
|
+
else if (typeof define === "function" && define.amd) {
|
|
23
|
+
define("@angular/core/schematics/migrations/router-link-with-href", ["require", "exports", "@angular-devkit/schematics", "path", "@angular/core/schematics/utils/project_tsconfig_paths", "@angular/core/schematics/utils/typescript/compiler_host", "@angular/core/schematics/migrations/router-link-with-href/util"], factory);
|
|
24
|
+
}
|
|
25
|
+
})(function (require, exports) {
|
|
26
|
+
"use strict";
|
|
27
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
28
|
+
const schematics_1 = require("@angular-devkit/schematics");
|
|
29
|
+
const path_1 = require("path");
|
|
30
|
+
const project_tsconfig_paths_1 = require("@angular/core/schematics/utils/project_tsconfig_paths");
|
|
31
|
+
const compiler_host_1 = require("@angular/core/schematics/utils/typescript/compiler_host");
|
|
32
|
+
const util_1 = require("@angular/core/schematics/migrations/router-link-with-href/util");
|
|
33
|
+
function default_1() {
|
|
34
|
+
return (tree) => __awaiter(this, void 0, void 0, function* () {
|
|
35
|
+
const { buildPaths, testPaths } = yield (0, project_tsconfig_paths_1.getProjectTsConfigPaths)(tree);
|
|
36
|
+
const basePath = process.cwd();
|
|
37
|
+
const allPaths = [...buildPaths, ...testPaths];
|
|
38
|
+
if (!allPaths.length) {
|
|
39
|
+
throw new schematics_1.SchematicsException('Could not find any tsconfig file. Cannot run the `RouterLinkWithHref` migration.');
|
|
40
|
+
}
|
|
41
|
+
for (const tsconfigPath of allPaths) {
|
|
42
|
+
runRouterLinkWithHrefMigration(tree, tsconfigPath, basePath);
|
|
43
|
+
}
|
|
44
|
+
});
|
|
45
|
+
}
|
|
46
|
+
exports.default = default_1;
|
|
47
|
+
function runRouterLinkWithHrefMigration(tree, tsconfigPath, basePath) {
|
|
48
|
+
const { program } = (0, compiler_host_1.createMigrationProgram)(tree, tsconfigPath, basePath);
|
|
49
|
+
const typeChecker = program.getTypeChecker();
|
|
50
|
+
const sourceFiles = program.getSourceFiles().filter(sourceFile => (0, compiler_host_1.canMigrateFile)(basePath, sourceFile, program));
|
|
51
|
+
for (const sourceFile of sourceFiles) {
|
|
52
|
+
let update = null;
|
|
53
|
+
const rewriter = (startPos, width, text) => {
|
|
54
|
+
if (update === null) {
|
|
55
|
+
// Lazily initialize update, because most files will not require migration.
|
|
56
|
+
update = tree.beginUpdate((0, path_1.relative)(basePath, sourceFile.fileName));
|
|
57
|
+
}
|
|
58
|
+
update.remove(startPos, width);
|
|
59
|
+
if (text !== null) {
|
|
60
|
+
update.insertLeft(startPos, text);
|
|
61
|
+
}
|
|
62
|
+
};
|
|
63
|
+
(0, util_1.migrateFile)(sourceFile, typeChecker, rewriter);
|
|
64
|
+
if (update !== null) {
|
|
65
|
+
tree.commitUpdate(update);
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
});
|
|
70
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9jb3JlL3NjaGVtYXRpY3MvbWlncmF0aW9ucy9yb3V0ZXItbGluay13aXRoLWhyZWYvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7OztHQU1HOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7SUFFSCwyREFBMkY7SUFDM0YsK0JBQThCO0lBRTlCLGtHQUEyRTtJQUMzRSwyRkFBNEY7SUFFNUYseUZBQW1DO0lBRW5DO1FBQ0UsT0FBTyxDQUFPLElBQVUsRUFBRSxFQUFFO1lBQzFCLE1BQU0sRUFBQyxVQUFVLEVBQUUsU0FBUyxFQUFDLEdBQUcsTUFBTSxJQUFBLGdEQUF1QixFQUFDLElBQUksQ0FBQyxDQUFDO1lBQ3BFLE1BQU0sUUFBUSxHQUFHLE9BQU8sQ0FBQyxHQUFHLEVBQUUsQ0FBQztZQUMvQixNQUFNLFFBQVEsR0FBRyxDQUFDLEdBQUcsVUFBVSxFQUFFLEdBQUcsU0FBUyxDQUFDLENBQUM7WUFFL0MsSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLEVBQUU7Z0JBQ3BCLE1BQU0sSUFBSSxnQ0FBbUIsQ0FDekIsa0ZBQWtGLENBQUMsQ0FBQzthQUN6RjtZQUVELEtBQUssTUFBTSxZQUFZLElBQUksUUFBUSxFQUFFO2dCQUNuQyw4QkFBOEIsQ0FBQyxJQUFJLEVBQUUsWUFBWSxFQUFFLFFBQVEsQ0FBQyxDQUFDO2FBQzlEO1FBQ0gsQ0FBQyxDQUFBLENBQUM7SUFDSixDQUFDO0lBZkQsNEJBZUM7SUFFRCxTQUFTLDhCQUE4QixDQUFDLElBQVUsRUFBRSxZQUFvQixFQUFFLFFBQWdCO1FBQ3hGLE1BQU0sRUFBQyxPQUFPLEVBQUMsR0FBRyxJQUFBLHNDQUFzQixFQUFDLElBQUksRUFBRSxZQUFZLEVBQUUsUUFBUSxDQUFDLENBQUM7UUFDdkUsTUFBTSxXQUFXLEdBQUcsT0FBTyxDQUFDLGNBQWMsRUFBRSxDQUFDO1FBQzdDLE1BQU0sV0FBVyxHQUNiLE9BQU8sQ0FBQyxjQUFjLEVBQUUsQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLEVBQUUsQ0FBQyxJQUFBLDhCQUFjLEVBQUMsUUFBUSxFQUFFLFVBQVUsRUFBRSxPQUFPLENBQUMsQ0FBQyxDQUFDO1FBRWpHLEtBQUssTUFBTSxVQUFVLElBQUksV0FBVyxFQUFFO1lBQ3BDLElBQUksTUFBTSxHQUF3QixJQUFJLENBQUM7WUFFdkMsTUFBTSxRQUFRLEdBQUcsQ0FBQyxRQUFnQixFQUFFLEtBQWEsRUFBRSxJQUFpQixFQUFFLEVBQUU7Z0JBQ3RFLElBQUksTUFBTSxLQUFLLElBQUksRUFBRTtvQkFDbkIsMkVBQTJFO29CQUMzRSxNQUFNLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFBLGVBQVEsRUFBQyxRQUFRLEVBQUUsVUFBVSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUM7aUJBQ3BFO2dCQUNELE1BQU0sQ0FBQyxNQUFNLENBQUMsUUFBUSxFQUFFLEtBQUssQ0FBQyxDQUFDO2dCQUMvQixJQUFJLElBQUksS0FBSyxJQUFJLEVBQUU7b0JBQ2pCLE1BQU0sQ0FBQyxVQUFVLENBQUMsUUFBUSxFQUFFLElBQUksQ0FBQyxDQUFDO2lCQUNuQztZQUNILENBQUMsQ0FBQztZQUVGLElBQUEsa0JBQVcsRUFBQyxVQUFVLEVBQUUsV0FBVyxFQUFFLFFBQVEsQ0FBQyxDQUFDO1lBRS9DLElBQUksTUFBTSxLQUFLLElBQUksRUFBRTtnQkFDbkIsSUFBSSxDQUFDLFlBQVksQ0FBQyxNQUFNLENBQUMsQ0FBQzthQUMzQjtTQUNGO0lBQ0gsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCBHb29nbGUgTExDIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKlxuICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmVcbiAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2VcbiAqL1xuXG5pbXBvcnQge1J1bGUsIFNjaGVtYXRpY3NFeGNlcHRpb24sIFRyZWUsIFVwZGF0ZVJlY29yZGVyfSBmcm9tICdAYW5ndWxhci1kZXZraXQvc2NoZW1hdGljcyc7XG5pbXBvcnQge3JlbGF0aXZlfSBmcm9tICdwYXRoJztcblxuaW1wb3J0IHtnZXRQcm9qZWN0VHNDb25maWdQYXRoc30gZnJvbSAnLi4vLi4vdXRpbHMvcHJvamVjdF90c2NvbmZpZ19wYXRocyc7XG5pbXBvcnQge2Nhbk1pZ3JhdGVGaWxlLCBjcmVhdGVNaWdyYXRpb25Qcm9ncmFtfSBmcm9tICcuLi8uLi91dGlscy90eXBlc2NyaXB0L2NvbXBpbGVyX2hvc3QnO1xuXG5pbXBvcnQge21pZ3JhdGVGaWxlfSBmcm9tICcuL3V0aWwnO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbigpOiBSdWxlIHtcbiAgcmV0dXJuIGFzeW5jICh0cmVlOiBUcmVlKSA9PiB7XG4gICAgY29uc3Qge2J1aWxkUGF0aHMsIHRlc3RQYXRoc30gPSBhd2FpdCBnZXRQcm9qZWN0VHNDb25maWdQYXRocyh0cmVlKTtcbiAgICBjb25zdCBiYXNlUGF0aCA9IHByb2Nlc3MuY3dkKCk7XG4gICAgY29uc3QgYWxsUGF0aHMgPSBbLi4uYnVpbGRQYXRocywgLi4udGVzdFBhdGhzXTtcblxuICAgIGlmICghYWxsUGF0aHMubGVuZ3RoKSB7XG4gICAgICB0aHJvdyBuZXcgU2NoZW1hdGljc0V4Y2VwdGlvbihcbiAgICAgICAgICAnQ291bGQgbm90IGZpbmQgYW55IHRzY29uZmlnIGZpbGUuIENhbm5vdCBydW4gdGhlIGBSb3V0ZXJMaW5rV2l0aEhyZWZgIG1pZ3JhdGlvbi4nKTtcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IHRzY29uZmlnUGF0aCBvZiBhbGxQYXRocykge1xuICAgICAgcnVuUm91dGVyTGlua1dpdGhIcmVmTWlncmF0aW9uKHRyZWUsIHRzY29uZmlnUGF0aCwgYmFzZVBhdGgpO1xuICAgIH1cbiAgfTtcbn1cblxuZnVuY3Rpb24gcnVuUm91dGVyTGlua1dpdGhIcmVmTWlncmF0aW9uKHRyZWU6IFRyZWUsIHRzY29uZmlnUGF0aDogc3RyaW5nLCBiYXNlUGF0aDogc3RyaW5nKSB7XG4gIGNvbnN0IHtwcm9ncmFtfSA9IGNyZWF0ZU1pZ3JhdGlvblByb2dyYW0odHJlZSwgdHNjb25maWdQYXRoLCBiYXNlUGF0aCk7XG4gIGNvbnN0IHR5cGVDaGVja2VyID0gcHJvZ3JhbS5nZXRUeXBlQ2hlY2tlcigpO1xuICBjb25zdCBzb3VyY2VGaWxlcyA9XG4gICAgICBwcm9ncmFtLmdldFNvdXJjZUZpbGVzKCkuZmlsdGVyKHNvdXJjZUZpbGUgPT4gY2FuTWlncmF0ZUZpbGUoYmFzZVBhdGgsIHNvdXJjZUZpbGUsIHByb2dyYW0pKTtcblxuICBmb3IgKGNvbnN0IHNvdXJjZUZpbGUgb2Ygc291cmNlRmlsZXMpIHtcbiAgICBsZXQgdXBkYXRlOiBVcGRhdGVSZWNvcmRlcnxudWxsID0gbnVsbDtcblxuICAgIGNvbnN0IHJld3JpdGVyID0gKHN0YXJ0UG9zOiBudW1iZXIsIHdpZHRoOiBudW1iZXIsIHRleHQ6IHN0cmluZ3xudWxsKSA9PiB7XG4gICAgICBpZiAodXBkYXRlID09PSBudWxsKSB7XG4gICAgICAgIC8vIExhemlseSBpbml0aWFsaXplIHVwZGF0ZSwgYmVjYXVzZSBtb3N0IGZpbGVzIHdpbGwgbm90IHJlcXVpcmUgbWlncmF0aW9uLlxuICAgICAgICB1cGRhdGUgPSB0cmVlLmJlZ2luVXBkYXRlKHJlbGF0aXZlKGJhc2VQYXRoLCBzb3VyY2VGaWxlLmZpbGVOYW1lKSk7XG4gICAgICB9XG4gICAgICB1cGRhdGUucmVtb3ZlKHN0YXJ0UG9zLCB3aWR0aCk7XG4gICAgICBpZiAodGV4dCAhPT0gbnVsbCkge1xuICAgICAgICB1cGRhdGUuaW5zZXJ0TGVmdChzdGFydFBvcywgdGV4dCk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIG1pZ3JhdGVGaWxlKHNvdXJjZUZpbGUsIHR5cGVDaGVja2VyLCByZXdyaXRlcik7XG5cbiAgICBpZiAodXBkYXRlICE9PSBudWxsKSB7XG4gICAgICB0cmVlLmNvbW1pdFVwZGF0ZSh1cGRhdGUpO1xuICAgIH1cbiAgfVxufVxuIl19
|
|
@@ -0,0 +1,19 @@
|
|
|
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
|
+
/// <amd-module name="@angular/core/schematics/migrations/router-link-with-href/util" />
|
|
9
|
+
import ts from 'typescript';
|
|
10
|
+
export declare const routerLink = "RouterLink";
|
|
11
|
+
export declare const routerLinkWithHref = "RouterLinkWithHref";
|
|
12
|
+
export declare const routerModule = "@angular/router";
|
|
13
|
+
export interface RewriteEntity {
|
|
14
|
+
startPos: number;
|
|
15
|
+
width: number;
|
|
16
|
+
replacement: string;
|
|
17
|
+
}
|
|
18
|
+
export declare type RewriteFn = (startPos: number, width: number, text: string) => void;
|
|
19
|
+
export declare function migrateFile(sourceFile: ts.SourceFile, typeChecker: ts.TypeChecker, rewrite: RewriteFn): void;
|
|
@@ -0,0 +1,111 @@
|
|
|
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
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
9
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
10
|
+
};
|
|
11
|
+
(function (factory) {
|
|
12
|
+
if (typeof module === "object" && typeof module.exports === "object") {
|
|
13
|
+
var v = factory(require, exports);
|
|
14
|
+
if (v !== undefined) module.exports = v;
|
|
15
|
+
}
|
|
16
|
+
else if (typeof define === "function" && define.amd) {
|
|
17
|
+
define("@angular/core/schematics/migrations/router-link-with-href/util", ["require", "exports", "typescript", "@angular/core/schematics/utils/typescript/imports", "@angular/core/schematics/utils/typescript/nodes"], factory);
|
|
18
|
+
}
|
|
19
|
+
})(function (require, exports) {
|
|
20
|
+
"use strict";
|
|
21
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
22
|
+
exports.migrateFile = exports.routerModule = exports.routerLinkWithHref = exports.routerLink = void 0;
|
|
23
|
+
const typescript_1 = __importDefault(require("typescript"));
|
|
24
|
+
const imports_1 = require("@angular/core/schematics/utils/typescript/imports");
|
|
25
|
+
const nodes_1 = require("@angular/core/schematics/utils/typescript/nodes");
|
|
26
|
+
exports.routerLink = 'RouterLink';
|
|
27
|
+
exports.routerLinkWithHref = 'RouterLinkWithHref';
|
|
28
|
+
exports.routerModule = '@angular/router';
|
|
29
|
+
function migrateFile(sourceFile, typeChecker, rewrite) {
|
|
30
|
+
const routerLinkWithHrefSpec = (0, imports_1.getImportSpecifier)(sourceFile, exports.routerModule, exports.routerLinkWithHref);
|
|
31
|
+
// No `RouterLinkWithHref` found, nothing to migrate, exit early.
|
|
32
|
+
if (routerLinkWithHrefSpec === null)
|
|
33
|
+
return;
|
|
34
|
+
let rewrites = findUsages(sourceFile, typeChecker);
|
|
35
|
+
// There are some usages of the `RouterLinkWithHref` symbol, which need to
|
|
36
|
+
// be rewritten to `RouterLink` instead. Let's check if the `RouterLink` is
|
|
37
|
+
// already imported.
|
|
38
|
+
const routerLinkSpec = (0, imports_1.getImportSpecifier)(sourceFile, exports.routerModule, exports.routerLink);
|
|
39
|
+
if (routerLinkSpec) {
|
|
40
|
+
// The `RouterLink` symbol is already imported, just drop the `RouterLinkWithHref` one.
|
|
41
|
+
const routerLinkNamedImports = routerLinkWithHrefSpec ?
|
|
42
|
+
(0, nodes_1.closestNode)(routerLinkWithHrefSpec, typescript_1.default.SyntaxKind.NamedImports) :
|
|
43
|
+
null;
|
|
44
|
+
if (routerLinkNamedImports !== null) {
|
|
45
|
+
// Given an original import like this one:
|
|
46
|
+
// ```
|
|
47
|
+
// import {RouterModule, RouterLinkWithHref, RouterLink} from '@angular/router';
|
|
48
|
+
// ```
|
|
49
|
+
// The code below removes the `RouterLinkWithHref` from the named imports section
|
|
50
|
+
// (i.e. `{RouterModule, RouterLinkWithHref, RouterLink}`) and prints an updated
|
|
51
|
+
// version (`{RouterModule, RouterLink}`) to a string, which is used as a
|
|
52
|
+
// replacement.
|
|
53
|
+
const rewrittenNamedImports = (0, imports_1.removeSymbolFromNamedImports)(routerLinkNamedImports, routerLinkWithHrefSpec);
|
|
54
|
+
const printer = typescript_1.default.createPrinter();
|
|
55
|
+
const replacement = printer.printNode(typescript_1.default.EmitHint.Unspecified, rewrittenNamedImports, sourceFile);
|
|
56
|
+
rewrites.push({
|
|
57
|
+
startPos: routerLinkNamedImports.getStart(),
|
|
58
|
+
width: routerLinkNamedImports.getWidth(),
|
|
59
|
+
replacement: replacement,
|
|
60
|
+
});
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
else {
|
|
64
|
+
// The `RouterLink` symbol is not imported, but the `RouterLinkWithHref` is imported,
|
|
65
|
+
// so rewrite `RouterLinkWithHref` -> `RouterLink`.
|
|
66
|
+
rewrites.push({
|
|
67
|
+
startPos: routerLinkWithHrefSpec.getStart(),
|
|
68
|
+
width: routerLinkWithHrefSpec.getWidth(),
|
|
69
|
+
replacement: exports.routerLink,
|
|
70
|
+
});
|
|
71
|
+
}
|
|
72
|
+
// Process rewrites last-to-first (based on start pos) to avoid offset shifts during rewrites.
|
|
73
|
+
rewrites = sortByStartPosDescending(rewrites);
|
|
74
|
+
for (const usage of rewrites) {
|
|
75
|
+
rewrite(usage.startPos, usage.width, usage.replacement);
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
exports.migrateFile = migrateFile;
|
|
79
|
+
function findUsages(sourceFile, typeChecker) {
|
|
80
|
+
const usages = [];
|
|
81
|
+
const visitNode = (node) => {
|
|
82
|
+
if (typescript_1.default.isImportSpecifier(node)) {
|
|
83
|
+
// Skip this node and all of its children; imports are a special case.
|
|
84
|
+
return;
|
|
85
|
+
}
|
|
86
|
+
if (typescript_1.default.isIdentifier(node)) {
|
|
87
|
+
const importIdentifier = (0, imports_1.getImportOfIdentifier)(typeChecker, node);
|
|
88
|
+
if ((importIdentifier === null || importIdentifier === void 0 ? void 0 : importIdentifier.importModule) === exports.routerModule &&
|
|
89
|
+
importIdentifier.name === exports.routerLinkWithHref) {
|
|
90
|
+
usages.push({
|
|
91
|
+
startPos: node.getStart(),
|
|
92
|
+
width: node.getWidth(),
|
|
93
|
+
replacement: exports.routerLink,
|
|
94
|
+
});
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
typescript_1.default.forEachChild(node, visitNode);
|
|
98
|
+
};
|
|
99
|
+
typescript_1.default.forEachChild(sourceFile, visitNode);
|
|
100
|
+
return usages;
|
|
101
|
+
}
|
|
102
|
+
/**
|
|
103
|
+
* Sort all found usages based on their start positions in the source file in descending order (i.e.
|
|
104
|
+
* last usage goes first on the list, etc). This is needed to avoid shifting offsets in the source
|
|
105
|
+
* file (in case there are multiple usages) as we rewrite symbols.
|
|
106
|
+
*/
|
|
107
|
+
function sortByStartPosDescending(rewrites) {
|
|
108
|
+
return rewrites.sort((entityA, entityB) => entityB.startPos - entityA.startPos);
|
|
109
|
+
}
|
|
110
|
+
});
|
|
111
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL3BhY2thZ2VzL2NvcmUvc2NoZW1hdGljcy9taWdyYXRpb25zL3JvdXRlci1saW5rLXdpdGgtaHJlZi91dGlsLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7R0FNRzs7Ozs7Ozs7Ozs7Ozs7OztJQUVILDREQUE0QjtJQUU1QiwrRUFBdUg7SUFDdkgsMkVBQXlEO0lBRTVDLFFBQUEsVUFBVSxHQUFHLFlBQVksQ0FBQztJQUMxQixRQUFBLGtCQUFrQixHQUFHLG9CQUFvQixDQUFDO0lBQzFDLFFBQUEsWUFBWSxHQUFHLGlCQUFpQixDQUFDO0lBVTlDLFNBQWdCLFdBQVcsQ0FDdkIsVUFBeUIsRUFBRSxXQUEyQixFQUFFLE9BQWtCO1FBQzVFLE1BQU0sc0JBQXNCLEdBQUcsSUFBQSw0QkFBa0IsRUFBQyxVQUFVLEVBQUUsb0JBQVksRUFBRSwwQkFBa0IsQ0FBQyxDQUFDO1FBRWhHLGlFQUFpRTtRQUNqRSxJQUFJLHNCQUFzQixLQUFLLElBQUk7WUFBRSxPQUFPO1FBRTVDLElBQUksUUFBUSxHQUFHLFVBQVUsQ0FBQyxVQUFVLEVBQUUsV0FBVyxDQUFDLENBQUM7UUFFbkQsMEVBQTBFO1FBQzFFLDJFQUEyRTtRQUMzRSxvQkFBb0I7UUFDcEIsTUFBTSxjQUFjLEdBQUcsSUFBQSw0QkFBa0IsRUFBQyxVQUFVLEVBQUUsb0JBQVksRUFBRSxrQkFBVSxDQUFDLENBQUM7UUFFaEYsSUFBSSxjQUFjLEVBQUU7WUFDbEIsdUZBQXVGO1lBQ3ZGLE1BQU0sc0JBQXNCLEdBQUcsc0JBQXNCLENBQUMsQ0FBQztnQkFDbkQsSUFBQSxtQkFBVyxFQUFrQixzQkFBc0IsRUFBRSxvQkFBRSxDQUFDLFVBQVUsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDO2dCQUNsRixJQUFJLENBQUM7WUFDVCxJQUFJLHNCQUFzQixLQUFLLElBQUksRUFBRTtnQkFDbkMsMENBQTBDO2dCQUMxQyxNQUFNO2dCQUNOLGdGQUFnRjtnQkFDaEYsTUFBTTtnQkFDTixpRkFBaUY7Z0JBQ2pGLGdGQUFnRjtnQkFDaEYseUVBQXlFO2dCQUN6RSxlQUFlO2dCQUNmLE1BQU0scUJBQXFCLEdBQ3ZCLElBQUEsc0NBQTRCLEVBQUMsc0JBQXNCLEVBQUUsc0JBQXNCLENBQUMsQ0FBQztnQkFDakYsTUFBTSxPQUFPLEdBQUcsb0JBQUUsQ0FBQyxhQUFhLEVBQUUsQ0FBQztnQkFDbkMsTUFBTSxXQUFXLEdBQ2IsT0FBTyxDQUFDLFNBQVMsQ0FBQyxvQkFBRSxDQUFDLFFBQVEsQ0FBQyxXQUFXLEVBQUUscUJBQXFCLEVBQUUsVUFBVSxDQUFDLENBQUM7Z0JBQ2xGLFFBQVEsQ0FBQyxJQUFJLENBQUM7b0JBQ1osUUFBUSxFQUFFLHNCQUFzQixDQUFDLFFBQVEsRUFBRTtvQkFDM0MsS0FBSyxFQUFFLHNCQUFzQixDQUFDLFFBQVEsRUFBRTtvQkFDeEMsV0FBVyxFQUFFLFdBQVc7aUJBQ3pCLENBQUMsQ0FBQzthQUNKO1NBQ0Y7YUFBTTtZQUNMLHFGQUFxRjtZQUNyRixtREFBbUQ7WUFDbkQsUUFBUSxDQUFDLElBQUksQ0FBQztnQkFDWixRQUFRLEVBQUUsc0JBQXNCLENBQUMsUUFBUSxFQUFFO2dCQUMzQyxLQUFLLEVBQUUsc0JBQXNCLENBQUMsUUFBUSxFQUFFO2dCQUN4QyxXQUFXLEVBQUUsa0JBQVU7YUFDeEIsQ0FBQyxDQUFDO1NBQ0o7UUFFRCw4RkFBOEY7UUFDOUYsUUFBUSxHQUFHLHdCQUF3QixDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQzlDLEtBQUssTUFBTSxLQUFLLElBQUksUUFBUSxFQUFFO1lBQzVCLE9BQU8sQ0FBQyxLQUFLLENBQUMsUUFBUSxFQUFFLEtBQUssQ0FBQyxLQUFLLEVBQUUsS0FBSyxDQUFDLFdBQVcsQ0FBQyxDQUFDO1NBQ3pEO0lBQ0gsQ0FBQztJQXRERCxrQ0FzREM7SUFFRCxTQUFTLFVBQVUsQ0FBQyxVQUF5QixFQUFFLFdBQTJCO1FBQ3hFLE1BQU0sTUFBTSxHQUFvQixFQUFFLENBQUM7UUFDbkMsTUFBTSxTQUFTLEdBQUcsQ0FBQyxJQUFhLEVBQUUsRUFBRTtZQUNsQyxJQUFJLG9CQUFFLENBQUMsaUJBQWlCLENBQUMsSUFBSSxDQUFDLEVBQUU7Z0JBQzlCLHNFQUFzRTtnQkFDdEUsT0FBTzthQUNSO1lBQ0QsSUFBSSxvQkFBRSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsRUFBRTtnQkFDekIsTUFBTSxnQkFBZ0IsR0FBRyxJQUFBLCtCQUFxQixFQUFDLFdBQVcsRUFBRSxJQUFJLENBQUMsQ0FBQztnQkFDbEUsSUFBSSxDQUFBLGdCQUFnQixhQUFoQixnQkFBZ0IsdUJBQWhCLGdCQUFnQixDQUFFLFlBQVksTUFBSyxvQkFBWTtvQkFDL0MsZ0JBQWdCLENBQUMsSUFBSSxLQUFLLDBCQUFrQixFQUFFO29CQUNoRCxNQUFNLENBQUMsSUFBSSxDQUFDO3dCQUNWLFFBQVEsRUFBRSxJQUFJLENBQUMsUUFBUSxFQUFFO3dCQUN6QixLQUFLLEVBQUUsSUFBSSxDQUFDLFFBQVEsRUFBRTt3QkFDdEIsV0FBVyxFQUFFLGtCQUFVO3FCQUN4QixDQUFDLENBQUM7aUJBQ0o7YUFDRjtZQUNELG9CQUFFLENBQUMsWUFBWSxDQUFDLElBQUksRUFBRSxTQUFTLENBQUMsQ0FBQztRQUNuQyxDQUFDLENBQUM7UUFDRixvQkFBRSxDQUFDLFlBQVksQ0FBQyxVQUFVLEVBQUUsU0FBUyxDQUFDLENBQUM7UUFDdkMsT0FBTyxNQUFNLENBQUM7SUFDaEIsQ0FBQztJQUVEOzs7O09BSUc7SUFDSCxTQUFTLHdCQUF3QixDQUFDLFFBQXlCO1FBQ3pELE9BQU8sUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDLE9BQU8sRUFBRSxPQUFPLEVBQUUsRUFBRSxDQUFDLE9BQU8sQ0FBQyxRQUFRLEdBQUcsT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQ2xGLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgR29vZ2xlIExMQyBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICpcbiAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlXG4gKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlXG4gKi9cblxuaW1wb3J0IHRzIGZyb20gJ3R5cGVzY3JpcHQnO1xuXG5pbXBvcnQge2dldEltcG9ydE9mSWRlbnRpZmllciwgZ2V0SW1wb3J0U3BlY2lmaWVyLCByZW1vdmVTeW1ib2xGcm9tTmFtZWRJbXBvcnRzfSBmcm9tICcuLi8uLi91dGlscy90eXBlc2NyaXB0L2ltcG9ydHMnO1xuaW1wb3J0IHtjbG9zZXN0Tm9kZX0gZnJvbSAnLi4vLi4vdXRpbHMvdHlwZXNjcmlwdC9ub2Rlcyc7XG5cbmV4cG9ydCBjb25zdCByb3V0ZXJMaW5rID0gJ1JvdXRlckxpbmsnO1xuZXhwb3J0IGNvbnN0IHJvdXRlckxpbmtXaXRoSHJlZiA9ICdSb3V0ZXJMaW5rV2l0aEhyZWYnO1xuZXhwb3J0IGNvbnN0IHJvdXRlck1vZHVsZSA9ICdAYW5ndWxhci9yb3V0ZXInO1xuXG5leHBvcnQgaW50ZXJmYWNlIFJld3JpdGVFbnRpdHkge1xuICBzdGFydFBvczogbnVtYmVyO1xuICB3aWR0aDogbnVtYmVyO1xuICByZXBsYWNlbWVudDogc3RyaW5nO1xufVxuXG5leHBvcnQgdHlwZSBSZXdyaXRlRm4gPSAoc3RhcnRQb3M6IG51bWJlciwgd2lkdGg6IG51bWJlciwgdGV4dDogc3RyaW5nKSA9PiB2b2lkO1xuXG5leHBvcnQgZnVuY3Rpb24gbWlncmF0ZUZpbGUoXG4gICAgc291cmNlRmlsZTogdHMuU291cmNlRmlsZSwgdHlwZUNoZWNrZXI6IHRzLlR5cGVDaGVja2VyLCByZXdyaXRlOiBSZXdyaXRlRm4pIHtcbiAgY29uc3Qgcm91dGVyTGlua1dpdGhIcmVmU3BlYyA9IGdldEltcG9ydFNwZWNpZmllcihzb3VyY2VGaWxlLCByb3V0ZXJNb2R1bGUsIHJvdXRlckxpbmtXaXRoSHJlZik7XG5cbiAgLy8gTm8gYFJvdXRlckxpbmtXaXRoSHJlZmAgZm91bmQsIG5vdGhpbmcgdG8gbWlncmF0ZSwgZXhpdCBlYXJseS5cbiAgaWYgKHJvdXRlckxpbmtXaXRoSHJlZlNwZWMgPT09IG51bGwpIHJldHVybjtcblxuICBsZXQgcmV3cml0ZXMgPSBmaW5kVXNhZ2VzKHNvdXJjZUZpbGUsIHR5cGVDaGVja2VyKTtcblxuICAvLyBUaGVyZSBhcmUgc29tZSB1c2FnZXMgb2YgdGhlIGBSb3V0ZXJMaW5rV2l0aEhyZWZgIHN5bWJvbCwgd2hpY2ggbmVlZCB0b1xuICAvLyBiZSByZXdyaXR0ZW4gdG8gYFJvdXRlckxpbmtgIGluc3RlYWQuIExldCdzIGNoZWNrIGlmIHRoZSBgUm91dGVyTGlua2AgaXNcbiAgLy8gYWxyZWFkeSBpbXBvcnRlZC5cbiAgY29uc3Qgcm91dGVyTGlua1NwZWMgPSBnZXRJbXBvcnRTcGVjaWZpZXIoc291cmNlRmlsZSwgcm91dGVyTW9kdWxlLCByb3V0ZXJMaW5rKTtcblxuICBpZiAocm91dGVyTGlua1NwZWMpIHtcbiAgICAvLyBUaGUgYFJvdXRlckxpbmtgIHN5bWJvbCBpcyBhbHJlYWR5IGltcG9ydGVkLCBqdXN0IGRyb3AgdGhlIGBSb3V0ZXJMaW5rV2l0aEhyZWZgIG9uZS5cbiAgICBjb25zdCByb3V0ZXJMaW5rTmFtZWRJbXBvcnRzID0gcm91dGVyTGlua1dpdGhIcmVmU3BlYyA/XG4gICAgICAgIGNsb3Nlc3ROb2RlPHRzLk5hbWVkSW1wb3J0cz4ocm91dGVyTGlua1dpdGhIcmVmU3BlYywgdHMuU3ludGF4S2luZC5OYW1lZEltcG9ydHMpIDpcbiAgICAgICAgbnVsbDtcbiAgICBpZiAocm91dGVyTGlua05hbWVkSW1wb3J0cyAhPT0gbnVsbCkge1xuICAgICAgLy8gR2l2ZW4gYW4gb3JpZ2luYWwgaW1wb3J0IGxpa2UgdGhpcyBvbmU6XG4gICAgICAvLyBgYGBcbiAgICAgIC8vIGltcG9ydCB7Um91dGVyTW9kdWxlLCBSb3V0ZXJMaW5rV2l0aEhyZWYsIFJvdXRlckxpbmt9IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcic7XG4gICAgICAvLyBgYGBcbiAgICAgIC8vIFRoZSBjb2RlIGJlbG93IHJlbW92ZXMgdGhlIGBSb3V0ZXJMaW5rV2l0aEhyZWZgIGZyb20gdGhlIG5hbWVkIGltcG9ydHMgc2VjdGlvblxuICAgICAgLy8gKGkuZS4gYHtSb3V0ZXJNb2R1bGUsIFJvdXRlckxpbmtXaXRoSHJlZiwgUm91dGVyTGlua31gKSBhbmQgcHJpbnRzIGFuIHVwZGF0ZWRcbiAgICAgIC8vIHZlcnNpb24gKGB7Um91dGVyTW9kdWxlLCBSb3V0ZXJMaW5rfWApIHRvIGEgc3RyaW5nLCB3aGljaCBpcyB1c2VkIGFzIGFcbiAgICAgIC8vIHJlcGxhY2VtZW50LlxuICAgICAgY29uc3QgcmV3cml0dGVuTmFtZWRJbXBvcnRzID1cbiAgICAgICAgICByZW1vdmVTeW1ib2xGcm9tTmFtZWRJbXBvcnRzKHJvdXRlckxpbmtOYW1lZEltcG9ydHMsIHJvdXRlckxpbmtXaXRoSHJlZlNwZWMpO1xuICAgICAgY29uc3QgcHJpbnRlciA9IHRzLmNyZWF0ZVByaW50ZXIoKTtcbiAgICAgIGNvbnN0IHJlcGxhY2VtZW50ID1cbiAgICAgICAgICBwcmludGVyLnByaW50Tm9kZSh0cy5FbWl0SGludC5VbnNwZWNpZmllZCwgcmV3cml0dGVuTmFtZWRJbXBvcnRzLCBzb3VyY2VGaWxlKTtcbiAgICAgIHJld3JpdGVzLnB1c2goe1xuICAgICAgICBzdGFydFBvczogcm91dGVyTGlua05hbWVkSW1wb3J0cy5nZXRTdGFydCgpLFxuICAgICAgICB3aWR0aDogcm91dGVyTGlua05hbWVkSW1wb3J0cy5nZXRXaWR0aCgpLFxuICAgICAgICByZXBsYWNlbWVudDogcmVwbGFjZW1lbnQsXG4gICAgICB9KTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgLy8gVGhlIGBSb3V0ZXJMaW5rYCBzeW1ib2wgaXMgbm90IGltcG9ydGVkLCBidXQgdGhlIGBSb3V0ZXJMaW5rV2l0aEhyZWZgIGlzIGltcG9ydGVkLFxuICAgIC8vIHNvIHJld3JpdGUgYFJvdXRlckxpbmtXaXRoSHJlZmAgLT4gYFJvdXRlckxpbmtgLlxuICAgIHJld3JpdGVzLnB1c2goe1xuICAgICAgc3RhcnRQb3M6IHJvdXRlckxpbmtXaXRoSHJlZlNwZWMuZ2V0U3RhcnQoKSxcbiAgICAgIHdpZHRoOiByb3V0ZXJMaW5rV2l0aEhyZWZTcGVjLmdldFdpZHRoKCksXG4gICAgICByZXBsYWNlbWVudDogcm91dGVyTGluayxcbiAgICB9KTtcbiAgfVxuXG4gIC8vIFByb2Nlc3MgcmV3cml0ZXMgbGFzdC10by1maXJzdCAoYmFzZWQgb24gc3RhcnQgcG9zKSB0byBhdm9pZCBvZmZzZXQgc2hpZnRzIGR1cmluZyByZXdyaXRlcy5cbiAgcmV3cml0ZXMgPSBzb3J0QnlTdGFydFBvc0Rlc2NlbmRpbmcocmV3cml0ZXMpO1xuICBmb3IgKGNvbnN0IHVzYWdlIG9mIHJld3JpdGVzKSB7XG4gICAgcmV3cml0ZSh1c2FnZS5zdGFydFBvcywgdXNhZ2Uud2lkdGgsIHVzYWdlLnJlcGxhY2VtZW50KTtcbiAgfVxufVxuXG5mdW5jdGlvbiBmaW5kVXNhZ2VzKHNvdXJjZUZpbGU6IHRzLlNvdXJjZUZpbGUsIHR5cGVDaGVja2VyOiB0cy5UeXBlQ2hlY2tlcik6IFJld3JpdGVFbnRpdHlbXSB7XG4gIGNvbnN0IHVzYWdlczogUmV3cml0ZUVudGl0eVtdID0gW107XG4gIGNvbnN0IHZpc2l0Tm9kZSA9IChub2RlOiB0cy5Ob2RlKSA9PiB7XG4gICAgaWYgKHRzLmlzSW1wb3J0U3BlY2lmaWVyKG5vZGUpKSB7XG4gICAgICAvLyBTa2lwIHRoaXMgbm9kZSBhbmQgYWxsIG9mIGl0cyBjaGlsZHJlbjsgaW1wb3J0cyBhcmUgYSBzcGVjaWFsIGNhc2UuXG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICh0cy5pc0lkZW50aWZpZXIobm9kZSkpIHtcbiAgICAgIGNvbnN0IGltcG9ydElkZW50aWZpZXIgPSBnZXRJbXBvcnRPZklkZW50aWZpZXIodHlwZUNoZWNrZXIsIG5vZGUpO1xuICAgICAgaWYgKGltcG9ydElkZW50aWZpZXI/LmltcG9ydE1vZHVsZSA9PT0gcm91dGVyTW9kdWxlICYmXG4gICAgICAgICAgaW1wb3J0SWRlbnRpZmllci5uYW1lID09PSByb3V0ZXJMaW5rV2l0aEhyZWYpIHtcbiAgICAgICAgdXNhZ2VzLnB1c2goe1xuICAgICAgICAgIHN0YXJ0UG9zOiBub2RlLmdldFN0YXJ0KCksXG4gICAgICAgICAgd2lkdGg6IG5vZGUuZ2V0V2lkdGgoKSxcbiAgICAgICAgICByZXBsYWNlbWVudDogcm91dGVyTGluayxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuICAgIHRzLmZvckVhY2hDaGlsZChub2RlLCB2aXNpdE5vZGUpO1xuICB9O1xuICB0cy5mb3JFYWNoQ2hpbGQoc291cmNlRmlsZSwgdmlzaXROb2RlKTtcbiAgcmV0dXJuIHVzYWdlcztcbn1cblxuLyoqXG4gKiBTb3J0IGFsbCBmb3VuZCB1c2FnZXMgYmFzZWQgb24gdGhlaXIgc3RhcnQgcG9zaXRpb25zIGluIHRoZSBzb3VyY2UgZmlsZSBpbiBkZXNjZW5kaW5nIG9yZGVyIChpLmUuXG4gKiBsYXN0IHVzYWdlIGdvZXMgZmlyc3Qgb24gdGhlIGxpc3QsIGV0YykuIFRoaXMgaXMgbmVlZGVkIHRvIGF2b2lkIHNoaWZ0aW5nIG9mZnNldHMgaW4gdGhlIHNvdXJjZVxuICogZmlsZSAoaW4gY2FzZSB0aGVyZSBhcmUgbXVsdGlwbGUgdXNhZ2VzKSBhcyB3ZSByZXdyaXRlIHN5bWJvbHMuXG4gKi9cbmZ1bmN0aW9uIHNvcnRCeVN0YXJ0UG9zRGVzY2VuZGluZyhyZXdyaXRlczogUmV3cml0ZUVudGl0eVtdKTogUmV3cml0ZUVudGl0eVtdIHtcbiAgcmV0dXJuIHJld3JpdGVzLnNvcnQoKGVudGl0eUEsIGVudGl0eUIpID0+IGVudGl0eUIuc3RhcnRQb3MgLSBlbnRpdHlBLnN0YXJ0UG9zKTtcbn1cbiJdfQ==
|