Skip to content

Conversation

@renovate
Copy link
Contributor

@renovate renovate bot commented Oct 29, 2025

This PR contains the following updates:

Package Change Age Confidence Type Update
@biomejs/biome (source) ^2.2.7 -> ^2.3.2 age confidence devDependencies minor
@nuxt/devtools (source) ^2.6.5 -> ^2.7.0 age confidence devDependencies minor
@nuxt/kit (source) ^4.1.3 -> ^4.2.0 age confidence dependencies minor
@nuxt/test-utils ^3.19.2 -> ^3.20.1 age confidence devDependencies minor
@types/node (source) ^22.18.12 -> ^22.18.13 age confidence devDependencies patch
node (source) 22.21.0 -> 22.21.1 age confidence engines patch
nuxt (source) ^4.1.3 -> ^4.2.0 age confidence devDependencies minor
pnpm (source) 10.19.0 -> 10.20.0 age confidence packageManager minor
pnpm (source) 10.19.0 -> 10.20.0 age confidence engines minor
vitest (source) ^4.0.1 -> ^4.0.4 age confidence devDependencies patch

Release Notes

biomejs/biome (@​biomejs/biome)

v2.3.2

Compare Source

Patch Changes
  • #​7859 c600618 Thanks @​Netail! - Added the nursery rule noIncrementDecrement, disallows the usage of the unary operators ++ and --.

  • #​7901 0d17b05 Thanks @​ematipico! - Fixed #​7837, where Biome couldn't properly parse text expressions that contained nested curly brackets. This was breaking parsing in Astro and Svelte files.

  • #​7874 e617d36 Thanks @​Bertie690! - Fixed #​7230: noUselessStringConcat no longer emits false positives for multi-line strings with leading + operators.

    Previously, the rule did not check for leading newlines on the + operator, emitting false positives if one occurred at the start of a line.
    Notably, formatting with operatorLinebreak="before" would move the + operators to the start of lines automatically, resulting in spurious errors whenever a multi-line string was used.

    Now, the rule correctly detects and ignores multi-line concatenations with leading operators as well, working regardless of the setting of operatorLinebreak.

    Example

    // The following code used to error if the `+` operators were at the start of lines (as opposed to the end).
    // Now, the rule correctly recognizes this as a stylistic concatenation and ignores it.
    const reallyLongStringThatShouldNotError =
      "Lorem ipsum dolor sit amet consectetur adipiscing elit." +
      "Quisque faucibus ex sapien vitae pellentesque sem placerat." +
      "In id cursus mi pretium tellus duis convallis." +
      "Tempus leo eu aenean sed diam urna tempor. Pulvinar vivamus fringilla";
  • #​7786 33ffcd5 Thanks @​daivinhtran! - Fixed #​7601: Properly match Grit plugin's code snippet with only one child.

  • #​7901 0d17b05 Thanks @​ematipico! - Fixed #​7837, where Biome Language Server panicked when opening HTML-ish files when the experimental full support is enabled.

v2.3.1

Compare Source

Patch Changes
  • #​7840 72afdfa Thanks @​ematipico! - Fixed #​7838, which caused the new --css-parse-* arguments not being recognised by the ci command.

  • #​7789 d5b416e Thanks @​fronterior! - Fixed the LSP method workspace/didChangeWorkspaceFolders to perform incremental updates instead of replacing the entire folder list.

  • #​7852 bd254c7 Thanks @​dyc3! - Fixed #​7843: The CSS parser, when tailwindDirectives is enabled, correctly parses --*: initial;.

  • #​7872 0fe13fe Thanks @​dyc3! - Fixed #​7861: The HTML parser will now accept Svelte attribute shorthand syntax in .svelte files.

  • #​7866 7b2600b Thanks @​dyc3! - Fixed #​7860: The css parser, with tailwindDirectives enabled, will now accept @plugin options.

  • #​7853 fe90c78 Thanks @​dyc3! - Fixed #​7848: The css parser with tailwindDirectives enabled will now correctly parse tailwind's source exclude syntax: @source not "foo.css";

  • #​7878 c9f7fe5 Thanks @​ematipico! - Fixed #​7857: Biome now parses <script> tags as TypeScript when analysing .astro files.

  • #​7867 b42b718 Thanks @​smorimoto! - Fixed incorrect option name in HTML parser error message.

    The error message for disabled text expressions incorrectly referred
    to the html.parser.textExpression option, which does not exist.
    Updated it to reference the correct html.parser.interpolation option.

