diff --git a/.docs/.vitepress/config.mts b/.docs/.vitepress/config.mts index 8145c77..cd314e6 100644 --- a/.docs/.vitepress/config.mts +++ b/.docs/.vitepress/config.mts @@ -1,4 +1,6 @@ import { defineConfig } from 'vitepress' +import { transformerTwoslash } from 'vitepress-plugin-twoslash' +import { nuxtCompilerOptions, prepend, typeDecorations } from './nuxtUtils' // https://vitepress.dev/reference/site-config export default defineConfig({ @@ -71,4 +73,27 @@ export default defineConfig({ { icon: 'x', link: 'https://twitter.com/oku_ui' }, ], }, + + lastUpdated: true, + cleanUrls: true, + metaChunk: true, + markdown: { + codeTransformers: [ + transformerTwoslash({ + twoslashOptions: { + compilerOptions: { + lib: ['esnext', 'dom'], + jsx: 1, // Preserve + jsxImportSource: 'vue', + ...nuxtCompilerOptions, + }, + extraFiles: { + ...typeDecorations, + 'index.ts': { prepend }, + 'index.tsx': { prepend }, + }, + }, + }), + ], + }, }) diff --git a/.docs/.vitepress/nuxtUtils.ts b/.docs/.vitepress/nuxtUtils.ts new file mode 100644 index 0000000..5e50b88 --- /dev/null +++ b/.docs/.vitepress/nuxtUtils.ts @@ -0,0 +1,55 @@ +// @credit: @antfu https://github.com/antfu/nuxt-content-twoslash + +import { existsSync } from 'node:fs' +import fs from 'node:fs/promises' +import fg from 'fast-glob' +import ts from 'typescript' +import { dirname, join, relative, resolve } from 'pathe' + +export const prepend = [ + '/// ', + '', +].join('\n') + +async function getTypeDecorations(dir: string, filesMap: Record = {}) { + const files = await fg('**/*.d.ts', { + cwd: dir, + onlyFiles: true, + }) + await Promise.all( + files.map(async (file) => { + filesMap[`.nuxt/${file}`] = await fs.readFile(join(dir, file), 'utf-8') + }), + ) + return filesMap +} + +function removeJSONComments(content: string) { + return content.replace(/\/\/.*/g, '') +} + +async function getNuxtCompilerOptions(dir: string) { + const path = join(dir, 'tsconfig.json') + if (existsSync(path)) { + try { + const tsconfig = await fs.readFile(path, 'utf-8') + const config = JSON.parse(removeJSONComments(tsconfig)) || {} + const json = ts.convertCompilerOptionsFromJson(config.compilerOptions, dir, '').options + Object.entries(json.paths || {}).forEach(([key, value]) => { + json.paths![key] = value.map((v: string) => `./${relative(dirname(dir), resolve(dir, v))}`) + if (key === '#imports') + json.paths![key] = ['./.nuxt/imports.d.ts'] + }) + return json + } + catch (e) { + console.error('[nuxt-content-twoslash] Failed to parse .nuxt/tsconfig.json', e) + return {} + } + } + return {} +} + +export const typeDecorations = await getTypeDecorations(join(__dirname, '..', '.nuxt')) + +export const nuxtCompilerOptions = await getNuxtCompilerOptions(join(__dirname, '..', '.nuxt')) diff --git a/.docs/apis/components/motion.md b/.docs/apis/components/motion.md index 40363c9..52afc37 100644 --- a/.docs/apis/components/motion.md +++ b/.docs/apis/components/motion.md @@ -4,7 +4,7 @@ description: Motion components are DOM primitives optimised for 60fps animation icon: i-ph-brackets-curly-duotone next: text: 'PresenceGroup' - link: '/apis/presence-group' + link: '/apis/components/presence-group' --- # Motion diff --git a/.docs/apis/components/presence-group.md b/.docs/apis/components/presence-group.md index 70c91f2..f46ce66 100644 --- a/.docs/apis/components/presence-group.md +++ b/.docs/apis/components/presence-group.md @@ -4,10 +4,10 @@ description: Perform exit animations in Vue. Group multiple Motion components to icon: i-ph-brackets-curly-duotone next: text: 'Presence' - link: '/apis/presence' + link: '/apis/components/presence' prev: text: 'Motion' - link: '/apis/motion' + link: '/apis/components/motion' --- # PresenceGroup diff --git a/.docs/apis/components/presence.md b/.docs/apis/components/presence.md index a2e84e7..9b14679 100644 --- a/.docs/apis/components/presence.md +++ b/.docs/apis/components/presence.md @@ -4,7 +4,7 @@ description: Perform exit animations in Vue. icon: i-ph-brackets-curly-duotone prev: text: 'Transition' - link: '/apis/transition' + link: '/apis/components/transition' --- # Presence