diff --git a/packages/docusaurus/src/commands/swizzle/__tests__/__fixtures__/theme/JsComponent/index.css b/packages/docusaurus/src/commands/swizzle/__tests__/__fixtures__/theme/JsComponent/index.css new file mode 100644 index 000000000000..7aa192f3b39f --- /dev/null +++ b/packages/docusaurus/src/commands/swizzle/__tests__/__fixtures__/theme/JsComponent/index.css @@ -0,0 +1,3 @@ +.testClass { + background: black; +} diff --git a/packages/docusaurus/src/commands/swizzle/__tests__/__fixtures__/theme/JsComponent/index.d.ts b/packages/docusaurus/src/commands/swizzle/__tests__/__fixtures__/theme/JsComponent/index.d.ts new file mode 100644 index 000000000000..ee6b81b544ad --- /dev/null +++ b/packages/docusaurus/src/commands/swizzle/__tests__/__fixtures__/theme/JsComponent/index.d.ts @@ -0,0 +1 @@ +export default function JsComponent(props: {}): JSX.Element; diff --git a/packages/docusaurus/src/commands/swizzle/__tests__/__fixtures__/theme/JsComponent/index.js b/packages/docusaurus/src/commands/swizzle/__tests__/__fixtures__/theme/JsComponent/index.js new file mode 100644 index 000000000000..dcf3086a302e --- /dev/null +++ b/packages/docusaurus/src/commands/swizzle/__tests__/__fixtures__/theme/JsComponent/index.js @@ -0,0 +1,5 @@ +import React from 'react'; + +export default function NoIndexComp1() { + return
NoIndexComp1
; +} diff --git a/packages/docusaurus/src/commands/swizzle/__tests__/__snapshots__/index.test.ts.snap b/packages/docusaurus/src/commands/swizzle/__tests__/__snapshots__/index.test.ts.snap index 31fa888fe07c..2971f6e9f8c7 100644 --- a/packages/docusaurus/src/commands/swizzle/__tests__/__snapshots__/index.test.ts.snap +++ b/packages/docusaurus/src/commands/swizzle/__tests__/__snapshots__/index.test.ts.snap @@ -7,15 +7,6 @@ exports[`swizzle eject ComponentInFolder JS: ComponentInFolder/Sibling.css 1`] = " `; -exports[`swizzle eject ComponentInFolder JS: ComponentInFolder/Sibling.tsx 1`] = ` -"import React from 'react'; - -export default function Sibling() { - return
Sibling
; -} -" -`; - exports[`swizzle eject ComponentInFolder JS: ComponentInFolder/index.css 1`] = ` ".testClass { background: black; @@ -23,22 +14,11 @@ exports[`swizzle eject ComponentInFolder JS: ComponentInFolder/index.css 1`] = ` " `; -exports[`swizzle eject ComponentInFolder JS: ComponentInFolder/index.tsx 1`] = ` -"import React from 'react'; - -export default function ComponentInFolder() { - return
ComponentInFolder
; -} -" -`; - exports[`swizzle eject ComponentInFolder JS: theme dir tree 1`] = ` "theme └── ComponentInFolder ├── Sibling.css - ├── Sibling.tsx - ├── index.css - └── index.tsx" + └── index.css" `; exports[`swizzle eject ComponentInFolder TS: ComponentInFolder/Sibling.css 1`] = ` @@ -89,15 +69,6 @@ exports[`swizzle eject ComponentInFolder/ComponentInSubFolder JS: ComponentInFol " `; -exports[`swizzle eject ComponentInFolder/ComponentInSubFolder JS: ComponentInFolder/ComponentInSubFolder/index.tsx 1`] = ` -"import React from 'react'; - -export default function ComponentInSubFolder() { - return
ComponentInSubFolder
; -} -" -`; - exports[`swizzle eject ComponentInFolder/ComponentInSubFolder JS: ComponentInFolder/ComponentInSubFolder/styles.css 1`] = ` ".testClass { background: black; @@ -117,7 +88,6 @@ exports[`swizzle eject ComponentInFolder/ComponentInSubFolder JS: theme dir tree └── ComponentInFolder └── ComponentInSubFolder ├── index.css - ├── index.tsx ├── styles.css └── styles.module.css" `; @@ -169,20 +139,10 @@ exports[`swizzle eject ComponentInFolder/Sibling JS: ComponentInFolder/Sibling.c " `; -exports[`swizzle eject ComponentInFolder/Sibling JS: ComponentInFolder/Sibling.tsx 1`] = ` -"import React from 'react'; - -export default function Sibling() { - return
Sibling
; -} -" -`; - exports[`swizzle eject ComponentInFolder/Sibling JS: theme dir tree 1`] = ` "theme └── ComponentInFolder - ├── Sibling.css - └── Sibling.tsx" + └── Sibling.css" `; exports[`swizzle eject ComponentInFolder/Sibling TS: ComponentInFolder/Sibling.css 1`] = ` @@ -215,19 +175,9 @@ exports[`swizzle eject FirstLevelComponent JS: FirstLevelComponent.css 1`] = ` " `; -exports[`swizzle eject FirstLevelComponent JS: FirstLevelComponent.tsx 1`] = ` -"import React from 'react'; - -export default function FirstLevelComponent() { - return
First level component
; -} -" -`; - exports[`swizzle eject FirstLevelComponent JS: theme dir tree 1`] = ` "theme -├── FirstLevelComponent.css -└── FirstLevelComponent.tsx" +└── FirstLevelComponent.css" `; exports[`swizzle eject FirstLevelComponent TS: FirstLevelComponent.css 1`] = ` diff --git a/packages/docusaurus/src/commands/swizzle/__tests__/actions.test.ts b/packages/docusaurus/src/commands/swizzle/__tests__/actions.test.ts index 2bbfca6407ab..b6e7bed38bde 100644 --- a/packages/docusaurus/src/commands/swizzle/__tests__/actions.test.ts +++ b/packages/docusaurus/src/commands/swizzle/__tests__/actions.test.ts @@ -24,13 +24,18 @@ function stableCreatedFiles( } describe('eject', () => { - async function testEject(action: SwizzleAction, componentName: string) { + async function testEject( + action: SwizzleAction, + componentName: string, + {typescript}: {typescript: boolean} = {typescript: true}, + ) { const siteDir = await createTempSiteDir(); const siteThemePath = path.join(siteDir, 'src/theme'); const result = await eject({ siteDir, componentName, themePath: ThemePath, + typescript, }); return { siteDir, @@ -53,6 +58,22 @@ describe('eject', () => { `); }); + it(`eject ${Components.JsComponent} JS`, async () => { + const result = await testEject('eject', Components.JsComponent, { + typescript: false, + }); + expect(result.createdFiles).toEqual([ + 'JsComponent/index.css', + 'JsComponent/index.js', + ]); + expect(result.tree).toMatchInlineSnapshot(` + "theme + └── JsComponent + ├── index.css + └── index.js" + `); + }); + it(`eject ${Components.ComponentInSubFolder}`, async () => { const result = await testEject('eject', Components.ComponentInSubFolder); expect(result.createdFiles).toEqual([ diff --git a/packages/docusaurus/src/commands/swizzle/__tests__/components.test.ts b/packages/docusaurus/src/commands/swizzle/__tests__/components.test.ts index c16a7a0d619a..140c973fe5dc 100644 --- a/packages/docusaurus/src/commands/swizzle/__tests__/components.test.ts +++ b/packages/docusaurus/src/commands/swizzle/__tests__/components.test.ts @@ -19,6 +19,7 @@ describe('readComponentNames', () => { Components.ComponentInSubFolder, Components.Sibling, Components.FirstLevelComponent, + Components.JsComponent, Components.NoIndexComp1, Components.NoIndexComp2, Components.NoIndexSubComp, @@ -69,6 +70,7 @@ describe('getThemeComponents', () => { Components.ComponentInSubFolder, Components.Sibling, Components.FirstLevelComponent, + Components.JsComponent, Components.NoIndex, Components.NoIndexComp1, Components.NoIndexComp2, diff --git a/packages/docusaurus/src/commands/swizzle/__tests__/testUtils.ts b/packages/docusaurus/src/commands/swizzle/__tests__/testUtils.ts index e0e9acf7958a..c13d4804f5ef 100644 --- a/packages/docusaurus/src/commands/swizzle/__tests__/testUtils.ts +++ b/packages/docusaurus/src/commands/swizzle/__tests__/testUtils.ts @@ -16,6 +16,7 @@ export const Components = { Sibling: 'ComponentInFolder/Sibling', ComponentInFolder: 'ComponentInFolder', FirstLevelComponent: 'FirstLevelComponent', + JsComponent: 'JsComponent', NoIndex: 'NoIndex', NoIndexComp1: 'NoIndex/NoIndexComp1', NoIndexComp2: 'NoIndex/NoIndexComp2', diff --git a/packages/docusaurus/src/commands/swizzle/actions.ts b/packages/docusaurus/src/commands/swizzle/actions.ts index 3bc38febcd75..a9082737c104 100644 --- a/packages/docusaurus/src/commands/swizzle/actions.ts +++ b/packages/docusaurus/src/commands/swizzle/actions.ts @@ -33,6 +33,7 @@ export type ActionParams = { siteDir: string; themePath: string; componentName: string; + typescript: boolean; }; export type ActionResult = { @@ -49,6 +50,7 @@ export async function eject({ siteDir, themePath, componentName, + typescript, }: ActionParams): Promise { const fromPath = path.join(themePath, componentName); const isDirectory = await isDir(fromPath); @@ -60,7 +62,12 @@ export async function eject({ const globPatternPosix = posixPath(globPattern); const filesToCopy = await Globby(globPatternPosix, { - ignore: ['**/*.{story,stories,test,tests}.{js,jsx,ts,tsx}'], + ignore: _.compact([ + '**/*.{story,stories,test,tests}.{js,jsx,ts,tsx}', + // When ejecting JS components, we want to avoid emitting TS files + // In particular the .d.ts files that theme build output contains + typescript ? null : '**/*.{d.ts,ts,tsx}', + ]), }); if (filesToCopy.length === 0) { @@ -103,7 +110,6 @@ export async function wrap({ typescript, importType = 'original', }: ActionParams & { - typescript: boolean; importType?: 'original' | 'init'; }): Promise { const isDirectory = await isDir(path.join(themePath, themeComponentName)); diff --git a/packages/docusaurus/src/commands/swizzle/index.ts b/packages/docusaurus/src/commands/swizzle/index.ts index df5e06605511..1c76f59d7c62 100644 --- a/packages/docusaurus/src/commands/swizzle/index.ts +++ b/packages/docusaurus/src/commands/swizzle/index.ts @@ -145,6 +145,7 @@ Created wrapper of name=${componentName} from name=${themeName} in path=${result siteDir, themePath, componentName, + typescript, }); logger.success` Ejected name=${componentName} from name=${themeName} to path=${result.createdFiles} diff --git a/website/_dogfooding/testSwizzleThemeClassic.mjs b/website/_dogfooding/testSwizzleThemeClassic.mjs index 6f635bea5718..0f6af4da0609 100644 --- a/website/_dogfooding/testSwizzleThemeClassic.mjs +++ b/website/_dogfooding/testSwizzleThemeClassic.mjs @@ -30,7 +30,7 @@ const classicThemePathBase = path.join( '../../packages/docusaurus-theme-classic', ); -const themePath = swizzleConfig +const themePath = typescript ? path.join(classicThemePathBase, 'src/theme') : path.join(classicThemePathBase, 'lib/theme'); @@ -98,13 +98,13 @@ for (const componentName of componentNames) { siteDir: toPath, themePath, componentName, + typescript, }; switch (action) { case 'wrap': return wrap({ ...baseParams, importType: 'init', // For these tests, "theme-original" imports are causing an expected infinite loop - typescript, }); case 'eject': return eject(baseParams);