v2.3.0

Compare Source

Minor Changes
Example

Given the following file structure:

tsconfig.json

{
  "compilerOptions": {
    "baseUrl": "./src"
  }
}

src/foo.ts

export function foo() {}

In this scenario, import { foo } from "foo"; should work regardless of the
location of the file containing the import statement.

Fixes #​6432.

  • #​7745 6fcbc07 Thanks @​dyc3! - Added ignore option to noUnknownAtRules. If an unknown at-rule matches any of the items provided in ignore, a diagnostic won't be emitted.

  • #​7753 63cb7ff Thanks @​ematipico! - Enhanced the init command. The init command now checks if the existing project contains known ignore files and known generated folders.

    If Biome finds .gitignore or .ignore files, it will add the following configuration to biome.json:

    {
    +  "vcs": {
    +    "enabled": true,
    +    "clientKind": "git",
    +    "useIgnoreFile": true
    +  }
    }

    If Biome finds a dist/ folder, it will exclude it automatically using the double-exclude syntax:

    {
    +  "files": {
    +    "includes": ["**", "!!**/dist"]
    +  }
    }
  • #​7548 85d3a3a Thanks @​siketyan! - The rules in a domain are no longer enabled automatically by the installed dependencies unless the rule is recommended.

  • #​7723 d3aac63 Thanks @​ematipico! - Added --css-parse-css-modules CLI flag to control whether CSS Modules syntax is enabled.

    You can now enable or disable CSS Modules parsing directly from the command line:

    biome check --css-parse-css-modules=true file.module.css
    biome format --css-parse-css-modules=true file.module.css
    biome lint --css-parse-css-modules=true file.module.css
    biome ci --css-parse-css-modules=true file.module.css
  • #​7723 d3aac63 Thanks @​ematipico! - Added --css-parse-tailwind-directives CLI flag to control whether Tailwind CSS 4.0 directives and functions are enabled.

    You can now enable or disable Tailwind CSS 4.0 directive parsing directly from the command line:

    biome check --css-parse-tailwind-directives=true file.css
    biome format --css-parse-tailwind-directives=true file.css
    biome lint --css-parse-tailwind-directives=true file.css
    biome ci --css-parse-tailwind-directives=true file.css
  • #​7330 272632f Thanks @​ematipico! - Updated the formatting of .svelte and .vue files. Now the indentation of the JavaScript blocks matches Prettier's:

    <script>
    - import Component from "./Component"
    +   import Component from "./Component"
    </script>
  • #​7333 de0d2d6 Thanks @​dyc3! - Implemented the indentScriptAndStyle option for vue and svelte files, with the default set to false to match Prettier's vueIndentScriptAndStyle option. When enabled, this option indents the content within <script> and <style> tags to align with the surrounding HTML structure.

    It can be enabled with this configuration:

    {
      "html": {
        "formatter": {
          "indentScriptAndStyle": true
        }
      }
    }

    Which will format this code to:

    <script>
    import Component from "./Component.vue";
    </script>
  • #​7359 ebbddc4 Thanks @​arendjr! - Deprecated the option files.experimentalScannerIgnores in favour of force-ignore syntax in files.includes.

    files.includes supports ignoring files by prefixing globs with an exclamation mark (!). With this change, it also supports force-ignoring globs by prefixing them with a double exclamation mark (!!).

    The effect of force-ignoring is that the scanner will not index files matching the glob, even in project mode, even if those files are imported by other files, and even if they are files that receive special treatment by Biome, such as nested biome.json files.

Example

Let's take the following configuration:

{
  "files": {
    "includes": [
      "**",
      "!**/generated",
      "!!**/dist",
      "fixtures/example/dist/*.js"
    ]
  },
  "linter": {
    "domains": {
      "project": "all"
    }
  }
}

