diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 67be66a..a8e97d3 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -21,5 +21,8 @@ jobs: - name: Prepare Playground run: pnpm nuxt prepare playground + - name: Prepare E2E Fixture + run: pnpm nuxt prepare test/named-layout-slots/e2e/fixture + - name: Run Tests run: pnpm run test diff --git a/.gitignore b/.gitignore index 62827bb..314e309 100644 --- a/.gitignore +++ b/.gitignore @@ -3,3 +3,5 @@ node_modules *.vsix packages/vscode/LICENSE packages/vscode/README.md +.idea +.nuxt diff --git a/package.json b/package.json index e88fcc8..a6d5853 100644 --- a/package.json +++ b/package.json @@ -12,15 +12,20 @@ "dev": "pnpm -r --parallel dev", "prepare": "zin link vscode", "publish": "node scripts/publish.ts", - "test": "vitest" + "test": "vitest", + "test:e2e": "pnpm run test:prepare && vitest run --project named-layout-slots-e2e", + "test:prepare": "pnpm --filter @dxup/nuxt build && nuxt prepare test/named-layout-slots/e2e/fixture" }, "devDependencies": { + "@nuxt/test-utils": "catalog:", "@types/node": "catalog:", + "@vue/test-utils": "catalog:", "@zinkawaii/eslint-config": "catalog:", "@zinkawaii/scripts": "catalog:", "@zinkawaii/tsconfig": "catalog:", "bumpp": "catalog:", "eslint": "catalog:", + "happy-dom": "catalog:", "pathe": "catalog:", "tinyexec": "catalog:", "tsdown": "catalog:", diff --git a/packages/nuxt/src/module/named-layout-slots/runtime/layouts.ts b/packages/nuxt/src/module/named-layout-slots/runtime/layouts.ts index a8da563..9641a8a 100644 --- a/packages/nuxt/src/module/named-layout-slots/runtime/layouts.ts +++ b/packages/nuxt/src/module/named-layout-slots/runtime/layouts.ts @@ -1,57 +1,107 @@ -import { type ComponentInternalInstance, computed, defineComponent, getCurrentInstance, h, inject, onScopeDispose, provide, shallowRef, type ShallowRef, type Slots } from "vue"; +import { computed, defineComponent, Fragment, getCurrentInstance, h, inject, onActivated, onDeactivated, onScopeDispose, onUpdated, provide, shallowRef, type Slots } from "vue"; // @ts-expect-error virtual file import { NuxtLayout } from "#build/dxup/layouts.mjs"; +import { injectionKey } from "./registry"; -interface LayoutSlotsRegistry { - slots: ShallowRef; - ready: Promise; - use: (slots: Slots, owner: ComponentInternalInstance | null) => void; +interface SlotsLayer { + slots: Slots; + uid: number; } -const injectionKey = Symbol.for("dxup:layout-slots"); - export default defineComponent((props, ctx) => { + const layers: SlotsLayer[] = []; const slots = shallowRef(null); - let currentOwner: ComponentInternalInstance | null = null; + let layerUid = 0; let resolveReady: () => void; - provide(injectionKey, { + function update() { + // a single active page needs no merging + slots.value = layers.length > 1 ? mergeLayers([...layers]) : layers[0]?.slots ?? null; + } + + provide(injectionKey, { slots, - ready: new Promise((resolve) => { + ready: new Promise((resolve) => { resolveReady = resolve; }), - use(value, owner) { - // a nested page must not override the slots of its top-level page - if (currentOwner) { - for (let parent = owner?.parent; parent; parent = parent.parent) { - if (parent === currentOwner) { - return; - } + use(value) { + const layer: SlotsLayer = { + slots: value, + uid: layerUid++, + }; + function add() { + if (layers.every((entry) => entry.slots !== value)) { + layers.push(layer); + update(); } } - - slots.value = value; - currentOwner = owner; - onScopeDispose(() => { - // the next page can finish setup before this page is disposed - // in that case, the old page no longer owns the registry and must not clear it - if (currentOwner === owner) { - slots.value = null; - currentOwner = null; + function remove() { + const index = layers.findIndex((entry) => entry.slots === value); + if (index !== -1) { + layers.splice(index, 1); + update(); } - }); + } + + add(); + // a page keeps providing its slots until it is unmounted, + // so a navigation only switches the slots once the next page has settled + onScopeDispose(remove); + // a page cached by must not provide slots while inactive + onDeactivated(remove); + onActivated(add); resolveReady?.(); }, + invalidate() { + // always expose a fresh object; reactivity propagates correctly only on identity change + slots.value = layers.length ? mergeLayers([...layers]) : null; + }, + getOwner(name) { + for (let i = layers.length - 1; i >= 0; i--) { + if (layers[i].slots[name]) { + return layers[i].uid; + } + } + }, }); return () => h(NuxtLayout, props, ctx.slots); }); +/** + * Merges the slots of all mounted pages. The most recently mounted pages have + * a higher priority. + * @param layers + */ +function mergeLayers(layers: SlotsLayer[]): Slots { + const merged: Slots = Object.create(null); + for (let i = layers.length - 1; i >= 0; i--) { + for (const key in layers[i].slots) { + if (!(key in merged)) { + Object.defineProperty(merged, key, { + enumerable: true, + configurable: true, + // resolve lazily, so re-rendered pages provide their current slot functions + get: () => { + for (let j = layers.length - 1; j >= 0; j--) { + const slot = layers[j].slots[key]; + if (slot) { + return slot; + } + } + }, + }); + } + } + } + return merged; +} + /** * Returns the slots forwarded by the active page via named layout slots. */ export function useLayoutSlots() { - const registry = inject(injectionKey, null); + const registry = inject(injectionKey, null); return computed(() => registry?.slots.value ?? {}); } @@ -63,7 +113,7 @@ export const LayoutSlot = defineComponent({ }, }, setup(props, ctx) { - const registry = inject(injectionKey); + const registry = inject(injectionKey); const currentInstance = getCurrentInstance(); const render = () => { @@ -72,7 +122,10 @@ export const LayoutSlot = defineComponent({ // the parent layout should be able to render the raw slots as fallback registry?.slots.value?.[props.name] ?? currentInstance?.parent?.slots[props.name]; // an unprovided slot falls back to the children of the original `` - return slot?.(ctx.attrs) ?? ctx.slots.default?.(); + const children = slot?.(ctx.attrs) ?? ctx.slots.default?.(); + // key the content by the forward that provides it, so it lives and dies + // with its page instead of being patched across page boundaries + return h(Fragment, { key: registry?.getOwner(props.name) ?? -1 }, children); }; if (import.meta.server && registry && !registry.slots.value?.[props.name]) { @@ -83,10 +136,21 @@ export const LayoutSlot = defineComponent({ }); export const LayoutSlotsForward = defineComponent((props, ctx) => { - const registry = inject(injectionKey); - const currentInstance = getCurrentInstance(); + const registry = inject(injectionKey); - registry?.use(ctx.slots, currentInstance); + registry?.use(ctx.slots); + + // invalidate the registry when conditional slots are re-rendered (`ctx.slots` is mutated in place) + if (import.meta.client && registry) { + let keys = Object.keys(ctx.slots).join("\0"); + onUpdated(() => { + const next = Object.keys(ctx.slots).join("\0"); + if (next !== keys) { + keys = next; + registry.invalidate(); + } + }); + } return () => { const vnodes = ctx.slots.default?.(); diff --git a/packages/nuxt/src/module/named-layout-slots/runtime/registry.ts b/packages/nuxt/src/module/named-layout-slots/runtime/registry.ts new file mode 100644 index 0000000..dd47e4e --- /dev/null +++ b/packages/nuxt/src/module/named-layout-slots/runtime/registry.ts @@ -0,0 +1,11 @@ +import type { InjectionKey, ShallowRef, Slots } from "vue"; + +export interface LayoutSlotsRegistry { + slots: ShallowRef; + ready: Promise; + use: (slots: Slots) => void; + invalidate: () => void; + getOwner: (name: string) => number | undefined; +} + +export const injectionKey = Symbol.for("dxup:layout-slots") as InjectionKey; diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 382a921..9c0472b 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -126,6 +126,9 @@ settings: catalogs: default: + '@nuxt/test-utils': + specifier: ^4.1.0 + version: 4.1.0 '@types/node': specifier: ^26.2.0 version: 26.2.0 @@ -144,6 +147,9 @@ catalogs: '@vue/language-core': specifier: ^3.3.10 version: 3.3.10 + '@vue/test-utils': + specifier: ^2.4.11 + version: 2.4.11 '@vue/typescript-plugin': specifier: ^3.3.10 version: 3.3.10 @@ -165,6 +171,9 @@ catalogs: eslint: specifier: ^10.8.1 version: 10.8.1 + happy-dom: + specifier: ^20.11.2 + version: 20.11.2 knitwork: specifier: ^1.3.0 version: 1.3.0 @@ -207,12 +216,18 @@ importers: .: devDependencies: + '@nuxt/test-utils': + specifier: 'catalog:' + version: 4.1.0(@vue/test-utils@2.4.11(@vue/compiler-dom@3.5.41)(@vue/server-renderer@3.5.41)(vue@3.5.41(typescript-native-bridge@6.0.3-bridge.13.tsgo.7.0.2)))(confbox@0.2.4)(dotenv@17.4.2)(giget@3.3.1)(happy-dom@20.11.2)(jiti@2.7.0)(magicast@0.5.4)(mlly@1.8.2)(rolldown@1.2.4)(typescript-native-bridge@6.0.3-bridge.13.tsgo.7.0.2)(vite@8.2.1)(vitest@4.1.10(@types/node@26.2.0)(happy-dom@20.11.2)(vite@8.2.1)) '@types/node': specifier: 'catalog:' version: 26.2.0 + '@vue/test-utils': + specifier: 'catalog:' + version: 2.4.11(@vue/compiler-dom@3.5.41)(@vue/server-renderer@3.5.41)(vue@3.5.41(typescript-native-bridge@6.0.3-bridge.13.tsgo.7.0.2)) '@zinkawaii/eslint-config': specifier: 'catalog:' - version: 0.5.3(@typescript-eslint/typescript-estree@8.67.0(supports-color@7.2.0)(typescript-native-bridge@6.0.3-bridge.13.tsgo.7.0.2))(@typescript-eslint/utils@8.67.0(eslint@10.8.1(jiti@2.7.0)(supports-color@7.2.0))(supports-color@7.2.0)(typescript-native-bridge@6.0.3-bridge.13.tsgo.7.0.2))(@vue/compiler-sfc@3.5.41)(eslint@10.8.1(jiti@2.7.0)(supports-color@7.2.0))(supports-color@7.2.0)(typescript-native-bridge@6.0.3-bridge.13.tsgo.7.0.2)(vitest@4.1.10(@types/node@26.2.0)(vite@8.2.1)) + version: 0.5.3(@typescript-eslint/typescript-estree@8.67.0(supports-color@7.2.0)(typescript-native-bridge@6.0.3-bridge.13.tsgo.7.0.2))(@typescript-eslint/utils@8.67.0(eslint@10.8.1(jiti@2.7.0)(supports-color@7.2.0))(supports-color@7.2.0)(typescript-native-bridge@6.0.3-bridge.13.tsgo.7.0.2))(@vue/compiler-sfc@3.5.41)(eslint@10.8.1(jiti@2.7.0)(supports-color@7.2.0))(supports-color@7.2.0)(typescript-native-bridge@6.0.3-bridge.13.tsgo.7.0.2)(vitest@4.1.10(@types/node@26.2.0)(happy-dom@20.11.2)(vite@8.2.1)) '@zinkawaii/scripts': specifier: 'catalog:' version: 0.0.5 @@ -225,6 +240,9 @@ importers: eslint: specifier: 'catalog:' version: 10.8.1(jiti@2.7.0)(supports-color@7.2.0) + happy-dom: + specifier: 'catalog:' + version: 20.11.2 pathe: specifier: 'catalog:' version: 2.0.3 @@ -233,10 +251,10 @@ importers: version: 1.3.0 tsdown: specifier: 'catalog:' - version: 0.22.14(@vitejs/devtools@0.4.12)(@volar/typescript@2.4.28)(typescript-native-bridge@6.0.3-bridge.13.tsgo.7.0.2) + version: 0.22.14(@vitejs/devtools@0.4.12)(@volar/typescript@2.4.28(typescript-native-bridge@6.0.3-bridge.13.tsgo.7.0.2))(typescript-native-bridge@6.0.3-bridge.13.tsgo.7.0.2) vitest: specifier: 'catalog:' - version: 4.1.10(@types/node@26.2.0)(vite@8.2.1) + version: 4.1.10(@types/node@26.2.0)(happy-dom@20.11.2)(vite@8.2.1) packages/nuxt: dependencies: @@ -245,7 +263,7 @@ importers: version: link:../unimport '@nuxt/kit': specifier: npm:@nuxt/kit-nightly@^5.0.0-29782515.650ee625 - version: '@nuxt/kit-nightly@5.0.0-29782515.650ee625(confbox@0.2.4)(jiti@2.7.0)(magic-string@1.2.0)(mlly@1.8.2)(rolldown@1.2.4)(unplugin@3.3.0(rolldown@1.2.4)(vite@8.2.1))' + version: '@nuxt/kit-nightly@5.0.0-29782515.650ee625(confbox@0.2.4)(dotenv@17.4.2)(giget@3.3.1)(jiti@2.7.0)(magic-string@1.2.0)(mlly@1.8.2)(rolldown@1.2.4)(unplugin@3.3.0(rolldown@1.2.4)(vite@8.2.1))' '@vue/compiler-dom': specifier: 'catalog:' version: 3.5.41 @@ -276,7 +294,7 @@ importers: version: 2.4.28 '@volar/typescript': specifier: 'catalog:' - version: 2.4.28 + version: 2.4.28(typescript-native-bridge@6.0.3-bridge.13.tsgo.7.0.2) '@vue/language-core': specifier: 'catalog:' version: 3.3.10 @@ -331,7 +349,7 @@ importers: version: 3.3.10(typescript-native-bridge@6.0.3-bridge.13.tsgo.7.0.2) nuxt: specifier: npm:nuxt-nightly@^5.0.0-29782515.650ee625 - version: nuxt-nightly@5.0.0-29782515.650ee625(@azure/identity@4.13.1(supports-color@7.2.0))(@oxc-project/types@0.144.0)(@types/node@26.2.0)(@vitejs/devtools-kit@0.4.12(cac@7.0.0)(srvx@0.12.5)(vite@8.2.1))(@vitejs/devtools@0.4.12)(@vue/compiler-sfc@3.5.41)(cac@7.0.0)(confbox@0.2.4)(crossws@0.4.10(srvx@0.12.5))(eslint@10.8.1(jiti@2.7.0)(supports-color@7.2.0))(jiti@2.7.0)(lightningcss@1.33.0)(mlly@1.8.2)(nuxt-nightly@5.0.0-29782515.650ee625)(rolldown@1.2.4)(srvx@0.12.5)(typescript-native-bridge@6.0.3-bridge.13.tsgo.7.0.2)(valibot@1.4.2(typescript-native-bridge@6.0.3-bridge.13.tsgo.7.0.2))(vite@8.2.1)(yaml@2.9.0) + version: nuxt-nightly@5.0.0-29782515.650ee625(@azure/identity@4.13.1(supports-color@7.2.0))(@oxc-project/types@0.144.0)(@types/node@26.2.0)(@vitejs/devtools-kit@0.4.12(cac@7.0.0)(srvx@0.12.5)(vite@8.2.1))(@vitejs/devtools@0.4.12)(@vue/compiler-sfc@3.5.41)(cac@7.0.0)(confbox@0.2.4)(crossws@0.4.10(srvx@0.12.5))(devframe@0.8.2(cac@7.0.0)(srvx@0.12.5))(eslint@10.8.1(jiti@2.7.0)(supports-color@7.2.0))(jiti@2.7.0)(lightningcss@1.33.0)(mlly@1.8.2)(nuxt-nightly@5.0.0-29782515.650ee625)(rolldown@1.2.4)(srvx@0.12.5)(typescript-native-bridge@6.0.3-bridge.13.tsgo.7.0.2)(valibot@1.4.2(typescript-native-bridge@6.0.3-bridge.13.tsgo.7.0.2))(vite@8.2.1)(yaml@2.9.0) typescript: specifier: npm:typescript-native-bridge@^6.0.3-bridge.13.tsgo.7.0.2 version: typescript-native-bridge@6.0.3-bridge.13.tsgo.7.0.2 @@ -631,6 +649,10 @@ packages: resolution: {integrity: sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==} engines: {node: '>=18.18'} + '@isaacs/cliui@8.0.2': + resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} + engines: {node: '>=12'} + '@jridgewell/gen-mapping@0.3.13': resolution: {integrity: sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==} @@ -664,8 +686,8 @@ packages: resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} engines: {node: '>= 8'} - '@nuxt/cli-nightly@4.0.0-20260812-132059-0bb4e52': - resolution: {integrity: sha512-TPs1pSMc03ZtxNd9jratXKuAzalzTTvP7LzxgoPkRCqtK2S5YXU9hJrbM5gJj7qkKkahpefLfrDiG2SYxYzY/g==} + '@nuxt/cli-nightly@4.0.0-20260818-221829-0bb4e52': + resolution: {integrity: sha512-OgxCEcnOsJQnedBlZqAqH/yEefBX1wqQoBhI6NKwGx6VX1SGImUniBYdS6L7HWOCMAcHSYbfUkQs8U+9ib/lqw==} engines: {node: ^22.19.0 || ^24.11.0 || >=26.0.0} hasBin: true peerDependencies: @@ -686,6 +708,11 @@ packages: serve: optional: true + '@nuxt/devtools-kit@2.7.0': + resolution: {integrity: sha512-MIJdah6CF6YOW2GhfKnb8Sivu6HpcQheqdjOlZqShBr+1DyjtKQbAKSCAyKPaoIzZP4QOo2SmTFV6aN8jBeEIQ==} + peerDependencies: + vite: '>=6.0' + '@nuxt/devtools-kit@4.0.0-alpha.10': resolution: {integrity: sha512-P7TiQ7KKQ/O8dnHAzarFeekKCQtTfP7/kcY9IXYcXIkNOF8UMP984DGsPkSNdrUAFjBQRmc6TNhzq0QO3717lQ==} peerDependencies: @@ -767,6 +794,45 @@ packages: peerDependencies: '@nuxt/kit': '>=3.0.0' + '@nuxt/test-utils@4.1.0': + resolution: {integrity: sha512-B0CipGKVVY5qbLMXJqYPYdalNzE9VFzybEAOqHGFHPDqv/8RFRe+/F3lJJigtLFroxaBDMMyrhLcmgKIXBv8og==} + engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0} + peerDependencies: + '@cucumber/cucumber': '>=11.0.0' + '@jest/globals': '>=30.0.0' + '@playwright/test': ^1.43.1 + '@testing-library/vue': ^8.0.1 + '@vitest/ui': '*' + '@vue/test-utils': ^2.4.2 + h3-next: '>=2.0.1-rc.22' + happy-dom: '>=20.0.11' + jsdom: '>=27.4.0' + playwright-core: ^1.43.1 + vitest: ^4.0.2 + peerDependenciesMeta: + '@cucumber/cucumber': + optional: true + '@jest/globals': + optional: true + '@playwright/test': + optional: true + '@testing-library/vue': + optional: true + '@vitest/ui': + optional: true + '@vue/test-utils': + optional: true + h3-next: + optional: true + happy-dom: + optional: true + jsdom: + optional: true + playwright-core: + optional: true + vitest: + optional: true + '@nuxt/vite-builder-nightly@5.0.0-29782515.650ee625': resolution: {integrity: sha512-IcJ511gN4THr3EcFIyZVxTywO626s30mGsLMYIyoieN7e56zsG7ULgTCQf44sT3afMuZQMbsjd0zH+2DKRCrjw==} engines: {node: ^22.18.0 || ^24.11.0 || >=26.0.0} @@ -793,6 +859,9 @@ packages: rollup-plugin-visualizer: optional: true + '@one-ini/wasm@0.1.1': + resolution: {integrity: sha512-XuySG1E38YScSJoMlqovLru4KTUNSjgVTIjyh7qMX6aNN5HY5Ct5LhRJdxO79JtTzKfzV/bnWpz+zquYrISsvw==} + '@ota-meshi/ast-token-store@0.3.0': resolution: {integrity: sha512-XRO0zi2NIUKq2lUk3T1ecFSld1fMWRKE6naRFGkgkdeosx7IslyUKNv5Dcb5PJTja9tHJoFu0v/7yEpAkrkrTg==} engines: {node: ^20.19.0 || ^22.13.0 || >=24} @@ -800,6 +869,10 @@ packages: '@oxc-project/types@0.144.0': resolution: {integrity: sha512-nuhZIOLuI6TFQ32I/WnUx+SCPY7SdSKwgnFHydAuoS1+Z4BRcaP+RRJmGzl9lw+0OFF7UmaESf7KQRXaNLHypg==} + '@pkgjs/parseargs@0.11.0': + resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} + engines: {node: '>=14'} + '@pkgr/core@0.3.6': resolution: {integrity: sha512-SEeaJLb3qBNF/OaXnaR1NmmBbFYk1zC0ZH/52fATcRPLFg/p791YrcyFFy44Bo9sLaGuSuLp5Q6axbb/O+v/RA==} engines: {node: ^14.18.0 || >=16.0.0} @@ -1026,6 +1099,12 @@ packages: '@types/unist@3.0.3': resolution: {integrity: sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==} + '@types/whatwg-mimetype@3.0.2': + resolution: {integrity: sha512-c2AKvDT8ToxLIOUlN51gTiHXflsfIFisS4pO7pDPoKouJCESkhZnEy623gwP9laCy5lnLDAw1vAzu2vM2YLOrA==} + + '@types/ws@8.18.1': + resolution: {integrity: sha512-ThVF6DCVhA8kUGy+aazFQ4kXQ7E1Ty7A3ypFOe0IcJV8O/M511G99AW24irKrW56Wt44yG9+ij8FaqoBGkuBXg==} + '@typescript-eslint/eslint-plugin@8.67.0': resolution: {integrity: sha512-Un7Heoyj65NREbKAyIrFxeM143NZpExWmy1Nep4DLeQOeLlTeumPjoNKnBrU5D5moWXbPJgRa5Uwcdu0faVNGQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} @@ -1255,6 +1334,11 @@ packages: '@volar/typescript@2.4.28': resolution: {integrity: sha512-Ja6yvWrbis2QtN4ClAKreeUZPVYMARDYZl9LMEv1iQ1QdepB6wn0jTRxA9MftYmYa4DQ4k/DaSZpFPUfxl8giw==} + peerDependencies: + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true '@vscode/vsce-sign-alpine-arm64@2.0.6': resolution: {integrity: sha512-wKkJBsvKF+f0GfsUuGT0tSW0kZL87QggEiqNqK6/8hvqsXvpx8OsTEc3mnE1kejkh5r+qUyQ7PtF8jZYN0mo8Q==} @@ -1357,6 +1441,16 @@ packages: '@vue/shared@3.5.41': resolution: {integrity: sha512-IOnwSCma8j+9xJT6b8H0dEYidC80NsYmNMlZxRsukYcSoGaDBohog5hDxzeUXdFeGWFA++vWvxqOmrr96VlqMA==} + '@vue/test-utils@2.4.11': + resolution: {integrity: sha512-GDqaqZsA6m2E5vNzej0aYiIb6BX8xV9pNSbbbXKOfEYwg7ZNblVX8suyqmUBThq8VIrgAJNxn+z72hVtUeiWHA==} + peerDependencies: + '@vue/compiler-dom': 3.x + '@vue/server-renderer': 3.x + vue: 3.x + peerDependenciesMeta: + '@vue/server-renderer': + optional: true + '@vue/typescript-plugin@3.3.10': resolution: {integrity: sha512-1IzVHNgSrueIsQNETp9I+emLwuhnuw8iV1s9i6wKtfoYPEtg6ZXAgDQKPupedDZ+IQbkm9CSUc3NKODPpJByHg==} @@ -1565,6 +1659,10 @@ packages: '@zinkawaii/tsconfig@0.1.0': resolution: {integrity: sha512-rNzI1IwTzwDTlHJ8jxEP35JB3gwKWaBurGHzLWe9VWPTzJmEyeF+wVAgfKerPJoNvuRo2jcSzHkuR8urGIClzA==} + abbrev@2.0.0: + resolution: {integrity: sha512-6/mh1E2u2YgEsCHdY0Yx5oW+61gZU+1vXaoiHHrpKeuRNNgFvS+/jrwHiQhB5apAf5oB7UB7E19ol2R2LKH8hQ==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + acorn-jsx@5.3.2: resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} peerDependencies: @@ -1604,6 +1702,10 @@ packages: resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} engines: {node: '>=8'} + ansi-styles@6.2.3: + resolution: {integrity: sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==} + engines: {node: '>=12'} + ansis@4.3.1: resolution: {integrity: sha512-BJ8/l4R5LRE7hW9WdSuGYrLSHi2ynxeFpDFbH0K/CgNeY/tyhk+vO6TYxXC5r5CpUhNVX310xzPsN/H9lCdfOA==} engines: {node: '>=14'} @@ -1640,6 +1742,9 @@ packages: azure-devops-node-api@12.5.0: resolution: {integrity: sha512-R5eFskGvOm3U/GzeAuxRkUsAl0hrAwGgWn6zAd2KrZmrEhWZVqLew4OOupbQlXUuojUzpGtq62SmdhJ06N88og==} + 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} @@ -1666,6 +1771,9 @@ packages: boundary@2.0.0: resolution: {integrity: sha512-rJKn5ooC9u8q13IMCrW0RSp31pxBCHE3y9V/tp3TdWSLf8Em3p6Di4NBpfzbJge9YjjFEsD0RtFEjtvHL5VyEA==} + brace-expansion@2.1.4: + resolution: {integrity: sha512-hGfVzPxthbf3+2yjg/RBs60cB0FhqBS/zvdV/4wn4/BmN0bNMMHPc4V/BbFieqf1TKAGGAHnY4eSjajCl0f2Xg==} + brace-expansion@5.0.9: resolution: {integrity: sha512-ScQ4IuvIEF1TMlP7Zt+vjJ//9zlPb2SDcxWxM3bk8s6t6GGdJ7KO1dCcTidOPJKePW30LE/2cT7wCyPho9/Wxg==} engines: {node: 20 || >=22} @@ -1680,6 +1788,10 @@ packages: buffer-equal-constant-time@1.0.1: resolution: {integrity: sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA==} + buffer-image-size@0.6.4: + resolution: {integrity: sha512-nEh+kZOPY1w+gcCMobZ6ETUp9WfibndnosbpwB1iJk/8Gt5ZF2bhS6+B6bPYz424KtwsR6Rflc3tCz1/ghX2dQ==} + engines: {node: '>=4.0'} + buffer@5.7.1: resolution: {integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==} @@ -1692,6 +1804,14 @@ packages: resolution: {integrity: sha512-tjwM5exMg6BGRI+kNmTntNsvdZS1X8BFYS6tnJ2hdH0kVxM6/eVZ2xy+FqStSWvYmtfFMDLIxurorHwDKfDz5Q==} engines: {node: '>=18'} + c12@3.3.4: + resolution: {integrity: sha512-cM0ApFQSBXuourJejzwv/AuPRvAxordTyParRVcHjjtXirtkzM0uK2L9TTn9s0cXZbG7E55jCivRQzoxYmRAlA==} + peerDependencies: + magicast: '*' + peerDependenciesMeta: + magicast: + optional: true + cac@7.0.0: resolution: {integrity: sha512-tixWYgm5ZoOD+3g6UTea91eow5z6AAHaho3g0V9CNSNb45gM8SmflpAc+GRd1InC4AqN/07Unrgp56Y94N9hJQ==} engines: {node: '>=20.19.0'} @@ -1761,6 +1881,10 @@ packages: resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} engines: {node: '>= 0.8'} + commander@10.0.1: + resolution: {integrity: sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==} + engines: {node: '>=14'} + commander@12.1.0: resolution: {integrity: sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA==} engines: {node: '>=18'} @@ -1786,6 +1910,9 @@ packages: confbox@0.2.4: resolution: {integrity: sha512-ysOGlgTFbN2/Y6Cg3Iye8YKulHw+R2fNXHrgSmXISQdMnomY6eNDprVdW9R5xBguEqI954+S6709UyiO7B+6OQ==} + config-chain@1.1.13: + resolution: {integrity: sha512-qj+f8APARXHrM0hraqXYb2/bOVSV4PvJQlNZ/DVj0QrmNM2q2euizkeuVckQ57J+W0mRH6Hvi+k50M4Jul2VRQ==} + consola@3.4.2: resolution: {integrity: sha512-5IKcdX0nnYavi6G7TtOhwkYzyjfJlatbjMjuLSfE2kYT5pMDOilZ4OvMhi637CcDICTmz3wARPoyhqyX1Y+XvA==} engines: {node: ^14.18.0 || >=16.10.0} @@ -1793,6 +1920,9 @@ packages: convert-source-map@2.0.0: resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} + cookie-es@1.2.3: + resolution: {integrity: sha512-lXVyvUvrNXblMqzIRrxHb57UUVmqsSWlxqt3XIjCkUP0wDAf6uicO6KMbEgYrMNtEvWgWHwe42CKxPu9MYAnWw==} + cookie-es@3.1.1: resolution: {integrity: sha512-UaXxwISYJPTr9hwQxMFYZ7kNhSXboMXP+Z3TRX6f1/NyaGPfuNUZOWP1pUEb75B2HjfklIYLVRfWiFZJyC6Npg==} @@ -1800,6 +1930,9 @@ packages: resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} engines: {node: '>= 8'} + crossws@0.3.5: + resolution: {integrity: sha512-ojKiDvcmByhwa8YYqbQI/hg7MEU0NC03+pSdEq4ZUnZR9xXpwk7E43SMNGkn+JxJGPFtNvQ48+vV2p+P1ml5PA==} + crossws@0.4.10: resolution: {integrity: sha512-pz3oubH/dt12KjqsUB0IuXW4nwRDQ583iDsP4555Cpdqx0NoU7pGlWBcayyFI8f/l/idRpgjMEfwuOxSWJYlIA==} peerDependencies: @@ -1941,6 +2074,10 @@ packages: domutils@3.2.2: resolution: {integrity: sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw==} + dotenv@17.4.2: + resolution: {integrity: sha512-nI4U3TottKAcAD9LLud4Cb7b2QztQMUEfHbvhTH09bqXTxnSie8WnjPALV/WMCrJZ6UV/qHJ6L03OqO3LcdYZw==} + engines: {node: '>=12'} + dts-resolver@3.0.0: resolution: {integrity: sha512-1T1f+z+4tl9XD+m+0HBgWoL/nm0bOIffyWaUuUSBlFg/86IWvfx+wjNaO/ybU0AJzG9/Mi5hBUgGV6zCmWEN7Q==} engines: {node: ^22.18.0 || >=24.0.0} @@ -1954,6 +2091,9 @@ packages: resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==} engines: {node: '>= 0.4'} + eastasianwidth@0.2.0: + resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} + ecdsa-sig-formatter@1.0.11: resolution: {integrity: sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==} @@ -1961,9 +2101,17 @@ packages: resolution: {integrity: sha512-UgGlf8IW75je7HZjNDpJdCv4cGJWIi6yumFdZ0R7A8/CIhQiWUjyGLCxdHpd8bmyD1gnkfUNK0oeOXqUS2cpfQ==} engines: {ecmascript: '>= es5', node: '>=4'} + editorconfig@1.0.7: + resolution: {integrity: sha512-e0GOtq/aTQhVdNyDU9e02+wz9oDDM+SIOQxWME2QRjzRX5yyLAuHDE+0aE8vHb9XRC8XD37eO2u57+F09JqFhw==} + engines: {node: '>=14'} + hasBin: true + emoji-regex@8.0.0: resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} + emoji-regex@9.2.2: + resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} + empathic@2.0.1: resolution: {integrity: sha512-YGRs8knHhKHVShLkFET/rWAU8kmHbOV5LwN938RHI0pljAJ1Gf6SzXsSmRaEzcXTtOOmVqJ5+WtQPL5uigY50Q==} engines: {node: '>=14'} @@ -2243,6 +2391,10 @@ packages: resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} engines: {node: '>=0.10.0'} + execa@8.0.1: + resolution: {integrity: sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==} + engines: {node: '>=16.17'} + expand-template@2.0.3: resolution: {integrity: sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==} engines: {node: '>=6'} @@ -2254,6 +2406,10 @@ packages: exsolve@1.1.1: resolution: {integrity: sha512-9U/jZUgjnSGyntRr6y5Muu1MJcwFl6kPu7k8qLF0IMNfLqvw0NZ4nnVDq0RVoZ0RvCyumib4Ez3KYrVfilrw+g==} + fake-indexeddb@6.2.5: + resolution: {integrity: sha512-CGnyrvbhPlWYMngksqrSSUT1BAVP49dZocrHuK0SvtR0D5TMs5wP0o3j7jexDJW01KSadjBp1M/71o/KR3nD1w==} + engines: {node: '>=18'} + fast-deep-equal@3.1.3: resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} @@ -2320,6 +2476,10 @@ packages: fnv1a-64@0.1.2: resolution: {integrity: sha512-mJbcILTPybAR1jdOwt/lVv8N2cffeJFFP+gVbSAwLEx1ujXH27RpPd8Rokec/KX9c76UYIB6Co+H4lQzxPnJfA==} + foreground-child@3.3.1: + resolution: {integrity: sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==} + engines: {node: '>=14'} + form-data@4.0.6: resolution: {integrity: sha512-vKatAh4SlVfgbv+YtmhiRjhEMJsYpsG1Y2rMQtR+SVSbytsSD1YGzDIcrAJmdFec88u/+VoGmxnl+80gL1tRCQ==} engines: {node: '>= 6'} @@ -2360,6 +2520,10 @@ packages: resolution: {integrity: sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==} engines: {node: '>= 0.4'} + get-stream@8.0.1: + resolution: {integrity: sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==} + engines: {node: '>=16'} + get-tsconfig@4.14.2: resolution: {integrity: sha512-XpwZALwwl/BaKTAyC6+c5T8y6kCg2jk+XGqOVrKIQmW49pNypYLMRjCUXqa28tQgJlhS2RlzP7sc+Rx7W6qsfw==} @@ -2367,6 +2531,10 @@ packages: resolution: {integrity: sha512-/6gFNr0N04nob252sTQxyFLi3eKFRqIg1I87YcqAMT1i6SQrSF6KujUEQrtrjMV0H/eejTCltLdDSTEMzHbnsQ==} engines: {node: '>=20.20.0'} + giget@3.3.1: + resolution: {integrity: sha512-r+mvuDjrjMpsdw46Kmeydb8bdHm7wOKw8wNBtTndkjbPjgAp5oUJUxRE76wZFknxIPokfWvep2qSXK37aXE6zg==} + hasBin: true + github-from-package@0.0.0: resolution: {integrity: sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw==} @@ -2381,6 +2549,11 @@ packages: resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} engines: {node: '>=10.13.0'} + glob@10.5.0: + resolution: {integrity: sha512-DfXN8DfhJ7NH3Oe7cFmu3NCu1wKbkReJ8TorzSAFbSKrlNaQSKfIzqYqVY8zlbs2NLBbWpRiU52GX2PbaBVNkg==} + deprecated: Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me + hasBin: true + glob@13.0.6: resolution: {integrity: sha512-Wjlyrolmm8uDpm/ogGyXZXb1Z+Ca2B8NbJwqBVg0axK9GbBeoS7yGV6vjXnYdGm6X53iehEuxxbyiKp8QmN4Vw==} engines: {node: 18 || 20 || >=22} @@ -2407,6 +2580,9 @@ packages: graceful-fs@4.2.11: resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} + h3@1.15.11: + resolution: {integrity: sha512-L3THSe2MPeBwgIZVSH5zLdBBU90TOxarvhK9d04IDY2AmVS8j2Jz2LIWtwsGOU3lu2I5jCN7FNvVfY2+XyF+mg==} + h3@2.0.1-rc.22: resolution: {integrity: sha512-Esv0DMIuPkCTSWCA0vO73vcTqwzH1wjSrAO1TXNu/K3up1sZHa9EKMapbmxCDYBeymC3fVTk4qxp7ogQWQ+KgA==} engines: {node: '>=20.11.1'} @@ -2427,6 +2603,10 @@ packages: crossws: optional: true + happy-dom@20.11.2: + resolution: {integrity: sha512-7MB+bJLkxu3SowAfBJbjW+c55kNz5tkR45gu2qzrxznezhLeN5YIlJbwUgSzlGc+qWoZ8Ykg71H5ezz69xixrw==} + engines: {node: '>=20.0.0'} + has-flag@4.0.0: resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} engines: {node: '>=8'} @@ -2474,6 +2654,10 @@ packages: httpxy@0.5.5: resolution: {integrity: sha512-uDjmnPyp1q4Sgzf3w+J/Fc6UqcCEj0x4Wjp7OqK5dGhNeDgpyrAmnS6ey8QWrX3SWDon2DMKf9sBa5X9+CVyMA==} + human-signals@5.0.0: + resolution: {integrity: sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==} + engines: {node: '>=16.17.0'} + iconv-lite@0.6.3: resolution: {integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==} engines: {node: '>=0.10.0'} @@ -2513,6 +2697,9 @@ packages: ini@1.3.8: resolution: {integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==} + iron-webcrypto@1.2.1: + resolution: {integrity: sha512-feOM6FaSr6rEABp/eDfVseKyTMDt+KGpeB35SkVn9Tyn0CqvVsY3EwI0v5i8nMHyJnzCIQf7nsy3p41TPkJZhg==} + is-docker@3.0.0: resolution: {integrity: sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} @@ -2539,6 +2726,10 @@ packages: resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} engines: {node: '>=0.12.0'} + is-stream@3.0.0: + resolution: {integrity: sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + is-wsl@3.1.1: resolution: {integrity: sha512-e6rvdUCiQCAuumZslxRJWR/Doq4VpPR82kqclvcS0efgt430SlGIk05vdCN58+VrzgtIcfNODjozVielycD4Sw==} engines: {node: '>=16'} @@ -2550,6 +2741,9 @@ packages: resolution: {integrity: sha512-5mbUj3SiZXCuRf9fT3ibzbSSEWiy63gFfksmGfdOzujPjW3k+z8WvIBxcJHBoQNlaZaiyB25deviif2+osLmLw==} engines: {node: '>=4'} + jackspeak@3.4.3: + resolution: {integrity: sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==} + jiti@2.7.0: resolution: {integrity: sha512-AC/7JofJvZGrrneWNaEnJeOLUx+JlGt7tNa0wZiRPT4MY1wmfKjt2+6O2p2uz2+skll8OZZmJMNqeke7kKbNgQ==} hasBin: true @@ -2558,6 +2752,14 @@ packages: resolution: {integrity: sha512-gkR5tmjfhAC7GwuAbXSDOG691Ei3VLTvkKc5hGG5NoPWPwqSTCy0Q3I39dH1Aae0ExC3OXHfHjZSZtFDwqfRwg==} engines: {node: '>=18.0.0'} + js-beautify@1.15.4: + resolution: {integrity: sha512-9/KXeZUKKJwqCXUdBxFJ3vPh467OCckSBmYDwSK/EtV090K+iMJ7zx2S3HLVDIWFQdqMIsZWbnaGiba18aWhaA==} + engines: {node: '>=14'} + hasBin: true + + js-cookie@3.0.8: + resolution: {integrity: sha512-yeJd4aNAdYZQjaon2bpD/Gb0B/omw7HQOsynXXcOiWVCacbBcPlgn8S/d1X6blFSaHao7ozqtW7NZW19xpCtIw==} + js-tokens@10.0.0: resolution: {integrity: sha512-lM/UBzQmfJRo9ABXbPWemivdCW8V2G8FHaHdypQaIy523snUjog0W71ayWXTjiR+ixeMyVHN2XcpnTd/liPg/Q==} @@ -2842,6 +3044,9 @@ packages: mdurl@2.1.0: resolution: {integrity: sha512-1+HBaOx0zi/dQWht8rNv9MYf9qqpqL/kxI0hXImU6Y547zM6Sni8BQibt7ifgMcYtQg41ao3Ivd6cnSM86inpg==} + merge-stream@2.0.0: + resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} + merge2@1.4.1: resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} engines: {node: '>= 8'} @@ -2956,6 +3161,10 @@ packages: engines: {node: '>=4'} hasBin: true + mimic-fn@4.0.0: + resolution: {integrity: sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==} + engines: {node: '>=12'} + mimic-response@3.1.0: resolution: {integrity: sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==} engines: {node: '>=10'} @@ -2964,6 +3173,10 @@ packages: resolution: {integrity: sha512-vpLQEs+VLCr1nU0BXS07maYoFwlDAH0gngQuuttxIwutDFEMHq2blX+8vpgxDdK3J1PwjCJiep77OitTZ4Ll1A==} engines: {node: 18 || 20 || >=22} + minimatch@9.0.9: + resolution: {integrity: sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg==} + engines: {node: '>=16 || 14 >=14.17'} + minimist@1.2.8: resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} @@ -3055,10 +3268,21 @@ packages: node-addon-api@4.3.0: resolution: {integrity: sha512-73sE9+3UaLYYFmDsFZnqCInzPyh3MqIwZO9cw58yIqAZhONrrabrYyYe3TuIqtIiOuTXVhsGau8hcrhhwSsDIQ==} + node-fetch-native@1.6.7: + resolution: {integrity: sha512-g9yhqoedzIUm0nTnTqAQvueMPVOuIY16bqgAJJC8XOOubYFNwz6IER9qs0Gq2Xd0+CecCKFjtdDTMA4u4xG06Q==} + + node-mock-http@1.0.5: + resolution: {integrity: sha512-KQyt/wLjG3TAc7DOUhpqWzgd4ERxR80JOlTK5VE5R1S12IaPVN5qkj4klBce9HPG1Njuup4Sb5bljaT34lIyjw==} + node-sarif-builder@3.4.0: resolution: {integrity: sha512-tGnJW6OKRii9u/b2WiUViTJS+h7Apxx17qsMUjsUeNDiMMX5ZFf8F8Fcz7PAQ6omvOxHZtvDTmOYKJQwmfpjeg==} engines: {node: '>=20'} + nopt@7.2.1: + resolution: {integrity: sha512-taM24ViiimT/XntxbPyJQzCG+p4EKOpgD3mxFwW38mGjVUrfERQOeY4EDHjdnptttfHuHQXFx+lTP08Q+mLa/w==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + hasBin: true + normalize-package-data@6.0.2: resolution: {integrity: sha512-V6gygoYb/5EmNI+MEGrWkC+e6+Rr7mTmfHrxDbLzxQogBkgzo76rkok0Am6thgSF7Mv2nLOajAJj5vDJZEFn7g==} engines: {node: ^16.14.0 || >=18.0.0} @@ -3066,6 +3290,10 @@ packages: nostics@1.2.0: resolution: {integrity: sha512-FGqEfhQjrvo1lL8KFifdTQiNwwQHJxC1jtYE1Rc54qF/jxONUNL+kC9gS1krX8Q65PgrQ5fCqH/I4NhWBvdSqg==} + npm-run-path@5.3.0: + resolution: {integrity: sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + npm-run-path@6.0.0: resolution: {integrity: sha512-9qny7Z9DsQU8Ou39ERsPU4OZQlSTP47ShQzuKZ6PRXpYLtIFgl/DEBYEXKlvcEa+9tHVcK8CF81Y2V72qaZhWA==} engines: {node: '>=18'} @@ -3112,6 +3340,9 @@ packages: ocache@0.1.5: resolution: {integrity: sha512-kNNnkkVQup/QDvmTz8Q84wc2ntiyoVHDxa6eHWKt5qdGAmFRBIxy83rxgCYEjW0x06UJ9E3P6VgM2yY4rOBH4w==} + ofetch@1.5.1: + resolution: {integrity: sha512-2W4oUZlVaqAPAil6FUg/difl6YhqhUR7x2eZY4bQCko22UXg3hptq9KLQdqFClV+Wu85UX7hNtdGTngi/1BxcA==} + ofetch@2.0.0-alpha.3: resolution: {integrity: sha512-zpYTCs2byOuft65vI3z43Dd6iSdFbOZZLb9/d21aCpx2rGastVU9dOCv0lu4ykc1Ur1anAYjDi3SUvR0vq50JA==} @@ -3125,6 +3356,10 @@ packages: once@1.4.0: resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} + onetime@6.0.0: + resolution: {integrity: sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==} + engines: {node: '>=12'} + open@10.2.0: resolution: {integrity: sha512-YgBpdJHPyQ2UE5x+hlSXcnejzAvD0b22U2OuAP+8OnlJT+PjWPxtgmGqKKc+RgTM63U9gN0YzrYc71R2WT/hTA==} engines: {node: '>=18'} @@ -3159,6 +3394,9 @@ packages: resolution: {integrity: sha512-I4Prw6ivkd6p8PiYR1tXASOAOBzIJwu0TB7fqaX0c/8c3QAehNYmX57EijyGGGBt3c/BIowGwV03RVBtXvHEVg==} engines: {node: '>=18'} + package-json-from-dist@1.0.1: + resolution: {integrity: sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==} + package-manager-detector@1.8.0: resolution: {integrity: sha512-yQA4H19AmPEoMUeavPMDIe1higySl/gH/yaQrkT/s07Qp+7pp2hYz30N3z2l5BkjVkF9Ow6o0wjJamm2y7Sn0A==} @@ -3203,6 +3441,10 @@ packages: resolution: {integrity: sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==} engines: {node: '>=12'} + path-scurry@1.11.1: + resolution: {integrity: sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==} + engines: {node: '>=16 || 14 >=14.18'} + path-scurry@2.0.2: resolution: {integrity: sha512-3O/iVVsJAPsOnpwWIeD+d6z/7PmqApyQePUtCndjatj/9I5LylHvt5qluFaBT3I5h3r1ejfR056c+FCv+NnNXg==} engines: {node: 18 || 20 || >=22} @@ -3268,6 +3510,9 @@ packages: proper-lockfile@4.1.2: resolution: {integrity: sha512-TjNPblN4BwAWMXU8s9AEz4JmQxnD1NNL7bNOY/AKUzyamc379FWASUhc/K1pL2noVb+XmZKLL68cjzLsiOAMaA==} + proto-list@1.2.4: + resolution: {integrity: sha512-vtK/94akxsTMhe0/cbfpR+syPuszcuwhqVjJq26CuNDgFGj682oRBXOP5MJpv2r7JtE8MsiepGIqvvOTBwn2vA==} + pump@3.0.4: resolution: {integrity: sha512-VS7sjc6KR7e1ukRFhQSY5LM2uBWAUPiOPa/A3mkKmiMwSmRFUITt0xuj+/lesgnCv+dPIEYlkzrcyXgquIHMcA==} @@ -3292,6 +3537,9 @@ packages: queue-microtask@1.2.3: resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} + radix3@1.1.2: + resolution: {integrity: sha512-b484I/7b8rDEdSDKckSSBA8knMpcdsXudlE/LNL639wFoHKwLbEkQFZHWEYwDC0wa0FKUcCY+GAF73Z7wxNVFA==} + rc-config-loader@4.1.4: resolution: {integrity: sha512-3GiwEzklkbXTDp52UR5nT8iXgYAx1V9ZG/kDZT7p60u2GCv2XTwQq4NzinMoMpNtXhmt3WkhYXcj6HH8HdwCEQ==} @@ -3460,6 +3708,10 @@ packages: signal-exit@3.0.7: resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} + signal-exit@4.1.0: + resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} + engines: {node: '>=14'} + simple-concat@1.0.1: resolution: {integrity: sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==} @@ -3520,6 +3772,10 @@ packages: resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} engines: {node: '>=8'} + string-width@5.1.2: + resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==} + engines: {node: '>=12'} + string_decoder@1.3.0: resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} @@ -3531,6 +3787,10 @@ packages: resolution: {integrity: sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==} engines: {node: '>=12'} + strip-final-newline@3.0.0: + resolution: {integrity: sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==} + engines: {node: '>=12'} + strip-json-comments@2.0.1: resolution: {integrity: sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==} engines: {node: '>=0.10.0'} @@ -4027,6 +4287,9 @@ packages: yaml: optional: true + vitest-environment-nuxt@2.0.0: + resolution: {integrity: sha512-zEGFRiCAaRR3fHnqISHKMNTRvCzkQEI1XyFeqNgR2IBD0oYkfZ1rUHwi7C+h3Cns3KPykfB0av1B3MtLEbChDw==} + vitest@4.1.10: resolution: {integrity: sha512-R9jUTe5S4Qb0HCd4TNqpC7oGcrMssMRGXLW80ubjWsW9VH5GF8y1Y0SFLY9AbqSk6nt0PnOx4H4WNJYZ13GUPw==} engines: {node: ^20.0.0 || ^22.0.0 || >=24.0.0} @@ -4128,6 +4391,10 @@ packages: engines: {node: '>=18'} deprecated: Use @exodus/bytes instead for a more spec-conformant and faster implementation + whatwg-mimetype@3.0.0: + resolution: {integrity: sha512-nt+N2dzIutVRxARx1nghPKGv1xHikU7HKdfafKkLNLindmPU/ch3U31NOCGGA/dmPcmb1VlofO0vnKAcsm0o/Q==} + engines: {node: '>=12'} + whatwg-mimetype@4.0.0: resolution: {integrity: sha512-QaKxh0eNIi2mE9p2vEdzfagOKHCcj1pJ56EEHGQOVxp8r9/iszLUUV7v89x9O1p/T+NlTM5W7jW6+cz4Fq1YVg==} engines: {node: '>=18'} @@ -4146,6 +4413,14 @@ packages: resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==} engines: {node: '>=0.10.0'} + wrap-ansi@7.0.0: + resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} + engines: {node: '>=10'} + + wrap-ansi@8.1.0: + resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==} + engines: {node: '>=12'} + wrappy@1.0.2: resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} @@ -4398,18 +4673,6 @@ snapshots: tinyexec: 1.3.0 zigpty: 0.2.1 - '@devframes/hub@0.8.2(devframe@0.8.2(cac@7.0.0))': - dependencies: - '@standard-schema/spec': 1.1.0 - destr: 2.0.5 - devframe: 0.8.2(cac@7.0.0) - nostics: 1.2.0 - pathe: 2.0.3 - perfect-debounce: 2.1.0 - tinyexec: 1.3.0 - zigpty: 0.2.1 - optional: true - '@devframes/json-render@0.8.2(@devframes/hub@0.8.2(devframe@0.8.2(cac@7.0.0)(srvx@0.11.22)))(devframe@0.8.2(cac@7.0.0)(srvx@0.11.22))': dependencies: '@json-render/core': 0.19.0(zod@4.4.3) @@ -4428,20 +4691,19 @@ snapshots: optionalDependencies: '@devframes/hub': 0.8.2(devframe@0.8.2(cac@7.0.0)(srvx@0.12.5)) - '@devframes/json-render@0.8.2(@devframes/hub@0.8.2(devframe@0.8.2(cac@7.0.0)))(devframe@0.8.2(cac@7.0.0))': + '@devframes/plugin-code-server@0.8.2(devframe@0.8.2(cac@7.0.0)(srvx@0.11.22))(vite@8.2.1)': dependencies: - '@json-render/core': 0.19.0(zod@4.4.3) - devframe: 0.8.2(cac@7.0.0) + cac: 7.0.0 + devframe: 0.8.2(cac@7.0.0)(srvx@0.11.22) + get-port-please: 3.2.0 nostics: 1.2.0 - zod: 4.4.3 optionalDependencies: - '@devframes/hub': 0.8.2(devframe@0.8.2(cac@7.0.0)) - optional: true + vite: 8.2.1(@types/node@26.2.0)(@vitejs/devtools@0.4.12)(jiti@2.7.0)(yaml@2.9.0) - '@devframes/plugin-code-server@0.8.2(devframe@0.8.2(cac@7.0.0)(srvx@0.11.22))(vite@8.2.1)': + '@devframes/plugin-code-server@0.8.2(devframe@0.8.2(cac@7.0.0)(srvx@0.12.5))(vite@8.2.1)': dependencies: cac: 7.0.0 - devframe: 0.8.2(cac@7.0.0)(srvx@0.11.22) + devframe: 0.8.2(cac@7.0.0)(srvx@0.12.5) get-port-please: 3.2.0 nostics: 1.2.0 optionalDependencies: @@ -4457,39 +4719,37 @@ snapshots: optionalDependencies: vite: 8.2.1(@types/node@26.2.0)(@vitejs/devtools@0.4.12)(jiti@2.7.0)(yaml@2.9.0) - '@devframes/plugin-inspect@0.8.2(devframe@0.8.2(cac@7.0.0)(srvx@0.11.22))(valibot@1.4.2(typescript-native-bridge@6.0.3-bridge.13.tsgo.7.0.2))(vite@8.2.1)': + '@devframes/plugin-data-inspector@0.8.2(devframe@0.8.2(cac@7.0.0)(srvx@0.12.5))(vite@8.2.1)': dependencies: - '@valibot/to-json-schema': 1.7.1(valibot@1.4.2(typescript-native-bridge@6.0.3-bridge.13.tsgo.7.0.2)) cac: 7.0.0 - devframe: 0.8.2(cac@7.0.0)(srvx@0.11.22) + devframe: 0.8.2(cac@7.0.0)(srvx@0.12.5) + get-port-please: 3.2.0 + jora: 1.0.0-beta.16 nostics: 1.2.0 optionalDependencies: vite: 8.2.1(@types/node@26.2.0)(@vitejs/devtools@0.4.12)(jiti@2.7.0)(yaml@2.9.0) - transitivePeerDependencies: - - valibot - '@devframes/plugin-inspect@0.8.2(devframe@0.8.2(cac@7.0.0)(srvx@0.12.5))(valibot@1.4.2(typescript-native-bridge@6.0.3-bridge.13.tsgo.7.0.2))(vite@8.2.1)': + '@devframes/plugin-inspect@0.8.2(devframe@0.8.2(cac@7.0.0)(srvx@0.11.22))(valibot@1.4.2(typescript-native-bridge@6.0.3-bridge.13.tsgo.7.0.2))(vite@8.2.1)': dependencies: '@valibot/to-json-schema': 1.7.1(valibot@1.4.2(typescript-native-bridge@6.0.3-bridge.13.tsgo.7.0.2)) cac: 7.0.0 - devframe: 0.8.2(cac@7.0.0)(srvx@0.12.5) + devframe: 0.8.2(cac@7.0.0)(srvx@0.11.22) nostics: 1.2.0 optionalDependencies: vite: 8.2.1(@types/node@26.2.0)(@vitejs/devtools@0.4.12)(jiti@2.7.0)(yaml@2.9.0) transitivePeerDependencies: - valibot - '@devframes/plugin-inspect@0.8.2(devframe@0.8.2(cac@7.0.0))(vite@8.2.1)': + '@devframes/plugin-inspect@0.8.2(devframe@0.8.2(cac@7.0.0)(srvx@0.12.5))(valibot@1.4.2(typescript-native-bridge@6.0.3-bridge.13.tsgo.7.0.2))(vite@8.2.1)': dependencies: '@valibot/to-json-schema': 1.7.1(valibot@1.4.2(typescript-native-bridge@6.0.3-bridge.13.tsgo.7.0.2)) cac: 7.0.0 - devframe: 0.8.2(cac@7.0.0) + devframe: 0.8.2(cac@7.0.0)(srvx@0.12.5) nostics: 1.2.0 optionalDependencies: vite: 8.2.1(@types/node@26.2.0)(@vitejs/devtools@0.4.12)(jiti@2.7.0)(yaml@2.9.0) transitivePeerDependencies: - valibot - optional: true '@devframes/plugin-messages@0.8.2(@devframes/hub@0.8.2(devframe@0.8.2(cac@7.0.0)(srvx@0.11.22)))(devframe@0.8.2(cac@7.0.0)(srvx@0.11.22))(vite@8.2.1)': dependencies: @@ -4509,16 +4769,6 @@ snapshots: optionalDependencies: vite: 8.2.1(@types/node@26.2.0)(@vitejs/devtools@0.4.12)(jiti@2.7.0)(yaml@2.9.0) - '@devframes/plugin-messages@0.8.2(@devframes/hub@0.8.2(devframe@0.8.2(cac@7.0.0)))(devframe@0.8.2(cac@7.0.0))(vite@8.2.1)': - dependencies: - '@devframes/hub': 0.8.2(devframe@0.8.2(cac@7.0.0)) - cac: 7.0.0 - devframe: 0.8.2(cac@7.0.0) - nostics: 1.2.0 - optionalDependencies: - vite: 8.2.1(@types/node@26.2.0)(@vitejs/devtools@0.4.12)(jiti@2.7.0)(yaml@2.9.0) - optional: true - '@devframes/plugin-terminals@0.8.2(devframe@0.8.2(cac@7.0.0)(srvx@0.11.22))(vite@8.2.1)': dependencies: cac: 7.0.0 @@ -4537,22 +4787,12 @@ snapshots: optionalDependencies: vite: 8.2.1(@types/node@26.2.0)(@vitejs/devtools@0.4.12)(jiti@2.7.0)(yaml@2.9.0) - '@devframes/plugin-terminals@0.8.2(devframe@0.8.2(cac@7.0.0))(vite@8.2.1)': - dependencies: - cac: 7.0.0 - devframe: 0.8.2(cac@7.0.0) - nostics: 1.2.0 - zigpty: 0.2.1 - optionalDependencies: - vite: 8.2.1(@types/node@26.2.0)(@vitejs/devtools@0.4.12)(jiti@2.7.0)(yaml@2.9.0) - optional: true - '@discoveryjs/natural-compare@1.1.0': {} '@dxup/nuxt@0.5.7(confbox@0.2.4)(jiti@2.7.0)(mlly@1.8.2)(rolldown@1.2.4)(vite@8.2.1)': dependencies: '@dxup/unimport': 0.1.2 - '@nuxt/kit': '@nuxt/kit-nightly@5.0.0-29782515.650ee625(confbox@0.2.4)(jiti@2.7.0)(magic-string@1.2.0)(mlly@1.8.2)(rolldown@1.2.4)(unplugin@3.3.0(rolldown@1.2.4)(vite@8.2.1))' + '@nuxt/kit': '@nuxt/kit-nightly@5.0.0-29782515.650ee625(confbox@0.2.4)(dotenv@17.4.2)(giget@3.3.1)(jiti@2.7.0)(magic-string@1.2.0)(mlly@1.8.2)(rolldown@1.2.4)(unplugin@3.3.0(rolldown@1.2.4)(vite@8.2.1))' '@vue/compiler-dom': 3.5.41 chokidar: 5.0.0 knitwork: 1.3.0 @@ -4683,6 +4923,15 @@ snapshots: '@humanwhocodes/retry@0.4.3': {} + '@isaacs/cliui@8.0.2': + dependencies: + string-width: 5.1.2 + string-width-cjs: string-width@4.2.3 + strip-ansi: 7.2.0 + strip-ansi-cjs: strip-ansi@6.0.1 + wrap-ansi: 8.1.0 + wrap-ansi-cjs: wrap-ansi@7.0.0 + '@jridgewell/gen-mapping@0.3.13': dependencies: '@jridgewell/sourcemap-codec': 1.5.5 @@ -4718,7 +4967,7 @@ snapshots: '@nodelib/fs.scandir': 2.1.5 fastq: 1.20.1 - '@nuxt/cli-nightly@4.0.0-20260812-132059-0bb4e52(@nuxt/schema-nightly@5.0.0-29782515.650ee625)(cac@7.0.0)(jiti@2.7.0)(rolldown@1.2.4)': + '@nuxt/cli-nightly@4.0.0-20260818-221829-0bb4e52(@nuxt/schema-nightly@5.0.0-29782515.650ee625)(cac@7.0.0)(jiti@2.7.0)(rolldown@1.2.4)': dependencies: '@bomb.sh/tab': 0.0.22(cac@7.0.0)(citty@0.2.2) '@clack/prompts': 1.7.0 @@ -4752,9 +5001,25 @@ snapshots: - cac - commander + '@nuxt/devtools-kit@2.7.0(confbox@0.2.4)(dotenv@17.4.2)(giget@3.3.1)(jiti@2.7.0)(magic-string@1.2.0)(mlly@1.8.2)(rolldown@1.2.4)(unplugin@3.3.0(rolldown@1.2.4)(vite@8.2.1))(vite@8.2.1)': + dependencies: + '@nuxt/kit': '@nuxt/kit-nightly@5.0.0-29782515.650ee625(confbox@0.2.4)(dotenv@17.4.2)(giget@3.3.1)(jiti@2.7.0)(magic-string@1.2.0)(mlly@1.8.2)(rolldown@1.2.4)(unplugin@3.3.0(rolldown@1.2.4)(vite@8.2.1))' + execa: 8.0.1 + vite: 8.2.1(@types/node@26.2.0)(@vitejs/devtools@0.4.12)(jiti@2.7.0)(yaml@2.9.0) + transitivePeerDependencies: + - confbox + - dotenv + - giget + - jiti + - magic-string + - mlly + - oxc-parser + - rolldown + - unplugin + '@nuxt/devtools-kit@4.0.0-alpha.10(confbox@0.2.4)(jiti@2.7.0)(magic-string@1.2.0)(mlly@1.8.2)(rolldown@1.2.4)(unplugin@3.3.0(rolldown@1.2.4)(vite@8.2.1))(vite@8.2.1)': dependencies: - '@nuxt/kit': '@nuxt/kit-nightly@5.0.0-29782515.650ee625(confbox@0.2.4)(jiti@2.7.0)(magic-string@1.2.0)(mlly@1.8.2)(rolldown@1.2.4)(unplugin@3.3.0(rolldown@1.2.4)(vite@8.2.1))' + '@nuxt/kit': '@nuxt/kit-nightly@5.0.0-29782515.650ee625(confbox@0.2.4)(dotenv@17.4.2)(giget@3.3.1)(jiti@2.7.0)(magic-string@1.2.0)(mlly@1.8.2)(rolldown@1.2.4)(unplugin@3.3.0(rolldown@1.2.4)(vite@8.2.1))' nostics: 1.2.0 tinyexec: 1.3.0 vite: 8.2.1(@types/node@26.2.0)(@vitejs/devtools@0.4.12)(jiti@2.7.0)(yaml@2.9.0) @@ -4774,7 +5039,7 @@ snapshots: '@devframes/plugin-code-server': 0.8.2(devframe@0.8.2(cac@7.0.0)(srvx@0.11.22))(vite@8.2.1) '@devframes/plugin-data-inspector': 0.8.2(devframe@0.8.2(cac@7.0.0)(srvx@0.11.22))(vite@8.2.1) '@nuxt/devtools-kit': 4.0.0-alpha.10(confbox@0.2.4)(jiti@2.7.0)(magic-string@1.2.0)(mlly@1.8.2)(rolldown@1.2.4)(unplugin@3.3.0(rolldown@1.2.4)(vite@8.2.1))(vite@8.2.1) - '@nuxt/kit': '@nuxt/kit-nightly@5.0.0-29782515.650ee625(confbox@0.2.4)(jiti@2.7.0)(magic-string@1.2.0)(mlly@1.8.2)(rolldown@1.2.4)(unplugin@3.3.0(rolldown@1.2.4)(vite@8.2.1))' + '@nuxt/kit': '@nuxt/kit-nightly@5.0.0-29782515.650ee625(confbox@0.2.4)(dotenv@17.4.2)(giget@3.3.1)(jiti@2.7.0)(magic-string@1.2.0)(mlly@1.8.2)(rolldown@1.2.4)(unplugin@3.3.0(rolldown@1.2.4)(vite@8.2.1))' '@vitejs/devtools': 0.4.12(crossws@0.4.10(srvx@0.11.22))(srvx@0.11.22)(typescript-native-bridge@6.0.3-bridge.13.tsgo.7.0.2)(valibot@1.4.2(typescript-native-bridge@6.0.3-bridge.13.tsgo.7.0.2))(vite@8.2.1) '@vitejs/devtools-kit': 0.4.12(cac@7.0.0)(srvx@0.11.22)(vite@8.2.1) birpc: 4.1.0 @@ -4850,12 +5115,12 @@ snapshots: - valibot - vue - '@nuxt/devtools@4.0.0-alpha.10(@azure/identity@4.13.1(supports-color@7.2.0))(cac@7.0.0)(chokidar@5.0.0)(confbox@0.2.4)(crossws@0.4.10(srvx@0.12.5))(jiti@2.7.0)(magic-string@1.2.0)(mlly@1.8.2)(ofetch@2.0.0-alpha.3)(rolldown@1.2.4)(srvx@0.12.5)(typescript-native-bridge@6.0.3-bridge.13.tsgo.7.0.2)(unplugin@3.3.0(rolldown@1.2.4)(vite@8.2.1))(valibot@1.4.2(typescript-native-bridge@6.0.3-bridge.13.tsgo.7.0.2))(vite@8.2.1)(vue@3.5.41(typescript-native-bridge@6.0.3-bridge.13.tsgo.7.0.2))': + '@nuxt/devtools@4.0.0-alpha.10(@azure/identity@4.13.1(supports-color@7.2.0))(cac@7.0.0)(chokidar@5.0.0)(confbox@0.2.4)(crossws@0.4.10(srvx@0.12.5))(devframe@0.8.2(cac@7.0.0)(srvx@0.12.5))(jiti@2.7.0)(magic-string@1.2.0)(mlly@1.8.2)(ofetch@2.0.0-alpha.3)(rolldown@1.2.4)(srvx@0.12.5)(typescript-native-bridge@6.0.3-bridge.13.tsgo.7.0.2)(unplugin@3.3.0(rolldown@1.2.4)(vite@8.2.1))(valibot@1.4.2(typescript-native-bridge@6.0.3-bridge.13.tsgo.7.0.2))(vite@8.2.1)(vue@3.5.41(typescript-native-bridge@6.0.3-bridge.13.tsgo.7.0.2))': dependencies: - '@devframes/plugin-code-server': 0.8.2(devframe@0.8.2(cac@7.0.0)(srvx@0.11.22))(vite@8.2.1) - '@devframes/plugin-data-inspector': 0.8.2(devframe@0.8.2(cac@7.0.0)(srvx@0.11.22))(vite@8.2.1) + '@devframes/plugin-code-server': 0.8.2(devframe@0.8.2(cac@7.0.0)(srvx@0.12.5))(vite@8.2.1) + '@devframes/plugin-data-inspector': 0.8.2(devframe@0.8.2(cac@7.0.0)(srvx@0.12.5))(vite@8.2.1) '@nuxt/devtools-kit': 4.0.0-alpha.10(confbox@0.2.4)(jiti@2.7.0)(magic-string@1.2.0)(mlly@1.8.2)(rolldown@1.2.4)(unplugin@3.3.0(rolldown@1.2.4)(vite@8.2.1))(vite@8.2.1) - '@nuxt/kit': '@nuxt/kit-nightly@5.0.0-29782515.650ee625(confbox@0.2.4)(jiti@2.7.0)(magic-string@1.2.0)(mlly@1.8.2)(rolldown@1.2.4)(unplugin@3.3.0(rolldown@1.2.4)(vite@8.2.1))' + '@nuxt/kit': '@nuxt/kit-nightly@5.0.0-29782515.650ee625(confbox@0.2.4)(dotenv@17.4.2)(giget@3.3.1)(jiti@2.7.0)(magic-string@1.2.0)(mlly@1.8.2)(rolldown@1.2.4)(unplugin@3.3.0(rolldown@1.2.4)(vite@8.2.1))' '@vitejs/devtools': 0.4.12(crossws@0.4.10(srvx@0.12.5))(srvx@0.12.5)(typescript-native-bridge@6.0.3-bridge.13.tsgo.7.0.2)(valibot@1.4.2(typescript-native-bridge@6.0.3-bridge.13.tsgo.7.0.2))(vite@8.2.1) '@vitejs/devtools-kit': 0.4.12(cac@7.0.0)(srvx@0.12.5)(vite@8.2.1) birpc: 4.1.0 @@ -4931,7 +5196,7 @@ snapshots: - valibot - vue - '@nuxt/kit-nightly@5.0.0-29782515.650ee625(confbox@0.2.4)(jiti@2.7.0)(magic-string@1.2.0)(mlly@1.8.2)(rolldown@1.2.4)(unplugin@3.3.0(rolldown@1.2.4)(vite@8.2.1))': + '@nuxt/kit-nightly@5.0.0-29782515.650ee625(confbox@0.2.4)(dotenv@17.4.2)(giget@3.3.1)(jiti@2.7.0)(magic-string@1.2.0)(mlly@1.8.2)(rolldown@1.2.4)(unplugin@3.3.0(rolldown@1.2.4)(vite@8.2.1))': dependencies: consola: 3.4.2 defu: 6.1.7 @@ -4952,6 +5217,8 @@ snapshots: verkit: 0.3.2 optionalDependencies: confbox: 0.2.4 + dotenv: 17.4.2 + giget: 3.3.1 jiti: 2.7.0 mlly: 1.8.2 rolldown: 1.2.4 @@ -4962,7 +5229,7 @@ snapshots: '@nuxt/nitro-server-nightly@5.0.0-29782515.650ee625(1611a290d39663ad29b9f01cf4f2d4b4)': dependencies: '@ampproject/remapping': 2.3.0 - '@nuxt/kit': '@nuxt/kit-nightly@5.0.0-29782515.650ee625(confbox@0.2.4)(jiti@2.7.0)(magic-string@1.2.0)(mlly@1.8.2)(rolldown@1.2.4)(unplugin@3.3.0(rolldown@1.2.4)(vite@8.2.1))' + '@nuxt/kit': '@nuxt/kit-nightly@5.0.0-29782515.650ee625(confbox@0.2.4)(dotenv@17.4.2)(giget@3.3.1)(jiti@2.7.0)(magic-string@1.2.0)(mlly@1.8.2)(rolldown@1.2.4)(unplugin@3.3.0(rolldown@1.2.4)(vite@8.2.1))' '@unhead/vue': 3.3.2(@oxc-project/types@0.144.0)(@vitejs/devtools-kit@0.4.12(cac@7.0.0)(srvx@0.11.22)(vite@8.2.1))(lightningcss@1.33.0)(rolldown@1.2.4)(vite@8.2.1)(vue@3.5.41(typescript-native-bridge@6.0.3-bridge.13.tsgo.7.0.2)) '@vue/shared': 3.5.41 consola: 3.4.2 @@ -5048,10 +5315,10 @@ snapshots: - xml2js - zephyr-agent - '@nuxt/nitro-server-nightly@5.0.0-29782515.650ee625(@azure/identity@4.13.1(supports-color@7.2.0))(@oxc-project/types@0.144.0)(@vitejs/devtools-kit@0.4.12(cac@7.0.0)(srvx@0.12.5)(vite@8.2.1))(chokidar@5.0.0)(confbox@0.2.4)(jiti@2.7.0)(lightningcss@1.33.0)(mlly@1.8.2)(nuxt-nightly@5.0.0-29782515.650ee625(@azure/identity@4.13.1(supports-color@7.2.0))(@oxc-project/types@0.144.0)(@types/node@26.2.0)(@vitejs/devtools-kit@0.4.12(cac@7.0.0)(srvx@0.12.5)(vite@8.2.1))(@vitejs/devtools@0.4.12)(@vue/compiler-sfc@3.5.41)(cac@7.0.0)(confbox@0.2.4)(crossws@0.4.10(srvx@0.12.5))(eslint@10.8.1(jiti@2.7.0)(supports-color@7.2.0))(jiti@2.7.0)(lightningcss@1.33.0)(mlly@1.8.2)(nuxt-nightly@5.0.0-29782515.650ee625)(rolldown@1.2.4)(srvx@0.12.5)(typescript-native-bridge@6.0.3-bridge.13.tsgo.7.0.2)(valibot@1.4.2(typescript-native-bridge@6.0.3-bridge.13.tsgo.7.0.2))(vite@8.2.1)(yaml@2.9.0))(ofetch@2.0.0-alpha.3)(rolldown@1.2.4)(typescript-native-bridge@6.0.3-bridge.13.tsgo.7.0.2)(unplugin@3.3.0(rolldown@1.2.4)(vite@8.2.1))(vite@8.2.1)': + '@nuxt/nitro-server-nightly@5.0.0-29782515.650ee625(7c0ce82ca034b662c3a2c59e0174530c)': dependencies: '@ampproject/remapping': 2.3.0 - '@nuxt/kit': '@nuxt/kit-nightly@5.0.0-29782515.650ee625(confbox@0.2.4)(jiti@2.7.0)(magic-string@1.2.0)(mlly@1.8.2)(rolldown@1.2.4)(unplugin@3.3.0(rolldown@1.2.4)(vite@8.2.1))' + '@nuxt/kit': '@nuxt/kit-nightly@5.0.0-29782515.650ee625(confbox@0.2.4)(dotenv@17.4.2)(giget@3.3.1)(jiti@2.7.0)(magic-string@1.2.0)(mlly@1.8.2)(rolldown@1.2.4)(unplugin@3.3.0(rolldown@1.2.4)(vite@8.2.1))' '@unhead/vue': 3.3.2(@oxc-project/types@0.144.0)(@vitejs/devtools-kit@0.4.12(cac@7.0.0)(srvx@0.12.5)(vite@8.2.1))(lightningcss@1.33.0)(rolldown@1.2.4)(vite@8.2.1)(vue@3.5.41(typescript-native-bridge@6.0.3-bridge.13.tsgo.7.0.2)) '@vue/shared': 3.5.41 consola: 3.4.2 @@ -5068,7 +5335,7 @@ snapshots: mocked-exports: 0.1.1 nitro: 3.0.260610-beta(@azure/identity@4.13.1(supports-color@7.2.0))(chokidar@5.0.0)(jiti@2.7.0)(lru-cache@11.5.2)(vite@8.2.1) nostics: 1.2.0 - nuxt: nuxt-nightly@5.0.0-29782515.650ee625(@azure/identity@4.13.1(supports-color@7.2.0))(@oxc-project/types@0.144.0)(@types/node@26.2.0)(@vitejs/devtools-kit@0.4.12(cac@7.0.0)(srvx@0.12.5)(vite@8.2.1))(@vitejs/devtools@0.4.12)(@vue/compiler-sfc@3.5.41)(cac@7.0.0)(confbox@0.2.4)(crossws@0.4.10(srvx@0.12.5))(eslint@10.8.1(jiti@2.7.0)(supports-color@7.2.0))(jiti@2.7.0)(lightningcss@1.33.0)(mlly@1.8.2)(nuxt-nightly@5.0.0-29782515.650ee625)(rolldown@1.2.4)(srvx@0.12.5)(typescript-native-bridge@6.0.3-bridge.13.tsgo.7.0.2)(valibot@1.4.2(typescript-native-bridge@6.0.3-bridge.13.tsgo.7.0.2))(vite@8.2.1)(yaml@2.9.0) + nuxt: nuxt-nightly@5.0.0-29782515.650ee625(@azure/identity@4.13.1(supports-color@7.2.0))(@oxc-project/types@0.144.0)(@types/node@26.2.0)(@vitejs/devtools-kit@0.4.12(cac@7.0.0)(srvx@0.12.5)(vite@8.2.1))(@vitejs/devtools@0.4.12)(@vue/compiler-sfc@3.5.41)(cac@7.0.0)(confbox@0.2.4)(crossws@0.4.10(srvx@0.12.5))(devframe@0.8.2(cac@7.0.0)(srvx@0.12.5))(eslint@10.8.1(jiti@2.7.0)(supports-color@7.2.0))(jiti@2.7.0)(lightningcss@1.33.0)(mlly@1.8.2)(nuxt-nightly@5.0.0-29782515.650ee625)(rolldown@1.2.4)(srvx@0.12.5)(typescript-native-bridge@6.0.3-bridge.13.tsgo.7.0.2)(valibot@1.4.2(typescript-native-bridge@6.0.3-bridge.13.tsgo.7.0.2))(vite@8.2.1)(yaml@2.9.0) ohash: 2.0.12 pathe: 2.0.3 srvx: 0.11.22 @@ -5148,16 +5415,69 @@ snapshots: '@nuxt/telemetry@2.8.0(@nuxt/kit-nightly@5.0.0-29782515.650ee625(confbox@0.2.4)(jiti@2.7.0)(magic-string@1.2.0)(mlly@1.8.2)(rolldown@1.2.4)(unplugin@3.3.0(rolldown@1.2.4)(vite@8.2.1)))': dependencies: - '@nuxt/kit': '@nuxt/kit-nightly@5.0.0-29782515.650ee625(confbox@0.2.4)(jiti@2.7.0)(magic-string@1.2.0)(mlly@1.8.2)(rolldown@1.2.4)(unplugin@3.3.0(rolldown@1.2.4)(vite@8.2.1))' + '@nuxt/kit': '@nuxt/kit-nightly@5.0.0-29782515.650ee625(confbox@0.2.4)(dotenv@17.4.2)(giget@3.3.1)(jiti@2.7.0)(magic-string@1.2.0)(mlly@1.8.2)(rolldown@1.2.4)(unplugin@3.3.0(rolldown@1.2.4)(vite@8.2.1))' citty: 0.2.2 consola: 3.4.2 ofetch: 2.0.0-alpha.3 rc9: 3.0.1 std-env: 4.2.0 - '@nuxt/vite-builder-nightly@5.0.0-29782515.650ee625(@types/node@26.2.0)(@vitejs/devtools@0.4.12)(confbox@0.2.4)(eslint@10.8.1(jiti@2.7.0)(supports-color@7.2.0))(jiti@2.7.0)(magic-string@1.2.0)(mlly@1.8.2)(nuxt-nightly@5.0.0-29782515.650ee625(@azure/identity@4.13.1(supports-color@7.2.0))(@oxc-project/types@0.144.0)(@types/node@26.2.0)(@vitejs/devtools-kit@0.4.12(cac@7.0.0)(srvx@0.12.5)(vite@8.2.1))(@vitejs/devtools@0.4.12)(@vue/compiler-sfc@3.5.41)(cac@7.0.0)(confbox@0.2.4)(crossws@0.4.10(srvx@0.12.5))(eslint@10.8.1(jiti@2.7.0)(supports-color@7.2.0))(jiti@2.7.0)(lightningcss@1.33.0)(mlly@1.8.2)(nuxt-nightly@5.0.0-29782515.650ee625)(rolldown@1.2.4)(srvx@0.12.5)(typescript-native-bridge@6.0.3-bridge.13.tsgo.7.0.2)(valibot@1.4.2(typescript-native-bridge@6.0.3-bridge.13.tsgo.7.0.2))(vite@8.2.1)(yaml@2.9.0))(rolldown@1.2.4)(typescript-native-bridge@6.0.3-bridge.13.tsgo.7.0.2)(unplugin@3.3.0(rolldown@1.2.4)(vite@8.2.1))(vue@3.5.41(typescript-native-bridge@6.0.3-bridge.13.tsgo.7.0.2))(yaml@2.9.0)': + '@nuxt/test-utils@4.1.0(@vue/test-utils@2.4.11(@vue/compiler-dom@3.5.41)(@vue/server-renderer@3.5.41)(vue@3.5.41(typescript-native-bridge@6.0.3-bridge.13.tsgo.7.0.2)))(confbox@0.2.4)(dotenv@17.4.2)(giget@3.3.1)(happy-dom@20.11.2)(jiti@2.7.0)(magicast@0.5.4)(mlly@1.8.2)(rolldown@1.2.4)(typescript-native-bridge@6.0.3-bridge.13.tsgo.7.0.2)(vite@8.2.1)(vitest@4.1.10(@types/node@26.2.0)(happy-dom@20.11.2)(vite@8.2.1))': dependencies: - '@nuxt/kit': '@nuxt/kit-nightly@5.0.0-29782515.650ee625(confbox@0.2.4)(jiti@2.7.0)(magic-string@1.2.0)(mlly@1.8.2)(rolldown@1.2.4)(unplugin@3.3.0(rolldown@1.2.4)(vite@8.2.1))' + '@clack/prompts': 1.7.0 + '@nuxt/devtools-kit': 2.7.0(confbox@0.2.4)(dotenv@17.4.2)(giget@3.3.1)(jiti@2.7.0)(magic-string@1.2.0)(mlly@1.8.2)(rolldown@1.2.4)(unplugin@3.3.0(rolldown@1.2.4)(vite@8.2.1))(vite@8.2.1) + '@nuxt/kit': '@nuxt/kit-nightly@5.0.0-29782515.650ee625(confbox@0.2.4)(dotenv@17.4.2)(giget@3.3.1)(jiti@2.7.0)(magic-string@1.2.0)(mlly@1.8.2)(rolldown@1.2.4)(unplugin@3.3.0(rolldown@1.2.4)(vite@8.2.1))' + c12: 3.3.4(magicast@0.5.4) + consola: 3.4.2 + defu: 6.1.7 + destr: 2.0.5 + estree-walker: 3.0.3 + exsolve: 1.1.1 + fake-indexeddb: 6.2.5 + get-port-please: 3.2.0 + h3: 1.15.11 + local-pkg: 1.2.1 + magic-string: 1.2.0 + node-fetch-native: 1.6.7 + node-mock-http: 1.0.5 + nypm: 0.6.9 + ofetch: 1.5.1 + pathe: 2.0.3 + perfect-debounce: 2.1.0 + radix3: 1.1.2 + scule: 1.3.0 + std-env: 4.2.0 + tinyexec: 1.3.0 + ufo: 1.6.4 + unplugin: 3.3.0(rolldown@1.2.4)(vite@8.2.1) + vitest-environment-nuxt: 2.0.0 + vue: 3.5.41(typescript-native-bridge@6.0.3-bridge.13.tsgo.7.0.2) + optionalDependencies: + '@vue/test-utils': 2.4.11(@vue/compiler-dom@3.5.41)(@vue/server-renderer@3.5.41)(vue@3.5.41(typescript-native-bridge@6.0.3-bridge.13.tsgo.7.0.2)) + happy-dom: 20.11.2 + vitest: 4.1.10(@types/node@26.2.0)(happy-dom@20.11.2)(vite@8.2.1) + transitivePeerDependencies: + - '@farmfe/core' + - '@rspack/core' + - bun-types-no-globals + - confbox + - dotenv + - esbuild + - giget + - jiti + - magicast + - mlly + - oxc-parser + - rolldown + - rollup + - typescript + - unloader + - vite + - webpack + + ? '@nuxt/vite-builder-nightly@5.0.0-29782515.650ee625(@types/node@26.2.0)(@vitejs/devtools@0.4.12)(confbox@0.2.4)(eslint@10.8.1(jiti@2.7.0)(supports-color@7.2.0))(jiti@2.7.0)(magic-string@1.2.0)(mlly@1.8.2)(nuxt-nightly@5.0.0-29782515.650ee625(@azure/identity@4.13.1(supports-color@7.2.0))(@oxc-project/types@0.144.0)(@types/node@26.2.0)(@vitejs/devtools-kit@0.4.12(cac@7.0.0)(srvx@0.12.5)(vite@8.2.1))(@vitejs/devtools@0.4.12)(@vue/compiler-sfc@3.5.41)(cac@7.0.0)(confbox@0.2.4)(crossws@0.4.10(srvx@0.12.5))(devframe@0.8.2(cac@7.0.0)(srvx@0.12.5))(eslint@10.8.1(jiti@2.7.0)(supports-color@7.2.0))(jiti@2.7.0)(lightningcss@1.33.0)(mlly@1.8.2)(nuxt-nightly@5.0.0-29782515.650ee625)(rolldown@1.2.4)(srvx@0.12.5)(typescript-native-bridge@6.0.3-bridge.13.tsgo.7.0.2)(valibot@1.4.2(typescript-native-bridge@6.0.3-bridge.13.tsgo.7.0.2))(vite@8.2.1)(yaml@2.9.0))(rolldown@1.2.4)(typescript-native-bridge@6.0.3-bridge.13.tsgo.7.0.2)(unplugin@3.3.0(rolldown@1.2.4)(vite@8.2.1))(vue@3.5.41(typescript-native-bridge@6.0.3-bridge.13.tsgo.7.0.2))(yaml@2.9.0)' + : dependencies: + '@nuxt/kit': '@nuxt/kit-nightly@5.0.0-29782515.650ee625(confbox@0.2.4)(dotenv@17.4.2)(giget@3.3.1)(jiti@2.7.0)(magic-string@1.2.0)(mlly@1.8.2)(rolldown@1.2.4)(unplugin@3.3.0(rolldown@1.2.4)(vite@8.2.1))' '@vitejs/plugin-vue': 6.0.8(vite@8.2.1)(vue@3.5.41(typescript-native-bridge@6.0.3-bridge.13.tsgo.7.0.2)) clickable-path: 0.0.1 consola: 3.4.2 @@ -5169,7 +5489,7 @@ snapshots: js-tokens: 10.0.0 knitwork: 1.3.0 mocked-exports: 0.1.1 - nuxt: nuxt-nightly@5.0.0-29782515.650ee625(@azure/identity@4.13.1(supports-color@7.2.0))(@oxc-project/types@0.144.0)(@types/node@26.2.0)(@vitejs/devtools-kit@0.4.12(cac@7.0.0)(srvx@0.12.5)(vite@8.2.1))(@vitejs/devtools@0.4.12)(@vue/compiler-sfc@3.5.41)(cac@7.0.0)(confbox@0.2.4)(crossws@0.4.10(srvx@0.12.5))(eslint@10.8.1(jiti@2.7.0)(supports-color@7.2.0))(jiti@2.7.0)(lightningcss@1.33.0)(mlly@1.8.2)(nuxt-nightly@5.0.0-29782515.650ee625)(rolldown@1.2.4)(srvx@0.12.5)(typescript-native-bridge@6.0.3-bridge.13.tsgo.7.0.2)(valibot@1.4.2(typescript-native-bridge@6.0.3-bridge.13.tsgo.7.0.2))(vite@8.2.1)(yaml@2.9.0) + nuxt: nuxt-nightly@5.0.0-29782515.650ee625(@azure/identity@4.13.1(supports-color@7.2.0))(@oxc-project/types@0.144.0)(@types/node@26.2.0)(@vitejs/devtools-kit@0.4.12(cac@7.0.0)(srvx@0.12.5)(vite@8.2.1))(@vitejs/devtools@0.4.12)(@vue/compiler-sfc@3.5.41)(cac@7.0.0)(confbox@0.2.4)(crossws@0.4.10(srvx@0.12.5))(devframe@0.8.2(cac@7.0.0)(srvx@0.12.5))(eslint@10.8.1(jiti@2.7.0)(supports-color@7.2.0))(jiti@2.7.0)(lightningcss@1.33.0)(mlly@1.8.2)(nuxt-nightly@5.0.0-29782515.650ee625)(rolldown@1.2.4)(srvx@0.12.5)(typescript-native-bridge@6.0.3-bridge.13.tsgo.7.0.2)(valibot@1.4.2(typescript-native-bridge@6.0.3-bridge.13.tsgo.7.0.2))(vite@8.2.1)(yaml@2.9.0) pathe: 2.0.3 pkg-types: 2.3.1 rolldown-string: 0.3.1(rolldown@1.2.4) @@ -5214,7 +5534,7 @@ snapshots: '@nuxt/vite-builder-nightly@5.0.0-29782515.650ee625(b53a24febac76c2b7f65e459d4440689)': dependencies: - '@nuxt/kit': '@nuxt/kit-nightly@5.0.0-29782515.650ee625(confbox@0.2.4)(jiti@2.7.0)(magic-string@1.2.0)(mlly@1.8.2)(rolldown@1.2.4)(unplugin@3.3.0(rolldown@1.2.4)(vite@8.2.1))' + '@nuxt/kit': '@nuxt/kit-nightly@5.0.0-29782515.650ee625(confbox@0.2.4)(dotenv@17.4.2)(giget@3.3.1)(jiti@2.7.0)(magic-string@1.2.0)(mlly@1.8.2)(rolldown@1.2.4)(unplugin@3.3.0(rolldown@1.2.4)(vite@8.2.1))' '@vitejs/plugin-vue': 6.0.8(vite@8.2.1)(vue@3.5.41(typescript-native-bridge@6.0.3-bridge.13.tsgo.7.0.2)) clickable-path: 0.0.1 consola: 3.4.2 @@ -5269,10 +5589,15 @@ snapshots: - vue-tsc - yaml + '@one-ini/wasm@0.1.1': {} + '@ota-meshi/ast-token-store@0.3.0': {} '@oxc-project/types@0.144.0': {} + '@pkgjs/parseargs@0.11.0': + optional: true + '@pkgr/core@0.3.6': {} '@polka/url@1.0.0-next.29': {} @@ -5484,6 +5809,12 @@ snapshots: '@types/unist@3.0.3': {} + '@types/whatwg-mimetype@3.0.2': {} + + '@types/ws@8.18.1': + dependencies: + '@types/node': 26.2.0 + '@typescript-eslint/eslint-plugin@8.67.0(@typescript-eslint/parser@8.67.0(eslint@10.8.1(jiti@2.7.0)(supports-color@7.2.0))(supports-color@7.2.0)(typescript-native-bridge@6.0.3-bridge.13.tsgo.7.0.2))(eslint@10.8.1(jiti@2.7.0)(supports-color@7.2.0))(supports-color@7.2.0)(typescript-native-bridge@6.0.3-bridge.13.tsgo.7.0.2)': dependencies: '@eslint-community/regexpp': 4.12.2 @@ -5724,23 +6055,6 @@ snapshots: - cac - srvx - '@vitejs/devtools-kit@0.4.12(cac@7.0.0)(vite@8.2.1)': - dependencies: - '@devframes/hub': 0.8.2(devframe@0.8.2(cac@7.0.0)) - '@devframes/json-render': 0.8.2(@devframes/hub@0.8.2(devframe@0.8.2(cac@7.0.0)))(devframe@0.8.2(cac@7.0.0)) - devframe: 0.8.2(cac@7.0.0) - local-pkg: 1.2.1 - mlly: 1.8.2 - nostics: 1.2.0 - nypm: 0.6.9 - vite: 8.2.1(@types/node@26.2.0)(@vitejs/devtools@0.4.12)(jiti@2.7.0)(yaml@2.9.0) - transitivePeerDependencies: - - '@modelcontextprotocol/client' - - '@modelcontextprotocol/server' - - cac - - srvx - optional: true - '@vitejs/devtools@0.4.12(crossws@0.4.10(srvx@0.11.22))(srvx@0.11.22)(typescript-native-bridge@6.0.3-bridge.13.tsgo.7.0.2)(valibot@1.4.2(typescript-native-bridge@6.0.3-bridge.13.tsgo.7.0.2))(vite@8.2.1)': dependencies: '@devframes/hub': 0.8.2(devframe@0.8.2(cac@7.0.0)(srvx@0.11.22)) @@ -5793,40 +6107,13 @@ snapshots: - typescript - valibot - '@vitejs/devtools@0.4.12(typescript-native-bridge@6.0.3-bridge.13.tsgo.7.0.2)(vite@8.2.1)': - dependencies: - '@devframes/hub': 0.8.2(devframe@0.8.2(cac@7.0.0)) - '@devframes/plugin-inspect': 0.8.2(devframe@0.8.2(cac@7.0.0))(vite@8.2.1) - '@devframes/plugin-messages': 0.8.2(@devframes/hub@0.8.2(devframe@0.8.2(cac@7.0.0)))(devframe@0.8.2(cac@7.0.0))(vite@8.2.1) - '@devframes/plugin-terminals': 0.8.2(devframe@0.8.2(cac@7.0.0))(vite@8.2.1) - '@vitejs/devtools-kit': 0.4.12(cac@7.0.0)(vite@8.2.1) - birpc: 4.1.0 - cac: 7.0.0 - devframe: 0.8.2(cac@7.0.0) - h3: 2.0.1-rc.22(crossws@0.4.10(srvx@0.12.5)) - local-pkg: 1.2.1 - mlly: 1.8.2 - nostics: 1.2.0 - obug: 2.1.4 - pathe: 2.0.3 - vite: 8.2.1(@types/node@26.2.0)(@vitejs/devtools@0.4.12)(jiti@2.7.0)(yaml@2.9.0) - vue: 3.5.41(typescript-native-bridge@6.0.3-bridge.13.tsgo.7.0.2) - transitivePeerDependencies: - - '@modelcontextprotocol/client' - - '@modelcontextprotocol/server' - - crossws - - srvx - - typescript - - valibot - optional: true - '@vitejs/plugin-vue@6.0.8(vite@8.2.1)(vue@3.5.41(typescript-native-bridge@6.0.3-bridge.13.tsgo.7.0.2))': dependencies: '@rolldown/pluginutils': 1.0.1 vite: 8.2.1(@types/node@26.2.0)(@vitejs/devtools@0.4.12)(jiti@2.7.0)(yaml@2.9.0) vue: 3.5.41(typescript-native-bridge@6.0.3-bridge.13.tsgo.7.0.2) - '@vitest/eslint-plugin@1.6.27(@typescript-eslint/eslint-plugin@8.67.0(@typescript-eslint/parser@8.67.0(eslint@10.8.1(jiti@2.7.0)(supports-color@7.2.0))(supports-color@7.2.0)(typescript-native-bridge@6.0.3-bridge.13.tsgo.7.0.2))(eslint@10.8.1(jiti@2.7.0)(supports-color@7.2.0))(supports-color@7.2.0)(typescript-native-bridge@6.0.3-bridge.13.tsgo.7.0.2))(eslint@10.8.1(jiti@2.7.0)(supports-color@7.2.0))(supports-color@7.2.0)(typescript-native-bridge@6.0.3-bridge.13.tsgo.7.0.2)(vitest@4.1.10(@types/node@26.2.0)(vite@8.2.1))': + '@vitest/eslint-plugin@1.6.27(@typescript-eslint/eslint-plugin@8.67.0(@typescript-eslint/parser@8.67.0(eslint@10.8.1(jiti@2.7.0)(supports-color@7.2.0))(supports-color@7.2.0)(typescript-native-bridge@6.0.3-bridge.13.tsgo.7.0.2))(eslint@10.8.1(jiti@2.7.0)(supports-color@7.2.0))(supports-color@7.2.0)(typescript-native-bridge@6.0.3-bridge.13.tsgo.7.0.2))(eslint@10.8.1(jiti@2.7.0)(supports-color@7.2.0))(supports-color@7.2.0)(typescript-native-bridge@6.0.3-bridge.13.tsgo.7.0.2)(vitest@4.1.10(@types/node@26.2.0)(happy-dom@20.11.2)(vite@8.2.1))': dependencies: '@typescript-eslint/scope-manager': 8.67.0 '@typescript-eslint/utils': 8.67.0(eslint@10.8.1(jiti@2.7.0)(supports-color@7.2.0))(supports-color@7.2.0)(typescript-native-bridge@6.0.3-bridge.13.tsgo.7.0.2) @@ -5834,7 +6121,7 @@ snapshots: optionalDependencies: '@typescript-eslint/eslint-plugin': 8.67.0(@typescript-eslint/parser@8.67.0(eslint@10.8.1(jiti@2.7.0)(supports-color@7.2.0))(supports-color@7.2.0)(typescript-native-bridge@6.0.3-bridge.13.tsgo.7.0.2))(eslint@10.8.1(jiti@2.7.0)(supports-color@7.2.0))(supports-color@7.2.0)(typescript-native-bridge@6.0.3-bridge.13.tsgo.7.0.2) typescript: typescript-native-bridge@6.0.3-bridge.13.tsgo.7.0.2 - vitest: 4.1.10(@types/node@26.2.0)(vite@8.2.1) + vitest: 4.1.10(@types/node@26.2.0)(happy-dom@20.11.2)(vite@8.2.1) transitivePeerDependencies: - supports-color @@ -5885,11 +6172,13 @@ snapshots: '@volar/source-map@2.4.28': {} - '@volar/typescript@2.4.28': + '@volar/typescript@2.4.28(typescript-native-bridge@6.0.3-bridge.13.tsgo.7.0.2)': dependencies: '@volar/language-core': 2.4.28 path-browserify: 1.0.1 vscode-uri: 3.1.0 + optionalDependencies: + typescript: typescript-native-bridge@6.0.3-bridge.13.tsgo.7.0.2 '@vscode/vsce-sign-alpine-arm64@2.0.6': optional: true @@ -6053,9 +6342,18 @@ snapshots: '@vue/shared@3.5.41': {} + '@vue/test-utils@2.4.11(@vue/compiler-dom@3.5.41)(@vue/server-renderer@3.5.41)(vue@3.5.41(typescript-native-bridge@6.0.3-bridge.13.tsgo.7.0.2))': + dependencies: + '@vue/compiler-dom': 3.5.41 + js-beautify: 1.15.4 + vue: 3.5.41(typescript-native-bridge@6.0.3-bridge.13.tsgo.7.0.2) + vue-component-type-helpers: 3.3.10 + optionalDependencies: + '@vue/server-renderer': 3.5.41 + '@vue/typescript-plugin@3.3.10(typescript-native-bridge@6.0.3-bridge.13.tsgo.7.0.2)': dependencies: - '@volar/typescript': 2.4.28 + '@volar/typescript': 2.4.28(typescript-native-bridge@6.0.3-bridge.13.tsgo.7.0.2) '@vue/language-core': 3.3.10 '@vue/shared': 3.5.41 path-browserify: 1.0.1 @@ -6137,7 +6435,7 @@ snapshots: '@yuku-toolchain/types@0.8.7': {} - '@zinkawaii/eslint-config@0.5.3(@typescript-eslint/typescript-estree@8.67.0(supports-color@7.2.0)(typescript-native-bridge@6.0.3-bridge.13.tsgo.7.0.2))(@typescript-eslint/utils@8.67.0(eslint@10.8.1(jiti@2.7.0)(supports-color@7.2.0))(supports-color@7.2.0)(typescript-native-bridge@6.0.3-bridge.13.tsgo.7.0.2))(@vue/compiler-sfc@3.5.41)(eslint@10.8.1(jiti@2.7.0)(supports-color@7.2.0))(supports-color@7.2.0)(typescript-native-bridge@6.0.3-bridge.13.tsgo.7.0.2)(vitest@4.1.10(@types/node@26.2.0)(vite@8.2.1))': + '@zinkawaii/eslint-config@0.5.3(@typescript-eslint/typescript-estree@8.67.0(supports-color@7.2.0)(typescript-native-bridge@6.0.3-bridge.13.tsgo.7.0.2))(@typescript-eslint/utils@8.67.0(eslint@10.8.1(jiti@2.7.0)(supports-color@7.2.0))(supports-color@7.2.0)(typescript-native-bridge@6.0.3-bridge.13.tsgo.7.0.2))(@vue/compiler-sfc@3.5.41)(eslint@10.8.1(jiti@2.7.0)(supports-color@7.2.0))(supports-color@7.2.0)(typescript-native-bridge@6.0.3-bridge.13.tsgo.7.0.2)(vitest@4.1.10(@types/node@26.2.0)(happy-dom@20.11.2)(vite@8.2.1))': dependencies: '@antfu/install-pkg': 2.0.1 '@clack/prompts': 1.7.0 @@ -6147,7 +6445,7 @@ snapshots: '@stylistic/eslint-plugin': 5.10.0(eslint@10.8.1(jiti@2.7.0)(supports-color@7.2.0)) '@typescript-eslint/eslint-plugin': 8.67.0(@typescript-eslint/parser@8.67.0(eslint@10.8.1(jiti@2.7.0)(supports-color@7.2.0))(supports-color@7.2.0)(typescript-native-bridge@6.0.3-bridge.13.tsgo.7.0.2))(eslint@10.8.1(jiti@2.7.0)(supports-color@7.2.0))(supports-color@7.2.0)(typescript-native-bridge@6.0.3-bridge.13.tsgo.7.0.2) '@typescript-eslint/parser': 8.67.0(eslint@10.8.1(jiti@2.7.0)(supports-color@7.2.0))(supports-color@7.2.0)(typescript-native-bridge@6.0.3-bridge.13.tsgo.7.0.2) - '@vitest/eslint-plugin': 1.6.27(@typescript-eslint/eslint-plugin@8.67.0(@typescript-eslint/parser@8.67.0(eslint@10.8.1(jiti@2.7.0)(supports-color@7.2.0))(supports-color@7.2.0)(typescript-native-bridge@6.0.3-bridge.13.tsgo.7.0.2))(eslint@10.8.1(jiti@2.7.0)(supports-color@7.2.0))(supports-color@7.2.0)(typescript-native-bridge@6.0.3-bridge.13.tsgo.7.0.2))(eslint@10.8.1(jiti@2.7.0)(supports-color@7.2.0))(supports-color@7.2.0)(typescript-native-bridge@6.0.3-bridge.13.tsgo.7.0.2)(vitest@4.1.10(@types/node@26.2.0)(vite@8.2.1)) + '@vitest/eslint-plugin': 1.6.27(@typescript-eslint/eslint-plugin@8.67.0(@typescript-eslint/parser@8.67.0(eslint@10.8.1(jiti@2.7.0)(supports-color@7.2.0))(supports-color@7.2.0)(typescript-native-bridge@6.0.3-bridge.13.tsgo.7.0.2))(eslint@10.8.1(jiti@2.7.0)(supports-color@7.2.0))(supports-color@7.2.0)(typescript-native-bridge@6.0.3-bridge.13.tsgo.7.0.2))(eslint@10.8.1(jiti@2.7.0)(supports-color@7.2.0))(supports-color@7.2.0)(typescript-native-bridge@6.0.3-bridge.13.tsgo.7.0.2)(vitest@4.1.10(@types/node@26.2.0)(happy-dom@20.11.2)(vite@8.2.1)) ansis: 4.3.1 cac: 7.0.0 eslint: 10.8.1(jiti@2.7.0)(supports-color@7.2.0) @@ -6194,6 +6492,8 @@ snapshots: '@zinkawaii/tsconfig@0.1.0': {} + abbrev@2.0.0: {} + acorn-jsx@5.3.2(acorn@8.18.0): dependencies: acorn: 8.18.0 @@ -6230,6 +6530,8 @@ snapshots: dependencies: color-convert: 2.0.1 + ansi-styles@6.2.3: {} + ansis@4.3.1: {} are-docs-informative@0.1.1: {} @@ -6260,6 +6562,8 @@ snapshots: tunnel: 0.0.6 typed-rest-client: 1.8.11 + balanced-match@1.0.2: {} + balanced-match@4.0.4: {} base64-js@1.5.1: @@ -6284,6 +6588,10 @@ snapshots: boundary@2.0.0: {} + brace-expansion@2.1.4: + dependencies: + balanced-match: 1.0.2 + brace-expansion@5.0.9: dependencies: balanced-match: 4.0.4 @@ -6296,6 +6604,10 @@ snapshots: buffer-equal-constant-time@1.0.1: {} + buffer-image-size@0.6.4: + dependencies: + '@types/node': 26.2.0 + buffer@5.7.1: dependencies: base64-js: 1.5.1 @@ -6318,6 +6630,23 @@ snapshots: dependencies: run-applescript: 7.1.0 + c12@3.3.4(magicast@0.5.4): + dependencies: + chokidar: 5.0.0 + confbox: 0.2.4 + defu: 6.1.7 + dotenv: 17.4.2 + exsolve: 1.1.1 + giget: 3.3.1 + jiti: 2.7.0 + ohash: 2.0.12 + pathe: 2.0.3 + perfect-debounce: 2.1.0 + pkg-types: 2.3.1 + rc9: 3.0.1 + optionalDependencies: + magicast: 0.5.4 + cac@7.0.0: {} call-bind-apply-helpers@1.0.2: @@ -6393,6 +6722,8 @@ snapshots: dependencies: delayed-stream: 1.0.0 + commander@10.0.1: {} + commander@12.1.0: {} commander@8.3.0: {} @@ -6407,10 +6738,17 @@ snapshots: confbox@0.2.4: {} + config-chain@1.1.13: + dependencies: + ini: 1.3.8 + proto-list: 1.2.4 + consola@3.4.2: {} convert-source-map@2.0.0: {} + cookie-es@1.2.3: {} + cookie-es@3.1.1: {} cross-spawn@7.0.6: @@ -6419,6 +6757,10 @@ snapshots: shebang-command: 2.0.0 which: 2.0.2 + crossws@0.3.5: + dependencies: + uncrypto: 0.1.3 + crossws@0.4.10(srvx@0.11.22): optionalDependencies: srvx: 0.11.22 @@ -6484,23 +6826,6 @@ snapshots: devalue@5.9.0: {} - devframe@0.8.2(cac@7.0.0): - dependencies: - '@standard-schema/spec': 1.1.0 - birpc: 4.1.0 - crossws: 0.4.10(srvx@0.12.5) - destr: 2.0.5 - h3: 2.0.1-rc.26(crossws@0.4.10) - mrmime: 2.0.1 - nostics: 1.2.0 - pathe: 2.0.3 - ufo: 1.6.4 - optionalDependencies: - cac: 7.0.0 - transitivePeerDependencies: - - srvx - optional: true - devframe@0.8.2(cac@7.0.0)(srvx@0.11.22): dependencies: '@standard-schema/spec': 1.1.0 @@ -6559,6 +6884,8 @@ snapshots: domelementtype: 2.3.0 domhandler: 5.0.3 + dotenv@17.4.2: {} + dts-resolver@3.0.0: {} dunder-proto@1.0.1: @@ -6567,6 +6894,8 @@ snapshots: es-errors: 1.3.0 gopd: 1.2.0 + eastasianwidth@0.2.0: {} + ecdsa-sig-formatter@1.0.11: dependencies: safe-buffer: 5.2.1 @@ -6575,8 +6904,17 @@ snapshots: dependencies: version-range: 4.15.0 + editorconfig@1.0.7: + dependencies: + '@one-ini/wasm': 0.1.1 + commander: 10.0.1 + minimatch: 9.0.9 + semver: 7.8.5 + emoji-regex@8.0.0: {} + emoji-regex@9.2.2: {} + empathic@2.0.1: {} encoding-sniffer@0.2.1: @@ -6893,6 +7231,18 @@ snapshots: esutils@2.0.3: {} + execa@8.0.1: + dependencies: + cross-spawn: 7.0.6 + get-stream: 8.0.1 + human-signals: 5.0.0 + is-stream: 3.0.0 + merge-stream: 2.0.0 + npm-run-path: 5.3.0 + onetime: 6.0.0 + signal-exit: 4.1.0 + strip-final-newline: 3.0.0 + expand-template@2.0.3: optional: true @@ -6900,6 +7250,8 @@ snapshots: exsolve@1.1.1: {} + fake-indexeddb@6.2.5: {} + fast-deep-equal@3.1.3: {} fast-glob@3.3.3: @@ -6964,6 +7316,11 @@ snapshots: fnv1a-64@0.1.2: {} + foreground-child@3.3.1: + dependencies: + cross-spawn: 7.0.6 + signal-exit: 4.1.0 + form-data@4.0.6: dependencies: asynckit: 0.4.0 @@ -7014,6 +7371,8 @@ snapshots: dunder-proto: 1.0.1 es-object-atoms: 1.1.2 + get-stream@8.0.1: {} + get-tsconfig@4.14.2: dependencies: resolve-pkg-maps: 1.0.0 @@ -7022,6 +7381,8 @@ snapshots: dependencies: resolve-pkg-maps: 1.0.0 + giget@3.3.1: {} + github-from-package@0.0.0: optional: true @@ -7035,6 +7396,15 @@ snapshots: dependencies: is-glob: 4.0.3 + glob@10.5.0: + dependencies: + foreground-child: 3.3.1 + jackspeak: 3.4.3 + minimatch: 9.0.9 + minipass: 7.1.3 + package-json-from-dist: 1.0.1 + path-scurry: 1.11.1 + glob@13.0.6: dependencies: minimatch: 10.2.6 @@ -7060,6 +7430,18 @@ snapshots: graceful-fs@4.2.11: {} + h3@1.15.11: + dependencies: + cookie-es: 1.2.3 + crossws: 0.3.5 + defu: 6.1.7 + destr: 2.0.5 + iron-webcrypto: 1.2.1 + node-mock-http: 1.0.5 + radix3: 1.1.2 + ufo: 1.6.4 + uncrypto: 0.1.3 + h3@2.0.1-rc.22(crossws@0.4.10(srvx@0.11.22)): dependencies: rou3: 0.8.1 @@ -7088,13 +7470,18 @@ snapshots: optionalDependencies: crossws: 0.4.10(srvx@0.12.5) - h3@2.0.1-rc.26(crossws@0.4.10): + happy-dom@20.11.2: dependencies: - rou3: 0.9.2 - srvx: 0.12.5 - optionalDependencies: - crossws: 0.4.10(srvx@0.12.5) - optional: true + '@types/node': 26.2.0 + '@types/whatwg-mimetype': 3.0.2 + '@types/ws': 8.18.1 + buffer-image-size: 0.6.4 + entities: 7.0.1 + whatwg-mimetype: 3.0.0 + ws: 8.21.3 + transitivePeerDependencies: + - bufferutil + - utf-8-validate has-flag@4.0.0: {} @@ -7145,6 +7532,8 @@ snapshots: httpxy@0.5.5: {} + human-signals@5.0.0: {} + iconv-lite@0.6.3: dependencies: safer-buffer: 2.1.2 @@ -7185,8 +7574,9 @@ snapshots: inherits@2.0.4: optional: true - ini@1.3.8: - optional: true + ini@1.3.8: {} + + iron-webcrypto@1.2.1: {} is-docker@3.0.0: {} @@ -7204,6 +7594,8 @@ snapshots: is-number@7.0.0: {} + is-stream@3.0.0: {} + is-wsl@3.1.1: dependencies: is-inside-container: 1.0.0 @@ -7216,12 +7608,28 @@ snapshots: editions: 6.22.0 textextensions: 6.11.0 + jackspeak@3.4.3: + dependencies: + '@isaacs/cliui': 8.0.2 + optionalDependencies: + '@pkgjs/parseargs': 0.11.0 + jiti@2.7.0: {} jora@1.0.0-beta.16: dependencies: '@discoveryjs/natural-compare': 1.1.0 + js-beautify@1.15.4: + dependencies: + config-chain: 1.1.13 + editorconfig: 1.0.7 + glob: 10.5.0 + js-cookie: 3.0.8 + nopt: 7.2.1 + + js-cookie@3.0.8: {} + js-tokens@10.0.0: {} js-tokens@4.0.0: {} @@ -7569,6 +7977,8 @@ snapshots: mdurl@2.1.0: {} + merge-stream@2.0.0: {} + merge2@1.4.1: {} microdiff@1.6.0: {} @@ -7794,6 +8204,8 @@ snapshots: mime@1.6.0: {} + mimic-fn@4.0.0: {} + mimic-response@3.1.0: optional: true @@ -7801,6 +8213,10 @@ snapshots: dependencies: brace-expansion: 5.0.9 + minimatch@9.0.9: + dependencies: + brace-expansion: 2.1.4 + minimist@1.2.8: optional: true @@ -7900,11 +8316,19 @@ snapshots: node-addon-api@4.3.0: optional: true + node-fetch-native@1.6.7: {} + + node-mock-http@1.0.5: {} + node-sarif-builder@3.4.0: dependencies: '@types/sarif': 2.1.7 fs-extra: 11.4.0 + nopt@7.2.1: + dependencies: + abbrev: 2.0.0 + normalize-package-data@6.0.2: dependencies: hosted-git-info: 7.0.2 @@ -7913,6 +8337,10 @@ snapshots: nostics@1.2.0: {} + npm-run-path@5.3.0: + dependencies: + path-key: 4.0.0 + npm-run-path@6.0.0: dependencies: path-key: 4.0.0 @@ -7925,9 +8353,9 @@ snapshots: nuxt-nightly@5.0.0-29782515.650ee625(@azure/identity@4.13.1(supports-color@7.2.0))(@oxc-project/types@0.144.0)(@types/node@26.2.0)(@vitejs/devtools-kit@0.4.12(cac@7.0.0)(srvx@0.11.22)(vite@8.2.1))(@vitejs/devtools@0.4.12)(@vue/compiler-sfc@3.5.41)(cac@7.0.0)(confbox@0.2.4)(crossws@0.4.10(srvx@0.11.22))(db0@0.3.4)(devframe@0.8.2(cac@7.0.0)(srvx@0.11.22))(eslint@10.8.1(jiti@2.7.0)(supports-color@7.2.0))(jiti@2.7.0)(lightningcss@1.33.0)(lru-cache@11.5.2)(mlly@1.8.2)(nuxt-nightly@5.0.0-29782515.650ee625)(optionator@0.9.4)(rolldown@1.2.4)(srvx@0.11.22)(typescript-native-bridge@6.0.3-bridge.13.tsgo.7.0.2)(valibot@1.4.2(typescript-native-bridge@6.0.3-bridge.13.tsgo.7.0.2))(vite@8.2.1)(yaml@2.9.0): dependencies: '@dxup/nuxt': 0.5.7(confbox@0.2.4)(jiti@2.7.0)(mlly@1.8.2)(rolldown@1.2.4)(vite@8.2.1) - '@nuxt/cli': '@nuxt/cli-nightly@4.0.0-20260812-132059-0bb4e52(@nuxt/schema-nightly@5.0.0-29782515.650ee625)(cac@7.0.0)(jiti@2.7.0)(rolldown@1.2.4)' + '@nuxt/cli': '@nuxt/cli-nightly@4.0.0-20260818-221829-0bb4e52(@nuxt/schema-nightly@5.0.0-29782515.650ee625)(cac@7.0.0)(jiti@2.7.0)(rolldown@1.2.4)' '@nuxt/devtools': 4.0.0-alpha.10(@azure/identity@4.13.1(supports-color@7.2.0))(cac@7.0.0)(chokidar@5.0.0)(confbox@0.2.4)(crossws@0.4.10(srvx@0.11.22))(db0@0.3.4)(devframe@0.8.2(cac@7.0.0)(srvx@0.11.22))(jiti@2.7.0)(lru-cache@11.5.2)(magic-string@1.2.0)(mlly@1.8.2)(ofetch@2.0.0-alpha.3)(rolldown@1.2.4)(srvx@0.11.22)(typescript-native-bridge@6.0.3-bridge.13.tsgo.7.0.2)(unplugin@3.3.0(rolldown@1.2.4)(vite@8.2.1))(valibot@1.4.2(typescript-native-bridge@6.0.3-bridge.13.tsgo.7.0.2))(vite@8.2.1)(vue@3.5.41(typescript-native-bridge@6.0.3-bridge.13.tsgo.7.0.2)) - '@nuxt/kit': '@nuxt/kit-nightly@5.0.0-29782515.650ee625(confbox@0.2.4)(jiti@2.7.0)(magic-string@1.2.0)(mlly@1.8.2)(rolldown@1.2.4)(unplugin@3.3.0(rolldown@1.2.4)(vite@8.2.1))' + '@nuxt/kit': '@nuxt/kit-nightly@5.0.0-29782515.650ee625(confbox@0.2.4)(dotenv@17.4.2)(giget@3.3.1)(jiti@2.7.0)(magic-string@1.2.0)(mlly@1.8.2)(rolldown@1.2.4)(unplugin@3.3.0(rolldown@1.2.4)(vite@8.2.1))' '@nuxt/nitro-server': '@nuxt/nitro-server-nightly@5.0.0-29782515.650ee625(1611a290d39663ad29b9f01cf4f2d4b4)' '@nuxt/schema': '@nuxt/schema-nightly@5.0.0-29782515.650ee625' '@nuxt/telemetry': 2.8.0(@nuxt/kit-nightly@5.0.0-29782515.650ee625(confbox@0.2.4)(jiti@2.7.0)(magic-string@1.2.0)(mlly@1.8.2)(rolldown@1.2.4)(unplugin@3.3.0(rolldown@1.2.4)(vite@8.2.1))) @@ -8083,16 +8511,16 @@ snapshots: - yaml - zephyr-agent - nuxt-nightly@5.0.0-29782515.650ee625(@azure/identity@4.13.1(supports-color@7.2.0))(@oxc-project/types@0.144.0)(@types/node@26.2.0)(@vitejs/devtools-kit@0.4.12(cac@7.0.0)(srvx@0.12.5)(vite@8.2.1))(@vitejs/devtools@0.4.12)(@vue/compiler-sfc@3.5.41)(cac@7.0.0)(confbox@0.2.4)(crossws@0.4.10(srvx@0.12.5))(eslint@10.8.1(jiti@2.7.0)(supports-color@7.2.0))(jiti@2.7.0)(lightningcss@1.33.0)(mlly@1.8.2)(nuxt-nightly@5.0.0-29782515.650ee625)(rolldown@1.2.4)(srvx@0.12.5)(typescript-native-bridge@6.0.3-bridge.13.tsgo.7.0.2)(valibot@1.4.2(typescript-native-bridge@6.0.3-bridge.13.tsgo.7.0.2))(vite@8.2.1)(yaml@2.9.0): + nuxt-nightly@5.0.0-29782515.650ee625(@azure/identity@4.13.1(supports-color@7.2.0))(@oxc-project/types@0.144.0)(@types/node@26.2.0)(@vitejs/devtools-kit@0.4.12(cac@7.0.0)(srvx@0.12.5)(vite@8.2.1))(@vitejs/devtools@0.4.12)(@vue/compiler-sfc@3.5.41)(cac@7.0.0)(confbox@0.2.4)(crossws@0.4.10(srvx@0.12.5))(devframe@0.8.2(cac@7.0.0)(srvx@0.12.5))(eslint@10.8.1(jiti@2.7.0)(supports-color@7.2.0))(jiti@2.7.0)(lightningcss@1.33.0)(mlly@1.8.2)(nuxt-nightly@5.0.0-29782515.650ee625)(rolldown@1.2.4)(srvx@0.12.5)(typescript-native-bridge@6.0.3-bridge.13.tsgo.7.0.2)(valibot@1.4.2(typescript-native-bridge@6.0.3-bridge.13.tsgo.7.0.2))(vite@8.2.1)(yaml@2.9.0): dependencies: '@dxup/nuxt': 0.5.7(confbox@0.2.4)(jiti@2.7.0)(mlly@1.8.2)(rolldown@1.2.4)(vite@8.2.1) - '@nuxt/cli': '@nuxt/cli-nightly@4.0.0-20260812-132059-0bb4e52(@nuxt/schema-nightly@5.0.0-29782515.650ee625)(cac@7.0.0)(jiti@2.7.0)(rolldown@1.2.4)' - '@nuxt/devtools': 4.0.0-alpha.10(@azure/identity@4.13.1(supports-color@7.2.0))(cac@7.0.0)(chokidar@5.0.0)(confbox@0.2.4)(crossws@0.4.10(srvx@0.12.5))(jiti@2.7.0)(magic-string@1.2.0)(mlly@1.8.2)(ofetch@2.0.0-alpha.3)(rolldown@1.2.4)(srvx@0.12.5)(typescript-native-bridge@6.0.3-bridge.13.tsgo.7.0.2)(unplugin@3.3.0(rolldown@1.2.4)(vite@8.2.1))(valibot@1.4.2(typescript-native-bridge@6.0.3-bridge.13.tsgo.7.0.2))(vite@8.2.1)(vue@3.5.41(typescript-native-bridge@6.0.3-bridge.13.tsgo.7.0.2)) - '@nuxt/kit': '@nuxt/kit-nightly@5.0.0-29782515.650ee625(confbox@0.2.4)(jiti@2.7.0)(magic-string@1.2.0)(mlly@1.8.2)(rolldown@1.2.4)(unplugin@3.3.0(rolldown@1.2.4)(vite@8.2.1))' - '@nuxt/nitro-server': '@nuxt/nitro-server-nightly@5.0.0-29782515.650ee625(@azure/identity@4.13.1(supports-color@7.2.0))(@oxc-project/types@0.144.0)(@vitejs/devtools-kit@0.4.12(cac@7.0.0)(srvx@0.12.5)(vite@8.2.1))(chokidar@5.0.0)(confbox@0.2.4)(jiti@2.7.0)(lightningcss@1.33.0)(mlly@1.8.2)(nuxt-nightly@5.0.0-29782515.650ee625(@azure/identity@4.13.1(supports-color@7.2.0))(@oxc-project/types@0.144.0)(@types/node@26.2.0)(@vitejs/devtools-kit@0.4.12(cac@7.0.0)(srvx@0.12.5)(vite@8.2.1))(@vitejs/devtools@0.4.12)(@vue/compiler-sfc@3.5.41)(cac@7.0.0)(confbox@0.2.4)(crossws@0.4.10(srvx@0.12.5))(eslint@10.8.1(jiti@2.7.0)(supports-color@7.2.0))(jiti@2.7.0)(lightningcss@1.33.0)(mlly@1.8.2)(nuxt-nightly@5.0.0-29782515.650ee625)(rolldown@1.2.4)(srvx@0.12.5)(typescript-native-bridge@6.0.3-bridge.13.tsgo.7.0.2)(valibot@1.4.2(typescript-native-bridge@6.0.3-bridge.13.tsgo.7.0.2))(vite@8.2.1)(yaml@2.9.0))(ofetch@2.0.0-alpha.3)(rolldown@1.2.4)(typescript-native-bridge@6.0.3-bridge.13.tsgo.7.0.2)(unplugin@3.3.0(rolldown@1.2.4)(vite@8.2.1))(vite@8.2.1)' + '@nuxt/cli': '@nuxt/cli-nightly@4.0.0-20260818-221829-0bb4e52(@nuxt/schema-nightly@5.0.0-29782515.650ee625)(cac@7.0.0)(jiti@2.7.0)(rolldown@1.2.4)' + '@nuxt/devtools': 4.0.0-alpha.10(@azure/identity@4.13.1(supports-color@7.2.0))(cac@7.0.0)(chokidar@5.0.0)(confbox@0.2.4)(crossws@0.4.10(srvx@0.12.5))(devframe@0.8.2(cac@7.0.0)(srvx@0.12.5))(jiti@2.7.0)(magic-string@1.2.0)(mlly@1.8.2)(ofetch@2.0.0-alpha.3)(rolldown@1.2.4)(srvx@0.12.5)(typescript-native-bridge@6.0.3-bridge.13.tsgo.7.0.2)(unplugin@3.3.0(rolldown@1.2.4)(vite@8.2.1))(valibot@1.4.2(typescript-native-bridge@6.0.3-bridge.13.tsgo.7.0.2))(vite@8.2.1)(vue@3.5.41(typescript-native-bridge@6.0.3-bridge.13.tsgo.7.0.2)) + '@nuxt/kit': '@nuxt/kit-nightly@5.0.0-29782515.650ee625(confbox@0.2.4)(dotenv@17.4.2)(giget@3.3.1)(jiti@2.7.0)(magic-string@1.2.0)(mlly@1.8.2)(rolldown@1.2.4)(unplugin@3.3.0(rolldown@1.2.4)(vite@8.2.1))' + '@nuxt/nitro-server': '@nuxt/nitro-server-nightly@5.0.0-29782515.650ee625(7c0ce82ca034b662c3a2c59e0174530c)' '@nuxt/schema': '@nuxt/schema-nightly@5.0.0-29782515.650ee625' '@nuxt/telemetry': 2.8.0(@nuxt/kit-nightly@5.0.0-29782515.650ee625(confbox@0.2.4)(jiti@2.7.0)(magic-string@1.2.0)(mlly@1.8.2)(rolldown@1.2.4)(unplugin@3.3.0(rolldown@1.2.4)(vite@8.2.1))) - '@nuxt/vite-builder': '@nuxt/vite-builder-nightly@5.0.0-29782515.650ee625(@types/node@26.2.0)(@vitejs/devtools@0.4.12)(confbox@0.2.4)(eslint@10.8.1(jiti@2.7.0)(supports-color@7.2.0))(jiti@2.7.0)(magic-string@1.2.0)(mlly@1.8.2)(nuxt-nightly@5.0.0-29782515.650ee625(@azure/identity@4.13.1(supports-color@7.2.0))(@oxc-project/types@0.144.0)(@types/node@26.2.0)(@vitejs/devtools-kit@0.4.12(cac@7.0.0)(srvx@0.12.5)(vite@8.2.1))(@vitejs/devtools@0.4.12)(@vue/compiler-sfc@3.5.41)(cac@7.0.0)(confbox@0.2.4)(crossws@0.4.10(srvx@0.12.5))(eslint@10.8.1(jiti@2.7.0)(supports-color@7.2.0))(jiti@2.7.0)(lightningcss@1.33.0)(mlly@1.8.2)(nuxt-nightly@5.0.0-29782515.650ee625)(rolldown@1.2.4)(srvx@0.12.5)(typescript-native-bridge@6.0.3-bridge.13.tsgo.7.0.2)(valibot@1.4.2(typescript-native-bridge@6.0.3-bridge.13.tsgo.7.0.2))(vite@8.2.1)(yaml@2.9.0))(rolldown@1.2.4)(typescript-native-bridge@6.0.3-bridge.13.tsgo.7.0.2)(unplugin@3.3.0(rolldown@1.2.4)(vite@8.2.1))(vue@3.5.41(typescript-native-bridge@6.0.3-bridge.13.tsgo.7.0.2))(yaml@2.9.0)' + '@nuxt/vite-builder': '@nuxt/vite-builder-nightly@5.0.0-29782515.650ee625(@types/node@26.2.0)(@vitejs/devtools@0.4.12)(confbox@0.2.4)(eslint@10.8.1(jiti@2.7.0)(supports-color@7.2.0))(jiti@2.7.0)(magic-string@1.2.0)(mlly@1.8.2)(nuxt-nightly@5.0.0-29782515.650ee625(@azure/identity@4.13.1(supports-color@7.2.0))(@oxc-project/types@0.144.0)(@types/node@26.2.0)(@vitejs/devtools-kit@0.4.12(cac@7.0.0)(srvx@0.12.5)(vite@8.2.1))(@vitejs/devtools@0.4.12)(@vue/compiler-sfc@3.5.41)(cac@7.0.0)(confbox@0.2.4)(crossws@0.4.10(srvx@0.12.5))(devframe@0.8.2(cac@7.0.0)(srvx@0.12.5))(eslint@10.8.1(jiti@2.7.0)(supports-color@7.2.0))(jiti@2.7.0)(lightningcss@1.33.0)(mlly@1.8.2)(nuxt-nightly@5.0.0-29782515.650ee625)(rolldown@1.2.4)(srvx@0.12.5)(typescript-native-bridge@6.0.3-bridge.13.tsgo.7.0.2)(valibot@1.4.2(typescript-native-bridge@6.0.3-bridge.13.tsgo.7.0.2))(vite@8.2.1)(yaml@2.9.0))(rolldown@1.2.4)(typescript-native-bridge@6.0.3-bridge.13.tsgo.7.0.2)(unplugin@3.3.0(rolldown@1.2.4)(vite@8.2.1))(vue@3.5.41(typescript-native-bridge@6.0.3-bridge.13.tsgo.7.0.2))(yaml@2.9.0)' '@unhead/vue': 3.3.2(@oxc-project/types@0.144.0)(@vitejs/devtools-kit@0.4.12(cac@7.0.0)(srvx@0.12.5)(vite@8.2.1))(lightningcss@1.33.0)(rolldown@1.2.4)(vite@8.2.1)(vue@3.5.41(typescript-native-bridge@6.0.3-bridge.13.tsgo.7.0.2)) '@vue/shared': 3.5.41 chokidar: 5.0.0 @@ -8262,6 +8690,12 @@ snapshots: dependencies: ohash: 2.0.12 + ofetch@1.5.1: + dependencies: + destr: 2.0.5 + node-fetch-native: 1.6.7 + ufo: 1.6.4 + ofetch@2.0.0-alpha.3: {} ohash@2.0.12: {} @@ -8273,6 +8707,10 @@ snapshots: wrappy: 1.0.2 optional: true + onetime@6.0.0: + dependencies: + mimic-fn: 4.0.0 + open@10.2.0: dependencies: default-browser: 5.5.1 @@ -8304,6 +8742,8 @@ snapshots: p-map@7.0.6: {} + package-json-from-dist@1.0.1: {} + package-manager-detector@1.8.0: {} parse-gitignore@2.0.0: {} @@ -8345,6 +8785,11 @@ snapshots: path-key@4.0.0: {} + path-scurry@1.11.1: + dependencies: + lru-cache: 10.4.3 + minipass: 7.1.3 + path-scurry@2.0.2: dependencies: lru-cache: 11.5.2 @@ -8419,6 +8864,8 @@ snapshots: retry: 0.12.0 signal-exit: 3.0.7 + proto-list@1.2.4: {} + pump@3.0.4: dependencies: end-of-stream: 1.4.5 @@ -8440,6 +8887,8 @@ snapshots: queue-microtask@1.2.3: {} + radix3@1.1.2: {} + rc-config-loader@4.1.4(supports-color@7.2.0): dependencies: debug: 4.4.3(supports-color@7.2.0) @@ -8502,7 +8951,7 @@ snapshots: reusify@1.1.0: {} - rolldown-plugin-dts@0.27.14(@volar/typescript@2.4.28)(rolldown@1.2.4)(typescript-native-bridge@6.0.3-bridge.13.tsgo.7.0.2): + rolldown-plugin-dts@0.27.14(@volar/typescript@2.4.28(typescript-native-bridge@6.0.3-bridge.13.tsgo.7.0.2))(rolldown@1.2.4)(typescript-native-bridge@6.0.3-bridge.13.tsgo.7.0.2): dependencies: dts-resolver: 3.0.0 get-tsconfig: 5.0.0-beta.5 @@ -8512,7 +8961,7 @@ snapshots: yuku-codegen: 0.8.7 yuku-parser: 0.8.7 optionalDependencies: - '@volar/typescript': 2.4.28 + '@volar/typescript': 2.4.28(typescript-native-bridge@6.0.3-bridge.13.tsgo.7.0.2) typescript: typescript-native-bridge@6.0.3-bridge.13.tsgo.7.0.2 transitivePeerDependencies: - oxc-resolver @@ -8625,6 +9074,8 @@ snapshots: signal-exit@3.0.7: {} + signal-exit@4.1.0: {} + simple-concat@1.0.1: optional: true @@ -8686,6 +9137,12 @@ snapshots: is-fullwidth-code-point: 3.0.0 strip-ansi: 6.0.1 + string-width@5.1.2: + dependencies: + eastasianwidth: 0.2.0 + emoji-regex: 9.2.2 + strip-ansi: 7.2.0 + string_decoder@1.3.0: dependencies: safe-buffer: 5.2.1 @@ -8699,6 +9156,8 @@ snapshots: dependencies: ansi-regex: 6.3.0 + strip-final-newline@3.0.0: {} + strip-json-comments@2.0.1: optional: true @@ -8801,7 +9260,7 @@ snapshots: dependencies: typescript: typescript-native-bridge@6.0.3-bridge.13.tsgo.7.0.2 - tsdown@0.22.14(@vitejs/devtools@0.4.12)(@volar/typescript@2.4.28)(typescript-native-bridge@6.0.3-bridge.13.tsgo.7.0.2): + tsdown@0.22.14(@vitejs/devtools@0.4.12)(@volar/typescript@2.4.28(typescript-native-bridge@6.0.3-bridge.13.tsgo.7.0.2))(typescript-native-bridge@6.0.3-bridge.13.tsgo.7.0.2): dependencies: ansis: 4.3.1 cac: 7.0.0 @@ -8812,14 +9271,14 @@ snapshots: obug: 2.1.4 picomatch: 4.0.5 rolldown: 1.2.4 - rolldown-plugin-dts: 0.27.14(@volar/typescript@2.4.28)(rolldown@1.2.4)(typescript-native-bridge@6.0.3-bridge.13.tsgo.7.0.2) + rolldown-plugin-dts: 0.27.14(@volar/typescript@2.4.28(typescript-native-bridge@6.0.3-bridge.13.tsgo.7.0.2))(rolldown@1.2.4)(typescript-native-bridge@6.0.3-bridge.13.tsgo.7.0.2) tinyexec: 1.3.0 tinyglobby: 0.2.17 tree-kill: 1.2.2 unconfig-core: 7.5.0 verkit: 0.3.2 optionalDependencies: - '@vitejs/devtools': 0.4.12(typescript-native-bridge@6.0.3-bridge.13.tsgo.7.0.2)(vite@8.2.1) + '@vitejs/devtools': 0.4.12(crossws@0.4.10(srvx@0.12.5))(srvx@0.12.5)(typescript-native-bridge@6.0.3-bridge.13.tsgo.7.0.2)(valibot@1.4.2(typescript-native-bridge@6.0.3-bridge.13.tsgo.7.0.2))(vite@8.2.1) typescript: typescript-native-bridge@6.0.3-bridge.13.tsgo.7.0.2 transitivePeerDependencies: - '@typescript/native-preview' @@ -9084,12 +9543,16 @@ snapshots: tinyglobby: 0.2.17 optionalDependencies: '@types/node': 26.2.0 - '@vitejs/devtools': 0.4.12(typescript-native-bridge@6.0.3-bridge.13.tsgo.7.0.2)(vite@8.2.1) + '@vitejs/devtools': 0.4.12(crossws@0.4.10(srvx@0.12.5))(srvx@0.12.5)(typescript-native-bridge@6.0.3-bridge.13.tsgo.7.0.2)(valibot@1.4.2(typescript-native-bridge@6.0.3-bridge.13.tsgo.7.0.2))(vite@8.2.1) fsevents: 2.3.3 jiti: 2.7.0 yaml: 2.9.0 - vitest@4.1.10(@types/node@26.2.0)(vite@8.2.1): + vitest-environment-nuxt@2.0.0: + dependencies: + '@nuxt/test-utils': 4.1.0(@vue/test-utils@2.4.11(@vue/compiler-dom@3.5.41)(@vue/server-renderer@3.5.41)(vue@3.5.41(typescript-native-bridge@6.0.3-bridge.13.tsgo.7.0.2)))(confbox@0.2.4)(dotenv@17.4.2)(giget@3.3.1)(happy-dom@20.11.2)(jiti@2.7.0)(magicast@0.5.4)(mlly@1.8.2)(rolldown@1.2.4)(typescript-native-bridge@6.0.3-bridge.13.tsgo.7.0.2)(vite@8.2.1)(vitest@4.1.10(@types/node@26.2.0)(happy-dom@20.11.2)(vite@8.2.1)) + + vitest@4.1.10(@types/node@26.2.0)(happy-dom@20.11.2)(vite@8.2.1): dependencies: '@vitest/expect': 4.1.10 '@vitest/mocker': 4.1.10(vite@8.2.1) @@ -9113,6 +9576,7 @@ snapshots: why-is-node-running: 2.3.0 optionalDependencies: '@types/node': 26.2.0 + happy-dom: 20.11.2 transitivePeerDependencies: - msw @@ -9124,7 +9588,7 @@ snapshots: vue-component-meta@3.3.10(typescript-native-bridge@6.0.3-bridge.13.tsgo.7.0.2): dependencies: - '@volar/typescript': 2.4.28 + '@volar/typescript': 2.4.28(typescript-native-bridge@6.0.3-bridge.13.tsgo.7.0.2) '@vue/language-core': 3.3.10 path-browserify: 1.0.1 optionalDependencies: @@ -9196,6 +9660,8 @@ snapshots: dependencies: iconv-lite: 0.6.3 + whatwg-mimetype@3.0.0: {} + whatwg-mimetype@4.0.0: {} which@2.0.2: @@ -9209,6 +9675,18 @@ snapshots: word-wrap@1.2.5: {} + wrap-ansi@7.0.0: + dependencies: + ansi-styles: 4.3.0 + string-width: 4.2.3 + strip-ansi: 6.0.1 + + wrap-ansi@8.1.0: + dependencies: + ansi-styles: 6.2.3 + string-width: 5.1.2 + strip-ansi: 7.2.0 + wrappy@1.0.2: optional: true diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index f5b042d..9655f79 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -19,12 +19,14 @@ overrides: catalog: "@nuxt/kit": ^4.5.2 + "@nuxt/test-utils": ^4.1.0 "@types/node": ^26.2.0 "@volar/language-core": ^2.4.28 "@volar/typescript": ^2.4.28 "@vscode/vsce": ^3.9.2 "@vue/compiler-dom": ^3.5.41 "@vue/language-core": ^3.3.10 + "@vue/test-utils": ^2.4.11 "@vue/typescript-plugin": ^3.3.10 "@zinkawaii/eslint-config": ^0.5.3 "@zinkawaii/scripts": ^0.0.5 @@ -32,6 +34,7 @@ catalog: bumpp: ^12.2.1 chokidar: ^5.0.0 eslint: ^10.8.1 + happy-dom: ^20.11.2 knitwork: ^1.3.0 magic-string: ^1.2.0 nuxt: ^4.5.2 diff --git a/test/named-layout-slots/e2e/fixture/.nuxtrc b/test/named-layout-slots/e2e/fixture/.nuxtrc new file mode 100644 index 0000000..0072a1f --- /dev/null +++ b/test/named-layout-slots/e2e/fixture/.nuxtrc @@ -0,0 +1 @@ +setups.@nuxt/test-utils="4.1.0" diff --git a/test/named-layout-slots/e2e/fixture/app/app.vue b/test/named-layout-slots/e2e/fixture/app/app.vue new file mode 100644 index 0000000..e385020 --- /dev/null +++ b/test/named-layout-slots/e2e/fixture/app/app.vue @@ -0,0 +1,5 @@ + diff --git a/test/named-layout-slots/e2e/fixture/app/components/ContentProbe.vue b/test/named-layout-slots/e2e/fixture/app/components/ContentProbe.vue new file mode 100644 index 0000000..65e0d4c --- /dev/null +++ b/test/named-layout-slots/e2e/fixture/app/components/ContentProbe.vue @@ -0,0 +1,12 @@ + + + diff --git a/test/named-layout-slots/e2e/fixture/app/components/PanelProbe.vue b/test/named-layout-slots/e2e/fixture/app/components/PanelProbe.vue new file mode 100644 index 0000000..74095e5 --- /dev/null +++ b/test/named-layout-slots/e2e/fixture/app/components/PanelProbe.vue @@ -0,0 +1,10 @@ + + + diff --git a/test/named-layout-slots/e2e/fixture/app/layouts/default.vue b/test/named-layout-slots/e2e/fixture/app/layouts/default.vue new file mode 100644 index 0000000..afd5f34 --- /dev/null +++ b/test/named-layout-slots/e2e/fixture/app/layouts/default.vue @@ -0,0 +1,34 @@ + + + diff --git a/test/named-layout-slots/e2e/fixture/app/pages/cached.vue b/test/named-layout-slots/e2e/fixture/app/pages/cached.vue new file mode 100644 index 0000000..59d23ee --- /dev/null +++ b/test/named-layout-slots/e2e/fixture/app/pages/cached.vue @@ -0,0 +1,15 @@ + + + + diff --git a/test/named-layout-slots/e2e/fixture/app/pages/index.vue b/test/named-layout-slots/e2e/fixture/app/pages/index.vue new file mode 100644 index 0000000..076d87b --- /dev/null +++ b/test/named-layout-slots/e2e/fixture/app/pages/index.vue @@ -0,0 +1,7 @@ + + + diff --git a/test/named-layout-slots/e2e/fixture/app/pages/multi.vue b/test/named-layout-slots/e2e/fixture/app/pages/multi.vue new file mode 100644 index 0000000..a77cf98 --- /dev/null +++ b/test/named-layout-slots/e2e/fixture/app/pages/multi.vue @@ -0,0 +1,17 @@ + + + + diff --git a/test/named-layout-slots/e2e/fixture/app/pages/nested.vue b/test/named-layout-slots/e2e/fixture/app/pages/nested.vue new file mode 100644 index 0000000..01b7bef --- /dev/null +++ b/test/named-layout-slots/e2e/fixture/app/pages/nested.vue @@ -0,0 +1,3 @@ + diff --git a/test/named-layout-slots/e2e/fixture/app/pages/nested/[id].vue b/test/named-layout-slots/e2e/fixture/app/pages/nested/[id].vue new file mode 100644 index 0000000..db81d00 --- /dev/null +++ b/test/named-layout-slots/e2e/fixture/app/pages/nested/[id].vue @@ -0,0 +1,14 @@ + + + + diff --git a/test/named-layout-slots/e2e/fixture/app/pages/nested/index.vue b/test/named-layout-slots/e2e/fixture/app/pages/nested/index.vue new file mode 100644 index 0000000..e4feea3 --- /dev/null +++ b/test/named-layout-slots/e2e/fixture/app/pages/nested/index.vue @@ -0,0 +1,7 @@ + + + diff --git a/test/named-layout-slots/e2e/fixture/app/pages/slow.vue b/test/named-layout-slots/e2e/fixture/app/pages/slow.vue new file mode 100644 index 0000000..01b7bef --- /dev/null +++ b/test/named-layout-slots/e2e/fixture/app/pages/slow.vue @@ -0,0 +1,3 @@ + diff --git a/test/named-layout-slots/e2e/fixture/app/pages/slow/index.vue b/test/named-layout-slots/e2e/fixture/app/pages/slow/index.vue new file mode 100644 index 0000000..9c48d9d --- /dev/null +++ b/test/named-layout-slots/e2e/fixture/app/pages/slow/index.vue @@ -0,0 +1,11 @@ + + + + diff --git a/test/named-layout-slots/e2e/fixture/app/pages/toggle.vue b/test/named-layout-slots/e2e/fixture/app/pages/toggle.vue new file mode 100644 index 0000000..8512dc1 --- /dev/null +++ b/test/named-layout-slots/e2e/fixture/app/pages/toggle.vue @@ -0,0 +1,14 @@ + + + + diff --git a/test/named-layout-slots/e2e/fixture/app/utils/gate.ts b/test/named-layout-slots/e2e/fixture/app/utils/gate.ts new file mode 100644 index 0000000..559a2f3 --- /dev/null +++ b/test/named-layout-slots/e2e/fixture/app/utils/gate.ts @@ -0,0 +1,9 @@ +export const pageGates = ((globalThis as any).__pageGates ??= new Map void)[]>()) as Map void)[]>; + +export function holdPage(key: string) { + return new Promise((resolve) => { + const resolvers = pageGates.get(key) ?? []; + resolvers.push(resolve); + pageGates.set(key, resolvers); + }); +} diff --git a/test/named-layout-slots/e2e/fixture/nuxt.config.ts b/test/named-layout-slots/e2e/fixture/nuxt.config.ts new file mode 100644 index 0000000..b7972fa --- /dev/null +++ b/test/named-layout-slots/e2e/fixture/nuxt.config.ts @@ -0,0 +1,12 @@ +export default defineNuxtConfig({ + experimental: { + // the nitro vite environment breaks inside the vitest dev server + nitroViteEnvironment: false, + }, + modules: ["@dxup/nuxt"], + dxup: { + features: { + namedLayoutSlots: true, + }, + }, +}); diff --git a/test/named-layout-slots/e2e/fixture/tsconfig.json b/test/named-layout-slots/e2e/fixture/tsconfig.json new file mode 100644 index 0000000..aa0f819 --- /dev/null +++ b/test/named-layout-slots/e2e/fixture/tsconfig.json @@ -0,0 +1,17 @@ +{ + "references": [ + { + "path": "./.nuxt/tsconfig.app.json" + }, + { + "path": "./.nuxt/tsconfig.server.json" + }, + { + "path": "./.nuxt/tsconfig.shared.json" + }, + { + "path": "./.nuxt/tsconfig.node.json" + } + ], + "files": [] +} diff --git a/test/named-layout-slots/e2e/index.test.ts b/test/named-layout-slots/e2e/index.test.ts new file mode 100644 index 0000000..53f3397 --- /dev/null +++ b/test/named-layout-slots/e2e/index.test.ts @@ -0,0 +1,210 @@ +import { mountSuspended } from "@nuxt/test-utils/runtime"; +import { navigateTo } from "nuxt/app"; +import { afterEach, beforeEach, describe, expect, it, vi } from "vitest"; +import App from "./fixture/app/app.vue"; + +interface SlotsEvent { + type: string; + keys: string[]; +} + +const events: SlotsEvent[] = ((globalThis as any).__layoutSlotsEvents ??= []); + +/** Records the events emitted from this point on */ +function recordEvents() { + const start = events.length; + const since = () => events.slice(start); + + return { + ofType: (type: string) => since().filter((event) => event.type === type), + getTypes: () => since().map((event) => event.type), + /** The slot keys the layout resolved most recently */ + getCurrentSlotKeys: () => since().filter((event) => event.type === "slots").at(-1)?.keys ?? [], + }; +} + +const pageGates = ((globalThis as any).__pageGates ??= new Map()) as Map void)[]>; + +function releasePage(key: string) { + for (const resolve of pageGates.get(key)?.splice(0) ?? []) { + resolve(); + } +} + +function releaseAllPages() { + for (const key of pageGates.keys()) { + releasePage(key); + } +} + +/** Waits until the gated page is mounted and awaiting its setup */ +async function waitForPendingPage(key: string) { + await vi.waitFor(() => { + expect(pageGates.get(key)?.length ?? 0).toBeGreaterThan(0); + }); +} + +describe("named layout slots navigation", () => { + let wrapper: Awaited>>; + + /** Opens the nested detail page, which provides the `panel` slot. */ + async function openPageWithSlot(id: number) { + await navigateTo(`/nested/${id}`); + await vi.waitFor(() => { + expect(wrapper.find(`[data-testid="panel-detail"]`).text()).toBe(`Detail ${id}`); + }); + } + + /** Opens a page that provides no slot, so the layout hides it. */ + async function openPageWithoutSlot() { + await navigateTo("/nested"); + await vi.waitFor(() => { + expect(wrapper.find(`[data-testid="page-no-slot"]`).exists()).toBe(true); + expect(wrapper.find(`[data-testid="sidebar"]`).exists()).toBe(false); + }); + } + + beforeEach(async () => { + await navigateTo("/"); + wrapper = await mountSuspended(App); + await vi.waitFor(() => { + expect(wrapper.find(`[data-testid="page-home"]`).exists()).toBe(true); + }); + }); + + afterEach(() => { + releaseAllPages(); + wrapper?.unmount(); + }); + + it("should show the page slot of a nested page", async () => { + expect(wrapper.find(`[data-testid="sidebar"]`).exists()).toBe(false); + + await openPageWithSlot(1); + }); + + it("should not hide the page slot while the next page is loading", async () => { + await openPageWithSlot(1); + + const recorded = recordEvents(); + await navigateTo("/slow"); + await waitForPendingPage("slow"); + + // the existing page keeps providing its slot while the new page's setup is pending + expect(wrapper.find(`[data-testid="sidebar"]`).text()).toContain("Detail 1"); + expect(wrapper.find(`[data-testid="page-detail"]`).exists()).toBe(true); + // and its slot content stays mounted + expect(recorded.getTypes()).not.toContain("content:unmounted"); + + // the slot swaps once the setup resolves and the new page mounts + releasePage("slow"); + await vi.waitFor(() => { + expect(wrapper.find(`[data-testid="page-slow"]`).exists()).toBe(true); + expect(wrapper.find(`[data-testid="sidebar"]`).text()).toContain("Slow"); + }); + expect(wrapper.find(`[data-testid="sidebar"]`).text()).not.toContain("Detail 1"); + + for (const event of recorded.ofType("slots")) { + expect(event.keys).toContain("panel"); + } + expect(recorded.getTypes()).not.toContain("sidebar:unmounted"); + }); + + it("should hide the page slot when the next page does not provide one", async () => { + await openPageWithSlot(1); + + const recorded = recordEvents(); + await openPageWithoutSlot(); + + expect(recorded.getCurrentSlotKeys()).not.toContain("panel"); + }); + + it("should show the page slot again when returning to a page that provides one", async () => { + await openPageWithSlot(1); + await openPageWithoutSlot(); + + await openPageWithSlot(2); + }); + + it("should stay consistent when a navigation is interrupted", async () => { + const interrupted = navigateTo("/slow"); + // cancel navigation while the slow page is still loading + await navigateTo("/nested"); + await interrupted; + + releasePage("slow"); + + await vi.waitFor(() => { + expect(wrapper.find(`[data-testid="page-no-slot"]`).exists()).toBe(true); + }); + + // the aborted page must not leave a rendered slot + expect(wrapper.find(`[data-testid="sidebar"]`).exists()).toBe(false); + }); + + it("should hide and restore the page slot of a page kept alive in the background", async () => { + await navigateTo("/cached"); + await vi.waitFor(() => { + expect(wrapper.find(`[data-testid="panel-cached"]`).exists()).toBe(true); + }); + + // deactivating the kept-alive page must remove its slots + await openPageWithoutSlot(); + + // reactivating it must provide them again + await navigateTo("/cached"); + await vi.waitFor(() => { + expect(wrapper.find(`[data-testid="panel-cached"]`).exists()).toBe(true); + }); + }); + + it("should remount the slot content when the providing page changes", async () => { + await openPageWithSlot(1); + await wrapper.find(`[data-testid="content-state"]`).trigger("click"); + expect(wrapper.find(`[data-testid="content-state"]`).text()).toBe("dirty"); + + const recorded = recordEvents(); + await openPageWithSlot(2); + + // the state belongs to the page, so it must not carry state across pages + expect(recorded.getTypes()).toContain("content:unmounted"); + expect(wrapper.find(`[data-testid="content-state"]`).text()).toBe("clean"); + }); + + it("should keep the slot content instance when the providing page re-renders its slots", async () => { + await navigateTo("/multi"); + await vi.waitFor(() => { + expect(wrapper.find(`[data-testid="page-multi"]`).exists()).toBe(true); + }); + await wrapper.find(`[data-testid="content-state"]`).trigger("click"); + + const recorded = recordEvents(); + // toggling another conditional slot invalidates the page's forwarded slots + await wrapper.find(`[data-testid="toggle-aside"]`).trigger("click"); + await vi.waitFor(() => { + expect(wrapper.find(`[data-testid="aside-content"]`).exists()).toBe(true); + }); + + expect(recorded.getTypes()).not.toContain("content:unmounted"); + expect(wrapper.find(`[data-testid="content-state"]`).text()).toBe("dirty"); + }); + + it("should update the page slot when a page toggles it conditionally", async () => { + await navigateTo("/toggle"); + await vi.waitFor(() => { + expect(wrapper.find(`[data-testid="panel-toggle"]`).exists()).toBe(true); + }); + + // hiding the slot must remove it + await wrapper.find(`[data-testid="toggle"]`).trigger("click"); + await vi.waitFor(() => { + expect(wrapper.find(`[data-testid="sidebar"]`).exists()).toBe(false); + }); + + // showing it again must bring it back + await wrapper.find(`[data-testid="toggle"]`).trigger("click"); + await vi.waitFor(() => { + expect(wrapper.find(`[data-testid="panel-toggle"]`).exists()).toBe(true); + }); + }); +}); diff --git a/test/named-layout-slots/index.test.ts b/test/named-layout-slots/index.test.ts deleted file mode 100644 index 279c61d..0000000 --- a/test/named-layout-slots/index.test.ts +++ /dev/null @@ -1,107 +0,0 @@ -import { describe, expect, it } from "vitest"; -import { type ComputedRef, defineComponent, h, type Slots } from "vue"; -import { renderToString } from "vue/server-renderer"; -import NuxtLayout, { LayoutSlot, LayoutSlotsForward, useLayoutSlots } from "../../packages/nuxt/src/module/named-layout-slots/runtime/layouts"; - -const DefaultLayout = defineComponent((props, ctx) => { - return () => [ - h("header", [ - h(LayoutSlot, { name: "header" }, () => "fallback"), - ]), - h("main", ctx.slots.default?.()), - ]; -}); - -function render(page: Record) { - return renderToString( - h(NuxtLayout, null, { - default: () => h(DefaultLayout, null, { - default: () => h(LayoutSlotsForward, null, page), - }), - }), - ); -} - -describe("named layout slots", () => { - it("should prefer the slot provided by the page", async () => { - const html = await render({ - default: () => h("div", "page"), - header: () => "from page", - }); - - expect(html).toContain("
from page
"); - }); - - it("should render the fallback when the page does not provide the slot", async () => { - const html = await render({ - default: () => h("div", "page"), - }); - - expect(html).toContain("
fallback
"); - }); - - it("should not render the single-root page as a fragment", async () => { - const Page = defineComponent(() => { - return () => h("div", "page"); - }); - - const html = await render({ - default: () => h(Page), - }); - - expect(html).toContain("
page
"); - }); - - it("should render a page without a layout", async () => { - const render = () => renderToString( - h(LayoutSlotsForward, null, { - default: () => h("div", "page"), - }), - ); - - expect(render()).resolves.not.toThrow(); - }); - - it("should render a layout slot fallback without a layout provider", async () => { - const render = () => renderToString( - h(LayoutSlot, { name: "header" }, () => "fallback"), - ); - - expect(render()).resolves.not.toThrow(); - }); - - it("should expose the slots provided by the page via useLayoutSlots", async () => { - let slots!: ComputedRef; - - const Layout = defineComponent((props, ctx) => { - slots = useLayoutSlots(); - return () => h("main", ctx.slots.default?.()); - }); - - await renderToString( - h(NuxtLayout, null, { - default: () => h(Layout, null, { - default: () => h(LayoutSlotsForward, null, { - default: () => h("div", "page"), - header: () => "from page", - }), - }), - }), - ); - - expect(Object.keys(slots.value)).toEqual(["default", "header"]); - }); - - it("should return empty slots via useLayoutSlots without a layout provider", async () => { - let slots!: ComputedRef; - - await renderToString( - h(defineComponent(() => { - slots = useLayoutSlots(); - return () => h("div", "page"); - })), - ); - - expect(slots.value).toEqual({}); - }); -}); diff --git a/test/named-layout-slots/unit/index.test.ts b/test/named-layout-slots/unit/index.test.ts new file mode 100644 index 0000000..f5c7673 --- /dev/null +++ b/test/named-layout-slots/unit/index.test.ts @@ -0,0 +1,234 @@ +import { describe, expect, it } from "vitest"; +import { type ComputedRef, defineComponent, h, inject, type Slots } from "vue"; +import { renderToString } from "vue/server-renderer"; +import NuxtLayout, { LayoutSlot, LayoutSlotsForward, useLayoutSlots } from "../../../packages/nuxt/src/module/named-layout-slots/runtime/layouts"; +import { injectionKey, type LayoutSlotsRegistry } from "../../../packages/nuxt/src/module/named-layout-slots/runtime/registry"; + +const DefaultLayout = defineComponent((props, ctx) => { + return () => [ + h("header", [ + h(LayoutSlot, { name: "header" }, () => "fallback"), + ]), + h("main", ctx.slots.default?.()), + ]; +}); + +function render(page: Record) { + return renderToString( + h(NuxtLayout, null, { + default: () => h(DefaultLayout, null, { + default: () => h(LayoutSlotsForward, null, page), + }), + }), + ); +} + +describe("named layout slots", () => { + it("should prefer the slot provided by the page", async () => { + const html = await render({ + default: () => h("div", "page"), + header: () => "from page", + }); + + expect(html).toContain("
from page
"); + }); + + it("should render the fallback when the page does not provide the slot", async () => { + const html = await render({ + default: () => h("div", "page"), + }); + + expect(html).toContain("
fallback
"); + }); + + it("should not render the single-root page as a fragment", async () => { + const Page = defineComponent(() => { + return () => h("div", "page"); + }); + + const html = await render({ + default: () => h(Page), + }); + + expect(html).toContain("
page
"); + }); + + it("should prefer the innermost forward when nested pages provide the same slot", async () => { + const html = await render({ + default: () => h(LayoutSlotsForward, null, { + default: () => h("div", "child"), + header: () => "from child", + }), + header: () => "from parent", + }); + + expect(html).toContain("
from child
"); + }); + + it("should keep the outer slots when a nested forward does not provide them", async () => { + const html = await render({ + default: () => h(LayoutSlotsForward, null, { + default: () => h("div", "child"), + }), + header: () => "from parent", + }); + + expect(html).toContain("
from parent
"); + }); + + it("should resolve merged slots from the live slots of a re-rendered page", async () => { + let slots!: ComputedRef; + const pageSlots: Record string> = { + header: () => "before", + }; + + const InnerPage = defineComponent(() => { + const registry = inject(injectionKey)!; + registry.use(pageSlots); + return () => h("div", "page"); + }); + + const Layout = defineComponent((props, ctx) => { + slots = useLayoutSlots(); + return () => h("main", ctx.slots.default?.()); + }); + + await renderToString( + h(NuxtLayout, null, { + default: () => h(Layout, null, { + default: () => h(LayoutSlotsForward, null, { + default: () => h(InnerPage), + header: () => "outer", + }), + }), + }), + ); + + pageSlots.header = () => "after"; + + expect(slots.value.header?.()).toBe("after"); + }); + + it("should attribute a slot to the innermost forward providing it", async () => { + let registry!: LayoutSlotsRegistry; + + const Layout = defineComponent((props, ctx) => { + registry = inject(injectionKey)!; + return () => h("main", ctx.slots.default?.()); + }); + + await renderToString( + h(NuxtLayout, null, { + default: () => h(Layout, null, { + default: () => h(LayoutSlotsForward, null, { + default: () => h(LayoutSlotsForward, null, { + default: () => h("div", "child"), + header: () => "from child", + }), + header: () => "from parent", + footer: () => "from parent", + }), + }), + }), + ); + + const headerOwner = registry.getOwner("header"); + expect(headerOwner).toBeDefined(); + // the child forward owns the slots it provides, including the shared ones + expect(registry.getOwner("default")).toBe(headerOwner); + // the parent forward owns only the slots the child does not provide + expect(registry.getOwner("footer")).not.toBe(headerOwner); + expect(registry.getOwner("missing")).toBeUndefined(); + }); + + it("should move the ownership when the innermost forward stops providing a slot", async () => { + let registry!: LayoutSlotsRegistry; + const pageSlots: Record string) | undefined> = { + header: () => "inner", + }; + + const InnerPage = defineComponent(() => { + registry.use(pageSlots as Slots); + return () => h("div", "page"); + }); + + const Layout = defineComponent((props, ctx) => { + registry = inject(injectionKey)!; + return () => h("main", ctx.slots.default?.()); + }); + + await renderToString( + h(NuxtLayout, null, { + default: () => h(Layout, null, { + default: () => h(LayoutSlotsForward, null, { + default: () => h(InnerPage), + header: () => "outer", + footer: () => "outer", + }), + }), + }), + ); + + const innerOwner = registry.getOwner("header"); + const outerOwner = registry.getOwner("footer"); + expect(innerOwner).not.toBe(outerOwner); + + delete pageSlots.header; + registry.invalidate(); + + expect(registry.getOwner("header")).toBe(outerOwner); + }); + + it("should render a page without a layout", async () => { + const render = () => renderToString( + h(LayoutSlotsForward, null, { + default: () => h("div", "page"), + }), + ); + + expect(render()).resolves.not.toThrow(); + }); + + it("should render a layout slot fallback without a layout provider", async () => { + const render = () => renderToString( + h(LayoutSlot, { name: "header" }, () => "fallback"), + ); + + expect(render()).resolves.not.toThrow(); + }); + + it("should expose the slots provided by the page via useLayoutSlots", async () => { + let slots!: ComputedRef; + + const Layout = defineComponent((props, ctx) => { + slots = useLayoutSlots(); + return () => h("main", ctx.slots.default?.()); + }); + + await renderToString( + h(NuxtLayout, null, { + default: () => h(Layout, null, { + default: () => h(LayoutSlotsForward, null, { + default: () => h("div", "page"), + header: () => "from page", + }), + }), + }), + ); + + expect(Object.keys(slots.value)).toEqual(["default", "header"]); + }); + + it("should return empty slots via useLayoutSlots without a layout provider", async () => { + let slots!: ComputedRef; + + await renderToString( + h(defineComponent(() => { + slots = useLayoutSlots(); + return () => h("div", "page"); + })), + ); + + expect(slots.value).toEqual({}); + }); +}); diff --git a/test/named-layout-slots/stubs/layouts.ts b/test/named-layout-slots/unit/stubs/layouts.ts similarity index 100% rename from test/named-layout-slots/stubs/layouts.ts rename to test/named-layout-slots/unit/stubs/layouts.ts diff --git a/test/named-layout-slots/vitest.config.ts b/test/named-layout-slots/vitest.config.ts deleted file mode 100644 index 6c78925..0000000 --- a/test/named-layout-slots/vitest.config.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { join } from "pathe"; -import { defineProject } from "vitest/config"; - -export default defineProject({ - define: { - "import.meta.server": true, - }, - resolve: { - alias: { - "#build/dxup/layouts.mjs": join(import.meta.dirname, "stubs/layouts.ts"), - }, - }, -}); diff --git a/test/shims-vue.d.ts b/test/shims-vue.d.ts new file mode 100644 index 0000000..3467311 --- /dev/null +++ b/test/shims-vue.d.ts @@ -0,0 +1,6 @@ +declare module "*.vue" { + import type { DefineComponent } from "vue"; + + const component: DefineComponent; + export default component; +} diff --git a/tsconfig.json b/tsconfig.json index dad9ce8..01fdb58 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -5,5 +5,8 @@ "scripts/**/*.ts", "test/**/*.ts", "vitest.config.ts" + ], + "exclude": [ + "test/named-layout-slots/e2e/fixture" ] } diff --git a/vitest.config.ts b/vitest.config.ts index 3423e84..afad60e 100644 --- a/vitest.config.ts +++ b/vitest.config.ts @@ -1,3 +1,5 @@ +import { defineVitestProject } from "@nuxt/test-utils/config"; +import { join } from "pathe"; import { defineConfig } from "vitest/config"; export default defineConfig({ @@ -9,7 +11,33 @@ export default defineConfig({ include: ["test/*.test.ts"], }, }, - "test/named-layout-slots/vitest.config.ts", + { + test: { + name: "named-layout-slots", + include: ["test/named-layout-slots/unit/*.test.ts"], + }, + define: { + "import.meta.server": true, + }, + resolve: { + alias: { + "#build/dxup/layouts.mjs": join(import.meta.dirname, "test/named-layout-slots/unit/stubs/layouts.ts"), + }, + }, + }, + await defineVitestProject({ + test: { + name: "named-layout-slots-e2e", + include: ["test/named-layout-slots/e2e/*.test.ts"], + environment: "nuxt", + environmentOptions: { + nuxt: { + rootDir: join(import.meta.dirname, "test/named-layout-slots/e2e/fixture"), + domEnvironment: "happy-dom", + }, + }, + }, + }), ], }, });