diff --git a/src/client/app/data.ts b/src/client/app/data.ts index abf379b7..b7770ab0 100644 --- a/src/client/app/data.ts +++ b/src/client/app/data.ts @@ -77,7 +77,7 @@ function debugConfigLayers(path: string, layers: SiteData[]): SiteData[] { const summary = layers.map((c, i, arr) => { const n = i + 1 if (n === arr.length) return `${n}. .vitepress/config (root)` - return `${n}. ${(c as any)?.VP_SOURCE ?? '(Unknown Source)'}` + return `${n}. ${(c as any)?.['[VP_SOURCE]'] ?? '(Unknown Source)'}` }) console.debug( [summaryTitle, ''.padEnd(summaryTitle.length, '='), ...summary].join('\n') diff --git a/src/node/siteConfig.ts b/src/node/siteConfig.ts index e09352ee..bffa8015 100644 --- a/src/node/siteConfig.ts +++ b/src/node/siteConfig.ts @@ -14,7 +14,10 @@ import type { SSGContext, SiteData } from './shared' -import type { AdditionalConfig } from '../../types/shared' +import type { + AdditionalConfigDict, + AdditionalConfigLoader +} from '../../types/shared' export type RawConfigExports = | Awaitable> @@ -194,7 +197,9 @@ export interface UserConfig * Multi-layer configuration overloading. * Auto-resolves to docs/.../config.(ts|js|json) when unspecified. */ - additionalConfig?: AdditionalConfig + additionalConfig?: + | AdditionalConfigDict + | AdditionalConfigLoader } export interface SiteConfig diff --git a/types/shared.d.ts b/types/shared.d.ts index 62a618c2..b0f9bbd5 100644 --- a/types/shared.d.ts +++ b/types/shared.d.ts @@ -5,6 +5,14 @@ export type { DefaultTheme } from './default-theme.js' export type Awaitable = T | PromiseLike +// Beware that this may cause performance issues or infinite loops +// Use only when absolutely necessary +export type DeepPartial = T extends object + ? { + [K in keyof T]?: DeepPartial + } + : T + export interface PageData { relativePath: string /** @@ -134,7 +142,9 @@ export interface SiteData { router: { prefetchLinks: boolean } - additionalConfig?: AdditionalConfig + additionalConfig?: + | AdditionalConfigDict + | AdditionalConfigLoader } export type HeadConfig = @@ -162,26 +172,18 @@ export interface LocaleSpecificConfig { themeConfig?: ThemeConfig } -export interface AdditionalConfigEntry - extends LocaleSpecificConfig { - /** - * Source of current config entry, only available in development mode - */ - src?: string -} +export type AdditionalConfig = DeepPartial< + LocaleSpecificConfig +> export type AdditionalConfigDict = Record< string, - AdditionalConfigEntry + AdditionalConfig > export type AdditionalConfigLoader = ( path: string -) => AdditionalConfigEntry[] - -export type AdditionalConfig = - | AdditionalConfigDict - | AdditionalConfigLoader +) => AdditionalConfig[] export type LocaleConfig = Record< string,