{"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;AACvE,KAAI,CAAC,QAAS,MAAM,QAAQ,KAAK,IAAI,KAAK,WAAW,EACnD,OAAM,IAAI,MAAM,kBAAkB;CAEpC,MAAM,cAAc,MAAM,QAAQ,KAAK,GAAG,KAAK,KAAK,IAAI,GAAG;CAE3D,MAAM,UAAU,MAAM,QAAQ,KAAK;CACnC,MAAM,UAAU,UAAW,KAAkB,KAAK;CAClD,MAAM,OAAO,UAAW,KAAkB,MAAM,EAAE,GAAG,EAAE;CAGvD,MAAM,SAAS,KAAK,QAAQ,KAAK,EAAE,gBAAgB,OAAO;CAC1D,MAAM,WACJ,OAAO,KAAK,QAAQ,IAAI,CAAC,MAAM,QAAQ,IAAI,aAAa,KAAK,OAAO,IACpE;CAEF,MAAM,eAAe,CAAC,QAAQ,QAAQ,IAAI,aAAa,GAAG,CACvD,OAAO,QAAQ,CACf,KAAK,UAAU;CAElB,MAAM,WAAW;EACf,GAAG,QAAQ;GACV,WAAW;EACb;CAED,MAAM,QAAQ,QAAQ,aAAa;CACnC,MAAM,YAAY,QAAQ,aAAa;CAGvC,MAAM,eAAe;EACnB,KAAK,QAAQ,KAAK;EAClB,OAAO;EACP,KAAK;EACL,OAAO;EACR;CAGD,MAAM,QAAQ,UAEV,KAAK,WAAW,KAAK,KAAK,KAAK,QAAQ,GACrC,QACE,UACE,QAAQ,IAAI,WAAW,WACvB;EAAC;EAAM;EAAM;EAAM;EAAQ,EAC3B,aACD,GACD,UACE,QAAQ,IAAI,SAAS,WACrB,CAAC,MAAM,QAAQ,EACf,aACD,GACH,UAAU,SAAS,MAAM,aAAa,GACxC,QACE,UACE,QAAQ,IAAI,WAAW,WACvB;EAAC;EAAM;EAAM;EAAM;EAAY,EAC/B,aACD,GACD,UACE,QAAQ,IAAI,SAAS,WACrB,CAAC,MAAM,YAAY,EACnB,aACD;CAEP,MAAM,SAAS,IAAI,SAAe,SAAS,WAAW;AACpD,QAAM,GAAG,UAAU,QAAQ;AACzB,OAAI;AACF,YAAQ,MACN,kCAAkC,KAAK,WAAW,OAAO,IAAI,GAC9D;WACK;AACR,UAAO,IAAI;IACX;AAEF,QAAM,GAAG,SAAS,MAAM,WAAW;AAMjC,OACE,SAAS,KACT,IAH8B,IAAI;IAAC;IAAK;IAAK;IAAK;IAAI,CAGnC,CAAC,IAAI,QAAQ,GAAG,IAClC,UAAU;IAPY;IAAU;IAAW;IAAW;IAO7B,CAAC,SAAS,OAAO,CAE3C,UAAS;OAET,QACE,OAAO,uBAAO,IAAI,MAAM,0BAA0B,EAAE;IAAE;IAAM;IAAQ,CAAC,CACtE;IAEH;GACF;CAEF,MAAM,aAAa;AACjB,MAAI;AACF,SAAM,KAAK,UAAU;UACf;;CAKV,MAAM,mBAAmB,MAAM;CAE/B,MAAM,qBAAqB;AACzB,QAAM;AACN,UAAQ,IAAI,UAAU,aAAa;AACnC,UAAQ,KAAK,QAAQ,KAAK,SAAS;;CAGrC,MAAM,sBAAsB;AAC1B,QAAM;AACN,UAAQ,IAAI,WAAW,cAAc;AACrC,UAAQ,KAAK,QAAQ,KAAK,UAAU;;AAGtC,SAAQ,GAAG,QAAQ,WAAW;AAC9B,SAAQ,GAAG,UAAU,aAAa;AAClC,SAAQ,GAAG,WAAW,cAAc;AAEpC,OAAM,GAAG,cAAc;AACrB,UAAQ,IAAI,QAAQ,WAAW;AAC/B,UAAQ,IAAI,UAAU,aAAa;AACnC,UAAQ,IAAI,WAAW,cAAc;GACrC;AAEF,QAAO;EAAE;EAAM;EAAQ;EAAa"}