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(); this.onwarn = options.onwarn || makeOnwarn();
// TODO strictly speaking, this only applies with non-ES6, non-default-only bundles // 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 () { build () {

20
src/finalisers/cjs.js

@ -3,17 +3,25 @@ import getExportBlock from './shared/getExportBlock.js';
export default function cjs ( bundle, magicString, { exportMode }, options ) { export default function cjs ( bundle, magicString, { exportMode }, options ) {
let intro = options.useStrict === false ? `` : `'use strict';\n\n`; 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 // TODO handle empty imports, once they're supported
const importBlock = bundle.externalModules const importBlock = bundle.externalModules
.map( module => { .map( module => {
let requireStatement = `var ${module.name} = require('${module.id}');`;
if ( module.declarations.default ) { if ( module.declarations.default ) {
requireStatement += '\n' + ( module.exportsNames ? `var ${module.name}__default = ` : `${module.name} = ` ) + if (module.exportsNames) {
`'default' in ${module.name} ? ${module.name}['default'] : ${module.name};`; 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' ); .join( '\n' );

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

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

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

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