import assert from 'node:assert';
import util from 'node:util';
import ts from 'typescript';
export function changeExtensionInImportPaths(config: { extension: string }) {
const { extension } = config;
return (context: ts.TransformationContext) => {
const { factory } = context;
return visitSourceFile;
function visitSourceFile(sourceFile: ts.SourceFile) {
return ts.visitNode(sourceFile, visitNode);
}
function visitNode(node: ts.Node): ts.Node {
const source: string | undefined = (node as any).moduleSpecifier?.text;
if (source?.startsWith('./') || source?.startsWith('../')) {
const newSource = source.replace(/\.js$/, extension);
if (ts.isImportDeclaration(node)) {
return factory.updateImportDeclaration(
node,
node.decorators,
node.modifiers,
node.importClause,
factory.createStringLiteral(newSource),
node.assertClause,
);
}
if (ts.isExportDeclaration(node)) {
return factory.updateExportDeclaration(
node,
node.decorators,
node.modifiers,
node.isTypeOnly,
node.exportClause,
factory.createStringLiteral(newSource),
node.assertClause,
);
}
assert(
false,
'Unexpected node with moduleSpecifier: ' + util.inspect(node),
);
}
return ts.visitEachChild(node, visitNode, context);
}
};
}