UNPKG

@techmely/utils

Version:

Collection of helpful JavaScript / TypeScript utils

1,413 lines (1,385 loc) 42.4 kB
import { require_cross_spawn, require_merge_stream } from './chunk-UFOKMNUE.mjs'; import { __toESM } from './chunk-NYLAFCGV.mjs'; import { Buffer } from 'node:buffer'; import path from 'node:path'; import childProcess, { ChildProcess } from 'node:child_process'; import process2 from 'node:process'; import url from 'node:url'; import os, { constants } from 'node:os'; import { createWriteStream, createReadStream } from 'node:fs'; import { setTimeout as setTimeout$1 } from 'node:timers/promises'; import { debuglog } from 'node:util'; // ../../node_modules/execa/index.js var import_cross_spawn = __toESM(require_cross_spawn(), 1); // ../../node_modules/execa/node_modules/strip-final-newline/index.js function stripFinalNewline(input) { const LF = typeof input === "string" ? "\n" : "\n".charCodeAt(); const CR = typeof input === "string" ? "\r" : "\r".charCodeAt(); if (input[input.length - 1] === LF) { input = input.slice(0, -1); } if (input[input.length - 1] === CR) { input = input.slice(0, -1); } return input; } // ../../node_modules/execa/node_modules/path-key/index.js function pathKey(options = {}) { const { env = process.env, platform = process.platform } = options; if (platform !== "win32") { return "PATH"; } return Object.keys(env).reverse().find((key) => key.toUpperCase() === "PATH") || "Path"; } // ../../node_modules/execa/node_modules/npm-run-path/index.js function npmRunPath(options = {}) { const { cwd = process2.cwd(), path: path_ = process2.env[pathKey()], execPath = process2.execPath } = options; let previous; const cwdString = cwd instanceof URL ? url.fileURLToPath(cwd) : cwd; let cwdPath = path.resolve(cwdString); const result = []; while (previous !== cwdPath) { result.push(path.join(cwdPath, "node_modules/.bin")); previous = cwdPath; cwdPath = path.resolve(cwdPath, ".."); } result.push(path.resolve(cwdString, execPath, "..")); return [...result, path_].join(path.delimiter); } function npmRunPathEnv({ env = process2.env, ...options } = {}) { env = { ...env }; const path3 = pathKey({ env }); options.path = env[path3]; env[path3] = npmRunPath(options); return env; } // ../../node_modules/execa/node_modules/mimic-fn/index.js var copyProperty = (to, from, property, ignoreNonConfigurable) => { if (property === "length" || property === "prototype") { return; } if (property === "arguments" || property === "caller") { return; } const toDescriptor = Object.getOwnPropertyDescriptor(to, property); const fromDescriptor = Object.getOwnPropertyDescriptor(from, property); if (!canCopyProperty(toDescriptor, fromDescriptor) && ignoreNonConfigurable) { return; } Object.defineProperty(to, property, fromDescriptor); }; var canCopyProperty = function(toDescriptor, fromDescriptor) { return toDescriptor === void 0 || toDescriptor.configurable || toDescriptor.writable === fromDescriptor.writable && toDescriptor.enumerable === fromDescriptor.enumerable && toDescriptor.configurable === fromDescriptor.configurable && (toDescriptor.writable || toDescriptor.value === fromDescriptor.value); }; var changePrototype = (to, from) => { const fromPrototype = Object.getPrototypeOf(from); if (fromPrototype === Object.getPrototypeOf(to)) { return; } Object.setPrototypeOf(to, fromPrototype); }; var wrappedToString = (withName, fromBody) => `/* Wrapped ${withName}*/ ${fromBody}`; var toStringDescriptor = Object.getOwnPropertyDescriptor(Function.prototype, "toString"); var toStringName = Object.getOwnPropertyDescriptor(Function.prototype.toString, "name"); var changeToString = (to, from, name) => { const withName = name === "" ? "" : `with ${name.trim()}() `; const newToString = wrappedToString.bind(null, withName, from.toString()); Object.defineProperty(newToString, "name", toStringName); Object.defineProperty(to, "toString", { ...toStringDescriptor, value: newToString }); }; function mimicFunction(to, from, { ignoreNonConfigurable = false } = {}) { const { name } = to; for (const property of Reflect.ownKeys(from)) { copyProperty(to, from, property, ignoreNonConfigurable); } changePrototype(to, from); changeToString(to, from, name); return to; } // ../../node_modules/execa/node_modules/onetime/index.js var calledFunctions = /* @__PURE__ */ new WeakMap(); var onetime = (function_, options = {}) => { if (typeof function_ !== "function") { throw new TypeError("Expected a function"); } let returnValue; let callCount = 0; const functionName = function_.displayName || function_.name || "<anonymous>"; const onetime2 = function(...arguments_) { calledFunctions.set(onetime2, ++callCount); if (callCount === 1) { returnValue = function_.apply(this, arguments_); function_ = null; } else if (options.throw === true) { throw new Error(`Function \`${functionName}\` can only be called once`); } return returnValue; }; mimicFunction(onetime2, function_); calledFunctions.set(onetime2, callCount); return onetime2; }; onetime.callCount = (function_) => { if (!calledFunctions.has(function_)) { throw new Error(`The given function \`${function_.name}\` is not wrapped by the \`onetime\` package`); } return calledFunctions.get(function_); }; var onetime_default = onetime; // ../../node_modules/execa/node_modules/human-signals/build/src/realtime.js var getRealtimeSignals = () => { const length = SIGRTMAX - SIGRTMIN + 1; return Array.from({ length }, getRealtimeSignal); }; var getRealtimeSignal = (value, index) => ({ name: `SIGRT${index + 1}`, number: SIGRTMIN + index, action: "terminate", description: "Application-specific signal (realtime)", standard: "posix" }); var SIGRTMIN = 34; var SIGRTMAX = 64; // ../../node_modules/execa/node_modules/human-signals/build/src/core.js var SIGNALS = [ { name: "SIGHUP", number: 1, action: "terminate", description: "Terminal closed", standard: "posix" }, { name: "SIGINT", number: 2, action: "terminate", description: "User interruption with CTRL-C", standard: "ansi" }, { name: "SIGQUIT", number: 3, action: "core", description: "User interruption with CTRL-\\", standard: "posix" }, { name: "SIGILL", number: 4, action: "core", description: "Invalid machine instruction", standard: "ansi" }, { name: "SIGTRAP", number: 5, action: "core", description: "Debugger breakpoint", standard: "posix" }, { name: "SIGABRT", number: 6, action: "core", description: "Aborted", standard: "ansi" }, { name: "SIGIOT", number: 6, action: "core", description: "Aborted", standard: "bsd" }, { name: "SIGBUS", number: 7, action: "core", description: "Bus error due to misaligned, non-existing address or paging error", standard: "bsd" }, { name: "SIGEMT", number: 7, action: "terminate", description: "Command should be emulated but is not implemented", standard: "other" }, { name: "SIGFPE", number: 8, action: "core", description: "Floating point arithmetic error", standard: "ansi" }, { name: "SIGKILL", number: 9, action: "terminate", description: "Forced termination", standard: "posix", forced: true }, { name: "SIGUSR1", number: 10, action: "terminate", description: "Application-specific signal", standard: "posix" }, { name: "SIGSEGV", number: 11, action: "core", description: "Segmentation fault", standard: "ansi" }, { name: "SIGUSR2", number: 12, action: "terminate", description: "Application-specific signal", standard: "posix" }, { name: "SIGPIPE", number: 13, action: "terminate", description: "Broken pipe or socket", standard: "posix" }, { name: "SIGALRM", number: 14, action: "terminate", description: "Timeout or timer", standard: "posix" }, { name: "SIGTERM", number: 15, action: "terminate", description: "Termination", standard: "ansi" }, { name: "SIGSTKFLT", number: 16, action: "terminate", description: "Stack is empty or overflowed", standard: "other" }, { name: "SIGCHLD", number: 17, action: "ignore", description: "Child process terminated, paused or unpaused", standard: "posix" }, { name: "SIGCLD", number: 17, action: "ignore", description: "Child process terminated, paused or unpaused", standard: "other" }, { name: "SIGCONT", number: 18, action: "unpause", description: "Unpaused", standard: "posix", forced: true }, { name: "SIGSTOP", number: 19, action: "pause", description: "Paused", standard: "posix", forced: true }, { name: "SIGTSTP", number: 20, action: "pause", description: 'Paused using CTRL-Z or "suspend"', standard: "posix" }, { name: "SIGTTIN", number: 21, action: "pause", description: "Background process cannot read terminal input", standard: "posix" }, { name: "SIGBREAK", number: 21, action: "terminate", description: "User interruption with CTRL-BREAK", standard: "other" }, { name: "SIGTTOU", number: 22, action: "pause", description: "Background process cannot write to terminal output", standard: "posix" }, { name: "SIGURG", number: 23, action: "ignore", description: "Socket received out-of-band data", standard: "bsd" }, { name: "SIGXCPU", number: 24, action: "core", description: "Process timed out", standard: "bsd" }, { name: "SIGXFSZ", number: 25, action: "core", description: "File too big", standard: "bsd" }, { name: "SIGVTALRM", number: 26, action: "terminate", description: "Timeout or timer", standard: "bsd" }, { name: "SIGPROF", number: 27, action: "terminate", description: "Timeout or timer", standard: "bsd" }, { name: "SIGWINCH", number: 28, action: "ignore", description: "Terminal window size changed", standard: "bsd" }, { name: "SIGIO", number: 29, action: "terminate", description: "I/O is available", standard: "other" }, { name: "SIGPOLL", number: 29, action: "terminate", description: "Watched event", standard: "other" }, { name: "SIGINFO", number: 29, action: "ignore", description: "Request for process information", standard: "other" }, { name: "SIGPWR", number: 30, action: "terminate", description: "Device running out of power", standard: "systemv" }, { name: "SIGSYS", number: 31, action: "core", description: "Invalid system call", standard: "other" }, { name: "SIGUNUSED", number: 31, action: "terminate", description: "Invalid system call", standard: "other" } ]; // ../../node_modules/execa/node_modules/human-signals/build/src/signals.js var getSignals = () => { const realtimeSignals = getRealtimeSignals(); const signals2 = [...SIGNALS, ...realtimeSignals].map(normalizeSignal); return signals2; }; var normalizeSignal = ({ name, number: defaultNumber, description, action, forced = false, standard }) => { const { signals: { [name]: constantSignal } } = constants; const supported = constantSignal !== void 0; const number = supported ? constantSignal : defaultNumber; return { name, number, description, supported, action, forced, standard }; }; // ../../node_modules/execa/node_modules/human-signals/build/src/main.js var getSignalsByName = () => { const signals2 = getSignals(); return Object.fromEntries(signals2.map(getSignalByName)); }; var getSignalByName = ({ name, number, description, supported, action, forced, standard }) => [name, { name, number, description, supported, action, forced, standard }]; var signalsByName = getSignalsByName(); var getSignalsByNumber = () => { const signals2 = getSignals(); const length = SIGRTMAX + 1; const signalsA = Array.from( { length }, (value, number) => getSignalByNumber(number, signals2) ); return Object.assign({}, ...signalsA); }; var getSignalByNumber = (number, signals2) => { const signal = findSignalByNumber(number, signals2); if (signal === void 0) { return {}; } const { name, description, supported, action, forced, standard } = signal; return { [number]: { name, number, description, supported, action, forced, standard } }; }; var findSignalByNumber = (number, signals2) => { const signal = signals2.find(({ name }) => constants.signals[name] === number); if (signal !== void 0) { return signal; } return signals2.find((signalA) => signalA.number === number); }; getSignalsByNumber(); // ../../node_modules/execa/lib/error.js var getErrorPrefix = ({ timedOut, timeout, errorCode, signal, signalDescription, exitCode, isCanceled }) => { if (timedOut) { return `timed out after ${timeout} milliseconds`; } if (isCanceled) { return "was canceled"; } if (errorCode !== void 0) { return `failed with ${errorCode}`; } if (signal !== void 0) { return `was killed with ${signal} (${signalDescription})`; } if (exitCode !== void 0) { return `failed with exit code ${exitCode}`; } return "failed"; }; var makeError = ({ stdout, stderr, all, error, signal, exitCode, command, escapedCommand, timedOut, isCanceled, killed, parsed: { options: { timeout, cwd = process2.cwd() } } }) => { exitCode = exitCode === null ? void 0 : exitCode; signal = signal === null ? void 0 : signal; const signalDescription = signal === void 0 ? void 0 : signalsByName[signal].description; const errorCode = error && error.code; const prefix = getErrorPrefix({ timedOut, timeout, errorCode, signal, signalDescription, exitCode, isCanceled }); const execaMessage = `Command ${prefix}: ${command}`; const isError = Object.prototype.toString.call(error) === "[object Error]"; const shortMessage = isError ? `${execaMessage} ${error.message}` : execaMessage; const message = [shortMessage, stderr, stdout].filter(Boolean).join("\n"); if (isError) { error.originalMessage = error.message; error.message = message; } else { error = new Error(message); } error.shortMessage = shortMessage; error.command = command; error.escapedCommand = escapedCommand; error.exitCode = exitCode; error.signal = signal; error.signalDescription = signalDescription; error.stdout = stdout; error.stderr = stderr; error.cwd = cwd; if (all !== void 0) { error.all = all; } if ("bufferedData" in error) { delete error.bufferedData; } error.failed = true; error.timedOut = Boolean(timedOut); error.isCanceled = isCanceled; error.killed = killed && !timedOut; return error; }; // ../../node_modules/execa/lib/stdio.js var aliases = ["stdin", "stdout", "stderr"]; var hasAlias = (options) => aliases.some((alias) => options[alias] !== void 0); var normalizeStdio = (options) => { if (!options) { return; } const { stdio } = options; if (stdio === void 0) { return aliases.map((alias) => options[alias]); } if (hasAlias(options)) { throw new Error(`It's not possible to provide \`stdio\` in combination with one of ${aliases.map((alias) => `\`${alias}\``).join(", ")}`); } if (typeof stdio === "string") { return stdio; } if (!Array.isArray(stdio)) { throw new TypeError(`Expected \`stdio\` to be of type \`string\` or \`Array\`, got \`${typeof stdio}\``); } const length = Math.max(stdio.length, aliases.length); return Array.from({ length }, (value, index) => stdio[index]); }; // ../../node_modules/execa/node_modules/signal-exit/dist/mjs/signals.js var signals = []; signals.push("SIGHUP", "SIGINT", "SIGTERM"); if (process.platform !== "win32") { signals.push( "SIGALRM", "SIGABRT", "SIGVTALRM", "SIGXCPU", "SIGXFSZ", "SIGUSR2", "SIGTRAP", "SIGSYS", "SIGQUIT", "SIGIOT" // should detect profiler and enable/disable accordingly. // see #21 // 'SIGPROF' ); } if (process.platform === "linux") { signals.push("SIGIO", "SIGPOLL", "SIGPWR", "SIGSTKFLT"); } // ../../node_modules/execa/node_modules/signal-exit/dist/mjs/index.js var processOk = (process7) => !!process7 && typeof process7 === "object" && typeof process7.removeListener === "function" && typeof process7.emit === "function" && typeof process7.reallyExit === "function" && typeof process7.listeners === "function" && typeof process7.kill === "function" && typeof process7.pid === "number" && typeof process7.on === "function"; var kExitEmitter = Symbol.for("signal-exit emitter"); var global = globalThis; var ObjectDefineProperty = Object.defineProperty.bind(Object); var Emitter = class { emitted = { afterExit: false, exit: false }; listeners = { afterExit: [], exit: [] }; count = 0; id = Math.random(); constructor() { if (global[kExitEmitter]) { return global[kExitEmitter]; } ObjectDefineProperty(global, kExitEmitter, { value: this, writable: false, enumerable: false, configurable: false }); } on(ev, fn) { this.listeners[ev].push(fn); } removeListener(ev, fn) { const list = this.listeners[ev]; const i = list.indexOf(fn); if (i === -1) { return; } if (i === 0 && list.length === 1) { list.length = 0; } else { list.splice(i, 1); } } emit(ev, code, signal) { if (this.emitted[ev]) { return false; } this.emitted[ev] = true; let ret = false; for (const fn of this.listeners[ev]) { ret = fn(code, signal) === true || ret; } if (ev === "exit") { ret = this.emit("afterExit", code, signal) || ret; } return ret; } }; var SignalExitBase = class { }; var signalExitWrap = (handler) => { return { onExit(cb, opts) { return handler.onExit(cb, opts); }, load() { return handler.load(); }, unload() { return handler.unload(); } }; }; var SignalExitFallback = class extends SignalExitBase { onExit() { return () => { }; } load() { } unload() { } }; var SignalExit = class extends SignalExitBase { // "SIGHUP" throws an `ENOSYS` error on Windows, // so use a supported signal instead /* c8 ignore start */ #hupSig = process4.platform === "win32" ? "SIGINT" : "SIGHUP"; /* c8 ignore stop */ #emitter = new Emitter(); #process; #originalProcessEmit; #originalProcessReallyExit; #sigListeners = {}; #loaded = false; constructor(process7) { super(); this.#process = process7; this.#sigListeners = {}; for (const sig of signals) { this.#sigListeners[sig] = () => { const listeners = this.#process.listeners(sig); let { count } = this.#emitter; const p = process7; if (typeof p.__signal_exit_emitter__ === "object" && typeof p.__signal_exit_emitter__.count === "number") { count += p.__signal_exit_emitter__.count; } if (listeners.length === count) { this.unload(); const ret = this.#emitter.emit("exit", null, sig); const s = sig === "SIGHUP" ? this.#hupSig : sig; if (!ret) process7.kill(process7.pid, s); } }; } this.#originalProcessReallyExit = process7.reallyExit; this.#originalProcessEmit = process7.emit; } onExit(cb, opts) { if (!processOk(this.#process)) { return () => { }; } if (this.#loaded === false) { this.load(); } const ev = opts?.alwaysLast ? "afterExit" : "exit"; this.#emitter.on(ev, cb); return () => { this.#emitter.removeListener(ev, cb); if (this.#emitter.listeners["exit"].length === 0 && this.#emitter.listeners["afterExit"].length === 0) { this.unload(); } }; } load() { if (this.#loaded) { return; } this.#loaded = true; this.#emitter.count += 1; for (const sig of signals) { try { const fn = this.#sigListeners[sig]; if (fn) this.#process.on(sig, fn); } catch (_) { } } this.#process.emit = (ev, ...a) => { return this.#processEmit(ev, ...a); }; this.#process.reallyExit = (code) => { return this.#processReallyExit(code); }; } unload() { if (!this.#loaded) { return; } this.#loaded = false; signals.forEach((sig) => { const listener = this.#sigListeners[sig]; if (!listener) { throw new Error("Listener not defined for signal: " + sig); } try { this.#process.removeListener(sig, listener); } catch (_) { } }); this.#process.emit = this.#originalProcessEmit; this.#process.reallyExit = this.#originalProcessReallyExit; this.#emitter.count -= 1; } #processReallyExit(code) { if (!processOk(this.#process)) { return 0; } this.#process.exitCode = code || 0; this.#emitter.emit("exit", this.#process.exitCode, null); return this.#originalProcessReallyExit.call(this.#process, this.#process.exitCode); } #processEmit(ev, ...args) { const og = this.#originalProcessEmit; if (ev === "exit" && processOk(this.#process)) { if (typeof args[0] === "number") { this.#process.exitCode = args[0]; } const ret = og.call(this.#process, ev, ...args); this.#emitter.emit("exit", this.#process.exitCode, null); return ret; } else { return og.call(this.#process, ev, ...args); } } }; var process4 = globalThis.process; var { /** * Called when the process is exiting, whether via signal, explicit * exit, or running out of stuff to do. * * If the global process object is not suitable for instrumentation, * then this will be a no-op. * * Returns a function that may be used to unload signal-exit. */ onExit, /** * Load the listeners. Likely you never need to call this, unless * doing a rather deep integration with signal-exit functionality. * Mostly exposed for the benefit of testing. * * @internal */ load, /** * Unload the listeners. Likely you never need to call this, unless * doing a rather deep integration with signal-exit functionality. * Mostly exposed for the benefit of testing. * * @internal */ unload } = signalExitWrap(processOk(process4) ? new SignalExit(process4) : new SignalExitFallback()); // ../../node_modules/execa/lib/kill.js var DEFAULT_FORCE_KILL_TIMEOUT = 1e3 * 5; var spawnedKill = (kill, signal = "SIGTERM", options = {}) => { const killResult = kill(signal); setKillTimeout(kill, signal, options, killResult); return killResult; }; var setKillTimeout = (kill, signal, options, killResult) => { if (!shouldForceKill(signal, options, killResult)) { return; } const timeout = getForceKillAfterTimeout(options); const t = setTimeout(() => { kill("SIGKILL"); }, timeout); if (t.unref) { t.unref(); } }; var shouldForceKill = (signal, { forceKillAfterTimeout }, killResult) => isSigterm(signal) && forceKillAfterTimeout !== false && killResult; var isSigterm = (signal) => signal === os.constants.signals.SIGTERM || typeof signal === "string" && signal.toUpperCase() === "SIGTERM"; var getForceKillAfterTimeout = ({ forceKillAfterTimeout = true }) => { if (forceKillAfterTimeout === true) { return DEFAULT_FORCE_KILL_TIMEOUT; } if (!Number.isFinite(forceKillAfterTimeout) || forceKillAfterTimeout < 0) { throw new TypeError(`Expected the \`forceKillAfterTimeout\` option to be a non-negative integer, got \`${forceKillAfterTimeout}\` (${typeof forceKillAfterTimeout})`); } return forceKillAfterTimeout; }; var spawnedCancel = (spawned, context) => { const killResult = spawned.kill(); if (killResult) { context.isCanceled = true; } }; var timeoutKill = (spawned, signal, reject) => { spawned.kill(signal); reject(Object.assign(new Error("Timed out"), { timedOut: true, signal })); }; var setupTimeout = (spawned, { timeout, killSignal = "SIGTERM" }, spawnedPromise) => { if (timeout === 0 || timeout === void 0) { return spawnedPromise; } let timeoutId; const timeoutPromise = new Promise((resolve, reject) => { timeoutId = setTimeout(() => { timeoutKill(spawned, killSignal, reject); }, timeout); }); const safeSpawnedPromise = spawnedPromise.finally(() => { clearTimeout(timeoutId); }); return Promise.race([timeoutPromise, safeSpawnedPromise]); }; var validateTimeout = ({ timeout }) => { if (timeout !== void 0 && (!Number.isFinite(timeout) || timeout < 0)) { throw new TypeError(`Expected the \`timeout\` option to be a non-negative integer, got \`${timeout}\` (${typeof timeout})`); } }; var setExitHandler = async (spawned, { cleanup, detached }, timedPromise) => { if (!cleanup || detached) { return timedPromise; } const removeExitHandler = onExit(() => { spawned.kill(); }); return timedPromise.finally(() => { removeExitHandler(); }); }; // ../../node_modules/execa/node_modules/is-stream/index.js function isStream(stream) { return stream !== null && typeof stream === "object" && typeof stream.pipe === "function"; } function isWritableStream(stream) { return isStream(stream) && stream.writable !== false && typeof stream._write === "function" && typeof stream._writableState === "object"; } // ../../node_modules/execa/lib/pipe.js var isExecaChildProcess = (target) => target instanceof ChildProcess && typeof target.then === "function"; var pipeToTarget = (spawned, streamName, target) => { if (typeof target === "string") { spawned[streamName].pipe(createWriteStream(target)); return spawned; } if (isWritableStream(target)) { spawned[streamName].pipe(target); return spawned; } if (!isExecaChildProcess(target)) { throw new TypeError("The second argument must be a string, a stream or an Execa child process."); } if (!isWritableStream(target.stdin)) { throw new TypeError("The target child process's stdin must be available."); } spawned[streamName].pipe(target.stdin); return target; }; var addPipeMethods = (spawned) => { if (spawned.stdout !== null) { spawned.pipeStdout = pipeToTarget.bind(void 0, spawned, "stdout"); } if (spawned.stderr !== null) { spawned.pipeStderr = pipeToTarget.bind(void 0, spawned, "stderr"); } if (spawned.all !== void 0) { spawned.pipeAll = pipeToTarget.bind(void 0, spawned, "all"); } }; // ../../node_modules/execa/node_modules/get-stream/source/contents.js var getStreamContents = async (stream, { init, convertChunk, getSize, truncateChunk, addChunk, getFinalChunk, finalize }, { maxBuffer = Number.POSITIVE_INFINITY } = {}) => { if (!isAsyncIterable(stream)) { throw new Error("The first argument must be a Readable, a ReadableStream, or an async iterable."); } const state = init(); state.length = 0; try { for await (const chunk of stream) { const chunkType = getChunkType(chunk); const convertedChunk = convertChunk[chunkType](chunk, state); appendChunk({ convertedChunk, state, getSize, truncateChunk, addChunk, maxBuffer }); } appendFinalChunk({ state, convertChunk, getSize, truncateChunk, addChunk, getFinalChunk, maxBuffer }); return finalize(state); } catch (error) { error.bufferedData = finalize(state); throw error; } }; var appendFinalChunk = ({ state, getSize, truncateChunk, addChunk, getFinalChunk, maxBuffer }) => { const convertedChunk = getFinalChunk(state); if (convertedChunk !== void 0) { appendChunk({ convertedChunk, state, getSize, truncateChunk, addChunk, maxBuffer }); } }; var appendChunk = ({ convertedChunk, state, getSize, truncateChunk, addChunk, maxBuffer }) => { const chunkSize = getSize(convertedChunk); const newLength = state.length + chunkSize; if (newLength <= maxBuffer) { addNewChunk(convertedChunk, state, addChunk, newLength); return; } const truncatedChunk = truncateChunk(convertedChunk, maxBuffer - state.length); if (truncatedChunk !== void 0) { addNewChunk(truncatedChunk, state, addChunk, maxBuffer); } throw new MaxBufferError(); }; var addNewChunk = (convertedChunk, state, addChunk, newLength) => { state.contents = addChunk(convertedChunk, state, newLength); state.length = newLength; }; var isAsyncIterable = (stream) => typeof stream === "object" && stream !== null && typeof stream[Symbol.asyncIterator] === "function"; var getChunkType = (chunk) => { const typeOfChunk = typeof chunk; if (typeOfChunk === "string") { return "string"; } if (typeOfChunk !== "object" || chunk === null) { return "others"; } if (globalThis.Buffer?.isBuffer(chunk)) { return "buffer"; } const prototypeName = objectToString.call(chunk); if (prototypeName === "[object ArrayBuffer]") { return "arrayBuffer"; } if (prototypeName === "[object DataView]") { return "dataView"; } if (Number.isInteger(chunk.byteLength) && Number.isInteger(chunk.byteOffset) && objectToString.call(chunk.buffer) === "[object ArrayBuffer]") { return "typedArray"; } return "others"; }; var { toString: objectToString } = Object.prototype; var MaxBufferError = class extends Error { name = "MaxBufferError"; constructor() { super("maxBuffer exceeded"); } }; // ../../node_modules/execa/node_modules/get-stream/source/utils.js var identity = (value) => value; var noop = () => void 0; var getContentsProp = ({ contents }) => contents; var throwObjectStream = (chunk) => { throw new Error(`Streams in object mode are not supported: ${String(chunk)}`); }; var getLengthProp = (convertedChunk) => convertedChunk.length; // ../../node_modules/execa/node_modules/get-stream/source/array-buffer.js async function getStreamAsArrayBuffer(stream, options) { return getStreamContents(stream, arrayBufferMethods, options); } var initArrayBuffer = () => ({ contents: new ArrayBuffer(0) }); var useTextEncoder = (chunk) => textEncoder.encode(chunk); var textEncoder = new TextEncoder(); var useUint8Array = (chunk) => new Uint8Array(chunk); var useUint8ArrayWithOffset = (chunk) => new Uint8Array(chunk.buffer, chunk.byteOffset, chunk.byteLength); var truncateArrayBufferChunk = (convertedChunk, chunkSize) => convertedChunk.slice(0, chunkSize); var addArrayBufferChunk = (convertedChunk, { contents, length: previousLength }, length) => { const newContents = hasArrayBufferResize() ? resizeArrayBuffer(contents, length) : resizeArrayBufferSlow(contents, length); new Uint8Array(newContents).set(convertedChunk, previousLength); return newContents; }; var resizeArrayBufferSlow = (contents, length) => { if (length <= contents.byteLength) { return contents; } const arrayBuffer = new ArrayBuffer(getNewContentsLength(length)); new Uint8Array(arrayBuffer).set(new Uint8Array(contents), 0); return arrayBuffer; }; var resizeArrayBuffer = (contents, length) => { if (length <= contents.maxByteLength) { contents.resize(length); return contents; } const arrayBuffer = new ArrayBuffer(length, { maxByteLength: getNewContentsLength(length) }); new Uint8Array(arrayBuffer).set(new Uint8Array(contents), 0); return arrayBuffer; }; var getNewContentsLength = (length) => SCALE_FACTOR ** Math.ceil(Math.log(length) / Math.log(SCALE_FACTOR)); var SCALE_FACTOR = 2; var finalizeArrayBuffer = ({ contents, length }) => hasArrayBufferResize() ? contents : contents.slice(0, length); var hasArrayBufferResize = () => "resize" in ArrayBuffer.prototype; var arrayBufferMethods = { init: initArrayBuffer, convertChunk: { string: useTextEncoder, buffer: useUint8Array, arrayBuffer: useUint8Array, dataView: useUint8ArrayWithOffset, typedArray: useUint8ArrayWithOffset, others: throwObjectStream }, getSize: getLengthProp, truncateChunk: truncateArrayBufferChunk, addChunk: addArrayBufferChunk, getFinalChunk: noop, finalize: finalizeArrayBuffer }; // ../../node_modules/execa/node_modules/get-stream/source/buffer.js async function getStreamAsBuffer(stream, options) { if (!("Buffer" in globalThis)) { throw new Error("getStreamAsBuffer() is only supported in Node.js"); } try { return arrayBufferToNodeBuffer(await getStreamAsArrayBuffer(stream, options)); } catch (error) { if (error.bufferedData !== void 0) { error.bufferedData = arrayBufferToNodeBuffer(error.bufferedData); } throw error; } } var arrayBufferToNodeBuffer = (arrayBuffer) => globalThis.Buffer.from(arrayBuffer); // ../../node_modules/execa/node_modules/get-stream/source/string.js async function getStreamAsString(stream, options) { return getStreamContents(stream, stringMethods, options); } var initString = () => ({ contents: "", textDecoder: new TextDecoder() }); var useTextDecoder = (chunk, { textDecoder }) => textDecoder.decode(chunk, { stream: true }); var addStringChunk = (convertedChunk, { contents }) => contents + convertedChunk; var truncateStringChunk = (convertedChunk, chunkSize) => convertedChunk.slice(0, chunkSize); var getFinalStringChunk = ({ textDecoder }) => { const finalChunk = textDecoder.decode(); return finalChunk === "" ? void 0 : finalChunk; }; var stringMethods = { init: initString, convertChunk: { string: identity, buffer: useTextDecoder, arrayBuffer: useTextDecoder, dataView: useTextDecoder, typedArray: useTextDecoder, others: throwObjectStream }, getSize: getLengthProp, truncateChunk: truncateStringChunk, addChunk: addStringChunk, getFinalChunk: getFinalStringChunk, finalize: getContentsProp }; // ../../node_modules/execa/lib/stream.js var import_merge_stream = __toESM(require_merge_stream(), 1); var validateInputOptions = (input) => { if (input !== void 0) { throw new TypeError("The `input` and `inputFile` options cannot be both set."); } }; var getInput = ({ input, inputFile }) => { if (typeof inputFile !== "string") { return input; } validateInputOptions(input); return createReadStream(inputFile); }; var handleInput = (spawned, options) => { const input = getInput(options); if (input === void 0) { return; } if (isStream(input)) { input.pipe(spawned.stdin); } else { spawned.stdin.end(input); } }; var makeAllStream = (spawned, { all }) => { if (!all || !spawned.stdout && !spawned.stderr) { return; } const mixed = (0, import_merge_stream.default)(); if (spawned.stdout) { mixed.add(spawned.stdout); } if (spawned.stderr) { mixed.add(spawned.stderr); } return mixed; }; var getBufferedData = async (stream, streamPromise) => { if (!stream || streamPromise === void 0) { return; } await setTimeout$1(0); stream.destroy(); try { return await streamPromise; } catch (error) { return error.bufferedData; } }; var getStreamPromise = (stream, { encoding, buffer, maxBuffer }) => { if (!stream || !buffer) { return; } if (encoding === "utf8" || encoding === "utf-8") { return getStreamAsString(stream, { maxBuffer }); } if (encoding === null || encoding === "buffer") { return getStreamAsBuffer(stream, { maxBuffer }); } return applyEncoding(stream, maxBuffer, encoding); }; var applyEncoding = async (stream, maxBuffer, encoding) => { const buffer = await getStreamAsBuffer(stream, { maxBuffer }); return buffer.toString(encoding); }; var getSpawnedResult = async ({ stdout, stderr, all }, { encoding, buffer, maxBuffer }, processDone) => { const stdoutPromise = getStreamPromise(stdout, { encoding, buffer, maxBuffer }); const stderrPromise = getStreamPromise(stderr, { encoding, buffer, maxBuffer }); const allPromise = getStreamPromise(all, { encoding, buffer, maxBuffer: maxBuffer * 2 }); try { return await Promise.all([processDone, stdoutPromise, stderrPromise, allPromise]); } catch (error) { return Promise.all([ { error, signal: error.signal, timedOut: error.timedOut }, getBufferedData(stdout, stdoutPromise), getBufferedData(stderr, stderrPromise), getBufferedData(all, allPromise) ]); } }; // ../../node_modules/execa/lib/promise.js var nativePromisePrototype = (async () => { })().constructor.prototype; var descriptors = ["then", "catch", "finally"].map((property) => [ property, Reflect.getOwnPropertyDescriptor(nativePromisePrototype, property) ]); var mergePromise = (spawned, promise) => { for (const [property, descriptor] of descriptors) { const value = typeof promise === "function" ? (...args) => Reflect.apply(descriptor.value, promise(), args) : descriptor.value.bind(promise); Reflect.defineProperty(spawned, property, { ...descriptor, value }); } }; var getSpawnedPromise = (spawned) => new Promise((resolve, reject) => { spawned.on("exit", (exitCode, signal) => { resolve({ exitCode, signal }); }); spawned.on("error", (error) => { reject(error); }); if (spawned.stdin) { spawned.stdin.on("error", (error) => { reject(error); }); } }); var normalizeArgs = (file, args = []) => { if (!Array.isArray(args)) { return [file]; } return [file, ...args]; }; var NO_ESCAPE_REGEXP = /^[\w.-]+$/; var escapeArg = (arg) => { if (typeof arg !== "string" || NO_ESCAPE_REGEXP.test(arg)) { return arg; } return `"${arg.replaceAll('"', '\\"')}"`; }; var joinCommand = (file, args) => normalizeArgs(file, args).join(" "); var getEscapedCommand = (file, args) => normalizeArgs(file, args).map((arg) => escapeArg(arg)).join(" "); var verboseDefault = debuglog("execa").enabled; var padField = (field, padding) => String(field).padStart(padding, "0"); var getTimestamp = () => { const date = /* @__PURE__ */ new Date(); return `${padField(date.getHours(), 2)}:${padField(date.getMinutes(), 2)}:${padField(date.getSeconds(), 2)}.${padField(date.getMilliseconds(), 3)}`; }; var logCommand = (escapedCommand, { verbose }) => { if (!verbose) { return; } process2.stderr.write(`[${getTimestamp()}] ${escapedCommand} `); }; // ../../node_modules/execa/index.js var DEFAULT_MAX_BUFFER = 1e3 * 1e3 * 100; var getEnv = ({ env: envOption, extendEnv, preferLocal, localDir, execPath }) => { const env = extendEnv ? { ...process2.env, ...envOption } : envOption; if (preferLocal) { return npmRunPathEnv({ env, cwd: localDir, execPath }); } return env; }; var handleArguments = (file, args, options = {}) => { const parsed = import_cross_spawn.default._parse(file, args, options); file = parsed.command; args = parsed.args; options = parsed.options; options = { maxBuffer: DEFAULT_MAX_BUFFER, buffer: true, stripFinalNewline: true, extendEnv: true, preferLocal: false, localDir: options.cwd || process2.cwd(), execPath: process2.execPath, encoding: "utf8", reject: true, cleanup: true, all: false, windowsHide: true, verbose: verboseDefault, ...options }; options.env = getEnv(options); options.stdio = normalizeStdio(options); if (process2.platform === "win32" && path.basename(file, ".exe") === "cmd") { args.unshift("/q"); } return { file, args, options, parsed }; }; var handleOutput = (options, value, error) => { if (typeof value !== "string" && !Buffer.isBuffer(value)) { return error === void 0 ? void 0 : ""; } if (options.stripFinalNewline) { return stripFinalNewline(value); } return value; }; function execa(file, args, options) { const parsed = handleArguments(file, args, options); const command = joinCommand(file, args); const escapedCommand = getEscapedCommand(file, args); logCommand(escapedCommand, parsed.options); validateTimeout(parsed.options); let spawned; try { spawned = childProcess.spawn(parsed.file, parsed.args, parsed.options); } catch (error) { const dummySpawned = new childProcess.ChildProcess(); const errorPromise = Promise.reject(makeError({ error, stdout: "", stderr: "", all: "", command, escapedCommand, parsed, timedOut: false, isCanceled: false, killed: false })); mergePromise(dummySpawned, errorPromise); return dummySpawned; } const spawnedPromise = getSpawnedPromise(spawned); const timedPromise = setupTimeout(spawned, parsed.options, spawnedPromise); const processDone = setExitHandler(spawned, parsed.options, timedPromise); const context = { isCanceled: false }; spawned.kill = spawnedKill.bind(null, spawned.kill.bind(spawned)); spawned.cancel = spawnedCancel.bind(null, spawned, context); const handlePromise = async () => { const [{ error, exitCode, signal, timedOut }, stdoutResult, stderrResult, allResult] = await getSpawnedResult(spawned, parsed.options, processDone); const stdout = handleOutput(parsed.options, stdoutResult); const stderr = handleOutput(parsed.options, stderrResult); const all = handleOutput(parsed.options, allResult); if (error || exitCode !== 0 || signal !== null) { const returnedError = makeError({ error, exitCode, signal, stdout, stderr, all, command, escapedCommand, parsed, timedOut, isCanceled: (parsed.options.signal ? parsed.options.signal.aborted : false), killed: spawned.killed }); if (!parsed.options.reject) { return returnedError; } throw returnedError; } return { command, escapedCommand, exitCode: 0, stdout, stderr, all, failed: false, timedOut: false, isCanceled: false, killed: false }; }; const handlePromiseOnce = onetime_default(handlePromise); handleInput(spawned, parsed.options); spawned.all = makeAllStream(spawned, parsed.options); addPipeMethods(spawned); mergePromise(spawned, handlePromiseOnce); return spawned; } // src/execCommand.ts async function execCommand(cmd, args) { const res = await execa(cmd, args); return res.stdout.trim(); } export { execCommand };