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}