From a532390f81e35f611fd02ad3d543f4d52217ca3c Mon Sep 17 00:00:00 2001 From: nanalelfe Date: Sun, 14 Aug 2016 06:13:55 -0400 Subject: Fixed signin and signup --- app.js | 6 +- assets/css/style.css | 6 + config/passport.js | 87 +++-- node_modules/bcrypt-nodejs/package.json | 6 +- .../node_modules/iconv-lite/package.json | 3 +- .../body-parser/node_modules/qs/package.json | 3 +- .../chai-http/node_modules/cookiejar/package.json | 3 +- .../is-ip/node_modules/ip-regex/package.json | 5 +- .../chai-http/node_modules/is-ip/package.json | 5 +- .../chai-http/node_modules/qs/package.json | 3 +- .../node_modules/component-emitter/package.json | 3 +- .../form-data/node_modules/async/package.json | 2 +- .../node_modules/formidable/package.json | 3 +- .../chai-http/node_modules/superagent/package.json | 3 +- node_modules/chai-http/package.json | 3 +- .../chai/node_modules/assertion-error/package.json | 3 +- .../deep-eql/node_modules/type-detect/package.json | 6 +- .../chai/node_modules/deep-eql/package.json | 6 +- .../chai/node_modules/type-detect/package.json | 5 +- node_modules/chai/package.json | 3 +- .../accepts/node_modules/negotiator/package.json | 3 +- node_modules/connect-mongo/package.json | 3 +- .../cookie-parser/node_modules/cookie/package.json | 5 +- .../csurf/node_modules/cookie/package.json | 5 +- .../glob/node_modules/minimatch/minimatch.js | 39 +- .../node_modules/balanced-match/package.json | 3 +- .../node_modules/brace-expansion/package.json | 3 +- .../glob/node_modules/minimatch/package.json | 21 +- .../node_modules/graceful-fs/package.json | 3 +- .../align-text/node_modules/kind-of/README.md | 36 +- .../kind-of/node_modules/is-buffer/.travis.yml | 7 +- .../kind-of/node_modules/is-buffer/.zuul.yml | 2 - .../kind-of/node_modules/is-buffer/README.md | 2 +- .../kind-of/node_modules/is-buffer/index.js | 28 +- .../kind-of/node_modules/is-buffer/package.json | 32 +- .../kind-of/node_modules/is-buffer/test/basic.js | 29 +- .../align-text/node_modules/kind-of/package.json | 36 +- .../node_modules/align-text/package.json | 2 +- .../align-text/node_modules/kind-of/README.md | 36 +- .../kind-of/node_modules/is-buffer/.travis.yml | 7 +- .../kind-of/node_modules/is-buffer/.zuul.yml | 2 - .../kind-of/node_modules/is-buffer/README.md | 2 +- .../kind-of/node_modules/is-buffer/index.js | 28 +- .../kind-of/node_modules/is-buffer/package.json | 32 +- .../kind-of/node_modules/is-buffer/test/basic.js | 29 +- .../align-text/node_modules/kind-of/package.json | 37 +- .../node_modules/align-text/package.json | 2 +- .../node_modules/cookie/package.json | 5 +- .../node_modules/uid-safe/package.json | 2 +- .../node_modules/array-flatten/package.json | 3 +- .../express/node_modules/finalhandler/package.json | 5 +- node_modules/mocha/node_modules/diff/package.json | 3 +- .../node_modules/escape-string-regexp/package.json | 5 +- .../minimatch/node_modules/lru-cache/package.json | 3 +- .../minimatch/node_modules/sigmund/package.json | 3 +- .../glob/node_modules/minimatch/package.json | 3 +- node_modules/mocha/node_modules/glob/package.json | 3 +- node_modules/mocha/node_modules/growl/package.json | 3 +- .../jade/node_modules/commander/package.json | 7 +- .../jade/node_modules/mkdirp/package.json | 7 +- .../mocha/node_modules/mkdirp/package.json | 3 +- .../mocha/node_modules/supports-color/package.json | 5 +- .../mocha/node_modules/to-iso-string/package.json | 3 +- node_modules/mocha/package.json | 3 +- node_modules/mongodb/HISTORY.md | 9 + node_modules/mongodb/README.md | 415 --------------------- node_modules/mongodb/lib/aggregation_cursor.js | 3 +- node_modules/mongodb/lib/bulk/ordered.js | 2 + node_modules/mongodb/lib/collection.js | 146 ++++++-- node_modules/mongodb/lib/command_cursor.js | 2 +- node_modules/mongodb/lib/cursor.js | 18 +- node_modules/mongodb/lib/db.js | 72 +++- node_modules/mongodb/lib/mongo_client.js | 41 +- node_modules/mongodb/lib/mongos.js | 36 +- node_modules/mongodb/lib/read_preference.js | 50 ++- node_modules/mongodb/lib/replset.js | 48 ++- node_modules/mongodb/lib/server.js | 37 +- node_modules/mongodb/lib/topology_base.js | 9 + node_modules/mongodb/lib/url_parser.js | 5 + .../mongodb/node_modules/mongodb-core/HISTORY.md | 10 + .../mongodb/node_modules/mongodb-core/README.md | 228 ----------- .../mongodb-core/lib/connection/pool.js | 19 +- .../node_modules/mongodb-core/lib/cursor.js | 7 + .../mongodb-core/lib/topologies/mongos.js | 36 +- .../mongodb-core/lib/topologies/read_preference.js | 17 +- .../mongodb-core/lib/topologies/replset.js | 55 ++- .../mongodb-core/lib/topologies/replset_state.js | 199 +++++++++- .../mongodb-core/lib/topologies/server.js | 42 ++- .../mongodb-core/lib/topologies/shared.js | 52 +++ .../mongodb-core/lib/wireprotocol/3_2_support.js | 8 + .../mongodb-core/node_modules/bson/package.json | 5 +- .../mongodb/node_modules/mongodb-core/package.json | 27 +- node_modules/mongodb/package.json | 27 +- node_modules/sanitizer/package.json | 3 +- .../node_modules/component-emitter/package.json | 3 +- .../form-data/node_modules/async/package.json | 2 +- .../superagent/node_modules/form-data/package.json | 3 +- .../superagent/node_modules/qs/package.json | 5 +- .../node_modules/readable-stream/package.json | 5 +- .../node_modules/reduce-component/package.json | 3 +- .../supertest/node_modules/superagent/package.json | 3 +- node_modules/supertest/package.json | 3 +- node_modules/underscore/package.json | 3 +- node_simple.js | 31 +- routes/admin.js | 4 +- routes/index.js | 4 +- routes/user.js | 4 +- views/partials/header.hbs | 11 - views/signin.hbs | 14 +- 109 files changed, 1268 insertions(+), 1122 deletions(-) delete mode 100644 node_modules/mongodb/README.md delete mode 100644 node_modules/mongodb/node_modules/mongodb-core/README.md diff --git a/app.js b/app.js index 4c41394..0c9c5e1 100644 --- a/app.js +++ b/app.js @@ -58,11 +58,7 @@ app.use(function(req, res, next) { res.locals.login = req.isAuthenticated(); // global variable res.locals.session = req.session; res.locals.user = req.user; - - if (req.user && req.email && !req.user.login_info && (req.originalUrl != '/user/verify') - && (!req.originalUrl.toString().includes('facebook'))){ - req.logout(); - } + console.log(req.user); res.locals.messages = req.session.messages; next(); }); diff --git a/assets/css/style.css b/assets/css/style.css index 7506300..95e3a39 100644 --- a/assets/css/style.css +++ b/assets/css/style.css @@ -504,4 +504,10 @@ hr { height: auto; max-height: 200px; overflow: scroll ; +} + +/***** Signin *****/ + +.insite-signin { + border-right: 1px solid darkgray; } \ No newline at end of file diff --git a/config/passport.js b/config/passport.js index 498e0fd..3c99b10 100644 --- a/config/passport.js +++ b/config/passport.js @@ -56,7 +56,7 @@ passport.use('local_signup', new LocalStrategy({ var hash_pass = encryptPassword(password); var fields = [email, req.body.usrname, req.body.fname, req.body.lname, req.body.univ, req.body.dept, hash_pass, - req.body.phone_num]; + req.body.phone_num, 0]; dbFile.add_user(fields, function (success, error, message) { @@ -80,7 +80,8 @@ passport.use('local_signup', new LocalStrategy({ messages: 0, comments: 0, phone_num: fields[7], - followers: [] + followers: [], + fb_id: 0 }; return done(null, user_data); } @@ -141,43 +142,75 @@ passport.use('local_signin', new LocalStrategy({ /** * Configures the Facebook strategy to authenticate signin as well as signup request. + * + * var user_data = { + email: fields[0], + user_name: fields[1], + f_name: fields[2], + l_name: fields[3], + university: fields[4], + department: fields[5], + answered: 0, + messages: 0, + comments: 0, + phone_num: fields[7], + followers: [] + }; */ passport.use(new FacebookStrategy({ clientID: configAuth.facebookAuth.clientID, clientSecret: configAuth.facebookAuth.clientSecret, callbackURL: configAuth.facebookAuth.callbackURL, - passReqToCallback: true + passReqToCallback: true, + profileFields: ['id', 'emails', 'name'] }, function(req, accessToken, refreshToken, profile, done) { - dbFile.userVerifiedBefore(req.user.user_name, function(err, data) { - if (err) { - return done(err); - } else if (data.length) { - if (data[0].facebookID == profile.id) { - var user = req.user; - user.login_info = data[0]; - return done(null, user); - } else { - return done(null, false, {message: "The verification account doesn't match."}); - } - } else { - var verification = { - username : req.user.user_name, - facebookID : profile.id, - facebookToken : accessToken + // Find by user facebook id, if not, add user + dbFile.retrieveUserById(profile.id, function(success, error, user, message) { + if (!success && error) { + return done(message); + } - } - dbFile.addVerification(verification, function (err) { - if (err) { - return done(err); - } else { - var user = req.user; - user.login_info = verification; - return done(null, user); + else if (!success && !error) { // id is undefined + var fields = [profile.emails[0].value, profile.name.givenName + ' ' + profile.name.familyName, + profile.name.givenName, profile.name.familyName, null, null, null, + null, profile.id]; + + dbFile.add_user(fields, function (success, error, message) { + console.log('inside add_user'); + console.log("SUCCESS: " + success); + console.log("ERROR: " + error); + console.log(message); + if (!success && error) { + return done(null, false, {message:message}); // Review later, need to pass errors + } else if (!success && !error) { + return done(null, false, {message: message}); + } + + else { + var user_data = { + email: fields[0], + user_name: fields[1], + f_name: fields[2], + l_name: fields[3], + university: fields[4], + department: fields[5], + answered: 0, + messages: 0, + comments: 0, + phone_num: fields[7], + followers: [], + fb_id: profile.id + }; + return done(null, user_data); } }); } + + else { + return done(null, user); + } }); } )); \ No newline at end of file diff --git a/node_modules/bcrypt-nodejs/package.json b/node_modules/bcrypt-nodejs/package.json index c3f3940..cfd140d 100644 --- a/node_modules/bcrypt-nodejs/package.json +++ b/node_modules/bcrypt-nodejs/package.json @@ -9,7 +9,7 @@ "version": "0.0.3", "repository": { "type": "git", - "url": "git+https://github.com/shaneGirish/bcryptJS.git" + "url": "https://github.com/shaneGirish/bcryptJS.git" }, "bugs": { "url": "https://github.com/shaneGirish/bcrypt-nodejs/issues" @@ -59,7 +59,5 @@ "directories": {}, "_shasum": "c60917f26dc235661566c681061c303c2b28842b", "_resolved": "https://registry.npmjs.org/bcrypt-nodejs/-/bcrypt-nodejs-0.0.3.tgz", - "_from": "bcrypt-nodejs@0.0.3", - "readme": "ERROR: No README data found!", - "homepage": "https://github.com/shaneGirish/bcryptJS#readme" + "_from": "bcrypt-nodejs@0.0.3" } diff --git a/node_modules/body-parser/node_modules/iconv-lite/package.json b/node_modules/body-parser/node_modules/iconv-lite/package.json index 6e72175..fd96413 100644 --- a/node_modules/body-parser/node_modules/iconv-lite/package.json +++ b/node_modules/body-parser/node_modules/iconv-lite/package.json @@ -114,5 +114,6 @@ "tarball": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.13.tgz" }, "directories": {}, - "_resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.13.tgz" + "_resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.13.tgz", + "readme": "ERROR: No README data found!" } diff --git a/node_modules/body-parser/node_modules/qs/package.json b/node_modules/body-parser/node_modules/qs/package.json index 265c172..776e1ed 100644 --- a/node_modules/body-parser/node_modules/qs/package.json +++ b/node_modules/body-parser/node_modules/qs/package.json @@ -81,6 +81,5 @@ "tmp": "tmp/qs-6.2.0.tgz_1462749349998_0.03372702235355973" }, "directories": {}, - "_resolved": "https://registry.npmjs.org/qs/-/qs-6.2.0.tgz", - "readme": "ERROR: No README data found!" + "_resolved": "https://registry.npmjs.org/qs/-/qs-6.2.0.tgz" } diff --git a/node_modules/chai-http/node_modules/cookiejar/package.json b/node_modules/chai-http/node_modules/cookiejar/package.json index cbbb1c0..410eed9 100644 --- a/node_modules/chai-http/node_modules/cookiejar/package.json +++ b/node_modules/chai-http/node_modules/cookiejar/package.json @@ -49,5 +49,6 @@ } ], "directories": {}, - "_resolved": "https://registry.npmjs.org/cookiejar/-/cookiejar-2.0.6.tgz" + "_resolved": "https://registry.npmjs.org/cookiejar/-/cookiejar-2.0.6.tgz", + "readme": "ERROR: No README data found!" } diff --git a/node_modules/chai-http/node_modules/is-ip/node_modules/ip-regex/package.json b/node_modules/chai-http/node_modules/is-ip/node_modules/ip-regex/package.json index ba6b16f..3788514 100644 --- a/node_modules/chai-http/node_modules/is-ip/node_modules/ip-regex/package.json +++ b/node_modules/chai-http/node_modules/is-ip/node_modules/ip-regex/package.json @@ -5,7 +5,7 @@ "license": "MIT", "repository": { "type": "git", - "url": "https://github.com/sindresorhus/ip-regex" + "url": "git+https://github.com/sindresorhus/ip-regex.git" }, "author": { "name": "Sindre Sorhus", @@ -64,5 +64,6 @@ "tarball": "https://registry.npmjs.org/ip-regex/-/ip-regex-1.0.3.tgz" }, "directories": {}, - "_resolved": "https://registry.npmjs.org/ip-regex/-/ip-regex-1.0.3.tgz" + "_resolved": "https://registry.npmjs.org/ip-regex/-/ip-regex-1.0.3.tgz", + "readme": "ERROR: No README data found!" } diff --git a/node_modules/chai-http/node_modules/is-ip/package.json b/node_modules/chai-http/node_modules/is-ip/package.json index 56b233c..c66cd1d 100644 --- a/node_modules/chai-http/node_modules/is-ip/package.json +++ b/node_modules/chai-http/node_modules/is-ip/package.json @@ -5,7 +5,7 @@ "license": "MIT", "repository": { "type": "git", - "url": "git://github.com/sindresorhus/is-ip" + "url": "git://github.com/sindresorhus/is-ip.git" }, "author": { "name": "Sindre Sorhus", @@ -68,5 +68,6 @@ "tarball": "https://registry.npmjs.org/is-ip/-/is-ip-1.0.0.tgz" }, "directories": {}, - "_resolved": "https://registry.npmjs.org/is-ip/-/is-ip-1.0.0.tgz" + "_resolved": "https://registry.npmjs.org/is-ip/-/is-ip-1.0.0.tgz", + "readme": "ERROR: No README data found!" } diff --git a/node_modules/chai-http/node_modules/qs/package.json b/node_modules/chai-http/node_modules/qs/package.json index a82e623..bae7451 100644 --- a/node_modules/chai-http/node_modules/qs/package.json +++ b/node_modules/chai-http/node_modules/qs/package.json @@ -82,5 +82,6 @@ "tmp": "tmp/qs-6.2.1.tgz_1469044929716_0.06957711698487401" }, "directories": {}, - "_resolved": "https://registry.npmjs.org/qs/-/qs-6.2.1.tgz" + "_resolved": "https://registry.npmjs.org/qs/-/qs-6.2.1.tgz", + "readme": "ERROR: No README data found!" } diff --git a/node_modules/chai-http/node_modules/superagent/node_modules/component-emitter/package.json b/node_modules/chai-http/node_modules/superagent/node_modules/component-emitter/package.json index f3b91ae..e1ad368 100644 --- a/node_modules/chai-http/node_modules/superagent/node_modules/component-emitter/package.json +++ b/node_modules/chai-http/node_modules/superagent/node_modules/component-emitter/package.json @@ -177,5 +177,6 @@ "tmp": "tmp/component-emitter-1.2.1.tgz_1461005707641_0.14232611074112356" }, "directories": {}, - "_resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz" + "_resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz", + "readme": "ERROR: No README data found!" } diff --git a/node_modules/chai-http/node_modules/superagent/node_modules/form-data/node_modules/async/package.json b/node_modules/chai-http/node_modules/superagent/node_modules/form-data/node_modules/async/package.json index cdcd141..4bcdc92 100644 --- a/node_modules/chai-http/node_modules/superagent/node_modules/form-data/node_modules/async/package.json +++ b/node_modules/chai-http/node_modules/superagent/node_modules/form-data/node_modules/async/package.json @@ -88,7 +88,7 @@ "homepage": "https://github.com/caolan/async#readme", "_id": "async@1.5.2", "_shasum": "ec6a61ae56480c0c3cb241c95618e20892f9672a", - "_from": "async@>=1.5.2 <2.0.0", + "_from": "async@>=1.4.0 <2.0.0", "_npmVersion": "3.5.2", "_nodeVersion": "4.2.3", "_npmUser": { diff --git a/node_modules/chai-http/node_modules/superagent/node_modules/formidable/package.json b/node_modules/chai-http/node_modules/superagent/node_modules/formidable/package.json index 6cce440..97108b1 100644 --- a/node_modules/chai-http/node_modules/superagent/node_modules/formidable/package.json +++ b/node_modules/chai-http/node_modules/superagent/node_modules/formidable/package.json @@ -61,5 +61,6 @@ } ], "_shasum": "ef5491490f9433b705faa77249c99029ae348559", - "_resolved": "https://registry.npmjs.org/formidable/-/formidable-1.0.17.tgz" + "_resolved": "https://registry.npmjs.org/formidable/-/formidable-1.0.17.tgz", + "readme": "ERROR: No README data found!" } diff --git a/node_modules/chai-http/node_modules/superagent/package.json b/node_modules/chai-http/node_modules/superagent/package.json index bb5a423..9147dbd 100644 --- a/node_modules/chai-http/node_modules/superagent/package.json +++ b/node_modules/chai-http/node_modules/superagent/package.json @@ -141,5 +141,6 @@ "tmp": "tmp/superagent-2.1.0.tgz_1468486904183_0.8864591023884714" }, "directories": {}, - "_resolved": "https://registry.npmjs.org/superagent/-/superagent-2.1.0.tgz" + "_resolved": "https://registry.npmjs.org/superagent/-/superagent-2.1.0.tgz", + "readme": "ERROR: No README data found!" } diff --git a/node_modules/chai-http/package.json b/node_modules/chai-http/package.json index 226ddf1..11b6a8e 100644 --- a/node_modules/chai-http/package.json +++ b/node_modules/chai-http/package.json @@ -108,5 +108,6 @@ "tmp": "tmp/chai-http-3.0.0.tgz_1465570423892_0.4711184229236096" }, "directories": {}, - "_resolved": "https://registry.npmjs.org/chai-http/-/chai-http-3.0.0.tgz" + "_resolved": "https://registry.npmjs.org/chai-http/-/chai-http-3.0.0.tgz", + "readme": "ERROR: No README data found!" } diff --git a/node_modules/chai/node_modules/assertion-error/package.json b/node_modules/chai/node_modules/assertion-error/package.json index 7ab64a8..d95b38d 100644 --- a/node_modules/chai/node_modules/assertion-error/package.json +++ b/node_modules/chai/node_modules/assertion-error/package.json @@ -57,5 +57,6 @@ "tmp": "tmp/assertion-error-1.0.2.tgz_1465237527264_0.8082898685242981" }, "directories": {}, - "_resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.0.2.tgz" + "_resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.0.2.tgz", + "readme": "ERROR: No README data found!" } diff --git a/node_modules/chai/node_modules/deep-eql/node_modules/type-detect/package.json b/node_modules/chai/node_modules/deep-eql/node_modules/type-detect/package.json index ca5d198..0d3c8f2 100644 --- a/node_modules/chai/node_modules/deep-eql/node_modules/type-detect/package.json +++ b/node_modules/chai/node_modules/deep-eql/node_modules/type-detect/package.json @@ -11,7 +11,7 @@ "keywords": [], "repository": { "type": "git", - "url": "git@github.com:chaijs/type-detect.git" + "url": "git+ssh://git@github.com/chaijs/type-detect.git" }, "engines": { "node": "*" @@ -52,5 +52,7 @@ ], "directories": {}, "_shasum": "0ba5ec2a885640e470ea4e8505971900dac58822", - "_resolved": "https://registry.npmjs.org/type-detect/-/type-detect-0.1.1.tgz" + "_resolved": "https://registry.npmjs.org/type-detect/-/type-detect-0.1.1.tgz", + "readme": "ERROR: No README data found!", + "homepage": "https://github.com/chaijs/type-detect#readme" } diff --git a/node_modules/chai/node_modules/deep-eql/package.json b/node_modules/chai/node_modules/deep-eql/package.json index 16f89f5..b58cd03 100644 --- a/node_modules/chai/node_modules/deep-eql/package.json +++ b/node_modules/chai/node_modules/deep-eql/package.json @@ -15,7 +15,7 @@ ], "repository": { "type": "git", - "url": "git@github.com:chaijs/deep-eql.git" + "url": "git+ssh://git@github.com/chaijs/deep-eql.git" }, "engines": { "node": "*" @@ -59,5 +59,7 @@ ], "directories": {}, "_shasum": "ef558acab8de25206cd713906d74e56930eb69f2", - "_resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-0.1.3.tgz" + "_resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-0.1.3.tgz", + "readme": "ERROR: No README data found!", + "homepage": "https://github.com/chaijs/deep-eql#readme" } diff --git a/node_modules/chai/node_modules/type-detect/package.json b/node_modules/chai/node_modules/type-detect/package.json index b014b8e..1eceba0 100644 --- a/node_modules/chai/node_modules/type-detect/package.json +++ b/node_modules/chai/node_modules/type-detect/package.json @@ -11,7 +11,7 @@ "keywords": [], "repository": { "type": "git", - "url": "git@github.com:chaijs/type-detect.git" + "url": "git+ssh://git@github.com/chaijs/type-detect.git" }, "engines": { "node": "*" @@ -55,5 +55,6 @@ "tarball": "https://registry.npmjs.org/type-detect/-/type-detect-1.0.0.tgz" }, "directories": {}, - "_resolved": "https://registry.npmjs.org/type-detect/-/type-detect-1.0.0.tgz" + "_resolved": "https://registry.npmjs.org/type-detect/-/type-detect-1.0.0.tgz", + "readme": "ERROR: No README data found!" } diff --git a/node_modules/chai/package.json b/node_modules/chai/package.json index 4ca7202..c08cd62 100644 --- a/node_modules/chai/package.json +++ b/node_modules/chai/package.json @@ -89,5 +89,6 @@ } ], "directories": {}, - "_resolved": "https://registry.npmjs.org/chai/-/chai-3.5.0.tgz" + "_resolved": "https://registry.npmjs.org/chai/-/chai-3.5.0.tgz", + "readme": "ERROR: No README data found!" } diff --git a/node_modules/compression/node_modules/accepts/node_modules/negotiator/package.json b/node_modules/compression/node_modules/accepts/node_modules/negotiator/package.json index a7c2c2a..8b73084 100644 --- a/node_modules/compression/node_modules/accepts/node_modules/negotiator/package.json +++ b/node_modules/compression/node_modules/accepts/node_modules/negotiator/package.json @@ -86,6 +86,5 @@ "tmp": "tmp/negotiator-0.6.1.tgz_1462250848695_0.027451182017102838" }, "directories": {}, - "_resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.1.tgz", - "readme": "ERROR: No README data found!" + "_resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.1.tgz" } diff --git a/node_modules/connect-mongo/package.json b/node_modules/connect-mongo/package.json index 6b6a3e4..e3c351b 100644 --- a/node_modules/connect-mongo/package.json +++ b/node_modules/connect-mongo/package.json @@ -86,5 +86,6 @@ "tmp": "tmp/connect-mongo-1.3.2.tgz_1469613537733_0.9538226106669754" }, "directories": {}, - "_resolved": "https://registry.npmjs.org/connect-mongo/-/connect-mongo-1.3.2.tgz" + "_resolved": "https://registry.npmjs.org/connect-mongo/-/connect-mongo-1.3.2.tgz", + "readme": "ERROR: No README data found!" } diff --git a/node_modules/cookie-parser/node_modules/cookie/package.json b/node_modules/cookie-parser/node_modules/cookie/package.json index bb3556a..a24d81c 100644 --- a/node_modules/cookie-parser/node_modules/cookie/package.json +++ b/node_modules/cookie-parser/node_modules/cookie/package.json @@ -19,7 +19,7 @@ ], "repository": { "type": "git", - "url": "git+https://github.com/jshttp/cookie.git" + "url": "https://github.com/jshttp/cookie" }, "devDependencies": { "istanbul": "0.4.3", @@ -67,6 +67,5 @@ "tmp": "tmp/cookie-0.3.1.tgz_1464323556714_0.6435900838114321" }, "directories": {}, - "_resolved": "https://registry.npmjs.org/cookie/-/cookie-0.3.1.tgz", - "readme": "ERROR: No README data found!" + "_resolved": "https://registry.npmjs.org/cookie/-/cookie-0.3.1.tgz" } diff --git a/node_modules/csurf/node_modules/cookie/package.json b/node_modules/csurf/node_modules/cookie/package.json index bb3556a..a24d81c 100644 --- a/node_modules/csurf/node_modules/cookie/package.json +++ b/node_modules/csurf/node_modules/cookie/package.json @@ -19,7 +19,7 @@ ], "repository": { "type": "git", - "url": "git+https://github.com/jshttp/cookie.git" + "url": "https://github.com/jshttp/cookie" }, "devDependencies": { "istanbul": "0.4.3", @@ -67,6 +67,5 @@ "tmp": "tmp/cookie-0.3.1.tgz_1464323556714_0.6435900838114321" }, "directories": {}, - "_resolved": "https://registry.npmjs.org/cookie/-/cookie-0.3.1.tgz", - "readme": "ERROR: No README data found!" + "_resolved": "https://registry.npmjs.org/cookie/-/cookie-0.3.1.tgz" } diff --git a/node_modules/express-handlebars/node_modules/glob/node_modules/minimatch/minimatch.js b/node_modules/express-handlebars/node_modules/glob/node_modules/minimatch/minimatch.js index 830a272..5b5f8cf 100644 --- a/node_modules/express-handlebars/node_modules/glob/node_modules/minimatch/minimatch.js +++ b/node_modules/express-handlebars/node_modules/glob/node_modules/minimatch/minimatch.js @@ -9,6 +9,14 @@ try { var GLOBSTAR = minimatch.GLOBSTAR = Minimatch.GLOBSTAR = {} var expand = require('brace-expansion') +var plTypes = { + '!': { open: '(?:(?!(?:', close: '))[^/]*?)'}, + '?': { open: '(?:', close: ')?' }, + '+': { open: '(?:', close: ')+' }, + '*': { open: '(?:', close: ')*' }, + '@': { open: '(?:', close: ')' } +} + // any single thing other than / // don't need to escape / when using new RegExp() var qmark = '[^/]' @@ -277,7 +285,6 @@ function parse (pattern, isSub) { // ? => one single character var patternListStack = [] var negativeLists = [] - var plType var stateChar var inClass = false var reClassStart = -1 @@ -376,11 +383,12 @@ function parse (pattern, isSub) { continue } - plType = stateChar patternListStack.push({ - type: plType, + type: stateChar, start: i - 1, - reStart: re.length + reStart: re.length, + open: plTypes[stateChar].open, + close: plTypes[stateChar].close }) // negation is (?:(?!js)[^/]*) re += stateChar === '!' ? '(?:(?!(?:' : '(?:' @@ -396,24 +404,14 @@ function parse (pattern, isSub) { clearStateChar() hasMagic = true - re += ')' var pl = patternListStack.pop() - plType = pl.type // negation is (?:(?!js)[^/]*) // The others are (?:) - switch (plType) { - case '!': - negativeLists.push(pl) - re += ')[^/]*?)' - pl.reEnd = re.length - break - case '?': - case '+': - case '*': - re += plType - break - case '@': break // the default anyway + re += pl.close + if (pl.type === '!') { + negativeLists.push(pl) } + pl.reEnd = re.length continue case '|': @@ -520,7 +518,8 @@ function parse (pattern, isSub) { // Go through and escape them, taking care not to double-escape any // | chars that were already escaped. for (pl = patternListStack.pop(); pl; pl = patternListStack.pop()) { - var tail = re.slice(pl.reStart + 3) + var tail = re.slice(pl.reStart + pl.open.length) + this.debug('setting tail', re, pl) // maybe some even number of \, then maybe 1 \, followed by a | tail = tail.replace(/((?:\\{2}){0,64})(\\?)\|/g, function (_, $1, $2) { if (!$2) { @@ -537,7 +536,7 @@ function parse (pattern, isSub) { return $1 + $1 + $2 + '|' }) - this.debug('tail=%j\n %s', tail, tail) + this.debug('tail=%j\n %s', tail, tail, pl, re) var t = pl.type === '*' ? star : pl.type === '?' ? qmark : '\\' + pl.type diff --git a/node_modules/express-handlebars/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/node_modules/balanced-match/package.json b/node_modules/express-handlebars/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/node_modules/balanced-match/package.json index 4c87650..2557dda 100644 --- a/node_modules/express-handlebars/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/node_modules/balanced-match/package.json +++ b/node_modules/express-handlebars/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/node_modules/balanced-match/package.json @@ -72,5 +72,6 @@ "tmp": "tmp/balanced-match-0.4.2.tgz_1468834991581_0.6590619895141572" }, "directories": {}, - "_resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-0.4.2.tgz" + "_resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-0.4.2.tgz", + "readme": "ERROR: No README data found!" } diff --git a/node_modules/express-handlebars/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/package.json b/node_modules/express-handlebars/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/package.json index 8c64940..e00a73a 100644 --- a/node_modules/express-handlebars/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/package.json +++ b/node_modules/express-handlebars/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/package.json @@ -74,5 +74,6 @@ "tmp": "tmp/brace-expansion-1.1.6.tgz_1469047715600_0.9362958471756428" }, "directories": {}, - "_resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.6.tgz" + "_resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.6.tgz", + "readme": "ERROR: No README data found!" } diff --git a/node_modules/express-handlebars/node_modules/glob/node_modules/minimatch/package.json b/node_modules/express-handlebars/node_modules/glob/node_modules/minimatch/package.json index 1bb38d9..81c21bf 100644 --- a/node_modules/express-handlebars/node_modules/glob/node_modules/minimatch/package.json +++ b/node_modules/express-handlebars/node_modules/glob/node_modules/minimatch/package.json @@ -6,7 +6,7 @@ }, "name": "minimatch", "description": "a glob matcher in javascript", - "version": "3.0.2", + "version": "3.0.3", "repository": { "type": "git", "url": "git://github.com/isaacs/minimatch.git" @@ -30,23 +30,23 @@ "files": [ "minimatch.js" ], - "gitHead": "81edb7c763abd31ba981c87ec5e835f178786be0", + "gitHead": "eed89491bd4a4e6bc463aac0dfb5c29ef0d1dc13", "bugs": { "url": "https://github.com/isaacs/minimatch/issues" }, "homepage": "https://github.com/isaacs/minimatch#readme", - "_id": "minimatch@3.0.2", - "_shasum": "0f398a7300ea441e9c348c83d98ab8c9dbf9c40a", + "_id": "minimatch@3.0.3", + "_shasum": "2a4e4090b96b2db06a9d7df01055a62a77c9b774", "_from": "minimatch@>=2.0.0 <3.0.0||>=3.0.0 <4.0.0", - "_npmVersion": "3.9.1", + "_npmVersion": "3.10.6", "_nodeVersion": "4.4.4", "_npmUser": { "name": "isaacs", "email": "i@izs.me" }, "dist": { - "shasum": "0f398a7300ea441e9c348c83d98ab8c9dbf9c40a", - "tarball": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.2.tgz" + "shasum": "2a4e4090b96b2db06a9d7df01055a62a77c9b774", + "tarball": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.3.tgz" }, "maintainers": [ { @@ -55,10 +55,9 @@ } ], "_npmOperationalInternal": { - "host": "packages-16-east.internal.npmjs.com", - "tmp": "tmp/minimatch-3.0.2.tgz_1466194379770_0.11417287751100957" + "host": "packages-12-west.internal.npmjs.com", + "tmp": "tmp/minimatch-3.0.3.tgz_1470678322731_0.1892083385027945" }, "directories": {}, - "_resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.2.tgz", - "readme": "ERROR: No README data found!" + "_resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.3.tgz" } diff --git a/node_modules/express-handlebars/node_modules/graceful-fs/package.json b/node_modules/express-handlebars/node_modules/graceful-fs/package.json index f242e81..1d10cb8 100644 --- a/node_modules/express-handlebars/node_modules/graceful-fs/package.json +++ b/node_modules/express-handlebars/node_modules/graceful-fs/package.json @@ -72,5 +72,6 @@ "host": "packages-12-west.internal.npmjs.com", "tmp": "tmp/graceful-fs-4.1.5.tgz_1469558843062_0.986795610981062" }, - "_resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.5.tgz" + "_resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.5.tgz", + "readme": "ERROR: No README data found!" } diff --git a/node_modules/express-handlebars/node_modules/handlebars/node_modules/uglify-js/node_modules/yargs/node_modules/cliui/node_modules/center-align/node_modules/align-text/node_modules/kind-of/README.md b/node_modules/express-handlebars/node_modules/handlebars/node_modules/uglify-js/node_modules/yargs/node_modules/cliui/node_modules/center-align/node_modules/align-text/node_modules/kind-of/README.md index 472569e..4ac4f18 100644 --- a/node_modules/express-handlebars/node_modules/handlebars/node_modules/uglify-js/node_modules/yargs/node_modules/cliui/node_modules/center-align/node_modules/align-text/node_modules/kind-of/README.md +++ b/node_modules/express-handlebars/node_modules/handlebars/node_modules/uglify-js/node_modules/yargs/node_modules/cliui/node_modules/center-align/node_modules/align-text/node_modules/kind-of/README.md @@ -7,7 +7,7 @@ Get the native type of a value. Install with [npm](https://www.npmjs.com/): ```sh -$ npm install kind-of --save +$ npm install --save kind-of ``` Install with [bower](http://bower.io/) @@ -200,33 +200,29 @@ In 7 out of 8 cases, this library is 2x-10x faster than other top libraries incl 2. Optimize around bottlenecks - In other words, the order in which conditionals are implemented is significant, because each check is only as fast as the failing checks that came before it. Here, the biggest bottleneck by far is checking for plain objects (an object that was created by the `Object` constructor). I opted to make this check happen by process of elimination rather than brute force up front (e.g. by using something like `val.constructor.name`), so that every other type check would not be penalized it. 3. Don't do uneccessary processing - why do `.slice(8, -1).toLowerCase();` just to get the word `regex`? It's much faster to do `if (type === '[object RegExp]') return 'regex'` -## Related projects +## About -You might also be interested in these projects: +### Related projects -* [is-glob](https://www.npmjs.com/package/is-glob): Returns `true` if the given string looks like a glob pattern or an extglob pattern.… [more](https://www.npmjs.com/package/is-glob) | [homepage](https://github.com/jonschlinkert/is-glob) -* [is-number](https://www.npmjs.com/package/is-number): Returns true if the value is a number. comprehensive tests. | [homepage](https://github.com/jonschlinkert/is-number) -* [is-primitive](https://www.npmjs.com/package/is-primitive): Returns `true` if the value is a primitive. | [homepage](https://github.com/jonschlinkert/is-primitive) +* [is-glob](https://www.npmjs.com/package/is-glob): Returns `true` if the given string looks like a glob pattern or an extglob pattern… [more](https://github.com/jonschlinkert/is-glob) | [homepage](https://github.com/jonschlinkert/is-glob "Returns `true` if the given string looks like a glob pattern or an extglob pattern. This makes it easy to create code that only uses external modules like node-glob when necessary, resulting in much faster code execution and initialization time, and a bet") +* [is-number](https://www.npmjs.com/package/is-number): Returns true if the value is a number. comprehensive tests. | [homepage](https://github.com/jonschlinkert/is-number "Returns true if the value is a number. comprehensive tests.") +* [is-primitive](https://www.npmjs.com/package/is-primitive): Returns `true` if the value is a primitive. | [homepage](https://github.com/jonschlinkert/is-primitive "Returns `true` if the value is a primitive. ") -## Contributing +### Contributing -Pull requests and stars are always welcome. For bugs and feature requests, [please create an issue](https://github.com/jonschlinkert/kind-of/issues/new). +Pull requests and stars are always welcome. For bugs and feature requests, [please create an issue](../../issues/new). -## Building docs +### Building docs -Generate readme and API documentation with [verb](https://github.com/verbose/verb): +_(This document was generated by [verb-generate-readme](https://github.com/verbose/verb-generate-readme) (a [verb](https://github.com/verbose/verb) generator), please don't edit the readme directly. Any changes to the readme must be made in [.verb.md](.verb.md).)_ -```sh -$ npm install verb && npm run docs -``` - -Or, if [verb](https://github.com/verbose/verb) is installed globally: +To generate the readme and API documentation with [verb](https://github.com/verbose/verb): ```sh -$ verb +$ npm install -g verb verb-generate-readme && verb ``` -## Running tests +### Running tests Install dev dependencies: @@ -234,18 +230,18 @@ Install dev dependencies: $ npm install -d && npm test ``` -## Author +### Author **Jon Schlinkert** * [github/jonschlinkert](https://github.com/jonschlinkert) * [twitter/jonschlinkert](http://twitter.com/jonschlinkert) -## License +### License Copyright © 2016, [Jon Schlinkert](https://github.com/jonschlinkert). Released under the [MIT license](https://github.com/jonschlinkert/kind-of/blob/master/LICENSE). *** -_This file was generated by [verb](https://github.com/verbose/verb), v0.9.0, on May 03, 2016._ \ No newline at end of file +_This file was generated by [verb-generate-readme](https://github.com/verbose/verb-generate-readme), v0.1.28, on July 29, 2016._ \ No newline at end of file diff --git a/node_modules/express-handlebars/node_modules/handlebars/node_modules/uglify-js/node_modules/yargs/node_modules/cliui/node_modules/center-align/node_modules/align-text/node_modules/kind-of/node_modules/is-buffer/.travis.yml b/node_modules/express-handlebars/node_modules/handlebars/node_modules/uglify-js/node_modules/yargs/node_modules/cliui/node_modules/center-align/node_modules/align-text/node_modules/kind-of/node_modules/is-buffer/.travis.yml index 8803fc1..24885a3 100644 --- a/node_modules/express-handlebars/node_modules/handlebars/node_modules/uglify-js/node_modules/yargs/node_modules/cliui/node_modules/center-align/node_modules/align-text/node_modules/kind-of/node_modules/is-buffer/.travis.yml +++ b/node_modules/express-handlebars/node_modules/handlebars/node_modules/uglify-js/node_modules/yargs/node_modules/cliui/node_modules/center-align/node_modules/align-text/node_modules/kind-of/node_modules/is-buffer/.travis.yml @@ -1,7 +1,8 @@ +sudo: false language: node_js node_js: -- 'iojs' + - node env: global: - - secure: du27W3wTgZ3G183axW7w0I01lOIurx8kilMH9p45VMfNXCu8lo6FLtLIQZxJ1FYMoJLQ1yfJTu2G0rq39SotDfJumsk6tF7BjTY/HKCocZaHqCMgw0W2bcylb5kMAdLhBNPlzejpPoWa1x1axbAHNFOLQNVosG/Bavu3/kuIIps= - - secure: Ax/5aekM40o67NuTkvQqx1DhfP86ZlHTtKbv5yI+WFmbjD3FQM8b8G1J/o7doaBDev7Mp+1zDJOK2pFGtt+JGRl0lM2JUmLh6yh/b28obXyei5iuUkqzKJLfKZHMbY5QW/1i4DUM+zSXe6Kava0qnqYg5wBBnrF6gLdsVsCGNQk= + - secure: du27W3wTgZ3G183axW7w0I01lOIurx8kilMH9p45VMfNXCu8lo6FLtLIQZxJ1FYMoJLQ1yfJTu2G0rq39SotDfJumsk6tF7BjTY/HKCocZaHqCMgw0W2bcylb5kMAdLhBNPlzejpPoWa1x1axbAHNFOLQNVosG/Bavu3/kuIIps= + - secure: Ax/5aekM40o67NuTkvQqx1DhfP86ZlHTtKbv5yI+WFmbjD3FQM8b8G1J/o7doaBDev7Mp+1zDJOK2pFGtt+JGRl0lM2JUmLh6yh/b28obXyei5iuUkqzKJLfKZHMbY5QW/1i4DUM+zSXe6Kava0qnqYg5wBBnrF6gLdsVsCGNQk= diff --git a/node_modules/express-handlebars/node_modules/handlebars/node_modules/uglify-js/node_modules/yargs/node_modules/cliui/node_modules/center-align/node_modules/align-text/node_modules/kind-of/node_modules/is-buffer/.zuul.yml b/node_modules/express-handlebars/node_modules/handlebars/node_modules/uglify-js/node_modules/yargs/node_modules/cliui/node_modules/center-align/node_modules/align-text/node_modules/kind-of/node_modules/is-buffer/.zuul.yml index dc1efba..eb3cae6 100644 --- a/node_modules/express-handlebars/node_modules/handlebars/node_modules/uglify-js/node_modules/yargs/node_modules/cliui/node_modules/center-align/node_modules/align-text/node_modules/kind-of/node_modules/is-buffer/.zuul.yml +++ b/node_modules/express-handlebars/node_modules/handlebars/node_modules/uglify-js/node_modules/yargs/node_modules/cliui/node_modules/center-align/node_modules/align-text/node_modules/kind-of/node_modules/is-buffer/.zuul.yml @@ -10,7 +10,5 @@ browsers: version: latest - name: ie version: 8..latest - - name: opera - version: 11..latest - name: android version: 5.0..latest diff --git a/node_modules/express-handlebars/node_modules/handlebars/node_modules/uglify-js/node_modules/yargs/node_modules/cliui/node_modules/center-align/node_modules/align-text/node_modules/kind-of/node_modules/is-buffer/README.md b/node_modules/express-handlebars/node_modules/handlebars/node_modules/uglify-js/node_modules/yargs/node_modules/cliui/node_modules/center-align/node_modules/align-text/node_modules/kind-of/node_modules/is-buffer/README.md index e6eb61a..cb6f356 100644 --- a/node_modules/express-handlebars/node_modules/handlebars/node_modules/uglify-js/node_modules/yargs/node_modules/cliui/node_modules/center-align/node_modules/align-text/node_modules/kind-of/node_modules/is-buffer/README.md +++ b/node_modules/express-handlebars/node_modules/handlebars/node_modules/uglify-js/node_modules/yargs/node_modules/cliui/node_modules/center-align/node_modules/align-text/node_modules/kind-of/node_modules/is-buffer/README.md @@ -1,6 +1,6 @@ # is-buffer [![travis][travis-image]][travis-url] [![npm][npm-image]][npm-url] [![downloads][downloads-image]][npm-url] -#### Determine if an object is a [`Buffer`](http://nodejs.org/api/buffer.html) (incl. [browser Buffers](https://github.com/feross/buffer)) +#### Determine if an object is a [`Buffer`](http://nodejs.org/api/buffer.html) (including the [browserify Buffer](https://github.com/feross/buffer)) [![saucelabs][saucelabs-image]][saucelabs-url] diff --git a/node_modules/express-handlebars/node_modules/handlebars/node_modules/uglify-js/node_modules/yargs/node_modules/cliui/node_modules/center-align/node_modules/align-text/node_modules/kind-of/node_modules/is-buffer/index.js b/node_modules/express-handlebars/node_modules/handlebars/node_modules/uglify-js/node_modules/yargs/node_modules/cliui/node_modules/center-align/node_modules/align-text/node_modules/kind-of/node_modules/is-buffer/index.js index ef02824..36c808e 100644 --- a/node_modules/express-handlebars/node_modules/handlebars/node_modules/uglify-js/node_modules/yargs/node_modules/cliui/node_modules/center-align/node_modules/align-text/node_modules/kind-of/node_modules/is-buffer/index.js +++ b/node_modules/express-handlebars/node_modules/handlebars/node_modules/uglify-js/node_modules/yargs/node_modules/cliui/node_modules/center-align/node_modules/align-text/node_modules/kind-of/node_modules/is-buffer/index.js @@ -1,17 +1,21 @@ -/** - * Determine if an object is Buffer +/*! + * Determine if an object is a Buffer * - * Author: Feross Aboukhadijeh - * License: MIT - * - * `npm install is-buffer` + * @author Feross Aboukhadijeh + * @license MIT */ +// The _isBuffer check is for Safari 5-7 support, because it's missing +// Object.prototype.constructor. Remove this eventually module.exports = function (obj) { - return !!(obj != null && - (obj._isBuffer || // For Safari 5-7 (missing Object.prototype.constructor) - (obj.constructor && - typeof obj.constructor.isBuffer === 'function' && - obj.constructor.isBuffer(obj)) - )) + return obj != null && (isBuffer(obj) || isSlowBuffer(obj) || !!obj._isBuffer) +} + +function isBuffer (obj) { + return !!obj.constructor && typeof obj.constructor.isBuffer === 'function' && obj.constructor.isBuffer(obj) +} + +// For Node v0.10 support. Remove this eventually. +function isSlowBuffer (obj) { + return typeof obj.readFloatLE === 'function' && typeof obj.slice === 'function' && isBuffer(obj.slice(0, 0)) } diff --git a/node_modules/express-handlebars/node_modules/handlebars/node_modules/uglify-js/node_modules/yargs/node_modules/cliui/node_modules/center-align/node_modules/align-text/node_modules/kind-of/node_modules/is-buffer/package.json b/node_modules/express-handlebars/node_modules/handlebars/node_modules/uglify-js/node_modules/yargs/node_modules/cliui/node_modules/center-align/node_modules/align-text/node_modules/kind-of/node_modules/is-buffer/package.json index b121605..1fddf0b 100644 --- a/node_modules/express-handlebars/node_modules/handlebars/node_modules/uglify-js/node_modules/yargs/node_modules/cliui/node_modules/center-align/node_modules/align-text/node_modules/kind-of/node_modules/is-buffer/package.json +++ b/node_modules/express-handlebars/node_modules/handlebars/node_modules/uglify-js/node_modules/yargs/node_modules/cliui/node_modules/center-align/node_modules/align-text/node_modules/kind-of/node_modules/is-buffer/package.json @@ -1,7 +1,7 @@ { "name": "is-buffer", - "description": "Determine if an object is Buffer", - "version": "1.1.3", + "description": "Determine if an object is a Buffer", + "version": "1.1.4", "author": { "name": "Feross Aboukhadijeh", "email": "feross@feross.org", @@ -12,13 +12,10 @@ }, "dependencies": {}, "devDependencies": { - "standard": "^6.0.5", + "standard": "^7.0.0", "tape": "^4.0.0", "zuul": "^3.0.0" }, - "engines": { - "node": ">=0.12" - }, "keywords": [ "buffer", "buffers", @@ -51,20 +48,20 @@ "testling": { "files": "test/*.js" }, - "gitHead": "dfd658d887e6b63254b89d22af1a755a39313455", - "homepage": "https://github.com/feross/is-buffer", - "_id": "is-buffer@1.1.3", - "_shasum": "db897fc3f7aca2d50de94b6c8c2896a4771627af", + "gitHead": "fd1a429f6ab8092f2e39cb5cc7175b5d9a986c31", + "homepage": "https://github.com/feross/is-buffer#readme", + "_id": "is-buffer@1.1.4", + "_shasum": "cfc86ccd5dc5a52fa80489111c6920c457e2d98b", "_from": "is-buffer@>=1.0.2 <2.0.0", - "_npmVersion": "2.14.12", - "_nodeVersion": "4.3.2", + "_npmVersion": "2.15.1", + "_nodeVersion": "0.10.46", "_npmUser": { "name": "feross", "email": "feross@feross.org" }, "dist": { - "shasum": "db897fc3f7aca2d50de94b6c8c2896a4771627af", - "tarball": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.3.tgz" + "shasum": "cfc86ccd5dc5a52fa80489111c6920c457e2d98b", + "tarball": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.4.tgz" }, "maintainers": [ { @@ -73,10 +70,9 @@ } ], "_npmOperationalInternal": { - "host": "packages-12-west.internal.npmjs.com", - "tmp": "tmp/is-buffer-1.1.3.tgz_1457390977775_0.6384289276320487" + "host": "packages-16-east.internal.npmjs.com", + "tmp": "tmp/is-buffer-1.1.4.tgz_1470267365943_0.6724087686743587" }, "directories": {}, - "_resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.3.tgz", - "readme": "ERROR: No README data found!" + "_resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.4.tgz" } diff --git a/node_modules/express-handlebars/node_modules/handlebars/node_modules/uglify-js/node_modules/yargs/node_modules/cliui/node_modules/center-align/node_modules/align-text/node_modules/kind-of/node_modules/is-buffer/test/basic.js b/node_modules/express-handlebars/node_modules/handlebars/node_modules/uglify-js/node_modules/yargs/node_modules/cliui/node_modules/center-align/node_modules/align-text/node_modules/kind-of/node_modules/is-buffer/test/basic.js index 38d883b..43b7c82 100644 --- a/node_modules/express-handlebars/node_modules/handlebars/node_modules/uglify-js/node_modules/yargs/node_modules/cliui/node_modules/center-align/node_modules/align-text/node_modules/kind-of/node_modules/is-buffer/test/basic.js +++ b/node_modules/express-handlebars/node_modules/handlebars/node_modules/uglify-js/node_modules/yargs/node_modules/cliui/node_modules/center-align/node_modules/align-text/node_modules/kind-of/node_modules/is-buffer/test/basic.js @@ -1,20 +1,25 @@ +var buffer = require('buffer') var isBuffer = require('../') var test = require('tape') test('is-buffer', function (t) { - t.ok(isBuffer(new Buffer(4)), 'new Buffer(4)') + t.equal(isBuffer(new Buffer(4)), true, 'new Buffer(4)') + t.equal(isBuffer(buffer.SlowBuffer(100)), true, 'SlowBuffer(100)') - t.notOk(isBuffer(undefined), 'undefined') - t.notOk(isBuffer(null), 'null') - t.notOk(isBuffer(''), 'empty string') - t.notOk(isBuffer(true), 'true') - t.notOk(isBuffer(false), 'false') - t.notOk(isBuffer(0), '0') - t.notOk(isBuffer(1), '1') - t.notOk(isBuffer(1.0), '1.0') - t.notOk(isBuffer('string'), 'string') - t.notOk(isBuffer({}), '{}') - t.notOk(isBuffer(function foo () {}), 'function foo () {}') + t.equal(isBuffer(undefined), false, 'undefined') + t.equal(isBuffer(null), false, 'null') + t.equal(isBuffer(''), false, 'empty string') + t.equal(isBuffer(true), false, 'true') + t.equal(isBuffer(false), false, 'false') + t.equal(isBuffer(0), false, '0') + t.equal(isBuffer(1), false, '1') + t.equal(isBuffer(1.0), false, '1.0') + t.equal(isBuffer('string'), false, 'string') + t.equal(isBuffer({}), false, '{}') + t.equal(isBuffer([]), false, '[]') + t.equal(isBuffer(function foo () {}), false, 'function foo () {}') + t.equal(isBuffer({ isBuffer: null }), false, '{ isBuffer: null }') + t.equal(isBuffer({ isBuffer: function () { throw new Error() } }), false, '{ isBuffer: function () { throw new Error() } }') t.end() }) diff --git a/node_modules/express-handlebars/node_modules/handlebars/node_modules/uglify-js/node_modules/yargs/node_modules/cliui/node_modules/center-align/node_modules/align-text/node_modules/kind-of/package.json b/node_modules/express-handlebars/node_modules/handlebars/node_modules/uglify-js/node_modules/yargs/node_modules/cliui/node_modules/center-align/node_modules/align-text/node_modules/kind-of/package.json index bc63ba5..edd8faf 100644 --- a/node_modules/express-handlebars/node_modules/handlebars/node_modules/uglify-js/node_modules/yargs/node_modules/cliui/node_modules/center-align/node_modules/align-text/node_modules/kind-of/package.json +++ b/node_modules/express-handlebars/node_modules/handlebars/node_modules/uglify-js/node_modules/yargs/node_modules/cliui/node_modules/center-align/node_modules/align-text/node_modules/kind-of/package.json @@ -1,7 +1,7 @@ { "name": "kind-of", "description": "Get the native type of a value.", - "version": "3.0.3", + "version": "3.0.4", "homepage": "https://github.com/jonschlinkert/kind-of", "author": { "name": "Jon Schlinkert", @@ -16,7 +16,9 @@ }, "license": "MIT", "files": [ - "index.js" + "index.js", + "LICENSE", + "README.md" ], "main": "index.js", "engines": { @@ -31,12 +33,11 @@ }, "devDependencies": { "ansi-bold": "^0.1.1", - "benchmarked": "^0.1.3", - "browserify": "^11.0.1", - "glob": "^4.3.5", + "benchmarked": "^0.2.5", + "browserify": "^13.1.0", + "glob": "^7.0.5", "gulp-format-md": "^0.1.9", - "mocha": "*", - "should": "*", + "mocha": "^2.5.3", "type-of": "^2.0.1", "typeof": "^1.0.0" }, @@ -54,6 +55,7 @@ "kind-of", "number", "object", + "of", "regexp", "string", "test", @@ -85,12 +87,12 @@ "verb" ] }, - "gitHead": "c1023c4839a91abd580a4e71fd0763f7fc2ad3f4", - "_id": "kind-of@3.0.3", - "_shasum": "c61608747d815b0362556db3276362a7a38aded3", + "gitHead": "8f93765a6bbbe350e1ba68e790d1ff337b91331a", + "_id": "kind-of@3.0.4", + "_shasum": "7b8ecf18a4e17f8269d73b501c9f232c96887a74", "_from": "kind-of@>=3.0.2 <4.0.0", - "_npmVersion": "3.6.0", - "_nodeVersion": "5.5.0", + "_npmVersion": "3.10.3", + "_nodeVersion": "6.3.0", "_npmUser": { "name": "jonschlinkert", "email": "github@sellside.com" @@ -106,14 +108,14 @@ } ], "dist": { - "shasum": "c61608747d815b0362556db3276362a7a38aded3", - "tarball": "https://registry.npmjs.org/kind-of/-/kind-of-3.0.3.tgz" + "shasum": "7b8ecf18a4e17f8269d73b501c9f232c96887a74", + "tarball": "https://registry.npmjs.org/kind-of/-/kind-of-3.0.4.tgz" }, "_npmOperationalInternal": { - "host": "packages-12-west.internal.npmjs.com", - "tmp": "tmp/kind-of-3.0.3.tgz_1462262974577_0.29414567071944475" + "host": "packages-16-east.internal.npmjs.com", + "tmp": "tmp/kind-of-3.0.4.tgz_1469811230830_0.8813814013265073" }, "directories": {}, - "_resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.0.3.tgz", + "_resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.0.4.tgz", "readme": "ERROR: No README data found!" } diff --git a/node_modules/express-handlebars/node_modules/handlebars/node_modules/uglify-js/node_modules/yargs/node_modules/cliui/node_modules/center-align/node_modules/align-text/package.json b/node_modules/express-handlebars/node_modules/handlebars/node_modules/uglify-js/node_modules/yargs/node_modules/cliui/node_modules/center-align/node_modules/align-text/package.json index 3cc2e0b..e36d9c2 100644 --- a/node_modules/express-handlebars/node_modules/handlebars/node_modules/uglify-js/node_modules/yargs/node_modules/cliui/node_modules/center-align/node_modules/align-text/package.json +++ b/node_modules/express-handlebars/node_modules/handlebars/node_modules/uglify-js/node_modules/yargs/node_modules/cliui/node_modules/center-align/node_modules/align-text/package.json @@ -52,7 +52,7 @@ "gitHead": "7f08e823a54c6bda319d875895813537a66a4c5e", "_id": "align-text@0.1.4", "_shasum": "0cd90a561093f35d0a99256c22b7069433fad117", - "_from": "align-text@>=0.1.3 <0.2.0", + "_from": "align-text@>=0.1.1 <0.2.0", "_npmVersion": "3.6.0", "_nodeVersion": "5.5.0", "_npmUser": { diff --git a/node_modules/express-handlebars/node_modules/handlebars/node_modules/uglify-js/node_modules/yargs/node_modules/cliui/node_modules/right-align/node_modules/align-text/node_modules/kind-of/README.md b/node_modules/express-handlebars/node_modules/handlebars/node_modules/uglify-js/node_modules/yargs/node_modules/cliui/node_modules/right-align/node_modules/align-text/node_modules/kind-of/README.md index 472569e..4ac4f18 100644 --- a/node_modules/express-handlebars/node_modules/handlebars/node_modules/uglify-js/node_modules/yargs/node_modules/cliui/node_modules/right-align/node_modules/align-text/node_modules/kind-of/README.md +++ b/node_modules/express-handlebars/node_modules/handlebars/node_modules/uglify-js/node_modules/yargs/node_modules/cliui/node_modules/right-align/node_modules/align-text/node_modules/kind-of/README.md @@ -7,7 +7,7 @@ Get the native type of a value. Install with [npm](https://www.npmjs.com/): ```sh -$ npm install kind-of --save +$ npm install --save kind-of ``` Install with [bower](http://bower.io/) @@ -200,33 +200,29 @@ In 7 out of 8 cases, this library is 2x-10x faster than other top libraries incl 2. Optimize around bottlenecks - In other words, the order in which conditionals are implemented is significant, because each check is only as fast as the failing checks that came before it. Here, the biggest bottleneck by far is checking for plain objects (an object that was created by the `Object` constructor). I opted to make this check happen by process of elimination rather than brute force up front (e.g. by using something like `val.constructor.name`), so that every other type check would not be penalized it. 3. Don't do uneccessary processing - why do `.slice(8, -1).toLowerCase();` just to get the word `regex`? It's much faster to do `if (type === '[object RegExp]') return 'regex'` -## Related projects +## About -You might also be interested in these projects: +### Related projects -* [is-glob](https://www.npmjs.com/package/is-glob): Returns `true` if the given string looks like a glob pattern or an extglob pattern.… [more](https://www.npmjs.com/package/is-glob) | [homepage](https://github.com/jonschlinkert/is-glob) -* [is-number](https://www.npmjs.com/package/is-number): Returns true if the value is a number. comprehensive tests. | [homepage](https://github.com/jonschlinkert/is-number) -* [is-primitive](https://www.npmjs.com/package/is-primitive): Returns `true` if the value is a primitive. | [homepage](https://github.com/jonschlinkert/is-primitive) +* [is-glob](https://www.npmjs.com/package/is-glob): Returns `true` if the given string looks like a glob pattern or an extglob pattern… [more](https://github.com/jonschlinkert/is-glob) | [homepage](https://github.com/jonschlinkert/is-glob "Returns `true` if the given string looks like a glob pattern or an extglob pattern. This makes it easy to create code that only uses external modules like node-glob when necessary, resulting in much faster code execution and initialization time, and a bet") +* [is-number](https://www.npmjs.com/package/is-number): Returns true if the value is a number. comprehensive tests. | [homepage](https://github.com/jonschlinkert/is-number "Returns true if the value is a number. comprehensive tests.") +* [is-primitive](https://www.npmjs.com/package/is-primitive): Returns `true` if the value is a primitive. | [homepage](https://github.com/jonschlinkert/is-primitive "Returns `true` if the value is a primitive. ") -## Contributing +### Contributing -Pull requests and stars are always welcome. For bugs and feature requests, [please create an issue](https://github.com/jonschlinkert/kind-of/issues/new). +Pull requests and stars are always welcome. For bugs and feature requests, [please create an issue](../../issues/new). -## Building docs +### Building docs -Generate readme and API documentation with [verb](https://github.com/verbose/verb): +_(This document was generated by [verb-generate-readme](https://github.com/verbose/verb-generate-readme) (a [verb](https://github.com/verbose/verb) generator), please don't edit the readme directly. Any changes to the readme must be made in [.verb.md](.verb.md).)_ -```sh -$ npm install verb && npm run docs -``` - -Or, if [verb](https://github.com/verbose/verb) is installed globally: +To generate the readme and API documentation with [verb](https://github.com/verbose/verb): ```sh -$ verb +$ npm install -g verb verb-generate-readme && verb ``` -## Running tests +### Running tests Install dev dependencies: @@ -234,18 +230,18 @@ Install dev dependencies: $ npm install -d && npm test ``` -## Author +### Author **Jon Schlinkert** * [github/jonschlinkert](https://github.com/jonschlinkert) * [twitter/jonschlinkert](http://twitter.com/jonschlinkert) -## License +### License Copyright © 2016, [Jon Schlinkert](https://github.com/jonschlinkert). Released under the [MIT license](https://github.com/jonschlinkert/kind-of/blob/master/LICENSE). *** -_This file was generated by [verb](https://github.com/verbose/verb), v0.9.0, on May 03, 2016._ \ No newline at end of file +_This file was generated by [verb-generate-readme](https://github.com/verbose/verb-generate-readme), v0.1.28, on July 29, 2016._ \ No newline at end of file diff --git a/node_modules/express-handlebars/node_modules/handlebars/node_modules/uglify-js/node_modules/yargs/node_modules/cliui/node_modules/right-align/node_modules/align-text/node_modules/kind-of/node_modules/is-buffer/.travis.yml b/node_modules/express-handlebars/node_modules/handlebars/node_modules/uglify-js/node_modules/yargs/node_modules/cliui/node_modules/right-align/node_modules/align-text/node_modules/kind-of/node_modules/is-buffer/.travis.yml index 8803fc1..24885a3 100644 --- a/node_modules/express-handlebars/node_modules/handlebars/node_modules/uglify-js/node_modules/yargs/node_modules/cliui/node_modules/right-align/node_modules/align-text/node_modules/kind-of/node_modules/is-buffer/.travis.yml +++ b/node_modules/express-handlebars/node_modules/handlebars/node_modules/uglify-js/node_modules/yargs/node_modules/cliui/node_modules/right-align/node_modules/align-text/node_modules/kind-of/node_modules/is-buffer/.travis.yml @@ -1,7 +1,8 @@ +sudo: false language: node_js node_js: -- 'iojs' + - node env: global: - - secure: du27W3wTgZ3G183axW7w0I01lOIurx8kilMH9p45VMfNXCu8lo6FLtLIQZxJ1FYMoJLQ1yfJTu2G0rq39SotDfJumsk6tF7BjTY/HKCocZaHqCMgw0W2bcylb5kMAdLhBNPlzejpPoWa1x1axbAHNFOLQNVosG/Bavu3/kuIIps= - - secure: Ax/5aekM40o67NuTkvQqx1DhfP86ZlHTtKbv5yI+WFmbjD3FQM8b8G1J/o7doaBDev7Mp+1zDJOK2pFGtt+JGRl0lM2JUmLh6yh/b28obXyei5iuUkqzKJLfKZHMbY5QW/1i4DUM+zSXe6Kava0qnqYg5wBBnrF6gLdsVsCGNQk= + - secure: du27W3wTgZ3G183axW7w0I01lOIurx8kilMH9p45VMfNXCu8lo6FLtLIQZxJ1FYMoJLQ1yfJTu2G0rq39SotDfJumsk6tF7BjTY/HKCocZaHqCMgw0W2bcylb5kMAdLhBNPlzejpPoWa1x1axbAHNFOLQNVosG/Bavu3/kuIIps= + - secure: Ax/5aekM40o67NuTkvQqx1DhfP86ZlHTtKbv5yI+WFmbjD3FQM8b8G1J/o7doaBDev7Mp+1zDJOK2pFGtt+JGRl0lM2JUmLh6yh/b28obXyei5iuUkqzKJLfKZHMbY5QW/1i4DUM+zSXe6Kava0qnqYg5wBBnrF6gLdsVsCGNQk= diff --git a/node_modules/express-handlebars/node_modules/handlebars/node_modules/uglify-js/node_modules/yargs/node_modules/cliui/node_modules/right-align/node_modules/align-text/node_modules/kind-of/node_modules/is-buffer/.zuul.yml b/node_modules/express-handlebars/node_modules/handlebars/node_modules/uglify-js/node_modules/yargs/node_modules/cliui/node_modules/right-align/node_modules/align-text/node_modules/kind-of/node_modules/is-buffer/.zuul.yml index dc1efba..eb3cae6 100644 --- a/node_modules/express-handlebars/node_modules/handlebars/node_modules/uglify-js/node_modules/yargs/node_modules/cliui/node_modules/right-align/node_modules/align-text/node_modules/kind-of/node_modules/is-buffer/.zuul.yml +++ b/node_modules/express-handlebars/node_modules/handlebars/node_modules/uglify-js/node_modules/yargs/node_modules/cliui/node_modules/right-align/node_modules/align-text/node_modules/kind-of/node_modules/is-buffer/.zuul.yml @@ -10,7 +10,5 @@ browsers: version: latest - name: ie version: 8..latest - - name: opera - version: 11..latest - name: android version: 5.0..latest diff --git a/node_modules/express-handlebars/node_modules/handlebars/node_modules/uglify-js/node_modules/yargs/node_modules/cliui/node_modules/right-align/node_modules/align-text/node_modules/kind-of/node_modules/is-buffer/README.md b/node_modules/express-handlebars/node_modules/handlebars/node_modules/uglify-js/node_modules/yargs/node_modules/cliui/node_modules/right-align/node_modules/align-text/node_modules/kind-of/node_modules/is-buffer/README.md index e6eb61a..cb6f356 100644 --- a/node_modules/express-handlebars/node_modules/handlebars/node_modules/uglify-js/node_modules/yargs/node_modules/cliui/node_modules/right-align/node_modules/align-text/node_modules/kind-of/node_modules/is-buffer/README.md +++ b/node_modules/express-handlebars/node_modules/handlebars/node_modules/uglify-js/node_modules/yargs/node_modules/cliui/node_modules/right-align/node_modules/align-text/node_modules/kind-of/node_modules/is-buffer/README.md @@ -1,6 +1,6 @@ # is-buffer [![travis][travis-image]][travis-url] [![npm][npm-image]][npm-url] [![downloads][downloads-image]][npm-url] -#### Determine if an object is a [`Buffer`](http://nodejs.org/api/buffer.html) (incl. [browser Buffers](https://github.com/feross/buffer)) +#### Determine if an object is a [`Buffer`](http://nodejs.org/api/buffer.html) (including the [browserify Buffer](https://github.com/feross/buffer)) [![saucelabs][saucelabs-image]][saucelabs-url] diff --git a/node_modules/express-handlebars/node_modules/handlebars/node_modules/uglify-js/node_modules/yargs/node_modules/cliui/node_modules/right-align/node_modules/align-text/node_modules/kind-of/node_modules/is-buffer/index.js b/node_modules/express-handlebars/node_modules/handlebars/node_modules/uglify-js/node_modules/yargs/node_modules/cliui/node_modules/right-align/node_modules/align-text/node_modules/kind-of/node_modules/is-buffer/index.js index ef02824..36c808e 100644 --- a/node_modules/express-handlebars/node_modules/handlebars/node_modules/uglify-js/node_modules/yargs/node_modules/cliui/node_modules/right-align/node_modules/align-text/node_modules/kind-of/node_modules/is-buffer/index.js +++ b/node_modules/express-handlebars/node_modules/handlebars/node_modules/uglify-js/node_modules/yargs/node_modules/cliui/node_modules/right-align/node_modules/align-text/node_modules/kind-of/node_modules/is-buffer/index.js @@ -1,17 +1,21 @@ -/** - * Determine if an object is Buffer +/*! + * Determine if an object is a Buffer * - * Author: Feross Aboukhadijeh - * License: MIT - * - * `npm install is-buffer` + * @author Feross Aboukhadijeh + * @license MIT */ +// The _isBuffer check is for Safari 5-7 support, because it's missing +// Object.prototype.constructor. Remove this eventually module.exports = function (obj) { - return !!(obj != null && - (obj._isBuffer || // For Safari 5-7 (missing Object.prototype.constructor) - (obj.constructor && - typeof obj.constructor.isBuffer === 'function' && - obj.constructor.isBuffer(obj)) - )) + return obj != null && (isBuffer(obj) || isSlowBuffer(obj) || !!obj._isBuffer) +} + +function isBuffer (obj) { + return !!obj.constructor && typeof obj.constructor.isBuffer === 'function' && obj.constructor.isBuffer(obj) +} + +// For Node v0.10 support. Remove this eventually. +function isSlowBuffer (obj) { + return typeof obj.readFloatLE === 'function' && typeof obj.slice === 'function' && isBuffer(obj.slice(0, 0)) } diff --git a/node_modules/express-handlebars/node_modules/handlebars/node_modules/uglify-js/node_modules/yargs/node_modules/cliui/node_modules/right-align/node_modules/align-text/node_modules/kind-of/node_modules/is-buffer/package.json b/node_modules/express-handlebars/node_modules/handlebars/node_modules/uglify-js/node_modules/yargs/node_modules/cliui/node_modules/right-align/node_modules/align-text/node_modules/kind-of/node_modules/is-buffer/package.json index b121605..1fddf0b 100644 --- a/node_modules/express-handlebars/node_modules/handlebars/node_modules/uglify-js/node_modules/yargs/node_modules/cliui/node_modules/right-align/node_modules/align-text/node_modules/kind-of/node_modules/is-buffer/package.json +++ b/node_modules/express-handlebars/node_modules/handlebars/node_modules/uglify-js/node_modules/yargs/node_modules/cliui/node_modules/right-align/node_modules/align-text/node_modules/kind-of/node_modules/is-buffer/package.json @@ -1,7 +1,7 @@ { "name": "is-buffer", - "description": "Determine if an object is Buffer", - "version": "1.1.3", + "description": "Determine if an object is a Buffer", + "version": "1.1.4", "author": { "name": "Feross Aboukhadijeh", "email": "feross@feross.org", @@ -12,13 +12,10 @@ }, "dependencies": {}, "devDependencies": { - "standard": "^6.0.5", + "standard": "^7.0.0", "tape": "^4.0.0", "zuul": "^3.0.0" }, - "engines": { - "node": ">=0.12" - }, "keywords": [ "buffer", "buffers", @@ -51,20 +48,20 @@ "testling": { "files": "test/*.js" }, - "gitHead": "dfd658d887e6b63254b89d22af1a755a39313455", - "homepage": "https://github.com/feross/is-buffer", - "_id": "is-buffer@1.1.3", - "_shasum": "db897fc3f7aca2d50de94b6c8c2896a4771627af", + "gitHead": "fd1a429f6ab8092f2e39cb5cc7175b5d9a986c31", + "homepage": "https://github.com/feross/is-buffer#readme", + "_id": "is-buffer@1.1.4", + "_shasum": "cfc86ccd5dc5a52fa80489111c6920c457e2d98b", "_from": "is-buffer@>=1.0.2 <2.0.0", - "_npmVersion": "2.14.12", - "_nodeVersion": "4.3.2", + "_npmVersion": "2.15.1", + "_nodeVersion": "0.10.46", "_npmUser": { "name": "feross", "email": "feross@feross.org" }, "dist": { - "shasum": "db897fc3f7aca2d50de94b6c8c2896a4771627af", - "tarball": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.3.tgz" + "shasum": "cfc86ccd5dc5a52fa80489111c6920c457e2d98b", + "tarball": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.4.tgz" }, "maintainers": [ { @@ -73,10 +70,9 @@ } ], "_npmOperationalInternal": { - "host": "packages-12-west.internal.npmjs.com", - "tmp": "tmp/is-buffer-1.1.3.tgz_1457390977775_0.6384289276320487" + "host": "packages-16-east.internal.npmjs.com", + "tmp": "tmp/is-buffer-1.1.4.tgz_1470267365943_0.6724087686743587" }, "directories": {}, - "_resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.3.tgz", - "readme": "ERROR: No README data found!" + "_resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.4.tgz" } diff --git a/node_modules/express-handlebars/node_modules/handlebars/node_modules/uglify-js/node_modules/yargs/node_modules/cliui/node_modules/right-align/node_modules/align-text/node_modules/kind-of/node_modules/is-buffer/test/basic.js b/node_modules/express-handlebars/node_modules/handlebars/node_modules/uglify-js/node_modules/yargs/node_modules/cliui/node_modules/right-align/node_modules/align-text/node_modules/kind-of/node_modules/is-buffer/test/basic.js index 38d883b..43b7c82 100644 --- a/node_modules/express-handlebars/node_modules/handlebars/node_modules/uglify-js/node_modules/yargs/node_modules/cliui/node_modules/right-align/node_modules/align-text/node_modules/kind-of/node_modules/is-buffer/test/basic.js +++ b/node_modules/express-handlebars/node_modules/handlebars/node_modules/uglify-js/node_modules/yargs/node_modules/cliui/node_modules/right-align/node_modules/align-text/node_modules/kind-of/node_modules/is-buffer/test/basic.js @@ -1,20 +1,25 @@ +var buffer = require('buffer') var isBuffer = require('../') var test = require('tape') test('is-buffer', function (t) { - t.ok(isBuffer(new Buffer(4)), 'new Buffer(4)') + t.equal(isBuffer(new Buffer(4)), true, 'new Buffer(4)') + t.equal(isBuffer(buffer.SlowBuffer(100)), true, 'SlowBuffer(100)') - t.notOk(isBuffer(undefined), 'undefined') - t.notOk(isBuffer(null), 'null') - t.notOk(isBuffer(''), 'empty string') - t.notOk(isBuffer(true), 'true') - t.notOk(isBuffer(false), 'false') - t.notOk(isBuffer(0), '0') - t.notOk(isBuffer(1), '1') - t.notOk(isBuffer(1.0), '1.0') - t.notOk(isBuffer('string'), 'string') - t.notOk(isBuffer({}), '{}') - t.notOk(isBuffer(function foo () {}), 'function foo () {}') + t.equal(isBuffer(undefined), false, 'undefined') + t.equal(isBuffer(null), false, 'null') + t.equal(isBuffer(''), false, 'empty string') + t.equal(isBuffer(true), false, 'true') + t.equal(isBuffer(false), false, 'false') + t.equal(isBuffer(0), false, '0') + t.equal(isBuffer(1), false, '1') + t.equal(isBuffer(1.0), false, '1.0') + t.equal(isBuffer('string'), false, 'string') + t.equal(isBuffer({}), false, '{}') + t.equal(isBuffer([]), false, '[]') + t.equal(isBuffer(function foo () {}), false, 'function foo () {}') + t.equal(isBuffer({ isBuffer: null }), false, '{ isBuffer: null }') + t.equal(isBuffer({ isBuffer: function () { throw new Error() } }), false, '{ isBuffer: function () { throw new Error() } }') t.end() }) diff --git a/node_modules/express-handlebars/node_modules/handlebars/node_modules/uglify-js/node_modules/yargs/node_modules/cliui/node_modules/right-align/node_modules/align-text/node_modules/kind-of/package.json b/node_modules/express-handlebars/node_modules/handlebars/node_modules/uglify-js/node_modules/yargs/node_modules/cliui/node_modules/right-align/node_modules/align-text/node_modules/kind-of/package.json index bc63ba5..6b3c3fe 100644 --- a/node_modules/express-handlebars/node_modules/handlebars/node_modules/uglify-js/node_modules/yargs/node_modules/cliui/node_modules/right-align/node_modules/align-text/node_modules/kind-of/package.json +++ b/node_modules/express-handlebars/node_modules/handlebars/node_modules/uglify-js/node_modules/yargs/node_modules/cliui/node_modules/right-align/node_modules/align-text/node_modules/kind-of/package.json @@ -1,7 +1,7 @@ { "name": "kind-of", "description": "Get the native type of a value.", - "version": "3.0.3", + "version": "3.0.4", "homepage": "https://github.com/jonschlinkert/kind-of", "author": { "name": "Jon Schlinkert", @@ -16,7 +16,9 @@ }, "license": "MIT", "files": [ - "index.js" + "index.js", + "LICENSE", + "README.md" ], "main": "index.js", "engines": { @@ -31,12 +33,11 @@ }, "devDependencies": { "ansi-bold": "^0.1.1", - "benchmarked": "^0.1.3", - "browserify": "^11.0.1", - "glob": "^4.3.5", + "benchmarked": "^0.2.5", + "browserify": "^13.1.0", + "glob": "^7.0.5", "gulp-format-md": "^0.1.9", - "mocha": "*", - "should": "*", + "mocha": "^2.5.3", "type-of": "^2.0.1", "typeof": "^1.0.0" }, @@ -54,6 +55,7 @@ "kind-of", "number", "object", + "of", "regexp", "string", "test", @@ -85,12 +87,12 @@ "verb" ] }, - "gitHead": "c1023c4839a91abd580a4e71fd0763f7fc2ad3f4", - "_id": "kind-of@3.0.3", - "_shasum": "c61608747d815b0362556db3276362a7a38aded3", + "gitHead": "8f93765a6bbbe350e1ba68e790d1ff337b91331a", + "_id": "kind-of@3.0.4", + "_shasum": "7b8ecf18a4e17f8269d73b501c9f232c96887a74", "_from": "kind-of@>=3.0.2 <4.0.0", - "_npmVersion": "3.6.0", - "_nodeVersion": "5.5.0", + "_npmVersion": "3.10.3", + "_nodeVersion": "6.3.0", "_npmUser": { "name": "jonschlinkert", "email": "github@sellside.com" @@ -106,14 +108,13 @@ } ], "dist": { - "shasum": "c61608747d815b0362556db3276362a7a38aded3", - "tarball": "https://registry.npmjs.org/kind-of/-/kind-of-3.0.3.tgz" + "shasum": "7b8ecf18a4e17f8269d73b501c9f232c96887a74", + "tarball": "https://registry.npmjs.org/kind-of/-/kind-of-3.0.4.tgz" }, "_npmOperationalInternal": { - "host": "packages-12-west.internal.npmjs.com", - "tmp": "tmp/kind-of-3.0.3.tgz_1462262974577_0.29414567071944475" + "host": "packages-16-east.internal.npmjs.com", + "tmp": "tmp/kind-of-3.0.4.tgz_1469811230830_0.8813814013265073" }, "directories": {}, - "_resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.0.3.tgz", - "readme": "ERROR: No README data found!" + "_resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.0.4.tgz" } diff --git a/node_modules/express-handlebars/node_modules/handlebars/node_modules/uglify-js/node_modules/yargs/node_modules/cliui/node_modules/right-align/node_modules/align-text/package.json b/node_modules/express-handlebars/node_modules/handlebars/node_modules/uglify-js/node_modules/yargs/node_modules/cliui/node_modules/right-align/node_modules/align-text/package.json index 3cc2e0b..e36d9c2 100644 --- a/node_modules/express-handlebars/node_modules/handlebars/node_modules/uglify-js/node_modules/yargs/node_modules/cliui/node_modules/right-align/node_modules/align-text/package.json +++ b/node_modules/express-handlebars/node_modules/handlebars/node_modules/uglify-js/node_modules/yargs/node_modules/cliui/node_modules/right-align/node_modules/align-text/package.json @@ -52,7 +52,7 @@ "gitHead": "7f08e823a54c6bda319d875895813537a66a4c5e", "_id": "align-text@0.1.4", "_shasum": "0cd90a561093f35d0a99256c22b7069433fad117", - "_from": "align-text@>=0.1.3 <0.2.0", + "_from": "align-text@>=0.1.1 <0.2.0", "_npmVersion": "3.6.0", "_nodeVersion": "5.5.0", "_npmUser": { diff --git a/node_modules/express-session/node_modules/cookie/package.json b/node_modules/express-session/node_modules/cookie/package.json index bb3556a..a24d81c 100644 --- a/node_modules/express-session/node_modules/cookie/package.json +++ b/node_modules/express-session/node_modules/cookie/package.json @@ -19,7 +19,7 @@ ], "repository": { "type": "git", - "url": "git+https://github.com/jshttp/cookie.git" + "url": "https://github.com/jshttp/cookie" }, "devDependencies": { "istanbul": "0.4.3", @@ -67,6 +67,5 @@ "tmp": "tmp/cookie-0.3.1.tgz_1464323556714_0.6435900838114321" }, "directories": {}, - "_resolved": "https://registry.npmjs.org/cookie/-/cookie-0.3.1.tgz", - "readme": "ERROR: No README data found!" + "_resolved": "https://registry.npmjs.org/cookie/-/cookie-0.3.1.tgz" } diff --git a/node_modules/express-session/node_modules/uid-safe/package.json b/node_modules/express-session/node_modules/uid-safe/package.json index 295b4a9..1baa27a 100644 --- a/node_modules/express-session/node_modules/uid-safe/package.json +++ b/node_modules/express-session/node_modules/uid-safe/package.json @@ -54,7 +54,7 @@ "homepage": "https://github.com/crypto-utils/uid-safe#readme", "_id": "uid-safe@2.1.1", "_shasum": "3dbf9436b528be9f52882c05a6216c3763db3666", - "_from": "uid-safe@2.1.1", + "_from": "uid-safe@>=2.1.1 <2.2.0", "_npmVersion": "2.15.1", "_nodeVersion": "4.4.3", "_npmUser": { diff --git a/node_modules/express/node_modules/array-flatten/package.json b/node_modules/express/node_modules/array-flatten/package.json index b1636ee..d36db1f 100644 --- a/node_modules/express/node_modules/array-flatten/package.json +++ b/node_modules/express/node_modules/array-flatten/package.json @@ -57,6 +57,5 @@ "tarball": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz" }, "directories": {}, - "_resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", - "readme": "ERROR: No README data found!" + "_resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz" } diff --git a/node_modules/express/node_modules/finalhandler/package.json b/node_modules/express/node_modules/finalhandler/package.json index b1bd0ea..19267d2 100644 --- a/node_modules/express/node_modules/finalhandler/package.json +++ b/node_modules/express/node_modules/finalhandler/package.json @@ -9,7 +9,7 @@ "license": "MIT", "repository": { "type": "git", - "url": "https://github.com/pillarjs/finalhandler" + "url": "git+https://github.com/pillarjs/finalhandler.git" }, "dependencies": { "debug": "~2.2.0", @@ -70,5 +70,6 @@ "tmp": "tmp/finalhandler-0.5.0.tgz_1466028655505_0.19758180482313037" }, "directories": {}, - "_resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-0.5.0.tgz" + "_resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-0.5.0.tgz", + "readme": "ERROR: No README data found!" } diff --git a/node_modules/mocha/node_modules/diff/package.json b/node_modules/mocha/node_modules/diff/package.json index 0abb5bb..cc2af94 100644 --- a/node_modules/mocha/node_modules/diff/package.json +++ b/node_modules/mocha/node_modules/diff/package.json @@ -59,5 +59,6 @@ "tarball": "https://registry.npmjs.org/diff/-/diff-1.4.0.tgz" }, "directories": {}, - "_resolved": "https://registry.npmjs.org/diff/-/diff-1.4.0.tgz" + "_resolved": "https://registry.npmjs.org/diff/-/diff-1.4.0.tgz", + "readme": "ERROR: No README data found!" } diff --git a/node_modules/mocha/node_modules/escape-string-regexp/package.json b/node_modules/mocha/node_modules/escape-string-regexp/package.json index cd7e9d3..28ad1f9 100644 --- a/node_modules/mocha/node_modules/escape-string-regexp/package.json +++ b/node_modules/mocha/node_modules/escape-string-regexp/package.json @@ -5,7 +5,7 @@ "license": "MIT", "repository": { "type": "git", - "url": "https://github.com/sindresorhus/escape-string-regexp" + "url": "git+https://github.com/sindresorhus/escape-string-regexp.git" }, "author": { "name": "Sindre Sorhus", @@ -64,5 +64,6 @@ "tarball": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.2.tgz" }, "directories": {}, - "_resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.2.tgz" + "_resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.2.tgz", + "readme": "ERROR: No README data found!" } diff --git a/node_modules/mocha/node_modules/glob/node_modules/minimatch/node_modules/lru-cache/package.json b/node_modules/mocha/node_modules/glob/node_modules/minimatch/node_modules/lru-cache/package.json index 233bca6..280389b 100644 --- a/node_modules/mocha/node_modules/glob/node_modules/minimatch/node_modules/lru-cache/package.json +++ b/node_modules/mocha/node_modules/glob/node_modules/minimatch/node_modules/lru-cache/package.json @@ -53,5 +53,6 @@ } ], "directories": {}, - "_resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-2.7.3.tgz" + "_resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-2.7.3.tgz", + "readme": "ERROR: No README data found!" } diff --git a/node_modules/mocha/node_modules/glob/node_modules/minimatch/node_modules/sigmund/package.json b/node_modules/mocha/node_modules/glob/node_modules/minimatch/node_modules/sigmund/package.json index 658dbb8..546c28c 100644 --- a/node_modules/mocha/node_modules/glob/node_modules/minimatch/node_modules/sigmund/package.json +++ b/node_modules/mocha/node_modules/glob/node_modules/minimatch/node_modules/sigmund/package.json @@ -55,5 +55,6 @@ "email": "i@izs.me" } ], - "_resolved": "https://registry.npmjs.org/sigmund/-/sigmund-1.0.1.tgz" + "_resolved": "https://registry.npmjs.org/sigmund/-/sigmund-1.0.1.tgz", + "readme": "ERROR: No README data found!" } diff --git a/node_modules/mocha/node_modules/glob/node_modules/minimatch/package.json b/node_modules/mocha/node_modules/glob/node_modules/minimatch/package.json index b245f06..68b547b 100644 --- a/node_modules/mocha/node_modules/glob/node_modules/minimatch/package.json +++ b/node_modules/mocha/node_modules/glob/node_modules/minimatch/package.json @@ -53,5 +53,6 @@ }, "deprecated": "Please update to minimatch 3.0.2 or higher to avoid a RegExp DoS issue", "directories": {}, - "_resolved": "https://registry.npmjs.org/minimatch/-/minimatch-0.3.0.tgz" + "_resolved": "https://registry.npmjs.org/minimatch/-/minimatch-0.3.0.tgz", + "readme": "ERROR: No README data found!" } diff --git a/node_modules/mocha/node_modules/glob/package.json b/node_modules/mocha/node_modules/glob/package.json index d52c4b7..97022f1 100644 --- a/node_modules/mocha/node_modules/glob/package.json +++ b/node_modules/mocha/node_modules/glob/package.json @@ -53,5 +53,6 @@ "tarball": "https://registry.npmjs.org/glob/-/glob-3.2.11.tgz" }, "directories": {}, - "_resolved": "https://registry.npmjs.org/glob/-/glob-3.2.11.tgz" + "_resolved": "https://registry.npmjs.org/glob/-/glob-3.2.11.tgz", + "readme": "ERROR: No README data found!" } diff --git a/node_modules/mocha/node_modules/growl/package.json b/node_modules/mocha/node_modules/growl/package.json index 2fde90c..a8d964a 100644 --- a/node_modules/mocha/node_modules/growl/package.json +++ b/node_modules/mocha/node_modules/growl/package.json @@ -46,5 +46,6 @@ "tmp": "tmp/growl-1.9.2.tgz_1456056369289_0.9604133665561676" }, "directories": {}, - "_resolved": "https://registry.npmjs.org/growl/-/growl-1.9.2.tgz" + "_resolved": "https://registry.npmjs.org/growl/-/growl-1.9.2.tgz", + "readme": "ERROR: No README data found!" } diff --git a/node_modules/mocha/node_modules/jade/node_modules/commander/package.json b/node_modules/mocha/node_modules/jade/node_modules/commander/package.json index b0bab56..4dda069 100644 --- a/node_modules/mocha/node_modules/jade/node_modules/commander/package.json +++ b/node_modules/mocha/node_modules/jade/node_modules/commander/package.json @@ -51,5 +51,10 @@ "directories": {}, "_shasum": "fa68a14f6a945d54dbbe50d8cdb3320e9e3b1a06", "_resolved": "https://registry.npmjs.org/commander/-/commander-0.6.1.tgz", - "_from": "commander@0.6.1" + "_from": "commander@0.6.1", + "bugs": { + "url": "https://github.com/visionmedia/commander.js/issues" + }, + "readme": "ERROR: No README data found!", + "homepage": "https://github.com/visionmedia/commander.js#readme" } diff --git a/node_modules/mocha/node_modules/jade/node_modules/mkdirp/package.json b/node_modules/mocha/node_modules/jade/node_modules/mkdirp/package.json index 561abd3..8fe36d6 100644 --- a/node_modules/mocha/node_modules/jade/node_modules/mkdirp/package.json +++ b/node_modules/mocha/node_modules/jade/node_modules/mkdirp/package.json @@ -49,5 +49,10 @@ "directories": {}, "_shasum": "1bbf5ab1ba827af23575143490426455f481fe1e", "_resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.3.0.tgz", - "_from": "mkdirp@0.3.0" + "_from": "mkdirp@0.3.0", + "bugs": { + "url": "https://github.com/substack/node-mkdirp/issues" + }, + "readme": "ERROR: No README data found!", + "homepage": "https://github.com/substack/node-mkdirp#readme" } diff --git a/node_modules/mocha/node_modules/mkdirp/package.json b/node_modules/mocha/node_modules/mkdirp/package.json index 0638efa..ebc1a9c 100644 --- a/node_modules/mocha/node_modules/mkdirp/package.json +++ b/node_modules/mocha/node_modules/mkdirp/package.json @@ -55,6 +55,5 @@ } ], "directories": {}, - "_resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", - "readme": "ERROR: No README data found!" + "_resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz" } diff --git a/node_modules/mocha/node_modules/supports-color/package.json b/node_modules/mocha/node_modules/supports-color/package.json index cf4f88a..20a97bb 100644 --- a/node_modules/mocha/node_modules/supports-color/package.json +++ b/node_modules/mocha/node_modules/supports-color/package.json @@ -5,7 +5,7 @@ "license": "MIT", "repository": { "type": "git", - "url": "https://github.com/sindresorhus/supports-color" + "url": "git+https://github.com/sindresorhus/supports-color.git" }, "author": { "name": "Sindre Sorhus", @@ -80,5 +80,6 @@ "tarball": "https://registry.npmjs.org/supports-color/-/supports-color-1.2.0.tgz" }, "directories": {}, - "_resolved": "https://registry.npmjs.org/supports-color/-/supports-color-1.2.0.tgz" + "_resolved": "https://registry.npmjs.org/supports-color/-/supports-color-1.2.0.tgz", + "readme": "ERROR: No README data found!" } diff --git a/node_modules/mocha/node_modules/to-iso-string/package.json b/node_modules/mocha/node_modules/to-iso-string/package.json index fdbcb7b..15ca77e 100644 --- a/node_modules/mocha/node_modules/to-iso-string/package.json +++ b/node_modules/mocha/node_modules/to-iso-string/package.json @@ -45,5 +45,6 @@ ], "deprecated": "to-iso-string has been deprecated, use @segment/to-iso-string instead.", "directories": {}, - "_resolved": "https://registry.npmjs.org/to-iso-string/-/to-iso-string-0.0.2.tgz" + "_resolved": "https://registry.npmjs.org/to-iso-string/-/to-iso-string-0.0.2.tgz", + "readme": "ERROR: No README data found!" } diff --git a/node_modules/mocha/package.json b/node_modules/mocha/package.json index cd9b720..da3d62d 100644 --- a/node_modules/mocha/package.json +++ b/node_modules/mocha/package.json @@ -1276,5 +1276,6 @@ "tmp": "tmp/mocha-2.5.3.tgz_1464165855561_0.11252999701537192" }, "directories": {}, - "_resolved": "https://registry.npmjs.org/mocha/-/mocha-2.5.3.tgz" + "_resolved": "https://registry.npmjs.org/mocha/-/mocha-2.5.3.tgz", + "readme": "ERROR: No README data found!" } diff --git a/node_modules/mongodb/HISTORY.md b/node_modules/mongodb/HISTORY.md index 5bf219b..73ed3a9 100644 --- a/node_modules/mongodb/HISTORY.md +++ b/node_modules/mongodb/HISTORY.md @@ -1,3 +1,12 @@ +2.2.5 2016-07-28 +---------------- +* Updated mongodb-core to 2.0.7. +* Allow primary to be returned when secondaryPreferred is passed (Issue #117, https://github.com/dhendo). +* Added better warnings when passing in illegal seed list members to a Mongos topology. +* Minor attemptReconnect bug that would cause multiple attemptReconnect to run in parallel. +* Fix wrong opType passed to disconnectHandler.add (Issue #121, https://github.com/adrian-gierakowski) +* Implemented domain backward comp support enabled via domainsEnabled options on Server/ReplSet/Mongos and MongoClient.connect. + 2.2.4 2016-07-19 ---------------- * NPM corrupted upload fix. diff --git a/node_modules/mongodb/README.md b/node_modules/mongodb/README.md deleted file mode 100644 index 73f2785..0000000 --- a/node_modules/mongodb/README.md +++ /dev/null @@ -1,415 +0,0 @@ -[![NPM](https://nodei.co/npm/mongodb.png?downloads=true&downloadRank=true)](https://nodei.co/npm/mongodb/) [![NPM](https://nodei.co/npm-dl/mongodb.png?months=6&height=3)](https://nodei.co/npm/mongodb/) - -[![Build Status](https://secure.travis-ci.org/mongodb/node-mongodb-native.svg?branch=2.1)](http://travis-ci.org/mongodb/node-mongodb-native) -[![Coverage Status](https://coveralls.io/repos/github/mongodb/node-mongodb-native/badge.svg?branch=2.1)](https://coveralls.io/github/mongodb/node-mongodb-native?branch=2.1) -[![Gitter](https://badges.gitter.im/Join Chat.svg)](https://gitter.im/mongodb/node-mongodb-native?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge) - -# Description - -The official [MongoDB](https://www.mongodb.com/) driver for Node.js. Provides a high-level API on top of [mongodb-core](https://www.npmjs.com/package/mongodb-core) that is meant for end users. - -## MongoDB Node.JS Driver - -| what | where | -|---------------|------------------------------------------------| -| documentation | http://mongodb.github.io/node-mongodb-native/ | -| api-doc | http://mongodb.github.io/node-mongodb-native/2.2/api/ | -| source | https://github.com/mongodb/node-mongodb-native | -| mongodb | http://www.mongodb.org/ | - -### Blogs of Engineers involved in the driver -- Christian Kvalheim [@christkv](https://twitter.com/christkv) - -### Bugs / Feature Requests - -Think you’ve found a bug? Want to see a new feature in node-mongodb-native? Please open a -case in our issue management tool, JIRA: - -- Create an account and login . -- Navigate to the NODE project . -- Click **Create Issue** - Please provide as much information as possible about the issue type and how to reproduce it. - -Bug reports in JIRA for all driver projects (i.e. NODE, PYTHON, CSHARP, JAVA) and the -Core Server (i.e. SERVER) project are **public**. - -### Questions and Bug Reports - - * mailing list: https://groups.google.com/forum/#!forum/node-mongodb-native - * jira: http://jira.mongodb.org/ - -### Change Log - -http://jira.mongodb.org/browse/NODE - -# Installation - -The recommended way to get started using the Node.js 2.0 driver is by using the `NPM` (Node Package Manager) to install the dependency in your project. - -## MongoDB Driver - -Given that you have created your own project using `npm init` we install the mongodb driver and it's dependencies by executing the following `NPM` command. - -``` -npm install mongodb --save -``` - -This will download the MongoDB driver and add a dependency entry in your `package.json` file. - -## Troubleshooting - -The MongoDB driver depends on several other packages. These are. - -* mongodb-core -* bson -* kerberos -* node-gyp - -The `kerberos` package is a C++ extension that requires a build environment to be installed on your system. You must be able to build node.js itself to be able to compile and install the `kerberos` module. Furthermore the `kerberos` module requires the MIT Kerberos package to correctly compile on UNIX operating systems. Consult your UNIX operation system package manager what libraries to install. - -{{% note class="important" %}} -Windows already contains the SSPI API used for Kerberos authentication. However you will need to install a full compiler tool chain using visual studio C++ to correctly install the kerberos extension. -{{% /note %}} - -### Diagnosing on UNIX - -If you don’t have the build essentials it won’t build. In the case of linux you will need gcc and g++, node.js with all the headers and python. The easiest way to figure out what’s missing is by trying to build the kerberos project. You can do this by performing the following steps. - -``` -git clone https://github.com/christkv/kerberos.git -cd kerberos -npm install -``` - -If all the steps complete you have the right toolchain installed. If you get node-gyp not found you need to install it globally by doing. - -``` -npm install -g node-gyp -``` - -If correctly compiles and runs the tests you are golden. We can now try to install the mongod driver by performing the following command. - -``` -cd yourproject -npm install mongodb --save -``` - -If it still fails the next step is to examine the npm log. Rerun the command but in this case in verbose mode. - -``` -npm --loglevel verbose install mongodb -``` - -This will print out all the steps npm is performing while trying to install the module. - -### Diagnosing on Windows - -A known compiler tool chain known to work for compiling `kerberos` on windows is the following. - -* Visual Studio c++ 2010 (do not use higher versions) -* Windows 7 64bit SDK -* Python 2.7 or higher - -Open visual studio command prompt. Ensure node.exe is in your path and install node-gyp. - -``` -npm install -g node-gyp -``` - -Next you will have to build the project manually to test it. Use any tool you use with git and grab the repo. - -``` -git clone https://github.com/christkv/kerberos.git -cd kerberos -npm install -node-gyp rebuild -``` - -This should rebuild the driver successfully if you have everything set up correctly. - -### Other possible issues - -Your python installation might be hosed making gyp break. I always recommend that you test your deployment environment first by trying to build node itself on the server in question as this should unearth any issues with broken packages (and there are a lot of broken packages out there). - -Another thing is to ensure your user has write permission to wherever the node modules are being installed. - -QuickStart -========== -The quick start guide will show you how to setup a simple application using node.js and MongoDB. Its scope is only how to set up the driver and perform the simple crud operations. For more in depth coverage we encourage reading the tutorials. - -Create the package.json file ----------------------------- -Let's create a directory where our application will live. In our case we will put this under our projects directory. - -``` -mkdir myproject -cd myproject -``` - -Enter the following command and answer the questions to create the initial structure for your new project - -``` -npm init -``` - -Next we need to edit the generated package.json file to add the dependency for the MongoDB driver. The package.json file below is just an example and your will look different depending on how you answered the questions after entering `npm init` - -``` -{ - "name": "myproject", - "version": "1.0.0", - "description": "My first project", - "main": "index.js", - "repository": { - "type": "git", - "url": "git://github.com/christkv/myfirstproject.git" - }, - "dependencies": { - "mongodb": "~2.0" - }, - "author": "Christian Kvalheim", - "license": "Apache 2.0", - "bugs": { - "url": "https://github.com/christkv/myfirstproject/issues" - }, - "homepage": "https://github.com/christkv/myfirstproject" -} -``` - -Save the file and return to the shell or command prompt and use **NPM** to install all the dependencies. - -``` -npm install -``` - -You should see **NPM** download a lot of files. Once it's done you'll find all the downloaded packages under the **node_modules** directory. - -Booting up a MongoDB Server ---------------------------- -Let's boot up a MongoDB server instance. Download the right MongoDB version from [MongoDB](http://www.mongodb.org), open a new shell or command line and ensure the **mongod** command is in the shell or command line path. Now let's create a database directory (in our case under **/data**). - -``` -mongod --dbpath=/data --port 27017 -``` - -You should see the **mongod** process start up and print some status information. - -Connecting to MongoDB ---------------------- -Let's create a new **app.js** file that we will use to show the basic CRUD operations using the MongoDB driver. - -First let's add code to connect to the server and the database **myproject**. - -```js -var MongoClient = require('mongodb').MongoClient - , assert = require('assert'); - -// Connection URL -var url = 'mongodb://localhost:27017/myproject'; -// Use connect method to connect to the Server -MongoClient.connect(url, function(err, db) { - assert.equal(null, err); - console.log("Connected correctly to server"); - - db.close(); -}); -``` - -Given that you booted up the **mongod** process earlier the application should connect successfully and print **Connected correctly to server** to the console. - -Let's Add some code to show the different CRUD operations available. - -Inserting a Document --------------------- -Let's create a function that will insert some documents for us. - -```js -var insertDocuments = function(db, callback) { - // Get the documents collection - var collection = db.collection('documents'); - // Insert some documents - collection.insertMany([ - {a : 1}, {a : 2}, {a : 3} - ], function(err, result) { - assert.equal(err, null); - assert.equal(3, result.result.n); - assert.equal(3, result.ops.length); - console.log("Inserted 3 documents into the document collection"); - callback(result); - }); -} -``` - -The insert command will return a results object that contains several fields that might be useful. - -* **result** Contains the result document from MongoDB -* **ops** Contains the documents inserted with added **_id** fields -* **connection** Contains the connection used to perform the insert - -Let's add call the **insertDocuments** command to the **MongoClient.connect** method callback. - -```js -var MongoClient = require('mongodb').MongoClient - , assert = require('assert'); - -// Connection URL -var url = 'mongodb://localhost:27017/myproject'; -// Use connect method to connect to the Server -MongoClient.connect(url, function(err, db) { - assert.equal(null, err); - console.log("Connected correctly to server"); - - insertDocuments(db, function() { - db.close(); - }); -}); -``` - -We can now run the update **app.js** file. - -``` -node app.js -``` - -You should see the following output after running the **app.js** file. - -``` -Connected correctly to server -Inserted 3 documents into the document collection -``` - -Updating a document -------------------- -Let's look at how to do a simple document update by adding a new field **b** to the document that has the field **a** set to **2**. - -```js -var updateDocument = function(db, callback) { - // Get the documents collection - var collection = db.collection('documents'); - // Update document where a is 2, set b equal to 1 - collection.updateOne({ a : 2 } - , { $set: { b : 1 } }, function(err, result) { - assert.equal(err, null); - assert.equal(1, result.result.n); - console.log("Updated the document with the field a equal to 2"); - callback(result); - }); -} -``` - -The method will update the first document where the field **a** is equal to **2** by adding a new field **b** to the document set to **1**. Let's update the callback function from **MongoClient.connect** to include the update method. - -```js -var MongoClient = require('mongodb').MongoClient - , assert = require('assert'); - -// Connection URL -var url = 'mongodb://localhost:27017/myproject'; -// Use connect method to connect to the Server -MongoClient.connect(url, function(err, db) { - assert.equal(null, err); - console.log("Connected correctly to server"); - - insertDocuments(db, function() { - updateDocument(db, function() { - db.close(); - }); - }); -}); -``` - -Delete a document ------------------ -Next lets delete the document where the field **a** equals to **3**. - -```js -var deleteDocument = function(db, callback) { - // Get the documents collection - var collection = db.collection('documents'); - // Insert some documents - collection.deleteOne({ a : 3 }, function(err, result) { - assert.equal(err, null); - assert.equal(1, result.result.n); - console.log("Removed the document with the field a equal to 3"); - callback(result); - }); -} -``` - -This will delete the first document where the field **a** equals to **3**. Let's add the method to the **MongoClient -.connect** callback function. - -```js -var MongoClient = require('mongodb').MongoClient - , assert = require('assert'); - -// Connection URL -var url = 'mongodb://localhost:27017/myproject'; -// Use connect method to connect to the Server -MongoClient.connect(url, function(err, db) { - assert.equal(null, err); - console.log("Connected correctly to server"); - - insertDocuments(db, function() { - updateDocument(db, function() { - deleteDocument(db, function() { - db.close(); - }); - }); - }); -}); -``` - -Finally let's retrieve all the documents using a simple find. - -Find All Documents ------------------- -We will finish up the Quickstart CRUD methods by performing a simple query that returns all the documents matching the query. - -```js -var findDocuments = function(db, callback) { - // Get the documents collection - var collection = db.collection('documents'); - // Find some documents - collection.find({}).toArray(function(err, docs) { - assert.equal(err, null); - assert.equal(2, docs.length); - console.log("Found the following records"); - console.dir(docs); - callback(docs); - }); -} -``` - -This query will return all the documents in the **documents** collection. Since we deleted a document the total -documents returned is **2**. Finally let's add the findDocument method to the **MongoClient.connect** callback. - -```js -var MongoClient = require('mongodb').MongoClient - , assert = require('assert'); - -// Connection URL -var url = 'mongodb://localhost:27017/myproject'; -// Use connect method to connect to the Server -MongoClient.connect(url, function(err, db) { - assert.equal(null, err); - console.log("Connected correctly to server"); - - insertDocuments(db, function() { - updateDocument(db, function() { - deleteDocument(db, function() { - findDocuments(db, function() { - db.close(); - }); - }); - }); - }); -}); -``` - -This concludes the QuickStart of connecting and performing some Basic operations using the MongoDB Node.js driver. For more detailed information you can look at the tutorials covering more specific topics of interest. - -## Next Steps - - * [MongoDB Documentation](http://mongodb.org/) - * [Read about Schemas](http://learnmongodbthehardway.com/) - * [Star us on GitHub](https://github.com/mongodb/node-mongodb-native) diff --git a/node_modules/mongodb/lib/aggregation_cursor.js b/node_modules/mongodb/lib/aggregation_cursor.js index 3a506c2..7546ee3 100644 --- a/node_modules/mongodb/lib/aggregation_cursor.js +++ b/node_modules/mongodb/lib/aggregation_cursor.js @@ -13,8 +13,7 @@ var inherits = require('util').inherits , Readable = require('stream').Readable || require('readable-stream').Readable , Define = require('./metadata') , CoreCursor = require('./cursor') - , Query = require('mongodb-core').Query - , CoreReadPreference = require('mongodb-core').ReadPreference; + , Query = require('mongodb-core').Query; /** * @fileOverview The **AggregationCursor** class is an internal class that embodies an aggregation cursor on MongoDB diff --git a/node_modules/mongodb/lib/bulk/ordered.js b/node_modules/mongodb/lib/bulk/ordered.js index a910689..762e861 100644 --- a/node_modules/mongodb/lib/bulk/ordered.js +++ b/node_modules/mongodb/lib/bulk/ordered.js @@ -318,6 +318,7 @@ OrderedBulkOperation.prototype.raw = function(op) { var multi = op.updateOne || op.replaceOne ? false : true; var operation = {q: op[key].filter, u: op[key].update || op[key].replacement, multi: multi} operation.upsert = op[key].upsert ? true: false; + if(op.collation) operation.collation = op.collation; return addToOperationsList(this, common.UPDATE, operation); } @@ -331,6 +332,7 @@ OrderedBulkOperation.prototype.raw = function(op) { if(op.deleteOne || op.deleteMany) { var limit = op.deleteOne ? 1 : 0; var operation = {q: op[key].filter, limit: limit} + if(op.collation) operation.collation = op.collation; return addToOperationsList(this, common.REMOVE, operation); } diff --git a/node_modules/mongodb/lib/collection.js b/node_modules/mongodb/lib/collection.js index bbe1e3b..5a94403 100644 --- a/node_modules/mongodb/lib/collection.js +++ b/node_modules/mongodb/lib/collection.js @@ -122,6 +122,8 @@ var Collection = function(db, topology, dbName, name, pkFactory, options) { , promiseLibrary: promiseLibrary // Read Concern , readConcern: options.readConcern + // Collation + , collation: options.collation } } @@ -280,6 +282,7 @@ Collection.prototype.find = function() { // Add read preference if needed newOptions = getReadPreference(this, newOptions, this.s.db, this); + // Set slave ok to true if read preference different from primary if(newOptions.readPreference != null && (newOptions.readPreference != 'primary' || newOptions.readPreference.mode != 'primary')) { @@ -351,6 +354,9 @@ Collection.prototype.find = function() { findCommand.readConcern = this.s.readConcern; } + // Decorate find command with collation options + decorateWithCollation(findCommand, this, options); + // Create the cursor if(typeof callback == 'function') return handleCallback(callback, null, this.s.topology.cursor(this.s.namespace, findCommand, newOptions)); return this.s.topology.cursor(this.s.namespace, findCommand, newOptions); @@ -507,9 +513,7 @@ Collection.prototype.insertMany = function(docs, options, callback) { // Return a Promise return new this.s.promiseLibrary(function(resolve, reject) { - // console.log("########## insertMany 0") bulkWrite(self, operations, options, function(err, r) { - // console.log("########## insertMany 1") if(err) return reject(err); resolve(mapInserManyResults(docs, r)); }); @@ -601,9 +605,25 @@ var bulkWrite = function(self, operations, options, callback) { // Create the bulk operation var bulk = options.ordered == true || options.ordered == null ? self.initializeOrderedBulkOp(options) : self.initializeUnorderedBulkOp(options); + // Do we have a collation + var collation = false; + // for each op go through and add to the bulk try { for(var i = 0; i < operations.length; i++) { + // Get the operation type + var key = Object.keys(operations[i])[0]; + // Check if we have a collation + if(operations[i][key].collation) { + collation = true; + } + + // // Have we specified collation, apply it + // decorateWithCollation(operations[i], self, options); + // console.log("================ bulkWrite") + // console.dir(operations[i]) + + // Pass to the raw bulk bulk.raw(operations[i]); } } catch(err) { @@ -613,6 +633,12 @@ var bulkWrite = function(self, operations, options, callback) { // Final options for write concern var finalOptions = writeConcern(shallowClone(options), self.s.db, self, options); var writeCon = finalOptions.writeConcern ? finalOptions.writeConcern : {}; + var capabilities = self.s.topology.capabilities(); + + // Did the user pass in a collation, check if our write server supports it + if(collation && capabilities && !capabilities.commandsTakeCollation) { + return callback(new MongoError(f('server/primary/mongos does not support collation'))); + } // Execute the bulk bulk.execute(writeCon, function(err, r) { @@ -623,11 +649,6 @@ var bulkWrite = function(self, operations, options, callback) { return callback(toError(r.getWriteErrorAt(0)), r); } - // console.log("!!!!!! BULK EXECUTE FINISHED") - // console.dir(err) - // console.dir(r) - - // if(err) return callback(err); r.insertedCount = r.nInserted; r.matchedCount = r.nMatched; r.modifiedCount = r.nModified || 0; @@ -1006,6 +1027,9 @@ var updateDocuments = function(self, selector, document, options, callback) { op.upsert = typeof options.upsert == 'boolean' ? options.upsert : false; op.multi = typeof options.multi == 'boolean' ? options.multi : false; + // Have we specified collation + decorateWithCollation(finalOptions, self, options); + // Update options self.s.topology.update(self.s.namespace, [op], finalOptions, function(err, result) { if(callback == null) return; @@ -1161,6 +1185,7 @@ Collection.prototype.deleteMany = function(filter, options, callback) { var deleteMany = function(self, filter, options, callback) { options.single = false; + removeDocuments(self, filter, options, function(err, r) { if(callback == null) return; if(err && callback) return callback(err); @@ -1192,6 +1217,9 @@ var removeDocuments = function(self, selector, options, callback) { var op = {q: selector, limit: 0}; if(options.single) op.limit = 1; + // Have we specified collation + decorateWithCollation(finalOptions, self, options); + // Execute the remove self.s.topology.remove(self.s.namespace, [op], finalOptions, function(err, result) { if(callback == null) return; @@ -1410,6 +1438,9 @@ var rename = function(self, newName, opt, callback) { var dropTarget = typeof opt.dropTarget == 'boolean' ? opt.dropTarget : false; var cmd = {'renameCollection':renameCollection, 'to':toCollection, 'dropTarget':dropTarget}; + // Decorate command with writeConcern if supported + decorateWithWriteConcern(cmd, self, opt); + // Execute against admin self.s.db.admin().command(cmd, opt, function(err, doc) { if(err) return handleCallback(callback, err, null); @@ -1436,10 +1467,10 @@ define.classMethod('rename', {callback: true, promise:true}); Collection.prototype.drop = function(options, callback) { var self = this; if(typeof options == 'function') callback = options, options = {}; - options = options | {}; + options = options || {}; // Execute using callback - if(typeof callback == 'function') return self.s.db.dropCollection(self.s.name, callback); + if(typeof callback == 'function') return self.s.db.dropCollection(self.s.name, options, callback); // Return a Promise return new this.s.promiseLibrary(function(resolve, reject) { self.s.db.dropCollection(self.s.name, options, function(err, r) { @@ -1589,11 +1620,18 @@ Collection.prototype.createIndexes = function(indexSpecs, callback) { } var createIndexes = function(self, indexSpecs, callback) { + var capabilities = self.s.topology.capabilities(); + // Ensure we generate the correct name if the parameter is not set for(var i = 0; i < indexSpecs.length; i++) { if(indexSpecs[i].name == null) { var keys = []; + // Did the user pass in a collation, check if our write server supports it + if(indexSpecs[i].collation && capabilities && !capabilities.commandsTakeCollation) { + return callback(new MongoError(f('server/primary/mongos does not support collation'))); + } + for(var name in indexSpecs[i].key) { keys.push(f('%s_%s', name, indexSpecs[i].key[name])); } @@ -1645,7 +1683,10 @@ Collection.prototype.dropIndex = function(indexName, options, callback) { var dropIndex = function(self, indexName, options, callback) { // Delete index command - var cmd = {'deleteIndexes':self.s.name, 'index':indexName}; + var cmd = {'dropIndexes':self.s.name, 'index':indexName}; + + // Decorate command with writeConcern if supported + decorateWithWriteConcern(cmd, self, options); // Execute command self.s.db.command(cmd, options, function(err, result) { @@ -1663,11 +1704,15 @@ define.classMethod('dropIndex', {callback: true, promise:true}); * @param {Collection~resultCallback} [callback] The command result callback * @return {Promise} returns Promise if no callback passed */ -Collection.prototype.dropIndexes = function(callback) { +Collection.prototype.dropIndexes = function(options, callback) { var self = this; + // Do we have options + if(typeof options == 'function') callback = options, options = {}; + options = options || {}; + // Execute using callback - if(typeof callback == 'function') return dropIndexes(self, callback); + if(typeof callback == 'function') return dropIndexes(self, options, callback); // Return a Promise return new this.s.promiseLibrary(function(resolve, reject) { @@ -1678,8 +1723,8 @@ Collection.prototype.dropIndexes = function(callback) { }); } -var dropIndexes = function(self, callback) { - self.dropIndex('*', function (err, result) { +var dropIndexes = function(self, options, callback) { + self.dropIndex('*', options, function(err, result) { if(err) return handleCallback(callback, err, false); handleCallback(callback, null, true); }); @@ -1726,6 +1771,9 @@ var reIndex = function(self, options, callback) { // Reindex var cmd = {'reIndex':self.s.name}; + // Decorate command with writeConcern if supported + decorateWithWriteConcern(cmd, self, options); + // Execute the command self.s.db.command(cmd, options, function(err, result) { if(callback == null) return; @@ -1760,25 +1808,20 @@ Collection.prototype.listIndexes = function(options) { throw new MongoError('cannot connect to server'); } - // console.log("!!!!!!!!!!!!!! HEY 0") // We have a list collections command if(this.s.topology.capabilities().hasListIndexesCommand) { - // console.log("!!!!!!!!!!!!!! HEY 0:1") // Cursor options var cursor = options.batchSize ? {batchSize: options.batchSize} : {} // Build the command var command = { listIndexes: this.s.name, cursor: cursor }; - // console.log("!!!!!!!!!!!!!! HEY 0:2") // Execute the cursor var cursor = this.s.topology.cursor(f('%s.$cmd', this.s.dbName), command, options); // Do we have a readPreference, apply it if(options.readPreference) cursor.setReadPreference(options.readPreference); - // console.log("!!!!!!!!!!!!!! HEY 0:3") // Return the cursor return cursor; } - // console.log("!!!!!!!!!!!!!! HEY 1") // Get the namespace var ns = f('%s.system.indexes', this.s.dbName); // Get the query @@ -1981,6 +2024,9 @@ var count = function(self, query, options, callback) { cmd.readConcern = self.s.readConcern; } + // Have we specified collation + decorateWithCollation(cmd, self, options); + // Execute command self.s.db.command(cmd, options, function(err, result) { if(err) return handleCallback(callback, err); @@ -2042,6 +2088,9 @@ var distinct = function(self, key, query, options, callback) { cmd.readConcern = self.s.readConcern; } + // Have we specified collation + decorateWithCollation(cmd, self, options); + // Execute the command self.s.db.command(cmd, options, function(err, result) { if(err) return handleCallback(callback, err); @@ -2400,6 +2449,9 @@ var findAndModify = function(self, query, sort, doc, options, callback) { queryObject.bypassDocumentValidation = finalOptions.bypassDocumentValidation; } + // Have we specified collation + decorateWithCollation(queryObject, self, options); + // Execute the command self.s.db.command(queryObject , options, function(err, result) { @@ -2452,6 +2504,35 @@ var findAndRemove = function(self, query, sort, options, callback) { define.classMethod('findAndRemove', {callback: true, promise:true}); +function decorateWithWriteConcern(command, self, options) { + // Do we support collation 3.4 and higher + var capabilities = self.s.topology.capabilities(); + // Do we support write concerns 3.4 and higher + if(capabilities && capabilities.commandsTakeWriteConcern) { + // Get the write concern settings + var finalOptions = writeConcern(shallowClone(options), self.s.db, self, options); + // Add the write concern to the command + if(finalOptions.writeConcern) { + command.writeConcern = finalOptions.writeConcern; + } + } +} + +function decorateWithCollation(command, self, options) { + // Do we support collation 3.4 and higher + var capabilities = self.s.topology.capabilities(); + // Do we support write concerns 3.4 and higher + if(capabilities && capabilities.commandsTakeCollation) { + if(options.collation && typeof options.collation == 'object') { + command.collation = options.collation; + } else if(self.s.collation && typeof self.s.collation == 'object') { + command.collation = self.s.collation; + } else if(self.s.db.s.collation && typeof self.s.db.s.collation == 'object') { + command.collation = self.s.db.s.collation; + } + } +} + /** * Execute an aggregation framework pipeline against the collection, needs MongoDB >= 2.2 * @method @@ -2469,6 +2550,7 @@ define.classMethod('findAndRemove', {callback: true, promise:true}); */ Collection.prototype.aggregate = function(pipeline, options, callback) { var self = this; + if(Array.isArray(pipeline)) { // Set up callback if one is provided if(typeof options == 'function') { @@ -2510,6 +2592,11 @@ Collection.prototype.aggregate = function(pipeline, options, callback) { // Build the command var command = { aggregate : this.s.name, pipeline : pipeline}; + // Decorate command with writeConcern if supported + decorateWithWriteConcern(command, self, options); + // Have we specified collation + decorateWithCollation(command, self, options); + // If we have bypassDocumentValidation set if(typeof options.bypassDocumentValidation == 'boolean') { command.bypassDocumentValidation = options.bypassDocumentValidation; @@ -2743,6 +2830,9 @@ var geoNear = function(self, x, y, point, options, callback) { commandObject.readConcern = self.s.readConcern; } + // Have we specified collation + decorateWithCollation(commandObject, self, options); + // Execute the command self.s.db.command(commandObject, options, function (err, res) { if(err) return handleCallback(callback, err); @@ -2952,6 +3042,9 @@ var group = function(self, keys, condition, initial, reduce, finalize, command, selector.readConcern = self.s.readConcern; } + // Have we specified collation + decorateWithCollation(selector, self, options); + // Execute command self.s.db.command(selector, options, function(err, result) { if(err) return handleCallback(callback, err, null); @@ -3085,7 +3178,10 @@ var mapReduce = function(self, map, reduce, options, callback) { // If we have a read preference and inline is not set as output fail hard if((options.readPreference != false && options.readPreference != 'primary') && options['out'] && (options['out'].inline != 1 && options['out'] != 'inline')) { + // Force readPreference to primary options.readPreference = 'primary'; + // Decorate command with writeConcern if supported + decorateWithWriteConcern(mapCommandHash, self, options); } else if(self.s.readConcern) { mapCommandHash.readConcern = self.s.readConcern; } @@ -3095,6 +3191,9 @@ var mapReduce = function(self, map, reduce, options, callback) { mapCommandHash.bypassDocumentValidation = options.bypassDocumentValidation; } + // Have we specified collation + decorateWithCollation(mapCommandHash, self, options); + // Execute command self.s.db.command(mapCommandHash, {readPreference:options.readPreference}, function (err, result) { if(err) return handleCallback(callback, err); @@ -3205,18 +3304,18 @@ var getReadPreference = function(self, options, db, coll) { r = options.readPreference } else if(self.s.readPreference) { r = self.s.readPreference - } else if(db.readPreference) { - r = db.readPreference; + } else if(db.s.readPreference) { + r = db.s.readPreference; } if(r instanceof ReadPreference) { - options.readPreference = new CoreReadPreference(r.mode, r.tags); + options.readPreference = new CoreReadPreference(r.mode, r.tags, {maxStalenessMS: r.maxStalenessMS}); } else if(typeof r == 'string') { options.readPreference = new CoreReadPreference(r); } else if(r && !(r instanceof ReadPreference) && typeof r == 'object') { var mode = r.mode || r.preference; if (mode && typeof mode == 'string') { - options.readPreference = new CoreReadPreference(mode, r.tags); + options.readPreference = new CoreReadPreference(mode, r.tags, {maxStalenessMS: r.maxStalenessMS}); } } @@ -3227,6 +3326,7 @@ var testForFields = { limit: 1, sort: 1, fields:1, skip: 1, hint: 1, explain: 1, snapshot: 1, timeout: 1, tailable: 1, tailableRetryInterval: 1 , numberOfRetries: 1, awaitdata: 1, awaitData: 1, exhaust: 1, batchSize: 1, returnKey: 1, maxScan: 1, min: 1, max: 1, showDiskLoc: 1 , comment: 1, raw: 1, readPreference: 1, partial: 1, read: 1, dbName: 1, oplogReplay: 1, connection: 1, maxTimeMS: 1, transforms: 1 + , collation: 1 } module.exports = Collection; diff --git a/node_modules/mongodb/lib/command_cursor.js b/node_modules/mongodb/lib/command_cursor.js index 94c5234..c0d86ca 100644 --- a/node_modules/mongodb/lib/command_cursor.js +++ b/node_modules/mongodb/lib/command_cursor.js @@ -163,7 +163,7 @@ CommandCursor.prototype.setReadPreference = function(r) { if(this.s.state != CommandCursor.INIT) throw MongoError.create({message: 'cannot change cursor readPreference after cursor has been accessed', driver:true}); if(r instanceof ReadPreference) { - this.s.options.readPreference = new CoreReadPreference(r.mode, r.tags); + this.s.options.readPreference = new CoreReadPreference(r.mode, r.tags, {maxStalenessMS: r.maxStalenessMS}); } else if(typeof r == 'string') { this.s.options.readPreference = new CoreReadPreference(r); } else if(r instanceof CoreReadPreference) { diff --git a/node_modules/mongodb/lib/cursor.js b/node_modules/mongodb/lib/cursor.js index 9000847..f62b6d6 100644 --- a/node_modules/mongodb/lib/cursor.js +++ b/node_modules/mongodb/lib/cursor.js @@ -578,6 +578,20 @@ Cursor.prototype.batchSize = function(value) { define.classMethod('batchSize', {callback: false, promise:false, returns: [Cursor]}); +/** + * Set the collation options for the cursor. + * @method + * @param {object} value The cursor collation options + * @throws {MongoError} + * @return {Cursor} + */ +Cursor.prototype.collation = function(value) { + this.s.cmd.collation = value; + return this; +} + +define.classMethod('collation', {callback: false, promise:false, returns: [Cursor]}); + /** * Set the limit for the cursor. * @method @@ -779,7 +793,7 @@ define.classMethod('forEach', {callback: true, promise:false}); Cursor.prototype.setReadPreference = function(r) { if(this.s.state != Cursor.INIT) throw MongoError.create({message: 'cannot change cursor readPreference after cursor has been accessed', driver:true}); if(r instanceof ReadPreference) { - this.s.options.readPreference = new CoreReadPreference(r.mode, r.tags); + this.s.options.readPreference = new CoreReadPreference(r.mode, r.tags, {maxStalenessMS: r.maxStalenessMS}); } else if(typeof r == 'string'){ this.s.options.readPreference = new CoreReadPreference(r); } else if(r instanceof CoreReadPreference) { @@ -879,7 +893,7 @@ define.classMethod('toArray', {callback: true, promise:true}); /** * Get the count of documents for this cursor * @method - * @param {boolean} applySkipLimit Should the count command apply limit and skip settings on the cursor or in the passed in options. + * @param {boolean} [applySkipLimit=true] Should the count command apply limit and skip settings on the cursor or in the passed in options. * @param {object} [options=null] Optional settings. * @param {number} [options.skip=null] The number of documents to skip. * @param {number} [options.limit=null] The maximum amounts to count before aborting. diff --git a/node_modules/mongodb/lib/db.js b/node_modules/mongodb/lib/db.js index a51ca0b..e6eadc4 100644 --- a/node_modules/mongodb/lib/db.js +++ b/node_modules/mongodb/lib/db.js @@ -47,7 +47,7 @@ var debugFields = ['authSource', 'w', 'wtimeout', 'j', 'native_parser', 'forceSe var legalOptionNames = ['w', 'wtimeout', 'fsync', 'j', 'readPreference', 'readPreferenceTags', 'native_parser' , 'forceServerObjectId', 'pkFactory', 'serializeFunctions', 'raw', 'bufferMaxEntries', 'authSource' , 'ignoreUndefined', 'promoteLongs', 'promiseLibrary', 'readConcern', 'retryMiliSeconds', 'numberOfRetries' - , 'parentDb', 'noListener', 'loggerLevel', 'logger']; + , 'parentDb', 'noListener', 'loggerLevel', 'logger', 'collation']; /** * Creates a new Db instance @@ -143,6 +143,8 @@ var Db = function(databaseName, topology, options) { , noListener: typeof options.noListener == 'boolean' ? options.noListener : false // ReadConcern , readConcern: options.readConcern + // Collation + , collation: options.collation } // Ensure we have a valid db name @@ -262,11 +264,11 @@ var convertReadPreference = function(readPreference) { if(readPreference && typeof readPreference == 'string') { return new CoreReadPreference(readPreference); } else if(readPreference instanceof ReadPreference) { - return new CoreReadPreference(readPreference.mode, readPreference.tags); + return new CoreReadPreference(readPreference.mode, readPreference.tags, {maxStalenessMS: readPreference.maxStalenessMS}); } else if(readPreference && typeof readPreference == 'object') { var mode = readPreference.mode || readPreference.preference; if (mode && typeof mode == 'string') { - readPreference = new CoreReadPreference(mode, readPreference.tags); + readPreference = new CoreReadPreference(mode, readPreference.tags, {maxStalenessMS: readPreference.maxStalenessMS}); } } return readPreference; @@ -437,6 +439,11 @@ Db.prototype.collection = function(name, options, callback) { // If we have not set a collection level readConcern set the db level one options.readConcern = options.readConcern || this.s.readConcern; + // Do we have a db level collation but not one for the collection + if(!options.collation && this.s.collation && typeof this.s.collation == 'object') { + options.collation = this.s.collation; + } + // Do we have ignoreUndefined set if(this.s.options.ignoreUndefined) { options.ignoreUndefined = this.s.options.ignoreUndefined; @@ -479,6 +486,18 @@ Db.prototype.collection = function(name, options, callback) { define.classMethod('collection', {callback: true, promise:false, returns: [Collection]}); +function decorateWithWriteConcern(command, self, options) { + // Do we support write concerns 3.4 and higher + if(self.s.topology.capabilities().commandsTakeWriteConcern) { + // Get the write concern settings + var finalOptions = writeConcern(shallowClone(options), self, options); + // Add the write concern to the command + if(finalOptions.writeConcern) { + command.writeConcern = finalOptions.writeConcern; + } + } +} + var createCollection = function(self, name, options, callback) { // Get the write concern options var finalOptions = writeConcern(shallowClone(options), self, options); @@ -500,6 +519,9 @@ var createCollection = function(self, name, options, callback) { // Create collection command var cmd = {'create':name}; + // Decorate command with writeConcern if supported + decorateWithWriteConcern(cmd, self, options); + // Add all optional parameters for(var n in options) { if(options[n] != null && typeof options[n] != 'function') @@ -799,11 +821,14 @@ define.classMethod('renameCollection', {callback: true, promise:true}); Db.prototype.dropCollection = function(name, options, callback) { var self = this; if(typeof options == 'function') callback = options, options = {}; - options = options | {}; + options = options || {}; // Command to execute var cmd = {'drop':name} + // Decorate with write concern + decorateWithWriteConcern(cmd, self, options); + // options options = assign({}, this.s.options, {readPreference: ReadPreference.PRIMARY}); @@ -843,10 +868,15 @@ define.classMethod('dropCollection', {callback: true, promise:true}); * @param {Db~resultCallback} [callback] The results callback * @return {Promise} returns Promise if no callback passed */ -Db.prototype.dropDatabase = function(callback) { +Db.prototype.dropDatabase = function(options, callback) { var self = this; + if(typeof options == 'function') callback = options, options = {}; // Drop database command var cmd = {'dropDatabase':1}; + + // Decorate with write concern + decorateWithWriteConcern(cmd, self, options); + // Ensure primary only var options = assign({}, this.s.options, {readPreference: ReadPreference.PRIMARY}); @@ -1132,29 +1162,28 @@ Db.prototype.addChild = function(db) { */ Db.prototype.db = function(dbName, options) { options = options || {}; + // Copy the options and add out internal override of the not shared flag - for(var key in this.options) { - options[key] = this.options[key]; - } + var finalOptions = assign({}, this.options, options); // Do we have the db in the cache already - if(this.s.dbCache[dbName] && options.returnNonCachedInstance !== true) { + if(this.s.dbCache[dbName] && finalOptions.returnNonCachedInstance !== true) { return this.s.dbCache[dbName]; } // Add current db as parentDb - if(options.noListener == null || options.noListener == false) { - options.parentDb = this; + if(finalOptions.noListener == null || finalOptions.noListener == false) { + finalOptions.parentDb = this; } // Add promiseLibrary - options.promiseLibrary = this.s.promiseLibrary; + finalOptions.promiseLibrary = this.s.promiseLibrary; // Return the db object - var db = new Db(dbName, this.s.topology, options) + var db = new Db(dbName, this.s.topology, finalOptions) // Add as child - if(options.noListener == null || options.noListener == false) { + if(finalOptions.noListener == null || finalOptions.noListener == false) { this.addChild(db); } @@ -1700,9 +1729,24 @@ var createIndexUsingCreateIndexes = function(self, name, fieldOrSpec, options, c } } + // Get capabilities + var capabilities = self.s.topology.capabilities(); + + // Did the user pass in a collation, check if our write server supports it + if(indexes[0].collation && capabilities && !capabilities.commandsTakeCollation) { + // Create a new error + var error = new MongoError(f('server/primary/mongos does not support collation')); + error.code = 67; + // Return the error + return callback(error); + } + // Create command, apply write concern to command var cmd = writeConcern({createIndexes: name, indexes: indexes}, self, options); + // Decorate command with writeConcern if supported + decorateWithWriteConcern(cmd, self, options); + // ReadPreference primary options.readPreference = ReadPreference.PRIMARY; diff --git a/node_modules/mongodb/lib/mongo_client.js b/node_modules/mongodb/lib/mongo_client.js index 8017604..6de464d 100644 --- a/node_modules/mongodb/lib/mongo_client.js +++ b/node_modules/mongodb/lib/mongo_client.js @@ -7,9 +7,10 @@ var parse = require('./url_parser') , Define = require('./metadata') , ReadPreference = require('./read_preference') , Logger = require('mongodb-core').Logger + , MongoError = require('mongodb-core').MongoError , Db = require('./db') , dns = require('dns') - , f = require('util').format + , f = require('util').format , shallowClone = require('./utils').shallowClone; /** @@ -130,9 +131,12 @@ var mergeOptions = function(target, source, flatten) { var createUnifiedOptions = function(finalOptions, options) { var childOptions = ['mongos', 'server', 'db' , 'replset', 'db_options', 'server_options', 'rs_options', 'mongos_options']; + var noMerge = ['collation']; for(var name in options) { - if(childOptions.indexOf(name.toLowerCase()) != -1) { + if(noMerge.indexOf(name.toLowerCase()) != -1) { + finalOptions[name] = options[name]; + } else if(childOptions.indexOf(name.toLowerCase()) != -1) { finalOptions = mergeOptions(finalOptions, options[name], false); } else { if(options[name] && typeof options[name] == 'object' && !Buffer.isBuffer(options[name]) && !Array.isArray(options[name])) { @@ -157,9 +161,14 @@ function translateOptions(options) { options.readPreference.tags = options.readPreferenceTags || options.read_preference_tags; } + // Do we have maxStalenessMS + if(options.maxStalenessMS) { + options.readPreference.maxStalenessMS = options.maxStalenessMS; + } + // Set the socket and connection timeouts - if(!options.socketTimeoutMS) options.socketTimeoutMS = 30000; - if(!options.connectTimeoutMS) options.connectTimeoutMS = 30000; + if(!options.socketTimeoutMS == null) options.socketTimeoutMS = 30000; + if(!options.connectTimeoutMS == null) options.connectTimeoutMS = 30000; // Create server instances return options.servers.map(function(serverObj) { @@ -269,21 +278,35 @@ var connect = function(url, options, callback) { _finalOptions = createUnifiedOptions(_finalOptions, options); // Check if we have connection and socket timeout set - if(!_finalOptions.socketTimeoutMS) _finalOptions.socketTimeoutMS = 120000; - if(!_finalOptions.connectTimeoutMS) _finalOptions.connectTimeoutMS = 120000; + if(!_finalOptions.socketTimeoutMS == null) _finalOptions.socketTimeoutMS = 120000; + if(!_finalOptions.connectTimeoutMS == null) _finalOptions.connectTimeoutMS = 120000; // Failure modes if(object.servers.length == 0) { throw new Error("connection string must contain at least one seed host"); } + function connectCallback(err, db) { + if(err && err.message == 'no mongos proxies found in seed list') { + if(logger.isWarn()) { + logger.warn(f('seed list contains no mongos proxies, replicaset connections requires the parameter replicaSet to be supplied in the URI or options object, mongodb://server:port/db?replicaSet=name')); + } + + // Return a more specific error message for MongoClient.connect + return callback(new MongoError('seed list contains no mongos proxies, replicaset connections requires the parameter replicaSet to be supplied in the URI or options object, mongodb://server:port/db?replicaSet=name')); + } + + // Return the error and db instance + callback(err, db); + } + // Do we have a replicaset then skip discovery and go straight to connectivity if(_finalOptions.replicaSet || _finalOptions.rs_name) { - return createReplicaset(_finalOptions, connectHandler(_finalOptions, callback)); + return createReplicaset(_finalOptions, connectHandler(_finalOptions, connectCallback)); } else if(object.servers.length > 1) { - return createMongos(_finalOptions, connectHandler(_finalOptions, callback)); + return createMongos(_finalOptions, connectHandler(_finalOptions, connectCallback)); } else { - return createServer(_finalOptions, connectHandler(_finalOptions, callback)); + return createServer(_finalOptions, connectHandler(_finalOptions, connectCallback)); } } diff --git a/node_modules/mongodb/lib/mongos.js b/node_modules/mongodb/lib/mongos.js index 460f93f..b6e4635 100644 --- a/node_modules/mongodb/lib/mongos.js +++ b/node_modules/mongodb/lib/mongos.js @@ -17,7 +17,16 @@ var EventEmitter = require('events').EventEmitter , MAX_JS_INT = require('./utils').MAX_JS_INT , translateOptions = require('./utils').translateOptions , filterOptions = require('./utils').filterOptions - , mergeOptions = require('./utils').mergeOptions; + , mergeOptions = require('./utils').mergeOptions + , os = require('os'); + +// Get package.json variable +var driverVersion = require(__dirname + '/../package.json').version; +var nodejsversion = f('Node.js %s, %s', process.version, os.endianness()); +var type = os.type(); +var name = process.platform; +var architecture = process.arch; +var release = os.release(); /** * @fileOverview The **Mongos** class is a class that represents a Mongos Proxy topology and is @@ -44,7 +53,7 @@ var EventEmitter = require('events').EventEmitter , 'sslCA', 'sslCert', 'sslKey', 'sslPass', 'socketOptions', 'bufferMaxEntries' , 'store', 'auto_reconnect', 'autoReconnect', 'emitError' , 'keepAlive', 'noDelay', 'connectTimeoutMS', 'socketTimeoutMS' - , 'loggerLevel', 'logger', 'reconnectTries']; + , 'loggerLevel', 'logger', 'reconnectTries', 'appname', 'domainsEnabled']; /** * Creates a new Mongos instance @@ -68,6 +77,7 @@ var EventEmitter = require('events').EventEmitter * @param {number} [options.socketOptions.keepAlive=0] TCP KeepAlive on the socket with a X ms delay before start. * @param {number} [options.socketOptions.connectTimeoutMS=0] TCP Connection timeout setting * @param {number} [options.socketOptions.socketTimeoutMS=0] TCP Socket timeout setting + * @param {boolean} [options.domainsEnabled=false] Enable the wrapping of the callback in the current domain, disabled by default to avoid perf hit. * @fires Mongos#connect * @fires Mongos#ha * @fires Mongos#joined @@ -139,6 +149,28 @@ var Mongos = function(servers, options) { clonedOptions.keepAlive = clonedOptions.keepAlive > 0; } + // Build default client information + this.clientInfo = { + driver: { + name: "nodejs", + version: driverVersion + }, + os: { + type: type, + name: name, + architecture: architecture, + version: release + }, + platform: nodejsversion + } + + // Build default client information + clonedOptions.clientInfo = this.clientInfo; + // Do we have an application specific string + if(options.appname) { + clonedOptions.clientInfo.application = { name: options.appname }; + } + // Create the Mongos var mongos = new CMongos(seedlist, clonedOptions) // Server capabilities diff --git a/node_modules/mongodb/lib/read_preference.js b/node_modules/mongodb/lib/read_preference.js index 73b253a..0c8da2b 100644 --- a/node_modules/mongodb/lib/read_preference.js +++ b/node_modules/mongodb/lib/read_preference.js @@ -3,7 +3,7 @@ /** * @fileOverview The **ReadPreference** class is a class that represents a MongoDB ReadPreference and is * used to construct connections. - * + * * @example * var Db = require('mongodb').Db, * ReplSet = require('mongodb').ReplSet, @@ -27,7 +27,7 @@ /** * Creates a new ReadPreference instance - * + * * Read Preferences * - **ReadPreference.PRIMARY**, Read from primary only. All operations produce an error (throw an exception where applicable) if primary is unavailable. Cannot be combined with tags (This is the default.). * - **ReadPreference.PRIMARY_PREFERRED**, Read from primary if available, otherwise a secondary. @@ -37,17 +37,34 @@ * * @class * @param {string} mode The ReadPreference mode as listed above. - * @param {object} tags An object representing read preference tags. + * @param {array} tags An object representing read preference tags. + * @param {object} [options] Additional read preference options + * @param {number} [options.maxStalenessMS] Max Secondary Read Stalleness in Miliseconds * @property {string} mode The ReadPreference mode. - * @property {object} tags The ReadPreference tags. + * @property {array} tags The ReadPreference tags. + * @property {object} options Additional read preference options + * @property {number} maxStalenessMS MaxStalenessMS value for the read preference * @return {ReadPreference} a ReadPreference instance. - */ -var ReadPreference = function(mode, tags) { - if(!(this instanceof ReadPreference)) - return new ReadPreference(mode, tags); + */ +var ReadPreference = function(mode, tags, options) { + if(!(this instanceof ReadPreference)) { + return new ReadPreference(mode, tags, options); + } + this._type = 'ReadPreference'; this.mode = mode; this.tags = tags; + this.options = options; + + // If no tags were passed in + if(tags && typeof tags == 'object') { + this.options = tags, this.tags = null; + } + + // Add the maxStalenessMS value to the read Preference + if(this.options && this.options.maxStalenessMS) { + this.maxStalenessMS = this.options.maxStalenessMS; + } } /** @@ -56,7 +73,7 @@ var ReadPreference = function(mode, tags) { * @method * @param {string} mode The string representing the read preference mode. * @return {boolean} - */ + */ ReadPreference.isValid = function(_mode) { return (_mode == ReadPreference.PRIMARY || _mode == ReadPreference.PRIMARY_PREFERRED || _mode == ReadPreference.SECONDARY || _mode == ReadPreference.SECONDARY_PREFERRED @@ -70,7 +87,7 @@ ReadPreference.isValid = function(_mode) { * @method * @param {string} mode The string representing the read preference mode. * @return {boolean} - */ + */ ReadPreference.prototype.isValid = function(mode) { var _mode = typeof mode == 'string' ? mode : this.mode; return ReadPreference.isValid(_mode); @@ -86,9 +103,20 @@ ReadPreference.prototype.toObject = function() { object['tags'] = this.tags; } + if(this.maxStalenessMS) { + object['maxStalenessMS'] = this.maxStalenessMS; + } + return object; } +/** + * @ignore + */ +ReadPreference.prototype.toJSON = function() { + return this.toObject(); +} + /** * @ignore */ @@ -101,4 +129,4 @@ ReadPreference.NEAREST = 'nearest' /** * @ignore */ -module.exports = ReadPreference; \ No newline at end of file +module.exports = ReadPreference; diff --git a/node_modules/mongodb/lib/replset.js b/node_modules/mongodb/lib/replset.js index d740464..5bf6026 100644 --- a/node_modules/mongodb/lib/replset.js +++ b/node_modules/mongodb/lib/replset.js @@ -21,8 +21,8 @@ var EventEmitter = require('events').EventEmitter , MAX_JS_INT = require('./utils').MAX_JS_INT , translateOptions = require('./utils').translateOptions , filterOptions = require('./utils').filterOptions - , mergeOptions = require('./utils').mergeOptions; - + , mergeOptions = require('./utils').mergeOptions + , os = require('os'); /** * @fileOverview The **ReplSet** class is a class that represents a Replicaset topology and is * used to construct connections. @@ -48,7 +48,15 @@ var legalOptionNames = ['ha', 'haInterval', 'replicaSet', 'rs_name', 'secondaryA , 'sslCA', 'sslCert', 'sslKey', 'sslPass', 'socketOptions', 'bufferMaxEntries' , 'store', 'auto_reconnect', 'autoReconnect', 'emitError' , 'keepAlive', 'noDelay', 'connectTimeoutMS', 'socketTimeoutMS', 'strategy', 'debug' - , 'loggerLevel', 'logger', 'reconnectTries']; + , 'loggerLevel', 'logger', 'reconnectTries', 'appname', 'domainsEnabled']; + +// Get package.json variable +var driverVersion = require(__dirname + '/../package.json').version; +var nodejsversion = f('Node.js %s, %s', process.version, os.endianness()); +var type = os.type(); +var name = process.platform; +var architecture = process.arch; +var release = os.release(); /** * Creates a new ReplSet instance @@ -74,6 +82,7 @@ var legalOptionNames = ['ha', 'haInterval', 'replicaSet', 'rs_name', 'secondaryA * @param {number} [options.socketOptions.keepAlive=0] TCP KeepAlive on the socket with a X ms delay before start. * @param {number} [options.socketOptions.connectTimeoutMS=10000] TCP Connection timeout setting * @param {number} [options.socketOptions.socketTimeoutMS=0] TCP Socket timeout setting + * @param {boolean} [options.domainsEnabled=false] Enable the wrapping of the callback in the current domain, disabled by default to avoid perf hit. * @fires ReplSet#connect * @fires ReplSet#ha * @fires ReplSet#joined @@ -117,13 +126,6 @@ var ReplSet = function(servers, options) { return {host: x.host, port: x.port} }); - // console.log("!!!!!!!!!!!!!!!!!!!!!!!!!! RECONNECT") - // console.dir(options) - - // // Get the reconnect option - // var reconnect = typeof options.auto_reconnect == 'boolean' ? options.auto_reconnect : false; - // reconnect = typeof options.autoReconnect == 'boolean' ? options.autoReconnect : reconnect; - // Clone options var clonedOptions = mergeOptions({}, { disconnectHandler: store, @@ -147,8 +149,28 @@ var ReplSet = function(servers, options) { clonedOptions.keepAlive = clonedOptions.keepAlive > 0; } - // console.log("=============== create CReplSet") - // console.dir(clonedOptions) + // Client info + this.clientInfo = { + driver: { + name: "nodejs", + version: driverVersion + }, + os: { + type: type, + name: name, + architecture: architecture, + version: release + }, + platform: nodejsversion + } + + // Build default client information + clonedOptions.clientInfo = this.clientInfo; + // Do we have an application specific string + if(options.appname) { + clonedOptions.clientInfo.application = { name: options.appname }; + } + // Create the ReplSet var replset = new CReplSet(seedlist, clonedOptions); // Server capabilities @@ -216,7 +238,7 @@ var translateReadPreference = function(options) { options.readPreference = new CoreReadPreference(options.readPreference); } else if(options.readPreference instanceof ReadPreference) { options.readPreference = new CoreReadPreference(options.readPreference.mode - , options.readPreference.tags); + , options.readPreference.tags, {maxStalenessMS: options.readPreference.maxStalenessMS}); } return options; diff --git a/node_modules/mongodb/lib/server.js b/node_modules/mongodb/lib/server.js index cf5ba5a..78684bb 100644 --- a/node_modules/mongodb/lib/server.js +++ b/node_modules/mongodb/lib/server.js @@ -15,7 +15,16 @@ var EventEmitter = require('events').EventEmitter , MAX_JS_INT = require('./utils').MAX_JS_INT , translateOptions = require('./utils').translateOptions , filterOptions = require('./utils').filterOptions - , mergeOptions = require('./utils').mergeOptions; + , mergeOptions = require('./utils').mergeOptions + , os = require('os'); + +// Get package.json variable +var driverVersion = require(__dirname + '/../package.json').version; +var nodejsversion = f('Node.js %s, %s', process.version, os.endianness()); +var type = os.type(); +var name = process.platform; +var architecture = process.arch; +var release = os.release(); /** * @fileOverview The **Server** class is a class that represents a single server topology and is @@ -40,7 +49,8 @@ var EventEmitter = require('events').EventEmitter , 'sslCA', 'sslCert', 'sslKey', 'sslPass', 'socketOptions', 'bufferMaxEntries' , 'store', 'auto_reconnect', 'autoReconnect', 'emitError' , 'keepAlive', 'noDelay', 'connectTimeoutMS', 'socketTimeoutMS' - , 'loggerLevel', 'logger', 'reconnectTries', 'reconnectInterval', 'monitoring']; + , 'loggerLevel', 'logger', 'reconnectTries', 'reconnectInterval', 'monitoring' + , 'appname', 'domainsEnabled']; /** * Creates a new Server instance @@ -67,6 +77,7 @@ var EventEmitter = require('events').EventEmitter * @param {number} [options.reconnectInterval=1000] Server will wait # milliseconds between retries * @param {number} [options.monitoring=true] Triggers the server instance to call ismaster * @param {number} [options.haInterval=10000] The interval of calling ismaster when monitoring is enabled. + * @param {boolean} [options.domainsEnabled=false] Enable the wrapping of the callback in the current domain, disabled by default to avoid perf hit. * @fires Server#connect * @fires Server#close * @fires Server#error @@ -130,6 +141,28 @@ var Server = function(host, port, options) { clonedOptions.keepAlive = clonedOptions.keepAlive > 0; } + // Build default client information + this.clientInfo = { + driver: { + name: "nodejs", + version: driverVersion + }, + os: { + type: type, + name: name, + architecture: architecture, + version: release + }, + platform: nodejsversion + } + + // Build default client information + clonedOptions.clientInfo = this.clientInfo; + // Do we have an application specific string + if(options.appname) { + clonedOptions.clientInfo.application = { name: options.appname }; + } + // Create an instance of a server instance from mongodb-core var server = new CServer(clonedOptions); // Server capabilities diff --git a/node_modules/mongodb/lib/topology_base.js b/node_modules/mongodb/lib/topology_base.js index cad8d85..2f5ac1f 100644 --- a/node_modules/mongodb/lib/topology_base.js +++ b/node_modules/mongodb/lib/topology_base.js @@ -113,6 +113,8 @@ var ServerCapabilities = function(ismaster) { var listCollections = false; var listIndexes = false; var maxNumberOfDocsInBatch = ismaster.maxWriteBatchSize || 1000; + var commandsTakeWriteConcern = false; + var commandsTakeCollation = false; if(ismaster.minWireVersion >= 0) { textSearch = true; @@ -132,6 +134,11 @@ var ServerCapabilities = function(ismaster) { listIndexes = true; } + if(ismaster.maxWireVersion >= 5) { + commandsTakeWriteConcern = true; + commandsTakeCollation = true; + } + // If no min or max wire version set to 0 if(ismaster.minWireVersion == null) { ismaster.minWireVersion = 0; @@ -151,6 +158,8 @@ var ServerCapabilities = function(ismaster) { setup_get_property(this, "minWireVersion", ismaster.minWireVersion); setup_get_property(this, "maxWireVersion", ismaster.maxWireVersion); setup_get_property(this, "maxNumberOfDocsInBatch", maxNumberOfDocsInBatch); + setup_get_property(this, "commandsTakeWriteConcern", commandsTakeWriteConcern); + setup_get_property(this, "commandsTakeCollation", commandsTakeCollation); } exports.Store = Store; diff --git a/node_modules/mongodb/lib/url_parser.js b/node_modules/mongodb/lib/url_parser.js index 0152612..663e5dc 100644 --- a/node_modules/mongodb/lib/url_parser.js +++ b/node_modules/mongodb/lib/url_parser.js @@ -223,6 +223,8 @@ module.exports = function(url, options) { serverOptions.poolSize = parseInt(value, 10); replSetServersOptions.poolSize = parseInt(value, 10); break; + case 'appname': + object.appname = decodeURIComponent(value); case 'autoReconnect': case 'auto_reconnect': serverOptions.auto_reconnect = (value == 'true'); @@ -353,6 +355,9 @@ module.exports = function(url, options) { if(!ReadPreference.isValid(value)) throw new Error("readPreference must be either primary/primaryPreferred/secondary/secondaryPreferred/nearest"); dbOptions.readPreference = value; break; + case 'maxStalenessMS': + dbOptions.maxStalenessMS = parseInt(value, 10); + break; case 'readPreferenceTags': // Decode the value value = decodeURIComponent(value); diff --git a/node_modules/mongodb/node_modules/mongodb-core/HISTORY.md b/node_modules/mongodb/node_modules/mongodb-core/HISTORY.md index b99f6f5..3dbd153 100644 --- a/node_modules/mongodb/node_modules/mongodb-core/HISTORY.md +++ b/node_modules/mongodb/node_modules/mongodb-core/HISTORY.md @@ -1,3 +1,13 @@ +2.0.7 2016-07-28 +---------------- +* Allow primary to be returned when secondaryPreferred is passed (Issue #117, https://github.com/dhendo). +* Added better warnings when passing in illegal seed list members to a Mongos topology. +* Minor attemptReconnect bug that would cause multiple attemptReconnect to run in parallel. +* Fix wrong opType passed to disconnectHandler.add (Issue #121, https://github.com/adrian-gierakowski) +* Implemented domain backward comp support enabled via domainsEnabled options on Server/ReplSet/Mongos and MongoClient.connect. +* Initial max staleness implementation for ReplSet and Mongos for 3.4 support. +* Added handling of collation for 3.4 support. + 2.0.6 2016-07-19 ---------------- * Destroy connection on socket timeout due to newer node versions not closing the socket. diff --git a/node_modules/mongodb/node_modules/mongodb-core/README.md b/node_modules/mongodb/node_modules/mongodb-core/README.md deleted file mode 100644 index 433dd88..0000000 --- a/node_modules/mongodb/node_modules/mongodb-core/README.md +++ /dev/null @@ -1,228 +0,0 @@ -[![Build Status](https://secure.travis-ci.org/christkv/mongodb-core.png)](http://travis-ci.org/christkv/mongodb-core) -[![Coverage Status](https://coveralls.io/repos/github/christkv/mongodb-core/badge.svg?branch=1.3)](https://coveralls.io/github/christkv/mongodb-core?branch=1.3) - -# Description - -The MongoDB Core driver is the low level part of the 2.0 or higher MongoDB driver and is meant for library developers not end users. It does not contain any abstractions or helpers outside of the basic management of MongoDB topology connections, CRUD operations and authentication. - -## MongoDB Node.JS Core Driver - -| what | where | -|---------------|------------------------------------------------| -| documentation | http://mongodb.github.io/node-mongodb-native/ | -| apidoc | http://mongodb.github.io/node-mongodb-native/ | -| source | https://github.com/christkv/mongodb-core | -| mongodb | http://www.mongodb.org/ | - -### Blogs of Engineers involved in the driver -- Christian Kvalheim [@christkv](https://twitter.com/christkv) - -### Bugs / Feature Requests - -Think you’ve found a bug? Want to see a new feature in node-mongodb-native? Please open a -case in our issue management tool, JIRA: - -- Create an account and login . -- Navigate to the NODE project . -- Click **Create Issue** - Please provide as much information as possible about the issue type and how to reproduce it. - -Bug reports in JIRA for all driver projects (i.e. NODE, PYTHON, CSHARP, JAVA) and the -Core Server (i.e. SERVER) project are **public**. - -### Questions and Bug Reports - - * mailing list: https://groups.google.com/forum/#!forum/node-mongodb-native - * jira: http://jira.mongodb.org/ - -### Change Log - -http://jira.mongodb.org/browse/NODE - -# QuickStart - -The quick start guide will show you how to set up a simple application using Core driver and MongoDB. It scope is only how to set up the driver and perform the simple crud operations. For more inn depth coverage we encourage reading the tutorials. - -## Create the package.json file - -Let's create a directory where our application will live. In our case we will put this under our projects directory. - -``` -mkdir myproject -cd myproject -``` - -Create a **package.json** using your favorite text editor and fill it in. - -```json -{ - "name": "myproject", - "version": "1.0.0", - "description": "My first project", - "main": "index.js", - "repository": { - "type": "git", - "url": "git://github.com/christkv/myfirstproject.git" - }, - "dependencies": { - "mongodb-core": "~1.0" - }, - "author": "Christian Kvalheim", - "license": "Apache 2.0", - "bugs": { - "url": "https://github.com/christkv/myfirstproject/issues" - }, - "homepage": "https://github.com/christkv/myfirstproject" -} -``` - -Save the file and return to the shell or command prompt and use **NPM** to install all the dependencies. - -``` -npm install -``` - -You should see **NPM** download a lot of files. Once it's done you'll find all the downloaded packages under the **node_modules** directory. - -Booting up a MongoDB Server ---------------------------- -Let's boot up a MongoDB server instance. Download the right MongoDB version from [MongoDB](http://www.mongodb.org), open a new shell or command line and ensure the **mongod** command is in the shell or command line path. Now let's create a database directory (in our case under **/data**). - -``` -mongod --dbpath=/data --port 27017 -``` - -You should see the **mongod** process start up and print some status information. - -## Connecting to MongoDB - -Let's create a new **app.js** file that we will use to show the basic CRUD operations using the MongoDB driver. - -First let's add code to connect to the server. Notice that there is no concept of a database here and we use the topology directly to perform the connection. - -```js -var Server = require('mongodb-core').Server - , assert = require('assert'); - -// Set up server connection -var server = new Server({ - host: 'localhost' - , port: 27017 - , reconnect: true - , reconnectInterval: 50 -}); - -// Add event listeners -server.on('connect', function(_server) { - console.log('connected'); - test.done(); -}); - -server.on('close', function() { - console.log('closed'); -}); - -server.on('reconnect', function() { - console.log('reconnect'); -}); - -// Start connection -server.connect(); -``` - -To connect to a replicaset we would use the `ReplSet` class and for a set of Mongos proxies we use the `Mongos` class. Each topology class offer the same CRUD operations and you operate on the topology directly. Let's look at an example exercising all the different available CRUD operations. - -```js -var Server = require('mongodb-core').Server - , assert = require('assert'); - -// Set up server connection -var server = new Server({ - host: 'localhost' - , port: 27017 - , reconnect: true - , reconnectInterval: 50 -}); - -// Add event listeners -server.on('connect', function(_server) { - console.log('connected'); - - // Execute the ismaster command - _server.command('system.$cmd', {ismaster: true}, function(err, result) { - - // Perform a document insert - _server.insert('myproject.inserts1', [{a:1}, {a:2}], { - writeConcern: {w:1}, ordered:true - }, function(err, results) { - assert.equal(null, err); - assert.equal(2, results.result.n); - - // Perform a document update - _server.update('myproject.inserts1', [{ - q: {a: 1}, u: {'$set': {b:1}} - }], { - writeConcern: {w:1}, ordered:true - }, function(err, results) { - assert.equal(null, err); - assert.equal(1, results.result.n); - - // Remove a document - _server.remove('myproject.inserts1', [{ - q: {a: 1}, limit: 1 - }], { - writeConcern: {w:1}, ordered:true - }, function(err, results) { - assert.equal(null, err); - assert.equal(1, results.result.n); - - // Get a document - var cursor = _server.cursor('integration_tests.inserts_example4', { - find: 'integration_tests.example4' - , query: {a:1} - }); - - // Get the first document - cursor.next(function(err, doc) { - assert.equal(null, err); - assert.equal(2, doc.a); - - // Execute the ismaster command - _server.command("system.$cmd" - , {ismaster: true}, function(err, result) { - assert.equal(null, err) - _server.destroy(); - }); - }); - }); - }); - - test.done(); - }); -}); - -server.on('close', function() { - console.log('closed'); -}); - -server.on('reconnect', function() { - console.log('reconnect'); -}); - -// Start connection -server.connect(); -``` - -The core driver does not contain any helpers or abstractions only the core crud operations. These consist of the following commands. - -* `insert`, Insert takes an array of 1 or more documents to be inserted against the topology and allows you to specify a write concern and if you wish to execute the inserts in order or out of order. -* `update`, Update takes an array of 1 or more update commands to be executed against the server topology and also allows you to specify a write concern and if you wish to execute the updates in order or out of order. -* `remove`, Remove takes an array of 1 or more remove commands to be executed against the server topology and also allows you to specify a write concern and if you wish to execute the removes in order or out of order. -* `cursor`, Returns you a cursor for either the 'virtual' `find` command, a command that returns a cursor id or a plain cursor id. Read the cursor tutorial for more inn depth coverage. -* `command`, Executes a command against MongoDB and returns the result. -* `auth`, Authenticates the current topology using a supported authentication scheme. - -The Core Driver is a building block for library builders and is not meant for usage by end users as it lacks a lot of features the end user might need such as automatic buffering of operations when a primary is changing in a replicaset or the db and collections abstraction. - -## Next steps - -The next step is to get more in depth information about how the different aspects of the core driver works and how to leverage them to extend the functionality of the cursors. Please view the tutorials for more detailed information. diff --git a/node_modules/mongodb/node_modules/mongodb-core/lib/connection/pool.js b/node_modules/mongodb/node_modules/mongodb-core/lib/connection/pool.js index 96ae4ce..fd28d36 100644 --- a/node_modules/mongodb/node_modules/mongodb-core/lib/connection/pool.js +++ b/node_modules/mongodb/node_modules/mongodb-core/lib/connection/pool.js @@ -48,6 +48,7 @@ var _id = 0; * @param {string} [options.passPhrase] SSL Certificate pass phrase * @param {boolean} [options.rejectUnauthorized=false] Reject unauthorized server certificates * @param {boolean} [options.promoteLongs=true] Convert Long values from the db into Numbers if they fit into 53 bits + * @param {boolean} [options.domainsEnabled=false] Enable the wrapping of the callback in the current domain, disabled by default to avoid perf hit. * @fires Pool#connect * @fires Pool#close * @fires Pool#error @@ -80,7 +81,9 @@ var Pool = function(options) { // Reconnection options reconnect: true, reconnectInterval: 1000, - reconnectTries: 30 + reconnectTries: 30, + // Enable domains + domainsEnabled: false }, options); // Identification information @@ -823,6 +826,20 @@ Pool.prototype.write = function(buffer, options, cb) { return; } + if(this.options.domainsEnabled + && process.domain && typeof cb === "function") { + // if we have a domain bind to it + var oldCb = cb; + cb = process.domain.bind(function() { + // v8 - argumentsToArray one-liner + var args = new Array(arguments.length); for(var i = 0; i < arguments.length; i++) { args[i] = arguments[i]; } + // bounce off event loop so domain switch takes place + process.nextTick(function() { + oldCb.apply(null, args); + }); + }); + } + // Do we have an operation var operation = { buffer:buffer, cb: cb, raw: false, promoteLongs: true diff --git a/node_modules/mongodb/node_modules/mongodb-core/lib/cursor.js b/node_modules/mongodb/node_modules/mongodb-core/lib/cursor.js index 0ba6d80..a3b3834 100644 --- a/node_modules/mongodb/node_modules/mongodb-core/lib/cursor.js +++ b/node_modules/mongodb/node_modules/mongodb-core/lib/cursor.js @@ -546,6 +546,13 @@ var nextFunction = function(self, callback) { // Set as init self.cursorState.init = true; + // Server does not support server + if(self.cmd + && self.cmd.collation + && self.server.ismaster.maxWireVersion < 5) { + return callback(new MongoError(f('server %s does not support collation', self.server.name))); + } + try { self.query = self.server.wireProtocolHandler.command(self.bson, self.ns, self.cmd, self.cursorState, self.topology, self.options); } catch(err) { diff --git a/node_modules/mongodb/node_modules/mongodb-core/lib/topologies/mongos.js b/node_modules/mongodb/node_modules/mongodb-core/lib/topologies/mongos.js index 98987f2..f4c4c4d 100644 --- a/node_modules/mongodb/node_modules/mongodb-core/lib/topologies/mongos.js +++ b/node_modules/mongodb/node_modules/mongodb-core/lib/topologies/mongos.js @@ -11,7 +11,9 @@ var inherits = require('util').inherits, MongoError = require('../error'), Server = require('./server'), ReplSetState = require('./replset_state'), - assign = require('./shared').assign; + assign = require('./shared').assign, + clone = require('./shared').clone, + createClientInfo = require('./shared').createClientInfo; /** * @fileOverview The **Mongos** class is a class that represents a Mongos Proxy topology and is @@ -91,6 +93,7 @@ var handlers = ['connect', 'close', 'error', 'timeout', 'parseError']; * @param {string} [options.passphrase] SSL Certificate pass phrase * @param {boolean} [options.rejectUnauthorized=true] Reject unauthorized server certificates * @param {boolean} [options.promoteLongs=true] Convert Long values from the db into Numbers if they fit into 53 bits + * @param {boolean} [options.domainsEnabled=false] Enable the wrapping of the callback in the current domain, disabled by default to avoid perf hit. * @return {Mongos} A cursor instance * @fires Mongos#connect * @fires Mongos#reconnect @@ -136,8 +139,13 @@ var Mongos = function(seedlist, options) { debug: typeof options.debug == 'boolean' ? options.debug : false, // localThresholdMS localThresholdMS: options.localThresholdMS || 15, + // Client info + clientInfo: createClientInfo(options) } + // Set the client info + this.s.options.clientInfo = createClientInfo(options); + // Log info warning if the socketTimeout < haInterval as it will cause // a lot of recycled connections to happen. if(this.s.logger.isWarn() @@ -209,6 +217,8 @@ Mongos.prototype.connect = function(options) { var servers = this.s.seedlist.map(function(x) { return new Server(assign({}, self.s.options, x, { authProviders: self.authProviders, reconnect:false, monitoring:false, inTopology: true + }, { + clientInfo: clone(self.s.clientInfo) })); }); @@ -267,6 +277,18 @@ function handleInitialConnectEvent(self, event) { // Emit the joined event self.emit('joined', 'mongos', this); } else { + + // Print warning if we did not find a mongos proxy + if(self.s.logger.isWarn()) { + var message = 'expected mongos proxy, but found replicaset member mongod for server %s'; + // We have a standalone server + if(!self.ismaster.hosts) { + message = 'expected mongos proxy, but found standalone mongod for server %s'; + } + + self.s.logger.warn(f(message, this.name)); + } + // This is not a mongos proxy, remove it completely removeProxyFrom(self.connectingProxies, this); // Emit the left event @@ -301,6 +323,12 @@ function handleInitialConnectEvent(self, event) { self.emit('fullsetup', self); self.emit('all', self); } else if(self.disconnectedProxies.length == 0) { + // Print warning if we did not find a mongos proxy + if(self.s.logger.isWarn()) { + self.s.logger.warn(f('no mongos proxies found in seed list, did you mean to connect to a replicaset')); + } + + // Emit the error that no proxies were found return self.emit('error', new MongoError('no mongos proxies found in seed list')); } @@ -455,6 +483,8 @@ function reconnectProxies(self, proxies, callback) { port: parseInt(_server.name.split(':')[1], 10) }, { authProviders: self.authProviders, reconnect:false, monitoring: false, inTopology: true + }, { + clientInfo: clone(self.s.clientInfo) })); // Add temp handlers @@ -714,7 +744,7 @@ Mongos.prototype.update = function(ns, ops, options, callback) { // Not connected but we have a disconnecthandler if(!this.isConnected() && this.s.disconnectHandler != null) { - return this.s.disconnectHandler.add('insert', ns, ops, options, callback); + return this.s.disconnectHandler.add('update', ns, ops, options, callback); } // No mongos proxy available @@ -743,7 +773,7 @@ Mongos.prototype.remove = function(ns, ops, options, callback) { // Not connected but we have a disconnecthandler if(!this.isConnected() && this.s.disconnectHandler != null) { - return this.s.disconnectHandler.add('insert', ns, ops, options, callback); + return this.s.disconnectHandler.add('remove', ns, ops, options, callback); } // No mongos proxy available diff --git a/node_modules/mongodb/node_modules/mongodb-core/lib/topologies/read_preference.js b/node_modules/mongodb/node_modules/mongodb-core/lib/topologies/read_preference.js index 257b957..a801fbe 100644 --- a/node_modules/mongodb/node_modules/mongodb-core/lib/topologies/read_preference.js +++ b/node_modules/mongodb/node_modules/mongodb-core/lib/topologies/read_preference.js @@ -30,17 +30,29 @@ var needSlaveOk = ['primaryPreferred', 'secondary', 'secondaryPreferred', 'neare * Creates a new Pool instance * @class * @param {string} preference A string describing the preference (primary|primaryPreferred|secondary|secondaryPreferred|nearest) - * @param {object} tags The tags object + * @param {array} tags The tags object * @param {object} [options] Additional read preference options + * @param {number} [options.maxStalenessMS] Max Secondary Read Stalleness in Miliseconds * @property {string} preference The preference string (primary|primaryPreferred|secondary|secondaryPreferred|nearest) - * @property {object} tags The tags object + * @property {array} tags The tags object * @property {object} options Additional read preference options + * @property {number} maxStalenessMS MaxStalenessMS value for the read preference * @return {ReadPreference} */ var ReadPreference = function(preference, tags, options) { this.preference = preference; this.tags = tags; this.options = options; + + // If no tags were passed in + if(tags && typeof tags == 'object') { + this.options = tags, tags = null; + } + + // Add the maxStalenessMS value to the read Preference + if(this.options && this.options.maxStalenessMS) { + this.maxStalenessMS = this.options.maxStalenessMS; + } } /** @@ -69,6 +81,7 @@ ReadPreference.prototype.equals = function(readPreference) { ReadPreference.prototype.toJSON = function() { var readPreference = {mode: this.preference}; if(Array.isArray(this.tags)) readPreference.tags = this.tags; + if(this.maxStalenessMS) readPreference.maxStalenessMS = this.maxStalenessMS; return readPreference; } diff --git a/node_modules/mongodb/node_modules/mongodb-core/lib/topologies/replset.js b/node_modules/mongodb/node_modules/mongodb-core/lib/topologies/replset.js index dc73d59..bfa8b76 100644 --- a/node_modules/mongodb/node_modules/mongodb-core/lib/topologies/replset.js +++ b/node_modules/mongodb/node_modules/mongodb-core/lib/topologies/replset.js @@ -11,7 +11,9 @@ var inherits = require('util').inherits, MongoError = require('../error'), Server = require('./server'), ReplSetState = require('./replset_state'), - assign = require('./shared').assign; + assign = require('./shared').assign, + clone = require('./shared').clone, + createClientInfo = require('./shared').createClientInfo; var MongoCR = require('../auth/mongocr') , X509 = require('../auth/x509') @@ -76,6 +78,7 @@ var handlers = ['connect', 'close', 'error', 'timeout', 'parseError']; * @param {boolean} [options.promoteLongs=true] Convert Long values from the db into Numbers if they fit into 53 bits * @param {number} [options.pingInterval=5000] Ping interval to check the response time to the different servers * @param {number} [options.localThresholdMS=15] Cutoff latency point in MS for MongoS proxy selection + * @param {boolean} [options.domainsEnabled=false] Enable the wrapping of the callback in the current domain, disabled by default to avoid perf hit. * @return {ReplSet} A cursor instance * @fires ReplSet#connect * @fires ReplSet#ha @@ -135,6 +138,7 @@ var ReplSet = function(seedlist, options) { replicaSetState: new ReplSetState({ id: this.id, setName: options.setName, acceptableLatency: localThresholdMS, + heartbeatFrequencyMS: options.haInterval ? options.haInterval : 10000, logger: logger }), // Current servers we are connecting to @@ -150,7 +154,9 @@ var ReplSet = function(seedlist, options) { // Connect function options passed in connectOptions: {}, // Are we running in debug mode - debug: typeof options.debug == 'boolean' ? options.debug : false + debug: typeof options.debug == 'boolean' ? options.debug : false, + // Client info + clientInfo: createClientInfo(options) } // Add handler for topology change @@ -190,6 +196,7 @@ var ReplSet = function(seedlist, options) { this.haTimeoutId = null; // Are we authenticating this.authenticating = false; + // Currently running attempReconnect } inherits(ReplSet, EventEmitter); @@ -199,6 +206,10 @@ Object.defineProperty(ReplSet.prototype, 'type', { }); function attemptReconnect(self) { + if(self.runningAttempReconnect) return; + // Set as running + self.runningAttempReconnect = true; + // Wait before execute self.haTimeoutId = setTimeout(function() { if(self.state == DESTROYED) return; @@ -214,6 +225,8 @@ function attemptReconnect(self) { host: x.split(':')[0], port: parseInt(x.split(':')[1], 10) }, { authProviders: self.authProviders, reconnect:false, monitoring: false, inTopology: true + }, { + clientInfo: clone(self.s.clientInfo) })); }); @@ -253,6 +266,9 @@ function attemptReconnect(self) { if(self.s.logger.isDebug()) { self.s.logger.debug(f('attemptReconnect for replset with id successful resuming topologyMonitor', self.id)); } + + // Reset the running + self.runningAttempReconnect = false; // Go back to normal topology monitoring topologyMonitor(self); }); @@ -261,6 +277,9 @@ function attemptReconnect(self) { self.emit('close', self); } + // Reset the running + self.runningAttempReconnect = false; + // Attempt a new reconnect attemptReconnect(self); } } @@ -302,8 +321,6 @@ function attemptReconnect(self) { } else { _self.destroy(); } - - done(); } else if(event == 'connect' && self.authenticating) { this.destroy(); } @@ -403,6 +420,8 @@ function connectNewServers(self, servers, callback) { port: parseInt(_server.split(':')[1], 10) }, { authProviders: self.authProviders, reconnect:false, monitoring: false, inTopology: true + }, { + clientInfo: clone(self.s.clientInfo) })); // Add temp handlers @@ -477,6 +496,11 @@ function topologyMonitor(self, options) { // Calculate latency var latencyMS = new Date().getTime() - start; + // Set the last updatedTime + var hrTime = process.hrtime(); + // Calculate the last update time + _server.lastUpdateTime = hrTime[0] * 1000 + Math.round(hrTime[1]/1000); + // We had an error, remove it from the state if(err) { // Emit the server heartbeat failure @@ -486,6 +510,14 @@ function topologyMonitor(self, options) { } else { // Update the server ismaster _server.ismaster = r.result; + + // Check if we have a lastWriteDate convert it to MS + // and store on the server instance for later use + if(_server.ismaster.lastWrite && _server.ismaster.lastWrite.lastWriteDate) { + _server.lastWriteDate = _server.ismaster.lastWrite.lastWriteDate.getTime(); + } + + // Do we have a brand new server if(_server.lastIsMasterMS == -1) { _server.lastIsMasterMS = latencyMS; } else if(_server.lastIsMasterMS) { @@ -505,6 +537,10 @@ function topologyMonitor(self, options) { emitSDAMEvent(self, 'serverHeartbeatSucceeded', { durationMS: latencyMS, reply: r.result, connectionId: _server.name }); } + // Calculate the stalness for this server + self.s.replicaSetState.updateServerMaxStaleness(_server, self.s.haInterval); + + // Callback cb(err, r); }); } @@ -726,6 +762,8 @@ ReplSet.prototype.connect = function(options) { var servers = this.s.seedlist.map(function(x) { return new Server(assign({}, self.s.options, x, { authProviders: self.authProviders, reconnect:false, monitoring:false, inTopology: true + }, { + clientInfo: clone(self.s.clientInfo) })); }); @@ -858,8 +896,8 @@ ReplSet.prototype.isDestroyed = function() { ReplSet.prototype.getServer = function(options) { // Ensure we have no options options = options || {}; + // Pick the right server baspickServerd on readPreference - // var server = pickServer(this, this.s, options.readPreference); var server = this.s.replicaSetState.pickServer(options.readPreference); if(this.s.debug) this.emit('pickedServer', options.readPreference, server); return server; @@ -937,7 +975,7 @@ ReplSet.prototype.update = function(ns, ops, options, callback) { // Not connected but we have a disconnecthandler if(!this.s.replicaSetState.hasPrimary() && this.s.disconnectHandler != null) { - return this.s.disconnectHandler.add('insert', ns, ops, options, callback); + return this.s.disconnectHandler.add('update', ns, ops, options, callback); } // Execute write operation @@ -961,7 +999,7 @@ ReplSet.prototype.remove = function(ns, ops, options, callback) { // Not connected but we have a disconnecthandler if(!this.s.replicaSetState.hasPrimary() && this.s.disconnectHandler != null) { - return this.s.disconnectHandler.add('insert', ns, ops, options, callback); + return this.s.disconnectHandler.add('remove', ns, ops, options, callback); } // Execute write operation @@ -986,9 +1024,8 @@ ReplSet.prototype.command = function(ns, cmd, options, callback) { // Establish readPreference var readPreference = options.readPreference ? options.readPreference : ReadPreference.primary; + // Pick a server - // var server = pickServer(self, self.s, readPreference); - // var server = self.s.replicaSetState.pickServer(readPreference); var server = this.s.replicaSetState.pickServer(readPreference); if(!(server instanceof Server)) return callback(server); if(self.s.debug) self.emit('pickedServer', ReadPreference.primary, server); diff --git a/node_modules/mongodb/node_modules/mongodb-core/lib/topologies/replset_state.js b/node_modules/mongodb/node_modules/mongodb-core/lib/topologies/replset_state.js index 96249eb..cc8b4c8 100644 --- a/node_modules/mongodb/node_modules/mongodb-core/lib/topologies/replset_state.js +++ b/node_modules/mongodb/node_modules/mongodb-core/lib/topologies/replset_state.js @@ -43,6 +43,9 @@ var ReplSetState = function(options) { // Acceptable latency this.acceptableLatency = options.acceptableLatency || 15; + // heartbeatFrequencyMS + this.heartbeatFrequencyMS = options.heartbeatFrequencyMS || 10000; + // Server side this.primary = null; this.secondaries = []; @@ -502,13 +505,83 @@ ReplSetState.prototype.update = function(server) { return false; } +/** + * Recalculate single server max staleness + * @method + * @return + */ +ReplSetState.prototype.updateServerMaxStaleness = function(server, haInterval) { + // Locate the max secondary lastwrite + var max = 0; + // Go over all secondaries + for(var i = 0; i < this.secondaries.length; i++) { + max = Math.max(max, this.secondaries[i].lastWriteDate); + } + // console.log("!!!!!!!!!!!!!!!! 0") + // console.dir(max) + // Perform this servers staleness calculation + if(server.ismaster.maxWireVersion >= 5 + && server.ismaster.secondary + && this.hasPrimary()) { + // console.log("=========== updateServerMaxStaleness 0") + server.staleness = (server.lastUpdateTime - server.lastWriteDate) + - (this.primary.lastUpdateTime - this.primary.lastWriteDate) + + haInterval; + } else if(server.ismaster.maxWireVersion >= 5 + && server.ismaster.secondary){ + // console.log("=========== updateServerMaxStaleness 1") + // console.log(" max :: " + max) + // console.log(" server.lastWriteDate :: " + server.lastWriteDate) + // console.log(" haInterval :: " + haInterval) + server.staleness = max - server.lastWriteDate + haInterval; + } +} + +/** + * Recalculate all the stalness values for secodaries + * @method + * @return + */ +ReplSetState.prototype.updateSecondariesMaxStaleness = function(haInterval) { + for(var i = 0; i < this.secondaries.length; i++) { + this.updateServerMaxStaleness(this.secondaries[i], haInterval); + } +} + +/** + * Pick a server by the passed in ReadPreference + * @method + * @param {ReadPreference} readPreference The ReadPreference instance to use + * @return + */ ReplSetState.prototype.pickServer = function(readPreference) { // If no read Preference set to primary by default readPreference = readPreference || ReadPreference.primary; + // maxStalenessMS is not allowed with a primary read + if(readPreference.preference == 'primary' && readPreference.maxStalenessMS) { + return new MongoError('primary readPreference incompatible with maxStalenessMS'); + } + + // Check if we have any non compatible servers for maxStalenessMS + var allservers = this.primary ? [this.primary] : []; + allservers = allservers.concat(this.secondaries); + + // Does any of the servers not support the right wire protocol version + // for maxStalenessMS when maxStalenessMS specified on readPreference. Then error out + if(readPreference.maxStalenessMS) { + for(var i = 0; i < allservers.length; i++) { + if(allservers[i].ismaster.maxWireVersion < 5) { + return new MongoError('maxStalenessMS not supported by at least one of the replicaset members'); + } + } + } + // Do we have the nearest readPreference - if(readPreference.preference == 'nearest') { + if(readPreference.preference == 'nearest' && !readPreference.maxStalenessMS) { return pickNearest(this, readPreference); + } else if(readPreference.preference == 'nearest' && readPreference.maxStalenessMS) { + return pickNearestMaxStalenessMS(this, readPreference); } // Get all the secondaries @@ -535,32 +608,50 @@ ReplSetState.prototype.pickServer = function(readPreference) { if(readPreference.equals(ReadPreference.secondaryPreferred) || readPreference.equals(ReadPreference.secondary)) { - if(secondaries.length > 0) { - // Apply tags if present - var servers = filterByTags(readPreference, secondaries); + if(secondaries.length > 0 && !readPreference.maxStalenessMS) { // Pick nearest of any other servers available var server = pickNearest(this, readPreference); // No server in the window return primary - if(!server && readPreference.equals(ReadPreference.secondaryPreferred)) { - return this.primary; - } else { + if(server) { + return server; + } + } else if(secondaries.length > 0 && readPreference.maxStalenessMS) { + // Pick nearest of any other servers available + var server = pickNearestMaxStalenessMS(this, readPreference); + // No server in the window return primary + if(server) { return server; } } + if(readPreference.equals(ReadPreference.secondaryPreferred)){ + return this.primary; + } + return null; } // Primary preferred if(readPreference.equals(ReadPreference.primaryPreferred)) { - if(this.primary) return this.primary; + // console.log("!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! primaryPreferred") + var server = null; - if(secondaries.length > 0) { - // Apply tags if present - var servers = filterByTags(readPreference, secondaries); - // Pick nearest of any other servers available - return pickNearest(this, readPreference); + // We prefer the primary if it's available + if(this.primary) { + return this.primary; + } + + // Pick a secondary + if(secondaries.length > 0 && !readPreference.maxStalenessMS) { + // console.log("!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! primaryPreferred 0") + server = pickNearest(this, readPreference); + } else if(secondaries.length > 0 && readPreference.maxStalenessMS) { + // console.log("!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! primaryPreferred 1") + server = pickNearestMaxStalenessMS(this, readPreference); } + + // Did we find a server + if(server) return server; } // Return the primary @@ -602,6 +693,79 @@ var filterByTags = function(readPreference, servers) { return filteredServers; } +function pickNearestMaxStalenessMS(self, readPreference) { + // console.log("=== pickNearestMaxStalenessMS 0") + // Only get primary and secondaries as seeds + var seeds = {}; + var servers = []; + var heartbeatFrequencyMS = self.heartbeatFrequencyMS; + + // console.log("=== readPreference.maxStalenessMS = " + readPreference.maxStalenessMS) + // console.log("=== (heartbeatFrequencyMS * 2) = " + (heartbeatFrequencyMS * 2)) + + // Check if the maxStalenessMS > heartbeatFrequencyMS * 2 + if(readPreference.maxStalenessMS < (heartbeatFrequencyMS * 2)) { + return new MongoError('maxStalenessMS must be at least twice the haInterval'); + } + + // Add primary to list if not a secondary read preference + if(self.primary && readPreference.preference != 'secondary') { + servers.push(self.primary); + } + + // Add all the secondaries + for(var i = 0; i < self.secondaries.length; i++) { + servers.push(self.secondaries[i]); + } + + // Filter by tags + servers = filterByTags(readPreference, servers); + // console.log("=== pickNearestMaxStalenessMS 1 :: " + servers.length) + + // + // // Locate lowest time (picked servers are lowest time + acceptable Latency margin) + // var lowest = servers.length > 0 ? servers[0].lastIsMasterMS : 0; + + // Filter by latency + servers = servers.filter(function(s) { + // console.log(" == " + s.name + " :: " + s.staleness + " <= " + readPreference.maxStalenessMS) + return s.staleness <= readPreference.maxStalenessMS; + }); + // console.log("=== pickNearestMaxStalenessMS 2 :: " + servers.length) + + // Sort by time + servers.sort(function(a, b) { + // return a.time > b.time; + return a.lastIsMasterMS > b.lastIsMasterMS + }); + + // console.log("^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ servers.length = " + servers.length) + // console.log(servers.map(function(x) { return x.name})) + + // No servers, default to primary + if(servers.length == 0) { + return null + } + + // Ensure index does not overflow the number of available servers + self.index = self.index % servers.length; + + // // Does any of the servers not support the right wire protocol version + // // Then error out + // for(var i = 0; i < servers.length; i++) { + // if(servers[i].ismaster.maxWireVersion < 5) { + // return new MongoError('maxStalenessMS not supported by at least one of the replicaset members'); + // } + // } + + // Get the server + var server = servers[self.index]; + // Add to the index + self.index = self.index + 1; + // Return the first server of the sorted and filtered list + return server; +} + function pickNearest(self, readPreference) { // Only get primary and secondaries as seeds var seeds = {}; @@ -639,13 +803,14 @@ function pickNearest(self, readPreference) { return null } + // Ensure index does not overflow the number of available servers + self.index = self.index % servers.length; + // Get the server + var server = servers[self.index]; // Add to the index self.index = self.index + 1; - // Select the index - self.index = self.index % servers.length; - // Return the first server of the sorted and filtered list - return servers[self.index]; + return server; } function inList(ismaster, server, list) { diff --git a/node_modules/mongodb/node_modules/mongodb-core/lib/topologies/server.js b/node_modules/mongodb/node_modules/mongodb-core/lib/topologies/server.js index 6304274..265ff8d 100644 --- a/node_modules/mongodb/node_modules/mongodb-core/lib/topologies/server.js +++ b/node_modules/mongodb/node_modules/mongodb-core/lib/topologies/server.js @@ -15,7 +15,8 @@ var inherits = require('util').inherits, ThreeTwoWireProtocolSupport = require('../wireprotocol/3_2_support'), BasicCursor = require('../cursor'), sdam = require('./shared'), - assign = require('./shared').assign; + assign = require('./shared').assign, + createClientInfo = require('./shared').createClientInfo; // Used for filtering out fields for loggin var debugFields = ['reconnect', 'reconnectTries', 'reconnectInterval', 'emitError', 'cursorFactory', 'host' @@ -52,6 +53,8 @@ var servers = {}; * @param {string} [options.passphrase] SSL Certificate pass phrase * @param {boolean} [options.rejectUnauthorized=true] Reject unauthorized server certificates * @param {boolean} [options.promoteLongs=true] Convert Long values from the db into Numbers if they fit into 53 bits + * @param {string} [options.appname=null] Application name, passed in on ismaster call and logged in mongod server logs. Maximum size 128 bytes. + * @param {boolean} [options.domainsEnabled=false] Enable the wrapping of the callback in the current domain, disabled by default to avoid perf hit. * @return {Server} A cursor instance * @fires Server#connect * @fires Server#close @@ -118,6 +121,16 @@ var Server = function(options) { this.wireProtocolHandler = new PreTwoSixWireProtocolSupport(); // Default type this._type = 'server'; + // Set the client info + this.clientInfo = createClientInfo(options); + + // Max Stalleness values + // last time we updated the ismaster state + this.lastUpdateTime = 0; + // Last write time + this.lastWriteDate = 0; + // Stalleness + this.staleness = 0; } inherits(Server, EventEmitter); @@ -184,7 +197,7 @@ function monitoringProcess(self) { // Query options var queryOptions = { numberToSkip: 0, numberToReturn: -1, checkKeys: false, slaveOk: true }; // Create a query instance - var query = new Query(self.s.bson, 'admin.$cmd', {ismaster:true}, queryOptions); + var query = new Query(self.s.bson, 'admin.$cmd', {ismaster:true, client: self.clientInfo}, queryOptions); // Get start time var start = new Date().getTime(); // Execute the ismaster query @@ -195,11 +208,6 @@ function monitoringProcess(self) { // Update the ismaster view if we have a result if(result) { self.ismaster = result.result; - // It's a proxy change the type so - // the wireprotocol will send $readPreference - if(self.ismaster.msg == 'isdbgrid') { - self._type = 'mongos'; - } } // Re-schedule the monitoring process self.monitoringProcessId = setTimeout(monitoringProcess(self), self.s.monitoringInterval); @@ -239,6 +247,11 @@ var eventHandler = function(self, event) { self.initalConnect = false; // Save the ismaster self.ismaster = result.result; + // It's a proxy change the type so + // the wireprotocol will send $readPreference + if(self.ismaster.msg == 'isdbgrid') { + self._type = 'mongos'; + } // Add the correct wire protocol handler self.wireProtocolHandler = configureWireProtocolHandler(self, self.ismaster); // Have we defined self monitoring @@ -449,6 +462,11 @@ Server.prototype.command = function(ns, cmd, options, callback) { // If we are not connected or have a disconnectHandler specified if(disconnectHandler(self, 'command', ns, cmd, options, callback)) return; + // Check if we have collation support + if(this.ismaster && this.ismaster.maxWireVersion < 5 && cmd.collation) { + return callback(new MongoError(f('server %s does not support collation', this.name))); + } + // Query options var queryOptions = { numberToSkip: 0, @@ -522,6 +540,11 @@ Server.prototype.update = function(ns, ops, options, callback) { // If we are not connected or have a disconnectHandler specified if(disconnectHandler(self, 'update', ns, ops, options, callback)) return; + // Check if we have collation support + if(this.ismaster && this.ismaster.maxWireVersion < 5 && options.collation) { + return callback(new MongoError(f('server %s does not support collation', this.name))); + } + // Setup the docs as an array ops = Array.isArray(ops) ? ops : [ops]; // Execute write @@ -548,6 +571,11 @@ Server.prototype.remove = function(ns, ops, options, callback) { // If we are not connected or have a disconnectHandler specified if(disconnectHandler(self, 'remove', ns, ops, options, callback)) return; + // Check if we have collation support + if(this.ismaster && this.ismaster.maxWireVersion < 5 && options.collation) { + return callback(new MongoError(f('server %s does not support collation', this.name))); + } + // Setup the docs as an array ops = Array.isArray(ops) ? ops : [ops]; // Execute write diff --git a/node_modules/mongodb/node_modules/mongodb-core/lib/topologies/shared.js b/node_modules/mongodb/node_modules/mongodb-core/lib/topologies/shared.js index 902ac98..51c7e15 100644 --- a/node_modules/mongodb/node_modules/mongodb-core/lib/topologies/shared.js +++ b/node_modules/mongodb/node_modules/mongodb-core/lib/topologies/shared.js @@ -1,5 +1,8 @@ "use strict" +var os = require('os'), + f = require('util').format; + /** * Emit event if it exists * @method @@ -10,6 +13,53 @@ function emitSDAMEvent(self, event, description) { } } +// Get package.json variable +var driverVersion = require(__dirname + '/../../package.json').version; +var nodejsversion = f('Node.js %s, %s', process.version, os.endianness()); +var type = os.type(); +var name = process.platform; +var architecture = process.arch; +var release = os.release(); + +function createClientInfo(options) { + // Build default client information + var clientInfo = options.clientInfo ? clone(options.clientInfo) : { + driver: { + name: "nodejs-core", + version: driverVersion + }, + os: { + type: type, + name: name, + architecture: architecture, + version: release + } + } + + // Is platform specified + if(clientInfo.platform && clientInfo.platform.indexOf('mongodb-core') == -1) { + clientInfo.platform = f('%s, mongodb-core: %s', clientInfo.platform, driverVersion); + } else if(!clientInfo.platform){ + clientInfo.platform = nodejsversion; + } + + // Do we have an application specific string + if(options.appname) { + // Cut at 128 bytes + var buffer = new Buffer(options.appname); + // Return the truncated appname + var appname = buffer.length > 128 ? buffer.slice(0, 128).toString('utf8') : options.appname; + // Add to the clientInfo + clientInfo.application = { name: appname }; + } + + return clientInfo; +} + +function clone(object) { + return JSON.parse(JSON.stringify(object)); +} + var getPreviousDescription = function(self) { if(!self.s.serverDescription) { self.s.serverDescription = { @@ -171,3 +221,5 @@ module.exports.emitServerDescriptionChanged = emitServerDescriptionChanged; module.exports.emitTopologyDescriptionChanged = emitTopologyDescriptionChanged; module.exports.cloneOptions = cloneOptions; module.exports.assign = assign; +module.exports.createClientInfo = createClientInfo; +module.exports.clone = clone; diff --git a/node_modules/mongodb/node_modules/mongodb-core/lib/wireprotocol/3_2_support.js b/node_modules/mongodb/node_modules/mongodb-core/lib/wireprotocol/3_2_support.js index dc919e1..21c6fee 100644 --- a/node_modules/mongodb/node_modules/mongodb-core/lib/wireprotocol/3_2_support.js +++ b/node_modules/mongodb/node_modules/mongodb-core/lib/wireprotocol/3_2_support.js @@ -47,6 +47,11 @@ var executeWrite = function(pool, bson, type, opsField, ns, ops, options, callba writeCommand.writeConcern = writeConcern; } + // If we have collation passed in + if(options.collation) { + writeCommand.collation = options.collation; + } + // Do we have bypassDocumentValidation set, then enable it on the write command if(typeof options.bypassDocumentValidation == 'boolean') { writeCommand.bypassDocumentValidation = options.bypassDocumentValidation; @@ -427,6 +432,9 @@ var executeFindCommand = function(bson, ns, cmd, cursorState, topology, options) // If we have partial set if(cmd.partial) findCmd.partial = cmd.partial; + // If we have collation passed in + if(cmd.collation) findCmd.collation = cmd.collation; + // If we have explain, we need to rewrite the find command // to wrap it in the explain command if(cmd.explain) { diff --git a/node_modules/mongodb/node_modules/mongodb-core/node_modules/bson/package.json b/node_modules/mongodb/node_modules/mongodb-core/node_modules/bson/package.json index eda7718..5dd8576 100644 --- a/node_modules/mongodb/node_modules/mongodb-core/node_modules/bson/package.json +++ b/node_modules/mongodb/node_modules/mongodb-core/node_modules/bson/package.json @@ -22,7 +22,7 @@ "contributors": [], "repository": { "type": "git", - "url": "https://github.com/mongodb/js-bson" + "url": "git+https://github.com/mongodb/js-bson.git" }, "bugs": { "url": "https://github.com/mongodb/js-bson/issues" @@ -77,5 +77,6 @@ "host": "packages-12-west.internal.npmjs.com", "tmp": "tmp/bson-0.5.2.tgz_1468236520063_0.9097728193737566" }, - "_resolved": "https://registry.npmjs.org/bson/-/bson-0.5.2.tgz" + "_resolved": "https://registry.npmjs.org/bson/-/bson-0.5.2.tgz", + "readme": "ERROR: No README data found!" } diff --git a/node_modules/mongodb/node_modules/mongodb-core/package.json b/node_modules/mongodb/node_modules/mongodb-core/package.json index bce4ac8..7f542ea 100644 --- a/node_modules/mongodb/node_modules/mongodb-core/package.json +++ b/node_modules/mongodb/node_modules/mongodb-core/package.json @@ -1,6 +1,6 @@ { "name": "mongodb-core", - "version": "2.0.6", + "version": "2.0.7", "description": "Core MongoDB driver functionality, no bells and whistles and meant for integration not end applications", "main": "index.js", "scripts": { @@ -45,31 +45,30 @@ "url": "https://github.com/christkv/mongodb-core/issues" }, "homepage": "https://github.com/christkv/mongodb-core", - "gitHead": "0860eb4ed58155f9e4a5fb7212b93e27cf10f5a2", - "_id": "mongodb-core@2.0.6", - "_shasum": "7f1be79d886495c8ad696d70e3be834d61e1b843", - "_from": "mongodb-core@2.0.6", - "_npmVersion": "2.15.1", - "_nodeVersion": "4.4.4", + "gitHead": "4c65217e78d5d8c1a4cff92d838a6da51832cd26", + "_id": "mongodb-core@2.0.7", + "_shasum": "de66b8b82e83fa33e444727ff3cca80e6f5575b9", + "_from": "mongodb-core@2.0.7", + "_npmVersion": "3.9.5", + "_nodeVersion": "6.2.2", "_npmUser": { "name": "christkv", "email": "christkv@gmail.com" }, + "dist": { + "shasum": "de66b8b82e83fa33e444727ff3cca80e6f5575b9", + "tarball": "https://registry.npmjs.org/mongodb-core/-/mongodb-core-2.0.7.tgz" + }, "maintainers": [ { "name": "christkv", "email": "christkv@gmail.com" } ], - "dist": { - "shasum": "7f1be79d886495c8ad696d70e3be834d61e1b843", - "tarball": "https://registry.npmjs.org/mongodb-core/-/mongodb-core-2.0.6.tgz" - }, "_npmOperationalInternal": { "host": "packages-16-east.internal.npmjs.com", - "tmp": "tmp/mongodb-core-2.0.6.tgz_1468890618992_0.7638309949543327" + "tmp": "tmp/mongodb-core-2.0.7.tgz_1469715766894_0.6432066669221967" }, "directories": {}, - "_resolved": "https://registry.npmjs.org/mongodb-core/-/mongodb-core-2.0.6.tgz", - "readme": "ERROR: No README data found!" + "_resolved": "https://registry.npmjs.org/mongodb-core/-/mongodb-core-2.0.7.tgz" } diff --git a/node_modules/mongodb/package.json b/node_modules/mongodb/package.json index c911e92..05259a6 100644 --- a/node_modules/mongodb/package.json +++ b/node_modules/mongodb/package.json @@ -1,6 +1,6 @@ { "name": "mongodb", - "version": "2.2.4", + "version": "2.2.5", "description": "The official MongoDB driver for Node.js", "main": "index.js", "repository": { @@ -14,7 +14,7 @@ ], "dependencies": { "es6-promise": "3.0.2", - "mongodb-core": "2.0.6", + "mongodb-core": "2.0.7", "readable-stream": "1.0.31" }, "devDependencies": { @@ -60,31 +60,30 @@ ] }, "homepage": "https://github.com/mongodb/node-mongodb-native", - "gitHead": "d257f3efa0861f3ce908042774bbe276ebafd40a", - "_id": "mongodb@2.2.4", - "_shasum": "1e7af8d5f91df6f9936598ff2c960abc39828f17", + "gitHead": "b8951320ec54b52db70a2e70352792f25c8c743a", + "_id": "mongodb@2.2.5", + "_shasum": "3ae71f8b38a24634a4ebebaf5bba983ecf3af2bd", "_from": "mongodb@>=2.2.2 <3.0.0", - "_npmVersion": "2.15.1", - "_nodeVersion": "4.4.4", + "_npmVersion": "3.9.5", + "_nodeVersion": "6.2.2", "_npmUser": { "name": "christkv", "email": "christkv@gmail.com" }, + "dist": { + "shasum": "3ae71f8b38a24634a4ebebaf5bba983ecf3af2bd", + "tarball": "https://registry.npmjs.org/mongodb/-/mongodb-2.2.5.tgz" + }, "maintainers": [ { "name": "christkv", "email": "christkv@gmail.com" } ], - "dist": { - "shasum": "1e7af8d5f91df6f9936598ff2c960abc39828f17", - "tarball": "https://registry.npmjs.org/mongodb/-/mongodb-2.2.4.tgz" - }, "_npmOperationalInternal": { "host": "packages-16-east.internal.npmjs.com", - "tmp": "tmp/mongodb-2.2.4.tgz_1468891370725_0.9366551062557846" + "tmp": "tmp/mongodb-2.2.5.tgz_1469729089075_0.6204880196601152" }, "directories": {}, - "_resolved": "https://registry.npmjs.org/mongodb/-/mongodb-2.2.4.tgz", - "readme": "ERROR: No README data found!" + "_resolved": "https://registry.npmjs.org/mongodb/-/mongodb-2.2.5.tgz" } diff --git a/node_modules/sanitizer/package.json b/node_modules/sanitizer/package.json index 5debe06..d8b812f 100644 --- a/node_modules/sanitizer/package.json +++ b/node_modules/sanitizer/package.json @@ -41,5 +41,6 @@ } ], "directories": {}, - "_resolved": "https://registry.npmjs.org/sanitizer/-/sanitizer-0.1.3.tgz" + "_resolved": "https://registry.npmjs.org/sanitizer/-/sanitizer-0.1.3.tgz", + "readme": "ERROR: No README data found!" } diff --git a/node_modules/supertest/node_modules/superagent/node_modules/component-emitter/package.json b/node_modules/supertest/node_modules/superagent/node_modules/component-emitter/package.json index ac6f74e..5d878cc 100644 --- a/node_modules/supertest/node_modules/superagent/node_modules/component-emitter/package.json +++ b/node_modules/supertest/node_modules/superagent/node_modules/component-emitter/package.json @@ -177,5 +177,6 @@ "tmp": "tmp/component-emitter-1.2.1.tgz_1461005707641_0.14232611074112356" }, "directories": {}, - "_resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz" + "_resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz", + "readme": "ERROR: No README data found!" } diff --git a/node_modules/supertest/node_modules/superagent/node_modules/form-data/node_modules/async/package.json b/node_modules/supertest/node_modules/superagent/node_modules/form-data/node_modules/async/package.json index cdcd141..4bcdc92 100644 --- a/node_modules/supertest/node_modules/superagent/node_modules/form-data/node_modules/async/package.json +++ b/node_modules/supertest/node_modules/superagent/node_modules/form-data/node_modules/async/package.json @@ -88,7 +88,7 @@ "homepage": "https://github.com/caolan/async#readme", "_id": "async@1.5.2", "_shasum": "ec6a61ae56480c0c3cb241c95618e20892f9672a", - "_from": "async@>=1.5.2 <2.0.0", + "_from": "async@>=1.4.0 <2.0.0", "_npmVersion": "3.5.2", "_nodeVersion": "4.2.3", "_npmUser": { diff --git a/node_modules/supertest/node_modules/superagent/node_modules/form-data/package.json b/node_modules/supertest/node_modules/superagent/node_modules/form-data/package.json index 6bfb06f..6143d76 100644 --- a/node_modules/supertest/node_modules/superagent/node_modules/form-data/package.json +++ b/node_modules/supertest/node_modules/superagent/node_modules/form-data/package.json @@ -80,5 +80,6 @@ } ], "directories": {}, - "_resolved": "https://registry.npmjs.org/form-data/-/form-data-1.0.0-rc3.tgz" + "_resolved": "https://registry.npmjs.org/form-data/-/form-data-1.0.0-rc3.tgz", + "readme": "ERROR: No README data found!" } diff --git a/node_modules/supertest/node_modules/superagent/node_modules/qs/package.json b/node_modules/supertest/node_modules/superagent/node_modules/qs/package.json index c040d31..9ebfaca 100644 --- a/node_modules/supertest/node_modules/superagent/node_modules/qs/package.json +++ b/node_modules/supertest/node_modules/superagent/node_modules/qs/package.json @@ -14,7 +14,7 @@ }, "repository": { "type": "git", - "url": "https://github.com/hapijs/qs.git" + "url": "git+https://github.com/hapijs/qs.git" }, "keywords": [ "querystring", @@ -54,5 +54,6 @@ "tarball": "https://registry.npmjs.org/qs/-/qs-2.3.3.tgz" }, "directories": {}, - "_resolved": "https://registry.npmjs.org/qs/-/qs-2.3.3.tgz" + "_resolved": "https://registry.npmjs.org/qs/-/qs-2.3.3.tgz", + "readme": "ERROR: No README data found!" } diff --git a/node_modules/supertest/node_modules/superagent/node_modules/readable-stream/package.json b/node_modules/supertest/node_modules/superagent/node_modules/readable-stream/package.json index 62d4c9f..654fc52 100644 --- a/node_modules/supertest/node_modules/superagent/node_modules/readable-stream/package.json +++ b/node_modules/supertest/node_modules/superagent/node_modules/readable-stream/package.json @@ -17,7 +17,7 @@ }, "repository": { "type": "git", - "url": "git://github.com/isaacs/readable-stream" + "url": "git://github.com/isaacs/readable-stream.git" }, "keywords": [ "readable", @@ -64,5 +64,6 @@ ], "directories": {}, "_shasum": "6b67983c20357cefd07f0165001a16d710d91078", - "_resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.27-1.tgz" + "_resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.27-1.tgz", + "readme": "ERROR: No README data found!" } diff --git a/node_modules/supertest/node_modules/superagent/node_modules/reduce-component/package.json b/node_modules/supertest/node_modules/superagent/node_modules/reduce-component/package.json index a74c28d..0611e13 100644 --- a/node_modules/supertest/node_modules/superagent/node_modules/reduce-component/package.json +++ b/node_modules/supertest/node_modules/superagent/node_modules/reduce-component/package.json @@ -42,5 +42,6 @@ ], "directories": {}, "_shasum": "e0c93542c574521bea13df0f9488ed82ab77c5da", - "_resolved": "https://registry.npmjs.org/reduce-component/-/reduce-component-1.0.1.tgz" + "_resolved": "https://registry.npmjs.org/reduce-component/-/reduce-component-1.0.1.tgz", + "homepage": "https://github.com/redventures/reduce#readme" } diff --git a/node_modules/supertest/node_modules/superagent/package.json b/node_modules/supertest/node_modules/superagent/package.json index aad028a..10d2dbb 100644 --- a/node_modules/supertest/node_modules/superagent/package.json +++ b/node_modules/supertest/node_modules/superagent/package.json @@ -142,5 +142,6 @@ "tmp": "tmp/superagent-1.8.3.tgz_1458840247188_0.5249448795802891" }, "directories": {}, - "_resolved": "https://registry.npmjs.org/superagent/-/superagent-1.8.3.tgz" + "_resolved": "https://registry.npmjs.org/superagent/-/superagent-1.8.3.tgz", + "readme": "ERROR: No README data found!" } diff --git a/node_modules/supertest/package.json b/node_modules/supertest/package.json index 08d213c..e00d436 100644 --- a/node_modules/supertest/package.json +++ b/node_modules/supertest/package.json @@ -83,5 +83,6 @@ "tmp": "tmp/supertest-1.2.0.tgz_1455204548964_0.9615733381360769" }, "directories": {}, - "_resolved": "https://registry.npmjs.org/supertest/-/supertest-1.2.0.tgz" + "_resolved": "https://registry.npmjs.org/supertest/-/supertest-1.2.0.tgz", + "readme": "ERROR: No README data found!" } diff --git a/node_modules/underscore/package.json b/node_modules/underscore/package.json index 17117cd..767d587 100644 --- a/node_modules/underscore/package.json +++ b/node_modules/underscore/package.json @@ -65,5 +65,6 @@ "tarball": "https://registry.npmjs.org/underscore/-/underscore-1.8.3.tgz" }, "directories": {}, - "_resolved": "https://registry.npmjs.org/underscore/-/underscore-1.8.3.tgz" + "_resolved": "https://registry.npmjs.org/underscore/-/underscore-1.8.3.tgz", + "readme": "ERROR: No README data found!" } diff --git a/node_simple.js b/node_simple.js index bfb5d43..7ed1f74 100644 --- a/node_simple.js +++ b/node_simple.js @@ -270,6 +270,7 @@ exports.retrieve_userComments_history = function (username, callback) { } }); + function doCall() { callback(true, mylist); } @@ -346,7 +347,7 @@ exports.retrieve_userSolutions_count = function (username, callback) { * IFF both the email and the user_name are not in the database already. * If either of them exist, the user is NOT added. * - * @param {string[]} fields: [email, user_name, f_name, l_name, uni, department, password, phone_num] + * @param {string[]} fields: [email, user_name, f_name, l_name, uni, department, password, phone_num, facebook_id] * @param {function} callbackUser: of the form (, , ) * where, - * - @@ -365,7 +366,8 @@ exports.add_user = function (fields, callbackUser) { messages: 0, comments: 0, phone_num: fields[7], - followers: [] + followers: [], + fb_id: fields[8] }; var login_data = { @@ -528,6 +530,31 @@ exports.retrieveUser = function (username, callback) { }); }; +/** + * This function retrieves the user object given their Facebook username. + * + * @param {string} id: the user's facebook id + * @param {function} callback: with args (,,,) + * where, : success ? true : false + * where, : error ? true : false + * where, : success ? {Obj} : null + * where, : success ? success_mssg : err_mssg + * */ +exports.retrieveUserById = function(id, callback){ + var users = db.collection('users'); + + users.find({fb_id: id}).toArray(function(err, result) { + if (err) { + // callback(success, error, user, message) + callback(false, true, null, "Error : Could not retrieve user."); + } else if (result.length) { + callback(true, false, result[0], "User retrieved"); + } else { + callback(false, false, null, "ID is undefined."); + } + }); +} + /** * Returns the hashed password given the username. Assume username exists. * Used for both admins and users. diff --git a/routes/admin.js b/routes/admin.js index 6518aef..68bb456 100644 --- a/routes/admin.js +++ b/routes/admin.js @@ -125,7 +125,7 @@ router.post('/add/course', function(req,res){ req.sanitize('title').escape(); req.sanitize('title').trim(); - req.check('title','Invalid title').isAlpha(); + //req.check('title','Invalid title'); var errors = req.validationErrors(); @@ -262,7 +262,7 @@ router.post('/remove/user', function(req,res){ req.sanitize('username').escape(); req.check('username','Invalid user name format').notEmpty(); - var errors = validationErrors(); + var errors = req.validationErrors(); if (errors){ req.session.errors = errors; req.session.success = false; diff --git a/routes/index.js b/routes/index.js index b2a90dc..c87ced9 100644 --- a/routes/index.js +++ b/routes/index.js @@ -271,7 +271,7 @@ router.get('/solutions/:exam_id/:q_num', function (req, res) { /** Redirect the user to Facebook for authentication. When complete, Facebook will redirect the user back to the application at /auth/facebook/callback */ -router.get('/auth/facebook', passport.authenticate('facebook')); +router.get('/auth/facebook', passport.authenticate('facebook', { scope: ['email']})); /** Facebook will redirect the user to this URL after approval. Finish the authentication process by attempting to obtain an access token. If @@ -280,7 +280,7 @@ router.get('/auth/facebook', passport.authenticate('facebook')); router.get('/auth/facebook/callback', passport.authenticate('facebook', { successRedirect: '/user/user_profile', - failureRedirect: '/user/logout' })); + failureRedirect: '/user/signin' })); diff --git a/routes/user.js b/routes/user.js index 8f73f21..56b5321 100644 --- a/routes/user.js +++ b/routes/user.js @@ -190,7 +190,7 @@ router.post('/signup', loggedOut, function(req, res, next) { res.redirect('/user/signup'); } else { passport.authenticate('local_signup', { - successRedirect: '/user/verify', + successRedirect: '/user/user_profile', failureRedirect: '/user/signup/failed', failureFlash: true })(req, res); @@ -210,7 +210,7 @@ router.post('/signin', loggedOut, function(req, res, next) { res.redirect('/signin'); } else { passport.authenticate('local_signin', { - successRedirect: '/user/verify', + successRedirect: '/user/user_profile', failureRedirect: '/user/signin', failureFlash: true })(req, res); diff --git a/views/partials/header.hbs b/views/partials/header.hbs index 8931204..57db052 100644 --- a/views/partials/header.hbs +++ b/views/partials/header.hbs @@ -114,11 +114,7 @@ {{# if login }} {{# if user.email }} - {{# if user.login_info}}
  • Profile Page
  • - {{else}} -
  • Sign In
  • - {{/if}} {{else}}
  • Admin Panel
  • {{/if}} @@ -128,14 +124,7 @@ {{# if login }} - {{# if user.login_info}}
  • Logout
  • - {{else if user.email}} -
  • Sign up
  • - {{ else }} -
  • Logout
  • - - {{/if}} {{ else }}
  • Sign up
  • {{/if}} diff --git a/views/signin.hbs b/views/signin.hbs index 7bea713..b112485 100644 --- a/views/signin.hbs +++ b/views/signin.hbs @@ -24,7 +24,12 @@ {{/if}} -

    Sign In

    + + + +
    + + + \ No newline at end of file -- cgit v1.2.3