react-native-update-cli 1.30.4 → 1.31.0
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/cli.json +3 -1
- package/lib/api.js +177 -186
- package/lib/app.js +136 -114
- package/lib/bundle.js +535 -559
- package/lib/index.js +46 -49
- package/lib/package.js +132 -136
- package/lib/user.js +43 -41
- package/lib/utils/app-info-parser/apk.js +72 -71
- package/lib/utils/app-info-parser/index.js +28 -30
- package/lib/utils/app-info-parser/ipa.js +72 -80
- package/lib/utils/app-info-parser/resource-finder.js +286 -421
- package/lib/utils/app-info-parser/utils.js +106 -120
- package/lib/utils/app-info-parser/xml-parser/binary.js +539 -637
- package/lib/utils/app-info-parser/xml-parser/manifest.js +193 -215
- package/lib/utils/app-info-parser/zip.js +40 -40
- package/lib/utils/index.js +154 -149
- package/lib/versions.js +226 -178
- package/package.json +10 -9
- package/src/api.js +6 -3
- package/src/bundle.js +11 -10
- package/src/versions.js +80 -16
package/cli.json
CHANGED
package/lib/api.js
CHANGED
|
@@ -1,210 +1,201 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
1
|
+
"use strict";
|
|
3
2
|
Object.defineProperty(exports, "__esModule", {
|
|
4
|
-
|
|
3
|
+
value: true
|
|
5
4
|
});
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
5
|
+
function _export(target, all) {
|
|
6
|
+
for(var name in all)Object.defineProperty(target, name, {
|
|
7
|
+
enumerable: true,
|
|
8
|
+
get: all[name]
|
|
9
|
+
});
|
|
10
|
+
}
|
|
11
|
+
_export(exports, {
|
|
12
|
+
closeSession: function() {
|
|
13
|
+
return closeSession;
|
|
14
|
+
},
|
|
15
|
+
doDelete: function() {
|
|
16
|
+
return doDelete;
|
|
17
|
+
},
|
|
18
|
+
get: function() {
|
|
19
|
+
return get;
|
|
20
|
+
},
|
|
21
|
+
getSession: function() {
|
|
22
|
+
return getSession;
|
|
23
|
+
},
|
|
24
|
+
loadSession: function() {
|
|
25
|
+
return loadSession;
|
|
26
|
+
},
|
|
27
|
+
post: function() {
|
|
28
|
+
return post;
|
|
29
|
+
},
|
|
30
|
+
put: function() {
|
|
31
|
+
return put;
|
|
32
|
+
},
|
|
33
|
+
replaceSession: function() {
|
|
34
|
+
return replaceSession;
|
|
35
|
+
},
|
|
36
|
+
saveSession: function() {
|
|
37
|
+
return saveSession;
|
|
38
|
+
},
|
|
39
|
+
uploadFile: function() {
|
|
40
|
+
return uploadFile;
|
|
41
|
+
}
|
|
42
|
+
});
|
|
43
|
+
const _nodefetch = /*#__PURE__*/ _interop_require_default(require("node-fetch"));
|
|
44
|
+
const _fs = /*#__PURE__*/ _interop_require_default(require("fs"));
|
|
45
|
+
const _request = /*#__PURE__*/ _interop_require_default(require("request"));
|
|
46
|
+
const _progress = /*#__PURE__*/ _interop_require_default(require("progress"));
|
|
47
|
+
const _packagejson = /*#__PURE__*/ _interop_require_default(require("../package.json"));
|
|
48
|
+
const _tcpping = /*#__PURE__*/ _interop_require_default(require("tcp-ping"));
|
|
49
|
+
const _util = /*#__PURE__*/ _interop_require_default(require("util"));
|
|
50
|
+
const _path = /*#__PURE__*/ _interop_require_default(require("path"));
|
|
51
|
+
const _filesizeparser = /*#__PURE__*/ _interop_require_default(require("filesize-parser"));
|
|
52
|
+
const _utils = require("./utils");
|
|
53
|
+
function _interop_require_default(obj) {
|
|
54
|
+
return obj && obj.__esModule ? obj : {
|
|
55
|
+
default: obj
|
|
56
|
+
};
|
|
57
|
+
}
|
|
49
58
|
const defaultEndpoint = 'https://update.reactnative.cn/api';
|
|
50
59
|
let host = process.env.PUSHY_REGISTRY || defaultEndpoint;
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
const tcpPing = _util2.default.promisify(_tcpPing2.default.ping);
|
|
54
|
-
|
|
60
|
+
const tcpPing = _util.default.promisify(_tcpping.default.ping);
|
|
55
61
|
let session = undefined;
|
|
56
62
|
let savedSession = undefined;
|
|
57
|
-
|
|
58
|
-
const
|
|
59
|
-
|
|
60
|
-
const getSession = exports.getSession = function () {
|
|
61
|
-
return session;
|
|
63
|
+
const userAgent = `react-native-update-cli/${_packagejson.default.version}`;
|
|
64
|
+
const getSession = function() {
|
|
65
|
+
return session;
|
|
62
66
|
};
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
session = newSession;
|
|
67
|
+
const replaceSession = function(newSession) {
|
|
68
|
+
session = newSession;
|
|
66
69
|
};
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
70
|
+
const loadSession = async function() {
|
|
71
|
+
if (_fs.default.existsSync('.update')) {
|
|
72
|
+
try {
|
|
73
|
+
replaceSession(JSON.parse(_fs.default.readFileSync('.update', 'utf8')));
|
|
74
|
+
savedSession = session;
|
|
75
|
+
} catch (e) {
|
|
76
|
+
console.error('Failed to parse file `.update`. Try to remove it manually.');
|
|
77
|
+
throw e;
|
|
78
|
+
}
|
|
76
79
|
}
|
|
77
|
-
}
|
|
78
80
|
};
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
}
|
|
81
|
+
const saveSession = function() {
|
|
82
|
+
// Only save on change.
|
|
83
|
+
if (session !== savedSession) {
|
|
84
|
+
const current = session;
|
|
85
|
+
const data = JSON.stringify(current, null, 4);
|
|
86
|
+
_fs.default.writeFileSync('.update', data, 'utf8');
|
|
87
|
+
savedSession = current;
|
|
88
|
+
}
|
|
88
89
|
};
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
host = process.env.PUSHY_REGISTRY || defaultEndpoint;
|
|
90
|
+
const closeSession = function() {
|
|
91
|
+
if (_fs.default.existsSync('.update')) {
|
|
92
|
+
_fs.default.unlinkSync('.update');
|
|
93
|
+
savedSession = undefined;
|
|
94
|
+
}
|
|
95
|
+
session = undefined;
|
|
96
|
+
host = process.env.PUSHY_REGISTRY || defaultEndpoint;
|
|
97
97
|
};
|
|
98
|
-
|
|
99
98
|
async function query(url, options) {
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
99
|
+
const resp = await (0, _nodefetch.default)(url, options);
|
|
100
|
+
const text = await resp.text();
|
|
101
|
+
let json;
|
|
102
|
+
try {
|
|
103
|
+
json = JSON.parse(text);
|
|
104
|
+
} catch (e) {
|
|
105
|
+
if (resp.statusText.includes('Unauthorized')) {
|
|
106
|
+
throw new Error('登录信息已过期,请使用 pushy login 命令重新登录');
|
|
107
|
+
} else {
|
|
108
|
+
throw new Error(`Server error: ${resp.statusText}`);
|
|
109
|
+
}
|
|
110
110
|
}
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
}
|
|
118
|
-
return json;
|
|
111
|
+
if (resp.status !== 200) {
|
|
112
|
+
throw Object.assign(new Error(json.message || json.error || resp.statusText), {
|
|
113
|
+
status: resp.status
|
|
114
|
+
});
|
|
115
|
+
}
|
|
116
|
+
return json;
|
|
119
117
|
}
|
|
120
|
-
|
|
121
118
|
function queryWithoutBody(method) {
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
119
|
+
return function(api) {
|
|
120
|
+
return query(host + api, {
|
|
121
|
+
method,
|
|
122
|
+
headers: {
|
|
123
|
+
'User-Agent': userAgent,
|
|
124
|
+
'X-AccessToken': session ? session.token : ''
|
|
125
|
+
}
|
|
126
|
+
});
|
|
127
|
+
};
|
|
131
128
|
}
|
|
132
|
-
|
|
133
129
|
function queryWithBody(method) {
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
130
|
+
return function(api, body) {
|
|
131
|
+
return query(host + api, {
|
|
132
|
+
method,
|
|
133
|
+
headers: {
|
|
134
|
+
'User-Agent': userAgent,
|
|
135
|
+
'Content-Type': 'application/json',
|
|
136
|
+
'X-AccessToken': session ? session.token : ''
|
|
137
|
+
},
|
|
138
|
+
body: JSON.stringify(body)
|
|
139
|
+
});
|
|
140
|
+
};
|
|
145
141
|
}
|
|
146
|
-
|
|
147
|
-
const
|
|
148
|
-
const
|
|
149
|
-
const
|
|
150
|
-
const doDelete = exports.doDelete = queryWithBody('DELETE');
|
|
151
|
-
|
|
142
|
+
const get = queryWithoutBody('GET');
|
|
143
|
+
const post = queryWithBody('POST');
|
|
144
|
+
const put = queryWithBody('PUT');
|
|
145
|
+
const doDelete = queryWithBody('DELETE');
|
|
152
146
|
async function uploadFile(fn, key) {
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
}
|
|
147
|
+
const { url, backupUrl, formData, maxSize } = await post('/upload', {
|
|
148
|
+
ext: _path.default.extname(fn)
|
|
149
|
+
});
|
|
150
|
+
let realUrl = url;
|
|
151
|
+
if (backupUrl) {
|
|
152
|
+
if (global.USE_ACC_OSS) {
|
|
153
|
+
realUrl = backupUrl;
|
|
154
|
+
} else {
|
|
155
|
+
const pingResult = await tcpPing({
|
|
156
|
+
address: url.replace('https://', ''),
|
|
157
|
+
attempts: 4,
|
|
158
|
+
timeout: 1000
|
|
159
|
+
});
|
|
160
|
+
// console.log({pingResult});
|
|
161
|
+
if (isNaN(pingResult.avg) || pingResult.avg > 150) {
|
|
162
|
+
realUrl = backupUrl;
|
|
163
|
+
}
|
|
164
|
+
}
|
|
172
165
|
// console.log({realUrl});
|
|
173
|
-
}
|
|
174
|
-
|
|
175
|
-
const fileSize = _fs2.default.statSync(fn).size;
|
|
176
|
-
if (maxSize && fileSize > (0, _filesizeParser2.default)(maxSize)) {
|
|
177
|
-
throw new Error(`此文件大小${(fileSize / 1048576).toFixed(1)}m, 超出当前额度${maxSize}。您可以考虑升级付费业务以提升此额度。详情请访问: ${_utils.pricingPageUrl}`);
|
|
178
|
-
}
|
|
179
|
-
|
|
180
|
-
const bar = new _progress2.default(' 上传中 [:bar] :percent :etas', {
|
|
181
|
-
complete: '=',
|
|
182
|
-
incomplete: ' ',
|
|
183
|
-
total: fileSize
|
|
184
|
-
});
|
|
185
|
-
|
|
186
|
-
const info = await new Promise((resolve, reject) => {
|
|
187
|
-
if (key) {
|
|
188
|
-
formData.key = key;
|
|
189
166
|
}
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
167
|
+
const fileSize = _fs.default.statSync(fn).size;
|
|
168
|
+
if (maxSize && fileSize > (0, _filesizeparser.default)(maxSize)) {
|
|
169
|
+
throw new Error(`此文件大小${(fileSize / 1048576).toFixed(1)}m, 超出当前额度${maxSize}。您可以考虑升级付费业务以提升此额度。详情请访问: ${_utils.pricingPageUrl}`);
|
|
170
|
+
}
|
|
171
|
+
const bar = new _progress.default(' 上传中 [:bar] :percent :etas', {
|
|
172
|
+
complete: '=',
|
|
173
|
+
incomplete: ' ',
|
|
174
|
+
total: fileSize
|
|
194
175
|
});
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
176
|
+
const info = await new Promise((resolve, reject)=>{
|
|
177
|
+
if (key) {
|
|
178
|
+
formData.key = key;
|
|
179
|
+
}
|
|
180
|
+
formData.file = _fs.default.createReadStream(fn);
|
|
181
|
+
formData.file.on('data', function(data) {
|
|
182
|
+
bar.tick(data.length);
|
|
183
|
+
});
|
|
184
|
+
_request.default.post(realUrl, {
|
|
185
|
+
formData
|
|
186
|
+
}, (err, resp, body)=>{
|
|
187
|
+
if (err) {
|
|
188
|
+
return reject(err);
|
|
189
|
+
}
|
|
190
|
+
if (resp.statusCode > 299) {
|
|
191
|
+
return reject(Object.assign(new Error(body), {
|
|
192
|
+
status: resp.statusCode
|
|
193
|
+
}));
|
|
194
|
+
}
|
|
195
|
+
resolve({
|
|
196
|
+
hash: formData.key
|
|
197
|
+
});
|
|
198
|
+
});
|
|
207
199
|
});
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
}
|
|
200
|
+
return info;
|
|
201
|
+
}
|