-
Notifications
You must be signed in to change notification settings - Fork 18
/
transpile-requires.ts
69 lines (56 loc) · 1.66 KB
/
transpile-requires.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
import { PluginItem } from '@babel/core';
import { transform, TransformOptions } from '@codemod/core';
import { extname } from 'path';
import { addHook } from 'pirates';
import { PluginExtensions, TypeScriptExtensions } from './extensions';
let useBabelConfig = false;
let revert: (() => void) | null = null;
export function hook(code: string, filename: string): string {
const ext = extname(filename);
if (!PluginExtensions.has(ext)) {
throw new Error(`cannot load file type '${ext}': ${filename}`);
}
const plugins: Array<PluginItem> = [];
const presets: Array<PluginItem> = [];
const options: TransformOptions = {
filename,
babelrc: useBabelConfig,
presets,
plugins,
sourceMaps: 'inline'
};
plugins.push(require.resolve('@babel/plugin-proposal-class-properties'));
if (!useBabelConfig) {
options.configFile = useBabelConfig;
}
if (!useBabelConfig) {
if (TypeScriptExtensions.has(ext)) {
presets.push(require.resolve('@babel/preset-typescript'));
}
presets.push([
require.resolve('@babel/preset-env'),
{ useBuiltIns: 'entry', corejs: { version: 3, proposals: true } }
]);
}
const result = transform(code, options);
if (!result) {
throw new Error(`[${filename}] babel transform returned null`);
}
return result.code as string;
}
export function enable(shouldUseBabelConfig = false): void {
disable();
useBabelConfig = shouldUseBabelConfig;
require('core-js');
require('regenerator-runtime');
revert = addHook(hook, {
exts: Array.from(PluginExtensions),
ignoreNodeModules: true
});
}
export function disable(): void {
if (revert) {
revert();
revert = null;
}
}