UNPKG

@mypaas/hcm-cli

Version:

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

241 lines (240 loc) 10.1 kB
"use strict"; 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;