@smeijer/ky
Version:
Tiny and elegant HTTP client based on the Fetch API
73 lines • 2.94 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.deepMerge = exports.mergeHooks = exports.mergeHeaders = exports.validateAndMerge = void 0;
const is_js_1 = require("./is.js");
const validateAndMerge = (...sources) => {
for (const source of sources) {
if ((!(0, is_js_1.isObject)(source) || Array.isArray(source)) && source !== undefined) {
throw new TypeError('The `options` argument must be an object');
}
}
return (0, exports.deepMerge)({}, ...sources);
};
exports.validateAndMerge = validateAndMerge;
const mergeHeaders = (source1 = {}, source2 = {}) => {
const result = new globalThis.Headers(source1);
const isHeadersInstance = source2 instanceof globalThis.Headers;
const source = new globalThis.Headers(source2);
for (const [key, value] of source.entries()) {
if ((isHeadersInstance && value === 'undefined') || value === undefined) {
result.delete(key);
}
else {
result.set(key, value);
}
}
return result;
};
exports.mergeHeaders = mergeHeaders;
function newHookValue(original, incoming, property) {
return (Object.hasOwn(incoming, property) && incoming[property] === undefined)
? []
: (0, exports.deepMerge)(original[property] ?? [], incoming[property] ?? []);
}
const mergeHooks = (original = {}, incoming = {}) => ({
beforeRequest: newHookValue(original, incoming, 'beforeRequest'),
beforeRetry: newHookValue(original, incoming, 'beforeRetry'),
afterResponse: newHookValue(original, incoming, 'afterResponse'),
beforeError: newHookValue(original, incoming, 'beforeError'),
});
exports.mergeHooks = mergeHooks;
// TODO: Make this strongly-typed (no `any`).
const deepMerge = (...sources) => {
let returnValue = {};
let headers = {};
let hooks = {};
for (const source of sources) {
if (Array.isArray(source)) {
if (!Array.isArray(returnValue)) {
returnValue = [];
}
returnValue = [...returnValue, ...source];
}
else if ((0, is_js_1.isObject)(source)) {
for (let [key, value] of Object.entries(source)) {
if ((0, is_js_1.isObject)(value) && key in returnValue) {
value = (0, exports.deepMerge)(returnValue[key], value);
}
returnValue = { ...returnValue, [key]: value };
}
if ((0, is_js_1.isObject)(source.hooks)) {
hooks = (0, exports.mergeHooks)(hooks, source.hooks);
returnValue.hooks = hooks;
}
if ((0, is_js_1.isObject)(source.headers)) {
headers = (0, exports.mergeHeaders)(headers, source.headers);
returnValue.headers = headers;
}
}
}
return returnValue;
};
exports.deepMerge = deepMerge;
//# sourceMappingURL=merge.js.map