diff --git a/.jshintignore b/.eslintignore similarity index 100% rename from .jshintignore rename to .eslintignore diff --git a/.eslintrc b/.eslintrc new file mode 100644 index 0000000..f2cf6c8 --- /dev/null +++ b/.eslintrc @@ -0,0 +1,49 @@ +{ + "extends": ["airbnb", "prettier", "prettier/react"], + "parser": "babel-eslint", + "parserOptions": {"ecmaVersion": 6, "sourceType": "module"}, + "env": {"browser": true, "jest": true, "mocha": true, "node": true}, + "reportUnusedDisableDirectives": true, + "rules": { + "no-param-reassign-allow-reduce/allow-reduce": 2, + "camelcase": 0, + "class-methods-use-this": 0, + "consistent-return": 0, + "default-case": 0, + "global-require": 0, + "import/default": 0, + "import/no-extraneous-dependencies": [ + "error", + { + "devDependencies": true, + "optionalDependencies": false, + "peerDependencies": true + } + ], + "import/prefer-default-export": 0, + "lines-between-class-members": 0, + "max-statements": [2, 15], + "new-cap": 0, + "no-alert": 2, + "no-async-promise-executor": 0, + "no-case-declarations": 0, + "no-control-regex": 0, + "no-console": 1, + "no-extra-boolean-cast": 0, + "no-fallthrough": ["error", {"commentPattern": "break[\\s\\w]*omitted"}], + "no-only-tests/no-only-tests": 2, + "no-param-reassign": 0, + "no-restricted-globals": 0, + "no-restricted-syntax": ["error", "ForInStatement", "LabeledStatement", "WithStatement"], + "no-return-assign": 0, + "no-underscore-dangle": 0, + "no-useless-escape": 0, + "no-useless-return": 0, + "one-var": 0, + "operator-assignment": 0, + "padding-line-between-statements": ["error", {"blankLine": "always", "next": "export", "prev": "const"}], + "prefer-const": 0, + "prefer-promise-reject-errors": 0, + "prefer-template": 0 + } +} diff --git a/.jshintrc b/.jshintrc index c408fd1..0ed71f2 100644 --- a/.jshintrc +++ b/.jshintrc @@ -1,16 +1,9 @@ { - "predef": [ - "before", - "after", - "it", - "describe", - "beforeEach", - "afterEach" - ], - "asi" : false, - "bitwise" : true, - "boss" : false, - "curly" : true, + "predef": ["before", "after", "it", "describe", "beforeEach", "afterEach"], + "asi": false, + "bitwise": true, + "boss": false, + "curly": true, "debug": false, "devel": false, "eqeqeq": false, @@ -18,12 +11,12 @@ "expr": true, "forin": false, "immed": true, - "latedef" : false, + "latedef": false, "laxbreak": false, "multistr": true, "newcap": true, "noarg": true, - "node" : true, + "node": true, "noempty": false, "nonew": true, "onevar": false, @@ -31,8 +24,7 @@ "regexp": false, "strict": false, "sub": false, - "trailing" : true, + "trailing": true, "undef": true, "unused": true - -} \ No newline at end of file +} diff --git a/.prettierrc b/.prettierrc new file mode 100644 index 0000000..2bdd1fd --- /dev/null +++ b/.prettierrc @@ -0,0 +1,33 @@ +{ + "printWidth": 120, + "arrowParens": "always", + "semi": true, + "useTabs": true, + "tabWidth": 4, + "bracketSpacing": false, + "jsxBracketSameLine": false, + "singleQuote": true, + "trailingComma": "es5", + "overrides": [ + { + "files": [".prettierrc", ".eslintrc", ".stylelintrc", ".babelrc"], + "options": { + "parser": "json" + } + }, + { + "files": ["*.yaml", "*.yml"], + "options": { + "useTabs": false, + "tabWidth": 2 + } + }, + { + "files": ["package.json"], + "options": { + "useTabs": false, + "tabWidth": 2 + } + } + ] +} diff --git a/Collection.js b/Collection.js index dde5757..e697b9f 100644 --- a/Collection.js +++ b/Collection.js @@ -1,7 +1,6 @@ var _ = require('./util'); var Cursor = require('./Cursor'); -function noop() { -} +function noop() {} function Collection(initialArray) { this._data = initialArray.slice(); @@ -24,7 +23,7 @@ Collection.prototype.save = function (doc, options, callback) { callback = options; } if (doc._id) { - this.update({_id: doc._id}, doc, { upsert: true }, callback); + this.update({_id: doc._id}, doc, {upsert: true}, callback); } else { this.insert(doc, callback); } @@ -36,7 +35,7 @@ Collection.prototype.findOne = function (query, callback) { Collection.prototype.count = function (query, options, callback) { if ('function' === typeof options) { - callback = options, options = {}; + (callback = options), (options = {}); } if (options === null) { options = {}; @@ -58,7 +57,7 @@ Collection.prototype.toArray = function (callback) { Collection.prototype.insert = function (doc, options, callback) { if ('function' === typeof options) { - callback = options, options = {}; + (callback = options), (options = {}); } if (options === null) { @@ -76,7 +75,7 @@ Collection.prototype.insert = function (doc, options, callback) { Collection.prototype.update = function (query, modifier, options, callback) { if ('function' === typeof options) { - callback = options, options = {}; + (callback = options), (options = {}); } if (options === null) { @@ -106,7 +105,7 @@ Collection.prototype.remove = function (query, callback) { Collection.prototype.findAndModify = function (query, sort, modifier, options, callback) { if ('function' === typeof options) { - callback = options, options = {}; + (callback = options), (options = {}); } if (options === null) { @@ -126,4 +125,4 @@ Collection.prototype.findAndModify = function (query, sort, modifier, options, c callback(null, doc); }; -module.exports = Collection; \ No newline at end of file +module.exports = Collection; diff --git a/Collection.ts b/Collection.ts new file mode 100644 index 0000000..06ff84f --- /dev/null +++ b/Collection.ts @@ -0,0 +1,10 @@ +import {Cursor} from './Cursor'; + +export class Collection { + private items: T[]; + constructor(data: T[]) { + this.items = {...data}; + } + private restore() {} + public find(query: Record): Cursor {} +} diff --git a/Cursor.js b/Cursor.js index 830c16b..865364c 100644 --- a/Cursor.js +++ b/Cursor.js @@ -1,114 +1,110 @@ -//cowboy cursor mock -var util = require('util'); -var _q = require('./util'); -var ReadableStream = require('stream').Readable; -function map(fields) { - var keys = Object.keys(fields); - var exclude = keys.every(function(key) { - return fields[key] === -1; - }); - var include = keys.every(function(key) { - return !!fields[key] && fields[key] !== -1; - }); - if(!exclude && !include) { - throw 'you can either select fields to include, or select fields to exclude'; - } - return function(doc) { - var mapped = {}; - - if (exclude) { - keys.forEach(function (key) { - delete doc[key]; - }); - return doc; - } - - keys.forEach(function (key) { - mapped[key] = doc[key]; - }); - return mapped; - }; -} - -var Cursor = function (source, query, fields, options) { - this._fields = fields || {}; - this._source =_q(source).find(query, options); - this.data = null; - this.index = 0; - ReadableStream.call(this, {objectMode: true}); -}; - -util.inherits(Cursor, ReadableStream); - -Cursor.prototype._read = function () { - var self = this; - - if (this.index < this._source.length) { - //mock 'reading time' - setTimeout(function () { - self.push(map(self._fields)(self._source[self.index])); - self.index++; - },5); - } else { - self.push(null); - } -}; - -Cursor.prototype.toArray = function (callback) { - if (this.data===null) { - this.data = this._source.map(map(this._fields)); - } - callback(null, this.data); -}; - -Cursor.prototype.sort = function(sortObj) { - if (this.data===null) { - this.data = this._source.map(map(this._fields)); - } - this.data = this.data.sort(function(i1,i2){ - for (var d in sortObj) { - if (sortObj.hasOwnProperty(d)) { - if (i1[d]>i2[d]) { - return sortObj[d]; - } - if (i1[d] i2[d]) { + return sortObj[d]; + } + if (i1[d] < i2[d]) { + return -1 * sortObj[d]; + } + } + } + return 0; + }); + return this; +}; + +Cursor.prototype.hasNext = function () { + if (this.data === null) { + this.data = this._source.map(map(this._fields)); + } + return this.index < this.data.length; +}; + +Cursor.prototype.next = function () { + if (this.data === null) { + this.data = this._source.map(map(this._fields)); + } + var dat = this.data[this.index]; + this.index++; + return dat; +}; + +Cursor.prototype.batchSize = function () { + return this; +}; + +Cursor.prototype.addCursorFlag = function () { + return this; +}; + +Cursor.prototype.close = function () {}; + +module.exports = Cursor; diff --git a/Cursor.ts b/Cursor.ts new file mode 100644 index 0000000..d099415 --- /dev/null +++ b/Cursor.ts @@ -0,0 +1,3 @@ +export class Cursor { + constructor() {} +} diff --git a/MongoMock.js b/MongoMock.js deleted file mode 100644 index 6e45c9a..0000000 --- a/MongoMock.js +++ /dev/null @@ -1,24 +0,0 @@ -var Collection = require("./Collection"); - -function MongoMock (collections) { - var self = this; - Object.keys(collections).forEach(function(key) { - if(!collections[key] instanceof Array){ - throw key+" collection should be an array"; - } - self[key] = new Collection(collections[key]); - }); -} - -MongoMock.prototype.collection = function(collectionName, callback) { - if(!callback) { - return this[collectionName]; - } - return callback(null, this[collectionName]); -}; - -MongoMock.prototype.ensureIndex = function (collection, index, options, callback) { - callback(null, index); -}; - -module.exports = MongoMock; \ No newline at end of file diff --git a/MongoMock.ts b/MongoMock.ts new file mode 100644 index 0000000..ba6d9df --- /dev/null +++ b/MongoMock.ts @@ -0,0 +1,17 @@ +import {Collection} from './Collection'; + +export class MongoMock { + private collections: Map> = new Map(); + + setCollection(collectionName: string, data: T[]) { + this.collections.set(collectionName, new Collection(data)); + } + + async collection(collectionName: string): Promise | undefined> { + const collection = this.collections.get(collectionName); + if (typeof collection !== undefined) { + return collection as Collection; + } + return undefined; + } +} diff --git a/README.md b/README.md index 2554684..8450df1 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,6 @@ [![NPM](https://nodei.co/npm/mongomock.png?downloads=true)](https://nodei.co/npm/mongomock/) -mongomock -========= +# mongomock mongoDb-native mocking library @@ -15,6 +14,7 @@ You can try a playground [here](http://andrewgrachov.github.io/mongo-query/) **bson** #Install + ``` npm install mongomock ``` @@ -37,12 +37,12 @@ mongo.collection('fruits').find({price:20}).toArray(function(err,fruits){ console.log("YAHOO we have fruits with price 20 now!",fruits); }) ``` + **Update 0.1.0** basic cursor implementation without skip/limit chaining #Testing - Tests use mocha. Install mocha globally, then run ``` @@ -50,67 +50,67 @@ npm test ``` #Methods support - **collection.find(query, fields, options)** - returns readable stream +**collection.find(query, fields, options)** - returns readable stream - **collection.findOne(query, callback)** +**collection.findOne(query, callback)** - **collection.update(query,modifier,options,callback)** +**collection.update(query,modifier,options,callback)** - **collection.insert(doc,callback)** +**collection.insert(doc,callback)** - **collection.remove(query,callback)** +**collection.remove(query,callback)** - **collection.findAndModify(doc,modifier,options,callback)** +**collection.findAndModify(doc,modifier,options,callback)** - **collection.save(doc,callback)** +**collection.save(doc,callback)** #Query operators support: - **$gte** +**\$gte** - **$gt** +**\$gt** - **$lt** +**\$lt** - **$lte** +**\$lte** - **$in** +**\$in** - **$regex** +**\$regex** - **$and** +**\$and** - **$or** +**\$or** - **$ne** +**\$ne** - **$nin** +**\$nin** - **$size** +**\$size** - **$elemMatch** +**\$elemMatch** - **$exists** +**\$exists** - **$all** +**\$all** #Modifier operators support - **$set** +**\$set** - **$unset** +**\$unset** - **$inc** +**\$inc** - **$addToSet** +**\$addToSet** - **$rename** +**\$rename** - **$pull** +**\$pull** - **$push** +**\$push** - **$each** +**\$each** #On the way + 1. Date(and types) support 2. projections support - diff --git a/example.js b/example.js index b20bf44..46a205c 100644 --- a/example.js +++ b/example.js @@ -2,28 +2,24 @@ var MongoMock = require('./MongoMock'); var db = { fruits: [ - {name: 'Banana', price: 20, something: [ - {name: 2} - ]}, - {name: 'Apple', price: 10, tags: ['Africa', 'Turkey'], something: [ - {name: 1} - ]}, + {name: 'Banana', price: 20, something: [{name: 2}]}, + {name: 'Apple', price: 10, tags: ['Africa', 'Turkey'], something: [{name: 1}]}, {name: 'Orange', price: 25}, - {name: 'Pineapple', price: 20} + {name: 'Pineapple', price: 20}, ], beverages: [ {name: 'CocaCola', price: 15}, {name: 'MongoCola', price: 10}, - {name: 'Pepsi', price: 25} - ] + {name: 'Pepsi', price: 25}, + ], }; var mongo = new MongoMock(db); mongo.collection('fruits').findAndModify({name: 'Banana'}, {$set: {price: 50}}, function (err, doc) { - console.log("fruit:", doc); + console.log('fruit:', doc); }); mongo.collection('fruits').find({something: {$elemMatch: {name: 1}}}, function (err, fruits) { - console.log("fruits:", fruits); -}); \ No newline at end of file + console.log('fruits:', fruits); +}); diff --git a/index.js b/index.js index 6476321..b0ea05f 100644 --- a/index.js +++ b/index.js @@ -1,2 +1,2 @@ var MongoMock = require('./MongoMock'); -module.exports = MongoMock; \ No newline at end of file +module.exports = MongoMock; diff --git a/package-lock.json b/package-lock.json index b3c89e4..5fda970 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,763 +1,493 @@ { - "name": "mongomock", - "version": "0.1.2", - "lockfileVersion": 1, - "requires": true, - "dependencies": { - "assertion-error": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.0.0.tgz", - "integrity": "sha1-x/hUOP3UZrx8oWq5DIFRN5el0js=", - "dev": true - }, - "balanced-match": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", - "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", - "dev": true - }, - "base64-js": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.3.1.tgz", - "integrity": "sha512-mLQ4i2QO1ytvGWFWmcngKO//JXAQueZvwEKtjgQFM4jIK0kU+ytMfplL8j+n5mspOfjHwoAg+9yhb7BwAHm36g==" - }, - "brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "bson": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/bson/-/bson-4.0.2.tgz", - "integrity": "sha512-rBdCxMBCg2aR420e1oKUejjcuPZLTibA7zEhWAlliFWEwzuBCC9Dkp5r7VFFIQB2t1WVsvTbohry575mc7Xw5A==", - "requires": { - "buffer": "^5.1.0", - "long": "^4.0.0" - } - }, - "buffer": { - "version": "5.4.3", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.4.3.tgz", - "integrity": "sha512-zvj65TkFeIt3i6aj5bIvJDzjjQQGs4o/sNoezg1F1kYap9Nu2jcUdpwzRSJTHMMzG0H7bZkn4rNQpImhuxWX2A==", - "requires": { - "base64-js": "^1.0.2", - "ieee754": "^1.1.4" - } - }, - "chai": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/chai/-/chai-1.10.0.tgz", - "integrity": "sha1-5AMcyHZURhp1lD5aNatG6vOcHrk=", - "dev": true, - "requires": { - "assertion-error": "1.0.0", - "deep-eql": "0.1.3" - } - }, - "cli": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/cli/-/cli-1.0.1.tgz", - "integrity": "sha1-IoF1NPJL+klQw01TLUjsvGIbjBQ=", - "dev": true, - "requires": { - "exit": "0.1.2", - "glob": "^7.1.1" - } - }, - "commander": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.0.0.tgz", - "integrity": "sha1-0bhvkB+LZL2UG96tr5JFMDk76Sg=", - "dev": true - }, - "concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", - "dev": true - }, - "console-browserify": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.1.0.tgz", - "integrity": "sha1-8CQcRXMKn8YyOyBtvzjtx0HQuxA=", - "dev": true, - "requires": { - "date-now": "^0.1.4" - } - }, - "core-util-is": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", - "dev": true - }, - "date-now": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/date-now/-/date-now-0.1.4.tgz", - "integrity": "sha1-6vQ5/U1ISK105cx9vvIAZyueNFs=", - "dev": true - }, - "debug": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - }, - "deep-eql": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-0.1.3.tgz", - "integrity": "sha1-71WKyrjeJSBs1xOQbXTlaTDrafI=", - "dev": true, - "requires": { - "type-detect": "0.1.1" - } - }, - "define-properties": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", - "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", - "dev": true, - "requires": { - "object-keys": "^1.0.12" - } - }, - "diff": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/diff/-/diff-1.0.7.tgz", - "integrity": "sha1-JLuwAcSn1VIhaefKvbLCgU7ZHPQ=", - "dev": true - }, - "dom-serializer": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.2.2.tgz", - "integrity": "sha512-2/xPb3ORsQ42nHYiSunXkDjPLBaEj/xTwUO4B7XCZQTRk7EBtTOPaygh10YAAh2OI1Qrp6NWfpAhzswj0ydt9g==", - "dev": true, - "requires": { - "domelementtype": "^2.0.1", - "entities": "^2.0.0" - }, - "dependencies": { - "domelementtype": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.0.1.tgz", - "integrity": "sha512-5HOHUDsYZWV8FGWN0Njbr/Rn7f/eWSQi1v7+HsUVwXgn8nWWlL64zKDkS0n8ZmQ3mlWOMuXOnR+7Nx/5tMO5AQ==", - "dev": true - }, - "entities": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-2.0.0.tgz", - "integrity": "sha512-D9f7V0JSRwIxlRI2mjMqufDrRDnx8p+eEOz7aUM9SuvF8gsBzra0/6tbjl1m8eQHrZlYj6PxqE00hZ1SAIKPLw==", - "dev": true - } - } - }, - "domelementtype": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.1.tgz", - "integrity": "sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==", - "dev": true - }, - "domhandler": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-2.3.0.tgz", - "integrity": "sha1-LeWaCCLVAn+r/28DLCsloqir5zg=", - "dev": true, - "requires": { - "domelementtype": "1" - } - }, - "domutils": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.5.1.tgz", - "integrity": "sha1-3NhIiib1Y9YQeeSMn3t+Mjc2gs8=", - "dev": true, - "requires": { - "dom-serializer": "0", - "domelementtype": "1" - } - }, - "entities": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-1.0.0.tgz", - "integrity": "sha1-sph6o4ITR/zeZCsk/fyeT7cSvyY=", - "dev": true - }, - "es-abstract": { - "version": "1.16.3", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.16.3.tgz", - "integrity": "sha512-WtY7Fx5LiOnSYgF5eg/1T+GONaGmpvpPdCpSnYij+U2gDTL0UPfWrhDw7b2IYb+9NQJsYpCA0wOQvZfsd6YwRw==", - "dev": true, - "requires": { - "es-to-primitive": "^1.2.1", - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.1", - "is-callable": "^1.1.4", - "is-regex": "^1.0.4", - "object-inspect": "^1.7.0", - "object-keys": "^1.1.1", - "string.prototype.trimleft": "^2.1.0", - "string.prototype.trimright": "^2.1.0" - } - }, - "es-to-primitive": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", - "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", - "dev": true, - "requires": { - "is-callable": "^1.1.4", - "is-date-object": "^1.0.1", - "is-symbol": "^1.0.2" - } - }, - "exit": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", - "integrity": "sha1-BjJjj42HfMghB9MKD/8aF8uhzQw=", - "dev": true - }, - "expect.js": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/expect.js/-/expect.js-0.3.1.tgz", - "integrity": "sha1-sKWaDS7/VDdUTr8M6qYBWEHQm1s=", - "dev": true - }, - "formatio": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/formatio/-/formatio-1.1.1.tgz", - "integrity": "sha1-XtPM1jZVEJc4NGXZlhmRAOhhYek=", - "dev": true, - "requires": { - "samsam": "~1.1" - } - }, - "fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", - "dev": true - }, - "function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", - "dev": true - }, - "glob": { - "version": "7.1.6", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", - "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", - "dev": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "graceful-fs": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-2.0.3.tgz", - "integrity": "sha1-fNLNsiiko/Nule+mzBQt59GhNtA=", - "dev": true - }, - "growl": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/growl/-/growl-1.7.0.tgz", - "integrity": "sha1-3i1mE20ALhErpw8/EMMc98NQsto=", - "dev": true - }, - "has": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", - "dev": true, - "requires": { - "function-bind": "^1.1.1" - } - }, - "has-symbols": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.1.tgz", - "integrity": "sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg==", - "dev": true - }, - "htmlparser2": { - "version": "3.8.3", - "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.8.3.tgz", - "integrity": "sha1-mWwosZFRaovoZQGn15dX5ccMEGg=", - "dev": true, - "requires": { - "domelementtype": "1", - "domhandler": "2.3", - "domutils": "1.5", - "entities": "1.0", - "readable-stream": "1.1" - } - }, - "ieee754": { - "version": "1.1.13", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.13.tgz", - "integrity": "sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg==" - }, - "inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", - "dev": true, - "requires": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true - }, - "is-arguments": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.0.4.tgz", - "integrity": "sha512-xPh0Rmt8NE65sNzvyUmWgI1tz3mKq74lGA0mL8LYZcoIzKOzDh6HmrYm3d18k60nHerC8A9Km8kYu87zfSFnLA==", - "dev": true - }, - "is-callable": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.4.tgz", - "integrity": "sha512-r5p9sxJjYnArLjObpjA4xu5EKI3CuKHkJXMhT7kwbpUyIFD1n5PMAsoPvWnvtZiNz7LjkYDRZhd7FlI0eMijEA==", - "dev": true - }, - "is-date-object": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.1.tgz", - "integrity": "sha1-mqIOtq7rv/d/vTPnTKAbM1gdOhY=", - "dev": true - }, - "is-generator-function": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.7.tgz", - "integrity": "sha512-YZc5EwyO4f2kWCax7oegfuSr9mFz1ZvieNYBEjmukLxgXfBUbxAWGVF7GZf0zidYtoBl3WvC07YK0wT76a+Rtw==", - "dev": true - }, - "is-regex": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.4.tgz", - "integrity": "sha1-VRdIm1RwkbCTDglWVM7SXul+lJE=", - "dev": true, - "requires": { - "has": "^1.0.1" - } - }, - "is-symbol": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.3.tgz", - "integrity": "sha512-OwijhaRSgqvhm/0ZdAcXNZt9lYdKFpcRDT5ULUuYXPoT794UNOdU+gpT6Rzo7b4V2HUl/op6GqY894AZwv9faQ==", - "dev": true, - "requires": { - "has-symbols": "^1.0.1" - } - }, - "isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", - "dev": true - }, - "jade": { - "version": "0.26.3", - "resolved": "https://registry.npmjs.org/jade/-/jade-0.26.3.tgz", - "integrity": "sha1-jxDXl32NefL2/4YqgbBRPMslaGw=", - "dev": true, - "requires": { - "commander": "0.6.1", - "mkdirp": "0.3.0" - }, - "dependencies": { - "commander": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-0.6.1.tgz", - "integrity": "sha1-+mihT2qUXVTbvlDYzbMyDp47GgY=", - "dev": true - }, - "mkdirp": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.3.0.tgz", - "integrity": "sha1-G79asbqCevI1dRQ0kEJkVfSB/h4=", - "dev": true - } - } - }, - "jshint": { - "version": "2.10.3", - "resolved": "https://registry.npmjs.org/jshint/-/jshint-2.10.3.tgz", - "integrity": "sha512-d8AoXcNNYzmm7cdmulQ3dQApbrPYArtVBO6n4xOICe4QsXGNHCAKDcFORzqP52LhK61KX0VhY39yYzCsNq+bxQ==", - "dev": true, - "requires": { - "cli": "~1.0.0", - "console-browserify": "1.1.x", - "exit": "0.1.x", - "htmlparser2": "3.8.x", - "lodash": "~4.17.11", - "minimatch": "~3.0.2", - "shelljs": "0.3.x", - "strip-json-comments": "1.0.x" - } - }, - "kerberos": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/kerberos/-/kerberos-0.0.3.tgz", - "integrity": "sha1-QoXZKgdI2yeEBi9a3OyfWVbLgYo=", - "dev": true, - "optional": true - }, - "lodash": { - "version": "4.17.15", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", - "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==", - "dev": true - }, - "lolex": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/lolex/-/lolex-1.3.2.tgz", - "integrity": "sha1-fD2mL/yzDw9agKJWbKJORdigHzE=", - "dev": true - }, - "long": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/long/-/long-4.0.0.tgz", - "integrity": "sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA==" - }, - "lru-cache": { - "version": "2.7.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-2.7.3.tgz", - "integrity": "sha1-bUUk6LlV+V1PW1iFHOId1y+06VI=", - "dev": true - }, - "minimatch": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", - "dev": true, - "requires": { - "brace-expansion": "^1.1.7" - } - }, - "mkdirp": { - "version": "0.3.5", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.3.5.tgz", - "integrity": "sha1-3j5fiWHIjHh+4TaN+EmsRBPsqNc=", - "dev": true - }, - "mocha": { - "version": "1.20.1", - "resolved": "https://registry.npmjs.org/mocha/-/mocha-1.20.1.tgz", - "integrity": "sha1-80ODLZ/gx9l8ZPxwRI9RNt+f7Vs=", - "dev": true, - "requires": { - "commander": "2.0.0", - "debug": "*", - "diff": "1.0.7", - "glob": "3.2.3", - "growl": "1.7.x", - "jade": "0.26.3", - "mkdirp": "0.3.5" - }, - "dependencies": { - "glob": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-3.2.3.tgz", - "integrity": "sha1-4xPusknHr/qlxHUoaw4RW1mDlGc=", - "dev": true, - "requires": { - "graceful-fs": "~2.0.0", - "inherits": "2", - "minimatch": "~0.2.11" - } - }, - "minimatch": { - "version": "0.2.14", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-0.2.14.tgz", - "integrity": "sha1-x054BXT2PG+aCQ6Q775u9TpqdWo=", - "dev": true, - "requires": { - "lru-cache": "2", - "sigmund": "~1.0.0" - } - } - } - }, - "mocha-jshint": { - "version": "0.0.7", - "resolved": "https://registry.npmjs.org/mocha-jshint/-/mocha-jshint-0.0.7.tgz", - "integrity": "sha1-2gTEFv6NM1XJEVvL4HzUnvYGSio=", - "dev": true, - "requires": { - "jshint": "~2.3" - }, - "dependencies": { - "cli": { - "version": "0.4.5", - "resolved": "https://registry.npmjs.org/cli/-/cli-0.4.5.tgz", - "integrity": "sha1-ePlIXNFhtWbppsctcXDEJw6B22E=", - "dev": true, - "requires": { - "glob": ">= 3.1.4" - } - }, - "console-browserify": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-0.1.6.tgz", - "integrity": "sha1-0SijwLuINQ61YmxufHGm8P1ImDw=", - "dev": true - }, - "jshint": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/jshint/-/jshint-2.3.0.tgz", - "integrity": "sha1-GVBEVaLCDEbuGDNh64fzocC33Ec=", - "dev": true, - "requires": { - "cli": "0.4.x", - "console-browserify": "0.1.x", - "minimatch": "0.x.x", - "shelljs": "0.1.x", - "underscore": "1.4.x" - } - }, - "minimatch": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-0.4.0.tgz", - "integrity": "sha1-vSx9Bg0sjI/Xzefx8u0tWycP2xs=", - "dev": true, - "requires": { - "lru-cache": "2", - "sigmund": "~1.0.0" - } - }, - "shelljs": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.1.4.tgz", - "integrity": "sha1-37vnjVbDwBaNL7eeEOzR28sH7A4=", - "dev": true - } - } - }, - "mongodb": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-1.4.0.tgz", - "integrity": "sha1-ygo8gedq+ba4bz1eCrnqq3IgLdc=", - "dev": true, - "requires": { - "bson": "0.2.7", - "kerberos": "0.0.3" - }, - "dependencies": { - "bson": { - "version": "0.2.7", - "resolved": "https://registry.npmjs.org/bson/-/bson-0.2.7.tgz", - "integrity": "sha1-Z5MWHEDlqXVwkdfufVKkcXlQI2s=", - "dev": true, - "requires": { - "nan": "~0.8.0" - } - } - } - }, - "mongojs": { - "version": "0.12.1", - "resolved": "https://registry.npmjs.org/mongojs/-/mongojs-0.12.1.tgz", - "integrity": "sha1-j8jBuQQtoaYgjYEE1CXDNcgoX6s=", - "dev": true, - "requires": { - "mongodb": "1.4.0", - "readable-stream": "~1.1.9", - "thunky": "~0.1.0" - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - }, - "nan": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/nan/-/nan-0.8.0.tgz", - "integrity": "sha1-AiqPpen+hCCWSsH7PclOF/RJ9f0=", - "dev": true - }, - "object-inspect": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.7.0.tgz", - "integrity": "sha512-a7pEHdh1xKIAgTySUGgLMx/xwDZskN1Ud6egYYN3EdRW4ZMPNEDUTF+hwy2LUC+Bl+SyLXANnwz/jyh/qutKUw==", - "dev": true - }, - "object-keys": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", - "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", - "dev": true - }, - "object.entries": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.0.tgz", - "integrity": "sha512-l+H6EQ8qzGRxbkHOd5I/aHRhHDKoQXQ8g0BYt4uSweQU1/J6dZUOyWh9a2Vky35YCKjzmgxOzta2hH6kf9HuXA==", - "dev": true, - "requires": { - "define-properties": "^1.1.3", - "es-abstract": "^1.12.0", - "function-bind": "^1.1.1", - "has": "^1.0.3" - } - }, - "once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", - "dev": true, - "requires": { - "wrappy": "1" - } - }, - "path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", - "dev": true - }, - "readable-stream": { - "version": "1.1.14", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", - "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=", - "dev": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.1", - "isarray": "0.0.1", - "string_decoder": "~0.10.x" - } - }, - "safe-buffer": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.0.tgz", - "integrity": "sha512-fZEwUGbVl7kouZs1jCdMLdt95hdIv0ZeHg6L7qPeciMZhZ+/gdesW4wgTARkrFWEpspjEATAzUGPG8N2jJiwbg==", - "dev": true - }, - "samsam": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/samsam/-/samsam-1.1.2.tgz", - "integrity": "sha1-vsEf3IOp/aBjQBIQ5AF2wwJNFWc=", - "dev": true - }, - "shelljs": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.3.0.tgz", - "integrity": "sha1-NZbmMHp4FUT1kfN9phg2DzHbV7E=", - "dev": true - }, - "sigmund": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/sigmund/-/sigmund-1.0.1.tgz", - "integrity": "sha1-P/IfGYytIXX587eBhT/ZTQ0ZtZA=", - "dev": true - }, - "sinon": { - "version": "1.17.7", - "resolved": "https://registry.npmjs.org/sinon/-/sinon-1.17.7.tgz", - "integrity": "sha1-RUKk9JugxFwF6y6d2dID4rjv4L8=", - "dev": true, - "requires": { - "formatio": "1.1.1", - "lolex": "1.3.2", - "samsam": "1.1.2", - "util": ">=0.10.3 <1" - } - }, - "sinon-chai": { - "version": "2.14.0", - "resolved": "https://registry.npmjs.org/sinon-chai/-/sinon-chai-2.14.0.tgz", - "integrity": "sha512-9stIF1utB0ywNHNT7RgiXbdmen8QDCRsrTjw+G9TgKt1Yexjiv8TOWZ6WHsTPz57Yky3DIswZvEqX8fpuHNDtQ==", - "dev": true - }, - "string.prototype.trimleft": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/string.prototype.trimleft/-/string.prototype.trimleft-2.1.0.tgz", - "integrity": "sha512-FJ6b7EgdKxxbDxc79cOlok6Afd++TTs5szo+zJTUyow3ycrRfJVE2pq3vcN53XexvKZu/DJMDfeI/qMiZTrjTw==", - "dev": true, - "requires": { - "define-properties": "^1.1.3", - "function-bind": "^1.1.1" - } - }, - "string.prototype.trimright": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/string.prototype.trimright/-/string.prototype.trimright-2.1.0.tgz", - "integrity": "sha512-fXZTSV55dNBwv16uw+hh5jkghxSnc5oHq+5K/gXgizHwAvMetdAJlHqqoFC1FSDVPYWLkAKl2cxpUT41sV7nSg==", - "dev": true, - "requires": { - "define-properties": "^1.1.3", - "function-bind": "^1.1.1" - } - }, - "string_decoder": { - "version": "0.10.31", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", - "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", - "dev": true - }, - "strip-json-comments": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-1.0.4.tgz", - "integrity": "sha1-HhX7ysl9Pumb8tc7TGVrCCu6+5E=", - "dev": true - }, - "thunky": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/thunky/-/thunky-0.1.0.tgz", - "integrity": "sha1-vzAUaCTituZ7Dy16Ssi+smkIaE4=", - "dev": true - }, - "type-detect": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-0.1.1.tgz", - "integrity": "sha1-C6XsKohWQORw6k6FBZcZANrFiCI=", - "dev": true - }, - "underscore": { - "version": "1.4.4", - "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.4.4.tgz", - "integrity": "sha1-YaajIBBiKvoHljvzJSA88SI51gQ=", - "dev": true - }, - "util": { - "version": "0.12.1", - "resolved": "https://registry.npmjs.org/util/-/util-0.12.1.tgz", - "integrity": "sha512-MREAtYOp+GTt9/+kwf00IYoHZyjM8VU4aVrkzUlejyqaIjd2GztVl5V9hGXKlvBKE3gENn/FMfHE5v6hElXGcQ==", - "dev": true, - "requires": { - "inherits": "^2.0.3", - "is-arguments": "^1.0.4", - "is-generator-function": "^1.0.7", - "object.entries": "^1.1.0", - "safe-buffer": "^5.1.2" - } - }, - "wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", - "dev": true - } - } + "name": "mongomock", + "version": "0.1.2", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "assertion-error": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.0.0.tgz", + "integrity": "sha1-x/hUOP3UZrx8oWq5DIFRN5el0js=", + "dev": true + }, + "base64-js": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.3.1.tgz", + "integrity": "sha512-mLQ4i2QO1ytvGWFWmcngKO//JXAQueZvwEKtjgQFM4jIK0kU+ytMfplL8j+n5mspOfjHwoAg+9yhb7BwAHm36g==" + }, + "bson": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/bson/-/bson-4.0.2.tgz", + "integrity": "sha512-rBdCxMBCg2aR420e1oKUejjcuPZLTibA7zEhWAlliFWEwzuBCC9Dkp5r7VFFIQB2t1WVsvTbohry575mc7Xw5A==", + "requires": { + "buffer": "^5.1.0", + "long": "^4.0.0" + } + }, + "buffer": { + "version": "5.4.3", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.4.3.tgz", + "integrity": "sha512-zvj65TkFeIt3i6aj5bIvJDzjjQQGs4o/sNoezg1F1kYap9Nu2jcUdpwzRSJTHMMzG0H7bZkn4rNQpImhuxWX2A==", + "requires": { + "base64-js": "^1.0.2", + "ieee754": "^1.1.4" + } + }, + "chai": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/chai/-/chai-1.10.0.tgz", + "integrity": "sha1-5AMcyHZURhp1lD5aNatG6vOcHrk=", + "dev": true, + "requires": { + "assertion-error": "1.0.0", + "deep-eql": "0.1.3" + } + }, + "commander": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.0.0.tgz", + "integrity": "sha1-0bhvkB+LZL2UG96tr5JFMDk76Sg=", + "dev": true + }, + "core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", + "dev": true + }, + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "deep-eql": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-0.1.3.tgz", + "integrity": "sha1-71WKyrjeJSBs1xOQbXTlaTDrafI=", + "dev": true, + "requires": { + "type-detect": "0.1.1" + } + }, + "define-properties": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", + "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", + "dev": true, + "requires": { + "object-keys": "^1.0.12" + } + }, + "diff": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/diff/-/diff-1.0.7.tgz", + "integrity": "sha1-JLuwAcSn1VIhaefKvbLCgU7ZHPQ=", + "dev": true + }, + "es-abstract": { + "version": "1.16.3", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.16.3.tgz", + "integrity": "sha512-WtY7Fx5LiOnSYgF5eg/1T+GONaGmpvpPdCpSnYij+U2gDTL0UPfWrhDw7b2IYb+9NQJsYpCA0wOQvZfsd6YwRw==", + "dev": true, + "requires": { + "es-to-primitive": "^1.2.1", + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1", + "is-callable": "^1.1.4", + "is-regex": "^1.0.4", + "object-inspect": "^1.7.0", + "object-keys": "^1.1.1", + "string.prototype.trimleft": "^2.1.0", + "string.prototype.trimright": "^2.1.0" + } + }, + "es-to-primitive": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", + "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", + "dev": true, + "requires": { + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" + } + }, + "expect.js": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/expect.js/-/expect.js-0.3.1.tgz", + "integrity": "sha1-sKWaDS7/VDdUTr8M6qYBWEHQm1s=", + "dev": true + }, + "formatio": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/formatio/-/formatio-1.1.1.tgz", + "integrity": "sha1-XtPM1jZVEJc4NGXZlhmRAOhhYek=", + "dev": true, + "requires": { + "samsam": "~1.1" + } + }, + "function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", + "dev": true + }, + "graceful-fs": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-2.0.3.tgz", + "integrity": "sha1-fNLNsiiko/Nule+mzBQt59GhNtA=", + "dev": true + }, + "growl": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/growl/-/growl-1.7.0.tgz", + "integrity": "sha1-3i1mE20ALhErpw8/EMMc98NQsto=", + "dev": true + }, + "has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dev": true, + "requires": { + "function-bind": "^1.1.1" + } + }, + "has-symbols": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.1.tgz", + "integrity": "sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg==", + "dev": true + }, + "ieee754": { + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.13.tgz", + "integrity": "sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg==" + }, + "inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true + }, + "is-arguments": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.0.4.tgz", + "integrity": "sha512-xPh0Rmt8NE65sNzvyUmWgI1tz3mKq74lGA0mL8LYZcoIzKOzDh6HmrYm3d18k60nHerC8A9Km8kYu87zfSFnLA==", + "dev": true + }, + "is-callable": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.4.tgz", + "integrity": "sha512-r5p9sxJjYnArLjObpjA4xu5EKI3CuKHkJXMhT7kwbpUyIFD1n5PMAsoPvWnvtZiNz7LjkYDRZhd7FlI0eMijEA==", + "dev": true + }, + "is-date-object": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.1.tgz", + "integrity": "sha1-mqIOtq7rv/d/vTPnTKAbM1gdOhY=", + "dev": true + }, + "is-generator-function": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.7.tgz", + "integrity": "sha512-YZc5EwyO4f2kWCax7oegfuSr9mFz1ZvieNYBEjmukLxgXfBUbxAWGVF7GZf0zidYtoBl3WvC07YK0wT76a+Rtw==", + "dev": true + }, + "is-regex": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.4.tgz", + "integrity": "sha1-VRdIm1RwkbCTDglWVM7SXul+lJE=", + "dev": true, + "requires": { + "has": "^1.0.1" + } + }, + "is-symbol": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.3.tgz", + "integrity": "sha512-OwijhaRSgqvhm/0ZdAcXNZt9lYdKFpcRDT5ULUuYXPoT794UNOdU+gpT6Rzo7b4V2HUl/op6GqY894AZwv9faQ==", + "dev": true, + "requires": { + "has-symbols": "^1.0.1" + } + }, + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", + "dev": true + }, + "jade": { + "version": "0.26.3", + "resolved": "https://registry.npmjs.org/jade/-/jade-0.26.3.tgz", + "integrity": "sha1-jxDXl32NefL2/4YqgbBRPMslaGw=", + "dev": true, + "requires": { + "commander": "0.6.1", + "mkdirp": "0.3.0" + }, + "dependencies": { + "commander": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-0.6.1.tgz", + "integrity": "sha1-+mihT2qUXVTbvlDYzbMyDp47GgY=", + "dev": true + }, + "mkdirp": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.3.0.tgz", + "integrity": "sha1-G79asbqCevI1dRQ0kEJkVfSB/h4=", + "dev": true + } + } + }, + "kerberos": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/kerberos/-/kerberos-0.0.3.tgz", + "integrity": "sha1-QoXZKgdI2yeEBi9a3OyfWVbLgYo=", + "dev": true, + "optional": true + }, + "lolex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/lolex/-/lolex-1.3.2.tgz", + "integrity": "sha1-fD2mL/yzDw9agKJWbKJORdigHzE=", + "dev": true + }, + "long": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/long/-/long-4.0.0.tgz", + "integrity": "sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA==" + }, + "lru-cache": { + "version": "2.7.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-2.7.3.tgz", + "integrity": "sha1-bUUk6LlV+V1PW1iFHOId1y+06VI=", + "dev": true + }, + "mkdirp": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.3.5.tgz", + "integrity": "sha1-3j5fiWHIjHh+4TaN+EmsRBPsqNc=", + "dev": true + }, + "mocha": { + "version": "1.20.1", + "resolved": "https://registry.npmjs.org/mocha/-/mocha-1.20.1.tgz", + "integrity": "sha1-80ODLZ/gx9l8ZPxwRI9RNt+f7Vs=", + "dev": true, + "requires": { + "commander": "2.0.0", + "debug": "*", + "diff": "1.0.7", + "glob": "3.2.3", + "growl": "1.7.x", + "jade": "0.26.3", + "mkdirp": "0.3.5" + }, + "dependencies": { + "glob": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-3.2.3.tgz", + "integrity": "sha1-4xPusknHr/qlxHUoaw4RW1mDlGc=", + "dev": true, + "requires": { + "graceful-fs": "~2.0.0", + "inherits": "2", + "minimatch": "~0.2.11" + } + }, + "minimatch": { + "version": "0.2.14", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-0.2.14.tgz", + "integrity": "sha1-x054BXT2PG+aCQ6Q775u9TpqdWo=", + "dev": true, + "requires": { + "lru-cache": "2", + "sigmund": "~1.0.0" + } + } + } + }, + "mongodb": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-1.4.0.tgz", + "integrity": "sha1-ygo8gedq+ba4bz1eCrnqq3IgLdc=", + "dev": true, + "requires": { + "bson": "0.2.7", + "kerberos": "0.0.3" + }, + "dependencies": { + "bson": { + "version": "0.2.7", + "resolved": "https://registry.npmjs.org/bson/-/bson-0.2.7.tgz", + "integrity": "sha1-Z5MWHEDlqXVwkdfufVKkcXlQI2s=", + "dev": true, + "requires": { + "nan": "~0.8.0" + } + } + } + }, + "mongojs": { + "version": "0.12.1", + "resolved": "https://registry.npmjs.org/mongojs/-/mongojs-0.12.1.tgz", + "integrity": "sha1-j8jBuQQtoaYgjYEE1CXDNcgoX6s=", + "dev": true, + "requires": { + "mongodb": "1.4.0", + "readable-stream": "~1.1.9", + "thunky": "~0.1.0" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "nan": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/nan/-/nan-0.8.0.tgz", + "integrity": "sha1-AiqPpen+hCCWSsH7PclOF/RJ9f0=", + "dev": true + }, + "object-inspect": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.7.0.tgz", + "integrity": "sha512-a7pEHdh1xKIAgTySUGgLMx/xwDZskN1Ud6egYYN3EdRW4ZMPNEDUTF+hwy2LUC+Bl+SyLXANnwz/jyh/qutKUw==", + "dev": true + }, + "object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "dev": true + }, + "object.entries": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.0.tgz", + "integrity": "sha512-l+H6EQ8qzGRxbkHOd5I/aHRhHDKoQXQ8g0BYt4uSweQU1/J6dZUOyWh9a2Vky35YCKjzmgxOzta2hH6kf9HuXA==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.12.0", + "function-bind": "^1.1.1", + "has": "^1.0.3" + } + }, + "prettier": { + "version": "2.0.5", + "resolved": "https://npm.welayout.com/prettier/-/prettier-2.0.5.tgz", + "integrity": "sha512-7PtVymN48hGcO4fGjybyBSIWDsLU4H4XlvOHfq91pz9kkGlonzwTfYkaIEwiRg/dAJF9YlbsduBAgtYLi+8cFg==", + "dev": true + }, + "readable-stream": { + "version": "1.1.14", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", + "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "0.0.1", + "string_decoder": "~0.10.x" + } + }, + "safe-buffer": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.0.tgz", + "integrity": "sha512-fZEwUGbVl7kouZs1jCdMLdt95hdIv0ZeHg6L7qPeciMZhZ+/gdesW4wgTARkrFWEpspjEATAzUGPG8N2jJiwbg==", + "dev": true + }, + "samsam": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/samsam/-/samsam-1.1.2.tgz", + "integrity": "sha1-vsEf3IOp/aBjQBIQ5AF2wwJNFWc=", + "dev": true + }, + "sigmund": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/sigmund/-/sigmund-1.0.1.tgz", + "integrity": "sha1-P/IfGYytIXX587eBhT/ZTQ0ZtZA=", + "dev": true + }, + "sinon": { + "version": "1.17.7", + "resolved": "https://registry.npmjs.org/sinon/-/sinon-1.17.7.tgz", + "integrity": "sha1-RUKk9JugxFwF6y6d2dID4rjv4L8=", + "dev": true, + "requires": { + "formatio": "1.1.1", + "lolex": "1.3.2", + "samsam": "1.1.2", + "util": ">=0.10.3 <1" + } + }, + "sinon-chai": { + "version": "2.14.0", + "resolved": "https://registry.npmjs.org/sinon-chai/-/sinon-chai-2.14.0.tgz", + "integrity": "sha512-9stIF1utB0ywNHNT7RgiXbdmen8QDCRsrTjw+G9TgKt1Yexjiv8TOWZ6WHsTPz57Yky3DIswZvEqX8fpuHNDtQ==", + "dev": true + }, + "string.prototype.trimleft": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/string.prototype.trimleft/-/string.prototype.trimleft-2.1.0.tgz", + "integrity": "sha512-FJ6b7EgdKxxbDxc79cOlok6Afd++TTs5szo+zJTUyow3ycrRfJVE2pq3vcN53XexvKZu/DJMDfeI/qMiZTrjTw==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "function-bind": "^1.1.1" + } + }, + "string.prototype.trimright": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/string.prototype.trimright/-/string.prototype.trimright-2.1.0.tgz", + "integrity": "sha512-fXZTSV55dNBwv16uw+hh5jkghxSnc5oHq+5K/gXgizHwAvMetdAJlHqqoFC1FSDVPYWLkAKl2cxpUT41sV7nSg==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "function-bind": "^1.1.1" + } + }, + "string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", + "dev": true + }, + "thunky": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/thunky/-/thunky-0.1.0.tgz", + "integrity": "sha1-vzAUaCTituZ7Dy16Ssi+smkIaE4=", + "dev": true + }, + "type-detect": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-0.1.1.tgz", + "integrity": "sha1-C6XsKohWQORw6k6FBZcZANrFiCI=", + "dev": true + }, + "util": { + "version": "0.12.1", + "resolved": "https://registry.npmjs.org/util/-/util-0.12.1.tgz", + "integrity": "sha512-MREAtYOp+GTt9/+kwf00IYoHZyjM8VU4aVrkzUlejyqaIjd2GztVl5V9hGXKlvBKE3gENn/FMfHE5v6hElXGcQ==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "is-arguments": "^1.0.4", + "is-generator-function": "^1.0.7", + "object.entries": "^1.1.0", + "safe-buffer": "^5.1.2" + } + } + } } diff --git a/package.json b/package.json index 6f13dd6..773ea97 100644 --- a/package.json +++ b/package.json @@ -9,16 +9,17 @@ "bson": "*" }, "devDependencies": { - "jshint": "*", - "mocha-jshint": "0.0.7", "chai": "^1.9.1", - "sinon": "^1.9.1", - "sinon-chai": "^2.5.0", - "mongojs": "^0.12.0", + "expect.js": "~0.3.1", "mocha": "~1.20.0", - "expect.js": "~0.3.1" + "prettier": "^2.0.5", + "sinon": "^1.9.1", + "sinon-chai": "^2.5.0" }, "scripts": { - "test": "node test.js" + "test": "node test.js", + "lint:ts": "eslint ./src/**/*.ts ./test/**/*.ts", + "prettier:fix": "prettier --write .", + "prettier:check": "prettier --check ." } } diff --git a/test.js b/test.js index aab4702..436403e 100644 --- a/test.js +++ b/test.js @@ -4,4 +4,4 @@ var realProcessExit = process.exit; process.exit = function (code) { setTimeout(realProcessExit.bind(process, code), 2000); }; -require('./node_modules/mocha/bin/_mocha'); \ No newline at end of file +require('./node_modules/mocha/bin/_mocha'); diff --git a/test/MongoMock.spec.js b/test/MongoMock.spec.js index bf4ad71..90766c2 100644 --- a/test/MongoMock.spec.js +++ b/test/MongoMock.spec.js @@ -1,20 +1,25 @@ var MongoMock = require('../MongoMock'); var Collection = require('../Collection'); -//var expect = chai.expect; - describe('When creating MongoMock', function () { var mongo; var db = { - fruits:[{name:'Banana',price:20},{name:'Apple',price:10,tags:['Africa','Turkey']},{name:'Orange',price:25},{name:'Pineapple',price:20}], - beverages:[{name:'CocaCola',price:15},{name:'MongoCola',price:10},{name:'Pepsi',price:25}] + fruits: [ + {name: 'Banana', price: 20}, + {name: 'Apple', price: 10, tags: ['Africa', 'Turkey']}, + {name: 'Orange', price: 25}, + {name: 'Pineapple', price: 20}, + ], + beverages: [ + {name: 'CocaCola', price: 15}, + {name: 'MongoCola', price: 10}, + {name: 'Pepsi', price: 25}, + ], }; - mongo = new MongoMock(db); - it('#should return MongoMock object', function () { mongo.should.have.property('collection'); mongo.collection.should.be.a('function'); @@ -23,5 +28,4 @@ describe('When creating MongoMock', function () { it('#should return Collection object on collection call', function () { mongo.collection('fruits').should.be.instanceof(Collection); }); - -}); \ No newline at end of file +}); diff --git a/test/collection.spec.js b/test/collection.spec.js index 678fd60..83159bc 100644 --- a/test/collection.spec.js +++ b/test/collection.spec.js @@ -7,20 +7,20 @@ describe('Collection test', function () { var db = { fruits: [ {name: 'Banana', price: 20}, - {name: 'Apple', price: 10, tags: ['Africa', 'Turkey'], dueDate:new Date("2020-01-15T00:00:00.000Z")}, - {name: 'Orange', price: 25, dueDate:new Date("2019-11-01T00:00:00.000Z")}, - {name: 'Pineapple', price: 20, dueDate:new Date("2019-12-10T00:00:00.000Z")} + {name: 'Apple', price: 10, tags: ['Africa', 'Turkey'], dueDate: new Date('2020-01-15T00:00:00.000Z')}, + {name: 'Orange', price: 25, dueDate: new Date('2019-11-01T00:00:00.000Z')}, + {name: 'Pineapple', price: 20, dueDate: new Date('2019-12-10T00:00:00.000Z')}, ], beverages: [ {name: 'CocaCola', price: 15}, {name: 'MongoCola', price: 10}, - {name: 'Pepsi', price: 25} - ] + {name: 'Pepsi', price: 25}, + ], }; mongo = new MongoMock(db); }); - it("#should have collection functionality", function () { + it('#should have collection functionality', function () { mongo.collection('fruits').should.have.property('find'); mongo.collection('fruits').should.have.property('findOne'); mongo.collection('fruits').should.have.property('findAndModify'); @@ -31,10 +31,13 @@ describe('Collection test', function () { describe('when getting all collection by empty find criteria', function () { before(function (done) { - mongo.collection('fruits').find({}).toArray(function (err, data) { - result = data; - done(); - }); + mongo + .collection('fruits') + .find({}) + .toArray(function (err, data) { + result = data; + done(); + }); }); it('#should return all collection', function () { @@ -43,12 +46,14 @@ describe('Collection test', function () { }); describe('when filtering collection by basic criteria', function () { - before(function (done) { - mongo.collection('fruits').find({price: 20}).toArray(function (err, fruits) { - result = fruits; - done(); - }); + mongo + .collection('fruits') + .find({price: 20}) + .toArray(function (err, fruits) { + result = fruits; + done(); + }); }); it('#should return 2 fruits with price 20', function () { @@ -57,12 +62,14 @@ describe('Collection test', function () { }); describe('when filtering collection by date equal criteria', function () { - before(function (done) { - mongo.collection('fruits').find({dueDate: new Date("2019-11-01T00:00:00.000Z")}).toArray(function (err, fruits) { - result = fruits; - done(); - }); + mongo + .collection('fruits') + .find({dueDate: new Date('2019-11-01T00:00:00.000Z')}) + .toArray(function (err, fruits) { + result = fruits; + done(); + }); }); it('#should return 1 fruits with due date 01 Nov 2019', function () { @@ -71,27 +78,26 @@ describe('Collection test', function () { }); describe('when filtering collection by complex criteria', function () { - before(function (done) { - var criteria = {$or: [ - {price: {$gte: 25}} , - {tags: { $in: ['Turkey'] }} - ]}; - mongo.collection('fruits').find(criteria).toArray(function (err, fruits) { - result = fruits; - done(); - }); + var criteria = {$or: [{price: {$gte: 25}}, {tags: {$in: ['Turkey']}}]}; + mongo + .collection('fruits') + .find(criteria) + .toArray(function (err, fruits) { + result = fruits; + done(); + }); }); it('#should return 2 fruits, one with price 25 second one with tags containing "Turkey"', function () { result.should.have.length(2); //todo:update }); - }); describe('when stream collection', function () { - var cursor, matchcollection = []; + var cursor, + matchcollection = []; before(function (done) { cursor = mongo.collection('beverages').find(); cursor.on('data', function (doc) { @@ -106,10 +112,14 @@ describe('Collection test', function () { describe('sort collection asceding', function () { before(function (done) { - mongo.collection('fruits').find().sort({name:1}).toArray(function (err, fruits) { - result = fruits; - done(); - }); + mongo + .collection('fruits') + .find() + .sort({name: 1}) + .toArray(function (err, fruits) { + result = fruits; + done(); + }); }); it('should show all fruits sorted', function () { result[0].name.should.equal('Apple'); @@ -117,10 +127,14 @@ describe('Collection test', function () { }); describe('sort collection desceding', function () { before(function (done) { - mongo.collection('fruits').find().sort({price:-1}).toArray(function (err, fruits) { - result = fruits; - done(); - }); + mongo + .collection('fruits') + .find() + .sort({price: -1}) + .toArray(function (err, fruits) { + result = fruits; + done(); + }); }); it('should show all fruits sorted', function () { result[0].name.should.equal('Orange'); @@ -136,12 +150,10 @@ describe('Collection test', function () { var totalPrice = 0; while (result.hasNext()) { var item = result.next(); - totalPrice+=item.price; + totalPrice += item.price; } result.close(); totalPrice.should.equal(75); // All fruit prices acumulated 20+10+25+20 }); }); - - -}); \ No newline at end of file +}); diff --git a/test/jshint.spec.js b/test/jshint.spec.js deleted file mode 100644 index 5cb07d7..0000000 --- a/test/jshint.spec.js +++ /dev/null @@ -1 +0,0 @@ -require('mocha-jshint')(); \ No newline at end of file diff --git a/test/util.spec.js b/test/util.spec.js index 7f94f51..071f3bb 100644 --- a/test/util.spec.js +++ b/test/util.spec.js @@ -8,25 +8,29 @@ describe('mongo-query utility belt test', function () { {name: 'Apple', price: 10, tags: ['Africa', 'Turkey']}, {name: 'Orange', price: 20}, {name: 'Pineapple', price: 20}, - {name: 'Cucumber', price: 56, suppliers: [ - {name: "anonymous234", subSuppliers: [ - {name: "1", address: 'blahblah'} - ]} - ]} + { + name: 'Cucumber', + price: 56, + suppliers: [{name: 'anonymous234', subSuppliers: [{name: '1', address: 'blahblah'}]}], + }, ], beverages: [ {name: 'CocaCola', price: 15, suppliers: ['one', 'two', 'three']}, {name: 'MongoCola', price: 10, suppliers: ['one', 'two', 'three', 'four', 'five', 'six']}, {name: 'Pepsi', price: 25, suppliers: ['one', 'two', 'three', 'four', 'five']}, {name: 'BoobCola', price: 999, suppliers: ['one', 'two', 'three']}, - {name: 'ZeroVatkaCola', price: 1000, suppliers: ['one', 'two', 'three'], someArray: ['one', 'two', 'three'], nested: {}, nestedObjectsArray: [ - {someNestedField: 'value'} - ]} - ] + { + name: 'ZeroVatkaCola', + price: 1000, + suppliers: ['one', 'two', 'three'], + someArray: ['one', 'two', 'three'], + nested: {}, + nestedObjectsArray: [{someNestedField: 'value'}], + }, + ], }; describe('when querying with string expression on array elements', function () { - var fruits = _(db.fruits).find({'suppliers.name': 'anonymous234'}); var subArrayFruit = _(db.fruits).findOne({'suppliers.subSuppliers.0.name': 1}); it('#should have length 1', function () { @@ -40,7 +44,6 @@ describe('mongo-query utility belt test', function () { }); describe('when perfoming update operation', function () { - describe('#when success case without multiple, update first element with price 20, change it to 30', function () { var counter = _(db.fruits).update({price: 20}, {$set: {price: 30}, $unset: {redundantField: 1}}); it('#should update 1 document', function () { @@ -55,7 +58,7 @@ describe('mongo-query utility belt test', function () { }); describe('#when success case with multiple. Changing all prices with 20 to 30', function () { - var counter = _(db.fruits).update({price: 20}, {$set: {price: 30}}, { multi: true }); + var counter = _(db.fruits).update({price: 20}, {$set: {price: 30}}, {multi: true}); it('#should update 2 documents', function () { counter.should.equal(2); }); @@ -91,11 +94,9 @@ describe('mongo-query utility belt test', function () { }); describe('#testing array modifiers', function () { - describe('#testing $push modifier', function () { - describe('#without $each', function () { - _(db.beverages).update({name: 'Pepsi'}, {$push: {'suppliers': 'six'}}); + _(db.beverages).update({name: 'Pepsi'}, {$push: {suppliers: 'six'}}); var beverage = _(db.beverages).findOne({name: 'Pepsi'}); @@ -105,7 +106,10 @@ describe('mongo-query utility belt test', function () { }); describe('#with $each modifier', function () { - _(db.beverages).update({name: 'MongoCola'}, {$push: {'suppliers': {$each: ['seven', 'eight', 'nine']}}}); + _(db.beverages).update( + {name: 'MongoCola'}, + {$push: {suppliers: {$each: ['seven', 'eight', 'nine']}}} + ); var beverage = _(db.beverages).findOne({name: 'MongoCola'}); it('should have suppliers field length === 9', function () { @@ -132,14 +136,16 @@ describe('mongo-query utility belt test', function () { }); describe('#when adding $each modifier', function () { - _(db.beverages).update({name: 'ZeroVatkaCola'}, {$addToSet: {suppliers: {$each: ['one', 'four', 'five']}}}); + _(db.beverages).update( + {name: 'ZeroVatkaCola'}, + {$addToSet: {suppliers: {$each: ['one', 'four', 'five']}}} + ); var beverage = _(db.beverages).findOne({name: 'ZeroVatkaCola'}); it('#should insert 2 values and dont insert 1', function () { beverage.suppliers.should.have.length(5); }); }); - }); describe('#testing $pull modifier', function () { @@ -169,7 +175,10 @@ describe('mongo-query utility belt test', function () { }); describe('#testing string based deep modifiers when array with deep nesting', function () { - _(db.beverages).update({name: 'ZeroVatkaCola'}, {$set: {'nestedObjectsArray.0.someProperty': 'value modified'}}); + _(db.beverages).update( + {name: 'ZeroVatkaCola'}, + {$set: {'nestedObjectsArray.0.someProperty': 'value modified'}} + ); it('#should properly set up first item', function () { var doc = _(db.beverages).findOne({name: 'ZeroVatkaCola'}); @@ -203,7 +212,11 @@ describe('mongo-query utility belt test', function () { }); describe('#when its not found and upsert true', function () { - var beverage = _(db.beverages).findAndModify({name: 'someRandomBeverage'}, {price: 100, name: "someRandomFruit"}, {upsert: true}); + var beverage = _(db.beverages).findAndModify( + {name: 'someRandomBeverage'}, + {price: 100, name: 'someRandomFruit'}, + {upsert: true} + ); it('#should return new object', function () { beverage.should.have.property('price', 100); beverage.should.have.property('name', 'someRandomFruit'); diff --git a/tsconfig.json b/tsconfig.json new file mode 100644 index 0000000..862770a --- /dev/null +++ b/tsconfig.json @@ -0,0 +1,18 @@ +{ + "compilerOptions": { + "target": "ES6", + "module": "commonjs", + "declaration": true, + "declarationMap": true, + "outDir": "./dist", + "strict": true, + "esModuleInterop": true, + "forceConsistentCasingInFileNames": true, + "noFallthroughCasesInSwitch": true, + "noImplicitReturns": true, + "sourceMap": true, + "noUnusedLocals": true, + "noUnusedParameters": true + }, + "exclude": ["node_modules", "test/**", "node", "web", "dist"] +} diff --git a/util/index.js b/util/index.js index 69a17e9..5730716 100644 --- a/util/index.js +++ b/util/index.js @@ -11,21 +11,21 @@ var checkArrayPresence = function (doc, key, modifier) { }; var modifiers = { - '$set': function (doc, modifier) { + $set: function (doc, modifier) { Object.keys(modifier).forEach(function (key) { objectUtil.setProp(key)(doc, modifier[key]); }); return doc; }, - '$unset': function (doc, modifier) { + $unset: function (doc, modifier) { Object.keys(modifier).forEach(function (key) { objectUtil.deleteProp(doc, key); }); return doc; }, - '$addToSet': function (doc, modifier) { + $addToSet: function (doc, modifier) { Object.keys(modifier).forEach(function (key) { var docProperty = objectUtil.prop(key)(doc); if (!docProperty instanceof Array) { @@ -36,7 +36,6 @@ var modifiers = { if (modifierProperty.$each && modifierProperty.$each instanceof Array) { modifierProperty.$each.forEach(function (modifierItem) { - var mod = {}; objectUtil.setProp(key)(mod, modifierItem); isPresent = checkArrayPresence(doc, key, mod); @@ -45,8 +44,7 @@ var modifiers = { docProperty.push(modifierItem); } }); - } - else { + } else { isPresent = checkArrayPresence(doc, key, modifier); if (!isPresent) { docProperty.push(modifierProperty); @@ -54,10 +52,9 @@ var modifiers = { } }); return doc; - }, - '$inc': function (doc, modifier) { + $inc: function (doc, modifier) { Object.keys(modifier).forEach(function (key) { var docProp = objectUtil.prop(key)(doc); var modifierValue = modifier[key]; @@ -66,7 +63,7 @@ var modifiers = { return doc; }, - '$rename': function (doc, modifier) { + $rename: function (doc, modifier) { Object.keys(modifier).forEach(function (key) { var newPropertyKey = objectUtil.prop(key)(modifier); objectUtil.renameProp(doc, key, newPropertyKey); @@ -80,14 +77,12 @@ var modifiers = { var modifierValue = modifier[key]; if (!property instanceof Array) { - throw "property " + key + " is not array"; + throw 'property ' + key + ' is not array'; } if (modifierValue == 1) { property.pop(); - } - - else if (modifierValue == -1) { + } else if (modifierValue == -1) { property.shift(); } }); @@ -101,15 +96,14 @@ var modifiers = { var modifierProperty = modifier[key]; if (!property instanceof Array) { - throw "property " + key + " is not array"; + throw 'property ' + key + ' is not array'; } if (modifierProperty.$each && modifierProperty.$each instanceof Array) { modifierProperty.$each.forEach(function (modifierItem) { property.push(modifierItem); }); - } - else { + } else { property.push(modifierProperty); } }); @@ -123,7 +117,7 @@ var modifiers = { var modifierProperty = modifier[key]; if (!property instanceof Array) { - throw "property " + key + "is not array"; + throw 'property ' + key + 'is not array'; } var subCollection = new Wrap(property.slice()); @@ -132,28 +126,28 @@ var modifiers = { }); return doc; - } + }, }; var comparsionOperators = { - '$gt': function (doc, field, value) { + $gt: function (doc, field, value) { var property = objectUtil.prop(field)(doc); return property > value; }, - '$gte': function (doc, field, value) { + $gte: function (doc, field, value) { var property = objectUtil.prop(field)(doc); return property >= value; }, - '$lt': function (doc, field, value) { + $lt: function (doc, field, value) { var property = objectUtil.prop(field)(doc); return property < value; }, - '$lte': function (doc, field, value) { + $lte: function (doc, field, value) { var property = objectUtil.prop(field)(doc); return property <= value; }, - '$in': function (doc, field, value) { + $in: function (doc, field, value) { var property = objectUtil.prop(field)(doc); if (!value instanceof Array) { throw 'should set an array for $in call'; @@ -164,8 +158,7 @@ var comparsionOperators = { return docFieldItem == valueFieldItem; }); }); - } - else { + } else { return value.some(function (valueItem) { return property == valueItem; }); @@ -174,17 +167,17 @@ var comparsionOperators = { $nin: function (doc, field, value) { return !this.$in(doc, field, value); }, - '$regex': function (doc, field, value) { + $regex: function (doc, field, value) { var property = objectUtil.prop(field)(doc); return value.test(property); }, - '$ne': function (doc, field, value) { + $ne: function (doc, field, value) { var property = objectUtil.prop(field)(doc); return property != value; }, - '$exists': function (doc, field, value) { + $exists: function (doc, field, value) { var property = objectUtil.prop(field)(doc); return (property !== undefined) === value; //null values does not include }, @@ -217,9 +210,7 @@ var comparsionOperators = { }); } return false; - } - - + }, }; var logicalOperators = { @@ -241,8 +232,7 @@ var logicalOperators = { $nor: function (doc, array) { return !this.$and(doc, array); - } - + }, }; //todo:wtf function areEqual(field1, field2) { @@ -267,8 +257,7 @@ function _updateDoc(doc, modifier, wrapped) { Object.keys(modifier).forEach(function (key) { if (!modifiers[key]) { throw 'this modifier is not supported for now or invalid: ' + key; - } - else { + } else { var modifierValue = modifier[key]; var modifiedDoc = modifiers[key](doc, modifierValue); var index = wrapped._data.indexOf(doc); @@ -278,7 +267,6 @@ function _updateDoc(doc, modifier, wrapped) { return; } - function Wrap(array) { this._data = array; return this; @@ -289,7 +277,6 @@ function Constructor(array) { } function _allKeysValid(query, item) { - if (typeof query !== 'object') { return query === item; } @@ -300,7 +287,7 @@ function _allKeysValid(query, item) { function anyMatchOf(key, pathStep, item) { return item[pathStep].some(function (subArrayItem) { - var subQueryKey = key.replace(new RegExp(pathStep + '\\.'), ""); + var subQueryKey = key.replace(new RegExp(pathStep + '\\.'), ''); var subQuery = {}; subQuery[subQueryKey] = query[key]; @@ -308,7 +295,6 @@ function _allKeysValid(query, item) { }); } - return Object.keys(query).every(function (key) { if (logicalOperators[key]) { return logicalOperators[key](item, query[key]); @@ -317,26 +303,23 @@ function _allKeysValid(query, item) { else if (typeof query[key] == 'object') { //Add filter by strict date matching if (query[key] instanceof Date) { - return item[key] instanceof Date && query[key].getTime()===item[key].getTime(); + return item[key] instanceof Date && query[key].getTime() === item[key].getTime(); } return Object.keys(query[key]).every(function (operator) { return comparsionOperators[operator](item, key, query[key][operator]); }); - } - else if (typeof key === 'string' && new RegExp('.*\\..*').test(key)) { + } else if (typeof key === 'string' && new RegExp('.*\\..*').test(key)) { var properties = key.split('.'); var path = []; - for (var i = 0; i < properties.length; i++) { var property = properties[i]; path.push(property); - var pathStep = path.join("."); + var pathStep = path.join('.'); if (item[pathStep] instanceof Array) { var nextOperator = parseInt(properties[i + 1]); if (!isNaN(nextOperator)) { - - var subQueryKey = key.replace(new RegExp(pathStep + '\\.' + properties[i + 1] + '\\.'), ""); + var subQueryKey = key.replace(new RegExp(pathStep + '\\.' + properties[i + 1] + '\\.'), ''); var subQuery = {}; subQuery[subQueryKey] = query[key]; var subArrayItem = item[pathStep][properties[i + 1]]; @@ -355,7 +338,6 @@ function _allKeysValid(query, item) { } Wrap.prototype.find = function (query, options) { - options = options || {}; var filteredArray = this._data.filter(function (item) { @@ -394,8 +376,7 @@ Wrap.prototype.update = function (query, modifier, options) { _updateDoc(doc, modifier, self); counter++; }); - } - else { + } else { var doc = this.findOne(query); if (doc) { counter++; @@ -442,15 +423,13 @@ Wrap.prototype.findAndModify = function (query, modifier, options) { if (doc) { if (options.new) { _updateDoc(doc, modifier, this); - } - else { + } else { _updateDoc(JSON.parse(JSON.stringify(doc)), modifier, this); } - } - else if (!modifier.$set && options.upsert) { + } else if (!modifier.$set && options.upsert) { doc = this.insert(modifier); } return doc; }; -module.exports = Constructor; \ No newline at end of file +module.exports = Constructor; diff --git a/util/objectUtil.js b/util/objectUtil.js index 97b3045..c7ab087 100644 --- a/util/objectUtil.js +++ b/util/objectUtil.js @@ -16,7 +16,7 @@ function prop(name) { } else { property = property[propertiesArray[i]]; - if (typeof(property) === 'undefined') { + if (typeof property === 'undefined') { return; } @@ -41,7 +41,7 @@ function setProp(name) { } var property = object; for (var i = 0; i < propertiesArray.length - 1; i++) { - if (typeof(property[propertiesArray[i]]) === 'undefined') { + if (typeof property[propertiesArray[i]] === 'undefined') { property[propertiesArray[i]] = {}; } property = property[propertiesArray[i]]; @@ -106,5 +106,5 @@ module.exports = { deleteProp: deleteProp, addArrayItemsPropIfNotExist: addArrayItemsPropIfNotExist, renameArrayItemsProp: renameArrayItemsProp, - deleteArrayItemsProp: deleteArrayItemsProp -}; \ No newline at end of file + deleteArrayItemsProp: deleteArrayItemsProp, +};