Skip to content

Commit c3d6ce2

Browse files
Copilotdamyanpetev
andauthored
refactor(migrations): use tsUtils for import checks in 21.0.0 migration (#16550)
Co-authored-by: damyanpetev <[email protected]>
1 parent a0fc0fa commit c3d6ce2

File tree

3 files changed

+34
-34
lines changed

3 files changed

+34
-34
lines changed

projects/igniteui-angular/migrations/common/tsUtils.ts

Lines changed: 23 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -7,11 +7,25 @@ import { Logger } from './tsLogger';
77
import { TSLanguageService } from './tsPlugin/TSLanguageService';
88

99
export const IG_PACKAGE_NAME = 'igniteui-angular';
10+
export const IG_LICENSED_PACKAGE_NAME = '@infragistics/igniteui-angular';
1011
export const NG_LANG_SERVICE_PACKAGE_NAME = '@angular/language-service';
1112
export const NG_CORE_PACKAGE_NAME = '@angular/core';
1213
export const CUSTOM_TS_PLUGIN_PATH = './tsPlugin';
1314
export const CUSTOM_TS_PLUGIN_NAME = 'igx-ts-plugin';
1415

16+
/**
17+
* Checks if the given import path is from igniteui-angular package.
18+
* Handles both OSS (igniteui-angular) and licensed (@infragistics/igniteui-angular) versions,
19+
* as well as subpaths (e.g., igniteui-angular/core, @infragistics/igniteui-angular/grids).
20+
* @param importPath The module specifier text to check
21+
* @returns true if the import path is from igniteui-angular package
22+
*/
23+
export const isIgniteuiImport = (importPath: string): boolean =>
24+
importPath === IG_PACKAGE_NAME ||
25+
importPath === IG_LICENSED_PACKAGE_NAME ||
26+
importPath.startsWith(`${IG_PACKAGE_NAME}/`) ||
27+
importPath.startsWith(`${IG_LICENSED_PACKAGE_NAME}/`);
28+
1529
enum SyntaxTokens {
1630
ClosingParenthesis = ')',
1731
MemberAccess = '.',
@@ -83,13 +97,13 @@ export const getImportModulePositions = (sourceText: string, startsWith: string)
8397
return positions;
8498
};
8599

86-
/** Filters out statements to named imports (e.g. `import {x, y}`) from PACKAGE_IMPORT */
87-
export const namedImportFilter = (statement: ts.Statement) => {
88-
if (statement.kind === ts.SyntaxKind.ImportDeclaration &&
89-
((statement as ts.ImportDeclaration).moduleSpecifier as ts.StringLiteral).text.endsWith(IG_PACKAGE_NAME)) {
90-
91-
const clause = (statement as ts.ImportDeclaration).importClause;
92-
return clause && clause.namedBindings && clause.namedBindings.kind === ts.SyntaxKind.NamedImports;
100+
/** Filters out statements to named imports (e.g. `import {x, y}`) from IG_PACKAGE_NAME */
101+
export const igNamedImportFilter = (
102+
statement: ts.Statement,
103+
): statement is ts.ImportDeclaration & { moduleSpecifier: ts.StringLiteral } & { importClause: { namedBindings: ts.NamedImports } } => {
104+
if (ts.isImportDeclaration(statement) && ts.isStringLiteral(statement.moduleSpecifier) && isIgniteuiImport(statement.moduleSpecifier.text)) {
105+
const clause = statement.importClause;
106+
return clause?.namedBindings && clause.namedBindings.kind === ts.SyntaxKind.NamedImports;
93107
}
94108
return false;
95109
};
@@ -100,14 +114,13 @@ export const getRenamePositions = (sourcePath: string, name: string, service: ts
100114
const source = service.getProgram().getSourceFile(sourcePath);
101115
const positions = [];
102116

103-
// eslint-disable-next-line @typescript-eslint/consistent-type-assertions
104-
const imports = source.statements.filter(<(a: ts.Statement) => a is ts.ImportDeclaration>namedImportFilter);
117+
const imports = source.statements.filter(igNamedImportFilter);
105118
if (!imports.length) {
106119
return positions;
107120
}
108121
const elements: ts.NodeArray<ts.ImportSpecifier> =
109122
imports
110-
.map(x => (x.importClause.namedBindings as ts.NamedImports).elements)
123+
.map(x => x.importClause.namedBindings.elements)
111124
.reduce((prev, current) => prev.concat(current) as unknown as ts.NodeArray<ts.ImportSpecifier>);
112125

113126
for (const elem of elements) {

projects/igniteui-angular/migrations/update-17_0_0/index.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ import * as ts from 'typescript';
88
import { UpdateChanges } from '../common/UpdateChanges';
99
// use bare specifier to escape the schematics encapsulation for the dynamic import:
1010
import { nativeImport } from 'igniteui-angular/migrations/common/import-helper.js';
11-
import { namedImportFilter } from '../common/tsUtils';
11+
import { igNamedImportFilter } from '../common/tsUtils';
1212
import { FileChange, findElementNodes, getAttribute, getSourceOffset, hasAttribute, parseFile } from '../common/util';
1313

1414
const version = '17.0.0';
@@ -95,7 +95,7 @@ export default (): Rule => async (host: Tree, context: SchematicContext) => {
9595
var fileContent = host.read(filePath).toString();
9696

9797
const source = ts.createSourceFile('', fileContent, ts.ScriptTarget.Latest, true)
98-
const igImports = source.statements.filter(<(a: ts.Statement) => a is ts.ImportDeclaration>namedImportFilter);
98+
const igImports = source.statements.filter(igNamedImportFilter);
9999

100100
// Find all animations imported from 'igniteui-angular' and delete them.
101101
for (const igImport of igImports) {

projects/igniteui-angular/migrations/update-21_0_0_import-migration/index.ts

Lines changed: 9 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import type {
55
Tree
66
} from '@angular-devkit/schematics';
77
import * as ts from 'typescript';
8+
import { IG_PACKAGE_NAME, IG_LICENSED_PACKAGE_NAME, igNamedImportFilter } from '../common/tsUtils';
89

910
const version = '21.0.0';
1011

@@ -711,31 +712,17 @@ const TYPE_RENAMES = new Map<string, { newName: string, entryPoint: string }>([
711712
]);
712713

713714
function migrateImportDeclaration(node: ts.ImportDeclaration, sourceFile: ts.SourceFile): { start: number, end: number, replacement: string } | null {
714-
const moduleSpecifier = node.moduleSpecifier;
715-
if (!ts.isStringLiteral(moduleSpecifier)) {
715+
if (!igNamedImportFilter(node)) {
716716
return null;
717717
}
718718

719-
const importPath = moduleSpecifier.text;
720-
721-
// Only process igniteui-angular imports (not already using entry points)
722-
if (importPath !== 'igniteui-angular' && importPath !== '@infragistics/igniteui-angular') {
723-
return null;
724-
}
725-
726-
const importClause = node.importClause;
727-
if (!importClause || !importClause.namedBindings) {
728-
return null;
729-
}
730-
731-
if (!ts.isNamedImports(importClause.namedBindings)) {
732-
return null;
733-
}
719+
const importPath = node.moduleSpecifier.text;
720+
const namedBindings = node.importClause.namedBindings;
734721

735722
// Group imports by entry point
736723
const entryPointGroups = new Map<string, string[]>();
737724

738-
for (const element of importClause.namedBindings.elements) {
725+
for (const element of namedBindings.elements) {
739726
const name = element.name.text;
740727
const alias = element.propertyName?.text;
741728
const importName = alias || name;
@@ -800,7 +787,7 @@ function migrateFile(filePath: string, content: string): string {
800787

801788
// Track old type names that were imported
802789
const moduleSpecifier = node.moduleSpecifier;
803-
if (ts.isStringLiteral(moduleSpecifier) && (moduleSpecifier.text === 'igniteui-angular' || moduleSpecifier.text === '@infragistics/igniteui-angular')) {
790+
if (ts.isStringLiteral(moduleSpecifier) && (moduleSpecifier.text === IG_PACKAGE_NAME || moduleSpecifier.text === IG_LICENSED_PACKAGE_NAME)) {
804791
const importClause = node.importClause;
805792
if (importClause?.namedBindings && ts.isNamedImports(importClause.namedBindings)) {
806793
for (const element of importClause.namedBindings.elements) {
@@ -877,9 +864,9 @@ export default function migrate(): Rule {
877864

878865
const originalContent = content.toString();
879866

880-
// Check if file has igniteui-angular imports
881-
if (!originalContent.includes("from 'igniteui-angular'") && !originalContent.includes('from "igniteui-angular"') &&
882-
!originalContent.includes("from '@infragistics/igniteui-angular'") && !originalContent.includes('from "@infragistics/igniteui-angular"')) {
867+
// Check if file has base igniteui-angular imports
868+
if (!originalContent.includes(`from '${IG_PACKAGE_NAME}'`) && !originalContent.includes(`from "${IG_PACKAGE_NAME}"`) &&
869+
!originalContent.includes(`from '${IG_LICENSED_PACKAGE_NAME}'`) && !originalContent.includes(`from "${IG_LICENSED_PACKAGE_NAME}"`)) {
883870
return;
884871
}
885872

0 commit comments

Comments
 (0)