@pisell/common 1.0.1 → 1.0.3

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.
Files changed (44) hide show
  1. package/CHANGELOG.md +14 -0
  2. package/es/bin/pisell.js +2 -0
  3. package/es/index.d.ts +2 -0
  4. package/es/index.js +1 -0
  5. package/es/script/constants/index.js +13 -0
  6. package/es/script/deploy.js +47 -0
  7. package/es/script/index.js +40 -0
  8. package/es/script/package.json +4 -0
  9. package/es/script/release/index.js +161 -0
  10. package/es/script/release/release.js +163 -0
  11. package/es/script/uploadCode/index.js +278 -0
  12. package/es/script/uploadCode/uploadCode.js +401 -0
  13. package/es/script/utils/index.js +336 -0
  14. package/lib/bin/pisell.js +26 -0
  15. package/lib/index.d.ts +2 -0
  16. package/lib/index.js +25 -0
  17. package/lib/script/constants/index.js +40 -0
  18. package/lib/{button/index.js → script/deploy.js} +28 -14
  19. package/lib/script/index.js +61 -0
  20. package/lib/script/package.json +4 -0
  21. package/lib/script/release/index.js +114 -0
  22. package/lib/script/release/release.js +87 -0
  23. package/lib/script/uploadCode/index.js +200 -0
  24. package/lib/script/uploadCode/uploadCode.js +206 -0
  25. package/lib/script/utils/index.js +252 -0
  26. package/package.json +10 -4
  27. package/src/bin/pisell.js +3 -0
  28. package/src/index.ts +1 -0
  29. package/src/script/constants/index.js +14 -0
  30. package/src/script/deploy.js +29 -0
  31. package/src/script/index.js +45 -0
  32. package/src/script/package.json +4 -0
  33. package/src/script/release/index.js +119 -0
  34. package/src/script/release/release.js +84 -0
  35. package/src/script/uploadCode/index.js +244 -0
  36. package/src/script/uploadCode/uploadCode.js +217 -0
  37. package/src/script/utils/index.js +275 -0
  38. package/es/button/index.d.ts +0 -18
  39. package/es/button/index.d.ts.map +0 -1
  40. package/es/button/index.js +0 -33
  41. package/lib/button/index.d.ts +0 -18
  42. package/lib/button/index.d.ts.map +0 -1
  43. package/src/button/index.md +0 -17
  44. package/src/button/index.tsx +0 -38
