diff --git a/packages/docusaurus-types/src/config.d.ts b/packages/docusaurus-types/src/config.d.ts index 8df82d4e8f..945b64336f 100644 --- a/packages/docusaurus-types/src/config.d.ts +++ b/packages/docusaurus-types/src/config.d.ts @@ -79,7 +79,13 @@ export type VcsConfig = { /** * List of pre-built VcsConfig that Docusaurus provides. */ -export type VcsPreset = 'git-ad-hoc' | 'git-eager' | 'hardcoded'; +export type VcsPreset = + | 'git-ad-hoc' + | 'git-eager' + | 'hardcoded' + | 'disabled' + | 'default-v1' + | 'default-v2'; export type FutureConfig = { /** diff --git a/packages/docusaurus-utils/src/index.ts b/packages/docusaurus-utils/src/index.ts index 0b29742d45..fd0ecfd6cc 100644 --- a/packages/docusaurus-utils/src/index.ts +++ b/packages/docusaurus-utils/src/index.ts @@ -128,12 +128,7 @@ export { type FrontMatterLastUpdate, } from './lastUpdateUtils'; -export { - VcsPresetNames, - getVcsPreset, - getDefaultVcsConfig, - DEFAULT_TEST_VCS_CONFIG, -} from './vcs/vcs'; +export {VcsPresetNames, getVcsPreset, DEFAULT_TEST_VCS_CONFIG} from './vcs/vcs'; // Annoying to have to expose that for tests :/ export {VCS_HARDCODED_LAST_UPDATE_INFO} from './vcs/vcsHardcoded'; diff --git a/packages/docusaurus-utils/src/lastUpdateUtils.ts b/packages/docusaurus-utils/src/lastUpdateUtils.ts index b22bd7948f..8f8acfd437 100644 --- a/packages/docusaurus-utils/src/lastUpdateUtils.ts +++ b/packages/docusaurus-utils/src/lastUpdateUtils.ts @@ -6,7 +6,7 @@ */ import _ from 'lodash'; -import {getDefaultVcsConfig} from './vcs/vcs'; +import {getVcsPreset} from './vcs/vcs'; import type {PluginOptions, VcsConfig} from '@docusaurus/types'; @@ -52,7 +52,7 @@ export async function readLastUpdateData( // This also ensures unit tests keep working without extra setup // We still want to ensure type safety by requiring the VCS param // TODO Docusaurus v4: refactor all these Git read APIs - const vcs = vcsParam ?? getDefaultVcsConfig(); + const vcs = vcsParam ?? getVcsPreset('default-v1'); const {showLastUpdateAuthor, showLastUpdateTime} = options; diff --git a/packages/docusaurus-utils/src/vcs/vcs.ts b/packages/docusaurus-utils/src/vcs/vcs.ts index 4a617b498f..979be29d30 100644 --- a/packages/docusaurus-utils/src/vcs/vcs.ts +++ b/packages/docusaurus-utils/src/vcs/vcs.ts @@ -8,12 +8,19 @@ import {VcsHardcoded} from './vcsHardcoded'; import {VcsGitAdHoc} from './vcsGitAdHoc'; import {VscGitEager} from './vcsGitEager'; +import {VcsDisabled} from './vcsDisabled'; +import {VcsDefaultV1} from './vcsDefaultV1'; +import {VcsDefaultV2} from './vcsDefaultV2'; import type {VcsConfig, VcsPreset} from '@docusaurus/types'; const VcsPresets: Record = { 'git-ad-hoc': VcsGitAdHoc, 'git-eager': VscGitEager, hardcoded: VcsHardcoded, + disabled: VcsDisabled, + + 'default-v1': VcsDefaultV1, + 'default-v2': VcsDefaultV2, }; export const VcsPresetNames = Object.keys(VcsPresets) as VcsPreset[]; @@ -33,32 +40,4 @@ export function getVcsPreset(presetName: VcsPreset): VcsConfig { } } -export function getDefaultVcsPresetName(): VcsPreset { - // Escape hatch to override the default VCS preset we use - if (process.env.DOCUSAURUS_VCS) { - return process.env.DOCUSAURUS_VCS as VcsPreset; - } - - if (process.env.NODE_ENV === 'production') { - // TODO add feature flag switch for git-eager / git-ad-hoc strategies - // return getVcsPreset('git-ad-hoc'); - return 'git-eager'; - } - // Return hardcoded values in dev to improve DX - if (process.env.NODE_ENV === 'development') { - return 'hardcoded'; - } - - // Return hardcoded values in test to make tests simpler and faster - if (process.env.NODE_ENV === 'test') { - return 'hardcoded'; - } - - return 'git-eager'; -} - -export function getDefaultVcsConfig(): VcsConfig { - return getVcsPreset(getDefaultVcsPresetName()); -} - export const DEFAULT_TEST_VCS_CONFIG: VcsConfig = VcsHardcoded; diff --git a/packages/docusaurus-utils/src/vcs/vcsDefaultV1.ts b/packages/docusaurus-utils/src/vcs/vcsDefaultV1.ts new file mode 100644 index 0000000000..431b78fbb1 --- /dev/null +++ b/packages/docusaurus-utils/src/vcs/vcsDefaultV1.ts @@ -0,0 +1,33 @@ +/** + * 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 {VcsHardcoded} from './vcsHardcoded'; +import {VcsGitAdHoc} from './vcsGitAdHoc'; +import type {VcsConfig} from '@docusaurus/types'; + +function getDynamicStrategy(): VcsConfig { + return process.env.NODE_ENV === 'development' || + process.env.NODE_ENV === 'test' + ? VcsHardcoded + : VcsGitAdHoc; +} + +/** + * This VCS implements the historical Git automatic strategy. + * It is only enabled in production mode, using ad-hoc git log commands. + */ +export const VcsDefaultV1: VcsConfig = { + initialize: (...params) => { + return getDynamicStrategy().initialize(...params); + }, + getFileCreationInfo: (...params) => { + return getDynamicStrategy().getFileCreationInfo(...params); + }, + getFileLastUpdateInfo: (...params) => { + return getDynamicStrategy().getFileLastUpdateInfo(...params); + }, +}; diff --git a/packages/docusaurus-utils/src/vcs/vcsDefaultV2.ts b/packages/docusaurus-utils/src/vcs/vcsDefaultV2.ts new file mode 100644 index 0000000000..c946f8d383 --- /dev/null +++ b/packages/docusaurus-utils/src/vcs/vcsDefaultV2.ts @@ -0,0 +1,33 @@ +/** + * 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 {VcsHardcoded} from './vcsHardcoded'; +import {VscGitEager} from './vcsGitEager'; +import type {VcsConfig} from '@docusaurus/types'; + +function getStrategy(): VcsConfig { + return process.env.NODE_ENV === 'development' || + process.env.NODE_ENV === 'test' + ? VcsHardcoded + : VscGitEager; +} + +/** + * This VCS implements the new eager Git automatic strategy. + * It is only enabled in production mode, reading the git repository eagerly. + */ +export const VcsDefaultV2: VcsConfig = { + initialize: (...params) => { + return getStrategy().initialize(...params); + }, + getFileCreationInfo: (...params) => { + return getStrategy().getFileCreationInfo(...params); + }, + getFileLastUpdateInfo: (...params) => { + return getStrategy().getFileLastUpdateInfo(...params); + }, +}; diff --git a/packages/docusaurus-utils/src/vcs/vcsDisabled.ts b/packages/docusaurus-utils/src/vcs/vcsDisabled.ts new file mode 100644 index 0000000000..e8046c2d97 --- /dev/null +++ b/packages/docusaurus-utils/src/vcs/vcsDisabled.ts @@ -0,0 +1,25 @@ +/** + * 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 type {VcsConfig} from '@docusaurus/types'; + +/** + * This VCS implementation always returns null values + */ +export const VcsDisabled: VcsConfig = { + initialize: () => { + // Noop + }, + + getFileCreationInfo: async (_filePath) => { + return null; + }, + + getFileLastUpdateInfo: async (_ilePath) => { + return null; + }, +}; diff --git a/packages/docusaurus-utils/src/vcs/vcsGitEager.ts b/packages/docusaurus-utils/src/vcs/vcsGitEager.ts index 0cad83a6fb..bb3156ded5 100644 --- a/packages/docusaurus-utils/src/vcs/vcsGitEager.ts +++ b/packages/docusaurus-utils/src/vcs/vcsGitEager.ts @@ -62,7 +62,6 @@ function createGitVcsConfig(): VcsConfig { return { initialize: ({siteDir}) => { - console.trace('git eager init'); // Only pre-init for production builds getGitFileInfo(siteDir).catch((error) => { console.error( diff --git a/packages/docusaurus/src/server/configValidation.ts b/packages/docusaurus/src/server/configValidation.ts index a5e5ae78d1..5152045566 100644 --- a/packages/docusaurus/src/server/configValidation.ts +++ b/packages/docusaurus/src/server/configValidation.ts @@ -6,30 +6,29 @@ */ import { + DEFAULT_I18N_DIR_NAME, DEFAULT_PARSE_FRONT_MATTER, DEFAULT_STATIC_DIR_NAME, - DEFAULT_I18N_DIR_NAME, - getDefaultVcsConfig, - VcsPresetNames, getVcsPreset, + VcsPresetNames, } from '@docusaurus/utils'; import {Joi, printWarning} from '@docusaurus/utils-validation'; import { - addTrailingSlash, addLeadingSlash, + addTrailingSlash, removeTrailingSlash, } from '@docusaurus/utils-common'; import logger from '@docusaurus/logger'; import type { + DocusaurusConfig, FasterConfig, FutureConfig, FutureV4Config, - StorageConfig, - DocusaurusConfig, I18nConfig, + I18nLocaleConfig, MarkdownConfig, MarkdownHooks, - I18nLocaleConfig, + StorageConfig, VcsConfig, VcsPreset, } from '@docusaurus/types'; @@ -111,9 +110,7 @@ export const DEFAULT_FUTURE_CONFIG: FutureConfig = { v4: DEFAULT_FUTURE_V4_CONFIG, experimental_faster: DEFAULT_FASTER_CONFIG, experimental_storage: DEFAULT_STORAGE_CONFIG, - - // Not good, need to be loaded lazily - experimental_vcs: getDefaultVcsConfig(), + experimental_vcs: getVcsPreset('default-v1'), experimental_router: 'browser', }; @@ -355,12 +352,19 @@ const VCS_CONFIG_SCHEMA = Joi.custom((input) => { } return getVcsPreset(presetName); } + if (typeof input === 'boolean') { + // We return the boolean on purpose + // We'll normalize it to a real VcsConfig later + // This is annoying, but we have to read the future flag to switch to the + // new "default-v2" config + return input; + } const {error, value} = VCS_CONFIG_OBJECT_SCHEMA.validate(input); if (error) { throw error; } return value; -}).default(() => getDefaultVcsConfig()); +}).default(true); const FUTURE_CONFIG_SCHEMA = Joi.object({ v4: FUTURE_V4_SCHEMA, @@ -530,6 +534,17 @@ Please migrate and move this option to code=${'siteConfig.markdown.hooks.onBroke config.onBrokenMarkdownLinks = undefined; } + // We normalize the VCS config when using a boolean value + if (typeof config.future.experimental_vcs === 'boolean') { + // TODO implement future flag for new VCS config default + const isNewVcsConfigEnabled = false; + config.future.experimental_vcs = config.future.experimental_vcs + ? isNewVcsConfigEnabled + ? getVcsPreset('default-v2') + : getVcsPreset('default-v1') + : getVcsPreset('disabled'); + } + if ( config.future.experimental_faster.ssgWorkerThreads && !config.future.v4.removeLegacyPostBuildHeadAttribute