From eda5f42f6d304d60798e5da184c736aa295dfa43 Mon Sep 17 00:00:00 2001 From: charlie Date: Sat, 5 Dec 2020 11:29:22 -0500 Subject: [PATCH 1/3] added signature for object,undef to find_options so finds do not crash when doing await find(query,undefined) --- lib/find_options.js | 1 + 1 file changed, 1 insertion(+) diff --git a/lib/find_options.js b/lib/find_options.js index 74ac876..6399ed0 100644 --- a/lib/find_options.js +++ b/lib/find_options.js @@ -28,6 +28,7 @@ module.exports = function find_options(args) { //selector, fields, callback? //selector, options, callback? case "object,object": + case "object,undefined": case "object,undefined,function": case "object,object,function": //sniff for a 1 or -1 to detect fields object From c60a114b0bf8b6a772932d8f4513c35cd6f914d8 Mon Sep 17 00:00:00 2001 From: charlie Date: Sat, 5 Dec 2020 11:34:07 -0500 Subject: [PATCH 2/3] added find options test for signature object,undefined --- test/options.test.js | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/test/options.test.js b/test/options.test.js index 36b91a0..81fdbd2 100644 --- a/test/options.test.js +++ b/test/options.test.js @@ -41,6 +41,10 @@ describe('options tests', function () { var options = find_options({_id:"ABC123"}, undefined, cb); options.should.eql({ callback:cb, fields:undefined, limit:0, query:{_id:"ABC123"}, skip:0 }); }); + it('should accept signature: "selector, undefined"', function(){ + var options = find_options({_id:"ABC123"}, undefined); + options.should.eql({ callback: undefined, fields:undefined, limit:0, query:{_id:"ABC123"}, skip:0 }); + }); it('should accept signature: "selector, options"', function(){ var options = find_options({_id:"ABC123"}, {fields:{_id:-1}, skip:100}); options.should.eql({ callback:undefined, fields:{_id:-1}, limit:0, query:{_id:"ABC123"}, skip:100 }); From a8060807bedf53903ea220fc13d2d15e64f74c96 Mon Sep 17 00:00:00 2001 From: charlie Date: Sat, 5 Dec 2020 12:32:17 -0500 Subject: [PATCH 3/3] fix for fields sniff test in find_options --- lib/find_options.js | 20 +++++++++++++++++--- test/options.test.js | 8 ++++++++ 2 files changed, 25 insertions(+), 3 deletions(-) diff --git a/lib/find_options.js b/lib/find_options.js index 6399ed0..fe68458 100644 --- a/lib/find_options.js +++ b/lib/find_options.js @@ -1,5 +1,15 @@ var ObjectID = require('../').ObjectID; +// check to see if all values are 1/-1 +function is_fields(obj) { + for (prop in obj) { + if (Math.abs(obj[prop]) !== 1) { + return false + } + } + return true +} + module.exports = function find_options(args) { if(!args) args = []; var signature = Array.prototype.map.call(args, function(arg){ return Array.isArray(arg)? "array" : typeof arg }).join(); @@ -32,13 +42,17 @@ module.exports = function find_options(args) { case "object,undefined,function": case "object,object,function": //sniff for a 1 or -1 to detect fields object - if(!args[1] || Math.abs(args[1][0])===1) { + if(!args[1] || is_fields(args[1])) { options.fields = args[1]; } - else { + else { if(args[1].skip) options.skip = args[1].skip; if(args[1].limit) options.limit = args[1].limit; - if(args[1].fields) options.fields = args[1].fields; + if(args[1].fields) { + options.fields = args[1].fields; + } else { + options.fields = {} + } if(args[1].projection) options.fields = args[1].projection; } break; diff --git a/test/options.test.js b/test/options.test.js index 81fdbd2..83f17f5 100644 --- a/test/options.test.js +++ b/test/options.test.js @@ -53,6 +53,14 @@ describe('options tests', function () { var options = find_options({_id:"ABC123"}, {projection:{_id:-1}, skip:100}); options.should.eql({ callback:undefined, fields:{_id:-1}, limit:0, query:{_id:"ABC123"}, skip:100 }); }); + it('should accept limit:1, fields:undefined as options: "selector, options"', function(){ + var options = find_options({_id:"ABC123"}, {limit:1, fields:undefined}); + options.should.eql({ callback:undefined, fields:{}, limit:1, query:{_id:"ABC123"}, skip:0 }); + }); + it('should accept limit:1, fields:{...} as options: "selector, options"', function(){ + var options = find_options({_id:"ABC123"}, {limit:1, fields:{"a":1}}); + options.should.eql({ callback:undefined, fields:{"a":1}, limit:1, query:{_id:"ABC123"}, skip:0 }); + }); it('should accept signature: "selector, options, callback"', function(){ var options = find_options({_id:"ABC123"}, {fields:{_id:-1}, skip:100}, cb); options.should.eql({ callback:cb, fields:{_id:-1}, limit:0, query:{_id:"ABC123"}, skip:100 });