This configuration achieves the following:

  • Because the project domain is enabled, all supported files in the project are indexed and processed by the linter, except:
  • Files inside a generated folder are not processed by the linter, but they will get indexed if a file outside a generated folder imports them.
  • Files inside a dist folder are never indexed nor processed, not even if they are imported for any purpose, except:
  • When the dist folder is inside fixtures/example/, its .js files do get both indexed and processed.

In general, we now recommend using the force-ignore syntax for any folders that contain output files, such as build/ and dist/. For such folders, it is highly unlikely that indexing has any useful benefits. For folders containing generated files, you may wish to use the regular ignore syntax so that type information can still be extracted from the files.

experimentalScannerIgnores will continue to work for now, but you'll see a deprecation warning if you still use it.

Run the biome migrate --write command to automatically update the configuration file.

  • #​7698 3b6f5e3 Thanks @​ematipico! - Added a new reporter named rdjson. This reporter prints diagnostics following the RDJSON format:

    The following command:

    biome check --reporter=rdjson

    Will emit diagnostics in the following format:

    {
      "source": {
        "name": "Biome",
        "url": "https://biomejs.dev"
      },
      "diagnostics": [
        {
          "code": {
            "url": "https://biomejs.dev/linter/rules/no-unused-imports",
            "value": "lint/correctness/noUnusedImports"
          },
          "location": {
            "path": "index.ts",
            "range": {
              "end": {
                "column": 11,
                "line": 0
              },
              "start": {
                "column": 7,
                "line": 0
              }
            }
          },
          "message": "This import is unused."
        },
        {
          "code": {
            "url": "https://biomejs.dev/linter/rules/no-unused-imports",
            "value": "lint/correctness/noUnusedImports"
          },
          "location": {
            "path": "index.ts",
            "range": {
              "end": {
                "column": 10,
                "line": 1
              },
              "start": {
                "column": 9,
                "line": 1
              }
            }
          },
          "message": "Several of these imports are unused."
        }
      ]
    }
  • #​7719 188a767 Thanks @​cadunass! - The formatWithErrors option can now be set via CLI using the --format-with-errors flag.

    This flag was previously only available in the configuration file. It allows formatting to proceed on files with syntax errors, which is useful during development when you want to auto-format code while fixing syntax issues.

