- the module registers seo-sitemap-<locale> at seo.htmlSitemap.paths
(defaults pl /mapa-strony, en /sitemap) and seo-sitemap-group-<locale>
at <path>/:group (plus <path>/:group/<segment>/:page in the path form);
a path an app page already has stays the app's
- SeoHtmlSitemapPage (global, overridable): H1, an H2 per non-empty
group, categories nested, a large group's link to its group page,
sitemap.empty; group pages with a built trail, page suffix and
<SeoPagination>; 404 for an unknown group or a page past the last,
301 for ?page=1, 503 when the sitemap API fails
- GET /api/__seo__/sitemap proxies the sitemap plugin's HTML API (only
while the CMS has the HTML sitemap on for the locale)
- <SeoSitemapLink>: the footer link while the HTML sitemap is on
- L3 default styles
- the module writes #seo-routes (static paths and route patterns) from the
resolved pages; options seo.routeReport, seo.pagination and
seo.htmlSitemap reach the public runtime config
- seo-route-report: POST /registry/routes once per process with the
route-report token, one retry after 60 s on failure, nothing without a
token, with the layer off or with routeReport false
- seo-drift: one "[vue-seo-layer] drift:" warning per mismatch between
the CMS's site answer (URL patterns, pagination, HTML sitemap paths)
and the build
- GET /api/__seo__/site and useSeoSite()
- smoke grammar routereport and log, fixture registry route, drift run
- POST /api/__site__/cache/purge, its library and the site config plugin
moved from vue-journal-layer with the same contract (token rules, 404 for
proxied requests unless allowProxied, deprecated siteCache names); the
route also clears the resolve cache
- server/plugins/seo-cache-purge.ts clears the SEO caches after any 200
purge, so an app whose journal, menu or FAQ layer copy of the route wins
keeps fresh SEO answers until those copies are removed
- cachePurge and siteCache runtime keys; /api/__site__/** never cached
- testing/purge-check.mjs (CMS answer change, plus a redirect added for a
route-cached page applying at once) and purge-token-check.mjs
- Nitro middleware resolves page requests once and hands the answer to the
render (event.context.seo); the route middleware reuses it
- useCmsSeo: html lang, hreflang links, og:locale and exactly one JSON-LD
script with one @graph (CMS nodes plus useSchemaNode nodes, merged by @id)
- local module (configKey seo): cms (alias of public.seo.enabled),
breadcrumbs, links.newTabHint, rootFiles, resolveFiles
- GET /api/__seo__/resolve for client navigation through the Nuxt server
- smoke harness: count=, exact header=, noheader=, reqheader=, repeated
options, resolves/apicalls/noreport lines, --no-site; v0.1.1 suite runs
unchanged against a backend without /site