59 lines
1.4 KiB
TypeScript
59 lines
1.4 KiB
TypeScript
import type webpack from 'webpack';
|
|
import type { WebpackOptions } from '../../types';
|
|
|
|
export const getSwcLoader = (options: WebpackOptions): webpack.RuleSetRule | null => {
|
|
const {
|
|
mode,
|
|
loaders: {
|
|
swcLoader,
|
|
} = {},
|
|
} = options;
|
|
const isDev = mode === 'development';
|
|
|
|
if (swcLoader === 'off') {
|
|
return null;
|
|
}
|
|
|
|
return {
|
|
test: /\.[j|t]sx?$/,
|
|
exclude: /(node_modules|bower_components)/,
|
|
use: {
|
|
loader: 'swc-loader',
|
|
options: {
|
|
sync: true,
|
|
jsc: {
|
|
parser: {
|
|
syntax: 'typescript',
|
|
tsx: true,
|
|
dynamicImport: true,
|
|
privateMethod: true,
|
|
functionBind: true,
|
|
exportDefaultFrom: true,
|
|
exportNamespaceFrom: true,
|
|
decorators: true,
|
|
decoratorsBeforeExport: true,
|
|
topLevelAwait: true,
|
|
importMeta: true,
|
|
...swcLoader?.jsc?.parser,
|
|
},
|
|
transform: {
|
|
react: {
|
|
runtime: 'automatic',
|
|
development: isDev,
|
|
refresh: isDev,
|
|
...swcLoader?.jsc?.transform?.react,
|
|
},
|
|
...swcLoader?.jsc?.transform,
|
|
},
|
|
target: 'es2015',
|
|
loose: false,
|
|
externalHelpers: false,
|
|
keepClassNames: false,
|
|
...swcLoader?.jsc,
|
|
},
|
|
...swcLoader,
|
|
},
|
|
},
|
|
};
|
|
};
|