@wagq/wa-cli 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +19 -0
- package/bin/wa.js +23 -0
- package/config/command.js +65 -0
- package/config/lib.js +18 -0
- package/lib/clone/index.js +23 -0
- package/lib/init/after.js +86 -0
- package/lib/init/check.js +21 -0
- package/lib/init/index.js +64 -0
- package/lib/locale/xlsx2Config.js +36 -0
- package/lib/server/index.js +24 -0
- package/lib/update/index.js +50 -0
- package/package.json +40 -0
- package/publish.sh +14 -0
- package/utils/log.js +32 -0
package/README.md
ADDED
package/bin/wa.js
ADDED
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
const { program } = require("commander");
|
|
3
|
+
|
|
4
|
+
const packageJson = require("../package.json");
|
|
5
|
+
const init = require("../lib/init/index.js");
|
|
6
|
+
const command = require("../config/command.js");
|
|
7
|
+
|
|
8
|
+
program.version(packageJson.version);
|
|
9
|
+
|
|
10
|
+
command.forEach((item) => {
|
|
11
|
+
const c = program
|
|
12
|
+
.command(item.name)
|
|
13
|
+
.alias(item.alias)
|
|
14
|
+
.description(item.description);
|
|
15
|
+
if (item.options) {
|
|
16
|
+
Object.keys(item.options).forEach((key) => {
|
|
17
|
+
c.option(item.options[key], key);
|
|
18
|
+
});
|
|
19
|
+
}
|
|
20
|
+
c.action(item.action);
|
|
21
|
+
});
|
|
22
|
+
|
|
23
|
+
program.parse(process.argv);
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
const init = require("../lib/init");
|
|
2
|
+
const server = require("../lib/server");
|
|
3
|
+
const xlsx2Config = require("../lib/locale/xlsx2Config");
|
|
4
|
+
|
|
5
|
+
const command = [
|
|
6
|
+
{
|
|
7
|
+
name: "init",
|
|
8
|
+
alias: "i",
|
|
9
|
+
description: "项目初始化工具",
|
|
10
|
+
action: (name) => {
|
|
11
|
+
init(name);
|
|
12
|
+
},
|
|
13
|
+
},
|
|
14
|
+
{
|
|
15
|
+
name: "server [path]",
|
|
16
|
+
alias: "s",
|
|
17
|
+
description: "启动本地服务",
|
|
18
|
+
action: server,
|
|
19
|
+
options: {
|
|
20
|
+
端口: "-P, --port <port>",
|
|
21
|
+
https: "-S, --https <boolean>",
|
|
22
|
+
},
|
|
23
|
+
positional: [
|
|
24
|
+
{
|
|
25
|
+
key: "path",
|
|
26
|
+
option: {
|
|
27
|
+
default: "dist",
|
|
28
|
+
describe: "文件路径",
|
|
29
|
+
type: "string",
|
|
30
|
+
},
|
|
31
|
+
},
|
|
32
|
+
],
|
|
33
|
+
},
|
|
34
|
+
{
|
|
35
|
+
name: "xlsx2Config [path] [name] [ext]",
|
|
36
|
+
alias: "l",
|
|
37
|
+
description: "xlsx文件转多语言配置",
|
|
38
|
+
positional: [
|
|
39
|
+
{
|
|
40
|
+
key: "path",
|
|
41
|
+
option: {
|
|
42
|
+
describe: "文件路径",
|
|
43
|
+
type: "string",
|
|
44
|
+
},
|
|
45
|
+
},
|
|
46
|
+
{
|
|
47
|
+
key: "name",
|
|
48
|
+
option: {
|
|
49
|
+
describe: "xlsx文件名称",
|
|
50
|
+
type: "string",
|
|
51
|
+
},
|
|
52
|
+
},
|
|
53
|
+
{
|
|
54
|
+
key: "ext",
|
|
55
|
+
option: {
|
|
56
|
+
describe: "转换文件格式(ts or json)",
|
|
57
|
+
type: "string",
|
|
58
|
+
},
|
|
59
|
+
},
|
|
60
|
+
],
|
|
61
|
+
action: xlsx2Config,
|
|
62
|
+
},
|
|
63
|
+
];
|
|
64
|
+
|
|
65
|
+
module.exports = command;
|
package/config/lib.js
ADDED
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
const modeOptions = ["pnpm", "yarn", "npm"];
|
|
2
|
+
|
|
3
|
+
const libBin = {
|
|
4
|
+
pnpm: "pnpm i",
|
|
5
|
+
yarn: "yarn",
|
|
6
|
+
npm: "npm i",
|
|
7
|
+
};
|
|
8
|
+
|
|
9
|
+
const libQuestions = () => [
|
|
10
|
+
{
|
|
11
|
+
type: "list",
|
|
12
|
+
name: "selectMode",
|
|
13
|
+
message: `请选择依赖安装方式`,
|
|
14
|
+
choices: modeOptions,
|
|
15
|
+
},
|
|
16
|
+
];
|
|
17
|
+
|
|
18
|
+
module.exports = { libQuestions, libBin };
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
const { promisify } = require("util");
|
|
2
|
+
const ora = require("ora");
|
|
3
|
+
const chalk = require("chalk");
|
|
4
|
+
const download = promisify(require("download-git-repo"));
|
|
5
|
+
|
|
6
|
+
const clone = async function (repo, dir, opotions = {}) {
|
|
7
|
+
const process = ora(`开始下载 ${chalk.blue(repo)}`);
|
|
8
|
+
process.start();
|
|
9
|
+
process.color = "yellow";
|
|
10
|
+
process.text = `正在下载..... ${chalk.yellow(repo)} `;
|
|
11
|
+
|
|
12
|
+
try {
|
|
13
|
+
await download(repo, dir, opotions);
|
|
14
|
+
process.color = "green";
|
|
15
|
+
process.succeed("下载成功");
|
|
16
|
+
} catch (error) {
|
|
17
|
+
process.color = "red";
|
|
18
|
+
console.log(error);
|
|
19
|
+
process.fail("下载失败");
|
|
20
|
+
}
|
|
21
|
+
};
|
|
22
|
+
|
|
23
|
+
module.exports = clone;
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
const fs = require("fs");
|
|
2
|
+
const path = require("path");
|
|
3
|
+
const log = require("../../utils/log");
|
|
4
|
+
const { execSync } = require("child_process");
|
|
5
|
+
const ora = require("ora");
|
|
6
|
+
const { libQuestions, libBin } = require("../../config/lib");
|
|
7
|
+
const Prompt = require("inquirer");
|
|
8
|
+
|
|
9
|
+
const cmdPath = process.cwd();
|
|
10
|
+
|
|
11
|
+
const changeProjectInfo = async (packageName) => {
|
|
12
|
+
const cwd = process.cwd();
|
|
13
|
+
const packagePath = path.join(`${cwd}/${packageName}`, "package.json");
|
|
14
|
+
const packageContent = fs.readFileSync(packagePath, "utf-8");
|
|
15
|
+
const packageInfo = JSON.parse(packageContent);
|
|
16
|
+
packageInfo.name = packageName;
|
|
17
|
+
const readmePath = path.join(`${cwd}/${packageName}`, "README.md");
|
|
18
|
+
const readmeContent = fs.readFileSync(readmePath, "utf-8");
|
|
19
|
+
const newReadmeContent = readmeContent.replace("<%= project %>", packageName);
|
|
20
|
+
|
|
21
|
+
await fs.writeFileSync(
|
|
22
|
+
packagePath,
|
|
23
|
+
JSON.stringify(packageInfo, null, " ") + "\n"
|
|
24
|
+
);
|
|
25
|
+
await fs.writeFileSync(readmePath, newReadmeContent);
|
|
26
|
+
};
|
|
27
|
+
|
|
28
|
+
const initGit = async (packageName) => {
|
|
29
|
+
const execConfig = { cwd: `${cmdPath}/${packageName}` };
|
|
30
|
+
await execSync("git init -b main", execConfig);
|
|
31
|
+
};
|
|
32
|
+
|
|
33
|
+
const initHusky = (packageName) => {
|
|
34
|
+
const execConfig = { cwd: `${cmdPath}/${packageName}` };
|
|
35
|
+
log.info("初始化Husky中...");
|
|
36
|
+
try {
|
|
37
|
+
execSync("npx --no-install husky install", {
|
|
38
|
+
cwd: `${cmdPath}/${packageName}`,
|
|
39
|
+
});
|
|
40
|
+
} catch (error) {
|
|
41
|
+
log.error("Husky 命令安装失败: \n" + error);
|
|
42
|
+
}
|
|
43
|
+
try {
|
|
44
|
+
execSync(
|
|
45
|
+
'npx --no-install husky add .husky/pre-commit "npx lint-staged"',
|
|
46
|
+
execConfig
|
|
47
|
+
);
|
|
48
|
+
execSync(
|
|
49
|
+
"npx --no-install husky add .husky/commit-msg 'npx --no -- commitlint --edit ${1}'",
|
|
50
|
+
execConfig
|
|
51
|
+
);
|
|
52
|
+
log.info("Husky 初始化完成");
|
|
53
|
+
execSync(`code ${packageName}`, { cwd: cmdPath });
|
|
54
|
+
} catch (error) {
|
|
55
|
+
log.error("Husky 命令写入失败: \n" + error);
|
|
56
|
+
}
|
|
57
|
+
};
|
|
58
|
+
|
|
59
|
+
const firstCommit = async (packageName) => {
|
|
60
|
+
const execConfig = { cwd: `${cmdPath}/${packageName}` };
|
|
61
|
+
await execSync("git add .", execConfig);
|
|
62
|
+
await execSync("git commit -m 'feat: 初始化项目' --no-verify", execConfig);
|
|
63
|
+
};
|
|
64
|
+
|
|
65
|
+
const installLibrary = async (packageName) => {
|
|
66
|
+
const { selectMode } = await Prompt.default.prompt(libQuestions());
|
|
67
|
+
const bin = libBin[selectMode];
|
|
68
|
+
const process = ora("安装依赖中...");
|
|
69
|
+
process.start();
|
|
70
|
+
process.color = "green";
|
|
71
|
+
await execSync(bin, {
|
|
72
|
+
cwd: `${cmdPath}/${packageName}`,
|
|
73
|
+
});
|
|
74
|
+
process.succeed("依赖安装完成");
|
|
75
|
+
};
|
|
76
|
+
|
|
77
|
+
const after = async (name) => {
|
|
78
|
+
const packageName = name;
|
|
79
|
+
changeProjectInfo(name);
|
|
80
|
+
await initGit(packageName);
|
|
81
|
+
await installLibrary(packageName);
|
|
82
|
+
await initHusky(packageName);
|
|
83
|
+
await firstCommit(packageName);
|
|
84
|
+
};
|
|
85
|
+
|
|
86
|
+
module.exports = after;
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
const glob = require("glob");
|
|
2
|
+
const path = require("path");
|
|
3
|
+
const update = require("../update");
|
|
4
|
+
|
|
5
|
+
const check = async (name) => {
|
|
6
|
+
let hasProject = false;
|
|
7
|
+
const files = await glob.sync("*", { dot: true });
|
|
8
|
+
|
|
9
|
+
hasProject = files.some((f) => {
|
|
10
|
+
return f === name;
|
|
11
|
+
});
|
|
12
|
+
|
|
13
|
+
await update();
|
|
14
|
+
|
|
15
|
+
if (!hasProject) {
|
|
16
|
+
return Promise.resolve();
|
|
17
|
+
}
|
|
18
|
+
return Promise.reject("项目已存在,创建失败");
|
|
19
|
+
};
|
|
20
|
+
|
|
21
|
+
module.exports = check;
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
const Prompt = require("inquirer");
|
|
2
|
+
|
|
3
|
+
const clone = require("../clone/index.js");
|
|
4
|
+
const check = require("./check.js");
|
|
5
|
+
const log = require("../../utils/log.js");
|
|
6
|
+
const after = require("./after.js");
|
|
7
|
+
const { execSync } = require("child_process");
|
|
8
|
+
|
|
9
|
+
const urls = {
|
|
10
|
+
vue单页面后台: { remote: "sdmu-gaoqi/vite-vue" },
|
|
11
|
+
vue多页面项目: { remote: "sdmu-gaoqi/vite-vue-multiple" },
|
|
12
|
+
vite: { bin: "npm create vite@latest" },
|
|
13
|
+
"vscode插件-vue版": { remote: "sdmu-gaoqi/vscode-plugin#vue" },
|
|
14
|
+
"vscode插件-react版": { remote: "sdmu-gaoqi/vscode-plugin#react" },
|
|
15
|
+
};
|
|
16
|
+
const modeOptions = Object.keys(urls);
|
|
17
|
+
|
|
18
|
+
const initQuestions = () => [
|
|
19
|
+
{
|
|
20
|
+
type: "list",
|
|
21
|
+
name: "selectMode",
|
|
22
|
+
message: `请选择模板`,
|
|
23
|
+
choices: modeOptions,
|
|
24
|
+
},
|
|
25
|
+
{
|
|
26
|
+
type: "input",
|
|
27
|
+
name: "name",
|
|
28
|
+
message: `请输入项目名`,
|
|
29
|
+
choices: modeOptions,
|
|
30
|
+
},
|
|
31
|
+
];
|
|
32
|
+
|
|
33
|
+
const init = async () => {
|
|
34
|
+
try {
|
|
35
|
+
const { name, selectMode } = await Prompt.default.prompt(initQuestions());
|
|
36
|
+
if (name) {
|
|
37
|
+
const { remote, bin } = urls?.[selectMode];
|
|
38
|
+
await check(name);
|
|
39
|
+
|
|
40
|
+
const initByVite = bin;
|
|
41
|
+
|
|
42
|
+
if (initByVite) {
|
|
43
|
+
log.info("准备从vite创建");
|
|
44
|
+
execSync(`${bin} ${name}`, {
|
|
45
|
+
stdio: "inherit",
|
|
46
|
+
cwd: process.cwd(),
|
|
47
|
+
shell: true,
|
|
48
|
+
});
|
|
49
|
+
} else {
|
|
50
|
+
if (!remote) {
|
|
51
|
+
throw new Error(`未找到${selectMode}模板`);
|
|
52
|
+
}
|
|
53
|
+
await clone(remote, name);
|
|
54
|
+
await after(name, selectMode);
|
|
55
|
+
}
|
|
56
|
+
} else {
|
|
57
|
+
log.info("程序提前结束");
|
|
58
|
+
}
|
|
59
|
+
} catch (error) {
|
|
60
|
+
log.error(error);
|
|
61
|
+
}
|
|
62
|
+
};
|
|
63
|
+
|
|
64
|
+
module.exports = init;
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
const xlsx = require("xlsx");
|
|
2
|
+
const fs = require("fs");
|
|
3
|
+
|
|
4
|
+
const xlsx2Config = async (path, name, ext) => {
|
|
5
|
+
try {
|
|
6
|
+
const file = xlsx.readFile(`${path}/${name}`);
|
|
7
|
+
const sheetNames = file.SheetNames; // 返回 ['sheet1', 'sheet2']
|
|
8
|
+
const l10n = {};
|
|
9
|
+
for (const sheetName of sheetNames) {
|
|
10
|
+
const jsonData = xlsx.utils.sheet_to_json(file.Sheets[sheetName]);
|
|
11
|
+
const fields = Object.keys(jsonData[0]);
|
|
12
|
+
jsonData.forEach((word) => {
|
|
13
|
+
// 0 是 key
|
|
14
|
+
for (let index = 1; index < fields.length; index++) {
|
|
15
|
+
const field = fields[index];
|
|
16
|
+
if (!l10n[field]) {
|
|
17
|
+
l10n[field] = {};
|
|
18
|
+
}
|
|
19
|
+
l10n[field][word.key] =
|
|
20
|
+
String(word[field || "zh-CN"] || word.key) || "";
|
|
21
|
+
}
|
|
22
|
+
});
|
|
23
|
+
|
|
24
|
+
Object.keys(l10n).forEach((key) => {
|
|
25
|
+
const content = JSON.stringify(l10n[key], null, 2);
|
|
26
|
+
const str = `export default ${content}\n`;
|
|
27
|
+
const writePath = `${path}/${key}.${ext}`;
|
|
28
|
+
fs.writeFileSync(writePath, ext === "json" ? content : str, "utf8");
|
|
29
|
+
});
|
|
30
|
+
}
|
|
31
|
+
} catch (err) {
|
|
32
|
+
console.log(err, "文件转换失败");
|
|
33
|
+
}
|
|
34
|
+
};
|
|
35
|
+
|
|
36
|
+
module.exports = xlsx2Config;
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
const { spawn, exec, execSync } = require("child_process");
|
|
2
|
+
const fs = require("fs");
|
|
3
|
+
// minimist(process.argv.slice(2))
|
|
4
|
+
|
|
5
|
+
const server = (filePath, argv) => {
|
|
6
|
+
const https = argv.https ?? false;
|
|
7
|
+
const port = argv.port ?? 3000;
|
|
8
|
+
|
|
9
|
+
try {
|
|
10
|
+
const child = spawn(
|
|
11
|
+
"http-server",
|
|
12
|
+
[filePath, "-p", port, https ? `-S -C cert.pem -K key.pem` : ""],
|
|
13
|
+
{
|
|
14
|
+
cwd: process.cwd(),
|
|
15
|
+
stdio: "inherit",
|
|
16
|
+
}
|
|
17
|
+
);
|
|
18
|
+
child.on("close", (code) => process.exit(code));
|
|
19
|
+
} catch (error) {
|
|
20
|
+
console.log(error);
|
|
21
|
+
}
|
|
22
|
+
};
|
|
23
|
+
|
|
24
|
+
module.exports = server;
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
const { exec } = require("child_process");
|
|
2
|
+
const config = require("../../package.json");
|
|
3
|
+
const { compareVersions } = require("compare-versions");
|
|
4
|
+
const log = require("../../utils/log");
|
|
5
|
+
const ora = require("ora");
|
|
6
|
+
|
|
7
|
+
module.exports = (argv) => {
|
|
8
|
+
const cmd = `npm view ${config.name} version --json --registry=http://registry.npmjs.org`;
|
|
9
|
+
const shellUpdate = argv && argv._ && argv._[0] === "update";
|
|
10
|
+
return new Promise((resolve, reject) => {
|
|
11
|
+
exec(cmd, (error, info) => {
|
|
12
|
+
if (error) {
|
|
13
|
+
reject();
|
|
14
|
+
log.error(`${config.name} 信息获取失败, 请尝试在命令前加入sudo`);
|
|
15
|
+
}
|
|
16
|
+
info = info.trim();
|
|
17
|
+
const version = info.substring(1, info.length - 1);
|
|
18
|
+
// 1: 当前版本大于等于最新版本 0: 当前版本等于最新版本 -1: 当前版本小于最新版本
|
|
19
|
+
const compareResult = compareVersions(config.version, version);
|
|
20
|
+
if (compareResult == 1 || compareResult == 0) {
|
|
21
|
+
if (shellUpdate) {
|
|
22
|
+
// shell 执行的,给个信息提示,引入执行不需要
|
|
23
|
+
log.info(`${config.name}@${config.version} 已最新`);
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
resolve({
|
|
27
|
+
needUpdate: false,
|
|
28
|
+
});
|
|
29
|
+
} else {
|
|
30
|
+
log.warn(`${config.name} 需要更新`);
|
|
31
|
+
const spinner = ora(`${config.name} 更新中......`).start();
|
|
32
|
+
const run = `npm install -g ${config.name}@latest --registry=http://registry.npmjs.org`;
|
|
33
|
+
exec(run, (err) => {
|
|
34
|
+
if (err) {
|
|
35
|
+
reject();
|
|
36
|
+
log.error(err);
|
|
37
|
+
}
|
|
38
|
+
if (!shellUpdate) {
|
|
39
|
+
log.info(`${config.name}版本更新,当前版本: ${version}`);
|
|
40
|
+
} else {
|
|
41
|
+
spinner.succeed(`${config.name} 更新结束,当前版本: ${version}`);
|
|
42
|
+
}
|
|
43
|
+
resolve({
|
|
44
|
+
needUpdate: true,
|
|
45
|
+
});
|
|
46
|
+
});
|
|
47
|
+
}
|
|
48
|
+
});
|
|
49
|
+
});
|
|
50
|
+
};
|
package/package.json
ADDED
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@wagq/wa-cli",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "wa的脚手架",
|
|
5
|
+
"main": "index.js",
|
|
6
|
+
"scripts": {
|
|
7
|
+
"test": "echo \"Error: no test specified\" && exit 1",
|
|
8
|
+
"pub": "npm publish --access public"
|
|
9
|
+
},
|
|
10
|
+
"keywords": [
|
|
11
|
+
"wa的脚手架"
|
|
12
|
+
],
|
|
13
|
+
"bin": {
|
|
14
|
+
"wa": "bin/wa.js"
|
|
15
|
+
},
|
|
16
|
+
"author": "GQ-og",
|
|
17
|
+
"license": "ISC",
|
|
18
|
+
"publishConfig": {
|
|
19
|
+
"access": "public",
|
|
20
|
+
"registry": "https://registry.npmjs.org/"
|
|
21
|
+
},
|
|
22
|
+
"dependencies": {
|
|
23
|
+
"chalk": "^3.0.0",
|
|
24
|
+
"child_process": "^1.0.2",
|
|
25
|
+
"commander": "^13.1.0",
|
|
26
|
+
"compare-versions": "^6.1.1",
|
|
27
|
+
"download-git-repo": "^3.0.2",
|
|
28
|
+
"glob": "^11.0.1",
|
|
29
|
+
"inquirer": "^12.4.1",
|
|
30
|
+
"ora": "^4.0.3"
|
|
31
|
+
},
|
|
32
|
+
"devDependencies": {
|
|
33
|
+
"http-server": "^14.1.1",
|
|
34
|
+
"minimist": "^1.2.8",
|
|
35
|
+
"xlsx": "^0.18.5"
|
|
36
|
+
},
|
|
37
|
+
"directories": {
|
|
38
|
+
"lib": "lib"
|
|
39
|
+
}
|
|
40
|
+
}
|
package/publish.sh
ADDED
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
set -e
|
|
3
|
+
# 修改npm源地址
|
|
4
|
+
npm config get registry
|
|
5
|
+
npm config set registry=http://registry.npmjs.org
|
|
6
|
+
# 登陆输入自己的npm账号和密码,还有邮箱
|
|
7
|
+
echo '登录'
|
|
8
|
+
npm login
|
|
9
|
+
echo "发布中..."
|
|
10
|
+
npm publish
|
|
11
|
+
# 改回npm源地址
|
|
12
|
+
npm config set registry=https://registry.npm.taobao.org
|
|
13
|
+
echo -e "\n发布成功\n"
|
|
14
|
+
exit
|
package/utils/log.js
ADDED
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
const chalk = require("chalk");
|
|
2
|
+
|
|
3
|
+
const log = {
|
|
4
|
+
info(msg) {
|
|
5
|
+
msg = `\n[Info]: ${msg}\n`;
|
|
6
|
+
process.stdout.write(chalk.green(msg));
|
|
7
|
+
},
|
|
8
|
+
warn(msg) {
|
|
9
|
+
msg = `\n[Warn]: ${msg}\n`;
|
|
10
|
+
process.stdout.write(chalk.yellow(msg));
|
|
11
|
+
},
|
|
12
|
+
loading(msg) {
|
|
13
|
+
msg = `\n[Loading]: ${msg}\n`;
|
|
14
|
+
process.stdout.write(chalk.white(msg));
|
|
15
|
+
},
|
|
16
|
+
error(err) {
|
|
17
|
+
if (!(err instanceof Error)) {
|
|
18
|
+
err.message && (err = err.message);
|
|
19
|
+
err = new Error(err.message || err.toString());
|
|
20
|
+
}
|
|
21
|
+
if (exports.alert) {
|
|
22
|
+
err.message += "\u0007";
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
const msg = `\n[Error]: ${err.message}\n`;
|
|
26
|
+
process.stdout.write(chalk.red(msg));
|
|
27
|
+
|
|
28
|
+
process.exit(1);
|
|
29
|
+
},
|
|
30
|
+
};
|
|
31
|
+
|
|
32
|
+
module.exports = log;
|