@mypaas/hcm-cli
Version:
Vant Cli 是一个 Vue 组件库构建工具,通过 Vant Cli 可以快速搭建一套功能完备的 Vue 组件库。
241 lines (240 loc) • 10.1 kB
JavaScript
;
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.build = exports.buildToast = exports.buildAMDPackages = exports.buildPackages = exports.buildPackageEntry = exports.buildStyleEntry = exports.buildLib = exports.buildEs = exports.compileDir = exports.compileFile = void 0;
const chokidar_1 = __importDefault(require("chokidar"));
const path_1 = require("path");
const fs_extra_1 = require("fs-extra");
const clean_1 = require("./clean");
const css_1 = require("../common/css");
const logger_1 = require("../common/logger");
const manager_1 = require("../common/manager");
const compile_js_1 = require("../compiler/compile-js");
const compile_sfc_1 = require("../compiler/compile-sfc");
const compile_style_1 = require("../compiler/compile-style");
const compile_package_1 = require("../compiler/compile-package");
const compile_amd_package_1 = require("../compiler/compile-amd-package");
const gen_package_entry_1 = require("../compiler/gen-package-entry");
const gen_amd_package_entry_1 = require("../compiler/gen-amd-package-entry");
const gen_style_deps_map_1 = require("../compiler/gen-style-deps-map");
const gen_component_style_1 = require("../compiler/gen-component-style");
const constant_1 = require("../common/constant");
const gen_package_style_1 = require("../compiler/gen-package-style");
const gen_vetur_config_1 = require("../compiler/gen-vetur-config");
const common_1 = require("../common");
const replacer_1 = require("../compiler/replacer");
const combine_style_1 = require("../compiler/combine-style");
const compile_amd_toast_1 = require("../compiler/compile-amd-toast");
const fs_1 = require("fs");
async function compileFile(filePath) {
if (common_1.isSfc(filePath)) {
return compile_sfc_1.compileSfc(filePath);
}
if (common_1.isScript(filePath)) {
replacer_1.replaceScript(filePath);
return compile_js_1.compileJs(filePath);
}
if (common_1.isStyle(filePath)) {
// 替换关键字 van -> van
replacer_1.replaceStyle(filePath);
return compile_style_1.compileStyle(filePath);
}
if (common_1.isAsset(filePath)) {
return Promise.resolve();
}
return fs_extra_1.remove(filePath);
}
exports.compileFile = compileFile;
async function compileDir(dir) {
const files = fs_extra_1.readdirSync(dir);
await Promise.all(files.map((filename) => {
const filePath = path_1.join(dir, filename);
if (common_1.isDemoDir(filePath) || common_1.isTestDir(filePath)) {
return fs_extra_1.remove(filePath);
}
if (common_1.isDir(filePath)) {
return compileDir(filePath);
}
return compileFile(filePath);
}));
}
exports.compileDir = compileDir;
async function buildEs() {
const filter = common_1.getIgnoreComponentFilter((name, ignores) => {
return !ignores.includes(path_1.relative(constant_1.SRC_DIR, name));
});
common_1.setModuleEnv('esmodule');
await fs_extra_1.copy(constant_1.SRC_DIR, constant_1.ES_DIR, {
filter,
});
await combine_style_1.combineStyle(constant_1.ES_DIR);
await compileDir(constant_1.ES_DIR);
}
exports.buildEs = buildEs;
async function buildLib() {
const filter = common_1.getIgnoreComponentFilter((name, ignores) => {
return !ignores.includes(path_1.relative(constant_1.SRC_DIR, name));
});
common_1.setModuleEnv('commonjs');
await fs_extra_1.copy(constant_1.SRC_DIR, constant_1.LIB_DIR, {
filter,
});
await combine_style_1.combineStyle(constant_1.LIB_DIR);
await compileDir(constant_1.LIB_DIR);
}
exports.buildLib = buildLib;
async function buildStyleEntry() {
await gen_style_deps_map_1.genStyleDepsMap();
gen_component_style_1.genComponentStyle();
}
exports.buildStyleEntry = buildStyleEntry;
async function buildPackageEntry() {
const esEntryFile = path_1.join(constant_1.ES_DIR, 'index.js');
const libEntryFile = path_1.join(constant_1.LIB_DIR, 'index.js');
const styleEntryFile = path_1.join(constant_1.LIB_DIR, `index.${css_1.CSS_LANG}`);
gen_package_entry_1.genPackageEntry({
outputPath: esEntryFile,
pathResolver: (path) => `./${path_1.relative(constant_1.SRC_DIR, path)}`,
});
common_1.setModuleEnv('esmodule');
await compile_js_1.compileJs(esEntryFile);
gen_package_style_1.genPackageStyle({
outputPath: styleEntryFile,
pathResolver: (path) => path.replace(constant_1.SRC_DIR, '.'),
});
common_1.setModuleEnv('commonjs');
await fs_extra_1.copy(esEntryFile, libEntryFile);
await compile_js_1.compileJs(libEntryFile);
await compile_style_1.compileStyle(styleEntryFile);
}
exports.buildPackageEntry = buildPackageEntry;
async function buildPackages() {
common_1.setModuleEnv('esmodule');
await compile_package_1.compilePackage(false);
await compile_package_1.compilePackage(true);
gen_vetur_config_1.genVeturConfig();
}
exports.buildPackages = buildPackages;
async function buildAMDPackages() {
common_1.setModuleEnv('esmodule');
await fs_extra_1.emptyDir(constant_1.MODULE_DIR);
gen_amd_package_entry_1.genAMDPackageEntry({
outputPath: path_1.join(constant_1.MODULE_DIR, 'entry.js'),
pathResolver: (path) => `../es/${path_1.relative(constant_1.SRC_DIR, path)}`,
});
common_1.setPostCSSREM(false);
// await compileAMDPackage(false);
await compile_amd_package_1.compileAMDPackage(true);
common_1.setPostCSSREM(true);
// await compileAMDPackage(false);
await compile_amd_package_1.compileAMDPackage(true);
await fs_extra_1.remove(path_1.join(constant_1.MODULE_DIR, 'entry.js'));
}
exports.buildAMDPackages = buildAMDPackages;
/**
* 单独构建 toast,内置到 sdk 中
*/
async function buildToast() {
common_1.setModuleEnv('esmodule');
await compile_amd_toast_1.compileAMDToast(false);
await fs_extra_1.rename(path_1.join(constant_1.LIB_DIR, 'style/var.less'), path_1.join(constant_1.LIB_DIR, 'style/var-tmp.less'));
await fs_extra_1.copyFile(path_1.join(constant_1.LIB_DIR, 'style/var-pure.less'), path_1.join(constant_1.LIB_DIR, 'style/var.less'));
const data = fs_extra_1.readFileSync(path_1.join(constant_1.LIB_DIR, 'style/base.less'), 'utf-8');
fs_1.writeFileSync(path_1.join(constant_1.LIB_DIR, 'style/base.less'), "@import './var';");
fs_1.writeFileSync(path_1.join(constant_1.LIB_DIR, 'toast/style/toast.less'), fs_extra_1.readFileSync(path_1.join(constant_1.LIB_DIR, 'toast/style/less.js'), 'utf-8')
.replace(/require\((.*)\)/g, (substring, match) => `@import ${match}`));
await compileFile(path_1.join(constant_1.LIB_DIR, 'toast/style/toast.less'));
await fs_extra_1.copyFile(path_1.join(constant_1.LIB_DIR, 'toast/style/toast.css'), path_1.join(constant_1.SYSTEM_DIR, 'toast/index.css'));
await fs_extra_1.rename(path_1.join(constant_1.LIB_DIR, 'style/var-tmp.less'), path_1.join(constant_1.LIB_DIR, 'style/var.less'));
await fs_extra_1.remove(path_1.join(constant_1.LIB_DIR, 'toast/style/toast.less'));
await fs_extra_1.remove(path_1.join(constant_1.LIB_DIR, 'toast/style/toast.css'));
fs_1.writeFileSync(path_1.join(constant_1.LIB_DIR, 'style/base.less'), data);
}
exports.buildToast = buildToast;
const tasks = [
{
text: 'Build ESModule Outputs',
task: buildEs,
},
{
text: 'Build Commonjs Outputs',
task: buildLib,
},
{
text: 'Build Style Entry',
task: buildStyleEntry,
},
{
text: 'Build Package Entry',
task: buildPackageEntry,
},
];
async function runBuildTasks() {
for (let i = 0; i < tasks.length; i++) {
const { task, text } = tasks[i];
const spinner = logger_1.ora(text).start();
try {
/* eslint-disable no-await-in-loop */
await task();
spinner.succeed(text);
}
catch (err) {
spinner.fail(text);
console.log(err);
throw err;
}
}
logger_1.consola.success('Compile successfully');
}
function watchFileChange() {
logger_1.consola.info('\nWatching file changes...');
chokidar_1.default.watch(constant_1.SRC_DIR).on('change', async (path) => {
if (common_1.isDemoDir(path) || common_1.isTestDir(path)) {
return;
}
const spinner = logger_1.ora('File changed, start compilation...').start();
const esPath = path.replace(constant_1.SRC_DIR, constant_1.ES_DIR);
const libPath = path.replace(constant_1.SRC_DIR, constant_1.LIB_DIR);
const styleEntryFile = path_1.join(constant_1.LIB_DIR, `index.${css_1.CSS_LANG}`);
try {
await fs_extra_1.copy(path, esPath);
await fs_extra_1.copy(path, libPath);
common_1.setModuleEnv('esmodule');
await compileFile(esPath);
common_1.setModuleEnv('commonjs');
await compileFile(libPath);
await gen_style_deps_map_1.genStyleDepsMap();
gen_component_style_1.genComponentStyle({ cache: false });
gen_package_style_1.genPackageStyle({
outputPath: styleEntryFile,
pathResolver: (path) => path.replace(constant_1.SRC_DIR, '.'),
});
await compile_style_1.compileStyle(styleEntryFile);
spinner.succeed('Compiled: ' + logger_1.slimPath(path));
}
catch (err) {
spinner.fail('Compile failed: ' + path);
console.log(err);
}
});
}
async function build(cmd = {}) {
common_1.setNodeEnv('production');
try {
if (!cmd.dev) {
await clean_1.clean();
}
await manager_1.installDependencies(cmd.registry);
await runBuildTasks();
if (cmd.watch || cmd.dev) {
watchFileChange();
}
}
catch (err) {
logger_1.consola.error('Build failed');
process.exit(1);
}
}
exports.build = build;