@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.
Files changed (39) hide show
  1. package/esm2020/src/application_ref.mjs +1 -1
  2. package/esm2020/src/core_private_export.mjs +2 -1
  3. package/esm2020/src/di/index.mjs +2 -2
  4. package/esm2020/src/di/interface/defs.mjs +1 -1
  5. package/esm2020/src/di/interface/provider.mjs +4 -2
  6. package/esm2020/src/di/provider_collection.mjs +30 -5
  7. package/esm2020/src/di/r3_injector.mjs +4 -8
  8. package/esm2020/src/metadata/directives.mjs +1 -1
  9. package/esm2020/src/metadata/ng_module.mjs +1 -1
  10. package/esm2020/src/render3/errors_di.mjs +9 -3
  11. package/esm2020/src/render3/features/host_directives_feature.mjs +6 -7
  12. package/esm2020/src/render3/jit/directive.mjs +2 -6
  13. package/esm2020/src/render3/ng_module_ref.mjs +1 -2
  14. package/esm2020/src/version.mjs +1 -1
  15. package/esm2020/testing/src/logger.mjs +3 -3
  16. package/esm2020/testing/src/ng_zone_mock.mjs +3 -3
  17. package/esm2020/testing/src/test_bed_compiler.mjs +29 -11
  18. package/fesm2015/core.mjs +57 -28
  19. package/fesm2015/core.mjs.map +1 -1
  20. package/fesm2015/testing.mjs +83 -32
  21. package/fesm2015/testing.mjs.map +1 -1
  22. package/fesm2020/core.mjs +57 -28
  23. package/fesm2020/core.mjs.map +1 -1
  24. package/fesm2020/testing.mjs +83 -32
  25. package/fesm2020/testing.mjs.map +1 -1
  26. package/index.d.ts +58 -24
  27. package/package.json +2 -2
  28. package/schematics/migrations/relative-link-resolution/index.d.ts +10 -0
  29. package/schematics/migrations/relative-link-resolution/index.js +68 -0
  30. package/schematics/migrations/relative-link-resolution/util.d.ts +20 -0
  31. package/schematics/migrations/relative-link-resolution/util.js +82 -0
  32. package/schematics/migrations/router-link-with-href/index.d.ts +10 -0
  33. package/schematics/migrations/router-link-with-href/index.js +70 -0
  34. package/schematics/migrations/router-link-with-href/util.d.ts +19 -0
  35. package/schematics/migrations/router-link-with-href/util.js +111 -0
  36. package/schematics/migrations.json +10 -0
  37. package/schematics/utils/typescript/imports.d.ts +10 -0
  38. package/schematics/utils/typescript/imports.js +17 -2
  39. 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.5
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 | ImportedNgModuleProviders>, parent: EnvironmentInjector, debugName?: string | null): EnvironmentInjector;
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
- * @developerPreview
3673
+ * @deprecated replaced by `EnvironmentProviders`
3654
3674
  */
3655
- export declare interface ImportedNgModuleProviders {
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[]): ImportedNgModuleProviders;
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 | ImportedNgModuleProviders>, parent: Injector, source: string | null, scopes: Set<InjectorScope>);
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 | ImportedNgModuleProviders>;
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-next.5",
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.15.0 || >=16.10.0"
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;