diff --git a/.github/workflows/autofix-docs.yml b/.github/workflows/autofix-docs.yml index edc59497ef..d90a8e2f9e 100644 --- a/.github/workflows/autofix-docs.yml +++ b/.github/workflows/autofix-docs.yml @@ -17,7 +17,7 @@ jobs: runs-on: ubuntu-latest steps: - - uses: actions/checkout@a5ac7e51b41094c92402da3b24376905380afc29 # v4.1.6 + - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 - run: corepack enable - uses: actions/setup-node@60edb5dd545a775178f52524783378180af0d1f8 # v4.0.2 with: diff --git a/.github/workflows/autofix.yml b/.github/workflows/autofix.yml index 4af68cee5e..03d5a654f3 100644 --- a/.github/workflows/autofix.yml +++ b/.github/workflows/autofix.yml @@ -13,7 +13,7 @@ jobs: runs-on: ubuntu-latest steps: - - uses: actions/checkout@a5ac7e51b41094c92402da3b24376905380afc29 # v4.1.6 + - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 - run: corepack enable - uses: actions/setup-node@60edb5dd545a775178f52524783378180af0d1f8 # v4.0.2 with: diff --git a/.github/workflows/benchmark.yml b/.github/workflows/benchmark.yml index f3bc4aa393..83645d7c3e 100644 --- a/.github/workflows/benchmark.yml +++ b/.github/workflows/benchmark.yml @@ -29,7 +29,7 @@ jobs: runs-on: ubuntu-latest steps: - - uses: actions/checkout@a5ac7e51b41094c92402da3b24376905380afc29 # v4.1.6 + - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 - run: corepack enable - uses: actions/setup-node@60edb5dd545a775178f52524783378180af0d1f8 # v4.0.2 with: diff --git a/.github/workflows/changelog.yml b/.github/workflows/changelog.yml index b2e4b57ea5..492a0fb118 100644 --- a/.github/workflows/changelog.yml +++ b/.github/workflows/changelog.yml @@ -20,7 +20,7 @@ jobs: runs-on: ubuntu-latest steps: - - uses: actions/checkout@a5ac7e51b41094c92402da3b24376905380afc29 # v4.1.6 + - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 with: fetch-depth: 0 - run: corepack enable diff --git a/.github/workflows/check-links.yml b/.github/workflows/check-links.yml index 4a81648ec0..14a3db9075 100644 --- a/.github/workflows/check-links.yml +++ b/.github/workflows/check-links.yml @@ -25,7 +25,7 @@ jobs: restore-keys: cache-lychee- # check links with Lychee - - uses: actions/checkout@a5ac7e51b41094c92402da3b24376905380afc29 # v4.1.6 + - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 - name: Lychee link checker uses: lycheeverse/lychee-action@25a231001d1723960a301b7d4c82884dc7ef857d # for v1.8.0 diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 2f98bf80f1..1c4c56cfc2 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -35,7 +35,7 @@ jobs: timeout-minutes: 10 steps: - - uses: actions/checkout@a5ac7e51b41094c92402da3b24376905380afc29 # v4.1.6 + - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 - run: corepack enable - uses: actions/setup-node@60edb5dd545a775178f52524783378180af0d1f8 # v4.0.2 with: @@ -72,7 +72,7 @@ jobs: - build steps: - - uses: actions/checkout@a5ac7e51b41094c92402da3b24376905380afc29 # v4.1.6 + - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 - run: corepack enable - uses: actions/setup-node@60edb5dd545a775178f52524783378180af0d1f8 # v4.0.2 with: @@ -83,7 +83,7 @@ jobs: run: pnpm install - name: Initialize CodeQL - uses: github/codeql-action/init@2e230e8fe0ad3a14a340ad0815ddb96d599d2aff # v3.25.8 + uses: github/codeql-action/init@23acc5c183826b7a8a97bce3cecc52db901f8251 # v3.25.10 with: languages: javascript queries: +security-and-quality @@ -95,7 +95,7 @@ jobs: path: packages - name: Perform CodeQL Analysis - uses: github/codeql-action/analyze@2e230e8fe0ad3a14a340ad0815ddb96d599d2aff # v3.25.8 + uses: github/codeql-action/analyze@23acc5c183826b7a8a97bce3cecc52db901f8251 # v3.25.10 with: category: "/language:javascript" @@ -111,7 +111,7 @@ jobs: module: ["bundler", "node"] steps: - - uses: actions/checkout@a5ac7e51b41094c92402da3b24376905380afc29 # v4.1.6 + - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 - run: corepack enable - uses: actions/setup-node@60edb5dd545a775178f52524783378180af0d1f8 # v4.0.2 with: @@ -142,7 +142,7 @@ jobs: timeout-minutes: 10 steps: - - uses: actions/checkout@a5ac7e51b41094c92402da3b24376905380afc29 # v4.1.6 + - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 - run: corepack enable - uses: actions/setup-node@60edb5dd545a775178f52524783378180af0d1f8 # v4.0.2 with: @@ -166,7 +166,7 @@ jobs: needs: - build steps: - - uses: actions/checkout@a5ac7e51b41094c92402da3b24376905380afc29 # v4.1.6 + - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 - run: corepack enable - uses: actions/setup-node@60edb5dd545a775178f52524783378180af0d1f8 # v4.0.2 with: @@ -218,7 +218,7 @@ jobs: timeout-minutes: 15 steps: - - uses: actions/checkout@a5ac7e51b41094c92402da3b24376905380afc29 # v4.1.6 + - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 - run: corepack enable - uses: actions/setup-node@60edb5dd545a775178f52524783378180af0d1f8 # v4.0.2 with: @@ -248,7 +248,7 @@ jobs: TEST_PAYLOAD: ${{ matrix.payload }} SKIP_BUNDLE_SIZE: ${{ github.event_name != 'push' || matrix.env == 'dev' || matrix.builder == 'webpack' || matrix.context == 'default' || matrix.payload == 'js' || runner.os == 'Windows' }} - - uses: codecov/codecov-action@125fc84a9a348dbcf27191600683ec096ec9021c # v4.4.1 + - uses: codecov/codecov-action@e28ff129e5465c2c0dcc6f003fc735cb6ae0c673 # v4.5.0 if: github.event_name != 'push' && matrix.env == 'built' && matrix.builder == 'vite' && matrix.context == 'default' && matrix.os == 'ubuntu-latest' && matrix.manifest == 'manifest-on' with: token: ${{ secrets.CODECOV_TOKEN }} @@ -270,7 +270,7 @@ jobs: timeout-minutes: 20 steps: - - uses: actions/checkout@a5ac7e51b41094c92402da3b24376905380afc29 # v4.1.6 + - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 with: fetch-depth: 0 - run: corepack enable @@ -309,7 +309,7 @@ jobs: timeout-minutes: 20 steps: - - uses: actions/checkout@a5ac7e51b41094c92402da3b24376905380afc29 # v4.1.6 + - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 with: fetch-depth: 0 - run: corepack enable diff --git a/.github/workflows/dependency-review.yml b/.github/workflows/dependency-review.yml index 7c6cfb6746..7d1ac0d64a 100644 --- a/.github/workflows/dependency-review.yml +++ b/.github/workflows/dependency-review.yml @@ -17,6 +17,6 @@ jobs: runs-on: ubuntu-latest steps: - name: 'Checkout Repository' - uses: actions/checkout@a5ac7e51b41094c92402da3b24376905380afc29 # v4.1.6 + uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 - name: 'Dependency Review' uses: actions/dependency-review-action@72eb03d02c7872a771aacd928f3123ac62ad6d3a # v4.3.3 diff --git a/.github/workflows/docs.yml b/.github/workflows/docs.yml index f2bdb9b4f1..624cafa244 100644 --- a/.github/workflows/docs.yml +++ b/.github/workflows/docs.yml @@ -20,7 +20,7 @@ jobs: runs-on: ubuntu-latest steps: - - uses: actions/checkout@a5ac7e51b41094c92402da3b24376905380afc29 # v4.1.6 + - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 - run: corepack enable - uses: actions/setup-node@60edb5dd545a775178f52524783378180af0d1f8 # v4.0.2 with: diff --git a/.github/workflows/introspect.yml b/.github/workflows/introspect.yml index 06f7994104..6b7f4fd586 100644 --- a/.github/workflows/introspect.yml +++ b/.github/workflows/introspect.yml @@ -21,7 +21,7 @@ jobs: runs-on: ubuntu-latest steps: - - uses: actions/checkout@a5ac7e51b41094c92402da3b24376905380afc29 # v4.1.6 + - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 # From https://github.com/rhysd/actionlint/blob/main/docs/usage.md#use-actionlint-on-github-actions - name: Check workflow files run: | diff --git a/.github/workflows/release-pr.yml b/.github/workflows/release-pr.yml index 5f128f7df6..7a45a29223 100644 --- a/.github/workflows/release-pr.yml +++ b/.github/workflows/release-pr.yml @@ -29,7 +29,7 @@ jobs: env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - - uses: actions/checkout@a5ac7e51b41094c92402da3b24376905380afc29 # v4.1.6 + - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 with: ref: ${{ github.event.issue.pull_request.head.sha }} fetch-depth: 0 diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index d975a363f3..727d0669ea 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -17,7 +17,7 @@ jobs: runs-on: ubuntu-latest timeout-minutes: 20 steps: - - uses: actions/checkout@a5ac7e51b41094c92402da3b24376905380afc29 # v4.1.6 + - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 with: fetch-depth: 0 - run: corepack enable diff --git a/.github/workflows/reproduire.yml b/.github/workflows/reproduire.yml index b001dd9fca..e38add83d7 100644 --- a/.github/workflows/reproduire.yml +++ b/.github/workflows/reproduire.yml @@ -10,7 +10,7 @@ jobs: reproduire: runs-on: ubuntu-latest steps: - - uses: actions/checkout@a5ac7e51b41094c92402da3b24376905380afc29 # v4.1.6 + - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 - uses: Hebilicious/reproduire@4b686ae9cbb72dad60f001d278b6e3b2ce40a9ac # v0.0.9-mp with: label: needs reproduction diff --git a/.github/workflows/scorecards.yml b/.github/workflows/scorecards.yml index 7a36b4a412..fb0b7dc233 100644 --- a/.github/workflows/scorecards.yml +++ b/.github/workflows/scorecards.yml @@ -32,7 +32,7 @@ jobs: steps: - name: "Checkout code" - uses: actions/checkout@a5ac7e51b41094c92402da3b24376905380afc29 # v4.1.6 + uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 with: persist-credentials: false @@ -68,7 +68,7 @@ jobs: # Upload the results to GitHub's code scanning dashboard. - name: "Upload to code-scanning" - uses: github/codeql-action/upload-sarif@2e230e8fe0ad3a14a340ad0815ddb96d599d2aff # v3.25.8 + uses: github/codeql-action/upload-sarif@23acc5c183826b7a8a97bce3cecc52db901f8251 # v3.25.10 if: github.repository == 'nuxt/nuxt' && success() with: sarif_file: results.sarif diff --git a/docs/2.guide/3.going-further/3.modules.md b/docs/2.guide/3.going-further/3.modules.md index 8c354e5e21..7582e90617 100644 --- a/docs/2.guide/3.going-further/3.modules.md +++ b/docs/2.guide/3.going-further/3.modules.md @@ -155,7 +155,7 @@ export default defineNuxtModule({ // Compatibility constraints compatibility: { // Semver version of supported nuxt versions - nuxt: '^3.0.0' + nuxt: '>=3.0.0' } }, // Default configuration options for your module, can also be a function returning those diff --git a/docs/3.api/2.composables/use-async-data.md b/docs/3.api/2.composables/use-async-data.md index 0885af2107..b839fb1d08 100644 --- a/docs/3.api/2.composables/use-async-data.md +++ b/docs/3.api/2.composables/use-async-data.md @@ -18,7 +18,7 @@ Within your pages, components, and plugins you can use useAsyncData to get acces ```vue [pages/index.vue] ``` ::note -`data`, `pending`, `status` and `error` are Vue refs and they should be accessed with `.value` when used within the ` ``` +::warning +Possible breaking change: `head` receives the nuxt app but cannot access the component instance. If the code in your `head` tries to access the data object through `this` or `this.$data`, you will need to migrate to the `useHead` composable. +:: + ## Title Template If you want to use a function (for full control), then this cannot be set in your nuxt.config, and it is recommended instead to set it within your `/layouts` directory. diff --git a/package.json b/package.json index eec7837f9a..03e833fefe 100644 --- a/package.json +++ b/package.json @@ -42,7 +42,7 @@ "magic-string": "^0.30.10", "nuxt": "workspace:*", "rollup": "^4.18.0", - "vite": "5.2.13", + "vite": "5.3.0", "vue": "3.4.27" }, "devDependencies": { @@ -56,7 +56,7 @@ "@types/fs-extra": "11.0.4", "@types/node": "20.14.2", "@types/semver": "7.5.8", - "@unhead/schema": "1.9.12", + "@unhead/schema": "1.9.13", "@vitejs/plugin-vue": "5.0.4", "@vitest/coverage-v8": "1.6.0", "@vue/test-utils": "2.4.6", @@ -66,7 +66,7 @@ "devalue": "5.0.0", "eslint": "9.4.0", "eslint-plugin-no-only-tests": "3.1.0", - "eslint-plugin-perfectionist": "2.10.0", + "eslint-plugin-perfectionist": "2.11.0", "eslint-typegen": "0.2.4", "execa": "9.2.0", "fs-extra": "11.2.0", diff --git a/packages/kit/package.json b/packages/kit/package.json index 3544978785..310931589b 100644 --- a/packages/kit/package.json +++ b/packages/kit/package.json @@ -27,7 +27,7 @@ }, "dependencies": { "@nuxt/schema": "workspace:*", - "c12": "^1.10.0", + "c12": "^1.11.1", "consola": "^3.2.3", "defu": "^6.1.4", "destr": "^2.0.3", @@ -54,7 +54,7 @@ "lodash-es": "4.17.21", "nitropack": "2.9.6", "unbuild": "latest", - "vite": "5.2.13", + "vite": "5.3.0", "vitest": "1.6.0", "webpack": "5.92.0" }, diff --git a/packages/kit/src/internal/cjs.ts b/packages/kit/src/internal/cjs.ts index 7e30acfec7..b2c01e8c69 100644 --- a/packages/kit/src/internal/cjs.ts +++ b/packages/kit/src/internal/cjs.ts @@ -61,7 +61,7 @@ function getRequireCacheItem (id: string) { } } -export function getModulePaths (paths?: string[] | string) { +export function getNodeModulesPaths (paths?: string[] | string) { return ([] as Array).concat( global.__NUXT_PREPATHS__, paths || [], @@ -73,7 +73,7 @@ export function getModulePaths (paths?: string[] | string) { /** @deprecated Do not use CJS utils */ export function resolveModule (id: string, opts: ResolveModuleOptions = {}) { return normalize(_require.resolve(id, { - paths: getModulePaths(opts.paths), + paths: getNodeModulesPaths(opts.paths), })) } diff --git a/packages/kit/src/internal/template.ts b/packages/kit/src/internal/template.ts index 5b40a2a214..343393e5ec 100644 --- a/packages/kit/src/internal/template.ts +++ b/packages/kit/src/internal/template.ts @@ -32,10 +32,11 @@ const serialize = (data: any) => JSON.stringify(data, null, 2).replace(/"\{(.+)\ /** @deprecated */ const importSources = (sources: string | string[], { lazy = false } = {}) => { return toArray(sources).map((src) => { + const safeVariableName = genSafeVariableName(src) if (lazy) { - return `const ${genSafeVariableName(src)} = ${genDynamicImport(src, { comment: `webpackChunkName: ${JSON.stringify(src)}` })}` + return `const ${safeVariableName} = ${genDynamicImport(src, { comment: `webpackChunkName: ${JSON.stringify(src)}` })}` } - return genImport(src, genSafeVariableName(src)) + return genImport(src, safeVariableName) }).join('\n') } diff --git a/packages/kit/src/loader/config.ts b/packages/kit/src/loader/config.ts index fab118bf6c..8e2c1354a9 100644 --- a/packages/kit/src/loader/config.ts +++ b/packages/kit/src/loader/config.ts @@ -7,10 +7,17 @@ import { NuxtConfigSchema } from '@nuxt/schema' import { globby } from 'globby' import defu from 'defu' -export interface LoadNuxtConfigOptions extends LoadConfigOptions {} +export interface LoadNuxtConfigOptions extends Omit, 'overrides'> { + overrides?: Exclude['overrides'], Promise | Function> +} const layerSchemaKeys = ['future', 'srcDir', 'rootDir', 'dir'] -const layerSchema = Object.fromEntries(Object.entries(NuxtConfigSchema).filter(([key]) => layerSchemaKeys.includes(key))) +const layerSchema = Object.create(null) +for (const key of layerSchemaKeys) { + if (key in NuxtConfigSchema) { + layerSchema[key] = NuxtConfigSchema[key] + } +} export async function loadNuxtConfig (opts: LoadNuxtConfigOptions): Promise { // Automatically detect and import layers from `~~/layers/` directory @@ -40,10 +47,15 @@ export async function loadNuxtConfig (opts: LoadNuxtConfigOptions): Promise[] = [] + const processedLayers = new Set() for (const layer of layers) { // Resolve `rootDir` & `srcDir` of layers layer.config = layer.config || {} - layer.config.rootDir = layer.config.rootDir ?? layer.cwd + layer.config.rootDir = layer.config.rootDir ?? layer.cwd! + + // Only process/resolve layers once + if (processedLayers.has(layer.config.rootDir)) { continue } + processedLayers.add(layer.config.rootDir) // Normalise layer directories layer.config = await applyDefaults(layerSchema, layer.config as NuxtConfig & Record) as unknown as NuxtConfig diff --git a/packages/kit/src/module/compatibility.ts b/packages/kit/src/module/compatibility.ts index 446e7e3fce..5bccbf8654 100644 --- a/packages/kit/src/module/compatibility.ts +++ b/packages/kit/src/module/compatibility.ts @@ -51,11 +51,10 @@ export async function getNuxtModuleVersion (module: string | NuxtModule, nuxt: N // need a name from here if (!moduleMeta.name) { return false } // maybe the version got attached within the installed module instance? - const version = nuxt.options._installedModules - // @ts-expect-error _installedModules is not typed - .filter(m => m.meta.name === moduleMeta.name).map(m => m.meta.version)?.[0] - if (version) { - return version + for (const m of nuxt.options._installedModules) { + if (m.meta.name === moduleMeta.name && m.meta.version) { + return m.meta.version + } } // it's possible that the module will be installed, it just hasn't been done yet, preemptively load the instance if (hasNuxtModule(moduleMeta.name)) { diff --git a/packages/kit/src/pages.ts b/packages/kit/src/pages.ts index a5f7fc1d3e..04c7592a55 100644 --- a/packages/kit/src/pages.ts +++ b/packages/kit/src/pages.ts @@ -51,11 +51,12 @@ export function addRouteMiddleware (input: NuxtMiddleware | NuxtMiddleware[], op for (const middleware of middlewares) { const find = app.middleware.findIndex(item => item.name === middleware.name) if (find >= 0) { - if (app.middleware[find].path === middleware.path) { continue } + const foundPath = app.middleware[find].path + if (foundPath === middleware.path) { continue } if (options.override === true) { app.middleware[find] = { ...middleware } } else { - logger.warn(`'${middleware.name}' middleware already exists at '${app.middleware[find].path}'. You can set \`override: true\` to replace it.`) + logger.warn(`'${middleware.name}' middleware already exists at '${foundPath}'. You can set \`override: true\` to replace it.`) } } else { app.middleware.push({ ...middleware }) diff --git a/packages/kit/src/resolve.ts b/packages/kit/src/resolve.ts index 392dec86d8..b170210efe 100644 --- a/packages/kit/src/resolve.ts +++ b/packages/kit/src/resolve.ts @@ -168,8 +168,8 @@ export function createResolver (base: string | URL): Resolver { } } -export async function resolveNuxtModule (base: string, paths: string[]) { - const resolved = [] +export async function resolveNuxtModule (base: string, paths: string[]): Promise { + const resolved: string[] = [] const resolver = createResolver(base) for (const path of paths) { @@ -209,6 +209,12 @@ function existsInVFS (path: string, nuxt = tryUseNuxt()) { } export async function resolveFiles (path: string, pattern: string | string[], opts: { followSymbolicLinks?: boolean } = {}) { - const files = await globby(pattern, { cwd: path, followSymbolicLinks: opts.followSymbolicLinks ?? true }) - return files.map(p => resolve(path, p)).filter(p => !isIgnored(p)).sort() + const files: string[] = [] + for (const file of await globby(pattern, { cwd: path, followSymbolicLinks: opts.followSymbolicLinks ?? true })) { + const p = resolve(path, file) + if (!isIgnored(p)) { + files.push(p) + } + } + return files.sort() } diff --git a/packages/kit/src/template.ts b/packages/kit/src/template.ts index 194434f69f..8e729c2f20 100644 --- a/packages/kit/src/template.ts +++ b/packages/kit/src/template.ts @@ -11,7 +11,7 @@ import { readPackageJSON } from 'pkg-types' import { tryResolveModule } from './internal/esm' import { getDirectory } from './module/install' import { tryUseNuxt, useNuxt } from './context' -import { getModulePaths } from './internal/cjs' +import { getNodeModulesPaths } from './internal/cjs' import { resolveNuxtModule } from './resolve' /** @@ -113,18 +113,55 @@ export async function updateTemplates (options?: { filter?: (template: ResolvedN } export async function _generateTypes (nuxt: Nuxt) { - const nodeModulePaths = getModulePaths(nuxt.options.modulesDir) - const rootDirWithSlash = withTrailingSlash(nuxt.options.rootDir) + const relativeRootDir = relativeWithDot(nuxt.options.buildDir, nuxt.options.rootDir) - const modulePaths = await resolveNuxtModule(rootDirWithSlash, - nuxt.options._installedModules - .filter(m => m.entryPath) - .map(m => getDirectory(m.entryPath)), - ) + const include = new Set([ + './nuxt.d.ts', + join(relativeRootDir, '.config/nuxt.*'), + join(relativeRootDir, '**/*'), + ]) + + if (nuxt.options.srcDir !== nuxt.options.rootDir) { + include.add(join(relative(nuxt.options.buildDir, nuxt.options.srcDir), '**/*')) + } + + if (nuxt.options.typescript.includeWorkspace && nuxt.options.workspaceDir !== nuxt.options.rootDir) { + include.add(join(relative(nuxt.options.buildDir, nuxt.options.workspaceDir), '**/*')) + } + + for (const layer of nuxt.options._layers) { + const srcOrCwd = layer.config.srcDir ?? layer.cwd + if (!srcOrCwd.startsWith(rootDirWithSlash) || srcOrCwd.includes('node_modules')) { + include.add(join(relative(nuxt.options.buildDir, srcOrCwd), '**/*')) + } + } + + const exclude = new Set([ + // nitro generate output: https://github.com/nuxt/nuxt/blob/main/packages/nuxt/src/core/nitro.ts#L186 + relativeWithDot(nuxt.options.buildDir, resolve(nuxt.options.rootDir, 'dist')), + ]) + + for (const dir of nuxt.options.modulesDir) { + exclude.add(relativeWithDot(nuxt.options.buildDir, dir)) + } + + const moduleEntryPaths: string[] = [] + for (const m of nuxt.options._installedModules) { + if (m.entryPath) { + moduleEntryPaths.push(getDirectory(m.entryPath)) + } + } + + const modulePaths = await resolveNuxtModule(rootDirWithSlash, moduleEntryPaths) + + for (const path of modulePaths) { + const relative = relativeWithDot(nuxt.options.buildDir, path) + include.add(join(relative, 'runtime')) + exclude.add(join(relative, 'runtime/server')) + } const isV4 = nuxt.options.future?.compatibilityVersion === 4 - const hasTypescriptVersionWithModulePreserve = await readPackageJSON('typescript', { url: nuxt.options.modulesDir }) .then(r => r?.version && gte(r.version, '5.4.0')) .catch(() => isV4) @@ -168,23 +205,8 @@ export async function _generateTypes (nuxt: Nuxt) { noImplicitThis: true, /* enabled with `strict` */ allowSyntheticDefaultImports: true, }, - include: [ - './nuxt.d.ts', - join(relativeWithDot(nuxt.options.buildDir, nuxt.options.rootDir), '.config/nuxt.*'), - join(relativeWithDot(nuxt.options.buildDir, nuxt.options.rootDir), '**/*'), - ...nuxt.options.srcDir !== nuxt.options.rootDir ? [join(relative(nuxt.options.buildDir, nuxt.options.srcDir), '**/*')] : [], - ...nuxt.options._layers.map(layer => layer.config.srcDir ?? layer.cwd) - .filter(srcOrCwd => !srcOrCwd.startsWith(rootDirWithSlash) || srcOrCwd.includes('node_modules')) - .map(srcOrCwd => join(relative(nuxt.options.buildDir, srcOrCwd), '**/*')), - ...nuxt.options.typescript.includeWorkspace && nuxt.options.workspaceDir !== nuxt.options.rootDir ? [join(relative(nuxt.options.buildDir, nuxt.options.workspaceDir), '**/*')] : [], - ...modulePaths.map(m => join(relativeWithDot(nuxt.options.buildDir, m), 'runtime')), - ], - exclude: [ - ...nuxt.options.modulesDir.map(m => relativeWithDot(nuxt.options.buildDir, m)), - ...modulePaths.map(m => join(relativeWithDot(nuxt.options.buildDir, m), 'runtime/server')), - // nitro generate output: https://github.com/nuxt/nuxt/blob/main/packages/nuxt/src/core/nitro.ts#L186 - relativeWithDot(nuxt.options.buildDir, resolve(nuxt.options.rootDir, 'dist')), - ], + include: [...include], + exclude: [...exclude], } satisfies TSConfig) const aliases: Record = { @@ -195,7 +217,9 @@ export async function _generateTypes (nuxt: Nuxt) { // Exclude bridge alias types to support Volar const excludedAlias = [/^@vue\/.*$/] - const basePath = tsConfig.compilerOptions!.baseUrl ? resolve(nuxt.options.buildDir, tsConfig.compilerOptions!.baseUrl) : nuxt.options.buildDir + const basePath = tsConfig.compilerOptions!.baseUrl + ? resolve(nuxt.options.buildDir, tsConfig.compilerOptions!.baseUrl) + : nuxt.options.buildDir tsConfig.compilerOptions = tsConfig.compilerOptions || {} tsConfig.include = tsConfig.include || [] @@ -237,12 +261,13 @@ export async function _generateTypes (nuxt: Nuxt) { } } - const references: TSReference[] = await Promise.all([ - ...nuxt.options.modules, - ...nuxt.options._modules, - ] - .filter(f => typeof f === 'string') - .map(async id => ({ types: (await readPackageJSON(id, { url: nodeModulePaths }).catch(() => null))?.name || id }))) + const references: TSReference[] = [] + await Promise.all([...nuxt.options.modules, ...nuxt.options._modules].map(async (id) => { + if (typeof id !== 'string') { return } + + const pkg = await readPackageJSON(id, { url: getNodeModulesPaths(nuxt.options.modulesDir) }).catch(() => null) + references.push(({ types: pkg?.name || id })) + })) const declarations: string[] = [] @@ -302,7 +327,11 @@ export async function writeTypes (nuxt: Nuxt) { } function renderAttrs (obj: Record) { - return Object.entries(obj).map(e => renderAttr(e[0], e[1])).join(' ') + const attrs: string[] = [] + for (const key in obj) { + attrs.push(renderAttr(key, obj[key])) + } + return attrs.join(' ') } function renderAttr (key: string, value: string) { diff --git a/packages/kit/test/generate-types.spec.ts b/packages/kit/test/generate-types.spec.ts index 7ac10ba8d1..b5bcc9a6bb 100644 --- a/packages/kit/test/generate-types.spec.ts +++ b/packages/kit/test/generate-types.spec.ts @@ -53,12 +53,12 @@ describe('tsConfig generation', () => { })) expect(tsConfig.exclude).toMatchInlineSnapshot(` [ + "../dist", "../modules/test/node_modules", "../modules/node_modules", "../node_modules/@some/module/node_modules", "../node_modules", "../../node_modules", - "../dist", ] `) }) diff --git a/packages/nuxt/package.json b/packages/nuxt/package.json index 6b788ebc0b..bc9c2b3c14 100644 --- a/packages/nuxt/package.json +++ b/packages/nuxt/package.json @@ -65,12 +65,12 @@ "@nuxt/schema": "workspace:*", "@nuxt/telemetry": "^2.5.4", "@nuxt/vite-builder": "workspace:*", - "@unhead/dom": "^1.9.12", - "@unhead/ssr": "^1.9.12", - "@unhead/vue": "^1.9.12", + "@unhead/dom": "^1.9.13", + "@unhead/ssr": "^1.9.13", + "@unhead/vue": "^1.9.13", "@vue/shared": "^3.4.27", "acorn": "8.11.3", - "c12": "^1.10.0", + "c12": "^1.11.1", "chokidar": "^3.6.0", "cookie-es": "^1.1.0", "defu": "^6.1.4", @@ -118,7 +118,7 @@ "vue-router": "^4.3.3" }, "devDependencies": { - "@nuxt/scripts": "0.4.7", + "@nuxt/scripts": "0.5.1", "@nuxt/ui-templates": "1.3.4", "@parcel/watcher": "2.4.1", "@types/estree": "1.0.5", @@ -126,7 +126,7 @@ "@vitejs/plugin-vue": "5.0.4", "@vue/compiler-sfc": "3.4.27", "unbuild": "latest", - "vite": "5.2.13", + "vite": "5.3.0", "vitest": "1.6.0" }, "peerDependencies": { diff --git a/packages/nuxt/src/app/components/nuxt-island.ts b/packages/nuxt/src/app/components/nuxt-island.ts index 784132a752..93832a1eaf 100644 --- a/packages/nuxt/src/app/components/nuxt-island.ts +++ b/packages/nuxt/src/app/components/nuxt-island.ts @@ -1,4 +1,4 @@ -import type { Component, PropType } from 'vue' +import type { Component, PropType, VNode } from 'vue' import { Fragment, Teleport, computed, createStaticVNode, createVNode, defineComponent, getCurrentInstance, h, nextTick, onMounted, ref, toRaw, watch, withMemo } from 'vue' import { debounce } from 'perfect-debounce' import { hash } from 'ohash' @@ -29,7 +29,7 @@ const getId = import.meta.client ? () => (id++).toString() : randomUUID const components = import.meta.client ? new Map() : undefined async function loadComponents (source = appBaseURL, paths: NuxtIslandResponse['components']) { - const promises = [] + const promises: Array> = [] for (const component in paths) { if (!(components!.has(component))) { @@ -259,7 +259,7 @@ export default defineComponent({ // should away be triggered ONE tick after re-rendering the static node withMemo([teleportKey.value], () => { - const teleports = [] + const teleports: Array = [] // this is used to force trigger Teleport when vue makes the diff between old and new node const isKeyOdd = teleportKey.value === 0 || !!(teleportKey.value && !(teleportKey.value % 2)) diff --git a/packages/nuxt/src/app/components/nuxt-link.ts b/packages/nuxt/src/app/components/nuxt-link.ts index 6a2c456883..c85c60ae17 100644 --- a/packages/nuxt/src/app/components/nuxt-link.ts +++ b/packages/nuxt/src/app/components/nuxt-link.ts @@ -8,13 +8,13 @@ import type { } from 'vue' import { computed, defineComponent, h, inject, onBeforeUnmount, onMounted, provide, ref, resolveComponent } from 'vue' import type { RouteLocation, RouteLocationRaw, Router, RouterLink, RouterLinkProps, useLink } from '#vue-router' -import { hasProtocol, joinURL, parseQuery, withTrailingSlash, withoutTrailingSlash } from 'ufo' +import { hasProtocol, joinURL, parseQuery, withQuery, withTrailingSlash, withoutTrailingSlash } from 'ufo' import { preloadRouteComponents } from '../composables/preload' import { onNuxtReady } from '../composables/ready' import { navigateTo, useRouter } from '../composables/router' import { useNuxtApp, useRuntimeConfig } from '../nuxt' import { cancelIdleCallback, requestIdleCallback } from '../compat/idle-callback' -import type { ObserveFn, CallbackFn } from '../utils' +import type { CallbackFn, ObserveFn } from '../utils' // @ts-expect-error virtual file import { nuxtLinkDefaults } from '#build/nuxt.config.mjs' @@ -71,8 +71,8 @@ export interface NuxtLinkProps extends Omit { * @see https://nuxt.com/docs/api/components/nuxt-link */ export interface NuxtLinkOptions extends - Pick, - Pick { + Partial>, + Partial> { /** * The name of the component. * @default "NuxtLink" @@ -125,34 +125,17 @@ export function defineNuxtLink (options: NuxtLinkOptions) { const router = useRouter() const config = useRuntimeConfig() - // Resolving `to` value from `to` and `href` props - const to: ComputedRef = computed(() => { - checkPropConflicts(props, 'to', 'href') - const path = props.to || props.href || '' // Defaults to empty string (won't render any `href` attribute) - return resolveTrailingSlashBehavior(path, router.resolve) - }) + const hasTarget = computed(() => !!props.target && props.target !== '_self') // Lazily check whether to.value has a protocol - const isAbsoluteUrl = computed(() => typeof to.value === 'string' && hasProtocol(to.value, { acceptRelative: true })) - - // Resolves `to` value if it's a route location object - const href = computed(() => (typeof to.value === 'object' - ? router.resolve(to.value)?.href ?? null - : (to.value && !props.external && !isAbsoluteUrl.value) - ? resolveTrailingSlashBehavior(joinURL(config.app.baseURL, to.value), router.resolve) as string - : to.value - )) + const isAbsoluteUrl = computed(() => { + const path = props.to || props.href || '' + return typeof path === 'string' && hasProtocol(path, { acceptRelative: true }) + }) const builtinRouterLink = resolveComponent('RouterLink') as string | typeof RouterLink const useBuiltinLink = builtinRouterLink && typeof builtinRouterLink !== 'string' ? builtinRouterLink.useLink : undefined - const link = useBuiltinLink?.({ - ...props, - to: to.value, - }) - - const hasTarget = computed(() => props.target && props.target !== '_self') - // Resolving link type const isExternal = computed(() => { // External prop is explicitly set @@ -160,17 +143,40 @@ export function defineNuxtLink (options: NuxtLinkOptions) { return true } - // When `target` prop is set, link is external - if (hasTarget.value) { - return true - } + const path = props.to || props.href || '' // When `to` is a route object then it's an internal link - if (typeof to.value === 'object') { + if (typeof path === 'object') { return false } - return to.value === '' || isAbsoluteUrl.value + return path === '' || isAbsoluteUrl.value + }) + + // Resolving `to` value from `to` and `href` props + const to: ComputedRef = computed(() => { + checkPropConflicts(props, 'to', 'href') + const path = props.to || props.href || '' // Defaults to empty string (won't render any `href` attribute) + if (isExternal.value) { return path } + return resolveTrailingSlashBehavior(path, router.resolve) + }) + + const link = isExternal.value ? undefined : useBuiltinLink?.({ ...props, to }) + + // Resolves `to` value if it's a route location object + const href = computed(() => { + if (!to.value || isAbsoluteUrl.value) { return to.value as string } + + if (isExternal.value) { + const path = typeof to.value === 'object' ? resolveRouteObject(to.value) : to.value + return resolveTrailingSlashBehavior(path, router.resolve /* will not be called */) as string + } + + if (typeof to.value === 'object') { + return router.resolve(to.value)?.href ?? null + } + + return resolveTrailingSlashBehavior(joinURL(config.app.baseURL, to.value), router.resolve /* will not be called */) }) return { @@ -184,10 +190,10 @@ export function defineNuxtLink (options: NuxtLinkOptions) { isExactActive: link?.isExactActive ?? computed(() => to.value === router.currentRoute.value.path), route: link?.route ?? computed(() => router.resolve(to.value)), async navigate () { - await navigateTo(href.value, { replace: props.replace, external: props.external }) + await navigateTo(href.value, { replace: props.replace, external: isExternal.value || hasTarget.value }) }, } satisfies ReturnType & { - to: ComputedRef + to: ComputedRef hasTarget: ComputedRef isAbsoluteUrl: ComputedRef isExternal: ComputedRef @@ -308,10 +314,12 @@ export function defineNuxtLink (options: NuxtLinkOptions) { unobserve?.() unobserve = null - const path = typeof to.value === 'string' ? to.value : router.resolve(to.value).fullPath + const path = typeof to.value === 'string' + ? to.value + : isExternal.value ? resolveRouteObject(to.value) : router.resolve(to.value).fullPath await Promise.all([ nuxtApp.hooks.callHook('link:prefetch', path).catch(() => {}), - !isExternal.value && preloadRouteComponents(to.value as string, router).catch(() => {}), + !isExternal.value && !hasTarget.value && preloadRouteComponents(to.value as string, router).catch(() => {}), ]) prefetched.value = true }) @@ -337,7 +345,7 @@ export function defineNuxtLink (options: NuxtLinkOptions) { } return () => { - if (!isExternal.value) { + if (!isExternal.value && !hasTarget.value) { const routerLinkProps: RouterLinkProps & VNodeProps & AllowedComponentProps & AnchorHTMLAttributes = { ref: elRef, to: to.value, @@ -409,7 +417,7 @@ export function defineNuxtLink (options: NuxtLinkOptions) { }, rel, target, - isExternal: isExternal.value, + isExternal: isExternal.value || hasTarget.value, isActive: false, isExactActive: false, }) @@ -472,7 +480,7 @@ function useObserver (): { observe: ObserveFn } | undefined { } const _observer = nuxtApp._observer = { - observe + observe, } return _observer @@ -486,3 +494,7 @@ function isSlowConnection () { if (cn && (cn.saveData || /2g/.test(cn.effectiveType))) { return true } return false } + +function resolveRouteObject (to: Exclude) { + return withQuery(to.path || '', to.query || {}) + (to.hash ? '#' + to.hash : '') +} diff --git a/packages/nuxt/src/app/components/utils.ts b/packages/nuxt/src/app/components/utils.ts index a5e918a89d..3de363755d 100644 --- a/packages/nuxt/src/app/components/utils.ts +++ b/packages/nuxt/src/app/components/utils.ts @@ -86,7 +86,7 @@ export function vforToArray (source: any): any[] { if (import.meta.dev && !Number.isInteger(source)) { console.warn(`The v-for range expect an integer value but got ${source}.`) } - const array = [] + const array: number[] = [] for (let i = 0; i < source; i++) { array[i] = i } diff --git a/packages/nuxt/src/app/composables/index.ts b/packages/nuxt/src/app/composables/index.ts index dbb5e96079..c0abdec2e4 100644 --- a/packages/nuxt/src/app/composables/index.ts +++ b/packages/nuxt/src/app/composables/index.ts @@ -37,3 +37,4 @@ export { reloadNuxtApp } from './chunk' export { useRequestURL } from './url' export { usePreviewMode } from './preview' export { useId } from './id' +export { useRouteAnnouncer } from './route-announcer' diff --git a/packages/nuxt/src/app/nuxt.ts b/packages/nuxt/src/app/nuxt.ts index 8839005f3b..75ce824a47 100644 --- a/packages/nuxt/src/app/nuxt.ts +++ b/packages/nuxt/src/app/nuxt.ts @@ -568,7 +568,7 @@ function wrappedConfig (runtimeConfig: Record) { if (typeof p === 'string' && p !== 'public' && !(p in target) && !p.startsWith('__v') /* vue check for reactivity, e.g. `__v_isRef` */) { if (!loggedKeys.has(p)) { loggedKeys.add(p) - console.warn(`[nuxt] Could not access \`${p}\`. The only available runtime config keys on the client side are ${keys.join(', ')} and ${lastKey}. See \`https://nuxt.com/docs/guide/going-further/runtime-config\` for more information.`) + console.warn(`[nuxt] Could not access \`${p}\`. The only available runtime config keys on the client side are ${keys.join(', ')} and ${lastKey}. See https://nuxt.com/docs/guide/going-further/runtime-config for more information.`) } } return Reflect.get(target, p, receiver) diff --git a/packages/nuxt/src/components/runtime/client-delayed-component.ts b/packages/nuxt/src/components/runtime/client-delayed-component.ts index c4dba7d4fa..20e71125e6 100644 --- a/packages/nuxt/src/components/runtime/client-delayed-component.ts +++ b/packages/nuxt/src/components/runtime/client-delayed-component.ts @@ -4,11 +4,11 @@ import type { Component, Ref } from 'vue' import type { ObserveFn } from '#app/utils' import { getFragmentHTML } from '#app/components/utils' import { useNuxtApp } from '#app/nuxt' -import { requestIdleCallback, cancelIdleCallback } from '#app/compat/idle-callback' +import { cancelIdleCallback, requestIdleCallback } from '#app/compat/idle-callback' import { onNuxtReady } from '#app' -function useIntersectionObserver(options: IntersectionObserverInit) : {observe: ObserveFn} { - if (import.meta.server) { return {observe: () => () => {}}} +function useIntersectionObserver (options: IntersectionObserverInit): { observe: ObserveFn } { + if (import.meta.server) { return { observe: () => () => {} } } let observer: IntersectionObserver | null = null @@ -30,7 +30,7 @@ function useIntersectionObserver(options: IntersectionObserverInit) : {observe: } const _observer = { - observe + observe, } return _observer @@ -100,12 +100,12 @@ export const createLazyNetworkClientPage = (componentLoader: Component) => { const isIdle = ref(false) let idleHandle: number | null = null onMounted(() => { - onNuxtReady(()=>{ + onNuxtReady(() => { idleHandle = requestIdleCallback(() => { isIdle.value = true cancelIdleCallback(idleHandle as unknown as number) idleHandle = null - }, attrs.loader ?? {timeout: 10000}) + }, attrs.loader ?? { timeout: 10000 }) }) }) onBeforeUnmount(() => { diff --git a/packages/nuxt/src/core/builder.ts b/packages/nuxt/src/core/builder.ts index c66e33c198..ca1b41dfd7 100644 --- a/packages/nuxt/src/core/builder.ts +++ b/packages/nuxt/src/core/builder.ts @@ -136,6 +136,7 @@ function createGranularWatcher () { console.timeEnd('[nuxt] builder:chokidar:watch') } }) + nuxt.hook('close', () => watcher?.close()) } } diff --git a/packages/nuxt/src/core/nitro.ts b/packages/nuxt/src/core/nitro.ts index 84d6aec7dd..4c96a48666 100644 --- a/packages/nuxt/src/core/nitro.ts +++ b/packages/nuxt/src/core/nitro.ts @@ -43,7 +43,7 @@ export async function initNitro (nuxt: Nuxt & { _nitro?: Nitro }) { const modules = await resolveNuxtModule(rootDirWithSlash, nuxt.options._installedModules .filter(m => m.entryPath) - .map(m => m.entryPath), + .map(m => m.entryPath!), ) const nitroConfig: NitroConfig = defu(nuxt.options.nitro, { diff --git a/packages/nuxt/src/core/nuxt.ts b/packages/nuxt/src/core/nuxt.ts index e319d53d7c..b054abb923 100644 --- a/packages/nuxt/src/core/nuxt.ts +++ b/packages/nuxt/src/core/nuxt.ts @@ -4,7 +4,7 @@ import ignore from 'ignore' import type { LoadNuxtOptions } from '@nuxt/kit' import { addBuildPlugin, addComponent, addPlugin, addRouteMiddleware, addServerPlugin, addVitePlugin, addWebpackPlugin, installModule, loadNuxtConfig, logger, nuxtCtx, resolveAlias, resolveFiles, resolveIgnorePatterns, resolvePath, tryResolveModule, useNitro } from '@nuxt/kit' import { resolvePath as _resolvePath } from 'mlly' -import type { Nuxt, NuxtHooks, NuxtModule, NuxtOptions, RuntimeConfig } from 'nuxt/schema' +import type { Nuxt, NuxtHooks, NuxtModule, NuxtOptions } from 'nuxt/schema' import type { PackageJson } from 'pkg-types' import { readPackageJSON, resolvePackageJSON } from 'pkg-types' import { hash } from 'ohash' @@ -49,7 +49,10 @@ export function createNuxt (options: NuxtOptions): Nuxt { addHooks: hooks.addHooks, hook: hooks.hook, ready: () => initNuxt(nuxt), - close: () => Promise.resolve(hooks.callHook('close', nuxt)), + close: async () => { + await hooks.callHook('close', nuxt) + hooks.removeAllHooks() + }, vfs: {}, apps: {}, } @@ -125,6 +128,7 @@ async function initNuxt (nuxt: Nuxt) { // Add nuxt types nuxt.hook('prepare:types', (opts) => { opts.references.push({ types: 'nuxt' }) + opts.references.push({ path: resolve(nuxt.options.buildDir, 'types/app-defaults.d.ts') }) opts.references.push({ path: resolve(nuxt.options.buildDir, 'types/plugins.d.ts') }) // Add vue shim if (nuxt.options.typescript.shim) { @@ -641,8 +645,22 @@ export async function loadNuxt (opts: LoadNuxtOptions): Promise { options._modules.push('@nuxt/telemetry') } - // Ensure we share runtime config between Nuxt and Nitro - options.runtimeConfig = options.nitro.runtimeConfig as RuntimeConfig + // Ensure we share key config between Nuxt and Nitro + createPortalProperties(options.nitro.runtimeConfig, options, ['nitro.runtimeConfig', 'runtimeConfig']) + createPortalProperties(options.nitro.routeRules, options, ['nitro.routeRules', 'routeRules']) + + // prevent replacement of options.nitro + const nitroOptions = options.nitro + Object.defineProperties(options, { + nitro: { + configurable: false, + enumerable: true, + get: () => nitroOptions, + set (value) { + Object.assign(nitroOptions, value) + }, + }, + }) const nuxt = createNuxt(options) @@ -680,7 +698,7 @@ const RESTART_RE = /^(?:app|error|app\.config)\.(?:js|ts|mjs|jsx|tsx|vue)$/i function deduplicateArray (maybeArray: T): T { if (!Array.isArray(maybeArray)) { return maybeArray } - const fresh = [] + const fresh: any[] = [] const hashes = new Set() for (const item of maybeArray) { const _hash = hash(item) @@ -691,3 +709,31 @@ function deduplicateArray (maybeArray: T): T { } return fresh as T } + +function createPortalProperties (sourceValue: any, options: NuxtOptions, paths: string[]) { + let sharedValue = sourceValue + + for (const path of paths) { + const segments = path.split('.') + const key = segments.pop()! + let parent: Record = options + + while (segments.length) { + const key = segments.shift()! + parent = parent[key] || (parent[key] = {}) + } + + delete parent[key] + + Object.defineProperties(parent, { + [key]: { + configurable: false, + enumerable: true, + get: () => sharedValue, + set (value) { + sharedValue = value + }, + }, + }) + } +} diff --git a/packages/nuxt/src/core/runtime/nitro/renderer.ts b/packages/nuxt/src/core/runtime/nitro/renderer.ts index f33a9774aa..4321a2387a 100644 --- a/packages/nuxt/src/core/runtime/nitro/renderer.ts +++ b/packages/nuxt/src/core/runtime/nitro/renderer.ts @@ -400,7 +400,7 @@ export default defineRenderHandler(async (event): Promise { + const isV4 = ctx.nuxt.options.future.compatibilityVersion === 4 + return ` +declare module '#app/defaults' { + type DefaultAsyncDataErrorValue = ${isV4 ? 'undefined' : 'null'} + type DefaultAsyncDataValue = ${isV4 ? 'undefined' : 'null'} + type DefaultErrorValue = ${isV4 ? 'undefined' : 'null'} + type DedupeOption = ${isV4 ? '\'cancel\' | \'defer\'' : 'boolean | \'cancel\' | \'defer\''} +}` + }, +} + export const pluginsDeclaration: NuxtTemplate = { filename: 'types/plugins.d.ts', getContents: async (ctx) => { @@ -112,8 +126,6 @@ export const pluginsDeclaration: NuxtTemplate = { const pluginsName = (await annotatePlugins(ctx.nuxt, ctx.app.plugins)).filter(p => p.name).map(p => `'${p.name}'`) - const isV4 = ctx.nuxt.options.future.compatibilityVersion === 4 - return `// Generated by Nuxt' import type { Plugin } from '#app' @@ -132,13 +144,6 @@ declare module '#app' { } } -declare module '#app/defaults' { - type DefaultAsyncDataErrorValue = ${isV4 ? 'undefined' : 'null'} - type DefaultAsyncDataValue = ${isV4 ? 'undefined' : 'null'} - type DefaultErrorValue = ${isV4 ? 'undefined' : 'null'} - type DedupeOption = ${isV4 ? '\'cancel\' | \'defer\'' : 'boolean | \'cancel\' | \'defer\''} -} - declare module 'vue' { interface ComponentCustomProperties extends NuxtAppInjections { } } diff --git a/packages/nuxt/src/imports/presets.ts b/packages/nuxt/src/imports/presets.ts index 3b2e85534c..068615cb91 100644 --- a/packages/nuxt/src/imports/presets.ts +++ b/packages/nuxt/src/imports/presets.ts @@ -109,6 +109,10 @@ const granularAppPresets: InlinePreset[] = [ imports: ['useId'], from: '#app/composables/id', }, + { + imports: ['useRouteAnnouncer'], + from: '#app/composables/route-announcer', + }, ] export const scriptsStubsPreset = { @@ -119,6 +123,7 @@ export const scriptsStubsPreset = { 'useScript', 'useScriptGoogleAnalytics', 'useScriptPlausibleAnalytics', + 'useScriptClarity', 'useScriptCloudflareWebAnalytics', 'useScriptFathomAnalytics', 'useScriptMatomoAnalytics', diff --git a/packages/nuxt/src/pages/module.ts b/packages/nuxt/src/pages/module.ts index 3e5982ea3b..4121e0dd84 100644 --- a/packages/nuxt/src/pages/module.ts +++ b/packages/nuxt/src/pages/module.ts @@ -275,6 +275,20 @@ export default defineNuxtModule({ } }) + // TODO: inject routes in `200.html` in next nitro upgrade (2.9.7+) via https://github.com/unjs/nitro/pull/2517 + if (!nuxt.options.dev && !nuxt.options._prepare) { + nuxt.hook('app:templatesGenerated', (app) => { + const nitro = useNitro() + if (nitro.options.prerender.crawlLinks) { + for (const page of app.pages!) { + if (page.path && !page.path.includes(':')) { + nitro.options.prerender.routes.push(page.path) + } + } + } + }) + } + nuxt.hook('imports:extend', (imports) => { imports.push( { name: 'definePageMeta', as: 'definePageMeta', from: resolve(runtimeDir, 'composables') }, diff --git a/packages/nuxt/src/pages/route-rules.ts b/packages/nuxt/src/pages/route-rules.ts index fef075e03e..24acf217b1 100644 --- a/packages/nuxt/src/pages/route-rules.ts +++ b/packages/nuxt/src/pages/route-rules.ts @@ -18,11 +18,12 @@ export async function extractRouteRules (code: string): Promise]*>([\s\S]*?)<\/script[^>]*>/i +const SFC_SCRIPT_RE = /[^>]*)>(?[\s\S]*?)<\/script[^>]*>/i export function extractScriptContent (html: string) { - const match = html.match(SFC_SCRIPT_RE) + const groups = html.match(SFC_SCRIPT_RE)?.groups || {} - if (match && match[1]) { - return match[1].trim() + if (groups.content) { + return { + loader: groups.attrs.includes('tsx') ? 'tsx' : 'ts', + code: groups.content.trim(), + } as const } return null @@ -170,7 +174,7 @@ const DYNAMIC_META_KEY = '__nuxt_dynamic_meta_key' as const const pageContentsCache: Record = {} const metaCache: Record>> = {} -async function getRouteMeta (contents: string, absolutePath: string): Promise>> { +export async function getRouteMeta (contents: string, absolutePath: string): Promise>> { // set/update pageContentsCache, invalidate metaCache on cache mismatch if (!(absolutePath in pageContentsCache) || pageContentsCache[absolutePath] !== contents) { pageContentsCache[absolutePath] = contents @@ -185,81 +189,88 @@ async function getRouteMeta (contents: string, absolutePath: string): Promise node.type === 'ExpressionStatement' && node.expression.type === 'CallExpression' && node.expression.callee.type === 'Identifier' && node.expression.callee.name === 'definePageMeta') - if (!pageMetaAST) { - metaCache[absolutePath] = {} - return {} - } - const pageMetaArgument = ((pageMetaAST as ExpressionStatement).expression as CallExpression).arguments[0] as ObjectExpression const extractedMeta = {} as Partial> const extractionKeys = ['name', 'path', 'alias', 'redirect'] as const const dynamicProperties = new Set() - for (const key of extractionKeys) { - const property = pageMetaArgument.properties.find(property => property.type === 'Property' && property.key.type === 'Identifier' && property.key.name === key) as Property - if (!property) { continue } + let foundMeta = false - if (property.value.type === 'ObjectExpression') { - const valueString = js.code.slice(property.value.range![0], property.value.range![1]) - try { - extractedMeta[key] = JSON.parse(runInNewContext(`JSON.stringify(${valueString})`, {})) - } catch { - console.debug(`[nuxt] Skipping extraction of \`${key}\` metadata as it is not JSON-serializable (reading \`${absolutePath}\`).`) - dynamicProperties.add(key) - continue - } - } + walk(ast, { + enter (node) { + if (foundMeta) { return } - if (property.value.type === 'ArrayExpression') { - const values = [] - for (const element of property.value.elements) { - if (!element) { + if (node.type !== 'ExpressionStatement' || node.expression.type !== 'CallExpression' || node.expression.callee.type !== 'Identifier' || node.expression.callee.name !== 'definePageMeta') { return } + + foundMeta = true + const pageMetaArgument = ((node as ExpressionStatement).expression as CallExpression).arguments[0] as ObjectExpression + + for (const key of extractionKeys) { + const property = pageMetaArgument.properties.find(property => property.type === 'Property' && property.key.type === 'Identifier' && property.key.name === key) as Property + if (!property) { continue } + + if (property.value.type === 'ObjectExpression') { + const valueString = js.code.slice(property.value.range![0], property.value.range![1]) + try { + extractedMeta[key] = JSON.parse(runInNewContext(`JSON.stringify(${valueString})`, {})) + } catch { + console.debug(`[nuxt] Skipping extraction of \`${key}\` metadata as it is not JSON-serializable (reading \`${absolutePath}\`).`) + dynamicProperties.add(key) + continue + } + } + + if (property.value.type === 'ArrayExpression') { + const values: string[] = [] + for (const element of property.value.elements) { + if (!element) { + continue + } + if (element.type !== 'Literal' || typeof element.value !== 'string') { + console.debug(`[nuxt] Skipping extraction of \`${key}\` metadata as it is not an array of string literals (reading \`${absolutePath}\`).`) + dynamicProperties.add(key) + continue + } + values.push(element.value) + } + extractedMeta[key] = values continue } - if (element.type !== 'Literal' || typeof element.value !== 'string') { - console.debug(`[nuxt] Skipping extraction of \`${key}\` metadata as it is not an array of string literals (reading \`${absolutePath}\`).`) + + if (property.value.type !== 'Literal' || typeof property.value.value !== 'string') { + console.debug(`[nuxt] Skipping extraction of \`${key}\` metadata as it is not a string literal or array of string literals (reading \`${absolutePath}\`).`) dynamicProperties.add(key) continue } - values.push(element.value) + extractedMeta[key] = property.value.value } - extractedMeta[key] = values - continue - } - if (property.value.type !== 'Literal' || typeof property.value.value !== 'string') { - console.debug(`[nuxt] Skipping extraction of \`${key}\` metadata as it is not a string literal or array of string literals (reading \`${absolutePath}\`).`) - dynamicProperties.add(key) - continue - } - extractedMeta[key] = property.value.value - } + const extraneousMetaKeys = pageMetaArgument.properties + .filter(property => property.type === 'Property' && property.key.type === 'Identifier' && !(extractionKeys as unknown as string[]).includes(property.key.name)) + // @ts-expect-error inferred types have been filtered out + .map(property => property.key.name) - const extraneousMetaKeys = pageMetaArgument.properties - .filter(property => property.type === 'Property' && property.key.type === 'Identifier' && !(extractionKeys as unknown as string[]).includes(property.key.name)) - // @ts-expect-error inferred types have been filtered out - .map(property => property.key.name) + if (extraneousMetaKeys.length) { + dynamicProperties.add('meta') + } - if (extraneousMetaKeys.length) { - dynamicProperties.add('meta') - } - - if (dynamicProperties.size) { - extractedMeta.meta ??= {} - extractedMeta.meta[DYNAMIC_META_KEY] = dynamicProperties - } + if (dynamicProperties.size) { + extractedMeta.meta ??= {} + extractedMeta.meta[DYNAMIC_META_KEY] = dynamicProperties + } + }, + }) metaCache[absolutePath] = extractedMeta return extractedMeta @@ -502,19 +513,20 @@ async function createClientPage(loader) { }`) } - if (route.children != null) { + if (route.children) { metaRoute.children = route.children } - if (overrideMeta) { - metaRoute.name = `${metaImportName}?.name` - metaRoute.path = `${metaImportName}?.path ?? ''` + if (route.meta) { + metaRoute.meta = `{ ...(${metaImportName} || {}), ...${route.meta} }` + } + if (overrideMeta) { // skip and retain fallback if marked dynamic // set to extracted value or fallback if none extracted for (const key of ['name', 'path'] satisfies NormalizedRouteKeys) { if (markedDynamic.has(key)) { continue } - metaRoute[key] = route[key] ?? metaRoute[key] + metaRoute[key] = route[key] ?? `${metaImportName}?.${key}` } // set to extracted value or delete if none extracted @@ -529,10 +541,6 @@ async function createClientPage(loader) { metaRoute[key] = route[key] } } else { - if (route.meta != null) { - metaRoute.meta = `{ ...(${metaImportName} || {}), ...${route.meta} }` - } - if (route.alias != null) { metaRoute.alias = `${route.alias}.concat(${metaImportName}?.alias || [])` } diff --git a/packages/nuxt/test/__snapshots__/pages-override-meta-enabled.test.ts.snap b/packages/nuxt/test/__snapshots__/pages-override-meta-enabled.test.ts.snap index 88989345d1..9fb308e7c1 100644 --- a/packages/nuxt/test/__snapshots__/pages-override-meta-enabled.test.ts.snap +++ b/packages/nuxt/test/__snapshots__/pages-override-meta-enabled.test.ts.snap @@ -303,7 +303,7 @@ "alias": "mockMeta?.alias || []", "component": "() => import("pages/index.vue").then(m => m.default || m)", "meta": "mockMeta || {}", - "name": "mockMeta?.name", + "name": "mockMeta?.name ?? "index"", "path": ""/"", "redirect": "mockMeta?.redirect", }, diff --git a/packages/nuxt/test/auto-imports.test.ts b/packages/nuxt/test/auto-imports.test.ts index f417369177..b25587f195 100644 --- a/packages/nuxt/test/auto-imports.test.ts +++ b/packages/nuxt/test/auto-imports.test.ts @@ -202,6 +202,9 @@ describe('imports:nuxt/scripts', () => { 'useAnalyticsPageEvent', 'useElementScriptTrigger', 'useConsentScriptTrigger', + // registered separately + 'useScriptGoogleTagManager', + 'useScriptGoogleAnalytics', ]) it.each(scriptsStubsPreset.imports)(`should register %s from @nuxt/scripts`, (name) => { if (globalScripts.has(name)) { return } diff --git a/packages/nuxt/test/nuxt-link.test.ts b/packages/nuxt/test/nuxt-link.test.ts index 1ee1490837..a712d0f267 100644 --- a/packages/nuxt/test/nuxt-link.test.ts +++ b/packages/nuxt/test/nuxt-link.test.ts @@ -1,5 +1,5 @@ import { describe, expect, it, vi } from 'vitest' -import type { RouteLocation, RouteLocationRaw } from 'vue-router' +import type { RouteLocation } from 'vue-router' import type { NuxtLinkOptions, NuxtLinkProps } from '../src/app/components/nuxt-link' import { defineNuxtLink } from '../src/app/components/nuxt-link' import { useRuntimeConfig } from '../src/app/nuxt' @@ -99,7 +99,11 @@ describe('nuxt-link:isExternal', () => { }) it('returns `false` when `to` is a route location object', () => { - expect(nuxtLink({ to: { to: '/to' } as RouteLocationRaw }).type).toBe(INTERNAL) + expect(nuxtLink({ to: { path: '/to' } }).type).toBe(INTERNAL) + }) + + it('returns `true` when `to` has a `target`', () => { + expect(nuxtLink({ to: { path: '/to' }, target: '_blank' }).type).toBe(EXTERNAL) }) it('honors `external` prop', () => { @@ -122,7 +126,12 @@ describe('nuxt-link:propsOrAttributes', () => { }) it('resolves route location object', () => { - expect(nuxtLink({ to: { to: '/to' } as RouteLocationRaw, external: true }).props.href).toBe('/to') + expect(nuxtLink({ to: { path: '/to' }, external: true }).props.href).toBe('/to') + }) + + it('applies trailing slash behaviour', () => { + expect(nuxtLink({ to: { path: '/to' }, external: true }, { trailingSlash: 'append' }).props.href).toBe('/to/') + expect(nuxtLink({ to: '/to', external: true }, { trailingSlash: 'append' }).props.href).toBe('/to/') }) }) @@ -167,6 +176,8 @@ describe('nuxt-link:propsOrAttributes', () => { }, () => { expect(nuxtLink({ to: 'http://nuxtjs.org/app/about', target: '_blank' }).props.href).toBe('http://nuxtjs.org/app/about') expect(nuxtLink({ to: '//nuxtjs.org/app/about', target: '_blank' }).props.href).toBe('//nuxtjs.org/app/about') + expect(nuxtLink({ to: { path: '/' }, external: true }).props.href).toBe('/') + expect(nuxtLink({ to: '/', external: true }).props.href).toBe('/') }) }) }) @@ -209,7 +220,7 @@ describe('nuxt-link:propsOrAttributes', () => { describe('to', () => { it('forwards `to` prop', () => { expect(nuxtLink({ to: '/to' }).props.to).toBe('/to') - expect(nuxtLink({ to: { to: '/to' } as RouteLocationRaw }).props.to).toEqual({ to: '/to' }) + expect(nuxtLink({ to: { path: '/to' } }).props.to).toEqual({ path: '/to' }) }) }) diff --git a/packages/nuxt/test/page-metadata.test.ts b/packages/nuxt/test/page-metadata.test.ts new file mode 100644 index 0000000000..4431b80f2f --- /dev/null +++ b/packages/nuxt/test/page-metadata.test.ts @@ -0,0 +1,148 @@ +import { describe, expect, it } from 'vitest' +import { getRouteMeta, normalizeRoutes } from '../src/pages/utils' +import type { NuxtPage } from '../schema' + +const filePath = '/app/pages/index.vue' + +describe('page metadata', () => { + it('should not extract metadata from empty files', async () => { + expect(await getRouteMeta('', filePath)).toEqual({}) + expect(await getRouteMeta('', filePath)).toEqual({}) + }) + + it('should use and invalidate cache', async () => { + const fileContents = `` + const meta = await getRouteMeta(fileContents, filePath) + expect(meta === await getRouteMeta(fileContents, filePath)).toBeTruthy() + expect(meta === await getRouteMeta(fileContents, '/app/pages/other.vue')).toBeFalsy() + expect(meta === await getRouteMeta('' + fileContents, filePath)).toBeFalsy() + }) + + it('should extract serialisable metadata', async () => { + const meta = await getRouteMeta(` + + `, filePath) + + expect(meta).toMatchInlineSnapshot(` + { + "meta": { + "__nuxt_dynamic_meta_key": Set { + "meta", + }, + }, + "name": "some-custom-name", + "path": "/some-custom-path", + } + `) + }) + + it('should extract serialisable metadata in options api', async () => { + const meta = await getRouteMeta(` + + `, filePath) + + expect(meta).toMatchInlineSnapshot(` + { + "meta": { + "__nuxt_dynamic_meta_key": Set { + "meta", + }, + }, + "name": "some-custom-name", + "path": "/some-custom-path", + } + `) + }) +}) + +describe('normalizeRoutes', () => { + it('should produce valid route objects when used with extracted meta', async () => { + const page: NuxtPage = { path: '/', file: filePath } + Object.assign(page, await getRouteMeta(` + + `, filePath)) + + page.meta ||= {} + page.meta.layout = 'test' + page.meta.foo = 'bar' + + const { routes, imports } = normalizeRoutes([page], new Set(), true) + expect({ routes, imports }).toMatchInlineSnapshot(` + { + "imports": Set { + "import { default as indexN6pT4Un8hYMeta } from "/app/pages/index.vue?macro=true";", + }, + "routes": "[ + { + name: "some-custom-name", + path: indexN6pT4Un8hYMeta?.path ?? "/", + meta: { ...(indexN6pT4Un8hYMeta || {}), ...{"layout":"test","foo":"bar"} }, + redirect: "/", + component: () => import("/app/pages/index.vue").then(m => m.default || m) + } + ]", + } + `) + }) + + it('should produce valid route objects when used without extracted meta', () => { + const page: NuxtPage = { path: '/', file: filePath } + page.meta ||= {} + page.meta.layout = 'test' + page.meta.foo = 'bar' + + const { routes, imports } = normalizeRoutes([page], new Set()) + expect({ routes, imports }).toMatchInlineSnapshot(` + { + "imports": Set { + "import { default as indexN6pT4Un8hYMeta } from "/app/pages/index.vue?macro=true";", + }, + "routes": "[ + { + name: indexN6pT4Un8hYMeta?.name ?? undefined, + path: indexN6pT4Un8hYMeta?.path ?? "/", + meta: { ...(indexN6pT4Un8hYMeta || {}), ...{"layout":"test","foo":"bar"} }, + alias: indexN6pT4Un8hYMeta?.alias || [], + redirect: indexN6pT4Un8hYMeta?.redirect, + component: () => import("/app/pages/index.vue").then(m => m.default || m) + } + ]", + } + `) + }) +}) diff --git a/packages/schema/package.json b/packages/schema/package.json index eb43f7fd84..d295d4e3df 100644 --- a/packages/schema/package.json +++ b/packages/schema/package.json @@ -39,13 +39,13 @@ "@types/file-loader": "5.0.4", "@types/pug": "2.0.10", "@types/sass-loader": "8.0.8", - "@unhead/schema": "1.9.12", + "@unhead/schema": "1.9.13", "@vitejs/plugin-vue": "5.0.4", "@vitejs/plugin-vue-jsx": "4.0.0", "@vue/compiler-core": "3.4.27", "@vue/compiler-sfc": "3.4.27", "@vue/language-core": "2.0.21", - "c12": "1.10.0", + "c12": "1.11.1", "esbuild-loader": "4.1.0", "h3": "1.11.1", "ignore": "5.3.1", @@ -54,7 +54,7 @@ "unbuild": "latest", "unctx": "2.3.1", "unenv": "1.9.0", - "vite": "5.2.13", + "vite": "5.3.0", "vue": "3.4.27", "vue-bundle-renderer": "2.1.0", "vue-loader": "17.4.2", @@ -63,7 +63,7 @@ "webpack-dev-middleware": "7.2.1" }, "dependencies": { - "compatx": "^0.1.3", + "compatx": "^0.1.8", "consola": "^3.2.3", "defu": "^6.1.4", "hookable": "^5.5.3", diff --git a/packages/schema/src/config/internal.ts b/packages/schema/src/config/internal.ts index 5f6545c469..346beff214 100644 --- a/packages/schema/src/config/internal.ts +++ b/packages/schema/src/config/internal.ts @@ -23,7 +23,10 @@ export default defineUntypedSchema({ _nuxtConfigFiles: [], /** @private */ appDir: '', - /** @private */ + /** + * @private + * @type {Array<{ meta: ModuleMeta; timings?: Record; entryPath?: string }>} + */ _installedModules: [], /** @private */ _modules: [], diff --git a/packages/ui-templates/package.json b/packages/ui-templates/package.json index 4232030b42..efa7de45e7 100644 --- a/packages/ui-templates/package.json +++ b/packages/ui-templates/package.json @@ -21,7 +21,7 @@ "devDependencies": { "@types/html-minifier": "4.0.5", "@types/lodash-es": "4.17.12", - "@unocss/reset": "0.60.4", + "@unocss/reset": "0.61.0", "critters": "0.0.22", "execa": "9.2.0", "globby": "14.0.1", @@ -32,7 +32,7 @@ "pathe": "1.1.2", "prettier": "3.3.2", "scule": "1.3.0", - "unocss": "0.60.4", - "vite": "5.2.13" + "unocss": "0.61.0", + "vite": "5.3.0" } } diff --git a/packages/vite/package.json b/packages/vite/package.json index 39dfbfe91f..0960b6bf51 100644 --- a/packages/vite/package.json +++ b/packages/vite/package.json @@ -28,6 +28,7 @@ "@types/clear": "0.1.4", "@types/estree": "1.0.5", "@types/fs-extra": "11.0.4", + "rollup": "4.18.0", "unbuild": "latest", "vue": "3.4.27" }, @@ -62,7 +63,7 @@ "ufo": "^1.5.3", "unenv": "^1.9.0", "unplugin": "^1.10.1", - "vite": "^5.2.13", + "vite": "^5.3.0", "vite-node": "^1.6.0", "vite-plugin-checker": "^0.6.4", "vue-bundle-renderer": "^2.1.0" diff --git a/packages/vite/src/client.ts b/packages/vite/src/client.ts index 12d746c021..607666f933 100644 --- a/packages/vite/src/client.ts +++ b/packages/vite/src/client.ts @@ -163,10 +163,11 @@ export async function buildClient (ctx: ViteBuildContext) { } // We want to respect users' own rollup output options + const fileNames = withoutLeadingSlash(join(ctx.nuxt.options.app.buildAssetsDir, '[hash].js')) clientConfig.build!.rollupOptions = defu(clientConfig.build!.rollupOptions!, { output: { - chunkFileNames: ctx.nuxt.options.dev ? undefined : withoutLeadingSlash(join(ctx.nuxt.options.app.buildAssetsDir, '[hash].js')), - entryFileNames: ctx.nuxt.options.dev ? 'entry.js' : withoutLeadingSlash(join(ctx.nuxt.options.app.buildAssetsDir, '[hash].js')), + chunkFileNames: ctx.nuxt.options.dev ? undefined : fileNames, + entryFileNames: ctx.nuxt.options.dev ? 'entry.js' : fileNames, } satisfies NonNullable['output'], }) as any @@ -228,7 +229,13 @@ export async function buildClient (ctx: ViteBuildContext) { }) const viteMiddleware = defineEventHandler(async (event) => { - const viteRoutes = viteServer.middlewares.stack.map(m => m.route).filter(r => r.length > 1) + const viteRoutes: string[] = [] + for (const viteRoute of viteServer.middlewares.stack) { + const m = viteRoute.route + if (m.length > 1) { + viteRoutes.push(m) + } + } if (!event.path.startsWith(clientConfig.base!) && !viteRoutes.some(route => event.path.startsWith(route))) { // @ts-expect-error _skip_transform is a private property event.node.req._skip_transform = true diff --git a/packages/vite/src/css.ts b/packages/vite/src/css.ts index 96413a3ce4..e99b323fa4 100644 --- a/packages/vite/src/css.ts +++ b/packages/vite/src/css.ts @@ -3,6 +3,8 @@ import type { Nuxt } from '@nuxt/schema' import type { InlineConfig as ViteConfig } from 'vite' import { distDir } from './dirs' +const lastPlugins = ['autoprefixer', 'cssnano'] + export function resolveCSSOptions (nuxt: Nuxt): ViteConfig['css'] { const css: ViteConfig['css'] & { postcss: NonNullable['postcss'], string>> } = { postcss: { @@ -10,19 +12,22 @@ export function resolveCSSOptions (nuxt: Nuxt): ViteConfig['css'] { }, } - const lastPlugins = ['autoprefixer', 'cssnano'] - css.postcss.plugins = Object.entries(nuxt.options.postcss.plugins) + css.postcss.plugins = [] + + const plugins = Object.entries(nuxt.options.postcss.plugins) .sort((a, b) => lastPlugins.indexOf(a[0]) - lastPlugins.indexOf(b[0])) - .filter(([, opts]) => opts) - .map(([name, opts]) => { + + for (const [name, opts] of plugins) { + if (opts) { const plugin = requireModule(name, { paths: [ ...nuxt.options.modulesDir, distDir, ], }) - return plugin(opts) - }) + css.postcss.plugins.push(plugin(opts)) + } + } return css } diff --git a/packages/vite/src/dev-bundler.ts b/packages/vite/src/dev-bundler.ts index cf774c241d..e2d970b524 100644 --- a/packages/vite/src/dev-bundler.ts +++ b/packages/vite/src/dev-bundler.ts @@ -238,7 +238,13 @@ export async function initViteDevBundler (ctx: ViteBuildContext, onBuild: () => const { code, ids } = await bundleRequest(options, ctx.entry) await fse.writeFile(resolve(ctx.nuxt.options.buildDir, 'dist/server/server.mjs'), code, 'utf-8') // Have CSS in the manifest to prevent FOUC on dev SSR - await writeManifest(ctx, ids.filter(isCSS).map(i => i.slice(1))) + const manifestIds: string[] = [] + for (const i of ids) { + if (isCSS(i)) { + manifestIds.push(i.slice(1)) + } + } + await writeManifest(ctx, manifestIds) const time = (Date.now() - start) logger.success(`Vite server built in ${time}ms`) await onBuild() diff --git a/packages/vite/src/manifest.ts b/packages/vite/src/manifest.ts index f5d3e7aa6a..54471633ec 100644 --- a/packages/vite/src/manifest.ts +++ b/packages/vite/src/manifest.ts @@ -50,11 +50,14 @@ export async function writeManifest (ctx: ViteBuildContext, css: string[] = []) await fse.mkdirp(serverDist) if (ctx.config.build?.cssCodeSplit === false) { - const entryCSS = Object.values(clientManifest as Record).find(val => (val).file?.endsWith('.css'))?.file - if (entryCSS) { - const key = relative(ctx.config.root!, ctx.entry) - clientManifest[key].css ||= [] - clientManifest[key].css!.push(entryCSS) + for (const key in clientManifest as Record) { + const val = clientManifest[key] + if (val.file?.endsWith('.css')) { + const key = relative(ctx.config.root!, ctx.entry) + clientManifest[key].css ||= [] + clientManifest[key].css!.push(val.file) + break + } } } diff --git a/packages/vite/src/plugins/analyze.ts b/packages/vite/src/plugins/analyze.ts index 3fa23b94b8..ddb923f244 100644 --- a/packages/vite/src/plugins/analyze.ts +++ b/packages/vite/src/plugins/analyze.ts @@ -3,6 +3,7 @@ import { transform } from 'esbuild' import { visualizer } from 'rollup-plugin-visualizer' import defu from 'defu' import type { NuxtOptions } from 'nuxt/schema' +import type { RenderedModule } from 'rollup' import type { ViteBuildContext } from '../vite' export function analyzePlugin (ctx: ViteBuildContext): Plugin[] { @@ -13,14 +14,18 @@ export function analyzePlugin (ctx: ViteBuildContext): Plugin[] { { name: 'nuxt:analyze-minify', async generateBundle (_opts, outputBundle) { - for (const [_bundleId, bundle] of Object.entries(outputBundle)) { + for (const _bundleId in outputBundle) { + const bundle = outputBundle[_bundleId] if (bundle.type !== 'chunk') { continue } - const originalEntries = Object.entries(bundle.modules) - const minifiedEntries = await Promise.all(originalEntries.map(async ([moduleId, module]) => { - const { code } = await transform(module.code || '', { minify: true }) - return [moduleId, { ...module, code }] - })) - bundle.modules = Object.fromEntries(minifiedEntries) + const minifiedModuleEntryPromises: Array> = [] + for (const moduleId in bundle.modules) { + const module = bundle.modules[moduleId] + minifiedModuleEntryPromises.push( + transform(module.code || '', { minify: true }) + .then(result => [moduleId, { ...module, code: result.code }]), + ) + } + bundle.modules = Object.fromEntries(await Promise.all(minifiedModuleEntryPromises)) } }, }, diff --git a/packages/vite/src/plugins/composable-keys.ts b/packages/vite/src/plugins/composable-keys.ts index 4832d60e61..af967c9eb7 100644 --- a/packages/vite/src/plugins/composable-keys.ts +++ b/packages/vite/src/plugins/composable-keys.ts @@ -23,12 +23,15 @@ const SUPPORTED_EXT_RE = /\.(?:m?[jt]sx?|vue)/ export const composableKeysPlugin = createUnplugin((options: ComposableKeysOptions) => { const composableMeta: Record = {} + const composableLengths = new Set() + const keyedFunctions = new Set() for (const { name, ...meta } of options.composables) { composableMeta[name] = meta + keyedFunctions.add(name) + composableLengths.add(meta.argumentLength) } - const maxLength = Math.max(...options.composables.map(({ argumentLength }) => argumentLength)) - const keyedFunctions = new Set(options.composables.map(({ name }) => name)) + const maxLength = Math.max(...composableLengths) const KEYED_FUNCTIONS_RE = new RegExp(`\\b(${[...keyedFunctions].map(f => escapeRE(f)).join('|')})\\b`) return { diff --git a/packages/vite/src/plugins/public-dirs.ts b/packages/vite/src/plugins/public-dirs.ts index 442b87e6e5..379d451819 100644 --- a/packages/vite/src/plugins/public-dirs.ts +++ b/packages/vite/src/plugins/public-dirs.ts @@ -25,7 +25,7 @@ export const VitePublicDirsPlugin = createUnplugin((options: { sourcemap?: boole resolveId: { enforce: 'post', handler (id) { - if (id === '/__skip_vite' || !id.startsWith('/') || id.startsWith('/@fs')) { return } + if (id === '/__skip_vite' || id[0] !== '/' || id.startsWith('/@fs')) { return } if (resolveFromPublicAssets(id)) { return PREFIX + encodeURIComponent(id) diff --git a/packages/vite/src/plugins/ssr-styles.ts b/packages/vite/src/plugins/ssr-styles.ts index 37fc7da1f7..b1e785c6e9 100644 --- a/packages/vite/src/plugins/ssr-styles.ts +++ b/packages/vite/src/plugins/ssr-styles.ts @@ -66,12 +66,12 @@ export function ssrStylesPlugin (options: SSRStylePluginOptions): Plugin { const { files, inBundle } = cssMap[file] // File has been tree-shaken out of build (or there are no styles to inline) if (!files.length || !inBundle) { continue } - + const fileName = filename(file) const base = typeof outputOptions.assetFileNames === 'string' ? outputOptions.assetFileNames : outputOptions.assetFileNames({ type: 'asset', - name: `${filename(file)}-styles.mjs`, + name: `${fileName}-styles.mjs`, source: '', }) @@ -79,7 +79,7 @@ export function ssrStylesPlugin (options: SSRStylePluginOptions): Plugin { emitted[file] = this.emitFile({ type: 'asset', - name: `${filename(file)}-styles.mjs`, + name: `${fileName}-styles.mjs`, source: [ ...files.map((css, i) => `import style_${i} from './${relative(baseDir, this.getFileName(css))}';`), `export default [${files.map((_, i) => `style_${i}`).join(', ')}]`, diff --git a/packages/vite/src/server.ts b/packages/vite/src/server.ts index 33965931a8..67919c8b2f 100644 --- a/packages/vite/src/server.ts +++ b/packages/vite/src/server.ts @@ -105,7 +105,7 @@ export async function buildServer (ctx: ViteBuildContext) { if (!ctx.nuxt.options.dev) { const nitroDependencies = await tryResolveModule('nitropack/package.json', ctx.nuxt.options.modulesDir) - .then(r => import(r!)).then(r => Object.keys(r.dependencies || {})).catch(() => []) + .then(r => import(r!)).then(r => r.dependencies ? Object.keys(r.dependencies) : []).catch(() => []) if (Array.isArray(serverConfig.ssr!.external)) { serverConfig.ssr!.external.push( // explicit dependencies we use in our ssr renderer - these can be inlined (if necessary) in the nitro build diff --git a/packages/vite/src/utils/transpile.ts b/packages/vite/src/utils/transpile.ts index 2484cc7034..8c60c1776a 100644 --- a/packages/vite/src/utils/transpile.ts +++ b/packages/vite/src/utils/transpile.ts @@ -10,7 +10,7 @@ interface Envs { export function transpile (envs: Envs): Array { const nuxt = useNuxt() - const transpile = [] + const transpile: Array = [] for (let pattern of nuxt.options.build.transpile) { if (typeof pattern === 'function') { diff --git a/packages/vite/src/vite.ts b/packages/vite/src/vite.ts index 1c6a9c82f4..b19b29ba0f 100644 --- a/packages/vite/src/vite.ts +++ b/packages/vite/src/vite.ts @@ -4,6 +4,7 @@ import { dirname, join, normalize, resolve } from 'pathe' import type { Nuxt, NuxtBuilder, ViteConfig } from '@nuxt/schema' import { addVitePlugin, isIgnored, logger, resolvePath } from '@nuxt/kit' import replace from '@rollup/plugin-replace' +import type { RollupReplaceOptions } from '@rollup/plugin-replace' import { sanitizeFilePath } from 'mlly' import { withoutLeadingSlash } from 'ufo' import { filename } from 'pathe/utils' @@ -102,10 +103,7 @@ export const bundle: NuxtBuilder['bundle'] = async (nuxt) => { rootDir: nuxt.options.rootDir, composables: nuxt.options.optimization.keyedComposables, }), - replace({ - ...Object.fromEntries([';', '(', '{', '}', ' ', '\t', '\n'].map(d => [`${d}global.`, `${d}globalThis.`])), - preventAssignment: true, - }), + replace({ preventAssignment: true, ...globalThisReplacements }), virtual(nuxt.vfs), ], server: { @@ -164,10 +162,16 @@ export const bundle: NuxtBuilder['bundle'] = async (nuxt) => { await nuxt.callHook('vite:extend', ctx) nuxt.hook('vite:extendConfig', (config) => { - config.plugins!.push(replace({ - preventAssignment: true, - ...Object.fromEntries(Object.entries(config.define!).filter(([key]) => key.startsWith('import.meta.'))), - })) + const replaceOptions: RollupReplaceOptions = Object.create(null) + replaceOptions.preventAssignment = true + + for (const key in config.define!) { + if (key.startsWith('import.meta.')) { + replaceOptions[key] = config.define![key] + } + } + + config.plugins!.push(replace(replaceOptions)) }) if (!ctx.nuxt.options.dev) { @@ -224,3 +228,5 @@ export const bundle: NuxtBuilder['bundle'] = async (nuxt) => { await buildClient(ctx) await buildServer(ctx) } + +const globalThisReplacements = Object.fromEntries([';', '(', '{', '}', ' ', '\t', '\n'].map(d => [`${d}global.`, `${d}globalThis.`])) diff --git a/packages/webpack/package.json b/packages/webpack/package.json index 3eb50c34e0..636293f8d1 100644 --- a/packages/webpack/package.json +++ b/packages/webpack/package.json @@ -77,7 +77,6 @@ "@types/pify": "5.0.4", "@types/webpack-bundle-analyzer": "4.7.0", "@types/webpack-hot-middleware": "2.25.9", - "@types/webpack-virtual-modules": "0.4.2", "unbuild": "latest", "vue": "3.4.27" }, diff --git a/packages/webpack/src/plugins/vue/client.ts b/packages/webpack/src/plugins/vue/client.ts index 14c0c184e3..10127fcace 100644 --- a/packages/webpack/src/plugins/vue/client.ts +++ b/packages/webpack/src/plugins/vue/client.ts @@ -43,24 +43,19 @@ export default class VueSSRClientPlugin { const allFiles = new Set() const asyncFiles = new Set() - - for (const asset of stats.assets!) { - const file = asset.name - if (!isHotUpdate(file)) { - allFiles.add(file) - if (initialFiles.has(file)) { continue } - if (isJS(file) || isCSS(file)) { - asyncFiles.add(file) - } - } - } - const assetsMapping: Record = {} - for (const { name, chunkNames = [] } of stats.assets!) { - if (isJS(name) && !isHotUpdate(name)) { + + for (const { name: file, chunkNames = [] } of stats.assets!) { + if (isHotUpdate(file)) { continue } + allFiles.add(file) + const isFileJS = isJS(file) + if (!initialFiles.has(file) && (isFileJS || isCSS(file))) { + asyncFiles.add(file) + } + if (isFileJS) { const componentHash = hash(chunkNames.join('|')) const map = assetsMapping[componentHash] ||= [] - map.push(name) + map.push(file) } } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 490d89d41c..f771943c8e 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -13,7 +13,7 @@ overrides: magic-string: ^0.30.10 nuxt: workspace:* rollup: ^4.18.0 - vite: 5.2.13 + vite: 5.3.0 vue: 3.4.27 importers: @@ -31,7 +31,7 @@ importers: version: link:packages/kit '@nuxt/test-utils': specifier: 3.13.1 - version: 3.13.1(@testing-library/vue@8.1.0(@vue/compiler-sfc@3.4.27)(vue@3.4.27(typescript@5.4.5)))(@vue/test-utils@2.4.6)(h3@1.11.1)(happy-dom@14.12.0)(nitropack@2.9.6(encoding@0.1.13))(playwright-core@1.44.1)(vite@5.2.13(@types/node@20.14.2)(sass@1.69.4)(terser@5.27.0))(vitest@1.6.0(@types/node@20.14.2)(happy-dom@14.12.0)(sass@1.69.4)(terser@5.27.0))(vue-router@4.3.3(vue@3.4.27(typescript@5.4.5)))(vue@3.4.27(typescript@5.4.5)) + version: 3.13.1(@testing-library/vue@8.1.0(@vue/compiler-sfc@3.4.27)(vue@3.4.27(typescript@5.4.5)))(@vue/test-utils@2.4.6)(h3@1.11.1)(happy-dom@14.12.0)(magicast@0.3.4)(nitropack@2.9.6(encoding@0.1.13)(magicast@0.3.4))(playwright-core@1.44.1)(vite@5.3.0(@types/node@20.14.2)(sass@1.69.4)(terser@5.27.0))(vitest@1.6.0(@types/node@20.14.2)(happy-dom@14.12.0)(sass@1.69.4)(terser@5.27.0))(vue-router@4.3.3(vue@3.4.27(typescript@5.4.5)))(vue@3.4.27(typescript@5.4.5)) '@nuxt/webpack-builder': specifier: workspace:* version: link:packages/webpack @@ -51,11 +51,11 @@ importers: specifier: 7.5.8 version: 7.5.8 '@unhead/schema': - specifier: 1.9.12 - version: 1.9.12 + specifier: 1.9.13 + version: 1.9.13 '@vitejs/plugin-vue': specifier: 5.0.4 - version: 5.0.4(vite@5.2.13(@types/node@20.14.2)(sass@1.69.4)(terser@5.27.0))(vue@3.4.27(typescript@5.4.5)) + version: 5.0.4(vite@5.3.0(@types/node@20.14.2)(sass@1.69.4)(terser@5.27.0))(vue@3.4.27(typescript@5.4.5)) '@vitest/coverage-v8': specifier: 1.6.0 version: 1.6.0(vitest@1.6.0(@types/node@20.14.2)(happy-dom@14.12.0)(sass@1.69.4)(terser@5.27.0)) @@ -67,7 +67,7 @@ importers: version: 0.6.1 changelogen: specifier: 0.5.5 - version: 0.5.5 + version: 0.5.5(magicast@0.3.4) consola: specifier: 3.2.3 version: 3.2.3 @@ -81,8 +81,8 @@ importers: specifier: 3.1.0 version: 3.1.0 eslint-plugin-perfectionist: - specifier: 2.10.0 - version: 2.10.0(eslint@9.4.0)(typescript@5.4.5)(vue-eslint-parser@9.4.2(eslint@9.4.0)) + specifier: 2.11.0 + version: 2.11.0(eslint@9.4.0)(typescript@5.4.5)(vue-eslint-parser@9.4.2(eslint@9.4.0)) eslint-typegen: specifier: 0.2.4 version: 0.2.4(eslint@9.4.0) @@ -109,7 +109,7 @@ importers: version: 0.41.0 nitropack: specifier: 2.9.6 - version: 2.9.6(encoding@0.1.13) + version: 2.9.6(encoding@0.1.13)(magicast@0.3.4) nuxi: specifier: 3.12.0 version: 3.12.0 @@ -148,7 +148,7 @@ importers: version: 1.6.0(@types/node@20.14.2)(happy-dom@14.12.0)(sass@1.69.4)(terser@5.27.0) vitest-environment-nuxt: specifier: 1.0.0 - version: 1.0.0(@testing-library/vue@8.1.0(@vue/compiler-sfc@3.4.27)(vue@3.4.27(typescript@5.4.5)))(@vue/test-utils@2.4.6)(h3@1.11.1)(happy-dom@14.12.0)(nitropack@2.9.6(encoding@0.1.13))(playwright-core@1.44.1)(vite@5.2.13(@types/node@20.14.2)(sass@1.69.4)(terser@5.27.0))(vitest@1.6.0(@types/node@20.14.2)(happy-dom@14.12.0)(sass@1.69.4)(terser@5.27.0))(vue-router@4.3.3(vue@3.4.27(typescript@5.4.5)))(vue@3.4.27(typescript@5.4.5)) + version: 1.0.0(@testing-library/vue@8.1.0(@vue/compiler-sfc@3.4.27)(vue@3.4.27(typescript@5.4.5)))(@vue/test-utils@2.4.6)(h3@1.11.1)(happy-dom@14.12.0)(magicast@0.3.4)(nitropack@2.9.6(encoding@0.1.13)(magicast@0.3.4))(playwright-core@1.44.1)(vite@5.3.0(@types/node@20.14.2)(sass@1.69.4)(terser@5.27.0))(vitest@1.6.0(@types/node@20.14.2)(happy-dom@14.12.0)(sass@1.69.4)(terser@5.27.0))(vue-router@4.3.3(vue@3.4.27(typescript@5.4.5)))(vue@3.4.27(typescript@5.4.5)) vue: specifier: 3.4.27 version: 3.4.27(typescript@5.4.5) @@ -165,8 +165,8 @@ importers: specifier: workspace:* version: link:../schema c12: - specifier: ^1.10.0 - version: 1.10.0 + specifier: ^1.11.1 + version: 1.11.1(magicast@0.3.4) consola: specifier: ^3.2.3 version: 3.2.3 @@ -236,13 +236,13 @@ importers: version: 4.17.21 nitropack: specifier: 2.9.6 - version: 2.9.6(encoding@0.1.13) + version: 2.9.6(encoding@0.1.13)(magicast@0.3.4) unbuild: specifier: latest version: 2.0.0(sass@1.69.4)(typescript@5.4.5) vite: - specifier: 5.2.13 - version: 5.2.13(@types/node@20.14.2)(sass@1.69.4)(terser@5.27.0) + specifier: 5.3.0 + version: 5.3.0(@types/node@20.14.2)(sass@1.69.4)(terser@5.27.0) vitest: specifier: 1.6.0 version: 1.6.0(@types/node@20.14.2)(happy-dom@14.12.0)(sass@1.69.4)(terser@5.27.0) @@ -257,7 +257,7 @@ importers: version: 2.0.2 '@nuxt/devtools': specifier: ^1.3.3 - version: 1.3.3(@unocss/reset@0.60.4)(floating-vue@5.2.2(@nuxt/kit@packages+kit)(vue@3.4.27(typescript@5.4.5)))(nuxt@packages+nuxt)(rollup@4.18.0)(unocss@0.60.4(@unocss/webpack@0.60.4(rollup@4.18.0)(webpack@5.92.0(esbuild@0.21.5)))(postcss@8.4.38)(rollup@4.18.0)(vite@5.2.13(@types/node@20.14.2)(sass@1.69.4)(terser@5.27.0)))(vite@5.2.13(@types/node@20.14.2)(sass@1.69.4)(terser@5.27.0))(vue@3.4.27(typescript@5.4.5)) + version: 1.3.3(@unocss/reset@0.61.0)(floating-vue@5.2.2(@nuxt/kit@packages+kit)(vue@3.4.27(typescript@5.4.5)))(nuxt@packages+nuxt)(rollup@4.18.0)(unocss@0.61.0(@unocss/webpack@0.60.4(rollup@4.18.0)(webpack@5.92.0(esbuild@0.21.5)))(postcss@8.4.38)(rollup@4.18.0)(vite@5.3.0(@types/node@20.14.2)(sass@1.69.4)(terser@5.27.0)))(vite@5.3.0(@types/node@20.14.2)(sass@1.69.4)(terser@5.27.0))(vue@3.4.27(typescript@5.4.5)) '@nuxt/kit': specifier: workspace:* version: link:../kit @@ -274,14 +274,14 @@ importers: specifier: ^14.18.0 || >=16.10.0 version: 20.14.2 '@unhead/dom': - specifier: ^1.9.12 - version: 1.9.12 + specifier: ^1.9.13 + version: 1.9.13 '@unhead/ssr': - specifier: ^1.9.12 - version: 1.9.12 + specifier: ^1.9.13 + version: 1.9.13 '@unhead/vue': - specifier: ^1.9.12 - version: 1.9.12(vue@3.4.27(typescript@5.4.5)) + specifier: ^1.9.13 + version: 1.9.13(vue@3.4.27(typescript@5.4.5)) '@vue/shared': specifier: ^3.4.27 version: 3.4.27 @@ -289,8 +289,8 @@ importers: specifier: 8.11.3 version: 8.11.3 c12: - specifier: ^1.10.0 - version: 1.10.0 + specifier: ^1.11.1 + version: 1.11.1(magicast@0.3.4) chokidar: specifier: ^3.6.0 version: 3.6.0 @@ -347,7 +347,7 @@ importers: version: 1.7.1 nitropack: specifier: ^2.9.6 - version: 2.9.6(encoding@0.1.13) + version: 2.9.6(encoding@0.1.13)(magicast@0.3.4) nuxi: specifier: ^3.12.0 version: 3.12.0 @@ -428,8 +428,8 @@ importers: version: 4.3.3(vue@3.4.27(typescript@5.4.5)) devDependencies: '@nuxt/scripts': - specifier: 0.4.7 - version: 0.4.7(@nuxt/devtools@1.3.3(@unocss/reset@0.60.4)(floating-vue@5.2.2(@nuxt/kit@packages+kit)(vue@3.4.27(typescript@5.4.5)))(nuxt@packages+nuxt)(rollup@4.18.0)(unocss@0.60.4(@unocss/webpack@0.60.4(rollup@4.18.0)(webpack@5.92.0(esbuild@0.21.5)))(postcss@8.4.38)(rollup@4.18.0)(vite@5.2.13(@types/node@20.14.2)(sass@1.69.4)(terser@5.27.0)))(vite@5.2.13(@types/node@20.14.2)(sass@1.69.4)(terser@5.27.0))(vue@3.4.27(typescript@5.4.5)))(@unocss/webpack@0.60.4(rollup@4.18.0)(webpack@5.92.0(esbuild@0.21.5)))(@vue/compiler-core@3.4.27)(ioredis@5.3.2)(nuxt@packages+nuxt)(postcss@8.4.38)(rollup@4.18.0)(vite@5.2.13(@types/node@20.14.2)(sass@1.69.4)(terser@5.27.0))(vue@3.4.27(typescript@5.4.5))(webpack@5.92.0(esbuild@0.21.5)) + specifier: 0.5.1 + version: 0.5.1(@nuxt/devtools@1.3.3(@unocss/reset@0.61.0)(floating-vue@5.2.2(@nuxt/kit@packages+kit)(vue@3.4.27(typescript@5.4.5)))(nuxt@packages+nuxt)(rollup@4.18.0)(unocss@0.61.0(@unocss/webpack@0.60.4(rollup@4.18.0)(webpack@5.92.0(esbuild@0.21.5)))(postcss@8.4.38)(rollup@4.18.0)(vite@5.3.0(@types/node@20.14.2)(sass@1.69.4)(terser@5.27.0)))(vite@5.3.0(@types/node@20.14.2)(sass@1.69.4)(terser@5.27.0))(vue@3.4.27(typescript@5.4.5)))(@unocss/webpack@0.60.4(rollup@4.18.0)(webpack@5.92.0(esbuild@0.21.5)))(@vue/compiler-core@3.4.27)(ioredis@5.3.2)(nuxt@packages+nuxt)(postcss@8.4.38)(rollup@4.18.0)(vite@5.3.0(@types/node@20.14.2)(sass@1.69.4)(terser@5.27.0))(vue@3.4.27(typescript@5.4.5))(webpack@5.92.0(esbuild@0.21.5)) '@nuxt/ui-templates': specifier: workspace:* version: link:../ui-templates @@ -444,7 +444,7 @@ importers: version: 11.0.4 '@vitejs/plugin-vue': specifier: 5.0.4 - version: 5.0.4(vite@5.2.13(@types/node@20.14.2)(sass@1.69.4)(terser@5.27.0))(vue@3.4.27(typescript@5.4.5)) + version: 5.0.4(vite@5.3.0(@types/node@20.14.2)(sass@1.69.4)(terser@5.27.0))(vue@3.4.27(typescript@5.4.5)) '@vue/compiler-sfc': specifier: 3.4.27 version: 3.4.27 @@ -452,8 +452,8 @@ importers: specifier: latest version: 2.0.0(sass@1.69.4)(typescript@5.4.5) vite: - specifier: 5.2.13 - version: 5.2.13(@types/node@20.14.2)(sass@1.69.4)(terser@5.27.0) + specifier: 5.3.0 + version: 5.3.0(@types/node@20.14.2)(sass@1.69.4)(terser@5.27.0) vitest: specifier: 1.6.0 version: 1.6.0(@types/node@20.14.2)(happy-dom@14.12.0)(sass@1.69.4)(terser@5.27.0) @@ -461,8 +461,8 @@ importers: packages/schema: dependencies: compatx: - specifier: ^0.1.3 - version: 0.1.3 + specifier: ^0.1.8 + version: 0.1.8 consola: specifier: ^3.2.3 version: 3.2.3 @@ -513,14 +513,14 @@ importers: specifier: 8.0.8 version: 8.0.8 '@unhead/schema': - specifier: 1.9.12 - version: 1.9.12 + specifier: 1.9.13 + version: 1.9.13 '@vitejs/plugin-vue': specifier: 5.0.4 - version: 5.0.4(vite@5.2.13(@types/node@20.14.2)(sass@1.69.4)(terser@5.27.0))(vue@3.4.27(typescript@5.4.5)) + version: 5.0.4(vite@5.3.0(@types/node@20.14.2)(sass@1.69.4)(terser@5.27.0))(vue@3.4.27(typescript@5.4.5)) '@vitejs/plugin-vue-jsx': specifier: 4.0.0 - version: 4.0.0(vite@5.2.13(@types/node@20.14.2)(sass@1.69.4)(terser@5.27.0))(vue@3.4.27(typescript@5.4.5)) + version: 4.0.0(vite@5.3.0(@types/node@20.14.2)(sass@1.69.4)(terser@5.27.0))(vue@3.4.27(typescript@5.4.5)) '@vue/compiler-core': specifier: 3.4.27 version: 3.4.27 @@ -531,8 +531,8 @@ importers: specifier: 2.0.21 version: 2.0.21(typescript@5.4.5) c12: - specifier: 1.10.0 - version: 1.10.0 + specifier: 1.11.1 + version: 1.11.1(magicast@0.3.4) esbuild-loader: specifier: 4.1.0 version: 4.1.0(webpack@5.92.0) @@ -544,7 +544,7 @@ importers: version: 5.3.1 nitropack: specifier: 2.9.6 - version: 2.9.6(encoding@0.1.13) + version: 2.9.6(encoding@0.1.13)(magicast@0.3.4) ofetch: specifier: 1.3.4 version: 1.3.4 @@ -558,8 +558,8 @@ importers: specifier: 1.9.0 version: 1.9.0 vite: - specifier: 5.2.13 - version: 5.2.13(@types/node@20.14.2)(sass@1.69.4)(terser@5.27.0) + specifier: 5.3.0 + version: 5.3.0(@types/node@20.14.2)(sass@1.69.4)(terser@5.27.0) vue: specifier: 3.4.27 version: 3.4.27(typescript@5.4.5) @@ -588,8 +588,8 @@ importers: specifier: 4.17.12 version: 4.17.12 '@unocss/reset': - specifier: 0.60.4 - version: 0.60.4 + specifier: 0.61.0 + version: 0.61.0 critters: specifier: 0.0.22 version: 0.0.22 @@ -621,11 +621,11 @@ importers: specifier: 1.3.0 version: 1.3.0 unocss: - specifier: 0.60.4 - version: 0.60.4(@unocss/webpack@0.60.4(rollup@4.18.0))(postcss@8.4.38)(rollup@4.18.0)(vite@5.2.13(@types/node@20.14.2)(sass@1.69.4)(terser@5.27.0)) + specifier: 0.61.0 + version: 0.61.0(@unocss/webpack@0.60.4(rollup@4.18.0)(webpack@5.92.0(esbuild@0.21.5)))(postcss@8.4.38)(rollup@4.18.0)(vite@5.3.0(@types/node@20.14.2)(sass@1.69.4)(terser@5.27.0)) vite: - specifier: 5.2.13 - version: 5.2.13(@types/node@20.14.2)(sass@1.69.4)(terser@5.27.0) + specifier: 5.3.0 + version: 5.3.0(@types/node@20.14.2)(sass@1.69.4)(terser@5.27.0) packages/vite: dependencies: @@ -637,10 +637,10 @@ importers: version: 5.0.7(rollup@4.18.0) '@vitejs/plugin-vue': specifier: ^5.0.4 - version: 5.0.4(vite@5.2.13(@types/node@20.14.2)(sass@1.69.4)(terser@5.27.0))(vue@3.4.27(typescript@5.4.5)) + version: 5.0.4(vite@5.3.0(@types/node@20.14.2)(sass@1.69.4)(terser@5.27.0))(vue@3.4.27(typescript@5.4.5)) '@vitejs/plugin-vue-jsx': specifier: ^4.0.0 - version: 4.0.0(vite@5.2.13(@types/node@20.14.2)(sass@1.69.4)(terser@5.27.0))(vue@3.4.27(typescript@5.4.5)) + version: 4.0.0(vite@5.3.0(@types/node@20.14.2)(sass@1.69.4)(terser@5.27.0))(vue@3.4.27(typescript@5.4.5)) autoprefixer: specifier: ^10.4.19 version: 10.4.19(postcss@8.4.38) @@ -720,14 +720,14 @@ importers: specifier: ^1.10.1 version: 1.10.1 vite: - specifier: 5.2.13 - version: 5.2.13(@types/node@20.14.2)(sass@1.69.4)(terser@5.27.0) + specifier: 5.3.0 + version: 5.3.0(@types/node@20.14.2)(sass@1.69.4)(terser@5.27.0) vite-node: specifier: ^1.6.0 version: 1.6.0(@types/node@20.14.2)(sass@1.69.4)(terser@5.27.0) vite-plugin-checker: specifier: ^0.6.4 - version: 0.6.4(eslint@9.4.0)(optionator@0.9.3)(typescript@5.4.5)(vite@5.2.13(@types/node@20.14.2)(sass@1.69.4)(terser@5.27.0))(vue-tsc@2.0.21(typescript@5.4.5)) + version: 0.6.4(eslint@9.4.0)(optionator@0.9.3)(typescript@5.4.5)(vite@5.3.0(@types/node@20.14.2)(sass@1.69.4)(terser@5.27.0))(vue-tsc@2.0.21(typescript@5.4.5)) vue-bundle-renderer: specifier: ^2.1.0 version: 2.1.0 @@ -744,6 +744,9 @@ importers: '@types/fs-extra': specifier: 11.0.4 version: 11.0.4 + rollup: + specifier: ^4.18.0 + version: 4.18.0 unbuild: specifier: latest version: 2.0.0(sass@1.69.4)(typescript@5.4.5) @@ -904,9 +907,6 @@ importers: '@types/webpack-hot-middleware': specifier: 2.25.9 version: 2.25.9 - '@types/webpack-virtual-modules': - specifier: 0.4.2 - version: 0.4.2 unbuild: specifier: latest version: 2.0.0(sass@1.69.4)(typescript@5.4.5) @@ -918,7 +918,7 @@ importers: dependencies: '@unhead/shared': specifier: latest - version: 1.9.12 + version: 1.9.13 '@vue/devtools-api': specifier: latest version: 6.6.3 @@ -930,7 +930,7 @@ importers: version: link:../packages/nuxt unhead: specifier: latest - version: 1.9.12 + version: 1.9.13 vue: specifier: 3.4.27 version: 3.4.27(typescript@5.4.5) @@ -946,10 +946,10 @@ importers: devDependencies: '@unhead/dom': specifier: latest - version: 1.9.12 + version: 1.9.13 '@unhead/shared': specifier: latest - version: 1.9.12 + version: 1.9.13 '@vue/devtools-api': specifier: latest version: 6.6.3 @@ -964,7 +964,7 @@ importers: version: 1.5.3 unhead: specifier: latest - version: 1.9.12 + version: 1.9.13 unplugin: specifier: latest version: 1.10.1 @@ -1020,7 +1020,7 @@ importers: devDependencies: '@unhead/shared': specifier: latest - version: 1.9.12 + version: 1.9.13 '@vue/devtools-api': specifier: latest version: 6.6.3 @@ -1029,7 +1029,7 @@ importers: version: 3.4.27 unhead: specifier: latest - version: 1.9.12 + version: 1.9.13 test/fixtures/suspense: dependencies: @@ -1042,7 +1042,7 @@ importers: devDependencies: '@unhead/shared': specifier: latest - version: 1.9.12 + version: 1.9.13 '@vue/devtools-api': specifier: latest version: 6.6.3 @@ -1054,7 +1054,7 @@ importers: version: 5.4.5 unhead: specifier: latest - version: 1.9.12 + version: 1.9.13 packages: @@ -2111,7 +2111,7 @@ packages: resolution: {integrity: sha512-YkcuSirzVVi36gWjIl9sJ4lsuiuQiIStY3upLy829zMTIXXeF8yUEBexKL6zHD3UPqCigoF7IuovnfLw78BQ9g==} peerDependencies: nuxt: workspace:* - vite: 5.2.13 + vite: 5.3.0 '@nuxt/devtools-ui-kit@1.3.3': resolution: {integrity: sha512-vM9dcb/CLXf1big6SmhVL0mh/JzNtZaJwHMYDd3vqv7jAedGuNfURDSGGVYQRFlSFisA3Cn0TnjDDs+dPrGuAA==} @@ -2127,7 +2127,7 @@ packages: hasBin: true peerDependencies: nuxt: workspace:* - vite: 5.2.13 + vite: 5.3.0 '@nuxt/eslint-config@0.3.13': resolution: {integrity: sha512-xnMkcrz9vFjtIuKsfOPhNOKFVD51JZClj/16raciHVOK9eiqZuQjbxaf60b7ffk7cmD1EDhlQhbSxaLAJm/QYg==} @@ -2145,8 +2145,8 @@ packages: peerDependencies: webpack: ^2.0.0 || ^3.0.0 || ^4.0.0 || ^5.0.0 - '@nuxt/scripts@0.4.7': - resolution: {integrity: sha512-zVP7tF3rmO2ZqQW5Hmmy0NQ4WYH+8ye1QBseSJZ0Ab1pDQEpWX+CI7tVak7Fw7IWVnrAcjIMh6TJFt0zQ/ARjg==} + '@nuxt/scripts@0.5.1': + resolution: {integrity: sha512-K3v/+Kej9F6Ul2ReTb4cNxB76JNeogDuNft76/4N/n3WUAPuhOqn2rFPTbvjidERsHxqmiLGxCPl7fKrhE0ZZg==} '@nuxt/telemetry@2.5.4': resolution: {integrity: sha512-KH6wxzsNys69daSO0xUv0LEBAfhwwjK1M+0Cdi1/vxmifCslMIY7lN11B4eywSfscbyVPAYJvANyc7XiVPImBQ==} @@ -2167,7 +2167,7 @@ packages: jsdom: ^22.0.0 || ^23.0.0 || ^24.0.0 nitropack: '*' playwright-core: ^1.43.1 - vite: 5.2.13 + vite: 5.3.0 vitest: ^0.34.6 || ^1.0.0 vue: 3.4.27 vue-router: ^4.0.0 @@ -2471,8 +2471,8 @@ packages: '@shikijs/core@1.3.0': resolution: {integrity: sha512-7fedsBfuILDTBmrYZNFI8B6ATTxhQAasUHllHmjvSZPnoq4bULWoTpHwmuQvZ8Aq03/tAa2IGo6RXqWtHdWaCA==} - '@shikijs/core@1.6.3': - resolution: {integrity: sha512-QnJKHFUW95GnlJLJGP6QLx4M69HM0KlXk+R2Y8lr/x4nAx1Yb/lsuxq4XwybuUjTxbJk+BT0g/kvn0bcsjGGHg==} + '@shikijs/core@1.6.4': + resolution: {integrity: sha512-WTU9rzZae1p2v6LOxMf6LhtmZOkIHYYW160IuahUyJy7YXPPjyWZLR1ag+SgD22ZMxZtz1gfU6Tccc8t0Il/XA==} '@shikijs/transformers@1.1.2': resolution: {integrity: sha512-tldkUMW7RBkU2F6eXbiRMw3ja+hQer1EjwhD2NGOv6K0pgZdVp3JKjU8uisRtg65tyBqrVHq7zlLHVk7EKmUZA==} @@ -2715,10 +2715,6 @@ packages: '@types/webpack-sources@3.2.1': resolution: {integrity: sha512-iLC3Fsx62ejm3ST3PQ8vBMC54Rb3EoCprZjeJGI5q+9QjfDLGt9jeg/k245qz1G9AQnORGk0vqPicJFPT1QODQ==} - '@types/webpack-virtual-modules@0.4.2': - resolution: {integrity: sha512-0ff/n3TXx1FysQV/kSpF8bxnCXUf7cw3Mp6WbXq0IfrgFK/MBIZqAQFN7VUkGwRzHZb+9DfLPZ3dOI+/L+m9ww==} - deprecated: This is a stub types definition. webpack-virtual-modules provides its own type definitions, so you do not need this installed. - '@types/webpack@4.41.34': resolution: {integrity: sha512-CN2aOGrR3zbMc2v+cKqzaClYP1ldkpPOgtdNvgX+RmlWCSWxHxpzz6WSCVQZRkF8D60ROlkRzAoEpgjWQ+bd2g==} @@ -2795,27 +2791,35 @@ packages: '@ungap/structured-clone@1.2.0': resolution: {integrity: sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==} - '@unhead/dom@1.9.12': - resolution: {integrity: sha512-3MY1TbZmEjGNZapi3wvJW0vWNS2CLKHt7/m57sScDHCNvNBe1mTwrIOhtZFDgAndhml2EVQ68RMa0Vhum/M+cw==} + '@unhead/dom@1.9.13': + resolution: {integrity: sha512-Fzc929W+5f88c90kn9aKs7EbgRBhphArMqBbifre134GWgrgDVR0odoadNa7i9eH4roPEDE1FIGcKVWuxOIHbg==} - '@unhead/schema@1.9.12': - resolution: {integrity: sha512-ue2FKyIZKsuZDpWJBMlBGwMm4s+vFeU3NUWsNt8Z+2JkOUIqO/VG43LxNgY1M595bOS71Gdxk+G9VtzfKJ5uEA==} + '@unhead/schema@1.9.13': + resolution: {integrity: sha512-keOfTXC/tI21fURcEszBHgGvIg2AszQVQEXBG5BYgC2TQph25Bmv7Fk8W2ogFmj+DdZmFiDnSJdz/NKv3bqnTQ==} - '@unhead/shared@1.9.12': - resolution: {integrity: sha512-72wlLXG3FP3sXUrwd42Uv8jYpHSg4R6IFJcsl+QisRjKM89JnjOFSw1DqWO4IOftW5xOxS4J5v7SQyJ4NJo7Bw==} + '@unhead/shared@1.9.13': + resolution: {integrity: sha512-zNlJ2i5WonQZu/UMHJJzYMyBLhlCCxj1JxHL6lEG+Z6XiERfJDFr8mEAsQY7M2KrGAHR+WRBxNVoLw03j/kfrA==} - '@unhead/ssr@1.9.12': - resolution: {integrity: sha512-EbUT55CzAYsXL/A1hjxpDoK0EitV3n1YZVWHfdE+I8Qe13EL/tnQwco2AYILjb1gtA4s70n3PjTNGeJ17cHPnw==} + '@unhead/ssr@1.9.13': + resolution: {integrity: sha512-YjYrZ3u9uNDzrMybWMVFE0bDcMWBV6Dyqba2Sjq6x84NBRBpZfcUrc7v58iwp5m4XBNfyPs1+r5tOSV0qCiGww==} - '@unhead/vue@1.9.12': - resolution: {integrity: sha512-keE4EuswgzCqVU7zmZprU+ToMvNWc3s8NoLreH5AtJd2u0FgBygD8sxRVyEnZw1KwFYOJ2C7yD2TChSKZioPGQ==} + '@unhead/vue@1.9.13': + resolution: {integrity: sha512-vIMNrB0kZ/3zalmE4j64eBLTkXkrcms78YbptXLvfnnQ9BLGiwsSuB3c0e+4S5Cn1dpMqUTfg5e/hCQYGDMhEA==} peerDependencies: vue: 3.4.27 '@unocss/astro@0.60.4': resolution: {integrity: sha512-mfWiEVCUP00gxrMewwPfnTuw+ur5b6uIBRH2tIGkvfI21rLyZw8TIF08w7USz9C/47rvzsixBtCqq7v0g3Tw9w==} peerDependencies: - vite: 5.2.13 + vite: 5.3.0 + peerDependenciesMeta: + vite: + optional: true + + '@unocss/astro@0.61.0': + resolution: {integrity: sha512-cbgztX/to5rMhAtEGCcR3ClMlK9F+lPxq21A72qsbWVQjiKa7W4O7qKBmUKPYsWRzJEJtdyN11A65H2037aKQw==} + peerDependencies: + vite: 5.3.0 peerDependenciesMeta: vite: optional: true @@ -2825,19 +2829,37 @@ packages: engines: {node: '>=14'} hasBin: true + '@unocss/cli@0.61.0': + resolution: {integrity: sha512-NuwBFHpnI40PBu84/3c9JpyO02TBNoRPzZ+kJ0hmFa+dv8Ro7Sb1AMlLJ5t3ZjELhsh0zXQf6ucS9mpqu+785g==} + engines: {node: '>=14'} + hasBin: true + '@unocss/config@0.60.4': resolution: {integrity: sha512-ri9P2+YztD5JdPYSLiNjcLf6NgoBbwJDVutP/tQnfYYrE72DQ+j+4vepyxEBa1YaH/X4qsmLJCj+2tI/ufIiog==} engines: {node: '>=14'} + '@unocss/config@0.61.0': + resolution: {integrity: sha512-k8uV4n8eMti4S6BFeAkc9QBXJefDIlPyOWrdKykUMOHLIWVAIS53JixW9FJNgJRw0RVI6B7UR+rOznWwKpORPA==} + engines: {node: '>=14'} + '@unocss/core@0.60.4': resolution: {integrity: sha512-6tz8KTzC30oB0YikwRQoIpJ6Y6Dg+ZiK3NfCIsH+UX11bh2J2M53as2EL/5VQCqtiUn3YP0ZEzR2d1AWX78RCA==} + '@unocss/core@0.61.0': + resolution: {integrity: sha512-Y/Ly3LPIAzOBlWCdKBVzVzIaaWDsf+oWPIUZlaW7DL++WWypVBCghmxXIT5dyuMGXE560Hj92st4AkXfuVdxGQ==} + '@unocss/extractor-arbitrary-variants@0.60.4': resolution: {integrity: sha512-USuFGs5CLft9q7IGNdAEp1oliuUns+W7OO0Tx5qtx/oBh6pU/L93lcNNsuuGNrMU8BCmF3atx1/PEmGymgJ7VA==} + '@unocss/extractor-arbitrary-variants@0.61.0': + resolution: {integrity: sha512-9ru/UR4kZ1+jGXpMawV9T8kpL54FrJBmWKMuFlDTEDIwtzDyyfLbt/buoXdzKDLmil9hOXH3IH8+dah/OiiDoA==} + '@unocss/inspector@0.60.4': resolution: {integrity: sha512-PcnrEQ2H7osZho4Nh0+84O4IXzlkF7pvTUe/7FTJYF1HQGWHB/PfOSoyKn7/sF5sED8hMK9RlSJ9YGUH9ioY+g==} + '@unocss/inspector@0.61.0': + resolution: {integrity: sha512-gpL2RNw6Cp145kTxWN0BG/tWd4x3LVbgkZfyUlh5IAZHWKAq9MWA0jIifV2RU94h4rbSBNHxz50bodYtkzeM8A==} + '@unocss/nuxt@0.60.4': resolution: {integrity: sha512-2lv7tsVlAnGMqqImfZPLm05dtDo3Og0VDrHOAwFwL4XiVaTLXEXQfAf/bOBDRy4qpJ2nFDj9eltuoQYWto1jmA==} @@ -2847,59 +2869,119 @@ packages: peerDependencies: postcss: ^8.4.21 + '@unocss/postcss@0.61.0': + resolution: {integrity: sha512-0ZHUeLYu057xL1vXg2coV62ly6zaCgYdA/oHKCMaU9KT0TI49+DE73GouHypRNM5YXfuUPfXhPGGUuFWkAbI1A==} + engines: {node: '>=14'} + peerDependencies: + postcss: ^8.4.21 + '@unocss/preset-attributify@0.60.4': resolution: {integrity: sha512-J2GWUC0bcmZSXlBGLYUXwWQos/dNzKbq2CKweWVBAmAH9XyfM0mA5CTNBRv05PN1g6C/0z5st7ntUjV6KHJuTg==} + '@unocss/preset-attributify@0.61.0': + resolution: {integrity: sha512-E0oIfYAnnm8piSU7cbAnLIKKz0TwlHMOfAcg0Z0jv2N/MatCpq0BCJZHeE0fEw53OUc+oa6Dpd509rOEUXp/tA==} + '@unocss/preset-icons@0.60.4': resolution: {integrity: sha512-UN/dj+nhI3+S06YxCZQPLw3GZy780iaE71dysyhDMdh+Qq2KFVs3d94mr1427fjz/3Y8ZyXkgqyhCFr7UT0bMQ==} + '@unocss/preset-icons@0.61.0': + resolution: {integrity: sha512-xI7isKu1fQbyGee1lcJBLwvUlmubYbPN4ymepUamfprNPlWrzb5Gj2+SROERlzzrTaI8C0YdBxsYMGyOV94dXQ==} + '@unocss/preset-mini@0.60.4': resolution: {integrity: sha512-ZiHbP69vkyz0xmhqzC4B4PegwV+LPlZOBT7cRhsh0P8oPOQKYOyDRy4rAl+sJBJeIrggn1r1LgN+Z0Xvd8Ytcw==} + '@unocss/preset-mini@0.61.0': + resolution: {integrity: sha512-P+DdMtPtzAQ2aQ1/WWPoO3X/qvky+Fqq4eKXIvbqXOQ9c2oem7/dnsPeT08zzLIqxVJnuykymPwRT85EumS0gg==} + '@unocss/preset-tagify@0.60.4': resolution: {integrity: sha512-GxL/W3qkdWWDqXi43qyLbp/BpEj7gMw99KqkO7bmbVi3BVlFggreTFwmQu89pB6iatxGjxnAsc+TsQZqxKftZA==} + '@unocss/preset-tagify@0.61.0': + resolution: {integrity: sha512-Q3709A8/4fFZdQ4vfKfgDSugQYd21BoSO+TomJp/QMi9iyPjGsrERQilciMmkuRyAe8Q1rdLh+6ioGiJEU0XHQ==} + '@unocss/preset-typography@0.60.4': resolution: {integrity: sha512-6j8ySZYEAwMBy9a3Lw3EEfRlcAClti4zvaV0kBtkP4BDZCwlgX2eE1pmw2mTUy+E1yVlXm3NnRzKfDudQUzraA==} + '@unocss/preset-typography@0.61.0': + resolution: {integrity: sha512-chT2KvgeKsXoDFSedfP0BjhFLYgcDUBJCX0omJOXVVz9q7vB898abhZ5zA9Rcpmbkby4ovtbIjc2RqG9uIKLaQ==} + '@unocss/preset-uno@0.60.4': resolution: {integrity: sha512-AN8ZTtiKSaZNGKZZIqt/JAhMzSY2hHLwhGEOFDrXgjWFr85UlwZzODMDoT58PrU04VlbhN8+0N4lHfLmZCKpiQ==} + '@unocss/preset-uno@0.61.0': + resolution: {integrity: sha512-mkKOra3dQEc3uI7aPIqa3t8MJXlmpLSgGaPfEJK52xkFe991ex6CiUunYMMWbh6ZSzmdxkO31IwQIH9lcmj/Uw==} + '@unocss/preset-web-fonts@0.60.4': resolution: {integrity: sha512-COfxOQcREFgpsm6nw234pxrr1EV1zWUVYXBZjlH+vk7x8EhaS5BPAXqN6SneIVTTDvEE9U4opAaoEYz5A3XWaQ==} + '@unocss/preset-web-fonts@0.61.0': + resolution: {integrity: sha512-9bYvk2BSryLgguZ5qTDPVEhgD/olZiTAy/7JqHzrKKTh7xPURO1IcG2vbX354unfhTDR6GZIKiAkk64qJZUDPw==} + '@unocss/preset-wind@0.60.4': resolution: {integrity: sha512-dT/U+RkbL21lDTOP7/mlFZxlBbUAefUzQZINC0BX7vTKvO57G4HxRq62u9xvMGFv38lQ+qXXzKhABVsEPDNpUA==} + '@unocss/preset-wind@0.61.0': + resolution: {integrity: sha512-PooyLVAF4wH9KvW4OKfDxYFuM4qmnlU+Ci6O6RGgVsKyQMq76crRqqK76lbnehg7jOoZJVxmWfQ6k5gT3aQeXQ==} + '@unocss/reset@0.60.4': resolution: {integrity: sha512-MEngG4byIHnfb0osvxqU2gBdBkXPPE4z+G9HeEt3JUadWAp2gggm8ojC1/1PoJF5M31loxGEVVrB0FLSKACw3g==} + '@unocss/reset@0.61.0': + resolution: {integrity: sha512-VqemtmzH8Rgu5yNomtv50gIcy4KZ2x1aP+7WZCds9x5ZdTSEjbfCOgUDI9rDrrGSipJkCmJ1yOhUPMC7ND6Hfw==} + '@unocss/rule-utils@0.60.4': resolution: {integrity: sha512-7qUN33NM4T/IwWavm9VIOCZ2+4hLBc0YUGxcMNTDZSFQRQLkWe3N5dOlgwKXtMyMKatZfbIRUKVDUgvEefoCTA==} engines: {node: '>=14'} + '@unocss/rule-utils@0.61.0': + resolution: {integrity: sha512-MCdmfhE6Q9HSWjWqi2sx5/nnKyOEhfhoo+pVumHIqkHQICQ/LuKioFf7Y7e5ycqjFE/7dC2hKGZJ8WTMGIOMwA==} + engines: {node: '>=14'} + '@unocss/scope@0.60.4': resolution: {integrity: sha512-AOu/qvi4agy0XfGF3QEBbuxVHkVZHpmU0NMBYuxa0B869YZENT87sTM6DVwtvr75CZvACWxv/hcL3lR68uKBjw==} + '@unocss/scope@0.61.0': + resolution: {integrity: sha512-uDk84LX2meZHskSvy0Mad7jgF0Be6el16F9DKYYvxlUxlzu/mCj6PQpQrXi8uZ2+O3akneHFqAbO6ewYShKdQA==} + '@unocss/transformer-attributify-jsx-babel@0.60.4': resolution: {integrity: sha512-BL4g2gyLpbseu+fOhkAHKNxYcHcn7brQAjXj5k5Yyy6wpwm43lzHYPZtRPrbLVLniqqAN21FzEbtJXCPIHKlHA==} + '@unocss/transformer-attributify-jsx-babel@0.61.0': + resolution: {integrity: sha512-D9z28MQM4w8oowMZRiz7kxEVlor1/XUfaVBTujAS6Ks7Ly+0/91LuOLSHU9uC7vcKmMRI0Q2+Ww2hsVNf2z7ww==} + '@unocss/transformer-attributify-jsx@0.60.4': resolution: {integrity: sha512-tQwD1T8Juz5F4JHYxTgekCv5olEegAPRZwAgx75pP+X2+PkV670pdXv8zbK0t5q6bvyF53vEVBrgQ9q1xSH9yQ==} + '@unocss/transformer-attributify-jsx@0.61.0': + resolution: {integrity: sha512-mC0+O7KmxP5b0DlPyGVdu/3NM/33f9CgfXmwu+U+3NSsAfcCLjJ7nD1MOjl3vcFV5YpudTy1EVaqhcROQRSZIg==} + '@unocss/transformer-compile-class@0.60.4': resolution: {integrity: sha512-zIqKQ7javiCb9Q3fbMvx1QVln8OqvAzWwgCVHsPINzDrDi73KXa3eeCU6GNlsd46tzy0Y9ryRIvW73YS+9Oj1w==} + '@unocss/transformer-compile-class@0.61.0': + resolution: {integrity: sha512-iTQyWz+IbNZrQWCQaibHMY2+8+VoG4ZpizeyYKXHZe11/HaomSvorJwZdufEUTrdWmUzRhJgumGl1TW4FaJwpg==} + '@unocss/transformer-directives@0.60.4': resolution: {integrity: sha512-u3fQI8RszMhUevhJICtQ/bNpAfbh8MEXQf7YNnzUvLvbXGkkoieyU5mj0ray6fbToqxfxVceQtXYcFYIuf4aNg==} + '@unocss/transformer-directives@0.61.0': + resolution: {integrity: sha512-15nIynJPYFYnW/TUQu0NyZ5uxTDcrRyY8sB3axcYZOqqlu1hgPFotVukl6jqCZgGUR1AbfbnJwuDlcBQeT8xpA==} + '@unocss/transformer-variant-group@0.60.4': resolution: {integrity: sha512-R4d16G7s3fDXj9prUNFnJi8cZvH8/XZsqiKDzCBjXNKrbf9zp7YnWD2VaMFjUISgW5kSQjQNSWK84soVNWq3UQ==} + '@unocss/transformer-variant-group@0.61.0': + resolution: {integrity: sha512-5DHEram3iv+c9jPQW8p629aFyptyzdP5yNnRSMLBZcwyJ672VAKzPUZLYHh5UOUb69eaet3og1cU8uxpHhGKtQ==} + '@unocss/vite@0.60.4': resolution: {integrity: sha512-af9hhtW11geF56cotKUE16Fr+FirTdV/Al/usjKJ6P5hnCEQnqSHXQDFXL5Y6vXwcvLDmOhHYNrVR8duKgC8Mw==} peerDependencies: - vite: 5.2.13 + vite: 5.3.0 + + '@unocss/vite@0.61.0': + resolution: {integrity: sha512-gjxLJrja1hqDwdd8z3QvzfMCcKppGqiL2+A6aHwG/AXfEmZMydA50U7VvJK7Wx8/Enm26G6JQrtGrpu+kK3QpQ==} + peerDependencies: + vite: 5.3.0 '@unocss/webpack@0.60.4': resolution: {integrity: sha512-TcPuiAZZO+a+xiahrCm7eEHlP8o667n+CWv+kpz4bidY5V8Xyxs1MjzJAPVOk8Kwz86HvQZyf2CG+3powNTwKA==} @@ -2915,14 +2997,14 @@ packages: resolution: {integrity: sha512-A+6wL2AdQhDsLsDnY+2v4rRDI1HLJGIMc97a8FURO9tqKsH5QvjWrzsa5DH3NlZsM742W2wODl2fF+bfcTWtXw==} engines: {node: ^18.0.0 || >=20.0.0} peerDependencies: - vite: 5.2.13 + vite: 5.3.0 vue: 3.4.27 '@vitejs/plugin-vue@5.0.4': resolution: {integrity: sha512-WS3hevEszI6CEVEx28F8RjTX97k3KsrcY6kvTg7+Whm5y3oYvcqzVeGCU3hxSAn4uY2CLCkeokkGKpoctccilQ==} engines: {node: ^18.0.0 || >=20.0.0} peerDependencies: - vite: 5.2.13 + vite: 5.3.0 vue: 3.4.27 '@vitest/coverage-v8@1.6.0': @@ -3066,6 +3148,9 @@ packages: '@vueuse/core@10.10.0': resolution: {integrity: sha512-vexJ/YXYs2S42B783rI95lMt3GzEwkxzC8Hb0Ndpd8rD+p+Lk/Za4bd797Ym7yq4jXqdSyj3JLChunF/vyYjUw==} + '@vueuse/core@10.10.1': + resolution: {integrity: sha512-8Vr8wxILdK+qfBjbngav8LVI+6UuM2TQCufRKMPz/GrpLHQ6dbY6kL5PLa9Eobq8JRrMaDyArPX9Jj18fMTPew==} + '@vueuse/core@10.9.0': resolution: {integrity: sha512-/1vjTol8SXnx6xewDEKfS0Ra//ncg4Hb0DaZiwKf7drgfMsKFExQ+FnnENcN6efPen+1kIzhLQoGSy0eDUVOMg==} @@ -3113,6 +3198,9 @@ packages: '@vueuse/metadata@10.10.0': resolution: {integrity: sha512-UNAo2sTCAW5ge6OErPEHb5z7NEAg3XcO9Cj7OK45aZXfLLH1QkexDcZD77HBi5zvEiLOm1An+p/4b5K3Worpug==} + '@vueuse/metadata@10.10.1': + resolution: {integrity: sha512-dpEL5afVLUqbchwGiLrV6spkl4/6UOKJ3YgxFE+wWLj/LakyIZUC83bfeFgbHkRcNhsAqTQCGR74jImsLfK8pg==} + '@vueuse/metadata@10.9.0': resolution: {integrity: sha512-iddNbg3yZM0X7qFY2sAotomgdHK7YJ6sKUvQqbvwnf7TmaVPxS4EJydcNsVejNdS8iWCtDk+fYXr7E32nyTnGA==} @@ -3124,6 +3212,9 @@ packages: '@vueuse/shared@10.10.0': resolution: {integrity: sha512-2aW33Ac0Uk0U+9yo3Ypg9s5KcR42cuehRWl7vnUHadQyFvCktseyxxEPBi1Eiq4D2yBGACOnqLZpx1eMc7g5Og==} + '@vueuse/shared@10.10.1': + resolution: {integrity: sha512-edqexI+RQpoeqDxTatqBZa+K87ganbrwpoP++Fd9828U3js5jzwcEDeyrYcUgkKZ5LLL8q7M5SOMvSpMrxBPxg==} + '@vueuse/shared@10.9.0': resolution: {integrity: sha512-Uud2IWncmAfJvRaFYzv5OHDli+FbOzxiVEQdLCKQKLyhz94PIyFC3CHcH7EDMwIn8NPtD06+PNbC/PiO0LGLtw==} @@ -3446,8 +3537,13 @@ packages: resolution: {integrity: sha512-tjwM5exMg6BGRI+kNmTntNsvdZS1X8BFYS6tnJ2hdH0kVxM6/eVZ2xy+FqStSWvYmtfFMDLIxurorHwDKfDz5Q==} engines: {node: '>=18'} - c12@1.10.0: - resolution: {integrity: sha512-0SsG7UDhoRWcuSvKWHaXmu5uNjDCDN3nkQLRL4Q42IlFy+ze58FcCoI3uPwINXinkz7ZinbhEgyzYFw9u9ZV8g==} + c12@1.11.1: + resolution: {integrity: sha512-KDU0TvSvVdaYcQKQ6iPHATGz/7p/KiVjPg4vQrB6Jg/wX9R0yl5RZxWm9IoZqaIHD2+6PZd81+KMGwRr/lRIUg==} + peerDependencies: + magicast: ^0.3.4 + peerDependenciesMeta: + magicast: + optional: true cac@6.7.14: resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==} @@ -3629,8 +3725,8 @@ packages: commondir@1.0.1: resolution: {integrity: sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==} - compatx@0.1.3: - resolution: {integrity: sha512-MWspQwvBk5xeLZMetIfjOozTAtmAIICz1mtol6NbBpCSllXOO+HvWMO87B18rcFtqjfrZ0tIFOH9gNG63ep+mw==} + compatx@0.1.8: + resolution: {integrity: sha512-jcbsEAR81Bt5s1qOFymBufmCbXCXbk0Ql+K5ouj6gCyx2yHlu6AgmGIi9HxfKixpUDO5bCFJUHQ5uM6ecbTebw==} compress-commons@6.0.2: resolution: {integrity: sha512-6FqVXeETqWPoGcfzrXb37E50NP0LXT8kAMu5ooZayhWWdgEY4lBEEcbQNXtkuKQsGduxiIcI4gOTsxTmuq/bSg==} @@ -4161,13 +4257,13 @@ packages: resolution: {integrity: sha512-Lf4YW/bL6Un1R6A76pRZyE1dl1vr31G/ev8UzIc/geCgFWyrKil8hVjYqWVKGB/UIGmb6Slzs9T0wNezdSVegw==} engines: {node: '>=5.0.0'} - eslint-plugin-perfectionist@2.10.0: - resolution: {integrity: sha512-P+tdrkHeMWBc55+DZsoDOAftV1WCsEoHaKm6JC7zajFus/syfT4vUPBFb3atGFSuyaVnGQGHlcKpP9X3Q0gH/w==} + eslint-plugin-perfectionist@2.11.0: + resolution: {integrity: sha512-XrtBtiu5rbQv88gl+1e2RQud9te9luYNvKIgM9emttQ2zutHPzY/AQUucwxscDKV4qlTkvLTxjOFvxqeDpPorw==} peerDependencies: - astro-eslint-parser: ^0.16.0 + astro-eslint-parser: ^1.0.2 eslint: '>=8.0.0' svelte: '>=3.0.0' - svelte-eslint-parser: ^0.33.0 + svelte-eslint-parser: ^0.37.0 vue-eslint-parser: '>=9.0.0' peerDependenciesMeta: astro-eslint-parser: @@ -4478,8 +4574,8 @@ packages: get-tsconfig@4.7.3: resolution: {integrity: sha512-ZvkrzoUA0PQZM6fy6+/Hce561s+faD1rsNwhnO5FelNjyy7EMGJ3Rz1AQ8GYDWjhRs/7dBLOEJvhK8MiEJOAFg==} - giget@1.2.1: - resolution: {integrity: sha512-4VG22mopWtIeHwogGSy1FViXVo0YT+m6BrqZfz0JJFwbSsePsCdOzdLIIli5BtMp7Xe8f/o2OmBpQX2NBOC24g==} + giget@1.2.3: + resolution: {integrity: sha512-8EHPljDvs7qKykr6uw8b+lqLiUc/vUg+KVTI0uND4s63TdsZM2Xus3mflvF0DDG9SiM4RlCkFGL+7aAjRmV7KA==} hasBin: true git-config-path@2.0.0: @@ -6631,8 +6727,8 @@ packages: shiki@1.3.0: resolution: {integrity: sha512-9aNdQy/etMXctnPzsje1h1XIGm9YfRcSksKOGqZWXA/qP9G18/8fpz5Bjpma8bOgz3tqIpjERAd6/lLjFyzoww==} - shiki@1.6.3: - resolution: {integrity: sha512-lE1/YGlzFY0hQSyEfsZj18xGrTWxyhFQkaiILALqTBZPbJeYFWpbUhlmTGPOupYB/qC+H6sV4UznJzcEh3WMHQ==} + shiki@1.6.4: + resolution: {integrity: sha512-X88chM7w8jnadoZtjPTi5ahCJx9pc9f8GfEkZAEYUTlcUZIEw2D/RY86HI/LkkE7Nj8TQWkiBfaFTJ3VJT6ESg==} side-channel@1.0.4: resolution: {integrity: sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==} @@ -7065,8 +7161,8 @@ packages: unenv@1.9.0: resolution: {integrity: sha512-QKnFNznRxmbOF1hDgzpqrlIf6NC5sbZ2OJ+5Wl3OX8uM+LUJXbj4TXvLJCtwbPTmbMHCLIz6JLKNinNsMShK9g==} - unhead@1.9.12: - resolution: {integrity: sha512-s6VxcTV45hy8c/IioKQOonFnAO+kBOSpgDfqEHhnU0YVSQYaRPEp9pzW1qSPf0lx+bg9RKeOQyNNbSGGUP26aQ==} + unhead@1.9.13: + resolution: {integrity: sha512-r7O7s5nw1vUrolueEitawh1HnrzXoekHPM1gsYMF3Tu0A2SzochDJw/1F+Nhu3e073rJ9cUGZqobZY3+RZS4Ew==} unicode-emoji-modifier-base@1.0.0: resolution: {integrity: sha512-yLSH4py7oFH3oG/9K+XWrz1pSi3dfUrWEnInbxMfArOfc1+33BlGPQtLsOYwvdMy11AwUBetYuaRxSPqgkq+8g==} @@ -7117,7 +7213,19 @@ packages: engines: {node: '>=14'} peerDependencies: '@unocss/webpack': 0.60.4 - vite: 5.2.13 + vite: 5.3.0 + peerDependenciesMeta: + '@unocss/webpack': + optional: true + vite: + optional: true + + unocss@0.61.0: + resolution: {integrity: sha512-7642v5tHpEpHO9dl9sqYbKT/Ri4X4lmGHhj/znE4uheEfXcptPPiZ1/hVmQVciHUSI8CnQBqDwkZuxNPDG3bTQ==} + engines: {node: '>=14'} + peerDependencies: + '@unocss/webpack': 0.61.0 + vite: 5.3.0 peerDependenciesMeta: '@unocss/webpack': optional: true @@ -7231,8 +7339,8 @@ packages: peerDependencies: '@vue/compiler-core': ^3.3 - valibot@0.30.0: - resolution: {integrity: sha512-5POBdbSkM+3nvJ6ZlyQHsggisfRtyT4tVTo1EIIShs6qCdXJnyWU5TJ68vr8iTg5zpOLjXLRiBqNx+9zwZz/rA==} + valibot@0.31.1: + resolution: {integrity: sha512-2YYIhPrnVSz/gfT2/iXVTrSj92HwchCt9Cga/6hX4B26iCz9zkIsGTS0HjDYTZfTi1Un0X6aRvhBi1cfqs/i0Q==} validate-npm-package-license@3.0.4: resolution: {integrity: sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==} @@ -7253,7 +7361,7 @@ packages: vite-hot-client@0.2.3: resolution: {integrity: sha512-rOGAV7rUlUHX89fP2p2v0A2WWvV3QMX2UYq0fRqsWSvFvev4atHWqjwGoKaZT1VTKyLGk533ecu3eyd0o59CAg==} peerDependencies: - vite: 5.2.13 + vite: 5.3.0 vite-node@1.6.0: resolution: {integrity: sha512-de6HJgzC+TFzOu0NTC4RAIsyf/DY/ibWDYQUcuEA84EMHhcefTUGkjFHKKEJhQN4A+6I0u++kr3l36ZF2d7XRw==} @@ -7269,7 +7377,7 @@ packages: optionator: ^0.9.1 stylelint: '>=13' typescript: '*' - vite: 5.2.13 + vite: 5.3.0 vls: '*' vti: '*' vue-tsc: '>=1.3.9' @@ -7296,7 +7404,7 @@ packages: engines: {node: '>=14'} peerDependencies: '@nuxt/kit': '*' - vite: 5.2.13 + vite: 5.3.0 peerDependenciesMeta: '@nuxt/kit': optional: true @@ -7304,10 +7412,10 @@ packages: vite-plugin-vue-inspector@5.1.0: resolution: {integrity: sha512-yIw9dvBz9nQW7DPfbJtUVW6JTnt67hqTPRnTwT2CZWMqDvISyQHRjgKl32nlMh1DRH+92533Sv6t59pWMLUCWA==} peerDependencies: - vite: 5.2.13 + vite: 5.3.0 - vite@5.2.13: - resolution: {integrity: sha512-SSq1noJfY9pR3I1TUENL3rQYDQCFqgD+lM6fTRAM8Nv6Lsg5hDLaXkjETVeBt+7vZBCMoibD+6IWnT2mJ+Zb/A==} + vite@5.3.0: + resolution: {integrity: sha512-hA6vAVK977NyW1Qw+fLvqSo7xDPej7von7C3DwwqPRmnnnK36XEBC/J3j1V5lP8fbt7y0TgTKJbpNGSwM+Bdeg==} engines: {node: ^18.0.0 || >=20.0.0} hasBin: true peerDependencies: @@ -7407,6 +7515,17 @@ packages: '@vue/composition-api': optional: true + vue-demi@0.14.8: + resolution: {integrity: sha512-Uuqnk9YE9SsWeReYqK2alDI5YzciATE0r2SkA6iMAtuXvNTMNACJLJEXNXaEy94ECuBe4Sk6RzRU80kjdbIo1Q==} + engines: {node: '>=12'} + hasBin: true + peerDependencies: + '@vue/composition-api': ^1.0.0-rc.1 + vue: 3.4.27 + peerDependenciesMeta: + '@vue/composition-api': + optional: true + vue-devtools-stub@0.1.0: resolution: {integrity: sha512-RutnB7X8c5hjq39NceArgXg28WZtZpGc3+J16ljMiYnFhKvd8hITxSWQSQ5bvldxMDU6gG5mkxl1MTQLXckVSQ==} @@ -8607,37 +8726,37 @@ snapshots: '@nuxt/devalue@2.0.2': {} - '@nuxt/devtools-kit@1.3.3(nuxt@packages+nuxt)(vite@5.2.13(@types/node@20.14.2)(sass@1.69.4)(terser@5.27.0))': + '@nuxt/devtools-kit@1.3.3(nuxt@packages+nuxt)(vite@5.3.0(@types/node@20.14.2)(sass@1.69.4)(terser@5.27.0))': dependencies: '@nuxt/kit': link:packages/kit '@nuxt/schema': link:packages/schema execa: 7.2.0 nuxt: link:packages/nuxt - vite: 5.2.13(@types/node@20.14.2)(sass@1.69.4)(terser@5.27.0) + vite: 5.3.0(@types/node@20.14.2)(sass@1.69.4)(terser@5.27.0) - '@nuxt/devtools-ui-kit@1.3.3(@nuxt/devtools@1.3.3(@unocss/reset@0.60.4)(floating-vue@5.2.2(@nuxt/kit@packages+kit)(vue@3.4.27(typescript@5.4.5)))(nuxt@packages+nuxt)(rollup@4.18.0)(unocss@0.60.4(@unocss/webpack@0.60.4(rollup@4.18.0)(webpack@5.92.0(esbuild@0.21.5)))(postcss@8.4.38)(rollup@4.18.0)(vite@5.2.13(@types/node@20.14.2)(sass@1.69.4)(terser@5.27.0)))(vite@5.2.13(@types/node@20.14.2)(sass@1.69.4)(terser@5.27.0))(vue@3.4.27(typescript@5.4.5)))(@unocss/webpack@0.60.4(rollup@4.18.0)(webpack@5.92.0(esbuild@0.21.5)))(@vue/compiler-core@3.4.27)(nuxt@packages+nuxt)(postcss@8.4.38)(rollup@4.18.0)(vite@5.2.13(@types/node@20.14.2)(sass@1.69.4)(terser@5.27.0))(vue@3.4.27(typescript@5.4.5))(webpack@5.92.0(esbuild@0.21.5))': + '@nuxt/devtools-ui-kit@1.3.3(@nuxt/devtools@1.3.3(@unocss/reset@0.61.0)(floating-vue@5.2.2(@nuxt/kit@packages+kit)(vue@3.4.27(typescript@5.4.5)))(nuxt@packages+nuxt)(rollup@4.18.0)(unocss@0.61.0(@unocss/webpack@0.60.4(rollup@4.18.0)(webpack@5.92.0(esbuild@0.21.5)))(postcss@8.4.38)(rollup@4.18.0)(vite@5.3.0(@types/node@20.14.2)(sass@1.69.4)(terser@5.27.0)))(vite@5.3.0(@types/node@20.14.2)(sass@1.69.4)(terser@5.27.0))(vue@3.4.27(typescript@5.4.5)))(@unocss/webpack@0.60.4(rollup@4.18.0)(webpack@5.92.0(esbuild@0.21.5)))(@vue/compiler-core@3.4.27)(nuxt@packages+nuxt)(postcss@8.4.38)(rollup@4.18.0)(vite@5.3.0(@types/node@20.14.2)(sass@1.69.4)(terser@5.27.0))(vue@3.4.27(typescript@5.4.5))(webpack@5.92.0(esbuild@0.21.5))': dependencies: '@iconify-json/carbon': 1.1.35 '@iconify-json/logos': 1.1.43 '@iconify-json/ri': 1.1.20 '@iconify-json/tabler': 1.1.113 - '@nuxt/devtools': 1.3.3(@unocss/reset@0.60.4)(floating-vue@5.2.2(@nuxt/kit@packages+kit)(vue@3.4.27(typescript@5.4.5)))(nuxt@packages+nuxt)(rollup@4.18.0)(unocss@0.60.4(@unocss/webpack@0.60.4(rollup@4.18.0)(webpack@5.92.0(esbuild@0.21.5)))(postcss@8.4.38)(rollup@4.18.0)(vite@5.2.13(@types/node@20.14.2)(sass@1.69.4)(terser@5.27.0)))(vite@5.2.13(@types/node@20.14.2)(sass@1.69.4)(terser@5.27.0))(vue@3.4.27(typescript@5.4.5)) - '@nuxt/devtools-kit': 1.3.3(nuxt@packages+nuxt)(vite@5.2.13(@types/node@20.14.2)(sass@1.69.4)(terser@5.27.0)) + '@nuxt/devtools': 1.3.3(@unocss/reset@0.61.0)(floating-vue@5.2.2(@nuxt/kit@packages+kit)(vue@3.4.27(typescript@5.4.5)))(nuxt@packages+nuxt)(rollup@4.18.0)(unocss@0.61.0(@unocss/webpack@0.60.4(rollup@4.18.0)(webpack@5.92.0(esbuild@0.21.5)))(postcss@8.4.38)(rollup@4.18.0)(vite@5.3.0(@types/node@20.14.2)(sass@1.69.4)(terser@5.27.0)))(vite@5.3.0(@types/node@20.14.2)(sass@1.69.4)(terser@5.27.0))(vue@3.4.27(typescript@5.4.5)) + '@nuxt/devtools-kit': 1.3.3(nuxt@packages+nuxt)(vite@5.3.0(@types/node@20.14.2)(sass@1.69.4)(terser@5.27.0)) '@nuxt/kit': link:packages/kit '@nuxtjs/color-mode': 3.4.1 '@unocss/core': 0.60.4 - '@unocss/nuxt': 0.60.4(postcss@8.4.38)(rollup@4.18.0)(vite@5.2.13(@types/node@20.14.2)(sass@1.69.4)(terser@5.27.0))(webpack@5.92.0(esbuild@0.21.5)) + '@unocss/nuxt': 0.60.4(postcss@8.4.38)(rollup@4.18.0)(vite@5.3.0(@types/node@20.14.2)(sass@1.69.4)(terser@5.27.0))(webpack@5.92.0(esbuild@0.21.5)) '@unocss/preset-attributify': 0.60.4 '@unocss/preset-icons': 0.60.4 '@unocss/preset-mini': 0.60.4 '@unocss/reset': 0.60.4 - '@vueuse/core': 10.10.0(vue@3.4.27(typescript@5.4.5)) + '@vueuse/core': 10.10.1(vue@3.4.27(typescript@5.4.5)) '@vueuse/integrations': 10.9.0(focus-trap@7.5.4)(vue@3.4.27(typescript@5.4.5)) '@vueuse/nuxt': 10.10.0(nuxt@packages+nuxt)(vue@3.4.27(typescript@5.4.5)) defu: 6.1.4 focus-trap: 7.5.4 splitpanes: 3.1.5 - unocss: 0.60.4(@unocss/webpack@0.60.4(rollup@4.18.0))(postcss@8.4.38)(rollup@4.18.0)(vite@5.2.13(@types/node@20.14.2)(sass@1.69.4)(terser@5.27.0)) + unocss: 0.60.4(@unocss/webpack@0.60.4(rollup@4.18.0)(webpack@5.92.0(esbuild@0.21.5)))(postcss@8.4.38)(rollup@4.18.0)(vite@5.3.0(@types/node@20.14.2)(sass@1.69.4)(terser@5.27.0)) v-lazy-show: 0.2.4(@vue/compiler-core@3.4.27) transitivePeerDependencies: - '@unocss/webpack' @@ -8675,14 +8794,14 @@ snapshots: rc9: 2.1.2 semver: 7.6.2 - '@nuxt/devtools@1.3.3(@unocss/reset@0.60.4)(floating-vue@5.2.2(@nuxt/kit@packages+kit)(vue@3.4.27(typescript@5.4.5)))(nuxt@packages+nuxt)(rollup@4.18.0)(unocss@0.60.4(@unocss/webpack@0.60.4(rollup@4.18.0)(webpack@5.92.0(esbuild@0.21.5)))(postcss@8.4.38)(rollup@4.18.0)(vite@5.2.13(@types/node@20.14.2)(sass@1.69.4)(terser@5.27.0)))(vite@5.2.13(@types/node@20.14.2)(sass@1.69.4)(terser@5.27.0))(vue@3.4.27(typescript@5.4.5))': + '@nuxt/devtools@1.3.3(@unocss/reset@0.61.0)(floating-vue@5.2.2(@nuxt/kit@packages+kit)(vue@3.4.27(typescript@5.4.5)))(nuxt@packages+nuxt)(rollup@4.18.0)(unocss@0.61.0(@unocss/webpack@0.60.4(rollup@4.18.0)(webpack@5.92.0(esbuild@0.21.5)))(postcss@8.4.38)(rollup@4.18.0)(vite@5.3.0(@types/node@20.14.2)(sass@1.69.4)(terser@5.27.0)))(vite@5.3.0(@types/node@20.14.2)(sass@1.69.4)(terser@5.27.0))(vue@3.4.27(typescript@5.4.5))': dependencies: '@antfu/utils': 0.7.8 - '@nuxt/devtools-kit': 1.3.3(nuxt@packages+nuxt)(vite@5.2.13(@types/node@20.14.2)(sass@1.69.4)(terser@5.27.0)) + '@nuxt/devtools-kit': 1.3.3(nuxt@packages+nuxt)(vite@5.3.0(@types/node@20.14.2)(sass@1.69.4)(terser@5.27.0)) '@nuxt/devtools-wizard': 1.3.3 '@nuxt/kit': link:packages/kit - '@vue/devtools-applet': 7.1.3(@unocss/reset@0.60.4)(floating-vue@5.2.2(@nuxt/kit@packages+kit)(vue@3.4.27(typescript@5.4.5)))(unocss@0.60.4(@unocss/webpack@0.60.4(rollup@4.18.0)(webpack@5.92.0(esbuild@0.21.5)))(postcss@8.4.38)(rollup@4.18.0)(vite@5.2.13(@types/node@20.14.2)(sass@1.69.4)(terser@5.27.0)))(vite@5.2.13(@types/node@20.14.2)(sass@1.69.4)(terser@5.27.0))(vue@3.4.27(typescript@5.4.5)) - '@vue/devtools-core': 7.1.3(vite@5.2.13(@types/node@20.14.2)(sass@1.69.4)(terser@5.27.0))(vue@3.4.27(typescript@5.4.5)) + '@vue/devtools-applet': 7.1.3(@unocss/reset@0.61.0)(floating-vue@5.2.2(@nuxt/kit@packages+kit)(vue@3.4.27(typescript@5.4.5)))(unocss@0.61.0(@unocss/webpack@0.60.4(rollup@4.18.0)(webpack@5.92.0(esbuild@0.21.5)))(postcss@8.4.38)(rollup@4.18.0)(vite@5.3.0(@types/node@20.14.2)(sass@1.69.4)(terser@5.27.0)))(vite@5.3.0(@types/node@20.14.2)(sass@1.69.4)(terser@5.27.0))(vue@3.4.27(typescript@5.4.5)) + '@vue/devtools-core': 7.1.3(vite@5.3.0(@types/node@20.14.2)(sass@1.69.4)(terser@5.27.0))(vue@3.4.27(typescript@5.4.5)) '@vue/devtools-kit': 7.1.3(vue@3.4.27(typescript@5.4.5)) birpc: 0.2.17 consola: 3.2.3 @@ -8712,9 +8831,9 @@ snapshots: simple-git: 3.24.0 sirv: 2.0.4 unimport: 3.7.2(rollup@4.18.0) - vite: 5.2.13(@types/node@20.14.2)(sass@1.69.4)(terser@5.27.0) - vite-plugin-inspect: 0.8.4(@nuxt/kit@packages+kit)(rollup@4.18.0)(vite@5.2.13(@types/node@20.14.2)(sass@1.69.4)(terser@5.27.0)) - vite-plugin-vue-inspector: 5.1.0(vite@5.2.13(@types/node@20.14.2)(sass@1.69.4)(terser@5.27.0)) + vite: 5.3.0(@types/node@20.14.2)(sass@1.69.4)(terser@5.27.0) + vite-plugin-inspect: 0.8.4(@nuxt/kit@packages+kit)(rollup@4.18.0)(vite@5.3.0(@types/node@20.14.2)(sass@1.69.4)(terser@5.27.0)) + vite-plugin-vue-inspector: 5.1.0(vite@5.3.0(@types/node@20.14.2)(sass@1.69.4)(terser@5.27.0)) which: 3.0.1 ws: 8.17.0 transitivePeerDependencies: @@ -8781,17 +8900,17 @@ snapshots: string-width: 4.2.3 webpack: 5.92.0 - '@nuxt/scripts@0.4.7(@nuxt/devtools@1.3.3(@unocss/reset@0.60.4)(floating-vue@5.2.2(@nuxt/kit@packages+kit)(vue@3.4.27(typescript@5.4.5)))(nuxt@packages+nuxt)(rollup@4.18.0)(unocss@0.60.4(@unocss/webpack@0.60.4(rollup@4.18.0)(webpack@5.92.0(esbuild@0.21.5)))(postcss@8.4.38)(rollup@4.18.0)(vite@5.2.13(@types/node@20.14.2)(sass@1.69.4)(terser@5.27.0)))(vite@5.2.13(@types/node@20.14.2)(sass@1.69.4)(terser@5.27.0))(vue@3.4.27(typescript@5.4.5)))(@unocss/webpack@0.60.4(rollup@4.18.0)(webpack@5.92.0(esbuild@0.21.5)))(@vue/compiler-core@3.4.27)(ioredis@5.3.2)(nuxt@packages+nuxt)(postcss@8.4.38)(rollup@4.18.0)(vite@5.2.13(@types/node@20.14.2)(sass@1.69.4)(terser@5.27.0))(vue@3.4.27(typescript@5.4.5))(webpack@5.92.0(esbuild@0.21.5))': + '@nuxt/scripts@0.5.1(@nuxt/devtools@1.3.3(@unocss/reset@0.61.0)(floating-vue@5.2.2(@nuxt/kit@packages+kit)(vue@3.4.27(typescript@5.4.5)))(nuxt@packages+nuxt)(rollup@4.18.0)(unocss@0.61.0(@unocss/webpack@0.60.4(rollup@4.18.0)(webpack@5.92.0(esbuild@0.21.5)))(postcss@8.4.38)(rollup@4.18.0)(vite@5.3.0(@types/node@20.14.2)(sass@1.69.4)(terser@5.27.0)))(vite@5.3.0(@types/node@20.14.2)(sass@1.69.4)(terser@5.27.0))(vue@3.4.27(typescript@5.4.5)))(@unocss/webpack@0.60.4(rollup@4.18.0)(webpack@5.92.0(esbuild@0.21.5)))(@vue/compiler-core@3.4.27)(ioredis@5.3.2)(nuxt@packages+nuxt)(postcss@8.4.38)(rollup@4.18.0)(vite@5.3.0(@types/node@20.14.2)(sass@1.69.4)(terser@5.27.0))(vue@3.4.27(typescript@5.4.5))(webpack@5.92.0(esbuild@0.21.5))': dependencies: - '@nuxt/devtools-kit': 1.3.3(nuxt@packages+nuxt)(vite@5.2.13(@types/node@20.14.2)(sass@1.69.4)(terser@5.27.0)) - '@nuxt/devtools-ui-kit': 1.3.3(@nuxt/devtools@1.3.3(@unocss/reset@0.60.4)(floating-vue@5.2.2(@nuxt/kit@packages+kit)(vue@3.4.27(typescript@5.4.5)))(nuxt@packages+nuxt)(rollup@4.18.0)(unocss@0.60.4(@unocss/webpack@0.60.4(rollup@4.18.0)(webpack@5.92.0(esbuild@0.21.5)))(postcss@8.4.38)(rollup@4.18.0)(vite@5.2.13(@types/node@20.14.2)(sass@1.69.4)(terser@5.27.0)))(vite@5.2.13(@types/node@20.14.2)(sass@1.69.4)(terser@5.27.0))(vue@3.4.27(typescript@5.4.5)))(@unocss/webpack@0.60.4(rollup@4.18.0)(webpack@5.92.0(esbuild@0.21.5)))(@vue/compiler-core@3.4.27)(nuxt@packages+nuxt)(postcss@8.4.38)(rollup@4.18.0)(vite@5.2.13(@types/node@20.14.2)(sass@1.69.4)(terser@5.27.0))(vue@3.4.27(typescript@5.4.5))(webpack@5.92.0(esbuild@0.21.5)) + '@nuxt/devtools-kit': 1.3.3(nuxt@packages+nuxt)(vite@5.3.0(@types/node@20.14.2)(sass@1.69.4)(terser@5.27.0)) + '@nuxt/devtools-ui-kit': 1.3.3(@nuxt/devtools@1.3.3(@unocss/reset@0.61.0)(floating-vue@5.2.2(@nuxt/kit@packages+kit)(vue@3.4.27(typescript@5.4.5)))(nuxt@packages+nuxt)(rollup@4.18.0)(unocss@0.61.0(@unocss/webpack@0.60.4(rollup@4.18.0)(webpack@5.92.0(esbuild@0.21.5)))(postcss@8.4.38)(rollup@4.18.0)(vite@5.3.0(@types/node@20.14.2)(sass@1.69.4)(terser@5.27.0)))(vite@5.3.0(@types/node@20.14.2)(sass@1.69.4)(terser@5.27.0))(vue@3.4.27(typescript@5.4.5)))(@unocss/webpack@0.60.4(rollup@4.18.0)(webpack@5.92.0(esbuild@0.21.5)))(@vue/compiler-core@3.4.27)(nuxt@packages+nuxt)(postcss@8.4.38)(rollup@4.18.0)(vite@5.3.0(@types/node@20.14.2)(sass@1.69.4)(terser@5.27.0))(vue@3.4.27(typescript@5.4.5))(webpack@5.92.0(esbuild@0.21.5)) '@nuxt/kit': link:packages/kit '@types/google.maps': 3.55.9 '@types/stripe-v3': 3.1.33 '@types/vimeo__player': 2.18.3 '@types/youtube': 0.0.50 - '@unhead/vue': 1.9.12(vue@3.4.27(typescript@5.4.5)) - '@vueuse/core': 10.10.0(vue@3.4.27(typescript@5.4.5)) + '@unhead/vue': 1.9.13(vue@3.4.27(typescript@5.4.5)) + '@vueuse/core': 10.10.1(vue@3.4.27(typescript@5.4.5)) consola: 3.2.3 defu: 6.1.4 estree-walker: 3.0.3 @@ -8803,7 +8922,7 @@ snapshots: pathe: 1.1.2 pkg-types: 1.1.1 semver: 7.6.2 - shiki: 1.6.3 + shiki: 1.6.4 sirv: 2.0.4 std-env: 3.7.0 third-party-capital: 1.0.30 @@ -8811,7 +8930,7 @@ snapshots: unimport: 3.7.2(rollup@4.18.0) unplugin: 1.10.1 unstorage: 1.10.2(ioredis@5.3.2) - valibot: 0.30.0 + valibot: 0.31.1 transitivePeerDependencies: - '@azure/app-configuration' - '@azure/cosmos' @@ -8869,11 +8988,11 @@ snapshots: rc9: 2.1.2 std-env: 3.7.0 - '@nuxt/test-utils@3.13.1(@testing-library/vue@8.1.0(@vue/compiler-sfc@3.4.27)(vue@3.4.27(typescript@5.4.5)))(@vue/test-utils@2.4.6)(h3@1.11.1)(happy-dom@14.12.0)(nitropack@2.9.6(encoding@0.1.13))(playwright-core@1.44.1)(vite@5.2.13(@types/node@20.14.2)(sass@1.69.4)(terser@5.27.0))(vitest@1.6.0(@types/node@20.14.2)(happy-dom@14.12.0)(sass@1.69.4)(terser@5.27.0))(vue-router@4.3.3(vue@3.4.27(typescript@5.4.5)))(vue@3.4.27(typescript@5.4.5))': + '@nuxt/test-utils@3.13.1(@testing-library/vue@8.1.0(@vue/compiler-sfc@3.4.27)(vue@3.4.27(typescript@5.4.5)))(@vue/test-utils@2.4.6)(h3@1.11.1)(happy-dom@14.12.0)(magicast@0.3.4)(nitropack@2.9.6(encoding@0.1.13)(magicast@0.3.4))(playwright-core@1.44.1)(vite@5.3.0(@types/node@20.14.2)(sass@1.69.4)(terser@5.27.0))(vitest@1.6.0(@types/node@20.14.2)(happy-dom@14.12.0)(sass@1.69.4)(terser@5.27.0))(vue-router@4.3.3(vue@3.4.27(typescript@5.4.5)))(vue@3.4.27(typescript@5.4.5))': dependencies: '@nuxt/kit': link:packages/kit '@nuxt/schema': link:packages/schema - c12: 1.10.0 + c12: 1.11.1(magicast@0.3.4) consola: 3.2.3 defu: 6.1.4 destr: 2.0.3 @@ -8884,7 +9003,7 @@ snapshots: h3: 1.11.1 local-pkg: 0.5.0 magic-string: 0.30.10 - nitropack: 2.9.6(encoding@0.1.13) + nitropack: 2.9.6(encoding@0.1.13)(magicast@0.3.4) node-fetch-native: 1.6.4 ofetch: 1.3.4 pathe: 1.1.2 @@ -8895,8 +9014,8 @@ snapshots: ufo: 1.5.3 unenv: 1.9.0 unplugin: 1.10.1 - vite: 5.2.13(@types/node@20.14.2)(sass@1.69.4)(terser@5.27.0) - vitest-environment-nuxt: 1.0.0(@testing-library/vue@8.1.0(@vue/compiler-sfc@3.4.27)(vue@3.4.27(typescript@5.4.5)))(@vue/test-utils@2.4.6)(h3@1.11.1)(happy-dom@14.12.0)(nitropack@2.9.6(encoding@0.1.13))(playwright-core@1.44.1)(vite@5.2.13(@types/node@20.14.2)(sass@1.69.4)(terser@5.27.0))(vitest@1.6.0(@types/node@20.14.2)(happy-dom@14.12.0)(sass@1.69.4)(terser@5.27.0))(vue-router@4.3.3(vue@3.4.27(typescript@5.4.5)))(vue@3.4.27(typescript@5.4.5)) + vite: 5.3.0(@types/node@20.14.2)(sass@1.69.4)(terser@5.27.0) + vitest-environment-nuxt: 1.0.0(@testing-library/vue@8.1.0(@vue/compiler-sfc@3.4.27)(vue@3.4.27(typescript@5.4.5)))(@vue/test-utils@2.4.6)(h3@1.11.1)(happy-dom@14.12.0)(magicast@0.3.4)(nitropack@2.9.6(encoding@0.1.13)(magicast@0.3.4))(playwright-core@1.44.1)(vite@5.3.0(@types/node@20.14.2)(sass@1.69.4)(terser@5.27.0))(vitest@1.6.0(@types/node@20.14.2)(happy-dom@14.12.0)(sass@1.69.4)(terser@5.27.0))(vue-router@4.3.3(vue@3.4.27(typescript@5.4.5)))(vue@3.4.27(typescript@5.4.5)) vue: 3.4.27(typescript@5.4.5) vue-router: 4.3.3(vue@3.4.27(typescript@5.4.5)) optionalDependencies: @@ -8905,6 +9024,8 @@ snapshots: happy-dom: 14.12.0 playwright-core: 1.44.1 vitest: 1.6.0(@types/node@20.14.2)(happy-dom@14.12.0)(sass@1.69.4)(terser@5.27.0) + transitivePeerDependencies: + - magicast '@nuxtjs/color-mode@3.4.1': dependencies: @@ -8944,7 +9065,7 @@ snapshots: remark-parse: 11.0.0 remark-rehype: 11.1.0 scule: 1.3.0 - shiki: 1.6.3 + shiki: 1.6.4 ufo: 1.5.3 unified: 11.0.4 unist-builder: 4.0.0 @@ -9156,7 +9277,7 @@ snapshots: '@shikijs/core@1.3.0': {} - '@shikijs/core@1.6.3': {} + '@shikijs/core@1.6.4': {} '@shikijs/transformers@1.1.2': dependencies: @@ -9465,10 +9586,6 @@ snapshots: '@types/source-list-map': 0.1.4 source-map: 0.7.4 - '@types/webpack-virtual-modules@0.4.2': - dependencies: - webpack-virtual-modules: 0.6.2 - '@types/webpack@4.41.34': dependencies: '@types/node': 20.14.2 @@ -9575,40 +9692,50 @@ snapshots: '@ungap/structured-clone@1.2.0': {} - '@unhead/dom@1.9.12': + '@unhead/dom@1.9.13': dependencies: - '@unhead/schema': 1.9.12 - '@unhead/shared': 1.9.12 + '@unhead/schema': 1.9.13 + '@unhead/shared': 1.9.13 - '@unhead/schema@1.9.12': + '@unhead/schema@1.9.13': dependencies: hookable: 5.5.3 zhead: 2.2.4 - '@unhead/shared@1.9.12': + '@unhead/shared@1.9.13': dependencies: - '@unhead/schema': 1.9.12 + '@unhead/schema': 1.9.13 - '@unhead/ssr@1.9.12': + '@unhead/ssr@1.9.13': dependencies: - '@unhead/schema': 1.9.12 - '@unhead/shared': 1.9.12 + '@unhead/schema': 1.9.13 + '@unhead/shared': 1.9.13 - '@unhead/vue@1.9.12(vue@3.4.27(typescript@5.4.5))': + '@unhead/vue@1.9.13(vue@3.4.27(typescript@5.4.5))': dependencies: - '@unhead/schema': 1.9.12 - '@unhead/shared': 1.9.12 + '@unhead/schema': 1.9.13 + '@unhead/shared': 1.9.13 hookable: 5.5.3 - unhead: 1.9.12 + unhead: 1.9.13 vue: 3.4.27(typescript@5.4.5) - '@unocss/astro@0.60.4(rollup@4.18.0)(vite@5.2.13(@types/node@20.14.2)(sass@1.69.4)(terser@5.27.0))': + '@unocss/astro@0.60.4(rollup@4.18.0)(vite@5.3.0(@types/node@20.14.2)(sass@1.69.4)(terser@5.27.0))': dependencies: '@unocss/core': 0.60.4 '@unocss/reset': 0.60.4 - '@unocss/vite': 0.60.4(rollup@4.18.0)(vite@5.2.13(@types/node@20.14.2)(sass@1.69.4)(terser@5.27.0)) + '@unocss/vite': 0.60.4(rollup@4.18.0)(vite@5.3.0(@types/node@20.14.2)(sass@1.69.4)(terser@5.27.0)) optionalDependencies: - vite: 5.2.13(@types/node@20.14.2)(sass@1.69.4)(terser@5.27.0) + vite: 5.3.0(@types/node@20.14.2)(sass@1.69.4)(terser@5.27.0) + transitivePeerDependencies: + - rollup + + '@unocss/astro@0.61.0(rollup@4.18.0)(vite@5.3.0(@types/node@20.14.2)(sass@1.69.4)(terser@5.27.0))': + dependencies: + '@unocss/core': 0.61.0 + '@unocss/reset': 0.61.0 + '@unocss/vite': 0.61.0(rollup@4.18.0)(vite@5.3.0(@types/node@20.14.2)(sass@1.69.4)(terser@5.27.0)) + optionalDependencies: + vite: 5.3.0(@types/node@20.14.2)(sass@1.69.4)(terser@5.27.0) transitivePeerDependencies: - rollup @@ -9630,17 +9757,46 @@ snapshots: transitivePeerDependencies: - rollup + '@unocss/cli@0.61.0(rollup@4.18.0)': + dependencies: + '@ampproject/remapping': 2.3.0 + '@rollup/pluginutils': 5.1.0(rollup@4.18.0) + '@unocss/config': 0.61.0 + '@unocss/core': 0.61.0 + '@unocss/preset-uno': 0.61.0 + cac: 6.7.14 + chokidar: 3.6.0 + colorette: 2.0.20 + consola: 3.2.3 + fast-glob: 3.3.2 + magic-string: 0.30.10 + pathe: 1.1.2 + perfect-debounce: 1.0.0 + transitivePeerDependencies: + - rollup + '@unocss/config@0.60.4': dependencies: '@unocss/core': 0.60.4 unconfig: 0.3.13 + '@unocss/config@0.61.0': + dependencies: + '@unocss/core': 0.61.0 + unconfig: 0.3.13 + '@unocss/core@0.60.4': {} + '@unocss/core@0.61.0': {} + '@unocss/extractor-arbitrary-variants@0.60.4': dependencies: '@unocss/core': 0.60.4 + '@unocss/extractor-arbitrary-variants@0.61.0': + dependencies: + '@unocss/core': 0.61.0 + '@unocss/inspector@0.60.4': dependencies: '@unocss/core': 0.60.4 @@ -9648,7 +9804,14 @@ snapshots: gzip-size: 6.0.0 sirv: 2.0.4 - '@unocss/nuxt@0.60.4(postcss@8.4.38)(rollup@4.18.0)(vite@5.2.13(@types/node@20.14.2)(sass@1.69.4)(terser@5.27.0))(webpack@5.92.0(esbuild@0.21.5))': + '@unocss/inspector@0.61.0': + dependencies: + '@unocss/core': 0.61.0 + '@unocss/rule-utils': 0.61.0 + gzip-size: 6.0.0 + sirv: 2.0.4 + + '@unocss/nuxt@0.60.4(postcss@8.4.38)(rollup@4.18.0)(vite@5.3.0(@types/node@20.14.2)(sass@1.69.4)(terser@5.27.0))(webpack@5.92.0(esbuild@0.21.5))': dependencies: '@nuxt/kit': link:packages/kit '@unocss/config': 0.60.4 @@ -9661,9 +9824,9 @@ snapshots: '@unocss/preset-web-fonts': 0.60.4 '@unocss/preset-wind': 0.60.4 '@unocss/reset': 0.60.4 - '@unocss/vite': 0.60.4(rollup@4.18.0)(vite@5.2.13(@types/node@20.14.2)(sass@1.69.4)(terser@5.27.0)) + '@unocss/vite': 0.60.4(rollup@4.18.0)(vite@5.3.0(@types/node@20.14.2)(sass@1.69.4)(terser@5.27.0)) '@unocss/webpack': 0.60.4(rollup@4.18.0)(webpack@5.92.0(esbuild@0.21.5)) - unocss: 0.60.4(@unocss/webpack@0.60.4(rollup@4.18.0))(postcss@8.4.38)(rollup@4.18.0)(vite@5.2.13(@types/node@20.14.2)(sass@1.69.4)(terser@5.27.0)) + unocss: 0.60.4(@unocss/webpack@0.60.4(rollup@4.18.0)(webpack@5.92.0(esbuild@0.21.5)))(postcss@8.4.38)(rollup@4.18.0)(vite@5.3.0(@types/node@20.14.2)(sass@1.69.4)(terser@5.27.0)) transitivePeerDependencies: - postcss - rollup @@ -9681,10 +9844,24 @@ snapshots: magic-string: 0.30.10 postcss: 8.4.38 + '@unocss/postcss@0.61.0(postcss@8.4.38)': + dependencies: + '@unocss/config': 0.61.0 + '@unocss/core': 0.61.0 + '@unocss/rule-utils': 0.61.0 + css-tree: 2.3.1 + fast-glob: 3.3.2 + magic-string: 0.30.10 + postcss: 8.4.38 + '@unocss/preset-attributify@0.60.4': dependencies: '@unocss/core': 0.60.4 + '@unocss/preset-attributify@0.61.0': + dependencies: + '@unocss/core': 0.61.0 + '@unocss/preset-icons@0.60.4': dependencies: '@iconify/utils': 2.1.24 @@ -9693,21 +9870,44 @@ snapshots: transitivePeerDependencies: - supports-color + '@unocss/preset-icons@0.61.0': + dependencies: + '@iconify/utils': 2.1.24 + '@unocss/core': 0.61.0 + ofetch: 1.3.4 + transitivePeerDependencies: + - supports-color + '@unocss/preset-mini@0.60.4': dependencies: '@unocss/core': 0.60.4 '@unocss/extractor-arbitrary-variants': 0.60.4 '@unocss/rule-utils': 0.60.4 + '@unocss/preset-mini@0.61.0': + dependencies: + '@unocss/core': 0.61.0 + '@unocss/extractor-arbitrary-variants': 0.61.0 + '@unocss/rule-utils': 0.61.0 + '@unocss/preset-tagify@0.60.4': dependencies: '@unocss/core': 0.60.4 + '@unocss/preset-tagify@0.61.0': + dependencies: + '@unocss/core': 0.61.0 + '@unocss/preset-typography@0.60.4': dependencies: '@unocss/core': 0.60.4 '@unocss/preset-mini': 0.60.4 + '@unocss/preset-typography@0.61.0': + dependencies: + '@unocss/core': 0.61.0 + '@unocss/preset-mini': 0.61.0 + '@unocss/preset-uno@0.60.4': dependencies: '@unocss/core': 0.60.4 @@ -9715,26 +9915,53 @@ snapshots: '@unocss/preset-wind': 0.60.4 '@unocss/rule-utils': 0.60.4 + '@unocss/preset-uno@0.61.0': + dependencies: + '@unocss/core': 0.61.0 + '@unocss/preset-mini': 0.61.0 + '@unocss/preset-wind': 0.61.0 + '@unocss/rule-utils': 0.61.0 + '@unocss/preset-web-fonts@0.60.4': dependencies: '@unocss/core': 0.60.4 ofetch: 1.3.4 + '@unocss/preset-web-fonts@0.61.0': + dependencies: + '@unocss/core': 0.61.0 + ofetch: 1.3.4 + '@unocss/preset-wind@0.60.4': dependencies: '@unocss/core': 0.60.4 '@unocss/preset-mini': 0.60.4 '@unocss/rule-utils': 0.60.4 + '@unocss/preset-wind@0.61.0': + dependencies: + '@unocss/core': 0.61.0 + '@unocss/preset-mini': 0.61.0 + '@unocss/rule-utils': 0.61.0 + '@unocss/reset@0.60.4': {} + '@unocss/reset@0.61.0': {} + '@unocss/rule-utils@0.60.4': dependencies: '@unocss/core': 0.60.4 magic-string: 0.30.10 + '@unocss/rule-utils@0.61.0': + dependencies: + '@unocss/core': 0.61.0 + magic-string: 0.30.10 + '@unocss/scope@0.60.4': {} + '@unocss/scope@0.61.0': {} + '@unocss/transformer-attributify-jsx-babel@0.60.4': dependencies: '@babel/core': 7.24.7 @@ -9744,25 +9971,52 @@ snapshots: transitivePeerDependencies: - supports-color + '@unocss/transformer-attributify-jsx-babel@0.61.0': + dependencies: + '@babel/core': 7.24.7 + '@babel/plugin-syntax-jsx': 7.24.7(@babel/core@7.24.7) + '@babel/preset-typescript': 7.24.7(@babel/core@7.24.7) + '@unocss/core': 0.61.0 + transitivePeerDependencies: + - supports-color + '@unocss/transformer-attributify-jsx@0.60.4': dependencies: '@unocss/core': 0.60.4 + '@unocss/transformer-attributify-jsx@0.61.0': + dependencies: + '@unocss/core': 0.61.0 + '@unocss/transformer-compile-class@0.60.4': dependencies: '@unocss/core': 0.60.4 + '@unocss/transformer-compile-class@0.61.0': + dependencies: + '@unocss/core': 0.61.0 + '@unocss/transformer-directives@0.60.4': dependencies: '@unocss/core': 0.60.4 '@unocss/rule-utils': 0.60.4 css-tree: 2.3.1 + '@unocss/transformer-directives@0.61.0': + dependencies: + '@unocss/core': 0.61.0 + '@unocss/rule-utils': 0.61.0 + css-tree: 2.3.1 + '@unocss/transformer-variant-group@0.60.4': dependencies: '@unocss/core': 0.60.4 - '@unocss/vite@0.60.4(rollup@4.18.0)(vite@5.2.13(@types/node@20.14.2)(sass@1.69.4)(terser@5.27.0))': + '@unocss/transformer-variant-group@0.61.0': + dependencies: + '@unocss/core': 0.61.0 + + '@unocss/vite@0.60.4(rollup@4.18.0)(vite@5.3.0(@types/node@20.14.2)(sass@1.69.4)(terser@5.27.0))': dependencies: '@ampproject/remapping': 2.3.0 '@rollup/pluginutils': 5.1.0(rollup@4.18.0) @@ -9774,7 +10028,23 @@ snapshots: chokidar: 3.6.0 fast-glob: 3.3.2 magic-string: 0.30.10 - vite: 5.2.13(@types/node@20.14.2)(sass@1.69.4)(terser@5.27.0) + vite: 5.3.0(@types/node@20.14.2)(sass@1.69.4)(terser@5.27.0) + transitivePeerDependencies: + - rollup + + '@unocss/vite@0.61.0(rollup@4.18.0)(vite@5.3.0(@types/node@20.14.2)(sass@1.69.4)(terser@5.27.0))': + dependencies: + '@ampproject/remapping': 2.3.0 + '@rollup/pluginutils': 5.1.0(rollup@4.18.0) + '@unocss/config': 0.61.0 + '@unocss/core': 0.61.0 + '@unocss/inspector': 0.61.0 + '@unocss/scope': 0.61.0 + '@unocss/transformer-directives': 0.61.0 + chokidar: 3.6.0 + fast-glob: 3.3.2 + magic-string: 0.30.10 + vite: 5.3.0(@types/node@20.14.2)(sass@1.69.4)(terser@5.27.0) transitivePeerDependencies: - rollup @@ -9811,19 +10081,19 @@ snapshots: - encoding - supports-color - '@vitejs/plugin-vue-jsx@4.0.0(vite@5.2.13(@types/node@20.14.2)(sass@1.69.4)(terser@5.27.0))(vue@3.4.27(typescript@5.4.5))': + '@vitejs/plugin-vue-jsx@4.0.0(vite@5.3.0(@types/node@20.14.2)(sass@1.69.4)(terser@5.27.0))(vue@3.4.27(typescript@5.4.5))': dependencies: '@babel/core': 7.24.7 '@babel/plugin-transform-typescript': 7.24.7(@babel/core@7.24.7) '@vue/babel-plugin-jsx': 1.2.2(@babel/core@7.24.7) - vite: 5.2.13(@types/node@20.14.2)(sass@1.69.4)(terser@5.27.0) + vite: 5.3.0(@types/node@20.14.2)(sass@1.69.4)(terser@5.27.0) vue: 3.4.27(typescript@5.4.5) transitivePeerDependencies: - supports-color - '@vitejs/plugin-vue@5.0.4(vite@5.2.13(@types/node@20.14.2)(sass@1.69.4)(terser@5.27.0))(vue@3.4.27(typescript@5.4.5))': + '@vitejs/plugin-vue@5.0.4(vite@5.3.0(@types/node@20.14.2)(sass@1.69.4)(terser@5.27.0))(vue@3.4.27(typescript@5.4.5))': dependencies: - vite: 5.2.13(@types/node@20.14.2)(sass@1.69.4)(terser@5.27.0) + vite: 5.3.0(@types/node@20.14.2)(sass@1.69.4)(terser@5.27.0) vue: 3.4.27(typescript@5.4.5) '@vitest/coverage-v8@1.6.0(vitest@1.6.0(@types/node@20.14.2)(happy-dom@14.12.0)(sass@1.69.4)(terser@5.27.0))': @@ -9970,12 +10240,12 @@ snapshots: '@vue/devtools-api@6.6.3': {} - '@vue/devtools-applet@7.1.3(@unocss/reset@0.60.4)(floating-vue@5.2.2(@nuxt/kit@packages+kit)(vue@3.4.27(typescript@5.4.5)))(unocss@0.60.4(@unocss/webpack@0.60.4(rollup@4.18.0)(webpack@5.92.0(esbuild@0.21.5)))(postcss@8.4.38)(rollup@4.18.0)(vite@5.2.13(@types/node@20.14.2)(sass@1.69.4)(terser@5.27.0)))(vite@5.2.13(@types/node@20.14.2)(sass@1.69.4)(terser@5.27.0))(vue@3.4.27(typescript@5.4.5))': + '@vue/devtools-applet@7.1.3(@unocss/reset@0.61.0)(floating-vue@5.2.2(@nuxt/kit@packages+kit)(vue@3.4.27(typescript@5.4.5)))(unocss@0.61.0(@unocss/webpack@0.60.4(rollup@4.18.0)(webpack@5.92.0(esbuild@0.21.5)))(postcss@8.4.38)(rollup@4.18.0)(vite@5.3.0(@types/node@20.14.2)(sass@1.69.4)(terser@5.27.0)))(vite@5.3.0(@types/node@20.14.2)(sass@1.69.4)(terser@5.27.0))(vue@3.4.27(typescript@5.4.5))': dependencies: - '@vue/devtools-core': 7.1.3(vite@5.2.13(@types/node@20.14.2)(sass@1.69.4)(terser@5.27.0))(vue@3.4.27(typescript@5.4.5)) + '@vue/devtools-core': 7.1.3(vite@5.3.0(@types/node@20.14.2)(sass@1.69.4)(terser@5.27.0))(vue@3.4.27(typescript@5.4.5)) '@vue/devtools-kit': 7.1.3(vue@3.4.27(typescript@5.4.5)) '@vue/devtools-shared': 7.1.3 - '@vue/devtools-ui': 7.1.3(@unocss/reset@0.60.4)(floating-vue@5.2.2(@nuxt/kit@packages+kit)(vue@3.4.27(typescript@5.4.5)))(unocss@0.60.4(@unocss/webpack@0.60.4(rollup@4.18.0)(webpack@5.92.0(esbuild@0.21.5)))(postcss@8.4.38)(rollup@4.18.0)(vite@5.2.13(@types/node@20.14.2)(sass@1.69.4)(terser@5.27.0)))(vue@3.4.27(typescript@5.4.5)) + '@vue/devtools-ui': 7.1.3(@unocss/reset@0.61.0)(floating-vue@5.2.2(@nuxt/kit@packages+kit)(vue@3.4.27(typescript@5.4.5)))(unocss@0.61.0(@unocss/webpack@0.60.4(rollup@4.18.0)(webpack@5.92.0(esbuild@0.21.5)))(postcss@8.4.38)(rollup@4.18.0)(vite@5.3.0(@types/node@20.14.2)(sass@1.69.4)(terser@5.27.0)))(vue@3.4.27(typescript@5.4.5)) lodash-es: 4.17.21 perfect-debounce: 1.0.0 shiki: 1.3.0 @@ -10000,14 +10270,14 @@ snapshots: - unocss - vite - '@vue/devtools-core@7.1.3(vite@5.2.13(@types/node@20.14.2)(sass@1.69.4)(terser@5.27.0))(vue@3.4.27(typescript@5.4.5))': + '@vue/devtools-core@7.1.3(vite@5.3.0(@types/node@20.14.2)(sass@1.69.4)(terser@5.27.0))(vue@3.4.27(typescript@5.4.5))': dependencies: '@vue/devtools-kit': 7.1.3(vue@3.4.27(typescript@5.4.5)) '@vue/devtools-shared': 7.1.3 mitt: 3.0.1 nanoid: 3.3.7 pathe: 1.1.2 - vite-hot-client: 0.2.3(vite@5.2.13(@types/node@20.14.2)(sass@1.69.4)(terser@5.27.0)) + vite-hot-client: 0.2.3(vite@5.3.0(@types/node@20.14.2)(sass@1.69.4)(terser@5.27.0)) transitivePeerDependencies: - vite - vue @@ -10025,9 +10295,9 @@ snapshots: dependencies: rfdc: 1.3.1 - '@vue/devtools-ui@7.1.3(@unocss/reset@0.60.4)(floating-vue@5.2.2(@nuxt/kit@packages+kit)(vue@3.4.27(typescript@5.4.5)))(unocss@0.60.4(@unocss/webpack@0.60.4(rollup@4.18.0)(webpack@5.92.0(esbuild@0.21.5)))(postcss@8.4.38)(rollup@4.18.0)(vite@5.2.13(@types/node@20.14.2)(sass@1.69.4)(terser@5.27.0)))(vue@3.4.27(typescript@5.4.5))': + '@vue/devtools-ui@7.1.3(@unocss/reset@0.61.0)(floating-vue@5.2.2(@nuxt/kit@packages+kit)(vue@3.4.27(typescript@5.4.5)))(unocss@0.61.0(@unocss/webpack@0.60.4(rollup@4.18.0)(webpack@5.92.0(esbuild@0.21.5)))(postcss@8.4.38)(rollup@4.18.0)(vite@5.3.0(@types/node@20.14.2)(sass@1.69.4)(terser@5.27.0)))(vue@3.4.27(typescript@5.4.5))': dependencies: - '@unocss/reset': 0.60.4 + '@unocss/reset': 0.61.0 '@vue/devtools-shared': 7.1.3 '@vueuse/components': 10.9.0(vue@3.4.27(typescript@5.4.5)) '@vueuse/core': 10.10.0(vue@3.4.27(typescript@5.4.5)) @@ -10035,7 +10305,7 @@ snapshots: colord: 2.9.3 floating-vue: 5.2.2(@nuxt/kit@packages+kit)(vue@3.4.27(typescript@5.4.5)) focus-trap: 7.5.4 - unocss: 0.60.4(@unocss/webpack@0.60.4(rollup@4.18.0))(postcss@8.4.38)(rollup@4.18.0)(vite@5.2.13(@types/node@20.14.2)(sass@1.69.4)(terser@5.27.0)) + unocss: 0.61.0(@unocss/webpack@0.60.4(rollup@4.18.0)(webpack@5.92.0(esbuild@0.21.5)))(postcss@8.4.38)(rollup@4.18.0)(vite@5.3.0(@types/node@20.14.2)(sass@1.69.4)(terser@5.27.0)) vue: 3.4.27(typescript@5.4.5) transitivePeerDependencies: - '@vue/composition-api' @@ -10124,6 +10394,16 @@ snapshots: - '@vue/composition-api' - vue + '@vueuse/core@10.10.1(vue@3.4.27(typescript@5.4.5))': + dependencies: + '@types/web-bluetooth': 0.0.20 + '@vueuse/metadata': 10.10.1 + '@vueuse/shared': 10.10.1(vue@3.4.27(typescript@5.4.5)) + vue-demi: 0.14.8(vue@3.4.27(typescript@5.4.5)) + transitivePeerDependencies: + - '@vue/composition-api' + - vue + '@vueuse/core@10.9.0(vue@3.4.27(typescript@5.4.5))': dependencies: '@types/web-bluetooth': 0.0.20 @@ -10147,6 +10427,8 @@ snapshots: '@vueuse/metadata@10.10.0': {} + '@vueuse/metadata@10.10.1': {} + '@vueuse/metadata@10.9.0': {} '@vueuse/nuxt@10.10.0(nuxt@packages+nuxt)(vue@3.4.27(typescript@5.4.5))': @@ -10168,6 +10450,13 @@ snapshots: - '@vue/composition-api' - vue + '@vueuse/shared@10.10.1(vue@3.4.27(typescript@5.4.5))': + dependencies: + vue-demi: 0.14.8(vue@3.4.27(typescript@5.4.5)) + transitivePeerDependencies: + - '@vue/composition-api' + - vue + '@vueuse/shared@10.9.0(vue@3.4.27(typescript@5.4.5))': dependencies: vue-demi: 0.14.7(vue@3.4.27(typescript@5.4.5)) @@ -10514,13 +10803,13 @@ snapshots: dependencies: run-applescript: 7.0.0 - c12@1.10.0: + c12@1.11.1(magicast@0.3.4): dependencies: chokidar: 3.6.0 confbox: 0.1.7 defu: 6.1.4 dotenv: 16.4.5 - giget: 1.2.1 + giget: 1.2.3 jiti: 1.21.6 mlly: 1.7.1 ohash: 1.1.3 @@ -10528,6 +10817,8 @@ snapshots: perfect-debounce: 1.0.0 pkg-types: 1.1.1 rc9: 2.1.2 + optionalDependencies: + magicast: 0.3.4 cac@6.7.14: {} @@ -10599,9 +10890,9 @@ snapshots: chalk@5.3.0: {} - changelogen@0.5.5: + changelogen@0.5.5(magicast@0.3.4): dependencies: - c12: 1.10.0 + c12: 1.11.1(magicast@0.3.4) colorette: 2.0.20 consola: 3.2.3 convert-gitmoji: 0.1.3 @@ -10616,6 +10907,8 @@ snapshots: semver: 7.6.2 std-env: 3.7.0 yaml: 2.3.4 + transitivePeerDependencies: + - magicast char-regex@1.0.2: {} @@ -10719,7 +11012,7 @@ snapshots: commondir@1.0.1: {} - compatx@0.1.3: {} + compatx@0.1.8: {} compress-commons@6.0.2: dependencies: @@ -11324,7 +11617,7 @@ snapshots: eslint-plugin-no-only-tests@3.1.0: {} - eslint-plugin-perfectionist@2.10.0(eslint@9.4.0)(typescript@5.4.5)(vue-eslint-parser@9.4.2(eslint@9.4.0)): + eslint-plugin-perfectionist@2.11.0(eslint@9.4.0)(typescript@5.4.5)(vue-eslint-parser@9.4.2(eslint@9.4.0)): dependencies: '@typescript-eslint/utils': 7.9.0(eslint@9.4.0)(typescript@5.4.5) eslint: 9.4.0 @@ -11735,7 +12028,7 @@ snapshots: dependencies: resolve-pkg-maps: 1.0.0 - giget@1.2.1: + giget@1.2.3: dependencies: citty: 0.1.6 consola: 3.2.3 @@ -13079,7 +13372,7 @@ snapshots: neo-async@2.6.2: {} - nitropack@2.9.6(encoding@0.1.13): + nitropack@2.9.6(encoding@0.1.13)(magicast@0.3.4): dependencies: '@cloudflare/kv-asset-handler': 0.3.1 '@netlify/functions': 2.6.0 @@ -13094,7 +13387,7 @@ snapshots: '@types/http-proxy': 1.17.14 '@vercel/nft': 0.26.4(encoding@0.1.13) archiver: 7.0.1 - c12: 1.10.0 + c12: 1.11.1(magicast@0.3.4) chalk: 5.3.0 chokidar: 3.6.0 citty: 0.1.6 @@ -13165,6 +13458,7 @@ snapshots: - drizzle-orm - encoding - idb-keyval + - magicast - supports-color - uWebSockets.js @@ -14328,9 +14622,9 @@ snapshots: dependencies: '@shikijs/core': 1.3.0 - shiki@1.6.3: + shiki@1.6.4: dependencies: - '@shikijs/core': 1.6.3 + '@shikijs/core': 1.6.4 side-channel@1.0.4: dependencies: @@ -14766,11 +15060,11 @@ snapshots: node-fetch-native: 1.6.4 pathe: 1.1.2 - unhead@1.9.12: + unhead@1.9.13: dependencies: - '@unhead/dom': 1.9.12 - '@unhead/schema': 1.9.12 - '@unhead/shared': 1.9.12 + '@unhead/dom': 1.9.13 + '@unhead/schema': 1.9.13 + '@unhead/shared': 1.9.13 hookable: 5.5.3 unicode-emoji-modifier-base@1.0.0: {} @@ -14842,9 +15136,9 @@ snapshots: universalify@2.0.0: {} - unocss@0.60.4(@unocss/webpack@0.60.4(rollup@4.18.0))(postcss@8.4.38)(rollup@4.18.0)(vite@5.2.13(@types/node@20.14.2)(sass@1.69.4)(terser@5.27.0)): + unocss@0.60.4(@unocss/webpack@0.60.4(rollup@4.18.0)(webpack@5.92.0(esbuild@0.21.5)))(postcss@8.4.38)(rollup@4.18.0)(vite@5.3.0(@types/node@20.14.2)(sass@1.69.4)(terser@5.27.0)): dependencies: - '@unocss/astro': 0.60.4(rollup@4.18.0)(vite@5.2.13(@types/node@20.14.2)(sass@1.69.4)(terser@5.27.0)) + '@unocss/astro': 0.60.4(rollup@4.18.0)(vite@5.3.0(@types/node@20.14.2)(sass@1.69.4)(terser@5.27.0)) '@unocss/cli': 0.60.4(rollup@4.18.0) '@unocss/core': 0.60.4 '@unocss/extractor-arbitrary-variants': 0.60.4 @@ -14863,10 +15157,40 @@ snapshots: '@unocss/transformer-compile-class': 0.60.4 '@unocss/transformer-directives': 0.60.4 '@unocss/transformer-variant-group': 0.60.4 - '@unocss/vite': 0.60.4(rollup@4.18.0)(vite@5.2.13(@types/node@20.14.2)(sass@1.69.4)(terser@5.27.0)) + '@unocss/vite': 0.60.4(rollup@4.18.0)(vite@5.3.0(@types/node@20.14.2)(sass@1.69.4)(terser@5.27.0)) optionalDependencies: '@unocss/webpack': 0.60.4(rollup@4.18.0)(webpack@5.92.0(esbuild@0.21.5)) - vite: 5.2.13(@types/node@20.14.2)(sass@1.69.4)(terser@5.27.0) + vite: 5.3.0(@types/node@20.14.2)(sass@1.69.4)(terser@5.27.0) + transitivePeerDependencies: + - postcss + - rollup + - supports-color + + unocss@0.61.0(@unocss/webpack@0.60.4(rollup@4.18.0)(webpack@5.92.0(esbuild@0.21.5)))(postcss@8.4.38)(rollup@4.18.0)(vite@5.3.0(@types/node@20.14.2)(sass@1.69.4)(terser@5.27.0)): + dependencies: + '@unocss/astro': 0.61.0(rollup@4.18.0)(vite@5.3.0(@types/node@20.14.2)(sass@1.69.4)(terser@5.27.0)) + '@unocss/cli': 0.61.0(rollup@4.18.0) + '@unocss/core': 0.61.0 + '@unocss/extractor-arbitrary-variants': 0.61.0 + '@unocss/postcss': 0.61.0(postcss@8.4.38) + '@unocss/preset-attributify': 0.61.0 + '@unocss/preset-icons': 0.61.0 + '@unocss/preset-mini': 0.61.0 + '@unocss/preset-tagify': 0.61.0 + '@unocss/preset-typography': 0.61.0 + '@unocss/preset-uno': 0.61.0 + '@unocss/preset-web-fonts': 0.61.0 + '@unocss/preset-wind': 0.61.0 + '@unocss/reset': 0.61.0 + '@unocss/transformer-attributify-jsx': 0.61.0 + '@unocss/transformer-attributify-jsx-babel': 0.61.0 + '@unocss/transformer-compile-class': 0.61.0 + '@unocss/transformer-directives': 0.61.0 + '@unocss/transformer-variant-group': 0.61.0 + '@unocss/vite': 0.61.0(rollup@4.18.0)(vite@5.3.0(@types/node@20.14.2)(sass@1.69.4)(terser@5.27.0)) + optionalDependencies: + '@unocss/webpack': 0.60.4(rollup@4.18.0)(webpack@5.92.0(esbuild@0.21.5)) + vite: 5.3.0(@types/node@20.14.2)(sass@1.69.4)(terser@5.27.0) transitivePeerDependencies: - postcss - rollup @@ -14977,7 +15301,7 @@ snapshots: dependencies: '@vue/compiler-core': 3.4.27 - valibot@0.30.0: {} + valibot@0.31.1: {} validate-npm-package-license@3.0.4: dependencies: @@ -15004,9 +15328,9 @@ snapshots: unist-util-stringify-position: 4.0.0 vfile-message: 4.0.2 - vite-hot-client@0.2.3(vite@5.2.13(@types/node@20.14.2)(sass@1.69.4)(terser@5.27.0)): + vite-hot-client@0.2.3(vite@5.3.0(@types/node@20.14.2)(sass@1.69.4)(terser@5.27.0)): dependencies: - vite: 5.2.13(@types/node@20.14.2)(sass@1.69.4)(terser@5.27.0) + vite: 5.3.0(@types/node@20.14.2)(sass@1.69.4)(terser@5.27.0) vite-node@1.6.0(@types/node@20.14.2)(sass@1.69.4)(terser@5.27.0): dependencies: @@ -15014,7 +15338,7 @@ snapshots: debug: 4.3.4 pathe: 1.1.2 picocolors: 1.0.0 - vite: 5.2.13(@types/node@20.14.2)(sass@1.69.4)(terser@5.27.0) + vite: 5.3.0(@types/node@20.14.2)(sass@1.69.4)(terser@5.27.0) transitivePeerDependencies: - '@types/node' - less @@ -15025,7 +15349,7 @@ snapshots: - supports-color - terser - vite-plugin-checker@0.6.4(eslint@9.4.0)(optionator@0.9.3)(typescript@5.4.5)(vite@5.2.13(@types/node@20.14.2)(sass@1.69.4)(terser@5.27.0))(vue-tsc@2.0.21(typescript@5.4.5)): + vite-plugin-checker@0.6.4(eslint@9.4.0)(optionator@0.9.3)(typescript@5.4.5)(vite@5.3.0(@types/node@20.14.2)(sass@1.69.4)(terser@5.27.0))(vue-tsc@2.0.21(typescript@5.4.5)): dependencies: '@babel/code-frame': 7.24.2 ansi-escapes: 4.3.2 @@ -15038,7 +15362,7 @@ snapshots: semver: 7.6.2 strip-ansi: 6.0.1 tiny-invariant: 1.3.1 - vite: 5.2.13(@types/node@20.14.2)(sass@1.69.4)(terser@5.27.0) + vite: 5.3.0(@types/node@20.14.2)(sass@1.69.4)(terser@5.27.0) vscode-languageclient: 7.0.0 vscode-languageserver: 7.0.0 vscode-languageserver-textdocument: 1.0.11 @@ -15049,7 +15373,7 @@ snapshots: typescript: 5.4.5 vue-tsc: 2.0.21(typescript@5.4.5) - vite-plugin-inspect@0.8.4(@nuxt/kit@packages+kit)(rollup@4.18.0)(vite@5.2.13(@types/node@20.14.2)(sass@1.69.4)(terser@5.27.0)): + vite-plugin-inspect@0.8.4(@nuxt/kit@packages+kit)(rollup@4.18.0)(vite@5.3.0(@types/node@20.14.2)(sass@1.69.4)(terser@5.27.0)): dependencies: '@antfu/utils': 0.7.8 '@rollup/pluginutils': 5.1.0(rollup@4.18.0) @@ -15060,14 +15384,14 @@ snapshots: perfect-debounce: 1.0.0 picocolors: 1.0.0 sirv: 2.0.4 - vite: 5.2.13(@types/node@20.14.2)(sass@1.69.4)(terser@5.27.0) + vite: 5.3.0(@types/node@20.14.2)(sass@1.69.4)(terser@5.27.0) optionalDependencies: '@nuxt/kit': link:packages/kit transitivePeerDependencies: - rollup - supports-color - vite-plugin-vue-inspector@5.1.0(vite@5.2.13(@types/node@20.14.2)(sass@1.69.4)(terser@5.27.0)): + vite-plugin-vue-inspector@5.1.0(vite@5.3.0(@types/node@20.14.2)(sass@1.69.4)(terser@5.27.0)): dependencies: '@babel/core': 7.24.7 '@babel/plugin-proposal-decorators': 7.23.2(@babel/core@7.24.7) @@ -15078,13 +15402,13 @@ snapshots: '@vue/compiler-dom': 3.4.27 kolorist: 1.8.0 magic-string: 0.30.10 - vite: 5.2.13(@types/node@20.14.2)(sass@1.69.4)(terser@5.27.0) + vite: 5.3.0(@types/node@20.14.2)(sass@1.69.4)(terser@5.27.0) transitivePeerDependencies: - supports-color - vite@5.2.13(@types/node@20.14.2)(sass@1.69.4)(terser@5.27.0): + vite@5.3.0(@types/node@20.14.2)(sass@1.69.4)(terser@5.27.0): dependencies: - esbuild: 0.20.2 + esbuild: 0.21.5 postcss: 8.4.38 rollup: 4.18.0 optionalDependencies: @@ -15093,9 +15417,9 @@ snapshots: sass: 1.69.4 terser: 5.27.0 - vitest-environment-nuxt@1.0.0(@testing-library/vue@8.1.0(@vue/compiler-sfc@3.4.27)(vue@3.4.27(typescript@5.4.5)))(@vue/test-utils@2.4.6)(h3@1.11.1)(happy-dom@14.12.0)(nitropack@2.9.6(encoding@0.1.13))(playwright-core@1.44.1)(vite@5.2.13(@types/node@20.14.2)(sass@1.69.4)(terser@5.27.0))(vitest@1.6.0(@types/node@20.14.2)(happy-dom@14.12.0)(sass@1.69.4)(terser@5.27.0))(vue-router@4.3.3(vue@3.4.27(typescript@5.4.5)))(vue@3.4.27(typescript@5.4.5)): + vitest-environment-nuxt@1.0.0(@testing-library/vue@8.1.0(@vue/compiler-sfc@3.4.27)(vue@3.4.27(typescript@5.4.5)))(@vue/test-utils@2.4.6)(h3@1.11.1)(happy-dom@14.12.0)(magicast@0.3.4)(nitropack@2.9.6(encoding@0.1.13)(magicast@0.3.4))(playwright-core@1.44.1)(vite@5.3.0(@types/node@20.14.2)(sass@1.69.4)(terser@5.27.0))(vitest@1.6.0(@types/node@20.14.2)(happy-dom@14.12.0)(sass@1.69.4)(terser@5.27.0))(vue-router@4.3.3(vue@3.4.27(typescript@5.4.5)))(vue@3.4.27(typescript@5.4.5)): dependencies: - '@nuxt/test-utils': 3.13.1(@testing-library/vue@8.1.0(@vue/compiler-sfc@3.4.27)(vue@3.4.27(typescript@5.4.5)))(@vue/test-utils@2.4.6)(h3@1.11.1)(happy-dom@14.12.0)(nitropack@2.9.6(encoding@0.1.13))(playwright-core@1.44.1)(vite@5.2.13(@types/node@20.14.2)(sass@1.69.4)(terser@5.27.0))(vitest@1.6.0(@types/node@20.14.2)(happy-dom@14.12.0)(sass@1.69.4)(terser@5.27.0))(vue-router@4.3.3(vue@3.4.27(typescript@5.4.5)))(vue@3.4.27(typescript@5.4.5)) + '@nuxt/test-utils': 3.13.1(@testing-library/vue@8.1.0(@vue/compiler-sfc@3.4.27)(vue@3.4.27(typescript@5.4.5)))(@vue/test-utils@2.4.6)(h3@1.11.1)(happy-dom@14.12.0)(magicast@0.3.4)(nitropack@2.9.6(encoding@0.1.13)(magicast@0.3.4))(playwright-core@1.44.1)(vite@5.3.0(@types/node@20.14.2)(sass@1.69.4)(terser@5.27.0))(vitest@1.6.0(@types/node@20.14.2)(happy-dom@14.12.0)(sass@1.69.4)(terser@5.27.0))(vue-router@4.3.3(vue@3.4.27(typescript@5.4.5)))(vue@3.4.27(typescript@5.4.5)) transitivePeerDependencies: - '@cucumber/cucumber' - '@jest/globals' @@ -15106,6 +15430,7 @@ snapshots: - h3 - happy-dom - jsdom + - magicast - nitropack - playwright-core - vite @@ -15132,7 +15457,7 @@ snapshots: strip-literal: 2.1.0 tinybench: 2.5.1 tinypool: 0.8.4 - vite: 5.2.13(@types/node@20.14.2)(sass@1.69.4)(terser@5.27.0) + vite: 5.3.0(@types/node@20.14.2)(sass@1.69.4)(terser@5.27.0) vite-node: 1.6.0(@types/node@20.14.2)(sass@1.69.4)(terser@5.27.0) why-is-node-running: 2.2.2 optionalDependencies: @@ -15182,6 +15507,10 @@ snapshots: dependencies: vue: 3.4.27(typescript@5.4.5) + vue-demi@0.14.8(vue@3.4.27(typescript@5.4.5)): + dependencies: + vue: 3.4.27(typescript@5.4.5) + vue-devtools-stub@0.1.0: {} vue-eslint-parser@9.4.2(eslint@9.4.0): diff --git a/scripts/update-changelog.ts b/scripts/update-changelog.ts index 65ccb9a2f1..9dab8a8b94 100644 --- a/scripts/update-changelog.ts +++ b/scripts/update-changelog.ts @@ -13,9 +13,9 @@ async function main () { const commits = await getLatestCommits().then(commits => commits.filter( c => config.types[c.type] && !(c.type === 'chore' && c.scope === 'deps' && !c.isBreaking), )) - const bumpType = await determineBumpType() + const bumpType = await determineBumpType() || 'patch' - const newVersion = inc(workspace.find('nuxt').data.version, bumpType || 'patch') + const newVersion = inc(workspace.find('nuxt').data.version, bumpType) const changelog = await generateMarkDown(commits, config) // Create and push a branch with bumped versions if it has not already been created @@ -44,7 +44,8 @@ async function main () { changelog .replace(/^## v.*\n/, '') .replace(`...${releaseBranch}`, `...v${newVersion}`) - .replace(/### ❤️ Contributors[\s\S]*$/, ''), + .replace(/### ❤️ Contributors[\s\S]*$/, '') + .replace(/[\n\r]+/g, '\n'), '### ❤️ Contributors', contributors.map(c => `- ${c.name} (@${c.username})`).join('\n'), ].join('\n') diff --git a/test/basic.test.ts b/test/basic.test.ts index 14b76bc235..e49e663b33 100644 --- a/test/basic.test.ts +++ b/test/basic.test.ts @@ -166,6 +166,21 @@ describe('pages', () => { expect(res.headers.get('x-extend')).toEqual('added in pages:extend') }) + it('preserves page metadata added in pages:extend hook', async () => { + const html = await $fetch('/some-custom-path') + expect (html.match(/
([^<]*)<\/pre>/)?.[1]?.trim().replace(/"/g, '"').replace(/>/g, '>')).toMatchInlineSnapshot(`
+      "{
+        "name": "some-custom-name",
+        "path": "/some-custom-path",
+        "validate": "() => true",
+        "middleware": [
+          "() => true"
+        ],
+        "otherValue": "{\\"foo\\":\\"bar\\"}"
+      }"
+    `)
+  })
+
   it('validates routes', async () => {
     const { status, headers } = await fetch('/forbidden')
     expect(status).toEqual(404)
@@ -745,6 +760,24 @@ describe('nuxt links', () => {
     `)
   })
 
