UNPKG

@wgoo/cli

Version:

Wgoo Cli 是一个 React 组件库构建工具,通过 Wgoo Cli 可以快速搭建一套功能完备的 React 组件库。

89 lines (69 loc) 2 kB
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, }