66 lines
No EOL
2.5 KiB
JavaScript
66 lines
No EOL
2.5 KiB
JavaScript
import { isObject } from './is.js';
|
|
export const validateAndMerge = (...sources) => {
|
|
for (const source of sources) {
|
|
if ((!isObject(source) || Array.isArray(source)) && source !== undefined) {
|
|
throw new TypeError('The `options` argument must be an object');
|
|
}
|
|
}
|
|
return deepMerge({}, ...sources);
|
|
};
|
|
export 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;
|
|
};
|
|
function newHookValue(original, incoming, property) {
|
|
return (Object.hasOwn(incoming, property) && incoming[property] === undefined)
|
|
? []
|
|
: deepMerge(original[property] ?? [], incoming[property] ?? []);
|
|
}
|
|
export const mergeHooks = (original = {}, incoming = {}) => ({
|
|
beforeRequest: newHookValue(original, incoming, 'beforeRequest'),
|
|
beforeRetry: newHookValue(original, incoming, 'beforeRetry'),
|
|
afterResponse: newHookValue(original, incoming, 'afterResponse'),
|
|
beforeError: newHookValue(original, incoming, 'beforeError'),
|
|
});
|
|
// TODO: Make this strongly-typed (no `any`).
|
|
export 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 (isObject(source)) {
|
|
for (let [key, value] of Object.entries(source)) {
|
|
if (isObject(value) && key in returnValue) {
|
|
value = deepMerge(returnValue[key], value);
|
|
}
|
|
returnValue = { ...returnValue, [key]: value };
|
|
}
|
|
if (isObject(source.hooks)) {
|
|
hooks = mergeHooks(hooks, source.hooks);
|
|
returnValue.hooks = hooks;
|
|
}
|
|
if (isObject(source.headers)) {
|
|
headers = mergeHeaders(headers, source.headers);
|
|
returnValue.headers = headers;
|
|
}
|
|
}
|
|
}
|
|
return returnValue;
|
|
};
|
|
//# sourceMappingURL=merge.js.map
|