+  it('respects external links in edge cases', async () => {
+    const html = await $fetch('/nuxt-link/custom-external')
+    const hrefs = html.match(/]*href="([^"]+)"/g)
+    expect(hrefs).toMatchInlineSnapshot(`
+      [
+        " c.text.includes('No match found for location'))
+    expect(warnings).toMatchInlineSnapshot(`[]`)
+    await page.close()
+  })
+
   it('preserves route state', async () => {
     const { page } = await renderPage('/nuxt-link/trailing-slash')
 
diff --git a/test/fixtures/basic/nuxt.config.ts b/test/fixtures/basic/nuxt.config.ts
index beda5b9fcb..b2a945eaf7 100644
--- a/test/fixtures/basic/nuxt.config.ts
+++ b/test/fixtures/basic/nuxt.config.ts
@@ -1,5 +1,6 @@
 import { addBuildPlugin, addComponent } from 'nuxt/kit'
 import type { NuxtPage } from 'nuxt/schema'
+import { defu } from 'defu'
 import { createUnplugin } from 'unplugin'
 import { withoutLeadingSlash } from 'ufo'
 
@@ -88,10 +89,17 @@ export default defineNuxtConfig({
   runtimeConfig: {
     public: {
       needsFallback: undefined,
-      testConfig: 123,
     },
   },
   modules: [
+    function (_options, nuxt) {
+      // ensure setting `runtimeConfig` also sets `nitro.runtimeConfig`
+      nuxt.options.runtimeConfig = defu(nuxt.options.runtimeConfig, {
+        public: {
+          testConfig: 123,
+        },
+      })
+    },
     function (_options, nuxt) {
       nuxt.hook('modules:done', () => {
         // @ts-expect-error not valid nuxt option
@@ -151,6 +159,17 @@ export default defineNuxtConfig({
         internalParent!.children = newPages
       })
     },
+    function (_options, nuxt) {
+      // to check that page metadata is preserved
+      nuxt.hook('pages:extend', (pages) => {
+        const customName = pages.find(page => page.name === 'some-custom-name')
+        if (!customName) { throw new Error('Page with custom name not found') }
+        if (customName.path !== '/some-custom-path') { throw new Error('Page path not extracted') }
+
+        customName.meta ||= {}
+        customName.meta.someProp = true
+      })
+    },
     // To test falsy module values
     undefined,
   ],
diff --git a/test/fixtures/basic/pages/meta.vue b/test/fixtures/basic/pages/meta.vue
new file mode 100644
index 0000000000..7983bde1ee
--- /dev/null
+++ b/test/fixtures/basic/pages/meta.vue
@@ -0,0 +1,36 @@
+
+
+
diff --git a/test/fixtures/basic/pages/nuxt-link/custom-external.vue b/test/fixtures/basic/pages/nuxt-link/custom-external.vue
new file mode 100644
index 0000000000..4dff81fb0d
--- /dev/null
+++ b/test/fixtures/basic/pages/nuxt-link/custom-external.vue
@@ -0,0 +1,53 @@
+
+
+
diff --git a/test/fixtures/basic/pages/tsx-page-meta.vue b/test/fixtures/basic/pages/tsx-page-meta.vue
new file mode 100644
index 0000000000..80a36dcaff
--- /dev/null
+++ b/test/fixtures/basic/pages/tsx-page-meta.vue
@@ -0,0 +1,9 @@
+
+
+
diff --git a/test/nuxt/composables.test.ts b/test/nuxt/composables.test.ts
index d4bf1eaaa4..e22488309b 100644
--- a/test/nuxt/composables.test.ts
+++ b/test/nuxt/composables.test.ts
@@ -53,6 +53,7 @@ describe('app config', () => {
 describe('composables', () => {
   it('are all tested', () => {
     const testedComposables: string[] = [
+      'useRouteAnnouncer',
       'clearNuxtData',
       'refreshNuxtData',
       'useAsyncData',