{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAA;AACnC,OAAO,KAAK,MAAM,MAAM,aAAa,CAAA;AAGrC,MAAM,MAAM,uBAAuB,CAAC,CAAC,IAAI,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,EAAE,CAAA;AAKjE,qBAAa,QAAQ,CAAC,CAAC,CAAE,SAAQ,QAAQ,CAAC,CAAC,EAAE,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;;IAKjE,YAAa,IAAI,EAAE,uBAAuB,CAAC,CAAC,CAAC,EAAE,GAAG,OAAO,EAAE,CAAC,QAAQ,GAAG,MAAM,CAAC,EAAE,EAM/E;IAcD,IAAI,CAAE,GAAG,OAAO,EAAE,CAAC,MAAM,GAAG,QAAQ,CAAC,EAAE,QAUtC;IAED,OAAO,CAAE,GAAG,OAAO,EAAE,CAAC,MAAM,GAAG,QAAQ,CAAC,EAAE,QASzC;IAED,OAAO,CAAE,EAAE,CAAC,EAAE,KAAK,QAKlB;IA6BD,KAAK,SAIJ;IAMD,IAAI,CAAE,KAAK,SAAS,MAAM,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,GAAG,IAAI,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,WAK1F;IAYD,KAAK,CACH,KAAK,EAAE,CAAC,EACR,GAAG,CAAC,EAAE,QAAQ,CAAC,QAAQ,GAAG,CAAC,MAAM,IAAI,CAAC,EACtC,EAAE,CAAC,EAAE,MAAM,IAAI,GACd,OAAO,CAKT;IACD,GAAG,CAAE,KAAK,CAAC,EAAE,CAAC,GAAG,QAAQ,CAAC,QAAQ,GAAG,CAAC,MAAM,IAAI,CAAC,EAAE,GAAG,CAAC,EAAE,QAAQ,CAAC,QAAQ,GAAG,CAAC,MAAM,IAAI,CAAC,EAAE,EAAE,CAAC,EAAE,MAAM,IAAI,QAKzG;CACF","sourcesContent":["import { Minipass } from 'minipass'\nimport type Stream from 'node:stream'\n\n\nexport type MinipassPipelineOptions<R> = Minipass.Options<R> & {}\n\nconst hasDestroyMethod = <T extends {}>(s: T): s is T & { destroy: () => void } =>\n  ('destroy' in s) && typeof s.destroy === 'function'\n\nexport class Pipeline<R> extends Minipass<R, R, Minipass.Events<R>> {\n  #streams: (Stream | Minipass)[] = []\n  #tail?: (Stream | Minipass)\n  #head?: (Stream | Minipass)\n\n  constructor (opts: MinipassPipelineOptions<R>, ...streams: (Minipass | Stream)[]) {\n    //oxlint-disable-next-line ban-ts-comment\n    //@ts-ignore type inference puzzle for another day\n    super(opts)\n    if (streams.length)\n      this.push(...streams)\n  }\n\n  #linkStreams (streams: (Stream | Minipass)[]) {\n    // reduce takes (left,right), and we return right to make it the\n    // new left value.\n    return streams.reduce((src, dest) => {\n      const s = src as Minipass\n      const d = dest as Minipass\n      s.on('error', er => d.emit('error', er))\n      s.pipe(d)\n      return dest\n    })\n  }\n\n  push (...streams: (Stream | Minipass)[]) {\n    this.#streams.push(...streams)\n    if (this.#tail)\n      streams.unshift(this.#tail)\n\n    const linkRet = this.#linkStreams(streams)\n\n    this.#setTail(linkRet)\n    if (!this.#head)\n      this.#setHead(streams[0] as Minipass)\n  }\n\n  unshift (...streams: (Stream | Minipass)[]) {\n    this.#streams.unshift(...streams)\n    if (this.#head)\n      streams.push(this.#head)\n\n    const linkRet = this.#linkStreams(streams)\n    this.#setHead(streams[0] as Minipass)\n    if (!this.#tail)\n      this.#setTail(linkRet)\n  }\n\n  destroy (er?: Error) {\n    // set fire to the whole thing.\n    this.#streams.forEach(s =>\n      hasDestroyMethod(s) && s.destroy())\n    return super.destroy(er)\n  }\n\n  // readable interface -> tail\n  #setTail (stream: Stream | Minipass) {\n    const s = stream as Stream\n    this.#tail = stream\n    s.on('error', er => this.#onError(stream, er))\n    s.on('data', chunk => this.#onData(stream, chunk))\n    s.on('end', () => this.#onEnd(stream))\n    s.on('finish', () => this.#onEnd(stream))\n  }\n\n  // errors proxied down the pipeline\n  // they're considered part of the \"read\" interface\n  #onError (stream: Stream | Minipass, er: unknown) {\n    if (stream === this.#tail)\n      this.emit('error', er)\n  }\n  #onData (stream: Stream | Minipass, chunk: R) {\n    if (stream === this.#tail) {\n      //oxlint-disable-next-line ban-ts-comment\n      //@ts-ignore type inference puzzle for another day\n      super.write(chunk)\n    }\n  }\n  #onEnd (stream: Stream | Minipass) {\n    if (stream === this.#tail)\n      super.end()\n  }\n  pause () {\n    super.pause()\n    const t = this.#tail as Minipass\n    if (t && t.pause) t.pause()\n  }\n\n  // NB: Minipass calls its internal private [RESUME] method during\n  // pipe drains, to avoid hazards where stream.resume() is overridden.\n  // Thus, we need to listen to the resume *event*, not override the\n  // resume() method, and proxy *that* to the tail.\n  emit <Event extends keyof Minipass.Events<R>>(ev: Event, ...args: Minipass.Events<R>[Event]) {\n    const t = this.#tail as Minipass\n    if (ev === 'resume' && t && t.resume)\n      t.resume()\n    return super.emit(ev, ...args)\n  }\n\n  // writable interface -> head\n  #setHead (stream: Stream | Minipass) {\n    const s = stream as Minipass\n    this.#head = s\n    s.on('drain', () => this.#onDrain(s))\n  }\n  #onDrain (stream: Stream | Minipass) {\n    if (stream === this.#head)\n      this.emit('drain')\n  }\n  write(\n    chunk: R,\n    enc?: Minipass.Encoding | (() => void),\n    cb?: () => void\n  ): boolean {\n    //oxlint-disable-next-line ban-ts-comment\n    //@ts-ignore type inference puzzle for another day\n    return (this.#head as Minipass).write(chunk, enc, cb) &&\n      (this.flowing || this.bufferLength === 0)\n  }\n  end (chunk?: R | Minipass.Encoding | (() => void), enc?: Minipass.Encoding | (() => void), cb?: () => void) {\n    //oxlint-disable-next-line ban-ts-comment\n    //@ts-ignore type inference puzzle for another day\n    this.#head.end(chunk, enc, cb)\n    return this\n  }\n}\n"]}