UNPKG

mongoose-vault

Version:

Simple encryption plugin for Mongoose, using the transit backend from Hasicorp's Vault (Encryption as a Service).

78 lines (67 loc) 2.06 kB
'use strict' var _ = require('underscore') var mpath = require('mpath') /** * Sets the value of a field. * * @param {Object} obj The object * @param {string} field The path to a field. Can include dots (.) * @param {*} val The value to set the field * @return {Object} The modified object */ var setFieldValue = function (obj, field, val) { // using mpath.set() for this would be nice // but it does not create new objects as it traverses the path var parts = field.split('.') var partsLen = parts.length var partRef = obj || {} var i, part for (i = 0; i < partsLen; i++) { part = parts[i] if (i === partsLen - 1) { partRef[part] = val } else { partRef[part] = partRef[part] || {} partRef = partRef[part] } } return obj } /** * Pick a subset of fields from an object * * @param {Object} obj The object * @param {string[]} fields The fields to pick. Can include dots (.) * @param {Object} [options] The options * @param {boolean} [options.excludeUndefinedValues=false] Whether undefined values should be included in returned object. * @return {Object} An object containing only those fields that have been picked */ var pick = function (obj, fields, options) { var result = {} var val options = options || {} _.defaults(options, { excludeUndefinedValues: false }) fields.forEach(function (field) { val = mpath.get(field, obj) if (!options.excludeUndefinedValues || val !== undefined) { setFieldValue(result, field, val) } }) return result } /** * Determines if embedded document. * * @param {Model} doc The Mongoose document * @return {boolean} True if embedded document, False otherwise. */ var isEmbeddedDocument = function (doc) { return doc.constructor.name === 'EmbeddedDocument' || doc.constructor.name === 'SingleNested' } module.exports = { setFieldValue: setFieldValue, pick: pick, isEmbeddedDocument: isEmbeddedDocument }