UNPKG

libmodulor

Version:

A TypeScript library to create platform-agnostic applications

58 lines (57 loc) 2.46 kB
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; return c > 3 && r && Object.defineProperty(target, key, r), r; }; import { spawn } from 'node:child_process'; import { injectable } from 'inversify'; let NodeSpawnShellCommandExecutor = class NodeSpawnShellCommandExecutor { async exec({ bin, opts, }) { return new Promise((resolve, reject) => { let stderr = ''; let stdout = ''; const proc = spawn(bin, opts?.args || [], { cwd: opts?.cwd, env: opts?.env, }); if (opts?.stdin) { proc.stdin.on('error', (err) => { // Some binaries like `file` can finish before writing is done. // TODO : Consider adding an option to avoid ignoring this error if need be. if ('code' in err && err.code !== 'EPIPE') { reject(err); } }); proc.stdin.end(opts.stdin); } proc.stderr.on('data', (chunk) => { stderr += chunk; if (opts?.streamData) { process.stderr.write(chunk); } }); proc.stdout.on('data', (chunk) => { stdout += chunk; if (opts?.streamData) { process.stdout.write(chunk); } }); proc.on('error', (err) => { reject(err); }); proc.on('close', (code, signal) => { if (code === 0) { resolve(stdout); } else { reject(new Error(`Command failed with exit code (${code}), signal (${signal}), stderr (${stderr}) stdout (${stdout})`)); } }); }); } }; NodeSpawnShellCommandExecutor = __decorate([ injectable() ], NodeSpawnShellCommandExecutor); export { NodeSpawnShellCommandExecutor };