/**
 * 单个 Http Header 的数组类型
 *
 * ```ts
 * const header: HeaderAry = ['content-type', 'application/json'];
 * ```
 */
type AryHeaderItem = [string, string];
type HeadersInitInput = HeadersInit | undefined | null;
/**
 * 将任意 `HeadersInit` 转为多个 {@link AryHeaderItem} 的数组
 *
 * 浏览器环境或 bun 环境下，`HeadersInit` 类型如下：
 *
 * `type HeadersInit = [string, string][] | Record<string, string> | Headers;`
 *
 * 需要注意的是，在使用 `headers<Headers>.entries()` 时，Header 的 Key 会转为小写：
 *
 * ```ts
 * const h = new Headers();
 * h.set('Content-Type', 'application/json');
 * console.log([...h.keys()]); // 将输出 => ['content-type']
 * ```
 *
 * 所以，当输入的 `headers` 为 `[string, string][]` 或 `Record<string, string>` 类
 * 型时，应该确保 Key 为小写。即：
 *
 * ```ts
 * const h1 = [['content-Type', 'application/json']];
 * const h2 = { 'content-Type': 'application/json' };
 * ```
 *
 * @param headers
 * @returns {AryHeaderItem[]}
 */
declare const toAryHeaders: (headers?: HeadersInitInput) => AryHeaderItem[];
/**
 * 合并多个 {@link HeadersInitInput} 为 `Headers` 对象
 *
 * Key(Header name) 会进行 trim 操作：
 *
 * - Key(Header name) 头尾的空格（制表符、回车符）会被去除
 * - 当 Key(Header name) 为空字符（trim 后），将跳过该 Key
 *
 * 注意：当输入的 `headers` 为 `[string, string][]` 或 `Record<string, string>` 类
 * 型时，应该确保 Key(Header name) 为小写（以确保同 Key 的 Header 会被有效覆盖）。
 *
 * @param inputs 多个 {@link HeadersInitInput} 对象，Key(Header name) 应为小写（中划线）
 * @returns {Headers}
 */
declare const mergeHeaders: (...inputs: HeadersInitInput[]) => Headers;

/**
 * 合并多个 AbortSignals
 *
 * ```ts
 * const maybeSignal: AbortSignal | null = null;
 * mergeAbortSignals(new AbortController, AbortSignal.timeout(5000), maybeSignal);
 * // AbortSignal.any([new AbortController, AbortSignal.timeout(5000)])
 * ```
 *
 * @param signals
 * @returns {AbortSignal | undefined}
 */
declare const mergeAbortSignals: (...signals: (AbortSignal | undefined | null)[]) => AbortSignal | undefined;

type HttpStatusCode = number;
type ResponseInitInput = ResponseInit | HttpStatusCode | null | undefined;
/**
 * 合并多个 {@link ResponseInitInput} 为 `ResponseInit` 对象
 *
 * 主要针对：
 * - 允许传入 {@link HttpStatusCode} 作为 `ResponseInit`，即：`new Response(body, mergeRespInit(404))`
 * - 处理多个 `ResponseInit` 对象的 `headers` 合并
 * - 合并多个 `ResponseInit`
 *
 * ```ts
 * new Response(body,
 *   mergeRespInit(
 *     404,
 *     { headers: { 'x-a': '1' } },
 *     { headers: { 'x-b': '2', 'x-a': 'replaced' } },
 *     { status: 502, statusText: 'Bad Gateway' },
 *   )
 * );
 * ```
 *
 * @param opts
 * @returns
 */
declare const mergeRespInit: (...opts: ResponseInitInput[]) => ResponseInit;

export { mergeAbortSignals, mergeHeaders, mergeRespInit, toAryHeaders };
export type { AryHeaderItem, HeadersInitInput, HttpStatusCode, ResponseInitInput };
