crx-gcal-url-opener
crx-gcal-url-opener copied to clipboard
chore(deps): update dependency vite to v6 [security]
This PR contains the following updates:
| Package | Change | Age | Adoption | Passing | Confidence |
|---|---|---|---|---|---|
| vite (source) | ^3.0.0 -> ^6.0.0 |
GitHub Vulnerability Alerts
CVE-2023-34092
The issue involves a security vulnerability in Vite where the server options can be bypassed using a double forward slash (//). This vulnerability poses a potential security risk as it can allow unauthorized access to sensitive directories and files.
Steps to Fix. Update Vite: Ensure that you are using the latest version of Vite. Security issues like this are often fixed in newer releases.\n2. Secure the server configuration: In your vite.config.js file, review and update the server configuration options to restrict access to unauthorized requests or directories.
Impact
Only users explicitly exposing the Vite dev server to the network (using --host or the server.host config option) are affected and only files in the immediate Vite project root folder could be exposed.\n\n### Patches\nFixed in vite@4.3.9, vite@4.2.3, vite@4.1.5, vite@4.0.5 and in the latest minors of the previous two majors, vite@3.2.7 and vite@2.9.16.
Details
Vite serves the application with under the root-path of the project while running on the dev mode. By default, Vite uses the server option fs.deny to protect sensitive files. But using a simple double forward-slash, we can bypass this restriction. \n\n### PoC\n1. Create a new latest project of Vite using any package manager. (here I'm using react and vue templates and pnpm for testing)\n2. Serve the application on dev mode using pnpm run dev.\n3. Directly access the file via url using double forward-slash (//) (e.g: //.env, //.env.local)\n4. The server option fs.deny was successfully bypassed.
Proof Images:
\n
CVE-2024-23331
Summary
Vite dev server option server.fs.deny can be bypassed on case-insensitive file systems using case-augmented versions of filenames. Notably this affects servers hosted on Windows.
This bypass is similar to https://nvd.nist.gov/vuln/detail/CVE-2023-34092 -- with surface area reduced to hosts having case-insensitive filesystems.
Patches
Fixed in [email protected], [email protected], [email protected], [email protected]
Details
Since picomatch defaults to case-sensitive glob matching, but the file server doesn't discriminate; a blacklist bypass is possible.
See picomatch usage, where nocase is defaulted to false: https://github.com/vitejs/vite/blob/v5.1.0-beta.1/packages/vite/src/node/server/index.ts#L632
By requesting raw filesystem paths using augmented casing, the matcher derived from config.server.fs.deny fails to block access to sensitive files.
PoC
Setup
- Created vanilla Vite project using
npm create vite@lateston a Standard Azure hosted Windows 10 instance.npm run dev -- --host 0.0.0.0- Publicly accessible for the time being here: http://20.12.242.81:5173/
- Created dummy secret files, e.g.
custom.secretandproduction.pem - Populated
vite.config.jswith
export default { server: { fs: { deny: ['.env', '.env.*', '*.{crt,pem}', 'custom.secret'] } } }
Reproduction
curl -s http://20.12.242.81:5173/@​fs//- Descriptive error page reveals absolute filesystem path to project root
curl -s http://20.12.242.81:5173/@​fs/C:/Users/darbonzo/Desktop/vite-project/vite.config.js- Discoverable configuration file reveals locations of secrets
curl -s http://20.12.242.81:5173/@​fs/C:/Users/darbonzo/Desktop/vite-project/custom.sEcReT- Secrets are directly accessible using case-augmented version of filename
Proof

Impact
Who
- Users with exposed dev servers on environments with case-insensitive filesystems
What
- Files protected by
server.fs.denyare both discoverable, and accessible
CVE-2024-31207
Summary
Vite dev server option server.fs.deny did not deny requests for patterns with directories. An example of such a pattern is /foo/**/*.
Impact
Only apps setting a custom server.fs.deny that includes a pattern with directories, and explicitly exposing the Vite dev server to the network (using --host or server.host config option) are affected.
Patches
Fixed in [email protected], [email protected], [email protected], [email protected], [email protected], [email protected]
Details
server.fs.deny uses picomatch with the config of { matchBase: true }. matchBase only matches the basename of the file, not the path due to a bug (https://github.com/micromatch/picomatch/issues/89). The vite config docs read like you should be able to set fs.deny to glob with picomatch. Vite also does not set { dot: true } and that causes dotfiles not to be denied unless they are explicitly defined.
Reproduction
Set fs.deny to ['**/.git/**'] and then curl for /.git/config.
- with
matchBase: true, you can get any file under.git/(config, HEAD, etc). - with
matchBase: false, you cannot get any file under.git/(config, HEAD, etc).
CVE-2024-45811
Summary
The contents of arbitrary files can be returned to the browser.
Details
@fs denies access to files outside of Vite serving allow list. Adding ?import&raw to the URL bypasses this limitation and returns the file content if it exists.
PoC
$ npm create vite@latest
$ cd vite-project/
$ npm install
$ npm run dev
$ echo "top secret content" > /tmp/secret.txt
# expected behaviour
$ curl "http://localhost:5173/@​fs/tmp/secret.txt"
<body>
<h1>403 Restricted</h1>
<p>The request url "/tmp/secret.txt" is outside of Vite serving allow list.
# security bypassed
$ curl "http://localhost:5173/@​fs/tmp/secret.txt?import&raw"
export default "top secret content\n"
//# sourceMappingURL=data:application/json;base64,eyJ2...
CVE-2024-45812
Summary
We discovered a DOM Clobbering vulnerability in Vite when building scripts to cjs/iife/umd output format. The DOM Clobbering gadget in the module can lead to cross-site scripting (XSS) in web pages where scriptless attacker-controlled HTML elements (e.g., an img tag with an unsanitized name attribute) are present.
Note that, we have identified similar security issues in Webpack: https://github.com/webpack/webpack/security/advisories/GHSA-4vvj-4cpr-p986
Details
Backgrounds
DOM Clobbering is a type of code-reuse attack where the attacker first embeds a piece of non-script, seemingly benign HTML markups in the webpage (e.g. through a post or comment) and leverages the gadgets (pieces of js code) living in the existing javascript code to transform it into executable code. More for information about DOM Clobbering, here are some references:
[1] https://scnps.co/papers/sp23_domclob.pdf [2] https://research.securitum.com/xss-in-amp4email-dom-clobbering/
Gadgets found in Vite
We have identified a DOM Clobbering vulnerability in Vite bundled scripts, particularly when the scripts dynamically import other scripts from the assets folder and the developer sets the build output format to cjs, iife, or umd. In such cases, Vite replaces relative paths starting with __VITE_ASSET__ using the URL retrieved from document.currentScript.
However, this implementation is vulnerable to a DOM Clobbering attack. The document.currentScript lookup can be shadowed by an attacker via the browser's named DOM tree element access mechanism. This manipulation allows an attacker to replace the intended script element with a malicious HTML element. When this happens, the src attribute of the attacker-controlled element is used as the URL for importing scripts, potentially leading to the dynamic loading of scripts from an attacker-controlled server.
const relativeUrlMechanisms = {
amd: (relativePath) => {
if (relativePath[0] !== ".") relativePath = "./" + relativePath;
return getResolveUrl(
`require.toUrl('${escapeId(relativePath)}'), document.baseURI`
);
},
cjs: (relativePath) => `(typeof document === 'undefined' ? ${getFileUrlFromRelativePath(
relativePath
)} : ${getRelativeUrlFromDocument(relativePath)})`,
es: (relativePath) => getResolveUrl(
`'${escapeId(partialEncodeURIPath(relativePath))}', import.meta.url`
),
iife: (relativePath) => getRelativeUrlFromDocument(relativePath),
// NOTE: make sure rollup generate `module` params
system: (relativePath) => getResolveUrl(
`'${escapeId(partialEncodeURIPath(relativePath))}', module.meta.url`
),
umd: (relativePath) => `(typeof document === 'undefined' && typeof location === 'undefined' ? ${getFileUrlFromRelativePath(
relativePath
)} : ${getRelativeUrlFromDocument(relativePath, true)})`
};
PoC
Considering a website that contains the following main.js script, the devloper decides to use the Vite to bundle up the program with the following configuration.
// main.js
import extraURL from './extra.js?url'
var s = document.createElement('script')
s.src = extraURL
document.head.append(s)
// extra.js
export default "https://myserver/justAnOther.js"
// vite.config.js
import { defineConfig } from 'vite'
export default defineConfig({
build: {
assetsInlineLimit: 0, // To avoid inline assets for PoC
rollupOptions: {
output: {
format: "cjs"
},
},
},
base: "./",
});
After running the build command, the developer will get following bundle as the output.
// dist/index-DDmIg9VD.js
"use strict";const t=""+(typeof document>"u"?require("url").pathToFileURL(__dirname+"/extra-BLVEx9Lb.js").href:new URL("extra-BLVEx9Lb.js",document.currentScript&&document.currentScript.src||document.baseURI).href);var e=document.createElement("script");e.src=t;document.head.append(e);
Adding the Vite bundled script, dist/index-DDmIg9VD.js, as part of the web page source code, the page could load the extra.js file from the attacker's domain, attacker.controlled.server. The attacker only needs to insert an img tag with the name attribute set to currentScript. This can be done through a website's feature that allows users to embed certain script-less HTML (e.g., markdown renderers, web email clients, forums) or via an HTML injection vulnerability in third-party JavaScript loaded on the page.
<!DOCTYPE html>
<html>
<head>
<title>Vite Example</title>
<!-- Attacker-controlled Script-less HTML Element starts--!>
<img name="currentScript" src="https://attacker.controlled.server/"></img>
<!-- Attacker-controlled Script-less HTML Element ends--!>
</head>
<script type="module" crossorigin src="/assets/index-DDmIg9VD.js"></script>
<body>
</body>
</html>
Impact
This vulnerability can result in cross-site scripting (XSS) attacks on websites that include Vite-bundled files (configured with an output format of cjs, iife, or umd) and allow users to inject certain scriptless HTML tags without properly sanitizing the name or id attributes.
Patch
// https://github.com/vitejs/vite/blob/main/packages/vite/src/node/build.ts#L1296
const getRelativeUrlFromDocument = (relativePath: string, umd = false) =>
getResolveUrl(
`'${escapeId(partialEncodeURIPath(relativePath))}', ${
umd ? `typeof document === 'undefined' ? location.href : ` : ''
}document.currentScript && document.currentScript.tagName.toUpperCase() === 'SCRIPT' && document.currentScript.src || document.baseURI`,
)
CVE-2025-24010
Summary
Vite allowed any websites to send any requests to the development server and read the response due to default CORS settings and lack of validation on the Origin header for WebSocket connections.
[!WARNING] This vulnerability even applies to users that only run the Vite dev server on the local machine and does not expose the dev server to the network.
Upgrade Path
Users that does not match either of the following conditions should be able to upgrade to a newer version of Vite that fixes the vulnerability without any additional configuration.
- Using the backend integration feature
- Using a reverse proxy in front of Vite
- Accessing the development server via a domain other than
localhostor*.localhost - Using a plugin / framework that connects to the WebSocket server on their own from the browser
Using the backend integration feature
If you are using the backend integration feature and not setting server.origin, you need to add the origin of the backend server to the server.cors.origin option. Make sure to set a specific origin rather than *, otherwise any origin can access your development server.
Using a reverse proxy in front of Vite
If you are using a reverse proxy in front of Vite and sending requests to Vite with a hostname other than localhost or *.localhost, you need to add the hostname to the new server.allowedHosts option. For example, if the reverse proxy is sending requests to http://vite:5173, you need to add vite to the server.allowedHosts option.
Accessing the development server via a domain other than localhost or *.localhost
You need to add the hostname to the new server.allowedHosts option. For example, if you are accessing the development server via http://foo.example.com:8080, you need to add foo.example.com to the server.allowedHosts option.
Using a plugin / framework that connects to the WebSocket server on their own from the browser
If you are using a plugin / framework, try upgrading to a newer version of Vite that fixes the vulnerability. If the WebSocket connection appears not to be working, the plugin / framework may have a code that connects to the WebSocket server on their own from the browser.
In that case, you can either:
- fix the plugin / framework code to the make it compatible with the new version of Vite
- set
legacy.skipWebSocketTokenCheck: trueto opt-out the fix for [2] while the plugin / framework is incompatible with the new version of Vite- When enabling this option, make sure that you are aware of the security implications described in the impact section of [2] above.
Mitigation without upgrading Vite
[1]: Permissive default CORS settings
Set server.cors to false or limit server.cors.origin to trusted origins.
[2]: Lack of validation on the Origin header for WebSocket connections
There aren't any mitigations for this.
[3]: Lack of validation on the Host header for HTTP requests
Use Chrome 94+ or use HTTPS for the development server.
Details
There are three causes that allowed malicious websites to send any requests to the development server:
[1]: Permissive default CORS settings
Vite sets the Access-Control-Allow-Origin header depending on server.cors option. The default value was true which sets Access-Control-Allow-Origin: *. This allows websites on any origin to fetch contents served on the development server.
Attack scenario:
- The attacker serves a malicious web page (
http://malicious.example.com). - The user accesses the malicious web page.
- The attacker sends a
fetch('http://127.0.0.1:5173/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. - The attacker gets the content of
http://127.0.0.1:5173/main.js.
[2]: Lack of validation on the Origin header for WebSocket connections
Vite starts a WebSocket server to handle HMR and other functionalities. This WebSocket server did not perform validation on the Origin header and was vulnerable to Cross-Site WebSocket Hijacking (CSWSH) attacks. With that attack, an attacker can read and write messages on the WebSocket connection. Vite only sends some information over the WebSocket connection (list of the file paths that changed, the file content where the errored happened, etc.), but plugins can send arbitrary messages and may include more sensitive information.
Attack scenario:
- The attacker serves a malicious web page (
http://malicious.example.com). - The user accesses the malicious web page.
- The attacker runs
new WebSocket('http://127.0.0.1:5173', 'vite-hmr')by JS in that malicious web page. - The user edits some files.
- Vite sends some HMR messages over WebSocket.
- The attacker gets the content of the HMR messages.
[3]: Lack of validation on the Host header for HTTP requests
Unless server.https is set, Vite starts the development server on HTTP. Non-HTTPS servers are vulnerable to DNS rebinding attacks without validation on the Host header. But Vite did not perform validation on the Host header. By exploiting this vulnerability, an attacker can send arbitrary requests to the development server bypassing the same-origin policy.
- The attacker serves a malicious web page that is served on HTTP (
http://malicious.example.com:5173) (HTTPS won't work). - The user accesses the malicious web page.
- The attacker changes the DNS to point to 127.0.0.1 (or other private addresses).
- The attacker sends a
fetch('/main.js')request by JS in that malicious web page. - The attacker gets the content of
http://127.0.0.1:5173/main.jsbypassing the same origin policy.
Impact
[1]: Permissive default CORS settings
Users with the default server.cors option may:
- get the source code stolen by malicious websites
- give the attacker access to functionalities that are not supposed to be exposed externally
- Vite core does not have any functionality that causes changes somewhere else when receiving a request, but plugins may implement those functionalities and servers behind
server.proxymay have those functionalities.
- Vite core does not have any functionality that causes changes somewhere else when receiving a request, but plugins may implement those functionalities and servers behind
[2]: Lack of validation on the Origin header for WebSocket connections
All users may get the file paths of the files that changed and the file content where the error happened be stolen by malicious websites.
For users that is using a plugin that sends messages over WebSocket, that content may be stolen by malicious websites.
For users that is using a plugin that has a functionality that is triggered by messages over WebSocket, that functionality may be exploited by malicious websites.
[3]: Lack of validation on the Host header for HTTP requests
Users using HTTP for the development server and using a browser that is not Chrome 94+ may:
- get the source code stolen by malicious websites
- give the attacker access to functionalities that are not supposed to be exposed externally
- Vite core does not have any functionality that causes changes somewhere else when receiving a request, but plugins may implement those functionalities and servers behind
server.proxymay have those functionalities.
- Vite core does not have any functionality that causes changes somewhere else when receiving a request, but plugins may implement those functionalities and servers behind
Chrome 94+ users are not affected for [3], because sending a request to a private network page from public non-HTTPS page is forbidden since Chrome 94.
Related Information
Safari has a bug that blocks requests to loopback addresses from HTTPS origins. This means when the user is using Safari and Vite is listening on lookback addresses, there's another condition of "the malicious web page is served on HTTP" to make [1] and [2] to work.
PoC
[2]: Lack of validation on the Origin header for WebSocket connections
- I used the
reacttemplate which utilizes HMR functionality.
npm create vite@latest my-vue-app-react -- --template react
- Then on a malicious server, serve the following POC html:
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8" />
<title>vite CSWSH</title>
</head>
<body>
<div id="logs"></div>
<script>
const div = document.querySelectorAll('#logs')[0];
const ws = new WebSocket('ws://localhost:5173','vite-hmr');
ws.onmessage = event => {
const logLine = document.createElement('p');
logLine.innerHTML = event.data;
div.append(logLine);
};
</script>
</body>
</html>
- Kick off Vite
npm run dev
- Load the development server (open
http://localhost:5173/) as well as the malicious page in the browser. - Edit
src/App.jsxfile and intentionally place a syntax error - Notice how the malicious page can view the websocket messages and a snippet of the source code is exposed
Here's a video demonstrating the POC:
https://github.com/user-attachments/assets/a4ad05cd-0b34-461c-9ff6-d7c8663d6961
Release Notes
vitejs/vite (vite)
v6.0.9
- fix!: check host header to prevent DNS rebinding attacks and introduce
server.allowedHosts(bd896fb) - fix!: default
server.cors: falseto disallow fetching from untrusted origins (b09572a) - fix: verify token for HMR WebSocket connection (029dcd6)
v6.0.8
- fix: avoid SSR HMR for HTML files (#19193) (3bd55bc), closes #19193
- fix: build time display 7m 60s (#19108) (cf0d2c8), closes #19108
- fix: don't resolve URL starting with double slash (#19059) (35942cd), closes #19059
- fix: ensure
server.close()only called once (#19204) (db81c2d), closes #19204 - fix: resolve.conditions in ResolvedConfig was
defaultServerConditions(#19174) (ad75c56), closes #19174 - fix: tree shake stringified JSON imports (#19189) (f2aed62), closes #19189
- fix: use shared sigterm callback (#19203) (47039f4), closes #19203
- fix(deps): update all non-major dependencies (#19098) (8639538), closes #19098
- fix(optimizer): use correct default install state path for yarn PnP (#19119) (e690d8b), closes #19119
- fix(types): improve
ESBuildOptions.include / excludetype to allowreadonly (string | RegExp)[](ea53e70), closes #19146 - chore(deps): update dependency pathe to v2 (#19139) (71506f0), closes #19139
v6.0.7
- fix: fix
minifywhenbuilder.sharedPlugins: true(#19025) (f7b1964), closes #19025 - fix: skip the plugin if it has been called before with the same id and importer (#19016) (b178c90), closes #19016
- fix(html): error while removing
vite-ignoreattribute for inline script (#19062) (a492253), closes #19062 - fix(ssr): fix semicolon injection by ssr transform (#19097) (1c102d5), closes #19097
- perf: skip globbing for static path in warmup (#19107) (677508b), closes #19107
- feat(css): show lightningcss warnings (#19076) (b07c036), closes #19076
v6.0.6
- fix: replace runner-side path normalization with
fetchModule-side resolve (#18361) (9f10261), closes #18361 - fix(css): resolve style tags in HTML files correctly for lightningcss (#19001) (afff05c), closes #19001
- fix(css): show correct error when unknown placeholder is used for CSS modules pattern in lightningcs (9290d85), closes #19070
- fix(resolve): handle package.json with UTF-8 BOM (#19000) (902567a), closes #19000
- fix(ssrTransform): preserve line offset when transforming imports (#19004) (1aa434e), closes #19004
- chore: fix typo in comment (#19067) (eb06ec3), closes #19067
- chore: update comment about
build.target(#19047) (0e9e81f), closes #19047 - revert: unpin esbuild version (#19043) (8bfe247), closes #19043
- test(ssr): test virtual module with query (#19044) (a1f4b46), closes #19044
v6.0.5
v6.0.4
- fix:
this.resolveskipSelf should not skip for differentidorimport(#18903) (4727320), closes #18903 - fix: fallback terser to main thread when function options are used (#18987) (12b612d), closes #18987
- fix: merge client and ssr values for
pluginContainer.getModuleInfo(#18895) (258cdd6), closes #18895 - fix(css): escape double quotes in
url()when lightningcss is used (#18997) (3734f80), closes #18997 - fix(css): root relative import in sass modern API on Windows (#18945) (c4b532c), closes #18945
- fix(css): skip non css in custom sass importer (#18970) (21680bd), closes #18970
- fix(deps): update all non-major dependencies (#18967) (d88d000), closes #18967
- fix(deps): update all non-major dependencies (#18996) (2b4f115), closes #18996
- fix(optimizer): keep NODE_ENV as-is when keepProcessEnv is
true(#18899) (8a6bb4e), closes #18899 - fix(ssr): recreate ssrCompatModuleRunner on restart (#18973) (7d6dd5d), closes #18973
- chore: better validation error message for dts build (#18948) (63b82f1), closes #18948
- chore(deps): update all non-major dependencies (#18916) (ef7a6a3), closes #18916
- chore(deps): update dependency @rollup/plugin-node-resolve to v16 (#18968) (62fad6d), closes #18968
- refactor: make internal invoke event to use the same interface with
handleInvoke(#18902) (27f691b), closes #18902 - refactor: simplify manifest plugin code (#18890) (1bfe21b), closes #18890
- test: test
ModuleRunnerTransportinvokeAPI (#18865) (e5f5301), closes #18865 - test: test output hash changes (#18898) (bfbb130), closes #18898
v6.0.3
- fix: handle postcss load unhandled rejections (#18886) (d5fb653), closes #18886
- fix: make handleInvoke interface compatible with invoke (#18876) (a1dd396), closes #18876
- fix: make result interfaces for
ModuleRunnerTransport#invokemore explicit (#18851) (a75fc31), closes #18851 - fix: merge
environments.ssr.resolvewith rootssrconfig (#18857) (3104331), closes #18857 - fix: no permission to create vite config file (#18844) (ff47778), closes #18844
- fix: remove CSS import in CJS correctly in some cases (#18885) (690a36f), closes #18885
- fix(config): bundle files referenced with imports field (#18887) (2b5926a), closes #18887
- fix(config): make stacktrace path correct when sourcemap is enabled (#18833) (20fdf21), closes #18833
- fix(css): rewrite url when image-set and url exist at the same time (#18868) (d59efd8), closes #18868
- fix(deps): update all non-major dependencies (#18853) (5c02236), closes #18853
- fix(html): allow unexpected question mark in tag name (#18852) (1b54e50), closes #18852
- fix(module-runner): decode uri for file url passed to import (#18837) (88e49aa), closes #18837
- refactor: fix logic errors found by no-unnecessary-condition rule (#18891) (ea802f8), closes #18891
- chore: fix duplicate attributes issue number in comment (#18860) (ffee618), closes #18860
v6.0.2
- chore: run typecheck in unit tests (#18858) (49f20bb), closes #18858
- chore: update broken links in changelog (#18802) (cb754f8), closes #18802
- chore: update broken links in changelog (#18804) (47ec49f), closes #18804
- fix: don't store temporary vite config file in
node_modulesif deno (#18823) (a20267b), closes #18823 - fix(css): referencing aliased svg asset with lightningcss enabled errored (#18819) (ae68958), closes #18819
- fix(manifest): use
style.cssas a key for the style file forcssCodesplit: false(#18820) (ec51115), closes #18820 - fix(optimizer): resolve all promises when cancelled (#18826) (d6e6194), closes #18826
- fix(resolve): don't set builtinModules to
externalby default (#18821) (2250ffa), closes #18821 - fix(ssr): set
ssr.target: 'webworker'defaults as fallback (#18827) (b39e696), closes #18827 - feat(css): format lightningcss error (#18818) (dac7992), closes #18818
- refactor: make properties of ResolvedServerOptions and ResolvedPreviewOptions required (#18796) (51a5569), closes #18796
v6.0.1
- fix:
preview.allowedHostswith specific values was not respected (#19246) (aeb3ec8), closes #19246 - fix: allow CORS from loopback addresses by default (#19249) (3d03899), closes #19249
v6.0.0

Today, we're taking another big step in Vite's story. The Vite team, contributors, and ecosystem partners are excited to announce the release of the next Vite major:
- Vite 6.0 announcement blog post
- Docs
- Translations: 简体中文, 日本語, Español, Português, 한국어, Deutsch
- Migration Guide
We want to thank the more than 1K contributors to Vite Core and the maintainers and contributors of Vite plugins, integrations, tools, and translations that have helped us craft this new major. We invite you to get involved and help us improve Vite for the whole ecosystem. Learn more at our Contributing Guide.
Breaking Changes
- feat!: drop node 21 support in version ranges (#18729) (a384d8f), closes #18729
- fix(deps)!: update dependency dotenv-expand to v12 (#18697) (0c658de), closes #18697
- feat(html)!: support more asset sources (#11138) (8a7af50), closes #11138
- feat(resolve)!: allow removing conditions (#18395) (d002e7d), closes #18395
- refactor!: remove fs.cachedChecks option (#18493) (94b0857), closes #18493
- feat!: proxy bypass with WebSocket (#18070) (3c9836d), closes #18070
- feat!: support
file://resolution (#18422) (6a7e313), closes #18422 - feat!: update to chokidar v4 (#18453) (192d555), closes #18453
- feat(lib)!: use package name for css output file name (#18488) (61cbf6f), closes #18488
- fix(css)!: remove default import in ssr dev (#17922) (eccf663), closes #17922
- chore(deps)!: update postcss-load-config to v6 (#15235) (3a27f62), closes #15235
- feat(css)!: change default sass api to modern/modern-compiler (#17937) (d4e0442), closes #17937
- feat(css)!: load postcss config within workspace root only (#18440) (d23a493), closes #18440
- feat(json)!: add
json.stringify: 'auto'and make that the default (#18303) (b80daa7), closes #18303 - fix!: default
build.cssMinifyto'esbuild'for SSR (#15637) (f1d3bf7), closes #15637 - chore(deps)!: migrate
fast-globtotinyglobby(#18243) (6f74a3a), closes #18243 - refactor!: bump minimal terser version to 5.16.0 (#18209) (19ce525), closes #18209
- feat!: Environment API (#16471) (242f550), closes #16471
Features
- feat: add support for .cur type (#18680) (5ec9eed), closes #18680
- feat: enable HMR by default on ModuleRunner side (#18749) (4d2abc7), closes #18749
- feat: support
module-synccondition when loading config if enabled (#18650) (cf5028d), closes #18650 - feat: add
isSsrTargetWebWorkerflag toconfigEnvironmenthook (#18620) (3f5fab0), closes #18620 - feat: add
ssr.resolve.mainFieldsoption (#18646) (a6f5f5b), closes #18646 - feat: expose default mainFields/conditions (#18648) (c12c653), closes #18648
- feat: extended applyToEnvironment and perEnvironmentPlugin (#18544) (8fa70cd), closes #18544
- feat: show error when accessing variables not exposed in CJS build (#18649) (87c5502), closes #18649
- feat(optimizer): allow users to specify their esbuild
platformoption (#18611) (0924879), closes #18611 - refactor: introduce
mergeWithDefaultsand organize how default values for config options are set ( (0e1f437), closes #18550 - build: ignore cjs warning (#18660) (33b0d5a), closes #18660
- feat: use a single transport for fetchModule and HMR support (#18362) (78dc490), closes #18362
- feat(asset): add
?inlineand?no-inlinequeries to control inlining (#15454) (9162172), closes #15454 - feat(asset): inline svg in dev if within limit (#18581) (f08b146), closes #18581
- feat: log complete config in debug mode (#18289) ([04f6736](https://redirect.github.com/vitejs/vite/commit/04f6736fd7ac3da22141929c01a151f5a6fe4e45
Configuration
📅 Schedule: Branch creation - "" (UTC), Automerge - At any time (no schedule defined).
🚦 Automerge: Disabled by config. Please merge this manually once you are satisfied.
♻ Rebasing: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox.
🔕 Ignore: Close this PR and you won't be reminded about this update again.
- [ ] If you want to rebase/retry this PR, check this box
This PR was generated by Mend Renovate. View the repository job log.
⚠️ Artifact update problem
Renovate failed to update an artifact related to this branch. You probably do not want to merge this PR as-is.
♻ Renovate will retry this branch, including artifacts, only when one of the following happens:
- any of the package files in this branch needs updating, or
- the branch becomes conflicted, or
- you click the rebase/retry checkbox if found above, or
- you rename this PR's title to start with "rebase!" to trigger it manually
The artifact failure details are included below:
File name: package-lock.json
npm ERR! code ERESOLVE
npm ERR! ERESOLVE could not resolve
npm ERR!
npm ERR! While resolving: @vitejs/[email protected]
npm ERR! Found: [email protected]
npm ERR! node_modules/vite
npm ERR! dev vite@"^6.0.0" from the root project
npm ERR! peer vite@">=2.9.0" from @crxjs/[email protected]
npm ERR! node_modules/@crxjs/vite-plugin
npm ERR! dev @crxjs/vite-plugin@"^1.0.13" from the root project
npm ERR! 3 more (vite-node, vitest, @vitest/mocker)
npm ERR!
npm ERR! Could not resolve dependency:
npm ERR! peer vite@"^3.0.0" from @vitejs/[email protected]
npm ERR! node_modules/@vitejs/plugin-react
npm ERR! dev @vitejs/plugin-react@"^2.0.0" from the root project
npm ERR! optional @vitejs/plugin-react@">=1.2.0" from @crxjs/[email protected]
npm ERR! node_modules/@crxjs/vite-plugin
npm ERR! dev @crxjs/vite-plugin@"^1.0.13" from the root project
npm ERR!
npm ERR! Conflicting peer dependency: [email protected]
npm ERR! node_modules/vite
npm ERR! peer vite@"^3.0.0" from @vitejs/[email protected]
npm ERR! node_modules/@vitejs/plugin-react
npm ERR! dev @vitejs/plugin-react@"^2.0.0" from the root project
npm ERR! optional @vitejs/plugin-react@">=1.2.0" from @crxjs/[email protected]
npm ERR! node_modules/@crxjs/vite-plugin
npm ERR! dev @crxjs/vite-plugin@"^1.0.13" from the root project
npm ERR!
npm ERR! Fix the upstream dependency conflict, or retry
npm ERR! this command with --force, or --legacy-peer-deps
npm ERR! to accept an incorrect (and potentially broken) dependency resolution.
npm ERR!
npm ERR! See /runner/cache/others/npm/eresolve-report.txt for a full report.
npm ERR! A complete log of this run can be found in:
npm ERR! /runner/cache/others/npm/_logs/2025-12-03T17_50_13_022Z-debug-0.log
The latest updates on your projects. Learn more about Vercel for GitHub.
| Project | Deployment | Preview | Comments | Updated (UTC) |
|---|---|---|---|---|
| crx-gcal-url-opener | Sep 11, 2025 8:51am |