Skip to content

Commit

Permalink
Merge branch '4.5' into gh-2284
Browse files Browse the repository at this point in the history
Conflicts:
	lib/schema.js
  • Loading branch information
vkarpov15 committed May 18, 2016
2 parents 816849f + 33fdac0 commit 1eca44d
Show file tree
Hide file tree
Showing 11 changed files with 307 additions and 181 deletions.
6 changes: 6 additions & 0 deletions History.md
Original file line number Diff line number Diff line change
@@ -1,3 +1,9 @@
4.4.17 / 2016-05-13
===================
* docs: remove repetition in QueryStream docs #4147 [hugoabonizio](https://github.com/hugoabonizio)
* fix(document): dont double-validate doc array elements #4145
* fix(document): call required function with correct scope #4142 [JedWatson](https://github.com/JedWatson)

4.4.16 / 2016-05-09
===================
* refactor(document): use function reference #4133 [dciccale](https://github.com/dciccale)
Expand Down
115 changes: 59 additions & 56 deletions bin/mongoose.js
Original file line number Diff line number Diff line change
Expand Up @@ -1559,6 +1559,59 @@ Document.prototype.validate = function(options, callback) {
});
};

/*!
* ignore
*/

function _getPathsToValidate(doc) {
// only validate required fields when necessary
var paths = Object.keys(doc.$__.activePaths.states.require).filter(function(path) {
if (!doc.isSelected(path) && !doc.isModified(path)) {
return false;
}
var p = doc.schema.path(path);
if (typeof p.originalRequiredValue === 'function') {
return p.originalRequiredValue.call(doc);
}
return true;
});

paths = paths.concat(Object.keys(doc.$__.activePaths.states.init));
paths = paths.concat(Object.keys(doc.$__.activePaths.states.modify));
paths = paths.concat(Object.keys(doc.$__.activePaths.states.default));

// gh-661: if a whole array is modified, make sure to run validation on all
// the children as well
for (var i = 0; i < paths.length; ++i) {
var path = paths[i];
var val = doc.getValue(path);
if (val && val.isMongooseArray && !Buffer.isBuffer(val) && !val.isMongooseDocumentArray) {
var numElements = val.length;
for (var j = 0; j < numElements; ++j) {
paths.push(path + '.' + j);
}
}
}

var flattenOptions = { skipArrays: true };
for (i = 0; i < paths.length; ++i) {
var pathToCheck = paths[i];
if (doc.schema.nested[pathToCheck]) {
var _v = doc.getValue(pathToCheck);
if (isMongooseObject(_v)) {
_v = _v.toObject({ virtuals: false });
}
var flat = flatten(_v, '', flattenOptions);
var _subpaths = Object.keys(flat).map(function(p) {
return pathToCheck + '.' + p;
});
paths = paths.concat(_subpaths);
}
}

return paths;
}

/*!
* ignore
*/
Expand All @@ -1582,20 +1635,7 @@ Document.prototype.$__validate = function(callback) {
};

// only validate required fields when necessary
var paths = Object.keys(this.$__.activePaths.states.require).filter(function(path) {
if (!_this.isSelected(path) && !_this.isModified(path)) {
return false;
}
var p = _this.schema.path(path);
if (typeof p.originalRequiredValue === 'function') {
return p.originalRequiredValue.call(this);
}
return true;
});

paths = paths.concat(Object.keys(this.$__.activePaths.states.init));
paths = paths.concat(Object.keys(this.$__.activePaths.states.modify));
paths = paths.concat(Object.keys(this.$__.activePaths.states.default));
var paths = _getPathsToValidate(this);

