UNPKG

nhb-toolbox

Version:

A versatile collection of smart, efficient, and reusable utility functions, classes and types for everyday development needs.

163 lines (162 loc) 5.94 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.sanitizeData = sanitizeData; exports.parseObjectValues = parseObjectValues; const guards_1 = require("../date/guards"); const guards_2 = require("../form/guards"); const non_primitives_1 = require("../guards/non-primitives"); const primitives_1 = require("../guards/primitives"); const basics_1 = require("../string/basics"); function sanitizeData(input, options, _return) { const { keysToIgnore = [], requiredKeys = [], trimStrings = true, ignoreNullish = false, ignoreFalsy = false, ignoreEmpty = false, } = options || {}; const ignoreKeySet = new Set(keysToIgnore); const _isRequiredKey = (key) => { return Array.isArray(requiredKeys) ? requiredKeys?.some((path) => key === path || key.startsWith(`${path}.`)) : requiredKeys === '*'; }; const _skipObject = (obj) => { return ignoreEmpty && (0, non_primitives_1.isObject)(obj) && !(0, non_primitives_1.isNotEmptyObject)(obj); }; const _shouldNotProcess = (value) => { return ((0, guards_2.isCustomFile)(value) || (0, guards_2.isFileList)(value) || (0, guards_2.isFileOrBlob)(value) || (0, guards_2.isFileUpload)(value) || (0, guards_1.isDateLike)(value)); }; const _processArray = (arr, path) => { return arr ?.map((item) => { if ((0, primitives_1.isString)(item) && trimStrings) { return (0, basics_1.trimString)(item); } if (Array.isArray(item)) { return _processArray(item, path); } if ((0, non_primitives_1.isObject)(item)) { return _processObject(item, path); } return item; }) ?.filter((v) => { if (ignoreNullish && v == null) return false; if (ignoreFalsy && !v) return false; if (_skipObject(v) && !_isRequiredKey(path)) return false; return true; }); }; const _processObject = (object, parentPath = '') => Object.entries(object).reduce((acc, [key, value]) => { const fullKeyPath = parentPath ? `${parentPath}.${key}` : key; if (ignoreKeySet.has(fullKeyPath)) { return acc; } if (ignoreNullish && !_isRequiredKey(fullKeyPath) && value == null) { return acc; } if (ignoreFalsy && !value && !_isRequiredKey(fullKeyPath)) { return acc; } if ((0, primitives_1.isString)(value) && trimStrings) { acc[key] = (0, basics_1.trimString)(value); } else if (_shouldNotProcess(value)) { acc[key] = value; } else if (value && (0, non_primitives_1.isObject)(value)) { if (_shouldNotProcess(value)) { acc[key] = value; } else { const processedValue = _processObject(value, fullKeyPath); if (!ignoreEmpty || _isRequiredKey(fullKeyPath) || (0, non_primitives_1.isNotEmptyObject)(processedValue)) { acc[key] = processedValue; } } } else if (value && Array.isArray(value)) { const processedArray = _processArray(value, fullKeyPath); if (!ignoreEmpty || _isRequiredKey(fullKeyPath) || processedArray?.length > 0) { acc[key] = processedArray; } } else { acc[key] = value; } return acc; }, {}); if ((0, primitives_1.isString)(input)) { return (0, basics_1.trimString)(input); } if (Array.isArray(input)) { if ((0, non_primitives_1.isArrayOfType)(input, primitives_1.isString)) { return (0, basics_1.trimString)(input); } return input ?.map((item) => sanitizeData(item, options, _return)) ?.filter((val) => { if (ignoreNullish && val == null) return false; if (ignoreFalsy && !val) return false; if (_skipObject(val)) return false; return true; }); } if ((0, non_primitives_1.isObject)(input)) { return _processObject(input); } return input; } function parseObjectValues(object, parseNested = true) { function _deepParseValues(data) { if (Array.isArray(data)) { return data?.map(_deepParseValues); } else if ((0, non_primitives_1.isNotEmptyObject)(data)) { const result = {}; for (const [key, value] of Object.entries(data)) { result[key] = parseNested ? _deepParseValues(value) : value; } return result; } else if ((0, primitives_1.isString)(data)) { try { const parsed = JSON.parse(data); return _deepParseValues(parsed); } catch { if (data === 'true') return true; else if (data === 'false') { return false; } else if (data === 'null') { return null; } else if (data === 'undefined') { return undefined; } else if (!Number.isNaN(Number(data))) { return Number(data); } else return data; } } return data; } const parsedBody = {}; if ((0, non_primitives_1.isNotEmptyObject)(object)) { Object.entries(object)?.forEach(([key, value]) => { parsedBody[key] = _deepParseValues(value); }); } return parsedBody; }