@nuxtjs/sitemap 5.3.5 → 6.0.0-beta.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (37) hide show
  1. package/dist/client/200.html +5 -6
  2. package/dist/client/404.html +5 -6
  3. package/dist/client/_nuxt/CY7GV1Ne.js +31 -0
  4. package/dist/client/_nuxt/{AGFfX61t.js → D-VsDbcJ.js} +1 -1
  5. package/dist/client/_nuxt/builds/latest.json +1 -1
  6. package/dist/client/_nuxt/builds/meta/8204446e-0708-4f8e-bc4a-e52330d54aba.json +1 -0
  7. package/dist/client/_nuxt/{DQoqAi02.js → dsisXUEW.js} +1 -1
  8. package/dist/client/index.html +5 -6
  9. package/dist/module.json +1 -1
  10. package/dist/module.mjs +58 -19
  11. package/dist/runtime/nitro/composables/getPathRobotConfigPolyfill.d.ts +2 -1
  12. package/dist/runtime/nitro/composables/getPathRobotConfigPolyfill.js +1 -1
  13. package/dist/runtime/nitro/routes/__sitemap__/debug.d.ts +1 -0
  14. package/dist/runtime/nitro/{middleware/[sitemap]-sitemap.xml.d.ts → routes/sitemap/[sitemap].xml.d.ts} +1 -1
  15. package/dist/runtime/nitro/routes/sitemap/[sitemap].xml.js +20 -0
  16. package/dist/runtime/nitro/routes/sitemap.xsl.js +2 -1
  17. package/dist/runtime/nitro/routes/sitemap_index.xml.js +19 -16
  18. package/dist/runtime/nitro/sitemap/builder/sitemap-index.d.ts +3 -2
  19. package/dist/runtime/nitro/sitemap/builder/sitemap-index.js +13 -27
  20. package/dist/runtime/nitro/sitemap/builder/sitemap.d.ts +9 -2
  21. package/dist/runtime/nitro/sitemap/builder/sitemap.js +153 -53
  22. package/dist/runtime/nitro/sitemap/nitro.d.ts +1 -1
  23. package/dist/runtime/nitro/sitemap/nitro.js +46 -11
  24. package/dist/runtime/nitro/sitemap/urlset/normalise.d.ts +3 -2
  25. package/dist/runtime/nitro/sitemap/urlset/normalise.js +64 -53
  26. package/dist/runtime/types.d.ts +26 -2
  27. package/dist/runtime/utils-pure.d.ts +2 -1
  28. package/dist/runtime/utils-pure.js +6 -0
  29. package/package.json +4 -6
  30. package/dist/client/_nuxt/BG-qYwi8.js +0 -6
  31. package/dist/client/_nuxt/D0mw_hZ2.js +0 -31
  32. package/dist/client/_nuxt/builds/meta/ab2ad6a2-f67d-4194-8e33-d46fbc5d1290.json +0 -1
  33. package/dist/runtime/nitro/middleware/[sitemap]-sitemap.xml.js +0 -23
  34. package/dist/runtime/nitro/sitemap/urlset/filter.d.ts +0 -5
  35. package/dist/runtime/nitro/sitemap/urlset/filter.js +0 -24
  36. package/dist/runtime/nitro/sitemap/urlset/i18n.d.ts +0 -6
  37. package/dist/runtime/nitro/sitemap/urlset/i18n.js +0 -142
