nuxt-ai-ready 1.3.8 → 1.4.0

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 (41) hide show
  1. package/dist/devtools/lib/ai-ready/rpc.ts +6 -0
  2. package/dist/devtools/lib/ai-ready/state.ts +21 -0
  3. package/dist/devtools/lib/ai-ready/types.ts +50 -0
  4. package/dist/devtools/nuxt.config.ts +3 -0
  5. package/dist/devtools/pages/ai-ready/debug.vue +27 -0
  6. package/dist/devtools/pages/ai-ready/docs.vue +3 -0
  7. package/dist/devtools/pages/ai-ready/index.vue +177 -0
  8. package/dist/devtools/pages/ai-ready/llms-txt.vue +172 -0
  9. package/dist/devtools/pages/ai-ready.vue +50 -0
  10. package/dist/module.json +1 -1
  11. package/dist/module.mjs +1 -1
  12. package/dist/runtime/llms-txt-utils.js +16 -5
  13. package/dist/runtime/server/db/drizzle/providers/bun.js +2 -11
  14. package/dist/runtime/server/db/drizzle/providers/dbPath.d.ts +14 -0
  15. package/dist/runtime/server/db/drizzle/providers/dbPath.js +47 -0
  16. package/dist/runtime/server/db/drizzle/providers/sqlite.js +2 -11
  17. package/dist/runtime/server/utils/runCron.js +1 -1
  18. package/dist/runtime/server/utils/sitemap.d.ts +1 -1
  19. package/dist/runtime/server/utils/sitemap.js +36 -6
  20. package/package.json +14 -14
  21. package/dist/devtools/200.html +0 -1
  22. package/dist/devtools/404.html +0 -1
  23. package/dist/devtools/_nuxt/B75sBxVw.js +0 -1
  24. package/dist/devtools/_nuxt/C5qFqPjv.js +0 -2
  25. package/dist/devtools/_nuxt/CUvdyac7.js +0 -1
  26. package/dist/devtools/_nuxt/D9Lze2B3.js +0 -1
  27. package/dist/devtools/_nuxt/D9pLQdnz.js +0 -38
  28. package/dist/devtools/_nuxt/DevtoolsPanel.BTjFkHvn.css +0 -1
  29. package/dist/devtools/_nuxt/DiEjVMsr.js +0 -1
  30. package/dist/devtools/_nuxt/Es9IinpI.js +0 -1
  31. package/dist/devtools/_nuxt/builds/latest.json +0 -1
  32. package/dist/devtools/_nuxt/builds/meta/a7036984-939c-4a2e-b19f-205f8859db8a.json +0 -1
  33. package/dist/devtools/_nuxt/entry.C01PFCnM.css +0 -1
  34. package/dist/devtools/_nuxt/fira-code.Bc8wnsZt.woff2 +0 -0
  35. package/dist/devtools/_nuxt/hubot-sans.DLGyhQVu.woff2 +0 -0
  36. package/dist/devtools/_nuxt/index.Cz-FJ6Du.css +0 -1
  37. package/dist/devtools/debug/index.html +0 -1
  38. package/dist/devtools/docs/index.html +0 -1
  39. package/dist/devtools/index.html +0 -1
  40. package/dist/devtools/llms-txt/index.html +0 -1
  41. package/dist/devtools/pages/index.html +0 -1
@@ -1,23 +1,14 @@
1
- import { mkdir } from "node:fs/promises";
2
1
  import Database from "better-sqlite3";
3
2
  import { drizzle } from "drizzle-orm/better-sqlite3";
4
3
  import { useRuntimeConfig } from "nitropack/runtime";
5
- import { dirname } from "pathe";
6
4
  import * as schema from "#ai-ready-virtual/db-schema.mjs";
7
5
  import { logger } from "../../../logger.js";
8
6
  import { registerDriver } from "../raw.js";
