Skip to content
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.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion src/plugins/fast-cjs-plugin.js
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ const CJS_KEYWORDS = /\b(module\.exports|exports)\b/;

const ESM_KEYWORDS = /(\bimport\s*(\{|\s['"\w_$])|[\s;]export(\s+(default|const|var|let)[^\w$]|\s*\{))/;

const HELPER = `function $$cjs_default$$(m){try{'default'in m||Object.defineProperty(m,'default',{configurable:true,value:m})}catch(e){}return m}`;
const HELPER = `function $$cjs_default$$(m,i){for(i in m)if(i!='default')return m;return m.default||m}`;

/**
* Extremely loose and questionable (but fast) conversion from CJS to ESM.
Expand Down
45 changes: 41 additions & 4 deletions test/fixtures.test.js
Original file line number Diff line number Diff line change
Expand Up @@ -148,15 +148,15 @@ describe('fixtures', () => {
await getOutput(env, instance);

// import * as foo from './foo.cjs'
expect(await env.page.$eval('#cjs', el => JSON.parse(el.textContent || ''))).toEqual({
expect(await env.page.$eval('#cjs', el => JSON.parse(el.textContent || 'null'))).toEqual({
default: {
a: 'one',
b: 'two'
}
});

// import foo from './foo.cjs'
expect(await env.page.$eval('#cjsdefault', el => JSON.parse(el.textContent || ''))).toEqual({
expect(await env.page.$eval('#cjsdefault', el => JSON.parse(el.textContent || 'null'))).toEqual({
a: 'one',
b: 'two'
});
Expand All @@ -165,8 +165,45 @@ describe('fixtures', () => {
expect(await env.page.$eval('#cjsimport', el => JSON.parse(el.textContent || ''))).toEqual({
default: 'default export',
a: 1,
b: 2,
c: 3
b: 2
});

const imports = /** @type{object} */ (await env.page.evaluate(`import('/cjs-imports.cjs')`)).default;

// requiring a CJS module with (`exports.a=..`) exports should return its named exports:
expect(imports.namedCjs).toEqual({
a: 1,
b: 2
});
// requiring an ES module with only named exports should return its named exports:
expect(imports.namedEsm).toEqual({
a: 1,
b: 2
});

// requiring a CJS module with `module.exports=..` exports should return that default export:
expect(imports.defaultCjs).toEqual({
a: 1,
b: 2
});
// requiring an ES module with only a default export should return its default export:
expect(imports.defaultEsm).toEqual({
a: 1,
b: 2
});

// requiring an ES module with both named+default exports should return its default export:
expect(imports.mixedEsm).toEqual({
default: 'default export',
a: 1,
b: 2
});
// requiring a CJS module with transpiled named+default exports should return its faux ModuleRecord:
expect(imports.mixedCjs).toEqual({
__esModule: true,
default: 'default export',
a: 1,
b: 2
});
});
});
Expand Down
8 changes: 8 additions & 0 deletions test/fixtures/commonjs/cjs-imports.cjs
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
exports.namedCjs = require('./named.cjs');
exports.namedEsm = require('./named.js');

exports.defaultCjs = require('./default.cjs');
exports.defaultEsm = require('./default.js');

exports.mixedEsm = require('./mixed.js');
exports.mixedCjs = require('./mixed.cjs');
1 change: 1 addition & 0 deletions test/fixtures/commonjs/default.cjs
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
module.exports = { a: 1, b: 2 };
1 change: 1 addition & 0 deletions test/fixtures/commonjs/default.js
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
export default { a: 1, b: 2 };
8 changes: 6 additions & 2 deletions test/fixtures/commonjs/foo.cjs
Original file line number Diff line number Diff line change
@@ -1,8 +1,12 @@
const other = require('./other.js');
const other = require('./mixed.js');

console.log(other);

document.querySelector('#cjsimport').textContent = JSON.stringify(other);
let collected = {};
for (let i in other) collected[i] = other[i];
collected.default = other.default;

document.querySelector('#cjsimport').textContent = JSON.stringify(collected);

exports.a = 'one';
exports.b = 'two';
13 changes: 13 additions & 0 deletions test/fixtures/commonjs/mixed.cjs
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
// this is Babel's transpiled output of `mixed.js`

exports.__esModule = true;
exports.b = exports.a = exports.default = void 0;

let _default = 'default export';
exports.default = _default;

const a = 1;
exports.a = a;

const b = 2;
exports.b = b;
Original file line number Diff line number Diff line change
@@ -1,4 +1,3 @@
export default 'default export';
export const a = 1;
export const b = 2;
export const c = 3;
2 changes: 2 additions & 0 deletions test/fixtures/commonjs/named.cjs
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
exports.a = 1;
exports.b = 2;
2 changes: 2 additions & 0 deletions test/fixtures/commonjs/named.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
export const a = 1;
export const b = 2;