- server/lib/siteCachePurge.ts: authorizeSitePurge, purgeSiteRouteCache,
parseSitePurgeEvent (kinds: lower-case letters and underscores)
- the route reads runtimeConfig.siteCache.purgeToken
(NUXT_SITE_CACHE_PURGE_TOKEN), 404 when off or proxied, 401 unauthorized
- route rule '/api/__site__/**': { cache: false }
- sitePurge specs with sha256 pins of the two shared files
- version 0.2.0
49 lines
1.8 KiB
TypeScript
49 lines
1.8 KiB
TypeScript
// vue-faq-layer: renders a FAQ of the SummerCMS FAQ plugin
|
|
// (GET /_faq/api/v1/faqs/{slug}) as native <details> items. An app consumes
|
|
// it with `extends: ['vue-faq-layer']` and renders <FaqBlock>.
|
|
//
|
|
// Every path below is absolute and built from this file's directory: a
|
|
// relative or ~ path in a layer config resolves against the consuming
|
|
// project, not the layer. The layer declares no Nuxt modules.
|
|
import { fileURLToPath } from 'node:url'
|
|
|
|
const currentDir = fileURLToPath(new URL('.', import.meta.url))
|
|
|
|
export default defineNuxtConfig({
|
|
compatibilityDate: '2025-07-15',
|
|
devtools: { enabled: false },
|
|
|
|
// Tokens first, then the neutral styles that use them. The app's own css
|
|
// array loads after these, so its token overrides win.
|
|
css: [`${currentDir}app/assets/css/faq-tokens.css`, `${currentDir}app/assets/css/faq-base.css`],
|
|
|
|
runtimeConfig: {
|
|
faq: {
|
|
// Server-only base for SSR fetches (NUXT_FAQ_API_BASE). It never comes
|
|
// from request input.
|
|
apiBase: 'http://127.0.0.1:8096/_faq/api/v1',
|
|
},
|
|
siteCache: {
|
|
// Server-only bearer token of the shared site cache purge route
|
|
// POST /api/__site__/cache/purge (NUXT_SITE_CACHE_PURGE_TOKEN), the
|
|
// backend's site_cache.purge_token. Shorter than 32 characters, the
|
|
// route answers 404.
|
|
purgeToken: '',
|
|
},
|
|
public: {
|
|
faq: {
|
|
// Same-origin base for browser fetches (NUXT_PUBLIC_FAQ_API_BASE).
|
|
apiBase: '/_faq/api/v1',
|
|
},
|
|
},
|
|
},
|
|
|
|
// The shared site routes are never route-cached. Nitro wraps every
|
|
// handler matching an app rule such as '/**': { swr } in its cached
|
|
// handler, which keys by path, does not skip POST and hides request
|
|
// headers, so the purge route would answer from the cache without running.
|
|
routeRules: {
|
|
'/api/__site__/**': { cache: false },
|
|
},
|
|
})
|