7
+ import { resolveWritableDbPath } from "./dbPath.js";
9
8
  export async function createClient(event) {
10
9
  const config = useRuntimeConfig(event)["nuxt-ai-ready"];
11
- const dbPath = config.database.filename || ".data/ai-ready/pages.db";
10
+ const dbPath = await resolveWritableDbPath(config.database.filename || ".data/ai-ready/pages.db");
12
11
  logger.debug(`[drizzle] Opening SQLite database: ${dbPath}`);
13
- await mkdir(dirname(dbPath), { recursive: true }).catch((err) => {
14
- if (err.code === "EROFS" || err.code === "EACCES") {
15
- throw new Error(
16
- `[ai-ready] Cannot create database directory (read-only filesystem). On Vercel, set database.type: 'neon'. On Cloudflare, use 'd1'. Or configure database.url for LibSQL/Turso.`
17
- );
18
- }
19
- throw err;
20
- });
21
12
  const sqlite = new Database(dbPath);
22
13
  const db = drizzle(sqlite, { schema });
23
14
  registerDriver(db, "better-sqlite3", sqlite);
@@ -175,7 +175,7 @@ async function pingSitemap(event, config, debug) {
175
175
  await markSitemapCrawled(event, nextSitemap.name, urls.length);
176
176
  }
177
177
  let pruned = 0;
178
- if (pruneTtl > 0) {
178
+ if (pruneTtl > 0 && !error) {
179
179
  pruned = await pruneStaleRoutes(event, pruneTtl);
180
180
  }
181
181
  return {
@@ -20,7 +20,7 @@ export declare function hasMultipleSitemaps(event: H3Event): boolean;
20
20
  * Fetch and parse a single sitemap by route
21
21
  * Supports both request context (event.$fetch) and cron context (ASSETS.fetch or globalThis.$fetch)
22
22
  */
23
- export declare function fetchSitemapByRoute(event: H3Event | undefined, route: string): Promise<{
23
+ export declare function fetchSitemapByRoute(event: H3Event | undefined, route: string, depth?: number): Promise<{
24
24
  urls: SitemapUrl[];
25
25
  error?: string;
26
26
  }>;
@@ -1,4 +1,4 @@
1
- import { parseSitemapXml } from "@nuxtjs/sitemap/utils";
1
+ import { isSitemapIndex, parseSitemapIndex, parseSitemapXml } from "@nuxtjs/sitemap/utils";
2
2
  import { useRuntimeConfig } from "nitropack/runtime";
3
3
  import { withLeadingSlash } from "ufo";
4
4
  import { logger } from "../logger.js";
@@ -37,7 +37,7 @@ function normalizeUrls(urls) {
37
37
  };
38
38
  });
39
39
  }
40
- export async function fetchSitemapByRoute(event, route) {
40
+ export async function fetchSitemapByRoute(event, route, depth = 0) {
41
41
  const config = useRuntimeConfig(event)["nuxt-ai-ready"];
42
42
  const fetchRoute = withLeadingSlash(route);
43
43
  const usePublicAsset = config.sitemapPrerendered && hasAssets(event);
@@ -68,6 +68,38 @@ export async function fetchSitemapByRoute(event, route) {
68
68
  }
69
69
  }
70
70
  logger.debug(`[sitemap] Parsing sitemap XML (${sitemapXml.length} bytes)`);
71
+ if (isSitemapIndex(sitemapXml)) {
72
+ if (depth >= 3) {
73
+ logger.warn(`[sitemap] Sitemap index nesting too deep at ${fetchRoute}, stopping`);
74
+ return { urls: [] };
75
+ }
76
+ let index;
77
+ try {
78
+ index = await parseSitemapIndex(sitemapXml);
79
+ } catch (e) {
80
+ const msg = e instanceof Error ? e.message : String(e);
81
+ logger.warn(`[sitemap] Failed to parse sitemap index ${fetchRoute}: ${msg}`);
82
+ return { urls: [], error: msg };
83
+ }
84
+ logger.debug(`[sitemap] ${fetchRoute} is a sitemap index with ${index.entries.length} children`);
85
+ const allUrls = [];
86
+ const childErrors = [];
87
+ for (const entry of index.entries) {
88
+ const childRoute = entry.loc.startsWith("http") ? new URL(entry.loc).pathname : entry.loc;
89
+ if (withLeadingSlash(childRoute) === fetchRoute)
90
+ continue;
91
+ const { urls: urls2, error } = await fetchSitemapByRoute(event, childRoute, depth + 1);
92
+ allUrls.push(...urls2);
93
+ if (error)
94
+ childErrors.push(`${withLeadingSlash(childRoute)}: ${error}`);
95
+ }
96
+ if (childErrors.length > 0) {
97
+ const msg = `${childErrors.length}/${index.entries.length} child sitemaps failed (${childErrors.join("; ")})`;
98
+ logger.warn(`[sitemap] Sitemap index ${fetchRoute}: ${msg}`);
99
+ return { urls: allUrls, error: msg };
100
+ }
101
+ return { urls: allUrls };
102
+ }
71
103
  let result;
72
104
  try {
73
105
  result = await parseSitemapXml(sitemapXml);
@@ -86,10 +118,8 @@ export async function fetchSitemapUrls(event) {
86
118
  logger.debug(`[sitemap] Multi-sitemap mode: ${sitemaps.length} sitemaps`);
87
119
  const allUrls = [];
88
120
  for (const sitemap of sitemaps) {
89
- const { urls: urls2, error: error2 } = await fetchSitemapByRoute(event, sitemap.route);
90
- if (!error2) {
91
- allUrls.push(...urls2);
92
- }
121
+ const { urls: urls2 } = await fetchSitemapByRoute(event, sitemap.route);
122
+ allUrls.push(...urls2);
93
123
  }
94
124
  return allUrls;
95
125
  }
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "nuxt-ai-ready",
3
3
  "type": "module",
4
- "version": "1.3.8",
4
+ "version": "1.4.0",
5
5
  "description": "Best practice AI & LLM discoverability for Nuxt sites.",
6
6
  "author": {
7
7
  "name": "Harlan Wilton",
@@ -57,15 +57,15 @@
57
57
  }
58
58
  },
59
59
  "dependencies": {
60
- "@mdream/js": "^1.2.2",
61
- "@nuxt/kit": "^4.4.7",
60
+ "@mdream/js": "^1.3.0",
61
+ "@nuxt/kit": "^4.4.8",
62
62
  "citty": "^0.2.2",
63
63
  "consola": "^3.4.2",
64
64
  "defu": "^6.1.7",
65
65
  "drizzle-orm": "^0.45.2",
66
- "mdream": "^1.2.2",
67
- "nuxt-site-config": "^4.0.8",
68
- "nuxtseo-shared": "^5.1.3",
66
+ "mdream": "^1.3.0",
67
+ "nuxt-site-config": "^4.1.0",
68
+ "nuxtseo-shared": "^5.2.6",
69
69
  "pathe": "^2.0.3",
70
70
  "pkg-types": "^2.3.1",
71
71
  "site-config-stack": "^4.0.8",
@@ -82,7 +82,7 @@
82
82
  "@nuxtjs/eslint-config-typescript": "^12.1.0",
83
83
  "@nuxtjs/mcp-toolkit": "^0.17.2",
84
84
  "@nuxtjs/robots": "^6.0.9",
85
- "@nuxtjs/sitemap": "^8.0.15",
85
+ "@nuxtjs/sitemap": "^8.2.0",
86
86
  "@types/better-sqlite3": "^7.6.13",
87
87
  "@vitest/coverage-v8": "^4.1.8",
88
88
  "@vue/test-utils": "^2.4.11",
@@ -94,8 +94,9 @@
94
94
  "execa": "^9.6.1",
95
95
  "happy-dom": "^20.10.2",
96
96
  "nitropack": "^2.13.4",
97
- "nuxt": "^4.4.7",
98
- "nuxt-site-config": "^4.0.8",
97
+ "nuxt": "^4.4.8",
98
+ "nuxt-site-config": "^4.1.0",
99
+ "nuxtseo-layer-devtools": "^5.2.6",
99
100
  "playwright": "^1.60.0",
100
101
  "playwright-core": "^1.60.0",
101
102
  "tinyglobby": "^0.2.17",
@@ -104,22 +105,21 @@
104
105
  "vitest": "^4.1.8",
105
106
  "vue": "^3.5.35",
106
107
  "vue-router": "^5.1.0",
107
- "vue-tsc": "^3.3.3",
108
- "wrangler": "^4.98.0",
108
+ "vue-tsc": "^3.3.4",
109
+ "wrangler": "^4.99.0",
109
110
  "zod": "^4.4.3"
110
111
  },
111
112
  "scripts": {
112
113
  "lint": "eslint .",
113
114
  "lint:fix": "eslint . --fix",
114
115
  "build": "nuxt-module-build build --stub && nuxt-module-build prepare && nuxt-module-build build && pnpm run build:devtools",
115
- "build:devtools": "nuxt generate devtools",
116
+ "build:devtools": "node -e \"require('fs').cpSync('devtools','dist/devtools',{recursive:true})\"",
116
117
  "dev": "nuxt dev playground",
117
118
  "dev:minimal": "nuxt dev playground",
118
- "devtools": "nuxt dev devtools --port 3030",
119
119
  "prepare:fixtures": "nuxt prepare playground && nuxt prepare playground && nuxt prepare test/fixtures/basic",
120
120
  "dev:build": "nuxt build playground",
121
121
  "dev:build:minimal": "nuxt build playground",
122
- "dev:prepare": "nuxt-module-build build --stub && nuxt-module-build prepare && nuxt-module-build build && nuxt prepare playground",
122
+ "dev:prepare": "nuxt-module-build build --stub && nuxt-module-build prepare && nuxt-module-build build && nuxt prepare playground && pnpm run build:devtools",
123
123
  "dev:prepare:minimal": "nuxt-module-build build --stub && nuxt-module-build prepare && nuxt-module-build build && nuxt prepare playground",
124
124
  "release": "pnpm build && bumpp -x \"npx changelogen --output=CHANGELOG.md\"",
125
125
  "test": "pnpm run prepare:fixtures && vitest",
@@ -1 +0,0 @@
1
- <!DOCTYPE html><html><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1"><link rel="stylesheet" href="/__nuxt-ai-ready/_nuxt/entry.C01PFCnM.css" crossorigin><link rel="modulepreload" as="script" crossorigin href="/__nuxt-ai-ready/_nuxt/D9pLQdnz.js"><script type="module" src="/__nuxt-ai-ready/_nuxt/D9pLQdnz.js" crossorigin></script><script>"use strict";(()=>{const t=window,e=document.documentElement,c=["dark","light"],n=getStorageValue("localStorage","nuxt-color-mode")||"system";let i=n==="system"?u():n;const r=e.getAttribute("data-color-mode-forced");r&&(i=r),l(i),t["__NUXT_COLOR_MODE__"]={preference:n,value:i,getColorScheme:u,addColorScheme:l,removeColorScheme:d};function l(o){const s=""+o+"",a="";e.classList?e.classList.add(s):e.className+=" "+s,a&&e.setAttribute("data-"+a,o)}function d(o){const s=""+o+"",a="";e.classList?e.classList.remove(s):e.className=e.className.replace(new RegExp(s,"g"),""),a&&e.removeAttribute("data-"+a)}function f(o){return t.matchMedia("(prefers-color-scheme"+o+")")}function u(){if(t.matchMedia&&f("").media!=="not all"){for(const o of c)if(f(":"+o).matches)return o}return"light"}})();function getStorageValue(t,e){switch(t){case"localStorage":return window.localStorage.getItem(e);case"sessionStorage":return window.sessionStorage.getItem(e);case"cookie":return getCookie(e);default:return null}}function getCookie(t){const c=("; "+window.document.cookie).split("; "+t+"=");if(c.length===2)return c.pop()?.split(";").shift()}</script></head><body><div id="__nuxt" class="isolate"></div><div id="teleports"></div><script>window.__NUXT__={};window.__NUXT__.config={public:{},app:{baseURL:"/__nuxt-ai-ready",buildId:"a7036984-939c-4a2e-b19f-205f8859db8a",buildAssetsDir:"/_nuxt/",cdnURL:""}}</script><script type="application/json" data-nuxt-data="nuxt-app" data-ssr="false" id="__NUXT_DATA__">[{"prerenderedAt":1,"serverRendered":2},1780943714221,false]</script></body></html>
@@ -1 +0,0 @@
1
- <!DOCTYPE html><html><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1"><link rel="stylesheet" href="/__nuxt-ai-ready/_nuxt/entry.C01PFCnM.css" crossorigin><link rel="modulepreload" as="script" crossorigin href="/__nuxt-ai-ready/_nuxt/D9pLQdnz.js"><script type="module" src="/__nuxt-ai-ready/_nuxt/D9pLQdnz.js" crossorigin></script><script>"use strict";(()=>{const t=window,e=document.documentElement,c=["dark","light"],n=getStorageValue("localStorage","nuxt-color-mode")||"system";let i=n==="system"?u():n;const r=e.getAttribute("data-color-mode-forced");r&&(i=r),l(i),t["__NUXT_COLOR_MODE__"]={preference:n,value:i,getColorScheme:u,addColorScheme:l,removeColorScheme:d};function l(o){const s=""+o+"",a="";e.classList?e.classList.add(s):e.className+=" "+s,a&&e.setAttribute("data-"+a,o)}function d(o){const s=""+o+"",a="";e.classList?e.classList.remove(s):e.className=e.className.replace(new RegExp(s,"g"),""),a&&e.removeAttribute("data-"+a)}function f(o){return t.matchMedia("(prefers-color-scheme"+o+")")}function u(){if(t.matchMedia&&f("").media!=="not all"){for(const o of c)if(f(":"+o).matches)return o}return"light"}})();function getStorageValue(t,e){switch(t){case"localStorage":return window.localStorage.getItem(e);case"sessionStorage":return window.sessionStorage.getItem(e);case"cookie":return getCookie(e);default:return null}}function getCookie(t){const c=("; "+window.document.cookie).split("; "+t+"=");if(c.length===2)return c.pop()?.split(";").shift()}</script></head><body><div id="__nuxt" class="isolate"></div><div id="teleports"></div><script>window.__NUXT__={};window.__NUXT__.config={public:{},app:{baseURL:"/__nuxt-ai-ready",buildId:"a7036984-939c-4a2e-b19f-205f8859db8a",buildAssetsDir:"/_nuxt/",cdnURL:""}}</script><script type="application/json" data-nuxt-data="nuxt-app" data-ssr="false" id="__NUXT_DATA__">[{"prerenderedAt":1,"serverRendered":2},1780943714221,false]</script></body></html>
@@ -1 +0,0 @@
1
- import{d as m,o as s,c as a,b as n,a as f,s as u,n as v,t as d,C as l,z as $,e as o,g as p,h as r,D as h}from"./D9pLQdnz.js";const y={class:"devtools-empty"},b={class:"devtools-empty-title"},k={key:0,class:"devtools-empty-description"},g={key:1,class:"devtools-empty-actions"},B=m({__name:"DevtoolsEmptyState",props:{icon:{default:"carbon:search"},title:{},description:{},variant:{default:"default"}},setup(e){return(t,c)=>{const i=u;return s(),a("div",y,[n("div",{class:v(["devtools-empty-icon",`devtools-empty-icon-${e.variant}`])},[f(i,{name:e.icon,class:"w-8 h-8","aria-hidden":"true"},null,8,["name"])],2),n("h2",b,d(e.title),1),e.description||t.$slots.description?(s(),a("p",k,[l(t.$slots,"description",{},()=>[$(d(e.description),1)],!0)])):o("",!0),t.$slots.default?(s(),a("div",g,[l(t.$slots,"default",{},void 0,!0)])):o("",!0)])}}}),j=Object.assign(p(B,[["__scopeId","data-v-2cf7af5e"]]),{__name:"DevtoolsEmptyState"}),C={class:"devtools-panel"},D={key:0,class:"devtools-panel-header"},I={class:"flex items-center gap-2"},N={class:"devtools-panel-title"},S={key:0,class:"devtools-panel-actions"},V=m({__name:"DevtoolsPanel",props:{title:{},closable:{type:Boolean,default:!1},icon:{},padding:{type:Boolean,default:!0}},emits:["close"],setup(e){return(t,c)=>{const i=u,_=h;return s(),a("div",C,[e.title||t.$slots.header?(s(),a("div",D,[l(t.$slots,"header",{},()=>[n("div",I,[e.icon?(s(),r(i,{key:0,name:e.icon,class:"text-sm text-[var(--color-text-muted)]"},null,8,["name"])):o("",!0),n("span",N,d(e.title),1)])],!0),e.closable||t.$slots.actions?(s(),a("div",S,[l(t.$slots,"actions",{},void 0,!0),e.closable?(s(),r(_,{key:0,icon:"carbon:close","aria-label":"Close panel",onClick:c[0]||(c[0]=E=>t.$emit("close"))})):o("",!0)])):o("",!0)])):o("",!0),n("div",{class:v(["devtools-panel-content",e.padding?"p-3":""])},[l(t.$slots,"default",{},void 0,!0)],2)])}}}),z=Object.assign(p(V,[["__scopeId","data-v-99badccb"]]),{__name:"DevtoolsPanel"});export{j as _,z as a};
@@ -1,2 +0,0 @@
1
- import{d as E,i as G,G as L,u as C,j as u,r as T,o as t,c as e,b as n,F as _,k as h,n as q,t as i,l as S,m as I,h as A,w as y,p as K,e as g,a as m,q as M,s as R,_ as U,f as v,v as H}from"./D9pLQdnz.js";import{_ as J}from"./DiEjVMsr.js";import{_ as O,a as Q}from"./B75sBxVw.js";const W={class:"space-y-4"},X={class:"flex items-center gap-2"},Y=["onClick"],Z={key:0,class:"py-8 text-center"},tt={key:0,class:"relative"},et={class:"text-xs font-mono whitespace-pre-wrap p-4 rounded-lg bg-[var(--color-surface-sunken)] text-[var(--color-text)] overflow-auto max-h-[600px]"},ot={key:1,class:"relative"},st={class:"text-xs font-mono whitespace-pre-wrap p-4 rounded-lg bg-[var(--color-surface-sunken)] text-[var(--color-text-muted)] overflow-auto max-h-[600px]"},nt={key:0,class:"space-y-3"},lt={class:"text-sm font-semibold text-[var(--color-text)] mb-1"},at={key:0,class:"space-y-1 mt-2"},rt={class:"font-medium text-[var(--color-text)]"},ct={key:0,class:"text-[var(--color-text-muted)]"},it={class:"font-mono text-[var(--color-text-subtle)]"},ut={key:1,class:"text-xs text-[var(--color-text-muted)]"},vt=E({__name:"llms-txt",setup(dt){const k=G(L),b=v(()=>k?.value?.isDev??!0),x=v(()=>k?.value?.llmsTxt),r=H("llms-txt"),{data:$}=C("llms-txt-content",async()=>{if(!u.value)return null;try{return await u.value("/llms.txt",{responseType:"text"})}catch{return null}},{watch:[u,T]}),{data:N,status:B}=C("llms-full-content",async()=>{if(!u.value||r.value!=="llms-full")return null;try{return await u.value("/llms-full.txt",{responseType:"text"})}catch{return null}},{watch:[u,T,r]}),f=v(()=>r.value==="llms-full"?N.value:$.value),w=v(()=>{const c=x.value;if(!c)return"";const l=["# {Site Name}","","> {Site Description}",""];for(const o of c.sections||[]){if(l.push(`## ${o.title}`),o.description){const s=Array.isArray(o.description)?o.description:[o.description];for(const d of s)l.push("",d)}for(const s of o.links||[]){const d=s.description?`: ${s.description}`:"";l.push(`- [${s.title}](${s.href})${d}`)}l.push("")}if(c.notes){const o=Array.isArray(c.notes)?c.notes:[c.notes];for(const s of o)l.push(s)}return l.join(`
2
- `)});return(c,l)=>{const o=K,s=M,d=J,F=O,P=Q,j=R,V=U;return t(),e("div",W,[n("div",X,[(t(),e(_,null,h([{key:"llms-txt",label:"llms.txt"},{key:"llms-full",label:"llms-full.txt"}],a=>n("button",{key:a.key,type:"button",class:q(["px-3 py-1.5 text-xs font-medium rounded-md transition-all cursor-pointer",r.value===a.key?"bg-[var(--seo-green)] text-white":"bg-[var(--color-surface-elevated)] text-[var(--color-text-muted)] hover:text-[var(--color-text)]"]),onClick:D=>r.value=a.key},i(a.label),11,Y)),64))]),b.value&&!S(I)?(t(),A(o,{key:0,variant:"info"},{default:y(()=>[...l[0]||(l[0]=[n("p",{class:"font-medium mb-1"}," Template Preview ",-1),n("p",{class:"text-sm opacity-80"}," This shows the llms.txt structure from your config. Actual content with page data is generated during prerendering. Switch to production mode to see live content. ",-1)])]),_:1})):g("",!0),m(P,{title:r.value==="llms-txt"?"llms.txt":"llms-full.txt"},{default:y(()=>[r.value==="llms-full"&&S(B)==="pending"?(t(),e("div",Z,[m(s)])):(t(),e(_,{key:1},[f.value?(t(),e("div",tt,[m(d,{text:f.value,class:"absolute top-2 right-2 z-10"},null,8,["text"]),n("pre",et,i(f.value),1)])):b.value&&w.value?(t(),e("div",ot,[n("pre",st,i(w.value),1)])):(t(),A(F,{key:2,icon:"carbon:document",title:"No content available",description:"llms.txt content is generated during prerendering. Run `nuxi generate` or switch to production mode."}))],64))]),_:1},8,["title"]),m(V,{text:"Configured Sections",icon:"carbon:list-boxes"},{default:y(()=>[x.value?.sections?.length?(t(),e("div",nt,[(t(!0),e(_,null,h(x.value.sections,(a,D)=>(t(),e("div",{key:D,class:"p-3 rounded-lg bg-[var(--color-surface-elevated)] border border-[var(--color-border)]"},[n("h4",lt,i(a.title),1),a.links?.length?(t(),e("div",at,[(t(!0),e(_,null,h(a.links,(p,z)=>(t(),e("div",{key:z,class:"flex items-start gap-2 text-xs"},[m(j,{name:"carbon:link",class:"w-3 h-3 mt-0.5 text-[var(--color-text-muted)]"}),n("div",null,[n("span",rt,i(p.title),1),p.description?(t(),e("span",ct,", "+i(p.description),1)):g("",!0),n("div",it,i(p.href),1)])]))),128))])):g("",!0)]))),128))])):(t(),e("p",ut," No custom sections configured. "))]),_:1})])}}});export{vt as default};
@@ -1 +0,0 @@
1
- import{d as s,o as t,c as n,b as l,g as r,h as a}from"./D9pLQdnz.js";const _={class:"h-full max-h-full overflow-hidden"},u=["src","title"],i=s({__name:"DevtoolsDocs",props:{url:{}},setup(e){return(c,o)=>(t(),n("div",_,[l("iframe",{src:e.url,title:`Documentation - ${e.url}`,class:"w-full h-full border-none",style:{"min-height":"calc(100vh - 100px)"}},null,8,u)]))}}),m=Object.assign(i,{__name:"DevtoolsDocs"}),d={};function f(e,c){const o=m;return t(),a(o,{url:"https://nuxtseo.com/ai-ready"})}const p=r(d,[["render",f]]);export{p as default};
@@ -1 +0,0 @@
1
- import{_ as f}from"./DiEjVMsr.js";import{d as m,i as g,G as h,o as s,c as a,a as e,w as i,b as p,t as _,e as x,_ as b,f as t}from"./D9pLQdnz.js";const w={class:"space-y-4"},y={key:0,class:"relative"},k={class:"text-xs font-mono whitespace-pre-wrap p-4 rounded-lg bg-[var(--color-surface-sunken)] text-[var(--color-text)] overflow-auto max-h-[400px]"},C={key:0,class:"relative"},J={class:"text-xs font-mono whitespace-pre-wrap p-4 rounded-lg bg-[var(--color-surface-sunken)] text-[var(--color-text)] overflow-auto max-h-[400px]"},N={key:0,class:"relative"},D={class:"text-xs font-mono whitespace-pre-wrap p-4 rounded-lg bg-[var(--color-surface-sunken)] text-[var(--color-text)] overflow-auto max-h-[600px]"},V=m({__name:"debug",setup(S){const o=g(h),v=t(()=>o?.value?.config),d=t(()=>o?.value?.llmsTxt),n=t(()=>v.value?JSON.stringify(v.value,null,2):""),l=t(()=>d.value?JSON.stringify(d.value,null,2):""),r=t(()=>o?.value?JSON.stringify(o.value,null,2):"");return(B,z)=>{const c=f,u=b;return s(),a("div",w,[e(u,{text:"Module Config",icon:"carbon:settings",open:!0},{default:i(()=>[n.value?(s(),a("div",y,[e(c,{text:n.value,class:"absolute top-2 right-2 z-10"},null,8,["text"]),p("pre",k,_(n.value),1)])):x("",!0)]),_:1}),e(u,{text:"llms.txt Config",icon:"carbon:document",open:!0},{default:i(()=>[l.value?(s(),a("div",C,[e(c,{text:l.value,class:"absolute top-2 right-2 z-10"},null,8,["text"]),p("pre",J,_(l.value),1)])):x("",!0)]),_:1}),e(u,{text:"Full Response",icon:"carbon:code",open:!1},{default:i(()=>[r.value?(s(),a("div",N,[e(c,{text:r.value,class:"absolute top-2 right-2 z-10"},null,8,["text"]),p("pre",D,_(r.value),1)])):x("",!0)]),_:1})])}}});export{V as default};