Example
biome format --format-with-errors=true --write file.js
  • #​7723 d3aac63 Thanks @​ematipico! - Added --json-parse-allow-comments CLI flag to control whether comments are allowed in JSON files.

    You can now enable or disable comment parsing in JSON files directly from the command line:

    biome check --json-parse-allow-comments=true file.json
    biome format --json-parse-allow-comments=true file.json
    biome lint --json-parse-allow-comments=true file.json
    biome ci --json-parse-allow-comments=true file.json
  • #​7723 d3aac63 Thanks @​ematipico! - Added --json-parse-allow-trailing-commas CLI flag to control whether trailing commas are allowed in JSON files.

    You can now enable or disable trailing comma parsing in JSON files directly from the command line:

    biome check --json-parse-allow-trailing-commas=true file.json
    biome format --json-parse-allow-trailing-commas=true file.json
    biome lint --json-parse-allow-trailing-commas=true file.json
    biome ci --json-parse-allow-trailing-commas=true file.json
  • #​7758 cea002f Thanks @​ematipico! - Promoted new lint rules:

    • Promoted noNonNullAssertedOptionalChain to the suspicious group
    • Promoted useReactFunctionComponents to the style group
    • Promoted useImageSize to the correctness group
    • Promoted useConsistentTypeDefinitions to the style group
    • Promoted useQwikClasslist to the correctness group
    • Promoted noSecrets to the security group

    Removed the lint rule useAnchorHref, because its use case is covered by useValidAnchor.

  • #​6356 296627d Thanks @​wrick17! - Added the new checkstyle reporter. When --reporter=checkstyle is passed to the CLI, Biome will emit diagnostics for Checkstyle format:

    <?xml version="1.0" encoding="utf-8"?>
    <checkstyle version="4.3">
      <file name="index.ts">
        <error line="1" column="8" severity="warning" message="This import is unused." source="lint/correctness/noUnusedImports" />
        <error line="2" column="10" severity="warning" message="Several of these imports are unused." source="lint/correctness/noUnusedImports" />
        <error line="8" column="5" severity="warning" message="This variable f is unused." source="lint/correctness/noUnusedVariables" />
        <error line="9" column="7" severity="warning" message="This variable f is unused." source="lint/correctness/noUnusedVariables" />
        <error line="1" column="1" severity="error" message="The imports and exports are not sorted." source="assist/source/organizeImports" />
        <error line="4" column="3" severity="error" message="Using == may be unsafe if you are relying on type coercion." source="lint/suspicious/noDoubleEquals" />
        <error line="6" column="1" severity="error" message="This is an unexpected use of the debugger statement." source="lint/suspicious/noDebugger" />
        <error line="8" column="5" severity="error" message="This variable implicitly has the any type." source="lint/suspicious/noImplicitAnyLet" />
        <error line="9" column="7" severity="error" message="This variable implicitly has the any type." source="lint/suspicious/noImplicitAnyLet" />
        <error line="2" column="10" severity="error" message="Shouldn&apos;t redeclare &apos;z&apos;. Consider to delete it or rename it." source="lint/suspicious/noRedeclare" />
        <error line="9" column="7" severity="error" message="Shouldn&apos;t redeclare &apos;f&apos;. Consider to delete it or rename it." source="lint/suspicious/noRedeclare" />
        <error line="0" column="0" severity="error" message="Formatter would have printed the following content:" source="format" />
      </file>
      <file name="main.ts">
        <error line="1" column="8" severity="warning" message="This import is unused." source="lint/correctness/noUnusedImports" />
        <error line="2" column="10" severity="warning" message="Several of these imports are unused." source="lint/correctness/noUnusedImports" />
        <error line="8" column="5" severity="warning" message="This variable f is unused." source="lint/correctness/noUnusedVariables" />
        <error line="9" column="7" severity="warning" message="This variable f is unused." source="lint/correctness/noUnusedVariables" />
        <error line="1" column="1" severity="error" message="The imports and exports are not sorted." source="assist/source/organizeImports" />
        <error line="4" column="3" severity="error" message="Using == may be unsafe if you are relying on type coercion." source="lint/suspicious/noDoubleEquals" />
        <error line="6" column="1" severity="error" message="This is an unexpected use of the debugger statement." source="lint/suspicious/noDebugger" />
        <error line="8" column="5" severity="error" message="This variable implicitly has the any type." source="lint/suspicious/noImplicitAnyLet" />
        <error line="9" column="7" severity="error" message="This variable implicitly has the any type." source="lint/suspicious/noImplicitAnyLet" />
        <error line="2" column="10" severity="error" message="Shouldn&apos;t redeclare &apos;z&apos;. Consider to delete it or rename it." source="lint/suspicious/noRedeclare" />
        <error line="9" column="7" severity="error" message="Shouldn&apos;t redeclare &apos;f&apos;. Consider to delete it or rename it." source="lint/suspicious/noRedeclare" />
        <error line="0" column="0" severity="error" message="Formatter would have printed the following content:" source="format" />
      </file>
    </checkstyle>
  • #​7488 b13e524 Thanks @​kpapa05! - Added "@​rbxts/react" as an alias for "react" for handling the reactClassic jsxRuntime.

  • #​7536 0bccd34 Thanks @​TheAlexLichter! - Added .oxlintrc.json to well-known files.

  • #​7548 85d3a3a Thanks @​siketyan! - The following rules are now a part of the react domain, and they won't be enabled automatically unless you enabled the domain, or Biome detects react as a dependency of your closest package.json:

  • #​7667 480909a Thanks @​ematipico! - Added the ability to show severity Information diagnostics in reporter outputs.

    If one or more rules are triggered, and they are configured to emit an Information diagnostic, now they're counted in the final output:

    Checked 1 file in <TIME>. No fixes applied.
    Found 1 info.
  • #​7702 28e8860 Thanks @​ematipico! - Added linting and assist support for .html files, with addition of two new configurations:

    • html.linter.enabled
    • html.assist.enabled

    The HTML linter, in this release, only contains the rule noHeaderScope. More rules will be released in the upcoming releases.

  • #​7164 f66b0c5 Thanks @​dyc3! - Added a new CSS parser option tailwindDirectives. Enabling this option will allow all of Tailwind v4's syntax additions to be parsed and formatted by Biome.

    You can enable this by setting css.parser.tailwindDirectives to true in your Biome configuration.

    {
      "css": {
        "parser": {
          "tailwindDirectives": true
        }
      }
    }
  • #​7669 6ed4d16 Thanks @​barklund! - React 19.2 support is now supported in Biome:

  • #​7702 28e8860 Thanks @​ematipico! - Added experimental full support for HTML, Vue, Svelte and Astro files. In this release, the HTML parser
    has been enhanced, and it's now able to parse .vue, .svelte and .astro files.

    This means that now Biome is able to lint and format the JavaScript (TypeScript), HTML and CSS code that is contained in these files.

    Now that the main architecture is stable and working, in the upcoming patches and minors we will also fix possible inaccuracies and edge cases coming from existing lint rules, such as noUnusedVariables inside <script> blocks or frontmatter.

    The support is considered experimental because there might be cases that aren't fine-parsed yet, hence causing possible inaccuracies when it comes to formatting and linting.

  • #​7599 09445c8 Thanks @​anaisbetts! - #### lineEnding has a new option auto

    The option lineEnding now has a variant called auto to match the operating system's expected
    line-ending style: on Windows, this will be CRLF (\r\n), and on macOS / Linux, this will
    be LF (\n).

    This allows for cross-platform projects that use Biome not to have to
    force one option or the other, which aligns better with Git's default behavior
    on these platforms.

    Example usage:

    {
      "formatter": {
        "lineEnding": "auto"
      }
    }
    biome format --line-ending auto
  • #​7392 e4feb8e Thanks @​ematipico! - Added new capabilities to the CLI arguments --skip and --only, available to the biome lint command.

    --skip and --only can now accept domain names; when provided, Biome will run or skip all the rules that belong to a certain domain.

    For example, the following command will only run the rules that belong to the next domain:

    biome lint --only=next

    Another example, the following command will skip the rules that belong to the project domain:

    biome lint --skip=project
  • #​7702 28e8860 Thanks @​ematipico! - Added a new option called html.interpolation. This option enables the parsing of text expressions (or interpolation) in HTML files.

    The following file.html will be correctly formatted:

    <!-- file.html -->
    <div>
      Hello {{ name }}!
      <p>Your balance is: {{ account.balance }}</p>
      <button>{{ isLoading ? "Loading..." : "Submit" }}</button>
    </div>

    To note that html.interpolation only parses text expressions that are delimited by double curly braces ({{ }}). The content of expressions is parsed as normal text.

