From e5f7b9b23b51e93c5a6d2212fac4ef6e03a86248 Mon Sep 17 00:00:00 2001 From: Rafael Martins Date: Mon, 23 Oct 2023 21:22:57 -0300 Subject: [PATCH 1/6] feat(create-docusaurus): added a language prompt when no flag is informed --- packages/create-docusaurus/bin/index.js | 1 + packages/create-docusaurus/src/index.ts | 37 +++++++++++++++++++++++-- 2 files changed, 35 insertions(+), 3 deletions(-) diff --git a/packages/create-docusaurus/bin/index.js b/packages/create-docusaurus/bin/index.js index 6228ba8a0524..84d0c9e4f1d9 100755 --- a/packages/create-docusaurus/bin/index.js +++ b/packages/create-docusaurus/bin/index.js @@ -38,6 +38,7 @@ program 'Do not run package manager immediately after scaffolding', ) .option('-t, --typescript', 'Use the TypeScript template variant') + .option('-j, --javascript', 'Use the JavaScript template variant') .option( '-g, --git-strategy ', `Only used if the template is a git repository. diff --git a/packages/create-docusaurus/src/index.ts b/packages/create-docusaurus/src/index.ts index f216e3651c47..a42e647f40a7 100755 --- a/packages/create-docusaurus/src/index.ts +++ b/packages/create-docusaurus/src/index.ts @@ -15,12 +15,16 @@ import prompts, {type Choice} from 'prompts'; import supportsColor from 'supports-color'; import {escapeShellArg} from '@docusaurus/utils'; +type Languages = { + javascript?: boolean; + typescript?: boolean; +}; + type CLIOptions = { packageManager?: PackageManager; skipInstall?: boolean; - typescript?: boolean; gitStrategy?: GitStrategy; -}; +} & Languages; // Only used in the rare, rare case of running globally installed create + // using --skip-install. We need a default name to show the tip text @@ -418,6 +422,7 @@ async function getSource( }; } let useTS = cliOptions.typescript; + if (!useTS && template.tsVariantPath) { ({useTS} = (await prompts({ type: 'confirm', @@ -452,7 +457,33 @@ export default async function init( getSiteName(reqName, rootDir), ]); const dest = path.resolve(rootDir, siteName); - const source = await getSource(reqTemplate, templates, cliOptions); + + let language: {javascript?: boolean; typescript?: boolean} = {}; + if (!cliOptions.typescript && !cliOptions.javascript) { + const {language: selectedLanguage} = (await prompts( + { + type: 'select', + name: 'language', + message: 'What language you want to use?', + choices: [ + {title: 'JavaScript', value: 'javascript'}, + {title: 'TypeScript', value: 'typescript'}, + ], + }, + { + onCancel() { + logger.info`Falling back to language=${'javascript'}`; + }, + }, + )) as {language: keyof Languages}; + + language = {[selectedLanguage]: true}; + } + + const source = await getSource(reqTemplate, templates, { + ...cliOptions, + ...language, + }); logger.info('Creating new Docusaurus project...'); From 0d38d2d569188b6a4ebd70ccce8aa564ee05a0ab Mon Sep 17 00:00:00 2001 From: Rafael Martins Date: Wed, 25 Oct 2023 16:38:37 -0300 Subject: [PATCH 2/6] fix: address pr review extract language logic into cliUtils consider template to decide if the prompt will show or not --- packages/create-docusaurus/src/index.ts | 78 ++++++++++------------- packages/docusaurus-utils/package.json | 1 + packages/docusaurus-utils/src/cliUtils.ts | 44 +++++++++++++ packages/docusaurus-utils/src/index.ts | 1 + 4 files changed, 81 insertions(+), 43 deletions(-) create mode 100644 packages/docusaurus-utils/src/cliUtils.ts diff --git a/packages/create-docusaurus/src/index.ts b/packages/create-docusaurus/src/index.ts index a42e647f40a7..33959c965b2b 100755 --- a/packages/create-docusaurus/src/index.ts +++ b/packages/create-docusaurus/src/index.ts @@ -13,18 +13,17 @@ import logger from '@docusaurus/logger'; import shell from 'shelljs'; import prompts, {type Choice} from 'prompts'; import supportsColor from 'supports-color'; -import {escapeShellArg} from '@docusaurus/utils'; - -type Languages = { - javascript?: boolean; - typescript?: boolean; -}; +import { + escapeShellArg, + getLanguage, + type LanguagesOptions, +} from '@docusaurus/utils'; type CLIOptions = { packageManager?: PackageManager; skipInstall?: boolean; gitStrategy?: GitStrategy; -} & Languages; +} & LanguagesOptions; // Only used in the rare, rare case of running globally installed create + // using --skip-install. We need a default name to show the tip text @@ -221,6 +220,23 @@ async function getGitCommand(gitStrategy: GitStrategy): Promise { } } +function getTemplate( + templates: Template[], + reqTemplate?: string, + typescript?: boolean, +) { + const template = templates.find((t) => t.name === reqTemplate); + if (!template) { + logger.error('Invalid template.'); + process.exit(1); + } + if (typescript && !template.tsVariantPath) { + logger.error`Template name=${reqTemplate!} doesn't provide the TypeScript variant.`; + process.exit(1); + } + return template; +} + async function getSiteName( reqName: string | undefined, rootDir: string, @@ -279,6 +295,7 @@ type Source = async function getSource( reqTemplate: string | undefined, templates: Template[], + language: LanguagesOptions, cliOptions: CLIOptions, ): Promise { if (reqTemplate) { @@ -303,19 +320,13 @@ async function getSource( path: path.resolve(reqTemplate), }; } - const template = templates.find((t) => t.name === reqTemplate); - if (!template) { - logger.error('Invalid template.'); - process.exit(1); - } - if (cliOptions.typescript && !template.tsVariantPath) { - logger.error`Template name=${reqTemplate} doesn't provide the TypeScript variant.`; - process.exit(1); - } + + const template = getTemplate(templates, reqTemplate, language.typescript); + return { type: 'template', template, - typescript: cliOptions.typescript ?? false, + typescript: language.typescript ?? false, }; } const template = cliOptions.gitStrategy @@ -421,7 +432,7 @@ async function getSource( path: templateDir, }; } - let useTS = cliOptions.typescript; + let useTS = language.typescript; if (!useTS && template.tsVariantPath) { ({useTS} = (await prompts({ @@ -457,33 +468,14 @@ export default async function init( getSiteName(reqName, rootDir), ]); const dest = path.resolve(rootDir, siteName); + const {typescript, javascript} = cliOptions; + const languageOptions = {typescript, javascript}; + const noTsVersionAvailable = !getTemplate(templates, reqTemplate, typescript) + .tsVariantPath; - let language: {javascript?: boolean; typescript?: boolean} = {}; - if (!cliOptions.typescript && !cliOptions.javascript) { - const {language: selectedLanguage} = (await prompts( - { - type: 'select', - name: 'language', - message: 'What language you want to use?', - choices: [ - {title: 'JavaScript', value: 'javascript'}, - {title: 'TypeScript', value: 'typescript'}, - ], - }, - { - onCancel() { - logger.info`Falling back to language=${'javascript'}`; - }, - }, - )) as {language: keyof Languages}; + const language = await getLanguage(languageOptions, noTsVersionAvailable); - language = {[selectedLanguage]: true}; - } - - const source = await getSource(reqTemplate, templates, { - ...cliOptions, - ...language, - }); + const source = await getSource(reqTemplate, templates, language, cliOptions); logger.info('Creating new Docusaurus project...'); diff --git a/packages/docusaurus-utils/package.json b/packages/docusaurus-utils/package.json index b25bd96bbe02..a24ac4715675 100644 --- a/packages/docusaurus-utils/package.json +++ b/packages/docusaurus-utils/package.json @@ -30,6 +30,7 @@ "js-yaml": "^4.1.0", "lodash": "^4.17.21", "micromatch": "^4.0.5", + "prompts": "^2.4.2", "resolve-pathname": "^3.0.0", "shelljs": "^0.8.5", "tslib": "^2.6.0", diff --git a/packages/docusaurus-utils/src/cliUtils.ts b/packages/docusaurus-utils/src/cliUtils.ts new file mode 100644 index 000000000000..6bec0d99dc9a --- /dev/null +++ b/packages/docusaurus-utils/src/cliUtils.ts @@ -0,0 +1,44 @@ +/** + * 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 prompts from 'prompts'; +import logger from '@docusaurus/logger'; + +export type LanguagesOptions = { + javascript?: boolean; + typescript?: boolean; +}; + +export async function getLanguage( + languages: LanguagesOptions, + noTsVersionAvailable?: boolean, +): Promise { + if (languages.typescript || languages.javascript) { + return languages; + } + if (noTsVersionAvailable) { + return {javascript: true}; + } + const {language: selectedLanguage} = (await prompts( + { + type: 'select', + name: 'language', + message: 'Which language do you want to use?', + choices: [ + {title: 'JavaScript', value: 'javascript'}, + {title: 'TypeScript', value: 'typescript'}, + ], + }, + { + onCancel() { + logger.info`Falling back to language=${'javascript'}`; + }, + }, + )) as {language: keyof LanguagesOptions}; + + return {[selectedLanguage]: true}; +} diff --git a/packages/docusaurus-utils/src/index.ts b/packages/docusaurus-utils/src/index.ts index d5cabc65301a..8c6fed8557c0 100644 --- a/packages/docusaurus-utils/src/index.ts +++ b/packages/docusaurus-utils/src/index.ts @@ -110,3 +110,4 @@ export { } from './dataFileUtils'; export {isDraft, isUnlisted} from './contentVisibilityUtils'; export {escapeRegexp} from './regExpUtils'; +export {getLanguage, type LanguagesOptions} from './cliUtils'; From 7a3ce2ac10d8e02f14802ec2ea0a8ca9d91ded46 Mon Sep 17 00:00:00 2001 From: sebastien Date: Thu, 15 Feb 2024 12:14:49 +0100 Subject: [PATCH 3/6] Better handling of create-docusaurus javascript/typescript option + refactor --- packages/create-docusaurus/src/index.ts | 389 ++++++++++++---------- packages/docusaurus-utils/src/cliUtils.ts | 63 ++-- packages/docusaurus-utils/src/index.ts | 2 +- 3 files changed, 262 insertions(+), 192 deletions(-) diff --git a/packages/create-docusaurus/src/index.ts b/packages/create-docusaurus/src/index.ts index 33959c965b2b..769fb4885213 100755 --- a/packages/create-docusaurus/src/index.ts +++ b/packages/create-docusaurus/src/index.ts @@ -13,17 +13,28 @@ import logger from '@docusaurus/logger'; import shell from 'shelljs'; import prompts, {type Choice} from 'prompts'; import supportsColor from 'supports-color'; -import { - escapeShellArg, - getLanguage, - type LanguagesOptions, -} from '@docusaurus/utils'; +import {escapeShellArg, askPreferredLanguage} from '@docusaurus/utils'; -type CLIOptions = { +type LanguagesOptions = { + javascript?: boolean; + typescript?: boolean; +}; + +type CLIOptions = LanguagesOptions & { packageManager?: PackageManager; skipInstall?: boolean; gitStrategy?: GitStrategy; -} & LanguagesOptions; +}; + +async function getLanguage(options: LanguagesOptions) { + if (options.typescript) { + return 'typescript'; + } + if (options.javascript) { + return 'javascript'; + } + return askPreferredLanguage(); +} // Only used in the rare, rare case of running globally installed create + // using --skip-install. We need a default name to show the tip text @@ -156,11 +167,14 @@ async function readTemplates(): Promise { async function copyTemplate( template: Template, dest: string, - typescript: boolean, + language: 'javascript' | 'typescript', ): Promise { await fs.copy(path.join(templatesDir, 'shared'), dest); - await fs.copy(typescript ? template.tsVariantPath! : template.path, dest, { + const sourcePath = + language === 'typescript' ? template.tsVariantPath! : template.path; + + await fs.copy(sourcePath, dest, { // Symlinks don't exist in published npm packages anymore, so this is only // to prevent errors during local testing filter: async (filePath) => !(await fs.lstat(filePath)).isSymbolicLink(), @@ -186,6 +200,33 @@ function createTemplateChoices(templates: Template[]): Choice[] { ]; } +async function askTemplateChoice({ + templates, + cliOptions, +}: { + templates: Template[]; + cliOptions: CLIOptions; +}) { + return cliOptions.gitStrategy + ? 'Git repository' + : ( + (await prompts( + { + type: 'select', + name: 'template', + message: 'Select a template below...', + choices: createTemplateChoices(templates), + }, + { + onCancel() { + logger.error('A choice is required.'); + process.exit(1); + }, + }, + )) as {template: Template | 'Git repository' | 'Local template'} + ).template; +} + function isValidGitRepoUrl(gitRepoUrl: string): boolean { return ['https://', 'git@'].some((item) => gitRepoUrl.startsWith(item)); } @@ -220,23 +261,6 @@ async function getGitCommand(gitStrategy: GitStrategy): Promise { } } -function getTemplate( - templates: Template[], - reqTemplate?: string, - typescript?: boolean, -) { - const template = templates.find((t) => t.name === reqTemplate); - if (!template) { - logger.error('Invalid template.'); - process.exit(1); - } - if (typescript && !template.tsVariantPath) { - logger.error`Template name=${reqTemplate!} doesn't provide the TypeScript variant.`; - process.exit(1); - } - return template; -} - async function getSiteName( reqName: string | undefined, rootDir: string, @@ -280,7 +304,7 @@ type Source = | { type: 'template'; template: Template; - typescript: boolean; + language: 'javascript' | 'typescript'; } | { type: 'git'; @@ -292,162 +316,193 @@ type Source = path: string; }; -async function getSource( - reqTemplate: string | undefined, - templates: Template[], - language: LanguagesOptions, - cliOptions: CLIOptions, -): Promise { - if (reqTemplate) { - if (isValidGitRepoUrl(reqTemplate)) { - if ( - cliOptions.gitStrategy && - !gitStrategies.includes(cliOptions.gitStrategy) - ) { - logger.error`Invalid git strategy: name=${ - cliOptions.gitStrategy - }. Value must be one of ${gitStrategies.join(', ')}.`; - process.exit(1); - } - return { - type: 'git', - url: reqTemplate, - strategy: cliOptions.gitStrategy ?? 'deep', - }; - } else if (await fs.pathExists(path.resolve(reqTemplate))) { - return { - type: 'local', - path: path.resolve(reqTemplate), - }; - } +async function createTemplateSource({ + template, + cliOptions, +}: { + template: Template; + cliOptions: CLIOptions; +}): Promise { + const language = await getLanguage(cliOptions); + if (language === 'typescript' && !template.tsVariantPath) { + logger.error`Template name=${template.name} doesn't provide a TypeScript variant.`; + process.exit(1); + } + return { + type: 'template', + template, + language, + }; +} - const template = getTemplate(templates, reqTemplate, language.typescript); +async function getTemplateSource({ + templateName, + templates, + cliOptions, +}: { + templateName: string; + templates: Template[]; + cliOptions: CLIOptions; +}): Promise { + const template = templates.find((t) => t.name === templateName); + if (!template) { + logger.error('Invalid template.'); + process.exit(1); + } + return createTemplateSource({template, cliOptions}); +} +// Get the template source explicitly requested by the user provided cli option +async function getUserProvidedSource({ + reqTemplate, + templates, + cliOptions, +}: { + reqTemplate: string; + templates: Template[]; + cliOptions: CLIOptions; +}): Promise { + if (isValidGitRepoUrl(reqTemplate)) { + if ( + cliOptions.gitStrategy && + !gitStrategies.includes(cliOptions.gitStrategy) + ) { + logger.error`Invalid git strategy: name=${ + cliOptions.gitStrategy + }. Value must be one of ${gitStrategies.join(', ')}.`; + process.exit(1); + } return { - type: 'template', - template, - typescript: language.typescript ?? false, + type: 'git', + url: reqTemplate, + strategy: cliOptions.gitStrategy ?? 'deep', }; } - const template = cliOptions.gitStrategy - ? 'Git repository' - : ( - (await prompts( + if (await fs.pathExists(path.resolve(reqTemplate))) { + return { + type: 'local', + path: path.resolve(reqTemplate), + }; + } + return getTemplateSource({ + templateName: reqTemplate, + templates, + cliOptions, + }); +} + +async function askGitRepositorySource({ + cliOptions, +}: { + cliOptions: CLIOptions; +}): Promise { + const {gitRepoUrl} = (await prompts( + { + type: 'text', + name: 'gitRepoUrl', + validate: (url?: string) => { + if (url && isValidGitRepoUrl(url)) { + return true; + } + return logger.red('Invalid repository URL'); + }, + message: logger.interpolate`Enter a repository URL from GitHub, Bitbucket, GitLab, or any other public repo. +(e.g: url=${'https://github.com/ownerName/repoName.git'})`, + }, + { + onCancel() { + logger.error('A git repo URL is required.'); + process.exit(1); + }, + }, + )) as {gitRepoUrl: string}; + let strategy = cliOptions.gitStrategy; + if (!strategy) { + ({strategy} = (await prompts( + { + type: 'select', + name: 'strategy', + message: 'How should we clone this repo?', + choices: [ + {title: 'Deep clone: preserve full history', value: 'deep'}, + {title: 'Shallow clone: clone with --depth=1', value: 'shallow'}, { - type: 'select', - name: 'template', - message: 'Select a template below...', - choices: createTemplateChoices(templates), + title: 'Copy: do a shallow clone, but do not create a git repo', + value: 'copy', }, { - onCancel() { - logger.error('A choice is required.'); - process.exit(1); - }, + title: 'Custom: enter your custom git clone command', + value: 'custom', }, - )) as {template: Template | 'Git repository' | 'Local template'} - ).template; - if (template === 'Git repository') { - const {gitRepoUrl} = (await prompts( - { - type: 'text', - name: 'gitRepoUrl', - validate: (url?: string) => { - if (url && isValidGitRepoUrl(url)) { - return true; - } - return logger.red('Invalid repository URL'); - }, - message: logger.interpolate`Enter a repository URL from GitHub, Bitbucket, GitLab, or any other public repo. -(e.g: url=${'https://github.com/ownerName/repoName.git'})`, + ], }, { onCancel() { - logger.error('A git repo URL is required.'); - process.exit(1); + logger.info`Falling back to name=${'deep'}`; }, }, - )) as {gitRepoUrl: string}; - let strategy = cliOptions.gitStrategy; - if (!strategy) { - ({strategy} = (await prompts( - { - type: 'select', - name: 'strategy', - message: 'How should we clone this repo?', - choices: [ - {title: 'Deep clone: preserve full history', value: 'deep'}, - {title: 'Shallow clone: clone with --depth=1', value: 'shallow'}, - { - title: 'Copy: do a shallow clone, but do not create a git repo', - value: 'copy', - }, - { - title: 'Custom: enter your custom git clone command', - value: 'custom', - }, - ], - }, - { - onCancel() { - logger.info`Falling back to name=${'deep'}`; - }, - }, - )) as {strategy?: GitStrategy}); - } - return { - type: 'git', - url: gitRepoUrl, - strategy: strategy ?? 'deep', - }; - } else if (template === 'Local template') { - const {templateDir} = (await prompts( - { - type: 'text', - name: 'templateDir', - validate: async (dir?: string) => { - if (dir) { - const fullDir = path.resolve(dir); - if (await fs.pathExists(fullDir)) { - return true; - } - return logger.red( - logger.interpolate`path=${fullDir} does not exist.`, - ); + )) as {strategy?: GitStrategy}); + } + return { + type: 'git', + url: gitRepoUrl, + strategy: strategy ?? 'deep', + }; +} + +async function askLocalSource(): Promise { + const {templateDir} = (await prompts( + { + type: 'text', + name: 'templateDir', + validate: async (dir?: string) => { + if (dir) { + const fullDir = path.resolve(dir); + if (await fs.pathExists(fullDir)) { + return true; } - return logger.red('Please enter a valid path.'); - }, - message: - 'Enter a local folder path, relative to the current working directory.', + return logger.red( + logger.interpolate`path=${fullDir} does not exist.`, + ); + } + return logger.red('Please enter a valid path.'); }, - { - onCancel() { - logger.error('A file path is required.'); - process.exit(1); - }, + message: + 'Enter a local folder path, relative to the current working directory.', + }, + { + onCancel() { + logger.error('A file path is required.'); + process.exit(1); }, - )) as {templateDir: string}; - return { - type: 'local', - path: templateDir, - }; + }, + )) as {templateDir: string}; + return { + type: 'local', + path: templateDir, + }; +} + +async function getSource( + reqTemplate: string | undefined, + templates: Template[], + cliOptions: CLIOptions, +): Promise { + if (reqTemplate) { + return getUserProvidedSource({reqTemplate, templates, cliOptions}); } - let useTS = language.typescript; - if (!useTS && template.tsVariantPath) { - ({useTS} = (await prompts({ - type: 'confirm', - name: 'useTS', - message: - 'This template is available in TypeScript. Do you want to use the TS variant?', - initial: false, - })) as {useTS?: boolean}); + const template = await askTemplateChoice({templates, cliOptions}); + if (template === 'Git repository') { + return askGitRepositorySource({cliOptions}); } - return { - type: 'template', + if (template === 'Local template') { + return askLocalSource(); + } + return createTemplateSource({ template, - typescript: useTS ?? false, - }; + cliOptions, + }); } async function updatePkg(pkgPath: string, obj: {[key: string]: unknown}) { @@ -468,14 +523,8 @@ export default async function init( getSiteName(reqName, rootDir), ]); const dest = path.resolve(rootDir, siteName); - const {typescript, javascript} = cliOptions; - const languageOptions = {typescript, javascript}; - const noTsVersionAvailable = !getTemplate(templates, reqTemplate, typescript) - .tsVariantPath; - - const language = await getLanguage(languageOptions, noTsVersionAvailable); - const source = await getSource(reqTemplate, templates, language, cliOptions); + const source = await getSource(reqTemplate, templates, cliOptions); logger.info('Creating new Docusaurus project...'); @@ -493,7 +542,7 @@ export default async function init( } } else if (source.type === 'template') { try { - await copyTemplate(source.template, dest, source.typescript); + await copyTemplate(source.template, dest, source.language); } catch (err) { logger.error`Copying Docusaurus template name=${source.template.name} failed!`; throw err; diff --git a/packages/docusaurus-utils/src/cliUtils.ts b/packages/docusaurus-utils/src/cliUtils.ts index 6bec0d99dc9a..53eaac7a72b5 100644 --- a/packages/docusaurus-utils/src/cliUtils.ts +++ b/packages/docusaurus-utils/src/cliUtils.ts @@ -5,40 +5,61 @@ * LICENSE file in the root directory of this source tree. */ -import prompts from 'prompts'; +import prompts, {type Choice} from 'prompts'; import logger from '@docusaurus/logger'; -export type LanguagesOptions = { - javascript?: boolean; - typescript?: boolean; +type PreferredLanguage = 'javascript' | 'typescript'; + +type AskPreferredLanguageOptions = { + fallback: PreferredLanguage | undefined; + exit: boolean; }; -export async function getLanguage( - languages: LanguagesOptions, - noTsVersionAvailable?: boolean, -): Promise { - if (languages.typescript || languages.javascript) { - return languages; - } - if (noTsVersionAvailable) { - return {javascript: true}; +const DefaultOptions: AskPreferredLanguageOptions = { + fallback: undefined, + exit: false, +}; + +const ExitChoice: Choice = {title: logger.yellow('[Exit]'), value: '[Exit]'}; + +export async function askPreferredLanguage( + options: Partial = {}, +): Promise<'javascript' | 'typescript'> { + const {fallback, exit} = {...DefaultOptions, ...options}; + + const choices: Choice[] = [ + {title: logger.bold('JavaScript'), value: 'javascript'}, + {title: logger.bold('TypeScript'), value: 'typescript'}, + ]; + if (exit) { + choices.push(ExitChoice); } - const {language: selectedLanguage} = (await prompts( + + const {language} = await prompts( { type: 'select', name: 'language', message: 'Which language do you want to use?', - choices: [ - {title: 'JavaScript', value: 'javascript'}, - {title: 'TypeScript', value: 'typescript'}, - ], + choices, }, { onCancel() { - logger.info`Falling back to language=${'javascript'}`; + exit && process.exit(0); }, }, - )) as {language: keyof LanguagesOptions}; + ); + + if (language === ExitChoice.value) { + process.exit(0); + } + + if (!language) { + if (fallback) { + logger.info`Falling back to language=${fallback}`; + return fallback; + } + process.exit(0); + } - return {[selectedLanguage]: true}; + return language; } diff --git a/packages/docusaurus-utils/src/index.ts b/packages/docusaurus-utils/src/index.ts index 06a9d60c0544..dc5fc1e1bf39 100644 --- a/packages/docusaurus-utils/src/index.ts +++ b/packages/docusaurus-utils/src/index.ts @@ -117,4 +117,4 @@ export { } from './dataFileUtils'; export {isDraft, isUnlisted} from './contentVisibilityUtils'; export {escapeRegexp} from './regExpUtils'; -export {getLanguage, type LanguagesOptions} from './cliUtils'; +export {askPreferredLanguage} from './cliUtils'; From 6bbaecde91bd76ac914b007f48b5bb9b47352b78 Mon Sep 17 00:00:00 2001 From: sebastien Date: Thu, 15 Feb 2024 12:33:28 +0100 Subject: [PATCH 4/6] make sure generate examples is not prompted for js/ts language question --- admin/scripts/generateExamples.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/admin/scripts/generateExamples.js b/admin/scripts/generateExamples.js index 1bb3646d63f7..8e02334c8163 100644 --- a/admin/scripts/generateExamples.js +++ b/admin/scripts/generateExamples.js @@ -25,7 +25,7 @@ async function generateTemplateExample(template) { // Run the docusaurus script to create the template in the examples folder const command = template.endsWith('-typescript') ? template.replace('-typescript', ' -- --typescript') - : template; + : `${template } -- --javascript`; shell.exec( // We use the published init script on purpose, because the local init is // too new and could generate upcoming/unavailable config options. From 5e97cee62f2a37ab95b58e509db88ad1935fd5b1 Mon Sep 17 00:00:00 2001 From: sebastien Date: Thu, 15 Feb 2024 12:36:03 +0100 Subject: [PATCH 5/6] fix e2e test script --- admin/scripts/test-release.sh | 2 +- packages/create-docusaurus/README.md | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/admin/scripts/test-release.sh b/admin/scripts/test-release.sh index 1834834b8fa6..622c524c95fa 100755 --- a/admin/scripts/test-release.sh +++ b/admin/scripts/test-release.sh @@ -52,7 +52,7 @@ git diff --name-only -- '*.json' | sed 's, ,\\&,g' | xargs git checkout -- cd .. # Build skeleton website with new version -npm_config_registry="$CUSTOM_REGISTRY_URL" npx create-docusaurus@"$NEW_VERSION" test-website classic $EXTRA_OPTS +npm_config_registry="$CUSTOM_REGISTRY_URL" npx create-docusaurus@"$NEW_VERSION" test-website classic --javascript $EXTRA_OPTS # Stop Docker container if [[ -z "${KEEP_CONTAINER:-true}" ]] && ( $(docker container inspect "$CONTAINER_NAME" > /dev/null 2>&1) ); then diff --git a/packages/create-docusaurus/README.md b/packages/create-docusaurus/README.md index 2533546271a8..2c62a47257b9 100644 --- a/packages/create-docusaurus/README.md +++ b/packages/create-docusaurus/README.md @@ -25,7 +25,7 @@ For Docusaurus maintainers, templates can be tested with: ```bash cd `git rev-parse --show-toplevel` # Back to repo root rm -rf test-website -yarn create-docusaurus test-website classic +yarn create-docusaurus test-website classic --javascript cd test-website yarn start ``` @@ -37,7 +37,7 @@ Use the following to test the templates against local packages: ```bash cd `git rev-parse --show-toplevel` # Back to repo root rm -rf test-website-in-workspace -yarn create-docusaurus test-website-in-workspace classic +yarn create-docusaurus test-website-in-workspace classic --javascript cd test-website-in-workspace yarn build yarn start From fd41b616f88aad2c03a9bcfd845326aa490251e5 Mon Sep 17 00:00:00 2001 From: sebastien Date: Thu, 15 Feb 2024 12:50:50 +0100 Subject: [PATCH 6/6] lint --- admin/scripts/generateExamples.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/admin/scripts/generateExamples.js b/admin/scripts/generateExamples.js index 8e02334c8163..56e0bb87f6f1 100644 --- a/admin/scripts/generateExamples.js +++ b/admin/scripts/generateExamples.js @@ -25,7 +25,8 @@ async function generateTemplateExample(template) { // Run the docusaurus script to create the template in the examples folder const command = template.endsWith('-typescript') ? template.replace('-typescript', ' -- --typescript') - : `${template } -- --javascript`; + : `${template} -- --javascript`; + shell.exec( // We use the published init script on purpose, because the local init is // too new and could generate upcoming/unavailable config options.