@@ -1 +1 @@
1
- import{_ as a,u as o,o as s,c as i,a as e,t as r,p as u,f as c}from"./D0mw_hZ2.js";const l=t=>(u("data-v-cc10251c"),t=t(),c(),t),d={class:"font-sans antialiased bg-white dark:bg-black text-black dark:text-white grid min-h-screen place-content-center overflow-hidden"},p=l(()=>e("div",{class:"fixed -bottom-1/2 left-0 right-0 h-1/2 spotlight"},null,-1)),h={class:"max-w-520px text-center"},g=["textContent"],b=["textContent"],f={__name:"error-500",props:{appName:{type:String,default:"Nuxt"},version:{type:String,default:""},statusCode:{type:Number,default:500},statusMessage:{type:String,default:"Server error"},description:{type:String,default:"This page is temporarily unavailable."}},setup(t){const n=t;return o({title:`${n.statusCode} - ${n.statusMessage} | ${n.appName}`,script:[],style:[{children:'*,:before,:after{box-sizing:border-box;border-width:0;border-style:solid;border-color:var(--un-default-border-color, #e5e7eb)}:before,:after{--un-content:""}html{line-height:1.5;-webkit-text-size-adjust:100%;-moz-tab-size:4;tab-size:4;font-family:ui-sans-serif,system-ui,sans-serif,"Apple Color Emoji","Segoe UI Emoji",Segoe UI Symbol,"Noto Color Emoji";font-feature-settings:normal;font-variation-settings:normal;-webkit-tap-highlight-color:transparent}body{margin:0;line-height:inherit}h1{font-size:inherit;font-weight:inherit}h1,p{margin:0}*,:before,:after{--un-rotate:0;--un-rotate-x:0;--un-rotate-y:0;--un-rotate-z:0;--un-scale-x:1;--un-scale-y:1;--un-scale-z:1;--un-skew-x:0;--un-skew-y:0;--un-translate-x:0;--un-translate-y:0;--un-translate-z:0;--un-pan-x: ;--un-pan-y: ;--un-pinch-zoom: ;--un-scroll-snap-strictness:proximity;--un-ordinal: ;--un-slashed-zero: ;--un-numeric-figure: ;--un-numeric-spacing: ;--un-numeric-fraction: ;--un-border-spacing-x:0;--un-border-spacing-y:0;--un-ring-offset-shadow:0 0 rgb(0 0 0 / 0);--un-ring-shadow:0 0 rgb(0 0 0 / 0);--un-shadow-inset: ;--un-shadow:0 0 rgb(0 0 0 / 0);--un-ring-inset: ;--un-ring-offset-width:0px;--un-ring-offset-color:#fff;--un-ring-width:0px;--un-ring-color:rgb(147 197 253 / .5);--un-blur: ;--un-brightness: ;--un-contrast: ;--un-drop-shadow: ;--un-grayscale: ;--un-hue-rotate: ;--un-invert: ;--un-saturate: ;--un-sepia: ;--un-backdrop-blur: ;--un-backdrop-brightness: ;--un-backdrop-contrast: ;--un-backdrop-grayscale: ;--un-backdrop-hue-rotate: ;--un-backdrop-invert: ;--un-backdrop-opacity: ;--un-backdrop-saturate: ;--un-backdrop-sepia: }'}]}),(m,x)=>(s(),i("div",d,[p,e("div",h,[e("h1",{class:"text-8xl sm:text-10xl font-medium mb-8",textContent:r(t.statusCode)},null,8,g),e("p",{class:"text-xl px-8 sm:px-0 sm:text-4xl font-light mb-16 leading-tight",textContent:r(t.description)},null,8,b)])]))}},k=a(f,[["__scopeId","data-v-cc10251c"]]);export{k as default};
1
+ import{_ as a,u as o,o as s,c as i,a as e,t as r,p as u,f as c}from"./CY7GV1Ne.js";const l=t=>(u("data-v-cc10251c"),t=t(),c(),t),d={class:"font-sans antialiased bg-white dark:bg-black text-black dark:text-white grid min-h-screen place-content-center overflow-hidden"},p=l(()=>e("div",{class:"fixed -bottom-1/2 left-0 right-0 h-1/2 spotlight"},null,-1)),h={class:"max-w-520px text-center"},g=["textContent"],b=["textContent"],f={__name:"error-500",props:{appName:{type:String,default:"Nuxt"},version:{type:String,default:""},statusCode:{type:Number,default:500},statusMessage:{type:String,default:"Server error"},description:{type:String,default:"This page is temporarily unavailable."}},setup(t){const n=t;return o({title:`${n.statusCode} - ${n.statusMessage} | ${n.appName}`,script:[],style:[{children:'*,:before,:after{box-sizing:border-box;border-width:0;border-style:solid;border-color:var(--un-default-border-color, #e5e7eb)}:before,:after{--un-content:""}html{line-height:1.5;-webkit-text-size-adjust:100%;-moz-tab-size:4;tab-size:4;font-family:ui-sans-serif,system-ui,sans-serif,"Apple Color Emoji","Segoe UI Emoji",Segoe UI Symbol,"Noto Color Emoji";font-feature-settings:normal;font-variation-settings:normal;-webkit-tap-highlight-color:transparent}body{margin:0;line-height:inherit}h1{font-size:inherit;font-weight:inherit}h1,p{margin:0}*,:before,:after{--un-rotate:0;--un-rotate-x:0;--un-rotate-y:0;--un-rotate-z:0;--un-scale-x:1;--un-scale-y:1;--un-scale-z:1;--un-skew-x:0;--un-skew-y:0;--un-translate-x:0;--un-translate-y:0;--un-translate-z:0;--un-pan-x: ;--un-pan-y: ;--un-pinch-zoom: ;--un-scroll-snap-strictness:proximity;--un-ordinal: ;--un-slashed-zero: ;--un-numeric-figure: ;--un-numeric-spacing: ;--un-numeric-fraction: ;--un-border-spacing-x:0;--un-border-spacing-y:0;--un-ring-offset-shadow:0 0 rgb(0 0 0 / 0);--un-ring-shadow:0 0 rgb(0 0 0 / 0);--un-shadow-inset: ;--un-shadow:0 0 rgb(0 0 0 / 0);--un-ring-inset: ;--un-ring-offset-width:0px;--un-ring-offset-color:#fff;--un-ring-width:0px;--un-ring-color:rgb(147 197 253 / .5);--un-blur: ;--un-brightness: ;--un-contrast: ;--un-drop-shadow: ;--un-grayscale: ;--un-hue-rotate: ;--un-invert: ;--un-saturate: ;--un-sepia: ;--un-backdrop-blur: ;--un-backdrop-brightness: ;--un-backdrop-contrast: ;--un-backdrop-grayscale: ;--un-backdrop-hue-rotate: ;--un-backdrop-invert: ;--un-backdrop-opacity: ;--un-backdrop-saturate: ;--un-backdrop-sepia: }'}]}),(m,x)=>(s(),i("div",d,[p,e("div",h,[e("h1",{class:"text-8xl sm:text-10xl font-medium mb-8",textContent:r(t.statusCode)},null,8,g),e("p",{class:"text-xl px-8 sm:px-0 sm:text-4xl font-light mb-16 leading-tight",textContent:r(t.description)},null,8,b)])]))}},k=a(f,[["__scopeId","data-v-cc10251c"]]);export{k as default};
@@ -1 +1 @@
1
- {"id":"ab2ad6a2-f67d-4194-8e33-d46fbc5d1290","timestamp":1721143510557}
1
+ {"id":"8204446e-0708-4f8e-bc4a-e52330d54aba","timestamp":1721966466492}
@@ -0,0 +1 @@
1
+ {"id":"8204446e-0708-4f8e-bc4a-e52330d54aba","timestamp":1721966466492,"matcher":{"static":{},"wildcard":{},"dynamic":{}},"prerendered":[]}
@@ -1 +1 @@
1
- import{_ as r,u as s,o as i,c as u,a as e,t as o,b as c,w as d,d as l,e as p,p as h,f}from"./D0mw_hZ2.js";const g=t=>(h("data-v-a73478d9"),t=t(),f(),t),b={class:"font-sans antialiased bg-white dark:bg-black text-black dark:text-white grid min-h-screen place-content-center overflow-hidden"},x=g(()=>e("div",{class:"fixed left-0 right-0 spotlight z-10"},null,-1)),m={class:"max-w-520px text-center z-20"},y=["textContent"],_=["textContent"],k={class:"w-full flex items-center justify-center"},w={__name:"error-404",props:{appName:{type:String,default:"Nuxt"},version:{type:String,default:""},statusCode:{type:Number,default:404},statusMessage:{type:String,default:"Not Found"},description:{type:String,default:"Sorry, the page you are looking for could not be found."},backHome:{type:String,default:"Go back home"}},setup(t){const n=t;return s({title:`${n.statusCode} - ${n.statusMessage} | ${n.appName}`,script:[],style:[{children:'*,:before,:after{box-sizing:border-box;border-width:0;border-style:solid;border-color:var(--un-default-border-color, #e5e7eb)}:before,:after{--un-content:""}html{line-height:1.5;-webkit-text-size-adjust:100%;-moz-tab-size:4;tab-size:4;font-family:ui-sans-serif,system-ui,sans-serif,"Apple Color Emoji","Segoe UI Emoji",Segoe UI Symbol,"Noto Color Emoji";font-feature-settings:normal;font-variation-settings:normal;-webkit-tap-highlight-color:transparent}body{margin:0;line-height:inherit}h1{font-size:inherit;font-weight:inherit}a{color:inherit;text-decoration:inherit}h1,p{margin:0}*,:before,:after{--un-rotate:0;--un-rotate-x:0;--un-rotate-y:0;--un-rotate-z:0;--un-scale-x:1;--un-scale-y:1;--un-scale-z:1;--un-skew-x:0;--un-skew-y:0;--un-translate-x:0;--un-translate-y:0;--un-translate-z:0;--un-pan-x: ;--un-pan-y: ;--un-pinch-zoom: ;--un-scroll-snap-strictness:proximity;--un-ordinal: ;--un-slashed-zero: ;--un-numeric-figure: ;--un-numeric-spacing: ;--un-numeric-fraction: ;--un-border-spacing-x:0;--un-border-spacing-y:0;--un-ring-offset-shadow:0 0 rgb(0 0 0 / 0);--un-ring-shadow:0 0 rgb(0 0 0 / 0);--un-shadow-inset: ;--un-shadow:0 0 rgb(0 0 0 / 0);--un-ring-inset: ;--un-ring-offset-width:0px;--un-ring-offset-color:#fff;--un-ring-width:0px;--un-ring-color:rgb(147 197 253 / .5);--un-blur: ;--un-brightness: ;--un-contrast: ;--un-drop-shadow: ;--un-grayscale: ;--un-hue-rotate: ;--un-invert: ;--un-saturate: ;--un-sepia: ;--un-backdrop-blur: ;--un-backdrop-brightness: ;--un-backdrop-contrast: ;--un-backdrop-grayscale: ;--un-backdrop-hue-rotate: ;--un-backdrop-invert: ;--un-backdrop-opacity: ;--un-backdrop-saturate: ;--un-backdrop-sepia: }'}]}),(z,S)=>{const a=p;return i(),u("div",b,[x,e("div",m,[e("h1",{class:"text-8xl sm:text-10xl font-medium mb-8",textContent:o(t.statusCode)},null,8,y),e("p",{class:"text-xl px-8 sm:px-0 sm:text-4xl font-light mb-16 leading-tight",textContent:o(t.description)},null,8,_),e("div",k,[c(a,{to:"/",class:"gradient-border text-md sm:text-xl py-2 px-4 sm:py-3 sm:px-6 cursor-pointer"},{default:d(()=>[l(o(t.backHome),1)]),_:1})])])])}}},C=r(w,[["__scopeId","data-v-a73478d9"]]);export{C as default};
1
+ import{_ as r,u as s,o as i,c as u,a as e,t as o,b as c,w as d,d as l,e as p,p as h,f}from"./CY7GV1Ne.js";const g=t=>(h("data-v-a73478d9"),t=t(),f(),t),b={class:"font-sans antialiased bg-white dark:bg-black text-black dark:text-white grid min-h-screen place-content-center overflow-hidden"},x=g(()=>e("div",{class:"fixed left-0 right-0 spotlight z-10"},null,-1)),m={class:"max-w-520px text-center z-20"},y=["textContent"],_=["textContent"],k={class:"w-full flex items-center justify-center"},w={__name:"error-404",props:{appName:{type:String,default:"Nuxt"},version:{type:String,default:""},statusCode:{type:Number,default:404},statusMessage:{type:String,default:"Not Found"},description:{type:String,default:"Sorry, the page you are looking for could not be found."},backHome:{type:String,default:"Go back home"}},setup(t){const n=t;return s({title:`${n.statusCode} - ${n.statusMessage} | ${n.appName}`,script:[],style:[{children:'*,:before,:after{box-sizing:border-box;border-width:0;border-style:solid;border-color:var(--un-default-border-color, #e5e7eb)}:before,:after{--un-content:""}html{line-height:1.5;-webkit-text-size-adjust:100%;-moz-tab-size:4;tab-size:4;font-family:ui-sans-serif,system-ui,sans-serif,"Apple Color Emoji","Segoe UI Emoji",Segoe UI Symbol,"Noto Color Emoji";font-feature-settings:normal;font-variation-settings:normal;-webkit-tap-highlight-color:transparent}body{margin:0;line-height:inherit}h1{font-size:inherit;font-weight:inherit}a{color:inherit;text-decoration:inherit}h1,p{margin:0}*,:before,:after{--un-rotate:0;--un-rotate-x:0;--un-rotate-y:0;--un-rotate-z:0;--un-scale-x:1;--un-scale-y:1;--un-scale-z:1;--un-skew-x:0;--un-skew-y:0;--un-translate-x:0;--un-translate-y:0;--un-translate-z:0;--un-pan-x: ;--un-pan-y: ;--un-pinch-zoom: ;--un-scroll-snap-strictness:proximity;--un-ordinal: ;--un-slashed-zero: ;--un-numeric-figure: ;--un-numeric-spacing: ;--un-numeric-fraction: ;--un-border-spacing-x:0;--un-border-spacing-y:0;--un-ring-offset-shadow:0 0 rgb(0 0 0 / 0);--un-ring-shadow:0 0 rgb(0 0 0 / 0);--un-shadow-inset: ;--un-shadow:0 0 rgb(0 0 0 / 0);--un-ring-inset: ;--un-ring-offset-width:0px;--un-ring-offset-color:#fff;--un-ring-width:0px;--un-ring-color:rgb(147 197 253 / .5);--un-blur: ;--un-brightness: ;--un-contrast: ;--un-drop-shadow: ;--un-grayscale: ;--un-hue-rotate: ;--un-invert: ;--un-saturate: ;--un-sepia: ;--un-backdrop-blur: ;--un-backdrop-brightness: ;--un-backdrop-contrast: ;--un-backdrop-grayscale: ;--un-backdrop-hue-rotate: ;--un-backdrop-invert: ;--un-backdrop-opacity: ;--un-backdrop-saturate: ;--un-backdrop-sepia: }'}]}),(z,S)=>{const a=p;return i(),u("div",b,[x,e("div",m,[e("h1",{class:"text-8xl sm:text-10xl font-medium mb-8",textContent:o(t.statusCode)},null,8,y),e("p",{class:"text-xl px-8 sm:px-0 sm:text-4xl font-light mb-16 leading-tight",textContent:o(t.description)},null,8,_),e("div",k,[c(a,{to:"/",class:"gradient-border text-md sm:text-xl py-2 px-4 sm:py-3 sm:px-6 cursor-pointer"},{default:d(()=>[l(o(t.backHome),1)]),_:1})])])])}}},C=r(w,[["__scopeId","data-v-a73478d9"]]);export{C as default};
@@ -1,8 +1,7 @@
1
1
  <!DOCTYPE html><html data-capo=""><head><meta charset="utf-8">
