"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
const type_1 = require("../utils/type");
const datatype_1 = require("./datatype");
function flatten(query, shouldPreserverObject, parents, visited) {
const cloned = Object.assign({}, query);
for (const key in query) {
if (/^\$/.test(key))
continue;
const value = query[key];
Iif (!value)
continue;
if (type_1.isObject(value) && !shouldPreserverObject(value)) {
Iif (visited.indexOf(value) > -1) {
throw new Error(`Cannot convert circular structure to JSON`);
}
const newParents = [
...parents,
key,
];
const newVisited = [
...visited,
value,
];
const flattenedChild = flatten(value, shouldPreserverObject, newParents, newVisited);
cloned[key] = flattenedChild;
let hasKeyNotCombined = false;
for (const childKey in flattenedChild) {
if (!/^\$/.test(childKey)) {
cloned[`${key}.${childKey}`] = flattenedChild[childKey];
delete cloned[key][childKey];
}
else {
hasKeyNotCombined = true;
}
}
if (!hasKeyNotCombined) {
delete cloned[key];
}
}
}
return cloned;
}
function flattenQueryObject(query) {
return flatten(query, isConversionRequired, [], [query]);
}
exports.flattenQueryObject = flattenQueryObject;
function flattenObject(object) {
return flatten(object, (_) => false, [], [object]);
}
exports.flattenObject = flattenObject;
function mergeConditionAfterEncode(query, condition, key) {
Eif (!condition[key]) {
delete query[key];
}
for (const conditionKey in condition) {
Iif (query[conditionKey]) {
if (type_1.isArray(query[conditionKey])) {
query[conditionKey].push(condition[conditionKey]);
}
else if (type_1.isObject(query[conditionKey])) {
if (type_1.isObject(condition[conditionKey])) {
Object.assign(query[conditionKey], condition[conditionKey]);
}
else {
console.warn(`unmergable condition, query is object but condition is ${type_1.getType(condition)}, can only overwrite`, condition, key);
query[conditionKey] = condition[conditionKey];
}
}
else {
console.warn(`to-merge query is of type ${type_1.getType(query)}, can only overwrite`, query, condition, key);
query[conditionKey] = condition[conditionKey];
}
}
else {
query[conditionKey] = condition[conditionKey];
}
}
}
exports.mergeConditionAfterEncode = mergeConditionAfterEncode;
function isConversionRequired(val) {
return type_1.isInternalObject(val) || type_1.isDate(val) || type_1.isRegExp(val);
}
exports.isConversionRequired = isConversionRequired;
function encodeInternalDataType(val, key) {
return datatype_1.serialize(val, key);
}
exports.encodeInternalDataType = encodeInternalDataType;
function decodeInternalDataType(object) {
return datatype_1.deserialize(object);
}
exports.decodeInternalDataType = decodeInternalDataType;
|