@@ -0,0 +1,252 @@
1
+ var __create = Object.create;
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __getProtoOf = Object.getPrototypeOf;
6
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
7
+ var __export = (target, all) => {
8
+ for (var name in all)
9
+ __defProp(target, name, { get: all[name], enumerable: true });
10
+ };
11
+ var __copyProps = (to, from, except, desc) => {
12
+ if (from && typeof from === "object" || typeof from === "function") {
13
+ for (let key of __getOwnPropNames(from))
14
+ if (!__hasOwnProp.call(to, key) && key !== except)
15
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
16
+ }
17
+ return to;
18
+ };
19
+ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
20
+ // If the importer is in node compatibility mode or this is not an ESM
21
+ // file that has been converted to a CommonJS file using a Babel-
22
+ // compatible transform (i.e. "__esModule" has not been set), then set
23
+ // "default" to the CommonJS "module.exports" for node compatibility.
24
+ isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
25
+ mod
26
+ ));
27
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
28
+
29
+ // src/script/utils/index.js
30
+ var utils_exports = {};
31
+ __export(utils_exports, {
32
+ connectServer: () => connectServer,
33
+ getCurrentProjectName: () => getCurrentProjectName,
34
+ getCurrentUserName: () => getCurrentUserName,
35
+ getGitCurrentBranch: () => getGitCurrentBranch,
36
+ getServerConfig: () => getServerConfig,
37
+ isWorkingTreeClean: () => isWorkingTreeClean,
38
+ loadJSON: () => loadJSON,
39
+ releaseProject: () => releaseProject,
40
+ sendWebhook: () => sendWebhook,
41
+ serverUnpack: () => serverUnpack,
42
+ serverUpload: () => serverUpload,
43
+ versionSort: () => versionSort
44
+ });
45
+ module.exports = __toCommonJS(utils_exports);
46
+ var dotenv = __toESM(require("dotenv"));
47
+ var import_path = __toESM(require("path"));
48
+ var import_ssh2 = __toESM(require("ssh2"));
49
+ var isWorkingTreeClean = async () => {
50
+ const v = await $`git status --porcelain`;
51
+ return v.stdout === "";
52
+ };
53
+ var getGitCurrentBranch = async () => {
54
+ const v = await $`git symbolic-ref --short HEAD`;
55
+ return v.stdout;
56
+ };
57
+ var monorepoProjectNameArr = ["admin"];
58
+ var getServerConfig = async (project) => {
59
+ if (monorepoProjectNameArr.includes(project)) {
60
+ return await fs.readJson("../../../lm_config.json");
61
+ }
62
+ return await fs.readJson("../lm_config.json");
63
+ };
64
+ var connectServer = (config2) => {
65
+ const conn = new import_ssh2.default.Client();
66
+ return new Promise((resolve, reject) => {
67
+ conn.on("ready", () => {
68
+ resolve(conn);
69
+ }).on("error", (err) => {
70
+ console.log(err, "connect error");
71
+ reject();
72
+ }).connect(config2);
73
+ });
74
+ };
75
+ var serverUpload = (conn, { localPath, remotePath }) => {
76
+ if (!conn)
77
+ return Promise.reject("未连接服务器");
78
+ return new Promise((resolve, reject) => {
79
+ conn.sftp((err, sftp) => {
80
+ if (err) {
81
+ console.log(err);
82
+ reject(err);
83
+ return;
84
+ }
85
+ sftp.fastPut(
86
+ localPath,
87
+ remotePath,
88
+ {
89
+ step: (total, nb, fsize) => {
90
+ console.table([
91
+ {
92
+ 标题: "当前已上传",
93
+ 值: `${(total / fsize * 100).toFixed(2)}%`
94
+ },
95
+ {
96
+ 标题: "每次上传",
97
+ 值: `${(nb / 1024 / 1024).toFixed(2)}M`
98
+ },
99
+ {
100
+ 标题: "总大小",
101
+ 值: `${(fsize / 1024 / 1024).toFixed(2)}M`
102
+ }
103
+ ]);
104
+ }
105
+ },
106
+ (err2) => {
107
+ if (err2) {
108
+ console.log(err2);
109
+ reject(err2);
110
+ return;
111
+ }
112
+ console.log("上传成功");
113
+ resolve(conn);
114
+ }
115
+ );
116
+ });
117
+ });
118
+ };
119
+ var serverUnpack = (conn, { path: path2, fileName, fullFileName, changelog }) => {
120
+ if (!conn)
121
+ return Promise.reject("未连接服务器");
122
+ return new Promise((resolve, reject) => {
123
+ conn.shell((err, stream) => {
124
+ if (err) {
125
+ console.log(err);
126
+ reject(err);
127
+ return;
128
+ }
129
+ stream.end(
130
+ `
131
+ cd ${path2}
132
+ unzip ${fullFileName} -d ${fileName} && mv ${fileName}/dist/* ${fileName}/ && rmdir ${fileName}/dist
133
+ rm -rf ${fullFileName}
134
+ echo "${changelog}" > ./${fileName}/changelog.md
135
+ sh deleteOldVersion.sh
136
+ exit
137
+ `
138
+ // 打开到path
139
+ // 解压 1.0.0.zip 文件到 1.0.0 移动dist中内容到 1.0.0内 删除dist
140
+ // 删除1.0.0.zip
141
+ // 写入changelog到changelog.md
142
+ // 执行deleteOldVersion脚本 删除过早版本
143
+ ).on("data", (data) => {
144
+ console.log(data.toString());
145
+ }).on("close", () => {
146
+ console.log("✅上传完成");
147
+ resolve();
148
+ });
149
+ });
150
+ });
151
+ };
152
+ var releaseProject = (conn, { path: path2, fileName }) => {
153
+ return new Promise((resolve, reject) => {
154
+ conn.shell((err, stream) => {
155
+ if (err) {
156
+ console.log(err);
157
+ reject(err);
158
+ return;
159
+ }
160
+ stream.end(
161
+ `
162
+ cd ${path2}
163
+ cp -R -f pre-master next-master
164
+ rm -rf pre-master
165
+ \\cp -R -f ${fileName}/* next-master
166
+ cp -R -f ${fileName} pre-master
167
+ rm -rf master
168
+ cp -R next-master master
169
+ rm -rf next-master
170
+ exit
171
+ `
172
+ // 打开到path
173
+ // 复制pre-master到next-master
174
+ // 删除pre-master
175
+ // 复制1.0.0到next-master
176
+ // 复制1.0.0到pre-master
177
+ // 删除master
178
+ // 复制next-master到master
179
+ // 删除next-master
180
+ ).on("data", (data) => {
181
+ console.log(data.toString());
182
+ }).on("close", () => {
183
+ console.log("✅发布完成");
184
+ resolve();
185
+ });
186
+ });
187
+ });
188
+ };
189
+ var versionSort = (versionList) => {
190
+ return versionList.sort((a, b) => {
191
+ const aParts = a.split(".");
192
+ const bParts = b.split(".");
193
+ for (let i = 0; i < aParts.length && i < bParts.length; i++) {
194
+ const aNum = parseInt(aParts[i]);
195
+ const bNum = parseInt(bParts[i]);
196
+ if (aNum !== bNum) {
197
+ return bNum - aNum;
198
+ }
199
+ }
200
+ return bParts.length - aParts.length;
201
+ });
202
+ };
203
+ var getCurrentProjectName = () => {
204
+ return loadJSON(import_path.default.join(process.cwd(), "./package.json")).name;
205
+ };
206
+ var loadJSON = (path2) => JSON.parse(fs.readFileSync(path2));
207
+ var getCurrentUserName = async () => {
208
+ const { stdout } = await $`git config user.name`;
209
+ return stdout;
210
+ };
211
+ var createFeishuMessageContent = (contentArr) => {
212
+ return JSON.stringify(
213
+ contentArr.map((item) => {
214
+ return [
215
+ { tag: "text", text: `${item.key}: ` },
216
+ { tag: "text", text: `${item.value}` }
217
+ ];
218
+ })
219
+ );
220
+ };
221
+ var sendWebhook = async ({ title, content }) => {
222
+ var _a, _b, _c, _d;
223
+ const contentStr = createFeishuMessageContent(content);
224
+ if (!((_b = (_a = dotenv.config()) == null ? void 0 : _a.parsed) == null ? void 0 : _b.WEBHOOK))
225
+ return;
226
+ const response = await fetch((_d = (_c = dotenv.config()) == null ? void 0 : _c.parsed) == null ? void 0 : _d.WEBHOOK, {
227
+ headers: {
228
+ "Content-Type": "application/json"
229
+ },
230
+ method: "POST",
231
+ body: JSON.stringify({
232
+ msg_type: "post",
233
+ content: `{"post":{"zh_cn":{"title":"${title}","content":${contentStr}}}}`
234
+ })
235
+ });
236
+ return await response.json();
237
+ };
238
+ // Annotate the CommonJS export names for ESM import in node:
239
+ 0 && (module.exports = {
240
+ connectServer,
241
+ getCurrentProjectName,
242
+ getCurrentUserName,
243
+ getGitCurrentBranch,
244
+ getServerConfig,
245
+ isWorkingTreeClean,
246
+ loadJSON,
247
+ releaseProject,
248
+ sendWebhook,
249
+ serverUnpack,
250
+ serverUpload,
251
+ versionSort
252
+ });
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pisell/common",
3
- "version": "1.0.1",
3
+ "version": "1.0.3",
4
4
  "sideEffects": [
5
5
  "*.less"
6
6
  ],
