Skip to content

Commit 0f58806

Browse files
committed
Fix default interop
1 parent f5d5ed3 commit 0f58806

File tree

4 files changed

+143
-6
lines changed

4 files changed

+143
-6
lines changed

packages/app/src/sandbox/eval/transpilers/babel/convert-esmodule/__snapshots__/index.test.ts.snap

Lines changed: 18 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,12 @@ exports.default = $csb__default;
2020

2121
exports[`convert-esmodule can convert default imports 1`] = `
2222
"var $csb__b = require(\\"./b\\");
23-
var a = $csb__b.default;
23+
var a = $_csb__interopRequireDefault($csb__b).default;
24+
function $_csb__interopRequireDefault(obj) {
25+
return obj && obj.__esModule ? obj : {
26+
default: obj
27+
};
28+
}
2429
"
2530
`;
2631

@@ -84,16 +89,21 @@ var b = $csb__b.a;
8489

8590
exports[`convert-esmodule can handle async code 1`] = `
8691
"var $csb__test = require(\\"./test\\");
87-
var T = $csb__test.default;
92+
var T = $_csb__interopRequireDefault($csb__test).default;
8893
(async () => {
8994
const test = await test2();
9095
});
96+
function $_csb__interopRequireDefault(obj) {
97+
return obj && obj.__esModule ? obj : {
98+
default: obj
99+
};
100+
}
91101
"
92102
`;
93103

94104
exports[`convert-esmodule can handle class properties 1`] = `
95105
"var $csb__test = require(\\"./test\\");
96-
var T = $csb__test.default;
106+
var T = $_csb__interopRequireDefault($csb__test).default;
97107
class T2 {
98108
a = () => {
99109
return \\"test\\";
@@ -102,6 +112,11 @@ class T2 {
102112
c = {}
103113
static d = \\"\\"
104114
}
115+
function $_csb__interopRequireDefault(obj) {
116+
return obj && obj.__esModule ? obj : {
117+
default: obj
118+
};
119+
}
105120
"
106121
`;
107122

packages/app/src/sandbox/eval/transpilers/babel/convert-esmodule/index.test.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -105,7 +105,7 @@ describe('convert-esmodule', () => {
105105
expect(convertEsModule(code)).toMatchSnapshot();
106106
});
107107

108-
it.skip('has good perf', () => {
108+
it.only('has good perf', () => {
109109
/* eslint-disable */
110110
const code = require('./big-file');
111111

packages/app/src/sandbox/eval/transpilers/babel/convert-esmodule/index.ts

Lines changed: 51 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ import {
1010
generateExportMemberStatement,
1111
generateExportStatement,
1212
generateEsModuleSpecifier,
13+
generateInteropRequire,
1314
} from './utils';
1415
import { customGenerator } from './generator';
1516

@@ -43,6 +44,16 @@ export function convertEsModule(code: string) {
4344
i++;
4445
}
4546

47+
let addedDefaultInterop = false;
48+
function addDefaultInterop() {
49+
if (addedDefaultInterop) {
50+
return;
51+
}
52+
addedDefaultInterop = true;
53+
54+
program.body.push(generateInteropRequire());
55+
}
56+
4657
for (; i < program.body.length; i++) {
4758
const statement = program.body[i];
4859

@@ -182,10 +193,48 @@ export function convertEsModule(code: string) {
182193
if (specifier.type === n.ImportDefaultSpecifier) {
183194
// import Test from 'test';
184195
// const _test = require('test');
185-
// var Test = _test.default;
196+
// var Test = interopRequireDefault(_test);
186197
localName = specifier.local.name;
187198
importName = 'default';
188-
} else if (specifier.type === n.ImportSpecifier) {
199+
addDefaultInterop();
200+
201+
program.body.splice(i, 0, {
202+
type: 'VariableDeclaration',
203+
kind: 'var',
204+
declarations: [
205+
{
206+
type: 'VariableDeclarator',
207+
init: {
208+
type: 'MemberExpression',
209+
object: {
210+
type: 'CallExpression',
211+
callee: {
212+
type: 'Identifier',
213+
name: '$_csb__interopRequireDefault',
214+
},
215+
arguments: [
216+
{
217+
type: 'Identifier',
218+
name: varName,
219+
},
220+
],
221+
},
222+
computed: false,
223+
property: {
224+
type: 'Identifier',
225+
name: 'default',
226+
},
227+
},
228+
id: {
229+
type: 'Identifier',
230+
name: localName,
231+
},
232+
},
233+
],
234+
});
235+
return;
236+
}
237+
if (specifier.type === n.ImportSpecifier) {
189238
// import {Test} from 'test';
190239
// const _test = require('test');
191240
// var Test = _test.Test;

packages/app/src/sandbox/eval/transpilers/babel/convert-esmodule/utils.ts

Lines changed: 73 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -290,3 +290,76 @@ export function generateEsModuleSpecifier() {
290290
},
291291
};
292292
}
293+
294+
export function generateInteropRequire() {
295+
return {
296+
type: n.FunctionDeclaration,
297+
params: [
298+
{
299+
type: n.Identifier,
300+
name: 'obj' as 'obj',
301+
},
302+
],
303+
body: {
304+
type: n.BlockStatement,
305+
body: [
306+
{
307+
type: n.ReturnStatement,
308+
argument: {
309+
type: n.ConditionalExpression,
310+
test: {
311+
type: n.LogicalExpression,
312+
left: {
313+
type: n.Identifier,
314+
name: 'obj',
315+
},
316+
right: {
317+
type: n.MemberExpression,
318+
object: {
319+
type: n.Identifier,
320+
name: 'obj',
321+
},
322+
computed: false,
323+
property: {
324+
type: n.Identifier,
325+
name: '__esModule',
326+
},
327+
},
328+
operator: '&&',
329+
},
330+
consequent: {
331+
type: n.Identifier,
332+
name: 'obj',
333+
},
334+
alternate: {
335+
type: n.ObjectExpression,
336+
properties: [
337+
{
338+
type: n.Property,
339+
key: {
340+
type: n.Identifier,
341+
name: 'default',
342+
},
343+
value: {
344+
type: n.Identifier,
345+
name: 'obj',
346+
},
347+
kind: 'init' as 'init',
348+
computed: false,
349+
method: false,
350+
shorthand: false,
351+
},
352+
],
353+
},
354+
},
355+
},
356+
],
357+
},
358+
async: false,
359+
generator: false,
360+
id: {
361+
type: n.Identifier,
362+
name: '$_csb__interopRequireDefault',
363+
},
364+
};
365+
}

0 commit comments

Comments
 (0)