Typescript Compiler API: Hvordan man får absolut sti til kildefilen for et importmodul ved hjælp af Typescript compiler API
Jeg forsøger at få stioplysningerne på følgende måde:
const typeChecker = program.getTypeChecker();
const importFileSymbol = typeChecker.getSymbolAtLocation(
importDeclarationNode.moduleSpecifier
);
const path = importFileSymbol?.valueDeclaration?.path || '';
På denne måde kan jeg få sourceFile-objektet for modulets kildefil og få modullets absolutte sti gennem path-attributten på sourceFile. Men path er en intern egenskab i TypeScript og eksponerer ikke typen, så jeg tror, der kan være nogle problemer med denne brug.
Så jeg spekulerer på, om der er nogen anden måde at få det på?
Jeg prøvede også at få det gennem fileName-ejendommen af sourceFile, men for moduler importeret gennem sti-mapping, er den opnåede sti ikke en absolut sti.
Svar #1
Jeg har ikke gjort det præcist, som du prøver at parse det, men jeg var i stand til at bruge resolveModuleName-metoden i TypeScript API'en til at opnå det, du spørger om, ved at følge dokumentationen her
import * as fs from 'fs';
import * as ts from 'typescript';
function resolvePathsToModuleImports(typescriptFilePath: string) {
// To use the typescript module resolution, you need to get the tsconfig
// Here we assume you already have a reference to the tsconfig JSON
const tsConfigObject = ts.parseJsonConfigFileContent(
TSCONFIG_JSON_CONTENT,
ts.sys,
PATH_TO_BASE_OF_PROJECT
);
const fileContent = fs.readFileSync(typescriptFilePath).toString();
// Preprocess the typescript file using the compiler API
// to get the raw imports as represented in the file
const fileInfo = ts.preProcessFile(fileContent);
// You can then get the file path, etc, by resolving the imports via the
// compiler API
fileInfo.importedFiles
.map(importedModule => importedModule.fileName)
.forEach(rawImport => {
const resolvedImport =
ts.resolveModuleName(
rawImport,
typescriptFilePath,
tsConfigObject.options,
ts.sys);
// Depending on how fancy your ts is, the
// "resolvedImport.resolvedModule.resolvedFileName" may not exist,
// but should resolve for all ts files
const importLoc = resolvedImport.resolvedModule.resolvedFileName;
console.log(`File ${typescriptFilePath} imports ${rawImport} from location ${importLoc}`);
});
}
