{"version":3,"file":"index.mjs","names":[],"sources":["../../../../src/utils/runParallel/index.ts"],"sourcesContent":["import { delimiter, join } from 'node:path';\nimport { spawnPosix } from './spawnPosix';\nimport { spawnWin32 } from './spawnWin32';\n\nexport type ParallelHandle = {\n  kill: () => void;\n  result: Promise<any>;\n  commandText: string;\n};\n\n/**\n * Start a cross-platform parallel process using npm-run-all approach.\n * Accepts either a single string (e.g., 'next start') or an array of tokens (e.g., ['next', 'start']).\n */\nexport const runParallel = (proc?: string | string[]): ParallelHandle => {\n  if (!proc || (Array.isArray(proc) && proc.length === 0))\n    throw new Error('Invalid command');\n\n  const commandText = Array.isArray(proc) ? proc.join(' ') : proc;\n\n  const isArray = Array.isArray(proc);\n  const command = isArray ? (proc as string[])[0] : commandText;\n  const args = isArray ? (proc as string[]).slice(1) : [];\n\n  // Ensure local binaries (node_modules/.bin) are resolvable\n  const cwdBin = join(process.cwd(), 'node_modules', '.bin');\n  const PATH_KEY =\n    Object.keys(process.env).find((key) => key.toLowerCase() === 'path') ??\n    'PATH';\n\n  const extendedPath = [cwdBin, process.env[PATH_KEY] ?? '']\n    .filter(Boolean)\n    .join(delimiter);\n\n  const childEnv = {\n    ...process.env,\n    [PATH_KEY]: extendedPath,\n  } as NodeJS.ProcessEnv;\n\n  const isWin = process.platform === 'win32';\n  const spawnFunc = isWin ? spawnWin32 : spawnPosix;\n\n  // Spawn options\n  const spawnOptions = {\n    cwd: process.cwd(),\n    stdio: 'inherit' as const,\n    env: childEnv,\n    shell: isWin,\n  };\n\n  // Spawn the child process\n  const child = isArray\n    ? // If provided as a single string element that includes spaces, treat it like a shell command\n      args.length === 0 && /\\s/.test(command)\n      ? isWin\n        ? spawnFunc(\n            process.env.ComSpec ?? 'cmd.exe',\n            ['/d', '/s', '/c', command],\n            spawnOptions\n          )\n        : spawnFunc(\n            process.env.SHELL ?? '/bin/sh',\n            ['-c', command],\n            spawnOptions\n          )\n      : spawnFunc(command, args, spawnOptions)\n    : isWin\n      ? spawnFunc(\n          process.env.ComSpec ?? 'cmd.exe',\n          ['/d', '/s', '/c', commandText],\n          spawnOptions\n        )\n      : spawnFunc(\n          process.env.SHELL ?? '/bin/sh',\n          ['-c', commandText],\n          spawnOptions\n        );\n\n  const result = new Promise<void>((resolve, reject) => {\n    child.on('error', (err) => {\n      try {\n        console.error(\n          `[runParallel] Failed to start: ${err?.message ?? String(err)}`\n        );\n      } catch {}\n      reject(err);\n    });\n\n    child.on('exit', (code, signal) => {\n      // Treat common termination signals as graceful exits, not failures\n      const gracefulSignals = ['SIGINT', 'SIGTERM', 'SIGQUIT', 'SIGHUP'];\n      // Also treat shell-convention exit codes (128 + signal number) as graceful:\n      // 129 = SIGHUP, 130 = SIGINT, 131 = SIGQUIT, 143 = SIGTERM\n      const gracefulSignalCodes = new Set([129, 130, 131, 143]);\n      if (\n        code === 0 ||\n        gracefulSignalCodes.has(code ?? -1) ||\n        (signal && gracefulSignals.includes(signal))\n      ) {\n        resolve();\n      } else {\n        reject(\n          Object.assign(new Error('Parallel process failed'), { code, signal })\n        );\n      }\n    });\n  });\n\n  const kill = () => {\n    try {\n      child.kill('SIGTERM');\n    } catch {\n      // Best effort\n    }\n  };\n\n  const handleExit = () => kill();\n\n  const handleSigInt = () => {\n    kill();\n    process.off('SIGINT', handleSigInt);\n    process.kill(process.pid, 'SIGINT'); // Propagate to allow natural shutdown\n  };\n\n  const handleSigTerm = () => {\n    kill();\n    process.off('SIGTERM', handleSigTerm);\n    process.kill(process.pid, 'SIGTERM'); // Propagate to allow natural shutdown\n  };\n\n  process.on('exit', handleExit);\n  process.on('SIGINT', handleSigInt);\n  process.on('SIGTERM', handleSigTerm);\n\n  child.on('exit', () => {\n    process.off('exit', handleExit);\n    process.off('SIGINT', handleSigInt);\n    process.off('SIGTERM', handleSigTerm);\n  });\n\n  return { kill, result, commandText };\n};\n"],"mappings":";;;;;;;;;AAcA,MAAa,eAAe,SAA6C;CACvE,IAAI,CAAC,QAAS,MAAM,QAAQ,IAAI,KAAK,KAAK,WAAW,GACnD,MAAM,IAAI,MAAM,iBAAiB;CAEnC,MAAM,cAAc,MAAM,QAAQ,IAAI,IAAI,KAAK,KAAK,GAAG,IAAI;CAE3D,MAAM,UAAU,MAAM,QAAQ,IAAI;CAClC,MAAM,UAAU,UAAW,KAAkB,KAAK;CAClD,MAAM,OAAO,UAAW,KAAkB,MAAM,CAAC,IAAI,CAAC;CAGtD,MAAM,SAAS,KAAK,QAAQ,IAAI,GAAG,gBAAgB,MAAM;CACzD,MAAM,WACJ,OAAO,KAAK,QAAQ,GAAG,EAAE,MAAM,QAAQ,IAAI,YAAY,MAAM,MAAM,KACnE;CAEF,MAAM,eAAe,CAAC,QAAQ,QAAQ,IAAI,aAAa,EAAE,EACtD,OAAO,OAAO,EACd,KAAK,SAAS;CAEjB,MAAM,WAAW;EACf,GAAG,QAAQ;GACV,WAAW;CACd;CAEA,MAAM,QAAQ,QAAQ,aAAa;CACnC,MAAM,YAAY,QAAQ,aAAa;CAGvC,MAAM,eAAe;EACnB,KAAK,QAAQ,IAAI;EACjB,OAAO;EACP,KAAK;EACL,OAAO;CACT;CAGA,MAAM,QAAQ,UAEV,KAAK,WAAW,KAAK,KAAK,KAAK,OAAO,IACpC,QACE,UACE,QAAQ,IAAI,WAAW,WACvB;EAAC;EAAM;EAAM;EAAM;CAAO,GAC1B,YACF,IACA,UACE,QAAQ,IAAI,SAAS,WACrB,CAAC,MAAM,OAAO,GACd,YACF,IACF,UAAU,SAAS,MAAM,YAAY,IACvC,QACE,UACE,QAAQ,IAAI,WAAW,WACvB;EAAC;EAAM;EAAM;EAAM;CAAW,GAC9B,YACF,IACA,UACE,QAAQ,IAAI,SAAS,WACrB,CAAC,MAAM,WAAW,GAClB,YACF;CAEN,MAAM,SAAS,IAAI,SAAe,SAAS,WAAW;EACpD,MAAM,GAAG,UAAU,QAAQ;GACzB,IAAI;IACF,QAAQ,MACN,kCAAkC,KAAK,WAAW,OAAO,GAAG,GAC9D;GACF,QAAQ,CAAC;GACT,OAAO,GAAG;EACZ,CAAC;EAED,MAAM,GAAG,SAAS,MAAM,WAAW;GAMjC,IACE,SAAS,KACT,IAH8B,IAAI;IAAC;IAAK;IAAK;IAAK;GAAG,CAGnC,EAAE,IAAI,QAAQ,EAAE,KACjC,UAAU;IAPY;IAAU;IAAW;IAAW;GAO9B,EAAE,SAAS,MAAM,GAE1C,QAAQ;QAER,OACE,OAAO,uBAAO,IAAI,MAAM,yBAAyB,GAAG;IAAE;IAAM;GAAO,CAAC,CACtE;EAEJ,CAAC;CACH,CAAC;CAED,MAAM,aAAa;EACjB,IAAI;GACF,MAAM,KAAK,SAAS;EACtB,QAAQ,CAER;CACF;CAEA,MAAM,mBAAmB,KAAK;CAE9B,MAAM,qBAAqB;EACzB,KAAK;EACL,QAAQ,IAAI,UAAU,YAAY;EAClC,QAAQ,KAAK,QAAQ,KAAK,QAAQ;CACpC;CAEA,MAAM,sBAAsB;EAC1B,KAAK;EACL,QAAQ,IAAI,WAAW,aAAa;EACpC,QAAQ,KAAK,QAAQ,KAAK,SAAS;CACrC;CAEA,QAAQ,GAAG,QAAQ,UAAU;CAC7B,QAAQ,GAAG,UAAU,YAAY;CACjC,QAAQ,GAAG,WAAW,aAAa;CAEnC,MAAM,GAAG,cAAc;EACrB,QAAQ,IAAI,QAAQ,UAAU;EAC9B,QAAQ,IAAI,UAAU,YAAY;EAClC,QAAQ,IAAI,WAAW,aAAa;CACtC,CAAC;CAED,OAAO;EAAE;EAAM;EAAQ;CAAY;AACrC"}