whdx-ts
Version:
whdx-ts package
103 lines (97 loc) • 3.22 kB
JavaScript
const fs = require('fs');
const path = require('path');
let args = process.argv.slice(2);
let ReadFilePath = '',
SaveProjectPath = path.resolve(process.cwd(), './src', 'types'),
isOutput = false,
filePaths = [],
currentProject = '';
//读取文件夹下的文件
function readFiles() {
//判断是否是文件夹还是文件
let stats = fs.lstatSync(ReadFilePath);
if (stats.isFile()) {
filePaths.push(ReadFilePath);
currentProject = path.basename(ReadFilePath.replace(/\\(\w+\.js)$/gi, ""));
} else if (stats.isDirectory()) {
currentProject = path.basename(ReadFilePath);
fs.readdir(ReadFilePath, function (err, files) {
files.forEach(file => {
filePaths.push(ReadFilePath + '/' + file)
})
});
}
}
function filesRead() {
/**
* 读取文件中的内容
*/
filePaths.forEach(filePath => {
let fileContent = fs.readFileSync(filePath, 'utf8');
let apiContent = fileContent.match(/export (const|function) \w+(\s|)(\((.*?)\))?/gi) || [];
if (!apiContent.length) {
return;
}
let array = ``;
apiContent.forEach(item => {
let matchParams = item.match(/\((.*?)\)/) && item.match(/\((.*?)\)/)[1];
if (matchParams) {
let temMatchParams = matchParams.split(',');
let params = '';
temMatchParams.forEach((param, index) => {
params += index == 0 ? param + ':any' : "," + param + ':any';
});
item = item.replace(/\((.*?)\)/, `(${params})`)
}
let content = ` ${item}: any;\n`;
array += ` ${content}`;
});
let fileName = path.basename(filePath, '.js');
console.log(currentProject);
let tsApiContent = `declare module '${currentProject}/${fileName}' {\n${array}}`;
fs.writeFileSync(SaveProjectPath + '/' + currentProject + "_" + fileName + '.d.ts', tsApiContent);
});
}
/**
* 判断是否创建目录
*/
function checkCreateProject() {
fs.stat(SaveProjectPath, function (err, stats) {
stats ? filesRead() : createProject();
});
}
/**
* 创建目录
*/
function createProject() {
fs.mkdir(SaveProjectPath, function (error) {
if (error) {
return console.log("创建失败");
}
filesRead();
});
}
(function () {
args = args.filter(arg => {
let match;
match = arg.match(/^--?([a-z][0-9a-z-]*)(?:=(.*))?$/i);
if (match) {
arg = match[1];
}
switch (arg) {
case 'o':
SaveProjectPath = args[3] && path.resolve(process.cwd(), args[3]) || SaveProjectPath;
isOutput = true;
checkCreateProject();
break;
case 's':
ReadFilePath = path.resolve(process.cwd(), args[1]);
readFiles();
break;
}
});
if (!isOutput) {
checkCreateProject();
}
})();