Skip to content

Commit 2be3698

Browse files
committed
Restore package version bound semantics
1 parent 9d030a7 commit 2be3698

2 files changed

Lines changed: 69 additions & 21 deletions

File tree

src/versions.ts

Lines changed: 16 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -569,26 +569,25 @@ export const versionCommands = {
569569

570570
let pkgsToBind: Package[] = [];
571571

572-
if (minPkgVersion || maxPkgVersion) {
573-
minPkgVersion = minPkgVersion ? String(minPkgVersion).trim() : undefined;
574-
maxPkgVersion = maxPkgVersion ? String(maxPkgVersion).trim() : undefined;
572+
if (minPkgVersion) {
573+
minPkgVersion = String(minPkgVersion).trim();
574+
pkgsToBind = allPkgs.filter((pkg: Package) =>
575+
compare(pkg.name, minPkgVersion!, '>='),
576+
);
577+
if (pkgsToBind.length === 0) {
578+
throw new Error(
579+
t('nativeVersionNotFoundGte', { version: minPkgVersion }),
580+
);
581+
}
582+
} else if (maxPkgVersion) {
583+
maxPkgVersion = String(maxPkgVersion).trim();
575584
pkgsToBind = allPkgs.filter((pkg: Package) => {
576-
if (minPkgVersion && !compare(pkg.name, minPkgVersion, '>=')) {
577-
return false;
578-
}
579-
if (maxPkgVersion && !compare(pkg.name, maxPkgVersion, '<=')) {
580-
return false;
581-
}
582-
return true;
585+
return compare(pkg.name, maxPkgVersion!, '<=');
583586
});
584587
if (pkgsToBind.length === 0) {
585-
const range = [
586-
minPkgVersion && `>=${minPkgVersion}`,
587-
maxPkgVersion && `<=${maxPkgVersion}`,
588-
]
589-
.filter(Boolean)
590-
.join(' ');
591-
throw new Error(t('nativeVersionNotFoundMatch', { version: range }));
588+
throw new Error(
589+
t('nativeVersionNotFoundLte', { version: maxPkgVersion }),
590+
);
592591
}
593592
} else if (pkgVersion) {
594593
pkgVersion = pkgVersion.trim();

tests/versions.test.ts

Lines changed: 53 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -250,23 +250,22 @@ describe('versionCommands.update package range selection', () => {
250250
postSpy.mockRestore();
251251
});
252252

253-
test('applies minPackageVersion and maxPackageVersion together', async () => {
254-
const appId = 'range-app';
253+
test('applies minPackageVersion as a lower bound', async () => {
254+
const appId = 'min-app';
255255

256256
await versionCommands.update({
257257
options: {
258258
appId,
259259
versionId: '200',
260260
minPackageVersion: '1.1.0',
261-
maxPackageVersion: '1.2.0',
262261
},
263262
});
264263

265264
const bindingCalls = postSpy.mock.calls.filter(
266265
([url]) => url === `/app/${appId}/binding`,
267266
);
268267

269-
expect(bindingCalls).toHaveLength(2);
268+
expect(bindingCalls).toHaveLength(3);
270269
expect(bindingCalls[0]).toEqual([
271270
`/app/${appId}/binding`,
272271
{
@@ -283,6 +282,56 @@ describe('versionCommands.update package range selection', () => {
283282
packageId: '12',
284283
},
285284
]);
285+
expect(bindingCalls[2]).toEqual([
286+
`/app/${appId}/binding`,
287+
{
288+
versionId: '200',
289+
rollout: undefined,
290+
packageId: '13',
291+
},
292+
]);
293+
});
294+
295+
test('applies maxPackageVersion as an upper bound', async () => {
296+
const appId = 'max-app';
297+
298+
await versionCommands.update({
299+
options: {
300+
appId,
301+
versionId: '200',
302+
maxPackageVersion: '1.2.0',
303+
},
304+
});
305+
306+
const bindingCalls = postSpy.mock.calls.filter(
307+
([url]) => url === `/app/${appId}/binding`,
308+
);
309+
310+
expect(bindingCalls).toHaveLength(3);
311+
expect(bindingCalls[0]).toEqual([
312+
`/app/${appId}/binding`,
313+
{
314+
versionId: '200',
315+
rollout: undefined,
316+
packageId: '10',
317+
},
318+
]);
319+
expect(bindingCalls[1]).toEqual([
320+
`/app/${appId}/binding`,
321+
{
322+
versionId: '200',
323+
rollout: undefined,
324+
packageId: '11',
325+
},
326+
]);
327+
expect(bindingCalls[2]).toEqual([
328+
`/app/${appId}/binding`,
329+
{
330+
versionId: '200',
331+
rollout: undefined,
332+
packageId: '12',
333+
},
334+
]);
286335
});
287336

288337
test('fails instead of prompting for package id in non-interactive mode', async () => {

0 commit comments

Comments
 (0)