diff --git a/lib/store/src/csf/processCSFFile.test.ts b/lib/store/src/csf/processCSFFile.test.ts index e5540f069901..921cee2a78e8 100644 --- a/lib/store/src/csf/processCSFFile.test.ts +++ b/lib/store/src/csf/processCSFFile.test.ts @@ -48,7 +48,7 @@ describe('processCSFFile', () => { }); }); - it('ignores __namedExportsOrder', () => { + it('adds stories in the right order if __namedExportsOrder is supplied', () => { const { stories } = processCSFFile( { default: { title: 'Component' }, @@ -63,10 +63,10 @@ describe('processCSFFile', () => { ); expect(Object.keys(stories)).toEqual([ + 'component--w', 'component--x', - 'component--y', 'component--z', - 'component--w', + 'component--y', ]); }); diff --git a/lib/store/src/csf/processCSFFile.ts b/lib/store/src/csf/processCSFFile.ts index 02bf81c918cd..1d6965064f90 100644 --- a/lib/store/src/csf/processCSFFile.ts +++ b/lib/store/src/csf/processCSFFile.ts @@ -39,16 +39,29 @@ export function processCSFFile( title: ComponentTitle ): CSFFile { const { default: defaultExport, __namedExportsOrder, ...namedExports } = moduleExports; + let exports = namedExports; const meta: NormalizedComponentAnnotations = normalizeComponentAnnotations(defaultExport, title, importPath); checkDisallowedParameters(meta.parameters); + // prefer a user/loader provided `__namedExportsOrder` array if supplied + // we do this as es module exports are always ordered alphabetically + // see https://github.com/storybookjs/storybook/issues/9136 + // This directly affects the order of stories in the docs view and in folders on the sidebar. + if (Array.isArray(__namedExportsOrder)) { + exports = {}; + __namedExportsOrder.forEach((name) => { + const namedExport = namedExports[name]; + if (namedExport) exports[name] = namedExport; + }); + } + const csfFile: CSFFile = { meta, stories: {} }; - Object.keys(namedExports).forEach((key) => { + Object.keys(exports).forEach((key) => { if (isExportStory(key, meta)) { - const storyMeta = normalizeStory(key, namedExports[key], meta); + const storyMeta = normalizeStory(key, exports[key], meta); checkDisallowedParameters(storyMeta.parameters); csfFile.stories[storyMeta.id] = storyMeta;