Skip to content

fix(ssr): ssrTransform incorrectly rewrites meta identifier inside import.meta when a binding named meta exists#22019

Merged
sapphi-red merged 2 commits intomainfrom
copilot/fix-ssrtransform-import-meta-issue
Mar 25, 2026
Merged

fix(ssr): ssrTransform incorrectly rewrites meta identifier inside import.meta when a binding named meta exists#22019
sapphi-red merged 2 commits intomainfrom
copilot/fix-ssrtransform-import-meta-issue

Conversation

Copy link
Copy Markdown
Contributor

Copilot AI commented Mar 25, 2026

When an imported binding was named meta, ssrTransform would incorrectly replace the meta in import.meta with the import binding accessor, corrupting the output.

Root Cause

isRefIdentifier had no guard for MetaProperty parent nodes. The meta identifier in import.meta has a MetaProperty parent, but the function only excluded MemberExpression non-computed properties — so meta was treated as a rewritable reference.

Fix

  • Added a MetaProperty parent check to isRefIdentifier, returning false to prevent rewriting identifiers that are part of import.meta.
// Before — broken
import { meta } from './meta';
console.log(import.meta.url, `Hello, ${meta}!`);
// Transformed to (wrong):
// console.log(__vite_ssr_import_meta__.url, `Hello, ${__vite_ssr_import_0__.meta}!`)
// ^ meta in import.meta was also getting rewritten incorrectly

// After — correct
// console.log(__vite_ssr_import_meta__.url, `Hello, ${__vite_ssr_import_0__.meta}!`)
Original prompt

This section details on the original issue you should resolve

<issue_title>ssrTransform fails to transform import.meta when there is imported variable named meta</issue_title>
<issue_description>### Describe the bug

ssrTransform fails to transform code below:

import { meta } from './meta';

