Skip to content

[Security] Bump esbuild, vitest and @vitejs/plugin-react

Bumps esbuild to 0.25.5 and updates ancestor dependencies esbuild, vitest and @vitejs/plugin-react. These dependencies need to be updated together.

Updates esbuild from 0.21.5 to 0.25.5 This update includes a security fix.

Vulnerabilities fixed

esbuild enables any website to send any requests to the development server and read the response

Summary

esbuild allows any websites to send any request to the development server and read the response due to default CORS settings.

Details

esbuild sets Access-Control-Allow-Origin: * header to all requests, including the SSE connection, which allows any websites to send any request to the development server and read the response.

https://github.com/evanw/esbuild/blob/df815ac27b84f8b34374c9182a93c94718f8a630/pkg/api/serve_other.go#L121 https://github.com/evanw/esbuild/blob/df815ac27b84f8b34374c9182a93c94718f8a630/pkg/api/serve_other.go#L363

Attack scenario:

  1. The attacker serves a malicious web page (http://malicious.example.com).
  2. The user accesses the malicious web page.
  3. The attacker sends a fetch('http://127.0.0.1:8000/main.js') request by JS in that malicious web page. This request is normally blocked by same-origin policy, but that's not the case for the reasons above.
  4. The attacker gets the content of http://127.0.0.1:8000/main.js.

In this scenario, I assumed that the attacker knows the URL of the bundle output file name. But the attacker can also get that information by

... (truncated)

Patched versions: 0.25.0 Affected versions: <= 0.24.2

Release notes

Sourced from esbuild's releases.

v0.25.5

  • Fix a regression with browser in package.json (#4187)

    The fix to #4144 in version 0.25.3 introduced a regression that caused browser overrides specified in package.json to fail to override relative path names that end in a trailing slash. That behavior change affected the axios@0.30.0 package. This regression has been fixed, and now has test coverage.

  • Add support for certain keywords as TypeScript tuple labels (#4192)

    Previously esbuild could incorrectly fail to parse certain keywords as TypeScript tuple labels that are parsed by the official TypeScript compiler if they were followed by a ? modifier. These labels included function, import, infer, new, readonly, and typeof. With this release, these keywords will now be parsed correctly. Here's an example of some affected code:

    type Foo = [
      value: any,
      readonly?: boolean, // This is now parsed correctly
    ]
  • Add CSS prefixes for the stretch sizing value (#4184)

    This release adds support for prefixing CSS declarations such as div { width: stretch }. That CSS is now transformed into this depending on what the --target= setting includes:

    div {
      width: -webkit-fill-available;
      width: -moz-available;
      width: stretch;
    }

v0.25.4

  • Add simple support for CORS to esbuild's development server (#4125)

    Starting with version 0.25.0, esbuild's development server is no longer configured to serve cross-origin requests. This was a deliberate change to prevent any website you visit from accessing your running esbuild development server. However, this change prevented (by design) certain use cases such as "debugging in production" by having your production website load code from localhost where the esbuild development server is running.

    To enable this use case, esbuild is adding a feature to allow Cross-Origin Resource Sharing (a.k.a. CORS) for simple requests. Specifically, passing your origin to the new cors option will now set the Access-Control-Allow-Origin response header when the request has a matching Origin header. Note that this currently only works for requests that don't send a preflight OPTIONS request, as esbuild's development server doesn't currently support OPTIONS requests.

    Some examples:

    • CLI:

      esbuild --servedir=. --cors-origin=https://example.com
    • JS:

      const ctx = await esbuild.context({})
      await ctx.serve({
        servedir: '.',
        cors: {

... (truncated)

Changelog

Sourced from esbuild's changelog.

Changelog: 2024

This changelog documents all esbuild versions published in the year 2024 (versions 0.19.12 through 0.24.2).

0.24.2

  • Fix regression with --define and import.meta (#4010, #4012, #4013)

    The previous change in version 0.24.1 to use a more expression-like parser for define values to allow quoted property names introduced a regression that removed the ability to use --define:import.meta=.... Even though import is normally a keyword that can't be used as an identifier, ES modules special-case the import.meta expression to behave like an identifier anyway. This change fixes the regression.

    This fix was contributed by @​sapphi-red.

0.24.1

  • Allow es2024 as a target in tsconfig.json (#4004)

    TypeScript recently added es2024 as a compilation target, so esbuild now supports this in the target field of tsconfig.json files, such as in the following configuration file:

    {
      "compilerOptions": {
        "target": "ES2024"
      }
    }

    As a reminder, the only thing that esbuild uses this field for is determining whether or not to use legacy TypeScript behavior for class fields. You can read more in the documentation.

    This fix was contributed by @​billyjanitsch.

  • Allow automatic semicolon insertion after get/set

    This change fixes a grammar bug in the parser that incorrectly treated the following code as a syntax error:

    class Foo {
      get
      *x() {}
      set
      *y() {}
    }

    The above code will be considered valid starting with this release. This change to esbuild follows a similar change to TypeScript which will allow this syntax starting with TypeScript 5.7.

  • Allow quoted property names in --define and --pure (#4008)

    The define and pure API options now accept identifier expressions containing quoted property names. Previously all identifiers in the identifier expression had to be bare identifiers. This change now makes --define and --pure consistent with --global-name, which already supported quoted property names. For example, the following is now possible:

... (truncated)

Commits

Updates vitest from 2.1.1 to 3.1.4

Release notes

Sourced from vitest's releases.

v3.1.4

   🐞 Bug Fixes

    View changes on GitHub

v3.1.3

   🐞 Bug Fixes

    View changes on GitHub

v3.1.2

   🐞 Bug Fixes

... (truncated)

Commits
  • ac88181 chore: release v3.1.4
  • 64f2b43 fix: apply browser CLI options only if the project has the browser set in the...
  • 6e8d937 chore: release v3.1.3
  • 8c7f75a fix: ignore failures on writeToCache (#7893)
  • d613b81 fix(reporters): --merge-reports to show each total run times (#7877)
  • 2fa763a fix: reset mocks on test retry/repeat (#7897)
  • 573cb16 ci: fix flaky browser tests (#7887)
  • 03660f9 fix(browser): correctly inherit CLI options (#7858)
  • a83f3bf fix: correctly resolve vitest import if inline: true is set (#7856)
  • 5a0afd1 chore: release v3.1.2
  • Additional commits viewable in compare view

Updates @vitejs/plugin-react from 4.3.1 to 4.5.0

Release notes

Sourced from @​vitejs/plugin-react's releases.

plugin-react@4.5.0

Add filter for rolldown-vite #470

Added filter so that it is more performant when running this plugin with rolldown-powered version of Vite.

Skip HMR for JSX files with hooks #480

This removes the HMR warning for hooks with JSX.

plugin-react@4.4.1

Fix type issue when using moduleResolution: "node" in tsconfig #462

plugin-react@4.4.0

Make compatible with rolldown-vite

This plugin is now compatible with rolldown-powered version of Vite. Note that currently the __source property value position might be incorrect. This will be fixed in the near future.

plugin-react@4.4.0-beta.2

Add reactRefreshHost option

Add reactRefreshHost option to set a React Fast Refresh runtime URL prefix. This is useful in a module federation context to enable HMR by specifying the host application URL in the Vite config of a remote application. See full discussion here: module-federation/vite#183

export default defineConfig({
  plugins: [react({ reactRefreshHost: 'http://localhost:3000' })],
})

plugin-react@4.4.0-beta.1

No release notes provided.

plugin-react@4.3.4

Add Vite 6 to peerDependencies range

Vite 6 is highly backward compatible, not much to add!

Force Babel to output spec compliant import attributes #386

The default was an old spec (with type: "json"). We now enforce spec compliant (with { type: "json" })

plugin-react@4.3.3

React Compiler runtimeModule option removed

React Compiler was updated to accept a target option and runtimeModule was removed. vite-plugin-react will still detect runtimeModule for backwards compatibility.

When using a custom runtimeModule or target !== '19', the plugin will not try to pre-optimize react/compiler-runtime dependency.

... (truncated)

Changelog

Sourced from @​vitejs/plugin-react's changelog.

4.5.0 (2025-05-23)

Add filter for rolldown-vite #470

Added filter so that it is more performant when running this plugin with rolldown-powered version of Vite.

Skip HMR for JSX files with hooks #480

This removes the HMR warning for hooks with JSX.

4.4.1 (2025-04-19)

Fix type issue when using moduleResolution: "node" in tsconfig #462

4.4.0 (2025-04-15)

Make compatible with rolldown-vite

This plugin is now compatible with rolldown-powered version of Vite. Note that currently the __source property value position might be incorrect. This will be fixed in the near future.

4.4.0-beta.2 (2025-04-15)

Add reactRefreshHost option

Add reactRefreshHost option to set a React Fast Refresh runtime URL prefix. This is useful in a module federation context to enable HMR by specifying the host application URL in the Vite config of a remote application. See full discussion here: module-federation/vite#183

export default defineConfig({
  plugins: [react({ reactRefreshHost: 'http://localhost:3000' })],
})

4.4.0-beta.1 (2025-04-09)

4.4.0-beta.0 (2025-04-09)

4.3.4 (2024-11-26)

Add Vite 6 to peerDependencies range

Vite 6 is highly backward compatible, not much to add!

Force Babel to output spec compliant import attributes #386

The default was an old spec (with type: "json"). We now enforce spec compliant (with { type: "json" })

4.3.3 (2024-10-19)

... (truncated)

Commits

Merge request reports

Loading