Skip to content

Commit c4f5c66

Browse files
committed
TypescriptAPIUtils.appendImport: resolve imports with typescript
1 parent 9cd87e3 commit c4f5c66

File tree

13 files changed

+67
-12
lines changed

13 files changed

+67
-12
lines changed

packages/typescript-api-utils/resolvers/requireResolver.ts

Lines changed: 15 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -36,16 +36,28 @@ export function resolveRawRequire(fromFile: string, file: string, moduleResoluti
3636
}
3737

3838

39-
export function resolveRequire(fromFile: string, file: string, compilerOptions: ts.CompilerOptions, moduleResolutionHost: ts.ModuleResolutionHost): RequiredFile|undefined
39+
export function resolveRequirePath(fromFile: string, file: string, compilerOptions: ts.CompilerOptions, moduleResolutionHost: ts.ModuleResolutionHost): string|undefined
4040
{
4141
const module = <ts.ResolvedModuleWithFailedLookupLocations>ts.resolveModuleName(file, fromFile, compilerOptions, moduleResolutionHost);
4242

4343
if (!exists(module.resolvedModule)) {
4444
return;
4545
}
4646

47+
return module.resolvedModule.resolvedFileName;
48+
}
49+
50+
51+
export function resolveRequire(fromFile: string, file: string, compilerOptions: ts.CompilerOptions, moduleResolutionHost: ts.ModuleResolutionHost): RequiredFile|undefined
52+
{
53+
const resolvedPath = resolveRequirePath(fromFile, file, compilerOptions, moduleResolutionHost);
54+
55+
if (!resolvedPath) {
56+
return;
57+
}
58+
4759
return {
48-
path: module.resolvedModule.resolvedFileName,
49-
source: moduleResolutionHost.readFile(module.resolvedModule.resolvedFileName),
60+
path: resolvedPath,
61+
source: moduleResolutionHost.readFile(resolvedPath),
5062
};
5163
}

packages/typescript-api-utils/sourceFiles/appendImport.ts

Lines changed: 17 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,11 @@
11
import {clone, exists, find} from '@slicky/utils';
22
import {findNodesByType} from './findNodesByType';
3+
import {resolveRequirePath} from '../resolvers';
34
import * as ts from 'typescript';
5+
import * as path from 'path';
46

57

6-
export function appendImport(moduleSpecifier: string, propertyName: string|undefined, name: string, sourceFile: ts.SourceFile, noImportReuseOnDifferentNames: boolean = false): string
8+
export function appendImport(moduleSpecifier: string, propertyName: string|undefined, name: string, sourceFile: ts.SourceFile, compilerOptions: ts.CompilerOptions, moduleResolutionHost: ts.ModuleResolutionHost, noImportReuseOnDifferentNames: boolean = false): string
79
{
810
const imports = findNodesByType<ts.ImportDeclaration>(ts.SyntaxKind.ImportDeclaration, sourceFile);
911
const pos = imports.length ? (sourceFile.statements.indexOf(imports[imports.length - 1]) + 1 || 0) : 0;
@@ -14,7 +16,7 @@ export function appendImport(moduleSpecifier: string, propertyName: string|undef
1416
exists(existingImport.importClause.namedBindings) &&
1517
ts.isNamedImports(existingImport.importClause.namedBindings) &&
1618
ts.isStringLiteral(existingImport.moduleSpecifier) &&
17-
(<ts.StringLiteral>existingImport.moduleSpecifier).text === moduleSpecifier
19+
compareModuleSpecifiers(sourceFile.fileName, (<ts.StringLiteral>existingImport.moduleSpecifier).text, moduleSpecifier, compilerOptions, moduleResolutionHost)
1820
);
1921
});
2022

@@ -69,6 +71,19 @@ export function appendImport(moduleSpecifier: string, propertyName: string|undef
6971
}
7072

7173

74+
function compareModuleSpecifiers(file: string, a: string, b: string, compilerOptions: ts.CompilerOptions, moduleResolutionHost: ts.ModuleResolutionHost): boolean
75+
{
76+
if (a === b) {
77+
return true;
78+
}
79+
80+
a = resolveRequirePath(file, a, compilerOptions, moduleResolutionHost);
81+
b = resolveRequirePath(file, b, compilerOptions, moduleResolutionHost);
82+
83+
return a === b;
84+
}
85+
86+
7287
function createNewImportDeclaration(moduleSpecifier: string, propertyName: string|undefined, name: string): ts.ImportDeclaration
7388
{
7489
return ts.createImportDeclaration(

packages/typescript-api-utils/sourceFiles/appendImportsBuffer.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -28,10 +28,10 @@ export class AppendImportsBuffer
2828
}
2929

3030

31-
public applyImports(sourceFile: ts.SourceFile): void
31+
public applyImports(sourceFile: ts.SourceFile, compilerOptions: ts.CompilerOptions, moduleResolutionHost: ts.ModuleResolutionHost): void
3232
{
3333
forEach(this.imports, (newImport: ImportItem) => {
34-
appendImport(newImport.moduleSpecifier, newImport.propertyName, newImport.name, sourceFile, true);
34+
appendImport(newImport.moduleSpecifier, newImport.propertyName, newImport.name, sourceFile, compilerOptions, moduleResolutionHost, true);
3535
});
3636
}
3737

packages/typescript-api-utils/tests/data/sourceFiles/appendImport/valid_11.original.ts

Whitespace-only changes.
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
import { A } from "./import";
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
export const A = '';
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
import {A} from './valid_12.import';
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
import { A } from "./valid_12.import";
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
export const A = '';
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
export const B = '';

0 commit comments

Comments
 (0)