UNPKG

@mypaas/hcm-cli

Version:

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

73 lines (72 loc) 2.43 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.replaceScriptImportExt = exports.getDeps = exports.clearDepsCache = exports.fillExt = void 0; const path_1 = require("path"); const constant_1 = require("../common/constant"); const fs_extra_1 = require("fs-extra"); let depsMap = {}; let existsCache = {}; // 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] = fs_extra_1.existsSync(filePath); } return existsCache[filePath]; } function fillExt(filePath) { for (let i = 0; i < constant_1.SCRIPT_EXTS.length; i++) { const completePath = `${filePath}${constant_1.SCRIPT_EXTS[i]}`; if (exists(completePath)) { return completePath; } } for (let i = 0; i < constant_1.SCRIPT_EXTS.length; i++) { const completePath = `${filePath}/index${constant_1.SCRIPT_EXTS[i]}`; if (exists(completePath)) { return completePath; } } return ''; } exports.fillExt = fillExt; function getPathByImport(code, filePath) { const divider = code.includes('"') ? '"' : "'"; const relativePath = code.split(divider)[1]; if (relativePath.includes('.')) { return fillExt(path_1.join(filePath, '..', relativePath)); } return null; } function clearDepsCache() { depsMap = {}; existsCache = {}; } exports.clearDepsCache = clearDepsCache; function getDeps(filePath) { if (depsMap[filePath]) { return depsMap[filePath]; } const code = fs_extra_1.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; } exports.getDeps = getDeps; // "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; } exports.replaceScriptImportExt = replaceScriptImportExt;