Browse Source

Merge pull request #458 from aearly/cjs-interop-require

use an interopDefault function for external CJS deps
gh-669
Rich Harris 9 years ago
parent
commit
88a0e91ce8
  1. 2
      src/Bundle.js
  2. 20
      src/finalisers/cjs.js
  3. 7
      test/form/external-imports-custom-names/_expected/cjs.js
  4. 9
      test/form/external-imports/_expected/cjs.js

2
src/Bundle.js

@ -63,7 +63,7 @@ export default class Bundle {
this.onwarn = options.onwarn || makeOnwarn();
// TODO strictly speaking, this only applies with non-ES6, non-default-only bundles
[ 'module', 'exports' ].forEach( global => this.assumedGlobals[ global ] = true );
[ 'module', 'exports', '_interopDefault' ].forEach( global => this.assumedGlobals[ global ] = true );
}
build () {

20
src/finalisers/cjs.js

@ -3,17 +3,25 @@ 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 _interopDefault (ex) { 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};`;
if (module.exportsNames) {
return `var ${module.name} = require('${module.id}');` +
`\nvar ${module.name}__default = _interopDefault(${module.name});`;
} else {
return `var ${module.name} = _interopDefault(require('${module.id}'));`;
}
} else {
return `var ${module.name} = require('${module.id}');`;
}
return requireStatement;
})
.join( '\n' );

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

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

9
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 _interopDefault (ex) { return 'default' in ex ? ex['default'] : ex; }
var factory = _interopDefault(require('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__default = _interopDefault(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