everything-dev
Version:
A consolidated product package for building Module Federation apps with oRPC APIs.
69 lines (67 loc) • 1.99 kB
JavaScript
import { stripAnsi } from "../dev-log-pipeline.mjs";
import { existsSync } from "node:fs";
import { join } from "node:path";
import { execa } from "execa";
import process from "node:process";
//#region src/infra/docker.ts
const TAIL_LINES = 15;
function takeTail(lines, count = TAIL_LINES) {
return lines.slice(-count).join("\n").trim();
}
function composeFilePath(configDir) {
return join(configDir, "docker-compose.yml");
}
function isDockerTestMode(env) {
return env.BOS_TEST === "1" || env.NODE_ENV === "test" || env.BOS_NO_PERSIST_PORTS === "1";
}
function shouldAutoStartDocker(failures, guards) {
if (failures.length === 0) return false;
if (guards.testMode || !guards.dockerAvailable || !guards.composeFileExists) return false;
return failures.every((failure) => failure.tcpReachable === false);
}
async function isDockerAvailable() {
try {
return ((await execa("docker", ["info"], {
stdio: "pipe",
reject: false,
timeout: 5e3
})).exitCode ?? 1) === 0;
} catch {
return false;
}
}
async function runDockerComposeUp(configDir) {
try {
const result = await execa("docker", [
"compose",
"up",
"-d",
"--wait"
], {
cwd: configDir,
stdio: "pipe",
reject: false,
timeout: 3e5
});
const lines = [result.stdout ?? "", result.stderr ?? ""].flatMap((output) => output.split("\n")).map((line) => stripAnsi(line).trim()).filter((line) => line.length > 0);
return {
ok: (result.exitCode ?? 1) === 0,
tail: takeTail(lines)
};
} catch (error) {
return {
ok: false,
tail: error instanceof Error ? error.message : String(error)
};
}
}
function detectAutoStartContext(configDir) {
return {
composeFileExists: existsSync(composeFilePath(configDir)),
dockerAvailable: false,
testMode: isDockerTestMode(process.env)
};
}
//#endregion
export { composeFilePath, detectAutoStartContext, isDockerAvailable, isDockerTestMode, runDockerComposeUp, shouldAutoStartDocker, takeTail };
//# sourceMappingURL=docker.mjs.map