@wgoo/cli
Version:
Wgoo Cli 是一个 React 组件库构建工具,通过 Wgoo Cli 可以快速搭建一套功能完备的 React 组件库。
89 lines (69 loc) • 2 kB
JavaScript
const { join } = require('path');
const { SCRIPT_EXTS } = require('../common/constant');
const { readFileSync, existsSync } = require('fs-extra');
// https://regexr.com/47jlq
const IMPORT_RE = /import\s+?(?:(?:(?:[\w*\s{},]*)\s+from(\s+)?)|)(?:(?:".*?")|(?:'.*?'))[\s]*?(?:;|$|)/g;
function matchImports(code) {
return code.match(IMPORT_RE) || [];
}
function exists(filePath) {
if (!(filePath in existsCache)) {
existsCache[filePath] = existsSync(filePath);
}
return existsCache[filePath];
}
function fillExt(filePath) {
for (let i = 0; i < SCRIPT_EXTS.length; i++) {
const completePath = `${filePath}${SCRIPT_EXTS[i]}`;
if (exists(completePath)) {
return completePath;
}
}
for (let i = 0; i < SCRIPT_EXTS.length; i++) {
const completePath = `${filePath}/index${SCRIPT_EXTS[i]}`;
if (exists(completePath)) {
return completePath;
}
}
return '';
}
function getPathByImport(code, filePath) {
const divider = code.includes('"') ? '"' : "'";
const relativePath = code.split(divider)[1];
if (relativePath.includes('.')) {
return fillExt(join(filePath, '..', relativePath));
}
return null;
}
function clearDepsCache() {
depsMap = {};
existsCache = {};
}
function getDeps(filePath) {
if (depsMap[filePath]) {
return depsMap[filePath];
}
const code = readFileSync(filePath, 'utf-8');
const imports = matchImports(code);
const paths = imports
.map((item) => getPathByImport(item, filePath))
.filter((item) => !!item);
depsMap[filePath] = paths;
paths.forEach(getDeps);
return paths;
}
// "import App from 'App.vue';" => "import App from 'App.xxx';"
function replaceScriptImportExt(code, from, to) {
const importLines = matchImports(code);
importLines.forEach((importLine) => {
const result = importLine.replace(from, to);
code = code.replace(importLine, result);
});
return code;
}
module.exports = {
fillExt,
clearDepsCache,
getDeps,
replaceScriptImportExt,
}