From 282d605185cac8538ea76dc5a19e4faba43bad31 Mon Sep 17 00:00:00 2001 From: Michael Shilman Date: Thu, 16 Jan 2020 12:35:45 +0800 Subject: [PATCH 1/2] Core: Fix addon/preset detection for local addons --- lib/core/src/server/presets.js | 11 ++++++++++- lib/core/src/server/presets.test.js | 4 ++++ 2 files changed, 14 insertions(+), 1 deletion(-) diff --git a/lib/core/src/server/presets.js b/lib/core/src/server/presets.js index cbd531c32cfb..863e6f1817a3 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,7 +59,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: [], From 39c10c1ec29f51e0e9a8c548b9e95dc49a5cb5ad Mon Sep 17 00:00:00 2001 From: Michael Shilman Date: Thu, 16 Jan 2020 12:53:12 +0800 Subject: [PATCH 2/2] Fix comment :see_no_evil: --- lib/core/src/server/presets.js | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/lib/core/src/server/presets.js b/lib/core/src/server/presets.js index 863e6f1817a3..833a07832a04 100644 --- a/lib/core/src/server/presets.js +++ b/lib/core/src/server/presets.js @@ -7,8 +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 ) -// './addon-actions/register' => ( name: './addon-actions/register', path: './addon-actions/register' ) +// '@storybook/addon-actions/register' => ( name: '@storybook/addon-actions', path: '/register', version: '' ) const RE_SCOPED = /^(@[^/]+\/[^/@]+)(?:\/([^@]+))?(?:@([\s\S]+))?/; const RE_NORMAL = /^([^/@]+)(?:\/([^@]+))?(?:@([\s\S]+))?/; function parsePackageName(input) {