light-sentry-sdk/scripts/build.js

126 lines
3.1 KiB
JavaScript
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

const esbuild = require('esbuild');
const fs = require('fs');
const path = require('path');
const { execSync } = require('child_process');
const isWatch = process.argv.includes('--watch');
const commonOptions = {
entryPoints: [path.resolve(__dirname, '../src/index.ts')],
bundle: true,
minify: true,
sourcemap: false,
target: ['es2018'],
logLevel: 'info',
};
// 生成 TypeScript 声明文件
function generateDeclarations() {
console.log('Generating TypeScript declarations...');
const tmpDir = path.resolve(__dirname, '../dist-tmp');
try {
// 清理临时目录
if (fs.existsSync(tmpDir)) {
fs.rmSync(tmpDir, { recursive: true, force: true });
}
fs.mkdirSync(tmpDir, { recursive: true });
// 生成所有 .d.ts 到临时目录(宽松模式,忽略错误)
execSync(
`tsc --skipLibCheck --declaration --declarationDir ${tmpDir} --outDir ${tmpDir} --strict false --noImplicitAny false --strictNullChecks false --noEmitOnError false --emitDeclarationOnly`,
{
cwd: path.resolve(__dirname, '..'),
stdio: 'pipe',
}
);
} catch (e) {
// 忽略 tsc 错误
}
// 只复制 .d.ts 文件到 dist删除多余的 .js
copyDtsFiles(tmpDir, path.resolve(__dirname, '../dist'));
// 清理临时目录
if (fs.existsSync(tmpDir)) {
fs.rmSync(tmpDir, { recursive: true, force: true });
}
console.log('Declarations generated.');
}
// 递归复制 .d.ts 文件
function copyDtsFiles(srcDir, destDir) {
if (!fs.existsSync(destDir)) {
fs.mkdirSync(destDir, { recursive: true });
}
const files = fs.readdirSync(srcDir);
for (const file of files) {
const srcPath = path.join(srcDir, file);
const stat = fs.statSync(srcPath);
if (stat.isDirectory()) {
copyDtsFiles(srcPath, path.join(destDir, file));
} else if (file.endsWith('.d.ts')) {
fs.copyFileSync(srcPath, path.join(destDir, file));
}
}
}
async function build() {
const distDir = path.resolve(__dirname, '../dist');
// 清理 dist 目录
if (fs.existsSync(distDir)) {
fs.rmSync(distDir, { recursive: true, force: true });
}
fs.mkdirSync(distDir, { recursive: true });
const outputs = [
{
format: 'iife',
outfile: path.resolve(__dirname, '../dist/index.iife.js'),
globalName: 'LightSDK',
},
{
format: 'esm',
outfile: path.resolve(__dirname, '../dist/index.esm.js'),
},
{
format: 'cjs',
outfile: path.resolve(__dirname, '../dist/index.cjs.js'),
},
];
for (const output of outputs) {
await esbuild.build({
...commonOptions,
format: output.format,
outfile: output.outfile,
globalName: output.globalName,
});
}
// 生成声明文件
generateDeclarations();
console.log('Build complete!');
}
if (isWatch) {
console.log('Watching for changes...');
const ctx = esbuild.context({
...commonOptions,
format: 'esm',
outfile: path.resolve(__dirname, '../dist/index.esm.js'),
});
ctx.watch();
} else {
build().catch((e) => {
console.error(e);
process.exit(1);
});
}