techor
Version:
Author technology like a top leader
65 lines (62 loc) • 2.39 kB
JavaScript
import { getTsconfig } from 'get-tsconfig';
import { transform } from '@swc/core';
import extend from '@techor/extend';
import { createFilter } from '../node_modules/.pnpm/@rollup_pluginutils@5.1.4_rollup@4.36.0/node_modules/@rollup/pluginutils/dist/es/index.mjs';
function swc({ tsconfigFile, include, exclude, minify, ...options } = {}) {
const filter = createFilter(include, exclude);
const compilerOptions = tsconfigFile === false ? {} : getTsconfig('.', tsconfigFile === true ? undefined : tsconfigFile)?.config?.compilerOptions || {};
let swcOptions = {
jsc: {
target: compilerOptions.target,
parser: {},
transform: {}
}
};
if (compilerOptions.experimentalDecorators) {
swcOptions.jsc.parser.decorators = true;
swcOptions.jsc.transform.legacyDecorator = true;
swcOptions.jsc.transform.decoratorMetadata = compilerOptions.emitDecoratorMetadata;
}
if (compilerOptions.jsx) {
swcOptions.jsc.transform.react = {
pragma: compilerOptions.jsxFactory,
pragmaFrag: compilerOptions.jsxFragmentFactory,
importSource: compilerOptions.jsxImportSource
};
}
swcOptions = extend(swcOptions, options);
return {
name: 'techor-swc',
async transform (code, id) {
if (!filter(id)) return null;
const transformed = await transform(code, {
filename: id,
sourceMaps: true,
...extend(swcOptions, {
jsc: {
parser: /\.tsx?$/.test(id) ? {
syntax: 'typescript',
tsx: /\.tsx$/.test(id)
} : {
syntax: 'ecmascript',
jsx: /\.jsx$/.test(id)
}
}
})
});
return {
code: transformed.code,
map: transformed.map && JSON.parse(transformed.map)
};
},
async renderChunk (code, chunk) {
return minify ? await transform(code, {
...swcOptions,
sourceMaps: true,
minify: true,
filename: chunk.fileName
}) : null;
}
};
}
export { swc as default };