/
babel.ts
78 lines (73 loc) · 2.5 KB
/
babel.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
import { transformSync } from "@babel/core";
import type {
TransformOptions as BabelTransformOptions,
PluginItem,
} from "@babel/core";
import { TransformOptions, TRANSFORM_RESULT } from "./types";
import { TransformImportMetaPlugin } from "./plugins/babel-plugin-transform-import-meta";
import { importMetaEnvPlugin } from "./plugins/import-meta-env";
export default function transform(opts: TransformOptions): TRANSFORM_RESULT {
const _opts: BabelTransformOptions & { plugins: PluginItem[] } = {
babelrc: false,
configFile: false,
compact: false,
retainLines:
typeof opts.retainLines === "boolean" ? opts.retainLines : true,
filename: "",
cwd: "/",
...opts.babel,
plugins: [
[
require("@babel/plugin-transform-modules-commonjs"),
{ allowTopLevelThis: true },
],
[require("babel-plugin-dynamic-import-node"), { noInterop: true }],
[TransformImportMetaPlugin, { filename: opts.filename }],
[require("@babel/plugin-syntax-class-properties")],
[require("@babel/plugin-transform-export-namespace-from")],
[importMetaEnvPlugin],
],
};
if (opts.ts) {
_opts.plugins.push([
require("@babel/plugin-transform-typescript"),
{ allowDeclareFields: true },
]);
// `unshift` because these plugin must come before `@babel/plugin-syntax-class-properties`
_opts.plugins.unshift(
[require("babel-plugin-transform-typescript-metadata")],
[require("@babel/plugin-proposal-decorators"), { legacy: true }],
);
_opts.plugins.push(require("babel-plugin-parameter-decorator"));
_opts.plugins.push(require("@babel/plugin-syntax-import-assertions"));
}
if (opts.legacy) {
_opts.plugins.push(
require("@babel/plugin-transform-nullish-coalescing-operator"),
);
_opts.plugins.push(require("@babel/plugin-transform-optional-chaining"));
}
if (opts.babel && Array.isArray(opts.babel.plugins)) {
_opts.plugins?.push(...opts.babel.plugins);
}
try {
return {
code: transformSync(opts.source, _opts)?.code || "",
};
} catch (error: any) {
return {
error,
code:
"exports.__JITI_ERROR__ = " +
JSON.stringify({
filename: opts.filename,
line: error.loc?.line || 0,
column: error.loc?.column || 0,
code: error.code
?.replace("BABEL_", "")
.replace("PARSE_ERROR", "ParseError"),
message: error.message?.replace("/: ", "").replace(/\(.+\)\s*$/, ""),
}),
};
}
}