Skip to content

Commit

Permalink
Fix transformation of import/requires wrapped into Promise.resolve(). (
Browse files Browse the repository at this point in the history
  • Loading branch information
SmartArray committed Jun 13, 2022
1 parent b837522 commit 3f02a9a
Show file tree
Hide file tree
Showing 3 changed files with 32 additions and 1 deletion.
@@ -0,0 +1 @@
module.exports = Promise.resolve(require('./async')).then(x => x + 1335);
23 changes: 23 additions & 0 deletions packages/core/integration-tests/test/javascript.js
Expand Up @@ -4630,6 +4630,29 @@ describe('javascript', function () {
assert.equal(await run(b), 5);
});

it('should properly chain a dynamic import wrapped in a Promise.resolve()', async () => {
let b = await bundle(
path.join(__dirname, '/integration/require-async/resolve-chain.js'),
);

assertBundles(b, [
{
name: 'resolve-chain.js',
assets: [
'resolve-chain.js',
'bundle-url.js',
'cacheLoader.js',
'js-loader.js',
],
},
{
assets: ['async.js'],
},
]);

assert.equal(await run(b), 1337);
});

it('should detect parcel style async requires in commonjs', async () => {
let b = await bundle(
path.join(__dirname, '/integration/require-async/parcel.js'),
Expand Down
9 changes: 8 additions & 1 deletion packages/transformers/js/core/src/dependency_collector.rs
Expand Up @@ -458,10 +458,17 @@ impl<'a> Fold for DependencyCollector<'a> {
// Promise.resolve().then(() => require('foo'))
// Promise.resolve().then(() => { return require('foo') })
// Promise.resolve().then(function () { return require('foo') })
// but not
// Promise.resolve(require('foo'))
if let Call(call) = &*member.obj {
if let Callee::Expr(e) = &call.callee {
if let Member(m) = &**e {
if match_member_expr(m, vec!["Promise", "resolve"], self.decls) {
if match_member_expr(m, vec!["Promise", "resolve"], self.decls) &&
// Make sure the arglist is empty.
// I.e. do not proceed with the below unless Promise.resolve has an empty arglist
// because build_promise_chain() will not work in this case.
call.args.is_empty()
{
if let MemberProp::Ident(id) = &member.prop {
if id.sym.to_string().as_str() == "then" {
if let Some(arg) = node.args.get(0) {
Expand Down

0 comments on commit 3f02a9a

Please sign in to comment.