2
2
  <meta name="viewport" content="width=device-width, initial-scale=1">
3
3
  <link rel="stylesheet" href="/__sitemap__/devtools/_nuxt/entry.CfxF9LiM.css">
4
- <link rel="modulepreload" as="script" crossorigin href="/__sitemap__/devtools/_nuxt/D0mw_hZ2.js">
5
- <link rel="prefetch" as="script" crossorigin href="/__sitemap__/devtools/_nuxt/BG-qYwi8.js">
4
+ <link rel="modulepreload" as="script" crossorigin href="/__sitemap__/devtools/_nuxt/CY7GV1Ne.js">
6
5
  <link rel="prefetch" as="script" crossorigin href="/__sitemap__/devtools/_nuxt/DXFkqnOI.js">
7
6
  <link rel="prefetch" as="script" crossorigin href="/__sitemap__/devtools/_nuxt/BigF1UXR.js">
8
7
  <link rel="prefetch" as="script" crossorigin href="/__sitemap__/devtools/_nuxt/CowR2XfX.js">
@@ -259,8 +258,8 @@
259
258
  <link rel="prefetch" as="script" crossorigin href="/__sitemap__/devtools/_nuxt/Bxkoe-BC.js">
260
259
  <link rel="prefetch" as="script" crossorigin href="/__sitemap__/devtools/_nuxt/Br6ll-O0.js">
