diff --git a/packages/create-vite/src/index.ts b/packages/create-vite/src/index.ts index 4dea8c453cef2f..be300738573fa3 100755 --- a/packages/create-vite/src/index.ts +++ b/packages/create-vite/src/index.ts @@ -850,7 +850,9 @@ import babel from '@rolldown/plugin-babel'`, ) updateReactCompilerReadme( root, - 'The React Compiler is enabled on this template. See [this documentation](https://react.dev/learn/react-compiler) for more information.\n\nNote: This will impact Vite dev & build performances.', + 'The React Compiler is enabled on this template. See [this documentation](https://react.dev/learn/react-compiler) for more information.\n\n' + + 'Note: This will impact Vite dev & build performances.\n' + + 'You can also try [the experimental native React Compiler support in plugin-react](https://github.com/vitejs/vite-plugin-react/blob/main/packages/plugin-react/README.md#rust-react-compiler) by using `compiler: true` in the plugin options instead of using the Babel plugin.', ) } diff --git a/packages/vite/CHANGELOG.md b/packages/vite/CHANGELOG.md index 0133e1c3e090d2..d25e3ce70e646e 100644 --- a/packages/vite/CHANGELOG.md +++ b/packages/vite/CHANGELOG.md @@ -1,3 +1,48 @@ +## [8.2.2](https://github.com/vitejs/vite/compare/v8.2.1...v8.2.2) (2026-08-20) +### Features + +* **deps:** widen `@vitejs/devtools` peer range to v0.5.0 ([#23302](https://github.com/vitejs/vite/issues/23302)) ([495d9ff](https://github.com/vitejs/vite/commit/495d9ff5a7d843ca876a9e49799947a5deb704c7)) + +### Bug Fixes + +* **bundled-dev:** handle lazy request error ([#23291](https://github.com/vitejs/vite/issues/23291)) ([3ba026d](https://github.com/vitejs/vite/commit/3ba026dade4af56df08815310d3458fa110f5c5c)) +* **bundled-dev:** hot update through circular imports instead of reloading ([#23259](https://github.com/vitejs/vite/issues/23259)) ([3dbddef](https://github.com/vitejs/vite/commit/3dbddefaafc091a879b06f9279296f776691e455)) +* **config:** resolve sourcemap paths against sourcemap location ([#23239](https://github.com/vitejs/vite/issues/23239)) ([05a003e](https://github.com/vitejs/vite/commit/05a003e6a17a84d75f907ea0f1598bc39b8dce6c)) +* **css:** don't pass empty targets to lightningcss ([#23295](https://github.com/vitejs/vite/issues/23295)) ([2804636](https://github.com/vitejs/vite/commit/2804636ff608d105928009d274ffba7cfbe55340)) +* **define:** fix match escaped dots to support $-prefixed define keys ([#23249](https://github.com/vitejs/vite/issues/23249)) ([dcf88bd](https://github.com/vitejs/vite/commit/dcf88bd2ad2b1a8845f9029587cc8c825e382d42)) +* **deps:** update all non-major dependencies ([#23217](https://github.com/vitejs/vite/issues/23217)) ([ba958bd](https://github.com/vitejs/vite/commit/ba958bddfc9cabe302c6b34269dcf5c9634531e0)) +* **deps:** update rolldown-related dependencies ([#23218](https://github.com/vitejs/vite/issues/23218)) ([83ecb2c](https://github.com/vitejs/vite/commit/83ecb2c8059e8ce946a7cc835d4c14ef78aef4fd)) +* **module-runner:** exclude completed modules from in-flight cycle detection (fix [#22999](https://github.com/vitejs/vite/issues/22999)) ([#23009](https://github.com/vitejs/vite/issues/23009)) ([d9b10a9](https://github.com/vitejs/vite/commit/d9b10a98db1c293ee64300bd75d568b44c8ae931)) +* **optimizer:** close custom extension analysis bundles ([#23207](https://github.com/vitejs/vite/issues/23207)) ([8fb7675](https://github.com/vitejs/vite/commit/8fb76752836f61224d3095b502fa237b478a06b2)) +* reduce Windows 8.3-short-name detection false-positives ([#23066](https://github.com/vitejs/vite/issues/23066)) ([02cffa9](https://github.com/vitejs/vite/commit/02cffa9e2d38d5d8f12e4043ee9d0f7abb1471e2)) +* respect `resolve.preserveSymlinks` when resolving root (fix [#23197](https://github.com/vitejs/vite/issues/23197)) ([#23198](https://github.com/vitejs/vite/issues/23198)) ([8413052](https://github.com/vitejs/vite/commit/8413052731836d4aaf3eb94a0f25788dd35d2888)) +* **ssr:** rewrite computed key of destructing parameter ([#23307](https://github.com/vitejs/vite/issues/23307)) ([9db0b61](https://github.com/vitejs/vite/commit/9db0b61d4c9c7caad7ea1d9670b637faf2bb6c93)) +* **vite:** update outdated upstream file links in license comments ([#23285](https://github.com/vitejs/vite/issues/23285)) ([c0f2fc6](https://github.com/vitejs/vite/commit/c0f2fc607ee97ee4499337b04826420c00654065)) + +### Documentation + +* **build:** note cssTarget precedence ([#23200](https://github.com/vitejs/vite/issues/23200)) ([a20a35e](https://github.com/vitejs/vite/commit/a20a35ec0685e374519864d0f41dd5f6e9ba0271)) + +### Miscellaneous Chores + +* fix ts errors in build test cases ([#23209](https://github.com/vitejs/vite/issues/23209)) ([a0cfcf7](https://github.com/vitejs/vite/commit/a0cfcf72f8ef8bf0f2f11d553333b9bb31f1d316)) + +### Code Refactoring + +* use JSON import attributes instead of readFileSync in constants ([#23258](https://github.com/vitejs/vite/issues/23258)) ([1d9fa39](https://github.com/vitejs/vite/commit/1d9fa392a43229241f80630236f8552ce8f7cd0f)) +* use named regex constants over inline literals ([#22964](https://github.com/vitejs/vite/issues/22964)) ([5c1c6c6](https://github.com/vitejs/vite/commit/5c1c6c609718303202832f706884192e1f1e9223)) + +### Tests + +* **define:** close rolldown bundler after generate ([#23231](https://github.com/vitejs/vite/issues/23231)) ([b4d66fe](https://github.com/vitejs/vite/commit/b4d66fee14d970f45b8a6f3d7d6aee73ca9b88ab)) +* **module-runner:** add TLA circular import case ([#23299](https://github.com/vitejs/vite/issues/23299)) ([4a261f2](https://github.com/vitejs/vite/commit/4a261f242831bef92afd2f1aacfb81eab9dec371)) +* **module-runner:** simplify server-hmr tests ([#23300](https://github.com/vitejs/vite/issues/23300)) ([599b44b](https://github.com/vitejs/vite/commit/599b44b6600ec426e10cd556908d53b027b0c4fb)) +* **ssr:** add destructing assignment case for moduleRunnerTransform ([#23308](https://github.com/vitejs/vite/issues/23308)) ([cb77e2a](https://github.com/vitejs/vite/commit/cb77e2a93bad2a8ece00b4aa0ef507c092582c45)) + +### Build System + +* use JSON import attributes instead of readFIleSync in rolldown configs ([#23251](https://github.com/vitejs/vite/issues/23251)) ([d615bcd](https://github.com/vitejs/vite/commit/d615bcdb23d96c1ca5ce1ee45e21d8d87381106f)) + ## [8.2.1](https://github.com/vitejs/vite/compare/v8.2.0...v8.2.1) (2026-08-06) ### Bug Fixes diff --git a/packages/vite/package.json b/packages/vite/package.json index e9d41ae722139d..b2052be2a59e4c 100644 --- a/packages/vite/package.json +++ b/packages/vite/package.json @@ -1,6 +1,6 @@ { "name": "vite", - "version": "8.2.1", + "version": "8.2.2", "description": "Native-ESM powered web dev build tool", "keywords": [ "build-tool", diff --git a/packages/vite/src/node/ssr/__tests__/ssrTransform.spec.ts b/packages/vite/src/node/ssr/__tests__/ssrTransform.spec.ts index 59c45c93b16a9c..482608b9232f0f 100644 --- a/packages/vite/src/node/ssr/__tests__/ssrTransform.spec.ts +++ b/packages/vite/src/node/ssr/__tests__/ssrTransform.spec.ts @@ -777,6 +777,63 @@ function c({ _ = bar() + foo() }) {} `) }) +// #23232 +test('function argument destructure with a default parameter', async () => { + expect( + await ssrTransformSimpleCode( + ` +import { key } from 'foo' +function noParameterDefault({ [key]: value = null }) {} +function declaration({ [key]: value = null } = {}) {} +function compound({ [key.name]: value } = {}) {} +const arrow = ({ [key]: value = null } = {}) => {} +function nested({ a: { [key]: value } = {} } = {}) {} +function array([{ [key]: value } = {}] = []) {} +class Foo { method({ [key]: value } = {}) {} } +`, + ), + ).toMatchInlineSnapshot(` + "const __vite_ssr_import_0__ = await __vite_ssr_import__("foo", {"importedNames":["key"]}); + + + function noParameterDefault({ [__vite_ssr_import_0__.key]: value = null }) {} + function declaration({ [__vite_ssr_import_0__.key]: value = null } = {}) {} + function compound({ [__vite_ssr_import_0__.key.name]: value } = {}) {} + const arrow = ({ [__vite_ssr_import_0__.key]: value = null } = {}) => {}; + function nested({ a: { [__vite_ssr_import_0__.key]: value } = {} } = {}) {} + function array([{ [__vite_ssr_import_0__.key]: value } = {}] = []) {} + class Foo { method({ [__vite_ssr_import_0__.key]: value } = {}) {} } + " + `) +}) + +test('function argument destructure with a default parameter preserves shadowing', async () => { + expect( + await ssrTransformSimpleCode( + ` +import { key } from 'foo' +function shorthand({ key } = {}) { return key } +function aliased({ prop: key } = {}) { return key } +function defaulted({ key = 'default' } = {}) { return key } +function array([key] = []) { return key } +function plain(key) { return key } +console.log(key) +`, + ), + ).toMatchInlineSnapshot(` + "const __vite_ssr_import_0__ = await __vite_ssr_import__("foo", {"importedNames":["key"]}); + + + function shorthand({ key } = {}) { return key } + function aliased({ prop: key } = {}) { return key } + function defaulted({ key = 'default' } = {}) { return key } + function array([key] = []) { return key } + function plain(key) { return key } + console.log((0,__vite_ssr_import_0__.key)) + " + `) +}) + test('object destructure alias', async () => { expect( await ssrTransformSimpleCode( @@ -824,6 +881,41 @@ const foo = {} `) }) +test('destructuring assignments', async () => { + expect( + await ssrTransformSimpleCode(` +import { key } from 'foo' +let value +const object = {} +;({ [key]: value = key } = object) +;[value = key] = [] + +function shadowed(key) { + ;({ key } = object) + ;({ alias: key } = object) + ;[key] = [] + return key +} +`), + ).toMatchInlineSnapshot(` + "const __vite_ssr_import_0__ = await __vite_ssr_import__("foo", {"importedNames":["key"]}); + + + let value; + const object = {} + ;({ [__vite_ssr_import_0__.key]: value = __vite_ssr_import_0__.key } = object) + ;[value = __vite_ssr_import_0__.key] = []; + + function shadowed(key) { + ;({ key } = object) + ;({ alias: key } = object) + ;[key] = []; + return key + } + " + `) +}) + test('nested object destructure alias', async () => { expect( await ssrTransformSimpleCode( diff --git a/packages/vite/src/node/ssr/ssrTransform.ts b/packages/vite/src/node/ssr/ssrTransform.ts index 65a5c67da7905d..22a42801679df4 100644 --- a/packages/vite/src/node/ssr/ssrTransform.ts +++ b/packages/vite/src/node/ssr/ssrTransform.ts @@ -575,38 +575,8 @@ function walk( if (node.type === 'FunctionExpression' && node.id) { setScope(node, node.id.name) } - // walk function expressions and add its arguments to known identifiers - // so that we don't prefix them - node.params.forEach((p) => { - if (p.type === 'ObjectPattern' || p.type === 'ArrayPattern') { - handlePattern(p, node) - return - } - ;(eswalk as any)(p.type === 'AssignmentPattern' ? p.left : p, { - enter(child: ESTree.Node, parent: ESTree.Node | undefined) { - // skip params default value of destructure - if ( - parent?.type === 'AssignmentPattern' && - parent.right === child - ) { - return this.skip() - } - if (child.type !== 'Identifier') return - // do not record as scope variable if is a destructuring keyword - if (isStaticPropertyKey(child, parent)) return - // do not record if this is a default value - // assignment of a destructuring variable - if ( - (parent?.type === 'TemplateLiteral' && - parent.expressions.includes(child as ESTree.Expression)) || - (parent?.type === 'CallExpression' && parent.callee === child) - ) { - return - } - setScope(node, child.name) - }, - }) - }) + // add function arguments to known identifiers so that we don't prefix them + node.params.forEach((p) => handlePattern(p, node)) } else if (node.type === 'ClassDeclaration') { // A class declaration name could shadow an import, so add its name to the parent scope const parentScope = findParentScope(parentStack)