@@ -8,10 +8,16 @@
8
8
  "module": "./es/index.js",
9
9
  "types": "./lib/index.d.ts",
10
10
  "typings": "./lib/index.d.ts",
11
+ "bin": {
12
+ "pisell": "es/bin/pisell.js"
13
+ },
11
14
  "dependencies": {
12
- "antd": "^5.5.0",
13
- "react": "^18.0.0",
14
- "react-dom": "^18.0.0"
15
+ "zx": "^7.2.2",
16
+ "inquirer": "^6.2.6",
17
+ "archiver": "^5.3.1",
18
+ "dotenv": "^16.0.3",
19
+ "ssh2": "^1.13.0",
20
+ "@pisell/utils": "1.0.3"
15
21
  },
16
22
  "devDependencies": {
17
23
  "father": "^4.1.6"
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+
3
+ import('../../es/script/index.js');
package/src/index.ts ADDED
@@ -0,0 +1 @@
1
+ export default {};
@@ -0,0 +1,14 @@
1
+ const outPathMap = {
2
+ my_pisel_shop: {
3
+ prod: '../data/release/project/mypisel_shop',
4
+ release: '../data/release/project/my_pisel_shop',
5
+ pre: '../data/release/project/my_pisel_shop',
6
+ },
7
+ admin: {
8
+ prod: '../data/release/project/pisell_v2',
9
+ release: '../data/release/project/pisell_v2',
10
+ pre: '../data/release/project/pisell_v2',
11
+ },
12
+ };
13
+
14
+ export { outPathMap };
@@ -0,0 +1,29 @@
1
+ import inquirer from 'inquirer';
2
+ import release from './release/index.js';
3
+ import uploadCode from './uploadCode/index.js';
4
+
5
+ const actions = {
6
+ uploadCode: uploadCode,
7
+ release: release,
8
+ };
9
+
10
+ const inquirerResult = () => {
11
+ return inquirer.prompt([
12
+ {
13
+ type: 'list',
14
+ message: '请选择功能',
15
+ name: 'action',
16
+ choices: [
17
+ { value: 'uploadCode', name: '上传代码' },
18
+ { value: 'release', name: '发布代码' },
19
+ ],
20
+ },
21
+ ]);
22
+ };
23
+
24
+ const deploy = async () => {
25
+ let res = await inquirerResult();
26
+ return actions[res.action]();
27
+ };
28
+
29
+ export default deploy;
@@ -0,0 +1,45 @@
1
+ import { fileURLToPath } from 'url';
2
+ import deploy from './deploy.js';
3
+ import { loadJSON } from './utils/index.js';
4
+
5
+ const args = process.argv.slice(2);
6
+
7
+ const isVersion = (v) => {
8
+ return ['-v', '--version', '-V'].includes(v);
9
+ };
10
+
11
+ const isHelp = (v) => {
12
+ return ['-h', '--help', '-H'].includes(v);
13
+ };
14
+
15
+ const __dirname = path.dirname(fileURLToPath(import.meta.url));
16
+
17
+ (() => {
18
+ try {
19
+ const params = args.slice(1);
20
+ switch (true) {
21
+ case args[0] === 'deploy':
22
+ deploy(...params);
23
+ break;
24
+ case isVersion(args[0]):
25
+ console.log(
26
+ `@pisell/common@${
27
+ loadJSON(path.join(__dirname, '../../package.json')).version
28
+ }`,
29
+ );
30
+ break;
31
+ case isHelp(args[0]):
32
+ console.log('pisell -h --help -H [全部命令]');
33
+
34
+ console.log('pisell -v --version -V [显示版本]');
35
+
36
+ console.log('pisell deploy [上传代码|发布代码]');
37
+ break;
38
+ default:
39
+ break;
40
+ }
41
+ } catch (e) {
42
+ console.error(e.stack);
43
+ process.exit(1);
44
+ }
45
+ })();
@@ -0,0 +1,4 @@
1
+ {
2
+ "name": "script",
3
+ "type": "module"
4
+ }
@@ -0,0 +1,119 @@
1
+ #!/usr/bin/env zx
2
+ import inquirer from 'inquirer';
3
+ import {
4
+ getCurrentProjectName,
5
+ getServerConfig,
6
+ versionSort,
7
+ } from '../utils/index.js';
8
+ import Release from './release.js';
9
+
10
+ const selectProject = () => {
11
+ return inquirer.prompt([
12
+ // {
13
+ // type: "list",
14
+ // message: "请选择项目",
15
+ // name: "project",
16
+ // choices: [
17
+ // {
18
+ // value: {
19
+ // fileName: "my_pisel_shop",
20
+ // path:"./",
21
+ // },
22
+ // name: "my_pisel_shop"
23
+ // },
24
+ // ],
25
+ // },
26
+ {
27
+ type: 'list',
28
+ message: '请选择发布环境',
29
+ name: 'env',
30
+ choices: ['release', 'pre', 'prod'],
31
+ },
32
+ ]);
33
+ };
34
+
35
+ /**
36
+ * @Title: 选择器函数
37
+ * @Describe:
38
+ * @Author: Wzw
39
+ */
40
+ const inquirerResult = (versionList) => {
41
+ return inquirer.prompt([
42
+ {
43
+ type: 'list',
44
+ message: '请选择发布版本号',
45
+ name: 'version',
46
+ default: versionList,
47
+ choices: versionList,
48
+ },
49
+ {
50
+ type: 'confirm',
51
+ message: '确认发布',
52
+ name: 'is_release',
53
+ default: true,
54
+ },
55
+ ]);
56
+ };
57
+
58
+ // 版本选择时过滤的文件夹
59
+ const ignoreName = ['master', '.git', 'pre-master'];
60
+
61
+ /**
62
+ * @Title: 获取所选项目的版本号列表
63
+ * @Describe:
64
+ * @Author: Zsj
65
+ */
66
+ const getVersionList = async ({ env, project }) => {
67
+ const config = await getServerConfig(project.fileName);
68
+
69
+ let host = config[env].host;
70
+ if (env === 'release') {
71
+ host = config.cn[env].host;
72
+ }
73
+ let projectName = project.fileName;
74
+ if (projectName === 'my_pisel_shop' && env === 'prod') {
75
+ projectName = 'mypisel_shop';
76
+ }
77
+ // 域名
78
+ const versionList = await fetch(
79
+ `http://${host}:3600/version?projectName=${projectName}`,
80
+ ).then((res) => res.json());
81
+
82
+ return versionSort(versionList.filter((item) => !ignoreName.includes(item)));
83
+ };
84
+
85
+ async function init() {
86
+ /** 选择项目 */
87
+ let projectAndEnv = await selectProject();
88
+
89
+ /** 之前选择项目模式改为获取当前主项目 */
90
+ projectAndEnv.project = {
91
+ path: './',
92
+ fileName: getCurrentProjectName(),
93
+ };
94
+
95
+ /** 通过项目和环境查询对应版本号 */
96
+ const versionList = await getVersionList(projectAndEnv);
97
+
98
+ const res = await inquirerResult(versionList);
99
+
100
+ const releaseInstance = new Release({ ...res, ...projectAndEnv });
101
+
102
+ try {
103
+ /** 设置连接服务器配置 */
104
+ await releaseInstance.setConfig();
105
+
106
+ /** 连接服务器 */
107
+ await releaseInstance.connectServer();
108
+
109
+ /** 发布 */
110
+ await releaseInstance.release();
111
+
112
+ /** 断开 */
113
+ await releaseInstance.disconnectServer();
114
+ } catch (error) {
115
+ console.log(error);
116
+ }
117
+ }
118
+
119
+ export default init;
@@ -0,0 +1,84 @@
1
+ import { outPathMap } from '../constants/index.js';
2
+ import {
3
+ connectServer,
4
+ getServerConfig,
5
+ releaseProject,
6
+ } from '../utils/index.js';
7
+
8
+ /**
9
+ * @Title: 执行发布类
10
+ * @Describe:
11
+ * @Author: Zsj
12
+ */
13
+ class Release {
14
+ constructor(props) {
15
+ const { project, env, version, conn } = props;
16
+ this.projectName = project.fileName;
17
+ this.env = env;
18
+ this.version = version;
19
+
20
+ this.conn = conn;
21
+ this.outPath = outPathMap[this.projectName][this.env];
22
+ }
23
+
24
+ /**
25
+ * @Title: 设置连接服务器配置
26
+ * @Describe:
27
+ * @Author: Zsj
28
+ */
29
+ async setConfig() {
30
+ const serverConfigMap = await getServerConfig(this.projectName);
31
+
32
+ let serverConfig = serverConfigMap[this.env];
33
+
34
+ // 选择release默认用国内cn服务器
35
+ if (this.env === 'release') {
36
+ serverConfig = serverConfigMap.cn[this.env];
37
+ }
38
+
39
+ if (this.env === 'prod') {
40
+ serverConfig.privateKey = fs.readFileSync(
41
+ path.join(process.env.HOME, '.ssh', 'id_rsa'),
42
+ );
43
+ }
44
+
45
+ this.serverConfig = serverConfig;
46
+ }
47
+
48
+ /**
49
+ * @Title: 连接服务器
50
+ * @Describe:
51
+ * @Author: Zsj
52
+ */
53
+ async connectServer() {
54
+ if (!this.serverConfig) {
55
+ console.log('未找到发布配置!');
56
+ return null;
57
+ }
58
+ this.conn = await connectServer(this.serverConfig);
59
+ return this.conn;
60
+ }
61
+
62
+ /**
63
+ * @Title: 执行发布操作
64
+ * @Describe:
65
+ * @Author: Zsj
66
+ */
67
+ async release() {
68
+ return await releaseProject(this.conn, {
69
+ path: this.outPath,
70
+ fileName: `${this.version}`,
71
+ });
72
+ }
73
+
74
+ /**
75
+ * @Title: 断开服务连接
76
+ * @Describe:
77
+ * @Author: Zsj
78
+ */
79
+ async disconnectServer() {
80
+ return await this.conn.end();
81
+ }
82
+ }
83
+
84
+ export default Release;