Skip to content

Commit

Permalink
Support dynamic imports in cjs output and make default
Browse files Browse the repository at this point in the history
  • Loading branch information
lukastaegert committed Oct 4, 2022
1 parent 5812006 commit 1e5f448
Show file tree
Hide file tree
Showing 37 changed files with 83 additions and 174 deletions.
4 changes: 4 additions & 0 deletions src/ast/nodes/ImportExpression.ts
Original file line number Diff line number Diff line change
Expand Up @@ -134,6 +134,7 @@ export default class ImportExpression extends NodeBase {
{
compact,
dynamicImportFunction,
dynamicImportInCjs,
format,
generatedCode: { arrowFunctions },
interop
Expand All @@ -156,6 +157,9 @@ export default class ImportExpression extends NodeBase {
const hasDynamicTarget = !this.resolution || typeof this.resolution === 'string';
switch (format) {
case 'cjs': {
if (resolution instanceof ExternalModule && dynamicImportInCjs) {
return { helper: null, mechanism: null };
}
const helper = getInteropHelper(resolution, exportMode, interop);
let left = `require(`;
let right = `)`;
Expand Down
2 changes: 2 additions & 0 deletions src/rollup/types.d.ts
Original file line number Diff line number Diff line change
Expand Up @@ -613,6 +613,7 @@ export interface OutputOptions {
dir?: string;
/** @deprecated Use the "renderDynamicImport" plugin hook instead. */
dynamicImportFunction?: string;
dynamicImportInCjs?: boolean;
entryFileNames?: string | ((chunkInfo: PreRenderedChunk) => string);
esModule?: boolean | 'if-default-prop';
exports?: 'default' | 'named' | 'none' | 'auto';
Expand Down Expand Up @@ -663,6 +664,7 @@ export interface NormalizedOutputOptions {
dir: string | undefined;
/** @deprecated Use the "renderDynamicImport" plugin hook instead. */
dynamicImportFunction: string | undefined;
dynamicImportInCjs: boolean;
entryFileNames: string | ((chunkInfo: PreRenderedChunk) => string);
esModule: boolean | 'if-default-prop';
exports: 'default' | 'named' | 'none' | 'auto';
Expand Down
1 change: 1 addition & 0 deletions src/utils/options/mergeOptions.ts
Original file line number Diff line number Diff line change
Expand Up @@ -231,6 +231,7 @@ function mergeOutputOptions(
compact: getOption('compact'),
dir: getOption('dir'),
dynamicImportFunction: getOption('dynamicImportFunction'),
dynamicImportInCjs: getOption('dynamicImportInCjs'),
entryFileNames: getOption('entryFileNames'),
esModule: getOption('esModule'),
exports: getOption('exports'),
Expand Down
1 change: 1 addition & 0 deletions src/utils/options/normalizeOutputOptions.ts
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,7 @@ export function normalizeOutputOptions(
compact,
dir: getDir(config, file),
dynamicImportFunction: getDynamicImportFunction(config, inputOptions, format),
dynamicImportInCjs: config.dynamicImportInCjs ?? true,
entryFileNames: getEntryFileNames(config, unsetOptions),
esModule: config.esModule ?? 'if-default-prop',
exports: getExports(config, unsetOptions),
Expand Down
Original file line number Diff line number Diff line change
@@ -1,22 +1,5 @@
'use strict';

function _interopNamespaceDefault(e) {
var n = Object.create(null);
if (e) {
Object.keys(e).forEach(function (k) {
if (k !== 'default') {
var d = Object.getOwnPropertyDescriptor(e, k);
Object.defineProperty(n, k, d.get ? d : {
enumerable: true,
get: function () { return e[k]; }
});
}
});
}
n.default = e;
return Object.freeze(n);
}

Promise.resolve().then(function () { return /*#__PURE__*/_interopNamespaceDefault(require(
import /* () should not break */ (
/* webpackChunkName: "chunk-name" */
'./foo.js'/*suffix*/)); });
'./foo.js'/*suffix*/);
Original file line number Diff line number Diff line change
@@ -1,20 +1,3 @@
'use strict';

function _interopNamespaceDefault(e) {
var n = Object.create(null);
if (e) {
Object.keys(e).forEach(function (k) {
if (k !== 'default') {
var d = Object.getOwnPropertyDescriptor(e, k);
Object.defineProperty(n, k, d.get ? d : {
enumerable: true,
get: function () { return e[k]; }
});
}
});
}
n.default = e;
return Object.freeze(n);
}

Promise.resolve().then(function () { return /*#__PURE__*/_interopNamespaceDefault(require('./foo.js')); }).then(result => console.log(result));
import('./foo.js').then(result => console.log(result));
Original file line number Diff line number Diff line change
@@ -1,20 +1,3 @@
'use strict';

function _interopNamespaceDefault(e) {
var n = Object.create(null);
if (e) {
Object.keys(e).forEach(function (k) {
if (k !== 'default') {
var d = Object.getOwnPropertyDescriptor(e, k);
Object.defineProperty(n, k, d.get ? d : {
enumerable: true,
get: function () { return e[k]; }
});
}
});
}
n.default = e;
return Object.freeze(n);
}

Promise.resolve().then(function () { return /*#__PURE__*/_interopNamespaceDefault(require('./foo.js')); });
import('./foo.js');
Original file line number Diff line number Diff line change
Expand Up @@ -2,23 +2,6 @@

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

function _interopNamespaceDefault(e) {
var n = Object.create(null);
if (e) {
Object.keys(e).forEach(function (k) {
if (k !== 'default') {
var d = Object.getOwnPropertyDescriptor(e, k);
Object.defineProperty(n, k, d.get ? d : {
enumerable: true,
get: function () { return e[k]; }
});
}
});
}
n.default = e;
return Object.freeze(n);
}

Promise.resolve().then(function () { return /*#__PURE__*/_interopNamespaceDefault(require('./ext\'ernal')); });
import('./ext\'ernal');

console.log('main', dep.value);
19 changes: 1 addition & 18 deletions test/chunking-form/samples/nested-chunks/_expected/cjs/main1.js
Original file line number Diff line number Diff line change
Expand Up @@ -2,24 +2,7 @@

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

function _interopNamespaceDefault(e) {
var n = Object.create(null);
if (e) {
Object.keys(e).forEach(function (k) {
if (k !== 'default') {
var d = Object.getOwnPropertyDescriptor(e, k);
Object.defineProperty(n, k, d.get ? d : {
enumerable: true,
get: function () { return e[k]; }
});
}
});
}
n.default = e;
return Object.freeze(n);
}

console.log('main1', dep.value);

Promise.resolve().then(function () { return require('./generated-dynamic.js'); }).then(result => console.log(result));
Promise.resolve().then(function () { return /*#__PURE__*/_interopNamespaceDefault(require('./external.js')); }).then(result => console.log(result));
import('./external.js').then(result => console.log(result));
Original file line number Diff line number Diff line change
Expand Up @@ -2,24 +2,7 @@

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

function _interopNamespaceDefault(e) {
var n = Object.create(null);
if (e) {
Object.keys(e).forEach(function (k) {
if (k !== 'default') {
var d = Object.getOwnPropertyDescriptor(e, k);
Object.defineProperty(n, k, d.get ? d : {
enumerable: true,
get: function () { return e[k]; }
});
}
});
}
n.default = e;
return Object.freeze(n);
}

console.log('main2', dep.value);

Promise.resolve().then(function () { return require('../generated-dynamic.js'); }).then(result => console.log(result));
Promise.resolve().then(function () { return /*#__PURE__*/_interopNamespaceDefault(require('../external.js')); }).then(result => console.log(result));
import('../external.js').then(result => console.log(result));
Original file line number Diff line number Diff line change
Expand Up @@ -24,10 +24,10 @@ function _interopNamespaceDefault(e) {

// nested
Promise.resolve().then(function () { return existing; });
Promise.resolve().then(function () { return /*#__PURE__*/_interopNamespaceDefault(require('./direct-relative-external')); });
Promise.resolve().then(function () { return /*#__PURE__*/_interopNamespaceDefault(require('to-indirect-relative-external')); });
Promise.resolve().then(function () { return /*#__PURE__*/_interopNamespaceDefault(require('direct-absolute-external')); });
Promise.resolve().then(function () { return /*#__PURE__*/_interopNamespaceDefault(require('to-indirect-absolute-external')); });
import('./direct-relative-external');
import('to-indirect-relative-external');
import('direct-absolute-external');
import('to-indirect-absolute-external');

const value = 'existing';
console.log('existing');
Expand All @@ -39,12 +39,12 @@ var existing = /*#__PURE__*/Object.freeze({

//main
Promise.resolve().then(function () { return existing; });
Promise.resolve().then(function () { return /*#__PURE__*/_interopNamespaceDefault(require('./direct-relative-external')); });
Promise.resolve().then(function () { return /*#__PURE__*/_interopNamespaceDefault(require('to-indirect-relative-external')); });
Promise.resolve().then(function () { return /*#__PURE__*/_interopNamespaceDefault(require('direct-absolute-external')); });
Promise.resolve().then(function () { return /*#__PURE__*/_interopNamespaceDefault(require('to-indirect-absolute-external')); });
import('./direct-relative-external');
import('to-indirect-relative-external');
import('direct-absolute-external');
import('to-indirect-absolute-external');

(function (t) { return Promise.resolve().then(function () { return /*#__PURE__*/_interopNamespaceDefault(require(t)); }); })('dynamic-direct-external' + unknown);
Promise.resolve().then(function () { return /*#__PURE__*/_interopNamespaceDefault(require('to-dynamic-indirect-external')); });
import('to-dynamic-indirect-external');
Promise.resolve().then(function () { return existing; });
(function (t) { return Promise.resolve().then(function () { return /*#__PURE__*/_interopNamespaceDefault(require(t)); }); })('my' + 'replacement');
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,8 @@ module.exports = {
output: {
globals: { external: 'external' },
name: 'bundle',
interop: 'auto'
interop: 'auto',
dynamicImportInCjs: false
}
}
};
Original file line number Diff line number Diff line change
Expand Up @@ -20,4 +20,4 @@ function _interopNamespaceDefault(e) {
(function (t) { return Promise.resolve().then(function () { return /*#__PURE__*/_interopNamespaceDefault(require(t)); }); })(`${globalThis.unknown}`);
(function (t) { return Promise.resolve().then(function () { return /*#__PURE__*/_interopNamespaceDefault(require(t)); }); })(`My ${globalThis.unknown}`);
(function (t) { return Promise.resolve().then(function () { return /*#__PURE__*/_interopNamespaceDefault(require(t)); }); })('./seven.js');
Promise.resolve().then(function () { return /*#__PURE__*/_interopNamespaceDefault(require('./seven.js')); });
import('./seven.js');
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,8 @@ module.exports = {
return 'compat';
},
name: 'bundle',
noConflict: true
noConflict: true,
dynamicImportInCjs: false
}
},
expectedWarnings: ['DEPRECATED_FEATURE']
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,8 @@ module.exports = {
return 'compat';
},
name: 'bundle',
noConflict: true
noConflict: true,
dynamicImportInCjs: false
}
},
expectedWarnings: ['DEPRECATED_FEATURE']
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,8 @@ module.exports = {
return 'compat';
},
name: 'bundle',
noConflict: true
noConflict: true,
dynamicImportInCjs: false
}
},
expectedWarnings: ['DEPRECATED_FEATURE']
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,8 @@ module.exports = {
return 'compat';
},
name: 'bundle',
noConflict: true
noConflict: true,
dynamicImportInCjs: false
}
},
expectedWarnings: ['DEPRECATED_FEATURE']
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,8 @@ module.exports = {
},
globals(id) {
return id.replace('-', '');
}
},
dynamicImportInCjs: false
}
}
};
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,8 @@ module.exports = {
checkedIds.add(id);
return id.split('-')[1];
},
format: 'cjs'
format: 'cjs',
dynamicImportInCjs: false
}
}
};
3 changes: 2 additions & 1 deletion test/form/samples/interop-per-dependency/_config.js
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,8 @@ module.exports = {
},
globals(id) {
return id.replace('-', '');
}
},
dynamicImportInCjs: false
}
}
};
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,8 @@ module.exports = {
},
compact: true,
externalLiveBindings: false,
name: 'bundle'
name: 'bundle',
dynamicImportInCjs: false
}
}
};
3 changes: 2 additions & 1 deletion test/form/samples/no-external-live-bindings/_config.js
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,8 @@ module.exports = {
external2: 'external2'
},
externalLiveBindings: false,
name: 'bundle'
name: 'bundle',
dynamicImportInCjs: false
}
}
};
19 changes: 1 addition & 18 deletions test/form/samples/paths-function/_expected/cjs.js
Original file line number Diff line number Diff line change
Expand Up @@ -2,23 +2,6 @@

