@nuxtjs/sitemap 8.0.13 → 8.0.15

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 (70) hide show
  1. package/dist/devtools/200.html +1 -1
  2. package/dist/devtools/404.html +1 -1
  3. package/dist/devtools/_nuxt/6e7EVM9D.js +1 -0
  4. package/dist/devtools/_nuxt/B-mzd7ax.js +1 -0
  5. package/dist/devtools/_nuxt/B9WcJBuc.js +1 -0
  6. package/dist/devtools/_nuxt/CU6z_fY3.js +1 -0
  7. package/dist/devtools/_nuxt/CnYZ0nz4.js +181 -0
  8. package/dist/devtools/_nuxt/D8q6Bo8T.js +1 -0
  9. package/dist/devtools/_nuxt/DevtoolsEmptyState.DlsL4HGP.css +1 -0
  10. package/dist/devtools/_nuxt/DevtoolsSnippet.Crn-Jli8.css +1 -0
  11. package/dist/devtools/_nuxt/Dfz508oS.js +1 -0
  12. package/dist/devtools/_nuxt/{Source.DIvv0L85.css → Source.BJXCd4ey.css} +1 -1
  13. package/dist/devtools/_nuxt/builds/latest.json +1 -1
  14. package/dist/devtools/_nuxt/builds/meta/6a13e94e-54b2-4e42-b5dc-6941d3a319d9.json +1 -0
  15. package/dist/devtools/_nuxt/{DVdDkikE.js → dhgsCGhG.js} +1 -1
  16. package/dist/devtools/_nuxt/entry.l1zFHB5e.css +2 -0
  17. package/dist/devtools/_nuxt/h6WhJoib.js +1 -0
  18. package/dist/devtools/_nuxt/h7zQ0TxP.js +3 -0
  19. package/dist/devtools/_nuxt/pages.BDuS3Qx_.css +1 -0
  20. package/dist/devtools/app-sources/index.html +1 -1
  21. package/dist/devtools/debug/index.html +1 -1
  22. package/dist/devtools/docs/index.html +1 -1
  23. package/dist/devtools/index.html +1 -1
  24. package/dist/devtools/user-sources/index.html +1 -1
  25. package/dist/module.json +1 -1
  26. package/dist/module.mjs +24 -20
  27. package/dist/runtime/server/plugins/warm-up.js +19 -5
  28. package/dist/runtime/server/routes/__sitemap__/debug-production.js +1 -1
  29. package/dist/runtime/server/routes/__sitemap__/debug.js +1 -1
  30. package/dist/runtime/server/routes/__sitemap__/nuxt-content-urls-v2.js +1 -1
  31. package/dist/runtime/server/routes/__sitemap__/nuxt-content-urls-v3.js +2 -2
  32. package/dist/runtime/server/routes/sitemap.xsl.js +2 -2
  33. package/dist/runtime/server/sitemap/builder/sitemap-index.js +31 -83
  34. package/dist/runtime/server/sitemap/builder/sitemap.d.ts +7 -2
  35. package/dist/runtime/server/sitemap/builder/sitemap.js +64 -48
  36. package/dist/runtime/server/sitemap/builder/xml.js +12 -12
  37. package/dist/runtime/server/sitemap/nitro.js +6 -5
  38. package/dist/runtime/server/utils.d.ts +1 -1
  39. package/dist/runtime/server/utils.js +3 -1
  40. package/dist/runtime/types.d.ts +10 -0
  41. package/dist/utils.d.mts +1 -1
  42. package/dist/utils.d.ts +1 -1
  43. package/dist/utils.mjs +7 -7
  44. package/package.json +18 -18
  45. package/dist/devtools/_nuxt/Apgq3SqW.js +0 -1
  46. package/dist/devtools/_nuxt/BVTQ1GVS.js +0 -1
  47. package/dist/devtools/_nuxt/CT6fYAwM.js +0 -1
  48. package/dist/devtools/_nuxt/CUZQAPQZ.js +0 -1
  49. package/dist/devtools/_nuxt/CYAiQYhm.js +0 -23
  50. package/dist/devtools/_nuxt/CYLHX1cF.js +0 -1
  51. package/dist/devtools/_nuxt/DC1C2xmT.js +0 -3
  52. package/dist/devtools/_nuxt/DU2tRgIc.js +0 -1
  53. package/dist/devtools/_nuxt/DZoqB8vQ.js +0 -1
  54. package/dist/devtools/_nuxt/DevtoolsAlert.BrT7kLKw.css +0 -1
  55. package/dist/devtools/_nuxt/DevtoolsEmptyState.Btn_yLoD.css +0 -1
  56. package/dist/devtools/_nuxt/DevtoolsSnippet.DDMdUksh.css +0 -1
  57. package/dist/devtools/_nuxt/Dmz1R_jH.js +0 -1
  58. package/dist/devtools/_nuxt/Dn-g3ZEt.js +0 -6
  59. package/dist/devtools/_nuxt/Lwa8JV_I.js +0 -154
  60. package/dist/devtools/_nuxt/builds/meta/759b5cf1-947e-4e48-a0fa-4e3350b38023.json +0 -1
  61. package/dist/devtools/_nuxt/entry.DLs94X-2.css +0 -2
  62. package/dist/devtools/_nuxt/pages.DrCv1D3X.css +0 -1
  63. package/dist/devtools/_nuxt/shiki.iwK9vS8E.css +0 -1
  64. package/dist/devtools/_nuxt/zXxw7hoP.js +0 -1
  65. /package/dist/devtools/_nuxt/{CCTv7mmB.js → BwW5PI4u.js} +0 -0
  66. /package/dist/devtools/_nuxt/{CuJezOxb.js → Bx_VzvYa.js} +0 -0
  67. /package/dist/devtools/_nuxt/{O5eLyffU.js → CDUvHTjX.js} +0 -0
  68. /package/dist/devtools/_nuxt/{E8AZ6HoH.js → PnYIYlhI.js} +0 -0
  69. /package/dist/devtools/_nuxt/{CHHO6nw6.js → tBStlNYu.js} +0 -0
  70. /package/dist/devtools/_nuxt/{C5jzcy9i.js → z1-BJQbH.js} +0 -0
@@ -1,12 +1,11 @@
1
- import { defu } from "defu";
2
1
  import { getHeader } from "h3";
3
- import { defineCachedFunction, useRuntimeConfig } from "nitropack/runtime";
2
+ import { defineCachedFunction } from "nitropack/runtime";
4
3
  import { joinURL, withQuery } from "ufo";
