nuxt-ai-ready 1.3.8 → 1.3.9
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.
- package/dist/devtools/200.html +1 -1
- package/dist/devtools/404.html +1 -1
- package/dist/devtools/_nuxt/builds/latest.json +1 -1
- package/dist/devtools/_nuxt/builds/meta/f26345f8-0602-46ab-916a-0529f3a14be9.json +1 -0
- package/dist/devtools/debug/index.html +1 -1
- package/dist/devtools/docs/index.html +1 -1
- package/dist/devtools/index.html +1 -1
- package/dist/devtools/llms-txt/index.html +1 -1
- package/dist/devtools/pages/index.html +1 -1
- package/dist/module.json +1 -1
- package/dist/runtime/llms-txt-utils.js +16 -5
- package/dist/runtime/server/db/drizzle/providers/bun.js +2 -11
- package/dist/runtime/server/db/drizzle/providers/dbPath.d.ts +14 -0
- package/dist/runtime/server/db/drizzle/providers/dbPath.js +47 -0
- package/dist/runtime/server/db/drizzle/providers/sqlite.js +2 -11
- package/dist/runtime/server/utils/runCron.js +1 -1
- package/dist/runtime/server/utils/sitemap.d.ts +1 -1
- package/dist/runtime/server/utils/sitemap.js +36 -6
- package/package.json +1 -1
- package/dist/devtools/_nuxt/builds/meta/a7036984-939c-4a2e-b19f-205f8859db8a.json +0 -1
package/dist/devtools/200.html
CHANGED
|
@@ -1 +1 @@
|
|
|
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:"
|
|
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:"f26345f8-0602-46ab-916a-0529f3a14be9",buildAssetsDir:"/_nuxt/",cdnURL:""}}</script><script type="application/json" data-nuxt-data="nuxt-app" data-ssr="false" id="__NUXT_DATA__">[{"prerenderedAt":1,"serverRendered":2},1780973881640,false]</script></body></html>
|
package/dist/devtools/404.html
CHANGED
|
@@ -1 +1 @@
|
|
|
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:"
|
|
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:"f26345f8-0602-46ab-916a-0529f3a14be9",buildAssetsDir:"/_nuxt/",cdnURL:""}}</script><script type="application/json" data-nuxt-data="nuxt-app" data-ssr="false" id="__NUXT_DATA__">[{"prerenderedAt":1,"serverRendered":2},1780973881640,false]</script></body></html>
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"id":"
|
|
1
|
+
{"id":"f26345f8-0602-46ab-916a-0529f3a14be9","timestamp":1780973873481}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"id":"f26345f8-0602-46ab-916a-0529f3a14be9","timestamp":1780973873481,"prerendered":[]}
|
|
@@ -1 +1 @@
|
|
|
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:"
|
|
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:"f26345f8-0602-46ab-916a-0529f3a14be9",buildAssetsDir:"/_nuxt/",cdnURL:""}}</script><script type="application/json" data-nuxt-data="nuxt-app" data-ssr="false" id="__NUXT_DATA__">[{"prerenderedAt":1,"serverRendered":2},1780973881638,false]</script></body></html>
|
|
@@ -1 +1 @@
|
|
|
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:"
|
|
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:"f26345f8-0602-46ab-916a-0529f3a14be9",buildAssetsDir:"/_nuxt/",cdnURL:""}}</script><script type="application/json" data-nuxt-data="nuxt-app" data-ssr="false" id="__NUXT_DATA__">[{"prerenderedAt":1,"serverRendered":2},1780973881639,false]</script></body></html>
|
package/dist/devtools/index.html
CHANGED
|
@@ -1 +1 @@
|
|
|
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:"
|
|
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:"f26345f8-0602-46ab-916a-0529f3a14be9",buildAssetsDir:"/_nuxt/",cdnURL:""}}</script><script type="application/json" data-nuxt-data="nuxt-app" data-ssr="false" id="__NUXT_DATA__">[{"prerenderedAt":1,"serverRendered":2},1780973881640,false]</script></body></html>
|
|
@@ -1 +1 @@
|
|
|
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:"
|
|
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:"f26345f8-0602-46ab-916a-0529f3a14be9",buildAssetsDir:"/_nuxt/",cdnURL:""}}</script><script type="application/json" data-nuxt-data="nuxt-app" data-ssr="false" id="__NUXT_DATA__">[{"prerenderedAt":1,"serverRendered":2},1780973881639,false]</script></body></html>
|
|
@@ -1 +1 @@
|
|
|
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:"
|
|
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:"f26345f8-0602-46ab-916a-0529f3a14be9",buildAssetsDir:"/_nuxt/",cdnURL:""}}</script><script type="application/json" data-nuxt-data="nuxt-app" data-ssr="false" id="__NUXT_DATA__">[{"prerenderedAt":1,"serverRendered":2},1780973881639,false]</script></body></html>
|
package/dist/module.json
CHANGED
|
@@ -2,6 +2,7 @@ import { useRuntimeConfig } from "nitropack/runtime";
|
|
|
2
2
|
import { getSiteConfig } from "#site-config/server/composables/getSiteConfig";
|
|
3
3
|
import { normalizeLlmsTxtConfig } from "./llms-txt-format.js";
|
|
4
4
|
import { queryPages } from "./server/db/queries.js";
|
|
5
|
+
import { logger } from "./server/logger.js";
|
|
5
6
|
import { localePath, resolveLocaleFromRoute } from "./server/utils/i18n.js";
|
|
6
7
|
import { fetchSitemapUrls } from "./server/utils/sitemap.js";
|
|
7
8
|
export { normalizeLlmsTxtConfig };
|
|
@@ -141,11 +142,21 @@ Canonical Origin: ${siteConfig.url}`);
|
|
|
141
142
|
parts.push(normalizedContent);
|
|
142
143
|
parts.push("");
|
|
143
144
|
}
|
|
144
|
-
const
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
145
|
+
const urlsPromise = fetchSitemapUrls(event);
|
|
146
|
+
let pages = [];
|
|
147
|
+
let errorPages = [];
|
|
148
|
+
try {
|
|
149
|
+
;
|
|
150
|
+
[pages, errorPages] = await Promise.all([
|
|
151
|
+
queryPages(event),
|
|
152
|
+
queryPages(event, { where: { hasError: true } })
|
|
153
|
+
]);
|
|
154
|
+
} catch (err) {
|
|
155
|
+
logger.warn(
|
|
156
|
+
`[ai-ready] Database unavailable for llms.txt, falling back to sitemap-only pages: ${err instanceof Error ? err.message : String(err)}`
|
|
157
|
+
);
|
|
158
|
+
}
|
|
159
|
+
const urls = await urlsPromise;
|
|
149
160
|
const seenPaths = /* @__PURE__ */ new Set();
|
|
150
161
|
const errorSet = new Set(errorPages.map((p) => p.route));
|
|
151
162
|
const prerendered = [];
|
|
@@ -1,23 +1,14 @@
|
|
|
1
|
-
import { mkdir } from "node:fs/promises";
|
|
2
1
|
import { Database } from "bun:sqlite";
|
|
3
2
|
import { drizzle } from "drizzle-orm/bun-sqlite";
|
|
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 Bun 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);
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Resolve a writable path for a file-based SQLite database, returning the path
|
|
3
|
+
* to actually open.
|
|
4
|
+
*
|
|
5
|
+
* On a read-only filesystem (read-only Docker container, serverless bundle) the
|
|
6
|
+
* configured directory cannot be written. Rather than crash every request, fall
|
|
7
|
+
* back to a temp dir so runtime indexing keeps working. The fallback is
|
|
8
|
+
* namespaced by a hash of the absolute configured path so unrelated apps sharing
|
|
9
|
+
* the OS temp dir do not open the same SQLite file (the tables are package-global
|
|
10
|
+
* and not namespaced per site). The fallback database is ephemeral and reseeded
|
|
11
|
+
* from the prerendered dump / sitemap on cold start, so this is a safe
|
|
12
|
+
* degradation for the SSR indexing model.
|
|
13
|
+
*/
|
|
14
|
+
export declare function resolveWritableDbPath(dbPath: string): Promise<string>;
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import { createHash } from "node:crypto";
|
|
2
|
+
import { mkdir, rm, writeFile } from "node:fs/promises";
|
|
3
|
+
import { tmpdir } from "node:os";
|
|
4
|
+
import { dirname, join, resolve } from "pathe";
|
|
5
|
+
import { logger } from "../../../logger.js";
|
|
6
|
+
const resolved = /* @__PURE__ */ new Map();
|
|
7
|
+
async function ensureWritableDir(dir) {
|
|
8
|
+
const mkErr = await mkdir(dir, { recursive: true }).then(() => null).catch((e) => e);
|
|
9
|
+
if (mkErr)
|
|
10
|
+
return mkErr;
|
|
11
|
+
const probe = join(dir, ".ai-ready-write-test");
|
|
12
|
+
const writeErr = await writeFile(probe, "").then(() => null).catch((e) => e);
|
|
13
|
+
if (writeErr)
|
|
14
|
+
return writeErr;
|
|
15
|
+
await rm(probe, { force: true }).catch(() => null);
|
|
16
|
+
return null;
|
|
17
|
+
}
|
|
18
|
+
function isReadOnly(err) {
|
|
19
|
+
return err.code === "EROFS" || err.code === "EACCES";
|
|
20
|
+
}
|
|
21
|
+
export async function resolveWritableDbPath(dbPath) {
|
|
22
|
+
const cached = resolved.get(dbPath);
|
|
23
|
+
if (cached)
|
|
24
|
+
return cached;
|
|
25
|
+
const dir = dirname(dbPath);
|
|
26
|
+
const err = await ensureWritableDir(dir);
|
|
27
|
+
if (!err) {
|
|
28
|
+
resolved.set(dbPath, dbPath);
|
|
29
|
+
return dbPath;
|
|
30
|
+
}
|
|
31
|
+
if (!isReadOnly(err))
|
|
32
|
+
throw err;
|
|
33
|
+
const key = createHash("sha256").update(resolve(dbPath)).digest("hex").slice(0, 16);
|
|
34
|
+
const fallbackDir = join(tmpdir(), `ai-ready-${key}`);
|
|
35
|
+
const fallbackErr = await ensureWritableDir(fallbackDir);
|
|
36
|
+
if (fallbackErr) {
|
|
37
|
+
throw new Error(
|
|
38
|
+
`[ai-ready] Database directory '${dir}' is read-only and the temp dir fallback ('${fallbackDir}') also failed: ${fallbackErr.message}. Set database.filename to a writable path, or use a serverless driver: database.type 'd1' (Cloudflare), 'neon' (Vercel/Postgres), or 'libsql' (Turso).`
|
|
39
|
+
);
|
|
40
|
+
}
|
|
41
|
+
const fallback = join(fallbackDir, "pages.db");
|
|
42
|
+
logger.warn(
|
|
43
|
+
`[ai-ready] Database directory '${dir}' is read-only; falling back to '${fallback}'. This database is ephemeral and reseeded on cold start. Set database.filename to a writable persistent path (or a volume) to silence this warning.`
|
|
44
|
+
);
|
|
45
|
+
resolved.set(dbPath, fallback);
|
|
46
|
+
return fallback;
|
|
47
|
+
}
|
|
@@ -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
|
|
90
|
-
|
|
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 +0,0 @@
|
|
|
1
|
-
{"id":"a7036984-939c-4a2e-b19f-205f8859db8a","timestamp":1780943705993,"prerendered":[]}
|