Skip to content

Commit 9f08ff2

Browse files
committed
refactor(migrations): support statistic tracking in tsurge migrations (angular#58019)
We should support tracking statistics in Tsurge migrations. This allows us to print them after migration, or run migrations periodically as large scale changes to track to progress. TODO is an internal implementation that eventually runs periodcally in LSC modes. PR Close angular#58019
1 parent e77a163 commit 9f08ff2

File tree

4 files changed

+46
-16
lines changed

4 files changed

+46
-16
lines changed

packages/core/schematics/utils/tsurge/base_migration.ts

Lines changed: 23 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,14 +11,27 @@ import {isShim} from '@angular/compiler-cli/src/ngtsc/shims';
1111
import {createNgtscProgram} from './helpers/ngtsc_program';
1212
import {BaseProgramInfo, ProgramInfo} from './program_info';
1313
import {getRootDirs} from '@angular/compiler-cli/src/ngtsc/util/src/typescript';
14+
import {Serializable} from './helpers/serializable';
1415

1516
/**
17+
* Type describing statistics that could be tracked
18+
* by migrations.
19+
*
20+
* Statistics may be tracked depending on the runner.
21+
*/
22+
export interface MigrationStats {
23+
counters: Record<string, number>;
24+
}
25+
26+
/**
27+
* @private
28+
*
1629
* Base class for the possible Tsurge migration variants.
1730
*
1831
* For example, this class exposes methods to conveniently create
1932
* TypeScript programs, while also allowing migration authors to override.
2033
*/
21-
export abstract class TsurgeBaseMigration {
34+
export abstract class TsurgeBaseMigration<UnitAnalysisMetadata, CombinedGlobalMetadata> {
2235
// By default, ngtsc programs are being created.
2336
createProgram(tsconfigAbsPath: string, fs?: FileSystem): BaseProgramInfo {
2437
return createNgtscProgram(tsconfigAbsPath, fs);
@@ -56,4 +69,13 @@ export abstract class TsurgeBaseMigration {
5669
projectRoot: primaryRoot,
5770
};
5871
}
72+
73+
/** Analyzes the given TypeScript project and returns serializable compilation unit data. */
74+
abstract analyze(info: ProgramInfo): Promise<Serializable<UnitAnalysisMetadata>>;
75+
76+
/** Merges all compilation unit data from previous analysis phases into a global result. */
77+
abstract merge(units: UnitAnalysisMetadata[]): Promise<Serializable<CombinedGlobalMetadata>>;
78+
79+
/** Extract statistics based on the global metadata. */
80+
abstract stats(globalMetadata: CombinedGlobalMetadata): Promise<MigrationStats>;
5981
}

packages/core/schematics/utils/tsurge/index.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
* found in the LICENSE file at https://angular.dev/license
77
*/
88

9+
export * from './base_migration';
910
export * from './migration';
1011
export * from './program_info';
1112
export * from './replacement';

packages/core/schematics/utils/tsurge/migration.ts

Lines changed: 2 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -54,14 +54,7 @@ export type TsurgeMigration<UnitAnalysisMetadata, CombinedGlobalMetadata> =
5454
export abstract class TsurgeFunnelMigration<
5555
UnitAnalysisMetadata,
5656
CombinedGlobalMetadata,
57-
PreparationInfo = ProgramInfo,
58-
> extends TsurgeBaseMigration {
59-
/** Analyzes the given TypeScript project and returns serializable compilation unit data. */
60-
abstract analyze(info: PreparationInfo): Promise<Serializable<UnitAnalysisMetadata>>;
61-
62-
/** Merges all compilation unit data from previous analysis phases into a global result. */
63-
abstract merge(units: UnitAnalysisMetadata[]): Promise<Serializable<CombinedGlobalMetadata>>;
64-
57+
> extends TsurgeBaseMigration<UnitAnalysisMetadata, CombinedGlobalMetadata> {
6558
/**
6659
* Finalizes the migration result.
6760
*
@@ -86,13 +79,7 @@ export abstract class TsurgeFunnelMigration<
8679
export abstract class TsurgeComplexMigration<
8780
UnitAnalysisMetadata,
8881
CombinedGlobalMetadata,
89-
> extends TsurgeBaseMigration {
90-
/** Analyzes the given TypeScript project and returns serializable compilation unit data. */
91-
abstract analyze(info: ProgramInfo): Promise<Serializable<UnitAnalysisMetadata>>;
92-
93-
/** Merges all compilation unit data from previous analysis phases into a global result. */
94-
abstract merge(units: UnitAnalysisMetadata[]): Promise<Serializable<CombinedGlobalMetadata>>;
95-
82+
> extends TsurgeBaseMigration<UnitAnalysisMetadata, CombinedGlobalMetadata> {
9683
/**
9784
* Migration phase. Workers will be started for every compilation unit again,
9885
* instantiating a new program for every unit to compute the final migration

packages/core/schematics/utils/tsurge/test/output_migration.ts

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ import {ProgramInfo} from '../program_info';
1414
import {Replacement, TextUpdate} from '../replacement';
1515
import {findOutputDeclarationsAndReferences, OutputID} from './output_helpers';
1616
import {projectFile} from '../project_paths';
17+
import {MigrationStats} from '../base_migration';
1718

1819
type AnalysisUnit = {[id: OutputID]: {seenProblematicUsage: boolean}};
1920
type GlobalMetadata = {[id: OutputID]: {canBeMigrated: boolean}};
@@ -107,4 +108,23 @@ export class OutputMigration extends TsurgeComplexMigration<AnalysisUnit, Global
107108

108109
return replacements;
109110
}
111+
112+
override async stats(globalMetadata: GlobalMetadata): Promise<MigrationStats> {
113+
let allOutputs = 0;
114+
let migratedOutputs = 0;
115+
116+
for (const output of Object.values(globalMetadata)) {
117+
allOutputs++;
118+
if (output.canBeMigrated) {
119+
migratedOutputs++;
120+
}
121+
}
122+
123+
return {
124+
counters: {
125+
allOutputs,
126+
migratedOutputs,
127+
},
128+
};
129+
}
110130
}

0 commit comments

Comments
 (0)