Patch Changes
  • #​7712 fcc9b42 Thanks @​minht11! - Added new rule useVueDefineMacrosOrder which allows enforcing specific order for Vue compiler macros.

    In this example, the rule will suggest moving defineProps before defineEmits:

    <script lang="ts" setup>
    const emit = defineEmits(["update"]);
    const props = defineProps<{ name: string }>();
    </script>
  • #​7698 3b6f5e3 Thanks @​ematipico! - Fixed an issue where the JUnit reporter returned a zero-based location. Now the location returned is one-based.

  • #​7819 ef45056 Thanks @​ematipico! - Fixed #​7788. Removes some error logging that were emitted when loading possible configuration files.

  • #​7593 e51dd55 Thanks @​arendjr! - Fixed an issue with the files.maxSize setting. Previously the setting would always be looked up in the root settings, even in monorepos where a closer biome.json is available. It now correctly uses the nearest configuration.

  • #​7825 ad55b35 Thanks @​Conaclos! - Fixed #​7798. useNamingConvention no longer panics when it encounters a name that consists of a single dollar sign $ that doesn't match a custom convention.

  • #​7764 93be2ab Thanks @​gaauwe! - Fixed #​6589: Biome now properly loads extension settings before loading the configuration file when opening a text document in the LSP server.

nuxt/devtools (@​nuxt/devtools)

v2.7.0

Compare Source

