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/lib/versions.js CHANGED
@@ -1,193 +1,241 @@
1
- 'use strict';
2
-
1
+ "use strict";
3
2
  Object.defineProperty(exports, "__esModule", {
4
- value: true
3
+ value: true
5
4
  });
6
- exports.commands = undefined;
7
-
8
- var _api = require('./api');
9
-
10
- var _utils = require('./utils');
11
-
12
- var _app = require('./app');
13
-
14
- var _package = require('./package');
15
-
16
- var _compareVersions = require('compare-versions');
17
-
18
- async function showVersion(appId, offset) {
19
- const { data, count } = await (0, _api.get)(`/app/${appId}/version/list`);
20
- console.log(`Offset ${offset}`);
21
- for (const version of data) {
22
- let packageInfo = version.packages.slice(0, 3).map(v => v.name).join(', ');
23
- const count = version.packages.length;
24
- if (count > 3) {
25
- packageInfo += `...and ${count - 3} more`;
5
+ Object.defineProperty(exports, "commands", {
6
+ enumerable: true,
7
+ get: function() {
8
+ return commands;
26
9
  }
27
- if (count === 0) {
28
- packageInfo = `(no package)`;
29
- } else {
30
- packageInfo = `[${packageInfo}]`;
10
+ });
11
+ const _api = require("./api");
12
+ const _utils = require("./utils");
13
+ const _app = require("./app");
14
+ const _package = require("./package");
15
+ const _compareversions = require("compare-versions");
16
+ async function showVersion(appId, offset) {
17
+ const { data, count } = await (0, _api.get)(`/app/${appId}/version/list`);
18
+ console.log(`Offset ${offset}`);
19
+ for (const version of data){
20
+ let packageInfo = version.packages.slice(0, 3).map((v)=>v.name).join(', ');
21
+ const count = version.packages.length;
22
+ if (count > 3) {
23
+ packageInfo += `...and ${count - 3} more`;
24
+ }
25
+ if (count === 0) {
26
+ packageInfo = `(no package)`;
27
+ } else {
28
+ packageInfo = `[${packageInfo}]`;
29
+ }
30
+ console.log(`${version.id}) ${version.hash.slice(0, 8)} ${version.name} ${packageInfo}`);
31
31
  }
32
- console.log(`${version.id}) ${version.hash.slice(0, 8)} ${version.name} ${packageInfo}`);
33
- }
34
- return data;
32
+ return data;
35
33
  }
36
-
37
34
  async function listVersions(appId) {
38
- let offset = 0;
39
- while (true) {
40
- await showVersion(appId, offset);
41
- const cmd = await (0, _utils.question)('page Up/page Down/Begin/Quit(U/D/B/Q)');
42
- switch (cmd.toLowerCase()) {
43
- case 'u':
44
- offset = Math.max(0, offset - 10);
45
- break;
46
- case 'd':
47
- offset += 10;
48
- break;
49
- case 'b':
50
- offset = 0;
51
- break;
52
- case 'q':
53
- return;
35
+ let offset = 0;
36
+ while(true){
37
+ await showVersion(appId, offset);
38
+ const cmd = await (0, _utils.question)('page Up/page Down/Begin/Quit(U/D/B/Q)');
39
+ switch(cmd.toLowerCase()){
40
+ case 'u':
41
+ offset = Math.max(0, offset - 10);
42
+ break;
43
+ case 'd':
44
+ offset += 10;
45
+ break;
46
+ case 'b':
47
+ offset = 0;
48
+ break;
49
+ case 'q':
50
+ return;
51
+ }
54
52
  }
55
- }
56
53
  }
57
-
58
54
  async function chooseVersion(appId) {
59
- let offset = 0;
60
- while (true) {
61
- const data = await showVersion(appId, offset);
62
- const cmd = await (0, _utils.question)('Enter versionId or page Up/page Down/Begin(U/D/B)');
63
- switch (cmd.toLowerCase()) {
64
- case 'U':
65
- offset = Math.max(0, offset - 10);
66
- break;
67
- case 'D':
68
- offset += 10;
69
- break;
70
- case 'B':
71
- offset = 0;
72
- break;
73
- default:
74
- {
75
- const v = data.find(v => v.id === (cmd | 0));
76
- if (v) {
77
- return v;
78
- }
55
+ let offset = 0;
56
+ while(true){
57
+ const data = await showVersion(appId, offset);
58
+ const cmd = await (0, _utils.question)('Enter versionId or page Up/page Down/Begin(U/D/B)');
59
+ switch(cmd.toLowerCase()){
60
+ case 'U':
61
+ offset = Math.max(0, offset - 10);
62
+ break;
63
+ case 'D':
64
+ offset += 10;
65
+ break;
66
+ case 'B':
67
+ offset = 0;
68
+ break;
69
+ default:
70
+ {
71
+ const v = data.find((v)=>v.id === (cmd | 0));
72
+ if (v) {
73
+ return v;
74
+ }
75
+ }
79
76
  }
80
77
  }
81
- }
82
78
  }
83
-
84
- const commands = exports.commands = {
85
- publish: async function ({ args, options }) {
86
- const fn = args[0];
87
- const { name, description, metaInfo } = options;
88
-
89
- if (!fn || !fn.endsWith('.ppk')) {
90
- throw new Error('使用方法: pushy publish ppk后缀文件 --platform ios|android');
91
- }
92
-
93
- const platform = (0, _app.checkPlatform)(options.platform || (await (0, _utils.question)('平台(ios/android):')));
94
- const { appId } = await (0, _app.getSelectedApp)(platform);
95
-
96
- const { hash } = await (0, _api.uploadFile)(fn);
97
-
98
- const { id } = await (0, _api.post)(`/app/${appId}/version/create`, {
99
- name: name || (await (0, _utils.question)('输入版本名称: ')) || '(未命名)',
100
- hash,
101
- description: description || (await (0, _utils.question)('输入版本描述:')),
102
- metaInfo: metaInfo || (await (0, _utils.question)('输入自定义的 meta info:'))
103
- });
104
- // TODO local diff
105
- (0, _utils.saveToLocal)(fn, `${appId}/ppk/${id}.ppk`);
106
- console.log(`已成功上传新热更包(id: ${id})`);
107
-
108
- const v = await (0, _utils.question)('是否现在将此热更应用到原生包上?(Y/N)');
109
- if (v.toLowerCase() === 'y') {
110
- await this.update({ args: [], options: { versionId: id, platform } });
111
- }
112
- },
113
- versions: async function ({ options }) {
114
- const platform = (0, _app.checkPlatform)(options.platform || (await (0, _utils.question)('平台(ios/android):')));
115
- const { appId } = await (0, _app.getSelectedApp)(platform);
116
- await listVersions(appId);
117
- },
118
- update: async function ({ args, options }) {
119
- const platform = (0, _app.checkPlatform)(options.platform || (await (0, _utils.question)('平台(ios/android):')));
120
- const { appId } = await (0, _app.getSelectedApp)(platform);
121
- const versionId = options.versionId || (await chooseVersion(appId)).id;
122
-
123
- let pkgId;
124
- let pkgVersion = options.packageVersion;
125
- let minPkgVersion = options.minPackageVersion;
126
- let maxPkgVersion = options.maxPackageVersion;
127
- if (pkgVersion) {
128
- pkgVersion = pkgVersion.trim();
129
- const { data } = await (0, _api.get)(`/app/${appId}/package/list?limit=1000`);
130
- const pkg = data.find(d => d.name === pkgVersion);
131
- if (pkg) {
132
- pkgId = pkg.id;
133
- } else {
134
- throw new Error(`未查询到匹配原生版本:${pkgVersion}`);
135
- }
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
79
+ const commands = {
80
+ publish: async function({ args, options }) {
81
+ const fn = args[0];
82
+ const { name, description, metaInfo } = options;
83
+ if (!fn || !fn.endsWith('.ppk')) {
84
+ throw new Error('使用方法: pushy publish ppk后缀文件 --platform ios|android');
85
+ }
86
+ const platform = (0, _app.checkPlatform)(options.platform || await (0, _utils.question)('平台(ios/android):'));
87
+ const { appId } = await (0, _app.getSelectedApp)(platform);
88
+ const { hash } = await (0, _api.uploadFile)(fn);
89
+ const { id } = await (0, _api.post)(`/app/${appId}/version/create`, {
90
+ name: name || await (0, _utils.question)('输入版本名称: ') || '(未命名)',
91
+ hash,
92
+ description: description || await (0, _utils.question)('输入版本描述:'),
93
+ metaInfo: metaInfo || await (0, _utils.question)('输入自定义的 meta info:')
147
94
  });
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
95
+ // TODO local diff
96
+ (0, _utils.saveToLocal)(fn, `${appId}/ppk/${id}.ppk`);
97
+ console.log(`已成功上传新热更包(id: ${id})`);
98
+ const v = await (0, _utils.question)('是否现在将此热更应用到原生包上?(Y/N)');
99
+ if (v.toLowerCase() === 'y') {
100
+ await this.update({
101
+ args: [],
102
+ options: {
103
+ versionId: id,
104
+ platform
105
+ }
106
+ });
107
+ }
108
+ },
109
+ versions: async function({ options }) {
110
+ const platform = (0, _app.checkPlatform)(options.platform || await (0, _utils.question)('平台(ios/android):'));
111
+ const { appId } = await (0, _app.getSelectedApp)(platform);
112
+ await listVersions(appId);
113
+ },
114
+ update: async function({ args, options }) {
115
+ const platform = (0, _app.checkPlatform)(options.platform || await (0, _utils.question)('平台(ios/android):'));
116
+ const { appId } = await (0, _app.getSelectedApp)(platform);
117
+ let versionId = options.versionId || (await chooseVersion(appId)).id;
118
+ if (versionId === 'null') {
119
+ versionId = null;
120
+ }
121
+ let pkgId;
122
+ let pkgVersion = options.packageVersion;
123
+ let minPkgVersion = options.minPackageVersion;
124
+ let maxPkgVersion = options.maxPackageVersion;
125
+ let rollout = options.rollout;
126
+ if (rollout !== undefined) {
127
+ try {
128
+ rollout = parseInt(rollout);
129
+ } catch (e) {
130
+ throw new Error('rollout 必须是 1-100 的整数');
131
+ }
132
+ if (rollout < 1 || rollout > 100) {
133
+ throw new Error('rollout 必须是 1-100 的整数');
134
+ }
135
+ }
136
+ if (minPkgVersion) {
137
+ minPkgVersion = String(minPkgVersion).trim();
138
+ const { data } = await (0, _api.get)(`/app/${appId}/package/list?limit=1000`);
139
+ const pkgs = data.filter((d)=>(0, _compareversions.compare)(d.name, minPkgVersion, '>='));
140
+ if (pkgs.length === 0) {
141
+ throw new Error(`未查询到 >= ${minPkgVersion} 的原生版本`);
142
+ }
143
+ if (rollout) {
144
+ const rolloutConfig = {};
145
+ for (const pkg of pkgs){
146
+ rolloutConfig[pkg.name] = rollout;
147
+ }
148
+ await (0, _api.put)(`/app/${appId}/version/${versionId}`, {
149
+ config: {
150
+ rollout: rolloutConfig
151
+ }
152
+ });
153
+ console.log(`已在原生版本 ${pkgs.map((p)=>p.name).join(', ')} 上设置灰度发布 ${rollout}% 热更版本 ${versionId}`);
154
+ }
155
+ for (const pkg of pkgs){
156
+ await (0, _api.put)(`/app/${appId}/package/${pkg.id}`, {
157
+ versionId
158
+ });
159
+ console.log(`已将热更版本 ${versionId} 绑定到原生版本 ${pkg.name}`);
160
+ }
161
+ console.log(`操作完成,共已绑定 ${pkgs.length} 个原生版本`);
162
+ return;
163
+ }
164
+ if (maxPkgVersion) {
165
+ maxPkgVersion = String(maxPkgVersion).trim();
166
+ const { data } = await (0, _api.get)(`/app/${appId}/package/list?limit=1000`);
167
+ const pkgs = data.filter((d)=>(0, _compareversions.compare)(d.name, maxPkgVersion, '<='));
168
+ if (pkgs.length === 0) {
169
+ throw new Error(`未查询到 <= ${maxPkgVersion} 的原生版本`);
170
+ }
171
+ if (rollout) {
172
+ const rolloutConfig = {};
173
+ for (const pkg of pkgs){
174
+ rolloutConfig[pkg.name] = rollout;
175
+ }
176
+ await (0, _api.put)(`/app/${appId}/version/${versionId}`, {
177
+ config: {
178
+ rollout: rolloutConfig
179
+ }
180
+ });
181
+ console.log(`已在原生版本 ${pkgs.map((p)=>p.name).join(', ')} 上设置灰度发布 ${rollout}% 热更版本 ${versionId}`);
182
+ }
183
+ for (const pkg of pkgs){
184
+ await (0, _api.put)(`/app/${appId}/package/${pkg.id}`, {
185
+ versionId
186
+ });
187
+ console.log(`已将热更版本 ${versionId} 绑定到原生版本 ${pkg.name}`);
188
+ }
189
+ console.log(`操作完成,共已绑定 ${pkgs.length} 个原生版本`);
190
+ return;
191
+ }
192
+ if (pkgVersion) {
193
+ pkgVersion = pkgVersion.trim();
194
+ const { data } = await (0, _api.get)(`/app/${appId}/package/list?limit=1000`);
195
+ const pkg = data.find((d)=>d.name === pkgVersion);
196
+ if (pkg) {
197
+ pkgId = pkg.id;
198
+ } else {
199
+ throw new Error(`未查询到匹配原生版本:${pkgVersion}`);
200
+ }
201
+ }
202
+ if (!pkgId) {
203
+ pkgId = options.packageId || (await (0, _package.choosePackage)(appId)).id;
204
+ }
205
+ if (!pkgId) {
206
+ throw new Error('请提供 packageId 或 packageVersion 参数');
207
+ }
208
+ if (rollout) {
209
+ if (!pkgVersion) {
210
+ const { data } = await (0, _api.get)(`/app/${appId}/package/list?limit=1000`);
211
+ const pkg = data.find((d)=>d.id === pkgId);
212
+ if (pkg) {
213
+ pkgVersion = pkg.name;
214
+ }
215
+ }
216
+ await (0, _api.put)(`/app/${appId}/version/${versionId}`, {
217
+ config: {
218
+ rollout: {
219
+ [pkgVersion]: rollout
220
+ }
221
+ }
222
+ });
223
+ console.log(`已将在原生版本 ${pkgVersion} 上设置灰度发布 ${rollout}% 热更版本 ${versionId} `);
224
+ }
225
+ await (0, _api.put)(`/app/${appId}/package/${pkgId}`, {
226
+ versionId
163
227
  });
164
- console.log(`已将版本 ${versionId} 绑定到原生版本 ${pkg.name}`);
165
- }
166
- console.log(`操作完成,共已绑定 ${pkgs.length} 个原生版本`);
167
- return;
168
- }
169
- if (!pkgId) {
170
- pkgId = options.packageId || (await (0, _package.choosePackage)(appId)).id;
171
- }
172
-
173
- if (!pkgId) {
174
- throw new Error('请提供 packageId 或 packageVersion 参数');
228
+ console.log(`已将热更版本 ${versionId} 绑定到原生版本 ${pkgVersion}`);
229
+ },
230
+ updateVersionInfo: async function({ args, options }) {
231
+ const platform = (0, _app.checkPlatform)(options.platform || await (0, _utils.question)('平台(ios/android):'));
232
+ const { appId } = await (0, _app.getSelectedApp)(platform);
233
+ const versionId = options.versionId || (await chooseVersion(appId)).id;
234
+ const updateParams = {};
235
+ options.name && (updateParams.name = options.name);
236
+ options.description && (updateParams.description = options.description);
237
+ options.metaInfo && (updateParams.metaInfo = options.metaInfo);
238
+ await (0, _api.put)(`/app/${appId}/version/${versionId}`, updateParams);
239
+ console.log('操作成功');
175
240
  }
176
- await (0, _api.put)(`/app/${appId}/package/${pkgId}`, {
177
- versionId
178
- });
179
- console.log('操作成功');
180
- },
181
- updateVersionInfo: async function ({ args, options }) {
182
- const platform = (0, _app.checkPlatform)(options.platform || (await (0, _utils.question)('平台(ios/android):')));
183
- const { appId } = await (0, _app.getSelectedApp)(platform);
184
- const versionId = options.versionId || (await chooseVersion(appId)).id;
185
-
186
- const updateParams = {};
187
- options.name && (updateParams.name = options.name);
188
- options.description && (updateParams.description = options.description);
189
- options.metaInfo && (updateParams.metaInfo = options.metaInfo);
190
- await (0, _api.put)(`/app/${appId}/version/${versionId}`, updateParams);
191
- console.log('操作成功');
192
- }
193
- };
241
+ };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "react-native-update-cli",
3
- "version": "1.30.4",
3
+ "version": "1.31.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,8 @@
12
12
  "cli.json"
13
13
  ],
14
14
  "scripts": {
15
- "prepublish": "babel src --out-dir lib && chmod +x lib/index.js"
15
+ "build": "swc src -d lib --strip-leading-paths",
16
+ "prepublish": "npm run build && chmod +x lib/index.js"
16
17
  },
17
18
  "repository": {
18
19
  "type": "git",
@@ -53,14 +54,14 @@
53
54
  "yauzl": "^2.10.0",
54
55
  "yazl": "2.5.1"
55
56
  },
56
- "devDependencies": {
57
- "babel-cli": "^6.26.0",
58
- "babel-plugin-syntax-object-rest-spread": "^6.13.0",
59
- "babel-plugin-transform-es2015-modules-commonjs": "^6.26.2",
60
- "babel-plugin-transform-es2015-spread": "^6.22.0",
61
- "babel-plugin-transform-object-rest-spread": "^6.26.0"
62
- },
63
57
  "engines": {
64
58
  "node": ">= 10"
59
+ },
60
+ "devDependencies": {
61
+ "@swc/cli": "^0.4.1-nightly.20240914",
62
+ "@swc/core": "^1.7.36",
63
+ "@types/node": "^22.7.5",
64
+ "oxlint": "^0.9.10",
65
+ "typescript": "^5.6.3"
65
66
  }
66
67
  }
package/src/api.js CHANGED
@@ -74,9 +74,12 @@ async function query(url, options) {
74
74
  }
75
75
 
76
76
  if (resp.status !== 200) {
77
- throw Object.assign(new Error(json.message || json.error), {
78
- status: resp.status,
79
- });
77
+ throw Object.assign(
78
+ new Error(json.message || json.error || resp.statusText),
79
+ {
80
+ status: resp.status,
81
+ },
82
+ );
80
83
  }
81
84
  return json;
82
85
  }
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的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',
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
  }
@@ -177,17 +177,19 @@ async function checkGradleConfig() {
177
177
  let crunchPngs;
178
178
  try {
179
179
  const gradleConfig = await g2js.parseFile('android/app/build.gradle');
180
+ crunchPngs = gradleConfig.android.buildTypes.release.crunchPngs;
180
181
  const projectConfig = gradleConfig['project.ext.react'];
181
- for (const packagerConfig of projectConfig) {
182
- if (
183
- packagerConfig.includes('enableHermes') &&
184
- packagerConfig.includes('true')
185
- ) {
186
- enableHermes = true;
187
- break;
182
+ if (projectConfig) {
183
+ for (const packagerConfig of projectConfig) {
184
+ if (
185
+ packagerConfig.includes('enableHermes') &&
186
+ packagerConfig.includes('true')
187
+ ) {
188
+ enableHermes = true;
189
+ break;
190
+ }
188
191
  }
189
192
  }
190
- crunchPngs = gradleConfig.android.buildTypes.release.crunchPngs;
191
193
  } catch (e) {}
192
194
  return {
193
195
  enableHermes,
@@ -609,7 +611,6 @@ export const commands = {
609
611
  const { version, major, minor } = getRNVersion();
610
612
 
611
613
  console.log('Bundling with react-native: ', version);
612
- printVersionCommand();
613
614
 
614
615
  await runReactNativeBundleCommand(
615
616
  bundleName,
package/src/versions.js CHANGED
@@ -124,20 +124,26 @@ export const commands = {
124
124
  options.platform || (await question('平台(ios/android):')),
125
125
  );
126
126
  const { appId } = await getSelectedApp(platform);
127
- const versionId = options.versionId || (await chooseVersion(appId)).id;
127
+ let versionId = options.versionId || (await chooseVersion(appId)).id;
128
+ if (versionId === 'null') {
129
+ versionId = null;
130
+ }
128
131
 
129
132
  let pkgId;
130
133
  let pkgVersion = options.packageVersion;
131
134
  let minPkgVersion = options.minPackageVersion;
132
135
  let maxPkgVersion = options.maxPackageVersion;
133
- if (pkgVersion) {
134
- pkgVersion = pkgVersion.trim();
135
- const { data } = await get(`/app/${appId}/package/list?limit=1000`);
136
- const pkg = data.find((d) => d.name === pkgVersion);
137
- if (pkg) {
138
- pkgId = pkg.id;
139
- } else {
140
- throw new Error(`未查询到匹配原生版本:${pkgVersion}`);
136
+ let rollout = options.rollout;
137
+ if (rollout === undefined) {
138
+ rollout = null;
139
+ } else {
140
+ try {
141
+ rollout = parseInt(rollout);
142
+ } catch (e) {
143
+ throw new Error('rollout 必须是 1-100 的整数');
144
+ }
145
+ if (rollout < 1 || rollout > 100) {
146
+ throw new Error('rollout 必须是 1-100 的整数');
141
147
  }
142
148
  }
143
149
  if (minPkgVersion) {
@@ -145,15 +151,29 @@ export const commands = {
145
151
  const { data } = await get(`/app/${appId}/package/list?limit=1000`);
146
152
  const pkgs = data.filter((d) => compare(d.name, minPkgVersion, '>='));
147
153
  if (pkgs.length === 0) {
148
- throw new Error(
149
- `未查询到 >= ${minPkgVersion} 的原生版本`,
154
+ throw new Error(`未查询到 >= ${minPkgVersion} 的原生版本`);
155
+ }
156
+ if (rollout) {
157
+ const rolloutConfig = {};
158
+ for (const pkg of pkgs) {
159
+ rolloutConfig[pkg.name] = rollout;
160
+ }
161
+ await put(`/app/${appId}/version/${versionId}`, {
162
+ config: {
163
+ rollout: rolloutConfig,
164
+ },
165
+ });
166
+ console.log(
167
+ `已在原生版本 ${pkgs
168
+ .map((p) => p.name)
169
+ .join(', ')} 上设置灰度发布 ${rollout}% 热更版本 ${versionId}`,
150
170
  );
151
171
  }
152
172
  for (const pkg of pkgs) {
153
173
  await put(`/app/${appId}/package/${pkg.id}`, {
154
174
  versionId,
155
175
  });
156
- console.log(`已将版本 ${versionId} 绑定到原生版本 ${pkg.name}`);
176
+ console.log(`已将热更版本 ${versionId} 绑定到原生版本 ${pkg.name}`);
157
177
  }
158
178
  console.log(`操作完成,共已绑定 ${pkgs.length} 个原生版本`);
159
179
  return;
@@ -163,19 +183,44 @@ export const commands = {
163
183
  const { data } = await get(`/app/${appId}/package/list?limit=1000`);
164
184
  const pkgs = data.filter((d) => compare(d.name, maxPkgVersion, '<='));
165
185
  if (pkgs.length === 0) {
166
- throw new Error(
167
- `未查询到 <= ${maxPkgVersion} 的原生版本`,
186
+ throw new Error(`未查询到 <= ${maxPkgVersion} 的原生版本`);
187
+ }
188
+ if (rollout) {
189
+ const rolloutConfig = {};
190
+ for (const pkg of pkgs) {
191
+ rolloutConfig[pkg.name] = rollout;
192
+ }
193
+ await put(`/app/${appId}/version/${versionId}`, {
194
+ config: {
195
+ rollout: rolloutConfig,
196
+ },
197
+ });
198
+ console.log(
199
+ `已在原生版本 ${pkgs
200
+ .map((p) => p.name)
201
+ .join(', ')} 上设置灰度发布 ${rollout}% 热更版本 ${versionId}`,
168
202
  );
169
203
  }
170
204
  for (const pkg of pkgs) {
171
205
  await put(`/app/${appId}/package/${pkg.id}`, {
172
206
  versionId,
173
207
  });
174
- console.log(`已将版本 ${versionId} 绑定到原生版本 ${pkg.name}`);
208
+ console.log(`已将热更版本 ${versionId} 绑定到原生版本 ${pkg.name}`);
175
209
  }
176
210
  console.log(`操作完成,共已绑定 ${pkgs.length} 个原生版本`);
177
211
  return;
178
212
  }
213
+
214
+ if (pkgVersion) {
215
+ pkgVersion = pkgVersion.trim();
216
+ const { data } = await get(`/app/${appId}/package/list?limit=1000`);
217
+ const pkg = data.find((d) => d.name === pkgVersion);
218
+ if (pkg) {
219
+ pkgId = pkg.id;
220
+ } else {
221
+ throw new Error(`未查询到匹配原生版本:${pkgVersion}`);
222
+ }
223
+ }
179
224
  if (!pkgId) {
180
225
  pkgId = options.packageId || (await choosePackage(appId)).id;
181
226
  }
@@ -183,10 +228,29 @@ export const commands = {
183
228
  if (!pkgId) {
184
229
  throw new Error('请提供 packageId 或 packageVersion 参数');
185
230
  }
231
+ if (rollout) {
232
+ if (!pkgVersion) {
233
+ const { data } = await get(`/app/${appId}/package/list?limit=1000`);
234
+ const pkg = data.find((d) => d.id === pkgId);
235
+ if (pkg) {
236
+ pkgVersion = pkg.name;
237
+ }
238
+ }
239
+ await put(`/app/${appId}/version/${versionId}`, {
240
+ config: {
241
+ rollout: {
242
+ [pkgVersion]: rollout,
243
+ },
244
+ },
245
+ });
246
+ console.log(
247
+ `已将在原生版本 ${pkgVersion} 上设置灰度发布 ${rollout}% 热更版本 ${versionId} `,
248
+ );
249
+ }
186
250
  await put(`/app/${appId}/package/${pkgId}`, {
187
251
  versionId,
188
252
  });
189
- console.log('操作成功');
253
+ console.log(`已将热更版本 ${versionId} 绑定到原生版本 ${pkgVersion}`);
190
254
  },
191
255
  updateVersionInfo: async function ({ args, options }) {
192
256
  const platform = checkPlatform(