UNPKG

@shopify/create-app

Version:

A CLI tool to create a new Shopify app.

100 lines (97 loc) 3.14 kB
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