egg-ts-helper
Version:
egg typescript helper
514 lines • 41 kB
JavaScript
;
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.TS_CONFIG = exports.JS_CONFIG = void 0;
exports.getEggInfo = getEggInfo;
exports.convertString = convertString;
exports.isIdentifierName = isIdentifierName;
exports.loadFiles = loadFiles;
exports.writeJsConfig = writeJsConfig;
exports.writeTsConfig = writeTsConfig;
exports.checkMaybeIsTsProj = checkMaybeIsTsProj;
exports.checkMaybeIsJsProj = checkMaybeIsJsProj;
exports.loadModules = loadModules;
exports.strToFn = strToFn;
exports.pickFields = pickFields;
exports.log = log;
exports.getImportStr = getImportStr;
exports.writeFileSync = writeFileSync;
exports.cleanJs = cleanJs;
exports.getModuleObjByPath = getModuleObjByPath;
exports.formatPath = formatPath;
exports.toArray = toArray;
exports.removeSameNameJs = removeSameNameJs;
exports.resolveModule = resolveModule;
exports.moduleExist = moduleExist;
exports.requireFile = requireFile;
exports.extend = extend;
exports.parseJson = parseJson;
exports.getPkgInfo = getPkgInfo;
exports.readJson = readJson;
exports.readJson5 = readJson5;
exports.formatProp = formatProp;
exports.camelProp = camelProp;
exports.loadTsConfig = loadTsConfig;
exports.findExportNode = findExportNode;
exports.isClass = isClass;
exports.modifierHas = modifierHas;
exports.cleanEmpty = cleanEmpty;
const node_fs_1 = __importDefault(require("node:fs"));
const globby_1 = __importDefault(require("globby"));
const node_path_1 = __importDefault(require("node:path"));
const typescript_1 = __importDefault(require("typescript"));
const yn_1 = __importDefault(require("yn"));
const node_child_process_1 = require("node:child_process");
const json5_1 = __importDefault(require("json5"));
const config_1 = require("./config");
exports.JS_CONFIG = {
include: ['**/*'],
};
exports.TS_CONFIG = {
compilerOptions: {
target: typescript_1.default.ScriptTarget.ES2017,
module: typescript_1.default.ModuleKind.CommonJS,
strict: true,
noImplicitAny: false,
experimentalDecorators: true,
emitDecoratorMetadata: true,
allowSyntheticDefaultImports: true,
allowJs: false,
pretty: true,
lib: ['es6'],
noEmitOnError: false,
noUnusedLocals: true,
noUnusedParameters: true,
allowUnreachableCode: false,
allowUnusedLabels: false,
strictPropertyInitialization: false,
noFallthroughCasesInSwitch: true,
skipLibCheck: true,
skipDefaultLibCheck: true,
inlineSourceMap: true,
},
};
const cacheEggInfo = {};
function getEggInfo(option) {
const { cacheIndex, cwd, customLoader } = option;
const cacheKey = cacheIndex ? `${cacheIndex}${cwd}` : undefined;
const caches = cacheKey ? (cacheEggInfo[cacheKey] = cacheEggInfo[cacheKey] || {}) : undefined;
const end = (json) => {
if (caches) {
caches.eggInfo = json;
caches.cacheTime = Date.now();
}
if (option.callback) {
return option.callback(json);
}
return json;
};
// check cache
if (caches) {
if (caches.cacheTime && (Date.now() - caches.cacheTime) < 1000) {
return end(caches.eggInfo);
}
else if (caches.runningPromise) {
return caches.runningPromise;
}
}
// get egg info from customLoader
if (customLoader) {
return end({
config: customLoader.config,
plugins: customLoader.plugins,
eggPaths: customLoader.eggPaths,
});
}
// prepare options
const cmd = 'node';
const args = [node_path_1.default.resolve(__dirname, './scripts/eggInfo')];
const opt = {
cwd,
env: {
...process.env,
TS_NODE_TYPE_CHECK: 'false',
TS_NODE_TRANSPILE_ONLY: 'true',
TS_NODE_FILES: 'false',
EGG_TYPESCRIPT: 'true',
CACHE_REQUIRE_PATHS_FILE: node_path_1.default.resolve(config_1.tmpDir, './requirePaths.json'),
...option.env,
},
};
if (option.async) {
// cache promise
caches.runningPromise = new Promise((resolve, reject) => {
(0, node_child_process_1.execFile)(cmd, args, opt, err => {
caches.runningPromise = null;
if (err)
reject(err);
resolve(end(parseJson(node_fs_1.default.readFileSync(config_1.eggInfoPath, 'utf-8'))));
});
});
return caches.runningPromise;
}
try {
(0, node_child_process_1.execFileSync)(cmd, args, opt);
return end(parseJson(node_fs_1.default.readFileSync(config_1.eggInfoPath, 'utf-8')));
}
catch (e) {
return end({});
}
}
// convert string to same type with default value
function convertString(val, defaultVal) {
if (val === undefined)
return defaultVal;
switch (typeof defaultVal) {
case 'boolean':
return (0, yn_1.default)(val, { default: defaultVal });
case 'number':
const num = +val;
return (isNaN(num) ? defaultVal : num);
case 'string':
return val;
default:
return defaultVal;
}
}
function isIdentifierName(s) {
return /^[$A-Z_][0-9A-Z_$]*$/i.test(s);
}
// load ts/js files
function loadFiles(cwd, pattern) {
pattern = pattern || '**/*.(js|ts)';
pattern = Array.isArray(pattern) ? pattern : [pattern];
const fileList = globby_1.default.sync(pattern.concat(['!**/*.d.ts']), { cwd });
return fileList.filter(f => {
// filter same name js/ts
return !(f.endsWith('.js') &&
fileList.includes(f.substring(0, f.length - 2) + 'ts'));
});
}
// write jsconfig.json to cwd
function writeJsConfig(cwd) {
const jsconfigUrl = node_path_1.default.resolve(cwd, './jsconfig.json');
if (!node_fs_1.default.existsSync(jsconfigUrl)) {
node_fs_1.default.writeFileSync(jsconfigUrl, JSON.stringify(exports.JS_CONFIG, null, 2));
return jsconfigUrl;
}
}
// write tsconfig.json to cwd
function writeTsConfig(cwd) {
const tsconfigUrl = node_path_1.default.resolve(cwd, './tsconfig.json');
if (!node_fs_1.default.existsSync(tsconfigUrl)) {
node_fs_1.default.writeFileSync(tsconfigUrl, JSON.stringify(exports.TS_CONFIG, null, 2));
return tsconfigUrl;
}
}
function checkMaybeIsTsProj(cwd, pkgInfo) {
pkgInfo = pkgInfo || getPkgInfo(cwd);
return (pkgInfo.egg && pkgInfo.egg.typescript) ||
node_fs_1.default.existsSync(node_path_1.default.resolve(cwd, './tsconfig.json')) ||
node_fs_1.default.existsSync(node_path_1.default.resolve(cwd, './config/config.default.ts')) ||
node_fs_1.default.existsSync(node_path_1.default.resolve(cwd, './config/config.ts'));
}
function checkMaybeIsJsProj(cwd, pkgInfo) {
pkgInfo = pkgInfo || getPkgInfo(cwd);
const isJs = !checkMaybeIsTsProj(cwd, pkgInfo) &&
(node_fs_1.default.existsSync(node_path_1.default.resolve(cwd, './config/config.default.js')) ||
node_fs_1.default.existsSync(node_path_1.default.resolve(cwd, './jsconfig.json')));
return isJs;
}
// load modules to object
function loadModules(cwd, loadDefault, preHandle) {
const modules = {};
preHandle = preHandle || (fn => fn);
node_fs_1.default
.readdirSync(cwd)
.filter(f => f.endsWith('.js'))
.forEach(f => {
const name = f.substring(0, f.lastIndexOf('.'));
const obj = require(node_path_1.default.resolve(cwd, name));
if (loadDefault && obj.default) {
modules[name] = preHandle(obj.default);
}
else {
modules[name] = preHandle(obj);
}
});
return modules;
}
// convert string to function
function strToFn(fn) {
if (typeof fn === 'string') {
return (...args) => fn.replace(/{{\s*(\d+)\s*}}/g, (_, index) => args[index]);
}
return fn;
}
// pick fields from object
function pickFields(obj, fields) {
const newObj = {};
fields.forEach(f => (newObj[f] = obj[f]));
return newObj;
}
// log
function log(msg, prefix = true) {
console.info(`${prefix ? '[egg-ts-helper] ' : ''}${msg}`);
}
// get import context
function getImportStr(from, to, moduleName, importStar) {
const extname = node_path_1.default.extname(to);
const toPathWithoutExt = to.substring(0, to.length - extname.length);
const importPath = node_path_1.default.relative(from, toPathWithoutExt).replace(/\/|\\/g, '/');
const isTS = extname === '.ts' || node_fs_1.default.existsSync(`${toPathWithoutExt}.d.ts`);
const importStartStr = isTS && importStar ? '* as ' : '';
const fromStr = isTS ? `from '${importPath}.js'` : `= require('${importPath}')`;
return `import ${importStartStr}${moduleName} ${fromStr};`;
}
// write file, using fs.writeFileSync to block io that d.ts can create before egg app started.
function writeFileSync(fileUrl, content) {
node_fs_1.default.mkdirSync(node_path_1.default.dirname(fileUrl), { recursive: true });
node_fs_1.default.writeFileSync(fileUrl, content);
}
// clean same name js/ts
function cleanJs(cwd) {
const fileList = [];
globby_1.default
.sync(['**/*.ts', '**/*.tsx', '!**/*.d.ts', '!**/node_modules', '!**/.sff'], { cwd })
.forEach(f => {
const jf = removeSameNameJs(node_path_1.default.resolve(cwd, f));
if (jf)
fileList.push(node_path_1.default.relative(cwd, jf));
});
if (fileList.length) {
console.info('[egg-ts-helper] These file was deleted because the same name ts file was exist!\n');
console.info(' ' + fileList.join('\n ') + '\n');
}
}
// get moduleName by file path
function getModuleObjByPath(f) {
const props = f.substring(0, f.lastIndexOf('.')).split('/');
// composing moduleName
const moduleName = props.map(prop => camelProp(prop, 'upper')).join('');
return {
props,
moduleName,
};
}
// format path sep to /
function formatPath(str) {
return str.replace(/\/|\\/g, '/');
}
function toArray(pattern) {
return pattern ? (Array.isArray(pattern) ? pattern : [pattern]) : [];
}
// remove same name js
function removeSameNameJs(f) {
if (!f.match(/\.tsx?$/) || f.endsWith('.d.ts')) {
return;
}
const jf = f.replace(/tsx?$/, 'js');
if (node_fs_1.default.existsSync(jf)) {
node_fs_1.default.unlinkSync(jf);
return jf;
}
}
// resolve module
function resolveModule(url, cwd) {
try {
return require.resolve(url, cwd ? { paths: [cwd] } : undefined);
}
catch {
return undefined;
}
}
// check whether module is exist
function moduleExist(mod, cwd) {
const nodeModulePath = node_path_1.default.resolve(cwd || process.cwd(), 'node_modules', mod);
return node_fs_1.default.existsSync(nodeModulePath) || resolveModule(mod);
}
// require modules
function requireFile(url) {
url = url && resolveModule(url);
if (!url) {
return undefined;
}
let exp = require(url);
if (exp.__esModule && 'default' in exp) {
exp = exp.default;
}
return exp;
}
// extend
function extend(obj, ...args) {
args.forEach(source => {
let descriptor, prop;
if (source) {
for (prop in source) {
descriptor = Object.getOwnPropertyDescriptor(source, prop);
Object.defineProperty(obj, prop, descriptor);
}
}
});
return obj;
}
// parse json
function parseJson(jsonStr) {
if (jsonStr) {
try {
return JSON.parse(jsonStr);
}
catch (e) {
return {};
}
}
else {
return {};
}
}
// load package.json
function getPkgInfo(cwd) {
return readJson(node_path_1.default.resolve(cwd, 'package.json'));
}
// read json file
function readJson(jsonUrl) {
if (!node_fs_1.default.existsSync(jsonUrl))
return {};
return parseJson(node_fs_1.default.readFileSync(jsonUrl, 'utf-8'));
}
function readJson5(jsonUrl) {
if (!node_fs_1.default.existsSync(jsonUrl))
return {};
return json5_1.default.parse(node_fs_1.default.readFileSync(jsonUrl, 'utf-8'));
}
// format property
function formatProp(prop) {
return prop.replace(/[._-][a-z]/gi, s => s.substring(1).toUpperCase());
}
// like egg-core/file-loader
function camelProp(property, caseStyle) {
if (typeof caseStyle === 'function') {
return caseStyle(property);
}
// camel transfer
property = formatProp(property);
let first = property[0];
// istanbul ignore next
switch (caseStyle) {
case 'lower':
first = first.toLowerCase();
break;
case 'upper':
first = first.toUpperCase();
break;
case 'camel':
break;
default:
break;
}
return first + property.substring(1);
}
// load tsconfig.json
function loadTsConfig(tsconfigPath) {
tsconfigPath = node_path_1.default.extname(tsconfigPath) === '.json' ? tsconfigPath : `${tsconfigPath}.json`;
const tsConfig = readJson5(tsconfigPath);
if (tsConfig.extends) {
const extendPattern = tsConfig.extends;
const tsconfigDirName = node_path_1.default.dirname(tsconfigPath);
const maybeRealExtendPath = [
node_path_1.default.resolve(tsconfigDirName, extendPattern),
node_path_1.default.resolve(tsconfigDirName, `${extendPattern}.json`),
];
const isExtendFromNodeModules = !extendPattern.startsWith('.') && !extendPattern.startsWith('/');
if (isExtendFromNodeModules) {
const DEFAULT_TS_CONFIG_FILE_NAME = 'tsconfig.json';
const extendTsConfigPath = !node_path_1.default.extname(extendPattern) ? DEFAULT_TS_CONFIG_FILE_NAME : '';
maybeRealExtendPath.push(node_path_1.default.resolve(tsconfigDirName, 'node_modules', extendPattern, extendTsConfigPath), node_path_1.default.resolve(process.cwd(), 'node_modules', extendPattern, extendTsConfigPath));
}
const extendRealPath = maybeRealExtendPath.find(f => node_fs_1.default.existsSync(f));
if (extendRealPath) {
const extendTsConfig = loadTsConfig(extendRealPath);
return {
...tsConfig.compilerOptions,
...extendTsConfig,
};
}
}
return tsConfig.compilerOptions || {};
}
/**
* ts ast utils
*/
// find export node from sourcefile.
function findExportNode(code) {
const sourceFile = typescript_1.default.createSourceFile('file.ts', code, typescript_1.default.ScriptTarget.ES2017, true);
const cache = new Map();
const exportNodeList = [];
let exportDefaultNode;
sourceFile.statements.forEach(node => {
// each node in root scope
if (modifierHas(node, typescript_1.default.SyntaxKind.ExportKeyword)) {
if (modifierHas(node, typescript_1.default.SyntaxKind.DefaultKeyword)) {
// export default
exportDefaultNode = node;
}
else {
// export variable
if (typescript_1.default.isVariableStatement(node)) {
node.declarationList.declarations.forEach(declare => exportNodeList.push(declare));
}
else {
exportNodeList.push(node);
}
}
}
else if (typescript_1.default.isVariableStatement(node)) {
// cache variable statement
for (const declaration of node.declarationList.declarations) {
if (typescript_1.default.isIdentifier(declaration.name) && declaration.initializer) {
cache.set(declaration.name.escapedText, declaration.initializer);
}
}
}
else if ((typescript_1.default.isFunctionDeclaration(node) || typescript_1.default.isClassDeclaration(node)) && node.name) {
// cache function declaration and class declaration
cache.set(node.name.escapedText, node);
}
else if (typescript_1.default.isExportAssignment(node)) {
// export default {}
exportDefaultNode = node.expression;
}
else if (typescript_1.default.isExpressionStatement(node) && typescript_1.default.isBinaryExpression(node.expression)) {
if (typescript_1.default.isPropertyAccessExpression(node.expression.left)) {
const obj = node.expression.left.expression;
const prop = node.expression.left.name;
if (typescript_1.default.isIdentifier(obj)) {
if (obj.escapedText === 'exports') {
// exports.xxx = {}
exportNodeList.push(node.expression);
}
else if (obj.escapedText === 'module' &&
typescript_1.default.isIdentifier(prop) &&
prop.escapedText === 'exports') {
// module.exports = {}
exportDefaultNode = node.expression.right;
}
}
}
else if (typescript_1.default.isIdentifier(node.expression.left)) {
// let exportData;
// exportData = {};
// export exportData
cache.set(node.expression.left.escapedText, node.expression.right);
}
}
});
while (exportDefaultNode && typescript_1.default.isIdentifier(exportDefaultNode) && cache.size) {
const mid = cache.get(exportDefaultNode.escapedText);
cache.delete(exportDefaultNode.escapedText);
exportDefaultNode = mid;
}
return {
exportDefaultNode,
exportNodeList,
};
}
function isClass(v) {
return typeof v === 'function' && /^\s*class\s+/.test(v.toString());
}
// check kind in node.modifiers.
function modifierHas(node, kind) {
return node.modifiers && node.modifiers.find(mod => kind === mod.kind);
}
function cleanEmpty(data) {
const clearData = {};
Object.keys(data).forEach(k => {
const dataValue = data[k];
if (dataValue !== undefined && dataValue !== null) {
clearData[k] = data[k];
}
});
return clearData;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvdXRpbHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBb0VBLGdDQXNFQztBQUdELHNDQWFDO0FBRUQsNENBRUM7QUFHRCw4QkFXQztBQUdELHNDQU1DO0FBR0Qsc0NBTUM7QUFFRCxnREFNQztBQUVELGdEQVNDO0FBR0Qsa0NBZ0JDO0FBR0QsMEJBTUM7QUFHRCxnQ0FJQztBQUdELGtCQUVDO0FBR0Qsb0NBYUM7QUFHRCxzQ0FHQztBQUdELDBCQWFDO0FBR0QsZ0RBVUM7QUFHRCxnQ0FFQztBQUVELDBCQUVDO0FBR0QsNENBVUM7QUFHRCxzQ0FNQztBQUdELGtDQUdDO0FBR0Qsa0NBWUM7QUFHRCx3QkFhQztBQUdELDhCQVVDO0FBR0QsZ0NBRUM7QUFHRCw0QkFHQztBQUVELDhCQUdDO0FBR0QsZ0NBRUM7QUFHRCw4QkEwQkM7QUFHRCxvQ0E4QkM7QUFPRCx3Q0F1RUM7QUFFRCwwQkFFQztBQUdELGtDQUVDO0FBRUQsZ0NBU0M7QUFsakJELHNEQUF5QjtBQUN6QixvREFBMEI7QUFDMUIsMERBQTZCO0FBQzdCLDREQUE0QjtBQUM1Qiw0Q0FBb0I7QUFDcEIsMkRBQTZFO0FBQzdFLGtEQUEwQjtBQUMxQixxQ0FBK0M7QUFFbEMsUUFBQSxTQUFTLEdBQUc7SUFDdkIsT0FBTyxFQUFFLENBQUUsTUFBTSxDQUFFO0NBQ3BCLENBQUM7QUFFVyxRQUFBLFNBQVMsR0FBMEI7SUFDOUMsZUFBZSxFQUFFO1FBQ2YsTUFBTSxFQUFFLG9CQUFFLENBQUMsWUFBWSxDQUFDLE1BQU07UUFDOUIsTUFBTSxFQUFFLG9CQUFFLENBQUMsVUFBVSxDQUFDLFFBQVE7UUFDOUIsTUFBTSxFQUFFLElBQUk7UUFDWixhQUFhLEVBQUUsS0FBSztRQUNwQixzQkFBc0IsRUFBRSxJQUFJO1FBQzVCLHFCQUFxQixFQUFFLElBQUk7UUFDM0IsNEJBQTRCLEVBQUUsSUFBSTtRQUNsQyxPQUFPLEVBQUUs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