@shopify/create-app
Version:
A CLI tool to create a new Shopify app.
100 lines (97 loc) • 3.14 kB
JavaScript
import {
outputDebug
} from "./chunk-PK2M5CKS.js";
import {
init_cjs_shims
} from "./chunk-3XNI6LP4.js";
// ../cli-kit/dist/public/node/tree-kill.js
init_cjs_shims();
import { spawn } from "child_process";
function treeKill(pid = process.pid, killSignal = "SIGTERM", killRoot = !0, callback) {
adaptedTreeKill(pid, killSignal, killRoot, callback ?? ((error) => {
error && outputDebug(`Failed to kill process ${pid}: ${error}`);
}));
}
function adaptedTreeKill(pid, killSignal, killRoot, callback) {
let rootPid = typeof pid == "number" ? pid.toString() : pid;
if (!/^\d+$/.test(rootPid)) {
callback(new Error("pid must be a number"));
return;
}
let tree = {};
tree[rootPid] = [];
let pidsToProcess = /* @__PURE__ */ new Set();
switch (pidsToProcess.add(rootPid), process.platform) {
case "win32": {
spawn("taskkill", ["/pid", rootPid, "/T", "/F"]).on("close", (code) => {
code === 0 ? callback() : callback(new Error(`taskkill exited with code ${code}`));
});
break;
}
case "darwin":
buildProcessTree(rootPid, tree, pidsToProcess, function(parentPid) {
return spawn("pgrep", ["-lfP", parentPid]);
}, function() {
killAll(tree, killSignal, rootPid, killRoot, callback);
});
break;
default:
buildProcessTree(rootPid, tree, pidsToProcess, function(parentPid) {
return spawn("ps", ["-o", "pid command", "--no-headers", "--ppid", parentPid]);
}, function() {
killAll(tree, killSignal, rootPid, killRoot, callback);
});
break;
}
}
function killAll(tree, killSignal, rootPid, killRoot, callback) {
let killed = /* @__PURE__ */ new Set();
try {
Object.keys(tree).forEach(function(pid) {
tree[pid].forEach(function(pidpid) {
killed.has(pidpid) || (killPid(pidpid, killSignal), killed.add(pidpid));
}), pid === rootPid && killRoot && !killed.has(pid) && (killPid(pid, killSignal), killed.add(pid));
});
} catch (err) {
callback(err);
return;
}
callback();
}
function killPid(pid, killSignal) {
try {
process.kill(parseInt(pid, 10), killSignal);
} catch (err) {
if (err.code !== "ESRCH")
throw err;
}
}
function buildProcessTree(parentPid, tree, pidsToProcess, spawnChildProcessesList, cb) {
let ps = spawnChildProcessesList(parentPid), allData = "";
ps.stdout?.on("data", function(data) {
let dataStr = data.toString("ascii");
allData += dataStr;
});
let onClose = (code) => {
if (pidsToProcess.delete(parentPid), code !== 0) {
if (pidsToProcess.size === 0) {
cb();
return;
}
return;
}
allData.trim().split(`
`).forEach(function(line) {
let match = line.match(/^(\d+)\s(.*)$/);
if (match) {
let pid = match[1], cmd = match[2];
tree[parentPid].push(pid), tree[pid] = [], outputDebug(`Killing process ${pid}: ${cmd}`), pidsToProcess.add(pid), buildProcessTree(pid, tree, pidsToProcess, spawnChildProcessesList, cb);
}
});
};
ps.on("close", onClose);
}
export {
treeKill
};
//# sourceMappingURL=chunk-VJHCFG5K.js.map