react-native-update-cli 1.43.4 → 1.43.6

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/src/package.ts CHANGED
@@ -1,5 +1,6 @@
1
1
  import { get, post, uploadFile } from './api';
2
2
  import { question, saveToLocal } from './utils';
3
+ import { t } from './utils/i18n';
3
4
 
4
5
  import { checkPlatform, getSelectedApp } from './app';
5
6
 
@@ -34,7 +35,7 @@ export async function listPackage(appId: string) {
34
35
  }
35
36
 
36
37
  console.log(Table(header, rows).render());
37
- console.log(`\n共 ${data.length} 个包`);
38
+ console.log(t('totalPackages', { count: data.length }));
38
39
  return data;
39
40
  }
40
41
 
@@ -54,7 +55,7 @@ export const commands = {
54
55
  uploadIpa: async ({ args }: { args: string[] }) => {
55
56
  const fn = args[0];
56
57
  if (!fn || !fn.endsWith('.ipa')) {
57
- throw new Error('使用方法: pushy uploadIpa ipa后缀文件');
58
+ throw new Error(t('usageUploadIpa'));
58
59
  }
59
60
  const {
60
61
  versionName,
@@ -93,7 +94,7 @@ export const commands = {
93
94
  uploadApk: async ({ args }: { args: string[] }) => {
94
95
  const fn = args[0];
95
96
  if (!fn || !fn.endsWith('.apk')) {
96
- throw new Error('使用方法: pushy uploadApk apk后缀文件');
97
+ throw new Error(t('usageUploadApk'));
97
98
  }
98
99
  const {
99
100
  versionName,
@@ -132,7 +133,7 @@ export const commands = {
132
133
  uploadApp: async ({ args }: { args: string[] }) => {
133
134
  const fn = args[0];
134
135
  if (!fn || !fn.endsWith('.app')) {
135
- throw new Error('使用方法: pushy uploadApp app后缀文件');
136
+ throw new Error(t('usageUploadApp'));
136
137
  }
137
138
  const {
138
139
  versionName,
@@ -171,21 +172,21 @@ export const commands = {
171
172
  parseApp: async ({ args }: { args: string[] }) => {
172
173
  const fn = args[0];
173
174
  if (!fn || !fn.endsWith('.app')) {
174
- throw new Error('使用方法: pushy parseApp app后缀文件');
175
+ throw new Error(t('usageParseApp'));
175
176
  }
176
177
  console.log(await getAppInfo(fn));
177
178
  },
178
179
  parseIpa: async ({ args }: { args: string[] }) => {
179
180
  const fn = args[0];
180
181
  if (!fn || !fn.endsWith('.ipa')) {
181
- throw new Error('使用方法: pushy parseIpa ipa后缀文件');
182
+ throw new Error(t('usageParseIpa'));
182
183
  }
183
184
  console.log(await getIpaInfo(fn));
184
185
  },
185
186
  parseApk: async ({ args }: { args: string[] }) => {
186
187
  const fn = args[0];
187
188
  if (!fn || !fn.endsWith('.apk')) {
188
- throw new Error('使用方法: pushy parseApk apk后缀文件');
189
+ throw new Error(t('usageParseApk'));
189
190
  }
190
191
  console.log(await getApkInfo(fn));
191
192
  },
package/src/user.ts CHANGED
@@ -1,6 +1,7 @@
1
1
  import { question } from './utils';
2
2
  import { post, get, replaceSession, saveSession, closeSession } from './api';
3
3
  import crypto from 'node:crypto';
4
+ import { t } from './utils/i18n';
4
5
 
5
6
  function md5(str: string) {
6
7
  return crypto.createHash('md5').update(str).digest('hex');
@@ -16,11 +17,11 @@ export const commands = {
16
17
  });
17
18
  replaceSession({ token });
18
19
  await saveSession();
19
- console.log(`欢迎使用 pushy 热更新服务, ${info.name}.`);
20
+ console.log(t('welcomeMessage', { name: info.name }));
20
21
  },
21
22
  logout: async () => {
22
23
  await closeSession();
23
- console.log('已退出登录');
24
+ console.log(t('loggedOut'));
24
25
  },
25
26
  me: async () => {
26
27
  const me = await get('/user/me');
@@ -1,6 +1,7 @@
1
1
  import fs from 'node:fs';
2
2
  // import path from 'node:path';
3
3
  import { credentialFile, tempDir } from './constants';
4
+ import { t } from './i18n';
4
5
 
5
6
  export function addGitIgnore() {
6
7
  const shouldIgnore = [credentialFile, tempDir];
@@ -26,7 +27,7 @@ export function addGitIgnore() {
26
27
  gitignoreLines.push('# react-native-update');
27
28
  for (const line of shouldIgnore) {
28
29
  gitignoreLines.push(line);
29
- console.log(`Added ${line} to .gitignore`);
30
+ console.log(t('addedToGitignore', { line }));
30
31
  }
31
32
 
32
33
  fs.writeFileSync(gitignorePath, gitignoreLines.join('\n'));
@@ -1,4 +1,5 @@
1
1
  import { plugins } from './plugin-config';
2
+ import { t } from './i18n';
2
3
 
3
4
  interface BundleParams {
4
5
  sentry: boolean;
@@ -17,10 +18,10 @@ export async function checkPlugins(): Promise<BundleParams> {
17
18
  const isEnabled = await plugin.detect();
18
19
  if (isEnabled && plugin.bundleParams) {
19
20
  Object.assign(params, plugin.bundleParams);
20
- console.log(`detected ${plugin.name} plugin`);
21
+ console.log(t('pluginDetected', { name: plugin.name }));
21
22
  }
22
23
  } catch (err) {
23
- console.warn(`error while detecting ${plugin.name} plugin:`, err);
24
+ console.warn(t('pluginDetectionError', { name: plugin.name, error: err }));
24
25
  }
25
26
  }
26
27
 
package/src/versions.ts CHANGED
@@ -1,29 +1,57 @@
1
1
  import { get, post, put, uploadFile } from './api';
2
2
  import { question, saveToLocal } from './utils';
3
+ import { t } from './utils/i18n';
3
4
 
4
5
  import { checkPlatform, getSelectedApp } from './app';
5
6
  import { choosePackage } from './package';
6
7
  import { compare } from 'compare-versions';
7
8
  import { depVersions } from './utils/dep-versions';
8
9
  import { getCommitInfo } from './utils/git';
9
- import { Platform } from 'types';
10
+ import type { Platform } from 'types';
11
+
12
+ interface Package {
13
+ id: string;
14
+ name: string;
15
+ }
16
+
17
+ interface Version {
18
+ id: string;
19
+ hash: string;
20
+ name: string;
21
+ packages?: Package[];
22
+ }
23
+
24
+ interface CommandOptions {
25
+ name?: string;
26
+ description?: string;
27
+ metaInfo?: string;
28
+ platform?: Platform;
29
+ versionId?: string;
30
+ packageId?: string;
31
+ packageVersion?: string;
32
+ minPackageVersion?: string;
33
+ maxPackageVersion?: string;
34
+ rollout?: string;
35
+ }
10
36
 
11
37
  async function showVersion(appId: string, offset: number) {
12
38
  const { data, count } = await get(`/app/${appId}/version/list`);
13
- console.log(`Offset ${offset}`);
39
+ console.log(t('offset', { offset }));
14
40
  for (const version of data) {
15
- let packageInfo = version.packages
16
- .slice(0, 3)
17
- .map((v) => v.name)
18
- .join(', ');
19
- const pkgCount = version.packages.length;
20
- if (pkgCount > 3) {
21
- packageInfo += `...and ${pkgCount - 3} more`;
22
- }
41
+ const pkgCount = version.packages?.length || 0;
42
+ let packageInfo = '';
23
43
  if (pkgCount === 0) {
24
44
  packageInfo = 'no package';
25
45
  } else {
26
- packageInfo = `[${packageInfo}]`;
46
+ packageInfo = version.packages
47
+ ?.slice(0, 3)
48
+ .map((pkg: Package) => pkg.name)
49
+ .join(', ');
50
+ if (pkgCount > 3) {
51
+ packageInfo += `...and ${pkgCount - 3} more`;
52
+ } else {
53
+ packageInfo = `[${packageInfo}]`;
54
+ }
27
55
  }
28
56
  console.log(
29
57
  `${version.id}) ${version.hash.slice(0, 8)} ${
@@ -73,7 +101,10 @@ async function chooseVersion(appId: string) {
73
101
  offset = 0;
74
102
  break;
75
103
  default: {
76
- const v = data.find((v) => v.id === (cmd | 0));
104
+ const versionId = Number.parseInt(cmd, 10);
105
+ const v = data.find(
106
+ (version: Version) => version.id === String(versionId),
107
+ );
77
108
  if (v) {
78
109
  return v;
79
110
  }
@@ -83,12 +114,13 @@ async function chooseVersion(appId: string) {
83
114
  }
84
115
 
85
116
  export const commands = {
86
- publish: async function ({ args, options }: { args: string[]; options: {
87
- name: string;
88
- description?: string;
89
- metaInfo?: string;
90
- platform?: Platform;
91
- } }) {
117
+ publish: async function ({
118
+ args,
119
+ options,
120
+ }: {
121
+ args: string[];
122
+ options: CommandOptions;
123
+ }) {
92
124
  const fn = args[0];
93
125
  const { name, description, metaInfo } = options;
94
126
 
@@ -99,7 +131,8 @@ export const commands = {
99
131
  }
100
132
 
101
133
  const platform = checkPlatform(
102
- options.platform || (await question('平台(ios/android/harmony):')),
134
+ options.platform ||
135
+ ((await question('平台(ios/android/harmony):')) as Platform),
103
136
  );
104
137
  const { appId } = await getSelectedApp(platform);
105
138
 
@@ -117,7 +150,7 @@ export const commands = {
117
150
  });
118
151
  // TODO local diff
119
152
  saveToLocal(fn, `${appId}/ppk/${id}.ppk`);
120
- console.log(`已成功上传新热更包(id: ${id})`);
153
+ console.log(t('packageUploadSuccess', { id }));
121
154
 
122
155
  const v = await question('是否现在将此热更应用到原生包上?(Y/N)');
123
156
  if (v.toLowerCase() === 'y') {
@@ -125,49 +158,59 @@ export const commands = {
125
158
  }
126
159
  return versionName;
127
160
  },
128
- versions: async ({ options }) => {
161
+ versions: async ({ options }: { options: CommandOptions }) => {
129
162
  const platform = checkPlatform(
130
- options.platform || (await question('平台(ios/android/harmony):')),
163
+ options.platform ||
164
+ ((await question('平台(ios/android/harmony):')) as Platform),
131
165
  );
132
166
  const { appId } = await getSelectedApp(platform);
133
167
  await listVersions(appId);
134
168
  },
135
- update: async ({ args, options }) => {
169
+ update: async ({
170
+ args,
171
+ options,
172
+ }: {
173
+ args: string[];
174
+ options: CommandOptions;
175
+ }) => {
136
176
  const platform = checkPlatform(
137
- options.platform || (await question('平台(ios/android/harmony):')),
177
+ options.platform ||
178
+ ((await question('平台(ios/android/harmony):')) as Platform),
138
179
  );
139
180
  const { appId } = await getSelectedApp(platform);
140
181
  let versionId = options.versionId || (await chooseVersion(appId)).id;
141
182
  if (versionId === 'null') {
142
- versionId = null;
183
+ versionId = undefined;
143
184
  }
144
185
 
145
186
  let pkgId: string | undefined;
146
187
  let pkgVersion = options.packageVersion;
147
188
  let minPkgVersion = options.minPackageVersion;
148
189
  let maxPkgVersion = options.maxPackageVersion;
149
- let rollout = options.rollout;
150
- if (rollout === undefined) {
151
- rollout = null;
152
- } else {
190
+ let rollout: number | undefined = undefined;
191
+
192
+ if (options.rollout !== undefined) {
153
193
  try {
154
- rollout = Number.parseInt(rollout);
194
+ rollout = Number.parseInt(options.rollout);
155
195
  } catch (e) {
156
- throw new Error('rollout 必须是 1-100 的整数');
196
+ throw new Error(t('rolloutRangeError'));
157
197
  }
158
198
  if (rollout < 1 || rollout > 100) {
159
- throw new Error('rollout 必须是 1-100 的整数');
199
+ throw new Error(t('rolloutRangeError'));
160
200
  }
161
201
  }
202
+
162
203
  if (minPkgVersion) {
163
204
  minPkgVersion = String(minPkgVersion).trim();
164
205
  const { data } = await get(`/app/${appId}/package/list?limit=1000`);
165
- const pkgs = data.filter((d) => compare(d.name, minPkgVersion, '>='));
206
+ const pkgs = data.filter((pkg: Package) =>
207
+ compare(pkg.name, minPkgVersion, '>='),
208
+ );
166
209
  if (pkgs.length === 0) {
167
- throw new Error(`未查询到 >= ${minPkgVersion} 的原生版本`);
210
+ throw new Error(t('nativeVersionNotFound', { version: minPkgVersion }));
168
211
  }
169
- if (rollout) {
170
- const rolloutConfig = {};
212
+ if (rollout !== undefined) {
213
+ const rolloutConfig: Record<string, number> = {};
171
214
  for (const pkg of pkgs) {
172
215
  rolloutConfig[pkg.name] = rollout;
173
216
  }
@@ -177,9 +220,10 @@ export const commands = {
177
220
  },
178
221
  });
179
222
  console.log(
180
- `已在原生版本 ${pkgs
181
- .map((p) => p.name)
182
- .join(', ')} 上设置灰度发布 ${rollout}% 热更版本 ${versionId}`,
223
+ `${t('rolloutConfigSet', {
224
+ versions: pkgs.map((pkg: Package) => pkg.name).join(', '),
225
+ rollout: rollout,
226
+ })}`,
183
227
  );
184
228
  }
185
229
  for (const pkg of pkgs) {
@@ -187,21 +231,27 @@ export const commands = {
187
231
  versionId,
188
232
  });
189
233
  console.log(
190
- `已将热更版本 ${versionId} 绑定到原生版本 ${pkg.name} (id: ${pkg.id})`,
234
+ `${t('versionBind', {
235
+ version: versionId,
236
+ nativeVersion: pkg.name,
237
+ id: pkg.id,
238
+ })}`,
191
239
  );
192
240
  }
193
- console.log(`操作完成,共已绑定 ${pkgs.length} 个原生版本`);
241
+ console.log(t('operationComplete', { count: pkgs.length }));
194
242
  return;
195
243
  }
196
244
  if (maxPkgVersion) {
197
245
  maxPkgVersion = String(maxPkgVersion).trim();
198
246
  const { data } = await get(`/app/${appId}/package/list?limit=1000`);
199
- const pkgs = data.filter((d) => compare(d.name, maxPkgVersion, '<='));
247
+ const pkgs = data.filter((pkg: Package) =>
248
+ compare(pkg.name, maxPkgVersion, '<='),
249
+ );
200
250
  if (pkgs.length === 0) {
201
- throw new Error(`未查询到 <= ${maxPkgVersion} 的原生版本`);
251
+ throw new Error(t('nativeVersionNotFoundLess', { version: maxPkgVersion }));
202
252
  }
203
- if (rollout) {
204
- const rolloutConfig = {};
253
+ if (rollout !== undefined) {
254
+ const rolloutConfig: Record<string, number> = {};
205
255
  for (const pkg of pkgs) {
206
256
  rolloutConfig[pkg.name] = rollout;
207
257
  }
@@ -211,9 +261,10 @@ export const commands = {
211
261
  },
212
262
  });
213
263
  console.log(
214
- `已在原生版本 ${pkgs
215
- .map((p) => p.name)
216
- .join(', ')} 上设置灰度发布 ${rollout}% 热更版本 ${versionId}`,
264
+ `${t('rolloutConfigSet', {
265
+ versions: pkgs.map((pkg: Package) => pkg.name).join(', '),
266
+ rollout: rollout,
267
+ })}`,
217
268
  );
218
269
  }
219
270
  for (const pkg of pkgs) {
@@ -221,21 +272,25 @@ export const commands = {
221
272
  versionId,
222
273
  });
223
274
  console.log(
224
- `已将热更版本 ${versionId} 绑定到原生版本 ${pkg.name} (id: ${pkg.id})`,
275
+ `${t('versionBind', {
276
+ version: versionId,
277
+ nativeVersion: pkg.name,
278
+ id: pkg.id,
279
+ })}`,
225
280
  );
226
281
  }
227
- console.log(`操作完成,共已绑定 ${pkgs.length} 个原生版本`);
282
+ console.log(t('operationComplete', { count: pkgs.length }));
228
283
  return;
229
284
  }
230
285
 
231
286
  const { data } = await get(`/app/${appId}/package/list?limit=1000`);
232
287
  if (pkgVersion) {
233
288
  pkgVersion = pkgVersion.trim();
234
- const pkg = data.find((d) => d.name === pkgVersion);
289
+ const pkg = data.find((pkg: Package) => pkg.name === pkgVersion);
235
290
  if (pkg) {
236
291
  pkgId = pkg.id;
237
292
  } else {
238
- throw new Error(`未查询到匹配原生版本:${pkgVersion}`);
293
+ throw new Error(t('nativeVersionNotFoundMatch', { version: pkgVersion }));
239
294
  }
240
295
  }
241
296
  if (!pkgId) {
@@ -243,17 +298,17 @@ export const commands = {
243
298
  }
244
299
 
245
300
  if (!pkgId) {
246
- throw new Error('请提供 packageId 或 packageVersion 参数');
301
+ throw new Error(t('packageIdRequired'));
247
302
  }
248
303
 
249
304
  if (!pkgVersion) {
250
- const pkg = data.find((d) => String(d.id) === String(pkgId));
305
+ const pkg = data.find((pkg: Package) => String(pkg.id) === String(pkgId));
251
306
  if (pkg) {
252
307
  pkgVersion = pkg.name;
253
308
  }
254
309
  }
255
310
 
256
- if (rollout) {
311
+ if (rollout !== undefined && pkgVersion) {
257
312
  await put(`/app/${appId}/version/${versionId}`, {
258
313
  config: {
259
314
  rollout: {
@@ -262,28 +317,47 @@ export const commands = {
262
317
  },
263
318
  });
264
319
  console.log(
265
- `已将在原生版本 ${pkgVersion} (id: ${pkgId}) 上设置灰度发布 ${rollout}% 热更版本 ${versionId} `,
320
+ `${t('rolloutConfigSet', {
321
+ versions: pkgVersion,
322
+ rollout: rollout,
323
+ })}`,
266
324
  );
267
325
  }
268
- await put(`/app/${appId}/package/${pkgId}`, {
269
- versionId,
270
- });
271
- console.log(
272
- `已将热更版本 ${versionId} 绑定到原生版本 ${pkgVersion} (id: ${pkgId})`,
273
- );
326
+
327
+ if (versionId !== undefined) {
328
+ await put(`/app/${appId}/package/${pkgId}`, {
329
+ versionId,
330
+ });
331
+ console.log(
332
+ `${t('versionBind', {
333
+ version: versionId,
334
+ nativeVersion: pkgVersion,
335
+ id: pkgId,
336
+ })}`,
337
+ );
338
+ }
339
+ console.log(t('operationSuccess'));
274
340
  },
275
- updateVersionInfo: async ({ args, options }) => {
341
+ updateVersionInfo: async ({
342
+ args,
343
+ options,
344
+ }: {
345
+ args: string[];
346
+ options: CommandOptions;
347
+ }) => {
276
348
  const platform = checkPlatform(
277
- options.platform || (await question('平台(ios/android/harmony):')),
349
+ options.platform ||
350
+ ((await question('平台(ios/android/harmony):')) as Platform),
278
351
  );
279
352
  const { appId } = await getSelectedApp(platform);
280
353
  const versionId = options.versionId || (await chooseVersion(appId)).id;
281
354
 
282
- const updateParams = {};
283
- options.name && (updateParams.name = options.name);
284
- options.description && (updateParams.description = options.description);
285
- options.metaInfo && (updateParams.metaInfo = options.metaInfo);
355
+ const updateParams: Record<string, string> = {};
356
+ if (options.name) updateParams.name = options.name;
357
+ if (options.description) updateParams.description = options.description;
358
+ if (options.metaInfo) updateParams.metaInfo = options.metaInfo;
359
+
286
360
  await put(`/app/${appId}/version/${versionId}`, updateParams);
287
- console.log('操作成功');
361
+ console.log(t('operationSuccess'));
288
362
  },
289
363
  };