Treecat
2 years ago
2 changed files with 228 additions and 53 deletions
@ -0,0 +1,128 @@
|
||||
const fs = require("fs"); |
||||
const path = require("path"); |
||||
|
||||
const depts = {}; |
||||
|
||||
async function handle(filename) { |
||||
// 找clzName
|
||||
const code = fs.readFileSync(filename); |
||||
const inheritRegResult = /BI\.(.*?)\s=\sBI\.inherit\(/.exec(code); |
||||
let clzName; |
||||
if (inheritRegResult) { |
||||
clzName = inheritRegResult[1]; |
||||
} else { |
||||
const clzRegResult = /export\sclass\s(.*?)\sextend/.exec(code); |
||||
if (clzRegResult) { |
||||
clzName = clzRegResult[1]; |
||||
} |
||||
} |
||||
depts[clzName] = filename; |
||||
} |
||||
|
||||
function isExist(filePath) { |
||||
return fs.existsSync(filePath); |
||||
} |
||||
|
||||
async function bfs(filename) { |
||||
const stat = fs.statSync(filename); |
||||
const isDir = stat.isDirectory(); |
||||
if (isDir) { |
||||
const files = fs.readdirSync(filename); |
||||
for (let i = 0; i < files.length; i++) { |
||||
const file = files[i]; |
||||
await bfs(path.resolve(filename, file)); |
||||
} |
||||
} else { |
||||
await handle(filename); |
||||
} |
||||
} |
||||
|
||||
async function initDepts() { |
||||
// dfs 构建依赖关系
|
||||
await bfs(path.resolve("src")); |
||||
} |
||||
|
||||
|
||||
function search(src, clzName) { |
||||
if (!depts[clzName]) { |
||||
return ""; |
||||
} |
||||
|
||||
const dstName = path.basename(depts[clzName]).replace(/.js$/g, ""); |
||||
const dstPath = path.normalize(depts[clzName]).split("src")[1].split("\\").join("/").split("/"); |
||||
const srcPath = path.normalize(src).split("src")[1].split("\\").join("/").split("/"); |
||||
|
||||
// console.log("src", src);
|
||||
// console.log("dst", depts[clzName]);
|
||||
|
||||
dstPath.shift(); |
||||
dstPath.pop(); |
||||
srcPath.shift(); |
||||
srcPath.pop(); |
||||
|
||||
const findDstIndexPath = (dstArr, startIndex) => { |
||||
let i = startIndex; |
||||
|
||||
while (!isExist(path.resolve("src", dstArr.slice(0, i + 1).join("/"), "index.js"))) { |
||||
i++; |
||||
} |
||||
if (i < dstArr.length) { |
||||
return dstArr.slice(startIndex, i + 1).join("/"); |
||||
} else { |
||||
return `${dstArr.slice(startIndex).join("/")}/${dstName}`; |
||||
} |
||||
}; |
||||
|
||||
// 不同包
|
||||
if (dstPath[0] !== srcPath[0]) { |
||||
return `@/${dstPath[0]}`; |
||||
} |
||||
|
||||
// 同包
|
||||
let i = 0; |
||||
while (dstPath[i] === srcPath[i] && i < dstPath.length && i < srcPath.length) { |
||||
i++; |
||||
} |
||||
|
||||
if (i < srcPath.length) { |
||||
let result = ""; |
||||
const rawI = i; |
||||
|
||||
// 回溯
|
||||
for (let j = 0; j < srcPath.length - rawI; j++) { |
||||
result += "../"; |
||||
i--; |
||||
} |
||||
i++; |
||||
// dstPath 也没有了
|
||||
if (i < dstPath.length) { |
||||
return result + findDstIndexPath(dstPath, i); |
||||
// 还有好多没有匹配完
|
||||
// while (i < srcPath) {
|
||||
// // exists(srcPath.slice(0, i).join())
|
||||
// result += srcPath[i];
|
||||
// i++;
|
||||
// }
|
||||
} else if (i === dstPath.length) { |
||||
return `${result}${dstName}`; |
||||
} |
||||
} else if (i === srcPath.length) { |
||||
if (i === dstPath.length) { |
||||
return dstName; |
||||
} else if (i < dstPath.length) { |
||||
return findDstIndexPath(dstPath, i); |
||||
} |
||||
} |
||||
} |
||||
|
||||
// search(process.argv[2], "Text").then(res => {
|
||||
// console.log(res);
|
||||
// });
|
||||
|
||||
exports.initDepts = initDepts; |
||||
exports.search = search; |
||||
|
||||
|
||||
|
||||
|
||||
|
Loading…
Reference in new issue