Skip to content

Commit

Permalink
Merge pull request #278 from storybookjs/valentin/throw-error-on-unde…
Browse files Browse the repository at this point in the history
…fined-stories-config

Update getStorybookMain to throw an error if stories are not found in main.js
  • Loading branch information
yannbf committed Mar 15, 2023
2 parents f2191b7 + 4ef4cb1 commit 6427b31
Show file tree
Hide file tree
Showing 3 changed files with 59 additions and 8 deletions.
15 changes: 15 additions & 0 deletions src/util/__snapshots__/getStorybookMain.test.ts.snap
@@ -0,0 +1,15 @@
// Jest Snapshot v1, https://goo.gl/fbAQLP

exports[`getStorybookMain no stories should throw an error if no stories are defined 1`] = `
"Could not find stories in main.js in .storybook.
If you are using a mono-repository, please run the test-runner only against your sub-package, which contains a .storybook folder with \\"stories\\" defined in main.js.
You can change the config directory by using --config-dir <path-to-dir>"
`;
exports[`getStorybookMain no stories should throw an error if stories list is empty 1`] = `
"Could not find stories in main.js in .storybook.
If you are using a mono-repository, please run the test-runner only against your sub-package, which contains a .storybook folder with \\"stories\\" defined in main.js.
You can change the config directory by using --config-dir <path-to-dir>"
`;
exports[`getStorybookMain should throw an error if no configuration is found 1`] = `"Could not load main.js in .storybook. Is the config directory correct? You can change it by using --config-dir <path-to-dir>"`;
22 changes: 20 additions & 2 deletions src/util/getStorybookMain.test.ts
@@ -1,11 +1,29 @@
import { getStorybookMain } from './getStorybookMain';
import { getStorybookMain, resetStorybookMainCache } from './getStorybookMain';
import * as coreCommon from '@storybook/core-common';

jest.mock('@storybook/core-common');

describe('getStorybookMain', () => {
beforeEach(() => {
resetStorybookMainCache();
});

it('should throw an error if no configuration is found', () => {
expect(() => getStorybookMain('.storybook')).toThrow();
expect(() => getStorybookMain('.storybook')).toThrowErrorMatchingSnapshot();
});

describe('no stories', () => {
it('should throw an error if no stories are defined', () => {
jest.spyOn(coreCommon, 'serverRequire').mockImplementation(() => ({}));

expect(() => getStorybookMain('.storybook')).toThrowErrorMatchingSnapshot();
});

it('should throw an error if stories list is empty', () => {
jest.spyOn(coreCommon, 'serverRequire').mockImplementation(() => ({ stories: [] }));

expect(() => getStorybookMain('.storybook')).toThrowErrorMatchingSnapshot();
});
});

it('should return mainjs', () => {
Expand Down
30 changes: 24 additions & 6 deletions src/util/getStorybookMain.ts
@@ -1,20 +1,38 @@
import { join, resolve } from 'path';
import { serverRequire } from '@storybook/core-common';
import type { StorybookConfig } from '@storybook/types';
import dedent from 'ts-dedent';

let storybookMainConfig: StorybookConfig;
let storybookMainConfig = new Map<string, StorybookConfig>();

export const getStorybookMain = (configDir: string) => {
if (storybookMainConfig) {
return storybookMainConfig;
if (storybookMainConfig.has(configDir)) {
return storybookMainConfig.get(configDir);
} else {
storybookMainConfig.set(configDir, serverRequire(join(resolve(configDir), 'main')));
}

storybookMainConfig = serverRequire(join(resolve(configDir), 'main'));
if (!storybookMainConfig) {
const mainConfig = storybookMainConfig.get(configDir);

if (!mainConfig) {
throw new Error(
`Could not load main.js in ${configDir}. Is the config directory correct? You can change it by using --config-dir <path-to-dir>`
);
}

return storybookMainConfig;
if (!mainConfig.stories || mainConfig.stories.length === 0) {
throw new Error(
dedent`
Could not find stories in main.js in ${configDir}.
If you are using a mono-repository, please run the test-runner only against your sub-package, which contains a .storybook folder with "stories" defined in main.js.
You can change the config directory by using --config-dir <path-to-dir>
`
);
}

return mainConfig;
};

export function resetStorybookMainCache() {
storybookMainConfig.clear();
}

0 comments on commit 6427b31

Please sign in to comment.