Skip to content

Commit

Permalink
Merge pull request #20455 from storybookjs/alert-missing-addons
Browse files Browse the repository at this point in the history
Addons: Warn when addon is not installed
  • Loading branch information
valentinpalkovic authored Jan 12, 2023
2 parents 0a76fb9 + 1456341 commit 8f7ed31
Show file tree
Hide file tree
Showing 2 changed files with 74 additions and 7 deletions.
54 changes: 54 additions & 0 deletions code/lib/core-common/src/presets.test.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
import path from 'path';
import { logger } from '@storybook/node-logger';
import './presets';

function wrapPreset(basePresets: any): { babel: Function; webpack: Function } {
Expand Down Expand Up @@ -459,6 +460,10 @@ describe('loadPreset', () => {

const { loadPreset } = jest.requireActual('./presets');

beforeEach(() => {
jest.spyOn(logger, 'warn');
});

it('should prepend framework field to list of presets', async () => {
const loaded = await loadPreset(
{
Expand Down Expand Up @@ -595,4 +600,53 @@ describe('loadPreset', () => {
},
]);
});

it('should warn for addons that are not installed', async () => {
const loaded = await loadPreset(
{
name: '',
type: 'virtual',
framework: '@storybook/react',
presets: ['@storybook/preset-typescript'],
addons: ['@storybook/addon-docs/preset', 'uninstalled-addon'],
},
0,
{}
);
expect(logger.warn).toHaveBeenCalledWith(
'Could not resolve addon "uninstalled-addon", skipping. Is it installed?'
);
expect(loaded).toMatchInlineSnapshot(`
Array [
Object {
"name": "@storybook/preset-typescript",
"options": Object {},
"preset": Object {},
},
Object {
"name": "@storybook/addon-docs/preset",
"options": Object {},
"preset": Object {},
},
Object {
"name": Object {
"addons": Array [
"@storybook/addon-docs/preset",
"uninstalled-addon",
],
"framework": "@storybook/react",
"name": "",
"presets": Array [
"@storybook/preset-typescript",
],
"type": "virtual",
},
"options": Object {},
"preset": Object {
"framework": "@storybook/react",
},
},
]
`);
});
});
27 changes: 20 additions & 7 deletions code/lib/core-common/src/presets.ts
Original file line number Diff line number Diff line change
Expand Up @@ -166,18 +166,27 @@ const map =
(item: any) => {
const options = isObject(item) ? item['options'] || undefined : undefined;
const name = isObject(item) ? item['name'] : item;

let resolved;

try {
const resolved = resolveAddonName(configDir, name, options);
return {
...(options ? { options } : {}),
...resolved,
};
resolved = resolveAddonName(configDir, name, options);
} catch (err) {
logger.error(
`Addon value should end in /manager or /preview or /register OR it should be a valid preset https://storybook.js.org/docs/react/addons/writing-presets/\n${item}`
);
return undefined;
}
return undefined;

if (!resolved) {
logger.warn(`Could not resolve addon "${name}", skipping. Is it installed?`);
return undefined;
}

return {
...(options ? { options } : {}),
...resolved,
};
};

async function getContent(input: any) {
Expand Down Expand Up @@ -259,7 +268,11 @@ async function loadPresets(
}

return (
await Promise.all(presets.map(async (preset) => loadPreset(preset, level, storybookOptions)))
await Promise.all(
presets.map(async (preset) => {
return loadPreset(preset, level, storybookOptions);
})
)
).reduce((acc, loaded) => {
return acc.concat(loaded);
}, []);
Expand Down

0 comments on commit 8f7ed31

Please sign in to comment.