feat(rolldown): add isRolldownMagicString property for reliable native detection#8614
Conversation
How to use the Graphite Merge QueueAdd the label graphite: merge-when-ready to this PR to add it to the merge queue. You must have a Graphite account in order to use the merge queue. Sign up using this link. An organization admin has enabled the Graphite Merge Queue in this repository. Please do not merge from GitHub as this will restart CI on PRs being processed by the merge queue. This stack of pull requests is managed by Graphite. Learn more about stacking. |
✅ Deploy Preview for rolldown-rs ready!
To edit notification comments on pull requests, go to your Netlify project configuration. |
There was a problem hiding this comment.
Pull request overview
This PR adds Symbol.toStringTag = 'BindingMagicString' to the BindingMagicString prototype, enabling external packages to reliably detect native instances via obj[Symbol.toStringTag] === 'BindingMagicString' instead of the fragile constructor.name check.
Changes:
- Introduces a new
binding-magic-string.tswrapper module that importsBindingMagicStringfrombinding.cjs, patches its prototype withSymbol.toStringTag, and re-exports it. - Updates all runtime (non-type-only) imports of
BindingMagicStringto use the new wrapper module instead ofbinding.cjsdirectly. - Adds comprehensive tests verifying the
Symbol.toStringTagbehavior on prototypes, instances, and viaObject.prototype.toString.
Reviewed changes
Copilot reviewed 5 out of 5 changed files in this pull request and generated no comments.
Show a summary per file
| File | Description |
|---|---|
packages/rolldown/src/binding-magic-string.ts |
New wrapper module that patches BindingMagicString.prototype[Symbol.toStringTag] and re-exports the class |
packages/rolldown/src/index.ts |
Updates public export to use the patched wrapper module |
packages/rolldown/src/plugin/bindingify-build-hooks.ts |
Updates runtime import to use the patched wrapper module |
packages/rolldown/src/plugin/bindingify-output-hooks.ts |
Updates runtime import to use the patched wrapper module |
packages/rolldown/tests/magic-string/magic-string-to-string-tag.test.ts |
New test file verifying Symbol.toStringTag behavior |
c85fbb4 to
024f0d9
Compare
Merge activity
|
packages/rolldown/tests/magic-string/magic-string-to-string-tag.test.ts
Outdated
Show resolved
Hide resolved
024f0d9 to
afeba2f
Compare
afeba2f to
0c5522e
Compare
0c5522e to
82ddb03
Compare
82ddb03 to
6ac16a2
Compare
…e detection (#8614) ## Summary External packages like `rolldown-string` need to detect native `BindingMagicString` instances, but the existing `obj.constructor.name` check breaks under minification or bundling. This PR adds a reliable `isRolldownMagicString` boolean property to the `BindingMagicString` prototype via `Object.defineProperty` (non-writable, non-configurable). A new `binding-magic-string.ts` module centralizes the patching and re-exports the class with proper TypeScript typings. All internal imports now go through this module to ensure consistency. Tests cover prototype presence, instance access, and detection without importing rolldown. ## Related #7522 🤖 Generated with [Claude Code](https://claude.com/claude-code)
6ac16a2 to
b08184e
Compare
…8626) from #8614 (comment) ## Summary Rename the exported `BindingMagicString` class to `RolldownMagicString` in the public API. Only the exported name is changed — internal TypeScript code continues to use `BindingMagicString` to keep naming consistent with the binding layer. The public rename aligns the class name with its detection flag `isRolldownMagicString` (introduced in #8614). ## Changes - Update the re-export in `packages/rolldown/src/index.ts` - Update test imports to use the new name
## [1.0.0-rc.9] - 2026-03-11 ### 💥 BREAKING CHANGES - rename exported BindingMagicString to RolldownMagicString (#8626) by @IWANABETHATGUY ### 🚀 Features - rolldown: add isRolldownMagicString property for reliable native detection (#8614) by @IWANABETHATGUY - cli: align object type with rollup (#8598) by @h-a-n-a ### 🐛 Bug Fixes - rust: circular inter-chunk imports when external dynamic imports exist (#8596) by @Dunqing - update minify default docs from `false` to `'dce-only'` (#8620) by @shulaoda ### 💼 Other - fix early exit in script build-node (#8617) by @h-a-n-a ### 🚜 Refactor - binding: remove outdated TODO comment in MagicString to_string() (#8613) by @IWANABETHATGUY ### 📚 Documentation - add viteplus alpha announcement banner (#8615) by @mdong1909 - update VitePress theme to 4.8.2 for narrow-screen layout regression (#8612) by @Copilot ### ⚡ Performance - merge 4 integration test binaries into 1 (#8610) by @Boshen ### 🧪 Testing - replace heavy filename_with_hash test with targeted hash fixtures (#8597) by @Boshen ### ⚙️ Miscellaneous Tasks - ci: remove redundant `--no-run` build step from cargo-test (#8623) by @Boshen - rust: use `cargo-shear` to toggle Cargo.toml [lib] test = bool (#8622) by @Boshen - deps: update test262 submodule for tests (#8611) by @sapphi-red - skip macOS CI jobs on pull requests (#8608) by @Copilot - add rust cache to repo validation job (#8607) by @Boshen - skip running empty bin test targets (#8605) by @Boshen - skip building examples in cargo-test to reduce build time (#8603) by @Boshen - switch plain workflow checkouts to taiki-e action (#8601) by @Boshen - skip Windows CI jobs on PRs (#8600) by @Boshen - remove unused asset module (#8594) by @shulaoda ###◀️ Revert - "docs: add viteplus alpha announcement banner (#8615)" (#8616) by @shulaoda Co-authored-by: shulaoda <165626830+shulaoda@users.noreply.github.com>




Summary
External packages like
rolldown-stringneed to detect nativeBindingMagicStringinstances, but the existingobj.constructor.namecheck breaks under minification or bundling. This PR adds a reliableisRolldownMagicStringboolean property to theBindingMagicStringprototype viaObject.defineProperty(non-writable, non-configurable). A newbinding-magic-string.tsmodule centralizes the patching and re-exports the class with proper TypeScript typings. All internal imports now go through this module to ensure consistency. Tests cover prototype presence, instance access, and detection without importing rolldown.Related
#7522
🤖 Generated with Claude Code