arnaucube
arnaucube/thoughtsPublic Self-hosted repository
thoughts/node_modules/mongoose/lib/services/common.js
node_modules/mongoose/lib/services/common.jsRaw
 1'use strict';
 2
 3/*!
 4 * Module dependencies.
 5 */
 6
 7var ObjectId = require('../types/objectid');
 8var utils = require('../utils');
 9
10exports.flatten = flatten;
11exports.modifiedPaths = modifiedPaths;
12
13/*!
14 * ignore
15 */
16
17function flatten(update, path, options) {
18  var keys = Object.keys(update || {});
19  var numKeys = keys.length;
20  var result = {};
21  path = path ? path + '.' : '';
22
23  for (var i = 0; i < numKeys; ++i) {
24    var key = keys[i];
25    var val = update[key];
26    if (utils.isMongooseObject(val) && !Buffer.isBuffer(val)) {
27      val = val.toObject({ virtuals: false });
28    }
29    if (shouldFlatten(val)) {
30      result[path + key] = val;
31      if (options && options.skipArrays && Array.isArray(val)) {
32        continue;
33      }
34      var flat = flatten(val, path + key);
35      for (var k in flat) {
36        result[k] = flat[k];
37      }
38      if (Array.isArray(val)) {
39        result[path + key] = val;
40      }
41    } else {
42      result[path + key] = val;
43    }
44  }
45
46  return result;
47}
48
49/*!
50 * ignore
51 */
52
53function modifiedPaths(update, path, result) {
54  var keys = Object.keys(update || {});
55  var numKeys = keys.length;
56  result = result || {};
57  path = path ? path + '.' : '';
58
59  for (var i = 0; i < numKeys; ++i) {
60    var key = keys[i];
61    var val = update[key];
62
63    result[path + key] = true;
64    if (shouldFlatten(val)) {
65      modifiedPaths(val, path + key, result);
66    }
67  }
68
69  return result;
70}
71
72/*!
73 * ignore
74 */
75
76function shouldFlatten(val) {
77  return val &&
78    typeof val === 'object' &&
79    !(val instanceof Date) &&
80    !(val instanceof ObjectId) &&
81    (!Array.isArray(val) || val.length > 0) &&
82    !(val instanceof Buffer);
83}