From 0db883da43c0a868c2554346a61cb82285b90297 Mon Sep 17 00:00:00 2001 From: Alexander Marks Date: Thu, 5 Apr 2018 16:08:45 -0700 Subject: [PATCH] Call require.default in dynamic import rewriter. (#356) The require import we construct gets wrapped in the Babel helper _interopRequireWildcard, which redefines require from a function to a module object (with the original object at .default). --- CHANGELOG.md | 3 ++- src/babel-plugin-dynamic-import-amd.ts | 6 +++++- src/test/babel-plugin-dynamic-import-amd_test.ts | 10 ++++------ src/test/js-transform_test.ts | 2 +- 4 files changed, 12 insertions(+), 9 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index aa865f3d..93f4ad3a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,7 +7,8 @@ and this project adheres to [Semantic Versioning](http://semver.org/). -* Fix bug with node module resolution where specifiers in dynamic import() we're rewritten +* Fix bug with node module resolution where specifiers in dynamic import() were rewritten. +* Fix bug with dynamic import rewriting where imported require function could not be called. ## [3.0.0-pre.8] - 2018-04-04 * Fix bug where not all percent-encoded characters in URIs would be decoded (in particular, `%40` -> `@` which is important for scoped NPM packages). diff --git a/src/babel-plugin-dynamic-import-amd.ts b/src/babel-plugin-dynamic-import-amd.ts index c5650495..f1cc895b 100644 --- a/src/babel-plugin-dynamic-import-amd.ts +++ b/src/babel-plugin-dynamic-import-amd.ts @@ -66,8 +66,12 @@ export const dynamicImportAmd = { // Transform the dynamic import callsites for (const importPath of dynamicImports) { const specifier = importPath.node.arguments[0]; + // Call as `require.default` because the AMD transformer that we assume + // is running next will rewrite `require` from a function to a module + // object with the function at `default`. importPath.replaceWith(ast`( - new Promise((res, rej) => ${requireId}([${specifier}], res, rej)) + new Promise((res, rej) => ${requireId}.default([${ + specifier}], res, rej)) )`); } }, diff --git a/src/test/babel-plugin-dynamic-import-amd_test.ts b/src/test/babel-plugin-dynamic-import-amd_test.ts index afffad21..b348db65 100644 --- a/src/test/babel-plugin-dynamic-import-amd_test.ts +++ b/src/test/babel-plugin-dynamic-import-amd_test.ts @@ -21,7 +21,6 @@ import {dynamicImportAmd} from '../babel-plugin-dynamic-import-amd'; const babelTransformModulesAmd = require('@babel/plugin-transform-modules-amd'); suite('babel-plugin-transform-modules-amd', () => { - test('transforms import()', () => { const input = stripIndent(` const foo = import('./foo.js'); @@ -29,7 +28,7 @@ suite('babel-plugin-transform-modules-amd', () => { const expected = stripIndent(` import * as _require from 'require'; - const foo = new Promise((res, rej) => _require(['./foo.js'], res, rej)); + const foo = new Promise((res, rej) => _require.default(['./foo.js'], res, rej)); `); const result = babelCore.transform(input, {plugins: [dynamicImportAmd]}).code; @@ -49,10 +48,10 @@ suite('babel-plugin-transform-modules-amd', () => { const expected = stripIndent(` import * as _require3 from 'require'; let _require = true; - const foo = new Promise((res, rej) => _require3(['./foo.js'], res, rej)); + const foo = new Promise((res, rej) => _require3.default(['./foo.js'], res, rej)); { let _require2 = true; - new Promise((res, rej) => _require3(['./bar.js'], res, rej)); + new Promise((res, rej) => _require3.default(['./bar.js'], res, rej)); } `); const result = @@ -74,7 +73,6 @@ suite('babel-plugin-transform-modules-amd', () => { result, `define(["require", "./bar.js"], function (_require, _bar) {`); assert.include( result, - `const foo = new Promise((res, rej) => _require(['./foo.js'], res, rej));`); + `const foo = new Promise((res, rej) => _require.default(['./foo.js'], res, rej));`); }); - }); diff --git a/src/test/js-transform_test.ts b/src/test/js-transform_test.ts index fc3269a3..7f30aac6 100644 --- a/src/test/js-transform_test.ts +++ b/src/test/js-transform_test.ts @@ -314,6 +314,6 @@ suite('jsTransform', () => { `define(["exports", "require", "dep1"], function (_exports, _require, _dep) {`); assert.include( result, - `console.log(new Promise((res, rej) => _require(['./bar.js'], res, rej)));`); + `console.log(new Promise((res, rej) => _require.default(['./bar.js'], res, rej)));`); }); });