var foo = require('https://unpkg.com/foo');

function _interopNamespaceDefault(e) {
var n = Object.create(null);
if (e) {
Object.keys(e).forEach(function (k) {
if (k !== 'default') {
var d = Object.getOwnPropertyDescriptor(e, k);
Object.defineProperty(n, k, d.get ? d : {
enumerable: true,
get: function () { return e[k]; }
});
}
});
}
n.default = e;
return Object.freeze(n);
}

assert.equal(foo, 42);

Promise.resolve().then(function () { return /*#__PURE__*/_interopNamespaceDefault(require('https://unpkg.com/foo')); }).then(({ default: foo }) => assert.equal(foo, 42));
import('https://unpkg.com/foo').then(({ default: foo }) => assert.equal(foo, 42));
Original file line number Diff line number Diff line change
Expand Up @@ -2,26 +2,9 @@

var myExternal = require('external');

function _interopNamespaceDefault(e) {
var n = Object.create(null);
if (e) {
Object.keys(e).forEach(function (k) {
if (k !== 'default') {
var d = Object.getOwnPropertyDescriptor(e, k);
Object.defineProperty(n, k, d.get ? d : {
enumerable: true,
get: function () { return e[k]; }
});
}
});
}
n.default = e;
return Object.freeze(n);
}

const test = () => myExternal;

const someDynamicImport = () => Promise.resolve().then(function () { return /*#__PURE__*/_interopNamespaceDefault(require('external')); });
const someDynamicImport = () => import('external');

exports.someDynamicImport = someDynamicImport;
exports.test = test;
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ module.exports = {
return exports.then(result => {
assert.strictEqual(result[0].message, 'exists-named');
assert.strictEqual(result[1].message, 'exists-default');
const expectedError = "Cannot find module 'does-not-exist'";
const expectedError = "Cannot find package 'does-not-exist'";
assert.strictEqual(result[2].message.slice(0, expectedError.length), expectedError);
});
}
Expand Down

0 comments on commit 1e5f448

Please sign in to comment.