From f39b6a98d6d2cc9ba405204a4d7a91eadce64a0d Mon Sep 17 00:00:00 2001 From: Evan You Date: Tue, 7 Mar 2023 15:32:45 +0800 Subject: [PATCH] feat: support Theme.extends --- src/client/app/index.ts | 19 ++++++++++++++++++- src/client/app/theme.ts | 1 + 2 files changed, 19 insertions(+), 1 deletion(-) diff --git a/src/client/app/index.ts b/src/client/app/index.ts index 5b2589ea..db24c27e 100644 --- a/src/client/app/index.ts +++ b/src/client/app/index.ts @@ -7,7 +7,7 @@ import { onMounted, watchEffect } from 'vue' -import Theme from '@theme/index' +import RawTheme from '@theme/index' import { inBrowser, pathToFile } from './utils.js' import { type Router, RouterSymbol, createRouter } from './router.js' import { siteDataRef, useData } from './data.js' @@ -19,6 +19,23 @@ import { ClientOnly } from './components/ClientOnly.js' import { useCopyCode } from './composables/copyCode.js' import { useCodeGroups } from './composables/codeGroups.js' +function resolveThemeExtends(theme: typeof RawTheme): typeof RawTheme { + if (theme.extends) { + const base = resolveThemeExtends(theme.extends) + return { + ...base, + ...theme, + enhanceApp(ctx) { + if (base.enhanceApp) base.enhanceApp(ctx) + if (theme.enhanceApp) theme.enhanceApp(ctx) + } + } + } + return theme +} + +const Theme = resolveThemeExtends(RawTheme) + const VitePressApp = defineComponent({ name: 'VitePressApp', setup() { diff --git a/src/client/app/theme.ts b/src/client/app/theme.ts index 8cb99e51..4284bf15 100644 --- a/src/client/app/theme.ts +++ b/src/client/app/theme.ts @@ -11,6 +11,7 @@ export interface EnhanceAppContext { export interface Theme { Layout: Component enhanceApp?: (ctx: EnhanceAppContext) => Awaitable + extends?: Theme /** * @deprecated can be replaced by wrapping layout component