UNPKG

nexorm

Version:

A powerful TypeScript ORM with advanced features.

881 lines (880 loc) 44.5 kB
"use strict"; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.updateParser = updateParser; const ruleParser_1 = require("./ruleParser"); const lodash_1 = __importDefault(require("lodash")); async function updateParser(sequelizeModel, update, rules, modelName, schema) { var dataValues = sequelizeModel.dataValues; var parsed = parseValue(schema); var operators = Object.keys(update); var parsedUpdate = { ...dataValues }; if (!parsedUpdate) parsedUpdate = {}; for (var op in operators) { var operator = operators[op]; var valuesList = update[operator]; var values = Object.entries(valuesList); for (var [key, valueData] of values) { var value = valueData; /* Global Operations */ if (operator == '$set') { if (String(key).includes('.')) { let oldObject = parsedUpdate[key.split('.')[0]] || {}; let object = lodash_1.default.set(oldObject, key, value); parsedUpdate[key.split('.')[0]] = object[key.split('.')[0]]; } else { parsedUpdate[key] = value; } } ; if (operator == '$unset') { if (String(key).includes('.')) { let oldObject = parsedUpdate[key.split('.')[0]] || {}; let object = lodash_1.default.set(oldObject, key, null); parsedUpdate[key.split('.')[0]] = object[key.split('.')[0]]; } else { parsedUpdate[key] = null; } } ; if (operator == '$clear') { if (String(key).includes('.')) { let oldObject = parsedUpdate[key.split('.')[0]] || {}; let object = lodash_1.default.update(oldObject, key, (value) => { if (String(value).includes('Object')) return {}; if (String(value).includes('Array')) return []; }); parsedUpdate[key.split('.')[0]] = object[key.split('.')[0]]; } else { parsedUpdate[key] = {}; } } ; /* Number Operations */ if (operator == '$inc') { if (String(key).includes('.')) { await (0, ruleParser_1.ruleParser)(key, rules, valueData); lodash_1.default.update(parsedUpdate, key, (upt) => (upt || 0) + valueData); } else { await (0, ruleParser_1.ruleParser)(key, rules, valueData); parsedUpdate[key] = parsedUpdate[key] + value; } } ; if (operator == '$dec') { if (String(key).includes('.')) { await (0, ruleParser_1.ruleParser)(key, rules, valueData); lodash_1.default.update(parsedUpdate, key, (value) => (value || 0) - valueData); } else { await (0, ruleParser_1.ruleParser)(key, rules, valueData); parsedUpdate[key] = parsedUpdate[key] - value; } } ; if (operator == '$mul') { if (String(key).includes('.')) { await (0, ruleParser_1.ruleParser)(key, rules, valueData); lodash_1.default.update(parsedUpdate, key, (value) => value * valueData); } else { await (0, ruleParser_1.ruleParser)(key, rules, valueData); parsedUpdate[key] = parsedUpdate[key] * value; } } ; if (operator == '$div') { if (String(key).includes('.')) { await (0, ruleParser_1.ruleParser)(key, rules, valueData); lodash_1.default.update(parsedUpdate, key, (value) => value / valueData); } else { await (0, ruleParser_1.ruleParser)(key, rules, valueData); parsedUpdate[key] = parsedUpdate[key] / value; } } ; if (operator == '$min') { if (String(key).includes('.')) { await (0, ruleParser_1.ruleParser)(key, rules, valueData); lodash_1.default.update(parsedUpdate, key, (value) => Math.min(value, valueData)); } else { await (0, ruleParser_1.ruleParser)(key, rules, valueData); parsedUpdate[key] = Math.min(parsedUpdate[key], value); } } ; if (operator == '$max') { if (String(key).includes('.')) { await (0, ruleParser_1.ruleParser)(key, rules, valueData); lodash_1.default.update(parsedUpdate, key, (value) => Math.max(value, valueData)); } else { await (0, ruleParser_1.ruleParser)(key, rules, valueData); parsedUpdate[key] = Math.max(parsedUpdate[key], value); } } ; if (operator == '$sqrt') { if (String(key).includes('.')) { await (0, ruleParser_1.ruleParser)(key, rules, valueData); lodash_1.default.update(parsedUpdate, key, (value) => Math.sqrt(value)); } else { await (0, ruleParser_1.ruleParser)(key, rules, valueData); parsedUpdate[key] = Math.sqrt(parsedUpdate[key]); } } ; if (operator == '$floor') { if (String(key).includes('.')) { await (0, ruleParser_1.ruleParser)(key, rules, valueData); lodash_1.default.update(parsedUpdate, key, (value) => Math.floor(value)); } else { await (0, ruleParser_1.ruleParser)(key, rules, valueData); parsedUpdate[key] = Math.floor(parsedUpdate[key]); } } ; if (operator == '$random') { if (String(key).includes('.')) { await (0, ruleParser_1.ruleParser)(key, rules, valueData); lodash_1.default.update(parsedUpdate, key, (value) => Math.random()); } else { await (0, ruleParser_1.ruleParser)(key, rules, valueData); parsedUpdate[key] = Math.random(); } } ; if (operator == '$abs') { if (String(key).includes('.')) { await (0, ruleParser_1.ruleParser)(key, rules, valueData); lodash_1.default.update(parsedUpdate, key, (value) => Math.abs(value)); } else { await (0, ruleParser_1.ruleParser)(key, rules, valueData); parsedUpdate[key] = Math.abs(parsedUpdate[key]); } } ; if (operator == '$ceil') { if (String(key).includes('.')) { await (0, ruleParser_1.ruleParser)(key, rules, valueData); lodash_1.default.update(parsedUpdate, key, (value) => Math.ceil(value)); } else { await (0, ruleParser_1.ruleParser)(key, rules, valueData); parsedUpdate[key] = Math.ceil(parsedUpdate[key]); } } ; if (operator == '$pow') { if (String(key).includes('.')) { await (0, ruleParser_1.ruleParser)(key, rules, valueData); lodash_1.default.update(parsedUpdate, key, (value) => Math.pow(value, valueData)); } else { await (0, ruleParser_1.ruleParser)(key, rules, valueData); parsedUpdate[key] = Math.pow(parsedUpdate[key], value); } } ; if (operator == '$toFixed') { if (String(key).includes('.')) { await (0, ruleParser_1.ruleParser)(key, rules, valueData); lodash_1.default.update(parsedUpdate, key, (value) => { if (typeof value !== 'number') throw new Error('$toFixed can only be used with numbers'); if (typeof valueData !== 'number') throw new Error('$toFixed can only be used with number values'); return value.toFixed(valueData); }); } else { await (0, ruleParser_1.ruleParser)(key, rules, valueData); if (typeof parsedUpdate[key] !== 'number') throw new Error('$toFixed can only be used with numbers'); if (typeof value !== 'number') throw new Error('$toFixed can only be used with number values'); parsedUpdate[key] = parsedUpdate[key].toFixed(value); } } ; if (operator == '$toExponential') { if (String(key).includes('.')) { await (0, ruleParser_1.ruleParser)(key, rules, valueData); lodash_1.default.update(parsedUpdate, key, (value) => { if (typeof value !== 'number') throw new Error('$toExponential can only be used with numbers'); if (typeof valueData !== 'number') throw new Error('$toExponential can only be used with number values'); return value.toExponential(valueData); }); } else { await (0, ruleParser_1.ruleParser)(key, rules, valueData); if (typeof parsedUpdate[key] !== 'number') throw new Error('$toExponential can only be used with numbers'); if (typeof value !== 'number') throw new Error('$toExponential can only be used with number values'); parsedUpdate[key] = parsedUpdate[key].toExponential(value); } } ; if (operator == '$toPrecision') { if (String(key).includes('.')) { await (0, ruleParser_1.ruleParser)(key, rules, valueData); lodash_1.default.update(parsedUpdate, key, (value) => { if (typeof value !== 'number') throw new Error('$toPrecision can only be used with numbers'); if (typeof valueData !== 'number') throw new Error('$toPrecision can only be used with number values'); return value.toPrecision(valueData); }); } else { await (0, ruleParser_1.ruleParser)(key, rules, valueData); if (typeof parsedUpdate[key] !== 'number') throw new Error('$toPrecision can only be used with numbers'); if (typeof value !== 'number') throw new Error('$toPrecision can only be used with number values'); parsedUpdate[key] = parsedUpdate[key].toPrecision(value); } } ; if (operator == '$round') { if (String(key).includes('.')) { await (0, ruleParser_1.ruleParser)(key, rules, valueData); lodash_1.default.update(parsedUpdate, key, (value) => Math.round(value)); } else { await (0, ruleParser_1.ruleParser)(key, rules, valueData); parsedUpdate[key] = Math.round(parsedUpdate[key]); } } ; if (operator == '$trunc') { if (String(key).includes('.')) { await (0, ruleParser_1.ruleParser)(key, rules, valueData); lodash_1.default.update(parsedUpdate, key, (value) => Math.trunc(value)); } else { await (0, ruleParser_1.ruleParser)(key, rules, valueData); parsedUpdate[key] = Math.trunc(parsedUpdate[key]); } } ; if (operator == '$mod') { if (String(key).includes('.')) { await (0, ruleParser_1.ruleParser)(key, rules, valueData); lodash_1.default.update(parsedUpdate, key, (value) => value % valueData); } else { await (0, ruleParser_1.ruleParser)(key, rules, valueData); parsedUpdate[key] = parsedUpdate[key] % value; } } ; /* Boolean Operations */ if (operator == '$toggle') { if (String(key).includes('.')) { await (0, ruleParser_1.ruleParser)(key, rules, valueData); let oldObject = parsedUpdate[key.split('.')[0]] || {}; if (!oldObject[key]) oldObject[key] = false; let object = lodash_1.default.update(oldObject, key, (value) => !value); parsedUpdate[key.split('.')[0]] = object[key.split('.')[0]]; } else { await (0, ruleParser_1.ruleParser)(key, rules, valueData); parsedUpdate[key] = !parsedUpdate[key]; } } ; /* String Operations */ if (operator == '$append') { if (String(key).includes('.')) { await (0, ruleParser_1.ruleParser)(key, rules, valueData); let oldObject = parsedUpdate[key.split('.')[0]] || {}; let object = lodash_1.default.update(oldObject, key, (value) => { var newValue = (value || '') + valueData; return newValue; }); parsedUpdate[key.split('.')[0]] = object[key.split('.')[0]]; } else { await (0, ruleParser_1.ruleParser)(key, rules, valueData); var newValue = (parsedUpdate[key] || '') + value; parsedUpdate[key] = newValue; } } ; if (operator == '$prepend') { if (String(key).includes('.')) { await (0, ruleParser_1.ruleParser)(key, rules, valueData); let oldObject = parsedUpdate[key.split('.')[0]] || {}; let object = lodash_1.default.update(oldObject, key, (value) => { var newValue = valueData + (value || ''); return newValue; }); parsedUpdate[key.split('.')[0]] = object[key.split('.')[0]]; } else { await (0, ruleParser_1.ruleParser)(key, rules, valueData); var newValue = value + (parsedUpdate[key] || ''); parsedUpdate[key] = newValue; } } ; if (operator == '$replace') { if (String(key).includes('.')) { await (0, ruleParser_1.ruleParser)(key, rules, valueData); var searchValue = value?.$searchValue; var replaceValue = value?.$replaceValue; if (!searchValue || !replaceValue) throw new Error('You must provide $searchValue and $replaceValue'); if (typeof searchValue !== 'string' || typeof replaceValue !== 'string') throw new Error('$searchValue and $replaceValue must be strings'); let oldObject = parsedUpdate[key.split('.')[0]] || {}; let object = lodash_1.default.set(oldObject, key, String(parsedUpdate[key] || '').replace(searchValue, replaceValue)); parsedUpdate[key.split('.')[0]] = object[key.split('.')[0]]; } else { await (0, ruleParser_1.ruleParser)(key, rules, valueData); var searchValue = value?.$searchValue; var replaceValue = value?.$replaceValue; if (!searchValue || !replaceValue) throw new Error('You must provide $searchValue and $replaceValue'); if (typeof searchValue !== 'string' || typeof replaceValue !== 'string') throw new Error('$searchValue and $replaceValue must be strings'); parsedUpdate[key] = (parsedUpdate[key] || '').replace(value.$searchValue, value.$replaceValue); } } ; if (operator == '$trim') { if (String(key).includes('.')) { await (0, ruleParser_1.ruleParser)(key, rules, valueData); let oldObject = parsedUpdate[key.split('.')[0]] || {}; let object = lodash_1.default.set(oldObject, key, (parsedUpdate[key] || '').trim()); parsedUpdate[key.split('.')[0]] = object[key.split('.')[0]]; } else { await (0, ruleParser_1.ruleParser)(key, rules, valueData); parsedUpdate[key] = (parsedUpdate[key] || '').trim(); } } ; if (operator == '$substr') { if (String(key).includes('.')) { await (0, ruleParser_1.ruleParser)(key, rules, valueData); let oldObject = parsedUpdate[key.split('.')[0]] || {}; let object = lodash_1.default.set(oldObject, key, (parsedUpdate[key] || '')?.substr(valueData)); parsedUpdate[key.split('.')[0]] = object[key.split('.')[0]]; } else { await (0, ruleParser_1.ruleParser)(key, rules, valueData); parsedUpdate[key] = (parsedUpdate[key] || '').substr(value); } } ; if (operator == '$capitalize') { if (String(key).includes('.')) { await (0, ruleParser_1.ruleParser)(key, rules, valueData); let oldObject = parsedUpdate[key.split('.')[0]] || {}; let object = lodash_1.default.set(oldObject, key, (parsedUpdate[key] || '').charAt(0).toUpperCase() + (parsedUpdate[key] || '').slice(1)); parsedUpdate[key.split('.')[0]] = object[key.split('.')[0]]; } else { await (0, ruleParser_1.ruleParser)(key, rules, valueData); parsedUpdate[key] = (parsedUpdate[key] || '').charAt(0).toUpperCase() + (parsedUpdate[key] || '').slice(1); } } ; if (operator == '$reverse') { if (String(key).includes('.')) { await (0, ruleParser_1.ruleParser)(key, rules, valueData); let oldObject = parsedUpdate[key.split('.')[0]] || {}; let object = lodash_1.default.set(oldObject, key, (parsedUpdate[key] || '').split('').reverse().join('')); parsedUpdate[key.split('.')[0]] = object[key.split('.')[0]]; } else { await (0, ruleParser_1.ruleParser)(key, rules, valueData); parsedUpdate[key] = (parsedUpdate[key] || '').split('').reverse().join(''); } } ; if (operator == '$slice') { if (String(key).includes('.')) { await (0, ruleParser_1.ruleParser)(key, rules, valueData); let oldObject = parsedUpdate[key.split('.')[0]] || {}; var $begin = value.$begin; var $end = value.$end; if (typeof $begin !== 'number' || typeof $end !== 'number') throw new Error('$begin and $end must be numbers'); let object = lodash_1.default.set(oldObject, key, (parsedUpdate[key] || '').slice(valueData)); parsedUpdate[key.split('.')[0]] = object[key.split('.')[0]]; } else { await (0, ruleParser_1.ruleParser)(key, rules, valueData); var $begin = value.$begin; var $end = value.$end; if (typeof $begin !== 'number' || typeof $end !== 'number') throw new Error('$begin and $end must be numbers'); if ($begin && $end && $begin > $end) throw new Error('$begin must be less than $end'); if ($end && $end > (parsedUpdate[key] || '').length) $end = (parsedUpdate[key] || '').length; if (!$begin) $begin = 0; if (!$end) $end = (parsedUpdate[key] || '').length; parsedUpdate[key] = (parsedUpdate[key] || '').slice($begin, $end); } } ; if (operator == '$lowercase') { if (String(key).includes('.')) { await (0, ruleParser_1.ruleParser)(key, rules, valueData); let oldObject = parsedUpdate[key.split('.')[0]] || {}; let object = lodash_1.default.set(oldObject, key, (parsedUpdate[key] || '').toLowerCase()); parsedUpdate[key.split('.')[0]] = object[key.split('.')[0]]; } else { await (0, ruleParser_1.ruleParser)(key, rules, valueData); parsedUpdate[key] = (parsedUpdate[key] || '').toLowerCase(); } } ; if (operator == '$uppercase') { if (String(key).includes('.')) { await (0, ruleParser_1.ruleParser)(key, rules, valueData); let oldObject = parsedUpdate[key.split('.')[0]] || {}; let object = lodash_1.default.set(oldObject, key, (parsedUpdate[key] || '').toUpperCase()); parsedUpdate[key.split('.')[0]] = object[key.split('.')[0]]; } else { await (0, ruleParser_1.ruleParser)(key, rules, valueData); parsedUpdate[key] = (parsedUpdate[key] || '').toUpperCase(); } } ; if (operator == '$camelcase') { if (String(key).includes('.')) { await (0, ruleParser_1.ruleParser)(key, rules, valueData); let oldObject = parsedUpdate[key.split('.')[0]] || {}; let object = lodash_1.default.set(oldObject, key, lodash_1.default.camelCase((parsedUpdate[key] || ''))); parsedUpdate[key.split('.')[0]] = object[key.split('.')[0]]; } else { await (0, ruleParser_1.ruleParser)(key, rules, valueData); parsedUpdate[key] = lodash_1.default.camelCase((parsedUpdate[key] || '')); } } ; if (operator == '$kebabcase') { if (String(key).includes('.')) { await (0, ruleParser_1.ruleParser)(key, rules, valueData); let oldObject = parsedUpdate[key.split('.')[0]] || {}; let object = lodash_1.default.set(oldObject, key, lodash_1.default.kebabCase((parsedUpdate[key] || ''))); parsedUpdate[key.split('.')[0]] = object[key.split('.')[0]]; } else { await (0, ruleParser_1.ruleParser)(key, rules, valueData); parsedUpdate[key] = lodash_1.default.kebabCase((parsedUpdate[key] || '')); } } ; if (operator == '$snakecase') { if (String(key).includes('.')) { await (0, ruleParser_1.ruleParser)(key, rules, valueData); let oldObject = parsedUpdate[key.split('.')[0]] || {}; let object = lodash_1.default.set(oldObject, key, lodash_1.default.snakeCase((parsedUpdate[key] || ''))); parsedUpdate[key.split('.')[0]] = object[key.split('.')[0]]; } else { await (0, ruleParser_1.ruleParser)(key, rules, valueData); parsedUpdate[key] = lodash_1.default.snakeCase((parsedUpdate[key] || '')); } } ; if (operator == '$titlecase') { if (String(key).includes('.')) { await (0, ruleParser_1.ruleParser)(key, rules, valueData); let oldObject = parsedUpdate[key.split('.')[0]] || {}; let object = lodash_1.default.set(oldObject, key, lodash_1.default.startCase((parsedUpdate[key] || ''))); parsedUpdate[key.split('.')[0]] = object[key.split('.')[0]]; } else { await (0, ruleParser_1.ruleParser)(key, rules, valueData); parsedUpdate[key] = lodash_1.default.startCase((parsedUpdate[key] || '')); } } ; /* Object Operations */ if (operator == '$omit') { if (String(key).includes('.')) { await (0, ruleParser_1.ruleParser)(key, rules, valueData); let oldObject = parsedUpdate[key.split('.')[0]] || {}; let object = lodash_1.default.omit(oldObject, value); parsedUpdate[key.split('.')[0]] = object; } else { await (0, ruleParser_1.ruleParser)(key, rules, valueData); parsedUpdate[key] = lodash_1.default.omit(parsedUpdate[key], value); } } ; if (operator == '$merge') { if (String(key).includes('.')) { await (0, ruleParser_1.ruleParser)(key, rules, valueData); let oldObject = parsedUpdate[key.split('.')[0]] || {}; let object = lodash_1.default.merge(oldObject, value); parsedUpdate[key.split('.')[0]] = object; } else { await (0, ruleParser_1.ruleParser)(key, rules, valueData); parsedUpdate[key] = lodash_1.default.merge(parsedUpdate[key], value); } } ; if (operator == '$mapKeys') { if (String(key).includes('.')) { await (0, ruleParser_1.ruleParser)(key, rules, valueData); let oldObject = parsedUpdate[key.split('.')[0]] || {}; let object = lodash_1.default.mapKeys(oldObject, value); parsedUpdate[key.split('.')[0]] = object; } else { await (0, ruleParser_1.ruleParser)(key, rules, valueData); parsedUpdate[key] = lodash_1.default.mapKeys(parsedUpdate[key], value); } } ; if (operator == '$mapValues') { if (String(key).includes('.')) { await (0, ruleParser_1.ruleParser)(key, rules, valueData); let oldObject = parsedUpdate[key.split('.')[0]] || {}; let object = lodash_1.default.mapValues(oldObject, value); parsedUpdate[key.split('.')[0]] = object; } else { await (0, ruleParser_1.ruleParser)(key, rules, valueData); parsedUpdate[key] = lodash_1.default.mapValues(parsedUpdate[key], value); } } ; if (operator == '$invert') { if (String(key).includes('.')) { await (0, ruleParser_1.ruleParser)(key, rules, valueData); let oldObject = parsedUpdate[key.split('.')[0]] || {}; let object = lodash_1.default.invert(oldObject); parsedUpdate[key.split('.')[0]] = object; } else { await (0, ruleParser_1.ruleParser)(key, rules, valueData); parsedUpdate[key] = lodash_1.default.invert(parsedUpdate[key]); } } ; /* Array Operations */ if (operator == '$push') { if (String(key).includes('.')) { await (0, ruleParser_1.ruleParser)(key, rules, valueData); if (value?.hasOwnProperty('$each')) { let oldObject = parsedUpdate[key.split('.')[0]] || {}; var getArrayFromObject = lodash_1.default.get(oldObject, key); if (!lodash_1.default.isArray(getArrayFromObject)) getArrayFromObject = []; var newArray = [...getArrayFromObject]; if (value?.hasOwnProperty('$sort')) { value.$each = value?.$each?.sort((a, b) => value?.$sort == 1 || value?.$sort == true ? a - b : b - a); } ; if (value?.hasOwnProperty('$position')) { let oldObject = parsedUpdate[key.split('.')[0]] || {}; let object = lodash_1.default.update(oldObject, key, (value) => { let position = valueData.$position; newArray.splice(position, 0, ...valueData?.$each); return newArray; }); parsedUpdate[key.split('.')[0]] = object[key.split('.')[0]]; } else { let oldObject = parsedUpdate[key.split('.')[0]] || {}; let object = lodash_1.default.update(oldObject, key, (value) => { if (!value || !lodash_1.default.isArray(value)) value = []; let newArray = value?.concat(valueData.$each); return newArray; }); parsedUpdate[key.split('.')[0]] = object[key.split('.')[0]]; } } else { let oldObject = parsedUpdate[key.split('.')[0]] || {}; let object = lodash_1.default.update(oldObject, key, (value) => { if (!lodash_1.default.isArray(value)) value = []; value.push(valueData); return value; }); parsedUpdate[key.split('.')[0]] = object[key.split('.')[0]]; } } else { await (0, ruleParser_1.ruleParser)(key, rules, valueData); if (value?.hasOwnProperty('$each')) { var newArray = [...(parsedUpdate[key] || [])]; if (value?.hasOwnProperty('$sort')) { value.$each = value?.$each?.sort((a, b) => value?.$sort == 1 || value?.$sort == true ? a - b : b - a); } ; if (value?.hasOwnProperty('$position')) { let position = valueData.$position; newArray.splice(position, 0, ...valueData?.$each); } else { newArray = newArray.concat(value['$each']); } parsedUpdate[key] = newArray; } else { var newArray = [...(parsedUpdate[key] || [])]; newArray.push(value); parsedUpdate[key] = newArray; } } } ; if (operator == '$pop') { if (String(key).includes('.')) { await (0, ruleParser_1.ruleParser)(key, rules, valueData); let oldObject = parsedUpdate[key.split('.')[0]] || {}; let object = lodash_1.default.update(oldObject, key, (value) => { if (!value || !lodash_1.default.isArray(value)) value = []; if (valueData == 1) return value.pop(); if (valueData == -1) return value.shift(); }); parsedUpdate[key.split('.')[0]] = object[key.split('.')[0]]; } else { await (0, ruleParser_1.ruleParser)(key, rules, valueData); if (value == 1) parsedUpdate[key] = parsedUpdate[key].pop(); if (value == -1) parsedUpdate[key] = parsedUpdate[key].shift(); } } ; if (operator == '$pull') { if (String(key).includes('.')) { await (0, ruleParser_1.ruleParser)(key, rules, valueData); let oldObject = parsedUpdate[key.split('.')[0]] || {}; let object = lodash_1.default.update(oldObject, key, (values) => { if (value.hasOwnProperty('$in')) { return values?.filter((val) => !value.$in.includes(val)); } else if (value.hasOwnProperty('$nin')) { return values?.filter((val) => value.$nin.includes(val)); } else if (value.hasOwnProperty('$position')) { return values?.filter((val, index) => index !== value.$position); } if (value.hasOwnProperty('$eq')) { return values?.filter((val) => val !== value.$eq); } else if (value.hasOwnProperty('$ne')) { return values?.filter((val) => val === value.$ne); } else if (value.hasOwnProperty('$lt')) { return values?.filter((val) => val >= value.$lt); } else if (value.hasOwnProperty('$gt')) { return values?.filter((val) => val <= value.$gt); } else if (value.hasOwnProperty('$lte')) { return values?.filter((val) => val > value.$lte); } else if (value.hasOwnProperty('$gte')) { return values?.filter((val) => val < value.$gte); } else { return values?.filter((val) => val !== value); } }); parsedUpdate[key.split('.')[0]] = object[key.split('.')[0]]; } else { await (0, ruleParser_1.ruleParser)(key, rules, valueData); if (value.hasOwnProperty('$in')) { parsedUpdate[key] = parsedUpdate[key]?.filter((val) => !value.$in.includes(val)); } else if (value.hasOwnProperty('$nin')) { parsedUpdate[key] = parsedUpdate[key]?.filter((val) => value.$nin.includes(val)); } else if (value.hasOwnProperty('$position')) { parsedUpdate[key] = parsedUpdate[key]?.filter((val, index) => index !== value.$position); } ; if (value.hasOwnProperty('$eq')) { parsedUpdate[key] = parsedUpdate[key]?.filter((val) => val !== value.$eq); } else if (value.hasOwnProperty('$ne')) { parsedUpdate[key] = parsedUpdate[key]?.filter((val) => val === value.$ne); } else if (value.hasOwnProperty('$lt')) { parsedUpdate[key] = parsedUpdate[key]?.filter((val) => val >= value.$lt); } else if (value.hasOwnProperty('$gt')) { parsedUpdate[key] = parsedUpdate[key]?.filter((val) => val <= value.$gt); } else if (value.hasOwnProperty('$lte')) { parsedUpdate[key] = parsedUpdate[key]?.filter((val) => val > value.$lte); } else if (value.hasOwnProperty('$gte')) { parsedUpdate[key] = parsedUpdate[key]?.filter((val) => val < value.$gte); } else { parsedUpdate[key] = parsedUpdate[key]?.filter((val) => val !== value); } } } ; if (operator === '$addToSet') { if (String(key).includes('.')) { await (0, ruleParser_1.ruleParser)(key, rules, valueData); let oldObject = parsedUpdate[key.split('.')[0]]; let object = lodash_1.default.update(oldObject, key, (values) => { if (value.hasOwnProperty('$each')) { if (!lodash_1.default.isArray(values)) values = []; return lodash_1.default.uniq([...values, ...value?.$each]); } else { if (!lodash_1.default.isArray(values)) values = []; return lodash_1.default.uniq([...values, value]); } }); parsedUpdate[key.split('.')[0]] = object[key.split('.')[0]]; } else { await (0, ruleParser_1.ruleParser)(key, rules, valueData); if (value.hasOwnProperty('$each')) { if (!lodash_1.default.isArray(parsedUpdate[key])) parsedUpdate[key] = []; parsedUpdate[key] = lodash_1.default.uniq([...parsedUpdate[key], ...value.$each]); } else { if (!lodash_1.default.isArray(parsedUpdate[key])) parsedUpdate[key] = []; parsedUpdate[key] = lodash_1.default.uniq([...parsedUpdate[key], value]); } } } if (operator === '$sliceArray') { if (String(key).includes('.')) { await (0, ruleParser_1.ruleParser)(key, rules, valueData); let oldObject = parsedUpdate[key.split('.')[0]]; let object = lodash_1.default.update(oldObject, key, (values) => { var $begin = value.$begin; var $end = value.$end; if (typeof $begin !== 'number' || typeof $end !== 'number') throw new Error('$begin and $end must be numbers'); if ($begin > $end) throw new Error('$begin must be less than $end'); if ($begin < 0) $begin = 0; if ($end > values.length) $end = values.length; if (!lodash_1.default.isArray(values)) values = []; return values.slice($begin, $end); }); parsedUpdate[key.split('.')[0]] = object[key.split('.')[0]]; } else { await (0, ruleParser_1.ruleParser)(key, rules, valueData); var $begin = value.$begin; var $end = value.$end; if (typeof $begin !== 'number' || typeof $end !== 'number') throw new Error('$begin and $end must be numbers'); if ($begin > $end) throw new Error('$begin must be less than $end'); if ($begin < 0) $begin = 0; if ($end > parsedUpdate[key]?.length) $end = parsedUpdate[key].length; if (!lodash_1.default.isArray(parsedUpdate[key])) parsedUpdate[key] = []; parsedUpdate[key] = parsedUpdate[key].slice($begin, $end); } } if (operator === '$concat') { if (String(key).includes('.')) { await (0, ruleParser_1.ruleParser)(key, rules, valueData); let oldObject = parsedUpdate[key.split('.')[0]]; let object = lodash_1.default.update(oldObject, key, (values) => { if (!lodash_1.default.isArray(values)) values = []; if (!lodash_1.default.isArray(value)) throw new Error('$concat value must be an array'); return values.concat(value); }); parsedUpdate[key.split('.')[0]] = object[key.split('.')[0]]; } else { await (0, ruleParser_1.ruleParser)(key, rules, valueData); if (!lodash_1.default.isArray(parsedUpdate[key])) parsedUpdate[key] = []; if (!lodash_1.default.isArray(value)) throw new Error('$concat value must be an array'); parsedUpdate[key] = parsedUpdate[key].concat(value); } } } ; } ; return parsedUpdate; } ; function parseValue(Class) { var parsedValue = {}; Object.keys(Class).forEach((key) => { var value = Class[key]; if (String(value).includes('String')) parsedValue[key] = 'string'; if (String(value).includes('Number')) parsedValue[key] = 'number'; if (String(value).includes('Boolean')) parsedValue[key] = 'boolean'; if (String(value).includes('Date')) parsedValue[key] = 'date'; if (String(value).includes('Array') || lodash_1.default.isArray(value)) parsedValue[key] = 'array'; if (String(value).includes('Object')) parsedValue[key] = 'object'; }); return parsedValue; } ;