mirror of
https://github.com/WeBankFinTech/fes.js.git
synced 2026-07-03 06:28:13 +08:00
104 lines
3.0 KiB
TypeScript
104 lines
3.0 KiB
TypeScript
import type { WebpackBuildConfig } from '../../../shared';
|
|
import process from 'node:process';
|
|
import { winPath } from '@fesjs/utils';
|
|
import { esmRequire, esmResolve } from '../../../shared';
|
|
|
|
interface PresetOpts {
|
|
transformRuntime: Record<string, any>;
|
|
}
|
|
|
|
interface GetBabelOptsOptions {
|
|
cwd: string;
|
|
targets: Record<string, string>;
|
|
config: WebpackBuildConfig;
|
|
presetOpts: PresetOpts;
|
|
}
|
|
|
|
function getBabelOpts({ cwd, targets, config, presetOpts }: GetBabelOptsOptions) {
|
|
const presets: any[] = [
|
|
[
|
|
esmResolve('@babel/preset-env'),
|
|
{
|
|
targets,
|
|
useBuiltIns: 'usage',
|
|
corejs: {
|
|
version: esmRequire('core-js/package.json').version,
|
|
proposals: true,
|
|
},
|
|
modules: false,
|
|
},
|
|
],
|
|
[
|
|
// FEATURE 实现类型安全检查
|
|
esmRequire('@babel/preset-typescript').default,
|
|
{
|
|
// https://babeljs.io/docs/en/babel-plugin-transform-typescript#impartial-namespace-support
|
|
allowNamespaces: true,
|
|
isTSX: true,
|
|
allExtensions: true,
|
|
},
|
|
],
|
|
...(config.extraBabelPresets || []),
|
|
];
|
|
const plugins: any[] = [
|
|
esmRequire('@babel/plugin-proposal-export-default-from').default,
|
|
[
|
|
esmRequire('@babel/plugin-proposal-pipeline-operator').default,
|
|
{
|
|
proposal: 'minimal',
|
|
},
|
|
],
|
|
esmRequire('@babel/plugin-proposal-do-expressions').default,
|
|
esmRequire('@babel/plugin-proposal-function-bind').default,
|
|
[
|
|
esmResolve('@babel/plugin-transform-runtime'),
|
|
{
|
|
useESModules: true,
|
|
...presetOpts.transformRuntime,
|
|
},
|
|
],
|
|
esmResolve('@vue/babel-plugin-jsx'),
|
|
...(config.extraBabelPlugins || []),
|
|
];
|
|
return {
|
|
babelrc: false,
|
|
configFile: false,
|
|
cacheDirectory: process.env.BABEL_CACHE !== 'none' ? winPath(`${cwd}/.cache/babel-loader`) : false,
|
|
presets,
|
|
plugins,
|
|
overrides: [
|
|
{
|
|
test: [/[\\/]node_modules[\\/]/, /\.fes/],
|
|
sourceType: 'unambiguous',
|
|
},
|
|
],
|
|
};
|
|
}
|
|
|
|
interface ExportDefaultOptions {
|
|
cwd: string;
|
|
config: WebpackBuildConfig;
|
|
modifyBabelOpts?: (opts: any) => Promise<any>;
|
|
modifyBabelPresetOpts?: (opts: PresetOpts) => Promise<PresetOpts>;
|
|
targets: Record<string, string>;
|
|
}
|
|
|
|
export default async ({ cwd, config, modifyBabelOpts, modifyBabelPresetOpts, targets }: ExportDefaultOptions) => {
|
|
let presetOpts: PresetOpts = {
|
|
transformRuntime: {},
|
|
};
|
|
if (modifyBabelPresetOpts) {
|
|
presetOpts = await modifyBabelPresetOpts(presetOpts);
|
|
}
|
|
let babelOpts = getBabelOpts({
|
|
cwd,
|
|
config,
|
|
presetOpts,
|
|
targets,
|
|
});
|
|
if (modifyBabelOpts) {
|
|
babelOpts = await modifyBabelOpts(babelOpts);
|
|
}
|
|
return babelOpts;
|
|
};
|