UNPKG

techor

Version:

Author technology like a top leader

65 lines (62 loc) 2.39 kB
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 };