UNPKG

2.31 kBJavaScriptView Raw
1const path = require("path");
2const fs = require("fs-extra");
3const chalk = require("chalk");
4const glob = require("glob");
5const RPQueue = require("rp-queue");
6
7const defaultOptions = require("./defaultOptions");
8const isFunction = require("lodash/isFunction");
9const defaultsDeep = require("lodash/defaultsDeep");
10const compile = require("./compile");
11const watcher = require("./watcher");
12const log = require("./logger");
13const { isFile } = require("./utils");
14
15const success = chalk.keyword("green");
16
17module.exports = async function (appSrc = "src", outDir = "lib", options = {}) {
18 let files = new Set();
19 let fileTotal = 0;
20 let pTotal = 0;
21 const configFile = options.configFile;
22 let configFileOptions = {};
23
24 if (configFile && fs.existsSync(path.resolve(process.cwd(), configFile))) {
25 configFileOptions = require(path.resolve(process.cwd(), configFile));
26 if (isFunction(configFileOptions)) {
27 configFileOptions = configFileOptions(options, options.state);
28 }
29
30 delete options.configFile;
31 }
32
33 options = defaultsDeep({}, configFileOptions, options);
34
35 options = defaultOptions(options);
36
37 options.appSrc = path.resolve(options.cwd, appSrc);
38 options.outDir = path.resolve(options.cwd, outDir);
39
40 if (isFile(options.appSrc)) {
41 compile(options.appSrc, options);
42 log(success("转换完成"));
43 log.flush();
44 return;
45 }
46
47 if (options.clean) {
48 fs.emptyDirSync(options.outDir);
49 }
50
51 const startTime = Date.now();
52
53 const fList = [];
54
55 options.glob.forEach(patten => {
56 const list = glob.sync(patten, {
57 cwd: options.appSrc,
58 allowEmpty: true,
59 });
60
61 fList.push(...list);
62 });
63
64 files = new Set(fList);
65
66 files = [...files];
67
68 if (options.filter) {
69 files = files.filter(options.filter);
70 }
71
72 fileTotal = files.length;
73
74 log(success(`任务数:${fileTotal}`));
75
76 RPQueue(files, {
77 limit: options.taskRunner || 5,
78 process: file => {
79 const p = compile(file, options).catch(console.log);
80
81 p.finally(() => {
82 const process = (++pTotal * 100) / fileTotal;
83 log.update(success(`转换进度:${~~process}%`));
84 });
85
86 return p;
87 },
88 }).finally(() => {
89 log.update(success(`转换完成,耗时:${~~((Date.now() - startTime) / 1000)} 秒`));
90
91 log.flush();
92
93 if (options.watch) {
94 log("%s文件夹监听中...", success(appSrc));
95 watcher(options);
96 }
97 });
98};