vitepress-openapi
Version:
Generate VitePress API Documentation from OpenAPI Specification.
58 lines (48 loc) • 1.69 kB
text/typescript
import type { Awaitable } from 'vitepress'
import type { EnhanceAppContext, Theme } from 'vitepress/client'
import type { Component } from 'vue'
import type { OpenApiSpecInstance } from './lib/spec/createOpenApiSpec'
import { createI18n } from '@byjohann/vue-i18n'
import { watch } from 'vue'
import * as components from './components'
import { DEFAULT_OPERATION_SLOTS, useTheme } from './composables/useTheme'
interface OAEnhanceAppContext extends EnhanceAppContext {
openapi?: OpenApiSpecInstance | null
}
interface VPTheme {
Layout: Component
enhanceApp: (ctx: OAEnhanceAppContext) => Awaitable<void>
extends?: Theme
}
export const theme = {
enhanceApp({ app }) {
const themeConfig = useTheme()
const i18nConfig = themeConfig.getI18nConfig()
const i18n = createI18n({
defaultLocale: i18nConfig.locale?.value || 'en',
messages: i18nConfig.messages || {},
})
app.use(i18n)
watch(
() => themeConfig.getLocale(),
() => {
i18n.setLocale(themeConfig.getLocale())
},
{
immediate: true,
},
)
Object.entries(components).forEach(([key, component]) => {
app.component(key, component)
})
},
} as VPTheme
export { useOpenapi } from './composables/useOpenapi'
export { usePlayground } from './composables/usePlayground'
export { DEFAULT_OPERATION_SLOTS }
export { useShiki } from './composables/useShiki'
export { useTheme } from './composables/useTheme'
export { generateCodeSample } from './lib/codeSamples/generateCodeSample'
export { OARequest } from './lib/codeSamples/request'
export { createOpenApiSpec } from './lib/spec/createOpenApiSpec'
export { locales } from './locales'