Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

CLI: Log UpgradeStorybookToSameVersionError but continue upgrade as normal #27217

Merged
merged 6 commits into from
Jun 5, 2024
22 changes: 15 additions & 7 deletions code/lib/cli/src/upgrade.test.ts
Original file line number Diff line number Diff line change
@@ -1,10 +1,8 @@
import { describe, it, expect, vi } from 'vitest';
import { describe, expect, it, vi } from 'vitest';
import * as sbcc from '@storybook/core-common';
import {
UpgradeStorybookToLowerVersionError,
UpgradeStorybookToSameVersionError,
} from '@storybook/core-events/server-errors';
import { UpgradeStorybookToLowerVersionError } from '@storybook/core-events/server-errors';
import { doUpgrade, getStorybookVersion } from './upgrade';
import { logger } from '@storybook/node-logger';

const findInstallationsMock = vi.fn<string[], Promise<sbcc.InstallationMetadata | undefined>>();

Expand All @@ -16,6 +14,8 @@ vi.mock('@storybook/core-common', async (importOriginal) => {
JsPackageManagerFactory: {
getPackageManager: () => ({
findInstallations: findInstallationsMock,
latestVersion: async () => '8.0.0',
retrievePackageJson: async () => {},
getAllDependencies: async () => ({ storybook: '8.0.0' }),
}),
},
Expand Down Expand Up @@ -68,7 +68,7 @@ describe('Upgrade errors', () => {
await expect(doUpgrade({} as any)).rejects.toThrowError(UpgradeStorybookToLowerVersionError);
expect(findInstallationsMock).toHaveBeenCalledWith(Object.keys(sbcc.versions));
});
it('should throw an error when upgrading to the same version number', async () => {
it('should show a warning when upgrading to the same version number', async () => {
findInstallationsMock.mockResolvedValue({
dependencies: {
'@storybook/cli': [
Expand All @@ -82,7 +82,15 @@ describe('Upgrade errors', () => {
dedupeCommand: '',
});

await expect(doUpgrade({} as any)).rejects.toThrowError(UpgradeStorybookToSameVersionError);
// Mock as a throw, so that we don't have to mock the content of the doUpgrade fn that comes after it
vi.spyOn(logger, 'warn').mockImplementation((error) => {
// eslint-disable-next-line @typescript-eslint/no-throw-literal
throw error;
});

await expect(doUpgrade({ packageManager: 'npm' } as any)).rejects.toContain(
'You are upgrading Storybook to the same version that is currently installed in the project'
);
expect(findInstallationsMock).toHaveBeenCalledWith(Object.keys(sbcc.versions));
});
});
4 changes: 3 additions & 1 deletion code/lib/cli/src/upgrade.ts
Original file line number Diff line number Diff line change
Expand Up @@ -142,8 +142,10 @@ export const doUpgrade = async ({
if (!isCanary && lt(currentVersion, beforeVersion)) {
throw new UpgradeStorybookToLowerVersionError({ beforeVersion, currentVersion });
}

if (!isCanary && eq(currentVersion, beforeVersion)) {
throw new UpgradeStorybookToSameVersionError({ beforeVersion });
// Not throwing, as the beforeVersion calculation doesn't always work in monorepos.
logger.warn(new UpgradeStorybookToSameVersionError({ beforeVersion }).message);
}

const [latestVersion, packageJson] = await Promise.all([
Expand Down
2 changes: 1 addition & 1 deletion code/lib/core-events/src/errors/server-errors.ts
Original file line number Diff line number Diff line change
Expand Up @@ -545,7 +545,7 @@ export class UpgradeStorybookToSameVersionError extends StorybookError {

template() {
return dedent`
You are trying to upgrade Storybook to the same version that is currently installed in the project, version ${this.data.beforeVersion}. This is not supported.
You are upgrading Storybook to the same version that is currently installed in the project, version ${this.data.beforeVersion}.

This usually happens when running the upgrade command without a version specifier, e.g. "npx storybook upgrade".
This will cause npm to run the globally cached storybook binary, which might be the same version that you already have.
Expand Down