diff --git a/lib/core/src/server/presets.js b/lib/core/src/server/presets.js index cbd531c32cfb..2029437e07d9 100644 --- a/lib/core/src/server/presets.js +++ b/lib/core/src/server/presets.js @@ -7,6 +7,8 @@ const isObject = val => val != null && typeof val === 'object' && Array.isArray( const isFunction = val => typeof val === 'function'; // Copied out of parse-package-name +// '@storybook/addon-actions/register' => ( name: '@storybook/addon-actions', path: '/register ) +// './addon-actions/register' => ( name: './addon-actions/register', path: './addon-actions/register' ) const RE_SCOPED = /^(@[^/]+\/[^/@]+)(?:\/([^@]+))?(?:@([\s\S]+))?/; const RE_NORMAL = /^([^/@]+)(?:\/([^@]+))?(?:@([\s\S]+))?/; function parsePackageName(input) { @@ -38,6 +40,8 @@ const resolvePresetFunction = (input, presetOptions, storybookOptions) => { return []; }; +const isLocalFileImport = packageName => /^[./]/.test(packageName); + /** * Parse an addon into either a managerEntry or a preset. Throw on invalid input. * @@ -55,14 +59,19 @@ const resolvePresetFunction = (input, presetOptions, storybookOptions) => { * => { type: 'presets', item: { name: '@storybook/addon-docs/preset', options } } */ export const resolveAddonName = name => { - const { path } = parsePackageName(name); + let path; + if (isLocalFileImport(name)) { + path = name; + } else { + ({ path } = parsePackageName(name)); + } // when user provides full path, we don't need to do anything if (path) { return { name, - // Accept `register`, `register.js`, `require.resolve('foo/register') cases - type: path.match(/register(.js)?$/) ? 'managerEntries' : 'presets', + // Accept `register`, `register.js`, `require.resolve('foo/register'), `register_panel` + type: path.match(/register(_panel)?(.js)?$/) ? 'managerEntries' : 'presets', }; } diff --git a/lib/core/src/server/presets.test.js b/lib/core/src/server/presets.test.js index 84df049c634a..85d2c44851d8 100644 --- a/lib/core/src/server/presets.test.js +++ b/lib/core/src/server/presets.test.js @@ -389,6 +389,7 @@ describe('splitAddons', () => { '@storybook/addon-actions/register', 'storybook-addon-readme/register', 'addon-foo/register.js', + '@storybook/addon-notes/register_panel', ]; expect(splitAddons(addons)).toEqual({ managerEntries: addons, @@ -401,6 +402,8 @@ describe('splitAddons', () => { '@storybook/addon-essentials', '@storybook/addon-docs/presets', 'addon-bar/presets.js', + './local-addon-relative/presets', + '/local-addon-absolute/presets', ]; expect(splitAddons(addons)).toEqual({ managerEntries: [],