From 0706f11cfb1a6fb2200986f729c0180d84d0ce4e Mon Sep 17 00:00:00 2001 From: yixiaojiu Date: Fri, 29 Dec 2023 11:19:45 +0800 Subject: [PATCH 1/5] feat(swizzle): added a language prompt when no flag is provided --- packages/docusaurus/bin/docusaurus.mjs | 4 ++++ .../docusaurus/src/commands/swizzle/common.ts | 2 ++ .../docusaurus/src/commands/swizzle/index.ts | 11 +++++++-- .../src/commands/swizzle/language.ts | 24 +++++++++++++++++++ .../src/commands/swizzle/prompts.ts | 20 ++++++++++++++++ 5 files changed, 59 insertions(+), 2 deletions(-) create mode 100644 packages/docusaurus/src/commands/swizzle/language.ts diff --git a/packages/docusaurus/bin/docusaurus.mjs b/packages/docusaurus/bin/docusaurus.mjs index b65915bcd6bd..e10200b5db5b 100755 --- a/packages/docusaurus/bin/docusaurus.mjs +++ b/packages/docusaurus/bin/docusaurus.mjs @@ -86,6 +86,10 @@ cli '-t, --typescript', 'copy TypeScript theme files when possible (default: false)', ) + .option( + '-j, --javascript', + 'copy Javascript theme files when possible (default: false)', + ) .option('--danger', 'enable swizzle for unsafe component of themes') .option( '--config ', diff --git a/packages/docusaurus/src/commands/swizzle/common.ts b/packages/docusaurus/src/commands/swizzle/common.ts index 4ca7c391b8f9..63ccdbe75071 100644 --- a/packages/docusaurus/src/commands/swizzle/common.ts +++ b/packages/docusaurus/src/commands/swizzle/common.ts @@ -63,6 +63,7 @@ export type SwizzleContext = {plugins: SwizzlePlugin[]}; export type SwizzleCLIOptions = { typescript: boolean; + javascript: boolean; danger: boolean; list: boolean; wrap: boolean; @@ -75,6 +76,7 @@ export function normalizeOptions( ): SwizzleCLIOptions { return { typescript: options.typescript ?? false, + javascript: options.javascript ?? false, danger: options.danger ?? false, list: options.list ?? false, wrap: options.wrap ?? false, diff --git a/packages/docusaurus/src/commands/swizzle/index.ts b/packages/docusaurus/src/commands/swizzle/index.ts index d03ec217fdd1..c349fc9c108c 100644 --- a/packages/docusaurus/src/commands/swizzle/index.ts +++ b/packages/docusaurus/src/commands/swizzle/index.ts @@ -15,6 +15,7 @@ import {eject, getAction, wrap} from './actions'; import {getThemeSwizzleConfig} from './config'; import {askSwizzleDangerousComponent} from './prompts'; import {initSwizzleContext} from './context'; +import {getLanguage} from './language'; import type {SwizzleAction, SwizzleComponentConfig} from '@docusaurus/types'; import type {SwizzleCLIOptions, SwizzlePlugin} from './common'; import type {ActionResult} from './actions'; @@ -96,15 +97,21 @@ export async function swizzle( const siteDir = await fs.realpath(siteDirParam); const options = normalizeOptions(optionsParam); - const {list, danger, typescript} = options; + const {list, danger} = options; const {plugins} = await initSwizzleContext(siteDir, options); const themeNames = getThemeNames(plugins); if (list && !themeNameParam) { - await listAllThemeComponents({themeNames, plugins, typescript}); + await listAllThemeComponents({ + themeNames, + plugins, + typescript: options.typescript, + }); } + const typescript = (await getLanguage(options)) === 'typescript'; + const themeName = await getThemeName({themeNameParam, themeNames, list}); const themePath = getThemePath({themeName, plugins, typescript}); const swizzleConfig = getThemeSwizzleConfig(themeName, plugins); diff --git a/packages/docusaurus/src/commands/swizzle/language.ts b/packages/docusaurus/src/commands/swizzle/language.ts new file mode 100644 index 000000000000..3d1d1c95aa70 --- /dev/null +++ b/packages/docusaurus/src/commands/swizzle/language.ts @@ -0,0 +1,24 @@ +/** + * Copyright (c) Facebook, Inc. and its affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + +import {askLanguage} from './prompts'; +import type {SwizzleCLIOptions} from './common'; + +export type Languages = 'typescript' | 'javascript'; + +export async function getLanguage( + options: SwizzleCLIOptions, +): Promise { + if (options.typescript) { + return 'typescript'; + } + if (options.javascript) { + return 'javascript'; + } + + return askLanguage(); +} diff --git a/packages/docusaurus/src/commands/swizzle/prompts.ts b/packages/docusaurus/src/commands/swizzle/prompts.ts index 35d85e33875d..1a13e0688b55 100644 --- a/packages/docusaurus/src/commands/swizzle/prompts.ts +++ b/packages/docusaurus/src/commands/swizzle/prompts.ts @@ -8,6 +8,7 @@ import logger from '@docusaurus/logger'; import prompts from 'prompts'; import {actionStatusSuffix, PartiallySafeHint} from './common'; +import type {Languages} from './language'; import type {ThemeComponents} from './components'; import type {SwizzleAction, SwizzleComponentConfig} from '@docusaurus/types'; @@ -125,3 +126,22 @@ export async function askSwizzleAction( return action; } + +export async function askLanguage(): Promise { + const {language} = (await prompts({ + type: 'select', + name: 'language', + message: 'Which language do you want to swizzle?', + choices: [ + {title: logger.bold('JavaScript'), value: 'javascript'}, + {title: logger.bold('TypeScript'), value: 'typescript'}, + {title: ExitTitle, value: '[Exit]'}, + ], + })) as {language: Languages | '[Exit]'}; + + if (typeof language === 'undefined' || language === '[Exit]') { + return process.exit(0); + } + + return language; +} From 72aa13f364ac3939a4e29cae6833c664795bba8b Mon Sep 17 00:00:00 2001 From: sebastien Date: Thu, 15 Feb 2024 13:35:56 +0100 Subject: [PATCH 2/5] typo --- packages/docusaurus/bin/docusaurus.mjs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/docusaurus/bin/docusaurus.mjs b/packages/docusaurus/bin/docusaurus.mjs index 0721381b2791..cd53d42d5952 100755 --- a/packages/docusaurus/bin/docusaurus.mjs +++ b/packages/docusaurus/bin/docusaurus.mjs @@ -87,7 +87,7 @@ cli ) .option( '-j, --javascript', - 'copy Javascript theme files when possible (default: false)', + 'copy JavaScript theme files when possible (default: false)', ) .option('--danger', 'enable swizzle for unsafe component of themes') .option( From 08ead5cdcf0fd56cfd33f8c8de6d997d857ddf24 Mon Sep 17 00:00:00 2001 From: sebastien Date: Thu, 15 Feb 2024 13:41:52 +0100 Subject: [PATCH 3/5] ensure swizzle unit tests do not prompt for language --- .../docusaurus/src/commands/swizzle/__tests__/index.test.ts | 2 ++ 1 file changed, 2 insertions(+) diff --git a/packages/docusaurus/src/commands/swizzle/__tests__/index.test.ts b/packages/docusaurus/src/commands/swizzle/__tests__/index.test.ts index ba940b5c9d19..013fbab245eb 100644 --- a/packages/docusaurus/src/commands/swizzle/__tests__/index.test.ts +++ b/packages/docusaurus/src/commands/swizzle/__tests__/index.test.ts @@ -115,6 +115,7 @@ async function createTestSite() { wrap: true, danger: true, typescript, + javascript: !typescript, }); } @@ -129,6 +130,7 @@ async function createTestSite() { eject: true, danger: true, typescript, + javascript: !typescript, }); } From 20c8f26859c33cf86b0ca3a4cc131361ff01f1b2 Mon Sep 17 00:00:00 2001 From: sebastien Date: Thu, 15 Feb 2024 13:48:12 +0100 Subject: [PATCH 4/5] use the askPreferredLanguage helper from docusaurus utils --- .../docusaurus/src/commands/swizzle/index.ts | 12 +++++++++- .../src/commands/swizzle/language.ts | 24 ------------------- .../src/commands/swizzle/prompts.ts | 20 ---------------- 3 files changed, 11 insertions(+), 45 deletions(-) delete mode 100644 packages/docusaurus/src/commands/swizzle/language.ts diff --git a/packages/docusaurus/src/commands/swizzle/index.ts b/packages/docusaurus/src/commands/swizzle/index.ts index c349fc9c108c..b2e7aa2bc172 100644 --- a/packages/docusaurus/src/commands/swizzle/index.ts +++ b/packages/docusaurus/src/commands/swizzle/index.ts @@ -7,6 +7,7 @@ import fs from 'fs-extra'; import logger from '@docusaurus/logger'; +import {askPreferredLanguage} from '@docusaurus/utils'; import {getThemeName, getThemePath, getThemeNames} from './themes'; import {getThemeComponents, getComponentName} from './components'; import {helpTables, themeComponentsTable} from './tables'; @@ -15,11 +16,20 @@ import {eject, getAction, wrap} from './actions'; import {getThemeSwizzleConfig} from './config'; import {askSwizzleDangerousComponent} from './prompts'; import {initSwizzleContext} from './context'; -import {getLanguage} from './language'; import type {SwizzleAction, SwizzleComponentConfig} from '@docusaurus/types'; import type {SwizzleCLIOptions, SwizzlePlugin} from './common'; import type {ActionResult} from './actions'; +async function getLanguage(options: SwizzleCLIOptions) { + if (options.typescript) { + return 'typescript'; + } + if (options.javascript) { + return 'javascript'; + } + return askPreferredLanguage({exit: true}); +} + async function listAllThemeComponents({ themeNames, plugins, diff --git a/packages/docusaurus/src/commands/swizzle/language.ts b/packages/docusaurus/src/commands/swizzle/language.ts deleted file mode 100644 index 3d1d1c95aa70..000000000000 --- a/packages/docusaurus/src/commands/swizzle/language.ts +++ /dev/null @@ -1,24 +0,0 @@ -/** - * Copyright (c) Facebook, Inc. and its affiliates. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - */ - -import {askLanguage} from './prompts'; -import type {SwizzleCLIOptions} from './common'; - -export type Languages = 'typescript' | 'javascript'; - -export async function getLanguage( - options: SwizzleCLIOptions, -): Promise { - if (options.typescript) { - return 'typescript'; - } - if (options.javascript) { - return 'javascript'; - } - - return askLanguage(); -} diff --git a/packages/docusaurus/src/commands/swizzle/prompts.ts b/packages/docusaurus/src/commands/swizzle/prompts.ts index 1a13e0688b55..35d85e33875d 100644 --- a/packages/docusaurus/src/commands/swizzle/prompts.ts +++ b/packages/docusaurus/src/commands/swizzle/prompts.ts @@ -8,7 +8,6 @@ import logger from '@docusaurus/logger'; import prompts from 'prompts'; import {actionStatusSuffix, PartiallySafeHint} from './common'; -import type {Languages} from './language'; import type {ThemeComponents} from './components'; import type {SwizzleAction, SwizzleComponentConfig} from '@docusaurus/types'; @@ -126,22 +125,3 @@ export async function askSwizzleAction( return action; } - -export async function askLanguage(): Promise { - const {language} = (await prompts({ - type: 'select', - name: 'language', - message: 'Which language do you want to swizzle?', - choices: [ - {title: logger.bold('JavaScript'), value: 'javascript'}, - {title: logger.bold('TypeScript'), value: 'typescript'}, - {title: ExitTitle, value: '[Exit]'}, - ], - })) as {language: Languages | '[Exit]'}; - - if (typeof language === 'undefined' || language === '[Exit]') { - return process.exit(0); - } - - return language; -} From 5a74613a5d7396cca835c71efeed6ea1880ef7b0 Mon Sep 17 00:00:00 2001 From: sebastien Date: Thu, 15 Feb 2024 14:11:57 +0100 Subject: [PATCH 5/5] Do not prompt the user if theme only supports JS Fail-fast if user uses --typescript option with a theme that does not support TS --- .../docusaurus/src/commands/swizzle/index.ts | 49 ++++++++++++++++--- 1 file changed, 43 insertions(+), 6 deletions(-) diff --git a/packages/docusaurus/src/commands/swizzle/index.ts b/packages/docusaurus/src/commands/swizzle/index.ts index b2e7aa2bc172..c4c2a3ae4a6c 100644 --- a/packages/docusaurus/src/commands/swizzle/index.ts +++ b/packages/docusaurus/src/commands/swizzle/index.ts @@ -8,7 +8,12 @@ import fs from 'fs-extra'; import logger from '@docusaurus/logger'; import {askPreferredLanguage} from '@docusaurus/utils'; -import {getThemeName, getThemePath, getThemeNames} from './themes'; +import { + getThemeName, + getThemePath, + getThemeNames, + getPluginByThemeName, +} from './themes'; import {getThemeComponents, getComponentName} from './components'; import {helpTables, themeComponentsTable} from './tables'; import {normalizeOptions} from './common'; @@ -20,14 +25,39 @@ import type {SwizzleAction, SwizzleComponentConfig} from '@docusaurus/types'; import type {SwizzleCLIOptions, SwizzlePlugin} from './common'; import type {ActionResult} from './actions'; -async function getLanguage(options: SwizzleCLIOptions) { +async function getLanguageForThemeName({ + themeName, + plugins, + options, +}: { + themeName: string; + plugins: SwizzlePlugin[]; + options: SwizzleCLIOptions; +}): Promise<'javascript' | 'typescript'> { + const plugin = getPluginByThemeName(plugins, themeName); + const supportsTS = !!plugin.instance.getTypeScriptThemePath?.(); + if (options.typescript) { + if (!supportsTS) { + throw new Error( + logger.interpolate`Theme name=${ + plugin.instance.name + } does not support the code=${'--typescript'} CLI option.`, + ); + } return 'typescript'; } + if (options.javascript) { return 'javascript'; } - return askPreferredLanguage({exit: true}); + + // It's only useful to prompt the user for themes that support both JS/TS + if (supportsTS) { + return askPreferredLanguage({exit: true}); + } + + return 'javascript'; } async function listAllThemeComponents({ @@ -120,10 +150,17 @@ export async function swizzle( }); } - const typescript = (await getLanguage(options)) === 'typescript'; - const themeName = await getThemeName({themeNameParam, themeNames, list}); - const themePath = getThemePath({themeName, plugins, typescript}); + + const language = await getLanguageForThemeName({themeName, plugins, options}); + const typescript = language === 'typescript'; + + const themePath = getThemePath({ + themeName, + plugins, + typescript, + }); + const swizzleConfig = getThemeSwizzleConfig(themeName, plugins); const themeComponents = await getThemeComponents({