From 5dce7e9f865b4023cbccd10465e42376bc8dfed3 Mon Sep 17 00:00:00 2001 From: Farnabaz Date: Thu, 14 Aug 2025 15:54:04 +0200 Subject: [PATCH 01/12] feat: export client utils from `/client` --- package.json | 1 + src/module.ts | 8 ++++---- src/runtime/{app.ts => client.ts} | 14 +++++++++++--- src/types/schema.ts | 1 + 4 files changed, 17 insertions(+), 7 deletions(-) rename src/runtime/{app.ts => client.ts} (91%) diff --git a/package.json b/package.json index 36623f0ff..2eb1f7817 100644 --- a/package.json +++ b/package.json @@ -33,6 +33,7 @@ "import": "./dist/runtime/utils/index.js" }, "./runtime": "./dist/runtime/index.js", + "./client": "./dist/runtime/client.js", "./server": "./dist/runtime/server.js", "./nitro": "./dist/runtime/nitro.js" }, diff --git a/src/module.ts b/src/module.ts index bdf92b237..f8323f7b0 100644 --- a/src/module.ts +++ b/src/module.ts @@ -104,10 +104,10 @@ export default defineNuxtModule({ // Helpers are designed to be enviroment agnostic addImports([ - { name: 'queryCollection', from: resolver.resolve('./runtime/app') }, - { name: 'queryCollectionSearchSections', from: resolver.resolve('./runtime/app') }, - { name: 'queryCollectionNavigation', from: resolver.resolve('./runtime/app') }, - { name: 'queryCollectionItemSurroundings', from: resolver.resolve('./runtime/app') }, + { name: 'queryCollection', from: resolver.resolve('./runtime/client') }, + { name: 'queryCollectionSearchSections', from: resolver.resolve('./runtime/client') }, + { name: 'queryCollectionNavigation', from: resolver.resolve('./runtime/client') }, + { name: 'queryCollectionItemSurroundings', from: resolver.resolve('./runtime/client') }, ]) addServerImports([ { name: 'queryCollection', from: resolver.resolve('./runtime/nitro') }, diff --git a/src/runtime/app.ts b/src/runtime/client.ts similarity index 91% rename from src/runtime/app.ts rename to src/runtime/client.ts index 7b8915a49..b016fd4b4 100644 --- a/src/runtime/app.ts +++ b/src/runtime/client.ts @@ -40,10 +40,18 @@ async function executeContentQuery m.loadDatabaseAdapter) + return adapter +} + async function queryContentSqlClientWasm(collection: T, sql: string) { - const rows = await import('./internal/database.client') - .then(m => m.loadDatabaseAdapter(collection)) - .then(db => db.all(sql)) + const rows = await loadWebAssemplyDatabaseAdapter() + .then(adapter => adapter(collection).all(sql)) return rows as Result[] } diff --git a/src/types/schema.ts b/src/types/schema.ts index 37938f585..08ac1ee3c 100644 --- a/src/types/schema.ts +++ b/src/types/schema.ts @@ -14,6 +14,7 @@ export interface Draft07Definition { export interface Draft07DefinitionProperty { type?: string // missing type means any properties?: Record + items?: Draft07DefinitionProperty required?: string[] default?: unknown maxLength?: number From addd766877f18b1290eb1f13bbc76ab2604fdd29 Mon Sep 17 00:00:00 2001 From: Farnabaz Date: Thu, 14 Aug 2025 16:11:46 +0200 Subject: [PATCH 02/12] up --- src/runtime/client.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/runtime/client.ts b/src/runtime/client.ts index b016fd4b4..2c2c2b39f 100644 --- a/src/runtime/client.ts +++ b/src/runtime/client.ts @@ -45,7 +45,7 @@ async function executeContentQuery m.loadDatabaseAdapter) + const adapter = await import('./internal/database.client').then(m => m.loadDatabaseAdapter) return adapter } From b6ca5a1977c3c7e7a45761065ed83fc4124cf39c Mon Sep 17 00:00:00 2001 From: Farnabaz Date: Thu, 14 Aug 2025 17:17:36 +0200 Subject: [PATCH 03/12] feat: provide client local database --- package.json | 1 - src/runtime/client.ts | 14 +++----------- src/runtime/internal/database.client.ts | 3 +++ 3 files changed, 6 insertions(+), 12 deletions(-) diff --git a/package.json b/package.json index 2eb1f7817..36623f0ff 100644 --- a/package.json +++ b/package.json @@ -33,7 +33,6 @@ "import": "./dist/runtime/utils/index.js" }, "./runtime": "./dist/runtime/index.js", - "./client": "./dist/runtime/client.js", "./server": "./dist/runtime/server.js", "./nitro": "./dist/runtime/nitro.js" }, diff --git a/src/runtime/client.ts b/src/runtime/client.ts index 2c2c2b39f..7b8915a49 100644 --- a/src/runtime/client.ts +++ b/src/runtime/client.ts @@ -40,18 +40,10 @@ async function executeContentQuery m.loadDatabaseAdapter) - return adapter -} - async function queryContentSqlClientWasm(collection: T, sql: string) { - const rows = await loadWebAssemplyDatabaseAdapter() - .then(adapter => adapter(collection).all(sql)) + const rows = await import('./internal/database.client') + .then(m => m.loadDatabaseAdapter(collection)) + .then(db => db.all(sql)) return rows as Result[] } diff --git a/src/runtime/internal/database.client.ts b/src/runtime/internal/database.client.ts index 6a389aa9e..233a464d3 100644 --- a/src/runtime/internal/database.client.ts +++ b/src/runtime/internal/database.client.ts @@ -4,6 +4,7 @@ import { refineContentFields } from './collection' import { fetchDatabase } from './api' import type { DatabaseAdapter, DatabaseBindParams } from '@nuxt/content' import { checksums, tables } from '#content/manifest' +import { useNuxtApp } from '#imports' let db: Database const loadedCollections: Record = {} @@ -14,6 +15,8 @@ export function loadDatabaseAdapter(collection: T): DatabaseAdapter { dbPromises._ = dbPromises._ || initializeDatabase() db = await dbPromises._ Reflect.deleteProperty(dbPromises, '_') + // expose database adapter + useNuxtApp().provide('contentLocalDatabase', loadCollectionDatabase) } if (!loadedCollections[String(collection)]) { dbPromises[String(collection)] = dbPromises[String(collection)] || loadCollectionDatabase(collection) From 0fc7d1c7659501f3c3e47127930d59d9d4bae9cc Mon Sep 17 00:00:00 2001 From: Farnabaz Date: Thu, 14 Aug 2025 17:31:45 +0200 Subject: [PATCH 04/12] up --- src/runtime/internal/database.client.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/runtime/internal/database.client.ts b/src/runtime/internal/database.client.ts index 233a464d3..9708bb479 100644 --- a/src/runtime/internal/database.client.ts +++ b/src/runtime/internal/database.client.ts @@ -16,7 +16,7 @@ export function loadDatabaseAdapter(collection: T): DatabaseAdapter { db = await dbPromises._ Reflect.deleteProperty(dbPromises, '_') // expose database adapter - useNuxtApp().provide('contentLocalDatabase', loadCollectionDatabase) + useNuxtApp().provide('contentLocalDatabase', loadDatabaseAdapter) } if (!loadedCollections[String(collection)]) { dbPromises[String(collection)] = dbPromises[String(collection)] || loadCollectionDatabase(collection) From 687ad152c09e5ac9e7c63f5d0b6cf316b4936024 Mon Sep 17 00:00:00 2001 From: Farnabaz Date: Tue, 26 Aug 2025 15:27:36 +0200 Subject: [PATCH 05/12] feat: provide content information on preview --- src/runtime/plugins/preview.client.ts | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/src/runtime/plugins/preview.client.ts b/src/runtime/plugins/preview.client.ts index cfb55ca3b..3ed251b96 100644 --- a/src/runtime/plugins/preview.client.ts +++ b/src/runtime/plugins/preview.client.ts @@ -1,5 +1,5 @@ import type { PublicRuntimeConfig } from '@nuxt/content' -import { defineNuxtPlugin, useCookie, useRoute, useRuntimeConfig, getAppManifest } from '#imports' +import { defineNuxtPlugin, useCookie, useRoute, useRuntimeConfig, getAppManifest, queryCollection, queryCollectionItemSurroundings, queryCollectionNavigation, queryCollectionSearchSections } from '#imports' export default defineNuxtPlugin(async (nuxtApp) => { const previewConfig: PublicRuntimeConfig['preview'] = useRuntimeConfig().public.preview || {} @@ -28,6 +28,14 @@ export default defineNuxtPlugin(async (nuxtApp) => { const manifest = await getAppManifest() manifest.prerendered = [] + nuxtApp.provide('content', { + queryCollection, + queryCollectionItemSurroundings, + queryCollectionNavigation, + queryCollectionSearchSections, + collections: await import('#content/preview').then(m => m.collections) + }) + nuxtApp.hook('app:mounted', async () => { await import('../internal/preview').then(({ mountPreviewUI, initIframeCommunication }) => { mountPreviewUI() From 601155a461ca0dd0eed51f34c3ca99542a7f3902 Mon Sep 17 00:00:00 2001 From: Farnabaz Date: Tue, 26 Aug 2025 19:36:23 +0200 Subject: [PATCH 06/12] lint: fix --- src/runtime/plugins/preview.client.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/runtime/plugins/preview.client.ts b/src/runtime/plugins/preview.client.ts index 3ed251b96..112c72d1d 100644 --- a/src/runtime/plugins/preview.client.ts +++ b/src/runtime/plugins/preview.client.ts @@ -33,7 +33,7 @@ export default defineNuxtPlugin(async (nuxtApp) => { queryCollectionItemSurroundings, queryCollectionNavigation, queryCollectionSearchSections, - collections: await import('#content/preview').then(m => m.collections) + collections: await import('#content/preview').then(m => m.collections), }) nuxtApp.hook('app:mounted', async () => { From 8488733ac3832663b22efed941511baeb9b5a513 Mon Sep 17 00:00:00 2001 From: Farnabaz Date: Tue, 26 Aug 2025 19:40:17 +0200 Subject: [PATCH 07/12] fix: types --- src/runtime/plugins/preview.client.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/src/runtime/plugins/preview.client.ts b/src/runtime/plugins/preview.client.ts index 112c72d1d..cf31b84f7 100644 --- a/src/runtime/plugins/preview.client.ts +++ b/src/runtime/plugins/preview.client.ts @@ -1,4 +1,5 @@ import type { PublicRuntimeConfig } from '@nuxt/content' +// @ts-expect-error not exposed in queryCollection import { defineNuxtPlugin, useCookie, useRoute, useRuntimeConfig, getAppManifest, queryCollection, queryCollectionItemSurroundings, queryCollectionNavigation, queryCollectionSearchSections } from '#imports' export default defineNuxtPlugin(async (nuxtApp) => { From c782f6fd8365e42fcbe22c2066e77d85088cc48b Mon Sep 17 00:00:00 2001 From: Farnabaz Date: Fri, 19 Sep 2025 13:15:53 +0200 Subject: [PATCH 08/12] feat: $content provide --- src/module.ts | 1 + src/runtime/internal/database.client.ts | 3 --- src/runtime/plugins/content.client.ts | 14 ++++++++++++++ src/runtime/plugins/preview.client.ts | 11 +---------- src/runtime/plugins/studio/preview.client.ts | 0 5 files changed, 16 insertions(+), 13 deletions(-) create mode 100644 src/runtime/plugins/content.client.ts delete mode 100644 src/runtime/plugins/studio/preview.client.ts diff --git a/src/module.ts b/src/module.ts index f8323f7b0..4ea8ac19b 100644 --- a/src/module.ts +++ b/src/module.ts @@ -98,6 +98,7 @@ export default defineNuxtModule({ nuxt.options.vite.optimizeDeps ||= {} nuxt.options.vite.optimizeDeps.exclude ||= [] nuxt.options.vite.optimizeDeps.exclude.push('@sqlite.org/sqlite-wasm') + addPlugin({ src: resolver.resolve('./runtime/plugins/content.client'), mode: 'client' }) // Ignore content directory files in building nuxt.options.ignore = [...(nuxt.options.ignore || []), 'content/**'] diff --git a/src/runtime/internal/database.client.ts b/src/runtime/internal/database.client.ts index 9708bb479..6a389aa9e 100644 --- a/src/runtime/internal/database.client.ts +++ b/src/runtime/internal/database.client.ts @@ -4,7 +4,6 @@ import { refineContentFields } from './collection' import { fetchDatabase } from './api' import type { DatabaseAdapter, DatabaseBindParams } from '@nuxt/content' import { checksums, tables } from '#content/manifest' -import { useNuxtApp } from '#imports' let db: Database const loadedCollections: Record = {} @@ -15,8 +14,6 @@ export function loadDatabaseAdapter(collection: T): DatabaseAdapter { dbPromises._ = dbPromises._ || initializeDatabase() db = await dbPromises._ Reflect.deleteProperty(dbPromises, '_') - // expose database adapter - useNuxtApp().provide('contentLocalDatabase', loadDatabaseAdapter) } if (!loadedCollections[String(collection)]) { dbPromises[String(collection)] = dbPromises[String(collection)] || loadCollectionDatabase(collection) diff --git a/src/runtime/plugins/content.client.ts b/src/runtime/plugins/content.client.ts new file mode 100644 index 000000000..ad90d2608 --- /dev/null +++ b/src/runtime/plugins/content.client.ts @@ -0,0 +1,14 @@ +import { defineNuxtPlugin } from '#imports' + +export default defineNuxtPlugin(() => { + return { + provide: { + content: { + loadLocalDatabase: (collection: string) => { + return import('../internal/database.client') + .then(({ loadDatabaseAdapter }) => loadDatabaseAdapter(collection)) + }, + }, + }, + } +}) diff --git a/src/runtime/plugins/preview.client.ts b/src/runtime/plugins/preview.client.ts index cf31b84f7..cfb55ca3b 100644 --- a/src/runtime/plugins/preview.client.ts +++ b/src/runtime/plugins/preview.client.ts @@ -1,6 +1,5 @@ import type { PublicRuntimeConfig } from '@nuxt/content' -// @ts-expect-error not exposed in queryCollection -import { defineNuxtPlugin, useCookie, useRoute, useRuntimeConfig, getAppManifest, queryCollection, queryCollectionItemSurroundings, queryCollectionNavigation, queryCollectionSearchSections } from '#imports' +import { defineNuxtPlugin, useCookie, useRoute, useRuntimeConfig, getAppManifest } from '#imports' export default defineNuxtPlugin(async (nuxtApp) => { const previewConfig: PublicRuntimeConfig['preview'] = useRuntimeConfig().public.preview || {} @@ -29,14 +28,6 @@ export default defineNuxtPlugin(async (nuxtApp) => { const manifest = await getAppManifest() manifest.prerendered = [] - nuxtApp.provide('content', { - queryCollection, - queryCollectionItemSurroundings, - queryCollectionNavigation, - queryCollectionSearchSections, - collections: await import('#content/preview').then(m => m.collections), - }) - nuxtApp.hook('app:mounted', async () => { await import('../internal/preview').then(({ mountPreviewUI, initIframeCommunication }) => { mountPreviewUI() diff --git a/src/runtime/plugins/studio/preview.client.ts b/src/runtime/plugins/studio/preview.client.ts deleted file mode 100644 index e69de29bb..000000000 From 22409fe226ffe1d969f9724293673de2270d7375 Mon Sep 17 00:00:00 2001 From: Farnabaz Date: Fri, 19 Sep 2025 13:31:09 +0200 Subject: [PATCH 09/12] up --- src/runtime/plugins/content.client.ts | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/runtime/plugins/content.client.ts b/src/runtime/plugins/content.client.ts index ad90d2608..0bfa0db0d 100644 --- a/src/runtime/plugins/content.client.ts +++ b/src/runtime/plugins/content.client.ts @@ -4,9 +4,8 @@ export default defineNuxtPlugin(() => { return { provide: { content: { - loadLocalDatabase: (collection: string) => { - return import('../internal/database.client') - .then(({ loadDatabaseAdapter }) => loadDatabaseAdapter(collection)) + loadLocalDatabase: () => { + return import('../internal/database.client').then(m => m.loadDatabaseAdapter) }, }, }, From 585b904e55b5ab09f33e9399577c2b2f54b41bba Mon Sep 17 00:00:00 2001 From: Farnabaz Date: Fri, 3 Oct 2025 15:03:44 +0200 Subject: [PATCH 10/12] feat: prepare new preview system --- src/module.ts | 9 ++-- src/runtime/components/ContentRenderer.vue | 2 +- src/runtime/plugins/content.client.ts | 13 ----- .../plugins/preview-with-api.client.ts | 40 ++++++++++++++++ src/runtime/plugins/preview.client.ts | 47 +++++-------------- src/types/global.d.ts | 4 ++ src/utils/preview/module.ts | 23 ++++++++- 7 files changed, 83 insertions(+), 55 deletions(-) delete mode 100644 src/runtime/plugins/content.client.ts create mode 100644 src/runtime/plugins/preview-with-api.client.ts diff --git a/src/module.ts b/src/module.ts index 4ea8ac19b..b6a0cd63f 100644 --- a/src/module.ts +++ b/src/module.ts @@ -30,7 +30,7 @@ import { createParser } from './utils/content' import { installMDCModule } from './utils/mdc' import { findPreset } from './presets' import type { Manifest } from './types/manifest' -import { setupPreview, shouldEnablePreview } from './utils/preview/module' +import { setupPreview, setupPreviewWithAPI, shouldEnablePreview } from './utils/preview/module' import { parseSourceBase } from './utils/source' import { databaseVersion, getLocalDatabase, refineDatabaseConfig, resolveDatabaseAdapter } from './utils/database' import type { ParsedContentFile } from './types' @@ -98,7 +98,6 @@ export default defineNuxtModule({ nuxt.options.vite.optimizeDeps ||= {} nuxt.options.vite.optimizeDeps.exclude ||= [] nuxt.options.vite.optimizeDeps.exclude.push('@sqlite.org/sqlite-wasm') - addPlugin({ src: resolver.resolve('./runtime/plugins/content.client'), mode: 'client' }) // Ignore content directory files in building nuxt.options.ignore = [...(nuxt.options.ignore || []), 'content/**'] @@ -203,6 +202,7 @@ export default defineNuxtModule({ if (hasNuxtModule('nuxt-llms')) { installModule(resolver.resolve('./features/llms')) } + await installMDCModule(options, nuxt) if (nuxt.options._prepare) { @@ -230,9 +230,12 @@ export default defineNuxtModule({ }) // Handle preview mode - if (shouldEnablePreview(nuxt, options)) { + if (hasNuxtModule('nuxt-studio')) { await setupPreview(options, nuxt, resolver, manifest) } + if (shouldEnablePreview(nuxt, options)) { + await setupPreviewWithAPI(options, nuxt, resolver, manifest) + } }) }, }) diff --git a/src/runtime/components/ContentRenderer.vue b/src/runtime/components/ContentRenderer.vue index 6c45c4cf9..e2f03dcaf 100644 --- a/src/runtime/components/ContentRenderer.vue +++ b/src/runtime/components/ContentRenderer.vue @@ -74,7 +74,7 @@ const props = defineProps({ }, }) -const debug = import.meta.dev +const debug = import.meta.dev || import.meta.preview const body = computed(() => { let body = props.value.body || props.value diff --git a/src/runtime/plugins/content.client.ts b/src/runtime/plugins/content.client.ts deleted file mode 100644 index 0bfa0db0d..000000000 --- a/src/runtime/plugins/content.client.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { defineNuxtPlugin } from '#imports' - -export default defineNuxtPlugin(() => { - return { - provide: { - content: { - loadLocalDatabase: () => { - return import('../internal/database.client').then(m => m.loadDatabaseAdapter) - }, - }, - }, - } -}) diff --git a/src/runtime/plugins/preview-with-api.client.ts b/src/runtime/plugins/preview-with-api.client.ts new file mode 100644 index 000000000..8f91c85ff --- /dev/null +++ b/src/runtime/plugins/preview-with-api.client.ts @@ -0,0 +1,40 @@ +import type { PublicRuntimeConfig } from '@nuxt/content' +import { defineNuxtPlugin, useCookie, useRoute, useRuntimeConfig, getAppManifest } from '#imports' + +export default defineNuxtPlugin(async (nuxtApp) => { + const previewConfig: PublicRuntimeConfig['preview'] = useRuntimeConfig().public.preview || {} + const route = useRoute() + const previewToken = useCookie('previewToken', { sameSite: 'none', secure: true }) + + // Deprecated: will be removed in v4 + if (previewConfig.api) { + // Do not enable preview if preview token is missing in query params + if (Object.prototype.hasOwnProperty.call(route.query, 'preview') && !route.query.preview) { + return + } + + if (!route.query.preview && !previewToken.value) { + return + } + + if (route.query.preview) { + previewToken.value = String(route.query.preview) + } + + window.sessionStorage.setItem('previewToken', String(previewToken.value)) + // @ts-expect-error not exposed in runtimeConfig + window.sessionStorage.setItem('previewAPI', (typeof route.query.staging !== 'undefined' && previewConfig.stagingApi) ? previewConfig.stagingApi : previewConfig.api) + + // Disable prerendering for preview + const manifest = await getAppManifest() + manifest.prerendered = [] + + nuxtApp.hook('app:mounted', async () => { + await import('../internal/preview').then(({ mountPreviewUI, initIframeCommunication }) => { + mountPreviewUI() + initIframeCommunication() + }) + }) + } + +}) diff --git a/src/runtime/plugins/preview.client.ts b/src/runtime/plugins/preview.client.ts index cfb55ca3b..537c9b34d 100644 --- a/src/runtime/plugins/preview.client.ts +++ b/src/runtime/plugins/preview.client.ts @@ -1,38 +1,13 @@ -import type { PublicRuntimeConfig } from '@nuxt/content' -import { defineNuxtPlugin, useCookie, useRoute, useRuntimeConfig, getAppManifest } from '#imports' - -export default defineNuxtPlugin(async (nuxtApp) => { - const previewConfig: PublicRuntimeConfig['preview'] = useRuntimeConfig().public.preview || {} - const route = useRoute() - const previewToken = useCookie('previewToken', { sameSite: 'none', secure: true }) - - if (previewConfig.api) { - // Do not enable preview if preview token is missing in query params - if (Object.prototype.hasOwnProperty.call(route.query, 'preview') && !route.query.preview) { - return - } - - if (!route.query.preview && !previewToken.value) { - return - } - - if (route.query.preview) { - previewToken.value = String(route.query.preview) - } - - window.sessionStorage.setItem('previewToken', String(previewToken.value)) - // @ts-expect-error not exposed in runtimeConfig - window.sessionStorage.setItem('previewAPI', (typeof route.query.staging !== 'undefined' && previewConfig.stagingApi) ? previewConfig.stagingApi : previewConfig.api) - - // Disable prerendering for preview - const manifest = await getAppManifest() - manifest.prerendered = [] - - nuxtApp.hook('app:mounted', async () => { - await import('../internal/preview').then(({ mountPreviewUI, initIframeCommunication }) => { - mountPreviewUI() - initIframeCommunication() - }) - }) +import { defineNuxtPlugin } from '#imports' + +export default defineNuxtPlugin(async () => { + return { + provide: { + content: { + loadLocalDatabase: () => { + return import('../internal/database.client').then(m => m.loadDatabaseAdapter) + }, + }, + }, } }) diff --git a/src/types/global.d.ts b/src/types/global.d.ts index 4baca9fe2..97be8f156 100644 --- a/src/types/global.d.ts +++ b/src/types/global.d.ts @@ -2,6 +2,10 @@ interface Window { sendNavigateMessageInPreview: (path: string, navigate: boolean) => void } +interface ImportMeta { + readonly preview?: boolean +} + declare module '#content/manifest' { const manifest: Record const checksums: Record diff --git a/src/utils/preview/module.ts b/src/utils/preview/module.ts index 50ba2378d..058046061 100644 --- a/src/utils/preview/module.ts +++ b/src/utils/preview/module.ts @@ -16,7 +16,26 @@ import type { ModuleOptions } from '../../types' import { previewTemplate } from '../templates' import type { Manifest } from '../../types/manifest' -export async function setupPreview(options: ModuleOptions, nuxt: Nuxt, resolver: Resolver, manifest: Manifest) { +export async function setupPreview(_options: ModuleOptions, nuxt: Nuxt, resolver: Resolver, manifest: Manifest) { + nuxt.hook('schema:resolved', (schema: Schema) => { + // Add preview templates once schema is resolved + const template = addTemplate(previewTemplate(manifest.collections, {} as GitInfo, schema)).dst + nuxt.options.nitro.alias ||= {} + nuxt.options.nitro.alias['#content/preview'] = template + nuxt.options.alias['#content/preview'] = template + }) + + // Add plugins + addPlugin(resolver.resolve('./runtime/plugins/preview.client')) + + // // Install dependencies + await installModule('nuxt-component-meta', { + globalsOnly: true, + include: manifest.components, + }) +} + +export async function setupPreviewWithAPI(options: ModuleOptions, nuxt: Nuxt, resolver: Resolver, manifest: Manifest) { const previewOptions = options.preview! const { resolve } = resolver @@ -41,7 +60,7 @@ export async function setupPreview(options: ModuleOptions, nuxt: Nuxt, resolver: }) // Add plugins - addPlugin(resolver.resolve('./runtime/plugins/preview.client')) + addPlugin(resolver.resolve('./runtime/plugins/preview-with-api.client')) // Register preview banner component addComponent({ name: 'ContentPreviewMode', filePath: resolver.resolve('./runtime/components/ContentPreviewMode.vue') }) From 6d633679cb731a606bce46a00d76803d56a8f14b Mon Sep 17 00:00:00 2001 From: Farnabaz Date: Fri, 3 Oct 2025 15:26:34 +0200 Subject: [PATCH 11/12] lint: fix --- src/runtime/plugins/preview-with-api.client.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/src/runtime/plugins/preview-with-api.client.ts b/src/runtime/plugins/preview-with-api.client.ts index 8f91c85ff..ee833ee26 100644 --- a/src/runtime/plugins/preview-with-api.client.ts +++ b/src/runtime/plugins/preview-with-api.client.ts @@ -36,5 +36,4 @@ export default defineNuxtPlugin(async (nuxtApp) => { }) }) } - }) From b7bb80db288dd88c43f50c7dd93ed021fd551d85 Mon Sep 17 00:00:00 2001 From: Farnabaz Date: Tue, 7 Oct 2025 17:29:12 +0200 Subject: [PATCH 12/12] lint: fix --- src/types/schema.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/src/types/schema.ts b/src/types/schema.ts index 3a3f780d5..bea7cb50b 100644 --- a/src/types/schema.ts +++ b/src/types/schema.ts @@ -17,7 +17,6 @@ export interface Draft07DefinitionProperty { type?: string // missing type means any items?: Draft07DefinitionProperty properties?: Record - items?: Draft07DefinitionProperty required?: string[] default?: unknown maxLength?: number