pulse-zax/apps/server/build/build.ts

121 lines
3.2 KiB
TypeScript

import fs from 'fs/promises';
import path from 'path';
import semver from 'semver';
import { parseArgs } from 'util';
import { zipDirectory } from '../src/helpers/zip';
import {
compile,
getCurrentVersion,
getVersionInfo,
patchPackageJsons,
rmIfExists,
type TTarget
} from './helpers';
const { values } = parseArgs({
args: process.argv.slice(2),
options: {
bump: {
type: 'string',
default: 'none'
},
target: {
type: 'string',
default: 'all'
}
},
strict: true,
allowPositionals: true
});
if (values.bump && values.bump !== 'none') {
const newVersion = semver.inc(
await getCurrentVersion(),
values.bump as semver.ReleaseType
);
if (!newVersion) {
console.error('Failed to increment version');
process.exit(1);
}
await patchPackageJsons(newVersion);
}
const clientCwd = path.resolve(process.cwd(), '..', 'client');
const serverCwd = process.cwd();
const viteDistPath = path.join(clientCwd, 'dist');
const buildPath = path.join(serverCwd, 'build');
const buildTempPath = path.join(buildPath, 'temp');
const drizzleMigrationsPath = path.join(serverCwd, 'src', 'db', 'migrations');
const outPath = path.join(buildPath, 'out');
const releasePath = path.join(outPath, 'release.json');
const interfaceZipPath = path.join(buildTempPath, 'interface.zip');
const drizzleZipPath = path.join(buildTempPath, 'drizzle.zip');
await rmIfExists(buildTempPath);
await rmIfExists(outPath);
await fs.mkdir(buildTempPath, { recursive: true });
await fs.mkdir(outPath, { recursive: true });
console.log('Building client with Vite...');
const viteProc = Bun.spawn(['bun', 'run', 'build'], {
cwd: clientCwd,
stdout: 'inherit',
stderr: 'inherit',
stdin: 'inherit'
});
await viteProc.exited;
if (viteProc.exitCode !== 0) {
console.error('Client build failed');
process.exit(viteProc.exitCode);
}
console.log('Client build finished, output at:', viteDistPath);
console.log('Creating interface.zip...');
await zipDirectory(viteDistPath, interfaceZipPath);
console.log('Creating drizzle.zip...');
await zipDirectory(drizzleMigrationsPath, drizzleZipPath);
console.log('Compiling server with Bun...');
const allTargets: TTarget[] = [
{ out: 'pulse-linux-x64', target: 'bun-linux-x64' },
{ out: 'pulse-linux-arm64', target: 'bun-linux-arm64' },
{ out: 'pulse-windows-x64.exe', target: 'bun-windows-x64' },
{ out: 'pulse-macos-arm64', target: 'bun-darwin-arm64' }
// mediasoup doesn't support macOS x64
];
const targetFilter = values.target || 'all';
const targets = targetFilter === 'all'
? allTargets
: allTargets.filter((t) => t.target.includes(targetFilter));
if (targets.length === 0) {
console.error(`No targets matched filter: "${targetFilter}"`);
console.error('Available: linux-x64, linux-arm64, windows-x64, darwin-arm64, all');
process.exit(1);
}
for (const target of targets) {
console.log(`Building for target: ${target.target}...`);
await compile({
out: path.join(outPath, target.out),
target: target.target
});
}
const releaseInfo = await getVersionInfo(targets, outPath);
await fs.writeFile(releasePath, JSON.stringify(releaseInfo, null, 2), 'utf8');
await fs.rm(buildTempPath, { recursive: true, force: true });
console.log('Pulse built.');