Bug Fixes
  • devtools: use vite plugin for env-specific config (#​899) (0c258d4)

2.6.5 (2025-09-20)

Bug Fixes
  • ensure path resolve is safe (1fabb49)

2.6.4 (2025-09-19)

Bug Fixes
  • using textContent instead of innerHtml for auth pagechore: update lock (7cadbbe)

2.6.3 (2025-08-22)

2.6.2 (2025-07-02)

Bug Fixes

2.6.1 (2025-07-01)

Bug Fixes
nuxt/nuxt (@​nuxt/kit)

v4.2.0

Compare Source

4.2.0 is the next minor release.

👀 Highlights

We're excited to announce Nuxt 4.2, bringing new capabilities for better TypeScript DX, enhanced error handling, and improved control over data fetching! 🎉

🎯 Abort Control for Data Fetching

You can now use AbortController signals directly within useAsyncData, giving you fine-grained control over request cancellation (#​32531).

This works by passing an internal signal to your useAsyncData handler to cancel any promise that can be canceled, such as $fetch.

<script setup lang="ts">
const controller = new AbortController()

const { data, error, clear, refresh } = await useAsyncData('users', (_nuxtApp, { signal }) => $fetch('/api/users', {
  signal
}))

refresh() // will actually cancel the $fetch request (if dedupe: cancel)
refresh() // will actually cancel the $fetch request (if dedupe: cancel)
refresh()
  
clear() // will cancel the latest pending handler
</script>

You also pass an AbortController signal directly to refresh/execute, giving you fine-grained control over request cancellation. This is particularly useful when you need to abort requests based on user actions or component lifecycle events.

const { data, refresh } = await useAsyncData('posts', fetchPosts)

// Abort an ongoing refresh
const abortController = new AbortController()
refresh({ signal: abortController.signal })

// Later...
abortController.abort()
🎨 Better Error Pages in Development

When an error occurs during development, Nuxt will now display both your custom error page and a detailed technical error overlay (#​33359). This gives you the best of both worlds – you can see what your users will experience while also having immediate access to stack traces and debugging information.

Screenshot of the new development error page

The technical overlay appears as a toggleable panel that doesn't interfere with your custom error page, making it easier to debug issues while maintaining a realistic preview of your error handling.

🔮 Opt-in Vite Environment API

For those wanting to experiment with cutting-edge features, you can now opt into the Vite Environment API (#​33492).

The Vite Environment API is a major architectural improvement in Vite 6. It closes the gap between development and production by allowing the Vite dev server to handle multiple environments concurrently (rather than requiring multiple Vite dev servers, as we have done previously in Nuxt).

This should improve performance when developing and eliminate some edge case bugs.

... and it is the foundation for implementing Nitro as a Vite environment, which should speed up the dev server still further, as well as allowing more greater alignment in development with your Nitro preset.

export default defineNuxtConfig({
  experimental: {
    viteEnvironmentApi: true
  }
})

This is also the first breaking change for Nuxt v5. You can opt in to these breaking changes by setting compatibilityVersion to 5:

export default defineNuxtConfig({
  future: {
    compatibilityVersion: 5
  },
})

Please only use this for testing, as this opts in to unlimited future breaking changes, including updating to Nitro v3 once we ship the Nuxt integration.

[!WARNING]
This is highly experimental and the API may change. Only enable if you're prepared for potential breaking changes and want to help shape the future of Nuxt!

📦 New @nuxt/nitro-server Package

We've extracted Nitro server integration into its own package: @nuxt/nitro-server (#​33462). This architectural change allows for different Nitro integration patterns and paves the way for future innovations in server-side rendering.

While this change is mostly internal, it's part of our ongoing effort to make Nuxt more modular and flexible. The new package provides standalone Nitro integration and sets the foundation for alternative integration approaches (such as using Nitro as a Vite plugin in Nuxt v5+).

[!NOTE]
This is an internal refactor – no changes should be required in your code.

⚡ Performance Improvements

We've also shipped several performance enhancements:

  • Precomputed renderer dependencies – We now compute renderer dependencies at build time rather than runtime, improving cold start and initial render performance (#​33361)
  • Reduced dependencies – Removed unnecessary dependencies from kit and schema packages (7ae2cf563)
📉 Async Data Handler Extraction

One of the most exciting performance improvements is the new experimental async data handler extraction (#​33131). When enabled, handler functions passed to useAsyncData and useLazyAsyncData are automatically extracted into separate chunks and dynamically imported.

This is particularly effective for prerendered static sites, as the data fetching logic is only needed at build time and can be completely excluded from the client bundle.

[!NOTE]
In testing with a previous version of nuxt.com, this feature reduced JavaScript bundle size by 39%! Of course, your mileage may vary depending on how much data fetching logic you have.

<script setup lang="ts">
// This handler will be extracted into a separate chunk
// and only loaded when needed
const { data: post } = await useAsyncData('post', async () => {
  const content = await queryContent(`/blog/${route.params.slug}`).findOne()
  
  // Complex data processing that you don't want in the client bundle
  const processed = await processMarkdown(content)
  const related = await findRelatedPosts(content.tags)
  
  return {
    ...processed,
    related
  }
})
</script>

For static/prerendered sites, enable it in your config:

export default defineNuxtConfig({
  experimental: {
    extractAsyncDataHandlers: true
  }
})

The extracted handlers are then tree-shaken from your client bundle when prerendering, as the data is already available in the payload. This results in significantly smaller JavaScript files shipped to your users.

🔧 Experimental TypeScript Plugin Support

We're introducing experimental support for enhanced TypeScript developer experience through the @dxup/nuxt module.

This module adds a number of TypeScript plugins that aim to improve your experience when using Nuxt-specific features:

  • Smart component renaming: Automatically updates all references when you rename auto-imported component files
  • Go to definition for dynamic imports: Navigate directly to files when using glob patterns like import(\~/assets/${name}.webp`)`
  • Nitro route navigation: Jump to server route handlers from data fetching functions ($fetch, useFetch, useLazyFetch)
  • Runtime config navigation: Go to definition works seamlessly with runtime config properties
  • Enhanced auto-import support: Includes the @dxup/unimport plugin for better navigation with auto-imported composables and utilities

[!NOTE]
Read more in the documentation.

To enable this feature, set experimental.typescriptPlugin to true in your Nuxt configuration:

export default defineNuxtConfig({
  experimental: {
    typescriptPlugin: true
  }
})

Once enabled, the module will be automatically installed and configured by Nuxt.

[!IMPORTANT]
This feature also requires selecting the workspace TypeScript version in VS Code. Run the "TypeScript: Select TypeScript Version" command and choose "Use Workspace Version".

🎁 Other Improvements
  • Component declarationPath – You can now specify a custom declaration path for components (#​33419)
  • Module resolution extensions – Kit's resolveModule now accepts an extensions option (#​33328)
  • Global head utility – New setGlobalHead utility in kit for easier head management (#​33512)
🩹 Important Fixes
  • Route hash is now preserved when redirecting based on routeRules (#​33222)
  • Fixed concurrent calls to loadNuxtConfig with proper cleanup (#​33420)
  • Object-format href now works correctly in <NuxtLink> (c69e4c30d)
  • Component auto-imports now work as arguments to Vue's h() function (#​33509)
  • Fixed app config array handling during HMR (#​33555)
✅ Upgrading

Our recommendation for upgrading is to run:

npx nuxt upgrade --dedupe

This will refresh your lockfile and pull in all the latest dependencies that Nuxt relies on, especially from the unjs ecosystem.

👉 Changelog

compare changes

🚀 Enhancements
  • nuxt: Allow specifying component declarationPath (#​33419)
  • kit: Add extensions option for resolveModule (#​33328)
  • nuxt: Add abortController option to useAsyncData (#​32531)
  • nuxt: Display youch error page w/ user error page in dev (#​33359)
  • nuxt: Experimental typescript plugin support (#​33314)
  • nuxt,schema: Extract asyncData handlers to chunks (#​33131)
  • schema: Enable setting future.compatibilityVersion to 5 (22f4693a1)
  • kit,vite: Allow enabling vite environment api (#​33492)
  • kit: Add setGlobalHead utility (#​33512)
🔥 Performance
  • nuxt: Precompute renderer dependencies at build time (#​33361)
  • kit,schema: Remove some unnecessary dependencies (7ae2cf563)
🩹 Fixes
  • nuxt: Preserve hash with redirecting based on routeRules (#​33222)
  • kit: Safely cleanup loadNuxtConfig in concurrent calls (#​33420)
  • nuxt: Allow object-format href in <NuxtLink> (c69e4c30d)
  • nuxt: Remove mergeModels from auto imports (#​33344)
  • nuxt: Add back shortPath property (#​33384)
  • nuxt: Do not allow native attrs to shadow nuxt link props (4751a6aca)
  • nuxt: Remove declarationPath from component dirs (191bcb7e9)
  • nuxt: Preserve root route in isPrerendered check (#​33476)
  • nuxt: Exempt webpack vfs from pkg lookup (285eac31c)
  • nitro: Exempt nightly release from import protections (dd522394a)
  • webpack,rspack: Preserve prerender + nitro flags in server builds (#​33503)
  • nuxt: Support component auto-imports as arguments of h() (#​33509)
  • vite: Prevent assignment for rolldown's replacement plugin (#​33526)
  • nuxt: Use sha256 hash for prerender cache keys (#​33505)
  • nuxt: Add NuxtTime relative time numeric prop (#​33552)
  • nuxt: Add NuxtTime relative time relativeStyle prop (#​33557)
  • nuxt: Handle arrays in app config correctly during HMR (#​33555)
  • vite: Unset optimizeDeps.include for server environment (#​33550)
💅 Refactors
  • Remove obsolete shortPath property (#​33384)
  • kit: Extract trace utilities (9687505ac)
  • nuxt,vite,webpack: Allow builders to augment types (#​33427)
  • schema: Deprecate extend, extendConfig, and configResolved hooks (e060b9695)
  • vite: Make vite plugins environment-compatible (#​33445)
  • nitro,nuxt: Extract @nuxt/nitro-server package (#​33462)
  • nuxt: Use RouteLocationNormalizedLoadedGeneric internally (b51cb3067)
📖 Documentation
  • Update link to localisation issue (d32859da2)
  • Add nuxt module addServerPlugin note (#​33409)
  • Remove deprecated node version (#​33411)
  • Update declarationPath in addComponent (#​33380)
  • Reproduction links for Nuxt v4 (#​33429)
  • Add some notes/deprecations for vite hooks (31c5f26a2)
  • Fix incorrect ESM module field info (#​33451)
  • Recommend getLayerDirectories() instead of nuxt.options._layers (#​33484)
  • Add 4.x prefix (5c0bb9285)
  • Add docs for moduleDependencies (#​33499)
  • Clarify extends removal in TypeScript config migration (#​33523)
  • Pin codemod to v0.18.7 for migration recipe (#​33522)
  • Fix links (#​33554)
🏡 Chore

Configuration

📅 Schedule: Branch creation - "every 7 day" (UTC), Automerge - At any time (no schedule defined).

🚦 Automerge: Enabled.

Rebasing: Whenever PR is behind base branch, or you tick the rebase/retry checkbox.

👻 Immortal: This PR will be recreated if closed unmerged. Get config help if that's undesired.


  • If you want to rebase/retry this PR, check this box

This PR was generated by Mend Renovate. View the repository job log.

@renovate renovate bot requested a review from Hebilicious as a code owner October 29, 2025 00:07
@changeset-bot
Copy link

changeset-bot bot commented Oct 29, 2025

⚠️ No Changeset found

Latest commit: 30c2f2f

Merging this PR will not cause a version bump for any packages. If these changes should not result in a new version, you're good to go. If these changes should result in a version bump, you need to add a changeset.

This PR includes no changesets

When changesets are added to this PR, you'll see the packages that this PR includes changesets for and the associated semver types

Click here to learn what changesets are, and how to add one.

Click here if you're a maintainer who wants to add a changeset to this PR

@renovate renovate bot merged commit b097184 into main Oct 29, 2025
2 checks passed
@renovate renovate bot deleted the renovate/all-minor-patch branch October 29, 2025 02:12
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant