Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Always create a dynamic namespace object when a module with synthetic named exports is imported dynamically #3648

Merged
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
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));