diff --git a/.github/copilot-instructions.md b/.github/copilot-instructions.md new file mode 100644 index 0000000000..81e31ded12 --- /dev/null +++ b/.github/copilot-instructions.md @@ -0,0 +1,14 @@ +# Core Requirements + +- The end goal is stability, speed and great user experience. + +## Code Quality Requirements + +- Follow standard TypeScript conventions and best practices +- Use the Composition API when creating Vue components +- Use clear, descriptive variable and function names +- Add comments to explain complex logic or non-obvious implementations +- Write unit tests for core functionality using `vitest` +- Write end-to-end tests using Playwright and `@nuxt/test-utils` +- Keep functions focused and manageable (generally under 50 lines) +- Use error handling patterns consistently diff --git a/docs/1.getting-started/6.data-fetching.md b/docs/1.getting-started/6.data-fetching.md index c82f5ca2f8..36fc5102ac 100644 --- a/docs/1.getting-started/6.data-fetching.md +++ b/docs/1.getting-started/6.data-fetching.md @@ -90,22 +90,35 @@ Read more about `$fetch`. ### Pass Client Headers to the API -During server-side-rendering, since the `$fetch` request takes place 'internally' within the server, it won't include the user's browser cookies. +When calling `useFetch` on the server, Nuxt will use [`useRequestFetch`](/docs/api/composables/use-request-fetch) to proxy client headers and cookies (with the exception of headers not meant to be forwarded, like `host`). -We can use [`useRequestHeaders`](/docs/api/composables/use-request-headers) to access and proxy cookies to the API from server-side. +```vue + +``` -The example below adds the request headers to an isomorphic `$fetch` call to ensure that the API endpoint has access to the same `cookie` header originally sent by the user. +```ts +// /api/echo.ts +export default defineEventHandler(event => parseCookies(event)) +``` + +Alternatively, the example below shows how to use [`useRequestHeaders`](/docs/api/composables/use-request-headers) to access and send cookies to the API from a server-side request (originating on the client). Using an isomorphic `$fetch` call, we ensure that the API endpoint has access to the same `cookie` header originally sent by the user's browser. This is only necessary if you aren't using `useFetch`. ```vue ``` +::tip +You can also use [`useRequestFetch`](/docs/api/composables/use-request-fetch) to proxy headers to the call automatically. +:: + ::caution Be very careful before proxying headers to an external API and just include headers that you need. Not all headers are safe to be bypassed and might introduce unwanted behavior. Here is a list of common headers that are NOT to be proxied: @@ -115,10 +128,6 @@ Be very careful before proxying headers to an external API and just include head - `cf-connecting-ip`, `cf-ray` :: -::tip -You can also use [`useRequestFetch`](/docs/api/composables/use-request-fetch) to proxy headers to the call automatically. -:: - ## `useFetch` The [`useFetch`](/docs/api/composables/use-fetch) composable uses `$fetch` under-the-hood to make SSR-safe network calls in the setup function. diff --git a/docs/1.getting-started/9.layers.md b/docs/1.getting-started/9.layers.md index 4fade99fe4..6365b16ad5 100644 --- a/docs/1.getting-started/9.layers.md +++ b/docs/1.getting-started/9.layers.md @@ -18,10 +18,16 @@ One of the core features of Nuxt is the layers and extending support. You can ex ## Usage -By default, any layers within your project in the `~/layers` directory will be automatically registered as layers in your project +By default, any layers within your project in the `~~/layers` directory will be automatically registered as layers in your project. ::note -Layer auto-registration was introduced in Nuxt v3.12.0 +Layer auto-registration was introduced in Nuxt v3.12.0. +:: + +In addition, named layer aliases to the `srcDir` of each of these layers will automatically be created. For example, you will be able to access the `~~/layers/test` layer via `#layers/test`. + +::note +Named layer aliases were introduced in Nuxt v3.16.0. :: In addition, you can extend from a layer by adding the [extends](/docs/api/nuxt-config#extends) property to your [`nuxt.config`](/docs/guide/directory-structure/nuxt-config) file. diff --git a/docs/2.guide/3.going-further/1.experimental-features.md b/docs/2.guide/3.going-further/1.experimental-features.md index 9a4b729e9f..1e67ba29b1 100644 --- a/docs/2.guide/3.going-further/1.experimental-features.md +++ b/docs/2.guide/3.going-further/1.experimental-features.md @@ -472,3 +472,41 @@ Alternatively, you can render the template alongside the Nuxt app root by settin ``` This avoids a white flash when hydrating a client-only page. + +## decorators + +This option enables enabling decorator syntax across your entire Nuxt/Nitro app, powered by [esbuild](https://github.com/evanw/esbuild/releases/tag/v0.21.3). + +For a long time, TypeScript has had support for decorators via `compilerOptions.experimentalDecorators`. This implementation predated the TC39 standardization process. Now, decorators are a [Stage 3 Proposal](https://github.com/tc39/proposal-decorators), and supported without special configuration in TS 5.0+ (see https://github.com/microsoft/TypeScript/pull/52582 and https://devblogs.microsoft.com/typescript/announcing-typescript-5-0-beta/#decorators). + +Enabling `experimental.decorators` enables support for the TC39 proposal, **NOT** for TypeScript's previous `compilerOptions.experimentalDecorators` implementation. + +::warning +Note that there may be changes before this finally lands in the JS standard. +:: + +### Usage + +```ts twoslash [nuxt.config.ts] +export default defineNuxtConfig({ + experimental: { + decorators: true, + }, +}) +``` + +```ts [app.vue] +function something (_method: () => unknown) { + return () => 'decorated' +} + +class SomeClass { + @something + public someMethod () { + return 'initial' + } +} + +const value = new SomeClass().someMethod() +// this will return 'decorated' +``` diff --git a/docs/2.guide/3.going-further/7.layers.md b/docs/2.guide/3.going-further/7.layers.md index f22e64a2ec..36a3211382 100644 --- a/docs/2.guide/3.going-further/7.layers.md +++ b/docs/2.guide/3.going-further/7.layers.md @@ -164,9 +164,25 @@ When publishing the layer as a private npm package, you need to make sure you lo ## Tips +### Named Layer Aliases + +Auto-scanned layers (from your `~~/layers` directory) automatically create aliases. For example, you can access your `~~/layers/test` layer via `#layers/test`. + +If you want to create named layer aliases for other layers, you can specify a name in the configuration of the layer. + +```ts [nuxt.config.ts] +export default defineNuxtConfig({ + $meta: { + name: 'example', + }, +}) +``` + +This will produce an alias of `#layers/example` which points to your layer. + ### Relative Paths and Aliases -When importing using aliases (such as `~/` and `@/`) in a layer components and composables, note that aliases are resolved relative to the user's project paths. As a workaround, you can **use relative paths** to import them. We are working on a better solution for named layer aliases. +When importing using global aliases (such as `~/` and `@/`) in a layer components and composables, note that these aliases are resolved relative to the user's project paths. As a workaround, you can **use relative paths** to import them, or use named layer aliases. Also when using relative paths in `nuxt.config` file of a layer, (with exception of nested `extends`) they are resolved relative to user's project instead of the layer. As a workaround, use full resolved paths in `nuxt.config`: diff --git a/package.json b/package.json index 85eada0bf1..0b01e0f3ee 100644 --- a/package.json +++ b/package.json @@ -11,7 +11,7 @@ "build": "pnpm --filter './packages/**' prepack", "build:stub": "pnpm dev:prepare", "dev": "pnpm play", - "dev:prepare": "pnpm --filter './packages/**' prepack --stub && pnpm --filter './packages/ui-templates' build", + "dev:prepare": "pnpm --filter './packages/**' prepack --stub && pnpm --filter './packages/ui-templates' build && nuxi prepare", "debug:prepare": "TIMINGS_DEBUG=true pnpm dev:prepare", "debug:build": "TIMINGS_DEBUG=true pnpm build", "debug:dev": "rm -rf **/node_modules/.cache/jiti && pnpm nuxi dev", @@ -52,21 +52,21 @@ "@vue/compiler-core": "3.5.13", "@vue/compiler-dom": "3.5.13", "@vue/shared": "3.5.13", - "c12": "2.0.1", + "c12": "2.0.2", "h3": "npm:h3-nightly@1.14.0-20250122-114730-3f9e703", "jiti": "2.4.2", "magic-string": "^0.30.17", "nitro": "npm:nitro-nightly@3.0.0-beta-28969273.f7aa9de6", "nuxt": "workspace:*", "ohash": "1.1.4", - "postcss": "8.5.1", + "postcss": "8.5.2", "rollup": "4.34.6", "send": ">=1.1.0", "typescript": "5.7.3", "ufo": "1.5.4", "unbuild": "3.3.1", "unhead": "2.0.0-alpha.9", - "unimport": "4.1.0", + "unimport": "4.1.1", "vite": "6.1.0", "vue": "3.5.13" }, @@ -98,16 +98,16 @@ "cssnano": "7.0.6", "destr": "2.0.3", "devalue": "5.1.1", - "eslint": "9.20.0", + "eslint": "9.20.1", "eslint-plugin-no-only-tests": "3.3.0", "eslint-plugin-perfectionist": "4.8.0", "eslint-typegen": "1.0.0", "estree-walker": "3.0.3", "h3": "npm:h3-nightly@1.14.0-20250122-114730-3f9e703", - "happy-dom": "17.0.2", + "happy-dom": "17.0.4", "installed-check": "9.3.0", "jiti": "2.4.2", - "knip": "5.43.6", + "knip": "5.44.0", "magic-string": "0.30.17", "markdownlint-cli": "0.44.0", "memfs": "4.17.0", @@ -134,6 +134,6 @@ "vue-tsc": "2.2.0", "webpack": "5.97.1" }, - "packageManager": "pnpm@10.2.1", + "packageManager": "pnpm@10.3.0", "version": "" } diff --git a/packages/kit/package.json b/packages/kit/package.json index 79b886e4db..36cbcb2058 100644 --- a/packages/kit/package.json +++ b/packages/kit/package.json @@ -27,7 +27,7 @@ "test:attw": "attw --pack" }, "dependencies": { - "c12": "^2.0.1", + "c12": "^2.0.2", "consola": "^3.4.0", "defu": "^6.1.4", "destr": "^2.0.3", @@ -45,12 +45,12 @@ "std-env": "^3.8.0", "ufo": "^1.5.4", "unctx": "^2.4.1", - "unimport": "^4.1.0", + "unimport": "^4.1.1", "untyped": "^1.5.2" }, "devDependencies": { "@nuxt/schema": "workspace:*", - "@rspack/core": "1.2.2", + "@rspack/core": "1.2.3", "@types/semver": "7.5.8", "nitro": "npm:nitro-nightly@3.0.0-beta-28969273.f7aa9de6", "unbuild": "3.3.1", @@ -59,6 +59,6 @@ "webpack": "5.97.1" }, "engines": { - "node": ">=18.20.6" + "node": ">=18.12.0" } } diff --git a/packages/kit/src/context.ts b/packages/kit/src/context.ts index d132b81c6c..6293bfe9fc 100644 --- a/packages/kit/src/context.ts +++ b/packages/kit/src/context.ts @@ -1,9 +1,22 @@ -import { getContext } from 'unctx' +import { AsyncLocalStorage } from 'node:async_hooks' +import { createContext, getContext } from 'unctx' import type { Nuxt } from '@nuxt/schema' -/** Direct access to the Nuxt context - see https://github.com/unjs/unctx. */ +/** + * Direct access to the Nuxt global context - see https://github.com/unjs/unctx. + * @deprecated Use `getNuxtCtx` instead + */ export const nuxtCtx = getContext('nuxt') +/** async local storage for the name of the current nuxt instance */ +const asyncNuxtStorage = createContext({ + asyncContext: true, + AsyncLocalStorage, +}) + +/** Direct access to the Nuxt context with asyncLocalStorage - see https://github.com/unjs/unctx. */ +export const getNuxtCtx = () => asyncNuxtStorage.tryUse() + // TODO: Use use/tryUse from unctx. https://github.com/unjs/unctx/issues/6 /** @@ -16,7 +29,7 @@ export const nuxtCtx = getContext('nuxt') * ``` */ export function useNuxt (): Nuxt { - const instance = nuxtCtx.tryUse() + const instance = asyncNuxtStorage.tryUse() || nuxtCtx.tryUse() if (!instance) { throw new Error('Nuxt instance is unavailable!') } @@ -36,5 +49,9 @@ export function useNuxt (): Nuxt { * ``` */ export function tryUseNuxt (): Nuxt | null { - return nuxtCtx.tryUse() + return asyncNuxtStorage.tryUse() || nuxtCtx.tryUse() +} + +export function runWithNuxtContext any> (nuxt: Nuxt, fn: T) { + return asyncNuxtStorage.call(nuxt, fn) as ReturnType } diff --git a/packages/kit/src/index.ts b/packages/kit/src/index.ts index f14fd8c81d..8855c4fd96 100644 --- a/packages/kit/src/index.ts +++ b/packages/kit/src/index.ts @@ -18,7 +18,7 @@ export type { ExtendConfigOptions, ExtendViteConfigOptions, ExtendWebpackConfigO export { assertNuxtCompatibility, checkNuxtCompatibility, getNuxtVersion, hasNuxtCompatibility, isNuxtMajorVersion, normalizeSemanticVersion, isNuxt2, isNuxt3 } from './compatibility' export { addComponent, addComponentsDir } from './components' export type { AddComponentOptions } from './components' -export { nuxtCtx, tryUseNuxt, useNuxt } from './context' +export { getNuxtCtx, runWithNuxtContext, tryUseNuxt, useNuxt, nuxtCtx } from './context' export { createIsIgnored, isIgnored, resolveIgnorePatterns } from './ignore' export { addLayout } from './layout' export { addRouteMiddleware, extendPages, extendRouteRules } from './pages' diff --git a/packages/kit/src/loader/config.ts b/packages/kit/src/loader/config.ts index f8d892bb3d..5fd9a1dfe4 100644 --- a/packages/kit/src/loader/config.ts +++ b/packages/kit/src/loader/config.ts @@ -7,7 +7,7 @@ import { loadConfig } from 'c12' import type { NuxtConfig, NuxtOptions } from '@nuxt/schema' import { globby } from 'globby' import defu from 'defu' -import { join } from 'pathe' +import { basename, join, relative } from 'pathe' import { isWindows } from 'std-env' import { tryResolveModule } from '../internal/esm' @@ -18,14 +18,11 @@ export interface LoadNuxtConfigOptions extends Omit { // Automatically detect and import layers from `~~/layers/` directory - opts.overrides = defu(opts.overrides, { - _extends: await globby('layers/*', { - onlyDirectories: true, - cwd: opts.cwd || process.cwd(), - }), - }); + const localLayers = await globby('layers/*', { onlyDirectories: true, cwd: opts.cwd || process.cwd() }) + opts.overrides = defu(opts.overrides, { _extends: localLayers }); + (globalThis as any).defineNuxtConfig = (c: any) => c - const result = await loadConfig({ + const { configFile, layers = [], cwd, config: nuxtConfig, meta } = await loadConfig({ name: 'nuxt', configFile: 'nuxt.config', rcFile: '.nuxtrc', @@ -35,13 +32,17 @@ export async function loadNuxtConfig (opts: LoadNuxtConfigOptions): Promise { const rootDir = pathToFileURL(nuxt.options.rootDir).href const { build } = await tryImportModule('nuxt-nightly', { paths: rootDir }) || await importModule('nuxt', { paths: rootDir }) - return build(nuxt) + return runWithNuxtContext(nuxt, () => build(nuxt)) } diff --git a/packages/kit/src/resolve.test.ts b/packages/kit/src/resolve.test.ts index bcdb95486e..940c93f00c 100644 --- a/packages/kit/src/resolve.test.ts +++ b/packages/kit/src/resolve.test.ts @@ -20,7 +20,7 @@ const nuxt = await loadNuxt({ describe('resolvePath', () => { it('should resolve paths correctly', async () => { - expect(await resolvePath('.nuxt/app.config')).toBe(resolve(nuxt.options.buildDir, 'app.config')) + expect(await resolvePath('.nuxt/app.config')).toBe(resolve('.nuxt/app.config.mjs')) }) }) diff --git a/packages/kit/src/template.ts b/packages/kit/src/template.ts index 9bb78f0f28..fe9fcec825 100644 --- a/packages/kit/src/template.ts +++ b/packages/kit/src/template.ts @@ -180,6 +180,8 @@ export async function _generateTypes (nuxt: Nuxt) { .then(r => r?.version && gte(r.version, '5.4.0')) .catch(() => isV4) + const useDecorators = Boolean(nuxt.options.experimental?.decorators) + // https://www.totaltypescript.com/tsconfig-cheat-sheet const tsConfig: TSConfig = defu(nuxt.options.typescript?.tsConfig, { compilerOptions: { @@ -197,12 +199,20 @@ export async function _generateTypes (nuxt: Nuxt) { noUncheckedIndexedAccess: isV4, forceConsistentCasingInFileNames: true, noImplicitOverride: true, + /* Decorator support */ + ...useDecorators + ? { + useDefineForClassFields: false, + experimentalDecorators: false, + } + : {}, /* If NOT transpiling with TypeScript: */ module: hasTypescriptVersionWithModulePreserve ? 'preserve' : 'ESNext', noEmit: true, /* If your code runs in the DOM: */ lib: [ 'ESNext', + ...useDecorators ? ['esnext.decorators'] : [], 'dom', 'dom.iterable', 'webworker', diff --git a/packages/kit/test/layer-fixture/layers/test/assets/foo.js b/packages/kit/test/layer-fixture/layers/test/assets/foo.js new file mode 100644 index 0000000000..21ec276fc7 --- /dev/null +++ b/packages/kit/test/layer-fixture/layers/test/assets/foo.js @@ -0,0 +1 @@ +export const foo = 'bar' diff --git a/packages/kit/test/layer-fixture/layers/test/nuxt.config.ts b/packages/kit/test/layer-fixture/layers/test/nuxt.config.ts new file mode 100644 index 0000000000..268da7f8c1 --- /dev/null +++ b/packages/kit/test/layer-fixture/layers/test/nuxt.config.ts @@ -0,0 +1 @@ +export default defineNuxtConfig({}) diff --git a/packages/kit/test/layer-fixture/nuxt.config.ts b/packages/kit/test/layer-fixture/nuxt.config.ts new file mode 100644 index 0000000000..3c1876f2b7 --- /dev/null +++ b/packages/kit/test/layer-fixture/nuxt.config.ts @@ -0,0 +1,5 @@ +export default defineNuxtConfig({ + $meta: { + name: 'layer-fixture', + }, +}) diff --git a/packages/kit/test/load-nuxt-config.spec.ts b/packages/kit/test/load-nuxt-config.spec.ts new file mode 100644 index 0000000000..942b7cf5a9 --- /dev/null +++ b/packages/kit/test/load-nuxt-config.spec.ts @@ -0,0 +1,28 @@ +import { fileURLToPath } from 'node:url' +import { describe, expect, it } from 'vitest' +import { loadNuxtConfig } from '@nuxt/kit' + +describe('loadNuxtConfig', () => { + it('should add named aliases for local layers', async () => { + const cwd = fileURLToPath(new URL('./layer-fixture', import.meta.url)) + const config = await loadNuxtConfig({ cwd }) + for (const alias in config.alias) { + config.alias[alias] = config.alias[alias]!.replace(cwd, '') + } + expect(config.alias).toMatchInlineSnapshot(` + { + "#build": "/.nuxt", + "#internal/nuxt/paths": "/.nuxt/paths.mjs", + "#layers/layer-fixture": "", + "#layers/test": "/layers/test", + "#shared": "/shared", + "@": "", + "@@": "", + "assets": "/assets", + "public": "/public", + "~": "", + "~~": "", + } + `) + }) +}) diff --git a/packages/nuxt/package.json b/packages/nuxt/package.json index abd43d6bde..40e036d43d 100644 --- a/packages/nuxt/package.json +++ b/packages/nuxt/package.json @@ -69,12 +69,12 @@ "@nuxt/devtools": "^2.0.0", "@nuxt/kit": "workspace:*", "@nuxt/schema": "workspace:*", - "@nuxt/telemetry": "^2.6.4", + "@nuxt/telemetry": "^2.6.5", "@nuxt/vite-builder": "workspace:*", "@unhead/vue": "^2.0.0-alpha.8", "@vue/shared": "^3.5.13", "acorn": "8.14.0", - "c12": "^2.0.1", + "c12": "^2.0.2", "chokidar": "^4.0.3", "compatx": "^0.1.8", "consola": "^3.4.0", @@ -116,8 +116,8 @@ "uncrypto": "^0.1.3", "unctx": "^2.4.1", "unenv": "^1.10.0", - "unimport": "^4.1.0", - "unplugin": "^2.1.2", + "unimport": "^4.1.1", + "unplugin": "^2.2.0", "unplugin-vue-router": "^0.11.2", "unstorage": "^1.14.4", "untyped": "^1.5.2", @@ -149,6 +149,6 @@ } }, "engines": { - "node": "^18.20.6 || ^20.9.0 || >=22.0.0" + "node": "^18.12.0 || ^20.9.0 || >=22.0.0" } } diff --git a/packages/nuxt/src/app/config.ts b/packages/nuxt/src/app/config.ts index 476f828abf..4a677359cd 100644 --- a/packages/nuxt/src/app/config.ts +++ b/packages/nuxt/src/app/config.ts @@ -54,6 +54,13 @@ export function useAppConfig (): AppConfig { return nuxtApp._appConfig } +export function _replaceAppConfig (newConfig: AppConfig) { + const appConfig = useAppConfig() + + deepAssign(appConfig, newConfig) + deepDelete(appConfig, newConfig) +} + /** * Deep assign the current appConfig with the new one. * diff --git a/packages/nuxt/src/core/nuxt.ts b/packages/nuxt/src/core/nuxt.ts index 7014ba7d61..5a41dd3720 100644 --- a/packages/nuxt/src/core/nuxt.ts +++ b/packages/nuxt/src/core/nuxt.ts @@ -1,11 +1,12 @@ import { existsSync } from 'node:fs' import { rm } from 'node:fs/promises' +import { randomUUID } from 'node:crypto' import { AsyncLocalStorage } from 'node:async_hooks' import { join, normalize, relative, resolve } from 'pathe' import { createDebugger, createHooks } from 'hookable' import ignore from 'ignore' import type { LoadNuxtOptions } from '@nuxt/kit' -import { addBuildPlugin, addComponent, addPlugin, addPluginTemplate, addRouteMiddleware, addServerPlugin, addTypeTemplate, addVitePlugin, addWebpackPlugin, installModule, loadNuxtConfig, nuxtCtx, resolveAlias, resolveFiles, resolveIgnorePatterns, resolvePath, tryResolveModule, useNitro } from '@nuxt/kit' +import { addBuildPlugin, addComponent, addPlugin, addPluginTemplate, addRouteMiddleware, addServerPlugin, addTypeTemplate, addVitePlugin, addWebpackPlugin, installModule, loadNuxtConfig, nuxtCtx, resolveAlias, resolveFiles, resolveIgnorePatterns, resolvePath, runWithNuxtContext, tryResolveModule, useNitro } from '@nuxt/kit' import type { Nuxt, NuxtHooks, NuxtModule, NuxtOptions } from 'nuxt/schema' import type { PackageJson } from 'pkg-types' import { readPackageJSON } from 'pkg-types' @@ -53,17 +54,24 @@ import { VirtualFSPlugin } from './plugins/virtual' export function createNuxt (options: NuxtOptions): Nuxt { const hooks = createHooks() + const { callHook, callHookParallel, callHookWith } = hooks + hooks.callHook = (...args) => runWithNuxtContext(nuxt, () => callHook(...args)) + hooks.callHookParallel = (...args) => runWithNuxtContext(nuxt, () => callHookParallel(...args)) + hooks.callHookWith = (...args) => runWithNuxtContext(nuxt, () => callHookWith(...args)) + const nuxt: Nuxt = { + __name: randomUUID(), _version: version, _asyncLocalStorageModule: options.experimental.debugModuleMutation ? new AsyncLocalStorage() : undefined, hooks, callHook: hooks.callHook, addHooks: hooks.addHooks, hook: hooks.hook, - ready: () => initNuxt(nuxt), + ready: () => runWithNuxtContext(nuxt, () => initNuxt(nuxt)), close: () => hooks.callHook('close', nuxt), vfs: {}, apps: {}, + runWithContext: fn => runWithNuxtContext(nuxt, fn), options, } @@ -115,6 +123,14 @@ export function createNuxt (options: NuxtOptions): Nuxt { }) } + if (!nuxtCtx.tryUse()) { + // backward compatibility with 3.x + nuxtCtx.set(nuxt) + nuxt.hook('close', () => { + nuxtCtx.unset() + }) + } + hooks.hookOnce('close', () => { hooks.removeAllHooks() }) return nuxt @@ -223,11 +239,6 @@ async function initNuxt (nuxt: Nuxt) { } } }) - - // Set nuxt instance for useNuxt - nuxtCtx.set(nuxt) - nuxt.hook('close', () => nuxtCtx.unset()) - const coreTypePackages = nuxt.options.typescript.hoist || [] // Disable environment types entirely if `typescript.builder` is false @@ -454,7 +465,7 @@ async function initNuxt (nuxt: Nuxt) { ...nuxt.options._layers.filter(i => i.cwd.includes('node_modules')).map(i => i.cwd as string), ) - // Ensure we can resolve dependencies within layers - filtering out local `~/layers` directories + // Ensure we can resolve dependencies within layers - filtering out local `~~/layers` directories const locallyScannedLayersDirs = nuxt.options._layers.map(l => resolve(l.cwd, 'layers').replace(/\/?$/, '/')) nuxt.options.modulesDir.push(...nuxt.options._layers .filter(l => l.cwd !== nuxt.options.rootDir && locallyScannedLayersDirs.every(dir => !l.cwd.startsWith(dir))) @@ -861,27 +872,29 @@ export async function loadNuxt (opts: LoadNuxtOptions): Promise { const nuxt = createNuxt(options) - if (nuxt.options.dev && !nuxt.options.test) { - nuxt.hooks.hookOnce('build:done', () => { - for (const dep of keyDependencies) { - checkDependencyVersion(dep, nuxt._version) - .catch(e => logger.warn(`Problem checking \`${dep}\` version.`, e)) - } - }) - } + nuxt.runWithContext(() => { + if (nuxt.options.dev && !nuxt.options.test) { + nuxt.hooks.hookOnce('build:done', () => { + for (const dep of keyDependencies) { + checkDependencyVersion(dep, nuxt._version) + .catch(e => logger.warn(`Problem checking \`${dep}\` version.`, e)) + } + }) + } - // We register hooks layer-by-layer so any overrides need to be registered separately - if (opts.overrides?.hooks) { - nuxt.hooks.addHooks(opts.overrides.hooks) - } + // We register hooks layer-by-layer so any overrides need to be registered separately + if (opts.overrides?.hooks) { + nuxt.hooks.addHooks(opts.overrides.hooks) + } - if ( - nuxt.options.debug - && nuxt.options.debug.hooks - && (nuxt.options.debug.hooks === true || nuxt.options.debug.hooks.server) - ) { - createDebugger(nuxt.hooks, { tag: 'nuxt' }) - } + if ( + nuxt.options.debug + && nuxt.options.debug.hooks + && (nuxt.options.debug.hooks === true || nuxt.options.debug.hooks.server) + ) { + createDebugger(nuxt.hooks, { tag: 'nuxt' }) + } + }) if (opts.ready !== false) { await nuxt.ready() diff --git a/packages/nuxt/src/core/plugins/plugin-metadata.ts b/packages/nuxt/src/core/plugins/plugin-metadata.ts index 69ea8069fc..7ba5cbfb1c 100644 --- a/packages/nuxt/src/core/plugins/plugin-metadata.ts +++ b/packages/nuxt/src/core/plugins/plugin-metadata.ts @@ -1,5 +1,4 @@ import type { Literal, Property, SpreadElement } from 'estree' -import { transform } from 'esbuild' import { defu } from 'defu' import { findExports } from 'mlly' import type { Nuxt } from '@nuxt/schema' @@ -8,7 +7,7 @@ import MagicString from 'magic-string' import { normalize } from 'pathe' import type { ObjectPlugin, PluginMeta } from 'nuxt/app' -import { parseAndWalk, withLocations } from '../../core/utils/parse' +import { parseAndWalk, transform, withLocations } from '../../core/utils/parse' import { logger } from '../../utils' const internalOrderMap = { diff --git a/packages/nuxt/src/core/plugins/prehydrate.ts b/packages/nuxt/src/core/plugins/prehydrate.ts index ce3a8a6e2a..24bc2e2407 100644 --- a/packages/nuxt/src/core/plugins/prehydrate.ts +++ b/packages/nuxt/src/core/plugins/prehydrate.ts @@ -1,9 +1,8 @@ -import { transform } from 'esbuild' import { createUnplugin } from 'unplugin' import MagicString from 'magic-string' import { hash } from 'ohash' -import { parseAndWalk, withLocations } from '../../core/utils/parse' +import { parseAndWalk, transform, withLocations } from '../../core/utils/parse' import { isJS, isVue } from '../utils' export function PrehydrateTransformPlugin (options: { sourcemap?: boolean } = {}) { diff --git a/packages/nuxt/src/core/templates.ts b/packages/nuxt/src/core/templates.ts index 7a6890bf93..e6a10a2bbf 100644 --- a/packages/nuxt/src/core/templates.ts +++ b/packages/nuxt/src/core/templates.ts @@ -7,7 +7,7 @@ import escapeRE from 'escape-string-regexp' import { hash } from 'ohash' import { camelCase } from 'scule' import { filename } from 'pathe/utils' -import type { NuxtTemplate } from 'nuxt/schema' +import type { NuxtOptions, NuxtTemplate } from 'nuxt/schema' import type { Nitro } from 'nitro/types' import { annotatePlugins, checkForCircularDependencies } from './app' @@ -185,9 +185,18 @@ export const schemaTemplate: NuxtTemplate = { const relativeRoot = relative(resolve(nuxt.options.buildDir, 'types'), nuxt.options.rootDir) const getImportName = (name: string) => (name[0] === '.' ? './' + join(relativeRoot, name) : name).replace(IMPORT_NAME_RE, '') - const modules = nuxt.options._installedModules - .filter(m => m.meta && m.meta.configKey && m.meta.name && !m.meta.name.startsWith('nuxt:') && m.meta.name !== 'nuxt-config-schema') - .map(m => [genString(m.meta.configKey), getImportName(m.entryPath || m.meta.name), m] as const) + const modules: [string, string, NuxtOptions['_installedModules'][number]][] = [] + for (const m of nuxt.options._installedModules) { + // modules without sufficient metadata + if (!m.meta || !m.meta.configKey || !m.meta.name) { + continue + } + // core nuxt modules + if (m.meta.name.startsWith('nuxt:') || m.meta.name === 'nuxt-config-schema') { + continue + } + modules.push([genString(m.meta.configKey), getImportName(m.entryPath || m.meta.name), m]) + } const privateRuntimeConfig = Object.create(null) for (const key in nuxt.options.runtimeConfig) { @@ -210,7 +219,7 @@ export const schemaTemplate: NuxtTemplate = { } else if (mod.meta?.repository) { if (typeof mod.meta.repository === 'string') { link = mod.meta.repository - } else if (typeof mod.meta.repository.url === 'string') { + } else if (typeof mod.meta.repository === 'object' && 'url' in mod.meta.repository && typeof mod.meta.repository.url === 'string') { link = mod.meta.repository.url } if (link) { @@ -428,12 +437,12 @@ import { defuFn } from 'defu' const inlineConfig = ${JSON.stringify(nuxt.options.appConfig, null, 2)} /** client **/ -import { updateAppConfig } from '#app/config' +import { _replaceAppConfig } from '#app/config' // Vite - webpack is handled directly in #app/config if (import.meta.dev && !import.meta.nitro && import.meta.hot) { import.meta.hot.accept((newModule) => { - updateAppConfig(newModule.default) + _replaceAppConfig(newModule.default) }) } /** client-end **/ diff --git a/packages/nuxt/src/core/utils/parse.ts b/packages/nuxt/src/core/utils/parse.ts index fb8f82e14a..95910140e8 100644 --- a/packages/nuxt/src/core/utils/parse.ts +++ b/packages/nuxt/src/core/utils/parse.ts @@ -1,22 +1,17 @@ import { walk as _walk } from 'estree-walker' import type { Node, SyncHandler } from 'estree-walker' -import type { - ArrowFunctionExpression, - CatchClause, - Program as ESTreeProgram, - FunctionDeclaration, - FunctionExpression, - Identifier, - ImportDefaultSpecifier, - ImportNamespaceSpecifier, - ImportSpecifier, - VariableDeclaration, -} from 'estree' +import type { ArrowFunctionExpression, CatchClause, Program as ESTreeProgram, FunctionDeclaration, FunctionExpression, Identifier, ImportDefaultSpecifier, ImportNamespaceSpecifier, ImportSpecifier, VariableDeclaration } from 'estree' import { parse } from 'acorn' import type { Program } from 'acorn' +import { type SameShape, type TransformOptions, type TransformResult, transform as esbuildTransform } from 'esbuild' +import { tryUseNuxt } from '@nuxt/kit' export type { Node } +export async function transform (input: string | Uint8Array, options?: SameShape): Promise> { + return await esbuildTransform(input, { ...tryUseNuxt()?.options.esbuild.options, ...options }) +} + type WithLocations = T & { start: number, end: number } type WalkerCallback = (this: ThisParameterType, node: WithLocations, parent: WithLocations | null, ctx: { key: string | number | symbol | null | undefined, index: number | null | undefined, ast: Program | Node }) => void diff --git a/packages/nuxt/src/imports/module.ts b/packages/nuxt/src/imports/module.ts index 1d669b2eaa..5ba65ab75b 100644 --- a/packages/nuxt/src/imports/module.ts +++ b/packages/nuxt/src/imports/module.ts @@ -9,7 +9,7 @@ import escapeRE from 'escape-string-regexp' import { lookupNodeModuleSubpath, parseNodeModulePath } from 'mlly' import { isDirectory, logger } from '../utils' import { TransformPlugin } from './transform' -import { defaultPresets } from './presets' +import { appCompatPresets, defaultPresets } from './presets' export default defineNuxtModule>({ meta: { @@ -30,11 +30,16 @@ export default defineNuxtModule>({ exclude: undefined, }, virtualImports: ['#imports'], + polyfills: true, }), async setup (options, nuxt) { // TODO: fix sharing of defaults between invocations of modules const presets = JSON.parse(JSON.stringify(options.presets)) as ImportPresetWithDeprecation[] + if (nuxt.options.imports.polyfills) { + presets.push(...appCompatPresets) + } + // Allow modules extending sources await nuxt.callHook('imports:sources', presets) diff --git a/packages/nuxt/src/imports/presets.ts b/packages/nuxt/src/imports/presets.ts index a4110d13ab..4e72eeef7e 100644 --- a/packages/nuxt/src/imports/presets.ts +++ b/packages/nuxt/src/imports/presets.ts @@ -21,14 +21,6 @@ const granularAppPresets: InlinePreset[] = [ imports: ['useNuxtApp', 'tryUseNuxtApp', 'defineNuxtPlugin', 'definePayloadPlugin', 'useRuntimeConfig', 'defineAppConfig'], from: '#app/nuxt', }, - { - imports: ['requestIdleCallback', 'cancelIdleCallback'], - from: '#app/compat/idle-callback', - }, - { - imports: ['setInterval'], - from: '#app/compat/interval', - }, { imports: ['useAppConfig', 'updateAppConfig'], from: '#app/config', @@ -262,6 +254,17 @@ const vueTypesPreset = defineUnimportPreset({ ], }) +export const appCompatPresets: InlinePreset[] = [ + { + imports: ['requestIdleCallback', 'cancelIdleCallback'], + from: '#app/compat/idle-callback', + }, + { + imports: ['setInterval'], + from: '#app/compat/interval', + }, +] + export const defaultPresets: InlinePreset[] = [ ...commonPresets, ...granularAppPresets, diff --git a/packages/nuxt/src/pages/route-rules.ts b/packages/nuxt/src/pages/route-rules.ts index c9317176b2..8deb66dcdd 100644 --- a/packages/nuxt/src/pages/route-rules.ts +++ b/packages/nuxt/src/pages/route-rules.ts @@ -1,11 +1,10 @@ import { runInNewContext } from 'node:vm' -import { transform } from 'esbuild' import type { NuxtPage } from '@nuxt/schema' import type { NitroRouteConfig } from 'nitro/types' import { normalize } from 'pathe' import { getLoader } from '../core/utils' -import { parseAndWalk } from '../core/utils/parse' +import { parseAndWalk, transform } from '../core/utils/parse' import { extractScriptContent, pathToNitroGlob } from './utils' const ROUTE_RULE_RE = /\bdefineRouteRules\(/ diff --git a/packages/nuxt/src/pages/utils.ts b/packages/nuxt/src/pages/utils.ts index 4baea41fac..e131d24c3c 100644 --- a/packages/nuxt/src/pages/utils.ts +++ b/packages/nuxt/src/pages/utils.ts @@ -7,12 +7,11 @@ import { genArrayFromRaw, genDynamicImport, genImport, genSafeVariableName } fro import escapeRE from 'escape-string-regexp' import { filename } from 'pathe/utils' import { hash } from 'ohash' -import { transform } from 'esbuild' import type { Property } from 'estree' import type { NuxtPage } from 'nuxt/schema' import { klona } from 'klona' -import { parseAndWalk, withLocations } from '../core/utils/parse' +import { parseAndWalk, transform, withLocations } from '../core/utils/parse' import { getLoader, uniqueBy } from '../core/utils' import { logger, toArray } from '../utils' diff --git a/packages/nuxt/test/load-nuxt.test.ts b/packages/nuxt/test/load-nuxt.test.ts index 96fd8723cf..e17065c035 100644 --- a/packages/nuxt/test/load-nuxt.test.ts +++ b/packages/nuxt/test/load-nuxt.test.ts @@ -1,7 +1,8 @@ import { fileURLToPath } from 'node:url' -import { afterEach, describe, expect, it, vi } from 'vitest' +import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest' import { normalize } from 'pathe' import { withoutTrailingSlash } from 'ufo' +import { logger, tryUseNuxt, useNuxt } from '@nuxt/kit' import { loadNuxt } from '../src' const repoRoot = withoutTrailingSlash(normalize(fileURLToPath(new URL('../../../', import.meta.url)))) @@ -12,6 +13,7 @@ vi.stubGlobal('console', { warn: vi.fn(console.warn), }) +const loggerWarn = vi.spyOn(logger, 'warn') vi.mock('pkg-types', async (og) => { const originalPkgTypes = (await og()) return { @@ -20,6 +22,9 @@ vi.mock('pkg-types', async (og) => { } }) +beforeEach(() => { + loggerWarn.mockClear() +}) afterEach(() => { vi.clearAllMocks() }) @@ -41,4 +46,41 @@ describe('loadNuxt', () => { await nuxt.close() expect(hookRan).toBe(true) }) + it('load multiple nuxt', async () => { + await Promise.all([ + loadNuxt({ + cwd: repoRoot, + }), + loadNuxt({ + cwd: repoRoot, + }), + ]) + expect(loggerWarn).not.toHaveBeenCalled() + }) + + it('expect hooks to get the correct context outside of initNuxt', async () => { + const nuxt = await loadNuxt({ + cwd: repoRoot, + }) + + // @ts-expect-error - random hook + nuxt.hook('test', () => { + expect(useNuxt().__name).toBe(nuxt.__name) + }) + + expect(tryUseNuxt()?.__name).not.toBe(nuxt.__name) + + // second nuxt context + const second = await loadNuxt({ + cwd: repoRoot, + }) + + expect(second.__name).not.toBe(nuxt.__name) + expect(tryUseNuxt()?.__name).not.toBe(nuxt.__name) + + // @ts-expect-error - random hook + await nuxt.callHook('test') + + expect(loggerWarn).not.toHaveBeenCalled() + }) }) diff --git a/packages/rspack/package.json b/packages/rspack/package.json index e10e0f6e2c..65ec11827b 100644 --- a/packages/rspack/package.json +++ b/packages/rspack/package.json @@ -32,13 +32,13 @@ "dependencies": { "@nuxt/friendly-errors-webpack-plugin": "^2.6.0", "@nuxt/kit": "workspace:*", - "@rspack/core": "^1.2.2", + "@rspack/core": "^1.2.3", "autoprefixer": "^10.4.20", "css-loader": "^7.1.2", "css-minimizer-webpack-plugin": "^7.0.0", "cssnano": "^7.0.6", "defu": "^6.1.4", - "esbuild-loader": "^4.2.2", + "esbuild-loader": "^4.3.0", "escape-string-regexp": "^5.0.0", "file-loader": "^6.2.0", "fork-ts-checker-webpack-plugin": "^9.0.2", @@ -51,7 +51,7 @@ "ohash": "^1.1.4", "pathe": "^2.0.2", "pify": "^6.1.0", - "postcss": "^8.5.1", + "postcss": "^8.5.2", "postcss-import": "^16.1.0", "postcss-import-resolver": "^2.0.0", "postcss-loader": "^8.1.1", @@ -61,7 +61,7 @@ "time-fix-plugin": "^2.0.7", "ufo": "^1.5.4", "unenv": "^1.10.0", - "unplugin": "^2.1.2", + "unplugin": "^2.2.0", "url-loader": "^4.1.1", "vue-bundle-renderer": "^2.1.1", "vue-loader": "^17.4.2", @@ -83,6 +83,6 @@ "vue": "^3.3.4" }, "engines": { - "node": "^18.20.6 || ^20.9.0 || >=22.0.0" + "node": "^18.12.0 || ^20.9.0 || >=22.0.0" } } diff --git a/packages/schema/build.config.ts b/packages/schema/build.config.ts index c78328916c..7e920ba419 100644 --- a/packages/schema/build.config.ts +++ b/packages/schema/build.config.ts @@ -39,6 +39,7 @@ export default defineBuildConfig({ 'consola', 'css-minimizer-webpack-plugin', 'cssnano', + 'esbuild', 'esbuild-loader', 'file-loader', 'h3', diff --git a/packages/schema/package.json b/packages/schema/package.json index 0bc09e8171..917d61215a 100644 --- a/packages/schema/package.json +++ b/packages/schema/package.json @@ -37,28 +37,35 @@ }, "devDependencies": { "@types/pug": "2.0.10", + "@types/rollup-plugin-visualizer": "4.2.4", + "@types/webpack-bundle-analyzer": "4.7.0", + "@types/webpack-hot-middleware": "2.25.9", "@unhead/schema": "2.0.0-alpha.9", "@vitejs/plugin-vue": "5.2.1", "@vitejs/plugin-vue-jsx": "4.1.1", "@vue/compiler-core": "3.5.13", "@vue/compiler-sfc": "3.5.13", "@vue/language-core": "2.2.0", - "c12": "2.0.1", + "c12": "2.0.2", "chokidar": "4.0.3", "compatx": "0.1.8", - "esbuild-loader": "4.2.2", + "css-minimizer-webpack-plugin": "7.0.0", + "esbuild": "0.25.0", + "esbuild-loader": "4.3.0", "file-loader": "6.2.0", "h3": "npm:h3-nightly@1.14.0-20250122-114730-3f9e703", "hookable": "5.5.3", "ignore": "7.0.3", + "mini-css-extract-plugin": "2.9.2", "nitro": "npm:nitro-nightly@3.0.0-beta-28969273.f7aa9de6", "ofetch": "1.4.1", "pkg-types": "1.3.1", + "postcss": "8.5.2", "sass-loader": "16.0.4", "scule": "1.3.0", "unbuild": "3.3.1", "unctx": "2.4.1", - "unimport": "4.1.0", + "unimport": "4.1.1", "untyped": "1.5.2", "vite": "6.1.0", "vue": "3.5.13", diff --git a/packages/schema/src/config/adhoc.ts b/packages/schema/src/config/adhoc.ts index 1d9f6a9d40..26942cc85d 100644 --- a/packages/schema/src/config/adhoc.ts +++ b/packages/schema/src/config/adhoc.ts @@ -1,6 +1,6 @@ -import { defineUntypedSchema } from 'untyped' +import { defineResolvers } from '../utils/definition' -export default defineUntypedSchema({ +export default defineResolvers({ /** * Configure Nuxt component auto-registration. * @@ -14,10 +14,13 @@ export default defineUntypedSchema({ if (Array.isArray(val)) { return { dirs: val } } - if (val === undefined || val === true) { - return { dirs: [{ path: '~/components/global', global: true }, '~/components'] } + if (val === false) { + return { dirs: [] } + } + return { + dirs: [{ path: '~/components/global', global: true }, '~/components'], + ...typeof val === 'object' ? val : {}, } - return val }, }, diff --git a/packages/schema/src/config/app.ts b/packages/schema/src/config/app.ts index b759a2809d..15d6897813 100644 --- a/packages/schema/src/config/app.ts +++ b/packages/schema/src/config/app.ts @@ -1,9 +1,10 @@ -import { defineUntypedSchema } from 'untyped' import { defu } from 'defu' import { resolve } from 'pathe' +import { defineResolvers } from '../utils/definition' import type { AppHeadMetaObject } from '../types/head' +import type { NuxtAppConfig } from '../types/config' -export default defineUntypedSchema({ +export default defineResolvers({ /** * Vue.js config */ @@ -27,7 +28,18 @@ export default defineUntypedSchema({ * Include Vue compiler in runtime bundle. */ runtimeCompiler: { - $resolve: async (val, get) => val ?? await get('experimental.runtimeVueCompiler') ?? false, + $resolve: async (val, get) => { + if (typeof val === 'boolean') { + return val + } + // @ts-expect-error TODO: formally deprecate in v4 + const legacyProperty = await get('experimental.runtimeVueCompiler') as unknown + if (typeof legacyProperty === 'boolean') { + return legacyProperty + } + + return false + }, }, /** @@ -41,7 +53,7 @@ export default defineUntypedSchema({ * may be set in your `nuxt.config`. All other options should be set at runtime in a Nuxt plugin.. * @see [Vue app config documentation](https://vuejs.org/api/application.html#app-config) */ - config: undefined, + config: {}, }, /** @@ -68,12 +80,22 @@ export default defineUntypedSchema({ * ``` */ baseURL: { - $resolve: val => val || process.env.NUXT_APP_BASE_URL || '/', + $resolve: (val) => { + if (typeof val === 'string') { + return val + } + return process.env.NUXT_APP_BASE_URL || '/' + }, }, /** The folder name for the built site assets, relative to `baseURL` (or `cdnURL` if set). This is set at build time and should not be customized at runtime. */ buildAssetsDir: { - $resolve: val => val || process.env.NUXT_APP_BUILD_ASSETS_DIR || '/_nuxt/', + $resolve: (val) => { + if (typeof val === 'string') { + return val + } + return process.env.NUXT_APP_BUILD_ASSETS_DIR || '/_nuxt/' + }, }, /** @@ -96,7 +118,12 @@ export default defineUntypedSchema({ * ``` */ cdnURL: { - $resolve: async (val, get) => (await get('dev')) ? '' : (process.env.NUXT_APP_CDN_URL ?? val) || '', + $resolve: async (val, get) => { + if (await get('dev')) { + return '' + } + return process.env.NUXT_APP_CDN_URL || (typeof val === 'string' ? val : '') + }, }, /** @@ -132,14 +159,20 @@ export default defineUntypedSchema({ * @type {typeof import('../src/types/config').NuxtAppConfig['head']} */ head: { - $resolve: async (val: Partial | undefined, get) => { - const resolved = defu(val, await get('meta') as Partial, { + $resolve: async (_val, get) => { + // @ts-expect-error TODO: remove in Nuxt v4 + const legacyMetaValues = await get('meta') as Record + const val: Partial = _val && typeof _val === 'object' ? _val : {} + + type NormalizedMetaObject = Required> + + const resolved: NuxtAppConfig['head'] & NormalizedMetaObject = defu(val, legacyMetaValues, { meta: [], link: [], style: [], script: [], noscript: [], - } as Required>) + } satisfies NormalizedMetaObject) // provides default charset and viewport if not set if (!resolved.meta.find(m => m.charset)?.charset) { @@ -190,9 +223,13 @@ export default defineUntypedSchema({ * @type {typeof import('../src/types/config').NuxtAppConfig['viewTransition']} */ viewTransition: { - $resolve: async (val, get) => val ?? await (get('experimental') as Promise>).then( - e => e?.viewTransition, - ) ?? false, + $resolve: async (val, get) => { + if (val === 'always' || typeof val === 'boolean') { + return val + } + + return await get('experimental').then(e => e.viewTransition) ?? false + }, }, /** @@ -211,14 +248,14 @@ export default defineUntypedSchema({ * @deprecated Prefer `rootAttrs.id` instead */ rootId: { - $resolve: val => val === false ? false : (val || '__nuxt'), + $resolve: val => val === false ? false : (val && typeof val === 'string' ? val : '__nuxt'), }, /** * Customize Nuxt root element tag. */ rootTag: { - $resolve: val => val || 'div', + $resolve: val => val && typeof val === 'string' ? val : 'div', }, /** @@ -226,11 +263,12 @@ export default defineUntypedSchema({ * @type {typeof import('@unhead/schema').HtmlAttributes} */ rootAttrs: { - $resolve: async (val: undefined | null | Record, get) => { + $resolve: async (val, get) => { const rootId = await get('app.rootId') - return defu(val, { + return { id: rootId === false ? undefined : (rootId || '__nuxt'), - }) + ...typeof val === 'object' ? val : {}, + } }, }, @@ -238,7 +276,7 @@ export default defineUntypedSchema({ * Customize Nuxt Teleport element tag. */ teleportTag: { - $resolve: val => val || 'div', + $resolve: val => val && typeof val === 'string' ? val : 'div', }, /** @@ -247,7 +285,7 @@ export default defineUntypedSchema({ * @deprecated Prefer `teleportAttrs.id` instead */ teleportId: { - $resolve: val => val === false ? false : (val || 'teleports'), + $resolve: val => val === false ? false : (val && typeof val === 'string' ? val : 'teleports'), }, /** @@ -255,11 +293,12 @@ export default defineUntypedSchema({ * @type {typeof import('@unhead/schema').HtmlAttributes} */ teleportAttrs: { - $resolve: async (val: undefined | null | Record, get) => { + $resolve: async (val, get) => { const teleportId = await get('app.teleportId') - return defu(val, { + return { id: teleportId === false ? undefined : (teleportId || 'teleports'), - }) + ...typeof val === 'object' ? val : {}, + } }, }, @@ -267,12 +306,12 @@ export default defineUntypedSchema({ * Customize Nuxt SpaLoader element tag. */ spaLoaderTag: { - $resolve: val => val || 'div', + $resolve: val => val && typeof val === 'string' ? val : 'div', }, /** * Customize Nuxt Nuxt SpaLoader element attributes. - * @type {typeof import('@unhead/schema').HtmlAttributes} + * @type {Partial} */ spaLoaderAttrs: { id: '__nuxt-loader', @@ -332,10 +371,18 @@ export default defineUntypedSchema({ * } * * ``` - * @type {string | boolean} + * @type {string | boolean | undefined | null} */ spaLoadingTemplate: { - $resolve: async (val: string | boolean | undefined, get) => typeof val === 'string' ? resolve(await get('srcDir') as string, val) : val ?? null, + $resolve: async (val, get) => { + if (typeof val === 'string') { + return resolve(await get('srcDir'), val) + } + if (typeof val === 'boolean') { + return val + } + return null + }, }, /** @@ -386,7 +433,21 @@ export default defineUntypedSchema({ * @type {string[]} */ css: { - $resolve: (val: string[] | undefined) => (val ?? []).map((c: any) => c.src || c), + $resolve: (val) => { + if (!Array.isArray(val)) { + return [] + } + const css: string[] = [] + for (const item of val) { + if (typeof item === 'string') { + css.push(item) + } else if (item && 'src' in item) { + // TODO: remove in Nuxt v4 + css.push(item.src) + } + } + return css + }, }, /** @@ -410,12 +471,13 @@ export default defineUntypedSchema({ * @type {typeof import('@unhead/schema').RenderSSRHeadOptions} */ renderSSRHeadOptions: { - $resolve: async (val: Record | undefined, get) => { - const isV4 = ((await get('future') as Record).compatibilityVersion === 4) + $resolve: async (val, get) => { + const isV4 = (await get('future')).compatibilityVersion === 4 - return defu(val, { + return { + ...typeof val === 'object' ? val : {}, omitLineBreaks: isV4, - }) + } }, }, }, diff --git a/packages/schema/src/config/build.ts b/packages/schema/src/config/build.ts index d5e43804c9..af7a1e1911 100644 --- a/packages/schema/src/config/build.ts +++ b/packages/schema/src/config/build.ts @@ -1,25 +1,35 @@ -import { defineUntypedSchema } from 'untyped' import { defu } from 'defu' import { join } from 'pathe' import { isTest } from 'std-env' import { consola } from 'consola' +import type { Nuxt } from 'nuxt/schema' +import { defineResolvers } from '../utils/definition' -export default defineUntypedSchema({ +export default defineResolvers({ /** * The builder to use for bundling the Vue part of your application. * @type {'vite' | 'webpack' | 'rspack' | { bundle: (nuxt: typeof import('../src/types/nuxt').Nuxt) => Promise }} */ builder: { - $resolve: async (val: 'vite' | 'webpack' | 'rspack' | { bundle: (nuxt: unknown) => Promise } | undefined = 'vite', get) => { - if (typeof val === 'object') { - return val + $resolve: async (val, get) => { + if (val && typeof val === 'object' && 'bundle' in val) { + return val as { bundle: (nuxt: Nuxt) => Promise } } - const map: Record = { + const map = { rspack: '@nuxt/rspack-builder', vite: '@nuxt/vite-builder', webpack: '@nuxt/webpack-builder', } - return map[val] || val || (await get('vite') === false ? map.webpack : map.vite) + type Builder = 'vite' | 'webpack' | 'rspack' + if (typeof val === 'string' && val in map) { + // TODO: improve normalisation inference + return map[val as keyof typeof map] as Builder + } + // @ts-expect-error TODO: remove old, unsupported config in v4 + if (await get('vite') === false) { + return map.webpack as Builder + } + return map.vite as Builder }, }, @@ -37,14 +47,15 @@ export default defineUntypedSchema({ * @type {boolean | { server?: boolean | 'hidden', client?: boolean | 'hidden' }} */ sourcemap: { - $resolve: async (val: boolean | { server?: boolean | 'hidden', client?: boolean | 'hidden' } | undefined, get) => { + $resolve: async (val, get) => { if (typeof val === 'boolean') { return { server: val, client: val } } - return defu(val, { + return { server: true, client: await get('dev'), - }) + ...typeof val === 'object' ? val : {}, + } }, }, @@ -56,11 +67,11 @@ export default defineUntypedSchema({ * @type {'silent' | 'info' | 'verbose'} */ logLevel: { - $resolve: (val: string | undefined) => { - if (val && !['silent', 'info', 'verbose'].includes(val)) { + $resolve: (val) => { + if (val && typeof val === 'string' && !['silent', 'info', 'verbose'].includes(val)) { consola.warn(`Invalid \`logLevel\` option: \`${val}\`. Must be one of: \`silent\`, \`info\`, \`verbose\`.`) } - return val ?? (isTest ? 'silent' : 'info') + return val && typeof val === 'string' ? val as 'silent' | 'info' | 'verbose' : (isTest ? 'silent' : 'info') }, }, @@ -81,7 +92,20 @@ export default defineUntypedSchema({ * @type {Array string | RegExp | false)>} */ transpile: { - $resolve: (val: Array string | RegExp | false)> | undefined) => (val || []).filter(Boolean), + $resolve: (val) => { + const transpile: Array string | RegExp | false)> = [] + if (Array.isArray(val)) { + for (const pattern of val) { + if (!pattern) { + continue + } + if (typeof pattern === 'string' || typeof pattern === 'function' || pattern instanceof RegExp) { + transpile.push(pattern) + } + } + } + return transpile + }, }, /** @@ -110,16 +134,17 @@ export default defineUntypedSchema({ * analyzerMode: 'static' * } * ``` - * @type {boolean | { enabled?: boolean } & ((0 extends 1 & typeof import('webpack-bundle-analyzer').BundleAnalyzerPlugin.Options ? {} : typeof import('webpack-bundle-analyzer').BundleAnalyzerPlugin.Options) | typeof import('rollup-plugin-visualizer').PluginVisualizerOptions)} + * @type {boolean | { enabled?: boolean } & ((0 extends 1 & typeof import('webpack-bundle-analyzer').BundleAnalyzerPlugin.Options ? Record : typeof import('webpack-bundle-analyzer').BundleAnalyzerPlugin.Options) | typeof import('rollup-plugin-visualizer').PluginVisualizerOptions)} */ analyze: { - $resolve: async (val: boolean | { enabled?: boolean } | Record, get) => { - const [rootDir, analyzeDir] = await Promise.all([get('rootDir'), get('analyzeDir')]) as [string, string] - return defu(typeof val === 'boolean' ? { enabled: val } : val, { + $resolve: async (val, get) => { + const [rootDir, analyzeDir] = await Promise.all([get('rootDir'), get('analyzeDir')]) + return { template: 'treemap', projectRoot: rootDir, filename: join(analyzeDir, '{name}.html'), - }) + ...typeof val === 'boolean' ? { enabled: val } : typeof val === 'object' ? val : {}, + } }, }, }, @@ -139,7 +164,7 @@ export default defineUntypedSchema({ * @type {Array<{ name: string, source?: string | RegExp, argumentLength: number }>} */ keyedComposables: { - $resolve: (val: Array<{ name: string, argumentLength: string }> | undefined) => [ + $resolve: val => [ { name: 'callOnce', argumentLength: 3 }, { name: 'defineNuxtComponent', argumentLength: 2 }, { name: 'useState', argumentLength: 2 }, @@ -147,7 +172,7 @@ export default defineUntypedSchema({ { name: 'useAsyncData', argumentLength: 3 }, { name: 'useLazyAsyncData', argumentLength: 3 }, { name: 'useLazyFetch', argumentLength: 3 }, - ...val || [], + ...Array.isArray(val) ? val : [], ].filter(Boolean), }, diff --git a/packages/schema/src/config/common.ts b/packages/schema/src/config/common.ts index 5ffcf0eb60..c53a1ef0fc 100644 --- a/packages/schema/src/config/common.ts +++ b/packages/schema/src/config/common.ts @@ -1,16 +1,16 @@ import { existsSync } from 'node:fs' import { readdir } from 'node:fs/promises' import { randomUUID } from 'node:crypto' -import { defineUntypedSchema } from 'untyped' import { basename, join, relative, resolve } from 'pathe' import { isDebug, isDevelopment, isTest } from 'std-env' import { defu } from 'defu' import { findWorkspaceDir } from 'pkg-types' -import type { RuntimeConfig } from '../types/config' import type { NuxtDebugOptions } from '../types/debug' +import type { NuxtModule } from '../types/module' +import { defineResolvers } from '../utils/definition' -export default defineUntypedSchema({ +export default defineResolvers({ /** * Extend project from multiple local or remote sources. * @@ -21,7 +21,7 @@ export default defineUntypedSchema({ * @see [`giget` documentation](https://github.com/unjs/giget) * @type {string | [string, typeof import('c12').SourceOptions?] | (string | [string, typeof import('c12').SourceOptions?])[]} */ - extends: null, + extends: undefined, /** * Specify a compatibility date for your app. @@ -43,7 +43,7 @@ export default defineUntypedSchema({ * You can use `github:`, `gitlab:`, `bitbucket:` or `https://` to extend from a remote git repository. * @type {string} */ - theme: null, + theme: undefined, /** * Define the root directory of your application. @@ -67,9 +67,9 @@ export default defineUntypedSchema({ * It is normally not needed to configure this option. */ workspaceDir: { - $resolve: async (val: string | undefined, get): Promise => { - const rootDir = await get('rootDir') as string - return val ? resolve(rootDir, val) : await findWorkspaceDir(rootDir).catch(() => rootDir) + $resolve: async (val, get) => { + const rootDir = await get('rootDir') + return val && typeof val === 'string' ? resolve(rootDir, val) : await findWorkspaceDir(rootDir).catch(() => rootDir) }, }, @@ -105,14 +105,14 @@ export default defineUntypedSchema({ * ``` */ srcDir: { - $resolve: async (val: string | undefined, get): Promise => { - if (val) { - return resolve(await get('rootDir') as string, val) + $resolve: async (val, get) => { + if (val && typeof val === 'string') { + return resolve(await get('rootDir'), val) } const [rootDir, isV4] = await Promise.all([ - get('rootDir') as Promise, - (get('future') as Promise>).then(r => r.compatibilityVersion === 4), + get('rootDir'), + get('future').then(r => r.compatibilityVersion === 4), ]) if (!isV4) { @@ -138,7 +138,7 @@ export default defineUntypedSchema({ } } const keys = ['assets', 'layouts', 'middleware', 'pages', 'plugins'] as const - const dirs = await Promise.all(keys.map(key => get(`dir.${key}`) as Promise)) + const dirs = await Promise.all(keys.map(key => get(`dir.${key}`))) for (const dir of dirs) { if (existsSync(resolve(rootDir, dir))) { return rootDir @@ -157,13 +157,13 @@ export default defineUntypedSchema({ * */ serverDir: { - $resolve: async (val: string | undefined, get): Promise => { - if (val) { - const rootDir = await get('rootDir') as string + $resolve: async (val, get) => { + if (val && typeof val === 'string') { + const rootDir = await get('rootDir') return resolve(rootDir, val) } - const isV4 = (await get('future') as Record).compatibilityVersion === 4 - return join(isV4 ? await get('rootDir') as string : await get('srcDir') as string, 'server') + const isV4 = (await get('future')).compatibilityVersion === 4 + return join(isV4 ? await get('rootDir') : await get('srcDir'), 'server') }, }, @@ -180,9 +180,9 @@ export default defineUntypedSchema({ * ``` */ buildDir: { - $resolve: async (val: string | undefined, get) => { - const rootDir = await get('rootDir') as string - return resolve(rootDir, val ?? '.nuxt') + $resolve: async (val, get) => { + const rootDir = await get('rootDir') + return resolve(rootDir, val && typeof val === 'string' ? val : '.nuxt') }, }, @@ -192,14 +192,14 @@ export default defineUntypedSchema({ * Defaults to `nuxt-app`. */ appId: { - $resolve: (val: string) => val ?? 'nuxt-app', + $resolve: val => val && typeof val === 'string' ? val : 'nuxt-app', }, /** * A unique identifier matching the build. This may contain the hash of the current state of the project. */ buildId: { - $resolve: async (val: string | undefined, get): Promise => { + $resolve: async (val, get): Promise => { if (typeof val === 'string') { return val } const [isDev, isTest] = await Promise.all([get('dev') as Promise, get('test') as Promise]) @@ -223,12 +223,17 @@ export default defineUntypedSchema({ */ modulesDir: { $default: ['node_modules'], - $resolve: async (val: string[] | undefined, get): Promise => { - const rootDir = await get('rootDir') as string - return [...new Set([ - ...(val || []).map((dir: string) => resolve(rootDir, dir)), - resolve(rootDir, 'node_modules'), - ])] + $resolve: async (val, get) => { + const rootDir = await get('rootDir') + const modulesDir = new Set([resolve(rootDir, 'node_modules')]) + if (Array.isArray(val)) { + for (const dir of val) { + if (dir && typeof dir === 'string') { + modulesDir.add(resolve(rootDir, dir)) + } + } + } + return [...modulesDir] }, }, @@ -238,9 +243,9 @@ export default defineUntypedSchema({ * If a relative path is specified, it will be relative to your `rootDir`. */ analyzeDir: { - $resolve: async (val: string | undefined, get): Promise => val - ? resolve(await get('rootDir') as string, val) - : resolve(await get('buildDir') as string, 'analyze'), + $resolve: async (val, get) => val && typeof val === 'string' + ? resolve(await get('rootDir'), val) + : resolve(await get('buildDir'), 'analyze'), }, /** @@ -249,14 +254,14 @@ export default defineUntypedSchema({ * Normally, you should not need to set this. */ dev: { - $resolve: val => val ?? Boolean(isDevelopment), + $resolve: val => typeof val === 'boolean' ? val : Boolean(isDevelopment), }, /** * Whether your app is being unit tested. */ test: { - $resolve: val => val ?? Boolean(isTest), + $resolve: val => typeof val === 'boolean' ? val : Boolean(isTest), }, /** @@ -270,11 +275,8 @@ export default defineUntypedSchema({ * @type {boolean | (typeof import('../src/types/debug').NuxtDebugOptions) | undefined} */ debug: { - $resolve: (val: boolean | NuxtDebugOptions | undefined) => { + $resolve: (val) => { val ??= isDebug - if (val === false) { - return val - } if (val === true) { return { templates: true, @@ -289,7 +291,10 @@ export default defineUntypedSchema({ hydration: true, } satisfies Required } - return val + if (val && typeof val === 'object') { + return val + } + return false }, }, @@ -298,7 +303,7 @@ export default defineUntypedSchema({ * If set to `false` generated pages will have no content. */ ssr: { - $resolve: val => val ?? true, + $resolve: val => typeof val === 'boolean' ? val : true, }, /** @@ -327,7 +332,20 @@ export default defineUntypedSchema({ * @type {(typeof import('../src/types/module').NuxtModule | string | [typeof import('../src/types/module').NuxtModule | string, Record] | undefined | null | false)[]} */ modules: { - $resolve: (val: string[] | undefined): string[] => (val || []).filter(Boolean), + $resolve: (val) => { + const modules: Array]> = [] + if (Array.isArray(val)) { + for (const mod of val) { + if (!mod) { + continue + } + if (typeof mod === 'string' || typeof mod === 'function' || (Array.isArray(mod) && mod[0])) { + modules.push(mod) + } + } + } + return modules + }, }, /** @@ -337,13 +355,13 @@ export default defineUntypedSchema({ */ dir: { app: { - $resolve: async (val: string | undefined, get) => { - const isV4 = (await get('future') as Record).compatibilityVersion === 4 + $resolve: async (val, get) => { + const isV4 = (await get('future')).compatibilityVersion === 4 if (isV4) { - const [srcDir, rootDir] = await Promise.all([get('srcDir') as Promise, get('rootDir') as Promise]) - return resolve(await get('srcDir') as string, val || (srcDir === rootDir ? 'app' : '.')) + const [srcDir, rootDir] = await Promise.all([get('srcDir'), get('rootDir')]) + return resolve(await get('srcDir'), val && typeof val === 'string' ? val : (srcDir === rootDir ? 'app' : '.')) } - return val || 'app' + return val && typeof val === 'string' ? val : 'app' }, }, /** @@ -365,12 +383,12 @@ export default defineUntypedSchema({ * The modules directory, each file in which will be auto-registered as a Nuxt module. */ modules: { - $resolve: async (val: string | undefined, get) => { - const isV4 = (await get('future') as Record).compatibilityVersion === 4 + $resolve: async (val, get) => { + const isV4 = (await get('future')).compatibilityVersion === 4 if (isV4) { - return resolve(await get('rootDir') as string, val || 'modules') + return resolve(await get('rootDir'), val && typeof val === 'string' ? val : 'modules') } - return val || 'modules' + return val && typeof val === 'string' ? val : 'modules' }, }, @@ -394,18 +412,25 @@ export default defineUntypedSchema({ * and copied across into your `dist` folder when your app is generated. */ public: { - $resolve: async (val: string | undefined, get) => { - const isV4 = (await get('future') as Record).compatibilityVersion === 4 + $resolve: async (val, get) => { + const isV4 = (await get('future')).compatibilityVersion === 4 if (isV4) { - return resolve(await get('rootDir') as string, val || await get('dir.static') as string || 'public') + return resolve(await get('rootDir'), val && typeof val === 'string' ? val : (await get('dir.static') || 'public')) } - return val || await get('dir.static') as string || 'public' + return val && typeof val === 'string' ? val : (await get('dir.static') || 'public') }, }, + // TODO: remove in v4 static: { + // @ts-expect-error schema has invalid types $schema: { deprecated: 'use `dir.public` option instead' }, - $resolve: async (val, get) => val || await get('dir.public') || 'public', + $resolve: async (val, get) => { + if (val && typeof val === 'string') { + return val + } + return await get('dir.public') || 'public' + }, }, }, @@ -413,7 +438,17 @@ export default defineUntypedSchema({ * The extensions that should be resolved by the Nuxt resolver. */ extensions: { - $resolve: (val: string[] | undefined): string[] => ['.js', '.jsx', '.mjs', '.ts', '.tsx', '.vue', ...val || []].filter(Boolean), + $resolve: (val): string[] => { + const extensions = ['.js', '.jsx', '.mjs', '.ts', '.tsx', '.vue'] + if (Array.isArray(val)) { + for (const item of val) { + if (item && typeof item === 'string') { + extensions.push(item) + } + } + } + return extensions + }, }, /** @@ -457,8 +492,8 @@ export default defineUntypedSchema({ * @type {Record} */ alias: { - $resolve: async (val: Record, get): Promise> => { - const [srcDir, rootDir, assetsDir, publicDir, buildDir, sharedDir] = await Promise.all([get('srcDir'), get('rootDir'), get('dir.assets'), get('dir.public'), get('buildDir'), get('dir.shared')]) as [string, string, string, string, string, string] + $resolve: async (val, get) => { + const [srcDir, rootDir, assetsDir, publicDir, buildDir, sharedDir] = await Promise.all([get('srcDir'), get('rootDir'), get('dir.assets'), get('dir.public'), get('buildDir'), get('dir.shared')]) return { '~': srcDir, '@': srcDir, @@ -469,7 +504,7 @@ export default defineUntypedSchema({ [basename(publicDir)]: resolve(srcDir, publicDir), '#build': buildDir, '#internal/nuxt/paths': resolve(buildDir, 'paths.mjs'), - ...val, + ...typeof val === 'object' ? val : {}, } }, }, @@ -494,7 +529,7 @@ export default defineUntypedSchema({ * By default, the `ignorePrefix` is set to '-', ignoring any files starting with '-'. */ ignorePrefix: { - $resolve: val => val ?? '-', + $resolve: val => val && typeof val === 'string' ? val : '-', }, /** @@ -502,18 +537,27 @@ export default defineUntypedSchema({ * inside the `ignore` array will be ignored in building. */ ignore: { - $resolve: async (val: string[] | undefined, get): Promise => { - const [rootDir, ignorePrefix, analyzeDir, buildDir] = await Promise.all([get('rootDir'), get('ignorePrefix'), get('analyzeDir'), get('buildDir')]) as [string, string, string, string] - return [ + $resolve: async (val, get): Promise => { + const [rootDir, ignorePrefix, analyzeDir, buildDir] = await Promise.all([get('rootDir'), get('ignorePrefix'), get('analyzeDir'), get('buildDir')]) + const ignore = new Set([ '**/*.stories.{js,cts,mts,ts,jsx,tsx}', // ignore storybook files '**/*.{spec,test}.{js,cts,mts,ts,jsx,tsx}', // ignore tests '**/*.d.{cts,mts,ts}', // ignore type declarations '**/.{pnpm-store,vercel,netlify,output,git,cache,data}', relative(rootDir, analyzeDir), relative(rootDir, buildDir), - ignorePrefix && `**/${ignorePrefix}*.*`, - ...val || [], - ].filter(Boolean) + ]) + if (ignorePrefix) { + ignore.add(`**/${ignorePrefix}*.*`) + } + if (Array.isArray(val)) { + for (const pattern in val) { + if (pattern) { + ignore.add(pattern) + } + } + } + return [...ignore] }, }, @@ -526,8 +570,11 @@ export default defineUntypedSchema({ * @type {Array} */ watch: { - $resolve: (val: Array | undefined) => { - return (val || []).filter((b: unknown) => typeof b === 'string' || b instanceof RegExp) + $resolve: (val) => { + if (Array.isArray(val)) { + return val.filter((b: unknown) => typeof b === 'string' || b instanceof RegExp) + } + return [] }, }, @@ -583,7 +630,7 @@ export default defineUntypedSchema({ * ``` * @type {typeof import('../src/types/hooks').NuxtHooks} */ - hooks: null, + hooks: undefined, /** * Runtime config allows passing dynamic config and environment variables to the Nuxt app context. @@ -611,8 +658,9 @@ export default defineUntypedSchema({ * @type {typeof import('../src/types/config').RuntimeConfig} */ runtimeConfig: { - $resolve: async (val: RuntimeConfig, get): Promise> => { - const [app, buildId] = await Promise.all([get('app') as Promise>, get('buildId') as Promise]) + $resolve: async (_val, get) => { + const val = _val && typeof _val === 'object' ? _val : {} + const [app, buildId] = await Promise.all([get('app'), get('buildId')]) provideFallbackValues(val) return defu(val, { public: {}, diff --git a/packages/schema/src/config/dev.ts b/packages/schema/src/config/dev.ts index 9c7ebd0ab0..292c2b00fd 100644 --- a/packages/schema/src/config/dev.ts +++ b/packages/schema/src/config/dev.ts @@ -1,7 +1,7 @@ -import { defineUntypedSchema } from 'untyped' +import { defineResolvers } from '../utils/definition' import { template as loadingTemplate } from '../../../ui-templates/dist/templates/loading' -export default defineUntypedSchema({ +export default defineResolvers({ devServer: { /** * Whether to enable HTTPS. @@ -21,9 +21,12 @@ export default defineUntypedSchema({ https: false, /** Dev server listening port */ - port: process.env.NUXT_PORT || process.env.NITRO_PORT || process.env.PORT || 3000, + port: Number(process.env.NUXT_PORT || process.env.NITRO_PORT || process.env.PORT || 3000), - /** Dev server listening host */ + /** + * Dev server listening host + * @type {string | undefined} + */ host: process.env.NUXT_HOST || process.env.NITRO_HOST || process.env.HOST || undefined, /** diff --git a/packages/schema/src/config/esbuild.ts b/packages/schema/src/config/esbuild.ts new file mode 100644 index 0000000000..e675dc74ba --- /dev/null +++ b/packages/schema/src/config/esbuild.ts @@ -0,0 +1,32 @@ +import { defu } from 'defu' +import type { TransformOptions } from 'esbuild' +import { defineResolvers } from '../utils/definition' + +export default defineResolvers({ + esbuild: { + /** + * Configure shared esbuild options used within Nuxt and passed to other builders, such as Vite or Webpack. + * @type {import('esbuild').TransformOptions} + */ + options: { + jsxFactory: 'h', + jsxFragment: 'Fragment', + tsconfigRaw: { + $resolve: async (_val, get) => { + const val: NonNullable> = typeof _val === 'string' ? JSON.parse(_val) : (_val && typeof _val === 'object' ? _val : {}) + + const useDecorators = await get('experimental').then(r => r?.decorators === true) + if (!useDecorators) { + return val + } + return defu(val, { + compilerOptions: { + useDefineForClassFields: false, + experimentalDecorators: false, + }, + } satisfies TransformOptions['tsconfigRaw']) + }, + }, + }, + }, +}) diff --git a/packages/schema/src/config/experimental.ts b/packages/schema/src/config/experimental.ts index bd627972a0..d7fa131968 100644 --- a/packages/schema/src/config/experimental.ts +++ b/packages/schema/src/config/experimental.ts @@ -1,6 +1,6 @@ -import { defineUntypedSchema } from 'untyped' +import { defineResolvers } from '../utils/definition' -export default defineUntypedSchema({ +export default defineResolvers({ /** * `future` is for early opting-in to new features that will become default in a future * (possibly major) version of the framework. @@ -30,10 +30,10 @@ export default defineUntypedSchema({ */ typescriptBundlerResolution: { async $resolve (val, get) { - // TODO: remove in v3.10 - val = val ?? await (get('experimental') as Promise>).then(e => e?.typescriptBundlerResolution) + // @ts-expect-error TODO: remove in v3.10 + val = typeof val === 'boolean' ? val : await (get('experimental')).then(e => e?.typescriptBundlerResolution as string | undefined) if (typeof val === 'boolean') { return val } - const setting = await get('typescript.tsConfig.compilerOptions.moduleResolution') as string | undefined + const setting = await get('typescript.tsConfig').then(r => r?.compilerOptions?.moduleResolution) if (setting) { return setting.toLowerCase() === 'bundler' } @@ -53,14 +53,22 @@ export default defineUntypedSchema({ * @type {boolean | ((id?: string) => boolean)} */ inlineStyles: { - async $resolve (val, get) { - // TODO: remove in v3.10 - val = val ?? await (get('experimental') as Promise>).then((e: Record) => e?.inlineSSRStyles) - if (val === false || (await get('dev')) || (await get('ssr')) === false || (await get('builder')) === '@nuxt/webpack-builder') { + async $resolve (_val, get) { + const val = typeof _val === 'boolean' || typeof _val === 'function' + ? _val + // @ts-expect-error TODO: legacy property - remove in v3.10 + : await (get('experimental')).then(e => e?.inlineSSRStyles) as undefined | boolean + if ( + val === false || + (await get('dev')) || + (await get('ssr')) === false || + // @ts-expect-error TODO: handled normalised types + (await get('builder')) === '@nuxt/webpack-builder' + ) { return false } // Enabled by default for vite prod with ssr (for vue components) - return val ?? ((await get('future') as Record).compatibilityVersion === 4 ? (id: string) => id && id.includes('.vue') : true) + return val ?? ((await get('future')).compatibilityVersion === 4 ? (id?: string) => !!id && id.includes('.vue') : true) }, }, @@ -73,7 +81,9 @@ export default defineUntypedSchema({ */ devLogs: { async $resolve (val, get) { - if (val !== undefined) { return val } + if (typeof val === 'boolean' || val === 'silent') { + return val + } const [isDev, isTest] = await Promise.all([get('dev'), get('test')]) return isDev && !isTest }, @@ -85,17 +95,25 @@ export default defineUntypedSchema({ */ noScripts: { async $resolve (val, get) { - // TODO: remove in v3.10 - return val ?? await (get('experimental') as Promise>).then((e: Record) => e?.noScripts) ?? false + return typeof val === 'boolean' + ? val + // @ts-expect-error TODO: legacy property - remove in v3.10 + : (await (get('experimental')).then(e => e?.noScripts as boolean | undefined) ?? false) }, }, }, experimental: { + /** + * Enable to use experimental decorators in Nuxt and Nitro. + * + * @see https://github.com/tc39/proposal-decorators + */ + decorators: false, /** * Set to true to generate an async entry point for the Vue bundle (for module federation support). */ asyncEntry: { - $resolve: val => val ?? false, + $resolve: val => typeof val === 'boolean' ? val : false, }, // TODO: Remove when nitro has support for mocking traced dependencies @@ -135,7 +153,17 @@ export default defineUntypedSchema({ if (val === 'reload') { return 'automatic' } - return val ?? 'automatic' + if (val === false) { + return false + } + + const validOptions = ['manual', 'automatic', 'automatic-immediate'] as const + type EmitRouteChunkError = typeof validOptions[number] + if (typeof val === 'string' && validOptions.includes(val as EmitRouteChunkError)) { + return val as EmitRouteChunkError + } + + return 'automatic' }, }, @@ -255,14 +283,16 @@ export default defineUntypedSchema({ */ watcher: { $resolve: async (val, get) => { - if (val) { - return val + const validOptions = ['chokidar', 'parcel', 'chokidar-granular'] as const + type WatcherOption = typeof validOptions[number] + if (typeof val === 'string' && validOptions.includes(val as WatcherOption)) { + return val as WatcherOption } - const [srcDir, rootDir] = await Promise.all([get('srcDir'), get('rootDir')]) as [string, string] + const [srcDir, rootDir] = await Promise.all([get('srcDir'), get('rootDir')]) if (srcDir === rootDir) { - return 'chokidar-granular' + return 'chokidar-granular' as const } - return 'chokidar' + return 'chokidar' as const }, }, @@ -304,7 +334,7 @@ export default defineUntypedSchema({ */ scanPageMeta: { async $resolve (val, get) { - return val ?? ((await get('future') as Record).compatibilityVersion === 4 ? 'after-resolve' : true) + return typeof val === 'boolean' || val === 'after-resolve' ? val : ((await get('future')).compatibilityVersion === 4 ? 'after-resolve' : true) }, }, @@ -343,7 +373,7 @@ export default defineUntypedSchema({ */ sharedPrerenderData: { async $resolve (val, get) { - return val ?? ((await get('future') as Record).compatibilityVersion === 4) + return typeof val === 'boolean' ? val : ((await get('future')).compatibilityVersion === 4) }, }, @@ -414,7 +444,7 @@ export default defineUntypedSchema({ */ normalizeComponentNames: { $resolve: async (val, get) => { - return val ?? ((await get('future') as Record).compatibilityVersion === 4) + return typeof val === 'boolean' ? val : ((await get('future')).compatibilityVersion === 4) }, }, @@ -425,7 +455,9 @@ export default defineUntypedSchema({ */ spaLoadingTemplateLocation: { $resolve: async (val, get) => { - return val ?? (((await get('future') as Record).compatibilityVersion === 4) ? 'body' : 'within') + const validOptions = ['body', 'within'] as const + type SpaLoadingTemplateLocation = typeof validOptions[number] + return typeof val === 'string' && validOptions.includes(val as SpaLoadingTemplateLocation) ? val as SpaLoadingTemplateLocation : (((await get('future')).compatibilityVersion === 4) ? 'body' : 'within') }, }, @@ -435,7 +467,7 @@ export default defineUntypedSchema({ * @see [the Chrome DevTools extensibility API](https://developer.chrome.com/docs/devtools/performance/extension#tracks) */ browserDevtoolsTiming: { - $resolve: async (val, get) => val ?? await get('dev'), + $resolve: async (val, get) => typeof val === 'boolean' ? val : await get('dev'), }, /** @@ -443,7 +475,7 @@ export default defineUntypedSchema({ */ debugModuleMutation: { $resolve: async (val, get) => { - return val ?? Boolean(await get('debug')) + return typeof val === 'boolean' ? val : Boolean(await get('debug')) }, }, }, diff --git a/packages/schema/src/config/generate.ts b/packages/schema/src/config/generate.ts index eb0e334393..5acab1e98d 100644 --- a/packages/schema/src/config/generate.ts +++ b/packages/schema/src/config/generate.ts @@ -1,6 +1,6 @@ -import { defineUntypedSchema } from 'untyped' +import { defineResolvers } from '../utils/definition' -export default defineUntypedSchema({ +export default defineResolvers({ generate: { /** * The routes to generate. diff --git a/packages/schema/src/config/index.ts b/packages/schema/src/config/index.ts index 42666bc8c3..225f0bcf97 100644 --- a/packages/schema/src/config/index.ts +++ b/packages/schema/src/config/index.ts @@ -1,8 +1,11 @@ +import type { ResolvableConfigSchema } from '../utils/definition' + import adhoc from './adhoc' import app from './app' import build from './build' import common from './common' import dev from './dev' +import esbuild from './esbuild' import experimental from './experimental' import generate from './generate' import internal from './internal' @@ -26,6 +29,7 @@ export default { ...postcss, ...router, ...typescript, + ...esbuild, ...vite, ...webpack, -} +} satisfies ResolvableConfigSchema diff --git a/packages/schema/src/config/internal.ts b/packages/schema/src/config/internal.ts index 0207964f64..f1a3a4694e 100644 --- a/packages/schema/src/config/internal.ts +++ b/packages/schema/src/config/internal.ts @@ -1,6 +1,6 @@ -import { defineUntypedSchema } from 'untyped' +import { defineResolvers } from '../utils/definition' -export default defineUntypedSchema({ +export default defineResolvers({ /** @private */ _majorVersion: 4, /** @private */ @@ -25,7 +25,7 @@ export default defineUntypedSchema({ appDir: '', /** * @private - * @type {Array<{ meta: ModuleMeta; module: NuxtModule, timings?: Record; entryPath?: string }>} + * @type {Array<{ meta: typeof import('../src/types/module').ModuleMeta; module: typeof import('../src/types/module').NuxtModule, timings?: Record; entryPath?: string }>} */ _installedModules: [], /** @private */ diff --git a/packages/schema/src/config/nitro.ts b/packages/schema/src/config/nitro.ts index 9f886dc077..3d3b565e1e 100644 --- a/packages/schema/src/config/nitro.ts +++ b/packages/schema/src/config/nitro.ts @@ -1,7 +1,6 @@ -import { defineUntypedSchema } from 'untyped' -import type { RuntimeConfig } from '../types/config' +import { defineResolvers } from '../utils/definition' -export default defineUntypedSchema({ +export default defineResolvers({ /** * Configuration for Nitro. * @see [Nitro configuration docs](https://nitro.unjs.io/config/) @@ -9,8 +8,8 @@ export default defineUntypedSchema({ */ nitro: { runtimeConfig: { - $resolve: async (val: Record | undefined, get) => { - const runtimeConfig = await get('runtimeConfig') as RuntimeConfig + $resolve: async (val, get) => { + const runtimeConfig = await get('runtimeConfig') return { ...runtimeConfig, app: { @@ -27,10 +26,12 @@ export default defineUntypedSchema({ }, }, routeRules: { - $resolve: async (val: Record | undefined, get) => ({ - ...await get('routeRules') as Record, - ...val, - }), + $resolve: async (val, get) => { + return { + ...await get('routeRules'), + ...(val && typeof val === 'object' ? val : {}), + } + }, }, }, diff --git a/packages/schema/src/config/postcss.ts b/packages/schema/src/config/postcss.ts index 573fcefb73..afd794dafd 100644 --- a/packages/schema/src/config/postcss.ts +++ b/packages/schema/src/config/postcss.ts @@ -1,4 +1,4 @@ -import { defineUntypedSchema } from 'untyped' +import { defineResolvers } from '../utils/definition' const ensureItemIsLast = (item: string) => (arr: string[]) => { const index = arr.indexOf(item) @@ -17,7 +17,7 @@ const orderPresets = { }, } -export default defineUntypedSchema({ +export default defineResolvers({ postcss: { /** * A strategy for ordering PostCSS plugins. @@ -25,14 +25,20 @@ export default defineUntypedSchema({ * @type {'cssnanoLast' | 'autoprefixerLast' | 'autoprefixerAndCssnanoLast' | string[] | ((names: string[]) => string[])} */ order: { - $resolve: (val: string | string[] | ((plugins: string[]) => string[])): string[] | ((plugins: string[]) => string[]) => { + $resolve: (val) => { if (typeof val === 'string') { if (!(val in orderPresets)) { throw new Error(`[nuxt] Unknown PostCSS order preset: ${val}`) } return orderPresets[val as keyof typeof orderPresets] } - return val ?? orderPresets.autoprefixerAndCssnanoLast + if (typeof val === 'function') { + return val as (names: string[]) => string[] + } + if (Array.isArray(val)) { + return val + } + return orderPresets.autoprefixerAndCssnanoLast }, }, /** diff --git a/packages/schema/src/config/router.ts b/packages/schema/src/config/router.ts index 5365829177..b9b8b574e7 100644 --- a/packages/schema/src/config/router.ts +++ b/packages/schema/src/config/router.ts @@ -1,6 +1,6 @@ -import { defineUntypedSchema } from 'untyped' +import { defineResolvers } from '../utils/definition' -export default defineUntypedSchema({ +export default defineResolvers({ router: { /** * Additional router options passed to `vue-router`. On top of the options for `vue-router`, diff --git a/packages/schema/src/config/typescript.ts b/packages/schema/src/config/typescript.ts index 9c334040bd..3c98111e3d 100644 --- a/packages/schema/src/config/typescript.ts +++ b/packages/schema/src/config/typescript.ts @@ -1,6 +1,6 @@ -import { defineUntypedSchema } from 'untyped' +import { defineResolvers } from '../utils/definition' -export default defineUntypedSchema({ +export default defineResolvers({ /** * Configuration for Nuxt's TypeScript integration. * @@ -20,10 +20,20 @@ export default defineUntypedSchema({ * builder environment types (with `false`) to handle this fully yourself, or opt for a 'shared' option. * * The 'shared' option is advised for module authors, who will want to support multiple possible builders. - * @type {'vite' | 'webpack' | 'rspack' | 'shared' | false | undefined} + * @type {'vite' | 'webpack' | 'rspack' | 'shared' | false | undefined | null} */ builder: { - $resolve: val => val ?? null, + $resolve: (val) => { + const validBuilderTypes = ['vite', 'webpack', 'rspack', 'shared'] as const + type ValidBuilderType = typeof validBuilderTypes[number] + if (typeof val === 'string' && validBuilderTypes.includes(val as ValidBuilderType)) { + return val as ValidBuilderType + } + if (val === false) { + return false + } + return null + }, }, /** diff --git a/packages/schema/src/config/vite.ts b/packages/schema/src/config/vite.ts index 9d49537a12..0a19108fde 100644 --- a/packages/schema/src/config/vite.ts +++ b/packages/schema/src/config/vite.ts @@ -1,10 +1,10 @@ import { consola } from 'consola' +import defu from 'defu' import { resolve } from 'pathe' import { isTest } from 'std-env' -import { defineUntypedSchema } from 'untyped' -import type { NuxtDebugOptions } from '../types/debug' +import { defineResolvers } from '../utils/definition' -export default defineUntypedSchema({ +export default defineResolvers({ /** * Configuration that will be passed directly to Vite. * @@ -14,22 +14,21 @@ export default defineUntypedSchema({ */ vite: { root: { - $resolve: async (val, get) => val ?? (await get('srcDir')), + $resolve: async (val, get) => typeof val === 'string' ? val : (await get('srcDir')), }, mode: { - $resolve: async (val, get) => val ?? (await get('dev') ? 'development' : 'production'), + $resolve: async (val, get) => typeof val === 'string' ? val : (await get('dev') ? 'development' : 'production'), }, define: { - $resolve: async (val: Record | undefined, get) => { - const [isDev, debug] = await Promise.all([get('dev'), get('debug')]) as [boolean, boolean | NuxtDebugOptions] - + $resolve: async (_val, get) => { + const [isDev, isDebug] = await Promise.all([get('dev'), get('debug')]) return { - '__VUE_PROD_HYDRATION_MISMATCH_DETAILS__': Boolean(debug && (debug === true || debug.hydration)), + '__VUE_PROD_HYDRATION_MISMATCH_DETAILS__': Boolean(isDebug && (isDebug === true || isDebug.hydration)), 'process.dev': isDev, 'import.meta.dev': isDev, 'process.test': isTest, 'import.meta.test': isTest, - ...val, + ..._val && typeof _val === 'object' ? _val : {}, } }, }, @@ -37,6 +36,7 @@ export default defineUntypedSchema({ extensions: ['.mjs', '.js', '.ts', '.jsx', '.tsx', '.json', '.vue'], }, publicDir: { + // @ts-expect-error this is missing from our `vite` types deliberately, so users do not configure it $resolve: (val) => { if (val) { consola.warn('Directly configuring the `vite.publicDir` option is not supported. Instead, set `dir.public`. You can read more in `https://nuxt.com/docs/api/nuxt-config#public`.') @@ -46,81 +46,89 @@ export default defineUntypedSchema({ }, vue: { isProduction: { - $resolve: async (val, get) => val ?? !(await get('dev')), + $resolve: async (val, get) => typeof val === 'boolean' ? val : !(await get('dev')), }, template: { compilerOptions: { - $resolve: async (val, get) => val ?? (await get('vue') as Record).compilerOptions, + $resolve: async (val, get) => val ?? (await get('vue')).compilerOptions, }, transformAssetUrls: { - $resolve: async (val, get) => val ?? (await get('vue') as Record).transformAssetUrls, + $resolve: async (val, get) => val ?? (await get('vue')).transformAssetUrls, }, }, script: { hoistStatic: { - $resolve: async (val, get) => val ?? (await get('vue') as Record).compilerOptions?.hoistStatic, + $resolve: async (val, get) => typeof val === 'boolean' ? val : (await get('vue')).compilerOptions?.hoistStatic, }, }, features: { propsDestructure: { $resolve: async (val, get) => { - if (val !== undefined && val !== null) { + if (typeof val === 'boolean') { return val } - const vueOptions = await get('vue') as Record || {} - return Boolean(vueOptions.script?.propsDestructure ?? vueOptions.propsDestructure) + const vueOptions = await get('vue') || {} + return Boolean( + // @ts-expect-error TODO: remove in future: supporting a legacy schema + vueOptions.script?.propsDestructure + ?? vueOptions.propsDestructure, + ) }, }, }, }, vueJsx: { - $resolve: async (val: Record, get) => { + $resolve: async (val, get) => { return { - isCustomElement: (await get('vue') as Record).compilerOptions?.isCustomElement, - ...val, + // TODO: investigate type divergence between types for @vue/compiler-core and @vue/babel-plugin-jsx + isCustomElement: (await get('vue')).compilerOptions?.isCustomElement as undefined | ((tag: string) => boolean), + ...typeof val === 'object' ? val : {}, } }, }, optimizeDeps: { + esbuildOptions: { + $resolve: async (val, get) => defu(val && typeof val === 'object' ? val : {}, await get('esbuild.options')), + }, exclude: { - $resolve: async (val: string[] | undefined, get) => [ - ...val || [], - ...(await get('build.transpile') as Array string | RegExp | false)>).filter(i => typeof i === 'string'), + $resolve: async (val, get) => [ + ...Array.isArray(val) ? val : [], + ...(await get('build.transpile')).filter(i => typeof i === 'string'), 'vue-demi', ], }, }, esbuild: { - jsxFactory: 'h', - jsxFragment: 'Fragment', - tsconfigRaw: '{}', + $resolve: async (val, get) => { + return defu(val && typeof val === 'object' ? val : {}, await get('esbuild.options')) + }, }, clearScreen: true, build: { assetsDir: { - $resolve: async (val, get) => val ?? (await get('app') as Record).buildAssetsDir?.replace(/^\/+/, ''), + $resolve: async (val, get) => typeof val === 'string' ? val : (await get('app')).buildAssetsDir?.replace(/^\/+/, ''), }, emptyOutDir: false, }, server: { fs: { allow: { - $resolve: async (val: string[] | undefined, get) => { - const [buildDir, srcDir, rootDir, workspaceDir, modulesDir] = await Promise.all([get('buildDir'), get('srcDir'), get('rootDir'), get('workspaceDir'), get('modulesDir')]) as [string, string, string, string, string] + $resolve: async (val, get) => { + const [buildDir, srcDir, rootDir, workspaceDir, modulesDir] = await Promise.all([get('buildDir'), get('srcDir'), get('rootDir'), get('workspaceDir'), get('modulesDir')]) return [...new Set([ buildDir, srcDir, rootDir, workspaceDir, ...(modulesDir), - ...val ?? [], + ...Array.isArray(val) ? val : [], ])] }, }, }, }, cacheDir: { - $resolve: async (val, get) => val ?? resolve(await get('rootDir') as string, 'node_modules/.cache/vite'), + $resolve: async (val, get) => typeof val === 'string' ? val : resolve(await get('rootDir'), 'node_modules/.cache/vite'), }, }, }) diff --git a/packages/schema/src/config/webpack.ts b/packages/schema/src/config/webpack.ts index ee4d94843d..810c0c1cae 100644 --- a/packages/schema/src/config/webpack.ts +++ b/packages/schema/src/config/webpack.ts @@ -1,8 +1,7 @@ import { defu } from 'defu' -import { defineUntypedSchema } from 'untyped' -import type { VueLoaderOptions } from 'vue-loader' +import { defineResolvers } from '../utils/definition' -export default defineUntypedSchema({ +export default defineResolvers({ webpack: { /** * Nuxt uses `webpack-bundle-analyzer` to visualize your bundles and how to optimize them. @@ -17,8 +16,8 @@ export default defineUntypedSchema({ * @type {boolean | { enabled?: boolean } & typeof import('webpack-bundle-analyzer').BundleAnalyzerPlugin.Options} */ analyze: { - $resolve: async (val: boolean | { enabled?: boolean } | Record, get) => { - const value = typeof val === 'boolean' ? { enabled: val } : val + $resolve: async (val, get) => { + const value = typeof val === 'boolean' ? { enabled: val } : (val && typeof val === 'object' ? val : {}) return defu(value, await get('build.analyze') as { enabled?: boolean } | Record) }, }, @@ -83,7 +82,7 @@ export default defineUntypedSchema({ * Enables CSS source map support (defaults to `true` in development). */ cssSourceMap: { - $resolve: async (val, get) => val ?? await get('dev'), + $resolve: async (val, get) => typeof val === 'boolean' ? val : await get('dev'), }, /** @@ -147,7 +146,10 @@ export default defineUntypedSchema({ for (const name of styleLoaders) { const loader = loaders[name] if (loader && loader.sourceMap === undefined) { - loader.sourceMap = Boolean(await get('build.cssSourceMap')) + loader.sourceMap = Boolean( + // @ts-expect-error TODO: remove legacay configuration + await get('build.cssSourceMap'), + ) } } return loaders @@ -158,37 +160,34 @@ export default defineUntypedSchema({ * @type {Omit} */ esbuild: { - jsxFactory: 'h', - jsxFragment: 'Fragment', - tsconfigRaw: '{}', + $resolve: async (val, get) => { + return defu(val && typeof val === 'object' ? val : {}, await get('esbuild.options')) + }, }, /** * @see [`file-loader` Options](https://github.com/webpack-contrib/file-loader#options) - * @type {Omit} * @default * ```ts * { esModule: false } * ``` */ - file: { esModule: false }, + file: { esModule: false, limit: 1000 }, /** * @see [`file-loader` Options](https://github.com/webpack-contrib/file-loader#options) - * @type {Omit} * @default * ```ts - * { esModule: false, limit: 1000 } + * { esModule: false } * ``` */ fontUrl: { esModule: false, limit: 1000 }, /** * @see [`file-loader` Options](https://github.com/webpack-contrib/file-loader#options) - * @type {Omit} * @default * ```ts - * { esModule: false, limit: 1000 } + * { esModule: false } * ``` */ imgUrl: { esModule: false, limit: 1000 }, @@ -205,26 +204,38 @@ export default defineUntypedSchema({ */ vue: { transformAssetUrls: { - $resolve: async (val, get) => (val ?? (await get('vue.transformAssetUrls'))) as VueLoaderOptions['transformAssetUrls'], + $resolve: async (val, get) => (val ?? (await get('vue.transformAssetUrls'))), }, compilerOptions: { - $resolve: async (val, get) => (val ?? (await get('vue.compilerOptions'))) as VueLoaderOptions['compilerOptions'], + $resolve: async (val, get) => (val ?? (await get('vue.compilerOptions'))), }, propsDestructure: { $resolve: async (val, get) => Boolean(val ?? await get('vue.propsDestructure')), }, - } satisfies { [K in keyof VueLoaderOptions]: { $resolve: (val: unknown, get: (id: string) => Promise) => Promise } }, + }, + /** + * See [css-loader](https://github.com/webpack-contrib/css-loader) for available options. + */ css: { importLoaders: 0, + /** + * @type {boolean | { filter: (url: string, resourcePath: string) => boolean }} + */ url: { filter: (url: string, _resourcePath: string) => url[0] !== '/', }, esModule: false, }, + /** + * See [css-loader](https://github.com/webpack-contrib/css-loader) for available options. + */ cssModules: { importLoaders: 0, + /** + * @type {boolean | { filter: (url: string, resourcePath: string) => boolean }} + */ url: { filter: (url: string, _resourcePath: string) => url[0] !== '/', }, @@ -241,7 +252,6 @@ export default defineUntypedSchema({ /** * @see [`sass-loader` Options](https://github.com/webpack-contrib/sass-loader#options) - * @type {typeof import('sass-loader')['Options']} * @default * ```ts * { @@ -259,7 +269,6 @@ export default defineUntypedSchema({ /** * @see [`sass-loader` Options](https://github.com/webpack-contrib/sass-loader#options) - * @type {typeof import('sass-loader')['Options']} */ scss: {}, @@ -300,7 +309,14 @@ export default defineUntypedSchema({ * @type {false | typeof import('css-minimizer-webpack-plugin').BasePluginOptions & typeof import('css-minimizer-webpack-plugin').DefinedDefaultMinimizerAndOptions} */ optimizeCSS: { - $resolve: async (val, get) => val ?? (await get('build.extractCSS') ? {} : false), + $resolve: async (val, get) => { + if (val === false || (val && typeof val === 'object')) { + return val + } + // @ts-expect-error TODO: remove legacy configuration + const extractCSS = await get('build.extractCSS') + return extractCSS ? {} : false + }, }, /** @@ -310,7 +326,9 @@ export default defineUntypedSchema({ optimization: { runtimeChunk: 'single', /** Set minimize to `false` to disable all minimizers. (It is disabled in development by default). */ - minimize: { $resolve: async (val, get) => val ?? !(await get('dev')) }, + minimize: { + $resolve: async (val, get) => typeof val === 'boolean' ? val : !(await get('dev')), + }, /** You can set minimizer to a customized array of plugins. */ minimizer: undefined, splitChunks: { @@ -323,15 +341,12 @@ export default defineUntypedSchema({ /** * Customize PostCSS Loader. * same options as [`postcss-loader` options](https://github.com/webpack-contrib/postcss-loader#options) - * @type {{ execute?: boolean, postcssOptions: typeof import('postcss').ProcessOptions, sourceMap?: boolean, implementation?: any }} + * @type {{ execute?: boolean, postcssOptions: typeof import('postcss').ProcessOptions & { plugins: Record & { autoprefixer?: typeof import('autoprefixer').Options; cssnano?: typeof import('cssnano').Options } }, sourceMap?: boolean, implementation?: any }} */ postcss: { postcssOptions: { - config: { - $resolve: async (val, get) => val ?? (await get('postcss.config')), - }, plugins: { - $resolve: async (val, get) => val ?? (await get('postcss.plugins')), + $resolve: async (val, get) => val && typeof val === 'object' ? val : (await get('postcss.plugins')), }, }, }, diff --git a/packages/schema/src/types/imports.ts b/packages/schema/src/types/imports.ts index 96171ecf87..5dc26e22c4 100644 --- a/packages/schema/src/types/imports.ts +++ b/packages/schema/src/types/imports.ts @@ -32,4 +32,10 @@ export interface ImportsOptions extends UnimportOptions { exclude?: RegExp[] include?: RegExp[] } + + /** + * Add polyfills for setInterval, requestIdleCallback, and others + * @default true + */ + polyfills?: boolean } diff --git a/packages/schema/src/types/module.ts b/packages/schema/src/types/module.ts index 532308f5a3..1a621e12f2 100644 --- a/packages/schema/src/types/module.ts +++ b/packages/schema/src/types/module.ts @@ -21,6 +21,12 @@ export interface ModuleMeta { */ compatibility?: NuxtCompatibility + /** + * Fully resolved path used internally by Nuxt. Do not depend on this value. + * @internal + */ + rawPath?: string + [key: string]: unknown } diff --git a/packages/schema/src/types/nuxt.ts b/packages/schema/src/types/nuxt.ts index 5e50e7adaf..ed95dd6851 100644 --- a/packages/schema/src/types/nuxt.ts +++ b/packages/schema/src/types/nuxt.ts @@ -83,6 +83,7 @@ export interface NuxtApp { export interface Nuxt { // Private fields. + __name: string _version: string _ignore?: Ignore _dependencies?: Set @@ -96,6 +97,7 @@ export interface Nuxt { hook: Nuxt['hooks']['hook'] callHook: Nuxt['hooks']['callHook'] addHooks: Nuxt['hooks']['addHooks'] + runWithContext: any>(fn: T) => ReturnType ready: () => Promise close: () => Promise diff --git a/packages/schema/src/utils/definition.ts b/packages/schema/src/utils/definition.ts new file mode 100644 index 0000000000..cf316f240d --- /dev/null +++ b/packages/schema/src/utils/definition.ts @@ -0,0 +1,56 @@ +import type { InputObject } from 'untyped' + +import { defineUntypedSchema } from 'untyped' + +import type { ConfigSchema } from '../../schema/config' + +type KeysOf = keyof T extends string + ? + { + [K in keyof T]: K extends string + ? string extends K + ? never // exclude generic 'string' type + : unknown extends Prefix + ? `${K | KeysOf}` + : Prefix extends string + ? `${Prefix}.${K | KeysOf}` + : never + : never + }[keyof T] + : never + +type ReturnFromKey = keyof T extends string + ? K extends keyof T + ? T[K] + : K extends `${keyof T}.${string}` + ? K extends `${infer Prefix}.${string}` + ? Prefix extends keyof T + ? K extends `${Prefix}.${infer Suffix}` + ? ReturnFromKey + : never + : never + : never + : never + : never + +type Awaitable = T | Promise + +interface Resolvers { + $resolve: (val: unknown, get: >(key: K) => Promise>) => Awaitable + $schema?: InputObject['$schema'] + $default?: ReturnValue +} + +type Resolvable = keyof Exclude, boolean | string | (() => any)> extends string + ? { + [K in keyof Namespace]: Partial> | Resolvers + } | Namespace + : Namespace | Resolvers + +export function defineResolvers>> (config: C) { + return defineUntypedSchema(config) /* as C */ +} + +export type ResolvableConfigSchema = Partial> + +export { defineUntypedSchema } from 'untyped' diff --git a/packages/ui-templates/package.json b/packages/ui-templates/package.json index eeeaeceb48..78dd6d5389 100644 --- a/packages/ui-templates/package.json +++ b/packages/ui-templates/package.json @@ -24,7 +24,7 @@ "jiti": "2.4.2", "knitwork": "1.2.0", "pathe": "2.0.2", - "prettier": "3.4.2", + "prettier": "3.5.0", "scule": "1.3.0", "svgo": "3.3.2", "tinyexec": "0.3.2", diff --git a/packages/ui-templates/test/__snapshots__/templates.spec.ts.snap b/packages/ui-templates/test/__snapshots__/templates.spec.ts.snap index 7b591de4c2..e9e3966086 100644 --- a/packages/ui-templates/test/__snapshots__/templates.spec.ts.snap +++ b/packages/ui-templates/test/__snapshots__/templates.spec.ts.snap @@ -1243,8 +1243,8 @@ exports[`template > produces correct output for welcome template 1`] = ` --un-ring-shadow: var(--un-ring-inset) 0 0 0 calc(var(--un-ring-width) + var(--un-ring-offset-width)) var(--un-ring-color); - box-shadow: var(--un-ring-offset-shadow), var(--un-ring-shadow), - var(--un-shadow); + box-shadow: + var(--un-ring-offset-shadow), var(--un-ring-shadow), var(--un-shadow); } .transition-all { transition-duration: 0.15s; diff --git a/packages/vite/package.json b/packages/vite/package.json index c8683d5821..a3063bf132 100644 --- a/packages/vite/package.json +++ b/packages/vite/package.json @@ -41,7 +41,6 @@ "defu": "^6.1.4", "esbuild": "^0.25.0", "escape-string-regexp": "^5.0.0", - "externality": "^1.0.2", "get-port-please": "^3.1.2", "h3": "npm:h3-nightly@1.14.0-20250122-114730-3f9e703", "jiti": "^2.4.2", @@ -50,12 +49,12 @@ "mlly": "^1.7.4", "pathe": "^2.0.2", "pkg-types": "^1.3.1", - "postcss": "^8.5.1", + "postcss": "^8.5.2", "rollup-plugin-visualizer": "^5.14.0", "std-env": "^3.8.0", "ufo": "^1.5.4", "unenv": "^1.10.0", - "unplugin": "^2.1.2", + "unplugin": "^2.2.0", "vite": "^6.1.0", "vite-node": "^3.0.5", "vite-plugin-checker": "^0.8.0", @@ -65,6 +64,6 @@ "vue": "^3.3.4" }, "engines": { - "node": "^18.20.6 || ^20.9.0 || >=22.0.0" + "node": "^18.12.0 || ^20.9.0 || >=22.0.0" } } diff --git a/packages/vite/src/runtime/vite-node.mjs b/packages/vite/src/runtime/vite-node.mjs index bc2da0c41d..59a54ab182 100644 --- a/packages/vite/src/runtime/vite-node.mjs +++ b/packages/vite/src/runtime/vite-node.mjs @@ -39,6 +39,9 @@ function createRunner () { return new ViteNodeRunner({ root: viteNodeOptions.root, // Equals to Nuxt `srcDir` base: viteNodeOptions.base, + async resolveId (id, importer) { + return await viteNodeFetch('/resolve/' + encodeURIComponent(id) + (importer ? '?importer=' + encodeURIComponent(importer) : '')) ?? undefined + }, async fetchModule (id) { id = id.replace(/\/\//g, '/') // TODO: fix in vite-node return await viteNodeFetch('/module/' + encodeURI(id)).catch((err) => { diff --git a/packages/vite/src/utils/external.ts b/packages/vite/src/utils/external.ts deleted file mode 100644 index c6889cb3a1..0000000000 --- a/packages/vite/src/utils/external.ts +++ /dev/null @@ -1,36 +0,0 @@ -import type { ExternalsOptions } from 'externality' -import { ExternalsDefaults, isExternal } from 'externality' -import type { ViteDevServer } from 'vite' -import escapeStringRegexp from 'escape-string-regexp' -import { withTrailingSlash } from 'ufo' -import type { Nuxt } from 'nuxt/schema' -import { resolve } from 'pathe' -import { toArray } from '.' - -export function createIsExternal (viteServer: ViteDevServer, nuxt: Nuxt) { - const externalOpts: ExternalsOptions = { - inline: [ - /virtual:/, - /\.ts$/, - ...ExternalsDefaults.inline || [], - ...( - viteServer.config.ssr.noExternal && viteServer.config.ssr.noExternal !== true - ? toArray(viteServer.config.ssr.noExternal) - : [] - ), - ], - external: [ - '#shared', - new RegExp('^' + escapeStringRegexp(withTrailingSlash(resolve(nuxt.options.rootDir, nuxt.options.dir.shared)))), - ...(viteServer.config.ssr.external as string[]) || [], - /node_modules/, - ], - resolve: { - modules: nuxt.options.modulesDir, - type: 'module', - extensions: ['.ts', '.js', '.json', '.vue', '.mjs', '.jsx', '.tsx', '.wasm'], - }, - } - - return (id: string) => isExternal(id, nuxt.options.rootDir, externalOpts) -} diff --git a/packages/vite/src/vite-node.ts b/packages/vite/src/vite-node.ts index 9d0892f139..1f18dd3672 100644 --- a/packages/vite/src/vite-node.ts +++ b/packages/vite/src/vite-node.ts @@ -1,18 +1,16 @@ import { mkdir, writeFile } from 'node:fs/promises' import { pathToFileURL } from 'node:url' -import { createApp, createError, defineEventHandler, defineLazyEventHandler, eventHandler, toNodeListener } from 'h3' +import { createApp, createError, defineEventHandler, toNodeListener } from 'h3' import { ViteNodeServer } from 'vite-node/server' import { isAbsolute, join, normalize, resolve } from 'pathe' // import { addDevServerHandler } from '@nuxt/kit' import { isFileServingAllowed } from 'vite' -import type { ModuleNode, Plugin as VitePlugin } from 'vite' +import type { ModuleNode, ViteDevServer, Plugin as VitePlugin } from 'vite' import { getQuery } from 'ufo' import { normalizeViteManifest } from 'vue-bundle-renderer' -import { resolve as resolveModule } from 'mlly' import { distDir } from './dirs' import type { ViteBuildContext } from './vite' import { isCSS } from './utils' -import { createIsExternal } from './utils/external' // TODO: Remove this in favor of registerViteNodeMiddleware // after Nitropack or h3 allows adding middleware after setup @@ -101,6 +99,19 @@ function getManifest (ctx: ViteBuildContext) { function createViteNodeApp (ctx: ViteBuildContext, invalidates: Set = new Set()) { const app = createApp() + let _node: ViteNodeServer | undefined + function getNode (server: ViteDevServer) { + return _node ||= new ViteNodeServer(server, { + deps: { + inline: [/^#/, /\?/], + }, + transformMode: { + ssr: [/.*/], + web: [], + }, + }) + } + app.use('/manifest', defineEventHandler(() => { const manifest = getManifest(ctx) return manifest @@ -112,54 +123,38 @@ function createViteNodeApp (ctx: ViteBuildContext, invalidates: Set = ne return ids })) - app.use('/module', defineLazyEventHandler(() => { - const viteServer = ctx.ssrServer! - const node = new ViteNodeServer(viteServer, { - deps: { - inline: [ - // Common - /^#/, - /\?/, - ], - }, - transformMode: { - ssr: [/.*/], - web: [], - }, - }) - - const isExternal = createIsExternal(viteServer, ctx.nuxt) - node.shouldExternalize = async (id: string) => { - const result = await isExternal(id) - if (result?.external) { - return resolveModule(result.id, { url: ctx.nuxt.options.modulesDir }).catch(() => false) - } - return false + const RESOLVE_RE = /^\/(?[^?]+)(?:\?importer=(?.*))?$/ + app.use('/resolve', defineEventHandler(async (event) => { + const { id, importer } = event.path.match(RESOLVE_RE)?.groups || {} + if (!id || !ctx.ssrServer) { + throw createError({ statusCode: 400 }) } + return await getNode(ctx.ssrServer).resolveId(decodeURIComponent(id), importer ? decodeURIComponent(importer) : undefined).catch(() => null) + })) - return eventHandler(async (event) => { - const moduleId = decodeURI(event.path).substring(1) - if (moduleId === '/') { - throw createError({ statusCode: 400 }) + app.use('/module', defineEventHandler(async (event) => { + const moduleId = decodeURI(event.path).substring(1) + if (moduleId === '/' || !ctx.ssrServer) { + throw createError({ statusCode: 400 }) + } + if (isAbsolute(moduleId) && !isFileServingAllowed(ctx.ssrServer.config, moduleId)) { + throw createError({ statusCode: 403 /* Restricted */ }) + } + const node = getNode(ctx.ssrServer) + const module = await node.fetchModule(moduleId).catch(async (err) => { + const errorData = { + code: 'VITE_ERROR', + id: moduleId, + stack: '', + ...err, } - if (isAbsolute(moduleId) && !isFileServingAllowed(moduleId, viteServer)) { - throw createError({ statusCode: 403 /* Restricted */ }) - } - const module = await node.fetchModule(moduleId).catch(async (err) => { - const errorData = { - code: 'VITE_ERROR', - id: moduleId, - stack: '', - ...err, - } - if (!errorData.frame && errorData.code === 'PARSE_ERROR') { - errorData.frame = await node.transformModule(moduleId, 'web').then(({ code }) => `${err.message || ''}\n${code}`).catch(() => undefined) - } - throw createError({ data: errorData }) - }) - return module + if (!errorData.frame && errorData.code === 'PARSE_ERROR') { + errorData.frame = await node.transformModule(moduleId, 'web').then(({ code }) => `${err.message || ''}\n${code}`).catch(() => undefined) + } + throw createError({ data: errorData }) }) + return module })) return app diff --git a/packages/webpack/package.json b/packages/webpack/package.json index 15bb840f41..bc90403caf 100644 --- a/packages/webpack/package.json +++ b/packages/webpack/package.json @@ -37,7 +37,7 @@ "css-minimizer-webpack-plugin": "^7.0.0", "cssnano": "^7.0.6", "defu": "^6.1.4", - "esbuild-loader": "^4.2.2", + "esbuild-loader": "^4.3.0", "escape-string-regexp": "^5.0.0", "file-loader": "^6.2.0", "fork-ts-checker-webpack-plugin": "^9.0.2", @@ -51,7 +51,7 @@ "ohash": "^1.1.4", "pathe": "^2.0.2", "pify": "^6.1.0", - "postcss": "^8.5.1", + "postcss": "^8.5.2", "postcss-import": "^16.1.0", "postcss-import-resolver": "^2.0.0", "postcss-loader": "^8.1.1", @@ -61,7 +61,7 @@ "time-fix-plugin": "^2.0.7", "ufo": "^1.5.4", "unenv": "^1.10.0", - "unplugin": "^2.1.2", + "unplugin": "^2.2.0", "url-loader": "^4.1.1", "vue-bundle-renderer": "^2.1.1", "vue-loader": "^17.4.2", @@ -73,7 +73,7 @@ }, "devDependencies": { "@nuxt/schema": "workspace:*", - "@rspack/core": "1.2.2", + "@rspack/core": "1.2.3", "@types/pify": "5.0.4", "@types/webpack-bundle-analyzer": "4.7.0", "@types/webpack-hot-middleware": "2.25.9", @@ -85,6 +85,6 @@ "vue": "^3.3.4" }, "engines": { - "node": "^18.20.6 || ^20.9.0 || >=22.0.0" + "node": "^18.12.0 || ^20.9.0 || >=22.0.0" } } diff --git a/playground/package.json b/playground/package.json index 1524934496..0f5e407014 100644 --- a/playground/package.json +++ b/playground/package.json @@ -10,6 +10,6 @@ "nuxt": "workspace:*" }, "engines": { - "node": "^18.20.6 || ^20.9.0 || >=22.0.0" + "node": "^18.12.0 || ^20.9.0 || >=22.0.0" } } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 984f854b13..0797efe70a 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -14,27 +14,29 @@ overrides: '@nuxt/vite-builder': workspace:* '@nuxt/webpack-builder': workspace:* '@types/node': 22.13.1 - '@unhead/schema': 2.0.0-alpha.9 - '@unhead/shared': 2.0.0-alpha.9 - '@unhead/vue': 2.0.0-alpha.8 + '@unhead/dom': 1.11.18 + '@unhead/schema': 1.11.18 + '@unhead/shared': 1.11.18 + '@unhead/ssr': 1.11.18 + '@unhead/vue': 1.11.18 '@vue/compiler-core': 3.5.13 '@vue/compiler-dom': 3.5.13 '@vue/shared': 3.5.13 - c12: 2.0.1 + c12: 2.0.2 h3: npm:h3-nightly@1.14.0-20250122-114730-3f9e703 jiti: 2.4.2 magic-string: ^0.30.17 nitro: npm:nitro-nightly@3.0.0-beta-28969273.f7aa9de6 nuxt: workspace:* ohash: 1.1.4 - postcss: 8.5.1 + postcss: 8.5.2 rollup: 4.34.6 send: '>=1.1.0' typescript: 5.7.3 ufo: 1.5.4 unbuild: 3.3.1 - unhead: 2.0.0-alpha.9 - unimport: 4.1.0 + unhead: 1.11.18 + unimport: 4.1.1 vite: 6.1.0 vue: 3.5.13 @@ -53,13 +55,13 @@ importers: version: 7.26.5 '@codspeed/vitest-plugin': specifier: 4.0.0 - version: 4.0.0(vite@6.1.0(@types/node@22.13.1)(jiti@2.4.2)(terser@5.32.0)(tsx@4.19.2)(yaml@2.7.0))(vitest@3.0.5(@types/debug@4.1.12)(@types/node@22.13.1)(happy-dom@17.0.2)(jiti@2.4.2)(terser@5.32.0)(tsx@4.19.2)(yaml@2.7.0)) + version: 4.0.0(vite@6.1.0(@types/node@22.13.1)(jiti@2.4.2)(terser@5.32.0)(tsx@4.19.2)(yaml@2.7.0))(vitest@3.0.5(@types/debug@4.1.12)(@types/node@22.13.1)(happy-dom@17.0.4)(jiti@2.4.2)(terser@5.32.0)(tsx@4.19.2)(yaml@2.7.0)) '@nuxt/cli': specifier: 3.21.1 version: 3.21.1(magicast@0.3.5) '@nuxt/eslint-config': specifier: 1.0.1 - version: 1.0.1(@vue/compiler-sfc@3.5.13)(eslint@9.20.0(jiti@2.4.2))(typescript@5.7.3) + version: 1.0.1(@vue/compiler-sfc@3.5.13)(eslint@9.20.1(jiti@2.4.2))(typescript@5.7.3) '@nuxt/kit': specifier: workspace:* version: link:packages/kit @@ -68,7 +70,7 @@ importers: version: link:packages/rspack '@nuxt/test-utils': specifier: 3.15.4 - version: 3.15.4(@testing-library/vue@8.1.0(@vue/compiler-sfc@3.5.13)(vue@3.5.13(typescript@5.7.3)))(@types/node@22.13.1)(@vue/test-utils@2.4.6)(happy-dom@17.0.2)(jiti@2.4.2)(magicast@0.3.5)(playwright-core@1.50.1)(terser@5.32.0)(tsx@4.19.2)(typescript@5.7.3)(vitest@3.0.5(@types/debug@4.1.12)(@types/node@22.13.1)(happy-dom@17.0.2)(jiti@2.4.2)(terser@5.32.0)(tsx@4.19.2)(yaml@2.7.0))(yaml@2.7.0) + version: 3.15.4(@testing-library/vue@8.1.0(@vue/compiler-sfc@3.5.13)(vue@3.5.13(typescript@5.7.3)))(@types/node@22.13.1)(@vue/test-utils@2.4.6)(happy-dom@17.0.4)(jiti@2.4.2)(magicast@0.3.5)(playwright-core@1.50.1)(terser@5.32.0)(tsx@4.19.2)(typescript@5.7.3)(vitest@3.0.5(@types/debug@4.1.12)(@types/node@22.13.1)(happy-dom@17.0.4)(jiti@2.4.2)(terser@5.32.0)(tsx@4.19.2)(yaml@2.7.0))(yaml@2.7.0) '@nuxt/webpack-builder': specifier: workspace:* version: link:packages/webpack @@ -88,14 +90,14 @@ importers: specifier: 7.5.8 version: 7.5.8 '@unhead/schema': - specifier: 2.0.0-alpha.9 - version: 2.0.0-alpha.9 + specifier: 1.11.18 + version: 1.11.18 '@unhead/vue': - specifier: 2.0.0-alpha.8 - version: 2.0.0-alpha.8(vue@3.5.13(typescript@5.7.3)) + specifier: 1.11.18 + version: 1.11.18(vue@3.5.13(typescript@5.7.3)) '@vitest/coverage-v8': specifier: 3.0.5 - version: 3.0.5(vitest@3.0.5(@types/debug@4.1.12)(@types/node@22.13.1)(happy-dom@17.0.2)(jiti@2.4.2)(terser@5.32.0)(tsx@4.19.2)(yaml@2.7.0)) + version: 3.0.5(vitest@3.0.5(@types/debug@4.1.12)(@types/node@22.13.1)(happy-dom@17.0.4)(jiti@2.4.2)(terser@5.32.0)(tsx@4.19.2)(yaml@2.7.0)) '@vue/test-utils': specifier: 2.4.6 version: 2.4.6 @@ -104,7 +106,7 @@ importers: version: 8.14.0 autoprefixer: specifier: 10.4.20 - version: 10.4.20(postcss@8.5.1) + version: 10.4.20(postcss@8.5.2) case-police: specifier: 0.7.2 version: 0.7.2 @@ -116,7 +118,7 @@ importers: version: 3.4.0 cssnano: specifier: 7.0.6 - version: 7.0.6(postcss@8.5.1) + version: 7.0.6(postcss@8.5.2) destr: specifier: 2.0.3 version: 2.0.3 @@ -124,17 +126,17 @@ importers: specifier: 5.1.1 version: 5.1.1 eslint: - specifier: 9.20.0 - version: 9.20.0(jiti@2.4.2) + specifier: 9.20.1 + version: 9.20.1(jiti@2.4.2) eslint-plugin-no-only-tests: specifier: 3.3.0 version: 3.3.0 eslint-plugin-perfectionist: specifier: 4.8.0 - version: 4.8.0(eslint@9.20.0(jiti@2.4.2))(typescript@5.7.3) + version: 4.8.0(eslint@9.20.1(jiti@2.4.2))(typescript@5.7.3) eslint-typegen: specifier: 1.0.0 - version: 1.0.0(eslint@9.20.0(jiti@2.4.2)) + version: 1.0.0(eslint@9.20.1(jiti@2.4.2)) estree-walker: specifier: 3.0.3 version: 3.0.3 @@ -142,8 +144,8 @@ importers: specifier: npm:h3-nightly@1.14.0-20250122-114730-3f9e703 version: h3-nightly@1.14.0-20250122-114730-3f9e703 happy-dom: - specifier: 17.0.2 - version: 17.0.2 + specifier: 17.0.4 + version: 17.0.4 installed-check: specifier: 9.3.0 version: 9.3.0 @@ -151,8 +153,8 @@ importers: specifier: 2.4.2 version: 2.4.2 knip: - specifier: 5.43.6 - version: 5.43.6(@types/node@22.13.1)(typescript@5.7.3) + specifier: 5.44.0 + version: 5.44.0(@types/node@22.13.1)(typescript@5.7.3) magic-string: specifier: ^0.30.17 version: 0.30.17 @@ -215,10 +217,10 @@ importers: version: 3.3.1(typescript@5.7.3)(vue-tsc@2.2.0(typescript@5.7.3))(vue@3.5.13(typescript@5.7.3)) vitest: specifier: 3.0.5 - version: 3.0.5(@types/debug@4.1.12)(@types/node@22.13.1)(happy-dom@17.0.2)(jiti@2.4.2)(sass@1.78.0)(terser@5.32.0)(tsx@4.19.2)(yaml@2.7.0) + version: 3.0.5(@types/debug@4.1.12)(@types/node@22.13.1)(happy-dom@17.0.4)(jiti@2.4.2)(sass@1.78.0)(terser@5.32.0)(tsx@4.19.2)(yaml@2.7.0) vitest-environment-nuxt: specifier: 1.0.1 - version: 1.0.1(@testing-library/vue@8.1.0(@vue/compiler-sfc@3.5.13)(vue@3.5.13(typescript@5.7.3)))(@types/node@22.13.1)(@vue/test-utils@2.4.6)(happy-dom@17.0.2)(jiti@2.4.2)(magicast@0.3.5)(playwright-core@1.50.1)(terser@5.32.0)(tsx@4.19.2)(typescript@5.7.3)(vitest@3.0.5(@types/debug@4.1.12)(@types/node@22.13.1)(happy-dom@17.0.2)(jiti@2.4.2)(terser@5.32.0)(tsx@4.19.2)(yaml@2.7.0))(yaml@2.7.0) + version: 1.0.1(@testing-library/vue@8.1.0(@vue/compiler-sfc@3.5.13)(vue@3.5.13(typescript@5.7.3)))(@types/node@22.13.1)(@vue/test-utils@2.4.6)(happy-dom@17.0.4)(jiti@2.4.2)(magicast@0.3.5)(playwright-core@1.50.1)(terser@5.32.0)(tsx@4.19.2)(typescript@5.7.3)(vitest@3.0.5(@types/debug@4.1.12)(@types/node@22.13.1)(happy-dom@17.0.4)(jiti@2.4.2)(terser@5.32.0)(tsx@4.19.2)(yaml@2.7.0))(yaml@2.7.0) vue: specifier: 3.5.13 version: 3.5.13(typescript@5.7.3) @@ -232,8 +234,8 @@ importers: packages/kit: dependencies: c12: - specifier: 2.0.1 - version: 2.0.1(magicast@0.3.5) + specifier: 2.0.2 + version: 2.0.2(magicast@0.3.5) consola: specifier: ^3.4.0 version: 3.4.0 @@ -286,8 +288,8 @@ importers: specifier: ^2.4.1 version: 2.4.1 unimport: - specifier: 4.1.0 - version: 4.1.0 + specifier: 4.1.1 + version: 4.1.1 untyped: specifier: ^1.5.2 version: 1.5.2 @@ -296,8 +298,8 @@ importers: specifier: workspace:* version: link:../schema '@rspack/core': - specifier: 1.2.2 - version: 1.2.2 + specifier: 1.2.3 + version: 1.2.3 '@types/semver': specifier: 7.5.8 version: 7.5.8 @@ -312,7 +314,7 @@ importers: version: 6.1.0(@types/node@22.13.1)(jiti@2.4.2)(sass@1.78.0)(terser@5.32.0)(tsx@4.19.2)(yaml@2.7.0) vitest: specifier: 3.0.5 - version: 3.0.5(@types/debug@4.1.12)(@types/node@22.13.1)(happy-dom@17.0.2)(jiti@2.4.2)(sass@1.78.0)(terser@5.32.0)(tsx@4.19.2)(yaml@2.7.0) + version: 3.0.5(@types/debug@4.1.12)(@types/node@22.13.1)(happy-dom@17.0.4)(jiti@2.4.2)(sass@1.78.0)(terser@5.32.0)(tsx@4.19.2)(yaml@2.7.0) webpack: specifier: 5.97.1 version: 5.97.1 @@ -335,17 +337,26 @@ importers: specifier: workspace:* version: link:../schema '@nuxt/telemetry': - specifier: ^2.6.4 - version: 2.6.4 + specifier: ^2.6.5 + version: 2.6.5 '@nuxt/vite-builder': specifier: workspace:* version: link:../vite '@types/node': specifier: 22.13.1 version: 22.13.1 + '@unhead/dom': + specifier: 1.11.18 + version: 1.11.18 + '@unhead/shared': + specifier: 1.11.18 + version: 1.11.18 + '@unhead/ssr': + specifier: 1.11.18 + version: 1.11.18 '@unhead/vue': - specifier: 2.0.0-alpha.8 - version: 2.0.0-alpha.8(vue@3.5.13(typescript@5.7.3)) + specifier: 1.11.18 + version: 1.11.18(vue@3.5.13(typescript@5.7.3)) '@vue/shared': specifier: 3.5.13 version: 3.5.13 @@ -353,8 +364,8 @@ importers: specifier: 8.14.0 version: 8.14.0 c12: - specifier: 2.0.1 - version: 2.0.1(magicast@0.3.5) + specifier: 2.0.2 + version: 2.0.2(magicast@0.3.5) chokidar: specifier: ^4.0.3 version: 4.0.3 @@ -478,12 +489,15 @@ importers: unenv: specifier: ^1.10.0 version: 1.10.0 + unhead: + specifier: 1.11.18 + version: 1.11.18 unimport: - specifier: 4.1.0 - version: 4.1.0 + specifier: 4.1.1 + version: 4.1.1 unplugin: - specifier: ^2.1.2 - version: 2.1.2 + specifier: ^2.2.0 + version: 2.2.0 unplugin-vue-router: specifier: ^0.11.2 version: 0.11.2(rollup@4.34.6)(vue-router@4.5.0(vue@3.5.13(typescript@5.7.3)))(vue@3.5.13(typescript@5.7.3)) @@ -508,7 +522,7 @@ importers: devDependencies: '@nuxt/scripts': specifier: 0.10.1 - version: 0.10.1(@types/google.maps@3.58.1)(@types/vimeo__player@2.18.3)(@types/youtube@0.1.0)(@unhead/vue@2.0.0-alpha.8(vue@3.5.13(typescript@5.7.3)))(typescript@5.7.3) + version: 0.10.1(@types/google.maps@3.58.1)(@types/vimeo__player@2.18.3)(@types/youtube@0.1.0)(@unhead/vue@1.11.18(vue@3.5.13(typescript@5.7.3)))(typescript@5.7.3) '@parcel/watcher': specifier: 2.5.1 version: 2.5.1 @@ -529,7 +543,7 @@ importers: version: 6.1.0(@types/node@22.13.1)(jiti@2.4.2)(sass@1.78.0)(terser@5.32.0)(tsx@4.19.2)(yaml@2.7.0) vitest: specifier: 3.0.5 - version: 3.0.5(@types/debug@4.1.12)(@types/node@22.13.1)(happy-dom@17.0.2)(jiti@2.4.2)(sass@1.78.0)(terser@5.32.0)(tsx@4.19.2)(yaml@2.7.0) + version: 3.0.5(@types/debug@4.1.12)(@types/node@22.13.1)(happy-dom@17.0.4)(jiti@2.4.2)(sass@1.78.0)(terser@5.32.0)(tsx@4.19.2)(yaml@2.7.0) packages/rspack: dependencies: @@ -540,26 +554,26 @@ importers: specifier: workspace:* version: link:../kit '@rspack/core': - specifier: ^1.2.2 - version: 1.2.2 + specifier: ^1.2.3 + version: 1.2.3 autoprefixer: specifier: ^10.4.20 - version: 10.4.20(postcss@8.5.1) + version: 10.4.20(postcss@8.5.2) css-loader: specifier: ^7.1.2 - version: 7.1.2(@rspack/core@1.2.2)(webpack@5.97.1) + version: 7.1.2(@rspack/core@1.2.3)(webpack@5.97.1) css-minimizer-webpack-plugin: specifier: ^7.0.0 version: 7.0.0(webpack@5.97.1) cssnano: specifier: ^7.0.6 - version: 7.0.6(postcss@8.5.1) + version: 7.0.6(postcss@8.5.2) defu: specifier: ^6.1.4 version: 6.1.4 esbuild-loader: - specifier: ^4.2.2 - version: 4.2.2(webpack@5.97.1) + specifier: ^4.3.0 + version: 4.3.0(webpack@5.97.1) escape-string-regexp: specifier: ^5.0.0 version: 5.0.0 @@ -597,20 +611,20 @@ importers: specifier: ^6.1.0 version: 6.1.0 postcss: - specifier: 8.5.1 - version: 8.5.1 + specifier: 8.5.2 + version: 8.5.2 postcss-import: specifier: ^16.1.0 - version: 16.1.0(postcss@8.5.1) + version: 16.1.0(postcss@8.5.2) postcss-import-resolver: specifier: ^2.0.0 version: 2.0.0 postcss-loader: specifier: ^8.1.1 - version: 8.1.1(@rspack/core@1.2.2)(postcss@8.5.1)(typescript@5.7.3)(webpack@5.97.1) + version: 8.1.1(@rspack/core@1.2.3)(postcss@8.5.2)(typescript@5.7.3)(webpack@5.97.1) postcss-url: specifier: ^10.1.3 - version: 10.1.3(postcss@8.5.1) + version: 10.1.3(postcss@8.5.2) pug-plain-loader: specifier: ^1.1.0 version: 1.1.0(pug@3.0.3) @@ -627,8 +641,8 @@ importers: specifier: ^1.10.0 version: 1.10.0 unplugin: - specifier: ^2.1.2 - version: 2.1.2 + specifier: ^2.2.0 + version: 2.2.0 url-loader: specifier: ^4.1.1 version: 4.1.1(file-loader@6.2.0(webpack@5.97.1))(webpack@5.97.1) @@ -649,7 +663,7 @@ importers: version: 2.26.1 webpackbar: specifier: ^7.0.0 - version: 7.0.0(@rspack/core@1.2.2)(webpack@5.97.1) + version: 7.0.0(@rspack/core@1.2.3)(webpack@5.97.1) devDependencies: '@nuxt/schema': specifier: workspace:* @@ -691,9 +705,18 @@ importers: '@types/pug': specifier: 2.0.10 version: 2.0.10 + '@types/rollup-plugin-visualizer': + specifier: 4.2.4 + version: 4.2.4 + '@types/webpack-bundle-analyzer': + specifier: 4.7.0 + version: 4.7.0(esbuild@0.25.0) + '@types/webpack-hot-middleware': + specifier: 2.25.9 + version: 2.25.9(esbuild@0.25.0) '@unhead/schema': - specifier: 2.0.0-alpha.9 - version: 2.0.0-alpha.9 + specifier: 1.11.18 + version: 1.11.18 '@vitejs/plugin-vue': specifier: 5.2.1 version: 5.2.1(vite@6.1.0(@types/node@22.13.1)(jiti@2.4.2)(terser@5.32.0)(tsx@4.19.2)(yaml@2.7.0))(vue@3.5.13(typescript@5.7.3)) @@ -710,20 +733,26 @@ importers: specifier: 2.2.0 version: 2.2.0(typescript@5.7.3) c12: - specifier: 2.0.1 - version: 2.0.1(magicast@0.3.5) + specifier: 2.0.2 + version: 2.0.2(magicast@0.3.5) chokidar: specifier: 4.0.3 version: 4.0.3 compatx: specifier: 0.1.8 version: 0.1.8 + css-minimizer-webpack-plugin: + specifier: 7.0.0 + version: 7.0.0(esbuild@0.25.0)(webpack@5.97.1(esbuild@0.25.0)) + esbuild: + specifier: 0.25.0 + version: 0.25.0 esbuild-loader: - specifier: 4.2.2 - version: 4.2.2(webpack@5.97.1) + specifier: 4.3.0 + version: 4.3.0(webpack@5.97.1(esbuild@0.25.0)) file-loader: specifier: 6.2.0 - version: 6.2.0(webpack@5.97.1) + version: 6.2.0(webpack@5.97.1(esbuild@0.25.0)) h3: specifier: npm:h3-nightly@1.14.0-20250122-114730-3f9e703 version: h3-nightly@1.14.0-20250122-114730-3f9e703 @@ -733,6 +762,9 @@ importers: ignore: specifier: 7.0.3 version: 7.0.3 + mini-css-extract-plugin: + specifier: 2.9.2 + version: 2.9.2(webpack@5.97.1(esbuild@0.25.0)) nitro: specifier: npm:nitro-nightly@3.0.0-beta-28969273.f7aa9de6 version: nitro-nightly@3.0.0-beta-28969273.f7aa9de6(typescript@5.7.3) @@ -742,9 +774,12 @@ importers: pkg-types: specifier: 1.3.1 version: 1.3.1 + postcss: + specifier: 8.5.2 + version: 8.5.2 sass-loader: specifier: 16.0.4 - version: 16.0.4(@rspack/core@1.2.2)(webpack@5.97.1) + version: 16.0.4(@rspack/core@1.2.3)(webpack@5.97.1(esbuild@0.25.0)) scule: specifier: 1.3.0 version: 1.3.0 @@ -755,8 +790,8 @@ importers: specifier: 2.4.1 version: 2.4.1 unimport: - specifier: 4.1.0 - version: 4.1.0 + specifier: 4.1.1 + version: 4.1.1 untyped: specifier: 1.5.2 version: 1.5.2 @@ -771,16 +806,16 @@ importers: version: 2.1.1 vue-loader: specifier: 17.4.2 - version: 17.4.2(@vue/compiler-sfc@3.5.13)(vue@3.5.13(typescript@5.7.3))(webpack@5.97.1) + version: 17.4.2(@vue/compiler-sfc@3.5.13)(vue@3.5.13(typescript@5.7.3))(webpack@5.97.1(esbuild@0.25.0)) vue-router: specifier: 4.5.0 version: 4.5.0(vue@3.5.13(typescript@5.7.3)) webpack: specifier: 5.97.1 - version: 5.97.1 + version: 5.97.1(esbuild@0.25.0) webpack-dev-middleware: specifier: 7.4.2 - version: 7.4.2(webpack@5.97.1) + version: 7.4.2(webpack@5.97.1(esbuild@0.25.0)) packages/ui-templates: devDependencies: @@ -792,10 +827,10 @@ importers: version: 0.2.0 html-validate: specifier: 9.2.1 - version: 9.2.1(vitest@3.0.5(@types/debug@4.1.12)(@types/node@22.13.1)(happy-dom@17.0.2)(jiti@2.4.2)(sass@1.78.0)(terser@5.32.0)(tsx@4.19.2)(yaml@2.7.0)) + version: 9.2.1(vitest@3.0.5(@types/debug@4.1.12)(@types/node@22.13.1)(happy-dom@17.0.4)(jiti@2.4.2)(sass@1.78.0)(terser@5.32.0)(tsx@4.19.2)(yaml@2.7.0)) htmlnano: specifier: 2.1.1 - version: 2.1.1(cssnano@7.0.6(postcss@8.5.1))(postcss@8.5.1)(relateurl@0.2.7)(svgo@3.3.2)(terser@5.32.0)(typescript@5.7.3) + version: 2.1.1(cssnano@7.0.6(postcss@8.5.2))(postcss@8.5.2)(relateurl@0.2.7)(svgo@3.3.2)(terser@5.32.0)(typescript@5.7.3) jiti: specifier: 2.4.2 version: 2.4.2 @@ -806,8 +841,8 @@ importers: specifier: 2.0.2 version: 2.0.2 prettier: - specifier: 3.4.2 - version: 3.4.2 + specifier: 3.5.0 + version: 3.5.0 scule: specifier: 1.3.0 version: 1.3.0 @@ -822,7 +857,7 @@ importers: version: 0.2.10 unocss: specifier: 65.4.3 - version: 65.4.3(postcss@8.5.1)(rollup@4.34.6)(vite@6.1.0(@types/node@22.13.1)(jiti@2.4.2)(sass@1.78.0)(terser@5.32.0)(tsx@4.19.2)(yaml@2.7.0))(vue@3.5.13(typescript@5.7.3)) + version: 65.4.3(postcss@8.5.2)(rollup@4.34.6)(vite@6.1.0(@types/node@22.13.1)(jiti@2.4.2)(sass@1.78.0)(terser@5.32.0)(tsx@4.19.2)(yaml@2.7.0))(vue@3.5.13(typescript@5.7.3)) vite: specifier: 6.1.0 version: 6.1.0(@types/node@22.13.1)(jiti@2.4.2)(sass@1.78.0)(terser@5.32.0)(tsx@4.19.2)(yaml@2.7.0) @@ -843,13 +878,13 @@ importers: version: 4.1.1(vite@6.1.0(@types/node@22.13.1)(jiti@2.4.2)(terser@5.32.0)(tsx@4.19.2)(yaml@2.7.0))(vue@3.5.13(typescript@5.7.3)) autoprefixer: specifier: ^10.4.20 - version: 10.4.20(postcss@8.5.1) + version: 10.4.20(postcss@8.5.2) consola: specifier: ^3.4.0 version: 3.4.0 cssnano: specifier: ^7.0.6 - version: 7.0.6(postcss@8.5.1) + version: 7.0.6(postcss@8.5.2) defu: specifier: ^6.1.4 version: 6.1.4 @@ -859,9 +894,6 @@ importers: escape-string-regexp: specifier: ^5.0.0 version: 5.0.0 - externality: - specifier: ^1.0.2 - version: 1.0.2 get-port-please: specifier: ^3.1.2 version: 3.1.2 @@ -887,8 +919,8 @@ importers: specifier: ^1.3.1 version: 1.3.1 postcss: - specifier: 8.5.1 - version: 8.5.1 + specifier: 8.5.2 + version: 8.5.2 rollup-plugin-visualizer: specifier: ^5.14.0 version: 5.14.0(rollup@4.34.6) @@ -902,8 +934,8 @@ importers: specifier: ^1.10.0 version: 1.10.0 unplugin: - specifier: ^2.1.2 - version: 2.1.2 + specifier: ^2.2.0 + version: 2.2.0 vite: specifier: 6.1.0 version: 6.1.0(@types/node@22.13.1)(jiti@2.4.2)(sass@1.78.0)(terser@5.32.0)(tsx@4.19.2)(yaml@2.7.0) @@ -912,7 +944,7 @@ importers: version: 3.0.5(@types/node@22.13.1)(jiti@2.4.2)(sass@1.78.0)(terser@5.32.0)(tsx@4.19.2)(yaml@2.7.0) vite-plugin-checker: specifier: ^0.8.0 - version: 0.8.0(eslint@9.20.0(jiti@2.4.2))(optionator@0.9.4)(typescript@5.7.3)(vite@6.1.0(@types/node@22.13.1)(jiti@2.4.2)(terser@5.32.0)(tsx@4.19.2)(yaml@2.7.0))(vue-tsc@2.1.10(typescript@5.7.3)) + version: 0.8.0(eslint@9.20.1(jiti@2.4.2))(optionator@0.9.4)(typescript@5.7.3)(vite@6.1.0(@types/node@22.13.1)(jiti@2.4.2)(terser@5.32.0)(tsx@4.19.2)(yaml@2.7.0))(vue-tsc@2.1.10(typescript@5.7.3)) vue-bundle-renderer: specifier: ^2.1.1 version: 2.1.1 @@ -940,22 +972,22 @@ importers: version: link:../kit autoprefixer: specifier: ^10.4.20 - version: 10.4.20(postcss@8.5.1) + version: 10.4.20(postcss@8.5.2) css-loader: specifier: ^7.1.2 - version: 7.1.2(@rspack/core@1.2.2)(webpack@5.97.1) + version: 7.1.2(@rspack/core@1.2.3)(webpack@5.97.1) css-minimizer-webpack-plugin: specifier: ^7.0.0 version: 7.0.0(webpack@5.97.1) cssnano: specifier: ^7.0.6 - version: 7.0.6(postcss@8.5.1) + version: 7.0.6(postcss@8.5.2) defu: specifier: ^6.1.4 version: 6.1.4 esbuild-loader: - specifier: ^4.2.2 - version: 4.2.2(webpack@5.97.1) + specifier: ^4.3.0 + version: 4.3.0(webpack@5.97.1) escape-string-regexp: specifier: ^5.0.0 version: 5.0.0 @@ -996,20 +1028,20 @@ importers: specifier: ^6.1.0 version: 6.1.0 postcss: - specifier: 8.5.1 - version: 8.5.1 + specifier: 8.5.2 + version: 8.5.2 postcss-import: specifier: ^16.1.0 - version: 16.1.0(postcss@8.5.1) + version: 16.1.0(postcss@8.5.2) postcss-import-resolver: specifier: ^2.0.0 version: 2.0.0 postcss-loader: specifier: ^8.1.1 - version: 8.1.1(@rspack/core@1.2.2)(postcss@8.5.1)(typescript@5.7.3)(webpack@5.97.1) + version: 8.1.1(@rspack/core@1.2.3)(postcss@8.5.2)(typescript@5.7.3)(webpack@5.97.1) postcss-url: specifier: ^10.1.3 - version: 10.1.3(postcss@8.5.1) + version: 10.1.3(postcss@8.5.2) pug-plain-loader: specifier: ^1.1.0 version: 1.1.0(pug@3.0.3) @@ -1026,8 +1058,8 @@ importers: specifier: ^1.10.0 version: 1.10.0 unplugin: - specifier: ^2.1.2 - version: 2.1.2 + specifier: ^2.2.0 + version: 2.2.0 url-loader: specifier: ^4.1.1 version: 4.1.1(file-loader@6.2.0(webpack@5.97.1))(webpack@5.97.1) @@ -1051,14 +1083,14 @@ importers: version: 2.26.1 webpackbar: specifier: ^7.0.0 - version: 7.0.0(@rspack/core@1.2.2)(webpack@5.97.1) + version: 7.0.0(@rspack/core@1.2.3)(webpack@5.97.1) devDependencies: '@nuxt/schema': specifier: workspace:* version: link:../schema '@rspack/core': - specifier: 1.2.2 - version: 1.2.2 + specifier: 1.2.3 + version: 1.2.3 '@types/pify': specifier: 5.0.4 version: 5.0.4 @@ -1107,7 +1139,7 @@ importers: version: 1.5.4 unplugin: specifier: latest - version: 2.1.2 + version: 2.2.0 vue: specifier: 3.5.13 version: 3.5.13(typescript@5.7.3) @@ -1126,7 +1158,7 @@ importers: version: 0.11.2(rollup@4.34.6)(vue-router@4.5.0(vue@3.5.13(typescript@5.7.3)))(vue@3.5.13(typescript@5.7.3)) vitest: specifier: latest - version: 3.0.5(@types/debug@4.1.12)(@types/node@22.13.1)(happy-dom@17.0.2)(jiti@2.4.2)(sass@1.78.0)(terser@5.32.0)(tsx@4.19.2)(yaml@2.7.0) + version: 3.0.5(@types/debug@4.1.12)(@types/node@22.13.1)(happy-dom@17.0.4)(jiti@2.4.2)(sass@1.78.0)(terser@5.32.0)(tsx@4.19.2)(yaml@2.7.0) vue: specifier: 3.5.13 version: 3.5.13(typescript@5.7.3) @@ -1395,12 +1427,6 @@ packages: resolution: {integrity: sha512-xjZTSFgECpb9Ohuk5yMX5RhUEbfeQcuOp8IF60e+wyzWEF0M5xeSgqsfLtvPEX8BIyOX9saZqzuGPmZ8oWc+5Q==} engines: {node: '>=16'} - '@esbuild/aix-ppc64@0.21.5': - resolution: {integrity: sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==} - engines: {node: '>=12'} - cpu: [ppc64] - os: [aix] - '@esbuild/aix-ppc64@0.23.1': resolution: {integrity: sha512-6VhYk1diRqrhBAqpJEdjASR/+WVRtfjpqKuNw11cLiaWpAT/Uu+nokB+UJnevzy/P9C/ty6AOe0dwueMrGh/iQ==} engines: {node: '>=18'} @@ -1419,12 +1445,6 @@ packages: cpu: [ppc64] os: [aix] - '@esbuild/android-arm64@0.21.5': - resolution: {integrity: sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==} - engines: {node: '>=12'} - cpu: [arm64] - os: [android] - '@esbuild/android-arm64@0.23.1': resolution: {integrity: sha512-xw50ipykXcLstLeWH7WRdQuysJqejuAGPd30vd1i5zSyKK3WE+ijzHmLKxdiCMtH1pHz78rOg0BKSYOSB/2Khw==} engines: {node: '>=18'} @@ -1443,12 +1463,6 @@ packages: cpu: [arm64] os: [android] - '@esbuild/android-arm@0.21.5': - resolution: {integrity: sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==} - engines: {node: '>=12'} - cpu: [arm] - os: [android] - '@esbuild/android-arm@0.23.1': resolution: {integrity: sha512-uz6/tEy2IFm9RYOyvKl88zdzZfwEfKZmnX9Cj1BHjeSGNuGLuMD1kR8y5bteYmwqKm1tj8m4cb/aKEorr6fHWQ==} engines: {node: '>=18'} @@ -1467,12 +1481,6 @@ packages: cpu: [arm] os: [android] - '@esbuild/android-x64@0.21.5': - resolution: {integrity: sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==} - engines: {node: '>=12'} - cpu: [x64] - os: [android] - '@esbuild/android-x64@0.23.1': resolution: {integrity: sha512-nlN9B69St9BwUoB+jkyU090bru8L0NA3yFvAd7k8dNsVH8bi9a8cUAUSEcEEgTp2z3dbEDGJGfP6VUnkQnlReg==} engines: {node: '>=18'} @@ -1491,12 +1499,6 @@ packages: cpu: [x64] os: [android] - '@esbuild/darwin-arm64@0.21.5': - resolution: {integrity: sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==} - engines: {node: '>=12'} - cpu: [arm64] - os: [darwin] - '@esbuild/darwin-arm64@0.23.1': resolution: {integrity: sha512-YsS2e3Wtgnw7Wq53XXBLcV6JhRsEq8hkfg91ESVadIrzr9wO6jJDMZnCQbHm1Guc5t/CdDiFSSfWP58FNuvT3Q==} engines: {node: '>=18'} @@ -1515,12 +1517,6 @@ packages: cpu: [arm64] os: [darwin] - '@esbuild/darwin-x64@0.21.5': - resolution: {integrity: sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==} - engines: {node: '>=12'} - cpu: [x64] - os: [darwin] - '@esbuild/darwin-x64@0.23.1': resolution: {integrity: sha512-aClqdgTDVPSEGgoCS8QDG37Gu8yc9lTHNAQlsztQ6ENetKEO//b8y31MMu2ZaPbn4kVsIABzVLXYLhCGekGDqw==} engines: {node: '>=18'} @@ -1539,12 +1535,6 @@ packages: cpu: [x64] os: [darwin] - '@esbuild/freebsd-arm64@0.21.5': - resolution: {integrity: sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==} - engines: {node: '>=12'} - cpu: [arm64] - os: [freebsd] - '@esbuild/freebsd-arm64@0.23.1': resolution: {integrity: sha512-h1k6yS8/pN/NHlMl5+v4XPfikhJulk4G+tKGFIOwURBSFzE8bixw1ebjluLOjfwtLqY0kewfjLSrO6tN2MgIhA==} engines: {node: '>=18'} @@ -1563,12 +1553,6 @@ packages: cpu: [arm64] os: [freebsd] - '@esbuild/freebsd-x64@0.21.5': - resolution: {integrity: sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==} - engines: {node: '>=12'} - cpu: [x64] - os: [freebsd] - '@esbuild/freebsd-x64@0.23.1': resolution: {integrity: sha512-lK1eJeyk1ZX8UklqFd/3A60UuZ/6UVfGT2LuGo3Wp4/z7eRTRYY+0xOu2kpClP+vMTi9wKOfXi2vjUpO1Ro76g==} engines: {node: '>=18'} @@ -1587,12 +1571,6 @@ packages: cpu: [x64] os: [freebsd] - '@esbuild/linux-arm64@0.21.5': - resolution: {integrity: sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==} - engines: {node: '>=12'} - cpu: [arm64] - os: [linux] - '@esbuild/linux-arm64@0.23.1': resolution: {integrity: sha512-/93bf2yxencYDnItMYV/v116zff6UyTjo4EtEQjUBeGiVpMmffDNUyD9UN2zV+V3LRV3/on4xdZ26NKzn6754g==} engines: {node: '>=18'} @@ -1611,12 +1589,6 @@ packages: cpu: [arm64] os: [linux] - '@esbuild/linux-arm@0.21.5': - resolution: {integrity: sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==} - engines: {node: '>=12'} - cpu: [arm] - os: [linux] - '@esbuild/linux-arm@0.23.1': resolution: {integrity: sha512-CXXkzgn+dXAPs3WBwE+Kvnrf4WECwBdfjfeYHpMeVxWE0EceB6vhWGShs6wi0IYEqMSIzdOF1XjQ/Mkm5d7ZdQ==} engines: {node: '>=18'} @@ -1635,12 +1607,6 @@ packages: cpu: [arm] os: [linux] - '@esbuild/linux-ia32@0.21.5': - resolution: {integrity: sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==} - engines: {node: '>=12'} - cpu: [ia32] - os: [linux] - '@esbuild/linux-ia32@0.23.1': resolution: {integrity: sha512-VTN4EuOHwXEkXzX5nTvVY4s7E/Krz7COC8xkftbbKRYAl96vPiUssGkeMELQMOnLOJ8k3BY1+ZY52tttZnHcXQ==} engines: {node: '>=18'} @@ -1659,12 +1625,6 @@ packages: cpu: [ia32] os: [linux] - '@esbuild/linux-loong64@0.21.5': - resolution: {integrity: sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==} - engines: {node: '>=12'} - cpu: [loong64] - os: [linux] - '@esbuild/linux-loong64@0.23.1': resolution: {integrity: sha512-Vx09LzEoBa5zDnieH8LSMRToj7ir/Jeq0Gu6qJ/1GcBq9GkfoEAoXvLiW1U9J1qE/Y/Oyaq33w5p2ZWrNNHNEw==} engines: {node: '>=18'} @@ -1683,12 +1643,6 @@ packages: cpu: [loong64] os: [linux] - '@esbuild/linux-mips64el@0.21.5': - resolution: {integrity: sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==} - engines: {node: '>=12'} - cpu: [mips64el] - os: [linux] - '@esbuild/linux-mips64el@0.23.1': resolution: {integrity: sha512-nrFzzMQ7W4WRLNUOU5dlWAqa6yVeI0P78WKGUo7lg2HShq/yx+UYkeNSE0SSfSure0SqgnsxPvmAUu/vu0E+3Q==} engines: {node: '>=18'} @@ -1707,12 +1661,6 @@ packages: cpu: [mips64el] os: [linux] - '@esbuild/linux-ppc64@0.21.5': - resolution: {integrity: sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==} - engines: {node: '>=12'} - cpu: [ppc64] - os: [linux] - '@esbuild/linux-ppc64@0.23.1': resolution: {integrity: sha512-dKN8fgVqd0vUIjxuJI6P/9SSSe/mB9rvA98CSH2sJnlZ/OCZWO1DJvxj8jvKTfYUdGfcq2dDxoKaC6bHuTlgcw==} engines: {node: '>=18'} @@ -1731,12 +1679,6 @@ packages: cpu: [ppc64] os: [linux] - '@esbuild/linux-riscv64@0.21.5': - resolution: {integrity: sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==} - engines: {node: '>=12'} - cpu: [riscv64] - os: [linux] - '@esbuild/linux-riscv64@0.23.1': resolution: {integrity: sha512-5AV4Pzp80fhHL83JM6LoA6pTQVWgB1HovMBsLQ9OZWLDqVY8MVobBXNSmAJi//Csh6tcY7e7Lny2Hg1tElMjIA==} engines: {node: '>=18'} @@ -1755,12 +1697,6 @@ packages: cpu: [riscv64] os: [linux] - '@esbuild/linux-s390x@0.21.5': - resolution: {integrity: sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==} - engines: {node: '>=12'} - cpu: [s390x] - os: [linux] - '@esbuild/linux-s390x@0.23.1': resolution: {integrity: sha512-9ygs73tuFCe6f6m/Tb+9LtYxWR4c9yg7zjt2cYkjDbDpV/xVn+68cQxMXCjUpYwEkze2RcU/rMnfIXNRFmSoDw==} engines: {node: '>=18'} @@ -1779,12 +1715,6 @@ packages: cpu: [s390x] os: [linux] - '@esbuild/linux-x64@0.21.5': - resolution: {integrity: sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==} - engines: {node: '>=12'} - cpu: [x64] - os: [linux] - '@esbuild/linux-x64@0.23.1': resolution: {integrity: sha512-EV6+ovTsEXCPAp58g2dD68LxoP/wK5pRvgy0J/HxPGB009omFPv3Yet0HiaqvrIrgPTBuC6wCH1LTOY91EO5hQ==} engines: {node: '>=18'} @@ -1815,12 +1745,6 @@ packages: cpu: [arm64] os: [netbsd] - '@esbuild/netbsd-x64@0.21.5': - resolution: {integrity: sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==} - engines: {node: '>=12'} - cpu: [x64] - os: [netbsd] - '@esbuild/netbsd-x64@0.23.1': resolution: {integrity: sha512-aevEkCNu7KlPRpYLjwmdcuNz6bDFiE7Z8XC4CPqExjTvrHugh28QzUXVOZtiYghciKUacNktqxdpymplil1beA==} engines: {node: '>=18'} @@ -1857,12 +1781,6 @@ packages: cpu: [arm64] os: [openbsd] - '@esbuild/openbsd-x64@0.21.5': - resolution: {integrity: sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==} - engines: {node: '>=12'} - cpu: [x64] - os: [openbsd] - '@esbuild/openbsd-x64@0.23.1': resolution: {integrity: sha512-aY2gMmKmPhxfU+0EdnN+XNtGbjfQgwZj43k8G3fyrDM/UdZww6xrWxmDkuz2eCZchqVeABjV5BpildOrUbBTqA==} engines: {node: '>=18'} @@ -1881,12 +1799,6 @@ packages: cpu: [x64] os: [openbsd] - '@esbuild/sunos-x64@0.21.5': - resolution: {integrity: sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==} - engines: {node: '>=12'} - cpu: [x64] - os: [sunos] - '@esbuild/sunos-x64@0.23.1': resolution: {integrity: sha512-RBRT2gqEl0IKQABT4XTj78tpk9v7ehp+mazn2HbUeZl1YMdaGAQqhapjGTCe7uw7y0frDi4gS0uHzhvpFuI1sA==} engines: {node: '>=18'} @@ -1905,12 +1817,6 @@ packages: cpu: [x64] os: [sunos] - '@esbuild/win32-arm64@0.21.5': - resolution: {integrity: sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==} - engines: {node: '>=12'} - cpu: [arm64] - os: [win32] - '@esbuild/win32-arm64@0.23.1': resolution: {integrity: sha512-4O+gPR5rEBe2FpKOVyiJ7wNDPA8nGzDuJ6gN4okSA1gEOYZ67N8JPk58tkWtdtPeLz7lBnY6I5L3jdsr3S+A6A==} engines: {node: '>=18'} @@ -1929,12 +1835,6 @@ packages: cpu: [arm64] os: [win32] - '@esbuild/win32-ia32@0.21.5': - resolution: {integrity: sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==} - engines: {node: '>=12'} - cpu: [ia32] - os: [win32] - '@esbuild/win32-ia32@0.23.1': resolution: {integrity: sha512-BcaL0Vn6QwCwre3Y717nVHZbAa4UBEigzFm6VdsVdT/MbZ38xoj1X9HPkZhbmaBGUD1W8vxAfffbDe8bA6AKnQ==} engines: {node: '>=18'} @@ -1953,12 +1853,6 @@ packages: cpu: [ia32] os: [win32] - '@esbuild/win32-x64@0.21.5': - resolution: {integrity: sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==} - engines: {node: '>=12'} - cpu: [x64] - os: [win32] - '@esbuild/win32-x64@0.23.1': resolution: {integrity: sha512-BHpFFeslkWrXWyUPnbKm+xYYVYruCinGcftSBaa8zoF9hZO4BcSCFUvHVTtzpIY6YzUnYtuEhZ+C9iEXjxnasg==} engines: {node: '>=18'} @@ -2247,7 +2141,7 @@ packages: '@types/google.maps': ^3.58.1 '@types/vimeo__player': ^2.18.3 '@types/youtube': ^0.1.0 - '@unhead/vue': 2.0.0-alpha.8 + '@unhead/vue': 1.11.18 peerDependenciesMeta: '@stripe/stripe-js': optional: true @@ -2258,9 +2152,9 @@ packages: '@types/youtube': optional: true - '@nuxt/telemetry@2.6.4': - resolution: {integrity: sha512-2Lgdn07Suraly5dSfVQ4ttBQBMtmjvCTGKGUHpc1UyH87HT9xCm3KLFO0UcVQ8+LNYCgoOaK7lq9qDJOfBfZ5A==} - engines: {node: '>=18.20.5'} + '@nuxt/telemetry@2.6.5': + resolution: {integrity: sha512-lwMp9OHML/m0mjh7P5iz9PxINnk5smGkGebh88Wh8PjvnRooY1TBsbyq7mlSrNibpwD1BkwqhV5IAZOXWHLxMQ==} + engines: {node: '>=18.12.0'} hasBin: true '@nuxt/test-utils@3.15.4': @@ -2680,56 +2574,56 @@ packages: cpu: [x64] os: [win32] - '@rspack/binding-darwin-arm64@1.2.2': - resolution: {integrity: sha512-h23F8zEkXWhwMeScm0ZnN78Zh7hCDalxIWsm7bBS0eKadnlegUDwwCF8WE+8NjWr7bRzv0p3QBWlS5ufkcL4eA==} + '@rspack/binding-darwin-arm64@1.2.3': + resolution: {integrity: sha512-xuwYzhPgNCr4BtKXCU3xe4249TFsXAZglIlbxv8Qs3PeIarrZMRddcqH2zUXi+nJavNw3yN12sCYEzk1f+O4FQ==} cpu: [arm64] os: [darwin] - '@rspack/binding-darwin-x64@1.2.2': - resolution: {integrity: sha512-vG5s7FkEvwrGLfksyDRHwKAHUkhZt1zHZZXJQn4gZKjTBonje8ezdc7IFlDiWpC4S+oBYp73nDWkUzkGRbSdcQ==} + '@rspack/binding-darwin-x64@1.2.3': + resolution: {integrity: sha512-afiIN8elcrO2EtO27UN0qyZqu5FXGUdclud56DrhvEfnWS3GGxJEdjA8XUYVXkfCYakdXHucIJKlkkgaAjEvHg==} cpu: [x64] os: [darwin] - '@rspack/binding-linux-arm64-gnu@1.2.2': - resolution: {integrity: sha512-VykY/kiYOzO8E1nYzfJ9+gQEHxb5B6lt5wa8M6xFi5B6jEGU+OsaGskmAZB9/GFImeFDHxDPvhUalI4R9p8O2Q==} + '@rspack/binding-linux-arm64-gnu@1.2.3': + resolution: {integrity: sha512-K2u/fPUmKujlKSWL3q2zaUu8/6ZK/bOGKcqJSib8jdanQQ/GFKwKtPAFOOa/vvqbzhDocqKOobFR10FhgJqCHg==} cpu: [arm64] os: [linux] - '@rspack/binding-linux-arm64-musl@1.2.2': - resolution: {integrity: sha512-Z5vAC4wGfXi8XXZ6hs8Q06TYjr3zHf819HB4DI5i4C1eQTeKdZSyoFD0NHFG23bP4NWJffp8KhmoObcy9jBT5Q==} + '@rspack/binding-linux-arm64-musl@1.2.3': + resolution: {integrity: sha512-mgovdzGb6cH9hQsjTyzDbfZWCPhTcoHcLro1P7UbiqcLPMDJp/k3Io9xV2/EJhaDA1aynIdq7XfY0fuk4+6Irw==} cpu: [arm64] os: [linux] - '@rspack/binding-linux-x64-gnu@1.2.2': - resolution: {integrity: sha512-o3pDaL+cH5EeRbDE9gZcdZpBgp5iXvYZBBhe8vZQllYgI4zN5MJEuleV7WplG3UwTXlgZg3Kht4RORSOPn96vg==} + '@rspack/binding-linux-x64-gnu@1.2.3': + resolution: {integrity: sha512-542lwJzB1RMGuVdBdA3cOWTlmL9okpOppHUBWcNCjmJM+9zTI+0jwjVe8HaqOqtuR8XzNsoCwT9QonU/GLcuhg==} cpu: [x64] os: [linux] - '@rspack/binding-linux-x64-musl@1.2.2': - resolution: {integrity: sha512-RE3e0xe4DdchHssttKzryDwjLkbrNk/4H59TkkWeGYJcLw41tmcOZVFQUOwKLUvXWVyif/vjvV/w1SMlqB4wQg==} + '@rspack/binding-linux-x64-musl@1.2.3': + resolution: {integrity: sha512-dJromiREDcTWqzfCOI5y1IVoYmUnCv7vCp63AEq0+13fJJdk7+pcNN3VV2jOKpk9VECSvjg1c01wl+UzXAXFMw==} cpu: [x64] os: [linux] - '@rspack/binding-win32-arm64-msvc@1.2.2': - resolution: {integrity: sha512-R+PKBYn6uzTaDdVqTHvjqiJPBr5ZHg1wg5UmFDLNH9OklzVFyQh1JInSdJRb7lzfzTRz6bEkkwUFBPQK/CGScw==} + '@rspack/binding-win32-arm64-msvc@1.2.3': + resolution: {integrity: sha512-S8ZKddMMQDGy8jx/R0i2m1XrmfY2CpI+t6lIEpsuZuKUR4MbOGKN2DuL4MDnT3m8JaYvC8ihsvQjBXQCy3SNxQ==} cpu: [arm64] os: [win32] - '@rspack/binding-win32-ia32-msvc@1.2.2': - resolution: {integrity: sha512-dBqz3sRAGZ2f31FgzKLDvIRfq2haRP3X3XVCT0PsiMcvt7QJng+26aYYMy2THatd/nM8IwExYeitHWeiMBoruw==} + '@rspack/binding-win32-ia32-msvc@1.2.3': + resolution: {integrity: sha512-74lqSMKQJcJcgfFaxm+G9YVJSl2KK9/v4fRoMsWApztNy2qNgee+UguNBCOU6JLa3rVSj8Z5OVVDtJkGFrSvVg==} cpu: [ia32] os: [win32] - '@rspack/binding-win32-x64-msvc@1.2.2': - resolution: {integrity: sha512-eeAvaN831KG553cMSHkVldyk6YQn4ujgRHov6r1wtREq7CD3/ka9LMkJUepCN85K7XtwYT0N4KpFIQyf5GTGoA==} + '@rspack/binding-win32-x64-msvc@1.2.3': + resolution: {integrity: sha512-fcU532PgFdd5Bil8jwQW0Dcb/80oM6V0qSstGIxZ4M77t4t8e/PcukXfORTL71FfNQ64Rd4Dp6XRl1NHNJVxeg==} cpu: [x64] os: [win32] - '@rspack/binding@1.2.2': - resolution: {integrity: sha512-GCZwpGFYlLTdJ2soPLwjw9z4LSZ+GdpbHNfBt3Cm/f/bAF8n6mZc7dHUqN893RFh7MPU17HNEL3fMw7XR+6pHg==} + '@rspack/binding@1.2.3': + resolution: {integrity: sha512-enpOXZPQOJO800wdWcR7H5Dx5UZfwkaT0D0xsHD53WbpI09Z2KJbLX7I/i1FLLy3K1KQTB+2FIHLVdRikasXZA==} - '@rspack/core@1.2.2': - resolution: {integrity: sha512-EeHAmY65Uj62hSbUKesbrcWGE7jfUI887RD03G++Gj8jS4WPHEu1TFODXNOXg6pa7zyIvs2BK0Bm16Kwz8AEaQ==} + '@rspack/core@1.2.3': + resolution: {integrity: sha512-BFgdUYf05/hjjY9Nlwq8DpWaRJN5w2kTl8ZJi20SRL60oAx+ZD2ABT+fsPhBiFSmfTZDdvGGIq5e3vfRzoIuqg==} engines: {node: '>=16.0.0'} peerDependencies: '@rspack/tracing': ^1.x @@ -2935,6 +2829,9 @@ packages: '@types/resolve@1.20.2': resolution: {integrity: sha512-60BCwRFOZCQhDncwQdxxeOEEkbc5dIMccYLwbxsS4TUNeVECQ/pBJ0j09mrHOl/JJvpRPGwO9SvE4nR2Nb/a4Q==} + '@types/rollup-plugin-visualizer@4.2.4': + resolution: {integrity: sha512-BW4Q6D1Qy5gno5qHWrnMDC2dOe/TAKXvqCpckOggCCu+XpS+ZZJJ1lq1+K3bvYccoO3Y7f5kglbFAgYGqCgULg==} + '@types/semver@7.5.8': resolution: {integrity: sha512-I8EUhyrgfLrcTkzV3TSsGyl1tSuPrEDzr0yd5m90UgNxQkyDXULk3b6MlQqTCpZpNtWe1K0hzclnZkTcLBe2UQ==} @@ -3020,14 +2917,20 @@ packages: '@ungap/structured-clone@1.2.0': resolution: {integrity: sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==} - '@unhead/schema@2.0.0-alpha.9': - resolution: {integrity: sha512-KNMPY8tpeJ0FvHlA+81q2QeFZJ7vMMg9TBBdQBudLsza1whSSHvmpxVJY8rw8GNpnXrvnRYspLNHKpDn69RJrA==} + '@unhead/dom@1.11.18': + resolution: {integrity: sha512-zQuJUw/et9zYEV0SZWTDX23IgurwMaXycAuxt4L6OgNL0T4TWP3a0J/Vm3Q02hmdNo/cPKeVBrwBdnFUXjGU4w==} - '@unhead/shared@2.0.0-alpha.9': - resolution: {integrity: sha512-Ex/BsuAVix8X8pLEQ4gxrEmTzN10WoCh0hs6OHXQqjkvoDCzJo2OdIoQoR1B245PSzVagZhJ+PJCfXtkm8BEVQ==} + '@unhead/schema@1.11.18': + resolution: {integrity: sha512-a3TA/OJCRdfbFhcA3Hq24k1ZU1o9szicESrw8DZcGyQFacHnh84mVgnyqSkMnwgCmfN4kvjSiTBlLEHS6+wATw==} - '@unhead/vue@2.0.0-alpha.8': - resolution: {integrity: sha512-pBh1QgDMPyx5xwOykMFOCV4+S9X2hIRZbfk3K0shyb61vPuMJVcy4aEYbQyMCy/LAbH1PyAUug5dW97QF758tw==} + '@unhead/shared@1.11.18': + resolution: {integrity: sha512-OsupRQRxJqqnuKiL1Guqipjbl7MndD5DofvmGa3PFGu2qNPmOmH2mxGFjRBBgq2XxY1KalIHl/2I9HV6gbK8cw==} + + '@unhead/ssr@1.11.18': + resolution: {integrity: sha512-uaHPz0RRAb18yKeCmHyHk5QKWRk/uHpOrqSbhRXTOhbrd3Ur3gGTVaAoyUoRYKGPU5B5/pyHh3TfLw0LkfrH1A==} + + '@unhead/vue@1.11.18': + resolution: {integrity: sha512-Jfi7t/XNBnlcauP9UTH3VHBcS69G70ikFd2e5zdgULLDRWpOlLs1sSTH1V2juNptc93DOk9RQfC5jLWbLcivFw==} peerDependencies: vue: 3.5.13 @@ -3061,7 +2964,7 @@ packages: resolution: {integrity: sha512-ZHlWfArfhhWBVhUeAETrtnD7nhqpfXv5muGrJCSDHmjgFJX8jtDa6rf52ICCFWEOe8p2dku7o27o26pGXYTYJg==} engines: {node: '>=14'} peerDependencies: - postcss: 8.5.1 + postcss: 8.5.2 '@unocss/preset-attributify@65.4.3': resolution: {integrity: sha512-kN8levkt+BwzzWKA6glthasuFt/Cplc70oxzAYd/gZcosxwDK5+MmxjGDG5aLLu2PA58tPHUZ+ltW/QG5BM+Xw==} @@ -3533,7 +3436,7 @@ packages: engines: {node: ^10 || ^12 || >=14} hasBin: true peerDependencies: - postcss: 8.5.1 + postcss: 8.5.2 available-typed-arrays@1.0.7: resolution: {integrity: sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==} @@ -3630,8 +3533,8 @@ packages: peerDependencies: esbuild: '>=0.18' - c12@2.0.1: - resolution: {integrity: sha512-Z4JgsKXHG37C6PYUtIxCfLJZvo6FyhHJoClwwb9ftUkLpPSkuYqn6Tr+vnaN8hymm0kIbcg6Ey3kv/Q71k5w/A==} + c12@2.0.2: + resolution: {integrity: sha512-NkvlL5CHZt9kPswJYDCUYtTaMt7JOfcpsnNncfj7sWsc13x6Wz+GiTpBtqZOojFlzyTHui8+OAfR6praV6PYaQ==} peerDependencies: magicast: ^0.3.5 peerDependenciesMeta: @@ -3936,7 +3839,7 @@ packages: resolution: {integrity: sha512-h70rUM+3PNFuaBDTLe8wF/cdWu+dOZmb7pJt8Z2sedYbAcQVQV/tEchueg3GWxwqS0cxtbxmaHEdkNACqcvsow==} engines: {node: ^14 || ^16 || >=18} peerDependencies: - postcss: 8.5.1 + postcss: 8.5.2 css-loader@7.1.2: resolution: {integrity: sha512-6WvYYn7l/XEGN8Xu2vWFt9nVzrCn39vKyTEFf/ExEyoksJjjSZV/0/35XPlMbpnr6VGhZIUg5yJrL8tGfes/FA==} @@ -4003,19 +3906,19 @@ packages: resolution: {integrity: sha512-ZzrgYupYxEvdGGuqL+JKOY70s7+saoNlHSCK/OGn1vB2pQK8KSET8jvenzItcY+kA7NoWvfbb/YhlzuzNKjOhQ==} engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} peerDependencies: - postcss: 8.5.1 + postcss: 8.5.2 cssnano-utils@5.0.0: resolution: {integrity: sha512-Uij0Xdxc24L6SirFr25MlwC2rCFX6scyUmuKpzI+JQ7cyqDEwD42fJ0xfB3yLfOnRDU5LKGgjQ9FA6LYh76GWQ==} engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} peerDependencies: - postcss: 8.5.1 + postcss: 8.5.2 cssnano@7.0.6: resolution: {integrity: sha512-54woqx8SCbp8HwvNZYn68ZFAepuouZW4lTwiMVnBErM3VkO7/Sd4oTOt3Zz3bPx3kxQ36aISppyXj2Md4lg8bw==} engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} peerDependencies: - postcss: 8.5.1 + postcss: 8.5.2 csso@5.0.5: resolution: {integrity: sha512-0LrrStPOdJj+SPCCrGhzryycLjwcgUSHBtxNA8aIDxf0GLsRh1cKYhB00Gd1lDOS4yGH69+SNn13+TWbVHETFQ==} @@ -4312,16 +4215,11 @@ packages: es-module-lexer@1.6.0: resolution: {integrity: sha512-qqnD1yMU6tk/jnaMosogGySTZP8YtUgAffA9nMN+E/rjxcfRQ6IEk7IiozUjgxKoFHBGjTLnrHB/YC45r/59EQ==} - esbuild-loader@4.2.2: - resolution: {integrity: sha512-Mdq/A1L8p37hkibp8jGFwuQTDSWhDmlueAefsrCPRwNWThEOlQmIglV7Gd6GE2mO5bt7ksfxKOMwkuY7jjVTXg==} + esbuild-loader@4.3.0: + resolution: {integrity: sha512-D7HeJNdkDKKMarPQO/3dlJT6RwN2YJO7ENU6RPlpOz5YxSHnUNi2yvW41Bckvi1EVwctIaLzlb0ni5ag2GINYA==} peerDependencies: webpack: ^4.40.0 || ^5.0.0 - esbuild@0.21.5: - resolution: {integrity: sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==} - engines: {node: '>=12'} - hasBin: true - esbuild@0.23.1: resolution: {integrity: sha512-VVNz/9Sa0bs5SELtn3f7qhJCDPCF5oMEl5cO9/SSinpE9hbPVvxbd572HH5AKiP7WD8INO53GgfDDhRjkylHEg==} engines: {node: '>=18'} @@ -4443,8 +4341,8 @@ packages: resolution: {integrity: sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - eslint@9.20.0: - resolution: {integrity: sha512-aL4F8167Hg4IvsW89ejnpTwx+B/UQRzJPGgbIOl+4XqffWsahVVsLEWoZvnrVuwpWmnRd7XeXmQI1zlKcFDteA==} + eslint@9.20.1: + resolution: {integrity: sha512-m1mM33o6dBUjxl2qb6wv6nGNwCAsns1eKtaQ4l/NPHeTvhiUPbtdfMyktxN4B3fgHIgsYh1VT3V9txblpQHq+g==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} hasBin: true peerDependencies: @@ -4514,9 +4412,6 @@ packages: extend@3.0.2: resolution: {integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==} - externality@1.0.2: - resolution: {integrity: sha512-LyExtJWKxtgVzmgtEHyQtLFpw1KFhQphF9nTG8TpAIVkiI/xQ3FJh75tRFLYl4hkn7BNIIdLJInuDAavX35pMw==} - fake-indexeddb@6.0.0: resolution: {integrity: sha512-YEboHE5VfopUclOck7LncgIqskAqnv4q0EWbYCaxKKjAvO93c+TJIaBuGy8CBFdbg9nKdpN3AuPRwVBJ4k7NrQ==} engines: {node: '>=18'} @@ -4793,8 +4688,8 @@ packages: h3-nightly@1.14.0-20250122-114730-3f9e703: resolution: {integrity: sha512-mAl1YHJq2fwAIVXBaDCQD9uIiAFs+Jl3uNg6vGFfHG8VPHzcEqFbImUE83wCLHYCxC68qSjEnkaDCRzO8SNQAA==} - happy-dom@17.0.2: - resolution: {integrity: sha512-PWXllOadphR7angD3ndG5/Ax3yg1PFRvnN8Zu+xVtRsZjJE4RtJF1RBeWN9JFvF5EJmHOCiekdYVTxJr2NBibA==} + happy-dom@17.0.4: + resolution: {integrity: sha512-yVo3MZnvsirE4pb/P+ipllK/lfCmxDiBoKaz9IU3uJkyDl7WYF1J9mJkNWkpKRyy7w2Y60mYz5ISpEtN9sfpUA==} engines: {node: '>=18.0.0'} has-bigints@1.0.2: @@ -4916,7 +4811,7 @@ packages: resolution: {integrity: sha512-kAERyg/LuNZYmdqgCdYvugyLWNFAm8MWXpQMz1pLpetmCbFwoMxvkSoaAMlFrOC4OKTWI4KlZGT/RsNxg4ghOw==} peerDependencies: cssnano: ^7.0.0 - postcss: 8.5.1 + postcss: 8.5.2 purgecss: ^6.0.0 relateurl: ^0.2.7 srcset: 5.0.1 @@ -4982,7 +4877,7 @@ packages: resolution: {integrity: sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==} engines: {node: ^10 || ^12 || >= 14} peerDependencies: - postcss: 8.5.1 + postcss: 8.5.2 ieee754@1.2.1: resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} @@ -5402,8 +5297,8 @@ packages: resolution: {integrity: sha512-dhG34DXATL5hSxJbIexCft8FChFXtmskoZYnoPWjXQuebWYCNkVeV3KkGegCK9CP1oswI/vQibS2GY7Em/sJJA==} engines: {node: '>= 8'} - knip@5.43.6: - resolution: {integrity: sha512-bUCFlg44imdV5vayYxu0pIAB373S8Ufjda0qaI9oRZDH6ltJFwUoAO2j7nafxDmo5G0ZeP4IiLAHqlc3wYIONQ==} + knip@5.44.0: + resolution: {integrity: sha512-j39v3LYCmU6P6HN/TG14bc0Dlthl12g6NogdEZHQdhlVS6BqfnGGS3ospYYwLill6Sdc68eptwGtThunqq7lxA==} engines: {node: '>=18.18.0'} hasBin: true peerDependencies: @@ -5489,6 +5384,7 @@ packages: lodash.isequal@4.5.0: resolution: {integrity: sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ==} + deprecated: This package is deprecated. Use require('node:util').isDeepStrictEqual instead. lodash.memoize@4.1.2: resolution: {integrity: sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==} @@ -6080,8 +5976,8 @@ packages: package-json-from-dist@1.0.0: resolution: {integrity: sha512-dATvCeZN/8wQsGywez1mzHtTlP22H8OEfPrVMLNr4/eGa+ijtLn/6M5f0dY8UKNrC2O9UCU6SSoG3qRKnt7STw==} - package-manager-detector@0.2.8: - resolution: {integrity: sha512-ts9KSdroZisdvKMWVAVCXiKqnqNfXz4+IbrBG8/BWx/TR5le+jfenvoBuIZ6UWM9nz47W7AbD9qYfAwfWMIwzA==} + package-manager-detector@0.2.9: + resolution: {integrity: sha512-+vYvA/Y31l8Zk8dwxHhL3JfTuHPm6tlxM2A3GeQyl7ovYnSp1+mzAxClxaOr0qO1TtPxbQxetI7v5XqKLJZk7Q==} packrup@0.1.2: resolution: {integrity: sha512-ZcKU7zrr5GlonoS9cxxrb5HVswGnyj6jQvwFBa6p5VFw7G71VAHcUKL5wyZSU/ECtPM/9gacWxy2KFQKt1gMNA==} @@ -6234,43 +6130,43 @@ packages: resolution: {integrity: sha512-DT/Wwm6fCKgpYVI7ZEWuPJ4az8hiEHtCUeYjZXqU7Ou4QqYh1Df2yCQ7Ca6N7xqKPFkxN3fhf+u9KSoOCJNAjg==} engines: {node: ^18.12 || ^20.9 || >=22.0} peerDependencies: - postcss: 8.5.1 + postcss: 8.5.2 postcss-colormin@7.0.2: resolution: {integrity: sha512-YntRXNngcvEvDbEjTdRWGU606eZvB5prmHG4BF0yLmVpamXbpsRJzevyy6MZVyuecgzI2AWAlvFi8DAeCqwpvA==} engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} peerDependencies: - postcss: 8.5.1 + postcss: 8.5.2 postcss-convert-values@7.0.4: resolution: {integrity: sha512-e2LSXPqEHVW6aoGbjV9RsSSNDO3A0rZLCBxN24zvxF25WknMPpX8Dm9UxxThyEbaytzggRuZxaGXqaOhxQ514Q==} engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} peerDependencies: - postcss: 8.5.1 + postcss: 8.5.2 postcss-discard-comments@7.0.3: resolution: {integrity: sha512-q6fjd4WU4afNhWOA2WltHgCbkRhZPgQe7cXF74fuVB/ge4QbM9HEaOIzGSiMvM+g/cOsNAUGdf2JDzqA2F8iLA==} engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} peerDependencies: - postcss: 8.5.1 + postcss: 8.5.2 postcss-discard-duplicates@7.0.1: resolution: {integrity: sha512-oZA+v8Jkpu1ct/xbbrntHRsfLGuzoP+cpt0nJe5ED2FQF8n8bJtn7Bo28jSmBYwqgqnqkuSXJfSUEE7if4nClQ==} engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} peerDependencies: - postcss: 8.5.1 + postcss: 8.5.2 postcss-discard-empty@7.0.0: resolution: {integrity: sha512-e+QzoReTZ8IAwhnSdp/++7gBZ/F+nBq9y6PomfwORfP7q9nBpK5AMP64kOt0bA+lShBFbBDcgpJ3X4etHg4lzA==} engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} peerDependencies: - postcss: 8.5.1 + postcss: 8.5.2 postcss-discard-overridden@7.0.0: resolution: {integrity: sha512-GmNAzx88u3k2+sBTZrJSDauR0ccpE24omTQCVmaTTZFz1du6AasspjaUPMJ2ud4RslZpoFKyf+6MSPETLojc6w==} engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} peerDependencies: - postcss: 8.5.1 + postcss: 8.5.2 postcss-import-resolver@2.0.0: resolution: {integrity: sha512-y001XYgGvVwgxyxw9J1a5kqM/vtmIQGzx34g0A0Oy44MFcy/ZboZw1hu/iN3VYFjSTRzbvd7zZJJz0Kh0AGkTw==} @@ -6279,14 +6175,14 @@ packages: resolution: {integrity: sha512-7hsAZ4xGXl4MW+OKEWCnF6T5jqBw80/EE9aXg1r2yyn1RsVEU8EtKXbijEODa+rg7iih4bKf7vlvTGYR4CnPNg==} engines: {node: '>=18.0.0'} peerDependencies: - postcss: 8.5.1 + postcss: 8.5.2 postcss-loader@8.1.1: resolution: {integrity: sha512-0IeqyAsG6tYiDRCYKQJLAmgQr47DX6N7sFSWvQxt6AcupX8DIdmykuk/o/tx0Lze3ErGHJEp5OSRxrelC6+NdQ==} engines: {node: '>= 18.12.0'} peerDependencies: '@rspack/core': 0.x || 1.x - postcss: 8.5.1 + postcss: 8.5.2 webpack: ^5.0.0 peerDependenciesMeta: '@rspack/core': @@ -6301,139 +6197,139 @@ packages: resolution: {integrity: sha512-zer1KoZA54Q8RVHKOY5vMke0cCdNxMP3KBfDerjH/BYHh4nCIh+1Yy0t1pAEQF18ac/4z3OFclO+ZVH8azjR4A==} engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} peerDependencies: - postcss: 8.5.1 + postcss: 8.5.2 postcss-merge-rules@7.0.4: resolution: {integrity: sha512-ZsaamiMVu7uBYsIdGtKJ64PkcQt6Pcpep/uO90EpLS3dxJi6OXamIobTYcImyXGoW0Wpugh7DSD3XzxZS9JCPg==} engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} peerDependencies: - postcss: 8.5.1 + postcss: 8.5.2 postcss-minify-font-values@7.0.0: resolution: {integrity: sha512-2ckkZtgT0zG8SMc5aoNwtm5234eUx1GGFJKf2b1bSp8UflqaeFzR50lid4PfqVI9NtGqJ2J4Y7fwvnP/u1cQog==} engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} peerDependencies: - postcss: 8.5.1 + postcss: 8.5.2 postcss-minify-gradients@7.0.0: resolution: {integrity: sha512-pdUIIdj/C93ryCHew0UgBnL2DtUS3hfFa5XtERrs4x+hmpMYGhbzo6l/Ir5de41O0GaKVpK1ZbDNXSY6GkXvtg==} engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} peerDependencies: - postcss: 8.5.1 + postcss: 8.5.2 postcss-minify-params@7.0.2: resolution: {integrity: sha512-nyqVLu4MFl9df32zTsdcLqCFfE/z2+f8GE1KHPxWOAmegSo6lpV2GNy5XQvrzwbLmiU7d+fYay4cwto1oNdAaQ==} engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} peerDependencies: - postcss: 8.5.1 + postcss: 8.5.2 postcss-minify-selectors@7.0.4: resolution: {integrity: sha512-JG55VADcNb4xFCf75hXkzc1rNeURhlo7ugf6JjiiKRfMsKlDzN9CXHZDyiG6x/zGchpjQS+UAgb1d4nqXqOpmA==} engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} peerDependencies: - postcss: 8.5.1 + postcss: 8.5.2 postcss-modules-extract-imports@3.1.0: resolution: {integrity: sha512-k3kNe0aNFQDAZGbin48pL2VNidTF0w4/eASDsxlyspobzU3wZQLOGj7L9gfRe0Jo9/4uud09DsjFNH7winGv8Q==} engines: {node: ^10 || ^12 || >= 14} peerDependencies: - postcss: 8.5.1 + postcss: 8.5.2 postcss-modules-local-by-default@4.0.5: resolution: {integrity: sha512-6MieY7sIfTK0hYfafw1OMEG+2bg8Q1ocHCpoWLqOKj3JXlKu4G7btkmM/B7lFubYkYWmRSPLZi5chid63ZaZYw==} engines: {node: ^10 || ^12 || >= 14} peerDependencies: - postcss: 8.5.1 + postcss: 8.5.2 postcss-modules-scope@3.2.0: resolution: {integrity: sha512-oq+g1ssrsZOsx9M96c5w8laRmvEu9C3adDSjI8oTcbfkrTE8hx/zfyobUoWIxaKPO8bt6S62kxpw5GqypEw1QQ==} engines: {node: ^10 || ^12 || >= 14} peerDependencies: - postcss: 8.5.1 + postcss: 8.5.2 postcss-modules-values@4.0.0: resolution: {integrity: sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ==} engines: {node: ^10 || ^12 || >= 14} peerDependencies: - postcss: 8.5.1 + postcss: 8.5.2 postcss-nested@7.0.2: resolution: {integrity: sha512-5osppouFc0VR9/VYzYxO03VaDa3e8F23Kfd6/9qcZTUI8P58GIYlArOET2Wq0ywSl2o2PjELhYOFI4W7l5QHKw==} engines: {node: '>=18.0'} peerDependencies: - postcss: 8.5.1 + postcss: 8.5.2 postcss-normalize-charset@7.0.0: resolution: {integrity: sha512-ABisNUXMeZeDNzCQxPxBCkXexvBrUHV+p7/BXOY+ulxkcjUZO0cp8ekGBwvIh2LbCwnWbyMPNJVtBSdyhM2zYQ==} engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} peerDependencies: - postcss: 8.5.1 + postcss: 8.5.2 postcss-normalize-display-values@7.0.0: resolution: {integrity: sha512-lnFZzNPeDf5uGMPYgGOw7v0BfB45+irSRz9gHQStdkkhiM0gTfvWkWB5BMxpn0OqgOQuZG/mRlZyJxp0EImr2Q==} engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} peerDependencies: - postcss: 8.5.1 + postcss: 8.5.2 postcss-normalize-positions@7.0.0: resolution: {integrity: sha512-I0yt8wX529UKIGs2y/9Ybs2CelSvItfmvg/DBIjTnoUSrPxSV7Z0yZ8ShSVtKNaV/wAY+m7bgtyVQLhB00A1NQ==} engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} peerDependencies: - postcss: 8.5.1 + postcss: 8.5.2 postcss-normalize-repeat-style@7.0.0: resolution: {integrity: sha512-o3uSGYH+2q30ieM3ppu9GTjSXIzOrRdCUn8UOMGNw7Af61bmurHTWI87hRybrP6xDHvOe5WlAj3XzN6vEO8jLw==} engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} peerDependencies: - postcss: 8.5.1 + postcss: 8.5.2 postcss-normalize-string@7.0.0: resolution: {integrity: sha512-w/qzL212DFVOpMy3UGyxrND+Kb0fvCiBBujiaONIihq7VvtC7bswjWgKQU/w4VcRyDD8gpfqUiBQ4DUOwEJ6Qg==} engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} peerDependencies: - postcss: 8.5.1 + postcss: 8.5.2 postcss-normalize-timing-functions@7.0.0: resolution: {integrity: sha512-tNgw3YV0LYoRwg43N3lTe3AEWZ66W7Dh7lVEpJbHoKOuHc1sLrzMLMFjP8SNULHaykzsonUEDbKedv8C+7ej6g==} engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} peerDependencies: - postcss: 8.5.1 + postcss: 8.5.2 postcss-normalize-unicode@7.0.2: resolution: {integrity: sha512-ztisabK5C/+ZWBdYC+Y9JCkp3M9qBv/XFvDtSw0d/XwfT3UaKeW/YTm/MD/QrPNxuecia46vkfEhewjwcYFjkg==} engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} peerDependencies: - postcss: 8.5.1 + postcss: 8.5.2 postcss-normalize-url@7.0.0: resolution: {integrity: sha512-+d7+PpE+jyPX1hDQZYG+NaFD+Nd2ris6r8fPTBAjE8z/U41n/bib3vze8x7rKs5H1uEw5ppe9IojewouHk0klQ==} engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} peerDependencies: - postcss: 8.5.1 + postcss: 8.5.2 postcss-normalize-whitespace@7.0.0: resolution: {integrity: sha512-37/toN4wwZErqohedXYqWgvcHUGlT8O/m2jVkAfAe9Bd4MzRqlBmXrJRePH0e9Wgnz2X7KymTgTOaaFizQe3AQ==} engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} peerDependencies: - postcss: 8.5.1 + postcss: 8.5.2 postcss-ordered-values@7.0.1: resolution: {integrity: sha512-irWScWRL6nRzYmBOXReIKch75RRhNS86UPUAxXdmW/l0FcAsg0lvAXQCby/1lymxn/o0gVa6Rv/0f03eJOwHxw==} engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} peerDependencies: - postcss: 8.5.1 + postcss: 8.5.2 postcss-reduce-initial@7.0.2: resolution: {integrity: sha512-pOnu9zqQww7dEKf62Nuju6JgsW2V0KRNBHxeKohU+JkHd/GAH5uvoObqFLqkeB2n20mr6yrlWDvo5UBU5GnkfA==} engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} peerDependencies: - postcss: 8.5.1 + postcss: 8.5.2 postcss-reduce-transforms@7.0.0: resolution: {integrity: sha512-pnt1HKKZ07/idH8cpATX/ujMbtOGhUfE+m8gbqwJE05aTaNw8gbo34a2e3if0xc0dlu75sUOiqvwCGY3fzOHew==} engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} peerDependencies: - postcss: 8.5.1 + postcss: 8.5.2 postcss-selector-parser@6.1.2: resolution: {integrity: sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==} @@ -6447,25 +6343,25 @@ packages: resolution: {integrity: sha512-0WBUlSL4lhD9rA5k1e5D8EN5wCEyZD6HJk0jIvRxl+FDVOMlJ7DePHYWGGVc5QRqrJ3/06FTXM0bxjmJpmTPSA==} engines: {node: ^18.12.0 || ^20.9.0 || >= 18} peerDependencies: - postcss: 8.5.1 + postcss: 8.5.2 postcss-unique-selectors@7.0.3: resolution: {integrity: sha512-J+58u5Ic5T1QjP/LDV9g3Cx4CNOgB5vz+kM6+OxHHhFACdcDeKhBXjQmB7fnIZM12YSTvsL0Opwco83DmacW2g==} engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} peerDependencies: - postcss: 8.5.1 + postcss: 8.5.2 postcss-url@10.1.3: resolution: {integrity: sha512-FUzyxfI5l2tKmXdYc6VTu3TWZsInayEKPbiyW+P6vmmIrrb4I6CGX0BFoewgYHLK+oIL5FECEK02REYRpBvUCw==} engines: {node: '>=10'} peerDependencies: - postcss: 8.5.1 + postcss: 8.5.2 postcss-value-parser@4.2.0: resolution: {integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==} - postcss@8.5.1: - resolution: {integrity: sha512-6oz2beyjc5VMn/KV1pPw8fliQkhBXrVn1Z3TVyqZxU8kZpzEKhBdmCFqI6ZbmGtamQvQGuU1sgPTk8ZrXDD7jQ==} + postcss@8.5.2: + resolution: {integrity: sha512-MjOadfU3Ys9KYoX0AdkBlFEF1Vx37uCCeN4ZHnmwm9FfpbsGWMZeBLMmmpY+6Ocqod7mkdZ0DT31OlbsFrLlkA==} engines: {node: ^10 || ^12 || >=14} posthtml-parser@0.11.0: @@ -6484,8 +6380,8 @@ packages: resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} engines: {node: '>= 0.8.0'} - prettier@3.4.2: - resolution: {integrity: sha512-e9MewbtFo+Fevyuxn/4rrcDAaq0IYxPGLvObpQjiZBMAzB9IGmzlnG9RZy3FFas+eBMu2vA0CszMeduow5dIuQ==} + prettier@3.5.0: + resolution: {integrity: sha512-quyMrVt6svPS7CjQ9gKb3GLEX/rl3BCL2oa/QkNcXv4YNVBC9olt3s+H7ukto06q7B1Qz46PbrKLO34PR6vXcA==} engines: {node: '>=14'} hasBin: true @@ -7139,7 +7035,7 @@ packages: resolution: {integrity: sha512-i4zfNrGMt9SB4xRK9L83rlsFCgdGANfeDAYacO1pkqcE7cRHPdWHwnKZVz7WY17Veq/FvyYsRAU++Ga+qDFIww==} engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} peerDependencies: - postcss: 8.5.1 + postcss: 8.5.2 summary@2.1.0: resolution: {integrity: sha512-nMIjMrd5Z2nuB2RZCKJfFMjgS3fygbeyGk9PxPPaJR1RIcyN9yn4A63Isovzm3ZtQuEkLBVgMdPup8UeLH7aQw==} @@ -7408,8 +7304,8 @@ packages: unenv@1.10.0: resolution: {integrity: sha512-wY5bskBQFL9n3Eca5XnhH6KbUo/tfvkwm9OpcdCvLaeA7piBNbavbOKJySEwQ1V0RH6HvNlSAFRTpvTqgKRQXQ==} - unhead@2.0.0-alpha.9: - resolution: {integrity: sha512-Pvf5SZqAMOwumnCgOVOJtuJm4IM+QBOw1tCzvINFp31KNnBqQ6UCk3bYPWWdqjxavwFK3/lKs017qWS6PNKQqQ==} + unhead@1.11.18: + resolution: {integrity: sha512-TWgGUoZMpYe2yJwY6jZ0/9kpQT18ygr2h5lI6cUXdfD9UzDc0ytM9jGaleSYkj9guJWXkk7izYBnzJvxl8mRvQ==} unicode-emoji-modifier-base@1.0.0: resolution: {integrity: sha512-yLSH4py7oFH3oG/9K+XWrz1pSi3dfUrWEnInbxMfArOfc1+33BlGPQtLsOYwvdMy11AwUBetYuaRxSPqgkq+8g==} @@ -7426,9 +7322,9 @@ packages: unified@11.0.5: resolution: {integrity: sha512-xKvGhPWw3k84Qjh8bI3ZeJjqnyadK+GEFtazSfZv/rKeTkTjOJho6mFqh2SM96iIcZokxiOpg78GazTSg8+KHA==} - unimport@4.1.0: - resolution: {integrity: sha512-y5ZYDG+j7IB45+Y6CIkWIKou4E1JFigCUw6vI+h15HdYAKmT0oQWcawnxXuwJG8srJyXhIZuWz5uXB1MQ/ARZw==} - engines: {node: '>=18.20.6'} + unimport@4.1.1: + resolution: {integrity: sha512-j9+fijH6aDd05yv1fXlyt7HSxtOWtGtrZeYTVBsSUg57Iuf+Ps2itIZjeyu7bEQ4k0WOgYhHrdW8m/pJgOpl5g==} + engines: {node: '>=18.12.0'} unist-builder@4.0.0: resolution: {integrity: sha512-wmRFnH+BLpZnTKpc5L7O67Kac89s9HMrtELpnNaE6TAobq5DTZZs5YaTQfAZBA9bFPECx2uVAPO31c+GVug8mg==} @@ -7487,6 +7383,10 @@ packages: resolution: {integrity: sha512-Q3LU0e4zxKfRko1wMV2HmP8lB9KWislY7hxXpxd+lGx0PRInE4vhMBVEZwpdVYHvtqzhSrzuIfErsob6bQfCzw==} engines: {node: '>=18.12.0'} + unplugin@2.2.0: + resolution: {integrity: sha512-m1ekpSwuOT5hxkJeZGRxO7gXbXT3gF26NjQ7GdVHoLoF8/nopLcd/QfPigpCy7i51oFHiRJg/CyHhj4vs2+KGw==} + engines: {node: '>=18.12.0'} + unstorage@1.14.4: resolution: {integrity: sha512-1SYeamwuYeQJtJ/USE1x4l17LkmQBzg7deBJ+U9qOBoHo15d1cDxG4jM31zKRgF7pG0kirZy4wVMX6WL6Zoscg==} peerDependencies: @@ -8072,12 +7972,12 @@ snapshots: '@antfu/install-pkg@0.4.1': dependencies: - package-manager-detector: 0.2.8 + package-manager-detector: 0.2.9 tinyexec: 0.3.2 '@antfu/install-pkg@1.0.0': dependencies: - package-manager-detector: 0.2.8 + package-manager-detector: 0.2.9 tinyexec: 0.3.2 '@antfu/utils@0.7.10': {} @@ -8332,11 +8232,11 @@ snapshots: transitivePeerDependencies: - debug - '@codspeed/vitest-plugin@4.0.0(vite@6.1.0(@types/node@22.13.1)(jiti@2.4.2)(terser@5.32.0)(tsx@4.19.2)(yaml@2.7.0))(vitest@3.0.5(@types/debug@4.1.12)(@types/node@22.13.1)(happy-dom@17.0.2)(jiti@2.4.2)(terser@5.32.0)(tsx@4.19.2)(yaml@2.7.0))': + '@codspeed/vitest-plugin@4.0.0(vite@6.1.0(@types/node@22.13.1)(jiti@2.4.2)(terser@5.32.0)(tsx@4.19.2)(yaml@2.7.0))(vitest@3.0.5(@types/debug@4.1.12)(@types/node@22.13.1)(happy-dom@17.0.4)(jiti@2.4.2)(terser@5.32.0)(tsx@4.19.2)(yaml@2.7.0))': dependencies: '@codspeed/core': 4.0.0 vite: 6.1.0(@types/node@22.13.1)(jiti@2.4.2)(sass@1.78.0)(terser@5.32.0)(tsx@4.19.2)(yaml@2.7.0) - vitest: 3.0.5(@types/debug@4.1.12)(@types/node@22.13.1)(happy-dom@17.0.2)(jiti@2.4.2)(sass@1.78.0)(terser@5.32.0)(tsx@4.19.2)(yaml@2.7.0) + vitest: 3.0.5(@types/debug@4.1.12)(@types/node@22.13.1)(happy-dom@17.0.4)(jiti@2.4.2)(sass@1.78.0)(terser@5.32.0)(tsx@4.19.2)(yaml@2.7.0) transitivePeerDependencies: - debug @@ -8351,9 +8251,6 @@ snapshots: esquery: 1.6.0 jsdoc-type-pratt-parser: 4.1.0 - '@esbuild/aix-ppc64@0.21.5': - optional: true - '@esbuild/aix-ppc64@0.23.1': optional: true @@ -8363,9 +8260,6 @@ snapshots: '@esbuild/aix-ppc64@0.25.0': optional: true - '@esbuild/android-arm64@0.21.5': - optional: true - '@esbuild/android-arm64@0.23.1': optional: true @@ -8375,9 +8269,6 @@ snapshots: '@esbuild/android-arm64@0.25.0': optional: true - '@esbuild/android-arm@0.21.5': - optional: true - '@esbuild/android-arm@0.23.1': optional: true @@ -8387,9 +8278,6 @@ snapshots: '@esbuild/android-arm@0.25.0': optional: true - '@esbuild/android-x64@0.21.5': - optional: true - '@esbuild/android-x64@0.23.1': optional: true @@ -8399,9 +8287,6 @@ snapshots: '@esbuild/android-x64@0.25.0': optional: true - '@esbuild/darwin-arm64@0.21.5': - optional: true - '@esbuild/darwin-arm64@0.23.1': optional: true @@ -8411,9 +8296,6 @@ snapshots: '@esbuild/darwin-arm64@0.25.0': optional: true - '@esbuild/darwin-x64@0.21.5': - optional: true - '@esbuild/darwin-x64@0.23.1': optional: true @@ -8423,9 +8305,6 @@ snapshots: '@esbuild/darwin-x64@0.25.0': optional: true - '@esbuild/freebsd-arm64@0.21.5': - optional: true - '@esbuild/freebsd-arm64@0.23.1': optional: true @@ -8435,9 +8314,6 @@ snapshots: '@esbuild/freebsd-arm64@0.25.0': optional: true - '@esbuild/freebsd-x64@0.21.5': - optional: true - '@esbuild/freebsd-x64@0.23.1': optional: true @@ -8447,9 +8323,6 @@ snapshots: '@esbuild/freebsd-x64@0.25.0': optional: true - '@esbuild/linux-arm64@0.21.5': - optional: true - '@esbuild/linux-arm64@0.23.1': optional: true @@ -8459,9 +8332,6 @@ snapshots: '@esbuild/linux-arm64@0.25.0': optional: true - '@esbuild/linux-arm@0.21.5': - optional: true - '@esbuild/linux-arm@0.23.1': optional: true @@ -8471,9 +8341,6 @@ snapshots: '@esbuild/linux-arm@0.25.0': optional: true - '@esbuild/linux-ia32@0.21.5': - optional: true - '@esbuild/linux-ia32@0.23.1': optional: true @@ -8483,9 +8350,6 @@ snapshots: '@esbuild/linux-ia32@0.25.0': optional: true - '@esbuild/linux-loong64@0.21.5': - optional: true - '@esbuild/linux-loong64@0.23.1': optional: true @@ -8495,9 +8359,6 @@ snapshots: '@esbuild/linux-loong64@0.25.0': optional: true - '@esbuild/linux-mips64el@0.21.5': - optional: true - '@esbuild/linux-mips64el@0.23.1': optional: true @@ -8507,9 +8368,6 @@ snapshots: '@esbuild/linux-mips64el@0.25.0': optional: true - '@esbuild/linux-ppc64@0.21.5': - optional: true - '@esbuild/linux-ppc64@0.23.1': optional: true @@ -8519,9 +8377,6 @@ snapshots: '@esbuild/linux-ppc64@0.25.0': optional: true - '@esbuild/linux-riscv64@0.21.5': - optional: true - '@esbuild/linux-riscv64@0.23.1': optional: true @@ -8531,9 +8386,6 @@ snapshots: '@esbuild/linux-riscv64@0.25.0': optional: true - '@esbuild/linux-s390x@0.21.5': - optional: true - '@esbuild/linux-s390x@0.23.1': optional: true @@ -8543,9 +8395,6 @@ snapshots: '@esbuild/linux-s390x@0.25.0': optional: true - '@esbuild/linux-x64@0.21.5': - optional: true - '@esbuild/linux-x64@0.23.1': optional: true @@ -8561,9 +8410,6 @@ snapshots: '@esbuild/netbsd-arm64@0.25.0': optional: true - '@esbuild/netbsd-x64@0.21.5': - optional: true - '@esbuild/netbsd-x64@0.23.1': optional: true @@ -8582,9 +8428,6 @@ snapshots: '@esbuild/openbsd-arm64@0.25.0': optional: true - '@esbuild/openbsd-x64@0.21.5': - optional: true - '@esbuild/openbsd-x64@0.23.1': optional: true @@ -8594,9 +8437,6 @@ snapshots: '@esbuild/openbsd-x64@0.25.0': optional: true - '@esbuild/sunos-x64@0.21.5': - optional: true - '@esbuild/sunos-x64@0.23.1': optional: true @@ -8606,9 +8446,6 @@ snapshots: '@esbuild/sunos-x64@0.25.0': optional: true - '@esbuild/win32-arm64@0.21.5': - optional: true - '@esbuild/win32-arm64@0.23.1': optional: true @@ -8618,9 +8455,6 @@ snapshots: '@esbuild/win32-arm64@0.25.0': optional: true - '@esbuild/win32-ia32@0.21.5': - optional: true - '@esbuild/win32-ia32@0.23.1': optional: true @@ -8630,9 +8464,6 @@ snapshots: '@esbuild/win32-ia32@0.25.0': optional: true - '@esbuild/win32-x64@0.21.5': - optional: true - '@esbuild/win32-x64@0.23.1': optional: true @@ -8642,16 +8473,16 @@ snapshots: '@esbuild/win32-x64@0.25.0': optional: true - '@eslint-community/eslint-utils@4.4.0(eslint@9.20.0(jiti@2.4.2))': + '@eslint-community/eslint-utils@4.4.0(eslint@9.20.1(jiti@2.4.2))': dependencies: - eslint: 9.20.0(jiti@2.4.2) + eslint: 9.20.1(jiti@2.4.2) eslint-visitor-keys: 3.4.3 '@eslint-community/regexpp@4.12.1': {} - '@eslint/compat@1.2.5(eslint@9.20.0(jiti@2.4.2))': + '@eslint/compat@1.2.5(eslint@9.20.1(jiti@2.4.2))': optionalDependencies: - eslint: 9.20.0(jiti@2.4.2) + eslint: 9.20.1(jiti@2.4.2) '@eslint/config-array@0.19.0': dependencies: @@ -8897,7 +8728,7 @@ snapshots: '@nuxt/cli@3.21.1(magicast@0.3.5)': dependencies: - c12: 2.0.1(magicast@0.3.5) + c12: 2.0.2(magicast@0.3.5) chokidar: 4.0.3 citty: 0.1.6 clipboardy: 4.0.0 @@ -8984,39 +8815,39 @@ snapshots: - utf-8-validate - vue - '@nuxt/eslint-config@1.0.1(@vue/compiler-sfc@3.5.13)(eslint@9.20.0(jiti@2.4.2))(typescript@5.7.3)': + '@nuxt/eslint-config@1.0.1(@vue/compiler-sfc@3.5.13)(eslint@9.20.1(jiti@2.4.2))(typescript@5.7.3)': dependencies: '@antfu/install-pkg': 1.0.0 '@clack/prompts': 0.9.1 '@eslint/js': 9.20.0 - '@nuxt/eslint-plugin': 1.0.1(eslint@9.20.0(jiti@2.4.2))(typescript@5.7.3) - '@stylistic/eslint-plugin': 3.0.1(eslint@9.20.0(jiti@2.4.2))(typescript@5.7.3) - '@typescript-eslint/eslint-plugin': 8.23.0(@typescript-eslint/parser@8.23.0(eslint@9.20.0(jiti@2.4.2))(typescript@5.7.3))(eslint@9.20.0(jiti@2.4.2))(typescript@5.7.3) - '@typescript-eslint/parser': 8.23.0(eslint@9.20.0(jiti@2.4.2))(typescript@5.7.3) - eslint: 9.20.0(jiti@2.4.2) - eslint-config-flat-gitignore: 2.0.0(eslint@9.20.0(jiti@2.4.2)) + '@nuxt/eslint-plugin': 1.0.1(eslint@9.20.1(jiti@2.4.2))(typescript@5.7.3) + '@stylistic/eslint-plugin': 3.0.1(eslint@9.20.1(jiti@2.4.2))(typescript@5.7.3) + '@typescript-eslint/eslint-plugin': 8.23.0(@typescript-eslint/parser@8.23.0(eslint@9.20.1(jiti@2.4.2))(typescript@5.7.3))(eslint@9.20.1(jiti@2.4.2))(typescript@5.7.3) + '@typescript-eslint/parser': 8.23.0(eslint@9.20.1(jiti@2.4.2))(typescript@5.7.3) + eslint: 9.20.1(jiti@2.4.2) + eslint-config-flat-gitignore: 2.0.0(eslint@9.20.1(jiti@2.4.2)) eslint-flat-config-utils: 2.0.1 - eslint-merge-processors: 1.0.0(eslint@9.20.0(jiti@2.4.2)) - eslint-plugin-import-x: 4.6.1(eslint@9.20.0(jiti@2.4.2))(typescript@5.7.3) - eslint-plugin-jsdoc: 50.6.3(eslint@9.20.0(jiti@2.4.2)) - eslint-plugin-regexp: 2.7.0(eslint@9.20.0(jiti@2.4.2)) - eslint-plugin-unicorn: 56.0.1(eslint@9.20.0(jiti@2.4.2)) - eslint-plugin-vue: 9.32.0(eslint@9.20.0(jiti@2.4.2)) - eslint-processor-vue-blocks: 1.0.0(@vue/compiler-sfc@3.5.13)(eslint@9.20.0(jiti@2.4.2)) + eslint-merge-processors: 1.0.0(eslint@9.20.1(jiti@2.4.2)) + eslint-plugin-import-x: 4.6.1(eslint@9.20.1(jiti@2.4.2))(typescript@5.7.3) + eslint-plugin-jsdoc: 50.6.3(eslint@9.20.1(jiti@2.4.2)) + eslint-plugin-regexp: 2.7.0(eslint@9.20.1(jiti@2.4.2)) + eslint-plugin-unicorn: 56.0.1(eslint@9.20.1(jiti@2.4.2)) + eslint-plugin-vue: 9.32.0(eslint@9.20.1(jiti@2.4.2)) + eslint-processor-vue-blocks: 1.0.0(@vue/compiler-sfc@3.5.13)(eslint@9.20.1(jiti@2.4.2)) globals: 15.14.0 local-pkg: 1.0.0 pathe: 2.0.2 - vue-eslint-parser: 9.4.3(eslint@9.20.0(jiti@2.4.2)) + vue-eslint-parser: 9.4.3(eslint@9.20.1(jiti@2.4.2)) transitivePeerDependencies: - '@vue/compiler-sfc' - supports-color - typescript - '@nuxt/eslint-plugin@1.0.1(eslint@9.20.0(jiti@2.4.2))(typescript@5.7.3)': + '@nuxt/eslint-plugin@1.0.1(eslint@9.20.1(jiti@2.4.2))(typescript@5.7.3)': dependencies: '@typescript-eslint/types': 8.23.0 - '@typescript-eslint/utils': 8.23.0(eslint@9.20.0(jiti@2.4.2))(typescript@5.7.3) - eslint: 9.20.0(jiti@2.4.2) + '@typescript-eslint/utils': 8.23.0(eslint@9.20.1(jiti@2.4.2))(typescript@5.7.3) + eslint: 9.20.1(jiti@2.4.2) transitivePeerDependencies: - supports-color - typescript @@ -9029,10 +8860,10 @@ snapshots: string-width: 4.2.3 webpack: 5.97.1 - '@nuxt/scripts@0.10.1(@types/google.maps@3.58.1)(@types/vimeo__player@2.18.3)(@types/youtube@0.1.0)(@unhead/vue@2.0.0-alpha.8(vue@3.5.13(typescript@5.7.3)))(typescript@5.7.3)': + '@nuxt/scripts@0.10.1(@types/google.maps@3.58.1)(@types/vimeo__player@2.18.3)(@types/youtube@0.1.0)(@unhead/vue@1.11.18(vue@3.5.13(typescript@5.7.3)))(typescript@5.7.3)': dependencies: '@nuxt/kit': link:packages/kit - '@unhead/vue': 2.0.0-alpha.8(vue@3.5.13(typescript@5.7.3)) + '@unhead/vue': 1.11.18(vue@3.5.13(typescript@5.7.3)) '@vueuse/core': 12.5.0(typescript@5.7.3) consola: 3.4.0 defu: 6.1.4 @@ -9046,7 +8877,7 @@ snapshots: sirv: 3.0.0 std-env: 3.8.0 ufo: 1.5.4 - unplugin: 2.1.2 + unplugin: 2.2.0 unstorage: 1.14.4(db0@0.1.4)(ioredis@5.4.1) valibot: 1.0.0-beta.15(typescript@5.7.3) optionalDependencies: @@ -9074,7 +8905,7 @@ snapshots: - typescript - uploadthing - '@nuxt/telemetry@2.6.4': + '@nuxt/telemetry@2.6.5': dependencies: '@nuxt/kit': link:packages/kit citty: 0.1.6 @@ -9084,17 +8915,17 @@ snapshots: git-url-parse: 16.0.0 is-docker: 3.0.0 ofetch: 1.4.1 - package-manager-detector: 0.2.8 + package-manager-detector: 0.2.9 parse-git-config: 3.0.0 pathe: 2.0.2 rc9: 2.1.2 std-env: 3.8.0 - '@nuxt/test-utils@3.15.4(@testing-library/vue@8.1.0(@vue/compiler-sfc@3.5.13)(vue@3.5.13(typescript@5.7.3)))(@types/node@22.13.1)(@vue/test-utils@2.4.6)(happy-dom@17.0.2)(jiti@2.4.2)(magicast@0.3.5)(playwright-core@1.50.1)(terser@5.32.0)(tsx@4.19.2)(typescript@5.7.3)(vitest@3.0.5(@types/debug@4.1.12)(@types/node@22.13.1)(happy-dom@17.0.2)(jiti@2.4.2)(terser@5.32.0)(tsx@4.19.2)(yaml@2.7.0))(yaml@2.7.0)': + '@nuxt/test-utils@3.15.4(@testing-library/vue@8.1.0(@vue/compiler-sfc@3.5.13)(vue@3.5.13(typescript@5.7.3)))(@types/node@22.13.1)(@vue/test-utils@2.4.6)(happy-dom@17.0.4)(jiti@2.4.2)(magicast@0.3.5)(playwright-core@1.50.1)(terser@5.32.0)(tsx@4.19.2)(typescript@5.7.3)(vitest@3.0.5(@types/debug@4.1.12)(@types/node@22.13.1)(happy-dom@17.0.4)(jiti@2.4.2)(terser@5.32.0)(tsx@4.19.2)(yaml@2.7.0))(yaml@2.7.0)': dependencies: '@nuxt/kit': link:packages/kit '@nuxt/schema': link:packages/schema - c12: 2.0.1(magicast@0.3.5) + c12: 2.0.2(magicast@0.3.5) consola: 3.4.0 defu: 6.1.4 destr: 2.0.3 @@ -9114,16 +8945,16 @@ snapshots: tinyexec: 0.3.2 ufo: 1.5.4 unenv: 1.10.0 - unplugin: 2.1.2 + unplugin: 2.2.0 vite: 6.1.0(@types/node@22.13.1)(jiti@2.4.2)(sass@1.78.0)(terser@5.32.0)(tsx@4.19.2)(yaml@2.7.0) - vitest-environment-nuxt: 1.0.1(@testing-library/vue@8.1.0(@vue/compiler-sfc@3.5.13)(vue@3.5.13(typescript@5.7.3)))(@types/node@22.13.1)(@vue/test-utils@2.4.6)(happy-dom@17.0.2)(jiti@2.4.2)(magicast@0.3.5)(playwright-core@1.50.1)(terser@5.32.0)(tsx@4.19.2)(typescript@5.7.3)(vitest@3.0.5(@types/debug@4.1.12)(@types/node@22.13.1)(happy-dom@17.0.2)(jiti@2.4.2)(terser@5.32.0)(tsx@4.19.2)(yaml@2.7.0))(yaml@2.7.0) + vitest-environment-nuxt: 1.0.1(@testing-library/vue@8.1.0(@vue/compiler-sfc@3.5.13)(vue@3.5.13(typescript@5.7.3)))(@types/node@22.13.1)(@vue/test-utils@2.4.6)(happy-dom@17.0.4)(jiti@2.4.2)(magicast@0.3.5)(playwright-core@1.50.1)(terser@5.32.0)(tsx@4.19.2)(typescript@5.7.3)(vitest@3.0.5(@types/debug@4.1.12)(@types/node@22.13.1)(happy-dom@17.0.4)(jiti@2.4.2)(terser@5.32.0)(tsx@4.19.2)(yaml@2.7.0))(yaml@2.7.0) vue: 3.5.13(typescript@5.7.3) optionalDependencies: '@testing-library/vue': 8.1.0(@vue/compiler-sfc@3.5.13)(vue@3.5.13(typescript@5.7.3)) '@vue/test-utils': 2.4.6 - happy-dom: 17.0.2 + happy-dom: 17.0.4 playwright-core: 1.50.1 - vitest: 3.0.5(@types/debug@4.1.12)(@types/node@22.13.1)(happy-dom@17.0.2)(jiti@2.4.2)(sass@1.78.0)(terser@5.32.0)(tsx@4.19.2)(yaml@2.7.0) + vitest: 3.0.5(@types/debug@4.1.12)(@types/node@22.13.1)(happy-dom@17.0.4)(jiti@2.4.2)(sass@1.78.0)(terser@5.32.0)(tsx@4.19.2)(yaml@2.7.0) transitivePeerDependencies: - '@types/node' - jiti @@ -9516,49 +9347,49 @@ snapshots: '@rollup/rollup-win32-x64-msvc@4.34.6': optional: true - '@rspack/binding-darwin-arm64@1.2.2': + '@rspack/binding-darwin-arm64@1.2.3': optional: true - '@rspack/binding-darwin-x64@1.2.2': + '@rspack/binding-darwin-x64@1.2.3': optional: true - '@rspack/binding-linux-arm64-gnu@1.2.2': + '@rspack/binding-linux-arm64-gnu@1.2.3': optional: true - '@rspack/binding-linux-arm64-musl@1.2.2': + '@rspack/binding-linux-arm64-musl@1.2.3': optional: true - '@rspack/binding-linux-x64-gnu@1.2.2': + '@rspack/binding-linux-x64-gnu@1.2.3': optional: true - '@rspack/binding-linux-x64-musl@1.2.2': + '@rspack/binding-linux-x64-musl@1.2.3': optional: true - '@rspack/binding-win32-arm64-msvc@1.2.2': + '@rspack/binding-win32-arm64-msvc@1.2.3': optional: true - '@rspack/binding-win32-ia32-msvc@1.2.2': + '@rspack/binding-win32-ia32-msvc@1.2.3': optional: true - '@rspack/binding-win32-x64-msvc@1.2.2': + '@rspack/binding-win32-x64-msvc@1.2.3': optional: true - '@rspack/binding@1.2.2': + '@rspack/binding@1.2.3': optionalDependencies: - '@rspack/binding-darwin-arm64': 1.2.2 - '@rspack/binding-darwin-x64': 1.2.2 - '@rspack/binding-linux-arm64-gnu': 1.2.2 - '@rspack/binding-linux-arm64-musl': 1.2.2 - '@rspack/binding-linux-x64-gnu': 1.2.2 - '@rspack/binding-linux-x64-musl': 1.2.2 - '@rspack/binding-win32-arm64-msvc': 1.2.2 - '@rspack/binding-win32-ia32-msvc': 1.2.2 - '@rspack/binding-win32-x64-msvc': 1.2.2 + '@rspack/binding-darwin-arm64': 1.2.3 + '@rspack/binding-darwin-x64': 1.2.3 + '@rspack/binding-linux-arm64-gnu': 1.2.3 + '@rspack/binding-linux-arm64-musl': 1.2.3 + '@rspack/binding-linux-x64-gnu': 1.2.3 + '@rspack/binding-linux-x64-musl': 1.2.3 + '@rspack/binding-win32-arm64-msvc': 1.2.3 + '@rspack/binding-win32-ia32-msvc': 1.2.3 + '@rspack/binding-win32-x64-msvc': 1.2.3 - '@rspack/core@1.2.2': + '@rspack/core@1.2.3': dependencies: '@module-federation/runtime-tools': 0.8.4 - '@rspack/binding': 1.2.2 + '@rspack/binding': 1.2.3 '@rspack/lite-tapable': 1.0.1 caniuse-lite: 1.0.30001667 @@ -9693,10 +9524,10 @@ snapshots: ignore: 5.3.2 p-map: 4.0.0 - '@stylistic/eslint-plugin@3.0.1(eslint@9.20.0(jiti@2.4.2))(typescript@5.7.3)': + '@stylistic/eslint-plugin@3.0.1(eslint@9.20.1(jiti@2.4.2))(typescript@5.7.3)': dependencies: - '@typescript-eslint/utils': 8.23.0(eslint@9.20.0(jiti@2.4.2))(typescript@5.7.3) - eslint: 9.20.0(jiti@2.4.2) + '@typescript-eslint/utils': 8.23.0(eslint@9.20.1(jiti@2.4.2))(typescript@5.7.3) + eslint: 9.20.1(jiti@2.4.2) eslint-visitor-keys: 4.2.0 espree: 10.3.0 estraverse: 5.3.0 @@ -9823,6 +9654,10 @@ snapshots: '@types/resolve@1.20.2': {} + '@types/rollup-plugin-visualizer@4.2.4': + dependencies: + rollup: 4.34.6 + '@types/semver@7.5.8': {} '@types/unist@2.0.11': {} @@ -9845,6 +9680,17 @@ snapshots: - uglify-js - webpack-cli + '@types/webpack-bundle-analyzer@4.7.0(esbuild@0.25.0)': + dependencies: + '@types/node': 22.13.1 + tapable: 2.2.1 + webpack: 5.97.1(esbuild@0.25.0) + transitivePeerDependencies: + - '@swc/core' + - esbuild + - uglify-js + - webpack-cli + '@types/webpack-hot-middleware@2.25.9': dependencies: '@types/connect': 3.4.38 @@ -9856,6 +9702,17 @@ snapshots: - uglify-js - webpack-cli + '@types/webpack-hot-middleware@2.25.9(esbuild@0.25.0)': + dependencies: + '@types/connect': 3.4.38 + tapable: 2.2.1 + webpack: 5.97.1(esbuild@0.25.0) + transitivePeerDependencies: + - '@swc/core' + - esbuild + - uglify-js + - webpack-cli + '@types/yargs-parser@21.0.3': {} '@types/yargs@17.0.33': @@ -9865,15 +9722,15 @@ snapshots: '@types/youtube@0.1.0': optional: true - '@typescript-eslint/eslint-plugin@8.23.0(@typescript-eslint/parser@8.23.0(eslint@9.20.0(jiti@2.4.2))(typescript@5.7.3))(eslint@9.20.0(jiti@2.4.2))(typescript@5.7.3)': + '@typescript-eslint/eslint-plugin@8.23.0(@typescript-eslint/parser@8.23.0(eslint@9.20.1(jiti@2.4.2))(typescript@5.7.3))(eslint@9.20.1(jiti@2.4.2))(typescript@5.7.3)': dependencies: '@eslint-community/regexpp': 4.12.1 - '@typescript-eslint/parser': 8.23.0(eslint@9.20.0(jiti@2.4.2))(typescript@5.7.3) + '@typescript-eslint/parser': 8.23.0(eslint@9.20.1(jiti@2.4.2))(typescript@5.7.3) '@typescript-eslint/scope-manager': 8.23.0 - '@typescript-eslint/type-utils': 8.23.0(eslint@9.20.0(jiti@2.4.2))(typescript@5.7.3) - '@typescript-eslint/utils': 8.23.0(eslint@9.20.0(jiti@2.4.2))(typescript@5.7.3) + '@typescript-eslint/type-utils': 8.23.0(eslint@9.20.1(jiti@2.4.2))(typescript@5.7.3) + '@typescript-eslint/utils': 8.23.0(eslint@9.20.1(jiti@2.4.2))(typescript@5.7.3) '@typescript-eslint/visitor-keys': 8.23.0 - eslint: 9.20.0(jiti@2.4.2) + eslint: 9.20.1(jiti@2.4.2) graphemer: 1.4.0 ignore: 5.3.2 natural-compare: 1.4.0 @@ -9882,14 +9739,14 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/parser@8.23.0(eslint@9.20.0(jiti@2.4.2))(typescript@5.7.3)': + '@typescript-eslint/parser@8.23.0(eslint@9.20.1(jiti@2.4.2))(typescript@5.7.3)': dependencies: '@typescript-eslint/scope-manager': 8.23.0 '@typescript-eslint/types': 8.23.0 '@typescript-eslint/typescript-estree': 8.23.0(typescript@5.7.3) '@typescript-eslint/visitor-keys': 8.23.0 debug: 4.4.0(supports-color@9.4.0) - eslint: 9.20.0(jiti@2.4.2) + eslint: 9.20.1(jiti@2.4.2) typescript: 5.7.3 transitivePeerDependencies: - supports-color @@ -9899,12 +9756,12 @@ snapshots: '@typescript-eslint/types': 8.23.0 '@typescript-eslint/visitor-keys': 8.23.0 - '@typescript-eslint/type-utils@8.23.0(eslint@9.20.0(jiti@2.4.2))(typescript@5.7.3)': + '@typescript-eslint/type-utils@8.23.0(eslint@9.20.1(jiti@2.4.2))(typescript@5.7.3)': dependencies: '@typescript-eslint/typescript-estree': 8.23.0(typescript@5.7.3) - '@typescript-eslint/utils': 8.23.0(eslint@9.20.0(jiti@2.4.2))(typescript@5.7.3) + '@typescript-eslint/utils': 8.23.0(eslint@9.20.1(jiti@2.4.2))(typescript@5.7.3) debug: 4.4.0(supports-color@9.4.0) - eslint: 9.20.0(jiti@2.4.2) + eslint: 9.20.1(jiti@2.4.2) ts-api-utils: 2.0.1(typescript@5.7.3) typescript: 5.7.3 transitivePeerDependencies: @@ -9926,13 +9783,13 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/utils@8.23.0(eslint@9.20.0(jiti@2.4.2))(typescript@5.7.3)': + '@typescript-eslint/utils@8.23.0(eslint@9.20.1(jiti@2.4.2))(typescript@5.7.3)': dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@9.20.0(jiti@2.4.2)) + '@eslint-community/eslint-utils': 4.4.0(eslint@9.20.1(jiti@2.4.2)) '@typescript-eslint/scope-manager': 8.23.0 '@typescript-eslint/types': 8.23.0 '@typescript-eslint/typescript-estree': 8.23.0(typescript@5.7.3) - eslint: 9.20.0(jiti@2.4.2) + eslint: 9.20.1(jiti@2.4.2) typescript: 5.7.3 transitivePeerDependencies: - supports-color @@ -9951,22 +9808,32 @@ snapshots: '@ungap/structured-clone@1.2.0': {} - '@unhead/schema@2.0.0-alpha.9': + '@unhead/dom@1.11.18': + dependencies: + '@unhead/schema': 1.11.18 + '@unhead/shared': 1.11.18 + + '@unhead/schema@1.11.18': dependencies: hookable: 5.5.3 zhead: 2.2.4 - '@unhead/shared@2.0.0-alpha.9': + '@unhead/shared@1.11.18': dependencies: - '@unhead/schema': 2.0.0-alpha.9 + '@unhead/schema': 1.11.18 packrup: 0.1.2 - '@unhead/vue@2.0.0-alpha.8(vue@3.5.13(typescript@5.7.3))': + '@unhead/ssr@1.11.18': dependencies: - '@unhead/schema': 2.0.0-alpha.9 - '@unhead/shared': 2.0.0-alpha.9 + '@unhead/schema': 1.11.18 + '@unhead/shared': 1.11.18 + + '@unhead/vue@1.11.18(vue@3.5.13(typescript@5.7.3))': + dependencies: + '@unhead/schema': 1.11.18 + '@unhead/shared': 1.11.18 hookable: 5.5.3 - unhead: 2.0.0-alpha.9 + unhead: 1.11.18 vue: 3.5.13(typescript@5.7.3) '@unocss/astro@65.4.3(rollup@4.34.6)(vite@6.1.0(@types/node@22.13.1)(jiti@2.4.2)(sass@1.78.0)(terser@5.32.0)(tsx@4.19.2)(yaml@2.7.0))(vue@3.5.13(typescript@5.7.3))': @@ -10024,13 +9891,13 @@ snapshots: transitivePeerDependencies: - vue - '@unocss/postcss@65.4.3(postcss@8.5.1)': + '@unocss/postcss@65.4.3(postcss@8.5.2)': dependencies: '@unocss/config': 65.4.3 '@unocss/core': 65.4.3 '@unocss/rule-utils': 65.4.3 css-tree: 3.1.0 - postcss: 8.5.1 + postcss: 8.5.2 tinyglobby: 0.2.10 transitivePeerDependencies: - supports-color @@ -10154,7 +10021,7 @@ snapshots: vite: 6.1.0(@types/node@22.13.1)(jiti@2.4.2)(sass@1.78.0)(terser@5.32.0)(tsx@4.19.2)(yaml@2.7.0) vue: 3.5.13(typescript@5.7.3) - '@vitest/coverage-v8@3.0.5(vitest@3.0.5(@types/debug@4.1.12)(@types/node@22.13.1)(happy-dom@17.0.2)(jiti@2.4.2)(terser@5.32.0)(tsx@4.19.2)(yaml@2.7.0))': + '@vitest/coverage-v8@3.0.5(vitest@3.0.5(@types/debug@4.1.12)(@types/node@22.13.1)(happy-dom@17.0.4)(jiti@2.4.2)(terser@5.32.0)(tsx@4.19.2)(yaml@2.7.0))': dependencies: '@ampproject/remapping': 2.3.0 '@bcoe/v8-coverage': 1.0.2 @@ -10168,7 +10035,7 @@ snapshots: std-env: 3.8.0 test-exclude: 7.0.1 tinyrainbow: 2.0.0 - vitest: 3.0.5(@types/debug@4.1.12)(@types/node@22.13.1)(happy-dom@17.0.2)(jiti@2.4.2)(sass@1.78.0)(terser@5.32.0)(tsx@4.19.2)(yaml@2.7.0) + vitest: 3.0.5(@types/debug@4.1.12)(@types/node@22.13.1)(happy-dom@17.0.4)(jiti@2.4.2)(sass@1.78.0)(terser@5.32.0)(tsx@4.19.2)(yaml@2.7.0) transitivePeerDependencies: - supports-color @@ -10297,7 +10164,7 @@ snapshots: '@vue/shared': 3.5.13 estree-walker: 2.0.2 magic-string: 0.30.17 - postcss: 8.5.1 + postcss: 8.5.2 source-map-js: 1.2.1 '@vue/compiler-ssr@3.5.13': @@ -10665,14 +10532,14 @@ snapshots: asynckit@0.4.0: {} - autoprefixer@10.4.20(postcss@8.5.1): + autoprefixer@10.4.20(postcss@8.5.2): dependencies: browserslist: 4.24.0 caniuse-lite: 1.0.30001667 fraction.js: 4.3.7 normalize-range: 0.1.2 picocolors: 1.1.1 - postcss: 8.5.1 + postcss: 8.5.2 postcss-value-parser: 4.2.0 available-typed-arrays@1.0.7: @@ -10710,7 +10577,7 @@ snapshots: domhandler: 5.0.3 htmlparser2: 9.1.0 picocolors: 1.1.1 - postcss: 8.5.1 + postcss: 8.5.2 postcss-media-query-parser: 0.2.3 before-after-hook@2.2.3: {} @@ -10771,7 +10638,7 @@ snapshots: esbuild: 0.24.2 load-tsconfig: 0.2.5 - c12@2.0.1(magicast@0.3.5): + c12@2.0.2(magicast@0.3.5): dependencies: chokidar: 4.0.3 confbox: 0.1.8 @@ -10781,7 +10648,7 @@ snapshots: jiti: 2.4.2 mlly: 1.7.4 ohash: 1.1.4 - pathe: 1.1.2 + pathe: 2.0.2 perfect-debounce: 1.0.0 pkg-types: 1.3.1 rc9: 2.1.2 @@ -10840,7 +10707,7 @@ snapshots: changelogen@0.5.7(magicast@0.3.5): dependencies: - c12: 2.0.1(magicast@0.3.5) + c12: 2.0.2(magicast@0.3.5) colorette: 2.0.20 consola: 3.4.0 convert-gitmoji: 0.1.5 @@ -11072,30 +10939,42 @@ snapshots: dependencies: uncrypto: 0.1.3 - css-declaration-sorter@7.2.0(postcss@8.5.1): + css-declaration-sorter@7.2.0(postcss@8.5.2): dependencies: - postcss: 8.5.1 + postcss: 8.5.2 - css-loader@7.1.2(@rspack/core@1.2.2)(webpack@5.97.1): + css-loader@7.1.2(@rspack/core@1.2.3)(webpack@5.97.1): dependencies: - icss-utils: 5.1.0(postcss@8.5.1) - postcss: 8.5.1 - postcss-modules-extract-imports: 3.1.0(postcss@8.5.1) - postcss-modules-local-by-default: 4.0.5(postcss@8.5.1) - postcss-modules-scope: 3.2.0(postcss@8.5.1) - postcss-modules-values: 4.0.0(postcss@8.5.1) + icss-utils: 5.1.0(postcss@8.5.2) + postcss: 8.5.2 + postcss-modules-extract-imports: 3.1.0(postcss@8.5.2) + postcss-modules-local-by-default: 4.0.5(postcss@8.5.2) + postcss-modules-scope: 3.2.0(postcss@8.5.2) + postcss-modules-values: 4.0.0(postcss@8.5.2) postcss-value-parser: 4.2.0 semver: 7.7.1 optionalDependencies: - '@rspack/core': 1.2.2 + '@rspack/core': 1.2.3 webpack: 5.97.1 + css-minimizer-webpack-plugin@7.0.0(esbuild@0.25.0)(webpack@5.97.1(esbuild@0.25.0)): + dependencies: + '@jridgewell/trace-mapping': 0.3.25 + cssnano: 7.0.6(postcss@8.5.2) + jest-worker: 29.7.0 + postcss: 8.5.2 + schema-utils: 4.2.0 + serialize-javascript: 6.0.2 + webpack: 5.97.1(esbuild@0.25.0) + optionalDependencies: + esbuild: 0.25.0 + css-minimizer-webpack-plugin@7.0.0(webpack@5.97.1): dependencies: '@jridgewell/trace-mapping': 0.3.25 - cssnano: 7.0.6(postcss@8.5.1) + cssnano: 7.0.6(postcss@8.5.2) jest-worker: 29.7.0 - postcss: 8.5.1 + postcss: 8.5.2 schema-utils: 4.2.0 serialize-javascript: 6.0.2 webpack: 5.97.1 @@ -11127,49 +11006,49 @@ snapshots: cssesc@3.0.0: {} - cssnano-preset-default@7.0.6(postcss@8.5.1): + cssnano-preset-default@7.0.6(postcss@8.5.2): dependencies: browserslist: 4.24.0 - css-declaration-sorter: 7.2.0(postcss@8.5.1) - cssnano-utils: 5.0.0(postcss@8.5.1) - postcss: 8.5.1 - postcss-calc: 10.0.2(postcss@8.5.1) - postcss-colormin: 7.0.2(postcss@8.5.1) - postcss-convert-values: 7.0.4(postcss@8.5.1) - postcss-discard-comments: 7.0.3(postcss@8.5.1) - postcss-discard-duplicates: 7.0.1(postcss@8.5.1) - postcss-discard-empty: 7.0.0(postcss@8.5.1) - postcss-discard-overridden: 7.0.0(postcss@8.5.1) - postcss-merge-longhand: 7.0.4(postcss@8.5.1) - postcss-merge-rules: 7.0.4(postcss@8.5.1) - postcss-minify-font-values: 7.0.0(postcss@8.5.1) - postcss-minify-gradients: 7.0.0(postcss@8.5.1) - postcss-minify-params: 7.0.2(postcss@8.5.1) - postcss-minify-selectors: 7.0.4(postcss@8.5.1) - postcss-normalize-charset: 7.0.0(postcss@8.5.1) - postcss-normalize-display-values: 7.0.0(postcss@8.5.1) - postcss-normalize-positions: 7.0.0(postcss@8.5.1) - postcss-normalize-repeat-style: 7.0.0(postcss@8.5.1) - postcss-normalize-string: 7.0.0(postcss@8.5.1) - postcss-normalize-timing-functions: 7.0.0(postcss@8.5.1) - postcss-normalize-unicode: 7.0.2(postcss@8.5.1) - postcss-normalize-url: 7.0.0(postcss@8.5.1) - postcss-normalize-whitespace: 7.0.0(postcss@8.5.1) - postcss-ordered-values: 7.0.1(postcss@8.5.1) - postcss-reduce-initial: 7.0.2(postcss@8.5.1) - postcss-reduce-transforms: 7.0.0(postcss@8.5.1) - postcss-svgo: 7.0.1(postcss@8.5.1) - postcss-unique-selectors: 7.0.3(postcss@8.5.1) + css-declaration-sorter: 7.2.0(postcss@8.5.2) + cssnano-utils: 5.0.0(postcss@8.5.2) + postcss: 8.5.2 + postcss-calc: 10.0.2(postcss@8.5.2) + postcss-colormin: 7.0.2(postcss@8.5.2) + postcss-convert-values: 7.0.4(postcss@8.5.2) + postcss-discard-comments: 7.0.3(postcss@8.5.2) + postcss-discard-duplicates: 7.0.1(postcss@8.5.2) + postcss-discard-empty: 7.0.0(postcss@8.5.2) + postcss-discard-overridden: 7.0.0(postcss@8.5.2) + postcss-merge-longhand: 7.0.4(postcss@8.5.2) + postcss-merge-rules: 7.0.4(postcss@8.5.2) + postcss-minify-font-values: 7.0.0(postcss@8.5.2) + postcss-minify-gradients: 7.0.0(postcss@8.5.2) + postcss-minify-params: 7.0.2(postcss@8.5.2) + postcss-minify-selectors: 7.0.4(postcss@8.5.2) + postcss-normalize-charset: 7.0.0(postcss@8.5.2) + postcss-normalize-display-values: 7.0.0(postcss@8.5.2) + postcss-normalize-positions: 7.0.0(postcss@8.5.2) + postcss-normalize-repeat-style: 7.0.0(postcss@8.5.2) + postcss-normalize-string: 7.0.0(postcss@8.5.2) + postcss-normalize-timing-functions: 7.0.0(postcss@8.5.2) + postcss-normalize-unicode: 7.0.2(postcss@8.5.2) + postcss-normalize-url: 7.0.0(postcss@8.5.2) + postcss-normalize-whitespace: 7.0.0(postcss@8.5.2) + postcss-ordered-values: 7.0.1(postcss@8.5.2) + postcss-reduce-initial: 7.0.2(postcss@8.5.2) + postcss-reduce-transforms: 7.0.0(postcss@8.5.2) + postcss-svgo: 7.0.1(postcss@8.5.2) + postcss-unique-selectors: 7.0.3(postcss@8.5.2) - cssnano-utils@5.0.0(postcss@8.5.1): + cssnano-utils@5.0.0(postcss@8.5.2): dependencies: - postcss: 8.5.1 + postcss: 8.5.2 - cssnano@7.0.6(postcss@8.5.1): + cssnano@7.0.6(postcss@8.5.2): dependencies: - cssnano-preset-default: 7.0.6(postcss@8.5.1) + cssnano-preset-default: 7.0.6(postcss@8.5.2) lilconfig: 3.1.2 - postcss: 8.5.1 + postcss: 8.5.2 csso@5.0.5: dependencies: @@ -11430,40 +11309,22 @@ snapshots: es-module-lexer@1.6.0: {} - esbuild-loader@4.2.2(webpack@5.97.1): + esbuild-loader@4.3.0(webpack@5.97.1(esbuild@0.25.0)): dependencies: - esbuild: 0.21.5 + esbuild: 0.25.0 + get-tsconfig: 4.8.0 + loader-utils: 2.0.4 + webpack: 5.97.1(esbuild@0.25.0) + webpack-sources: 1.4.3 + + esbuild-loader@4.3.0(webpack@5.97.1): + dependencies: + esbuild: 0.25.0 get-tsconfig: 4.8.0 loader-utils: 2.0.4 webpack: 5.97.1 webpack-sources: 1.4.3 - esbuild@0.21.5: - optionalDependencies: - '@esbuild/aix-ppc64': 0.21.5 - '@esbuild/android-arm': 0.21.5 - '@esbuild/android-arm64': 0.21.5 - '@esbuild/android-x64': 0.21.5 - '@esbuild/darwin-arm64': 0.21.5 - '@esbuild/darwin-x64': 0.21.5 - '@esbuild/freebsd-arm64': 0.21.5 - '@esbuild/freebsd-x64': 0.21.5 - '@esbuild/linux-arm': 0.21.5 - '@esbuild/linux-arm64': 0.21.5 - '@esbuild/linux-ia32': 0.21.5 - '@esbuild/linux-loong64': 0.21.5 - '@esbuild/linux-mips64el': 0.21.5 - '@esbuild/linux-ppc64': 0.21.5 - '@esbuild/linux-riscv64': 0.21.5 - '@esbuild/linux-s390x': 0.21.5 - '@esbuild/linux-x64': 0.21.5 - '@esbuild/netbsd-x64': 0.21.5 - '@esbuild/openbsd-x64': 0.21.5 - '@esbuild/sunos-x64': 0.21.5 - '@esbuild/win32-arm64': 0.21.5 - '@esbuild/win32-ia32': 0.21.5 - '@esbuild/win32-x64': 0.21.5 - esbuild@0.23.1: optionalDependencies: '@esbuild/aix-ppc64': 0.23.1 @@ -11557,10 +11418,10 @@ snapshots: escape-string-regexp@5.0.0: {} - eslint-config-flat-gitignore@2.0.0(eslint@9.20.0(jiti@2.4.2)): + eslint-config-flat-gitignore@2.0.0(eslint@9.20.1(jiti@2.4.2)): dependencies: - '@eslint/compat': 1.2.5(eslint@9.20.0(jiti@2.4.2)) - eslint: 9.20.0(jiti@2.4.2) + '@eslint/compat': 1.2.5(eslint@9.20.1(jiti@2.4.2)) + eslint: 9.20.1(jiti@2.4.2) eslint-flat-config-utils@2.0.1: dependencies: @@ -11574,19 +11435,19 @@ snapshots: transitivePeerDependencies: - supports-color - eslint-merge-processors@1.0.0(eslint@9.20.0(jiti@2.4.2)): + eslint-merge-processors@1.0.0(eslint@9.20.1(jiti@2.4.2)): dependencies: - eslint: 9.20.0(jiti@2.4.2) + eslint: 9.20.1(jiti@2.4.2) - eslint-plugin-import-x@4.6.1(eslint@9.20.0(jiti@2.4.2))(typescript@5.7.3): + eslint-plugin-import-x@4.6.1(eslint@9.20.1(jiti@2.4.2))(typescript@5.7.3): dependencies: '@types/doctrine': 0.0.9 '@typescript-eslint/scope-manager': 8.23.0 - '@typescript-eslint/utils': 8.23.0(eslint@9.20.0(jiti@2.4.2))(typescript@5.7.3) + '@typescript-eslint/utils': 8.23.0(eslint@9.20.1(jiti@2.4.2))(typescript@5.7.3) debug: 4.4.0(supports-color@9.4.0) doctrine: 3.0.0 enhanced-resolve: 5.18.0 - eslint: 9.20.0(jiti@2.4.2) + eslint: 9.20.1(jiti@2.4.2) eslint-import-resolver-node: 0.3.9 get-tsconfig: 4.8.0 is-glob: 4.0.3 @@ -11598,14 +11459,14 @@ snapshots: - supports-color - typescript - eslint-plugin-jsdoc@50.6.3(eslint@9.20.0(jiti@2.4.2)): + eslint-plugin-jsdoc@50.6.3(eslint@9.20.1(jiti@2.4.2)): dependencies: '@es-joy/jsdoccomment': 0.49.0 are-docs-informative: 0.0.2 comment-parser: 1.4.1 debug: 4.4.0(supports-color@9.4.0) escape-string-regexp: 4.0.0 - eslint: 9.20.0(jiti@2.4.2) + eslint: 9.20.1(jiti@2.4.2) espree: 10.3.0 esquery: 1.6.0 parse-imports: 2.1.1 @@ -11617,35 +11478,35 @@ snapshots: eslint-plugin-no-only-tests@3.3.0: {} - eslint-plugin-perfectionist@4.8.0(eslint@9.20.0(jiti@2.4.2))(typescript@5.7.3): + eslint-plugin-perfectionist@4.8.0(eslint@9.20.1(jiti@2.4.2))(typescript@5.7.3): dependencies: '@typescript-eslint/types': 8.23.0 - '@typescript-eslint/utils': 8.23.0(eslint@9.20.0(jiti@2.4.2))(typescript@5.7.3) - eslint: 9.20.0(jiti@2.4.2) + '@typescript-eslint/utils': 8.23.0(eslint@9.20.1(jiti@2.4.2))(typescript@5.7.3) + eslint: 9.20.1(jiti@2.4.2) natural-orderby: 5.0.0 transitivePeerDependencies: - supports-color - typescript - eslint-plugin-regexp@2.7.0(eslint@9.20.0(jiti@2.4.2)): + eslint-plugin-regexp@2.7.0(eslint@9.20.1(jiti@2.4.2)): dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@9.20.0(jiti@2.4.2)) + '@eslint-community/eslint-utils': 4.4.0(eslint@9.20.1(jiti@2.4.2)) '@eslint-community/regexpp': 4.12.1 comment-parser: 1.4.1 - eslint: 9.20.0(jiti@2.4.2) + eslint: 9.20.1(jiti@2.4.2) jsdoc-type-pratt-parser: 4.1.0 refa: 0.12.1 regexp-ast-analysis: 0.7.1 scslre: 0.3.0 - eslint-plugin-unicorn@56.0.1(eslint@9.20.0(jiti@2.4.2)): + eslint-plugin-unicorn@56.0.1(eslint@9.20.1(jiti@2.4.2)): dependencies: '@babel/helper-validator-identifier': 7.25.9 - '@eslint-community/eslint-utils': 4.4.0(eslint@9.20.0(jiti@2.4.2)) + '@eslint-community/eslint-utils': 4.4.0(eslint@9.20.1(jiti@2.4.2)) ci-info: 4.0.0 clean-regexp: 1.0.0 core-js-compat: 3.38.1 - eslint: 9.20.0(jiti@2.4.2) + eslint: 9.20.1(jiti@2.4.2) esquery: 1.6.0 globals: 15.14.0 indent-string: 4.0.0 @@ -11658,24 +11519,24 @@ snapshots: semver: 7.7.1 strip-indent: 3.0.0 - eslint-plugin-vue@9.32.0(eslint@9.20.0(jiti@2.4.2)): + eslint-plugin-vue@9.32.0(eslint@9.20.1(jiti@2.4.2)): dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@9.20.0(jiti@2.4.2)) - eslint: 9.20.0(jiti@2.4.2) + '@eslint-community/eslint-utils': 4.4.0(eslint@9.20.1(jiti@2.4.2)) + eslint: 9.20.1(jiti@2.4.2) globals: 13.24.0 natural-compare: 1.4.0 nth-check: 2.1.1 postcss-selector-parser: 6.1.2 semver: 7.7.1 - vue-eslint-parser: 9.4.3(eslint@9.20.0(jiti@2.4.2)) + vue-eslint-parser: 9.4.3(eslint@9.20.1(jiti@2.4.2)) xml-name-validator: 4.0.0 transitivePeerDependencies: - supports-color - eslint-processor-vue-blocks@1.0.0(@vue/compiler-sfc@3.5.13)(eslint@9.20.0(jiti@2.4.2)): + eslint-processor-vue-blocks@1.0.0(@vue/compiler-sfc@3.5.13)(eslint@9.20.1(jiti@2.4.2)): dependencies: '@vue/compiler-sfc': 3.5.13 - eslint: 9.20.0(jiti@2.4.2) + eslint: 9.20.1(jiti@2.4.2) eslint-scope@5.1.1: dependencies: @@ -11692,9 +11553,9 @@ snapshots: esrecurse: 4.3.0 estraverse: 5.3.0 - eslint-typegen@1.0.0(eslint@9.20.0(jiti@2.4.2)): + eslint-typegen@1.0.0(eslint@9.20.1(jiti@2.4.2)): dependencies: - eslint: 9.20.0(jiti@2.4.2) + eslint: 9.20.1(jiti@2.4.2) json-schema-to-typescript-lite: 14.1.0 ohash: 1.1.4 @@ -11702,9 +11563,9 @@ snapshots: eslint-visitor-keys@4.2.0: {} - eslint@9.20.0(jiti@2.4.2): + eslint@9.20.1(jiti@2.4.2): dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@9.20.0(jiti@2.4.2)) + '@eslint-community/eslint-utils': 4.4.0(eslint@9.20.1(jiti@2.4.2)) '@eslint-community/regexpp': 4.12.1 '@eslint/config-array': 0.19.0 '@eslint/core': 0.11.0 @@ -11812,13 +11673,6 @@ snapshots: extend@3.0.2: {} - externality@1.0.2: - dependencies: - enhanced-resolve: 5.18.0 - mlly: 1.7.4 - pathe: 1.1.2 - ufo: 1.5.4 - fake-indexeddb@6.0.0: {} fast-deep-equal@3.1.3: {} @@ -11859,6 +11713,12 @@ snapshots: dependencies: flat-cache: 4.0.1 + file-loader@6.2.0(webpack@5.97.1(esbuild@0.25.0)): + dependencies: + loader-utils: 2.0.4 + schema-utils: 3.3.0 + webpack: 5.97.1(esbuild@0.25.0) + file-loader@6.2.0(webpack@5.97.1): dependencies: loader-utils: 2.0.4 @@ -12113,7 +11973,7 @@ snapshots: uncrypto: 0.1.3 unenv: 1.10.0 - happy-dom@17.0.2: + happy-dom@17.0.4: dependencies: webidl-conversions: 7.0.0 whatwg-mimetype: 3.0.0 @@ -12241,7 +12101,7 @@ snapshots: html-tags@3.3.1: {} - html-validate@9.2.1(vitest@3.0.5(@types/debug@4.1.12)(@types/node@22.13.1)(happy-dom@17.0.2)(jiti@2.4.2)(sass@1.78.0)(terser@5.32.0)(tsx@4.19.2)(yaml@2.7.0)): + html-validate@9.2.1(vitest@3.0.5(@types/debug@4.1.12)(@types/node@22.13.1)(happy-dom@17.0.4)(jiti@2.4.2)(sass@1.78.0)(terser@5.32.0)(tsx@4.19.2)(yaml@2.7.0)): dependencies: '@html-validate/stylish': 4.2.0 '@sidvind/better-ajv-errors': 3.0.1(ajv@8.17.1) @@ -12252,18 +12112,18 @@ snapshots: prompts: 2.4.2 semver: 7.7.1 optionalDependencies: - vitest: 3.0.5(@types/debug@4.1.12)(@types/node@22.13.1)(happy-dom@17.0.2)(jiti@2.4.2)(sass@1.78.0)(terser@5.32.0)(tsx@4.19.2)(yaml@2.7.0) + vitest: 3.0.5(@types/debug@4.1.12)(@types/node@22.13.1)(happy-dom@17.0.4)(jiti@2.4.2)(sass@1.78.0)(terser@5.32.0)(tsx@4.19.2)(yaml@2.7.0) html-void-elements@3.0.0: {} - htmlnano@2.1.1(cssnano@7.0.6(postcss@8.5.1))(postcss@8.5.1)(relateurl@0.2.7)(svgo@3.3.2)(terser@5.32.0)(typescript@5.7.3): + htmlnano@2.1.1(cssnano@7.0.6(postcss@8.5.2))(postcss@8.5.2)(relateurl@0.2.7)(svgo@3.3.2)(terser@5.32.0)(typescript@5.7.3): dependencies: cosmiconfig: 9.0.0(typescript@5.7.3) posthtml: 0.16.6 timsort: 0.3.0 optionalDependencies: - cssnano: 7.0.6(postcss@8.5.1) - postcss: 8.5.1 + cssnano: 7.0.6(postcss@8.5.2) + postcss: 8.5.2 relateurl: 0.2.7 svgo: 3.3.2 terser: 5.32.0 @@ -12316,9 +12176,9 @@ snapshots: hyperdyperid@1.2.0: {} - icss-utils@5.1.0(postcss@8.5.1): + icss-utils@5.1.0(postcss@8.5.2): dependencies: - postcss: 8.5.1 + postcss: 8.5.2 ieee754@1.2.1: {} @@ -12710,7 +12570,7 @@ snapshots: klona@2.0.6: {} - knip@5.43.6(@types/node@22.13.1)(typescript@5.7.3): + knip@5.44.0(@types/node@22.13.1)(typescript@5.7.3): dependencies: '@nodelib/fs.walk': 3.0.1 '@snyk/github-codeowners': 1.1.0 @@ -13300,6 +13160,12 @@ snapshots: min-indent@1.0.1: {} + mini-css-extract-plugin@2.9.2(webpack@5.97.1(esbuild@0.25.0)): + dependencies: + schema-utils: 4.2.0 + tapable: 2.2.1 + webpack: 5.97.1(esbuild@0.25.0) + mini-css-extract-plugin@2.9.2(webpack@5.97.1): dependencies: schema-utils: 4.2.0 @@ -13347,17 +13213,17 @@ snapshots: mkdist@2.2.0(typescript@5.7.3)(vue-tsc@2.1.10(typescript@5.7.3))(vue@3.5.13(typescript@5.7.3)): dependencies: - autoprefixer: 10.4.20(postcss@8.5.1) + autoprefixer: 10.4.20(postcss@8.5.2) citty: 0.1.6 - cssnano: 7.0.6(postcss@8.5.1) + cssnano: 7.0.6(postcss@8.5.2) defu: 6.1.4 esbuild: 0.24.2 jiti: 2.4.2 mlly: 1.7.4 pathe: 1.1.2 pkg-types: 1.3.1 - postcss: 8.5.1 - postcss-nested: 7.0.2(postcss@8.5.1) + postcss: 8.5.2 + postcss-nested: 7.0.2(postcss@8.5.2) semver: 7.7.1 tinyglobby: 0.2.10 optionalDependencies: @@ -13367,17 +13233,17 @@ snapshots: mkdist@2.2.0(typescript@5.7.3)(vue-tsc@2.2.0(typescript@5.7.3))(vue@3.5.13(typescript@5.7.3)): dependencies: - autoprefixer: 10.4.20(postcss@8.5.1) + autoprefixer: 10.4.20(postcss@8.5.2) citty: 0.1.6 - cssnano: 7.0.6(postcss@8.5.1) + cssnano: 7.0.6(postcss@8.5.2) defu: 6.1.4 esbuild: 0.24.2 jiti: 2.4.2 mlly: 1.7.4 pathe: 1.1.2 pkg-types: 1.3.1 - postcss: 8.5.1 - postcss-nested: 7.0.2(postcss@8.5.1) + postcss: 8.5.2 + postcss-nested: 7.0.2(postcss@8.5.2) semver: 7.7.1 tinyglobby: 0.2.10 optionalDependencies: @@ -13433,7 +13299,7 @@ snapshots: '@types/http-proxy': 1.17.15 '@vercel/nft': 0.27.4 archiver: 7.0.1 - c12: 2.0.1(magicast@0.3.5) + c12: 2.0.2(magicast@0.3.5) chalk: 5.3.0 chokidar: 3.6.0 citty: 0.1.6 @@ -13486,7 +13352,7 @@ snapshots: uncrypto: 0.1.3 unctx: 2.4.1 unenv: 1.10.0 - unimport: 4.1.0 + unimport: 4.1.1 unstorage: 1.14.4(db0@0.1.4)(ioredis@5.4.1) untyped: 1.5.2 unwasm: 0.3.9 @@ -13743,7 +13609,7 @@ snapshots: package-json-from-dist@1.0.0: {} - package-manager-detector@0.2.8: {} + package-manager-detector@0.2.9: {} packrup@0.1.2: {} @@ -13875,193 +13741,193 @@ snapshots: possible-typed-array-names@1.0.0: {} - postcss-calc@10.0.2(postcss@8.5.1): + postcss-calc@10.0.2(postcss@8.5.2): dependencies: - postcss: 8.5.1 + postcss: 8.5.2 postcss-selector-parser: 6.1.2 postcss-value-parser: 4.2.0 - postcss-colormin@7.0.2(postcss@8.5.1): + postcss-colormin@7.0.2(postcss@8.5.2): dependencies: browserslist: 4.24.0 caniuse-api: 3.0.0 colord: 2.9.3 - postcss: 8.5.1 + postcss: 8.5.2 postcss-value-parser: 4.2.0 - postcss-convert-values@7.0.4(postcss@8.5.1): + postcss-convert-values@7.0.4(postcss@8.5.2): dependencies: browserslist: 4.24.0 - postcss: 8.5.1 + postcss: 8.5.2 postcss-value-parser: 4.2.0 - postcss-discard-comments@7.0.3(postcss@8.5.1): + postcss-discard-comments@7.0.3(postcss@8.5.2): dependencies: - postcss: 8.5.1 + postcss: 8.5.2 postcss-selector-parser: 6.1.2 - postcss-discard-duplicates@7.0.1(postcss@8.5.1): + postcss-discard-duplicates@7.0.1(postcss@8.5.2): dependencies: - postcss: 8.5.1 + postcss: 8.5.2 - postcss-discard-empty@7.0.0(postcss@8.5.1): + postcss-discard-empty@7.0.0(postcss@8.5.2): dependencies: - postcss: 8.5.1 + postcss: 8.5.2 - postcss-discard-overridden@7.0.0(postcss@8.5.1): + postcss-discard-overridden@7.0.0(postcss@8.5.2): dependencies: - postcss: 8.5.1 + postcss: 8.5.2 postcss-import-resolver@2.0.0: dependencies: enhanced-resolve: 4.5.0 - postcss-import@16.1.0(postcss@8.5.1): + postcss-import@16.1.0(postcss@8.5.2): dependencies: - postcss: 8.5.1 + postcss: 8.5.2 postcss-value-parser: 4.2.0 read-cache: 1.0.0 resolve: 1.22.8 - postcss-loader@8.1.1(@rspack/core@1.2.2)(postcss@8.5.1)(typescript@5.7.3)(webpack@5.97.1): + postcss-loader@8.1.1(@rspack/core@1.2.3)(postcss@8.5.2)(typescript@5.7.3)(webpack@5.97.1): dependencies: cosmiconfig: 9.0.0(typescript@5.7.3) jiti: 2.4.2 - postcss: 8.5.1 + postcss: 8.5.2 semver: 7.7.1 optionalDependencies: - '@rspack/core': 1.2.2 + '@rspack/core': 1.2.3 webpack: 5.97.1 transitivePeerDependencies: - typescript postcss-media-query-parser@0.2.3: {} - postcss-merge-longhand@7.0.4(postcss@8.5.1): + postcss-merge-longhand@7.0.4(postcss@8.5.2): dependencies: - postcss: 8.5.1 + postcss: 8.5.2 postcss-value-parser: 4.2.0 - stylehacks: 7.0.4(postcss@8.5.1) + stylehacks: 7.0.4(postcss@8.5.2) - postcss-merge-rules@7.0.4(postcss@8.5.1): + postcss-merge-rules@7.0.4(postcss@8.5.2): dependencies: browserslist: 4.24.0 caniuse-api: 3.0.0 - cssnano-utils: 5.0.0(postcss@8.5.1) - postcss: 8.5.1 + cssnano-utils: 5.0.0(postcss@8.5.2) + postcss: 8.5.2 postcss-selector-parser: 6.1.2 - postcss-minify-font-values@7.0.0(postcss@8.5.1): + postcss-minify-font-values@7.0.0(postcss@8.5.2): dependencies: - postcss: 8.5.1 + postcss: 8.5.2 postcss-value-parser: 4.2.0 - postcss-minify-gradients@7.0.0(postcss@8.5.1): + postcss-minify-gradients@7.0.0(postcss@8.5.2): dependencies: colord: 2.9.3 - cssnano-utils: 5.0.0(postcss@8.5.1) - postcss: 8.5.1 + cssnano-utils: 5.0.0(postcss@8.5.2) + postcss: 8.5.2 postcss-value-parser: 4.2.0 - postcss-minify-params@7.0.2(postcss@8.5.1): + postcss-minify-params@7.0.2(postcss@8.5.2): dependencies: browserslist: 4.24.0 - cssnano-utils: 5.0.0(postcss@8.5.1) - postcss: 8.5.1 + cssnano-utils: 5.0.0(postcss@8.5.2) + postcss: 8.5.2 postcss-value-parser: 4.2.0 - postcss-minify-selectors@7.0.4(postcss@8.5.1): + postcss-minify-selectors@7.0.4(postcss@8.5.2): dependencies: cssesc: 3.0.0 - postcss: 8.5.1 + postcss: 8.5.2 postcss-selector-parser: 6.1.2 - postcss-modules-extract-imports@3.1.0(postcss@8.5.1): + postcss-modules-extract-imports@3.1.0(postcss@8.5.2): dependencies: - postcss: 8.5.1 + postcss: 8.5.2 - postcss-modules-local-by-default@4.0.5(postcss@8.5.1): + postcss-modules-local-by-default@4.0.5(postcss@8.5.2): dependencies: - icss-utils: 5.1.0(postcss@8.5.1) - postcss: 8.5.1 + icss-utils: 5.1.0(postcss@8.5.2) + postcss: 8.5.2 postcss-selector-parser: 6.1.2 postcss-value-parser: 4.2.0 - postcss-modules-scope@3.2.0(postcss@8.5.1): + postcss-modules-scope@3.2.0(postcss@8.5.2): dependencies: - postcss: 8.5.1 + postcss: 8.5.2 postcss-selector-parser: 6.1.2 - postcss-modules-values@4.0.0(postcss@8.5.1): + postcss-modules-values@4.0.0(postcss@8.5.2): dependencies: - icss-utils: 5.1.0(postcss@8.5.1) - postcss: 8.5.1 + icss-utils: 5.1.0(postcss@8.5.2) + postcss: 8.5.2 - postcss-nested@7.0.2(postcss@8.5.1): + postcss-nested@7.0.2(postcss@8.5.2): dependencies: - postcss: 8.5.1 + postcss: 8.5.2 postcss-selector-parser: 7.0.0 - postcss-normalize-charset@7.0.0(postcss@8.5.1): + postcss-normalize-charset@7.0.0(postcss@8.5.2): dependencies: - postcss: 8.5.1 + postcss: 8.5.2 - postcss-normalize-display-values@7.0.0(postcss@8.5.1): + postcss-normalize-display-values@7.0.0(postcss@8.5.2): dependencies: - postcss: 8.5.1 + postcss: 8.5.2 postcss-value-parser: 4.2.0 - postcss-normalize-positions@7.0.0(postcss@8.5.1): + postcss-normalize-positions@7.0.0(postcss@8.5.2): dependencies: - postcss: 8.5.1 + postcss: 8.5.2 postcss-value-parser: 4.2.0 - postcss-normalize-repeat-style@7.0.0(postcss@8.5.1): + postcss-normalize-repeat-style@7.0.0(postcss@8.5.2): dependencies: - postcss: 8.5.1 + postcss: 8.5.2 postcss-value-parser: 4.2.0 - postcss-normalize-string@7.0.0(postcss@8.5.1): + postcss-normalize-string@7.0.0(postcss@8.5.2): dependencies: - postcss: 8.5.1 + postcss: 8.5.2 postcss-value-parser: 4.2.0 - postcss-normalize-timing-functions@7.0.0(postcss@8.5.1): + postcss-normalize-timing-functions@7.0.0(postcss@8.5.2): dependencies: - postcss: 8.5.1 + postcss: 8.5.2 postcss-value-parser: 4.2.0 - postcss-normalize-unicode@7.0.2(postcss@8.5.1): + postcss-normalize-unicode@7.0.2(postcss@8.5.2): dependencies: browserslist: 4.24.0 - postcss: 8.5.1 + postcss: 8.5.2 postcss-value-parser: 4.2.0 - postcss-normalize-url@7.0.0(postcss@8.5.1): + postcss-normalize-url@7.0.0(postcss@8.5.2): dependencies: - postcss: 8.5.1 + postcss: 8.5.2 postcss-value-parser: 4.2.0 - postcss-normalize-whitespace@7.0.0(postcss@8.5.1): + postcss-normalize-whitespace@7.0.0(postcss@8.5.2): dependencies: - postcss: 8.5.1 + postcss: 8.5.2 postcss-value-parser: 4.2.0 - postcss-ordered-values@7.0.1(postcss@8.5.1): + postcss-ordered-values@7.0.1(postcss@8.5.2): dependencies: - cssnano-utils: 5.0.0(postcss@8.5.1) - postcss: 8.5.1 + cssnano-utils: 5.0.0(postcss@8.5.2) + postcss: 8.5.2 postcss-value-parser: 4.2.0 - postcss-reduce-initial@7.0.2(postcss@8.5.1): + postcss-reduce-initial@7.0.2(postcss@8.5.2): dependencies: browserslist: 4.24.0 caniuse-api: 3.0.0 - postcss: 8.5.1 + postcss: 8.5.2 - postcss-reduce-transforms@7.0.0(postcss@8.5.1): + postcss-reduce-transforms@7.0.0(postcss@8.5.2): dependencies: - postcss: 8.5.1 + postcss: 8.5.2 postcss-value-parser: 4.2.0 postcss-selector-parser@6.1.2: @@ -14074,28 +13940,28 @@ snapshots: cssesc: 3.0.0 util-deprecate: 1.0.2 - postcss-svgo@7.0.1(postcss@8.5.1): + postcss-svgo@7.0.1(postcss@8.5.2): dependencies: - postcss: 8.5.1 + postcss: 8.5.2 postcss-value-parser: 4.2.0 svgo: 3.3.2 - postcss-unique-selectors@7.0.3(postcss@8.5.1): + postcss-unique-selectors@7.0.3(postcss@8.5.2): dependencies: - postcss: 8.5.1 + postcss: 8.5.2 postcss-selector-parser: 6.1.2 - postcss-url@10.1.3(postcss@8.5.1): + postcss-url@10.1.3(postcss@8.5.2): dependencies: make-dir: 3.1.0 mime: 2.5.2 minimatch: 3.0.8 - postcss: 8.5.1 + postcss: 8.5.2 xxhashjs: 0.2.2 postcss-value-parser@4.2.0: {} - postcss@8.5.1: + postcss@8.5.2: dependencies: nanoid: 3.3.8 picocolors: 1.1.1 @@ -14116,7 +13982,7 @@ snapshots: prelude-ls@1.2.1: {} - prettier@3.4.2: {} + prettier@3.5.0: {} pretty-bytes@6.1.1: {} @@ -14574,12 +14440,12 @@ snapshots: safe-buffer@5.2.1: {} - sass-loader@16.0.4(@rspack/core@1.2.2)(webpack@5.97.1): + sass-loader@16.0.4(@rspack/core@1.2.3)(webpack@5.97.1(esbuild@0.25.0)): dependencies: neo-async: 2.6.2 optionalDependencies: - '@rspack/core': 1.2.2 - webpack: 5.97.1 + '@rspack/core': 1.2.3 + webpack: 5.97.1(esbuild@0.25.0) sass@1.78.0: dependencies: @@ -14886,10 +14752,10 @@ snapshots: structured-clone-es@1.0.0: {} - stylehacks@7.0.4(postcss@8.5.1): + stylehacks@7.0.4(postcss@8.5.2): dependencies: browserslist: 4.24.0 - postcss: 8.5.1 + postcss: 8.5.2 postcss-selector-parser: 6.1.2 summary@2.1.0: {} @@ -14957,6 +14823,17 @@ snapshots: mkdirp: 1.0.4 yallist: 4.0.0 + terser-webpack-plugin@5.3.10(esbuild@0.25.0)(webpack@5.97.1(esbuild@0.25.0)): + dependencies: + '@jridgewell/trace-mapping': 0.3.25 + jest-worker: 27.5.1 + schema-utils: 3.3.0 + serialize-javascript: 6.0.2 + terser: 5.32.0 + webpack: 5.97.1(esbuild@0.25.0) + optionalDependencies: + esbuild: 0.25.0 + terser-webpack-plugin@5.3.10(webpack@5.97.1): dependencies: '@jridgewell/trace-mapping': 0.3.25 @@ -15179,7 +15056,7 @@ snapshots: acorn: 8.14.0 estree-walker: 3.0.3 magic-string: 0.30.17 - unplugin: 2.1.2 + unplugin: 2.2.0 undici-types@6.20.0: {} @@ -15193,10 +15070,11 @@ snapshots: node-fetch-native: 1.6.6 pathe: 1.1.2 - unhead@2.0.0-alpha.9: + unhead@1.11.18: dependencies: - '@unhead/schema': 2.0.0-alpha.9 - '@unhead/shared': 2.0.0-alpha.9 + '@unhead/dom': 1.11.18 + '@unhead/schema': 1.11.18 + '@unhead/shared': 1.11.18 hookable: 5.5.3 unicode-emoji-modifier-base@1.0.0: {} @@ -15215,7 +15093,7 @@ snapshots: trough: 2.2.0 vfile: 6.0.3 - unimport@4.1.0: + unimport@4.1.1: dependencies: acorn: 8.14.0 escape-string-regexp: 5.0.0 @@ -15229,7 +15107,7 @@ snapshots: pkg-types: 1.3.1 scule: 1.3.0 strip-literal: 3.0.0 - unplugin: 2.1.2 + unplugin: 2.2.0 unplugin-utils: 0.2.3 unist-builder@4.0.0: @@ -15263,12 +15141,12 @@ snapshots: universalify@2.0.1: {} - unocss@65.4.3(postcss@8.5.1)(rollup@4.34.6)(vite@6.1.0(@types/node@22.13.1)(jiti@2.4.2)(sass@1.78.0)(terser@5.32.0)(tsx@4.19.2)(yaml@2.7.0))(vue@3.5.13(typescript@5.7.3)): + unocss@65.4.3(postcss@8.5.2)(rollup@4.34.6)(vite@6.1.0(@types/node@22.13.1)(jiti@2.4.2)(sass@1.78.0)(terser@5.32.0)(tsx@4.19.2)(yaml@2.7.0))(vue@3.5.13(typescript@5.7.3)): dependencies: '@unocss/astro': 65.4.3(rollup@4.34.6)(vite@6.1.0(@types/node@22.13.1)(jiti@2.4.2)(sass@1.78.0)(terser@5.32.0)(tsx@4.19.2)(yaml@2.7.0))(vue@3.5.13(typescript@5.7.3)) '@unocss/cli': 65.4.3(rollup@4.34.6) '@unocss/core': 65.4.3 - '@unocss/postcss': 65.4.3(postcss@8.5.1) + '@unocss/postcss': 65.4.3(postcss@8.5.2) '@unocss/preset-attributify': 65.4.3 '@unocss/preset-icons': 65.4.3 '@unocss/preset-mini': 65.4.3 @@ -15327,6 +15205,11 @@ snapshots: acorn: 8.14.0 webpack-virtual-modules: 0.6.2 + unplugin@2.2.0: + dependencies: + acorn: 8.14.0 + webpack-virtual-modules: 0.6.2 + unstorage@1.14.4(db0@0.1.4)(ioredis@5.4.1): dependencies: anymatch: 3.1.3 @@ -15451,7 +15334,7 @@ snapshots: - tsx - yaml - vite-plugin-checker@0.8.0(eslint@9.20.0(jiti@2.4.2))(optionator@0.9.4)(typescript@5.7.3)(vite@6.1.0(@types/node@22.13.1)(jiti@2.4.2)(terser@5.32.0)(tsx@4.19.2)(yaml@2.7.0))(vue-tsc@2.1.10(typescript@5.7.3)): + vite-plugin-checker@0.8.0(eslint@9.20.1(jiti@2.4.2))(optionator@0.9.4)(typescript@5.7.3)(vite@6.1.0(@types/node@22.13.1)(jiti@2.4.2)(terser@5.32.0)(tsx@4.19.2)(yaml@2.7.0))(vue-tsc@2.1.10(typescript@5.7.3)): dependencies: '@babel/code-frame': 7.26.2 ansi-escapes: 4.3.2 @@ -15469,7 +15352,7 @@ snapshots: vscode-languageserver-textdocument: 1.0.12 vscode-uri: 3.0.8 optionalDependencies: - eslint: 9.20.0(jiti@2.4.2) + eslint: 9.20.1(jiti@2.4.2) optionator: 0.9.4 typescript: 5.7.3 vue-tsc: 2.1.10(typescript@5.7.3) @@ -15505,7 +15388,7 @@ snapshots: vite@6.1.0(@types/node@22.13.1)(jiti@2.4.2)(sass@1.78.0)(terser@5.32.0)(tsx@4.19.2)(yaml@2.7.0): dependencies: esbuild: 0.24.2 - postcss: 8.5.1 + postcss: 8.5.2 rollup: 4.34.6 optionalDependencies: '@types/node': 22.13.1 @@ -15516,9 +15399,9 @@ snapshots: tsx: 4.19.2 yaml: 2.7.0 - vitest-environment-nuxt@1.0.1(@testing-library/vue@8.1.0(@vue/compiler-sfc@3.5.13)(vue@3.5.13(typescript@5.7.3)))(@types/node@22.13.1)(@vue/test-utils@2.4.6)(happy-dom@17.0.2)(jiti@2.4.2)(magicast@0.3.5)(playwright-core@1.50.1)(terser@5.32.0)(tsx@4.19.2)(typescript@5.7.3)(vitest@3.0.5(@types/debug@4.1.12)(@types/node@22.13.1)(happy-dom@17.0.2)(jiti@2.4.2)(terser@5.32.0)(tsx@4.19.2)(yaml@2.7.0))(yaml@2.7.0): + vitest-environment-nuxt@1.0.1(@testing-library/vue@8.1.0(@vue/compiler-sfc@3.5.13)(vue@3.5.13(typescript@5.7.3)))(@types/node@22.13.1)(@vue/test-utils@2.4.6)(happy-dom@17.0.4)(jiti@2.4.2)(magicast@0.3.5)(playwright-core@1.50.1)(terser@5.32.0)(tsx@4.19.2)(typescript@5.7.3)(vitest@3.0.5(@types/debug@4.1.12)(@types/node@22.13.1)(happy-dom@17.0.4)(jiti@2.4.2)(terser@5.32.0)(tsx@4.19.2)(yaml@2.7.0))(yaml@2.7.0): dependencies: - '@nuxt/test-utils': 3.15.4(@testing-library/vue@8.1.0(@vue/compiler-sfc@3.5.13)(vue@3.5.13(typescript@5.7.3)))(@types/node@22.13.1)(@vue/test-utils@2.4.6)(happy-dom@17.0.2)(jiti@2.4.2)(magicast@0.3.5)(playwright-core@1.50.1)(terser@5.32.0)(tsx@4.19.2)(typescript@5.7.3)(vitest@3.0.5(@types/debug@4.1.12)(@types/node@22.13.1)(happy-dom@17.0.2)(jiti@2.4.2)(terser@5.32.0)(tsx@4.19.2)(yaml@2.7.0))(yaml@2.7.0) + '@nuxt/test-utils': 3.15.4(@testing-library/vue@8.1.0(@vue/compiler-sfc@3.5.13)(vue@3.5.13(typescript@5.7.3)))(@types/node@22.13.1)(@vue/test-utils@2.4.6)(happy-dom@17.0.4)(jiti@2.4.2)(magicast@0.3.5)(playwright-core@1.50.1)(terser@5.32.0)(tsx@4.19.2)(typescript@5.7.3)(vitest@3.0.5(@types/debug@4.1.12)(@types/node@22.13.1)(happy-dom@17.0.4)(jiti@2.4.2)(terser@5.32.0)(tsx@4.19.2)(yaml@2.7.0))(yaml@2.7.0) transitivePeerDependencies: - '@cucumber/cucumber' - '@jest/globals' @@ -15544,7 +15427,7 @@ snapshots: - vitest - yaml - vitest@3.0.5(@types/debug@4.1.12)(@types/node@22.13.1)(happy-dom@17.0.2)(jiti@2.4.2)(sass@1.78.0)(terser@5.32.0)(tsx@4.19.2)(yaml@2.7.0): + vitest@3.0.5(@types/debug@4.1.12)(@types/node@22.13.1)(happy-dom@17.0.4)(jiti@2.4.2)(sass@1.78.0)(terser@5.32.0)(tsx@4.19.2)(yaml@2.7.0): dependencies: '@vitest/expect': 3.0.5 '@vitest/mocker': 3.0.5(vite@6.1.0(@types/node@22.13.1)(jiti@2.4.2)(sass@1.78.0)(terser@5.32.0)(tsx@4.19.2)(yaml@2.7.0)) @@ -15569,7 +15452,7 @@ snapshots: optionalDependencies: '@types/debug': 4.1.12 '@types/node': 22.13.1 - happy-dom: 17.0.2 + happy-dom: 17.0.4 transitivePeerDependencies: - jiti - less @@ -15617,10 +15500,10 @@ snapshots: vue-devtools-stub@0.1.0: {} - vue-eslint-parser@9.4.3(eslint@9.20.0(jiti@2.4.2)): + vue-eslint-parser@9.4.3(eslint@9.20.1(jiti@2.4.2)): dependencies: debug: 4.4.0(supports-color@9.4.0) - eslint: 9.20.0(jiti@2.4.2) + eslint: 9.20.1(jiti@2.4.2) eslint-scope: 7.2.2 eslint-visitor-keys: 3.4.3 espree: 9.6.1 @@ -15634,6 +15517,16 @@ snapshots: dependencies: vue: 3.5.13(typescript@5.7.3) + vue-loader@17.4.2(@vue/compiler-sfc@3.5.13)(vue@3.5.13(typescript@5.7.3))(webpack@5.97.1(esbuild@0.25.0)): + dependencies: + chalk: 4.1.2 + hash-sum: 2.0.0 + watchpack: 2.4.2 + webpack: 5.97.1(esbuild@0.25.0) + optionalDependencies: + '@vue/compiler-sfc': 3.5.13 + vue: 3.5.13(typescript@5.7.3) + vue-loader@17.4.2(@vue/compiler-sfc@3.5.13)(vue@3.5.13(typescript@5.7.3))(webpack@5.97.1): dependencies: chalk: 4.1.2 @@ -15711,6 +15604,17 @@ snapshots: - bufferutil - utf-8-validate + webpack-dev-middleware@7.4.2(webpack@5.97.1(esbuild@0.25.0)): + dependencies: + colorette: 2.0.20 + memfs: 4.17.0 + mime-types: 2.1.35 + on-finished: 2.4.1 + range-parser: 1.2.1 + schema-utils: 4.2.0 + optionalDependencies: + webpack: 5.97.1(esbuild@0.25.0) + webpack-dev-middleware@7.4.2(webpack@5.97.1): dependencies: colorette: 2.0.20 @@ -15767,14 +15671,44 @@ snapshots: - esbuild - uglify-js - webpackbar@7.0.0(@rspack/core@1.2.2)(webpack@5.97.1): + webpack@5.97.1(esbuild@0.25.0): + dependencies: + '@types/eslint-scope': 3.7.7 + '@types/estree': 1.0.6 + '@webassemblyjs/ast': 1.14.1 + '@webassemblyjs/wasm-edit': 1.14.1 + '@webassemblyjs/wasm-parser': 1.14.1 + acorn: 8.14.0 + browserslist: 4.24.0 + chrome-trace-event: 1.0.4 + enhanced-resolve: 5.18.0 + es-module-lexer: 1.6.0 + eslint-scope: 5.1.1 + events: 3.3.0 + glob-to-regexp: 0.4.1 + graceful-fs: 4.2.11 + json-parse-even-better-errors: 2.3.1 + loader-runner: 4.3.0 + mime-types: 2.1.35 + neo-async: 2.6.2 + schema-utils: 3.3.0 + tapable: 2.2.1 + terser-webpack-plugin: 5.3.10(esbuild@0.25.0)(webpack@5.97.1(esbuild@0.25.0)) + watchpack: 2.4.2 + webpack-sources: 3.2.3 + transitivePeerDependencies: + - '@swc/core' + - esbuild + - uglify-js + + webpackbar@7.0.0(@rspack/core@1.2.3)(webpack@5.97.1): dependencies: ansis: 3.3.2 consola: 3.4.0 pretty-time: 1.1.0 std-env: 3.8.0 optionalDependencies: - '@rspack/core': 1.2.2 + '@rspack/core': 1.2.3 webpack: 5.97.1 whatwg-mimetype@3.0.0: {} diff --git a/test/basic.test.ts b/test/basic.test.ts index 4a63764c5f..33d1944dff 100644 --- a/test/basic.test.ts +++ b/test/basic.test.ts @@ -2781,8 +2781,14 @@ describe('teleports', () => { }) }) -describe('Node.js compatibility for client-side', () => { - it('should work', async () => { +describe('experimental', () => { + it('decorators support works', async () => { + const html = await $fetch('/experimental/decorators') + expect(html).toContain('decorated-decorated') + expectNoClientErrors('/experimental/decorators') + }) + + it('Node.js compatibility for client-side', async () => { const { page } = await renderPage('/experimental/node-compat') await page.locator('body').getByText('Nuxt is Awesome!').waitFor() expect(await page.innerHTML('body')).toContain('CWD: [available]') diff --git a/test/fixtures/basic-types/package.json b/test/fixtures/basic-types/package.json index ff98a42d5b..15ae190447 100644 --- a/test/fixtures/basic-types/package.json +++ b/test/fixtures/basic-types/package.json @@ -16,6 +16,6 @@ "vue-router": "latest" }, "engines": { - "node": "^18.20.6 || ^20.9.0 || >=22.0.0" + "node": "^18.12.0 || ^20.9.0 || >=22.0.0" } } diff --git a/test/fixtures/basic/nuxt.config.ts b/test/fixtures/basic/nuxt.config.ts index e4cf482bf0..cb11c79be9 100644 --- a/test/fixtures/basic/nuxt.config.ts +++ b/test/fixtures/basic/nuxt.config.ts @@ -159,6 +159,7 @@ export default defineNuxtConfig({ inlineStyles: id => !!id && !id.includes('assets.vue'), }, experimental: { + decorators: true, serverAppConfig: true, typedPages: true, clientFallback: true, diff --git a/test/fixtures/basic/package.json b/test/fixtures/basic/package.json index 673f4ede02..b38be7c666 100644 --- a/test/fixtures/basic/package.json +++ b/test/fixtures/basic/package.json @@ -17,6 +17,6 @@ "vue": "latest" }, "engines": { - "node": "^18.20.6 || ^20.9.0 || >=22.0.0" + "node": "^18.12.0 || ^20.9.0 || >=22.0.0" } } diff --git a/test/fixtures/basic/pages/experimental/decorators.vue b/test/fixtures/basic/pages/experimental/decorators.vue new file mode 100644 index 0000000000..dfe7a49fb7 --- /dev/null +++ b/test/fixtures/basic/pages/experimental/decorators.vue @@ -0,0 +1,26 @@ + + + + + diff --git a/test/fixtures/basic/server/api/experimental/decorators.ts b/test/fixtures/basic/server/api/experimental/decorators.ts new file mode 100644 index 0000000000..94de19fce7 --- /dev/null +++ b/test/fixtures/basic/server/api/experimental/decorators.ts @@ -0,0 +1,14 @@ +export default eventHandler((_event) => { + function something (_method: () => unknown) { + return () => 'decorated' + } + + class SomeClass { + @something + public someMethod () { + return 'initial' + } + } + + return new SomeClass().someMethod() +}) diff --git a/test/fixtures/hmr/package.json b/test/fixtures/hmr/package.json index 9901ba8b0c..b74ef3c44d 100644 --- a/test/fixtures/hmr/package.json +++ b/test/fixtures/hmr/package.json @@ -8,6 +8,6 @@ "nuxt": "workspace:*" }, "engines": { - "node": "^18.20.6 || ^20.9.0 || >=22.0.0" + "node": "^18.12.0 || ^20.9.0 || >=22.0.0" } } diff --git a/test/fixtures/minimal-pages/package.json b/test/fixtures/minimal-pages/package.json index b7e823a0fa..96d26034e2 100644 --- a/test/fixtures/minimal-pages/package.json +++ b/test/fixtures/minimal-pages/package.json @@ -8,6 +8,6 @@ "nuxt": "workspace:*" }, "engines": { - "node": "^18.20.6 || ^20.9.0 || >=22.0.0" + "node": "^18.12.0 || ^20.9.0 || >=22.0.0" } } diff --git a/test/fixtures/minimal-types/package.json b/test/fixtures/minimal-types/package.json index f2738601a0..01260993dd 100644 --- a/test/fixtures/minimal-types/package.json +++ b/test/fixtures/minimal-types/package.json @@ -9,6 +9,6 @@ "nuxt": "workspace:*" }, "engines": { - "node": "^18.20.6 || ^20.9.0 || >=22.0.0" + "node": "^18.12.0 || ^20.9.0 || >=22.0.0" } } diff --git a/test/fixtures/minimal/package.json b/test/fixtures/minimal/package.json index 676b1aade7..ec8752d986 100644 --- a/test/fixtures/minimal/package.json +++ b/test/fixtures/minimal/package.json @@ -8,6 +8,6 @@ "nuxt": "workspace:*" }, "engines": { - "node": "^18.20.6 || ^20.9.0 || >=22.0.0" + "node": "^18.12.0 || ^20.9.0 || >=22.0.0" } } diff --git a/test/fixtures/runtime-compiler/package.json b/test/fixtures/runtime-compiler/package.json index 49e9889c85..4c45c2f351 100644 --- a/test/fixtures/runtime-compiler/package.json +++ b/test/fixtures/runtime-compiler/package.json @@ -8,6 +8,6 @@ "nuxt": "workspace:*" }, "engines": { - "node": "^18.20.6 || ^20.9.0 || >=22.0.0" + "node": "^18.12.0 || ^20.9.0 || >=22.0.0" } } diff --git a/test/fixtures/spa-loader/package.json b/test/fixtures/spa-loader/package.json index 2988c53a6b..c6ded69cca 100644 --- a/test/fixtures/spa-loader/package.json +++ b/test/fixtures/spa-loader/package.json @@ -10,6 +10,6 @@ "nuxt": "workspace:*" }, "engines": { - "node": "^18.20.6 || ^20.9.0 || >=22.0.0" + "node": "^18.12.0 || ^20.9.0 || >=22.0.0" } } diff --git a/test/fixtures/suspense/package.json b/test/fixtures/suspense/package.json index fb3c5bbf74..ab5e89d39a 100644 --- a/test/fixtures/suspense/package.json +++ b/test/fixtures/suspense/package.json @@ -11,6 +11,6 @@ "typescript": "latest" }, "engines": { - "node": "^18.20.6 || ^20.9.0 || >=22.0.0" + "node": "^18.12.0 || ^20.9.0 || >=22.0.0" } } diff --git a/test/nuxt/polyfills.test.ts b/test/nuxt/polyfills.test.ts new file mode 100644 index 0000000000..6fb4b3ec75 --- /dev/null +++ b/test/nuxt/polyfills.test.ts @@ -0,0 +1,29 @@ +import { mount } from '@vue/test-utils' +import { describe, expect, it, vi } from 'vitest' +import { defineComponent, h } from 'vue' + +describe('app/compat', () => { + const Component = defineComponent({ + setup () { + const visible = ref(false) + setInterval(() => { + visible.value = true + }, 1000) + + return () => h('div', {}, visible.value ? h('span', { id: 'child' }) : {}) + }, + }) + it('setInterval is not auto-imported', async () => { + vi.useFakeTimers() + + const wrapper = mount(Component) + + vi.advanceTimersByTime(1000) + + await wrapper.vm.$nextTick() + + expect(wrapper.find('#child').exists()).toBe(true) + + vi.useRealTimers() + }) +}) diff --git a/vitest.nuxt.config.ts b/vitest.nuxt.config.ts index 31f2c9e6a2..2aeda8d9eb 100644 --- a/vitest.nuxt.config.ts +++ b/vitest.nuxt.config.ts @@ -22,6 +22,9 @@ export default defineVitestConfig({ experimental: { appManifest: process.env.TEST_MANIFEST !== 'manifest-off', }, + imports: { + polyfills: false, + }, }, }, },