diff --git a/README.md b/README.md
index a0579a5..73b9301 100644
--- a/README.md
+++ b/README.md
@@ -18,6 +18,7 @@ Nuxt LLMs automatically generates [`llms.txt` markdown documentation](https://ll
- Generates & prerenders `/llms.txt` automatically
- Generate & prerenders `/llms-full.txt` when enabled
- Customizable sections directly from your `nuxt.config.ts`
+- `useLlmsAlternate` composable to advertise per-page markdown alternates (RFC 8288)
- Integrates with Nuxt modules and your application via the runtime hooks system
## Quick Setup
@@ -120,6 +121,32 @@ export default defineNuxtConfig({
})
```
+## Per-page markdown discovery
+
+`/llms.txt` advertises your site at the global level, but agents crawling individual pages have no standard way to know that a markdown counterpart exists. The `useLlmsAlternate` composable solves this by emitting two discovery hints per [RFC 8288](https://www.rfc-editor.org/rfc/rfc8288):
+
+- ` ` in the document `
`
+- `Link: <...>; rel="alternate"; type="text/markdown"` HTTP response header
+
+Agents can read the `Link` header from a `HEAD` request — without parsing HTML — and switch to the markdown URL for ingestion.
+
+```vue
+
+
+```
+
+The composable accepts a string, a `ref`, or a getter. Falsy values are ignored, so it is safe to call before async data resolves:
+
+```ts
+const { data: post } = await useAsyncData(/* ... */)
+useLlmsAlternate(() => post.value?.markdownUrl)
+```
+
+This pairs naturally with `@nuxt/content`'s `/raw/.md` endpoint, but works with any markdown URL — including endpoints you serve yourself.
+
## Extending the documentation using hooks
The module provides a hooks system that allows you to dynamically extend both documentation formats. There are two main hooks:
diff --git a/package.json b/package.json
index f00fd37..5ecb1dc 100644
--- a/package.json
+++ b/package.json
@@ -48,7 +48,7 @@
"@nuxt/kit": "^4.2.2"
},
"devDependencies": {
- "@nuxt/content": "^3.10.0",
+ "@nuxt/content": "^3.13.0",
"@nuxt/devtools": "^3.1.1",
"@nuxt/eslint-config": "^1.12.1",
"@nuxt/module-builder": "^1.0.2",
diff --git a/playground/pages/[...slug].vue b/playground/pages/[...slug].vue
index bdfde44..2fcc54b 100644
--- a/playground/pages/[...slug].vue
+++ b/playground/pages/[...slug].vue
@@ -4,6 +4,11 @@ const route = useRoute()
const { data } = await useAsyncData(() => 'posts' + route.path, async () => {
return await queryCollection('content').path(route.path).first()
})
+
+useLlmsAlternate(() => {
+ const path = data.value?.path
+ return path && path !== '/' ? `/raw${path}.md` : null
+})
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index a195c2a..1efd4dd 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -13,8 +13,8 @@ importers:
version: 4.2.2(magicast@0.5.1)
devDependencies:
'@nuxt/content':
- specifier: ^3.10.0
- version: 3.10.0(magicast@0.5.1)
+ specifier: ^3.13.0
+ version: 3.13.0(magicast@0.5.1)
'@nuxt/devtools':
specifier: ^3.1.1
version: 3.1.1(vite@7.3.1(@types/node@25.0.7)(jiti@2.6.1)(terser@5.41.0)(yaml@2.8.2))(vue@3.5.26(typescript@5.9.3))
@@ -23,7 +23,7 @@ importers:
version: 1.12.1(@typescript-eslint/utils@8.53.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3))(@vue/compiler-sfc@3.5.26)(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3)
'@nuxt/module-builder':
specifier: ^1.0.2
- version: 1.0.2(@nuxt/cli@3.32.0(cac@6.7.14)(magicast@0.5.1))(@vue/compiler-core@3.5.26)(esbuild@0.27.2)(typescript@5.9.3)(vue-tsc@3.2.2(typescript@5.9.3))(vue@3.5.26(typescript@5.9.3))
+ version: 1.0.2(@nuxt/cli@3.32.0(cac@6.7.14)(magicast@0.5.1))(@vue/compiler-core@3.5.33)(esbuild@0.27.2)(typescript@5.9.3)(vue-tsc@3.2.2(typescript@5.9.3))(vue@3.5.26(typescript@5.9.3))
'@nuxt/schema':
specifier: ^4.2.2
version: 4.2.2
@@ -60,9 +60,11 @@ packages:
'@antfu/install-pkg@1.1.0':
resolution: {integrity: sha512-MGQsmw10ZyI+EJo45CdSER4zEb+p31LpDAFp2Z3gkSd1yqVZGi0Ebx++YTEMonJy4oChEMLsxZ64j8FH6sSqtQ==}
- '@apidevtools/json-schema-ref-parser@11.9.3':
- resolution: {integrity: sha512-60vepv88RwcJtSHrD6MjIL6Ta3SOYbgfnkHb+ppAVK+o9mXprRtulx7VlRl3lN3bbvysAfCS7WMVfhUYemB0IQ==}
- engines: {node: '>= 16'}
+ '@apidevtools/json-schema-ref-parser@14.2.1':
+ resolution: {integrity: sha512-HmdFw9CDYqM6B25pqGBpNeLCKvGPlIx1EbLrVL0zPvj50CJQUHyBNBw45Muk0kEIkogo1VZvOKHajdMuAzSxRg==}
+ engines: {node: '>= 20'}
+ peerDependencies:
+ '@types/json-schema': ^7.0.15
'@babel/code-frame@7.27.1':
resolution: {integrity: sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==}
@@ -167,6 +169,11 @@ packages:
engines: {node: '>=6.0.0'}
hasBin: true
+ '@babel/parser@7.29.3':
+ resolution: {integrity: sha512-b3ctpQwp+PROvU/cttc4OYl4MzfJUWy6FZg+PMXfzmt/+39iHVF0sDfqay8TQM3JA2EUOyKcFZt75jWriQijsA==}
+ engines: {node: '>=6.0.0'}
+ hasBin: true
+
'@babel/plugin-syntax-jsx@7.27.1':
resolution: {integrity: sha512-y8YTNIeKoyhGd9O0Jiyzyyqk8gdjnumGTQPsz0xOZOQ2RmkVJeZ1vmmfIvFEKqucBG6axJGBZDE/7iI5suUI/w==}
engines: {node: '>=6.9.0'}
@@ -211,6 +218,10 @@ packages:
resolution: {integrity: sha512-0ZrskXVEHSWIqZM/sQZ4EV3jZJXRkio/WCxaqKZP1g//CEWEPSfeZFcms4XeKBCHU0ZKnIkdJeU/kF+eRp5lBg==}
engines: {node: '>=6.9.0'}
+ '@babel/types@7.29.0':
+ resolution: {integrity: sha512-LwdZHpScM4Qz8Xw2iKSzS+cfglZzJGvofQICy7W7v4caru4EaAmyUuO6BGrbyQ2mYV11W0U8j5mBhd14dd3B0A==}
+ engines: {node: '>=6.9.0'}
+
'@bomb.sh/tab@0.0.11':
resolution: {integrity: sha512-RSqyreeicYBALcMaNxIUJTBknftXsyW45VRq5gKDNwKroh0Re5SDoWwXZaphb+OTEzVdpm/BA8Uq6y0P+AtVYw==}
hasBin: true
@@ -1002,9 +1013,6 @@ packages:
'@jridgewell/trace-mapping@0.3.31':
resolution: {integrity: sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==}
- '@jsdevtools/ono@7.1.3':
- resolution: {integrity: sha512-4JQNk+3mVzK3xh2rqd6RB4J46qUR19azEHBneZyTZM+c456qOrbbM/5xcR8huNCCcbVt7+UmizG6GuUvPvKUYg==}
-
'@kwsites/file-exists@1.1.1':
resolution: {integrity: sha512-m9/5YGR18lIwxSFDwfE3oA7bWuq9kdau6ugN4H2rJeyhFQZcG9AgSHkQtSD15a8WvTgfz9aikZMrKPHvbpqFiw==}
@@ -1058,8 +1066,8 @@ packages:
engines: {node: ^16.10.0 || >=18.0.0}
hasBin: true
- '@nuxt/content@3.10.0':
- resolution: {integrity: sha512-UGXSfqyqhTW641GluCQDx2G8GFo/F37R9cywatgvujjnu1LAx1h1/pRORzNzpbKXj4t+tAZD5EIU0jGOJNkRZA==}
+ '@nuxt/content@3.13.0':
+ resolution: {integrity: sha512-ZpZ1l0yGzK/Y9QjBT8uReJ62DnOKDMlw+vkzSnkc8YDyZ0ZNhFj1fviMwDhEkArwvQTRfxi12GqzB/wxu01vEw==}
engines: {node: '>= 20.19.0'}
peerDependencies:
'@electric-sql/pglite': '*'
@@ -1130,6 +1138,10 @@ packages:
resolution: {integrity: sha512-ZAgYBrPz/yhVgDznBNdQj2vhmOp31haJbO0I0iah/P9atw+OHH7NJLUZ3PK+LOz/0fblKTN1XJVSi8YQ1TQ0KA==}
engines: {node: '>=18.12.0'}
+ '@nuxt/kit@4.4.4':
+ resolution: {integrity: sha512-oy4fAeMkyz7gelnalDQLPm8QZRN+c5c/Eh/M6oFgPx86jnA8m6xeOlONpJN2dk0GhcJwJYuN/kmzBffZ93WXPQ==}
+ engines: {node: '>=18.12.0'}
+
'@nuxt/module-builder@1.0.2':
resolution: {integrity: sha512-9M+0oZimbwom1J+HrfDuR5NDPED6C+DlM+2xfXju9wqB6VpVfYkS6WNEmS0URw8kpJcKBuogAc7ADO7vRS4s4A==}
engines: {node: ^18.0.0 || >=20.0.0}
@@ -1200,8 +1212,8 @@ packages:
rolldown:
optional: true
- '@nuxtjs/mdc@0.19.2':
- resolution: {integrity: sha512-mtwBb9D5U7H1R3kpqEmqwML1RudN6qOJqJwebrqLxk+EWhtGUXAdUBXC2L/kPWiCNA4Yz/EO+tSfSQV8Idh5nw==}
+ '@nuxtjs/mdc@0.21.1':
+ resolution: {integrity: sha512-DIeUD7IahWVUSoZExysxH9dX51Io6hcQYgGJODq0cMTGqaoDD32lRfHBJxYUmy+sUCV1+1hfa2ixspgJgEd2GA==}
'@octokit/auth-token@6.0.0':
resolution: {integrity: sha512-P4YJBPdPSpWTQ1NU4XYdvHvXJJDxM6YwpS0FZHRgP7YFkdVxsWcpWGy/NVqlAA7PcPCnMacXlRm1y2PFZRWL/w==}
@@ -1981,26 +1993,37 @@ packages:
cpu: [x64]
os: [win32]
- '@shikijs/core@3.21.0':
- resolution: {integrity: sha512-AXSQu/2n1UIQekY8euBJlvFYZIw0PHY63jUzGbrOma4wPxzznJXTXkri+QcHeBNaFxiiOljKxxJkVSoB3PjbyA==}
+ '@shikijs/core@4.0.2':
+ resolution: {integrity: sha512-hxT0YF4ExEqB8G/qFdtJvpmHXBYJ2lWW7qTHDarVkIudPFE6iCIrqdgWxGn5s+ppkGXI0aEGlibI0PAyzP3zlw==}
+ engines: {node: '>=20'}
- '@shikijs/engine-javascript@3.21.0':
- resolution: {integrity: sha512-ATwv86xlbmfD9n9gKRiwuPpWgPENAWCLwYCGz9ugTJlsO2kOzhOkvoyV/UD+tJ0uT7YRyD530x6ugNSffmvIiQ==}
+ '@shikijs/engine-javascript@4.0.2':
+ resolution: {integrity: sha512-7PW0Nm49DcoUIQEXlJhNNBHyoGMjalRETTCcjMqEaMoJRLljy1Bi/EGV3/qLBgLKQejdspiiYuHGQW6dX94Nag==}
+ engines: {node: '>=20'}
- '@shikijs/engine-oniguruma@3.21.0':
- resolution: {integrity: sha512-OYknTCct6qiwpQDqDdf3iedRdzj6hFlOPv5hMvI+hkWfCKs5mlJ4TXziBG9nyabLwGulrUjHiCq3xCspSzErYQ==}
+ '@shikijs/engine-oniguruma@4.0.2':
+ resolution: {integrity: sha512-UpCB9Y2sUKlS9z8juFSKz7ZtysmeXCgnRF0dlhXBkmQnek7lAToPte8DkxmEYGNTMii72zU/lyXiCB6StuZeJg==}
+ engines: {node: '>=20'}
- '@shikijs/langs@3.21.0':
- resolution: {integrity: sha512-g6mn5m+Y6GBJ4wxmBYqalK9Sp0CFkUqfNzUy2pJglUginz6ZpWbaWjDB4fbQ/8SHzFjYbtU6Ddlp1pc+PPNDVA==}
+ '@shikijs/langs@4.0.2':
+ resolution: {integrity: sha512-KaXby5dvoeuZzN0rYQiPMjFoUrz4hgwIE+D6Du9owcHcl6/g16/yT5BQxSW5cGt2MZBz6Hl0YuRqf12omRfUUg==}
+ engines: {node: '>=20'}
+
+ '@shikijs/primitive@4.0.2':
+ resolution: {integrity: sha512-M6UMPrSa3fN5ayeJwFVl9qWofl273wtK1VG8ySDZ1mQBfhCpdd8nEx7nPZ/tk7k+TYcpqBZzj/AnwxT9lO+HJw==}
+ engines: {node: '>=20'}
- '@shikijs/themes@3.21.0':
- resolution: {integrity: sha512-BAE4cr9EDiZyYzwIHEk7JTBJ9CzlPuM4PchfcA5ao1dWXb25nv6hYsoDiBq2aZK9E3dlt3WB78uI96UESD+8Mw==}
+ '@shikijs/themes@4.0.2':
+ resolution: {integrity: sha512-mjCafwt8lJJaVSsQvNVrJumbnnj1RI8jbUKrPKgE6E3OvQKxnuRoBaYC51H4IGHePsGN/QtALglWBU7DoKDFnA==}
+ engines: {node: '>=20'}
- '@shikijs/transformers@3.21.0':
- resolution: {integrity: sha512-CZwvCWWIiRRiFk9/JKzdEooakAP8mQDtBOQ1TKiCaS2E1bYtyBCOkUzS8akO34/7ufICQ29oeSfkb3tT5KtrhA==}
+ '@shikijs/transformers@4.0.2':
+ resolution: {integrity: sha512-1+L0gf9v+SdDXs08vjaLb3mBFa8U7u37cwcBQIv/HCocLwX69Tt6LpUCjtB+UUTvQxI7BnjZKhN/wMjhHBcJGg==}
+ engines: {node: '>=20'}
- '@shikijs/types@3.21.0':
- resolution: {integrity: sha512-zGrWOxZ0/+0ovPY7PvBU2gIS9tmhSUUt30jAcNV0Bq0gb2S98gwfjIs1vxlmH5zM7/4YxLamT6ChlqqAJmPPjA==}
+ '@shikijs/types@4.0.2':
+ resolution: {integrity: sha512-qzbeRooUTPnLE+sHD/Z8DStmaDgnbbc/pMrU203950aRqjX/6AFHeDYT+j00y2lPdz0ywJKx7o/7qnqTivtlXg==}
+ engines: {node: '>=20'}
'@shikijs/vscode-textmate@10.0.2':
resolution: {integrity: sha512-83yeghZ2xxin3Nj8z1NMd/NCuca+gsYXswywDy5bHvwlWL8tpTQmzGeUuHd9FC3E/SBEMvzJRwWEOz5gGes9Qg==}
@@ -2067,9 +2090,6 @@ packages:
'@types/json-schema@7.0.15':
resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==}
- '@types/lodash@4.17.23':
- resolution: {integrity: sha512-RDvF6wTulMPjrNdCoYRC8gNR880JNGT8uB+REUpC2Ns4pRqQJhGz90wh7rgdXDPpCczF3VGktDuFGVnz8zP7HA==}
-
'@types/mdast@4.0.4':
resolution: {integrity: sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==}
@@ -2342,6 +2362,9 @@ packages:
'@vue/compiler-core@3.5.26':
resolution: {integrity: sha512-vXyI5GMfuoBCnv5ucIT7jhHKl55Y477yxP6fc4eUswjP8FG3FFVFd41eNDArR+Uk3QKn2Z85NavjaxLxOC19/w==}
+ '@vue/compiler-core@3.5.33':
+ resolution: {integrity: sha512-3PZLQwFw4Za3TC8t0FvTy3wI16Kt+pmwcgNZca4Pj9iWL2E72a/gZlpBtAJvEdDMdCxdG/qq0C7PN0bsJuv0Rw==}
+
'@vue/compiler-dom@3.5.16':
resolution: {integrity: sha512-SSJIhBr/teipXiXjmWOVWLnxjNGo65Oj/8wTEQz0nqwQeP75jWZ0n4sF24Zxoht1cuJoWopwj0J0exYwCJ0dCQ==}
@@ -2391,6 +2414,9 @@ packages:
'@vue/shared@3.5.26':
resolution: {integrity: sha512-7Z6/y3uFI5PRoKeorTOSXKcDj0MSasfNNltcslbFrPpcw6aXRUALq4IfJlaTRspiWIUOEZbrpM+iQGmCOiWe4A==}
+ '@vue/shared@3.5.33':
+ resolution: {integrity: sha512-5vR2QIlmaLG77Ygd4pMP6+SGQ5yox9VhtnbDWTy9DzMzdmeLxZ1QqxrywEZ9sa1AVubfIJyaCG3ytyWU81ufcQ==}
+
'@webcontainer/env@1.1.1':
resolution: {integrity: sha512-6aN99yL695Hi9SuIk1oC88l9o0gmxL1nGWWQ/kNy81HigJ0FoaoTXpytCj6ItzgyCEwA9kF1wixsTuv5cjsgng==}
@@ -2437,6 +2463,11 @@ packages:
engines: {node: '>=0.4.0'}
hasBin: true
+ acorn@8.16.0:
+ resolution: {integrity: sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw==}
+ engines: {node: '>=0.4.0'}
+ hasBin: true
+
agent-base@7.1.3:
resolution: {integrity: sha512-jRR5wdylq8CkOe6hei19GGZnxM6rBGwFl3Bg0YItGDimvjGtAvdZk4Pu6Cl4u4Igsws4a1fd1Vq3ezrhn4KmFw==}
engines: {node: '>= 14'}
@@ -2537,6 +2568,10 @@ packages:
balanced-match@1.0.2:
resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==}
+ balanced-match@4.0.4:
+ resolution: {integrity: sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==}
+ engines: {node: 18 || 20 || >=22}
+
bare-events@2.5.4:
resolution: {integrity: sha512-+gFfDkR8pj4/TrWCGUGWmJIkBwuxPS5F+a5yWjOHQt2hHvNZd5YLzadjmDUtFmMM4y429bnKLa8bYBMHcYdnQA==}
@@ -2569,6 +2604,10 @@ packages:
brace-expansion@2.0.1:
resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==}
+ brace-expansion@5.0.5:
+ resolution: {integrity: sha512-VZznLgtwhn+Mact9tfiwx64fA9erHH/MCXEUfB/0bX/6Fz6ny5EGTXYltMocqg4xFAQZtnO3DHWWXi8RiuN7cQ==}
+ engines: {node: 18 || 20 || >=22}
+
braces@3.0.3:
resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==}
engines: {node: '>=8'}
@@ -2609,6 +2648,14 @@ packages:
magicast:
optional: true
+ c12@3.3.4:
+ resolution: {integrity: sha512-cM0ApFQSBXuourJejzwv/AuPRvAxordTyParRVcHjjtXirtkzM0uK2L9TTn9s0cXZbG7E55jCivRQzoxYmRAlA==}
+ peerDependencies:
+ magicast: '*'
+ peerDependenciesMeta:
+ magicast:
+ optional: true
+
cac@6.7.14:
resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==}
engines: {node: '>=8'}
@@ -2697,6 +2744,9 @@ packages:
citty@0.1.6:
resolution: {integrity: sha512-tskPPKEs8D2KPafUypv2gxwJP8h/OaJmC82QQGGDQcHvXX43xF2VDACcJVmZ0EuSxkpO9Kc4MlrA3q0+FG58AQ==}
+ citty@0.2.2:
+ resolution: {integrity: sha512-+6vJA3L98yv+IdfKGZHBNiGW5KHn22e/JwID0Strsz8h4S/csAu/OuICwxrg44k5MRiZHWIo8XXuJgQTriRP4w==}
+
clean-git-ref@2.0.1:
resolution: {integrity: sha512-bLSptAy2P0s6hU4PzuIMKmMJJSE6gLXGH1cntDu7bWJUksvuM+7ReOK61mozULErYvP6a15rnYl0zFDef+pyPw==}
@@ -2771,6 +2821,9 @@ packages:
confbox@0.2.2:
resolution: {integrity: sha512-1NB+BKqhtNipMsov4xI/NnhCKp9XG9NamYp5PVm9klAT0fsrNPjaFICsCFhNhwZJKNh7zB/3q8qXz0E9oaMNtQ==}
+ confbox@0.2.4:
+ resolution: {integrity: sha512-ysOGlgTFbN2/Y6Cg3Iye8YKulHw+R2fNXHrgSmXISQdMnomY6eNDprVdW9R5xBguEqI954+S6709UyiO7B+6OQ==}
+
consola@3.4.2:
resolution: {integrity: sha512-5IKcdX0nnYavi6G7TtOhwkYzyjfJlatbjMjuLSfE2kYT5pMDOilZ4OvMhi637CcDICTmz3wARPoyhqyX1Y+XvA==}
engines: {node: ^14.18.0 || >=16.10.0}
@@ -2899,15 +2952,6 @@ packages:
sqlite3:
optional: true
- debug@4.4.1:
- resolution: {integrity: sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==}
- engines: {node: '>=6.0'}
- peerDependencies:
- supports-color: '*'
- peerDependenciesMeta:
- supports-color:
- optional: true
-
debug@4.4.3:
resolution: {integrity: sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==}
engines: {node: '>=6.0'}
@@ -2957,6 +3001,9 @@ packages:
defu@6.1.4:
resolution: {integrity: sha512-mEQCMmwJu317oSz8CwdIOdwf3xMif1ttiM8LTufzc3g6kR+9Pe236twL8j3IYT1F7GfRgGcW6MWxzZjLIkuHIg==}
+ defu@6.1.7:
+ resolution: {integrity: sha512-7z22QmUWiQ/2d0KkdYmANbRUVABpZ9SNYyH5vx6PZ+nE5bcC0l7uFvEfHlyld/HcGBFTL536ClDt3DEcSlEJAQ==}
+
degenerator@5.0.1:
resolution: {integrity: sha512-TllpMR/t0M5sqCXfj85i4XaAzxmS5tVA16dqvdkMwGmzI+dXLXnw3J+3Vdv7VKw+ThlTMboK6i9rnZ6Nntj5CQ==}
engines: {node: '>= 14'}
@@ -3030,6 +3077,10 @@ packages:
resolution: {integrity: sha512-JVUnt+DUIzu87TABbhPmNfVdBDt18BLOWjMUFJMSi/Qqg7NTYtabbvSNJGOJ7afbRuv9D/lngizHtP7QyLQ+9w==}
engines: {node: '>=12'}
+ dotenv@17.4.2:
+ resolution: {integrity: sha512-nI4U3TottKAcAD9LLud4Cb7b2QztQMUEfHbvhTH09bqXTxnSie8WnjPALV/WMCrJZ6UV/qHJ6L03OqO3LcdYZw==}
+ engines: {node: '>=12'}
+
dunder-proto@1.0.1:
resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==}
engines: {node: '>= 0.4'}
@@ -3084,6 +3135,10 @@ packages:
resolution: {integrity: sha512-FDWG5cmEYf2Z00IkYRhbFrwIwvdFKH07uV8dvNy0omp/Qb1xcyCWp2UDtcwJF4QZZvk0sLudP6/hAu42TaqVhQ==}
engines: {node: '>=0.12'}
+ entities@7.0.1:
+ resolution: {integrity: sha512-TWrgLOFUQTH994YUyl1yT4uyavY5nNB5muff+RtWaqNVCAK408b5ZnnbNAUEWLTCpum9w6arT70i1XdQ4UeOPA==}
+ engines: {node: '>=0.12'}
+
env-paths@3.0.0:
resolution: {integrity: sha512-dtJUTepzMW3Lm/NPxRf3wP4642UWhjL2sQxc+ym2YMj1m/H2zDNQOlezafzkHwn6sMstjHTwG6iQQsctDW/b1A==}
engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0}
@@ -3493,6 +3548,10 @@ packages:
resolution: {integrity: sha512-L5bGsVkxJbJgdnwyuheIunkGatUF/zssUoxxjACCseZYAVbaqdh9Tsmmlkl8vYan09H7sbvKt4pS8GqKLBrEzA==}
hasBin: true
+ giget@3.2.0:
+ resolution: {integrity: sha512-GvHTWcykIR/fP8cj8dMpuMMkvaeJfPvYnhq0oW+chSeIr+ldX21ifU2Ms6KBoyKZQZmVaUAAhQ2EZ68KJF8a7A==}
+ hasBin: true
+
git-up@8.1.1:
resolution: {integrity: sha512-FDenSF3fVqBYSaJoYy1KSc2wosx0gCvKP+c+PRBht7cAaiCeQlBtfBDX9vgnNOHmdePlSFITVcn4pFfcgNvx3g==}
@@ -3865,8 +3924,8 @@ packages:
resolution: {integrity: sha512-LpB/54B+/2J5hqQ7imZHfdU31OlgQqx7ZicVlkm9kzg9/w8GKLEcFfJl/t7DCEDueOyBAD6zCCwTO6Fzs0NoEQ==}
engines: {node: '>=16'}
- isomorphic-git@1.36.1:
- resolution: {integrity: sha512-fC8SRT8MwoaXDK8G4z5biPEbqf2WyEJUb2MJ2ftSd39/UIlsnoZxLGux+lae0poLZO4AEcx6aUVOh5bV+P8zFA==}
+ isomorphic-git@1.37.6:
+ resolution: {integrity: sha512-qr1NFCPsVTZ6YGqTXw0CzamnsHyH9QQ1OTEfeXIweSljRUMzuHFCJdUn0wc6OcjtTDns6knxjPb7N6LmJeftOA==}
engines: {node: '>=14.17'}
hasBin: true
@@ -3911,14 +3970,8 @@ packages:
json-buffer@3.0.1:
resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==}
- json-schema-to-typescript@15.0.4:
- resolution: {integrity: sha512-Su9oK8DR4xCmDsLlyvadkXzX6+GGXJpbhwoLtOGArAG61dvbW4YQmSEno2y66ahpIdmLMg6YUf/QHLgiwvkrHQ==}
- engines: {node: '>=16.0.0'}
- hasBin: true
-
- json-schema-to-zod@2.7.0:
- resolution: {integrity: sha512-eW59l3NQ6sa3HcB+Ahf7pP6iGU7MY4we5JsPqXQ2ZcIPF8QxSg/lkY8lN0Js/AG0NjMbk+nZGUfHlceiHF+bwQ==}
- hasBin: true
+ json-schema-to-typescript-lite@15.0.0:
+ resolution: {integrity: sha512-5mMORSQm9oTLyjM4mWnyNBi2T042Fhg1/0gCIB6X8U/LVpM2A+Nmj2yEyArqVouDmFThDxpEXcnTgSrjkGJRFA==}
json-schema-traverse@0.4.1:
resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==}
@@ -4245,6 +4298,10 @@ packages:
resolution: {integrity: sha512-enIvLvRAFZYXJzkCYG5RKmPfrFArdLv+R+lbQ53BmIMLIry74bjKzX6iHAm8WYamJkhSSEabrWN5D97XnKObjQ==}
engines: {node: 20 || >=22}
+ minimatch@10.2.5:
+ resolution: {integrity: sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg==}
+ engines: {node: 18 || 20 || >=22}
+
minimatch@3.1.2:
resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==}
@@ -4302,6 +4359,9 @@ packages:
mlly@1.8.0:
resolution: {integrity: sha512-l8D9ODSRWLe2KHJSifWGwBqpTZXIXTeo8mlKjY+E2HAakaTeNpqAyBZ8GSqLzHgw4XmHmC8whvpjJNMbFZN7/g==}
+ mlly@1.8.2:
+ resolution: {integrity: sha512-d+ObxMQFmbt10sretNDytwt85VrbkhhUA/JBGm1MPaWJ65Cl4wOgLaB1NYvJSZ0Ef03MMEU/0xpPMXUIQ29UfA==}
+
mocked-exports@0.1.1:
resolution: {integrity: sha512-aF7yRQr/Q0O2/4pIXm6PZ5G+jAd7QS4Yu8m+WEeEHGnbo+7mE36CbLSDQiXYV8bVL3NfmdeqPJct0tUlnjVSnA==}
@@ -4434,8 +4494,8 @@ packages:
nth-check@2.1.1:
resolution: {integrity: sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==}
- nuxt-component-meta@0.16.0:
- resolution: {integrity: sha512-mxsLl+gcF930dM4ozdxskGKEpldJn/fACR18uXrMDvvwxM+rMZW4tzuRMEuxhoyEXtxPLdOLP52wrS6UzBSx6Q==}
+ nuxt-component-meta@0.17.2:
+ resolution: {integrity: sha512-2/mSSqutOX8t+r8cAX1yUYwAPBqicPO5Rfum3XaHVszxKCF4tXEXBiPGfJY9Zn69x/CIeOdw+aM9wmHzQ5Q+lA==}
hasBin: true
nuxt@4.2.2:
@@ -4461,6 +4521,11 @@ packages:
engines: {node: ^14.16.0 || >=16.10.0}
hasBin: true
+ nypm@0.6.6:
+ resolution: {integrity: sha512-vRyr0r4cbBapw07Xw8xrj9Teq3o7MUD35rSaTcanDbW+aK2XHDgJFiU6ZTj2GBw7Q12ysdsyFss+Vdz4hQ0Y6Q==}
+ engines: {node: '>=18'}
+ hasBin: true
+
object-deep-merge@2.0.0:
resolution: {integrity: sha512-3DC3UMpeffLTHiuXSy/UG4NOIYTLlY9u3V82+djSCLYClWobZiS4ivYzpIUWrRY/nfsJ8cWsKyG3QfyLePmhvg==}
@@ -4653,6 +4718,9 @@ packages:
perfect-debounce@2.0.0:
resolution: {integrity: sha512-fkEH/OBiKrqqI/yIgjR92lMfs2K8105zt/VT6+7eTjNwisrsh47CeIED9z58zI7DfKdH3uHAn25ziRZn3kgAow==}
+ perfect-debounce@2.1.0:
+ resolution: {integrity: sha512-LjgdTytVFXeUgtHZr9WYViYSM/g8MkcTPYDlPa3cDqMirHjKiSZPYd6DoL7pK8AJQr+uWkQvCjHNdiMqsrJs+g==}
+
picocolors@1.1.1:
resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==}
@@ -4664,6 +4732,10 @@ packages:
resolution: {integrity: sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==}
engines: {node: '>=12'}
+ picomatch@4.0.4:
+ resolution: {integrity: sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==}
+ engines: {node: '>=12'}
+
pify@4.0.1:
resolution: {integrity: sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==}
engines: {node: '>=6'}
@@ -4674,6 +4746,9 @@ packages:
pkg-types@2.3.0:
resolution: {integrity: sha512-SIqCzDRg0s9npO5XQ3tNZioRY1uK06lA41ynBC1YmFTmnY6FjUjVt6s4LoADmwoig1qqD0oK8h1p/8mlMx8Oig==}
+ pkg-types@2.3.1:
+ resolution: {integrity: sha512-y+ichcgc2LrADuhLNAx8DFjVfgz91pRxfZdI3UDhxHvcVEZsenLO+7XaU5vOp0u/7V/wZ+plyuQxtrDlZJ+yeg==}
+
pluralize@8.0.0:
resolution: {integrity: sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA==}
engines: {node: '>=4'}
@@ -4869,11 +4944,6 @@ packages:
resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==}
engines: {node: '>= 0.8.0'}
- prettier@3.7.4:
- resolution: {integrity: sha512-v6UNi1+3hSlVvv8fSaoUbggEM5VErKmmpGA7Pl3HF8V6uKY7rvClBOJlH6yNwQtfTueNkGVpOv/mtWL9L4bgRA==}
- engines: {node: '>=14'}
- hasBin: true
-
pretty-bytes@7.1.0:
resolution: {integrity: sha512-nODzvTiYVRGRqAOvE84Vk5JDPyyxsVk0/fbA/bq7RqlnhksGpset09XTxbpvLTIjoaF7K8Z8DG8yHtKGTPSYRw==}
engines: {node: '>=20'}
@@ -4929,6 +4999,9 @@ packages:
rc9@2.1.2:
resolution: {integrity: sha512-btXCnMmRIBINM2LDZoEmOogIZU7Qe7zn4BpomSKZ/ykbLObuBdvG+mFq11DL6fjH1DRwHhrlgtYWG96bJiC7Cg==}
+ rc9@3.0.1:
+ resolution: {integrity: sha512-gMDyleLWVE+i6Sgtc0QbbY6pEKqYs97NGi6isHQPqYlLemPoO8dxQ3uGi0f4NiP98c+jMW6cG1Kx9dDwfvqARQ==}
+
readable-stream@2.3.8:
resolution: {integrity: sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==}
@@ -5140,6 +5213,11 @@ packages:
engines: {node: '>=10'}
hasBin: true
+ semver@7.7.4:
+ resolution: {integrity: sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==}
+ engines: {node: '>=10'}
+ hasBin: true
+
send@1.2.0:
resolution: {integrity: sha512-uaW0WwXKpL9blXE2o0bRhoL2EGXIrZxQ2ZQ4mgcfoBxdFmQold+qWsD2jLrfZ0trjKL6vOw0j//eAwcALFjKSw==}
engines: {node: '>= 18'}
@@ -5182,8 +5260,9 @@ packages:
resolution: {integrity: sha512-ObmnIF4hXNg1BqhnHmgbDETF8dLPCggZWBjkQfhZpbszZnYur5DUljTcCHii5LC3J5E0yeO/1LIMyH+UvHQgyw==}
engines: {node: '>= 0.4'}
- shiki@3.21.0:
- resolution: {integrity: sha512-N65B/3bqL/TI2crrXr+4UivctrAGEjmsib5rPMMPpFp1xAx/w03v8WZ9RDDFYteXoEgY7qZ4HGgl5KBIu1153w==}
+ shiki@4.0.2:
+ resolution: {integrity: sha512-eAVKTMedR5ckPo4xne/PjYQYrU3qx78gtJZ+sHlXEg5IHhhoQhMfZVzetTYuaJS0L2Ef3AcCRzCHV8T0WI6nIQ==}
+ engines: {node: '>=20'}
side-channel-list@1.0.0:
resolution: {integrity: sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==}
@@ -5232,8 +5311,8 @@ packages:
resolution: {integrity: sha512-ZA6oR3T/pEyuqwMgAKT0/hAv8oAXckzbkmR0UkUosQ+Mc4RxGoJkRmwHgHufaenlyAgE1Mxgpdcrf75y6XcnDg==}
engines: {node: '>=14.16'}
- slugify@1.6.6:
- resolution: {integrity: sha512-h+z7HKHYXj6wJU+AnS/+IH8Uh9fdcX1Lrhg1/VMdf9PwoBQXFcXiAdsy2tSK0P6gKwJLXp02r90ahUCqHk9rrw==}
+ slugify@1.6.9:
+ resolution: {integrity: sha512-vZ7rfeehZui7wQs438JXBckYLkIIdfHOXsaVEUMyS5fHo1483l1bMdo0EDSWYclY0yZKFOipDy4KHuKs6ssvdg==}
engines: {node: '>=8.0.0'}
smart-buffer@4.2.0:
@@ -5316,6 +5395,9 @@ packages:
std-env@3.10.0:
resolution: {integrity: sha512-5GS12FdOZNliM5mAOxFRg7Ir0pWz8MdpYm6AY6VPkGpbA7ZzmbzNcBJQ0GPvvyWgcY7QAhCgf9Uy89I03faLkg==}
+ std-env@4.1.0:
+ resolution: {integrity: sha512-Rq7ybcX2RuC55r9oaPVEW7/xu3tj8u4GeBYHBWCychFtzMIr86A7e3PPEBPT37sHStKX3+TiX/Fr/ACmJLVlLQ==}
+
stdin-discarder@0.2.2:
resolution: {integrity: sha512-UhDfHmA92YAlNnCfhmq0VeNL5bDbiZGg7sZ2IvPsXubGkiNa9EC+tUTsjBRsYUAz87btI6/1wf4XoVvQ3uRnmQ==}
engines: {node: '>=18'}
@@ -5440,10 +5522,18 @@ packages:
resolution: {integrity: sha512-W/KYk+NFhkmsYpuHq5JykngiOCnxeVL8v8dFnqxSD8qEEdRfXk1SDM6JzNqcERbcGYj9tMrDQBYV9cjgnunFIg==}
engines: {node: '>=18'}
+ tinyexec@1.1.2:
+ resolution: {integrity: sha512-dAqSqE/RabpBKI8+h26GfLq6Vb3JVXs30XYQjdMjaj/c2tS8IYYMbIzP599KtRj7c57/wYApb3QjgRgXmrCukA==}
+ engines: {node: '>=18'}
+
tinyglobby@0.2.15:
resolution: {integrity: sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==}
engines: {node: '>=12.0.0'}
+ tinyglobby@0.2.16:
+ resolution: {integrity: sha512-pn99VhoACYR8nFHhxqix+uvsbXineAasWm5ojXoN8xEwK5Kd3/TrhNn1wByuD52UxWRLy8pu+kRMniEi6Eq9Zg==}
+ engines: {node: '>=12.0.0'}
+
tinyrainbow@3.0.3:
resolution: {integrity: sha512-PSkbLUoxOFRzJYjjxHJt9xro7D+iilgMX/C9lawzVuYiIdcihh9DXmVibBe8lmcFrRi/VzlPjBxbN7rH24q8/Q==}
engines: {node: '>=14.0.0'}
@@ -5533,6 +5623,9 @@ packages:
ufo@1.6.2:
resolution: {integrity: sha512-heMioaxBcG9+Znsda5Q8sQbWnLJSl98AFDXTO80wELWEzX3hordXsTdxrIfMQoO9IY1MEnoGoPjpoKpMj+Yx0Q==}
+ ufo@1.6.4:
+ resolution: {integrity: sha512-JFNbkD1Svwe0KvGi8GOeLcP4kAWQ609twvCdcHxq1oSL8svv39ZuSvajcD8B+5D0eL4+s1Is2D/O6KN3qcTeRA==}
+
ultrahtml@1.6.0:
resolution: {integrity: sha512-R9fBn90VTJrqqLDwyMph+HGne8eqY1iPfYhPzZrvKpIfwkWZbcYlfpsb8B9dTvBfpy1/hqAD7Wi8EKfP9e8zdw==}
@@ -5605,8 +5698,8 @@ packages:
unist-util-visit-parents@6.0.2:
resolution: {integrity: sha512-goh1s1TBrqSqukSc8wrjwWhL0hiJxgA8m4kFxGlQ+8FYQ3C/m11FcTs4YYem7V664AhHVvgoQLk890Ssdsr2IQ==}
- unist-util-visit@5.0.0:
- resolution: {integrity: sha512-MR04uvD+07cwl/yhVuVWAtw+3GOR/knlL55Nd/wAdblk27GCVt3lqpTivy/tkJcZoNPzTwS1Y+KMojlLDhoTzg==}
+ unist-util-visit@5.1.0:
+ resolution: {integrity: sha512-m+vIdyeCOpdr/QeQCu2EzxX/ohgS8KbnPDgFni4dQsfSCtpz8UqDyY5GjRru8PDKuYn7Fq19j1CQ+nJSsGKOzg==}
universal-user-agent@7.0.3:
resolution: {integrity: sha512-TmnEAEAsBJVZM/AADELsK76llnwcf9vMKuPz8JflO1frO8Lchitr0fNaN9d+Ap0BjKtqWqd/J17qeDnXh8CL2A==}
@@ -5632,6 +5725,10 @@ packages:
resolution: {integrity: sha512-5uKD0nqiYVzlmCRs01Fhs2BdkEgBS3SAVP6ndrBsuK42iC2+JHyxM05Rm9G8+5mkmRtzMZGY8Ct5+mliZxU/Ww==}
engines: {node: '>=18.12.0'}
+ unplugin@3.0.0:
+ resolution: {integrity: sha512-0Mqk3AT2TZCXWKdcoaufeXNukv2mTrEZExeXlHIOZXdqYoHHr4n51pymnwV8x2BOVxwXbK2HLlI7usrqMpycdg==}
+ engines: {node: ^20.19.0 || >=22.12.0}
+
unrs-resolver@1.11.1:
resolution: {integrity: sha512-bSjt9pjaEBnNiGgc9rUiHGKv5l4/TGzDmYw3RhnkJGtLhbnnA/5qJj7x3dNDCRx/PJxu774LlH8lCOlB4hEfKg==}
@@ -5708,6 +5805,9 @@ packages:
unwasm@0.5.2:
resolution: {integrity: sha512-uWhB7IXQjMC4530uVAeu0lzvYK6P3qHVnmmdQniBi48YybOLN/DqEzcP9BRGk1YTDG3rRWRD8me55nIYoTHyMg==}
+ unwasm@0.5.3:
+ resolution: {integrity: sha512-keBgTSfp3r6+s9ZcSma+0chwxQdmLbB5+dAD9vjtB21UTMYuKAxHXCU1K2CbCtnP09EaWeRvACnXk0EJtUx+hw==}
+
update-browserslist-db@1.1.3:
resolution: {integrity: sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw==}
hasBin: true
@@ -6123,10 +6223,10 @@ packages:
resolution: {integrity: sha512-zK7YHHz4ZXpW89AHXUPbQVGKI7uvkd3hzusTdotCg1UxyaVtg0zFJSTfW/Dq5f7OBBVnq6cZIaC8Ti4hb6dtCA==}
engines: {node: '>= 14'}
- zod-to-json-schema@3.25.1:
- resolution: {integrity: sha512-pM/SU9d3YAggzi6MtR4h7ruuQlqKtad8e9S0fmxcMi+ueAK5Korys/aWcV9LIIHTVbj01NdzxcnXSN+O74ZIVA==}
+ zod-to-json-schema@3.25.2:
+ resolution: {integrity: sha512-O/PgfnpT1xKSDeQYSCfRI5Gy3hPf91mKVDuYLUHZJMiDFptvP41MSnWofm8dnCm0256ZNfZIM7DSzuSMAFnjHA==}
peerDependencies:
- zod: ^3.25 || ^4
+ zod: ^3.25.28 || ^4
zod@3.25.76:
resolution: {integrity: sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==}
@@ -6141,9 +6241,8 @@ snapshots:
package-manager-detector: 1.3.0
tinyexec: 1.0.1
- '@apidevtools/json-schema-ref-parser@11.9.3':
+ '@apidevtools/json-schema-ref-parser@14.2.1(@types/json-schema@7.0.15)':
dependencies:
- '@jsdevtools/ono': 7.1.3
'@types/json-schema': 7.0.15
js-yaml: 4.1.0
@@ -6293,6 +6392,10 @@ snapshots:
dependencies:
'@babel/types': 7.28.6
+ '@babel/parser@7.29.3':
+ dependencies:
+ '@babel/types': 7.29.0
+
'@babel/plugin-syntax-jsx@7.27.1(@babel/core@7.28.6)':
dependencies:
'@babel/core': 7.28.6
@@ -6360,6 +6463,11 @@ snapshots:
'@babel/helper-string-parser': 7.27.1
'@babel/helper-validator-identifier': 7.28.5
+ '@babel/types@7.29.0':
+ dependencies:
+ '@babel/helper-string-parser': 7.27.1
+ '@babel/helper-validator-identifier': 7.28.5
+
'@bomb.sh/tab@0.0.11(cac@6.7.14)(citty@0.1.6)':
optionalDependencies:
cac: 6.7.14
@@ -6934,8 +7042,6 @@ snapshots:
'@jridgewell/resolve-uri': 3.1.2
'@jridgewell/sourcemap-codec': 1.5.5
- '@jsdevtools/ono@7.1.3': {}
-
'@kwsites/file-exists@1.1.1':
dependencies:
debug: 4.4.3
@@ -7049,11 +7155,11 @@ snapshots:
- magicast
- supports-color
- '@nuxt/content@3.10.0(magicast@0.5.1)':
+ '@nuxt/content@3.13.0(magicast@0.5.1)':
dependencies:
- '@nuxt/kit': 4.2.2(magicast@0.5.1)
- '@nuxtjs/mdc': 0.19.2(magicast@0.5.1)
- '@shikijs/langs': 3.21.0
+ '@nuxt/kit': 4.4.4(magicast@0.5.1)
+ '@nuxtjs/mdc': 0.21.1(magicast@0.5.1)
+ '@shikijs/langs': 4.0.2
'@sqlite.org/sqlite-wasm': 3.50.4-build1
'@standard-schema/spec': 1.1.0
'@webcontainer/env': 1.1.1
@@ -7065,10 +7171,9 @@ snapshots:
destr: 2.0.5
git-url-parse: 16.1.0
hookable: 5.5.3
- isomorphic-git: 1.36.1
+ isomorphic-git: 1.37.6
jiti: 2.6.1
- json-schema-to-typescript: 15.0.4
- knitwork: 1.3.0
+ json-schema-to-typescript-lite: 15.0.0
mdast-util-to-hast: 13.2.1
mdast-util-to-string: 4.0.0
micromark: 4.0.2
@@ -7078,27 +7183,27 @@ snapshots:
micromark-util-sanitize-uri: 2.0.1
micromatch: 4.0.8
minimark: 0.2.0
- minimatch: 10.1.1
- nuxt-component-meta: 0.16.0(magicast@0.5.1)
- nypm: 0.6.2
+ minimatch: 10.2.5
+ nuxt-component-meta: 0.17.2(magicast@0.5.1)
+ nypm: 0.6.6
ohash: 2.0.11
pathe: 2.0.3
pkg-types: 2.3.0
remark-mdc: 3.10.0
scule: 1.3.0
- shiki: 3.21.0
- slugify: 1.6.6
+ shiki: 4.0.2
+ slugify: 1.6.9
socket.io-client: 4.8.3
- std-env: 3.10.0
+ std-env: 4.1.0
tinyglobby: 0.2.15
- ufo: 1.6.1
+ ufo: 1.6.4
unctx: 2.5.0
unified: 11.0.5
unist-util-stringify-position: 4.0.0
- unist-util-visit: 5.0.0
- unplugin: 2.3.11
+ unist-util-visit: 5.1.0
+ unplugin: 3.0.0
zod: 3.25.76
- zod-to-json-schema: 3.25.1(zod@3.25.76)
+ zod-to-json-schema: 3.25.2(zod@3.25.76)
transitivePeerDependencies:
- bufferutil
- drizzle-orm
@@ -7287,7 +7392,32 @@ snapshots:
transitivePeerDependencies:
- magicast
- '@nuxt/module-builder@1.0.2(@nuxt/cli@3.32.0(cac@6.7.14)(magicast@0.5.1))(@vue/compiler-core@3.5.26)(esbuild@0.27.2)(typescript@5.9.3)(vue-tsc@3.2.2(typescript@5.9.3))(vue@3.5.26(typescript@5.9.3))':
+ '@nuxt/kit@4.4.4(magicast@0.5.1)':
+ dependencies:
+ c12: 3.3.4(magicast@0.5.1)
+ consola: 3.4.2
+ defu: 6.1.7
+ destr: 2.0.5
+ errx: 0.1.0
+ exsolve: 1.0.8
+ ignore: 7.0.5
+ jiti: 2.6.1
+ klona: 2.0.6
+ mlly: 1.8.2
+ ohash: 2.0.11
+ pathe: 2.0.3
+ pkg-types: 2.3.1
+ rc9: 3.0.1
+ scule: 1.3.0
+ semver: 7.7.4
+ tinyglobby: 0.2.16
+ ufo: 1.6.4
+ unctx: 2.5.0
+ untyped: 2.0.0
+ transitivePeerDependencies:
+ - magicast
+
+ '@nuxt/module-builder@1.0.2(@nuxt/cli@3.32.0(cac@6.7.14)(magicast@0.5.1))(@vue/compiler-core@3.5.33)(esbuild@0.27.2)(typescript@5.9.3)(vue-tsc@3.2.2(typescript@5.9.3))(vue@3.5.26(typescript@5.9.3))':
dependencies:
'@nuxt/cli': 3.32.0(cac@6.7.14)(magicast@0.5.1)
citty: 0.1.6
@@ -7295,14 +7425,14 @@ snapshots:
defu: 6.1.4
jiti: 2.6.1
magic-regexp: 0.10.0
- mkdist: 2.4.1(typescript@5.9.3)(vue-sfc-transformer@0.1.17(@vue/compiler-core@3.5.26)(esbuild@0.27.2)(vue@3.5.26(typescript@5.9.3)))(vue-tsc@3.2.2(typescript@5.9.3))(vue@3.5.26(typescript@5.9.3))
+ mkdist: 2.4.1(typescript@5.9.3)(vue-sfc-transformer@0.1.17(@vue/compiler-core@3.5.33)(esbuild@0.27.2)(vue@3.5.26(typescript@5.9.3)))(vue-tsc@3.2.2(typescript@5.9.3))(vue@3.5.26(typescript@5.9.3))
mlly: 1.8.0
pathe: 2.0.3
pkg-types: 2.3.0
tsconfck: 3.1.6(typescript@5.9.3)
typescript: 5.9.3
- unbuild: 3.6.1(typescript@5.9.3)(vue-sfc-transformer@0.1.17(@vue/compiler-core@3.5.26)(esbuild@0.27.2)(vue@3.5.26(typescript@5.9.3)))(vue-tsc@3.2.2(typescript@5.9.3))(vue@3.5.26(typescript@5.9.3))
- vue-sfc-transformer: 0.1.17(@vue/compiler-core@3.5.26)(esbuild@0.27.2)(vue@3.5.26(typescript@5.9.3))
+ unbuild: 3.6.1(typescript@5.9.3)(vue-sfc-transformer@0.1.17(@vue/compiler-core@3.5.33)(esbuild@0.27.2)(vue@3.5.26(typescript@5.9.3)))(vue-tsc@3.2.2(typescript@5.9.3))(vue@3.5.26(typescript@5.9.3))
+ vue-sfc-transformer: 0.1.17(@vue/compiler-core@3.5.33)(esbuild@0.27.2)(vue@3.5.26(typescript@5.9.3))
transitivePeerDependencies:
- '@vue/compiler-core'
- esbuild
@@ -7493,16 +7623,17 @@ snapshots:
- vue-tsc
- yaml
- '@nuxtjs/mdc@0.19.2(magicast@0.5.1)':
+ '@nuxtjs/mdc@0.21.1(magicast@0.5.1)':
dependencies:
- '@nuxt/kit': 4.2.2(magicast@0.5.1)
- '@shikijs/core': 3.21.0
- '@shikijs/langs': 3.21.0
- '@shikijs/themes': 3.21.0
- '@shikijs/transformers': 3.21.0
+ '@nuxt/kit': 4.4.4(magicast@0.5.1)
+ '@shikijs/core': 4.0.2
+ '@shikijs/engine-javascript': 4.0.2
+ '@shikijs/langs': 4.0.2
+ '@shikijs/themes': 4.0.2
+ '@shikijs/transformers': 4.0.2
'@types/hast': 3.0.4
'@types/mdast': 4.0.4
- '@vue/compiler-core': 3.5.26
+ '@vue/compiler-core': 3.5.33
consola: 3.4.2
debug: 4.4.3
defu: 6.1.4
@@ -7531,12 +7662,12 @@ snapshots:
remark-rehype: 11.1.2
remark-stringify: 11.0.0
scule: 1.3.0
- shiki: 3.21.0
- ufo: 1.6.1
+ shiki: 4.0.2
+ ufo: 1.6.4
unified: 11.0.5
unist-builder: 4.0.0
- unist-util-visit: 5.0.0
- unwasm: 0.5.2
+ unist-util-visit: 5.1.0
+ unwasm: 0.5.3
vfile: 6.0.3
transitivePeerDependencies:
- magicast
@@ -8074,38 +8205,45 @@ snapshots:
'@rollup/rollup-win32-x64-msvc@4.55.1':
optional: true
- '@shikijs/core@3.21.0':
+ '@shikijs/core@4.0.2':
dependencies:
- '@shikijs/types': 3.21.0
+ '@shikijs/primitive': 4.0.2
+ '@shikijs/types': 4.0.2
'@shikijs/vscode-textmate': 10.0.2
'@types/hast': 3.0.4
hast-util-to-html: 9.0.5
- '@shikijs/engine-javascript@3.21.0':
+ '@shikijs/engine-javascript@4.0.2':
dependencies:
- '@shikijs/types': 3.21.0
+ '@shikijs/types': 4.0.2
'@shikijs/vscode-textmate': 10.0.2
oniguruma-to-es: 4.3.4
- '@shikijs/engine-oniguruma@3.21.0':
+ '@shikijs/engine-oniguruma@4.0.2':
dependencies:
- '@shikijs/types': 3.21.0
+ '@shikijs/types': 4.0.2
'@shikijs/vscode-textmate': 10.0.2
- '@shikijs/langs@3.21.0':
+ '@shikijs/langs@4.0.2':
+ dependencies:
+ '@shikijs/types': 4.0.2
+
+ '@shikijs/primitive@4.0.2':
dependencies:
- '@shikijs/types': 3.21.0
+ '@shikijs/types': 4.0.2
+ '@shikijs/vscode-textmate': 10.0.2
+ '@types/hast': 3.0.4
- '@shikijs/themes@3.21.0':
+ '@shikijs/themes@4.0.2':
dependencies:
- '@shikijs/types': 3.21.0
+ '@shikijs/types': 4.0.2
- '@shikijs/transformers@3.21.0':
+ '@shikijs/transformers@4.0.2':
dependencies:
- '@shikijs/core': 3.21.0
- '@shikijs/types': 3.21.0
+ '@shikijs/core': 4.0.2
+ '@shikijs/types': 4.0.2
- '@shikijs/types@3.21.0':
+ '@shikijs/types@4.0.2':
dependencies:
'@shikijs/vscode-textmate': 10.0.2
'@types/hast': 3.0.4
@@ -8165,8 +8303,6 @@ snapshots:
'@types/json-schema@7.0.15': {}
- '@types/lodash@4.17.23': {}
-
'@types/mdast@4.0.4':
dependencies:
'@types/unist': 3.0.3
@@ -8488,6 +8624,14 @@ snapshots:
estree-walker: 2.0.2
source-map-js: 1.2.1
+ '@vue/compiler-core@3.5.33':
+ dependencies:
+ '@babel/parser': 7.29.3
+ '@vue/shared': 3.5.33
+ entities: 7.0.1
+ estree-walker: 2.0.2
+ source-map-js: 1.2.1
+
'@vue/compiler-dom@3.5.16':
dependencies:
'@vue/compiler-core': 3.5.16
@@ -8579,6 +8723,8 @@ snapshots:
'@vue/shared@3.5.26': {}
+ '@vue/shared@3.5.33': {}
+
'@webcontainer/env@1.1.1': {}
'@whatwg-node/disposablestack@0.0.6':
@@ -8630,6 +8776,8 @@ snapshots:
acorn@8.15.0: {}
+ acorn@8.16.0: {}
+
agent-base@7.1.3: {}
ajv@6.12.6:
@@ -8735,6 +8883,8 @@ snapshots:
balanced-match@1.0.2: {}
+ balanced-match@4.0.4: {}
+
bare-events@2.5.4:
optional: true
@@ -8763,6 +8913,10 @@ snapshots:
dependencies:
balanced-match: 1.0.2
+ brace-expansion@5.0.5:
+ dependencies:
+ balanced-match: 4.0.4
+
braces@3.0.3:
dependencies:
fill-range: 7.1.1
@@ -8814,6 +8968,23 @@ snapshots:
optionalDependencies:
magicast: 0.5.1
+ c12@3.3.4(magicast@0.5.1):
+ dependencies:
+ chokidar: 5.0.0
+ confbox: 0.2.4
+ defu: 6.1.7
+ dotenv: 17.4.2
+ exsolve: 1.0.8
+ giget: 3.2.0
+ jiti: 2.6.1
+ ohash: 2.0.11
+ pathe: 2.0.3
+ perfect-debounce: 2.1.0
+ pkg-types: 2.3.1
+ rc9: 3.0.1
+ optionalDependencies:
+ magicast: 0.5.1
+
cac@6.7.14: {}
call-bind-apply-helpers@1.0.2:
@@ -8890,6 +9061,8 @@ snapshots:
dependencies:
consola: 3.4.2
+ citty@0.2.2: {}
+
clean-git-ref@2.0.1: {}
clean-regexp@1.0.0:
@@ -8952,6 +9125,8 @@ snapshots:
confbox@0.2.2: {}
+ confbox@0.2.4: {}
+
consola@3.4.2: {}
convert-source-map@2.0.0: {}
@@ -9076,10 +9251,6 @@ snapshots:
db0@0.3.4: {}
- debug@4.4.1:
- dependencies:
- ms: 2.1.3
-
debug@4.4.3:
dependencies:
ms: 2.1.3
@@ -9120,6 +9291,8 @@ snapshots:
defu@6.1.4: {}
+ defu@6.1.7: {}
+
degenerator@5.0.1:
dependencies:
ast-types: 0.13.4
@@ -9181,6 +9354,8 @@ snapshots:
dotenv@17.2.3: {}
+ dotenv@17.4.2: {}
+
dunder-proto@1.0.1:
dependencies:
call-bind-apply-helpers: 1.0.2
@@ -9210,7 +9385,7 @@ snapshots:
engine.io-client@6.6.4:
dependencies:
'@socket.io/component-emitter': 3.1.2
- debug: 4.4.1
+ debug: 4.4.3
engine.io-parser: 5.2.3
ws: 8.18.3
xmlhttprequest-ssl: 2.1.2
@@ -9227,6 +9402,8 @@ snapshots:
entities@7.0.0: {}
+ entities@7.0.1: {}
+
env-paths@3.0.0:
optional: true
@@ -9620,6 +9797,10 @@ snapshots:
optionalDependencies:
picomatch: 4.0.3
+ fdir@6.5.0(picomatch@4.0.4):
+ optionalDependencies:
+ picomatch: 4.0.4
+
fetch-blob@3.2.0:
dependencies:
node-domexception: 1.0.0
@@ -9743,6 +9924,8 @@ snapshots:
nypm: 0.6.0
pathe: 2.0.3
+ giget@3.2.0: {}
+
git-up@8.1.1:
dependencies:
is-ssh: 1.4.1
@@ -9910,7 +10093,7 @@ snapshots:
mdast-util-to-hast: 13.2.1
parse5: 7.3.0
unist-util-position: 5.0.0
- unist-util-visit: 5.0.0
+ unist-util-visit: 5.1.0
vfile: 6.0.3
web-namespaces: 2.0.1
zwitch: 2.0.4
@@ -9944,7 +10127,7 @@ snapshots:
rehype-minify-whitespace: 6.0.2
trim-trailing-lines: 2.1.0
unist-util-position: 5.0.0
- unist-util-visit: 5.0.0
+ unist-util-visit: 5.1.0
hast-util-to-parse5@8.0.1:
dependencies:
@@ -10178,7 +10361,7 @@ snapshots:
isexe@3.1.1: {}
- isomorphic-git@1.36.1:
+ isomorphic-git@1.37.6:
dependencies:
async-lock: 1.4.1
clean-git-ref: 2.0.1
@@ -10226,19 +10409,10 @@ snapshots:
json-buffer@3.0.1: {}
- json-schema-to-typescript@15.0.4:
+ json-schema-to-typescript-lite@15.0.0:
dependencies:
- '@apidevtools/json-schema-ref-parser': 11.9.3
+ '@apidevtools/json-schema-ref-parser': 14.2.1(@types/json-schema@7.0.15)
'@types/json-schema': 7.0.15
- '@types/lodash': 4.17.23
- is-glob: 4.0.3
- js-yaml: 4.1.0
- lodash: 4.17.21
- minimist: 1.2.8
- prettier: 3.7.4
- tinyglobby: 0.2.15
-
- json-schema-to-zod@2.7.0: {}
json-schema-traverse@0.4.1: {}
@@ -10480,7 +10654,7 @@ snapshots:
micromark-util-sanitize-uri: 2.0.1
trim-lines: 3.0.1
unist-util-position: 5.0.0
- unist-util-visit: 5.0.0
+ unist-util-visit: 5.1.0
vfile: 6.0.3
mdast-util-to-markdown@2.1.2:
@@ -10492,7 +10666,7 @@ snapshots:
mdast-util-to-string: 4.0.0
micromark-util-classify-character: 2.0.1
micromark-util-decode-string: 2.0.1
- unist-util-visit: 5.0.0
+ unist-util-visit: 5.1.0
zwitch: 2.0.4
mdast-util-to-string@4.0.0:
@@ -10682,7 +10856,7 @@ snapshots:
micromark@4.0.2:
dependencies:
'@types/debug': 4.1.12
- debug: 4.4.1
+ debug: 4.4.3
decode-named-character-reference: 1.2.0
devlop: 1.1.0
micromark-core-commonmark: 2.0.3
@@ -10732,6 +10906,10 @@ snapshots:
dependencies:
'@isaacs/brace-expansion': 5.0.0
+ minimatch@10.2.5:
+ dependencies:
+ brace-expansion: 5.0.5
+
minimatch@3.1.2:
dependencies:
brace-expansion: 1.1.11
@@ -10760,7 +10938,7 @@ snapshots:
mkdirp@3.0.1: {}
- mkdist@2.4.1(typescript@5.9.3)(vue-sfc-transformer@0.1.17(@vue/compiler-core@3.5.26)(esbuild@0.27.2)(vue@3.5.26(typescript@5.9.3)))(vue-tsc@3.2.2(typescript@5.9.3))(vue@3.5.26(typescript@5.9.3)):
+ mkdist@2.4.1(typescript@5.9.3)(vue-sfc-transformer@0.1.17(@vue/compiler-core@3.5.33)(esbuild@0.27.2)(vue@3.5.26(typescript@5.9.3)))(vue-tsc@3.2.2(typescript@5.9.3))(vue@3.5.26(typescript@5.9.3)):
dependencies:
autoprefixer: 10.4.21(postcss@8.5.6)
citty: 0.1.6
@@ -10778,7 +10956,7 @@ snapshots:
optionalDependencies:
typescript: 5.9.3
vue: 3.5.26(typescript@5.9.3)
- vue-sfc-transformer: 0.1.17(@vue/compiler-core@3.5.26)(esbuild@0.27.2)(vue@3.5.26(typescript@5.9.3))
+ vue-sfc-transformer: 0.1.17(@vue/compiler-core@3.5.33)(esbuild@0.27.2)(vue@3.5.26(typescript@5.9.3))
vue-tsc: 3.2.2(typescript@5.9.3)
mlly@1.8.0:
@@ -10788,6 +10966,13 @@ snapshots:
pkg-types: 1.3.1
ufo: 1.6.1
+ mlly@1.8.2:
+ dependencies:
+ acorn: 8.16.0
+ pathe: 2.0.3
+ pkg-types: 1.3.1
+ ufo: 1.6.4
+
mocked-exports@0.1.1: {}
mrmime@2.0.1: {}
@@ -10982,16 +11167,15 @@ snapshots:
dependencies:
boolbase: 1.0.0
- nuxt-component-meta@0.16.0(magicast@0.5.1):
+ nuxt-component-meta@0.17.2(magicast@0.5.1):
dependencies:
- '@nuxt/kit': 4.2.2(magicast@0.5.1)
+ '@nuxt/kit': 4.4.4(magicast@0.5.1)
citty: 0.1.6
- json-schema-to-zod: 2.7.0
mlly: 1.8.0
ohash: 2.0.11
scule: 1.3.0
typescript: 5.9.3
- ufo: 1.6.1
+ ufo: 1.6.4
vue-component-meta: 3.2.2(typescript@5.9.3)
transitivePeerDependencies:
- magicast
@@ -11133,6 +11317,12 @@ snapshots:
pkg-types: 2.3.0
tinyexec: 1.0.1
+ nypm@0.6.6:
+ dependencies:
+ citty: 0.2.2
+ pathe: 2.0.3
+ tinyexec: 1.1.2
+
object-deep-merge@2.0.0: {}
object-inspect@1.13.4:
@@ -11395,12 +11585,16 @@ snapshots:
perfect-debounce@2.0.0: {}
+ perfect-debounce@2.1.0: {}
+
picocolors@1.1.1: {}
picomatch@2.3.1: {}
picomatch@4.0.3: {}
+ picomatch@4.0.4: {}
+
pify@4.0.1: {}
pkg-types@1.3.1:
@@ -11415,6 +11609,12 @@ snapshots:
exsolve: 1.0.8
pathe: 2.0.3
+ pkg-types@2.3.1:
+ dependencies:
+ confbox: 0.2.4
+ exsolve: 1.0.8
+ pathe: 2.0.3
+
pluralize@8.0.0: {}
possible-typed-array-names@1.1.0: {}
@@ -11594,8 +11794,6 @@ snapshots:
prelude-ls@1.2.1: {}
- prettier@3.7.4: {}
-
pretty-bytes@7.1.0: {}
process-nextick-args@2.0.1: {}
@@ -11650,6 +11848,11 @@ snapshots:
defu: 6.1.4
destr: 2.0.5
+ rc9@3.0.1:
+ dependencies:
+ defu: 6.1.7
+ destr: 2.0.5
+
readable-stream@2.3.8:
dependencies:
core-util-is: 1.0.3
@@ -11714,7 +11917,7 @@ snapshots:
hast-util-is-element: 3.0.0
is-absolute-url: 4.0.1
space-separated-tokens: 2.0.2
- unist-util-visit: 5.0.0
+ unist-util-visit: 5.1.0
rehype-minify-whitespace@6.0.2:
dependencies:
@@ -11741,18 +11944,18 @@ snapshots:
github-slugger: 2.0.0
hast-util-heading-rank: 3.0.0
hast-util-to-string: 3.0.1
- unist-util-visit: 5.0.0
+ unist-util-visit: 5.1.0
rehype-sort-attribute-values@5.0.1:
dependencies:
'@types/hast': 3.0.4
hast-util-is-element: 3.0.0
- unist-util-visit: 5.0.0
+ unist-util-visit: 5.1.0
rehype-sort-attributes@5.0.1:
dependencies:
'@types/hast': 3.0.4
- unist-util-visit: 5.0.0
+ unist-util-visit: 5.1.0
release-it@19.2.3(@types/node@25.0.7)(magicast@0.5.1):
dependencies:
@@ -11820,7 +12023,7 @@ snapshots:
scule: 1.3.0
stringify-entities: 4.0.4
unified: 11.0.5
- unist-util-visit: 5.0.0
+ unist-util-visit: 5.1.0
unist-util-visit-parents: 6.0.2
yaml: 2.8.2
transitivePeerDependencies:
@@ -11984,6 +12187,8 @@ snapshots:
semver@7.7.3: {}
+ semver@7.7.4: {}
+
send@1.2.0:
dependencies:
debug: 4.4.3
@@ -12044,14 +12249,14 @@ snapshots:
shell-quote@1.8.3: {}
- shiki@3.21.0:
+ shiki@4.0.2:
dependencies:
- '@shikijs/core': 3.21.0
- '@shikijs/engine-javascript': 3.21.0
- '@shikijs/engine-oniguruma': 3.21.0
- '@shikijs/langs': 3.21.0
- '@shikijs/themes': 3.21.0
- '@shikijs/types': 3.21.0
+ '@shikijs/core': 4.0.2
+ '@shikijs/engine-javascript': 4.0.2
+ '@shikijs/engine-oniguruma': 4.0.2
+ '@shikijs/langs': 4.0.2
+ '@shikijs/themes': 4.0.2
+ '@shikijs/types': 4.0.2
'@shikijs/vscode-textmate': 10.0.2
'@types/hast': 3.0.4
@@ -12121,7 +12326,7 @@ snapshots:
slash@5.1.0: {}
- slugify@1.6.6: {}
+ slugify@1.6.9: {}
smart-buffer@4.2.0: {}
@@ -12130,7 +12335,7 @@ snapshots:
socket.io-client@4.8.3:
dependencies:
'@socket.io/component-emitter': 3.1.2
- debug: 4.4.1
+ debug: 4.4.3
engine.io-client: 6.6.4
socket.io-parser: 4.2.5
transitivePeerDependencies:
@@ -12141,7 +12346,7 @@ snapshots:
socket.io-parser@4.2.5:
dependencies:
'@socket.io/component-emitter': 3.1.2
- debug: 4.4.1
+ debug: 4.4.3
transitivePeerDependencies:
- supports-color
@@ -12196,6 +12401,8 @@ snapshots:
std-env@3.10.0: {}
+ std-env@4.1.0: {}
+
stdin-discarder@0.2.2: {}
streamx@2.22.1:
@@ -12327,11 +12534,18 @@ snapshots:
tinyexec@1.0.2: {}
+ tinyexec@1.1.2: {}
+
tinyglobby@0.2.15:
dependencies:
fdir: 6.5.0(picomatch@4.0.3)
picomatch: 4.0.3
+ tinyglobby@0.2.16:
+ dependencies:
+ fdir: 6.5.0(picomatch@4.0.4)
+ picomatch: 4.0.4
+
tinyrainbow@3.0.3: {}
to-buffer@1.2.2:
@@ -12398,9 +12612,11 @@ snapshots:
ufo@1.6.2: {}
+ ufo@1.6.4: {}
+
ultrahtml@1.6.0: {}
- unbuild@3.6.1(typescript@5.9.3)(vue-sfc-transformer@0.1.17(@vue/compiler-core@3.5.26)(esbuild@0.27.2)(vue@3.5.26(typescript@5.9.3)))(vue-tsc@3.2.2(typescript@5.9.3))(vue@3.5.26(typescript@5.9.3)):
+ unbuild@3.6.1(typescript@5.9.3)(vue-sfc-transformer@0.1.17(@vue/compiler-core@3.5.33)(esbuild@0.27.2)(vue@3.5.26(typescript@5.9.3)))(vue-tsc@3.2.2(typescript@5.9.3))(vue@3.5.26(typescript@5.9.3)):
dependencies:
'@rollup/plugin-alias': 5.1.1(rollup@4.55.1)
'@rollup/plugin-commonjs': 28.0.9(rollup@4.55.1)
@@ -12416,7 +12632,7 @@ snapshots:
hookable: 5.5.3
jiti: 2.6.1
magic-string: 0.30.21
- mkdist: 2.4.1(typescript@5.9.3)(vue-sfc-transformer@0.1.17(@vue/compiler-core@3.5.26)(esbuild@0.27.2)(vue@3.5.26(typescript@5.9.3)))(vue-tsc@3.2.2(typescript@5.9.3))(vue@3.5.26(typescript@5.9.3))
+ mkdist: 2.4.1(typescript@5.9.3)(vue-sfc-transformer@0.1.17(@vue/compiler-core@3.5.33)(esbuild@0.27.2)(vue@3.5.26(typescript@5.9.3)))(vue-tsc@3.2.2(typescript@5.9.3))(vue@3.5.26(typescript@5.9.3))
mlly: 1.8.0
pathe: 2.0.3
pkg-types: 2.3.0
@@ -12517,7 +12733,7 @@ snapshots:
'@types/unist': 3.0.3
unist-util-is: 6.0.1
- unist-util-visit@5.0.0:
+ unist-util-visit@5.1.0:
dependencies:
'@types/unist': 3.0.3
unist-util-is: 6.0.1
@@ -12567,6 +12783,12 @@ snapshots:
picomatch: 4.0.3
webpack-virtual-modules: 0.6.2
+ unplugin@3.0.0:
+ dependencies:
+ '@jridgewell/remapping': 2.3.5
+ picomatch: 4.0.3
+ webpack-virtual-modules: 0.6.2
+
unrs-resolver@1.11.1:
dependencies:
napi-postinstall: 0.3.4
@@ -12629,6 +12851,15 @@ snapshots:
pathe: 2.0.3
pkg-types: 2.3.0
+ unwasm@0.5.3:
+ dependencies:
+ exsolve: 1.0.8
+ knitwork: 1.3.0
+ magic-string: 0.30.21
+ mlly: 1.8.0
+ pathe: 2.0.3
+ pkg-types: 2.3.0
+
update-browserslist-db@1.1.3(browserslist@4.25.0):
dependencies:
browserslist: 4.25.0
@@ -12864,10 +13095,10 @@ snapshots:
'@vue/devtools-api': 6.6.4
vue: 3.5.26(typescript@5.9.3)
- vue-sfc-transformer@0.1.17(@vue/compiler-core@3.5.26)(esbuild@0.27.2)(vue@3.5.26(typescript@5.9.3)):
+ vue-sfc-transformer@0.1.17(@vue/compiler-core@3.5.33)(esbuild@0.27.2)(vue@3.5.26(typescript@5.9.3)):
dependencies:
'@babel/parser': 7.28.6
- '@vue/compiler-core': 3.5.26
+ '@vue/compiler-core': 3.5.33
esbuild: 0.27.2
vue: 3.5.26(typescript@5.9.3)
@@ -13016,7 +13247,7 @@ snapshots:
compress-commons: 6.0.2
readable-stream: 4.7.0
- zod-to-json-schema@3.25.1(zod@3.25.76):
+ zod-to-json-schema@3.25.2(zod@3.25.76):
dependencies:
zod: 3.25.76
diff --git a/src/module.ts b/src/module.ts
index 5525b8a..552fd64 100644
--- a/src/module.ts
+++ b/src/module.ts
@@ -1,4 +1,4 @@
-import { defineNuxtModule, createResolver, addServerHandler, addPrerenderRoutes, addServerImports, useLogger } from '@nuxt/kit'
+import { defineNuxtModule, createResolver, addServerHandler, addPrerenderRoutes, addServerImports, addImports, useLogger } from '@nuxt/kit'
import { version } from '../package.json'
import type { ModuleOptions } from './runtime/types'
@@ -16,6 +16,11 @@ export default defineNuxtModule({
const logger = useLogger('nuxt-llms')
const { resolve } = createResolver(import.meta.url)
+ addImports({
+ name: 'useLlmsAlternate',
+ from: resolve('./runtime/composables/useLlmsAlternate'),
+ })
+
const llmsConfig = nuxt.options.runtimeConfig.llms = {
domain: options.domain,
title: options.title,
diff --git a/src/runtime/composables/useLlmsAlternate.ts b/src/runtime/composables/useLlmsAlternate.ts
new file mode 100644
index 0000000..17d4418
--- /dev/null
+++ b/src/runtime/composables/useLlmsAlternate.ts
@@ -0,0 +1,41 @@
+import { computed, toValue, type MaybeRefOrGetter } from 'vue'
+import { setResponseHeader } from 'h3'
+import { useHead, useRequestEvent } from '#imports'
+
+/**
+ * Advertise a markdown alternate of the current page so AI agents can
+ * discover and fetch the markdown version instead of parsing HTML.
+ *
+ * Emits two discovery hints (RFC 8288):
+ * - ` ` in the document head
+ * - `Link: <...>; rel="alternate"; type="text/markdown"` HTTP response header (server only)
+ *
+ * @example
+ * ```ts
+ * // app/pages/blog/[slug].vue
+ * useLlmsAlternate(`/raw/blog/${route.params.slug}.md`)
+ * ```
+ *
+ * Accepts a string, ref, or getter. Falsy values are ignored, so it is safe to
+ * call before async data has resolved.
+ */
+export function useLlmsAlternate(
+ href: MaybeRefOrGetter,
+): void {
+ const resolved = computed(() => toValue(href) || null)
+
+ useHead({
+ link: () => {
+ const value = resolved.value
+ return value ? [{ rel: 'alternate', type: 'text/markdown', href: value }] : []
+ },
+ })
+
+ if (import.meta.server) {
+ const value = resolved.value
+ if (!value) return
+ const event = useRequestEvent()
+ if (!event) return
+ setResponseHeader(event, 'Link', `<${value}>; rel="alternate"; type="text/markdown"`)
+ }
+}
diff --git a/test/alternate.test.ts b/test/alternate.test.ts
new file mode 100644
index 0000000..c4bd7e1
--- /dev/null
+++ b/test/alternate.test.ts
@@ -0,0 +1,61 @@
+import { fileURLToPath } from 'node:url'
+import { describe, it, expect } from 'vitest'
+import { setup, $fetch, fetch } from '@nuxt/test-utils/e2e'
+
+describe('useLlmsAlternate', async () => {
+ await setup({
+ rootDir: fileURLToPath(new URL('./fixtures/alternate', import.meta.url)),
+ })
+
+ describe('with a literal href', () => {
+ it('emits a in the document head', async () => {
+ const html = await $fetch('/')
+ expect(html).toContain('rel="alternate"')
+ expect(html).toContain('type="text/markdown"')
+ expect(html).toContain('href="/raw/index.md"')
+ })
+
+ it('emits a Link HTTP response header', async () => {
+ const response = await fetch('/')
+ expect(response.headers.get('link')).toBe(
+ '; rel="alternate"; type="text/markdown"',
+ )
+ })
+ })
+
+ describe('with a getter', () => {
+ it('resolves the getter and emits both hints', async () => {
+ const html = await $fetch('/getter')
+ expect(html).toContain('href="/raw/post-from-getter.md"')
+
+ const response = await fetch('/getter')
+ expect(response.headers.get('link')).toBe(
+ '; rel="alternate"; type="text/markdown"',
+ )
+ })
+ })
+
+ describe('with falsy values (null, empty string, getter returning undefined)', () => {
+ it('does not emit a tag', async () => {
+ const html = await $fetch('/empty')
+ expect(html).not.toContain('rel="alternate"')
+ })
+
+ it('does not emit a Link header', async () => {
+ const response = await fetch('/empty')
+ expect(response.headers.get('link')).toBeNull()
+ })
+ })
+
+ describe('on a page that does not call the composable', () => {
+ it('does not emit a tag', async () => {
+ const html = await $fetch('/none')
+ expect(html).not.toContain('rel="alternate"')
+ })
+
+ it('does not emit a Link header', async () => {
+ const response = await fetch('/none')
+ expect(response.headers.get('link')).toBeNull()
+ })
+ })
+})
diff --git a/test/fixtures/alternate/app.vue b/test/fixtures/alternate/app.vue
new file mode 100644
index 0000000..8f62b8b
--- /dev/null
+++ b/test/fixtures/alternate/app.vue
@@ -0,0 +1,3 @@
+
+
+
diff --git a/test/fixtures/alternate/nuxt.config.ts b/test/fixtures/alternate/nuxt.config.ts
new file mode 100644
index 0000000..84d83f6
--- /dev/null
+++ b/test/fixtures/alternate/nuxt.config.ts
@@ -0,0 +1,8 @@
+export default defineNuxtConfig({
+ modules: ['../../../src/module'],
+ compatibilityDate: '2025-06-06',
+ llms: {
+ domain: 'https://llms.nuxt.com',
+ title: 'Nuxt LLMs module',
+ },
+})
diff --git a/test/fixtures/alternate/package.json b/test/fixtures/alternate/package.json
new file mode 100644
index 0000000..3dcd06d
--- /dev/null
+++ b/test/fixtures/alternate/package.json
@@ -0,0 +1,5 @@
+{
+ "private": true,
+ "name": "alternate",
+ "type": "module"
+}
diff --git a/test/fixtures/alternate/pages/empty.vue b/test/fixtures/alternate/pages/empty.vue
new file mode 100644
index 0000000..7692cc5
--- /dev/null
+++ b/test/fixtures/alternate/pages/empty.vue
@@ -0,0 +1,10 @@
+
+
+
+ empty
+
diff --git a/test/fixtures/alternate/pages/getter.vue b/test/fixtures/alternate/pages/getter.vue
new file mode 100644
index 0000000..e4ef699
--- /dev/null
+++ b/test/fixtures/alternate/pages/getter.vue
@@ -0,0 +1,12 @@
+
+
+
+ getter
+
diff --git a/test/fixtures/alternate/pages/index.vue b/test/fixtures/alternate/pages/index.vue
new file mode 100644
index 0000000..827d2af
--- /dev/null
+++ b/test/fixtures/alternate/pages/index.vue
@@ -0,0 +1,8 @@
+
+
+
+ literal
+
diff --git a/test/fixtures/alternate/pages/none.vue b/test/fixtures/alternate/pages/none.vue
new file mode 100644
index 0000000..93d905e
--- /dev/null
+++ b/test/fixtures/alternate/pages/none.vue
@@ -0,0 +1,7 @@
+
+
+
+ none
+