From b1e0534204cea67794dba7852e04e20f5bc477a3 Mon Sep 17 00:00:00 2001 From: Tom Coleman Date: Mon, 17 Jan 2022 16:32:55 +1100 Subject: [PATCH] Fix issue with recursive glob with prior special chars --- lib/core-common/src/utils/__tests__/paths.test.ts | 10 ++++++++++ .../utils/__tests__/to-require-context.test.ts | 15 +++++++++++++++ lib/core-common/src/utils/paths.ts | 4 ++-- lib/core-common/src/utils/to-require-context.ts | 3 ++- 4 files changed, 29 insertions(+), 3 deletions(-) diff --git a/lib/core-common/src/utils/__tests__/paths.test.ts b/lib/core-common/src/utils/__tests__/paths.test.ts index bbb1e7147109..56238ab9a41b 100644 --- a/lib/core-common/src/utils/__tests__/paths.test.ts +++ b/lib/core-common/src/utils/__tests__/paths.test.ts @@ -12,6 +12,16 @@ describe('paths - normalizeStoryPath()', () => { expect(normalizeStoryPath(filename)).toEqual(filename); }); + it('returns a path equal to "." unchanged', () => { + const filename = '.'; + expect(normalizeStoryPath(filename)).toEqual(filename); + }); + + it('returns a path equal to ".." unchanged', () => { + const filename = '..'; + expect(normalizeStoryPath(filename)).toEqual(filename); + }); + it('adds "./" to a normalized relative path', () => { const filename = path.join('src', 'Comp.story.js'); expect(normalizeStoryPath(filename)).toEqual(`.${path.sep}${filename}`); diff --git a/lib/core-common/src/utils/__tests__/to-require-context.test.ts b/lib/core-common/src/utils/__tests__/to-require-context.test.ts index e4345fa3f579..9dfa8e4fd017 100644 --- a/lib/core-common/src/utils/__tests__/to-require-context.test.ts +++ b/lib/core-common/src/utils/__tests__/to-require-context.test.ts @@ -238,6 +238,21 @@ const testCases = [ '../src/stories/components/Icon/Icon.mdx', ], }, + // Patterns before the **, see: + // - https://github.com/storybookjs/storybook/issues/17038 + // - https://github.com/storybookjs/storybook/issues/16964 + // - https://github.com/storybookjs/storybook/issues/16924 + { + glob: '../{dir1,dir2}/**/*.stories.js', + recursive: true, + validPaths: [ + '../dir1/Icon.stories.js', + '../dir1/nested/Icon.stories.js', + '../dir2/Icon.stories.js', + '../dir2/nested/Icon.stories.js', + ], + invalidPaths: ['../dir3/Icon.stories.js', '../dir3/nested/Icon.stories.js'], + }, ]; describe('toRequireContext', () => { diff --git a/lib/core-common/src/utils/paths.ts b/lib/core-common/src/utils/paths.ts index e32978c5d936..b6582639efcc 100644 --- a/lib/core-common/src/utils/paths.ts +++ b/lib/core-common/src/utils/paths.ts @@ -29,9 +29,9 @@ export const nodePathsToArray = (nodePath: string) => .filter(Boolean) .map((p) => path.resolve('./', p)); -const relativePattern = /^\.{1,2}[/\\]/; +const relativePattern = /^\.{1,2}([/\\]|$)/; /** - * Ensures that a path starts with `./` or `../` + * Ensures that a path starts with `./` or `../`, or is entirely `.` or `..` */ export function normalizeStoryPath(filename: string) { if (relativePattern.test(filename)) return filename; diff --git a/lib/core-common/src/utils/to-require-context.ts b/lib/core-common/src/utils/to-require-context.ts index 3b33edded0ca..e4f9a125504e 100644 --- a/lib/core-common/src/utils/to-require-context.ts +++ b/lib/core-common/src/utils/to-require-context.ts @@ -7,9 +7,10 @@ export const toRequireContext = (specifier: NormalizedStoriesSpecifier) => { // The importPathMatcher is a `./`-prefixed matcher that includes the directory // For `require.context()` we want the same thing, relative to directory const match = globToRegexp(`./${files}`); + return { path: directory, - recursive: !!files.match(/^\*{1,2}\//), + recursive: files.includes('**') || files.split('/').length > 1, match, }; };