diff --git a/packages/docusaurus/bin/docusaurus.mjs b/packages/docusaurus/bin/docusaurus.mjs index a384de9b7cfe..928dbe9c8f02 100755 --- a/packages/docusaurus/bin/docusaurus.mjs +++ b/packages/docusaurus/bin/docusaurus.mjs @@ -8,7 +8,6 @@ // @ts-check -import fs from 'fs-extra'; import logger from '@docusaurus/logger'; import cli from 'commander'; import {DOCUSAURUS_VERSION} from '@docusaurus/utils'; @@ -27,8 +26,6 @@ import beforeCli from './beforeCli.mjs'; await beforeCli(); -const resolveDir = (dir = '.') => fs.realpath(dir); - cli.version(DOCUSAURUS_VERSION).usage(' [options]'); cli @@ -54,9 +51,9 @@ cli '--no-minify', 'build website without minimizing JS bundles (default: false)', ) - .action(async (siteDir, options) => { - await build(await resolveDir(siteDir), options); - }); + // @ts-expect-error: Promise is not assignable to Promise... but + // good enough here. + .action(build); cli .command('swizzle [themeName] [componentName] [siteDir]') @@ -80,9 +77,7 @@ cli 'copy TypeScript theme files when possible (default: false)', ) .option('--danger', 'enable swizzle for unsafe component of themes') - .action(async (themeName, componentName, siteDir, options) => - swizzle(await resolveDir(siteDir), themeName, componentName, options), - ); + .action(swizzle); cli .command('deploy [siteDir]') @@ -103,9 +98,7 @@ cli '--skip-build', 'skip building website before deploy it (default: false)', ) - .action(async (siteDir, options) => - deploy(await resolveDir(siteDir), options), - ); + .action(deploy); cli .command('start [siteDir]') @@ -130,9 +123,7 @@ cli '--no-minify', 'build website without minimizing JS bundles (default: false)', ) - .action(async (siteDir, options) => - start(await resolveDir(siteDir), options), - ); + .action(start); cli .command('serve [siteDir]') @@ -152,14 +143,12 @@ cli '--no-open', 'do not open page in the browser (default: false, or true in CI)', ) - .action(async (siteDir, options) => - serve(await resolveDir(siteDir), options), - ); + .action(serve); cli .command('clear [siteDir]') .description('Remove build artifacts.') - .action(async (siteDir) => clear(await resolveDir(siteDir))); + .action(clear); cli .command('write-translations [siteDir]') @@ -180,9 +169,7 @@ cli '--messagePrefix ', 'Allows to init new written messages with a given prefix. This might help you to highlight untranslated message by making them stand out in the UI (default: "")', ) - .action(async (siteDir, options) => - writeTranslations(await resolveDir(siteDir), options), - ); + .action(writeTranslations); cli .command('write-heading-ids [siteDir] [files...]') @@ -192,9 +179,7 @@ cli "keep the headings' casing, otherwise make all lowercase (default: false)", ) .option('--overwrite', 'overwrite existing heading IDs (default: false)') - .action(async (siteDir, files, options) => - writeHeadingIds(await resolveDir(siteDir), files, options), - ); + .action(writeHeadingIds); cli.arguments('').action((cmd) => { cli.outputHelp(); @@ -221,7 +206,7 @@ function isInternalCommand(command) { } if (!isInternalCommand(process.argv.slice(2)[0])) { - await externalCommand(cli, await resolveDir('.')); + await externalCommand(cli); } if (!process.argv.slice(2).length) { diff --git a/packages/docusaurus/src/commands/build.ts b/packages/docusaurus/src/commands/build.ts index d13d7039fec5..92c20e6398d2 100644 --- a/packages/docusaurus/src/commands/build.ts +++ b/packages/docusaurus/src/commands/build.ts @@ -38,14 +38,16 @@ export type BuildCLIOptions = Pick< }; export async function build( - siteDir: string, - cliOptions: Partial, + siteDirParam: string = '.', + cliOptions: Partial = {}, // When running build, we force terminate the process to prevent async // operations from never returning. However, if run as part of docusaurus // deploy, we have to let deploy finish. // See https://github.com/facebook/docusaurus/pull/2496 forceTerminate: boolean = true, ): Promise { + const siteDir = await fs.realpath(siteDirParam); + ['SIGINT', 'SIGTERM'].forEach((sig) => { process.on(sig, () => process.exit()); }); diff --git a/packages/docusaurus/src/commands/clear.ts b/packages/docusaurus/src/commands/clear.ts index 450b2f9e8751..1b8b7169c66a 100644 --- a/packages/docusaurus/src/commands/clear.ts +++ b/packages/docusaurus/src/commands/clear.ts @@ -26,7 +26,9 @@ async function removePath(entry: {path: string; description: string}) { } } -export async function clear(siteDir: string): Promise { +export async function clear(siteDirParam: string = '.'): Promise { + const siteDir = await fs.realpath(siteDirParam); + const generatedFolder = { path: path.join(siteDir, GENERATED_FILES_DIR_NAME), description: 'generated folder', diff --git a/packages/docusaurus/src/commands/deploy.ts b/packages/docusaurus/src/commands/deploy.ts index 9b5f233f5bf4..90d6f9cc5ee7 100644 --- a/packages/docusaurus/src/commands/deploy.ts +++ b/packages/docusaurus/src/commands/deploy.ts @@ -41,9 +41,11 @@ function shellExecLog(cmd: string) { } export async function deploy( - siteDir: string, - cliOptions: Partial, + siteDirParam: string = '.', + cliOptions: Partial = {}, ): Promise { + const siteDir = await fs.realpath(siteDirParam); + const {outDir, siteConfig, siteConfigPath} = await loadContext({ siteDir, config: cliOptions.config, diff --git a/packages/docusaurus/src/commands/external.ts b/packages/docusaurus/src/commands/external.ts index 2a9f67ee288b..45ae8d55d11c 100644 --- a/packages/docusaurus/src/commands/external.ts +++ b/packages/docusaurus/src/commands/external.ts @@ -5,14 +5,13 @@ * LICENSE file in the root directory of this source tree. */ +import fs from 'fs-extra'; import {loadContext} from '../server'; import {initPlugins} from '../server/plugins/init'; import type {CommanderStatic} from 'commander'; -export async function externalCommand( - cli: CommanderStatic, - siteDir: string, -): Promise { +export async function externalCommand(cli: CommanderStatic): Promise { + const siteDir = await fs.realpath('.'); const context = await loadContext({siteDir}); const plugins = await initPlugins(context); diff --git a/packages/docusaurus/src/commands/serve.ts b/packages/docusaurus/src/commands/serve.ts index 0eb24b677f1b..19f4f322a8bd 100644 --- a/packages/docusaurus/src/commands/serve.ts +++ b/packages/docusaurus/src/commands/serve.ts @@ -5,6 +5,7 @@ * LICENSE file in the root directory of this source tree. */ +import fs from 'fs-extra'; import http from 'http'; import path from 'path'; import logger from '@docusaurus/logger'; @@ -24,9 +25,11 @@ export type ServeCLIOptions = HostPortOptions & }; export async function serve( - siteDir: string, - cliOptions: Partial, + siteDirParam: string = '.', + cliOptions: Partial = {}, ): Promise { + const siteDir = await fs.realpath(siteDirParam); + const buildDir = cliOptions.dir ?? DEFAULT_BUILD_DIR_NAME; let dir = path.resolve(siteDir, buildDir); diff --git a/packages/docusaurus/src/commands/start.ts b/packages/docusaurus/src/commands/start.ts index e41ae556cddf..849ee610bf4f 100644 --- a/packages/docusaurus/src/commands/start.ts +++ b/packages/docusaurus/src/commands/start.ts @@ -5,6 +5,7 @@ * LICENSE file in the root directory of this source tree. */ +import fs from 'fs-extra'; import path from 'path'; import _ from 'lodash'; import logger from '@docusaurus/logger'; @@ -35,9 +36,11 @@ export type StartCLIOptions = HostPortOptions & }; export async function start( - siteDir: string, - cliOptions: Partial, + siteDirParam: string = '.', + cliOptions: Partial = {}, ): Promise { + const siteDir = await fs.realpath(siteDirParam); + process.env.NODE_ENV = 'development'; process.env.BABEL_ENV = 'development'; logger.info('Starting the development server...'); diff --git a/packages/docusaurus/src/commands/swizzle/__tests__/index.test.ts b/packages/docusaurus/src/commands/swizzle/__tests__/index.test.ts index 462c44c1a09e..ee57ee4bfd25 100644 --- a/packages/docusaurus/src/commands/swizzle/__tests__/index.test.ts +++ b/packages/docusaurus/src/commands/swizzle/__tests__/index.test.ts @@ -111,7 +111,7 @@ async function createTestSite() { component: string; typescript?: boolean; }) { - return swizzleWithExit(siteDir, FixtureThemeName, component, { + return swizzleWithExit(FixtureThemeName, component, siteDir, { wrap: true, danger: true, typescript, @@ -125,7 +125,7 @@ async function createTestSite() { component: string; typescript?: boolean; }) { - return swizzleWithExit(siteDir, FixtureThemeName, component, { + return swizzleWithExit(FixtureThemeName, component, siteDir, { eject: true, danger: true, typescript, diff --git a/packages/docusaurus/src/commands/swizzle/index.ts b/packages/docusaurus/src/commands/swizzle/index.ts index 9262e7d154f1..df5e06605511 100644 --- a/packages/docusaurus/src/commands/swizzle/index.ts +++ b/packages/docusaurus/src/commands/swizzle/index.ts @@ -5,6 +5,7 @@ * LICENSE file in the root directory of this source tree. */ +import fs from 'fs-extra'; import logger from '@docusaurus/logger'; import {getThemeName, getThemePath, getThemeNames} from './themes'; import {getThemeComponents, getComponentName} from './components'; @@ -87,11 +88,13 @@ If you want to swizzle it, use the code=${'--danger'} flag, or confirm that you } export async function swizzle( - siteDir: string, - themeNameParam: string | undefined, - componentNameParam: string | undefined, - optionsParam: Partial, + themeNameParam: string | undefined = undefined, + componentNameParam: string | undefined = undefined, + siteDirParam: string = '.', + optionsParam: Partial = {}, ): Promise { + const siteDir = await fs.realpath(siteDirParam); + const options = normalizeOptions(optionsParam); const {list, danger, typescript} = options; diff --git a/packages/docusaurus/src/commands/writeHeadingIds.ts b/packages/docusaurus/src/commands/writeHeadingIds.ts index 73bc699c25b3..864708620780 100644 --- a/packages/docusaurus/src/commands/writeHeadingIds.ts +++ b/packages/docusaurus/src/commands/writeHeadingIds.ts @@ -41,10 +41,12 @@ async function getPathsToWatch(siteDir: string): Promise { } export async function writeHeadingIds( - siteDir: string, - files: string[] | undefined, - options: WriteHeadingIDOptions, + siteDirParam: string = '.', + files: string[] = [], + options: WriteHeadingIDOptions = {}, ): Promise { + const siteDir = await fs.realpath(siteDirParam); + const markdownFiles = await safeGlobby( files ?? (await getPathsToWatch(siteDir)), { diff --git a/packages/docusaurus/src/commands/writeTranslations.ts b/packages/docusaurus/src/commands/writeTranslations.ts index d69014306fcf..6bda39cd5776 100644 --- a/packages/docusaurus/src/commands/writeTranslations.ts +++ b/packages/docusaurus/src/commands/writeTranslations.ts @@ -5,6 +5,7 @@ * LICENSE file in the root directory of this source tree. */ +import fs from 'fs-extra'; import path from 'path'; import {loadContext, type LoadContextOptions} from '../server'; import {initPlugins} from '../server/plugins/init'; @@ -75,9 +76,11 @@ async function writePluginTranslationFiles({ } export async function writeTranslations( - siteDir: string, - options: Partial, + siteDirParam: string = '.', + options: Partial = {}, ): Promise { + const siteDir = await fs.realpath(siteDirParam); + const context = await loadContext({ siteDir, config: options.config,