react-native-update-cli 2.8.4 → 2.8.5
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/locales/en.js +11 -0
- package/lib/locales/zh.js +11 -0
- package/lib/versions.js +186 -2
- package/package.json +1 -1
- package/src/locales/en.ts +15 -0
- package/src/locales/zh.ts +13 -0
- package/src/types.ts +2 -0
- package/src/versions.ts +265 -2
package/lib/locales/en.js
CHANGED
|
@@ -82,6 +82,17 @@ This can reduce the risk of inconsistent dependencies and supply chain attacks.
|
|
|
82
82
|
operationSuccess: 'Operation successful',
|
|
83
83
|
packageIdRequired: 'Please provide packageId or packageVersion parameter',
|
|
84
84
|
packageUploadSuccess: 'Successfully uploaded new hot update package (id: {{id}})',
|
|
85
|
+
depsChangeSummary: 'Dependency changes: added {{added}}, removed {{removed}}, changed {{changed}}.',
|
|
86
|
+
depsChangeTargetPackage: 'Target native package: {{packageName}} (id: {{packageId}})',
|
|
87
|
+
depsChangeDependencyHeader: 'Dependency',
|
|
88
|
+
depsChangeVersionHeader: 'Version change',
|
|
89
|
+
depsChangeAddedLabel: 'Added',
|
|
90
|
+
depsChangeRemovedLabel: 'Removed',
|
|
91
|
+
depsChangeChangedLabel: 'Changed',
|
|
92
|
+
depsChangeArrow: '->',
|
|
93
|
+
depsChangeRiskWarning: 'Warning: if changed dependencies are pure JS modules, impact is usually low; if native code is newly introduced or changed, OTA update may cause abnormal behavior or even crashes. Test thoroughly before production release.',
|
|
94
|
+
depsChangeFetchFailed: 'Failed to fetch OTA dependency info: {{error}}',
|
|
95
|
+
depsChangeNonBlockingHint: 'This is only a dependency change warning and will not block publishing.',
|
|
85
96
|
packing: 'Packing',
|
|
86
97
|
pausedStatus: '(Paused)',
|
|
87
98
|
platform: 'Platform',
|
package/lib/locales/zh.js
CHANGED
|
@@ -82,6 +82,17 @@ const _default = {
|
|
|
82
82
|
operationSuccess: '操作成功',
|
|
83
83
|
packageIdRequired: '请提供 packageId 或 packageVersion 参数',
|
|
84
84
|
packageUploadSuccess: '已成功上传新热更包(id: {{id}})',
|
|
85
|
+
depsChangeSummary: '依赖变化:新增 {{added}} 项,移除 {{removed}} 项,版本变更 {{changed}} 项。',
|
|
86
|
+
depsChangeTargetPackage: '目标原生包:{{packageName}} (id: {{packageId}})',
|
|
87
|
+
depsChangeDependencyHeader: '依赖',
|
|
88
|
+
depsChangeVersionHeader: '版本变化',
|
|
89
|
+
depsChangeAddedLabel: '新增',
|
|
90
|
+
depsChangeRemovedLabel: '移除',
|
|
91
|
+
depsChangeChangedLabel: '变更',
|
|
92
|
+
depsChangeArrow: '->',
|
|
93
|
+
depsChangeRiskWarning: '警告:如果变更依赖是纯 JS 模块,则一般没有影响;若包含原生代码新增或变化,热更可能导致功能不正常甚至闪退,建议发布前使用扫码功能完整测试。',
|
|
94
|
+
depsChangeFetchFailed: '获取热更依赖信息失败:{{error}}',
|
|
95
|
+
depsChangeNonBlockingHint: '以上仅为依赖变化提示,不会阻止本次发布。',
|
|
85
96
|
packing: '正在打包',
|
|
86
97
|
pausedStatus: '(已暂停)',
|
|
87
98
|
platform: '平台',
|
package/lib/versions.js
CHANGED
|
@@ -21,6 +21,7 @@ const _utils = require("./utils");
|
|
|
21
21
|
const _i18n = require("./utils/i18n");
|
|
22
22
|
const _chalk = /*#__PURE__*/ _interop_require_default(require("chalk"));
|
|
23
23
|
const _compareversions = require("compare-versions");
|
|
24
|
+
const _ttytable = /*#__PURE__*/ _interop_require_default(require("tty-table"));
|
|
24
25
|
const _app = require("./app");
|
|
25
26
|
const _package = require("./package");
|
|
26
27
|
const _depversions = require("./utils/dep-versions");
|
|
@@ -30,6 +31,181 @@ function _interop_require_default(obj) {
|
|
|
30
31
|
default: obj
|
|
31
32
|
};
|
|
32
33
|
}
|
|
34
|
+
function normalizeDeps(input) {
|
|
35
|
+
if (!input) {
|
|
36
|
+
return undefined;
|
|
37
|
+
}
|
|
38
|
+
let raw = input;
|
|
39
|
+
if (typeof input === 'string') {
|
|
40
|
+
try {
|
|
41
|
+
raw = JSON.parse(input);
|
|
42
|
+
} catch (_e) {
|
|
43
|
+
return undefined;
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
if (!raw || typeof raw !== 'object' || Array.isArray(raw)) {
|
|
47
|
+
return undefined;
|
|
48
|
+
}
|
|
49
|
+
const deps = {};
|
|
50
|
+
for (const [name, version] of Object.entries(raw)){
|
|
51
|
+
if (typeof version === 'string' && version) {
|
|
52
|
+
deps[name] = version;
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
return Object.keys(deps).length > 0 ? deps : undefined;
|
|
56
|
+
}
|
|
57
|
+
function getDepsChanges(oldDeps, newDeps) {
|
|
58
|
+
if (!oldDeps || !newDeps) {
|
|
59
|
+
return [];
|
|
60
|
+
}
|
|
61
|
+
const rows = [];
|
|
62
|
+
const keys = Object.keys({
|
|
63
|
+
...oldDeps,
|
|
64
|
+
...newDeps
|
|
65
|
+
}).sort((a, b)=>a.localeCompare(b));
|
|
66
|
+
for (const key of keys){
|
|
67
|
+
const oldVersion = oldDeps[key];
|
|
68
|
+
const newVersion = newDeps[key];
|
|
69
|
+
if (oldVersion === undefined && newVersion !== undefined) {
|
|
70
|
+
rows.push({
|
|
71
|
+
dependency: key,
|
|
72
|
+
oldVersion: '-',
|
|
73
|
+
newVersion,
|
|
74
|
+
type: 'added'
|
|
75
|
+
});
|
|
76
|
+
continue;
|
|
77
|
+
}
|
|
78
|
+
if (oldVersion !== undefined && newVersion === undefined) {
|
|
79
|
+
rows.push({
|
|
80
|
+
dependency: key,
|
|
81
|
+
oldVersion,
|
|
82
|
+
newVersion: '-',
|
|
83
|
+
type: 'removed'
|
|
84
|
+
});
|
|
85
|
+
continue;
|
|
86
|
+
}
|
|
87
|
+
if (oldVersion !== undefined && newVersion !== undefined && oldVersion !== newVersion) {
|
|
88
|
+
rows.push({
|
|
89
|
+
dependency: key,
|
|
90
|
+
oldVersion,
|
|
91
|
+
newVersion,
|
|
92
|
+
type: 'changed'
|
|
93
|
+
});
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
return rows;
|
|
97
|
+
}
|
|
98
|
+
function getDepsChangeSummary(changes) {
|
|
99
|
+
return changes.reduce((acc, item)=>{
|
|
100
|
+
if (item.type === 'added') {
|
|
101
|
+
acc.added += 1;
|
|
102
|
+
} else if (item.type === 'removed') {
|
|
103
|
+
acc.removed += 1;
|
|
104
|
+
} else {
|
|
105
|
+
acc.changed += 1;
|
|
106
|
+
}
|
|
107
|
+
return acc;
|
|
108
|
+
}, {
|
|
109
|
+
added: 0,
|
|
110
|
+
removed: 0,
|
|
111
|
+
changed: 0
|
|
112
|
+
});
|
|
113
|
+
}
|
|
114
|
+
function renderVersionChange(change) {
|
|
115
|
+
const arrow = _chalk.default.gray(` ${(0, _i18n.t)('depsChangeArrow')} `);
|
|
116
|
+
if (change.type === 'added') {
|
|
117
|
+
return `${_chalk.default.red((0, _i18n.t)('depsChangeAddedLabel'))} | ${_chalk.default.gray(change.oldVersion)}${arrow}${_chalk.default.red(change.newVersion)}`;
|
|
118
|
+
}
|
|
119
|
+
if (change.type === 'removed') {
|
|
120
|
+
return `${_chalk.default.green((0, _i18n.t)('depsChangeRemovedLabel'))} | ${_chalk.default.green(change.oldVersion)}${arrow}${_chalk.default.gray(change.newVersion)}`;
|
|
121
|
+
}
|
|
122
|
+
return `${_chalk.default.yellow((0, _i18n.t)('depsChangeChangedLabel'))} | ${_chalk.default.yellow(change.oldVersion)}${arrow}${_chalk.default.yellow(change.newVersion)}`;
|
|
123
|
+
}
|
|
124
|
+
function printDepsChangesForPackage({ pkg, versionDeps }) {
|
|
125
|
+
const pkgDeps = normalizeDeps(pkg.deps);
|
|
126
|
+
if (!pkgDeps) {
|
|
127
|
+
return false;
|
|
128
|
+
}
|
|
129
|
+
const changes = getDepsChanges(pkgDeps, versionDeps);
|
|
130
|
+
if (changes.length === 0) {
|
|
131
|
+
return false;
|
|
132
|
+
}
|
|
133
|
+
const summary = getDepsChangeSummary(changes);
|
|
134
|
+
const summaryText = (0, _i18n.t)('depsChangeSummary', {
|
|
135
|
+
added: _chalk.default.red(String(summary.added)),
|
|
136
|
+
removed: _chalk.default.green(String(summary.removed)),
|
|
137
|
+
changed: _chalk.default.yellow(String(summary.changed))
|
|
138
|
+
});
|
|
139
|
+
const header = [
|
|
140
|
+
{
|
|
141
|
+
value: (0, _i18n.t)('depsChangeDependencyHeader')
|
|
142
|
+
},
|
|
143
|
+
{
|
|
144
|
+
value: (0, _i18n.t)('depsChangeVersionHeader')
|
|
145
|
+
}
|
|
146
|
+
];
|
|
147
|
+
const rows = changes.map((change)=>[
|
|
148
|
+
change.dependency,
|
|
149
|
+
renderVersionChange(change)
|
|
150
|
+
]);
|
|
151
|
+
console.log('');
|
|
152
|
+
console.log(_chalk.default.yellow((0, _i18n.t)('depsChangeTargetPackage', {
|
|
153
|
+
packageName: pkg.name,
|
|
154
|
+
packageId: pkg.id
|
|
155
|
+
})));
|
|
156
|
+
console.log(summaryText);
|
|
157
|
+
console.log((0, _ttytable.default)(header, rows).render());
|
|
158
|
+
console.log(_chalk.default.yellow((0, _i18n.t)('depsChangeRiskWarning')));
|
|
159
|
+
return true;
|
|
160
|
+
}
|
|
161
|
+
async function findVersionDeps(appId, versionId) {
|
|
162
|
+
const targetId = String(versionId);
|
|
163
|
+
const limit = 100;
|
|
164
|
+
let offset = 0;
|
|
165
|
+
while(true){
|
|
166
|
+
const { data, count } = await (0, _api.get)(`/app/${appId}/version/list?offset=${offset}&limit=${limit}`);
|
|
167
|
+
const versions = Array.isArray(data) ? data : [];
|
|
168
|
+
const version = versions.find((item)=>String(item.id) === targetId);
|
|
169
|
+
if (version) {
|
|
170
|
+
return normalizeDeps(version.deps);
|
|
171
|
+
}
|
|
172
|
+
offset += versions.length;
|
|
173
|
+
if (versions.length === 0 || offset >= Number(count || 0)) {
|
|
174
|
+
break;
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
return undefined;
|
|
178
|
+
}
|
|
179
|
+
async function printDepsChangesForPublish({ appId, versionId, pkgs, providedVersionDeps }) {
|
|
180
|
+
if (!versionId || pkgs.length === 0) {
|
|
181
|
+
return;
|
|
182
|
+
}
|
|
183
|
+
let versionDeps = normalizeDeps(providedVersionDeps);
|
|
184
|
+
if (!versionDeps) {
|
|
185
|
+
try {
|
|
186
|
+
versionDeps = await findVersionDeps(appId, versionId);
|
|
187
|
+
} catch (error) {
|
|
188
|
+
console.warn(_chalk.default.yellow((0, _i18n.t)('depsChangeFetchFailed', {
|
|
189
|
+
error: (error == null ? void 0 : error.message) || String(error)
|
|
190
|
+
})));
|
|
191
|
+
return;
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
if (!versionDeps) {
|
|
195
|
+
return;
|
|
196
|
+
}
|
|
197
|
+
let hasChanges = false;
|
|
198
|
+
for (const pkg of pkgs){
|
|
199
|
+
const printed = printDepsChangesForPackage({
|
|
200
|
+
pkg,
|
|
201
|
+
versionDeps
|
|
202
|
+
});
|
|
203
|
+
hasChanges = hasChanges || printed;
|
|
204
|
+
}
|
|
205
|
+
if (hasChanges) {
|
|
206
|
+
console.log(_chalk.default.yellow((0, _i18n.t)('depsChangeNonBlockingHint')));
|
|
207
|
+
}
|
|
208
|
+
}
|
|
33
209
|
async function showVersion(appId, offset) {
|
|
34
210
|
const { data, count } = await (0, _api.get)(`/app/${appId}/version/list`);
|
|
35
211
|
console.log((0, _i18n.t)('offset', {
|
|
@@ -164,7 +340,8 @@ const versionCommands = {
|
|
|
164
340
|
minPackageVersion,
|
|
165
341
|
maxPackageVersion,
|
|
166
342
|
rollout,
|
|
167
|
-
dryRun
|
|
343
|
+
dryRun,
|
|
344
|
+
versionDeps: _depversions.depVersions
|
|
168
345
|
}
|
|
169
346
|
});
|
|
170
347
|
} else {
|
|
@@ -173,7 +350,8 @@ const versionCommands = {
|
|
|
173
350
|
await this.update({
|
|
174
351
|
options: {
|
|
175
352
|
versionId: id,
|
|
176
|
-
platform
|
|
353
|
+
platform,
|
|
354
|
+
versionDeps: _depversions.depVersions
|
|
177
355
|
}
|
|
178
356
|
});
|
|
179
357
|
}
|
|
@@ -269,6 +447,12 @@ const versionCommands = {
|
|
|
269
447
|
}));
|
|
270
448
|
}
|
|
271
449
|
}
|
|
450
|
+
await printDepsChangesForPublish({
|
|
451
|
+
appId,
|
|
452
|
+
versionId,
|
|
453
|
+
pkgs: pkgsToBind,
|
|
454
|
+
providedVersionDeps: options.versionDeps
|
|
455
|
+
});
|
|
272
456
|
await bindVersionToPackages({
|
|
273
457
|
appId,
|
|
274
458
|
versionId,
|
package/package.json
CHANGED
package/src/locales/en.ts
CHANGED
|
@@ -96,6 +96,21 @@ This can reduce the risk of inconsistent dependencies and supply chain attacks.
|
|
|
96
96
|
packageIdRequired: 'Please provide packageId or packageVersion parameter',
|
|
97
97
|
packageUploadSuccess:
|
|
98
98
|
'Successfully uploaded new hot update package (id: {{id}})',
|
|
99
|
+
depsChangeSummary:
|
|
100
|
+
'Dependency changes: added {{added}}, removed {{removed}}, changed {{changed}}.',
|
|
101
|
+
depsChangeTargetPackage:
|
|
102
|
+
'Target native package: {{packageName}} (id: {{packageId}})',
|
|
103
|
+
depsChangeDependencyHeader: 'Dependency',
|
|
104
|
+
depsChangeVersionHeader: 'Version change',
|
|
105
|
+
depsChangeAddedLabel: 'Added',
|
|
106
|
+
depsChangeRemovedLabel: 'Removed',
|
|
107
|
+
depsChangeChangedLabel: 'Changed',
|
|
108
|
+
depsChangeArrow: '->',
|
|
109
|
+
depsChangeRiskWarning:
|
|
110
|
+
'Warning: if changed dependencies are pure JS modules, impact is usually low; if native code is newly introduced or changed, OTA update may cause abnormal behavior or even crashes. Test thoroughly before production release.',
|
|
111
|
+
depsChangeFetchFailed: 'Failed to fetch OTA dependency info: {{error}}',
|
|
112
|
+
depsChangeNonBlockingHint:
|
|
113
|
+
'This is only a dependency change warning and will not block publishing.',
|
|
99
114
|
packing: 'Packing',
|
|
100
115
|
pausedStatus: '(Paused)',
|
|
101
116
|
platform: 'Platform',
|
package/src/locales/zh.ts
CHANGED
|
@@ -89,6 +89,19 @@ export default {
|
|
|
89
89
|
operationSuccess: '操作成功',
|
|
90
90
|
packageIdRequired: '请提供 packageId 或 packageVersion 参数',
|
|
91
91
|
packageUploadSuccess: '已成功上传新热更包(id: {{id}})',
|
|
92
|
+
depsChangeSummary:
|
|
93
|
+
'依赖变化:新增 {{added}} 项,移除 {{removed}} 项,版本变更 {{changed}} 项。',
|
|
94
|
+
depsChangeTargetPackage: '目标原生包:{{packageName}} (id: {{packageId}})',
|
|
95
|
+
depsChangeDependencyHeader: '依赖',
|
|
96
|
+
depsChangeVersionHeader: '版本变化',
|
|
97
|
+
depsChangeAddedLabel: '新增',
|
|
98
|
+
depsChangeRemovedLabel: '移除',
|
|
99
|
+
depsChangeChangedLabel: '变更',
|
|
100
|
+
depsChangeArrow: '->',
|
|
101
|
+
depsChangeRiskWarning:
|
|
102
|
+
'警告:如果变更依赖是纯 JS 模块,则一般没有影响;若包含原生代码新增或变化,热更可能导致功能不正常甚至闪退,建议发布前使用扫码功能完整测试。',
|
|
103
|
+
depsChangeFetchFailed: '获取热更依赖信息失败:{{error}}',
|
|
104
|
+
depsChangeNonBlockingHint: '以上仅为依赖变化提示,不会阻止本次发布。',
|
|
92
105
|
packing: '正在打包',
|
|
93
106
|
pausedStatus: '(已暂停)',
|
|
94
107
|
platform: '平台',
|
package/src/types.ts
CHANGED
|
@@ -18,6 +18,7 @@ export interface Package {
|
|
|
18
18
|
appKey?: string;
|
|
19
19
|
versionName?: any;
|
|
20
20
|
buildTime?: any;
|
|
21
|
+
deps?: Record<string, string> | string | null;
|
|
21
22
|
}
|
|
22
23
|
|
|
23
24
|
export interface Version {
|
|
@@ -25,6 +26,7 @@ export interface Version {
|
|
|
25
26
|
hash: string;
|
|
26
27
|
name: string;
|
|
27
28
|
packages?: Package[];
|
|
29
|
+
deps?: Record<string, string> | string | null;
|
|
28
30
|
}
|
|
29
31
|
|
|
30
32
|
export interface CommandContext {
|
package/src/versions.ts
CHANGED
|
@@ -1,9 +1,10 @@
|
|
|
1
|
-
import { get, getAllPackages, post, put, uploadFile
|
|
1
|
+
import { doDelete, get, getAllPackages, post, put, uploadFile } from './api';
|
|
2
2
|
import { question, saveToLocal } from './utils';
|
|
3
3
|
import { t } from './utils/i18n';
|
|
4
4
|
|
|
5
5
|
import chalk from 'chalk';
|
|
6
6
|
import { satisfies } from 'compare-versions';
|
|
7
|
+
import Table from 'tty-table';
|
|
7
8
|
import { getPlatform, getSelectedApp } from './app';
|
|
8
9
|
import { choosePackage } from './package';
|
|
9
10
|
import type { Package, Platform, Version } from './types';
|
|
@@ -24,6 +25,258 @@ interface VersionCommandOptions {
|
|
|
24
25
|
packageVersionRange?: string;
|
|
25
26
|
rollout?: string;
|
|
26
27
|
dryRun?: boolean;
|
|
28
|
+
versionDeps?: Record<string, string>;
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
type Deps = Record<string, string>;
|
|
32
|
+
type DepChangeType = 'added' | 'removed' | 'changed';
|
|
33
|
+
|
|
34
|
+
interface DepChange {
|
|
35
|
+
dependency: string;
|
|
36
|
+
oldVersion: string;
|
|
37
|
+
newVersion: string;
|
|
38
|
+
type: DepChangeType;
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
interface DepsChangeSummary {
|
|
42
|
+
added: number;
|
|
43
|
+
removed: number;
|
|
44
|
+
changed: number;
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
function normalizeDeps(input: unknown): Deps | undefined {
|
|
48
|
+
if (!input) {
|
|
49
|
+
return undefined;
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
let raw: unknown = input;
|
|
53
|
+
if (typeof input === 'string') {
|
|
54
|
+
try {
|
|
55
|
+
raw = JSON.parse(input);
|
|
56
|
+
} catch (_e) {
|
|
57
|
+
return undefined;
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
if (!raw || typeof raw !== 'object' || Array.isArray(raw)) {
|
|
62
|
+
return undefined;
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
const deps: Deps = {};
|
|
66
|
+
for (const [name, version] of Object.entries(
|
|
67
|
+
raw as Record<string, unknown>,
|
|
68
|
+
)) {
|
|
69
|
+
if (typeof version === 'string' && version) {
|
|
70
|
+
deps[name] = version;
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
return Object.keys(deps).length > 0 ? deps : undefined;
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
function getDepsChanges(oldDeps?: Deps, newDeps?: Deps): DepChange[] {
|
|
78
|
+
if (!oldDeps || !newDeps) {
|
|
79
|
+
return [];
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
const rows: DepChange[] = [];
|
|
83
|
+
const keys = Object.keys({ ...oldDeps, ...newDeps }).sort((a, b) =>
|
|
84
|
+
a.localeCompare(b),
|
|
85
|
+
);
|
|
86
|
+
|
|
87
|
+
for (const key of keys) {
|
|
88
|
+
const oldVersion = oldDeps[key];
|
|
89
|
+
const newVersion = newDeps[key];
|
|
90
|
+
|
|
91
|
+
if (oldVersion === undefined && newVersion !== undefined) {
|
|
92
|
+
rows.push({
|
|
93
|
+
dependency: key,
|
|
94
|
+
oldVersion: '-',
|
|
95
|
+
newVersion,
|
|
96
|
+
type: 'added',
|
|
97
|
+
});
|
|
98
|
+
continue;
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
if (oldVersion !== undefined && newVersion === undefined) {
|
|
102
|
+
rows.push({
|
|
103
|
+
dependency: key,
|
|
104
|
+
oldVersion,
|
|
105
|
+
newVersion: '-',
|
|
106
|
+
type: 'removed',
|
|
107
|
+
});
|
|
108
|
+
continue;
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
if (
|
|
112
|
+
oldVersion !== undefined &&
|
|
113
|
+
newVersion !== undefined &&
|
|
114
|
+
oldVersion !== newVersion
|
|
115
|
+
) {
|
|
116
|
+
rows.push({
|
|
117
|
+
dependency: key,
|
|
118
|
+
oldVersion,
|
|
119
|
+
newVersion,
|
|
120
|
+
type: 'changed',
|
|
121
|
+
});
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
return rows;
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
function getDepsChangeSummary(changes: DepChange[]): DepsChangeSummary {
|
|
129
|
+
return changes.reduce(
|
|
130
|
+
(acc, item) => {
|
|
131
|
+
if (item.type === 'added') {
|
|
132
|
+
acc.added += 1;
|
|
133
|
+
} else if (item.type === 'removed') {
|
|
134
|
+
acc.removed += 1;
|
|
135
|
+
} else {
|
|
136
|
+
acc.changed += 1;
|
|
137
|
+
}
|
|
138
|
+
return acc;
|
|
139
|
+
},
|
|
140
|
+
{ added: 0, removed: 0, changed: 0 },
|
|
141
|
+
);
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
function renderVersionChange(change: DepChange) {
|
|
145
|
+
const arrow = chalk.gray(` ${t('depsChangeArrow')} `);
|
|
146
|
+
|
|
147
|
+
if (change.type === 'added') {
|
|
148
|
+
return `${chalk.red(t('depsChangeAddedLabel'))} | ${chalk.gray(
|
|
149
|
+
change.oldVersion,
|
|
150
|
+
)}${arrow}${chalk.red(change.newVersion)}`;
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
if (change.type === 'removed') {
|
|
154
|
+
return `${chalk.green(t('depsChangeRemovedLabel'))} | ${chalk.green(
|
|
155
|
+
change.oldVersion,
|
|
156
|
+
)}${arrow}${chalk.gray(change.newVersion)}`;
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
return `${chalk.yellow(t('depsChangeChangedLabel'))} | ${chalk.yellow(
|
|
160
|
+
change.oldVersion,
|
|
161
|
+
)}${arrow}${chalk.yellow(change.newVersion)}`;
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
function printDepsChangesForPackage({
|
|
165
|
+
pkg,
|
|
166
|
+
versionDeps,
|
|
167
|
+
}: {
|
|
168
|
+
pkg: Package;
|
|
169
|
+
versionDeps: Deps;
|
|
170
|
+
}) {
|
|
171
|
+
const pkgDeps = normalizeDeps(pkg.deps);
|
|
172
|
+
if (!pkgDeps) {
|
|
173
|
+
return false;
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
const changes = getDepsChanges(pkgDeps, versionDeps);
|
|
177
|
+
if (changes.length === 0) {
|
|
178
|
+
return false;
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
const summary = getDepsChangeSummary(changes);
|
|
182
|
+
const summaryText = t('depsChangeSummary', {
|
|
183
|
+
added: chalk.red(String(summary.added)),
|
|
184
|
+
removed: chalk.green(String(summary.removed)),
|
|
185
|
+
changed: chalk.yellow(String(summary.changed)),
|
|
186
|
+
});
|
|
187
|
+
const header = [
|
|
188
|
+
{ value: t('depsChangeDependencyHeader') },
|
|
189
|
+
{ value: t('depsChangeVersionHeader') },
|
|
190
|
+
];
|
|
191
|
+
const rows = changes.map((change) => [
|
|
192
|
+
change.dependency,
|
|
193
|
+
renderVersionChange(change),
|
|
194
|
+
]);
|
|
195
|
+
|
|
196
|
+
console.log('');
|
|
197
|
+
console.log(
|
|
198
|
+
chalk.yellow(
|
|
199
|
+
t('depsChangeTargetPackage', {
|
|
200
|
+
packageName: pkg.name,
|
|
201
|
+
packageId: pkg.id,
|
|
202
|
+
}),
|
|
203
|
+
),
|
|
204
|
+
);
|
|
205
|
+
console.log(summaryText);
|
|
206
|
+
console.log(Table(header, rows).render());
|
|
207
|
+
console.log(chalk.yellow(t('depsChangeRiskWarning')));
|
|
208
|
+
return true;
|
|
209
|
+
}
|
|
210
|
+
|
|
211
|
+
async function findVersionDeps(appId: string, versionId: string) {
|
|
212
|
+
const targetId = String(versionId);
|
|
213
|
+
const limit = 100;
|
|
214
|
+
let offset = 0;
|
|
215
|
+
|
|
216
|
+
while (true) {
|
|
217
|
+
const { data, count } = await get(
|
|
218
|
+
`/app/${appId}/version/list?offset=${offset}&limit=${limit}`,
|
|
219
|
+
);
|
|
220
|
+
const versions: Version[] = Array.isArray(data) ? data : [];
|
|
221
|
+
const version = versions.find((item) => String(item.id) === targetId);
|
|
222
|
+
|
|
223
|
+
if (version) {
|
|
224
|
+
return normalizeDeps(version.deps);
|
|
225
|
+
}
|
|
226
|
+
|
|
227
|
+
offset += versions.length;
|
|
228
|
+
if (versions.length === 0 || offset >= Number(count || 0)) {
|
|
229
|
+
break;
|
|
230
|
+
}
|
|
231
|
+
}
|
|
232
|
+
|
|
233
|
+
return undefined;
|
|
234
|
+
}
|
|
235
|
+
|
|
236
|
+
async function printDepsChangesForPublish({
|
|
237
|
+
appId,
|
|
238
|
+
versionId,
|
|
239
|
+
pkgs,
|
|
240
|
+
providedVersionDeps,
|
|
241
|
+
}: {
|
|
242
|
+
appId: string;
|
|
243
|
+
versionId?: string;
|
|
244
|
+
pkgs: Package[];
|
|
245
|
+
providedVersionDeps?: Deps;
|
|
246
|
+
}) {
|
|
247
|
+
if (!versionId || pkgs.length === 0) {
|
|
248
|
+
return;
|
|
249
|
+
}
|
|
250
|
+
|
|
251
|
+
let versionDeps = normalizeDeps(providedVersionDeps);
|
|
252
|
+
if (!versionDeps) {
|
|
253
|
+
try {
|
|
254
|
+
versionDeps = await findVersionDeps(appId, versionId);
|
|
255
|
+
} catch (error: any) {
|
|
256
|
+
console.warn(
|
|
257
|
+
chalk.yellow(
|
|
258
|
+
t('depsChangeFetchFailed', {
|
|
259
|
+
error: error?.message || String(error),
|
|
260
|
+
}),
|
|
261
|
+
),
|
|
262
|
+
);
|
|
263
|
+
return;
|
|
264
|
+
}
|
|
265
|
+
}
|
|
266
|
+
|
|
267
|
+
if (!versionDeps) {
|
|
268
|
+
return;
|
|
269
|
+
}
|
|
270
|
+
|
|
271
|
+
let hasChanges = false;
|
|
272
|
+
for (const pkg of pkgs) {
|
|
273
|
+
const printed = printDepsChangesForPackage({ pkg, versionDeps });
|
|
274
|
+
hasChanges = hasChanges || printed;
|
|
275
|
+
}
|
|
276
|
+
|
|
277
|
+
if (hasChanges) {
|
|
278
|
+
console.log(chalk.yellow(t('depsChangeNonBlockingHint')));
|
|
279
|
+
}
|
|
27
280
|
}
|
|
28
281
|
|
|
29
282
|
async function showVersion(appId: string, offset: number) {
|
|
@@ -211,12 +464,15 @@ export const versionCommands = {
|
|
|
211
464
|
maxPackageVersion,
|
|
212
465
|
rollout,
|
|
213
466
|
dryRun,
|
|
467
|
+
versionDeps: depVersions,
|
|
214
468
|
},
|
|
215
469
|
});
|
|
216
470
|
} else {
|
|
217
471
|
const q = await question(t('updateNativePackageQuestion'));
|
|
218
472
|
if (q.toLowerCase() === 'y') {
|
|
219
|
-
await this.update({
|
|
473
|
+
await this.update({
|
|
474
|
+
options: { versionId: id, platform, versionDeps: depVersions },
|
|
475
|
+
});
|
|
220
476
|
}
|
|
221
477
|
}
|
|
222
478
|
return versionName;
|
|
@@ -318,6 +574,13 @@ export const versionCommands = {
|
|
|
318
574
|
}
|
|
319
575
|
}
|
|
320
576
|
|
|
577
|
+
await printDepsChangesForPublish({
|
|
578
|
+
appId,
|
|
579
|
+
versionId,
|
|
580
|
+
pkgs: pkgsToBind,
|
|
581
|
+
providedVersionDeps: options.versionDeps,
|
|
582
|
+
});
|
|
583
|
+
|
|
321
584
|
await bindVersionToPackages({
|
|
322
585
|
appId,
|
|
323
586
|
versionId,
|