Skip to content

Commit a54f039

Browse files
committed
fix: createUpdate added to utils to be accessible by other modues
1 parent e7c999c commit a54f039

File tree

1 file changed

+130
-0
lines changed

1 file changed

+130
-0
lines changed

src/index.js

Lines changed: 130 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -172,6 +172,134 @@
172172
}
173173
}
174174

175+
function createUpdate(update, data, globalOpertors) {
176+
let operatorKeys = {}
177+
if (globalOpertors)
178+
operatorKeys = { ...globalOpertors }
179+
180+
Object.keys(data).forEach(key => {
181+
if (key.startsWith('$')) {
182+
if (!key.includes('.'))
183+
for (let oldkey of Object.keys(data[key]))
184+
operatorKeys[key + '.' + oldkey] = data[key][oldkey]
185+
else
186+
operatorKeys[key] = data[key]
187+
} else if (typeof data[key] === 'string' && data[key].startsWith('$')) {
188+
operatorKeys[data[key] + '.' + key] = data[key]
189+
} else if (key.endsWith(']')) {
190+
const regex = /^(.*(?:\[\d+\].*?)?)\[(.*?)\](?:\[\])?$/;
191+
const match = key.match(regex);
192+
if (match[2] === '')
193+
operatorKeys['$push.' + match[1]] = data[key]
194+
else {
195+
let index = parseInt(match[2], 10);
196+
if (index === NaN)
197+
operatorKeys[match[2] + '.' + match[1]] = data[key]
198+
else
199+
operatorKeys[key] = data[key]
200+
}
201+
} else if (key.includes('.')) {
202+
operatorKeys[key] = data[key]
203+
} else if (data[key] === undefined) {
204+
delete update[key]
205+
} else
206+
update[key] = data[key]
207+
208+
})
209+
210+
return dotNotationToObjectUpdate(operatorKeys, update)
211+
}
212+
213+
function dotNotationToObjectUpdate(data, object = {}) {
214+
try {
215+
for (const key of Object.keys(data)) {
216+
let newObject = object
217+
let oldObject = new Object(newObject)
218+
let keys = key.replace(/\[(\d+)\]/g, '.$1').split('.');
219+
let value = data[key]
220+
let operator
221+
if (keys[0].startsWith('$'))
222+
operator = keys.shift()
223+
224+
let length = keys.length - 1
225+
for (let i = 0; i < keys.length; i++) {
226+
if (/^\d+$/.test(keys[i]))
227+
keys[i] = parseInt(keys[i]);
228+
229+
if (length == i) {
230+
if (operator) {
231+
let operators = ['$rename', '$inc', '$push', '$each', '$splice', '$unset', '$delete', '$slice', '$pop', '$shift', '$addToSet', '$pull']
232+
if (!operators.includes(operator))
233+
continue
234+
if (operator === '$rename') {
235+
newObject[value] = newObject[keys[i]]
236+
delete newObject[keys[i]]
237+
} else if (operator === '$delete' || operator === '$unset' || operator === '$slice') {
238+
if (typeof keys[i] === 'number')
239+
newObject.slice(keys[i], 1);
240+
else
241+
delete newObject[keys[i]]
242+
} else if (operator === '$shift') {
243+
newObject[keys[i]].shift();
244+
} else if (operator === '$pop') {
245+
newObject[keys[i]].pop();
246+
} else if (operator === '$addToSet') {
247+
let exists
248+
if (Array.isArray(value)) {
249+
exists = newObject[keys[i]].some(item => Array.isArray(item) && isEqualArray(item, value));
250+
} else if (typeof value === 'object' && value !== null) {
251+
exists = newObject[keys[i]].some(item => typeof item === 'object' && isEqualObject(item, value));
252+
} else {
253+
exists = newObject[keys[i]].includes(value);
254+
}
255+
if (!exists)
256+
newObject[keys[i]].push(value)
257+
} else if (operator === '$pull') {
258+
if (Array.isArray(value)) {
259+
newObject[keys[i]] = newObject[keys[i]].filter(item => !Array.isArray(item) || !isEqualArray(item, value));
260+
} else if (typeof value === 'object' && value !== null) {
261+
newObject[keys[i]] = newObject[keys[i]].filter(item => typeof item !== 'object' || !isEqualObject(item, value));
262+
} else {
263+
newObject[keys[i]] = newObject[keys[i]].filter(item => item !== value);
264+
}
265+
} else if (operator === '$push' || operator === '$splice') {
266+
if (typeof keys[i] === 'number' && newObject.length >= keys[i])
267+
newObject.splice(keys[i], 0, value);
268+
else if (newObject[keys[i]])
269+
newObject[keys[i]].push(value);
270+
else
271+
newObject[keys[i]] = [value];
272+
} else if (operator === '$each') {
273+
if (!Array.isArray(value))
274+
value = [value]
275+
if (typeof keys[i] === 'number')
276+
newObject.splice(keys[i], 0, ...value);
277+
else
278+
newObject[keys[i]].push(...value);
279+
} else if (operator === '$inc') {
280+
newObject[keys[i]] += value
281+
}
282+
} else if (value === undefined) {
283+
if (typeof keys[i] === 'number')
284+
newObject.slice(keys[i], 1);
285+
else
286+
delete newObject[keys[i]]
287+
} else
288+
newObject[keys[i]] = value;
289+
} else {
290+
newObject[keys[i]] = oldObject[keys[i]] || {};
291+
newObject = newObject[keys[i]]
292+
oldObject = oldObject[keys[i]]
293+
}
294+
}
295+
}
296+
return object
297+
} catch (error) {
298+
console.log("Error converting dot notation to object", error);
299+
return false;
300+
}
301+
}
302+
175303
function domParser(str) {
176304
try {
177305
var mainTag = str.match(/\<(?<tag>[a-z0-9]+)(.*?)?\>/).groups.tag;
@@ -708,6 +836,7 @@
708836
});
709837
}
710838

839+
711840
function getAttributes(el) {
712841
if (!el) return;
713842

@@ -776,6 +905,7 @@
776905
queryData,
777906
searchData,
778907
sortData,
908+
createUpdate,
779909
getAttributes,
780910
setAttributeNames,
781911
getAttributeNames

0 commit comments

Comments
 (0)