Fix requires of external CommonJS SWC helpers #8693
Merged
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
Fixes a regression introduced by #8555. Reproduction
The root cause was that due to library mode rewriting SWC helpers for CJS libraries, the dep had a
placeholder
: https://github.com/parcel-bundler/parcel/blob/v2/packages/transformers/js/core/src/dependency_collector.rs#L124-L125Then, when we build our dep map, we use the placeholder rather than the original specifier + "esm":
parcel/packages/transformers/js/src/JSTransformer.js
Lines 734 to 736 in 426852f
But when looking up the dep, we would still append "esm", leading no dep to be found and therefore no symbols replaced later on:
parcel/packages/transformers/js/src/JSTransformer.js
Lines 751 to 755 in 426852f
To fix this, I've changed the way this works so we don't append "esm" but instead use a placeholder for CJS deps on the rust side. This fixes the original issue where CJS and ESM imports for the same specifier wouldn't work, without needing additional metadata. To get that to work, I had to add specifiers for external modules to the dev packager so we remap from the placeholder to the original specifier when requiring them.