nuxt-site-config copies every NUXT_SITE_* variable into the public site config, so NUXT_SITE_CACHE_PURGE_TOKEN reached every page's payload as cachePurgeToken (and NUXT_SITE_CACHE_ALLOW_PROXIED as cacheAllowProxied). - The purge settings move to runtimeConfig cachePurge.token (NUXT_CACHE_PURGE_TOKEN) and cachePurge.allowProxied (NUXT_CACHE_PURGE_ALLOW_PROXIED), outside that prefix. - The old siteCache.* names keep working for one release: a non-empty new token wins, either allowProxied flag turns it on, and one deprecation warning per process names the variables (never a value). - The shared Nitro plugin server/plugins/site-cache-purge.ts strips cachePurgeToken and cacheAllowProxied from nuxt-site-config's stack on site-config:init, so a site on the old names leaks nothing either; it does nothing without nuxt-site-config. - The shared lib, route and plugin and tests/sitePurge.test.ts are byte-identical in vue-journal-layer, vue-menu-layer and vue-faq-layer, with three sha256 pins. - README: new names, the deprecation, the stripping and the advice to rotate a token ever set under the old name.
67 lines
2.8 KiB
TypeScript
67 lines
2.8 KiB
TypeScript
// vue-menu-layer: renders a menu of the SummerCMS menu plugin
|
|
// (GET /_menu/api/v1/menus/{code}) as an accessible site navigation. An app
|
|
// consumes it with `extends: ['vue-menu-layer']` and renders <MenuNav>.
|
|
//
|
|
// 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/menu-tokens.css`, `${currentDir}app/assets/css/menu-base.css`],
|
|
|
|
runtimeConfig: {
|
|
menu: {
|
|
// Server-only base for SSR fetches (NUXT_MENU_API_BASE). It never
|
|
// comes from request input.
|
|
apiBase: 'http://127.0.0.1:8096/_menu/api/v1',
|
|
},
|
|
cachePurge: {
|
|
// Server-only bearer token of the shared site cache purge route
|
|
// POST /api/__site__/cache/purge (NUXT_CACHE_PURGE_TOKEN), the
|
|
// backend's site_cache.purge_token. Shorter than 32 characters, the
|
|
// route answers 404. Not under NUXT_SITE_: nuxt-site-config copies
|
|
// every NUXT_SITE_* variable into the site config, which is published
|
|
// in every page's payload.
|
|
token: '',
|
|
// NUXT_CACHE_PURGE_ALLOW_PROXIED: set it to true when the backend
|
|
// reaches the site through a TLS-terminating proxy (an https
|
|
// site_cache.purge_url on another host), which adds X-Forwarded-For,
|
|
// X-Real-IP or Forwarded. The route then accepts proxied requests and
|
|
// the bearer token is the only gate; unset, it answers 404 to any
|
|
// proxied request.
|
|
allowProxied: false,
|
|
},
|
|
// Deprecated (one release): the earlier names of cachePurge.token
|
|
// (NUXT_SITE_CACHE_PURGE_TOKEN) and cachePurge.allowProxied
|
|
// (NUXT_SITE_CACHE_ALLOW_PROXIED), read when the new ones are unset. The
|
|
// layer's server/plugins/site-cache-purge.ts strips them from the site
|
|
// config and logs a deprecation warning.
|
|
siteCache: {
|
|
purgeToken: '',
|
|
allowProxied: false,
|
|
},
|
|
public: {
|
|
menu: {
|
|
// Same-origin base for browser fetches (NUXT_PUBLIC_MENU_API_BASE).
|
|
apiBase: '/_menu/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 },
|
|
},
|
|
})
|