react-native-update-cli 1.26.0 → 1.27.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 +8 -14
- package/lib/api.js +1 -1
- package/lib/bundle.js +11 -9
- package/lib/index.js +0 -0
- package/lib/package.js +4 -8
- package/lib/versions.js +36 -0
- package/package.json +3 -2
- package/src/api.js +1 -1
- package/src/bundle.js +14 -10
- package/src/package.js +2 -6
- package/src/versions.js +39 -0
package/cli.json
CHANGED
|
@@ -34,20 +34,8 @@
|
|
|
34
34
|
}
|
|
35
35
|
},
|
|
36
36
|
|
|
37
|
-
"uploadIpa": {
|
|
38
|
-
|
|
39
|
-
"note": {
|
|
40
|
-
"hasValue": true
|
|
41
|
-
}
|
|
42
|
-
}
|
|
43
|
-
},
|
|
44
|
-
"uploadApk": {
|
|
45
|
-
"options": {
|
|
46
|
-
"note": {
|
|
47
|
-
"hasValue": true
|
|
48
|
-
}
|
|
49
|
-
}
|
|
50
|
-
},
|
|
37
|
+
"uploadIpa": {},
|
|
38
|
+
"uploadApk": {},
|
|
51
39
|
"parseIpa": {},
|
|
52
40
|
"parseApk": {},
|
|
53
41
|
"packages": {
|
|
@@ -96,6 +84,12 @@
|
|
|
96
84
|
|
|
97
85
|
"packageVersion": {
|
|
98
86
|
"hasValue": true
|
|
87
|
+
},
|
|
88
|
+
"minPackageVersion": {
|
|
89
|
+
"hasValue": true
|
|
90
|
+
},
|
|
91
|
+
"maxPackageVersion": {
|
|
92
|
+
"hasValue": true
|
|
99
93
|
}
|
|
100
94
|
}
|
|
101
95
|
},
|
package/lib/api.js
CHANGED
|
@@ -46,7 +46,7 @@ var _utils = require('./utils');
|
|
|
46
46
|
|
|
47
47
|
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
48
48
|
|
|
49
|
-
const defaultEndpoint = 'https://update.
|
|
49
|
+
const defaultEndpoint = 'https://update.reactnative.cn/api';
|
|
50
50
|
let host = process.env.PUSHY_REGISTRY || defaultEndpoint;
|
|
51
51
|
|
|
52
52
|
|
package/lib/bundle.js
CHANGED
|
@@ -51,7 +51,7 @@ async function runReactNativeBundleCommand(bundleName, development, entryFile, o
|
|
|
51
51
|
if (platform === 'android') {
|
|
52
52
|
gradleConfig = await checkGradleConfig();
|
|
53
53
|
if (gradleConfig.crunchPngs !== false) {
|
|
54
|
-
console.warn('android
|
|
54
|
+
console.warn('android的crunchPngs选项似乎尚未禁用(如已禁用则请忽略此提示),这可能导致热更包体积异常增大,具体请参考 https://pushy.reactnative.cn/docs/getting-started.html#%E7%A6%81%E7%94%A8-android-%E7%9A%84-crunch-%E4%BC%98%E5%8C%96 \n');
|
|
55
55
|
}
|
|
56
56
|
}
|
|
57
57
|
|
|
@@ -68,16 +68,18 @@ async function runReactNativeBundleCommand(bundleName, development, entryFile, o
|
|
|
68
68
|
let cliPath = require.resolve('react-native/local-cli/cli.js', {
|
|
69
69
|
paths: [process.cwd()]
|
|
70
70
|
});
|
|
71
|
-
let isExpo = false;
|
|
72
71
|
try {
|
|
73
|
-
|
|
72
|
+
require.resolve('expo-router', {
|
|
73
|
+
paths: [process.cwd()]
|
|
74
|
+
});
|
|
75
|
+
|
|
76
|
+
console.log(`expo-router detected, will use @expo/cli to bundle.\n`);
|
|
77
|
+
// if using expo-router, use expo-cli
|
|
74
78
|
cliPath = require.resolve('@expo/cli', {
|
|
75
79
|
paths: [process.cwd()]
|
|
76
80
|
});
|
|
77
|
-
isExpo = true;
|
|
78
|
-
console.log(`expo detected, will use @expo/cli to bundle.\n`);
|
|
79
81
|
} catch (e) {}
|
|
80
|
-
const bundleCommand =
|
|
82
|
+
const bundleCommand = cliPath.includes('@expo/cli') ? 'export:embed' : 'bundle';
|
|
81
83
|
|
|
82
84
|
Array.prototype.push.apply(reactNativeBundleArgs, [cliPath, bundleCommand, '--assets-dest', outputFolder, '--bundle-output', _path2.default.join(outputFolder, bundleName), '--dev', development, '--entry-file', entryFile, '--platform', platform, '--reset-cache']);
|
|
83
85
|
|
|
@@ -175,9 +177,9 @@ async function compileHermesByteCode(bundleName, outputFolder, sourcemapOutput)
|
|
|
175
177
|
const hermesCommand = `${hermesPath}/hermesc`;
|
|
176
178
|
|
|
177
179
|
const args = ['-emit-binary', '-out', _path2.default.join(outputFolder, bundleName), _path2.default.join(outputFolder, bundleName), '-O'];
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
180
|
+
if (sourcemapOutput) {
|
|
181
|
+
args.push('-output-source-map');
|
|
182
|
+
}
|
|
181
183
|
console.log('Running hermesc: ' + hermesCommand + ' ' + args.join(' ') + '\n');
|
|
182
184
|
(0, _child_process.spawnSync)(hermesCommand, args, {
|
|
183
185
|
stdio: 'ignore'
|
package/lib/index.js
CHANGED
|
File without changes
|
package/lib/package.js
CHANGED
|
@@ -61,12 +61,11 @@ async function choosePackage(appId) {
|
|
|
61
61
|
}
|
|
62
62
|
|
|
63
63
|
const commands = exports.commands = {
|
|
64
|
-
uploadIpa: async function ({ args
|
|
64
|
+
uploadIpa: async function ({ args }) {
|
|
65
65
|
const fn = args[0];
|
|
66
66
|
if (!fn || !fn.endsWith('.ipa')) {
|
|
67
67
|
throw new Error('使用方法: pushy uploadIpa ipa后缀文件');
|
|
68
68
|
}
|
|
69
|
-
const { note = '' } = options;
|
|
70
69
|
const {
|
|
71
70
|
versionName,
|
|
72
71
|
buildTime,
|
|
@@ -88,18 +87,16 @@ const commands = exports.commands = {
|
|
|
88
87
|
const { id } = await (0, _api.post)(`/app/${appId}/package/create`, {
|
|
89
88
|
name: versionName,
|
|
90
89
|
hash,
|
|
91
|
-
buildTime
|
|
92
|
-
note
|
|
90
|
+
buildTime
|
|
93
91
|
});
|
|
94
92
|
(0, _utils.saveToLocal)(fn, `${appId}/package/${id}.ipa`);
|
|
95
93
|
console.log(`已成功上传ipa原生包(id: ${id}, version: ${versionName}, buildTime: ${buildTime})`);
|
|
96
94
|
},
|
|
97
|
-
uploadApk: async function ({ args
|
|
95
|
+
uploadApk: async function ({ args }) {
|
|
98
96
|
const fn = args[0];
|
|
99
97
|
if (!fn || !fn.endsWith('.apk')) {
|
|
100
98
|
throw new Error('使用方法: pushy uploadApk apk后缀文件');
|
|
101
99
|
}
|
|
102
|
-
const { note = '' } = options;
|
|
103
100
|
const {
|
|
104
101
|
versionName,
|
|
105
102
|
buildTime,
|
|
@@ -121,8 +118,7 @@ const commands = exports.commands = {
|
|
|
121
118
|
const { id } = await (0, _api.post)(`/app/${appId}/package/create`, {
|
|
122
119
|
name: versionName,
|
|
123
120
|
hash,
|
|
124
|
-
buildTime
|
|
125
|
-
note
|
|
121
|
+
buildTime
|
|
126
122
|
});
|
|
127
123
|
(0, _utils.saveToLocal)(fn, `${appId}/package/${id}.apk`);
|
|
128
124
|
console.log(`已成功上传apk原生包(id: ${id}, version: ${versionName}, buildTime: ${buildTime})`);
|
package/lib/versions.js
CHANGED
|
@@ -13,6 +13,8 @@ var _app = require('./app');
|
|
|
13
13
|
|
|
14
14
|
var _package = require('./package');
|
|
15
15
|
|
|
16
|
+
var _compareVersions = require('compare-versions');
|
|
17
|
+
|
|
16
18
|
async function showVersion(appId, offset) {
|
|
17
19
|
const { data, count } = await (0, _api.get)(`/app/${appId}/version/list`);
|
|
18
20
|
console.log(`Offset ${offset}`);
|
|
@@ -120,6 +122,8 @@ const commands = exports.commands = {
|
|
|
120
122
|
|
|
121
123
|
let pkgId;
|
|
122
124
|
let pkgVersion = options.packageVersion;
|
|
125
|
+
let minPkgVersion = options.minPackageVersion;
|
|
126
|
+
let maxPkgVersion = options.maxPackageVersion;
|
|
123
127
|
if (pkgVersion) {
|
|
124
128
|
pkgVersion = pkgVersion.trim();
|
|
125
129
|
const { data } = await (0, _api.get)(`/app/${appId}/package/list?limit=1000`);
|
|
@@ -130,6 +134,38 @@ const commands = exports.commands = {
|
|
|
130
134
|
throw new Error(`未查询到匹配原生版本:${pkgVersion}`);
|
|
131
135
|
}
|
|
132
136
|
}
|
|
137
|
+
if (minPkgVersion) {
|
|
138
|
+
minPkgVersion = String(minPkgVersion).trim();
|
|
139
|
+
const { data } = await (0, _api.get)(`/app/${appId}/package/list?limit=1000`);
|
|
140
|
+
const pkgs = data.filter(d => (0, _compareVersions.compare)(d.name, minPkgVersion, '>='));
|
|
141
|
+
if (pkgs.length === 0) {
|
|
142
|
+
throw new Error(`未查询到 >= ${minPkgVersion} 的原生版本`);
|
|
143
|
+
}
|
|
144
|
+
for (const pkg of pkgs) {
|
|
145
|
+
await (0, _api.put)(`/app/${appId}/package/${pkg.id}`, {
|
|
146
|
+
versionId
|
|
147
|
+
});
|
|
148
|
+
console.log(`已将版本 ${versionId} 绑定到原生版本 ${pkg.name}`);
|
|
149
|
+
}
|
|
150
|
+
console.log(`操作完成,共已绑定 ${pkgs.length} 个原生版本`);
|
|
151
|
+
return;
|
|
152
|
+
}
|
|
153
|
+
if (maxPkgVersion) {
|
|
154
|
+
maxPkgVersion = String(maxPkgVersion).trim();
|
|
155
|
+
const { data } = await (0, _api.get)(`/app/${appId}/package/list?limit=1000`);
|
|
156
|
+
const pkgs = data.filter(d => (0, _compareVersions.compare)(d.name, maxPkgVersion, '<='));
|
|
157
|
+
if (pkgs.length === 0) {
|
|
158
|
+
throw new Error(`未查询到 <= ${maxPkgVersion} 的原生版本`);
|
|
159
|
+
}
|
|
160
|
+
for (const pkg of pkgs) {
|
|
161
|
+
await (0, _api.put)(`/app/${appId}/package/${pkg.id}`, {
|
|
162
|
+
versionId
|
|
163
|
+
});
|
|
164
|
+
console.log(`已将版本 ${versionId} 绑定到原生版本 ${pkg.name}`);
|
|
165
|
+
}
|
|
166
|
+
console.log(`操作完成,共已绑定 ${pkgs.length} 个原生版本`);
|
|
167
|
+
return;
|
|
168
|
+
}
|
|
133
169
|
if (!pkgId) {
|
|
134
170
|
pkgId = options.packageId || (await (0, _package.choosePackage)(appId)).id;
|
|
135
171
|
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "react-native-update-cli",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.27.0",
|
|
4
4
|
"description": "Command tools for javaScript updater with `pushy` service for react native apps.",
|
|
5
5
|
"main": "index.js",
|
|
6
6
|
"bin": {
|
|
@@ -12,7 +12,7 @@
|
|
|
12
12
|
"cli.json"
|
|
13
13
|
],
|
|
14
14
|
"scripts": {
|
|
15
|
-
"prepublish": "babel src --out-dir lib"
|
|
15
|
+
"prepublish": "babel src --out-dir lib && chmod +x lib/index.js"
|
|
16
16
|
},
|
|
17
17
|
"repository": {
|
|
18
18
|
"type": "git",
|
|
@@ -36,6 +36,7 @@
|
|
|
36
36
|
"cgbi-to-png": "^1.0.7",
|
|
37
37
|
"cli-arguments": "^0.2.1",
|
|
38
38
|
"commander": "^7.2.0",
|
|
39
|
+
"compare-versions": "^6.1.1",
|
|
39
40
|
"filesize-parser": "^1.5.0",
|
|
40
41
|
"fs-extra": "8",
|
|
41
42
|
"gradle-to-js": "^2.0.1",
|
package/src/api.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import fetch from 'node-fetch';
|
|
2
|
-
const defaultEndpoint = 'https://update.
|
|
2
|
+
const defaultEndpoint = 'https://update.reactnative.cn/api';
|
|
3
3
|
let host = process.env.PUSHY_REGISTRY || defaultEndpoint;
|
|
4
4
|
import fs from 'fs';
|
|
5
5
|
import request from 'request';
|
package/src/bundle.js
CHANGED
|
@@ -33,7 +33,7 @@ async function runReactNativeBundleCommand(
|
|
|
33
33
|
gradleConfig = await checkGradleConfig();
|
|
34
34
|
if (gradleConfig.crunchPngs !== false) {
|
|
35
35
|
console.warn(
|
|
36
|
-
'android
|
|
36
|
+
'android的crunchPngs选项似乎尚未禁用(如已禁用则请忽略此提示),这可能导致热更包体积异常增大,具体请参考 https://pushy.reactnative.cn/docs/getting-started.html#%E7%A6%81%E7%94%A8-android-%E7%9A%84-crunch-%E4%BC%98%E5%8C%96 \n',
|
|
37
37
|
);
|
|
38
38
|
}
|
|
39
39
|
}
|
|
@@ -54,16 +54,20 @@ async function runReactNativeBundleCommand(
|
|
|
54
54
|
let cliPath = require.resolve('react-native/local-cli/cli.js', {
|
|
55
55
|
paths: [process.cwd()],
|
|
56
56
|
});
|
|
57
|
-
let isExpo = false;
|
|
58
57
|
try {
|
|
59
|
-
|
|
58
|
+
require.resolve('expo-router', {
|
|
59
|
+
paths: [process.cwd()],
|
|
60
|
+
});
|
|
61
|
+
|
|
62
|
+
console.log(`expo-router detected, will use @expo/cli to bundle.\n`);
|
|
63
|
+
// if using expo-router, use expo-cli
|
|
60
64
|
cliPath = require.resolve('@expo/cli', {
|
|
61
65
|
paths: [process.cwd()],
|
|
62
66
|
});
|
|
63
|
-
isExpo = true;
|
|
64
|
-
console.log(`expo detected, will use @expo/cli to bundle.\n`);
|
|
65
67
|
} catch (e) {}
|
|
66
|
-
const bundleCommand =
|
|
68
|
+
const bundleCommand = cliPath.includes('@expo/cli')
|
|
69
|
+
? 'export:embed'
|
|
70
|
+
: 'bundle';
|
|
67
71
|
|
|
68
72
|
Array.prototype.push.apply(reactNativeBundleArgs, [
|
|
69
73
|
cliPath,
|
|
@@ -200,7 +204,7 @@ async function compileHermesByteCode(
|
|
|
200
204
|
}
|
|
201
205
|
|
|
202
206
|
const hermesCommand = `${hermesPath}/hermesc`;
|
|
203
|
-
|
|
207
|
+
|
|
204
208
|
const args = [
|
|
205
209
|
'-emit-binary',
|
|
206
210
|
'-out',
|
|
@@ -208,9 +212,9 @@ async function compileHermesByteCode(
|
|
|
208
212
|
path.join(outputFolder, bundleName),
|
|
209
213
|
'-O',
|
|
210
214
|
];
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
215
|
+
if (sourcemapOutput) {
|
|
216
|
+
args.push('-output-source-map');
|
|
217
|
+
}
|
|
214
218
|
console.log(
|
|
215
219
|
'Running hermesc: ' + hermesCommand + ' ' + args.join(' ') + '\n',
|
|
216
220
|
);
|
package/src/package.js
CHANGED
|
@@ -48,12 +48,11 @@ export async function choosePackage(appId) {
|
|
|
48
48
|
}
|
|
49
49
|
|
|
50
50
|
export const commands = {
|
|
51
|
-
uploadIpa: async function ({ args
|
|
51
|
+
uploadIpa: async function ({ args }) {
|
|
52
52
|
const fn = args[0];
|
|
53
53
|
if (!fn || !fn.endsWith('.ipa')) {
|
|
54
54
|
throw new Error('使用方法: pushy uploadIpa ipa后缀文件');
|
|
55
55
|
}
|
|
56
|
-
const { note = '' } = options;
|
|
57
56
|
const {
|
|
58
57
|
versionName,
|
|
59
58
|
buildTime,
|
|
@@ -80,19 +79,17 @@ export const commands = {
|
|
|
80
79
|
name: versionName,
|
|
81
80
|
hash,
|
|
82
81
|
buildTime,
|
|
83
|
-
note,
|
|
84
82
|
});
|
|
85
83
|
saveToLocal(fn, `${appId}/package/${id}.ipa`);
|
|
86
84
|
console.log(
|
|
87
85
|
`已成功上传ipa原生包(id: ${id}, version: ${versionName}, buildTime: ${buildTime})`,
|
|
88
86
|
);
|
|
89
87
|
},
|
|
90
|
-
uploadApk: async function ({ args
|
|
88
|
+
uploadApk: async function ({ args }) {
|
|
91
89
|
const fn = args[0];
|
|
92
90
|
if (!fn || !fn.endsWith('.apk')) {
|
|
93
91
|
throw new Error('使用方法: pushy uploadApk apk后缀文件');
|
|
94
92
|
}
|
|
95
|
-
const { note = '' } = options;
|
|
96
93
|
const {
|
|
97
94
|
versionName,
|
|
98
95
|
buildTime,
|
|
@@ -119,7 +116,6 @@ export const commands = {
|
|
|
119
116
|
name: versionName,
|
|
120
117
|
hash,
|
|
121
118
|
buildTime,
|
|
122
|
-
note,
|
|
123
119
|
});
|
|
124
120
|
saveToLocal(fn, `${appId}/package/${id}.apk`);
|
|
125
121
|
console.log(
|
package/src/versions.js
CHANGED
|
@@ -3,6 +3,7 @@ import { question, saveToLocal } from './utils';
|
|
|
3
3
|
|
|
4
4
|
import { checkPlatform, getSelectedApp } from './app';
|
|
5
5
|
import { choosePackage } from './package';
|
|
6
|
+
import { compare } from 'compare-versions';
|
|
6
7
|
|
|
7
8
|
async function showVersion(appId, offset) {
|
|
8
9
|
const { data, count } = await get(`/app/${appId}/version/list`);
|
|
@@ -127,6 +128,8 @@ export const commands = {
|
|
|
127
128
|
|
|
128
129
|
let pkgId;
|
|
129
130
|
let pkgVersion = options.packageVersion;
|
|
131
|
+
let minPkgVersion = options.minPackageVersion;
|
|
132
|
+
let maxPkgVersion = options.maxPackageVersion;
|
|
130
133
|
if (pkgVersion) {
|
|
131
134
|
pkgVersion = pkgVersion.trim();
|
|
132
135
|
const { data } = await get(`/app/${appId}/package/list?limit=1000`);
|
|
@@ -137,6 +140,42 @@ export const commands = {
|
|
|
137
140
|
throw new Error(`未查询到匹配原生版本:${pkgVersion}`);
|
|
138
141
|
}
|
|
139
142
|
}
|
|
143
|
+
if (minPkgVersion) {
|
|
144
|
+
minPkgVersion = String(minPkgVersion).trim();
|
|
145
|
+
const { data } = await get(`/app/${appId}/package/list?limit=1000`);
|
|
146
|
+
const pkgs = data.filter((d) => compare(d.name, minPkgVersion, '>='));
|
|
147
|
+
if (pkgs.length === 0) {
|
|
148
|
+
throw new Error(
|
|
149
|
+
`未查询到 >= ${minPkgVersion} 的原生版本`,
|
|
150
|
+
);
|
|
151
|
+
}
|
|
152
|
+
for (const pkg of pkgs) {
|
|
153
|
+
await put(`/app/${appId}/package/${pkg.id}`, {
|
|
154
|
+
versionId,
|
|
155
|
+
});
|
|
156
|
+
console.log(`已将版本 ${versionId} 绑定到原生版本 ${pkg.name}`);
|
|
157
|
+
}
|
|
158
|
+
console.log(`操作完成,共已绑定 ${pkgs.length} 个原生版本`);
|
|
159
|
+
return;
|
|
160
|
+
}
|
|
161
|
+
if (maxPkgVersion) {
|
|
162
|
+
maxPkgVersion = String(maxPkgVersion).trim();
|
|
163
|
+
const { data } = await get(`/app/${appId}/package/list?limit=1000`);
|
|
164
|
+
const pkgs = data.filter((d) => compare(d.name, maxPkgVersion, '<='));
|
|
165
|
+
if (pkgs.length === 0) {
|
|
166
|
+
throw new Error(
|
|
167
|
+
`未查询到 <= ${maxPkgVersion} 的原生版本`,
|
|
168
|
+
);
|
|
169
|
+
}
|
|
170
|
+
for (const pkg of pkgs) {
|
|
171
|
+
await put(`/app/${appId}/package/${pkg.id}`, {
|
|
172
|
+
versionId,
|
|
173
|
+
});
|
|
174
|
+
console.log(`已将版本 ${versionId} 绑定到原生版本 ${pkg.name}`);
|
|
175
|
+
}
|
|
176
|
+
console.log(`操作完成,共已绑定 ${pkgs.length} 个原生版本`);
|
|
177
|
+
return;
|
|
178
|
+
}
|
|
140
179
|
if (!pkgId) {
|
|
141
180
|
pkgId = options.packageId || (await choosePackage(appId)).id;
|
|
142
181
|
}
|