{"version":3,"file":"runTask.cjs","names":["Writable"],"sources":["../../../../src/utils/runParallel/runTask.ts"],"sourcesContent":["//------------------------------------------------------------------------------\n// Requirements\n//------------------------------------------------------------------------------\n\nimport { Writable } from 'node:stream';\n\n//------------------------------------------------------------------------------\n// Helpers\n//------------------------------------------------------------------------------\n\n/**\n * Remove the given value from the array.\n */\nconst remove = <T>(array: T[], x: T): void => {\n  const index = array.indexOf(x);\n  if (index !== -1) {\n    array.splice(index, 1);\n  }\n};\n\nconst signals: Record<string, number> = {\n  // Signal name mappings to their respective standard numeric codes.\n  // See: https://man7.org/linux/man-pages/man7/signal.7.html\n\n  SIGABRT: 6, // Abort signal from abort(3)\n  SIGALRM: 14, // Timer signal from alarm(2)\n  SIGBUS: 10, // Bus error (bad memory access)\n  SIGCHLD: 20, // Child stopped or terminated\n  SIGCONT: 19, // Continue if stopped\n  SIGFPE: 8, // Floating point exception\n  SIGHUP: 1, // Hangup detected on controlling terminal or death of controlling process\n  SIGILL: 4, // Illegal Instruction\n  SIGINT: 2, // Interrupt from keyboard (Ctrl+C)\n  SIGKILL: 9, // Kill signal (cannot be caught or ignored)\n  SIGPIPE: 13, // Broken pipe: write to pipe with no readers\n  SIGQUIT: 3, // Quit from keyboard (Ctrl+\\)\n  SIGSEGV: 11, // Invalid memory reference (segmentation fault)\n  SIGSTOP: 17, // Stop process (cannot be caught or ignored)\n  SIGTERM: 15, // Termination signal\n  SIGTRAP: 5, // Trace/breakpoint trap\n  SIGTSTP: 18, // Stop typed at tty (Ctrl+Z)\n  SIGTTIN: 21, // tty input for background process\n  SIGTTOU: 22, // tty output for background process\n  SIGUSR1: 30, // User-defined signal 1\n  SIGUSR2: 31, // User-defined signal 2\n};\n\n/**\n * Converts a signal name to a number.\n */\nconst convert = (signal: string): number => {\n  return signals[signal] || 0;\n};\n\n/**\n * Simple in-memory writable stream\n */\nclass MemoryStream extends Writable {\n  private chunks: Buffer[] = [];\n\n  _write(\n    chunk: Buffer,\n    _encoding: string,\n    callback: (error?: Error | null) => void\n  ): void {\n    this.chunks.push(chunk);\n    callback();\n  }\n\n  toString(): string {\n    return Buffer.concat(this.chunks).toString('utf8');\n  }\n}\n\n//------------------------------------------------------------------------------\n// Types\n//------------------------------------------------------------------------------\n\ninterface TaskResult {\n  name: string;\n  code: number | null;\n  signal?: string | null;\n}\n\ninterface TaskQueueItem {\n  name: string;\n  index: number;\n}\n\ninterface RunTaskOptions {\n  stdout: NodeJS.WritableStream;\n  stderr?: NodeJS.WritableStream;\n  aggregateOutput?: boolean;\n  continueOnError?: boolean;\n  race?: boolean;\n  maxParallel?: number;\n}\n\ninterface TaskPromise extends Promise<TaskResult> {\n  abort?: () => void;\n}\n\n//------------------------------------------------------------------------------\n// Public Interface\n//------------------------------------------------------------------------------\n\n/**\n * Run npm-scripts of given names in parallel.\n *\n * If a npm-script exited with a non-zero code, this aborts other all npm-scripts.\n *\n * Note: This is a simplified version for our use case.\n * The full implementation would require the actual runTask function from npm-run-all.\n */\nexport const runTasks = (\n  tasks: string[],\n  options: RunTaskOptions\n): Promise<TaskResult[]> => {\n  return new Promise((resolve, reject) => {\n    if (tasks.length === 0) {\n      resolve([]);\n      return;\n    }\n\n    const results: TaskResult[] = tasks.map((task) => ({\n      name: task,\n      code: undefined as any,\n    }));\n    const queue: TaskQueueItem[] = tasks.map((task, index) => ({\n      name: task,\n      index,\n    }));\n    const promises: TaskPromise[] = [];\n    let error: Error | null = null;\n    let aborted = false;\n\n    /**\n     * Done.\n     */\n    const done = (): void => {\n      if (error == null) {\n        resolve(results);\n      } else {\n        reject(error);\n      }\n    };\n\n    /**\n     * Aborts all tasks.\n     */\n    const abort = (): void => {\n      if (aborted) {\n        return;\n      }\n      aborted = true;\n\n      if (promises.length === 0) {\n        done();\n      } else {\n        for (const p of promises) {\n          p.abort?.();\n        }\n        Promise.all(promises).then(done, reject);\n      }\n    };\n\n    /**\n     * Runs a next task.\n     */\n    const next = (): void => {\n      if (aborted) {\n        return;\n      }\n      if (queue.length === 0) {\n        if (promises.length === 0) {\n          done();\n        }\n        return;\n      }\n\n      const originalOutputStream = options.stdout;\n      const optionsClone = { ...options };\n      const writer = new MemoryStream();\n\n      if (options.aggregateOutput) {\n        optionsClone.stdout = writer as any;\n      }\n\n      const task = queue.shift()!;\n\n      // Note: This requires the actual runTask implementation from npm-run-all\n      // For now, this is a placeholder that would need to be implemented\n      const promise = Promise.resolve({\n        name: task.name,\n        code: 0,\n        signal: null,\n      }) as TaskPromise;\n\n      promises.push(promise);\n      promise.then(\n        (result) => {\n          remove(promises, promise);\n          if (aborted) {\n            return;\n          }\n\n          if (options.aggregateOutput) {\n            originalOutputStream.write(writer.toString());\n          }\n\n          // Check if the task failed as a result of a signal, and\n          // amend the exit code as a result.\n          if (\n            result.code === null &&\n            result.signal !== null &&\n            result.signal !== undefined\n          ) {\n            // An exit caused by a signal must return a status code\n            // of 128 plus the value of the signal code.\n            // Ref: https://nodejs.org/api/process.html#process_exit_codes\n            result.code = 128 + convert(result.signal);\n          }\n\n          // Save the result.\n          results[task.index].code = result.code;\n\n          // Aborts all tasks if it's an error.\n          if (result.code) {\n            error = new Error(\n              `Task ${result.name} failed with code ${result.code}`\n            );\n            if (!options.continueOnError) {\n              abort();\n              return;\n            }\n          }\n\n          // Aborts all tasks if options.race is true.\n          if (options.race && !result.code) {\n            abort();\n            return;\n          }\n\n          // Call the next task.\n          next();\n        },\n        (thisError: Error) => {\n          remove(promises, promise);\n          if (!options.continueOnError || options.race) {\n            error = thisError;\n            abort();\n            return;\n          }\n          next();\n        }\n      );\n    };\n\n    const max = options.maxParallel;\n    const end =\n      typeof max === 'number' && max > 0\n        ? Math.min(tasks.length, max)\n        : tasks.length;\n    for (let i = 0; i < end; ++i) {\n      next();\n    }\n  });\n};\n"],"mappings":"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"}