console.log(import.meta.url, `Hello, ${meta}!`);
Error message
Error: Cannot split a chunk that has already been edited (1:19 – "import.meta")
    at MagicString._splitChunk (file:///home/projects/vitejs-vite-5acvpgpu/node_modules/.pnpm/[email protected]/node_modules/vite/dist/node/chunks/node.js:4738:10)
    at MagicString._split (file:///home/projects/vitejs-vite-5acvpgpu/node_modules/.pnpm/[email protected]/node_modules/vite/dist/node/chunks/node.js:4729:43)
    at MagicString.update (file:///home/projects/vitejs-vite-5acvpgpu/node_modules/.pnpm/[email protected]/node_modules/vite/dist/node/chunks/node.js:4553:8)
    at onIdentifier (file:///home/projects/vitejs-vite-5acvpgpu/node_modules/.pnpm/[email protected]/node_modules/vite/dist/node/chunks/node.js:11324:75)
    at eval (file:///home/projects/vitejs-vite-5acvpgpu/node_modules/.pnpm/[email protected]/node_modules/vite/dist/node/chunks/node.js:11436:37)
    at walk (file:///home/projects/vitejs-vite-5acvpgpu/node_modules/.pnpm/[email protected]/node_modules/vite/dist/node/chunks/node.js:11435:14)
    at ssrTransformScript (file:///home/projects/vitejs-vite-5acvpgpu/node_modules/.pnpm/[email protected]/node_modules/vite/dist/node/chunks/node.js:11301:2)
    at async loadAndTransform (file:///home/projects/vitejs-vite-5acvpgpu/node_modules/.pnpm/[email protected]/node_modules/vite/dist/node/chunks/node.js:24317:64)

Looks like it hits the below s.update(id.start, id.end, binding) call and tries to replace meta in import.meta with something else. Need to handle a MetaProperty parent.

s.update(id.start, id.end, binding)

For context, I encountered this bug while using Storybook Vitest addon.

Reproduction

https://stackblitz.com/edit/vitejs-vite-5acvpgpu?file=repro.ts

Steps to reproduce

vite.config.ts:

import { defineConfig } from "vite";

export default defineConfig({
  environments: {
    ssr: {},
  },
  builder: {
    async buildApp() { }
  }
})

repro.ts:

import { createServer } from "vite"

const server = await createServer()
const result = await server.environments.ssr.transformRequest("src/index.ts");

console.log(result?.code);

await server.close();

src/index.ts:

import { meta } from './meta';

console.log(import.meta.url, `Hello, ${meta}!`);

Run node repro.ts to see the error.

System Info

Both Vite 7 and 8 have this issue.

System:
    OS: Linux 5.0 undefined
    CPU: (8) x64 Intel(R) Core(TM) i9-9880H CPU @ 2.30GHz
    Memory: 0 Bytes / 0 Bytes
    Shell: 1.0 - /bin/jsh
  Binaries:
    Node: 22.22.0 - /usr/local/bin/node
    Yarn: 1.22.19 - /usr/local/bin/yarn
    npm: 10.8.2 - /usr/local/bin/npm
    pnpm: 8.15.6 - /usr/local/bin/pnpm

Used Package Manager

npm

Logs

No response

Validations

Comments on the Issue (you are @copilot in this section)


💬 Send tasks to Copilot coding agent from Slack and Teams to turn conversations into code. Copilot posts an update in your thread when it's finished.

Copilot AI changed the title [WIP] Fix ssrTransform failure with imported variable named meta fix(ssr): ssrTransform incorrectly rewrites meta identifier inside import.meta when a binding named meta exists Mar 25, 2026
Copilot AI requested a review from sapphi-red March 25, 2026 05:24
@sapphi-red sapphi-red added p3-minor-bug An edge case that only affects very specific usage (priority) feat: ssr labels Mar 25, 2026
@sapphi-red sapphi-red marked this pull request as ready for review March 25, 2026 05:58
@sapphi-red sapphi-red merged commit cff5f0c into main Mar 25, 2026
30 of 31 checks passed
@sapphi-red sapphi-red deleted the copilot/fix-ssrtransform-import-meta-issue branch March 25, 2026 06:09
renovate bot added a commit to andrei-picus-tink/auto-renovate that referenced this pull request Mar 31, 2026
| datasource | package | from  | to    |
| ---------- | ------- | ----- | ----- |
| npm        | vite    | 7.3.1 | 8.0.3 |


## [v8.0.3](https://github.com/vitejs/vite/blob/HEAD/packages/vite/CHANGELOG.md#small-803-2026-03-26-small)

##### Features

- update rolldown to 1.0.0-rc.12 ([#22024](vitejs/vite#22024)) ([84164ef](vitejs/vite@84164ef))

##### Bug Fixes

- **html:** cache unfiltered CSS list to prevent missing styles across entries ([#22017](vitejs/vite#22017)) ([5464190](vitejs/vite@5464190))
- **module-runner:** handle non-ascii characters in base64 sourcemaps ([#21985](vitejs/vite#21985)) ([77c95bf](vitejs/vite@77c95bf))
- **module-runner:** skip re-import if the runner is closed ([#22020](vitejs/vite#22020)) ([ee2c2cd](vitejs/vite@ee2c2cd))
- **optimizer:** scan is not resolving sub path import if used in a glob import ([#22018](vitejs/vite#22018)) ([ddfe20d](vitejs/vite@ddfe20d))
- **ssr:** ssrTransform incorrectly rewrites `meta` identifier inside `import.meta` when a binding named `meta` exists ([#22019](vitejs/vite#22019)) ([cff5f0c](vitejs/vite@cff5f0c))

##### Miscellaneous Chores

- **deps:** bump picomatch from 4.0.3 to 4.0.4 ([#22027](vitejs/vite#22027)) ([7e56003](vitejs/vite@7e56003))

##### Tests

- **html:** add tests for `getCssFilesForChunk` ([#22016](vitejs/vite#22016)) ([43fbbf9](vitejs/vite@43fbbf9))


## [v8.0.2](https://github.com/vitejs/vite/blob/HEAD/packages/vite/CHANGELOG.md#small-802-2026-03-23-small)

##### Features

- update rolldown to 1.0.0-rc.11 ([#21998](vitejs/vite#21998)) ([ff91c31](vitejs/vite@ff91c31))

##### Bug Fixes

- **deps:** update all non-major dependencies ([#21988](vitejs/vite#21988)) ([9b7d150](vitejs/vite@9b7d150))

##### Miscellaneous Chores

- **deps:** update dependency [@vitejs/devtools](https://github.com/vitejs/devtools) to ^0.1.5 ([#21992](vitejs/vite#21992)) ([b2dd65b](vitejs/vite@b2dd65b))


## [v8.0.1](https://github.com/vitejs/vite/blob/HEAD/packages/vite/CHANGELOG.md#small-801-2026-03-19-small)

##### Features

- update rolldown to 1.0.0-rc.10 ([#21932](vitejs/vite#21932)) ([b3c067d](vitejs/vite@b3c067d))

##### Bug Fixes

- **bundled-dev:** properly disable `inlineConst` optimization ([#21865](vitejs/vite#21865)) ([6d97142](vitejs/vite@6d97142))
- **css:** lightningcss minify failed when `build.target: 'es6'` ([#21933](vitejs/vite#21933)) ([5fcce46](vitejs/vite@5fcce46))
- **deps:** update all non-major dependencies ([#21878](vitejs/vite#21878)) ([6dbbd7f](vitejs/vite@6dbbd7f))
- **dev:** always use ESM Oxc runtime ([#21829](vitejs/vite#21829)) ([d323ed7](vitejs/vite@d323ed7))
- **dev:** handle concurrent restarts in `_createServer` ([#21810](vitejs/vite#21810)) ([40bc729](vitejs/vite@40bc729))
- handle `+` symbol in package subpath exports during dep optimization ([#21886](vitejs/vite#21886)) ([86db93d](vitejs/vite@86db93d))
- improve `no-cors` request block error ([#21902](vitejs/vite#21902)) ([5ba688b](vitejs/vite@5ba688b))
- use precise regexes for transform filter to avoid backtracking ([#21800](vitejs/vite#21800)) ([dbe41bd](vitejs/vite@dbe41bd))
- **worker:** `require(json)` result should not be wrapped ([#21847](vitejs/vite#21847)) ([0672fd2](vitejs/vite@0672fd2))
- **worker:** make worker output consistent with client and SSR ([#21871](vitejs/vite#21871)) ([69454d7](vitejs/vite@69454d7))

##### Miscellaneous Chores

- add changelog rearrange script ([#21835](vitejs/vite#21835)) ([efef073](vitejs/vite@efef073))
- **deps:** bump required `@vitejs/devtools` version to 0.1+ ([#21925](vitejs/vite#21925)) ([12932f5](vitejs/vite@12932f5))
- **deps:** update rolldown-related dependencies ([#21787](vitejs/vite#21787)) ([1af1d3a](vitejs/vite@1af1d3a))
- rearrange 8.0 changelog ([8e05b61](vitejs/vite@8e05b61))
- rearrange 8.0 changelog ([#21834](vitejs/vite#21834)) ([86edeee](vitejs/vite@86edeee))


## [v8.0.0](https://github.com/vitejs/vite/blob/HEAD/packages/vite/CHANGELOG.md#800-2026-03-12)

##### Features

- update rolldown to 1.0.0-rc.9 ([#21813](vitejs/vite#21813)) ([f05be0e](vitejs/vite@f05be0e))
- warn when `vite-tsconfig-paths` plugin is detected ([#21781](vitejs/vite#21781)) ([ada493e](vitejs/vite@ada493e))

##### Bug Fixes

- **deps:** update all non-major dependencies ([#21786](vitejs/vite#21786)) ([eaa4352](vitejs/vite@eaa4352))
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

feat: ssr p3-minor-bug An edge case that only affects very specific usage (priority)

Projects

None yet

Development

Successfully merging this pull request may close these issues.

ssrTransform fails to transform import.meta when there is imported variable named meta

2 participants