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 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
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "react-native-update-cli",
3
- "version": "2.8.4",
3
+ "version": "2.8.5",
4
4
  "description": "command line tool for react-native-update (remote updates for react native)",
5
5
  "main": "index.js",
6
6
  "bin": {
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, doDelete } from './api';
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({ options: { versionId: id, platform } });
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,