eve
Version:
Filesystem-first framework for durable backend AI agents that run anywhere.
1 lines • 3.92 kB
JavaScript
import{createProcessOutputBuffer}from"../process-output.js";import{armProcessAbort}from"../process-abort.js";import{PNPM_WORKSPACE_MEMBERSHIP_ARGUMENTS,hasAncestorPnpmWorkspace,pnpmWorkspaceClaimsProject}from"./pnpm.js";import{getPackageManagerStrategy}from"./index.js";import{createPackageProcessStdoutCollector,resultSucceeded}from"./process-result.js";import{spawn}from"node:child_process";function abortedTermination(e){let t=e?.reason;return t===void 0?{kind:`aborted`}:{kind:`aborted`,reason:t instanceof Error?t.message:String(t)}}function spawnPackageManager(e,t,n,r={}){let i=getPackageManagerStrategy(e),a=i.prepareArguments(t,n),o=i.resolveInvocation(a),s={executable:o.command,args:[...o.args],cwd:t};return r.signal?.aborted===!0?Promise.resolve({command:s,termination:abortedTermination(r.signal),stdout:``}):new Promise(e=>{let n=r.onOutput!==void 0||r.nonInteractive===!0,i=r.onOutput&&createProcessOutputBuffer(r.onOutput),a=r.captureStdout===!0?createPackageProcessStdoutCollector({command:s}):void 0,c;try{c=spawn(o.command,[...o.args],{cwd:t,stdio:n?[r.nonInteractive?`ignore`:`inherit`,`pipe`,`pipe`]:`inherit`,shell:o.shell,signal:r.signal})}catch(t){i?.flush();let n=t;e({command:s,termination:{kind:`spawn-error`,code:n.code,message:n.message},stdout:``});return}let l=armProcessAbort(c,r.signal);c.stdout?.on(`data`,e=>{a?.write(e),i?.write(`stdout`,e)}),c.stderr?.on(`data`,e=>i?.write(`stderr`,e));let u=!1;function settle(t){u||(u=!0,l(),a?.end(),i?.flush(),e(a?.result(t)??{command:s,termination:t,stdout:``}))}c.on(`error`,e=>{r.signal?.aborted===!0||e.name===`AbortError`?settle(abortedTermination(r.signal)):settle({kind:`spawn-error`,code:e.code,message:e.message})}),c.on(`close`,(e,t)=>{r.signal?.aborted===!0?settle(abortedTermination(r.signal)):settle(typeof t==`string`?{kind:`signal`,signal:t}:{kind:`exit`,code:e??1})})})}const PNPM_AUTO_APPROVE_REJECTION=/Unknown option:\s*['"]yes['"]/iu,PNPM_INSTALL_HELP=/^\s*For help, run:\s*pnpm help install\s*$/iu;function forwardProcessOutput(e,t){if(t!==void 0){t(e);return}(e.stream===`stdout`?process.stdout:process.stderr).write(`${e.text}\n`)}function packageManagerInstallSucceeded(e){return e.kind===`installed`&&resultSucceeded(e.result)}function packageManagerInstallFailureMessage(e){if(e.result.termination.kind===`spawn-error`)return e.result.termination.code===`ENOENT`?`${e.result.command.executable} was not found. Install it before running this step.`:`Could not start ${e.result.command.executable}: ${e.result.termination.message}`;if(e.kind===`workspace-probe-unrecognized`)return`Could not determine whether the ancestor pnpm workspace includes this project.`}async function runPackageManagerInstall(e,t,n={}){let r=getPackageManagerStrategy(e),i=n;if(e===`pnpm`&&n.ignoreWorkspace!==!0&&hasAncestorPnpmWorkspace(t)){let r=await spawnPackageManager(e,t,PNPM_WORKSPACE_MEMBERSHIP_ARGUMENTS,{...n,captureStdout:!0,nonInteractive:!0});if(!resultSucceeded(r))return{kind:`workspace-probe-failed`,result:r};let a=pnpmWorkspaceClaimsProject(r.stdout,t);if(a===void 0)return{kind:`workspace-probe-unrecognized`,result:r};a||(i={...n,ignoreWorkspace:!0})}let a=!1,o=e===`pnpm`&&i.autoApprove===!0?{...n,onOutput:e=>{if(PNPM_AUTO_APPROVE_REJECTION.test(e.text)){a=!0;return}a&&PNPM_INSTALL_HELP.test(e.text)||forwardProcessOutput(e,n.onOutput)}}:n,s=await spawnPackageManager(e,t,r.installArguments(i),o);return!resultSucceeded(s)&&a&&(s=await spawnPackageManager(e,t,r.installArguments({...i,autoApprove:!1}),n)),{kind:`installed`,result:s}}function eveDevArguments(e){return getPackageManagerStrategy(e).devArguments()}function spawnPnpm(e,t,n={}){return spawnPackageManager(`pnpm`,e,t,n)}function runPnpmInstall(e,t={}){return runPackageManagerInstall(`pnpm`,e,t)}export{eveDevArguments,packageManagerInstallFailureMessage,packageManagerInstallSucceeded,runPackageManagerInstall,runPnpmInstall,spawnPackageManager,spawnPnpm};