74 lines
2.5 KiB
JavaScript
74 lines
2.5 KiB
JavaScript
// File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
|
|
import { isReadonlyArray } from "./utils/values.mjs";
|
|
const brand_privateNullableHeaders = /* @__PURE__ */ Symbol('brand.privateNullableHeaders');
|
|
function* iterateHeaders(headers) {
|
|
if (!headers)
|
|
return;
|
|
if (brand_privateNullableHeaders in headers) {
|
|
const { values, nulls } = headers;
|
|
yield* values.entries();
|
|
for (const name of nulls) {
|
|
yield [name, null];
|
|
}
|
|
return;
|
|
}
|
|
let shouldClear = false;
|
|
let iter;
|
|
if (headers instanceof Headers) {
|
|
iter = headers.entries();
|
|
}
|
|
else if (isReadonlyArray(headers)) {
|
|
iter = headers;
|
|
}
|
|
else {
|
|
shouldClear = true;
|
|
iter = Object.entries(headers ?? {});
|
|
}
|
|
for (let row of iter) {
|
|
const name = row[0];
|
|
if (typeof name !== 'string')
|
|
throw new TypeError('expected header name to be a string');
|
|
const values = isReadonlyArray(row[1]) ? row[1] : [row[1]];
|
|
let didClear = false;
|
|
for (const value of values) {
|
|
if (value === undefined)
|
|
continue;
|
|
// Objects keys always overwrite older headers, they never append.
|
|
// Yield a null to clear the header before adding the new values.
|
|
if (shouldClear && !didClear) {
|
|
didClear = true;
|
|
yield [name, null];
|
|
}
|
|
yield [name, value];
|
|
}
|
|
}
|
|
}
|
|
export const buildHeaders = (newHeaders) => {
|
|
const targetHeaders = new Headers();
|
|
const nullHeaders = new Set();
|
|
for (const headers of newHeaders) {
|
|
const seenHeaders = new Set();
|
|
for (const [name, value] of iterateHeaders(headers)) {
|
|
const lowerName = name.toLowerCase();
|
|
if (!seenHeaders.has(lowerName)) {
|
|
targetHeaders.delete(name);
|
|
seenHeaders.add(lowerName);
|
|
}
|
|
if (value === null) {
|
|
targetHeaders.delete(name);
|
|
nullHeaders.add(lowerName);
|
|
}
|
|
else {
|
|
targetHeaders.append(name, value);
|
|
nullHeaders.delete(lowerName);
|
|
}
|
|
}
|
|
}
|
|
return { [brand_privateNullableHeaders]: true, values: targetHeaders, nulls: nullHeaders };
|
|
};
|
|
export const isEmptyHeaders = (headers) => {
|
|
for (const _ of iterateHeaders(headers))
|
|
return false;
|
|
return true;
|
|
};
|
|
//# sourceMappingURL=headers.mjs.map
|