Skip to content

Commit fa6c267

Browse files
authored
fix(module): work with route rules cache: true (#3617)
1 parent 45ec607 commit fa6c267

File tree

7 files changed

+44
-27
lines changed

7 files changed

+44
-27
lines changed

src/module.ts

Lines changed: 14 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -173,13 +173,17 @@ export default defineNuxtModule<ModuleOptions>({
173173
// Prerender database.sql routes for each collection to fetch dump
174174
nuxt.options.routeRules ||= {}
175175

176-
// @ts-expect-error - Prevent nuxtseo from indexing nuxt-content routes
177-
// @see https://github.com/nuxt/content/pull/3299
178-
nuxt.options.routeRules![`/__nuxt_content/**`] = { robots: false }
176+
nuxt.options.routeRules![`/__nuxt_content/**`] = {
177+
...nuxt.options.routeRules![`/__nuxt_content/**`],
178+
// @ts-expect-error - Prevent nuxtseo from indexing nuxt-content routes
179+
robots: false,
180+
cache: false,
181+
}
179182

180183
manifest.collections.forEach((collection) => {
181184
if (!collection.private) {
182-
nuxt.options.routeRules![`/__nuxt_content/${collection.name}/sql_dump.txt`] = { prerender: true }
185+
const key = `/__nuxt_content/${collection.name}/sql_dump.txt`
186+
nuxt.options.routeRules![key] = { ...nuxt.options.routeRules![key], prerender: true }
183187
}
184188
})
185189

@@ -193,9 +197,11 @@ export default defineNuxtModule<ModuleOptions>({
193197
config.alias['#content/local-adapter'] = await resolveDatabaseAdapter(options._localDatabase!.type || 'sqlite', resolveOptions)
194198

195199
config.handlers ||= []
196-
config.handlers.push({
197-
route: '/__nuxt_content/:collection/query',
198-
handler: resolver.resolve('./runtime/api/query.post'),
200+
manifest.collections.forEach((collection) => {
201+
config.handlers!.push({
202+
route: `/__nuxt_content/${collection.name}/query`,
203+
handler: resolver.resolve('./runtime/api/query.post'),
204+
})
199205
})
200206

201207
// Handle HMR changes
@@ -217,7 +223,7 @@ export default defineNuxtModule<ModuleOptions>({
217223

218224
nuxt.hook('modules:done', async () => {
219225
const preset = findPreset(nuxt)
220-
await preset?.setup?.(options, nuxt)
226+
await preset?.setup?.(options, nuxt, { resolver, manifest })
221227
// Provide default database configuration here since nuxt is merging defaults and user options
222228
options.database ||= { type: 'sqlite', filename: './contents.sqlite' }
223229
await refineDatabaseConfig(options._localDatabase, { rootDir: nuxt.options.rootDir, updateSqliteFileName: true })

src/presets/cloudflare.ts

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,20 @@
1-
import { addTemplate } from '@nuxt/kit'
1+
import { addServerHandler, addTemplate } from '@nuxt/kit'
22
import { join } from 'pathe'
33
import { logger } from '../utils/dev'
44
import { definePreset } from '../utils/preset'
55
import { collectionDumpTemplate } from '../utils/templates'
66

77
export default definePreset({
88
name: 'cloudflare',
9-
async setupNitro(nitroConfig, { manifest, resolver }) {
9+
setup(_options, _nuxt, { resolver, manifest }) {
10+
manifest.collections.map((collection) => {
11+
addServerHandler({
12+
route: `/__nuxt_content/${collection.name}/sql_dump.txt`,
13+
handler: resolver.resolve('./runtime/presets/cloudflare/database-handler'),
14+
})
15+
})
16+
},
17+
async setupNitro(nitroConfig, { manifest }) {
1018
if (nitroConfig.runtimeConfig?.content?.database?.type === 'sqlite') {
1119
logger.warn('Deploying to Cloudflare requires using D1 database, switching to D1 database with binding `DB`.')
1220
nitroConfig.runtimeConfig!.content!.database = { type: 'd1', bindingName: 'DB' }
@@ -25,10 +33,6 @@ export default definePreset({
2533

2634
// Add raw content dump to public assets
2735
nitroConfig.publicAssets.push({ dir: join(nitroConfig.buildDir!, 'content', 'raw'), maxAge: 60 })
28-
nitroConfig.handlers.push({
29-
route: '/__nuxt_content/:collection/sql_dump.txt',
30-
handler: resolver.resolve('./runtime/presets/cloudflare/database-handler'),
31-
})
3236
},
3337

3438
})

src/presets/node.ts

Lines changed: 13 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,25 @@
1-
import { addTemplate } from '@nuxt/kit'
1+
import { addServerHandler, addTemplate } from '@nuxt/kit'
22
import { fullDatabaseCompressedDumpTemplate } from '../utils/templates'
33
import { definePreset } from '../utils/preset'
44

55
export default definePreset({
66
name: 'node',
7-
setupNitro(nitroConfig, { manifest, resolver }) {
7+
setup(_options, _nuxt, { resolver, manifest }) {
8+
// Due to prerender enabling in the module, Nuxt create a route for each collection
9+
// These routes cause issue while enabling cache in Nuxt.
10+
// So we need to add a server handler for each collection to handle the request.
11+
manifest.collections.map((collection) => {
12+
addServerHandler({
13+
route: `/__nuxt_content/${collection.name}/sql_dump.txt`,
14+
handler: resolver.resolve('./runtime/presets/node/database-handler'),
15+
})
16+
})
17+
},
18+
setupNitro(nitroConfig, { manifest }) {
819
nitroConfig.publicAssets ||= []
920
nitroConfig.alias = nitroConfig.alias || {}
1021
nitroConfig.handlers ||= []
1122

1223
nitroConfig.alias['#content/dump'] = addTemplate(fullDatabaseCompressedDumpTemplate(manifest)).dst
13-
nitroConfig.handlers.push({
14-
route: '/__nuxt_content/:collection/sql_dump.txt',
15-
handler: resolver.resolve('./runtime/presets/node/database-handler'),
16-
})
1724
},
1825
})

src/runtime/api/query.post.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ import { useRuntimeConfig } from '#imports'
66

77
export default eventHandler(async (event) => {
88
const { sql } = await readBody(event)
9-
const collection = getRouterParam(event, 'collection')!
9+
const collection = getRouterParam(event, 'collection')! || event.path?.split('/')?.[2] || ''
1010

1111
assertSafeQuery(sql, collection)
1212

src/runtime/presets/cloudflare/database-handler.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ import { eventHandler, getRouterParam, setHeader } from 'h3'
22
import { useStorage } from 'nitropack/runtime'
33

44
export default eventHandler(async (event) => {
5-
const collection = getRouterParam(event, 'collection')!
5+
const collection = getRouterParam(event, 'collection')! || event.path?.split('/')?.[2] || ''
66
setHeader(event, 'Content-Type', 'text/plain')
77

88
const ASSETS = event?.context?.cloudflare?.env.ASSETS || process.env.ASSETS

src/runtime/presets/node/database-handler.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ import { eventHandler, getRouterParam, setHeader } from 'h3'
22
import { useStorage } from 'nitropack/runtime'
33

44
export default eventHandler(async (event) => {
5-
const collection = getRouterParam(event, 'collection')!
5+
const collection = getRouterParam(event, 'collection')! || event.path?.split('/')?.[2] || ''
66
setHeader(event, 'Content-Type', 'text/plain')
77

88
const data = await useStorage().getItem(`build:content:database.compressed.mjs`) || ''

src/utils/preset.ts

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -13,18 +13,18 @@ interface Options {
1313
export interface Preset {
1414
name: string
1515
parent?: Preset
16-
setup?: (options: ModuleOptions, nuxt: Nuxt) => Promise<void> | void
16+
setup?: (options: ModuleOptions, nuxt: Nuxt, opts: { resolver: Resolver, manifest: Manifest }) => Promise<void> | void
1717
setupNitro: (nitroConfig: NitroConfig, opts: Options) => void | Promise<void>
1818
}
1919

2020
export function definePreset(preset: Preset) {
2121
const _preset: Preset = {
2222
...preset,
23-
setup: async (options, nuxt) => {
23+
setup: async (options, nuxt, opts) => {
2424
if (preset.parent) {
25-
await preset.parent.setup?.(options, nuxt)
25+
await preset.parent.setup?.(options, nuxt, opts)
2626
}
27-
await preset.setup?.(options, nuxt)
27+
await preset.setup?.(options, nuxt, opts)
2828
},
2929
setupNitro: async (nitroConfig, opts) => {
3030
if (preset.parent) {

0 commit comments

Comments
 (0)