cloudcc-cli 1.0.1 → 1.0.4

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.
@@ -0,0 +1,7 @@
1
+ #!/usr/bin/env node
2
+
3
+ const BuilderCCSDK = require("../src/builderSDK.js");
4
+
5
+ const builder = new BuilderCCSDK();
6
+
7
+ builder.init();
package/bin/create.js CHANGED
@@ -1,7 +1,7 @@
1
- #!/usr/bin/env node
2
-
3
- const Creator = require("../src/creator.js");
4
-
5
- const project = new Creator();
6
-
1
+ #!/usr/bin/env node
2
+
3
+ const Creator = require("../src/creatorTemProject.js");
4
+
5
+ const project = new Creator();
6
+
7
7
  project.init();
package/bin/publish.js ADDED
@@ -0,0 +1,7 @@
1
+ #!/usr/bin/env node
2
+
3
+ const Publish = require("../src/publishProject.js");
4
+
5
+ const publish = new Publish();
6
+
7
+ publish.init();
package/package.json CHANGED
@@ -1,22 +1,36 @@
1
- {
2
- "name": "cloudcc-cli",
3
- "version": "1.0.1",
4
- "description": "",
5
- "keywords": [],
6
- "main": "./bin/build",
7
- "author": "",
8
- "license": "ISC",
9
- "bin": {
10
- "cloudccCreate": "bin/create.js",
11
- "cloudccServe": "bin/serve.js",
12
- "cloudccBuild": "bin/build.js"
13
- },
14
- "dependencies": {
15
- "axios": "^0.21.1",
16
- "boxen": "^4.0.0",
17
- "chalk": "^2.4.2",
18
- "inquirer": "^8.1.0",
19
- "mem-fs": "^2.2.1",
20
- "mem-fs-editor": "^9.0.1"
21
- }
1
+ {
2
+ "name": "cloudcc-cli",
3
+ "version": "1.0.4",
4
+ "description": "cloudcc-cli",
5
+ "keywords": [
6
+ "cloudcc",
7
+ "cloudcc-cli"
8
+ ],
9
+ "main": "./bin",
10
+ "author": "cloudcc",
11
+ "license": "ISC",
12
+ "bin": {
13
+ "cloudccCreate": "bin/create.js",
14
+ "cloudccBuild": "bin/build.js",
15
+ "cloudccPublic": "bin/publish.js",
16
+ "cloudccBuildCCSDK": "bin/buildccsdk.js",
17
+ "cloudccBuildCCBaseSDK": "bin/buildccbasesdk.js"
18
+ },
19
+ "scripts": {
20
+ "publish-lib": "npm publish --registry https://registry.npmjs.org"
21
+ },
22
+ "dependencies": {
23
+ "axios": "^0.21.4",
24
+ "boxen": "^4.0.0",
25
+ "chalk": "^2.4.2",
26
+ "crypto-js": "^4.1.1",
27
+ "dayjs": "^1.10.7",
28
+ "inquirer": "^8.1.0",
29
+ "marked": "^3.0.7",
30
+ "md-to-html": "^1.0.2",
31
+ "mem-fs": "^2.2.1",
32
+ "mem-fs-editor": "^9.0.1",
33
+ "vue-custom-element": "^3.3.0",
34
+ "vue-template-compiler": "^2.6.14"
35
+ }
22
36
  }
@@ -0,0 +1,86 @@
1
+ // 同步执行exe命令
2
+ const exec = require('child_process').execSync;
3
+ // 文件管理器
4
+ const fs = require('fs');
5
+ // 控制台输出样式控件
6
+ const chalk = require("chalk")
7
+ // 检查版本更新
8
+ const { checkUpdate } = require("../utils/checkVersion")
9
+ // 配置信息
10
+ const projectConfig = JSON.parse(fs.readFileSync('package.json', 'utf8'))
11
+ // 控制台交互
12
+ const { askType } = require("../utils/askTool")
13
+ // 提交代码,设置Tag
14
+ const { getNewVersionName, pushCodeAndTags } = require("../utils/pushCode")
15
+ // 通知飞书
16
+ const { notifyFeishu } = require("../utils/NotifyIM")
17
+ // 网络请求
18
+ const { postParams } = require("../utils/http")
19
+ /**
20
+ * 打包基础SDK,并发布到NPM
21
+ */
22
+ class Builder {
23
+ constructor() {
24
+ }
25
+ async init() {
26
+ let res = await checkUpdate();
27
+ if (!res) {
28
+ let condition = await askType();
29
+ let version = getNewVersionName([condition.type])
30
+ if (condition && condition.type) {
31
+ if (this.buildpush2npm(version[0].split("V")[1])) {
32
+ pushCodeAndTags([condition.type])
33
+ notifyFeishu(condition.type, version, projectConfig);
34
+ console.log(chalk.green('发布完成'));
35
+ }
36
+ } else {
37
+ console.log();
38
+ console.log(chalk.red("请至少设置一个有效的Tag"));
39
+ console.log();
40
+ }
41
+ }
42
+ }
43
+ /**
44
+ * 打包并发布到npm
45
+ * @returns null
46
+ */
47
+ buildpush2npm(version) {
48
+ try {
49
+ // 设置package.json版本号
50
+ projectConfig.version = version;
51
+ fs.writeFileSync('package.json', JSON.stringify(projectConfig), 'utf8')
52
+ } catch (e) {
53
+ console.log(e);
54
+ }
55
+ try {
56
+ console.log()
57
+ console.log(chalk.green("开始编译,请稍后..."));
58
+ exec('npm run build');
59
+ console.log()
60
+ console.log(chalk.green("编译完成"));
61
+ } catch (error) {
62
+ console.log();
63
+ console.log(chalk.red('编译失败:' + error));
64
+ return false;
65
+ }
66
+ try {
67
+ console.log()
68
+ console.log(chalk.green("NPM开始发布,请稍后..."));
69
+ exec(`npm publish --registry https://registry.npmjs.org`)
70
+ try {
71
+ postParams(`https://npm.taobao.org/sync/${projectConfig.name}`)
72
+ } catch (error) {
73
+
74
+ }
75
+ console.log()
76
+ console.log(chalk.green("NPM发布完成"));
77
+ return true
78
+ } catch (error) {
79
+ console.log();
80
+ console.log(chalk.red('NPM发布失败:' + error));
81
+ return false
82
+ }
83
+ }
84
+
85
+ }
86
+ module.exports = Builder;
@@ -0,0 +1,201 @@
1
+ const { execSync } = require('child_process');
2
+ const { post } = require('../utils/http');
3
+ const fs = require('fs');
4
+ const path = require("path")
5
+ const chalk = require("chalk")
6
+ const inquirer = require("inquirer")
7
+ // 检查cli版本更新功能
8
+ const { checkUpdate } = require("../utils/checkVersion")
9
+ /**
10
+ * 自定义组件,组件打包命令,将组件打包发布到服务器。
11
+ */
12
+ class Builder {
13
+ constructor() {
14
+ this.options = {
15
+ // 开发配置信息
16
+ devConsoleConfig: {
17
+ },
18
+ }
19
+ }
20
+ async init() {
21
+ let res = await checkUpdate();
22
+ if (!res) {
23
+ this.options.devConsoleConfig = this.getPackageJson();
24
+ let config = this.options.devConsoleConfig
25
+ // 如果不是私有化部署,那么需要获取token
26
+ if ("private" != this.options.devConsoleConfig.version) { // private私有化
27
+ config = { "accessToken": await this.getToken(config) };
28
+ }
29
+ // 获得用户输入
30
+ let answers = await this.ask();
31
+ // 如果输入的是*.vue,那么表示编译全部文件
32
+ if ("*.vue" == answers.buildFileName) {
33
+ let dirs = fs.readdirSync("plugin")
34
+ for (let i = 0; i < dirs.length; i++) {
35
+ let item = dirs[i]
36
+ let obj = this.getVueValue(item);
37
+ this.initPluginFile(item, obj.compName);
38
+ this.build(obj);
39
+ await this.upload(obj, config)
40
+ }
41
+ } else {
42
+ let obj = this.getVueValue(answers.buildFileName);
43
+ this.initPluginFile(answers.buildFileName, obj.compName);
44
+ this.build(obj);
45
+ await this.upload(obj, config)
46
+ }
47
+ }
48
+ }
49
+ /**
50
+ * 命令行交互
51
+ * @returns 结果
52
+ */
53
+ ask() {
54
+ const prompt = [];
55
+ prompt.push({
56
+ type: "input",
57
+ name: "buildFileName",
58
+ message: "请输入需要编译的文件名,如index.vue",
59
+ })
60
+ return inquirer.prompt(prompt)
61
+ }
62
+ /**
63
+ * 获得用户信息
64
+ * @returns 配置信息
65
+ */
66
+ getPackageJson() {
67
+ const packageJson = JSON.parse(fs.readFileSync("package.json", 'utf8'));
68
+ return packageJson.devConsoleConfig; // cloudcc-plugin 中的 devConsoleConfig
69
+ }
70
+ /**
71
+ * 请求用户token
72
+ * @param {用户信息} devConsoleConfig
73
+ * @returns token
74
+ */
75
+ async getToken(devConsoleConfig) {
76
+ let res = await post(this.options.devConsoleConfig.baseUrl + "/sysconfig/auth/pc/1.0/post/tokenInfo", devConsoleConfig);
77
+ if (res.returnCode == 200) {
78
+ return res.data.accessToken;
79
+ } else {
80
+ console.error(chalk.red(`登录失败`, JSON.stringify(res)));
81
+ return null;
82
+ }
83
+ }
84
+
85
+ /**
86
+ * 获得Vue内容
87
+ */
88
+ getVueValue(buildFileName) {
89
+ let vueContent = fs.readFileSync(this.getVueContent(buildFileName), 'utf8');
90
+ let vueData = vueContent + ""
91
+ // 添加scoped限制样式污染
92
+ if (!vueContent.includes("scoped")) {
93
+ vueData = vueData.replace("<style", "<style scoped")
94
+ }
95
+ // 去除空格
96
+ // vueData = vueData.replace(/\ +/g, "")
97
+ // 去除换行
98
+ // vueData =vueData.replace(/[\r\n]/g, "");
99
+ vueData = vueData.split("data()")[1].split("isLock:")[0] + "isLock:false,};}";
100
+ vueData = "function data()" + vueData;
101
+ const data = eval(`(${vueData})`)()
102
+ let compName = data.componentInfo.component // 组件名字
103
+ vueData = JSON.stringify(data);
104
+ let bizType = data.componentInfo.bizType // 组件类型
105
+ let compDesc = data.componentInfo.compDesc // 组件描述
106
+ let category = data.componentInfo.category // 组件状态
107
+ return { compName, vueContent, vueData, bizType, compDesc, category }
108
+ };
109
+ /**
110
+ * 生成依赖文件
111
+ * @param {编译的文件名称} buildFileName
112
+ * @param {编译后的组件名称} compName
113
+ */
114
+ initPluginFile(buildFileName, compName) {
115
+ let newContent =
116
+ `
117
+ import Vue from "vue"
118
+ import VueCustomElement from "vue-custom-element"
119
+ Vue.use(VueCustomElement);
120
+
121
+ import index from "./` + buildFileName + `"
122
+ Vue.customElement('`+ compName + `', index);
123
+ `
124
+ fs.writeFileSync('plugin/plugin.js', newContent);
125
+ }
126
+ /**
127
+ * 编译文件,将vue编译为js文件
128
+ * @param {编译对象信息} obj
129
+ */
130
+ build(obj) {
131
+ console.log(chalk.green('编译中,请稍后...'));
132
+ let { stdout, stderr, error } = execSync('npx vue-cli-service build --target lib --name ' + obj.compName + ' --dest build plugin/plugin.js');
133
+ if (null == error) {
134
+ console.log(chalk.green('编译成功!'));
135
+ } else {
136
+ console.log(chalk.red('编译失败:', error));
137
+ }
138
+ fs.unlinkSync('plugin/plugin.js');
139
+ }
140
+ /**
141
+ * 将文件上传
142
+ */
143
+ async upload(obj, header) {
144
+ console.log(chalk.green('发布中,请稍后...'));
145
+ let jsContent = "";
146
+ try {
147
+ jsContent = fs.readFileSync(this.filterFile()[0], 'utf8')
148
+ } catch (err) {
149
+ console.error(err)
150
+ return;
151
+ }
152
+ let body = {
153
+ "compUniName": obj.compName,
154
+ "compContentJs": jsContent,
155
+ "compContentVue": obj.vueContent,
156
+ "vueData": obj.vueData,
157
+ "bizType": obj.bizType,
158
+ "compDesc": obj.compDesc,
159
+ "category": obj.category,
160
+ "belongOrgFlag": this.options.devConsoleConfig.belongOrgFlag || "custom" //belongOrgFlag: 所属单位标识,std:官方的组件(神州云动);custom:第三方的组件
161
+ }
162
+ let res = await post(this.options.devConsoleConfig.baseUrl + "/devconsole/custom/pc/1.0/post/insertCustomComp",
163
+ body, header);
164
+ if (res.returnCode == 200) {
165
+ console.error(chalk.green(`发布成功!`));
166
+ console.log();
167
+ } else {
168
+ console.error(chalk.red(`发布失败: ${res.returnInfo}`));
169
+ console.log();
170
+ }
171
+ return res;
172
+ }
173
+
174
+
175
+
176
+ /**
177
+ * 过滤出min.js文件
178
+ * @returns 过滤结果
179
+ */
180
+ filterFile() {
181
+ const jsPath = "build";
182
+ let jsPaths = [];
183
+ if (jsPath) {
184
+ jsPaths = fs.readdirSync(jsPath).filter((f) => {
185
+ return f.endsWith('umd.min.js');
186
+ }).map((item) => {
187
+ return path.join(jsPath, item);
188
+ });
189
+ }
190
+ return jsPaths;
191
+ }
192
+ /**
193
+ * 过滤出min.js文件
194
+ * @returns 过滤结果
195
+ */
196
+ getVueContent(buildFileName) {
197
+ const jsPath = "plugin";
198
+ return path.join(jsPath, buildFileName);
199
+ }
200
+ }
201
+ module.exports = Builder;
@@ -0,0 +1,161 @@
1
+ const { execSync } = require('child_process');
2
+ const { post } = require('../utils/http');
3
+ const fs = require('fs');
4
+ const path = require("path")
5
+ const chalk = require("chalk")
6
+ const inquirer = require("inquirer")
7
+ const { checkUpdate } = require("../utils/checkVersion")
8
+ /**
9
+ * 打包业务sdk为js并发布到cdn
10
+ */
11
+ class Builder {
12
+ constructor() {
13
+ this.options = {
14
+ // 开发配置信息
15
+ devConsoleConfig: {
16
+ },
17
+ }
18
+ }
19
+ async init() {
20
+ let res = await checkUpdate();
21
+ if (!res) {
22
+ this.options.devConsoleConfig = this.getPackageJson();
23
+ // 获得用户输入
24
+ let answers = await this.ask();
25
+ if (answers.types.length == 0) {
26
+ console.log();
27
+ console.error(chalk.red(`请选择一个有效的发布版本!`));
28
+ console.log();
29
+ return;
30
+ }
31
+ // 获得vue内容
32
+ let obj = this.getSDKName(answers.buildDirName);
33
+ obj.type = answers.types;
34
+ this.build(obj) && this.upload(obj);
35
+ }
36
+ }
37
+ /**
38
+ * 命令行交互
39
+ * @returns 结果
40
+ */
41
+ ask() {
42
+ const prompt = [{
43
+ type: 'list',
44
+ message: '请选择发布版本:',
45
+ name: 'types',
46
+ choices: [
47
+ { name: "客户环境-Release", value: "release" },
48
+ { name: "公司环境-GA", value: "ga" },
49
+ { name: "uat环境-Beta", value: "beta" },
50
+ { name: "测试环境-Dev", value: "dev" },
51
+ ],
52
+ }, {
53
+ type: "input",
54
+ name: "buildDirName",
55
+ message: "请输入需要编译的目录名称,如Detail:",
56
+ }];
57
+ return inquirer.prompt(prompt)
58
+ }
59
+ /**
60
+ * 获得用户信息
61
+ * @returns 配置信息
62
+ */
63
+ getPackageJson() {
64
+ const packageJson = JSON.parse(fs.readFileSync("package.json", 'utf8'));
65
+ return packageJson.devConsoleConfig; // cloudcc-plugin 中的 devConsoleConfig
66
+ }
67
+ /**
68
+ * 请求用户token
69
+ * @param {用户信息} devConsoleConfig
70
+ * @returns token
71
+ */
72
+ async getToken(devConsoleConfig) {
73
+ let res = await post(this.options.devConsoleConfig.baseUrl + "/sysconfig/auth/pc/1.0/post/tokenInfo", devConsoleConfig);
74
+ if (res.returnCode == 200) {
75
+ return res.data.accessToken;
76
+ } else {
77
+ console.error(chalk.red(`登录失败`, JSON.stringify(res)));
78
+ return null;
79
+ }
80
+ }
81
+ /**
82
+ * 获得sdk名字
83
+ */
84
+ getSDKName(buildFileName) {
85
+ let vueContent = fs.readFileSync(path.join("packages", buildFileName, "src", "index.vue"), 'utf8');
86
+
87
+ let sdkName = "cc-" + vueContent.split("\"cc-")[1].split("\"")[0]
88
+
89
+ return { sdkName, path: path.join("packages", buildFileName) }
90
+ };
91
+ /**
92
+ * 编译文件,将vue编译为js文件
93
+ * @param {编译对象信息} obj
94
+ */
95
+ build(obj) {
96
+ try {
97
+ console.log(chalk.green('编译中,请稍后...'));
98
+ console.log()
99
+ execSync(`npx vue-cli-service build --target lib --name ${obj.sdkName} --dest ${path.join(obj.path, "lib")} ${path.join(obj.path, "index.js")}`);
100
+ console.log(chalk.green('编译成功!'));
101
+ console.log()
102
+ return true
103
+ } catch (e) {
104
+ console.log(chalk.red("编译失败:", e.toString("utf8").trim()));
105
+ console.log()
106
+ return false;
107
+ }
108
+ }
109
+ /**
110
+ * 将文件上传
111
+ */
112
+ async upload(obj) {
113
+ console.log(chalk.green('发布中,请稍后...'));
114
+ console.log()
115
+ let jsContent = "";
116
+ try {
117
+ jsContent = fs.readFileSync(path.join(obj.path, "lib", obj.sdkName + ".umd.min.js"), 'utf8')
118
+ } catch (err) {
119
+ console.error(err)
120
+ }
121
+ let body = {
122
+ fileInfo: []
123
+ };
124
+ body.fileInfo.push(
125
+ {
126
+ "fileName": obj.type + "/" + obj.sdkName + ".umd.min.js",
127
+ "fileContent": jsContent,
128
+ "bucketName": "cloudcc-sdk",
129
+ }
130
+ )
131
+ let res = await post(this.options.devConsoleConfig.baseUrl + "/devconsole/cdn/uploadFile",
132
+ body);
133
+ if (res.returnCode == 200) {
134
+ console.error(chalk.green(`发布成功!`));
135
+ console.log();
136
+ } else {
137
+ console.error(chalk.red(`发布失败: ${res.returnInfo}`));
138
+ console.log();
139
+ }
140
+
141
+ return res;
142
+ }
143
+
144
+ /**
145
+ * 过滤出min.js文件
146
+ * @returns 过滤结果
147
+ */
148
+ filterFile() {
149
+ const jsPath = "build";
150
+ let jsPaths = [];
151
+ if (jsPath) {
152
+ jsPaths = fs.readdirSync(jsPath).filter((f) => {
153
+ return f.endsWith('umd.min.js');
154
+ }).map((item) => {
155
+ return path.join(jsPath, item);
156
+ });
157
+ }
158
+ return jsPaths;
159
+ }
160
+ }
161
+ module.exports = Builder;
@@ -4,10 +4,13 @@ const memFs = require("mem-fs")
4
4
  const memFsEditor = require("mem-fs-editor")
5
5
  const fs = require("fs")
6
6
  const path = require("path")
7
+ const { checkUpdate } = require("../utils/checkVersion")
8
+ /**
9
+ * 创建自定组件开发模板项目
10
+ */
7
11
  class Creator {
8
12
  constructor() {
9
- const store = memFs.create();
10
- this.fs = memFsEditor.create(store);
13
+ this.fs = memFsEditor.create(memFs.create());
11
14
  this.options = {
12
15
  name: "",
13
16
  description: ""
@@ -18,13 +21,17 @@ class Creator {
18
21
  this.tplDirPath = path.join(this.rootPath, "template");
19
22
  }
20
23
  // 初始化
21
- init() {
22
- console.log(chalk.green('my cli 开始'));
23
- this.ask().then(answers => {
24
- this.options = Object.assign({}, this.options, answers);
25
- console.log(this.options);
26
- this.write();
27
- })
24
+ async init() {
25
+ let res = await checkUpdate();
26
+ if (!res) {
27
+ console.log()
28
+ console.log(chalk.green('欢迎使用Cloudcc-CLI'));
29
+ this.ask().then(answers => {
30
+ this.options = Object.assign({}, this.options, answers);
31
+ console.log(this.options);
32
+ this.write();
33
+ })
34
+ }
28
35
  }
29
36
  // 命令行交互
30
37
  ask() {
@@ -55,12 +62,14 @@ class Creator {
55
62
  }
56
63
  // 拷贝和写数据
57
64
  write() {
58
- console.log(chalk.green("my cli 开始构建"));
65
+ console.log();
66
+ console.log(chalk.green("开始构建,请稍后"));
59
67
  const tplBuilder = require("../template/index");
60
68
  tplBuilder(this, this.options, () => {
61
- console.log(chalk.green('my cli 构建完成'));
62
69
  console.log();
63
- console.log(chalk.grey(`开始项目: cd ${this.options.name} && npm install`));
70
+ console.log(chalk.green('构建完成'));
71
+ console.log();
72
+ console.log(chalk.green(`运行项目: \n 1:cd ${this.options.name} \n 2:code . \n 3:npm install`));
64
73
  })
65
74
  }
66
75