261
260
  <link rel="prefetch" as="style" href="/__sitemap__/devtools/_nuxt/error-404.D56ZPmHb.css">
262
- <link rel="prefetch" as="script" crossorigin href="/__sitemap__/devtools/_nuxt/DQoqAi02.js">
261
+ <link rel="prefetch" as="script" crossorigin href="/__sitemap__/devtools/_nuxt/dsisXUEW.js">
263
262
  <link rel="prefetch" as="style" href="/__sitemap__/devtools/_nuxt/error-500.BYEp4uQX.css">
264
- <link rel="prefetch" as="script" crossorigin href="/__sitemap__/devtools/_nuxt/AGFfX61t.js">
265
- <script type="module" src="/__sitemap__/devtools/_nuxt/D0mw_hZ2.js" crossorigin></script></head><body><div id="__nuxt"></div><div id="teleports"></div><script type="application/json" id="__NUXT_DATA__" data-ssr="false">[{"serverRendered":1},false]</script>
266
- <script>window.__NUXT__={};window.__NUXT__.config={public:{},app:{baseURL:"/__sitemap__/devtools",buildId:"ab2ad6a2-f67d-4194-8e33-d46fbc5d1290",buildAssetsDir:"/_nuxt/",cdnURL:""}}</script></body></html>
263
+ <link rel="prefetch" as="script" crossorigin href="/__sitemap__/devtools/_nuxt/D-VsDbcJ.js">
264
+ <script type="module" src="/__sitemap__/devtools/_nuxt/CY7GV1Ne.js" crossorigin></script></head><body><div id="__nuxt"></div><div id="teleports"></div><script type="application/json" id="__NUXT_DATA__" data-ssr="false">[{"serverRendered":1},false]</script>
265
+ <script>window.__NUXT__={};window.__NUXT__.config={public:{},app:{baseURL:"/__sitemap__/devtools",buildId:"8204446e-0708-4f8e-bc4a-e52330d54aba",buildAssetsDir:"/_nuxt/",cdnURL:""}}</script></body></html>
package/dist/module.json CHANGED
@@ -5,7 +5,7 @@
5
5
  "bridge": false
6
6
  },
7
7
  "configKey": "sitemap",
8
- "version": "5.3.4",
8
+ "version": "5.3.5",
9
9
  "builder": {
10
10
  "@nuxt/module-builder": "0.8.1",
11
11
  "unbuild": "2.0.0"
package/dist/module.mjs CHANGED
@@ -1,5 +1,5 @@
1
1
  import { useNuxt, loadNuxtModuleInstance, createResolver, addTemplate, extendPages, defineNuxtModule, useLogger, hasNuxtModule, getNuxtModuleVersion, hasNuxtModuleCompatibility, addServerImports, addServerPlugin, addServerHandler, findPath, addPrerenderRoutes } from '@nuxt/kit';
2
- import { withHttps, withBase, parseURL, joinURL, withoutLeadingSlash } from 'ufo';
2
+ import { withHttps, withBase, parseURL, joinURL, withoutLeadingSlash, withoutTrailingSlash, withLeadingSlash } from 'ufo';
3
3
  import { assertSiteConfig, installNuxtSiteConfig } from 'nuxt-site-config-kit';
4
4
  import { defu } from 'defu';
5
5
  import { readPackageJSON } from 'pkg-types';
@@ -237,7 +237,7 @@ function resolveNitroPreset(nitroConfig) {
237
237
  if (nitroConfig && nitroConfig?.preset)
238
238
  preset = nitroConfig.preset;
239
239
  if (!preset)
240
- preset = env.NITRO_PRESET || detectTarget() || "node-server";
240
+ preset = env.NITRO_PRESET || env.SERVER_PRESET || detectTarget() || "node-server";
241
241
  return preset.replace("_", "-");
242
242
  }
243
243
 
@@ -354,9 +354,14 @@ function isNuxtGenerate(nuxt = useNuxt()) {
354
354
  "github-pages"
355
355
  ].includes(resolveNitroPreset());
356
356
  }
