vant/packages/vant-cli/src/compiler/compile-script.ts
neverland 1890cf6607
feat(@vant/cli): using esbuild to transform script (#10143)
* feat(@vant/cli): using esbuild to transform script

* chore: update babel doc

* chore: update lock

* chore: update

* fix: format
2022-01-06 14:47:28 +08:00

57 lines
1.3 KiB
TypeScript

import fse from 'fs-extra';
import babel from '@babel/core';
import esbuild, { type Format } from 'esbuild';
import { sep } from 'path';
import { isJsx, replaceExt } from '../common/index.js';
import { replaceCSSImportExt } from '../common/css.js';
import { replaceScriptImportExt } from './get-deps.js';
const { readFileSync, removeSync, outputFileSync } = fse;
export async function compileScript(
filePath: string,
format: Format
): Promise<void> {
if (filePath.includes('.d.ts')) {
return;
}
let code = readFileSync(filePath, 'utf-8');
if (!filePath.includes(`${sep}style${sep}`)) {
code = replaceCSSImportExt(code);
}
code = replaceScriptImportExt(code, '.vue', '');
if (isJsx(filePath)) {
const babelResult = await babel.transformAsync(code, {
filename: filePath,
babelrc: false,
presets: ['@babel/preset-typescript'],
plugins: [
[
'@vue/babel-plugin-jsx',
{
enableObjectSlots: false,
},
],
],
});
if (babelResult?.code) {
({ code } = babelResult);
}
}
const esbuildResult = await esbuild.transform(code, {
loader: 'ts',
target: 'es2016',
format,
});
({ code } = esbuildResult);
const jsFilePath = replaceExt(filePath, '.js');
removeSync(filePath);
outputFileSync(jsFilePath, code);
}