Files
2026-07-13 13:39:47 +08:00

75 lines
1.7 KiB
TypeScript

import { type ChildProcessWithoutNullStreams, spawn } from "node:child_process";
import path, { dirname } from "node:path";
import { fileURLToPath } from "node:url";
import { defineConfig } from "tsdown";
import dotenvFlow from "dotenv-flow";
const isDev = process.env.NODE_ENV === "development";
const __filename = fileURLToPath(import.meta.url);
const __dirname = dirname(__filename);
const projectRoot = path.resolve(__dirname, "../..");
const env = dotenvFlow.config({
path: projectRoot,
});
class NodeApp {
process: ChildProcessWithoutNullStreams | null = null;
start() {
const args = [path.resolve(__dirname, "./build/index.js")];
this.process = spawn("node", args, {
stdio: ["ignore", "pipe", "pipe"],
env: { ...process.env },
});
this.process.stdout.on("data", (data) => {
process.stdout.write(String(data));
});
this.process.stderr.on("data", (data) => {
process.stderr.write(String(data));
});
}
restart() {
this.kill();
this.start();
}
kill() {
if (this.process?.pid) {
if (process.platform === "win32") {
process.kill(this.process.pid);
} else {
spawn("kill", ["-9", String(this.process.pid)]);
}
this.process = null;
}
}
}
const app = new NodeApp();
export default defineConfig({
outDir: "build",
shims: true,
external: ["@mediago/core", "@mediago/deps"],
noExternal: [/.*/],
define: {
"process.env.NODE_ENV": JSON.stringify(
process.env.NODE_ENV || "production",
),
"process.env.APP_TARGET": JSON.stringify("server"),
},
env: { ...env.parsed },
hooks: {
"build:done": () => {
if (isDev) {
app.restart();
}
},
},
});