Browse Source

use an interopRequire function for external CJS deps with a default export

gh-669
Alexander Early 9 years ago
parent
commit
98e4adb322
  1. 19
      src/finalisers/cjs.js
  2. 5
      test/form/external-imports-custom-names/_expected/cjs.js
  3. 11
      test/form/external-imports/_expected/cjs.js

19
src/finalisers/cjs.js

@ -3,17 +3,24 @@ import getExportBlock from './shared/getExportBlock.js';
export default function cjs ( bundle, magicString, { exportMode }, options ) {
let intro = options.useStrict === false ? `` : `'use strict';\n\n`;
const hasDefaultImport = bundle.externalModules.some( mod => mod.declarations.default);
if (hasDefaultImport) {
intro += `function _interopRequire (id) { var ex = require(id); return 'default' in ex ? ex['default'] : ex; }\n\n`;
}
// TODO handle empty imports, once they're supported
const importBlock = bundle.externalModules
.map( module => {
let requireStatement = `var ${module.name} = require('${module.id}');`;
if ( module.declarations.default ) {
requireStatement += '\n' + ( module.exportsNames ? `var ${module.name}__default = ` : `${module.name} = ` ) +
`'default' in ${module.name} ? ${module.name}['default'] : ${module.name};`;
let importStatement = `var ${module.name} = _interopRequire('${module.id}');`;
if (module.exportsNames) {
importStatement += `\nvar ${module.name}__default = ${module.name};`;
}
return importStatement;
} else {
return `var ${module.name} = require('${module.id}');`;
}
return requireStatement;
})
.join( '\n' );

5
test/form/external-imports-custom-names/_expected/cjs.js

@ -1,7 +1,8 @@
'use strict';
var $ = require('jquery');
$ = 'default' in $ ? $['default'] : $;
function _interopRequire (id) { var ex = require(id); return 'default' in ex ? ex['default'] : ex; }
var $ = _interopRequire('jquery');
$( function () {
$( 'body' ).html( '<h1>hello world!</h1>' );

11
test/form/external-imports/_expected/cjs.js

@ -1,14 +1,15 @@
'use strict';
var factory = require('factory');
factory = 'default' in factory ? factory['default'] : factory;
function _interopRequire (id) { var ex = require(id); return 'default' in ex ? ex['default'] : ex; }
var factory = _interopRequire('factory');
var baz = require('baz');
var containers = require('shipping-port');
var alphabet = require('alphabet');
var alphabet__default = 'default' in alphabet ? alphabet['default'] : alphabet;
var alphabet = _interopRequire('alphabet');
var alphabet__default = alphabet;
factory( null );
baz.foo( baz.bar, containers.port );
containers.forEach( console.log, console );
console.log( alphabet.a );
console.log( alphabet__default.length );
console.log( alphabet__default.length );
Loading…
Cancel
Save