From 45eda4401029ee015bd5f80d063a943e72f8ee24 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Fri, 20 Feb 2026 11:14:08 +0000 Subject: [PATCH 1/3] Initial plan From f48a1ae6964f82586c20b763960e3cdad2d0d70f Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Fri, 20 Feb 2026 11:21:40 +0000 Subject: [PATCH 2/3] Fix ConfigFile parser warning on definePreview({...}).type() chaining Co-authored-by: valentinpalkovic <5889929+valentinpalkovic@users.noreply.github.com> --- code/core/src/csf-tools/ConfigFile.test.ts | 17 +++++++++++++++++ code/core/src/csf-tools/ConfigFile.ts | 13 ++++++++++--- 2 files changed, 27 insertions(+), 3 deletions(-) diff --git a/code/core/src/csf-tools/ConfigFile.test.ts b/code/core/src/csf-tools/ConfigFile.test.ts index f702579aeecd..191989b1751b 100644 --- a/code/core/src/csf-tools/ConfigFile.test.ts +++ b/code/core/src/csf-tools/ConfigFile.test.ts @@ -293,6 +293,23 @@ describe('ConfigFile', () => { ) ).toEqual(['test', 'vitest', '!a11ytest']); }); + it('parses correctly with .type() chaining on export default', () => { + const source = dedent` + import { definePreview } from '@storybook/react-vite'; + + export default definePreview({ + parameters: { + foo: 'bar', + }, + }).type<{ + parameters: { + customParam?: string; + }; + }>(); + `; + const config = loadConfig(source).parse(); + expect(config.getFieldValue(['parameters', 'foo'])).toEqual('bar'); + }); }); }); diff --git a/code/core/src/csf-tools/ConfigFile.ts b/code/core/src/csf-tools/ConfigFile.ts index c5f376f5096f..79aa5a9d886f 100644 --- a/code/core/src/csf-tools/ConfigFile.ts +++ b/code/core/src/csf-tools/ConfigFile.ts @@ -204,9 +204,16 @@ export class ConfigFile { self.hasDefaultExport = true; let decl = self._resolveDeclaration(node.declaration as t.Node, parent); - // csf factory - if (t.isCallExpression(decl) && t.isObjectExpression(decl.arguments[0])) { - decl = decl.arguments[0]; + // csf factory - unwrap call expressions like definePreview({...}) or definePreview({...}).type() + while (t.isCallExpression(decl)) { + if (t.isObjectExpression(decl.arguments[0])) { + decl = decl.arguments[0]; + break; + } else if (t.isMemberExpression(decl.callee) && t.isCallExpression(decl.callee.object)) { + decl = decl.callee.object; + } else { + break; + } } if (t.isObjectExpression(decl)) { From 2bdb54a73586347cdc6303ff119bb0cb778073be Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Tue, 3 Mar 2026 09:46:37 +0000 Subject: [PATCH 3/3] Fix prettier formatting in ConfigFile.ts Co-authored-by: valentinpalkovic <5889929+valentinpalkovic@users.noreply.github.com> --- code/core/src/csf-tools/ConfigFile.ts | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/code/core/src/csf-tools/ConfigFile.ts b/code/core/src/csf-tools/ConfigFile.ts index 79aa5a9d886f..6e326004c82d 100644 --- a/code/core/src/csf-tools/ConfigFile.ts +++ b/code/core/src/csf-tools/ConfigFile.ts @@ -209,7 +209,10 @@ export class ConfigFile { if (t.isObjectExpression(decl.arguments[0])) { decl = decl.arguments[0]; break; - } else if (t.isMemberExpression(decl.callee) && t.isCallExpression(decl.callee.object)) { + } else if ( + t.isMemberExpression(decl.callee) && + t.isCallExpression(decl.callee.object) + ) { decl = decl.callee.object; } else { break;