pipeline
April 12, 2026 ยท View on GitHub
pipeline(value, ...functions)
Pipes a value through a series of functions, left to right. This is a convenience for composing with* functions without deep nesting.
For with* wrappers, that left-to-right pipeline() order is the canonical documented order throughout this package. The resulting runtime wrapper nesting is the inverse of that order.
Parameters
value- The initial value to pipe through.functions- Functions to apply in order. Each function receives the previous function's return value and may return a different type.
Returns
The result of applying all functions.
Example
import {pipeline, withBaseUrl, withHeaders, withHttpError, withTimeout} from 'fetch-extras';
const apiFetch = pipeline(
fetch,
withTimeout(5000),
withBaseUrl('https://api.example.com'),
withHeaders({Authorization: 'Bearer token'}),
withHttpError(),
);
const response = await apiFetch('/users');
const data = await response.json();
Equivalent nested form:
const apiFetch = withHttpError()(
withHeaders({Authorization: 'Bearer token'})(
withBaseUrl('https://api.example.com')(
withTimeout(5000)(fetch),
),
),
);
Without pipeline(), the same composition would need nested with* calls.
FAQ
Why do I need to pass fetch explicitly?
Because pipeline() is a generic utility, not a fetch-specific one. Passing fetch explicitly keeps the starting point obvious and avoids special-casing globalThis.fetch.