import type { Ref } from 'vue' import type { PageDataRef, PageFrontmatterRef, SiteLocaleDataRef, } from 'vuepress/client' import type { BlogOptions, ThemeFriendsFrontmatter, ThemeHomeFrontmatter, ThemeLocaleData, ThemePageData, ThemePageFrontmatter, ThemePostFrontmatter, } from '../../shared/index.js' import type { ThemeLocaleDataRef } from './theme-data.js' import { computed } from 'vue' import { usePageData, usePageFrontmatter, usePageLang, useSiteLocaleData, } from 'vuepress/client' import { useDarkMode } from './dark-mode.js' import { useThemeData, useThemeLocaleData } from './theme-data.js' type FrontmatterType = 'home' | 'post' | 'friends' | 'page' type Frontmatter = T extends 'home' ? ThemeHomeFrontmatter : T extends 'post' ? ThemePostFrontmatter : T extends 'friends' ? ThemeFriendsFrontmatter : ThemePageFrontmatter export interface Data { theme: ThemeLocaleDataRef page: PageDataRef frontmatter: PageFrontmatterRef & Record> blog: Ref lang: Ref site: SiteLocaleDataRef isDark: Ref } export function useData(): Data { const themeData = useThemeData() const theme = useThemeLocaleData() const page = usePageData() const frontmatter = usePageFrontmatter & Record>() const site = useSiteLocaleData() const isDark = useDarkMode() const lang = usePageLang() const blog = computed(() => themeData.value.blog || {}) return { theme, page, frontmatter, lang, site, isDark, blog } }