4
+ import staticConfig from "#sitemap-virtual/static-config.mjs";
5
5
  import { normaliseDate } from "../urlset/normalise.js";
6
- import { sortInPlace } from "../urlset/sort.js";
7
- import { childSitemapSources, globalSitemapSources, resolveSitemapSources } from "../urlset/sources.js";
8
- import { resolveSitemapEntries } from "./sitemap.js";
6
+ import { getResolvedSitemapUrls } from "./sitemap.js";
9
7
  import { escapeValueForXml } from "./xml.js";
8
+ const SERVER_CACHE_MAX_AGE = staticConfig.cacheMaxAgeSeconds || 60 * 10;
10
9
  const buildSitemapIndexCached = defineCachedFunction(
11
10
  async (event, resolvers, runtimeConfig, nitro) => {
12
11
  return buildSitemapIndexInternal(resolvers, runtimeConfig, nitro);
@@ -14,8 +13,7 @@ const buildSitemapIndexCached = defineCachedFunction(
14
13
  {
15
14
  name: "sitemap:index",
16
15
  group: "sitemap",
17
- maxAge: 60 * 10,
18
- // 10 minutes default
16
+ maxAge: SERVER_CACHE_MAX_AGE,
19
17
  base: "sitemap",
20
18
  // Use the sitemap storage
21
19
  getKey: (event) => {
@@ -30,21 +28,13 @@ const buildSitemapIndexCached = defineCachedFunction(
30
28
  async function buildSitemapIndexInternal(resolvers, runtimeConfig, nitro) {
31
29
  const {
32
30
  sitemaps,
33
- // enhancing
34
31
  autoLastmod,
35
- // chunking
36
32
  defaultSitemapsChunkSize,
37
- autoI18n,
38
- isI18nMapped,
39
- sortEntries,
40
33
  sitemapsPathPrefix
41
34
  } = runtimeConfig;
42
35
  if (!sitemaps)
43
36
  throw new Error("Attempting to build a sitemap index without required `sitemaps` configuration.");
44
- function maybeSort(urls) {
45
- return sortEntries ? sortInPlace(urls) : urls;
46
- }
47
- const chunks = {};
37
+ const nonChunkedNames = [];
48
38
  const allFailedSources = [];
49
39
  for (const sitemapName in sitemaps) {
50
40
  if (sitemapName === "index" || sitemapName === "chunks")
@@ -54,85 +44,47 @@ async function buildSitemapIndexInternal(resolvers, runtimeConfig, nitro) {
54
44
  sitemapConfig._isChunking = true;
55
45
  sitemapConfig._chunkSize = sitemapConfig.chunkSize || (typeof sitemapConfig.chunks === "number" ? sitemapConfig.chunks : defaultSitemapsChunkSize || 1e3);
56
46
  } else {
57
- chunks[sitemapName] = chunks[sitemapName] || { urls: [] };
47
+ nonChunkedNames.push(sitemapName);
58
48
  }
59
49
  }
50
+ const indexLastmod = autoLastmod ? normaliseDate(/* @__PURE__ */ new Date()) : void 0;
51
+ const entries = [];
60
52
  if (typeof sitemaps.chunks !== "undefined") {
61
53
  const sitemap = sitemaps.chunks;
62
- let sourcesInput = await globalSitemapSources();
63
- if (nitro && resolvers.event) {
64
- const ctx = {
65
- event: resolvers.event,
66
- sitemapName: sitemap.sitemapName,
67
- sources: sourcesInput
54
+ const resolved = await getResolvedSitemapUrls(sitemap, "sitemap", true, resolvers, runtimeConfig, nitro);
55
+ allFailedSources.push(...resolved.failedSources);
56
+ const chunkCount = Math.ceil(resolved.urls.length / defaultSitemapsChunkSize);
57
+ for (let i = 0; i < chunkCount; i++) {
58
+ const entry = {
59
+ _sitemapName: String(i),
60
+ sitemap: resolvers.canonicalUrlResolver(joinURL(sitemapsPathPrefix || "", `/${i}.xml`))
68
61
  };
69
- await nitro.hooks.callHook("sitemap:sources", ctx);
70
- sourcesInput = ctx.sources;
62
+ if (indexLastmod)
63
+ entry.lastmod = indexLastmod;
64
+ entries.push(entry);
71
65
  }
72
- const sources = await resolveSitemapSources(sourcesInput, resolvers.event);
73
- const failedSources = sources.filter((source) => source.error && source._isFailure).map((source) => ({
74
- url: typeof source.fetch === "string" ? source.fetch : source.fetch?.[0] || "unknown",
75
- error: source.error || "Unknown error"
76
- }));
77
- allFailedSources.push(...failedSources);
78
- const resolvedCtx = {
79
- urls: sources.flatMap((s) => s.urls),
80
- sitemapName: sitemap.sitemapName,
81
- event: resolvers.event
82
- };
83
- await nitro?.hooks.callHook("sitemap:input", resolvedCtx);
84
- const normalisedUrls = resolveSitemapEntries(sitemap, resolvedCtx.urls, { autoI18n, isI18nMapped }, resolvers, useRuntimeConfig().app.baseURL);
85
- const enhancedUrls = normalisedUrls.map((e) => defu(e, sitemap.defaults));
86
- const sortedUrls = maybeSort(enhancedUrls);
87
- sortedUrls.forEach((url, i) => {
88
- const chunkIndex = Math.floor(i / defaultSitemapsChunkSize);
89
- chunks[chunkIndex] = chunks[chunkIndex] || { urls: [] };
90
- chunks[chunkIndex].urls.push(url);
91
- });
92
66
  }
93
- const entries = [];
94
- for (const name in chunks) {
95
- const sitemap = chunks[name];
67
+ for (const name of nonChunkedNames) {
96
68
  const entry = {
97
69
  _sitemapName: name,
98
70
  sitemap: resolvers.canonicalUrlResolver(joinURL(sitemapsPathPrefix || "", `/${name}.xml`))
99
71
  };
100
- 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];
101
- if (!lastmod && autoLastmod)
102
- lastmod = /* @__PURE__ */ new Date();
103
- if (lastmod)
104
- entry.lastmod = normaliseDate(lastmod);
72
+ if (indexLastmod)
73
+ entry.lastmod = indexLastmod;
105
74
  entries.push(entry);
106
75
  }
107
76
  for (const sitemapName in sitemaps) {
108
77
  const sitemapConfig = sitemaps[sitemapName];
109
78
  if (sitemapName !== "index" && sitemapConfig._isChunking) {
110
79
  const chunkSize = sitemapConfig._chunkSize || defaultSitemapsChunkSize || 1e3;
111
- let sourcesInput = sitemapConfig.includeAppSources ? [...await globalSitemapSources(), ...await childSitemapSources(sitemapConfig)] : await childSitemapSources(sitemapConfig);
112
- if (nitro && resolvers.event) {
113
- const ctx = {
114
- event: resolvers.event,
115
- sitemapName: sitemapConfig.sitemapName,
116
- sources: sourcesInput
117
- };
118
- await nitro.hooks.callHook("sitemap:sources", ctx);
119
- sourcesInput = ctx.sources;
80
+ let chunkCount;
81
+ if (typeof sitemapConfig.chunkCount === "number" && sitemapConfig.chunkCount > 0) {
82
+ chunkCount = sitemapConfig.chunkCount;
83
+ } else {
84
+ const resolved = await getResolvedSitemapUrls(sitemapConfig, sitemapName, true, resolvers, runtimeConfig, nitro);
85
+ allFailedSources.push(...resolved.failedSources);
86
+ chunkCount = Math.ceil(resolved.urls.length / chunkSize);
120
87
  }
121
- const sources = await resolveSitemapSources(sourcesInput, resolvers.event);
122
- const failedSources = sources.filter((source) => source.error && source._isFailure).map((source) => ({
123
- url: typeof source.fetch === "string" ? source.fetch : source.fetch?.[0] || "unknown",
124
- error: source.error || "Unknown error"
125
- }));
126
- allFailedSources.push(...failedSources);
127
- const resolvedCtx = {
128
- urls: sources.flatMap((s) => s.urls),
129
- sitemapName: sitemapConfig.sitemapName,
130
- event: resolvers.event
131
- };
132
- await nitro?.hooks.callHook("sitemap:input", resolvedCtx);
133
- const normalisedUrls = resolveSitemapEntries(sitemapConfig, resolvedCtx.urls, { autoI18n, isI18nMapped }, resolvers, useRuntimeConfig().app.baseURL);
134
- const totalUrls = normalisedUrls.length;
135
- const chunkCount = Math.ceil(totalUrls / chunkSize);
136
88
  sitemapConfig._chunkCount = chunkCount;
137
89
  for (let i = 0; i < chunkCount; i++) {
138
90
  const chunkName = `${sitemapName}-${i}`;
@@ -140,12 +92,8 @@ async function buildSitemapIndexInternal(resolvers, runtimeConfig, nitro) {
140
92
  _sitemapName: chunkName,
141
93
  sitemap: resolvers.canonicalUrlResolver(joinURL(sitemapsPathPrefix || "", `/${chunkName}.xml`))
142
94
  };
143
- const chunkUrls = normalisedUrls.slice(i * chunkSize, (i + 1) * chunkSize);
144
- let lastmod = chunkUrls.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];
145
- if (!lastmod && autoLastmod)
146
- lastmod = /* @__PURE__ */ new Date();
147
- if (lastmod)
148
- entry.lastmod = normaliseDate(lastmod);
95
+ if (indexLastmod)
96
+ entry.lastmod = indexLastmod;
149
97
  entries.push(entry);
150
98
  }
151
99
  }
@@ -1,3 +1,4 @@
1
+ import type { H3Event } from 'h3';
1
2
  import type { NitroApp } from 'nitropack/types';
2
3
  import type { AutoI18nConfig, ModuleRuntimeConfig, NitroUrlResolvers, ResolvedSitemapUrl, SitemapDefinition, SitemapUrlInput } from '../../../types.js';
3
4
  export interface NormalizedI18n extends ResolvedSitemapUrl {
@@ -6,11 +7,15 @@ export interface NormalizedI18n extends ResolvedSitemapUrl {
6
7
  _index?: number;
7
8
  }
8
9
  export declare function resolveSitemapEntries(sitemap: SitemapDefinition, urls: SitemapUrlInput[], runtimeConfig: Pick<ModuleRuntimeConfig, 'autoI18n' | 'isI18nMapped'>, resolvers?: NitroUrlResolvers, baseURL?: string): ResolvedSitemapUrl[];
9
- export declare function buildSitemapUrls(sitemap: SitemapDefinition, resolvers: NitroUrlResolvers, runtimeConfig: ModuleRuntimeConfig, nitro?: NitroApp): Promise<{
10
+ export interface ResolvedSitemapUrlsResult {
10
11
  urls: ResolvedSitemapUrl[];
11
12
  failedSources: Array<{
12
13
  url: string;
13
14
  error: string;
14
15
  }>;
15
- }>;
16
+ }
17
+ export declare function buildResolvedSitemapUrls(effectiveSitemap: SitemapDefinition, matchName: string, isChunked: boolean, resolvers: NitroUrlResolvers, runtimeConfig: ModuleRuntimeConfig, nitro?: NitroApp): Promise<ResolvedSitemapUrlsResult>;
18
+ export declare const buildResolvedSitemapUrlsCached: (_event: H3Event<import("h3").EventHandlerRequest>, effectiveSitemap: SitemapDefinition, matchName: string, isChunked: boolean, resolvers: NitroUrlResolvers, runtimeConfig: ModuleRuntimeConfig, nitro?: NitroApp | undefined) => Promise<ResolvedSitemapUrlsResult>;
19
+ export declare function getResolvedSitemapUrls(effectiveSitemap: SitemapDefinition, matchName: string, isChunked: boolean, resolvers: NitroUrlResolvers, runtimeConfig: ModuleRuntimeConfig, nitro?: NitroApp): Promise<ResolvedSitemapUrlsResult>;
20
+ export declare function buildSitemapUrls(sitemap: SitemapDefinition, resolvers: NitroUrlResolvers, runtimeConfig: ModuleRuntimeConfig, nitro?: NitroApp): Promise<ResolvedSitemapUrlsResult>;
16
21
  export { urlsToXml } from './xml.js';
@@ -1,11 +1,14 @@
1
- import { useRuntimeConfig } from "nitropack/runtime";
1
+ import { getHeader } from "h3";
2
+ import { defineCachedFunction, useRuntimeConfig } from "nitropack/runtime";
2
3
  import { resolveSitePath } from "nuxt-site-config/urls";
3
4
  import { joinURL, withHttps } from "ufo";
5
+ import staticConfig from "#sitemap-virtual/static-config.mjs";
4
6
  import { applyDynamicParams, createPathFilter, findPageMapping, logger, splitForLocales } from "../../../utils-pure.js";
5
7
  import { preNormalizeEntry } from "../urlset/normalise.js";
6
8
  import { sortInPlace } from "../urlset/sort.js";
7
9
  import { childSitemapSources, globalSitemapSources, resolveSitemapSources } from "../urlset/sources.js";
8
10
  import { parseChunkInfo, sliceUrlsForChunk } from "../utils/chunk.js";
11
+ const SERVER_CACHE_MAX_AGE = staticConfig.cacheMaxAgeSeconds || 60 * 10;
9
12
  export function resolveSitemapEntries(sitemap, urls, runtimeConfig, resolvers, baseURL) {
10
13
  const {
11
14
  autoI18n,
@@ -162,49 +165,13 @@ export function resolveSitemapEntries(sitemap, urls, runtimeConfig, resolvers, b
162
165
  }
163
166
  return _urls;
164
167
  }
165
- export async function buildSitemapUrls(sitemap, resolvers, runtimeConfig, nitro) {
166
- const {
167
- sitemaps,
168
- // enhancing
169
- autoI18n,
170
- isI18nMapped,
171
- isMultiSitemap,
172
- // sorting
173
- sortEntries,
174
- // chunking
175
- defaultSitemapsChunkSize
176
- } = runtimeConfig;
177
- const chunkSize = defaultSitemapsChunkSize || void 0;
178
- const chunkInfo = parseChunkInfo(sitemap.sitemapName, sitemaps, chunkSize);
179
- function maybeSort(urls2) {
180
- return sortEntries ? sortInPlace(urls2) : urls2;
181
- }
182
- function maybeSlice(urls2) {
183
- return sliceUrlsForChunk(urls2, sitemap.sitemapName, sitemaps, chunkSize);
184
- }
185
- if (autoI18n?.differentDomains) {
186
- const domain = autoI18n.locales.find((e) => e.language === sitemap.sitemapName || e.code === sitemap.sitemapName)?.domain;
187
- if (domain) {
188
- const _tester = resolvers.canonicalUrlResolver;
189
- resolvers.canonicalUrlResolver = (path) => resolveSitePath(path, {
190
- absolute: true,
191
- withBase: false,
192
- siteUrl: withHttps(domain),
193
- trailingSlash: _tester("/test/").endsWith("/"),
194
- base: "/"
195
- });
196
- }
197
- }
198
- let effectiveSitemap = sitemap;
199
- const baseSitemapName = chunkInfo.baseSitemapName;
200
- if (chunkInfo.isChunked && baseSitemapName !== sitemap.sitemapName && sitemaps[baseSitemapName]) {
201
- effectiveSitemap = sitemaps[baseSitemapName];
202
- }
168
+ export async function buildResolvedSitemapUrls(effectiveSitemap, matchName, isChunked, resolvers, runtimeConfig, nitro) {
169
+ const { sitemaps, autoI18n, isI18nMapped, isMultiSitemap, sortEntries } = runtimeConfig;
203
170
  let sourcesInput = effectiveSitemap.includeAppSources ? [...await globalSitemapSources(), ...await childSitemapSources(effectiveSitemap)] : await childSitemapSources(effectiveSitemap);
204
171
  if (nitro && resolvers.event) {
205
172
  const ctx = {
206
173
  event: resolvers.event,
207
- sitemapName: baseSitemapName,
174
+ sitemapName: matchName,
208
175
  sources: sourcesInput
209
176
  };
210
177
  await nitro.hooks.callHook("sitemap:sources", ctx);
@@ -217,11 +184,11 @@ export async function buildSitemapUrls(sitemap, resolvers, runtimeConfig, nitro)
217
184
  }));
218
185
  const resolvedCtx = {
219
186
  urls: sources.flatMap((s) => s.urls),
220
- sitemapName: sitemap.sitemapName,
187
+ sitemapName: matchName,
221
188
  event: resolvers.event
222
189
  };
223
190
  await nitro?.hooks.callHook("sitemap:input", resolvedCtx);
224
- const enhancedUrls = resolveSitemapEntries(sitemap, resolvedCtx.urls, { autoI18n, isI18nMapped }, resolvers, useRuntimeConfig().app.baseURL);
191
+ const enhancedUrls = resolveSitemapEntries(effectiveSitemap, resolvedCtx.urls, { autoI18n, isI18nMapped }, resolvers, useRuntimeConfig().app.baseURL);
225
192
  if (isMultiSitemap) {
226
193
  const sitemapNames = Object.keys(sitemaps).filter((k) => k !== "index");
227
194
  const warnedSitemaps = nitro?._sitemapWarnedSitemaps || /* @__PURE__ */ new Set();
@@ -241,15 +208,64 @@ export async function buildSitemapUrls(sitemap, resolvers, runtimeConfig, nitro)
241
208
  const filteredUrls = enhancedUrls.filter((e) => {
242
209
  if (e._sitemap === false)
243
210
  return false;
244
- if (isMultiSitemap && e._sitemap && sitemap.sitemapName) {
245
- if (sitemap._isChunking)
246
- return e._sitemap === baseSitemapName || isI18nMapped && sitemap.sitemapName.startsWith(`${e._sitemap}-`);
247
- return e._sitemap === sitemap.sitemapName || isI18nMapped && sitemap.sitemapName.startsWith(`${e._sitemap}-`);
211
+ if (isMultiSitemap && e._sitemap && matchName) {
212
+ if (isChunked)
213
+ return e._sitemap === matchName;
214
+ return e._sitemap === matchName || isI18nMapped && matchName.startsWith(`${e._sitemap}-`);
248
215
  }
249
216
  return true;
250
217
  });
251
- const sortedUrls = maybeSort(filteredUrls);
252
- const urls = maybeSlice(sortedUrls);
218
+ const urls = sortEntries ? sortInPlace(filteredUrls) : filteredUrls;
253
219
  return { urls, failedSources };
254
220
  }
221
+ export const buildResolvedSitemapUrlsCached = defineCachedFunction(
222
+ async (_event, effectiveSitemap, matchName, isChunked, resolvers, runtimeConfig, nitro) => buildResolvedSitemapUrls(effectiveSitemap, matchName, isChunked, resolvers, runtimeConfig, nitro),
223
+ {
224
+ name: "sitemap:resolved-urls",
225
+ group: "sitemap",
226
+ base: "sitemap",
227
+ maxAge: SERVER_CACHE_MAX_AGE,
228
+ getKey: (event, _effectiveSitemap, matchName, isChunked) => {
229
+ const host = getHeader(event, "host") || getHeader(event, "x-forwarded-host") || "";
230
+ const proto = getHeader(event, "x-forwarded-proto") || "https";
231
+ return `resolved-${isChunked ? "chunked-" : ""}${matchName}-${proto}-${host}`;
232
+ },
233
+ swr: true
234
+ }
235
+ );
236
+ export async function getResolvedSitemapUrls(effectiveSitemap, matchName, isChunked, resolvers, runtimeConfig, nitro) {
237
+ const event = resolvers.event;
238
+ const shouldCache = !import.meta.dev && !import.meta.prerender && typeof runtimeConfig.cacheMaxAgeSeconds === "number" && runtimeConfig.cacheMaxAgeSeconds > 0;
239
+ if (shouldCache && event) {
240
+ return buildResolvedSitemapUrlsCached(event, effectiveSitemap, matchName, isChunked, resolvers, runtimeConfig, nitro);
241
+ }
242
+ return buildResolvedSitemapUrls(effectiveSitemap, matchName, isChunked, resolvers, runtimeConfig, nitro);
243
+ }
244
+ export async function buildSitemapUrls(sitemap, resolvers, runtimeConfig, nitro) {
245
+ const { sitemaps, autoI18n, defaultSitemapsChunkSize } = runtimeConfig;
246
+ const chunkSize = defaultSitemapsChunkSize || void 0;
247
+ const chunkInfo = parseChunkInfo(sitemap.sitemapName, sitemaps, chunkSize);
248
+ if (autoI18n?.differentDomains) {
249
+ const domain = autoI18n.locales.find((e) => e.language === sitemap.sitemapName || e.code === sitemap.sitemapName)?.domain;
250
+ if (domain) {
251
+ const _tester = resolvers.canonicalUrlResolver;
252
+ resolvers.canonicalUrlResolver = (path) => resolveSitePath(path, {
253
+ absolute: true,
254
+ withBase: false,
255
+ siteUrl: withHttps(domain),
256
+ trailingSlash: _tester("/test/").endsWith("/"),
257
+ base: "/"
258
+ });
259
+ }
260
+ }
261
+ let effectiveSitemap = sitemap;
262
+ const baseSitemapName = chunkInfo.baseSitemapName;
263
+ if (chunkInfo.isChunked && baseSitemapName !== sitemap.sitemapName && sitemaps[baseSitemapName]) {
264
+ effectiveSitemap = sitemaps[baseSitemapName];
265
+ }
266
+ const matchName = chunkInfo.isChunked ? baseSitemapName : sitemap.sitemapName;
267
+ const resolved = await getResolvedSitemapUrls(effectiveSitemap, matchName, chunkInfo.isChunked, resolvers, runtimeConfig, nitro);
268
+ const urls = sliceUrlsForChunk(resolved.urls, sitemap.sitemapName, sitemaps, chunkSize);
269
+ return { urls, failedSources: resolved.failedSources };
270
+ }
255
271
  export { urlsToXml } from "./xml.js";
@@ -14,9 +14,9 @@ function buildUrlXml(url, NL, I1, I2, I3, I4) {
14
14
  if (url.loc)
15
15
  xml += `${I2}<loc>${xmlEscape(url.loc)}</loc>${NL}`;
16
16
  if (url.lastmod)
17
- xml += `${I2}<lastmod>${url.lastmod}</lastmod>${NL}`;
17
+ xml += `${I2}<lastmod>${xmlEscape(url.lastmod)}</lastmod>${NL}`;
18
18
  if (url.changefreq)
19
- xml += `${I2}<changefreq>${url.changefreq}</changefreq>${NL}`;
19
+ xml += `${I2}<changefreq>${xmlEscape(url.changefreq)}</changefreq>${NL}`;
20
20
  if (url.priority !== void 0) {
21
21
  const p = typeof url.priority === "number" ? url.priority : Number.parseFloat(url.priority);
22
22
  xml += `${I2}<priority>${p.toFixed(1)}</priority>${NL}`;
@@ -53,27 +53,27 @@ function buildUrlXml(url, NL, I1, I2, I3, I4) {
53
53
  if (video.player_loc)
54
54
  xml += `${I3}<video:player_loc>${xmlEscape(video.player_loc)}</video:player_loc>${NL}`;
55
55
  if (video.duration !== void 0)
56
- xml += `${I3}<video:duration>${video.duration}</video:duration>${NL}`;
56
+ xml += `${I3}<video:duration>${escapeValueForXml(video.duration)}</video:duration>${NL}`;
57
57
  if (video.expiration_date)
58
- xml += `${I3}<video:expiration_date>${video.expiration_date}</video:expiration_date>${NL}`;
58
+ xml += `${I3}<video:expiration_date>${xmlEscape(video.expiration_date)}</video:expiration_date>${NL}`;
59
59
  if (video.rating !== void 0)
60
- xml += `${I3}<video:rating>${video.rating}</video:rating>${NL}`;
60
+ xml += `${I3}<video:rating>${escapeValueForXml(video.rating)}</video:rating>${NL}`;
61
61
  if (video.view_count !== void 0)
62
- xml += `${I3}<video:view_count>${video.view_count}</video:view_count>${NL}`;
62
+ xml += `${I3}<video:view_count>${escapeValueForXml(video.view_count)}</video:view_count>${NL}`;
63
63
  if (video.publication_date)
64
- xml += `${I3}<video:publication_date>${video.publication_date}</video:publication_date>${NL}`;
64
+ xml += `${I3}<video:publication_date>${xmlEscape(video.publication_date)}</video:publication_date>${NL}`;
65
65
  if (video.family_friendly !== void 0)
66
66
  xml += `${I3}<video:family_friendly>${yesNo(video.family_friendly)}</video:family_friendly>${NL}`;
67
67
  if (video.restriction)
68
- xml += `${I3}<video:restriction relationship="${video.restriction.relationship || "allow"}">${xmlEscape(video.restriction.restriction)}</video:restriction>${NL}`;
68
+ xml += `${I3}<video:restriction relationship="${xmlEscape(video.restriction.relationship || "allow")}">${xmlEscape(video.restriction.restriction)}</video:restriction>${NL}`;
69
69
  if (video.platform)
70
- xml += `${I3}<video:platform relationship="${video.platform.relationship || "allow"}">${xmlEscape(video.platform.platform)}</video:platform>${NL}`;
70
+ xml += `${I3}<video:platform relationship="${xmlEscape(video.platform.relationship || "allow")}">${xmlEscape(video.platform.platform)}</video:platform>${NL}`;
71
71
  if (video.requires_subscription !== void 0)
72
72
  xml += `${I3}<video:requires_subscription>${yesNo(video.requires_subscription)}</video:requires_subscription>${NL}`;
73
73
  if (video.price) {
74
74
  for (const price of video.price) {
75
- const c = price.currency ? ` currency="${price.currency}"` : "";
76
- const t = price.type ? ` type="${price.type}"` : "";
75
+ const c = price.currency ? ` currency="${xmlEscape(price.currency)}"` : "";
76
+ const t = price.type ? ` type="${xmlEscape(price.type)}"` : "";
77
77
  xml += `${I3}<video:price${c}${t}>${xmlEscape(String(price.price ?? ""))}</video:price>${NL}`;
78
78
  }
79
79
  }
@@ -102,7 +102,7 @@ function buildUrlXml(url, NL, I1, I2, I3, I4) {
102
102
  if (url.news.title)
103
103
  xml += `${I3}<news:title>${xmlEscape(url.news.title)}</news:title>${NL}`;
104
104
  if (url.news.publication_date)
105
- xml += `${I3}<news:publication_date>${url.news.publication_date}</news:publication_date>${NL}`;
105
+ xml += `${I3}<news:publication_date>${xmlEscape(url.news.publication_date)}</news:publication_date>${NL}`;
106
106
  xml += `${I2}</news:news>${NL}`;
107
107
  }
108
108
  if (import.meta.dev && url._warnings?.length) {
@@ -1,15 +1,17 @@
1
- import { getPathRobotConfig } from "#internal/nuxt-robots/getPathRobotConfig";
2
- import { getSiteConfig } from "#site-config/server/composables/getSiteConfig";
3
- import { createSitePathResolver } from "#site-config/server/composables/utils";
4
1
  import { defu } from "defu";
5
2
  import { createError, getHeader, getQuery, setHeader } from "h3";
6
3
  import { defineCachedFunction, useNitroApp } from "nitropack/runtime";
7
4
  import { fixSlashes } from "nuxt-site-config/urls";
5
+ import { getPathRobotConfig } from "#internal/nuxt-robots/getPathRobotConfig";
6
+ import { getSiteConfig } from "#site-config/server/composables/getSiteConfig";
7
+ import { createSitePathResolver } from "#site-config/server/composables/utils";
8
+ import staticConfig from "#sitemap-virtual/static-config.mjs";
8
9
  import { logger, mergeOnKey, splitForLocales } from "../../utils-pure.js";
9
10
  import { createNitroRouteRuleMatcher } from "../kit.js";
10
11
  import { buildSitemapUrls, urlsToXml } from "./builder/sitemap.js";
11
12
  import { normaliseEntry, preNormalizeEntry } from "./urlset/normalise.js";
12
13
  import { sortInPlace } from "./urlset/sort.js";
14
+ const SERVER_CACHE_MAX_AGE = staticConfig.cacheMaxAgeSeconds || 60 * 10;
13
15
  export function useNitroUrlResolvers(e) {
14
16
  const canonicalQuery = getQuery(e).canonical;
15
17
  const isShowingCanonical = typeof canonicalQuery !== "undefined" && canonicalQuery !== "false";
@@ -118,8 +120,7 @@ const buildSitemapXmlCached = defineCachedFunction(
118
120
  {
119
121
  name: "sitemap:xml",
120
122
  group: "sitemap",
121
- maxAge: 60 * 10,
122
- // Default 10 minutes
123
+ maxAge: SERVER_CACHE_MAX_AGE,
123
124
  base: "sitemap",
124
125
  // Use the sitemap storage
125
126
  getKey: (event, definition) => {
@@ -1,5 +1,5 @@
1
1
  import type { H3Event } from 'h3';
2
2
  import type { ModuleRuntimeConfig } from '../types.js';
3
3
  export * from '../utils-pure.js';
4
- export declare function xmlEscape(str: string): string;
4
+ export declare function xmlEscape(str: string | number | boolean | Date): string;
5
5
  export declare function useSitemapRuntimeConfig(e?: H3Event): ModuleRuntimeConfig;
@@ -1,16 +1,18 @@
1
1
  import { useRuntimeConfig } from "nitropack/runtime";
2
+ import staticConfig from "#sitemap-virtual/static-config.mjs";
2
3
  import { normalizeRuntimeFilters } from "../utils-pure.js";
3
4
  export * from "../utils-pure.js";
4
5
  export function xmlEscape(str) {
5
6
  return String(str).replace(/&/g, "&amp;").replace(/</g, "&lt;").replace(/>/g, "&gt;").replace(/"/g, "&quot;").replace(/'/g, "&apos;");
6
7
  }
7
8
  export function useSitemapRuntimeConfig(e) {
8
- const clone = JSON.parse(JSON.stringify(useRuntimeConfig(e).sitemap));
9
+ const clone = JSON.parse(JSON.stringify(staticConfig));
9
10
  for (const k in clone.sitemaps) {
10
11
  const sitemap = clone.sitemaps[k];
11
12
  sitemap.include = normalizeRuntimeFilters(sitemap.include);
12
13
  sitemap.exclude = normalizeRuntimeFilters(sitemap.exclude);
13
14
  clone.sitemaps[k] = sitemap;
14
15
  }
16
+ Object.assign(clone, useRuntimeConfig(e).sitemap);
15
17
  return Object.freeze(clone);
16
18
  }
@@ -338,6 +338,16 @@ export interface SitemapDefinition {
338
338
  * @example 10000
339
339
  */
340
340
  chunkSize?: number;
341
+ /**
342
+ * Pre-declare the number of chunks this sitemap will produce. When set, the sitemap index
343
+ * renders this many chunk entries without fetching the source data — useful at very large
344
+ * scale where the cold-start fetch is the bottleneck. Per-chunk renders still fetch on
345
+ * demand and slice. If the actual data produces fewer URLs than declared, tail chunks render
346
+ * empty; if more, the extras are unreachable. Update this when your data set grows.
347
+ *
348
+ * @example 100
349
+ */
350
+ chunkCount?: number;
341
351
  /**
342
352
  * @internal
343
353
  */
package/dist/utils.d.mts CHANGED
@@ -32,7 +32,7 @@ interface SitemapIndexParseResult {
32
32
  entries: SitemapIndexEntry[];
33
33
  warnings: SitemapWarning[];
34
34
  }
35
- declare function parseSitemapIndex(xml: string): SitemapIndexParseResult;
35
+ declare function parseSitemapIndex(xml: string): Promise<SitemapIndexParseResult>;
36
36
  declare function isSitemapIndex(xml: string): boolean;
37
37
 
38
38
  export { isSitemapIndex, parseHtmlExtractSitemapMeta, parseSitemapIndex, parseSitemapXml };
package/dist/utils.d.ts CHANGED
@@ -32,7 +32,7 @@ interface SitemapIndexParseResult {
32
32
  entries: SitemapIndexEntry[];
33
33
  warnings: SitemapWarning[];
34
34
  }
35
- declare function parseSitemapIndex(xml: string): SitemapIndexParseResult;
35
+ declare function parseSitemapIndex(xml: string): Promise<SitemapIndexParseResult>;
36
36
  declare function isSitemapIndex(xml: string): boolean;
37
37
 
38
38
  export { isSitemapIndex, parseHtmlExtractSitemapMeta, parseSitemapIndex, parseSitemapXml };
package/dist/utils.mjs CHANGED
@@ -1,19 +1,19 @@
1
1
  export { p as parseHtmlExtractSitemapMeta } from './shared/sitemap.DJC-maKi.mjs';
2
- import { XMLParser } from 'fast-xml-parser';
3
2
  import 'ufo';
4
3
  import 'ultrahtml';
5
4
 
6
- const parser = new XMLParser({
7
- isArray: (tagName) => tagName === "sitemap",
8
- removeNSPrefix: true,
9
- trimValues: true
10
- });
11
5
  function isValidUrl(value) {
12
6
  return URL.canParse(value);
13
7
  }
14
- function parseSitemapIndex(xml) {
8
+ async function parseSitemapIndex(xml) {
15
9
  if (!xml)
16
10
  throw new Error("Empty XML input provided");
11
+ const { XMLParser } = await import('fast-xml-parser');
12
+ const parser = new XMLParser({
13
+ isArray: (tagName) => tagName === "sitemap",
14
+ removeNSPrefix: true,
15
+ trimValues: true
16
+ });
17
17
  const parsed = parser.parse(xml);
18
18
  if (parsed?.sitemapindex === void 0)
19
19
  throw new Error("XML does not contain a valid sitemapindex element");
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@nuxtjs/sitemap",
3
3
  "type": "module",
4
- "version": "8.0.13",
4
+ "version": "8.0.15",
5
5
  "description": "Powerfully flexible XML Sitemaps that integrate seamlessly, for Nuxt.",
6
6
  "author": {
7
7
  "name": "Harlan Wilton",
@@ -55,17 +55,17 @@
55
55
  }
56
56
  },
57
57
  "dependencies": {
58
- "@nuxt/kit": "^4.4.2",
58
+ "@nuxt/kit": "^4.4.4",
59
59
  "consola": "^3.4.2",
60
60
  "defu": "^6.1.7",
61
- "fast-xml-parser": "^5.6.0",
61
+ "fast-xml-parser": "^5.7.2",
62
62
  "nuxt-site-config": "^4.0.8",
63
63
  "nuxtseo-shared": "^5.1.3",
64
64
  "ofetch": "^1.5.1",
65
65
  "pathe": "^2.0.3",
66
- "pkg-types": "^2.3.0",
66
+ "pkg-types": "^2.3.1",
67
67
  "radix3": "^1.1.2",
68
- "ufo": "^1.6.3",
68
+ "ufo": "^1.6.4",
69
69
  "ultrahtml": "^1.6.0"
70
70
  },
71
71
  "devDependencies": {
@@ -74,28 +74,28 @@
74
74
  "@nuxt/content": "^3.13.0",
75
75
  "@nuxt/devtools-kit": "4.0.0-alpha.3",
76
76
  "@nuxt/module-builder": "^1.0.2",
77
- "@nuxt/test-utils": "^4.0.2",
78
- "@nuxt/ui": "^4.6.1",
79
- "@nuxtjs/i18n": "^10.2.4",
80
- "@nuxtjs/robots": "^6.0.7",
81
- "@vue/test-utils": "^2.4.6",
77
+ "@nuxt/test-utils": "^4.0.3",
78
+ "@nuxt/ui": "^4.7.1",
79
+ "@nuxtjs/i18n": "^10.3.0",
80
+ "@nuxtjs/robots": "^6.0.8",
81
+ "@vue/test-utils": "^2.4.10",
82
82
  "better-sqlite3": "^12.9.0",
83
83
  "bumpp": "^11.0.1",
84
- "eslint": "^10.2.0",
84
+ "eslint": "^10.2.1",
85
85
  "eslint-plugin-harlanzw": "^0.12.1",
86
86
  "execa": "^9.6.1",
87
87
  "happy-dom": "^20.9.0",
88
- "nuxt": "^4.4.2",
89
- "nuxt-i18n-micro": "^3.17.0",
88
+ "nuxt": "^4.4.4",
89
+ "nuxt-i18n-micro": "^3.17.5",
90
90
  "nuxtseo-layer-devtools": "^5.1.3",
91
91
  "semver": "^7.7.4",
92
92
  "sirv": "^3.0.2",
93
93
  "std-env": "^4.1.0",
94
- "typescript": "^6.0.2",
95
- "vitest": "^4.1.4",
96
- "vue-tsc": "^3.2.6",
97
- "zod": "^4.3.6",
98
- "@nuxtjs/sitemap": "8.0.13"
94
+ "typescript": "^6.0.3",
95
+ "vitest": "^4.1.5",
96
+ "vue-tsc": "^3.2.7",
97
+ "zod": "^4.4.1",
98
+ "@nuxtjs/sitemap": "8.0.15"
99
99
  },
100
100
  "scripts": {
101
101
  "lint": "eslint .",
@@ -1 +0,0 @@
1
- import{C as e,V as t,W as n,g as r,h as i,l as a,m as o,v as s}from"./DC1C2xmT.js";import{N as c}from"./Lwa8JV_I.js";import{t as l}from"./zXxw7hoP.js";import{t as u}from"./CUZQAPQZ.js";var d={class:`space-y-5 animate-fade-up`},f=e({__name:`app-sources`,setup(e){let f=o(()=>(c.value?.globalSources||[]).filter(e=>e.sourceType===`app`));return(e,o)=>{let c=l;return t(),s(`div`,d,[o[0]||=i(`div`,null,[i(`h2`,{class:`text-lg font-semibold mb-1`},` App Sources `),i(`p`,{class:`text-xs text-[var(--color-text-muted)]`},` Automatic global sources generated from your application. `)],-1),f.value.length?(t(!0),s(a,{key:0},n(f.value,(e,n)=>(t(),r(u,{key:n,source:e},null,8,[`source`]))),128)):(t(),r(c,{key:1,title:`No app sources detected`,description:`App sources are automatically discovered from your Nuxt application routes and pages.`,icon:`carbon:bot`}))])}}});export{f as default};
@@ -1 +0,0 @@
1
- import{V as e,h as t,v as n,x as r}from"./DC1C2xmT.js";import{_ as i}from"./Lwa8JV_I.js";import{t as a}from"./CHHO6nw6.js";var o={},s={class:`flex flex-col items-center justify-center gap-3 py-20`};function c(a,o){let c=i;return e(),n(`div`,s,[r(c,{name:`carbon:circle-dash`,class:`animate-spin text-3xl text-[var(--color-text-muted)]`}),o[0]||=t(`p`,{class:`text-sm text-[var(--color-text-muted)]`},` Connecting to devtools… `,-1)])}var l=Object.assign(a(o,[[`render`,c]]),{__name:`DevtoolsLoading`});export{l as t};
@@ -1 +0,0 @@
1
- import{C as e,Ct as t,V as n,b as r,h as i,rt as a,v as o,x as s}from"./DC1C2xmT.js";import{N as c,_ as l,r as u}from"./Lwa8JV_I.js";import{t as d}from"./CYLHX1cF.js";var f={class:`space-y-5 animate-fade-up`},p={class:`opacity-80 text-base mb-1`},m=e({__name:`debug`,setup(e){return(e,m)=>{let h=l,g=d,_=u;return n(),o(`div`,f,[s(_,null,{text:a(()=>[i(`h3`,p,[s(h,{name:`carbon:settings`,class:`mr-1`}),m[0]||=r(` Runtime Config `,-1)])]),default:a(()=>[s(g,{code:JSON.stringify(t(c)?.runtimeConfig,null,2),lang:`json`,label:`Runtime Config`},null,8,[`code`])]),_:1})])}}});export{m as default};
@@ -1 +0,0 @@
1
- import{C as e,Ot as t,Tt as n,V as r,W as i,_ as a,b as o,g as s,h as c,l,m as u,rt as d,v as f,x as p}from"./DC1C2xmT.js";import{Lt as m}from"./Dn-g3ZEt.js";import{N as h,_ as g,r as _}from"./Lwa8JV_I.js";import{t as v}from"./CHHO6nw6.js";import{t as y}from"./DU2tRgIc.js";import{t as b}from"./CYLHX1cF.js";var x={class:`devtools-metric-value`},S={key:1,class:`devtools-metric-label`},C=Object.assign(v(e({__name:`DevtoolsMetric`,props:{label:{},value:{},icon:{},variant:{default:`default`}},setup(e){return(i,o)=>{let l=g;return r(),f(`div`,{class:n([`devtools-metric`,`devtools-metric-${e.variant}`])},[e.icon?(r(),s(l,{key:0,name:e.icon,class:`devtools-metric-icon`,"aria-hidden":`true`},null,8,[`name`])):a(``,!0),c(`span`,x,t(e.value),1),e.label?(r(),f(`span`,S,t(e.label),1)):a(``,!0)],2)}}}),[[`__scopeId`,`data-v-bc5e1b5f`]]),{__name:`DevtoolsMetric`}),w={class:`flex items-center gap-3`},T={key:0,class:`flex items-center gap-1.5`},E={class:`font-semibold`},D={class:`flex items-center gap-3`},O=[`href`],k={key:1,class:`text-xs text-[var(--color-text-muted)]`},A={class:`text-xs font-semibold mb-1`},j={class:`url-warnings-list`},M={class:`space-y-1`},N=[`innerHTML`],P=Object.assign(v(e({__name:`Source`,props:{source:{},showContext:{type:Boolean}},setup(e){let v=e,x=u(()=>{let e=typeof v.source.fetch==`string`?v.source.fetch:v.source.fetch[0];return e.includes(`http`)?e:m(h.value?.nitroOrigin||`localhost`,e)});function S(e){return e.replace(/`([^`]+)`/g,`<code>$1</code>`)}return(u,m)=>{let h=g,v=C,P=y,F=b,I=_;return r(),s(I,{class:n(e.source.error?`source-error`:``)},{text:d(()=>[c(`div`,w,[e.source.fetch?(r(),f(`div`,T,[p(h,{name:`carbon:api-1`,class:`text-[var(--color-text-muted)]`}),e.source.timeTakenMs?(r(),s(v,{key:0,value:e.source.timeTakenMs,label:`ms`,variant:`info`},null,8,[`value`])):a(``,!0)])):a(``,!0),c(`span`,E,t(e.source.context.name),1),p(v,{value:e.source.urls?.length||0,label:`URLs`,variant:e.source.error?`danger`:e.source.urls?.length?`success`:`warning`},null,8,[`value`,`variant`])])]),description:d(()=>[c(`div`,D,[e.source.fetch?(r(),f(`a`,{key:0,href:x.value,target:`_blank`,class:`link-external text-sm`},t(e.source.fetch),9,O)):a(``,!0),e.source.context.description?(r(),f(`span`,k,t(e.source.context.description),1)):a(``,!0)])]),default:d(()=>[e.source.error?(r(),s(P,{key:0,variant:`error`},{default:d(()=>[o(t(e.source.error),1)]),_:1})):(r(),f(l,{key:1},[e.source._urlWarnings?.length?(r(),s(P,{key:0,variant:`warning`},{default:d(()=>[c(`div`,null,[c(`div`,A,t(e.source._urlWarnings.length)+` URL warning`+t(e.source._urlWarnings.length>1?`s`:``),1),c(`ul`,j,[(r(!0),f(l,null,i(e.source._urlWarnings,(e,n)=>(r(),f(`li`,{key:n},[c(`code`,null,t(e.loc),1),o(` — `+t(e.message),1)]))),128))])])]),_:1})):a(``,!0),p(F,{code:JSON.stringify(e.source.urls,null,2),lang:`json`,label:`URLs`},null,8,[`code`])],64)),e.source.context.tips?.length?(r(),s(P,{key:2,variant:!e.source.urls?.length&&!e.source.error?`warning`:`info`},{default:d(()=>[c(`div`,null,[m[0]||=c(`h3`,{class:`text-xs font-semibold mb-1.5 text-[var(--color-text)] uppercase tracking-wide opacity-70`},` Hints `,-1),c(`ul`,M,[(r(!0),f(l,null,i(e.source.context.tips,(e,t)=>(r(),f(`li`,{key:t,class:`text-sm text-[var(--color-text-muted)] leading-relaxed`,innerHTML:S(e)},null,8,N))),128))])])]),_:1},8,[`variant`])):a(``,!0)]),_:1},8,[`class`])}}}),[[`__scopeId`,`data-v-ca804ac3`]]),{__name:`Source`});export{C as n,P as t};