in google-cloud-server/src/main/resources/buildServerResources/knockout.validation-2.0.3.js [234:286]
function traverseGraph(obj, context, level) {
var objValues = [],
val = obj.peek ? obj.peek() : obj;
if (obj.__kv_traversed === true) {
return;
}
if (context.options.deep) {
obj.__kv_traversed = true;
context.flagged.push(obj);
}
//default level value depends on deep option.
level = (level !== undefined ? level : context.options.deep ? 1 : -1);
// if object is observable then add it to the list
if (ko.isObservable(obj)) {
// ensure it's validatable but don't extend validatedObservable because it
// would overwrite isValid property.
if (!obj.errors && !utils.isValidatable(obj)) {
obj.extend({ validatable: true });
}
context.validatables.push(obj);
if (context.options.live && utils.isObservableArray(obj)) {
context.subscriptions.push(obj.subscribe(function () {
context.graphMonitor.valueHasMutated();
}));
}
}
//get list of values either from array or object but ignore non-objects
// and destroyed objects
if (val && !val._destroy) {
if (utils.isArray(val)) {
objValues = val;
}
else if (utils.isObject(val)) {
objValues = utils.values(val);
}
}
//process recursively if it is deep grouping
if (level !== 0) {
utils.forEach(objValues, function (observable) {
//but not falsy things and not HTML Elements
if (observable && !observable.nodeType && (!ko.isComputed(observable) || observable.rules)) {
traverseGraph(observable, context, level + 1);
}
});
}
}