singularity-forge/scripts/stage-web-standalone.cjs
2026-05-05 14:31:16 +02:00

89 lines
2.6 KiB
JavaScript

#!/usr/bin/env node
const {
cpSync,
existsSync,
mkdirSync,
readdirSync,
rmSync,
} = require("node:fs");
const { join, resolve } = require("node:path");
const root = resolve(__dirname, "..");
const webRoot = join(root, "web");
const standaloneRoot = join(webRoot, ".next", "standalone");
const standaloneAppRoot = join(standaloneRoot, "web");
const standaloneNodeModulesRoot = join(standaloneRoot, "node_modules");
const staticRoot = join(webRoot, ".next", "static");
const publicRoot = join(webRoot, "public");
const distWebRoot = join(root, "dist", "web");
const distStandaloneRoot = join(distWebRoot, "standalone");
const sourceNodePtyRoot = join(webRoot, "node_modules", "node-pty");
const COPY_OPTIONS = {
recursive: true,
force: true,
dereference: true,
};
function overlayNodePty(targetRoot) {
if (!existsSync(sourceNodePtyRoot)) return [];
const hydrated = [];
const directTarget = join(targetRoot, "node_modules", "node-pty");
mkdirSync(join(targetRoot, "node_modules"), { recursive: true });
cpSync(sourceNodePtyRoot, directTarget, COPY_OPTIONS);
hydrated.push(directTarget);
const hashedNodeModulesRoot = join(targetRoot, ".next", "node_modules");
if (!existsSync(hashedNodeModulesRoot)) return hydrated;
for (const entry of readdirSync(hashedNodeModulesRoot, {
withFileTypes: true,
})) {
if (!entry.isDirectory() || !entry.name.startsWith("node-pty-")) continue;
const target = join(hashedNodeModulesRoot, entry.name);
cpSync(sourceNodePtyRoot, target, COPY_OPTIONS);
hydrated.push(target);
}
return hydrated;
}
if (!existsSync(standaloneAppRoot)) {
console.error(
"[forge] Web standalone build not found at web/.next/standalone/web. Run `npm --prefix web run build` first.",
);
process.exit(1);
}
rmSync(distWebRoot, { recursive: true, force: true });
mkdirSync(distStandaloneRoot, { recursive: true });
cpSync(standaloneAppRoot, distStandaloneRoot, COPY_OPTIONS);
if (existsSync(standaloneNodeModulesRoot)) {
cpSync(
standaloneNodeModulesRoot,
join(distStandaloneRoot, "node_modules"),
COPY_OPTIONS,
);
}
if (existsSync(staticRoot)) {
mkdirSync(join(distStandaloneRoot, ".next"), { recursive: true });
cpSync(staticRoot, join(distStandaloneRoot, ".next", "static"), COPY_OPTIONS);
}
if (existsSync(publicRoot)) {
cpSync(publicRoot, join(distStandaloneRoot, "public"), COPY_OPTIONS);
}
const hydratedTargets = overlayNodePty(distStandaloneRoot);
console.log(`[forge] Staged web standalone host at ${distStandaloneRoot}`);
if (hydratedTargets.length > 0) {
console.log(
`[forge] Hydrated node-pty native assets in ${hydratedTargets.length} location(s).`,
);
}