-
Notifications
You must be signed in to change notification settings - Fork 34
/
index.ts
48 lines (42 loc) · 2.18 KB
/
index.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
import path from 'path';
import {PluginItem, TransformOptions} from '@babel/core';
import debugReactComponentFileName from '@reskript/babel-plugin-debug-react-component-file-name';
import pluginRemovePropTypes from 'babel-plugin-transform-react-remove-prop-types';
// TODO: https://github.com/facebook/react/pull/23087
import pluginReactRefresh from 'react-refresh/babel.js';
import {compact} from '@reskript/core';
import {fillBabelConfigOptions} from './utils.js';
import getParseOnlyBabelConfigFilled from './parseOnly.js';
import getTransformBabelConfigFilled from './transform.js';
import {BabelConfigOptions, BabelConfigOptionsFilled} from './interface.js';
export type {BabelConfigOptions};
export const getParseOnlyBabelConfig = (options?: BabelConfigOptions): TransformOptions => {
return getParseOnlyBabelConfigFilled(fillBabelConfigOptions(options));
};
export const getTransformBabelConfig = (input?: BabelConfigOptions): TransformOptions => {
return getTransformBabelConfigFilled(fillBabelConfigOptions(input));
};
const requireFileName = (options: BabelConfigOptionsFilled) => {
const {mode, hostType} = options;
return mode === 'development' && hostType === 'application';
};
export const getBabelConfig = (input?: BabelConfigOptions): TransformOptions => {
const options = fillBabelConfigOptions(input);
const {mode, hot, hostType, cwd, srcDirectory} = options;
const transform = getTransformBabelConfig(options);
const requireReactOptimization = mode === 'production' && hostType === 'application';
const plugins: Array<PluginItem | false> = [
// 这东西必须放在最前面,不然其它插件会转义出如`function Wrapper()`这样的函数,这个插件再插入代码就会出问题
requireFileName(options) && [
debugReactComponentFileName,
{
srcDirectory: path.resolve(cwd, srcDirectory),
fullPathPrefix: options.openInEditorPrefix,
},
],
...transform.plugins || [],
requireReactOptimization && pluginRemovePropTypes,
hot && [pluginReactRefresh, {skipEnvCheck: true}],
];
return {presets: transform.presets, plugins: compact(plugins)};
};