diff --git a/code/renderers/react/src/componentManifest/fixtures.ts b/code/renderers/react/src/componentManifest/fixtures.ts index 075557eb84d1..e7597601f306 100644 --- a/code/renderers/react/src/componentManifest/fixtures.ts +++ b/code/renderers/react/src/componentManifest/fixtures.ts @@ -31,7 +31,7 @@ export const fsMocks = { /** * Primary UI component for user interaction - * @import import { Button } from '@design-system/components/Button'; + * @import import { Button } from '@design-system/components/override'; */ export const Button = ({ primary = false, @@ -60,7 +60,6 @@ export const fsMocks = { /** * Description from meta and very long. * @summary Component summary - * @import import { Header } from '@design-system/components/Header'; */ const meta = { component: Header, @@ -85,9 +84,6 @@ export const fsMocks = { onCreateAccount?: () => void; } - /** - * @import import { Header } from '@design-system/components/Header'; - */ export default ({ user, onLogin, onLogout, onCreateAccount }: HeaderProps) => (
diff --git a/code/renderers/react/src/componentManifest/generator.test.ts b/code/renderers/react/src/componentManifest/generator.test.ts index 405034954ed9..a6a7f9602a6a 100644 --- a/code/renderers/react/src/componentManifest/generator.test.ts +++ b/code/renderers/react/src/componentManifest/generator.test.ts @@ -26,10 +26,10 @@ test('componentManifestGenerator generates correct id, name, description and exa "description": "Primary UI component for user interaction", "error": undefined, "id": "example-button", - "import": "import { Button } from \"@design-system/components/Button\";", + "import": "import { Button } from "@design-system/components/override";", "jsDocTags": { "import": [ - "import { Button } from '@design-system/components/Button';", + "import { Button } from '@design-system/components/override';", ], }, "name": "Button", @@ -38,7 +38,7 @@ test('componentManifestGenerator generates correct id, name, description and exa "actualName": "Button", "definedInFile": "./src/stories/Button.tsx", "description": "Primary UI component for user interaction - @import import { Button } from '@design-system/components/Button';", + @import import { Button } from '@design-system/components/override';", "displayName": "Button", "exportName": "Button", "methods": [], @@ -143,11 +143,8 @@ test('componentManifestGenerator generates correct id, name, description and exa "description": "Description from meta and very long.", "error": undefined, "id": "example-header", - "import": "import { Header } from \"@design-system/components/Header\";", + "import": "import { Header } from "some-package";", "jsDocTags": { - "import": [ - "import { Header } from '@design-system/components/Header';", - ], "summary": [ "Component summary", ], @@ -157,7 +154,7 @@ test('componentManifestGenerator generates correct id, name, description and exa "reactDocgen": { "actualName": "", "definedInFile": "./src/stories/Header.tsx", - "description": "@import import { Header } from '@design-system/components/Header';", + "description": "", "exportName": "default", "methods": [], "props": { diff --git a/code/renderers/react/src/componentManifest/getComponentImports.test.ts b/code/renderers/react/src/componentManifest/getComponentImports.test.ts index 83c07a4b71cd..b1602043bcde 100644 --- a/code/renderers/react/src/componentManifest/getComponentImports.test.ts +++ b/code/renderers/react/src/componentManifest/getComponentImports.test.ts @@ -13,17 +13,20 @@ beforeEach(() => { vol.fromJSON(fsMocks, '/app'); }); -const getImports = (code: string, packageName?: string, storyFilePath?: string) => - getComponentData({ +const getImports = (code: string, packageName?: string, storyFilePath?: string) => { + storyFilePath ??= '/app/src/stories/Button.stories.tsx'; + const { components, imports } = getComponentData({ csf: loadCsf(code, { makeTitle: (t?: string) => t ?? 'title' }).parse(), packageName, storyFilePath, }); + return { components: components.map(({ reactDocgen, ...rest }) => rest), imports }; +}; test('Get imports from multiple components', () => { const code = dedent` import type { Meta } from '@storybook/react'; - import { ButtonGroup } from '@design-system/button-group'; + import { ButtonGroup } from './button-group'; import { Button } from '@design-system/button'; const meta: Meta = { @@ -43,18 +46,22 @@ test('Get imports from multiple components', () => { "componentName": "Button", "importId": "@design-system/button", "importName": "Button", + "importOverride": "import { Button } from '@design-system/components/override';", + "isPackage": true, "localImportName": "Button", + "path": "./src/stories/Button.tsx", }, { "componentName": "ButtonGroup", - "importId": "@design-system/button-group", + "importId": "./button-group", "importName": "ButtonGroup", + "isPackage": false, "localImportName": "ButtonGroup", }, ], "imports": [ - "import { Button } from "@design-system/button";", - "import { ButtonGroup } from "@design-system/button-group";", + "import { Button } from "@design-system/components/override";", + "import { ButtonGroup } from "./button-group";", ], } ` @@ -63,7 +70,7 @@ test('Get imports from multiple components', () => { test('Namespace import with member usage', () => { const code = dedent` - import * as Accordion from '@ds/accordion'; + import * as Accordion from './accordion'; const meta = {}; export default meta; @@ -75,14 +82,15 @@ test('Namespace import with member usage', () => { "components": [ { "componentName": "Accordion.Root", - "importId": "@ds/accordion", + "importId": "./accordion", "importName": "Root", + "isPackage": false, "localImportName": "Accordion", "namespace": "Accordion", }, ], "imports": [ - "import * as Accordion from "@ds/accordion";", + "import * as Accordion from "./accordion";", ], } ` @@ -91,7 +99,7 @@ test('Namespace import with member usage', () => { test('Named import used as namespace object', () => { const code = dedent` - import { Accordion } from '@ds/accordion'; + import { Accordion } from './accordion'; const meta = {}; export default meta; @@ -103,13 +111,14 @@ test('Named import used as namespace object', () => { "components": [ { "componentName": "Accordion.Root", - "importId": "@ds/accordion", + "importId": "./accordion", "importName": "Accordion", + "isPackage": false, "localImportName": "Accordion", }, ], "imports": [ - "import { Accordion } from "@ds/accordion";", + "import { Accordion } from "./accordion";", ], } ` @@ -132,11 +141,14 @@ test('Default import', () => { "componentName": "Button", "importId": "@ds/button", "importName": "default", + "importOverride": "import { Button } from '@design-system/components/override';", + "isPackage": true, "localImportName": "Button", + "path": "./src/stories/Button.tsx", }, ], "imports": [ - "import Button from "@ds/button";", + "import { Button } from "@design-system/components/override";", ], } ` @@ -145,7 +157,8 @@ test('Default import', () => { test('Alias named import and meta.component inclusion', () => { const code = dedent` - import DefaultComponent, { Button as Btn, Other } from '@ds/button'; + import DefaultComponent, { Button as Btn } from '@ds/button'; + import { Other } from './other'; const meta = { component: Btn }; export default meta; @@ -159,17 +172,22 @@ test('Alias named import and meta.component inclusion', () => { "componentName": "Btn", "importId": "@ds/button", "importName": "Button", + "importOverride": "import { Button } from '@design-system/components/override';", + "isPackage": true, "localImportName": "Btn", + "path": "./src/stories/Button.tsx", }, { "componentName": "Other", - "importId": "@ds/button", + "importId": "./other", "importName": "Other", + "isPackage": false, "localImportName": "Other", }, ], "imports": [ - "import { Button as Btn, Other } from "@ds/button";", + "import { Button as Btn } from "@design-system/components/override";", + "import { Other } from "./other";", ], } ` @@ -192,11 +210,14 @@ test('Strip unused specifiers from the same import statement', () => { "componentName": "Btn", "importId": "@ds/button", "importName": "Button", + "importOverride": "import { Button } from '@design-system/components/override';", + "isPackage": true, "localImportName": "Btn", + "path": "./src/stories/Button.tsx", }, ], "imports": [ - "import { Button as Btn } from "@ds/button";", + "import { Button as Btn } from "@design-system/components/override";", ], } ` @@ -205,7 +226,7 @@ test('Strip unused specifiers from the same import statement', () => { test('Meta component with member and star import', () => { const code = dedent` - import * as Accordion from '@ds/accordion'; + import * as Accordion from './accordion'; const meta = { component: Accordion.Root }; export default meta; @@ -216,14 +237,15 @@ test('Meta component with member and star import', () => { "components": [ { "componentName": "Accordion.Root", - "importId": "@ds/accordion", + "importId": "./accordion", "importName": "Root", + "isPackage": false, "localImportName": "Accordion", "namespace": "Accordion", }, ], "imports": [ - "import * as Accordion from "@ds/accordion";", + "import * as Accordion from "./accordion";", ], } ` @@ -232,7 +254,8 @@ test('Meta component with member and star import', () => { test('Keeps multiple named specifiers and drops unused ones from same import', () => { const code = dedent` - import { Button, ButtonGroup, useHook } from '@ds/button'; + import { Button, useHook } from '@ds/button'; + import { ButtonGroup } from './button-group'; const meta = {}; export default meta; @@ -246,17 +269,22 @@ test('Keeps multiple named specifiers and drops unused ones from same import', ( "componentName": "Button", "importId": "@ds/button", "importName": "Button", + "importOverride": "import { Button } from '@design-system/components/override';", + "isPackage": true, "localImportName": "Button", + "path": "./src/stories/Button.tsx", }, { "componentName": "ButtonGroup", - "importId": "@ds/button", + "importId": "./button-group", "importName": "ButtonGroup", + "isPackage": false, "localImportName": "ButtonGroup", }, ], "imports": [ - "import { Button, ButtonGroup } from "@ds/button";", + "import { Button } from "@design-system/components/override";", + "import { ButtonGroup } from "./button-group";", ], } ` @@ -279,11 +307,14 @@ test('Mixed default + named import: keep only default when only default used', ( "componentName": "Button", "importId": "@ds/button", "importName": "default", + "importOverride": "import { Button } from '@design-system/components/override';", + "isPackage": true, "localImportName": "Button", + "path": "./src/stories/Button.tsx", }, ], "imports": [ - "import Button from "@ds/button";", + "import { Button } from "@design-system/components/override";", ], } ` @@ -306,11 +337,14 @@ test('Mixed default + named import: keep only named when only named (alias) used "componentName": "Btn", "importId": "@ds/button", "importName": "Button", + "importOverride": "import { Button } from '@design-system/components/override';", + "isPackage": true, "localImportName": "Btn", + "path": "./src/stories/Button.tsx", }, ], "imports": [ - "import { Button as Btn } from "@ds/button";", + "import { Button as Btn } from "@design-system/components/override";", ], } ` @@ -334,11 +368,14 @@ test('Per-specifier type import is dropped when mixing with value specifiers', ( "componentName": "Button", "importId": "@ds/button", "importName": "Button", + "importOverride": "import { Button } from '@design-system/components/override';", + "isPackage": true, "localImportName": "Button", + "path": "./src/stories/Button.tsx", }, ], "imports": [ - "import { Button } from "@ds/button";", + "import { Button } from "@design-system/components/override";", ], } ` @@ -347,7 +384,7 @@ test('Per-specifier type import is dropped when mixing with value specifiers', ( test('Namespace import used for multiple members kept once', () => { const code = dedent` - import * as DS from '@ds/ds'; + import * as DS from './ds'; const meta = {}; export default meta; @@ -359,21 +396,23 @@ test('Namespace import used for multiple members kept once', () => { "components": [ { "componentName": "DS.A", - "importId": "@ds/ds", + "importId": "./ds", "importName": "A", + "isPackage": false, "localImportName": "DS", "namespace": "DS", }, { "componentName": "DS.B", - "importId": "@ds/ds", + "importId": "./ds", "importName": "B", + "isPackage": false, "localImportName": "DS", "namespace": "DS", }, ], "imports": [ - "import * as DS from "@ds/ds";", + "import * as DS from "./ds";", ], } ` @@ -395,11 +434,14 @@ test('Default import kept when referenced only via meta.component', () => { "componentName": "Button", "importId": "@ds/button", "importName": "default", + "importOverride": "import { Button } from '@design-system/components/override';", + "isPackage": true, "localImportName": "Button", + "path": "./src/stories/Button.tsx", }, ], "imports": [ - "import Button from "@ds/button";", + "import { Button } from "@design-system/components/override";", ], } ` @@ -423,11 +465,14 @@ test('Side-effect-only import is ignored', () => { "componentName": "Button", "importId": "@ds/button", "importName": "Button", + "importOverride": "import { Button } from '@design-system/components/override';", + "isPackage": true, "localImportName": "Button", + "path": "./src/stories/Button.tsx", }, ], "imports": [ - "import { Button } from "@ds/button";", + "import { Button } from "@design-system/components/override";", ], } ` @@ -438,93 +483,30 @@ test('Side-effect-only import is ignored', () => { test('Converts default relative import to import override when provided', () => { const code = dedent` - import Header from './Header'; + import Button from './Button'; const meta = {}; export default meta; - export const S =
; + export const S =