egg-ts-helper
Version:
egg typescript helper
514 lines • 40.9 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) {
try {
return require.resolve(url);
}
catch (e) {
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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