abao-cli 1.0.0
Sign up to get free protection for your applications and to get access to all the features.
- package/bin/cli.js +47 -0
- package/commands/add.js +47 -0
- package/commands/del.js +30 -0
- package/commands/init.js +44 -0
- package/commands/list.js +9 -0
- package/package.json +19 -0
- package/utils/file.js +29 -0
- package/utils/table.js +23 -0
- package/utils/temp.json +0 -0
package/bin/cli.js
ADDED
@@ -0,0 +1,47 @@
|
|
1
|
+
#!/usr/bin/env node
|
2
|
+
|
3
|
+
const { program } = require("commander")
|
4
|
+
|
5
|
+
const packageConfig = require("../package.json")
|
6
|
+
|
7
|
+
const { showList } = require("../commands/list")
|
8
|
+
|
9
|
+
const { add } = require("../commands/add")
|
10
|
+
|
11
|
+
const { del } = require("../commands/del")
|
12
|
+
|
13
|
+
const { init } = require("../commands/init")
|
14
|
+
|
15
|
+
program.version(packageConfig.version).option("-v, --version")
|
16
|
+
|
17
|
+
program.name("my-command").usage("可执行命令")
|
18
|
+
|
19
|
+
program
|
20
|
+
.command("ls")
|
21
|
+
.description("查看模板列表")
|
22
|
+
.action(() => {
|
23
|
+
showList()
|
24
|
+
})
|
25
|
+
|
26
|
+
program
|
27
|
+
.command("add")
|
28
|
+
.description("添加模板")
|
29
|
+
.action(() => {
|
30
|
+
add()
|
31
|
+
})
|
32
|
+
|
33
|
+
program
|
34
|
+
.command("del")
|
35
|
+
.description("删除模板")
|
36
|
+
.action(() => {
|
37
|
+
del()
|
38
|
+
})
|
39
|
+
|
40
|
+
program
|
41
|
+
.command("init")
|
42
|
+
.description("初始化模板")
|
43
|
+
.action(() => {
|
44
|
+
init()
|
45
|
+
})
|
46
|
+
|
47
|
+
program.parse()
|
package/commands/add.js
ADDED
@@ -0,0 +1,47 @@
|
|
1
|
+
#!/usr/bin/env node
|
2
|
+
|
3
|
+
|
4
|
+
const inquirer = require("inquirer")
|
5
|
+
const { readFile, writeFile } = require("../utils/file")
|
6
|
+
const { showTable } = require("../utils/table")
|
7
|
+
exports.add = async () => {
|
8
|
+
|
9
|
+
const tempJson = await readFile()
|
10
|
+
|
11
|
+
const question = [
|
12
|
+
{
|
13
|
+
name: "name",
|
14
|
+
type: "input",
|
15
|
+
message: "请输入模板名称",
|
16
|
+
validate(val) {
|
17
|
+
if (val === '') return '模板名称必填'
|
18
|
+
else if (tempJson.some(item => item.name === val)) return '模板名称已存在'
|
19
|
+
else return true
|
20
|
+
}
|
21
|
+
},
|
22
|
+
{
|
23
|
+
name: "git_url",
|
24
|
+
type: "input",
|
25
|
+
message: "请输入git源地址",
|
26
|
+
validate(val) {
|
27
|
+
if (val === '') return '地址名称必填'
|
28
|
+
else return true
|
29
|
+
}
|
30
|
+
},
|
31
|
+
{
|
32
|
+
name: "branch",
|
33
|
+
type: "input",
|
34
|
+
message: "请输入分支(默认为master)",
|
35
|
+
filter: (val => {
|
36
|
+
if (val === "") return "master"
|
37
|
+
else return val
|
38
|
+
})
|
39
|
+
}
|
40
|
+
]
|
41
|
+
|
42
|
+
inquirer.prompt(question).then(async answer => {
|
43
|
+
const result = tempJson.concat(answer)
|
44
|
+
const isComplete = await writeFile(result);
|
45
|
+
if (isComplete) showTable(result)
|
46
|
+
})
|
47
|
+
}
|
package/commands/del.js
ADDED
@@ -0,0 +1,30 @@
|
|
1
|
+
#!/usr/bin/env node
|
2
|
+
|
3
|
+
const inquirer = require("inquirer")
|
4
|
+
const { readFile, writeFile } = require("../utils/file")
|
5
|
+
const { showTable } = require("../utils/table")
|
6
|
+
|
7
|
+
exports.del = async () => {
|
8
|
+
const tempJson = await readFile()
|
9
|
+
const nameArray = (tempJson || []).map(item => item.name)
|
10
|
+
|
11
|
+
if (nameArray.length === 0) return console.log("不存在可以删除的模板")
|
12
|
+
|
13
|
+
const question = [
|
14
|
+
{
|
15
|
+
name: "name",
|
16
|
+
type: "list",
|
17
|
+
choices: nameArray,
|
18
|
+
message: "请选择你要删除的模板"
|
19
|
+
}
|
20
|
+
]
|
21
|
+
|
22
|
+
inquirer.prompt(question).then(async answer => {
|
23
|
+
const { name } = answer
|
24
|
+
const result = (tempJson || []).filter(item => item.name !== name)
|
25
|
+
const isComplete = await writeFile(result)
|
26
|
+
if (isComplete) {
|
27
|
+
showTable(result)
|
28
|
+
}
|
29
|
+
})
|
30
|
+
}
|
package/commands/init.js
ADDED
@@ -0,0 +1,44 @@
|
|
1
|
+
#!/usr/bin/env node
|
2
|
+
|
3
|
+
const path = require("path")
|
4
|
+
const ora = require("ora")
|
5
|
+
const inquirer = require("inquirer")
|
6
|
+
const download = require("download-git-repo")
|
7
|
+
const { readFile } = require("../utils/file")
|
8
|
+
// 定义一个loading
|
9
|
+
const spinner = ora("Generate ing...");
|
10
|
+
|
11
|
+
exports.init = async () => {
|
12
|
+
const tempJson = await readFile()
|
13
|
+
const nameArray = (tempJson || []).map(item => item.name)
|
14
|
+
|
15
|
+
const question = [
|
16
|
+
{
|
17
|
+
name: "name",
|
18
|
+
type: "list",
|
19
|
+
choices: nameArray,
|
20
|
+
message: "请选择你要生成的模板"
|
21
|
+
}
|
22
|
+
]
|
23
|
+
|
24
|
+
inquirer.prompt(question).then(async answer => {
|
25
|
+
const { name } = answer
|
26
|
+
const { git_url, branch } = tempJson.find(item => item.name === name)
|
27
|
+
|
28
|
+
console.log('\n');
|
29
|
+
// console.log(`direct:${git_url}#${branch}`);
|
30
|
+
spinner.start();
|
31
|
+
download(`direct:${git_url}#${branch}`, path.join(__dirname, '../test'), { clone: true }, err => {
|
32
|
+
if (err) {
|
33
|
+
console.log(err.message);
|
34
|
+
console.log('\n');
|
35
|
+
// loading 失败
|
36
|
+
spinner.fail("Generate failed");
|
37
|
+
} else {
|
38
|
+
console.log('\n');
|
39
|
+
// loading 成功
|
40
|
+
spinner.succeed("Generate success");
|
41
|
+
}
|
42
|
+
})
|
43
|
+
})
|
44
|
+
}
|
package/commands/list.js
ADDED
package/package.json
ADDED
@@ -0,0 +1,19 @@
|
|
1
|
+
{
|
2
|
+
"name": "abao-cli",
|
3
|
+
"version": "1.0.0",
|
4
|
+
"description": "",
|
5
|
+
"main": "index.js",
|
6
|
+
"bin": "./index.js",
|
7
|
+
"scripts": {
|
8
|
+
"publish": "npm publish"
|
9
|
+
},
|
10
|
+
"keywords": [],
|
11
|
+
"author": "",
|
12
|
+
"license": "ISC",
|
13
|
+
"dependencies": {
|
14
|
+
"cli-table": "0.3.11",
|
15
|
+
"commander": "10.0.0",
|
16
|
+
"download-git-repo": "3.0.2",
|
17
|
+
"inquirer": "8.2.5"
|
18
|
+
}
|
19
|
+
}
|
package/utils/file.js
ADDED
@@ -0,0 +1,29 @@
|
|
1
|
+
const path = require("path")
|
2
|
+
const fs = require("fs")
|
3
|
+
|
4
|
+
exports.readFile = () => {
|
5
|
+
return new Promise((resolve, reject) => {
|
6
|
+
fs.readFile(path.join(__dirname, "./temp.json"), "utf-8", (err, data) => {
|
7
|
+
if (err) {
|
8
|
+
console.log(err.message)
|
9
|
+
reject()
|
10
|
+
}
|
11
|
+
|
12
|
+
const result = JSON.parse(data || null) || []
|
13
|
+
resolve(result)
|
14
|
+
})
|
15
|
+
})
|
16
|
+
}
|
17
|
+
|
18
|
+
exports.writeFile = (jsonData) => {
|
19
|
+
return new Promise((resolve, reject) => {
|
20
|
+
|
21
|
+
fs.writeFile(path.join(__dirname, "./temp.json"), JSON.stringify(jsonData), "utf-8", err => {
|
22
|
+
if (err) {
|
23
|
+
console.log(err.message);
|
24
|
+
reject()
|
25
|
+
}
|
26
|
+
resolve(true)
|
27
|
+
})
|
28
|
+
})
|
29
|
+
}
|
package/utils/table.js
ADDED
@@ -0,0 +1,23 @@
|
|
1
|
+
#!/usr/bin/env node
|
2
|
+
|
3
|
+
const Table = require("cli-table")
|
4
|
+
|
5
|
+
const tableConfig = {
|
6
|
+
head: ['name', 'git_url', 'branch'],
|
7
|
+
style: {
|
8
|
+
head: ['green']
|
9
|
+
}
|
10
|
+
}
|
11
|
+
|
12
|
+
exports.showTable = (jsonData) => {
|
13
|
+
if (jsonData instanceof Array) {
|
14
|
+
const table = new Table(tableConfig)
|
15
|
+
for (const item of jsonData) {
|
16
|
+
const { name, git_url, branch } = item
|
17
|
+
table.push([name, git_url, branch])
|
18
|
+
}
|
19
|
+
console.log("\n");
|
20
|
+
console.log(table.toString())
|
21
|
+
console.log("\n");
|
22
|
+
}
|
23
|
+
}
|
package/utils/temp.json
ADDED
File without changes
|