@angular/core 15.0.0-next.5 → 15.0.0-rc.0
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 -5
- package/esm2020/src/di/r3_injector.mjs +4 -8
- 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/features/host_directives_feature.mjs +6 -7
- package/esm2020/src/render3/jit/directive.mjs +2 -6
- package/esm2020/src/render3/ng_module_ref.mjs +1 -2
- 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 +57 -28
- package/fesm2015/core.mjs.map +1 -1
- package/fesm2015/testing.mjs +83 -32
- package/fesm2015/testing.mjs.map +1 -1
- package/fesm2020/core.mjs +57 -28
- package/fesm2020/core.mjs.map +1 -1
- package/fesm2020/testing.mjs +83 -32
- package/fesm2020/testing.mjs.map +1 -1
- package/index.d.ts +58 -24
- 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-
|
|
2
|
+
* @license Angular v15.0.0-rc.0
|
|
3
3
|
* (c) 2010-2022 Google LLC. https://angular.io/
|
|
4
4
|
* License: MIT
|
|
5
5
|
*/
|
|
@@ -1034,8 +1034,6 @@ export declare interface Component extends Directive {
|
|
|
1034
1034
|
*
|
|
1035
1035
|
* More information about standalone components, directives, and pipes can be found in [this
|
|
1036
1036
|
* guide](guide/standalone-components).
|
|
1037
|
-
*
|
|
1038
|
-
* @developerPreview
|
|
1039
1037
|
*/
|
|
1040
1038
|
standalone?: boolean;
|
|
1041
1039
|
/**
|
|
@@ -1048,8 +1046,6 @@ export declare interface Component extends Directive {
|
|
|
1048
1046
|
*
|
|
1049
1047
|
* More information about standalone components, directives, and pipes can be found in [this
|
|
1050
1048
|
* guide](guide/standalone-components).
|
|
1051
|
-
*
|
|
1052
|
-
* @developerPreview
|
|
1053
1049
|
*/
|
|
1054
1050
|
imports?: (Type<any> | any[])[];
|
|
1055
1051
|
/**
|
|
@@ -1734,9 +1730,8 @@ export declare function createComponent<C>(component: Type<C>, options: {
|
|
|
1734
1730
|
* messages.
|
|
1735
1731
|
*
|
|
1736
1732
|
* @publicApi
|
|
1737
|
-
* @developerPreview
|
|
1738
1733
|
*/
|
|
1739
|
-
export declare function createEnvironmentInjector(providers: Array<Provider |
|
|
1734
|
+
export declare function createEnvironmentInjector(providers: Array<Provider | EnvironmentProviders>, parent: EnvironmentInjector, debugName?: string | null): EnvironmentInjector;
|
|
1740
1735
|
|
|
1741
1736
|
/**
|
|
1742
1737
|
* Returns a new NgModuleRef instance based on the NgModule class and parent injector provided.
|
|
@@ -2386,10 +2381,18 @@ export declare interface Directive {
|
|
|
2386
2381
|
*
|
|
2387
2382
|
* More information about standalone components, directives, and pipes can be found in [this
|
|
2388
2383
|
* guide](guide/standalone-components).
|
|
2389
|
-
*
|
|
2390
|
-
* @developerPreview
|
|
2391
2384
|
*/
|
|
2392
2385
|
standalone?: boolean;
|
|
2386
|
+
/**
|
|
2387
|
+
* Standalone directives that should be applied to the host whenever the directive is matched.
|
|
2388
|
+
* By default none of the inputs or outputs of the host directives will be available on the host,
|
|
2389
|
+
* unless they are specified in the `inputs` or `outputs` properties.
|
|
2390
|
+
*/
|
|
2391
|
+
hostDirectives?: (Type<unknown> | {
|
|
2392
|
+
directive: Type<unknown>;
|
|
2393
|
+
inputs?: string[];
|
|
2394
|
+
outputs?: string[];
|
|
2395
|
+
})[];
|
|
2393
2396
|
}
|
|
2394
2397
|
|
|
2395
2398
|
/**
|
|
@@ -2717,8 +2720,6 @@ export declare const ENVIRONMENT_INITIALIZER: InjectionToken<() => void>;
|
|
|
2717
2720
|
/**
|
|
2718
2721
|
* An `Injector` that's part of the environment injector hierarchy, which exists outside of the
|
|
2719
2722
|
* component tree.
|
|
2720
|
-
*
|
|
2721
|
-
* @developerPreview
|
|
2722
2723
|
*/
|
|
2723
2724
|
export declare abstract class EnvironmentInjector implements Injector {
|
|
2724
2725
|
/**
|
|
@@ -2767,6 +2768,25 @@ export declare abstract class EnvironmentInjector implements Injector {
|
|
|
2767
2768
|
abstract destroy(): void;
|
|
2768
2769
|
}
|
|
2769
2770
|
|
|
2771
|
+
/**
|
|
2772
|
+
* Encapsulated `Provider`s that are only accepted during creation of an `EnvironmentInjector` (e.g.
|
|
2773
|
+
* in an `NgModule`).
|
|
2774
|
+
*
|
|
2775
|
+
* Using this wrapper type prevents providers which are only designed to work in
|
|
2776
|
+
* application/environment injectors from being accidentally included in
|
|
2777
|
+
* `@Component.providers` and ending up in a component injector.
|
|
2778
|
+
*
|
|
2779
|
+
* This wrapper type prevents access to the `Provider`s inside.
|
|
2780
|
+
*
|
|
2781
|
+
* @see `makeEnvironmentProviders`
|
|
2782
|
+
* @see `importProvidersFrom`
|
|
2783
|
+
*
|
|
2784
|
+
* @publicApi
|
|
2785
|
+
*/
|
|
2786
|
+
export declare type EnvironmentProviders = {
|
|
2787
|
+
ɵbrand: 'EnvironmentProviders';
|
|
2788
|
+
};
|
|
2789
|
+
|
|
2770
2790
|
|
|
2771
2791
|
/**
|
|
2772
2792
|
* Provides a hook for centralized exception handling.
|
|
@@ -3650,11 +3670,9 @@ declare const ID = 20;
|
|
|
3650
3670
|
* @see `importProvidersFrom`
|
|
3651
3671
|
*
|
|
3652
3672
|
* @publicApi
|
|
3653
|
-
* @
|
|
3673
|
+
* @deprecated replaced by `EnvironmentProviders`
|
|
3654
3674
|
*/
|
|
3655
|
-
export declare
|
|
3656
|
-
ɵproviders: Provider[];
|
|
3657
|
-
}
|
|
3675
|
+
export declare type ImportedNgModuleProviders = EnvironmentProviders;
|
|
3658
3676
|
|
|
3659
3677
|
/**
|
|
3660
3678
|
* Collects providers from all NgModules and standalone components, including transitively imported
|
|
@@ -3695,14 +3713,12 @@ export declare interface ImportedNgModuleProviders {
|
|
|
3695
3713
|
*
|
|
3696
3714
|
* @returns Collected providers from the specified list of types.
|
|
3697
3715
|
* @publicApi
|
|
3698
|
-
* @developerPreview
|
|
3699
3716
|
*/
|
|
3700
|
-
export declare function importProvidersFrom(...sources: ImportProvidersSource[]):
|
|
3717
|
+
export declare function importProvidersFrom(...sources: ImportProvidersSource[]): EnvironmentProviders;
|
|
3701
3718
|
|
|
3702
3719
|
/**
|
|
3703
3720
|
* A source of providers for the `importProvidersFrom` function.
|
|
3704
3721
|
*
|
|
3705
|
-
* @developerPreview
|
|
3706
3722
|
* @publicApi
|
|
3707
3723
|
*/
|
|
3708
3724
|
export declare type ImportProvidersSource = Type<unknown> | ModuleWithProviders<unknown> | Array<ImportProvidersSource>;
|
|
@@ -4165,7 +4181,7 @@ export declare interface InjectorType<T> extends Type<T> {
|
|
|
4165
4181
|
*/
|
|
4166
4182
|
declare interface InjectorTypeWithProviders<T> {
|
|
4167
4183
|
ngModule: InjectorType<T>;
|
|
4168
|
-
providers?: (Type<any> | ValueProvider | ExistingProvider | FactoryProvider | ConstructorProvider | StaticClassProvider | ClassProvider | any[])[];
|
|
4184
|
+
providers?: (Type<any> | ValueProvider | ExistingProvider | FactoryProvider | ConstructorProvider | StaticClassProvider | ClassProvider | EnvironmentProviders | any[])[];
|
|
4169
4185
|
}
|
|
4170
4186
|
|
|
4171
4187
|
/**
|
|
@@ -5152,6 +5168,12 @@ declare const enum LViewFlags {
|
|
|
5152
5168
|
IndexWithinInitPhaseReset = 2047
|
|
5153
5169
|
}
|
|
5154
5170
|
|
|
5171
|
+
/**
|
|
5172
|
+
* Wrap an array of `Provider`s into `EnvironmentProviders`, preventing them from being accidentally
|
|
5173
|
+
* referenced in `@Component in a component injector.
|
|
5174
|
+
*/
|
|
5175
|
+
export declare function makeEnvironmentProviders(providers: Provider[]): EnvironmentProviders;
|
|
5176
|
+
|
|
5155
5177
|
/**
|
|
5156
5178
|
* Use this enum at bootstrap as an option of `bootstrapModule` to define the strategy
|
|
5157
5179
|
* that the compiler should use in case of missing translations:
|
|
@@ -5207,7 +5229,7 @@ export declare class ModuleWithComponentFactories<T> {
|
|
|
5207
5229
|
*/
|
|
5208
5230
|
export declare interface ModuleWithProviders<T> {
|
|
5209
5231
|
ngModule: Type<T>;
|
|
5210
|
-
providers?: Provider
|
|
5232
|
+
providers?: Array<Provider | EnvironmentProviders>;
|
|
5211
5233
|
}
|
|
5212
5234
|
|
|
5213
5235
|
declare const MOVED_VIEWS = 9;
|
|
@@ -5276,7 +5298,7 @@ export declare interface NgModule {
|
|
|
5276
5298
|
* }
|
|
5277
5299
|
* ```
|
|
5278
5300
|
*/
|
|
5279
|
-
providers?: Provider
|
|
5301
|
+
providers?: Array<Provider | EnvironmentProviders>;
|
|
5280
5302
|
/**
|
|
5281
5303
|
* The set of components, directives, and pipes ([declarables](guide/glossary#declarable))
|
|
5282
5304
|
* that belong to this module.
|
|
@@ -6505,7 +6527,7 @@ declare class R3Injector extends EnvironmentInjector {
|
|
|
6505
6527
|
get destroyed(): boolean;
|
|
6506
6528
|
private _destroyed;
|
|
6507
6529
|
private injectorDefTypes;
|
|
6508
|
-
constructor(providers: Array<Provider |
|
|
6530
|
+
constructor(providers: Array<Provider | EnvironmentProviders>, parent: Injector, source: string | null, scopes: Set<InjectorScope>);
|
|
6509
6531
|
/**
|
|
6510
6532
|
* Destroy the injector and release references to every instance or provider associated with it.
|
|
6511
6533
|
*
|
|
@@ -10442,10 +10464,20 @@ export declare const ɵINJECTOR_SCOPE: InjectionToken<InjectorScope | null>;
|
|
|
10442
10464
|
*/
|
|
10443
10465
|
export declare function ɵinternalCreateApplication(config: {
|
|
10444
10466
|
rootComponent?: Type<unknown>;
|
|
10445
|
-
appProviders?: Array<Provider |
|
|
10467
|
+
appProviders?: Array<Provider | EnvironmentProviders>;
|
|
10446
10468
|
platformProviders?: Provider[];
|
|
10447
10469
|
}): Promise<ApplicationRef>;
|
|
10448
10470
|
|
|
10471
|
+
export declare interface ɵInternalEnvironmentProviders extends EnvironmentProviders {
|
|
10472
|
+
ɵproviders: Provider[];
|
|
10473
|
+
/**
|
|
10474
|
+
* If present, indicates that the `EnvironmentProviders` were derived from NgModule providers.
|
|
10475
|
+
*
|
|
10476
|
+
* This is used to produce clearer error messages.
|
|
10477
|
+
*/
|
|
10478
|
+
ɵfromNgModule?: true;
|
|
10479
|
+
}
|
|
10480
|
+
|
|
10449
10481
|
export declare function ɵisBoundToModule<C>(cf: ComponentFactory<C>): boolean;
|
|
10450
10482
|
|
|
10451
10483
|
/**
|
|
@@ -10457,6 +10489,8 @@ export declare function ɵisBoundToModule<C>(cf: ComponentFactory<C>): boolean;
|
|
|
10457
10489
|
*/
|
|
10458
10490
|
export declare function ɵisDefaultChangeDetectionStrategy(changeDetectionStrategy: ChangeDetectionStrategy): boolean;
|
|
10459
10491
|
|
|
10492
|
+
export declare function ɵisEnvironmentProviders(value: Provider | ɵInternalEnvironmentProviders): value is ɵInternalEnvironmentProviders;
|
|
10493
|
+
|
|
10460
10494
|
export declare function ɵisInjectable(type: any): boolean;
|
|
10461
10495
|
|
|
10462
10496
|
export declare function ɵisListLikeIterable(obj: any): boolean;
|
|
@@ -12956,7 +12990,7 @@ export declare type ɵɵInjectorDeclaration<T> = unknown;
|
|
|
12956
12990
|
* @codeGenApi
|
|
12957
12991
|
*/
|
|
12958
12992
|
export declare interface ɵɵInjectorDef<T> {
|
|
12959
|
-
providers: (Type<any> | ValueProvider | ExistingProvider | FactoryProvider | ConstructorProvider | StaticClassProvider | ClassProvider | any[])[];
|
|
12993
|
+
providers: (Type<any> | ValueProvider | ExistingProvider | FactoryProvider | ConstructorProvider | StaticClassProvider | ClassProvider | EnvironmentProviders | any[])[];
|
|
12960
12994
|
imports: (InjectorType<any> | InjectorTypeWithProviders<any>)[];
|
|
12961
12995
|
}
|
|
12962
12996
|
|
package/package.json
CHANGED
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@angular/core",
|
|
3
|
-
"version": "15.0.0-
|
|
3
|
+
"version": "15.0.0-rc.0",
|
|
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;
|