Skip to content

Commit a843654

Browse files
authored
fix(commonjs): idempotence issue (#871)
1 parent 8298568 commit a843654

File tree

4 files changed

+25
-9
lines changed

4 files changed

+25
-9
lines changed

packages/commonjs/src/index.js

+5-3
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,7 @@ export default function commonjs(options = {}) {
7272

7373
const esModulesWithDefaultExport = new Set();
7474
const esModulesWithNamedExports = new Set();
75+
const isCjsPromises = new Map();
7576

7677
const ignoreRequire =
7778
typeof options.ignore === 'function'
@@ -208,7 +209,8 @@ export default function commonjs(options = {}) {
208209
actualId,
209210
getRequireReturnsDefault(actualId),
210211
esModulesWithDefaultExport,
211-
esModulesWithNamedExports
212+
esModulesWithNamedExports,
213+
isCjsPromises
212214
);
213215
}
214216

@@ -244,11 +246,11 @@ export default function commonjs(options = {}) {
244246
if (commonjs) {
245247
const isCjs = commonjs.isCommonJS;
246248
if (isCjs != null) {
247-
setIsCjsPromise(id, isCjs);
249+
setIsCjsPromise(isCjsPromises, id, isCjs);
248250
return;
249251
}
250252
}
251-
setIsCjsPromise(id, null);
253+
setIsCjsPromise(isCjsPromises, id, null);
252254
}
253255
};
254256
}

packages/commonjs/src/is-cjs.js

+2-4
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,4 @@
1-
const isCjsPromises = new Map();
2-
3-
export function getIsCjsPromise(id) {
1+
export function getIsCjsPromise(isCjsPromises, id) {
42
let isCjsPromise = isCjsPromises.get(id);
53
if (isCjsPromise) return isCjsPromise.promise;
64

@@ -16,7 +14,7 @@ export function getIsCjsPromise(id) {
1614
return promise;
1715
}
1816

19-
export function setIsCjsPromise(id, resolution) {
17+
export function setIsCjsPromise(isCjsPromises, id, resolution) {
2018
const isCjsPromise = isCjsPromises.get(id);
2119
if (isCjsPromise) {
2220
if (isCjsPromise.resolve) {

packages/commonjs/src/proxies.js

+3-2
Original file line numberDiff line numberDiff line change
@@ -46,10 +46,11 @@ export async function getStaticRequireProxy(
4646
id,
4747
requireReturnsDefault,
4848
esModulesWithDefaultExport,
49-
esModulesWithNamedExports
49+
esModulesWithNamedExports,
50+
isCjsPromises
5051
) {
5152
const name = getName(id);
52-
const isCjs = await getIsCjsPromise(id);
53+
const isCjs = await getIsCjsPromise(isCjsPromises, id);
5354
if (isCjs) {
5455
return `import { __moduleExports } from ${JSON.stringify(id)}; export default __moduleExports;`;
5556
} else if (isCjs === null) {

packages/commonjs/test/test.js

+15
Original file line numberDiff line numberDiff line change
@@ -759,3 +759,18 @@ if (Number(/^v(\d+)/.exec(process.version)[1]) >= 12) {
759759
t.is(code, await new Promise((done) => getRollupUpCodeWithCache.on('message', done)));
760760
});
761761
}
762+
763+
test('does not affect subsequently created instances when called with `requireReturnsDefault: "preferred"`', async (t) => {
764+
const input = 'fixtures/function/import-esm-require-returns-default-preferred/main.js';
765+
const options = { requireReturnsDefault: 'preferred' };
766+
767+
const instance1 = commonjs(options);
768+
const bundle1 = await rollup({ input, plugins: [instance1] });
769+
const code1 = (await bundle1.generate({})).output[0].code;
770+
771+
const instance2 = commonjs(options);
772+
const bundle2 = await rollup({ input, plugins: [instance2] });
773+
const code2 = (await bundle2.generate({})).output[0].code;
774+
775+
t.is(code1, code2);
776+
});

0 commit comments

Comments
 (0)