@nerdware/ddb-single-table
Version:
A schema-based DynamoDB modeling tool, high-level API, and type-generator built to supercharge single-table designs!⚡
39 lines (38 loc) • 1.78 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.getRecursiveValueConverter = void 0;
const ts_type_safety_utils_1 = require("@nerdware/ts-type-safety-utils");
/**
* This function creates a recursive value converter that applies the provided `valueConverter`
* to all non-falsy values in the input object or array.
*
* @template AllowedReturnTypes - Union of allowed return types for the `valueConverter` function.
* @param valueConverter - A fn that returns a converted-value OR `undefined` if no conversion was applied.
* @returns A function that recursively applies value-conversion to its `value` parameter.
*/
const getRecursiveValueConverter = (valueConverter) => {
// This function will be called recursively to convert nested values
const recursiveConversionFn = (value) => {
// First, return falsey values as-is
if (!value)
return value;
// Run the value through the provided valueConverter
const convertedValue = valueConverter(value);
if (!(0, ts_type_safety_utils_1.isUndefined)(convertedValue))
return convertedValue;
// Check for types that necessitate recursive calls
if ((0, ts_type_safety_utils_1.isArray)(value))
return value.map(recursiveConversionFn);
if ((0, ts_type_safety_utils_1.isPlainObject)(value)) {
const result = {};
for (const itemKey of Object.keys(value)) {
result[itemKey] = recursiveConversionFn(value[itemKey]);
}
return result;
}
// If none of the above apply, return the value as-is
return value;
};
return recursiveConversionFn;
};
exports.getRecursiveValueConverter = getRecursiveValueConverter;