feat: warn when both code and postBanner contain shebang#8039
feat: warn when both code and postBanner contain shebang#8039graphite-app[bot] merged 1 commit intomainfrom
Conversation
✅ Deploy Preview for rolldown-rs canceled.
|
crates/rolldown_error/src/build_diagnostic/events/duplicate_shebang.rs
Outdated
Show resolved
Hide resolved
packages/rolldown/tests/fixtures/function/post-banner/duplicate-shebang/_config.ts
Outdated
Show resolved
Hide resolved
|
@copilot run format |
There was a problem hiding this comment.
Pull request overview
Adds a new warning to help users avoid generating invalid output when both the original source and output.postBanner contain a shebang (multiple shebangs in one file cause a syntax error).
Changes:
- Introduces a new
DUPLICATE_SHEBANGwarning event kind and diagnostic. - Updates
post_banner_footerto detect duplicate shebangs and return warnings to the generate pipeline. - Adds an integration fixture covering the duplicate-shebang scenario.
Reviewed changes
Copilot reviewed 8 out of 8 changed files in this pull request and generated 1 comment.
Show a summary per file
| File | Description |
|---|---|
| packages/rolldown/tests/fixtures/function/post-banner/duplicate-shebang/main.js | Adds a shebang-containing input to reproduce the duplicate-shebang output case. |
| packages/rolldown/tests/fixtures/function/post-banner/duplicate-shebang/_config.ts | Adds a fixture test that expects a DUPLICATE_SHEBANG warning and validates output ordering. |
| crates/rolldown_error/src/types/event_kind.rs | Adds EventKind::DuplicateShebang and maps it to DUPLICATE_SHEBANG. |
| crates/rolldown_error/src/build_diagnostic/events/mod.rs | Registers the new duplicate_shebang event module. |
| crates/rolldown_error/src/build_diagnostic/events/duplicate_shebang.rs | Implements the warning event message including the filename. |
| crates/rolldown_error/src/build_diagnostic/constructors.rs | Adds BuildDiagnostic::duplicate_shebang(...) constructor. |
| crates/rolldown/src/stages/generate_stage/render_chunk_to_assets.rs | Collects warnings returned by post_banner_footer and merges them into the warnings list. |
| crates/rolldown/src/stages/generate_stage/post_banner_footer.rs | Detects duplicate shebangs between source and post_banner and emits a warning. |
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
packages/rolldown/tests/fixtures/function/post-banner/duplicate-shebang/_config.ts
Show resolved
Hide resolved
|
@copilot fix lint and update snapshot in cli/cli-e2e.test.ts |
Benchmarks Rust |
|
@copilot update snapshot in js files |
|
@copilot the test is not passing |
The test is passing now. I verified:
The warning is being emitted correctly when both code and postBanner contain shebangs. |
|
@copilot |
Fixed in 799f08f. The issue was that the test used |
Merge activity
|
## Summary Implements the feature requested in #7583 (comment) This PR adds a warning when both the source code and `postBanner` contain shebang lines. ## Changes - [x] Add `DuplicateShebang` event kind to `EventKind` enum - [x] Create new `duplicate_shebang.rs` event module - [x] Update `mod.rs` to export the new event - [x] Update `constructors.rs` to add constructor for DuplicateShebang - [x] Modify `post_banner_footer.rs` to detect duplicate shebangs and emit warning - [x] Add test case for duplicate shebang scenario - [x] Run tests to verify the implementation - ✅ All tests pass - [x] Run code review and address feedback - [x] Address PR review feedback - [x] Run format and generator - [x] Fix lint and update CLI snapshot - [x] Update JS snapshots - [x] Fix test to run sequentially ## Behavior When both source code and `postBanner` contain shebang: - ✅ Original shebang preserved as first line - ✅ postBanner placed after shebang (per PR #7583) - ✅ Warning emitted: `[DUPLICATE_SHEBANG] Warning: Both the code and postBanner contain shebang in "main.js". This will cause a syntax error.` ## Example **Input file:** ```javascript #!/usr/bin/env node console.log('hello'); ``` **postBanner:** ```javascript #!/usr/bin/env bun /* Version 1.0.0 */ ``` **Output:** ```javascript #!/usr/bin/env node #!/usr/bin/env bun /* Version 1.0.0 */ console.log('hello'); ``` **Warning:** ``` [DUPLICATE_SHEBANG] Warning: Both the code and postBanner contain shebang in "main.js". This will cause a syntax error. ``` <!-- START COPILOT CODING AGENT TIPS --> --- 💬 We'd love your input! Share your thoughts on Copilot coding agent in our [2 minute survey](https://gh.io/copilot-coding-agent-survey).
799f08f to
d3da657
Compare
## Summary Implements the feature requested in #7583 (comment) This PR adds a warning when both the source code and `postBanner` contain shebang lines. ## Changes - [x] Add `DuplicateShebang` event kind to `EventKind` enum - [x] Create new `duplicate_shebang.rs` event module - [x] Update `mod.rs` to export the new event - [x] Update `constructors.rs` to add constructor for DuplicateShebang - [x] Modify `post_banner_footer.rs` to detect duplicate shebangs and emit warning - [x] Add test case for duplicate shebang scenario - [x] Run tests to verify the implementation - ✅ All tests pass - [x] Run code review and address feedback - [x] Address PR review feedback - [x] Run format and generator - [x] Fix lint and update CLI snapshot - [x] Update JS snapshots - [x] Fix test to run sequentially ## Behavior When both source code and `postBanner` contain shebang: - ✅ Original shebang preserved as first line - ✅ postBanner placed after shebang (per PR #7583) - ✅ Warning emitted: `[DUPLICATE_SHEBANG] Warning: Both the code and postBanner contain shebang in "main.js". This will cause a syntax error.` ## Example **Input file:** ```javascript #!/usr/bin/env node console.log('hello'); ``` **postBanner:** ```javascript #!/usr/bin/env bun /* Version 1.0.0 */ ``` **Output:** ```javascript #!/usr/bin/env node #!/usr/bin/env bun /* Version 1.0.0 */ console.log('hello'); ``` **Warning:** ``` [DUPLICATE_SHEBANG] Warning: Both the code and postBanner contain shebang in "main.js". This will cause a syntax error. ``` <!-- START COPILOT CODING AGENT TIPS --> --- 💬 We'd love your input! Share your thoughts on Copilot coding agent in our [2 minute survey](https://gh.io/copilot-coding-agent-survey).
d3da657 to
66c2f5a
Compare
## [1.0.0-rc.2] - 2026-01-28
⚡ Lazy Barrel Optimization
- Skips compilation of unused re-export modules in side-effect-free barrel modules
- Particularly beneficial for projects importing from large component libraries
For large component libraries like Ant Design, when you import just one component:
```js
import { Button } from 'antd';
Button;
```
| Metric | Without lazy barrel | With lazy barrel |
| -------------------- | --------------------- | ---------------- |
| Modules compiled | 2986 | 250 |
| Build time | ~210ms | ~50ms |
By enabling lazy barrel, Rolldown reduces the number of compiled modules by 90% and speeds up the build by 2-4x.
Enable it in your config:
```js
export default {
experimental: {
lazyBarrel: true,
},
};
```
For more details, see the https://rolldown.rs/in-depth/lazy-barrel-optimization
### 💥 BREAKING CHANGES
- expose `\0rolldown/runtime` in transform hook (#8068) by @hyf0
- rename `rolldown:runtime` to `\0rolldown/runtime.js` (#8067) by @hyf0
### 🚀 Features
- remove inlined constants in smart mode (#8085) by @sapphi-red
- allow more options for `this.emitFile` with `type: 'prebuilt-chunk'` (#8062) by @sapphi-red
- warn when both code and postBanner contain shebang (#8039) by @Copilot
### 🐛 Bug Fixes
- update the links to Rolldown docs in the error messages (#8103) by @sapphi-red
- handle tsconfig.json load errors (#8105) by @sapphi-red
- include inlined constants in namespace object (#8099) by @sapphi-red
- vite test ci (#8084) by @IWANABETHATGUY
- renamer: nested binding shadowing external module namespace in UMD/IIFE formats (#8083) by @Dunqing
- deduplicate ESM chunk imports by canonical symbol (#8059) by @IWANABETHATGUY
- refine side-effect detection for BigInt and RegExp (#8060) by @IWANABETHATGUY
- rust: use string literal span for `new URL` error diagnostic (#8043) by @valadaptive
- rust: use ModuleType::Asset for `new URL` imports (#8035) by @valadaptive
- CJS-ESM interop - property assignment on CJS module exports (#8006) by @IWANABETHATGUY
- eliminate the facade chunk if the dynamic entry module has been merged into common chunk (#8046) by @IWANABETHATGUY
- Inlining dynamic imports broken with multiple entry points (#8037) by @IWANABETHATGUY
- devtools: revert `Chunk#id` to `Chunk#chunk_id` (#8040) by @hyf0
- invert `__exportAll` parameter logic to reduce default output size (#8036) by @Copilot
- `</script` tag search should be case insensitive (#8033) by @IWANABETHATGUY
- use directory name as-is for the variable name even if the name contained `.` (#8029) by @Copilot
- dev/lazy: remove unnecessary rewrite from top level `this` to `undefined` (#8020) by @hyf0
- dev/lazy: should keep lazy entries imports for patch file (#8019) by @hyf0
- `output.generatedCode.preset: 'es2015'` was not set by default (#8026) by @sapphi-red
- node: align option validator to types (#8023) by @sapphi-red
- node: allow `output.strictExecutionOrder` by the option validator (#8022) by @sapphi-red
- types: return `this` from on / off methods of `RolldownWatcher` (#8015) by @sapphi-red
### 🚜 Refactor
- rolldown_plugin_vite_dynamic_import_vars: remove v1 implementation (#8096) by @shulaoda
- rolldown_plugin_vite_import_glob: remove v1 implementation (#8095) by @shulaoda
- lazy-barrel: restructure lazy barrel implementation (#8070) by @shulaoda
- remove `use_built_ins` and `use_spread` from internal JSX options (#8079) by @sapphi-red
- remove `experimental.transformHiresSourcemap` (#8055) by @Copilot
- rust: use `is_data_url` more consistently (#8042) by @valadaptive
- use `FxIndexMap` to store EntryPoint (#8032) by @IWANABETHATGUY
- node: add type checks that ensures validator schema is up to date with types (#8024) by @sapphi-red
### 📚 Documentation
- link to vite plugin registry (#8086) by @sapphi-red
- lazy-barrel: improve documentation and enable in sidebar (#8072) by @shulaoda
- add more examples and details (#8054) by @sapphi-red
- in-depth: add dead code elimination page (#8007) by @sapphi-red
- update status from beta to release candidate (#8012) by @shulaoda
### ⚡ Performance
- run inline-const pass for modules that are affected by inlining (#8064) by @sapphi-red
### 🧪 Testing
- lazy-barrel: use package.json sideEffects instead of plugin hook (#8077) by @shulaoda
- lazy-barrel: enable tests and add treeshake-behavior cases (#8071) by @shulaoda
### ⚙️ Miscellaneous Tasks
- deps: update crate-ci/typos action to v1.42.3 (#8087) by @renovate[bot]
- deps: update rollup submodule for tests to v4.56.0 (#8073) by @sapphi-red
- deps: update oxc to v0.111.0 (#8063) by @renovate[bot]
- deps: update dependency rolldown-plugin-dts to v0.21.6 (#8076) by @renovate[bot]
- deps: update test262 submodule for tests (#8074) by @sapphi-red
- deps: update crate-ci/typos action to v1.42.2 (#8069) by @renovate[bot]
- deps: update oxc apps (#8066) by @renovate[bot]
- remove `{@include ./foo.md}` from d.ts files (#8056) by @sapphi-red
- deps: update dependency oxlint-tsgolint to v0.11.2 (#8057) by @renovate[bot]
- deps: update github-actions (#8050) by @renovate[bot]
- deps: update npm packages (#8051) by @renovate[bot]
- deps: update rust crates (#8049) by @renovate[bot]
- debug: add IdxExt debug trait for human-readable index debugging (#8045) by @IWANABETHATGUY
- deps: update dependency rolldown-plugin-dts to v0.21.5 (#8034) by @renovate[bot]
- deps: update oxc resolver to v11.16.4 (#8031) by @renovate[bot]
- deps: update dependency rolldown-plugin-dts to v0.21.4 (#8030) by @renovate[bot]
- deps: update dependency rust to v1.93.0 (#8018) by @renovate[bot]
- archive 2025 beta changelog (#8014) by @shulaoda
- update release workflow version pattern from beta to rc (#8013) by @shulaoda
### ❤️ New Contributors
* @valadaptive made their first contribution in [#8043](#8043)
Co-authored-by: shulaoda <165626830+shulaoda@users.noreply.github.com>
Summary
Implements the feature requested in #7583 (comment)
This PR adds a warning when both the source code and
postBannercontain shebang lines.Changes
DuplicateShebangevent kind toEventKindenumduplicate_shebang.rsevent modulemod.rsto export the new eventconstructors.rsto add constructor for DuplicateShebangpost_banner_footer.rsto detect duplicate shebangs and emit warningBehavior
When both source code and
postBannercontain shebang:postBannercontent should be placed after shebang #7583)[DUPLICATE_SHEBANG] Warning: Both the code and postBanner contain shebang in "main.js". This will cause a syntax error.Example
Input file:
postBanner:
#!/usr/bin/env bun /* Version 1.0.0 */Output:
Warning:
💬 We'd love your input! Share your thoughts on Copilot coding agent in our 2 minute survey.