Skip to content

Commit fa44478

Browse files
authored
feat: Use csb-sucrase for compiling node modules (#7064)
* feat: use our sucrase fork to speedup transform for node modules * remove metric stuff
1 parent 4e7439d commit fa44478

File tree

4 files changed

+44
-49
lines changed

4 files changed

+44
-49
lines changed

packages/app/package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -117,6 +117,7 @@
117117
"console": "^0.7.2",
118118
"console-feed": "^3.1.9",
119119
"cropperjs": "^1.5.11",
120+
"csb-sucrase": "^3.28.3",
120121
"css-modules-loader-core": "^1.1.0",
121122
"date-fns": "^2.4.1",
122123
"date-fns-tz": "^1.0.7",

packages/app/src/sandbox/eval/transpilers/babel/index.ts

Lines changed: 14 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,16 @@
11
/* eslint-enable import/default */
22
import { isBabel7 } from '@codesandbox/common/lib/utils/is-babel-7';
33
import { isUrl } from '@codesandbox/common/lib/utils/is-url';
4+
import { transform as transformSucrase } from 'csb-sucrase';
45

56
/* eslint-disable import/default */
67
// @ts-ignore
78
import BabelWorker from 'worker-loader?publicPath=/&name=babel-transpiler.[hash:8].worker.js!./worker/index';
89

910
import delay from '@codesandbox/common/lib/utils/delay';
10-
import { endMeasure, measure } from '@codesandbox/common/lib/utils/metrics';
1111
import { LoaderContext, Manager } from 'sandpack-core';
1212
import WorkerTranspiler from '../worker-transpiler/transpiler';
1313
import getBabelConfig from './babel-parser';
14-
import { getSyntaxInfoFromAst } from './ast/syntax-info';
15-
import { convertEsModule } from './ast/convert-esmodule';
16-
import { ESTreeAST, generateCode, parseModule } from './ast/utils';
17-
import { collectDependenciesFromAST } from './ast/collect-dependencies';
18-
import { rewriteImportMeta } from './ast/rewrite-meta';
1914

2015
const MAX_WORKER_ITERS = 100;
2116

@@ -111,45 +106,20 @@ class BabelTranspiler extends WorkerTranspiler {
111106
// node_modules to commonjs and collecting deps
112107
if (loaderContext.options.simpleRequire || isNodeModule) {
113108
try {
114-
const ast: ESTreeAST = parseModule(code);
115-
const syntaxInfo = getSyntaxInfoFromAst(ast);
116-
if (!syntaxInfo.jsx) {
117-
// If the code is ESM we transform it to commonjs and return it
118-
if (syntaxInfo.esm) {
119-
measure(`esconvert-${path}`);
120-
convertEsModule(ast);
121-
// We collect requires instead of doing this in convertESModule as some modules also use require
122-
// Which is actually invalid but we probably don't wanna break anyone's code if it works in other bundlers...
123-
const deps = collectDependenciesFromAST(ast);
124-
await addCollectedDependencies(
125-
loaderContext,
126-
deps.map(d => ({
127-
path: d,
128-
}))
129-
);
130-
rewriteImportMeta(ast, {
131-
url: loaderContext.url,
132-
});
133-
endMeasure(`esconvert-${path}`, { silent: true });
134-
return {
135-
transpiledCode: generateCode(ast),
136-
};
137-
}
109+
const result = transformSucrase(code, {
110+
transforms: ['dep-collector', 'imports', 'flow', 'jsx'],
111+
});
138112

139-
// If the code is commonjs and does not contain any more jsx, we generate and return the code.
140-
measure(`dep-collection-${path}`);
141-
const deps = collectDependenciesFromAST(ast);
142-
await addCollectedDependencies(
143-
loaderContext,
144-
deps.map(d => ({
145-
path: d,
146-
}))
147-
);
148-
endMeasure(`dep-collection-${path}`, { silent: true });
149-
return {
150-
transpiledCode: code,
151-
};
152-
}
113+
await addCollectedDependencies(
114+
loaderContext,
115+
Array.from(result.dependencies).map(d => ({
116+
path: d,
117+
}))
118+
);
119+
120+
return {
121+
transpiledCode: result.code,
122+
};
153123
} catch (err) {
154124
// do not log this in production, it confuses our users
155125
if (process.env.NODE_ENV === 'development') {

packages/sandpack-core/src/transpiled-module/transpiled-module.ts

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1051,10 +1051,17 @@ export class TranspiledModule {
10511051
const usedGlobals = globals || {};
10521052
usedGlobals.__dirname = pathUtils.dirname(this.module.path);
10531053
usedGlobals.__filename = this.module.path;
1054-
usedGlobals.$csbImport = (path: string) =>
1055-
manager
1056-
.evaluate(path, this)
1054+
const self = this;
1055+
// eslint-disable-next-line no-inner-declarations
1056+
function $csbImport(path: string) {
1057+
return manager
1058+
.evaluate(path, self)
10571059
.then(result => interopRequireWildcard(result));
1060+
}
1061+
$csbImport.meta = {
1062+
url: this.module.url ? this.module.url : `file://${this.module.path}`,
1063+
};
1064+
usedGlobals.$csbImport = $csbImport;
10581065

10591066
const code =
10601067
this.source.compiledCode +

yarn.lock

Lines changed: 19 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11308,6 +11308,18 @@ crypto-random-string@^1.0.0:
1130811308
resolved "https://registry.yarnpkg.com/crypto-random-string/-/crypto-random-string-1.0.0.tgz#a230f64f568310e1498009940790ec99545bca7e"
1130911309
integrity sha1-ojD2T1aDEOFJgAmUB5DsmVRbyn4=
1131011310

11311+
csb-sucrase@^3.28.3:
11312+
version "3.28.3"
11313+
resolved "https://registry.yarnpkg.com/csb-sucrase/-/csb-sucrase-3.28.3.tgz#62d3b46fa6b1334d5fa137b8c1ba3122530a37b5"
11314+
integrity sha512-ASHJbr48zp4TxlsOxdS9/+/ERQhDkDN8uj8rb5m+e6lm/GGvd76xdZbPM10HbejCcmRSjZIoJS0JrCllPsn7WA==
11315+
dependencies:
11316+
commander "^4.0.0"
11317+
glob "7.1.6"
11318+
lines-and-columns "^1.1.6"
11319+
mz "^2.7.0"
11320+
pirates "^4.0.1"
11321+
ts-interface-checker "^0.1.9"
11322+
1131111323
css-animation@^1.3.2:
1131211324
version "1.4.1"
1131311325
resolved "https://registry.yarnpkg.com/css-animation/-/css-animation-1.4.1.tgz#5b8813125de0fbbbb0bbe1b472ae84221469b7a8"
@@ -13680,7 +13692,7 @@ esprima@^4.0.0, esprima@^4.0.1, esprima@~4.0.0:
1368013692
resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71"
1368113693
integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==
1368213694

13683-
esquery@1.0.1, esquery@^1.0.0, esquery@^1.0.1:
13695+
esquery@^1.0.0, esquery@^1.0.1:
1368413696
version "1.0.1"
1368513697
resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.0.1.tgz#406c51658b1f5991a5f9b62b1dc25b00e3e5c708"
1368613698
integrity sha512-SmiyZ5zIWH9VM+SRUReLS5Q8a7GxtRdxEBVZpm98rJM7Sb+A9DVCndXfkeFUd3byderg+EbDkfnevfCwynWaNA==
@@ -23142,7 +23154,7 @@ [email protected], mute-stream@~0.0.4:
2314223154
resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.8.tgz#1630c42b2251ff81e2a283de96a5497ea92e5e0d"
2314323155
integrity sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==
2314423156

23145-
mz@^2.5.0:
23157+
mz@^2.5.0, mz@^2.7.0:
2314623158
version "2.7.0"
2314723159
resolved "https://registry.yarnpkg.com/mz/-/mz-2.7.0.tgz#95008057a56cafadc2bc63dde7f9ff6955948e32"
2314823160
integrity sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==
@@ -32413,6 +32425,11 @@ ts-easing@^0.2.0:
3241332425
resolved "https://registry.yarnpkg.com/ts-easing/-/ts-easing-0.2.0.tgz#c8a8a35025105566588d87dbda05dd7fbfa5a4ec"
3241432426
integrity sha512-Z86EW+fFFh/IFB1fqQ3/+7Zpf9t2ebOAxNI/V6Wo7r5gqiqtxmgTlQ1qbqQcjLKYeSHPTsEmvlJUDg/EuL0uHQ==
3241532427

32428+
ts-interface-checker@^0.1.9:
32429+
version "0.1.13"
32430+
resolved "https://registry.yarnpkg.com/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz#784fd3d679722bc103b1b4b8030bcddb5db2a699"
32431+
integrity sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==
32432+
3241632433
ts-invariant@^0.4.0, ts-invariant@^0.4.2, ts-invariant@^0.4.4:
3241732434
version "0.4.4"
3241832435
resolved "https://registry.yarnpkg.com/ts-invariant/-/ts-invariant-0.4.4.tgz#97a523518688f93aafad01b0e80eb803eb2abd86"

0 commit comments

Comments
 (0)