@allmaps/stdlib
Version:
Allmaps Standard Library
83 lines (82 loc) • 3.1 kB
JavaScript
/* eslint-disable @typescript-eslint/no-explicit-any */
export function mergeOptions(baseOptions, ...additionalPartialOptions) {
// A specific function for merging options:
// - Assure the output extends the type of the first element (e.g. default options)
// - Speedup: spreading is a little expensive, so it checks if necessary first
// (e.g. it was previously executed for every point in transform,
// where this was a 50% speed increase when transforming a lot of points
// - Allow additionalOptions to be undefined, which simplifies handing over a simple spread
return {
...baseOptions,
...mergePartialOptions(...additionalPartialOptions)
};
}
export function mergePartialOptions(...partialOptions) {
const definedPartialOptionsArray = partialOptions.filter((partialOptions) => partialOptions !== undefined && partialOptions !== null);
if (definedPartialOptionsArray.length === 0) {
return {};
}
else if (definedPartialOptionsArray.length === 1) {
return definedPartialOptionsArray[0];
}
else {
// This spreads out eacht of the partialOptions
return Object.assign({}, ...definedPartialOptionsArray);
}
}
export function removeUndefinedOptions(...optionsArray) {
const mergedOptions = {};
for (let i = 0; i < optionsArray.length; i++) {
const options = optionsArray[i];
if (!options)
continue;
for (const key in options) {
const value = options[key];
if (value !== undefined) {
mergedOptions[key] = value;
}
}
}
return mergedOptions;
}
// Note: not using Exclude here like we do in removeUndefinedOptions,
// since TypeScript often inferes too strict types
export function mergeOptionsUnlessUndefined(baseOptions, ...additionalOptions) {
return {
...baseOptions,
...removeUndefinedOptions(...additionalOptions)
};
}
export function mergeTwoOptionsUnlessUndefined(baseOptions, additionalOption) {
if (!additionalOption || Object.keys(additionalOption).length === 0) {
return baseOptions;
}
// Build a filtered copy, excluding omitted keys and undefined values
const filtered = {};
for (const key in additionalOption) {
if (additionalOption[key] !== undefined) {
filtered[key] = additionalOption[key];
}
}
return {
...baseOptions,
...filtered
};
}
export function optionKeysToUndefinedOptions(optionKeys) {
if (optionKeys === undefined) {
return undefined;
}
return optionKeys.reduce((acc, curr) => ((acc[curr] = undefined), acc), {});
}
export function optionKeysByMapIdToUndefinedOptionsByMapId(optionKeysByMapId) {
if (optionKeysByMapId === undefined) {
return undefined;
}
const optionsByMapId = new Map();
for (const mapId of optionKeysByMapId.keys()) {
const optionKeys = optionKeysByMapId.get(mapId);
optionsByMapId.set(mapId, optionKeysToUndefinedOptions(optionKeys));
}
return optionsByMapId;
}