diff --git a/code/lib/csf-tools/src/CsfFile.test.ts b/code/lib/csf-tools/src/CsfFile.test.ts index 7ca7ff83acb0..7a2ac4a6a2c1 100644 --- a/code/lib/csf-tools/src/CsfFile.test.ts +++ b/code/lib/csf-tools/src/CsfFile.test.ts @@ -221,6 +221,28 @@ describe('CsfFile', () => { `); }); + it('typescript satisfies', () => { + expect( + parse( + dedent` + import type { Meta, StoryFn } from '@storybook/react'; + type PropTypes = {}; + export default { title: 'foo/bar/baz' } as Meta; + export const A: StoryFn = () => <>A; + export const B: StoryFn = () => <>B; + ` + ) + ).toMatchInlineSnapshot(` + meta: + title: foo/bar/baz + stories: + - id: foo-bar-baz--a + name: A + - id: foo-bar-baz--b + name: B + `); + }); + it('typescript meta var', () => { expect( parse( @@ -244,6 +266,29 @@ describe('CsfFile', () => { `); }); + it('typescript satisfies meta var', () => { + expect( + parse( + dedent` + import type { Meta, StoryFn } from '@storybook/react'; + type PropTypes = {}; + const meta = { title: 'foo/bar/baz' } satisfies Meta; + export default meta; + export const A: StoryFn = () => <>A; + export const B: StoryFn = () => <>B; + ` + ) + ).toMatchInlineSnapshot(` + meta: + title: foo/bar/baz + stories: + - id: foo-bar-baz--a + name: A + - id: foo-bar-baz--b + name: B + `); + }); + it('component object', () => { expect( parse( diff --git a/code/lib/csf-tools/src/CsfFile.ts b/code/lib/csf-tools/src/CsfFile.ts index e38c25a81db3..fbc167c90a6c 100644 --- a/code/lib/csf-tools/src/CsfFile.ts +++ b/code/lib/csf-tools/src/CsfFile.ts @@ -269,7 +269,7 @@ export class CsfFile { metaNode = decl; } else if ( // export default { ... } as Meta<...> - t.isTSAsExpression(decl) && + (t.isTSAsExpression(decl) || t.isTSSatisfiesExpression(decl)) && t.isObjectExpression(decl.expression) ) { metaNode = decl.expression;