import type { ComputedRef, InjectionKey } from 'vue' // import type { RouteMeta } from 'vue-router' // fix build caused by pnpm // This is likely not portable. A type annotation is necessary. // https://github.com/microsoft/TypeScript/issues/42873 import type { DefaultTheme, ValaxyConfig } from '../types' import type { ValaxyData } from './app/data' import { computed, hasInjectionContext, inject, readonly, shallowRef } from 'vue' // @ts-expect-error virtual module @valaxyjs/config import valaxyConfig from '/@valaxyjs/config' // @ts-expect-error virtual module @valaxyjs/context import valaxyContext from '/@valaxyjs/context' /** * parse valaxy config * @param data */ function parse(data: string): T { const parsed = JSON.parse(data) return (import.meta.env.DEV ? readonly(parsed) : parsed) as T } interface ValaxyContext { userRoot: string } export const valaxyConfigSymbol: InjectionKey> = Symbol('valaxy:config') export const valaxyConfigRef = shallowRef(parse(valaxyConfig)) export const dataSymbol: InjectionKey = Symbol('ValaxyData') export const valaxyContextRef = shallowRef(parse(valaxyContext)) valaxyConfigRef.value = parse(valaxyConfig) valaxyContextRef.value = parse(valaxyContext) // hmr if (import.meta.hot) { // /@valaxyjs/config must be static string import.meta.hot.accept('/@valaxyjs/config', (m) => { valaxyConfigRef.value = parse(m?.default) }) // context import.meta.hot.accept('/@valaxyjs/context', (m) => { valaxyContextRef.value = parse(m?.default) }) } export function initValaxyConfig() { return computed(() => valaxyConfigRef.value) } export function initContext() { return computed(() => valaxyContextRef.value) } /** * get valaxy config * @public */ export function useValaxyConfig() { if (!hasInjectionContext()) throw new Error('[Valaxy] useValaxyConfig() must be called inside setup() or a component lifecycle') const config = inject>>(valaxyConfigSymbol) if (!config) throw new Error('[Valaxy] site config not properly injected in app') return config } /** * alias for useSite * @public */ export function useConfig() { return useValaxyConfig() } /** * get valaxy config * @public */ export function useSiteConfig() { const config = useValaxyConfig() return computed(() => config!.value.siteConfig) } /** * You can use like this: import { useThemeConfig } from 'valaxy-theme-xxx' * if you want to: import { useThemeConfig } from 'valaxy' * you need pass themeConfig by yourself * @internal */ export function useThemeConfig() { const config = useValaxyConfig() return computed(() => config!.value.themeConfig) } export function useRuntimeConfig() { const config = useValaxyConfig() return computed(() => config!.value.runtimeConfig) }