diff --git a/lib/core/src/server/presets.js b/lib/core/src/server/presets.js index cbd531c32cfb..833a07832a04 100644 --- a/lib/core/src/server/presets.js +++ b/lib/core/src/server/presets.js @@ -7,6 +7,7 @@ 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', version: '' ) const RE_SCOPED = /^(@[^/]+\/[^/@]+)(?:\/([^@]+))?(?:@([\s\S]+))?/; const RE_NORMAL = /^([^/@]+)(?:\/([^@]+))?(?:@([\s\S]+))?/; function parsePackageName(input) { @@ -38,6 +39,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,7 +58,12 @@ 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) { diff --git a/lib/core/src/server/presets.test.js b/lib/core/src/server/presets.test.js index 84df049c634a..b1c61d44a003 100644 --- a/lib/core/src/server/presets.test.js +++ b/lib/core/src/server/presets.test.js @@ -389,6 +389,8 @@ describe('splitAddons', () => { '@storybook/addon-actions/register', 'storybook-addon-readme/register', 'addon-foo/register.js', + './local-addon-relative/register', + '/local-addon-absolute/register', ]; expect(splitAddons(addons)).toEqual({ managerEntries: addons, @@ -401,6 +403,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: [],