UNPKG

5.62 kBJavaScriptView Raw
1const fs = require("fs");
2const path = require('path');
3const fse = require("fs-extra");
4const chalk = require('chalk');
5const logger = require('../utils/logger');
6const utils = require("../utils");
7const inquirer = require('inquirer');
8const ora = require('ora');
9const request = require('request');
10
11/**
12 * 上传程序
13 * @param op
14 */
15function publish(op) {
16 if (utils.count(op.name) === 0) {
17 logger.fatal('请输入要上传的插件名称!');
18 }
19 op.pluginPath = path.resolve(op.rootDir, 'plugins', op.name);
20 if (!fse.pathExistsSync(op.pluginPath)) {
21 logger.fatal(op.name + '插件目录不存在!');
22 }
23 op.pluginZipPath = path.resolve(op.pluginPath, utils.spritUpperCase(op.name) + '.zip');
24 if (fs.existsSync(op.pluginZipPath)) {
25 fse.removeSync(op.pluginZipPath);
26 }
27 let configFile = path.resolve(op.pluginPath, 'config.json');
28 let configInfo = utils.jsonParse(!fs.existsSync(configFile) ? {} : fs.readFileSync(configFile, 'utf8'));
29 //
30 inquirer.prompt([{
31 type: 'input',
32 name: 'desc',
33 message: '请输入' + op.name + '插件描述:',
34 validate: (value) => {
35 if (utils.count(value) === 0) {
36 return "请输入插件描述";
37 }
38 configInfo['desc'] = value;
39 return true;
40 },
41 default: () => {
42 return configInfo['desc'] || null;
43 },
44 }, {
45 type: 'list',
46 name: 'device',
47 message: '请选择' + op.name + '插件支持的平台:',
48 choices: [{
49 name: '支持 Android、iOS',
50 value: 'android,ios'
51 }, {
52 name: '仅支持 Android',
53 value: 'android'
54 }, {
55 name: '仅支持 iOS',
56 value: 'ios'
57 }]
58 }, {
59 type: 'input',
60 name: 'zipdesc',
61 message: '请输入' + utils.spritUpperCase(op.name) + '.zip插件包描述(选填):',
62 }]).then(answers => {
63 fs.writeFileSync(configFile, JSON.stringify(utils.sortObject(configInfo), null, "\t"), 'utf8');
64 op.android = answers.device.indexOf("android") !== -1;
65 op.ios = answers.device.indexOf("ios") !== -1;
66 op.desc = answers.desc;
67 op.zipdesc = answers.zipdesc;
68 op.token = utils.getToken();
69 let loading = ora('正在准备插件...').start();
70 request(utils.apiUrl() + 'users/info?token=' + op.token, (err, res, body) => {
71 loading.stop();
72 let data = utils.jsonParse(body);
73 if (data.ret === -1) {
74 logger.warn('请先登录后上传!');
75 utils.login(() => {
76 op.token = utils.getToken();
77 compress(op);
78 });
79 return;
80 }
81 if (data.ret !== 1) {
82 logger.fatal(`验证身份失败:${data.msg}`);
83 }
84 compress(op);
85 });
86 }).catch(console.error);
87}
88
89/**
90 * 开始压缩
91 */
92function compress(op) {
93 let loading = ora('正在打包插件...').start();
94 utils.zipCompress({
95 output: op.pluginZipPath,
96 entry: [{
97 type: 'dir',
98 path: op.pluginPath
99 }]
100 }, (output, err) => {
101 loading.stop();
102 if (err) {
103 throw err;
104 }
105 uploadFileZip(op);
106 });
107}
108
109/**
110 * 开始上传
111 * @param op
112 */
113function uploadFileZip(op) {
114 op.fileinfo = [];
115 let loading = ora('正在上传插件...').start();
116 request.post({
117 url: utils.apiUrl() + 'plugins/lists',
118 formData: {
119 act: 'upload',
120 token: op.token,
121 zipfile: fs.createReadStream(op.pluginZipPath),
122 }
123 }, (error, response, body) => {
124 loading.stop();
125 let data = utils.jsonParse(body);
126 if (data.ret !== 1) {
127 fse.removeSync(op.pluginZipPath);
128 logger.fatal(`上传插件失败:${data.msg}`);
129 }
130 data.data['desc'] = op.zipdesc;
131 op.fileinfo.push(data.data);
132 launch(op);
133 });
134}
135
136/**
137 * 开始上传
138 * @param op
139 */
140function launch(op) {
141 let loading = ora('开始上传插件...').start();
142 let configFile = path.resolve(op.pluginPath, 'config.json');
143 if (fs.existsSync(configFile)) {
144 let configInfo = utils.jsonParse(fs.readFileSync(configFile, 'utf8'));
145 op.requireName = configInfo.requireName || '';
146 }
147 let D = utils.clone(op);
148 D.name = op.name.substring(op.name.lastIndexOf("/") + 1);
149 request.post({
150 url: utils.apiUrl() + 'plugins/lists',
151 formData: {
152 act: 'add',
153 publish: 'cli',
154 token: op.token,
155 D: utils.jsonStringify(D)
156 }
157 }, (error, response, body) => {
158 loading.stop();
159 let data = utils.jsonParse(body);
160 if (data.ret !== 1) {
161 logger.fatal(`上传插件失败:${data.msg}`);
162 }
163 let pathName = utils.getObject(data, 'data.pathName');
164 let fileSize = utils.runNum(utils.getObject(data, 'data.fileSize'));
165 let formatSize = utils.getObject(data, 'data.formatSize');
166 logger.success(`插件${op.name}上传成功!${fileSize > 0 ? `(${formatSize})` : ``}`);
167 logger.success('开发者可通过 ' + chalk.underline(`eeui plugin install ${pathName}`) + ' 命令添加此插件。');
168 logger.info('更多详细设置可登录控制台 ' + chalk.underline(utils.consoleUrl(true)) + ' 查看。');
169 //
170 fse.removeSync(op.pluginZipPath);
171 });
172}
173
174module.exports = {publish};