zmp-cli 3.5.3-1 → 3.5.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.
- package/README.git.md +37 -0
- package/config/dist/index.dev.js +15 -5
- package/config/index.js +2 -1
- package/dist/index.dev.js +351 -0
- package/index.js +1 -0
- package/package.json +1 -1
package/README.git.md
ADDED
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
# ZMP-CLI
|
|
2
|
+
CLI dùng để start, build, deploy Zalo Mini App
|
|
3
|
+
|
|
4
|
+
## Contribute
|
|
5
|
+
Project bao gồm các nhánh:
|
|
6
|
+
- master: nhánh chính tương ứng với version đang release
|
|
7
|
+
- develop: nhánh chính, source code mới nhất bao gồm các tính năng chuẩn bị cho lần release tiếp theo
|
|
8
|
+
- feature/*: nhánh tương ứng với chức năng đang phát triển (xoá sau khi hoàn thành)
|
|
9
|
+
- release/*-rc: nhánh tương ứng với các release candidate (xoá sau khi hoàn thành)
|
|
10
|
+
- hotfix/*: nhánh tương ứng với bug cần fix cho version đang release (xoá sau khi hoàn thành)
|
|
11
|
+
|
|
12
|
+
Suggest sử dụng git flow để quản lí các nhánh:
|
|
13
|
+
1. Cài đặt và tìm hiểu git flow theo [hướng dẫn](https://danielkummer.github.io/git-flow-cheatsheet/index.vi_VN.html)
|
|
14
|
+
2. Init git flow tương ứng với các branch trên: ```git flow init```
|
|
15
|
+
|
|
16
|
+
Phát triển một tính năng mới:
|
|
17
|
+
1. Để bắt đầu code tính năng mới: ```git flow feature start feature_1```
|
|
18
|
+
2. Sau khi code và test xong: ```git flow feature finish feature_1```, tính năng sẽ được merge vào nhánh develop
|
|
19
|
+
|
|
20
|
+
Tạo một release candidate (suffix "-rc"):
|
|
21
|
+
1. ```git flow release start <major>.<minor>.<patch>-rc```
|
|
22
|
+
2. Sau khi test xong: ```git flow release finish <major>.<minor>.<patch>-rc```, tính năng sẽ được merge vào nhánh master để chờ release và nhánh develop
|
|
23
|
+
|
|
24
|
+
Để fix bug trên bản release:
|
|
25
|
+
1. ```git flow hotfix start bug-a```
|
|
26
|
+
2. Sau khi fix xong: ```git flow hotfix finish bug-a```, tính năng sẽ được merge vào nhánh master để chờ release và nhánh develop
|
|
27
|
+
|
|
28
|
+
Để fix bug trên bản release-candidate:
|
|
29
|
+
1. Tạo nhánh mới từ nhánh rc muốn fix với refix: ```git branch ```
|
|
30
|
+
2. Sau khi fix xong: ```git flow hotfix finish bug-a```, tính năng sẽ được merge vào nhánh master để chờ release và nhánh develop
|
|
31
|
+
|
|
32
|
+
Để release nhánh master:
|
|
33
|
+
1. ```npm run release```
|
|
34
|
+
2. Nhập version:
|
|
35
|
+
- patch: fix bug
|
|
36
|
+
- minor: thêm tính năng
|
|
37
|
+
- major: thay đổi lớn có ảnh hưởng tới version cũ
|
package/config/dist/index.dev.js
CHANGED
|
@@ -1,13 +1,17 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
|
|
3
3
|
module.exports = {
|
|
4
|
+
filename: {
|
|
5
|
+
appConfig: 'app-config.json',
|
|
6
|
+
zmpConfig: 'zmp-cli.json'
|
|
7
|
+
},
|
|
4
8
|
api_domain: {
|
|
5
9
|
dev: 'https://dev-zmp-api.developers.zalo.me/',
|
|
6
10
|
prod: 'https://zmp-api.developers.zalo.me/'
|
|
7
11
|
},
|
|
8
12
|
zdn_url: {
|
|
9
|
-
dev: '
|
|
10
|
-
prod: '
|
|
13
|
+
dev: '//dev.h5.zalo.me/zapps/',
|
|
14
|
+
prod: '//h5.zdn.vn/zapps/'
|
|
11
15
|
},
|
|
12
16
|
path: {
|
|
13
17
|
login: 'admin/login',
|
|
@@ -19,24 +23,30 @@ module.exports = {
|
|
|
19
23
|
getAppInfo: 'app/get-info'
|
|
20
24
|
},
|
|
21
25
|
dirname: __dirname,
|
|
22
|
-
root_env:
|
|
26
|
+
root_env: function root_env() {
|
|
27
|
+
return "".concat(process.cwd(), "/.env");
|
|
28
|
+
},
|
|
23
29
|
env: {
|
|
24
30
|
appId: 'APP_ID',
|
|
25
31
|
token: 'ZMP_TOKEN'
|
|
26
32
|
},
|
|
27
33
|
error_code: {
|
|
34
|
+
app_config_not_found: -1400,
|
|
28
35
|
permission_denied: -2001,
|
|
29
36
|
request_timeout: -2003
|
|
30
37
|
},
|
|
31
38
|
error_msg: {
|
|
39
|
+
app_config_not_found: "App config not found. Please re-init project. (Tips: Run 'zmp init')",
|
|
32
40
|
permission_denied: "Permission denied. Please login again. (Tips: Run 'zmp login')",
|
|
33
41
|
request_timeout: 'Request Timeout'
|
|
34
42
|
},
|
|
35
43
|
resumable_option: {
|
|
36
|
-
chunkSize:
|
|
44
|
+
chunkSize: 512 * 1000,
|
|
45
|
+
// bytes -> 512kb/chunk
|
|
37
46
|
simultaneousUploads: 4,
|
|
38
47
|
testChunks: true,
|
|
39
48
|
throttleProgressCallbacks: 1,
|
|
40
|
-
method: 'octet'
|
|
49
|
+
method: 'octet',
|
|
50
|
+
forceChunkSize: false
|
|
41
51
|
}
|
|
42
52
|
};
|
package/config/index.js
CHANGED
|
@@ -39,10 +39,11 @@ module.exports = {
|
|
|
39
39
|
request_timeout: 'Request Timeout',
|
|
40
40
|
},
|
|
41
41
|
resumable_option: {
|
|
42
|
-
chunkSize:
|
|
42
|
+
chunkSize: 512 * 1000, // bytes -> 512kb/chunk
|
|
43
43
|
simultaneousUploads: 4,
|
|
44
44
|
testChunks: true,
|
|
45
45
|
throttleProgressCallbacks: 1,
|
|
46
46
|
method: 'octet',
|
|
47
|
+
forceChunkSize: false,
|
|
47
48
|
},
|
|
48
49
|
};
|
|
@@ -0,0 +1,351 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
|
|
3
|
+
/* eslint no-console: off */
|
|
4
|
+
"use strict";
|
|
5
|
+
|
|
6
|
+
function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); keys.push.apply(keys, symbols); } return keys; }
|
|
7
|
+
|
|
8
|
+
function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(source, true).forEach(function (key) { _defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(source).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }
|
|
9
|
+
|
|
10
|
+
function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
|
|
11
|
+
|
|
12
|
+
var chalk = require('chalk');
|
|
13
|
+
|
|
14
|
+
var clear = require('clear');
|
|
15
|
+
|
|
16
|
+
var figlet = require('figlet');
|
|
17
|
+
|
|
18
|
+
var program = require('commander');
|
|
19
|
+
|
|
20
|
+
var logSymbols = require('log-symbols');
|
|
21
|
+
|
|
22
|
+
var fse = require('./utils/fs-extra');
|
|
23
|
+
|
|
24
|
+
var checkUpdate = require('./utils/check-update');
|
|
25
|
+
|
|
26
|
+
var spinner = require('./utils/spinner');
|
|
27
|
+
|
|
28
|
+
var log = require('./utils/log');
|
|
29
|
+
|
|
30
|
+
var getCurrentProject = require('./utils/get-current-project');
|
|
31
|
+
|
|
32
|
+
var getOptions = require('./create/utils/get-options');
|
|
33
|
+
|
|
34
|
+
var getLoginOptions = require('./login/utils/get-options');
|
|
35
|
+
|
|
36
|
+
var getDeployOptions = require('./deploy/utils/get-options');
|
|
37
|
+
|
|
38
|
+
var getMigrateOptions = require('./migrate/utils/get-options');
|
|
39
|
+
|
|
40
|
+
var loginApp = require('./login/index');
|
|
41
|
+
|
|
42
|
+
var createApp = require('./create/index');
|
|
43
|
+
|
|
44
|
+
var startApp = require('./start/index');
|
|
45
|
+
|
|
46
|
+
var buildApp = require('./build/index');
|
|
47
|
+
|
|
48
|
+
var deployApp = require('./deploy/index');
|
|
49
|
+
|
|
50
|
+
var migrateApp = require('./migrate/index'); // const generateAssets = require('./assets/index');
|
|
51
|
+
// const server = require('./ui/server');
|
|
52
|
+
|
|
53
|
+
|
|
54
|
+
var pkg = require('./package.json');
|
|
55
|
+
|
|
56
|
+
var config = require('./config');
|
|
57
|
+
|
|
58
|
+
require('dotenv').config({
|
|
59
|
+
path: config.root_env()
|
|
60
|
+
});
|
|
61
|
+
|
|
62
|
+
var cwd = process.cwd();
|
|
63
|
+
var logger = {
|
|
64
|
+
statusStart: function statusStart(text) {
|
|
65
|
+
return spinner.start(text);
|
|
66
|
+
},
|
|
67
|
+
statusDone: function statusDone(text) {
|
|
68
|
+
return spinner.done(text);
|
|
69
|
+
},
|
|
70
|
+
statusText: function statusText(text) {
|
|
71
|
+
return spinner.text(text);
|
|
72
|
+
},
|
|
73
|
+
statusError: function statusError(text) {
|
|
74
|
+
return spinner.error(text);
|
|
75
|
+
},
|
|
76
|
+
text: function text(_text) {
|
|
77
|
+
return log.text(_text);
|
|
78
|
+
},
|
|
79
|
+
error: function error(text) {
|
|
80
|
+
return log.error(text);
|
|
81
|
+
},
|
|
82
|
+
showOnUI: function showOnUI() {}
|
|
83
|
+
};
|
|
84
|
+
/* =============================================
|
|
85
|
+
Header
|
|
86
|
+
============================================= */
|
|
87
|
+
|
|
88
|
+
clear();
|
|
89
|
+
|
|
90
|
+
if (!fse.existsSync(config.root_env())) {
|
|
91
|
+
fse.writeFileSync(config.root_env());
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
console.log(chalk.cyan(figlet.textSync('ZMP CLI', {
|
|
95
|
+
horizontalLayout: 'full',
|
|
96
|
+
verticalLayout: 'full'
|
|
97
|
+
})), chalk.cyan("Version: ".concat(pkg.version, "\n")));
|
|
98
|
+
/* =============================================
|
|
99
|
+
Commands
|
|
100
|
+
============================================= */
|
|
101
|
+
|
|
102
|
+
program.version(pkg.version).usage('<command> [options]').command('init').option('--skipUpdate', 'Skip checking for update of zmp-cli').description('Init ZMP project').action(function _callee(options) {
|
|
103
|
+
var currentProject, optsLogin, opts;
|
|
104
|
+
return regeneratorRuntime.async(function _callee$(_context) {
|
|
105
|
+
while (1) {
|
|
106
|
+
switch (_context.prev = _context.next) {
|
|
107
|
+
case 0:
|
|
108
|
+
if (options.skipUpdate) {
|
|
109
|
+
_context.next = 3;
|
|
110
|
+
break;
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
_context.next = 3;
|
|
114
|
+
return regeneratorRuntime.awrap(checkUpdate());
|
|
115
|
+
|
|
116
|
+
case 3:
|
|
117
|
+
currentProject = getCurrentProject(cwd);
|
|
118
|
+
|
|
119
|
+
if (currentProject) {
|
|
120
|
+
log.text("".concat(logSymbols.error, " ZMP project already set up in current directory"));
|
|
121
|
+
process.exit(1);
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
_context.next = 7;
|
|
125
|
+
return regeneratorRuntime.awrap(getLoginOptions());
|
|
126
|
+
|
|
127
|
+
case 7:
|
|
128
|
+
optsLogin = _context.sent;
|
|
129
|
+
_context.next = 10;
|
|
130
|
+
return regeneratorRuntime.awrap(loginApp(_objectSpread({
|
|
131
|
+
cwd: cwd
|
|
132
|
+
}, optsLogin), logger));
|
|
133
|
+
|
|
134
|
+
case 10:
|
|
135
|
+
_context.next = 12;
|
|
136
|
+
return regeneratorRuntime.awrap(getOptions());
|
|
137
|
+
|
|
138
|
+
case 12:
|
|
139
|
+
opts = _context.sent;
|
|
140
|
+
_context.next = 15;
|
|
141
|
+
return regeneratorRuntime.awrap(createApp(_objectSpread({
|
|
142
|
+
cwd: cwd
|
|
143
|
+
}, opts), logger));
|
|
144
|
+
|
|
145
|
+
case 15:
|
|
146
|
+
process.exit(0);
|
|
147
|
+
|
|
148
|
+
case 16:
|
|
149
|
+
case "end":
|
|
150
|
+
return _context.stop();
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
});
|
|
154
|
+
});
|
|
155
|
+
program.usage('<command> [options]').command('login').description('Login ZMP').action(function _callee2() {
|
|
156
|
+
var optsLogin;
|
|
157
|
+
return regeneratorRuntime.async(function _callee2$(_context2) {
|
|
158
|
+
while (1) {
|
|
159
|
+
switch (_context2.prev = _context2.next) {
|
|
160
|
+
case 0:
|
|
161
|
+
_context2.next = 2;
|
|
162
|
+
return regeneratorRuntime.awrap(getLoginOptions());
|
|
163
|
+
|
|
164
|
+
case 2:
|
|
165
|
+
optsLogin = _context2.sent;
|
|
166
|
+
_context2.next = 5;
|
|
167
|
+
return regeneratorRuntime.awrap(loginApp(_objectSpread({
|
|
168
|
+
cwd: cwd
|
|
169
|
+
}, optsLogin), logger));
|
|
170
|
+
|
|
171
|
+
case 5:
|
|
172
|
+
process.exit(0);
|
|
173
|
+
|
|
174
|
+
case 6:
|
|
175
|
+
case "end":
|
|
176
|
+
return _context2.stop();
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
});
|
|
180
|
+
});
|
|
181
|
+
program.usage('<command> [options]').command('start').option('-P, --port <n>', 'Specify server port. By default it is 3000', parseInt).option('-U, --show-mobile-ui', 'Show Mobile UI').option('-Z, --zalo-app', 'Preview on zalo').option('-D, --dev', 'Development environment').description('Start a ZMP project').action(function _callee3(options) {
|
|
182
|
+
var currentProject;
|
|
183
|
+
return regeneratorRuntime.async(function _callee3$(_context3) {
|
|
184
|
+
while (1) {
|
|
185
|
+
switch (_context3.prev = _context3.next) {
|
|
186
|
+
case 0:
|
|
187
|
+
currentProject = getCurrentProject(cwd);
|
|
188
|
+
|
|
189
|
+
if (!currentProject) {
|
|
190
|
+
log.text("".concat(logSymbols.error, " This is not ZMP project"));
|
|
191
|
+
process.exit(1);
|
|
192
|
+
}
|
|
193
|
+
|
|
194
|
+
if (options && options.showMobileUi) {
|
|
195
|
+
try {
|
|
196
|
+
console.log(require.resolve('nw'));
|
|
197
|
+
} catch (e) {
|
|
198
|
+
console.error('NW.js module is not found. Please run "npm install -g nw@sdk"');
|
|
199
|
+
process.exit(e.code);
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
|
|
203
|
+
_context3.next = 5;
|
|
204
|
+
return regeneratorRuntime.awrap(startApp({
|
|
205
|
+
cwd: cwd,
|
|
206
|
+
port: options && options.port || 3000,
|
|
207
|
+
showMobileUI: options && options.showMobileUi || false,
|
|
208
|
+
previewOnZalo: options && options.zaloApp || false
|
|
209
|
+
}, logger));
|
|
210
|
+
|
|
211
|
+
case 5:
|
|
212
|
+
process.exit(0);
|
|
213
|
+
|
|
214
|
+
case 6:
|
|
215
|
+
case "end":
|
|
216
|
+
return _context3.stop();
|
|
217
|
+
}
|
|
218
|
+
}
|
|
219
|
+
});
|
|
220
|
+
});
|
|
221
|
+
program.usage('<command> [options]').command('build').description('Build a ZMP project').action(function _callee4() {
|
|
222
|
+
var currentProject;
|
|
223
|
+
return regeneratorRuntime.async(function _callee4$(_context4) {
|
|
224
|
+
while (1) {
|
|
225
|
+
switch (_context4.prev = _context4.next) {
|
|
226
|
+
case 0:
|
|
227
|
+
currentProject = getCurrentProject(cwd);
|
|
228
|
+
|
|
229
|
+
if (!currentProject) {
|
|
230
|
+
log.text("".concat(logSymbols.error, " This is not ZMP project"));
|
|
231
|
+
process.exit(1);
|
|
232
|
+
}
|
|
233
|
+
|
|
234
|
+
_context4.next = 4;
|
|
235
|
+
return regeneratorRuntime.awrap(buildApp({
|
|
236
|
+
cwd: cwd
|
|
237
|
+
}, logger));
|
|
238
|
+
|
|
239
|
+
case 4:
|
|
240
|
+
process.exit(0);
|
|
241
|
+
|
|
242
|
+
case 5:
|
|
243
|
+
case "end":
|
|
244
|
+
return _context4.stop();
|
|
245
|
+
}
|
|
246
|
+
}
|
|
247
|
+
});
|
|
248
|
+
});
|
|
249
|
+
program.usage('<command> [options]').command('deploy').option('-D, --dev', 'Deploy in Development server').option('-P, --port <n>', 'Specify UI server port. By default it is 3001', parseInt).description('Deploy a ZMP project').action(function _callee5(options) {
|
|
250
|
+
var currentProject, opts;
|
|
251
|
+
return regeneratorRuntime.async(function _callee5$(_context5) {
|
|
252
|
+
while (1) {
|
|
253
|
+
switch (_context5.prev = _context5.next) {
|
|
254
|
+
case 0:
|
|
255
|
+
currentProject = getCurrentProject(cwd);
|
|
256
|
+
_context5.next = 3;
|
|
257
|
+
return regeneratorRuntime.awrap(getDeployOptions(currentProject));
|
|
258
|
+
|
|
259
|
+
case 3:
|
|
260
|
+
opts = _context5.sent;
|
|
261
|
+
if (opts.quit) process.exit(1);
|
|
262
|
+
_context5.next = 7;
|
|
263
|
+
return regeneratorRuntime.awrap(deployApp(_objectSpread({
|
|
264
|
+
cwd: cwd,
|
|
265
|
+
dev: options && options.dev
|
|
266
|
+
}, opts), logger));
|
|
267
|
+
|
|
268
|
+
case 7:
|
|
269
|
+
process.exit(0);
|
|
270
|
+
|
|
271
|
+
case 8:
|
|
272
|
+
case "end":
|
|
273
|
+
return _context5.stop();
|
|
274
|
+
}
|
|
275
|
+
}
|
|
276
|
+
});
|
|
277
|
+
});
|
|
278
|
+
program.usage('<command> [options]').command('migrate').action(function _callee6() {
|
|
279
|
+
var currentProject, opts;
|
|
280
|
+
return regeneratorRuntime.async(function _callee6$(_context6) {
|
|
281
|
+
while (1) {
|
|
282
|
+
switch (_context6.prev = _context6.next) {
|
|
283
|
+
case 0:
|
|
284
|
+
currentProject = getCurrentProject(cwd);
|
|
285
|
+
|
|
286
|
+
if (!currentProject) {
|
|
287
|
+
logger.text("".concat(logSymbols.error, " This is not ZMP project"));
|
|
288
|
+
process.exit(1);
|
|
289
|
+
}
|
|
290
|
+
|
|
291
|
+
_context6.next = 4;
|
|
292
|
+
return regeneratorRuntime.awrap(getMigrateOptions());
|
|
293
|
+
|
|
294
|
+
case 4:
|
|
295
|
+
opts = _context6.sent;
|
|
296
|
+
_context6.next = 7;
|
|
297
|
+
return regeneratorRuntime.awrap(migrateApp(_objectSpread({
|
|
298
|
+
cwd: cwd
|
|
299
|
+
}, opts, {}, currentProject), logger));
|
|
300
|
+
|
|
301
|
+
case 7:
|
|
302
|
+
process.exit(0);
|
|
303
|
+
|
|
304
|
+
case 8:
|
|
305
|
+
case "end":
|
|
306
|
+
return _context6.stop();
|
|
307
|
+
}
|
|
308
|
+
}
|
|
309
|
+
});
|
|
310
|
+
}); // program
|
|
311
|
+
// .command('assets')
|
|
312
|
+
// .alias('generate-assets')
|
|
313
|
+
// .option('--skipUpdate', 'Skip checking for update of zmp-cli')
|
|
314
|
+
// .option('--ui', 'Launch assets generation UI')
|
|
315
|
+
// .option(
|
|
316
|
+
// '-P, --port <n>',
|
|
317
|
+
// 'Specify UI server port. By default it is 3001',
|
|
318
|
+
// parseInt
|
|
319
|
+
// )
|
|
320
|
+
// .description('Generate ZMP app icons and splash screens')
|
|
321
|
+
// .action(async (options) => {
|
|
322
|
+
// // Check update
|
|
323
|
+
// if (options.skipUpdate === undefined) {
|
|
324
|
+
// await checkUpdate();
|
|
325
|
+
// }
|
|
326
|
+
// const currentProject = getCurrentProject(cwd);
|
|
327
|
+
// if (!currentProject) {
|
|
328
|
+
// log.text(
|
|
329
|
+
// `${logSymbols.error} ZMP project not found in current directory`
|
|
330
|
+
// );
|
|
331
|
+
// process.exit(1);
|
|
332
|
+
// }
|
|
333
|
+
// if (options.ui) {
|
|
334
|
+
// spinner.start('Launching ZMP UI server');
|
|
335
|
+
// server('/assets/', options.port);
|
|
336
|
+
// spinner.end('Launching ZMP UI server');
|
|
337
|
+
// } else {
|
|
338
|
+
// await generateAssets({}, currentProject, logger);
|
|
339
|
+
// process.exit(0);
|
|
340
|
+
// }
|
|
341
|
+
// });
|
|
342
|
+
|
|
343
|
+
program.on('command:*', function (cmd) {
|
|
344
|
+
program.outputHelp();
|
|
345
|
+
log.text("\n Unknown command ".concat(cmd));
|
|
346
|
+
});
|
|
347
|
+
program.parse(process.argv);
|
|
348
|
+
|
|
349
|
+
if (!program.args.length) {
|
|
350
|
+
program.outputHelp();
|
|
351
|
+
}
|
package/index.js
CHANGED