357
- function setupPrerenderHandler(options, nuxt = useNuxt()) {
357
+ function setupPrerenderHandler(_options, nuxt = useNuxt()) {
358
+ const { runtimeConfig: options, logger } = _options;
358
359
  const prerenderedRoutes = nuxt.options.nitro.prerender?.routes || [];
359
- const prerenderSitemap = isNuxtGenerate() || includesSitemapRoot(options.sitemapName, prerenderedRoutes);
360
+ let prerenderSitemap = isNuxtGenerate() || includesSitemapRoot(options.sitemapName, prerenderedRoutes);
361
+ if (resolveNitroPreset() === "vercel-edge") {
362
+ logger.warn("Runtime sitemaps are not supported on Vercel Edge, falling back to prerendering sitemaps.");
363
+ prerenderSitemap = true;
364
+ }
360
365
  if (nuxt.options.nitro.prerender?.routes)
361
366
  nuxt.options.nitro.prerender.routes = nuxt.options.nitro.prerender.routes.filter((r) => r && !includesSitemapRoot(options.sitemapName, [r]));
362
367
  nuxt.hooks.hook("nitro:init", async (nitro) => {
@@ -548,6 +553,7 @@ const module = defineNuxtModule({
548
553
  dynamicUrlsApiEndpoint: "/api/_sitemap-urls",
549
554
  urls: [],
550
555
  sortEntries: true,
556
+ sitemapsPathPrefix: "/__sitemap__/",
551
557
  xsl: "/__sitemap__/style.xsl",
552
558
  xslTips: true,
553
559
  strictNuxtContentPaths: false,
@@ -624,13 +630,14 @@ const module = defineNuxtModule({
624
630
  let resolvedAutoI18n = typeof config.autoI18n === "boolean" ? false : config.autoI18n || false;
625
631
  const hasDisabledAutoI18n = typeof config.autoI18n === "boolean" && !config.autoI18n;
626
632
  let normalisedLocales = [];
633
+ let usingI18nPages = false;
627
634
  if (hasNuxtModule("@nuxtjs/i18n")) {
628
635
  const i18nVersion = await getNuxtModuleVersion("@nuxtjs/i18n");
629
636
  if (!await hasNuxtModuleCompatibility("@nuxtjs/i18n", ">=8"))
630
637
  logger.warn(`You are using @nuxtjs/i18n v${i18nVersion}. For the best compatibility, please upgrade to @nuxtjs/i18n v8.0.0 or higher.`);
631
638
  nuxtI18nConfig = await getNuxtModuleOptions("@nuxtjs/i18n") || {};
632
639
  normalisedLocales = mergeOnKey((nuxtI18nConfig.locales || []).map((locale) => typeof locale === "string" ? { code: locale } : locale), "code");
633
- const usingI18nPages = Object.keys(nuxtI18nConfig.pages || {}).length;
640
+ usingI18nPages = !!Object.keys(nuxtI18nConfig.pages || {}).length;
634
641
  if (usingI18nPages && !hasDisabledAutoI18n) {
635
642
  const i18nPagesSources = {
636
643
  context: {
@@ -773,8 +780,10 @@ declare module 'vue-router' {
773
780
  nuxt.options.nitro.routeRules["/sitemap.xml"] = { redirect: "/sitemap_index.xml" };
774
781
  nuxt.options.nitro.routeRules["/sitemap_index.xml"] = routeRules;
775
782
  if (typeof config.sitemaps === "object") {
776
- for (const k in config.sitemaps)
777
- nuxt.options.nitro.routeRules[`/${k}-sitemap.xml`] = routeRules;
783
+ for (const k in config.sitemaps) {
784
+ nuxt.options.nitro.routeRules[joinURL(config.sitemapsPathPrefix, `/${k}.xml`)] = routeRules;
785
+ nuxt.options.nitro.routeRules[`/${k}-sitemap.xml`] = { redirect: joinURL(config.sitemapsPathPrefix, `${k}.xml`) };
786
+ }
778
787
  } else {
779
788
  nuxt.options.nitro.routeRules[`/${config.sitemapName}`] = routeRules;
780
789
  }
@@ -831,7 +840,15 @@ declare module 'vue-router' {
831
840
  if (usingMultiSitemaps) {
832
841
  addServerHandler({
833
842
  route: "/sitemap_index.xml",
834
- handler: resolve("./runtime/nitro/routes/sitemap_index.xml")
843
+ handler: resolve("./runtime/nitro/routes/sitemap_index.xml"),
844
+ lazy: true,
845
+ middleware: false
846
+ });
847
+ addServerHandler({
848
+ route: joinURL(config.sitemapsPathPrefix, `/**:sitemap`),
849
+ handler: resolve("./runtime/nitro/routes/sitemap/[sitemap].xml"),
850
+ lazy: true,
851
+ middleware: false
835
852
  });
836
853
  sitemaps.index = {
837
854
  sitemapName: "index",
@@ -843,15 +860,11 @@ declare module 'vue-router' {
843
860
  for (const sitemapName in config.sitemaps) {
844
861
  if (sitemapName === "index")
845
862
  continue;
846
- addServerHandler({
847
- route: `/${sitemapName}-sitemap.xml`,
848
- handler: resolve("./runtime/nitro/middleware/[sitemap]-sitemap.xml")
849
- });
850
863
  const definition = config.sitemaps[sitemapName];
851
864
  sitemaps[sitemapName] = defu(
852
865
  {
853
866
  sitemapName,
854
- _route: withBase(`${sitemapName}-sitemap.xml`, nuxt.options.app.baseURL || "/"),
867
+ _route: withBase(`sitemap/${sitemapName}.xml`, nuxt.options.app.baseURL || "/"),
855
868
  _hasSourceChunk: typeof definition.urls !== "undefined" || definition.sources?.length || !!definition.dynamicUrlsApiEndpoint
856
869
  },
857
870
  { ...definition, urls: void 0, sources: void 0 },
@@ -859,9 +872,6 @@ declare module 'vue-router' {
859
872
  );
860
873
  }
861
874
  } else {
862
- addServerHandler({
863
- handler: resolve("./runtime/nitro/middleware/[sitemap]-sitemap.xml")
864
- });
865
875
  sitemaps.chunks = {
866
876
  sitemapName: "chunks",
867
877
  defaults: config.defaults,
@@ -881,6 +891,31 @@ declare module 'vue-router' {
881
891
  includeAppSources: true
882
892
  };
883
893
  }
894
+ if (resolvedAutoI18n && usingI18nPages && !hasDisabledAutoI18n) {
895
+ const pages = nuxtI18nConfig?.pages || {};
896
+ for (const sitemapName in sitemaps) {
897
+ let mapToI18nPages = function(path) {
898
+ if (typeof path !== "string")
899
+ return [path];
900
+ const withoutSlashes = withoutTrailingSlash(withoutLeadingSlash(path)).replace("/index", "");
901
+ if (withoutSlashes in pages) {
902
+ const pageLocales = pages[withoutSlashes];
903
+ return Object.keys(pageLocales).map((localeCode) => withLeadingSlash(generatePathForI18nPages({ localeCode, pageLocales: pageLocales[localeCode], nuxtI18nConfig, normalisedLocales })));
904
+ }
905
+ let match = [path];
906
+ Object.values(pages).forEach((pageLocales) => {
907
+ if (nuxtI18nConfig.defaultLocale in pageLocales && pageLocales[nuxtI18nConfig.defaultLocale] === path)
908
+ match = Object.keys(pageLocales).map((localeCode) => withLeadingSlash(generatePathForI18nPages({ localeCode, pageLocales: pageLocales[localeCode], nuxtI18nConfig, normalisedLocales })));
909
+ });
910
+ return match;
911
+ };
912
+ if (["index", "chunks"].includes(sitemapName))
913
+ continue;
914
+ const sitemap = sitemaps[sitemapName];
915
+ sitemap.include = (sitemap.include || []).flatMap((path) => mapToI18nPages(path));
916
+ sitemap.exclude = (sitemap.exclude || []).flatMap((path) => mapToI18nPages(path));
917
+ }
918
+ }
884
919
  if (resolvedAutoI18n && resolvedAutoI18n.locales && resolvedAutoI18n.strategy !== "no_prefix") {
885
920
  const i18n = resolvedAutoI18n;
886
921
  for (const sitemapName in sitemaps) {
@@ -909,6 +944,7 @@ declare module 'vue-router' {
909
944
  // needed for nuxt/content integration and prerendering
910
945
  discoverImages: config.discoverImages,
911
946
  discoverVideos: config.discoverVideos,
947
+ sitemapsPathPrefix: config.sitemapsPathPrefix,
912
948
  /* @nuxt/content */
913
949
  isNuxtContentDocumentDriven,
914
950
  /* xsl styling */
@@ -951,8 +987,11 @@ declare module 'vue-router' {
951
987
  const prerenderUrlsFinal = [
952
988
  ...prerenderUrls,
953
989
  ...((await nitroPromise)._prerenderedRoutes || []).filter((r) => {
954
- const isExplicitFile = r.route.split("/").pop().includes(".");
955
- return r.contentType?.includes("text/html") && !isExplicitFile;
990
+ const lastSegment = r.route.split("/").pop();
991
+ const isExplicitFile = !!lastSegment?.match(/\.[0-9a-z]+$/i)?.[0];
992
+ if (r.error || ["/200.html", "/404.html", "/index.html"].includes(r.route))
993
+ return false;
994
+ return r.contentType?.includes("text/html") || !isExplicitFile;
956
995
  }).map((r) => r._sitemap)
957
996
  ];
958
997
  const pageSource = convertNuxtPagesToSitemapEntries(await pagesPromise, {
@@ -1084,7 +1123,7 @@ declare module 'vue-router' {
1084
1123
  route: `/${config.sitemapName}`,
1085
1124
  handler: resolve("./runtime/nitro/routes/sitemap.xml")
1086
1125
  });
1087
- setupPrerenderHandler(runtimeConfig);
1126
+ setupPrerenderHandler({ runtimeConfig, logger });
1088
1127
  }
1089
1128
  });
1090
1129
 
@@ -1,4 +1,5 @@
1
- export declare function getPathRobotConfigPolyfill(): {
1
+ import type { H3Event } from 'h3';
2
+ export declare function getPathRobotConfigPolyfill(e: H3Event, options: any): {
2
3
  indexable: boolean;
3
4
  rule: string;
4
5
  };
@@ -1,3 +1,3 @@
1
- export function getPathRobotConfigPolyfill() {
1
+ export function getPathRobotConfigPolyfill(e, options) {
2
2
  return { indexable: true, rule: "index, follow" };
3
3
  }
@@ -15,6 +15,7 @@ declare const _default: import("h3").EventHandler<import("h3").EventHandlerReque
15
15
  autoI18n?: import("../../../types").AutoI18nConfig | undefined;
16
16
  isMultiSitemap: boolean;
17
17
  isI18nMapped: boolean;
18
+ sitemapsPathPrefix: string;
18
19
  cacheMaxAgeSeconds: number | false;
19
20
  sitemapName: string;
20
21
  excludeAppSources: true | import("../../../types").AppSourceContext[];
@@ -1,2 +1,2 @@
1
- declare const _default: import("h3").EventHandler<import("h3").EventHandlerRequest, Promise<string | import("h3").H3Error<unknown> | undefined>>;
1
+ declare const _default: import("h3").EventHandler<import("h3").EventHandlerRequest, Promise<string | import("h3").H3Error<unknown>>>;
2
2
  export default _default;
@@ -0,0 +1,20 @@
1
+ import { createError, defineEventHandler, getRouterParam } from "h3";
2
+ import { withoutLeadingSlash, withoutTrailingSlash } from "ufo";
3
+ import { useSimpleSitemapRuntimeConfig } from "../../utils.js";
4
+ import { createSitemap } from "../../sitemap/nitro.js";
5
+ export default defineEventHandler(async (e) => {
6
+ const runtimeConfig = useSimpleSitemapRuntimeConfig(e);
7
+ const { sitemaps } = runtimeConfig;
8
+ const sitemapName = withoutLeadingSlash(withoutTrailingSlash((getRouterParam(e, "sitemap") || e.path)?.replace(".xml", "").replace(runtimeConfig.sitemapsPathPrefix, "")));
9
+ const isChunking = typeof sitemaps.chunks !== "undefined" && !Number.isNaN(Number(sitemapName));
10
+ if (!sitemapName || !(sitemapName in sitemaps) && !isChunking) {
11
+ return createError({
12
+ statusCode: 404,
13
+ message: `Sitemap "${sitemapName}" not found.`
14
+ });
15
+ }
16
+ return createSitemap(e, isChunking ? {
17
+ ...sitemaps.chunks,
18
+ sitemapName
19
+ } : sitemaps[sitemapName], runtimeConfig);
20
+ });
@@ -14,7 +14,8 @@ export default defineEventHandler(async (e) => {
14
14
  const creditName = `<a href="https://github.com/nuxt-modules/sitemap" style="color: black; display: flex; align-items: center; font-weight: 500;" target="_blank" rel="noopener">${svgIcon} Nuxt Sitemap v${version}</a>`;
15
15
  const { name: siteName, url: siteUrl } = useSiteConfig(e);
16
16
  const referrer = getHeader(e, "Referer") || "/";
17
- const isNotIndexButHasIndex = referrer !== fixPath("/sitemap.xml") && parseURL(referrer).pathname.endsWith("-sitemap.xml");
17
+ const referrerPath = parseURL(referrer).pathname;
18
+ const isNotIndexButHasIndex = referrerPath !== "/sitemap.xml" && referrerPath !== "/sitemap_index.xml" && referrerPath.endsWith(".xml");
18
19
  const sitemapName = parseURL(referrer).pathname.split("/").pop()?.split("-sitemap")[0] || fallbackSitemapName;
19
20
  const title = `${siteName}${sitemapName !== "sitemap.xml" ? ` - ${sitemapName === "sitemap_index.xml" ? "index" : sitemapName}` : ""}`.replace(/&/g, "&amp;");
20
21
  const canonicalQuery = getQuery(referrer).canonical;
@@ -1,27 +1,30 @@
1
- import { defineEventHandler, getQuery, setHeader } from "h3";
2
- import { fixSlashes } from "site-config-stack/urls";
1
+ import { appendHeader, defineEventHandler, setHeader } from "h3";
2
+ import { joinURL } from "ufo";
3
3
  import { useSimpleSitemapRuntimeConfig } from "../utils.js";
4
- import { buildSitemapIndex } from "../sitemap/builder/sitemap-index.js";
5
- import { createSitePathResolver, useNitroApp, useSiteConfig } from "#imports";
4
+ import { buildSitemapIndex, urlsToIndexXml } from "../sitemap/builder/sitemap-index.js";
5
+ import { useNitroUrlResolvers } from "../sitemap/nitro.js";
6
+ import { useNitroApp } from "#imports";
6
7
  export default defineEventHandler(async (e) => {
7
- const canonicalQuery = getQuery(e).canonical;
8
- const isShowingCanonical = typeof canonicalQuery !== "undefined" && canonicalQuery !== "false";
9
8
  const runtimeConfig = useSimpleSitemapRuntimeConfig();
10
- const siteConfig = useSiteConfig(e);
11
- let sitemap = await buildSitemapIndex({
12
- event: e,
13
- canonicalUrlResolver: createSitePathResolver(e, { canonical: isShowingCanonical || !import.meta.dev, absolute: true, withBase: true }),
14
- relativeBaseUrlResolver: createSitePathResolver(e, { absolute: false, withBase: true }),
15
- fixSlashes: (path) => fixSlashes(siteConfig.trailingSlash, path)
16
- }, runtimeConfig);
17
9
  const nitro = useNitroApp();
18
- const ctx = { sitemap, sitemapName: "sitemap" };
10
+ const resolvers = useNitroUrlResolvers(e);
11
+ const sitemaps = await buildSitemapIndex(resolvers, runtimeConfig);
12
+ if (import.meta.prerender) {
13
+ appendHeader(
14
+ e,
15
+ "x-nitro-prerender",
16
+ sitemaps.filter((entry) => !!entry._sitemapName).map((entry) => encodeURIComponent(joinURL(runtimeConfig.sitemapsPathPrefix, `/${entry._sitemapName}.xml`))).join(", ")
17
+ );
18
+ }
19
+ const indexResolvedCtx = { sitemaps };
20
+ await nitro.hooks.callHook("sitemap:index-resolved", indexResolvedCtx);
21
+ const output = urlsToIndexXml(indexResolvedCtx.sitemaps, resolvers, runtimeConfig);
22
+ const ctx = { sitemap: output, sitemapName: "sitemap" };
19
23
  await nitro.hooks.callHook("sitemap:output", ctx);
20
- sitemap = ctx.sitemap;
21
24
  setHeader(e, "Content-Type", "text/xml; charset=UTF-8");
22
25
  if (runtimeConfig.cacheMaxAgeSeconds)
23
26
  setHeader(e, "Cache-Control", `public, max-age=${runtimeConfig.cacheMaxAgeSeconds}, must-revalidate`);
24
27
  else
25
28
  setHeader(e, "Cache-Control", `no-cache, no-store`);
26
- return sitemap;
29
+ return ctx.sitemap;
27
30
  });
@@ -1,2 +1,3 @@
1
- import type { ModuleRuntimeConfig, NitroUrlResolvers } from '../../../types.js';
2
- export declare function buildSitemapIndex(resolvers: NitroUrlResolvers, runtimeConfig: ModuleRuntimeConfig): Promise<string>;
1
+ import type { ModuleRuntimeConfig, NitroUrlResolvers, SitemapIndexEntry } from '../../../types.js';
2
+ export declare function buildSitemapIndex(resolvers: NitroUrlResolvers, runtimeConfig: ModuleRuntimeConfig): Promise<SitemapIndexEntry[]>;
3
+ export declare function urlsToIndexXml(sitemaps: SitemapIndexEntry[], resolvers: NitroUrlResolvers, { version, xsl, credits }: Pick<ModuleRuntimeConfig, 'version' | 'xsl' | 'credits'>): string;
@@ -1,12 +1,10 @@
1
1
  import { defu } from "defu";
2
- import { appendHeader } from "h3";
3
- import { normaliseDate, normaliseSitemapUrls } from "../urlset/normalise.js";
2
+ import { joinURL } from "ufo";
3
+ import { normaliseDate } from "../urlset/normalise.js";
4
4
  import { globalSitemapSources, resolveSitemapSources } from "../urlset/sources.js";
5
- import { applyI18nEnhancements } from "../urlset/i18n.js";
6
- import { filterSitemapUrls } from "../urlset/filter.js";
7
5
  import { sortSitemapUrls } from "../urlset/sort.js";
8
6
  import { escapeValueForXml, wrapSitemapXml } from "./xml.js";
9
- import { useNitroApp } from "#imports";
7
+ import { resolveSitemapEntries } from "./sitemap.js";
10
8
  export async function buildSitemapIndex(resolvers, runtimeConfig) {
11
9
  const {
12
10
  sitemaps,
@@ -17,10 +15,7 @@ export async function buildSitemapIndex(resolvers, runtimeConfig) {
17
15
  autoI18n,
18
16
  isI18nMapped,
19
17
  sortEntries,
20
- // xls
21
- version,
22
- xsl,
23
- credits
18
+ sitemapsPathPrefix
24
19
  } = runtimeConfig;
25
20
  if (!sitemaps)
26
21
  throw new Error("Attempting to build a sitemap index without required `sitemaps` configuration.");
@@ -32,12 +27,9 @@ export async function buildSitemapIndex(resolvers, runtimeConfig) {
32
27
  if (isChunking) {
33
28
  const sitemap = sitemaps.chunks;
34
29
  const sources = await resolveSitemapSources(await globalSitemapSources());
35
- const normalisedUrls = normaliseSitemapUrls(sources.map((e) => e.urls).flat(), resolvers);
36
- let enhancedUrls = normalisedUrls.map((e) => defu(e, sitemap.defaults));
37
- if (autoI18n?.locales)
38
- enhancedUrls = applyI18nEnhancements(enhancedUrls, { isI18nMapped, autoI18n, sitemapName: sitemap.sitemapName });
39
- const filteredUrls = filterSitemapUrls(enhancedUrls, { ...sitemap, autoI18n, isMultiSitemap: true });
40
- const sortedUrls = maybeSort(filteredUrls);
30
+ const normalisedUrls = resolveSitemapEntries(sitemap, sources, { autoI18n, isI18nMapped });
31
+ const enhancedUrls = normalisedUrls.map((e) => defu(e, sitemap.defaults));
32
+ const sortedUrls = maybeSort(enhancedUrls);
41
33
  sortedUrls.forEach((url, i) => {
42
34
  const chunkIndex = Math.floor(i / defaultSitemapsChunkSize);
43
35
  chunks[chunkIndex] = chunks[chunkIndex] || { urls: [] };
@@ -50,18 +42,12 @@ export async function buildSitemapIndex(resolvers, runtimeConfig) {
50
42
  }
51
43
  }
52
44
  }
53
- if (import.meta.prerender) {
54
- appendHeader(
55
- resolvers.event,
56
- "x-nitro-prerender",
57
- Object.keys(chunks).map((name) => encodeURIComponent(`/${name}-sitemap.xml`)).join(", ")
58
- );
59
- }
60
45
  const entries = [];
61
46
  for (const name in chunks) {
62
47
  const sitemap = chunks[name];
63
48
  const entry = {
64
- sitemap: resolvers.canonicalUrlResolver(`${name}-sitemap.xml`)
49
+ _sitemapName: name,
50
+ sitemap: resolvers.canonicalUrlResolver(joinURL(sitemapsPathPrefix, `/${name}.xml`))
65
51
  };
66
52
  let lastmod = sitemap.urls.filter((a) => !!a?.lastmod).map((a) => typeof a.lastmod === "string" ? new Date(a.lastmod) : a.lastmod).sort((a, b) => (b?.getTime() || 0) - (a?.getTime() || 0))?.[0];
67
53
  if (!lastmod && autoLastmod)
@@ -75,10 +61,10 @@ export async function buildSitemapIndex(resolvers, runtimeConfig) {
75
61
  return typeof entry === "string" ? { sitemap: entry } : entry;
76
62
  }));
77
63
  }
78
- const ctx = { sitemaps: entries };
79
- const nitro = useNitroApp();
80
- await nitro.hooks.callHook("sitemap:index-resolved", ctx);
81
- const sitemapXml = ctx.sitemaps.map((e) => [
64
+ return entries;
65
+ }
66
+ export function urlsToIndexXml(sitemaps, resolvers, { version, xsl, credits }) {
67
+ const sitemapXml = sitemaps.map((e) => [
82
68
  " <sitemap>",
83
69
  ` <loc>${escapeValueForXml(e.sitemap)}</loc>`,
84
70
  // lastmod is optional
@@ -1,2 +1,9 @@
1
- import type { ModuleRuntimeConfig, NitroUrlResolvers, SitemapDefinition } from '../../../types.js';
2
- export declare function buildSitemap(sitemap: SitemapDefinition, resolvers: NitroUrlResolvers, runtimeConfig: ModuleRuntimeConfig): Promise<string>;
1
+ import type { AutoI18nConfig, ModuleRuntimeConfig, NitroUrlResolvers, ResolvedSitemapUrl, SitemapDefinition, SitemapSourceResolved } from '../../../types.js';
2
+ export interface NormalizedI18n extends ResolvedSitemapUrl {
3
+ _pathWithoutPrefix: string;
4
+ _locale: AutoI18nConfig['locales'][number];
5
+ _index?: number;
6
+ }
7
+ export declare function resolveSitemapEntries(sitemap: SitemapDefinition, sources: SitemapSourceResolved[], runtimeConfig: Pick<ModuleRuntimeConfig, 'autoI18n' | 'isI18nMapped'>): ResolvedSitemapUrl[];
8
+ export declare function buildSitemapUrls(sitemap: SitemapDefinition, resolvers: NitroUrlResolvers, runtimeConfig: ModuleRuntimeConfig): Promise<ResolvedSitemapUrl[]>;
9
+ export declare function urlsToXml(urls: ResolvedSitemapUrl[], resolvers: NitroUrlResolvers, { version, xsl, credits }: Pick<ModuleRuntimeConfig, 'version' | 'xsl' | 'credits'>): string;