diff --git a/package.json b/package.json index cd4ff0684..048f73d3f 100644 --- a/package.json +++ b/package.json @@ -19,7 +19,7 @@ "dev": "nuxt dev playground", "dev:ssl": "nuxt dev playground --https", "dev:prepare": "pnpm -r dev:prepare && nuxt prepare && nuxt prepare playground && pnpm prepare:fixtures", - "prepare:fixtures": "nuxt prepare test/fixtures/basic && nuxt prepare test/fixtures/cdn && nuxt prepare test/fixtures/extend-registry && nuxt prepare test/fixtures/partytown && nuxt prepare test/fixtures/first-party && nuxt prepare test/fixtures/linkedin-insight && nuxt prepare test/fixtures/linkedin-insight-cdn && nuxt prepare test/fixtures/tiktok-pixel && nuxt prepare test/fixtures/calendly && nuxt prepare test/fixtures/calendly-cdn && nuxt prepare test/fixtures/ahrefs-analytics && nuxt prepare test/fixtures/ahrefs-analytics-cdn && nuxt prepare test/fixtures/usercentrics", + "prepare:fixtures": "nuxt prepare test/fixtures/basic && nuxt prepare test/fixtures/cdn && nuxt prepare test/fixtures/extend-registry && nuxt prepare test/fixtures/partytown && nuxt prepare test/fixtures/first-party && nuxt prepare test/fixtures/linkedin-insight && nuxt prepare test/fixtures/linkedin-insight-cdn && nuxt prepare test/fixtures/tiktok-pixel && nuxt prepare test/fixtures/calendly && nuxt prepare test/fixtures/calendly-cdn && nuxt prepare test/fixtures/ahrefs-analytics && nuxt prepare test/fixtures/ahrefs-analytics-cdn && nuxt prepare test/fixtures/usercentrics && nuxt prepare test/fixtures/unhead-v3", "typecheck": "nuxt typecheck", "release": "pnpm build && bumpp -r --output=CHANGELOG.md", "lint": "eslint .", diff --git a/packages/script/package.json b/packages/script/package.json index 4d07a147c..e3c973967 100644 --- a/packages/script/package.json +++ b/packages/script/package.json @@ -79,7 +79,7 @@ "@types/google.maps": "^3.58.1", "@types/vimeo__player": "^2.18.3", "@types/youtube": "^0.1.0", - "@unhead/vue": "^2.0.3", + "@unhead/vue": "^2.0.3 || ^3.0.0", "posthog-js": "^1.0.0" }, "peerDependenciesMeta": { diff --git a/packages/script/src/assets.ts b/packages/script/src/assets.ts index 66ff26ccd..11a15cb1e 100644 --- a/packages/script/src/assets.ts +++ b/packages/script/src/assets.ts @@ -1,4 +1,3 @@ -import type { NitroConfig } from 'nitropack' import { addDevServerHandler, extendRouteRules, tryUseNuxt, useNuxt } from '@nuxt/kit' import { createError, eventHandler, lazyEventHandler, setHeader } from 'h3' import { fetch } from 'ofetch' @@ -8,12 +7,6 @@ import { createStorage } from 'unstorage' import fsDriver from 'unstorage/drivers/fs-lite' -declare module '@nuxt/schema' { - interface NuxtHooks { - 'nitro:config': (config: NitroConfig) => void | Promise - } -} - const renderedScript = new Map ({ overflow: 'hidden', })) -if (import.meta.server) { +if (import.meta.server && !useProxy) { useHead({ link: [ { rel: props.loading === 'eager' ? 'preconnect' : 'dns-prefetch', - href: useProxy ? undefined : 'https://maps.googleapis.com', + href: 'https://maps.googleapis.com', }, - ].filter(l => l.href), + ], }) } diff --git a/packages/script/src/runtime/composables/useScript.ts b/packages/script/src/runtime/composables/useScript.ts index ff13ed861..85dff98bc 100644 --- a/packages/script/src/runtime/composables/useScript.ts +++ b/packages/script/src/runtime/composables/useScript.ts @@ -171,7 +171,7 @@ export function useScript = Record = Record if (!options.head) { throw new Error('useScript() has been called without Nuxt context.') } + const headHooks = options.head.hooks! ensureScripts(nuxtApp) const exists = !!(nuxtApp.$scripts as Record)?.[id] @@ -318,7 +319,7 @@ export function useScript = Record { + headHooks.hook('script:updated', (entry) => { if (entry.script.id !== instance.id) return const status = entry.script.status @@ -369,7 +370,7 @@ export function useScript = Record { + headHooks.hook('script:updated', (ctx) => { if (ctx.script.id !== instance.id) return // convert the status to a timestamp @@ -382,7 +383,7 @@ export function useScript = Record { + headHooks.hook('script:instance-fn', (ctx) => { if (ctx.script.id !== instance.id || String(ctx.fn).startsWith('__v_')) return // log all events diff --git a/packages/script/src/runtime/composables/useScriptEventPage.ts b/packages/script/src/runtime/composables/useScriptEventPage.ts index 9a7557516..4c4b4b9b5 100644 --- a/packages/script/src/runtime/composables/useScriptEventPage.ts +++ b/packages/script/src/runtime/composables/useScriptEventPage.ts @@ -22,7 +22,7 @@ export function useScriptEventPage(onChange?: (payload: TrackedPage) => void) { // possibly no head update is needed new Promise(resolve => setTimeout(resolve, 100)), new Promise((resolve) => { - stopDomWatcher = head.hooks.hook('dom:rendered', () => resolve()) + stopDomWatcher = head.hooks!.hook('dom:rendered', () => resolve()) }), ]) .finally(stopDomWatcher) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index e95f7464d..7cc6402b3 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -162,6 +162,7 @@ catalogs: overrides: '@nuxt/scripts': workspace:* + unhead-v3-fixture>@unhead/vue: ^3.0.0 vitest-environment-nuxt: 2.0.0 importers: @@ -328,7 +329,7 @@ importers: specifier: ^0.1.0 version: 0.1.2 '@unhead/vue': - specifier: ^2.0.3 + specifier: ^2.0.3 || ^3.0.0 version: 2.1.15(vue@3.5.34(typescript@6.0.3)) '@vueuse/core': specifier: 'catalog:' @@ -423,6 +424,18 @@ importers: specifier: 'catalog:' version: 4.4.6(magicast@0.5.3) + test/fixtures/unhead-v3: + dependencies: + '@nuxt/scripts': + specifier: workspace:* + version: link:../../../packages/script + '@unhead/vue': + specifier: ^3.0.0 + version: 3.1.0(crossws@0.4.5(srvx@0.11.15))(esbuild@0.28.0)(lightningcss@1.32.0)(typescript@6.0.3)(vite@7.3.3(@types/node@25.9.1)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.47.1)(yaml@2.9.0))(vue@3.5.34(typescript@6.0.3)) + nuxt: + specifier: 'catalog:' + version: 4.4.6(@babel/plugin-syntax-jsx@7.28.6(@babel/core@7.29.0))(@babel/plugin-syntax-typescript@7.28.6(@babel/core@7.29.0))(@parcel/watcher@2.5.6)(@types/node@25.9.1)(@vue/compiler-sfc@3.5.34)(cac@6.7.14)(db0@0.3.4)(eslint@10.4.0(jiti@2.7.0))(ioredis@5.10.1)(lightningcss@1.32.0)(magicast@0.5.3)(optionator@0.9.4)(rollup-plugin-visualizer@7.0.1(rollup@4.60.4))(rollup@4.60.4)(srvx@0.11.15)(terser@5.47.1)(typescript@6.0.3)(vite@7.3.3(@types/node@25.9.1)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.47.1)(yaml@2.9.0))(vue-tsc@3.3.1(typescript@6.0.3))(yaml@2.9.0) + packages: '@alloc/quick-lru@5.2.0': @@ -696,9 +709,15 @@ packages: '@emnapi/core@1.10.0': resolution: {integrity: sha512-yq6OkJ4p82CAfPl0u9mQebQHKPJkY7WrIuk205cTYnYe+k2Z8YBh11FrbRG/H6ihirqcacOgl2BIO8oyMQLeXw==} + '@emnapi/core@1.9.2': + resolution: {integrity: sha512-UC+ZhH3XtczQYfOlu3lNEkdW/p4dsJ1r/bP7H8+rhao3TTTMO1ATq/4DdIi23XuGoFY+Cz0JmCbdVl0hz9jZcA==} + '@emnapi/runtime@1.10.0': resolution: {integrity: sha512-ewvYlk86xUoGI0zQRNq/mC+16R1QeDlKQy21Ki3oSYXNgLb45GV1P6A0M+/s6nyCuNDqe5VpaY84BzXGwVbwFA==} + '@emnapi/runtime@1.9.2': + resolution: {integrity: sha512-3U4+MIWHImeyu1wnmVygh5WlgfYDtyf0k8AbLhMFxOipihf6nrWC4syIm/SwEeec0mNSafiiNnMJwbza/Is6Lw==} + '@emnapi/wasi-threads@1.2.1': resolution: {integrity: sha512-uTII7OYF+/Mes/MrcIOYp5yOtSMLBWSIoLPpcgwipoiKbli6k322tcoFsxoIIxPDqW01SQGAgko4EzZi2BNv2w==} @@ -1770,6 +1789,18 @@ packages: cpu: [x64] os: [win32] + '@oxc-parser/binding-android-arm-eabi@0.126.0': + resolution: {integrity: sha512-svyoHt25J4741QJ5aa4R+h0iiBeSRt63Lr3aAZcxy2c/NeSE1IfDeMnSij6rIg7EjxkdlXzz613wUjeCeilBNA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm] + os: [android] + + '@oxc-parser/binding-android-arm-eabi@0.127.0': + resolution: {integrity: sha512-0LC7ye4hvqbIKxAzThzvswgHLFu2AURKzYLeSVvLdu2TBOYWQDmHnTqPLeA597BcUCxiLqLsS4CJ5uoI5WYWCQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm] + os: [android] + '@oxc-parser/binding-android-arm-eabi@0.131.0': resolution: {integrity: sha512-t2xicr9pfzkSRYx5aPqZqlLaayIwJTqgQ81Jor31Xep2nGyL2Aq3d0K5wOfeR7VevaSdxaS9dzSQP9xDwn8fDg==} engines: {node: ^20.19.0 || >=22.12.0} @@ -1782,6 +1813,18 @@ packages: cpu: [arm] os: [android] + '@oxc-parser/binding-android-arm64@0.126.0': + resolution: {integrity: sha512-hPEBRKgplp1mG9GkINFsr4JVMDNrGJLOqfDaadTWpAoTnzYR5Rmv8RMvB3hJZpiNvbk1aacopdHUP1pggMQ/cw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [android] + + '@oxc-parser/binding-android-arm64@0.127.0': + resolution: {integrity: sha512-b5jtVTH6AU5CJXHNdj7Jj9IEiR9yVjjnwHzPJhGyHGPdcsZSzBCkS9GBbV33niRMvKthDwQRFRJfI4a+k4PvYg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [android] + '@oxc-parser/binding-android-arm64@0.131.0': resolution: {integrity: sha512-nlGIod6gw75x1aEDgLS+srj+JRGY0HHm9MI9YgzE/B64l6d6+H3MSP9NOgp0+HTg8tp4vV9rVfgQGgd+TfVZcA==} engines: {node: ^20.19.0 || >=22.12.0} @@ -1794,6 +1837,18 @@ packages: cpu: [arm64] os: [android] + '@oxc-parser/binding-darwin-arm64@0.126.0': + resolution: {integrity: sha512-ccRpu9sdYmznePJQG5halhs0FW5tw5a8zRSoZXOzM1OjoeZ4jiRRruFiPclsD59edoVAK1l83dvfjWz1nQi6lg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [darwin] + + '@oxc-parser/binding-darwin-arm64@0.127.0': + resolution: {integrity: sha512-obCE8B7ISKkJidjlhv9xRGJPOSDG2Yu6PRga9Ruaz35uintHxbp1Ki/Yc71wx4rj3Edrm0a1kzG1TAwit0wFpg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [darwin] + '@oxc-parser/binding-darwin-arm64@0.131.0': resolution: {integrity: sha512-jukuV6xe5RbQKFo7QD34NDCLDZp4PSOm8rmckhNdH/60ymG5zXbDzGBEyc+nTkuLQNama2aSGCt+CPfpjNTqyw==} engines: {node: ^20.19.0 || >=22.12.0} @@ -1806,6 +1861,18 @@ packages: cpu: [arm64] os: [darwin] + '@oxc-parser/binding-darwin-x64@0.126.0': + resolution: {integrity: sha512-CHB4zVjNSKqx8Fw9pHowzQQnjjuq04i4Ng0Avj+DixlwhwAoMYqlFbocYIlbg+q3zOLGlm7vEHm83jqEMitnyg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [darwin] + + '@oxc-parser/binding-darwin-x64@0.127.0': + resolution: {integrity: sha512-JL6Xb5IwPQT8rUzlpsX7E+AgfcdNklXNPFp8pjCQQ5MQOQo5rtEB2ui+3Hgg9Sn7Y9Egj6YOLLiHhLpdAe12Aw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [darwin] + '@oxc-parser/binding-darwin-x64@0.131.0': resolution: {integrity: sha512-g3JOo4khe9rslHm5WYaVDWb0HS/M1MLR3I9S8560MkKIcC96VQY00QjOlsuRyfSj/JDXj8i9T7ryPO2RidiXVg==} engines: {node: ^20.19.0 || >=22.12.0} @@ -1818,6 +1885,18 @@ packages: cpu: [x64] os: [darwin] + '@oxc-parser/binding-freebsd-x64@0.126.0': + resolution: {integrity: sha512-RQ3nEJdcDKBfBjmLJ3Vl1d0KQERPV1P8eUrnBm7+VTYyoaJSPLVFuPg1mlD1hk3n0/879VLFMfusFkBal4ssWQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [freebsd] + + '@oxc-parser/binding-freebsd-x64@0.127.0': + resolution: {integrity: sha512-SDQ/3MQFw58fqQz3Z1PhSKFF3JoCF4gmlNjziDm8X02tTahCw0qJbd7FGPDKw1i4VTBZene9JPyC3mHtSvi+wA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [freebsd] + '@oxc-parser/binding-freebsd-x64@0.131.0': resolution: {integrity: sha512-1hziITDTxjMePnX+dR9ocVT+EuZkQ8wm4FPAbmbEiKG+Phbo73J1ZnPAA6Y/aGsWF3McOFnQuZIktAFwalkfJQ==} engines: {node: ^20.19.0 || >=22.12.0} @@ -1830,6 +1909,18 @@ packages: cpu: [x64] os: [freebsd] + '@oxc-parser/binding-linux-arm-gnueabihf@0.126.0': + resolution: {integrity: sha512-onipc2wCDA7Bauzb4KK1mab0GsEDf4ujiIfWECdnmY/2LlzAoX3xdQRLAUyEDB1kn3yilHBrkmXDdHluyHXxiw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm] + os: [linux] + + '@oxc-parser/binding-linux-arm-gnueabihf@0.127.0': + resolution: {integrity: sha512-Av+D1MIqzV0YMGPT9we2SIZaMKD7Cxs4CvXSx/yxaWHewZjYEjScpOf5igc8IILASViw4WTnjlwUdI1KzVtDHQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm] + os: [linux] + '@oxc-parser/binding-linux-arm-gnueabihf@0.131.0': resolution: {integrity: sha512-9uRxfXwyKG9+MwmGQBo2ncPNwZH5HTmCETFM2WiuDBNDCW4NC5ttSQkwCAMrTAWgwMzVBH1CP8pM0v7nebCWXQ==} engines: {node: ^20.19.0 || >=22.12.0} @@ -1842,6 +1933,18 @@ packages: cpu: [arm] os: [linux] + '@oxc-parser/binding-linux-arm-musleabihf@0.126.0': + resolution: {integrity: sha512-5BuJJPohrV5NJ8lmcYOMbfRCUGoYH5J9HZHeuqOLwkHXWAuPMN3X1h8bC/2mWjmosdbfTtmyIdX3spS/TkqKNg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm] + os: [linux] + + '@oxc-parser/binding-linux-arm-musleabihf@0.127.0': + resolution: {integrity: sha512-Cs2fdJ8cPpFdeebj6p4dag8A4+56hPvZ0AhQQzlaLswGz1tz7bXt1nETLeorrM9+AMcWFFkqxcXwDGfTVidY8g==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm] + os: [linux] + '@oxc-parser/binding-linux-arm-musleabihf@0.131.0': resolution: {integrity: sha512-mgbLvzRShXOLBdWGInf08Af4q+pfj1xD8hSgLClDZ9of/BXkB6+LIhTH7fihiDUipqB3yoSkKBWaZ3Ejlf5Yag==} engines: {node: ^20.19.0 || >=22.12.0} @@ -1854,6 +1957,20 @@ packages: cpu: [arm] os: [linux] + '@oxc-parser/binding-linux-arm64-gnu@0.126.0': + resolution: {integrity: sha512-r2KApRgm2pOJaduRm6GOT8x0whcr67AyejNkSdzPt34GJ+Y3axcXN2mwlTs+8lfO/SSmpO5ZJGYiHYnxEE0jkw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [linux] + libc: [glibc] + + '@oxc-parser/binding-linux-arm64-gnu@0.127.0': + resolution: {integrity: sha512-qdOfTcT6SY8gsJrrV92uyEUyjqMGPpIB5JZUG6QN5dukYd+7/j0kX6MwK1DgQj39jtUYixxPiaRUiEN1+0CXgQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [linux] + libc: [glibc] + '@oxc-parser/binding-linux-arm64-gnu@0.131.0': resolution: {integrity: sha512-OPT8++4aN6j2GJ8+3IZHS/byXoZP4aSBn+FoG6rgBJ2fKwPKXWF3MqrFMNW7NKHM28FLY579xYLxJSfgobEqPA==} engines: {node: ^20.19.0 || >=22.12.0} @@ -1868,6 +1985,20 @@ packages: os: [linux] libc: [glibc] + '@oxc-parser/binding-linux-arm64-musl@0.126.0': + resolution: {integrity: sha512-FQ+MMh7MT0Dr/u8+RWmWKlfoeWPQyHDbhhxJShJlYtROXXPHsRs9EvmQOZZ3sx4Nn7JU8NX+oyw2YzQ7anBJcA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [linux] + libc: [musl] + + '@oxc-parser/binding-linux-arm64-musl@0.127.0': + resolution: {integrity: sha512-EoTCZneNFU/P2qrpEM+RHmQwt+CvDkyGESG6qhr7KaegXLZwePfbrkCDfAk8/rhxbDUVGsZILX+2tqPzFtoFWA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [linux] + libc: [musl] + '@oxc-parser/binding-linux-arm64-musl@0.131.0': resolution: {integrity: sha512-vtPiwmfVTAXzaxDKsOXG+LwgRAA7WEnaeHzhS5z0GE89gAK18KSXnly7Z6saXXq6L3dVMyK44uoTI03zKxrpmw==} engines: {node: ^20.19.0 || >=22.12.0} @@ -1882,6 +2013,20 @@ packages: os: [linux] libc: [musl] + '@oxc-parser/binding-linux-ppc64-gnu@0.126.0': + resolution: {integrity: sha512-Wv/T8C98hRQhGTlx2XFyLn5raRMp9U1lOQD+YnXNgAr7wHbJJpZ8mDBU7Rw+M3WytGcGTFcr6kqgfyQeHVtLbQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [ppc64] + os: [linux] + libc: [glibc] + + '@oxc-parser/binding-linux-ppc64-gnu@0.127.0': + resolution: {integrity: sha512-zALjmZYgxFLHjXeudcDF0xFGNydTAtkAeXAr2EuC17ywCyFxcmQra4w0BMde0Yi/re4Bi4iwEoEXtYN7l6eBLQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [ppc64] + os: [linux] + libc: [glibc] + '@oxc-parser/binding-linux-ppc64-gnu@0.131.0': resolution: {integrity: sha512-8AW8L7w5cGHSdZPcyZX2yR0+GUODsT15rbRjfdD54rv6DMbtuEB19ysLOpKJlRGfH6UNYNpCHaU1uJWgTWf1/w==} engines: {node: ^20.19.0 || >=22.12.0} @@ -1896,6 +2041,20 @@ packages: os: [linux] libc: [glibc] + '@oxc-parser/binding-linux-riscv64-gnu@0.126.0': + resolution: {integrity: sha512-DHx1rT1zauW0ZbLHOiQh5AC9Xs3UkWx2XmfZHs+7nnWYr3sagrufoUQC+/XPwwjMIlCFXiFGM0sFh3TyOCZwqA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [riscv64] + os: [linux] + libc: [glibc] + + '@oxc-parser/binding-linux-riscv64-gnu@0.127.0': + resolution: {integrity: sha512-fPP8M6zQLS7Jz7o9d5ArUSuAuSK3e+WCYVrCpdzeCOejidtZExJ9tjhDrAd3HEPqARBCPmdpqxESPFqy44vkBQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [riscv64] + os: [linux] + libc: [glibc] + '@oxc-parser/binding-linux-riscv64-gnu@0.131.0': resolution: {integrity: sha512-vvpjkjEOUsPcsYf8evE4MO3aGx9+3wodXEBOicGNnOwTuAik8eBONNkgSdhkGsAblQmfVHJyanRnpxglddTXIA==} engines: {node: ^20.19.0 || >=22.12.0} @@ -1910,6 +2069,20 @@ packages: os: [linux] libc: [glibc] + '@oxc-parser/binding-linux-riscv64-musl@0.126.0': + resolution: {integrity: sha512-umDc2mTShH0U2zcEYf8mIJ163seLJNn54ZUZYeI5jD4qlg9izPwoLrC2aNPKlMJTu6u/ysmQWiEvIiaAG+INkw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [riscv64] + os: [linux] + libc: [musl] + + '@oxc-parser/binding-linux-riscv64-musl@0.127.0': + resolution: {integrity: sha512-7IcC4Ao02oGpfnjt+X/oF4U2mllo2qoSkw5xxiXNKL9MCTsTiAC6616beOuehdxGcnz1bRoPC1RQ2f1GQDdN+g==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [riscv64] + os: [linux] + libc: [musl] + '@oxc-parser/binding-linux-riscv64-musl@0.131.0': resolution: {integrity: sha512-AqmcNC3fClXX+fxQ6VGEN1667xVFiRBkY0CZmDMSiaeFUsv1+UkBPYYi48IUKcA9/ivvoKNRzQl2I4//kT9F/w==} engines: {node: ^20.19.0 || >=22.12.0} @@ -1924,6 +2097,20 @@ packages: os: [linux] libc: [musl] + '@oxc-parser/binding-linux-s390x-gnu@0.126.0': + resolution: {integrity: sha512-PXXeWayclRtO1pxQEeCpiqIglQdhK2mAI2VX5xnsWdImzSB5GpoQ8TNw7vTCKk2k+GZuxl+q1knncidjCyUP9w==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [s390x] + os: [linux] + libc: [glibc] + + '@oxc-parser/binding-linux-s390x-gnu@0.127.0': + resolution: {integrity: sha512-pbXIhiNFHoqWeqDNLiJ9JkpHz1IM9k4DXa66x+1GTWMG7iLxtkXgE53iiuKSXwmk3zIYmaPVfBvgcAhS583K4Q==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [s390x] + os: [linux] + libc: [glibc] + '@oxc-parser/binding-linux-s390x-gnu@0.131.0': resolution: {integrity: sha512-7d3jOMKy7RSQCcDLIci+ySll2FgsOMl/GiRux4q2JNv0zg4EdhFISa9idvrdN/HEUIQQJNg6dmveUeJl2YErGA==} engines: {node: ^20.19.0 || >=22.12.0} @@ -1938,6 +2125,20 @@ packages: os: [linux] libc: [glibc] + '@oxc-parser/binding-linux-x64-gnu@0.126.0': + resolution: {integrity: sha512-wzocjxm34TbB3bFlqG65JiLtvf6ZDg2ZxRkLLbgXwDQUNU+0MPjQN8zy/0jBKNA5fnPLk3XeVdZ7Uin+7+CVkg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [linux] + libc: [glibc] + + '@oxc-parser/binding-linux-x64-gnu@0.127.0': + resolution: {integrity: sha512-MYCguB9RvBvlSd6gbuNI7QwiLoCCAlGnlRJFPrzLI6U1/9wkC/WK6LtBAUln55H1Ctqw45PWmqrobKoMhsYQzQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [linux] + libc: [glibc] + '@oxc-parser/binding-linux-x64-gnu@0.131.0': resolution: {integrity: sha512-JHK/h95qVqVQ+ITER837kcTdwBDFpFaNnOTYGCP0zdUSX/mLKC7tXOoyrTb6vG7iRPwGlcgBil3v2IjYw1FqJA==} engines: {node: ^20.19.0 || >=22.12.0} @@ -1952,6 +2153,20 @@ packages: os: [linux] libc: [glibc] + '@oxc-parser/binding-linux-x64-musl@0.126.0': + resolution: {integrity: sha512-e83uftP60jmkPs2+CW6T6A1GYzN2H6IumDAiTntv9WyHR73PI3ImHNBkYqnA3ukeKI3xjcCbhSh9QeJWmufxGQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [linux] + libc: [musl] + + '@oxc-parser/binding-linux-x64-musl@0.127.0': + resolution: {integrity: sha512-5eY0B/bxf1xIUxb4NOTvOI3KWtBQfPWYyKAzgcrCt0mDibSZygVpO1Pz8bkeiSZ5Jj9+M09dkggG3H8I5d0Uyg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [linux] + libc: [musl] + '@oxc-parser/binding-linux-x64-musl@0.131.0': resolution: {integrity: sha512-b2BO82O8azXAyf7EUgOPKu145nWypbNyk07HbU09fkzhm9lEA5oPvaN/M8Nlo7tOErVTa2WOgS4QbOnxAPXdDQ==} engines: {node: ^20.19.0 || >=22.12.0} @@ -1966,6 +2181,18 @@ packages: os: [linux] libc: [musl] + '@oxc-parser/binding-openharmony-arm64@0.126.0': + resolution: {integrity: sha512-4WiOILHnPrTDY2/L4mE6PZCYwLN1d3ghma6BuTJ452CCgzRMt3uFplCtR+o3r9zdUWJYb370UizpI9CUcWXr1A==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [openharmony] + + '@oxc-parser/binding-openharmony-arm64@0.127.0': + resolution: {integrity: sha512-Gld0ajrFTUXNtdw20fVBuTQx66FA75nIVg+//pPfR3sXkuABB4mTBhl3r9JNzrJpgW//qiwxf0nWXUWGJSL3UQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [openharmony] + '@oxc-parser/binding-openharmony-arm64@0.131.0': resolution: {integrity: sha512-GHO9glZaX7LkX/OGfluEPf1yjg+ehiFbUdowbX6uNWOQhmwKWU4m4+nZ9FJkrHNKuxyI1KKertMdGjVKCApKWA==} engines: {node: ^20.19.0 || >=22.12.0} @@ -1978,6 +2205,16 @@ packages: cpu: [arm64] os: [openharmony] + '@oxc-parser/binding-wasm32-wasi@0.126.0': + resolution: {integrity: sha512-Y17hhnrQTrxgAxAyAq401vnN9URsAL4s5AjqpG1NDsXSlhe1yBNnns+rC2P6xcMoitgX5nKH2ryYt9oiFRlzLw==} + engines: {node: '>=14.0.0'} + cpu: [wasm32] + + '@oxc-parser/binding-wasm32-wasi@0.127.0': + resolution: {integrity: sha512-T6KVD7rhLzFlwGRXMnxUFfkCZD8FHnb968wVXW1mXzgRFc5RNXOBY2mPPDZ77x5Ln76ltLMgtPg0cOkU1NSrEQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [wasm32] + '@oxc-parser/binding-wasm32-wasi@0.131.0': resolution: {integrity: sha512-3SkikPaEFoih1N83qLVEDLRLeY4nYsf6JT9SnWiMCQ5lGQdKup6bEuKCqkRiG9dD1IIaFeYz9RjlciPmYoFIWA==} engines: {node: ^20.19.0 || >=22.12.0} @@ -1988,6 +2225,18 @@ packages: engines: {node: ^20.19.0 || >=22.12.0} cpu: [wasm32] + '@oxc-parser/binding-win32-arm64-msvc@0.126.0': + resolution: {integrity: sha512-Znug1u1iRvT4VC3jANz6nhGBHsFwEFMxuimYpJFwMtsB6H5FcEoZRMmH26tHkSTD03JvDmG+gB65W3ajLjPcSw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [win32] + + '@oxc-parser/binding-win32-arm64-msvc@0.127.0': + resolution: {integrity: sha512-Ujvw4X+LD1CCGULcsQcvb4YNVoBGqt+JHgNNzGGaCImELiZLk477ifUH53gIbE7EKd933NdTi25JWEr9K2HwXw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [win32] + '@oxc-parser/binding-win32-arm64-msvc@0.131.0': resolution: {integrity: sha512-Os5bEhryeA2jkH+ZrnZyAC1EP5gs+X4YB1Fjqml7UPD5kU7ecsK1MPEVMfCrdt/GDNpDbavYXiOXOdyJ5b3OPw==} engines: {node: ^20.19.0 || >=22.12.0} @@ -2000,6 +2249,18 @@ packages: cpu: [arm64] os: [win32] + '@oxc-parser/binding-win32-ia32-msvc@0.126.0': + resolution: {integrity: sha512-qrw7mx5hFFTxVSXToOA40hpnjgNB/DJprZchtB4rDKNLKqkD3F26HbzaQeH1nxAKej0efSZfJd5Sw3qdtOLGhw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [ia32] + os: [win32] + + '@oxc-parser/binding-win32-ia32-msvc@0.127.0': + resolution: {integrity: sha512-0cwxKO7KHQQQfo4Uf4B2SQrhgm+cJaP9OvFFhx52Tkg4bezsacu83GB2/In5bC415Ueeym+kXdnge/57rbSfTw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [ia32] + os: [win32] + '@oxc-parser/binding-win32-ia32-msvc@0.131.0': resolution: {integrity: sha512-m+jNz9EuF0NXoiptc6B9h5yompZQVW/a5MJeOu5zojfH5yWk82tvF2ccrHkfhgtrS9h9DD5l1Qv8dWlfY7Nz8g==} engines: {node: ^20.19.0 || >=22.12.0} @@ -2012,6 +2273,18 @@ packages: cpu: [ia32] os: [win32] + '@oxc-parser/binding-win32-x64-msvc@0.126.0': + resolution: {integrity: sha512-ibB1s+mPUFXvS7MFJO2jpw/aCNs/P6ifnWlRyTYB+WYBpniOiCcHQQskZneJtwcjQMDRol3RGG3ihoYnzXSY4w==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [win32] + + '@oxc-parser/binding-win32-x64-msvc@0.127.0': + resolution: {integrity: sha512-rOrnSQSCbhI2kowr9XxE7m9a8oQXnBHjnS6j95LxxAnEZ0+Fz20WlRXG4ondQb+ejjt2KOsa65sE6++L6kUd+w==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [win32] + '@oxc-parser/binding-win32-x64-msvc@0.131.0': resolution: {integrity: sha512-o14Hk8dAyiEUMFEWEgmAwFZvBt1RzAYLM3xeQ+5315JXgVYhoemivgYcbYVRbsFkS71ShMGlAFE0kPnr460rww==} engines: {node: ^20.19.0 || >=22.12.0} @@ -2024,6 +2297,12 @@ packages: cpu: [x64] os: [win32] + '@oxc-project/types@0.126.0': + resolution: {integrity: sha512-oGfVtjAgwQVVpfBrbtk4e1XDyWHRFta6BS3GWVzrF8xYBT2VGQAk39yJS/wFSMrZqoiCU4oghT3Ch0HaHGIHcQ==} + + '@oxc-project/types@0.127.0': + resolution: {integrity: sha512-aIYXQBo4lCbO4z0R3FHeucQHpF46l2LbMdxRvqvuRuW2OxdnSkcng5B8+K12spgLDj93rtN3+J2Vac/TIO+ciQ==} + '@oxc-project/types@0.131.0': resolution: {integrity: sha512-PgnWDfV0h+b16XNKbXU7Daib/BFSt/J2mEzfYIBu6JB/wNdlU+kVYXCkGA1A9fWkTbOgbjh4e6NhPeQOYvFhEA==} @@ -3173,16 +3452,62 @@ packages: resolution: {integrity: sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==} deprecated: Potential CWE-502 - Update to 1.3.1 or higher + '@unhead/bundler@3.1.0': + resolution: {integrity: sha512-PzIa26mo1fk2t3KJ6ACJXTi1MD1nDJXb4hl/P8+UTMmdK0EWyDo3LMttePsIgKKR5PTnrtSeyhd43Pdoym4z2g==} + peerDependencies: + '@unhead/cli': ^3.1.0 + esbuild: '>=0.17.0' + lightningcss: '>=1.20.0' + rolldown: '>=1.0.0-beta.0' + unhead: ^3.1.0 + vite: '>=6.4.2' + webpack: '>=5.0.0' + peerDependenciesMeta: + '@unhead/cli': + optional: true + esbuild: + optional: true + lightningcss: + optional: true + rolldown: + optional: true + vite: + optional: true + webpack: + optional: true + '@unhead/vue@2.1.15': resolution: {integrity: sha512-SSByXfEjhzPn8gXdEdgpYqpLMPSkLUH2HVE0GxZfOtNsJ0GgOHQs0g9T67ZZ1z0kTELLKdtOtYrzrbv9+ffF7g==} peerDependencies: vue: '>=3.5.18' + '@unhead/vue@3.1.0': + resolution: {integrity: sha512-ib0YCfaoD0lL40Dg1FEQJksZhZ5Q+LMESXUxyfMrtlSUb43+Ha7btUIPyQuAfkjhlTihE1x5i9QdswEdhe0LWg==} + peerDependencies: + vite: '>=6.4.2' + vue: '>=3.5.18' + webpack: '>=5.0.0' + peerDependenciesMeta: + vite: + optional: true + webpack: + optional: true + + '@valibot/to-json-schema@1.7.0': + resolution: {integrity: sha512-Y3pPVibbIOHzohrlxSINvO7w/bvXkoYS3BQHoImV9ynE+bXKf171bdMucPurV2zp7gdmt0L1HCcNAsbo7cFRQw==} + peerDependencies: + valibot: ^1.4.0 + '@vercel/nft@1.5.0': resolution: {integrity: sha512-IWTDeIoWhQ7ZtRO/JRKH+jhmeQvZYhtGPmzw/QGDY+wDCQqfm25P9yIdoAFagu4fWsK4IwZXDFIjrmp5rRm/sA==} engines: {node: '>=20'} hasBin: true + '@vitejs/devtools-kit@0.1.24': + resolution: {integrity: sha512-sHM4i80Rrx4HTv/c2d28pQpeMz99GQe/2lVvJvna9t/YcoVouqpsms8oKiF/NcX8474A5gx3TtJHXWvqbov1dg==} + peerDependencies: + vite: '*' + '@vitejs/plugin-vue-jsx@5.1.5': resolution: {integrity: sha512-jIAsvHOEtWpslLOI2MeElGFxH7M8pM83BU/Tor4RLyiwH0FM4nUW3xdvbw20EeU9wc5IspQwMq225K3CMnJEpA==} engines: {node: ^20.19.0 || >=22.12.0} @@ -3968,6 +4293,14 @@ packages: devalue@5.8.1: resolution: {integrity: sha512-4CXDYRBGqN+57wVJkuXBYmpAVUSg3L6JAQa/DFqm238G73E1wuyc/JhGQJzN7vUf/CMphYau2zXbfWzDR5aTEw==} + devframe@0.2.2: + resolution: {integrity: sha512-nB5xJR0XREJSVD7Me7j9UUY1NIpPlBGYI/b6EMigeoVPaUv7/RwKf/uyc/94P00yMMxQzSMy/94NzWemDd70SQ==} + peerDependencies: + '@modelcontextprotocol/sdk': ^1.0.0 + peerDependenciesMeta: + '@modelcontextprotocol/sdk': + optional: true + devlop@1.1.0: resolution: {integrity: sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==} @@ -4629,6 +4962,16 @@ packages: crossws: optional: true + h3@2.0.1-rc.22: + resolution: {integrity: sha512-Esv0DMIuPkCTSWCA0vO73vcTqwzH1wjSrAO1TXNu/K3up1sZHa9EKMapbmxCDYBeymC3fVTk4qxp7ogQWQ+KgA==} + engines: {node: '>=20.11.1'} + hasBin: true + peerDependencies: + crossws: ^0.4.1 + peerDependenciesMeta: + crossws: + optional: true + happy-dom@20.9.0: resolution: {integrity: sha512-GZZ9mKe8r646NUAf/zemnGbjYh4Bt8/MqASJY+pSm5ZDtc3YQox+4gsLI7yi1hba6o+eCsGxpHn5+iEVn31/FQ==} engines: {node: '>=20.0.0'} @@ -5041,6 +5384,9 @@ packages: lodash@4.18.1: resolution: {integrity: sha512-dMInicTPVE8d1e5otfwmmjlxkZoUpiVLwyeTdUsi/Caj/gfzzblBcCE5sRHV/AsjuCmxWrte2TNGSYuCeCq+0Q==} + logs-sdk@0.0.6: + resolution: {integrity: sha512-G4M1C9aLLBOIWpmw/Lqk4zrap/T2IJsoUOuUDjRcVSLy6lHQqxr3wCqIT1FvvpYTUYpEwvu4utsMY42jTNvx8Q==} + long@5.3.2: resolution: {integrity: sha512-mNAgZ1GmyNhD7AuqnTG3/VQ26o760+ZYBPKjPvugO8+nLbYfX6TVpJPseBvopbdY+qpZ/lKUnmEc1LeZYS3QAA==} @@ -5468,6 +5814,14 @@ packages: resolution: {integrity: sha512-Ch0sBbrqZpeNZUMhVDbU2yrTWTVrUT/MkXb9E2DAc+hbhxbbO8D/XklUtfPP86/iqrkvl178+YQvh5u8Of1mUg==} engines: {node: ^20.19.0 || >=22.12.0} + oxc-parser@0.126.0: + resolution: {integrity: sha512-FktCvLby/mOHyuijZt22+nOt10dS24gGUZE3XwIbUg7Kf4+rer3/5T7RgwzazlNuVsCjPloZ3p8E+4ONT3A8Kw==} + engines: {node: ^20.19.0 || >=22.12.0} + + oxc-parser@0.127.0: + resolution: {integrity: sha512-bkgD4qHlN7WxLdX8bLXdaU54TtQtAIg/ZBAfm0aje/mo3MRDo3P0hZSgr4U7O3xfX+fQmR5AP04JS/TGcZLcFA==} + engines: {node: ^20.19.0 || >=22.12.0} + oxc-parser@0.131.0: resolution: {integrity: sha512-SJ3/7ZPbgie8dr5Z9BI/M51zZbpXba+hRSG0MDzVwMW5CRQg2fjYE0jHGlLX4eeiibGgC/mzoDFKSDHwVZEHRQ==} engines: {node: ^20.19.0 || >=22.12.0} @@ -5480,6 +5834,11 @@ packages: resolution: {integrity: sha512-ml0/elXPNnDnuHo3VHmEMN2fnybmKx7YL+0E+gMQ0fuHRZHXYJzF6YJ01KsCWg6FXY6pbZcjm7DC3xwGHnB/BA==} engines: {node: ^20.19.0 || >=22.12.0} + oxc-walker@0.7.0: + resolution: {integrity: sha512-54B4KUhrzbzc4sKvKwVYm7E2PgeROpGba0/2nlNZMqfDyca+yOor5IMb4WLGBatGDT0nkzYdYuzylg7n3YfB7A==} + peerDependencies: + oxc-parser: '>=0.98.0' + oxc-walker@1.0.0: resolution: {integrity: sha512-eMsHflAGfOskpWxtp9xP/f5b96XLEU8ifTd2gOOCkdux9HMxKGy5S1ru0Gh1B3aPu+YbfmWUUVkcb7MrZz3XyQ==} peerDependencies: @@ -6555,6 +6914,14 @@ packages: unhead@2.1.15: resolution: {integrity: sha512-MCt5T90mCWyr3Z6pUCdM9lVRXoMoVBlL7z7U4CYVIiaDiuzad/UCfLuMqz5MeNmpZUgoBCQnrucJimU7EZR+XA==} + unhead@3.1.0: + resolution: {integrity: sha512-SH1PAjAMspLIoBjAjE/R8hty2NYo7YcIrdu5I+PVfiW4QmmwEG4pgoiKG0MCs6WRSwiatzeha+4lqSqvHW9PEg==} + peerDependencies: + vite: '>=6.4.2' + peerDependenciesMeta: + vite: + optional: true + unicorn-magic@0.3.0: resolution: {integrity: sha512-+QBBXBCvifc56fsbuxZQ6Sic3wqqc3WWaqxs58gvJrcOuN83HGTCwz3oS5phzU9LthRNE9VrJCFCLUgHeeFnfA==} engines: {node: '>=18'} @@ -7410,11 +7777,22 @@ snapshots: tslib: 2.8.1 optional: true + '@emnapi/core@1.9.2': + dependencies: + '@emnapi/wasi-threads': 1.2.1 + tslib: 2.8.1 + optional: true + '@emnapi/runtime@1.10.0': dependencies: tslib: 2.8.1 optional: true + '@emnapi/runtime@1.9.2': + dependencies: + tslib: 2.8.1 + optional: true + '@emnapi/wasi-threads@1.2.1': dependencies: tslib: 2.8.1 @@ -7900,6 +8278,13 @@ snapshots: '@tybys/wasm-util': 0.10.2 optional: true + '@napi-rs/wasm-runtime@1.1.4(@emnapi/core@1.9.2)(@emnapi/runtime@1.9.2)': + dependencies: + '@emnapi/core': 1.9.2 + '@emnapi/runtime': 1.9.2 + '@tybys/wasm-util': 0.10.2 + optional: true + '@nodelib/fs.scandir@2.1.5': dependencies: '@nodelib/fs.stat': 2.0.5 @@ -8621,102 +9006,212 @@ snapshots: '@oxc-minify/binding-win32-x64-msvc@0.131.0': optional: true + '@oxc-parser/binding-android-arm-eabi@0.126.0': + optional: true + + '@oxc-parser/binding-android-arm-eabi@0.127.0': + optional: true + '@oxc-parser/binding-android-arm-eabi@0.131.0': optional: true '@oxc-parser/binding-android-arm-eabi@0.132.0': optional: true + '@oxc-parser/binding-android-arm64@0.126.0': + optional: true + + '@oxc-parser/binding-android-arm64@0.127.0': + optional: true + '@oxc-parser/binding-android-arm64@0.131.0': optional: true '@oxc-parser/binding-android-arm64@0.132.0': optional: true + '@oxc-parser/binding-darwin-arm64@0.126.0': + optional: true + + '@oxc-parser/binding-darwin-arm64@0.127.0': + optional: true + '@oxc-parser/binding-darwin-arm64@0.131.0': optional: true '@oxc-parser/binding-darwin-arm64@0.132.0': optional: true + '@oxc-parser/binding-darwin-x64@0.126.0': + optional: true + + '@oxc-parser/binding-darwin-x64@0.127.0': + optional: true + '@oxc-parser/binding-darwin-x64@0.131.0': optional: true '@oxc-parser/binding-darwin-x64@0.132.0': optional: true + '@oxc-parser/binding-freebsd-x64@0.126.0': + optional: true + + '@oxc-parser/binding-freebsd-x64@0.127.0': + optional: true + '@oxc-parser/binding-freebsd-x64@0.131.0': optional: true '@oxc-parser/binding-freebsd-x64@0.132.0': optional: true + '@oxc-parser/binding-linux-arm-gnueabihf@0.126.0': + optional: true + + '@oxc-parser/binding-linux-arm-gnueabihf@0.127.0': + optional: true + '@oxc-parser/binding-linux-arm-gnueabihf@0.131.0': optional: true '@oxc-parser/binding-linux-arm-gnueabihf@0.132.0': optional: true + '@oxc-parser/binding-linux-arm-musleabihf@0.126.0': + optional: true + + '@oxc-parser/binding-linux-arm-musleabihf@0.127.0': + optional: true + '@oxc-parser/binding-linux-arm-musleabihf@0.131.0': optional: true '@oxc-parser/binding-linux-arm-musleabihf@0.132.0': optional: true + '@oxc-parser/binding-linux-arm64-gnu@0.126.0': + optional: true + + '@oxc-parser/binding-linux-arm64-gnu@0.127.0': + optional: true + '@oxc-parser/binding-linux-arm64-gnu@0.131.0': optional: true '@oxc-parser/binding-linux-arm64-gnu@0.132.0': optional: true + '@oxc-parser/binding-linux-arm64-musl@0.126.0': + optional: true + + '@oxc-parser/binding-linux-arm64-musl@0.127.0': + optional: true + '@oxc-parser/binding-linux-arm64-musl@0.131.0': optional: true '@oxc-parser/binding-linux-arm64-musl@0.132.0': optional: true + '@oxc-parser/binding-linux-ppc64-gnu@0.126.0': + optional: true + + '@oxc-parser/binding-linux-ppc64-gnu@0.127.0': + optional: true + '@oxc-parser/binding-linux-ppc64-gnu@0.131.0': optional: true '@oxc-parser/binding-linux-ppc64-gnu@0.132.0': optional: true + '@oxc-parser/binding-linux-riscv64-gnu@0.126.0': + optional: true + + '@oxc-parser/binding-linux-riscv64-gnu@0.127.0': + optional: true + '@oxc-parser/binding-linux-riscv64-gnu@0.131.0': optional: true '@oxc-parser/binding-linux-riscv64-gnu@0.132.0': optional: true + '@oxc-parser/binding-linux-riscv64-musl@0.126.0': + optional: true + + '@oxc-parser/binding-linux-riscv64-musl@0.127.0': + optional: true + '@oxc-parser/binding-linux-riscv64-musl@0.131.0': optional: true '@oxc-parser/binding-linux-riscv64-musl@0.132.0': optional: true + '@oxc-parser/binding-linux-s390x-gnu@0.126.0': + optional: true + + '@oxc-parser/binding-linux-s390x-gnu@0.127.0': + optional: true + '@oxc-parser/binding-linux-s390x-gnu@0.131.0': optional: true '@oxc-parser/binding-linux-s390x-gnu@0.132.0': optional: true + '@oxc-parser/binding-linux-x64-gnu@0.126.0': + optional: true + + '@oxc-parser/binding-linux-x64-gnu@0.127.0': + optional: true + '@oxc-parser/binding-linux-x64-gnu@0.131.0': optional: true '@oxc-parser/binding-linux-x64-gnu@0.132.0': optional: true + '@oxc-parser/binding-linux-x64-musl@0.126.0': + optional: true + + '@oxc-parser/binding-linux-x64-musl@0.127.0': + optional: true + '@oxc-parser/binding-linux-x64-musl@0.131.0': optional: true '@oxc-parser/binding-linux-x64-musl@0.132.0': optional: true + '@oxc-parser/binding-openharmony-arm64@0.126.0': + optional: true + + '@oxc-parser/binding-openharmony-arm64@0.127.0': + optional: true + '@oxc-parser/binding-openharmony-arm64@0.131.0': optional: true '@oxc-parser/binding-openharmony-arm64@0.132.0': optional: true + '@oxc-parser/binding-wasm32-wasi@0.126.0': + dependencies: + '@emnapi/core': 1.9.2 + '@emnapi/runtime': 1.9.2 + '@napi-rs/wasm-runtime': 1.1.4(@emnapi/core@1.9.2)(@emnapi/runtime@1.9.2) + optional: true + + '@oxc-parser/binding-wasm32-wasi@0.127.0': + dependencies: + '@emnapi/core': 1.9.2 + '@emnapi/runtime': 1.9.2 + '@napi-rs/wasm-runtime': 1.1.4(@emnapi/core@1.9.2)(@emnapi/runtime@1.9.2) + optional: true + '@oxc-parser/binding-wasm32-wasi@0.131.0': dependencies: '@emnapi/core': 1.10.0 @@ -8731,24 +9226,46 @@ snapshots: '@napi-rs/wasm-runtime': 1.1.4(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0) optional: true + '@oxc-parser/binding-win32-arm64-msvc@0.126.0': + optional: true + + '@oxc-parser/binding-win32-arm64-msvc@0.127.0': + optional: true + '@oxc-parser/binding-win32-arm64-msvc@0.131.0': optional: true '@oxc-parser/binding-win32-arm64-msvc@0.132.0': optional: true + '@oxc-parser/binding-win32-ia32-msvc@0.126.0': + optional: true + + '@oxc-parser/binding-win32-ia32-msvc@0.127.0': + optional: true + '@oxc-parser/binding-win32-ia32-msvc@0.131.0': optional: true '@oxc-parser/binding-win32-ia32-msvc@0.132.0': optional: true + '@oxc-parser/binding-win32-x64-msvc@0.126.0': + optional: true + + '@oxc-parser/binding-win32-x64-msvc@0.127.0': + optional: true + '@oxc-parser/binding-win32-x64-msvc@0.131.0': optional: true '@oxc-parser/binding-win32-x64-msvc@0.132.0': optional: true + '@oxc-project/types@0.126.0': {} + + '@oxc-project/types@0.127.0': {} + '@oxc-project/types@0.131.0': {} '@oxc-project/types@0.132.0': {} @@ -9761,12 +10278,56 @@ snapshots: '@ungap/structured-clone@1.3.0': {} + '@unhead/bundler@3.1.0(crossws@0.4.5(srvx@0.11.15))(esbuild@0.28.0)(lightningcss@1.32.0)(typescript@6.0.3)(unhead@3.1.0(vite@7.3.3(@types/node@25.9.1)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.47.1)(yaml@2.9.0)))(vite@7.3.3(@types/node@25.9.1)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.47.1)(yaml@2.9.0))': + dependencies: + '@vitejs/devtools-kit': 0.1.24(crossws@0.4.5(srvx@0.11.15))(typescript@6.0.3)(vite@7.3.3(@types/node@25.9.1)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.47.1)(yaml@2.9.0)) + magic-string: 0.30.21 + oxc-parser: 0.127.0 + oxc-walker: 0.7.0(oxc-parser@0.127.0) + ufo: 1.6.4 + unhead: 3.1.0(vite@7.3.3(@types/node@25.9.1)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.47.1)(yaml@2.9.0)) + unplugin: 3.0.0 + optionalDependencies: + esbuild: 0.28.0 + lightningcss: 1.32.0 + vite: 7.3.3(@types/node@25.9.1)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.47.1)(yaml@2.9.0) + transitivePeerDependencies: + - '@modelcontextprotocol/sdk' + - bufferutil + - crossws + - typescript + - utf-8-validate + '@unhead/vue@2.1.15(vue@3.5.34(typescript@6.0.3))': dependencies: hookable: 6.1.1 unhead: 2.1.15 vue: 3.5.34(typescript@6.0.3) + '@unhead/vue@3.1.0(crossws@0.4.5(srvx@0.11.15))(esbuild@0.28.0)(lightningcss@1.32.0)(typescript@6.0.3)(vite@7.3.3(@types/node@25.9.1)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.47.1)(yaml@2.9.0))(vue@3.5.34(typescript@6.0.3))': + dependencies: + '@unhead/bundler': 3.1.0(crossws@0.4.5(srvx@0.11.15))(esbuild@0.28.0)(lightningcss@1.32.0)(typescript@6.0.3)(unhead@3.1.0(vite@7.3.3(@types/node@25.9.1)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.47.1)(yaml@2.9.0)))(vite@7.3.3(@types/node@25.9.1)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.47.1)(yaml@2.9.0)) + hookable: 6.1.1 + unhead: 3.1.0(vite@7.3.3(@types/node@25.9.1)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.47.1)(yaml@2.9.0)) + unplugin: 3.0.0 + vue: 3.5.34(typescript@6.0.3) + optionalDependencies: + vite: 7.3.3(@types/node@25.9.1)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.47.1)(yaml@2.9.0) + transitivePeerDependencies: + - '@modelcontextprotocol/sdk' + - '@unhead/cli' + - bufferutil + - crossws + - esbuild + - lightningcss + - rolldown + - typescript + - utf-8-validate + + '@valibot/to-json-schema@1.7.0(valibot@1.4.0(typescript@6.0.3))': + dependencies: + valibot: 1.4.0(typescript@6.0.3) + '@vercel/nft@1.5.0(rollup@4.60.4)': dependencies: '@mapbox/node-pre-gyp': 2.0.3 @@ -9786,6 +10347,23 @@ snapshots: - rollup - supports-color + '@vitejs/devtools-kit@0.1.24(crossws@0.4.5(srvx@0.11.15))(typescript@6.0.3)(vite@7.3.3(@types/node@25.9.1)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.47.1)(yaml@2.9.0))': + dependencies: + birpc: 4.0.0 + devframe: 0.2.2(crossws@0.4.5(srvx@0.11.15))(typescript@6.0.3) + logs-sdk: 0.0.6 + mlly: 1.8.2 + pathe: 2.0.3 + perfect-debounce: 2.1.0 + tinyexec: 1.1.2 + vite: 7.3.3(@types/node@25.9.1)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.47.1)(yaml@2.9.0) + transitivePeerDependencies: + - '@modelcontextprotocol/sdk' + - bufferutil + - crossws + - typescript + - utf-8-validate + '@vitejs/plugin-vue-jsx@5.1.5(vite@7.3.3(@types/node@25.9.1)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.47.1)(yaml@2.9.0))(vue@3.5.34(typescript@6.0.3))': dependencies: '@babel/core': 7.29.0 @@ -10575,6 +11153,23 @@ snapshots: devalue@5.8.1: {} + devframe@0.2.2(crossws@0.4.5(srvx@0.11.15))(typescript@6.0.3): + dependencies: + '@valibot/to-json-schema': 1.7.0(valibot@1.4.0(typescript@6.0.3)) + birpc: 4.0.0 + cac: 7.0.0 + h3: 2.0.1-rc.22(crossws@0.4.5(srvx@0.11.15)) + logs-sdk: 0.0.6 + mrmime: 2.0.1 + pathe: 2.0.3 + valibot: 1.4.0(typescript@6.0.3) + ws: 8.20.1 + transitivePeerDependencies: + - bufferutil + - crossws + - typescript + - utf-8-validate + devlop@1.1.0: dependencies: dequal: 2.0.3 @@ -11361,6 +11956,13 @@ snapshots: optionalDependencies: crossws: 0.4.5(srvx@0.11.15) + h3@2.0.1-rc.22(crossws@0.4.5(srvx@0.11.15)): + dependencies: + rou3: 0.8.1 + srvx: 0.11.15 + optionalDependencies: + crossws: 0.4.5(srvx@0.11.15) + happy-dom@20.9.0: dependencies: '@types/node': 25.9.1 @@ -11757,6 +12359,12 @@ snapshots: lodash@4.18.1: {} + logs-sdk@0.0.6: + dependencies: + magic-string: 0.30.21 + oxc-parser: 0.126.0 + unplugin: 3.0.0 + long@5.3.2: {} longest-streak@3.1.0: {} @@ -12617,6 +13225,56 @@ snapshots: '@oxc-minify/binding-win32-ia32-msvc': 0.131.0 '@oxc-minify/binding-win32-x64-msvc': 0.131.0 + oxc-parser@0.126.0: + dependencies: + '@oxc-project/types': 0.126.0 + optionalDependencies: + '@oxc-parser/binding-android-arm-eabi': 0.126.0 + '@oxc-parser/binding-android-arm64': 0.126.0 + '@oxc-parser/binding-darwin-arm64': 0.126.0 + '@oxc-parser/binding-darwin-x64': 0.126.0 + '@oxc-parser/binding-freebsd-x64': 0.126.0 + '@oxc-parser/binding-linux-arm-gnueabihf': 0.126.0 + '@oxc-parser/binding-linux-arm-musleabihf': 0.126.0 + '@oxc-parser/binding-linux-arm64-gnu': 0.126.0 + '@oxc-parser/binding-linux-arm64-musl': 0.126.0 + '@oxc-parser/binding-linux-ppc64-gnu': 0.126.0 + '@oxc-parser/binding-linux-riscv64-gnu': 0.126.0 + '@oxc-parser/binding-linux-riscv64-musl': 0.126.0 + '@oxc-parser/binding-linux-s390x-gnu': 0.126.0 + '@oxc-parser/binding-linux-x64-gnu': 0.126.0 + '@oxc-parser/binding-linux-x64-musl': 0.126.0 + '@oxc-parser/binding-openharmony-arm64': 0.126.0 + '@oxc-parser/binding-wasm32-wasi': 0.126.0 + '@oxc-parser/binding-win32-arm64-msvc': 0.126.0 + '@oxc-parser/binding-win32-ia32-msvc': 0.126.0 + '@oxc-parser/binding-win32-x64-msvc': 0.126.0 + + oxc-parser@0.127.0: + dependencies: + '@oxc-project/types': 0.127.0 + optionalDependencies: + '@oxc-parser/binding-android-arm-eabi': 0.127.0 + '@oxc-parser/binding-android-arm64': 0.127.0 + '@oxc-parser/binding-darwin-arm64': 0.127.0 + '@oxc-parser/binding-darwin-x64': 0.127.0 + '@oxc-parser/binding-freebsd-x64': 0.127.0 + '@oxc-parser/binding-linux-arm-gnueabihf': 0.127.0 + '@oxc-parser/binding-linux-arm-musleabihf': 0.127.0 + '@oxc-parser/binding-linux-arm64-gnu': 0.127.0 + '@oxc-parser/binding-linux-arm64-musl': 0.127.0 + '@oxc-parser/binding-linux-ppc64-gnu': 0.127.0 + '@oxc-parser/binding-linux-riscv64-gnu': 0.127.0 + '@oxc-parser/binding-linux-riscv64-musl': 0.127.0 + '@oxc-parser/binding-linux-s390x-gnu': 0.127.0 + '@oxc-parser/binding-linux-x64-gnu': 0.127.0 + '@oxc-parser/binding-linux-x64-musl': 0.127.0 + '@oxc-parser/binding-openharmony-arm64': 0.127.0 + '@oxc-parser/binding-wasm32-wasi': 0.127.0 + '@oxc-parser/binding-win32-arm64-msvc': 0.127.0 + '@oxc-parser/binding-win32-ia32-msvc': 0.127.0 + '@oxc-parser/binding-win32-x64-msvc': 0.127.0 + oxc-parser@0.131.0: dependencies: '@oxc-project/types': 0.131.0 @@ -12690,6 +13348,11 @@ snapshots: '@oxc-transform/binding-win32-ia32-msvc': 0.131.0 '@oxc-transform/binding-win32-x64-msvc': 0.131.0 + oxc-walker@0.7.0(oxc-parser@0.127.0): + dependencies: + magic-regexp: 0.10.0 + oxc-parser: 0.127.0 + oxc-walker@1.0.0(oxc-parser@0.131.0): dependencies: magic-regexp: 0.11.0 @@ -13821,6 +14484,13 @@ snapshots: dependencies: hookable: 6.1.1 + unhead@3.1.0(vite@7.3.3(@types/node@25.9.1)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.47.1)(yaml@2.9.0)): + dependencies: + hookable: 6.1.1 + unplugin: 3.0.0 + optionalDependencies: + vite: 7.3.3(@types/node@25.9.1)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.47.1)(yaml@2.9.0) + unicorn-magic@0.3.0: {} unicorn-magic@0.4.0: {} diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index cc274de17..2b62102f9 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -4,10 +4,14 @@ trustPolicy: no-downgrade packages: - packages/* - playground + - test/fixtures/unhead-v3 - '!examples/**' overrides: '@nuxt/scripts': 'workspace:*' + # Force unhead v3 only inside the unhead-v3 regression fixture; the rest of + # the workspace stays on v2 via Nuxt's transitive resolution. + unhead-v3-fixture>@unhead/vue: ^3.0.0 vitest-environment-nuxt: 2.0.0 catalog: '@antfu/eslint-config': ^9.0.0 diff --git a/test/e2e/unhead-v3-compat.test.ts b/test/e2e/unhead-v3-compat.test.ts new file mode 100644 index 000000000..b72eb4874 --- /dev/null +++ b/test/e2e/unhead-v3-compat.test.ts @@ -0,0 +1,43 @@ +import { readFileSync } from 'node:fs' +import { fileURLToPath } from 'node:url' +import { createResolver } from '@nuxt/kit' +import { $fetch, setup } from '@nuxt/test-utils/e2e' +import { describe, expect, it } from 'vitest' + +const { resolve } = createResolver(import.meta.url) + +// Skip when the workspace root already resolves @unhead/vue to v3 (e.g. an +// ecosystem-ci v3 run): the rest of the suite then provides v3 coverage and +// this fixture is redundant. The fixture exists to backstop v3 specifically +// while the default install resolves to v2. +function rootUnheadMajor(): number | null { + try { + const pkgPath = fileURLToPath(new URL('../../node_modules/@unhead/vue/package.json', import.meta.url)) + const pkg = JSON.parse(readFileSync(pkgPath, 'utf8')) + return Number.parseInt(String(pkg.version).split('.')[0], 10) + } + catch { + return null + } +} +const skip = rootUnheadMajor() === 3 + +if (!skip) { + await setup({ + rootDir: resolve('../fixtures/unhead-v3'), + dev: true, + browser: false, + }) +} + +describe.skipIf(skip)('unhead v3 compat', () => { + it('sSR renders pages that exercise the v3 regression surface', async () => { + const html = await $fetch('/') + // App rendered — proves the v3 build/SSR did not error on useScript, + // useHead, or the partytown quick-path inside the fixture's app.vue. + expect(html).toContain('id="probe-status"') + // useHead resource-hint with runtime-determined rel (the original Daniel + // error from PR #795). If a regression silently drops the tag, this fails. + expect(html).toMatch(/]+rel="(preconnect|dns-prefetch)"[^>]+example\.com/) + }) +}) diff --git a/test/fixtures/unhead-v3/app.vue b/test/fixtures/unhead-v3/app.vue new file mode 100644 index 000000000..e7f98792a --- /dev/null +++ b/test/fixtures/unhead-v3/app.vue @@ -0,0 +1,40 @@ + + + diff --git a/test/fixtures/unhead-v3/nuxt.config.ts b/test/fixtures/unhead-v3/nuxt.config.ts new file mode 100644 index 000000000..04f1f6fe4 --- /dev/null +++ b/test/fixtures/unhead-v3/nuxt.config.ts @@ -0,0 +1,12 @@ +import { defineNuxtConfig } from 'nuxt/config' + +// Regression fixture pinned to @unhead/vue@^3 via the +// `unhead-v3-fixture>@unhead/vue` override in pnpm-workspace.yaml. +// Module resolution picks v3 up through the fixture's own node_modules symlink. +export default defineNuxtConfig({ + modules: ['@nuxt/scripts'], + future: { + compatibilityVersion: 5, + }, + compatibilityDate: '2026-05-27', +}) diff --git a/test/fixtures/unhead-v3/package.json b/test/fixtures/unhead-v3/package.json new file mode 100644 index 000000000..f8dba4aba --- /dev/null +++ b/test/fixtures/unhead-v3/package.json @@ -0,0 +1,10 @@ +{ + "name": "unhead-v3-fixture", + "private": true, + "type": "module", + "dependencies": { + "@nuxt/scripts": "workspace:*", + "@unhead/vue": "^3.0.0", + "nuxt": "catalog:" + } +} diff --git a/test/nuxt-runtime/warmup.nuxt.test.ts b/test/nuxt-runtime/warmup.nuxt.test.ts index fe54d2b75..4906ced52 100644 --- a/test/nuxt-runtime/warmup.nuxt.test.ts +++ b/test/nuxt-runtime/warmup.nuxt.test.ts @@ -1,15 +1,13 @@ -import { createHeadCore } from '@unhead/vue' -import { renderSSRHead } from '@unhead/vue/server' +import { createHead, renderSSRHead } from '@unhead/vue/server' import { describe, expect, it } from 'vitest' import { useScript } from '#imports' describe.skipIf(process.env.CI)('script warmup', () => { it('default', async () => { - const head = createHeadCore() + const head = createHead({ disableDefaults: true }) const script = useScript({ src: '/preload.js', }, { - // @ts-expect-error untyped head, }) const ssr = await renderSSRHead(head) @@ -25,13 +23,12 @@ describe.skipIf(process.env.CI)('script warmup', () => { script.remove() }) it('preload relative', async () => { - const head = createHeadCore() + const head = createHead({ disableDefaults: true }) const script = useScript({ src: '/preload.js', }, { trigger: 'manual', warmupStrategy: 'preload', - // @ts-expect-error untyped head, }) const ssr = await renderSSRHead(head) @@ -47,13 +44,12 @@ describe.skipIf(process.env.CI)('script warmup', () => { script.remove() }) it('preconnect relative', async () => { - const head = createHeadCore() + const head = createHead({ disableDefaults: true }) const script = useScript({ src: '/preconnect.js', }, { trigger: 'manual', warmupStrategy: 'preconnect', - // @ts-expect-error untyped head, }) const ssr = await renderSSRHead(head) @@ -61,13 +57,12 @@ describe.skipIf(process.env.CI)('script warmup', () => { script.remove() }) it('preconnect abs', async () => { - const head = createHeadCore() + const head = createHead({ disableDefaults: true }) const script = useScript({ src: 'https://example.com/preconnect.js', }, { trigger: 'manual', warmupStrategy: 'preconnect', - // @ts-expect-error untyped head, }) const ssr = await renderSSRHead(head) @@ -84,13 +79,12 @@ describe.skipIf(process.env.CI)('script warmup', () => { script.remove() }) it('preload abs', async () => { - const head = createHeadCore() + const head = createHead({ disableDefaults: true }) const script = useScript({ src: 'https://example.com/preload.js', }, { trigger: 'manual', warmupStrategy: 'preload', - // @ts-expect-error untyped head, }) const ssr = await renderSSRHead(head) @@ -108,13 +102,12 @@ describe.skipIf(process.env.CI)('script warmup', () => { script.remove() }) it('respects useScript privacy controls', async () => { - const head = createHeadCore() + const head = createHead({ disableDefaults: true }) const script = useScript({ src: 'https://s.kk-resources.com/leadtag.js', crossorigin: 'use-credentials', referrerpolicy: 'no-referrer-when-downgrade', }, { - // @ts-expect-error untyped head, }) const ssr = await renderSSRHead(head) @@ -132,13 +125,12 @@ describe.skipIf(process.env.CI)('script warmup', () => { script.remove() }) it('respects useScript privacy controls - #293', async () => { - const head = createHeadCore() + const head = createHead({ disableDefaults: true }) const script = useScript({ src: 'https://s.kk-resources.com/leadtag.js', async: true, crossorigin: false, }, { - // @ts-expect-error untyped head, }) const ssr = await renderSSRHead(head) diff --git a/test/unit/unhead-v3-typecheck.test.ts b/test/unit/unhead-v3-typecheck.test.ts new file mode 100644 index 000000000..b40a5e0c3 --- /dev/null +++ b/test/unit/unhead-v3-typecheck.test.ts @@ -0,0 +1,73 @@ +import { execFile } from 'node:child_process' +import { readFileSync } from 'node:fs' +import { fileURLToPath } from 'node:url' +import { promisify } from 'node:util' +import { describe, expect, it } from 'vitest' + +const exec = promisify(execFile) + +const fixtureDir = fileURLToPath(new URL('../fixtures/unhead-v3', import.meta.url)) + +// Skip when the workspace root already resolves @unhead/vue to v3: the rest +// of the suite then provides v3 typecheck coverage and this fixture is +// redundant. See the matching guard in test/e2e/unhead-v3-compat.test.ts. +function rootUnheadMajor(): number | null { + try { + const pkgPath = fileURLToPath(new URL('../../node_modules/@unhead/vue/package.json', import.meta.url)) + const pkg = JSON.parse(readFileSync(pkgPath, 'utf8')) + return Number.parseInt(String(pkg.version).split('.')[0], 10) + } + catch { + return null + } +} +const skip = rootUnheadMajor() === 3 + +// Pre-existing baseline errors that already exist when the fixture compiles +// against @unhead/vue@^3. These are unrelated to v3 type narrowing (the +// `$fetch` generic on ScriptGoogleMaps.vue is a global-type resolution +// issue inside the auto-imported component). Captured here so the test only +// flags *new* errors against v3, not historical noise. +const KNOWN_BASELINE_ERRORS = new Set([ + 'packages/script/src/runtime/components/GoogleMaps/ScriptGoogleMaps.vue(330,31): error TS2558: Expected 0 type arguments, but got 1.', +]) + +function parseTypecheckErrors(output: string): string[] { + // Lines look like: + // ../../../packages/script/src/runtime/foo.ts(12,3): error TS1234: ... + // Normalize the leading `../` segments away so the assertion is path-agnostic. + const lines = output.split('\n') + return lines + .filter(l => /error TS\d+/.test(l)) + .map(l => l.replace(/^(\.\.\/)+/, '')) + .sort() +} + +describe.skipIf(skip)('unhead v3 typecheck regression', () => { + it('introduces no new type errors when compiled against @unhead/vue@^3', async () => { + let stdout = '' + let stderr = '' + try { + const res = await exec('pnpm', ['exec', 'nuxt', 'typecheck'], { + cwd: fixtureDir, + env: { ...process.env, FORCE_COLOR: '0' }, + maxBuffer: 32 * 1024 * 1024, + }) + stdout = res.stdout + stderr = res.stderr + } + catch (err: any) { + stdout = err.stdout || '' + stderr = err.stderr || '' + } + + const errors = parseTypecheckErrors(`${stdout}\n${stderr}`) + const newErrors = errors.filter(e => !KNOWN_BASELINE_ERRORS.has(e)) + + expect(newErrors, [ + 'New type errors detected when typechecking the unhead-v3 fixture.', + 'Either: (a) fix the source so it compiles against @unhead/vue@^3, or', + '(b) add the error to KNOWN_BASELINE_ERRORS with a comment explaining why.', + ].join('\n')).toEqual([]) + }, 120_000) +})