@mesh-tech/mesh-cli
Version:
CLI for Mesh platform development utilities
61 lines (60 loc) • 2.42 kB
JavaScript
import { execFileSync } from "child_process";
import * as path from "path";
import * as fs from "fs";
export function findAppRoot(startDir) {
let dir = startDir;
while (true) {
if (fs.existsSync(path.join(dir, "Pulumi.yaml")))
return dir;
const parent = path.dirname(dir);
if (parent === dir)
return null;
dir = parent;
}
}
export function findStackConfigs(appRoot) {
return fs.readdirSync(appRoot)
.filter((f) => /^Pulumi\..+\.yaml$/.test(f) && f !== "Pulumi.yaml")
.map((f) => f.replace(/^Pulumi\./, "").replace(/\.yaml$/, ""));
}
export function getCurrentStack(appRoot) {
try {
const result = execFileSync("pulumi", ["stack", "--show-name"], {
encoding: "utf-8",
cwd: appRoot,
stdio: ["pipe", "pipe", "pipe"],
});
return result.trim() || null;
}
catch {
return null;
}
}
export function readStackConfig(appRoot, stack, key) {
const configFile = path.join(appRoot, `Pulumi.${stack}.yaml`);
if (!fs.existsSync(configFile))
return null;
const content = fs.readFileSync(configFile, "utf-8");
const pattern = new RegExp(`^\\s+${key.replace(/[.*+?^${}()|[\]\\]/g, "\\$&")}:\\s*(.+)$`, "m");
const match = content.match(pattern);
if (!match)
return null;
return match[1].trim().replace(/^["']|["']$/g, "");
}
export function pulumiStackOutput(appRoot, key, extraArgs, env) {
const execEnv = env ? { ...process.env, ...env } : undefined;
try {
const result = execFileSync("pulumi", ["stack", "output", key, "--json", ...extraArgs], { cwd: appRoot, encoding: "utf-8", stdio: ["ignore", "pipe", "pipe"], env: execEnv });
if (result.includes('"[secret]"')) {
return execFileSync("pulumi", ["stack", "output", key, "--json", "--show-secrets", ...extraArgs], { cwd: appRoot, encoding: "utf-8", stdio: ["ignore", "pipe", "pipe"], env: execEnv });
}
return result;
}
catch (err) {
const errMsg = err?.stderr ?? "";
if (errMsg.includes("kms:") || errMsg.includes("KMS") || errMsg.includes("secrets manager")) {
throw err;
}
return execFileSync("pulumi", ["stack", "output", key, "--json", "--show-secrets", ...extraArgs], { cwd: appRoot, encoding: "utf-8", stdio: ["ignore", "pipe", "pipe"], env: execEnv });
}
}