Merge pull request #26585 from storybookjs/yann/fix-installations-command

CLI: Throw an error when running upgrade command in incorrect cwd
(cherry picked from commit 7b9e094bc0f6645c6e955d98036ad7aa9b3acf51)
This commit is contained in:
Yann Braga 2024-03-21 09:25:06 +01:00 committed by storybook-bot
parent f55cb5705f
commit 5149d0f64e
5 changed files with 42 additions and 0 deletions

View File

@ -210,4 +210,20 @@ describe('Helpers', () => {
}).toThrowError(`Could not coerce ${invalidSemverString} into a semver.`); }).toThrowError(`Could not coerce ${invalidSemverString} into a semver.`);
}); });
}); });
describe('hasStorybookDependencies', () => {
it(`should return true when any storybook dependency exists`, async () => {
const result = await helpers.hasStorybookDependencies({
getAllDependencies: async () => ({ storybook: 'x.y.z' }),
} as unknown as JsPackageManager);
expect(result).toEqual(true);
});
it(`should return false when no storybook dependency exists`, async () => {
const result = await helpers.hasStorybookDependencies({
getAllDependencies: async () => ({ axios: 'x.y.z' }),
} as unknown as JsPackageManager);
expect(result).toEqual(false);
});
});
}); });

View File

@ -296,3 +296,9 @@ export function coerceSemver(version: string) {
invariant(coercedSemver != null, `Could not coerce ${version} into a semver.`); invariant(coercedSemver != null, `Could not coerce ${version} into a semver.`);
return coercedSemver; return coercedSemver;
} }
export async function hasStorybookDependencies(packageManager: JsPackageManager) {
const currentPackageDeps = await packageManager.getAllDependencies();
return Object.keys(currentPackageDeps).some((dep) => dep.includes('storybook'));
}

View File

@ -16,6 +16,7 @@ vi.mock('@storybook/core-common', async (importOriginal) => {
JsPackageManagerFactory: { JsPackageManagerFactory: {
getPackageManager: () => ({ getPackageManager: () => ({
findInstallations: findInstallationsMock, findInstallations: findInstallationsMock,
getAllDependencies: async () => ({ storybook: '8.0.0' }),
}), }),
}, },
versions: Object.keys(originalModule.versions).reduce( versions: Object.keys(originalModule.versions).reduce(

View File

@ -4,6 +4,7 @@ import semver, { eq, lt, prerelease } from 'semver';
import { logger } from '@storybook/node-logger'; import { logger } from '@storybook/node-logger';
import { withTelemetry } from '@storybook/core-server'; import { withTelemetry } from '@storybook/core-server';
import { import {
UpgradeStorybookInWrongWorkingDirectory,
UpgradeStorybookToLowerVersionError, UpgradeStorybookToLowerVersionError,
UpgradeStorybookToSameVersionError, UpgradeStorybookToSameVersionError,
UpgradeStorybookUnknownCurrentVersionError, UpgradeStorybookUnknownCurrentVersionError,
@ -23,6 +24,7 @@ import {
} from '@storybook/core-common'; } from '@storybook/core-common';
import { automigrate } from './automigrate/index'; import { automigrate } from './automigrate/index';
import { autoblock } from './autoblock/index'; import { autoblock } from './autoblock/index';
import { hasStorybookDependencies } from './helpers';
type Package = { type Package = {
package: string; package: string;
@ -135,6 +137,9 @@ export const doUpgrade = async ({
beforeVersion.startsWith('portal:') || beforeVersion.startsWith('portal:') ||
beforeVersion.startsWith('workspace:'); beforeVersion.startsWith('workspace:');
if (!(await hasStorybookDependencies(packageManager))) {
throw new UpgradeStorybookInWrongWorkingDirectory();
}
if (!isCanary && lt(currentVersion, beforeVersion)) { if (!isCanary && lt(currentVersion, beforeVersion)) {
throw new UpgradeStorybookToLowerVersionError({ beforeVersion, currentVersion }); throw new UpgradeStorybookToLowerVersionError({ beforeVersion, currentVersion });
} }

View File

@ -577,6 +577,20 @@ export class UpgradeStorybookUnknownCurrentVersionError extends StorybookError {
} }
} }
export class UpgradeStorybookInWrongWorkingDirectory extends StorybookError {
readonly category = Category.CLI_UPGRADE;
readonly code = 6;
template() {
return dedent`
You are running the upgrade command in a CWD that does not contain Storybook dependencies.
Did you mean to run it in a different directory? Make sure the directory you run this command in contains a package.json with your Storybook dependencies.
`;
}
}
export class NoStatsForViteDevError extends StorybookError { export class NoStatsForViteDevError extends StorybookError {
readonly category = Category.BUILDER_VITE; readonly category = Category.BUILDER_VITE;