trilium/scripts/build-utils.ts
2025-09-02 13:59:09 +03:00

99 lines
3 KiB
TypeScript

import { execSync } from "child_process";
import { build as esbuild } from "esbuild";
import { cpSync, existsSync, rmSync } from "fs";
import { copySync, emptyDirSync, mkdirpSync } from "fs-extra";
import { join } from "path";
export default class BuildHelper {
private rootDir: string;
projectDir: string;
outDir: string;
constructor(projectPath: string) {
this.rootDir = join(__dirname, "..");
this.projectDir = join(this.rootDir, projectPath);
this.outDir = join(this.projectDir, "dist");
emptyDirSync(this.outDir);
}
copy(projectDirPath: string, outDirPath: string) {
let sourcePath: string;
if (projectDirPath.startsWith("/")) {
sourcePath = join(this.rootDir, projectDirPath.substring(1));
} else {
sourcePath = join(this.projectDir, projectDirPath);
}
if (outDirPath.endsWith("/")) {
mkdirpSync(join(outDirPath));
}
copySync(sourcePath, join(this.outDir, outDirPath), { dereference: true });
}
deleteFromOutput(path: string) {
rmSync(join(this.outDir, path), { recursive: true });
}
async buildBackend(entryPoints: string[]) {
await esbuild({
entryPoints: entryPoints.map(e => join(this.projectDir, e)),
tsconfig: join(this.projectDir, "tsconfig.app.json"),
platform: "node",
bundle: true,
outdir: this.outDir,
outExtension: {
".js": ".cjs"
},
format: "cjs",
external: [
"electron",
"@electron/remote",
"better-sqlite3",
"./xhr-sync-worker.js",
"vite"
],
splitting: false,
loader: {
".css": "text",
".ejs": "text"
},
define: {
"process.env.NODE_ENV": JSON.stringify("production"),
},
minify: true
});
}
triggerBuildAndCopyTo(projectToBuild: string, destPath: string) {
const projectDir = join(this.rootDir, projectToBuild);
execSync("pnpm build", { cwd: projectDir, stdio: "inherit" });
copySync(join(projectDir, "dist"), join(this.projectDir, "dist", destPath));
}
copyNodeModules(nodeModules: string[]) {
for (const moduleName of nodeModules) {
const sourceDir = tryPath([
join(this.projectDir, "node_modules", moduleName),
join(this.rootDir, "node_modules", moduleName)
]);
const destDir = join(this.outDir, "node_modules", moduleName);
mkdirpSync(destDir);
cpSync(sourceDir, destDir, { recursive: true, dereference: true });
}
}
}
function tryPath(paths: string[]) {
for (const path of paths) {
if (existsSync(path)) {
return path;
}
}
console.error("Unable to find any of the paths:", paths);
process.exit(1);
}