Skip to content

Commit

Permalink
fix(commonjs): replace top-level this with exports name (#1618)
Browse files Browse the repository at this point in the history
  • Loading branch information
bluwy committed Sep 23, 2024
1 parent 28b9701 commit 2fdd077
Show file tree
Hide file tree
Showing 4 changed files with 14 additions and 8 deletions.
8 changes: 7 additions & 1 deletion packages/commonjs/src/transform-commonjs.js
Original file line number Diff line number Diff line change
Expand Up @@ -102,6 +102,7 @@ export default async function transformCommonjs(
const topLevelAssignments = new Set();
const topLevelDefineCompiledEsmExpressions = [];
const replacedGlobal = [];
const replacedThis = [];
const replacedDynamicRequires = [];
const importedVariables = new Set();
const indentExclusionRanges = [];
Expand Down Expand Up @@ -369,7 +370,7 @@ export default async function transformCommonjs(
if (lexicalDepth === 0 && !classBodyDepth) {
uses.global = true;
if (!ignoreGlobal) {
replacedGlobal.push(node);
replacedThis.push(node);
}
}
return;
Expand Down Expand Up @@ -444,6 +445,11 @@ export default async function transformCommonjs(
storeName: true
});
}
for (const node of replacedThis) {
magicString.overwrite(node.start, node.end, exportsName, {
storeName: true
});
}
for (const node of replacedDynamicRequires) {
magicString.overwrite(
node.start,
Expand Down
5 changes: 3 additions & 2 deletions packages/commonjs/test/fixtures/function/this/main.js
Original file line number Diff line number Diff line change
@@ -1,10 +1,11 @@
const { augmentThis, classThis } = require('./foo');
const { augmentThis, classThis, y } = require('./foo');

const obj = {};
augmentThis.call(obj);

t.is(obj.x, 'x');
t.is(this.y, 'y');
t.is(this.y, undefined);
t.is(y, 'y');

const instance = new classThis();

Expand Down
9 changes: 4 additions & 5 deletions packages/commonjs/test/snapshots/function.js.md
Original file line number Diff line number Diff line change
Expand Up @@ -7286,8 +7286,6 @@ Generated by [AVA](https://avajs.dev).
{
'main.js': `'use strict';␊
␊
var commonjsGlobal = typeof globalThis !== 'undefined' ? globalThis : typeof window !== 'undefined' ? window : typeof global !== 'undefined' ? global : typeof self !== 'undefined' ? self : {};␊
␊
var main = {};␊
␊
var foo = {};␊
Expand All @@ -7296,7 +7294,7 @@ Generated by [AVA](https://avajs.dev).
this.x = 'x';␊
};␊
␊
commonjsGlobal.y = 'y';␊
foo.y = 'y';␊
␊
foo.classThis = class classThis {␊
constructor(){␊
Expand All @@ -7310,13 +7308,14 @@ Generated by [AVA](https://avajs.dev).
yy = this.y␊
};␊
␊
const { augmentThis, classThis } = foo;␊
const { augmentThis, classThis, y } = foo;␊
␊
const obj = {};␊
augmentThis.call(obj);␊
␊
t.is(obj.x, 'x');␊
t.is(commonjsGlobal.y, 'y');␊
t.is(main.y, undefined);␊
t.is(y, 'y');␊
␊
const instance = new classThis();␊
␊
Expand Down
Binary file modified packages/commonjs/test/snapshots/function.js.snap
Binary file not shown.

0 comments on commit 2fdd077

Please sign in to comment.