Skip to content

Commit 57cdf15

Browse files
Merge pull request #29133 from storybookjs/valentin/fix-skip-install-installation
CLI: Fix skip-install for stable latest releases
2 parents ea27938 + 20c0b10 commit 57cdf15

File tree

3 files changed

+62
-6
lines changed

3 files changed

+62
-6
lines changed

.circleci/config.yml

+2
Original file line numberDiff line numberDiff line change
@@ -628,6 +628,8 @@ jobs:
628628
mkdir empty-<< parameters.template >>-no-install
629629
cd empty-<< parameters.template >>-no-install
630630
npx storybook init --yes --skip-install
631+
npm install
632+
npm run build-storybook
631633
environment:
632634
IN_STORYBOOK_SANDBOX: true
633635
STORYBOOK_INIT_EMPTY_TYPE: << parameters.template >>
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
import { beforeEach, describe, expect, it, vi } from 'vitest';
2+
3+
import { JsPackageManager } from './JsPackageManager';
4+
5+
vi.mock('../versions', () => ({
6+
default: {
7+
'@storybook/react': '8.3.0',
8+
},
9+
}));
10+
11+
describe('JsPackageManager', () => {
12+
let jsPackageManager: JsPackageManager;
13+
let mockLatestVersion: ReturnType<typeof vi.fn>;
14+
let mockStorybookPackagesVersions: Record<string, string>;
15+
16+
beforeEach(() => {
17+
mockLatestVersion = vi.fn();
18+
mockStorybookPackagesVersions = {
19+
'@storybook/react': '8.3.0',
20+
};
21+
22+
// @ts-expect-error Ignore abstract class error
23+
jsPackageManager = new JsPackageManager();
24+
jsPackageManager.latestVersion = mockLatestVersion;
25+
26+
vi.clearAllMocks();
27+
});
28+
29+
describe('getVersionedPackages method', () => {
30+
it('should return the latest stable release version when current version is the latest stable release', async () => {
31+
mockLatestVersion.mockResolvedValue('8.3.0');
32+
33+
const result = await jsPackageManager.getVersionedPackages(['@storybook/react']);
34+
35+
expect(result).toEqual(['@storybook/react@^8.3.0']);
36+
});
37+
38+
it('should return the current version when it is not the latest stable release', async () => {
39+
mockLatestVersion.mockResolvedValue('8.3.1');
40+
41+
const result = await jsPackageManager.getVersionedPackages(['@storybook/react']);
42+
43+
expect(result).toEqual(['@storybook/[email protected]']);
44+
});
45+
46+
it('should return the latest stable release version when there is no current version', async () => {
47+
mockLatestVersion.mockResolvedValue('2.0.0');
48+
49+
const result = await jsPackageManager.getVersionedPackages(['@storybook/new-addon@^8.3.0']);
50+
51+
expect(result).toEqual(['@storybook/new-addon@^2.0.0']);
52+
});
53+
});
54+
});

code/core/src/common/js-package-manager/JsPackageManager.ts

+6-6
Original file line numberDiff line numberDiff line change
@@ -337,13 +337,13 @@ export abstract class JsPackageManager {
337337
const k = packageName as keyof typeof storybookPackagesVersions;
338338
const currentVersion = storybookPackagesVersions[k];
339339

340-
if (currentVersion === latestInRange) {
341-
return `${packageName}`;
342-
}
343-
if (currentVersion) {
344-
return `${packageName}@${currentVersion}`;
340+
const isLatestStableRelease = currentVersion === latestInRange;
341+
342+
if (isLatestStableRelease || !currentVersion) {
343+
return `${packageName}@^${latestInRange}`;
345344
}
346-
return `${packageName}@^${latestInRange}`;
345+
346+
return `${packageName}@${currentVersion}`;
347347
})
348348
);
349349
}

0 commit comments

Comments
 (0)