diff --git a/packages/docs/build/frontmatterMeta.ts b/packages/docs/build/markdownBuilders.ts similarity index 68% rename from packages/docs/build/frontmatterMeta.ts rename to packages/docs/build/markdownBuilders.ts index 8ffb802a0d30..9071b495c38e 100644 --- a/packages/docs/build/frontmatterMeta.ts +++ b/packages/docs/build/markdownBuilders.ts @@ -52,6 +52,49 @@ const validate = ajv.compile({ }, }) +async function setupPages (payload, options) { + if (!options.pages) { + const pagesPlugin = payload.viteConfig.plugins! + .find(p => p && 'name' in p && p.name === 'vite-plugin-pages') as Plugin + options.pages = await pagesPlugin.api.getResolvedRoutes() as [] + } + + const page = options.pages.find(p => payload.fileName.endsWith(p.component)) + + if (!page) throw new Error('Unable to find page') + + const locale = page.path.split('/').at(1)! + + options.files ??= new Map() + options.files.set(page.path, { + ...payload, + html: payload.html?.cloneNode(true), + }) + + let original = payload + if (locale !== 'en') { + const originalPath = page.path.replace(`/${locale}/`, '/en/') + original = options.files.get(originalPath) + if (!original) { + options.awaiting ??= new Map() + const awaiting = options.awaiting.get(originalPath) ?? [] + const { promise, resolve } = Promise.withResolvers>() + awaiting.push(resolve) + options.awaiting.set(originalPath, awaiting) + original = await promise + } + } else { + if (options.awaiting?.has(page.path)) { + options.awaiting.get(page.path)!.forEach(fn => fn({ + ...payload, + html: payload.html?.cloneNode(true), + })) + } + } + + return { page, locale, original } +} + export const frontmatterBuilder = createBuilder('frontmatterBuilder', 'metaExtracted') .options<{ files?: Map> @@ -60,46 +103,17 @@ export const frontmatterBuilder = createBuilder('frontmatterBuilder', 'metaExtra }>() .initializer() .handler(async (payload, options) => { - const { frontmatter, fileName } = payload - - if (!options.pages) { - const pagesPlugin = payload.viteConfig.plugins! - .find(p => p && 'name' in p && p.name === 'vite-plugin-pages') as Plugin - options.pages = await pagesPlugin.api.getResolvedRoutes() as [] - } - - const page = options.pages.find(p => fileName.endsWith(p.component)) + const { locale, original } = await setupPages(payload, options) - if (!page) throw new Error('Unable to find page') - - const locale = page.path.split('/').at(0)! - - options.files ??= new Map() - options.files.set(page.path, payload) - - const { meta, ...rest } = frontmatter + const { meta, ...rest } = payload.frontmatter if (locale !== 'en') { - const originalPath = page.path.replace(`/${locale}/`, '/en/') - let original = options.files.get(originalPath) - if (!original) { - options.awaiting ??= new Map() - const awaiting = options.awaiting.get(originalPath) ?? [] - const { promise, resolve } = Promise.withResolvers>() - awaiting.push(resolve) - options.awaiting.set(originalPath, awaiting) - original = await promise - } Object.assign(rest, { assets: original.frontmatter.assets, related: original.frontmatter.related, }) } - if (options.awaiting?.has(page.path)) { - options.awaiting.get(page.path)!.forEach(fn => fn(payload)) - } - payload.frontmatter = { meta, assets: rest.assets, @@ -179,3 +193,24 @@ function generateToc (content: string) { return headings } + +export const scriptFixer = createBuilder('scriptFixer', 'dom') + .options() + .initializer() + .handler(async (payload, options) => { + const { locale, original } = await setupPages(payload, options) + + if (locale !== 'en') { + const setup = payload.html.querySelector('script[setup]') + const origSetup = original.html.querySelector('script[setup]') + if (setup) { + if (!origSetup) { + throw new Error(`Extra setup in ${payload.fileName}`) + } + setup.innerHTML = origSetup.innerHTML + } + } + + return payload + }) + .meta() diff --git a/packages/docs/src/pages/en/api/[name].md b/packages/docs/src/pages/en/api/[name].md index 51b2ca507472..b292397d3fcd 100644 --- a/packages/docs/src/pages/en/api/[name].md +++ b/packages/docs/src/pages/en/api/[name].md @@ -5,7 +5,7 @@ meta: keywords: api, vuetify --- - @@ -19,4 +19,4 @@ meta: - + diff --git a/packages/docs/vite.config.mts b/packages/docs/vite.config.mts index 0d777aa0d4d2..2936ac6687a7 100644 --- a/packages/docs/vite.config.mts +++ b/packages/docs/vite.config.mts @@ -22,7 +22,7 @@ import Api from './build/api-plugin' import { Examples } from './build/examples-plugin' import { genAppMetaInfo } from './src/utils/metadata' import { MdiJs } from './build/mdi-js' -import { frontmatterBuilder, getRouteMeta } from './build/frontmatterMeta' +import { frontmatterBuilder, getRouteMeta, scriptFixer } from './build/markdownBuilders' const resolve = (file: string) => fileURLToPath(new URL(file, import.meta.url)) @@ -151,7 +151,7 @@ export default defineConfig(({ command, mode, isSsrBuild }) => { exposeFrontmatter: true, exposeExcerpt: false, markdownItSetup: configureMarkdown, - builders: [frontmatterBuilder()] + builders: [frontmatterBuilder(), scriptFixer()] }), // https://github.com/hannoeru/vite-plugin-pages