From 387bdda7970487b9f7d477d7b857a8bbbf363653 Mon Sep 17 00:00:00 2001 From: sebastien Date: Thu, 5 Nov 2026 17:55:32 +0100 Subject: [PATCH 1/2] refactor(core): move each CLI command into its own folder (AI-assisted) Every command of @docusaurus/core now lives in /.ts, like build/build.ts and start/start.ts already did. Pure move: only import paths change, and the package exports keep the same names. Co-Authored-By: Claude Opus 5.5 --- .../src/commands/__tests__/cli.test.ts | 4 ++-- .../src/commands/{ => clear}/clear.ts | 2 +- packages/docusaurus/src/commands/cli.ts | 17 ++++++++++------- .../src/commands/{ => deploy}/deploy.ts | 4 ++-- .../src/commands/{ => external}/external.ts | 4 ++-- .../src/commands/{ => serve}/serve.ts | 12 ++++++------ ...{index.test.ts.snap => swizzle.test.ts.snap} | 0 .../{index.test.ts => swizzle.test.ts} | 2 +- .../commands/swizzle/{index.ts => swizzle.ts} | 0 .../__tests__/writeHeadingIds.test.ts | 0 .../{ => writeHeadingIds}/writeHeadingIds.ts | 4 ++-- .../writeTranslations.ts | 8 ++++---- packages/docusaurus/src/index.ts | 14 +++++++------- 13 files changed, 37 insertions(+), 34 deletions(-) rename packages/docusaurus/src/commands/{ => clear}/clear.ts (97%) rename packages/docusaurus/src/commands/{ => deploy}/deploy.ts (98%) rename packages/docusaurus/src/commands/{ => external}/external.ts (87%) rename packages/docusaurus/src/commands/{ => serve}/serve.ts (90%) rename packages/docusaurus/src/commands/swizzle/__tests__/__snapshots__/{index.test.ts.snap => swizzle.test.ts.snap} (100%) rename packages/docusaurus/src/commands/swizzle/__tests__/{index.test.ts => swizzle.test.ts} (99%) rename packages/docusaurus/src/commands/swizzle/{index.ts => swizzle.ts} (100%) rename packages/docusaurus/src/commands/{ => writeHeadingIds}/__tests__/writeHeadingIds.test.ts (100%) rename packages/docusaurus/src/commands/{ => writeHeadingIds}/writeHeadingIds.ts (97%) rename packages/docusaurus/src/commands/{ => writeTranslations}/writeTranslations.ts (92%) diff --git a/packages/docusaurus/src/commands/__tests__/cli.test.ts b/packages/docusaurus/src/commands/__tests__/cli.test.ts index ea435e66b5b9..8e9e82a03894 100644 --- a/packages/docusaurus/src/commands/__tests__/cli.test.ts +++ b/packages/docusaurus/src/commands/__tests__/cli.test.ts @@ -11,8 +11,8 @@ import {Command} from 'commander'; import {createCLIProgram} from '../cli'; import * as buildCommand from '../build/build'; import * as startCommand from '../start/start'; -import * as serveCommand from '../serve'; -import * as writeHeadingIdsCommand from '../writeHeadingIds'; +import * as serveCommand from '../serve/serve'; +import * as writeHeadingIdsCommand from '../writeHeadingIds/writeHeadingIds'; const ExitOverrideError = new Error('exitOverride'); diff --git a/packages/docusaurus/src/commands/clear.ts b/packages/docusaurus/src/commands/clear/clear.ts similarity index 97% rename from packages/docusaurus/src/commands/clear.ts rename to packages/docusaurus/src/commands/clear/clear.ts index 9647e3c75a09..ccc47cac0e4e 100644 --- a/packages/docusaurus/src/commands/clear.ts +++ b/packages/docusaurus/src/commands/clear/clear.ts @@ -12,7 +12,7 @@ import { GENERATED_FILES_DIR_NAME, } from '@docusaurus/utils'; import {pathExists, realpath} from '@docusaurus/fs'; -import clearPath from './utils/clearPath'; +import clearPath from '../utils/clearPath'; async function removePath(entry: {path: string; description: string}) { if (!(await pathExists(entry.path))) { diff --git a/packages/docusaurus/src/commands/cli.ts b/packages/docusaurus/src/commands/cli.ts index e988063dea74..a3e77f29cbcc 100755 --- a/packages/docusaurus/src/commands/cli.ts +++ b/packages/docusaurus/src/commands/cli.ts @@ -10,14 +10,17 @@ import {Command, Option} from 'commander'; import {DOCUSAURUS_VERSION} from '@docusaurus/utils'; import {build} from './build/build'; -import {clear} from './clear'; -import {deploy} from './deploy'; -import {externalCommand} from './external'; -import {serve} from './serve'; +import {clear} from './clear/clear'; +import {deploy} from './deploy/deploy'; +import {externalCommand} from './external/external'; +import {serve} from './serve/serve'; import {start} from './start/start'; -import {swizzle} from './swizzle'; -import {writeHeadingIds, HeadingIdSyntaxes} from './writeHeadingIds'; -import {writeTranslations} from './writeTranslations'; +import {swizzle} from './swizzle/swizzle'; +import { + writeHeadingIds, + HeadingIdSyntaxes, +} from './writeHeadingIds/writeHeadingIds'; +import {writeTranslations} from './writeTranslations/writeTranslations'; function concatLocaleOptions(locale: string, locales: string[] = []): string[] { return locales.concat(locale); diff --git a/packages/docusaurus/src/commands/deploy.ts b/packages/docusaurus/src/commands/deploy/deploy.ts similarity index 98% rename from packages/docusaurus/src/commands/deploy.ts rename to packages/docusaurus/src/commands/deploy/deploy.ts index a7b3da9c3a31..29b20b380db4 100644 --- a/packages/docusaurus/src/commands/deploy.ts +++ b/packages/docusaurus/src/commands/deploy/deploy.ts @@ -11,8 +11,8 @@ import logger from '@docusaurus/logger'; import {execa} from 'execa'; import {hasSSHProtocol, buildSshUrl, buildHttpsUrl} from '@docusaurus/utils'; import {fs, realpath} from '@docusaurus/fs'; -import {loadContext, type LoadContextParams} from '../server/site'; -import {build} from './build/build'; +import {loadContext, type LoadContextParams} from '../../server/site'; +import {build} from '../build/build'; export type DeployCLIOptions = Pick & { locale?: [string, ...string[]]; diff --git a/packages/docusaurus/src/commands/external.ts b/packages/docusaurus/src/commands/external/external.ts similarity index 87% rename from packages/docusaurus/src/commands/external.ts rename to packages/docusaurus/src/commands/external/external.ts index 46b65a3e4bc4..625e701e8a58 100644 --- a/packages/docusaurus/src/commands/external.ts +++ b/packages/docusaurus/src/commands/external/external.ts @@ -6,8 +6,8 @@ */ import {realpath} from '@docusaurus/fs'; -import {loadContext} from '../server/site'; -import {initPlugins} from '../server/plugins/init'; +import {loadContext} from '../../server/site'; +import {initPlugins} from '../../server/plugins/init'; import type {Command} from 'commander'; export async function externalCommand({ diff --git a/packages/docusaurus/src/commands/serve.ts b/packages/docusaurus/src/commands/serve/serve.ts similarity index 90% rename from packages/docusaurus/src/commands/serve.ts rename to packages/docusaurus/src/commands/serve/serve.ts index ee09bf1a8f0f..21c317d565c7 100644 --- a/packages/docusaurus/src/commands/serve.ts +++ b/packages/docusaurus/src/commands/serve/serve.ts @@ -12,12 +12,12 @@ import {DEFAULT_BUILD_DIR_NAME} from '@docusaurus/utils'; import serveHandler from 'serve-handler'; import {applyTrailingSlash} from '@docusaurus/utils-common'; import {realpath} from '@docusaurus/fs'; -import openBrowser from './utils/openBrowser/openBrowser'; -import {loadSiteConfig} from '../server/config'; -import {build} from './build/build'; -import {getHostPort, type HostPortOptions} from '../server/getHostPort'; -import {listenToServer} from './utils/listenToServer'; -import type {LoadContextParams} from '../server/site'; +import openBrowser from '../utils/openBrowser/openBrowser'; +import {loadSiteConfig} from '../../server/config'; +import {build} from '../build/build'; +import {getHostPort, type HostPortOptions} from '../../server/getHostPort'; +import {listenToServer} from '../utils/listenToServer'; +import type {LoadContextParams} from '../../server/site'; function redirect(res: http.ServerResponse, location: string) { res.writeHead(302, { diff --git a/packages/docusaurus/src/commands/swizzle/__tests__/__snapshots__/index.test.ts.snap b/packages/docusaurus/src/commands/swizzle/__tests__/__snapshots__/swizzle.test.ts.snap similarity index 100% rename from packages/docusaurus/src/commands/swizzle/__tests__/__snapshots__/index.test.ts.snap rename to packages/docusaurus/src/commands/swizzle/__tests__/__snapshots__/swizzle.test.ts.snap diff --git a/packages/docusaurus/src/commands/swizzle/__tests__/index.test.ts b/packages/docusaurus/src/commands/swizzle/__tests__/swizzle.test.ts similarity index 99% rename from packages/docusaurus/src/commands/swizzle/__tests__/index.test.ts rename to packages/docusaurus/src/commands/swizzle/__tests__/swizzle.test.ts index 2a08febb79ed..eeb66c2aaa0a 100644 --- a/packages/docusaurus/src/commands/swizzle/__tests__/index.test.ts +++ b/packages/docusaurus/src/commands/swizzle/__tests__/swizzle.test.ts @@ -12,7 +12,7 @@ import {tree} from 'tree-node-cli'; import {escapePath, posixPath} from '@docusaurus/utils'; import {glob} from '@docusaurus/glob'; import {ThemePath, createTempSiteDir, Components} from './testUtils'; -import {swizzle} from '../index'; +import {swizzle} from '../swizzle'; const FixtureThemeName = 'fixture-theme-name'; diff --git a/packages/docusaurus/src/commands/swizzle/index.ts b/packages/docusaurus/src/commands/swizzle/swizzle.ts similarity index 100% rename from packages/docusaurus/src/commands/swizzle/index.ts rename to packages/docusaurus/src/commands/swizzle/swizzle.ts diff --git a/packages/docusaurus/src/commands/__tests__/writeHeadingIds.test.ts b/packages/docusaurus/src/commands/writeHeadingIds/__tests__/writeHeadingIds.test.ts similarity index 100% rename from packages/docusaurus/src/commands/__tests__/writeHeadingIds.test.ts rename to packages/docusaurus/src/commands/writeHeadingIds/__tests__/writeHeadingIds.test.ts diff --git a/packages/docusaurus/src/commands/writeHeadingIds.ts b/packages/docusaurus/src/commands/writeHeadingIds/writeHeadingIds.ts similarity index 97% rename from packages/docusaurus/src/commands/writeHeadingIds.ts rename to packages/docusaurus/src/commands/writeHeadingIds/writeHeadingIds.ts index 192a35f647c4..2fa8d1a2ac4a 100644 --- a/packages/docusaurus/src/commands/writeHeadingIds.ts +++ b/packages/docusaurus/src/commands/writeHeadingIds/writeHeadingIds.ts @@ -14,8 +14,8 @@ import { } from '@docusaurus/utils'; import {safeGlob} from '@docusaurus/glob'; import {fs, realpath} from '@docusaurus/fs'; -import {loadContext} from '../server/site'; -import {initPlugins} from '../server/plugins/init'; +import {loadContext} from '../../server/site'; +import {initPlugins} from '../../server/plugins/init'; import type {LoadContext, MarkdownConfig} from '@docusaurus/types'; export const HeadingIdSyntaxes = [ diff --git a/packages/docusaurus/src/commands/writeTranslations.ts b/packages/docusaurus/src/commands/writeTranslations/writeTranslations.ts similarity index 92% rename from packages/docusaurus/src/commands/writeTranslations.ts rename to packages/docusaurus/src/commands/writeTranslations/writeTranslations.ts index fea7fd7890a7..fd544d543204 100644 --- a/packages/docusaurus/src/commands/writeTranslations.ts +++ b/packages/docusaurus/src/commands/writeTranslations/writeTranslations.ts @@ -8,16 +8,16 @@ import path from 'node:path'; import {globTranslatableSourceFiles} from '@docusaurus/glob'; import {realpath} from '@docusaurus/fs'; -import {loadContext, type LoadContextParams} from '../server/site'; -import {initPlugins} from '../server/plugins/init'; +import {loadContext, type LoadContextParams} from '../../server/site'; +import {initPlugins} from '../../server/plugins/init'; import { writePluginTranslations, writeCodeTranslations, type WriteTranslationsOptions, loadPluginsDefaultCodeTranslationMessages, applyDefaultCodeTranslations, -} from '../server/translations/translations'; -import {extractSiteSourceCodeTranslations} from '../server/translations/translationsExtractor'; +} from '../../server/translations/translations'; +import {extractSiteSourceCodeTranslations} from '../../server/translations/translationsExtractor'; import type {InitializedPlugin} from '@docusaurus/types'; export type WriteTranslationsCLIOptions = Pick< diff --git a/packages/docusaurus/src/index.ts b/packages/docusaurus/src/index.ts index 3a6a2e1362e6..d1c9aea952bf 100644 --- a/packages/docusaurus/src/index.ts +++ b/packages/docusaurus/src/index.ts @@ -7,11 +7,11 @@ export {runCLI} from './commands/cli'; export {build} from './commands/build/build'; -export {clear} from './commands/clear'; -export {deploy} from './commands/deploy'; -export {externalCommand} from './commands/external'; -export {serve} from './commands/serve'; +export {clear} from './commands/clear/clear'; +export {deploy} from './commands/deploy/deploy'; +export {externalCommand} from './commands/external/external'; +export {serve} from './commands/serve/serve'; export {start} from './commands/start/start'; -export {swizzle} from './commands/swizzle'; -export {writeHeadingIds} from './commands/writeHeadingIds'; -export {writeTranslations} from './commands/writeTranslations'; +export {swizzle} from './commands/swizzle/swizzle'; +export {writeHeadingIds} from './commands/writeHeadingIds/writeHeadingIds'; +export {writeTranslations} from './commands/writeTranslations/writeTranslations'; From 7c8d318c5b393436c8f4e295e4d35cb3d877c763 Mon Sep 17 00:00:00 2001 From: sebastien Date: Thu, 5 Nov 2026 18:00:34 +0100 Subject: [PATCH 2/2] refactor(core): move listenToServer into the serve command folder (AI-assisted) serve is its only user. clearPath (clear + build) and openBrowser (start + serve) are shared, so they stay in commands/utils. Co-Authored-By: Claude Opus 5.5 --- .../docusaurus/src/commands/{utils => serve}/listenToServer.ts | 0 packages/docusaurus/src/commands/serve/serve.ts | 2 +- 2 files changed, 1 insertion(+), 1 deletion(-) rename packages/docusaurus/src/commands/{utils => serve}/listenToServer.ts (100%) diff --git a/packages/docusaurus/src/commands/utils/listenToServer.ts b/packages/docusaurus/src/commands/serve/listenToServer.ts similarity index 100% rename from packages/docusaurus/src/commands/utils/listenToServer.ts rename to packages/docusaurus/src/commands/serve/listenToServer.ts diff --git a/packages/docusaurus/src/commands/serve/serve.ts b/packages/docusaurus/src/commands/serve/serve.ts index 21c317d565c7..09a4dfb92989 100644 --- a/packages/docusaurus/src/commands/serve/serve.ts +++ b/packages/docusaurus/src/commands/serve/serve.ts @@ -16,7 +16,7 @@ import openBrowser from '../utils/openBrowser/openBrowser'; import {loadSiteConfig} from '../../server/config'; import {build} from '../build/build'; import {getHostPort, type HostPortOptions} from '../../server/getHostPort'; -import {listenToServer} from '../utils/listenToServer'; +import {listenToServer} from './listenToServer'; import type {LoadContextParams} from '../../server/site'; function redirect(res: http.ServerResponse, location: string) {