Browse Source

modify export statements at generate time

contingency-plan
Rich Harris 10 years ago
parent
commit
c408b7dd0b
  1. 27
      src/Bundle.js
  2. 65
      src/Module.js
  3. 2
      test/samples/allows-external-modules-from-nested-module/_config.js

27
src/Bundle.js

@ -138,6 +138,33 @@ export default class Bundle {
const source = statement._source.clone();
// modify exports as necessary
if ( /^Export/.test( statement.type ) ) {
// skip `export { foo, bar, baz }`
if ( statement.type === 'ExportNamedDeclaration' && statement.specifiers.length ) {
return;
}
// remove `export` from `export var foo = 42`
if ( statement.type === 'ExportNamedDeclaration' && statement.declaration.type === 'VariableDeclaration' ) {
source.remove( statement.start, statement.declaration.start );
}
// remove `export` from `export class Foo {...}` or `export default Foo`
// TODO default exports need different treatment
else if ( statement.declaration.id ) {
source.remove( statement.start, statement.declaration.start );
}
// declare variables for expressions
else {
const name = statement.type === 'ExportDefaultDeclaration' ? 'default' : 'wut';
const canonicalName = statement._module.getCanonicalName( name );
source.overwrite( statement.start, statement.declaration.start, `var ${canonicalName} = ` );
}
}
replaceIdentifiers( statement, source, replacements );
magicString.addSource( source );
});

65
src/Module.js

@ -265,32 +265,12 @@ export default class Module {
let statement;
if ( name === 'default' ) {
// We have an expression, e.g. `export default 42`. We have
// to assign that expression to a variable
const replacement = this.suggestedNames.default;
// TODO can we use this.definitions[ name ], as below?
statement = this.exports.default.node;
if ( !statement._included ) {
// if we have `export default foo`, we don't want to turn it into `var foo = foo`
// - we want to remove it altogether (but keep the statement, so we can include
// its dependencies). TODO is there an easier way to do this?
const shouldRemove = statement.declaration.type === 'Identifier' && statement.declaration.name === replacement;
if ( shouldRemove ) {
statement._source.remove( statement.start, statement.end );
} else {
statement._source.overwrite( statement.start, statement.declaration.start, `var ${replacement} = ` );
}
}
}
else {
statement = this.definitions[ name ];
if ( statement && /^Export/.test( statement.type ) ) {
statement._source.remove( statement.start, statement.declaration.start );
}
}
if ( statement && !statement._included ) {
@ -376,30 +356,37 @@ export default class Module {
// skip `export { foo, bar, baz }`
if ( statement.type === 'ExportNamedDeclaration' && statement.specifiers.length ) {
// but ensure they are defined, if this is the entry module
return isEntryModule ? this.expandStatement( statement ) : null;
if ( isEntryModule ) {
return this.expandStatement( statement )
.then( statements => {
allStatements.push.apply( allStatements, statements );
});
}
return;
}
// include everything else
// modify exports as necessary
if ( /^Export/.test( statement.type ) ) {
// remove `export` from `export var foo = 42`
if ( statement.type === 'ExportNamedDeclaration' && statement.declaration.type === 'VariableDeclaration' ) {
statement._source.remove( statement.start, statement.declaration.start );
}
// remove `export` from `export class Foo {...}` or `export default Foo`
else if ( statement.declaration.id ) {
statement._source.remove( statement.start, statement.declaration.start );
}
// declare variables for expressions
else {
statement._source.overwrite( statement.start, statement.declaration.start, `var TODO = ` );
}
}
// // modify exports as necessary
// if ( /^Export/.test( statement.type ) ) {
// // remove `export` from `export var foo = 42`
// if ( statement.type === 'ExportNamedDeclaration' && statement.declaration.type === 'VariableDeclaration' ) {
// statement._source.remove( statement.start, statement.declaration.start );
// }
//
// // remove `export` from `export class Foo {...}` or `export default Foo`
// else if ( statement.declaration.id ) {
// statement._source.remove( statement.start, statement.declaration.start );
// }
//
// // declare variables for expressions
// else {
// statement._source.overwrite( statement.start, statement.declaration.start, `var TODO = ` );
// }
// }
return this.expandStatement( statement )
.then( statements => {

2
test/samples/allows-external-modules-from-nested-module/_config.js

@ -1,3 +1,3 @@
module.exports = {
description: 'imports external modules from nested internal modules'
};
};

Loading…
Cancel
Save