Skip to content

Commit

Permalink
Always render and use a dynamic namespace when a module with syntheti…
Browse files Browse the repository at this point in the history
…c named exports is imported dynamically (#3648)
  • Loading branch information
lukastaegert committed Jun 26, 2020
1 parent ee6ef99 commit 981b11c
Show file tree
Hide file tree
Showing 151 changed files with 243 additions and 115 deletions.
6 changes: 6 additions & 0 deletions src/Chunk.ts
Expand Up @@ -215,6 +215,11 @@ export default class Chunk {
for (const importer of module.includedDynamicImporters) {
if (!chunkModules.has(importer)) {
this.dynamicEntryModules.push(module);
// Modules with synthetic exports need an artifical namespace for dynamic imports
if (module.syntheticNamedExports) {
module.namespace.include();
this.exports.add(module.namespace);
}
}
}
if (module.implicitlyLoadedAfter.size > 0) {
Expand Down Expand Up @@ -347,6 +352,7 @@ export default class Chunk {
}
}
for (const module of this.dynamicEntryModules) {
if (module.syntheticNamedExports) continue;
if (!this.facadeModule && this.canModuleBeFacade(module, exposedVariables)) {
this.facadeModule = module;
this.facadeChunkByModule.set(module, this);
Expand Down
4 changes: 3 additions & 1 deletion src/Module.ts
Expand Up @@ -295,7 +295,9 @@ export default class Module {
return error({
code: Errors.SYNTHETIC_NAMED_EXPORTS_NEED_DEFAULT,
id: this.id,
message: `Modules with 'syntheticNamedExports' need a default export.`
message: `Module "${relativeId(
this.id
)}" that is marked to have "syntheticNamedExports" needs a default export.`
});
}
return this.defaultExport;
Expand Down
2 changes: 1 addition & 1 deletion src/ast/nodes/ImportExpression.ts
Expand Up @@ -73,7 +73,7 @@ export default class Import extends NodeBase {
if (namespaceExportName) {
const _ = options.compact ? '' : ' ';
const s = options.compact ? '' : ';';
code.appendLeft(
code.prependLeft(
this.end,
`.then(function${_}(n)${_}{${_}return n.${namespaceExportName}${s}${_}})`
);
Expand Down

This file was deleted.

This file was deleted.

This file was deleted.

This file was deleted.

This file was deleted.

This file was deleted.

This file was deleted.

This file was deleted.

This file was deleted.

This file was deleted.

This file was deleted.

This file was deleted.

@@ -0,0 +1,11 @@
define(['exports', './generated-main'], function (exports, main) { 'use strict';

var component = { lib: main.lib, lib2: main.lib.named, lib3: main.lib.named.named };

var component$1 = /*#__PURE__*/Object.freeze(/*#__PURE__*/Object.assign(/*#__PURE__*/Object.create(null), component, {
'default': component
}));

exports.component = component$1;

});
Expand Up @@ -6,7 +6,7 @@ define(['require', 'exports'], function (require, exports) { 'use strict';

console.log('side-effect', lib.named.named);

const component = new Promise(function (resolve, reject) { require(['./generated-component'], resolve, reject) });
const component = new Promise(function (resolve, reject) { require(['./generated-component'], resolve, reject) }).then(function (n) { return n.component; });

exports.component = component;
exports.lib = lib;
Expand Down
@@ -0,0 +1,11 @@
'use strict';

var main = require('./generated-main.js');

var component = { lib: main.lib, lib2: main.lib.named, lib3: main.lib.named.named };

var component$1 = /*#__PURE__*/Object.freeze(/*#__PURE__*/Object.assign(/*#__PURE__*/Object.create(null), component, {
'default': component
}));

exports.component = component$1;
Expand Up @@ -6,7 +6,7 @@ console.log('side-effect', lib.named);

console.log('side-effect', lib.named.named);

const component = Promise.resolve().then(function () { return require('./generated-component.js'); });
const component = Promise.resolve().then(function () { return require('./generated-component.js'); }).then(function (n) { return n.component; });

exports.component = component;
exports.lib = lib;
@@ -0,0 +1,9 @@
import { l as lib } from './generated-main.js';

var component = { lib, lib2: lib.named, lib3: lib.named.named };

var component$1 = /*#__PURE__*/Object.freeze(/*#__PURE__*/Object.assign(/*#__PURE__*/Object.create(null), component, {
'default': component
}));

export { component$1 as c };
Expand Up @@ -4,6 +4,6 @@ console.log('side-effect', lib.named);

console.log('side-effect', lib.named.named);

const component = import('./generated-component.js');
const component = import('./generated-component.js').then(function (n) { return n.c; });

export { component as c, lib as l };
@@ -0,0 +1,19 @@
System.register(['./generated-main.js'], function (exports) {
'use strict';
var lib;
return {
setters: [function (module) {
lib = module.l;
}],
execute: function () {

var component = { lib, lib2: lib.named, lib3: lib.named.named };

var component$1 = /*#__PURE__*/Object.freeze(/*#__PURE__*/Object.assign(/*#__PURE__*/Object.create(null), component, {
'default': component
}));
exports('c', component$1);

}
};
});
Expand Up @@ -9,7 +9,7 @@ System.register([], function (exports, module) {

console.log('side-effect', lib.named.named);

const component = exports('c', module.import('./generated-component.js'));
const component = exports('c', module.import('./generated-component.js').then(function (n) { return n.c; }));

}
};
Expand Down
@@ -1,4 +1,4 @@
import lib from './lib';
import lib2 from './lib-reexport2';
import lib3 from './lib-reexport';
console.log(lib, lib2, lib3);
export default { lib, lib2, lib3 };
@@ -0,0 +1,11 @@
define(['exports', './main'], function (exports, main) { 'use strict';

var component = { lib: main.lib, someExport: main.lib.someExport };

var component$1 = /*#__PURE__*/Object.freeze(/*#__PURE__*/Object.assign(/*#__PURE__*/Object.create(null), component, {
'default': component
}));

exports.component = component$1;

});
Expand Up @@ -4,7 +4,7 @@ define(['require', 'exports'], function (require, exports) { 'use strict';

console.log('side-effect', lib);

const component = new Promise(function (resolve, reject) { require(['./generated-component'], resolve, reject) });
const component = new Promise(function (resolve, reject) { require(['./generated-component'], resolve, reject) }).then(function (n) { return n.component; });

exports.component = component;
exports.lib = lib;
Expand Down
@@ -0,0 +1,11 @@
'use strict';

var main = require('./main.js');

var component = { lib: main.lib, someExport: main.lib.someExport };

var component$1 = /*#__PURE__*/Object.freeze(/*#__PURE__*/Object.assign(/*#__PURE__*/Object.create(null), component, {
'default': component
}));

exports.component = component$1;
Expand Up @@ -6,7 +6,7 @@ var lib = {};

console.log('side-effect', lib);

const component = Promise.resolve().then(function () { return require('./generated-component.js'); });
const component = Promise.resolve().then(function () { return require('./generated-component.js'); }).then(function (n) { return n.component; });

exports.component = component;
exports.lib = lib;
@@ -0,0 +1,9 @@
import { lib } from './main.js';

var component = { lib, someExport: lib.someExport };

var component$1 = /*#__PURE__*/Object.freeze(/*#__PURE__*/Object.assign(/*#__PURE__*/Object.create(null), component, {
'default': component
}));

export { component$1 as c };
@@ -0,0 +1,7 @@
var lib = {};

console.log('side-effect', lib);

const component = import('./generated-component.js').then(function (n) { return n.c; });

export { component, lib };
@@ -0,0 +1,19 @@
System.register(['./main.js'], function (exports) {
'use strict';
var lib;
return {
setters: [function (module) {
lib = module.lib;
}],
execute: function () {

var component = { lib, someExport: lib.someExport };

var component$1 = /*#__PURE__*/Object.freeze(/*#__PURE__*/Object.assign(/*#__PURE__*/Object.create(null), component, {
'default': component
}));
exports('c', component$1);

}
};
});
Expand Up @@ -7,7 +7,7 @@ System.register([], function (exports, module) {

console.log('side-effect', lib);

const component = exports('component', module.import('./generated-component.js'));
const component = exports('component', module.import('./generated-component.js').then(function (n) { return n.c; }));

}
};
Expand Down
@@ -1,2 +1,2 @@
import lib, { someExport } from './lib-reexport';
console.log(lib, someExport);
export default { lib, someExport };
@@ -0,0 +1,15 @@
module.exports = {
description: 'synthetic named exports',
options: {
input: ['main.js'],
plugins: [
{
transform(code, id) {
if (id.endsWith('dep.js')) {
return { code, syntheticNamedExports: true };
}
}
}
]
}
};
@@ -0,0 +1,13 @@
define(['exports'], function (exports) { 'use strict';

var dep = { foo: 1 };
const bar = 2;

var dep$1 = /*#__PURE__*/Object.freeze(/*#__PURE__*/Object.assign(/*#__PURE__*/Object.create(null), dep, {
'default': dep,
bar: bar
}));

exports.dep = dep$1;

});
@@ -0,0 +1,5 @@
define(['require'], function (require) { 'use strict';

new Promise(function (resolve, reject) { require(['./generated-dep'], resolve, reject) }).then(function (n) { return n.dep; }).then(({ foo, bar, baz }) => console.log(foo, bar, baz));

});
@@ -0,0 +1,11 @@
'use strict';

var dep = { foo: 1 };
const bar = 2;

var dep$1 = /*#__PURE__*/Object.freeze(/*#__PURE__*/Object.assign(/*#__PURE__*/Object.create(null), dep, {
'default': dep,
bar: bar
}));

exports.dep = dep$1;
@@ -0,0 +1,3 @@
'use strict';

Promise.resolve().then(function () { return require('./generated-dep.js'); }).then(function (n) { return n.dep; }).then(({ foo, bar, baz }) => console.log(foo, bar, baz));

0 comments on commit 981b11c

Please sign in to comment.