UNPKG

@ainc/script

Version:

Script compiler for typescript

100 lines 3.95 kB
/** ***************************************** * Created by edonet@163.com * Created on 2021-07-07 22:35:20 ***************************************** */ 'use strict'; Object.defineProperty(exports, "__esModule", { value: true }); exports.transformer = void 0; /** ***************************************** * 加载依赖 ***************************************** */ const ts = require("typescript"); const cwd_1 = require("@ainc/fs/dist/cwd"); const dirname_1 = require("@ainc/fs/dist/dirname"); const relative_1 = require("@ainc/fs/dist/relative"); const isBuiltinModule_1 = require("./isBuiltinModule"); /** ***************************************** * 定义转换器 ***************************************** */ function transformer(context) { const calls = ['import', 'require', 'require.resolve']; const factory = context.factory; const compilerOptions = context.getCompilerOptions(); // 转换文件节点 return (sourceFile) => { const { fileName, resolvedModules } = sourceFile; const file = (0, cwd_1.cwd)(fileName); const dir = (0, dirname_1.dirname)(file); // 解析模块 function resolveModule(id) { const cached = resolvedModules.get(id); // 返回缓存 if (cached) { return cached; } // 解析模块 const { resolvedModule } = ts.resolveModuleName(id, file, compilerOptions, ts.sys); // 解析失败 if (!resolvedModule) { return; } // 更新缓存 resolvedModules.set(id, resolvedModule); // 返回结果 return resolvedModule; } // 访问模块节点 function visitModuleSpecifier(node) { if (ts.isStringLiteral(node)) { const { text } = node || {}; // 不处理相对模块 if (text && !(0, isBuiltinModule_1.isBuiltinModule)(text) && text.charAt(0) !== '.') { const resolved = resolveModule(text); // 不处理外部模块 if (resolved && !resolved.isExternalLibraryImport) { const { resolvedFileName, extension } = resolved; // 生成节点 return factory.createStringLiteral((0, relative_1.relative)(dir, (0, cwd_1.cwd)(resolvedFileName.slice(0, -extension.length)))); } } } // 返回原节点 return node; } // 访问调用节点 function visitCallDeclaration(node) { if (ts.isCallExpression(node)) { const id = node.expression.getText(); // 匹配函数名且只有一个参数时处理 if (calls.includes(id) && node.arguments.length === 1 && ts.isStringLiteral(node.arguments[0])) { return factory.updateCallExpression(node, node.expression, node.typeArguments, ts.visitNodes(node.arguments, visitModuleSpecifier)); } } // 访问子节点 return ts.visitEachChild(node, visitCallDeclaration, context); } // 访问文件子节点 function visitSourceFile(node) { // 处理载入节点 if (ts.isImportDeclaration(node)) { return ts.visitEachChild(node, visitModuleSpecifier, context); } // 处理抛出节点 if (ts.isExportDeclaration(node)) { return ts.visitEachChild(node, visitModuleSpecifier, context); } // 返回节点 return visitCallDeclaration(node); } // 访问文件子节点 return ts.visitEachChild(sourceFile, visitSourceFile, context); }; } exports.transformer = transformer; //# sourceMappingURL=module-paths-transformer.js.map