diff --git a/src/Bundle.js b/src/Bundle.js index 40a9211..d3ec8b5 100644 --- a/src/Bundle.js +++ b/src/Bundle.js @@ -208,6 +208,15 @@ export default class Bundle { declaration.name = getSafeName( declaration.name ); }); + // special case - for `import * as Foo`, we need to make sure that Foo + // gets its own variable because it will eventually be rendered as + // `var Foo = Object.freeze(...)` + forOwn( module.imports, ( importee, importeeName ) => { + if ( importee.name === '*' ) { + delete module.imports[ importeeName ]; + module.imports[ getSafeName(importeeName) ] = importee; + } + }); }); this.scope.deshadow( toDeshadow ); diff --git a/test/form/namespace-optimization-b/_expected/amd.js b/test/form/namespace-optimization-b/_expected/amd.js index 30c5406..45db05f 100644 --- a/test/form/namespace-optimization-b/_expected/amd.js +++ b/test/form/namespace-optimization-b/_expected/amd.js @@ -1,12 +1,12 @@ define(function () { 'use strict'; - function foo () { + function foo$1 () { console.log( 'foo' ); } function a () { - foo(); - foo(); + foo$1(); + foo$1(); var a; if ( a.b ) { diff --git a/test/form/namespace-optimization-b/_expected/cjs.js b/test/form/namespace-optimization-b/_expected/cjs.js index 3ee6869..5891df9 100644 --- a/test/form/namespace-optimization-b/_expected/cjs.js +++ b/test/form/namespace-optimization-b/_expected/cjs.js @@ -1,12 +1,12 @@ 'use strict'; -function foo () { +function foo$1 () { console.log( 'foo' ); } function a () { - foo(); - foo(); + foo$1(); + foo$1(); var a; if ( a.b ) { diff --git a/test/form/namespace-optimization-b/_expected/es.js b/test/form/namespace-optimization-b/_expected/es.js index 8346d0d..c63d076 100644 --- a/test/form/namespace-optimization-b/_expected/es.js +++ b/test/form/namespace-optimization-b/_expected/es.js @@ -1,10 +1,10 @@ -function foo () { +function foo$1 () { console.log( 'foo' ); } function a () { - foo(); - foo(); + foo$1(); + foo$1(); var a; if ( a.b ) { diff --git a/test/form/namespace-optimization-b/_expected/iife.js b/test/form/namespace-optimization-b/_expected/iife.js index 6aeb1cd..bfc4c08 100644 --- a/test/form/namespace-optimization-b/_expected/iife.js +++ b/test/form/namespace-optimization-b/_expected/iife.js @@ -1,13 +1,13 @@ (function () { 'use strict'; - function foo () { + function foo$1 () { console.log( 'foo' ); } function a () { - foo(); - foo(); + foo$1(); + foo$1(); var a; if ( a.b ) { diff --git a/test/form/namespace-optimization-b/_expected/umd.js b/test/form/namespace-optimization-b/_expected/umd.js index f7fbbdf..a95eafd 100644 --- a/test/form/namespace-optimization-b/_expected/umd.js +++ b/test/form/namespace-optimization-b/_expected/umd.js @@ -4,13 +4,13 @@ (factory()); }(this, (function () { 'use strict'; - function foo () { + function foo$1 () { console.log( 'foo' ); } function a () { - foo(); - foo(); + foo$1(); + foo$1(); var a; if ( a.b ) { diff --git a/test/function/namespacing-collisions-2/Material.js b/test/function/namespacing-collisions-2/Material.js new file mode 100644 index 0000000..b6d1881 --- /dev/null +++ b/test/function/namespacing-collisions-2/Material.js @@ -0,0 +1,3 @@ +export function Material() { + return 'Material'; +} diff --git a/test/function/namespacing-collisions-2/MaterialAgain.js b/test/function/namespacing-collisions-2/MaterialAgain.js new file mode 100644 index 0000000..170cfff --- /dev/null +++ b/test/function/namespacing-collisions-2/MaterialAgain.js @@ -0,0 +1,3 @@ +export function MaterialAgain() { + return 'MaterialAgain'; +} diff --git a/test/function/namespacing-collisions-2/Something.js b/test/function/namespacing-collisions-2/Something.js new file mode 100644 index 0000000..64cbdca --- /dev/null +++ b/test/function/namespacing-collisions-2/Something.js @@ -0,0 +1,6 @@ +import * as Material from './Material'; + +export function Something() { + console.log(Material); + return 'Something'; +} \ No newline at end of file diff --git a/test/function/namespacing-collisions-2/SomethingAgain.js b/test/function/namespacing-collisions-2/SomethingAgain.js new file mode 100644 index 0000000..1efaca7 --- /dev/null +++ b/test/function/namespacing-collisions-2/SomethingAgain.js @@ -0,0 +1,6 @@ +import * as Material from './MaterialAgain'; + +export function SomethingAgain() { + console.log(Material); + return 'SomethingAgain'; +} \ No newline at end of file diff --git a/test/function/namespacing-collisions-2/_config.js b/test/function/namespacing-collisions-2/_config.js new file mode 100644 index 0000000..4684296 --- /dev/null +++ b/test/function/namespacing-collisions-2/_config.js @@ -0,0 +1,8 @@ +var assert = require( 'assert' ); + +module.exports = { + description: 'correctly namespaces when using * exports, take two (#910)', + exports: function ( exports ) { + assert.deepEqual( exports, ['Material', 'MaterialAgain', 'Something', 'SomethingAgain'] ); + } +}; diff --git a/test/function/namespacing-collisions-2/main.js b/test/function/namespacing-collisions-2/main.js new file mode 100644 index 0000000..c69a6e4 --- /dev/null +++ b/test/function/namespacing-collisions-2/main.js @@ -0,0 +1,7 @@ +import { Something } from './Something'; +import { SomethingAgain } from './SomethingAgain'; +import { Material } from './Material'; +import { MaterialAgain } from './MaterialAgain'; + +var result = [Material(), MaterialAgain(), Something(), SomethingAgain()] +export default result; diff --git a/test/function/namespacing-collisions/Material.js b/test/function/namespacing-collisions/Material.js new file mode 100644 index 0000000..b6d1881 --- /dev/null +++ b/test/function/namespacing-collisions/Material.js @@ -0,0 +1,3 @@ +export function Material() { + return 'Material'; +} diff --git a/test/function/namespacing-collisions/Something.js b/test/function/namespacing-collisions/Something.js new file mode 100644 index 0000000..64cbdca --- /dev/null +++ b/test/function/namespacing-collisions/Something.js @@ -0,0 +1,6 @@ +import * as Material from './Material'; + +export function Something() { + console.log(Material); + return 'Something'; +} \ No newline at end of file diff --git a/test/function/namespacing-collisions/_config.js b/test/function/namespacing-collisions/_config.js new file mode 100644 index 0000000..02c772f --- /dev/null +++ b/test/function/namespacing-collisions/_config.js @@ -0,0 +1,8 @@ +var assert = require( 'assert' ); + +module.exports = { + description: 'correctly namespaces when using * exports (#910)', + exports: function ( exports ) { + assert.deepEqual( exports, [ 'Material', 'Something' ] ); + } +}; diff --git a/test/function/namespacing-collisions/main.js b/test/function/namespacing-collisions/main.js new file mode 100644 index 0000000..8746123 --- /dev/null +++ b/test/function/namespacing-collisions/main.js @@ -0,0 +1,5 @@ +import { Something } from './Something'; +import { Material } from './Material'; + +var result = [Material(), Something()] +export default result; \ No newline at end of file