if (paths.length === 0) {
process.nextTick(function() {
Expand All @@ -1611,33 +1651,6 @@ Document.prototype.$__validate = function(callback) {
var validating = {},
total = 0;

// gh-661: if a whole array is modified, make sure to run validation on all
// the children as well
for (var i = 0; i < paths.length; ++i) {
var path = paths[i];
var val = _this.getValue(path);
if (val && val.isMongooseArray && !Buffer.isBuffer(val) && !val.isMongooseDocumentArray) {
var numElements = val.length;
for (var j = 0; j < numElements; ++j) {
paths.push(path + '.' + j);
}
}
}

for (i = 0; i < paths.length; ++i) {
var pathToCheck = paths[i];
if (this.schema.nested[pathToCheck]) {
var _v = this.getValue(pathToCheck);
if (utils.isMongooseObject(_v)) {
_v = _v.toObject({ virtuals: false });
}
var _subpaths = Object.keys(flatten(_v)).map(function(p) {
return pathToCheck + '.' + p;
});
paths = paths.concat(_subpaths);
}
}

var complete = function() {
var err = _complete();
if (err) {
Expand Down Expand Up @@ -1709,20 +1722,7 @@ Document.prototype.validateSync = function(pathsToValidate) {
}

// only validate required fields when necessary
var paths = Object.keys(this.$__.activePaths.states.require).filter(function(path) {
if (!_this.isSelected(path) && !_this.isModified(path)) {
return false;
}
var p = _this.schema.path(path);
if (typeof p.originalRequiredValue === 'function') {
return p.originalRequiredValue.call(this);
}
return true;
});

paths = paths.concat(Object.keys(this.$__.activePaths.states.init));
paths = paths.concat(Object.keys(this.$__.activePaths.states.modify));
paths = paths.concat(Object.keys(this.$__.activePaths.states.default));
var paths = _getPathsToValidate(this);

if (pathsToValidate && pathsToValidate.length) {
var tmp = [];
Expand Down Expand Up @@ -8890,7 +8890,7 @@ exports.modifiedPaths = modifiedPaths;
* ignore
*/

function flatten(update, path) {
function flatten(update, path, options) {
var keys = Object.keys(update || {});
var numKeys = keys.length;
var result = {};
Expand All @@ -8903,6 +8903,9 @@ function flatten(update, path) {
val = val.toObject({ virtuals: false });
}
if (shouldFlatten(val)) {
if (options && options.skipArrays && Array.isArray(val)) {
continue;
}
var flat = flatten(val, path + key);
for (var k in flat) {
result[k] = flat[k];
Expand Down
110 changes: 55 additions & 55 deletions lib/document.js
Original file line number Diff line number Diff line change
Expand Up @@ -1115,6 +1115,59 @@ Document.prototype.validate = function(options, callback) {
});
};

/*!
* ignore
*/

function _getPathsToValidate(doc) {
// only validate required fields when necessary
var paths = Object.keys(doc.$__.activePaths.states.require).filter(function(path) {
if (!doc.isSelected(path) && !doc.isModified(path)) {
return false;
}
var p = doc.schema.path(path);
if (typeof p.originalRequiredValue === 'function') {
return p.originalRequiredValue.call(doc);
}
return true;
});

paths = paths.concat(Object.keys(doc.$__.activePaths.states.init));
paths = paths.concat(Object.keys(doc.$__.activePaths.states.modify));
paths = paths.concat(Object.keys(doc.$__.activePaths.states.default));

// gh-661: if a whole array is modified, make sure to run validation on all
// the children as well
for (var i = 0; i < paths.length; ++i) {
var path = paths[i];
var val = doc.getValue(path);
if (val && val.isMongooseArray && !Buffer.isBuffer(val) && !val.isMongooseDocumentArray) {
var numElements = val.length;
for (var j = 0; j < numElements; ++j) {
paths.push(path + '.' + j);
}
}
}

var flattenOptions = { skipArrays: true };
for (i = 0; i < paths.length; ++i) {
var pathToCheck = paths[i];
if (doc.schema.nested[pathToCheck]) {
var _v = doc.getValue(pathToCheck);
if (isMongooseObject(_v)) {
_v = _v.toObject({ virtuals: false });
}
var flat = flatten(_v, '', flattenOptions);
var _subpaths = Object.keys(flat).map(function(p) {
return pathToCheck + '.' + p;
});
paths = paths.concat(_subpaths);
}
}

return paths;
}

/*!
* ignore
*/
Expand All @@ -1138,20 +1191,7 @@ Document.prototype.$__validate = function(callback) {
};

// only validate required fields when necessary
var paths = Object.keys(this.$__.activePaths.states.require).filter(function(path) {
if (!_this.isSelected(path) && !_this.isModified(path)) {
return false;
}
var p = _this.schema.path(path);
if (typeof p.originalRequiredValue === 'function') {
return p.originalRequiredValue.call(this);
}
return true;
});

paths = paths.concat(Object.keys(this.$__.activePaths.states.init));
paths = paths.concat(Object.keys(this.$__.activePaths.states.modify));
paths = paths.concat(Object.keys(this.$__.activePaths.states.default));
var paths = _getPathsToValidate(this);

if (paths.length === 0) {
process.nextTick(function() {
Expand All @@ -1167,33 +1207,6 @@ Document.prototype.$__validate = function(callback) {
var validating = {},
total = 0;

// gh-661: if a whole array is modified, make sure to run validation on all
// the children as well
for (var i = 0; i < paths.length; ++i) {
var path = paths[i];
var val = _this.getValue(path);
if (val && val.isMongooseArray && !Buffer.isBuffer(val) && !val.isMongooseDocumentArray) {
var numElements = val.length;
for (var j = 0; j < numElements; ++j) {
paths.push(path + '.' + j);
}
}
}

for (i = 0; i < paths.length; ++i) {
var pathToCheck = paths[i];
if (this.schema.nested[pathToCheck]) {
var _v = this.getValue(pathToCheck);
if (isMongooseObject(_v)) {
_v = _v.toObject({ virtuals: false });
}
var _subpaths = Object.keys(flatten(_v)).map(function(p) {
return pathToCheck + '.' + p;
});
paths = paths.concat(_subpaths);
}
}

var complete = function() {
var err = _complete();
if (err) {
Expand Down Expand Up @@ -1265,20 +1278,7 @@ Document.prototype.validateSync = function(pathsToValidate) {
}

// only validate required fields when necessary
var paths = Object.keys(this.$__.activePaths.states.require).filter(function(path) {
if (!_this.isSelected(path) && !_this.isModified(path)) {
return false;
}
var p = _this.schema.path(path);
if (typeof p.originalRequiredValue === 'function') {
return p.originalRequiredValue.call(this);
}
return true;
});

paths = paths.concat(Object.keys(this.$__.activePaths.states.init));
paths = paths.concat(Object.keys(this.$__.activePaths.states.modify));
paths = paths.concat(Object.keys(this.$__.activePaths.states.default));
var paths = _getPathsToValidate(this);

if (pathsToValidate && pathsToValidate.length) {
var tmp = [];
Expand Down
Loading

0 comments on commit 1eca44d

Please sign in to comment.