dragonroll/backend/node_modules/multer-gridfs-storage/lib/utils.js

215 lines
7.7 KiB
JavaScript

"use strict";
/**
* Utility functions
* @module multer-gridfs-storage/utils
*/
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.getDatabase = exports.compareUris = exports.hasKeys = exports.compareBy = exports.compareArrays = exports.compare = exports.shouldListenOnDb = void 0;
const lodash_isplainobject_1 = __importDefault(require("lodash.isplainobject"));
const package_json_1 = require("mongodb/package.json");
function shouldListenOnDb(v = package_json_1.version) {
const [major, minor, patch] = v.split('.').map((vn) => Number(vn));
if (major === 3) {
if (minor <= 5) {
return true;
}
return minor === 6 && patch < 4;
}
return major < 4;
}
exports.shouldListenOnDb = shouldListenOnDb;
/**
* Compare two objects by value.
*
* This function is designed taking into account how mongodb connection parsing routines work.
* @param object1 The target object to compare
* @param object2 The second object to compare with the first
* @return Return true if both objects are equal by value
*/
function compare(object1, object2) {
let prop;
let comp;
let value1;
let value2;
let keys1 = 0;
let keys2 = 0;
// If objects are equal by identity stop testing
if (object1 === object2) {
return true;
}
// Falsey and plain objects with no properties are equivalent
if (!object1 || !object2) {
if (!object1 && !object2) {
return true;
}
return !(object1 ? hasKeys(object1) : hasKeys(object2));
}
// Check both own and inherited properties, MongoDb doesn't care where the property was defined
/* eslint-disable-next-line guard-for-in */
for (prop in object1) {
value1 = object1[prop];
value2 = object2[prop];
// If one object has one property not present in the other they are different
if (prop in object2) {
comp = compareBy(value1, value2);
switch (comp) {
case 'object':
// If both values are plain objects recursively compare its properties
if (!compare(value1, value2)) {
return false;
}
break;
case 'array':
// If both values are arrays compare buffers and strings by content and every other value by identity
if (!compareArrays(value1, value2)) {
return false;
}
break;
case 'buffer':
// If both values are buffers compare them by content
if (Buffer.compare(value1, value2) !== 0) {
return false;
}
break;
default:
// All other values are compared by identity
if (value1 !== value2) {
return false;
}
break;
}
keys1++;
}
else {
return false;
}
}
// Count all properties from the target object
/* eslint-disable-next-line guard-for-in */
for (prop in object2) {
keys2++;
}
// If the target object has more properties than source they are different
return keys1 === keys2;
}
exports.compare = compare;
/**
* Compare arrays by reference unless the values are strings or buffers
* @param array1 The source array to compare
* @param array2 The target array to compare with
* @return Returns true if both arrays are equivalent
*/
function compareArrays(array1, array2) {
let value1;
let value2;
if (array1.length !== array2.length) {
return false;
}
for (const [i, element] of array1.entries()) {
value1 = element;
value2 = array2[i];
// Types other than string or buffers are compared by reference because MongoDb only accepts those two types
// for configuration inside arrays
if (compareBy(value1, value2) === 'buffer') {
if (Buffer.compare(value1, value2) !== 0) {
return false;
}
}
else if (value1 !== value2) {
return false;
}
}
return true;
}
exports.compareArrays = compareArrays;
/**
* Indicates how objects should be compared.
* @param object1 The source object to compare
* @param object2 The target object to compare with
* @return Always returns 'identity' unless both objects have the same type and they are plain objects, arrays
* or buffers
*/
function compareBy(object1, object2) {
if (lodash_isplainobject_1.default(object1) && lodash_isplainobject_1.default(object2)) {
return 'object';
}
if (Array.isArray(object1) && Array.isArray(object2)) {
return 'array';
}
if (Buffer.isBuffer(object1) && Buffer.isBuffer(object2)) {
return 'buffer';
}
// All values are compared by identity unless they are both arrays, buffers or plain objects
return 'identity';
}
exports.compareBy = compareBy;
/**
* Return true if the object has at least one property inherited or not
* @param object The object to inspect
* @return If the object has any properties or not
*/
function hasKeys(object) {
/* eslint-disable-next-line guard-for-in, no-unreachable-loop */
for (const prop in object) {
// Stop testing if the object has at least one property
return true;
}
return false;
}
exports.hasKeys = hasKeys;
/**
* Compare two parsed uris checking if they are equivalent
* @param {*} uri1 The source parsed uri
* @param {*} uri2 The target parsed uri to compare
* @return {boolean} Return true if both uris are equivalent
*/
function compareUris(uri1, uri2) {
// Compare properties that are string values
const stringProps = ['scheme', 'username', 'password', 'database'];
const diff = stringProps.find((prop) => uri1[prop] !== uri2[prop]);
if (diff) {
return false;
}
// Compare query parameter values
if (!compare(uri1.options, uri2.options)) {
return false;
}
const hosts1 = uri1.hosts;
const hosts2 = uri2.hosts;
// Check if both uris have the same number of hosts
if (hosts1.length !== hosts2.length) {
return false;
}
// Check if every host in one array is present on the other array no matter where is positioned
for (const hostObject of hosts1) {
if (!hosts2.some((h) => h.host === hostObject.host && h.port === hostObject.port)) {
return false;
}
}
return true;
}
exports.compareUris = compareUris;
/**
* Checks if an object is a mongoose instance, a connection or a mongo Db object
* @param {*} object The object to check
* @return The database object
*/
function getDatabase(object) {
var _a;
// If the object has a db property should be a mongoose connection instance
// Mongo 2 has a db property but its a function. See issue #14
if (object.db && typeof object.db !== 'function') {
return object.db;
}
// If it has a connection property with a db property on it is a mongoose instance
if ((_a = object === null || object === void 0 ? void 0 : object.connection) === null || _a === void 0 ? void 0 : _a.db) {
return object.connection.db;
}
// If none of the above are true it should be a mongo database object
return object;
}
exports.getDatabase = getDatabase;
//# sourceMappingURL=utils.js.map