1 | const fs = require("fs");
|
2 | const path = require('path');
|
3 | const fse = require("fs-extra");
|
4 | const chalk = require('chalk');
|
5 | const logger = require('../utils/logger');
|
6 | const utils = require("../utils");
|
7 | const inquirer = require('inquirer');
|
8 | const ora = require('ora');
|
9 | const request = require('request');
|
10 |
|
11 |
|
12 |
|
13 |
|
14 |
|
15 | function 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 |
|
92 | function 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 |
|
112 |
|
113 | function 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 |
|
139 |
|
140 | function 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 |
|
174 | module.exports = {publish};
|