From a6e119a943fcc7d92784f26055d7783f127311f2 Mon Sep 17 00:00:00 2001 From: Jason Dobry Date: Thu, 18 Feb 2016 20:15:09 -0800 Subject: [PATCH 01/36] Stable Version 0.6.0 --- .babelrc | 3 + .gitignore | 1 + .jshintrc | 33 -- .npmignore | 38 +++ CHANGELOG.md | 5 + CONTRIBUTING.md | 7 +- Gruntfile.js | 82 ----- README.md | 105 +++--- circle.yml | 8 +- dist/js-data-mongodb.js | 181 +++++----- dist/js-data-mongodb.js.map | 1 + mocha.start.js | 170 ++-------- package.json | 74 +++-- src/index.js | 642 ++++++++++++++++++------------------ test/create.spec.js | 26 -- test/destroy.spec.js | 16 - test/find.spec.js | 111 ------- test/find.test.js | 41 +++ test/findAll.spec.js | 129 -------- test/store/create.spec.js | 23 -- test/store/destroy.spec.js | 19 -- test/store/update.spec.js | 37 --- test/update.spec.js | 36 -- test/updateAll.spec.js | 47 --- webpack.config.js | 29 ++ 25 files changed, 661 insertions(+), 1203 deletions(-) create mode 100644 .babelrc delete mode 100644 .jshintrc create mode 100644 .npmignore delete mode 100644 Gruntfile.js create mode 100644 dist/js-data-mongodb.js.map delete mode 100644 test/create.spec.js delete mode 100644 test/destroy.spec.js delete mode 100644 test/find.spec.js create mode 100644 test/find.test.js delete mode 100644 test/findAll.spec.js delete mode 100644 test/store/create.spec.js delete mode 100644 test/store/destroy.spec.js delete mode 100644 test/store/update.spec.js delete mode 100644 test/update.spec.js delete mode 100644 test/updateAll.spec.js create mode 100644 webpack.config.js diff --git a/.babelrc b/.babelrc new file mode 100644 index 0000000..c13c5f6 --- /dev/null +++ b/.babelrc @@ -0,0 +1,3 @@ +{ + "presets": ["es2015"] +} diff --git a/.gitignore b/.gitignore index d72f39c..5d28049 100644 --- a/.gitignore +++ b/.gitignore @@ -31,3 +31,4 @@ node_modules *.iml data/ +doc/ \ No newline at end of file diff --git a/.jshintrc b/.jshintrc deleted file mode 100644 index f9d9a89..0000000 --- a/.jshintrc +++ /dev/null @@ -1,33 +0,0 @@ -{ - "node": false, - "browser": true, - "esnext": true, - "bitwise": true, - "camelcase": true, - "curly": true, - "eqeqeq": true, - "immed": true, - "indent": 2, - "latedef": true, - "newcap": true, - "undef": true, - "unused": true, - "noarg": true, - "quotmark": "single", - "regexp": true, - "strict": false, - "trailing": true, - "smarttabs": true, - "globals": { - "describe": true, - "it": true, - "beforeEach": true, - "afterEach": true, - "assert": true, - "fail": true, - "console": true, - "require": true, - "module": true, - "exports": true - } -} diff --git a/.npmignore b/.npmignore new file mode 100644 index 0000000..765fe66 --- /dev/null +++ b/.npmignore @@ -0,0 +1,38 @@ +# Logs +logs +*.log + +# Runtime data +pids +*.pid +*.seed + +# Directory for instrumented libs generated by jscoverage/JSCover +lib-cov + +# Coverage directory used by tools like istanbul +coverage + +# Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files) +.grunt + +# Compiled binary addons (http://nodejs.org/api/addons.html) +build/Release + +# Dependency directory +# Commenting this out is preferred by some people, see +# https://www.npmjs.org/doc/misc/npm-faq.html#should-i-check-my-node_modules-folder-into-git- +node_modules + +# Users Environment Variables +.lock-wscript + +.idea/ +*.iml + +data/ +doc/ +test/ +.babelrc +webpack.config.js +circle.yml \ No newline at end of file diff --git a/CHANGELOG.md b/CHANGELOG.md index 7247e15..86cfc41 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,8 @@ +##### 0.6.0 - 18 February 2016 + +- Upgraded dependencies +- Now using js-data-adapter-tests + ##### 0.5.1 - 10 July 2015 ###### Backwards compatible bug fixes diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 64b7599..69c5459 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -1,6 +1,7 @@ # Contributing Guide -First, support is handled via the [Mailing List](https://groups.io/org/groupsio/jsdata). Ask your questions there. +Support questions are handled via [StackOverflow][so], [Slack][slack], and the +[Mailing List][ml]. Ask your questions there. When submitting issues on GitHub, please include as much detail as possible to make debugging quick and easy. @@ -20,3 +21,7 @@ When submitting issues on GitHub, please include as much detail as possible to m 1. (in another terminal) `grunt karma:dev` (runs the tests) 1. Write your code, including relevant documentation and tests 1. Submit a PR and we'll review + +[slack]: http://slack.js-data.io +[ml]: https://groups.io/org/groupsio/jsdata +[so]: http://stackoverflow.com/questions/tagged/jsdata \ No newline at end of file diff --git a/Gruntfile.js b/Gruntfile.js deleted file mode 100644 index cd36957..0000000 --- a/Gruntfile.js +++ /dev/null @@ -1,82 +0,0 @@ -/* - * js-data-mongodb - * https://github.com/js-data/js-data-mongodb - * - * Copyright (c) 2014-2015 Jason Dobry - * Licensed under the MIT license. - */ -module.exports = function (grunt) { - 'use strict'; - - require('jit-grunt')(grunt, { - coveralls: 'grunt-karma-coveralls' - }); - require('time-grunt')(grunt); - - var pkg = grunt.file.readJSON('package.json'); - - // Project configuration. - grunt.initConfig({ - pkg: pkg, - watch: { - dist: { - files: ['src/**/*.js'], - tasks: ['build'] - } - }, - coveralls: { - options: { - coverage_dir: 'coverage' - } - }, - mochaTest: { - all: { - options: { - timeout: 2000, - reporter: 'spec' - }, - src: ['mocha.start.js', 'test/**/*.js'] - } - }, - webpack: { - dist: { - debug: true, - entry: './src/index.js', - output: { - filename: './dist/js-data-mongodb.js', - libraryTarget: 'commonjs2', - library: 'js-data-mongodb' - }, - externals: [ - 'mout/string/underscore', - 'mout/array/unique', - 'mout/array/map', - 'js-data', - 'mongodb', - 'bson' - ], - module: { - loaders: [ - { test: /(src)(.+)\.js$/, exclude: /node_modules/, loader: 'babel-loader?blacklist=useStrict' } - ], - preLoaders: [ - { - test: /(src)(.+)\.js$|(test)(.+)\.js$/, // include .js files - exclude: /node_modules/, // exclude any and all files in the node_modules folder - loader: "jshint-loader?failOnHint=true" - } - ] - } - } - } - }); - - grunt.registerTask('n', ['mochaTest']); - - grunt.registerTask('test', ['build', 'n']); - grunt.registerTask('build', [ - 'webpack' - ]); - grunt.registerTask('go', ['build', 'watch:dist']); - grunt.registerTask('default', ['build']); -}; diff --git a/README.md b/README.md index c553a3c..56bd7c7 100644 --- a/README.md +++ b/README.md @@ -1,25 +1,20 @@ -js-data logo +js-data logo -## js-data-mongodb [![npm version](https://img.shields.io/npm/v/js-data-mongodb.svg?style=flat-square)](https://www.npmjs.org/package/js-data-mongodb) [![Circle CI](https://img.shields.io/circleci/project/js-data/js-data-mongodb/master.svg?style=flat-square)](https://circleci.com/gh/js-data/js-data-mongodb/tree/master) [![npm downloads](https://img.shields.io/npm/dm/js-data-mongodb.svg?style=flat-square)](https://www.npmjs.org/package/js-data-mongodb) [![License](https://img.shields.io/badge/license-MIT-blue.svg?style=flat-square)](https://github.com/js-data/js-data-mongodb/blob/master/LICENSE) +# js-data-mongodb + +[![Slack Status][sl_b]][sl_l] +[![npm version][npm_b]][npm_l] +[![Circle CI][circle_b]][circle_l] +[![npm downloads][dn_b]][dn_l] +[![Coverage Status][cov_b]][cov_l] +[![Codacy][cod_b]][cod_l] MongoDB adapter for [js-data](http://www.js-data.io/). -### API Documentation +## API Documentation [DSMongoDBAdapter](http://www.js-data.io/docs/dsmongodbadapter) -### Project Status - -__Latest Release:__ [![Latest Release](https://img.shields.io/github/release/js-data/js-data-mongodb.svg?style=flat-square)](https://github.com/js-data/js-data-mongodb/releases) - -__Status:__ - -[![Dependency Status](https://img.shields.io/gemnasium/js-data/js-data-mongodb.svg?style=flat-square)](https://gemnasium.com/js-data/js-data-mongodb) [![Codacity](https://img.shields.io/codacy/1f45ede49dfb4bdea68f46ca55631968.svg?style=flat-square)](https://www.codacy.com/public/jasondobry/js-data-mongodb/dashboard) - -__Supported Platforms:__ - -[![node version](https://img.shields.io/badge/Node-0.10%2B-green.svg?style=flat-square)](https://github.com/js-data/js-data) - -### Quick Start +## Quick Start `npm install --save js-data js-data-mongodb`. ```js @@ -41,60 +36,46 @@ var User = store.defineResource({ }); ``` -### Changelog -[CHANGELOG.md](https://github.com/js-data/js-data-mongodb/blob/master/CHANGELOG.md) +## Changelog +See [CHANGELOG.md](https://github.com/js-data/js-data-mongodb/blob/master/CHANGELOG.md). -### Community -- [Gitter Channel](https://gitter.im/js-data/js-data) - Better than IRC! +## Community +- [StackOverflow Channel][so] +- [Slack Chat][sl_l] [![Slack Status][sl_b]][sl_l] - [Announcements](http://www.js-data.io/blog) -- [Mailing List](https://groups.io/org/groupsio/jsdata) - Ask your questions! -- [Issues](https://github.com/js-data/js-data-mongodb/issues) - Found a bug? Feature request? Submit an issue! -- [GitHub](https://github.com/js-data/js-data-mongodb) - View the source code for js-data. -- [Contributing Guide](https://github.com/js-data/js-data-mongodb/blob/master/CONTRIBUTING.md) - -### Contributing - -First, support is handled via the [Mailing List](https://groups.io/org/groupsio/jsdata). Ask your questions there. +- [Mailing List](ml) +- [Issue Tracker](https://github.com/js-data/js-data-mongodb/issues) -When submitting issues on GitHub, please include as much detail as possible to make debugging quick and easy. +## Support -- good - Your versions of js-data, js-data-mongodb, etc., relevant console logs/error, code examples that revealed the issue -- better - A [plnkr](http://plnkr.co/), [fiddle](http://jsfiddle.net/), or [bin](http://jsbin.com/?html,output) that demonstrates the issue -- best - A Pull Request that fixes the issue, including test coverage for the issue and the fix +Support questions are handled via [StackOverflow][so], [Slack][sl_l], and the +[Mailing List][ml]. Ask your questions there. -[Github Issues](https://github.com/js-data/js-data-mongodb/issues). +When submitting bug reports on GitHub, please include as much detail as possible +to make debugging quick and easy. -#### Pull Requests +## Contributing -1. Contribute to the issue that is the reason you'll be developing in the first place -1. Fork js-data-mongodb -1. `git clone https://github.com//js-data-mongodb.git` -1. `cd js-data-mongodb; npm install; bower install;` -1. `grunt go` (builds and starts a watch) -1. (in another terminal) `grunt karma:dev` (runs the tests) -1. Write your code, including relevant documentation and tests -1. Submit a PR and we'll review +See [CONTRIBUTING.md](https://github.com/js-data/js-data-mongodb/blob/master/CONTRIBUTING.md). -### License +## License The MIT License (MIT) -Copyright (c) 2014-2015 Jason Dobry - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. +See [LICENSE](https://github.com/js-data/js-data-mongodb/blob/master/LICENSE). + +[sl_b]: http://slack.js-data.io/badge.svg +[sl_l]: http://slack.js-data.io +[npm_b]: https://img.shields.io/npm/v/js-data-mongodb.svg?style=flat +[npm_l]: https://www.npmjs.org/package/js-data-mongodb +[circle_b]: https://img.shields.io/circleci/project/js-data/js-data-mongodb/master.svg?style=flat +[circle_l]: https://circleci.com/gh/js-data/js-data-mongodb/tree/master +[dn_b]: https://img.shields.io/npm/dm/js-data-mongodb.svg?style=flat +[dn_l]: https://www.npmjs.org/package/js-data-mongodb +[cov_b]: https://img.shields.io/coveralls/js-data/js-data-mongodb/master.svg?style=flat +[cov_l]: https://coveralls.io/github/js-data/js-data-mongodb?branch=master +[cod_b]: https://img.shields.io/codacy/1f45ede49dfb4bdea68f46ca55631968.svg +[cod_l]: https://www.codacy.com/app/jasondobry/js-data-mongodb/dashboard + +[ml]: https://groups.io/org/groupsio/jsdata +[so]: http://stackoverflow.com/questions/tagged/jsdata \ No newline at end of file diff --git a/circle.yml b/circle.yml index d9a3ab0..b285e56 100644 --- a/circle.yml +++ b/circle.yml @@ -1,3 +1,7 @@ +machine: + node: + version: 4.1.0 + test: - post: - - grunt coveralls || true + override: + - npm run ci diff --git a/dist/js-data-mongodb.js b/dist/js-data-mongodb.js index 230b901..17400de 100644 --- a/dist/js-data-mongodb.js +++ b/dist/js-data-mongodb.js @@ -2,41 +2,41 @@ module.exports = /******/ (function(modules) { // webpackBootstrap /******/ // The module cache /******/ var installedModules = {}; - +/******/ /******/ // The require function /******/ function __webpack_require__(moduleId) { - +/******/ /******/ // Check if module is in cache /******/ if(installedModules[moduleId]) /******/ return installedModules[moduleId].exports; - +/******/ /******/ // Create a new module (and put it into the cache) /******/ var module = installedModules[moduleId] = { /******/ exports: {}, /******/ id: moduleId, /******/ loaded: false /******/ }; - +/******/ /******/ // Execute the module function /******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__); - +/******/ /******/ // Flag the module as loaded /******/ module.loaded = true; - +/******/ /******/ // Return the exports of the module /******/ return module.exports; /******/ } - - +/******/ +/******/ /******/ // expose the modules object (__webpack_modules__) /******/ __webpack_require__.m = modules; - +/******/ /******/ // expose the module cache /******/ __webpack_require__.c = installedModules; - +/******/ /******/ // __webpack_public_path__ /******/ __webpack_require__.p = ""; - +/******/ /******/ // Load entry module and return exports /******/ return __webpack_require__(0); /******/ }) @@ -45,50 +45,50 @@ module.exports = /* 0 */ /***/ function(module, exports, __webpack_require__) { - Object.defineProperty(exports, '__esModule', { - value: true - }); - - var _createClass = (function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ('value' in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; })(); - + 'use strict'; + + var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); + function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } - - function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } } - - var mongodb = __webpack_require__(2); + + function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + + var mongodb = __webpack_require__(1); var MongoClient = mongodb.MongoClient; - var bson = __webpack_require__(3); - var map = __webpack_require__(4); + var bson = __webpack_require__(2); + var map = __webpack_require__(3); var ObjectID = bson.ObjectID; - var JSData = __webpack_require__(1); + var JSData = __webpack_require__(4); var underscore = __webpack_require__(5); var unique = __webpack_require__(6); var DSUtils = JSData.DSUtils; - + + var reserved = ['orderBy', 'sort', 'limit', 'offset', 'skip', 'where']; - + var Defaults = function Defaults() { _classCallCheck(this, Defaults); }; - + Defaults.prototype.translateId = true; - - var DSMongoDBAdapter = (function () { - function DSMongoDBAdapter(uri) { + + var DSMongoDBAdapter = function () { + function DSMongoDBAdapter(opts) { _classCallCheck(this, DSMongoDBAdapter); - - if (typeof uri === 'string') { - uri = { uri: uri }; + + if (typeof opts === 'string') { + opts = { uri: opts }; } + opts.uri || (opts.uri = 'mongodb://localhost:27017'); this.defaults = new Defaults(); - DSUtils.deepMixIn(this.defaults, uri); + DSUtils.deepMixIn(this.defaults, opts); this.client = new DSUtils.Promise(function (resolve, reject) { - MongoClient.connect(uri.uri, function (err, db) { + MongoClient.connect(opts.uri, function (err, db) { return err ? reject(err) : resolve(db); }); }); } - + _createClass(DSMongoDBAdapter, [{ key: 'getClient', value: function getClient() { @@ -99,10 +99,9 @@ module.exports = value: function getQuery(resourceConfig, params) { params = params || {}; params.where = params.where || {}; - - DSUtils.forEach(DSUtils.keys(params), function (k) { - var v = params[k]; - if (!DSUtils.contains(reserved, k)) { + + DSUtils.forOwn(params, function (v, k) { + if (reserved.indexOf(k) === -1) { if (DSUtils.isObject(v)) { params.where[k] = v; } else { @@ -113,10 +112,10 @@ module.exports = delete params[k]; } }); - + var query = {}; - - if (!DSUtils.isEmpty(params.where)) { + + if (Object.keys(params.where).length) { DSUtils.forOwn(params.where, function (criteria, field) { if (!DSUtils.isObject(criteria)) { params.where[field] = { @@ -205,7 +204,7 @@ module.exports = }); }); } - + return query; } }, { @@ -214,9 +213,9 @@ module.exports = params = params || {}; params.orderBy = params.orderBy || params.sort; params.skip = params.skip || params.offset; - + var queryOptions = {}; - + if (params.orderBy) { if (DSUtils.isString(params.orderBy)) { params.orderBy = [[params.orderBy, 'asc']]; @@ -228,15 +227,15 @@ module.exports = } queryOptions.sort = params.orderBy; } - + if (params.skip) { - queryOptions.skip = params.skip; + queryOptions.skip = +params.skip; } - + if (params.limit) { - queryOptions.limit = params.limit; + queryOptions.limit = +params.limit; } - + return queryOptions; } }, { @@ -269,10 +268,10 @@ module.exports = key: 'find', value: function find(resourceConfig, id, options) { var _this = this; - + var instance = undefined; options = this.origify(options); - options['with'] = options['with'] || []; + options.with = options.with || []; return this.getClient().then(function (client) { return new DSUtils.Promise(function (resolve, reject) { var params = {}; @@ -294,32 +293,32 @@ module.exports = }).then(function (_instance) { instance = _instance; var tasks = []; - + DSUtils.forEach(resourceConfig.relationList, function (def) { var relationName = def.relation; var relationDef = resourceConfig.getResource(relationName); var containedName = null; - if (DSUtils.contains(options['with'], relationName)) { + if (DSUtils.contains(options.with, relationName)) { containedName = relationName; - } else if (DSUtils.contains(options['with'], def.localField)) { + } else if (DSUtils.contains(options.with, def.localField)) { containedName = def.localField; } if (containedName) { (function () { var __options = DSUtils.deepMixIn({}, options.orig ? options.orig() : options); - __options['with'] = options['with'].slice(); + __options.with = options.with.slice(); __options = DSUtils._(relationDef, __options); - DSUtils.remove(__options['with'], containedName); - DSUtils.forEach(__options['with'], function (relation, i) { + DSUtils.remove(__options.with, containedName); + DSUtils.forEach(__options.with, function (relation, i) { if (relation && relation.indexOf(containedName) === 0 && relation.length >= containedName.length && relation[containedName.length] === '.') { - __options['with'][i] = relation.substr(containedName.length + 1); + __options.with[i] = relation.substr(containedName.length + 1); } else { - __options['with'][i] = ''; + __options.with[i] = ''; } }); - + var task = undefined; - + if ((def.type === 'hasOne' || def.type === 'hasMany') && def.foreignKey) { task = _this.findAll(resourceConfig.getResource(relationName), { where: _defineProperty({}, def.foreignKey, { @@ -356,14 +355,14 @@ module.exports = return relatedItem; }); } - + if (task) { tasks.push(task); } })(); } }); - + return DSUtils.Promise.all(tasks); }).then(function () { return instance; @@ -373,10 +372,10 @@ module.exports = key: 'findAll', value: function findAll(resourceConfig, params, options) { var _this2 = this; - + var items = null; options = this.origify(options ? DSUtils.copy(options) : {}); - options['with'] = options['with'] || []; + options.with = options.with || []; DSUtils.deepMixIn(options, this.getQueryOptions(resourceConfig, params)); var query = this.getQuery(resourceConfig, params); return this.getClient().then(function (client) { @@ -397,27 +396,27 @@ module.exports = var relationName = def.relation; var relationDef = resourceConfig.getResource(relationName); var containedName = null; - if (DSUtils.contains(options['with'], relationName)) { + if (DSUtils.contains(options.with, relationName)) { containedName = relationName; - } else if (DSUtils.contains(options['with'], def.localField)) { + } else if (DSUtils.contains(options.with, def.localField)) { containedName = def.localField; } if (containedName) { (function () { var __options = DSUtils.deepMixIn({}, options.orig ? options.orig() : options); - __options['with'] = options['with'].slice(); + __options.with = options.with.slice(); __options = DSUtils._(relationDef, __options); - DSUtils.remove(__options['with'], containedName); - DSUtils.forEach(__options['with'], function (relation, i) { + DSUtils.remove(__options.with, containedName); + DSUtils.forEach(__options.with, function (relation, i) { if (relation && relation.indexOf(containedName) === 0 && relation.length >= containedName.length && relation[containedName.length] === '.') { - __options['with'][i] = relation.substr(containedName.length + 1); + __options.with[i] = relation.substr(containedName.length + 1); } else { - __options['with'][i] = ''; + __options.with[i] = ''; } }); - + var task = undefined; - + if ((def.type === 'hasOne' || def.type === 'hasMany') && def.foreignKey) { task = _this2.findAll(resourceConfig.getResource(relationName), { where: _defineProperty({}, def.foreignKey, { @@ -496,7 +495,7 @@ module.exports = return relatedItems; }); } - + if (task) { tasks.push(task); } @@ -512,7 +511,7 @@ module.exports = key: 'create', value: function create(resourceConfig, attrs, options) { var _this3 = this; - + options = this.origify(options); attrs = DSUtils.removeCircular(DSUtils.omit(attrs, resourceConfig.relationFields || [])); return this.getClient().then(function (client) { @@ -535,7 +534,7 @@ module.exports = key: 'update', value: function update(resourceConfig, id, attrs, options) { var _this4 = this; - + attrs = DSUtils.removeCircular(DSUtils.omit(attrs, resourceConfig.relationFields || [])); options = this.origify(options); return this.find(resourceConfig, id, options).then(function () { @@ -564,7 +563,7 @@ module.exports = key: 'updateAll', value: function updateAll(resourceConfig, attrs, params, options) { var _this5 = this; - + var ids = []; attrs = DSUtils.removeCircular(DSUtils.omit(attrs, resourceConfig.relationFields || [])); options = this.origify(options ? DSUtils.copy(options) : {}); @@ -627,7 +626,7 @@ module.exports = key: 'destroyAll', value: function destroyAll(resourceConfig, params, options) { var _this6 = this; - + options = this.origify(options ? DSUtils.copy(options) : {}); return this.getClient().then(function (client) { DSUtils.deepMixIn(options, _this6.getQueryOptions(resourceConfig, params)); @@ -645,36 +644,35 @@ module.exports = }); } }]); - + return DSMongoDBAdapter; - })(); - - exports['default'] = DSMongoDBAdapter; - module.exports = exports['default']; + }(); + + module.exports = DSMongoDBAdapter; /***/ }, /* 1 */ /***/ function(module, exports) { - module.exports = require("js-data"); + module.exports = require("mongodb"); /***/ }, /* 2 */ /***/ function(module, exports) { - module.exports = require("mongodb"); + module.exports = require("bson"); /***/ }, /* 3 */ /***/ function(module, exports) { - module.exports = require("bson"); + module.exports = require("mout/array/map"); /***/ }, /* 4 */ /***/ function(module, exports) { - module.exports = require("mout/array/map"); + module.exports = require("js-data"); /***/ }, /* 5 */ @@ -689,4 +687,5 @@ module.exports = module.exports = require("mout/array/unique"); /***/ } -/******/ ]); \ No newline at end of file +/******/ ]); +//# sourceMappingURL=js-data-mongodb.js.map \ No newline at end of file diff --git a/dist/js-data-mongodb.js.map b/dist/js-data-mongodb.js.map new file mode 100644 index 0000000..c285b1d --- /dev/null +++ b/dist/js-data-mongodb.js.map @@ -0,0 +1 @@ +{"version":3,"sources":["webpack:///webpack/bootstrap 9c83c6111e94a2255e9d","webpack:///./src/index.js","webpack:///external \"mongodb\"","webpack:///external \"bson\"","webpack:///external \"mout/array/map\"","webpack:///external \"js-data\"","webpack:///external \"mout/string/underscore\"","webpack:///external \"mout/array/unique\""],"names":[],"mappings":"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","file":"./dist/js-data-mongodb.js","sourcesContent":[" \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId])\n \t\t\treturn installedModules[moduleId].exports;\n\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\texports: {},\n \t\t\tid: moduleId,\n \t\t\tloaded: false\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.loaded = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(0);\n\n\n\n/** WEBPACK FOOTER **\n ** webpack/bootstrap 9c83c6111e94a2255e9d\n **/","const mongodb = require('mongodb')\r\nconst MongoClient = mongodb.MongoClient\r\nconst bson = require('bson')\r\nconst map = require('mout/array/map')\r\nconst ObjectID = bson.ObjectID\r\nconst JSData = require('js-data')\r\nconst underscore = require('mout/string/underscore')\r\nconst unique = require('mout/array/unique')\r\nconst { DSUtils } = JSData\r\n\r\nconst reserved = [\r\n 'orderBy',\r\n 'sort',\r\n 'limit',\r\n 'offset',\r\n 'skip',\r\n 'where'\r\n]\r\n\r\nclass Defaults {\r\n\r\n}\r\n\r\nDefaults.prototype.translateId = true\r\n\r\nclass DSMongoDBAdapter {\r\n constructor (opts) {\r\n if (typeof opts === 'string') {\r\n opts = { uri: opts }\r\n }\r\n opts.uri || (opts.uri = 'mongodb://localhost:27017')\r\n this.defaults = new Defaults()\r\n DSUtils.deepMixIn(this.defaults, opts)\r\n this.client = new DSUtils.Promise(function (resolve, reject) {\r\n MongoClient.connect(opts.uri, function (err, db) {\r\n return err ? reject(err) : resolve(db)\r\n })\r\n })\r\n }\r\n\r\n getClient () {\r\n return this.client\r\n }\r\n\r\n getQuery (resourceConfig, params) {\r\n params = params || {}\r\n params.where = params.where || {}\r\n\r\n DSUtils.forOwn(params, function (v, k) {\r\n if (reserved.indexOf(k) === -1) {\r\n if (DSUtils.isObject(v)) {\r\n params.where[k] = v\r\n } else {\r\n params.where[k] = {\r\n '==': v\r\n }\r\n }\r\n delete params[k]\r\n }\r\n })\r\n\r\n let query = {}\r\n\r\n if (Object.keys(params.where).length) {\r\n DSUtils.forOwn(params.where, function (criteria, field) {\r\n if (!DSUtils.isObject(criteria)) {\r\n params.where[field] = {\r\n '==': criteria\r\n }\r\n }\r\n DSUtils.forOwn(criteria, function (v, op) {\r\n if (op === '==' || op === '===') {\r\n query[field] = v\r\n } else if (op === '!=' || op === '!==') {\r\n query[field] = query[field] || {}\r\n query[field].$ne = v\r\n } else if (op === '>') {\r\n query[field] = query[field] || {}\r\n query[field].$gt = v\r\n } else if (op === '>=') {\r\n query[field] = query[field] || {}\r\n query[field].$gte = v\r\n } else if (op === '<') {\r\n query[field] = query[field] || {}\r\n query[field].$lt = v\r\n } else if (op === '<=') {\r\n query[field] = query[field] || {}\r\n query[field].$lte = v\r\n } else if (op === 'in') {\r\n query[field] = query[field] || {}\r\n query[field].$in = v\r\n } else if (op === 'notIn') {\r\n query[field] = query[field] || {}\r\n query[field].$nin = v\r\n } else if (op === '|==' || op === '|===') {\r\n query.$or = query.$or || []\r\n let orEqQuery = {}\r\n orEqQuery[field] = v\r\n query.$or.push(orEqQuery)\r\n } else if (op === '|!=' || op === '|!==') {\r\n query.$or = query.$or || []\r\n let orNeQuery = {}\r\n orNeQuery[field] = {\r\n '$ne': v\r\n }\r\n query.$or.push(orNeQuery)\r\n } else if (op === '|>') {\r\n query.$or = query.$or || []\r\n let orGtQuery = {}\r\n orGtQuery[field] = {\r\n '$gt': v\r\n }\r\n query.$or.push(orGtQuery)\r\n } else if (op === '|>=') {\r\n query.$or = query.$or || []\r\n let orGteQuery = {}\r\n orGteQuery[field] = {\r\n '$gte': v\r\n }\r\n query.$or.push(orGteQuery)\r\n } else if (op === '|<') {\r\n query.$or = query.$or || []\r\n let orLtQuery = {}\r\n orLtQuery[field] = {\r\n '$lt': v\r\n }\r\n query.$or.push(orLtQuery)\r\n } else if (op === '|<=') {\r\n query.$or = query.$or || []\r\n let orLteQuery = {}\r\n orLteQuery[field] = {\r\n '$lte': v\r\n }\r\n query.$or.push(orLteQuery)\r\n } else if (op === '|in') {\r\n query.$or = query.$or || []\r\n let orInQuery = {}\r\n orInQuery[field] = {\r\n '$in': v\r\n }\r\n query.$or.push(orInQuery)\r\n } else if (op === '|notIn') {\r\n query.$or = query.$or || []\r\n let orNinQuery = {}\r\n orNinQuery[field] = {\r\n '$nin': v\r\n }\r\n query.$or.push(orNinQuery)\r\n }\r\n })\r\n })\r\n }\r\n\r\n return query\r\n }\r\n\r\n getQueryOptions (resourceConfig, params) {\r\n params = params || {}\r\n params.orderBy = params.orderBy || params.sort\r\n params.skip = params.skip || params.offset\r\n\r\n let queryOptions = {}\r\n\r\n if (params.orderBy) {\r\n if (DSUtils.isString(params.orderBy)) {\r\n params.orderBy = [\r\n [params.orderBy, 'asc']\r\n ]\r\n }\r\n for (var i = 0; i < params.orderBy.length; i++) {\r\n if (DSUtils.isString(params.orderBy[i])) {\r\n params.orderBy[i] = [params.orderBy[i], 'asc']\r\n }\r\n }\r\n queryOptions.sort = params.orderBy\r\n }\r\n\r\n if (params.skip) {\r\n queryOptions.skip = +params.skip\r\n }\r\n\r\n if (params.limit) {\r\n queryOptions.limit = +params.limit\r\n }\r\n\r\n return queryOptions\r\n }\r\n\r\n translateId (r, options) {\r\n options = options || {}\r\n if (typeof options.translateId === 'boolean' ? options.translateId : this.defaults.translateId) {\r\n if (Array.isArray(r)) {\r\n r.forEach((_r) => {\r\n let __id = _r._id ? _r._id.toString() : _r._id\r\n _r._id = typeof __id === 'string' ? __id : _r._id\r\n })\r\n } else if (DSUtils.isObject(r)) {\r\n let __id = r._id ? r._id.toString() : r._id\r\n r._id = typeof __id === 'string' ? __id : r._id\r\n }\r\n }\r\n return r\r\n }\r\n\r\n origify (options) {\r\n options = options || {}\r\n if (typeof options.orig === 'function') {\r\n return options.orig()\r\n }\r\n return options\r\n }\r\n\r\n find (resourceConfig, id, options) {\r\n let instance\r\n options = this.origify(options)\r\n options.with = options.with || []\r\n return this.getClient().then((client) => {\r\n return new DSUtils.Promise((resolve, reject) => {\r\n let params = {}\r\n params[resourceConfig.idAttribute] = id\r\n if (resourceConfig.idAttribute === '_id' && typeof id === 'string' && ObjectID.isValid(id)) {\r\n params[resourceConfig.idAttribute] = ObjectID.createFromHexString(id)\r\n }\r\n options.fields = options.fields || {}\r\n client.collection(resourceConfig.table || underscore(resourceConfig.name)).findOne(params, options, (err, r) => {\r\n if (err) {\r\n reject(err)\r\n } else if (!r) {\r\n reject(new Error('Not Found!'))\r\n } else {\r\n resolve(this.translateId(r, options))\r\n }\r\n })\r\n })\r\n }).then((_instance) => {\r\n instance = _instance\r\n let tasks = []\r\n\r\n DSUtils.forEach(resourceConfig.relationList, (def) => {\r\n let relationName = def.relation\r\n let relationDef = resourceConfig.getResource(relationName)\r\n let containedName = null\r\n if (DSUtils.contains(options.with, relationName)) {\r\n containedName = relationName\r\n } else if (DSUtils.contains(options.with, def.localField)) {\r\n containedName = def.localField\r\n }\r\n if (containedName) {\r\n let __options = DSUtils.deepMixIn({}, options.orig ? options.orig() : options)\r\n __options.with = options.with.slice()\r\n __options = DSUtils._(relationDef, __options)\r\n DSUtils.remove(__options.with, containedName)\r\n DSUtils.forEach(__options.with, (relation, i) => {\r\n if (relation && relation.indexOf(containedName) === 0 && relation.length >= containedName.length && relation[containedName.length] === '.') {\r\n __options.with[i] = relation.substr(containedName.length + 1)\r\n } else {\r\n __options.with[i] = ''\r\n }\r\n })\r\n\r\n let task\r\n\r\n if ((def.type === 'hasOne' || def.type === 'hasMany') && def.foreignKey) {\r\n task = this.findAll(resourceConfig.getResource(relationName), {\r\n where: {\r\n [def.foreignKey]: {\r\n '==': instance[resourceConfig.idAttribute]\r\n }\r\n }\r\n }, __options).then((relatedItems) => {\r\n if (def.type === 'hasOne' && relatedItems.length) {\r\n DSUtils.set(instance, def.localField, relatedItems[0])\r\n } else {\r\n DSUtils.set(instance, def.localField, relatedItems)\r\n }\r\n return relatedItems\r\n })\r\n } else if (def.type === 'hasMany' && def.localKeys) {\r\n let localKeys = []\r\n let itemKeys = instance[def.localKeys] || []\r\n itemKeys = Array.isArray(itemKeys) ? itemKeys : DSUtils.keys(itemKeys)\r\n localKeys = localKeys.concat(itemKeys || [])\r\n task = this.findAll(resourceConfig.getResource(relationName), {\r\n where: {\r\n [relationDef.idAttribute]: {\r\n 'in': map(DSUtils.filter(unique(localKeys), (x) => x), (x) => new ObjectID(x))\r\n }\r\n }\r\n }, __options).then((relatedItems) => {\r\n DSUtils.set(instance, def.localField, relatedItems)\r\n return relatedItems\r\n })\r\n } else if (def.type === 'belongsTo' || (def.type === 'hasOne' && def.localKey)) {\r\n task = this.find(resourceConfig.getResource(relationName), DSUtils.get(instance, def.localKey), __options).then((relatedItem) => {\r\n DSUtils.set(instance, def.localField, relatedItem)\r\n return relatedItem\r\n })\r\n }\r\n\r\n if (task) {\r\n tasks.push(task)\r\n }\r\n }\r\n })\r\n\r\n return DSUtils.Promise.all(tasks)\r\n }).then(() => instance)\r\n }\r\n\r\n findAll (resourceConfig, params, options) {\r\n let items = null\r\n options = this.origify(options ? DSUtils.copy(options) : {})\r\n options.with = options.with || []\r\n DSUtils.deepMixIn(options, this.getQueryOptions(resourceConfig, params))\r\n let query = this.getQuery(resourceConfig, params)\r\n return this.getClient().then((client) => {\r\n return new DSUtils.Promise((resolve, reject) => {\r\n options.fields = options.fields || {}\r\n client.collection(resourceConfig.table || underscore(resourceConfig.name)).find(query, options).toArray((err, r) => {\r\n if (err) {\r\n reject(err)\r\n } else {\r\n resolve(this.translateId(r, options))\r\n }\r\n })\r\n })\r\n }).then((_items) => {\r\n items = _items\r\n let tasks = []\r\n DSUtils.forEach(resourceConfig.relationList, (def) => {\r\n let relationName = def.relation\r\n let relationDef = resourceConfig.getResource(relationName)\r\n let containedName = null\r\n if (DSUtils.contains(options.with, relationName)) {\r\n containedName = relationName\r\n } else if (DSUtils.contains(options.with, def.localField)) {\r\n containedName = def.localField\r\n }\r\n if (containedName) {\r\n let __options = DSUtils.deepMixIn({}, options.orig ? options.orig() : options)\r\n __options.with = options.with.slice()\r\n __options = DSUtils._(relationDef, __options)\r\n DSUtils.remove(__options.with, containedName)\r\n DSUtils.forEach(__options.with, (relation, i) => {\r\n if (relation && relation.indexOf(containedName) === 0 && relation.length >= containedName.length && relation[containedName.length] === '.') {\r\n __options.with[i] = relation.substr(containedName.length + 1)\r\n } else {\r\n __options.with[i] = ''\r\n }\r\n })\r\n\r\n let task\r\n\r\n if ((def.type === 'hasOne' || def.type === 'hasMany') && def.foreignKey) {\r\n task = this.findAll(resourceConfig.getResource(relationName), {\r\n where: {\r\n [def.foreignKey]: {\r\n 'in': DSUtils.filter(map(items, (item) => DSUtils.get(item, resourceConfig.idAttribute)), (x) => x)\r\n }\r\n }\r\n }, __options).then((relatedItems) => {\r\n DSUtils.forEach(items, (item) => {\r\n let attached = []\r\n DSUtils.forEach(relatedItems, (relatedItem) => {\r\n if (DSUtils.get(relatedItem, def.foreignKey) === item[resourceConfig.idAttribute]) {\r\n attached.push(relatedItem)\r\n }\r\n })\r\n if (def.type === 'hasOne' && attached.length) {\r\n DSUtils.set(item, def.localField, attached[0])\r\n } else {\r\n DSUtils.set(item, def.localField, attached)\r\n }\r\n })\r\n return relatedItems\r\n })\r\n } else if (def.type === 'hasMany' && def.localKeys) {\r\n let localKeys = []\r\n DSUtils.forEach(items, (item) => {\r\n let itemKeys = item[def.localKeys] || []\r\n itemKeys = Array.isArray(itemKeys) ? itemKeys : DSUtils.keys(itemKeys)\r\n localKeys = localKeys.concat(itemKeys || [])\r\n })\r\n task = this.findAll(resourceConfig.getResource(relationName), {\r\n where: {\r\n [relationDef.idAttribute]: {\r\n 'in': map(DSUtils.filter(unique(localKeys), (x) => x), (x) => new ObjectID(x))\r\n }\r\n }\r\n }, __options).then((relatedItems) => {\r\n DSUtils.forEach(items, (item) => {\r\n let attached = []\r\n let itemKeys = item[def.localKeys] || []\r\n itemKeys = Array.isArray(itemKeys) ? itemKeys : DSUtils.keys(itemKeys)\r\n DSUtils.forEach(relatedItems, (relatedItem) => {\r\n if (itemKeys && DSUtils.contains(itemKeys, relatedItem[relationDef.idAttribute])) {\r\n attached.push(relatedItem)\r\n }\r\n })\r\n DSUtils.set(item, def.localField, attached)\r\n })\r\n return relatedItems\r\n })\r\n } else if (def.type === 'belongsTo' || (def.type === 'hasOne' && def.localKey)) {\r\n task = this.findAll(resourceConfig.getResource(relationName), {\r\n where: {\r\n [relationDef.idAttribute]: {\r\n 'in': map(DSUtils.filter(map(items, (item) => DSUtils.get(item, def.localKey)), (x) => x), (x) => new ObjectID(x))\r\n }\r\n }\r\n }, __options).then((relatedItems) => {\r\n DSUtils.forEach(items, (item) => {\r\n DSUtils.forEach(relatedItems, (relatedItem) => {\r\n if (relatedItem[relationDef.idAttribute] === item[def.localKey]) {\r\n DSUtils.set(item, def.localField, relatedItem)\r\n }\r\n })\r\n })\r\n return relatedItems\r\n })\r\n }\r\n\r\n if (task) {\r\n tasks.push(task)\r\n }\r\n }\r\n })\r\n return DSUtils.Promise.all(tasks)\r\n }).then(() => items)\r\n }\r\n\r\n create (resourceConfig, attrs, options) {\r\n options = this.origify(options)\r\n attrs = DSUtils.removeCircular(DSUtils.omit(attrs, resourceConfig.relationFields || []))\r\n return this.getClient().then((client) => {\r\n return new DSUtils.Promise((resolve, reject) => {\r\n let collection = client.collection(resourceConfig.table || underscore(resourceConfig.name))\r\n let method = collection.insertOne ? DSUtils.isArray(attrs) ? 'insertMany' : 'insertOne' : 'insert'\r\n collection[method](attrs, options, (err, r) => {\r\n if (err) {\r\n reject(err)\r\n } else {\r\n r = r.ops ? r.ops : r\r\n this.translateId(r, options)\r\n resolve(DSUtils.isArray(attrs) ? r : r[0])\r\n }\r\n })\r\n })\r\n })\r\n }\r\n\r\n update (resourceConfig, id, attrs, options) {\r\n attrs = DSUtils.removeCircular(DSUtils.omit(attrs, resourceConfig.relationFields || []))\r\n options = this.origify(options)\r\n return this.find(resourceConfig, id, options).then(() => {\r\n return this.getClient()\r\n }).then((client) => {\r\n return new DSUtils.Promise((resolve, reject) => {\r\n let params = {}\r\n params[resourceConfig.idAttribute] = id\r\n if (resourceConfig.idAttribute === '_id' && typeof id === 'string' && ObjectID.isValid(id)) {\r\n params[resourceConfig.idAttribute] = ObjectID.createFromHexString(id)\r\n }\r\n let collection = client.collection(resourceConfig.table || underscore(resourceConfig.name))\r\n collection[collection.updateOne ? 'updateOne' : 'update'](params, {$set: attrs}, options, (err) => {\r\n if (err) {\r\n reject(err)\r\n } else {\r\n resolve()\r\n }\r\n })\r\n })\r\n }).then(() => this.find(resourceConfig, id, options))\r\n }\r\n\r\n updateAll (resourceConfig, attrs, params, options) {\r\n let ids = []\r\n attrs = DSUtils.removeCircular(DSUtils.omit(attrs, resourceConfig.relationFields || []))\r\n options = this.origify(options ? DSUtils.copy(options) : {})\r\n let _options = DSUtils.copy(options)\r\n _options.multi = true\r\n return this.getClient().then((client) => {\r\n let queryOptions = this.getQueryOptions(resourceConfig, params)\r\n queryOptions.$set = attrs\r\n let query = this.getQuery(resourceConfig, params)\r\n return this.findAll(resourceConfig, params, options).then((items) => {\r\n ids = map(items, (item) => {\r\n let id = item[resourceConfig.idAttribute]\r\n if (resourceConfig.idAttribute === '_id' && typeof id === 'string' && ObjectID.isValid(id)) {\r\n return ObjectID.createFromHexString(id)\r\n }\r\n return id\r\n })\r\n return new DSUtils.Promise((resolve, reject) => {\r\n let collection = client.collection(resourceConfig.table || underscore(resourceConfig.name))\r\n collection[collection.updateMany ? 'updateMany' : 'update'](query, queryOptions, _options, (err) => {\r\n if (err) {\r\n reject(err)\r\n } else {\r\n resolve()\r\n }\r\n })\r\n })\r\n }).then(() => {\r\n let _params = {}\r\n _params[resourceConfig.idAttribute] = {\r\n 'in': ids\r\n }\r\n return this.findAll(resourceConfig, _params, options)\r\n })\r\n })\r\n }\r\n\r\n destroy (resourceConfig, id, options) {\r\n options = this.origify(options)\r\n return this.getClient().then((client) => {\r\n return new DSUtils.Promise((resolve, reject) => {\r\n let params = {}\r\n params[resourceConfig.idAttribute] = id\r\n if (resourceConfig.idAttribute === '_id' && typeof id === 'string' && ObjectID.isValid(id)) {\r\n params[resourceConfig.idAttribute] = ObjectID.createFromHexString(id)\r\n }\r\n let collection = client.collection(resourceConfig.table || underscore(resourceConfig.name))\r\n collection[collection.deleteOne ? 'deleteOne' : 'remove'](params, options, (err) => {\r\n if (err) {\r\n reject(err)\r\n } else {\r\n resolve()\r\n }\r\n })\r\n })\r\n })\r\n }\r\n\r\n destroyAll (resourceConfig, params, options) {\r\n options = this.origify(options ? DSUtils.copy(options) : {})\r\n return this.getClient().then((client) => {\r\n DSUtils.deepMixIn(options, this.getQueryOptions(resourceConfig, params))\r\n let query = this.getQuery(resourceConfig, params)\r\n return new DSUtils.Promise((resolve, reject) => {\r\n let collection = client.collection(resourceConfig.table || underscore(resourceConfig.name))\r\n collection[collection.deleteMany ? 'deleteMany' : 'remove'](query, options, (err) => {\r\n if (err) {\r\n reject(err)\r\n } else {\r\n resolve()\r\n }\r\n })\r\n })\r\n })\r\n }\r\n}\r\n\r\nmodule.exports = DSMongoDBAdapter\r\n\n\n\n/** WEBPACK FOOTER **\n ** ./src/index.js\n **/","module.exports = require(\"mongodb\");\n\n\n/*****************\n ** WEBPACK FOOTER\n ** external \"mongodb\"\n ** module id = 1\n ** module chunks = 0\n **/","module.exports = require(\"bson\");\n\n\n/*****************\n ** WEBPACK FOOTER\n ** external \"bson\"\n ** module id = 2\n ** module chunks = 0\n **/","module.exports = require(\"mout/array/map\");\n\n\n/*****************\n ** WEBPACK FOOTER\n ** external \"mout/array/map\"\n ** module id = 3\n ** module chunks = 0\n **/","module.exports = require(\"js-data\");\n\n\n/*****************\n ** WEBPACK FOOTER\n ** external \"js-data\"\n ** module id = 4\n ** module chunks = 0\n **/","module.exports = require(\"mout/string/underscore\");\n\n\n/*****************\n ** WEBPACK FOOTER\n ** external \"mout/string/underscore\"\n ** module id = 5\n ** module chunks = 0\n **/","module.exports = require(\"mout/array/unique\");\n\n\n/*****************\n ** WEBPACK FOOTER\n ** external \"mout/array/unique\"\n ** module id = 6\n ** module chunks = 0\n **/"],"sourceRoot":""} \ No newline at end of file diff --git a/mocha.start.js b/mocha.start.js index dd00fa6..963f5f9 100644 --- a/mocha.start.js +++ b/mocha.start.js @@ -1,137 +1,39 @@ /*global assert:true */ -'use strict'; - -var assert = require('chai').assert; -assert.equalObjects = function (a, b, m) { - assert.deepEqual(JSON.parse(JSON.stringify(a)), JSON.parse(JSON.stringify(b)), m || 'Objects should be equal!'); -}; -var mocha = require('mocha'); -var JSData = require('js-data'); -JSData.DSUtils.Promise = require('bluebird'); -var DSMongoDBAdapter = require('./'); - -var adapter, store, DSUtils, DSErrors, Profile, User, Post, Comment; - -var globals = module.exports = { - fail: function (msg) { - assert.equal('should not reach this!: ' + msg, 'failure'); +'use strict' + +// prepare environment for js-data-adapter-tests +require('babel-polyfill') +global.assert = require('chai').assert + +var JSData = require('js-data') +var TestRunner = require('js-data-adapter-tests') +var MongoDBAdapter = require('./') + +TestRunner.init({ + debug: false, + DS: JSData.DS, + Adapter: MongoDBAdapter, + adapterConfig: { + uri: 'mongodb://localhost:27017' }, - TYPES_EXCEPT_STRING: [123, 123.123, null, undefined, {}, [], true, false, function () { - }], - TYPES_EXCEPT_STRING_OR_ARRAY: [123, 123.123, null, undefined, {}, true, false, function () { - }], - TYPES_EXCEPT_STRING_OR_NUMBER: [null, undefined, {}, [], true, false, function () { - }], - TYPES_EXCEPT_STRING_OR_OBJECT: [123, 123.123, null, undefined, [], true, false, function () { - }], - TYPES_EXCEPT_STRING_OR_NUMBER_OBJECT: [null, undefined, [], true, false, function () { - }], - TYPES_EXCEPT_STRING_OR_ARRAY_OR_NUMBER: [null, undefined, {}, true, false, function () { - }], - TYPES_EXCEPT_NUMBER: ['string', null, undefined, {}, [], true, false, function () { - }], - TYPES_EXCEPT_OBJECT: ['string', 123, 123.123, null, undefined, true, false, function () { - }], - TYPES_EXCEPT_BOOLEAN: ['string', 123, 123.123, null, undefined, {}, [], function () { - }], - TYPES_EXCEPT_FUNCTION: ['string', 123, 123.123, null, undefined, {}, [], true, false], - assert: assert, - adapter: undefined -}; - -var test = new mocha(); - -var testGlobals = []; - -for (var key in globals) { - global[key] = globals[key]; - testGlobals.push(globals[key]); -} -test.globals(testGlobals); - -beforeEach(function () { - store = new JSData.DS({ + storeConfig: { + bypassCache: true, + linkRelations: false, + cacheResponse: false, idAttribute: '_id', - log: false - }); - adapter = new DSMongoDBAdapter('mongodb://localhost:27017'); - store.registerAdapter('mongo', adapter, { 'default': true }); - DSUtils = JSData.DSUtils; - DSErrors = JSData.DSErrors; - globals.Profile = global.Profile = Profile = store.defineResource({ - name: 'profile' - }); - globals.User = global.User = User = store.defineResource({ - name: 'user', - relations: { - hasMany: { - post: { - localField: 'posts', - foreignKey: 'post' - } - }, - hasOne: { - profile: { - localField: 'profile', - localKey: 'profileId' - } - } - } - }); - globals.Post = global.Post = Post = store.defineResource({ - name: 'post', - relations: { - belongsTo: { - user: { - localField: 'user', - localKey: 'userId' - } - }, - hasMany: { - comment: { - localField: 'comments', - foreignKey: 'postId' - } - } - } - }); - globals.Comment = global.Comment = Comment = store.defineResource({ - name: 'comment', - relations: { - belongsTo: { - post: { - localField: 'post', - localKey: 'postId' - }, - user: { - localField: 'user', - localKey: 'userId' - } - } - } - }); - - globals.adapter = adapter; - global.adapter = globals.adapter; - - globals.DSUtils = DSUtils; - global.DSUtils = globals.DSUtils; - - globals.DSErrors = DSErrors; - global.DSErrors = globals.DSErrors; -}); - -afterEach(function (done) { - globals.adapter = null; - global.adapter = null; - - adapter.destroyAll(Comment).then(function () { - return adapter.destroyAll(Post); - }).then(function () { - return adapter.destroyAll(User); - }).then(function () { - return adapter.destroyAll(Profile); - }).then(function () { - done(); - }, done); -}); + log: false, + debug: false + }, + features: [], + methods: [ + 'create', + 'destroy', + 'destroyAll', + 'find', + 'findAll', + 'update', + 'updateAll' + ] +}) + +require('./test/find.test') diff --git a/package.json b/package.json index f3f954b..4ab2bcb 100644 --- a/package.json +++ b/package.json @@ -1,22 +1,14 @@ { "name": "js-data-mongodb", "description": "MongoDB adapter for js-data.", - "version": "0.5.1", - "homepage": "http://www.js-data.io/docs/dsmongodbadapter", + "version": "0.6.0", + "homepage": "https://github.com/js-data/js-data-mongodb", "repository": { "type": "git", "url": "https://github.com/js-data/js-data-mongodb.git" }, - "author": { - "name": "Jason Dobry", - "email": "jason.dobry@gmail.com" - }, - "licenses": [ - { - "type": "MIT", - "url": "https://github.com/js-data/js-data-mongodb/blob/master/LICENSE" - } - ], + "author": "Jason Dobry (http://www.pseudobry.com)", + "license": "MIT", "main": "./dist/js-data-mongodb.js", "keywords": [ "data", @@ -26,31 +18,45 @@ "adapter", "mongodb" ], - "devDependencies": { - "babel-core": "5.6.17", - "babel-loader": "5.3.1", - "bluebird": "2.9.33", - "chai": "3.0.0", - "grunt": "0.4.5", - "grunt-contrib-watch": "0.6.1", - "grunt-karma-coveralls": "2.5.3", - "grunt-mocha-test": "0.12.7", - "grunt-webpack": "1.0.11", - "jit-grunt": "0.9.1", - "jshint": "2.8.0", - "jshint-loader": "0.8.3", - "time-grunt": "1.2.1", - "webpack-dev-server": "1.10.1" + "standard": { + "parser": "babel-eslint", + "globals": [ + "beforeEach", + "describe", + "assert", + "it" + ] }, "scripts": { - "test": "grunt test" + "bundle": "webpack --config webpack.config.js --colors", + "lint": "standard src/**/*.js mocha.start.js test/**/*.js", + "build": "npm run lint && npm run bundle", + "mocha": "mocha -t 20000 -R dot -r source-map-support mocha.start.js", + "cover": "istanbul cover --hook-run-in-context node_modules/mocha/bin/_mocha -- -t 20000 -R dot -r source-map-support mocha.start.js", + "test": "npm run build && npm run cover", + "ci": "npm run test && cat coverage/lcov.info | coveralls || true && cat ./coverage/lcov.info | codacy-coverage || true" }, - "dependencies": { - "bson": "0.3.x", - "mout": "0.11.0" + "devDependencies": { + "babel-core": "6.5.2", + "babel-eslint": "5.0.0", + "babel-loader": "6.2.3", + "babel-polyfill": "6.5.0", + "babel-preset-es2015": "6.5.0", + "bluebird": "3.3.1", + "chai": "3.5.0", + "codacy-coverage": "1.1.3", + "coveralls": "2.11.6", + "istanbul": "0.4.2", + "js-data-adapter-tests": "^1.5.0", + "mocha": "2.4.5", + "source-map-support": "0.4.0", + "standard": "6.0.6", + "webpack": "1.12.13" }, - "peerDependencies": { - "js-data": ">=2.0.0", - "mongodb": ">=1.3.x" + "dependencies": { + "bson": "^0.4.x || ^0.3.x", + "js-data": ">=2.0.0 <3", + "mongodb": ">=1.3.x", + "mout": "0.11.1" } } diff --git a/src/index.js b/src/index.js index 37d67a5..7baee4e 100644 --- a/src/index.js +++ b/src/index.js @@ -1,262 +1,264 @@ -let mongodb = require('mongodb'); -let MongoClient = mongodb.MongoClient; -let bson = require('bson'); -let map = require('mout/array/map'); -let ObjectID = bson.ObjectID; -let JSData = require('js-data'); -let underscore = require('mout/string/underscore'); -let unique = require('mout/array/unique'); -let { DSUtils } = JSData; - -let reserved = [ +const mongodb = require('mongodb') +const MongoClient = mongodb.MongoClient +const bson = require('bson') +const map = require('mout/array/map') +const ObjectID = bson.ObjectID +const JSData = require('js-data') +const underscore = require('mout/string/underscore') +const unique = require('mout/array/unique') +const { DSUtils } = JSData + +const reserved = [ 'orderBy', 'sort', 'limit', 'offset', 'skip', 'where' -]; +] class Defaults { } -Defaults.prototype.translateId = true; +Defaults.prototype.translateId = true class DSMongoDBAdapter { - constructor(uri) { - if (typeof uri === 'string') { - uri = {uri}; + constructor (opts) { + if (typeof opts === 'string') { + opts = { uri: opts } } - this.defaults = new Defaults(); - DSUtils.deepMixIn(this.defaults, uri); - this.client = new DSUtils.Promise((resolve, reject) => { - MongoClient.connect(uri.uri, (err, db) => err ? reject(err) : resolve(db)); - }); + opts.uri || (opts.uri = 'mongodb://localhost:27017') + this.defaults = new Defaults() + DSUtils.deepMixIn(this.defaults, opts) + this.client = new DSUtils.Promise(function (resolve, reject) { + MongoClient.connect(opts.uri, function (err, db) { + return err ? reject(err) : resolve(db) + }) + }) } - getClient() { - return this.client; + getClient () { + return this.client } - getQuery(resourceConfig, params) { - params = params || {}; - params.where = params.where || {}; + getQuery (resourceConfig, params) { + params = params || {} + params.where = params.where || {} - DSUtils.forEach(DSUtils.keys(params), k => { - let v = params[k]; - if (!DSUtils.contains(reserved, k)) { + DSUtils.forOwn(params, function (v, k) { + if (reserved.indexOf(k) === -1) { if (DSUtils.isObject(v)) { - params.where[k] = v; + params.where[k] = v } else { params.where[k] = { '==': v - }; + } } - delete params[k]; + delete params[k] } - }); + }) - let query = {}; + let query = {} - if (!DSUtils.isEmpty(params.where)) { - DSUtils.forOwn(params.where, (criteria, field) => { + if (Object.keys(params.where).length) { + DSUtils.forOwn(params.where, function (criteria, field) { if (!DSUtils.isObject(criteria)) { params.where[field] = { '==': criteria - }; + } } - DSUtils.forOwn(criteria, (v, op) => { + DSUtils.forOwn(criteria, function (v, op) { if (op === '==' || op === '===') { - query[field] = v; + query[field] = v } else if (op === '!=' || op === '!==') { - query[field] = query[field] || {}; - query[field].$ne = v; + query[field] = query[field] || {} + query[field].$ne = v } else if (op === '>') { - query[field] = query[field] || {}; - query[field].$gt = v; + query[field] = query[field] || {} + query[field].$gt = v } else if (op === '>=') { - query[field] = query[field] || {}; - query[field].$gte = v; + query[field] = query[field] || {} + query[field].$gte = v } else if (op === '<') { - query[field] = query[field] || {}; - query[field].$lt = v; + query[field] = query[field] || {} + query[field].$lt = v } else if (op === '<=') { - query[field] = query[field] || {}; - query[field].$lte = v; + query[field] = query[field] || {} + query[field].$lte = v } else if (op === 'in') { - query[field] = query[field] || {}; - query[field].$in = v; + query[field] = query[field] || {} + query[field].$in = v } else if (op === 'notIn') { - query[field] = query[field] || {}; - query[field].$nin = v; + query[field] = query[field] || {} + query[field].$nin = v } else if (op === '|==' || op === '|===') { - query.$or = query.$or || []; - let orEqQuery = {}; - orEqQuery[field] = v; - query.$or.push(orEqQuery); + query.$or = query.$or || [] + let orEqQuery = {} + orEqQuery[field] = v + query.$or.push(orEqQuery) } else if (op === '|!=' || op === '|!==') { - query.$or = query.$or || []; - let orNeQuery = {}; + query.$or = query.$or || [] + let orNeQuery = {} orNeQuery[field] = { '$ne': v - }; - query.$or.push(orNeQuery); + } + query.$or.push(orNeQuery) } else if (op === '|>') { - query.$or = query.$or || []; - let orGtQuery = {}; + query.$or = query.$or || [] + let orGtQuery = {} orGtQuery[field] = { '$gt': v - }; - query.$or.push(orGtQuery); + } + query.$or.push(orGtQuery) } else if (op === '|>=') { - query.$or = query.$or || []; - let orGteQuery = {}; + query.$or = query.$or || [] + let orGteQuery = {} orGteQuery[field] = { '$gte': v - }; - query.$or.push(orGteQuery); + } + query.$or.push(orGteQuery) } else if (op === '|<') { - query.$or = query.$or || []; - let orLtQuery = {}; + query.$or = query.$or || [] + let orLtQuery = {} orLtQuery[field] = { '$lt': v - }; - query.$or.push(orLtQuery); + } + query.$or.push(orLtQuery) } else if (op === '|<=') { - query.$or = query.$or || []; - let orLteQuery = {}; + query.$or = query.$or || [] + let orLteQuery = {} orLteQuery[field] = { '$lte': v - }; - query.$or.push(orLteQuery); + } + query.$or.push(orLteQuery) } else if (op === '|in') { - query.$or = query.$or || []; - let orInQuery = {}; + query.$or = query.$or || [] + let orInQuery = {} orInQuery[field] = { '$in': v - }; - query.$or.push(orInQuery); + } + query.$or.push(orInQuery) } else if (op === '|notIn') { - query.$or = query.$or || []; - let orNinQuery = {}; + query.$or = query.$or || [] + let orNinQuery = {} orNinQuery[field] = { '$nin': v - }; - query.$or.push(orNinQuery); + } + query.$or.push(orNinQuery) } - }); - }); + }) + }) } - return query; + return query } - getQueryOptions(resourceConfig, params) { - params = params || {}; - params.orderBy = params.orderBy || params.sort; - params.skip = params.skip || params.offset; + getQueryOptions (resourceConfig, params) { + params = params || {} + params.orderBy = params.orderBy || params.sort + params.skip = params.skip || params.offset - let queryOptions = {}; + let queryOptions = {} if (params.orderBy) { if (DSUtils.isString(params.orderBy)) { params.orderBy = [ [params.orderBy, 'asc'] - ]; + ] } for (var i = 0; i < params.orderBy.length; i++) { if (DSUtils.isString(params.orderBy[i])) { - params.orderBy[i] = [params.orderBy[i], 'asc']; + params.orderBy[i] = [params.orderBy[i], 'asc'] } } - queryOptions.sort = params.orderBy; + queryOptions.sort = params.orderBy } if (params.skip) { - queryOptions.skip = params.skip; + queryOptions.skip = +params.skip } if (params.limit) { - queryOptions.limit = params.limit; + queryOptions.limit = +params.limit } - return queryOptions; + return queryOptions } - translateId(r, options) { - options = options || {}; + translateId (r, options) { + options = options || {} if (typeof options.translateId === 'boolean' ? options.translateId : this.defaults.translateId) { if (Array.isArray(r)) { - r.forEach(_r => { - let __id = _r._id ? _r._id.toString() : _r._id; - _r._id = typeof __id === 'string' ? __id : _r._id; - }); + r.forEach((_r) => { + let __id = _r._id ? _r._id.toString() : _r._id + _r._id = typeof __id === 'string' ? __id : _r._id + }) } else if (DSUtils.isObject(r)) { - let __id = r._id ? r._id.toString() : r._id; - r._id = typeof __id === 'string' ? __id : r._id; + let __id = r._id ? r._id.toString() : r._id + r._id = typeof __id === 'string' ? __id : r._id } } - return r; + return r } - origify(options) { - options = options || {}; + origify (options) { + options = options || {} if (typeof options.orig === 'function') { - return options.orig(); + return options.orig() } - return options; + return options } - find(resourceConfig, id, options) { - let instance; - options = this.origify(options); - options.with = options.with || []; - return this.getClient().then(client => { + find (resourceConfig, id, options) { + let instance + options = this.origify(options) + options.with = options.with || [] + return this.getClient().then((client) => { return new DSUtils.Promise((resolve, reject) => { - let params = {}; - params[resourceConfig.idAttribute] = id; + let params = {} + params[resourceConfig.idAttribute] = id if (resourceConfig.idAttribute === '_id' && typeof id === 'string' && ObjectID.isValid(id)) { - params[resourceConfig.idAttribute] = ObjectID.createFromHexString(id); + params[resourceConfig.idAttribute] = ObjectID.createFromHexString(id) } - options.fields = options.fields || {}; + options.fields = options.fields || {} client.collection(resourceConfig.table || underscore(resourceConfig.name)).findOne(params, options, (err, r) => { if (err) { - reject(err); + reject(err) } else if (!r) { - reject(new Error('Not Found!')); + reject(new Error('Not Found!')) } else { - resolve(this.translateId(r, options)); + resolve(this.translateId(r, options)) } - }); - }); - }).then(_instance => { - instance = _instance; - let tasks = []; - - DSUtils.forEach(resourceConfig.relationList, def => { - let relationName = def.relation; - let relationDef = resourceConfig.getResource(relationName); - let containedName = null; + }) + }) + }).then((_instance) => { + instance = _instance + let tasks = [] + + DSUtils.forEach(resourceConfig.relationList, (def) => { + let relationName = def.relation + let relationDef = resourceConfig.getResource(relationName) + let containedName = null if (DSUtils.contains(options.with, relationName)) { - containedName = relationName; + containedName = relationName } else if (DSUtils.contains(options.with, def.localField)) { - containedName = def.localField; + containedName = def.localField } if (containedName) { - let __options = DSUtils.deepMixIn({}, options.orig ? options.orig() : options); - __options.with = options.with.slice(); - __options = DSUtils._(relationDef, __options); - DSUtils.remove(__options.with, containedName); + let __options = DSUtils.deepMixIn({}, options.orig ? options.orig() : options) + __options.with = options.with.slice() + __options = DSUtils._(relationDef, __options) + DSUtils.remove(__options.with, containedName) DSUtils.forEach(__options.with, (relation, i) => { if (relation && relation.indexOf(containedName) === 0 && relation.length >= containedName.length && relation[containedName.length] === '.') { - __options.with[i] = relation.substr(containedName.length + 1); + __options.with[i] = relation.substr(containedName.length + 1) } else { - __options.with[i] = ''; + __options.with[i] = '' } - }); + }) - let task; + let task if ((def.type === 'hasOne' || def.type === 'hasMany') && def.foreignKey) { task = this.findAll(resourceConfig.getResource(relationName), { @@ -265,288 +267,288 @@ class DSMongoDBAdapter { '==': instance[resourceConfig.idAttribute] } } - }, __options).then(relatedItems => { + }, __options).then((relatedItems) => { if (def.type === 'hasOne' && relatedItems.length) { - DSUtils.set(instance, def.localField, relatedItems[0]); + DSUtils.set(instance, def.localField, relatedItems[0]) } else { - DSUtils.set(instance, def.localField, relatedItems); + DSUtils.set(instance, def.localField, relatedItems) } - return relatedItems; - }); + return relatedItems + }) } else if (def.type === 'hasMany' && def.localKeys) { - let localKeys = []; - let itemKeys = instance[def.localKeys] || []; - itemKeys = Array.isArray(itemKeys) ? itemKeys : DSUtils.keys(itemKeys); - localKeys = localKeys.concat(itemKeys || []); + let localKeys = [] + let itemKeys = instance[def.localKeys] || [] + itemKeys = Array.isArray(itemKeys) ? itemKeys : DSUtils.keys(itemKeys) + localKeys = localKeys.concat(itemKeys || []) task = this.findAll(resourceConfig.getResource(relationName), { where: { [relationDef.idAttribute]: { - 'in': map(DSUtils.filter(unique(localKeys), x => x), x => new ObjectID(x)) + 'in': map(DSUtils.filter(unique(localKeys), (x) => x), (x) => new ObjectID(x)) } } - }, __options).then(relatedItems => { - DSUtils.set(instance, def.localField, relatedItems); - return relatedItems; - }); + }, __options).then((relatedItems) => { + DSUtils.set(instance, def.localField, relatedItems) + return relatedItems + }) } else if (def.type === 'belongsTo' || (def.type === 'hasOne' && def.localKey)) { - task = this.find(resourceConfig.getResource(relationName), DSUtils.get(instance, def.localKey), __options).then(relatedItem => { - DSUtils.set(instance, def.localField, relatedItem); - return relatedItem; - }); + task = this.find(resourceConfig.getResource(relationName), DSUtils.get(instance, def.localKey), __options).then((relatedItem) => { + DSUtils.set(instance, def.localField, relatedItem) + return relatedItem + }) } if (task) { - tasks.push(task); + tasks.push(task) } } - }); + }) - return DSUtils.Promise.all(tasks); - }).then(() => instance); + return DSUtils.Promise.all(tasks) + }).then(() => instance) } - findAll(resourceConfig, params, options) { - let items = null; - options = this.origify(options ? DSUtils.copy(options) : {}); - options.with = options.with || []; - DSUtils.deepMixIn(options, this.getQueryOptions(resourceConfig, params)); - let query = this.getQuery(resourceConfig, params); - return this.getClient().then(client => { + findAll (resourceConfig, params, options) { + let items = null + options = this.origify(options ? DSUtils.copy(options) : {}) + options.with = options.with || [] + DSUtils.deepMixIn(options, this.getQueryOptions(resourceConfig, params)) + let query = this.getQuery(resourceConfig, params) + return this.getClient().then((client) => { return new DSUtils.Promise((resolve, reject) => { - options.fields = options.fields || {}; + options.fields = options.fields || {} client.collection(resourceConfig.table || underscore(resourceConfig.name)).find(query, options).toArray((err, r) => { if (err) { - reject(err); + reject(err) } else { - resolve(this.translateId(r, options)); + resolve(this.translateId(r, options)) } - }); - }); - }).then(_items => { - items = _items; - let tasks = []; - DSUtils.forEach(resourceConfig.relationList, def => { - let relationName = def.relation; - let relationDef = resourceConfig.getResource(relationName); - let containedName = null; + }) + }) + }).then((_items) => { + items = _items + let tasks = [] + DSUtils.forEach(resourceConfig.relationList, (def) => { + let relationName = def.relation + let relationDef = resourceConfig.getResource(relationName) + let containedName = null if (DSUtils.contains(options.with, relationName)) { - containedName = relationName; + containedName = relationName } else if (DSUtils.contains(options.with, def.localField)) { - containedName = def.localField; + containedName = def.localField } if (containedName) { - let __options = DSUtils.deepMixIn({}, options.orig ? options.orig() : options); - __options.with = options.with.slice(); - __options = DSUtils._(relationDef, __options); - DSUtils.remove(__options.with, containedName); + let __options = DSUtils.deepMixIn({}, options.orig ? options.orig() : options) + __options.with = options.with.slice() + __options = DSUtils._(relationDef, __options) + DSUtils.remove(__options.with, containedName) DSUtils.forEach(__options.with, (relation, i) => { if (relation && relation.indexOf(containedName) === 0 && relation.length >= containedName.length && relation[containedName.length] === '.') { - __options.with[i] = relation.substr(containedName.length + 1); + __options.with[i] = relation.substr(containedName.length + 1) } else { - __options.with[i] = ''; + __options.with[i] = '' } - }); + }) - let task; + let task if ((def.type === 'hasOne' || def.type === 'hasMany') && def.foreignKey) { task = this.findAll(resourceConfig.getResource(relationName), { where: { [def.foreignKey]: { - 'in': DSUtils.filter(map(items, item => DSUtils.get(item, resourceConfig.idAttribute)), x => x) + 'in': DSUtils.filter(map(items, (item) => DSUtils.get(item, resourceConfig.idAttribute)), (x) => x) } } - }, __options).then(relatedItems => { - DSUtils.forEach(items, item => { - let attached = []; - DSUtils.forEach(relatedItems, relatedItem => { + }, __options).then((relatedItems) => { + DSUtils.forEach(items, (item) => { + let attached = [] + DSUtils.forEach(relatedItems, (relatedItem) => { if (DSUtils.get(relatedItem, def.foreignKey) === item[resourceConfig.idAttribute]) { - attached.push(relatedItem); + attached.push(relatedItem) } - }); + }) if (def.type === 'hasOne' && attached.length) { - DSUtils.set(item, def.localField, attached[0]); + DSUtils.set(item, def.localField, attached[0]) } else { - DSUtils.set(item, def.localField, attached); + DSUtils.set(item, def.localField, attached) } - }); - return relatedItems; - }); + }) + return relatedItems + }) } else if (def.type === 'hasMany' && def.localKeys) { - let localKeys = []; - DSUtils.forEach(items, item => { - let itemKeys = item[def.localKeys] || []; - itemKeys = Array.isArray(itemKeys) ? itemKeys : DSUtils.keys(itemKeys); - localKeys = localKeys.concat(itemKeys || []); - }); + let localKeys = [] + DSUtils.forEach(items, (item) => { + let itemKeys = item[def.localKeys] || [] + itemKeys = Array.isArray(itemKeys) ? itemKeys : DSUtils.keys(itemKeys) + localKeys = localKeys.concat(itemKeys || []) + }) task = this.findAll(resourceConfig.getResource(relationName), { where: { [relationDef.idAttribute]: { - 'in': map(DSUtils.filter(unique(localKeys), x => x), x => new ObjectID(x)) + 'in': map(DSUtils.filter(unique(localKeys), (x) => x), (x) => new ObjectID(x)) } } - }, __options).then(relatedItems => { - DSUtils.forEach(items, item => { - let attached = []; - let itemKeys = item[def.localKeys] || []; - itemKeys = Array.isArray(itemKeys) ? itemKeys : DSUtils.keys(itemKeys); - DSUtils.forEach(relatedItems, relatedItem => { + }, __options).then((relatedItems) => { + DSUtils.forEach(items, (item) => { + let attached = [] + let itemKeys = item[def.localKeys] || [] + itemKeys = Array.isArray(itemKeys) ? itemKeys : DSUtils.keys(itemKeys) + DSUtils.forEach(relatedItems, (relatedItem) => { if (itemKeys && DSUtils.contains(itemKeys, relatedItem[relationDef.idAttribute])) { - attached.push(relatedItem); + attached.push(relatedItem) } - }); - DSUtils.set(item, def.localField, attached); - }); - return relatedItems; - }); + }) + DSUtils.set(item, def.localField, attached) + }) + return relatedItems + }) } else if (def.type === 'belongsTo' || (def.type === 'hasOne' && def.localKey)) { task = this.findAll(resourceConfig.getResource(relationName), { where: { [relationDef.idAttribute]: { - 'in': map(DSUtils.filter(map(items, item => DSUtils.get(item, def.localKey)), x => x), x => new ObjectID(x)) + 'in': map(DSUtils.filter(map(items, (item) => DSUtils.get(item, def.localKey)), (x) => x), (x) => new ObjectID(x)) } } - }, __options).then(relatedItems => { - DSUtils.forEach(items, item => { - DSUtils.forEach(relatedItems, relatedItem => { + }, __options).then((relatedItems) => { + DSUtils.forEach(items, (item) => { + DSUtils.forEach(relatedItems, (relatedItem) => { if (relatedItem[relationDef.idAttribute] === item[def.localKey]) { - DSUtils.set(item, def.localField, relatedItem); + DSUtils.set(item, def.localField, relatedItem) } - }); - }); - return relatedItems; - }); + }) + }) + return relatedItems + }) } if (task) { - tasks.push(task); + tasks.push(task) } } - }); - return DSUtils.Promise.all(tasks); - }).then(() => items); + }) + return DSUtils.Promise.all(tasks) + }).then(() => items) } - create(resourceConfig, attrs, options) { - options = this.origify(options); - attrs = DSUtils.removeCircular(DSUtils.omit(attrs, resourceConfig.relationFields || [])); - return this.getClient().then(client => { + create (resourceConfig, attrs, options) { + options = this.origify(options) + attrs = DSUtils.removeCircular(DSUtils.omit(attrs, resourceConfig.relationFields || [])) + return this.getClient().then((client) => { return new DSUtils.Promise((resolve, reject) => { - let collection = client.collection(resourceConfig.table || underscore(resourceConfig.name)); - let method = collection.insertOne ? DSUtils.isArray(attrs) ? 'insertMany' : 'insertOne' : 'insert'; + let collection = client.collection(resourceConfig.table || underscore(resourceConfig.name)) + let method = collection.insertOne ? DSUtils.isArray(attrs) ? 'insertMany' : 'insertOne' : 'insert' collection[method](attrs, options, (err, r) => { if (err) { - reject(err); + reject(err) } else { - r = r.ops ? r.ops : r; - this.translateId(r, options); - resolve(DSUtils.isArray(attrs) ? r : r[0]); + r = r.ops ? r.ops : r + this.translateId(r, options) + resolve(DSUtils.isArray(attrs) ? r : r[0]) } - }); - }); - }); + }) + }) + }) } - update(resourceConfig, id, attrs, options) { - attrs = DSUtils.removeCircular(DSUtils.omit(attrs, resourceConfig.relationFields || [])); - options = this.origify(options); + update (resourceConfig, id, attrs, options) { + attrs = DSUtils.removeCircular(DSUtils.omit(attrs, resourceConfig.relationFields || [])) + options = this.origify(options) return this.find(resourceConfig, id, options).then(() => { - return this.getClient(); - }).then(client => { + return this.getClient() + }).then((client) => { return new DSUtils.Promise((resolve, reject) => { - let params = {}; - params[resourceConfig.idAttribute] = id; + let params = {} + params[resourceConfig.idAttribute] = id if (resourceConfig.idAttribute === '_id' && typeof id === 'string' && ObjectID.isValid(id)) { - params[resourceConfig.idAttribute] = ObjectID.createFromHexString(id); + params[resourceConfig.idAttribute] = ObjectID.createFromHexString(id) } - let collection = client.collection(resourceConfig.table || underscore(resourceConfig.name)); - collection[collection.updateOne ? 'updateOne' : 'update'](params, {$set: attrs}, options, err => { + let collection = client.collection(resourceConfig.table || underscore(resourceConfig.name)) + collection[collection.updateOne ? 'updateOne' : 'update'](params, {$set: attrs}, options, (err) => { if (err) { - reject(err); + reject(err) } else { - resolve(); + resolve() } - }); - }); - }).then(() => this.find(resourceConfig, id, options)); + }) + }) + }).then(() => this.find(resourceConfig, id, options)) } - updateAll(resourceConfig, attrs, params, options) { - let ids = []; - attrs = DSUtils.removeCircular(DSUtils.omit(attrs, resourceConfig.relationFields || [])); - options = this.origify(options ? DSUtils.copy(options) : {}); - let _options = DSUtils.copy(options); - _options.multi = true; - return this.getClient().then(client => { - let queryOptions = this.getQueryOptions(resourceConfig, params); - queryOptions.$set = attrs; - let query = this.getQuery(resourceConfig, params); - return this.findAll(resourceConfig, params, options).then(items => { - ids = map(items, item => { - let id = item[resourceConfig.idAttribute]; + updateAll (resourceConfig, attrs, params, options) { + let ids = [] + attrs = DSUtils.removeCircular(DSUtils.omit(attrs, resourceConfig.relationFields || [])) + options = this.origify(options ? DSUtils.copy(options) : {}) + let _options = DSUtils.copy(options) + _options.multi = true + return this.getClient().then((client) => { + let queryOptions = this.getQueryOptions(resourceConfig, params) + queryOptions.$set = attrs + let query = this.getQuery(resourceConfig, params) + return this.findAll(resourceConfig, params, options).then((items) => { + ids = map(items, (item) => { + let id = item[resourceConfig.idAttribute] if (resourceConfig.idAttribute === '_id' && typeof id === 'string' && ObjectID.isValid(id)) { - return ObjectID.createFromHexString(id); + return ObjectID.createFromHexString(id) } - return id; - }); + return id + }) return new DSUtils.Promise((resolve, reject) => { - let collection = client.collection(resourceConfig.table || underscore(resourceConfig.name)); - collection[collection.updateMany ? 'updateMany' : 'update'](query, queryOptions, _options, err => { + let collection = client.collection(resourceConfig.table || underscore(resourceConfig.name)) + collection[collection.updateMany ? 'updateMany' : 'update'](query, queryOptions, _options, (err) => { if (err) { - reject(err); + reject(err) } else { - resolve(); + resolve() } - }); - }); + }) + }) }).then(() => { - let _params = {}; + let _params = {} _params[resourceConfig.idAttribute] = { 'in': ids - }; - return this.findAll(resourceConfig, _params, options); - }); - }); + } + return this.findAll(resourceConfig, _params, options) + }) + }) } - destroy(resourceConfig, id, options) { - options = this.origify(options); - return this.getClient().then(client => { + destroy (resourceConfig, id, options) { + options = this.origify(options) + return this.getClient().then((client) => { return new DSUtils.Promise((resolve, reject) => { - let params = {}; - params[resourceConfig.idAttribute] = id; + let params = {} + params[resourceConfig.idAttribute] = id if (resourceConfig.idAttribute === '_id' && typeof id === 'string' && ObjectID.isValid(id)) { - params[resourceConfig.idAttribute] = ObjectID.createFromHexString(id); + params[resourceConfig.idAttribute] = ObjectID.createFromHexString(id) } - let collection = client.collection(resourceConfig.table || underscore(resourceConfig.name)); - collection[collection.deleteOne ? 'deleteOne' : 'remove'](params, options, err => { + let collection = client.collection(resourceConfig.table || underscore(resourceConfig.name)) + collection[collection.deleteOne ? 'deleteOne' : 'remove'](params, options, (err) => { if (err) { - reject(err); + reject(err) } else { - resolve(); + resolve() } - }); - }); - }); + }) + }) + }) } - destroyAll(resourceConfig, params, options) { - options = this.origify(options ? DSUtils.copy(options) : {}); - return this.getClient().then(client => { - DSUtils.deepMixIn(options, this.getQueryOptions(resourceConfig, params)); - let query = this.getQuery(resourceConfig, params); + destroyAll (resourceConfig, params, options) { + options = this.origify(options ? DSUtils.copy(options) : {}) + return this.getClient().then((client) => { + DSUtils.deepMixIn(options, this.getQueryOptions(resourceConfig, params)) + let query = this.getQuery(resourceConfig, params) return new DSUtils.Promise((resolve, reject) => { - let collection = client.collection(resourceConfig.table || underscore(resourceConfig.name)); - collection[collection.deleteMany ? 'deleteMany' : 'remove'](query, options, err => { + let collection = client.collection(resourceConfig.table || underscore(resourceConfig.name)) + collection[collection.deleteMany ? 'deleteMany' : 'remove'](query, options, (err) => { if (err) { - reject(err); + reject(err) } else { - resolve(); + resolve() } - }); - }); - }); + }) + }) + }) } } -export default DSMongoDBAdapter; +module.exports = DSMongoDBAdapter diff --git a/test/create.spec.js b/test/create.spec.js deleted file mode 100644 index 7a65ac3..0000000 --- a/test/create.spec.js +++ /dev/null @@ -1,26 +0,0 @@ -describe('DSMongoDBAdapter#create', function () { - it('should create a user in MongoDB', function () { - var id; - return adapter.create(User, {name: 'John'}).then(function (user) { - id = user._id; - assert.equal(user.name, 'John'); - assert.isDefined(user._id); - return adapter.find(User, user._id); - }) - .then(function (user) { - assert.equal(user.name, 'John'); - assert.isDefined(user._id); - assert.equalObjects(user, {_id: id, name: 'John'}); - return adapter.destroy(User, user._id); - }) - .then(function (user) { - assert.isFalse(!!user); - return adapter.find(User, id).catch(function (err) { - assert.equal(err.message, 'Not Found!'); - }); - }).catch(function (err) { - console.log(err); - throw err; - }); - }); -}); diff --git a/test/destroy.spec.js b/test/destroy.spec.js deleted file mode 100644 index f5c0c71..0000000 --- a/test/destroy.spec.js +++ /dev/null @@ -1,16 +0,0 @@ -describe('DSMongoDBAdapter#destroy', function () { - it('should destroy a user from MongoDB', function () { - var id; - return adapter.create(User, {name: 'John'}) - .then(function (user) { - id = user._id; - return adapter.destroy(User, user._id); - }) - .then(function (user) { - assert.isFalse(!!user); - return adapter.find(User, id).catch(function (err) { - assert.equal(err.message, 'Not Found!'); - }); - }); - }); -}); diff --git a/test/find.spec.js b/test/find.spec.js deleted file mode 100644 index 82fc5e9..0000000 --- a/test/find.spec.js +++ /dev/null @@ -1,111 +0,0 @@ -var Promise = require('bluebird'); -describe('DSMongoDBAdapter#find', function () { - it('should find a user by its bson ObjectId hex string', function () { - var id; - - return adapter.findAll(User, { - name: 'John' - }).then(function (users) { - assert.equal(users.length, 0); - return adapter.create(User, {name: 'John'}); - }).then(function (user) { - id = user._id; - return adapter.find(User, id.toString()); - }).then(function (user) { - assert.equalObjects(user, {_id: id, name: 'John'}); - return adapter.destroy(User, id); - }).then(function (destroyedUser) { - assert.isFalse(!!destroyedUser); - }); - }); - - it('should not convert id if it is not a valid bson ObjectId hex string', function () { - var id; - - return adapter.findAll(User, { - name: 'John' - }).then(function (users) { - assert.equal(users.length, 0); - return adapter.create(User, {_id: '1', name: 'John'}); - }).then(function (user) { - id = user._id; - assert.equal(typeof id, 'string'); - return adapter.find(User, id); - }).then(function (user) { - assert.equalObjects(user, {_id: id, name: 'John'}); - return adapter.destroy(User, id); - }).then(function (destroyedUser) { - assert.isFalse(!!destroyedUser); - }); - }); - it('should find a user with relations', function () { - var id, id2, _user, _post, _comments; - return adapter.create(User, {name: 'John'}) - .then(function (user) { - _user = user; - id = user._id; - assert.equal(user.name, 'John'); - assert.isDefined(user._id); - return adapter.find(User, user._id); - }) - .then(function (user) { - assert.equal(user.name, 'John'); - assert.isDefined(user._id); - assert.equalObjects(user, {_id: id, name: 'John'}); - return adapter.create(Post, { - content: 'test', - userId: user._id - }); - }) - .then(function (post) { - _post = post; - id2 = post._id; - assert.equal(post.content, 'test'); - assert.isDefined(post._id); - assert.isDefined(post.userId); - return Promise.all([ - adapter.create(Comment, { - content: 'test2', - postId: post._id, - userId: _user._id - }), - adapter.create(Comment, { - content: 'test3', - postId: post._id, - userId: _user._id - }) - ]); - }) - .then(function (comments) { - _comments = comments; - _comments.sort(function (a, b) { - return a.content > b.content; - }); - return adapter.find(Post, _post._id, {'with': ['user', 'comment']}); - }) - .then(function (post) { - post.comments.sort(function (a, b) { - return a.content > b.content; - }); - assert.equalObjects(post.user, _user); - assert.equalObjects(post.comments, _comments); - return adapter.destroyAll(Comment); - }) - .then(function () { - return adapter.destroy(Post, id2); - }) - .then(function () { - return adapter.destroy(User, id); - }) - .then(function (user) { - assert.isFalse(!!user); - return adapter.find(User, id); - }) - .then(function () { - throw new Error('Should not have reached here!'); - }) - .catch(function (err) { - assert.equal(err.message, 'Not Found!'); - }); - }); -}); diff --git a/test/find.test.js b/test/find.test.js new file mode 100644 index 0000000..9786cd0 --- /dev/null +++ b/test/find.test.js @@ -0,0 +1,41 @@ +describe('MongoDBAdapter#find', function () { + var adapter, User + + beforeEach(function () { + adapter = this.$$adapter + User = this.$$User + }) + + it('should find a user by its bson ObjectId hex string', function () { + var id + + return adapter.findAll(User, { + name: 'John' + }).then(function (users) { + assert.equal(users.length, 0) + return adapter.create(User, {name: 'John'}) + }).then(function (user) { + id = user._id + return adapter.find(User, id.toString()) + }).then(function (user) { + assert.objectsEqual(user, {_id: id, name: 'John'}) + }) + }) + + it('should not convert id if it is not a valid bson ObjectId hex string', function () { + var id + + return adapter.findAll(User, { + name: 'John' + }).then(function (users) { + assert.equal(users.length, 0) + return adapter.create(User, { _id: '1', name: 'John' }) + }).then(function (user) { + id = user._id + assert.equal(typeof id, 'string') + return adapter.find(User, id) + }).then(function (user) { + assert.objectsEqual(user, { _id: id, name: 'John' }) + }) + }) +}) diff --git a/test/findAll.spec.js b/test/findAll.spec.js deleted file mode 100644 index 9f48500..0000000 --- a/test/findAll.spec.js +++ /dev/null @@ -1,129 +0,0 @@ -var Promise = require('bluebird'); -describe('DSMongoDBAdapter#findAll', function () { - it('should filter users', function () { - var id; - - return adapter.findAll(User, { - age: 30 - }).then(function (users) { - assert.equal(users.length, 0); - return adapter.create(User, {name: 'John'}); - }).then(function (user) { - id = user._id; - return adapter.findAll(User, { - name: 'John' - }); - }).then(function (users) { - assert.equal(users.length, 1); - assert.equalObjects(users[0], {_id: id, name: 'John'}); - return adapter.destroy(User, id); - }).then(function (destroyedUser) { - assert.isFalse(!!destroyedUser); - }); - }); - it('should filter users using the "in" operator', function () { - var id; - - return adapter.findAll(User, { - where: { - age: { - 'in': [30] - } - } - }).then(function (users) { - assert.equal(users.length, 0); - return adapter.create(User, {name: 'John'}); - }).then(function (user) { - id = user._id; - return adapter.findAll(User, { - name: 'John' - }); - }).then(function (users) { - assert.equal(users.length, 1); - assert.equalObjects(users[0], {_id: id, name: 'John'}); - return adapter.destroy(User, id); - }).then(function (destroyedUser) { - assert.isFalse(!!destroyedUser); - }); - }); - it('should load belongsTo relations', function () { - return adapter.create(Profile, { - email: 'foo@test.com' - }).then(function (profile) { - return Promise.all([ - adapter.create(User, {name: 'John', profileId: profile._id}).then(function (user) { - return adapter.create(Post, {content: 'foo', userId: user._id}); - }), - adapter.create(User, {name: 'Sally'}).then(function (user) { - return adapter.create(Post, {content: 'bar', userId: user._id}); - }) - ]) - }) - .spread(function (post1, post2) { - return Promise.all([ - adapter.create(Comment, { - content: 'test2', - postId: post1._id, - userId: post1.userId - }), - adapter.create(Comment, { - content: 'test3', - postId: post2._id, - userId: post2.userId - }) - ]); - }) - .then(function () { - return adapter.findAll(Comment, {}, {'with': ['user', 'user.profile', 'post', 'post.user']}); - }) - .then(function (comments) { - assert.isDefined(comments[0].post); - assert.isDefined(comments[0].post.user); - assert.isDefined(comments[0].user); - assert.isDefined(comments[0].user.profile || comments[1].user.profile); - assert.isDefined(comments[1].post); - assert.isDefined(comments[1].post.user); - assert.isDefined(comments[1].user); - }); - }); - it('should load hasMany and belongsTo relations', function () { - return adapter.create(Profile, { - email: 'foo@test.com' - }).then(function (profile) { - return Promise.all([ - adapter.create(User, {name: 'John', profileId: profile._id}).then(function (user) { - return adapter.create(Post, {content: 'foo', userId: user._id}); - }), - adapter.create(User, {name: 'Sally'}).then(function (user) { - return adapter.create(Post, {content: 'bar', userId: user._id}); - }) - ]); - }) - .spread(function (post1, post2) { - return Promise.all([ - adapter.create(Comment, { - content: 'test2', - postId: post1._id, - userId: post1.userId - }), - adapter.create(Comment, { - content: 'test3', - postId: post2._id, - userId: post2.userId - }) - ]); - }) - .then(function () { - return adapter.findAll(Post, {}, {'with': ['user', 'comment', 'comment.user', 'comment.user.profile']}); - }) - .then(function (posts) { - assert.isDefined(posts[0].comments); - assert.isDefined(posts[0].comments[0].user); - assert.isDefined(posts[0].comments[0].user.profile || posts[1].comments[0].user.profile); - assert.isDefined(posts[0].user); - assert.isDefined(posts[1].comments); - assert.isDefined(posts[1].comments[0].user); - assert.isDefined(posts[1].user); - }); - }); -}); diff --git a/test/store/create.spec.js b/test/store/create.spec.js deleted file mode 100644 index bdd9a71..0000000 --- a/test/store/create.spec.js +++ /dev/null @@ -1,23 +0,0 @@ -describe('DS#create', function () { - it('should create a user in MongoDB and inject it into the store', function () { - var id; - return User.create({name: 'John'}, {cacheResponse: true}).then(function (user) { - id = user._id; - assert.equal(user.name, 'John'); - assert.isDefined(user._id); - assert.isTrue(user === User.get(user._id)); - return User.find(user._id, {bypassCache: true, cacheResponse: true}); - }) - .then(function (user) { - assert.equal(user.name, 'John'); - assert.isDefined(user._id); - assert.strictEqual(user, User.get(user._id)); - return User.destroy(user._id); - }) - .then(function () { - return User.find(id, {bypassCache: true}).catch(function (err) { - assert.equal(err.message, 'Not Found!'); - }); - }); - }); -}); diff --git a/test/store/destroy.spec.js b/test/store/destroy.spec.js deleted file mode 100644 index 064706c..0000000 --- a/test/store/destroy.spec.js +++ /dev/null @@ -1,19 +0,0 @@ -describe('DS#destroy', function () { - it('should destroy a user from MongoDB and eject it from the store', function () { - var id; - return User.create({name: 'John'}, {cacheResponse: true}) - .then(function (user) { - id = user._id; - assert.equal(user.name, 'John'); - assert.isDefined(user._id); - assert.isTrue(user === User.get(user._id)); - return User.destroy(user._id); - }) - .then(function () { - assert.isUndefined(User.get(id)); - return User.find(id, {bypassCache: true}).catch(function (err) { - assert.equal(err.message, 'Not Found!'); - }); - }); - }); -}); diff --git a/test/store/update.spec.js b/test/store/update.spec.js deleted file mode 100644 index 05c3858..0000000 --- a/test/store/update.spec.js +++ /dev/null @@ -1,37 +0,0 @@ -describe('DS#update', function () { - it('should update a user in MongoDB and inject the updated item into the store', function () { - var id; - return User.create({name: 'John'}, {cacheResponse: true}) - .then(function (user) { - id = user._id; - assert.equal(user.name, 'John'); - assert.isDefined(user._id); - assert.isTrue(user === User.get(user._id)); - return User.find(user._id, {bypassCache: true, cacheResponse: true}); - }) - .then(function (foundUser) { - assert.equal(foundUser.name, 'John'); - assert.isTrue(foundUser === User.get(id)); - assert.isDefined(foundUser._id); - return User.update(foundUser._id, {name: 'Johnny'}, {cacheResponse: true}); - }) - .then(function (updatedUser) { - assert.equal(updatedUser.name, 'Johnny'); - assert.isTrue(updatedUser === User.get(id)); - assert.isDefined(updatedUser._id); - return User.find(updatedUser._id, {bypassCache: true, cacheResponse: true}); - }) - .then(function (foundUser) { - assert.equal(foundUser.name, 'Johnny'); - assert.isTrue(foundUser === User.get(id)); - assert.isDefined(foundUser._id); - return User.destroy(foundUser._id); - }) - .then(function () { - return User.find(id, {bypassCache: true}).catch(function (err) { - assert.equal(err.message, 'Not Found!'); - assert.isUndefined(User.get(id)); - }); - }); - }); -}); diff --git a/test/update.spec.js b/test/update.spec.js deleted file mode 100644 index 55326a3..0000000 --- a/test/update.spec.js +++ /dev/null @@ -1,36 +0,0 @@ -describe('DSMongoDBAdapter#update', function () { - it('should update a user in MongoDB', function () { - var id; - return adapter.create(User, {name: 'John'}) - .then(function (user) { - id = user._id; - assert.equal(user.name, 'John'); - assert.isDefined(user._id); - return adapter.find(User, user._id); - }) - .then(function (foundUser) { - assert.equal(foundUser.name, 'John'); - assert.isDefined(foundUser._id); - assert.equalObjects(foundUser, {_id: id, name: 'John'}); - return adapter.update(User, foundUser._id, {name: 'Johnny'}); - }) - .then(function (updatedUser) { - assert.equal(updatedUser.name, 'Johnny'); - assert.isDefined(updatedUser._id); - assert.equalObjects(updatedUser, {_id: id, name: 'Johnny'}); - return adapter.find(User, updatedUser._id); - }) - .then(function (foundUser) { - assert.equal(foundUser.name, 'Johnny'); - assert.isDefined(foundUser._id); - assert.equalObjects(foundUser, {_id: id, name: 'Johnny'}); - return adapter.destroy(User, foundUser._id); - }) - .then(function (user) { - assert.isFalse(!!user); - return adapter.find(User, id).catch(function (err) { - assert.equal(err.message, 'Not Found!'); - }); - }); - }); -}); diff --git a/test/updateAll.spec.js b/test/updateAll.spec.js deleted file mode 100644 index e6d3dea..0000000 --- a/test/updateAll.spec.js +++ /dev/null @@ -1,47 +0,0 @@ -describe('DSMongoDBAdapter#updateAll', function () { - it('should update all items', function () { - var id, id2; - return adapter.create(User, {name: 'John', age: 20}) - .then(function (user) { - id = user._id; - return adapter.create(User, {name: 'John', age: 30}); - }).then(function (user) { - id2 = user._id; - return adapter.findAll(User, { - name: 'John' - }); - }).then(function (users) { - users.sort(function (a, b) { - return a.age - b.age; - }); - assert.equalObjects(users, [{_id: id, name: 'John', age: 20}, {_id: id2, name: 'John', age: 30}]); - return adapter.updateAll(User, { - name: 'Johnny' - }, { - name: 'John' - }); - }).then(function (users) { - users.sort(function (a, b) { - return a.age - b.age; - }); - assert.equalObjects(users, [{_id: id, name: 'Johnny', age: 20}, {_id: id2, name: 'Johnny', age: 30}]); - return adapter.findAll(User, { - name: 'John' - }); - }).then(function (users) { - assert.equalObjects(users, []); - assert.equal(users.length, 0); - return adapter.findAll(User, { - name: 'Johnny' - }); - }).then(function (users) { - users.sort(function (a, b) { - return a.age - b.age; - }); - assert.equalObjects(users, [{_id: id, name: 'Johnny', age: 20}, {_id: id2, name: 'Johnny', age: 30}]); - return adapter.destroyAll(User); - }).then(function (destroyedUser) { - assert.isFalse(!!destroyedUser); - }); - }); -}); diff --git a/webpack.config.js b/webpack.config.js new file mode 100644 index 0000000..11cab1c --- /dev/null +++ b/webpack.config.js @@ -0,0 +1,29 @@ +var path = require('path') + +module.exports = { + devtool: 'source-map', + entry: './src/index.js', + output: { + filename: './dist/js-data-mongodb.js', + libraryTarget: 'commonjs2' + }, + externals: [ + 'mout/string/underscore', + 'mout/array/unique', + 'mout/array/map', + 'js-data', + 'mongodb', + 'bson' + ], + module: { + loaders: [ + { + loader: 'babel-loader', + include: [ + path.resolve(__dirname, 'src') + ], + test: /\.js$/ + } + ] + } +} From af5c2dc0ff1b72a1f2a82ce1d09e9c4f7d773d28 Mon Sep 17 00:00:00 2001 From: Jason Dobry Date: Fri, 19 Feb 2016 18:03:33 -0800 Subject: [PATCH 02/36] Fixes #12 --- .babelrc | 2 +- .npmignore | 6 +- CHANGELOG.md | 14 + conf.json | 23 + dist/js-data-mongodb.js | 1588 ++++++++++++++++++++--------------- dist/js-data-mongodb.js.map | 2 +- package.json | 16 +- rollup.config.js | 7 + scripts/cleanup.js | 25 + src/index.js | 886 ++++++++++++------- webpack.config.js | 29 - 11 files changed, 1571 insertions(+), 1027 deletions(-) create mode 100644 conf.json create mode 100644 rollup.config.js create mode 100644 scripts/cleanup.js delete mode 100644 webpack.config.js diff --git a/.babelrc b/.babelrc index c13c5f6..1d9cdd5 100644 --- a/.babelrc +++ b/.babelrc @@ -1,3 +1,3 @@ { - "presets": ["es2015"] + "presets": ["es2015-rollup"] } diff --git a/.npmignore b/.npmignore index 765fe66..4f853e9 100644 --- a/.npmignore +++ b/.npmignore @@ -34,5 +34,7 @@ data/ doc/ test/ .babelrc -webpack.config.js -circle.yml \ No newline at end of file +mocha.start.js +rollup.config.js +circle.yml +conf.json diff --git a/CHANGELOG.md b/CHANGELOG.md index 86cfc41..66e006b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,17 @@ +##### 0.7.0 - 19 February 2016 + +###### Backwards compatible API changes +- Decomposed eager loading functionality into overridable methods for greater flexibility + - New methods: loadHasMany, loadBelongsTo, loadHasOne, makeBelongsToForeignKey, makeHasManyForeignKey, toObjectID + - Example use case: Override makeBelongsToForeignKey because your foreignKeys are saved as ObjectIDs, but the default is to assume they are plain a string/number + +###### Backwards compatible bug fixes +- #12 - eager loading relations doesn't check for ObjectID + +###### Other +- Added some JSDoc comments +- Cleaned up some code style + ##### 0.6.0 - 18 February 2016 - Upgraded dependencies diff --git a/conf.json b/conf.json new file mode 100644 index 0000000..df16328 --- /dev/null +++ b/conf.json @@ -0,0 +1,23 @@ + { + "source": { + "includePattern": ".*js$" + }, + "plugins": ["plugins/markdown"], + "opts": { + "template": "./node_modules/ink-docstrap/template", + "destination": "./doc/", + "recurse": true, + "verbose": true, + "readme": "./README.md", + "package": "./package.json" + }, + "templates": { + "theme": "lumen", + "systemName": "js-data-mongodb", + "copyright": "js-data-mongodb Copyright © 2014-2016 Jason Dobry", + "outputSourceFiles": true, + "syntaxTheme": "dark", + "linenums": true, + "footer": "
Back to js-data.io
" + } +} diff --git a/dist/js-data-mongodb.js b/dist/js-data-mongodb.js index 17400de..0b5abbe 100644 --- a/dist/js-data-mongodb.js +++ b/dist/js-data-mongodb.js @@ -1,691 +1,899 @@ -module.exports = -/******/ (function(modules) { // webpackBootstrap -/******/ // The module cache -/******/ var installedModules = {}; -/******/ -/******/ // The require function -/******/ function __webpack_require__(moduleId) { -/******/ -/******/ // Check if module is in cache -/******/ if(installedModules[moduleId]) -/******/ return installedModules[moduleId].exports; -/******/ -/******/ // Create a new module (and put it into the cache) -/******/ var module = installedModules[moduleId] = { -/******/ exports: {}, -/******/ id: moduleId, -/******/ loaded: false -/******/ }; -/******/ -/******/ // Execute the module function -/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__); -/******/ -/******/ // Flag the module as loaded -/******/ module.loaded = true; -/******/ -/******/ // Return the exports of the module -/******/ return module.exports; -/******/ } -/******/ -/******/ -/******/ // expose the modules object (__webpack_modules__) -/******/ __webpack_require__.m = modules; -/******/ -/******/ // expose the module cache -/******/ __webpack_require__.c = installedModules; -/******/ -/******/ // __webpack_public_path__ -/******/ __webpack_require__.p = ""; -/******/ -/******/ // Load entry module and return exports -/******/ return __webpack_require__(0); -/******/ }) -/************************************************************************/ -/******/ ([ -/* 0 */ -/***/ function(module, exports, __webpack_require__) { - - 'use strict'; - - var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); - - function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } - - function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } - - var mongodb = __webpack_require__(1); - var MongoClient = mongodb.MongoClient; - var bson = __webpack_require__(2); - var map = __webpack_require__(3); - var ObjectID = bson.ObjectID; - var JSData = __webpack_require__(4); - var underscore = __webpack_require__(5); - var unique = __webpack_require__(6); - var DSUtils = JSData.DSUtils; - - - var reserved = ['orderBy', 'sort', 'limit', 'offset', 'skip', 'where']; - - var Defaults = function Defaults() { - _classCallCheck(this, Defaults); - }; - - Defaults.prototype.translateId = true; - - var DSMongoDBAdapter = function () { - function DSMongoDBAdapter(opts) { - _classCallCheck(this, DSMongoDBAdapter); - - if (typeof opts === 'string') { - opts = { uri: opts }; - } - opts.uri || (opts.uri = 'mongodb://localhost:27017'); - this.defaults = new Defaults(); - DSUtils.deepMixIn(this.defaults, opts); - this.client = new DSUtils.Promise(function (resolve, reject) { - MongoClient.connect(opts.uri, function (err, db) { - return err ? reject(err) : resolve(db); - }); - }); - } - - _createClass(DSMongoDBAdapter, [{ - key: 'getClient', - value: function getClient() { - return this.client; - } - }, { - key: 'getQuery', - value: function getQuery(resourceConfig, params) { - params = params || {}; - params.where = params.where || {}; - - DSUtils.forOwn(params, function (v, k) { - if (reserved.indexOf(k) === -1) { - if (DSUtils.isObject(v)) { - params.where[k] = v; - } else { - params.where[k] = { - '==': v - }; - } - delete params[k]; - } - }); - - var query = {}; - - if (Object.keys(params.where).length) { - DSUtils.forOwn(params.where, function (criteria, field) { - if (!DSUtils.isObject(criteria)) { - params.where[field] = { - '==': criteria - }; - } - DSUtils.forOwn(criteria, function (v, op) { - if (op === '==' || op === '===') { - query[field] = v; - } else if (op === '!=' || op === '!==') { - query[field] = query[field] || {}; - query[field].$ne = v; - } else if (op === '>') { - query[field] = query[field] || {}; - query[field].$gt = v; - } else if (op === '>=') { - query[field] = query[field] || {}; - query[field].$gte = v; - } else if (op === '<') { - query[field] = query[field] || {}; - query[field].$lt = v; - } else if (op === '<=') { - query[field] = query[field] || {}; - query[field].$lte = v; - } else if (op === 'in') { - query[field] = query[field] || {}; - query[field].$in = v; - } else if (op === 'notIn') { - query[field] = query[field] || {}; - query[field].$nin = v; - } else if (op === '|==' || op === '|===') { - query.$or = query.$or || []; - var orEqQuery = {}; - orEqQuery[field] = v; - query.$or.push(orEqQuery); - } else if (op === '|!=' || op === '|!==') { - query.$or = query.$or || []; - var orNeQuery = {}; - orNeQuery[field] = { - '$ne': v - }; - query.$or.push(orNeQuery); - } else if (op === '|>') { - query.$or = query.$or || []; - var orGtQuery = {}; - orGtQuery[field] = { - '$gt': v - }; - query.$or.push(orGtQuery); - } else if (op === '|>=') { - query.$or = query.$or || []; - var orGteQuery = {}; - orGteQuery[field] = { - '$gte': v - }; - query.$or.push(orGteQuery); - } else if (op === '|<') { - query.$or = query.$or || []; - var orLtQuery = {}; - orLtQuery[field] = { - '$lt': v - }; - query.$or.push(orLtQuery); - } else if (op === '|<=') { - query.$or = query.$or || []; - var orLteQuery = {}; - orLteQuery[field] = { - '$lte': v - }; - query.$or.push(orLteQuery); - } else if (op === '|in') { - query.$or = query.$or || []; - var orInQuery = {}; - orInQuery[field] = { - '$in': v - }; - query.$or.push(orInQuery); - } else if (op === '|notIn') { - query.$or = query.$or || []; - var orNinQuery = {}; - orNinQuery[field] = { - '$nin': v - }; - query.$or.push(orNinQuery); - } - }); - }); - } - - return query; - } - }, { - key: 'getQueryOptions', - value: function getQueryOptions(resourceConfig, params) { - params = params || {}; - params.orderBy = params.orderBy || params.sort; - params.skip = params.skip || params.offset; - - var queryOptions = {}; - - if (params.orderBy) { - if (DSUtils.isString(params.orderBy)) { - params.orderBy = [[params.orderBy, 'asc']]; - } - for (var i = 0; i < params.orderBy.length; i++) { - if (DSUtils.isString(params.orderBy[i])) { - params.orderBy[i] = [params.orderBy[i], 'asc']; - } - } - queryOptions.sort = params.orderBy; - } - - if (params.skip) { - queryOptions.skip = +params.skip; - } - - if (params.limit) { - queryOptions.limit = +params.limit; - } - - return queryOptions; - } - }, { - key: 'translateId', - value: function translateId(r, options) { - options = options || {}; - if (typeof options.translateId === 'boolean' ? options.translateId : this.defaults.translateId) { - if (Array.isArray(r)) { - r.forEach(function (_r) { - var __id = _r._id ? _r._id.toString() : _r._id; - _r._id = typeof __id === 'string' ? __id : _r._id; - }); - } else if (DSUtils.isObject(r)) { - var __id = r._id ? r._id.toString() : r._id; - r._id = typeof __id === 'string' ? __id : r._id; - } - } - return r; - } - }, { - key: 'origify', - value: function origify(options) { - options = options || {}; - if (typeof options.orig === 'function') { - return options.orig(); - } - return options; - } - }, { - key: 'find', - value: function find(resourceConfig, id, options) { - var _this = this; - - var instance = undefined; - options = this.origify(options); - options.with = options.with || []; - return this.getClient().then(function (client) { - return new DSUtils.Promise(function (resolve, reject) { - var params = {}; - params[resourceConfig.idAttribute] = id; - if (resourceConfig.idAttribute === '_id' && typeof id === 'string' && ObjectID.isValid(id)) { - params[resourceConfig.idAttribute] = ObjectID.createFromHexString(id); - } - options.fields = options.fields || {}; - client.collection(resourceConfig.table || underscore(resourceConfig.name)).findOne(params, options, function (err, r) { - if (err) { - reject(err); - } else if (!r) { - reject(new Error('Not Found!')); - } else { - resolve(_this.translateId(r, options)); - } - }); - }); - }).then(function (_instance) { - instance = _instance; - var tasks = []; - - DSUtils.forEach(resourceConfig.relationList, function (def) { - var relationName = def.relation; - var relationDef = resourceConfig.getResource(relationName); - var containedName = null; - if (DSUtils.contains(options.with, relationName)) { - containedName = relationName; - } else if (DSUtils.contains(options.with, def.localField)) { - containedName = def.localField; - } - if (containedName) { - (function () { - var __options = DSUtils.deepMixIn({}, options.orig ? options.orig() : options); - __options.with = options.with.slice(); - __options = DSUtils._(relationDef, __options); - DSUtils.remove(__options.with, containedName); - DSUtils.forEach(__options.with, function (relation, i) { - if (relation && relation.indexOf(containedName) === 0 && relation.length >= containedName.length && relation[containedName.length] === '.') { - __options.with[i] = relation.substr(containedName.length + 1); - } else { - __options.with[i] = ''; - } - }); - - var task = undefined; - - if ((def.type === 'hasOne' || def.type === 'hasMany') && def.foreignKey) { - task = _this.findAll(resourceConfig.getResource(relationName), { - where: _defineProperty({}, def.foreignKey, { - '==': instance[resourceConfig.idAttribute] - }) - }, __options).then(function (relatedItems) { - if (def.type === 'hasOne' && relatedItems.length) { - DSUtils.set(instance, def.localField, relatedItems[0]); - } else { - DSUtils.set(instance, def.localField, relatedItems); - } - return relatedItems; - }); - } else if (def.type === 'hasMany' && def.localKeys) { - var localKeys = []; - var itemKeys = instance[def.localKeys] || []; - itemKeys = Array.isArray(itemKeys) ? itemKeys : DSUtils.keys(itemKeys); - localKeys = localKeys.concat(itemKeys || []); - task = _this.findAll(resourceConfig.getResource(relationName), { - where: _defineProperty({}, relationDef.idAttribute, { - 'in': map(DSUtils.filter(unique(localKeys), function (x) { - return x; - }), function (x) { - return new ObjectID(x); - }) - }) - }, __options).then(function (relatedItems) { - DSUtils.set(instance, def.localField, relatedItems); - return relatedItems; - }); - } else if (def.type === 'belongsTo' || def.type === 'hasOne' && def.localKey) { - task = _this.find(resourceConfig.getResource(relationName), DSUtils.get(instance, def.localKey), __options).then(function (relatedItem) { - DSUtils.set(instance, def.localField, relatedItem); - return relatedItem; - }); - } - - if (task) { - tasks.push(task); - } - })(); - } - }); - - return DSUtils.Promise.all(tasks); - }).then(function () { - return instance; - }); - } - }, { - key: 'findAll', - value: function findAll(resourceConfig, params, options) { - var _this2 = this; - - var items = null; - options = this.origify(options ? DSUtils.copy(options) : {}); - options.with = options.with || []; - DSUtils.deepMixIn(options, this.getQueryOptions(resourceConfig, params)); - var query = this.getQuery(resourceConfig, params); - return this.getClient().then(function (client) { - return new DSUtils.Promise(function (resolve, reject) { - options.fields = options.fields || {}; - client.collection(resourceConfig.table || underscore(resourceConfig.name)).find(query, options).toArray(function (err, r) { - if (err) { - reject(err); - } else { - resolve(_this2.translateId(r, options)); - } - }); - }); - }).then(function (_items) { - items = _items; - var tasks = []; - DSUtils.forEach(resourceConfig.relationList, function (def) { - var relationName = def.relation; - var relationDef = resourceConfig.getResource(relationName); - var containedName = null; - if (DSUtils.contains(options.with, relationName)) { - containedName = relationName; - } else if (DSUtils.contains(options.with, def.localField)) { - containedName = def.localField; - } - if (containedName) { - (function () { - var __options = DSUtils.deepMixIn({}, options.orig ? options.orig() : options); - __options.with = options.with.slice(); - __options = DSUtils._(relationDef, __options); - DSUtils.remove(__options.with, containedName); - DSUtils.forEach(__options.with, function (relation, i) { - if (relation && relation.indexOf(containedName) === 0 && relation.length >= containedName.length && relation[containedName.length] === '.') { - __options.with[i] = relation.substr(containedName.length + 1); - } else { - __options.with[i] = ''; - } - }); - - var task = undefined; - - if ((def.type === 'hasOne' || def.type === 'hasMany') && def.foreignKey) { - task = _this2.findAll(resourceConfig.getResource(relationName), { - where: _defineProperty({}, def.foreignKey, { - 'in': DSUtils.filter(map(items, function (item) { - return DSUtils.get(item, resourceConfig.idAttribute); - }), function (x) { - return x; - }) - }) - }, __options).then(function (relatedItems) { - DSUtils.forEach(items, function (item) { - var attached = []; - DSUtils.forEach(relatedItems, function (relatedItem) { - if (DSUtils.get(relatedItem, def.foreignKey) === item[resourceConfig.idAttribute]) { - attached.push(relatedItem); - } - }); - if (def.type === 'hasOne' && attached.length) { - DSUtils.set(item, def.localField, attached[0]); - } else { - DSUtils.set(item, def.localField, attached); - } - }); - return relatedItems; - }); - } else if (def.type === 'hasMany' && def.localKeys) { - (function () { - var localKeys = []; - DSUtils.forEach(items, function (item) { - var itemKeys = item[def.localKeys] || []; - itemKeys = Array.isArray(itemKeys) ? itemKeys : DSUtils.keys(itemKeys); - localKeys = localKeys.concat(itemKeys || []); - }); - task = _this2.findAll(resourceConfig.getResource(relationName), { - where: _defineProperty({}, relationDef.idAttribute, { - 'in': map(DSUtils.filter(unique(localKeys), function (x) { - return x; - }), function (x) { - return new ObjectID(x); - }) - }) - }, __options).then(function (relatedItems) { - DSUtils.forEach(items, function (item) { - var attached = []; - var itemKeys = item[def.localKeys] || []; - itemKeys = Array.isArray(itemKeys) ? itemKeys : DSUtils.keys(itemKeys); - DSUtils.forEach(relatedItems, function (relatedItem) { - if (itemKeys && DSUtils.contains(itemKeys, relatedItem[relationDef.idAttribute])) { - attached.push(relatedItem); - } - }); - DSUtils.set(item, def.localField, attached); - }); - return relatedItems; - }); - })(); - } else if (def.type === 'belongsTo' || def.type === 'hasOne' && def.localKey) { - task = _this2.findAll(resourceConfig.getResource(relationName), { - where: _defineProperty({}, relationDef.idAttribute, { - 'in': map(DSUtils.filter(map(items, function (item) { - return DSUtils.get(item, def.localKey); - }), function (x) { - return x; - }), function (x) { - return new ObjectID(x); - }) - }) - }, __options).then(function (relatedItems) { - DSUtils.forEach(items, function (item) { - DSUtils.forEach(relatedItems, function (relatedItem) { - if (relatedItem[relationDef.idAttribute] === item[def.localKey]) { - DSUtils.set(item, def.localField, relatedItem); - } - }); - }); - return relatedItems; - }); - } - - if (task) { - tasks.push(task); - } - })(); - } - }); - return DSUtils.Promise.all(tasks); - }).then(function () { - return items; - }); - } - }, { - key: 'create', - value: function create(resourceConfig, attrs, options) { - var _this3 = this; - - options = this.origify(options); - attrs = DSUtils.removeCircular(DSUtils.omit(attrs, resourceConfig.relationFields || [])); - return this.getClient().then(function (client) { - return new DSUtils.Promise(function (resolve, reject) { - var collection = client.collection(resourceConfig.table || underscore(resourceConfig.name)); - var method = collection.insertOne ? DSUtils.isArray(attrs) ? 'insertMany' : 'insertOne' : 'insert'; - collection[method](attrs, options, function (err, r) { - if (err) { - reject(err); - } else { - r = r.ops ? r.ops : r; - _this3.translateId(r, options); - resolve(DSUtils.isArray(attrs) ? r : r[0]); - } - }); - }); - }); - } - }, { - key: 'update', - value: function update(resourceConfig, id, attrs, options) { - var _this4 = this; - - attrs = DSUtils.removeCircular(DSUtils.omit(attrs, resourceConfig.relationFields || [])); - options = this.origify(options); - return this.find(resourceConfig, id, options).then(function () { - return _this4.getClient(); - }).then(function (client) { - return new DSUtils.Promise(function (resolve, reject) { - var params = {}; - params[resourceConfig.idAttribute] = id; - if (resourceConfig.idAttribute === '_id' && typeof id === 'string' && ObjectID.isValid(id)) { - params[resourceConfig.idAttribute] = ObjectID.createFromHexString(id); - } - var collection = client.collection(resourceConfig.table || underscore(resourceConfig.name)); - collection[collection.updateOne ? 'updateOne' : 'update'](params, { $set: attrs }, options, function (err) { - if (err) { - reject(err); - } else { - resolve(); - } - }); - }); - }).then(function () { - return _this4.find(resourceConfig, id, options); - }); - } - }, { - key: 'updateAll', - value: function updateAll(resourceConfig, attrs, params, options) { - var _this5 = this; - - var ids = []; - attrs = DSUtils.removeCircular(DSUtils.omit(attrs, resourceConfig.relationFields || [])); - options = this.origify(options ? DSUtils.copy(options) : {}); - var _options = DSUtils.copy(options); - _options.multi = true; - return this.getClient().then(function (client) { - var queryOptions = _this5.getQueryOptions(resourceConfig, params); - queryOptions.$set = attrs; - var query = _this5.getQuery(resourceConfig, params); - return _this5.findAll(resourceConfig, params, options).then(function (items) { - ids = map(items, function (item) { - var id = item[resourceConfig.idAttribute]; - if (resourceConfig.idAttribute === '_id' && typeof id === 'string' && ObjectID.isValid(id)) { - return ObjectID.createFromHexString(id); - } - return id; - }); - return new DSUtils.Promise(function (resolve, reject) { - var collection = client.collection(resourceConfig.table || underscore(resourceConfig.name)); - collection[collection.updateMany ? 'updateMany' : 'update'](query, queryOptions, _options, function (err) { - if (err) { - reject(err); - } else { - resolve(); - } - }); - }); - }).then(function () { - var _params = {}; - _params[resourceConfig.idAttribute] = { - 'in': ids - }; - return _this5.findAll(resourceConfig, _params, options); - }); - }); - } - }, { - key: 'destroy', - value: function destroy(resourceConfig, id, options) { - options = this.origify(options); - return this.getClient().then(function (client) { - return new DSUtils.Promise(function (resolve, reject) { - var params = {}; - params[resourceConfig.idAttribute] = id; - if (resourceConfig.idAttribute === '_id' && typeof id === 'string' && ObjectID.isValid(id)) { - params[resourceConfig.idAttribute] = ObjectID.createFromHexString(id); - } - var collection = client.collection(resourceConfig.table || underscore(resourceConfig.name)); - collection[collection.deleteOne ? 'deleteOne' : 'remove'](params, options, function (err) { - if (err) { - reject(err); - } else { - resolve(); - } - }); - }); - }); - } - }, { - key: 'destroyAll', - value: function destroyAll(resourceConfig, params, options) { - var _this6 = this; - - options = this.origify(options ? DSUtils.copy(options) : {}); - return this.getClient().then(function (client) { - DSUtils.deepMixIn(options, _this6.getQueryOptions(resourceConfig, params)); - var query = _this6.getQuery(resourceConfig, params); - return new DSUtils.Promise(function (resolve, reject) { - var collection = client.collection(resourceConfig.table || underscore(resourceConfig.name)); - collection[collection.deleteMany ? 'deleteMany' : 'remove'](query, options, function (err) { - if (err) { - reject(err); - } else { - resolve(); - } - }); - }); - }); - } - }]); - - return DSMongoDBAdapter; - }(); - - module.exports = DSMongoDBAdapter; - -/***/ }, -/* 1 */ -/***/ function(module, exports) { - - module.exports = require("mongodb"); - -/***/ }, -/* 2 */ -/***/ function(module, exports) { - - module.exports = require("bson"); - -/***/ }, -/* 3 */ -/***/ function(module, exports) { - - module.exports = require("mout/array/map"); - -/***/ }, -/* 4 */ -/***/ function(module, exports) { - - module.exports = require("js-data"); - -/***/ }, -/* 5 */ -/***/ function(module, exports) { - - module.exports = require("mout/string/underscore"); - -/***/ }, -/* 6 */ -/***/ function(module, exports) { - - module.exports = require("mout/array/unique"); - -/***/ } -/******/ ]); +'use strict'; + +var babelHelpers = {}; +babelHelpers.typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { + return typeof obj; +} : function (obj) { + return obj && typeof Symbol === "function" && obj.constructor === Symbol ? "symbol" : typeof obj; +}; + +babelHelpers.defineProperty = function (obj, key, value) { + if (key in obj) { + Object.defineProperty(obj, key, { + value: value, + enumerable: true, + configurable: true, + writable: true + }); + } else { + obj[key] = value; + } + + return obj; +}; + +babelHelpers; + +var mongodb = require('mongodb'); +var MongoClient = mongodb.MongoClient; +var bson = require('bson'); +var ObjectID = bson.ObjectID; +var JSData = require('js-data'); +var underscore = require('mout/string/underscore'); +var DSUtils = JSData.DSUtils; + + +var reserved = ['orderBy', 'sort', 'limit', 'offset', 'skip', 'where']; + +function Defaults() {} + +Defaults.prototype.translateId = true; + +var addHiddenPropsToTarget = function addHiddenPropsToTarget(target, props) { + DSUtils.forOwn(props, function (value, key) { + props[key] = { + writable: true, + value: value + }; + }); + Object.defineProperties(target, props); +}; + +var fillIn = function fillIn(dest, src) { + DSUtils.forOwn(src, function (value, key) { + if (!dest.hasOwnProperty(key) || dest[key] === undefined) { + dest[key] = value; + } + }); +}; + +function unique(array) { + var seen = {}; + var final = []; + array.forEach(function (item) { + if (item in seen) { + return; + } + final.push(item); + seen[item] = 0; + }); + return final; +} + +/** + * MongoDBAdapter class. + * + * @example + * import {DS} from 'js-data' + * import MongoDBAdapter from 'js-data-mongodb' + * const store = new DS() + * const adapter = new MongoDBAdapter({ + * uri: 'mongodb://localhost:27017' + * }) + * store.registerAdapter('mongodb', adapter, { 'default': true }) + * + * @class MongoDBAdapter + * @param {Object} [opts] Configuration opts. + * @param {string} [opts.uri=''] MongoDB URI. + */ +function MongoDBAdapter(opts) { + var self = this; + if (typeof opts === 'string') { + opts = { uri: opts }; + } + opts.uri || (opts.uri = 'mongodb://localhost:27017'); + self.defaults = new Defaults(); + DSUtils.deepMixIn(self.defaults, opts); + fillIn(self, opts); + + /** + * A Promise that resolves to a reference to the MongoDB client being used by + * this adapter. + * + * @name MongoDBAdapter#client + * @type {Object} + */ + self.client = new DSUtils.Promise(function (resolve, reject) { + MongoClient.connect(opts.uri, function (err, db) { + return err ? reject(err) : resolve(db); + }); + }); +} + +addHiddenPropsToTarget(MongoDBAdapter.prototype, { + /** + * Return a Promise that resolves to a reference to the MongoDB client being + * used by this adapter. + * + * Useful when you need to do anything custom with the MongoDB client library. + * + * @name MongoDBAdapter#getClient + * @method + * @return {Object} MongoDB client. + */ + + getClient: function getClient() { + return this.client; + }, + + + /** + * Map filtering params in a selection query to MongoDB a filtering object. + * + * Handles the following: + * + * - where + * - and bunch of filtering operators + * + * @name MongoDBAdapter#getQuery + * @method + * @return {Object} + */ + getQuery: function getQuery(Resource, query) { + query || (query = {}); + query.where || (query.where = {}); + + DSUtils.forOwn(query, function (v, k) { + if (reserved.indexOf(k) === -1) { + if (DSUtils.isObject(v)) { + query.where[k] = v; + } else { + query.where[k] = { + '==': v + }; + } + delete query[k]; + } + }); + + var mongoQuery = {}; + + if (Object.keys(query.where).length) { + DSUtils.forOwn(query.where, function (criteria, field) { + if (!DSUtils.isObject(criteria)) { + query.where[field] = { + '==': criteria + }; + } + DSUtils.forOwn(criteria, function (v, op) { + if (op === '==' || op === '===') { + mongoQuery[field] = v; + } else if (op === '!=' || op === '!==') { + mongoQuery[field] = mongoQuery[field] || {}; + mongoQuery[field].$ne = v; + } else if (op === '>') { + mongoQuery[field] = mongoQuery[field] || {}; + mongoQuery[field].$gt = v; + } else if (op === '>=') { + mongoQuery[field] = mongoQuery[field] || {}; + mongoQuery[field].$gte = v; + } else if (op === '<') { + mongoQuery[field] = mongoQuery[field] || {}; + mongoQuery[field].$lt = v; + } else if (op === '<=') { + mongoQuery[field] = mongoQuery[field] || {}; + mongoQuery[field].$lte = v; + } else if (op === 'in') { + mongoQuery[field] = mongoQuery[field] || {}; + mongoQuery[field].$in = v; + } else if (op === 'notIn') { + mongoQuery[field] = mongoQuery[field] || {}; + mongoQuery[field].$nin = v; + } else if (op === '|==' || op === '|===') { + mongoQuery.$or = mongoQuery.$or || []; + var orEqQuery = {}; + orEqQuery[field] = v; + mongoQuery.$or.push(orEqQuery); + } else if (op === '|!=' || op === '|!==') { + mongoQuery.$or = mongoQuery.$or || []; + var orNeQuery = {}; + orNeQuery[field] = { + '$ne': v + }; + mongoQuery.$or.push(orNeQuery); + } else if (op === '|>') { + mongoQuery.$or = mongoQuery.$or || []; + var orGtQuery = {}; + orGtQuery[field] = { + '$gt': v + }; + mongoQuery.$or.push(orGtQuery); + } else if (op === '|>=') { + mongoQuery.$or = mongoQuery.$or || []; + var orGteQuery = {}; + orGteQuery[field] = { + '$gte': v + }; + mongoQuery.$or.push(orGteQuery); + } else if (op === '|<') { + mongoQuery.$or = mongoQuery.$or || []; + var orLtQuery = {}; + orLtQuery[field] = { + '$lt': v + }; + mongoQuery.$or.push(orLtQuery); + } else if (op === '|<=') { + mongoQuery.$or = mongoQuery.$or || []; + var orLteQuery = {}; + orLteQuery[field] = { + '$lte': v + }; + mongoQuery.$or.push(orLteQuery); + } else if (op === '|in') { + mongoQuery.$or = mongoQuery.$or || []; + var orInQuery = {}; + orInQuery[field] = { + '$in': v + }; + mongoQuery.$or.push(orInQuery); + } else if (op === '|notIn') { + mongoQuery.$or = mongoQuery.$or || []; + var orNinQuery = {}; + orNinQuery[field] = { + '$nin': v + }; + mongoQuery.$or.push(orNinQuery); + } + }); + }); + } + + return mongoQuery; + }, + + + /** + * Map non-filtering params in a selection query to MongoDB query options. + * + * Handles the following: + * + * - limit + * - skip/offset + * - orderBy/sort + * + * @name MongoDBAdapter#getQueryOptions + * @method + * @return {Object} + */ + getQueryOptions: function getQueryOptions(Resource, query) { + query = query || {}; + query.orderBy = query.orderBy || query.sort; + query.skip = query.skip || query.offset; + + var queryOptions = {}; + + if (query.orderBy) { + if (DSUtils.isString(query.orderBy)) { + query.orderBy = [[query.orderBy, 'asc']]; + } + for (var i = 0; i < query.orderBy.length; i++) { + if (DSUtils.isString(query.orderBy[i])) { + query.orderBy[i] = [query.orderBy[i], 'asc']; + } + } + queryOptions.sort = query.orderBy; + } + + if (query.skip) { + queryOptions.skip = +query.skip; + } + + if (query.limit) { + queryOptions.limit = +query.limit; + } + + return queryOptions; + }, + + + /** + * TODO + * + * @name MongoDBAdapter#translateId + * @method + * @return {*} + */ + translateId: function translateId(r, opts) { + opts || (opts = {}); + if (typeof opts.translateId === 'boolean' ? opts.translateId : this.defaults.translateId) { + if (DSUtils.isArray(r)) { + r.forEach(function (_r) { + var __id = _r._id ? _r._id.toString() : _r._id; + _r._id = typeof __id === 'string' ? __id : _r._id; + }); + } else if (DSUtils.isObject(r)) { + var __id = r._id ? r._id.toString() : r._id; + r._id = typeof __id === 'string' ? __id : r._id; + } + } + return r; + }, + + + /** + * TODO + * + * @name MongoDBAdapter#origify + * @method + * @return {Object} + */ + origify: function origify(opts) { + opts = opts || {}; + if (typeof opts.orig === 'function') { + return opts.orig(); + } + return opts; + }, + + + /** + * TODO + * + * @name MongoDBAdapter#makeHasManyForeignKey + * @method + * @return {*} + */ + toObjectID: function toObjectID(Resource, id) { + if (id !== undefined && Resource.idAttribute === '_id' && typeof id === 'string' && ObjectID.isValid(id) && !(id instanceof ObjectID)) { + return new ObjectID(id); + } + return id; + }, + + + /** + * TODO + * + * If the foreignKeys in your database are saved as ObjectIDs, then override + * this method and change it to something like: + * + * ``` + * return this.toObjectID(Resource, this.constructor.prototype.makeHasManyForeignKey.call(this, Resource, def, record)) + * ``` + * + * There may be other reasons why you may want to override this method, like + * when the id of the parent doesn't exactly match up to the key on the child. + * + * @name MongoDBAdapter#makeHasManyForeignKey + * @method + * @return {*} + */ + makeHasManyForeignKey: function makeHasManyForeignKey(Resource, def, record) { + return DSUtils.get(record, Resource.idAttribute); + }, + + + /** + * TODO + * + * @name MongoDBAdapter#loadHasMany + * @method + * @return {Promise} + */ + loadHasMany: function loadHasMany(Resource, def, records, __options) { + var self = this; + var singular = false; + + if (DSUtils.isObject(records) && !DSUtils.isArray(records)) { + singular = true; + records = [records]; + } + var IDs = records.map(function (record) { + return self.makeHasManyForeignKey(Resource, def, record); + }); + var query = {}; + var criteria = query[def.foreignKey] = {}; + if (singular) { + // more efficient query when we only have one record + criteria['=='] = IDs[0]; + } else { + criteria['in'] = IDs.filter(function (id) { + return id; + }); + } + return self.findAll(Resource.getResource(def.relation), query, __options).then(function (relatedItems) { + records.forEach(function (record) { + var attached = []; + // avoid unneccesary iteration when we only have one record + if (singular) { + attached = relatedItems; + } else { + relatedItems.forEach(function (relatedItem) { + if (DSUtils.get(relatedItem, def.foreignKey) === record[Resource.idAttribute]) { + attached.push(relatedItem); + } + }); + } + DSUtils.set(record, def.localField, attached); + }); + }); + }, + + + /** + * TODO + * + * @name MongoDBAdapter#loadHasOne + * @method + * @return {Promise} + */ + loadHasOne: function loadHasOne(Resource, def, records, __options) { + if (DSUtils.isObject(records) && !DSUtils.isArray(records)) { + records = [records]; + } + return this.loadHasMany(Resource, def, records, __options).then(function () { + records.forEach(function (record) { + var relatedData = DSUtils.get(record, def.localField); + if (DSUtils.isArray(relatedData) && relatedData.length) { + DSUtils.set(record, def.localField, relatedData[0]); + } + }); + }); + }, + + + /** + * TODO + * + * @name MongoDBAdapter#makeBelongsToForeignKey + * @method + * @return {*} + */ + makeBelongsToForeignKey: function makeBelongsToForeignKey(Resource, def, record) { + return this.toObjectID(Resource.getResource(def.relation), DSUtils.get(record, def.localKey)); + }, + + + /** + * TODO + * + * @name MongoDBAdapter#loadBelongsTo + * @method + * @return {Promise} + */ + loadBelongsTo: function loadBelongsTo(Resource, def, records, __options) { + var self = this; + var relationDef = Resource.getResource(def.relation); + + if (DSUtils.isObject(records) && !DSUtils.isArray(records)) { + var _ret = function () { + var record = records; + return { + v: self.find(relationDef, self.makeBelongsToForeignKey(Resource, def, record), __options).then(function (relatedItem) { + DSUtils.set(record, def.localField, relatedItem); + }) + }; + }(); + + if ((typeof _ret === 'undefined' ? 'undefined' : babelHelpers.typeof(_ret)) === "object") return _ret.v; + } else { + var keys = records.map(function (record) { + return self.makeBelongsToForeignKey(Resource, def, record); + }).filter(function (key) { + return key; + }); + return self.findAll(relationDef, { + where: babelHelpers.defineProperty({}, relationDef.idAttribute, { + 'in': keys + }) + }, __options).then(function (relatedItems) { + records.forEach(function (record) { + relatedItems.forEach(function (relatedItem) { + if (relatedItem[relationDef.idAttribute] === record[def.localKey]) { + DSUtils.set(record, def.localField, relatedItem); + } + }); + }); + }); + } + }, + + + /** + * Retrieve the record with the given primary key. + * + * @name MongoDBAdapter#find + * @method + * @param {Object} Resource The Resource. + * @param {(string|number)} id Primary key of the record to retrieve. + * @param {Object} [opts] Configuration options. + * @param {string[]} [opts.with=[]] TODO + * @return {Promise} + */ + find: function find(Resource, id, options) { + var self = this; + var instance = undefined; + options = self.origify(options); + options.with || (options.with = []); + return self.getClient().then(function (client) { + return new DSUtils.Promise(function (resolve, reject) { + var mongoQuery = {}; + mongoQuery[Resource.idAttribute] = self.toObjectID(Resource, id); + options.fields = options.fields || {}; + client.collection(Resource.table || underscore(Resource.name)).findOne(mongoQuery, options, function (err, r) { + if (err) { + reject(err); + } else if (!r) { + reject(new Error('Not Found!')); + } else { + resolve(self.translateId(r, options)); + } + }); + }); + }).then(function (_instance) { + instance = _instance; + var tasks = []; + var relationList = Resource.relationList || []; + + relationList.forEach(function (def) { + var relationName = def.relation; + var relationDef = Resource.getResource(relationName); + var containedName = null; + if (options.with.indexOf(relationName) !== -1) { + containedName = relationName; + } else if (options.with.indexOf(def.localField) !== -1) { + containedName = def.localField; + } + if (containedName) { + (function () { + var __options = DSUtils.deepMixIn({}, options.orig ? options.orig() : options); + __options.with = options.with.slice(); + __options = DSUtils._(relationDef, __options); + DSUtils.remove(__options.with, containedName); + __options.with.forEach(function (relation, i) { + if (relation && relation.indexOf(containedName) === 0 && relation.length >= containedName.length && relation[containedName.length] === '.') { + __options.with[i] = relation.substr(containedName.length + 1); + } else { + __options.with[i] = ''; + } + }); + + var task = undefined; + + if (def.foreignKey && (def.type === 'hasOne' || def.type === 'hasMany')) { + if (def.type === 'hasOne') { + task = self.loadHasOne(Resource, def, instance, __options); + } else { + task = self.loadHasMany(Resource, def, instance, __options); + } + } else if (def.type === 'hasMany' && def.localKeys) { + var localKeys = []; + var itemKeys = instance[def.localKeys] || []; + itemKeys = DSUtils.isArray(itemKeys) ? itemKeys : DSUtils.keys(itemKeys); + localKeys = localKeys.concat(itemKeys || []); + task = self.findAll(Resource.getResource(relationName), { + where: babelHelpers.defineProperty({}, relationDef.idAttribute, { + 'in': unique(localKeys).filter(function (x) { + return x; + }).map(function (x) { + return self.toObjectID(relationDef, x); + }) + }) + }, __options).then(function (relatedItems) { + DSUtils.set(instance, def.localField, relatedItems); + return relatedItems; + }); + } else if (def.type === 'belongsTo' || def.type === 'hasOne' && def.localKey) { + task = self.loadBelongsTo(Resource, def, instance, __options); + } + + if (task) { + tasks.push(task); + } + })(); + } + }); + + return DSUtils.Promise.all(tasks); + }).then(function () { + return instance; + }); + }, + + + /** + * Retrieve the records that match the selection query. + * + * @name MongoDBAdapter#findAll + * @method + * @param {Object} Resource The Resource. + * @param {Object} query Selection query. + * @param {Object} [opts] Configuration options. + * @param {string[]} [opts.with=[]] TODO + * @return {Promise} + */ + findAll: function findAll(Resource, query, options) { + var self = this; + var items = null; + options = self.origify(options ? DSUtils.copy(options) : {}); + options.with = options.with || []; + DSUtils.deepMixIn(options, self.getQueryOptions(Resource, query)); + var mongoQuery = self.getQuery(Resource, query); + return self.getClient().then(function (client) { + return new DSUtils.Promise(function (resolve, reject) { + options.fields = options.fields || {}; + client.collection(Resource.table || underscore(Resource.name)).find(mongoQuery, options).toArray(function (err, r) { + if (err) { + reject(err); + } else { + resolve(self.translateId(r, options)); + } + }); + }); + }).then(function (_items) { + items = _items; + var tasks = []; + var relationList = Resource.relationList || []; + relationList.forEach(function (def) { + var relationName = def.relation; + var relationDef = Resource.getResource(relationName); + var containedName = null; + if (options.with.indexOf(relationName) !== -1) { + containedName = relationName; + } else if (options.with.indexOf(def.localField) !== -1) { + containedName = def.localField; + } + if (containedName) { + (function () { + var __options = DSUtils.deepMixIn({}, options.orig ? options.orig() : options); + __options.with = options.with.slice(); + __options = DSUtils._(relationDef, __options); + DSUtils.remove(__options.with, containedName); + __options.with.forEach(function (relation, i) { + if (relation && relation.indexOf(containedName) === 0 && relation.length >= containedName.length && relation[containedName.length] === '.') { + __options.with[i] = relation.substr(containedName.length + 1); + } else { + __options.with[i] = ''; + } + }); + + var task = undefined; + + if (def.foreignKey && (def.type === 'hasOne' || def.type === 'hasMany')) { + if (def.type === 'hasMany') { + task = self.loadHasMany(Resource, def, items, __options); + } else { + task = self.loadHasOne(Resource, def, items, __options); + } + } else if (def.type === 'hasMany' && def.localKeys) { + (function () { + var localKeys = []; + items.forEach(function (item) { + var itemKeys = item[def.localKeys] || []; + itemKeys = DSUtils.isArray(itemKeys) ? itemKeys : Object.keys(itemKeys); + localKeys = localKeys.concat(itemKeys || []); + }); + task = self.findAll(Resource.getResource(relationName), { + where: babelHelpers.defineProperty({}, relationDef.idAttribute, { + 'in': unique(localKeys).filter(function (x) { + return x; + }).map(function (x) { + return self.toObjectID(relationDef, x); + }) + }) + }, __options).then(function (relatedItems) { + items.forEach(function (item) { + var attached = []; + var itemKeys = item[def.localKeys] || []; + itemKeys = DSUtils.isArray(itemKeys) ? itemKeys : DSUtils.keys(itemKeys); + relatedItems.forEach(function (relatedItem) { + if (itemKeys && itemKeys.indexOf(relatedItem[relationDef.idAttribute]) !== -1) { + attached.push(relatedItem); + } + }); + DSUtils.set(item, def.localField, attached); + }); + return relatedItems; + }); + })(); + } else if (def.type === 'belongsTo' || def.type === 'hasOne' && def.localKey) { + task = self.loadBelongsTo(Resource, def, items, __options); + } + + if (task) { + tasks.push(task); + } + })(); + } + }); + return DSUtils.Promise.all(tasks); + }).then(function () { + return items; + }); + }, + + + /** + * Create a new record. + * + * @name MongoDBAdapter#create + * @method + * @param {Object} Resource The Resource. + * @param {Object} props The record to be created. + * @param {Object} [opts] Configuration options. + * @return {Promise} + */ + create: function create(Resource, props, opts) { + var self = this; + props = DSUtils.removeCircular(DSUtils.omit(props, Resource.relationFields || [])); + opts = self.origify(opts); + + return self.getClient().then(function (client) { + return new DSUtils.Promise(function (resolve, reject) { + var collection = client.collection(Resource.table || underscore(Resource.name)); + var method = collection.insertOne ? DSUtils.isArray(props) ? 'insertMany' : 'insertOne' : 'insert'; + collection[method](props, opts, function (err, r) { + if (err) { + reject(err); + } else { + r = r.ops ? r.ops : r; + self.translateId(r, opts); + resolve(DSUtils.isArray(props) ? r : r[0]); + } + }); + }); + }); + }, + + + /** + * Destroy the record with the given primary key. + * + * @name MongoDBAdapter#destroy + * @method + * @param {Object} Resource The Resource. + * @param {(string|number)} id Primary key of the record to destroy. + * @param {Object} [opts] Configuration options. + * @return {Promise} + */ + destroy: function destroy(Resource, id, opts) { + var self = this; + opts = self.origify(opts); + + return self.getClient().then(function (client) { + return new DSUtils.Promise(function (resolve, reject) { + var mongoQuery = {}; + mongoQuery[Resource.idAttribute] = self.toObjectID(Resource, id); + var collection = client.collection(Resource.table || underscore(Resource.name)); + collection[collection.deleteOne ? 'deleteOne' : 'remove'](mongoQuery, opts, function (err) { + if (err) { + reject(err); + } else { + resolve(); + } + }); + }); + }); + }, + + + /** + * Destroy the records that match the selection query. + * + * @name MongoDBAdapter#destroyAll + * @method + * @param {Object} Resource the Resource. + * @param {Object} [query] Selection query. + * @param {Object} [opts] Configuration options. + * @return {Promise} + */ + destroyAll: function destroyAll(Resource, query, opts) { + var self = this; + opts = self.origify(opts ? DSUtils.copy(opts) : {}); + + return self.getClient().then(function (client) { + DSUtils.deepMixIn(opts, self.getQueryOptions(Resource, query)); + var mongoQuery = self.getQuery(Resource, query); + return new DSUtils.Promise(function (resolve, reject) { + var collection = client.collection(Resource.table || underscore(Resource.name)); + collection[collection.deleteMany ? 'deleteMany' : 'remove'](mongoQuery, opts, function (err) { + if (err) { + reject(err); + } else { + resolve(); + } + }); + }); + }); + }, + + + /** + * Apply the given update to the record with the specified primary key. + * + * @name MongoDBAdapter#update + * @method + * @param {Object} Resource The Resource. + * @param {(string|number)} id The primary key of the record to be updated. + * @param {Object} props The update to apply to the record. + * @param {Object} [opts] Configuration options. + * @return {Promise} + */ + update: function update(Resource, id, props, opts) { + var self = this; + props = DSUtils.removeCircular(DSUtils.omit(props, Resource.relationFields || [])); + opts = self.origify(opts); + + return self.find(Resource, id, opts).then(function () { + return self.getClient(); + }).then(function (client) { + return new DSUtils.Promise(function (resolve, reject) { + var mongoQuery = {}; + mongoQuery[Resource.idAttribute] = self.toObjectID(Resource, id); + var collection = client.collection(Resource.table || underscore(Resource.name)); + collection[collection.updateOne ? 'updateOne' : 'update'](mongoQuery, { $set: props }, opts, function (err) { + if (err) { + reject(err); + } else { + resolve(); + } + }); + }); + }).then(function () { + return self.find(Resource, id, opts); + }); + }, + + + /** + * Apply the given update to all records that match the selection query. + * + * @name MongoDBAdapter#updateAll + * @method + * @param {Object} Resource The Resource. + * @param {Object} props The update to apply to the selected records. + * @param {Object} [query] Selection query. + * @param {Object} [opts] Configuration options. + * @return {Promise} + */ + updateAll: function updateAll(Resource, props, query, opts) { + var self = this; + var ids = []; + props = DSUtils.removeCircular(DSUtils.omit(props, Resource.relationFields || [])); + opts = self.origify(opts ? DSUtils.copy(opts) : {}); + var mongoOptions = DSUtils.copy(opts); + mongoOptions.multi = true; + + return self.getClient().then(function (client) { + var queryOptions = self.getQueryOptions(Resource, query); + queryOptions.$set = props; + var mongoQuery = self.getQuery(Resource, query); + + return self.findAll(Resource, query, opts).then(function (items) { + ids = items.map(function (item) { + return self.toObjectID(Resource, item[Resource.idAttribute]); + }); + + return new DSUtils.Promise(function (resolve, reject) { + var collection = client.collection(Resource.table || underscore(Resource.name)); + collection[collection.updateMany ? 'updateMany' : 'update'](mongoQuery, queryOptions, mongoOptions, function (err) { + if (err) { + reject(err); + } else { + resolve(); + } + }); + }); + }).then(function () { + var query = {}; + query[Resource.idAttribute] = { + 'in': ids + }; + return self.findAll(Resource, query, opts); + }); + }); + } +}); + +module.exports = MongoDBAdapter; //# sourceMappingURL=js-data-mongodb.js.map \ No newline at end of file diff --git a/dist/js-data-mongodb.js.map b/dist/js-data-mongodb.js.map index c285b1d..1a17d24 100644 --- a/dist/js-data-mongodb.js.map +++ b/dist/js-data-mongodb.js.map @@ -1 +1 @@ -{"version":3,"sources":["webpack:///webpack/bootstrap 9c83c6111e94a2255e9d","webpack:///./src/index.js","webpack:///external \"mongodb\"","webpack:///external \"bson\"","webpack:///external \"mout/array/map\"","webpack:///external \"js-data\"","webpack:///external \"mout/string/underscore\"","webpack:///external \"mout/array/unique\""],"names":[],"mappings":"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","file":"./dist/js-data-mongodb.js","sourcesContent":[" \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId])\n \t\t\treturn installedModules[moduleId].exports;\n\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\texports: {},\n \t\t\tid: moduleId,\n \t\t\tloaded: false\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.loaded = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(0);\n\n\n\n/** WEBPACK FOOTER **\n ** webpack/bootstrap 9c83c6111e94a2255e9d\n **/","const mongodb = require('mongodb')\r\nconst MongoClient = mongodb.MongoClient\r\nconst bson = require('bson')\r\nconst map = require('mout/array/map')\r\nconst ObjectID = bson.ObjectID\r\nconst JSData = require('js-data')\r\nconst underscore = require('mout/string/underscore')\r\nconst unique = require('mout/array/unique')\r\nconst { DSUtils } = JSData\r\n\r\nconst reserved = [\r\n 'orderBy',\r\n 'sort',\r\n 'limit',\r\n 'offset',\r\n 'skip',\r\n 'where'\r\n]\r\n\r\nclass Defaults {\r\n\r\n}\r\n\r\nDefaults.prototype.translateId = true\r\n\r\nclass DSMongoDBAdapter {\r\n constructor (opts) {\r\n if (typeof opts === 'string') {\r\n opts = { uri: opts }\r\n }\r\n opts.uri || (opts.uri = 'mongodb://localhost:27017')\r\n this.defaults = new Defaults()\r\n DSUtils.deepMixIn(this.defaults, opts)\r\n this.client = new DSUtils.Promise(function (resolve, reject) {\r\n MongoClient.connect(opts.uri, function (err, db) {\r\n return err ? reject(err) : resolve(db)\r\n })\r\n })\r\n }\r\n\r\n getClient () {\r\n return this.client\r\n }\r\n\r\n getQuery (resourceConfig, params) {\r\n params = params || {}\r\n params.where = params.where || {}\r\n\r\n DSUtils.forOwn(params, function (v, k) {\r\n if (reserved.indexOf(k) === -1) {\r\n if (DSUtils.isObject(v)) {\r\n params.where[k] = v\r\n } else {\r\n params.where[k] = {\r\n '==': v\r\n }\r\n }\r\n delete params[k]\r\n }\r\n })\r\n\r\n let query = {}\r\n\r\n if (Object.keys(params.where).length) {\r\n DSUtils.forOwn(params.where, function (criteria, field) {\r\n if (!DSUtils.isObject(criteria)) {\r\n params.where[field] = {\r\n '==': criteria\r\n }\r\n }\r\n DSUtils.forOwn(criteria, function (v, op) {\r\n if (op === '==' || op === '===') {\r\n query[field] = v\r\n } else if (op === '!=' || op === '!==') {\r\n query[field] = query[field] || {}\r\n query[field].$ne = v\r\n } else if (op === '>') {\r\n query[field] = query[field] || {}\r\n query[field].$gt = v\r\n } else if (op === '>=') {\r\n query[field] = query[field] || {}\r\n query[field].$gte = v\r\n } else if (op === '<') {\r\n query[field] = query[field] || {}\r\n query[field].$lt = v\r\n } else if (op === '<=') {\r\n query[field] = query[field] || {}\r\n query[field].$lte = v\r\n } else if (op === 'in') {\r\n query[field] = query[field] || {}\r\n query[field].$in = v\r\n } else if (op === 'notIn') {\r\n query[field] = query[field] || {}\r\n query[field].$nin = v\r\n } else if (op === '|==' || op === '|===') {\r\n query.$or = query.$or || []\r\n let orEqQuery = {}\r\n orEqQuery[field] = v\r\n query.$or.push(orEqQuery)\r\n } else if (op === '|!=' || op === '|!==') {\r\n query.$or = query.$or || []\r\n let orNeQuery = {}\r\n orNeQuery[field] = {\r\n '$ne': v\r\n }\r\n query.$or.push(orNeQuery)\r\n } else if (op === '|>') {\r\n query.$or = query.$or || []\r\n let orGtQuery = {}\r\n orGtQuery[field] = {\r\n '$gt': v\r\n }\r\n query.$or.push(orGtQuery)\r\n } else if (op === '|>=') {\r\n query.$or = query.$or || []\r\n let orGteQuery = {}\r\n orGteQuery[field] = {\r\n '$gte': v\r\n }\r\n query.$or.push(orGteQuery)\r\n } else if (op === '|<') {\r\n query.$or = query.$or || []\r\n let orLtQuery = {}\r\n orLtQuery[field] = {\r\n '$lt': v\r\n }\r\n query.$or.push(orLtQuery)\r\n } else if (op === '|<=') {\r\n query.$or = query.$or || []\r\n let orLteQuery = {}\r\n orLteQuery[field] = {\r\n '$lte': v\r\n }\r\n query.$or.push(orLteQuery)\r\n } else if (op === '|in') {\r\n query.$or = query.$or || []\r\n let orInQuery = {}\r\n orInQuery[field] = {\r\n '$in': v\r\n }\r\n query.$or.push(orInQuery)\r\n } else if (op === '|notIn') {\r\n query.$or = query.$or || []\r\n let orNinQuery = {}\r\n orNinQuery[field] = {\r\n '$nin': v\r\n }\r\n query.$or.push(orNinQuery)\r\n }\r\n })\r\n })\r\n }\r\n\r\n return query\r\n }\r\n\r\n getQueryOptions (resourceConfig, params) {\r\n params = params || {}\r\n params.orderBy = params.orderBy || params.sort\r\n params.skip = params.skip || params.offset\r\n\r\n let queryOptions = {}\r\n\r\n if (params.orderBy) {\r\n if (DSUtils.isString(params.orderBy)) {\r\n params.orderBy = [\r\n [params.orderBy, 'asc']\r\n ]\r\n }\r\n for (var i = 0; i < params.orderBy.length; i++) {\r\n if (DSUtils.isString(params.orderBy[i])) {\r\n params.orderBy[i] = [params.orderBy[i], 'asc']\r\n }\r\n }\r\n queryOptions.sort = params.orderBy\r\n }\r\n\r\n if (params.skip) {\r\n queryOptions.skip = +params.skip\r\n }\r\n\r\n if (params.limit) {\r\n queryOptions.limit = +params.limit\r\n }\r\n\r\n return queryOptions\r\n }\r\n\r\n translateId (r, options) {\r\n options = options || {}\r\n if (typeof options.translateId === 'boolean' ? options.translateId : this.defaults.translateId) {\r\n if (Array.isArray(r)) {\r\n r.forEach((_r) => {\r\n let __id = _r._id ? _r._id.toString() : _r._id\r\n _r._id = typeof __id === 'string' ? __id : _r._id\r\n })\r\n } else if (DSUtils.isObject(r)) {\r\n let __id = r._id ? r._id.toString() : r._id\r\n r._id = typeof __id === 'string' ? __id : r._id\r\n }\r\n }\r\n return r\r\n }\r\n\r\n origify (options) {\r\n options = options || {}\r\n if (typeof options.orig === 'function') {\r\n return options.orig()\r\n }\r\n return options\r\n }\r\n\r\n find (resourceConfig, id, options) {\r\n let instance\r\n options = this.origify(options)\r\n options.with = options.with || []\r\n return this.getClient().then((client) => {\r\n return new DSUtils.Promise((resolve, reject) => {\r\n let params = {}\r\n params[resourceConfig.idAttribute] = id\r\n if (resourceConfig.idAttribute === '_id' && typeof id === 'string' && ObjectID.isValid(id)) {\r\n params[resourceConfig.idAttribute] = ObjectID.createFromHexString(id)\r\n }\r\n options.fields = options.fields || {}\r\n client.collection(resourceConfig.table || underscore(resourceConfig.name)).findOne(params, options, (err, r) => {\r\n if (err) {\r\n reject(err)\r\n } else if (!r) {\r\n reject(new Error('Not Found!'))\r\n } else {\r\n resolve(this.translateId(r, options))\r\n }\r\n })\r\n })\r\n }).then((_instance) => {\r\n instance = _instance\r\n let tasks = []\r\n\r\n DSUtils.forEach(resourceConfig.relationList, (def) => {\r\n let relationName = def.relation\r\n let relationDef = resourceConfig.getResource(relationName)\r\n let containedName = null\r\n if (DSUtils.contains(options.with, relationName)) {\r\n containedName = relationName\r\n } else if (DSUtils.contains(options.with, def.localField)) {\r\n containedName = def.localField\r\n }\r\n if (containedName) {\r\n let __options = DSUtils.deepMixIn({}, options.orig ? options.orig() : options)\r\n __options.with = options.with.slice()\r\n __options = DSUtils._(relationDef, __options)\r\n DSUtils.remove(__options.with, containedName)\r\n DSUtils.forEach(__options.with, (relation, i) => {\r\n if (relation && relation.indexOf(containedName) === 0 && relation.length >= containedName.length && relation[containedName.length] === '.') {\r\n __options.with[i] = relation.substr(containedName.length + 1)\r\n } else {\r\n __options.with[i] = ''\r\n }\r\n })\r\n\r\n let task\r\n\r\n if ((def.type === 'hasOne' || def.type === 'hasMany') && def.foreignKey) {\r\n task = this.findAll(resourceConfig.getResource(relationName), {\r\n where: {\r\n [def.foreignKey]: {\r\n '==': instance[resourceConfig.idAttribute]\r\n }\r\n }\r\n }, __options).then((relatedItems) => {\r\n if (def.type === 'hasOne' && relatedItems.length) {\r\n DSUtils.set(instance, def.localField, relatedItems[0])\r\n } else {\r\n DSUtils.set(instance, def.localField, relatedItems)\r\n }\r\n return relatedItems\r\n })\r\n } else if (def.type === 'hasMany' && def.localKeys) {\r\n let localKeys = []\r\n let itemKeys = instance[def.localKeys] || []\r\n itemKeys = Array.isArray(itemKeys) ? itemKeys : DSUtils.keys(itemKeys)\r\n localKeys = localKeys.concat(itemKeys || [])\r\n task = this.findAll(resourceConfig.getResource(relationName), {\r\n where: {\r\n [relationDef.idAttribute]: {\r\n 'in': map(DSUtils.filter(unique(localKeys), (x) => x), (x) => new ObjectID(x))\r\n }\r\n }\r\n }, __options).then((relatedItems) => {\r\n DSUtils.set(instance, def.localField, relatedItems)\r\n return relatedItems\r\n })\r\n } else if (def.type === 'belongsTo' || (def.type === 'hasOne' && def.localKey)) {\r\n task = this.find(resourceConfig.getResource(relationName), DSUtils.get(instance, def.localKey), __options).then((relatedItem) => {\r\n DSUtils.set(instance, def.localField, relatedItem)\r\n return relatedItem\r\n })\r\n }\r\n\r\n if (task) {\r\n tasks.push(task)\r\n }\r\n }\r\n })\r\n\r\n return DSUtils.Promise.all(tasks)\r\n }).then(() => instance)\r\n }\r\n\r\n findAll (resourceConfig, params, options) {\r\n let items = null\r\n options = this.origify(options ? DSUtils.copy(options) : {})\r\n options.with = options.with || []\r\n DSUtils.deepMixIn(options, this.getQueryOptions(resourceConfig, params))\r\n let query = this.getQuery(resourceConfig, params)\r\n return this.getClient().then((client) => {\r\n return new DSUtils.Promise((resolve, reject) => {\r\n options.fields = options.fields || {}\r\n client.collection(resourceConfig.table || underscore(resourceConfig.name)).find(query, options).toArray((err, r) => {\r\n if (err) {\r\n reject(err)\r\n } else {\r\n resolve(this.translateId(r, options))\r\n }\r\n })\r\n })\r\n }).then((_items) => {\r\n items = _items\r\n let tasks = []\r\n DSUtils.forEach(resourceConfig.relationList, (def) => {\r\n let relationName = def.relation\r\n let relationDef = resourceConfig.getResource(relationName)\r\n let containedName = null\r\n if (DSUtils.contains(options.with, relationName)) {\r\n containedName = relationName\r\n } else if (DSUtils.contains(options.with, def.localField)) {\r\n containedName = def.localField\r\n }\r\n if (containedName) {\r\n let __options = DSUtils.deepMixIn({}, options.orig ? options.orig() : options)\r\n __options.with = options.with.slice()\r\n __options = DSUtils._(relationDef, __options)\r\n DSUtils.remove(__options.with, containedName)\r\n DSUtils.forEach(__options.with, (relation, i) => {\r\n if (relation && relation.indexOf(containedName) === 0 && relation.length >= containedName.length && relation[containedName.length] === '.') {\r\n __options.with[i] = relation.substr(containedName.length + 1)\r\n } else {\r\n __options.with[i] = ''\r\n }\r\n })\r\n\r\n let task\r\n\r\n if ((def.type === 'hasOne' || def.type === 'hasMany') && def.foreignKey) {\r\n task = this.findAll(resourceConfig.getResource(relationName), {\r\n where: {\r\n [def.foreignKey]: {\r\n 'in': DSUtils.filter(map(items, (item) => DSUtils.get(item, resourceConfig.idAttribute)), (x) => x)\r\n }\r\n }\r\n }, __options).then((relatedItems) => {\r\n DSUtils.forEach(items, (item) => {\r\n let attached = []\r\n DSUtils.forEach(relatedItems, (relatedItem) => {\r\n if (DSUtils.get(relatedItem, def.foreignKey) === item[resourceConfig.idAttribute]) {\r\n attached.push(relatedItem)\r\n }\r\n })\r\n if (def.type === 'hasOne' && attached.length) {\r\n DSUtils.set(item, def.localField, attached[0])\r\n } else {\r\n DSUtils.set(item, def.localField, attached)\r\n }\r\n })\r\n return relatedItems\r\n })\r\n } else if (def.type === 'hasMany' && def.localKeys) {\r\n let localKeys = []\r\n DSUtils.forEach(items, (item) => {\r\n let itemKeys = item[def.localKeys] || []\r\n itemKeys = Array.isArray(itemKeys) ? itemKeys : DSUtils.keys(itemKeys)\r\n localKeys = localKeys.concat(itemKeys || [])\r\n })\r\n task = this.findAll(resourceConfig.getResource(relationName), {\r\n where: {\r\n [relationDef.idAttribute]: {\r\n 'in': map(DSUtils.filter(unique(localKeys), (x) => x), (x) => new ObjectID(x))\r\n }\r\n }\r\n }, __options).then((relatedItems) => {\r\n DSUtils.forEach(items, (item) => {\r\n let attached = []\r\n let itemKeys = item[def.localKeys] || []\r\n itemKeys = Array.isArray(itemKeys) ? itemKeys : DSUtils.keys(itemKeys)\r\n DSUtils.forEach(relatedItems, (relatedItem) => {\r\n if (itemKeys && DSUtils.contains(itemKeys, relatedItem[relationDef.idAttribute])) {\r\n attached.push(relatedItem)\r\n }\r\n })\r\n DSUtils.set(item, def.localField, attached)\r\n })\r\n return relatedItems\r\n })\r\n } else if (def.type === 'belongsTo' || (def.type === 'hasOne' && def.localKey)) {\r\n task = this.findAll(resourceConfig.getResource(relationName), {\r\n where: {\r\n [relationDef.idAttribute]: {\r\n 'in': map(DSUtils.filter(map(items, (item) => DSUtils.get(item, def.localKey)), (x) => x), (x) => new ObjectID(x))\r\n }\r\n }\r\n }, __options).then((relatedItems) => {\r\n DSUtils.forEach(items, (item) => {\r\n DSUtils.forEach(relatedItems, (relatedItem) => {\r\n if (relatedItem[relationDef.idAttribute] === item[def.localKey]) {\r\n DSUtils.set(item, def.localField, relatedItem)\r\n }\r\n })\r\n })\r\n return relatedItems\r\n })\r\n }\r\n\r\n if (task) {\r\n tasks.push(task)\r\n }\r\n }\r\n })\r\n return DSUtils.Promise.all(tasks)\r\n }).then(() => items)\r\n }\r\n\r\n create (resourceConfig, attrs, options) {\r\n options = this.origify(options)\r\n attrs = DSUtils.removeCircular(DSUtils.omit(attrs, resourceConfig.relationFields || []))\r\n return this.getClient().then((client) => {\r\n return new DSUtils.Promise((resolve, reject) => {\r\n let collection = client.collection(resourceConfig.table || underscore(resourceConfig.name))\r\n let method = collection.insertOne ? DSUtils.isArray(attrs) ? 'insertMany' : 'insertOne' : 'insert'\r\n collection[method](attrs, options, (err, r) => {\r\n if (err) {\r\n reject(err)\r\n } else {\r\n r = r.ops ? r.ops : r\r\n this.translateId(r, options)\r\n resolve(DSUtils.isArray(attrs) ? r : r[0])\r\n }\r\n })\r\n })\r\n })\r\n }\r\n\r\n update (resourceConfig, id, attrs, options) {\r\n attrs = DSUtils.removeCircular(DSUtils.omit(attrs, resourceConfig.relationFields || []))\r\n options = this.origify(options)\r\n return this.find(resourceConfig, id, options).then(() => {\r\n return this.getClient()\r\n }).then((client) => {\r\n return new DSUtils.Promise((resolve, reject) => {\r\n let params = {}\r\n params[resourceConfig.idAttribute] = id\r\n if (resourceConfig.idAttribute === '_id' && typeof id === 'string' && ObjectID.isValid(id)) {\r\n params[resourceConfig.idAttribute] = ObjectID.createFromHexString(id)\r\n }\r\n let collection = client.collection(resourceConfig.table || underscore(resourceConfig.name))\r\n collection[collection.updateOne ? 'updateOne' : 'update'](params, {$set: attrs}, options, (err) => {\r\n if (err) {\r\n reject(err)\r\n } else {\r\n resolve()\r\n }\r\n })\r\n })\r\n }).then(() => this.find(resourceConfig, id, options))\r\n }\r\n\r\n updateAll (resourceConfig, attrs, params, options) {\r\n let ids = []\r\n attrs = DSUtils.removeCircular(DSUtils.omit(attrs, resourceConfig.relationFields || []))\r\n options = this.origify(options ? DSUtils.copy(options) : {})\r\n let _options = DSUtils.copy(options)\r\n _options.multi = true\r\n return this.getClient().then((client) => {\r\n let queryOptions = this.getQueryOptions(resourceConfig, params)\r\n queryOptions.$set = attrs\r\n let query = this.getQuery(resourceConfig, params)\r\n return this.findAll(resourceConfig, params, options).then((items) => {\r\n ids = map(items, (item) => {\r\n let id = item[resourceConfig.idAttribute]\r\n if (resourceConfig.idAttribute === '_id' && typeof id === 'string' && ObjectID.isValid(id)) {\r\n return ObjectID.createFromHexString(id)\r\n }\r\n return id\r\n })\r\n return new DSUtils.Promise((resolve, reject) => {\r\n let collection = client.collection(resourceConfig.table || underscore(resourceConfig.name))\r\n collection[collection.updateMany ? 'updateMany' : 'update'](query, queryOptions, _options, (err) => {\r\n if (err) {\r\n reject(err)\r\n } else {\r\n resolve()\r\n }\r\n })\r\n })\r\n }).then(() => {\r\n let _params = {}\r\n _params[resourceConfig.idAttribute] = {\r\n 'in': ids\r\n }\r\n return this.findAll(resourceConfig, _params, options)\r\n })\r\n })\r\n }\r\n\r\n destroy (resourceConfig, id, options) {\r\n options = this.origify(options)\r\n return this.getClient().then((client) => {\r\n return new DSUtils.Promise((resolve, reject) => {\r\n let params = {}\r\n params[resourceConfig.idAttribute] = id\r\n if (resourceConfig.idAttribute === '_id' && typeof id === 'string' && ObjectID.isValid(id)) {\r\n params[resourceConfig.idAttribute] = ObjectID.createFromHexString(id)\r\n }\r\n let collection = client.collection(resourceConfig.table || underscore(resourceConfig.name))\r\n collection[collection.deleteOne ? 'deleteOne' : 'remove'](params, options, (err) => {\r\n if (err) {\r\n reject(err)\r\n } else {\r\n resolve()\r\n }\r\n })\r\n })\r\n })\r\n }\r\n\r\n destroyAll (resourceConfig, params, options) {\r\n options = this.origify(options ? DSUtils.copy(options) : {})\r\n return this.getClient().then((client) => {\r\n DSUtils.deepMixIn(options, this.getQueryOptions(resourceConfig, params))\r\n let query = this.getQuery(resourceConfig, params)\r\n return new DSUtils.Promise((resolve, reject) => {\r\n let collection = client.collection(resourceConfig.table || underscore(resourceConfig.name))\r\n collection[collection.deleteMany ? 'deleteMany' : 'remove'](query, options, (err) => {\r\n if (err) {\r\n reject(err)\r\n } else {\r\n resolve()\r\n }\r\n })\r\n })\r\n })\r\n }\r\n}\r\n\r\nmodule.exports = DSMongoDBAdapter\r\n\n\n\n/** WEBPACK FOOTER **\n ** ./src/index.js\n **/","module.exports = require(\"mongodb\");\n\n\n/*****************\n ** WEBPACK FOOTER\n ** external \"mongodb\"\n ** module id = 1\n ** module chunks = 0\n **/","module.exports = require(\"bson\");\n\n\n/*****************\n ** WEBPACK FOOTER\n ** external \"bson\"\n ** module id = 2\n ** module chunks = 0\n **/","module.exports = require(\"mout/array/map\");\n\n\n/*****************\n ** WEBPACK FOOTER\n ** external \"mout/array/map\"\n ** module id = 3\n ** module chunks = 0\n **/","module.exports = require(\"js-data\");\n\n\n/*****************\n ** WEBPACK FOOTER\n ** external \"js-data\"\n ** module id = 4\n ** module chunks = 0\n **/","module.exports = require(\"mout/string/underscore\");\n\n\n/*****************\n ** WEBPACK FOOTER\n ** external \"mout/string/underscore\"\n ** module id = 5\n ** module chunks = 0\n **/","module.exports = require(\"mout/array/unique\");\n\n\n/*****************\n ** WEBPACK FOOTER\n ** external \"mout/array/unique\"\n ** module id = 6\n ** module chunks = 0\n **/"],"sourceRoot":""} \ No newline at end of file +{"version":3,"file":"js-data-mongodb.js","sources":["../src/index.js"],"sourcesContent":["const mongodb = require('mongodb')\r\nconst MongoClient = mongodb.MongoClient\r\nconst bson = require('bson')\r\nconst ObjectID = bson.ObjectID\r\nconst JSData = require('js-data')\r\nconst underscore = require('mout/string/underscore')\r\nconst { DSUtils } = JSData\r\n\r\nconst reserved = [\r\n 'orderBy',\r\n 'sort',\r\n 'limit',\r\n 'offset',\r\n 'skip',\r\n 'where'\r\n]\r\n\r\nfunction Defaults () {}\r\n\r\nDefaults.prototype.translateId = true\r\n\r\nconst addHiddenPropsToTarget = function (target, props) {\r\n DSUtils.forOwn(props, function (value, key) {\r\n props[key] = {\r\n writable: true,\r\n value\r\n }\r\n })\r\n Object.defineProperties(target, props)\r\n}\r\n\r\nconst fillIn = function (dest, src) {\r\n DSUtils.forOwn(src, function (value, key) {\r\n if (!dest.hasOwnProperty(key) || dest[key] === undefined) {\r\n dest[key] = value\r\n }\r\n })\r\n}\r\n\r\nfunction unique (array) {\r\n const seen = {}\r\n const final = []\r\n array.forEach(function (item) {\r\n if (item in seen) {\r\n return\r\n }\r\n final.push(item)\r\n seen[item] = 0\r\n })\r\n return final\r\n}\r\n\r\n/**\r\n * MongoDBAdapter class.\r\n *\r\n * @example\r\n * import {DS} from 'js-data'\r\n * import MongoDBAdapter from 'js-data-mongodb'\r\n * const store = new DS()\r\n * const adapter = new MongoDBAdapter({\r\n * uri: 'mongodb://localhost:27017'\r\n * })\r\n * store.registerAdapter('mongodb', adapter, { 'default': true })\r\n *\r\n * @class MongoDBAdapter\r\n * @param {Object} [opts] Configuration opts.\r\n * @param {string} [opts.uri=''] MongoDB URI.\r\n */\r\nexport default function MongoDBAdapter (opts) {\r\n const self = this\r\n if (typeof opts === 'string') {\r\n opts = { uri: opts }\r\n }\r\n opts.uri || (opts.uri = 'mongodb://localhost:27017')\r\n self.defaults = new Defaults()\r\n DSUtils.deepMixIn(self.defaults, opts)\r\n fillIn(self, opts)\r\n\r\n /**\r\n * A Promise that resolves to a reference to the MongoDB client being used by\r\n * this adapter.\r\n *\r\n * @name MongoDBAdapter#client\r\n * @type {Object}\r\n */\r\n self.client = new DSUtils.Promise(function (resolve, reject) {\r\n MongoClient.connect(opts.uri, function (err, db) {\r\n return err ? reject(err) : resolve(db)\r\n })\r\n })\r\n}\r\n\r\naddHiddenPropsToTarget(MongoDBAdapter.prototype, {\r\n /**\r\n * Return a Promise that resolves to a reference to the MongoDB client being\r\n * used by this adapter.\r\n *\r\n * Useful when you need to do anything custom with the MongoDB client library.\r\n *\r\n * @name MongoDBAdapter#getClient\r\n * @method\r\n * @return {Object} MongoDB client.\r\n */\r\n getClient () {\r\n return this.client\r\n },\r\n\r\n /**\r\n * Map filtering params in a selection query to MongoDB a filtering object.\r\n *\r\n * Handles the following:\r\n *\r\n * - where\r\n * - and bunch of filtering operators\r\n *\r\n * @name MongoDBAdapter#getQuery\r\n * @method\r\n * @return {Object}\r\n */\r\n getQuery (Resource, query) {\r\n query || (query = {})\r\n query.where || (query.where = {})\r\n\r\n DSUtils.forOwn(query, function (v, k) {\r\n if (reserved.indexOf(k) === -1) {\r\n if (DSUtils.isObject(v)) {\r\n query.where[k] = v\r\n } else {\r\n query.where[k] = {\r\n '==': v\r\n }\r\n }\r\n delete query[k]\r\n }\r\n })\r\n\r\n let mongoQuery = {}\r\n\r\n if (Object.keys(query.where).length) {\r\n DSUtils.forOwn(query.where, function (criteria, field) {\r\n if (!DSUtils.isObject(criteria)) {\r\n query.where[field] = {\r\n '==': criteria\r\n }\r\n }\r\n DSUtils.forOwn(criteria, function (v, op) {\r\n if (op === '==' || op === '===') {\r\n mongoQuery[field] = v\r\n } else if (op === '!=' || op === '!==') {\r\n mongoQuery[field] = mongoQuery[field] || {}\r\n mongoQuery[field].$ne = v\r\n } else if (op === '>') {\r\n mongoQuery[field] = mongoQuery[field] || {}\r\n mongoQuery[field].$gt = v\r\n } else if (op === '>=') {\r\n mongoQuery[field] = mongoQuery[field] || {}\r\n mongoQuery[field].$gte = v\r\n } else if (op === '<') {\r\n mongoQuery[field] = mongoQuery[field] || {}\r\n mongoQuery[field].$lt = v\r\n } else if (op === '<=') {\r\n mongoQuery[field] = mongoQuery[field] || {}\r\n mongoQuery[field].$lte = v\r\n } else if (op === 'in') {\r\n mongoQuery[field] = mongoQuery[field] || {}\r\n mongoQuery[field].$in = v\r\n } else if (op === 'notIn') {\r\n mongoQuery[field] = mongoQuery[field] || {}\r\n mongoQuery[field].$nin = v\r\n } else if (op === '|==' || op === '|===') {\r\n mongoQuery.$or = mongoQuery.$or || []\r\n let orEqQuery = {}\r\n orEqQuery[field] = v\r\n mongoQuery.$or.push(orEqQuery)\r\n } else if (op === '|!=' || op === '|!==') {\r\n mongoQuery.$or = mongoQuery.$or || []\r\n let orNeQuery = {}\r\n orNeQuery[field] = {\r\n '$ne': v\r\n }\r\n mongoQuery.$or.push(orNeQuery)\r\n } else if (op === '|>') {\r\n mongoQuery.$or = mongoQuery.$or || []\r\n let orGtQuery = {}\r\n orGtQuery[field] = {\r\n '$gt': v\r\n }\r\n mongoQuery.$or.push(orGtQuery)\r\n } else if (op === '|>=') {\r\n mongoQuery.$or = mongoQuery.$or || []\r\n let orGteQuery = {}\r\n orGteQuery[field] = {\r\n '$gte': v\r\n }\r\n mongoQuery.$or.push(orGteQuery)\r\n } else if (op === '|<') {\r\n mongoQuery.$or = mongoQuery.$or || []\r\n let orLtQuery = {}\r\n orLtQuery[field] = {\r\n '$lt': v\r\n }\r\n mongoQuery.$or.push(orLtQuery)\r\n } else if (op === '|<=') {\r\n mongoQuery.$or = mongoQuery.$or || []\r\n let orLteQuery = {}\r\n orLteQuery[field] = {\r\n '$lte': v\r\n }\r\n mongoQuery.$or.push(orLteQuery)\r\n } else if (op === '|in') {\r\n mongoQuery.$or = mongoQuery.$or || []\r\n let orInQuery = {}\r\n orInQuery[field] = {\r\n '$in': v\r\n }\r\n mongoQuery.$or.push(orInQuery)\r\n } else if (op === '|notIn') {\r\n mongoQuery.$or = mongoQuery.$or || []\r\n let orNinQuery = {}\r\n orNinQuery[field] = {\r\n '$nin': v\r\n }\r\n mongoQuery.$or.push(orNinQuery)\r\n }\r\n })\r\n })\r\n }\r\n\r\n return mongoQuery\r\n },\r\n\r\n /**\r\n * Map non-filtering params in a selection query to MongoDB query options.\r\n *\r\n * Handles the following:\r\n *\r\n * - limit\r\n * - skip/offset\r\n * - orderBy/sort\r\n *\r\n * @name MongoDBAdapter#getQueryOptions\r\n * @method\r\n * @return {Object}\r\n */\r\n getQueryOptions (Resource, query) {\r\n query = query || {}\r\n query.orderBy = query.orderBy || query.sort\r\n query.skip = query.skip || query.offset\r\n\r\n let queryOptions = {}\r\n\r\n if (query.orderBy) {\r\n if (DSUtils.isString(query.orderBy)) {\r\n query.orderBy = [\r\n [query.orderBy, 'asc']\r\n ]\r\n }\r\n for (var i = 0; i < query.orderBy.length; i++) {\r\n if (DSUtils.isString(query.orderBy[i])) {\r\n query.orderBy[i] = [query.orderBy[i], 'asc']\r\n }\r\n }\r\n queryOptions.sort = query.orderBy\r\n }\r\n\r\n if (query.skip) {\r\n queryOptions.skip = +query.skip\r\n }\r\n\r\n if (query.limit) {\r\n queryOptions.limit = +query.limit\r\n }\r\n\r\n return queryOptions\r\n },\r\n\r\n /**\r\n * TODO\r\n *\r\n * @name MongoDBAdapter#translateId\r\n * @method\r\n * @return {*}\r\n */\r\n translateId (r, opts) {\r\n opts || (opts = {})\r\n if (typeof opts.translateId === 'boolean' ? opts.translateId : this.defaults.translateId) {\r\n if (DSUtils.isArray(r)) {\r\n r.forEach(function (_r) {\r\n const __id = _r._id ? _r._id.toString() : _r._id\r\n _r._id = typeof __id === 'string' ? __id : _r._id\r\n })\r\n } else if (DSUtils.isObject(r)) {\r\n const __id = r._id ? r._id.toString() : r._id\r\n r._id = typeof __id === 'string' ? __id : r._id\r\n }\r\n }\r\n return r\r\n },\r\n\r\n /**\r\n * TODO\r\n *\r\n * @name MongoDBAdapter#origify\r\n * @method\r\n * @return {Object}\r\n */\r\n origify (opts) {\r\n opts = opts || {}\r\n if (typeof opts.orig === 'function') {\r\n return opts.orig()\r\n }\r\n return opts\r\n },\r\n\r\n /**\r\n * TODO\r\n *\r\n * @name MongoDBAdapter#makeHasManyForeignKey\r\n * @method\r\n * @return {*}\r\n */\r\n toObjectID (Resource, id) {\r\n if (id !== undefined && Resource.idAttribute === '_id' && typeof id === 'string' && ObjectID.isValid(id) && !(id instanceof ObjectID)) {\r\n return new ObjectID(id)\r\n }\r\n return id\r\n },\r\n\r\n /**\r\n * TODO\r\n *\r\n * If the foreignKeys in your database are saved as ObjectIDs, then override\r\n * this method and change it to something like:\r\n *\r\n * ```\r\n * return this.toObjectID(Resource, this.constructor.prototype.makeHasManyForeignKey.call(this, Resource, def, record))\r\n * ```\r\n *\r\n * There may be other reasons why you may want to override this method, like\r\n * when the id of the parent doesn't exactly match up to the key on the child.\r\n *\r\n * @name MongoDBAdapter#makeHasManyForeignKey\r\n * @method\r\n * @return {*}\r\n */\r\n makeHasManyForeignKey (Resource, def, record) {\r\n return DSUtils.get(record, Resource.idAttribute)\r\n },\r\n\r\n /**\r\n * TODO\r\n *\r\n * @name MongoDBAdapter#loadHasMany\r\n * @method\r\n * @return {Promise}\r\n */\r\n loadHasMany (Resource, def, records, __options) {\r\n const self = this\r\n let singular = false\r\n\r\n if (DSUtils.isObject(records) && !DSUtils.isArray(records)) {\r\n singular = true\r\n records = [records]\r\n }\r\n const IDs = records.map(function (record) {\r\n return self.makeHasManyForeignKey(Resource, def, record)\r\n })\r\n const query = {}\r\n const criteria = query[def.foreignKey] = {}\r\n if (singular) {\r\n // more efficient query when we only have one record\r\n criteria['=='] = IDs[0]\r\n } else {\r\n criteria['in'] = IDs.filter(function (id) {\r\n return id\r\n })\r\n }\r\n return self.findAll(Resource.getResource(def.relation), query, __options).then(function (relatedItems) {\r\n records.forEach(function (record) {\r\n let attached = []\r\n // avoid unneccesary iteration when we only have one record\r\n if (singular) {\r\n attached = relatedItems\r\n } else {\r\n relatedItems.forEach(function (relatedItem) {\r\n if (DSUtils.get(relatedItem, def.foreignKey) === record[Resource.idAttribute]) {\r\n attached.push(relatedItem)\r\n }\r\n })\r\n }\r\n DSUtils.set(record, def.localField, attached)\r\n })\r\n })\r\n },\r\n\r\n /**\r\n * TODO\r\n *\r\n * @name MongoDBAdapter#loadHasOne\r\n * @method\r\n * @return {Promise}\r\n */\r\n loadHasOne (Resource, def, records, __options) {\r\n if (DSUtils.isObject(records) && !DSUtils.isArray(records)) {\r\n records = [records]\r\n }\r\n return this.loadHasMany(Resource, def, records, __options).then(function () {\r\n records.forEach(function (record) {\r\n const relatedData = DSUtils.get(record, def.localField)\r\n if (DSUtils.isArray(relatedData) && relatedData.length) {\r\n DSUtils.set(record, def.localField, relatedData[0])\r\n }\r\n })\r\n })\r\n },\r\n\r\n /**\r\n * TODO\r\n *\r\n * @name MongoDBAdapter#makeBelongsToForeignKey\r\n * @method\r\n * @return {*}\r\n */\r\n makeBelongsToForeignKey (Resource, def, record) {\r\n return this.toObjectID(Resource.getResource(def.relation), DSUtils.get(record, def.localKey))\r\n },\r\n\r\n /**\r\n * TODO\r\n *\r\n * @name MongoDBAdapter#loadBelongsTo\r\n * @method\r\n * @return {Promise}\r\n */\r\n loadBelongsTo (Resource, def, records, __options) {\r\n const self = this\r\n const relationDef = Resource.getResource(def.relation)\r\n\r\n if (DSUtils.isObject(records) && !DSUtils.isArray(records)) {\r\n const record = records\r\n return self.find(relationDef, self.makeBelongsToForeignKey(Resource, def, record), __options).then(function (relatedItem) {\r\n DSUtils.set(record, def.localField, relatedItem)\r\n })\r\n } else {\r\n const keys = records.map(function (record) {\r\n return self.makeBelongsToForeignKey(Resource, def, record)\r\n }).filter(function (key) {\r\n return key\r\n })\r\n return self.findAll(relationDef, {\r\n where: {\r\n [relationDef.idAttribute]: {\r\n 'in': keys\r\n }\r\n }\r\n }, __options).then(function (relatedItems) {\r\n records.forEach(function (record) {\r\n relatedItems.forEach(function (relatedItem) {\r\n if (relatedItem[relationDef.idAttribute] === record[def.localKey]) {\r\n DSUtils.set(record, def.localField, relatedItem)\r\n }\r\n })\r\n })\r\n })\r\n }\r\n },\r\n\r\n /**\r\n * Retrieve the record with the given primary key.\r\n *\r\n * @name MongoDBAdapter#find\r\n * @method\r\n * @param {Object} Resource The Resource.\r\n * @param {(string|number)} id Primary key of the record to retrieve.\r\n * @param {Object} [opts] Configuration options.\r\n * @param {string[]} [opts.with=[]] TODO\r\n * @return {Promise}\r\n */\r\n find (Resource, id, options) {\r\n const self = this\r\n let instance\r\n options = self.origify(options)\r\n options.with || (options.with = [])\r\n return self.getClient().then(function (client) {\r\n return new DSUtils.Promise(function (resolve, reject) {\r\n let mongoQuery = {}\r\n mongoQuery[Resource.idAttribute] = self.toObjectID(Resource, id)\r\n options.fields = options.fields || {}\r\n client.collection(Resource.table || underscore(Resource.name)).findOne(mongoQuery, options, function (err, r) {\r\n if (err) {\r\n reject(err)\r\n } else if (!r) {\r\n reject(new Error('Not Found!'))\r\n } else {\r\n resolve(self.translateId(r, options))\r\n }\r\n })\r\n })\r\n }).then(function (_instance) {\r\n instance = _instance\r\n let tasks = []\r\n const relationList = Resource.relationList || []\r\n\r\n relationList.forEach(function (def) {\r\n let relationName = def.relation\r\n let relationDef = Resource.getResource(relationName)\r\n let containedName = null\r\n if (options.with.indexOf(relationName) !== -1) {\r\n containedName = relationName\r\n } else if (options.with.indexOf(def.localField) !== -1) {\r\n containedName = def.localField\r\n }\r\n if (containedName) {\r\n let __options = DSUtils.deepMixIn({}, options.orig ? options.orig() : options)\r\n __options.with = options.with.slice()\r\n __options = DSUtils._(relationDef, __options)\r\n DSUtils.remove(__options.with, containedName)\r\n __options.with.forEach(function (relation, i) {\r\n if (relation && relation.indexOf(containedName) === 0 && relation.length >= containedName.length && relation[containedName.length] === '.') {\r\n __options.with[i] = relation.substr(containedName.length + 1)\r\n } else {\r\n __options.with[i] = ''\r\n }\r\n })\r\n\r\n let task\r\n\r\n if (def.foreignKey && (def.type === 'hasOne' || def.type === 'hasMany')) {\r\n if (def.type === 'hasOne') {\r\n task = self.loadHasOne(Resource, def, instance, __options)\r\n } else {\r\n task = self.loadHasMany(Resource, def, instance, __options)\r\n }\r\n } else if (def.type === 'hasMany' && def.localKeys) {\r\n let localKeys = []\r\n let itemKeys = instance[def.localKeys] || []\r\n itemKeys = DSUtils.isArray(itemKeys) ? itemKeys : DSUtils.keys(itemKeys)\r\n localKeys = localKeys.concat(itemKeys || [])\r\n task = self.findAll(Resource.getResource(relationName), {\r\n where: {\r\n [relationDef.idAttribute]: {\r\n 'in': unique(localKeys).filter((x) => x).map((x) => self.toObjectID(relationDef, x))\r\n }\r\n }\r\n }, __options).then(function (relatedItems) {\r\n DSUtils.set(instance, def.localField, relatedItems)\r\n return relatedItems\r\n })\r\n } else if (def.type === 'belongsTo' || (def.type === 'hasOne' && def.localKey)) {\r\n task = self.loadBelongsTo(Resource, def, instance, __options)\r\n }\r\n\r\n if (task) {\r\n tasks.push(task)\r\n }\r\n }\r\n })\r\n\r\n return DSUtils.Promise.all(tasks)\r\n }).then(function () {\r\n return instance\r\n })\r\n },\r\n\r\n /**\r\n * Retrieve the records that match the selection query.\r\n *\r\n * @name MongoDBAdapter#findAll\r\n * @method\r\n * @param {Object} Resource The Resource.\r\n * @param {Object} query Selection query.\r\n * @param {Object} [opts] Configuration options.\r\n * @param {string[]} [opts.with=[]] TODO\r\n * @return {Promise}\r\n */\r\n findAll (Resource, query, options) {\r\n const self = this\r\n let items = null\r\n options = self.origify(options ? DSUtils.copy(options) : {})\r\n options.with = options.with || []\r\n DSUtils.deepMixIn(options, self.getQueryOptions(Resource, query))\r\n const mongoQuery = self.getQuery(Resource, query)\r\n return self.getClient().then(function (client) {\r\n return new DSUtils.Promise(function (resolve, reject) {\r\n options.fields = options.fields || {}\r\n client.collection(Resource.table || underscore(Resource.name)).find(mongoQuery, options).toArray((err, r) => {\r\n if (err) {\r\n reject(err)\r\n } else {\r\n resolve(self.translateId(r, options))\r\n }\r\n })\r\n })\r\n }).then(function (_items) {\r\n items = _items\r\n let tasks = []\r\n const relationList = Resource.relationList || []\r\n relationList.forEach(function (def) {\r\n let relationName = def.relation\r\n let relationDef = Resource.getResource(relationName)\r\n let containedName = null\r\n if (options.with.indexOf(relationName) !== -1) {\r\n containedName = relationName\r\n } else if (options.with.indexOf(def.localField) !== -1) {\r\n containedName = def.localField\r\n }\r\n if (containedName) {\r\n let __options = DSUtils.deepMixIn({}, options.orig ? options.orig() : options)\r\n __options.with = options.with.slice()\r\n __options = DSUtils._(relationDef, __options)\r\n DSUtils.remove(__options.with, containedName)\r\n __options.with.forEach(function (relation, i) {\r\n if (relation && relation.indexOf(containedName) === 0 && relation.length >= containedName.length && relation[containedName.length] === '.') {\r\n __options.with[i] = relation.substr(containedName.length + 1)\r\n } else {\r\n __options.with[i] = ''\r\n }\r\n })\r\n\r\n let task\r\n\r\n if (def.foreignKey && (def.type === 'hasOne' || def.type === 'hasMany')) {\r\n if (def.type === 'hasMany') {\r\n task = self.loadHasMany(Resource, def, items, __options)\r\n } else {\r\n task = self.loadHasOne(Resource, def, items, __options)\r\n }\r\n } else if (def.type === 'hasMany' && def.localKeys) {\r\n let localKeys = []\r\n items.forEach(function (item) {\r\n let itemKeys = item[def.localKeys] || []\r\n itemKeys = DSUtils.isArray(itemKeys) ? itemKeys : Object.keys(itemKeys)\r\n localKeys = localKeys.concat(itemKeys || [])\r\n })\r\n task = self.findAll(Resource.getResource(relationName), {\r\n where: {\r\n [relationDef.idAttribute]: {\r\n 'in': unique(localKeys).filter((x) => x).map((x) => self.toObjectID(relationDef, x))\r\n }\r\n }\r\n }, __options).then(function (relatedItems) {\r\n items.forEach(function (item) {\r\n let attached = []\r\n let itemKeys = item[def.localKeys] || []\r\n itemKeys = DSUtils.isArray(itemKeys) ? itemKeys : DSUtils.keys(itemKeys)\r\n relatedItems.forEach(function (relatedItem) {\r\n if (itemKeys && itemKeys.indexOf(relatedItem[relationDef.idAttribute]) !== -1) {\r\n attached.push(relatedItem)\r\n }\r\n })\r\n DSUtils.set(item, def.localField, attached)\r\n })\r\n return relatedItems\r\n })\r\n } else if (def.type === 'belongsTo' || (def.type === 'hasOne' && def.localKey)) {\r\n task = self.loadBelongsTo(Resource, def, items, __options)\r\n }\r\n\r\n if (task) {\r\n tasks.push(task)\r\n }\r\n }\r\n })\r\n return DSUtils.Promise.all(tasks)\r\n }).then(function () {\r\n return items\r\n })\r\n },\r\n\r\n /**\r\n * Create a new record.\r\n *\r\n * @name MongoDBAdapter#create\r\n * @method\r\n * @param {Object} Resource The Resource.\r\n * @param {Object} props The record to be created.\r\n * @param {Object} [opts] Configuration options.\r\n * @return {Promise}\r\n */\r\n create (Resource, props, opts) {\r\n const self = this\r\n props = DSUtils.removeCircular(DSUtils.omit(props, Resource.relationFields || []))\r\n opts = self.origify(opts)\r\n\r\n return self.getClient().then(function (client) {\r\n return new DSUtils.Promise(function (resolve, reject) {\r\n const collection = client.collection(Resource.table || underscore(Resource.name))\r\n const method = collection.insertOne ? DSUtils.isArray(props) ? 'insertMany' : 'insertOne' : 'insert'\r\n collection[method](props, opts, function (err, r) {\r\n if (err) {\r\n reject(err)\r\n } else {\r\n r = r.ops ? r.ops : r\r\n self.translateId(r, opts)\r\n resolve(DSUtils.isArray(props) ? r : r[0])\r\n }\r\n })\r\n })\r\n })\r\n },\r\n\r\n /**\r\n * Destroy the record with the given primary key.\r\n *\r\n * @name MongoDBAdapter#destroy\r\n * @method\r\n * @param {Object} Resource The Resource.\r\n * @param {(string|number)} id Primary key of the record to destroy.\r\n * @param {Object} [opts] Configuration options.\r\n * @return {Promise}\r\n */\r\n destroy (Resource, id, opts) {\r\n const self = this\r\n opts = self.origify(opts)\r\n\r\n return self.getClient().then(function (client) {\r\n return new DSUtils.Promise(function (resolve, reject) {\r\n const mongoQuery = {}\r\n mongoQuery[Resource.idAttribute] = self.toObjectID(Resource, id)\r\n const collection = client.collection(Resource.table || underscore(Resource.name))\r\n collection[collection.deleteOne ? 'deleteOne' : 'remove'](mongoQuery, opts, function (err) {\r\n if (err) {\r\n reject(err)\r\n } else {\r\n resolve()\r\n }\r\n })\r\n })\r\n })\r\n },\r\n\r\n /**\r\n * Destroy the records that match the selection query.\r\n *\r\n * @name MongoDBAdapter#destroyAll\r\n * @method\r\n * @param {Object} Resource the Resource.\r\n * @param {Object} [query] Selection query.\r\n * @param {Object} [opts] Configuration options.\r\n * @return {Promise}\r\n */\r\n destroyAll (Resource, query, opts) {\r\n const self = this\r\n opts = self.origify(opts ? DSUtils.copy(opts) : {})\r\n\r\n return self.getClient().then(function (client) {\r\n DSUtils.deepMixIn(opts, self.getQueryOptions(Resource, query))\r\n const mongoQuery = self.getQuery(Resource, query)\r\n return new DSUtils.Promise(function (resolve, reject) {\r\n const collection = client.collection(Resource.table || underscore(Resource.name))\r\n collection[collection.deleteMany ? 'deleteMany' : 'remove'](mongoQuery, opts, function (err) {\r\n if (err) {\r\n reject(err)\r\n } else {\r\n resolve()\r\n }\r\n })\r\n })\r\n })\r\n },\r\n\r\n /**\r\n * Apply the given update to the record with the specified primary key.\r\n *\r\n * @name MongoDBAdapter#update\r\n * @method\r\n * @param {Object} Resource The Resource.\r\n * @param {(string|number)} id The primary key of the record to be updated.\r\n * @param {Object} props The update to apply to the record.\r\n * @param {Object} [opts] Configuration options.\r\n * @return {Promise}\r\n */\r\n update (Resource, id, props, opts) {\r\n const self = this\r\n props = DSUtils.removeCircular(DSUtils.omit(props, Resource.relationFields || []))\r\n opts = self.origify(opts)\r\n\r\n return self.find(Resource, id, opts).then(function () {\r\n return self.getClient()\r\n }).then(function (client) {\r\n return new DSUtils.Promise(function (resolve, reject) {\r\n const mongoQuery = {}\r\n mongoQuery[Resource.idAttribute] = self.toObjectID(Resource, id)\r\n const collection = client.collection(Resource.table || underscore(Resource.name))\r\n collection[collection.updateOne ? 'updateOne' : 'update'](mongoQuery, { $set: props }, opts, function (err) {\r\n if (err) {\r\n reject(err)\r\n } else {\r\n resolve()\r\n }\r\n })\r\n })\r\n }).then(function () {\r\n return self.find(Resource, id, opts)\r\n })\r\n },\r\n\r\n /**\r\n * Apply the given update to all records that match the selection query.\r\n *\r\n * @name MongoDBAdapter#updateAll\r\n * @method\r\n * @param {Object} Resource The Resource.\r\n * @param {Object} props The update to apply to the selected records.\r\n * @param {Object} [query] Selection query.\r\n * @param {Object} [opts] Configuration options.\r\n * @return {Promise}\r\n */\r\n updateAll (Resource, props, query, opts) {\r\n const self = this\r\n let ids = []\r\n props = DSUtils.removeCircular(DSUtils.omit(props, Resource.relationFields || []))\r\n opts = self.origify(opts ? DSUtils.copy(opts) : {})\r\n const mongoOptions = DSUtils.copy(opts)\r\n mongoOptions.multi = true\r\n\r\n return self.getClient().then(function (client) {\r\n const queryOptions = self.getQueryOptions(Resource, query)\r\n queryOptions.$set = props\r\n const mongoQuery = self.getQuery(Resource, query)\r\n\r\n return self.findAll(Resource, query, opts).then(function (items) {\r\n ids = items.map(function (item) {\r\n return self.toObjectID(Resource, item[Resource.idAttribute])\r\n })\r\n\r\n return new DSUtils.Promise(function (resolve, reject) {\r\n const collection = client.collection(Resource.table || underscore(Resource.name))\r\n collection[collection.updateMany ? 'updateMany' : 'update'](mongoQuery, queryOptions, mongoOptions, function (err) {\r\n if (err) {\r\n reject(err)\r\n } else {\r\n resolve()\r\n }\r\n })\r\n })\r\n }).then(function () {\r\n const query = {}\r\n query[Resource.idAttribute] = {\r\n 'in': ids\r\n }\r\n return self.findAll(Resource, query, opts)\r\n })\r\n })\r\n }\r\n})\r\n"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/package.json b/package.json index 4ab2bcb..b253480 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "js-data-mongodb", "description": "MongoDB adapter for js-data.", - "version": "0.6.0", + "version": "0.7.0", "homepage": "https://github.com/js-data/js-data-mongodb", "repository": { "type": "git", @@ -28,7 +28,8 @@ ] }, "scripts": { - "bundle": "webpack --config webpack.config.js --colors", + "doc": "jsdoc -c conf.json src && node scripts/cleanup.js", + "bundle": "rollup -c rollup.config.js -f cjs -o dist/js-data-mongodb.js -m dist/js-data-mongodb.js.map src/index.js", "lint": "standard src/**/*.js mocha.start.js test/**/*.js", "build": "npm run lint && npm run bundle", "mocha": "mocha -t 20000 -R dot -r source-map-support mocha.start.js", @@ -39,19 +40,20 @@ "devDependencies": { "babel-core": "6.5.2", "babel-eslint": "5.0.0", - "babel-loader": "6.2.3", "babel-polyfill": "6.5.0", - "babel-preset-es2015": "6.5.0", - "bluebird": "3.3.1", + "babel-preset-es2015-rollup": "1.1.1", "chai": "3.5.0", "codacy-coverage": "1.1.3", "coveralls": "2.11.6", + "ink-docstrap": "1.1.2", "istanbul": "0.4.2", "js-data-adapter-tests": "^1.5.0", + "jsdoc": "3.4.0", "mocha": "2.4.5", + "rollup": "0.25.4", + "rollup-plugin-babel": "2.3.9", "source-map-support": "0.4.0", - "standard": "6.0.6", - "webpack": "1.12.13" + "standard": "6.0.7" }, "dependencies": { "bson": "^0.4.x || ^0.3.x", diff --git a/rollup.config.js b/rollup.config.js new file mode 100644 index 0000000..56e61c4 --- /dev/null +++ b/rollup.config.js @@ -0,0 +1,7 @@ +var babel = require('rollup-plugin-babel') + +module.exports = { + plugins: [ + babel() + ] +} diff --git a/scripts/cleanup.js b/scripts/cleanup.js new file mode 100644 index 0000000..d0829a4 --- /dev/null +++ b/scripts/cleanup.js @@ -0,0 +1,25 @@ +var fs = require('fs') + +var pkg = require('../package.json') + +var path = './doc/js-data-mongodb/' + pkg.version + '/styles/' + +var files = fs.readdirSync(path) +files.forEach(function (file) { + if (file.indexOf('site') === 0) { + if (file.indexOf('lumen') === -1 && file.indexOf('dibs') === -1) { + fs.unlinkSync(path + file) + } + } +}) + +path = './doc/js-data-mongodb/' + pkg.version + +files = fs.readdirSync(path) +files.forEach(function (file) { + if (file.indexOf('.html') === file.length - 5) { + var content = fs.readFileSync(path + '/' + file, { encoding: 'utf8' }) + content = content.replace(/\/home\/ubuntu\/workspace\//gi, '') + fs.writeFileSync(path + '/' + file, content, { encoding: 'utf8' }) + } +}) diff --git a/src/index.js b/src/index.js index 7baee4e..ce83112 100644 --- a/src/index.js +++ b/src/index.js @@ -1,11 +1,9 @@ const mongodb = require('mongodb') const MongoClient = mongodb.MongoClient const bson = require('bson') -const map = require('mout/array/map') const ObjectID = bson.ObjectID const JSData = require('js-data') const underscore = require('mout/string/underscore') -const unique = require('mout/array/unique') const { DSUtils } = JSData const reserved = [ @@ -17,232 +15,499 @@ const reserved = [ 'where' ] -class Defaults { +function Defaults () {} +Defaults.prototype.translateId = true + +const addHiddenPropsToTarget = function (target, props) { + DSUtils.forOwn(props, function (value, key) { + props[key] = { + writable: true, + value + } + }) + Object.defineProperties(target, props) } -Defaults.prototype.translateId = true +const fillIn = function (dest, src) { + DSUtils.forOwn(src, function (value, key) { + if (!dest.hasOwnProperty(key) || dest[key] === undefined) { + dest[key] = value + } + }) +} -class DSMongoDBAdapter { - constructor (opts) { - if (typeof opts === 'string') { - opts = { uri: opts } +function unique (array) { + const seen = {} + const final = [] + array.forEach(function (item) { + if (item in seen) { + return } - opts.uri || (opts.uri = 'mongodb://localhost:27017') - this.defaults = new Defaults() - DSUtils.deepMixIn(this.defaults, opts) - this.client = new DSUtils.Promise(function (resolve, reject) { - MongoClient.connect(opts.uri, function (err, db) { - return err ? reject(err) : resolve(db) - }) - }) + final.push(item) + seen[item] = 0 + }) + return final +} + +/** + * MongoDBAdapter class. + * + * @example + * import {DS} from 'js-data' + * import MongoDBAdapter from 'js-data-mongodb' + * const store = new DS() + * const adapter = new MongoDBAdapter({ + * uri: 'mongodb://localhost:27017' + * }) + * store.registerAdapter('mongodb', adapter, { 'default': true }) + * + * @class MongoDBAdapter + * @param {Object} [opts] Configuration opts. + * @param {string} [opts.uri=''] MongoDB URI. + */ +export default function MongoDBAdapter (opts) { + const self = this + if (typeof opts === 'string') { + opts = { uri: opts } } + opts.uri || (opts.uri = 'mongodb://localhost:27017') + self.defaults = new Defaults() + DSUtils.deepMixIn(self.defaults, opts) + fillIn(self, opts) + + /** + * A Promise that resolves to a reference to the MongoDB client being used by + * this adapter. + * + * @name MongoDBAdapter#client + * @type {Object} + */ + self.client = new DSUtils.Promise(function (resolve, reject) { + MongoClient.connect(opts.uri, function (err, db) { + return err ? reject(err) : resolve(db) + }) + }) +} +addHiddenPropsToTarget(MongoDBAdapter.prototype, { + /** + * Return a Promise that resolves to a reference to the MongoDB client being + * used by this adapter. + * + * Useful when you need to do anything custom with the MongoDB client library. + * + * @name MongoDBAdapter#getClient + * @method + * @return {Object} MongoDB client. + */ getClient () { return this.client - } - - getQuery (resourceConfig, params) { - params = params || {} - params.where = params.where || {} - - DSUtils.forOwn(params, function (v, k) { + }, + + /** + * Map filtering params in a selection query to MongoDB a filtering object. + * + * Handles the following: + * + * - where + * - and bunch of filtering operators + * + * @name MongoDBAdapter#getQuery + * @method + * @return {Object} + */ + getQuery (Resource, query) { + query || (query = {}) + query.where || (query.where = {}) + + DSUtils.forOwn(query, function (v, k) { if (reserved.indexOf(k) === -1) { if (DSUtils.isObject(v)) { - params.where[k] = v + query.where[k] = v } else { - params.where[k] = { + query.where[k] = { '==': v } } - delete params[k] + delete query[k] } }) - let query = {} + let mongoQuery = {} - if (Object.keys(params.where).length) { - DSUtils.forOwn(params.where, function (criteria, field) { + if (Object.keys(query.where).length) { + DSUtils.forOwn(query.where, function (criteria, field) { if (!DSUtils.isObject(criteria)) { - params.where[field] = { + query.where[field] = { '==': criteria } } DSUtils.forOwn(criteria, function (v, op) { if (op === '==' || op === '===') { - query[field] = v + mongoQuery[field] = v } else if (op === '!=' || op === '!==') { - query[field] = query[field] || {} - query[field].$ne = v + mongoQuery[field] = mongoQuery[field] || {} + mongoQuery[field].$ne = v } else if (op === '>') { - query[field] = query[field] || {} - query[field].$gt = v + mongoQuery[field] = mongoQuery[field] || {} + mongoQuery[field].$gt = v } else if (op === '>=') { - query[field] = query[field] || {} - query[field].$gte = v + mongoQuery[field] = mongoQuery[field] || {} + mongoQuery[field].$gte = v } else if (op === '<') { - query[field] = query[field] || {} - query[field].$lt = v + mongoQuery[field] = mongoQuery[field] || {} + mongoQuery[field].$lt = v } else if (op === '<=') { - query[field] = query[field] || {} - query[field].$lte = v + mongoQuery[field] = mongoQuery[field] || {} + mongoQuery[field].$lte = v } else if (op === 'in') { - query[field] = query[field] || {} - query[field].$in = v + mongoQuery[field] = mongoQuery[field] || {} + mongoQuery[field].$in = v } else if (op === 'notIn') { - query[field] = query[field] || {} - query[field].$nin = v + mongoQuery[field] = mongoQuery[field] || {} + mongoQuery[field].$nin = v } else if (op === '|==' || op === '|===') { - query.$or = query.$or || [] + mongoQuery.$or = mongoQuery.$or || [] let orEqQuery = {} orEqQuery[field] = v - query.$or.push(orEqQuery) + mongoQuery.$or.push(orEqQuery) } else if (op === '|!=' || op === '|!==') { - query.$or = query.$or || [] + mongoQuery.$or = mongoQuery.$or || [] let orNeQuery = {} orNeQuery[field] = { '$ne': v } - query.$or.push(orNeQuery) + mongoQuery.$or.push(orNeQuery) } else if (op === '|>') { - query.$or = query.$or || [] + mongoQuery.$or = mongoQuery.$or || [] let orGtQuery = {} orGtQuery[field] = { '$gt': v } - query.$or.push(orGtQuery) + mongoQuery.$or.push(orGtQuery) } else if (op === '|>=') { - query.$or = query.$or || [] + mongoQuery.$or = mongoQuery.$or || [] let orGteQuery = {} orGteQuery[field] = { '$gte': v } - query.$or.push(orGteQuery) + mongoQuery.$or.push(orGteQuery) } else if (op === '|<') { - query.$or = query.$or || [] + mongoQuery.$or = mongoQuery.$or || [] let orLtQuery = {} orLtQuery[field] = { '$lt': v } - query.$or.push(orLtQuery) + mongoQuery.$or.push(orLtQuery) } else if (op === '|<=') { - query.$or = query.$or || [] + mongoQuery.$or = mongoQuery.$or || [] let orLteQuery = {} orLteQuery[field] = { '$lte': v } - query.$or.push(orLteQuery) + mongoQuery.$or.push(orLteQuery) } else if (op === '|in') { - query.$or = query.$or || [] + mongoQuery.$or = mongoQuery.$or || [] let orInQuery = {} orInQuery[field] = { '$in': v } - query.$or.push(orInQuery) + mongoQuery.$or.push(orInQuery) } else if (op === '|notIn') { - query.$or = query.$or || [] + mongoQuery.$or = mongoQuery.$or || [] let orNinQuery = {} orNinQuery[field] = { '$nin': v } - query.$or.push(orNinQuery) + mongoQuery.$or.push(orNinQuery) } }) }) } - return query - } - - getQueryOptions (resourceConfig, params) { - params = params || {} - params.orderBy = params.orderBy || params.sort - params.skip = params.skip || params.offset + return mongoQuery + }, + + /** + * Map non-filtering params in a selection query to MongoDB query options. + * + * Handles the following: + * + * - limit + * - skip/offset + * - orderBy/sort + * + * @name MongoDBAdapter#getQueryOptions + * @method + * @return {Object} + */ + getQueryOptions (Resource, query) { + query = query || {} + query.orderBy = query.orderBy || query.sort + query.skip = query.skip || query.offset let queryOptions = {} - if (params.orderBy) { - if (DSUtils.isString(params.orderBy)) { - params.orderBy = [ - [params.orderBy, 'asc'] + if (query.orderBy) { + if (DSUtils.isString(query.orderBy)) { + query.orderBy = [ + [query.orderBy, 'asc'] ] } - for (var i = 0; i < params.orderBy.length; i++) { - if (DSUtils.isString(params.orderBy[i])) { - params.orderBy[i] = [params.orderBy[i], 'asc'] + for (var i = 0; i < query.orderBy.length; i++) { + if (DSUtils.isString(query.orderBy[i])) { + query.orderBy[i] = [query.orderBy[i], 'asc'] } } - queryOptions.sort = params.orderBy + queryOptions.sort = query.orderBy } - if (params.skip) { - queryOptions.skip = +params.skip + if (query.skip) { + queryOptions.skip = +query.skip } - if (params.limit) { - queryOptions.limit = +params.limit + if (query.limit) { + queryOptions.limit = +query.limit } return queryOptions - } - - translateId (r, options) { - options = options || {} - if (typeof options.translateId === 'boolean' ? options.translateId : this.defaults.translateId) { - if (Array.isArray(r)) { - r.forEach((_r) => { - let __id = _r._id ? _r._id.toString() : _r._id + }, + + /** + * TODO + * + * @name MongoDBAdapter#translateId + * @method + * @return {*} + */ + translateId (r, opts) { + opts || (opts = {}) + if (typeof opts.translateId === 'boolean' ? opts.translateId : this.defaults.translateId) { + if (DSUtils.isArray(r)) { + r.forEach(function (_r) { + const __id = _r._id ? _r._id.toString() : _r._id _r._id = typeof __id === 'string' ? __id : _r._id }) } else if (DSUtils.isObject(r)) { - let __id = r._id ? r._id.toString() : r._id + const __id = r._id ? r._id.toString() : r._id r._id = typeof __id === 'string' ? __id : r._id } } return r - } - - origify (options) { - options = options || {} - if (typeof options.orig === 'function') { - return options.orig() + }, + + /** + * TODO + * + * @name MongoDBAdapter#origify + * @method + * @return {Object} + */ + origify (opts) { + opts = opts || {} + if (typeof opts.orig === 'function') { + return opts.orig() } - return options - } - - find (resourceConfig, id, options) { - let instance - options = this.origify(options) - options.with = options.with || [] - return this.getClient().then((client) => { - return new DSUtils.Promise((resolve, reject) => { - let params = {} - params[resourceConfig.idAttribute] = id - if (resourceConfig.idAttribute === '_id' && typeof id === 'string' && ObjectID.isValid(id)) { - params[resourceConfig.idAttribute] = ObjectID.createFromHexString(id) + return opts + }, + + /** + * TODO + * + * @name MongoDBAdapter#makeHasManyForeignKey + * @method + * @return {*} + */ + toObjectID (Resource, id) { + if (id !== undefined && Resource.idAttribute === '_id' && typeof id === 'string' && ObjectID.isValid(id) && !(id instanceof ObjectID)) { + return new ObjectID(id) + } + return id + }, + + /** + * TODO + * + * If the foreignKeys in your database are saved as ObjectIDs, then override + * this method and change it to something like: + * + * ``` + * return this.toObjectID(Resource, this.constructor.prototype.makeHasManyForeignKey.call(this, Resource, def, record)) + * ``` + * + * There may be other reasons why you may want to override this method, like + * when the id of the parent doesn't exactly match up to the key on the child. + * + * @name MongoDBAdapter#makeHasManyForeignKey + * @method + * @return {*} + */ + makeHasManyForeignKey (Resource, def, record) { + return DSUtils.get(record, Resource.idAttribute) + }, + + /** + * TODO + * + * @name MongoDBAdapter#loadHasMany + * @method + * @return {Promise} + */ + loadHasMany (Resource, def, records, __options) { + const self = this + let singular = false + + if (DSUtils.isObject(records) && !DSUtils.isArray(records)) { + singular = true + records = [records] + } + const IDs = records.map(function (record) { + return self.makeHasManyForeignKey(Resource, def, record) + }) + const query = {} + const criteria = query[def.foreignKey] = {} + if (singular) { + // more efficient query when we only have one record + criteria['=='] = IDs[0] + } else { + criteria['in'] = IDs.filter(function (id) { + return id + }) + } + return self.findAll(Resource.getResource(def.relation), query, __options).then(function (relatedItems) { + records.forEach(function (record) { + let attached = [] + // avoid unneccesary iteration when we only have one record + if (singular) { + attached = relatedItems + } else { + relatedItems.forEach(function (relatedItem) { + if (DSUtils.get(relatedItem, def.foreignKey) === record[Resource.idAttribute]) { + attached.push(relatedItem) + } + }) + } + DSUtils.set(record, def.localField, attached) + }) + }) + }, + + /** + * TODO + * + * @name MongoDBAdapter#loadHasOne + * @method + * @return {Promise} + */ + loadHasOne (Resource, def, records, __options) { + if (DSUtils.isObject(records) && !DSUtils.isArray(records)) { + records = [records] + } + return this.loadHasMany(Resource, def, records, __options).then(function () { + records.forEach(function (record) { + const relatedData = DSUtils.get(record, def.localField) + if (DSUtils.isArray(relatedData) && relatedData.length) { + DSUtils.set(record, def.localField, relatedData[0]) + } + }) + }) + }, + + /** + * TODO + * + * @name MongoDBAdapter#makeBelongsToForeignKey + * @method + * @return {*} + */ + makeBelongsToForeignKey (Resource, def, record) { + return this.toObjectID(Resource.getResource(def.relation), DSUtils.get(record, def.localKey)) + }, + + /** + * TODO + * + * @name MongoDBAdapter#loadBelongsTo + * @method + * @return {Promise} + */ + loadBelongsTo (Resource, def, records, __options) { + const self = this + const relationDef = Resource.getResource(def.relation) + + if (DSUtils.isObject(records) && !DSUtils.isArray(records)) { + const record = records + return self.find(relationDef, self.makeBelongsToForeignKey(Resource, def, record), __options).then(function (relatedItem) { + DSUtils.set(record, def.localField, relatedItem) + }) + } else { + const keys = records.map(function (record) { + return self.makeBelongsToForeignKey(Resource, def, record) + }).filter(function (key) { + return key + }) + return self.findAll(relationDef, { + where: { + [relationDef.idAttribute]: { + 'in': keys + } } + }, __options).then(function (relatedItems) { + records.forEach(function (record) { + relatedItems.forEach(function (relatedItem) { + if (relatedItem[relationDef.idAttribute] === record[def.localKey]) { + DSUtils.set(record, def.localField, relatedItem) + } + }) + }) + }) + } + }, + + /** + * Retrieve the record with the given primary key. + * + * @name MongoDBAdapter#find + * @method + * @param {Object} Resource The Resource. + * @param {(string|number)} id Primary key of the record to retrieve. + * @param {Object} [opts] Configuration options. + * @param {string[]} [opts.with=[]] TODO + * @return {Promise} + */ + find (Resource, id, options) { + const self = this + let instance + options = self.origify(options) + options.with || (options.with = []) + return self.getClient().then(function (client) { + return new DSUtils.Promise(function (resolve, reject) { + let mongoQuery = {} + mongoQuery[Resource.idAttribute] = self.toObjectID(Resource, id) options.fields = options.fields || {} - client.collection(resourceConfig.table || underscore(resourceConfig.name)).findOne(params, options, (err, r) => { + client.collection(Resource.table || underscore(Resource.name)).findOne(mongoQuery, options, function (err, r) { if (err) { reject(err) } else if (!r) { reject(new Error('Not Found!')) } else { - resolve(this.translateId(r, options)) + resolve(self.translateId(r, options)) } }) }) - }).then((_instance) => { + }).then(function (_instance) { instance = _instance let tasks = [] + const relationList = Resource.relationList || [] - DSUtils.forEach(resourceConfig.relationList, (def) => { + relationList.forEach(function (def) { let relationName = def.relation - let relationDef = resourceConfig.getResource(relationName) + let relationDef = Resource.getResource(relationName) let containedName = null - if (DSUtils.contains(options.with, relationName)) { + if (options.with.indexOf(relationName) !== -1) { containedName = relationName - } else if (DSUtils.contains(options.with, def.localField)) { + } else if (options.with.indexOf(def.localField) !== -1) { containedName = def.localField } if (containedName) { @@ -250,7 +515,7 @@ class DSMongoDBAdapter { __options.with = options.with.slice() __options = DSUtils._(relationDef, __options) DSUtils.remove(__options.with, containedName) - DSUtils.forEach(__options.with, (relation, i) => { + __options.with.forEach(function (relation, i) { if (relation && relation.indexOf(containedName) === 0 && relation.length >= containedName.length && relation[containedName.length] === '.') { __options.with[i] = relation.substr(containedName.length + 1) } else { @@ -260,41 +525,29 @@ class DSMongoDBAdapter { let task - if ((def.type === 'hasOne' || def.type === 'hasMany') && def.foreignKey) { - task = this.findAll(resourceConfig.getResource(relationName), { - where: { - [def.foreignKey]: { - '==': instance[resourceConfig.idAttribute] - } - } - }, __options).then((relatedItems) => { - if (def.type === 'hasOne' && relatedItems.length) { - DSUtils.set(instance, def.localField, relatedItems[0]) - } else { - DSUtils.set(instance, def.localField, relatedItems) - } - return relatedItems - }) + if (def.foreignKey && (def.type === 'hasOne' || def.type === 'hasMany')) { + if (def.type === 'hasOne') { + task = self.loadHasOne(Resource, def, instance, __options) + } else { + task = self.loadHasMany(Resource, def, instance, __options) + } } else if (def.type === 'hasMany' && def.localKeys) { let localKeys = [] let itemKeys = instance[def.localKeys] || [] - itemKeys = Array.isArray(itemKeys) ? itemKeys : DSUtils.keys(itemKeys) + itemKeys = DSUtils.isArray(itemKeys) ? itemKeys : DSUtils.keys(itemKeys) localKeys = localKeys.concat(itemKeys || []) - task = this.findAll(resourceConfig.getResource(relationName), { + task = self.findAll(Resource.getResource(relationName), { where: { [relationDef.idAttribute]: { - 'in': map(DSUtils.filter(unique(localKeys), (x) => x), (x) => new ObjectID(x)) + 'in': unique(localKeys).filter((x) => x).map((x) => self.toObjectID(relationDef, x)) } } - }, __options).then((relatedItems) => { + }, __options).then(function (relatedItems) { DSUtils.set(instance, def.localField, relatedItems) return relatedItems }) } else if (def.type === 'belongsTo' || (def.type === 'hasOne' && def.localKey)) { - task = this.find(resourceConfig.getResource(relationName), DSUtils.get(instance, def.localKey), __options).then((relatedItem) => { - DSUtils.set(instance, def.localField, relatedItem) - return relatedItem - }) + task = self.loadBelongsTo(Resource, def, instance, __options) } if (task) { @@ -304,36 +557,51 @@ class DSMongoDBAdapter { }) return DSUtils.Promise.all(tasks) - }).then(() => instance) - } - - findAll (resourceConfig, params, options) { + }).then(function () { + return instance + }) + }, + + /** + * Retrieve the records that match the selection query. + * + * @name MongoDBAdapter#findAll + * @method + * @param {Object} Resource The Resource. + * @param {Object} query Selection query. + * @param {Object} [opts] Configuration options. + * @param {string[]} [opts.with=[]] TODO + * @return {Promise} + */ + findAll (Resource, query, options) { + const self = this let items = null - options = this.origify(options ? DSUtils.copy(options) : {}) + options = self.origify(options ? DSUtils.copy(options) : {}) options.with = options.with || [] - DSUtils.deepMixIn(options, this.getQueryOptions(resourceConfig, params)) - let query = this.getQuery(resourceConfig, params) - return this.getClient().then((client) => { - return new DSUtils.Promise((resolve, reject) => { + DSUtils.deepMixIn(options, self.getQueryOptions(Resource, query)) + const mongoQuery = self.getQuery(Resource, query) + return self.getClient().then(function (client) { + return new DSUtils.Promise(function (resolve, reject) { options.fields = options.fields || {} - client.collection(resourceConfig.table || underscore(resourceConfig.name)).find(query, options).toArray((err, r) => { + client.collection(Resource.table || underscore(Resource.name)).find(mongoQuery, options).toArray((err, r) => { if (err) { reject(err) } else { - resolve(this.translateId(r, options)) + resolve(self.translateId(r, options)) } }) }) - }).then((_items) => { + }).then(function (_items) { items = _items let tasks = [] - DSUtils.forEach(resourceConfig.relationList, (def) => { + const relationList = Resource.relationList || [] + relationList.forEach(function (def) { let relationName = def.relation - let relationDef = resourceConfig.getResource(relationName) + let relationDef = Resource.getResource(relationName) let containedName = null - if (DSUtils.contains(options.with, relationName)) { + if (options.with.indexOf(relationName) !== -1) { containedName = relationName - } else if (DSUtils.contains(options.with, def.localField)) { + } else if (options.with.indexOf(def.localField) !== -1) { containedName = def.localField } if (containedName) { @@ -341,7 +609,7 @@ class DSMongoDBAdapter { __options.with = options.with.slice() __options = DSUtils._(relationDef, __options) DSUtils.remove(__options.with, containedName) - DSUtils.forEach(__options.with, (relation, i) => { + __options.with.forEach(function (relation, i) { if (relation && relation.indexOf(containedName) === 0 && relation.length >= containedName.length && relation[containedName.length] === '.') { __options.with[i] = relation.substr(containedName.length + 1) } else { @@ -351,49 +619,32 @@ class DSMongoDBAdapter { let task - if ((def.type === 'hasOne' || def.type === 'hasMany') && def.foreignKey) { - task = this.findAll(resourceConfig.getResource(relationName), { - where: { - [def.foreignKey]: { - 'in': DSUtils.filter(map(items, (item) => DSUtils.get(item, resourceConfig.idAttribute)), (x) => x) - } - } - }, __options).then((relatedItems) => { - DSUtils.forEach(items, (item) => { - let attached = [] - DSUtils.forEach(relatedItems, (relatedItem) => { - if (DSUtils.get(relatedItem, def.foreignKey) === item[resourceConfig.idAttribute]) { - attached.push(relatedItem) - } - }) - if (def.type === 'hasOne' && attached.length) { - DSUtils.set(item, def.localField, attached[0]) - } else { - DSUtils.set(item, def.localField, attached) - } - }) - return relatedItems - }) + if (def.foreignKey && (def.type === 'hasOne' || def.type === 'hasMany')) { + if (def.type === 'hasMany') { + task = self.loadHasMany(Resource, def, items, __options) + } else { + task = self.loadHasOne(Resource, def, items, __options) + } } else if (def.type === 'hasMany' && def.localKeys) { let localKeys = [] - DSUtils.forEach(items, (item) => { + items.forEach(function (item) { let itemKeys = item[def.localKeys] || [] - itemKeys = Array.isArray(itemKeys) ? itemKeys : DSUtils.keys(itemKeys) + itemKeys = DSUtils.isArray(itemKeys) ? itemKeys : Object.keys(itemKeys) localKeys = localKeys.concat(itemKeys || []) }) - task = this.findAll(resourceConfig.getResource(relationName), { + task = self.findAll(Resource.getResource(relationName), { where: { [relationDef.idAttribute]: { - 'in': map(DSUtils.filter(unique(localKeys), (x) => x), (x) => new ObjectID(x)) + 'in': unique(localKeys).filter((x) => x).map((x) => self.toObjectID(relationDef, x)) } } - }, __options).then((relatedItems) => { - DSUtils.forEach(items, (item) => { + }, __options).then(function (relatedItems) { + items.forEach(function (item) { let attached = [] let itemKeys = item[def.localKeys] || [] - itemKeys = Array.isArray(itemKeys) ? itemKeys : DSUtils.keys(itemKeys) - DSUtils.forEach(relatedItems, (relatedItem) => { - if (itemKeys && DSUtils.contains(itemKeys, relatedItem[relationDef.idAttribute])) { + itemKeys = DSUtils.isArray(itemKeys) ? itemKeys : DSUtils.keys(itemKeys) + relatedItems.forEach(function (relatedItem) { + if (itemKeys && itemKeys.indexOf(relatedItem[relationDef.idAttribute]) !== -1) { attached.push(relatedItem) } }) @@ -402,22 +653,7 @@ class DSMongoDBAdapter { return relatedItems }) } else if (def.type === 'belongsTo' || (def.type === 'hasOne' && def.localKey)) { - task = this.findAll(resourceConfig.getResource(relationName), { - where: { - [relationDef.idAttribute]: { - 'in': map(DSUtils.filter(map(items, (item) => DSUtils.get(item, def.localKey)), (x) => x), (x) => new ObjectID(x)) - } - } - }, __options).then((relatedItems) => { - DSUtils.forEach(items, (item) => { - DSUtils.forEach(relatedItems, (relatedItem) => { - if (relatedItem[relationDef.idAttribute] === item[def.localKey]) { - DSUtils.set(item, def.localField, relatedItem) - } - }) - }) - return relatedItems - }) + task = self.loadBelongsTo(Resource, def, items, __options) } if (task) { @@ -426,43 +662,63 @@ class DSMongoDBAdapter { } }) return DSUtils.Promise.all(tasks) - }).then(() => items) - } - - create (resourceConfig, attrs, options) { - options = this.origify(options) - attrs = DSUtils.removeCircular(DSUtils.omit(attrs, resourceConfig.relationFields || [])) - return this.getClient().then((client) => { - return new DSUtils.Promise((resolve, reject) => { - let collection = client.collection(resourceConfig.table || underscore(resourceConfig.name)) - let method = collection.insertOne ? DSUtils.isArray(attrs) ? 'insertMany' : 'insertOne' : 'insert' - collection[method](attrs, options, (err, r) => { + }).then(function () { + return items + }) + }, + + /** + * Create a new record. + * + * @name MongoDBAdapter#create + * @method + * @param {Object} Resource The Resource. + * @param {Object} props The record to be created. + * @param {Object} [opts] Configuration options. + * @return {Promise} + */ + create (Resource, props, opts) { + const self = this + props = DSUtils.removeCircular(DSUtils.omit(props, Resource.relationFields || [])) + opts = self.origify(opts) + + return self.getClient().then(function (client) { + return new DSUtils.Promise(function (resolve, reject) { + const collection = client.collection(Resource.table || underscore(Resource.name)) + const method = collection.insertOne ? DSUtils.isArray(props) ? 'insertMany' : 'insertOne' : 'insert' + collection[method](props, opts, function (err, r) { if (err) { reject(err) } else { r = r.ops ? r.ops : r - this.translateId(r, options) - resolve(DSUtils.isArray(attrs) ? r : r[0]) + self.translateId(r, opts) + resolve(DSUtils.isArray(props) ? r : r[0]) } }) }) }) - } - - update (resourceConfig, id, attrs, options) { - attrs = DSUtils.removeCircular(DSUtils.omit(attrs, resourceConfig.relationFields || [])) - options = this.origify(options) - return this.find(resourceConfig, id, options).then(() => { - return this.getClient() - }).then((client) => { - return new DSUtils.Promise((resolve, reject) => { - let params = {} - params[resourceConfig.idAttribute] = id - if (resourceConfig.idAttribute === '_id' && typeof id === 'string' && ObjectID.isValid(id)) { - params[resourceConfig.idAttribute] = ObjectID.createFromHexString(id) - } - let collection = client.collection(resourceConfig.table || underscore(resourceConfig.name)) - collection[collection.updateOne ? 'updateOne' : 'update'](params, {$set: attrs}, options, (err) => { + }, + + /** + * Destroy the record with the given primary key. + * + * @name MongoDBAdapter#destroy + * @method + * @param {Object} Resource The Resource. + * @param {(string|number)} id Primary key of the record to destroy. + * @param {Object} [opts] Configuration options. + * @return {Promise} + */ + destroy (Resource, id, opts) { + const self = this + opts = self.origify(opts) + + return self.getClient().then(function (client) { + return new DSUtils.Promise(function (resolve, reject) { + const mongoQuery = {} + mongoQuery[Resource.idAttribute] = self.toObjectID(Resource, id) + const collection = client.collection(Resource.table || underscore(Resource.name)) + collection[collection.deleteOne ? 'deleteOne' : 'remove'](mongoQuery, opts, function (err) { if (err) { reject(err) } else { @@ -470,58 +726,29 @@ class DSMongoDBAdapter { } }) }) - }).then(() => this.find(resourceConfig, id, options)) - } - - updateAll (resourceConfig, attrs, params, options) { - let ids = [] - attrs = DSUtils.removeCircular(DSUtils.omit(attrs, resourceConfig.relationFields || [])) - options = this.origify(options ? DSUtils.copy(options) : {}) - let _options = DSUtils.copy(options) - _options.multi = true - return this.getClient().then((client) => { - let queryOptions = this.getQueryOptions(resourceConfig, params) - queryOptions.$set = attrs - let query = this.getQuery(resourceConfig, params) - return this.findAll(resourceConfig, params, options).then((items) => { - ids = map(items, (item) => { - let id = item[resourceConfig.idAttribute] - if (resourceConfig.idAttribute === '_id' && typeof id === 'string' && ObjectID.isValid(id)) { - return ObjectID.createFromHexString(id) - } - return id - }) - return new DSUtils.Promise((resolve, reject) => { - let collection = client.collection(resourceConfig.table || underscore(resourceConfig.name)) - collection[collection.updateMany ? 'updateMany' : 'update'](query, queryOptions, _options, (err) => { - if (err) { - reject(err) - } else { - resolve() - } - }) - }) - }).then(() => { - let _params = {} - _params[resourceConfig.idAttribute] = { - 'in': ids - } - return this.findAll(resourceConfig, _params, options) - }) }) - } - - destroy (resourceConfig, id, options) { - options = this.origify(options) - return this.getClient().then((client) => { - return new DSUtils.Promise((resolve, reject) => { - let params = {} - params[resourceConfig.idAttribute] = id - if (resourceConfig.idAttribute === '_id' && typeof id === 'string' && ObjectID.isValid(id)) { - params[resourceConfig.idAttribute] = ObjectID.createFromHexString(id) - } - let collection = client.collection(resourceConfig.table || underscore(resourceConfig.name)) - collection[collection.deleteOne ? 'deleteOne' : 'remove'](params, options, (err) => { + }, + + /** + * Destroy the records that match the selection query. + * + * @name MongoDBAdapter#destroyAll + * @method + * @param {Object} Resource the Resource. + * @param {Object} [query] Selection query. + * @param {Object} [opts] Configuration options. + * @return {Promise} + */ + destroyAll (Resource, query, opts) { + const self = this + opts = self.origify(opts ? DSUtils.copy(opts) : {}) + + return self.getClient().then(function (client) { + DSUtils.deepMixIn(opts, self.getQueryOptions(Resource, query)) + const mongoQuery = self.getQuery(Resource, query) + return new DSUtils.Promise(function (resolve, reject) { + const collection = client.collection(Resource.table || underscore(Resource.name)) + collection[collection.deleteMany ? 'deleteMany' : 'remove'](mongoQuery, opts, function (err) { if (err) { reject(err) } else { @@ -530,16 +757,32 @@ class DSMongoDBAdapter { }) }) }) - } - - destroyAll (resourceConfig, params, options) { - options = this.origify(options ? DSUtils.copy(options) : {}) - return this.getClient().then((client) => { - DSUtils.deepMixIn(options, this.getQueryOptions(resourceConfig, params)) - let query = this.getQuery(resourceConfig, params) - return new DSUtils.Promise((resolve, reject) => { - let collection = client.collection(resourceConfig.table || underscore(resourceConfig.name)) - collection[collection.deleteMany ? 'deleteMany' : 'remove'](query, options, (err) => { + }, + + /** + * Apply the given update to the record with the specified primary key. + * + * @name MongoDBAdapter#update + * @method + * @param {Object} Resource The Resource. + * @param {(string|number)} id The primary key of the record to be updated. + * @param {Object} props The update to apply to the record. + * @param {Object} [opts] Configuration options. + * @return {Promise} + */ + update (Resource, id, props, opts) { + const self = this + props = DSUtils.removeCircular(DSUtils.omit(props, Resource.relationFields || [])) + opts = self.origify(opts) + + return self.find(Resource, id, opts).then(function () { + return self.getClient() + }).then(function (client) { + return new DSUtils.Promise(function (resolve, reject) { + const mongoQuery = {} + mongoQuery[Resource.idAttribute] = self.toObjectID(Resource, id) + const collection = client.collection(Resource.table || underscore(Resource.name)) + collection[collection.updateOne ? 'updateOne' : 'update'](mongoQuery, { $set: props }, opts, function (err) { if (err) { reject(err) } else { @@ -547,8 +790,57 @@ class DSMongoDBAdapter { } }) }) + }).then(function () { + return self.find(Resource, id, opts) }) - } -} + }, + + /** + * Apply the given update to all records that match the selection query. + * + * @name MongoDBAdapter#updateAll + * @method + * @param {Object} Resource The Resource. + * @param {Object} props The update to apply to the selected records. + * @param {Object} [query] Selection query. + * @param {Object} [opts] Configuration options. + * @return {Promise} + */ + updateAll (Resource, props, query, opts) { + const self = this + let ids = [] + props = DSUtils.removeCircular(DSUtils.omit(props, Resource.relationFields || [])) + opts = self.origify(opts ? DSUtils.copy(opts) : {}) + const mongoOptions = DSUtils.copy(opts) + mongoOptions.multi = true + + return self.getClient().then(function (client) { + const queryOptions = self.getQueryOptions(Resource, query) + queryOptions.$set = props + const mongoQuery = self.getQuery(Resource, query) + + return self.findAll(Resource, query, opts).then(function (items) { + ids = items.map(function (item) { + return self.toObjectID(Resource, item[Resource.idAttribute]) + }) -module.exports = DSMongoDBAdapter + return new DSUtils.Promise(function (resolve, reject) { + const collection = client.collection(Resource.table || underscore(Resource.name)) + collection[collection.updateMany ? 'updateMany' : 'update'](mongoQuery, queryOptions, mongoOptions, function (err) { + if (err) { + reject(err) + } else { + resolve() + } + }) + }) + }).then(function () { + const query = {} + query[Resource.idAttribute] = { + 'in': ids + } + return self.findAll(Resource, query, opts) + }) + }) + } +}) diff --git a/webpack.config.js b/webpack.config.js deleted file mode 100644 index 11cab1c..0000000 --- a/webpack.config.js +++ /dev/null @@ -1,29 +0,0 @@ -var path = require('path') - -module.exports = { - devtool: 'source-map', - entry: './src/index.js', - output: { - filename: './dist/js-data-mongodb.js', - libraryTarget: 'commonjs2' - }, - externals: [ - 'mout/string/underscore', - 'mout/array/unique', - 'mout/array/map', - 'js-data', - 'mongodb', - 'bson' - ], - module: { - loaders: [ - { - loader: 'babel-loader', - include: [ - path.resolve(__dirname, 'src') - ], - test: /\.js$/ - } - ] - } -} From 3868e083a2c9e7be4a82e26085cb8acdd6044f8f Mon Sep 17 00:00:00 2001 From: Jason Dobry Date: Sat, 20 Feb 2016 01:34:32 -0800 Subject: [PATCH 03/36] Update readme --- README.md | 34 +++++++++++++++++++++++----------- 1 file changed, 23 insertions(+), 11 deletions(-) diff --git a/README.md b/README.md index 56bd7c7..28b9b7e 100644 --- a/README.md +++ b/README.md @@ -11,8 +11,15 @@ MongoDB adapter for [js-data](http://www.js-data.io/). -## API Documentation -[DSMongoDBAdapter](http://www.js-data.io/docs/dsmongodbadapter) +## Table of contents + +* [Quick start](#quick-start) +* [Documentation](#documentation) +* [API Reference](#api-reference) +* [Support](#support) +* [Community](#community) +* [Contributing](#contributing) +* [License](#license) ## Quick Start `npm install --save js-data js-data-mongodb`. @@ -36,15 +43,13 @@ var User = store.defineResource({ }); ``` -## Changelog -See [CHANGELOG.md](https://github.com/js-data/js-data-mongodb/blob/master/CHANGELOG.md). +### Documentation +- [Getting Started with js-data](http://www.js-data.io/docs/home) +- [js-data-mongodb](http://www.js-data.io/docs/js-data-mongodb) +- [CHANGELOG.md](https://github.com/js-data/js-data-mongodb/blob/master/CHANGELOG.md) -## Community -- [StackOverflow Channel][so] -- [Slack Chat][sl_l] [![Slack Status][sl_b]][sl_l] -- [Announcements](http://www.js-data.io/blog) -- [Mailing List](ml) -- [Issue Tracker](https://github.com/js-data/js-data-mongodb/issues) +## API Reference +- [js-data-mongodb](http://api.js-data.io/js-data-mongodb/) ## Support @@ -54,6 +59,13 @@ Support questions are handled via [StackOverflow][so], [Slack][sl_l], and the When submitting bug reports on GitHub, please include as much detail as possible to make debugging quick and easy. +## Community +- [StackOverflow Channel][so] +- [Slack Chat][sl_l] [![Slack Status][sl_b]][sl_l] +- [Announcements](http://www.js-data.io/blog) +- [Mailing List](ml) +- [Issue Tracker](https://github.com/js-data/js-data-mongodb/issues) + ## Contributing See [CONTRIBUTING.md](https://github.com/js-data/js-data-mongodb/blob/master/CONTRIBUTING.md). @@ -78,4 +90,4 @@ See [LICENSE](https://github.com/js-data/js-data-mongodb/blob/master/LICENSE). [cod_l]: https://www.codacy.com/app/jasondobry/js-data-mongodb/dashboard [ml]: https://groups.io/org/groupsio/jsdata -[so]: http://stackoverflow.com/questions/tagged/jsdata \ No newline at end of file +[so]: http://stackoverflow.com/questions/tagged/jsdata From 9c38eaa486f660baa7bc4682c0003cc7eb7038a2 Mon Sep 17 00:00:00 2001 From: Jason Dobry Date: Fri, 26 Feb 2016 23:46:45 -0800 Subject: [PATCH 04/36] 1.0.0-alpha.1 --- .github/CONTRIBUTING.md | 27 + .github/ISSUE_TEMPLATE.md | 7 + .github/PULL_REQUEST_TEMPLATE.md | 8 + .mailmap | 1 + AUTHORS | 9 + CHANGELOG.md | 10 + CONTRIBUTING.md | 27 - CONTRIBUTORS | 8 + LICENSE | 3 +- README.md | 87 ++- conf.json | 2 +- dist/js-data-mongodb.js | 1210 +++++++++++++++++++++--------- dist/js-data-mongodb.js.map | 2 +- mocha.start.js | 22 +- package.json | 39 +- scripts/AUTHORS | 7 + scripts/CONTRIBUTORS | 6 + scripts/authors.js | 45 ++ src/index.js | 1153 +++++++++++++++++++--------- 19 files changed, 1855 insertions(+), 818 deletions(-) create mode 100644 .github/CONTRIBUTING.md create mode 100644 .github/ISSUE_TEMPLATE.md create mode 100644 .github/PULL_REQUEST_TEMPLATE.md create mode 100644 .mailmap create mode 100644 AUTHORS delete mode 100644 CONTRIBUTING.md create mode 100644 CONTRIBUTORS create mode 100644 scripts/AUTHORS create mode 100644 scripts/CONTRIBUTORS create mode 100644 scripts/authors.js diff --git a/.github/CONTRIBUTING.md b/.github/CONTRIBUTING.md new file mode 100644 index 0000000..ad84ef7 --- /dev/null +++ b/.github/CONTRIBUTING.md @@ -0,0 +1,27 @@ +# Contributing + +[Read the Contributing Guide](http://js-data.io/docs/contributing). + +## Support + +[Find out how to Get Support](http://js-data.io/docs/support). + +## Community + +[Explore the Community](http://js-data.io/docs/community). + +### Have write access? + +To cut a release: + +1. Checkout master +1. Bump version in `package.json` appropriately +1. Run `npm run release` +1. Update `CHANGELOG.md` appropriately +1. Commit and push changes, including the `dist/` folder +1. Make a GitHub release + - set tag name to version + - set release name to version + - set release body to changelog entry for the version + - attach the files in the `dist/` folder +1. `npm publish .` diff --git a/.github/ISSUE_TEMPLATE.md b/.github/ISSUE_TEMPLATE.md new file mode 100644 index 0000000..2ce62e8 --- /dev/null +++ b/.github/ISSUE_TEMPLATE.md @@ -0,0 +1,7 @@ +(delete this line) GitHub Issues are NOT for support questions. +(delete this line) GitHub Issues ARE for bug reports, feature requests, and other issues. +(delete this line) Find out how to Get Support here: http://js-data.io/docs/support. + + + +Thanks! diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md new file mode 100644 index 0000000..4c14bdc --- /dev/null +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -0,0 +1,8 @@ +Fixes # (it's a good idea to open an issue first for discussion) + +- [ ] - `npm test` succeeds +- [ ] - Pull request has been squashed into 1 commit +- [ ] - I did NOT commit changes to `dist/` +- [ ] - Code coverage does not decrease (if any source code was changed) +- [ ] - Appropriate JSDoc comments were updated in source code (if applicable) +- [ ] - Approprate changes to js-data.io docs have been suggested ("Suggest Edits" button) diff --git a/.mailmap b/.mailmap new file mode 100644 index 0000000..21ac730 --- /dev/null +++ b/.mailmap @@ -0,0 +1 @@ +Jason Dobry Jason Dobry diff --git a/AUTHORS b/AUTHORS new file mode 100644 index 0000000..0dbf29d --- /dev/null +++ b/AUTHORS @@ -0,0 +1,9 @@ +# This is the official list of js-data-mongodb project authors. +# +# This file is controlled by scripts/authors.js +# +# Names are formatted as: +# # commits Name or Organization +# The email address is not required for organizations. +Jason Dobry +John Grogg diff --git a/CHANGELOG.md b/CHANGELOG.md index 66e006b..8db67e9 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,13 @@ +##### 1.0.0-alpha.1 - 26 February 2016 + +###### Breaking API changes +- Now depends on js-data 3.x + +###### Backwards compatible API changes +- Added createMany and updateMany methods +- Added lifecycle methods +- Added insertOpts, insertManyOpts, updateOpts, removeOpts, findOpts, and findOneOpts options + ##### 0.7.0 - 19 February 2016 ###### Backwards compatible API changes diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md deleted file mode 100644 index 69c5459..0000000 --- a/CONTRIBUTING.md +++ /dev/null @@ -1,27 +0,0 @@ -# Contributing Guide - -Support questions are handled via [StackOverflow][so], [Slack][slack], and the -[Mailing List][ml]. Ask your questions there. - -When submitting issues on GitHub, please include as much detail as possible to make debugging quick and easy. - -- good - Your versions of js-data, js-data-mongodb, etc., relevant console logs/error, code examples that revealed the issue -- better - A [plnkr](http://plnkr.co/), [fiddle](http://jsfiddle.net/), or [bin](http://jsbin.com/?html,output) that demonstrates the issue -- best - A Pull Request that fixes the issue, including test coverage for the issue and the fix - -[Github Issues](https://github.com/js-data/js-data-mongodb/issues). - -#### Pull Requests - -1. Contribute to the issue that is the reason you'll be developing in the first place -1. Fork js-data-mongodb -1. `git clone https://github.com//js-data-mongodb.git` -1. `cd js-data-mongodb; npm install; bower install;` -1. `grunt go` (builds and starts a watch) -1. (in another terminal) `grunt karma:dev` (runs the tests) -1. Write your code, including relevant documentation and tests -1. Submit a PR and we'll review - -[slack]: http://slack.js-data.io -[ml]: https://groups.io/org/groupsio/jsdata -[so]: http://stackoverflow.com/questions/tagged/jsdata \ No newline at end of file diff --git a/CONTRIBUTORS b/CONTRIBUTORS new file mode 100644 index 0000000..80252af --- /dev/null +++ b/CONTRIBUTORS @@ -0,0 +1,8 @@ +# People who have contributed to the js-data-mongodb project. +# +# This file is controlled by scripts/authors.js +# +# Names should be added to this file as: +# [commit count] Name + 24 Jason Dobry + 1 John Grogg diff --git a/LICENSE b/LICENSE index 2fdd9b6..cbb516e 100644 --- a/LICENSE +++ b/LICENSE @@ -1,6 +1,6 @@ The MIT License (MIT) -Copyright (c) 2014-2015 Jason Dobry +Copyright (c) 2014-2016 js-data-mongodb project authors Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal @@ -19,4 +19,3 @@ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - diff --git a/README.md b/README.md index 28b9b7e..2380762 100644 --- a/README.md +++ b/README.md @@ -14,67 +14,77 @@ MongoDB adapter for [js-data](http://www.js-data.io/). ## Table of contents * [Quick start](#quick-start) -* [Documentation](#documentation) -* [API Reference](#api-reference) -* [Support](#support) +* [Guides and Tutorials](#guides-and-tutorials) +* [API Reference Docs](#api-reference-docs) * [Community](#community) +* [Support](#support) * [Contributing](#contributing) * [License](#license) ## Quick Start -`npm install --save js-data js-data-mongodb`. +`npm install --save js-data js-data-mongodb mongodb bson`. ```js -var JSData = require('js-data'); -var DSMongoDBAdapter = require('js-data-mongodb'); - -var store = new JSData.DS(); -var adapter = new DSMongoDBAdapter('mongodb://localhost:27017'); +// Use Container instead of DataStore on the server +import {Container} from 'js-data' +import MongoDBAdapter from 'js-data-mongodb' + +// Create a store to hold your Mappers +const store = new Container({ + mapperDefaults: { + // MongoDB uses "_id" as the primary key + idAttribute: '_id' + } +}) + +// Create an instance of MongoDBAdapter with default settings +const adapter = new MongoDBAdapter() + +// Mappers in "store" will use the MongoDB adapter by default +store.registerAdapter('mongodb', adapter, { default: true }) + +// Create a Mapper that maps to a "user" collection +store.defineMapper('user') +``` -// "store" will now use the MongoDB adapter for all async operations -store.registerAdapter('mongodb', adapter, { default: true }); +```js +async function findAllAdminUsers () { + // Find all users where "user.role" == "admin" + return await store.findAll('user', { + role: 'admin' + }) +} +``` -var User = store.defineResource({ - // Why couldn't Mongo just use "id"? - idAttribute: '_id', +## Guides and Tutorials - // map this resource to a collection, default is Resource#name - table: 'users' -}); -``` +[Get started at http://js-data.io](http://js-data.io) -### Documentation -- [Getting Started with js-data](http://www.js-data.io/docs/home) -- [js-data-mongodb](http://www.js-data.io/docs/js-data-mongodb) -- [CHANGELOG.md](https://github.com/js-data/js-data-mongodb/blob/master/CHANGELOG.md) +## API Reference Docs -## API Reference -- [js-data-mongodb](http://api.js-data.io/js-data-mongodb/) +[Visit http://api.js-data.io](http://api.js-data.io). -## Support +## Community -Support questions are handled via [StackOverflow][so], [Slack][sl_l], and the -[Mailing List][ml]. Ask your questions there. +[Explore the Community](http://js-data.io/docs/community). -When submitting bug reports on GitHub, please include as much detail as possible -to make debugging quick and easy. +## Support -## Community -- [StackOverflow Channel][so] -- [Slack Chat][sl_l] [![Slack Status][sl_b]][sl_l] -- [Announcements](http://www.js-data.io/blog) -- [Mailing List](ml) -- [Issue Tracker](https://github.com/js-data/js-data-mongodb/issues) +[Find out how to Get Support](http://js-data.io/docs/support). ## Contributing -See [CONTRIBUTING.md](https://github.com/js-data/js-data-mongodb/blob/master/CONTRIBUTING.md). +[Read the Contributing Guide](http://js-data.io/docs/contributing). ## License The MIT License (MIT) -See [LICENSE](https://github.com/js-data/js-data-mongodb/blob/master/LICENSE). +Copyright (c) 2014-2016 js-data-mongodb project authors + +* [LICENSE](https://github.com/js-data/js-data-mongodb/blob/master/LICENSE) +* [AUTHORS](https://github.com/js-data/js-data-mongodb/blob/master/AUTHORS) +* [CONTRIBUTORS](https://github.com/js-data/js-data-mongodb/blob/master/CONTRIBUTORS) [sl_b]: http://slack.js-data.io/badge.svg [sl_l]: http://slack.js-data.io @@ -88,6 +98,3 @@ See [LICENSE](https://github.com/js-data/js-data-mongodb/blob/master/LICENSE). [cov_l]: https://coveralls.io/github/js-data/js-data-mongodb?branch=master [cod_b]: https://img.shields.io/codacy/1f45ede49dfb4bdea68f46ca55631968.svg [cod_l]: https://www.codacy.com/app/jasondobry/js-data-mongodb/dashboard - -[ml]: https://groups.io/org/groupsio/jsdata -[so]: http://stackoverflow.com/questions/tagged/jsdata diff --git a/conf.json b/conf.json index df16328..cbcaa8c 100644 --- a/conf.json +++ b/conf.json @@ -14,7 +14,7 @@ "templates": { "theme": "lumen", "systemName": "js-data-mongodb", - "copyright": "js-data-mongodb Copyright © 2014-2016 Jason Dobry", + "copyright": "js-data-mongodb Copyright © 2014-2016 js-data-mongodb project authors", "outputSourceFiles": true, "syntaxTheme": "dark", "linenums": true, diff --git a/dist/js-data-mongodb.js b/dist/js-data-mongodb.js index 0b5abbe..82263e7 100644 --- a/dist/js-data-mongodb.js +++ b/dist/js-data-mongodb.js @@ -1,5 +1,12 @@ 'use strict'; +function _interopDefault (ex) { return (ex && (typeof ex === 'object') && 'default' in ex) ? ex['default'] : ex; } + +var mongodb = require('mongodb'); +var bson = require('bson'); +var jsData = require('js-data'); +var underscore = _interopDefault(require('mout/string/underscore')); + var babelHelpers = {}; babelHelpers.typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; @@ -24,39 +31,20 @@ babelHelpers.defineProperty = function (obj, key, value) { babelHelpers; -var mongodb = require('mongodb'); -var MongoClient = mongodb.MongoClient; -var bson = require('bson'); -var ObjectID = bson.ObjectID; -var JSData = require('js-data'); -var underscore = require('mout/string/underscore'); -var DSUtils = JSData.DSUtils; +var addHiddenPropsToTarget = jsData.utils.addHiddenPropsToTarget; +var fillIn = jsData.utils.fillIn; +var forEachRelation = jsData.utils.forEachRelation; +var forOwn = jsData.utils.forOwn; +var get = jsData.utils.get; +var isArray = jsData.utils.isArray; +var isObject = jsData.utils.isObject; +var isString = jsData.utils.isString; +var isUndefined = jsData.utils.isUndefined; +var resolve = jsData.utils.resolve; var reserved = ['orderBy', 'sort', 'limit', 'offset', 'skip', 'where']; -function Defaults() {} - -Defaults.prototype.translateId = true; - -var addHiddenPropsToTarget = function addHiddenPropsToTarget(target, props) { - DSUtils.forOwn(props, function (value, key) { - props[key] = { - writable: true, - value: value - }; - }); - Object.defineProperties(target, props); -}; - -var fillIn = function fillIn(dest, src) { - DSUtils.forOwn(src, function (value, key) { - if (!dest.hasOwnProperty(key) || dest[key] === undefined) { - dest[key] = value; - } - }); -}; - function unique(array) { var seen = {}; var final = []; @@ -70,32 +58,185 @@ function unique(array) { return final; } +var noop = function noop() { + var self = this; + + for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) { + args[_key] = arguments[_key]; + } + + var opts = args[args.length - 1]; + self.dbg.apply(self, [opts.op].concat(args)); + return resolve(); +}; + +var noop2 = function noop2() { + var self = this; + + for (var _len2 = arguments.length, args = Array(_len2), _key2 = 0; _key2 < _len2; _key2++) { + args[_key2] = arguments[_key2]; + } + + var opts = args[args.length - 2]; + self.dbg.apply(self, [opts.op].concat(args)); + return resolve(); +}; + +var DEFAULTS = { + /** + * Whether to log debugging information. + * + * @name MongoDBAdapter#debug + * @type {boolean} + * @default false + */ + debug: false, + + /** + * Whether to return detailed result objects instead of just record data. + * + * @name MongoDBAdapter#raw + * @type {boolean} + * @default false + */ + raw: false, + + /** + * Convert ObjectIDs to strings when pulling records out of the database. + * + * @name MongoDBAdapter#translateId + * @type {boolean} + * @default true + */ + translateId: true, + + /** + * MongoDB URI. + * + * @name MongoDBAdapter#uri + * @type {string} + * @default mongodb://localhost:27017 + */ + uri: 'mongodb://localhost:27017' +}; + +var FIND_OPTS_DEFAULTS = {}; +var FIND_ONE_OPTS_DEFAULTS = {}; +var INSERT_OPTS_DEFAULTS = {}; +var INSERT_MANY_OPTS_DEFAULTS = {}; +var UPDATE_OPTS_DEFAULTS = {}; +var REMOVE_OPTS_DEFAULTS = {}; + /** * MongoDBAdapter class. * * @example - * import {DS} from 'js-data' + * // Use Container instead of DataStore on the server + * import {Container} from 'js-data' * import MongoDBAdapter from 'js-data-mongodb' - * const store = new DS() - * const adapter = new MongoDBAdapter({ - * uri: 'mongodb://localhost:27017' + * + * // Create a store to hold your Mappers + * const store = new Container({ + * mapperDefaults: { + * // MongoDB uses "_id" as the primary key + * idAttribute: '_id' + * } * }) - * store.registerAdapter('mongodb', adapter, { 'default': true }) + * + * // Create an instance of MongoDBAdapter with default settings + * const adapter = new MongoDBAdapter() + * + * // Mappers in "store" will use the MongoDB adapter by default + * store.registerAdapter('mongodb', adapter, { default: true }) + * + * // Create a Mapper that maps to a "user" collection + * store.defineMapper('user') * * @class MongoDBAdapter * @param {Object} [opts] Configuration opts. - * @param {string} [opts.uri=''] MongoDB URI. + * @param {boolean} [opts.debug=false] Whether to log debugging information. + * @param {Object} [opts.findOpts] Options to pass to collection#find. + * @param {Object} [opts.findOneOpts] Options to pass to collection#findOne. + * @param {Object} [opts.insertOpts] Options to pass to collection#insert. + * @param {Object} [opts.insertManyOpts] Options to pass to + * collection#insertMany. + * @param {boolean} [opts.raw=false] Whether to return detailed result objects + * instead of just record data. + * @param {Object} [opts.removeOpts] Options to pass to collection#remove. + * @param {boolean} [opts.translateId=true] Convert ObjectIDs to strings when + * pulling records out of the database. + * @param {Object} [opts.updateOpts] Options to pass to collection#update. + * @param {string} [opts.uri="mongodb://localhost:27017"] MongoDB URI. */ function MongoDBAdapter(opts) { var self = this; - if (typeof opts === 'string') { + opts || (opts = {}); + if (isString(opts)) { opts = { uri: opts }; } - opts.uri || (opts.uri = 'mongodb://localhost:27017'); - self.defaults = new Defaults(); - DSUtils.deepMixIn(self.defaults, opts); + fillIn(opts, DEFAULTS); fillIn(self, opts); + /** + * Default options to pass to collection#find. + * + * @name MongoDBAdapter#findOpts + * @type {Object} + * @default {} + */ + self.findOpts || (self.findOpts = {}); + fillIn(self.findOpts, FIND_OPTS_DEFAULTS); + + /** + * Default options to pass to collection#findOne. + * + * @name MongoDBAdapter#findOneOpts + * @type {Object} + * @default {} + */ + self.findOneOpts || (self.findOneOpts = {}); + fillIn(self.findOneOpts, FIND_ONE_OPTS_DEFAULTS); + + /** + * Default options to pass to collection#insert. + * + * @name MongoDBAdapter#insertOpts + * @type {Object} + * @default {} + */ + self.insertOpts || (self.insertOpts = {}); + fillIn(self.insertOpts, INSERT_OPTS_DEFAULTS); + + /** + * Default options to pass to collection#insertMany. + * + * @name MongoDBAdapter#insertManyOpts + * @type {Object} + * @default {} + */ + self.insertManyOpts || (self.insertManyOpts = {}); + fillIn(self.insertManyOpts, INSERT_MANY_OPTS_DEFAULTS); + + /** + * Default options to pass to collection#update. + * + * @name MongoDBAdapter#updateOpts + * @type {Object} + * @default {} + */ + self.updateOpts || (self.updateOpts = {}); + fillIn(self.updateOpts, UPDATE_OPTS_DEFAULTS); + + /** + * Default options to pass to collection#update. + * + * @name MongoDBAdapter#removeOpts + * @type {Object} + * @default {} + */ + self.removeOpts || (self.removeOpts = {}); + fillIn(self.removeOpts, REMOVE_OPTS_DEFAULTS); + /** * A Promise that resolves to a reference to the MongoDB client being used by * this adapter. @@ -103,14 +244,160 @@ function MongoDBAdapter(opts) { * @name MongoDBAdapter#client * @type {Object} */ - self.client = new DSUtils.Promise(function (resolve, reject) { - MongoClient.connect(opts.uri, function (err, db) { + self.client = new Promise(function (resolve, reject) { + mongodb.MongoClient.connect(opts.uri, function (err, db) { return err ? reject(err) : resolve(db); }); }); } addHiddenPropsToTarget(MongoDBAdapter.prototype, { + /** + * Translate ObjectIDs to strings. + * + * @name MongoDBAdapter#_translateId + * @method + * @return {*} + */ + + _translateId: function _translateId(r, opts) { + opts || (opts = {}); + if (this.getOpt('translateId', opts)) { + if (isArray(r)) { + r.forEach(function (_r) { + var __id = _r._id ? _r._id.toString() : _r._id; + _r._id = typeof __id === 'string' ? __id : _r._id; + }); + } else if (isObject(r)) { + var __id = r._id ? r._id.toString() : r._id; + r._id = typeof __id === 'string' ? __id : r._id; + } + } + return r; + }, + + + /** + * @name MongoDBAdapter#afterCreate + * @method + */ + afterCreate: noop2, + + /** + * @name MongoDBAdapter#afterCreateMany + * @method + */ + afterCreateMany: noop2, + + /** + * @name MongoDBAdapter#afterDestroy + * @method + */ + afterDestroy: noop2, + + /** + * @name MongoDBAdapter#afterDestroyAll + * @method + */ + afterDestroyAll: noop2, + + /** + * @name MongoDBAdapter#afterFind + * @method + */ + afterFind: noop2, + + /** + * @name MongoDBAdapter#afterFindAll + * @method + */ + afterFindAll: noop2, + + /** + * @name MongoDBAdapter#afterUpdate + * @method + */ + afterUpdate: noop2, + + /** + * @name MongoDBAdapter#afterUpdateAll + * @method + */ + afterUpdateAll: noop2, + + /** + * @name MongoDBAdapter#afterUpdateMany + * @method + */ + afterUpdateMany: noop2, + + /** + * @name MongoDBAdapter#beforeCreate + * @method + */ + beforeCreate: noop, + + /** + * @name MongoDBAdapter#beforeCreateMany + * @method + */ + beforeCreateMany: noop, + + /** + * @name MongoDBAdapter#beforeDestroy + * @method + */ + beforeDestroy: noop, + + /** + * @name MongoDBAdapter#beforeDestroyAll + * @method + */ + beforeDestroyAll: noop, + + /** + * @name MongoDBAdapter#beforeFind + * @method + */ + beforeFind: noop, + + /** + * @name MongoDBAdapter#beforeFindAll + * @method + */ + beforeFindAll: noop, + + /** + * @name MongoDBAdapter#beforeUpdate + * @method + */ + beforeUpdate: noop, + + /** + * @name MongoDBAdapter#beforeUpdateAll + * @method + */ + beforeUpdateAll: noop, + + /** + * @name MongoDBAdapter#beforeUpdateMany + * @method + */ + beforeUpdateMany: noop, + + /** + * @name MongoDBAdapter#dbg + * @method + */ + dbg: function dbg() { + for (var _len3 = arguments.length, args = Array(_len3), _key3 = 0; _key3 < _len3; _key3++) { + args[_key3] = arguments[_key3]; + } + + this.log.apply(this, ['debug'].concat(args)); + }, + + /** * Return a Promise that resolves to a reference to the MongoDB client being * used by this adapter. @@ -121,7 +408,6 @@ addHiddenPropsToTarget(MongoDBAdapter.prototype, { * @method * @return {Object} MongoDB client. */ - getClient: function getClient() { return this.client; }, @@ -143,9 +429,9 @@ addHiddenPropsToTarget(MongoDBAdapter.prototype, { query || (query = {}); query.where || (query.where = {}); - DSUtils.forOwn(query, function (v, k) { + forOwn(query, function (v, k) { if (reserved.indexOf(k) === -1) { - if (DSUtils.isObject(v)) { + if (isObject(v)) { query.where[k] = v; } else { query.where[k] = { @@ -158,17 +444,17 @@ addHiddenPropsToTarget(MongoDBAdapter.prototype, { var mongoQuery = {}; - if (Object.keys(query.where).length) { - DSUtils.forOwn(query.where, function (criteria, field) { - if (!DSUtils.isObject(criteria)) { + if (Object.keys(query.where).length !== 0) { + forOwn(query.where, function (criteria, field) { + if (!isObject(criteria)) { query.where[field] = { '==': criteria }; } - DSUtils.forOwn(criteria, function (v, op) { - if (op === '==' || op === '===') { + forOwn(criteria, function (v, op) { + if (op === '==' || op === '===' || op === 'contains') { mongoQuery[field] = v; - } else if (op === '!=' || op === '!==') { + } else if (op === '!=' || op === '!==' || op === 'notContains') { mongoQuery[field] = mongoQuery[field] || {}; mongoQuery[field].$ne = v; } else if (op === '>') { @@ -189,12 +475,12 @@ addHiddenPropsToTarget(MongoDBAdapter.prototype, { } else if (op === 'notIn') { mongoQuery[field] = mongoQuery[field] || {}; mongoQuery[field].$nin = v; - } else if (op === '|==' || op === '|===') { + } else if (op === '|==' || op === '|===' || op === '|contains') { mongoQuery.$or = mongoQuery.$or || []; var orEqQuery = {}; orEqQuery[field] = v; mongoQuery.$or.push(orEqQuery); - } else if (op === '|!=' || op === '|!==') { + } else if (op === '|!=' || op === '|!==' || op === '|notContains') { mongoQuery.$or = mongoQuery.$or || []; var orNeQuery = {}; orNeQuery[field] = { @@ -252,6 +538,37 @@ addHiddenPropsToTarget(MongoDBAdapter.prototype, { }, + /** + * Logging utility method. + * + * @name MongoDBAdapter#log + * @method + */ + log: function log(level) { + for (var _len4 = arguments.length, args = Array(_len4 > 1 ? _len4 - 1 : 0), _key4 = 1; _key4 < _len4; _key4++) { + args[_key4 - 1] = arguments[_key4]; + } + + if (level && !args.length) { + args.push(level); + level = 'debug'; + } + if (level === 'debug' && !this.debug) { + return; + } + var prefix = level.toUpperCase() + ': (MongoDBAdapter)'; + if (console[level]) { + var _console; + + (_console = console)[level].apply(_console, [prefix].concat(args)); + } else { + var _console2; + + (_console2 = console).log.apply(_console2, [prefix].concat(args)); + } + }, + + /** * Map non-filtering params in a selection query to MongoDB query options. * @@ -273,11 +590,11 @@ addHiddenPropsToTarget(MongoDBAdapter.prototype, { var queryOptions = {}; if (query.orderBy) { - if (DSUtils.isString(query.orderBy)) { + if (isString(query.orderBy)) { query.orderBy = [[query.orderBy, 'asc']]; } for (var i = 0; i < query.orderBy.length; i++) { - if (DSUtils.isString(query.orderBy[i])) { + if (isString(query.orderBy[i])) { query.orderBy[i] = [query.orderBy[i], 'asc']; } } @@ -297,68 +614,44 @@ addHiddenPropsToTarget(MongoDBAdapter.prototype, { /** - * TODO + * Resolve the value of the specified option based on the given options and + * this adapter's settings. * - * @name MongoDBAdapter#translateId + * @name MongoDBAdapter#getOpt * @method - * @return {*} + * @param {string} opt The name of the option. + * @param {Object} [opts] Configuration options. + * @return {*} The value of the specified option. */ - translateId: function translateId(r, opts) { + getOpt: function getOpt(opt, opts) { opts || (opts = {}); - if (typeof opts.translateId === 'boolean' ? opts.translateId : this.defaults.translateId) { - if (DSUtils.isArray(r)) { - r.forEach(function (_r) { - var __id = _r._id ? _r._id.toString() : _r._id; - _r._id = typeof __id === 'string' ? __id : _r._id; - }); - } else if (DSUtils.isObject(r)) { - var __id = r._id ? r._id.toString() : r._id; - r._id = typeof __id === 'string' ? __id : r._id; - } - } - return r; + return isUndefined(opts[opt]) ? this[opt] : opts[opt]; }, /** - * TODO + * Turn an _id into an ObjectID if it isn't already an ObjectID. * - * @name MongoDBAdapter#origify - * @method - * @return {Object} - */ - origify: function origify(opts) { - opts = opts || {}; - if (typeof opts.orig === 'function') { - return opts.orig(); - } - return opts; - }, - - - /** - * TODO - * - * @name MongoDBAdapter#makeHasManyForeignKey + * @name MongoDBAdapter#toObjectID * @method * @return {*} */ toObjectID: function toObjectID(Resource, id) { - if (id !== undefined && Resource.idAttribute === '_id' && typeof id === 'string' && ObjectID.isValid(id) && !(id instanceof ObjectID)) { - return new ObjectID(id); + if (id !== undefined && Resource.idAttribute === '_id' && typeof id === 'string' && bson.ObjectID.isValid(id) && !(id instanceof bson.ObjectID)) { + return new bson.ObjectID(id); } return id; }, /** - * TODO + * Return the foreignKey from the given record for the provided relationship. * * If the foreignKeys in your database are saved as ObjectIDs, then override * this method and change it to something like: * * ``` - * return this.toObjectID(Resource, this.constructor.prototype.makeHasManyForeignKey.call(this, Resource, def, record)) + * return this.toObjectID(mapper, this.constructor.prototype.makeHasManyForeignKey.call(this, mapper, def, record)) * ``` * * There may be other reasons why you may want to override this method, like @@ -368,28 +661,40 @@ addHiddenPropsToTarget(MongoDBAdapter.prototype, { * @method * @return {*} */ - makeHasManyForeignKey: function makeHasManyForeignKey(Resource, def, record) { - return DSUtils.get(record, Resource.idAttribute); + makeHasManyForeignKey: function makeHasManyForeignKey(mapper, def, record) { + return def.getForeignKey(record); }, /** - * TODO + * Return the foreignKeys from the given record for the provided relationship. + * + * @name MongoDBAdapter#makeHasManyForeignKeys + * @method + * @return {*} + */ + makeHasManyForeignKeys: function makeHasManyForeignKeys(mapper, def, record) { + return get(record, mapper.idAttribute); + }, + + + /** + * Load a hasMany relationship. * * @name MongoDBAdapter#loadHasMany * @method * @return {Promise} */ - loadHasMany: function loadHasMany(Resource, def, records, __options) { + loadHasMany: function loadHasMany(mapper, def, records, __opts) { var self = this; var singular = false; - if (DSUtils.isObject(records) && !DSUtils.isArray(records)) { + if (isObject(records) && !isArray(records)) { singular = true; records = [records]; } var IDs = records.map(function (record) { - return self.makeHasManyForeignKey(Resource, def, record); + return self.makeHasManyForeignKey(mapper, def, record); }); var query = {}; var criteria = query[def.foreignKey] = {}; @@ -401,7 +706,7 @@ addHiddenPropsToTarget(MongoDBAdapter.prototype, { return id; }); } - return self.findAll(Resource.getResource(def.relation), query, __options).then(function (relatedItems) { + return self.findAll(def.getRelation(), query, __opts).then(function (relatedItems) { records.forEach(function (record) { var attached = []; // avoid unneccesary iteration when we only have one record @@ -409,33 +714,33 @@ addHiddenPropsToTarget(MongoDBAdapter.prototype, { attached = relatedItems; } else { relatedItems.forEach(function (relatedItem) { - if (DSUtils.get(relatedItem, def.foreignKey) === record[Resource.idAttribute]) { + if (get(relatedItem, def.foreignKey) === record[mapper.idAttribute]) { attached.push(relatedItem); } }); } - DSUtils.set(record, def.localField, attached); + def.setLocalField(record, attached); }); }); }, /** - * TODO + * Load a hasOne relationship. * * @name MongoDBAdapter#loadHasOne * @method * @return {Promise} */ - loadHasOne: function loadHasOne(Resource, def, records, __options) { - if (DSUtils.isObject(records) && !DSUtils.isArray(records)) { + loadHasOne: function loadHasOne(mapper, def, records, __opts) { + if (isObject(records) && !isArray(records)) { records = [records]; } - return this.loadHasMany(Resource, def, records, __options).then(function () { + return this.loadHasMany(mapper, def, records, __opts).then(function () { records.forEach(function (record) { - var relatedData = DSUtils.get(record, def.localField); - if (DSUtils.isArray(relatedData) && relatedData.length) { - DSUtils.set(record, def.localField, relatedData[0]); + var relatedData = def.getLocalField(record); + if (isArray(relatedData) && relatedData.length) { + def.setLocalField(record, relatedData[0]); } }); }); @@ -443,34 +748,34 @@ addHiddenPropsToTarget(MongoDBAdapter.prototype, { /** - * TODO + * Return the foreignKey from the given record for the provided relationship. * * @name MongoDBAdapter#makeBelongsToForeignKey * @method * @return {*} */ - makeBelongsToForeignKey: function makeBelongsToForeignKey(Resource, def, record) { - return this.toObjectID(Resource.getResource(def.relation), DSUtils.get(record, def.localKey)); + makeBelongsToForeignKey: function makeBelongsToForeignKey(mapper, def, record) { + return this.toObjectID(def.getRelation(), def.getForeignKey(record)); }, /** - * TODO + * Load a belongsTo relationship. * * @name MongoDBAdapter#loadBelongsTo * @method * @return {Promise} */ - loadBelongsTo: function loadBelongsTo(Resource, def, records, __options) { + loadBelongsTo: function loadBelongsTo(mapper, def, records, __opts) { var self = this; - var relationDef = Resource.getResource(def.relation); + var relationDef = def.getRelation(); - if (DSUtils.isObject(records) && !DSUtils.isArray(records)) { + if (isObject(records) && !isArray(records)) { var _ret = function () { var record = records; return { - v: self.find(relationDef, self.makeBelongsToForeignKey(Resource, def, record), __options).then(function (relatedItem) { - DSUtils.set(record, def.localField, relatedItem); + v: self.find(relationDef, self.makeBelongsToForeignKey(mapper, def, record), __opts).then(function (relatedItem) { + def.setLocalField(record, relatedItem); }) }; }(); @@ -478,7 +783,7 @@ addHiddenPropsToTarget(MongoDBAdapter.prototype, { if ((typeof _ret === 'undefined' ? 'undefined' : babelHelpers.typeof(_ret)) === "object") return _ret.v; } else { var keys = records.map(function (record) { - return self.makeBelongsToForeignKey(Resource, def, record); + return self.makeBelongsToForeignKey(mapper, def, record); }).filter(function (key) { return key; }); @@ -486,11 +791,11 @@ addHiddenPropsToTarget(MongoDBAdapter.prototype, { where: babelHelpers.defineProperty({}, relationDef.idAttribute, { 'in': keys }) - }, __options).then(function (relatedItems) { + }, __opts).then(function (relatedItems) { records.forEach(function (record) { relatedItems.forEach(function (relatedItem) { - if (relatedItem[relationDef.idAttribute] === record[def.localKey]) { - DSUtils.set(record, def.localField, relatedItem); + if (relatedItem[relationDef.idAttribute] === record[def.foreignKey]) { + def.setLocalField(record, relatedItem); } }); }); @@ -504,99 +809,99 @@ addHiddenPropsToTarget(MongoDBAdapter.prototype, { * * @name MongoDBAdapter#find * @method - * @param {Object} Resource The Resource. + * @param {Object} mapper The mapper. * @param {(string|number)} id Primary key of the record to retrieve. * @param {Object} [opts] Configuration options. - * @param {string[]} [opts.with=[]] TODO + * @param {Object} [opts.findOneOpts] Options to pass to collection#findOne. + * @param {boolean} [opts.raw=false] Whether to return a more detailed + * response object. + * @param {string[]} [opts.with=[]] Relations to eager load. * @return {Promise} */ - find: function find(Resource, id, options) { + find: function find(mapper, id, opts) { var self = this; - var instance = undefined; - options = self.origify(options); - options.with || (options.with = []); + var record = undefined, + op = undefined; + opts || (opts = {}); + opts.with || (opts.with = []); + + var findOneOpts = self.getOpt('findOneOpts', opts); + findOneOpts.fields || (findOneOpts.fields = {}); + return self.getClient().then(function (client) { - return new DSUtils.Promise(function (resolve, reject) { - var mongoQuery = {}; - mongoQuery[Resource.idAttribute] = self.toObjectID(Resource, id); - options.fields = options.fields || {}; - client.collection(Resource.table || underscore(Resource.name)).findOne(mongoQuery, options, function (err, r) { - if (err) { - reject(err); - } else if (!r) { - reject(new Error('Not Found!')); - } else { - resolve(self.translateId(r, options)); - } + // beforeFind lifecycle hook + op = opts.op = 'beforeFind'; + return resolve(self[op](mapper, id, opts)).then(function () { + return new Promise(function (resolve, reject) { + var mongoQuery = {}; + mongoQuery[mapper.idAttribute] = self.toObjectID(mapper, id); + client.collection(mapper.table || underscore(mapper.name)).findOne(mongoQuery, findOneOpts, function (err, cursor) { + return err ? reject(err) : resolve(cursor); + }); }); }); - }).then(function (_instance) { - instance = _instance; + }).then(function (_record) { + if (!_record) { + return; + } + record = _record; + self._translateId(record, opts); var tasks = []; - var relationList = Resource.relationList || []; - - relationList.forEach(function (def) { - var relationName = def.relation; - var relationDef = Resource.getResource(relationName); - var containedName = null; - if (options.with.indexOf(relationName) !== -1) { - containedName = relationName; - } else if (options.with.indexOf(def.localField) !== -1) { - containedName = def.localField; - } - if (containedName) { - (function () { - var __options = DSUtils.deepMixIn({}, options.orig ? options.orig() : options); - __options.with = options.with.slice(); - __options = DSUtils._(relationDef, __options); - DSUtils.remove(__options.with, containedName); - __options.with.forEach(function (relation, i) { - if (relation && relation.indexOf(containedName) === 0 && relation.length >= containedName.length && relation[containedName.length] === '.') { - __options.with[i] = relation.substr(containedName.length + 1); - } else { - __options.with[i] = ''; - } - }); - var task = undefined; - - if (def.foreignKey && (def.type === 'hasOne' || def.type === 'hasMany')) { - if (def.type === 'hasOne') { - task = self.loadHasOne(Resource, def, instance, __options); - } else { - task = self.loadHasMany(Resource, def, instance, __options); - } - } else if (def.type === 'hasMany' && def.localKeys) { - var localKeys = []; - var itemKeys = instance[def.localKeys] || []; - itemKeys = DSUtils.isArray(itemKeys) ? itemKeys : DSUtils.keys(itemKeys); - localKeys = localKeys.concat(itemKeys || []); - task = self.findAll(Resource.getResource(relationName), { - where: babelHelpers.defineProperty({}, relationDef.idAttribute, { - 'in': unique(localKeys).filter(function (x) { - return x; - }).map(function (x) { - return self.toObjectID(relationDef, x); - }) - }) - }, __options).then(function (relatedItems) { - DSUtils.set(instance, def.localField, relatedItems); - return relatedItems; - }); - } else if (def.type === 'belongsTo' || def.type === 'hasOne' && def.localKey) { - task = self.loadBelongsTo(Resource, def, instance, __options); - } + forEachRelation(mapper, opts, function (def, __opts) { + var relatedMapper = def.getRelation(); + var task = undefined; - if (task) { - tasks.push(task); - } - })(); + if (def.foreignKey && (def.type === 'hasOne' || def.type === 'hasMany')) { + if (def.type === 'hasOne') { + task = self.loadHasOne(mapper, def, record, __opts); + } else { + task = self.loadHasMany(mapper, def, record, __opts); + } + } else if (def.type === 'hasMany' && def.localKeys) { + var localKeys = []; + var itemKeys = get(record, def.localKeys) || []; + itemKeys = isArray(itemKeys) ? itemKeys : Object.keys(itemKeys); + localKeys = localKeys.concat(itemKeys); + task = self.findAll(relatedMapper, { + where: babelHelpers.defineProperty({}, relatedMapper.idAttribute, { + 'in': unique(localKeys).filter(function (x) { + return x; + }).map(function (x) { + return self.toObjectID(relatedMapper, x); + }) + }) + }, __opts).then(function (relatedItems) { + def.setLocalField(record, relatedItems); + }); + } else if (def.type === 'hasMany' && def.foreignKeys) { + task = self.findAll(relatedMapper, { + where: babelHelpers.defineProperty({}, def.foreignKeys, { + 'contains': self.makeHasManyForeignKeys(mapper, def, record) + }) + }, __opts).then(function (relatedItems) { + def.setLocalField(record, relatedItems); + }); + } else if (def.type === 'belongsTo') { + task = self.loadBelongsTo(mapper, def, record, __opts); + } + if (task) { + tasks.push(task); } }); - return DSUtils.Promise.all(tasks); + return Promise.all(tasks); }).then(function () { - return instance; + // afterFind lifecycle hook + op = opts.op = 'afterFind'; + return resolve(self[op](mapper, id, opts, record)).then(function (_record) { + // Allow for re-assignment from lifecycle hook + record = isUndefined(_record) ? record : _record; + return self.getOpt('raw', opts) ? { + data: record, + found: record ? 1 : 0 + } : record; + }); }); }, @@ -606,109 +911,102 @@ addHiddenPropsToTarget(MongoDBAdapter.prototype, { * * @name MongoDBAdapter#findAll * @method - * @param {Object} Resource The Resource. + * @param {Object} mapper The mapper. * @param {Object} query Selection query. * @param {Object} [opts] Configuration options. - * @param {string[]} [opts.with=[]] TODO + * @param {Object} [opts.findOpts] Options to pass to collection#find. + * @param {boolean} [opts.raw=false] Whether to return a more detailed + * response object. + * @param {string[]} [opts.with=[]] Relations to eager load. * @return {Promise} */ - findAll: function findAll(Resource, query, options) { + findAll: function findAll(mapper, query, opts) { var self = this; - var items = null; - options = self.origify(options ? DSUtils.copy(options) : {}); - options.with = options.with || []; - DSUtils.deepMixIn(options, self.getQueryOptions(Resource, query)); - var mongoQuery = self.getQuery(Resource, query); + opts || (opts = {}); + opts.with || (opts.with = []); + + var records = []; + var op = undefined; + var findOpts = self.getOpt('findOpts', opts); + fillIn(findOpts, self.getQueryOptions(mapper, query)); + findOpts.fields || (findOpts.fields = {}); + var mongoQuery = self.getQuery(mapper, query); + return self.getClient().then(function (client) { - return new DSUtils.Promise(function (resolve, reject) { - options.fields = options.fields || {}; - client.collection(Resource.table || underscore(Resource.name)).find(mongoQuery, options).toArray(function (err, r) { - if (err) { - reject(err); - } else { - resolve(self.translateId(r, options)); - } + // beforeFindAll lifecycle hook + op = opts.op = 'beforeFindAll'; + return resolve(self[op](mapper, query, opts)).then(function () { + return new Promise(function (resolve, reject) { + client.collection(mapper.table || underscore(mapper.name)).find(mongoQuery, findOpts).toArray(function (err, cursor) { + return err ? reject(err) : resolve(cursor); + }); }); }); - }).then(function (_items) { - items = _items; + }).then(function (_records) { + records = _records; + self._translateId(records, opts); var tasks = []; - var relationList = Resource.relationList || []; - relationList.forEach(function (def) { - var relationName = def.relation; - var relationDef = Resource.getResource(relationName); - var containedName = null; - if (options.with.indexOf(relationName) !== -1) { - containedName = relationName; - } else if (options.with.indexOf(def.localField) !== -1) { - containedName = def.localField; - } - if (containedName) { + forEachRelation(mapper, opts, function (def, __opts) { + var relatedMapper = def.getRelation(); + var task = undefined; + if (def.foreignKey && (def.type === 'hasOne' || def.type === 'hasMany')) { + if (def.type === 'hasMany') { + task = self.loadHasMany(mapper, def, records, __opts); + } else { + task = self.loadHasOne(mapper, def, records, __opts); + } + } else if (def.type === 'hasMany' && def.localKeys) { (function () { - var __options = DSUtils.deepMixIn({}, options.orig ? options.orig() : options); - __options.with = options.with.slice(); - __options = DSUtils._(relationDef, __options); - DSUtils.remove(__options.with, containedName); - __options.with.forEach(function (relation, i) { - if (relation && relation.indexOf(containedName) === 0 && relation.length >= containedName.length && relation[containedName.length] === '.') { - __options.with[i] = relation.substr(containedName.length + 1); - } else { - __options.with[i] = ''; - } + var localKeys = []; + records.forEach(function (item) { + var itemKeys = item[def.localKeys] || []; + itemKeys = isArray(itemKeys) ? itemKeys : Object.keys(itemKeys); + localKeys = localKeys.concat(itemKeys); }); - - var task = undefined; - - if (def.foreignKey && (def.type === 'hasOne' || def.type === 'hasMany')) { - if (def.type === 'hasMany') { - task = self.loadHasMany(Resource, def, items, __options); - } else { - task = self.loadHasOne(Resource, def, items, __options); - } - } else if (def.type === 'hasMany' && def.localKeys) { - (function () { - var localKeys = []; - items.forEach(function (item) { - var itemKeys = item[def.localKeys] || []; - itemKeys = DSUtils.isArray(itemKeys) ? itemKeys : Object.keys(itemKeys); - localKeys = localKeys.concat(itemKeys || []); - }); - task = self.findAll(Resource.getResource(relationName), { - where: babelHelpers.defineProperty({}, relationDef.idAttribute, { - 'in': unique(localKeys).filter(function (x) { - return x; - }).map(function (x) { - return self.toObjectID(relationDef, x); - }) - }) - }, __options).then(function (relatedItems) { - items.forEach(function (item) { - var attached = []; - var itemKeys = item[def.localKeys] || []; - itemKeys = DSUtils.isArray(itemKeys) ? itemKeys : DSUtils.keys(itemKeys); - relatedItems.forEach(function (relatedItem) { - if (itemKeys && itemKeys.indexOf(relatedItem[relationDef.idAttribute]) !== -1) { - attached.push(relatedItem); - } - }); - DSUtils.set(item, def.localField, attached); - }); - return relatedItems; + task = self.findAll(relatedMapper, { + where: babelHelpers.defineProperty({}, relatedMapper.idAttribute, { + 'in': unique(localKeys).filter(function (x) { + return x; + }).map(function (x) { + return self.toObjectID(relatedMapper, x); + }) + }) + }, __opts).then(function (relatedItems) { + records.forEach(function (item) { + var attached = []; + var itemKeys = get(item, def.localKeys) || []; + itemKeys = isArray(itemKeys) ? itemKeys : Object.keys(itemKeys); + relatedItems.forEach(function (relatedItem) { + if (itemKeys && itemKeys.indexOf(relatedItem[relatedMapper.idAttribute]) !== -1) { + attached.push(relatedItem); + } }); - })(); - } else if (def.type === 'belongsTo' || def.type === 'hasOne' && def.localKey) { - task = self.loadBelongsTo(Resource, def, items, __options); - } - - if (task) { - tasks.push(task); - } + def.setLocalField(item, attached); + }); + return relatedItems; + }); })(); + } else if (def.type === 'hasMany' && def.foreignKeys) { + throw new Error('findAll eager load hasMany foreignKeys not supported!'); + } else if (def.type === 'belongsTo') { + task = self.loadBelongsTo(mapper, def, records, __opts); + } + if (task) { + tasks.push(task); } }); - return DSUtils.Promise.all(tasks); + return Promise.all(tasks); }).then(function () { - return items; + // afterFindAll lifecycle hook + op = opts.op = 'afterFindAll'; + return resolve(self[op](mapper, query, opts, records)).then(function (_records) { + // Allow for re-assignment from lifecycle hook + records = isUndefined(_records) ? records : _records; + return self.getOpt('raw', opts) ? { + data: records, + found: records.length + } : records; + }); }); }, @@ -718,28 +1016,109 @@ addHiddenPropsToTarget(MongoDBAdapter.prototype, { * * @name MongoDBAdapter#create * @method - * @param {Object} Resource The Resource. + * @param {Object} mapper The mapper. * @param {Object} props The record to be created. * @param {Object} [opts] Configuration options. + * @param {Object} [opts.insertOpts] Options to pass to collection#insert. + * @param {boolean} [opts.raw=false] Whether to return a more detailed + * response object. * @return {Promise} */ - create: function create(Resource, props, opts) { + create: function create(mapper, props, opts) { var self = this; - props = DSUtils.removeCircular(DSUtils.omit(props, Resource.relationFields || [])); - opts = self.origify(opts); + var op = undefined; + props || (props = {}); + opts || (opts = {}); + + var insertOpts = self.getOpt('insertOpts', opts); return self.getClient().then(function (client) { - return new DSUtils.Promise(function (resolve, reject) { - var collection = client.collection(Resource.table || underscore(Resource.name)); - var method = collection.insertOne ? DSUtils.isArray(props) ? 'insertMany' : 'insertOne' : 'insert'; - collection[method](props, opts, function (err, r) { - if (err) { - reject(err); - } else { - r = r.ops ? r.ops : r; - self.translateId(r, opts); - resolve(DSUtils.isArray(props) ? r : r[0]); - } + // beforeCreate lifecycle hook + op = opts.op = 'beforeCreate'; + return resolve(self[op](mapper, props, opts)).then(function (_props) { + // Allow for re-assignment from lifecycle hook + _props = isUndefined(_props) ? props : _props; + return new Promise(function (resolve, reject) { + var collection = client.collection(mapper.table || underscore(mapper.name)); + var method = collection.insertOne ? 'insertOne' : 'insert'; + collection[method](_props, insertOpts, function (err, cursor) { + return err ? reject(err) : resolve(cursor); + }); + }); + }).then(function (cursor) { + var record = undefined; + var r = cursor.ops ? cursor.ops : cursor; + self._translateId(r, opts); + record = isArray(r) ? r[0] : r; + + // afterCreate lifecycle hook + op = opts.op = 'afterCreate'; + return self[op](mapper, props, opts, record).then(function (_record) { + // Allow for re-assignment from lifecycle hook + record = isUndefined(_record) ? record : _record; + var result = {}; + fillIn(result, cursor); + delete result.connection; + result.data = record; + result.created = record ? 1 : 0; + return self.getOpt('raw', opts) ? result : result.data; + }); + }); + }); + }, + + + /** + * Create multiple records in a single batch. + * + * @name MongoDBAdapter#createMany + * @method + * @param {Object} mapper The mapper. + * @param {Object} props The records to be created. + * @param {Object} [opts] Configuration options. + * @param {Object} [opts.insertManyOpts] Options to pass to + * collection#insertMany. + * @param {boolean} [opts.raw=false] Whether to return a more detailed + * response object. + * @return {Promise} + */ + createMany: function createMany(mapper, props, opts) { + var self = this; + var op = undefined; + props || (props = {}); + opts || (opts = {}); + + var insertManyOpts = self.getOpt('insertManyOpts', opts); + + return self.getClient().then(function (client) { + // beforeCreateMany lifecycle hook + op = opts.op = 'beforeCreateMany'; + return resolve(self[op](mapper, props, opts)).then(function (_props) { + // Allow for re-assignment from lifecycle hook + _props = isUndefined(_props) ? props : _props; + return new Promise(function (resolve, reject) { + var collection = client.collection(mapper.table || underscore(mapper.name)); + collection.insertMany(_props, insertManyOpts, function (err, cursor) { + return err ? reject(err) : resolve(cursor); + }); + }); + }).then(function (cursor) { + var records = undefined; + var r = cursor.ops ? cursor.ops : cursor; + self._translateId(r, opts); + records = r; + + // afterCreateMany lifecycle hook + op = opts.op = 'afterCreateMany'; + return self[op](mapper, props, opts, records).then(function (_records) { + // Allow for re-assignment from lifecycle hook + records = isUndefined(_records) ? records : _records; + var result = {}; + fillIn(result, cursor); + delete result.connection; + result.data = records; + result.created = records.length; + return self.getOpt('raw', opts) ? result : result.data; }); }); }); @@ -754,25 +1133,42 @@ addHiddenPropsToTarget(MongoDBAdapter.prototype, { * @param {Object} Resource The Resource. * @param {(string|number)} id Primary key of the record to destroy. * @param {Object} [opts] Configuration options. + * @param {boolean} [opts.raw=false] Whether to return a more detailed + * response object. + * @param {Object} [opts.removeOpts] Options to pass to collection#remove. * @return {Promise} */ - destroy: function destroy(Resource, id, opts) { + destroy: function destroy(mapper, id, opts) { var self = this; - opts = self.origify(opts); + var op = undefined; + opts || (opts = {}); + var removeOpts = self.getOpt('removeOpts', opts); return self.getClient().then(function (client) { - return new DSUtils.Promise(function (resolve, reject) { - var mongoQuery = {}; - mongoQuery[Resource.idAttribute] = self.toObjectID(Resource, id); - var collection = client.collection(Resource.table || underscore(Resource.name)); - collection[collection.deleteOne ? 'deleteOne' : 'remove'](mongoQuery, opts, function (err) { - if (err) { - reject(err); - } else { - resolve(); - } + // beforeDestroy lifecycle hook + op = opts.op = 'beforeDestroy'; + return resolve(self[op](mapper, id, opts)).then(function () { + return new Promise(function (resolve, reject) { + var mongoQuery = {}; + mongoQuery[mapper.idAttribute] = self.toObjectID(mapper, id); + var collection = client.collection(mapper.table || underscore(mapper.name)); + collection[collection.deleteOne ? 'deleteOne' : 'remove'](mongoQuery, removeOpts, function (err, cursor) { + return err ? reject(err) : resolve(cursor); + }); }); }); + }).then(function (cursor) { + // afterDestroy lifecycle hook + op = opts.op = 'afterDestroy'; + return resolve(self[op](mapper, id, opts, cursor)).then(function (_cursor) { + // Allow for re-assignment from lifecycle hook + return isUndefined(_cursor) ? cursor : _cursor; + }); + }).then(function (cursor) { + if (cursor) { + delete cursor.connection; + } + return self.getOpt('raw', opts) ? cursor : undefined; }); }, @@ -782,28 +1178,46 @@ addHiddenPropsToTarget(MongoDBAdapter.prototype, { * * @name MongoDBAdapter#destroyAll * @method - * @param {Object} Resource the Resource. + * @param {Object} mapper the mapper. * @param {Object} [query] Selection query. * @param {Object} [opts] Configuration options. + * @param {boolean} [opts.raw=false] Whether to return a more detailed + * response object. + * @param {Object} [opts.removeOpts] Options to pass to collection#remove. * @return {Promise} */ - destroyAll: function destroyAll(Resource, query, opts) { + destroyAll: function destroyAll(mapper, query, opts) { var self = this; - opts = self.origify(opts ? DSUtils.copy(opts) : {}); + var op = undefined; + query || (query = {}); + opts || (opts = {}); + var removeOpts = self.getOpt('removeOpts', opts); + fillIn(removeOpts, self.getQueryOptions(mapper, query)); return self.getClient().then(function (client) { - DSUtils.deepMixIn(opts, self.getQueryOptions(Resource, query)); - var mongoQuery = self.getQuery(Resource, query); - return new DSUtils.Promise(function (resolve, reject) { - var collection = client.collection(Resource.table || underscore(Resource.name)); - collection[collection.deleteMany ? 'deleteMany' : 'remove'](mongoQuery, opts, function (err) { - if (err) { - reject(err); - } else { - resolve(); - } + // beforeDestroyAll lifecycle hook + op = opts.op = 'beforeDestroyAll'; + return resolve(self[op](mapper, query, opts)).then(function () { + var mongoQuery = self.getQuery(mapper, query); + return new Promise(function (resolve, reject) { + var collection = client.collection(mapper.table || underscore(mapper.name)); + collection[collection.deleteMany ? 'deleteMany' : 'remove'](mongoQuery, removeOpts, function (err, cursor) { + return err ? reject(err) : resolve(cursor); + }); }); }); + }).then(function (cursor) { + // afterDestroyAll lifecycle hook + op = opts.op = 'afterDestroyAll'; + return resolve(self[op](mapper, query, opts, cursor)).then(function (_cursor) { + // Allow for re-assignment from lifecycle hook + return isUndefined(_cursor) ? cursor : _cursor; + }); + }).then(function (cursor) { + if (cursor) { + delete cursor.connection; + } + return self.getOpt('raw', opts) ? cursor : undefined; }); }, @@ -813,34 +1227,59 @@ addHiddenPropsToTarget(MongoDBAdapter.prototype, { * * @name MongoDBAdapter#update * @method - * @param {Object} Resource The Resource. + * @param {Object} mapper The mapper. * @param {(string|number)} id The primary key of the record to be updated. * @param {Object} props The update to apply to the record. * @param {Object} [opts] Configuration options. + * @param {boolean} [opts.raw=false] Whether to return a more detailed + * response object. + * @param {Object} [opts.updateOpts] Options to pass to collection#update. * @return {Promise} */ - update: function update(Resource, id, props, opts) { + update: function update(mapper, id, props, opts) { var self = this; - props = DSUtils.removeCircular(DSUtils.omit(props, Resource.relationFields || [])); - opts = self.origify(opts); - - return self.find(Resource, id, opts).then(function () { - return self.getClient(); - }).then(function (client) { - return new DSUtils.Promise(function (resolve, reject) { - var mongoQuery = {}; - mongoQuery[Resource.idAttribute] = self.toObjectID(Resource, id); - var collection = client.collection(Resource.table || underscore(Resource.name)); - collection[collection.updateOne ? 'updateOne' : 'update'](mongoQuery, { $set: props }, opts, function (err) { - if (err) { - reject(err); - } else { - resolve(); - } + props || (props = {}); + opts || (opts = {}); + var op = undefined; + var updateOpts = self.getOpt('updateOpts', opts); + + return self.find(mapper, id, { raw: false }).then(function (record) { + if (!record) { + throw new Error('Not Found'); + } + // beforeUpdate lifecycle hook + op = opts.op = 'beforeUpdate'; + return resolve(self[op](mapper, id, props, opts)); + }).then(function (_props) { + // Allow for re-assignment from lifecycle hook + _props = isUndefined(_props) ? props : _props; + return self.getClient().then(function (client) { + return new Promise(function (resolve, reject) { + var mongoQuery = {}; + mongoQuery[mapper.idAttribute] = self.toObjectID(mapper, id); + var collection = client.collection(mapper.table || underscore(mapper.name)); + collection[collection.updateOne ? 'updateOne' : 'update'](mongoQuery, { $set: _props }, updateOpts, function (err, cursor) { + return err ? reject(err) : resolve(cursor); + }); + }); + }); + }).then(function (cursor) { + if (cursor) { + delete cursor.connection; + } + return self.find(mapper, id, { raw: false }).then(function (record) { + // afterUpdate lifecycle hook + op = opts.op = 'afterUpdate'; + return resolve(self[op](mapper, id, props, opts, record)).then(function (_record) { + // Allow for re-assignment from lifecycle hook + record = isUndefined(_record) ? record : _record; + var result = {}; + fillIn(result, cursor); + result.data = record; + result.updated = record ? 1 : 0; + return self.getOpt('raw', opts) ? result : result.data; }); }); - }).then(function () { - return self.find(Resource, id, opts); }); }, @@ -850,48 +1289,79 @@ addHiddenPropsToTarget(MongoDBAdapter.prototype, { * * @name MongoDBAdapter#updateAll * @method - * @param {Object} Resource The Resource. + * @param {Object} mapper The mapper. * @param {Object} props The update to apply to the selected records. * @param {Object} [query] Selection query. * @param {Object} [opts] Configuration options. + * @param {boolean} [opts.raw=false] Whether to return a more detailed + * response object. + * @param {Object} [opts.updateOpts] Options to pass to collection#update. * @return {Promise} */ - updateAll: function updateAll(Resource, props, query, opts) { + updateAll: function updateAll(mapper, props, query, opts) { var self = this; - var ids = []; - props = DSUtils.removeCircular(DSUtils.omit(props, Resource.relationFields || [])); - opts = self.origify(opts ? DSUtils.copy(opts) : {}); - var mongoOptions = DSUtils.copy(opts); - mongoOptions.multi = true; + props || (props = {}); + query || (query = {}); + opts || (opts = {}); + var op = undefined, + ids = undefined; + var updateOpts = self.getOpt('updateOpts', opts); + updateOpts.multi = true; return self.getClient().then(function (client) { - var queryOptions = self.getQueryOptions(Resource, query); + var queryOptions = self.getQueryOptions(mapper, query); queryOptions.$set = props; - var mongoQuery = self.getQuery(Resource, query); - - return self.findAll(Resource, query, opts).then(function (items) { - ids = items.map(function (item) { - return self.toObjectID(Resource, item[Resource.idAttribute]); + var mongoQuery = self.getQuery(mapper, query); + + // beforeUpdateAll lifecycle hook + op = opts.op = 'beforeUpdateAll'; + return resolve(self[op](mapper, props, query, opts)).then(function () { + return self.findAll(mapper, query, { raw: false }); + }).then(function (records) { + ids = records.map(function (record) { + return self.toObjectID(mapper, record[mapper.idAttribute]); }); - return new DSUtils.Promise(function (resolve, reject) { - var collection = client.collection(Resource.table || underscore(Resource.name)); - collection[collection.updateMany ? 'updateMany' : 'update'](mongoQuery, queryOptions, mongoOptions, function (err) { - if (err) { - reject(err); - } else { - resolve(); - } + return new Promise(function (resolve, reject) { + var collection = client.collection(mapper.table || underscore(mapper.name)); + collection[collection.updateMany ? 'updateMany' : 'update'](mongoQuery, queryOptions, updateOpts, function (err, cursor) { + return err ? reject(err) : resolve(cursor); }); }); - }).then(function () { + }).then(function (cursor) { + if (cursor) { + delete cursor.connection; + } var query = {}; - query[Resource.idAttribute] = { + query[mapper.idAttribute] = { 'in': ids }; - return self.findAll(Resource, query, opts); + return self.findAll(mapper, query, { raw: false }).then(function (records) { + // afterUpdateAll lifecycle hook + op = opts.op = 'afterUpdateAll'; + return self[op](mapper, props, query, opts, records).then(function (_records) { + // Allow for re-assignment from lifecycle hook + records = isUndefined(_records) ? records : _records; + var result = {}; + fillIn(result, cursor); + result.data = records; + result.updated = records.length; + return self.getOpt('raw', opts) ? result : result.data; + }); + }); }); }); + }, + + + /** + * Not supported. + * + * @name MongoDBAdapter#updateMany + * @method + */ + updateMany: function updateMany() { + throw new Error('not supported!'); } }); diff --git a/dist/js-data-mongodb.js.map b/dist/js-data-mongodb.js.map index 1a17d24..2ba08f4 100644 --- a/dist/js-data-mongodb.js.map +++ b/dist/js-data-mongodb.js.map @@ -1 +1 @@ -{"version":3,"file":"js-data-mongodb.js","sources":["../src/index.js"],"sourcesContent":["const mongodb = require('mongodb')\r\nconst MongoClient = mongodb.MongoClient\r\nconst bson = require('bson')\r\nconst ObjectID = bson.ObjectID\r\nconst JSData = require('js-data')\r\nconst underscore = require('mout/string/underscore')\r\nconst { DSUtils } = JSData\r\n\r\nconst reserved = [\r\n 'orderBy',\r\n 'sort',\r\n 'limit',\r\n 'offset',\r\n 'skip',\r\n 'where'\r\n]\r\n\r\nfunction Defaults () {}\r\n\r\nDefaults.prototype.translateId = true\r\n\r\nconst addHiddenPropsToTarget = function (target, props) {\r\n DSUtils.forOwn(props, function (value, key) {\r\n props[key] = {\r\n writable: true,\r\n value\r\n }\r\n })\r\n Object.defineProperties(target, props)\r\n}\r\n\r\nconst fillIn = function (dest, src) {\r\n DSUtils.forOwn(src, function (value, key) {\r\n if (!dest.hasOwnProperty(key) || dest[key] === undefined) {\r\n dest[key] = value\r\n }\r\n })\r\n}\r\n\r\nfunction unique (array) {\r\n const seen = {}\r\n const final = []\r\n array.forEach(function (item) {\r\n if (item in seen) {\r\n return\r\n }\r\n final.push(item)\r\n seen[item] = 0\r\n })\r\n return final\r\n}\r\n\r\n/**\r\n * MongoDBAdapter class.\r\n *\r\n * @example\r\n * import {DS} from 'js-data'\r\n * import MongoDBAdapter from 'js-data-mongodb'\r\n * const store = new DS()\r\n * const adapter = new MongoDBAdapter({\r\n * uri: 'mongodb://localhost:27017'\r\n * })\r\n * store.registerAdapter('mongodb', adapter, { 'default': true })\r\n *\r\n * @class MongoDBAdapter\r\n * @param {Object} [opts] Configuration opts.\r\n * @param {string} [opts.uri=''] MongoDB URI.\r\n */\r\nexport default function MongoDBAdapter (opts) {\r\n const self = this\r\n if (typeof opts === 'string') {\r\n opts = { uri: opts }\r\n }\r\n opts.uri || (opts.uri = 'mongodb://localhost:27017')\r\n self.defaults = new Defaults()\r\n DSUtils.deepMixIn(self.defaults, opts)\r\n fillIn(self, opts)\r\n\r\n /**\r\n * A Promise that resolves to a reference to the MongoDB client being used by\r\n * this adapter.\r\n *\r\n * @name MongoDBAdapter#client\r\n * @type {Object}\r\n */\r\n self.client = new DSUtils.Promise(function (resolve, reject) {\r\n MongoClient.connect(opts.uri, function (err, db) {\r\n return err ? reject(err) : resolve(db)\r\n })\r\n })\r\n}\r\n\r\naddHiddenPropsToTarget(MongoDBAdapter.prototype, {\r\n /**\r\n * Return a Promise that resolves to a reference to the MongoDB client being\r\n * used by this adapter.\r\n *\r\n * Useful when you need to do anything custom with the MongoDB client library.\r\n *\r\n * @name MongoDBAdapter#getClient\r\n * @method\r\n * @return {Object} MongoDB client.\r\n */\r\n getClient () {\r\n return this.client\r\n },\r\n\r\n /**\r\n * Map filtering params in a selection query to MongoDB a filtering object.\r\n *\r\n * Handles the following:\r\n *\r\n * - where\r\n * - and bunch of filtering operators\r\n *\r\n * @name MongoDBAdapter#getQuery\r\n * @method\r\n * @return {Object}\r\n */\r\n getQuery (Resource, query) {\r\n query || (query = {})\r\n query.where || (query.where = {})\r\n\r\n DSUtils.forOwn(query, function (v, k) {\r\n if (reserved.indexOf(k) === -1) {\r\n if (DSUtils.isObject(v)) {\r\n query.where[k] = v\r\n } else {\r\n query.where[k] = {\r\n '==': v\r\n }\r\n }\r\n delete query[k]\r\n }\r\n })\r\n\r\n let mongoQuery = {}\r\n\r\n if (Object.keys(query.where).length) {\r\n DSUtils.forOwn(query.where, function (criteria, field) {\r\n if (!DSUtils.isObject(criteria)) {\r\n query.where[field] = {\r\n '==': criteria\r\n }\r\n }\r\n DSUtils.forOwn(criteria, function (v, op) {\r\n if (op === '==' || op === '===') {\r\n mongoQuery[field] = v\r\n } else if (op === '!=' || op === '!==') {\r\n mongoQuery[field] = mongoQuery[field] || {}\r\n mongoQuery[field].$ne = v\r\n } else if (op === '>') {\r\n mongoQuery[field] = mongoQuery[field] || {}\r\n mongoQuery[field].$gt = v\r\n } else if (op === '>=') {\r\n mongoQuery[field] = mongoQuery[field] || {}\r\n mongoQuery[field].$gte = v\r\n } else if (op === '<') {\r\n mongoQuery[field] = mongoQuery[field] || {}\r\n mongoQuery[field].$lt = v\r\n } else if (op === '<=') {\r\n mongoQuery[field] = mongoQuery[field] || {}\r\n mongoQuery[field].$lte = v\r\n } else if (op === 'in') {\r\n mongoQuery[field] = mongoQuery[field] || {}\r\n mongoQuery[field].$in = v\r\n } else if (op === 'notIn') {\r\n mongoQuery[field] = mongoQuery[field] || {}\r\n mongoQuery[field].$nin = v\r\n } else if (op === '|==' || op === '|===') {\r\n mongoQuery.$or = mongoQuery.$or || []\r\n let orEqQuery = {}\r\n orEqQuery[field] = v\r\n mongoQuery.$or.push(orEqQuery)\r\n } else if (op === '|!=' || op === '|!==') {\r\n mongoQuery.$or = mongoQuery.$or || []\r\n let orNeQuery = {}\r\n orNeQuery[field] = {\r\n '$ne': v\r\n }\r\n mongoQuery.$or.push(orNeQuery)\r\n } else if (op === '|>') {\r\n mongoQuery.$or = mongoQuery.$or || []\r\n let orGtQuery = {}\r\n orGtQuery[field] = {\r\n '$gt': v\r\n }\r\n mongoQuery.$or.push(orGtQuery)\r\n } else if (op === '|>=') {\r\n mongoQuery.$or = mongoQuery.$or || []\r\n let orGteQuery = {}\r\n orGteQuery[field] = {\r\n '$gte': v\r\n }\r\n mongoQuery.$or.push(orGteQuery)\r\n } else if (op === '|<') {\r\n mongoQuery.$or = mongoQuery.$or || []\r\n let orLtQuery = {}\r\n orLtQuery[field] = {\r\n '$lt': v\r\n }\r\n mongoQuery.$or.push(orLtQuery)\r\n } else if (op === '|<=') {\r\n mongoQuery.$or = mongoQuery.$or || []\r\n let orLteQuery = {}\r\n orLteQuery[field] = {\r\n '$lte': v\r\n }\r\n mongoQuery.$or.push(orLteQuery)\r\n } else if (op === '|in') {\r\n mongoQuery.$or = mongoQuery.$or || []\r\n let orInQuery = {}\r\n orInQuery[field] = {\r\n '$in': v\r\n }\r\n mongoQuery.$or.push(orInQuery)\r\n } else if (op === '|notIn') {\r\n mongoQuery.$or = mongoQuery.$or || []\r\n let orNinQuery = {}\r\n orNinQuery[field] = {\r\n '$nin': v\r\n }\r\n mongoQuery.$or.push(orNinQuery)\r\n }\r\n })\r\n })\r\n }\r\n\r\n return mongoQuery\r\n },\r\n\r\n /**\r\n * Map non-filtering params in a selection query to MongoDB query options.\r\n *\r\n * Handles the following:\r\n *\r\n * - limit\r\n * - skip/offset\r\n * - orderBy/sort\r\n *\r\n * @name MongoDBAdapter#getQueryOptions\r\n * @method\r\n * @return {Object}\r\n */\r\n getQueryOptions (Resource, query) {\r\n query = query || {}\r\n query.orderBy = query.orderBy || query.sort\r\n query.skip = query.skip || query.offset\r\n\r\n let queryOptions = {}\r\n\r\n if (query.orderBy) {\r\n if (DSUtils.isString(query.orderBy)) {\r\n query.orderBy = [\r\n [query.orderBy, 'asc']\r\n ]\r\n }\r\n for (var i = 0; i < query.orderBy.length; i++) {\r\n if (DSUtils.isString(query.orderBy[i])) {\r\n query.orderBy[i] = [query.orderBy[i], 'asc']\r\n }\r\n }\r\n queryOptions.sort = query.orderBy\r\n }\r\n\r\n if (query.skip) {\r\n queryOptions.skip = +query.skip\r\n }\r\n\r\n if (query.limit) {\r\n queryOptions.limit = +query.limit\r\n }\r\n\r\n return queryOptions\r\n },\r\n\r\n /**\r\n * TODO\r\n *\r\n * @name MongoDBAdapter#translateId\r\n * @method\r\n * @return {*}\r\n */\r\n translateId (r, opts) {\r\n opts || (opts = {})\r\n if (typeof opts.translateId === 'boolean' ? opts.translateId : this.defaults.translateId) {\r\n if (DSUtils.isArray(r)) {\r\n r.forEach(function (_r) {\r\n const __id = _r._id ? _r._id.toString() : _r._id\r\n _r._id = typeof __id === 'string' ? __id : _r._id\r\n })\r\n } else if (DSUtils.isObject(r)) {\r\n const __id = r._id ? r._id.toString() : r._id\r\n r._id = typeof __id === 'string' ? __id : r._id\r\n }\r\n }\r\n return r\r\n },\r\n\r\n /**\r\n * TODO\r\n *\r\n * @name MongoDBAdapter#origify\r\n * @method\r\n * @return {Object}\r\n */\r\n origify (opts) {\r\n opts = opts || {}\r\n if (typeof opts.orig === 'function') {\r\n return opts.orig()\r\n }\r\n return opts\r\n },\r\n\r\n /**\r\n * TODO\r\n *\r\n * @name MongoDBAdapter#makeHasManyForeignKey\r\n * @method\r\n * @return {*}\r\n */\r\n toObjectID (Resource, id) {\r\n if (id !== undefined && Resource.idAttribute === '_id' && typeof id === 'string' && ObjectID.isValid(id) && !(id instanceof ObjectID)) {\r\n return new ObjectID(id)\r\n }\r\n return id\r\n },\r\n\r\n /**\r\n * TODO\r\n *\r\n * If the foreignKeys in your database are saved as ObjectIDs, then override\r\n * this method and change it to something like:\r\n *\r\n * ```\r\n * return this.toObjectID(Resource, this.constructor.prototype.makeHasManyForeignKey.call(this, Resource, def, record))\r\n * ```\r\n *\r\n * There may be other reasons why you may want to override this method, like\r\n * when the id of the parent doesn't exactly match up to the key on the child.\r\n *\r\n * @name MongoDBAdapter#makeHasManyForeignKey\r\n * @method\r\n * @return {*}\r\n */\r\n makeHasManyForeignKey (Resource, def, record) {\r\n return DSUtils.get(record, Resource.idAttribute)\r\n },\r\n\r\n /**\r\n * TODO\r\n *\r\n * @name MongoDBAdapter#loadHasMany\r\n * @method\r\n * @return {Promise}\r\n */\r\n loadHasMany (Resource, def, records, __options) {\r\n const self = this\r\n let singular = false\r\n\r\n if (DSUtils.isObject(records) && !DSUtils.isArray(records)) {\r\n singular = true\r\n records = [records]\r\n }\r\n const IDs = records.map(function (record) {\r\n return self.makeHasManyForeignKey(Resource, def, record)\r\n })\r\n const query = {}\r\n const criteria = query[def.foreignKey] = {}\r\n if (singular) {\r\n // more efficient query when we only have one record\r\n criteria['=='] = IDs[0]\r\n } else {\r\n criteria['in'] = IDs.filter(function (id) {\r\n return id\r\n })\r\n }\r\n return self.findAll(Resource.getResource(def.relation), query, __options).then(function (relatedItems) {\r\n records.forEach(function (record) {\r\n let attached = []\r\n // avoid unneccesary iteration when we only have one record\r\n if (singular) {\r\n attached = relatedItems\r\n } else {\r\n relatedItems.forEach(function (relatedItem) {\r\n if (DSUtils.get(relatedItem, def.foreignKey) === record[Resource.idAttribute]) {\r\n attached.push(relatedItem)\r\n }\r\n })\r\n }\r\n DSUtils.set(record, def.localField, attached)\r\n })\r\n })\r\n },\r\n\r\n /**\r\n * TODO\r\n *\r\n * @name MongoDBAdapter#loadHasOne\r\n * @method\r\n * @return {Promise}\r\n */\r\n loadHasOne (Resource, def, records, __options) {\r\n if (DSUtils.isObject(records) && !DSUtils.isArray(records)) {\r\n records = [records]\r\n }\r\n return this.loadHasMany(Resource, def, records, __options).then(function () {\r\n records.forEach(function (record) {\r\n const relatedData = DSUtils.get(record, def.localField)\r\n if (DSUtils.isArray(relatedData) && relatedData.length) {\r\n DSUtils.set(record, def.localField, relatedData[0])\r\n }\r\n })\r\n })\r\n },\r\n\r\n /**\r\n * TODO\r\n *\r\n * @name MongoDBAdapter#makeBelongsToForeignKey\r\n * @method\r\n * @return {*}\r\n */\r\n makeBelongsToForeignKey (Resource, def, record) {\r\n return this.toObjectID(Resource.getResource(def.relation), DSUtils.get(record, def.localKey))\r\n },\r\n\r\n /**\r\n * TODO\r\n *\r\n * @name MongoDBAdapter#loadBelongsTo\r\n * @method\r\n * @return {Promise}\r\n */\r\n loadBelongsTo (Resource, def, records, __options) {\r\n const self = this\r\n const relationDef = Resource.getResource(def.relation)\r\n\r\n if (DSUtils.isObject(records) && !DSUtils.isArray(records)) {\r\n const record = records\r\n return self.find(relationDef, self.makeBelongsToForeignKey(Resource, def, record), __options).then(function (relatedItem) {\r\n DSUtils.set(record, def.localField, relatedItem)\r\n })\r\n } else {\r\n const keys = records.map(function (record) {\r\n return self.makeBelongsToForeignKey(Resource, def, record)\r\n }).filter(function (key) {\r\n return key\r\n })\r\n return self.findAll(relationDef, {\r\n where: {\r\n [relationDef.idAttribute]: {\r\n 'in': keys\r\n }\r\n }\r\n }, __options).then(function (relatedItems) {\r\n records.forEach(function (record) {\r\n relatedItems.forEach(function (relatedItem) {\r\n if (relatedItem[relationDef.idAttribute] === record[def.localKey]) {\r\n DSUtils.set(record, def.localField, relatedItem)\r\n }\r\n })\r\n })\r\n })\r\n }\r\n },\r\n\r\n /**\r\n * Retrieve the record with the given primary key.\r\n *\r\n * @name MongoDBAdapter#find\r\n * @method\r\n * @param {Object} Resource The Resource.\r\n * @param {(string|number)} id Primary key of the record to retrieve.\r\n * @param {Object} [opts] Configuration options.\r\n * @param {string[]} [opts.with=[]] TODO\r\n * @return {Promise}\r\n */\r\n find (Resource, id, options) {\r\n const self = this\r\n let instance\r\n options = self.origify(options)\r\n options.with || (options.with = [])\r\n return self.getClient().then(function (client) {\r\n return new DSUtils.Promise(function (resolve, reject) {\r\n let mongoQuery = {}\r\n mongoQuery[Resource.idAttribute] = self.toObjectID(Resource, id)\r\n options.fields = options.fields || {}\r\n client.collection(Resource.table || underscore(Resource.name)).findOne(mongoQuery, options, function (err, r) {\r\n if (err) {\r\n reject(err)\r\n } else if (!r) {\r\n reject(new Error('Not Found!'))\r\n } else {\r\n resolve(self.translateId(r, options))\r\n }\r\n })\r\n })\r\n }).then(function (_instance) {\r\n instance = _instance\r\n let tasks = []\r\n const relationList = Resource.relationList || []\r\n\r\n relationList.forEach(function (def) {\r\n let relationName = def.relation\r\n let relationDef = Resource.getResource(relationName)\r\n let containedName = null\r\n if (options.with.indexOf(relationName) !== -1) {\r\n containedName = relationName\r\n } else if (options.with.indexOf(def.localField) !== -1) {\r\n containedName = def.localField\r\n }\r\n if (containedName) {\r\n let __options = DSUtils.deepMixIn({}, options.orig ? options.orig() : options)\r\n __options.with = options.with.slice()\r\n __options = DSUtils._(relationDef, __options)\r\n DSUtils.remove(__options.with, containedName)\r\n __options.with.forEach(function (relation, i) {\r\n if (relation && relation.indexOf(containedName) === 0 && relation.length >= containedName.length && relation[containedName.length] === '.') {\r\n __options.with[i] = relation.substr(containedName.length + 1)\r\n } else {\r\n __options.with[i] = ''\r\n }\r\n })\r\n\r\n let task\r\n\r\n if (def.foreignKey && (def.type === 'hasOne' || def.type === 'hasMany')) {\r\n if (def.type === 'hasOne') {\r\n task = self.loadHasOne(Resource, def, instance, __options)\r\n } else {\r\n task = self.loadHasMany(Resource, def, instance, __options)\r\n }\r\n } else if (def.type === 'hasMany' && def.localKeys) {\r\n let localKeys = []\r\n let itemKeys = instance[def.localKeys] || []\r\n itemKeys = DSUtils.isArray(itemKeys) ? itemKeys : DSUtils.keys(itemKeys)\r\n localKeys = localKeys.concat(itemKeys || [])\r\n task = self.findAll(Resource.getResource(relationName), {\r\n where: {\r\n [relationDef.idAttribute]: {\r\n 'in': unique(localKeys).filter((x) => x).map((x) => self.toObjectID(relationDef, x))\r\n }\r\n }\r\n }, __options).then(function (relatedItems) {\r\n DSUtils.set(instance, def.localField, relatedItems)\r\n return relatedItems\r\n })\r\n } else if (def.type === 'belongsTo' || (def.type === 'hasOne' && def.localKey)) {\r\n task = self.loadBelongsTo(Resource, def, instance, __options)\r\n }\r\n\r\n if (task) {\r\n tasks.push(task)\r\n }\r\n }\r\n })\r\n\r\n return DSUtils.Promise.all(tasks)\r\n }).then(function () {\r\n return instance\r\n })\r\n },\r\n\r\n /**\r\n * Retrieve the records that match the selection query.\r\n *\r\n * @name MongoDBAdapter#findAll\r\n * @method\r\n * @param {Object} Resource The Resource.\r\n * @param {Object} query Selection query.\r\n * @param {Object} [opts] Configuration options.\r\n * @param {string[]} [opts.with=[]] TODO\r\n * @return {Promise}\r\n */\r\n findAll (Resource, query, options) {\r\n const self = this\r\n let items = null\r\n options = self.origify(options ? DSUtils.copy(options) : {})\r\n options.with = options.with || []\r\n DSUtils.deepMixIn(options, self.getQueryOptions(Resource, query))\r\n const mongoQuery = self.getQuery(Resource, query)\r\n return self.getClient().then(function (client) {\r\n return new DSUtils.Promise(function (resolve, reject) {\r\n options.fields = options.fields || {}\r\n client.collection(Resource.table || underscore(Resource.name)).find(mongoQuery, options).toArray((err, r) => {\r\n if (err) {\r\n reject(err)\r\n } else {\r\n resolve(self.translateId(r, options))\r\n }\r\n })\r\n })\r\n }).then(function (_items) {\r\n items = _items\r\n let tasks = []\r\n const relationList = Resource.relationList || []\r\n relationList.forEach(function (def) {\r\n let relationName = def.relation\r\n let relationDef = Resource.getResource(relationName)\r\n let containedName = null\r\n if (options.with.indexOf(relationName) !== -1) {\r\n containedName = relationName\r\n } else if (options.with.indexOf(def.localField) !== -1) {\r\n containedName = def.localField\r\n }\r\n if (containedName) {\r\n let __options = DSUtils.deepMixIn({}, options.orig ? options.orig() : options)\r\n __options.with = options.with.slice()\r\n __options = DSUtils._(relationDef, __options)\r\n DSUtils.remove(__options.with, containedName)\r\n __options.with.forEach(function (relation, i) {\r\n if (relation && relation.indexOf(containedName) === 0 && relation.length >= containedName.length && relation[containedName.length] === '.') {\r\n __options.with[i] = relation.substr(containedName.length + 1)\r\n } else {\r\n __options.with[i] = ''\r\n }\r\n })\r\n\r\n let task\r\n\r\n if (def.foreignKey && (def.type === 'hasOne' || def.type === 'hasMany')) {\r\n if (def.type === 'hasMany') {\r\n task = self.loadHasMany(Resource, def, items, __options)\r\n } else {\r\n task = self.loadHasOne(Resource, def, items, __options)\r\n }\r\n } else if (def.type === 'hasMany' && def.localKeys) {\r\n let localKeys = []\r\n items.forEach(function (item) {\r\n let itemKeys = item[def.localKeys] || []\r\n itemKeys = DSUtils.isArray(itemKeys) ? itemKeys : Object.keys(itemKeys)\r\n localKeys = localKeys.concat(itemKeys || [])\r\n })\r\n task = self.findAll(Resource.getResource(relationName), {\r\n where: {\r\n [relationDef.idAttribute]: {\r\n 'in': unique(localKeys).filter((x) => x).map((x) => self.toObjectID(relationDef, x))\r\n }\r\n }\r\n }, __options).then(function (relatedItems) {\r\n items.forEach(function (item) {\r\n let attached = []\r\n let itemKeys = item[def.localKeys] || []\r\n itemKeys = DSUtils.isArray(itemKeys) ? itemKeys : DSUtils.keys(itemKeys)\r\n relatedItems.forEach(function (relatedItem) {\r\n if (itemKeys && itemKeys.indexOf(relatedItem[relationDef.idAttribute]) !== -1) {\r\n attached.push(relatedItem)\r\n }\r\n })\r\n DSUtils.set(item, def.localField, attached)\r\n })\r\n return relatedItems\r\n })\r\n } else if (def.type === 'belongsTo' || (def.type === 'hasOne' && def.localKey)) {\r\n task = self.loadBelongsTo(Resource, def, items, __options)\r\n }\r\n\r\n if (task) {\r\n tasks.push(task)\r\n }\r\n }\r\n })\r\n return DSUtils.Promise.all(tasks)\r\n }).then(function () {\r\n return items\r\n })\r\n },\r\n\r\n /**\r\n * Create a new record.\r\n *\r\n * @name MongoDBAdapter#create\r\n * @method\r\n * @param {Object} Resource The Resource.\r\n * @param {Object} props The record to be created.\r\n * @param {Object} [opts] Configuration options.\r\n * @return {Promise}\r\n */\r\n create (Resource, props, opts) {\r\n const self = this\r\n props = DSUtils.removeCircular(DSUtils.omit(props, Resource.relationFields || []))\r\n opts = self.origify(opts)\r\n\r\n return self.getClient().then(function (client) {\r\n return new DSUtils.Promise(function (resolve, reject) {\r\n const collection = client.collection(Resource.table || underscore(Resource.name))\r\n const method = collection.insertOne ? DSUtils.isArray(props) ? 'insertMany' : 'insertOne' : 'insert'\r\n collection[method](props, opts, function (err, r) {\r\n if (err) {\r\n reject(err)\r\n } else {\r\n r = r.ops ? r.ops : r\r\n self.translateId(r, opts)\r\n resolve(DSUtils.isArray(props) ? r : r[0])\r\n }\r\n })\r\n })\r\n })\r\n },\r\n\r\n /**\r\n * Destroy the record with the given primary key.\r\n *\r\n * @name MongoDBAdapter#destroy\r\n * @method\r\n * @param {Object} Resource The Resource.\r\n * @param {(string|number)} id Primary key of the record to destroy.\r\n * @param {Object} [opts] Configuration options.\r\n * @return {Promise}\r\n */\r\n destroy (Resource, id, opts) {\r\n const self = this\r\n opts = self.origify(opts)\r\n\r\n return self.getClient().then(function (client) {\r\n return new DSUtils.Promise(function (resolve, reject) {\r\n const mongoQuery = {}\r\n mongoQuery[Resource.idAttribute] = self.toObjectID(Resource, id)\r\n const collection = client.collection(Resource.table || underscore(Resource.name))\r\n collection[collection.deleteOne ? 'deleteOne' : 'remove'](mongoQuery, opts, function (err) {\r\n if (err) {\r\n reject(err)\r\n } else {\r\n resolve()\r\n }\r\n })\r\n })\r\n })\r\n },\r\n\r\n /**\r\n * Destroy the records that match the selection query.\r\n *\r\n * @name MongoDBAdapter#destroyAll\r\n * @method\r\n * @param {Object} Resource the Resource.\r\n * @param {Object} [query] Selection query.\r\n * @param {Object} [opts] Configuration options.\r\n * @return {Promise}\r\n */\r\n destroyAll (Resource, query, opts) {\r\n const self = this\r\n opts = self.origify(opts ? DSUtils.copy(opts) : {})\r\n\r\n return self.getClient().then(function (client) {\r\n DSUtils.deepMixIn(opts, self.getQueryOptions(Resource, query))\r\n const mongoQuery = self.getQuery(Resource, query)\r\n return new DSUtils.Promise(function (resolve, reject) {\r\n const collection = client.collection(Resource.table || underscore(Resource.name))\r\n collection[collection.deleteMany ? 'deleteMany' : 'remove'](mongoQuery, opts, function (err) {\r\n if (err) {\r\n reject(err)\r\n } else {\r\n resolve()\r\n }\r\n })\r\n })\r\n })\r\n },\r\n\r\n /**\r\n * Apply the given update to the record with the specified primary key.\r\n *\r\n * @name MongoDBAdapter#update\r\n * @method\r\n * @param {Object} Resource The Resource.\r\n * @param {(string|number)} id The primary key of the record to be updated.\r\n * @param {Object} props The update to apply to the record.\r\n * @param {Object} [opts] Configuration options.\r\n * @return {Promise}\r\n */\r\n update (Resource, id, props, opts) {\r\n const self = this\r\n props = DSUtils.removeCircular(DSUtils.omit(props, Resource.relationFields || []))\r\n opts = self.origify(opts)\r\n\r\n return self.find(Resource, id, opts).then(function () {\r\n return self.getClient()\r\n }).then(function (client) {\r\n return new DSUtils.Promise(function (resolve, reject) {\r\n const mongoQuery = {}\r\n mongoQuery[Resource.idAttribute] = self.toObjectID(Resource, id)\r\n const collection = client.collection(Resource.table || underscore(Resource.name))\r\n collection[collection.updateOne ? 'updateOne' : 'update'](mongoQuery, { $set: props }, opts, function (err) {\r\n if (err) {\r\n reject(err)\r\n } else {\r\n resolve()\r\n }\r\n })\r\n })\r\n }).then(function () {\r\n return self.find(Resource, id, opts)\r\n })\r\n },\r\n\r\n /**\r\n * Apply the given update to all records that match the selection query.\r\n *\r\n * @name MongoDBAdapter#updateAll\r\n * @method\r\n * @param {Object} Resource The Resource.\r\n * @param {Object} props The update to apply to the selected records.\r\n * @param {Object} [query] Selection query.\r\n * @param {Object} [opts] Configuration options.\r\n * @return {Promise}\r\n */\r\n updateAll (Resource, props, query, opts) {\r\n const self = this\r\n let ids = []\r\n props = DSUtils.removeCircular(DSUtils.omit(props, Resource.relationFields || []))\r\n opts = self.origify(opts ? DSUtils.copy(opts) : {})\r\n const mongoOptions = DSUtils.copy(opts)\r\n mongoOptions.multi = true\r\n\r\n return self.getClient().then(function (client) {\r\n const queryOptions = self.getQueryOptions(Resource, query)\r\n queryOptions.$set = props\r\n const mongoQuery = self.getQuery(Resource, query)\r\n\r\n return self.findAll(Resource, query, opts).then(function (items) {\r\n ids = items.map(function (item) {\r\n return self.toObjectID(Resource, item[Resource.idAttribute])\r\n })\r\n\r\n return new DSUtils.Promise(function (resolve, reject) {\r\n const collection = client.collection(Resource.table || underscore(Resource.name))\r\n collection[collection.updateMany ? 'updateMany' : 'update'](mongoQuery, queryOptions, mongoOptions, function (err) {\r\n if (err) {\r\n reject(err)\r\n } else {\r\n resolve()\r\n }\r\n })\r\n })\r\n }).then(function () {\r\n const query = {}\r\n query[Resource.idAttribute] = {\r\n 'in': ids\r\n }\r\n return self.findAll(Resource, query, opts)\r\n })\r\n })\r\n }\r\n})\r\n"],"names":[],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"js-data-mongodb.js","sources":["../src/index.js"],"sourcesContent":["import {MongoClient} from 'mongodb'\nimport {ObjectID} from 'bson'\nimport {utils} from 'js-data'\nimport underscore from 'mout/string/underscore'\n\nconst {\n addHiddenPropsToTarget,\n fillIn,\n forEachRelation,\n forOwn,\n get,\n isArray,\n isObject,\n isString,\n isUndefined,\n resolve\n} = utils\n\nconst reserved = [\n 'orderBy',\n 'sort',\n 'limit',\n 'offset',\n 'skip',\n 'where'\n]\n\nfunction unique (array) {\n const seen = {}\n const final = []\n array.forEach(function (item) {\n if (item in seen) {\n return\n }\n final.push(item)\n seen[item] = 0\n })\n return final\n}\n\nconst noop = function (...args) {\n const self = this\n const opts = args[args.length - 1]\n self.dbg(opts.op, ...args)\n return resolve()\n}\n\nconst noop2 = function (...args) {\n const self = this\n const opts = args[args.length - 2]\n self.dbg(opts.op, ...args)\n return resolve()\n}\n\nconst DEFAULTS = {\n /**\n * Whether to log debugging information.\n *\n * @name MongoDBAdapter#debug\n * @type {boolean}\n * @default false\n */\n debug: false,\n\n /**\n * Whether to return detailed result objects instead of just record data.\n *\n * @name MongoDBAdapter#raw\n * @type {boolean}\n * @default false\n */\n raw: false,\n\n /**\n * Convert ObjectIDs to strings when pulling records out of the database.\n *\n * @name MongoDBAdapter#translateId\n * @type {boolean}\n * @default true\n */\n translateId: true,\n\n /**\n * MongoDB URI.\n *\n * @name MongoDBAdapter#uri\n * @type {string}\n * @default mongodb://localhost:27017\n */\n uri: 'mongodb://localhost:27017'\n}\n\nconst FIND_OPTS_DEFAULTS = {}\nconst FIND_ONE_OPTS_DEFAULTS = {}\nconst INSERT_OPTS_DEFAULTS = {}\nconst INSERT_MANY_OPTS_DEFAULTS = {}\nconst UPDATE_OPTS_DEFAULTS = {}\nconst REMOVE_OPTS_DEFAULTS = {}\n\n/**\n * MongoDBAdapter class.\n *\n * @example\n * // Use Container instead of DataStore on the server\n * import {Container} from 'js-data'\n * import MongoDBAdapter from 'js-data-mongodb'\n *\n * // Create a store to hold your Mappers\n * const store = new Container({\n * mapperDefaults: {\n * // MongoDB uses \"_id\" as the primary key\n * idAttribute: '_id'\n * }\n * })\n *\n * // Create an instance of MongoDBAdapter with default settings\n * const adapter = new MongoDBAdapter()\n *\n * // Mappers in \"store\" will use the MongoDB adapter by default\n * store.registerAdapter('mongodb', adapter, { default: true })\n *\n * // Create a Mapper that maps to a \"user\" collection\n * store.defineMapper('user')\n *\n * @class MongoDBAdapter\n * @param {Object} [opts] Configuration opts.\n * @param {boolean} [opts.debug=false] Whether to log debugging information.\n * @param {Object} [opts.findOpts] Options to pass to collection#find.\n * @param {Object} [opts.findOneOpts] Options to pass to collection#findOne.\n * @param {Object} [opts.insertOpts] Options to pass to collection#insert.\n * @param {Object} [opts.insertManyOpts] Options to pass to\n * collection#insertMany.\n * @param {boolean} [opts.raw=false] Whether to return detailed result objects\n * instead of just record data.\n * @param {Object} [opts.removeOpts] Options to pass to collection#remove.\n * @param {boolean} [opts.translateId=true] Convert ObjectIDs to strings when\n * pulling records out of the database.\n * @param {Object} [opts.updateOpts] Options to pass to collection#update.\n * @param {string} [opts.uri=\"mongodb://localhost:27017\"] MongoDB URI.\n */\nexport default function MongoDBAdapter (opts) {\n const self = this\n opts || (opts = {})\n if (isString(opts)) {\n opts = { uri: opts }\n }\n fillIn(opts, DEFAULTS)\n fillIn(self, opts)\n\n /**\n * Default options to pass to collection#find.\n *\n * @name MongoDBAdapter#findOpts\n * @type {Object}\n * @default {}\n */\n self.findOpts || (self.findOpts = {})\n fillIn(self.findOpts, FIND_OPTS_DEFAULTS)\n\n /**\n * Default options to pass to collection#findOne.\n *\n * @name MongoDBAdapter#findOneOpts\n * @type {Object}\n * @default {}\n */\n self.findOneOpts || (self.findOneOpts = {})\n fillIn(self.findOneOpts, FIND_ONE_OPTS_DEFAULTS)\n\n /**\n * Default options to pass to collection#insert.\n *\n * @name MongoDBAdapter#insertOpts\n * @type {Object}\n * @default {}\n */\n self.insertOpts || (self.insertOpts = {})\n fillIn(self.insertOpts, INSERT_OPTS_DEFAULTS)\n\n /**\n * Default options to pass to collection#insertMany.\n *\n * @name MongoDBAdapter#insertManyOpts\n * @type {Object}\n * @default {}\n */\n self.insertManyOpts || (self.insertManyOpts = {})\n fillIn(self.insertManyOpts, INSERT_MANY_OPTS_DEFAULTS)\n\n /**\n * Default options to pass to collection#update.\n *\n * @name MongoDBAdapter#updateOpts\n * @type {Object}\n * @default {}\n */\n self.updateOpts || (self.updateOpts = {})\n fillIn(self.updateOpts, UPDATE_OPTS_DEFAULTS)\n\n /**\n * Default options to pass to collection#update.\n *\n * @name MongoDBAdapter#removeOpts\n * @type {Object}\n * @default {}\n */\n self.removeOpts || (self.removeOpts = {})\n fillIn(self.removeOpts, REMOVE_OPTS_DEFAULTS)\n\n /**\n * A Promise that resolves to a reference to the MongoDB client being used by\n * this adapter.\n *\n * @name MongoDBAdapter#client\n * @type {Object}\n */\n self.client = new Promise(function (resolve, reject) {\n MongoClient.connect(opts.uri, function (err, db) {\n return err ? reject(err) : resolve(db)\n })\n })\n}\n\naddHiddenPropsToTarget(MongoDBAdapter.prototype, {\n /**\n * Translate ObjectIDs to strings.\n *\n * @name MongoDBAdapter#_translateId\n * @method\n * @return {*}\n */\n _translateId (r, opts) {\n opts || (opts = {})\n if (this.getOpt('translateId', opts)) {\n if (isArray(r)) {\n r.forEach(function (_r) {\n const __id = _r._id ? _r._id.toString() : _r._id\n _r._id = typeof __id === 'string' ? __id : _r._id\n })\n } else if (isObject(r)) {\n const __id = r._id ? r._id.toString() : r._id\n r._id = typeof __id === 'string' ? __id : r._id\n }\n }\n return r\n },\n\n /**\n * @name MongoDBAdapter#afterCreate\n * @method\n */\n afterCreate: noop2,\n\n /**\n * @name MongoDBAdapter#afterCreateMany\n * @method\n */\n afterCreateMany: noop2,\n\n /**\n * @name MongoDBAdapter#afterDestroy\n * @method\n */\n afterDestroy: noop2,\n\n /**\n * @name MongoDBAdapter#afterDestroyAll\n * @method\n */\n afterDestroyAll: noop2,\n\n /**\n * @name MongoDBAdapter#afterFind\n * @method\n */\n afterFind: noop2,\n\n /**\n * @name MongoDBAdapter#afterFindAll\n * @method\n */\n afterFindAll: noop2,\n\n /**\n * @name MongoDBAdapter#afterUpdate\n * @method\n */\n afterUpdate: noop2,\n\n /**\n * @name MongoDBAdapter#afterUpdateAll\n * @method\n */\n afterUpdateAll: noop2,\n\n /**\n * @name MongoDBAdapter#afterUpdateMany\n * @method\n */\n afterUpdateMany: noop2,\n\n /**\n * @name MongoDBAdapter#beforeCreate\n * @method\n */\n beforeCreate: noop,\n\n /**\n * @name MongoDBAdapter#beforeCreateMany\n * @method\n */\n beforeCreateMany: noop,\n\n /**\n * @name MongoDBAdapter#beforeDestroy\n * @method\n */\n beforeDestroy: noop,\n\n /**\n * @name MongoDBAdapter#beforeDestroyAll\n * @method\n */\n beforeDestroyAll: noop,\n\n /**\n * @name MongoDBAdapter#beforeFind\n * @method\n */\n beforeFind: noop,\n\n /**\n * @name MongoDBAdapter#beforeFindAll\n * @method\n */\n beforeFindAll: noop,\n\n /**\n * @name MongoDBAdapter#beforeUpdate\n * @method\n */\n beforeUpdate: noop,\n\n /**\n * @name MongoDBAdapter#beforeUpdateAll\n * @method\n */\n beforeUpdateAll: noop,\n\n /**\n * @name MongoDBAdapter#beforeUpdateMany\n * @method\n */\n beforeUpdateMany: noop,\n\n /**\n * @name MongoDBAdapter#dbg\n * @method\n */\n dbg (...args) {\n this.log('debug', ...args)\n },\n\n /**\n * Return a Promise that resolves to a reference to the MongoDB client being\n * used by this adapter.\n *\n * Useful when you need to do anything custom with the MongoDB client library.\n *\n * @name MongoDBAdapter#getClient\n * @method\n * @return {Object} MongoDB client.\n */\n getClient () {\n return this.client\n },\n\n /**\n * Map filtering params in a selection query to MongoDB a filtering object.\n *\n * Handles the following:\n *\n * - where\n * - and bunch of filtering operators\n *\n * @name MongoDBAdapter#getQuery\n * @method\n * @return {Object}\n */\n getQuery (Resource, query) {\n query || (query = {})\n query.where || (query.where = {})\n\n forOwn(query, function (v, k) {\n if (reserved.indexOf(k) === -1) {\n if (isObject(v)) {\n query.where[k] = v\n } else {\n query.where[k] = {\n '==': v\n }\n }\n delete query[k]\n }\n })\n\n let mongoQuery = {}\n\n if (Object.keys(query.where).length !== 0) {\n forOwn(query.where, function (criteria, field) {\n if (!isObject(criteria)) {\n query.where[field] = {\n '==': criteria\n }\n }\n forOwn(criteria, function (v, op) {\n if (op === '==' || op === '===' || op === 'contains') {\n mongoQuery[field] = v\n } else if (op === '!=' || op === '!==' || op === 'notContains') {\n mongoQuery[field] = mongoQuery[field] || {}\n mongoQuery[field].$ne = v\n } else if (op === '>') {\n mongoQuery[field] = mongoQuery[field] || {}\n mongoQuery[field].$gt = v\n } else if (op === '>=') {\n mongoQuery[field] = mongoQuery[field] || {}\n mongoQuery[field].$gte = v\n } else if (op === '<') {\n mongoQuery[field] = mongoQuery[field] || {}\n mongoQuery[field].$lt = v\n } else if (op === '<=') {\n mongoQuery[field] = mongoQuery[field] || {}\n mongoQuery[field].$lte = v\n } else if (op === 'in') {\n mongoQuery[field] = mongoQuery[field] || {}\n mongoQuery[field].$in = v\n } else if (op === 'notIn') {\n mongoQuery[field] = mongoQuery[field] || {}\n mongoQuery[field].$nin = v\n } else if (op === '|==' || op === '|===' || op === '|contains') {\n mongoQuery.$or = mongoQuery.$or || []\n let orEqQuery = {}\n orEqQuery[field] = v\n mongoQuery.$or.push(orEqQuery)\n } else if (op === '|!=' || op === '|!==' || op === '|notContains') {\n mongoQuery.$or = mongoQuery.$or || []\n let orNeQuery = {}\n orNeQuery[field] = {\n '$ne': v\n }\n mongoQuery.$or.push(orNeQuery)\n } else if (op === '|>') {\n mongoQuery.$or = mongoQuery.$or || []\n let orGtQuery = {}\n orGtQuery[field] = {\n '$gt': v\n }\n mongoQuery.$or.push(orGtQuery)\n } else if (op === '|>=') {\n mongoQuery.$or = mongoQuery.$or || []\n let orGteQuery = {}\n orGteQuery[field] = {\n '$gte': v\n }\n mongoQuery.$or.push(orGteQuery)\n } else if (op === '|<') {\n mongoQuery.$or = mongoQuery.$or || []\n let orLtQuery = {}\n orLtQuery[field] = {\n '$lt': v\n }\n mongoQuery.$or.push(orLtQuery)\n } else if (op === '|<=') {\n mongoQuery.$or = mongoQuery.$or || []\n let orLteQuery = {}\n orLteQuery[field] = {\n '$lte': v\n }\n mongoQuery.$or.push(orLteQuery)\n } else if (op === '|in') {\n mongoQuery.$or = mongoQuery.$or || []\n let orInQuery = {}\n orInQuery[field] = {\n '$in': v\n }\n mongoQuery.$or.push(orInQuery)\n } else if (op === '|notIn') {\n mongoQuery.$or = mongoQuery.$or || []\n let orNinQuery = {}\n orNinQuery[field] = {\n '$nin': v\n }\n mongoQuery.$or.push(orNinQuery)\n }\n })\n })\n }\n\n return mongoQuery\n },\n\n /**\n * Logging utility method.\n *\n * @name MongoDBAdapter#log\n * @method\n */\n log (level, ...args) {\n if (level && !args.length) {\n args.push(level)\n level = 'debug'\n }\n if (level === 'debug' && !this.debug) {\n return\n }\n const prefix = `${level.toUpperCase()}: (MongoDBAdapter)`\n if (console[level]) {\n console[level](prefix, ...args)\n } else {\n console.log(prefix, ...args)\n }\n },\n\n /**\n * Map non-filtering params in a selection query to MongoDB query options.\n *\n * Handles the following:\n *\n * - limit\n * - skip/offset\n * - orderBy/sort\n *\n * @name MongoDBAdapter#getQueryOptions\n * @method\n * @return {Object}\n */\n getQueryOptions (Resource, query) {\n query = query || {}\n query.orderBy = query.orderBy || query.sort\n query.skip = query.skip || query.offset\n\n let queryOptions = {}\n\n if (query.orderBy) {\n if (isString(query.orderBy)) {\n query.orderBy = [\n [query.orderBy, 'asc']\n ]\n }\n for (var i = 0; i < query.orderBy.length; i++) {\n if (isString(query.orderBy[i])) {\n query.orderBy[i] = [query.orderBy[i], 'asc']\n }\n }\n queryOptions.sort = query.orderBy\n }\n\n if (query.skip) {\n queryOptions.skip = +query.skip\n }\n\n if (query.limit) {\n queryOptions.limit = +query.limit\n }\n\n return queryOptions\n },\n\n /**\n * Resolve the value of the specified option based on the given options and\n * this adapter's settings.\n *\n * @name MongoDBAdapter#getOpt\n * @method\n * @param {string} opt The name of the option.\n * @param {Object} [opts] Configuration options.\n * @return {*} The value of the specified option.\n */\n getOpt (opt, opts) {\n opts || (opts = {})\n return isUndefined(opts[opt]) ? this[opt] : opts[opt]\n },\n\n /**\n * Turn an _id into an ObjectID if it isn't already an ObjectID.\n *\n * @name MongoDBAdapter#toObjectID\n * @method\n * @return {*}\n */\n toObjectID (Resource, id) {\n if (id !== undefined && Resource.idAttribute === '_id' && typeof id === 'string' && ObjectID.isValid(id) && !(id instanceof ObjectID)) {\n return new ObjectID(id)\n }\n return id\n },\n\n /**\n * Return the foreignKey from the given record for the provided relationship.\n *\n * If the foreignKeys in your database are saved as ObjectIDs, then override\n * this method and change it to something like:\n *\n * ```\n * return this.toObjectID(mapper, this.constructor.prototype.makeHasManyForeignKey.call(this, mapper, def, record))\n * ```\n *\n * There may be other reasons why you may want to override this method, like\n * when the id of the parent doesn't exactly match up to the key on the child.\n *\n * @name MongoDBAdapter#makeHasManyForeignKey\n * @method\n * @return {*}\n */\n makeHasManyForeignKey (mapper, def, record) {\n return def.getForeignKey(record)\n },\n\n /**\n * Return the foreignKeys from the given record for the provided relationship.\n *\n * @name MongoDBAdapter#makeHasManyForeignKeys\n * @method\n * @return {*}\n */\n makeHasManyForeignKeys (mapper, def, record) {\n return get(record, mapper.idAttribute)\n },\n\n /**\n * Load a hasMany relationship.\n *\n * @name MongoDBAdapter#loadHasMany\n * @method\n * @return {Promise}\n */\n loadHasMany (mapper, def, records, __opts) {\n const self = this\n let singular = false\n\n if (isObject(records) && !isArray(records)) {\n singular = true\n records = [records]\n }\n const IDs = records.map(function (record) {\n return self.makeHasManyForeignKey(mapper, def, record)\n })\n const query = {}\n const criteria = query[def.foreignKey] = {}\n if (singular) {\n // more efficient query when we only have one record\n criteria['=='] = IDs[0]\n } else {\n criteria['in'] = IDs.filter(function (id) {\n return id\n })\n }\n return self.findAll(def.getRelation(), query, __opts).then(function (relatedItems) {\n records.forEach(function (record) {\n let attached = []\n // avoid unneccesary iteration when we only have one record\n if (singular) {\n attached = relatedItems\n } else {\n relatedItems.forEach(function (relatedItem) {\n if (get(relatedItem, def.foreignKey) === record[mapper.idAttribute]) {\n attached.push(relatedItem)\n }\n })\n }\n def.setLocalField(record, attached)\n })\n })\n },\n\n /**\n * Load a hasOne relationship.\n *\n * @name MongoDBAdapter#loadHasOne\n * @method\n * @return {Promise}\n */\n loadHasOne (mapper, def, records, __opts) {\n if (isObject(records) && !isArray(records)) {\n records = [records]\n }\n return this.loadHasMany(mapper, def, records, __opts).then(function () {\n records.forEach(function (record) {\n const relatedData = def.getLocalField(record)\n if (isArray(relatedData) && relatedData.length) {\n def.setLocalField(record, relatedData[0])\n }\n })\n })\n },\n\n /**\n * Return the foreignKey from the given record for the provided relationship.\n *\n * @name MongoDBAdapter#makeBelongsToForeignKey\n * @method\n * @return {*}\n */\n makeBelongsToForeignKey (mapper, def, record) {\n return this.toObjectID(def.getRelation(), def.getForeignKey(record))\n },\n\n /**\n * Load a belongsTo relationship.\n *\n * @name MongoDBAdapter#loadBelongsTo\n * @method\n * @return {Promise}\n */\n loadBelongsTo (mapper, def, records, __opts) {\n const self = this\n const relationDef = def.getRelation()\n\n if (isObject(records) && !isArray(records)) {\n const record = records\n return self.find(relationDef, self.makeBelongsToForeignKey(mapper, def, record), __opts).then(function (relatedItem) {\n def.setLocalField(record, relatedItem)\n })\n } else {\n const keys = records.map(function (record) {\n return self.makeBelongsToForeignKey(mapper, def, record)\n }).filter(function (key) {\n return key\n })\n return self.findAll(relationDef, {\n where: {\n [relationDef.idAttribute]: {\n 'in': keys\n }\n }\n }, __opts).then(function (relatedItems) {\n records.forEach(function (record) {\n relatedItems.forEach(function (relatedItem) {\n if (relatedItem[relationDef.idAttribute] === record[def.foreignKey]) {\n def.setLocalField(record, relatedItem)\n }\n })\n })\n })\n }\n },\n\n /**\n * Retrieve the record with the given primary key.\n *\n * @name MongoDBAdapter#find\n * @method\n * @param {Object} mapper The mapper.\n * @param {(string|number)} id Primary key of the record to retrieve.\n * @param {Object} [opts] Configuration options.\n * @param {Object} [opts.findOneOpts] Options to pass to collection#findOne.\n * @param {boolean} [opts.raw=false] Whether to return a more detailed\n * response object.\n * @param {string[]} [opts.with=[]] Relations to eager load.\n * @return {Promise}\n */\n find (mapper, id, opts) {\n const self = this\n let record, op\n opts || (opts = {})\n opts.with || (opts.with = [])\n\n const findOneOpts = self.getOpt('findOneOpts', opts)\n findOneOpts.fields || (findOneOpts.fields = {})\n\n return self.getClient().then(function (client) {\n // beforeFind lifecycle hook\n op = opts.op = 'beforeFind'\n return resolve(self[op](mapper, id, opts)).then(function () {\n return new Promise(function (resolve, reject) {\n let mongoQuery = {}\n mongoQuery[mapper.idAttribute] = self.toObjectID(mapper, id)\n client.collection(mapper.table || underscore(mapper.name)).findOne(mongoQuery, findOneOpts, function (err, cursor) {\n return err ? reject(err) : resolve(cursor)\n })\n })\n })\n }).then(function (_record) {\n if (!_record) {\n return\n }\n record = _record\n self._translateId(record, opts)\n const tasks = []\n\n forEachRelation(mapper, opts, function (def, __opts) {\n const relatedMapper = def.getRelation()\n let task\n\n if (def.foreignKey && (def.type === 'hasOne' || def.type === 'hasMany')) {\n if (def.type === 'hasOne') {\n task = self.loadHasOne(mapper, def, record, __opts)\n } else {\n task = self.loadHasMany(mapper, def, record, __opts)\n }\n } else if (def.type === 'hasMany' && def.localKeys) {\n let localKeys = []\n let itemKeys = get(record, def.localKeys) || []\n itemKeys = isArray(itemKeys) ? itemKeys : Object.keys(itemKeys)\n localKeys = localKeys.concat(itemKeys)\n task = self.findAll(relatedMapper, {\n where: {\n [relatedMapper.idAttribute]: {\n 'in': unique(localKeys).filter(function (x) { return x }).map(function (x) { return self.toObjectID(relatedMapper, x) })\n }\n }\n }, __opts).then(function (relatedItems) {\n def.setLocalField(record, relatedItems)\n })\n } else if (def.type === 'hasMany' && def.foreignKeys) {\n task = self.findAll(relatedMapper, {\n where: {\n [def.foreignKeys]: {\n 'contains': self.makeHasManyForeignKeys(mapper, def, record)\n }\n }\n }, __opts).then(function (relatedItems) {\n def.setLocalField(record, relatedItems)\n })\n } else if (def.type === 'belongsTo') {\n task = self.loadBelongsTo(mapper, def, record, __opts)\n }\n if (task) {\n tasks.push(task)\n }\n })\n\n return Promise.all(tasks)\n }).then(function () {\n // afterFind lifecycle hook\n op = opts.op = 'afterFind'\n return resolve(self[op](mapper, id, opts, record)).then(function (_record) {\n // Allow for re-assignment from lifecycle hook\n record = isUndefined(_record) ? record : _record\n return self.getOpt('raw', opts) ? {\n data: record,\n found: record ? 1 : 0\n } : record\n })\n })\n },\n\n /**\n * Retrieve the records that match the selection query.\n *\n * @name MongoDBAdapter#findAll\n * @method\n * @param {Object} mapper The mapper.\n * @param {Object} query Selection query.\n * @param {Object} [opts] Configuration options.\n * @param {Object} [opts.findOpts] Options to pass to collection#find.\n * @param {boolean} [opts.raw=false] Whether to return a more detailed\n * response object.\n * @param {string[]} [opts.with=[]] Relations to eager load.\n * @return {Promise}\n */\n findAll (mapper, query, opts) {\n const self = this\n opts || (opts = {})\n opts.with || (opts.with = [])\n\n let records = []\n let op\n const findOpts = self.getOpt('findOpts', opts)\n fillIn(findOpts, self.getQueryOptions(mapper, query))\n findOpts.fields || (findOpts.fields = {})\n const mongoQuery = self.getQuery(mapper, query)\n\n return self.getClient().then(function (client) {\n // beforeFindAll lifecycle hook\n op = opts.op = 'beforeFindAll'\n return resolve(self[op](mapper, query, opts)).then(function () {\n return new Promise(function (resolve, reject) {\n client.collection(mapper.table || underscore(mapper.name)).find(mongoQuery, findOpts).toArray(function (err, cursor) {\n return err ? reject(err) : resolve(cursor)\n })\n })\n })\n }).then(function (_records) {\n records = _records\n self._translateId(records, opts)\n const tasks = []\n forEachRelation(mapper, opts, function (def, __opts) {\n const relatedMapper = def.getRelation()\n let task\n if (def.foreignKey && (def.type === 'hasOne' || def.type === 'hasMany')) {\n if (def.type === 'hasMany') {\n task = self.loadHasMany(mapper, def, records, __opts)\n } else {\n task = self.loadHasOne(mapper, def, records, __opts)\n }\n } else if (def.type === 'hasMany' && def.localKeys) {\n let localKeys = []\n records.forEach(function (item) {\n let itemKeys = item[def.localKeys] || []\n itemKeys = isArray(itemKeys) ? itemKeys : Object.keys(itemKeys)\n localKeys = localKeys.concat(itemKeys)\n })\n task = self.findAll(relatedMapper, {\n where: {\n [relatedMapper.idAttribute]: {\n 'in': unique(localKeys).filter(function (x) { return x }).map(function (x) { return self.toObjectID(relatedMapper, x) })\n }\n }\n }, __opts).then(function (relatedItems) {\n records.forEach(function (item) {\n let attached = []\n let itemKeys = get(item, def.localKeys) || []\n itemKeys = isArray(itemKeys) ? itemKeys : Object.keys(itemKeys)\n relatedItems.forEach(function (relatedItem) {\n if (itemKeys && itemKeys.indexOf(relatedItem[relatedMapper.idAttribute]) !== -1) {\n attached.push(relatedItem)\n }\n })\n def.setLocalField(item, attached)\n })\n return relatedItems\n })\n } else if (def.type === 'hasMany' && def.foreignKeys) {\n throw new Error('findAll eager load hasMany foreignKeys not supported!')\n } else if (def.type === 'belongsTo') {\n task = self.loadBelongsTo(mapper, def, records, __opts)\n }\n if (task) {\n tasks.push(task)\n }\n })\n return Promise.all(tasks)\n }).then(function () {\n // afterFindAll lifecycle hook\n op = opts.op = 'afterFindAll'\n return resolve(self[op](mapper, query, opts, records)).then(function (_records) {\n // Allow for re-assignment from lifecycle hook\n records = isUndefined(_records) ? records : _records\n return self.getOpt('raw', opts) ? {\n data: records,\n found: records.length\n } : records\n })\n })\n },\n\n /**\n * Create a new record.\n *\n * @name MongoDBAdapter#create\n * @method\n * @param {Object} mapper The mapper.\n * @param {Object} props The record to be created.\n * @param {Object} [opts] Configuration options.\n * @param {Object} [opts.insertOpts] Options to pass to collection#insert.\n * @param {boolean} [opts.raw=false] Whether to return a more detailed\n * response object.\n * @return {Promise}\n */\n create (mapper, props, opts) {\n const self = this\n let op\n props || (props = {})\n opts || (opts = {})\n\n const insertOpts = self.getOpt('insertOpts', opts)\n\n return self.getClient().then(function (client) {\n // beforeCreate lifecycle hook\n op = opts.op = 'beforeCreate'\n return resolve(self[op](mapper, props, opts)).then(function (_props) {\n // Allow for re-assignment from lifecycle hook\n _props = isUndefined(_props) ? props : _props\n return new Promise(function (resolve, reject) {\n const collection = client.collection(mapper.table || underscore(mapper.name))\n const method = collection.insertOne ? 'insertOne' : 'insert'\n collection[method](_props, insertOpts, function (err, cursor) {\n return err ? reject(err) : resolve(cursor)\n })\n })\n }).then(function (cursor) {\n let record\n let r = cursor.ops ? cursor.ops : cursor\n self._translateId(r, opts)\n record = isArray(r) ? r[0] : r\n\n // afterCreate lifecycle hook\n op = opts.op = 'afterCreate'\n return self[op](mapper, props, opts, record).then(function (_record) {\n // Allow for re-assignment from lifecycle hook\n record = isUndefined(_record) ? record : _record\n const result = {}\n fillIn(result, cursor)\n delete result.connection\n result.data = record\n result.created = record ? 1 : 0\n return self.getOpt('raw', opts) ? result : result.data\n })\n })\n })\n },\n\n /**\n * Create multiple records in a single batch.\n *\n * @name MongoDBAdapter#createMany\n * @method\n * @param {Object} mapper The mapper.\n * @param {Object} props The records to be created.\n * @param {Object} [opts] Configuration options.\n * @param {Object} [opts.insertManyOpts] Options to pass to\n * collection#insertMany.\n * @param {boolean} [opts.raw=false] Whether to return a more detailed\n * response object.\n * @return {Promise}\n */\n createMany (mapper, props, opts) {\n const self = this\n let op\n props || (props = {})\n opts || (opts = {})\n\n const insertManyOpts = self.getOpt('insertManyOpts', opts)\n\n return self.getClient().then(function (client) {\n // beforeCreateMany lifecycle hook\n op = opts.op = 'beforeCreateMany'\n return resolve(self[op](mapper, props, opts)).then(function (_props) {\n // Allow for re-assignment from lifecycle hook\n _props = isUndefined(_props) ? props : _props\n return new Promise(function (resolve, reject) {\n const collection = client.collection(mapper.table || underscore(mapper.name))\n collection.insertMany(_props, insertManyOpts, function (err, cursor) {\n return err ? reject(err) : resolve(cursor)\n })\n })\n }).then(function (cursor) {\n let records\n let r = cursor.ops ? cursor.ops : cursor\n self._translateId(r, opts)\n records = r\n\n // afterCreateMany lifecycle hook\n op = opts.op = 'afterCreateMany'\n return self[op](mapper, props, opts, records).then(function (_records) {\n // Allow for re-assignment from lifecycle hook\n records = isUndefined(_records) ? records : _records\n const result = {}\n fillIn(result, cursor)\n delete result.connection\n result.data = records\n result.created = records.length\n return self.getOpt('raw', opts) ? result : result.data\n })\n })\n })\n },\n\n /**\n * Destroy the record with the given primary key.\n *\n * @name MongoDBAdapter#destroy\n * @method\n * @param {Object} Resource The Resource.\n * @param {(string|number)} id Primary key of the record to destroy.\n * @param {Object} [opts] Configuration options.\n * @param {boolean} [opts.raw=false] Whether to return a more detailed\n * response object.\n * @param {Object} [opts.removeOpts] Options to pass to collection#remove.\n * @return {Promise}\n */\n destroy (mapper, id, opts) {\n const self = this\n let op\n opts || (opts = {})\n const removeOpts = self.getOpt('removeOpts', opts)\n\n return self.getClient().then(function (client) {\n // beforeDestroy lifecycle hook\n op = opts.op = 'beforeDestroy'\n return resolve(self[op](mapper, id, opts)).then(function () {\n return new Promise(function (resolve, reject) {\n const mongoQuery = {}\n mongoQuery[mapper.idAttribute] = self.toObjectID(mapper, id)\n const collection = client.collection(mapper.table || underscore(mapper.name))\n collection[collection.deleteOne ? 'deleteOne' : 'remove'](mongoQuery, removeOpts, function (err, cursor) {\n return err ? reject(err) : resolve(cursor)\n })\n })\n })\n }).then(function (cursor) {\n // afterDestroy lifecycle hook\n op = opts.op = 'afterDestroy'\n return resolve(self[op](mapper, id, opts, cursor)).then(function (_cursor) {\n // Allow for re-assignment from lifecycle hook\n return isUndefined(_cursor) ? cursor : _cursor\n })\n }).then(function (cursor) {\n if (cursor) {\n delete cursor.connection\n }\n return self.getOpt('raw', opts) ? cursor : undefined\n })\n },\n\n /**\n * Destroy the records that match the selection query.\n *\n * @name MongoDBAdapter#destroyAll\n * @method\n * @param {Object} mapper the mapper.\n * @param {Object} [query] Selection query.\n * @param {Object} [opts] Configuration options.\n * @param {boolean} [opts.raw=false] Whether to return a more detailed\n * response object.\n * @param {Object} [opts.removeOpts] Options to pass to collection#remove.\n * @return {Promise}\n */\n destroyAll (mapper, query, opts) {\n const self = this\n let op\n query || (query = {})\n opts || (opts = {})\n const removeOpts = self.getOpt('removeOpts', opts)\n fillIn(removeOpts, self.getQueryOptions(mapper, query))\n\n return self.getClient().then(function (client) {\n // beforeDestroyAll lifecycle hook\n op = opts.op = 'beforeDestroyAll'\n return resolve(self[op](mapper, query, opts)).then(function () {\n const mongoQuery = self.getQuery(mapper, query)\n return new Promise(function (resolve, reject) {\n const collection = client.collection(mapper.table || underscore(mapper.name))\n collection[collection.deleteMany ? 'deleteMany' : 'remove'](mongoQuery, removeOpts, function (err, cursor) {\n return err ? reject(err) : resolve(cursor)\n })\n })\n })\n }).then(function (cursor) {\n // afterDestroyAll lifecycle hook\n op = opts.op = 'afterDestroyAll'\n return resolve(self[op](mapper, query, opts, cursor)).then(function (_cursor) {\n // Allow for re-assignment from lifecycle hook\n return isUndefined(_cursor) ? cursor : _cursor\n })\n }).then(function (cursor) {\n if (cursor) {\n delete cursor.connection\n }\n return self.getOpt('raw', opts) ? cursor : undefined\n })\n },\n\n /**\n * Apply the given update to the record with the specified primary key.\n *\n * @name MongoDBAdapter#update\n * @method\n * @param {Object} mapper The mapper.\n * @param {(string|number)} id The primary key of the record to be updated.\n * @param {Object} props The update to apply to the record.\n * @param {Object} [opts] Configuration options.\n * @param {boolean} [opts.raw=false] Whether to return a more detailed\n * response object.\n * @param {Object} [opts.updateOpts] Options to pass to collection#update.\n * @return {Promise}\n */\n update (mapper, id, props, opts) {\n const self = this\n props || (props = {})\n opts || (opts = {})\n let op\n const updateOpts = self.getOpt('updateOpts', opts)\n\n return self.find(mapper, id, { raw: false }).then(function (record) {\n if (!record) {\n throw new Error('Not Found')\n }\n // beforeUpdate lifecycle hook\n op = opts.op = 'beforeUpdate'\n return resolve(self[op](mapper, id, props, opts))\n }).then(function (_props) {\n // Allow for re-assignment from lifecycle hook\n _props = isUndefined(_props) ? props : _props\n return self.getClient().then(function (client) {\n return new Promise(function (resolve, reject) {\n const mongoQuery = {}\n mongoQuery[mapper.idAttribute] = self.toObjectID(mapper, id)\n const collection = client.collection(mapper.table || underscore(mapper.name))\n collection[collection.updateOne ? 'updateOne' : 'update'](mongoQuery, { $set: _props }, updateOpts, function (err, cursor) {\n return err ? reject(err) : resolve(cursor)\n })\n })\n })\n }).then(function (cursor) {\n if (cursor) {\n delete cursor.connection\n }\n return self.find(mapper, id, { raw: false }).then(function (record) {\n // afterUpdate lifecycle hook\n op = opts.op = 'afterUpdate'\n return resolve(self[op](mapper, id, props, opts, record)).then(function (_record) {\n // Allow for re-assignment from lifecycle hook\n record = isUndefined(_record) ? record : _record\n const result = {}\n fillIn(result, cursor)\n result.data = record\n result.updated = record ? 1 : 0\n return self.getOpt('raw', opts) ? result : result.data\n })\n })\n })\n },\n\n /**\n * Apply the given update to all records that match the selection query.\n *\n * @name MongoDBAdapter#updateAll\n * @method\n * @param {Object} mapper The mapper.\n * @param {Object} props The update to apply to the selected records.\n * @param {Object} [query] Selection query.\n * @param {Object} [opts] Configuration options.\n * @param {boolean} [opts.raw=false] Whether to return a more detailed\n * response object.\n * @param {Object} [opts.updateOpts] Options to pass to collection#update.\n * @return {Promise}\n */\n updateAll (mapper, props, query, opts) {\n const self = this\n props || (props = {})\n query || (query = {})\n opts || (opts = {})\n let op, ids\n const updateOpts = self.getOpt('updateOpts', opts)\n updateOpts.multi = true\n\n return self.getClient().then(function (client) {\n const queryOptions = self.getQueryOptions(mapper, query)\n queryOptions.$set = props\n const mongoQuery = self.getQuery(mapper, query)\n\n // beforeUpdateAll lifecycle hook\n op = opts.op = 'beforeUpdateAll'\n return resolve(self[op](mapper, props, query, opts)).then(function () {\n return self.findAll(mapper, query, { raw: false })\n }).then(function (records) {\n ids = records.map(function (record) {\n return self.toObjectID(mapper, record[mapper.idAttribute])\n })\n\n return new Promise(function (resolve, reject) {\n const collection = client.collection(mapper.table || underscore(mapper.name))\n collection[collection.updateMany ? 'updateMany' : 'update'](mongoQuery, queryOptions, updateOpts, function (err, cursor) {\n return err ? reject(err) : resolve(cursor)\n })\n })\n }).then(function (cursor) {\n if (cursor) {\n delete cursor.connection\n }\n const query = {}\n query[mapper.idAttribute] = {\n 'in': ids\n }\n return self.findAll(mapper, query, { raw: false }).then(function (records) {\n // afterUpdateAll lifecycle hook\n op = opts.op = 'afterUpdateAll'\n return self[op](mapper, props, query, opts, records).then(function (_records) {\n // Allow for re-assignment from lifecycle hook\n records = isUndefined(_records) ? records : _records\n const result = {}\n fillIn(result, cursor)\n result.data = records\n result.updated = records.length\n return self.getOpt('raw', opts) ? result : result.data\n })\n })\n })\n })\n },\n\n /**\n * Not supported.\n *\n * @name MongoDBAdapter#updateMany\n * @method\n */\n updateMany () {\n throw new Error('not supported!')\n }\n})\n"],"names":["utils","ObjectID"],"mappings":"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"} \ No newline at end of file diff --git a/mocha.start.js b/mocha.start.js index 963f5f9..6392474 100644 --- a/mocha.start.js +++ b/mocha.start.js @@ -11,28 +11,34 @@ var MongoDBAdapter = require('./') TestRunner.init({ debug: false, - DS: JSData.DS, + JSData: JSData, Adapter: MongoDBAdapter, adapterConfig: { uri: 'mongodb://localhost:27017' }, + containerConfig: { + mapperDefaults: { + idAttribute: '_id' + } + }, storeConfig: { - bypassCache: true, - linkRelations: false, - cacheResponse: false, - idAttribute: '_id', - log: false, - debug: false + mapperDefaults: { + idAttribute: '_id' + } }, - features: [], methods: [ 'create', + 'createMany', 'destroy', 'destroyAll', 'find', 'findAll', 'update', 'updateAll' + ], + features: [ + 'findHasManyLocalKeys', + 'findHasManyForeignKeys' ] }) diff --git a/package.json b/package.json index b253480..bf3b46c 100644 --- a/package.json +++ b/package.json @@ -1,13 +1,13 @@ { "name": "js-data-mongodb", "description": "MongoDB adapter for js-data.", - "version": "0.7.0", + "version": "1.0.0-alpha.1", "homepage": "https://github.com/js-data/js-data-mongodb", "repository": { "type": "git", "url": "https://github.com/js-data/js-data-mongodb.git" }, - "author": "Jason Dobry (http://www.pseudobry.com)", + "author": "js-data-mongodb project authors", "license": "MIT", "main": "./dist/js-data-mongodb.js", "keywords": [ @@ -21,10 +21,14 @@ "standard": { "parser": "babel-eslint", "globals": [ - "beforeEach", "describe", + "it", + "sinon", "assert", - "it" + "before", + "after", + "beforeEach", + "afterEach" ] }, "scripts": { @@ -32,11 +36,20 @@ "bundle": "rollup -c rollup.config.js -f cjs -o dist/js-data-mongodb.js -m dist/js-data-mongodb.js.map src/index.js", "lint": "standard src/**/*.js mocha.start.js test/**/*.js", "build": "npm run lint && npm run bundle", - "mocha": "mocha -t 20000 -R dot -r source-map-support mocha.start.js", - "cover": "istanbul cover --hook-run-in-context node_modules/mocha/bin/_mocha -- -t 20000 -R dot -r source-map-support mocha.start.js", + "mocha": "mocha -t 20000 -R dot -r source-map-support/register mocha.start.js", + "cover": "istanbul cover --hook-run-in-context node_modules/mocha/bin/_mocha -- -t 20000 -R dot -r source-map-support/register mocha.start.js", "test": "npm run build && npm run cover", + "release": "npm test && npm run doc && node scripts/authors.js", "ci": "npm run test && cat coverage/lcov.info | coveralls || true && cat ./coverage/lcov.info | codacy-coverage || true" }, + "dependencies": { + "mout": "0.11.1" + }, + "peerDependencies": { + "bson": "^0.4.x || ^0.3.x", + "js-data": "^3.0.0-alpha.15", + "mongodb": ">=1.3.x" + }, "devDependencies": { "babel-core": "6.5.2", "babel-eslint": "5.0.0", @@ -44,21 +57,15 @@ "babel-preset-es2015-rollup": "1.1.1", "chai": "3.5.0", "codacy-coverage": "1.1.3", - "coveralls": "2.11.6", - "ink-docstrap": "1.1.2", + "coveralls": "2.11.8", + "ink-docstrap": "1.1.3", "istanbul": "0.4.2", - "js-data-adapter-tests": "^1.5.0", + "js-data-adapter-tests": "^2.0.0-alpha.10", "jsdoc": "3.4.0", "mocha": "2.4.5", "rollup": "0.25.4", - "rollup-plugin-babel": "2.3.9", + "rollup-plugin-babel": "2.4.0", "source-map-support": "0.4.0", "standard": "6.0.7" - }, - "dependencies": { - "bson": "^0.4.x || ^0.3.x", - "js-data": ">=2.0.0 <3", - "mongodb": ">=1.3.x", - "mout": "0.11.1" } } diff --git a/scripts/AUTHORS b/scripts/AUTHORS new file mode 100644 index 0000000..2858588 --- /dev/null +++ b/scripts/AUTHORS @@ -0,0 +1,7 @@ +# This is the official list of js-data-mongodb project authors. +# +# This file is controlled by scripts/authors.js +# +# Names are formatted as: +# # commits Name or Organization +# The email address is not required for organizations. diff --git a/scripts/CONTRIBUTORS b/scripts/CONTRIBUTORS new file mode 100644 index 0000000..b22007d --- /dev/null +++ b/scripts/CONTRIBUTORS @@ -0,0 +1,6 @@ +# People who have contributed to the js-data-mongodb project. +# +# This file is controlled by scripts/authors.js +# +# Names should be added to this file as: +# [commit count] Name diff --git a/scripts/authors.js b/scripts/authors.js new file mode 100644 index 0000000..82a856d --- /dev/null +++ b/scripts/authors.js @@ -0,0 +1,45 @@ +var fs = require('fs') +var exec = require('child_process').exec + +console.log('Writing AUTHORS file...') + +var authorsFile = fs.readFileSync(__dirname + '/AUTHORS', { + encoding: 'utf-8' +}) +var contributorsFile = fs.readFileSync(__dirname + '/CONTRIBUTORS', { + encoding: 'utf-8' +}) + +var tty = process.platform === 'win32' ? 'CON' : '/dev/tty'; + +exec('git shortlog -s -e < ' + tty, function (err, stdout, stderr) { + if (err) { + console.error(err) + process.exit(-1) + } else { + var lines = stdout.split('\n') + var countsAndNames = lines.map(function (line) { + return line.split('\t') + }) + var names = countsAndNames.map(function (pair) { + return pair[1] + }) + + // Add to or otherwise modify "names" if necessary + + fs.writeFileSync(__dirname + '/../AUTHORS', authorsFile + names.join('\n'), { + encoding: 'utf-8' + }) + console.log('Done!') + console.log('Writing CONTRIBUTORS file...') + + names = lines + + // Add to or otherwise modify "names" if necessary + + fs.writeFileSync(__dirname + '/../CONTRIBUTORS', contributorsFile + names.join('\n'), { + encoding: 'utf-8' + }) + console.log('Done!') + } +}) diff --git a/src/index.js b/src/index.js index ce83112..2180fe7 100644 --- a/src/index.js +++ b/src/index.js @@ -1,10 +1,20 @@ -const mongodb = require('mongodb') -const MongoClient = mongodb.MongoClient -const bson = require('bson') -const ObjectID = bson.ObjectID -const JSData = require('js-data') -const underscore = require('mout/string/underscore') -const { DSUtils } = JSData +import {MongoClient} from 'mongodb' +import {ObjectID} from 'bson' +import {utils} from 'js-data' +import underscore from 'mout/string/underscore' + +const { + addHiddenPropsToTarget, + fillIn, + forEachRelation, + forOwn, + get, + isArray, + isObject, + isString, + isUndefined, + resolve +} = utils const reserved = [ 'orderBy', @@ -15,28 +25,6 @@ const reserved = [ 'where' ] -function Defaults () {} - -Defaults.prototype.translateId = true - -const addHiddenPropsToTarget = function (target, props) { - DSUtils.forOwn(props, function (value, key) { - props[key] = { - writable: true, - value - } - }) - Object.defineProperties(target, props) -} - -const fillIn = function (dest, src) { - DSUtils.forOwn(src, function (value, key) { - if (!dest.hasOwnProperty(key) || dest[key] === undefined) { - dest[key] = value - } - }) -} - function unique (array) { const seen = {} const final = [] @@ -50,32 +38,175 @@ function unique (array) { return final } +const noop = function (...args) { + const self = this + const opts = args[args.length - 1] + self.dbg(opts.op, ...args) + return resolve() +} + +const noop2 = function (...args) { + const self = this + const opts = args[args.length - 2] + self.dbg(opts.op, ...args) + return resolve() +} + +const DEFAULTS = { + /** + * Whether to log debugging information. + * + * @name MongoDBAdapter#debug + * @type {boolean} + * @default false + */ + debug: false, + + /** + * Whether to return detailed result objects instead of just record data. + * + * @name MongoDBAdapter#raw + * @type {boolean} + * @default false + */ + raw: false, + + /** + * Convert ObjectIDs to strings when pulling records out of the database. + * + * @name MongoDBAdapter#translateId + * @type {boolean} + * @default true + */ + translateId: true, + + /** + * MongoDB URI. + * + * @name MongoDBAdapter#uri + * @type {string} + * @default mongodb://localhost:27017 + */ + uri: 'mongodb://localhost:27017' +} + +const FIND_OPTS_DEFAULTS = {} +const FIND_ONE_OPTS_DEFAULTS = {} +const INSERT_OPTS_DEFAULTS = {} +const INSERT_MANY_OPTS_DEFAULTS = {} +const UPDATE_OPTS_DEFAULTS = {} +const REMOVE_OPTS_DEFAULTS = {} + /** * MongoDBAdapter class. * * @example - * import {DS} from 'js-data' + * // Use Container instead of DataStore on the server + * import {Container} from 'js-data' * import MongoDBAdapter from 'js-data-mongodb' - * const store = new DS() - * const adapter = new MongoDBAdapter({ - * uri: 'mongodb://localhost:27017' + * + * // Create a store to hold your Mappers + * const store = new Container({ + * mapperDefaults: { + * // MongoDB uses "_id" as the primary key + * idAttribute: '_id' + * } * }) - * store.registerAdapter('mongodb', adapter, { 'default': true }) + * + * // Create an instance of MongoDBAdapter with default settings + * const adapter = new MongoDBAdapter() + * + * // Mappers in "store" will use the MongoDB adapter by default + * store.registerAdapter('mongodb', adapter, { default: true }) + * + * // Create a Mapper that maps to a "user" collection + * store.defineMapper('user') * * @class MongoDBAdapter * @param {Object} [opts] Configuration opts. - * @param {string} [opts.uri=''] MongoDB URI. + * @param {boolean} [opts.debug=false] Whether to log debugging information. + * @param {Object} [opts.findOpts] Options to pass to collection#find. + * @param {Object} [opts.findOneOpts] Options to pass to collection#findOne. + * @param {Object} [opts.insertOpts] Options to pass to collection#insert. + * @param {Object} [opts.insertManyOpts] Options to pass to + * collection#insertMany. + * @param {boolean} [opts.raw=false] Whether to return detailed result objects + * instead of just record data. + * @param {Object} [opts.removeOpts] Options to pass to collection#remove. + * @param {boolean} [opts.translateId=true] Convert ObjectIDs to strings when + * pulling records out of the database. + * @param {Object} [opts.updateOpts] Options to pass to collection#update. + * @param {string} [opts.uri="mongodb://localhost:27017"] MongoDB URI. */ export default function MongoDBAdapter (opts) { const self = this - if (typeof opts === 'string') { + opts || (opts = {}) + if (isString(opts)) { opts = { uri: opts } } - opts.uri || (opts.uri = 'mongodb://localhost:27017') - self.defaults = new Defaults() - DSUtils.deepMixIn(self.defaults, opts) + fillIn(opts, DEFAULTS) fillIn(self, opts) + /** + * Default options to pass to collection#find. + * + * @name MongoDBAdapter#findOpts + * @type {Object} + * @default {} + */ + self.findOpts || (self.findOpts = {}) + fillIn(self.findOpts, FIND_OPTS_DEFAULTS) + + /** + * Default options to pass to collection#findOne. + * + * @name MongoDBAdapter#findOneOpts + * @type {Object} + * @default {} + */ + self.findOneOpts || (self.findOneOpts = {}) + fillIn(self.findOneOpts, FIND_ONE_OPTS_DEFAULTS) + + /** + * Default options to pass to collection#insert. + * + * @name MongoDBAdapter#insertOpts + * @type {Object} + * @default {} + */ + self.insertOpts || (self.insertOpts = {}) + fillIn(self.insertOpts, INSERT_OPTS_DEFAULTS) + + /** + * Default options to pass to collection#insertMany. + * + * @name MongoDBAdapter#insertManyOpts + * @type {Object} + * @default {} + */ + self.insertManyOpts || (self.insertManyOpts = {}) + fillIn(self.insertManyOpts, INSERT_MANY_OPTS_DEFAULTS) + + /** + * Default options to pass to collection#update. + * + * @name MongoDBAdapter#updateOpts + * @type {Object} + * @default {} + */ + self.updateOpts || (self.updateOpts = {}) + fillIn(self.updateOpts, UPDATE_OPTS_DEFAULTS) + + /** + * Default options to pass to collection#update. + * + * @name MongoDBAdapter#removeOpts + * @type {Object} + * @default {} + */ + self.removeOpts || (self.removeOpts = {}) + fillIn(self.removeOpts, REMOVE_OPTS_DEFAULTS) + /** * A Promise that resolves to a reference to the MongoDB client being used by * this adapter. @@ -83,7 +214,7 @@ export default function MongoDBAdapter (opts) { * @name MongoDBAdapter#client * @type {Object} */ - self.client = new DSUtils.Promise(function (resolve, reject) { + self.client = new Promise(function (resolve, reject) { MongoClient.connect(opts.uri, function (err, db) { return err ? reject(err) : resolve(db) }) @@ -91,6 +222,145 @@ export default function MongoDBAdapter (opts) { } addHiddenPropsToTarget(MongoDBAdapter.prototype, { + /** + * Translate ObjectIDs to strings. + * + * @name MongoDBAdapter#_translateId + * @method + * @return {*} + */ + _translateId (r, opts) { + opts || (opts = {}) + if (this.getOpt('translateId', opts)) { + if (isArray(r)) { + r.forEach(function (_r) { + const __id = _r._id ? _r._id.toString() : _r._id + _r._id = typeof __id === 'string' ? __id : _r._id + }) + } else if (isObject(r)) { + const __id = r._id ? r._id.toString() : r._id + r._id = typeof __id === 'string' ? __id : r._id + } + } + return r + }, + + /** + * @name MongoDBAdapter#afterCreate + * @method + */ + afterCreate: noop2, + + /** + * @name MongoDBAdapter#afterCreateMany + * @method + */ + afterCreateMany: noop2, + + /** + * @name MongoDBAdapter#afterDestroy + * @method + */ + afterDestroy: noop2, + + /** + * @name MongoDBAdapter#afterDestroyAll + * @method + */ + afterDestroyAll: noop2, + + /** + * @name MongoDBAdapter#afterFind + * @method + */ + afterFind: noop2, + + /** + * @name MongoDBAdapter#afterFindAll + * @method + */ + afterFindAll: noop2, + + /** + * @name MongoDBAdapter#afterUpdate + * @method + */ + afterUpdate: noop2, + + /** + * @name MongoDBAdapter#afterUpdateAll + * @method + */ + afterUpdateAll: noop2, + + /** + * @name MongoDBAdapter#afterUpdateMany + * @method + */ + afterUpdateMany: noop2, + + /** + * @name MongoDBAdapter#beforeCreate + * @method + */ + beforeCreate: noop, + + /** + * @name MongoDBAdapter#beforeCreateMany + * @method + */ + beforeCreateMany: noop, + + /** + * @name MongoDBAdapter#beforeDestroy + * @method + */ + beforeDestroy: noop, + + /** + * @name MongoDBAdapter#beforeDestroyAll + * @method + */ + beforeDestroyAll: noop, + + /** + * @name MongoDBAdapter#beforeFind + * @method + */ + beforeFind: noop, + + /** + * @name MongoDBAdapter#beforeFindAll + * @method + */ + beforeFindAll: noop, + + /** + * @name MongoDBAdapter#beforeUpdate + * @method + */ + beforeUpdate: noop, + + /** + * @name MongoDBAdapter#beforeUpdateAll + * @method + */ + beforeUpdateAll: noop, + + /** + * @name MongoDBAdapter#beforeUpdateMany + * @method + */ + beforeUpdateMany: noop, + + /** + * @name MongoDBAdapter#dbg + * @method + */ + dbg (...args) { + this.log('debug', ...args) + }, + /** * Return a Promise that resolves to a reference to the MongoDB client being * used by this adapter. @@ -121,9 +391,9 @@ addHiddenPropsToTarget(MongoDBAdapter.prototype, { query || (query = {}) query.where || (query.where = {}) - DSUtils.forOwn(query, function (v, k) { + forOwn(query, function (v, k) { if (reserved.indexOf(k) === -1) { - if (DSUtils.isObject(v)) { + if (isObject(v)) { query.where[k] = v } else { query.where[k] = { @@ -136,17 +406,17 @@ addHiddenPropsToTarget(MongoDBAdapter.prototype, { let mongoQuery = {} - if (Object.keys(query.where).length) { - DSUtils.forOwn(query.where, function (criteria, field) { - if (!DSUtils.isObject(criteria)) { + if (Object.keys(query.where).length !== 0) { + forOwn(query.where, function (criteria, field) { + if (!isObject(criteria)) { query.where[field] = { '==': criteria } } - DSUtils.forOwn(criteria, function (v, op) { - if (op === '==' || op === '===') { + forOwn(criteria, function (v, op) { + if (op === '==' || op === '===' || op === 'contains') { mongoQuery[field] = v - } else if (op === '!=' || op === '!==') { + } else if (op === '!=' || op === '!==' || op === 'notContains') { mongoQuery[field] = mongoQuery[field] || {} mongoQuery[field].$ne = v } else if (op === '>') { @@ -167,12 +437,12 @@ addHiddenPropsToTarget(MongoDBAdapter.prototype, { } else if (op === 'notIn') { mongoQuery[field] = mongoQuery[field] || {} mongoQuery[field].$nin = v - } else if (op === '|==' || op === '|===') { + } else if (op === '|==' || op === '|===' || op === '|contains') { mongoQuery.$or = mongoQuery.$or || [] let orEqQuery = {} orEqQuery[field] = v mongoQuery.$or.push(orEqQuery) - } else if (op === '|!=' || op === '|!==') { + } else if (op === '|!=' || op === '|!==' || op === '|notContains') { mongoQuery.$or = mongoQuery.$or || [] let orNeQuery = {} orNeQuery[field] = { @@ -229,6 +499,28 @@ addHiddenPropsToTarget(MongoDBAdapter.prototype, { return mongoQuery }, + /** + * Logging utility method. + * + * @name MongoDBAdapter#log + * @method + */ + log (level, ...args) { + if (level && !args.length) { + args.push(level) + level = 'debug' + } + if (level === 'debug' && !this.debug) { + return + } + const prefix = `${level.toUpperCase()}: (MongoDBAdapter)` + if (console[level]) { + console[level](prefix, ...args) + } else { + console.log(prefix, ...args) + } + }, + /** * Map non-filtering params in a selection query to MongoDB query options. * @@ -250,13 +542,13 @@ addHiddenPropsToTarget(MongoDBAdapter.prototype, { let queryOptions = {} if (query.orderBy) { - if (DSUtils.isString(query.orderBy)) { + if (isString(query.orderBy)) { query.orderBy = [ [query.orderBy, 'asc'] ] } for (var i = 0; i < query.orderBy.length; i++) { - if (DSUtils.isString(query.orderBy[i])) { + if (isString(query.orderBy[i])) { query.orderBy[i] = [query.orderBy[i], 'asc'] } } @@ -275,47 +567,24 @@ addHiddenPropsToTarget(MongoDBAdapter.prototype, { }, /** - * TODO + * Resolve the value of the specified option based on the given options and + * this adapter's settings. * - * @name MongoDBAdapter#translateId + * @name MongoDBAdapter#getOpt * @method - * @return {*} + * @param {string} opt The name of the option. + * @param {Object} [opts] Configuration options. + * @return {*} The value of the specified option. */ - translateId (r, opts) { + getOpt (opt, opts) { opts || (opts = {}) - if (typeof opts.translateId === 'boolean' ? opts.translateId : this.defaults.translateId) { - if (DSUtils.isArray(r)) { - r.forEach(function (_r) { - const __id = _r._id ? _r._id.toString() : _r._id - _r._id = typeof __id === 'string' ? __id : _r._id - }) - } else if (DSUtils.isObject(r)) { - const __id = r._id ? r._id.toString() : r._id - r._id = typeof __id === 'string' ? __id : r._id - } - } - return r + return isUndefined(opts[opt]) ? this[opt] : opts[opt] }, /** - * TODO + * Turn an _id into an ObjectID if it isn't already an ObjectID. * - * @name MongoDBAdapter#origify - * @method - * @return {Object} - */ - origify (opts) { - opts = opts || {} - if (typeof opts.orig === 'function') { - return opts.orig() - } - return opts - }, - - /** - * TODO - * - * @name MongoDBAdapter#makeHasManyForeignKey + * @name MongoDBAdapter#toObjectID * @method * @return {*} */ @@ -327,13 +596,13 @@ addHiddenPropsToTarget(MongoDBAdapter.prototype, { }, /** - * TODO + * Return the foreignKey from the given record for the provided relationship. * * If the foreignKeys in your database are saved as ObjectIDs, then override * this method and change it to something like: * * ``` - * return this.toObjectID(Resource, this.constructor.prototype.makeHasManyForeignKey.call(this, Resource, def, record)) + * return this.toObjectID(mapper, this.constructor.prototype.makeHasManyForeignKey.call(this, mapper, def, record)) * ``` * * There may be other reasons why you may want to override this method, like @@ -343,27 +612,38 @@ addHiddenPropsToTarget(MongoDBAdapter.prototype, { * @method * @return {*} */ - makeHasManyForeignKey (Resource, def, record) { - return DSUtils.get(record, Resource.idAttribute) + makeHasManyForeignKey (mapper, def, record) { + return def.getForeignKey(record) }, /** - * TODO + * Return the foreignKeys from the given record for the provided relationship. + * + * @name MongoDBAdapter#makeHasManyForeignKeys + * @method + * @return {*} + */ + makeHasManyForeignKeys (mapper, def, record) { + return get(record, mapper.idAttribute) + }, + + /** + * Load a hasMany relationship. * * @name MongoDBAdapter#loadHasMany * @method * @return {Promise} */ - loadHasMany (Resource, def, records, __options) { + loadHasMany (mapper, def, records, __opts) { const self = this let singular = false - if (DSUtils.isObject(records) && !DSUtils.isArray(records)) { + if (isObject(records) && !isArray(records)) { singular = true records = [records] } const IDs = records.map(function (record) { - return self.makeHasManyForeignKey(Resource, def, record) + return self.makeHasManyForeignKey(mapper, def, record) }) const query = {} const criteria = query[def.foreignKey] = {} @@ -375,7 +655,7 @@ addHiddenPropsToTarget(MongoDBAdapter.prototype, { return id }) } - return self.findAll(Resource.getResource(def.relation), query, __options).then(function (relatedItems) { + return self.findAll(def.getRelation(), query, __opts).then(function (relatedItems) { records.forEach(function (record) { let attached = [] // avoid unneccesary iteration when we only have one record @@ -383,67 +663,67 @@ addHiddenPropsToTarget(MongoDBAdapter.prototype, { attached = relatedItems } else { relatedItems.forEach(function (relatedItem) { - if (DSUtils.get(relatedItem, def.foreignKey) === record[Resource.idAttribute]) { + if (get(relatedItem, def.foreignKey) === record[mapper.idAttribute]) { attached.push(relatedItem) } }) } - DSUtils.set(record, def.localField, attached) + def.setLocalField(record, attached) }) }) }, /** - * TODO + * Load a hasOne relationship. * * @name MongoDBAdapter#loadHasOne * @method * @return {Promise} */ - loadHasOne (Resource, def, records, __options) { - if (DSUtils.isObject(records) && !DSUtils.isArray(records)) { + loadHasOne (mapper, def, records, __opts) { + if (isObject(records) && !isArray(records)) { records = [records] } - return this.loadHasMany(Resource, def, records, __options).then(function () { + return this.loadHasMany(mapper, def, records, __opts).then(function () { records.forEach(function (record) { - const relatedData = DSUtils.get(record, def.localField) - if (DSUtils.isArray(relatedData) && relatedData.length) { - DSUtils.set(record, def.localField, relatedData[0]) + const relatedData = def.getLocalField(record) + if (isArray(relatedData) && relatedData.length) { + def.setLocalField(record, relatedData[0]) } }) }) }, /** - * TODO + * Return the foreignKey from the given record for the provided relationship. * * @name MongoDBAdapter#makeBelongsToForeignKey * @method * @return {*} */ - makeBelongsToForeignKey (Resource, def, record) { - return this.toObjectID(Resource.getResource(def.relation), DSUtils.get(record, def.localKey)) + makeBelongsToForeignKey (mapper, def, record) { + return this.toObjectID(def.getRelation(), def.getForeignKey(record)) }, /** - * TODO + * Load a belongsTo relationship. * * @name MongoDBAdapter#loadBelongsTo * @method * @return {Promise} */ - loadBelongsTo (Resource, def, records, __options) { + loadBelongsTo (mapper, def, records, __opts) { const self = this - const relationDef = Resource.getResource(def.relation) + const relationDef = def.getRelation() - if (DSUtils.isObject(records) && !DSUtils.isArray(records)) { + if (isObject(records) && !isArray(records)) { const record = records - return self.find(relationDef, self.makeBelongsToForeignKey(Resource, def, record), __options).then(function (relatedItem) { - DSUtils.set(record, def.localField, relatedItem) + return self.find(relationDef, self.makeBelongsToForeignKey(mapper, def, record), __opts).then(function (relatedItem) { + def.setLocalField(record, relatedItem) }) } else { const keys = records.map(function (record) { - return self.makeBelongsToForeignKey(Resource, def, record) + return self.makeBelongsToForeignKey(mapper, def, record) }).filter(function (key) { return key }) @@ -453,11 +733,11 @@ addHiddenPropsToTarget(MongoDBAdapter.prototype, { 'in': keys } } - }, __options).then(function (relatedItems) { + }, __opts).then(function (relatedItems) { records.forEach(function (record) { relatedItems.forEach(function (relatedItem) { - if (relatedItem[relationDef.idAttribute] === record[def.localKey]) { - DSUtils.set(record, def.localField, relatedItem) + if (relatedItem[relationDef.idAttribute] === record[def.foreignKey]) { + def.setLocalField(record, relatedItem) } }) }) @@ -470,95 +750,98 @@ addHiddenPropsToTarget(MongoDBAdapter.prototype, { * * @name MongoDBAdapter#find * @method - * @param {Object} Resource The Resource. + * @param {Object} mapper The mapper. * @param {(string|number)} id Primary key of the record to retrieve. * @param {Object} [opts] Configuration options. - * @param {string[]} [opts.with=[]] TODO + * @param {Object} [opts.findOneOpts] Options to pass to collection#findOne. + * @param {boolean} [opts.raw=false] Whether to return a more detailed + * response object. + * @param {string[]} [opts.with=[]] Relations to eager load. * @return {Promise} */ - find (Resource, id, options) { + find (mapper, id, opts) { const self = this - let instance - options = self.origify(options) - options.with || (options.with = []) + let record, op + opts || (opts = {}) + opts.with || (opts.with = []) + + const findOneOpts = self.getOpt('findOneOpts', opts) + findOneOpts.fields || (findOneOpts.fields = {}) + return self.getClient().then(function (client) { - return new DSUtils.Promise(function (resolve, reject) { - let mongoQuery = {} - mongoQuery[Resource.idAttribute] = self.toObjectID(Resource, id) - options.fields = options.fields || {} - client.collection(Resource.table || underscore(Resource.name)).findOne(mongoQuery, options, function (err, r) { - if (err) { - reject(err) - } else if (!r) { - reject(new Error('Not Found!')) - } else { - resolve(self.translateId(r, options)) - } + // beforeFind lifecycle hook + op = opts.op = 'beforeFind' + return resolve(self[op](mapper, id, opts)).then(function () { + return new Promise(function (resolve, reject) { + let mongoQuery = {} + mongoQuery[mapper.idAttribute] = self.toObjectID(mapper, id) + client.collection(mapper.table || underscore(mapper.name)).findOne(mongoQuery, findOneOpts, function (err, cursor) { + return err ? reject(err) : resolve(cursor) + }) }) }) - }).then(function (_instance) { - instance = _instance - let tasks = [] - const relationList = Resource.relationList || [] - - relationList.forEach(function (def) { - let relationName = def.relation - let relationDef = Resource.getResource(relationName) - let containedName = null - if (options.with.indexOf(relationName) !== -1) { - containedName = relationName - } else if (options.with.indexOf(def.localField) !== -1) { - containedName = def.localField - } - if (containedName) { - let __options = DSUtils.deepMixIn({}, options.orig ? options.orig() : options) - __options.with = options.with.slice() - __options = DSUtils._(relationDef, __options) - DSUtils.remove(__options.with, containedName) - __options.with.forEach(function (relation, i) { - if (relation && relation.indexOf(containedName) === 0 && relation.length >= containedName.length && relation[containedName.length] === '.') { - __options.with[i] = relation.substr(containedName.length + 1) - } else { - __options.with[i] = '' - } - }) + }).then(function (_record) { + if (!_record) { + return + } + record = _record + self._translateId(record, opts) + const tasks = [] - let task + forEachRelation(mapper, opts, function (def, __opts) { + const relatedMapper = def.getRelation() + let task - if (def.foreignKey && (def.type === 'hasOne' || def.type === 'hasMany')) { - if (def.type === 'hasOne') { - task = self.loadHasOne(Resource, def, instance, __options) - } else { - task = self.loadHasMany(Resource, def, instance, __options) + if (def.foreignKey && (def.type === 'hasOne' || def.type === 'hasMany')) { + if (def.type === 'hasOne') { + task = self.loadHasOne(mapper, def, record, __opts) + } else { + task = self.loadHasMany(mapper, def, record, __opts) + } + } else if (def.type === 'hasMany' && def.localKeys) { + let localKeys = [] + let itemKeys = get(record, def.localKeys) || [] + itemKeys = isArray(itemKeys) ? itemKeys : Object.keys(itemKeys) + localKeys = localKeys.concat(itemKeys) + task = self.findAll(relatedMapper, { + where: { + [relatedMapper.idAttribute]: { + 'in': unique(localKeys).filter(function (x) { return x }).map(function (x) { return self.toObjectID(relatedMapper, x) }) + } } - } else if (def.type === 'hasMany' && def.localKeys) { - let localKeys = [] - let itemKeys = instance[def.localKeys] || [] - itemKeys = DSUtils.isArray(itemKeys) ? itemKeys : DSUtils.keys(itemKeys) - localKeys = localKeys.concat(itemKeys || []) - task = self.findAll(Resource.getResource(relationName), { - where: { - [relationDef.idAttribute]: { - 'in': unique(localKeys).filter((x) => x).map((x) => self.toObjectID(relationDef, x)) - } + }, __opts).then(function (relatedItems) { + def.setLocalField(record, relatedItems) + }) + } else if (def.type === 'hasMany' && def.foreignKeys) { + task = self.findAll(relatedMapper, { + where: { + [def.foreignKeys]: { + 'contains': self.makeHasManyForeignKeys(mapper, def, record) } - }, __options).then(function (relatedItems) { - DSUtils.set(instance, def.localField, relatedItems) - return relatedItems - }) - } else if (def.type === 'belongsTo' || (def.type === 'hasOne' && def.localKey)) { - task = self.loadBelongsTo(Resource, def, instance, __options) - } - - if (task) { - tasks.push(task) - } + } + }, __opts).then(function (relatedItems) { + def.setLocalField(record, relatedItems) + }) + } else if (def.type === 'belongsTo') { + task = self.loadBelongsTo(mapper, def, record, __opts) + } + if (task) { + tasks.push(task) } }) - return DSUtils.Promise.all(tasks) + return Promise.all(tasks) }).then(function () { - return instance + // afterFind lifecycle hook + op = opts.op = 'afterFind' + return resolve(self[op](mapper, id, opts, record)).then(function (_record) { + // Allow for re-assignment from lifecycle hook + record = isUndefined(_record) ? record : _record + return self.getOpt('raw', opts) ? { + data: record, + found: record ? 1 : 0 + } : record + }) }) }, @@ -567,103 +850,98 @@ addHiddenPropsToTarget(MongoDBAdapter.prototype, { * * @name MongoDBAdapter#findAll * @method - * @param {Object} Resource The Resource. + * @param {Object} mapper The mapper. * @param {Object} query Selection query. * @param {Object} [opts] Configuration options. - * @param {string[]} [opts.with=[]] TODO + * @param {Object} [opts.findOpts] Options to pass to collection#find. + * @param {boolean} [opts.raw=false] Whether to return a more detailed + * response object. + * @param {string[]} [opts.with=[]] Relations to eager load. * @return {Promise} */ - findAll (Resource, query, options) { + findAll (mapper, query, opts) { const self = this - let items = null - options = self.origify(options ? DSUtils.copy(options) : {}) - options.with = options.with || [] - DSUtils.deepMixIn(options, self.getQueryOptions(Resource, query)) - const mongoQuery = self.getQuery(Resource, query) + opts || (opts = {}) + opts.with || (opts.with = []) + + let records = [] + let op + const findOpts = self.getOpt('findOpts', opts) + fillIn(findOpts, self.getQueryOptions(mapper, query)) + findOpts.fields || (findOpts.fields = {}) + const mongoQuery = self.getQuery(mapper, query) + return self.getClient().then(function (client) { - return new DSUtils.Promise(function (resolve, reject) { - options.fields = options.fields || {} - client.collection(Resource.table || underscore(Resource.name)).find(mongoQuery, options).toArray((err, r) => { - if (err) { - reject(err) - } else { - resolve(self.translateId(r, options)) - } + // beforeFindAll lifecycle hook + op = opts.op = 'beforeFindAll' + return resolve(self[op](mapper, query, opts)).then(function () { + return new Promise(function (resolve, reject) { + client.collection(mapper.table || underscore(mapper.name)).find(mongoQuery, findOpts).toArray(function (err, cursor) { + return err ? reject(err) : resolve(cursor) + }) }) }) - }).then(function (_items) { - items = _items - let tasks = [] - const relationList = Resource.relationList || [] - relationList.forEach(function (def) { - let relationName = def.relation - let relationDef = Resource.getResource(relationName) - let containedName = null - if (options.with.indexOf(relationName) !== -1) { - containedName = relationName - } else if (options.with.indexOf(def.localField) !== -1) { - containedName = def.localField - } - if (containedName) { - let __options = DSUtils.deepMixIn({}, options.orig ? options.orig() : options) - __options.with = options.with.slice() - __options = DSUtils._(relationDef, __options) - DSUtils.remove(__options.with, containedName) - __options.with.forEach(function (relation, i) { - if (relation && relation.indexOf(containedName) === 0 && relation.length >= containedName.length && relation[containedName.length] === '.') { - __options.with[i] = relation.substr(containedName.length + 1) - } else { - __options.with[i] = '' - } + }).then(function (_records) { + records = _records + self._translateId(records, opts) + const tasks = [] + forEachRelation(mapper, opts, function (def, __opts) { + const relatedMapper = def.getRelation() + let task + if (def.foreignKey && (def.type === 'hasOne' || def.type === 'hasMany')) { + if (def.type === 'hasMany') { + task = self.loadHasMany(mapper, def, records, __opts) + } else { + task = self.loadHasOne(mapper, def, records, __opts) + } + } else if (def.type === 'hasMany' && def.localKeys) { + let localKeys = [] + records.forEach(function (item) { + let itemKeys = item[def.localKeys] || [] + itemKeys = isArray(itemKeys) ? itemKeys : Object.keys(itemKeys) + localKeys = localKeys.concat(itemKeys) }) - - let task - - if (def.foreignKey && (def.type === 'hasOne' || def.type === 'hasMany')) { - if (def.type === 'hasMany') { - task = self.loadHasMany(Resource, def, items, __options) - } else { - task = self.loadHasOne(Resource, def, items, __options) + task = self.findAll(relatedMapper, { + where: { + [relatedMapper.idAttribute]: { + 'in': unique(localKeys).filter(function (x) { return x }).map(function (x) { return self.toObjectID(relatedMapper, x) }) + } } - } else if (def.type === 'hasMany' && def.localKeys) { - let localKeys = [] - items.forEach(function (item) { - let itemKeys = item[def.localKeys] || [] - itemKeys = DSUtils.isArray(itemKeys) ? itemKeys : Object.keys(itemKeys) - localKeys = localKeys.concat(itemKeys || []) - }) - task = self.findAll(Resource.getResource(relationName), { - where: { - [relationDef.idAttribute]: { - 'in': unique(localKeys).filter((x) => x).map((x) => self.toObjectID(relationDef, x)) + }, __opts).then(function (relatedItems) { + records.forEach(function (item) { + let attached = [] + let itemKeys = get(item, def.localKeys) || [] + itemKeys = isArray(itemKeys) ? itemKeys : Object.keys(itemKeys) + relatedItems.forEach(function (relatedItem) { + if (itemKeys && itemKeys.indexOf(relatedItem[relatedMapper.idAttribute]) !== -1) { + attached.push(relatedItem) } - } - }, __options).then(function (relatedItems) { - items.forEach(function (item) { - let attached = [] - let itemKeys = item[def.localKeys] || [] - itemKeys = DSUtils.isArray(itemKeys) ? itemKeys : DSUtils.keys(itemKeys) - relatedItems.forEach(function (relatedItem) { - if (itemKeys && itemKeys.indexOf(relatedItem[relationDef.idAttribute]) !== -1) { - attached.push(relatedItem) - } - }) - DSUtils.set(item, def.localField, attached) }) - return relatedItems + def.setLocalField(item, attached) }) - } else if (def.type === 'belongsTo' || (def.type === 'hasOne' && def.localKey)) { - task = self.loadBelongsTo(Resource, def, items, __options) - } - - if (task) { - tasks.push(task) - } + return relatedItems + }) + } else if (def.type === 'hasMany' && def.foreignKeys) { + throw new Error('findAll eager load hasMany foreignKeys not supported!') + } else if (def.type === 'belongsTo') { + task = self.loadBelongsTo(mapper, def, records, __opts) + } + if (task) { + tasks.push(task) } }) - return DSUtils.Promise.all(tasks) + return Promise.all(tasks) }).then(function () { - return items + // afterFindAll lifecycle hook + op = opts.op = 'afterFindAll' + return resolve(self[op](mapper, query, opts, records)).then(function (_records) { + // Allow for re-assignment from lifecycle hook + records = isUndefined(_records) ? records : _records + return self.getOpt('raw', opts) ? { + data: records, + found: records.length + } : records + }) }) }, @@ -672,28 +950,108 @@ addHiddenPropsToTarget(MongoDBAdapter.prototype, { * * @name MongoDBAdapter#create * @method - * @param {Object} Resource The Resource. + * @param {Object} mapper The mapper. * @param {Object} props The record to be created. * @param {Object} [opts] Configuration options. + * @param {Object} [opts.insertOpts] Options to pass to collection#insert. + * @param {boolean} [opts.raw=false] Whether to return a more detailed + * response object. * @return {Promise} */ - create (Resource, props, opts) { + create (mapper, props, opts) { const self = this - props = DSUtils.removeCircular(DSUtils.omit(props, Resource.relationFields || [])) - opts = self.origify(opts) + let op + props || (props = {}) + opts || (opts = {}) + + const insertOpts = self.getOpt('insertOpts', opts) return self.getClient().then(function (client) { - return new DSUtils.Promise(function (resolve, reject) { - const collection = client.collection(Resource.table || underscore(Resource.name)) - const method = collection.insertOne ? DSUtils.isArray(props) ? 'insertMany' : 'insertOne' : 'insert' - collection[method](props, opts, function (err, r) { - if (err) { - reject(err) - } else { - r = r.ops ? r.ops : r - self.translateId(r, opts) - resolve(DSUtils.isArray(props) ? r : r[0]) - } + // beforeCreate lifecycle hook + op = opts.op = 'beforeCreate' + return resolve(self[op](mapper, props, opts)).then(function (_props) { + // Allow for re-assignment from lifecycle hook + _props = isUndefined(_props) ? props : _props + return new Promise(function (resolve, reject) { + const collection = client.collection(mapper.table || underscore(mapper.name)) + const method = collection.insertOne ? 'insertOne' : 'insert' + collection[method](_props, insertOpts, function (err, cursor) { + return err ? reject(err) : resolve(cursor) + }) + }) + }).then(function (cursor) { + let record + let r = cursor.ops ? cursor.ops : cursor + self._translateId(r, opts) + record = isArray(r) ? r[0] : r + + // afterCreate lifecycle hook + op = opts.op = 'afterCreate' + return self[op](mapper, props, opts, record).then(function (_record) { + // Allow for re-assignment from lifecycle hook + record = isUndefined(_record) ? record : _record + const result = {} + fillIn(result, cursor) + delete result.connection + result.data = record + result.created = record ? 1 : 0 + return self.getOpt('raw', opts) ? result : result.data + }) + }) + }) + }, + + /** + * Create multiple records in a single batch. + * + * @name MongoDBAdapter#createMany + * @method + * @param {Object} mapper The mapper. + * @param {Object} props The records to be created. + * @param {Object} [opts] Configuration options. + * @param {Object} [opts.insertManyOpts] Options to pass to + * collection#insertMany. + * @param {boolean} [opts.raw=false] Whether to return a more detailed + * response object. + * @return {Promise} + */ + createMany (mapper, props, opts) { + const self = this + let op + props || (props = {}) + opts || (opts = {}) + + const insertManyOpts = self.getOpt('insertManyOpts', opts) + + return self.getClient().then(function (client) { + // beforeCreateMany lifecycle hook + op = opts.op = 'beforeCreateMany' + return resolve(self[op](mapper, props, opts)).then(function (_props) { + // Allow for re-assignment from lifecycle hook + _props = isUndefined(_props) ? props : _props + return new Promise(function (resolve, reject) { + const collection = client.collection(mapper.table || underscore(mapper.name)) + collection.insertMany(_props, insertManyOpts, function (err, cursor) { + return err ? reject(err) : resolve(cursor) + }) + }) + }).then(function (cursor) { + let records + let r = cursor.ops ? cursor.ops : cursor + self._translateId(r, opts) + records = r + + // afterCreateMany lifecycle hook + op = opts.op = 'afterCreateMany' + return self[op](mapper, props, opts, records).then(function (_records) { + // Allow for re-assignment from lifecycle hook + records = isUndefined(_records) ? records : _records + const result = {} + fillIn(result, cursor) + delete result.connection + result.data = records + result.created = records.length + return self.getOpt('raw', opts) ? result : result.data }) }) }) @@ -707,25 +1065,42 @@ addHiddenPropsToTarget(MongoDBAdapter.prototype, { * @param {Object} Resource The Resource. * @param {(string|number)} id Primary key of the record to destroy. * @param {Object} [opts] Configuration options. + * @param {boolean} [opts.raw=false] Whether to return a more detailed + * response object. + * @param {Object} [opts.removeOpts] Options to pass to collection#remove. * @return {Promise} */ - destroy (Resource, id, opts) { + destroy (mapper, id, opts) { const self = this - opts = self.origify(opts) + let op + opts || (opts = {}) + const removeOpts = self.getOpt('removeOpts', opts) return self.getClient().then(function (client) { - return new DSUtils.Promise(function (resolve, reject) { - const mongoQuery = {} - mongoQuery[Resource.idAttribute] = self.toObjectID(Resource, id) - const collection = client.collection(Resource.table || underscore(Resource.name)) - collection[collection.deleteOne ? 'deleteOne' : 'remove'](mongoQuery, opts, function (err) { - if (err) { - reject(err) - } else { - resolve() - } + // beforeDestroy lifecycle hook + op = opts.op = 'beforeDestroy' + return resolve(self[op](mapper, id, opts)).then(function () { + return new Promise(function (resolve, reject) { + const mongoQuery = {} + mongoQuery[mapper.idAttribute] = self.toObjectID(mapper, id) + const collection = client.collection(mapper.table || underscore(mapper.name)) + collection[collection.deleteOne ? 'deleteOne' : 'remove'](mongoQuery, removeOpts, function (err, cursor) { + return err ? reject(err) : resolve(cursor) + }) }) }) + }).then(function (cursor) { + // afterDestroy lifecycle hook + op = opts.op = 'afterDestroy' + return resolve(self[op](mapper, id, opts, cursor)).then(function (_cursor) { + // Allow for re-assignment from lifecycle hook + return isUndefined(_cursor) ? cursor : _cursor + }) + }).then(function (cursor) { + if (cursor) { + delete cursor.connection + } + return self.getOpt('raw', opts) ? cursor : undefined }) }, @@ -734,28 +1109,46 @@ addHiddenPropsToTarget(MongoDBAdapter.prototype, { * * @name MongoDBAdapter#destroyAll * @method - * @param {Object} Resource the Resource. + * @param {Object} mapper the mapper. * @param {Object} [query] Selection query. * @param {Object} [opts] Configuration options. + * @param {boolean} [opts.raw=false] Whether to return a more detailed + * response object. + * @param {Object} [opts.removeOpts] Options to pass to collection#remove. * @return {Promise} */ - destroyAll (Resource, query, opts) { + destroyAll (mapper, query, opts) { const self = this - opts = self.origify(opts ? DSUtils.copy(opts) : {}) + let op + query || (query = {}) + opts || (opts = {}) + const removeOpts = self.getOpt('removeOpts', opts) + fillIn(removeOpts, self.getQueryOptions(mapper, query)) return self.getClient().then(function (client) { - DSUtils.deepMixIn(opts, self.getQueryOptions(Resource, query)) - const mongoQuery = self.getQuery(Resource, query) - return new DSUtils.Promise(function (resolve, reject) { - const collection = client.collection(Resource.table || underscore(Resource.name)) - collection[collection.deleteMany ? 'deleteMany' : 'remove'](mongoQuery, opts, function (err) { - if (err) { - reject(err) - } else { - resolve() - } + // beforeDestroyAll lifecycle hook + op = opts.op = 'beforeDestroyAll' + return resolve(self[op](mapper, query, opts)).then(function () { + const mongoQuery = self.getQuery(mapper, query) + return new Promise(function (resolve, reject) { + const collection = client.collection(mapper.table || underscore(mapper.name)) + collection[collection.deleteMany ? 'deleteMany' : 'remove'](mongoQuery, removeOpts, function (err, cursor) { + return err ? reject(err) : resolve(cursor) + }) }) }) + }).then(function (cursor) { + // afterDestroyAll lifecycle hook + op = opts.op = 'afterDestroyAll' + return resolve(self[op](mapper, query, opts, cursor)).then(function (_cursor) { + // Allow for re-assignment from lifecycle hook + return isUndefined(_cursor) ? cursor : _cursor + }) + }).then(function (cursor) { + if (cursor) { + delete cursor.connection + } + return self.getOpt('raw', opts) ? cursor : undefined }) }, @@ -764,34 +1157,59 @@ addHiddenPropsToTarget(MongoDBAdapter.prototype, { * * @name MongoDBAdapter#update * @method - * @param {Object} Resource The Resource. + * @param {Object} mapper The mapper. * @param {(string|number)} id The primary key of the record to be updated. * @param {Object} props The update to apply to the record. * @param {Object} [opts] Configuration options. + * @param {boolean} [opts.raw=false] Whether to return a more detailed + * response object. + * @param {Object} [opts.updateOpts] Options to pass to collection#update. * @return {Promise} */ - update (Resource, id, props, opts) { + update (mapper, id, props, opts) { const self = this - props = DSUtils.removeCircular(DSUtils.omit(props, Resource.relationFields || [])) - opts = self.origify(opts) - - return self.find(Resource, id, opts).then(function () { - return self.getClient() - }).then(function (client) { - return new DSUtils.Promise(function (resolve, reject) { - const mongoQuery = {} - mongoQuery[Resource.idAttribute] = self.toObjectID(Resource, id) - const collection = client.collection(Resource.table || underscore(Resource.name)) - collection[collection.updateOne ? 'updateOne' : 'update'](mongoQuery, { $set: props }, opts, function (err) { - if (err) { - reject(err) - } else { - resolve() - } + props || (props = {}) + opts || (opts = {}) + let op + const updateOpts = self.getOpt('updateOpts', opts) + + return self.find(mapper, id, { raw: false }).then(function (record) { + if (!record) { + throw new Error('Not Found') + } + // beforeUpdate lifecycle hook + op = opts.op = 'beforeUpdate' + return resolve(self[op](mapper, id, props, opts)) + }).then(function (_props) { + // Allow for re-assignment from lifecycle hook + _props = isUndefined(_props) ? props : _props + return self.getClient().then(function (client) { + return new Promise(function (resolve, reject) { + const mongoQuery = {} + mongoQuery[mapper.idAttribute] = self.toObjectID(mapper, id) + const collection = client.collection(mapper.table || underscore(mapper.name)) + collection[collection.updateOne ? 'updateOne' : 'update'](mongoQuery, { $set: _props }, updateOpts, function (err, cursor) { + return err ? reject(err) : resolve(cursor) + }) + }) + }) + }).then(function (cursor) { + if (cursor) { + delete cursor.connection + } + return self.find(mapper, id, { raw: false }).then(function (record) { + // afterUpdate lifecycle hook + op = opts.op = 'afterUpdate' + return resolve(self[op](mapper, id, props, opts, record)).then(function (_record) { + // Allow for re-assignment from lifecycle hook + record = isUndefined(_record) ? record : _record + const result = {} + fillIn(result, cursor) + result.data = record + result.updated = record ? 1 : 0 + return self.getOpt('raw', opts) ? result : result.data }) }) - }).then(function () { - return self.find(Resource, id, opts) }) }, @@ -800,47 +1218,76 @@ addHiddenPropsToTarget(MongoDBAdapter.prototype, { * * @name MongoDBAdapter#updateAll * @method - * @param {Object} Resource The Resource. + * @param {Object} mapper The mapper. * @param {Object} props The update to apply to the selected records. * @param {Object} [query] Selection query. * @param {Object} [opts] Configuration options. + * @param {boolean} [opts.raw=false] Whether to return a more detailed + * response object. + * @param {Object} [opts.updateOpts] Options to pass to collection#update. * @return {Promise} */ - updateAll (Resource, props, query, opts) { + updateAll (mapper, props, query, opts) { const self = this - let ids = [] - props = DSUtils.removeCircular(DSUtils.omit(props, Resource.relationFields || [])) - opts = self.origify(opts ? DSUtils.copy(opts) : {}) - const mongoOptions = DSUtils.copy(opts) - mongoOptions.multi = true + props || (props = {}) + query || (query = {}) + opts || (opts = {}) + let op, ids + const updateOpts = self.getOpt('updateOpts', opts) + updateOpts.multi = true return self.getClient().then(function (client) { - const queryOptions = self.getQueryOptions(Resource, query) + const queryOptions = self.getQueryOptions(mapper, query) queryOptions.$set = props - const mongoQuery = self.getQuery(Resource, query) + const mongoQuery = self.getQuery(mapper, query) - return self.findAll(Resource, query, opts).then(function (items) { - ids = items.map(function (item) { - return self.toObjectID(Resource, item[Resource.idAttribute]) + // beforeUpdateAll lifecycle hook + op = opts.op = 'beforeUpdateAll' + return resolve(self[op](mapper, props, query, opts)).then(function () { + return self.findAll(mapper, query, { raw: false }) + }).then(function (records) { + ids = records.map(function (record) { + return self.toObjectID(mapper, record[mapper.idAttribute]) }) - return new DSUtils.Promise(function (resolve, reject) { - const collection = client.collection(Resource.table || underscore(Resource.name)) - collection[collection.updateMany ? 'updateMany' : 'update'](mongoQuery, queryOptions, mongoOptions, function (err) { - if (err) { - reject(err) - } else { - resolve() - } + return new Promise(function (resolve, reject) { + const collection = client.collection(mapper.table || underscore(mapper.name)) + collection[collection.updateMany ? 'updateMany' : 'update'](mongoQuery, queryOptions, updateOpts, function (err, cursor) { + return err ? reject(err) : resolve(cursor) }) }) - }).then(function () { + }).then(function (cursor) { + if (cursor) { + delete cursor.connection + } const query = {} - query[Resource.idAttribute] = { + query[mapper.idAttribute] = { 'in': ids } - return self.findAll(Resource, query, opts) + return self.findAll(mapper, query, { raw: false }).then(function (records) { + // afterUpdateAll lifecycle hook + op = opts.op = 'afterUpdateAll' + return self[op](mapper, props, query, opts, records).then(function (_records) { + // Allow for re-assignment from lifecycle hook + records = isUndefined(_records) ? records : _records + const result = {} + fillIn(result, cursor) + result.data = records + result.updated = records.length + return self.getOpt('raw', opts) ? result : result.data + }) + }) }) }) + }, + + /** + * Not supported. + * + * @name MongoDBAdapter#updateMany + * @method + */ + updateMany () { + throw new Error('not supported!') } }) From 65fbd151f80d1c100e5f78cc82fd697acfe680ff Mon Sep 17 00:00:00 2001 From: Jason Dobry Date: Sat, 27 Feb 2016 13:55:51 -0800 Subject: [PATCH 05/36] Added analytics to conf.json --- conf.json | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/conf.json b/conf.json index cbcaa8c..cc14cd6 100644 --- a/conf.json +++ b/conf.json @@ -18,6 +18,10 @@ "outputSourceFiles": true, "syntaxTheme": "dark", "linenums": true, - "footer": "
Back to js-data.io
" + "footer": "
Back to js-data.io
", + "analytics": { + "ua": "UA-55528236-2", + "domain": "api.js-data.io" + } } } From 1d4c329c15579f311013297953cd95ffa14e41da Mon Sep 17 00:00:00 2001 From: Jason Dobry Date: Sat, 27 Feb 2016 20:16:45 -0800 Subject: [PATCH 06/36] 1.0.0-alpha.2 --- CHANGELOG.md | 5 +++++ CONTRIBUTORS | 2 +- dist/js-data-mongodb.js | 31 ++++++++++++++++--------------- dist/js-data-mongodb.js.map | 2 +- package.json | 2 +- src/index.js | 31 ++++++++++++++++--------------- 6 files changed, 40 insertions(+), 33 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 8db67e9..398ed00 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,8 @@ +##### 1.0.0-alpha.2 - 27 February 2016 + +###### Backwards compatible bug fixes +- Fixed use of options + ##### 1.0.0-alpha.1 - 26 February 2016 ###### Breaking API changes diff --git a/CONTRIBUTORS b/CONTRIBUTORS index 80252af..2813981 100644 --- a/CONTRIBUTORS +++ b/CONTRIBUTORS @@ -4,5 +4,5 @@ # # Names should be added to this file as: # [commit count] Name - 24 Jason Dobry + 26 Jason Dobry 1 John Grogg diff --git a/dist/js-data-mongodb.js b/dist/js-data-mongodb.js index 82263e7..1039e14 100644 --- a/dist/js-data-mongodb.js +++ b/dist/js-data-mongodb.js @@ -40,6 +40,7 @@ var isArray = jsData.utils.isArray; var isObject = jsData.utils.isObject; var isString = jsData.utils.isString; var isUndefined = jsData.utils.isUndefined; +var plainCopy = jsData.utils.plainCopy; var resolve = jsData.utils.resolve; @@ -425,20 +426,20 @@ addHiddenPropsToTarget(MongoDBAdapter.prototype, { * @method * @return {Object} */ - getQuery: function getQuery(Resource, query) { - query || (query = {}); + getQuery: function getQuery(mapper, query) { + query = plainCopy(query || {}); query.where || (query.where = {}); - forOwn(query, function (v, k) { - if (reserved.indexOf(k) === -1) { - if (isObject(v)) { - query.where[k] = v; + forOwn(query, function (config, keyword) { + if (reserved.indexOf(keyword) === -1) { + if (isObject(config)) { + query.where[keyword] = config; } else { - query.where[k] = { - '==': v + query.where[keyword] = { + '==': config }; } - delete query[k]; + delete query[keyword]; } }); @@ -582,8 +583,8 @@ addHiddenPropsToTarget(MongoDBAdapter.prototype, { * @method * @return {Object} */ - getQueryOptions: function getQueryOptions(Resource, query) { - query = query || {}; + getQueryOptions: function getQueryOptions(mapper, query) { + query = plainCopy(query || {}); query.orderBy = query.orderBy || query.sort; query.skip = query.skip || query.offset; @@ -625,7 +626,7 @@ addHiddenPropsToTarget(MongoDBAdapter.prototype, { */ getOpt: function getOpt(opt, opts) { opts || (opts = {}); - return isUndefined(opts[opt]) ? this[opt] : opts[opt]; + return isUndefined(opts[opt]) ? plainCopy(this[opt]) : plainCopy(opts[opt]); }, @@ -636,8 +637,8 @@ addHiddenPropsToTarget(MongoDBAdapter.prototype, { * @method * @return {*} */ - toObjectID: function toObjectID(Resource, id) { - if (id !== undefined && Resource.idAttribute === '_id' && typeof id === 'string' && bson.ObjectID.isValid(id) && !(id instanceof bson.ObjectID)) { + toObjectID: function toObjectID(mapper, id) { + if (id !== undefined && mapper.idAttribute === '_id' && typeof id === 'string' && bson.ObjectID.isValid(id) && !(id instanceof bson.ObjectID)) { return new bson.ObjectID(id); } return id; @@ -1130,7 +1131,7 @@ addHiddenPropsToTarget(MongoDBAdapter.prototype, { * * @name MongoDBAdapter#destroy * @method - * @param {Object} Resource The Resource. + * @param {Object} mapper The mapper. * @param {(string|number)} id Primary key of the record to destroy. * @param {Object} [opts] Configuration options. * @param {boolean} [opts.raw=false] Whether to return a more detailed diff --git a/dist/js-data-mongodb.js.map b/dist/js-data-mongodb.js.map index 2ba08f4..9a0d405 100644 --- a/dist/js-data-mongodb.js.map +++ b/dist/js-data-mongodb.js.map @@ -1 +1 @@ -{"version":3,"file":"js-data-mongodb.js","sources":["../src/index.js"],"sourcesContent":["import {MongoClient} from 'mongodb'\nimport {ObjectID} from 'bson'\nimport {utils} from 'js-data'\nimport underscore from 'mout/string/underscore'\n\nconst {\n addHiddenPropsToTarget,\n fillIn,\n forEachRelation,\n forOwn,\n get,\n isArray,\n isObject,\n isString,\n isUndefined,\n resolve\n} = utils\n\nconst reserved = [\n 'orderBy',\n 'sort',\n 'limit',\n 'offset',\n 'skip',\n 'where'\n]\n\nfunction unique (array) {\n const seen = {}\n const final = []\n array.forEach(function (item) {\n if (item in seen) {\n return\n }\n final.push(item)\n seen[item] = 0\n })\n return final\n}\n\nconst noop = function (...args) {\n const self = this\n const opts = args[args.length - 1]\n self.dbg(opts.op, ...args)\n return resolve()\n}\n\nconst noop2 = function (...args) {\n const self = this\n const opts = args[args.length - 2]\n self.dbg(opts.op, ...args)\n return resolve()\n}\n\nconst DEFAULTS = {\n /**\n * Whether to log debugging information.\n *\n * @name MongoDBAdapter#debug\n * @type {boolean}\n * @default false\n */\n debug: false,\n\n /**\n * Whether to return detailed result objects instead of just record data.\n *\n * @name MongoDBAdapter#raw\n * @type {boolean}\n * @default false\n */\n raw: false,\n\n /**\n * Convert ObjectIDs to strings when pulling records out of the database.\n *\n * @name MongoDBAdapter#translateId\n * @type {boolean}\n * @default true\n */\n translateId: true,\n\n /**\n * MongoDB URI.\n *\n * @name MongoDBAdapter#uri\n * @type {string}\n * @default mongodb://localhost:27017\n */\n uri: 'mongodb://localhost:27017'\n}\n\nconst FIND_OPTS_DEFAULTS = {}\nconst FIND_ONE_OPTS_DEFAULTS = {}\nconst INSERT_OPTS_DEFAULTS = {}\nconst INSERT_MANY_OPTS_DEFAULTS = {}\nconst UPDATE_OPTS_DEFAULTS = {}\nconst REMOVE_OPTS_DEFAULTS = {}\n\n/**\n * MongoDBAdapter class.\n *\n * @example\n * // Use Container instead of DataStore on the server\n * import {Container} from 'js-data'\n * import MongoDBAdapter from 'js-data-mongodb'\n *\n * // Create a store to hold your Mappers\n * const store = new Container({\n * mapperDefaults: {\n * // MongoDB uses \"_id\" as the primary key\n * idAttribute: '_id'\n * }\n * })\n *\n * // Create an instance of MongoDBAdapter with default settings\n * const adapter = new MongoDBAdapter()\n *\n * // Mappers in \"store\" will use the MongoDB adapter by default\n * store.registerAdapter('mongodb', adapter, { default: true })\n *\n * // Create a Mapper that maps to a \"user\" collection\n * store.defineMapper('user')\n *\n * @class MongoDBAdapter\n * @param {Object} [opts] Configuration opts.\n * @param {boolean} [opts.debug=false] Whether to log debugging information.\n * @param {Object} [opts.findOpts] Options to pass to collection#find.\n * @param {Object} [opts.findOneOpts] Options to pass to collection#findOne.\n * @param {Object} [opts.insertOpts] Options to pass to collection#insert.\n * @param {Object} [opts.insertManyOpts] Options to pass to\n * collection#insertMany.\n * @param {boolean} [opts.raw=false] Whether to return detailed result objects\n * instead of just record data.\n * @param {Object} [opts.removeOpts] Options to pass to collection#remove.\n * @param {boolean} [opts.translateId=true] Convert ObjectIDs to strings when\n * pulling records out of the database.\n * @param {Object} [opts.updateOpts] Options to pass to collection#update.\n * @param {string} [opts.uri=\"mongodb://localhost:27017\"] MongoDB URI.\n */\nexport default function MongoDBAdapter (opts) {\n const self = this\n opts || (opts = {})\n if (isString(opts)) {\n opts = { uri: opts }\n }\n fillIn(opts, DEFAULTS)\n fillIn(self, opts)\n\n /**\n * Default options to pass to collection#find.\n *\n * @name MongoDBAdapter#findOpts\n * @type {Object}\n * @default {}\n */\n self.findOpts || (self.findOpts = {})\n fillIn(self.findOpts, FIND_OPTS_DEFAULTS)\n\n /**\n * Default options to pass to collection#findOne.\n *\n * @name MongoDBAdapter#findOneOpts\n * @type {Object}\n * @default {}\n */\n self.findOneOpts || (self.findOneOpts = {})\n fillIn(self.findOneOpts, FIND_ONE_OPTS_DEFAULTS)\n\n /**\n * Default options to pass to collection#insert.\n *\n * @name MongoDBAdapter#insertOpts\n * @type {Object}\n * @default {}\n */\n self.insertOpts || (self.insertOpts = {})\n fillIn(self.insertOpts, INSERT_OPTS_DEFAULTS)\n\n /**\n * Default options to pass to collection#insertMany.\n *\n * @name MongoDBAdapter#insertManyOpts\n * @type {Object}\n * @default {}\n */\n self.insertManyOpts || (self.insertManyOpts = {})\n fillIn(self.insertManyOpts, INSERT_MANY_OPTS_DEFAULTS)\n\n /**\n * Default options to pass to collection#update.\n *\n * @name MongoDBAdapter#updateOpts\n * @type {Object}\n * @default {}\n */\n self.updateOpts || (self.updateOpts = {})\n fillIn(self.updateOpts, UPDATE_OPTS_DEFAULTS)\n\n /**\n * Default options to pass to collection#update.\n *\n * @name MongoDBAdapter#removeOpts\n * @type {Object}\n * @default {}\n */\n self.removeOpts || (self.removeOpts = {})\n fillIn(self.removeOpts, REMOVE_OPTS_DEFAULTS)\n\n /**\n * A Promise that resolves to a reference to the MongoDB client being used by\n * this adapter.\n *\n * @name MongoDBAdapter#client\n * @type {Object}\n */\n self.client = new Promise(function (resolve, reject) {\n MongoClient.connect(opts.uri, function (err, db) {\n return err ? reject(err) : resolve(db)\n })\n })\n}\n\naddHiddenPropsToTarget(MongoDBAdapter.prototype, {\n /**\n * Translate ObjectIDs to strings.\n *\n * @name MongoDBAdapter#_translateId\n * @method\n * @return {*}\n */\n _translateId (r, opts) {\n opts || (opts = {})\n if (this.getOpt('translateId', opts)) {\n if (isArray(r)) {\n r.forEach(function (_r) {\n const __id = _r._id ? _r._id.toString() : _r._id\n _r._id = typeof __id === 'string' ? __id : _r._id\n })\n } else if (isObject(r)) {\n const __id = r._id ? r._id.toString() : r._id\n r._id = typeof __id === 'string' ? __id : r._id\n }\n }\n return r\n },\n\n /**\n * @name MongoDBAdapter#afterCreate\n * @method\n */\n afterCreate: noop2,\n\n /**\n * @name MongoDBAdapter#afterCreateMany\n * @method\n */\n afterCreateMany: noop2,\n\n /**\n * @name MongoDBAdapter#afterDestroy\n * @method\n */\n afterDestroy: noop2,\n\n /**\n * @name MongoDBAdapter#afterDestroyAll\n * @method\n */\n afterDestroyAll: noop2,\n\n /**\n * @name MongoDBAdapter#afterFind\n * @method\n */\n afterFind: noop2,\n\n /**\n * @name MongoDBAdapter#afterFindAll\n * @method\n */\n afterFindAll: noop2,\n\n /**\n * @name MongoDBAdapter#afterUpdate\n * @method\n */\n afterUpdate: noop2,\n\n /**\n * @name MongoDBAdapter#afterUpdateAll\n * @method\n */\n afterUpdateAll: noop2,\n\n /**\n * @name MongoDBAdapter#afterUpdateMany\n * @method\n */\n afterUpdateMany: noop2,\n\n /**\n * @name MongoDBAdapter#beforeCreate\n * @method\n */\n beforeCreate: noop,\n\n /**\n * @name MongoDBAdapter#beforeCreateMany\n * @method\n */\n beforeCreateMany: noop,\n\n /**\n * @name MongoDBAdapter#beforeDestroy\n * @method\n */\n beforeDestroy: noop,\n\n /**\n * @name MongoDBAdapter#beforeDestroyAll\n * @method\n */\n beforeDestroyAll: noop,\n\n /**\n * @name MongoDBAdapter#beforeFind\n * @method\n */\n beforeFind: noop,\n\n /**\n * @name MongoDBAdapter#beforeFindAll\n * @method\n */\n beforeFindAll: noop,\n\n /**\n * @name MongoDBAdapter#beforeUpdate\n * @method\n */\n beforeUpdate: noop,\n\n /**\n * @name MongoDBAdapter#beforeUpdateAll\n * @method\n */\n beforeUpdateAll: noop,\n\n /**\n * @name MongoDBAdapter#beforeUpdateMany\n * @method\n */\n beforeUpdateMany: noop,\n\n /**\n * @name MongoDBAdapter#dbg\n * @method\n */\n dbg (...args) {\n this.log('debug', ...args)\n },\n\n /**\n * Return a Promise that resolves to a reference to the MongoDB client being\n * used by this adapter.\n *\n * Useful when you need to do anything custom with the MongoDB client library.\n *\n * @name MongoDBAdapter#getClient\n * @method\n * @return {Object} MongoDB client.\n */\n getClient () {\n return this.client\n },\n\n /**\n * Map filtering params in a selection query to MongoDB a filtering object.\n *\n * Handles the following:\n *\n * - where\n * - and bunch of filtering operators\n *\n * @name MongoDBAdapter#getQuery\n * @method\n * @return {Object}\n */\n getQuery (Resource, query) {\n query || (query = {})\n query.where || (query.where = {})\n\n forOwn(query, function (v, k) {\n if (reserved.indexOf(k) === -1) {\n if (isObject(v)) {\n query.where[k] = v\n } else {\n query.where[k] = {\n '==': v\n }\n }\n delete query[k]\n }\n })\n\n let mongoQuery = {}\n\n if (Object.keys(query.where).length !== 0) {\n forOwn(query.where, function (criteria, field) {\n if (!isObject(criteria)) {\n query.where[field] = {\n '==': criteria\n }\n }\n forOwn(criteria, function (v, op) {\n if (op === '==' || op === '===' || op === 'contains') {\n mongoQuery[field] = v\n } else if (op === '!=' || op === '!==' || op === 'notContains') {\n mongoQuery[field] = mongoQuery[field] || {}\n mongoQuery[field].$ne = v\n } else if (op === '>') {\n mongoQuery[field] = mongoQuery[field] || {}\n mongoQuery[field].$gt = v\n } else if (op === '>=') {\n mongoQuery[field] = mongoQuery[field] || {}\n mongoQuery[field].$gte = v\n } else if (op === '<') {\n mongoQuery[field] = mongoQuery[field] || {}\n mongoQuery[field].$lt = v\n } else if (op === '<=') {\n mongoQuery[field] = mongoQuery[field] || {}\n mongoQuery[field].$lte = v\n } else if (op === 'in') {\n mongoQuery[field] = mongoQuery[field] || {}\n mongoQuery[field].$in = v\n } else if (op === 'notIn') {\n mongoQuery[field] = mongoQuery[field] || {}\n mongoQuery[field].$nin = v\n } else if (op === '|==' || op === '|===' || op === '|contains') {\n mongoQuery.$or = mongoQuery.$or || []\n let orEqQuery = {}\n orEqQuery[field] = v\n mongoQuery.$or.push(orEqQuery)\n } else if (op === '|!=' || op === '|!==' || op === '|notContains') {\n mongoQuery.$or = mongoQuery.$or || []\n let orNeQuery = {}\n orNeQuery[field] = {\n '$ne': v\n }\n mongoQuery.$or.push(orNeQuery)\n } else if (op === '|>') {\n mongoQuery.$or = mongoQuery.$or || []\n let orGtQuery = {}\n orGtQuery[field] = {\n '$gt': v\n }\n mongoQuery.$or.push(orGtQuery)\n } else if (op === '|>=') {\n mongoQuery.$or = mongoQuery.$or || []\n let orGteQuery = {}\n orGteQuery[field] = {\n '$gte': v\n }\n mongoQuery.$or.push(orGteQuery)\n } else if (op === '|<') {\n mongoQuery.$or = mongoQuery.$or || []\n let orLtQuery = {}\n orLtQuery[field] = {\n '$lt': v\n }\n mongoQuery.$or.push(orLtQuery)\n } else if (op === '|<=') {\n mongoQuery.$or = mongoQuery.$or || []\n let orLteQuery = {}\n orLteQuery[field] = {\n '$lte': v\n }\n mongoQuery.$or.push(orLteQuery)\n } else if (op === '|in') {\n mongoQuery.$or = mongoQuery.$or || []\n let orInQuery = {}\n orInQuery[field] = {\n '$in': v\n }\n mongoQuery.$or.push(orInQuery)\n } else if (op === '|notIn') {\n mongoQuery.$or = mongoQuery.$or || []\n let orNinQuery = {}\n orNinQuery[field] = {\n '$nin': v\n }\n mongoQuery.$or.push(orNinQuery)\n }\n })\n })\n }\n\n return mongoQuery\n },\n\n /**\n * Logging utility method.\n *\n * @name MongoDBAdapter#log\n * @method\n */\n log (level, ...args) {\n if (level && !args.length) {\n args.push(level)\n level = 'debug'\n }\n if (level === 'debug' && !this.debug) {\n return\n }\n const prefix = `${level.toUpperCase()}: (MongoDBAdapter)`\n if (console[level]) {\n console[level](prefix, ...args)\n } else {\n console.log(prefix, ...args)\n }\n },\n\n /**\n * Map non-filtering params in a selection query to MongoDB query options.\n *\n * Handles the following:\n *\n * - limit\n * - skip/offset\n * - orderBy/sort\n *\n * @name MongoDBAdapter#getQueryOptions\n * @method\n * @return {Object}\n */\n getQueryOptions (Resource, query) {\n query = query || {}\n query.orderBy = query.orderBy || query.sort\n query.skip = query.skip || query.offset\n\n let queryOptions = {}\n\n if (query.orderBy) {\n if (isString(query.orderBy)) {\n query.orderBy = [\n [query.orderBy, 'asc']\n ]\n }\n for (var i = 0; i < query.orderBy.length; i++) {\n if (isString(query.orderBy[i])) {\n query.orderBy[i] = [query.orderBy[i], 'asc']\n }\n }\n queryOptions.sort = query.orderBy\n }\n\n if (query.skip) {\n queryOptions.skip = +query.skip\n }\n\n if (query.limit) {\n queryOptions.limit = +query.limit\n }\n\n return queryOptions\n },\n\n /**\n * Resolve the value of the specified option based on the given options and\n * this adapter's settings.\n *\n * @name MongoDBAdapter#getOpt\n * @method\n * @param {string} opt The name of the option.\n * @param {Object} [opts] Configuration options.\n * @return {*} The value of the specified option.\n */\n getOpt (opt, opts) {\n opts || (opts = {})\n return isUndefined(opts[opt]) ? this[opt] : opts[opt]\n },\n\n /**\n * Turn an _id into an ObjectID if it isn't already an ObjectID.\n *\n * @name MongoDBAdapter#toObjectID\n * @method\n * @return {*}\n */\n toObjectID (Resource, id) {\n if (id !== undefined && Resource.idAttribute === '_id' && typeof id === 'string' && ObjectID.isValid(id) && !(id instanceof ObjectID)) {\n return new ObjectID(id)\n }\n return id\n },\n\n /**\n * Return the foreignKey from the given record for the provided relationship.\n *\n * If the foreignKeys in your database are saved as ObjectIDs, then override\n * this method and change it to something like:\n *\n * ```\n * return this.toObjectID(mapper, this.constructor.prototype.makeHasManyForeignKey.call(this, mapper, def, record))\n * ```\n *\n * There may be other reasons why you may want to override this method, like\n * when the id of the parent doesn't exactly match up to the key on the child.\n *\n * @name MongoDBAdapter#makeHasManyForeignKey\n * @method\n * @return {*}\n */\n makeHasManyForeignKey (mapper, def, record) {\n return def.getForeignKey(record)\n },\n\n /**\n * Return the foreignKeys from the given record for the provided relationship.\n *\n * @name MongoDBAdapter#makeHasManyForeignKeys\n * @method\n * @return {*}\n */\n makeHasManyForeignKeys (mapper, def, record) {\n return get(record, mapper.idAttribute)\n },\n\n /**\n * Load a hasMany relationship.\n *\n * @name MongoDBAdapter#loadHasMany\n * @method\n * @return {Promise}\n */\n loadHasMany (mapper, def, records, __opts) {\n const self = this\n let singular = false\n\n if (isObject(records) && !isArray(records)) {\n singular = true\n records = [records]\n }\n const IDs = records.map(function (record) {\n return self.makeHasManyForeignKey(mapper, def, record)\n })\n const query = {}\n const criteria = query[def.foreignKey] = {}\n if (singular) {\n // more efficient query when we only have one record\n criteria['=='] = IDs[0]\n } else {\n criteria['in'] = IDs.filter(function (id) {\n return id\n })\n }\n return self.findAll(def.getRelation(), query, __opts).then(function (relatedItems) {\n records.forEach(function (record) {\n let attached = []\n // avoid unneccesary iteration when we only have one record\n if (singular) {\n attached = relatedItems\n } else {\n relatedItems.forEach(function (relatedItem) {\n if (get(relatedItem, def.foreignKey) === record[mapper.idAttribute]) {\n attached.push(relatedItem)\n }\n })\n }\n def.setLocalField(record, attached)\n })\n })\n },\n\n /**\n * Load a hasOne relationship.\n *\n * @name MongoDBAdapter#loadHasOne\n * @method\n * @return {Promise}\n */\n loadHasOne (mapper, def, records, __opts) {\n if (isObject(records) && !isArray(records)) {\n records = [records]\n }\n return this.loadHasMany(mapper, def, records, __opts).then(function () {\n records.forEach(function (record) {\n const relatedData = def.getLocalField(record)\n if (isArray(relatedData) && relatedData.length) {\n def.setLocalField(record, relatedData[0])\n }\n })\n })\n },\n\n /**\n * Return the foreignKey from the given record for the provided relationship.\n *\n * @name MongoDBAdapter#makeBelongsToForeignKey\n * @method\n * @return {*}\n */\n makeBelongsToForeignKey (mapper, def, record) {\n return this.toObjectID(def.getRelation(), def.getForeignKey(record))\n },\n\n /**\n * Load a belongsTo relationship.\n *\n * @name MongoDBAdapter#loadBelongsTo\n * @method\n * @return {Promise}\n */\n loadBelongsTo (mapper, def, records, __opts) {\n const self = this\n const relationDef = def.getRelation()\n\n if (isObject(records) && !isArray(records)) {\n const record = records\n return self.find(relationDef, self.makeBelongsToForeignKey(mapper, def, record), __opts).then(function (relatedItem) {\n def.setLocalField(record, relatedItem)\n })\n } else {\n const keys = records.map(function (record) {\n return self.makeBelongsToForeignKey(mapper, def, record)\n }).filter(function (key) {\n return key\n })\n return self.findAll(relationDef, {\n where: {\n [relationDef.idAttribute]: {\n 'in': keys\n }\n }\n }, __opts).then(function (relatedItems) {\n records.forEach(function (record) {\n relatedItems.forEach(function (relatedItem) {\n if (relatedItem[relationDef.idAttribute] === record[def.foreignKey]) {\n def.setLocalField(record, relatedItem)\n }\n })\n })\n })\n }\n },\n\n /**\n * Retrieve the record with the given primary key.\n *\n * @name MongoDBAdapter#find\n * @method\n * @param {Object} mapper The mapper.\n * @param {(string|number)} id Primary key of the record to retrieve.\n * @param {Object} [opts] Configuration options.\n * @param {Object} [opts.findOneOpts] Options to pass to collection#findOne.\n * @param {boolean} [opts.raw=false] Whether to return a more detailed\n * response object.\n * @param {string[]} [opts.with=[]] Relations to eager load.\n * @return {Promise}\n */\n find (mapper, id, opts) {\n const self = this\n let record, op\n opts || (opts = {})\n opts.with || (opts.with = [])\n\n const findOneOpts = self.getOpt('findOneOpts', opts)\n findOneOpts.fields || (findOneOpts.fields = {})\n\n return self.getClient().then(function (client) {\n // beforeFind lifecycle hook\n op = opts.op = 'beforeFind'\n return resolve(self[op](mapper, id, opts)).then(function () {\n return new Promise(function (resolve, reject) {\n let mongoQuery = {}\n mongoQuery[mapper.idAttribute] = self.toObjectID(mapper, id)\n client.collection(mapper.table || underscore(mapper.name)).findOne(mongoQuery, findOneOpts, function (err, cursor) {\n return err ? reject(err) : resolve(cursor)\n })\n })\n })\n }).then(function (_record) {\n if (!_record) {\n return\n }\n record = _record\n self._translateId(record, opts)\n const tasks = []\n\n forEachRelation(mapper, opts, function (def, __opts) {\n const relatedMapper = def.getRelation()\n let task\n\n if (def.foreignKey && (def.type === 'hasOne' || def.type === 'hasMany')) {\n if (def.type === 'hasOne') {\n task = self.loadHasOne(mapper, def, record, __opts)\n } else {\n task = self.loadHasMany(mapper, def, record, __opts)\n }\n } else if (def.type === 'hasMany' && def.localKeys) {\n let localKeys = []\n let itemKeys = get(record, def.localKeys) || []\n itemKeys = isArray(itemKeys) ? itemKeys : Object.keys(itemKeys)\n localKeys = localKeys.concat(itemKeys)\n task = self.findAll(relatedMapper, {\n where: {\n [relatedMapper.idAttribute]: {\n 'in': unique(localKeys).filter(function (x) { return x }).map(function (x) { return self.toObjectID(relatedMapper, x) })\n }\n }\n }, __opts).then(function (relatedItems) {\n def.setLocalField(record, relatedItems)\n })\n } else if (def.type === 'hasMany' && def.foreignKeys) {\n task = self.findAll(relatedMapper, {\n where: {\n [def.foreignKeys]: {\n 'contains': self.makeHasManyForeignKeys(mapper, def, record)\n }\n }\n }, __opts).then(function (relatedItems) {\n def.setLocalField(record, relatedItems)\n })\n } else if (def.type === 'belongsTo') {\n task = self.loadBelongsTo(mapper, def, record, __opts)\n }\n if (task) {\n tasks.push(task)\n }\n })\n\n return Promise.all(tasks)\n }).then(function () {\n // afterFind lifecycle hook\n op = opts.op = 'afterFind'\n return resolve(self[op](mapper, id, opts, record)).then(function (_record) {\n // Allow for re-assignment from lifecycle hook\n record = isUndefined(_record) ? record : _record\n return self.getOpt('raw', opts) ? {\n data: record,\n found: record ? 1 : 0\n } : record\n })\n })\n },\n\n /**\n * Retrieve the records that match the selection query.\n *\n * @name MongoDBAdapter#findAll\n * @method\n * @param {Object} mapper The mapper.\n * @param {Object} query Selection query.\n * @param {Object} [opts] Configuration options.\n * @param {Object} [opts.findOpts] Options to pass to collection#find.\n * @param {boolean} [opts.raw=false] Whether to return a more detailed\n * response object.\n * @param {string[]} [opts.with=[]] Relations to eager load.\n * @return {Promise}\n */\n findAll (mapper, query, opts) {\n const self = this\n opts || (opts = {})\n opts.with || (opts.with = [])\n\n let records = []\n let op\n const findOpts = self.getOpt('findOpts', opts)\n fillIn(findOpts, self.getQueryOptions(mapper, query))\n findOpts.fields || (findOpts.fields = {})\n const mongoQuery = self.getQuery(mapper, query)\n\n return self.getClient().then(function (client) {\n // beforeFindAll lifecycle hook\n op = opts.op = 'beforeFindAll'\n return resolve(self[op](mapper, query, opts)).then(function () {\n return new Promise(function (resolve, reject) {\n client.collection(mapper.table || underscore(mapper.name)).find(mongoQuery, findOpts).toArray(function (err, cursor) {\n return err ? reject(err) : resolve(cursor)\n })\n })\n })\n }).then(function (_records) {\n records = _records\n self._translateId(records, opts)\n const tasks = []\n forEachRelation(mapper, opts, function (def, __opts) {\n const relatedMapper = def.getRelation()\n let task\n if (def.foreignKey && (def.type === 'hasOne' || def.type === 'hasMany')) {\n if (def.type === 'hasMany') {\n task = self.loadHasMany(mapper, def, records, __opts)\n } else {\n task = self.loadHasOne(mapper, def, records, __opts)\n }\n } else if (def.type === 'hasMany' && def.localKeys) {\n let localKeys = []\n records.forEach(function (item) {\n let itemKeys = item[def.localKeys] || []\n itemKeys = isArray(itemKeys) ? itemKeys : Object.keys(itemKeys)\n localKeys = localKeys.concat(itemKeys)\n })\n task = self.findAll(relatedMapper, {\n where: {\n [relatedMapper.idAttribute]: {\n 'in': unique(localKeys).filter(function (x) { return x }).map(function (x) { return self.toObjectID(relatedMapper, x) })\n }\n }\n }, __opts).then(function (relatedItems) {\n records.forEach(function (item) {\n let attached = []\n let itemKeys = get(item, def.localKeys) || []\n itemKeys = isArray(itemKeys) ? itemKeys : Object.keys(itemKeys)\n relatedItems.forEach(function (relatedItem) {\n if (itemKeys && itemKeys.indexOf(relatedItem[relatedMapper.idAttribute]) !== -1) {\n attached.push(relatedItem)\n }\n })\n def.setLocalField(item, attached)\n })\n return relatedItems\n })\n } else if (def.type === 'hasMany' && def.foreignKeys) {\n throw new Error('findAll eager load hasMany foreignKeys not supported!')\n } else if (def.type === 'belongsTo') {\n task = self.loadBelongsTo(mapper, def, records, __opts)\n }\n if (task) {\n tasks.push(task)\n }\n })\n return Promise.all(tasks)\n }).then(function () {\n // afterFindAll lifecycle hook\n op = opts.op = 'afterFindAll'\n return resolve(self[op](mapper, query, opts, records)).then(function (_records) {\n // Allow for re-assignment from lifecycle hook\n records = isUndefined(_records) ? records : _records\n return self.getOpt('raw', opts) ? {\n data: records,\n found: records.length\n } : records\n })\n })\n },\n\n /**\n * Create a new record.\n *\n * @name MongoDBAdapter#create\n * @method\n * @param {Object} mapper The mapper.\n * @param {Object} props The record to be created.\n * @param {Object} [opts] Configuration options.\n * @param {Object} [opts.insertOpts] Options to pass to collection#insert.\n * @param {boolean} [opts.raw=false] Whether to return a more detailed\n * response object.\n * @return {Promise}\n */\n create (mapper, props, opts) {\n const self = this\n let op\n props || (props = {})\n opts || (opts = {})\n\n const insertOpts = self.getOpt('insertOpts', opts)\n\n return self.getClient().then(function (client) {\n // beforeCreate lifecycle hook\n op = opts.op = 'beforeCreate'\n return resolve(self[op](mapper, props, opts)).then(function (_props) {\n // Allow for re-assignment from lifecycle hook\n _props = isUndefined(_props) ? props : _props\n return new Promise(function (resolve, reject) {\n const collection = client.collection(mapper.table || underscore(mapper.name))\n const method = collection.insertOne ? 'insertOne' : 'insert'\n collection[method](_props, insertOpts, function (err, cursor) {\n return err ? reject(err) : resolve(cursor)\n })\n })\n }).then(function (cursor) {\n let record\n let r = cursor.ops ? cursor.ops : cursor\n self._translateId(r, opts)\n record = isArray(r) ? r[0] : r\n\n // afterCreate lifecycle hook\n op = opts.op = 'afterCreate'\n return self[op](mapper, props, opts, record).then(function (_record) {\n // Allow for re-assignment from lifecycle hook\n record = isUndefined(_record) ? record : _record\n const result = {}\n fillIn(result, cursor)\n delete result.connection\n result.data = record\n result.created = record ? 1 : 0\n return self.getOpt('raw', opts) ? result : result.data\n })\n })\n })\n },\n\n /**\n * Create multiple records in a single batch.\n *\n * @name MongoDBAdapter#createMany\n * @method\n * @param {Object} mapper The mapper.\n * @param {Object} props The records to be created.\n * @param {Object} [opts] Configuration options.\n * @param {Object} [opts.insertManyOpts] Options to pass to\n * collection#insertMany.\n * @param {boolean} [opts.raw=false] Whether to return a more detailed\n * response object.\n * @return {Promise}\n */\n createMany (mapper, props, opts) {\n const self = this\n let op\n props || (props = {})\n opts || (opts = {})\n\n const insertManyOpts = self.getOpt('insertManyOpts', opts)\n\n return self.getClient().then(function (client) {\n // beforeCreateMany lifecycle hook\n op = opts.op = 'beforeCreateMany'\n return resolve(self[op](mapper, props, opts)).then(function (_props) {\n // Allow for re-assignment from lifecycle hook\n _props = isUndefined(_props) ? props : _props\n return new Promise(function (resolve, reject) {\n const collection = client.collection(mapper.table || underscore(mapper.name))\n collection.insertMany(_props, insertManyOpts, function (err, cursor) {\n return err ? reject(err) : resolve(cursor)\n })\n })\n }).then(function (cursor) {\n let records\n let r = cursor.ops ? cursor.ops : cursor\n self._translateId(r, opts)\n records = r\n\n // afterCreateMany lifecycle hook\n op = opts.op = 'afterCreateMany'\n return self[op](mapper, props, opts, records).then(function (_records) {\n // Allow for re-assignment from lifecycle hook\n records = isUndefined(_records) ? records : _records\n const result = {}\n fillIn(result, cursor)\n delete result.connection\n result.data = records\n result.created = records.length\n return self.getOpt('raw', opts) ? result : result.data\n })\n })\n })\n },\n\n /**\n * Destroy the record with the given primary key.\n *\n * @name MongoDBAdapter#destroy\n * @method\n * @param {Object} Resource The Resource.\n * @param {(string|number)} id Primary key of the record to destroy.\n * @param {Object} [opts] Configuration options.\n * @param {boolean} [opts.raw=false] Whether to return a more detailed\n * response object.\n * @param {Object} [opts.removeOpts] Options to pass to collection#remove.\n * @return {Promise}\n */\n destroy (mapper, id, opts) {\n const self = this\n let op\n opts || (opts = {})\n const removeOpts = self.getOpt('removeOpts', opts)\n\n return self.getClient().then(function (client) {\n // beforeDestroy lifecycle hook\n op = opts.op = 'beforeDestroy'\n return resolve(self[op](mapper, id, opts)).then(function () {\n return new Promise(function (resolve, reject) {\n const mongoQuery = {}\n mongoQuery[mapper.idAttribute] = self.toObjectID(mapper, id)\n const collection = client.collection(mapper.table || underscore(mapper.name))\n collection[collection.deleteOne ? 'deleteOne' : 'remove'](mongoQuery, removeOpts, function (err, cursor) {\n return err ? reject(err) : resolve(cursor)\n })\n })\n })\n }).then(function (cursor) {\n // afterDestroy lifecycle hook\n op = opts.op = 'afterDestroy'\n return resolve(self[op](mapper, id, opts, cursor)).then(function (_cursor) {\n // Allow for re-assignment from lifecycle hook\n return isUndefined(_cursor) ? cursor : _cursor\n })\n }).then(function (cursor) {\n if (cursor) {\n delete cursor.connection\n }\n return self.getOpt('raw', opts) ? cursor : undefined\n })\n },\n\n /**\n * Destroy the records that match the selection query.\n *\n * @name MongoDBAdapter#destroyAll\n * @method\n * @param {Object} mapper the mapper.\n * @param {Object} [query] Selection query.\n * @param {Object} [opts] Configuration options.\n * @param {boolean} [opts.raw=false] Whether to return a more detailed\n * response object.\n * @param {Object} [opts.removeOpts] Options to pass to collection#remove.\n * @return {Promise}\n */\n destroyAll (mapper, query, opts) {\n const self = this\n let op\n query || (query = {})\n opts || (opts = {})\n const removeOpts = self.getOpt('removeOpts', opts)\n fillIn(removeOpts, self.getQueryOptions(mapper, query))\n\n return self.getClient().then(function (client) {\n // beforeDestroyAll lifecycle hook\n op = opts.op = 'beforeDestroyAll'\n return resolve(self[op](mapper, query, opts)).then(function () {\n const mongoQuery = self.getQuery(mapper, query)\n return new Promise(function (resolve, reject) {\n const collection = client.collection(mapper.table || underscore(mapper.name))\n collection[collection.deleteMany ? 'deleteMany' : 'remove'](mongoQuery, removeOpts, function (err, cursor) {\n return err ? reject(err) : resolve(cursor)\n })\n })\n })\n }).then(function (cursor) {\n // afterDestroyAll lifecycle hook\n op = opts.op = 'afterDestroyAll'\n return resolve(self[op](mapper, query, opts, cursor)).then(function (_cursor) {\n // Allow for re-assignment from lifecycle hook\n return isUndefined(_cursor) ? cursor : _cursor\n })\n }).then(function (cursor) {\n if (cursor) {\n delete cursor.connection\n }\n return self.getOpt('raw', opts) ? cursor : undefined\n })\n },\n\n /**\n * Apply the given update to the record with the specified primary key.\n *\n * @name MongoDBAdapter#update\n * @method\n * @param {Object} mapper The mapper.\n * @param {(string|number)} id The primary key of the record to be updated.\n * @param {Object} props The update to apply to the record.\n * @param {Object} [opts] Configuration options.\n * @param {boolean} [opts.raw=false] Whether to return a more detailed\n * response object.\n * @param {Object} [opts.updateOpts] Options to pass to collection#update.\n * @return {Promise}\n */\n update (mapper, id, props, opts) {\n const self = this\n props || (props = {})\n opts || (opts = {})\n let op\n const updateOpts = self.getOpt('updateOpts', opts)\n\n return self.find(mapper, id, { raw: false }).then(function (record) {\n if (!record) {\n throw new Error('Not Found')\n }\n // beforeUpdate lifecycle hook\n op = opts.op = 'beforeUpdate'\n return resolve(self[op](mapper, id, props, opts))\n }).then(function (_props) {\n // Allow for re-assignment from lifecycle hook\n _props = isUndefined(_props) ? props : _props\n return self.getClient().then(function (client) {\n return new Promise(function (resolve, reject) {\n const mongoQuery = {}\n mongoQuery[mapper.idAttribute] = self.toObjectID(mapper, id)\n const collection = client.collection(mapper.table || underscore(mapper.name))\n collection[collection.updateOne ? 'updateOne' : 'update'](mongoQuery, { $set: _props }, updateOpts, function (err, cursor) {\n return err ? reject(err) : resolve(cursor)\n })\n })\n })\n }).then(function (cursor) {\n if (cursor) {\n delete cursor.connection\n }\n return self.find(mapper, id, { raw: false }).then(function (record) {\n // afterUpdate lifecycle hook\n op = opts.op = 'afterUpdate'\n return resolve(self[op](mapper, id, props, opts, record)).then(function (_record) {\n // Allow for re-assignment from lifecycle hook\n record = isUndefined(_record) ? record : _record\n const result = {}\n fillIn(result, cursor)\n result.data = record\n result.updated = record ? 1 : 0\n return self.getOpt('raw', opts) ? result : result.data\n })\n })\n })\n },\n\n /**\n * Apply the given update to all records that match the selection query.\n *\n * @name MongoDBAdapter#updateAll\n * @method\n * @param {Object} mapper The mapper.\n * @param {Object} props The update to apply to the selected records.\n * @param {Object} [query] Selection query.\n * @param {Object} [opts] Configuration options.\n * @param {boolean} [opts.raw=false] Whether to return a more detailed\n * response object.\n * @param {Object} [opts.updateOpts] Options to pass to collection#update.\n * @return {Promise}\n */\n updateAll (mapper, props, query, opts) {\n const self = this\n props || (props = {})\n query || (query = {})\n opts || (opts = {})\n let op, ids\n const updateOpts = self.getOpt('updateOpts', opts)\n updateOpts.multi = true\n\n return self.getClient().then(function (client) {\n const queryOptions = self.getQueryOptions(mapper, query)\n queryOptions.$set = props\n const mongoQuery = self.getQuery(mapper, query)\n\n // beforeUpdateAll lifecycle hook\n op = opts.op = 'beforeUpdateAll'\n return resolve(self[op](mapper, props, query, opts)).then(function () {\n return self.findAll(mapper, query, { raw: false })\n }).then(function (records) {\n ids = records.map(function (record) {\n return self.toObjectID(mapper, record[mapper.idAttribute])\n })\n\n return new Promise(function (resolve, reject) {\n const collection = client.collection(mapper.table || underscore(mapper.name))\n collection[collection.updateMany ? 'updateMany' : 'update'](mongoQuery, queryOptions, updateOpts, function (err, cursor) {\n return err ? reject(err) : resolve(cursor)\n })\n })\n }).then(function (cursor) {\n if (cursor) {\n delete cursor.connection\n }\n const query = {}\n query[mapper.idAttribute] = {\n 'in': ids\n }\n return self.findAll(mapper, query, { raw: false }).then(function (records) {\n // afterUpdateAll lifecycle hook\n op = opts.op = 'afterUpdateAll'\n return self[op](mapper, props, query, opts, records).then(function (_records) {\n // Allow for re-assignment from lifecycle hook\n records = isUndefined(_records) ? records : _records\n const result = {}\n fillIn(result, cursor)\n result.data = records\n result.updated = records.length\n return self.getOpt('raw', opts) ? result : result.data\n })\n })\n })\n })\n },\n\n /**\n * Not supported.\n *\n * @name MongoDBAdapter#updateMany\n * @method\n */\n updateMany () {\n throw new Error('not supported!')\n }\n})\n"],"names":["utils","ObjectID"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"js-data-mongodb.js","sources":["../src/index.js"],"sourcesContent":["import {MongoClient} from 'mongodb'\nimport {ObjectID} from 'bson'\nimport {utils} from 'js-data'\nimport underscore from 'mout/string/underscore'\n\nconst {\n addHiddenPropsToTarget,\n fillIn,\n forEachRelation,\n forOwn,\n get,\n isArray,\n isObject,\n isString,\n isUndefined,\n plainCopy,\n resolve\n} = utils\n\nconst reserved = [\n 'orderBy',\n 'sort',\n 'limit',\n 'offset',\n 'skip',\n 'where'\n]\n\nfunction unique (array) {\n const seen = {}\n const final = []\n array.forEach(function (item) {\n if (item in seen) {\n return\n }\n final.push(item)\n seen[item] = 0\n })\n return final\n}\n\nconst noop = function (...args) {\n const self = this\n const opts = args[args.length - 1]\n self.dbg(opts.op, ...args)\n return resolve()\n}\n\nconst noop2 = function (...args) {\n const self = this\n const opts = args[args.length - 2]\n self.dbg(opts.op, ...args)\n return resolve()\n}\n\nconst DEFAULTS = {\n /**\n * Whether to log debugging information.\n *\n * @name MongoDBAdapter#debug\n * @type {boolean}\n * @default false\n */\n debug: false,\n\n /**\n * Whether to return detailed result objects instead of just record data.\n *\n * @name MongoDBAdapter#raw\n * @type {boolean}\n * @default false\n */\n raw: false,\n\n /**\n * Convert ObjectIDs to strings when pulling records out of the database.\n *\n * @name MongoDBAdapter#translateId\n * @type {boolean}\n * @default true\n */\n translateId: true,\n\n /**\n * MongoDB URI.\n *\n * @name MongoDBAdapter#uri\n * @type {string}\n * @default mongodb://localhost:27017\n */\n uri: 'mongodb://localhost:27017'\n}\n\nconst FIND_OPTS_DEFAULTS = {}\nconst FIND_ONE_OPTS_DEFAULTS = {}\nconst INSERT_OPTS_DEFAULTS = {}\nconst INSERT_MANY_OPTS_DEFAULTS = {}\nconst UPDATE_OPTS_DEFAULTS = {}\nconst REMOVE_OPTS_DEFAULTS = {}\n\n/**\n * MongoDBAdapter class.\n *\n * @example\n * // Use Container instead of DataStore on the server\n * import {Container} from 'js-data'\n * import MongoDBAdapter from 'js-data-mongodb'\n *\n * // Create a store to hold your Mappers\n * const store = new Container({\n * mapperDefaults: {\n * // MongoDB uses \"_id\" as the primary key\n * idAttribute: '_id'\n * }\n * })\n *\n * // Create an instance of MongoDBAdapter with default settings\n * const adapter = new MongoDBAdapter()\n *\n * // Mappers in \"store\" will use the MongoDB adapter by default\n * store.registerAdapter('mongodb', adapter, { default: true })\n *\n * // Create a Mapper that maps to a \"user\" collection\n * store.defineMapper('user')\n *\n * @class MongoDBAdapter\n * @param {Object} [opts] Configuration opts.\n * @param {boolean} [opts.debug=false] Whether to log debugging information.\n * @param {Object} [opts.findOpts] Options to pass to collection#find.\n * @param {Object} [opts.findOneOpts] Options to pass to collection#findOne.\n * @param {Object} [opts.insertOpts] Options to pass to collection#insert.\n * @param {Object} [opts.insertManyOpts] Options to pass to\n * collection#insertMany.\n * @param {boolean} [opts.raw=false] Whether to return detailed result objects\n * instead of just record data.\n * @param {Object} [opts.removeOpts] Options to pass to collection#remove.\n * @param {boolean} [opts.translateId=true] Convert ObjectIDs to strings when\n * pulling records out of the database.\n * @param {Object} [opts.updateOpts] Options to pass to collection#update.\n * @param {string} [opts.uri=\"mongodb://localhost:27017\"] MongoDB URI.\n */\nexport default function MongoDBAdapter (opts) {\n const self = this\n opts || (opts = {})\n if (isString(opts)) {\n opts = { uri: opts }\n }\n fillIn(opts, DEFAULTS)\n fillIn(self, opts)\n\n /**\n * Default options to pass to collection#find.\n *\n * @name MongoDBAdapter#findOpts\n * @type {Object}\n * @default {}\n */\n self.findOpts || (self.findOpts = {})\n fillIn(self.findOpts, FIND_OPTS_DEFAULTS)\n\n /**\n * Default options to pass to collection#findOne.\n *\n * @name MongoDBAdapter#findOneOpts\n * @type {Object}\n * @default {}\n */\n self.findOneOpts || (self.findOneOpts = {})\n fillIn(self.findOneOpts, FIND_ONE_OPTS_DEFAULTS)\n\n /**\n * Default options to pass to collection#insert.\n *\n * @name MongoDBAdapter#insertOpts\n * @type {Object}\n * @default {}\n */\n self.insertOpts || (self.insertOpts = {})\n fillIn(self.insertOpts, INSERT_OPTS_DEFAULTS)\n\n /**\n * Default options to pass to collection#insertMany.\n *\n * @name MongoDBAdapter#insertManyOpts\n * @type {Object}\n * @default {}\n */\n self.insertManyOpts || (self.insertManyOpts = {})\n fillIn(self.insertManyOpts, INSERT_MANY_OPTS_DEFAULTS)\n\n /**\n * Default options to pass to collection#update.\n *\n * @name MongoDBAdapter#updateOpts\n * @type {Object}\n * @default {}\n */\n self.updateOpts || (self.updateOpts = {})\n fillIn(self.updateOpts, UPDATE_OPTS_DEFAULTS)\n\n /**\n * Default options to pass to collection#update.\n *\n * @name MongoDBAdapter#removeOpts\n * @type {Object}\n * @default {}\n */\n self.removeOpts || (self.removeOpts = {})\n fillIn(self.removeOpts, REMOVE_OPTS_DEFAULTS)\n\n /**\n * A Promise that resolves to a reference to the MongoDB client being used by\n * this adapter.\n *\n * @name MongoDBAdapter#client\n * @type {Object}\n */\n self.client = new Promise(function (resolve, reject) {\n MongoClient.connect(opts.uri, function (err, db) {\n return err ? reject(err) : resolve(db)\n })\n })\n}\n\naddHiddenPropsToTarget(MongoDBAdapter.prototype, {\n /**\n * Translate ObjectIDs to strings.\n *\n * @name MongoDBAdapter#_translateId\n * @method\n * @return {*}\n */\n _translateId (r, opts) {\n opts || (opts = {})\n if (this.getOpt('translateId', opts)) {\n if (isArray(r)) {\n r.forEach(function (_r) {\n const __id = _r._id ? _r._id.toString() : _r._id\n _r._id = typeof __id === 'string' ? __id : _r._id\n })\n } else if (isObject(r)) {\n const __id = r._id ? r._id.toString() : r._id\n r._id = typeof __id === 'string' ? __id : r._id\n }\n }\n return r\n },\n\n /**\n * @name MongoDBAdapter#afterCreate\n * @method\n */\n afterCreate: noop2,\n\n /**\n * @name MongoDBAdapter#afterCreateMany\n * @method\n */\n afterCreateMany: noop2,\n\n /**\n * @name MongoDBAdapter#afterDestroy\n * @method\n */\n afterDestroy: noop2,\n\n /**\n * @name MongoDBAdapter#afterDestroyAll\n * @method\n */\n afterDestroyAll: noop2,\n\n /**\n * @name MongoDBAdapter#afterFind\n * @method\n */\n afterFind: noop2,\n\n /**\n * @name MongoDBAdapter#afterFindAll\n * @method\n */\n afterFindAll: noop2,\n\n /**\n * @name MongoDBAdapter#afterUpdate\n * @method\n */\n afterUpdate: noop2,\n\n /**\n * @name MongoDBAdapter#afterUpdateAll\n * @method\n */\n afterUpdateAll: noop2,\n\n /**\n * @name MongoDBAdapter#afterUpdateMany\n * @method\n */\n afterUpdateMany: noop2,\n\n /**\n * @name MongoDBAdapter#beforeCreate\n * @method\n */\n beforeCreate: noop,\n\n /**\n * @name MongoDBAdapter#beforeCreateMany\n * @method\n */\n beforeCreateMany: noop,\n\n /**\n * @name MongoDBAdapter#beforeDestroy\n * @method\n */\n beforeDestroy: noop,\n\n /**\n * @name MongoDBAdapter#beforeDestroyAll\n * @method\n */\n beforeDestroyAll: noop,\n\n /**\n * @name MongoDBAdapter#beforeFind\n * @method\n */\n beforeFind: noop,\n\n /**\n * @name MongoDBAdapter#beforeFindAll\n * @method\n */\n beforeFindAll: noop,\n\n /**\n * @name MongoDBAdapter#beforeUpdate\n * @method\n */\n beforeUpdate: noop,\n\n /**\n * @name MongoDBAdapter#beforeUpdateAll\n * @method\n */\n beforeUpdateAll: noop,\n\n /**\n * @name MongoDBAdapter#beforeUpdateMany\n * @method\n */\n beforeUpdateMany: noop,\n\n /**\n * @name MongoDBAdapter#dbg\n * @method\n */\n dbg (...args) {\n this.log('debug', ...args)\n },\n\n /**\n * Return a Promise that resolves to a reference to the MongoDB client being\n * used by this adapter.\n *\n * Useful when you need to do anything custom with the MongoDB client library.\n *\n * @name MongoDBAdapter#getClient\n * @method\n * @return {Object} MongoDB client.\n */\n getClient () {\n return this.client\n },\n\n /**\n * Map filtering params in a selection query to MongoDB a filtering object.\n *\n * Handles the following:\n *\n * - where\n * - and bunch of filtering operators\n *\n * @name MongoDBAdapter#getQuery\n * @method\n * @return {Object}\n */\n getQuery (mapper, query) {\n query = plainCopy(query || {})\n query.where || (query.where = {})\n\n forOwn(query, function (config, keyword) {\n if (reserved.indexOf(keyword) === -1) {\n if (isObject(config)) {\n query.where[keyword] = config\n } else {\n query.where[keyword] = {\n '==': config\n }\n }\n delete query[keyword]\n }\n })\n\n let mongoQuery = {}\n\n if (Object.keys(query.where).length !== 0) {\n forOwn(query.where, function (criteria, field) {\n if (!isObject(criteria)) {\n query.where[field] = {\n '==': criteria\n }\n }\n forOwn(criteria, function (v, op) {\n if (op === '==' || op === '===' || op === 'contains') {\n mongoQuery[field] = v\n } else if (op === '!=' || op === '!==' || op === 'notContains') {\n mongoQuery[field] = mongoQuery[field] || {}\n mongoQuery[field].$ne = v\n } else if (op === '>') {\n mongoQuery[field] = mongoQuery[field] || {}\n mongoQuery[field].$gt = v\n } else if (op === '>=') {\n mongoQuery[field] = mongoQuery[field] || {}\n mongoQuery[field].$gte = v\n } else if (op === '<') {\n mongoQuery[field] = mongoQuery[field] || {}\n mongoQuery[field].$lt = v\n } else if (op === '<=') {\n mongoQuery[field] = mongoQuery[field] || {}\n mongoQuery[field].$lte = v\n } else if (op === 'in') {\n mongoQuery[field] = mongoQuery[field] || {}\n mongoQuery[field].$in = v\n } else if (op === 'notIn') {\n mongoQuery[field] = mongoQuery[field] || {}\n mongoQuery[field].$nin = v\n } else if (op === '|==' || op === '|===' || op === '|contains') {\n mongoQuery.$or = mongoQuery.$or || []\n let orEqQuery = {}\n orEqQuery[field] = v\n mongoQuery.$or.push(orEqQuery)\n } else if (op === '|!=' || op === '|!==' || op === '|notContains') {\n mongoQuery.$or = mongoQuery.$or || []\n let orNeQuery = {}\n orNeQuery[field] = {\n '$ne': v\n }\n mongoQuery.$or.push(orNeQuery)\n } else if (op === '|>') {\n mongoQuery.$or = mongoQuery.$or || []\n let orGtQuery = {}\n orGtQuery[field] = {\n '$gt': v\n }\n mongoQuery.$or.push(orGtQuery)\n } else if (op === '|>=') {\n mongoQuery.$or = mongoQuery.$or || []\n let orGteQuery = {}\n orGteQuery[field] = {\n '$gte': v\n }\n mongoQuery.$or.push(orGteQuery)\n } else if (op === '|<') {\n mongoQuery.$or = mongoQuery.$or || []\n let orLtQuery = {}\n orLtQuery[field] = {\n '$lt': v\n }\n mongoQuery.$or.push(orLtQuery)\n } else if (op === '|<=') {\n mongoQuery.$or = mongoQuery.$or || []\n let orLteQuery = {}\n orLteQuery[field] = {\n '$lte': v\n }\n mongoQuery.$or.push(orLteQuery)\n } else if (op === '|in') {\n mongoQuery.$or = mongoQuery.$or || []\n let orInQuery = {}\n orInQuery[field] = {\n '$in': v\n }\n mongoQuery.$or.push(orInQuery)\n } else if (op === '|notIn') {\n mongoQuery.$or = mongoQuery.$or || []\n let orNinQuery = {}\n orNinQuery[field] = {\n '$nin': v\n }\n mongoQuery.$or.push(orNinQuery)\n }\n })\n })\n }\n\n return mongoQuery\n },\n\n /**\n * Logging utility method.\n *\n * @name MongoDBAdapter#log\n * @method\n */\n log (level, ...args) {\n if (level && !args.length) {\n args.push(level)\n level = 'debug'\n }\n if (level === 'debug' && !this.debug) {\n return\n }\n const prefix = `${level.toUpperCase()}: (MongoDBAdapter)`\n if (console[level]) {\n console[level](prefix, ...args)\n } else {\n console.log(prefix, ...args)\n }\n },\n\n /**\n * Map non-filtering params in a selection query to MongoDB query options.\n *\n * Handles the following:\n *\n * - limit\n * - skip/offset\n * - orderBy/sort\n *\n * @name MongoDBAdapter#getQueryOptions\n * @method\n * @return {Object}\n */\n getQueryOptions (mapper, query) {\n query = plainCopy(query || {})\n query.orderBy = query.orderBy || query.sort\n query.skip = query.skip || query.offset\n\n let queryOptions = {}\n\n if (query.orderBy) {\n if (isString(query.orderBy)) {\n query.orderBy = [\n [query.orderBy, 'asc']\n ]\n }\n for (var i = 0; i < query.orderBy.length; i++) {\n if (isString(query.orderBy[i])) {\n query.orderBy[i] = [query.orderBy[i], 'asc']\n }\n }\n queryOptions.sort = query.orderBy\n }\n\n if (query.skip) {\n queryOptions.skip = +query.skip\n }\n\n if (query.limit) {\n queryOptions.limit = +query.limit\n }\n\n return queryOptions\n },\n\n /**\n * Resolve the value of the specified option based on the given options and\n * this adapter's settings.\n *\n * @name MongoDBAdapter#getOpt\n * @method\n * @param {string} opt The name of the option.\n * @param {Object} [opts] Configuration options.\n * @return {*} The value of the specified option.\n */\n getOpt (opt, opts) {\n opts || (opts = {})\n return isUndefined(opts[opt]) ? plainCopy(this[opt]) : plainCopy(opts[opt])\n },\n\n /**\n * Turn an _id into an ObjectID if it isn't already an ObjectID.\n *\n * @name MongoDBAdapter#toObjectID\n * @method\n * @return {*}\n */\n toObjectID (mapper, id) {\n if (id !== undefined && mapper.idAttribute === '_id' && typeof id === 'string' && ObjectID.isValid(id) && !(id instanceof ObjectID)) {\n return new ObjectID(id)\n }\n return id\n },\n\n /**\n * Return the foreignKey from the given record for the provided relationship.\n *\n * If the foreignKeys in your database are saved as ObjectIDs, then override\n * this method and change it to something like:\n *\n * ```\n * return this.toObjectID(mapper, this.constructor.prototype.makeHasManyForeignKey.call(this, mapper, def, record))\n * ```\n *\n * There may be other reasons why you may want to override this method, like\n * when the id of the parent doesn't exactly match up to the key on the child.\n *\n * @name MongoDBAdapter#makeHasManyForeignKey\n * @method\n * @return {*}\n */\n makeHasManyForeignKey (mapper, def, record) {\n return def.getForeignKey(record)\n },\n\n /**\n * Return the foreignKeys from the given record for the provided relationship.\n *\n * @name MongoDBAdapter#makeHasManyForeignKeys\n * @method\n * @return {*}\n */\n makeHasManyForeignKeys (mapper, def, record) {\n return get(record, mapper.idAttribute)\n },\n\n /**\n * Load a hasMany relationship.\n *\n * @name MongoDBAdapter#loadHasMany\n * @method\n * @return {Promise}\n */\n loadHasMany (mapper, def, records, __opts) {\n const self = this\n let singular = false\n\n if (isObject(records) && !isArray(records)) {\n singular = true\n records = [records]\n }\n const IDs = records.map(function (record) {\n return self.makeHasManyForeignKey(mapper, def, record)\n })\n const query = {}\n const criteria = query[def.foreignKey] = {}\n if (singular) {\n // more efficient query when we only have one record\n criteria['=='] = IDs[0]\n } else {\n criteria['in'] = IDs.filter(function (id) {\n return id\n })\n }\n return self.findAll(def.getRelation(), query, __opts).then(function (relatedItems) {\n records.forEach(function (record) {\n let attached = []\n // avoid unneccesary iteration when we only have one record\n if (singular) {\n attached = relatedItems\n } else {\n relatedItems.forEach(function (relatedItem) {\n if (get(relatedItem, def.foreignKey) === record[mapper.idAttribute]) {\n attached.push(relatedItem)\n }\n })\n }\n def.setLocalField(record, attached)\n })\n })\n },\n\n /**\n * Load a hasOne relationship.\n *\n * @name MongoDBAdapter#loadHasOne\n * @method\n * @return {Promise}\n */\n loadHasOne (mapper, def, records, __opts) {\n if (isObject(records) && !isArray(records)) {\n records = [records]\n }\n return this.loadHasMany(mapper, def, records, __opts).then(function () {\n records.forEach(function (record) {\n const relatedData = def.getLocalField(record)\n if (isArray(relatedData) && relatedData.length) {\n def.setLocalField(record, relatedData[0])\n }\n })\n })\n },\n\n /**\n * Return the foreignKey from the given record for the provided relationship.\n *\n * @name MongoDBAdapter#makeBelongsToForeignKey\n * @method\n * @return {*}\n */\n makeBelongsToForeignKey (mapper, def, record) {\n return this.toObjectID(def.getRelation(), def.getForeignKey(record))\n },\n\n /**\n * Load a belongsTo relationship.\n *\n * @name MongoDBAdapter#loadBelongsTo\n * @method\n * @return {Promise}\n */\n loadBelongsTo (mapper, def, records, __opts) {\n const self = this\n const relationDef = def.getRelation()\n\n if (isObject(records) && !isArray(records)) {\n const record = records\n return self.find(relationDef, self.makeBelongsToForeignKey(mapper, def, record), __opts).then(function (relatedItem) {\n def.setLocalField(record, relatedItem)\n })\n } else {\n const keys = records.map(function (record) {\n return self.makeBelongsToForeignKey(mapper, def, record)\n }).filter(function (key) {\n return key\n })\n return self.findAll(relationDef, {\n where: {\n [relationDef.idAttribute]: {\n 'in': keys\n }\n }\n }, __opts).then(function (relatedItems) {\n records.forEach(function (record) {\n relatedItems.forEach(function (relatedItem) {\n if (relatedItem[relationDef.idAttribute] === record[def.foreignKey]) {\n def.setLocalField(record, relatedItem)\n }\n })\n })\n })\n }\n },\n\n /**\n * Retrieve the record with the given primary key.\n *\n * @name MongoDBAdapter#find\n * @method\n * @param {Object} mapper The mapper.\n * @param {(string|number)} id Primary key of the record to retrieve.\n * @param {Object} [opts] Configuration options.\n * @param {Object} [opts.findOneOpts] Options to pass to collection#findOne.\n * @param {boolean} [opts.raw=false] Whether to return a more detailed\n * response object.\n * @param {string[]} [opts.with=[]] Relations to eager load.\n * @return {Promise}\n */\n find (mapper, id, opts) {\n const self = this\n let record, op\n opts || (opts = {})\n opts.with || (opts.with = [])\n\n const findOneOpts = self.getOpt('findOneOpts', opts)\n findOneOpts.fields || (findOneOpts.fields = {})\n\n return self.getClient().then(function (client) {\n // beforeFind lifecycle hook\n op = opts.op = 'beforeFind'\n return resolve(self[op](mapper, id, opts)).then(function () {\n return new Promise(function (resolve, reject) {\n let mongoQuery = {}\n mongoQuery[mapper.idAttribute] = self.toObjectID(mapper, id)\n client.collection(mapper.table || underscore(mapper.name)).findOne(mongoQuery, findOneOpts, function (err, cursor) {\n return err ? reject(err) : resolve(cursor)\n })\n })\n })\n }).then(function (_record) {\n if (!_record) {\n return\n }\n record = _record\n self._translateId(record, opts)\n const tasks = []\n\n forEachRelation(mapper, opts, function (def, __opts) {\n const relatedMapper = def.getRelation()\n let task\n\n if (def.foreignKey && (def.type === 'hasOne' || def.type === 'hasMany')) {\n if (def.type === 'hasOne') {\n task = self.loadHasOne(mapper, def, record, __opts)\n } else {\n task = self.loadHasMany(mapper, def, record, __opts)\n }\n } else if (def.type === 'hasMany' && def.localKeys) {\n let localKeys = []\n let itemKeys = get(record, def.localKeys) || []\n itemKeys = isArray(itemKeys) ? itemKeys : Object.keys(itemKeys)\n localKeys = localKeys.concat(itemKeys)\n task = self.findAll(relatedMapper, {\n where: {\n [relatedMapper.idAttribute]: {\n 'in': unique(localKeys).filter(function (x) { return x }).map(function (x) { return self.toObjectID(relatedMapper, x) })\n }\n }\n }, __opts).then(function (relatedItems) {\n def.setLocalField(record, relatedItems)\n })\n } else if (def.type === 'hasMany' && def.foreignKeys) {\n task = self.findAll(relatedMapper, {\n where: {\n [def.foreignKeys]: {\n 'contains': self.makeHasManyForeignKeys(mapper, def, record)\n }\n }\n }, __opts).then(function (relatedItems) {\n def.setLocalField(record, relatedItems)\n })\n } else if (def.type === 'belongsTo') {\n task = self.loadBelongsTo(mapper, def, record, __opts)\n }\n if (task) {\n tasks.push(task)\n }\n })\n\n return Promise.all(tasks)\n }).then(function () {\n // afterFind lifecycle hook\n op = opts.op = 'afterFind'\n return resolve(self[op](mapper, id, opts, record)).then(function (_record) {\n // Allow for re-assignment from lifecycle hook\n record = isUndefined(_record) ? record : _record\n return self.getOpt('raw', opts) ? {\n data: record,\n found: record ? 1 : 0\n } : record\n })\n })\n },\n\n /**\n * Retrieve the records that match the selection query.\n *\n * @name MongoDBAdapter#findAll\n * @method\n * @param {Object} mapper The mapper.\n * @param {Object} query Selection query.\n * @param {Object} [opts] Configuration options.\n * @param {Object} [opts.findOpts] Options to pass to collection#find.\n * @param {boolean} [opts.raw=false] Whether to return a more detailed\n * response object.\n * @param {string[]} [opts.with=[]] Relations to eager load.\n * @return {Promise}\n */\n findAll (mapper, query, opts) {\n const self = this\n opts || (opts = {})\n opts.with || (opts.with = [])\n\n let records = []\n let op\n const findOpts = self.getOpt('findOpts', opts)\n fillIn(findOpts, self.getQueryOptions(mapper, query))\n findOpts.fields || (findOpts.fields = {})\n const mongoQuery = self.getQuery(mapper, query)\n\n return self.getClient().then(function (client) {\n // beforeFindAll lifecycle hook\n op = opts.op = 'beforeFindAll'\n return resolve(self[op](mapper, query, opts)).then(function () {\n return new Promise(function (resolve, reject) {\n client.collection(mapper.table || underscore(mapper.name)).find(mongoQuery, findOpts).toArray(function (err, cursor) {\n return err ? reject(err) : resolve(cursor)\n })\n })\n })\n }).then(function (_records) {\n records = _records\n self._translateId(records, opts)\n const tasks = []\n forEachRelation(mapper, opts, function (def, __opts) {\n const relatedMapper = def.getRelation()\n let task\n if (def.foreignKey && (def.type === 'hasOne' || def.type === 'hasMany')) {\n if (def.type === 'hasMany') {\n task = self.loadHasMany(mapper, def, records, __opts)\n } else {\n task = self.loadHasOne(mapper, def, records, __opts)\n }\n } else if (def.type === 'hasMany' && def.localKeys) {\n let localKeys = []\n records.forEach(function (item) {\n let itemKeys = item[def.localKeys] || []\n itemKeys = isArray(itemKeys) ? itemKeys : Object.keys(itemKeys)\n localKeys = localKeys.concat(itemKeys)\n })\n task = self.findAll(relatedMapper, {\n where: {\n [relatedMapper.idAttribute]: {\n 'in': unique(localKeys).filter(function (x) { return x }).map(function (x) { return self.toObjectID(relatedMapper, x) })\n }\n }\n }, __opts).then(function (relatedItems) {\n records.forEach(function (item) {\n let attached = []\n let itemKeys = get(item, def.localKeys) || []\n itemKeys = isArray(itemKeys) ? itemKeys : Object.keys(itemKeys)\n relatedItems.forEach(function (relatedItem) {\n if (itemKeys && itemKeys.indexOf(relatedItem[relatedMapper.idAttribute]) !== -1) {\n attached.push(relatedItem)\n }\n })\n def.setLocalField(item, attached)\n })\n return relatedItems\n })\n } else if (def.type === 'hasMany' && def.foreignKeys) {\n throw new Error('findAll eager load hasMany foreignKeys not supported!')\n } else if (def.type === 'belongsTo') {\n task = self.loadBelongsTo(mapper, def, records, __opts)\n }\n if (task) {\n tasks.push(task)\n }\n })\n return Promise.all(tasks)\n }).then(function () {\n // afterFindAll lifecycle hook\n op = opts.op = 'afterFindAll'\n return resolve(self[op](mapper, query, opts, records)).then(function (_records) {\n // Allow for re-assignment from lifecycle hook\n records = isUndefined(_records) ? records : _records\n return self.getOpt('raw', opts) ? {\n data: records,\n found: records.length\n } : records\n })\n })\n },\n\n /**\n * Create a new record.\n *\n * @name MongoDBAdapter#create\n * @method\n * @param {Object} mapper The mapper.\n * @param {Object} props The record to be created.\n * @param {Object} [opts] Configuration options.\n * @param {Object} [opts.insertOpts] Options to pass to collection#insert.\n * @param {boolean} [opts.raw=false] Whether to return a more detailed\n * response object.\n * @return {Promise}\n */\n create (mapper, props, opts) {\n const self = this\n let op\n props || (props = {})\n opts || (opts = {})\n\n const insertOpts = self.getOpt('insertOpts', opts)\n\n return self.getClient().then(function (client) {\n // beforeCreate lifecycle hook\n op = opts.op = 'beforeCreate'\n return resolve(self[op](mapper, props, opts)).then(function (_props) {\n // Allow for re-assignment from lifecycle hook\n _props = isUndefined(_props) ? props : _props\n return new Promise(function (resolve, reject) {\n const collection = client.collection(mapper.table || underscore(mapper.name))\n const method = collection.insertOne ? 'insertOne' : 'insert'\n collection[method](_props, insertOpts, function (err, cursor) {\n return err ? reject(err) : resolve(cursor)\n })\n })\n }).then(function (cursor) {\n let record\n let r = cursor.ops ? cursor.ops : cursor\n self._translateId(r, opts)\n record = isArray(r) ? r[0] : r\n\n // afterCreate lifecycle hook\n op = opts.op = 'afterCreate'\n return self[op](mapper, props, opts, record).then(function (_record) {\n // Allow for re-assignment from lifecycle hook\n record = isUndefined(_record) ? record : _record\n const result = {}\n fillIn(result, cursor)\n delete result.connection\n result.data = record\n result.created = record ? 1 : 0\n return self.getOpt('raw', opts) ? result : result.data\n })\n })\n })\n },\n\n /**\n * Create multiple records in a single batch.\n *\n * @name MongoDBAdapter#createMany\n * @method\n * @param {Object} mapper The mapper.\n * @param {Object} props The records to be created.\n * @param {Object} [opts] Configuration options.\n * @param {Object} [opts.insertManyOpts] Options to pass to\n * collection#insertMany.\n * @param {boolean} [opts.raw=false] Whether to return a more detailed\n * response object.\n * @return {Promise}\n */\n createMany (mapper, props, opts) {\n const self = this\n let op\n props || (props = {})\n opts || (opts = {})\n\n const insertManyOpts = self.getOpt('insertManyOpts', opts)\n\n return self.getClient().then(function (client) {\n // beforeCreateMany lifecycle hook\n op = opts.op = 'beforeCreateMany'\n return resolve(self[op](mapper, props, opts)).then(function (_props) {\n // Allow for re-assignment from lifecycle hook\n _props = isUndefined(_props) ? props : _props\n return new Promise(function (resolve, reject) {\n const collection = client.collection(mapper.table || underscore(mapper.name))\n collection.insertMany(_props, insertManyOpts, function (err, cursor) {\n return err ? reject(err) : resolve(cursor)\n })\n })\n }).then(function (cursor) {\n let records\n let r = cursor.ops ? cursor.ops : cursor\n self._translateId(r, opts)\n records = r\n\n // afterCreateMany lifecycle hook\n op = opts.op = 'afterCreateMany'\n return self[op](mapper, props, opts, records).then(function (_records) {\n // Allow for re-assignment from lifecycle hook\n records = isUndefined(_records) ? records : _records\n const result = {}\n fillIn(result, cursor)\n delete result.connection\n result.data = records\n result.created = records.length\n return self.getOpt('raw', opts) ? result : result.data\n })\n })\n })\n },\n\n /**\n * Destroy the record with the given primary key.\n *\n * @name MongoDBAdapter#destroy\n * @method\n * @param {Object} mapper The mapper.\n * @param {(string|number)} id Primary key of the record to destroy.\n * @param {Object} [opts] Configuration options.\n * @param {boolean} [opts.raw=false] Whether to return a more detailed\n * response object.\n * @param {Object} [opts.removeOpts] Options to pass to collection#remove.\n * @return {Promise}\n */\n destroy (mapper, id, opts) {\n const self = this\n let op\n opts || (opts = {})\n const removeOpts = self.getOpt('removeOpts', opts)\n\n return self.getClient().then(function (client) {\n // beforeDestroy lifecycle hook\n op = opts.op = 'beforeDestroy'\n return resolve(self[op](mapper, id, opts)).then(function () {\n return new Promise(function (resolve, reject) {\n const mongoQuery = {}\n mongoQuery[mapper.idAttribute] = self.toObjectID(mapper, id)\n const collection = client.collection(mapper.table || underscore(mapper.name))\n collection[collection.deleteOne ? 'deleteOne' : 'remove'](mongoQuery, removeOpts, function (err, cursor) {\n return err ? reject(err) : resolve(cursor)\n })\n })\n })\n }).then(function (cursor) {\n // afterDestroy lifecycle hook\n op = opts.op = 'afterDestroy'\n return resolve(self[op](mapper, id, opts, cursor)).then(function (_cursor) {\n // Allow for re-assignment from lifecycle hook\n return isUndefined(_cursor) ? cursor : _cursor\n })\n }).then(function (cursor) {\n if (cursor) {\n delete cursor.connection\n }\n return self.getOpt('raw', opts) ? cursor : undefined\n })\n },\n\n /**\n * Destroy the records that match the selection query.\n *\n * @name MongoDBAdapter#destroyAll\n * @method\n * @param {Object} mapper the mapper.\n * @param {Object} [query] Selection query.\n * @param {Object} [opts] Configuration options.\n * @param {boolean} [opts.raw=false] Whether to return a more detailed\n * response object.\n * @param {Object} [opts.removeOpts] Options to pass to collection#remove.\n * @return {Promise}\n */\n destroyAll (mapper, query, opts) {\n const self = this\n let op\n query || (query = {})\n opts || (opts = {})\n const removeOpts = self.getOpt('removeOpts', opts)\n fillIn(removeOpts, self.getQueryOptions(mapper, query))\n\n return self.getClient().then(function (client) {\n // beforeDestroyAll lifecycle hook\n op = opts.op = 'beforeDestroyAll'\n return resolve(self[op](mapper, query, opts)).then(function () {\n const mongoQuery = self.getQuery(mapper, query)\n return new Promise(function (resolve, reject) {\n const collection = client.collection(mapper.table || underscore(mapper.name))\n collection[collection.deleteMany ? 'deleteMany' : 'remove'](mongoQuery, removeOpts, function (err, cursor) {\n return err ? reject(err) : resolve(cursor)\n })\n })\n })\n }).then(function (cursor) {\n // afterDestroyAll lifecycle hook\n op = opts.op = 'afterDestroyAll'\n return resolve(self[op](mapper, query, opts, cursor)).then(function (_cursor) {\n // Allow for re-assignment from lifecycle hook\n return isUndefined(_cursor) ? cursor : _cursor\n })\n }).then(function (cursor) {\n if (cursor) {\n delete cursor.connection\n }\n return self.getOpt('raw', opts) ? cursor : undefined\n })\n },\n\n /**\n * Apply the given update to the record with the specified primary key.\n *\n * @name MongoDBAdapter#update\n * @method\n * @param {Object} mapper The mapper.\n * @param {(string|number)} id The primary key of the record to be updated.\n * @param {Object} props The update to apply to the record.\n * @param {Object} [opts] Configuration options.\n * @param {boolean} [opts.raw=false] Whether to return a more detailed\n * response object.\n * @param {Object} [opts.updateOpts] Options to pass to collection#update.\n * @return {Promise}\n */\n update (mapper, id, props, opts) {\n const self = this\n props || (props = {})\n opts || (opts = {})\n let op\n const updateOpts = self.getOpt('updateOpts', opts)\n\n return self.find(mapper, id, { raw: false }).then(function (record) {\n if (!record) {\n throw new Error('Not Found')\n }\n // beforeUpdate lifecycle hook\n op = opts.op = 'beforeUpdate'\n return resolve(self[op](mapper, id, props, opts))\n }).then(function (_props) {\n // Allow for re-assignment from lifecycle hook\n _props = isUndefined(_props) ? props : _props\n return self.getClient().then(function (client) {\n return new Promise(function (resolve, reject) {\n const mongoQuery = {}\n mongoQuery[mapper.idAttribute] = self.toObjectID(mapper, id)\n const collection = client.collection(mapper.table || underscore(mapper.name))\n collection[collection.updateOne ? 'updateOne' : 'update'](mongoQuery, { $set: _props }, updateOpts, function (err, cursor) {\n return err ? reject(err) : resolve(cursor)\n })\n })\n })\n }).then(function (cursor) {\n if (cursor) {\n delete cursor.connection\n }\n return self.find(mapper, id, { raw: false }).then(function (record) {\n // afterUpdate lifecycle hook\n op = opts.op = 'afterUpdate'\n return resolve(self[op](mapper, id, props, opts, record)).then(function (_record) {\n // Allow for re-assignment from lifecycle hook\n record = isUndefined(_record) ? record : _record\n const result = {}\n fillIn(result, cursor)\n result.data = record\n result.updated = record ? 1 : 0\n return self.getOpt('raw', opts) ? result : result.data\n })\n })\n })\n },\n\n /**\n * Apply the given update to all records that match the selection query.\n *\n * @name MongoDBAdapter#updateAll\n * @method\n * @param {Object} mapper The mapper.\n * @param {Object} props The update to apply to the selected records.\n * @param {Object} [query] Selection query.\n * @param {Object} [opts] Configuration options.\n * @param {boolean} [opts.raw=false] Whether to return a more detailed\n * response object.\n * @param {Object} [opts.updateOpts] Options to pass to collection#update.\n * @return {Promise}\n */\n updateAll (mapper, props, query, opts) {\n const self = this\n props || (props = {})\n query || (query = {})\n opts || (opts = {})\n let op, ids\n const updateOpts = self.getOpt('updateOpts', opts)\n updateOpts.multi = true\n\n return self.getClient().then(function (client) {\n const queryOptions = self.getQueryOptions(mapper, query)\n queryOptions.$set = props\n const mongoQuery = self.getQuery(mapper, query)\n\n // beforeUpdateAll lifecycle hook\n op = opts.op = 'beforeUpdateAll'\n return resolve(self[op](mapper, props, query, opts)).then(function () {\n return self.findAll(mapper, query, { raw: false })\n }).then(function (records) {\n ids = records.map(function (record) {\n return self.toObjectID(mapper, record[mapper.idAttribute])\n })\n\n return new Promise(function (resolve, reject) {\n const collection = client.collection(mapper.table || underscore(mapper.name))\n collection[collection.updateMany ? 'updateMany' : 'update'](mongoQuery, queryOptions, updateOpts, function (err, cursor) {\n return err ? reject(err) : resolve(cursor)\n })\n })\n }).then(function (cursor) {\n if (cursor) {\n delete cursor.connection\n }\n const query = {}\n query[mapper.idAttribute] = {\n 'in': ids\n }\n return self.findAll(mapper, query, { raw: false }).then(function (records) {\n // afterUpdateAll lifecycle hook\n op = opts.op = 'afterUpdateAll'\n return self[op](mapper, props, query, opts, records).then(function (_records) {\n // Allow for re-assignment from lifecycle hook\n records = isUndefined(_records) ? records : _records\n const result = {}\n fillIn(result, cursor)\n result.data = records\n result.updated = records.length\n return self.getOpt('raw', opts) ? result : result.data\n })\n })\n })\n })\n },\n\n /**\n * Not supported.\n *\n * @name MongoDBAdapter#updateMany\n * @method\n */\n updateMany () {\n throw new Error('not supported!')\n }\n})\n"],"names":["utils","ObjectID"],"mappings":"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"} \ No newline at end of file diff --git a/package.json b/package.json index bf3b46c..30f0f14 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "js-data-mongodb", "description": "MongoDB adapter for js-data.", - "version": "1.0.0-alpha.1", + "version": "1.0.0-alpha.2", "homepage": "https://github.com/js-data/js-data-mongodb", "repository": { "type": "git", diff --git a/src/index.js b/src/index.js index 2180fe7..c57c157 100644 --- a/src/index.js +++ b/src/index.js @@ -13,6 +13,7 @@ const { isObject, isString, isUndefined, + plainCopy, resolve } = utils @@ -387,20 +388,20 @@ addHiddenPropsToTarget(MongoDBAdapter.prototype, { * @method * @return {Object} */ - getQuery (Resource, query) { - query || (query = {}) + getQuery (mapper, query) { + query = plainCopy(query || {}) query.where || (query.where = {}) - forOwn(query, function (v, k) { - if (reserved.indexOf(k) === -1) { - if (isObject(v)) { - query.where[k] = v + forOwn(query, function (config, keyword) { + if (reserved.indexOf(keyword) === -1) { + if (isObject(config)) { + query.where[keyword] = config } else { - query.where[k] = { - '==': v + query.where[keyword] = { + '==': config } } - delete query[k] + delete query[keyword] } }) @@ -534,8 +535,8 @@ addHiddenPropsToTarget(MongoDBAdapter.prototype, { * @method * @return {Object} */ - getQueryOptions (Resource, query) { - query = query || {} + getQueryOptions (mapper, query) { + query = plainCopy(query || {}) query.orderBy = query.orderBy || query.sort query.skip = query.skip || query.offset @@ -578,7 +579,7 @@ addHiddenPropsToTarget(MongoDBAdapter.prototype, { */ getOpt (opt, opts) { opts || (opts = {}) - return isUndefined(opts[opt]) ? this[opt] : opts[opt] + return isUndefined(opts[opt]) ? plainCopy(this[opt]) : plainCopy(opts[opt]) }, /** @@ -588,8 +589,8 @@ addHiddenPropsToTarget(MongoDBAdapter.prototype, { * @method * @return {*} */ - toObjectID (Resource, id) { - if (id !== undefined && Resource.idAttribute === '_id' && typeof id === 'string' && ObjectID.isValid(id) && !(id instanceof ObjectID)) { + toObjectID (mapper, id) { + if (id !== undefined && mapper.idAttribute === '_id' && typeof id === 'string' && ObjectID.isValid(id) && !(id instanceof ObjectID)) { return new ObjectID(id) } return id @@ -1062,7 +1063,7 @@ addHiddenPropsToTarget(MongoDBAdapter.prototype, { * * @name MongoDBAdapter#destroy * @method - * @param {Object} Resource The Resource. + * @param {Object} mapper The mapper. * @param {(string|number)} id Primary key of the record to destroy. * @param {Object} [opts] Configuration options. * @param {boolean} [opts.raw=false] Whether to return a more detailed From 57d83ff0fb2c7aac3c61e11bb1a6513df1cea222 Mon Sep 17 00:00:00 2001 From: Jason Dobry Date: Sat, 5 Mar 2016 21:12:13 -0800 Subject: [PATCH 07/36] 1.0.0-alpha.3 --- AUTHORS | 2 - CHANGELOG.md | 9 + dist/js-data-mongodb.js | 578 ++++++++---------------------------- dist/js-data-mongodb.js.map | 2 +- mocha.start.js | 27 +- package.json | 28 +- src/index.js | 521 +++++++------------------------- 7 files changed, 274 insertions(+), 893 deletions(-) diff --git a/AUTHORS b/AUTHORS index 0dbf29d..aeb5fb4 100644 --- a/AUTHORS +++ b/AUTHORS @@ -1,7 +1,5 @@ # This is the official list of js-data-mongodb project authors. # -# This file is controlled by scripts/authors.js -# # Names are formatted as: # # commits Name or Organization # The email address is not required for organizations. diff --git a/CHANGELOG.md b/CHANGELOG.md index 398ed00..7af0ad1 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,12 @@ +##### 1.0.0-alpha.3 - 06 March 2016 + +###### Backwards compatible API changes +- Upgraded to latest js-data-adapter-tests, making appropriate changes + +###### Other +- Extracted common adapter functionality into js-data-adapter +- Extracted common js-data repo utility scripts into js-data-repo-tools + ##### 1.0.0-alpha.2 - 27 February 2016 ###### Backwards compatible bug fixes diff --git a/dist/js-data-mongodb.js b/dist/js-data-mongodb.js index 1039e14..a456c48 100644 --- a/dist/js-data-mongodb.js +++ b/dist/js-data-mongodb.js @@ -5,14 +5,12 @@ function _interopDefault (ex) { return (ex && (typeof ex === 'object') && 'defau var mongodb = require('mongodb'); var bson = require('bson'); var jsData = require('js-data'); +var Adapter = require('js-data-adapter'); +var Adapter__default = _interopDefault(Adapter); var underscore = _interopDefault(require('mout/string/underscore')); +var unique = _interopDefault(require('mout/array/unique')); var babelHelpers = {}; -babelHelpers.typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { - return typeof obj; -} : function (obj) { - return obj && typeof Symbol === "function" && obj.constructor === Symbol ? "symbol" : typeof obj; -}; babelHelpers.defineProperty = function (obj, key, value) { if (key in obj) { @@ -32,6 +30,8 @@ babelHelpers.defineProperty = function (obj, key, value) { babelHelpers; var addHiddenPropsToTarget = jsData.utils.addHiddenPropsToTarget; +var classCallCheck = jsData.utils.classCallCheck; +var extend = jsData.utils.extend; var fillIn = jsData.utils.fillIn; var forEachRelation = jsData.utils.forEachRelation; var forOwn = jsData.utils.forOwn; @@ -40,68 +40,16 @@ var isArray = jsData.utils.isArray; var isObject = jsData.utils.isObject; var isString = jsData.utils.isString; var isUndefined = jsData.utils.isUndefined; +var omit = jsData.utils.omit; var plainCopy = jsData.utils.plainCopy; var resolve = jsData.utils.resolve; -var reserved = ['orderBy', 'sort', 'limit', 'offset', 'skip', 'where']; - -function unique(array) { - var seen = {}; - var final = []; - array.forEach(function (item) { - if (item in seen) { - return; - } - final.push(item); - seen[item] = 0; - }); - return final; -} - -var noop = function noop() { - var self = this; - - for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) { - args[_key] = arguments[_key]; - } - - var opts = args[args.length - 1]; - self.dbg.apply(self, [opts.op].concat(args)); - return resolve(); -}; - -var noop2 = function noop2() { - var self = this; - - for (var _len2 = arguments.length, args = Array(_len2), _key2 = 0; _key2 < _len2; _key2++) { - args[_key2] = arguments[_key2]; - } - - var opts = args[args.length - 2]; - self.dbg.apply(self, [opts.op].concat(args)); - return resolve(); +var withoutRelations = function withoutRelations(mapper, props) { + return omit(props, mapper.relationFields || []); }; var DEFAULTS = { - /** - * Whether to log debugging information. - * - * @name MongoDBAdapter#debug - * @type {boolean} - * @default false - */ - debug: false, - - /** - * Whether to return detailed result objects instead of just record data. - * - * @name MongoDBAdapter#raw - * @type {boolean} - * @default false - */ - raw: false, - /** * Convert ObjectIDs to strings when pulling records out of the database. * @@ -171,12 +119,13 @@ var REMOVE_OPTS_DEFAULTS = {}; */ function MongoDBAdapter(opts) { var self = this; + classCallCheck(self, MongoDBAdapter); opts || (opts = {}); if (isString(opts)) { opts = { uri: opts }; } fillIn(opts, DEFAULTS); - fillIn(self, opts); + Adapter__default.call(self, opts); /** * Default options to pass to collection#find. @@ -252,6 +201,34 @@ function MongoDBAdapter(opts) { }); } +// Setup prototype inheritance from Adapter +MongoDBAdapter.prototype = Object.create(Adapter__default.prototype, { + constructor: { + value: MongoDBAdapter, + enumerable: false, + writable: true, + configurable: true + } +}); + +Object.defineProperty(MongoDBAdapter, '__super__', { + configurable: true, + value: Adapter__default +}); + +/** + * Alternative to ES6 class syntax for extending `MongoDBAdapter`. + * + * @name MongoDBAdapter.extend + * @method + * @param {Object} [instanceProps] Properties that will be added to the + * prototype of the MongoDBAdapter. + * @param {Object} [classProps] Properties that will be added as static + * properties to the MongoDBAdapter itself. + * @return {Object} MongoDBAdapter of `MongoDBAdapter`. + */ +MongoDBAdapter.extend = extend; + addHiddenPropsToTarget(MongoDBAdapter.prototype, { /** * Translate ObjectIDs to strings. @@ -278,127 +255,6 @@ addHiddenPropsToTarget(MongoDBAdapter.prototype, { }, - /** - * @name MongoDBAdapter#afterCreate - * @method - */ - afterCreate: noop2, - - /** - * @name MongoDBAdapter#afterCreateMany - * @method - */ - afterCreateMany: noop2, - - /** - * @name MongoDBAdapter#afterDestroy - * @method - */ - afterDestroy: noop2, - - /** - * @name MongoDBAdapter#afterDestroyAll - * @method - */ - afterDestroyAll: noop2, - - /** - * @name MongoDBAdapter#afterFind - * @method - */ - afterFind: noop2, - - /** - * @name MongoDBAdapter#afterFindAll - * @method - */ - afterFindAll: noop2, - - /** - * @name MongoDBAdapter#afterUpdate - * @method - */ - afterUpdate: noop2, - - /** - * @name MongoDBAdapter#afterUpdateAll - * @method - */ - afterUpdateAll: noop2, - - /** - * @name MongoDBAdapter#afterUpdateMany - * @method - */ - afterUpdateMany: noop2, - - /** - * @name MongoDBAdapter#beforeCreate - * @method - */ - beforeCreate: noop, - - /** - * @name MongoDBAdapter#beforeCreateMany - * @method - */ - beforeCreateMany: noop, - - /** - * @name MongoDBAdapter#beforeDestroy - * @method - */ - beforeDestroy: noop, - - /** - * @name MongoDBAdapter#beforeDestroyAll - * @method - */ - beforeDestroyAll: noop, - - /** - * @name MongoDBAdapter#beforeFind - * @method - */ - beforeFind: noop, - - /** - * @name MongoDBAdapter#beforeFindAll - * @method - */ - beforeFindAll: noop, - - /** - * @name MongoDBAdapter#beforeUpdate - * @method - */ - beforeUpdate: noop, - - /** - * @name MongoDBAdapter#beforeUpdateAll - * @method - */ - beforeUpdateAll: noop, - - /** - * @name MongoDBAdapter#beforeUpdateMany - * @method - */ - beforeUpdateMany: noop, - - /** - * @name MongoDBAdapter#dbg - * @method - */ - dbg: function dbg() { - for (var _len3 = arguments.length, args = Array(_len3), _key3 = 0; _key3 < _len3; _key3++) { - args[_key3] = arguments[_key3]; - } - - this.log.apply(this, ['debug'].concat(args)); - }, - - /** * Return a Promise that resolves to a reference to the MongoDB client being * used by this adapter. @@ -431,7 +287,7 @@ addHiddenPropsToTarget(MongoDBAdapter.prototype, { query.where || (query.where = {}); forOwn(query, function (config, keyword) { - if (reserved.indexOf(keyword) === -1) { + if (Adapter.reserved.indexOf(keyword) === -1) { if (isObject(config)) { query.where[keyword] = config; } else { @@ -539,37 +395,6 @@ addHiddenPropsToTarget(MongoDBAdapter.prototype, { }, - /** - * Logging utility method. - * - * @name MongoDBAdapter#log - * @method - */ - log: function log(level) { - for (var _len4 = arguments.length, args = Array(_len4 > 1 ? _len4 - 1 : 0), _key4 = 1; _key4 < _len4; _key4++) { - args[_key4 - 1] = arguments[_key4]; - } - - if (level && !args.length) { - args.push(level); - level = 'debug'; - } - if (level === 'debug' && !this.debug) { - return; - } - var prefix = level.toUpperCase() + ': (MongoDBAdapter)'; - if (console[level]) { - var _console; - - (_console = console)[level].apply(_console, [prefix].concat(args)); - } else { - var _console2; - - (_console2 = console).log.apply(_console2, [prefix].concat(args)); - } - }, - - /** * Map non-filtering params in a selection query to MongoDB query options. * @@ -614,22 +439,6 @@ addHiddenPropsToTarget(MongoDBAdapter.prototype, { }, - /** - * Resolve the value of the specified option based on the given options and - * this adapter's settings. - * - * @name MongoDBAdapter#getOpt - * @method - * @param {string} opt The name of the option. - * @param {Object} [opts] Configuration options. - * @return {*} The value of the specified option. - */ - getOpt: function getOpt(opt, opts) { - opts || (opts = {}); - return isUndefined(opts[opt]) ? plainCopy(this[opt]) : plainCopy(opts[opt]); - }, - - /** * Turn an _id into an ObjectID if it isn't already an ObjectID. * @@ -645,109 +454,6 @@ addHiddenPropsToTarget(MongoDBAdapter.prototype, { }, - /** - * Return the foreignKey from the given record for the provided relationship. - * - * If the foreignKeys in your database are saved as ObjectIDs, then override - * this method and change it to something like: - * - * ``` - * return this.toObjectID(mapper, this.constructor.prototype.makeHasManyForeignKey.call(this, mapper, def, record)) - * ``` - * - * There may be other reasons why you may want to override this method, like - * when the id of the parent doesn't exactly match up to the key on the child. - * - * @name MongoDBAdapter#makeHasManyForeignKey - * @method - * @return {*} - */ - makeHasManyForeignKey: function makeHasManyForeignKey(mapper, def, record) { - return def.getForeignKey(record); - }, - - - /** - * Return the foreignKeys from the given record for the provided relationship. - * - * @name MongoDBAdapter#makeHasManyForeignKeys - * @method - * @return {*} - */ - makeHasManyForeignKeys: function makeHasManyForeignKeys(mapper, def, record) { - return get(record, mapper.idAttribute); - }, - - - /** - * Load a hasMany relationship. - * - * @name MongoDBAdapter#loadHasMany - * @method - * @return {Promise} - */ - loadHasMany: function loadHasMany(mapper, def, records, __opts) { - var self = this; - var singular = false; - - if (isObject(records) && !isArray(records)) { - singular = true; - records = [records]; - } - var IDs = records.map(function (record) { - return self.makeHasManyForeignKey(mapper, def, record); - }); - var query = {}; - var criteria = query[def.foreignKey] = {}; - if (singular) { - // more efficient query when we only have one record - criteria['=='] = IDs[0]; - } else { - criteria['in'] = IDs.filter(function (id) { - return id; - }); - } - return self.findAll(def.getRelation(), query, __opts).then(function (relatedItems) { - records.forEach(function (record) { - var attached = []; - // avoid unneccesary iteration when we only have one record - if (singular) { - attached = relatedItems; - } else { - relatedItems.forEach(function (relatedItem) { - if (get(relatedItem, def.foreignKey) === record[mapper.idAttribute]) { - attached.push(relatedItem); - } - }); - } - def.setLocalField(record, attached); - }); - }); - }, - - - /** - * Load a hasOne relationship. - * - * @name MongoDBAdapter#loadHasOne - * @method - * @return {Promise} - */ - loadHasOne: function loadHasOne(mapper, def, records, __opts) { - if (isObject(records) && !isArray(records)) { - records = [records]; - } - return this.loadHasMany(mapper, def, records, __opts).then(function () { - records.forEach(function (record) { - var relatedData = def.getLocalField(record); - if (isArray(relatedData) && relatedData.length) { - def.setLocalField(record, relatedData[0]); - } - }); - }); - }, - - /** * Return the foreignKey from the given record for the provided relationship. * @@ -756,52 +462,7 @@ addHiddenPropsToTarget(MongoDBAdapter.prototype, { * @return {*} */ makeBelongsToForeignKey: function makeBelongsToForeignKey(mapper, def, record) { - return this.toObjectID(def.getRelation(), def.getForeignKey(record)); - }, - - - /** - * Load a belongsTo relationship. - * - * @name MongoDBAdapter#loadBelongsTo - * @method - * @return {Promise} - */ - loadBelongsTo: function loadBelongsTo(mapper, def, records, __opts) { - var self = this; - var relationDef = def.getRelation(); - - if (isObject(records) && !isArray(records)) { - var _ret = function () { - var record = records; - return { - v: self.find(relationDef, self.makeBelongsToForeignKey(mapper, def, record), __opts).then(function (relatedItem) { - def.setLocalField(record, relatedItem); - }) - }; - }(); - - if ((typeof _ret === 'undefined' ? 'undefined' : babelHelpers.typeof(_ret)) === "object") return _ret.v; - } else { - var keys = records.map(function (record) { - return self.makeBelongsToForeignKey(mapper, def, record); - }).filter(function (key) { - return key; - }); - return self.findAll(relationDef, { - where: babelHelpers.defineProperty({}, relationDef.idAttribute, { - 'in': keys - }) - }, __opts).then(function (relatedItems) { - records.forEach(function (record) { - relatedItems.forEach(function (relatedItem) { - if (relatedItem[relationDef.idAttribute] === record[def.foreignKey]) { - def.setLocalField(record, relatedItem); - } - }); - }); - }); - } + return this.toObjectID(def.getRelation(), Adapter__default.prototype.makeBelongsToForeignKey.call(this, mapper, def, record)); }, @@ -821,8 +482,8 @@ addHiddenPropsToTarget(MongoDBAdapter.prototype, { */ find: function find(mapper, id, opts) { var self = this; - var record = undefined, - op = undefined; + var record = void 0, + op = void 0; opts || (opts = {}); opts.with || (opts.with = []); @@ -851,7 +512,7 @@ addHiddenPropsToTarget(MongoDBAdapter.prototype, { forEachRelation(mapper, opts, function (def, __opts) { var relatedMapper = def.getRelation(); - var task = undefined; + var task = void 0; if (def.foreignKey && (def.type === 'hasOne' || def.type === 'hasMany')) { if (def.type === 'hasOne') { @@ -893,15 +554,15 @@ addHiddenPropsToTarget(MongoDBAdapter.prototype, { return Promise.all(tasks); }).then(function () { + var response = new Adapter.Response(record, {}, 'find'); + response.found = record ? 1 : 0; + response = self.respond(response, opts); + // afterFind lifecycle hook op = opts.op = 'afterFind'; - return resolve(self[op](mapper, id, opts, record)).then(function (_record) { + return resolve(self[op](mapper, id, opts, response)).then(function (_response) { // Allow for re-assignment from lifecycle hook - record = isUndefined(_record) ? record : _record; - return self.getOpt('raw', opts) ? { - data: record, - found: record ? 1 : 0 - } : record; + return isUndefined(_response) ? response : _response; }); }); }, @@ -927,7 +588,7 @@ addHiddenPropsToTarget(MongoDBAdapter.prototype, { opts.with || (opts.with = []); var records = []; - var op = undefined; + var op = void 0; var findOpts = self.getOpt('findOpts', opts); fillIn(findOpts, self.getQueryOptions(mapper, query)); findOpts.fields || (findOpts.fields = {}); @@ -949,7 +610,7 @@ addHiddenPropsToTarget(MongoDBAdapter.prototype, { var tasks = []; forEachRelation(mapper, opts, function (def, __opts) { var relatedMapper = def.getRelation(); - var task = undefined; + var task = void 0; if (def.foreignKey && (def.type === 'hasOne' || def.type === 'hasMany')) { if (def.type === 'hasMany') { task = self.loadHasMany(mapper, def, records, __opts); @@ -998,15 +659,16 @@ addHiddenPropsToTarget(MongoDBAdapter.prototype, { }); return Promise.all(tasks); }).then(function () { + records || (records = []); + var response = new Adapter.Response(records, {}, 'findAll'); + response.found = records.length; + response = self.respond(response, opts); + // afterFindAll lifecycle hook op = opts.op = 'afterFindAll'; - return resolve(self[op](mapper, query, opts, records)).then(function (_records) { + return resolve(self[op](mapper, query, opts, response)).then(function (_response) { // Allow for re-assignment from lifecycle hook - records = isUndefined(_records) ? records : _records; - return self.getOpt('raw', opts) ? { - data: records, - found: records.length - } : records; + return isUndefined(_response) ? response : _response; }); }); }, @@ -1027,7 +689,7 @@ addHiddenPropsToTarget(MongoDBAdapter.prototype, { */ create: function create(mapper, props, opts) { var self = this; - var op = undefined; + var op = void 0; props || (props = {}); opts || (opts = {}); @@ -1038,7 +700,8 @@ addHiddenPropsToTarget(MongoDBAdapter.prototype, { op = opts.op = 'beforeCreate'; return resolve(self[op](mapper, props, opts)).then(function (_props) { // Allow for re-assignment from lifecycle hook - _props = isUndefined(_props) ? props : _props; + props = isUndefined(_props) ? props : _props; + _props = withoutRelations(mapper, props); return new Promise(function (resolve, reject) { var collection = client.collection(mapper.table || underscore(mapper.name)); var method = collection.insertOne ? 'insertOne' : 'insert'; @@ -1047,22 +710,20 @@ addHiddenPropsToTarget(MongoDBAdapter.prototype, { }); }); }).then(function (cursor) { - var record = undefined; + var record = void 0; var r = cursor.ops ? cursor.ops : cursor; self._translateId(r, opts); record = isArray(r) ? r[0] : r; + cursor.connection = undefined; + var response = new Adapter.Response(record, cursor, 'create'); + response.created = record ? 1 : 0; + response = self.respond(response, opts); // afterCreate lifecycle hook op = opts.op = 'afterCreate'; - return self[op](mapper, props, opts, record).then(function (_record) { + return resolve(self[op](mapper, props, opts, response)).then(function (_response) { // Allow for re-assignment from lifecycle hook - record = isUndefined(_record) ? record : _record; - var result = {}; - fillIn(result, cursor); - delete result.connection; - result.data = record; - result.created = record ? 1 : 0; - return self.getOpt('raw', opts) ? result : result.data; + return isUndefined(_response) ? response : _response; }); }); }); @@ -1085,7 +746,7 @@ addHiddenPropsToTarget(MongoDBAdapter.prototype, { */ createMany: function createMany(mapper, props, opts) { var self = this; - var op = undefined; + var op = void 0; props || (props = {}); opts || (opts = {}); @@ -1096,7 +757,10 @@ addHiddenPropsToTarget(MongoDBAdapter.prototype, { op = opts.op = 'beforeCreateMany'; return resolve(self[op](mapper, props, opts)).then(function (_props) { // Allow for re-assignment from lifecycle hook - _props = isUndefined(_props) ? props : _props; + props = isUndefined(_props) ? props : _props; + _props = props.map(function (record) { + return withoutRelations(mapper, record); + }); return new Promise(function (resolve, reject) { var collection = client.collection(mapper.table || underscore(mapper.name)); collection.insertMany(_props, insertManyOpts, function (err, cursor) { @@ -1104,22 +768,20 @@ addHiddenPropsToTarget(MongoDBAdapter.prototype, { }); }); }).then(function (cursor) { - var records = undefined; + var records = []; var r = cursor.ops ? cursor.ops : cursor; self._translateId(r, opts); records = r; + cursor.connection = undefined; + var response = new Adapter.Response(records, cursor, 'createMany'); + response.created = records.length; + response = self.respond(response, opts); // afterCreateMany lifecycle hook op = opts.op = 'afterCreateMany'; - return self[op](mapper, props, opts, records).then(function (_records) { + return resolve(self[op](mapper, props, opts, response)).then(function (_response) { // Allow for re-assignment from lifecycle hook - records = isUndefined(_records) ? records : _records; - var result = {}; - fillIn(result, cursor); - delete result.connection; - result.data = records; - result.created = records.length; - return self.getOpt('raw', opts) ? result : result.data; + return isUndefined(_response) ? response : _response; }); }); }); @@ -1141,7 +803,7 @@ addHiddenPropsToTarget(MongoDBAdapter.prototype, { */ destroy: function destroy(mapper, id, opts) { var self = this; - var op = undefined; + var op = void 0; opts || (opts = {}); var removeOpts = self.getOpt('removeOpts', opts); @@ -1159,17 +821,16 @@ addHiddenPropsToTarget(MongoDBAdapter.prototype, { }); }); }).then(function (cursor) { + cursor.connection = undefined; + var response = new Adapter.Response(undefined, cursor, 'destroy'); + response = self.respond(response, opts); + // afterDestroy lifecycle hook op = opts.op = 'afterDestroy'; - return resolve(self[op](mapper, id, opts, cursor)).then(function (_cursor) { + return resolve(self[op](mapper, id, opts, response)).then(function (_response) { // Allow for re-assignment from lifecycle hook - return isUndefined(_cursor) ? cursor : _cursor; + return isUndefined(_response) ? response : _response; }); - }).then(function (cursor) { - if (cursor) { - delete cursor.connection; - } - return self.getOpt('raw', opts) ? cursor : undefined; }); }, @@ -1189,7 +850,7 @@ addHiddenPropsToTarget(MongoDBAdapter.prototype, { */ destroyAll: function destroyAll(mapper, query, opts) { var self = this; - var op = undefined; + var op = void 0; query || (query = {}); opts || (opts = {}); var removeOpts = self.getOpt('removeOpts', opts); @@ -1208,17 +869,16 @@ addHiddenPropsToTarget(MongoDBAdapter.prototype, { }); }); }).then(function (cursor) { + cursor.connection = undefined; + var response = new Adapter.Response(undefined, cursor, 'destroyAll'); + response = self.respond(response, opts); + // afterDestroyAll lifecycle hook op = opts.op = 'afterDestroyAll'; - return resolve(self[op](mapper, query, opts, cursor)).then(function (_cursor) { + return resolve(self[op](mapper, query, opts, response)).then(function (_response) { // Allow for re-assignment from lifecycle hook - return isUndefined(_cursor) ? cursor : _cursor; + return isUndefined(_response) ? response : _response; }); - }).then(function (cursor) { - if (cursor) { - delete cursor.connection; - } - return self.getOpt('raw', opts) ? cursor : undefined; }); }, @@ -1241,7 +901,7 @@ addHiddenPropsToTarget(MongoDBAdapter.prototype, { var self = this; props || (props = {}); opts || (opts = {}); - var op = undefined; + var op = void 0; var updateOpts = self.getOpt('updateOpts', opts); return self.find(mapper, id, { raw: false }).then(function (record) { @@ -1253,7 +913,8 @@ addHiddenPropsToTarget(MongoDBAdapter.prototype, { return resolve(self[op](mapper, id, props, opts)); }).then(function (_props) { // Allow for re-assignment from lifecycle hook - _props = isUndefined(_props) ? props : _props; + props = isUndefined(_props) ? props : _props; + _props = withoutRelations(mapper, props); return self.getClient().then(function (client) { return new Promise(function (resolve, reject) { var mongoQuery = {}; @@ -1265,20 +926,17 @@ addHiddenPropsToTarget(MongoDBAdapter.prototype, { }); }); }).then(function (cursor) { - if (cursor) { - delete cursor.connection; - } return self.find(mapper, id, { raw: false }).then(function (record) { + cursor.connection = undefined; + var response = new Adapter.Response(record, cursor, 'update'); + response.updated = 1; + response = self.respond(response, opts); + // afterUpdate lifecycle hook op = opts.op = 'afterUpdate'; - return resolve(self[op](mapper, id, props, opts, record)).then(function (_record) { + return resolve(self[op](mapper, id, props, opts, response)).then(function (_response) { // Allow for re-assignment from lifecycle hook - record = isUndefined(_record) ? record : _record; - var result = {}; - fillIn(result, cursor); - result.data = record; - result.updated = record ? 1 : 0; - return self.getOpt('raw', opts) ? result : result.data; + return isUndefined(_response) ? response : _response; }); }); }); @@ -1304,19 +962,22 @@ addHiddenPropsToTarget(MongoDBAdapter.prototype, { props || (props = {}); query || (query = {}); opts || (opts = {}); - var op = undefined, - ids = undefined; + var op = void 0, + ids = void 0; var updateOpts = self.getOpt('updateOpts', opts); updateOpts.multi = true; return self.getClient().then(function (client) { var queryOptions = self.getQueryOptions(mapper, query); - queryOptions.$set = props; var mongoQuery = self.getQuery(mapper, query); // beforeUpdateAll lifecycle hook op = opts.op = 'beforeUpdateAll'; - return resolve(self[op](mapper, props, query, opts)).then(function () { + return resolve(self[op](mapper, props, query, opts)).then(function (_props) { + // Allow for re-assignment from lifecycle hook + props = isUndefined(_props) ? props : _props; + _props = withoutRelations(mapper, props); + queryOptions.$set = _props; return self.findAll(mapper, query, { raw: false }); }).then(function (records) { ids = records.map(function (record) { @@ -1330,24 +991,21 @@ addHiddenPropsToTarget(MongoDBAdapter.prototype, { }); }); }).then(function (cursor) { - if (cursor) { - delete cursor.connection; - } var query = {}; query[mapper.idAttribute] = { 'in': ids }; return self.findAll(mapper, query, { raw: false }).then(function (records) { + cursor.connection = undefined; + var response = new Adapter.Response(records, cursor, 'update'); + response.updated = records.length; + response = self.respond(response, opts); + // afterUpdateAll lifecycle hook op = opts.op = 'afterUpdateAll'; - return self[op](mapper, props, query, opts, records).then(function (_records) { + return resolve(self[op](mapper, props, query, opts, response)).then(function (_response) { // Allow for re-assignment from lifecycle hook - records = isUndefined(_records) ? records : _records; - var result = {}; - fillIn(result, cursor); - result.data = records; - result.updated = records.length; - return self.getOpt('raw', opts) ? result : result.data; + return isUndefined(_response) ? response : _response; }); }); }); diff --git a/dist/js-data-mongodb.js.map b/dist/js-data-mongodb.js.map index 9a0d405..2e19426 100644 --- a/dist/js-data-mongodb.js.map +++ b/dist/js-data-mongodb.js.map @@ -1 +1 @@ -{"version":3,"file":"js-data-mongodb.js","sources":["../src/index.js"],"sourcesContent":["import {MongoClient} from 'mongodb'\nimport {ObjectID} from 'bson'\nimport {utils} from 'js-data'\nimport underscore from 'mout/string/underscore'\n\nconst {\n addHiddenPropsToTarget,\n fillIn,\n forEachRelation,\n forOwn,\n get,\n isArray,\n isObject,\n isString,\n isUndefined,\n plainCopy,\n resolve\n} = utils\n\nconst reserved = [\n 'orderBy',\n 'sort',\n 'limit',\n 'offset',\n 'skip',\n 'where'\n]\n\nfunction unique (array) {\n const seen = {}\n const final = []\n array.forEach(function (item) {\n if (item in seen) {\n return\n }\n final.push(item)\n seen[item] = 0\n })\n return final\n}\n\nconst noop = function (...args) {\n const self = this\n const opts = args[args.length - 1]\n self.dbg(opts.op, ...args)\n return resolve()\n}\n\nconst noop2 = function (...args) {\n const self = this\n const opts = args[args.length - 2]\n self.dbg(opts.op, ...args)\n return resolve()\n}\n\nconst DEFAULTS = {\n /**\n * Whether to log debugging information.\n *\n * @name MongoDBAdapter#debug\n * @type {boolean}\n * @default false\n */\n debug: false,\n\n /**\n * Whether to return detailed result objects instead of just record data.\n *\n * @name MongoDBAdapter#raw\n * @type {boolean}\n * @default false\n */\n raw: false,\n\n /**\n * Convert ObjectIDs to strings when pulling records out of the database.\n *\n * @name MongoDBAdapter#translateId\n * @type {boolean}\n * @default true\n */\n translateId: true,\n\n /**\n * MongoDB URI.\n *\n * @name MongoDBAdapter#uri\n * @type {string}\n * @default mongodb://localhost:27017\n */\n uri: 'mongodb://localhost:27017'\n}\n\nconst FIND_OPTS_DEFAULTS = {}\nconst FIND_ONE_OPTS_DEFAULTS = {}\nconst INSERT_OPTS_DEFAULTS = {}\nconst INSERT_MANY_OPTS_DEFAULTS = {}\nconst UPDATE_OPTS_DEFAULTS = {}\nconst REMOVE_OPTS_DEFAULTS = {}\n\n/**\n * MongoDBAdapter class.\n *\n * @example\n * // Use Container instead of DataStore on the server\n * import {Container} from 'js-data'\n * import MongoDBAdapter from 'js-data-mongodb'\n *\n * // Create a store to hold your Mappers\n * const store = new Container({\n * mapperDefaults: {\n * // MongoDB uses \"_id\" as the primary key\n * idAttribute: '_id'\n * }\n * })\n *\n * // Create an instance of MongoDBAdapter with default settings\n * const adapter = new MongoDBAdapter()\n *\n * // Mappers in \"store\" will use the MongoDB adapter by default\n * store.registerAdapter('mongodb', adapter, { default: true })\n *\n * // Create a Mapper that maps to a \"user\" collection\n * store.defineMapper('user')\n *\n * @class MongoDBAdapter\n * @param {Object} [opts] Configuration opts.\n * @param {boolean} [opts.debug=false] Whether to log debugging information.\n * @param {Object} [opts.findOpts] Options to pass to collection#find.\n * @param {Object} [opts.findOneOpts] Options to pass to collection#findOne.\n * @param {Object} [opts.insertOpts] Options to pass to collection#insert.\n * @param {Object} [opts.insertManyOpts] Options to pass to\n * collection#insertMany.\n * @param {boolean} [opts.raw=false] Whether to return detailed result objects\n * instead of just record data.\n * @param {Object} [opts.removeOpts] Options to pass to collection#remove.\n * @param {boolean} [opts.translateId=true] Convert ObjectIDs to strings when\n * pulling records out of the database.\n * @param {Object} [opts.updateOpts] Options to pass to collection#update.\n * @param {string} [opts.uri=\"mongodb://localhost:27017\"] MongoDB URI.\n */\nexport default function MongoDBAdapter (opts) {\n const self = this\n opts || (opts = {})\n if (isString(opts)) {\n opts = { uri: opts }\n }\n fillIn(opts, DEFAULTS)\n fillIn(self, opts)\n\n /**\n * Default options to pass to collection#find.\n *\n * @name MongoDBAdapter#findOpts\n * @type {Object}\n * @default {}\n */\n self.findOpts || (self.findOpts = {})\n fillIn(self.findOpts, FIND_OPTS_DEFAULTS)\n\n /**\n * Default options to pass to collection#findOne.\n *\n * @name MongoDBAdapter#findOneOpts\n * @type {Object}\n * @default {}\n */\n self.findOneOpts || (self.findOneOpts = {})\n fillIn(self.findOneOpts, FIND_ONE_OPTS_DEFAULTS)\n\n /**\n * Default options to pass to collection#insert.\n *\n * @name MongoDBAdapter#insertOpts\n * @type {Object}\n * @default {}\n */\n self.insertOpts || (self.insertOpts = {})\n fillIn(self.insertOpts, INSERT_OPTS_DEFAULTS)\n\n /**\n * Default options to pass to collection#insertMany.\n *\n * @name MongoDBAdapter#insertManyOpts\n * @type {Object}\n * @default {}\n */\n self.insertManyOpts || (self.insertManyOpts = {})\n fillIn(self.insertManyOpts, INSERT_MANY_OPTS_DEFAULTS)\n\n /**\n * Default options to pass to collection#update.\n *\n * @name MongoDBAdapter#updateOpts\n * @type {Object}\n * @default {}\n */\n self.updateOpts || (self.updateOpts = {})\n fillIn(self.updateOpts, UPDATE_OPTS_DEFAULTS)\n\n /**\n * Default options to pass to collection#update.\n *\n * @name MongoDBAdapter#removeOpts\n * @type {Object}\n * @default {}\n */\n self.removeOpts || (self.removeOpts = {})\n fillIn(self.removeOpts, REMOVE_OPTS_DEFAULTS)\n\n /**\n * A Promise that resolves to a reference to the MongoDB client being used by\n * this adapter.\n *\n * @name MongoDBAdapter#client\n * @type {Object}\n */\n self.client = new Promise(function (resolve, reject) {\n MongoClient.connect(opts.uri, function (err, db) {\n return err ? reject(err) : resolve(db)\n })\n })\n}\n\naddHiddenPropsToTarget(MongoDBAdapter.prototype, {\n /**\n * Translate ObjectIDs to strings.\n *\n * @name MongoDBAdapter#_translateId\n * @method\n * @return {*}\n */\n _translateId (r, opts) {\n opts || (opts = {})\n if (this.getOpt('translateId', opts)) {\n if (isArray(r)) {\n r.forEach(function (_r) {\n const __id = _r._id ? _r._id.toString() : _r._id\n _r._id = typeof __id === 'string' ? __id : _r._id\n })\n } else if (isObject(r)) {\n const __id = r._id ? r._id.toString() : r._id\n r._id = typeof __id === 'string' ? __id : r._id\n }\n }\n return r\n },\n\n /**\n * @name MongoDBAdapter#afterCreate\n * @method\n */\n afterCreate: noop2,\n\n /**\n * @name MongoDBAdapter#afterCreateMany\n * @method\n */\n afterCreateMany: noop2,\n\n /**\n * @name MongoDBAdapter#afterDestroy\n * @method\n */\n afterDestroy: noop2,\n\n /**\n * @name MongoDBAdapter#afterDestroyAll\n * @method\n */\n afterDestroyAll: noop2,\n\n /**\n * @name MongoDBAdapter#afterFind\n * @method\n */\n afterFind: noop2,\n\n /**\n * @name MongoDBAdapter#afterFindAll\n * @method\n */\n afterFindAll: noop2,\n\n /**\n * @name MongoDBAdapter#afterUpdate\n * @method\n */\n afterUpdate: noop2,\n\n /**\n * @name MongoDBAdapter#afterUpdateAll\n * @method\n */\n afterUpdateAll: noop2,\n\n /**\n * @name MongoDBAdapter#afterUpdateMany\n * @method\n */\n afterUpdateMany: noop2,\n\n /**\n * @name MongoDBAdapter#beforeCreate\n * @method\n */\n beforeCreate: noop,\n\n /**\n * @name MongoDBAdapter#beforeCreateMany\n * @method\n */\n beforeCreateMany: noop,\n\n /**\n * @name MongoDBAdapter#beforeDestroy\n * @method\n */\n beforeDestroy: noop,\n\n /**\n * @name MongoDBAdapter#beforeDestroyAll\n * @method\n */\n beforeDestroyAll: noop,\n\n /**\n * @name MongoDBAdapter#beforeFind\n * @method\n */\n beforeFind: noop,\n\n /**\n * @name MongoDBAdapter#beforeFindAll\n * @method\n */\n beforeFindAll: noop,\n\n /**\n * @name MongoDBAdapter#beforeUpdate\n * @method\n */\n beforeUpdate: noop,\n\n /**\n * @name MongoDBAdapter#beforeUpdateAll\n * @method\n */\n beforeUpdateAll: noop,\n\n /**\n * @name MongoDBAdapter#beforeUpdateMany\n * @method\n */\n beforeUpdateMany: noop,\n\n /**\n * @name MongoDBAdapter#dbg\n * @method\n */\n dbg (...args) {\n this.log('debug', ...args)\n },\n\n /**\n * Return a Promise that resolves to a reference to the MongoDB client being\n * used by this adapter.\n *\n * Useful when you need to do anything custom with the MongoDB client library.\n *\n * @name MongoDBAdapter#getClient\n * @method\n * @return {Object} MongoDB client.\n */\n getClient () {\n return this.client\n },\n\n /**\n * Map filtering params in a selection query to MongoDB a filtering object.\n *\n * Handles the following:\n *\n * - where\n * - and bunch of filtering operators\n *\n * @name MongoDBAdapter#getQuery\n * @method\n * @return {Object}\n */\n getQuery (mapper, query) {\n query = plainCopy(query || {})\n query.where || (query.where = {})\n\n forOwn(query, function (config, keyword) {\n if (reserved.indexOf(keyword) === -1) {\n if (isObject(config)) {\n query.where[keyword] = config\n } else {\n query.where[keyword] = {\n '==': config\n }\n }\n delete query[keyword]\n }\n })\n\n let mongoQuery = {}\n\n if (Object.keys(query.where).length !== 0) {\n forOwn(query.where, function (criteria, field) {\n if (!isObject(criteria)) {\n query.where[field] = {\n '==': criteria\n }\n }\n forOwn(criteria, function (v, op) {\n if (op === '==' || op === '===' || op === 'contains') {\n mongoQuery[field] = v\n } else if (op === '!=' || op === '!==' || op === 'notContains') {\n mongoQuery[field] = mongoQuery[field] || {}\n mongoQuery[field].$ne = v\n } else if (op === '>') {\n mongoQuery[field] = mongoQuery[field] || {}\n mongoQuery[field].$gt = v\n } else if (op === '>=') {\n mongoQuery[field] = mongoQuery[field] || {}\n mongoQuery[field].$gte = v\n } else if (op === '<') {\n mongoQuery[field] = mongoQuery[field] || {}\n mongoQuery[field].$lt = v\n } else if (op === '<=') {\n mongoQuery[field] = mongoQuery[field] || {}\n mongoQuery[field].$lte = v\n } else if (op === 'in') {\n mongoQuery[field] = mongoQuery[field] || {}\n mongoQuery[field].$in = v\n } else if (op === 'notIn') {\n mongoQuery[field] = mongoQuery[field] || {}\n mongoQuery[field].$nin = v\n } else if (op === '|==' || op === '|===' || op === '|contains') {\n mongoQuery.$or = mongoQuery.$or || []\n let orEqQuery = {}\n orEqQuery[field] = v\n mongoQuery.$or.push(orEqQuery)\n } else if (op === '|!=' || op === '|!==' || op === '|notContains') {\n mongoQuery.$or = mongoQuery.$or || []\n let orNeQuery = {}\n orNeQuery[field] = {\n '$ne': v\n }\n mongoQuery.$or.push(orNeQuery)\n } else if (op === '|>') {\n mongoQuery.$or = mongoQuery.$or || []\n let orGtQuery = {}\n orGtQuery[field] = {\n '$gt': v\n }\n mongoQuery.$or.push(orGtQuery)\n } else if (op === '|>=') {\n mongoQuery.$or = mongoQuery.$or || []\n let orGteQuery = {}\n orGteQuery[field] = {\n '$gte': v\n }\n mongoQuery.$or.push(orGteQuery)\n } else if (op === '|<') {\n mongoQuery.$or = mongoQuery.$or || []\n let orLtQuery = {}\n orLtQuery[field] = {\n '$lt': v\n }\n mongoQuery.$or.push(orLtQuery)\n } else if (op === '|<=') {\n mongoQuery.$or = mongoQuery.$or || []\n let orLteQuery = {}\n orLteQuery[field] = {\n '$lte': v\n }\n mongoQuery.$or.push(orLteQuery)\n } else if (op === '|in') {\n mongoQuery.$or = mongoQuery.$or || []\n let orInQuery = {}\n orInQuery[field] = {\n '$in': v\n }\n mongoQuery.$or.push(orInQuery)\n } else if (op === '|notIn') {\n mongoQuery.$or = mongoQuery.$or || []\n let orNinQuery = {}\n orNinQuery[field] = {\n '$nin': v\n }\n mongoQuery.$or.push(orNinQuery)\n }\n })\n })\n }\n\n return mongoQuery\n },\n\n /**\n * Logging utility method.\n *\n * @name MongoDBAdapter#log\n * @method\n */\n log (level, ...args) {\n if (level && !args.length) {\n args.push(level)\n level = 'debug'\n }\n if (level === 'debug' && !this.debug) {\n return\n }\n const prefix = `${level.toUpperCase()}: (MongoDBAdapter)`\n if (console[level]) {\n console[level](prefix, ...args)\n } else {\n console.log(prefix, ...args)\n }\n },\n\n /**\n * Map non-filtering params in a selection query to MongoDB query options.\n *\n * Handles the following:\n *\n * - limit\n * - skip/offset\n * - orderBy/sort\n *\n * @name MongoDBAdapter#getQueryOptions\n * @method\n * @return {Object}\n */\n getQueryOptions (mapper, query) {\n query = plainCopy(query || {})\n query.orderBy = query.orderBy || query.sort\n query.skip = query.skip || query.offset\n\n let queryOptions = {}\n\n if (query.orderBy) {\n if (isString(query.orderBy)) {\n query.orderBy = [\n [query.orderBy, 'asc']\n ]\n }\n for (var i = 0; i < query.orderBy.length; i++) {\n if (isString(query.orderBy[i])) {\n query.orderBy[i] = [query.orderBy[i], 'asc']\n }\n }\n queryOptions.sort = query.orderBy\n }\n\n if (query.skip) {\n queryOptions.skip = +query.skip\n }\n\n if (query.limit) {\n queryOptions.limit = +query.limit\n }\n\n return queryOptions\n },\n\n /**\n * Resolve the value of the specified option based on the given options and\n * this adapter's settings.\n *\n * @name MongoDBAdapter#getOpt\n * @method\n * @param {string} opt The name of the option.\n * @param {Object} [opts] Configuration options.\n * @return {*} The value of the specified option.\n */\n getOpt (opt, opts) {\n opts || (opts = {})\n return isUndefined(opts[opt]) ? plainCopy(this[opt]) : plainCopy(opts[opt])\n },\n\n /**\n * Turn an _id into an ObjectID if it isn't already an ObjectID.\n *\n * @name MongoDBAdapter#toObjectID\n * @method\n * @return {*}\n */\n toObjectID (mapper, id) {\n if (id !== undefined && mapper.idAttribute === '_id' && typeof id === 'string' && ObjectID.isValid(id) && !(id instanceof ObjectID)) {\n return new ObjectID(id)\n }\n return id\n },\n\n /**\n * Return the foreignKey from the given record for the provided relationship.\n *\n * If the foreignKeys in your database are saved as ObjectIDs, then override\n * this method and change it to something like:\n *\n * ```\n * return this.toObjectID(mapper, this.constructor.prototype.makeHasManyForeignKey.call(this, mapper, def, record))\n * ```\n *\n * There may be other reasons why you may want to override this method, like\n * when the id of the parent doesn't exactly match up to the key on the child.\n *\n * @name MongoDBAdapter#makeHasManyForeignKey\n * @method\n * @return {*}\n */\n makeHasManyForeignKey (mapper, def, record) {\n return def.getForeignKey(record)\n },\n\n /**\n * Return the foreignKeys from the given record for the provided relationship.\n *\n * @name MongoDBAdapter#makeHasManyForeignKeys\n * @method\n * @return {*}\n */\n makeHasManyForeignKeys (mapper, def, record) {\n return get(record, mapper.idAttribute)\n },\n\n /**\n * Load a hasMany relationship.\n *\n * @name MongoDBAdapter#loadHasMany\n * @method\n * @return {Promise}\n */\n loadHasMany (mapper, def, records, __opts) {\n const self = this\n let singular = false\n\n if (isObject(records) && !isArray(records)) {\n singular = true\n records = [records]\n }\n const IDs = records.map(function (record) {\n return self.makeHasManyForeignKey(mapper, def, record)\n })\n const query = {}\n const criteria = query[def.foreignKey] = {}\n if (singular) {\n // more efficient query when we only have one record\n criteria['=='] = IDs[0]\n } else {\n criteria['in'] = IDs.filter(function (id) {\n return id\n })\n }\n return self.findAll(def.getRelation(), query, __opts).then(function (relatedItems) {\n records.forEach(function (record) {\n let attached = []\n // avoid unneccesary iteration when we only have one record\n if (singular) {\n attached = relatedItems\n } else {\n relatedItems.forEach(function (relatedItem) {\n if (get(relatedItem, def.foreignKey) === record[mapper.idAttribute]) {\n attached.push(relatedItem)\n }\n })\n }\n def.setLocalField(record, attached)\n })\n })\n },\n\n /**\n * Load a hasOne relationship.\n *\n * @name MongoDBAdapter#loadHasOne\n * @method\n * @return {Promise}\n */\n loadHasOne (mapper, def, records, __opts) {\n if (isObject(records) && !isArray(records)) {\n records = [records]\n }\n return this.loadHasMany(mapper, def, records, __opts).then(function () {\n records.forEach(function (record) {\n const relatedData = def.getLocalField(record)\n if (isArray(relatedData) && relatedData.length) {\n def.setLocalField(record, relatedData[0])\n }\n })\n })\n },\n\n /**\n * Return the foreignKey from the given record for the provided relationship.\n *\n * @name MongoDBAdapter#makeBelongsToForeignKey\n * @method\n * @return {*}\n */\n makeBelongsToForeignKey (mapper, def, record) {\n return this.toObjectID(def.getRelation(), def.getForeignKey(record))\n },\n\n /**\n * Load a belongsTo relationship.\n *\n * @name MongoDBAdapter#loadBelongsTo\n * @method\n * @return {Promise}\n */\n loadBelongsTo (mapper, def, records, __opts) {\n const self = this\n const relationDef = def.getRelation()\n\n if (isObject(records) && !isArray(records)) {\n const record = records\n return self.find(relationDef, self.makeBelongsToForeignKey(mapper, def, record), __opts).then(function (relatedItem) {\n def.setLocalField(record, relatedItem)\n })\n } else {\n const keys = records.map(function (record) {\n return self.makeBelongsToForeignKey(mapper, def, record)\n }).filter(function (key) {\n return key\n })\n return self.findAll(relationDef, {\n where: {\n [relationDef.idAttribute]: {\n 'in': keys\n }\n }\n }, __opts).then(function (relatedItems) {\n records.forEach(function (record) {\n relatedItems.forEach(function (relatedItem) {\n if (relatedItem[relationDef.idAttribute] === record[def.foreignKey]) {\n def.setLocalField(record, relatedItem)\n }\n })\n })\n })\n }\n },\n\n /**\n * Retrieve the record with the given primary key.\n *\n * @name MongoDBAdapter#find\n * @method\n * @param {Object} mapper The mapper.\n * @param {(string|number)} id Primary key of the record to retrieve.\n * @param {Object} [opts] Configuration options.\n * @param {Object} [opts.findOneOpts] Options to pass to collection#findOne.\n * @param {boolean} [opts.raw=false] Whether to return a more detailed\n * response object.\n * @param {string[]} [opts.with=[]] Relations to eager load.\n * @return {Promise}\n */\n find (mapper, id, opts) {\n const self = this\n let record, op\n opts || (opts = {})\n opts.with || (opts.with = [])\n\n const findOneOpts = self.getOpt('findOneOpts', opts)\n findOneOpts.fields || (findOneOpts.fields = {})\n\n return self.getClient().then(function (client) {\n // beforeFind lifecycle hook\n op = opts.op = 'beforeFind'\n return resolve(self[op](mapper, id, opts)).then(function () {\n return new Promise(function (resolve, reject) {\n let mongoQuery = {}\n mongoQuery[mapper.idAttribute] = self.toObjectID(mapper, id)\n client.collection(mapper.table || underscore(mapper.name)).findOne(mongoQuery, findOneOpts, function (err, cursor) {\n return err ? reject(err) : resolve(cursor)\n })\n })\n })\n }).then(function (_record) {\n if (!_record) {\n return\n }\n record = _record\n self._translateId(record, opts)\n const tasks = []\n\n forEachRelation(mapper, opts, function (def, __opts) {\n const relatedMapper = def.getRelation()\n let task\n\n if (def.foreignKey && (def.type === 'hasOne' || def.type === 'hasMany')) {\n if (def.type === 'hasOne') {\n task = self.loadHasOne(mapper, def, record, __opts)\n } else {\n task = self.loadHasMany(mapper, def, record, __opts)\n }\n } else if (def.type === 'hasMany' && def.localKeys) {\n let localKeys = []\n let itemKeys = get(record, def.localKeys) || []\n itemKeys = isArray(itemKeys) ? itemKeys : Object.keys(itemKeys)\n localKeys = localKeys.concat(itemKeys)\n task = self.findAll(relatedMapper, {\n where: {\n [relatedMapper.idAttribute]: {\n 'in': unique(localKeys).filter(function (x) { return x }).map(function (x) { return self.toObjectID(relatedMapper, x) })\n }\n }\n }, __opts).then(function (relatedItems) {\n def.setLocalField(record, relatedItems)\n })\n } else if (def.type === 'hasMany' && def.foreignKeys) {\n task = self.findAll(relatedMapper, {\n where: {\n [def.foreignKeys]: {\n 'contains': self.makeHasManyForeignKeys(mapper, def, record)\n }\n }\n }, __opts).then(function (relatedItems) {\n def.setLocalField(record, relatedItems)\n })\n } else if (def.type === 'belongsTo') {\n task = self.loadBelongsTo(mapper, def, record, __opts)\n }\n if (task) {\n tasks.push(task)\n }\n })\n\n return Promise.all(tasks)\n }).then(function () {\n // afterFind lifecycle hook\n op = opts.op = 'afterFind'\n return resolve(self[op](mapper, id, opts, record)).then(function (_record) {\n // Allow for re-assignment from lifecycle hook\n record = isUndefined(_record) ? record : _record\n return self.getOpt('raw', opts) ? {\n data: record,\n found: record ? 1 : 0\n } : record\n })\n })\n },\n\n /**\n * Retrieve the records that match the selection query.\n *\n * @name MongoDBAdapter#findAll\n * @method\n * @param {Object} mapper The mapper.\n * @param {Object} query Selection query.\n * @param {Object} [opts] Configuration options.\n * @param {Object} [opts.findOpts] Options to pass to collection#find.\n * @param {boolean} [opts.raw=false] Whether to return a more detailed\n * response object.\n * @param {string[]} [opts.with=[]] Relations to eager load.\n * @return {Promise}\n */\n findAll (mapper, query, opts) {\n const self = this\n opts || (opts = {})\n opts.with || (opts.with = [])\n\n let records = []\n let op\n const findOpts = self.getOpt('findOpts', opts)\n fillIn(findOpts, self.getQueryOptions(mapper, query))\n findOpts.fields || (findOpts.fields = {})\n const mongoQuery = self.getQuery(mapper, query)\n\n return self.getClient().then(function (client) {\n // beforeFindAll lifecycle hook\n op = opts.op = 'beforeFindAll'\n return resolve(self[op](mapper, query, opts)).then(function () {\n return new Promise(function (resolve, reject) {\n client.collection(mapper.table || underscore(mapper.name)).find(mongoQuery, findOpts).toArray(function (err, cursor) {\n return err ? reject(err) : resolve(cursor)\n })\n })\n })\n }).then(function (_records) {\n records = _records\n self._translateId(records, opts)\n const tasks = []\n forEachRelation(mapper, opts, function (def, __opts) {\n const relatedMapper = def.getRelation()\n let task\n if (def.foreignKey && (def.type === 'hasOne' || def.type === 'hasMany')) {\n if (def.type === 'hasMany') {\n task = self.loadHasMany(mapper, def, records, __opts)\n } else {\n task = self.loadHasOne(mapper, def, records, __opts)\n }\n } else if (def.type === 'hasMany' && def.localKeys) {\n let localKeys = []\n records.forEach(function (item) {\n let itemKeys = item[def.localKeys] || []\n itemKeys = isArray(itemKeys) ? itemKeys : Object.keys(itemKeys)\n localKeys = localKeys.concat(itemKeys)\n })\n task = self.findAll(relatedMapper, {\n where: {\n [relatedMapper.idAttribute]: {\n 'in': unique(localKeys).filter(function (x) { return x }).map(function (x) { return self.toObjectID(relatedMapper, x) })\n }\n }\n }, __opts).then(function (relatedItems) {\n records.forEach(function (item) {\n let attached = []\n let itemKeys = get(item, def.localKeys) || []\n itemKeys = isArray(itemKeys) ? itemKeys : Object.keys(itemKeys)\n relatedItems.forEach(function (relatedItem) {\n if (itemKeys && itemKeys.indexOf(relatedItem[relatedMapper.idAttribute]) !== -1) {\n attached.push(relatedItem)\n }\n })\n def.setLocalField(item, attached)\n })\n return relatedItems\n })\n } else if (def.type === 'hasMany' && def.foreignKeys) {\n throw new Error('findAll eager load hasMany foreignKeys not supported!')\n } else if (def.type === 'belongsTo') {\n task = self.loadBelongsTo(mapper, def, records, __opts)\n }\n if (task) {\n tasks.push(task)\n }\n })\n return Promise.all(tasks)\n }).then(function () {\n // afterFindAll lifecycle hook\n op = opts.op = 'afterFindAll'\n return resolve(self[op](mapper, query, opts, records)).then(function (_records) {\n // Allow for re-assignment from lifecycle hook\n records = isUndefined(_records) ? records : _records\n return self.getOpt('raw', opts) ? {\n data: records,\n found: records.length\n } : records\n })\n })\n },\n\n /**\n * Create a new record.\n *\n * @name MongoDBAdapter#create\n * @method\n * @param {Object} mapper The mapper.\n * @param {Object} props The record to be created.\n * @param {Object} [opts] Configuration options.\n * @param {Object} [opts.insertOpts] Options to pass to collection#insert.\n * @param {boolean} [opts.raw=false] Whether to return a more detailed\n * response object.\n * @return {Promise}\n */\n create (mapper, props, opts) {\n const self = this\n let op\n props || (props = {})\n opts || (opts = {})\n\n const insertOpts = self.getOpt('insertOpts', opts)\n\n return self.getClient().then(function (client) {\n // beforeCreate lifecycle hook\n op = opts.op = 'beforeCreate'\n return resolve(self[op](mapper, props, opts)).then(function (_props) {\n // Allow for re-assignment from lifecycle hook\n _props = isUndefined(_props) ? props : _props\n return new Promise(function (resolve, reject) {\n const collection = client.collection(mapper.table || underscore(mapper.name))\n const method = collection.insertOne ? 'insertOne' : 'insert'\n collection[method](_props, insertOpts, function (err, cursor) {\n return err ? reject(err) : resolve(cursor)\n })\n })\n }).then(function (cursor) {\n let record\n let r = cursor.ops ? cursor.ops : cursor\n self._translateId(r, opts)\n record = isArray(r) ? r[0] : r\n\n // afterCreate lifecycle hook\n op = opts.op = 'afterCreate'\n return self[op](mapper, props, opts, record).then(function (_record) {\n // Allow for re-assignment from lifecycle hook\n record = isUndefined(_record) ? record : _record\n const result = {}\n fillIn(result, cursor)\n delete result.connection\n result.data = record\n result.created = record ? 1 : 0\n return self.getOpt('raw', opts) ? result : result.data\n })\n })\n })\n },\n\n /**\n * Create multiple records in a single batch.\n *\n * @name MongoDBAdapter#createMany\n * @method\n * @param {Object} mapper The mapper.\n * @param {Object} props The records to be created.\n * @param {Object} [opts] Configuration options.\n * @param {Object} [opts.insertManyOpts] Options to pass to\n * collection#insertMany.\n * @param {boolean} [opts.raw=false] Whether to return a more detailed\n * response object.\n * @return {Promise}\n */\n createMany (mapper, props, opts) {\n const self = this\n let op\n props || (props = {})\n opts || (opts = {})\n\n const insertManyOpts = self.getOpt('insertManyOpts', opts)\n\n return self.getClient().then(function (client) {\n // beforeCreateMany lifecycle hook\n op = opts.op = 'beforeCreateMany'\n return resolve(self[op](mapper, props, opts)).then(function (_props) {\n // Allow for re-assignment from lifecycle hook\n _props = isUndefined(_props) ? props : _props\n return new Promise(function (resolve, reject) {\n const collection = client.collection(mapper.table || underscore(mapper.name))\n collection.insertMany(_props, insertManyOpts, function (err, cursor) {\n return err ? reject(err) : resolve(cursor)\n })\n })\n }).then(function (cursor) {\n let records\n let r = cursor.ops ? cursor.ops : cursor\n self._translateId(r, opts)\n records = r\n\n // afterCreateMany lifecycle hook\n op = opts.op = 'afterCreateMany'\n return self[op](mapper, props, opts, records).then(function (_records) {\n // Allow for re-assignment from lifecycle hook\n records = isUndefined(_records) ? records : _records\n const result = {}\n fillIn(result, cursor)\n delete result.connection\n result.data = records\n result.created = records.length\n return self.getOpt('raw', opts) ? result : result.data\n })\n })\n })\n },\n\n /**\n * Destroy the record with the given primary key.\n *\n * @name MongoDBAdapter#destroy\n * @method\n * @param {Object} mapper The mapper.\n * @param {(string|number)} id Primary key of the record to destroy.\n * @param {Object} [opts] Configuration options.\n * @param {boolean} [opts.raw=false] Whether to return a more detailed\n * response object.\n * @param {Object} [opts.removeOpts] Options to pass to collection#remove.\n * @return {Promise}\n */\n destroy (mapper, id, opts) {\n const self = this\n let op\n opts || (opts = {})\n const removeOpts = self.getOpt('removeOpts', opts)\n\n return self.getClient().then(function (client) {\n // beforeDestroy lifecycle hook\n op = opts.op = 'beforeDestroy'\n return resolve(self[op](mapper, id, opts)).then(function () {\n return new Promise(function (resolve, reject) {\n const mongoQuery = {}\n mongoQuery[mapper.idAttribute] = self.toObjectID(mapper, id)\n const collection = client.collection(mapper.table || underscore(mapper.name))\n collection[collection.deleteOne ? 'deleteOne' : 'remove'](mongoQuery, removeOpts, function (err, cursor) {\n return err ? reject(err) : resolve(cursor)\n })\n })\n })\n }).then(function (cursor) {\n // afterDestroy lifecycle hook\n op = opts.op = 'afterDestroy'\n return resolve(self[op](mapper, id, opts, cursor)).then(function (_cursor) {\n // Allow for re-assignment from lifecycle hook\n return isUndefined(_cursor) ? cursor : _cursor\n })\n }).then(function (cursor) {\n if (cursor) {\n delete cursor.connection\n }\n return self.getOpt('raw', opts) ? cursor : undefined\n })\n },\n\n /**\n * Destroy the records that match the selection query.\n *\n * @name MongoDBAdapter#destroyAll\n * @method\n * @param {Object} mapper the mapper.\n * @param {Object} [query] Selection query.\n * @param {Object} [opts] Configuration options.\n * @param {boolean} [opts.raw=false] Whether to return a more detailed\n * response object.\n * @param {Object} [opts.removeOpts] Options to pass to collection#remove.\n * @return {Promise}\n */\n destroyAll (mapper, query, opts) {\n const self = this\n let op\n query || (query = {})\n opts || (opts = {})\n const removeOpts = self.getOpt('removeOpts', opts)\n fillIn(removeOpts, self.getQueryOptions(mapper, query))\n\n return self.getClient().then(function (client) {\n // beforeDestroyAll lifecycle hook\n op = opts.op = 'beforeDestroyAll'\n return resolve(self[op](mapper, query, opts)).then(function () {\n const mongoQuery = self.getQuery(mapper, query)\n return new Promise(function (resolve, reject) {\n const collection = client.collection(mapper.table || underscore(mapper.name))\n collection[collection.deleteMany ? 'deleteMany' : 'remove'](mongoQuery, removeOpts, function (err, cursor) {\n return err ? reject(err) : resolve(cursor)\n })\n })\n })\n }).then(function (cursor) {\n // afterDestroyAll lifecycle hook\n op = opts.op = 'afterDestroyAll'\n return resolve(self[op](mapper, query, opts, cursor)).then(function (_cursor) {\n // Allow for re-assignment from lifecycle hook\n return isUndefined(_cursor) ? cursor : _cursor\n })\n }).then(function (cursor) {\n if (cursor) {\n delete cursor.connection\n }\n return self.getOpt('raw', opts) ? cursor : undefined\n })\n },\n\n /**\n * Apply the given update to the record with the specified primary key.\n *\n * @name MongoDBAdapter#update\n * @method\n * @param {Object} mapper The mapper.\n * @param {(string|number)} id The primary key of the record to be updated.\n * @param {Object} props The update to apply to the record.\n * @param {Object} [opts] Configuration options.\n * @param {boolean} [opts.raw=false] Whether to return a more detailed\n * response object.\n * @param {Object} [opts.updateOpts] Options to pass to collection#update.\n * @return {Promise}\n */\n update (mapper, id, props, opts) {\n const self = this\n props || (props = {})\n opts || (opts = {})\n let op\n const updateOpts = self.getOpt('updateOpts', opts)\n\n return self.find(mapper, id, { raw: false }).then(function (record) {\n if (!record) {\n throw new Error('Not Found')\n }\n // beforeUpdate lifecycle hook\n op = opts.op = 'beforeUpdate'\n return resolve(self[op](mapper, id, props, opts))\n }).then(function (_props) {\n // Allow for re-assignment from lifecycle hook\n _props = isUndefined(_props) ? props : _props\n return self.getClient().then(function (client) {\n return new Promise(function (resolve, reject) {\n const mongoQuery = {}\n mongoQuery[mapper.idAttribute] = self.toObjectID(mapper, id)\n const collection = client.collection(mapper.table || underscore(mapper.name))\n collection[collection.updateOne ? 'updateOne' : 'update'](mongoQuery, { $set: _props }, updateOpts, function (err, cursor) {\n return err ? reject(err) : resolve(cursor)\n })\n })\n })\n }).then(function (cursor) {\n if (cursor) {\n delete cursor.connection\n }\n return self.find(mapper, id, { raw: false }).then(function (record) {\n // afterUpdate lifecycle hook\n op = opts.op = 'afterUpdate'\n return resolve(self[op](mapper, id, props, opts, record)).then(function (_record) {\n // Allow for re-assignment from lifecycle hook\n record = isUndefined(_record) ? record : _record\n const result = {}\n fillIn(result, cursor)\n result.data = record\n result.updated = record ? 1 : 0\n return self.getOpt('raw', opts) ? result : result.data\n })\n })\n })\n },\n\n /**\n * Apply the given update to all records that match the selection query.\n *\n * @name MongoDBAdapter#updateAll\n * @method\n * @param {Object} mapper The mapper.\n * @param {Object} props The update to apply to the selected records.\n * @param {Object} [query] Selection query.\n * @param {Object} [opts] Configuration options.\n * @param {boolean} [opts.raw=false] Whether to return a more detailed\n * response object.\n * @param {Object} [opts.updateOpts] Options to pass to collection#update.\n * @return {Promise}\n */\n updateAll (mapper, props, query, opts) {\n const self = this\n props || (props = {})\n query || (query = {})\n opts || (opts = {})\n let op, ids\n const updateOpts = self.getOpt('updateOpts', opts)\n updateOpts.multi = true\n\n return self.getClient().then(function (client) {\n const queryOptions = self.getQueryOptions(mapper, query)\n queryOptions.$set = props\n const mongoQuery = self.getQuery(mapper, query)\n\n // beforeUpdateAll lifecycle hook\n op = opts.op = 'beforeUpdateAll'\n return resolve(self[op](mapper, props, query, opts)).then(function () {\n return self.findAll(mapper, query, { raw: false })\n }).then(function (records) {\n ids = records.map(function (record) {\n return self.toObjectID(mapper, record[mapper.idAttribute])\n })\n\n return new Promise(function (resolve, reject) {\n const collection = client.collection(mapper.table || underscore(mapper.name))\n collection[collection.updateMany ? 'updateMany' : 'update'](mongoQuery, queryOptions, updateOpts, function (err, cursor) {\n return err ? reject(err) : resolve(cursor)\n })\n })\n }).then(function (cursor) {\n if (cursor) {\n delete cursor.connection\n }\n const query = {}\n query[mapper.idAttribute] = {\n 'in': ids\n }\n return self.findAll(mapper, query, { raw: false }).then(function (records) {\n // afterUpdateAll lifecycle hook\n op = opts.op = 'afterUpdateAll'\n return self[op](mapper, props, query, opts, records).then(function (_records) {\n // Allow for re-assignment from lifecycle hook\n records = isUndefined(_records) ? records : _records\n const result = {}\n fillIn(result, cursor)\n result.data = records\n result.updated = records.length\n return self.getOpt('raw', opts) ? result : result.data\n })\n })\n })\n })\n },\n\n /**\n * Not supported.\n *\n * @name MongoDBAdapter#updateMany\n * @method\n */\n updateMany () {\n throw new Error('not supported!')\n }\n})\n"],"names":["utils","ObjectID"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"js-data-mongodb.js","sources":["../src/index.js"],"sourcesContent":["import {MongoClient} from 'mongodb'\nimport {ObjectID} from 'bson'\nimport {utils} from 'js-data'\nimport Adapter from 'js-data-adapter'\nimport {\n reserved,\n Response\n} from 'js-data-adapter'\nimport underscore from 'mout/string/underscore'\nimport unique from 'mout/array/unique'\n\nconst {\n addHiddenPropsToTarget,\n classCallCheck,\n extend,\n fillIn,\n forEachRelation,\n forOwn,\n get,\n isArray,\n isObject,\n isString,\n isUndefined,\n omit,\n plainCopy,\n resolve\n} = utils\n\nconst withoutRelations = function (mapper, props) {\n return omit(props, mapper.relationFields || [])\n}\n\nconst DEFAULTS = {\n /**\n * Convert ObjectIDs to strings when pulling records out of the database.\n *\n * @name MongoDBAdapter#translateId\n * @type {boolean}\n * @default true\n */\n translateId: true,\n\n /**\n * MongoDB URI.\n *\n * @name MongoDBAdapter#uri\n * @type {string}\n * @default mongodb://localhost:27017\n */\n uri: 'mongodb://localhost:27017'\n}\n\nconst FIND_OPTS_DEFAULTS = {}\nconst FIND_ONE_OPTS_DEFAULTS = {}\nconst INSERT_OPTS_DEFAULTS = {}\nconst INSERT_MANY_OPTS_DEFAULTS = {}\nconst UPDATE_OPTS_DEFAULTS = {}\nconst REMOVE_OPTS_DEFAULTS = {}\n\n/**\n * MongoDBAdapter class.\n *\n * @example\n * // Use Container instead of DataStore on the server\n * import {Container} from 'js-data'\n * import MongoDBAdapter from 'js-data-mongodb'\n *\n * // Create a store to hold your Mappers\n * const store = new Container({\n * mapperDefaults: {\n * // MongoDB uses \"_id\" as the primary key\n * idAttribute: '_id'\n * }\n * })\n *\n * // Create an instance of MongoDBAdapter with default settings\n * const adapter = new MongoDBAdapter()\n *\n * // Mappers in \"store\" will use the MongoDB adapter by default\n * store.registerAdapter('mongodb', adapter, { default: true })\n *\n * // Create a Mapper that maps to a \"user\" collection\n * store.defineMapper('user')\n *\n * @class MongoDBAdapter\n * @param {Object} [opts] Configuration opts.\n * @param {boolean} [opts.debug=false] Whether to log debugging information.\n * @param {Object} [opts.findOpts] Options to pass to collection#find.\n * @param {Object} [opts.findOneOpts] Options to pass to collection#findOne.\n * @param {Object} [opts.insertOpts] Options to pass to collection#insert.\n * @param {Object} [opts.insertManyOpts] Options to pass to\n * collection#insertMany.\n * @param {boolean} [opts.raw=false] Whether to return detailed result objects\n * instead of just record data.\n * @param {Object} [opts.removeOpts] Options to pass to collection#remove.\n * @param {boolean} [opts.translateId=true] Convert ObjectIDs to strings when\n * pulling records out of the database.\n * @param {Object} [opts.updateOpts] Options to pass to collection#update.\n * @param {string} [opts.uri=\"mongodb://localhost:27017\"] MongoDB URI.\n */\nexport default function MongoDBAdapter (opts) {\n const self = this\n classCallCheck(self, MongoDBAdapter)\n opts || (opts = {})\n if (isString(opts)) {\n opts = { uri: opts }\n }\n fillIn(opts, DEFAULTS)\n Adapter.call(self, opts)\n\n /**\n * Default options to pass to collection#find.\n *\n * @name MongoDBAdapter#findOpts\n * @type {Object}\n * @default {}\n */\n self.findOpts || (self.findOpts = {})\n fillIn(self.findOpts, FIND_OPTS_DEFAULTS)\n\n /**\n * Default options to pass to collection#findOne.\n *\n * @name MongoDBAdapter#findOneOpts\n * @type {Object}\n * @default {}\n */\n self.findOneOpts || (self.findOneOpts = {})\n fillIn(self.findOneOpts, FIND_ONE_OPTS_DEFAULTS)\n\n /**\n * Default options to pass to collection#insert.\n *\n * @name MongoDBAdapter#insertOpts\n * @type {Object}\n * @default {}\n */\n self.insertOpts || (self.insertOpts = {})\n fillIn(self.insertOpts, INSERT_OPTS_DEFAULTS)\n\n /**\n * Default options to pass to collection#insertMany.\n *\n * @name MongoDBAdapter#insertManyOpts\n * @type {Object}\n * @default {}\n */\n self.insertManyOpts || (self.insertManyOpts = {})\n fillIn(self.insertManyOpts, INSERT_MANY_OPTS_DEFAULTS)\n\n /**\n * Default options to pass to collection#update.\n *\n * @name MongoDBAdapter#updateOpts\n * @type {Object}\n * @default {}\n */\n self.updateOpts || (self.updateOpts = {})\n fillIn(self.updateOpts, UPDATE_OPTS_DEFAULTS)\n\n /**\n * Default options to pass to collection#update.\n *\n * @name MongoDBAdapter#removeOpts\n * @type {Object}\n * @default {}\n */\n self.removeOpts || (self.removeOpts = {})\n fillIn(self.removeOpts, REMOVE_OPTS_DEFAULTS)\n\n /**\n * A Promise that resolves to a reference to the MongoDB client being used by\n * this adapter.\n *\n * @name MongoDBAdapter#client\n * @type {Object}\n */\n self.client = new Promise(function (resolve, reject) {\n MongoClient.connect(opts.uri, function (err, db) {\n return err ? reject(err) : resolve(db)\n })\n })\n}\n\n// Setup prototype inheritance from Adapter\nMongoDBAdapter.prototype = Object.create(Adapter.prototype, {\n constructor: {\n value: MongoDBAdapter,\n enumerable: false,\n writable: true,\n configurable: true\n }\n})\n\nObject.defineProperty(MongoDBAdapter, '__super__', {\n configurable: true,\n value: Adapter\n})\n\n/**\n * Alternative to ES6 class syntax for extending `MongoDBAdapter`.\n *\n * @name MongoDBAdapter.extend\n * @method\n * @param {Object} [instanceProps] Properties that will be added to the\n * prototype of the MongoDBAdapter.\n * @param {Object} [classProps] Properties that will be added as static\n * properties to the MongoDBAdapter itself.\n * @return {Object} MongoDBAdapter of `MongoDBAdapter`.\n */\nMongoDBAdapter.extend = extend\n\naddHiddenPropsToTarget(MongoDBAdapter.prototype, {\n /**\n * Translate ObjectIDs to strings.\n *\n * @name MongoDBAdapter#_translateId\n * @method\n * @return {*}\n */\n _translateId (r, opts) {\n opts || (opts = {})\n if (this.getOpt('translateId', opts)) {\n if (isArray(r)) {\n r.forEach(function (_r) {\n const __id = _r._id ? _r._id.toString() : _r._id\n _r._id = typeof __id === 'string' ? __id : _r._id\n })\n } else if (isObject(r)) {\n const __id = r._id ? r._id.toString() : r._id\n r._id = typeof __id === 'string' ? __id : r._id\n }\n }\n return r\n },\n\n /**\n * Return a Promise that resolves to a reference to the MongoDB client being\n * used by this adapter.\n *\n * Useful when you need to do anything custom with the MongoDB client library.\n *\n * @name MongoDBAdapter#getClient\n * @method\n * @return {Object} MongoDB client.\n */\n getClient () {\n return this.client\n },\n\n /**\n * Map filtering params in a selection query to MongoDB a filtering object.\n *\n * Handles the following:\n *\n * - where\n * - and bunch of filtering operators\n *\n * @name MongoDBAdapter#getQuery\n * @method\n * @return {Object}\n */\n getQuery (mapper, query) {\n query = plainCopy(query || {})\n query.where || (query.where = {})\n\n forOwn(query, function (config, keyword) {\n if (reserved.indexOf(keyword) === -1) {\n if (isObject(config)) {\n query.where[keyword] = config\n } else {\n query.where[keyword] = {\n '==': config\n }\n }\n delete query[keyword]\n }\n })\n\n let mongoQuery = {}\n\n if (Object.keys(query.where).length !== 0) {\n forOwn(query.where, function (criteria, field) {\n if (!isObject(criteria)) {\n query.where[field] = {\n '==': criteria\n }\n }\n forOwn(criteria, function (v, op) {\n if (op === '==' || op === '===' || op === 'contains') {\n mongoQuery[field] = v\n } else if (op === '!=' || op === '!==' || op === 'notContains') {\n mongoQuery[field] = mongoQuery[field] || {}\n mongoQuery[field].$ne = v\n } else if (op === '>') {\n mongoQuery[field] = mongoQuery[field] || {}\n mongoQuery[field].$gt = v\n } else if (op === '>=') {\n mongoQuery[field] = mongoQuery[field] || {}\n mongoQuery[field].$gte = v\n } else if (op === '<') {\n mongoQuery[field] = mongoQuery[field] || {}\n mongoQuery[field].$lt = v\n } else if (op === '<=') {\n mongoQuery[field] = mongoQuery[field] || {}\n mongoQuery[field].$lte = v\n } else if (op === 'in') {\n mongoQuery[field] = mongoQuery[field] || {}\n mongoQuery[field].$in = v\n } else if (op === 'notIn') {\n mongoQuery[field] = mongoQuery[field] || {}\n mongoQuery[field].$nin = v\n } else if (op === '|==' || op === '|===' || op === '|contains') {\n mongoQuery.$or = mongoQuery.$or || []\n let orEqQuery = {}\n orEqQuery[field] = v\n mongoQuery.$or.push(orEqQuery)\n } else if (op === '|!=' || op === '|!==' || op === '|notContains') {\n mongoQuery.$or = mongoQuery.$or || []\n let orNeQuery = {}\n orNeQuery[field] = {\n '$ne': v\n }\n mongoQuery.$or.push(orNeQuery)\n } else if (op === '|>') {\n mongoQuery.$or = mongoQuery.$or || []\n let orGtQuery = {}\n orGtQuery[field] = {\n '$gt': v\n }\n mongoQuery.$or.push(orGtQuery)\n } else if (op === '|>=') {\n mongoQuery.$or = mongoQuery.$or || []\n let orGteQuery = {}\n orGteQuery[field] = {\n '$gte': v\n }\n mongoQuery.$or.push(orGteQuery)\n } else if (op === '|<') {\n mongoQuery.$or = mongoQuery.$or || []\n let orLtQuery = {}\n orLtQuery[field] = {\n '$lt': v\n }\n mongoQuery.$or.push(orLtQuery)\n } else if (op === '|<=') {\n mongoQuery.$or = mongoQuery.$or || []\n let orLteQuery = {}\n orLteQuery[field] = {\n '$lte': v\n }\n mongoQuery.$or.push(orLteQuery)\n } else if (op === '|in') {\n mongoQuery.$or = mongoQuery.$or || []\n let orInQuery = {}\n orInQuery[field] = {\n '$in': v\n }\n mongoQuery.$or.push(orInQuery)\n } else if (op === '|notIn') {\n mongoQuery.$or = mongoQuery.$or || []\n let orNinQuery = {}\n orNinQuery[field] = {\n '$nin': v\n }\n mongoQuery.$or.push(orNinQuery)\n }\n })\n })\n }\n\n return mongoQuery\n },\n\n /**\n * Map non-filtering params in a selection query to MongoDB query options.\n *\n * Handles the following:\n *\n * - limit\n * - skip/offset\n * - orderBy/sort\n *\n * @name MongoDBAdapter#getQueryOptions\n * @method\n * @return {Object}\n */\n getQueryOptions (mapper, query) {\n query = plainCopy(query || {})\n query.orderBy = query.orderBy || query.sort\n query.skip = query.skip || query.offset\n\n let queryOptions = {}\n\n if (query.orderBy) {\n if (isString(query.orderBy)) {\n query.orderBy = [\n [query.orderBy, 'asc']\n ]\n }\n for (var i = 0; i < query.orderBy.length; i++) {\n if (isString(query.orderBy[i])) {\n query.orderBy[i] = [query.orderBy[i], 'asc']\n }\n }\n queryOptions.sort = query.orderBy\n }\n\n if (query.skip) {\n queryOptions.skip = +query.skip\n }\n\n if (query.limit) {\n queryOptions.limit = +query.limit\n }\n\n return queryOptions\n },\n\n /**\n * Turn an _id into an ObjectID if it isn't already an ObjectID.\n *\n * @name MongoDBAdapter#toObjectID\n * @method\n * @return {*}\n */\n toObjectID (mapper, id) {\n if (id !== undefined && mapper.idAttribute === '_id' && typeof id === 'string' && ObjectID.isValid(id) && !(id instanceof ObjectID)) {\n return new ObjectID(id)\n }\n return id\n },\n\n /**\n * Return the foreignKey from the given record for the provided relationship.\n *\n * @name MongoDBAdapter#makeBelongsToForeignKey\n * @method\n * @return {*}\n */\n makeBelongsToForeignKey (mapper, def, record) {\n return this.toObjectID(def.getRelation(), Adapter.prototype.makeBelongsToForeignKey.call(this, mapper, def, record))\n },\n\n /**\n * Retrieve the record with the given primary key.\n *\n * @name MongoDBAdapter#find\n * @method\n * @param {Object} mapper The mapper.\n * @param {(string|number)} id Primary key of the record to retrieve.\n * @param {Object} [opts] Configuration options.\n * @param {Object} [opts.findOneOpts] Options to pass to collection#findOne.\n * @param {boolean} [opts.raw=false] Whether to return a more detailed\n * response object.\n * @param {string[]} [opts.with=[]] Relations to eager load.\n * @return {Promise}\n */\n find (mapper, id, opts) {\n const self = this\n let record, op\n opts || (opts = {})\n opts.with || (opts.with = [])\n\n const findOneOpts = self.getOpt('findOneOpts', opts)\n findOneOpts.fields || (findOneOpts.fields = {})\n\n return self.getClient().then(function (client) {\n // beforeFind lifecycle hook\n op = opts.op = 'beforeFind'\n return resolve(self[op](mapper, id, opts)).then(function () {\n return new Promise(function (resolve, reject) {\n let mongoQuery = {}\n mongoQuery[mapper.idAttribute] = self.toObjectID(mapper, id)\n client.collection(mapper.table || underscore(mapper.name)).findOne(mongoQuery, findOneOpts, function (err, cursor) {\n return err ? reject(err) : resolve(cursor)\n })\n })\n })\n }).then(function (_record) {\n if (!_record) {\n return\n }\n record = _record\n self._translateId(record, opts)\n const tasks = []\n\n forEachRelation(mapper, opts, function (def, __opts) {\n const relatedMapper = def.getRelation()\n let task\n\n if (def.foreignKey && (def.type === 'hasOne' || def.type === 'hasMany')) {\n if (def.type === 'hasOne') {\n task = self.loadHasOne(mapper, def, record, __opts)\n } else {\n task = self.loadHasMany(mapper, def, record, __opts)\n }\n } else if (def.type === 'hasMany' && def.localKeys) {\n let localKeys = []\n let itemKeys = get(record, def.localKeys) || []\n itemKeys = isArray(itemKeys) ? itemKeys : Object.keys(itemKeys)\n localKeys = localKeys.concat(itemKeys)\n task = self.findAll(relatedMapper, {\n where: {\n [relatedMapper.idAttribute]: {\n 'in': unique(localKeys).filter(function (x) { return x }).map(function (x) { return self.toObjectID(relatedMapper, x) })\n }\n }\n }, __opts).then(function (relatedItems) {\n def.setLocalField(record, relatedItems)\n })\n } else if (def.type === 'hasMany' && def.foreignKeys) {\n task = self.findAll(relatedMapper, {\n where: {\n [def.foreignKeys]: {\n 'contains': self.makeHasManyForeignKeys(mapper, def, record)\n }\n }\n }, __opts).then(function (relatedItems) {\n def.setLocalField(record, relatedItems)\n })\n } else if (def.type === 'belongsTo') {\n task = self.loadBelongsTo(mapper, def, record, __opts)\n }\n if (task) {\n tasks.push(task)\n }\n })\n\n return Promise.all(tasks)\n }).then(function () {\n let response = new Response(record, {}, 'find')\n response.found = record ? 1 : 0\n response = self.respond(response, opts)\n\n // afterFind lifecycle hook\n op = opts.op = 'afterFind'\n return resolve(self[op](mapper, id, opts, response)).then(function (_response) {\n // Allow for re-assignment from lifecycle hook\n return isUndefined(_response) ? response : _response\n })\n })\n },\n\n /**\n * Retrieve the records that match the selection query.\n *\n * @name MongoDBAdapter#findAll\n * @method\n * @param {Object} mapper The mapper.\n * @param {Object} query Selection query.\n * @param {Object} [opts] Configuration options.\n * @param {Object} [opts.findOpts] Options to pass to collection#find.\n * @param {boolean} [opts.raw=false] Whether to return a more detailed\n * response object.\n * @param {string[]} [opts.with=[]] Relations to eager load.\n * @return {Promise}\n */\n findAll (mapper, query, opts) {\n const self = this\n opts || (opts = {})\n opts.with || (opts.with = [])\n\n let records = []\n let op\n const findOpts = self.getOpt('findOpts', opts)\n fillIn(findOpts, self.getQueryOptions(mapper, query))\n findOpts.fields || (findOpts.fields = {})\n const mongoQuery = self.getQuery(mapper, query)\n\n return self.getClient().then(function (client) {\n // beforeFindAll lifecycle hook\n op = opts.op = 'beforeFindAll'\n return resolve(self[op](mapper, query, opts)).then(function () {\n return new Promise(function (resolve, reject) {\n client.collection(mapper.table || underscore(mapper.name)).find(mongoQuery, findOpts).toArray(function (err, cursor) {\n return err ? reject(err) : resolve(cursor)\n })\n })\n })\n }).then(function (_records) {\n records = _records\n self._translateId(records, opts)\n const tasks = []\n forEachRelation(mapper, opts, function (def, __opts) {\n const relatedMapper = def.getRelation()\n let task\n if (def.foreignKey && (def.type === 'hasOne' || def.type === 'hasMany')) {\n if (def.type === 'hasMany') {\n task = self.loadHasMany(mapper, def, records, __opts)\n } else {\n task = self.loadHasOne(mapper, def, records, __opts)\n }\n } else if (def.type === 'hasMany' && def.localKeys) {\n let localKeys = []\n records.forEach(function (item) {\n let itemKeys = item[def.localKeys] || []\n itemKeys = isArray(itemKeys) ? itemKeys : Object.keys(itemKeys)\n localKeys = localKeys.concat(itemKeys)\n })\n task = self.findAll(relatedMapper, {\n where: {\n [relatedMapper.idAttribute]: {\n 'in': unique(localKeys).filter(function (x) { return x }).map(function (x) { return self.toObjectID(relatedMapper, x) })\n }\n }\n }, __opts).then(function (relatedItems) {\n records.forEach(function (item) {\n let attached = []\n let itemKeys = get(item, def.localKeys) || []\n itemKeys = isArray(itemKeys) ? itemKeys : Object.keys(itemKeys)\n relatedItems.forEach(function (relatedItem) {\n if (itemKeys && itemKeys.indexOf(relatedItem[relatedMapper.idAttribute]) !== -1) {\n attached.push(relatedItem)\n }\n })\n def.setLocalField(item, attached)\n })\n return relatedItems\n })\n } else if (def.type === 'hasMany' && def.foreignKeys) {\n throw new Error('findAll eager load hasMany foreignKeys not supported!')\n } else if (def.type === 'belongsTo') {\n task = self.loadBelongsTo(mapper, def, records, __opts)\n }\n if (task) {\n tasks.push(task)\n }\n })\n return Promise.all(tasks)\n }).then(function () {\n records || (records = [])\n let response = new Response(records, {}, 'findAll')\n response.found = records.length\n response = self.respond(response, opts)\n\n // afterFindAll lifecycle hook\n op = opts.op = 'afterFindAll'\n return resolve(self[op](mapper, query, opts, response)).then(function (_response) {\n // Allow for re-assignment from lifecycle hook\n return isUndefined(_response) ? response : _response\n })\n })\n },\n\n /**\n * Create a new record.\n *\n * @name MongoDBAdapter#create\n * @method\n * @param {Object} mapper The mapper.\n * @param {Object} props The record to be created.\n * @param {Object} [opts] Configuration options.\n * @param {Object} [opts.insertOpts] Options to pass to collection#insert.\n * @param {boolean} [opts.raw=false] Whether to return a more detailed\n * response object.\n * @return {Promise}\n */\n create (mapper, props, opts) {\n const self = this\n let op\n props || (props = {})\n opts || (opts = {})\n\n const insertOpts = self.getOpt('insertOpts', opts)\n\n return self.getClient().then(function (client) {\n // beforeCreate lifecycle hook\n op = opts.op = 'beforeCreate'\n return resolve(self[op](mapper, props, opts)).then(function (_props) {\n // Allow for re-assignment from lifecycle hook\n props = isUndefined(_props) ? props : _props\n _props = withoutRelations(mapper, props)\n return new Promise(function (resolve, reject) {\n const collection = client.collection(mapper.table || underscore(mapper.name))\n const method = collection.insertOne ? 'insertOne' : 'insert'\n collection[method](_props, insertOpts, function (err, cursor) {\n return err ? reject(err) : resolve(cursor)\n })\n })\n }).then(function (cursor) {\n let record\n let r = cursor.ops ? cursor.ops : cursor\n self._translateId(r, opts)\n record = isArray(r) ? r[0] : r\n cursor.connection = undefined\n let response = new Response(record, cursor, 'create')\n response.created = record ? 1 : 0\n response = self.respond(response, opts)\n\n // afterCreate lifecycle hook\n op = opts.op = 'afterCreate'\n return resolve(self[op](mapper, props, opts, response)).then(function (_response) {\n // Allow for re-assignment from lifecycle hook\n return isUndefined(_response) ? response : _response\n })\n })\n })\n },\n\n /**\n * Create multiple records in a single batch.\n *\n * @name MongoDBAdapter#createMany\n * @method\n * @param {Object} mapper The mapper.\n * @param {Object} props The records to be created.\n * @param {Object} [opts] Configuration options.\n * @param {Object} [opts.insertManyOpts] Options to pass to\n * collection#insertMany.\n * @param {boolean} [opts.raw=false] Whether to return a more detailed\n * response object.\n * @return {Promise}\n */\n createMany (mapper, props, opts) {\n const self = this\n let op\n props || (props = {})\n opts || (opts = {})\n\n const insertManyOpts = self.getOpt('insertManyOpts', opts)\n\n return self.getClient().then(function (client) {\n // beforeCreateMany lifecycle hook\n op = opts.op = 'beforeCreateMany'\n return resolve(self[op](mapper, props, opts)).then(function (_props) {\n // Allow for re-assignment from lifecycle hook\n props = isUndefined(_props) ? props : _props\n _props = props.map(function (record) {\n return withoutRelations(mapper, record)\n })\n return new Promise(function (resolve, reject) {\n const collection = client.collection(mapper.table || underscore(mapper.name))\n collection.insertMany(_props, insertManyOpts, function (err, cursor) {\n return err ? reject(err) : resolve(cursor)\n })\n })\n }).then(function (cursor) {\n let records = []\n let r = cursor.ops ? cursor.ops : cursor\n self._translateId(r, opts)\n records = r\n cursor.connection = undefined\n let response = new Response(records, cursor, 'createMany')\n response.created = records.length\n response = self.respond(response, opts)\n\n // afterCreateMany lifecycle hook\n op = opts.op = 'afterCreateMany'\n return resolve(self[op](mapper, props, opts, response)).then(function (_response) {\n // Allow for re-assignment from lifecycle hook\n return isUndefined(_response) ? response : _response\n })\n })\n })\n },\n\n /**\n * Destroy the record with the given primary key.\n *\n * @name MongoDBAdapter#destroy\n * @method\n * @param {Object} mapper The mapper.\n * @param {(string|number)} id Primary key of the record to destroy.\n * @param {Object} [opts] Configuration options.\n * @param {boolean} [opts.raw=false] Whether to return a more detailed\n * response object.\n * @param {Object} [opts.removeOpts] Options to pass to collection#remove.\n * @return {Promise}\n */\n destroy (mapper, id, opts) {\n const self = this\n let op\n opts || (opts = {})\n const removeOpts = self.getOpt('removeOpts', opts)\n\n return self.getClient().then(function (client) {\n // beforeDestroy lifecycle hook\n op = opts.op = 'beforeDestroy'\n return resolve(self[op](mapper, id, opts)).then(function () {\n return new Promise(function (resolve, reject) {\n const mongoQuery = {}\n mongoQuery[mapper.idAttribute] = self.toObjectID(mapper, id)\n const collection = client.collection(mapper.table || underscore(mapper.name))\n collection[collection.deleteOne ? 'deleteOne' : 'remove'](mongoQuery, removeOpts, function (err, cursor) {\n return err ? reject(err) : resolve(cursor)\n })\n })\n })\n }).then(function (cursor) {\n cursor.connection = undefined\n let response = new Response(undefined, cursor, 'destroy')\n response = self.respond(response, opts)\n\n // afterDestroy lifecycle hook\n op = opts.op = 'afterDestroy'\n return resolve(self[op](mapper, id, opts, response)).then(function (_response) {\n // Allow for re-assignment from lifecycle hook\n return isUndefined(_response) ? response : _response\n })\n })\n },\n\n /**\n * Destroy the records that match the selection query.\n *\n * @name MongoDBAdapter#destroyAll\n * @method\n * @param {Object} mapper the mapper.\n * @param {Object} [query] Selection query.\n * @param {Object} [opts] Configuration options.\n * @param {boolean} [opts.raw=false] Whether to return a more detailed\n * response object.\n * @param {Object} [opts.removeOpts] Options to pass to collection#remove.\n * @return {Promise}\n */\n destroyAll (mapper, query, opts) {\n const self = this\n let op\n query || (query = {})\n opts || (opts = {})\n const removeOpts = self.getOpt('removeOpts', opts)\n fillIn(removeOpts, self.getQueryOptions(mapper, query))\n\n return self.getClient().then(function (client) {\n // beforeDestroyAll lifecycle hook\n op = opts.op = 'beforeDestroyAll'\n return resolve(self[op](mapper, query, opts)).then(function () {\n const mongoQuery = self.getQuery(mapper, query)\n return new Promise(function (resolve, reject) {\n const collection = client.collection(mapper.table || underscore(mapper.name))\n collection[collection.deleteMany ? 'deleteMany' : 'remove'](mongoQuery, removeOpts, function (err, cursor) {\n return err ? reject(err) : resolve(cursor)\n })\n })\n })\n }).then(function (cursor) {\n cursor.connection = undefined\n let response = new Response(undefined, cursor, 'destroyAll')\n response = self.respond(response, opts)\n\n // afterDestroyAll lifecycle hook\n op = opts.op = 'afterDestroyAll'\n return resolve(self[op](mapper, query, opts, response)).then(function (_response) {\n // Allow for re-assignment from lifecycle hook\n return isUndefined(_response) ? response : _response\n })\n })\n },\n\n /**\n * Apply the given update to the record with the specified primary key.\n *\n * @name MongoDBAdapter#update\n * @method\n * @param {Object} mapper The mapper.\n * @param {(string|number)} id The primary key of the record to be updated.\n * @param {Object} props The update to apply to the record.\n * @param {Object} [opts] Configuration options.\n * @param {boolean} [opts.raw=false] Whether to return a more detailed\n * response object.\n * @param {Object} [opts.updateOpts] Options to pass to collection#update.\n * @return {Promise}\n */\n update (mapper, id, props, opts) {\n const self = this\n props || (props = {})\n opts || (opts = {})\n let op\n const updateOpts = self.getOpt('updateOpts', opts)\n\n return self.find(mapper, id, { raw: false }).then(function (record) {\n if (!record) {\n throw new Error('Not Found')\n }\n // beforeUpdate lifecycle hook\n op = opts.op = 'beforeUpdate'\n return resolve(self[op](mapper, id, props, opts))\n }).then(function (_props) {\n // Allow for re-assignment from lifecycle hook\n props = isUndefined(_props) ? props : _props\n _props = withoutRelations(mapper, props)\n return self.getClient().then(function (client) {\n return new Promise(function (resolve, reject) {\n const mongoQuery = {}\n mongoQuery[mapper.idAttribute] = self.toObjectID(mapper, id)\n const collection = client.collection(mapper.table || underscore(mapper.name))\n collection[collection.updateOne ? 'updateOne' : 'update'](mongoQuery, { $set: _props }, updateOpts, function (err, cursor) {\n return err ? reject(err) : resolve(cursor)\n })\n })\n })\n }).then(function (cursor) {\n return self.find(mapper, id, { raw: false }).then(function (record) {\n cursor.connection = undefined\n let response = new Response(record, cursor, 'update')\n response.updated = 1\n response = self.respond(response, opts)\n\n // afterUpdate lifecycle hook\n op = opts.op = 'afterUpdate'\n return resolve(self[op](mapper, id, props, opts, response)).then(function (_response) {\n // Allow for re-assignment from lifecycle hook\n return isUndefined(_response) ? response : _response\n })\n })\n })\n },\n\n /**\n * Apply the given update to all records that match the selection query.\n *\n * @name MongoDBAdapter#updateAll\n * @method\n * @param {Object} mapper The mapper.\n * @param {Object} props The update to apply to the selected records.\n * @param {Object} [query] Selection query.\n * @param {Object} [opts] Configuration options.\n * @param {boolean} [opts.raw=false] Whether to return a more detailed\n * response object.\n * @param {Object} [opts.updateOpts] Options to pass to collection#update.\n * @return {Promise}\n */\n updateAll (mapper, props, query, opts) {\n const self = this\n props || (props = {})\n query || (query = {})\n opts || (opts = {})\n let op, ids\n const updateOpts = self.getOpt('updateOpts', opts)\n updateOpts.multi = true\n\n return self.getClient().then(function (client) {\n const queryOptions = self.getQueryOptions(mapper, query)\n const mongoQuery = self.getQuery(mapper, query)\n\n // beforeUpdateAll lifecycle hook\n op = opts.op = 'beforeUpdateAll'\n return resolve(self[op](mapper, props, query, opts)).then(function (_props) {\n // Allow for re-assignment from lifecycle hook\n props = isUndefined(_props) ? props : _props\n _props = withoutRelations(mapper, props)\n queryOptions.$set = _props\n return self.findAll(mapper, query, { raw: false })\n }).then(function (records) {\n ids = records.map(function (record) {\n return self.toObjectID(mapper, record[mapper.idAttribute])\n })\n\n return new Promise(function (resolve, reject) {\n const collection = client.collection(mapper.table || underscore(mapper.name))\n collection[collection.updateMany ? 'updateMany' : 'update'](mongoQuery, queryOptions, updateOpts, function (err, cursor) {\n return err ? reject(err) : resolve(cursor)\n })\n })\n }).then(function (cursor) {\n const query = {}\n query[mapper.idAttribute] = {\n 'in': ids\n }\n return self.findAll(mapper, query, { raw: false }).then(function (records) {\n cursor.connection = undefined\n let response = new Response(records, cursor, 'update')\n response.updated = records.length\n response = self.respond(response, opts)\n\n // afterUpdateAll lifecycle hook\n op = opts.op = 'afterUpdateAll'\n return resolve(self[op](mapper, props, query, opts, response)).then(function (_response) {\n // Allow for re-assignment from lifecycle hook\n return isUndefined(_response) ? response : _response\n })\n })\n })\n })\n },\n\n /**\n * Not supported.\n *\n * @name MongoDBAdapter#updateMany\n * @method\n */\n updateMany () {\n throw new Error('not supported!')\n }\n})\n"],"names":["utils","Adapter","reserved","ObjectID","Response"],"mappings":"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"} \ No newline at end of file diff --git a/mocha.start.js b/mocha.start.js index 6392474..cc841b2 100644 --- a/mocha.start.js +++ b/mocha.start.js @@ -3,13 +3,15 @@ // prepare environment for js-data-adapter-tests require('babel-polyfill') -global.assert = require('chai').assert var JSData = require('js-data') -var TestRunner = require('js-data-adapter-tests') +var JSDataAdapterTests = require('js-data-adapter-tests') var MongoDBAdapter = require('./') -TestRunner.init({ +global.assert = JSDataAdapterTests.assert +global.sinon = JSDataAdapterTests.sinon + +JSDataAdapterTests.init({ debug: false, JSData: JSData, Adapter: MongoDBAdapter, @@ -27,14 +29,31 @@ TestRunner.init({ } }, methods: [ + 'beforeCreate', 'create', + 'afterCreate', + 'beforeCreateMany', 'createMany', + 'afterCreateMany', + 'beforeDestroy', 'destroy', + 'afterDestroy', + 'beforeDestroyAll', 'destroyAll', + 'afterDestroyAll', + 'extend', + 'beforeFind', 'find', + 'afterFind', + 'beforeFindAll', 'findAll', + 'afterFindAll', + 'beforeUpdate', 'update', - 'updateAll' + 'afterUpdate', + 'beforeUpdateAll', + 'updateAll', + 'afterUpdateAll' ], features: [ 'findHasManyLocalKeys', diff --git a/package.json b/package.json index 30f0f14..519d956 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "js-data-mongodb", "description": "MongoDB adapter for js-data.", - "version": "1.0.0-alpha.2", + "version": "1.0.0-alpha.3", "homepage": "https://github.com/js-data/js-data-mongodb", "repository": { "type": "git", @@ -32,40 +32,44 @@ ] }, "scripts": { - "doc": "jsdoc -c conf.json src && node scripts/cleanup.js", + "lint": "repo-tools lint src/**/*.js mocha.start.js test/**/*.js", "bundle": "rollup -c rollup.config.js -f cjs -o dist/js-data-mongodb.js -m dist/js-data-mongodb.js.map src/index.js", - "lint": "standard src/**/*.js mocha.start.js test/**/*.js", + "doc": "jsdoc -c conf.json src node_modules/js-data-adapter/src && node scripts/cleanup.js", + "watch": "watch \"npm run bundle\" src/", "build": "npm run lint && npm run bundle", "mocha": "mocha -t 20000 -R dot -r source-map-support/register mocha.start.js", "cover": "istanbul cover --hook-run-in-context node_modules/mocha/bin/_mocha -- -t 20000 -R dot -r source-map-support/register mocha.start.js", "test": "npm run build && npm run cover", - "release": "npm test && npm run doc && node scripts/authors.js", + "repo-tools": "repo-tools updates && repo-tools changelog && repo-tools authors", + "release": "npm test && npm run doc && npm run repo-tools", "ci": "npm run test && cat coverage/lcov.info | coveralls || true && cat ./coverage/lcov.info | codacy-coverage || true" }, "dependencies": { - "mout": "0.11.1" + "js-data-adapter": "0.1.2", + "mout": "0.12.0" }, "peerDependencies": { "bson": "^0.4.x || ^0.3.x", - "js-data": "^3.0.0-alpha.15", + "js-data": "^3.0.0-alpha.16", "mongodb": ">=1.3.x" }, "devDependencies": { - "babel-core": "6.5.2", - "babel-eslint": "5.0.0", - "babel-polyfill": "6.5.0", + "babel-core": "6.6.5", + "babel-polyfill": "6.6.1", "babel-preset-es2015-rollup": "1.1.1", "chai": "3.5.0", "codacy-coverage": "1.1.3", "coveralls": "2.11.8", - "ink-docstrap": "1.1.3", + "ink-docstrap": "1.1.4", "istanbul": "0.4.2", - "js-data-adapter-tests": "^2.0.0-alpha.10", + "js-data-adapter-tests": "^2.0.0-alpha.13", + "js-data-repo-tools": "0.2.0", "jsdoc": "3.4.0", "mocha": "2.4.5", "rollup": "0.25.4", "rollup-plugin-babel": "2.4.0", + "sinon": "1.17.3", "source-map-support": "0.4.0", - "standard": "6.0.7" + "watch": "0.17.1" } } diff --git a/src/index.js b/src/index.js index c57c157..79bf4ed 100644 --- a/src/index.js +++ b/src/index.js @@ -1,10 +1,18 @@ import {MongoClient} from 'mongodb' import {ObjectID} from 'bson' import {utils} from 'js-data' +import Adapter from 'js-data-adapter' +import { + reserved, + Response +} from 'js-data-adapter' import underscore from 'mout/string/underscore' +import unique from 'mout/array/unique' const { addHiddenPropsToTarget, + classCallCheck, + extend, fillIn, forEachRelation, forOwn, @@ -13,65 +21,16 @@ const { isObject, isString, isUndefined, + omit, plainCopy, resolve } = utils -const reserved = [ - 'orderBy', - 'sort', - 'limit', - 'offset', - 'skip', - 'where' -] - -function unique (array) { - const seen = {} - const final = [] - array.forEach(function (item) { - if (item in seen) { - return - } - final.push(item) - seen[item] = 0 - }) - return final -} - -const noop = function (...args) { - const self = this - const opts = args[args.length - 1] - self.dbg(opts.op, ...args) - return resolve() -} - -const noop2 = function (...args) { - const self = this - const opts = args[args.length - 2] - self.dbg(opts.op, ...args) - return resolve() +const withoutRelations = function (mapper, props) { + return omit(props, mapper.relationFields || []) } const DEFAULTS = { - /** - * Whether to log debugging information. - * - * @name MongoDBAdapter#debug - * @type {boolean} - * @default false - */ - debug: false, - - /** - * Whether to return detailed result objects instead of just record data. - * - * @name MongoDBAdapter#raw - * @type {boolean} - * @default false - */ - raw: false, - /** * Convert ObjectIDs to strings when pulling records out of the database. * @@ -141,12 +100,13 @@ const REMOVE_OPTS_DEFAULTS = {} */ export default function MongoDBAdapter (opts) { const self = this + classCallCheck(self, MongoDBAdapter) opts || (opts = {}) if (isString(opts)) { opts = { uri: opts } } fillIn(opts, DEFAULTS) - fillIn(self, opts) + Adapter.call(self, opts) /** * Default options to pass to collection#find. @@ -222,6 +182,34 @@ export default function MongoDBAdapter (opts) { }) } +// Setup prototype inheritance from Adapter +MongoDBAdapter.prototype = Object.create(Adapter.prototype, { + constructor: { + value: MongoDBAdapter, + enumerable: false, + writable: true, + configurable: true + } +}) + +Object.defineProperty(MongoDBAdapter, '__super__', { + configurable: true, + value: Adapter +}) + +/** + * Alternative to ES6 class syntax for extending `MongoDBAdapter`. + * + * @name MongoDBAdapter.extend + * @method + * @param {Object} [instanceProps] Properties that will be added to the + * prototype of the MongoDBAdapter. + * @param {Object} [classProps] Properties that will be added as static + * properties to the MongoDBAdapter itself. + * @return {Object} MongoDBAdapter of `MongoDBAdapter`. + */ +MongoDBAdapter.extend = extend + addHiddenPropsToTarget(MongoDBAdapter.prototype, { /** * Translate ObjectIDs to strings. @@ -246,122 +234,6 @@ addHiddenPropsToTarget(MongoDBAdapter.prototype, { return r }, - /** - * @name MongoDBAdapter#afterCreate - * @method - */ - afterCreate: noop2, - - /** - * @name MongoDBAdapter#afterCreateMany - * @method - */ - afterCreateMany: noop2, - - /** - * @name MongoDBAdapter#afterDestroy - * @method - */ - afterDestroy: noop2, - - /** - * @name MongoDBAdapter#afterDestroyAll - * @method - */ - afterDestroyAll: noop2, - - /** - * @name MongoDBAdapter#afterFind - * @method - */ - afterFind: noop2, - - /** - * @name MongoDBAdapter#afterFindAll - * @method - */ - afterFindAll: noop2, - - /** - * @name MongoDBAdapter#afterUpdate - * @method - */ - afterUpdate: noop2, - - /** - * @name MongoDBAdapter#afterUpdateAll - * @method - */ - afterUpdateAll: noop2, - - /** - * @name MongoDBAdapter#afterUpdateMany - * @method - */ - afterUpdateMany: noop2, - - /** - * @name MongoDBAdapter#beforeCreate - * @method - */ - beforeCreate: noop, - - /** - * @name MongoDBAdapter#beforeCreateMany - * @method - */ - beforeCreateMany: noop, - - /** - * @name MongoDBAdapter#beforeDestroy - * @method - */ - beforeDestroy: noop, - - /** - * @name MongoDBAdapter#beforeDestroyAll - * @method - */ - beforeDestroyAll: noop, - - /** - * @name MongoDBAdapter#beforeFind - * @method - */ - beforeFind: noop, - - /** - * @name MongoDBAdapter#beforeFindAll - * @method - */ - beforeFindAll: noop, - - /** - * @name MongoDBAdapter#beforeUpdate - * @method - */ - beforeUpdate: noop, - - /** - * @name MongoDBAdapter#beforeUpdateAll - * @method - */ - beforeUpdateAll: noop, - - /** - * @name MongoDBAdapter#beforeUpdateMany - * @method - */ - beforeUpdateMany: noop, - - /** - * @name MongoDBAdapter#dbg - * @method - */ - dbg (...args) { - this.log('debug', ...args) - }, - /** * Return a Promise that resolves to a reference to the MongoDB client being * used by this adapter. @@ -500,28 +372,6 @@ addHiddenPropsToTarget(MongoDBAdapter.prototype, { return mongoQuery }, - /** - * Logging utility method. - * - * @name MongoDBAdapter#log - * @method - */ - log (level, ...args) { - if (level && !args.length) { - args.push(level) - level = 'debug' - } - if (level === 'debug' && !this.debug) { - return - } - const prefix = `${level.toUpperCase()}: (MongoDBAdapter)` - if (console[level]) { - console[level](prefix, ...args) - } else { - console.log(prefix, ...args) - } - }, - /** * Map non-filtering params in a selection query to MongoDB query options. * @@ -567,21 +417,6 @@ addHiddenPropsToTarget(MongoDBAdapter.prototype, { return queryOptions }, - /** - * Resolve the value of the specified option based on the given options and - * this adapter's settings. - * - * @name MongoDBAdapter#getOpt - * @method - * @param {string} opt The name of the option. - * @param {Object} [opts] Configuration options. - * @return {*} The value of the specified option. - */ - getOpt (opt, opts) { - opts || (opts = {}) - return isUndefined(opts[opt]) ? plainCopy(this[opt]) : plainCopy(opts[opt]) - }, - /** * Turn an _id into an ObjectID if it isn't already an ObjectID. * @@ -596,105 +431,6 @@ addHiddenPropsToTarget(MongoDBAdapter.prototype, { return id }, - /** - * Return the foreignKey from the given record for the provided relationship. - * - * If the foreignKeys in your database are saved as ObjectIDs, then override - * this method and change it to something like: - * - * ``` - * return this.toObjectID(mapper, this.constructor.prototype.makeHasManyForeignKey.call(this, mapper, def, record)) - * ``` - * - * There may be other reasons why you may want to override this method, like - * when the id of the parent doesn't exactly match up to the key on the child. - * - * @name MongoDBAdapter#makeHasManyForeignKey - * @method - * @return {*} - */ - makeHasManyForeignKey (mapper, def, record) { - return def.getForeignKey(record) - }, - - /** - * Return the foreignKeys from the given record for the provided relationship. - * - * @name MongoDBAdapter#makeHasManyForeignKeys - * @method - * @return {*} - */ - makeHasManyForeignKeys (mapper, def, record) { - return get(record, mapper.idAttribute) - }, - - /** - * Load a hasMany relationship. - * - * @name MongoDBAdapter#loadHasMany - * @method - * @return {Promise} - */ - loadHasMany (mapper, def, records, __opts) { - const self = this - let singular = false - - if (isObject(records) && !isArray(records)) { - singular = true - records = [records] - } - const IDs = records.map(function (record) { - return self.makeHasManyForeignKey(mapper, def, record) - }) - const query = {} - const criteria = query[def.foreignKey] = {} - if (singular) { - // more efficient query when we only have one record - criteria['=='] = IDs[0] - } else { - criteria['in'] = IDs.filter(function (id) { - return id - }) - } - return self.findAll(def.getRelation(), query, __opts).then(function (relatedItems) { - records.forEach(function (record) { - let attached = [] - // avoid unneccesary iteration when we only have one record - if (singular) { - attached = relatedItems - } else { - relatedItems.forEach(function (relatedItem) { - if (get(relatedItem, def.foreignKey) === record[mapper.idAttribute]) { - attached.push(relatedItem) - } - }) - } - def.setLocalField(record, attached) - }) - }) - }, - - /** - * Load a hasOne relationship. - * - * @name MongoDBAdapter#loadHasOne - * @method - * @return {Promise} - */ - loadHasOne (mapper, def, records, __opts) { - if (isObject(records) && !isArray(records)) { - records = [records] - } - return this.loadHasMany(mapper, def, records, __opts).then(function () { - records.forEach(function (record) { - const relatedData = def.getLocalField(record) - if (isArray(relatedData) && relatedData.length) { - def.setLocalField(record, relatedData[0]) - } - }) - }) - }, - /** * Return the foreignKey from the given record for the provided relationship. * @@ -703,47 +439,7 @@ addHiddenPropsToTarget(MongoDBAdapter.prototype, { * @return {*} */ makeBelongsToForeignKey (mapper, def, record) { - return this.toObjectID(def.getRelation(), def.getForeignKey(record)) - }, - - /** - * Load a belongsTo relationship. - * - * @name MongoDBAdapter#loadBelongsTo - * @method - * @return {Promise} - */ - loadBelongsTo (mapper, def, records, __opts) { - const self = this - const relationDef = def.getRelation() - - if (isObject(records) && !isArray(records)) { - const record = records - return self.find(relationDef, self.makeBelongsToForeignKey(mapper, def, record), __opts).then(function (relatedItem) { - def.setLocalField(record, relatedItem) - }) - } else { - const keys = records.map(function (record) { - return self.makeBelongsToForeignKey(mapper, def, record) - }).filter(function (key) { - return key - }) - return self.findAll(relationDef, { - where: { - [relationDef.idAttribute]: { - 'in': keys - } - } - }, __opts).then(function (relatedItems) { - records.forEach(function (record) { - relatedItems.forEach(function (relatedItem) { - if (relatedItem[relationDef.idAttribute] === record[def.foreignKey]) { - def.setLocalField(record, relatedItem) - } - }) - }) - }) - } + return this.toObjectID(def.getRelation(), Adapter.prototype.makeBelongsToForeignKey.call(this, mapper, def, record)) }, /** @@ -833,15 +529,15 @@ addHiddenPropsToTarget(MongoDBAdapter.prototype, { return Promise.all(tasks) }).then(function () { + let response = new Response(record, {}, 'find') + response.found = record ? 1 : 0 + response = self.respond(response, opts) + // afterFind lifecycle hook op = opts.op = 'afterFind' - return resolve(self[op](mapper, id, opts, record)).then(function (_record) { + return resolve(self[op](mapper, id, opts, response)).then(function (_response) { // Allow for re-assignment from lifecycle hook - record = isUndefined(_record) ? record : _record - return self.getOpt('raw', opts) ? { - data: record, - found: record ? 1 : 0 - } : record + return isUndefined(_response) ? response : _response }) }) }, @@ -933,15 +629,16 @@ addHiddenPropsToTarget(MongoDBAdapter.prototype, { }) return Promise.all(tasks) }).then(function () { + records || (records = []) + let response = new Response(records, {}, 'findAll') + response.found = records.length + response = self.respond(response, opts) + // afterFindAll lifecycle hook op = opts.op = 'afterFindAll' - return resolve(self[op](mapper, query, opts, records)).then(function (_records) { + return resolve(self[op](mapper, query, opts, response)).then(function (_response) { // Allow for re-assignment from lifecycle hook - records = isUndefined(_records) ? records : _records - return self.getOpt('raw', opts) ? { - data: records, - found: records.length - } : records + return isUndefined(_response) ? response : _response }) }) }, @@ -972,7 +669,8 @@ addHiddenPropsToTarget(MongoDBAdapter.prototype, { op = opts.op = 'beforeCreate' return resolve(self[op](mapper, props, opts)).then(function (_props) { // Allow for re-assignment from lifecycle hook - _props = isUndefined(_props) ? props : _props + props = isUndefined(_props) ? props : _props + _props = withoutRelations(mapper, props) return new Promise(function (resolve, reject) { const collection = client.collection(mapper.table || underscore(mapper.name)) const method = collection.insertOne ? 'insertOne' : 'insert' @@ -985,18 +683,16 @@ addHiddenPropsToTarget(MongoDBAdapter.prototype, { let r = cursor.ops ? cursor.ops : cursor self._translateId(r, opts) record = isArray(r) ? r[0] : r + cursor.connection = undefined + let response = new Response(record, cursor, 'create') + response.created = record ? 1 : 0 + response = self.respond(response, opts) // afterCreate lifecycle hook op = opts.op = 'afterCreate' - return self[op](mapper, props, opts, record).then(function (_record) { + return resolve(self[op](mapper, props, opts, response)).then(function (_response) { // Allow for re-assignment from lifecycle hook - record = isUndefined(_record) ? record : _record - const result = {} - fillIn(result, cursor) - delete result.connection - result.data = record - result.created = record ? 1 : 0 - return self.getOpt('raw', opts) ? result : result.data + return isUndefined(_response) ? response : _response }) }) }) @@ -1029,7 +725,10 @@ addHiddenPropsToTarget(MongoDBAdapter.prototype, { op = opts.op = 'beforeCreateMany' return resolve(self[op](mapper, props, opts)).then(function (_props) { // Allow for re-assignment from lifecycle hook - _props = isUndefined(_props) ? props : _props + props = isUndefined(_props) ? props : _props + _props = props.map(function (record) { + return withoutRelations(mapper, record) + }) return new Promise(function (resolve, reject) { const collection = client.collection(mapper.table || underscore(mapper.name)) collection.insertMany(_props, insertManyOpts, function (err, cursor) { @@ -1037,22 +736,20 @@ addHiddenPropsToTarget(MongoDBAdapter.prototype, { }) }) }).then(function (cursor) { - let records + let records = [] let r = cursor.ops ? cursor.ops : cursor self._translateId(r, opts) records = r + cursor.connection = undefined + let response = new Response(records, cursor, 'createMany') + response.created = records.length + response = self.respond(response, opts) // afterCreateMany lifecycle hook op = opts.op = 'afterCreateMany' - return self[op](mapper, props, opts, records).then(function (_records) { + return resolve(self[op](mapper, props, opts, response)).then(function (_response) { // Allow for re-assignment from lifecycle hook - records = isUndefined(_records) ? records : _records - const result = {} - fillIn(result, cursor) - delete result.connection - result.data = records - result.created = records.length - return self.getOpt('raw', opts) ? result : result.data + return isUndefined(_response) ? response : _response }) }) }) @@ -1091,17 +788,16 @@ addHiddenPropsToTarget(MongoDBAdapter.prototype, { }) }) }).then(function (cursor) { + cursor.connection = undefined + let response = new Response(undefined, cursor, 'destroy') + response = self.respond(response, opts) + // afterDestroy lifecycle hook op = opts.op = 'afterDestroy' - return resolve(self[op](mapper, id, opts, cursor)).then(function (_cursor) { + return resolve(self[op](mapper, id, opts, response)).then(function (_response) { // Allow for re-assignment from lifecycle hook - return isUndefined(_cursor) ? cursor : _cursor + return isUndefined(_response) ? response : _response }) - }).then(function (cursor) { - if (cursor) { - delete cursor.connection - } - return self.getOpt('raw', opts) ? cursor : undefined }) }, @@ -1139,17 +835,16 @@ addHiddenPropsToTarget(MongoDBAdapter.prototype, { }) }) }).then(function (cursor) { + cursor.connection = undefined + let response = new Response(undefined, cursor, 'destroyAll') + response = self.respond(response, opts) + // afterDestroyAll lifecycle hook op = opts.op = 'afterDestroyAll' - return resolve(self[op](mapper, query, opts, cursor)).then(function (_cursor) { + return resolve(self[op](mapper, query, opts, response)).then(function (_response) { // Allow for re-assignment from lifecycle hook - return isUndefined(_cursor) ? cursor : _cursor + return isUndefined(_response) ? response : _response }) - }).then(function (cursor) { - if (cursor) { - delete cursor.connection - } - return self.getOpt('raw', opts) ? cursor : undefined }) }, @@ -1183,7 +878,8 @@ addHiddenPropsToTarget(MongoDBAdapter.prototype, { return resolve(self[op](mapper, id, props, opts)) }).then(function (_props) { // Allow for re-assignment from lifecycle hook - _props = isUndefined(_props) ? props : _props + props = isUndefined(_props) ? props : _props + _props = withoutRelations(mapper, props) return self.getClient().then(function (client) { return new Promise(function (resolve, reject) { const mongoQuery = {} @@ -1195,20 +891,17 @@ addHiddenPropsToTarget(MongoDBAdapter.prototype, { }) }) }).then(function (cursor) { - if (cursor) { - delete cursor.connection - } return self.find(mapper, id, { raw: false }).then(function (record) { + cursor.connection = undefined + let response = new Response(record, cursor, 'update') + response.updated = 1 + response = self.respond(response, opts) + // afterUpdate lifecycle hook op = opts.op = 'afterUpdate' - return resolve(self[op](mapper, id, props, opts, record)).then(function (_record) { + return resolve(self[op](mapper, id, props, opts, response)).then(function (_response) { // Allow for re-assignment from lifecycle hook - record = isUndefined(_record) ? record : _record - const result = {} - fillIn(result, cursor) - result.data = record - result.updated = record ? 1 : 0 - return self.getOpt('raw', opts) ? result : result.data + return isUndefined(_response) ? response : _response }) }) }) @@ -1239,12 +932,15 @@ addHiddenPropsToTarget(MongoDBAdapter.prototype, { return self.getClient().then(function (client) { const queryOptions = self.getQueryOptions(mapper, query) - queryOptions.$set = props const mongoQuery = self.getQuery(mapper, query) // beforeUpdateAll lifecycle hook op = opts.op = 'beforeUpdateAll' - return resolve(self[op](mapper, props, query, opts)).then(function () { + return resolve(self[op](mapper, props, query, opts)).then(function (_props) { + // Allow for re-assignment from lifecycle hook + props = isUndefined(_props) ? props : _props + _props = withoutRelations(mapper, props) + queryOptions.$set = _props return self.findAll(mapper, query, { raw: false }) }).then(function (records) { ids = records.map(function (record) { @@ -1258,24 +954,21 @@ addHiddenPropsToTarget(MongoDBAdapter.prototype, { }) }) }).then(function (cursor) { - if (cursor) { - delete cursor.connection - } const query = {} query[mapper.idAttribute] = { 'in': ids } return self.findAll(mapper, query, { raw: false }).then(function (records) { + cursor.connection = undefined + let response = new Response(records, cursor, 'update') + response.updated = records.length + response = self.respond(response, opts) + // afterUpdateAll lifecycle hook op = opts.op = 'afterUpdateAll' - return self[op](mapper, props, query, opts, records).then(function (_records) { + return resolve(self[op](mapper, props, query, opts, response)).then(function (_response) { // Allow for re-assignment from lifecycle hook - records = isUndefined(_records) ? records : _records - const result = {} - fillIn(result, cursor) - result.data = records - result.updated = records.length - return self.getOpt('raw', opts) ? result : result.data + return isUndefined(_response) ? response : _response }) }) }) From 2d6a11947e477ce76cf817d973a67adbd26596d0 Mon Sep 17 00:00:00 2001 From: Jason Dobry Date: Sat, 5 Mar 2016 21:20:32 -0800 Subject: [PATCH 08/36] 1.0.0-alpha.4 --- CHANGELOG.md | 4 ++++ dist/js-data-mongodb.js | 1 + dist/js-data-mongodb.js.map | 2 +- package.json | 2 +- src/index.js | 1 + 5 files changed, 8 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 7af0ad1..fc47576 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,7 @@ +##### 1.0.0-alpha.4 - 06 March 2016 + +Fixed JSDoc + ##### 1.0.0-alpha.3 - 06 March 2016 ###### Backwards compatible API changes diff --git a/dist/js-data-mongodb.js b/dist/js-data-mongodb.js index a456c48..7af4fe1 100644 --- a/dist/js-data-mongodb.js +++ b/dist/js-data-mongodb.js @@ -102,6 +102,7 @@ var REMOVE_OPTS_DEFAULTS = {}; * store.defineMapper('user') * * @class MongoDBAdapter + * @extends Adapter * @param {Object} [opts] Configuration opts. * @param {boolean} [opts.debug=false] Whether to log debugging information. * @param {Object} [opts.findOpts] Options to pass to collection#find. diff --git a/dist/js-data-mongodb.js.map b/dist/js-data-mongodb.js.map index 2e19426..163f9ea 100644 --- a/dist/js-data-mongodb.js.map +++ b/dist/js-data-mongodb.js.map @@ -1 +1 @@ -{"version":3,"file":"js-data-mongodb.js","sources":["../src/index.js"],"sourcesContent":["import {MongoClient} from 'mongodb'\nimport {ObjectID} from 'bson'\nimport {utils} from 'js-data'\nimport Adapter from 'js-data-adapter'\nimport {\n reserved,\n Response\n} from 'js-data-adapter'\nimport underscore from 'mout/string/underscore'\nimport unique from 'mout/array/unique'\n\nconst {\n addHiddenPropsToTarget,\n classCallCheck,\n extend,\n fillIn,\n forEachRelation,\n forOwn,\n get,\n isArray,\n isObject,\n isString,\n isUndefined,\n omit,\n plainCopy,\n resolve\n} = utils\n\nconst withoutRelations = function (mapper, props) {\n return omit(props, mapper.relationFields || [])\n}\n\nconst DEFAULTS = {\n /**\n * Convert ObjectIDs to strings when pulling records out of the database.\n *\n * @name MongoDBAdapter#translateId\n * @type {boolean}\n * @default true\n */\n translateId: true,\n\n /**\n * MongoDB URI.\n *\n * @name MongoDBAdapter#uri\n * @type {string}\n * @default mongodb://localhost:27017\n */\n uri: 'mongodb://localhost:27017'\n}\n\nconst FIND_OPTS_DEFAULTS = {}\nconst FIND_ONE_OPTS_DEFAULTS = {}\nconst INSERT_OPTS_DEFAULTS = {}\nconst INSERT_MANY_OPTS_DEFAULTS = {}\nconst UPDATE_OPTS_DEFAULTS = {}\nconst REMOVE_OPTS_DEFAULTS = {}\n\n/**\n * MongoDBAdapter class.\n *\n * @example\n * // Use Container instead of DataStore on the server\n * import {Container} from 'js-data'\n * import MongoDBAdapter from 'js-data-mongodb'\n *\n * // Create a store to hold your Mappers\n * const store = new Container({\n * mapperDefaults: {\n * // MongoDB uses \"_id\" as the primary key\n * idAttribute: '_id'\n * }\n * })\n *\n * // Create an instance of MongoDBAdapter with default settings\n * const adapter = new MongoDBAdapter()\n *\n * // Mappers in \"store\" will use the MongoDB adapter by default\n * store.registerAdapter('mongodb', adapter, { default: true })\n *\n * // Create a Mapper that maps to a \"user\" collection\n * store.defineMapper('user')\n *\n * @class MongoDBAdapter\n * @param {Object} [opts] Configuration opts.\n * @param {boolean} [opts.debug=false] Whether to log debugging information.\n * @param {Object} [opts.findOpts] Options to pass to collection#find.\n * @param {Object} [opts.findOneOpts] Options to pass to collection#findOne.\n * @param {Object} [opts.insertOpts] Options to pass to collection#insert.\n * @param {Object} [opts.insertManyOpts] Options to pass to\n * collection#insertMany.\n * @param {boolean} [opts.raw=false] Whether to return detailed result objects\n * instead of just record data.\n * @param {Object} [opts.removeOpts] Options to pass to collection#remove.\n * @param {boolean} [opts.translateId=true] Convert ObjectIDs to strings when\n * pulling records out of the database.\n * @param {Object} [opts.updateOpts] Options to pass to collection#update.\n * @param {string} [opts.uri=\"mongodb://localhost:27017\"] MongoDB URI.\n */\nexport default function MongoDBAdapter (opts) {\n const self = this\n classCallCheck(self, MongoDBAdapter)\n opts || (opts = {})\n if (isString(opts)) {\n opts = { uri: opts }\n }\n fillIn(opts, DEFAULTS)\n Adapter.call(self, opts)\n\n /**\n * Default options to pass to collection#find.\n *\n * @name MongoDBAdapter#findOpts\n * @type {Object}\n * @default {}\n */\n self.findOpts || (self.findOpts = {})\n fillIn(self.findOpts, FIND_OPTS_DEFAULTS)\n\n /**\n * Default options to pass to collection#findOne.\n *\n * @name MongoDBAdapter#findOneOpts\n * @type {Object}\n * @default {}\n */\n self.findOneOpts || (self.findOneOpts = {})\n fillIn(self.findOneOpts, FIND_ONE_OPTS_DEFAULTS)\n\n /**\n * Default options to pass to collection#insert.\n *\n * @name MongoDBAdapter#insertOpts\n * @type {Object}\n * @default {}\n */\n self.insertOpts || (self.insertOpts = {})\n fillIn(self.insertOpts, INSERT_OPTS_DEFAULTS)\n\n /**\n * Default options to pass to collection#insertMany.\n *\n * @name MongoDBAdapter#insertManyOpts\n * @type {Object}\n * @default {}\n */\n self.insertManyOpts || (self.insertManyOpts = {})\n fillIn(self.insertManyOpts, INSERT_MANY_OPTS_DEFAULTS)\n\n /**\n * Default options to pass to collection#update.\n *\n * @name MongoDBAdapter#updateOpts\n * @type {Object}\n * @default {}\n */\n self.updateOpts || (self.updateOpts = {})\n fillIn(self.updateOpts, UPDATE_OPTS_DEFAULTS)\n\n /**\n * Default options to pass to collection#update.\n *\n * @name MongoDBAdapter#removeOpts\n * @type {Object}\n * @default {}\n */\n self.removeOpts || (self.removeOpts = {})\n fillIn(self.removeOpts, REMOVE_OPTS_DEFAULTS)\n\n /**\n * A Promise that resolves to a reference to the MongoDB client being used by\n * this adapter.\n *\n * @name MongoDBAdapter#client\n * @type {Object}\n */\n self.client = new Promise(function (resolve, reject) {\n MongoClient.connect(opts.uri, function (err, db) {\n return err ? reject(err) : resolve(db)\n })\n })\n}\n\n// Setup prototype inheritance from Adapter\nMongoDBAdapter.prototype = Object.create(Adapter.prototype, {\n constructor: {\n value: MongoDBAdapter,\n enumerable: false,\n writable: true,\n configurable: true\n }\n})\n\nObject.defineProperty(MongoDBAdapter, '__super__', {\n configurable: true,\n value: Adapter\n})\n\n/**\n * Alternative to ES6 class syntax for extending `MongoDBAdapter`.\n *\n * @name MongoDBAdapter.extend\n * @method\n * @param {Object} [instanceProps] Properties that will be added to the\n * prototype of the MongoDBAdapter.\n * @param {Object} [classProps] Properties that will be added as static\n * properties to the MongoDBAdapter itself.\n * @return {Object} MongoDBAdapter of `MongoDBAdapter`.\n */\nMongoDBAdapter.extend = extend\n\naddHiddenPropsToTarget(MongoDBAdapter.prototype, {\n /**\n * Translate ObjectIDs to strings.\n *\n * @name MongoDBAdapter#_translateId\n * @method\n * @return {*}\n */\n _translateId (r, opts) {\n opts || (opts = {})\n if (this.getOpt('translateId', opts)) {\n if (isArray(r)) {\n r.forEach(function (_r) {\n const __id = _r._id ? _r._id.toString() : _r._id\n _r._id = typeof __id === 'string' ? __id : _r._id\n })\n } else if (isObject(r)) {\n const __id = r._id ? r._id.toString() : r._id\n r._id = typeof __id === 'string' ? __id : r._id\n }\n }\n return r\n },\n\n /**\n * Return a Promise that resolves to a reference to the MongoDB client being\n * used by this adapter.\n *\n * Useful when you need to do anything custom with the MongoDB client library.\n *\n * @name MongoDBAdapter#getClient\n * @method\n * @return {Object} MongoDB client.\n */\n getClient () {\n return this.client\n },\n\n /**\n * Map filtering params in a selection query to MongoDB a filtering object.\n *\n * Handles the following:\n *\n * - where\n * - and bunch of filtering operators\n *\n * @name MongoDBAdapter#getQuery\n * @method\n * @return {Object}\n */\n getQuery (mapper, query) {\n query = plainCopy(query || {})\n query.where || (query.where = {})\n\n forOwn(query, function (config, keyword) {\n if (reserved.indexOf(keyword) === -1) {\n if (isObject(config)) {\n query.where[keyword] = config\n } else {\n query.where[keyword] = {\n '==': config\n }\n }\n delete query[keyword]\n }\n })\n\n let mongoQuery = {}\n\n if (Object.keys(query.where).length !== 0) {\n forOwn(query.where, function (criteria, field) {\n if (!isObject(criteria)) {\n query.where[field] = {\n '==': criteria\n }\n }\n forOwn(criteria, function (v, op) {\n if (op === '==' || op === '===' || op === 'contains') {\n mongoQuery[field] = v\n } else if (op === '!=' || op === '!==' || op === 'notContains') {\n mongoQuery[field] = mongoQuery[field] || {}\n mongoQuery[field].$ne = v\n } else if (op === '>') {\n mongoQuery[field] = mongoQuery[field] || {}\n mongoQuery[field].$gt = v\n } else if (op === '>=') {\n mongoQuery[field] = mongoQuery[field] || {}\n mongoQuery[field].$gte = v\n } else if (op === '<') {\n mongoQuery[field] = mongoQuery[field] || {}\n mongoQuery[field].$lt = v\n } else if (op === '<=') {\n mongoQuery[field] = mongoQuery[field] || {}\n mongoQuery[field].$lte = v\n } else if (op === 'in') {\n mongoQuery[field] = mongoQuery[field] || {}\n mongoQuery[field].$in = v\n } else if (op === 'notIn') {\n mongoQuery[field] = mongoQuery[field] || {}\n mongoQuery[field].$nin = v\n } else if (op === '|==' || op === '|===' || op === '|contains') {\n mongoQuery.$or = mongoQuery.$or || []\n let orEqQuery = {}\n orEqQuery[field] = v\n mongoQuery.$or.push(orEqQuery)\n } else if (op === '|!=' || op === '|!==' || op === '|notContains') {\n mongoQuery.$or = mongoQuery.$or || []\n let orNeQuery = {}\n orNeQuery[field] = {\n '$ne': v\n }\n mongoQuery.$or.push(orNeQuery)\n } else if (op === '|>') {\n mongoQuery.$or = mongoQuery.$or || []\n let orGtQuery = {}\n orGtQuery[field] = {\n '$gt': v\n }\n mongoQuery.$or.push(orGtQuery)\n } else if (op === '|>=') {\n mongoQuery.$or = mongoQuery.$or || []\n let orGteQuery = {}\n orGteQuery[field] = {\n '$gte': v\n }\n mongoQuery.$or.push(orGteQuery)\n } else if (op === '|<') {\n mongoQuery.$or = mongoQuery.$or || []\n let orLtQuery = {}\n orLtQuery[field] = {\n '$lt': v\n }\n mongoQuery.$or.push(orLtQuery)\n } else if (op === '|<=') {\n mongoQuery.$or = mongoQuery.$or || []\n let orLteQuery = {}\n orLteQuery[field] = {\n '$lte': v\n }\n mongoQuery.$or.push(orLteQuery)\n } else if (op === '|in') {\n mongoQuery.$or = mongoQuery.$or || []\n let orInQuery = {}\n orInQuery[field] = {\n '$in': v\n }\n mongoQuery.$or.push(orInQuery)\n } else if (op === '|notIn') {\n mongoQuery.$or = mongoQuery.$or || []\n let orNinQuery = {}\n orNinQuery[field] = {\n '$nin': v\n }\n mongoQuery.$or.push(orNinQuery)\n }\n })\n })\n }\n\n return mongoQuery\n },\n\n /**\n * Map non-filtering params in a selection query to MongoDB query options.\n *\n * Handles the following:\n *\n * - limit\n * - skip/offset\n * - orderBy/sort\n *\n * @name MongoDBAdapter#getQueryOptions\n * @method\n * @return {Object}\n */\n getQueryOptions (mapper, query) {\n query = plainCopy(query || {})\n query.orderBy = query.orderBy || query.sort\n query.skip = query.skip || query.offset\n\n let queryOptions = {}\n\n if (query.orderBy) {\n if (isString(query.orderBy)) {\n query.orderBy = [\n [query.orderBy, 'asc']\n ]\n }\n for (var i = 0; i < query.orderBy.length; i++) {\n if (isString(query.orderBy[i])) {\n query.orderBy[i] = [query.orderBy[i], 'asc']\n }\n }\n queryOptions.sort = query.orderBy\n }\n\n if (query.skip) {\n queryOptions.skip = +query.skip\n }\n\n if (query.limit) {\n queryOptions.limit = +query.limit\n }\n\n return queryOptions\n },\n\n /**\n * Turn an _id into an ObjectID if it isn't already an ObjectID.\n *\n * @name MongoDBAdapter#toObjectID\n * @method\n * @return {*}\n */\n toObjectID (mapper, id) {\n if (id !== undefined && mapper.idAttribute === '_id' && typeof id === 'string' && ObjectID.isValid(id) && !(id instanceof ObjectID)) {\n return new ObjectID(id)\n }\n return id\n },\n\n /**\n * Return the foreignKey from the given record for the provided relationship.\n *\n * @name MongoDBAdapter#makeBelongsToForeignKey\n * @method\n * @return {*}\n */\n makeBelongsToForeignKey (mapper, def, record) {\n return this.toObjectID(def.getRelation(), Adapter.prototype.makeBelongsToForeignKey.call(this, mapper, def, record))\n },\n\n /**\n * Retrieve the record with the given primary key.\n *\n * @name MongoDBAdapter#find\n * @method\n * @param {Object} mapper The mapper.\n * @param {(string|number)} id Primary key of the record to retrieve.\n * @param {Object} [opts] Configuration options.\n * @param {Object} [opts.findOneOpts] Options to pass to collection#findOne.\n * @param {boolean} [opts.raw=false] Whether to return a more detailed\n * response object.\n * @param {string[]} [opts.with=[]] Relations to eager load.\n * @return {Promise}\n */\n find (mapper, id, opts) {\n const self = this\n let record, op\n opts || (opts = {})\n opts.with || (opts.with = [])\n\n const findOneOpts = self.getOpt('findOneOpts', opts)\n findOneOpts.fields || (findOneOpts.fields = {})\n\n return self.getClient().then(function (client) {\n // beforeFind lifecycle hook\n op = opts.op = 'beforeFind'\n return resolve(self[op](mapper, id, opts)).then(function () {\n return new Promise(function (resolve, reject) {\n let mongoQuery = {}\n mongoQuery[mapper.idAttribute] = self.toObjectID(mapper, id)\n client.collection(mapper.table || underscore(mapper.name)).findOne(mongoQuery, findOneOpts, function (err, cursor) {\n return err ? reject(err) : resolve(cursor)\n })\n })\n })\n }).then(function (_record) {\n if (!_record) {\n return\n }\n record = _record\n self._translateId(record, opts)\n const tasks = []\n\n forEachRelation(mapper, opts, function (def, __opts) {\n const relatedMapper = def.getRelation()\n let task\n\n if (def.foreignKey && (def.type === 'hasOne' || def.type === 'hasMany')) {\n if (def.type === 'hasOne') {\n task = self.loadHasOne(mapper, def, record, __opts)\n } else {\n task = self.loadHasMany(mapper, def, record, __opts)\n }\n } else if (def.type === 'hasMany' && def.localKeys) {\n let localKeys = []\n let itemKeys = get(record, def.localKeys) || []\n itemKeys = isArray(itemKeys) ? itemKeys : Object.keys(itemKeys)\n localKeys = localKeys.concat(itemKeys)\n task = self.findAll(relatedMapper, {\n where: {\n [relatedMapper.idAttribute]: {\n 'in': unique(localKeys).filter(function (x) { return x }).map(function (x) { return self.toObjectID(relatedMapper, x) })\n }\n }\n }, __opts).then(function (relatedItems) {\n def.setLocalField(record, relatedItems)\n })\n } else if (def.type === 'hasMany' && def.foreignKeys) {\n task = self.findAll(relatedMapper, {\n where: {\n [def.foreignKeys]: {\n 'contains': self.makeHasManyForeignKeys(mapper, def, record)\n }\n }\n }, __opts).then(function (relatedItems) {\n def.setLocalField(record, relatedItems)\n })\n } else if (def.type === 'belongsTo') {\n task = self.loadBelongsTo(mapper, def, record, __opts)\n }\n if (task) {\n tasks.push(task)\n }\n })\n\n return Promise.all(tasks)\n }).then(function () {\n let response = new Response(record, {}, 'find')\n response.found = record ? 1 : 0\n response = self.respond(response, opts)\n\n // afterFind lifecycle hook\n op = opts.op = 'afterFind'\n return resolve(self[op](mapper, id, opts, response)).then(function (_response) {\n // Allow for re-assignment from lifecycle hook\n return isUndefined(_response) ? response : _response\n })\n })\n },\n\n /**\n * Retrieve the records that match the selection query.\n *\n * @name MongoDBAdapter#findAll\n * @method\n * @param {Object} mapper The mapper.\n * @param {Object} query Selection query.\n * @param {Object} [opts] Configuration options.\n * @param {Object} [opts.findOpts] Options to pass to collection#find.\n * @param {boolean} [opts.raw=false] Whether to return a more detailed\n * response object.\n * @param {string[]} [opts.with=[]] Relations to eager load.\n * @return {Promise}\n */\n findAll (mapper, query, opts) {\n const self = this\n opts || (opts = {})\n opts.with || (opts.with = [])\n\n let records = []\n let op\n const findOpts = self.getOpt('findOpts', opts)\n fillIn(findOpts, self.getQueryOptions(mapper, query))\n findOpts.fields || (findOpts.fields = {})\n const mongoQuery = self.getQuery(mapper, query)\n\n return self.getClient().then(function (client) {\n // beforeFindAll lifecycle hook\n op = opts.op = 'beforeFindAll'\n return resolve(self[op](mapper, query, opts)).then(function () {\n return new Promise(function (resolve, reject) {\n client.collection(mapper.table || underscore(mapper.name)).find(mongoQuery, findOpts).toArray(function (err, cursor) {\n return err ? reject(err) : resolve(cursor)\n })\n })\n })\n }).then(function (_records) {\n records = _records\n self._translateId(records, opts)\n const tasks = []\n forEachRelation(mapper, opts, function (def, __opts) {\n const relatedMapper = def.getRelation()\n let task\n if (def.foreignKey && (def.type === 'hasOne' || def.type === 'hasMany')) {\n if (def.type === 'hasMany') {\n task = self.loadHasMany(mapper, def, records, __opts)\n } else {\n task = self.loadHasOne(mapper, def, records, __opts)\n }\n } else if (def.type === 'hasMany' && def.localKeys) {\n let localKeys = []\n records.forEach(function (item) {\n let itemKeys = item[def.localKeys] || []\n itemKeys = isArray(itemKeys) ? itemKeys : Object.keys(itemKeys)\n localKeys = localKeys.concat(itemKeys)\n })\n task = self.findAll(relatedMapper, {\n where: {\n [relatedMapper.idAttribute]: {\n 'in': unique(localKeys).filter(function (x) { return x }).map(function (x) { return self.toObjectID(relatedMapper, x) })\n }\n }\n }, __opts).then(function (relatedItems) {\n records.forEach(function (item) {\n let attached = []\n let itemKeys = get(item, def.localKeys) || []\n itemKeys = isArray(itemKeys) ? itemKeys : Object.keys(itemKeys)\n relatedItems.forEach(function (relatedItem) {\n if (itemKeys && itemKeys.indexOf(relatedItem[relatedMapper.idAttribute]) !== -1) {\n attached.push(relatedItem)\n }\n })\n def.setLocalField(item, attached)\n })\n return relatedItems\n })\n } else if (def.type === 'hasMany' && def.foreignKeys) {\n throw new Error('findAll eager load hasMany foreignKeys not supported!')\n } else if (def.type === 'belongsTo') {\n task = self.loadBelongsTo(mapper, def, records, __opts)\n }\n if (task) {\n tasks.push(task)\n }\n })\n return Promise.all(tasks)\n }).then(function () {\n records || (records = [])\n let response = new Response(records, {}, 'findAll')\n response.found = records.length\n response = self.respond(response, opts)\n\n // afterFindAll lifecycle hook\n op = opts.op = 'afterFindAll'\n return resolve(self[op](mapper, query, opts, response)).then(function (_response) {\n // Allow for re-assignment from lifecycle hook\n return isUndefined(_response) ? response : _response\n })\n })\n },\n\n /**\n * Create a new record.\n *\n * @name MongoDBAdapter#create\n * @method\n * @param {Object} mapper The mapper.\n * @param {Object} props The record to be created.\n * @param {Object} [opts] Configuration options.\n * @param {Object} [opts.insertOpts] Options to pass to collection#insert.\n * @param {boolean} [opts.raw=false] Whether to return a more detailed\n * response object.\n * @return {Promise}\n */\n create (mapper, props, opts) {\n const self = this\n let op\n props || (props = {})\n opts || (opts = {})\n\n const insertOpts = self.getOpt('insertOpts', opts)\n\n return self.getClient().then(function (client) {\n // beforeCreate lifecycle hook\n op = opts.op = 'beforeCreate'\n return resolve(self[op](mapper, props, opts)).then(function (_props) {\n // Allow for re-assignment from lifecycle hook\n props = isUndefined(_props) ? props : _props\n _props = withoutRelations(mapper, props)\n return new Promise(function (resolve, reject) {\n const collection = client.collection(mapper.table || underscore(mapper.name))\n const method = collection.insertOne ? 'insertOne' : 'insert'\n collection[method](_props, insertOpts, function (err, cursor) {\n return err ? reject(err) : resolve(cursor)\n })\n })\n }).then(function (cursor) {\n let record\n let r = cursor.ops ? cursor.ops : cursor\n self._translateId(r, opts)\n record = isArray(r) ? r[0] : r\n cursor.connection = undefined\n let response = new Response(record, cursor, 'create')\n response.created = record ? 1 : 0\n response = self.respond(response, opts)\n\n // afterCreate lifecycle hook\n op = opts.op = 'afterCreate'\n return resolve(self[op](mapper, props, opts, response)).then(function (_response) {\n // Allow for re-assignment from lifecycle hook\n return isUndefined(_response) ? response : _response\n })\n })\n })\n },\n\n /**\n * Create multiple records in a single batch.\n *\n * @name MongoDBAdapter#createMany\n * @method\n * @param {Object} mapper The mapper.\n * @param {Object} props The records to be created.\n * @param {Object} [opts] Configuration options.\n * @param {Object} [opts.insertManyOpts] Options to pass to\n * collection#insertMany.\n * @param {boolean} [opts.raw=false] Whether to return a more detailed\n * response object.\n * @return {Promise}\n */\n createMany (mapper, props, opts) {\n const self = this\n let op\n props || (props = {})\n opts || (opts = {})\n\n const insertManyOpts = self.getOpt('insertManyOpts', opts)\n\n return self.getClient().then(function (client) {\n // beforeCreateMany lifecycle hook\n op = opts.op = 'beforeCreateMany'\n return resolve(self[op](mapper, props, opts)).then(function (_props) {\n // Allow for re-assignment from lifecycle hook\n props = isUndefined(_props) ? props : _props\n _props = props.map(function (record) {\n return withoutRelations(mapper, record)\n })\n return new Promise(function (resolve, reject) {\n const collection = client.collection(mapper.table || underscore(mapper.name))\n collection.insertMany(_props, insertManyOpts, function (err, cursor) {\n return err ? reject(err) : resolve(cursor)\n })\n })\n }).then(function (cursor) {\n let records = []\n let r = cursor.ops ? cursor.ops : cursor\n self._translateId(r, opts)\n records = r\n cursor.connection = undefined\n let response = new Response(records, cursor, 'createMany')\n response.created = records.length\n response = self.respond(response, opts)\n\n // afterCreateMany lifecycle hook\n op = opts.op = 'afterCreateMany'\n return resolve(self[op](mapper, props, opts, response)).then(function (_response) {\n // Allow for re-assignment from lifecycle hook\n return isUndefined(_response) ? response : _response\n })\n })\n })\n },\n\n /**\n * Destroy the record with the given primary key.\n *\n * @name MongoDBAdapter#destroy\n * @method\n * @param {Object} mapper The mapper.\n * @param {(string|number)} id Primary key of the record to destroy.\n * @param {Object} [opts] Configuration options.\n * @param {boolean} [opts.raw=false] Whether to return a more detailed\n * response object.\n * @param {Object} [opts.removeOpts] Options to pass to collection#remove.\n * @return {Promise}\n */\n destroy (mapper, id, opts) {\n const self = this\n let op\n opts || (opts = {})\n const removeOpts = self.getOpt('removeOpts', opts)\n\n return self.getClient().then(function (client) {\n // beforeDestroy lifecycle hook\n op = opts.op = 'beforeDestroy'\n return resolve(self[op](mapper, id, opts)).then(function () {\n return new Promise(function (resolve, reject) {\n const mongoQuery = {}\n mongoQuery[mapper.idAttribute] = self.toObjectID(mapper, id)\n const collection = client.collection(mapper.table || underscore(mapper.name))\n collection[collection.deleteOne ? 'deleteOne' : 'remove'](mongoQuery, removeOpts, function (err, cursor) {\n return err ? reject(err) : resolve(cursor)\n })\n })\n })\n }).then(function (cursor) {\n cursor.connection = undefined\n let response = new Response(undefined, cursor, 'destroy')\n response = self.respond(response, opts)\n\n // afterDestroy lifecycle hook\n op = opts.op = 'afterDestroy'\n return resolve(self[op](mapper, id, opts, response)).then(function (_response) {\n // Allow for re-assignment from lifecycle hook\n return isUndefined(_response) ? response : _response\n })\n })\n },\n\n /**\n * Destroy the records that match the selection query.\n *\n * @name MongoDBAdapter#destroyAll\n * @method\n * @param {Object} mapper the mapper.\n * @param {Object} [query] Selection query.\n * @param {Object} [opts] Configuration options.\n * @param {boolean} [opts.raw=false] Whether to return a more detailed\n * response object.\n * @param {Object} [opts.removeOpts] Options to pass to collection#remove.\n * @return {Promise}\n */\n destroyAll (mapper, query, opts) {\n const self = this\n let op\n query || (query = {})\n opts || (opts = {})\n const removeOpts = self.getOpt('removeOpts', opts)\n fillIn(removeOpts, self.getQueryOptions(mapper, query))\n\n return self.getClient().then(function (client) {\n // beforeDestroyAll lifecycle hook\n op = opts.op = 'beforeDestroyAll'\n return resolve(self[op](mapper, query, opts)).then(function () {\n const mongoQuery = self.getQuery(mapper, query)\n return new Promise(function (resolve, reject) {\n const collection = client.collection(mapper.table || underscore(mapper.name))\n collection[collection.deleteMany ? 'deleteMany' : 'remove'](mongoQuery, removeOpts, function (err, cursor) {\n return err ? reject(err) : resolve(cursor)\n })\n })\n })\n }).then(function (cursor) {\n cursor.connection = undefined\n let response = new Response(undefined, cursor, 'destroyAll')\n response = self.respond(response, opts)\n\n // afterDestroyAll lifecycle hook\n op = opts.op = 'afterDestroyAll'\n return resolve(self[op](mapper, query, opts, response)).then(function (_response) {\n // Allow for re-assignment from lifecycle hook\n return isUndefined(_response) ? response : _response\n })\n })\n },\n\n /**\n * Apply the given update to the record with the specified primary key.\n *\n * @name MongoDBAdapter#update\n * @method\n * @param {Object} mapper The mapper.\n * @param {(string|number)} id The primary key of the record to be updated.\n * @param {Object} props The update to apply to the record.\n * @param {Object} [opts] Configuration options.\n * @param {boolean} [opts.raw=false] Whether to return a more detailed\n * response object.\n * @param {Object} [opts.updateOpts] Options to pass to collection#update.\n * @return {Promise}\n */\n update (mapper, id, props, opts) {\n const self = this\n props || (props = {})\n opts || (opts = {})\n let op\n const updateOpts = self.getOpt('updateOpts', opts)\n\n return self.find(mapper, id, { raw: false }).then(function (record) {\n if (!record) {\n throw new Error('Not Found')\n }\n // beforeUpdate lifecycle hook\n op = opts.op = 'beforeUpdate'\n return resolve(self[op](mapper, id, props, opts))\n }).then(function (_props) {\n // Allow for re-assignment from lifecycle hook\n props = isUndefined(_props) ? props : _props\n _props = withoutRelations(mapper, props)\n return self.getClient().then(function (client) {\n return new Promise(function (resolve, reject) {\n const mongoQuery = {}\n mongoQuery[mapper.idAttribute] = self.toObjectID(mapper, id)\n const collection = client.collection(mapper.table || underscore(mapper.name))\n collection[collection.updateOne ? 'updateOne' : 'update'](mongoQuery, { $set: _props }, updateOpts, function (err, cursor) {\n return err ? reject(err) : resolve(cursor)\n })\n })\n })\n }).then(function (cursor) {\n return self.find(mapper, id, { raw: false }).then(function (record) {\n cursor.connection = undefined\n let response = new Response(record, cursor, 'update')\n response.updated = 1\n response = self.respond(response, opts)\n\n // afterUpdate lifecycle hook\n op = opts.op = 'afterUpdate'\n return resolve(self[op](mapper, id, props, opts, response)).then(function (_response) {\n // Allow for re-assignment from lifecycle hook\n return isUndefined(_response) ? response : _response\n })\n })\n })\n },\n\n /**\n * Apply the given update to all records that match the selection query.\n *\n * @name MongoDBAdapter#updateAll\n * @method\n * @param {Object} mapper The mapper.\n * @param {Object} props The update to apply to the selected records.\n * @param {Object} [query] Selection query.\n * @param {Object} [opts] Configuration options.\n * @param {boolean} [opts.raw=false] Whether to return a more detailed\n * response object.\n * @param {Object} [opts.updateOpts] Options to pass to collection#update.\n * @return {Promise}\n */\n updateAll (mapper, props, query, opts) {\n const self = this\n props || (props = {})\n query || (query = {})\n opts || (opts = {})\n let op, ids\n const updateOpts = self.getOpt('updateOpts', opts)\n updateOpts.multi = true\n\n return self.getClient().then(function (client) {\n const queryOptions = self.getQueryOptions(mapper, query)\n const mongoQuery = self.getQuery(mapper, query)\n\n // beforeUpdateAll lifecycle hook\n op = opts.op = 'beforeUpdateAll'\n return resolve(self[op](mapper, props, query, opts)).then(function (_props) {\n // Allow for re-assignment from lifecycle hook\n props = isUndefined(_props) ? props : _props\n _props = withoutRelations(mapper, props)\n queryOptions.$set = _props\n return self.findAll(mapper, query, { raw: false })\n }).then(function (records) {\n ids = records.map(function (record) {\n return self.toObjectID(mapper, record[mapper.idAttribute])\n })\n\n return new Promise(function (resolve, reject) {\n const collection = client.collection(mapper.table || underscore(mapper.name))\n collection[collection.updateMany ? 'updateMany' : 'update'](mongoQuery, queryOptions, updateOpts, function (err, cursor) {\n return err ? reject(err) : resolve(cursor)\n })\n })\n }).then(function (cursor) {\n const query = {}\n query[mapper.idAttribute] = {\n 'in': ids\n }\n return self.findAll(mapper, query, { raw: false }).then(function (records) {\n cursor.connection = undefined\n let response = new Response(records, cursor, 'update')\n response.updated = records.length\n response = self.respond(response, opts)\n\n // afterUpdateAll lifecycle hook\n op = opts.op = 'afterUpdateAll'\n return resolve(self[op](mapper, props, query, opts, response)).then(function (_response) {\n // Allow for re-assignment from lifecycle hook\n return isUndefined(_response) ? response : _response\n })\n })\n })\n })\n },\n\n /**\n * Not supported.\n *\n * @name MongoDBAdapter#updateMany\n * @method\n */\n updateMany () {\n throw new Error('not supported!')\n }\n})\n"],"names":["utils","Adapter","reserved","ObjectID","Response"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"js-data-mongodb.js","sources":["../src/index.js"],"sourcesContent":["import {MongoClient} from 'mongodb'\nimport {ObjectID} from 'bson'\nimport {utils} from 'js-data'\nimport Adapter from 'js-data-adapter'\nimport {\n reserved,\n Response\n} from 'js-data-adapter'\nimport underscore from 'mout/string/underscore'\nimport unique from 'mout/array/unique'\n\nconst {\n addHiddenPropsToTarget,\n classCallCheck,\n extend,\n fillIn,\n forEachRelation,\n forOwn,\n get,\n isArray,\n isObject,\n isString,\n isUndefined,\n omit,\n plainCopy,\n resolve\n} = utils\n\nconst withoutRelations = function (mapper, props) {\n return omit(props, mapper.relationFields || [])\n}\n\nconst DEFAULTS = {\n /**\n * Convert ObjectIDs to strings when pulling records out of the database.\n *\n * @name MongoDBAdapter#translateId\n * @type {boolean}\n * @default true\n */\n translateId: true,\n\n /**\n * MongoDB URI.\n *\n * @name MongoDBAdapter#uri\n * @type {string}\n * @default mongodb://localhost:27017\n */\n uri: 'mongodb://localhost:27017'\n}\n\nconst FIND_OPTS_DEFAULTS = {}\nconst FIND_ONE_OPTS_DEFAULTS = {}\nconst INSERT_OPTS_DEFAULTS = {}\nconst INSERT_MANY_OPTS_DEFAULTS = {}\nconst UPDATE_OPTS_DEFAULTS = {}\nconst REMOVE_OPTS_DEFAULTS = {}\n\n/**\n * MongoDBAdapter class.\n *\n * @example\n * // Use Container instead of DataStore on the server\n * import {Container} from 'js-data'\n * import MongoDBAdapter from 'js-data-mongodb'\n *\n * // Create a store to hold your Mappers\n * const store = new Container({\n * mapperDefaults: {\n * // MongoDB uses \"_id\" as the primary key\n * idAttribute: '_id'\n * }\n * })\n *\n * // Create an instance of MongoDBAdapter with default settings\n * const adapter = new MongoDBAdapter()\n *\n * // Mappers in \"store\" will use the MongoDB adapter by default\n * store.registerAdapter('mongodb', adapter, { default: true })\n *\n * // Create a Mapper that maps to a \"user\" collection\n * store.defineMapper('user')\n *\n * @class MongoDBAdapter\n * @extends Adapter\n * @param {Object} [opts] Configuration opts.\n * @param {boolean} [opts.debug=false] Whether to log debugging information.\n * @param {Object} [opts.findOpts] Options to pass to collection#find.\n * @param {Object} [opts.findOneOpts] Options to pass to collection#findOne.\n * @param {Object} [opts.insertOpts] Options to pass to collection#insert.\n * @param {Object} [opts.insertManyOpts] Options to pass to\n * collection#insertMany.\n * @param {boolean} [opts.raw=false] Whether to return detailed result objects\n * instead of just record data.\n * @param {Object} [opts.removeOpts] Options to pass to collection#remove.\n * @param {boolean} [opts.translateId=true] Convert ObjectIDs to strings when\n * pulling records out of the database.\n * @param {Object} [opts.updateOpts] Options to pass to collection#update.\n * @param {string} [opts.uri=\"mongodb://localhost:27017\"] MongoDB URI.\n */\nexport default function MongoDBAdapter (opts) {\n const self = this\n classCallCheck(self, MongoDBAdapter)\n opts || (opts = {})\n if (isString(opts)) {\n opts = { uri: opts }\n }\n fillIn(opts, DEFAULTS)\n Adapter.call(self, opts)\n\n /**\n * Default options to pass to collection#find.\n *\n * @name MongoDBAdapter#findOpts\n * @type {Object}\n * @default {}\n */\n self.findOpts || (self.findOpts = {})\n fillIn(self.findOpts, FIND_OPTS_DEFAULTS)\n\n /**\n * Default options to pass to collection#findOne.\n *\n * @name MongoDBAdapter#findOneOpts\n * @type {Object}\n * @default {}\n */\n self.findOneOpts || (self.findOneOpts = {})\n fillIn(self.findOneOpts, FIND_ONE_OPTS_DEFAULTS)\n\n /**\n * Default options to pass to collection#insert.\n *\n * @name MongoDBAdapter#insertOpts\n * @type {Object}\n * @default {}\n */\n self.insertOpts || (self.insertOpts = {})\n fillIn(self.insertOpts, INSERT_OPTS_DEFAULTS)\n\n /**\n * Default options to pass to collection#insertMany.\n *\n * @name MongoDBAdapter#insertManyOpts\n * @type {Object}\n * @default {}\n */\n self.insertManyOpts || (self.insertManyOpts = {})\n fillIn(self.insertManyOpts, INSERT_MANY_OPTS_DEFAULTS)\n\n /**\n * Default options to pass to collection#update.\n *\n * @name MongoDBAdapter#updateOpts\n * @type {Object}\n * @default {}\n */\n self.updateOpts || (self.updateOpts = {})\n fillIn(self.updateOpts, UPDATE_OPTS_DEFAULTS)\n\n /**\n * Default options to pass to collection#update.\n *\n * @name MongoDBAdapter#removeOpts\n * @type {Object}\n * @default {}\n */\n self.removeOpts || (self.removeOpts = {})\n fillIn(self.removeOpts, REMOVE_OPTS_DEFAULTS)\n\n /**\n * A Promise that resolves to a reference to the MongoDB client being used by\n * this adapter.\n *\n * @name MongoDBAdapter#client\n * @type {Object}\n */\n self.client = new Promise(function (resolve, reject) {\n MongoClient.connect(opts.uri, function (err, db) {\n return err ? reject(err) : resolve(db)\n })\n })\n}\n\n// Setup prototype inheritance from Adapter\nMongoDBAdapter.prototype = Object.create(Adapter.prototype, {\n constructor: {\n value: MongoDBAdapter,\n enumerable: false,\n writable: true,\n configurable: true\n }\n})\n\nObject.defineProperty(MongoDBAdapter, '__super__', {\n configurable: true,\n value: Adapter\n})\n\n/**\n * Alternative to ES6 class syntax for extending `MongoDBAdapter`.\n *\n * @name MongoDBAdapter.extend\n * @method\n * @param {Object} [instanceProps] Properties that will be added to the\n * prototype of the MongoDBAdapter.\n * @param {Object} [classProps] Properties that will be added as static\n * properties to the MongoDBAdapter itself.\n * @return {Object} MongoDBAdapter of `MongoDBAdapter`.\n */\nMongoDBAdapter.extend = extend\n\naddHiddenPropsToTarget(MongoDBAdapter.prototype, {\n /**\n * Translate ObjectIDs to strings.\n *\n * @name MongoDBAdapter#_translateId\n * @method\n * @return {*}\n */\n _translateId (r, opts) {\n opts || (opts = {})\n if (this.getOpt('translateId', opts)) {\n if (isArray(r)) {\n r.forEach(function (_r) {\n const __id = _r._id ? _r._id.toString() : _r._id\n _r._id = typeof __id === 'string' ? __id : _r._id\n })\n } else if (isObject(r)) {\n const __id = r._id ? r._id.toString() : r._id\n r._id = typeof __id === 'string' ? __id : r._id\n }\n }\n return r\n },\n\n /**\n * Return a Promise that resolves to a reference to the MongoDB client being\n * used by this adapter.\n *\n * Useful when you need to do anything custom with the MongoDB client library.\n *\n * @name MongoDBAdapter#getClient\n * @method\n * @return {Object} MongoDB client.\n */\n getClient () {\n return this.client\n },\n\n /**\n * Map filtering params in a selection query to MongoDB a filtering object.\n *\n * Handles the following:\n *\n * - where\n * - and bunch of filtering operators\n *\n * @name MongoDBAdapter#getQuery\n * @method\n * @return {Object}\n */\n getQuery (mapper, query) {\n query = plainCopy(query || {})\n query.where || (query.where = {})\n\n forOwn(query, function (config, keyword) {\n if (reserved.indexOf(keyword) === -1) {\n if (isObject(config)) {\n query.where[keyword] = config\n } else {\n query.where[keyword] = {\n '==': config\n }\n }\n delete query[keyword]\n }\n })\n\n let mongoQuery = {}\n\n if (Object.keys(query.where).length !== 0) {\n forOwn(query.where, function (criteria, field) {\n if (!isObject(criteria)) {\n query.where[field] = {\n '==': criteria\n }\n }\n forOwn(criteria, function (v, op) {\n if (op === '==' || op === '===' || op === 'contains') {\n mongoQuery[field] = v\n } else if (op === '!=' || op === '!==' || op === 'notContains') {\n mongoQuery[field] = mongoQuery[field] || {}\n mongoQuery[field].$ne = v\n } else if (op === '>') {\n mongoQuery[field] = mongoQuery[field] || {}\n mongoQuery[field].$gt = v\n } else if (op === '>=') {\n mongoQuery[field] = mongoQuery[field] || {}\n mongoQuery[field].$gte = v\n } else if (op === '<') {\n mongoQuery[field] = mongoQuery[field] || {}\n mongoQuery[field].$lt = v\n } else if (op === '<=') {\n mongoQuery[field] = mongoQuery[field] || {}\n mongoQuery[field].$lte = v\n } else if (op === 'in') {\n mongoQuery[field] = mongoQuery[field] || {}\n mongoQuery[field].$in = v\n } else if (op === 'notIn') {\n mongoQuery[field] = mongoQuery[field] || {}\n mongoQuery[field].$nin = v\n } else if (op === '|==' || op === '|===' || op === '|contains') {\n mongoQuery.$or = mongoQuery.$or || []\n let orEqQuery = {}\n orEqQuery[field] = v\n mongoQuery.$or.push(orEqQuery)\n } else if (op === '|!=' || op === '|!==' || op === '|notContains') {\n mongoQuery.$or = mongoQuery.$or || []\n let orNeQuery = {}\n orNeQuery[field] = {\n '$ne': v\n }\n mongoQuery.$or.push(orNeQuery)\n } else if (op === '|>') {\n mongoQuery.$or = mongoQuery.$or || []\n let orGtQuery = {}\n orGtQuery[field] = {\n '$gt': v\n }\n mongoQuery.$or.push(orGtQuery)\n } else if (op === '|>=') {\n mongoQuery.$or = mongoQuery.$or || []\n let orGteQuery = {}\n orGteQuery[field] = {\n '$gte': v\n }\n mongoQuery.$or.push(orGteQuery)\n } else if (op === '|<') {\n mongoQuery.$or = mongoQuery.$or || []\n let orLtQuery = {}\n orLtQuery[field] = {\n '$lt': v\n }\n mongoQuery.$or.push(orLtQuery)\n } else if (op === '|<=') {\n mongoQuery.$or = mongoQuery.$or || []\n let orLteQuery = {}\n orLteQuery[field] = {\n '$lte': v\n }\n mongoQuery.$or.push(orLteQuery)\n } else if (op === '|in') {\n mongoQuery.$or = mongoQuery.$or || []\n let orInQuery = {}\n orInQuery[field] = {\n '$in': v\n }\n mongoQuery.$or.push(orInQuery)\n } else if (op === '|notIn') {\n mongoQuery.$or = mongoQuery.$or || []\n let orNinQuery = {}\n orNinQuery[field] = {\n '$nin': v\n }\n mongoQuery.$or.push(orNinQuery)\n }\n })\n })\n }\n\n return mongoQuery\n },\n\n /**\n * Map non-filtering params in a selection query to MongoDB query options.\n *\n * Handles the following:\n *\n * - limit\n * - skip/offset\n * - orderBy/sort\n *\n * @name MongoDBAdapter#getQueryOptions\n * @method\n * @return {Object}\n */\n getQueryOptions (mapper, query) {\n query = plainCopy(query || {})\n query.orderBy = query.orderBy || query.sort\n query.skip = query.skip || query.offset\n\n let queryOptions = {}\n\n if (query.orderBy) {\n if (isString(query.orderBy)) {\n query.orderBy = [\n [query.orderBy, 'asc']\n ]\n }\n for (var i = 0; i < query.orderBy.length; i++) {\n if (isString(query.orderBy[i])) {\n query.orderBy[i] = [query.orderBy[i], 'asc']\n }\n }\n queryOptions.sort = query.orderBy\n }\n\n if (query.skip) {\n queryOptions.skip = +query.skip\n }\n\n if (query.limit) {\n queryOptions.limit = +query.limit\n }\n\n return queryOptions\n },\n\n /**\n * Turn an _id into an ObjectID if it isn't already an ObjectID.\n *\n * @name MongoDBAdapter#toObjectID\n * @method\n * @return {*}\n */\n toObjectID (mapper, id) {\n if (id !== undefined && mapper.idAttribute === '_id' && typeof id === 'string' && ObjectID.isValid(id) && !(id instanceof ObjectID)) {\n return new ObjectID(id)\n }\n return id\n },\n\n /**\n * Return the foreignKey from the given record for the provided relationship.\n *\n * @name MongoDBAdapter#makeBelongsToForeignKey\n * @method\n * @return {*}\n */\n makeBelongsToForeignKey (mapper, def, record) {\n return this.toObjectID(def.getRelation(), Adapter.prototype.makeBelongsToForeignKey.call(this, mapper, def, record))\n },\n\n /**\n * Retrieve the record with the given primary key.\n *\n * @name MongoDBAdapter#find\n * @method\n * @param {Object} mapper The mapper.\n * @param {(string|number)} id Primary key of the record to retrieve.\n * @param {Object} [opts] Configuration options.\n * @param {Object} [opts.findOneOpts] Options to pass to collection#findOne.\n * @param {boolean} [opts.raw=false] Whether to return a more detailed\n * response object.\n * @param {string[]} [opts.with=[]] Relations to eager load.\n * @return {Promise}\n */\n find (mapper, id, opts) {\n const self = this\n let record, op\n opts || (opts = {})\n opts.with || (opts.with = [])\n\n const findOneOpts = self.getOpt('findOneOpts', opts)\n findOneOpts.fields || (findOneOpts.fields = {})\n\n return self.getClient().then(function (client) {\n // beforeFind lifecycle hook\n op = opts.op = 'beforeFind'\n return resolve(self[op](mapper, id, opts)).then(function () {\n return new Promise(function (resolve, reject) {\n let mongoQuery = {}\n mongoQuery[mapper.idAttribute] = self.toObjectID(mapper, id)\n client.collection(mapper.table || underscore(mapper.name)).findOne(mongoQuery, findOneOpts, function (err, cursor) {\n return err ? reject(err) : resolve(cursor)\n })\n })\n })\n }).then(function (_record) {\n if (!_record) {\n return\n }\n record = _record\n self._translateId(record, opts)\n const tasks = []\n\n forEachRelation(mapper, opts, function (def, __opts) {\n const relatedMapper = def.getRelation()\n let task\n\n if (def.foreignKey && (def.type === 'hasOne' || def.type === 'hasMany')) {\n if (def.type === 'hasOne') {\n task = self.loadHasOne(mapper, def, record, __opts)\n } else {\n task = self.loadHasMany(mapper, def, record, __opts)\n }\n } else if (def.type === 'hasMany' && def.localKeys) {\n let localKeys = []\n let itemKeys = get(record, def.localKeys) || []\n itemKeys = isArray(itemKeys) ? itemKeys : Object.keys(itemKeys)\n localKeys = localKeys.concat(itemKeys)\n task = self.findAll(relatedMapper, {\n where: {\n [relatedMapper.idAttribute]: {\n 'in': unique(localKeys).filter(function (x) { return x }).map(function (x) { return self.toObjectID(relatedMapper, x) })\n }\n }\n }, __opts).then(function (relatedItems) {\n def.setLocalField(record, relatedItems)\n })\n } else if (def.type === 'hasMany' && def.foreignKeys) {\n task = self.findAll(relatedMapper, {\n where: {\n [def.foreignKeys]: {\n 'contains': self.makeHasManyForeignKeys(mapper, def, record)\n }\n }\n }, __opts).then(function (relatedItems) {\n def.setLocalField(record, relatedItems)\n })\n } else if (def.type === 'belongsTo') {\n task = self.loadBelongsTo(mapper, def, record, __opts)\n }\n if (task) {\n tasks.push(task)\n }\n })\n\n return Promise.all(tasks)\n }).then(function () {\n let response = new Response(record, {}, 'find')\n response.found = record ? 1 : 0\n response = self.respond(response, opts)\n\n // afterFind lifecycle hook\n op = opts.op = 'afterFind'\n return resolve(self[op](mapper, id, opts, response)).then(function (_response) {\n // Allow for re-assignment from lifecycle hook\n return isUndefined(_response) ? response : _response\n })\n })\n },\n\n /**\n * Retrieve the records that match the selection query.\n *\n * @name MongoDBAdapter#findAll\n * @method\n * @param {Object} mapper The mapper.\n * @param {Object} query Selection query.\n * @param {Object} [opts] Configuration options.\n * @param {Object} [opts.findOpts] Options to pass to collection#find.\n * @param {boolean} [opts.raw=false] Whether to return a more detailed\n * response object.\n * @param {string[]} [opts.with=[]] Relations to eager load.\n * @return {Promise}\n */\n findAll (mapper, query, opts) {\n const self = this\n opts || (opts = {})\n opts.with || (opts.with = [])\n\n let records = []\n let op\n const findOpts = self.getOpt('findOpts', opts)\n fillIn(findOpts, self.getQueryOptions(mapper, query))\n findOpts.fields || (findOpts.fields = {})\n const mongoQuery = self.getQuery(mapper, query)\n\n return self.getClient().then(function (client) {\n // beforeFindAll lifecycle hook\n op = opts.op = 'beforeFindAll'\n return resolve(self[op](mapper, query, opts)).then(function () {\n return new Promise(function (resolve, reject) {\n client.collection(mapper.table || underscore(mapper.name)).find(mongoQuery, findOpts).toArray(function (err, cursor) {\n return err ? reject(err) : resolve(cursor)\n })\n })\n })\n }).then(function (_records) {\n records = _records\n self._translateId(records, opts)\n const tasks = []\n forEachRelation(mapper, opts, function (def, __opts) {\n const relatedMapper = def.getRelation()\n let task\n if (def.foreignKey && (def.type === 'hasOne' || def.type === 'hasMany')) {\n if (def.type === 'hasMany') {\n task = self.loadHasMany(mapper, def, records, __opts)\n } else {\n task = self.loadHasOne(mapper, def, records, __opts)\n }\n } else if (def.type === 'hasMany' && def.localKeys) {\n let localKeys = []\n records.forEach(function (item) {\n let itemKeys = item[def.localKeys] || []\n itemKeys = isArray(itemKeys) ? itemKeys : Object.keys(itemKeys)\n localKeys = localKeys.concat(itemKeys)\n })\n task = self.findAll(relatedMapper, {\n where: {\n [relatedMapper.idAttribute]: {\n 'in': unique(localKeys).filter(function (x) { return x }).map(function (x) { return self.toObjectID(relatedMapper, x) })\n }\n }\n }, __opts).then(function (relatedItems) {\n records.forEach(function (item) {\n let attached = []\n let itemKeys = get(item, def.localKeys) || []\n itemKeys = isArray(itemKeys) ? itemKeys : Object.keys(itemKeys)\n relatedItems.forEach(function (relatedItem) {\n if (itemKeys && itemKeys.indexOf(relatedItem[relatedMapper.idAttribute]) !== -1) {\n attached.push(relatedItem)\n }\n })\n def.setLocalField(item, attached)\n })\n return relatedItems\n })\n } else if (def.type === 'hasMany' && def.foreignKeys) {\n throw new Error('findAll eager load hasMany foreignKeys not supported!')\n } else if (def.type === 'belongsTo') {\n task = self.loadBelongsTo(mapper, def, records, __opts)\n }\n if (task) {\n tasks.push(task)\n }\n })\n return Promise.all(tasks)\n }).then(function () {\n records || (records = [])\n let response = new Response(records, {}, 'findAll')\n response.found = records.length\n response = self.respond(response, opts)\n\n // afterFindAll lifecycle hook\n op = opts.op = 'afterFindAll'\n return resolve(self[op](mapper, query, opts, response)).then(function (_response) {\n // Allow for re-assignment from lifecycle hook\n return isUndefined(_response) ? response : _response\n })\n })\n },\n\n /**\n * Create a new record.\n *\n * @name MongoDBAdapter#create\n * @method\n * @param {Object} mapper The mapper.\n * @param {Object} props The record to be created.\n * @param {Object} [opts] Configuration options.\n * @param {Object} [opts.insertOpts] Options to pass to collection#insert.\n * @param {boolean} [opts.raw=false] Whether to return a more detailed\n * response object.\n * @return {Promise}\n */\n create (mapper, props, opts) {\n const self = this\n let op\n props || (props = {})\n opts || (opts = {})\n\n const insertOpts = self.getOpt('insertOpts', opts)\n\n return self.getClient().then(function (client) {\n // beforeCreate lifecycle hook\n op = opts.op = 'beforeCreate'\n return resolve(self[op](mapper, props, opts)).then(function (_props) {\n // Allow for re-assignment from lifecycle hook\n props = isUndefined(_props) ? props : _props\n _props = withoutRelations(mapper, props)\n return new Promise(function (resolve, reject) {\n const collection = client.collection(mapper.table || underscore(mapper.name))\n const method = collection.insertOne ? 'insertOne' : 'insert'\n collection[method](_props, insertOpts, function (err, cursor) {\n return err ? reject(err) : resolve(cursor)\n })\n })\n }).then(function (cursor) {\n let record\n let r = cursor.ops ? cursor.ops : cursor\n self._translateId(r, opts)\n record = isArray(r) ? r[0] : r\n cursor.connection = undefined\n let response = new Response(record, cursor, 'create')\n response.created = record ? 1 : 0\n response = self.respond(response, opts)\n\n // afterCreate lifecycle hook\n op = opts.op = 'afterCreate'\n return resolve(self[op](mapper, props, opts, response)).then(function (_response) {\n // Allow for re-assignment from lifecycle hook\n return isUndefined(_response) ? response : _response\n })\n })\n })\n },\n\n /**\n * Create multiple records in a single batch.\n *\n * @name MongoDBAdapter#createMany\n * @method\n * @param {Object} mapper The mapper.\n * @param {Object} props The records to be created.\n * @param {Object} [opts] Configuration options.\n * @param {Object} [opts.insertManyOpts] Options to pass to\n * collection#insertMany.\n * @param {boolean} [opts.raw=false] Whether to return a more detailed\n * response object.\n * @return {Promise}\n */\n createMany (mapper, props, opts) {\n const self = this\n let op\n props || (props = {})\n opts || (opts = {})\n\n const insertManyOpts = self.getOpt('insertManyOpts', opts)\n\n return self.getClient().then(function (client) {\n // beforeCreateMany lifecycle hook\n op = opts.op = 'beforeCreateMany'\n return resolve(self[op](mapper, props, opts)).then(function (_props) {\n // Allow for re-assignment from lifecycle hook\n props = isUndefined(_props) ? props : _props\n _props = props.map(function (record) {\n return withoutRelations(mapper, record)\n })\n return new Promise(function (resolve, reject) {\n const collection = client.collection(mapper.table || underscore(mapper.name))\n collection.insertMany(_props, insertManyOpts, function (err, cursor) {\n return err ? reject(err) : resolve(cursor)\n })\n })\n }).then(function (cursor) {\n let records = []\n let r = cursor.ops ? cursor.ops : cursor\n self._translateId(r, opts)\n records = r\n cursor.connection = undefined\n let response = new Response(records, cursor, 'createMany')\n response.created = records.length\n response = self.respond(response, opts)\n\n // afterCreateMany lifecycle hook\n op = opts.op = 'afterCreateMany'\n return resolve(self[op](mapper, props, opts, response)).then(function (_response) {\n // Allow for re-assignment from lifecycle hook\n return isUndefined(_response) ? response : _response\n })\n })\n })\n },\n\n /**\n * Destroy the record with the given primary key.\n *\n * @name MongoDBAdapter#destroy\n * @method\n * @param {Object} mapper The mapper.\n * @param {(string|number)} id Primary key of the record to destroy.\n * @param {Object} [opts] Configuration options.\n * @param {boolean} [opts.raw=false] Whether to return a more detailed\n * response object.\n * @param {Object} [opts.removeOpts] Options to pass to collection#remove.\n * @return {Promise}\n */\n destroy (mapper, id, opts) {\n const self = this\n let op\n opts || (opts = {})\n const removeOpts = self.getOpt('removeOpts', opts)\n\n return self.getClient().then(function (client) {\n // beforeDestroy lifecycle hook\n op = opts.op = 'beforeDestroy'\n return resolve(self[op](mapper, id, opts)).then(function () {\n return new Promise(function (resolve, reject) {\n const mongoQuery = {}\n mongoQuery[mapper.idAttribute] = self.toObjectID(mapper, id)\n const collection = client.collection(mapper.table || underscore(mapper.name))\n collection[collection.deleteOne ? 'deleteOne' : 'remove'](mongoQuery, removeOpts, function (err, cursor) {\n return err ? reject(err) : resolve(cursor)\n })\n })\n })\n }).then(function (cursor) {\n cursor.connection = undefined\n let response = new Response(undefined, cursor, 'destroy')\n response = self.respond(response, opts)\n\n // afterDestroy lifecycle hook\n op = opts.op = 'afterDestroy'\n return resolve(self[op](mapper, id, opts, response)).then(function (_response) {\n // Allow for re-assignment from lifecycle hook\n return isUndefined(_response) ? response : _response\n })\n })\n },\n\n /**\n * Destroy the records that match the selection query.\n *\n * @name MongoDBAdapter#destroyAll\n * @method\n * @param {Object} mapper the mapper.\n * @param {Object} [query] Selection query.\n * @param {Object} [opts] Configuration options.\n * @param {boolean} [opts.raw=false] Whether to return a more detailed\n * response object.\n * @param {Object} [opts.removeOpts] Options to pass to collection#remove.\n * @return {Promise}\n */\n destroyAll (mapper, query, opts) {\n const self = this\n let op\n query || (query = {})\n opts || (opts = {})\n const removeOpts = self.getOpt('removeOpts', opts)\n fillIn(removeOpts, self.getQueryOptions(mapper, query))\n\n return self.getClient().then(function (client) {\n // beforeDestroyAll lifecycle hook\n op = opts.op = 'beforeDestroyAll'\n return resolve(self[op](mapper, query, opts)).then(function () {\n const mongoQuery = self.getQuery(mapper, query)\n return new Promise(function (resolve, reject) {\n const collection = client.collection(mapper.table || underscore(mapper.name))\n collection[collection.deleteMany ? 'deleteMany' : 'remove'](mongoQuery, removeOpts, function (err, cursor) {\n return err ? reject(err) : resolve(cursor)\n })\n })\n })\n }).then(function (cursor) {\n cursor.connection = undefined\n let response = new Response(undefined, cursor, 'destroyAll')\n response = self.respond(response, opts)\n\n // afterDestroyAll lifecycle hook\n op = opts.op = 'afterDestroyAll'\n return resolve(self[op](mapper, query, opts, response)).then(function (_response) {\n // Allow for re-assignment from lifecycle hook\n return isUndefined(_response) ? response : _response\n })\n })\n },\n\n /**\n * Apply the given update to the record with the specified primary key.\n *\n * @name MongoDBAdapter#update\n * @method\n * @param {Object} mapper The mapper.\n * @param {(string|number)} id The primary key of the record to be updated.\n * @param {Object} props The update to apply to the record.\n * @param {Object} [opts] Configuration options.\n * @param {boolean} [opts.raw=false] Whether to return a more detailed\n * response object.\n * @param {Object} [opts.updateOpts] Options to pass to collection#update.\n * @return {Promise}\n */\n update (mapper, id, props, opts) {\n const self = this\n props || (props = {})\n opts || (opts = {})\n let op\n const updateOpts = self.getOpt('updateOpts', opts)\n\n return self.find(mapper, id, { raw: false }).then(function (record) {\n if (!record) {\n throw new Error('Not Found')\n }\n // beforeUpdate lifecycle hook\n op = opts.op = 'beforeUpdate'\n return resolve(self[op](mapper, id, props, opts))\n }).then(function (_props) {\n // Allow for re-assignment from lifecycle hook\n props = isUndefined(_props) ? props : _props\n _props = withoutRelations(mapper, props)\n return self.getClient().then(function (client) {\n return new Promise(function (resolve, reject) {\n const mongoQuery = {}\n mongoQuery[mapper.idAttribute] = self.toObjectID(mapper, id)\n const collection = client.collection(mapper.table || underscore(mapper.name))\n collection[collection.updateOne ? 'updateOne' : 'update'](mongoQuery, { $set: _props }, updateOpts, function (err, cursor) {\n return err ? reject(err) : resolve(cursor)\n })\n })\n })\n }).then(function (cursor) {\n return self.find(mapper, id, { raw: false }).then(function (record) {\n cursor.connection = undefined\n let response = new Response(record, cursor, 'update')\n response.updated = 1\n response = self.respond(response, opts)\n\n // afterUpdate lifecycle hook\n op = opts.op = 'afterUpdate'\n return resolve(self[op](mapper, id, props, opts, response)).then(function (_response) {\n // Allow for re-assignment from lifecycle hook\n return isUndefined(_response) ? response : _response\n })\n })\n })\n },\n\n /**\n * Apply the given update to all records that match the selection query.\n *\n * @name MongoDBAdapter#updateAll\n * @method\n * @param {Object} mapper The mapper.\n * @param {Object} props The update to apply to the selected records.\n * @param {Object} [query] Selection query.\n * @param {Object} [opts] Configuration options.\n * @param {boolean} [opts.raw=false] Whether to return a more detailed\n * response object.\n * @param {Object} [opts.updateOpts] Options to pass to collection#update.\n * @return {Promise}\n */\n updateAll (mapper, props, query, opts) {\n const self = this\n props || (props = {})\n query || (query = {})\n opts || (opts = {})\n let op, ids\n const updateOpts = self.getOpt('updateOpts', opts)\n updateOpts.multi = true\n\n return self.getClient().then(function (client) {\n const queryOptions = self.getQueryOptions(mapper, query)\n const mongoQuery = self.getQuery(mapper, query)\n\n // beforeUpdateAll lifecycle hook\n op = opts.op = 'beforeUpdateAll'\n return resolve(self[op](mapper, props, query, opts)).then(function (_props) {\n // Allow for re-assignment from lifecycle hook\n props = isUndefined(_props) ? props : _props\n _props = withoutRelations(mapper, props)\n queryOptions.$set = _props\n return self.findAll(mapper, query, { raw: false })\n }).then(function (records) {\n ids = records.map(function (record) {\n return self.toObjectID(mapper, record[mapper.idAttribute])\n })\n\n return new Promise(function (resolve, reject) {\n const collection = client.collection(mapper.table || underscore(mapper.name))\n collection[collection.updateMany ? 'updateMany' : 'update'](mongoQuery, queryOptions, updateOpts, function (err, cursor) {\n return err ? reject(err) : resolve(cursor)\n })\n })\n }).then(function (cursor) {\n const query = {}\n query[mapper.idAttribute] = {\n 'in': ids\n }\n return self.findAll(mapper, query, { raw: false }).then(function (records) {\n cursor.connection = undefined\n let response = new Response(records, cursor, 'update')\n response.updated = records.length\n response = self.respond(response, opts)\n\n // afterUpdateAll lifecycle hook\n op = opts.op = 'afterUpdateAll'\n return resolve(self[op](mapper, props, query, opts, response)).then(function (_response) {\n // Allow for re-assignment from lifecycle hook\n return isUndefined(_response) ? response : _response\n })\n })\n })\n })\n },\n\n /**\n * Not supported.\n *\n * @name MongoDBAdapter#updateMany\n * @method\n */\n updateMany () {\n throw new Error('not supported!')\n }\n})\n"],"names":["utils","Adapter","reserved","ObjectID","Response"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;IAYE,yBAcEA,aAdF;IACA,iBAaEA,aAbF;IACA,SAYEA,aAZF;IACA,SAWEA,aAXF;IACA,kBAUEA,aAVF;IACA,SASEA,aATF;IACA,MAQEA,aARF;IACA,UAOEA,aAPF;IACA,WAMEA,aANF;IACA,WAKEA,aALF;IACA,cAIEA,aAJF;IACA,OAGEA,aAHF;IACA,YAEEA,aAFF;IACA,UACEA,aADF;;;AAGF,IAAM,mBAAmB,SAAnB,gBAAmB,CAAU,MAAV,EAAkB,KAAlB,EAAyB;SACzC,KAAK,KAAL,EAAY,OAAO,cAAP,IAAyB,EAAzB,CAAnB,CADgD;CAAzB;;AAIzB,IAAM,WAAW;;;;;;;;eAQF,IAAb;;;;;;;;;OASK,2BAAL;CAjBI;;AAoBN,IAAM,qBAAqB,EAArB;AACN,IAAM,yBAAyB,EAAzB;AACN,IAAM,uBAAuB,EAAvB;AACN,IAAM,4BAA4B,EAA5B;AACN,IAAM,uBAAuB,EAAvB;AACN,IAAM,uBAAuB,EAAvB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA4CN,AAAe,SAAS,cAAT,CAAyB,IAAzB,EAA+B;MACtC,OAAO,IAAP,CADsC;iBAE7B,IAAf,EAAqB,cAArB,EAF4C;WAGnC,OAAO,EAAP,CAAT,CAH4C;MAIxC,SAAS,IAAT,CAAJ,EAAoB;WACX,EAAE,KAAK,IAAL,EAAT,CADkB;GAApB;SAGO,IAAP,EAAa,QAAb,EAP4C;mBAQpC,IAAR,CAAa,IAAb,EAAmB,IAAnB;;;;;;;;;MASA,CAAK,QAAL,KAAkB,KAAK,QAAL,GAAgB,EAAhB,CAAlB,CAjB4C;SAkBrC,KAAK,QAAL,EAAe,kBAAtB;;;;;;;;;MASA,CAAK,WAAL,KAAqB,KAAK,WAAL,GAAmB,EAAnB,CAArB,CA3B4C;SA4BrC,KAAK,WAAL,EAAkB,sBAAzB;;;;;;;;;MASA,CAAK,UAAL,KAAoB,KAAK,UAAL,GAAkB,EAAlB,CAApB,CArC4C;SAsCrC,KAAK,UAAL,EAAiB,oBAAxB;;;;;;;;;MASA,CAAK,cAAL,KAAwB,KAAK,cAAL,GAAsB,EAAtB,CAAxB,CA/C4C;SAgDrC,KAAK,cAAL,EAAqB,yBAA5B;;;;;;;;;MASA,CAAK,UAAL,KAAoB,KAAK,UAAL,GAAkB,EAAlB,CAApB,CAzD4C;SA0DrC,KAAK,UAAL,EAAiB,oBAAxB;;;;;;;;;MASA,CAAK,UAAL,KAAoB,KAAK,UAAL,GAAkB,EAAlB,CAApB,CAnE4C;SAoErC,KAAK,UAAL,EAAiB,oBAAxB;;;;;;;;;MASA,CAAK,MAAL,GAAc,IAAI,OAAJ,CAAY,UAAU,OAAV,EAAmB,MAAnB,EAA2B;wBACvC,OAAZ,CAAoB,KAAK,GAAL,EAAU,UAAU,GAAV,EAAe,EAAf,EAAmB;aACxC,MAAM,OAAO,GAAP,CAAN,GAAoB,QAAQ,EAAR,CAApB,CADwC;KAAnB,CAA9B,CADmD;GAA3B,CAA1B,CA7E4C;CAA/B;;;AAqFf,eAAe,SAAf,GAA2B,OAAO,MAAP,CAAcC,iBAAQ,SAAR,EAAmB;eAC7C;WACJ,cAAP;gBACY,KAAZ;cACU,IAAV;kBACc,IAAd;GAJF;CADyB,CAA3B;;AASA,OAAO,cAAP,CAAsB,cAAtB,EAAsC,WAAtC,EAAmD;gBACnC,IAAd;SACOA,gBAAP;CAFF;;;;;;;;;;;;;AAgBA,eAAe,MAAf,GAAwB,MAAxB;;AAEA,uBAAuB,eAAe,SAAf,EAA0B;;;;;;;;;sCAQjC,GAAG,MAAM;aACZ,OAAO,EAAP,CAAT,CADqB;QAEjB,KAAK,MAAL,CAAY,aAAZ,EAA2B,IAA3B,CAAJ,EAAsC;UAChC,QAAQ,CAAR,CAAJ,EAAgB;UACZ,OAAF,CAAU,UAAU,EAAV,EAAc;cAChB,OAAO,GAAG,GAAH,GAAS,GAAG,GAAH,CAAO,QAAP,EAAT,GAA6B,GAAG,GAAH,CADpB;aAEnB,GAAH,GAAS,OAAO,IAAP,KAAgB,QAAhB,GAA2B,IAA3B,GAAkC,GAAG,GAAH,CAFrB;SAAd,CAAV,CADc;OAAhB,MAKO,IAAI,SAAS,CAAT,CAAJ,EAAiB;YAChB,OAAO,EAAE,GAAF,GAAQ,EAAE,GAAF,CAAM,QAAN,EAAR,GAA2B,EAAE,GAAF,CADlB;UAEpB,GAAF,GAAQ,OAAO,IAAP,KAAgB,QAAhB,GAA2B,IAA3B,GAAkC,EAAE,GAAF,CAFpB;OAAjB;KANT;WAWO,CAAP,CAbqB;GARwB;;;;;;;;;;;;;kCAkClC;WACJ,KAAK,MAAL,CADI;GAlCkC;;;;;;;;;;;;;;;8BAkDrC,QAAQ,OAAO;YACf,UAAU,SAAS,EAAT,CAAlB,CADuB;UAEjB,KAAN,KAAgB,MAAM,KAAN,GAAc,EAAd,CAAhB,CAFuB;;WAIhB,KAAP,EAAc,UAAU,MAAV,EAAkB,OAAlB,EAA2B;UACnCC,iBAAS,OAAT,CAAiB,OAAjB,MAA8B,CAAC,CAAD,EAAI;YAChC,SAAS,MAAT,CAAJ,EAAsB;gBACd,KAAN,CAAY,OAAZ,IAAuB,MAAvB,CADoB;SAAtB,MAEO;gBACC,KAAN,CAAY,OAAZ,IAAuB;kBACf,MAAN;WADF,CADK;SAFP;eAOO,MAAM,OAAN,CAAP,CARoC;OAAtC;KADY,CAAd,CAJuB;;QAiBnB,aAAa,EAAb,CAjBmB;;QAmBnB,OAAO,IAAP,CAAY,MAAM,KAAN,CAAZ,CAAyB,MAAzB,KAAoC,CAApC,EAAuC;aAClC,MAAM,KAAN,EAAa,UAAU,QAAV,EAAoB,KAApB,EAA2B;YACzC,CAAC,SAAS,QAAT,CAAD,EAAqB;gBACjB,KAAN,CAAY,KAAZ,IAAqB;kBACb,QAAN;WADF,CADuB;SAAzB;eAKO,QAAP,EAAiB,UAAU,CAAV,EAAa,EAAb,EAAiB;cAC5B,OAAO,IAAP,IAAe,OAAO,KAAP,IAAgB,OAAO,UAAP,EAAmB;uBACzC,KAAX,IAAoB,CAApB,CADoD;WAAtD,MAEO,IAAI,OAAO,IAAP,IAAe,OAAO,KAAP,IAAgB,OAAO,aAAP,EAAsB;uBACnD,KAAX,IAAoB,WAAW,KAAX,KAAqB,EAArB,CAD0C;uBAEnD,KAAX,EAAkB,GAAlB,GAAwB,CAAxB,CAF8D;WAAzD,MAGA,IAAI,OAAO,GAAP,EAAY;uBACV,KAAX,IAAoB,WAAW,KAAX,KAAqB,EAArB,CADC;uBAEV,KAAX,EAAkB,GAAlB,GAAwB,CAAxB,CAFqB;WAAhB,MAGA,IAAI,OAAO,IAAP,EAAa;uBACX,KAAX,IAAoB,WAAW,KAAX,KAAqB,EAArB,CADE;uBAEX,KAAX,EAAkB,IAAlB,GAAyB,CAAzB,CAFsB;WAAjB,MAGA,IAAI,OAAO,GAAP,EAAY;uBACV,KAAX,IAAoB,WAAW,KAAX,KAAqB,EAArB,CADC;uBAEV,KAAX,EAAkB,GAAlB,GAAwB,CAAxB,CAFqB;WAAhB,MAGA,IAAI,OAAO,IAAP,EAAa;uBACX,KAAX,IAAoB,WAAW,KAAX,KAAqB,EAArB,CADE;uBAEX,KAAX,EAAkB,IAAlB,GAAyB,CAAzB,CAFsB;WAAjB,MAGA,IAAI,OAAO,IAAP,EAAa;uBACX,KAAX,IAAoB,WAAW,KAAX,KAAqB,EAArB,CADE;uBAEX,KAAX,EAAkB,GAAlB,GAAwB,CAAxB,CAFsB;WAAjB,MAGA,IAAI,OAAO,OAAP,EAAgB;uBACd,KAAX,IAAoB,WAAW,KAAX,KAAqB,EAArB,CADK;uBAEd,KAAX,EAAkB,IAAlB,GAAyB,CAAzB,CAFyB;WAApB,MAGA,IAAI,OAAO,KAAP,IAAgB,OAAO,MAAP,IAAiB,OAAO,WAAP,EAAoB;uBACnD,GAAX,GAAiB,WAAW,GAAX,IAAkB,EAAlB,CAD6C;gBAE1D,YAAY,EAAZ,CAF0D;sBAGpD,KAAV,IAAmB,CAAnB,CAH8D;uBAInD,GAAX,CAAe,IAAf,CAAoB,SAApB,EAJ8D;WAAzD,MAKA,IAAI,OAAO,KAAP,IAAgB,OAAO,MAAP,IAAiB,OAAO,cAAP,EAAuB;uBACtD,GAAX,GAAiB,WAAW,GAAX,IAAkB,EAAlB,CADgD;gBAE7D,YAAY,EAAZ,CAF6D;sBAGvD,KAAV,IAAmB;qBACV,CAAP;aADF,CAHiE;uBAMtD,GAAX,CAAe,IAAf,CAAoB,SAApB,EANiE;WAA5D,MAOA,IAAI,OAAO,IAAP,EAAa;uBACX,GAAX,GAAiB,WAAW,GAAX,IAAkB,EAAlB,CADK;gBAElB,YAAY,EAAZ,CAFkB;sBAGZ,KAAV,IAAmB;qBACV,CAAP;aADF,CAHsB;uBAMX,GAAX,CAAe,IAAf,CAAoB,SAApB,EANsB;WAAjB,MAOA,IAAI,OAAO,KAAP,EAAc;uBACZ,GAAX,GAAiB,WAAW,GAAX,IAAkB,EAAlB,CADM;gBAEnB,aAAa,EAAb,CAFmB;uBAGZ,KAAX,IAAoB;sBACV,CAAR;aADF,CAHuB;uBAMZ,GAAX,CAAe,IAAf,CAAoB,UAApB,EANuB;WAAlB,MAOA,IAAI,OAAO,IAAP,EAAa;uBACX,GAAX,GAAiB,WAAW,GAAX,IAAkB,EAAlB,CADK;gBAElB,YAAY,EAAZ,CAFkB;sBAGZ,KAAV,IAAmB;qBACV,CAAP;aADF,CAHsB;uBAMX,GAAX,CAAe,IAAf,CAAoB,SAApB,EANsB;WAAjB,MAOA,IAAI,OAAO,KAAP,EAAc;uBACZ,GAAX,GAAiB,WAAW,GAAX,IAAkB,EAAlB,CADM;gBAEnB,aAAa,EAAb,CAFmB;uBAGZ,KAAX,IAAoB;sBACV,CAAR;aADF,CAHuB;uBAMZ,GAAX,CAAe,IAAf,CAAoB,UAApB,EANuB;WAAlB,MAOA,IAAI,OAAO,KAAP,EAAc;uBACZ,GAAX,GAAiB,WAAW,GAAX,IAAkB,EAAlB,CADM;gBAEnB,YAAY,EAAZ,CAFmB;sBAGb,KAAV,IAAmB;qBACV,CAAP;aADF,CAHuB;uBAMZ,GAAX,CAAe,IAAf,CAAoB,SAApB,EANuB;WAAlB,MAOA,IAAI,OAAO,QAAP,EAAiB;uBACf,GAAX,GAAiB,WAAW,GAAX,IAAkB,EAAlB,CADS;gBAEtB,aAAa,EAAb,CAFsB;uBAGf,KAAX,IAAoB;sBACV,CAAR;aADF,CAH0B;uBAMf,GAAX,CAAe,IAAf,CAAoB,UAApB,EAN0B;WAArB;SAvEQ,CAAjB,CAN6C;OAA3B,CAApB,CADyC;KAA3C;;WA0FO,UAAP,CA7GuB;GAlDsB;;;;;;;;;;;;;;;;4CA+K9B,QAAQ,OAAO;YACtB,UAAU,SAAS,EAAT,CAAlB,CAD8B;UAExB,OAAN,GAAgB,MAAM,OAAN,IAAiB,MAAM,IAAN,CAFH;UAGxB,IAAN,GAAa,MAAM,IAAN,IAAc,MAAM,MAAN,CAHG;;QAK1B,eAAe,EAAf,CAL0B;;QAO1B,MAAM,OAAN,EAAe;UACb,SAAS,MAAM,OAAN,CAAb,EAA6B;cACrB,OAAN,GAAgB,CACd,CAAC,MAAM,OAAN,EAAe,KAAhB,CADc,CAAhB,CAD2B;OAA7B;WAKK,IAAI,IAAI,CAAJ,EAAO,IAAI,MAAM,OAAN,CAAc,MAAd,EAAsB,GAA1C,EAA+C;YACzC,SAAS,MAAM,OAAN,CAAc,CAAd,CAAT,CAAJ,EAAgC;gBACxB,OAAN,CAAc,CAAd,IAAmB,CAAC,MAAM,OAAN,CAAc,CAAd,CAAD,EAAmB,KAAnB,CAAnB,CAD8B;SAAhC;OADF;mBAKa,IAAb,GAAoB,MAAM,OAAN,CAXH;KAAnB;;QAcI,MAAM,IAAN,EAAY;mBACD,IAAb,GAAoB,CAAC,MAAM,IAAN,CADP;KAAhB;;QAII,MAAM,KAAN,EAAa;mBACF,KAAb,GAAqB,CAAC,MAAM,KAAN,CADP;KAAjB;;WAIO,YAAP,CA7B8B;GA/Ke;;;;;;;;;;kCAsNnC,QAAQ,IAAI;QAClB,OAAO,SAAP,IAAoB,OAAO,WAAP,KAAuB,KAAvB,IAAgC,OAAO,EAAP,KAAc,QAAd,IAA0BC,cAAS,OAAT,CAAiB,EAAjB,CAA9E,IAAsG,EAAE,cAAcA,aAAd,CAAF,EAA2B;aAC5H,IAAIA,aAAJ,CAAa,EAAb,CAAP,CADmI;KAArI;WAGO,EAAP,CAJsB;GAtNuB;;;;;;;;;;4DAoOtB,QAAQ,KAAK,QAAQ;WACrC,KAAK,UAAL,CAAgB,IAAI,WAAJ,EAAhB,EAAmCF,iBAAQ,SAAR,CAAkB,uBAAlB,CAA0C,IAA1C,CAA+C,IAA/C,EAAqD,MAArD,EAA6D,GAA7D,EAAkE,MAAlE,CAAnC,CAAP,CAD4C;GApOC;;;;;;;;;;;;;;;;;sBAsPzC,QAAQ,IAAI,MAAM;QAChB,OAAO,IAAP,CADgB;QAElB,eAAJ;QAAY,WAAZ,CAFsB;aAGb,OAAO,EAAP,CAAT,CAHsB;SAIjB,IAAL,KAAc,KAAK,IAAL,GAAY,EAAZ,CAAd,CAJsB;;QAMhB,cAAc,KAAK,MAAL,CAAY,aAAZ,EAA2B,IAA3B,CAAd,CANgB;gBAOV,MAAZ,KAAuB,YAAY,MAAZ,GAAqB,EAArB,CAAvB,CAPsB;;WASf,KAAK,SAAL,GAAiB,IAAjB,CAAsB,UAAU,MAAV,EAAkB;;WAExC,KAAK,EAAL,GAAU,YAAV,CAFwC;aAGtC,QAAQ,KAAK,EAAL,EAAS,MAAT,EAAiB,EAAjB,EAAqB,IAArB,CAAR,EAAoC,IAApC,CAAyC,YAAY;eACnD,IAAI,OAAJ,CAAY,UAAU,OAAV,EAAmB,MAAnB,EAA2B;cACxC,aAAa,EAAb,CADwC;qBAEjC,OAAO,WAAP,CAAX,GAAiC,KAAK,UAAL,CAAgB,MAAhB,EAAwB,EAAxB,CAAjC,CAF4C;iBAGrC,UAAP,CAAkB,OAAO,KAAP,IAAgB,WAAW,OAAO,IAAP,CAA3B,CAAlB,CAA2D,OAA3D,CAAmE,UAAnE,EAA+E,WAA/E,EAA4F,UAAU,GAAV,EAAe,MAAf,EAAuB;mBAC1G,MAAM,OAAO,GAAP,CAAN,GAAoB,QAAQ,MAAR,CAApB,CAD0G;WAAvB,CAA5F,CAH4C;SAA3B,CAAnB,CAD0D;OAAZ,CAAhD,CAH6C;KAAlB,CAAtB,CAYJ,IAZI,CAYC,UAAU,OAAV,EAAmB;UACrB,CAAC,OAAD,EAAU;eAAA;OAAd;eAGS,OAAT,CAJyB;WAKpB,YAAL,CAAkB,MAAlB,EAA0B,IAA1B,EALyB;UAMnB,QAAQ,EAAR,CANmB;;sBAQT,MAAhB,EAAwB,IAAxB,EAA8B,UAAU,GAAV,EAAe,MAAf,EAAuB;YAC7C,gBAAgB,IAAI,WAAJ,EAAhB,CAD6C;YAE/C,aAAJ,CAFmD;;YAI/C,IAAI,UAAJ,KAAmB,IAAI,IAAJ,KAAa,QAAb,IAAyB,IAAI,IAAJ,KAAa,SAAb,CAA5C,EAAqE;cACnE,IAAI,IAAJ,KAAa,QAAb,EAAuB;mBAClB,KAAK,UAAL,CAAgB,MAAhB,EAAwB,GAAxB,EAA6B,MAA7B,EAAqC,MAArC,CAAP,CADyB;WAA3B,MAEO;mBACE,KAAK,WAAL,CAAiB,MAAjB,EAAyB,GAAzB,EAA8B,MAA9B,EAAsC,MAAtC,CAAP,CADK;WAFP;SADF,MAMO,IAAI,IAAI,IAAJ,KAAa,SAAb,IAA0B,IAAI,SAAJ,EAAe;cAC9C,YAAY,EAAZ,CAD8C;cAE9C,WAAW,IAAI,MAAJ,EAAY,IAAI,SAAJ,CAAZ,IAA8B,EAA9B,CAFmC;qBAGvC,QAAQ,QAAR,IAAoB,QAApB,GAA+B,OAAO,IAAP,CAAY,QAAZ,CAA/B,CAHuC;sBAItC,UAAU,MAAV,CAAiB,QAAjB,CAAZ,CAJkD;iBAK3C,KAAK,OAAL,CAAa,aAAb,EAA4B;mDAE9B,cAAc,WAAd,EAA4B;oBACrB,OAAO,SAAP,EAAkB,MAAlB,CAAyB,UAAU,CAAV,EAAa;uBAAS,CAAP,CAAF;eAAb,CAAzB,CAAoD,GAApD,CAAwD,UAAU,CAAV,EAAa;uBAAS,KAAK,UAAL,CAAgB,aAAhB,EAA+B,CAA/B,CAAP,CAAF;eAAb,CAA9D;cAFJ;WADK,EAMJ,MANI,EAMI,IANJ,CAMS,UAAU,YAAV,EAAwB;gBAClC,aAAJ,CAAkB,MAAlB,EAA0B,YAA1B,EADsC;WAAxB,CANhB,CALkD;SAA7C,MAcA,IAAI,IAAI,IAAJ,KAAa,SAAb,IAA0B,IAAI,WAAJ,EAAiB;iBAC7C,KAAK,OAAL,CAAa,aAAb,EAA4B;mDAE9B,IAAI,WAAJ,EAAkB;0BACL,KAAK,sBAAL,CAA4B,MAA5B,EAAoC,GAApC,EAAyC,MAAzC,CAAZ;cAFJ;WADK,EAMJ,MANI,EAMI,IANJ,CAMS,UAAU,YAAV,EAAwB;gBAClC,aAAJ,CAAkB,MAAlB,EAA0B,YAA1B,EADsC;WAAxB,CANhB,CADoD;SAA/C,MAUA,IAAI,IAAI,IAAJ,KAAa,WAAb,EAA0B;iBAC5B,KAAK,aAAL,CAAmB,MAAnB,EAA2B,GAA3B,EAAgC,MAAhC,EAAwC,MAAxC,CAAP,CADmC;SAA9B;YAGH,IAAJ,EAAU;gBACF,IAAN,CAAW,IAAX,EADQ;SAAV;OArC4B,CAA9B,CARyB;;aAkDlB,QAAQ,GAAR,CAAY,KAAZ,CAAP,CAlDyB;KAAnB,CAZD,CA+DJ,IA/DI,CA+DC,YAAY;UACd,WAAW,IAAIG,gBAAJ,CAAa,MAAb,EAAqB,EAArB,EAAyB,MAAzB,CAAX,CADc;eAET,KAAT,GAAiB,SAAS,CAAT,GAAa,CAAb,CAFC;iBAGP,KAAK,OAAL,CAAa,QAAb,EAAuB,IAAvB,CAAX;;;QAGA,GAAK,KAAK,EAAL,GAAU,WAAV,CANa;aAOX,QAAQ,KAAK,EAAL,EAAS,MAAT,EAAiB,EAAjB,EAAqB,IAArB,EAA2B,QAA3B,CAAR,EAA8C,IAA9C,CAAmD,UAAU,SAAV,EAAqB;;eAEtE,YAAY,SAAZ,IAAyB,QAAzB,GAAoC,SAApC,CAFsE;OAArB,CAA1D,CAPkB;KAAZ,CA/DR,CATsB;GAtPuB;;;;;;;;;;;;;;;;;4BA0VtC,QAAQ,OAAO,MAAM;QACtB,OAAO,IAAP,CADsB;aAEnB,OAAO,EAAP,CAAT,CAF4B;SAGvB,IAAL,KAAc,KAAK,IAAL,GAAY,EAAZ,CAAd,CAH4B;;QAKxB,UAAU,EAAV,CALwB;QAMxB,WAAJ,CAN4B;QAOtB,WAAW,KAAK,MAAL,CAAY,UAAZ,EAAwB,IAAxB,CAAX,CAPsB;WAQrB,QAAP,EAAiB,KAAK,eAAL,CAAqB,MAArB,EAA6B,KAA7B,CAAjB,EAR4B;aASnB,MAAT,KAAoB,SAAS,MAAT,GAAkB,EAAlB,CAApB,CAT4B;QAUtB,aAAa,KAAK,QAAL,CAAc,MAAd,EAAsB,KAAtB,CAAb,CAVsB;;WAYrB,KAAK,SAAL,GAAiB,IAAjB,CAAsB,UAAU,MAAV,EAAkB;;WAExC,KAAK,EAAL,GAAU,eAAV,CAFwC;aAGtC,QAAQ,KAAK,EAAL,EAAS,MAAT,EAAiB,KAAjB,EAAwB,IAAxB,CAAR,EAAuC,IAAvC,CAA4C,YAAY;eACtD,IAAI,OAAJ,CAAY,UAAU,OAAV,EAAmB,MAAnB,EAA2B;iBACrC,UAAP,CAAkB,OAAO,KAAP,IAAgB,WAAW,OAAO,IAAP,CAA3B,CAAlB,CAA2D,IAA3D,CAAgE,UAAhE,EAA4E,QAA5E,EAAsF,OAAtF,CAA8F,UAAU,GAAV,EAAe,MAAf,EAAuB;mBAC5G,MAAM,OAAO,GAAP,CAAN,GAAoB,QAAQ,MAAR,CAApB,CAD4G;WAAvB,CAA9F,CAD4C;SAA3B,CAAnB,CAD6D;OAAZ,CAAnD,CAH6C;KAAlB,CAAtB,CAUJ,IAVI,CAUC,UAAU,QAAV,EAAoB;gBAChB,QAAV,CAD0B;WAErB,YAAL,CAAkB,OAAlB,EAA2B,IAA3B,EAF0B;UAGpB,QAAQ,EAAR,CAHoB;sBAIV,MAAhB,EAAwB,IAAxB,EAA8B,UAAU,GAAV,EAAe,MAAf,EAAuB;YAC7C,gBAAgB,IAAI,WAAJ,EAAhB,CAD6C;YAE/C,aAAJ,CAFmD;YAG/C,IAAI,UAAJ,KAAmB,IAAI,IAAJ,KAAa,QAAb,IAAyB,IAAI,IAAJ,KAAa,SAAb,CAA5C,EAAqE;cACnE,IAAI,IAAJ,KAAa,SAAb,EAAwB;mBACnB,KAAK,WAAL,CAAiB,MAAjB,EAAyB,GAAzB,EAA8B,OAA9B,EAAuC,MAAvC,CAAP,CAD0B;WAA5B,MAEO;mBACE,KAAK,UAAL,CAAgB,MAAhB,EAAwB,GAAxB,EAA6B,OAA7B,EAAsC,MAAtC,CAAP,CADK;WAFP;SADF,MAMO,IAAI,IAAI,IAAJ,KAAa,SAAb,IAA0B,IAAI,SAAJ,EAAe;;gBAC9C,YAAY,EAAZ;oBACI,OAAR,CAAgB,UAAU,IAAV,EAAgB;kBAC1B,WAAW,KAAK,IAAI,SAAJ,CAAL,IAAuB,EAAvB,CADe;yBAEnB,QAAQ,QAAR,IAAoB,QAApB,GAA+B,OAAO,IAAP,CAAY,QAAZ,CAA/B,CAFmB;0BAGlB,UAAU,MAAV,CAAiB,QAAjB,CAAZ,CAH8B;aAAhB,CAAhB;mBAKO,KAAK,OAAL,CAAa,aAAb,EAA4B;qDAE9B,cAAc,WAAd,EAA4B;sBACrB,OAAO,SAAP,EAAkB,MAAlB,CAAyB,UAAU,CAAV,EAAa;yBAAS,CAAP,CAAF;iBAAb,CAAzB,CAAoD,GAApD,CAAwD,UAAU,CAAV,EAAa;yBAAS,KAAK,UAAL,CAAgB,aAAhB,EAA+B,CAA/B,CAAP,CAAF;iBAAb,CAA9D;gBAFJ;aADK,EAMJ,MANI,EAMI,IANJ,CAMS,UAAU,YAAV,EAAwB;sBAC9B,OAAR,CAAgB,UAAU,IAAV,EAAgB;oBAC1B,WAAW,EAAX,CAD0B;oBAE1B,WAAW,IAAI,IAAJ,EAAU,IAAI,SAAJ,CAAV,IAA4B,EAA5B,CAFe;2BAGnB,QAAQ,QAAR,IAAoB,QAApB,GAA+B,OAAO,IAAP,CAAY,QAAZ,CAA/B,CAHmB;6BAIjB,OAAb,CAAqB,UAAU,WAAV,EAAuB;sBACtC,YAAY,SAAS,OAAT,CAAiB,YAAY,cAAc,WAAd,CAA7B,MAA6D,CAAC,CAAD,EAAI;6BACtE,IAAT,CAAc,WAAd,EAD+E;mBAAjF;iBADmB,CAArB,CAJ8B;oBAS1B,aAAJ,CAAkB,IAAlB,EAAwB,QAAxB,EAT8B;eAAhB,CAAhB,CADsC;qBAY/B,YAAP,CAZsC;aAAxB,CANhB;eAPkD;SAA7C,MA2BA,IAAI,IAAI,IAAJ,KAAa,SAAb,IAA0B,IAAI,WAAJ,EAAiB;gBAC9C,IAAI,KAAJ,CAAU,uDAAV,CAAN,CADoD;SAA/C,MAEA,IAAI,IAAI,IAAJ,KAAa,WAAb,EAA0B;iBAC5B,KAAK,aAAL,CAAmB,MAAnB,EAA2B,GAA3B,EAAgC,OAAhC,EAAyC,MAAzC,CAAP,CADmC;SAA9B;YAGH,IAAJ,EAAU;gBACF,IAAN,CAAW,IAAX,EADQ;SAAV;OAzC4B,CAA9B,CAJ0B;aAiDnB,QAAQ,GAAR,CAAY,KAAZ,CAAP,CAjD0B;KAApB,CAVD,CA4DJ,IA5DI,CA4DC,YAAY;kBACN,UAAU,EAAV,CAAZ,CADkB;UAEd,WAAW,IAAIA,gBAAJ,CAAa,OAAb,EAAsB,EAAtB,EAA0B,SAA1B,CAAX,CAFc;eAGT,KAAT,GAAiB,QAAQ,MAAR,CAHC;iBAIP,KAAK,OAAL,CAAa,QAAb,EAAuB,IAAvB,CAAX;;;QAGA,GAAK,KAAK,EAAL,GAAU,cAAV,CAPa;aAQX,QAAQ,KAAK,EAAL,EAAS,MAAT,EAAiB,KAAjB,EAAwB,IAAxB,EAA8B,QAA9B,CAAR,EAAiD,IAAjD,CAAsD,UAAU,SAAV,EAAqB;;eAEzE,YAAY,SAAZ,IAAyB,QAAzB,GAAoC,SAApC,CAFyE;OAArB,CAA7D,CARkB;KAAZ,CA5DR,CAZ4B;GA1ViB;;;;;;;;;;;;;;;;0BA8bvC,QAAQ,OAAO,MAAM;QACrB,OAAO,IAAP,CADqB;QAEvB,WAAJ,CAF2B;cAGjB,QAAQ,EAAR,CAAV,CAH2B;aAIlB,OAAO,EAAP,CAAT,CAJ2B;;QAMrB,aAAa,KAAK,MAAL,CAAY,YAAZ,EAA0B,IAA1B,CAAb,CANqB;;WAQpB,KAAK,SAAL,GAAiB,IAAjB,CAAsB,UAAU,MAAV,EAAkB;;WAExC,KAAK,EAAL,GAAU,cAAV,CAFwC;aAGtC,QAAQ,KAAK,EAAL,EAAS,MAAT,EAAiB,KAAjB,EAAwB,IAAxB,CAAR,EAAuC,IAAvC,CAA4C,UAAU,MAAV,EAAkB;;gBAE3D,YAAY,MAAZ,IAAsB,KAAtB,GAA8B,MAA9B,CAF2D;iBAG1D,iBAAiB,MAAjB,EAAyB,KAAzB,CAAT,CAHmE;eAI5D,IAAI,OAAJ,CAAY,UAAU,OAAV,EAAmB,MAAnB,EAA2B;cACtC,aAAa,OAAO,UAAP,CAAkB,OAAO,KAAP,IAAgB,WAAW,OAAO,IAAP,CAA3B,CAA/B,CADsC;cAEtC,SAAS,WAAW,SAAX,GAAuB,WAAvB,GAAqC,QAArC,CAF6B;qBAGjC,MAAX,EAAmB,MAAnB,EAA2B,UAA3B,EAAuC,UAAU,GAAV,EAAe,MAAf,EAAuB;mBACrD,MAAM,OAAO,GAAP,CAAN,GAAoB,QAAQ,MAAR,CAApB,CADqD;WAAvB,CAAvC,CAH4C;SAA3B,CAAnB,CAJmE;OAAlB,CAA5C,CAWJ,IAXI,CAWC,UAAU,MAAV,EAAkB;YACpB,eAAJ,CADwB;YAEpB,IAAI,OAAO,GAAP,GAAa,OAAO,GAAP,GAAa,MAA1B,CAFgB;aAGnB,YAAL,CAAkB,CAAlB,EAAqB,IAArB,EAHwB;iBAIf,QAAQ,CAAR,IAAa,EAAE,CAAF,CAAb,GAAoB,CAApB,CAJe;eAKjB,UAAP,GAAoB,SAApB,CALwB;YAMpB,WAAW,IAAIA,gBAAJ,CAAa,MAAb,EAAqB,MAArB,EAA6B,QAA7B,CAAX,CANoB;iBAOf,OAAT,GAAmB,SAAS,CAAT,GAAa,CAAb,CAPK;mBAQb,KAAK,OAAL,CAAa,QAAb,EAAuB,IAAvB,CAAX;;;UAGA,GAAK,KAAK,EAAL,GAAU,aAAV,CAXmB;eAYjB,QAAQ,KAAK,EAAL,EAAS,MAAT,EAAiB,KAAjB,EAAwB,IAAxB,EAA8B,QAA9B,CAAR,EAAiD,IAAjD,CAAsD,UAAU,SAAV,EAAqB;;iBAEzE,YAAY,SAAZ,IAAyB,QAAzB,GAAoC,SAApC,CAFyE;SAArB,CAA7D,CAZwB;OAAlB,CAXR,CAH6C;KAAlB,CAA7B,CAR2B;GA9bkB;;;;;;;;;;;;;;;;;kCAsfnC,QAAQ,OAAO,MAAM;QACzB,OAAO,IAAP,CADyB;QAE3B,WAAJ,CAF+B;cAGrB,QAAQ,EAAR,CAAV,CAH+B;aAItB,OAAO,EAAP,CAAT,CAJ+B;;QAMzB,iBAAiB,KAAK,MAAL,CAAY,gBAAZ,EAA8B,IAA9B,CAAjB,CANyB;;WAQxB,KAAK,SAAL,GAAiB,IAAjB,CAAsB,UAAU,MAAV,EAAkB;;WAExC,KAAK,EAAL,GAAU,kBAAV,CAFwC;aAGtC,QAAQ,KAAK,EAAL,EAAS,MAAT,EAAiB,KAAjB,EAAwB,IAAxB,CAAR,EAAuC,IAAvC,CAA4C,UAAU,MAAV,EAAkB;;gBAE3D,YAAY,MAAZ,IAAsB,KAAtB,GAA8B,MAA9B,CAF2D;iBAG1D,MAAM,GAAN,CAAU,UAAU,MAAV,EAAkB;iBAC5B,iBAAiB,MAAjB,EAAyB,MAAzB,CAAP,CADmC;SAAlB,CAAnB,CAHmE;eAM5D,IAAI,OAAJ,CAAY,UAAU,OAAV,EAAmB,MAAnB,EAA2B;cACtC,aAAa,OAAO,UAAP,CAAkB,OAAO,KAAP,IAAgB,WAAW,OAAO,IAAP,CAA3B,CAA/B,CADsC;qBAEjC,UAAX,CAAsB,MAAtB,EAA8B,cAA9B,EAA8C,UAAU,GAAV,EAAe,MAAf,EAAuB;mBAC5D,MAAM,OAAO,GAAP,CAAN,GAAoB,QAAQ,MAAR,CAApB,CAD4D;WAAvB,CAA9C,CAF4C;SAA3B,CAAnB,CANmE;OAAlB,CAA5C,CAYJ,IAZI,CAYC,UAAU,MAAV,EAAkB;YACpB,UAAU,EAAV,CADoB;YAEpB,IAAI,OAAO,GAAP,GAAa,OAAO,GAAP,GAAa,MAA1B,CAFgB;aAGnB,YAAL,CAAkB,CAAlB,EAAqB,IAArB,EAHwB;kBAId,CAAV,CAJwB;eAKjB,UAAP,GAAoB,SAApB,CALwB;YAMpB,WAAW,IAAIA,gBAAJ,CAAa,OAAb,EAAsB,MAAtB,EAA8B,YAA9B,CAAX,CANoB;iBAOf,OAAT,GAAmB,QAAQ,MAAR,CAPK;mBAQb,KAAK,OAAL,CAAa,QAAb,EAAuB,IAAvB,CAAX;;;UAGA,GAAK,KAAK,EAAL,GAAU,iBAAV,CAXmB;eAYjB,QAAQ,KAAK,EAAL,EAAS,MAAT,EAAiB,KAAjB,EAAwB,IAAxB,EAA8B,QAA9B,CAAR,EAAiD,IAAjD,CAAsD,UAAU,SAAV,EAAqB;;iBAEzE,YAAY,SAAZ,IAAyB,QAAzB,GAAoC,SAApC,CAFyE;SAArB,CAA7D,CAZwB;OAAlB,CAZR,CAH6C;KAAlB,CAA7B,CAR+B;GAtfc;;;;;;;;;;;;;;;;4BA8iBtC,QAAQ,IAAI,MAAM;QACnB,OAAO,IAAP,CADmB;QAErB,WAAJ,CAFyB;aAGhB,OAAO,EAAP,CAAT,CAHyB;QAInB,aAAa,KAAK,MAAL,CAAY,YAAZ,EAA0B,IAA1B,CAAb,CAJmB;;WAMlB,KAAK,SAAL,GAAiB,IAAjB,CAAsB,UAAU,MAAV,EAAkB;;WAExC,KAAK,EAAL,GAAU,eAAV,CAFwC;aAGtC,QAAQ,KAAK,EAAL,EAAS,MAAT,EAAiB,EAAjB,EAAqB,IAArB,CAAR,EAAoC,IAApC,CAAyC,YAAY;eACnD,IAAI,OAAJ,CAAY,UAAU,OAAV,EAAmB,MAAnB,EAA2B;cACtC,aAAa,EAAb,CADsC;qBAEjC,OAAO,WAAP,CAAX,GAAiC,KAAK,UAAL,CAAgB,MAAhB,EAAwB,EAAxB,CAAjC,CAF4C;cAGtC,aAAa,OAAO,UAAP,CAAkB,OAAO,KAAP,IAAgB,WAAW,OAAO,IAAP,CAA3B,CAA/B,CAHsC;qBAIjC,WAAW,SAAX,GAAuB,WAAvB,GAAqC,QAArC,CAAX,CAA0D,UAA1D,EAAsE,UAAtE,EAAkF,UAAU,GAAV,EAAe,MAAf,EAAuB;mBAChG,MAAM,OAAO,GAAP,CAAN,GAAoB,QAAQ,MAAR,CAApB,CADgG;WAAvB,CAAlF,CAJ4C;SAA3B,CAAnB,CAD0D;OAAZ,CAAhD,CAH6C;KAAlB,CAAtB,CAaJ,IAbI,CAaC,UAAU,MAAV,EAAkB;aACjB,UAAP,GAAoB,SAApB,CADwB;UAEpB,WAAW,IAAIA,gBAAJ,CAAa,SAAb,EAAwB,MAAxB,EAAgC,SAAhC,CAAX,CAFoB;iBAGb,KAAK,OAAL,CAAa,QAAb,EAAuB,IAAvB,CAAX;;;QAGA,GAAK,KAAK,EAAL,GAAU,cAAV,CANmB;aAOjB,QAAQ,KAAK,EAAL,EAAS,MAAT,EAAiB,EAAjB,EAAqB,IAArB,EAA2B,QAA3B,CAAR,EAA8C,IAA9C,CAAmD,UAAU,SAAV,EAAqB;;eAEtE,YAAY,SAAZ,IAAyB,QAAzB,GAAoC,SAApC,CAFsE;OAArB,CAA1D,CAPwB;KAAlB,CAbR,CANyB;GA9iBoB;;;;;;;;;;;;;;;;kCA4lBnC,QAAQ,OAAO,MAAM;QACzB,OAAO,IAAP,CADyB;QAE3B,WAAJ,CAF+B;cAGrB,QAAQ,EAAR,CAAV,CAH+B;aAItB,OAAO,EAAP,CAAT,CAJ+B;QAKzB,aAAa,KAAK,MAAL,CAAY,YAAZ,EAA0B,IAA1B,CAAb,CALyB;WAMxB,UAAP,EAAmB,KAAK,eAAL,CAAqB,MAArB,EAA6B,KAA7B,CAAnB,EAN+B;;WAQxB,KAAK,SAAL,GAAiB,IAAjB,CAAsB,UAAU,MAAV,EAAkB;;WAExC,KAAK,EAAL,GAAU,kBAAV,CAFwC;aAGtC,QAAQ,KAAK,EAAL,EAAS,MAAT,EAAiB,KAAjB,EAAwB,IAAxB,CAAR,EAAuC,IAAvC,CAA4C,YAAY;YACvD,aAAa,KAAK,QAAL,CAAc,MAAd,EAAsB,KAAtB,CAAb,CADuD;eAEtD,IAAI,OAAJ,CAAY,UAAU,OAAV,EAAmB,MAAnB,EAA2B;cACtC,aAAa,OAAO,UAAP,CAAkB,OAAO,KAAP,IAAgB,WAAW,OAAO,IAAP,CAA3B,CAA/B,CADsC;qBAEjC,WAAW,UAAX,GAAwB,YAAxB,GAAuC,QAAvC,CAAX,CAA4D,UAA5D,EAAwE,UAAxE,EAAoF,UAAU,GAAV,EAAe,MAAf,EAAuB;mBAClG,MAAM,OAAO,GAAP,CAAN,GAAoB,QAAQ,MAAR,CAApB,CADkG;WAAvB,CAApF,CAF4C;SAA3B,CAAnB,CAF6D;OAAZ,CAAnD,CAH6C;KAAlB,CAAtB,CAYJ,IAZI,CAYC,UAAU,MAAV,EAAkB;aACjB,UAAP,GAAoB,SAApB,CADwB;UAEpB,WAAW,IAAIA,gBAAJ,CAAa,SAAb,EAAwB,MAAxB,EAAgC,YAAhC,CAAX,CAFoB;iBAGb,KAAK,OAAL,CAAa,QAAb,EAAuB,IAAvB,CAAX;;;QAGA,GAAK,KAAK,EAAL,GAAU,iBAAV,CANmB;aAOjB,QAAQ,KAAK,EAAL,EAAS,MAAT,EAAiB,KAAjB,EAAwB,IAAxB,EAA8B,QAA9B,CAAR,EAAiD,IAAjD,CAAsD,UAAU,SAAV,EAAqB;;eAEzE,YAAY,SAAZ,IAAyB,QAAzB,GAAoC,SAApC,CAFyE;OAArB,CAA7D,CAPwB;KAAlB,CAZR,CAR+B;GA5lBc;;;;;;;;;;;;;;;;;0BA4oBvC,QAAQ,IAAI,OAAO,MAAM;QACzB,OAAO,IAAP,CADyB;cAErB,QAAQ,EAAR,CAAV,CAF+B;aAGtB,OAAO,EAAP,CAAT,CAH+B;QAI3B,WAAJ,CAJ+B;QAKzB,aAAa,KAAK,MAAL,CAAY,YAAZ,EAA0B,IAA1B,CAAb,CALyB;;WAOxB,KAAK,IAAL,CAAU,MAAV,EAAkB,EAAlB,EAAsB,EAAE,KAAK,KAAL,EAAxB,EAAsC,IAAtC,CAA2C,UAAU,MAAV,EAAkB;UAC9D,CAAC,MAAD,EAAS;cACL,IAAI,KAAJ,CAAU,WAAV,CAAN,CADW;OAAb;;QAIA,GAAK,KAAK,EAAL,GAAU,cAAV,CAL6D;aAM3D,QAAQ,KAAK,EAAL,EAAS,MAAT,EAAiB,EAAjB,EAAqB,KAArB,EAA4B,IAA5B,CAAR,CAAP,CANkE;KAAlB,CAA3C,CAOJ,IAPI,CAOC,UAAU,MAAV,EAAkB;;cAEhB,YAAY,MAAZ,IAAsB,KAAtB,GAA8B,MAA9B,CAFgB;eAGf,iBAAiB,MAAjB,EAAyB,KAAzB,CAAT,CAHwB;aAIjB,KAAK,SAAL,GAAiB,IAAjB,CAAsB,UAAU,MAAV,EAAkB;eACtC,IAAI,OAAJ,CAAY,UAAU,OAAV,EAAmB,MAAnB,EAA2B;cACtC,aAAa,EAAb,CADsC;qBAEjC,OAAO,WAAP,CAAX,GAAiC,KAAK,UAAL,CAAgB,MAAhB,EAAwB,EAAxB,CAAjC,CAF4C;cAGtC,aAAa,OAAO,UAAP,CAAkB,OAAO,KAAP,IAAgB,WAAW,OAAO,IAAP,CAA3B,CAA/B,CAHsC;qBAIjC,WAAW,SAAX,GAAuB,WAAvB,GAAqC,QAArC,CAAX,CAA0D,UAA1D,EAAsE,EAAE,MAAM,MAAN,EAAxE,EAAwF,UAAxF,EAAoG,UAAU,GAAV,EAAe,MAAf,EAAuB;mBAClH,MAAM,OAAO,GAAP,CAAN,GAAoB,QAAQ,MAAR,CAApB,CADkH;WAAvB,CAApG,CAJ4C;SAA3B,CAAnB,CAD6C;OAAlB,CAA7B,CAJwB;KAAlB,CAPD,CAqBJ,IArBI,CAqBC,UAAU,MAAV,EAAkB;aACjB,KAAK,IAAL,CAAU,MAAV,EAAkB,EAAlB,EAAsB,EAAE,KAAK,KAAL,EAAxB,EAAsC,IAAtC,CAA2C,UAAU,MAAV,EAAkB;eAC3D,UAAP,GAAoB,SAApB,CADkE;YAE9D,WAAW,IAAIA,gBAAJ,CAAa,MAAb,EAAqB,MAArB,EAA6B,QAA7B,CAAX,CAF8D;iBAGzD,OAAT,GAAmB,CAAnB,CAHkE;mBAIvD,KAAK,OAAL,CAAa,QAAb,EAAuB,IAAvB,CAAX;;;UAGA,GAAK,KAAK,EAAL,GAAU,aAAV,CAP6D;eAQ3D,QAAQ,KAAK,EAAL,EAAS,MAAT,EAAiB,EAAjB,EAAqB,KAArB,EAA4B,IAA5B,EAAkC,QAAlC,CAAR,EAAqD,IAArD,CAA0D,UAAU,SAAV,EAAqB;;iBAE7E,YAAY,SAAZ,IAAyB,QAAzB,GAAoC,SAApC,CAF6E;SAArB,CAAjE,CARkE;OAAlB,CAAlD,CADwB;KAAlB,CArBR,CAP+B;GA5oBc;;;;;;;;;;;;;;;;;gCAusBpC,QAAQ,OAAO,OAAO,MAAM;QAC/B,OAAO,IAAP,CAD+B;cAE3B,QAAQ,EAAR,CAAV,CAFqC;cAG3B,QAAQ,EAAR,CAAV,CAHqC;aAI5B,OAAO,EAAP,CAAT,CAJqC;QAKjC,WAAJ;QAAQ,YAAR,CALqC;QAM/B,aAAa,KAAK,MAAL,CAAY,YAAZ,EAA0B,IAA1B,CAAb,CAN+B;eAO1B,KAAX,GAAmB,IAAnB,CAPqC;;WAS9B,KAAK,SAAL,GAAiB,IAAjB,CAAsB,UAAU,MAAV,EAAkB;UACvC,eAAe,KAAK,eAAL,CAAqB,MAArB,EAA6B,KAA7B,CAAf,CADuC;UAEvC,aAAa,KAAK,QAAL,CAAc,MAAd,EAAsB,KAAtB,CAAb;;;QAGN,GAAK,KAAK,EAAL,GAAU,iBAAV,CALwC;aAMtC,QAAQ,KAAK,EAAL,EAAS,MAAT,EAAiB,KAAjB,EAAwB,KAAxB,EAA+B,IAA/B,CAAR,EAA8C,IAA9C,CAAmD,UAAU,MAAV,EAAkB;;gBAElE,YAAY,MAAZ,IAAsB,KAAtB,GAA8B,MAA9B,CAFkE;iBAGjE,iBAAiB,MAAjB,EAAyB,KAAzB,CAAT,CAH0E;qBAI7D,IAAb,GAAoB,MAApB,CAJ0E;eAKnE,KAAK,OAAL,CAAa,MAAb,EAAqB,KAArB,EAA4B,EAAE,KAAK,KAAL,EAA9B,CAAP,CAL0E;OAAlB,CAAnD,CAMJ,IANI,CAMC,UAAU,OAAV,EAAmB;cACnB,QAAQ,GAAR,CAAY,UAAU,MAAV,EAAkB;iBAC3B,KAAK,UAAL,CAAgB,MAAhB,EAAwB,OAAO,OAAO,WAAP,CAA/B,CAAP,CADkC;SAAlB,CAAlB,CADyB;;eAKlB,IAAI,OAAJ,CAAY,UAAU,OAAV,EAAmB,MAAnB,EAA2B;cACtC,aAAa,OAAO,UAAP,CAAkB,OAAO,KAAP,IAAgB,WAAW,OAAO,IAAP,CAA3B,CAA/B,CADsC;qBAEjC,WAAW,UAAX,GAAwB,YAAxB,GAAuC,QAAvC,CAAX,CAA4D,UAA5D,EAAwE,YAAxE,EAAsF,UAAtF,EAAkG,UAAU,GAAV,EAAe,MAAf,EAAuB;mBAChH,MAAM,OAAO,GAAP,CAAN,GAAoB,QAAQ,MAAR,CAApB,CADgH;WAAvB,CAAlG,CAF4C;SAA3B,CAAnB,CALyB;OAAnB,CAND,CAiBJ,IAjBI,CAiBC,UAAU,MAAV,EAAkB;YAClB,QAAQ,EAAR,CADkB;cAElB,OAAO,WAAP,CAAN,GAA4B;gBACpB,GAAN;SADF,CAFwB;eAKjB,KAAK,OAAL,CAAa,MAAb,EAAqB,KAArB,EAA4B,EAAE,KAAK,KAAL,EAA9B,EAA4C,IAA5C,CAAiD,UAAU,OAAV,EAAmB;iBAClE,UAAP,GAAoB,SAApB,CADyE;cAErE,WAAW,IAAIA,gBAAJ,CAAa,OAAb,EAAsB,MAAtB,EAA8B,QAA9B,CAAX,CAFqE;mBAGhE,OAAT,GAAmB,QAAQ,MAAR,CAHsD;qBAI9D,KAAK,OAAL,CAAa,QAAb,EAAuB,IAAvB,CAAX;;;YAGA,GAAK,KAAK,EAAL,GAAU,gBAAV,CAPoE;iBAQlE,QAAQ,KAAK,EAAL,EAAS,MAAT,EAAiB,KAAjB,EAAwB,KAAxB,EAA+B,IAA/B,EAAqC,QAArC,CAAR,EAAwD,IAAxD,CAA6D,UAAU,SAAV,EAAqB;;mBAEhF,YAAY,SAAZ,IAAyB,QAAzB,GAAoC,SAApC,CAFgF;WAArB,CAApE,CARyE;SAAnB,CAAxD,CALwB;OAAlB,CAjBR,CAN6C;KAAlB,CAA7B,CATqC;GAvsBQ;;;;;;;;;oCAmwBjC;UACN,IAAI,KAAJ,CAAU,gBAAV,CAAN,CADY;GAnwBiC;CAAjD;;"} \ No newline at end of file diff --git a/package.json b/package.json index 519d956..1325318 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "js-data-mongodb", "description": "MongoDB adapter for js-data.", - "version": "1.0.0-alpha.3", + "version": "1.0.0-alpha.4", "homepage": "https://github.com/js-data/js-data-mongodb", "repository": { "type": "git", diff --git a/src/index.js b/src/index.js index 79bf4ed..f77f756 100644 --- a/src/index.js +++ b/src/index.js @@ -83,6 +83,7 @@ const REMOVE_OPTS_DEFAULTS = {} * store.defineMapper('user') * * @class MongoDBAdapter + * @extends Adapter * @param {Object} [opts] Configuration opts. * @param {boolean} [opts.debug=false] Whether to log debugging information. * @param {Object} [opts.findOpts] Options to pass to collection#find. From 24a2da658c92895f2a7027ad1f9324686fa80ce7 Mon Sep 17 00:00:00 2001 From: Jason Dobry Date: Wed, 9 Mar 2016 21:55:10 -0800 Subject: [PATCH 09/36] 1.0.0-alpha.5 --- CHANGELOG.md | 5 + dist/js-data-mongodb.js | 1089 ++++++++++++++++------------------- dist/js-data-mongodb.js.map | 2 +- mocha.start.js | 28 +- package.json | 11 +- src/index.js | 1035 +++++++++++++++------------------ 6 files changed, 983 insertions(+), 1187 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index fc47576..6e5e505 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,8 @@ +##### 1.0.0-alpha.5 - 10 March 2016 + +###### Other +- Moved more common adapter functionality into js-data-adapter + ##### 1.0.0-alpha.4 - 06 March 2016 Fixed JSDoc diff --git a/dist/js-data-mongodb.js b/dist/js-data-mongodb.js index 7af4fe1..79b53f4 100644 --- a/dist/js-data-mongodb.js +++ b/dist/js-data-mongodb.js @@ -8,24 +8,46 @@ var jsData = require('js-data'); var Adapter = require('js-data-adapter'); var Adapter__default = _interopDefault(Adapter); var underscore = _interopDefault(require('mout/string/underscore')); -var unique = _interopDefault(require('mout/array/unique')); var babelHelpers = {}; -babelHelpers.defineProperty = function (obj, key, value) { - if (key in obj) { - Object.defineProperty(obj, key, { - value: value, - enumerable: true, - configurable: true, - writable: true - }); - } else { - obj[key] = value; +babelHelpers.slicedToArray = function () { + function sliceIterator(arr, i) { + var _arr = []; + var _n = true; + var _d = false; + var _e = undefined; + + try { + for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { + _arr.push(_s.value); + + if (i && _arr.length === i) break; + } + } catch (err) { + _d = true; + _e = err; + } finally { + try { + if (!_n && _i["return"]) _i["return"](); + } finally { + if (_d) throw _e; + } + } + + return _arr; } - return obj; -}; + return function (arr, i) { + if (Array.isArray(arr)) { + return arr; + } else if (Symbol.iterator in Object(arr)) { + return sliceIterator(arr, i); + } else { + throw new TypeError("Invalid attempt to destructure non-iterable instance"); + } + }; +}(); babelHelpers; @@ -33,21 +55,12 @@ var addHiddenPropsToTarget = jsData.utils.addHiddenPropsToTarget; var classCallCheck = jsData.utils.classCallCheck; var extend = jsData.utils.extend; var fillIn = jsData.utils.fillIn; -var forEachRelation = jsData.utils.forEachRelation; var forOwn = jsData.utils.forOwn; -var get = jsData.utils.get; var isArray = jsData.utils.isArray; var isObject = jsData.utils.isObject; var isString = jsData.utils.isString; -var isUndefined = jsData.utils.isUndefined; -var omit = jsData.utils.omit; var plainCopy = jsData.utils.plainCopy; -var resolve = jsData.utils.resolve; - -var withoutRelations = function withoutRelations(mapper, props) { - return omit(props, mapper.relationFields || []); -}; var DEFAULTS = { /** @@ -257,629 +270,306 @@ addHiddenPropsToTarget(MongoDBAdapter.prototype, { /** - * Return a Promise that resolves to a reference to the MongoDB client being - * used by this adapter. - * - * Useful when you need to do anything custom with the MongoDB client library. + * Create a new record. * - * @name MongoDBAdapter#getClient + * @name MongoDBAdapter#create * @method - * @return {Object} MongoDB client. + * @param {Object} mapper The mapper. + * @param {Object} props The record to be created. + * @param {Object} [opts] Configuration options. + * @param {Object} [opts.insertOpts] Options to pass to collection#insert. + * @param {boolean} [opts.raw=false] Whether to return a more detailed + * @return {Promise} */ - getClient: function getClient() { - return this.client; - }, - /** - * Map filtering params in a selection query to MongoDB a filtering object. - * - * Handles the following: + * Create a new record. Internal method used by Adapter#create. * - * - where - * - and bunch of filtering operators - * - * @name MongoDBAdapter#getQuery + * @name MongoDBAdapter#_create * @method - * @return {Object} + * @private + * @param {Object} mapper The mapper. + * @param {Object} props The record to be created. + * @param {Object} [opts] Configuration options. + * @return {Promise} */ - getQuery: function getQuery(mapper, query) { - query = plainCopy(query || {}); - query.where || (query.where = {}); - - forOwn(query, function (config, keyword) { - if (Adapter.reserved.indexOf(keyword) === -1) { - if (isObject(config)) { - query.where[keyword] = config; - } else { - query.where[keyword] = { - '==': config - }; - } - delete query[keyword]; - } - }); + _create: function _create(mapper, props, opts) { + var self = this; + props || (props = {}); + opts || (opts = {}); + props = plainCopy(props); - var mongoQuery = {}; + var insertOpts = self.getOpt('insertOpts', opts); - if (Object.keys(query.where).length !== 0) { - forOwn(query.where, function (criteria, field) { - if (!isObject(criteria)) { - query.where[field] = { - '==': criteria - }; - } - forOwn(criteria, function (v, op) { - if (op === '==' || op === '===' || op === 'contains') { - mongoQuery[field] = v; - } else if (op === '!=' || op === '!==' || op === 'notContains') { - mongoQuery[field] = mongoQuery[field] || {}; - mongoQuery[field].$ne = v; - } else if (op === '>') { - mongoQuery[field] = mongoQuery[field] || {}; - mongoQuery[field].$gt = v; - } else if (op === '>=') { - mongoQuery[field] = mongoQuery[field] || {}; - mongoQuery[field].$gte = v; - } else if (op === '<') { - mongoQuery[field] = mongoQuery[field] || {}; - mongoQuery[field].$lt = v; - } else if (op === '<=') { - mongoQuery[field] = mongoQuery[field] || {}; - mongoQuery[field].$lte = v; - } else if (op === 'in') { - mongoQuery[field] = mongoQuery[field] || {}; - mongoQuery[field].$in = v; - } else if (op === 'notIn') { - mongoQuery[field] = mongoQuery[field] || {}; - mongoQuery[field].$nin = v; - } else if (op === '|==' || op === '|===' || op === '|contains') { - mongoQuery.$or = mongoQuery.$or || []; - var orEqQuery = {}; - orEqQuery[field] = v; - mongoQuery.$or.push(orEqQuery); - } else if (op === '|!=' || op === '|!==' || op === '|notContains') { - mongoQuery.$or = mongoQuery.$or || []; - var orNeQuery = {}; - orNeQuery[field] = { - '$ne': v - }; - mongoQuery.$or.push(orNeQuery); - } else if (op === '|>') { - mongoQuery.$or = mongoQuery.$or || []; - var orGtQuery = {}; - orGtQuery[field] = { - '$gt': v - }; - mongoQuery.$or.push(orGtQuery); - } else if (op === '|>=') { - mongoQuery.$or = mongoQuery.$or || []; - var orGteQuery = {}; - orGteQuery[field] = { - '$gte': v - }; - mongoQuery.$or.push(orGteQuery); - } else if (op === '|<') { - mongoQuery.$or = mongoQuery.$or || []; - var orLtQuery = {}; - orLtQuery[field] = { - '$lt': v - }; - mongoQuery.$or.push(orLtQuery); - } else if (op === '|<=') { - mongoQuery.$or = mongoQuery.$or || []; - var orLteQuery = {}; - orLteQuery[field] = { - '$lte': v - }; - mongoQuery.$or.push(orLteQuery); - } else if (op === '|in') { - mongoQuery.$or = mongoQuery.$or || []; - var orInQuery = {}; - orInQuery[field] = { - '$in': v - }; - mongoQuery.$or.push(orInQuery); - } else if (op === '|notIn') { - mongoQuery.$or = mongoQuery.$or || []; - var orNinQuery = {}; - orNinQuery[field] = { - '$nin': v - }; - mongoQuery.$or.push(orNinQuery); - } + return self.getClient().then(function (client) { + return new Promise(function (resolve, reject) { + var collection = client.collection(mapper.table || underscore(mapper.name)); + var method = collection.insertOne ? 'insertOne' : 'insert'; + collection[method](props, insertOpts, function (err, cursor) { + return err ? reject(err) : resolve(cursor); }); }); - } - - return mongoQuery; + }).then(function (cursor) { + var record = void 0; + var r = cursor.ops ? cursor.ops : cursor; + self._translateId(r, opts); + record = isArray(r) ? r[0] : r; + cursor.connection = undefined; + return [record, cursor]; + }); }, /** - * Map non-filtering params in a selection query to MongoDB query options. - * - * Handles the following: - * - * - limit - * - skip/offset - * - orderBy/sort + * Create multiple records in a single batch. * - * @name MongoDBAdapter#getQueryOptions + * @name MongoDBAdapter#createMany * @method - * @return {Object} + * @param {Object} mapper The mapper. + * @param {Object} props The records to be created. + * @param {Object} [opts] Configuration options. + * @param {Object} [opts.insertManyOpts] Options to pass to + * collection#insertMany. + * @param {boolean} [opts.raw=false] Whether to return a more detailed + * response object. + * @return {Promise} */ - getQueryOptions: function getQueryOptions(mapper, query) { - query = plainCopy(query || {}); - query.orderBy = query.orderBy || query.sort; - query.skip = query.skip || query.offset; - - var queryOptions = {}; - - if (query.orderBy) { - if (isString(query.orderBy)) { - query.orderBy = [[query.orderBy, 'asc']]; - } - for (var i = 0; i < query.orderBy.length; i++) { - if (isString(query.orderBy[i])) { - query.orderBy[i] = [query.orderBy[i], 'asc']; - } - } - queryOptions.sort = query.orderBy; - } - - if (query.skip) { - queryOptions.skip = +query.skip; - } - - if (query.limit) { - queryOptions.limit = +query.limit; - } - - return queryOptions; - }, - /** - * Turn an _id into an ObjectID if it isn't already an ObjectID. + * Create multiple records in a single batch. Internal method used by + * Adapter#createMany. * - * @name MongoDBAdapter#toObjectID + * @name MongoDBAdapter#_createMany * @method - * @return {*} + * @private + * @param {Object} mapper The mapper. + * @param {Object} props The records to be created. + * @param {Object} [opts] Configuration options. + * @return {Promise} */ - toObjectID: function toObjectID(mapper, id) { - if (id !== undefined && mapper.idAttribute === '_id' && typeof id === 'string' && bson.ObjectID.isValid(id) && !(id instanceof bson.ObjectID)) { - return new bson.ObjectID(id); - } - return id; + _createMany: function _createMany(mapper, props, opts) { + var self = this; + props || (props = {}); + opts || (opts = {}); + props = plainCopy(props); + + var insertManyOpts = self.getOpt('insertManyOpts', opts); + + return self.getClient().then(function (client) { + return new Promise(function (resolve, reject) { + var collection = client.collection(mapper.table || underscore(mapper.name)); + collection.insertMany(props, insertManyOpts, function (err, cursor) { + return err ? reject(err) : resolve(cursor); + }); + }); + }).then(function (cursor) { + var records = []; + var r = cursor.ops ? cursor.ops : cursor; + self._translateId(r, opts); + records = r; + cursor.connection = undefined; + return [records, cursor]; + }); }, /** - * Return the foreignKey from the given record for the provided relationship. + * Destroy the record with the given primary key. * - * @name MongoDBAdapter#makeBelongsToForeignKey + * @name MongoDBAdapter#destroy * @method - * @return {*} + * @param {Object} mapper The mapper. + * @param {(string|number)} id Primary key of the record to destroy. + * @param {Object} [opts] Configuration options. + * @param {boolean} [opts.raw=false] Whether to return a more detailed + * response object. + * @param {Object} [opts.removeOpts] Options to pass to collection#remove. + * @return {Promise} */ - makeBelongsToForeignKey: function makeBelongsToForeignKey(mapper, def, record) { - return this.toObjectID(def.getRelation(), Adapter__default.prototype.makeBelongsToForeignKey.call(this, mapper, def, record)); - }, - /** - * Retrieve the record with the given primary key. + * Destroy the record with the given primary key. Internal method used by + * Adapter#destroy. * - * @name MongoDBAdapter#find + * @name MongoDBAdapter#_destroy * @method + * @private * @param {Object} mapper The mapper. - * @param {(string|number)} id Primary key of the record to retrieve. + * @param {(string|number)} id Primary key of the record to destroy. * @param {Object} [opts] Configuration options. - * @param {Object} [opts.findOneOpts] Options to pass to collection#findOne. - * @param {boolean} [opts.raw=false] Whether to return a more detailed - * response object. - * @param {string[]} [opts.with=[]] Relations to eager load. * @return {Promise} */ - find: function find(mapper, id, opts) { + _destroy: function _destroy(mapper, id, opts) { var self = this; - var record = void 0, - op = void 0; opts || (opts = {}); - opts.with || (opts.with = []); - - var findOneOpts = self.getOpt('findOneOpts', opts); - findOneOpts.fields || (findOneOpts.fields = {}); + var removeOpts = self.getOpt('removeOpts', opts); return self.getClient().then(function (client) { - // beforeFind lifecycle hook - op = opts.op = 'beforeFind'; - return resolve(self[op](mapper, id, opts)).then(function () { - return new Promise(function (resolve, reject) { - var mongoQuery = {}; - mongoQuery[mapper.idAttribute] = self.toObjectID(mapper, id); - client.collection(mapper.table || underscore(mapper.name)).findOne(mongoQuery, findOneOpts, function (err, cursor) { - return err ? reject(err) : resolve(cursor); - }); + return new Promise(function (resolve, reject) { + var mongoQuery = {}; + mongoQuery[mapper.idAttribute] = self.toObjectID(mapper, id); + var collection = client.collection(mapper.table || underscore(mapper.name)); + collection[collection.deleteOne ? 'deleteOne' : 'remove'](mongoQuery, removeOpts, function (err, cursor) { + return err ? reject(err) : resolve(cursor); }); }); - }).then(function (_record) { - if (!_record) { - return; - } - record = _record; - self._translateId(record, opts); - var tasks = []; - - forEachRelation(mapper, opts, function (def, __opts) { - var relatedMapper = def.getRelation(); - var task = void 0; - - if (def.foreignKey && (def.type === 'hasOne' || def.type === 'hasMany')) { - if (def.type === 'hasOne') { - task = self.loadHasOne(mapper, def, record, __opts); - } else { - task = self.loadHasMany(mapper, def, record, __opts); - } - } else if (def.type === 'hasMany' && def.localKeys) { - var localKeys = []; - var itemKeys = get(record, def.localKeys) || []; - itemKeys = isArray(itemKeys) ? itemKeys : Object.keys(itemKeys); - localKeys = localKeys.concat(itemKeys); - task = self.findAll(relatedMapper, { - where: babelHelpers.defineProperty({}, relatedMapper.idAttribute, { - 'in': unique(localKeys).filter(function (x) { - return x; - }).map(function (x) { - return self.toObjectID(relatedMapper, x); - }) - }) - }, __opts).then(function (relatedItems) { - def.setLocalField(record, relatedItems); - }); - } else if (def.type === 'hasMany' && def.foreignKeys) { - task = self.findAll(relatedMapper, { - where: babelHelpers.defineProperty({}, def.foreignKeys, { - 'contains': self.makeHasManyForeignKeys(mapper, def, record) - }) - }, __opts).then(function (relatedItems) { - def.setLocalField(record, relatedItems); - }); - } else if (def.type === 'belongsTo') { - task = self.loadBelongsTo(mapper, def, record, __opts); - } - if (task) { - tasks.push(task); - } - }); - - return Promise.all(tasks); - }).then(function () { - var response = new Adapter.Response(record, {}, 'find'); - response.found = record ? 1 : 0; - response = self.respond(response, opts); - - // afterFind lifecycle hook - op = opts.op = 'afterFind'; - return resolve(self[op](mapper, id, opts, response)).then(function (_response) { - // Allow for re-assignment from lifecycle hook - return isUndefined(_response) ? response : _response; - }); + }).then(function (cursor) { + return [undefined, cursor]; }); }, /** - * Retrieve the records that match the selection query. + * Destroy the records that match the selection query. * - * @name MongoDBAdapter#findAll + * @name MongoDBAdapter#destroyAll * @method - * @param {Object} mapper The mapper. - * @param {Object} query Selection query. + * @param {Object} mapper the mapper. + * @param {Object} [query] Selection query. + * @param {Object} [query.where] Filtering criteria. + * @param {string|Array} [query.orderBy] Sorting criteria. + * @param {string|Array} [query.sort] Same as `query.sort`. + * @param {number} [query.limit] Limit results. + * @param {number} [query.skip] Offset results. + * @param {number} [query.offset] Same as `query.skip`. * @param {Object} [opts] Configuration options. - * @param {Object} [opts.findOpts] Options to pass to collection#find. * @param {boolean} [opts.raw=false] Whether to return a more detailed * response object. - * @param {string[]} [opts.with=[]] Relations to eager load. + * @param {Object} [opts.removeOpts] Options to pass to collection#remove. * @return {Promise} */ - findAll: function findAll(mapper, query, opts) { + + /** + * Destroy the records that match the selection query. Internal method used by + * Adapter#destroyAll. + * + * @name MongoDBAdapter#_destroyAll + * @method + * @private + * @param {Object} mapper the mapper. + * @param {Object} [query] Selection query. + * @param {Object} [opts] Configuration options. + * @return {Promise} + */ + _destroyAll: function _destroyAll(mapper, query, opts) { var self = this; + query || (query = {}); opts || (opts = {}); - opts.with || (opts.with = []); - - var records = []; - var op = void 0; - var findOpts = self.getOpt('findOpts', opts); - fillIn(findOpts, self.getQueryOptions(mapper, query)); - findOpts.fields || (findOpts.fields = {}); - var mongoQuery = self.getQuery(mapper, query); + var removeOpts = self.getOpt('removeOpts', opts); + fillIn(removeOpts, self.getQueryOptions(mapper, query)); return self.getClient().then(function (client) { - // beforeFindAll lifecycle hook - op = opts.op = 'beforeFindAll'; - return resolve(self[op](mapper, query, opts)).then(function () { - return new Promise(function (resolve, reject) { - client.collection(mapper.table || underscore(mapper.name)).find(mongoQuery, findOpts).toArray(function (err, cursor) { - return err ? reject(err) : resolve(cursor); - }); + var mongoQuery = self.getQuery(mapper, query); + return new Promise(function (resolve, reject) { + var collection = client.collection(mapper.table || underscore(mapper.name)); + collection[collection.deleteMany ? 'deleteMany' : 'remove'](mongoQuery, removeOpts, function (err, cursor) { + return err ? reject(err) : resolve(cursor); }); }); - }).then(function (_records) { - records = _records; - self._translateId(records, opts); - var tasks = []; - forEachRelation(mapper, opts, function (def, __opts) { - var relatedMapper = def.getRelation(); - var task = void 0; - if (def.foreignKey && (def.type === 'hasOne' || def.type === 'hasMany')) { - if (def.type === 'hasMany') { - task = self.loadHasMany(mapper, def, records, __opts); - } else { - task = self.loadHasOne(mapper, def, records, __opts); - } - } else if (def.type === 'hasMany' && def.localKeys) { - (function () { - var localKeys = []; - records.forEach(function (item) { - var itemKeys = item[def.localKeys] || []; - itemKeys = isArray(itemKeys) ? itemKeys : Object.keys(itemKeys); - localKeys = localKeys.concat(itemKeys); - }); - task = self.findAll(relatedMapper, { - where: babelHelpers.defineProperty({}, relatedMapper.idAttribute, { - 'in': unique(localKeys).filter(function (x) { - return x; - }).map(function (x) { - return self.toObjectID(relatedMapper, x); - }) - }) - }, __opts).then(function (relatedItems) { - records.forEach(function (item) { - var attached = []; - var itemKeys = get(item, def.localKeys) || []; - itemKeys = isArray(itemKeys) ? itemKeys : Object.keys(itemKeys); - relatedItems.forEach(function (relatedItem) { - if (itemKeys && itemKeys.indexOf(relatedItem[relatedMapper.idAttribute]) !== -1) { - attached.push(relatedItem); - } - }); - def.setLocalField(item, attached); - }); - return relatedItems; - }); - })(); - } else if (def.type === 'hasMany' && def.foreignKeys) { - throw new Error('findAll eager load hasMany foreignKeys not supported!'); - } else if (def.type === 'belongsTo') { - task = self.loadBelongsTo(mapper, def, records, __opts); - } - if (task) { - tasks.push(task); - } - }); - return Promise.all(tasks); - }).then(function () { - records || (records = []); - var response = new Adapter.Response(records, {}, 'findAll'); - response.found = records.length; - response = self.respond(response, opts); - - // afterFindAll lifecycle hook - op = opts.op = 'afterFindAll'; - return resolve(self[op](mapper, query, opts, response)).then(function (_response) { - // Allow for re-assignment from lifecycle hook - return isUndefined(_response) ? response : _response; - }); + }).then(function (cursor) { + cursor.connection = undefined; + return [undefined, cursor]; }); }, /** - * Create a new record. + * Retrieve the record with the given primary key. * - * @name MongoDBAdapter#create + * @name MongoDBAdapter#find * @method * @param {Object} mapper The mapper. - * @param {Object} props The record to be created. + * @param {(string|number)} id Primary key of the record to retrieve. * @param {Object} [opts] Configuration options. - * @param {Object} [opts.insertOpts] Options to pass to collection#insert. + * @param {Object} [opts.findOneOpts] Options to pass to collection#findOne. * @param {boolean} [opts.raw=false] Whether to return a more detailed * response object. + * @param {string[]} [opts.with=[]] Relations to eager load. * @return {Promise} */ - create: function create(mapper, props, opts) { - var self = this; - var op = void 0; - props || (props = {}); - opts || (opts = {}); - - var insertOpts = self.getOpt('insertOpts', opts); - - return self.getClient().then(function (client) { - // beforeCreate lifecycle hook - op = opts.op = 'beforeCreate'; - return resolve(self[op](mapper, props, opts)).then(function (_props) { - // Allow for re-assignment from lifecycle hook - props = isUndefined(_props) ? props : _props; - _props = withoutRelations(mapper, props); - return new Promise(function (resolve, reject) { - var collection = client.collection(mapper.table || underscore(mapper.name)); - var method = collection.insertOne ? 'insertOne' : 'insert'; - collection[method](_props, insertOpts, function (err, cursor) { - return err ? reject(err) : resolve(cursor); - }); - }); - }).then(function (cursor) { - var record = void 0; - var r = cursor.ops ? cursor.ops : cursor; - self._translateId(r, opts); - record = isArray(r) ? r[0] : r; - cursor.connection = undefined; - var response = new Adapter.Response(record, cursor, 'create'); - response.created = record ? 1 : 0; - response = self.respond(response, opts); - - // afterCreate lifecycle hook - op = opts.op = 'afterCreate'; - return resolve(self[op](mapper, props, opts, response)).then(function (_response) { - // Allow for re-assignment from lifecycle hook - return isUndefined(_response) ? response : _response; - }); - }); - }); - }, - /** - * Create multiple records in a single batch. + * Retrieve the record with the given primary key. Internal method used by + * Adapter#find. * - * @name MongoDBAdapter#createMany + * @name MongoDBAdapter#_find * @method + * @private * @param {Object} mapper The mapper. - * @param {Object} props The records to be created. + * @param {(string|number)} id Primary key of the record to retrieve. * @param {Object} [opts] Configuration options. - * @param {Object} [opts.insertManyOpts] Options to pass to - * collection#insertMany. - * @param {boolean} [opts.raw=false] Whether to return a more detailed - * response object. * @return {Promise} */ - createMany: function createMany(mapper, props, opts) { + _find: function _find(mapper, id, opts) { var self = this; - var op = void 0; - props || (props = {}); opts || (opts = {}); + opts.with || (opts.with = []); - var insertManyOpts = self.getOpt('insertManyOpts', opts); + var findOneOpts = self.getOpt('findOneOpts', opts); + findOneOpts.fields || (findOneOpts.fields = {}); return self.getClient().then(function (client) { - // beforeCreateMany lifecycle hook - op = opts.op = 'beforeCreateMany'; - return resolve(self[op](mapper, props, opts)).then(function (_props) { - // Allow for re-assignment from lifecycle hook - props = isUndefined(_props) ? props : _props; - _props = props.map(function (record) { - return withoutRelations(mapper, record); - }); - return new Promise(function (resolve, reject) { - var collection = client.collection(mapper.table || underscore(mapper.name)); - collection.insertMany(_props, insertManyOpts, function (err, cursor) { - return err ? reject(err) : resolve(cursor); - }); - }); - }).then(function (cursor) { - var records = []; - var r = cursor.ops ? cursor.ops : cursor; - self._translateId(r, opts); - records = r; - cursor.connection = undefined; - var response = new Adapter.Response(records, cursor, 'createMany'); - response.created = records.length; - response = self.respond(response, opts); - - // afterCreateMany lifecycle hook - op = opts.op = 'afterCreateMany'; - return resolve(self[op](mapper, props, opts, response)).then(function (_response) { - // Allow for re-assignment from lifecycle hook - return isUndefined(_response) ? response : _response; + return new Promise(function (resolve, reject) { + var mongoQuery = {}; + mongoQuery[mapper.idAttribute] = self.toObjectID(mapper, id); + client.collection(mapper.table || underscore(mapper.name)).findOne(mongoQuery, findOneOpts, function (err, record) { + return err ? reject(err) : resolve(record); }); }); + }).then(function (record) { + if (record) { + self._translateId(record, opts); + } + return [record, {}]; }); }, /** - * Destroy the record with the given primary key. + * Retrieve the records that match the selection query. * - * @name MongoDBAdapter#destroy + * @name MongoDBAdapter#findAll * @method * @param {Object} mapper The mapper. - * @param {(string|number)} id Primary key of the record to destroy. + * @param {Object} query Selection query. * @param {Object} [opts] Configuration options. + * @param {Object} [opts.findOpts] Options to pass to collection#find. * @param {boolean} [opts.raw=false] Whether to return a more detailed * response object. - * @param {Object} [opts.removeOpts] Options to pass to collection#remove. + * @param {string[]} [opts.with=[]] Relations to eager load. * @return {Promise} */ - destroy: function destroy(mapper, id, opts) { - var self = this; - var op = void 0; - opts || (opts = {}); - var removeOpts = self.getOpt('removeOpts', opts); - - return self.getClient().then(function (client) { - // beforeDestroy lifecycle hook - op = opts.op = 'beforeDestroy'; - return resolve(self[op](mapper, id, opts)).then(function () { - return new Promise(function (resolve, reject) { - var mongoQuery = {}; - mongoQuery[mapper.idAttribute] = self.toObjectID(mapper, id); - var collection = client.collection(mapper.table || underscore(mapper.name)); - collection[collection.deleteOne ? 'deleteOne' : 'remove'](mongoQuery, removeOpts, function (err, cursor) { - return err ? reject(err) : resolve(cursor); - }); - }); - }); - }).then(function (cursor) { - cursor.connection = undefined; - var response = new Adapter.Response(undefined, cursor, 'destroy'); - response = self.respond(response, opts); - - // afterDestroy lifecycle hook - op = opts.op = 'afterDestroy'; - return resolve(self[op](mapper, id, opts, response)).then(function (_response) { - // Allow for re-assignment from lifecycle hook - return isUndefined(_response) ? response : _response; - }); - }); - }, - /** - * Destroy the records that match the selection query. + * Retrieve the records that match the selection query. Internal method used + * by Adapter#findAll. * - * @name MongoDBAdapter#destroyAll + * @name MongoDBAdapter#_findAll * @method - * @param {Object} mapper the mapper. - * @param {Object} [query] Selection query. + * @private + * @param {Object} mapper The mapper. + * @param {Object} query Selection query. * @param {Object} [opts] Configuration options. - * @param {boolean} [opts.raw=false] Whether to return a more detailed - * response object. - * @param {Object} [opts.removeOpts] Options to pass to collection#remove. * @return {Promise} */ - destroyAll: function destroyAll(mapper, query, opts) { + _findAll: function _findAll(mapper, query, opts) { var self = this; - var op = void 0; - query || (query = {}); opts || (opts = {}); - var removeOpts = self.getOpt('removeOpts', opts); - fillIn(removeOpts, self.getQueryOptions(mapper, query)); + + var findOpts = self.getOpt('findOpts', opts); + fillIn(findOpts, self.getQueryOptions(mapper, query)); + findOpts.fields || (findOpts.fields = {}); + var mongoQuery = self.getQuery(mapper, query); return self.getClient().then(function (client) { - // beforeDestroyAll lifecycle hook - op = opts.op = 'beforeDestroyAll'; - return resolve(self[op](mapper, query, opts)).then(function () { - var mongoQuery = self.getQuery(mapper, query); - return new Promise(function (resolve, reject) { - var collection = client.collection(mapper.table || underscore(mapper.name)); - collection[collection.deleteMany ? 'deleteMany' : 'remove'](mongoQuery, removeOpts, function (err, cursor) { - return err ? reject(err) : resolve(cursor); - }); + return new Promise(function (resolve, reject) { + client.collection(mapper.table || underscore(mapper.name)).find(mongoQuery, findOpts).toArray(function (err, records) { + return err ? reject(err) : resolve(records); }); }); - }).then(function (cursor) { - cursor.connection = undefined; - var response = new Adapter.Response(undefined, cursor, 'destroyAll'); - response = self.respond(response, opts); - - // afterDestroyAll lifecycle hook - op = opts.op = 'afterDestroyAll'; - return resolve(self[op](mapper, query, opts, response)).then(function (_response) { - // Allow for re-assignment from lifecycle hook - return isUndefined(_response) ? response : _response; - }); + }).then(function (records) { + self._translateId(records, opts); + return [records, {}]; }); }, @@ -898,30 +588,36 @@ addHiddenPropsToTarget(MongoDBAdapter.prototype, { * @param {Object} [opts.updateOpts] Options to pass to collection#update. * @return {Promise} */ - update: function update(mapper, id, props, opts) { + + /** + * Apply the given update to the record with the specified primary key. + * Internal method used by Adapter#update. + * + * @name MongoDBAdapter#_update + * @method + * @private + * @param {Object} mapper The mapper. + * @param {(string|number)} id The primary key of the record to be updated. + * @param {Object} props The update to apply to the record. + * @param {Object} [opts] Configuration options. + * @return {Promise} + */ + _update: function _update(mapper, id, props, opts) { var self = this; props || (props = {}); opts || (opts = {}); - var op = void 0; var updateOpts = self.getOpt('updateOpts', opts); return self.find(mapper, id, { raw: false }).then(function (record) { if (!record) { throw new Error('Not Found'); } - // beforeUpdate lifecycle hook - op = opts.op = 'beforeUpdate'; - return resolve(self[op](mapper, id, props, opts)); - }).then(function (_props) { - // Allow for re-assignment from lifecycle hook - props = isUndefined(_props) ? props : _props; - _props = withoutRelations(mapper, props); return self.getClient().then(function (client) { return new Promise(function (resolve, reject) { var mongoQuery = {}; mongoQuery[mapper.idAttribute] = self.toObjectID(mapper, id); var collection = client.collection(mapper.table || underscore(mapper.name)); - collection[collection.updateOne ? 'updateOne' : 'update'](mongoQuery, { $set: _props }, updateOpts, function (err, cursor) { + collection[collection.updateOne ? 'updateOne' : 'update'](mongoQuery, { $set: props }, updateOpts, function (err, cursor) { return err ? reject(err) : resolve(cursor); }); }); @@ -929,16 +625,7 @@ addHiddenPropsToTarget(MongoDBAdapter.prototype, { }).then(function (cursor) { return self.find(mapper, id, { raw: false }).then(function (record) { cursor.connection = undefined; - var response = new Adapter.Response(record, cursor, 'update'); - response.updated = 1; - response = self.respond(response, opts); - - // afterUpdate lifecycle hook - op = opts.op = 'afterUpdate'; - return resolve(self[op](mapper, id, props, opts, response)).then(function (_response) { - // Allow for re-assignment from lifecycle hook - return isUndefined(_response) ? response : _response; - }); + return [record, cursor]; }); }); }, @@ -958,58 +645,288 @@ addHiddenPropsToTarget(MongoDBAdapter.prototype, { * @param {Object} [opts.updateOpts] Options to pass to collection#update. * @return {Promise} */ - updateAll: function updateAll(mapper, props, query, opts) { + + /** + * Apply the given update to all records that match the selection query. + * Internal method used by Adapter#updateAll. + * + * @name MongoDBAdapter#_updateAll + * @method + * @private + * @param {Object} mapper The mapper. + * @param {Object} props The update to apply to the selected records. + * @param {Object} [query] Selection query. + * @param {Object} [opts] Configuration options. + * @return {Promise} + */ + _updateAll: function _updateAll(mapper, props, query, opts) { var self = this; props || (props = {}); query || (query = {}); opts || (opts = {}); - var op = void 0, - ids = void 0; + var ids = void 0; var updateOpts = self.getOpt('updateOpts', opts); updateOpts.multi = true; - return self.getClient().then(function (client) { + return Promise.all([self.findAll(mapper, query, { raw: false }), self.getClient()]).then(function (results) { + var _results = babelHelpers.slicedToArray(results, 2); + + var records = _results[0]; + var client = _results[1]; + var queryOptions = self.getQueryOptions(mapper, query); var mongoQuery = self.getQuery(mapper, query); - // beforeUpdateAll lifecycle hook - op = opts.op = 'beforeUpdateAll'; - return resolve(self[op](mapper, props, query, opts)).then(function (_props) { - // Allow for re-assignment from lifecycle hook - props = isUndefined(_props) ? props : _props; - _props = withoutRelations(mapper, props); - queryOptions.$set = _props; - return self.findAll(mapper, query, { raw: false }); - }).then(function (records) { - ids = records.map(function (record) { - return self.toObjectID(mapper, record[mapper.idAttribute]); - }); + queryOptions.$set = props; + ids = records.map(function (record) { + return self.toObjectID(mapper, record[mapper.idAttribute]); + }); - return new Promise(function (resolve, reject) { - var collection = client.collection(mapper.table || underscore(mapper.name)); - collection[collection.updateMany ? 'updateMany' : 'update'](mongoQuery, queryOptions, updateOpts, function (err, cursor) { - return err ? reject(err) : resolve(cursor); - }); + return new Promise(function (resolve, reject) { + var collection = client.collection(mapper.table || underscore(mapper.name)); + collection[collection.updateMany ? 'updateMany' : 'update'](mongoQuery, queryOptions, updateOpts, function (err, cursor) { + return err ? reject(err) : resolve(cursor); }); - }).then(function (cursor) { - var query = {}; - query[mapper.idAttribute] = { - 'in': ids - }; - return self.findAll(mapper, query, { raw: false }).then(function (records) { - cursor.connection = undefined; - var response = new Adapter.Response(records, cursor, 'update'); - response.updated = records.length; - response = self.respond(response, opts); - - // afterUpdateAll lifecycle hook - op = opts.op = 'afterUpdateAll'; - return resolve(self[op](mapper, props, query, opts, response)).then(function (_response) { - // Allow for re-assignment from lifecycle hook - return isUndefined(_response) ? response : _response; - }); + }); + }).then(function (cursor) { + var query = {}; + query[mapper.idAttribute] = { + 'in': ids + }; + return self.findAll(mapper, query, { raw: false }).then(function (records) { + cursor.connection = undefined; + return [records, cursor]; + }); + }); + }, + + + /** + * Return a Promise that resolves to a reference to the MongoDB client being + * used by this adapter. + * + * Useful when you need to do anything custom with the MongoDB client library. + * + * @name MongoDBAdapter#getClient + * @method + * @return {Object} MongoDB client. + */ + getClient: function getClient() { + return this.client; + }, + + + /** + * Map filtering params in a selection query to MongoDB a filtering object. + * + * Handles the following: + * + * - where + * - and bunch of filtering operators + * + * @name MongoDBAdapter#getQuery + * @method + * @return {Object} + */ + getQuery: function getQuery(mapper, query) { + query = plainCopy(query || {}); + query.where || (query.where = {}); + + forOwn(query, function (config, keyword) { + if (Adapter.reserved.indexOf(keyword) === -1) { + if (isObject(config)) { + query.where[keyword] = config; + } else { + query.where[keyword] = { + '==': config + }; + } + delete query[keyword]; + } + }); + + var mongoQuery = {}; + + if (Object.keys(query.where).length !== 0) { + forOwn(query.where, function (criteria, field) { + if (!isObject(criteria)) { + query.where[field] = { + '==': criteria + }; + } + forOwn(criteria, function (v, op) { + if (op === '==' || op === '===' || op === 'contains') { + mongoQuery[field] = v; + } else if (op === '!=' || op === '!==' || op === 'notContains') { + mongoQuery[field] = mongoQuery[field] || {}; + mongoQuery[field].$ne = v; + } else if (op === '>') { + mongoQuery[field] = mongoQuery[field] || {}; + mongoQuery[field].$gt = v; + } else if (op === '>=') { + mongoQuery[field] = mongoQuery[field] || {}; + mongoQuery[field].$gte = v; + } else if (op === '<') { + mongoQuery[field] = mongoQuery[field] || {}; + mongoQuery[field].$lt = v; + } else if (op === '<=') { + mongoQuery[field] = mongoQuery[field] || {}; + mongoQuery[field].$lte = v; + } else if (op === 'in') { + mongoQuery[field] = mongoQuery[field] || {}; + mongoQuery[field].$in = v; + } else if (op === 'notIn') { + mongoQuery[field] = mongoQuery[field] || {}; + mongoQuery[field].$nin = v; + } else if (op === '|==' || op === '|===' || op === '|contains') { + mongoQuery.$or = mongoQuery.$or || []; + var orEqQuery = {}; + orEqQuery[field] = v; + mongoQuery.$or.push(orEqQuery); + } else if (op === '|!=' || op === '|!==' || op === '|notContains') { + mongoQuery.$or = mongoQuery.$or || []; + var orNeQuery = {}; + orNeQuery[field] = { + '$ne': v + }; + mongoQuery.$or.push(orNeQuery); + } else if (op === '|>') { + mongoQuery.$or = mongoQuery.$or || []; + var orGtQuery = {}; + orGtQuery[field] = { + '$gt': v + }; + mongoQuery.$or.push(orGtQuery); + } else if (op === '|>=') { + mongoQuery.$or = mongoQuery.$or || []; + var orGteQuery = {}; + orGteQuery[field] = { + '$gte': v + }; + mongoQuery.$or.push(orGteQuery); + } else if (op === '|<') { + mongoQuery.$or = mongoQuery.$or || []; + var orLtQuery = {}; + orLtQuery[field] = { + '$lt': v + }; + mongoQuery.$or.push(orLtQuery); + } else if (op === '|<=') { + mongoQuery.$or = mongoQuery.$or || []; + var orLteQuery = {}; + orLteQuery[field] = { + '$lte': v + }; + mongoQuery.$or.push(orLteQuery); + } else if (op === '|in') { + mongoQuery.$or = mongoQuery.$or || []; + var orInQuery = {}; + orInQuery[field] = { + '$in': v + }; + mongoQuery.$or.push(orInQuery); + } else if (op === '|notIn') { + mongoQuery.$or = mongoQuery.$or || []; + var orNinQuery = {}; + orNinQuery[field] = { + '$nin': v + }; + mongoQuery.$or.push(orNinQuery); + } }); }); + } + + return mongoQuery; + }, + + + /** + * Map non-filtering params in a selection query to MongoDB query options. + * + * Handles the following: + * + * - limit + * - skip/offset + * - orderBy/sort + * + * @name MongoDBAdapter#getQueryOptions + * @method + * @return {Object} + */ + getQueryOptions: function getQueryOptions(mapper, query) { + query = plainCopy(query || {}); + query.orderBy = query.orderBy || query.sort; + query.skip = query.skip || query.offset; + + var queryOptions = {}; + + if (query.orderBy) { + if (isString(query.orderBy)) { + query.orderBy = [[query.orderBy, 'asc']]; + } + for (var i = 0; i < query.orderBy.length; i++) { + if (isString(query.orderBy[i])) { + query.orderBy[i] = [query.orderBy[i], 'asc']; + } + } + queryOptions.sort = query.orderBy; + } + + if (query.skip) { + queryOptions.skip = +query.skip; + } + + if (query.limit) { + queryOptions.limit = +query.limit; + } + + return queryOptions; + }, + + + /** + * Turn an _id into an ObjectID if it isn't already an ObjectID. + * + * @name MongoDBAdapter#toObjectID + * @method + * @return {*} + */ + toObjectID: function toObjectID(mapper, id) { + if (id !== undefined && mapper.idAttribute === '_id' && typeof id === 'string' && bson.ObjectID.isValid(id) && !(id instanceof bson.ObjectID)) { + return new bson.ObjectID(id); + } + return id; + }, + + + /** + * Return the foreignKey from the given record for the provided relationship. + * + * @name MongoDBAdapter#makeBelongsToForeignKey + * @method + * @return {*} + */ + makeBelongsToForeignKey: function makeBelongsToForeignKey(mapper, def, record) { + return this.toObjectID(def.getRelation(), Adapter__default.prototype.makeBelongsToForeignKey.call(this, mapper, def, record)); + }, + + + /** + * Return the localKeys from the given record for the provided relationship. + * + * Override with care. + * + * @name MongoDBAdapter#makeHasManyLocalKeys + * @method + * @return {*} + */ + makeHasManyLocalKeys: function makeHasManyLocalKeys(mapper, def, record) { + var self = this; + var relatedMapper = def.getRelation(); + var localKeys = Adapter__default.prototype.makeHasManyLocalKeys.call(self, mapper, def, record); + return localKeys.map(function (key) { + return self.toObjectID(relatedMapper, key); }); }, diff --git a/dist/js-data-mongodb.js.map b/dist/js-data-mongodb.js.map index 163f9ea..495d7f8 100644 --- a/dist/js-data-mongodb.js.map +++ b/dist/js-data-mongodb.js.map @@ -1 +1 @@ -{"version":3,"file":"js-data-mongodb.js","sources":["../src/index.js"],"sourcesContent":["import {MongoClient} from 'mongodb'\nimport {ObjectID} from 'bson'\nimport {utils} from 'js-data'\nimport Adapter from 'js-data-adapter'\nimport {\n reserved,\n Response\n} from 'js-data-adapter'\nimport underscore from 'mout/string/underscore'\nimport unique from 'mout/array/unique'\n\nconst {\n addHiddenPropsToTarget,\n classCallCheck,\n extend,\n fillIn,\n forEachRelation,\n forOwn,\n get,\n isArray,\n isObject,\n isString,\n isUndefined,\n omit,\n plainCopy,\n resolve\n} = utils\n\nconst withoutRelations = function (mapper, props) {\n return omit(props, mapper.relationFields || [])\n}\n\nconst DEFAULTS = {\n /**\n * Convert ObjectIDs to strings when pulling records out of the database.\n *\n * @name MongoDBAdapter#translateId\n * @type {boolean}\n * @default true\n */\n translateId: true,\n\n /**\n * MongoDB URI.\n *\n * @name MongoDBAdapter#uri\n * @type {string}\n * @default mongodb://localhost:27017\n */\n uri: 'mongodb://localhost:27017'\n}\n\nconst FIND_OPTS_DEFAULTS = {}\nconst FIND_ONE_OPTS_DEFAULTS = {}\nconst INSERT_OPTS_DEFAULTS = {}\nconst INSERT_MANY_OPTS_DEFAULTS = {}\nconst UPDATE_OPTS_DEFAULTS = {}\nconst REMOVE_OPTS_DEFAULTS = {}\n\n/**\n * MongoDBAdapter class.\n *\n * @example\n * // Use Container instead of DataStore on the server\n * import {Container} from 'js-data'\n * import MongoDBAdapter from 'js-data-mongodb'\n *\n * // Create a store to hold your Mappers\n * const store = new Container({\n * mapperDefaults: {\n * // MongoDB uses \"_id\" as the primary key\n * idAttribute: '_id'\n * }\n * })\n *\n * // Create an instance of MongoDBAdapter with default settings\n * const adapter = new MongoDBAdapter()\n *\n * // Mappers in \"store\" will use the MongoDB adapter by default\n * store.registerAdapter('mongodb', adapter, { default: true })\n *\n * // Create a Mapper that maps to a \"user\" collection\n * store.defineMapper('user')\n *\n * @class MongoDBAdapter\n * @extends Adapter\n * @param {Object} [opts] Configuration opts.\n * @param {boolean} [opts.debug=false] Whether to log debugging information.\n * @param {Object} [opts.findOpts] Options to pass to collection#find.\n * @param {Object} [opts.findOneOpts] Options to pass to collection#findOne.\n * @param {Object} [opts.insertOpts] Options to pass to collection#insert.\n * @param {Object} [opts.insertManyOpts] Options to pass to\n * collection#insertMany.\n * @param {boolean} [opts.raw=false] Whether to return detailed result objects\n * instead of just record data.\n * @param {Object} [opts.removeOpts] Options to pass to collection#remove.\n * @param {boolean} [opts.translateId=true] Convert ObjectIDs to strings when\n * pulling records out of the database.\n * @param {Object} [opts.updateOpts] Options to pass to collection#update.\n * @param {string} [opts.uri=\"mongodb://localhost:27017\"] MongoDB URI.\n */\nexport default function MongoDBAdapter (opts) {\n const self = this\n classCallCheck(self, MongoDBAdapter)\n opts || (opts = {})\n if (isString(opts)) {\n opts = { uri: opts }\n }\n fillIn(opts, DEFAULTS)\n Adapter.call(self, opts)\n\n /**\n * Default options to pass to collection#find.\n *\n * @name MongoDBAdapter#findOpts\n * @type {Object}\n * @default {}\n */\n self.findOpts || (self.findOpts = {})\n fillIn(self.findOpts, FIND_OPTS_DEFAULTS)\n\n /**\n * Default options to pass to collection#findOne.\n *\n * @name MongoDBAdapter#findOneOpts\n * @type {Object}\n * @default {}\n */\n self.findOneOpts || (self.findOneOpts = {})\n fillIn(self.findOneOpts, FIND_ONE_OPTS_DEFAULTS)\n\n /**\n * Default options to pass to collection#insert.\n *\n * @name MongoDBAdapter#insertOpts\n * @type {Object}\n * @default {}\n */\n self.insertOpts || (self.insertOpts = {})\n fillIn(self.insertOpts, INSERT_OPTS_DEFAULTS)\n\n /**\n * Default options to pass to collection#insertMany.\n *\n * @name MongoDBAdapter#insertManyOpts\n * @type {Object}\n * @default {}\n */\n self.insertManyOpts || (self.insertManyOpts = {})\n fillIn(self.insertManyOpts, INSERT_MANY_OPTS_DEFAULTS)\n\n /**\n * Default options to pass to collection#update.\n *\n * @name MongoDBAdapter#updateOpts\n * @type {Object}\n * @default {}\n */\n self.updateOpts || (self.updateOpts = {})\n fillIn(self.updateOpts, UPDATE_OPTS_DEFAULTS)\n\n /**\n * Default options to pass to collection#update.\n *\n * @name MongoDBAdapter#removeOpts\n * @type {Object}\n * @default {}\n */\n self.removeOpts || (self.removeOpts = {})\n fillIn(self.removeOpts, REMOVE_OPTS_DEFAULTS)\n\n /**\n * A Promise that resolves to a reference to the MongoDB client being used by\n * this adapter.\n *\n * @name MongoDBAdapter#client\n * @type {Object}\n */\n self.client = new Promise(function (resolve, reject) {\n MongoClient.connect(opts.uri, function (err, db) {\n return err ? reject(err) : resolve(db)\n })\n })\n}\n\n// Setup prototype inheritance from Adapter\nMongoDBAdapter.prototype = Object.create(Adapter.prototype, {\n constructor: {\n value: MongoDBAdapter,\n enumerable: false,\n writable: true,\n configurable: true\n }\n})\n\nObject.defineProperty(MongoDBAdapter, '__super__', {\n configurable: true,\n value: Adapter\n})\n\n/**\n * Alternative to ES6 class syntax for extending `MongoDBAdapter`.\n *\n * @name MongoDBAdapter.extend\n * @method\n * @param {Object} [instanceProps] Properties that will be added to the\n * prototype of the MongoDBAdapter.\n * @param {Object} [classProps] Properties that will be added as static\n * properties to the MongoDBAdapter itself.\n * @return {Object} MongoDBAdapter of `MongoDBAdapter`.\n */\nMongoDBAdapter.extend = extend\n\naddHiddenPropsToTarget(MongoDBAdapter.prototype, {\n /**\n * Translate ObjectIDs to strings.\n *\n * @name MongoDBAdapter#_translateId\n * @method\n * @return {*}\n */\n _translateId (r, opts) {\n opts || (opts = {})\n if (this.getOpt('translateId', opts)) {\n if (isArray(r)) {\n r.forEach(function (_r) {\n const __id = _r._id ? _r._id.toString() : _r._id\n _r._id = typeof __id === 'string' ? __id : _r._id\n })\n } else if (isObject(r)) {\n const __id = r._id ? r._id.toString() : r._id\n r._id = typeof __id === 'string' ? __id : r._id\n }\n }\n return r\n },\n\n /**\n * Return a Promise that resolves to a reference to the MongoDB client being\n * used by this adapter.\n *\n * Useful when you need to do anything custom with the MongoDB client library.\n *\n * @name MongoDBAdapter#getClient\n * @method\n * @return {Object} MongoDB client.\n */\n getClient () {\n return this.client\n },\n\n /**\n * Map filtering params in a selection query to MongoDB a filtering object.\n *\n * Handles the following:\n *\n * - where\n * - and bunch of filtering operators\n *\n * @name MongoDBAdapter#getQuery\n * @method\n * @return {Object}\n */\n getQuery (mapper, query) {\n query = plainCopy(query || {})\n query.where || (query.where = {})\n\n forOwn(query, function (config, keyword) {\n if (reserved.indexOf(keyword) === -1) {\n if (isObject(config)) {\n query.where[keyword] = config\n } else {\n query.where[keyword] = {\n '==': config\n }\n }\n delete query[keyword]\n }\n })\n\n let mongoQuery = {}\n\n if (Object.keys(query.where).length !== 0) {\n forOwn(query.where, function (criteria, field) {\n if (!isObject(criteria)) {\n query.where[field] = {\n '==': criteria\n }\n }\n forOwn(criteria, function (v, op) {\n if (op === '==' || op === '===' || op === 'contains') {\n mongoQuery[field] = v\n } else if (op === '!=' || op === '!==' || op === 'notContains') {\n mongoQuery[field] = mongoQuery[field] || {}\n mongoQuery[field].$ne = v\n } else if (op === '>') {\n mongoQuery[field] = mongoQuery[field] || {}\n mongoQuery[field].$gt = v\n } else if (op === '>=') {\n mongoQuery[field] = mongoQuery[field] || {}\n mongoQuery[field].$gte = v\n } else if (op === '<') {\n mongoQuery[field] = mongoQuery[field] || {}\n mongoQuery[field].$lt = v\n } else if (op === '<=') {\n mongoQuery[field] = mongoQuery[field] || {}\n mongoQuery[field].$lte = v\n } else if (op === 'in') {\n mongoQuery[field] = mongoQuery[field] || {}\n mongoQuery[field].$in = v\n } else if (op === 'notIn') {\n mongoQuery[field] = mongoQuery[field] || {}\n mongoQuery[field].$nin = v\n } else if (op === '|==' || op === '|===' || op === '|contains') {\n mongoQuery.$or = mongoQuery.$or || []\n let orEqQuery = {}\n orEqQuery[field] = v\n mongoQuery.$or.push(orEqQuery)\n } else if (op === '|!=' || op === '|!==' || op === '|notContains') {\n mongoQuery.$or = mongoQuery.$or || []\n let orNeQuery = {}\n orNeQuery[field] = {\n '$ne': v\n }\n mongoQuery.$or.push(orNeQuery)\n } else if (op === '|>') {\n mongoQuery.$or = mongoQuery.$or || []\n let orGtQuery = {}\n orGtQuery[field] = {\n '$gt': v\n }\n mongoQuery.$or.push(orGtQuery)\n } else if (op === '|>=') {\n mongoQuery.$or = mongoQuery.$or || []\n let orGteQuery = {}\n orGteQuery[field] = {\n '$gte': v\n }\n mongoQuery.$or.push(orGteQuery)\n } else if (op === '|<') {\n mongoQuery.$or = mongoQuery.$or || []\n let orLtQuery = {}\n orLtQuery[field] = {\n '$lt': v\n }\n mongoQuery.$or.push(orLtQuery)\n } else if (op === '|<=') {\n mongoQuery.$or = mongoQuery.$or || []\n let orLteQuery = {}\n orLteQuery[field] = {\n '$lte': v\n }\n mongoQuery.$or.push(orLteQuery)\n } else if (op === '|in') {\n mongoQuery.$or = mongoQuery.$or || []\n let orInQuery = {}\n orInQuery[field] = {\n '$in': v\n }\n mongoQuery.$or.push(orInQuery)\n } else if (op === '|notIn') {\n mongoQuery.$or = mongoQuery.$or || []\n let orNinQuery = {}\n orNinQuery[field] = {\n '$nin': v\n }\n mongoQuery.$or.push(orNinQuery)\n }\n })\n })\n }\n\n return mongoQuery\n },\n\n /**\n * Map non-filtering params in a selection query to MongoDB query options.\n *\n * Handles the following:\n *\n * - limit\n * - skip/offset\n * - orderBy/sort\n *\n * @name MongoDBAdapter#getQueryOptions\n * @method\n * @return {Object}\n */\n getQueryOptions (mapper, query) {\n query = plainCopy(query || {})\n query.orderBy = query.orderBy || query.sort\n query.skip = query.skip || query.offset\n\n let queryOptions = {}\n\n if (query.orderBy) {\n if (isString(query.orderBy)) {\n query.orderBy = [\n [query.orderBy, 'asc']\n ]\n }\n for (var i = 0; i < query.orderBy.length; i++) {\n if (isString(query.orderBy[i])) {\n query.orderBy[i] = [query.orderBy[i], 'asc']\n }\n }\n queryOptions.sort = query.orderBy\n }\n\n if (query.skip) {\n queryOptions.skip = +query.skip\n }\n\n if (query.limit) {\n queryOptions.limit = +query.limit\n }\n\n return queryOptions\n },\n\n /**\n * Turn an _id into an ObjectID if it isn't already an ObjectID.\n *\n * @name MongoDBAdapter#toObjectID\n * @method\n * @return {*}\n */\n toObjectID (mapper, id) {\n if (id !== undefined && mapper.idAttribute === '_id' && typeof id === 'string' && ObjectID.isValid(id) && !(id instanceof ObjectID)) {\n return new ObjectID(id)\n }\n return id\n },\n\n /**\n * Return the foreignKey from the given record for the provided relationship.\n *\n * @name MongoDBAdapter#makeBelongsToForeignKey\n * @method\n * @return {*}\n */\n makeBelongsToForeignKey (mapper, def, record) {\n return this.toObjectID(def.getRelation(), Adapter.prototype.makeBelongsToForeignKey.call(this, mapper, def, record))\n },\n\n /**\n * Retrieve the record with the given primary key.\n *\n * @name MongoDBAdapter#find\n * @method\n * @param {Object} mapper The mapper.\n * @param {(string|number)} id Primary key of the record to retrieve.\n * @param {Object} [opts] Configuration options.\n * @param {Object} [opts.findOneOpts] Options to pass to collection#findOne.\n * @param {boolean} [opts.raw=false] Whether to return a more detailed\n * response object.\n * @param {string[]} [opts.with=[]] Relations to eager load.\n * @return {Promise}\n */\n find (mapper, id, opts) {\n const self = this\n let record, op\n opts || (opts = {})\n opts.with || (opts.with = [])\n\n const findOneOpts = self.getOpt('findOneOpts', opts)\n findOneOpts.fields || (findOneOpts.fields = {})\n\n return self.getClient().then(function (client) {\n // beforeFind lifecycle hook\n op = opts.op = 'beforeFind'\n return resolve(self[op](mapper, id, opts)).then(function () {\n return new Promise(function (resolve, reject) {\n let mongoQuery = {}\n mongoQuery[mapper.idAttribute] = self.toObjectID(mapper, id)\n client.collection(mapper.table || underscore(mapper.name)).findOne(mongoQuery, findOneOpts, function (err, cursor) {\n return err ? reject(err) : resolve(cursor)\n })\n })\n })\n }).then(function (_record) {\n if (!_record) {\n return\n }\n record = _record\n self._translateId(record, opts)\n const tasks = []\n\n forEachRelation(mapper, opts, function (def, __opts) {\n const relatedMapper = def.getRelation()\n let task\n\n if (def.foreignKey && (def.type === 'hasOne' || def.type === 'hasMany')) {\n if (def.type === 'hasOne') {\n task = self.loadHasOne(mapper, def, record, __opts)\n } else {\n task = self.loadHasMany(mapper, def, record, __opts)\n }\n } else if (def.type === 'hasMany' && def.localKeys) {\n let localKeys = []\n let itemKeys = get(record, def.localKeys) || []\n itemKeys = isArray(itemKeys) ? itemKeys : Object.keys(itemKeys)\n localKeys = localKeys.concat(itemKeys)\n task = self.findAll(relatedMapper, {\n where: {\n [relatedMapper.idAttribute]: {\n 'in': unique(localKeys).filter(function (x) { return x }).map(function (x) { return self.toObjectID(relatedMapper, x) })\n }\n }\n }, __opts).then(function (relatedItems) {\n def.setLocalField(record, relatedItems)\n })\n } else if (def.type === 'hasMany' && def.foreignKeys) {\n task = self.findAll(relatedMapper, {\n where: {\n [def.foreignKeys]: {\n 'contains': self.makeHasManyForeignKeys(mapper, def, record)\n }\n }\n }, __opts).then(function (relatedItems) {\n def.setLocalField(record, relatedItems)\n })\n } else if (def.type === 'belongsTo') {\n task = self.loadBelongsTo(mapper, def, record, __opts)\n }\n if (task) {\n tasks.push(task)\n }\n })\n\n return Promise.all(tasks)\n }).then(function () {\n let response = new Response(record, {}, 'find')\n response.found = record ? 1 : 0\n response = self.respond(response, opts)\n\n // afterFind lifecycle hook\n op = opts.op = 'afterFind'\n return resolve(self[op](mapper, id, opts, response)).then(function (_response) {\n // Allow for re-assignment from lifecycle hook\n return isUndefined(_response) ? response : _response\n })\n })\n },\n\n /**\n * Retrieve the records that match the selection query.\n *\n * @name MongoDBAdapter#findAll\n * @method\n * @param {Object} mapper The mapper.\n * @param {Object} query Selection query.\n * @param {Object} [opts] Configuration options.\n * @param {Object} [opts.findOpts] Options to pass to collection#find.\n * @param {boolean} [opts.raw=false] Whether to return a more detailed\n * response object.\n * @param {string[]} [opts.with=[]] Relations to eager load.\n * @return {Promise}\n */\n findAll (mapper, query, opts) {\n const self = this\n opts || (opts = {})\n opts.with || (opts.with = [])\n\n let records = []\n let op\n const findOpts = self.getOpt('findOpts', opts)\n fillIn(findOpts, self.getQueryOptions(mapper, query))\n findOpts.fields || (findOpts.fields = {})\n const mongoQuery = self.getQuery(mapper, query)\n\n return self.getClient().then(function (client) {\n // beforeFindAll lifecycle hook\n op = opts.op = 'beforeFindAll'\n return resolve(self[op](mapper, query, opts)).then(function () {\n return new Promise(function (resolve, reject) {\n client.collection(mapper.table || underscore(mapper.name)).find(mongoQuery, findOpts).toArray(function (err, cursor) {\n return err ? reject(err) : resolve(cursor)\n })\n })\n })\n }).then(function (_records) {\n records = _records\n self._translateId(records, opts)\n const tasks = []\n forEachRelation(mapper, opts, function (def, __opts) {\n const relatedMapper = def.getRelation()\n let task\n if (def.foreignKey && (def.type === 'hasOne' || def.type === 'hasMany')) {\n if (def.type === 'hasMany') {\n task = self.loadHasMany(mapper, def, records, __opts)\n } else {\n task = self.loadHasOne(mapper, def, records, __opts)\n }\n } else if (def.type === 'hasMany' && def.localKeys) {\n let localKeys = []\n records.forEach(function (item) {\n let itemKeys = item[def.localKeys] || []\n itemKeys = isArray(itemKeys) ? itemKeys : Object.keys(itemKeys)\n localKeys = localKeys.concat(itemKeys)\n })\n task = self.findAll(relatedMapper, {\n where: {\n [relatedMapper.idAttribute]: {\n 'in': unique(localKeys).filter(function (x) { return x }).map(function (x) { return self.toObjectID(relatedMapper, x) })\n }\n }\n }, __opts).then(function (relatedItems) {\n records.forEach(function (item) {\n let attached = []\n let itemKeys = get(item, def.localKeys) || []\n itemKeys = isArray(itemKeys) ? itemKeys : Object.keys(itemKeys)\n relatedItems.forEach(function (relatedItem) {\n if (itemKeys && itemKeys.indexOf(relatedItem[relatedMapper.idAttribute]) !== -1) {\n attached.push(relatedItem)\n }\n })\n def.setLocalField(item, attached)\n })\n return relatedItems\n })\n } else if (def.type === 'hasMany' && def.foreignKeys) {\n throw new Error('findAll eager load hasMany foreignKeys not supported!')\n } else if (def.type === 'belongsTo') {\n task = self.loadBelongsTo(mapper, def, records, __opts)\n }\n if (task) {\n tasks.push(task)\n }\n })\n return Promise.all(tasks)\n }).then(function () {\n records || (records = [])\n let response = new Response(records, {}, 'findAll')\n response.found = records.length\n response = self.respond(response, opts)\n\n // afterFindAll lifecycle hook\n op = opts.op = 'afterFindAll'\n return resolve(self[op](mapper, query, opts, response)).then(function (_response) {\n // Allow for re-assignment from lifecycle hook\n return isUndefined(_response) ? response : _response\n })\n })\n },\n\n /**\n * Create a new record.\n *\n * @name MongoDBAdapter#create\n * @method\n * @param {Object} mapper The mapper.\n * @param {Object} props The record to be created.\n * @param {Object} [opts] Configuration options.\n * @param {Object} [opts.insertOpts] Options to pass to collection#insert.\n * @param {boolean} [opts.raw=false] Whether to return a more detailed\n * response object.\n * @return {Promise}\n */\n create (mapper, props, opts) {\n const self = this\n let op\n props || (props = {})\n opts || (opts = {})\n\n const insertOpts = self.getOpt('insertOpts', opts)\n\n return self.getClient().then(function (client) {\n // beforeCreate lifecycle hook\n op = opts.op = 'beforeCreate'\n return resolve(self[op](mapper, props, opts)).then(function (_props) {\n // Allow for re-assignment from lifecycle hook\n props = isUndefined(_props) ? props : _props\n _props = withoutRelations(mapper, props)\n return new Promise(function (resolve, reject) {\n const collection = client.collection(mapper.table || underscore(mapper.name))\n const method = collection.insertOne ? 'insertOne' : 'insert'\n collection[method](_props, insertOpts, function (err, cursor) {\n return err ? reject(err) : resolve(cursor)\n })\n })\n }).then(function (cursor) {\n let record\n let r = cursor.ops ? cursor.ops : cursor\n self._translateId(r, opts)\n record = isArray(r) ? r[0] : r\n cursor.connection = undefined\n let response = new Response(record, cursor, 'create')\n response.created = record ? 1 : 0\n response = self.respond(response, opts)\n\n // afterCreate lifecycle hook\n op = opts.op = 'afterCreate'\n return resolve(self[op](mapper, props, opts, response)).then(function (_response) {\n // Allow for re-assignment from lifecycle hook\n return isUndefined(_response) ? response : _response\n })\n })\n })\n },\n\n /**\n * Create multiple records in a single batch.\n *\n * @name MongoDBAdapter#createMany\n * @method\n * @param {Object} mapper The mapper.\n * @param {Object} props The records to be created.\n * @param {Object} [opts] Configuration options.\n * @param {Object} [opts.insertManyOpts] Options to pass to\n * collection#insertMany.\n * @param {boolean} [opts.raw=false] Whether to return a more detailed\n * response object.\n * @return {Promise}\n */\n createMany (mapper, props, opts) {\n const self = this\n let op\n props || (props = {})\n opts || (opts = {})\n\n const insertManyOpts = self.getOpt('insertManyOpts', opts)\n\n return self.getClient().then(function (client) {\n // beforeCreateMany lifecycle hook\n op = opts.op = 'beforeCreateMany'\n return resolve(self[op](mapper, props, opts)).then(function (_props) {\n // Allow for re-assignment from lifecycle hook\n props = isUndefined(_props) ? props : _props\n _props = props.map(function (record) {\n return withoutRelations(mapper, record)\n })\n return new Promise(function (resolve, reject) {\n const collection = client.collection(mapper.table || underscore(mapper.name))\n collection.insertMany(_props, insertManyOpts, function (err, cursor) {\n return err ? reject(err) : resolve(cursor)\n })\n })\n }).then(function (cursor) {\n let records = []\n let r = cursor.ops ? cursor.ops : cursor\n self._translateId(r, opts)\n records = r\n cursor.connection = undefined\n let response = new Response(records, cursor, 'createMany')\n response.created = records.length\n response = self.respond(response, opts)\n\n // afterCreateMany lifecycle hook\n op = opts.op = 'afterCreateMany'\n return resolve(self[op](mapper, props, opts, response)).then(function (_response) {\n // Allow for re-assignment from lifecycle hook\n return isUndefined(_response) ? response : _response\n })\n })\n })\n },\n\n /**\n * Destroy the record with the given primary key.\n *\n * @name MongoDBAdapter#destroy\n * @method\n * @param {Object} mapper The mapper.\n * @param {(string|number)} id Primary key of the record to destroy.\n * @param {Object} [opts] Configuration options.\n * @param {boolean} [opts.raw=false] Whether to return a more detailed\n * response object.\n * @param {Object} [opts.removeOpts] Options to pass to collection#remove.\n * @return {Promise}\n */\n destroy (mapper, id, opts) {\n const self = this\n let op\n opts || (opts = {})\n const removeOpts = self.getOpt('removeOpts', opts)\n\n return self.getClient().then(function (client) {\n // beforeDestroy lifecycle hook\n op = opts.op = 'beforeDestroy'\n return resolve(self[op](mapper, id, opts)).then(function () {\n return new Promise(function (resolve, reject) {\n const mongoQuery = {}\n mongoQuery[mapper.idAttribute] = self.toObjectID(mapper, id)\n const collection = client.collection(mapper.table || underscore(mapper.name))\n collection[collection.deleteOne ? 'deleteOne' : 'remove'](mongoQuery, removeOpts, function (err, cursor) {\n return err ? reject(err) : resolve(cursor)\n })\n })\n })\n }).then(function (cursor) {\n cursor.connection = undefined\n let response = new Response(undefined, cursor, 'destroy')\n response = self.respond(response, opts)\n\n // afterDestroy lifecycle hook\n op = opts.op = 'afterDestroy'\n return resolve(self[op](mapper, id, opts, response)).then(function (_response) {\n // Allow for re-assignment from lifecycle hook\n return isUndefined(_response) ? response : _response\n })\n })\n },\n\n /**\n * Destroy the records that match the selection query.\n *\n * @name MongoDBAdapter#destroyAll\n * @method\n * @param {Object} mapper the mapper.\n * @param {Object} [query] Selection query.\n * @param {Object} [opts] Configuration options.\n * @param {boolean} [opts.raw=false] Whether to return a more detailed\n * response object.\n * @param {Object} [opts.removeOpts] Options to pass to collection#remove.\n * @return {Promise}\n */\n destroyAll (mapper, query, opts) {\n const self = this\n let op\n query || (query = {})\n opts || (opts = {})\n const removeOpts = self.getOpt('removeOpts', opts)\n fillIn(removeOpts, self.getQueryOptions(mapper, query))\n\n return self.getClient().then(function (client) {\n // beforeDestroyAll lifecycle hook\n op = opts.op = 'beforeDestroyAll'\n return resolve(self[op](mapper, query, opts)).then(function () {\n const mongoQuery = self.getQuery(mapper, query)\n return new Promise(function (resolve, reject) {\n const collection = client.collection(mapper.table || underscore(mapper.name))\n collection[collection.deleteMany ? 'deleteMany' : 'remove'](mongoQuery, removeOpts, function (err, cursor) {\n return err ? reject(err) : resolve(cursor)\n })\n })\n })\n }).then(function (cursor) {\n cursor.connection = undefined\n let response = new Response(undefined, cursor, 'destroyAll')\n response = self.respond(response, opts)\n\n // afterDestroyAll lifecycle hook\n op = opts.op = 'afterDestroyAll'\n return resolve(self[op](mapper, query, opts, response)).then(function (_response) {\n // Allow for re-assignment from lifecycle hook\n return isUndefined(_response) ? response : _response\n })\n })\n },\n\n /**\n * Apply the given update to the record with the specified primary key.\n *\n * @name MongoDBAdapter#update\n * @method\n * @param {Object} mapper The mapper.\n * @param {(string|number)} id The primary key of the record to be updated.\n * @param {Object} props The update to apply to the record.\n * @param {Object} [opts] Configuration options.\n * @param {boolean} [opts.raw=false] Whether to return a more detailed\n * response object.\n * @param {Object} [opts.updateOpts] Options to pass to collection#update.\n * @return {Promise}\n */\n update (mapper, id, props, opts) {\n const self = this\n props || (props = {})\n opts || (opts = {})\n let op\n const updateOpts = self.getOpt('updateOpts', opts)\n\n return self.find(mapper, id, { raw: false }).then(function (record) {\n if (!record) {\n throw new Error('Not Found')\n }\n // beforeUpdate lifecycle hook\n op = opts.op = 'beforeUpdate'\n return resolve(self[op](mapper, id, props, opts))\n }).then(function (_props) {\n // Allow for re-assignment from lifecycle hook\n props = isUndefined(_props) ? props : _props\n _props = withoutRelations(mapper, props)\n return self.getClient().then(function (client) {\n return new Promise(function (resolve, reject) {\n const mongoQuery = {}\n mongoQuery[mapper.idAttribute] = self.toObjectID(mapper, id)\n const collection = client.collection(mapper.table || underscore(mapper.name))\n collection[collection.updateOne ? 'updateOne' : 'update'](mongoQuery, { $set: _props }, updateOpts, function (err, cursor) {\n return err ? reject(err) : resolve(cursor)\n })\n })\n })\n }).then(function (cursor) {\n return self.find(mapper, id, { raw: false }).then(function (record) {\n cursor.connection = undefined\n let response = new Response(record, cursor, 'update')\n response.updated = 1\n response = self.respond(response, opts)\n\n // afterUpdate lifecycle hook\n op = opts.op = 'afterUpdate'\n return resolve(self[op](mapper, id, props, opts, response)).then(function (_response) {\n // Allow for re-assignment from lifecycle hook\n return isUndefined(_response) ? response : _response\n })\n })\n })\n },\n\n /**\n * Apply the given update to all records that match the selection query.\n *\n * @name MongoDBAdapter#updateAll\n * @method\n * @param {Object} mapper The mapper.\n * @param {Object} props The update to apply to the selected records.\n * @param {Object} [query] Selection query.\n * @param {Object} [opts] Configuration options.\n * @param {boolean} [opts.raw=false] Whether to return a more detailed\n * response object.\n * @param {Object} [opts.updateOpts] Options to pass to collection#update.\n * @return {Promise}\n */\n updateAll (mapper, props, query, opts) {\n const self = this\n props || (props = {})\n query || (query = {})\n opts || (opts = {})\n let op, ids\n const updateOpts = self.getOpt('updateOpts', opts)\n updateOpts.multi = true\n\n return self.getClient().then(function (client) {\n const queryOptions = self.getQueryOptions(mapper, query)\n const mongoQuery = self.getQuery(mapper, query)\n\n // beforeUpdateAll lifecycle hook\n op = opts.op = 'beforeUpdateAll'\n return resolve(self[op](mapper, props, query, opts)).then(function (_props) {\n // Allow for re-assignment from lifecycle hook\n props = isUndefined(_props) ? props : _props\n _props = withoutRelations(mapper, props)\n queryOptions.$set = _props\n return self.findAll(mapper, query, { raw: false })\n }).then(function (records) {\n ids = records.map(function (record) {\n return self.toObjectID(mapper, record[mapper.idAttribute])\n })\n\n return new Promise(function (resolve, reject) {\n const collection = client.collection(mapper.table || underscore(mapper.name))\n collection[collection.updateMany ? 'updateMany' : 'update'](mongoQuery, queryOptions, updateOpts, function (err, cursor) {\n return err ? reject(err) : resolve(cursor)\n })\n })\n }).then(function (cursor) {\n const query = {}\n query[mapper.idAttribute] = {\n 'in': ids\n }\n return self.findAll(mapper, query, { raw: false }).then(function (records) {\n cursor.connection = undefined\n let response = new Response(records, cursor, 'update')\n response.updated = records.length\n response = self.respond(response, opts)\n\n // afterUpdateAll lifecycle hook\n op = opts.op = 'afterUpdateAll'\n return resolve(self[op](mapper, props, query, opts, response)).then(function (_response) {\n // Allow for re-assignment from lifecycle hook\n return isUndefined(_response) ? response : _response\n })\n })\n })\n })\n },\n\n /**\n * Not supported.\n *\n * @name MongoDBAdapter#updateMany\n * @method\n */\n updateMany () {\n throw new Error('not supported!')\n }\n})\n"],"names":["utils","Adapter","reserved","ObjectID","Response"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;IAYE,yBAcEA,aAdF;IACA,iBAaEA,aAbF;IACA,SAYEA,aAZF;IACA,SAWEA,aAXF;IACA,kBAUEA,aAVF;IACA,SASEA,aATF;IACA,MAQEA,aARF;IACA,UAOEA,aAPF;IACA,WAMEA,aANF;IACA,WAKEA,aALF;IACA,cAIEA,aAJF;IACA,OAGEA,aAHF;IACA,YAEEA,aAFF;IACA,UACEA,aADF;;;AAGF,IAAM,mBAAmB,SAAnB,gBAAmB,CAAU,MAAV,EAAkB,KAAlB,EAAyB;SACzC,KAAK,KAAL,EAAY,OAAO,cAAP,IAAyB,EAAzB,CAAnB,CADgD;CAAzB;;AAIzB,IAAM,WAAW;;;;;;;;eAQF,IAAb;;;;;;;;;OASK,2BAAL;CAjBI;;AAoBN,IAAM,qBAAqB,EAArB;AACN,IAAM,yBAAyB,EAAzB;AACN,IAAM,uBAAuB,EAAvB;AACN,IAAM,4BAA4B,EAA5B;AACN,IAAM,uBAAuB,EAAvB;AACN,IAAM,uBAAuB,EAAvB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA4CN,AAAe,SAAS,cAAT,CAAyB,IAAzB,EAA+B;MACtC,OAAO,IAAP,CADsC;iBAE7B,IAAf,EAAqB,cAArB,EAF4C;WAGnC,OAAO,EAAP,CAAT,CAH4C;MAIxC,SAAS,IAAT,CAAJ,EAAoB;WACX,EAAE,KAAK,IAAL,EAAT,CADkB;GAApB;SAGO,IAAP,EAAa,QAAb,EAP4C;mBAQpC,IAAR,CAAa,IAAb,EAAmB,IAAnB;;;;;;;;;MASA,CAAK,QAAL,KAAkB,KAAK,QAAL,GAAgB,EAAhB,CAAlB,CAjB4C;SAkBrC,KAAK,QAAL,EAAe,kBAAtB;;;;;;;;;MASA,CAAK,WAAL,KAAqB,KAAK,WAAL,GAAmB,EAAnB,CAArB,CA3B4C;SA4BrC,KAAK,WAAL,EAAkB,sBAAzB;;;;;;;;;MASA,CAAK,UAAL,KAAoB,KAAK,UAAL,GAAkB,EAAlB,CAApB,CArC4C;SAsCrC,KAAK,UAAL,EAAiB,oBAAxB;;;;;;;;;MASA,CAAK,cAAL,KAAwB,KAAK,cAAL,GAAsB,EAAtB,CAAxB,CA/C4C;SAgDrC,KAAK,cAAL,EAAqB,yBAA5B;;;;;;;;;MASA,CAAK,UAAL,KAAoB,KAAK,UAAL,GAAkB,EAAlB,CAApB,CAzD4C;SA0DrC,KAAK,UAAL,EAAiB,oBAAxB;;;;;;;;;MASA,CAAK,UAAL,KAAoB,KAAK,UAAL,GAAkB,EAAlB,CAApB,CAnE4C;SAoErC,KAAK,UAAL,EAAiB,oBAAxB;;;;;;;;;MASA,CAAK,MAAL,GAAc,IAAI,OAAJ,CAAY,UAAU,OAAV,EAAmB,MAAnB,EAA2B;wBACvC,OAAZ,CAAoB,KAAK,GAAL,EAAU,UAAU,GAAV,EAAe,EAAf,EAAmB;aACxC,MAAM,OAAO,GAAP,CAAN,GAAoB,QAAQ,EAAR,CAApB,CADwC;KAAnB,CAA9B,CADmD;GAA3B,CAA1B,CA7E4C;CAA/B;;;AAqFf,eAAe,SAAf,GAA2B,OAAO,MAAP,CAAcC,iBAAQ,SAAR,EAAmB;eAC7C;WACJ,cAAP;gBACY,KAAZ;cACU,IAAV;kBACc,IAAd;GAJF;CADyB,CAA3B;;AASA,OAAO,cAAP,CAAsB,cAAtB,EAAsC,WAAtC,EAAmD;gBACnC,IAAd;SACOA,gBAAP;CAFF;;;;;;;;;;;;;AAgBA,eAAe,MAAf,GAAwB,MAAxB;;AAEA,uBAAuB,eAAe,SAAf,EAA0B;;;;;;;;;sCAQjC,GAAG,MAAM;aACZ,OAAO,EAAP,CAAT,CADqB;QAEjB,KAAK,MAAL,CAAY,aAAZ,EAA2B,IAA3B,CAAJ,EAAsC;UAChC,QAAQ,CAAR,CAAJ,EAAgB;UACZ,OAAF,CAAU,UAAU,EAAV,EAAc;cAChB,OAAO,GAAG,GAAH,GAAS,GAAG,GAAH,CAAO,QAAP,EAAT,GAA6B,GAAG,GAAH,CADpB;aAEnB,GAAH,GAAS,OAAO,IAAP,KAAgB,QAAhB,GAA2B,IAA3B,GAAkC,GAAG,GAAH,CAFrB;SAAd,CAAV,CADc;OAAhB,MAKO,IAAI,SAAS,CAAT,CAAJ,EAAiB;YAChB,OAAO,EAAE,GAAF,GAAQ,EAAE,GAAF,CAAM,QAAN,EAAR,GAA2B,EAAE,GAAF,CADlB;UAEpB,GAAF,GAAQ,OAAO,IAAP,KAAgB,QAAhB,GAA2B,IAA3B,GAAkC,EAAE,GAAF,CAFpB;OAAjB;KANT;WAWO,CAAP,CAbqB;GARwB;;;;;;;;;;;;;kCAkClC;WACJ,KAAK,MAAL,CADI;GAlCkC;;;;;;;;;;;;;;;8BAkDrC,QAAQ,OAAO;YACf,UAAU,SAAS,EAAT,CAAlB,CADuB;UAEjB,KAAN,KAAgB,MAAM,KAAN,GAAc,EAAd,CAAhB,CAFuB;;WAIhB,KAAP,EAAc,UAAU,MAAV,EAAkB,OAAlB,EAA2B;UACnCC,iBAAS,OAAT,CAAiB,OAAjB,MAA8B,CAAC,CAAD,EAAI;YAChC,SAAS,MAAT,CAAJ,EAAsB;gBACd,KAAN,CAAY,OAAZ,IAAuB,MAAvB,CADoB;SAAtB,MAEO;gBACC,KAAN,CAAY,OAAZ,IAAuB;kBACf,MAAN;WADF,CADK;SAFP;eAOO,MAAM,OAAN,CAAP,CARoC;OAAtC;KADY,CAAd,CAJuB;;QAiBnB,aAAa,EAAb,CAjBmB;;QAmBnB,OAAO,IAAP,CAAY,MAAM,KAAN,CAAZ,CAAyB,MAAzB,KAAoC,CAApC,EAAuC;aAClC,MAAM,KAAN,EAAa,UAAU,QAAV,EAAoB,KAApB,EAA2B;YACzC,CAAC,SAAS,QAAT,CAAD,EAAqB;gBACjB,KAAN,CAAY,KAAZ,IAAqB;kBACb,QAAN;WADF,CADuB;SAAzB;eAKO,QAAP,EAAiB,UAAU,CAAV,EAAa,EAAb,EAAiB;cAC5B,OAAO,IAAP,IAAe,OAAO,KAAP,IAAgB,OAAO,UAAP,EAAmB;uBACzC,KAAX,IAAoB,CAApB,CADoD;WAAtD,MAEO,IAAI,OAAO,IAAP,IAAe,OAAO,KAAP,IAAgB,OAAO,aAAP,EAAsB;uBACnD,KAAX,IAAoB,WAAW,KAAX,KAAqB,EAArB,CAD0C;uBAEnD,KAAX,EAAkB,GAAlB,GAAwB,CAAxB,CAF8D;WAAzD,MAGA,IAAI,OAAO,GAAP,EAAY;uBACV,KAAX,IAAoB,WAAW,KAAX,KAAqB,EAArB,CADC;uBAEV,KAAX,EAAkB,GAAlB,GAAwB,CAAxB,CAFqB;WAAhB,MAGA,IAAI,OAAO,IAAP,EAAa;uBACX,KAAX,IAAoB,WAAW,KAAX,KAAqB,EAArB,CADE;uBAEX,KAAX,EAAkB,IAAlB,GAAyB,CAAzB,CAFsB;WAAjB,MAGA,IAAI,OAAO,GAAP,EAAY;uBACV,KAAX,IAAoB,WAAW,KAAX,KAAqB,EAArB,CADC;uBAEV,KAAX,EAAkB,GAAlB,GAAwB,CAAxB,CAFqB;WAAhB,MAGA,IAAI,OAAO,IAAP,EAAa;uBACX,KAAX,IAAoB,WAAW,KAAX,KAAqB,EAArB,CADE;uBAEX,KAAX,EAAkB,IAAlB,GAAyB,CAAzB,CAFsB;WAAjB,MAGA,IAAI,OAAO,IAAP,EAAa;uBACX,KAAX,IAAoB,WAAW,KAAX,KAAqB,EAArB,CADE;uBAEX,KAAX,EAAkB,GAAlB,GAAwB,CAAxB,CAFsB;WAAjB,MAGA,IAAI,OAAO,OAAP,EAAgB;uBACd,KAAX,IAAoB,WAAW,KAAX,KAAqB,EAArB,CADK;uBAEd,KAAX,EAAkB,IAAlB,GAAyB,CAAzB,CAFyB;WAApB,MAGA,IAAI,OAAO,KAAP,IAAgB,OAAO,MAAP,IAAiB,OAAO,WAAP,EAAoB;uBACnD,GAAX,GAAiB,WAAW,GAAX,IAAkB,EAAlB,CAD6C;gBAE1D,YAAY,EAAZ,CAF0D;sBAGpD,KAAV,IAAmB,CAAnB,CAH8D;uBAInD,GAAX,CAAe,IAAf,CAAoB,SAApB,EAJ8D;WAAzD,MAKA,IAAI,OAAO,KAAP,IAAgB,OAAO,MAAP,IAAiB,OAAO,cAAP,EAAuB;uBACtD,GAAX,GAAiB,WAAW,GAAX,IAAkB,EAAlB,CADgD;gBAE7D,YAAY,EAAZ,CAF6D;sBAGvD,KAAV,IAAmB;qBACV,CAAP;aADF,CAHiE;uBAMtD,GAAX,CAAe,IAAf,CAAoB,SAApB,EANiE;WAA5D,MAOA,IAAI,OAAO,IAAP,EAAa;uBACX,GAAX,GAAiB,WAAW,GAAX,IAAkB,EAAlB,CADK;gBAElB,YAAY,EAAZ,CAFkB;sBAGZ,KAAV,IAAmB;qBACV,CAAP;aADF,CAHsB;uBAMX,GAAX,CAAe,IAAf,CAAoB,SAApB,EANsB;WAAjB,MAOA,IAAI,OAAO,KAAP,EAAc;uBACZ,GAAX,GAAiB,WAAW,GAAX,IAAkB,EAAlB,CADM;gBAEnB,aAAa,EAAb,CAFmB;uBAGZ,KAAX,IAAoB;sBACV,CAAR;aADF,CAHuB;uBAMZ,GAAX,CAAe,IAAf,CAAoB,UAApB,EANuB;WAAlB,MAOA,IAAI,OAAO,IAAP,EAAa;uBACX,GAAX,GAAiB,WAAW,GAAX,IAAkB,EAAlB,CADK;gBAElB,YAAY,EAAZ,CAFkB;sBAGZ,KAAV,IAAmB;qBACV,CAAP;aADF,CAHsB;uBAMX,GAAX,CAAe,IAAf,CAAoB,SAApB,EANsB;WAAjB,MAOA,IAAI,OAAO,KAAP,EAAc;uBACZ,GAAX,GAAiB,WAAW,GAAX,IAAkB,EAAlB,CADM;gBAEnB,aAAa,EAAb,CAFmB;uBAGZ,KAAX,IAAoB;sBACV,CAAR;aADF,CAHuB;uBAMZ,GAAX,CAAe,IAAf,CAAoB,UAApB,EANuB;WAAlB,MAOA,IAAI,OAAO,KAAP,EAAc;uBACZ,GAAX,GAAiB,WAAW,GAAX,IAAkB,EAAlB,CADM;gBAEnB,YAAY,EAAZ,CAFmB;sBAGb,KAAV,IAAmB;qBACV,CAAP;aADF,CAHuB;uBAMZ,GAAX,CAAe,IAAf,CAAoB,SAApB,EANuB;WAAlB,MAOA,IAAI,OAAO,QAAP,EAAiB;uBACf,GAAX,GAAiB,WAAW,GAAX,IAAkB,EAAlB,CADS;gBAEtB,aAAa,EAAb,CAFsB;uBAGf,KAAX,IAAoB;sBACV,CAAR;aADF,CAH0B;uBAMf,GAAX,CAAe,IAAf,CAAoB,UAApB,EAN0B;WAArB;SAvEQ,CAAjB,CAN6C;OAA3B,CAApB,CADyC;KAA3C;;WA0FO,UAAP,CA7GuB;GAlDsB;;;;;;;;;;;;;;;;4CA+K9B,QAAQ,OAAO;YACtB,UAAU,SAAS,EAAT,CAAlB,CAD8B;UAExB,OAAN,GAAgB,MAAM,OAAN,IAAiB,MAAM,IAAN,CAFH;UAGxB,IAAN,GAAa,MAAM,IAAN,IAAc,MAAM,MAAN,CAHG;;QAK1B,eAAe,EAAf,CAL0B;;QAO1B,MAAM,OAAN,EAAe;UACb,SAAS,MAAM,OAAN,CAAb,EAA6B;cACrB,OAAN,GAAgB,CACd,CAAC,MAAM,OAAN,EAAe,KAAhB,CADc,CAAhB,CAD2B;OAA7B;WAKK,IAAI,IAAI,CAAJ,EAAO,IAAI,MAAM,OAAN,CAAc,MAAd,EAAsB,GAA1C,EAA+C;YACzC,SAAS,MAAM,OAAN,CAAc,CAAd,CAAT,CAAJ,EAAgC;gBACxB,OAAN,CAAc,CAAd,IAAmB,CAAC,MAAM,OAAN,CAAc,CAAd,CAAD,EAAmB,KAAnB,CAAnB,CAD8B;SAAhC;OADF;mBAKa,IAAb,GAAoB,MAAM,OAAN,CAXH;KAAnB;;QAcI,MAAM,IAAN,EAAY;mBACD,IAAb,GAAoB,CAAC,MAAM,IAAN,CADP;KAAhB;;QAII,MAAM,KAAN,EAAa;mBACF,KAAb,GAAqB,CAAC,MAAM,KAAN,CADP;KAAjB;;WAIO,YAAP,CA7B8B;GA/Ke;;;;;;;;;;kCAsNnC,QAAQ,IAAI;QAClB,OAAO,SAAP,IAAoB,OAAO,WAAP,KAAuB,KAAvB,IAAgC,OAAO,EAAP,KAAc,QAAd,IAA0BC,cAAS,OAAT,CAAiB,EAAjB,CAA9E,IAAsG,EAAE,cAAcA,aAAd,CAAF,EAA2B;aAC5H,IAAIA,aAAJ,CAAa,EAAb,CAAP,CADmI;KAArI;WAGO,EAAP,CAJsB;GAtNuB;;;;;;;;;;4DAoOtB,QAAQ,KAAK,QAAQ;WACrC,KAAK,UAAL,CAAgB,IAAI,WAAJ,EAAhB,EAAmCF,iBAAQ,SAAR,CAAkB,uBAAlB,CAA0C,IAA1C,CAA+C,IAA/C,EAAqD,MAArD,EAA6D,GAA7D,EAAkE,MAAlE,CAAnC,CAAP,CAD4C;GApOC;;;;;;;;;;;;;;;;;sBAsPzC,QAAQ,IAAI,MAAM;QAChB,OAAO,IAAP,CADgB;QAElB,eAAJ;QAAY,WAAZ,CAFsB;aAGb,OAAO,EAAP,CAAT,CAHsB;SAIjB,IAAL,KAAc,KAAK,IAAL,GAAY,EAAZ,CAAd,CAJsB;;QAMhB,cAAc,KAAK,MAAL,CAAY,aAAZ,EAA2B,IAA3B,CAAd,CANgB;gBAOV,MAAZ,KAAuB,YAAY,MAAZ,GAAqB,EAArB,CAAvB,CAPsB;;WASf,KAAK,SAAL,GAAiB,IAAjB,CAAsB,UAAU,MAAV,EAAkB;;WAExC,KAAK,EAAL,GAAU,YAAV,CAFwC;aAGtC,QAAQ,KAAK,EAAL,EAAS,MAAT,EAAiB,EAAjB,EAAqB,IAArB,CAAR,EAAoC,IAApC,CAAyC,YAAY;eACnD,IAAI,OAAJ,CAAY,UAAU,OAAV,EAAmB,MAAnB,EAA2B;cACxC,aAAa,EAAb,CADwC;qBAEjC,OAAO,WAAP,CAAX,GAAiC,KAAK,UAAL,CAAgB,MAAhB,EAAwB,EAAxB,CAAjC,CAF4C;iBAGrC,UAAP,CAAkB,OAAO,KAAP,IAAgB,WAAW,OAAO,IAAP,CAA3B,CAAlB,CAA2D,OAA3D,CAAmE,UAAnE,EAA+E,WAA/E,EAA4F,UAAU,GAAV,EAAe,MAAf,EAAuB;mBAC1G,MAAM,OAAO,GAAP,CAAN,GAAoB,QAAQ,MAAR,CAApB,CAD0G;WAAvB,CAA5F,CAH4C;SAA3B,CAAnB,CAD0D;OAAZ,CAAhD,CAH6C;KAAlB,CAAtB,CAYJ,IAZI,CAYC,UAAU,OAAV,EAAmB;UACrB,CAAC,OAAD,EAAU;eAAA;OAAd;eAGS,OAAT,CAJyB;WAKpB,YAAL,CAAkB,MAAlB,EAA0B,IAA1B,EALyB;UAMnB,QAAQ,EAAR,CANmB;;sBAQT,MAAhB,EAAwB,IAAxB,EAA8B,UAAU,GAAV,EAAe,MAAf,EAAuB;YAC7C,gBAAgB,IAAI,WAAJ,EAAhB,CAD6C;YAE/C,aAAJ,CAFmD;;YAI/C,IAAI,UAAJ,KAAmB,IAAI,IAAJ,KAAa,QAAb,IAAyB,IAAI,IAAJ,KAAa,SAAb,CAA5C,EAAqE;cACnE,IAAI,IAAJ,KAAa,QAAb,EAAuB;mBAClB,KAAK,UAAL,CAAgB,MAAhB,EAAwB,GAAxB,EAA6B,MAA7B,EAAqC,MAArC,CAAP,CADyB;WAA3B,MAEO;mBACE,KAAK,WAAL,CAAiB,MAAjB,EAAyB,GAAzB,EAA8B,MAA9B,EAAsC,MAAtC,CAAP,CADK;WAFP;SADF,MAMO,IAAI,IAAI,IAAJ,KAAa,SAAb,IAA0B,IAAI,SAAJ,EAAe;cAC9C,YAAY,EAAZ,CAD8C;cAE9C,WAAW,IAAI,MAAJ,EAAY,IAAI,SAAJ,CAAZ,IAA8B,EAA9B,CAFmC;qBAGvC,QAAQ,QAAR,IAAoB,QAApB,GAA+B,OAAO,IAAP,CAAY,QAAZ,CAA/B,CAHuC;sBAItC,UAAU,MAAV,CAAiB,QAAjB,CAAZ,CAJkD;iBAK3C,KAAK,OAAL,CAAa,aAAb,EAA4B;mDAE9B,cAAc,WAAd,EAA4B;oBACrB,OAAO,SAAP,EAAkB,MAAlB,CAAyB,UAAU,CAAV,EAAa;uBAAS,CAAP,CAAF;eAAb,CAAzB,CAAoD,GAApD,CAAwD,UAAU,CAAV,EAAa;uBAAS,KAAK,UAAL,CAAgB,aAAhB,EAA+B,CAA/B,CAAP,CAAF;eAAb,CAA9D;cAFJ;WADK,EAMJ,MANI,EAMI,IANJ,CAMS,UAAU,YAAV,EAAwB;gBAClC,aAAJ,CAAkB,MAAlB,EAA0B,YAA1B,EADsC;WAAxB,CANhB,CALkD;SAA7C,MAcA,IAAI,IAAI,IAAJ,KAAa,SAAb,IAA0B,IAAI,WAAJ,EAAiB;iBAC7C,KAAK,OAAL,CAAa,aAAb,EAA4B;mDAE9B,IAAI,WAAJ,EAAkB;0BACL,KAAK,sBAAL,CAA4B,MAA5B,EAAoC,GAApC,EAAyC,MAAzC,CAAZ;cAFJ;WADK,EAMJ,MANI,EAMI,IANJ,CAMS,UAAU,YAAV,EAAwB;gBAClC,aAAJ,CAAkB,MAAlB,EAA0B,YAA1B,EADsC;WAAxB,CANhB,CADoD;SAA/C,MAUA,IAAI,IAAI,IAAJ,KAAa,WAAb,EAA0B;iBAC5B,KAAK,aAAL,CAAmB,MAAnB,EAA2B,GAA3B,EAAgC,MAAhC,EAAwC,MAAxC,CAAP,CADmC;SAA9B;YAGH,IAAJ,EAAU;gBACF,IAAN,CAAW,IAAX,EADQ;SAAV;OArC4B,CAA9B,CARyB;;aAkDlB,QAAQ,GAAR,CAAY,KAAZ,CAAP,CAlDyB;KAAnB,CAZD,CA+DJ,IA/DI,CA+DC,YAAY;UACd,WAAW,IAAIG,gBAAJ,CAAa,MAAb,EAAqB,EAArB,EAAyB,MAAzB,CAAX,CADc;eAET,KAAT,GAAiB,SAAS,CAAT,GAAa,CAAb,CAFC;iBAGP,KAAK,OAAL,CAAa,QAAb,EAAuB,IAAvB,CAAX;;;QAGA,GAAK,KAAK,EAAL,GAAU,WAAV,CANa;aAOX,QAAQ,KAAK,EAAL,EAAS,MAAT,EAAiB,EAAjB,EAAqB,IAArB,EAA2B,QAA3B,CAAR,EAA8C,IAA9C,CAAmD,UAAU,SAAV,EAAqB;;eAEtE,YAAY,SAAZ,IAAyB,QAAzB,GAAoC,SAApC,CAFsE;OAArB,CAA1D,CAPkB;KAAZ,CA/DR,CATsB;GAtPuB;;;;;;;;;;;;;;;;;4BA0VtC,QAAQ,OAAO,MAAM;QACtB,OAAO,IAAP,CADsB;aAEnB,OAAO,EAAP,CAAT,CAF4B;SAGvB,IAAL,KAAc,KAAK,IAAL,GAAY,EAAZ,CAAd,CAH4B;;QAKxB,UAAU,EAAV,CALwB;QAMxB,WAAJ,CAN4B;QAOtB,WAAW,KAAK,MAAL,CAAY,UAAZ,EAAwB,IAAxB,CAAX,CAPsB;WAQrB,QAAP,EAAiB,KAAK,eAAL,CAAqB,MAArB,EAA6B,KAA7B,CAAjB,EAR4B;aASnB,MAAT,KAAoB,SAAS,MAAT,GAAkB,EAAlB,CAApB,CAT4B;QAUtB,aAAa,KAAK,QAAL,CAAc,MAAd,EAAsB,KAAtB,CAAb,CAVsB;;WAYrB,KAAK,SAAL,GAAiB,IAAjB,CAAsB,UAAU,MAAV,EAAkB;;WAExC,KAAK,EAAL,GAAU,eAAV,CAFwC;aAGtC,QAAQ,KAAK,EAAL,EAAS,MAAT,EAAiB,KAAjB,EAAwB,IAAxB,CAAR,EAAuC,IAAvC,CAA4C,YAAY;eACtD,IAAI,OAAJ,CAAY,UAAU,OAAV,EAAmB,MAAnB,EAA2B;iBACrC,UAAP,CAAkB,OAAO,KAAP,IAAgB,WAAW,OAAO,IAAP,CAA3B,CAAlB,CAA2D,IAA3D,CAAgE,UAAhE,EAA4E,QAA5E,EAAsF,OAAtF,CAA8F,UAAU,GAAV,EAAe,MAAf,EAAuB;mBAC5G,MAAM,OAAO,GAAP,CAAN,GAAoB,QAAQ,MAAR,CAApB,CAD4G;WAAvB,CAA9F,CAD4C;SAA3B,CAAnB,CAD6D;OAAZ,CAAnD,CAH6C;KAAlB,CAAtB,CAUJ,IAVI,CAUC,UAAU,QAAV,EAAoB;gBAChB,QAAV,CAD0B;WAErB,YAAL,CAAkB,OAAlB,EAA2B,IAA3B,EAF0B;UAGpB,QAAQ,EAAR,CAHoB;sBAIV,MAAhB,EAAwB,IAAxB,EAA8B,UAAU,GAAV,EAAe,MAAf,EAAuB;YAC7C,gBAAgB,IAAI,WAAJ,EAAhB,CAD6C;YAE/C,aAAJ,CAFmD;YAG/C,IAAI,UAAJ,KAAmB,IAAI,IAAJ,KAAa,QAAb,IAAyB,IAAI,IAAJ,KAAa,SAAb,CAA5C,EAAqE;cACnE,IAAI,IAAJ,KAAa,SAAb,EAAwB;mBACnB,KAAK,WAAL,CAAiB,MAAjB,EAAyB,GAAzB,EAA8B,OAA9B,EAAuC,MAAvC,CAAP,CAD0B;WAA5B,MAEO;mBACE,KAAK,UAAL,CAAgB,MAAhB,EAAwB,GAAxB,EAA6B,OAA7B,EAAsC,MAAtC,CAAP,CADK;WAFP;SADF,MAMO,IAAI,IAAI,IAAJ,KAAa,SAAb,IAA0B,IAAI,SAAJ,EAAe;;gBAC9C,YAAY,EAAZ;oBACI,OAAR,CAAgB,UAAU,IAAV,EAAgB;kBAC1B,WAAW,KAAK,IAAI,SAAJ,CAAL,IAAuB,EAAvB,CADe;yBAEnB,QAAQ,QAAR,IAAoB,QAApB,GAA+B,OAAO,IAAP,CAAY,QAAZ,CAA/B,CAFmB;0BAGlB,UAAU,MAAV,CAAiB,QAAjB,CAAZ,CAH8B;aAAhB,CAAhB;mBAKO,KAAK,OAAL,CAAa,aAAb,EAA4B;qDAE9B,cAAc,WAAd,EAA4B;sBACrB,OAAO,SAAP,EAAkB,MAAlB,CAAyB,UAAU,CAAV,EAAa;yBAAS,CAAP,CAAF;iBAAb,CAAzB,CAAoD,GAApD,CAAwD,UAAU,CAAV,EAAa;yBAAS,KAAK,UAAL,CAAgB,aAAhB,EAA+B,CAA/B,CAAP,CAAF;iBAAb,CAA9D;gBAFJ;aADK,EAMJ,MANI,EAMI,IANJ,CAMS,UAAU,YAAV,EAAwB;sBAC9B,OAAR,CAAgB,UAAU,IAAV,EAAgB;oBAC1B,WAAW,EAAX,CAD0B;oBAE1B,WAAW,IAAI,IAAJ,EAAU,IAAI,SAAJ,CAAV,IAA4B,EAA5B,CAFe;2BAGnB,QAAQ,QAAR,IAAoB,QAApB,GAA+B,OAAO,IAAP,CAAY,QAAZ,CAA/B,CAHmB;6BAIjB,OAAb,CAAqB,UAAU,WAAV,EAAuB;sBACtC,YAAY,SAAS,OAAT,CAAiB,YAAY,cAAc,WAAd,CAA7B,MAA6D,CAAC,CAAD,EAAI;6BACtE,IAAT,CAAc,WAAd,EAD+E;mBAAjF;iBADmB,CAArB,CAJ8B;oBAS1B,aAAJ,CAAkB,IAAlB,EAAwB,QAAxB,EAT8B;eAAhB,CAAhB,CADsC;qBAY/B,YAAP,CAZsC;aAAxB,CANhB;eAPkD;SAA7C,MA2BA,IAAI,IAAI,IAAJ,KAAa,SAAb,IAA0B,IAAI,WAAJ,EAAiB;gBAC9C,IAAI,KAAJ,CAAU,uDAAV,CAAN,CADoD;SAA/C,MAEA,IAAI,IAAI,IAAJ,KAAa,WAAb,EAA0B;iBAC5B,KAAK,aAAL,CAAmB,MAAnB,EAA2B,GAA3B,EAAgC,OAAhC,EAAyC,MAAzC,CAAP,CADmC;SAA9B;YAGH,IAAJ,EAAU;gBACF,IAAN,CAAW,IAAX,EADQ;SAAV;OAzC4B,CAA9B,CAJ0B;aAiDnB,QAAQ,GAAR,CAAY,KAAZ,CAAP,CAjD0B;KAApB,CAVD,CA4DJ,IA5DI,CA4DC,YAAY;kBACN,UAAU,EAAV,CAAZ,CADkB;UAEd,WAAW,IAAIA,gBAAJ,CAAa,OAAb,EAAsB,EAAtB,EAA0B,SAA1B,CAAX,CAFc;eAGT,KAAT,GAAiB,QAAQ,MAAR,CAHC;iBAIP,KAAK,OAAL,CAAa,QAAb,EAAuB,IAAvB,CAAX;;;QAGA,GAAK,KAAK,EAAL,GAAU,cAAV,CAPa;aAQX,QAAQ,KAAK,EAAL,EAAS,MAAT,EAAiB,KAAjB,EAAwB,IAAxB,EAA8B,QAA9B,CAAR,EAAiD,IAAjD,CAAsD,UAAU,SAAV,EAAqB;;eAEzE,YAAY,SAAZ,IAAyB,QAAzB,GAAoC,SAApC,CAFyE;OAArB,CAA7D,CARkB;KAAZ,CA5DR,CAZ4B;GA1ViB;;;;;;;;;;;;;;;;0BA8bvC,QAAQ,OAAO,MAAM;QACrB,OAAO,IAAP,CADqB;QAEvB,WAAJ,CAF2B;cAGjB,QAAQ,EAAR,CAAV,CAH2B;aAIlB,OAAO,EAAP,CAAT,CAJ2B;;QAMrB,aAAa,KAAK,MAAL,CAAY,YAAZ,EAA0B,IAA1B,CAAb,CANqB;;WAQpB,KAAK,SAAL,GAAiB,IAAjB,CAAsB,UAAU,MAAV,EAAkB;;WAExC,KAAK,EAAL,GAAU,cAAV,CAFwC;aAGtC,QAAQ,KAAK,EAAL,EAAS,MAAT,EAAiB,KAAjB,EAAwB,IAAxB,CAAR,EAAuC,IAAvC,CAA4C,UAAU,MAAV,EAAkB;;gBAE3D,YAAY,MAAZ,IAAsB,KAAtB,GAA8B,MAA9B,CAF2D;iBAG1D,iBAAiB,MAAjB,EAAyB,KAAzB,CAAT,CAHmE;eAI5D,IAAI,OAAJ,CAAY,UAAU,OAAV,EAAmB,MAAnB,EAA2B;cACtC,aAAa,OAAO,UAAP,CAAkB,OAAO,KAAP,IAAgB,WAAW,OAAO,IAAP,CAA3B,CAA/B,CADsC;cAEtC,SAAS,WAAW,SAAX,GAAuB,WAAvB,GAAqC,QAArC,CAF6B;qBAGjC,MAAX,EAAmB,MAAnB,EAA2B,UAA3B,EAAuC,UAAU,GAAV,EAAe,MAAf,EAAuB;mBACrD,MAAM,OAAO,GAAP,CAAN,GAAoB,QAAQ,MAAR,CAApB,CADqD;WAAvB,CAAvC,CAH4C;SAA3B,CAAnB,CAJmE;OAAlB,CAA5C,CAWJ,IAXI,CAWC,UAAU,MAAV,EAAkB;YACpB,eAAJ,CADwB;YAEpB,IAAI,OAAO,GAAP,GAAa,OAAO,GAAP,GAAa,MAA1B,CAFgB;aAGnB,YAAL,CAAkB,CAAlB,EAAqB,IAArB,EAHwB;iBAIf,QAAQ,CAAR,IAAa,EAAE,CAAF,CAAb,GAAoB,CAApB,CAJe;eAKjB,UAAP,GAAoB,SAApB,CALwB;YAMpB,WAAW,IAAIA,gBAAJ,CAAa,MAAb,EAAqB,MAArB,EAA6B,QAA7B,CAAX,CANoB;iBAOf,OAAT,GAAmB,SAAS,CAAT,GAAa,CAAb,CAPK;mBAQb,KAAK,OAAL,CAAa,QAAb,EAAuB,IAAvB,CAAX;;;UAGA,GAAK,KAAK,EAAL,GAAU,aAAV,CAXmB;eAYjB,QAAQ,KAAK,EAAL,EAAS,MAAT,EAAiB,KAAjB,EAAwB,IAAxB,EAA8B,QAA9B,CAAR,EAAiD,IAAjD,CAAsD,UAAU,SAAV,EAAqB;;iBAEzE,YAAY,SAAZ,IAAyB,QAAzB,GAAoC,SAApC,CAFyE;SAArB,CAA7D,CAZwB;OAAlB,CAXR,CAH6C;KAAlB,CAA7B,CAR2B;GA9bkB;;;;;;;;;;;;;;;;;kCAsfnC,QAAQ,OAAO,MAAM;QACzB,OAAO,IAAP,CADyB;QAE3B,WAAJ,CAF+B;cAGrB,QAAQ,EAAR,CAAV,CAH+B;aAItB,OAAO,EAAP,CAAT,CAJ+B;;QAMzB,iBAAiB,KAAK,MAAL,CAAY,gBAAZ,EAA8B,IAA9B,CAAjB,CANyB;;WAQxB,KAAK,SAAL,GAAiB,IAAjB,CAAsB,UAAU,MAAV,EAAkB;;WAExC,KAAK,EAAL,GAAU,kBAAV,CAFwC;aAGtC,QAAQ,KAAK,EAAL,EAAS,MAAT,EAAiB,KAAjB,EAAwB,IAAxB,CAAR,EAAuC,IAAvC,CAA4C,UAAU,MAAV,EAAkB;;gBAE3D,YAAY,MAAZ,IAAsB,KAAtB,GAA8B,MAA9B,CAF2D;iBAG1D,MAAM,GAAN,CAAU,UAAU,MAAV,EAAkB;iBAC5B,iBAAiB,MAAjB,EAAyB,MAAzB,CAAP,CADmC;SAAlB,CAAnB,CAHmE;eAM5D,IAAI,OAAJ,CAAY,UAAU,OAAV,EAAmB,MAAnB,EAA2B;cACtC,aAAa,OAAO,UAAP,CAAkB,OAAO,KAAP,IAAgB,WAAW,OAAO,IAAP,CAA3B,CAA/B,CADsC;qBAEjC,UAAX,CAAsB,MAAtB,EAA8B,cAA9B,EAA8C,UAAU,GAAV,EAAe,MAAf,EAAuB;mBAC5D,MAAM,OAAO,GAAP,CAAN,GAAoB,QAAQ,MAAR,CAApB,CAD4D;WAAvB,CAA9C,CAF4C;SAA3B,CAAnB,CANmE;OAAlB,CAA5C,CAYJ,IAZI,CAYC,UAAU,MAAV,EAAkB;YACpB,UAAU,EAAV,CADoB;YAEpB,IAAI,OAAO,GAAP,GAAa,OAAO,GAAP,GAAa,MAA1B,CAFgB;aAGnB,YAAL,CAAkB,CAAlB,EAAqB,IAArB,EAHwB;kBAId,CAAV,CAJwB;eAKjB,UAAP,GAAoB,SAApB,CALwB;YAMpB,WAAW,IAAIA,gBAAJ,CAAa,OAAb,EAAsB,MAAtB,EAA8B,YAA9B,CAAX,CANoB;iBAOf,OAAT,GAAmB,QAAQ,MAAR,CAPK;mBAQb,KAAK,OAAL,CAAa,QAAb,EAAuB,IAAvB,CAAX;;;UAGA,GAAK,KAAK,EAAL,GAAU,iBAAV,CAXmB;eAYjB,QAAQ,KAAK,EAAL,EAAS,MAAT,EAAiB,KAAjB,EAAwB,IAAxB,EAA8B,QAA9B,CAAR,EAAiD,IAAjD,CAAsD,UAAU,SAAV,EAAqB;;iBAEzE,YAAY,SAAZ,IAAyB,QAAzB,GAAoC,SAApC,CAFyE;SAArB,CAA7D,CAZwB;OAAlB,CAZR,CAH6C;KAAlB,CAA7B,CAR+B;GAtfc;;;;;;;;;;;;;;;;4BA8iBtC,QAAQ,IAAI,MAAM;QACnB,OAAO,IAAP,CADmB;QAErB,WAAJ,CAFyB;aAGhB,OAAO,EAAP,CAAT,CAHyB;QAInB,aAAa,KAAK,MAAL,CAAY,YAAZ,EAA0B,IAA1B,CAAb,CAJmB;;WAMlB,KAAK,SAAL,GAAiB,IAAjB,CAAsB,UAAU,MAAV,EAAkB;;WAExC,KAAK,EAAL,GAAU,eAAV,CAFwC;aAGtC,QAAQ,KAAK,EAAL,EAAS,MAAT,EAAiB,EAAjB,EAAqB,IAArB,CAAR,EAAoC,IAApC,CAAyC,YAAY;eACnD,IAAI,OAAJ,CAAY,UAAU,OAAV,EAAmB,MAAnB,EAA2B;cACtC,aAAa,EAAb,CADsC;qBAEjC,OAAO,WAAP,CAAX,GAAiC,KAAK,UAAL,CAAgB,MAAhB,EAAwB,EAAxB,CAAjC,CAF4C;cAGtC,aAAa,OAAO,UAAP,CAAkB,OAAO,KAAP,IAAgB,WAAW,OAAO,IAAP,CAA3B,CAA/B,CAHsC;qBAIjC,WAAW,SAAX,GAAuB,WAAvB,GAAqC,QAArC,CAAX,CAA0D,UAA1D,EAAsE,UAAtE,EAAkF,UAAU,GAAV,EAAe,MAAf,EAAuB;mBAChG,MAAM,OAAO,GAAP,CAAN,GAAoB,QAAQ,MAAR,CAApB,CADgG;WAAvB,CAAlF,CAJ4C;SAA3B,CAAnB,CAD0D;OAAZ,CAAhD,CAH6C;KAAlB,CAAtB,CAaJ,IAbI,CAaC,UAAU,MAAV,EAAkB;aACjB,UAAP,GAAoB,SAApB,CADwB;UAEpB,WAAW,IAAIA,gBAAJ,CAAa,SAAb,EAAwB,MAAxB,EAAgC,SAAhC,CAAX,CAFoB;iBAGb,KAAK,OAAL,CAAa,QAAb,EAAuB,IAAvB,CAAX;;;QAGA,GAAK,KAAK,EAAL,GAAU,cAAV,CANmB;aAOjB,QAAQ,KAAK,EAAL,EAAS,MAAT,EAAiB,EAAjB,EAAqB,IAArB,EAA2B,QAA3B,CAAR,EAA8C,IAA9C,CAAmD,UAAU,SAAV,EAAqB;;eAEtE,YAAY,SAAZ,IAAyB,QAAzB,GAAoC,SAApC,CAFsE;OAArB,CAA1D,CAPwB;KAAlB,CAbR,CANyB;GA9iBoB;;;;;;;;;;;;;;;;kCA4lBnC,QAAQ,OAAO,MAAM;QACzB,OAAO,IAAP,CADyB;QAE3B,WAAJ,CAF+B;cAGrB,QAAQ,EAAR,CAAV,CAH+B;aAItB,OAAO,EAAP,CAAT,CAJ+B;QAKzB,aAAa,KAAK,MAAL,CAAY,YAAZ,EAA0B,IAA1B,CAAb,CALyB;WAMxB,UAAP,EAAmB,KAAK,eAAL,CAAqB,MAArB,EAA6B,KAA7B,CAAnB,EAN+B;;WAQxB,KAAK,SAAL,GAAiB,IAAjB,CAAsB,UAAU,MAAV,EAAkB;;WAExC,KAAK,EAAL,GAAU,kBAAV,CAFwC;aAGtC,QAAQ,KAAK,EAAL,EAAS,MAAT,EAAiB,KAAjB,EAAwB,IAAxB,CAAR,EAAuC,IAAvC,CAA4C,YAAY;YACvD,aAAa,KAAK,QAAL,CAAc,MAAd,EAAsB,KAAtB,CAAb,CADuD;eAEtD,IAAI,OAAJ,CAAY,UAAU,OAAV,EAAmB,MAAnB,EAA2B;cACtC,aAAa,OAAO,UAAP,CAAkB,OAAO,KAAP,IAAgB,WAAW,OAAO,IAAP,CAA3B,CAA/B,CADsC;qBAEjC,WAAW,UAAX,GAAwB,YAAxB,GAAuC,QAAvC,CAAX,CAA4D,UAA5D,EAAwE,UAAxE,EAAoF,UAAU,GAAV,EAAe,MAAf,EAAuB;mBAClG,MAAM,OAAO,GAAP,CAAN,GAAoB,QAAQ,MAAR,CAApB,CADkG;WAAvB,CAApF,CAF4C;SAA3B,CAAnB,CAF6D;OAAZ,CAAnD,CAH6C;KAAlB,CAAtB,CAYJ,IAZI,CAYC,UAAU,MAAV,EAAkB;aACjB,UAAP,GAAoB,SAApB,CADwB;UAEpB,WAAW,IAAIA,gBAAJ,CAAa,SAAb,EAAwB,MAAxB,EAAgC,YAAhC,CAAX,CAFoB;iBAGb,KAAK,OAAL,CAAa,QAAb,EAAuB,IAAvB,CAAX;;;QAGA,GAAK,KAAK,EAAL,GAAU,iBAAV,CANmB;aAOjB,QAAQ,KAAK,EAAL,EAAS,MAAT,EAAiB,KAAjB,EAAwB,IAAxB,EAA8B,QAA9B,CAAR,EAAiD,IAAjD,CAAsD,UAAU,SAAV,EAAqB;;eAEzE,YAAY,SAAZ,IAAyB,QAAzB,GAAoC,SAApC,CAFyE;OAArB,CAA7D,CAPwB;KAAlB,CAZR,CAR+B;GA5lBc;;;;;;;;;;;;;;;;;0BA4oBvC,QAAQ,IAAI,OAAO,MAAM;QACzB,OAAO,IAAP,CADyB;cAErB,QAAQ,EAAR,CAAV,CAF+B;aAGtB,OAAO,EAAP,CAAT,CAH+B;QAI3B,WAAJ,CAJ+B;QAKzB,aAAa,KAAK,MAAL,CAAY,YAAZ,EAA0B,IAA1B,CAAb,CALyB;;WAOxB,KAAK,IAAL,CAAU,MAAV,EAAkB,EAAlB,EAAsB,EAAE,KAAK,KAAL,EAAxB,EAAsC,IAAtC,CAA2C,UAAU,MAAV,EAAkB;UAC9D,CAAC,MAAD,EAAS;cACL,IAAI,KAAJ,CAAU,WAAV,CAAN,CADW;OAAb;;QAIA,GAAK,KAAK,EAAL,GAAU,cAAV,CAL6D;aAM3D,QAAQ,KAAK,EAAL,EAAS,MAAT,EAAiB,EAAjB,EAAqB,KAArB,EAA4B,IAA5B,CAAR,CAAP,CANkE;KAAlB,CAA3C,CAOJ,IAPI,CAOC,UAAU,MAAV,EAAkB;;cAEhB,YAAY,MAAZ,IAAsB,KAAtB,GAA8B,MAA9B,CAFgB;eAGf,iBAAiB,MAAjB,EAAyB,KAAzB,CAAT,CAHwB;aAIjB,KAAK,SAAL,GAAiB,IAAjB,CAAsB,UAAU,MAAV,EAAkB;eACtC,IAAI,OAAJ,CAAY,UAAU,OAAV,EAAmB,MAAnB,EAA2B;cACtC,aAAa,EAAb,CADsC;qBAEjC,OAAO,WAAP,CAAX,GAAiC,KAAK,UAAL,CAAgB,MAAhB,EAAwB,EAAxB,CAAjC,CAF4C;cAGtC,aAAa,OAAO,UAAP,CAAkB,OAAO,KAAP,IAAgB,WAAW,OAAO,IAAP,CAA3B,CAA/B,CAHsC;qBAIjC,WAAW,SAAX,GAAuB,WAAvB,GAAqC,QAArC,CAAX,CAA0D,UAA1D,EAAsE,EAAE,MAAM,MAAN,EAAxE,EAAwF,UAAxF,EAAoG,UAAU,GAAV,EAAe,MAAf,EAAuB;mBAClH,MAAM,OAAO,GAAP,CAAN,GAAoB,QAAQ,MAAR,CAApB,CADkH;WAAvB,CAApG,CAJ4C;SAA3B,CAAnB,CAD6C;OAAlB,CAA7B,CAJwB;KAAlB,CAPD,CAqBJ,IArBI,CAqBC,UAAU,MAAV,EAAkB;aACjB,KAAK,IAAL,CAAU,MAAV,EAAkB,EAAlB,EAAsB,EAAE,KAAK,KAAL,EAAxB,EAAsC,IAAtC,CAA2C,UAAU,MAAV,EAAkB;eAC3D,UAAP,GAAoB,SAApB,CADkE;YAE9D,WAAW,IAAIA,gBAAJ,CAAa,MAAb,EAAqB,MAArB,EAA6B,QAA7B,CAAX,CAF8D;iBAGzD,OAAT,GAAmB,CAAnB,CAHkE;mBAIvD,KAAK,OAAL,CAAa,QAAb,EAAuB,IAAvB,CAAX;;;UAGA,GAAK,KAAK,EAAL,GAAU,aAAV,CAP6D;eAQ3D,QAAQ,KAAK,EAAL,EAAS,MAAT,EAAiB,EAAjB,EAAqB,KAArB,EAA4B,IAA5B,EAAkC,QAAlC,CAAR,EAAqD,IAArD,CAA0D,UAAU,SAAV,EAAqB;;iBAE7E,YAAY,SAAZ,IAAyB,QAAzB,GAAoC,SAApC,CAF6E;SAArB,CAAjE,CARkE;OAAlB,CAAlD,CADwB;KAAlB,CArBR,CAP+B;GA5oBc;;;;;;;;;;;;;;;;;gCAusBpC,QAAQ,OAAO,OAAO,MAAM;QAC/B,OAAO,IAAP,CAD+B;cAE3B,QAAQ,EAAR,CAAV,CAFqC;cAG3B,QAAQ,EAAR,CAAV,CAHqC;aAI5B,OAAO,EAAP,CAAT,CAJqC;QAKjC,WAAJ;QAAQ,YAAR,CALqC;QAM/B,aAAa,KAAK,MAAL,CAAY,YAAZ,EAA0B,IAA1B,CAAb,CAN+B;eAO1B,KAAX,GAAmB,IAAnB,CAPqC;;WAS9B,KAAK,SAAL,GAAiB,IAAjB,CAAsB,UAAU,MAAV,EAAkB;UACvC,eAAe,KAAK,eAAL,CAAqB,MAArB,EAA6B,KAA7B,CAAf,CADuC;UAEvC,aAAa,KAAK,QAAL,CAAc,MAAd,EAAsB,KAAtB,CAAb;;;QAGN,GAAK,KAAK,EAAL,GAAU,iBAAV,CALwC;aAMtC,QAAQ,KAAK,EAAL,EAAS,MAAT,EAAiB,KAAjB,EAAwB,KAAxB,EAA+B,IAA/B,CAAR,EAA8C,IAA9C,CAAmD,UAAU,MAAV,EAAkB;;gBAElE,YAAY,MAAZ,IAAsB,KAAtB,GAA8B,MAA9B,CAFkE;iBAGjE,iBAAiB,MAAjB,EAAyB,KAAzB,CAAT,CAH0E;qBAI7D,IAAb,GAAoB,MAApB,CAJ0E;eAKnE,KAAK,OAAL,CAAa,MAAb,EAAqB,KAArB,EAA4B,EAAE,KAAK,KAAL,EAA9B,CAAP,CAL0E;OAAlB,CAAnD,CAMJ,IANI,CAMC,UAAU,OAAV,EAAmB;cACnB,QAAQ,GAAR,CAAY,UAAU,MAAV,EAAkB;iBAC3B,KAAK,UAAL,CAAgB,MAAhB,EAAwB,OAAO,OAAO,WAAP,CAA/B,CAAP,CADkC;SAAlB,CAAlB,CADyB;;eAKlB,IAAI,OAAJ,CAAY,UAAU,OAAV,EAAmB,MAAnB,EAA2B;cACtC,aAAa,OAAO,UAAP,CAAkB,OAAO,KAAP,IAAgB,WAAW,OAAO,IAAP,CAA3B,CAA/B,CADsC;qBAEjC,WAAW,UAAX,GAAwB,YAAxB,GAAuC,QAAvC,CAAX,CAA4D,UAA5D,EAAwE,YAAxE,EAAsF,UAAtF,EAAkG,UAAU,GAAV,EAAe,MAAf,EAAuB;mBAChH,MAAM,OAAO,GAAP,CAAN,GAAoB,QAAQ,MAAR,CAApB,CADgH;WAAvB,CAAlG,CAF4C;SAA3B,CAAnB,CALyB;OAAnB,CAND,CAiBJ,IAjBI,CAiBC,UAAU,MAAV,EAAkB;YAClB,QAAQ,EAAR,CADkB;cAElB,OAAO,WAAP,CAAN,GAA4B;gBACpB,GAAN;SADF,CAFwB;eAKjB,KAAK,OAAL,CAAa,MAAb,EAAqB,KAArB,EAA4B,EAAE,KAAK,KAAL,EAA9B,EAA4C,IAA5C,CAAiD,UAAU,OAAV,EAAmB;iBAClE,UAAP,GAAoB,SAApB,CADyE;cAErE,WAAW,IAAIA,gBAAJ,CAAa,OAAb,EAAsB,MAAtB,EAA8B,QAA9B,CAAX,CAFqE;mBAGhE,OAAT,GAAmB,QAAQ,MAAR,CAHsD;qBAI9D,KAAK,OAAL,CAAa,QAAb,EAAuB,IAAvB,CAAX;;;YAGA,GAAK,KAAK,EAAL,GAAU,gBAAV,CAPoE;iBAQlE,QAAQ,KAAK,EAAL,EAAS,MAAT,EAAiB,KAAjB,EAAwB,KAAxB,EAA+B,IAA/B,EAAqC,QAArC,CAAR,EAAwD,IAAxD,CAA6D,UAAU,SAAV,EAAqB;;mBAEhF,YAAY,SAAZ,IAAyB,QAAzB,GAAoC,SAApC,CAFgF;WAArB,CAApE,CARyE;SAAnB,CAAxD,CALwB;OAAlB,CAjBR,CAN6C;KAAlB,CAA7B,CATqC;GAvsBQ;;;;;;;;;oCAmwBjC;UACN,IAAI,KAAJ,CAAU,gBAAV,CAAN,CADY;GAnwBiC;CAAjD;;"} \ No newline at end of file +{"version":3,"file":"js-data-mongodb.js","sources":["../src/index.js"],"sourcesContent":["import {MongoClient} from 'mongodb'\nimport {ObjectID} from 'bson'\nimport {utils} from 'js-data'\nimport Adapter from 'js-data-adapter'\nimport {\n reserved\n} from 'js-data-adapter'\nimport underscore from 'mout/string/underscore'\n\nconst {\n addHiddenPropsToTarget,\n classCallCheck,\n extend,\n fillIn,\n forOwn,\n isArray,\n isObject,\n isString,\n plainCopy\n} = utils\n\nconst DEFAULTS = {\n /**\n * Convert ObjectIDs to strings when pulling records out of the database.\n *\n * @name MongoDBAdapter#translateId\n * @type {boolean}\n * @default true\n */\n translateId: true,\n\n /**\n * MongoDB URI.\n *\n * @name MongoDBAdapter#uri\n * @type {string}\n * @default mongodb://localhost:27017\n */\n uri: 'mongodb://localhost:27017'\n}\n\nconst FIND_OPTS_DEFAULTS = {}\nconst FIND_ONE_OPTS_DEFAULTS = {}\nconst INSERT_OPTS_DEFAULTS = {}\nconst INSERT_MANY_OPTS_DEFAULTS = {}\nconst UPDATE_OPTS_DEFAULTS = {}\nconst REMOVE_OPTS_DEFAULTS = {}\n\n/**\n * MongoDBAdapter class.\n *\n * @example\n * // Use Container instead of DataStore on the server\n * import {Container} from 'js-data'\n * import MongoDBAdapter from 'js-data-mongodb'\n *\n * // Create a store to hold your Mappers\n * const store = new Container({\n * mapperDefaults: {\n * // MongoDB uses \"_id\" as the primary key\n * idAttribute: '_id'\n * }\n * })\n *\n * // Create an instance of MongoDBAdapter with default settings\n * const adapter = new MongoDBAdapter()\n *\n * // Mappers in \"store\" will use the MongoDB adapter by default\n * store.registerAdapter('mongodb', adapter, { default: true })\n *\n * // Create a Mapper that maps to a \"user\" collection\n * store.defineMapper('user')\n *\n * @class MongoDBAdapter\n * @extends Adapter\n * @param {Object} [opts] Configuration opts.\n * @param {boolean} [opts.debug=false] Whether to log debugging information.\n * @param {Object} [opts.findOpts] Options to pass to collection#find.\n * @param {Object} [opts.findOneOpts] Options to pass to collection#findOne.\n * @param {Object} [opts.insertOpts] Options to pass to collection#insert.\n * @param {Object} [opts.insertManyOpts] Options to pass to\n * collection#insertMany.\n * @param {boolean} [opts.raw=false] Whether to return detailed result objects\n * instead of just record data.\n * @param {Object} [opts.removeOpts] Options to pass to collection#remove.\n * @param {boolean} [opts.translateId=true] Convert ObjectIDs to strings when\n * pulling records out of the database.\n * @param {Object} [opts.updateOpts] Options to pass to collection#update.\n * @param {string} [opts.uri=\"mongodb://localhost:27017\"] MongoDB URI.\n */\nfunction MongoDBAdapter (opts) {\n const self = this\n classCallCheck(self, MongoDBAdapter)\n opts || (opts = {})\n if (isString(opts)) {\n opts = { uri: opts }\n }\n fillIn(opts, DEFAULTS)\n Adapter.call(self, opts)\n\n /**\n * Default options to pass to collection#find.\n *\n * @name MongoDBAdapter#findOpts\n * @type {Object}\n * @default {}\n */\n self.findOpts || (self.findOpts = {})\n fillIn(self.findOpts, FIND_OPTS_DEFAULTS)\n\n /**\n * Default options to pass to collection#findOne.\n *\n * @name MongoDBAdapter#findOneOpts\n * @type {Object}\n * @default {}\n */\n self.findOneOpts || (self.findOneOpts = {})\n fillIn(self.findOneOpts, FIND_ONE_OPTS_DEFAULTS)\n\n /**\n * Default options to pass to collection#insert.\n *\n * @name MongoDBAdapter#insertOpts\n * @type {Object}\n * @default {}\n */\n self.insertOpts || (self.insertOpts = {})\n fillIn(self.insertOpts, INSERT_OPTS_DEFAULTS)\n\n /**\n * Default options to pass to collection#insertMany.\n *\n * @name MongoDBAdapter#insertManyOpts\n * @type {Object}\n * @default {}\n */\n self.insertManyOpts || (self.insertManyOpts = {})\n fillIn(self.insertManyOpts, INSERT_MANY_OPTS_DEFAULTS)\n\n /**\n * Default options to pass to collection#update.\n *\n * @name MongoDBAdapter#updateOpts\n * @type {Object}\n * @default {}\n */\n self.updateOpts || (self.updateOpts = {})\n fillIn(self.updateOpts, UPDATE_OPTS_DEFAULTS)\n\n /**\n * Default options to pass to collection#update.\n *\n * @name MongoDBAdapter#removeOpts\n * @type {Object}\n * @default {}\n */\n self.removeOpts || (self.removeOpts = {})\n fillIn(self.removeOpts, REMOVE_OPTS_DEFAULTS)\n\n /**\n * A Promise that resolves to a reference to the MongoDB client being used by\n * this adapter.\n *\n * @name MongoDBAdapter#client\n * @type {Object}\n */\n self.client = new Promise(function (resolve, reject) {\n MongoClient.connect(opts.uri, function (err, db) {\n return err ? reject(err) : resolve(db)\n })\n })\n}\n\n// Setup prototype inheritance from Adapter\nMongoDBAdapter.prototype = Object.create(Adapter.prototype, {\n constructor: {\n value: MongoDBAdapter,\n enumerable: false,\n writable: true,\n configurable: true\n }\n})\n\nObject.defineProperty(MongoDBAdapter, '__super__', {\n configurable: true,\n value: Adapter\n})\n\n/**\n * Alternative to ES6 class syntax for extending `MongoDBAdapter`.\n *\n * @name MongoDBAdapter.extend\n * @method\n * @param {Object} [instanceProps] Properties that will be added to the\n * prototype of the MongoDBAdapter.\n * @param {Object} [classProps] Properties that will be added as static\n * properties to the MongoDBAdapter itself.\n * @return {Object} MongoDBAdapter of `MongoDBAdapter`.\n */\nMongoDBAdapter.extend = extend\n\naddHiddenPropsToTarget(MongoDBAdapter.prototype, {\n /**\n * Translate ObjectIDs to strings.\n *\n * @name MongoDBAdapter#_translateId\n * @method\n * @return {*}\n */\n _translateId (r, opts) {\n opts || (opts = {})\n if (this.getOpt('translateId', opts)) {\n if (isArray(r)) {\n r.forEach(function (_r) {\n const __id = _r._id ? _r._id.toString() : _r._id\n _r._id = typeof __id === 'string' ? __id : _r._id\n })\n } else if (isObject(r)) {\n const __id = r._id ? r._id.toString() : r._id\n r._id = typeof __id === 'string' ? __id : r._id\n }\n }\n return r\n },\n\n /**\n * Create a new record.\n *\n * @name MongoDBAdapter#create\n * @method\n * @param {Object} mapper The mapper.\n * @param {Object} props The record to be created.\n * @param {Object} [opts] Configuration options.\n * @param {Object} [opts.insertOpts] Options to pass to collection#insert.\n * @param {boolean} [opts.raw=false] Whether to return a more detailed\n * @return {Promise}\n */\n\n /**\n * Create a new record. Internal method used by Adapter#create.\n *\n * @name MongoDBAdapter#_create\n * @method\n * @private\n * @param {Object} mapper The mapper.\n * @param {Object} props The record to be created.\n * @param {Object} [opts] Configuration options.\n * @return {Promise}\n */\n _create (mapper, props, opts) {\n const self = this\n props || (props = {})\n opts || (opts = {})\n props = plainCopy(props)\n\n const insertOpts = self.getOpt('insertOpts', opts)\n\n return self.getClient().then(function (client) {\n return new Promise(function (resolve, reject) {\n const collection = client.collection(mapper.table || underscore(mapper.name))\n const method = collection.insertOne ? 'insertOne' : 'insert'\n collection[method](props, insertOpts, function (err, cursor) {\n return err ? reject(err) : resolve(cursor)\n })\n })\n }).then(function (cursor) {\n let record\n let r = cursor.ops ? cursor.ops : cursor\n self._translateId(r, opts)\n record = isArray(r) ? r[0] : r\n cursor.connection = undefined\n return [record, cursor]\n })\n },\n\n /**\n * Create multiple records in a single batch.\n *\n * @name MongoDBAdapter#createMany\n * @method\n * @param {Object} mapper The mapper.\n * @param {Object} props The records to be created.\n * @param {Object} [opts] Configuration options.\n * @param {Object} [opts.insertManyOpts] Options to pass to\n * collection#insertMany.\n * @param {boolean} [opts.raw=false] Whether to return a more detailed\n * response object.\n * @return {Promise}\n */\n\n /**\n * Create multiple records in a single batch. Internal method used by\n * Adapter#createMany.\n *\n * @name MongoDBAdapter#_createMany\n * @method\n * @private\n * @param {Object} mapper The mapper.\n * @param {Object} props The records to be created.\n * @param {Object} [opts] Configuration options.\n * @return {Promise}\n */\n _createMany (mapper, props, opts) {\n const self = this\n props || (props = {})\n opts || (opts = {})\n props = plainCopy(props)\n\n const insertManyOpts = self.getOpt('insertManyOpts', opts)\n\n return self.getClient().then(function (client) {\n return new Promise(function (resolve, reject) {\n const collection = client.collection(mapper.table || underscore(mapper.name))\n collection.insertMany(props, insertManyOpts, function (err, cursor) {\n return err ? reject(err) : resolve(cursor)\n })\n })\n }).then(function (cursor) {\n let records = []\n let r = cursor.ops ? cursor.ops : cursor\n self._translateId(r, opts)\n records = r\n cursor.connection = undefined\n return [records, cursor]\n })\n },\n\n /**\n * Destroy the record with the given primary key.\n *\n * @name MongoDBAdapter#destroy\n * @method\n * @param {Object} mapper The mapper.\n * @param {(string|number)} id Primary key of the record to destroy.\n * @param {Object} [opts] Configuration options.\n * @param {boolean} [opts.raw=false] Whether to return a more detailed\n * response object.\n * @param {Object} [opts.removeOpts] Options to pass to collection#remove.\n * @return {Promise}\n */\n\n /**\n * Destroy the record with the given primary key. Internal method used by\n * Adapter#destroy.\n *\n * @name MongoDBAdapter#_destroy\n * @method\n * @private\n * @param {Object} mapper The mapper.\n * @param {(string|number)} id Primary key of the record to destroy.\n * @param {Object} [opts] Configuration options.\n * @return {Promise}\n */\n _destroy (mapper, id, opts) {\n const self = this\n opts || (opts = {})\n const removeOpts = self.getOpt('removeOpts', opts)\n\n return self.getClient().then(function (client) {\n return new Promise(function (resolve, reject) {\n const mongoQuery = {}\n mongoQuery[mapper.idAttribute] = self.toObjectID(mapper, id)\n const collection = client.collection(mapper.table || underscore(mapper.name))\n collection[collection.deleteOne ? 'deleteOne' : 'remove'](mongoQuery, removeOpts, function (err, cursor) {\n return err ? reject(err) : resolve(cursor)\n })\n })\n }).then(function (cursor) {\n return [undefined, cursor]\n })\n },\n\n /**\n * Destroy the records that match the selection query.\n *\n * @name MongoDBAdapter#destroyAll\n * @method\n * @param {Object} mapper the mapper.\n * @param {Object} [query] Selection query.\n * @param {Object} [query.where] Filtering criteria.\n * @param {string|Array} [query.orderBy] Sorting criteria.\n * @param {string|Array} [query.sort] Same as `query.sort`.\n * @param {number} [query.limit] Limit results.\n * @param {number} [query.skip] Offset results.\n * @param {number} [query.offset] Same as `query.skip`.\n * @param {Object} [opts] Configuration options.\n * @param {boolean} [opts.raw=false] Whether to return a more detailed\n * response object.\n * @param {Object} [opts.removeOpts] Options to pass to collection#remove.\n * @return {Promise}\n */\n\n /**\n * Destroy the records that match the selection query. Internal method used by\n * Adapter#destroyAll.\n *\n * @name MongoDBAdapter#_destroyAll\n * @method\n * @private\n * @param {Object} mapper the mapper.\n * @param {Object} [query] Selection query.\n * @param {Object} [opts] Configuration options.\n * @return {Promise}\n */\n _destroyAll (mapper, query, opts) {\n const self = this\n query || (query = {})\n opts || (opts = {})\n const removeOpts = self.getOpt('removeOpts', opts)\n fillIn(removeOpts, self.getQueryOptions(mapper, query))\n\n return self.getClient().then(function (client) {\n const mongoQuery = self.getQuery(mapper, query)\n return new Promise(function (resolve, reject) {\n const collection = client.collection(mapper.table || underscore(mapper.name))\n collection[collection.deleteMany ? 'deleteMany' : 'remove'](mongoQuery, removeOpts, function (err, cursor) {\n return err ? reject(err) : resolve(cursor)\n })\n })\n }).then(function (cursor) {\n cursor.connection = undefined\n return [undefined, cursor]\n })\n },\n\n /**\n * Retrieve the record with the given primary key.\n *\n * @name MongoDBAdapter#find\n * @method\n * @param {Object} mapper The mapper.\n * @param {(string|number)} id Primary key of the record to retrieve.\n * @param {Object} [opts] Configuration options.\n * @param {Object} [opts.findOneOpts] Options to pass to collection#findOne.\n * @param {boolean} [opts.raw=false] Whether to return a more detailed\n * response object.\n * @param {string[]} [opts.with=[]] Relations to eager load.\n * @return {Promise}\n */\n\n /**\n * Retrieve the record with the given primary key. Internal method used by\n * Adapter#find.\n *\n * @name MongoDBAdapter#_find\n * @method\n * @private\n * @param {Object} mapper The mapper.\n * @param {(string|number)} id Primary key of the record to retrieve.\n * @param {Object} [opts] Configuration options.\n * @return {Promise}\n */\n _find (mapper, id, opts) {\n const self = this\n opts || (opts = {})\n opts.with || (opts.with = [])\n\n const findOneOpts = self.getOpt('findOneOpts', opts)\n findOneOpts.fields || (findOneOpts.fields = {})\n\n return self.getClient().then(function (client) {\n return new Promise(function (resolve, reject) {\n let mongoQuery = {}\n mongoQuery[mapper.idAttribute] = self.toObjectID(mapper, id)\n client.collection(mapper.table || underscore(mapper.name)).findOne(mongoQuery, findOneOpts, function (err, record) {\n return err ? reject(err) : resolve(record)\n })\n })\n }).then(function (record) {\n if (record) {\n self._translateId(record, opts)\n }\n return [record, {}]\n })\n },\n\n /**\n * Retrieve the records that match the selection query.\n *\n * @name MongoDBAdapter#findAll\n * @method\n * @param {Object} mapper The mapper.\n * @param {Object} query Selection query.\n * @param {Object} [opts] Configuration options.\n * @param {Object} [opts.findOpts] Options to pass to collection#find.\n * @param {boolean} [opts.raw=false] Whether to return a more detailed\n * response object.\n * @param {string[]} [opts.with=[]] Relations to eager load.\n * @return {Promise}\n */\n\n /**\n * Retrieve the records that match the selection query. Internal method used\n * by Adapter#findAll.\n *\n * @name MongoDBAdapter#_findAll\n * @method\n * @private\n * @param {Object} mapper The mapper.\n * @param {Object} query Selection query.\n * @param {Object} [opts] Configuration options.\n * @return {Promise}\n */\n _findAll (mapper, query, opts) {\n const self = this\n opts || (opts = {})\n\n const findOpts = self.getOpt('findOpts', opts)\n fillIn(findOpts, self.getQueryOptions(mapper, query))\n findOpts.fields || (findOpts.fields = {})\n const mongoQuery = self.getQuery(mapper, query)\n\n return self.getClient().then(function (client) {\n return new Promise(function (resolve, reject) {\n client.collection(mapper.table || underscore(mapper.name)).find(mongoQuery, findOpts).toArray(function (err, records) {\n return err ? reject(err) : resolve(records)\n })\n })\n }).then(function (records) {\n self._translateId(records, opts)\n return [records, {}]\n })\n },\n\n /**\n * Apply the given update to the record with the specified primary key.\n *\n * @name MongoDBAdapter#update\n * @method\n * @param {Object} mapper The mapper.\n * @param {(string|number)} id The primary key of the record to be updated.\n * @param {Object} props The update to apply to the record.\n * @param {Object} [opts] Configuration options.\n * @param {boolean} [opts.raw=false] Whether to return a more detailed\n * response object.\n * @param {Object} [opts.updateOpts] Options to pass to collection#update.\n * @return {Promise}\n */\n\n /**\n * Apply the given update to the record with the specified primary key.\n * Internal method used by Adapter#update.\n *\n * @name MongoDBAdapter#_update\n * @method\n * @private\n * @param {Object} mapper The mapper.\n * @param {(string|number)} id The primary key of the record to be updated.\n * @param {Object} props The update to apply to the record.\n * @param {Object} [opts] Configuration options.\n * @return {Promise}\n */\n _update (mapper, id, props, opts) {\n const self = this\n props || (props = {})\n opts || (opts = {})\n const updateOpts = self.getOpt('updateOpts', opts)\n\n return self.find(mapper, id, { raw: false }).then(function (record) {\n if (!record) {\n throw new Error('Not Found')\n }\n return self.getClient().then(function (client) {\n return new Promise(function (resolve, reject) {\n const mongoQuery = {}\n mongoQuery[mapper.idAttribute] = self.toObjectID(mapper, id)\n const collection = client.collection(mapper.table || underscore(mapper.name))\n collection[collection.updateOne ? 'updateOne' : 'update'](mongoQuery, { $set: props }, updateOpts, function (err, cursor) {\n return err ? reject(err) : resolve(cursor)\n })\n })\n })\n }).then(function (cursor) {\n return self.find(mapper, id, { raw: false }).then(function (record) {\n cursor.connection = undefined\n return [record, cursor]\n })\n })\n },\n\n /**\n * Apply the given update to all records that match the selection query.\n *\n * @name MongoDBAdapter#updateAll\n * @method\n * @param {Object} mapper The mapper.\n * @param {Object} props The update to apply to the selected records.\n * @param {Object} [query] Selection query.\n * @param {Object} [opts] Configuration options.\n * @param {boolean} [opts.raw=false] Whether to return a more detailed\n * response object.\n * @param {Object} [opts.updateOpts] Options to pass to collection#update.\n * @return {Promise}\n */\n\n /**\n * Apply the given update to all records that match the selection query.\n * Internal method used by Adapter#updateAll.\n *\n * @name MongoDBAdapter#_updateAll\n * @method\n * @private\n * @param {Object} mapper The mapper.\n * @param {Object} props The update to apply to the selected records.\n * @param {Object} [query] Selection query.\n * @param {Object} [opts] Configuration options.\n * @return {Promise}\n */\n _updateAll (mapper, props, query, opts) {\n const self = this\n props || (props = {})\n query || (query = {})\n opts || (opts = {})\n let ids\n const updateOpts = self.getOpt('updateOpts', opts)\n updateOpts.multi = true\n\n return Promise.all([\n self.findAll(mapper, query, { raw: false }),\n self.getClient()\n ]).then(function (results) {\n let [records, client] = results\n const queryOptions = self.getQueryOptions(mapper, query)\n const mongoQuery = self.getQuery(mapper, query)\n\n queryOptions.$set = props\n ids = records.map(function (record) {\n return self.toObjectID(mapper, record[mapper.idAttribute])\n })\n\n return new Promise(function (resolve, reject) {\n const collection = client.collection(mapper.table || underscore(mapper.name))\n collection[collection.updateMany ? 'updateMany' : 'update'](mongoQuery, queryOptions, updateOpts, function (err, cursor) {\n return err ? reject(err) : resolve(cursor)\n })\n })\n }).then(function (cursor) {\n const query = {}\n query[mapper.idAttribute] = {\n 'in': ids\n }\n return self.findAll(mapper, query, { raw: false }).then(function (records) {\n cursor.connection = undefined\n return [records, cursor]\n })\n })\n },\n\n /**\n * Return a Promise that resolves to a reference to the MongoDB client being\n * used by this adapter.\n *\n * Useful when you need to do anything custom with the MongoDB client library.\n *\n * @name MongoDBAdapter#getClient\n * @method\n * @return {Object} MongoDB client.\n */\n getClient () {\n return this.client\n },\n\n /**\n * Map filtering params in a selection query to MongoDB a filtering object.\n *\n * Handles the following:\n *\n * - where\n * - and bunch of filtering operators\n *\n * @name MongoDBAdapter#getQuery\n * @method\n * @return {Object}\n */\n getQuery (mapper, query) {\n query = plainCopy(query || {})\n query.where || (query.where = {})\n\n forOwn(query, function (config, keyword) {\n if (reserved.indexOf(keyword) === -1) {\n if (isObject(config)) {\n query.where[keyword] = config\n } else {\n query.where[keyword] = {\n '==': config\n }\n }\n delete query[keyword]\n }\n })\n\n let mongoQuery = {}\n\n if (Object.keys(query.where).length !== 0) {\n forOwn(query.where, function (criteria, field) {\n if (!isObject(criteria)) {\n query.where[field] = {\n '==': criteria\n }\n }\n forOwn(criteria, function (v, op) {\n if (op === '==' || op === '===' || op === 'contains') {\n mongoQuery[field] = v\n } else if (op === '!=' || op === '!==' || op === 'notContains') {\n mongoQuery[field] = mongoQuery[field] || {}\n mongoQuery[field].$ne = v\n } else if (op === '>') {\n mongoQuery[field] = mongoQuery[field] || {}\n mongoQuery[field].$gt = v\n } else if (op === '>=') {\n mongoQuery[field] = mongoQuery[field] || {}\n mongoQuery[field].$gte = v\n } else if (op === '<') {\n mongoQuery[field] = mongoQuery[field] || {}\n mongoQuery[field].$lt = v\n } else if (op === '<=') {\n mongoQuery[field] = mongoQuery[field] || {}\n mongoQuery[field].$lte = v\n } else if (op === 'in') {\n mongoQuery[field] = mongoQuery[field] || {}\n mongoQuery[field].$in = v\n } else if (op === 'notIn') {\n mongoQuery[field] = mongoQuery[field] || {}\n mongoQuery[field].$nin = v\n } else if (op === '|==' || op === '|===' || op === '|contains') {\n mongoQuery.$or = mongoQuery.$or || []\n let orEqQuery = {}\n orEqQuery[field] = v\n mongoQuery.$or.push(orEqQuery)\n } else if (op === '|!=' || op === '|!==' || op === '|notContains') {\n mongoQuery.$or = mongoQuery.$or || []\n let orNeQuery = {}\n orNeQuery[field] = {\n '$ne': v\n }\n mongoQuery.$or.push(orNeQuery)\n } else if (op === '|>') {\n mongoQuery.$or = mongoQuery.$or || []\n let orGtQuery = {}\n orGtQuery[field] = {\n '$gt': v\n }\n mongoQuery.$or.push(orGtQuery)\n } else if (op === '|>=') {\n mongoQuery.$or = mongoQuery.$or || []\n let orGteQuery = {}\n orGteQuery[field] = {\n '$gte': v\n }\n mongoQuery.$or.push(orGteQuery)\n } else if (op === '|<') {\n mongoQuery.$or = mongoQuery.$or || []\n let orLtQuery = {}\n orLtQuery[field] = {\n '$lt': v\n }\n mongoQuery.$or.push(orLtQuery)\n } else if (op === '|<=') {\n mongoQuery.$or = mongoQuery.$or || []\n let orLteQuery = {}\n orLteQuery[field] = {\n '$lte': v\n }\n mongoQuery.$or.push(orLteQuery)\n } else if (op === '|in') {\n mongoQuery.$or = mongoQuery.$or || []\n let orInQuery = {}\n orInQuery[field] = {\n '$in': v\n }\n mongoQuery.$or.push(orInQuery)\n } else if (op === '|notIn') {\n mongoQuery.$or = mongoQuery.$or || []\n let orNinQuery = {}\n orNinQuery[field] = {\n '$nin': v\n }\n mongoQuery.$or.push(orNinQuery)\n }\n })\n })\n }\n\n return mongoQuery\n },\n\n /**\n * Map non-filtering params in a selection query to MongoDB query options.\n *\n * Handles the following:\n *\n * - limit\n * - skip/offset\n * - orderBy/sort\n *\n * @name MongoDBAdapter#getQueryOptions\n * @method\n * @return {Object}\n */\n getQueryOptions (mapper, query) {\n query = plainCopy(query || {})\n query.orderBy = query.orderBy || query.sort\n query.skip = query.skip || query.offset\n\n let queryOptions = {}\n\n if (query.orderBy) {\n if (isString(query.orderBy)) {\n query.orderBy = [\n [query.orderBy, 'asc']\n ]\n }\n for (var i = 0; i < query.orderBy.length; i++) {\n if (isString(query.orderBy[i])) {\n query.orderBy[i] = [query.orderBy[i], 'asc']\n }\n }\n queryOptions.sort = query.orderBy\n }\n\n if (query.skip) {\n queryOptions.skip = +query.skip\n }\n\n if (query.limit) {\n queryOptions.limit = +query.limit\n }\n\n return queryOptions\n },\n\n /**\n * Turn an _id into an ObjectID if it isn't already an ObjectID.\n *\n * @name MongoDBAdapter#toObjectID\n * @method\n * @return {*}\n */\n toObjectID (mapper, id) {\n if (id !== undefined && mapper.idAttribute === '_id' && typeof id === 'string' && ObjectID.isValid(id) && !(id instanceof ObjectID)) {\n return new ObjectID(id)\n }\n return id\n },\n\n /**\n * Return the foreignKey from the given record for the provided relationship.\n *\n * @name MongoDBAdapter#makeBelongsToForeignKey\n * @method\n * @return {*}\n */\n makeBelongsToForeignKey (mapper, def, record) {\n return this.toObjectID(def.getRelation(), Adapter.prototype.makeBelongsToForeignKey.call(this, mapper, def, record))\n },\n\n /**\n * Return the localKeys from the given record for the provided relationship.\n *\n * Override with care.\n *\n * @name MongoDBAdapter#makeHasManyLocalKeys\n * @method\n * @return {*}\n */\n makeHasManyLocalKeys (mapper, def, record) {\n const self = this\n const relatedMapper = def.getRelation()\n const localKeys = Adapter.prototype.makeHasManyLocalKeys.call(self, mapper, def, record)\n return localKeys.map(function (key) {\n return self.toObjectID(relatedMapper, key)\n })\n },\n\n /**\n * Not supported.\n *\n * @name MongoDBAdapter#updateMany\n * @method\n */\n updateMany () {\n throw new Error('not supported!')\n }\n})\n\nmodule.exports = MongoDBAdapter\n"],"names":["utils","Adapter","reserved","ObjectID"],"mappings":"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"} \ No newline at end of file diff --git a/mocha.start.js b/mocha.start.js index cc841b2..0d0c8c8 100644 --- a/mocha.start.js +++ b/mocha.start.js @@ -28,32 +28,8 @@ JSDataAdapterTests.init({ idAttribute: '_id' } }, - methods: [ - 'beforeCreate', - 'create', - 'afterCreate', - 'beforeCreateMany', - 'createMany', - 'afterCreateMany', - 'beforeDestroy', - 'destroy', - 'afterDestroy', - 'beforeDestroyAll', - 'destroyAll', - 'afterDestroyAll', - 'extend', - 'beforeFind', - 'find', - 'afterFind', - 'beforeFindAll', - 'findAll', - 'afterFindAll', - 'beforeUpdate', - 'update', - 'afterUpdate', - 'beforeUpdateAll', - 'updateAll', - 'afterUpdateAll' + xmethods: [ + 'updateMany' ], features: [ 'findHasManyLocalKeys', diff --git a/package.json b/package.json index 1325318..25d1260 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "js-data-mongodb", "description": "MongoDB adapter for js-data.", - "version": "1.0.0-alpha.4", + "version": "1.0.0-alpha.5", "homepage": "https://github.com/js-data/js-data-mongodb", "repository": { "type": "git", @@ -42,10 +42,10 @@ "test": "npm run build && npm run cover", "repo-tools": "repo-tools updates && repo-tools changelog && repo-tools authors", "release": "npm test && npm run doc && npm run repo-tools", - "ci": "npm run test && cat coverage/lcov.info | coveralls || true && cat ./coverage/lcov.info | codacy-coverage || true" + "ci": "npm run test && cat coverage/lcov.info | coveralls || true" }, "dependencies": { - "js-data-adapter": "0.1.2", + "js-data-adapter": "0.2.1", "mout": "0.12.0" }, "peerDependencies": { @@ -54,15 +54,14 @@ "mongodb": ">=1.3.x" }, "devDependencies": { - "babel-core": "6.6.5", + "babel-core": "6.7.0", "babel-polyfill": "6.6.1", "babel-preset-es2015-rollup": "1.1.1", "chai": "3.5.0", - "codacy-coverage": "1.1.3", "coveralls": "2.11.8", "ink-docstrap": "1.1.4", "istanbul": "0.4.2", - "js-data-adapter-tests": "^2.0.0-alpha.13", + "js-data-adapter-tests": "^2.0.0-alpha.14", "js-data-repo-tools": "0.2.0", "jsdoc": "3.4.0", "mocha": "2.4.5", diff --git a/src/index.js b/src/index.js index f77f756..a8265cb 100644 --- a/src/index.js +++ b/src/index.js @@ -3,33 +3,22 @@ import {ObjectID} from 'bson' import {utils} from 'js-data' import Adapter from 'js-data-adapter' import { - reserved, - Response + reserved } from 'js-data-adapter' import underscore from 'mout/string/underscore' -import unique from 'mout/array/unique' const { addHiddenPropsToTarget, classCallCheck, extend, fillIn, - forEachRelation, forOwn, - get, isArray, isObject, isString, - isUndefined, - omit, - plainCopy, - resolve + plainCopy } = utils -const withoutRelations = function (mapper, props) { - return omit(props, mapper.relationFields || []) -} - const DEFAULTS = { /** * Convert ObjectIDs to strings when pulling records out of the database. @@ -99,7 +88,7 @@ const REMOVE_OPTS_DEFAULTS = {} * @param {Object} [opts.updateOpts] Options to pass to collection#update. * @param {string} [opts.uri="mongodb://localhost:27017"] MongoDB URI. */ -export default function MongoDBAdapter (opts) { +function MongoDBAdapter (opts) { const self = this classCallCheck(self, MongoDBAdapter) opts || (opts = {}) @@ -236,616 +225,301 @@ addHiddenPropsToTarget(MongoDBAdapter.prototype, { }, /** - * Return a Promise that resolves to a reference to the MongoDB client being - * used by this adapter. - * - * Useful when you need to do anything custom with the MongoDB client library. + * Create a new record. * - * @name MongoDBAdapter#getClient + * @name MongoDBAdapter#create * @method - * @return {Object} MongoDB client. + * @param {Object} mapper The mapper. + * @param {Object} props The record to be created. + * @param {Object} [opts] Configuration options. + * @param {Object} [opts.insertOpts] Options to pass to collection#insert. + * @param {boolean} [opts.raw=false] Whether to return a more detailed + * @return {Promise} */ - getClient () { - return this.client - }, /** - * Map filtering params in a selection query to MongoDB a filtering object. - * - * Handles the following: - * - * - where - * - and bunch of filtering operators + * Create a new record. Internal method used by Adapter#create. * - * @name MongoDBAdapter#getQuery + * @name MongoDBAdapter#_create * @method - * @return {Object} + * @private + * @param {Object} mapper The mapper. + * @param {Object} props The record to be created. + * @param {Object} [opts] Configuration options. + * @return {Promise} */ - getQuery (mapper, query) { - query = plainCopy(query || {}) - query.where || (query.where = {}) - - forOwn(query, function (config, keyword) { - if (reserved.indexOf(keyword) === -1) { - if (isObject(config)) { - query.where[keyword] = config - } else { - query.where[keyword] = { - '==': config - } - } - delete query[keyword] - } - }) + _create (mapper, props, opts) { + const self = this + props || (props = {}) + opts || (opts = {}) + props = plainCopy(props) - let mongoQuery = {} + const insertOpts = self.getOpt('insertOpts', opts) - if (Object.keys(query.where).length !== 0) { - forOwn(query.where, function (criteria, field) { - if (!isObject(criteria)) { - query.where[field] = { - '==': criteria - } - } - forOwn(criteria, function (v, op) { - if (op === '==' || op === '===' || op === 'contains') { - mongoQuery[field] = v - } else if (op === '!=' || op === '!==' || op === 'notContains') { - mongoQuery[field] = mongoQuery[field] || {} - mongoQuery[field].$ne = v - } else if (op === '>') { - mongoQuery[field] = mongoQuery[field] || {} - mongoQuery[field].$gt = v - } else if (op === '>=') { - mongoQuery[field] = mongoQuery[field] || {} - mongoQuery[field].$gte = v - } else if (op === '<') { - mongoQuery[field] = mongoQuery[field] || {} - mongoQuery[field].$lt = v - } else if (op === '<=') { - mongoQuery[field] = mongoQuery[field] || {} - mongoQuery[field].$lte = v - } else if (op === 'in') { - mongoQuery[field] = mongoQuery[field] || {} - mongoQuery[field].$in = v - } else if (op === 'notIn') { - mongoQuery[field] = mongoQuery[field] || {} - mongoQuery[field].$nin = v - } else if (op === '|==' || op === '|===' || op === '|contains') { - mongoQuery.$or = mongoQuery.$or || [] - let orEqQuery = {} - orEqQuery[field] = v - mongoQuery.$or.push(orEqQuery) - } else if (op === '|!=' || op === '|!==' || op === '|notContains') { - mongoQuery.$or = mongoQuery.$or || [] - let orNeQuery = {} - orNeQuery[field] = { - '$ne': v - } - mongoQuery.$or.push(orNeQuery) - } else if (op === '|>') { - mongoQuery.$or = mongoQuery.$or || [] - let orGtQuery = {} - orGtQuery[field] = { - '$gt': v - } - mongoQuery.$or.push(orGtQuery) - } else if (op === '|>=') { - mongoQuery.$or = mongoQuery.$or || [] - let orGteQuery = {} - orGteQuery[field] = { - '$gte': v - } - mongoQuery.$or.push(orGteQuery) - } else if (op === '|<') { - mongoQuery.$or = mongoQuery.$or || [] - let orLtQuery = {} - orLtQuery[field] = { - '$lt': v - } - mongoQuery.$or.push(orLtQuery) - } else if (op === '|<=') { - mongoQuery.$or = mongoQuery.$or || [] - let orLteQuery = {} - orLteQuery[field] = { - '$lte': v - } - mongoQuery.$or.push(orLteQuery) - } else if (op === '|in') { - mongoQuery.$or = mongoQuery.$or || [] - let orInQuery = {} - orInQuery[field] = { - '$in': v - } - mongoQuery.$or.push(orInQuery) - } else if (op === '|notIn') { - mongoQuery.$or = mongoQuery.$or || [] - let orNinQuery = {} - orNinQuery[field] = { - '$nin': v - } - mongoQuery.$or.push(orNinQuery) - } + return self.getClient().then(function (client) { + return new Promise(function (resolve, reject) { + const collection = client.collection(mapper.table || underscore(mapper.name)) + const method = collection.insertOne ? 'insertOne' : 'insert' + collection[method](props, insertOpts, function (err, cursor) { + return err ? reject(err) : resolve(cursor) }) }) - } - - return mongoQuery + }).then(function (cursor) { + let record + let r = cursor.ops ? cursor.ops : cursor + self._translateId(r, opts) + record = isArray(r) ? r[0] : r + cursor.connection = undefined + return [record, cursor] + }) }, /** - * Map non-filtering params in a selection query to MongoDB query options. - * - * Handles the following: - * - * - limit - * - skip/offset - * - orderBy/sort + * Create multiple records in a single batch. * - * @name MongoDBAdapter#getQueryOptions + * @name MongoDBAdapter#createMany * @method - * @return {Object} + * @param {Object} mapper The mapper. + * @param {Object} props The records to be created. + * @param {Object} [opts] Configuration options. + * @param {Object} [opts.insertManyOpts] Options to pass to + * collection#insertMany. + * @param {boolean} [opts.raw=false] Whether to return a more detailed + * response object. + * @return {Promise} */ - getQueryOptions (mapper, query) { - query = plainCopy(query || {}) - query.orderBy = query.orderBy || query.sort - query.skip = query.skip || query.offset - - let queryOptions = {} - - if (query.orderBy) { - if (isString(query.orderBy)) { - query.orderBy = [ - [query.orderBy, 'asc'] - ] - } - for (var i = 0; i < query.orderBy.length; i++) { - if (isString(query.orderBy[i])) { - query.orderBy[i] = [query.orderBy[i], 'asc'] - } - } - queryOptions.sort = query.orderBy - } - - if (query.skip) { - queryOptions.skip = +query.skip - } - - if (query.limit) { - queryOptions.limit = +query.limit - } - - return queryOptions - }, /** - * Turn an _id into an ObjectID if it isn't already an ObjectID. + * Create multiple records in a single batch. Internal method used by + * Adapter#createMany. * - * @name MongoDBAdapter#toObjectID + * @name MongoDBAdapter#_createMany * @method - * @return {*} + * @private + * @param {Object} mapper The mapper. + * @param {Object} props The records to be created. + * @param {Object} [opts] Configuration options. + * @return {Promise} */ - toObjectID (mapper, id) { - if (id !== undefined && mapper.idAttribute === '_id' && typeof id === 'string' && ObjectID.isValid(id) && !(id instanceof ObjectID)) { - return new ObjectID(id) - } - return id + _createMany (mapper, props, opts) { + const self = this + props || (props = {}) + opts || (opts = {}) + props = plainCopy(props) + + const insertManyOpts = self.getOpt('insertManyOpts', opts) + + return self.getClient().then(function (client) { + return new Promise(function (resolve, reject) { + const collection = client.collection(mapper.table || underscore(mapper.name)) + collection.insertMany(props, insertManyOpts, function (err, cursor) { + return err ? reject(err) : resolve(cursor) + }) + }) + }).then(function (cursor) { + let records = [] + let r = cursor.ops ? cursor.ops : cursor + self._translateId(r, opts) + records = r + cursor.connection = undefined + return [records, cursor] + }) }, /** - * Return the foreignKey from the given record for the provided relationship. + * Destroy the record with the given primary key. * - * @name MongoDBAdapter#makeBelongsToForeignKey + * @name MongoDBAdapter#destroy * @method - * @return {*} + * @param {Object} mapper The mapper. + * @param {(string|number)} id Primary key of the record to destroy. + * @param {Object} [opts] Configuration options. + * @param {boolean} [opts.raw=false] Whether to return a more detailed + * response object. + * @param {Object} [opts.removeOpts] Options to pass to collection#remove. + * @return {Promise} */ - makeBelongsToForeignKey (mapper, def, record) { - return this.toObjectID(def.getRelation(), Adapter.prototype.makeBelongsToForeignKey.call(this, mapper, def, record)) - }, /** - * Retrieve the record with the given primary key. + * Destroy the record with the given primary key. Internal method used by + * Adapter#destroy. * - * @name MongoDBAdapter#find + * @name MongoDBAdapter#_destroy * @method + * @private * @param {Object} mapper The mapper. - * @param {(string|number)} id Primary key of the record to retrieve. + * @param {(string|number)} id Primary key of the record to destroy. * @param {Object} [opts] Configuration options. - * @param {Object} [opts.findOneOpts] Options to pass to collection#findOne. - * @param {boolean} [opts.raw=false] Whether to return a more detailed - * response object. - * @param {string[]} [opts.with=[]] Relations to eager load. * @return {Promise} */ - find (mapper, id, opts) { + _destroy (mapper, id, opts) { const self = this - let record, op opts || (opts = {}) - opts.with || (opts.with = []) - - const findOneOpts = self.getOpt('findOneOpts', opts) - findOneOpts.fields || (findOneOpts.fields = {}) + const removeOpts = self.getOpt('removeOpts', opts) return self.getClient().then(function (client) { - // beforeFind lifecycle hook - op = opts.op = 'beforeFind' - return resolve(self[op](mapper, id, opts)).then(function () { - return new Promise(function (resolve, reject) { - let mongoQuery = {} - mongoQuery[mapper.idAttribute] = self.toObjectID(mapper, id) - client.collection(mapper.table || underscore(mapper.name)).findOne(mongoQuery, findOneOpts, function (err, cursor) { - return err ? reject(err) : resolve(cursor) - }) + return new Promise(function (resolve, reject) { + const mongoQuery = {} + mongoQuery[mapper.idAttribute] = self.toObjectID(mapper, id) + const collection = client.collection(mapper.table || underscore(mapper.name)) + collection[collection.deleteOne ? 'deleteOne' : 'remove'](mongoQuery, removeOpts, function (err, cursor) { + return err ? reject(err) : resolve(cursor) }) }) - }).then(function (_record) { - if (!_record) { - return - } - record = _record - self._translateId(record, opts) - const tasks = [] - - forEachRelation(mapper, opts, function (def, __opts) { - const relatedMapper = def.getRelation() - let task - - if (def.foreignKey && (def.type === 'hasOne' || def.type === 'hasMany')) { - if (def.type === 'hasOne') { - task = self.loadHasOne(mapper, def, record, __opts) - } else { - task = self.loadHasMany(mapper, def, record, __opts) - } - } else if (def.type === 'hasMany' && def.localKeys) { - let localKeys = [] - let itemKeys = get(record, def.localKeys) || [] - itemKeys = isArray(itemKeys) ? itemKeys : Object.keys(itemKeys) - localKeys = localKeys.concat(itemKeys) - task = self.findAll(relatedMapper, { - where: { - [relatedMapper.idAttribute]: { - 'in': unique(localKeys).filter(function (x) { return x }).map(function (x) { return self.toObjectID(relatedMapper, x) }) - } - } - }, __opts).then(function (relatedItems) { - def.setLocalField(record, relatedItems) - }) - } else if (def.type === 'hasMany' && def.foreignKeys) { - task = self.findAll(relatedMapper, { - where: { - [def.foreignKeys]: { - 'contains': self.makeHasManyForeignKeys(mapper, def, record) - } - } - }, __opts).then(function (relatedItems) { - def.setLocalField(record, relatedItems) - }) - } else if (def.type === 'belongsTo') { - task = self.loadBelongsTo(mapper, def, record, __opts) - } - if (task) { - tasks.push(task) - } - }) - - return Promise.all(tasks) - }).then(function () { - let response = new Response(record, {}, 'find') - response.found = record ? 1 : 0 - response = self.respond(response, opts) - - // afterFind lifecycle hook - op = opts.op = 'afterFind' - return resolve(self[op](mapper, id, opts, response)).then(function (_response) { - // Allow for re-assignment from lifecycle hook - return isUndefined(_response) ? response : _response - }) + }).then(function (cursor) { + return [undefined, cursor] }) }, /** - * Retrieve the records that match the selection query. + * Destroy the records that match the selection query. * - * @name MongoDBAdapter#findAll + * @name MongoDBAdapter#destroyAll * @method - * @param {Object} mapper The mapper. - * @param {Object} query Selection query. + * @param {Object} mapper the mapper. + * @param {Object} [query] Selection query. + * @param {Object} [query.where] Filtering criteria. + * @param {string|Array} [query.orderBy] Sorting criteria. + * @param {string|Array} [query.sort] Same as `query.sort`. + * @param {number} [query.limit] Limit results. + * @param {number} [query.skip] Offset results. + * @param {number} [query.offset] Same as `query.skip`. * @param {Object} [opts] Configuration options. - * @param {Object} [opts.findOpts] Options to pass to collection#find. * @param {boolean} [opts.raw=false] Whether to return a more detailed * response object. - * @param {string[]} [opts.with=[]] Relations to eager load. + * @param {Object} [opts.removeOpts] Options to pass to collection#remove. * @return {Promise} */ - findAll (mapper, query, opts) { + + /** + * Destroy the records that match the selection query. Internal method used by + * Adapter#destroyAll. + * + * @name MongoDBAdapter#_destroyAll + * @method + * @private + * @param {Object} mapper the mapper. + * @param {Object} [query] Selection query. + * @param {Object} [opts] Configuration options. + * @return {Promise} + */ + _destroyAll (mapper, query, opts) { const self = this + query || (query = {}) opts || (opts = {}) - opts.with || (opts.with = []) - - let records = [] - let op - const findOpts = self.getOpt('findOpts', opts) - fillIn(findOpts, self.getQueryOptions(mapper, query)) - findOpts.fields || (findOpts.fields = {}) - const mongoQuery = self.getQuery(mapper, query) + const removeOpts = self.getOpt('removeOpts', opts) + fillIn(removeOpts, self.getQueryOptions(mapper, query)) return self.getClient().then(function (client) { - // beforeFindAll lifecycle hook - op = opts.op = 'beforeFindAll' - return resolve(self[op](mapper, query, opts)).then(function () { - return new Promise(function (resolve, reject) { - client.collection(mapper.table || underscore(mapper.name)).find(mongoQuery, findOpts).toArray(function (err, cursor) { - return err ? reject(err) : resolve(cursor) - }) + const mongoQuery = self.getQuery(mapper, query) + return new Promise(function (resolve, reject) { + const collection = client.collection(mapper.table || underscore(mapper.name)) + collection[collection.deleteMany ? 'deleteMany' : 'remove'](mongoQuery, removeOpts, function (err, cursor) { + return err ? reject(err) : resolve(cursor) }) }) - }).then(function (_records) { - records = _records - self._translateId(records, opts) - const tasks = [] - forEachRelation(mapper, opts, function (def, __opts) { - const relatedMapper = def.getRelation() - let task - if (def.foreignKey && (def.type === 'hasOne' || def.type === 'hasMany')) { - if (def.type === 'hasMany') { - task = self.loadHasMany(mapper, def, records, __opts) - } else { - task = self.loadHasOne(mapper, def, records, __opts) - } - } else if (def.type === 'hasMany' && def.localKeys) { - let localKeys = [] - records.forEach(function (item) { - let itemKeys = item[def.localKeys] || [] - itemKeys = isArray(itemKeys) ? itemKeys : Object.keys(itemKeys) - localKeys = localKeys.concat(itemKeys) - }) - task = self.findAll(relatedMapper, { - where: { - [relatedMapper.idAttribute]: { - 'in': unique(localKeys).filter(function (x) { return x }).map(function (x) { return self.toObjectID(relatedMapper, x) }) - } - } - }, __opts).then(function (relatedItems) { - records.forEach(function (item) { - let attached = [] - let itemKeys = get(item, def.localKeys) || [] - itemKeys = isArray(itemKeys) ? itemKeys : Object.keys(itemKeys) - relatedItems.forEach(function (relatedItem) { - if (itemKeys && itemKeys.indexOf(relatedItem[relatedMapper.idAttribute]) !== -1) { - attached.push(relatedItem) - } - }) - def.setLocalField(item, attached) - }) - return relatedItems - }) - } else if (def.type === 'hasMany' && def.foreignKeys) { - throw new Error('findAll eager load hasMany foreignKeys not supported!') - } else if (def.type === 'belongsTo') { - task = self.loadBelongsTo(mapper, def, records, __opts) - } - if (task) { - tasks.push(task) - } - }) - return Promise.all(tasks) - }).then(function () { - records || (records = []) - let response = new Response(records, {}, 'findAll') - response.found = records.length - response = self.respond(response, opts) - - // afterFindAll lifecycle hook - op = opts.op = 'afterFindAll' - return resolve(self[op](mapper, query, opts, response)).then(function (_response) { - // Allow for re-assignment from lifecycle hook - return isUndefined(_response) ? response : _response - }) + }).then(function (cursor) { + cursor.connection = undefined + return [undefined, cursor] }) }, /** - * Create a new record. + * Retrieve the record with the given primary key. * - * @name MongoDBAdapter#create + * @name MongoDBAdapter#find * @method * @param {Object} mapper The mapper. - * @param {Object} props The record to be created. + * @param {(string|number)} id Primary key of the record to retrieve. * @param {Object} [opts] Configuration options. - * @param {Object} [opts.insertOpts] Options to pass to collection#insert. + * @param {Object} [opts.findOneOpts] Options to pass to collection#findOne. * @param {boolean} [opts.raw=false] Whether to return a more detailed * response object. + * @param {string[]} [opts.with=[]] Relations to eager load. * @return {Promise} */ - create (mapper, props, opts) { - const self = this - let op - props || (props = {}) - opts || (opts = {}) - - const insertOpts = self.getOpt('insertOpts', opts) - - return self.getClient().then(function (client) { - // beforeCreate lifecycle hook - op = opts.op = 'beforeCreate' - return resolve(self[op](mapper, props, opts)).then(function (_props) { - // Allow for re-assignment from lifecycle hook - props = isUndefined(_props) ? props : _props - _props = withoutRelations(mapper, props) - return new Promise(function (resolve, reject) { - const collection = client.collection(mapper.table || underscore(mapper.name)) - const method = collection.insertOne ? 'insertOne' : 'insert' - collection[method](_props, insertOpts, function (err, cursor) { - return err ? reject(err) : resolve(cursor) - }) - }) - }).then(function (cursor) { - let record - let r = cursor.ops ? cursor.ops : cursor - self._translateId(r, opts) - record = isArray(r) ? r[0] : r - cursor.connection = undefined - let response = new Response(record, cursor, 'create') - response.created = record ? 1 : 0 - response = self.respond(response, opts) - - // afterCreate lifecycle hook - op = opts.op = 'afterCreate' - return resolve(self[op](mapper, props, opts, response)).then(function (_response) { - // Allow for re-assignment from lifecycle hook - return isUndefined(_response) ? response : _response - }) - }) - }) - }, /** - * Create multiple records in a single batch. + * Retrieve the record with the given primary key. Internal method used by + * Adapter#find. * - * @name MongoDBAdapter#createMany + * @name MongoDBAdapter#_find * @method + * @private * @param {Object} mapper The mapper. - * @param {Object} props The records to be created. + * @param {(string|number)} id Primary key of the record to retrieve. * @param {Object} [opts] Configuration options. - * @param {Object} [opts.insertManyOpts] Options to pass to - * collection#insertMany. - * @param {boolean} [opts.raw=false] Whether to return a more detailed - * response object. * @return {Promise} */ - createMany (mapper, props, opts) { + _find (mapper, id, opts) { const self = this - let op - props || (props = {}) opts || (opts = {}) + opts.with || (opts.with = []) - const insertManyOpts = self.getOpt('insertManyOpts', opts) + const findOneOpts = self.getOpt('findOneOpts', opts) + findOneOpts.fields || (findOneOpts.fields = {}) return self.getClient().then(function (client) { - // beforeCreateMany lifecycle hook - op = opts.op = 'beforeCreateMany' - return resolve(self[op](mapper, props, opts)).then(function (_props) { - // Allow for re-assignment from lifecycle hook - props = isUndefined(_props) ? props : _props - _props = props.map(function (record) { - return withoutRelations(mapper, record) - }) - return new Promise(function (resolve, reject) { - const collection = client.collection(mapper.table || underscore(mapper.name)) - collection.insertMany(_props, insertManyOpts, function (err, cursor) { - return err ? reject(err) : resolve(cursor) - }) - }) - }).then(function (cursor) { - let records = [] - let r = cursor.ops ? cursor.ops : cursor - self._translateId(r, opts) - records = r - cursor.connection = undefined - let response = new Response(records, cursor, 'createMany') - response.created = records.length - response = self.respond(response, opts) - - // afterCreateMany lifecycle hook - op = opts.op = 'afterCreateMany' - return resolve(self[op](mapper, props, opts, response)).then(function (_response) { - // Allow for re-assignment from lifecycle hook - return isUndefined(_response) ? response : _response + return new Promise(function (resolve, reject) { + let mongoQuery = {} + mongoQuery[mapper.idAttribute] = self.toObjectID(mapper, id) + client.collection(mapper.table || underscore(mapper.name)).findOne(mongoQuery, findOneOpts, function (err, record) { + return err ? reject(err) : resolve(record) }) }) + }).then(function (record) { + if (record) { + self._translateId(record, opts) + } + return [record, {}] }) }, /** - * Destroy the record with the given primary key. + * Retrieve the records that match the selection query. * - * @name MongoDBAdapter#destroy + * @name MongoDBAdapter#findAll * @method * @param {Object} mapper The mapper. - * @param {(string|number)} id Primary key of the record to destroy. + * @param {Object} query Selection query. * @param {Object} [opts] Configuration options. + * @param {Object} [opts.findOpts] Options to pass to collection#find. * @param {boolean} [opts.raw=false] Whether to return a more detailed * response object. - * @param {Object} [opts.removeOpts] Options to pass to collection#remove. + * @param {string[]} [opts.with=[]] Relations to eager load. * @return {Promise} */ - destroy (mapper, id, opts) { - const self = this - let op - opts || (opts = {}) - const removeOpts = self.getOpt('removeOpts', opts) - - return self.getClient().then(function (client) { - // beforeDestroy lifecycle hook - op = opts.op = 'beforeDestroy' - return resolve(self[op](mapper, id, opts)).then(function () { - return new Promise(function (resolve, reject) { - const mongoQuery = {} - mongoQuery[mapper.idAttribute] = self.toObjectID(mapper, id) - const collection = client.collection(mapper.table || underscore(mapper.name)) - collection[collection.deleteOne ? 'deleteOne' : 'remove'](mongoQuery, removeOpts, function (err, cursor) { - return err ? reject(err) : resolve(cursor) - }) - }) - }) - }).then(function (cursor) { - cursor.connection = undefined - let response = new Response(undefined, cursor, 'destroy') - response = self.respond(response, opts) - - // afterDestroy lifecycle hook - op = opts.op = 'afterDestroy' - return resolve(self[op](mapper, id, opts, response)).then(function (_response) { - // Allow for re-assignment from lifecycle hook - return isUndefined(_response) ? response : _response - }) - }) - }, /** - * Destroy the records that match the selection query. + * Retrieve the records that match the selection query. Internal method used + * by Adapter#findAll. * - * @name MongoDBAdapter#destroyAll + * @name MongoDBAdapter#_findAll * @method - * @param {Object} mapper the mapper. - * @param {Object} [query] Selection query. + * @private + * @param {Object} mapper The mapper. + * @param {Object} query Selection query. * @param {Object} [opts] Configuration options. - * @param {boolean} [opts.raw=false] Whether to return a more detailed - * response object. - * @param {Object} [opts.removeOpts] Options to pass to collection#remove. * @return {Promise} */ - destroyAll (mapper, query, opts) { + _findAll (mapper, query, opts) { const self = this - let op - query || (query = {}) opts || (opts = {}) - const removeOpts = self.getOpt('removeOpts', opts) - fillIn(removeOpts, self.getQueryOptions(mapper, query)) + + const findOpts = self.getOpt('findOpts', opts) + fillIn(findOpts, self.getQueryOptions(mapper, query)) + findOpts.fields || (findOpts.fields = {}) + const mongoQuery = self.getQuery(mapper, query) return self.getClient().then(function (client) { - // beforeDestroyAll lifecycle hook - op = opts.op = 'beforeDestroyAll' - return resolve(self[op](mapper, query, opts)).then(function () { - const mongoQuery = self.getQuery(mapper, query) - return new Promise(function (resolve, reject) { - const collection = client.collection(mapper.table || underscore(mapper.name)) - collection[collection.deleteMany ? 'deleteMany' : 'remove'](mongoQuery, removeOpts, function (err, cursor) { - return err ? reject(err) : resolve(cursor) - }) + return new Promise(function (resolve, reject) { + client.collection(mapper.table || underscore(mapper.name)).find(mongoQuery, findOpts).toArray(function (err, records) { + return err ? reject(err) : resolve(records) }) }) - }).then(function (cursor) { - cursor.connection = undefined - let response = new Response(undefined, cursor, 'destroyAll') - response = self.respond(response, opts) - - // afterDestroyAll lifecycle hook - op = opts.op = 'afterDestroyAll' - return resolve(self[op](mapper, query, opts, response)).then(function (_response) { - // Allow for re-assignment from lifecycle hook - return isUndefined(_response) ? response : _response - }) + }).then(function (records) { + self._translateId(records, opts) + return [records, {}] }) }, @@ -863,30 +537,36 @@ addHiddenPropsToTarget(MongoDBAdapter.prototype, { * @param {Object} [opts.updateOpts] Options to pass to collection#update. * @return {Promise} */ - update (mapper, id, props, opts) { + + /** + * Apply the given update to the record with the specified primary key. + * Internal method used by Adapter#update. + * + * @name MongoDBAdapter#_update + * @method + * @private + * @param {Object} mapper The mapper. + * @param {(string|number)} id The primary key of the record to be updated. + * @param {Object} props The update to apply to the record. + * @param {Object} [opts] Configuration options. + * @return {Promise} + */ + _update (mapper, id, props, opts) { const self = this props || (props = {}) opts || (opts = {}) - let op const updateOpts = self.getOpt('updateOpts', opts) return self.find(mapper, id, { raw: false }).then(function (record) { if (!record) { throw new Error('Not Found') } - // beforeUpdate lifecycle hook - op = opts.op = 'beforeUpdate' - return resolve(self[op](mapper, id, props, opts)) - }).then(function (_props) { - // Allow for re-assignment from lifecycle hook - props = isUndefined(_props) ? props : _props - _props = withoutRelations(mapper, props) return self.getClient().then(function (client) { return new Promise(function (resolve, reject) { const mongoQuery = {} mongoQuery[mapper.idAttribute] = self.toObjectID(mapper, id) const collection = client.collection(mapper.table || underscore(mapper.name)) - collection[collection.updateOne ? 'updateOne' : 'update'](mongoQuery, { $set: _props }, updateOpts, function (err, cursor) { + collection[collection.updateOne ? 'updateOne' : 'update'](mongoQuery, { $set: props }, updateOpts, function (err, cursor) { return err ? reject(err) : resolve(cursor) }) }) @@ -894,16 +574,7 @@ addHiddenPropsToTarget(MongoDBAdapter.prototype, { }).then(function (cursor) { return self.find(mapper, id, { raw: false }).then(function (record) { cursor.connection = undefined - let response = new Response(record, cursor, 'update') - response.updated = 1 - response = self.respond(response, opts) - - // afterUpdate lifecycle hook - op = opts.op = 'afterUpdate' - return resolve(self[op](mapper, id, props, opts, response)).then(function (_response) { - // Allow for re-assignment from lifecycle hook - return isUndefined(_response) ? response : _response - }) + return [record, cursor] }) }) }, @@ -922,57 +593,283 @@ addHiddenPropsToTarget(MongoDBAdapter.prototype, { * @param {Object} [opts.updateOpts] Options to pass to collection#update. * @return {Promise} */ - updateAll (mapper, props, query, opts) { + + /** + * Apply the given update to all records that match the selection query. + * Internal method used by Adapter#updateAll. + * + * @name MongoDBAdapter#_updateAll + * @method + * @private + * @param {Object} mapper The mapper. + * @param {Object} props The update to apply to the selected records. + * @param {Object} [query] Selection query. + * @param {Object} [opts] Configuration options. + * @return {Promise} + */ + _updateAll (mapper, props, query, opts) { const self = this props || (props = {}) query || (query = {}) opts || (opts = {}) - let op, ids + let ids const updateOpts = self.getOpt('updateOpts', opts) updateOpts.multi = true - return self.getClient().then(function (client) { + return Promise.all([ + self.findAll(mapper, query, { raw: false }), + self.getClient() + ]).then(function (results) { + let [records, client] = results const queryOptions = self.getQueryOptions(mapper, query) const mongoQuery = self.getQuery(mapper, query) - // beforeUpdateAll lifecycle hook - op = opts.op = 'beforeUpdateAll' - return resolve(self[op](mapper, props, query, opts)).then(function (_props) { - // Allow for re-assignment from lifecycle hook - props = isUndefined(_props) ? props : _props - _props = withoutRelations(mapper, props) - queryOptions.$set = _props - return self.findAll(mapper, query, { raw: false }) - }).then(function (records) { - ids = records.map(function (record) { - return self.toObjectID(mapper, record[mapper.idAttribute]) - }) + queryOptions.$set = props + ids = records.map(function (record) { + return self.toObjectID(mapper, record[mapper.idAttribute]) + }) - return new Promise(function (resolve, reject) { - const collection = client.collection(mapper.table || underscore(mapper.name)) - collection[collection.updateMany ? 'updateMany' : 'update'](mongoQuery, queryOptions, updateOpts, function (err, cursor) { - return err ? reject(err) : resolve(cursor) - }) + return new Promise(function (resolve, reject) { + const collection = client.collection(mapper.table || underscore(mapper.name)) + collection[collection.updateMany ? 'updateMany' : 'update'](mongoQuery, queryOptions, updateOpts, function (err, cursor) { + return err ? reject(err) : resolve(cursor) }) - }).then(function (cursor) { - const query = {} - query[mapper.idAttribute] = { - 'in': ids + }) + }).then(function (cursor) { + const query = {} + query[mapper.idAttribute] = { + 'in': ids + } + return self.findAll(mapper, query, { raw: false }).then(function (records) { + cursor.connection = undefined + return [records, cursor] + }) + }) + }, + + /** + * Return a Promise that resolves to a reference to the MongoDB client being + * used by this adapter. + * + * Useful when you need to do anything custom with the MongoDB client library. + * + * @name MongoDBAdapter#getClient + * @method + * @return {Object} MongoDB client. + */ + getClient () { + return this.client + }, + + /** + * Map filtering params in a selection query to MongoDB a filtering object. + * + * Handles the following: + * + * - where + * - and bunch of filtering operators + * + * @name MongoDBAdapter#getQuery + * @method + * @return {Object} + */ + getQuery (mapper, query) { + query = plainCopy(query || {}) + query.where || (query.where = {}) + + forOwn(query, function (config, keyword) { + if (reserved.indexOf(keyword) === -1) { + if (isObject(config)) { + query.where[keyword] = config + } else { + query.where[keyword] = { + '==': config + } } - return self.findAll(mapper, query, { raw: false }).then(function (records) { - cursor.connection = undefined - let response = new Response(records, cursor, 'update') - response.updated = records.length - response = self.respond(response, opts) - - // afterUpdateAll lifecycle hook - op = opts.op = 'afterUpdateAll' - return resolve(self[op](mapper, props, query, opts, response)).then(function (_response) { - // Allow for re-assignment from lifecycle hook - return isUndefined(_response) ? response : _response - }) + delete query[keyword] + } + }) + + let mongoQuery = {} + + if (Object.keys(query.where).length !== 0) { + forOwn(query.where, function (criteria, field) { + if (!isObject(criteria)) { + query.where[field] = { + '==': criteria + } + } + forOwn(criteria, function (v, op) { + if (op === '==' || op === '===' || op === 'contains') { + mongoQuery[field] = v + } else if (op === '!=' || op === '!==' || op === 'notContains') { + mongoQuery[field] = mongoQuery[field] || {} + mongoQuery[field].$ne = v + } else if (op === '>') { + mongoQuery[field] = mongoQuery[field] || {} + mongoQuery[field].$gt = v + } else if (op === '>=') { + mongoQuery[field] = mongoQuery[field] || {} + mongoQuery[field].$gte = v + } else if (op === '<') { + mongoQuery[field] = mongoQuery[field] || {} + mongoQuery[field].$lt = v + } else if (op === '<=') { + mongoQuery[field] = mongoQuery[field] || {} + mongoQuery[field].$lte = v + } else if (op === 'in') { + mongoQuery[field] = mongoQuery[field] || {} + mongoQuery[field].$in = v + } else if (op === 'notIn') { + mongoQuery[field] = mongoQuery[field] || {} + mongoQuery[field].$nin = v + } else if (op === '|==' || op === '|===' || op === '|contains') { + mongoQuery.$or = mongoQuery.$or || [] + let orEqQuery = {} + orEqQuery[field] = v + mongoQuery.$or.push(orEqQuery) + } else if (op === '|!=' || op === '|!==' || op === '|notContains') { + mongoQuery.$or = mongoQuery.$or || [] + let orNeQuery = {} + orNeQuery[field] = { + '$ne': v + } + mongoQuery.$or.push(orNeQuery) + } else if (op === '|>') { + mongoQuery.$or = mongoQuery.$or || [] + let orGtQuery = {} + orGtQuery[field] = { + '$gt': v + } + mongoQuery.$or.push(orGtQuery) + } else if (op === '|>=') { + mongoQuery.$or = mongoQuery.$or || [] + let orGteQuery = {} + orGteQuery[field] = { + '$gte': v + } + mongoQuery.$or.push(orGteQuery) + } else if (op === '|<') { + mongoQuery.$or = mongoQuery.$or || [] + let orLtQuery = {} + orLtQuery[field] = { + '$lt': v + } + mongoQuery.$or.push(orLtQuery) + } else if (op === '|<=') { + mongoQuery.$or = mongoQuery.$or || [] + let orLteQuery = {} + orLteQuery[field] = { + '$lte': v + } + mongoQuery.$or.push(orLteQuery) + } else if (op === '|in') { + mongoQuery.$or = mongoQuery.$or || [] + let orInQuery = {} + orInQuery[field] = { + '$in': v + } + mongoQuery.$or.push(orInQuery) + } else if (op === '|notIn') { + mongoQuery.$or = mongoQuery.$or || [] + let orNinQuery = {} + orNinQuery[field] = { + '$nin': v + } + mongoQuery.$or.push(orNinQuery) + } }) }) + } + + return mongoQuery + }, + + /** + * Map non-filtering params in a selection query to MongoDB query options. + * + * Handles the following: + * + * - limit + * - skip/offset + * - orderBy/sort + * + * @name MongoDBAdapter#getQueryOptions + * @method + * @return {Object} + */ + getQueryOptions (mapper, query) { + query = plainCopy(query || {}) + query.orderBy = query.orderBy || query.sort + query.skip = query.skip || query.offset + + let queryOptions = {} + + if (query.orderBy) { + if (isString(query.orderBy)) { + query.orderBy = [ + [query.orderBy, 'asc'] + ] + } + for (var i = 0; i < query.orderBy.length; i++) { + if (isString(query.orderBy[i])) { + query.orderBy[i] = [query.orderBy[i], 'asc'] + } + } + queryOptions.sort = query.orderBy + } + + if (query.skip) { + queryOptions.skip = +query.skip + } + + if (query.limit) { + queryOptions.limit = +query.limit + } + + return queryOptions + }, + + /** + * Turn an _id into an ObjectID if it isn't already an ObjectID. + * + * @name MongoDBAdapter#toObjectID + * @method + * @return {*} + */ + toObjectID (mapper, id) { + if (id !== undefined && mapper.idAttribute === '_id' && typeof id === 'string' && ObjectID.isValid(id) && !(id instanceof ObjectID)) { + return new ObjectID(id) + } + return id + }, + + /** + * Return the foreignKey from the given record for the provided relationship. + * + * @name MongoDBAdapter#makeBelongsToForeignKey + * @method + * @return {*} + */ + makeBelongsToForeignKey (mapper, def, record) { + return this.toObjectID(def.getRelation(), Adapter.prototype.makeBelongsToForeignKey.call(this, mapper, def, record)) + }, + + /** + * Return the localKeys from the given record for the provided relationship. + * + * Override with care. + * + * @name MongoDBAdapter#makeHasManyLocalKeys + * @method + * @return {*} + */ + makeHasManyLocalKeys (mapper, def, record) { + const self = this + const relatedMapper = def.getRelation() + const localKeys = Adapter.prototype.makeHasManyLocalKeys.call(self, mapper, def, record) + return localKeys.map(function (key) { + return self.toObjectID(relatedMapper, key) }) }, @@ -986,3 +883,5 @@ addHiddenPropsToTarget(MongoDBAdapter.prototype, { throw new Error('not supported!') } }) + +module.exports = MongoDBAdapter From 64091401160305c0414c72e2a5a837f5b18373ae Mon Sep 17 00:00:00 2001 From: Jason Dobry Date: Thu, 17 Mar 2016 22:31:51 -0700 Subject: [PATCH 10/36] 1.0.0-alpha.6 --- CHANGELOG.md | 5 ++ dist/js-data-mongodb.js | 122 +++++++++++++++++++++++++----------- dist/js-data-mongodb.js.map | 2 +- mocha.start.js | 2 + package.json | 12 ++-- src/index.js | 122 ++++++++++++++++++++++++------------ 6 files changed, 181 insertions(+), 84 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 6e5e505..50fc565 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,8 @@ +##### 1.0.0-alpha.6 - 17 March 2016 + +###### Backwards compatible API changes +- Added count method + ##### 1.0.0-alpha.5 - 10 March 2016 ###### Other diff --git a/dist/js-data-mongodb.js b/dist/js-data-mongodb.js index 79b53f4..af81760 100644 --- a/dist/js-data-mongodb.js +++ b/dist/js-data-mongodb.js @@ -51,17 +51,6 @@ babelHelpers.slicedToArray = function () { babelHelpers; -var addHiddenPropsToTarget = jsData.utils.addHiddenPropsToTarget; -var classCallCheck = jsData.utils.classCallCheck; -var extend = jsData.utils.extend; -var fillIn = jsData.utils.fillIn; -var forOwn = jsData.utils.forOwn; -var isArray = jsData.utils.isArray; -var isObject = jsData.utils.isObject; -var isString = jsData.utils.isString; -var plainCopy = jsData.utils.plainCopy; - - var DEFAULTS = { /** * Convert ObjectIDs to strings when pulling records out of the database. @@ -82,6 +71,7 @@ var DEFAULTS = { uri: 'mongodb://localhost:27017' }; +var COUNT_OPTS_DEFAULTS = {}; var FIND_OPTS_DEFAULTS = {}; var FIND_ONE_OPTS_DEFAULTS = {}; var INSERT_OPTS_DEFAULTS = {}; @@ -118,6 +108,7 @@ var REMOVE_OPTS_DEFAULTS = {}; * @extends Adapter * @param {Object} [opts] Configuration opts. * @param {boolean} [opts.debug=false] Whether to log debugging information. + * @param {Object} [opts.countOpts] Options to pass to collection#count. * @param {Object} [opts.findOpts] Options to pass to collection#find. * @param {Object} [opts.findOneOpts] Options to pass to collection#findOne. * @param {Object} [opts.insertOpts] Options to pass to collection#insert. @@ -133,14 +124,24 @@ var REMOVE_OPTS_DEFAULTS = {}; */ function MongoDBAdapter(opts) { var self = this; - classCallCheck(self, MongoDBAdapter); + jsData.utils.classCallCheck(self, MongoDBAdapter); opts || (opts = {}); - if (isString(opts)) { + if (jsData.utils.isString(opts)) { opts = { uri: opts }; } - fillIn(opts, DEFAULTS); + jsData.utils.fillIn(opts, DEFAULTS); Adapter__default.call(self, opts); + /** + * Default options to pass to collection#count. + * + * @name MongoDBAdapter#countOpts + * @type {Object} + * @default {} + */ + self.countOpts || (self.countOpts = {}); + jsData.utils.fillIn(self.countOpts, COUNT_OPTS_DEFAULTS); + /** * Default options to pass to collection#find. * @@ -149,7 +150,7 @@ function MongoDBAdapter(opts) { * @default {} */ self.findOpts || (self.findOpts = {}); - fillIn(self.findOpts, FIND_OPTS_DEFAULTS); + jsData.utils.fillIn(self.findOpts, FIND_OPTS_DEFAULTS); /** * Default options to pass to collection#findOne. @@ -159,7 +160,7 @@ function MongoDBAdapter(opts) { * @default {} */ self.findOneOpts || (self.findOneOpts = {}); - fillIn(self.findOneOpts, FIND_ONE_OPTS_DEFAULTS); + jsData.utils.fillIn(self.findOneOpts, FIND_ONE_OPTS_DEFAULTS); /** * Default options to pass to collection#insert. @@ -169,7 +170,7 @@ function MongoDBAdapter(opts) { * @default {} */ self.insertOpts || (self.insertOpts = {}); - fillIn(self.insertOpts, INSERT_OPTS_DEFAULTS); + jsData.utils.fillIn(self.insertOpts, INSERT_OPTS_DEFAULTS); /** * Default options to pass to collection#insertMany. @@ -179,7 +180,7 @@ function MongoDBAdapter(opts) { * @default {} */ self.insertManyOpts || (self.insertManyOpts = {}); - fillIn(self.insertManyOpts, INSERT_MANY_OPTS_DEFAULTS); + jsData.utils.fillIn(self.insertManyOpts, INSERT_MANY_OPTS_DEFAULTS); /** * Default options to pass to collection#update. @@ -189,7 +190,7 @@ function MongoDBAdapter(opts) { * @default {} */ self.updateOpts || (self.updateOpts = {}); - fillIn(self.updateOpts, UPDATE_OPTS_DEFAULTS); + jsData.utils.fillIn(self.updateOpts, UPDATE_OPTS_DEFAULTS); /** * Default options to pass to collection#update. @@ -199,7 +200,7 @@ function MongoDBAdapter(opts) { * @default {} */ self.removeOpts || (self.removeOpts = {}); - fillIn(self.removeOpts, REMOVE_OPTS_DEFAULTS); + jsData.utils.fillIn(self.removeOpts, REMOVE_OPTS_DEFAULTS); /** * A Promise that resolves to a reference to the MongoDB client being used by @@ -241,9 +242,9 @@ Object.defineProperty(MongoDBAdapter, '__super__', { * properties to the MongoDBAdapter itself. * @return {Object} MongoDBAdapter of `MongoDBAdapter`. */ -MongoDBAdapter.extend = extend; +MongoDBAdapter.extend = jsData.utils.extend; -addHiddenPropsToTarget(MongoDBAdapter.prototype, { +jsData.utils.addHiddenPropsToTarget(MongoDBAdapter.prototype, { /** * Translate ObjectIDs to strings. * @@ -255,12 +256,12 @@ addHiddenPropsToTarget(MongoDBAdapter.prototype, { _translateId: function _translateId(r, opts) { opts || (opts = {}); if (this.getOpt('translateId', opts)) { - if (isArray(r)) { + if (jsData.utils.isArray(r)) { r.forEach(function (_r) { var __id = _r._id ? _r._id.toString() : _r._id; _r._id = typeof __id === 'string' ? __id : _r._id; }); - } else if (isObject(r)) { + } else if (jsData.utils.isObject(r)) { var __id = r._id ? r._id.toString() : r._id; r._id = typeof __id === 'string' ? __id : r._id; } @@ -269,6 +270,51 @@ addHiddenPropsToTarget(MongoDBAdapter.prototype, { }, + /** + * Retrieve the number of records that match the selection query. + * + * @name MongoDBAdapter#count + * @method + * @param {Object} mapper The mapper. + * @param {Object} query Selection query. + * @param {Object} [opts] Configuration options. + * @param {Object} [opts.countOpts] Options to pass to collection#count. + * @param {boolean} [opts.raw=false] Whether to return a more detailed + * response object. + * @param {string[]} [opts.with=[]] Relations to eager load. + * @return {Promise} + */ + + /** + * Retrieve the records that match the selection query. Internal method used + * by Adapter#count. + * + * @name MongoDBAdapter#_count + * @method + * @private + * @param {Object} mapper The mapper. + * @param {Object} query Selection query. + * @param {Object} [opts] Configuration options. + * @return {Promise} + */ + _count: function _count(mapper, query, opts) { + var self = this; + opts || (opts = {}); + + var countOpts = self.getOpt('countOpts', opts); + jsData.utils.fillIn(countOpts, self.getQueryOptions(mapper, query)); + var mongoQuery = self.getQuery(mapper, query); + + return self.getClient().then(function (client) { + return new Promise(function (resolve, reject) { + client.collection(mapper.table || underscore(mapper.name)).count(mongoQuery, countOpts, function (err, count) { + return err ? reject(err) : resolve([count, {}]); + }); + }); + }); + }, + + /** * Create a new record. * @@ -297,7 +343,7 @@ addHiddenPropsToTarget(MongoDBAdapter.prototype, { var self = this; props || (props = {}); opts || (opts = {}); - props = plainCopy(props); + props = jsData.utils.plainCopy(props); var insertOpts = self.getOpt('insertOpts', opts); @@ -313,7 +359,7 @@ addHiddenPropsToTarget(MongoDBAdapter.prototype, { var record = void 0; var r = cursor.ops ? cursor.ops : cursor; self._translateId(r, opts); - record = isArray(r) ? r[0] : r; + record = jsData.utils.isArray(r) ? r[0] : r; cursor.connection = undefined; return [record, cursor]; }); @@ -351,7 +397,7 @@ addHiddenPropsToTarget(MongoDBAdapter.prototype, { var self = this; props || (props = {}); opts || (opts = {}); - props = plainCopy(props); + props = jsData.utils.plainCopy(props); var insertManyOpts = self.getOpt('insertManyOpts', opts); @@ -456,7 +502,7 @@ addHiddenPropsToTarget(MongoDBAdapter.prototype, { query || (query = {}); opts || (opts = {}); var removeOpts = self.getOpt('removeOpts', opts); - fillIn(removeOpts, self.getQueryOptions(mapper, query)); + jsData.utils.fillIn(removeOpts, self.getQueryOptions(mapper, query)); return self.getClient().then(function (client) { var mongoQuery = self.getQuery(mapper, query); @@ -557,7 +603,7 @@ addHiddenPropsToTarget(MongoDBAdapter.prototype, { opts || (opts = {}); var findOpts = self.getOpt('findOpts', opts); - fillIn(findOpts, self.getQueryOptions(mapper, query)); + jsData.utils.fillIn(findOpts, self.getQueryOptions(mapper, query)); findOpts.fields || (findOpts.fields = {}); var mongoQuery = self.getQuery(mapper, query); @@ -729,12 +775,12 @@ addHiddenPropsToTarget(MongoDBAdapter.prototype, { * @return {Object} */ getQuery: function getQuery(mapper, query) { - query = plainCopy(query || {}); + query = jsData.utils.plainCopy(query || {}); query.where || (query.where = {}); - forOwn(query, function (config, keyword) { + jsData.utils.forOwn(query, function (config, keyword) { if (Adapter.reserved.indexOf(keyword) === -1) { - if (isObject(config)) { + if (jsData.utils.isObject(config)) { query.where[keyword] = config; } else { query.where[keyword] = { @@ -748,13 +794,13 @@ addHiddenPropsToTarget(MongoDBAdapter.prototype, { var mongoQuery = {}; if (Object.keys(query.where).length !== 0) { - forOwn(query.where, function (criteria, field) { - if (!isObject(criteria)) { + jsData.utils.forOwn(query.where, function (criteria, field) { + if (!jsData.utils.isObject(criteria)) { query.where[field] = { '==': criteria }; } - forOwn(criteria, function (v, op) { + jsData.utils.forOwn(criteria, function (v, op) { if (op === '==' || op === '===' || op === 'contains') { mongoQuery[field] = v; } else if (op === '!=' || op === '!==' || op === 'notContains') { @@ -855,18 +901,18 @@ addHiddenPropsToTarget(MongoDBAdapter.prototype, { * @return {Object} */ getQueryOptions: function getQueryOptions(mapper, query) { - query = plainCopy(query || {}); + query = jsData.utils.plainCopy(query || {}); query.orderBy = query.orderBy || query.sort; query.skip = query.skip || query.offset; var queryOptions = {}; if (query.orderBy) { - if (isString(query.orderBy)) { + if (jsData.utils.isString(query.orderBy)) { query.orderBy = [[query.orderBy, 'asc']]; } for (var i = 0; i < query.orderBy.length; i++) { - if (isString(query.orderBy[i])) { + if (jsData.utils.isString(query.orderBy[i])) { query.orderBy[i] = [query.orderBy[i], 'asc']; } } diff --git a/dist/js-data-mongodb.js.map b/dist/js-data-mongodb.js.map index 495d7f8..067f07d 100644 --- a/dist/js-data-mongodb.js.map +++ b/dist/js-data-mongodb.js.map @@ -1 +1 @@ -{"version":3,"file":"js-data-mongodb.js","sources":["../src/index.js"],"sourcesContent":["import {MongoClient} from 'mongodb'\nimport {ObjectID} from 'bson'\nimport {utils} from 'js-data'\nimport Adapter from 'js-data-adapter'\nimport {\n reserved\n} from 'js-data-adapter'\nimport underscore from 'mout/string/underscore'\n\nconst {\n addHiddenPropsToTarget,\n classCallCheck,\n extend,\n fillIn,\n forOwn,\n isArray,\n isObject,\n isString,\n plainCopy\n} = utils\n\nconst DEFAULTS = {\n /**\n * Convert ObjectIDs to strings when pulling records out of the database.\n *\n * @name MongoDBAdapter#translateId\n * @type {boolean}\n * @default true\n */\n translateId: true,\n\n /**\n * MongoDB URI.\n *\n * @name MongoDBAdapter#uri\n * @type {string}\n * @default mongodb://localhost:27017\n */\n uri: 'mongodb://localhost:27017'\n}\n\nconst FIND_OPTS_DEFAULTS = {}\nconst FIND_ONE_OPTS_DEFAULTS = {}\nconst INSERT_OPTS_DEFAULTS = {}\nconst INSERT_MANY_OPTS_DEFAULTS = {}\nconst UPDATE_OPTS_DEFAULTS = {}\nconst REMOVE_OPTS_DEFAULTS = {}\n\n/**\n * MongoDBAdapter class.\n *\n * @example\n * // Use Container instead of DataStore on the server\n * import {Container} from 'js-data'\n * import MongoDBAdapter from 'js-data-mongodb'\n *\n * // Create a store to hold your Mappers\n * const store = new Container({\n * mapperDefaults: {\n * // MongoDB uses \"_id\" as the primary key\n * idAttribute: '_id'\n * }\n * })\n *\n * // Create an instance of MongoDBAdapter with default settings\n * const adapter = new MongoDBAdapter()\n *\n * // Mappers in \"store\" will use the MongoDB adapter by default\n * store.registerAdapter('mongodb', adapter, { default: true })\n *\n * // Create a Mapper that maps to a \"user\" collection\n * store.defineMapper('user')\n *\n * @class MongoDBAdapter\n * @extends Adapter\n * @param {Object} [opts] Configuration opts.\n * @param {boolean} [opts.debug=false] Whether to log debugging information.\n * @param {Object} [opts.findOpts] Options to pass to collection#find.\n * @param {Object} [opts.findOneOpts] Options to pass to collection#findOne.\n * @param {Object} [opts.insertOpts] Options to pass to collection#insert.\n * @param {Object} [opts.insertManyOpts] Options to pass to\n * collection#insertMany.\n * @param {boolean} [opts.raw=false] Whether to return detailed result objects\n * instead of just record data.\n * @param {Object} [opts.removeOpts] Options to pass to collection#remove.\n * @param {boolean} [opts.translateId=true] Convert ObjectIDs to strings when\n * pulling records out of the database.\n * @param {Object} [opts.updateOpts] Options to pass to collection#update.\n * @param {string} [opts.uri=\"mongodb://localhost:27017\"] MongoDB URI.\n */\nfunction MongoDBAdapter (opts) {\n const self = this\n classCallCheck(self, MongoDBAdapter)\n opts || (opts = {})\n if (isString(opts)) {\n opts = { uri: opts }\n }\n fillIn(opts, DEFAULTS)\n Adapter.call(self, opts)\n\n /**\n * Default options to pass to collection#find.\n *\n * @name MongoDBAdapter#findOpts\n * @type {Object}\n * @default {}\n */\n self.findOpts || (self.findOpts = {})\n fillIn(self.findOpts, FIND_OPTS_DEFAULTS)\n\n /**\n * Default options to pass to collection#findOne.\n *\n * @name MongoDBAdapter#findOneOpts\n * @type {Object}\n * @default {}\n */\n self.findOneOpts || (self.findOneOpts = {})\n fillIn(self.findOneOpts, FIND_ONE_OPTS_DEFAULTS)\n\n /**\n * Default options to pass to collection#insert.\n *\n * @name MongoDBAdapter#insertOpts\n * @type {Object}\n * @default {}\n */\n self.insertOpts || (self.insertOpts = {})\n fillIn(self.insertOpts, INSERT_OPTS_DEFAULTS)\n\n /**\n * Default options to pass to collection#insertMany.\n *\n * @name MongoDBAdapter#insertManyOpts\n * @type {Object}\n * @default {}\n */\n self.insertManyOpts || (self.insertManyOpts = {})\n fillIn(self.insertManyOpts, INSERT_MANY_OPTS_DEFAULTS)\n\n /**\n * Default options to pass to collection#update.\n *\n * @name MongoDBAdapter#updateOpts\n * @type {Object}\n * @default {}\n */\n self.updateOpts || (self.updateOpts = {})\n fillIn(self.updateOpts, UPDATE_OPTS_DEFAULTS)\n\n /**\n * Default options to pass to collection#update.\n *\n * @name MongoDBAdapter#removeOpts\n * @type {Object}\n * @default {}\n */\n self.removeOpts || (self.removeOpts = {})\n fillIn(self.removeOpts, REMOVE_OPTS_DEFAULTS)\n\n /**\n * A Promise that resolves to a reference to the MongoDB client being used by\n * this adapter.\n *\n * @name MongoDBAdapter#client\n * @type {Object}\n */\n self.client = new Promise(function (resolve, reject) {\n MongoClient.connect(opts.uri, function (err, db) {\n return err ? reject(err) : resolve(db)\n })\n })\n}\n\n// Setup prototype inheritance from Adapter\nMongoDBAdapter.prototype = Object.create(Adapter.prototype, {\n constructor: {\n value: MongoDBAdapter,\n enumerable: false,\n writable: true,\n configurable: true\n }\n})\n\nObject.defineProperty(MongoDBAdapter, '__super__', {\n configurable: true,\n value: Adapter\n})\n\n/**\n * Alternative to ES6 class syntax for extending `MongoDBAdapter`.\n *\n * @name MongoDBAdapter.extend\n * @method\n * @param {Object} [instanceProps] Properties that will be added to the\n * prototype of the MongoDBAdapter.\n * @param {Object} [classProps] Properties that will be added as static\n * properties to the MongoDBAdapter itself.\n * @return {Object} MongoDBAdapter of `MongoDBAdapter`.\n */\nMongoDBAdapter.extend = extend\n\naddHiddenPropsToTarget(MongoDBAdapter.prototype, {\n /**\n * Translate ObjectIDs to strings.\n *\n * @name MongoDBAdapter#_translateId\n * @method\n * @return {*}\n */\n _translateId (r, opts) {\n opts || (opts = {})\n if (this.getOpt('translateId', opts)) {\n if (isArray(r)) {\n r.forEach(function (_r) {\n const __id = _r._id ? _r._id.toString() : _r._id\n _r._id = typeof __id === 'string' ? __id : _r._id\n })\n } else if (isObject(r)) {\n const __id = r._id ? r._id.toString() : r._id\n r._id = typeof __id === 'string' ? __id : r._id\n }\n }\n return r\n },\n\n /**\n * Create a new record.\n *\n * @name MongoDBAdapter#create\n * @method\n * @param {Object} mapper The mapper.\n * @param {Object} props The record to be created.\n * @param {Object} [opts] Configuration options.\n * @param {Object} [opts.insertOpts] Options to pass to collection#insert.\n * @param {boolean} [opts.raw=false] Whether to return a more detailed\n * @return {Promise}\n */\n\n /**\n * Create a new record. Internal method used by Adapter#create.\n *\n * @name MongoDBAdapter#_create\n * @method\n * @private\n * @param {Object} mapper The mapper.\n * @param {Object} props The record to be created.\n * @param {Object} [opts] Configuration options.\n * @return {Promise}\n */\n _create (mapper, props, opts) {\n const self = this\n props || (props = {})\n opts || (opts = {})\n props = plainCopy(props)\n\n const insertOpts = self.getOpt('insertOpts', opts)\n\n return self.getClient().then(function (client) {\n return new Promise(function (resolve, reject) {\n const collection = client.collection(mapper.table || underscore(mapper.name))\n const method = collection.insertOne ? 'insertOne' : 'insert'\n collection[method](props, insertOpts, function (err, cursor) {\n return err ? reject(err) : resolve(cursor)\n })\n })\n }).then(function (cursor) {\n let record\n let r = cursor.ops ? cursor.ops : cursor\n self._translateId(r, opts)\n record = isArray(r) ? r[0] : r\n cursor.connection = undefined\n return [record, cursor]\n })\n },\n\n /**\n * Create multiple records in a single batch.\n *\n * @name MongoDBAdapter#createMany\n * @method\n * @param {Object} mapper The mapper.\n * @param {Object} props The records to be created.\n * @param {Object} [opts] Configuration options.\n * @param {Object} [opts.insertManyOpts] Options to pass to\n * collection#insertMany.\n * @param {boolean} [opts.raw=false] Whether to return a more detailed\n * response object.\n * @return {Promise}\n */\n\n /**\n * Create multiple records in a single batch. Internal method used by\n * Adapter#createMany.\n *\n * @name MongoDBAdapter#_createMany\n * @method\n * @private\n * @param {Object} mapper The mapper.\n * @param {Object} props The records to be created.\n * @param {Object} [opts] Configuration options.\n * @return {Promise}\n */\n _createMany (mapper, props, opts) {\n const self = this\n props || (props = {})\n opts || (opts = {})\n props = plainCopy(props)\n\n const insertManyOpts = self.getOpt('insertManyOpts', opts)\n\n return self.getClient().then(function (client) {\n return new Promise(function (resolve, reject) {\n const collection = client.collection(mapper.table || underscore(mapper.name))\n collection.insertMany(props, insertManyOpts, function (err, cursor) {\n return err ? reject(err) : resolve(cursor)\n })\n })\n }).then(function (cursor) {\n let records = []\n let r = cursor.ops ? cursor.ops : cursor\n self._translateId(r, opts)\n records = r\n cursor.connection = undefined\n return [records, cursor]\n })\n },\n\n /**\n * Destroy the record with the given primary key.\n *\n * @name MongoDBAdapter#destroy\n * @method\n * @param {Object} mapper The mapper.\n * @param {(string|number)} id Primary key of the record to destroy.\n * @param {Object} [opts] Configuration options.\n * @param {boolean} [opts.raw=false] Whether to return a more detailed\n * response object.\n * @param {Object} [opts.removeOpts] Options to pass to collection#remove.\n * @return {Promise}\n */\n\n /**\n * Destroy the record with the given primary key. Internal method used by\n * Adapter#destroy.\n *\n * @name MongoDBAdapter#_destroy\n * @method\n * @private\n * @param {Object} mapper The mapper.\n * @param {(string|number)} id Primary key of the record to destroy.\n * @param {Object} [opts] Configuration options.\n * @return {Promise}\n */\n _destroy (mapper, id, opts) {\n const self = this\n opts || (opts = {})\n const removeOpts = self.getOpt('removeOpts', opts)\n\n return self.getClient().then(function (client) {\n return new Promise(function (resolve, reject) {\n const mongoQuery = {}\n mongoQuery[mapper.idAttribute] = self.toObjectID(mapper, id)\n const collection = client.collection(mapper.table || underscore(mapper.name))\n collection[collection.deleteOne ? 'deleteOne' : 'remove'](mongoQuery, removeOpts, function (err, cursor) {\n return err ? reject(err) : resolve(cursor)\n })\n })\n }).then(function (cursor) {\n return [undefined, cursor]\n })\n },\n\n /**\n * Destroy the records that match the selection query.\n *\n * @name MongoDBAdapter#destroyAll\n * @method\n * @param {Object} mapper the mapper.\n * @param {Object} [query] Selection query.\n * @param {Object} [query.where] Filtering criteria.\n * @param {string|Array} [query.orderBy] Sorting criteria.\n * @param {string|Array} [query.sort] Same as `query.sort`.\n * @param {number} [query.limit] Limit results.\n * @param {number} [query.skip] Offset results.\n * @param {number} [query.offset] Same as `query.skip`.\n * @param {Object} [opts] Configuration options.\n * @param {boolean} [opts.raw=false] Whether to return a more detailed\n * response object.\n * @param {Object} [opts.removeOpts] Options to pass to collection#remove.\n * @return {Promise}\n */\n\n /**\n * Destroy the records that match the selection query. Internal method used by\n * Adapter#destroyAll.\n *\n * @name MongoDBAdapter#_destroyAll\n * @method\n * @private\n * @param {Object} mapper the mapper.\n * @param {Object} [query] Selection query.\n * @param {Object} [opts] Configuration options.\n * @return {Promise}\n */\n _destroyAll (mapper, query, opts) {\n const self = this\n query || (query = {})\n opts || (opts = {})\n const removeOpts = self.getOpt('removeOpts', opts)\n fillIn(removeOpts, self.getQueryOptions(mapper, query))\n\n return self.getClient().then(function (client) {\n const mongoQuery = self.getQuery(mapper, query)\n return new Promise(function (resolve, reject) {\n const collection = client.collection(mapper.table || underscore(mapper.name))\n collection[collection.deleteMany ? 'deleteMany' : 'remove'](mongoQuery, removeOpts, function (err, cursor) {\n return err ? reject(err) : resolve(cursor)\n })\n })\n }).then(function (cursor) {\n cursor.connection = undefined\n return [undefined, cursor]\n })\n },\n\n /**\n * Retrieve the record with the given primary key.\n *\n * @name MongoDBAdapter#find\n * @method\n * @param {Object} mapper The mapper.\n * @param {(string|number)} id Primary key of the record to retrieve.\n * @param {Object} [opts] Configuration options.\n * @param {Object} [opts.findOneOpts] Options to pass to collection#findOne.\n * @param {boolean} [opts.raw=false] Whether to return a more detailed\n * response object.\n * @param {string[]} [opts.with=[]] Relations to eager load.\n * @return {Promise}\n */\n\n /**\n * Retrieve the record with the given primary key. Internal method used by\n * Adapter#find.\n *\n * @name MongoDBAdapter#_find\n * @method\n * @private\n * @param {Object} mapper The mapper.\n * @param {(string|number)} id Primary key of the record to retrieve.\n * @param {Object} [opts] Configuration options.\n * @return {Promise}\n */\n _find (mapper, id, opts) {\n const self = this\n opts || (opts = {})\n opts.with || (opts.with = [])\n\n const findOneOpts = self.getOpt('findOneOpts', opts)\n findOneOpts.fields || (findOneOpts.fields = {})\n\n return self.getClient().then(function (client) {\n return new Promise(function (resolve, reject) {\n let mongoQuery = {}\n mongoQuery[mapper.idAttribute] = self.toObjectID(mapper, id)\n client.collection(mapper.table || underscore(mapper.name)).findOne(mongoQuery, findOneOpts, function (err, record) {\n return err ? reject(err) : resolve(record)\n })\n })\n }).then(function (record) {\n if (record) {\n self._translateId(record, opts)\n }\n return [record, {}]\n })\n },\n\n /**\n * Retrieve the records that match the selection query.\n *\n * @name MongoDBAdapter#findAll\n * @method\n * @param {Object} mapper The mapper.\n * @param {Object} query Selection query.\n * @param {Object} [opts] Configuration options.\n * @param {Object} [opts.findOpts] Options to pass to collection#find.\n * @param {boolean} [opts.raw=false] Whether to return a more detailed\n * response object.\n * @param {string[]} [opts.with=[]] Relations to eager load.\n * @return {Promise}\n */\n\n /**\n * Retrieve the records that match the selection query. Internal method used\n * by Adapter#findAll.\n *\n * @name MongoDBAdapter#_findAll\n * @method\n * @private\n * @param {Object} mapper The mapper.\n * @param {Object} query Selection query.\n * @param {Object} [opts] Configuration options.\n * @return {Promise}\n */\n _findAll (mapper, query, opts) {\n const self = this\n opts || (opts = {})\n\n const findOpts = self.getOpt('findOpts', opts)\n fillIn(findOpts, self.getQueryOptions(mapper, query))\n findOpts.fields || (findOpts.fields = {})\n const mongoQuery = self.getQuery(mapper, query)\n\n return self.getClient().then(function (client) {\n return new Promise(function (resolve, reject) {\n client.collection(mapper.table || underscore(mapper.name)).find(mongoQuery, findOpts).toArray(function (err, records) {\n return err ? reject(err) : resolve(records)\n })\n })\n }).then(function (records) {\n self._translateId(records, opts)\n return [records, {}]\n })\n },\n\n /**\n * Apply the given update to the record with the specified primary key.\n *\n * @name MongoDBAdapter#update\n * @method\n * @param {Object} mapper The mapper.\n * @param {(string|number)} id The primary key of the record to be updated.\n * @param {Object} props The update to apply to the record.\n * @param {Object} [opts] Configuration options.\n * @param {boolean} [opts.raw=false] Whether to return a more detailed\n * response object.\n * @param {Object} [opts.updateOpts] Options to pass to collection#update.\n * @return {Promise}\n */\n\n /**\n * Apply the given update to the record with the specified primary key.\n * Internal method used by Adapter#update.\n *\n * @name MongoDBAdapter#_update\n * @method\n * @private\n * @param {Object} mapper The mapper.\n * @param {(string|number)} id The primary key of the record to be updated.\n * @param {Object} props The update to apply to the record.\n * @param {Object} [opts] Configuration options.\n * @return {Promise}\n */\n _update (mapper, id, props, opts) {\n const self = this\n props || (props = {})\n opts || (opts = {})\n const updateOpts = self.getOpt('updateOpts', opts)\n\n return self.find(mapper, id, { raw: false }).then(function (record) {\n if (!record) {\n throw new Error('Not Found')\n }\n return self.getClient().then(function (client) {\n return new Promise(function (resolve, reject) {\n const mongoQuery = {}\n mongoQuery[mapper.idAttribute] = self.toObjectID(mapper, id)\n const collection = client.collection(mapper.table || underscore(mapper.name))\n collection[collection.updateOne ? 'updateOne' : 'update'](mongoQuery, { $set: props }, updateOpts, function (err, cursor) {\n return err ? reject(err) : resolve(cursor)\n })\n })\n })\n }).then(function (cursor) {\n return self.find(mapper, id, { raw: false }).then(function (record) {\n cursor.connection = undefined\n return [record, cursor]\n })\n })\n },\n\n /**\n * Apply the given update to all records that match the selection query.\n *\n * @name MongoDBAdapter#updateAll\n * @method\n * @param {Object} mapper The mapper.\n * @param {Object} props The update to apply to the selected records.\n * @param {Object} [query] Selection query.\n * @param {Object} [opts] Configuration options.\n * @param {boolean} [opts.raw=false] Whether to return a more detailed\n * response object.\n * @param {Object} [opts.updateOpts] Options to pass to collection#update.\n * @return {Promise}\n */\n\n /**\n * Apply the given update to all records that match the selection query.\n * Internal method used by Adapter#updateAll.\n *\n * @name MongoDBAdapter#_updateAll\n * @method\n * @private\n * @param {Object} mapper The mapper.\n * @param {Object} props The update to apply to the selected records.\n * @param {Object} [query] Selection query.\n * @param {Object} [opts] Configuration options.\n * @return {Promise}\n */\n _updateAll (mapper, props, query, opts) {\n const self = this\n props || (props = {})\n query || (query = {})\n opts || (opts = {})\n let ids\n const updateOpts = self.getOpt('updateOpts', opts)\n updateOpts.multi = true\n\n return Promise.all([\n self.findAll(mapper, query, { raw: false }),\n self.getClient()\n ]).then(function (results) {\n let [records, client] = results\n const queryOptions = self.getQueryOptions(mapper, query)\n const mongoQuery = self.getQuery(mapper, query)\n\n queryOptions.$set = props\n ids = records.map(function (record) {\n return self.toObjectID(mapper, record[mapper.idAttribute])\n })\n\n return new Promise(function (resolve, reject) {\n const collection = client.collection(mapper.table || underscore(mapper.name))\n collection[collection.updateMany ? 'updateMany' : 'update'](mongoQuery, queryOptions, updateOpts, function (err, cursor) {\n return err ? reject(err) : resolve(cursor)\n })\n })\n }).then(function (cursor) {\n const query = {}\n query[mapper.idAttribute] = {\n 'in': ids\n }\n return self.findAll(mapper, query, { raw: false }).then(function (records) {\n cursor.connection = undefined\n return [records, cursor]\n })\n })\n },\n\n /**\n * Return a Promise that resolves to a reference to the MongoDB client being\n * used by this adapter.\n *\n * Useful when you need to do anything custom with the MongoDB client library.\n *\n * @name MongoDBAdapter#getClient\n * @method\n * @return {Object} MongoDB client.\n */\n getClient () {\n return this.client\n },\n\n /**\n * Map filtering params in a selection query to MongoDB a filtering object.\n *\n * Handles the following:\n *\n * - where\n * - and bunch of filtering operators\n *\n * @name MongoDBAdapter#getQuery\n * @method\n * @return {Object}\n */\n getQuery (mapper, query) {\n query = plainCopy(query || {})\n query.where || (query.where = {})\n\n forOwn(query, function (config, keyword) {\n if (reserved.indexOf(keyword) === -1) {\n if (isObject(config)) {\n query.where[keyword] = config\n } else {\n query.where[keyword] = {\n '==': config\n }\n }\n delete query[keyword]\n }\n })\n\n let mongoQuery = {}\n\n if (Object.keys(query.where).length !== 0) {\n forOwn(query.where, function (criteria, field) {\n if (!isObject(criteria)) {\n query.where[field] = {\n '==': criteria\n }\n }\n forOwn(criteria, function (v, op) {\n if (op === '==' || op === '===' || op === 'contains') {\n mongoQuery[field] = v\n } else if (op === '!=' || op === '!==' || op === 'notContains') {\n mongoQuery[field] = mongoQuery[field] || {}\n mongoQuery[field].$ne = v\n } else if (op === '>') {\n mongoQuery[field] = mongoQuery[field] || {}\n mongoQuery[field].$gt = v\n } else if (op === '>=') {\n mongoQuery[field] = mongoQuery[field] || {}\n mongoQuery[field].$gte = v\n } else if (op === '<') {\n mongoQuery[field] = mongoQuery[field] || {}\n mongoQuery[field].$lt = v\n } else if (op === '<=') {\n mongoQuery[field] = mongoQuery[field] || {}\n mongoQuery[field].$lte = v\n } else if (op === 'in') {\n mongoQuery[field] = mongoQuery[field] || {}\n mongoQuery[field].$in = v\n } else if (op === 'notIn') {\n mongoQuery[field] = mongoQuery[field] || {}\n mongoQuery[field].$nin = v\n } else if (op === '|==' || op === '|===' || op === '|contains') {\n mongoQuery.$or = mongoQuery.$or || []\n let orEqQuery = {}\n orEqQuery[field] = v\n mongoQuery.$or.push(orEqQuery)\n } else if (op === '|!=' || op === '|!==' || op === '|notContains') {\n mongoQuery.$or = mongoQuery.$or || []\n let orNeQuery = {}\n orNeQuery[field] = {\n '$ne': v\n }\n mongoQuery.$or.push(orNeQuery)\n } else if (op === '|>') {\n mongoQuery.$or = mongoQuery.$or || []\n let orGtQuery = {}\n orGtQuery[field] = {\n '$gt': v\n }\n mongoQuery.$or.push(orGtQuery)\n } else if (op === '|>=') {\n mongoQuery.$or = mongoQuery.$or || []\n let orGteQuery = {}\n orGteQuery[field] = {\n '$gte': v\n }\n mongoQuery.$or.push(orGteQuery)\n } else if (op === '|<') {\n mongoQuery.$or = mongoQuery.$or || []\n let orLtQuery = {}\n orLtQuery[field] = {\n '$lt': v\n }\n mongoQuery.$or.push(orLtQuery)\n } else if (op === '|<=') {\n mongoQuery.$or = mongoQuery.$or || []\n let orLteQuery = {}\n orLteQuery[field] = {\n '$lte': v\n }\n mongoQuery.$or.push(orLteQuery)\n } else if (op === '|in') {\n mongoQuery.$or = mongoQuery.$or || []\n let orInQuery = {}\n orInQuery[field] = {\n '$in': v\n }\n mongoQuery.$or.push(orInQuery)\n } else if (op === '|notIn') {\n mongoQuery.$or = mongoQuery.$or || []\n let orNinQuery = {}\n orNinQuery[field] = {\n '$nin': v\n }\n mongoQuery.$or.push(orNinQuery)\n }\n })\n })\n }\n\n return mongoQuery\n },\n\n /**\n * Map non-filtering params in a selection query to MongoDB query options.\n *\n * Handles the following:\n *\n * - limit\n * - skip/offset\n * - orderBy/sort\n *\n * @name MongoDBAdapter#getQueryOptions\n * @method\n * @return {Object}\n */\n getQueryOptions (mapper, query) {\n query = plainCopy(query || {})\n query.orderBy = query.orderBy || query.sort\n query.skip = query.skip || query.offset\n\n let queryOptions = {}\n\n if (query.orderBy) {\n if (isString(query.orderBy)) {\n query.orderBy = [\n [query.orderBy, 'asc']\n ]\n }\n for (var i = 0; i < query.orderBy.length; i++) {\n if (isString(query.orderBy[i])) {\n query.orderBy[i] = [query.orderBy[i], 'asc']\n }\n }\n queryOptions.sort = query.orderBy\n }\n\n if (query.skip) {\n queryOptions.skip = +query.skip\n }\n\n if (query.limit) {\n queryOptions.limit = +query.limit\n }\n\n return queryOptions\n },\n\n /**\n * Turn an _id into an ObjectID if it isn't already an ObjectID.\n *\n * @name MongoDBAdapter#toObjectID\n * @method\n * @return {*}\n */\n toObjectID (mapper, id) {\n if (id !== undefined && mapper.idAttribute === '_id' && typeof id === 'string' && ObjectID.isValid(id) && !(id instanceof ObjectID)) {\n return new ObjectID(id)\n }\n return id\n },\n\n /**\n * Return the foreignKey from the given record for the provided relationship.\n *\n * @name MongoDBAdapter#makeBelongsToForeignKey\n * @method\n * @return {*}\n */\n makeBelongsToForeignKey (mapper, def, record) {\n return this.toObjectID(def.getRelation(), Adapter.prototype.makeBelongsToForeignKey.call(this, mapper, def, record))\n },\n\n /**\n * Return the localKeys from the given record for the provided relationship.\n *\n * Override with care.\n *\n * @name MongoDBAdapter#makeHasManyLocalKeys\n * @method\n * @return {*}\n */\n makeHasManyLocalKeys (mapper, def, record) {\n const self = this\n const relatedMapper = def.getRelation()\n const localKeys = Adapter.prototype.makeHasManyLocalKeys.call(self, mapper, def, record)\n return localKeys.map(function (key) {\n return self.toObjectID(relatedMapper, key)\n })\n },\n\n /**\n * Not supported.\n *\n * @name MongoDBAdapter#updateMany\n * @method\n */\n updateMany () {\n throw new Error('not supported!')\n }\n})\n\nmodule.exports = MongoDBAdapter\n"],"names":["utils","Adapter","reserved","ObjectID"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"js-data-mongodb.js","sources":["../src/index.js"],"sourcesContent":["import {MongoClient} from 'mongodb'\nimport {ObjectID} from 'bson'\nimport {utils} from 'js-data'\nimport Adapter from 'js-data-adapter'\nimport {\n reserved\n} from 'js-data-adapter'\nimport underscore from 'mout/string/underscore'\n\nconst DEFAULTS = {\n /**\n * Convert ObjectIDs to strings when pulling records out of the database.\n *\n * @name MongoDBAdapter#translateId\n * @type {boolean}\n * @default true\n */\n translateId: true,\n\n /**\n * MongoDB URI.\n *\n * @name MongoDBAdapter#uri\n * @type {string}\n * @default mongodb://localhost:27017\n */\n uri: 'mongodb://localhost:27017'\n}\n\nconst COUNT_OPTS_DEFAULTS = {}\nconst FIND_OPTS_DEFAULTS = {}\nconst FIND_ONE_OPTS_DEFAULTS = {}\nconst INSERT_OPTS_DEFAULTS = {}\nconst INSERT_MANY_OPTS_DEFAULTS = {}\nconst UPDATE_OPTS_DEFAULTS = {}\nconst REMOVE_OPTS_DEFAULTS = {}\n\n/**\n * MongoDBAdapter class.\n *\n * @example\n * // Use Container instead of DataStore on the server\n * import {Container} from 'js-data'\n * import MongoDBAdapter from 'js-data-mongodb'\n *\n * // Create a store to hold your Mappers\n * const store = new Container({\n * mapperDefaults: {\n * // MongoDB uses \"_id\" as the primary key\n * idAttribute: '_id'\n * }\n * })\n *\n * // Create an instance of MongoDBAdapter with default settings\n * const adapter = new MongoDBAdapter()\n *\n * // Mappers in \"store\" will use the MongoDB adapter by default\n * store.registerAdapter('mongodb', adapter, { default: true })\n *\n * // Create a Mapper that maps to a \"user\" collection\n * store.defineMapper('user')\n *\n * @class MongoDBAdapter\n * @extends Adapter\n * @param {Object} [opts] Configuration opts.\n * @param {boolean} [opts.debug=false] Whether to log debugging information.\n * @param {Object} [opts.countOpts] Options to pass to collection#count.\n * @param {Object} [opts.findOpts] Options to pass to collection#find.\n * @param {Object} [opts.findOneOpts] Options to pass to collection#findOne.\n * @param {Object} [opts.insertOpts] Options to pass to collection#insert.\n * @param {Object} [opts.insertManyOpts] Options to pass to\n * collection#insertMany.\n * @param {boolean} [opts.raw=false] Whether to return detailed result objects\n * instead of just record data.\n * @param {Object} [opts.removeOpts] Options to pass to collection#remove.\n * @param {boolean} [opts.translateId=true] Convert ObjectIDs to strings when\n * pulling records out of the database.\n * @param {Object} [opts.updateOpts] Options to pass to collection#update.\n * @param {string} [opts.uri=\"mongodb://localhost:27017\"] MongoDB URI.\n */\nfunction MongoDBAdapter (opts) {\n const self = this\n utils.classCallCheck(self, MongoDBAdapter)\n opts || (opts = {})\n if (utils.isString(opts)) {\n opts = { uri: opts }\n }\n utils.fillIn(opts, DEFAULTS)\n Adapter.call(self, opts)\n\n /**\n * Default options to pass to collection#count.\n *\n * @name MongoDBAdapter#countOpts\n * @type {Object}\n * @default {}\n */\n self.countOpts || (self.countOpts = {})\n utils.fillIn(self.countOpts, COUNT_OPTS_DEFAULTS)\n\n /**\n * Default options to pass to collection#find.\n *\n * @name MongoDBAdapter#findOpts\n * @type {Object}\n * @default {}\n */\n self.findOpts || (self.findOpts = {})\n utils.fillIn(self.findOpts, FIND_OPTS_DEFAULTS)\n\n /**\n * Default options to pass to collection#findOne.\n *\n * @name MongoDBAdapter#findOneOpts\n * @type {Object}\n * @default {}\n */\n self.findOneOpts || (self.findOneOpts = {})\n utils.fillIn(self.findOneOpts, FIND_ONE_OPTS_DEFAULTS)\n\n /**\n * Default options to pass to collection#insert.\n *\n * @name MongoDBAdapter#insertOpts\n * @type {Object}\n * @default {}\n */\n self.insertOpts || (self.insertOpts = {})\n utils.fillIn(self.insertOpts, INSERT_OPTS_DEFAULTS)\n\n /**\n * Default options to pass to collection#insertMany.\n *\n * @name MongoDBAdapter#insertManyOpts\n * @type {Object}\n * @default {}\n */\n self.insertManyOpts || (self.insertManyOpts = {})\n utils.fillIn(self.insertManyOpts, INSERT_MANY_OPTS_DEFAULTS)\n\n /**\n * Default options to pass to collection#update.\n *\n * @name MongoDBAdapter#updateOpts\n * @type {Object}\n * @default {}\n */\n self.updateOpts || (self.updateOpts = {})\n utils.fillIn(self.updateOpts, UPDATE_OPTS_DEFAULTS)\n\n /**\n * Default options to pass to collection#update.\n *\n * @name MongoDBAdapter#removeOpts\n * @type {Object}\n * @default {}\n */\n self.removeOpts || (self.removeOpts = {})\n utils.fillIn(self.removeOpts, REMOVE_OPTS_DEFAULTS)\n\n /**\n * A Promise that resolves to a reference to the MongoDB client being used by\n * this adapter.\n *\n * @name MongoDBAdapter#client\n * @type {Object}\n */\n self.client = new Promise(function (resolve, reject) {\n MongoClient.connect(opts.uri, function (err, db) {\n return err ? reject(err) : resolve(db)\n })\n })\n}\n\n// Setup prototype inheritance from Adapter\nMongoDBAdapter.prototype = Object.create(Adapter.prototype, {\n constructor: {\n value: MongoDBAdapter,\n enumerable: false,\n writable: true,\n configurable: true\n }\n})\n\nObject.defineProperty(MongoDBAdapter, '__super__', {\n configurable: true,\n value: Adapter\n})\n\n/**\n * Alternative to ES6 class syntax for extending `MongoDBAdapter`.\n *\n * @name MongoDBAdapter.extend\n * @method\n * @param {Object} [instanceProps] Properties that will be added to the\n * prototype of the MongoDBAdapter.\n * @param {Object} [classProps] Properties that will be added as static\n * properties to the MongoDBAdapter itself.\n * @return {Object} MongoDBAdapter of `MongoDBAdapter`.\n */\nMongoDBAdapter.extend = utils.extend\n\nutils.addHiddenPropsToTarget(MongoDBAdapter.prototype, {\n /**\n * Translate ObjectIDs to strings.\n *\n * @name MongoDBAdapter#_translateId\n * @method\n * @return {*}\n */\n _translateId (r, opts) {\n opts || (opts = {})\n if (this.getOpt('translateId', opts)) {\n if (utils.isArray(r)) {\n r.forEach(function (_r) {\n const __id = _r._id ? _r._id.toString() : _r._id\n _r._id = typeof __id === 'string' ? __id : _r._id\n })\n } else if (utils.isObject(r)) {\n const __id = r._id ? r._id.toString() : r._id\n r._id = typeof __id === 'string' ? __id : r._id\n }\n }\n return r\n },\n\n /**\n * Retrieve the number of records that match the selection query.\n *\n * @name MongoDBAdapter#count\n * @method\n * @param {Object} mapper The mapper.\n * @param {Object} query Selection query.\n * @param {Object} [opts] Configuration options.\n * @param {Object} [opts.countOpts] Options to pass to collection#count.\n * @param {boolean} [opts.raw=false] Whether to return a more detailed\n * response object.\n * @param {string[]} [opts.with=[]] Relations to eager load.\n * @return {Promise}\n */\n\n /**\n * Retrieve the records that match the selection query. Internal method used\n * by Adapter#count.\n *\n * @name MongoDBAdapter#_count\n * @method\n * @private\n * @param {Object} mapper The mapper.\n * @param {Object} query Selection query.\n * @param {Object} [opts] Configuration options.\n * @return {Promise}\n */\n _count (mapper, query, opts) {\n const self = this\n opts || (opts = {})\n\n const countOpts = self.getOpt('countOpts', opts)\n utils.fillIn(countOpts, self.getQueryOptions(mapper, query))\n const mongoQuery = self.getQuery(mapper, query)\n\n return self.getClient().then(function (client) {\n return new Promise(function (resolve, reject) {\n client.collection(mapper.table || underscore(mapper.name)).count(mongoQuery, countOpts, function (err, count) {\n return err ? reject(err) : resolve([count, {}])\n })\n })\n })\n },\n\n /**\n * Create a new record.\n *\n * @name MongoDBAdapter#create\n * @method\n * @param {Object} mapper The mapper.\n * @param {Object} props The record to be created.\n * @param {Object} [opts] Configuration options.\n * @param {Object} [opts.insertOpts] Options to pass to collection#insert.\n * @param {boolean} [opts.raw=false] Whether to return a more detailed\n * @return {Promise}\n */\n\n /**\n * Create a new record. Internal method used by Adapter#create.\n *\n * @name MongoDBAdapter#_create\n * @method\n * @private\n * @param {Object} mapper The mapper.\n * @param {Object} props The record to be created.\n * @param {Object} [opts] Configuration options.\n * @return {Promise}\n */\n _create (mapper, props, opts) {\n const self = this\n props || (props = {})\n opts || (opts = {})\n props = utils.plainCopy(props)\n\n const insertOpts = self.getOpt('insertOpts', opts)\n\n return self.getClient().then(function (client) {\n return new Promise(function (resolve, reject) {\n const collection = client.collection(mapper.table || underscore(mapper.name))\n const method = collection.insertOne ? 'insertOne' : 'insert'\n collection[method](props, insertOpts, function (err, cursor) {\n return err ? reject(err) : resolve(cursor)\n })\n })\n }).then(function (cursor) {\n let record\n let r = cursor.ops ? cursor.ops : cursor\n self._translateId(r, opts)\n record = utils.isArray(r) ? r[0] : r\n cursor.connection = undefined\n return [record, cursor]\n })\n },\n\n /**\n * Create multiple records in a single batch.\n *\n * @name MongoDBAdapter#createMany\n * @method\n * @param {Object} mapper The mapper.\n * @param {Object} props The records to be created.\n * @param {Object} [opts] Configuration options.\n * @param {Object} [opts.insertManyOpts] Options to pass to\n * collection#insertMany.\n * @param {boolean} [opts.raw=false] Whether to return a more detailed\n * response object.\n * @return {Promise}\n */\n\n /**\n * Create multiple records in a single batch. Internal method used by\n * Adapter#createMany.\n *\n * @name MongoDBAdapter#_createMany\n * @method\n * @private\n * @param {Object} mapper The mapper.\n * @param {Object} props The records to be created.\n * @param {Object} [opts] Configuration options.\n * @return {Promise}\n */\n _createMany (mapper, props, opts) {\n const self = this\n props || (props = {})\n opts || (opts = {})\n props = utils.plainCopy(props)\n\n const insertManyOpts = self.getOpt('insertManyOpts', opts)\n\n return self.getClient().then(function (client) {\n return new Promise(function (resolve, reject) {\n const collection = client.collection(mapper.table || underscore(mapper.name))\n collection.insertMany(props, insertManyOpts, function (err, cursor) {\n return err ? reject(err) : resolve(cursor)\n })\n })\n }).then(function (cursor) {\n let records = []\n let r = cursor.ops ? cursor.ops : cursor\n self._translateId(r, opts)\n records = r\n cursor.connection = undefined\n return [records, cursor]\n })\n },\n\n /**\n * Destroy the record with the given primary key.\n *\n * @name MongoDBAdapter#destroy\n * @method\n * @param {Object} mapper The mapper.\n * @param {(string|number)} id Primary key of the record to destroy.\n * @param {Object} [opts] Configuration options.\n * @param {boolean} [opts.raw=false] Whether to return a more detailed\n * response object.\n * @param {Object} [opts.removeOpts] Options to pass to collection#remove.\n * @return {Promise}\n */\n\n /**\n * Destroy the record with the given primary key. Internal method used by\n * Adapter#destroy.\n *\n * @name MongoDBAdapter#_destroy\n * @method\n * @private\n * @param {Object} mapper The mapper.\n * @param {(string|number)} id Primary key of the record to destroy.\n * @param {Object} [opts] Configuration options.\n * @return {Promise}\n */\n _destroy (mapper, id, opts) {\n const self = this\n opts || (opts = {})\n const removeOpts = self.getOpt('removeOpts', opts)\n\n return self.getClient().then(function (client) {\n return new Promise(function (resolve, reject) {\n const mongoQuery = {}\n mongoQuery[mapper.idAttribute] = self.toObjectID(mapper, id)\n const collection = client.collection(mapper.table || underscore(mapper.name))\n collection[collection.deleteOne ? 'deleteOne' : 'remove'](mongoQuery, removeOpts, function (err, cursor) {\n return err ? reject(err) : resolve(cursor)\n })\n })\n }).then(function (cursor) {\n return [undefined, cursor]\n })\n },\n\n /**\n * Destroy the records that match the selection query.\n *\n * @name MongoDBAdapter#destroyAll\n * @method\n * @param {Object} mapper the mapper.\n * @param {Object} [query] Selection query.\n * @param {Object} [query.where] Filtering criteria.\n * @param {string|Array} [query.orderBy] Sorting criteria.\n * @param {string|Array} [query.sort] Same as `query.sort`.\n * @param {number} [query.limit] Limit results.\n * @param {number} [query.skip] Offset results.\n * @param {number} [query.offset] Same as `query.skip`.\n * @param {Object} [opts] Configuration options.\n * @param {boolean} [opts.raw=false] Whether to return a more detailed\n * response object.\n * @param {Object} [opts.removeOpts] Options to pass to collection#remove.\n * @return {Promise}\n */\n\n /**\n * Destroy the records that match the selection query. Internal method used by\n * Adapter#destroyAll.\n *\n * @name MongoDBAdapter#_destroyAll\n * @method\n * @private\n * @param {Object} mapper the mapper.\n * @param {Object} [query] Selection query.\n * @param {Object} [opts] Configuration options.\n * @return {Promise}\n */\n _destroyAll (mapper, query, opts) {\n const self = this\n query || (query = {})\n opts || (opts = {})\n const removeOpts = self.getOpt('removeOpts', opts)\n utils.fillIn(removeOpts, self.getQueryOptions(mapper, query))\n\n return self.getClient().then(function (client) {\n const mongoQuery = self.getQuery(mapper, query)\n return new Promise(function (resolve, reject) {\n const collection = client.collection(mapper.table || underscore(mapper.name))\n collection[collection.deleteMany ? 'deleteMany' : 'remove'](mongoQuery, removeOpts, function (err, cursor) {\n return err ? reject(err) : resolve(cursor)\n })\n })\n }).then(function (cursor) {\n cursor.connection = undefined\n return [undefined, cursor]\n })\n },\n\n /**\n * Retrieve the record with the given primary key.\n *\n * @name MongoDBAdapter#find\n * @method\n * @param {Object} mapper The mapper.\n * @param {(string|number)} id Primary key of the record to retrieve.\n * @param {Object} [opts] Configuration options.\n * @param {Object} [opts.findOneOpts] Options to pass to collection#findOne.\n * @param {boolean} [opts.raw=false] Whether to return a more detailed\n * response object.\n * @param {string[]} [opts.with=[]] Relations to eager load.\n * @return {Promise}\n */\n\n /**\n * Retrieve the record with the given primary key. Internal method used by\n * Adapter#find.\n *\n * @name MongoDBAdapter#_find\n * @method\n * @private\n * @param {Object} mapper The mapper.\n * @param {(string|number)} id Primary key of the record to retrieve.\n * @param {Object} [opts] Configuration options.\n * @return {Promise}\n */\n _find (mapper, id, opts) {\n const self = this\n opts || (opts = {})\n opts.with || (opts.with = [])\n\n const findOneOpts = self.getOpt('findOneOpts', opts)\n findOneOpts.fields || (findOneOpts.fields = {})\n\n return self.getClient().then(function (client) {\n return new Promise(function (resolve, reject) {\n let mongoQuery = {}\n mongoQuery[mapper.idAttribute] = self.toObjectID(mapper, id)\n client.collection(mapper.table || underscore(mapper.name)).findOne(mongoQuery, findOneOpts, function (err, record) {\n return err ? reject(err) : resolve(record)\n })\n })\n }).then(function (record) {\n if (record) {\n self._translateId(record, opts)\n }\n return [record, {}]\n })\n },\n\n /**\n * Retrieve the records that match the selection query.\n *\n * @name MongoDBAdapter#findAll\n * @method\n * @param {Object} mapper The mapper.\n * @param {Object} query Selection query.\n * @param {Object} [opts] Configuration options.\n * @param {Object} [opts.findOpts] Options to pass to collection#find.\n * @param {boolean} [opts.raw=false] Whether to return a more detailed\n * response object.\n * @param {string[]} [opts.with=[]] Relations to eager load.\n * @return {Promise}\n */\n\n /**\n * Retrieve the records that match the selection query. Internal method used\n * by Adapter#findAll.\n *\n * @name MongoDBAdapter#_findAll\n * @method\n * @private\n * @param {Object} mapper The mapper.\n * @param {Object} query Selection query.\n * @param {Object} [opts] Configuration options.\n * @return {Promise}\n */\n _findAll (mapper, query, opts) {\n const self = this\n opts || (opts = {})\n\n const findOpts = self.getOpt('findOpts', opts)\n utils.fillIn(findOpts, self.getQueryOptions(mapper, query))\n findOpts.fields || (findOpts.fields = {})\n const mongoQuery = self.getQuery(mapper, query)\n\n return self.getClient().then(function (client) {\n return new Promise(function (resolve, reject) {\n client.collection(mapper.table || underscore(mapper.name)).find(mongoQuery, findOpts).toArray(function (err, records) {\n return err ? reject(err) : resolve(records)\n })\n })\n }).then(function (records) {\n self._translateId(records, opts)\n return [records, {}]\n })\n },\n\n /**\n * Apply the given update to the record with the specified primary key.\n *\n * @name MongoDBAdapter#update\n * @method\n * @param {Object} mapper The mapper.\n * @param {(string|number)} id The primary key of the record to be updated.\n * @param {Object} props The update to apply to the record.\n * @param {Object} [opts] Configuration options.\n * @param {boolean} [opts.raw=false] Whether to return a more detailed\n * response object.\n * @param {Object} [opts.updateOpts] Options to pass to collection#update.\n * @return {Promise}\n */\n\n /**\n * Apply the given update to the record with the specified primary key.\n * Internal method used by Adapter#update.\n *\n * @name MongoDBAdapter#_update\n * @method\n * @private\n * @param {Object} mapper The mapper.\n * @param {(string|number)} id The primary key of the record to be updated.\n * @param {Object} props The update to apply to the record.\n * @param {Object} [opts] Configuration options.\n * @return {Promise}\n */\n _update (mapper, id, props, opts) {\n const self = this\n props || (props = {})\n opts || (opts = {})\n const updateOpts = self.getOpt('updateOpts', opts)\n\n return self.find(mapper, id, { raw: false }).then(function (record) {\n if (!record) {\n throw new Error('Not Found')\n }\n return self.getClient().then(function (client) {\n return new Promise(function (resolve, reject) {\n const mongoQuery = {}\n mongoQuery[mapper.idAttribute] = self.toObjectID(mapper, id)\n const collection = client.collection(mapper.table || underscore(mapper.name))\n collection[collection.updateOne ? 'updateOne' : 'update'](mongoQuery, { $set: props }, updateOpts, function (err, cursor) {\n return err ? reject(err) : resolve(cursor)\n })\n })\n })\n }).then(function (cursor) {\n return self.find(mapper, id, { raw: false }).then(function (record) {\n cursor.connection = undefined\n return [record, cursor]\n })\n })\n },\n\n /**\n * Apply the given update to all records that match the selection query.\n *\n * @name MongoDBAdapter#updateAll\n * @method\n * @param {Object} mapper The mapper.\n * @param {Object} props The update to apply to the selected records.\n * @param {Object} [query] Selection query.\n * @param {Object} [opts] Configuration options.\n * @param {boolean} [opts.raw=false] Whether to return a more detailed\n * response object.\n * @param {Object} [opts.updateOpts] Options to pass to collection#update.\n * @return {Promise}\n */\n\n /**\n * Apply the given update to all records that match the selection query.\n * Internal method used by Adapter#updateAll.\n *\n * @name MongoDBAdapter#_updateAll\n * @method\n * @private\n * @param {Object} mapper The mapper.\n * @param {Object} props The update to apply to the selected records.\n * @param {Object} [query] Selection query.\n * @param {Object} [opts] Configuration options.\n * @return {Promise}\n */\n _updateAll (mapper, props, query, opts) {\n const self = this\n props || (props = {})\n query || (query = {})\n opts || (opts = {})\n let ids\n const updateOpts = self.getOpt('updateOpts', opts)\n updateOpts.multi = true\n\n return Promise.all([\n self.findAll(mapper, query, { raw: false }),\n self.getClient()\n ]).then(function (results) {\n let [records, client] = results\n const queryOptions = self.getQueryOptions(mapper, query)\n const mongoQuery = self.getQuery(mapper, query)\n\n queryOptions.$set = props\n ids = records.map(function (record) {\n return self.toObjectID(mapper, record[mapper.idAttribute])\n })\n\n return new Promise(function (resolve, reject) {\n const collection = client.collection(mapper.table || underscore(mapper.name))\n collection[collection.updateMany ? 'updateMany' : 'update'](mongoQuery, queryOptions, updateOpts, function (err, cursor) {\n return err ? reject(err) : resolve(cursor)\n })\n })\n }).then(function (cursor) {\n const query = {}\n query[mapper.idAttribute] = {\n 'in': ids\n }\n return self.findAll(mapper, query, { raw: false }).then(function (records) {\n cursor.connection = undefined\n return [records, cursor]\n })\n })\n },\n\n /**\n * Return a Promise that resolves to a reference to the MongoDB client being\n * used by this adapter.\n *\n * Useful when you need to do anything custom with the MongoDB client library.\n *\n * @name MongoDBAdapter#getClient\n * @method\n * @return {Object} MongoDB client.\n */\n getClient () {\n return this.client\n },\n\n /**\n * Map filtering params in a selection query to MongoDB a filtering object.\n *\n * Handles the following:\n *\n * - where\n * - and bunch of filtering operators\n *\n * @name MongoDBAdapter#getQuery\n * @method\n * @return {Object}\n */\n getQuery (mapper, query) {\n query = utils.plainCopy(query || {})\n query.where || (query.where = {})\n\n utils.forOwn(query, function (config, keyword) {\n if (reserved.indexOf(keyword) === -1) {\n if (utils.isObject(config)) {\n query.where[keyword] = config\n } else {\n query.where[keyword] = {\n '==': config\n }\n }\n delete query[keyword]\n }\n })\n\n let mongoQuery = {}\n\n if (Object.keys(query.where).length !== 0) {\n utils.forOwn(query.where, function (criteria, field) {\n if (!utils.isObject(criteria)) {\n query.where[field] = {\n '==': criteria\n }\n }\n utils.forOwn(criteria, function (v, op) {\n if (op === '==' || op === '===' || op === 'contains') {\n mongoQuery[field] = v\n } else if (op === '!=' || op === '!==' || op === 'notContains') {\n mongoQuery[field] = mongoQuery[field] || {}\n mongoQuery[field].$ne = v\n } else if (op === '>') {\n mongoQuery[field] = mongoQuery[field] || {}\n mongoQuery[field].$gt = v\n } else if (op === '>=') {\n mongoQuery[field] = mongoQuery[field] || {}\n mongoQuery[field].$gte = v\n } else if (op === '<') {\n mongoQuery[field] = mongoQuery[field] || {}\n mongoQuery[field].$lt = v\n } else if (op === '<=') {\n mongoQuery[field] = mongoQuery[field] || {}\n mongoQuery[field].$lte = v\n } else if (op === 'in') {\n mongoQuery[field] = mongoQuery[field] || {}\n mongoQuery[field].$in = v\n } else if (op === 'notIn') {\n mongoQuery[field] = mongoQuery[field] || {}\n mongoQuery[field].$nin = v\n } else if (op === '|==' || op === '|===' || op === '|contains') {\n mongoQuery.$or = mongoQuery.$or || []\n let orEqQuery = {}\n orEqQuery[field] = v\n mongoQuery.$or.push(orEqQuery)\n } else if (op === '|!=' || op === '|!==' || op === '|notContains') {\n mongoQuery.$or = mongoQuery.$or || []\n let orNeQuery = {}\n orNeQuery[field] = {\n '$ne': v\n }\n mongoQuery.$or.push(orNeQuery)\n } else if (op === '|>') {\n mongoQuery.$or = mongoQuery.$or || []\n let orGtQuery = {}\n orGtQuery[field] = {\n '$gt': v\n }\n mongoQuery.$or.push(orGtQuery)\n } else if (op === '|>=') {\n mongoQuery.$or = mongoQuery.$or || []\n let orGteQuery = {}\n orGteQuery[field] = {\n '$gte': v\n }\n mongoQuery.$or.push(orGteQuery)\n } else if (op === '|<') {\n mongoQuery.$or = mongoQuery.$or || []\n let orLtQuery = {}\n orLtQuery[field] = {\n '$lt': v\n }\n mongoQuery.$or.push(orLtQuery)\n } else if (op === '|<=') {\n mongoQuery.$or = mongoQuery.$or || []\n let orLteQuery = {}\n orLteQuery[field] = {\n '$lte': v\n }\n mongoQuery.$or.push(orLteQuery)\n } else if (op === '|in') {\n mongoQuery.$or = mongoQuery.$or || []\n let orInQuery = {}\n orInQuery[field] = {\n '$in': v\n }\n mongoQuery.$or.push(orInQuery)\n } else if (op === '|notIn') {\n mongoQuery.$or = mongoQuery.$or || []\n let orNinQuery = {}\n orNinQuery[field] = {\n '$nin': v\n }\n mongoQuery.$or.push(orNinQuery)\n }\n })\n })\n }\n\n return mongoQuery\n },\n\n /**\n * Map non-filtering params in a selection query to MongoDB query options.\n *\n * Handles the following:\n *\n * - limit\n * - skip/offset\n * - orderBy/sort\n *\n * @name MongoDBAdapter#getQueryOptions\n * @method\n * @return {Object}\n */\n getQueryOptions (mapper, query) {\n query = utils.plainCopy(query || {})\n query.orderBy = query.orderBy || query.sort\n query.skip = query.skip || query.offset\n\n let queryOptions = {}\n\n if (query.orderBy) {\n if (utils.isString(query.orderBy)) {\n query.orderBy = [\n [query.orderBy, 'asc']\n ]\n }\n for (var i = 0; i < query.orderBy.length; i++) {\n if (utils.isString(query.orderBy[i])) {\n query.orderBy[i] = [query.orderBy[i], 'asc']\n }\n }\n queryOptions.sort = query.orderBy\n }\n\n if (query.skip) {\n queryOptions.skip = +query.skip\n }\n\n if (query.limit) {\n queryOptions.limit = +query.limit\n }\n\n return queryOptions\n },\n\n /**\n * Turn an _id into an ObjectID if it isn't already an ObjectID.\n *\n * @name MongoDBAdapter#toObjectID\n * @method\n * @return {*}\n */\n toObjectID (mapper, id) {\n if (id !== undefined && mapper.idAttribute === '_id' && typeof id === 'string' && ObjectID.isValid(id) && !(id instanceof ObjectID)) {\n return new ObjectID(id)\n }\n return id\n },\n\n /**\n * Return the foreignKey from the given record for the provided relationship.\n *\n * @name MongoDBAdapter#makeBelongsToForeignKey\n * @method\n * @return {*}\n */\n makeBelongsToForeignKey (mapper, def, record) {\n return this.toObjectID(def.getRelation(), Adapter.prototype.makeBelongsToForeignKey.call(this, mapper, def, record))\n },\n\n /**\n * Return the localKeys from the given record for the provided relationship.\n *\n * Override with care.\n *\n * @name MongoDBAdapter#makeHasManyLocalKeys\n * @method\n * @return {*}\n */\n makeHasManyLocalKeys (mapper, def, record) {\n const self = this\n const relatedMapper = def.getRelation()\n const localKeys = Adapter.prototype.makeHasManyLocalKeys.call(self, mapper, def, record)\n return localKeys.map(function (key) {\n return self.toObjectID(relatedMapper, key)\n })\n },\n\n /**\n * Not supported.\n *\n * @name MongoDBAdapter#updateMany\n * @method\n */\n updateMany () {\n throw new Error('not supported!')\n }\n})\n\nmodule.exports = MongoDBAdapter\n"],"names":["utils","Adapter","reserved","ObjectID"],"mappings":"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"} \ No newline at end of file diff --git a/mocha.start.js b/mocha.start.js index 0d0c8c8..cac2b0f 100644 --- a/mocha.start.js +++ b/mocha.start.js @@ -29,6 +29,8 @@ JSDataAdapterTests.init({ } }, xmethods: [ + // sum not supported yet, I don't quite understand collection#aggregate... + 'sum', 'updateMany' ], features: [ diff --git a/package.json b/package.json index 25d1260..4720ddc 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "js-data-mongodb", "description": "MongoDB adapter for js-data.", - "version": "1.0.0-alpha.5", + "version": "1.0.0-alpha.6", "homepage": "https://github.com/js-data/js-data-mongodb", "repository": { "type": "git", @@ -45,23 +45,23 @@ "ci": "npm run test && cat coverage/lcov.info | coveralls || true" }, "dependencies": { - "js-data-adapter": "0.2.1", + "js-data-adapter": "0.2.4", "mout": "0.12.0" }, "peerDependencies": { "bson": "^0.4.x || ^0.3.x", - "js-data": "^3.0.0-alpha.16", + "js-data": "^3.0.0-alpha.19", "mongodb": ">=1.3.x" }, "devDependencies": { - "babel-core": "6.7.0", - "babel-polyfill": "6.6.1", + "babel-core": "6.7.2", + "babel-polyfill": "6.7.2", "babel-preset-es2015-rollup": "1.1.1", "chai": "3.5.0", "coveralls": "2.11.8", "ink-docstrap": "1.1.4", "istanbul": "0.4.2", - "js-data-adapter-tests": "^2.0.0-alpha.14", + "js-data-adapter-tests": "^2.0.0-alpha.16", "js-data-repo-tools": "0.2.0", "jsdoc": "3.4.0", "mocha": "2.4.5", diff --git a/src/index.js b/src/index.js index a8265cb..33a5bb3 100644 --- a/src/index.js +++ b/src/index.js @@ -7,18 +7,6 @@ import { } from 'js-data-adapter' import underscore from 'mout/string/underscore' -const { - addHiddenPropsToTarget, - classCallCheck, - extend, - fillIn, - forOwn, - isArray, - isObject, - isString, - plainCopy -} = utils - const DEFAULTS = { /** * Convert ObjectIDs to strings when pulling records out of the database. @@ -39,6 +27,7 @@ const DEFAULTS = { uri: 'mongodb://localhost:27017' } +const COUNT_OPTS_DEFAULTS = {} const FIND_OPTS_DEFAULTS = {} const FIND_ONE_OPTS_DEFAULTS = {} const INSERT_OPTS_DEFAULTS = {} @@ -75,6 +64,7 @@ const REMOVE_OPTS_DEFAULTS = {} * @extends Adapter * @param {Object} [opts] Configuration opts. * @param {boolean} [opts.debug=false] Whether to log debugging information. + * @param {Object} [opts.countOpts] Options to pass to collection#count. * @param {Object} [opts.findOpts] Options to pass to collection#find. * @param {Object} [opts.findOneOpts] Options to pass to collection#findOne. * @param {Object} [opts.insertOpts] Options to pass to collection#insert. @@ -90,14 +80,24 @@ const REMOVE_OPTS_DEFAULTS = {} */ function MongoDBAdapter (opts) { const self = this - classCallCheck(self, MongoDBAdapter) + utils.classCallCheck(self, MongoDBAdapter) opts || (opts = {}) - if (isString(opts)) { + if (utils.isString(opts)) { opts = { uri: opts } } - fillIn(opts, DEFAULTS) + utils.fillIn(opts, DEFAULTS) Adapter.call(self, opts) + /** + * Default options to pass to collection#count. + * + * @name MongoDBAdapter#countOpts + * @type {Object} + * @default {} + */ + self.countOpts || (self.countOpts = {}) + utils.fillIn(self.countOpts, COUNT_OPTS_DEFAULTS) + /** * Default options to pass to collection#find. * @@ -106,7 +106,7 @@ function MongoDBAdapter (opts) { * @default {} */ self.findOpts || (self.findOpts = {}) - fillIn(self.findOpts, FIND_OPTS_DEFAULTS) + utils.fillIn(self.findOpts, FIND_OPTS_DEFAULTS) /** * Default options to pass to collection#findOne. @@ -116,7 +116,7 @@ function MongoDBAdapter (opts) { * @default {} */ self.findOneOpts || (self.findOneOpts = {}) - fillIn(self.findOneOpts, FIND_ONE_OPTS_DEFAULTS) + utils.fillIn(self.findOneOpts, FIND_ONE_OPTS_DEFAULTS) /** * Default options to pass to collection#insert. @@ -126,7 +126,7 @@ function MongoDBAdapter (opts) { * @default {} */ self.insertOpts || (self.insertOpts = {}) - fillIn(self.insertOpts, INSERT_OPTS_DEFAULTS) + utils.fillIn(self.insertOpts, INSERT_OPTS_DEFAULTS) /** * Default options to pass to collection#insertMany. @@ -136,7 +136,7 @@ function MongoDBAdapter (opts) { * @default {} */ self.insertManyOpts || (self.insertManyOpts = {}) - fillIn(self.insertManyOpts, INSERT_MANY_OPTS_DEFAULTS) + utils.fillIn(self.insertManyOpts, INSERT_MANY_OPTS_DEFAULTS) /** * Default options to pass to collection#update. @@ -146,7 +146,7 @@ function MongoDBAdapter (opts) { * @default {} */ self.updateOpts || (self.updateOpts = {}) - fillIn(self.updateOpts, UPDATE_OPTS_DEFAULTS) + utils.fillIn(self.updateOpts, UPDATE_OPTS_DEFAULTS) /** * Default options to pass to collection#update. @@ -156,7 +156,7 @@ function MongoDBAdapter (opts) { * @default {} */ self.removeOpts || (self.removeOpts = {}) - fillIn(self.removeOpts, REMOVE_OPTS_DEFAULTS) + utils.fillIn(self.removeOpts, REMOVE_OPTS_DEFAULTS) /** * A Promise that resolves to a reference to the MongoDB client being used by @@ -198,9 +198,9 @@ Object.defineProperty(MongoDBAdapter, '__super__', { * properties to the MongoDBAdapter itself. * @return {Object} MongoDBAdapter of `MongoDBAdapter`. */ -MongoDBAdapter.extend = extend +MongoDBAdapter.extend = utils.extend -addHiddenPropsToTarget(MongoDBAdapter.prototype, { +utils.addHiddenPropsToTarget(MongoDBAdapter.prototype, { /** * Translate ObjectIDs to strings. * @@ -211,12 +211,12 @@ addHiddenPropsToTarget(MongoDBAdapter.prototype, { _translateId (r, opts) { opts || (opts = {}) if (this.getOpt('translateId', opts)) { - if (isArray(r)) { + if (utils.isArray(r)) { r.forEach(function (_r) { const __id = _r._id ? _r._id.toString() : _r._id _r._id = typeof __id === 'string' ? __id : _r._id }) - } else if (isObject(r)) { + } else if (utils.isObject(r)) { const __id = r._id ? r._id.toString() : r._id r._id = typeof __id === 'string' ? __id : r._id } @@ -224,6 +224,50 @@ addHiddenPropsToTarget(MongoDBAdapter.prototype, { return r }, + /** + * Retrieve the number of records that match the selection query. + * + * @name MongoDBAdapter#count + * @method + * @param {Object} mapper The mapper. + * @param {Object} query Selection query. + * @param {Object} [opts] Configuration options. + * @param {Object} [opts.countOpts] Options to pass to collection#count. + * @param {boolean} [opts.raw=false] Whether to return a more detailed + * response object. + * @param {string[]} [opts.with=[]] Relations to eager load. + * @return {Promise} + */ + + /** + * Retrieve the records that match the selection query. Internal method used + * by Adapter#count. + * + * @name MongoDBAdapter#_count + * @method + * @private + * @param {Object} mapper The mapper. + * @param {Object} query Selection query. + * @param {Object} [opts] Configuration options. + * @return {Promise} + */ + _count (mapper, query, opts) { + const self = this + opts || (opts = {}) + + const countOpts = self.getOpt('countOpts', opts) + utils.fillIn(countOpts, self.getQueryOptions(mapper, query)) + const mongoQuery = self.getQuery(mapper, query) + + return self.getClient().then(function (client) { + return new Promise(function (resolve, reject) { + client.collection(mapper.table || underscore(mapper.name)).count(mongoQuery, countOpts, function (err, count) { + return err ? reject(err) : resolve([count, {}]) + }) + }) + }) + }, + /** * Create a new record. * @@ -252,7 +296,7 @@ addHiddenPropsToTarget(MongoDBAdapter.prototype, { const self = this props || (props = {}) opts || (opts = {}) - props = plainCopy(props) + props = utils.plainCopy(props) const insertOpts = self.getOpt('insertOpts', opts) @@ -268,7 +312,7 @@ addHiddenPropsToTarget(MongoDBAdapter.prototype, { let record let r = cursor.ops ? cursor.ops : cursor self._translateId(r, opts) - record = isArray(r) ? r[0] : r + record = utils.isArray(r) ? r[0] : r cursor.connection = undefined return [record, cursor] }) @@ -305,7 +349,7 @@ addHiddenPropsToTarget(MongoDBAdapter.prototype, { const self = this props || (props = {}) opts || (opts = {}) - props = plainCopy(props) + props = utils.plainCopy(props) const insertManyOpts = self.getOpt('insertManyOpts', opts) @@ -408,7 +452,7 @@ addHiddenPropsToTarget(MongoDBAdapter.prototype, { query || (query = {}) opts || (opts = {}) const removeOpts = self.getOpt('removeOpts', opts) - fillIn(removeOpts, self.getQueryOptions(mapper, query)) + utils.fillIn(removeOpts, self.getQueryOptions(mapper, query)) return self.getClient().then(function (client) { const mongoQuery = self.getQuery(mapper, query) @@ -507,7 +551,7 @@ addHiddenPropsToTarget(MongoDBAdapter.prototype, { opts || (opts = {}) const findOpts = self.getOpt('findOpts', opts) - fillIn(findOpts, self.getQueryOptions(mapper, query)) + utils.fillIn(findOpts, self.getQueryOptions(mapper, query)) findOpts.fields || (findOpts.fields = {}) const mongoQuery = self.getQuery(mapper, query) @@ -674,12 +718,12 @@ addHiddenPropsToTarget(MongoDBAdapter.prototype, { * @return {Object} */ getQuery (mapper, query) { - query = plainCopy(query || {}) + query = utils.plainCopy(query || {}) query.where || (query.where = {}) - forOwn(query, function (config, keyword) { + utils.forOwn(query, function (config, keyword) { if (reserved.indexOf(keyword) === -1) { - if (isObject(config)) { + if (utils.isObject(config)) { query.where[keyword] = config } else { query.where[keyword] = { @@ -693,13 +737,13 @@ addHiddenPropsToTarget(MongoDBAdapter.prototype, { let mongoQuery = {} if (Object.keys(query.where).length !== 0) { - forOwn(query.where, function (criteria, field) { - if (!isObject(criteria)) { + utils.forOwn(query.where, function (criteria, field) { + if (!utils.isObject(criteria)) { query.where[field] = { '==': criteria } } - forOwn(criteria, function (v, op) { + utils.forOwn(criteria, function (v, op) { if (op === '==' || op === '===' || op === 'contains') { mongoQuery[field] = v } else if (op === '!=' || op === '!==' || op === 'notContains') { @@ -799,20 +843,20 @@ addHiddenPropsToTarget(MongoDBAdapter.prototype, { * @return {Object} */ getQueryOptions (mapper, query) { - query = plainCopy(query || {}) + query = utils.plainCopy(query || {}) query.orderBy = query.orderBy || query.sort query.skip = query.skip || query.offset let queryOptions = {} if (query.orderBy) { - if (isString(query.orderBy)) { + if (utils.isString(query.orderBy)) { query.orderBy = [ [query.orderBy, 'asc'] ] } for (var i = 0; i < query.orderBy.length; i++) { - if (isString(query.orderBy[i])) { + if (utils.isString(query.orderBy[i])) { query.orderBy[i] = [query.orderBy[i], 'asc'] } } From 9a4ec63ddd08dfb853a0a78db0de62995d023629 Mon Sep 17 00:00:00 2001 From: Jason Dobry Date: Sat, 30 Apr 2016 13:35:12 -0700 Subject: [PATCH 11/36] Prepare for 1.0.0-beta.1 --- .babelrc | 3 - .github/CONTRIBUTING.md | 34 ++++--- .github/ISSUE_TEMPLATE.md | 6 +- .github/PULL_REQUEST_TEMPLATE.md | 2 - .npmignore | 40 -------- CHANGELOG.md | 30 ++++++ README.md | 82 +++------------ conf.json | 7 +- dist/js-data-mongodb.d.ts | 25 +++++ dist/js-data-mongodb.js | 167 ++++++++++++++++--------------- dist/js-data-mongodb.js.map | 2 +- mocha.start.js | 11 +- package.json | 49 ++++----- rollup.config.js | 4 +- scripts/AUTHORS | 7 -- scripts/CONTRIBUTORS | 6 -- scripts/authors.js | 45 --------- scripts/cleanup.js | 25 ----- src/index.js | 148 ++++++++++++++------------- typings.json | 8 ++ 20 files changed, 301 insertions(+), 400 deletions(-) delete mode 100644 .babelrc delete mode 100644 .npmignore create mode 100644 dist/js-data-mongodb.d.ts delete mode 100644 scripts/AUTHORS delete mode 100644 scripts/CONTRIBUTORS delete mode 100644 scripts/authors.js delete mode 100644 scripts/cleanup.js create mode 100644 typings.json diff --git a/.babelrc b/.babelrc deleted file mode 100644 index 1d9cdd5..0000000 --- a/.babelrc +++ /dev/null @@ -1,3 +0,0 @@ -{ - "presets": ["es2015-rollup"] -} diff --git a/.github/CONTRIBUTING.md b/.github/CONTRIBUTING.md index ad84ef7..2e8d87f 100644 --- a/.github/CONTRIBUTING.md +++ b/.github/CONTRIBUTING.md @@ -1,27 +1,37 @@ -# Contributing +# Contributing to js-data-mongodb -[Read the Contributing Guide](http://js-data.io/docs/contributing). +[Read the general Contributing Guide](http://js-data.io/docs/contributing). -## Support +## Project structure -[Find out how to Get Support](http://js-data.io/docs/support). +* `dist/` - Contains final build files for distribution +* `doc/` - Output folder for JSDocs +* `src/` - Project source code +* `test/` - Project tests -## Community +## Clone, build & test -[Explore the Community](http://js-data.io/docs/community). +1. `clone git@github.com:js-data/js-data-mongodb.git` +1. `cd js-data-mongodb` +1. `npm install` +1. `npm run build` - Lint and build distribution files +1. `npm run mocha` - Run tests (RethinkDB must be running) -### Have write access? - -To cut a release: +## To cut a release 1. Checkout master 1. Bump version in `package.json` appropriately -1. Run `npm run release` 1. Update `CHANGELOG.md` appropriately -1. Commit and push changes, including the `dist/` folder +1. Run `npm run release` +1. Commit and push changes +1. Checkout `release`, merge `master` into `release` +1. Run `npm run release` again +1. Commit and push changes 1. Make a GitHub release + - tag from `release` branch - set tag name to version - set release name to version - set release body to changelog entry for the version - - attach the files in the `dist/` folder 1. `npm publish .` + +See also [Community & Support](http://js-data.io/docs/community). diff --git a/.github/ISSUE_TEMPLATE.md b/.github/ISSUE_TEMPLATE.md index 2ce62e8..b66d610 100644 --- a/.github/ISSUE_TEMPLATE.md +++ b/.github/ISSUE_TEMPLATE.md @@ -1,7 +1,5 @@ -(delete this line) GitHub Issues are NOT for support questions. -(delete this line) GitHub Issues ARE for bug reports, feature requests, and other issues. -(delete this line) Find out how to Get Support here: http://js-data.io/docs/support. +(delete this line) Find out how to get help here: http://js-data.io/docs/community. - + Thanks! diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md index 4c14bdc..4a12cfd 100644 --- a/.github/PULL_REQUEST_TEMPLATE.md +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -1,8 +1,6 @@ Fixes # (it's a good idea to open an issue first for discussion) - [ ] - `npm test` succeeds -- [ ] - Pull request has been squashed into 1 commit -- [ ] - I did NOT commit changes to `dist/` - [ ] - Code coverage does not decrease (if any source code was changed) - [ ] - Appropriate JSDoc comments were updated in source code (if applicable) - [ ] - Approprate changes to js-data.io docs have been suggested ("Suggest Edits" button) diff --git a/.npmignore b/.npmignore deleted file mode 100644 index 4f853e9..0000000 --- a/.npmignore +++ /dev/null @@ -1,40 +0,0 @@ -# Logs -logs -*.log - -# Runtime data -pids -*.pid -*.seed - -# Directory for instrumented libs generated by jscoverage/JSCover -lib-cov - -# Coverage directory used by tools like istanbul -coverage - -# Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files) -.grunt - -# Compiled binary addons (http://nodejs.org/api/addons.html) -build/Release - -# Dependency directory -# Commenting this out is preferred by some people, see -# https://www.npmjs.org/doc/misc/npm-faq.html#should-i-check-my-node_modules-folder-into-git- -node_modules - -# Users Environment Variables -.lock-wscript - -.idea/ -*.iml - -data/ -doc/ -test/ -.babelrc -mocha.start.js -rollup.config.js -circle.yml -conf.json diff --git a/CHANGELOG.md b/CHANGELOG.md index 50fc565..8df9165 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,33 @@ +##### 1.0.0-beta.1 - 30 April 2016 + +###### Breaking changes +- How you must now import in ES2015: + + ```js + import MongoDBAdapter from 'js-data-mongodb' + const adapter = new MongoDBAdapter() + ``` + or + ```js + import {MongoDBAdapter, version} from 'js-data-mongodb' + console.log(version) + const adapter = new MongoDBAdapter() + ``` + +- How you must now import in ES5: + + ```js + var JSDataMongoDB = require('js-data-mongodb') + var MongoDBAdapter = JSDataMongoDB.MongoDBAdapter + var adapter = new MongoDBAdapter() + ``` + +- Moved some `dist` files to the `release` branch to reduce noise + +###### Other +- Upgraded to `js-data-adapter` v0.6.1 +- Now using js-data JSDoc template + ##### 1.0.0-alpha.6 - 17 March 2016 ###### Backwards compatible API changes diff --git a/README.md b/README.md index 2380762..2a4408f 100644 --- a/README.md +++ b/README.md @@ -7,74 +7,20 @@ [![Circle CI][circle_b]][circle_l] [![npm downloads][dn_b]][dn_l] [![Coverage Status][cov_b]][cov_l] -[![Codacy][cod_b]][cod_l] MongoDB adapter for [js-data](http://www.js-data.io/). -## Table of contents +To get started, visit __[http://js-data.io](http://www.js-data.io/docs/js-data-mongodb)__. -* [Quick start](#quick-start) -* [Guides and Tutorials](#guides-and-tutorials) -* [API Reference Docs](#api-reference-docs) -* [Community](#community) -* [Support](#support) -* [Contributing](#contributing) -* [License](#license) +## Links -## Quick Start -`npm install --save js-data js-data-mongodb mongodb bson`. - -```js -// Use Container instead of DataStore on the server -import {Container} from 'js-data' -import MongoDBAdapter from 'js-data-mongodb' - -// Create a store to hold your Mappers -const store = new Container({ - mapperDefaults: { - // MongoDB uses "_id" as the primary key - idAttribute: '_id' - } -}) - -// Create an instance of MongoDBAdapter with default settings -const adapter = new MongoDBAdapter() - -// Mappers in "store" will use the MongoDB adapter by default -store.registerAdapter('mongodb', adapter, { default: true }) - -// Create a Mapper that maps to a "user" collection -store.defineMapper('user') -``` - -```js -async function findAllAdminUsers () { - // Find all users where "user.role" == "admin" - return await store.findAll('user', { - role: 'admin' - }) -} -``` - -## Guides and Tutorials - -[Get started at http://js-data.io](http://js-data.io) - -## API Reference Docs - -[Visit http://api.js-data.io](http://api.js-data.io). - -## Community - -[Explore the Community](http://js-data.io/docs/community). - -## Support - -[Find out how to Get Support](http://js-data.io/docs/support). - -## Contributing - -[Read the Contributing Guide](http://js-data.io/docs/contributing). +* [Quick start](http://www.js-data.io/docs/home#quick-start) - Get started in 5 minutes +* [Guides and Tutorials](http://www.js-data.io/docs/home) - Learn how to use JSData +* [`MongoDBAdapter` Guide](http://www.js-data.io/docs/js-data-mongodb) - Learn how to use `MongoDBAdapter` +* [API Reference Docs](http://api.js-data.io) - Explore components, methods, options, etc. +* [Community & Support](http://js-data.io/docs/community) - Find solutions and chat with the community +* [General Contributing Guide](http://js-data.io/docs/contributing) - Give back and move the project forward + * [Contributing to js-data-mongodb](https://github.com/js-data/js-data-mongodb/blob/master/.github/CONTRIBUTING.md) ## License @@ -90,11 +36,9 @@ Copyright (c) 2014-2016 js-data-mongodb project authors [sl_l]: http://slack.js-data.io [npm_b]: https://img.shields.io/npm/v/js-data-mongodb.svg?style=flat [npm_l]: https://www.npmjs.org/package/js-data-mongodb -[circle_b]: https://img.shields.io/circleci/project/js-data/js-data-mongodb/master.svg?style=flat -[circle_l]: https://circleci.com/gh/js-data/js-data-mongodb/tree/master +[circle_b]: https://img.shields.io/circleci/project/js-data/js-data-mongodb.svg?style=flat +[circle_l]: https://circleci.com/gh/js-data/js-data-mongodb [dn_b]: https://img.shields.io/npm/dm/js-data-mongodb.svg?style=flat [dn_l]: https://www.npmjs.org/package/js-data-mongodb -[cov_b]: https://img.shields.io/coveralls/js-data/js-data-mongodb/master.svg?style=flat -[cov_l]: https://coveralls.io/github/js-data/js-data-mongodb?branch=master -[cod_b]: https://img.shields.io/codacy/1f45ede49dfb4bdea68f46ca55631968.svg -[cod_l]: https://www.codacy.com/app/jasondobry/js-data-mongodb/dashboard +[cov_b]: https://img.shields.io/codecov/c/github/js-data/js-data-mongodb.svg?style=flat +[cov_l]: https://codecov.io/github/js-data/js-data-mongodb diff --git a/conf.json b/conf.json index cc14cd6..a3bce71 100644 --- a/conf.json +++ b/conf.json @@ -12,16 +12,15 @@ "package": "./package.json" }, "templates": { - "theme": "lumen", + "theme": "jsdata", "systemName": "js-data-mongodb", "copyright": "js-data-mongodb Copyright © 2014-2016 js-data-mongodb project authors", "outputSourceFiles": true, - "syntaxTheme": "dark", "linenums": true, - "footer": "
Back to js-data.io
", + "footer": "", "analytics": { "ua": "UA-55528236-2", "domain": "api.js-data.io" } } -} +} \ No newline at end of file diff --git a/dist/js-data-mongodb.d.ts b/dist/js-data-mongodb.d.ts new file mode 100644 index 0000000..9f08447 --- /dev/null +++ b/dist/js-data-mongodb.d.ts @@ -0,0 +1,25 @@ +import {Adapter} from 'js-data-adapter' + +interface IDict { + [key: string]: any; +} +interface IBaseAdapter extends IDict { + debug?: boolean, + raw?: boolean +} +interface IBaseMongoDBAdapter extends IBaseAdapter { + translateId?: boolean + uri?: string +} +export class MongoDBAdapter extends Adapter { + static extend(instanceProps?: IDict, classProps?: IDict): typeof MongoDBAdapter + constructor(opts?: IBaseMongoDBAdapter) +} +export interface version { + full: string + minor: string + major: string + patch: string + alpha: string | boolean + beta: string | boolean +} \ No newline at end of file diff --git a/dist/js-data-mongodb.js b/dist/js-data-mongodb.js index af81760..29212b0 100644 --- a/dist/js-data-mongodb.js +++ b/dist/js-data-mongodb.js @@ -5,8 +5,7 @@ function _interopDefault (ex) { return (ex && (typeof ex === 'object') && 'defau var mongodb = require('mongodb'); var bson = require('bson'); var jsData = require('js-data'); -var Adapter = require('js-data-adapter'); -var Adapter__default = _interopDefault(Adapter); +var jsDataAdapter = require('js-data-adapter'); var underscore = _interopDefault(require('mout/string/underscore')); var babelHelpers = {}; @@ -106,21 +105,18 @@ var REMOVE_OPTS_DEFAULTS = {}; * * @class MongoDBAdapter * @extends Adapter - * @param {Object} [opts] Configuration opts. - * @param {boolean} [opts.debug=false] Whether to log debugging information. - * @param {Object} [opts.countOpts] Options to pass to collection#count. - * @param {Object} [opts.findOpts] Options to pass to collection#find. - * @param {Object} [opts.findOneOpts] Options to pass to collection#findOne. - * @param {Object} [opts.insertOpts] Options to pass to collection#insert. - * @param {Object} [opts.insertManyOpts] Options to pass to - * collection#insertMany. - * @param {boolean} [opts.raw=false] Whether to return detailed result objects - * instead of just record data. - * @param {Object} [opts.removeOpts] Options to pass to collection#remove. - * @param {boolean} [opts.translateId=true] Convert ObjectIDs to strings when - * pulling records out of the database. - * @param {Object} [opts.updateOpts] Options to pass to collection#update. - * @param {string} [opts.uri="mongodb://localhost:27017"] MongoDB URI. + * @param {Object} [opts] Configuration options. + * @param {boolean} [opts.debug=false] See {@link Adapter#debug}. + * @param {Object} [opts.countOpts] See {@link MongoDBAdapter#countOpts}. + * @param {Object} [opts.findOpts] See {@link MongoDBAdapter#findOpts}. + * @param {Object} [opts.findOneOpts] See {@link MongoDBAdapter#findOneOpts}. + * @param {Object} [opts.insertOpts] See {@link MongoDBAdapter#insertOpts}. + * @param {Object} [opts.insertManyOpts] See {@link MongoDBAdapter#insertManyOpts}. + * @param {boolean} [opts.raw=false] See {@link Adapter#raw}. + * @param {Object} [opts.removeOpts] See {@link MongoDBAdapter#removeOpts}. + * @param {boolean} [opts.translateId=true] See {@link MongoDBAdapter#translateId}. + * @param {Object} [opts.updateOpts] See {@link MongoDBAdapter#updateOpts}. + * @param {string} [opts.uri="mongodb://localhost:27017"] See {@link MongoDBAdapter#uri}. */ function MongoDBAdapter(opts) { var self = this; @@ -130,7 +126,7 @@ function MongoDBAdapter(opts) { opts = { uri: opts }; } jsData.utils.fillIn(opts, DEFAULTS); - Adapter__default.call(self, opts); + jsDataAdapter.Adapter.call(self, opts); /** * Default options to pass to collection#count. @@ -217,7 +213,7 @@ function MongoDBAdapter(opts) { } // Setup prototype inheritance from Adapter -MongoDBAdapter.prototype = Object.create(Adapter__default.prototype, { +MongoDBAdapter.prototype = Object.create(jsDataAdapter.Adapter.prototype, { constructor: { value: MongoDBAdapter, enumerable: false, @@ -228,19 +224,30 @@ MongoDBAdapter.prototype = Object.create(Adapter__default.prototype, { Object.defineProperty(MongoDBAdapter, '__super__', { configurable: true, - value: Adapter__default + value: jsDataAdapter.Adapter }); /** * Alternative to ES6 class syntax for extending `MongoDBAdapter`. * - * @name MongoDBAdapter.extend - * @method + * @example Using the ES2015 class syntax. + * class MyMongoDBAdapter extends MongoDBAdapter {...} + * const adapter = new MyMongoDBAdapter() + * + * @example Using {@link MongoDBAdapter.extend}. + * var instanceProps = {...} + * var classProps = {...} + * + * var MyMongoDBAdapter = MongoDBAdapter.extend(instanceProps, classProps) + * var adapter = new MyMongoDBAdapter() + * + * @method MongoDBAdapter.extend + * @static * @param {Object} [instanceProps] Properties that will be added to the - * prototype of the MongoDBAdapter. + * prototype of the subclass. * @param {Object} [classProps] Properties that will be added as static - * properties to the MongoDBAdapter itself. - * @return {Object} MongoDBAdapter of `MongoDBAdapter`. + * properties to the subclass itself. + * @return {Object} Subclass of `MongoDBAdapter`. */ MongoDBAdapter.extend = jsData.utils.extend; @@ -248,8 +255,7 @@ jsData.utils.addHiddenPropsToTarget(MongoDBAdapter.prototype, { /** * Translate ObjectIDs to strings. * - * @name MongoDBAdapter#_translateId - * @method + * @method MongoDBAdapter#_translateId * @return {*} */ @@ -273,8 +279,7 @@ jsData.utils.addHiddenPropsToTarget(MongoDBAdapter.prototype, { /** * Retrieve the number of records that match the selection query. * - * @name MongoDBAdapter#count - * @method + * @method MongoDBAdapter#count * @param {Object} mapper The mapper. * @param {Object} query Selection query. * @param {Object} [opts] Configuration options. @@ -289,8 +294,7 @@ jsData.utils.addHiddenPropsToTarget(MongoDBAdapter.prototype, { * Retrieve the records that match the selection query. Internal method used * by Adapter#count. * - * @name MongoDBAdapter#_count - * @method + * @method MongoDBAdapter#_count * @private * @param {Object} mapper The mapper. * @param {Object} query Selection query. @@ -318,8 +322,7 @@ jsData.utils.addHiddenPropsToTarget(MongoDBAdapter.prototype, { /** * Create a new record. * - * @name MongoDBAdapter#create - * @method + * @method MongoDBAdapter#create * @param {Object} mapper The mapper. * @param {Object} props The record to be created. * @param {Object} [opts] Configuration options. @@ -331,8 +334,7 @@ jsData.utils.addHiddenPropsToTarget(MongoDBAdapter.prototype, { /** * Create a new record. Internal method used by Adapter#create. * - * @name MongoDBAdapter#_create - * @method + * @method MongoDBAdapter#_create * @private * @param {Object} mapper The mapper. * @param {Object} props The record to be created. @@ -369,8 +371,7 @@ jsData.utils.addHiddenPropsToTarget(MongoDBAdapter.prototype, { /** * Create multiple records in a single batch. * - * @name MongoDBAdapter#createMany - * @method + * @method MongoDBAdapter#createMany * @param {Object} mapper The mapper. * @param {Object} props The records to be created. * @param {Object} [opts] Configuration options. @@ -385,8 +386,7 @@ jsData.utils.addHiddenPropsToTarget(MongoDBAdapter.prototype, { * Create multiple records in a single batch. Internal method used by * Adapter#createMany. * - * @name MongoDBAdapter#_createMany - * @method + * @method MongoDBAdapter#_createMany * @private * @param {Object} mapper The mapper. * @param {Object} props The records to be created. @@ -422,8 +422,7 @@ jsData.utils.addHiddenPropsToTarget(MongoDBAdapter.prototype, { /** * Destroy the record with the given primary key. * - * @name MongoDBAdapter#destroy - * @method + * @method MongoDBAdapter#destroy * @param {Object} mapper The mapper. * @param {(string|number)} id Primary key of the record to destroy. * @param {Object} [opts] Configuration options. @@ -437,8 +436,7 @@ jsData.utils.addHiddenPropsToTarget(MongoDBAdapter.prototype, { * Destroy the record with the given primary key. Internal method used by * Adapter#destroy. * - * @name MongoDBAdapter#_destroy - * @method + * @method MongoDBAdapter#_destroy * @private * @param {Object} mapper The mapper. * @param {(string|number)} id Primary key of the record to destroy. @@ -468,8 +466,7 @@ jsData.utils.addHiddenPropsToTarget(MongoDBAdapter.prototype, { /** * Destroy the records that match the selection query. * - * @name MongoDBAdapter#destroyAll - * @method + * @method MongoDBAdapter#destroyAll * @param {Object} mapper the mapper. * @param {Object} [query] Selection query. * @param {Object} [query.where] Filtering criteria. @@ -489,8 +486,7 @@ jsData.utils.addHiddenPropsToTarget(MongoDBAdapter.prototype, { * Destroy the records that match the selection query. Internal method used by * Adapter#destroyAll. * - * @name MongoDBAdapter#_destroyAll - * @method + * @method MongoDBAdapter#_destroyAll * @private * @param {Object} mapper the mapper. * @param {Object} [query] Selection query. @@ -522,8 +518,7 @@ jsData.utils.addHiddenPropsToTarget(MongoDBAdapter.prototype, { /** * Retrieve the record with the given primary key. * - * @name MongoDBAdapter#find - * @method + * @method MongoDBAdapter#find * @param {Object} mapper The mapper. * @param {(string|number)} id Primary key of the record to retrieve. * @param {Object} [opts] Configuration options. @@ -538,8 +533,7 @@ jsData.utils.addHiddenPropsToTarget(MongoDBAdapter.prototype, { * Retrieve the record with the given primary key. Internal method used by * Adapter#find. * - * @name MongoDBAdapter#_find - * @method + * @method MongoDBAdapter#_find * @private * @param {Object} mapper The mapper. * @param {(string|number)} id Primary key of the record to retrieve. @@ -574,8 +568,7 @@ jsData.utils.addHiddenPropsToTarget(MongoDBAdapter.prototype, { /** * Retrieve the records that match the selection query. * - * @name MongoDBAdapter#findAll - * @method + * @method MongoDBAdapter#findAll * @param {Object} mapper The mapper. * @param {Object} query Selection query. * @param {Object} [opts] Configuration options. @@ -590,8 +583,7 @@ jsData.utils.addHiddenPropsToTarget(MongoDBAdapter.prototype, { * Retrieve the records that match the selection query. Internal method used * by Adapter#findAll. * - * @name MongoDBAdapter#_findAll - * @method + * @method MongoDBAdapter#_findAll * @private * @param {Object} mapper The mapper. * @param {Object} query Selection query. @@ -623,8 +615,7 @@ jsData.utils.addHiddenPropsToTarget(MongoDBAdapter.prototype, { /** * Apply the given update to the record with the specified primary key. * - * @name MongoDBAdapter#update - * @method + * @method MongoDBAdapter#update * @param {Object} mapper The mapper. * @param {(string|number)} id The primary key of the record to be updated. * @param {Object} props The update to apply to the record. @@ -639,8 +630,7 @@ jsData.utils.addHiddenPropsToTarget(MongoDBAdapter.prototype, { * Apply the given update to the record with the specified primary key. * Internal method used by Adapter#update. * - * @name MongoDBAdapter#_update - * @method + * @method MongoDBAdapter#_update * @private * @param {Object} mapper The mapper. * @param {(string|number)} id The primary key of the record to be updated. @@ -680,8 +670,7 @@ jsData.utils.addHiddenPropsToTarget(MongoDBAdapter.prototype, { /** * Apply the given update to all records that match the selection query. * - * @name MongoDBAdapter#updateAll - * @method + * @method MongoDBAdapter#updateAll * @param {Object} mapper The mapper. * @param {Object} props The update to apply to the selected records. * @param {Object} [query] Selection query. @@ -696,8 +685,7 @@ jsData.utils.addHiddenPropsToTarget(MongoDBAdapter.prototype, { * Apply the given update to all records that match the selection query. * Internal method used by Adapter#updateAll. * - * @name MongoDBAdapter#_updateAll - * @method + * @method MongoDBAdapter#_updateAll * @private * @param {Object} mapper The mapper. * @param {Object} props The update to apply to the selected records. @@ -753,8 +741,7 @@ jsData.utils.addHiddenPropsToTarget(MongoDBAdapter.prototype, { * * Useful when you need to do anything custom with the MongoDB client library. * - * @name MongoDBAdapter#getClient - * @method + * @method MongoDBAdapter#getClient * @return {Object} MongoDB client. */ getClient: function getClient() { @@ -770,8 +757,7 @@ jsData.utils.addHiddenPropsToTarget(MongoDBAdapter.prototype, { * - where * - and bunch of filtering operators * - * @name MongoDBAdapter#getQuery - * @method + * @method MongoDBAdapter#getQuery * @return {Object} */ getQuery: function getQuery(mapper, query) { @@ -779,7 +765,7 @@ jsData.utils.addHiddenPropsToTarget(MongoDBAdapter.prototype, { query.where || (query.where = {}); jsData.utils.forOwn(query, function (config, keyword) { - if (Adapter.reserved.indexOf(keyword) === -1) { + if (jsDataAdapter.reserved.indexOf(keyword) === -1) { if (jsData.utils.isObject(config)) { query.where[keyword] = config; } else { @@ -896,8 +882,7 @@ jsData.utils.addHiddenPropsToTarget(MongoDBAdapter.prototype, { * - skip/offset * - orderBy/sort * - * @name MongoDBAdapter#getQueryOptions - * @method + * @method MongoDBAdapter#getQueryOptions * @return {Object} */ getQueryOptions: function getQueryOptions(mapper, query) { @@ -934,8 +919,7 @@ jsData.utils.addHiddenPropsToTarget(MongoDBAdapter.prototype, { /** * Turn an _id into an ObjectID if it isn't already an ObjectID. * - * @name MongoDBAdapter#toObjectID - * @method + * @method MongoDBAdapter#toObjectID * @return {*} */ toObjectID: function toObjectID(mapper, id) { @@ -949,12 +933,11 @@ jsData.utils.addHiddenPropsToTarget(MongoDBAdapter.prototype, { /** * Return the foreignKey from the given record for the provided relationship. * - * @name MongoDBAdapter#makeBelongsToForeignKey - * @method + * @method MongoDBAdapter#makeBelongsToForeignKey * @return {*} */ makeBelongsToForeignKey: function makeBelongsToForeignKey(mapper, def, record) { - return this.toObjectID(def.getRelation(), Adapter__default.prototype.makeBelongsToForeignKey.call(this, mapper, def, record)); + return this.toObjectID(def.getRelation(), jsDataAdapter.Adapter.prototype.makeBelongsToForeignKey.call(this, mapper, def, record)); }, @@ -963,14 +946,13 @@ jsData.utils.addHiddenPropsToTarget(MongoDBAdapter.prototype, { * * Override with care. * - * @name MongoDBAdapter#makeHasManyLocalKeys - * @method + * @method MongoDBAdapter#makeHasManyLocalKeys * @return {*} */ makeHasManyLocalKeys: function makeHasManyLocalKeys(mapper, def, record) { var self = this; var relatedMapper = def.getRelation(); - var localKeys = Adapter__default.prototype.makeHasManyLocalKeys.call(self, mapper, def, record); + var localKeys = jsDataAdapter.Adapter.prototype.makeHasManyLocalKeys.call(self, mapper, def, record); return localKeys.map(function (key) { return self.toObjectID(relatedMapper, key); }); @@ -980,13 +962,36 @@ jsData.utils.addHiddenPropsToTarget(MongoDBAdapter.prototype, { /** * Not supported. * - * @name MongoDBAdapter#updateMany - * @method + * @method MongoDBAdapter#updateMany */ updateMany: function updateMany() { throw new Error('not supported!'); } }); -module.exports = MongoDBAdapter; +/** + * Details of the current version of the `js-data-mongodb` module. + * + * @name module:js-data-mongodb.version + * @type {Object} + * @property {string} version.full The full semver value. + * @property {number} version.major The major version number. + * @property {number} version.minor The minor version number. + * @property {number} version.patch The patch version number. + * @property {(string|boolean)} version.alpha The alpha version value, + * otherwise `false` if the current version is not alpha. + * @property {(string|boolean)} version.beta The beta version value, + * otherwise `false` if the current version is not beta. + */ +var version = { + beta: 1, + full: '1.0.0-beta.1', + major: 1, + minor: 0, + patch: 0 +}; + +exports.MongoDBAdapter = MongoDBAdapter; +exports.version = version; +exports['default'] = MongoDBAdapter; //# sourceMappingURL=js-data-mongodb.js.map \ No newline at end of file diff --git a/dist/js-data-mongodb.js.map b/dist/js-data-mongodb.js.map index 067f07d..ad73269 100644 --- a/dist/js-data-mongodb.js.map +++ b/dist/js-data-mongodb.js.map @@ -1 +1 @@ -{"version":3,"file":"js-data-mongodb.js","sources":["../src/index.js"],"sourcesContent":["import {MongoClient} from 'mongodb'\nimport {ObjectID} from 'bson'\nimport {utils} from 'js-data'\nimport Adapter from 'js-data-adapter'\nimport {\n reserved\n} from 'js-data-adapter'\nimport underscore from 'mout/string/underscore'\n\nconst DEFAULTS = {\n /**\n * Convert ObjectIDs to strings when pulling records out of the database.\n *\n * @name MongoDBAdapter#translateId\n * @type {boolean}\n * @default true\n */\n translateId: true,\n\n /**\n * MongoDB URI.\n *\n * @name MongoDBAdapter#uri\n * @type {string}\n * @default mongodb://localhost:27017\n */\n uri: 'mongodb://localhost:27017'\n}\n\nconst COUNT_OPTS_DEFAULTS = {}\nconst FIND_OPTS_DEFAULTS = {}\nconst FIND_ONE_OPTS_DEFAULTS = {}\nconst INSERT_OPTS_DEFAULTS = {}\nconst INSERT_MANY_OPTS_DEFAULTS = {}\nconst UPDATE_OPTS_DEFAULTS = {}\nconst REMOVE_OPTS_DEFAULTS = {}\n\n/**\n * MongoDBAdapter class.\n *\n * @example\n * // Use Container instead of DataStore on the server\n * import {Container} from 'js-data'\n * import MongoDBAdapter from 'js-data-mongodb'\n *\n * // Create a store to hold your Mappers\n * const store = new Container({\n * mapperDefaults: {\n * // MongoDB uses \"_id\" as the primary key\n * idAttribute: '_id'\n * }\n * })\n *\n * // Create an instance of MongoDBAdapter with default settings\n * const adapter = new MongoDBAdapter()\n *\n * // Mappers in \"store\" will use the MongoDB adapter by default\n * store.registerAdapter('mongodb', adapter, { default: true })\n *\n * // Create a Mapper that maps to a \"user\" collection\n * store.defineMapper('user')\n *\n * @class MongoDBAdapter\n * @extends Adapter\n * @param {Object} [opts] Configuration opts.\n * @param {boolean} [opts.debug=false] Whether to log debugging information.\n * @param {Object} [opts.countOpts] Options to pass to collection#count.\n * @param {Object} [opts.findOpts] Options to pass to collection#find.\n * @param {Object} [opts.findOneOpts] Options to pass to collection#findOne.\n * @param {Object} [opts.insertOpts] Options to pass to collection#insert.\n * @param {Object} [opts.insertManyOpts] Options to pass to\n * collection#insertMany.\n * @param {boolean} [opts.raw=false] Whether to return detailed result objects\n * instead of just record data.\n * @param {Object} [opts.removeOpts] Options to pass to collection#remove.\n * @param {boolean} [opts.translateId=true] Convert ObjectIDs to strings when\n * pulling records out of the database.\n * @param {Object} [opts.updateOpts] Options to pass to collection#update.\n * @param {string} [opts.uri=\"mongodb://localhost:27017\"] MongoDB URI.\n */\nfunction MongoDBAdapter (opts) {\n const self = this\n utils.classCallCheck(self, MongoDBAdapter)\n opts || (opts = {})\n if (utils.isString(opts)) {\n opts = { uri: opts }\n }\n utils.fillIn(opts, DEFAULTS)\n Adapter.call(self, opts)\n\n /**\n * Default options to pass to collection#count.\n *\n * @name MongoDBAdapter#countOpts\n * @type {Object}\n * @default {}\n */\n self.countOpts || (self.countOpts = {})\n utils.fillIn(self.countOpts, COUNT_OPTS_DEFAULTS)\n\n /**\n * Default options to pass to collection#find.\n *\n * @name MongoDBAdapter#findOpts\n * @type {Object}\n * @default {}\n */\n self.findOpts || (self.findOpts = {})\n utils.fillIn(self.findOpts, FIND_OPTS_DEFAULTS)\n\n /**\n * Default options to pass to collection#findOne.\n *\n * @name MongoDBAdapter#findOneOpts\n * @type {Object}\n * @default {}\n */\n self.findOneOpts || (self.findOneOpts = {})\n utils.fillIn(self.findOneOpts, FIND_ONE_OPTS_DEFAULTS)\n\n /**\n * Default options to pass to collection#insert.\n *\n * @name MongoDBAdapter#insertOpts\n * @type {Object}\n * @default {}\n */\n self.insertOpts || (self.insertOpts = {})\n utils.fillIn(self.insertOpts, INSERT_OPTS_DEFAULTS)\n\n /**\n * Default options to pass to collection#insertMany.\n *\n * @name MongoDBAdapter#insertManyOpts\n * @type {Object}\n * @default {}\n */\n self.insertManyOpts || (self.insertManyOpts = {})\n utils.fillIn(self.insertManyOpts, INSERT_MANY_OPTS_DEFAULTS)\n\n /**\n * Default options to pass to collection#update.\n *\n * @name MongoDBAdapter#updateOpts\n * @type {Object}\n * @default {}\n */\n self.updateOpts || (self.updateOpts = {})\n utils.fillIn(self.updateOpts, UPDATE_OPTS_DEFAULTS)\n\n /**\n * Default options to pass to collection#update.\n *\n * @name MongoDBAdapter#removeOpts\n * @type {Object}\n * @default {}\n */\n self.removeOpts || (self.removeOpts = {})\n utils.fillIn(self.removeOpts, REMOVE_OPTS_DEFAULTS)\n\n /**\n * A Promise that resolves to a reference to the MongoDB client being used by\n * this adapter.\n *\n * @name MongoDBAdapter#client\n * @type {Object}\n */\n self.client = new Promise(function (resolve, reject) {\n MongoClient.connect(opts.uri, function (err, db) {\n return err ? reject(err) : resolve(db)\n })\n })\n}\n\n// Setup prototype inheritance from Adapter\nMongoDBAdapter.prototype = Object.create(Adapter.prototype, {\n constructor: {\n value: MongoDBAdapter,\n enumerable: false,\n writable: true,\n configurable: true\n }\n})\n\nObject.defineProperty(MongoDBAdapter, '__super__', {\n configurable: true,\n value: Adapter\n})\n\n/**\n * Alternative to ES6 class syntax for extending `MongoDBAdapter`.\n *\n * @name MongoDBAdapter.extend\n * @method\n * @param {Object} [instanceProps] Properties that will be added to the\n * prototype of the MongoDBAdapter.\n * @param {Object} [classProps] Properties that will be added as static\n * properties to the MongoDBAdapter itself.\n * @return {Object} MongoDBAdapter of `MongoDBAdapter`.\n */\nMongoDBAdapter.extend = utils.extend\n\nutils.addHiddenPropsToTarget(MongoDBAdapter.prototype, {\n /**\n * Translate ObjectIDs to strings.\n *\n * @name MongoDBAdapter#_translateId\n * @method\n * @return {*}\n */\n _translateId (r, opts) {\n opts || (opts = {})\n if (this.getOpt('translateId', opts)) {\n if (utils.isArray(r)) {\n r.forEach(function (_r) {\n const __id = _r._id ? _r._id.toString() : _r._id\n _r._id = typeof __id === 'string' ? __id : _r._id\n })\n } else if (utils.isObject(r)) {\n const __id = r._id ? r._id.toString() : r._id\n r._id = typeof __id === 'string' ? __id : r._id\n }\n }\n return r\n },\n\n /**\n * Retrieve the number of records that match the selection query.\n *\n * @name MongoDBAdapter#count\n * @method\n * @param {Object} mapper The mapper.\n * @param {Object} query Selection query.\n * @param {Object} [opts] Configuration options.\n * @param {Object} [opts.countOpts] Options to pass to collection#count.\n * @param {boolean} [opts.raw=false] Whether to return a more detailed\n * response object.\n * @param {string[]} [opts.with=[]] Relations to eager load.\n * @return {Promise}\n */\n\n /**\n * Retrieve the records that match the selection query. Internal method used\n * by Adapter#count.\n *\n * @name MongoDBAdapter#_count\n * @method\n * @private\n * @param {Object} mapper The mapper.\n * @param {Object} query Selection query.\n * @param {Object} [opts] Configuration options.\n * @return {Promise}\n */\n _count (mapper, query, opts) {\n const self = this\n opts || (opts = {})\n\n const countOpts = self.getOpt('countOpts', opts)\n utils.fillIn(countOpts, self.getQueryOptions(mapper, query))\n const mongoQuery = self.getQuery(mapper, query)\n\n return self.getClient().then(function (client) {\n return new Promise(function (resolve, reject) {\n client.collection(mapper.table || underscore(mapper.name)).count(mongoQuery, countOpts, function (err, count) {\n return err ? reject(err) : resolve([count, {}])\n })\n })\n })\n },\n\n /**\n * Create a new record.\n *\n * @name MongoDBAdapter#create\n * @method\n * @param {Object} mapper The mapper.\n * @param {Object} props The record to be created.\n * @param {Object} [opts] Configuration options.\n * @param {Object} [opts.insertOpts] Options to pass to collection#insert.\n * @param {boolean} [opts.raw=false] Whether to return a more detailed\n * @return {Promise}\n */\n\n /**\n * Create a new record. Internal method used by Adapter#create.\n *\n * @name MongoDBAdapter#_create\n * @method\n * @private\n * @param {Object} mapper The mapper.\n * @param {Object} props The record to be created.\n * @param {Object} [opts] Configuration options.\n * @return {Promise}\n */\n _create (mapper, props, opts) {\n const self = this\n props || (props = {})\n opts || (opts = {})\n props = utils.plainCopy(props)\n\n const insertOpts = self.getOpt('insertOpts', opts)\n\n return self.getClient().then(function (client) {\n return new Promise(function (resolve, reject) {\n const collection = client.collection(mapper.table || underscore(mapper.name))\n const method = collection.insertOne ? 'insertOne' : 'insert'\n collection[method](props, insertOpts, function (err, cursor) {\n return err ? reject(err) : resolve(cursor)\n })\n })\n }).then(function (cursor) {\n let record\n let r = cursor.ops ? cursor.ops : cursor\n self._translateId(r, opts)\n record = utils.isArray(r) ? r[0] : r\n cursor.connection = undefined\n return [record, cursor]\n })\n },\n\n /**\n * Create multiple records in a single batch.\n *\n * @name MongoDBAdapter#createMany\n * @method\n * @param {Object} mapper The mapper.\n * @param {Object} props The records to be created.\n * @param {Object} [opts] Configuration options.\n * @param {Object} [opts.insertManyOpts] Options to pass to\n * collection#insertMany.\n * @param {boolean} [opts.raw=false] Whether to return a more detailed\n * response object.\n * @return {Promise}\n */\n\n /**\n * Create multiple records in a single batch. Internal method used by\n * Adapter#createMany.\n *\n * @name MongoDBAdapter#_createMany\n * @method\n * @private\n * @param {Object} mapper The mapper.\n * @param {Object} props The records to be created.\n * @param {Object} [opts] Configuration options.\n * @return {Promise}\n */\n _createMany (mapper, props, opts) {\n const self = this\n props || (props = {})\n opts || (opts = {})\n props = utils.plainCopy(props)\n\n const insertManyOpts = self.getOpt('insertManyOpts', opts)\n\n return self.getClient().then(function (client) {\n return new Promise(function (resolve, reject) {\n const collection = client.collection(mapper.table || underscore(mapper.name))\n collection.insertMany(props, insertManyOpts, function (err, cursor) {\n return err ? reject(err) : resolve(cursor)\n })\n })\n }).then(function (cursor) {\n let records = []\n let r = cursor.ops ? cursor.ops : cursor\n self._translateId(r, opts)\n records = r\n cursor.connection = undefined\n return [records, cursor]\n })\n },\n\n /**\n * Destroy the record with the given primary key.\n *\n * @name MongoDBAdapter#destroy\n * @method\n * @param {Object} mapper The mapper.\n * @param {(string|number)} id Primary key of the record to destroy.\n * @param {Object} [opts] Configuration options.\n * @param {boolean} [opts.raw=false] Whether to return a more detailed\n * response object.\n * @param {Object} [opts.removeOpts] Options to pass to collection#remove.\n * @return {Promise}\n */\n\n /**\n * Destroy the record with the given primary key. Internal method used by\n * Adapter#destroy.\n *\n * @name MongoDBAdapter#_destroy\n * @method\n * @private\n * @param {Object} mapper The mapper.\n * @param {(string|number)} id Primary key of the record to destroy.\n * @param {Object} [opts] Configuration options.\n * @return {Promise}\n */\n _destroy (mapper, id, opts) {\n const self = this\n opts || (opts = {})\n const removeOpts = self.getOpt('removeOpts', opts)\n\n return self.getClient().then(function (client) {\n return new Promise(function (resolve, reject) {\n const mongoQuery = {}\n mongoQuery[mapper.idAttribute] = self.toObjectID(mapper, id)\n const collection = client.collection(mapper.table || underscore(mapper.name))\n collection[collection.deleteOne ? 'deleteOne' : 'remove'](mongoQuery, removeOpts, function (err, cursor) {\n return err ? reject(err) : resolve(cursor)\n })\n })\n }).then(function (cursor) {\n return [undefined, cursor]\n })\n },\n\n /**\n * Destroy the records that match the selection query.\n *\n * @name MongoDBAdapter#destroyAll\n * @method\n * @param {Object} mapper the mapper.\n * @param {Object} [query] Selection query.\n * @param {Object} [query.where] Filtering criteria.\n * @param {string|Array} [query.orderBy] Sorting criteria.\n * @param {string|Array} [query.sort] Same as `query.sort`.\n * @param {number} [query.limit] Limit results.\n * @param {number} [query.skip] Offset results.\n * @param {number} [query.offset] Same as `query.skip`.\n * @param {Object} [opts] Configuration options.\n * @param {boolean} [opts.raw=false] Whether to return a more detailed\n * response object.\n * @param {Object} [opts.removeOpts] Options to pass to collection#remove.\n * @return {Promise}\n */\n\n /**\n * Destroy the records that match the selection query. Internal method used by\n * Adapter#destroyAll.\n *\n * @name MongoDBAdapter#_destroyAll\n * @method\n * @private\n * @param {Object} mapper the mapper.\n * @param {Object} [query] Selection query.\n * @param {Object} [opts] Configuration options.\n * @return {Promise}\n */\n _destroyAll (mapper, query, opts) {\n const self = this\n query || (query = {})\n opts || (opts = {})\n const removeOpts = self.getOpt('removeOpts', opts)\n utils.fillIn(removeOpts, self.getQueryOptions(mapper, query))\n\n return self.getClient().then(function (client) {\n const mongoQuery = self.getQuery(mapper, query)\n return new Promise(function (resolve, reject) {\n const collection = client.collection(mapper.table || underscore(mapper.name))\n collection[collection.deleteMany ? 'deleteMany' : 'remove'](mongoQuery, removeOpts, function (err, cursor) {\n return err ? reject(err) : resolve(cursor)\n })\n })\n }).then(function (cursor) {\n cursor.connection = undefined\n return [undefined, cursor]\n })\n },\n\n /**\n * Retrieve the record with the given primary key.\n *\n * @name MongoDBAdapter#find\n * @method\n * @param {Object} mapper The mapper.\n * @param {(string|number)} id Primary key of the record to retrieve.\n * @param {Object} [opts] Configuration options.\n * @param {Object} [opts.findOneOpts] Options to pass to collection#findOne.\n * @param {boolean} [opts.raw=false] Whether to return a more detailed\n * response object.\n * @param {string[]} [opts.with=[]] Relations to eager load.\n * @return {Promise}\n */\n\n /**\n * Retrieve the record with the given primary key. Internal method used by\n * Adapter#find.\n *\n * @name MongoDBAdapter#_find\n * @method\n * @private\n * @param {Object} mapper The mapper.\n * @param {(string|number)} id Primary key of the record to retrieve.\n * @param {Object} [opts] Configuration options.\n * @return {Promise}\n */\n _find (mapper, id, opts) {\n const self = this\n opts || (opts = {})\n opts.with || (opts.with = [])\n\n const findOneOpts = self.getOpt('findOneOpts', opts)\n findOneOpts.fields || (findOneOpts.fields = {})\n\n return self.getClient().then(function (client) {\n return new Promise(function (resolve, reject) {\n let mongoQuery = {}\n mongoQuery[mapper.idAttribute] = self.toObjectID(mapper, id)\n client.collection(mapper.table || underscore(mapper.name)).findOne(mongoQuery, findOneOpts, function (err, record) {\n return err ? reject(err) : resolve(record)\n })\n })\n }).then(function (record) {\n if (record) {\n self._translateId(record, opts)\n }\n return [record, {}]\n })\n },\n\n /**\n * Retrieve the records that match the selection query.\n *\n * @name MongoDBAdapter#findAll\n * @method\n * @param {Object} mapper The mapper.\n * @param {Object} query Selection query.\n * @param {Object} [opts] Configuration options.\n * @param {Object} [opts.findOpts] Options to pass to collection#find.\n * @param {boolean} [opts.raw=false] Whether to return a more detailed\n * response object.\n * @param {string[]} [opts.with=[]] Relations to eager load.\n * @return {Promise}\n */\n\n /**\n * Retrieve the records that match the selection query. Internal method used\n * by Adapter#findAll.\n *\n * @name MongoDBAdapter#_findAll\n * @method\n * @private\n * @param {Object} mapper The mapper.\n * @param {Object} query Selection query.\n * @param {Object} [opts] Configuration options.\n * @return {Promise}\n */\n _findAll (mapper, query, opts) {\n const self = this\n opts || (opts = {})\n\n const findOpts = self.getOpt('findOpts', opts)\n utils.fillIn(findOpts, self.getQueryOptions(mapper, query))\n findOpts.fields || (findOpts.fields = {})\n const mongoQuery = self.getQuery(mapper, query)\n\n return self.getClient().then(function (client) {\n return new Promise(function (resolve, reject) {\n client.collection(mapper.table || underscore(mapper.name)).find(mongoQuery, findOpts).toArray(function (err, records) {\n return err ? reject(err) : resolve(records)\n })\n })\n }).then(function (records) {\n self._translateId(records, opts)\n return [records, {}]\n })\n },\n\n /**\n * Apply the given update to the record with the specified primary key.\n *\n * @name MongoDBAdapter#update\n * @method\n * @param {Object} mapper The mapper.\n * @param {(string|number)} id The primary key of the record to be updated.\n * @param {Object} props The update to apply to the record.\n * @param {Object} [opts] Configuration options.\n * @param {boolean} [opts.raw=false] Whether to return a more detailed\n * response object.\n * @param {Object} [opts.updateOpts] Options to pass to collection#update.\n * @return {Promise}\n */\n\n /**\n * Apply the given update to the record with the specified primary key.\n * Internal method used by Adapter#update.\n *\n * @name MongoDBAdapter#_update\n * @method\n * @private\n * @param {Object} mapper The mapper.\n * @param {(string|number)} id The primary key of the record to be updated.\n * @param {Object} props The update to apply to the record.\n * @param {Object} [opts] Configuration options.\n * @return {Promise}\n */\n _update (mapper, id, props, opts) {\n const self = this\n props || (props = {})\n opts || (opts = {})\n const updateOpts = self.getOpt('updateOpts', opts)\n\n return self.find(mapper, id, { raw: false }).then(function (record) {\n if (!record) {\n throw new Error('Not Found')\n }\n return self.getClient().then(function (client) {\n return new Promise(function (resolve, reject) {\n const mongoQuery = {}\n mongoQuery[mapper.idAttribute] = self.toObjectID(mapper, id)\n const collection = client.collection(mapper.table || underscore(mapper.name))\n collection[collection.updateOne ? 'updateOne' : 'update'](mongoQuery, { $set: props }, updateOpts, function (err, cursor) {\n return err ? reject(err) : resolve(cursor)\n })\n })\n })\n }).then(function (cursor) {\n return self.find(mapper, id, { raw: false }).then(function (record) {\n cursor.connection = undefined\n return [record, cursor]\n })\n })\n },\n\n /**\n * Apply the given update to all records that match the selection query.\n *\n * @name MongoDBAdapter#updateAll\n * @method\n * @param {Object} mapper The mapper.\n * @param {Object} props The update to apply to the selected records.\n * @param {Object} [query] Selection query.\n * @param {Object} [opts] Configuration options.\n * @param {boolean} [opts.raw=false] Whether to return a more detailed\n * response object.\n * @param {Object} [opts.updateOpts] Options to pass to collection#update.\n * @return {Promise}\n */\n\n /**\n * Apply the given update to all records that match the selection query.\n * Internal method used by Adapter#updateAll.\n *\n * @name MongoDBAdapter#_updateAll\n * @method\n * @private\n * @param {Object} mapper The mapper.\n * @param {Object} props The update to apply to the selected records.\n * @param {Object} [query] Selection query.\n * @param {Object} [opts] Configuration options.\n * @return {Promise}\n */\n _updateAll (mapper, props, query, opts) {\n const self = this\n props || (props = {})\n query || (query = {})\n opts || (opts = {})\n let ids\n const updateOpts = self.getOpt('updateOpts', opts)\n updateOpts.multi = true\n\n return Promise.all([\n self.findAll(mapper, query, { raw: false }),\n self.getClient()\n ]).then(function (results) {\n let [records, client] = results\n const queryOptions = self.getQueryOptions(mapper, query)\n const mongoQuery = self.getQuery(mapper, query)\n\n queryOptions.$set = props\n ids = records.map(function (record) {\n return self.toObjectID(mapper, record[mapper.idAttribute])\n })\n\n return new Promise(function (resolve, reject) {\n const collection = client.collection(mapper.table || underscore(mapper.name))\n collection[collection.updateMany ? 'updateMany' : 'update'](mongoQuery, queryOptions, updateOpts, function (err, cursor) {\n return err ? reject(err) : resolve(cursor)\n })\n })\n }).then(function (cursor) {\n const query = {}\n query[mapper.idAttribute] = {\n 'in': ids\n }\n return self.findAll(mapper, query, { raw: false }).then(function (records) {\n cursor.connection = undefined\n return [records, cursor]\n })\n })\n },\n\n /**\n * Return a Promise that resolves to a reference to the MongoDB client being\n * used by this adapter.\n *\n * Useful when you need to do anything custom with the MongoDB client library.\n *\n * @name MongoDBAdapter#getClient\n * @method\n * @return {Object} MongoDB client.\n */\n getClient () {\n return this.client\n },\n\n /**\n * Map filtering params in a selection query to MongoDB a filtering object.\n *\n * Handles the following:\n *\n * - where\n * - and bunch of filtering operators\n *\n * @name MongoDBAdapter#getQuery\n * @method\n * @return {Object}\n */\n getQuery (mapper, query) {\n query = utils.plainCopy(query || {})\n query.where || (query.where = {})\n\n utils.forOwn(query, function (config, keyword) {\n if (reserved.indexOf(keyword) === -1) {\n if (utils.isObject(config)) {\n query.where[keyword] = config\n } else {\n query.where[keyword] = {\n '==': config\n }\n }\n delete query[keyword]\n }\n })\n\n let mongoQuery = {}\n\n if (Object.keys(query.where).length !== 0) {\n utils.forOwn(query.where, function (criteria, field) {\n if (!utils.isObject(criteria)) {\n query.where[field] = {\n '==': criteria\n }\n }\n utils.forOwn(criteria, function (v, op) {\n if (op === '==' || op === '===' || op === 'contains') {\n mongoQuery[field] = v\n } else if (op === '!=' || op === '!==' || op === 'notContains') {\n mongoQuery[field] = mongoQuery[field] || {}\n mongoQuery[field].$ne = v\n } else if (op === '>') {\n mongoQuery[field] = mongoQuery[field] || {}\n mongoQuery[field].$gt = v\n } else if (op === '>=') {\n mongoQuery[field] = mongoQuery[field] || {}\n mongoQuery[field].$gte = v\n } else if (op === '<') {\n mongoQuery[field] = mongoQuery[field] || {}\n mongoQuery[field].$lt = v\n } else if (op === '<=') {\n mongoQuery[field] = mongoQuery[field] || {}\n mongoQuery[field].$lte = v\n } else if (op === 'in') {\n mongoQuery[field] = mongoQuery[field] || {}\n mongoQuery[field].$in = v\n } else if (op === 'notIn') {\n mongoQuery[field] = mongoQuery[field] || {}\n mongoQuery[field].$nin = v\n } else if (op === '|==' || op === '|===' || op === '|contains') {\n mongoQuery.$or = mongoQuery.$or || []\n let orEqQuery = {}\n orEqQuery[field] = v\n mongoQuery.$or.push(orEqQuery)\n } else if (op === '|!=' || op === '|!==' || op === '|notContains') {\n mongoQuery.$or = mongoQuery.$or || []\n let orNeQuery = {}\n orNeQuery[field] = {\n '$ne': v\n }\n mongoQuery.$or.push(orNeQuery)\n } else if (op === '|>') {\n mongoQuery.$or = mongoQuery.$or || []\n let orGtQuery = {}\n orGtQuery[field] = {\n '$gt': v\n }\n mongoQuery.$or.push(orGtQuery)\n } else if (op === '|>=') {\n mongoQuery.$or = mongoQuery.$or || []\n let orGteQuery = {}\n orGteQuery[field] = {\n '$gte': v\n }\n mongoQuery.$or.push(orGteQuery)\n } else if (op === '|<') {\n mongoQuery.$or = mongoQuery.$or || []\n let orLtQuery = {}\n orLtQuery[field] = {\n '$lt': v\n }\n mongoQuery.$or.push(orLtQuery)\n } else if (op === '|<=') {\n mongoQuery.$or = mongoQuery.$or || []\n let orLteQuery = {}\n orLteQuery[field] = {\n '$lte': v\n }\n mongoQuery.$or.push(orLteQuery)\n } else if (op === '|in') {\n mongoQuery.$or = mongoQuery.$or || []\n let orInQuery = {}\n orInQuery[field] = {\n '$in': v\n }\n mongoQuery.$or.push(orInQuery)\n } else if (op === '|notIn') {\n mongoQuery.$or = mongoQuery.$or || []\n let orNinQuery = {}\n orNinQuery[field] = {\n '$nin': v\n }\n mongoQuery.$or.push(orNinQuery)\n }\n })\n })\n }\n\n return mongoQuery\n },\n\n /**\n * Map non-filtering params in a selection query to MongoDB query options.\n *\n * Handles the following:\n *\n * - limit\n * - skip/offset\n * - orderBy/sort\n *\n * @name MongoDBAdapter#getQueryOptions\n * @method\n * @return {Object}\n */\n getQueryOptions (mapper, query) {\n query = utils.plainCopy(query || {})\n query.orderBy = query.orderBy || query.sort\n query.skip = query.skip || query.offset\n\n let queryOptions = {}\n\n if (query.orderBy) {\n if (utils.isString(query.orderBy)) {\n query.orderBy = [\n [query.orderBy, 'asc']\n ]\n }\n for (var i = 0; i < query.orderBy.length; i++) {\n if (utils.isString(query.orderBy[i])) {\n query.orderBy[i] = [query.orderBy[i], 'asc']\n }\n }\n queryOptions.sort = query.orderBy\n }\n\n if (query.skip) {\n queryOptions.skip = +query.skip\n }\n\n if (query.limit) {\n queryOptions.limit = +query.limit\n }\n\n return queryOptions\n },\n\n /**\n * Turn an _id into an ObjectID if it isn't already an ObjectID.\n *\n * @name MongoDBAdapter#toObjectID\n * @method\n * @return {*}\n */\n toObjectID (mapper, id) {\n if (id !== undefined && mapper.idAttribute === '_id' && typeof id === 'string' && ObjectID.isValid(id) && !(id instanceof ObjectID)) {\n return new ObjectID(id)\n }\n return id\n },\n\n /**\n * Return the foreignKey from the given record for the provided relationship.\n *\n * @name MongoDBAdapter#makeBelongsToForeignKey\n * @method\n * @return {*}\n */\n makeBelongsToForeignKey (mapper, def, record) {\n return this.toObjectID(def.getRelation(), Adapter.prototype.makeBelongsToForeignKey.call(this, mapper, def, record))\n },\n\n /**\n * Return the localKeys from the given record for the provided relationship.\n *\n * Override with care.\n *\n * @name MongoDBAdapter#makeHasManyLocalKeys\n * @method\n * @return {*}\n */\n makeHasManyLocalKeys (mapper, def, record) {\n const self = this\n const relatedMapper = def.getRelation()\n const localKeys = Adapter.prototype.makeHasManyLocalKeys.call(self, mapper, def, record)\n return localKeys.map(function (key) {\n return self.toObjectID(relatedMapper, key)\n })\n },\n\n /**\n * Not supported.\n *\n * @name MongoDBAdapter#updateMany\n * @method\n */\n updateMany () {\n throw new Error('not supported!')\n }\n})\n\nmodule.exports = MongoDBAdapter\n"],"names":["utils","Adapter","reserved","ObjectID"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"js-data-mongodb.js","sources":["../src/index.js"],"sourcesContent":["import {MongoClient} from 'mongodb'\nimport {ObjectID} from 'bson'\nimport {utils} from 'js-data'\nimport {\n Adapter,\n reserved\n} from 'js-data-adapter'\nimport underscore from 'mout/string/underscore'\n\nconst DEFAULTS = {\n /**\n * Convert ObjectIDs to strings when pulling records out of the database.\n *\n * @name MongoDBAdapter#translateId\n * @type {boolean}\n * @default true\n */\n translateId: true,\n\n /**\n * MongoDB URI.\n *\n * @name MongoDBAdapter#uri\n * @type {string}\n * @default mongodb://localhost:27017\n */\n uri: 'mongodb://localhost:27017'\n}\n\nconst COUNT_OPTS_DEFAULTS = {}\nconst FIND_OPTS_DEFAULTS = {}\nconst FIND_ONE_OPTS_DEFAULTS = {}\nconst INSERT_OPTS_DEFAULTS = {}\nconst INSERT_MANY_OPTS_DEFAULTS = {}\nconst UPDATE_OPTS_DEFAULTS = {}\nconst REMOVE_OPTS_DEFAULTS = {}\n\n/**\n * MongoDBAdapter class.\n *\n * @example\n * // Use Container instead of DataStore on the server\n * import {Container} from 'js-data'\n * import MongoDBAdapter from 'js-data-mongodb'\n *\n * // Create a store to hold your Mappers\n * const store = new Container({\n * mapperDefaults: {\n * // MongoDB uses \"_id\" as the primary key\n * idAttribute: '_id'\n * }\n * })\n *\n * // Create an instance of MongoDBAdapter with default settings\n * const adapter = new MongoDBAdapter()\n *\n * // Mappers in \"store\" will use the MongoDB adapter by default\n * store.registerAdapter('mongodb', adapter, { default: true })\n *\n * // Create a Mapper that maps to a \"user\" collection\n * store.defineMapper('user')\n *\n * @class MongoDBAdapter\n * @extends Adapter\n * @param {Object} [opts] Configuration options.\n * @param {boolean} [opts.debug=false] See {@link Adapter#debug}.\n * @param {Object} [opts.countOpts] See {@link MongoDBAdapter#countOpts}.\n * @param {Object} [opts.findOpts] See {@link MongoDBAdapter#findOpts}.\n * @param {Object} [opts.findOneOpts] See {@link MongoDBAdapter#findOneOpts}.\n * @param {Object} [opts.insertOpts] See {@link MongoDBAdapter#insertOpts}.\n * @param {Object} [opts.insertManyOpts] See {@link MongoDBAdapter#insertManyOpts}.\n * @param {boolean} [opts.raw=false] See {@link Adapter#raw}.\n * @param {Object} [opts.removeOpts] See {@link MongoDBAdapter#removeOpts}.\n * @param {boolean} [opts.translateId=true] See {@link MongoDBAdapter#translateId}.\n * @param {Object} [opts.updateOpts] See {@link MongoDBAdapter#updateOpts}.\n * @param {string} [opts.uri=\"mongodb://localhost:27017\"] See {@link MongoDBAdapter#uri}.\n */\nexport function MongoDBAdapter (opts) {\n const self = this\n utils.classCallCheck(self, MongoDBAdapter)\n opts || (opts = {})\n if (utils.isString(opts)) {\n opts = { uri: opts }\n }\n utils.fillIn(opts, DEFAULTS)\n Adapter.call(self, opts)\n\n /**\n * Default options to pass to collection#count.\n *\n * @name MongoDBAdapter#countOpts\n * @type {Object}\n * @default {}\n */\n self.countOpts || (self.countOpts = {})\n utils.fillIn(self.countOpts, COUNT_OPTS_DEFAULTS)\n\n /**\n * Default options to pass to collection#find.\n *\n * @name MongoDBAdapter#findOpts\n * @type {Object}\n * @default {}\n */\n self.findOpts || (self.findOpts = {})\n utils.fillIn(self.findOpts, FIND_OPTS_DEFAULTS)\n\n /**\n * Default options to pass to collection#findOne.\n *\n * @name MongoDBAdapter#findOneOpts\n * @type {Object}\n * @default {}\n */\n self.findOneOpts || (self.findOneOpts = {})\n utils.fillIn(self.findOneOpts, FIND_ONE_OPTS_DEFAULTS)\n\n /**\n * Default options to pass to collection#insert.\n *\n * @name MongoDBAdapter#insertOpts\n * @type {Object}\n * @default {}\n */\n self.insertOpts || (self.insertOpts = {})\n utils.fillIn(self.insertOpts, INSERT_OPTS_DEFAULTS)\n\n /**\n * Default options to pass to collection#insertMany.\n *\n * @name MongoDBAdapter#insertManyOpts\n * @type {Object}\n * @default {}\n */\n self.insertManyOpts || (self.insertManyOpts = {})\n utils.fillIn(self.insertManyOpts, INSERT_MANY_OPTS_DEFAULTS)\n\n /**\n * Default options to pass to collection#update.\n *\n * @name MongoDBAdapter#updateOpts\n * @type {Object}\n * @default {}\n */\n self.updateOpts || (self.updateOpts = {})\n utils.fillIn(self.updateOpts, UPDATE_OPTS_DEFAULTS)\n\n /**\n * Default options to pass to collection#update.\n *\n * @name MongoDBAdapter#removeOpts\n * @type {Object}\n * @default {}\n */\n self.removeOpts || (self.removeOpts = {})\n utils.fillIn(self.removeOpts, REMOVE_OPTS_DEFAULTS)\n\n /**\n * A Promise that resolves to a reference to the MongoDB client being used by\n * this adapter.\n *\n * @name MongoDBAdapter#client\n * @type {Object}\n */\n self.client = new Promise(function (resolve, reject) {\n MongoClient.connect(opts.uri, function (err, db) {\n return err ? reject(err) : resolve(db)\n })\n })\n}\n\n// Setup prototype inheritance from Adapter\nMongoDBAdapter.prototype = Object.create(Adapter.prototype, {\n constructor: {\n value: MongoDBAdapter,\n enumerable: false,\n writable: true,\n configurable: true\n }\n})\n\nObject.defineProperty(MongoDBAdapter, '__super__', {\n configurable: true,\n value: Adapter\n})\n\n/**\n * Alternative to ES6 class syntax for extending `MongoDBAdapter`.\n *\n * @example Using the ES2015 class syntax.\n * class MyMongoDBAdapter extends MongoDBAdapter {...}\n * const adapter = new MyMongoDBAdapter()\n *\n * @example Using {@link MongoDBAdapter.extend}.\n * var instanceProps = {...}\n * var classProps = {...}\n *\n * var MyMongoDBAdapter = MongoDBAdapter.extend(instanceProps, classProps)\n * var adapter = new MyMongoDBAdapter()\n *\n * @method MongoDBAdapter.extend\n * @static\n * @param {Object} [instanceProps] Properties that will be added to the\n * prototype of the subclass.\n * @param {Object} [classProps] Properties that will be added as static\n * properties to the subclass itself.\n * @return {Object} Subclass of `MongoDBAdapter`.\n */\nMongoDBAdapter.extend = utils.extend\n\nutils.addHiddenPropsToTarget(MongoDBAdapter.prototype, {\n /**\n * Translate ObjectIDs to strings.\n *\n * @method MongoDBAdapter#_translateId\n * @return {*}\n */\n _translateId (r, opts) {\n opts || (opts = {})\n if (this.getOpt('translateId', opts)) {\n if (utils.isArray(r)) {\n r.forEach(function (_r) {\n const __id = _r._id ? _r._id.toString() : _r._id\n _r._id = typeof __id === 'string' ? __id : _r._id\n })\n } else if (utils.isObject(r)) {\n const __id = r._id ? r._id.toString() : r._id\n r._id = typeof __id === 'string' ? __id : r._id\n }\n }\n return r\n },\n\n /**\n * Retrieve the number of records that match the selection query.\n *\n * @method MongoDBAdapter#count\n * @param {Object} mapper The mapper.\n * @param {Object} query Selection query.\n * @param {Object} [opts] Configuration options.\n * @param {Object} [opts.countOpts] Options to pass to collection#count.\n * @param {boolean} [opts.raw=false] Whether to return a more detailed\n * response object.\n * @param {string[]} [opts.with=[]] Relations to eager load.\n * @return {Promise}\n */\n\n /**\n * Retrieve the records that match the selection query. Internal method used\n * by Adapter#count.\n *\n * @method MongoDBAdapter#_count\n * @private\n * @param {Object} mapper The mapper.\n * @param {Object} query Selection query.\n * @param {Object} [opts] Configuration options.\n * @return {Promise}\n */\n _count (mapper, query, opts) {\n const self = this\n opts || (opts = {})\n\n const countOpts = self.getOpt('countOpts', opts)\n utils.fillIn(countOpts, self.getQueryOptions(mapper, query))\n const mongoQuery = self.getQuery(mapper, query)\n\n return self.getClient().then(function (client) {\n return new Promise(function (resolve, reject) {\n client.collection(mapper.table || underscore(mapper.name)).count(mongoQuery, countOpts, function (err, count) {\n return err ? reject(err) : resolve([count, {}])\n })\n })\n })\n },\n\n /**\n * Create a new record.\n *\n * @method MongoDBAdapter#create\n * @param {Object} mapper The mapper.\n * @param {Object} props The record to be created.\n * @param {Object} [opts] Configuration options.\n * @param {Object} [opts.insertOpts] Options to pass to collection#insert.\n * @param {boolean} [opts.raw=false] Whether to return a more detailed\n * @return {Promise}\n */\n\n /**\n * Create a new record. Internal method used by Adapter#create.\n *\n * @method MongoDBAdapter#_create\n * @private\n * @param {Object} mapper The mapper.\n * @param {Object} props The record to be created.\n * @param {Object} [opts] Configuration options.\n * @return {Promise}\n */\n _create (mapper, props, opts) {\n const self = this\n props || (props = {})\n opts || (opts = {})\n props = utils.plainCopy(props)\n\n const insertOpts = self.getOpt('insertOpts', opts)\n\n return self.getClient().then(function (client) {\n return new Promise(function (resolve, reject) {\n const collection = client.collection(mapper.table || underscore(mapper.name))\n const method = collection.insertOne ? 'insertOne' : 'insert'\n collection[method](props, insertOpts, function (err, cursor) {\n return err ? reject(err) : resolve(cursor)\n })\n })\n }).then(function (cursor) {\n let record\n let r = cursor.ops ? cursor.ops : cursor\n self._translateId(r, opts)\n record = utils.isArray(r) ? r[0] : r\n cursor.connection = undefined\n return [record, cursor]\n })\n },\n\n /**\n * Create multiple records in a single batch.\n *\n * @method MongoDBAdapter#createMany\n * @param {Object} mapper The mapper.\n * @param {Object} props The records to be created.\n * @param {Object} [opts] Configuration options.\n * @param {Object} [opts.insertManyOpts] Options to pass to\n * collection#insertMany.\n * @param {boolean} [opts.raw=false] Whether to return a more detailed\n * response object.\n * @return {Promise}\n */\n\n /**\n * Create multiple records in a single batch. Internal method used by\n * Adapter#createMany.\n *\n * @method MongoDBAdapter#_createMany\n * @private\n * @param {Object} mapper The mapper.\n * @param {Object} props The records to be created.\n * @param {Object} [opts] Configuration options.\n * @return {Promise}\n */\n _createMany (mapper, props, opts) {\n const self = this\n props || (props = {})\n opts || (opts = {})\n props = utils.plainCopy(props)\n\n const insertManyOpts = self.getOpt('insertManyOpts', opts)\n\n return self.getClient().then(function (client) {\n return new Promise(function (resolve, reject) {\n const collection = client.collection(mapper.table || underscore(mapper.name))\n collection.insertMany(props, insertManyOpts, function (err, cursor) {\n return err ? reject(err) : resolve(cursor)\n })\n })\n }).then(function (cursor) {\n let records = []\n let r = cursor.ops ? cursor.ops : cursor\n self._translateId(r, opts)\n records = r\n cursor.connection = undefined\n return [records, cursor]\n })\n },\n\n /**\n * Destroy the record with the given primary key.\n *\n * @method MongoDBAdapter#destroy\n * @param {Object} mapper The mapper.\n * @param {(string|number)} id Primary key of the record to destroy.\n * @param {Object} [opts] Configuration options.\n * @param {boolean} [opts.raw=false] Whether to return a more detailed\n * response object.\n * @param {Object} [opts.removeOpts] Options to pass to collection#remove.\n * @return {Promise}\n */\n\n /**\n * Destroy the record with the given primary key. Internal method used by\n * Adapter#destroy.\n *\n * @method MongoDBAdapter#_destroy\n * @private\n * @param {Object} mapper The mapper.\n * @param {(string|number)} id Primary key of the record to destroy.\n * @param {Object} [opts] Configuration options.\n * @return {Promise}\n */\n _destroy (mapper, id, opts) {\n const self = this\n opts || (opts = {})\n const removeOpts = self.getOpt('removeOpts', opts)\n\n return self.getClient().then(function (client) {\n return new Promise(function (resolve, reject) {\n const mongoQuery = {}\n mongoQuery[mapper.idAttribute] = self.toObjectID(mapper, id)\n const collection = client.collection(mapper.table || underscore(mapper.name))\n collection[collection.deleteOne ? 'deleteOne' : 'remove'](mongoQuery, removeOpts, function (err, cursor) {\n return err ? reject(err) : resolve(cursor)\n })\n })\n }).then(function (cursor) {\n return [undefined, cursor]\n })\n },\n\n /**\n * Destroy the records that match the selection query.\n *\n * @method MongoDBAdapter#destroyAll\n * @param {Object} mapper the mapper.\n * @param {Object} [query] Selection query.\n * @param {Object} [query.where] Filtering criteria.\n * @param {string|Array} [query.orderBy] Sorting criteria.\n * @param {string|Array} [query.sort] Same as `query.sort`.\n * @param {number} [query.limit] Limit results.\n * @param {number} [query.skip] Offset results.\n * @param {number} [query.offset] Same as `query.skip`.\n * @param {Object} [opts] Configuration options.\n * @param {boolean} [opts.raw=false] Whether to return a more detailed\n * response object.\n * @param {Object} [opts.removeOpts] Options to pass to collection#remove.\n * @return {Promise}\n */\n\n /**\n * Destroy the records that match the selection query. Internal method used by\n * Adapter#destroyAll.\n *\n * @method MongoDBAdapter#_destroyAll\n * @private\n * @param {Object} mapper the mapper.\n * @param {Object} [query] Selection query.\n * @param {Object} [opts] Configuration options.\n * @return {Promise}\n */\n _destroyAll (mapper, query, opts) {\n const self = this\n query || (query = {})\n opts || (opts = {})\n const removeOpts = self.getOpt('removeOpts', opts)\n utils.fillIn(removeOpts, self.getQueryOptions(mapper, query))\n\n return self.getClient().then(function (client) {\n const mongoQuery = self.getQuery(mapper, query)\n return new Promise(function (resolve, reject) {\n const collection = client.collection(mapper.table || underscore(mapper.name))\n collection[collection.deleteMany ? 'deleteMany' : 'remove'](mongoQuery, removeOpts, function (err, cursor) {\n return err ? reject(err) : resolve(cursor)\n })\n })\n }).then(function (cursor) {\n cursor.connection = undefined\n return [undefined, cursor]\n })\n },\n\n /**\n * Retrieve the record with the given primary key.\n *\n * @method MongoDBAdapter#find\n * @param {Object} mapper The mapper.\n * @param {(string|number)} id Primary key of the record to retrieve.\n * @param {Object} [opts] Configuration options.\n * @param {Object} [opts.findOneOpts] Options to pass to collection#findOne.\n * @param {boolean} [opts.raw=false] Whether to return a more detailed\n * response object.\n * @param {string[]} [opts.with=[]] Relations to eager load.\n * @return {Promise}\n */\n\n /**\n * Retrieve the record with the given primary key. Internal method used by\n * Adapter#find.\n *\n * @method MongoDBAdapter#_find\n * @private\n * @param {Object} mapper The mapper.\n * @param {(string|number)} id Primary key of the record to retrieve.\n * @param {Object} [opts] Configuration options.\n * @return {Promise}\n */\n _find (mapper, id, opts) {\n const self = this\n opts || (opts = {})\n opts.with || (opts.with = [])\n\n const findOneOpts = self.getOpt('findOneOpts', opts)\n findOneOpts.fields || (findOneOpts.fields = {})\n\n return self.getClient().then(function (client) {\n return new Promise(function (resolve, reject) {\n let mongoQuery = {}\n mongoQuery[mapper.idAttribute] = self.toObjectID(mapper, id)\n client.collection(mapper.table || underscore(mapper.name)).findOne(mongoQuery, findOneOpts, function (err, record) {\n return err ? reject(err) : resolve(record)\n })\n })\n }).then(function (record) {\n if (record) {\n self._translateId(record, opts)\n }\n return [record, {}]\n })\n },\n\n /**\n * Retrieve the records that match the selection query.\n *\n * @method MongoDBAdapter#findAll\n * @param {Object} mapper The mapper.\n * @param {Object} query Selection query.\n * @param {Object} [opts] Configuration options.\n * @param {Object} [opts.findOpts] Options to pass to collection#find.\n * @param {boolean} [opts.raw=false] Whether to return a more detailed\n * response object.\n * @param {string[]} [opts.with=[]] Relations to eager load.\n * @return {Promise}\n */\n\n /**\n * Retrieve the records that match the selection query. Internal method used\n * by Adapter#findAll.\n *\n * @method MongoDBAdapter#_findAll\n * @private\n * @param {Object} mapper The mapper.\n * @param {Object} query Selection query.\n * @param {Object} [opts] Configuration options.\n * @return {Promise}\n */\n _findAll (mapper, query, opts) {\n const self = this\n opts || (opts = {})\n\n const findOpts = self.getOpt('findOpts', opts)\n utils.fillIn(findOpts, self.getQueryOptions(mapper, query))\n findOpts.fields || (findOpts.fields = {})\n const mongoQuery = self.getQuery(mapper, query)\n\n return self.getClient().then(function (client) {\n return new Promise(function (resolve, reject) {\n client.collection(mapper.table || underscore(mapper.name)).find(mongoQuery, findOpts).toArray(function (err, records) {\n return err ? reject(err) : resolve(records)\n })\n })\n }).then(function (records) {\n self._translateId(records, opts)\n return [records, {}]\n })\n },\n\n /**\n * Apply the given update to the record with the specified primary key.\n *\n * @method MongoDBAdapter#update\n * @param {Object} mapper The mapper.\n * @param {(string|number)} id The primary key of the record to be updated.\n * @param {Object} props The update to apply to the record.\n * @param {Object} [opts] Configuration options.\n * @param {boolean} [opts.raw=false] Whether to return a more detailed\n * response object.\n * @param {Object} [opts.updateOpts] Options to pass to collection#update.\n * @return {Promise}\n */\n\n /**\n * Apply the given update to the record with the specified primary key.\n * Internal method used by Adapter#update.\n *\n * @method MongoDBAdapter#_update\n * @private\n * @param {Object} mapper The mapper.\n * @param {(string|number)} id The primary key of the record to be updated.\n * @param {Object} props The update to apply to the record.\n * @param {Object} [opts] Configuration options.\n * @return {Promise}\n */\n _update (mapper, id, props, opts) {\n const self = this\n props || (props = {})\n opts || (opts = {})\n const updateOpts = self.getOpt('updateOpts', opts)\n\n return self.find(mapper, id, { raw: false }).then(function (record) {\n if (!record) {\n throw new Error('Not Found')\n }\n return self.getClient().then(function (client) {\n return new Promise(function (resolve, reject) {\n const mongoQuery = {}\n mongoQuery[mapper.idAttribute] = self.toObjectID(mapper, id)\n const collection = client.collection(mapper.table || underscore(mapper.name))\n collection[collection.updateOne ? 'updateOne' : 'update'](mongoQuery, { $set: props }, updateOpts, function (err, cursor) {\n return err ? reject(err) : resolve(cursor)\n })\n })\n })\n }).then(function (cursor) {\n return self.find(mapper, id, { raw: false }).then(function (record) {\n cursor.connection = undefined\n return [record, cursor]\n })\n })\n },\n\n /**\n * Apply the given update to all records that match the selection query.\n *\n * @method MongoDBAdapter#updateAll\n * @param {Object} mapper The mapper.\n * @param {Object} props The update to apply to the selected records.\n * @param {Object} [query] Selection query.\n * @param {Object} [opts] Configuration options.\n * @param {boolean} [opts.raw=false] Whether to return a more detailed\n * response object.\n * @param {Object} [opts.updateOpts] Options to pass to collection#update.\n * @return {Promise}\n */\n\n /**\n * Apply the given update to all records that match the selection query.\n * Internal method used by Adapter#updateAll.\n *\n * @method MongoDBAdapter#_updateAll\n * @private\n * @param {Object} mapper The mapper.\n * @param {Object} props The update to apply to the selected records.\n * @param {Object} [query] Selection query.\n * @param {Object} [opts] Configuration options.\n * @return {Promise}\n */\n _updateAll (mapper, props, query, opts) {\n const self = this\n props || (props = {})\n query || (query = {})\n opts || (opts = {})\n let ids\n const updateOpts = self.getOpt('updateOpts', opts)\n updateOpts.multi = true\n\n return Promise.all([\n self.findAll(mapper, query, { raw: false }),\n self.getClient()\n ]).then(function (results) {\n let [records, client] = results\n const queryOptions = self.getQueryOptions(mapper, query)\n const mongoQuery = self.getQuery(mapper, query)\n\n queryOptions.$set = props\n ids = records.map(function (record) {\n return self.toObjectID(mapper, record[mapper.idAttribute])\n })\n\n return new Promise(function (resolve, reject) {\n const collection = client.collection(mapper.table || underscore(mapper.name))\n collection[collection.updateMany ? 'updateMany' : 'update'](mongoQuery, queryOptions, updateOpts, function (err, cursor) {\n return err ? reject(err) : resolve(cursor)\n })\n })\n }).then(function (cursor) {\n const query = {}\n query[mapper.idAttribute] = {\n 'in': ids\n }\n return self.findAll(mapper, query, { raw: false }).then(function (records) {\n cursor.connection = undefined\n return [records, cursor]\n })\n })\n },\n\n /**\n * Return a Promise that resolves to a reference to the MongoDB client being\n * used by this adapter.\n *\n * Useful when you need to do anything custom with the MongoDB client library.\n *\n * @method MongoDBAdapter#getClient\n * @return {Object} MongoDB client.\n */\n getClient () {\n return this.client\n },\n\n /**\n * Map filtering params in a selection query to MongoDB a filtering object.\n *\n * Handles the following:\n *\n * - where\n * - and bunch of filtering operators\n *\n * @method MongoDBAdapter#getQuery\n * @return {Object}\n */\n getQuery (mapper, query) {\n query = utils.plainCopy(query || {})\n query.where || (query.where = {})\n\n utils.forOwn(query, function (config, keyword) {\n if (reserved.indexOf(keyword) === -1) {\n if (utils.isObject(config)) {\n query.where[keyword] = config\n } else {\n query.where[keyword] = {\n '==': config\n }\n }\n delete query[keyword]\n }\n })\n\n let mongoQuery = {}\n\n if (Object.keys(query.where).length !== 0) {\n utils.forOwn(query.where, function (criteria, field) {\n if (!utils.isObject(criteria)) {\n query.where[field] = {\n '==': criteria\n }\n }\n utils.forOwn(criteria, function (v, op) {\n if (op === '==' || op === '===' || op === 'contains') {\n mongoQuery[field] = v\n } else if (op === '!=' || op === '!==' || op === 'notContains') {\n mongoQuery[field] = mongoQuery[field] || {}\n mongoQuery[field].$ne = v\n } else if (op === '>') {\n mongoQuery[field] = mongoQuery[field] || {}\n mongoQuery[field].$gt = v\n } else if (op === '>=') {\n mongoQuery[field] = mongoQuery[field] || {}\n mongoQuery[field].$gte = v\n } else if (op === '<') {\n mongoQuery[field] = mongoQuery[field] || {}\n mongoQuery[field].$lt = v\n } else if (op === '<=') {\n mongoQuery[field] = mongoQuery[field] || {}\n mongoQuery[field].$lte = v\n } else if (op === 'in') {\n mongoQuery[field] = mongoQuery[field] || {}\n mongoQuery[field].$in = v\n } else if (op === 'notIn') {\n mongoQuery[field] = mongoQuery[field] || {}\n mongoQuery[field].$nin = v\n } else if (op === '|==' || op === '|===' || op === '|contains') {\n mongoQuery.$or = mongoQuery.$or || []\n let orEqQuery = {}\n orEqQuery[field] = v\n mongoQuery.$or.push(orEqQuery)\n } else if (op === '|!=' || op === '|!==' || op === '|notContains') {\n mongoQuery.$or = mongoQuery.$or || []\n let orNeQuery = {}\n orNeQuery[field] = {\n '$ne': v\n }\n mongoQuery.$or.push(orNeQuery)\n } else if (op === '|>') {\n mongoQuery.$or = mongoQuery.$or || []\n let orGtQuery = {}\n orGtQuery[field] = {\n '$gt': v\n }\n mongoQuery.$or.push(orGtQuery)\n } else if (op === '|>=') {\n mongoQuery.$or = mongoQuery.$or || []\n let orGteQuery = {}\n orGteQuery[field] = {\n '$gte': v\n }\n mongoQuery.$or.push(orGteQuery)\n } else if (op === '|<') {\n mongoQuery.$or = mongoQuery.$or || []\n let orLtQuery = {}\n orLtQuery[field] = {\n '$lt': v\n }\n mongoQuery.$or.push(orLtQuery)\n } else if (op === '|<=') {\n mongoQuery.$or = mongoQuery.$or || []\n let orLteQuery = {}\n orLteQuery[field] = {\n '$lte': v\n }\n mongoQuery.$or.push(orLteQuery)\n } else if (op === '|in') {\n mongoQuery.$or = mongoQuery.$or || []\n let orInQuery = {}\n orInQuery[field] = {\n '$in': v\n }\n mongoQuery.$or.push(orInQuery)\n } else if (op === '|notIn') {\n mongoQuery.$or = mongoQuery.$or || []\n let orNinQuery = {}\n orNinQuery[field] = {\n '$nin': v\n }\n mongoQuery.$or.push(orNinQuery)\n }\n })\n })\n }\n\n return mongoQuery\n },\n\n /**\n * Map non-filtering params in a selection query to MongoDB query options.\n *\n * Handles the following:\n *\n * - limit\n * - skip/offset\n * - orderBy/sort\n *\n * @method MongoDBAdapter#getQueryOptions\n * @return {Object}\n */\n getQueryOptions (mapper, query) {\n query = utils.plainCopy(query || {})\n query.orderBy = query.orderBy || query.sort\n query.skip = query.skip || query.offset\n\n let queryOptions = {}\n\n if (query.orderBy) {\n if (utils.isString(query.orderBy)) {\n query.orderBy = [\n [query.orderBy, 'asc']\n ]\n }\n for (var i = 0; i < query.orderBy.length; i++) {\n if (utils.isString(query.orderBy[i])) {\n query.orderBy[i] = [query.orderBy[i], 'asc']\n }\n }\n queryOptions.sort = query.orderBy\n }\n\n if (query.skip) {\n queryOptions.skip = +query.skip\n }\n\n if (query.limit) {\n queryOptions.limit = +query.limit\n }\n\n return queryOptions\n },\n\n /**\n * Turn an _id into an ObjectID if it isn't already an ObjectID.\n *\n * @method MongoDBAdapter#toObjectID\n * @return {*}\n */\n toObjectID (mapper, id) {\n if (id !== undefined && mapper.idAttribute === '_id' && typeof id === 'string' && ObjectID.isValid(id) && !(id instanceof ObjectID)) {\n return new ObjectID(id)\n }\n return id\n },\n\n /**\n * Return the foreignKey from the given record for the provided relationship.\n *\n * @method MongoDBAdapter#makeBelongsToForeignKey\n * @return {*}\n */\n makeBelongsToForeignKey (mapper, def, record) {\n return this.toObjectID(def.getRelation(), Adapter.prototype.makeBelongsToForeignKey.call(this, mapper, def, record))\n },\n\n /**\n * Return the localKeys from the given record for the provided relationship.\n *\n * Override with care.\n *\n * @method MongoDBAdapter#makeHasManyLocalKeys\n * @return {*}\n */\n makeHasManyLocalKeys (mapper, def, record) {\n const self = this\n const relatedMapper = def.getRelation()\n const localKeys = Adapter.prototype.makeHasManyLocalKeys.call(self, mapper, def, record)\n return localKeys.map(function (key) {\n return self.toObjectID(relatedMapper, key)\n })\n },\n\n /**\n * Not supported.\n *\n * @method MongoDBAdapter#updateMany\n */\n updateMany () {\n throw new Error('not supported!')\n }\n})\n\n/**\n * Details of the current version of the `js-data-mongodb` module.\n *\n * @name module:js-data-mongodb.version\n * @type {Object}\n * @property {string} version.full The full semver value.\n * @property {number} version.major The major version number.\n * @property {number} version.minor The minor version number.\n * @property {number} version.patch The patch version number.\n * @property {(string|boolean)} version.alpha The alpha version value,\n * otherwise `false` if the current version is not alpha.\n * @property {(string|boolean)} version.beta The beta version value,\n * otherwise `false` if the current version is not beta.\n */\nexport const version = '<%= version %>'\n\nexport default MongoDBAdapter\n"],"names":["utils","Adapter","reserved","ObjectID"],"mappings":"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"} \ No newline at end of file diff --git a/mocha.start.js b/mocha.start.js index cac2b0f..009faab 100644 --- a/mocha.start.js +++ b/mocha.start.js @@ -6,9 +6,11 @@ require('babel-polyfill') var JSData = require('js-data') var JSDataAdapterTests = require('js-data-adapter-tests') -var MongoDBAdapter = require('./') +var JSDataMongoDB = require('./') +var version = JSDataMongoDB.version +var MongoDBAdapter = JSDataMongoDB.MongoDBAdapter -global.assert = JSDataAdapterTests.assert +var assert = global.assert = JSDataAdapterTests.assert global.sinon = JSDataAdapterTests.sinon JSDataAdapterTests.init({ @@ -40,3 +42,8 @@ JSDataAdapterTests.init({ }) require('./test/find.test') + +describe('exports', function () { + assert(version) + assert(version.full) +}) diff --git a/package.json b/package.json index 4720ddc..e2dc247 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "js-data-mongodb", "description": "MongoDB adapter for js-data.", - "version": "1.0.0-alpha.6", + "version": "1.0.0-beta.1", "homepage": "https://github.com/js-data/js-data-mongodb", "repository": { "type": "git", @@ -10,6 +10,13 @@ "author": "js-data-mongodb project authors", "license": "MIT", "main": "./dist/js-data-mongodb.js", + "typings": "./dist/js-data-mongodb.d.ts", + "files": [ + "dist/", + "src/", + "AUTHORS", + "CONTRIBUTORS" + ], "keywords": [ "data", "datastore", @@ -29,46 +36,42 @@ "after", "beforeEach", "afterEach" - ] + ], + "ignore": ["dist/"] + }, + "babel": { + "presets": ["es2015-rollup"] }, "scripts": { - "lint": "repo-tools lint src/**/*.js mocha.start.js test/**/*.js", - "bundle": "rollup -c rollup.config.js -f cjs -o dist/js-data-mongodb.js -m dist/js-data-mongodb.js.map src/index.js", - "doc": "jsdoc -c conf.json src node_modules/js-data-adapter/src && node scripts/cleanup.js", + "lint": "repo-tools lint \"**/*.js\"", + "bundle": "rollup -c rollup.config.js -f cjs -o dist/js-data-mongodb.js -m dist/js-data-mongodb.js.map src/index.js && repo-tools write-version dist/js-data-mongodb.js", + "doc": "jsdoc -c conf.json src node_modules/js-data-adapter/src", "watch": "watch \"npm run bundle\" src/", "build": "npm run lint && npm run bundle", "mocha": "mocha -t 20000 -R dot -r source-map-support/register mocha.start.js", "cover": "istanbul cover --hook-run-in-context node_modules/mocha/bin/_mocha -- -t 20000 -R dot -r source-map-support/register mocha.start.js", "test": "npm run build && npm run cover", - "repo-tools": "repo-tools updates && repo-tools changelog && repo-tools authors", - "release": "npm test && npm run doc && npm run repo-tools", - "ci": "npm run test && cat coverage/lcov.info | coveralls || true" + "release": "npm test && npm run doc && repo-tools updates && repo-tools changelog && repo-tools authors", + "ci": "npm run test && cat coverage/lcov.info | codecov" }, "dependencies": { - "js-data-adapter": "0.2.4", - "mout": "0.12.0" + "js-data-adapter": "~0.6.1", + "mout": "1.0.0" }, "peerDependencies": { "bson": "^0.4.x || ^0.3.x", - "js-data": "^3.0.0-alpha.19", + "js-data": "^3.0.0-beta.3", "mongodb": ">=1.3.x" }, "devDependencies": { - "babel-core": "6.7.2", - "babel-polyfill": "6.7.2", + "babel-polyfill": "6.7.4", "babel-preset-es2015-rollup": "1.1.1", - "chai": "3.5.0", - "coveralls": "2.11.8", - "ink-docstrap": "1.1.4", - "istanbul": "0.4.2", + "istanbul": "0.4.3", "js-data-adapter-tests": "^2.0.0-alpha.16", - "js-data-repo-tools": "0.2.0", - "jsdoc": "3.4.0", - "mocha": "2.4.5", - "rollup": "0.25.4", + "js-data-repo-tools": "0.5.0", + "rollup": "0.26.1", "rollup-plugin-babel": "2.4.0", - "sinon": "1.17.3", "source-map-support": "0.4.0", - "watch": "0.17.1" + "watch": "0.18.0" } } diff --git a/rollup.config.js b/rollup.config.js index 56e61c4..af48aaa 100644 --- a/rollup.config.js +++ b/rollup.config.js @@ -2,6 +2,8 @@ var babel = require('rollup-plugin-babel') module.exports = { plugins: [ - babel() + babel({ + exclude: 'node_modules/**' + }) ] } diff --git a/scripts/AUTHORS b/scripts/AUTHORS deleted file mode 100644 index 2858588..0000000 --- a/scripts/AUTHORS +++ /dev/null @@ -1,7 +0,0 @@ -# This is the official list of js-data-mongodb project authors. -# -# This file is controlled by scripts/authors.js -# -# Names are formatted as: -# # commits Name or Organization -# The email address is not required for organizations. diff --git a/scripts/CONTRIBUTORS b/scripts/CONTRIBUTORS deleted file mode 100644 index b22007d..0000000 --- a/scripts/CONTRIBUTORS +++ /dev/null @@ -1,6 +0,0 @@ -# People who have contributed to the js-data-mongodb project. -# -# This file is controlled by scripts/authors.js -# -# Names should be added to this file as: -# [commit count] Name diff --git a/scripts/authors.js b/scripts/authors.js deleted file mode 100644 index 82a856d..0000000 --- a/scripts/authors.js +++ /dev/null @@ -1,45 +0,0 @@ -var fs = require('fs') -var exec = require('child_process').exec - -console.log('Writing AUTHORS file...') - -var authorsFile = fs.readFileSync(__dirname + '/AUTHORS', { - encoding: 'utf-8' -}) -var contributorsFile = fs.readFileSync(__dirname + '/CONTRIBUTORS', { - encoding: 'utf-8' -}) - -var tty = process.platform === 'win32' ? 'CON' : '/dev/tty'; - -exec('git shortlog -s -e < ' + tty, function (err, stdout, stderr) { - if (err) { - console.error(err) - process.exit(-1) - } else { - var lines = stdout.split('\n') - var countsAndNames = lines.map(function (line) { - return line.split('\t') - }) - var names = countsAndNames.map(function (pair) { - return pair[1] - }) - - // Add to or otherwise modify "names" if necessary - - fs.writeFileSync(__dirname + '/../AUTHORS', authorsFile + names.join('\n'), { - encoding: 'utf-8' - }) - console.log('Done!') - console.log('Writing CONTRIBUTORS file...') - - names = lines - - // Add to or otherwise modify "names" if necessary - - fs.writeFileSync(__dirname + '/../CONTRIBUTORS', contributorsFile + names.join('\n'), { - encoding: 'utf-8' - }) - console.log('Done!') - } -}) diff --git a/scripts/cleanup.js b/scripts/cleanup.js deleted file mode 100644 index d0829a4..0000000 --- a/scripts/cleanup.js +++ /dev/null @@ -1,25 +0,0 @@ -var fs = require('fs') - -var pkg = require('../package.json') - -var path = './doc/js-data-mongodb/' + pkg.version + '/styles/' - -var files = fs.readdirSync(path) -files.forEach(function (file) { - if (file.indexOf('site') === 0) { - if (file.indexOf('lumen') === -1 && file.indexOf('dibs') === -1) { - fs.unlinkSync(path + file) - } - } -}) - -path = './doc/js-data-mongodb/' + pkg.version - -files = fs.readdirSync(path) -files.forEach(function (file) { - if (file.indexOf('.html') === file.length - 5) { - var content = fs.readFileSync(path + '/' + file, { encoding: 'utf8' }) - content = content.replace(/\/home\/ubuntu\/workspace\//gi, '') - fs.writeFileSync(path + '/' + file, content, { encoding: 'utf8' }) - } -}) diff --git a/src/index.js b/src/index.js index 33a5bb3..c17b962 100644 --- a/src/index.js +++ b/src/index.js @@ -1,8 +1,8 @@ import {MongoClient} from 'mongodb' import {ObjectID} from 'bson' import {utils} from 'js-data' -import Adapter from 'js-data-adapter' import { + Adapter, reserved } from 'js-data-adapter' import underscore from 'mout/string/underscore' @@ -62,23 +62,20 @@ const REMOVE_OPTS_DEFAULTS = {} * * @class MongoDBAdapter * @extends Adapter - * @param {Object} [opts] Configuration opts. - * @param {boolean} [opts.debug=false] Whether to log debugging information. - * @param {Object} [opts.countOpts] Options to pass to collection#count. - * @param {Object} [opts.findOpts] Options to pass to collection#find. - * @param {Object} [opts.findOneOpts] Options to pass to collection#findOne. - * @param {Object} [opts.insertOpts] Options to pass to collection#insert. - * @param {Object} [opts.insertManyOpts] Options to pass to - * collection#insertMany. - * @param {boolean} [opts.raw=false] Whether to return detailed result objects - * instead of just record data. - * @param {Object} [opts.removeOpts] Options to pass to collection#remove. - * @param {boolean} [opts.translateId=true] Convert ObjectIDs to strings when - * pulling records out of the database. - * @param {Object} [opts.updateOpts] Options to pass to collection#update. - * @param {string} [opts.uri="mongodb://localhost:27017"] MongoDB URI. + * @param {Object} [opts] Configuration options. + * @param {boolean} [opts.debug=false] See {@link Adapter#debug}. + * @param {Object} [opts.countOpts] See {@link MongoDBAdapter#countOpts}. + * @param {Object} [opts.findOpts] See {@link MongoDBAdapter#findOpts}. + * @param {Object} [opts.findOneOpts] See {@link MongoDBAdapter#findOneOpts}. + * @param {Object} [opts.insertOpts] See {@link MongoDBAdapter#insertOpts}. + * @param {Object} [opts.insertManyOpts] See {@link MongoDBAdapter#insertManyOpts}. + * @param {boolean} [opts.raw=false] See {@link Adapter#raw}. + * @param {Object} [opts.removeOpts] See {@link MongoDBAdapter#removeOpts}. + * @param {boolean} [opts.translateId=true] See {@link MongoDBAdapter#translateId}. + * @param {Object} [opts.updateOpts] See {@link MongoDBAdapter#updateOpts}. + * @param {string} [opts.uri="mongodb://localhost:27017"] See {@link MongoDBAdapter#uri}. */ -function MongoDBAdapter (opts) { +export function MongoDBAdapter (opts) { const self = this utils.classCallCheck(self, MongoDBAdapter) opts || (opts = {}) @@ -190,13 +187,24 @@ Object.defineProperty(MongoDBAdapter, '__super__', { /** * Alternative to ES6 class syntax for extending `MongoDBAdapter`. * - * @name MongoDBAdapter.extend - * @method + * @example Using the ES2015 class syntax. + * class MyMongoDBAdapter extends MongoDBAdapter {...} + * const adapter = new MyMongoDBAdapter() + * + * @example Using {@link MongoDBAdapter.extend}. + * var instanceProps = {...} + * var classProps = {...} + * + * var MyMongoDBAdapter = MongoDBAdapter.extend(instanceProps, classProps) + * var adapter = new MyMongoDBAdapter() + * + * @method MongoDBAdapter.extend + * @static * @param {Object} [instanceProps] Properties that will be added to the - * prototype of the MongoDBAdapter. + * prototype of the subclass. * @param {Object} [classProps] Properties that will be added as static - * properties to the MongoDBAdapter itself. - * @return {Object} MongoDBAdapter of `MongoDBAdapter`. + * properties to the subclass itself. + * @return {Object} Subclass of `MongoDBAdapter`. */ MongoDBAdapter.extend = utils.extend @@ -204,8 +212,7 @@ utils.addHiddenPropsToTarget(MongoDBAdapter.prototype, { /** * Translate ObjectIDs to strings. * - * @name MongoDBAdapter#_translateId - * @method + * @method MongoDBAdapter#_translateId * @return {*} */ _translateId (r, opts) { @@ -227,8 +234,7 @@ utils.addHiddenPropsToTarget(MongoDBAdapter.prototype, { /** * Retrieve the number of records that match the selection query. * - * @name MongoDBAdapter#count - * @method + * @method MongoDBAdapter#count * @param {Object} mapper The mapper. * @param {Object} query Selection query. * @param {Object} [opts] Configuration options. @@ -243,8 +249,7 @@ utils.addHiddenPropsToTarget(MongoDBAdapter.prototype, { * Retrieve the records that match the selection query. Internal method used * by Adapter#count. * - * @name MongoDBAdapter#_count - * @method + * @method MongoDBAdapter#_count * @private * @param {Object} mapper The mapper. * @param {Object} query Selection query. @@ -271,8 +276,7 @@ utils.addHiddenPropsToTarget(MongoDBAdapter.prototype, { /** * Create a new record. * - * @name MongoDBAdapter#create - * @method + * @method MongoDBAdapter#create * @param {Object} mapper The mapper. * @param {Object} props The record to be created. * @param {Object} [opts] Configuration options. @@ -284,8 +288,7 @@ utils.addHiddenPropsToTarget(MongoDBAdapter.prototype, { /** * Create a new record. Internal method used by Adapter#create. * - * @name MongoDBAdapter#_create - * @method + * @method MongoDBAdapter#_create * @private * @param {Object} mapper The mapper. * @param {Object} props The record to be created. @@ -321,8 +324,7 @@ utils.addHiddenPropsToTarget(MongoDBAdapter.prototype, { /** * Create multiple records in a single batch. * - * @name MongoDBAdapter#createMany - * @method + * @method MongoDBAdapter#createMany * @param {Object} mapper The mapper. * @param {Object} props The records to be created. * @param {Object} [opts] Configuration options. @@ -337,8 +339,7 @@ utils.addHiddenPropsToTarget(MongoDBAdapter.prototype, { * Create multiple records in a single batch. Internal method used by * Adapter#createMany. * - * @name MongoDBAdapter#_createMany - * @method + * @method MongoDBAdapter#_createMany * @private * @param {Object} mapper The mapper. * @param {Object} props The records to be created. @@ -373,8 +374,7 @@ utils.addHiddenPropsToTarget(MongoDBAdapter.prototype, { /** * Destroy the record with the given primary key. * - * @name MongoDBAdapter#destroy - * @method + * @method MongoDBAdapter#destroy * @param {Object} mapper The mapper. * @param {(string|number)} id Primary key of the record to destroy. * @param {Object} [opts] Configuration options. @@ -388,8 +388,7 @@ utils.addHiddenPropsToTarget(MongoDBAdapter.prototype, { * Destroy the record with the given primary key. Internal method used by * Adapter#destroy. * - * @name MongoDBAdapter#_destroy - * @method + * @method MongoDBAdapter#_destroy * @private * @param {Object} mapper The mapper. * @param {(string|number)} id Primary key of the record to destroy. @@ -418,8 +417,7 @@ utils.addHiddenPropsToTarget(MongoDBAdapter.prototype, { /** * Destroy the records that match the selection query. * - * @name MongoDBAdapter#destroyAll - * @method + * @method MongoDBAdapter#destroyAll * @param {Object} mapper the mapper. * @param {Object} [query] Selection query. * @param {Object} [query.where] Filtering criteria. @@ -439,8 +437,7 @@ utils.addHiddenPropsToTarget(MongoDBAdapter.prototype, { * Destroy the records that match the selection query. Internal method used by * Adapter#destroyAll. * - * @name MongoDBAdapter#_destroyAll - * @method + * @method MongoDBAdapter#_destroyAll * @private * @param {Object} mapper the mapper. * @param {Object} [query] Selection query. @@ -471,8 +468,7 @@ utils.addHiddenPropsToTarget(MongoDBAdapter.prototype, { /** * Retrieve the record with the given primary key. * - * @name MongoDBAdapter#find - * @method + * @method MongoDBAdapter#find * @param {Object} mapper The mapper. * @param {(string|number)} id Primary key of the record to retrieve. * @param {Object} [opts] Configuration options. @@ -487,8 +483,7 @@ utils.addHiddenPropsToTarget(MongoDBAdapter.prototype, { * Retrieve the record with the given primary key. Internal method used by * Adapter#find. * - * @name MongoDBAdapter#_find - * @method + * @method MongoDBAdapter#_find * @private * @param {Object} mapper The mapper. * @param {(string|number)} id Primary key of the record to retrieve. @@ -522,8 +517,7 @@ utils.addHiddenPropsToTarget(MongoDBAdapter.prototype, { /** * Retrieve the records that match the selection query. * - * @name MongoDBAdapter#findAll - * @method + * @method MongoDBAdapter#findAll * @param {Object} mapper The mapper. * @param {Object} query Selection query. * @param {Object} [opts] Configuration options. @@ -538,8 +532,7 @@ utils.addHiddenPropsToTarget(MongoDBAdapter.prototype, { * Retrieve the records that match the selection query. Internal method used * by Adapter#findAll. * - * @name MongoDBAdapter#_findAll - * @method + * @method MongoDBAdapter#_findAll * @private * @param {Object} mapper The mapper. * @param {Object} query Selection query. @@ -570,8 +563,7 @@ utils.addHiddenPropsToTarget(MongoDBAdapter.prototype, { /** * Apply the given update to the record with the specified primary key. * - * @name MongoDBAdapter#update - * @method + * @method MongoDBAdapter#update * @param {Object} mapper The mapper. * @param {(string|number)} id The primary key of the record to be updated. * @param {Object} props The update to apply to the record. @@ -586,8 +578,7 @@ utils.addHiddenPropsToTarget(MongoDBAdapter.prototype, { * Apply the given update to the record with the specified primary key. * Internal method used by Adapter#update. * - * @name MongoDBAdapter#_update - * @method + * @method MongoDBAdapter#_update * @private * @param {Object} mapper The mapper. * @param {(string|number)} id The primary key of the record to be updated. @@ -626,8 +617,7 @@ utils.addHiddenPropsToTarget(MongoDBAdapter.prototype, { /** * Apply the given update to all records that match the selection query. * - * @name MongoDBAdapter#updateAll - * @method + * @method MongoDBAdapter#updateAll * @param {Object} mapper The mapper. * @param {Object} props The update to apply to the selected records. * @param {Object} [query] Selection query. @@ -642,8 +632,7 @@ utils.addHiddenPropsToTarget(MongoDBAdapter.prototype, { * Apply the given update to all records that match the selection query. * Internal method used by Adapter#updateAll. * - * @name MongoDBAdapter#_updateAll - * @method + * @method MongoDBAdapter#_updateAll * @private * @param {Object} mapper The mapper. * @param {Object} props The update to apply to the selected records. @@ -697,8 +686,7 @@ utils.addHiddenPropsToTarget(MongoDBAdapter.prototype, { * * Useful when you need to do anything custom with the MongoDB client library. * - * @name MongoDBAdapter#getClient - * @method + * @method MongoDBAdapter#getClient * @return {Object} MongoDB client. */ getClient () { @@ -713,8 +701,7 @@ utils.addHiddenPropsToTarget(MongoDBAdapter.prototype, { * - where * - and bunch of filtering operators * - * @name MongoDBAdapter#getQuery - * @method + * @method MongoDBAdapter#getQuery * @return {Object} */ getQuery (mapper, query) { @@ -838,8 +825,7 @@ utils.addHiddenPropsToTarget(MongoDBAdapter.prototype, { * - skip/offset * - orderBy/sort * - * @name MongoDBAdapter#getQueryOptions - * @method + * @method MongoDBAdapter#getQueryOptions * @return {Object} */ getQueryOptions (mapper, query) { @@ -877,8 +863,7 @@ utils.addHiddenPropsToTarget(MongoDBAdapter.prototype, { /** * Turn an _id into an ObjectID if it isn't already an ObjectID. * - * @name MongoDBAdapter#toObjectID - * @method + * @method MongoDBAdapter#toObjectID * @return {*} */ toObjectID (mapper, id) { @@ -891,8 +876,7 @@ utils.addHiddenPropsToTarget(MongoDBAdapter.prototype, { /** * Return the foreignKey from the given record for the provided relationship. * - * @name MongoDBAdapter#makeBelongsToForeignKey - * @method + * @method MongoDBAdapter#makeBelongsToForeignKey * @return {*} */ makeBelongsToForeignKey (mapper, def, record) { @@ -904,8 +888,7 @@ utils.addHiddenPropsToTarget(MongoDBAdapter.prototype, { * * Override with care. * - * @name MongoDBAdapter#makeHasManyLocalKeys - * @method + * @method MongoDBAdapter#makeHasManyLocalKeys * @return {*} */ makeHasManyLocalKeys (mapper, def, record) { @@ -920,12 +903,27 @@ utils.addHiddenPropsToTarget(MongoDBAdapter.prototype, { /** * Not supported. * - * @name MongoDBAdapter#updateMany - * @method + * @method MongoDBAdapter#updateMany */ updateMany () { throw new Error('not supported!') } }) -module.exports = MongoDBAdapter +/** + * Details of the current version of the `js-data-mongodb` module. + * + * @name module:js-data-mongodb.version + * @type {Object} + * @property {string} version.full The full semver value. + * @property {number} version.major The major version number. + * @property {number} version.minor The minor version number. + * @property {number} version.patch The patch version number. + * @property {(string|boolean)} version.alpha The alpha version value, + * otherwise `false` if the current version is not alpha. + * @property {(string|boolean)} version.beta The beta version value, + * otherwise `false` if the current version is not beta. + */ +export const version = '<%= version %>' + +export default MongoDBAdapter diff --git a/typings.json b/typings.json new file mode 100644 index 0000000..e3b0400 --- /dev/null +++ b/typings.json @@ -0,0 +1,8 @@ +{ + "name": "js-data-mongodb", + "version": false, + "main": "./dist/js-data-mongodb.d.ts", + "ambientDependencies": { + "es6-shim": "registry:dt/es6-shim" + } +} From 6654b6ae5795ca04f3d857dec53670506e342b5b Mon Sep 17 00:00:00 2001 From: Jason Dobry Date: Sat, 30 Apr 2016 13:40:45 -0700 Subject: [PATCH 12/36] Tweak build --- circle.yml | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/circle.yml b/circle.yml index b285e56..79c7241 100644 --- a/circle.yml +++ b/circle.yml @@ -1,7 +1,10 @@ machine: node: version: 4.1.0 - +dependencies: + pre: + - npm install -g npm + - npm install js-data@^3.0.0-beta.3 mongodb bson test: override: - npm run ci From 5fe2b333254b946410e559df686872cb96a510b7 Mon Sep 17 00:00:00 2001 From: Jason Dobry Date: Sat, 30 Apr 2016 13:58:42 -0700 Subject: [PATCH 13/36] Move dist/ files to another branch --- .gitignore | 2 + dist/js-data-mongodb.js | 997 ------------------------------------ dist/js-data-mongodb.js.map | 1 - 3 files changed, 2 insertions(+), 998 deletions(-) delete mode 100644 dist/js-data-mongodb.js delete mode 100644 dist/js-data-mongodb.js.map diff --git a/.gitignore b/.gitignore index 5d28049..5fefa24 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,5 @@ +dist/*.js +dist/*.map # Logs logs *.log diff --git a/dist/js-data-mongodb.js b/dist/js-data-mongodb.js deleted file mode 100644 index 29212b0..0000000 --- a/dist/js-data-mongodb.js +++ /dev/null @@ -1,997 +0,0 @@ -'use strict'; - -function _interopDefault (ex) { return (ex && (typeof ex === 'object') && 'default' in ex) ? ex['default'] : ex; } - -var mongodb = require('mongodb'); -var bson = require('bson'); -var jsData = require('js-data'); -var jsDataAdapter = require('js-data-adapter'); -var underscore = _interopDefault(require('mout/string/underscore')); - -var babelHelpers = {}; - -babelHelpers.slicedToArray = function () { - function sliceIterator(arr, i) { - var _arr = []; - var _n = true; - var _d = false; - var _e = undefined; - - try { - for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { - _arr.push(_s.value); - - if (i && _arr.length === i) break; - } - } catch (err) { - _d = true; - _e = err; - } finally { - try { - if (!_n && _i["return"]) _i["return"](); - } finally { - if (_d) throw _e; - } - } - - return _arr; - } - - return function (arr, i) { - if (Array.isArray(arr)) { - return arr; - } else if (Symbol.iterator in Object(arr)) { - return sliceIterator(arr, i); - } else { - throw new TypeError("Invalid attempt to destructure non-iterable instance"); - } - }; -}(); - -babelHelpers; - -var DEFAULTS = { - /** - * Convert ObjectIDs to strings when pulling records out of the database. - * - * @name MongoDBAdapter#translateId - * @type {boolean} - * @default true - */ - translateId: true, - - /** - * MongoDB URI. - * - * @name MongoDBAdapter#uri - * @type {string} - * @default mongodb://localhost:27017 - */ - uri: 'mongodb://localhost:27017' -}; - -var COUNT_OPTS_DEFAULTS = {}; -var FIND_OPTS_DEFAULTS = {}; -var FIND_ONE_OPTS_DEFAULTS = {}; -var INSERT_OPTS_DEFAULTS = {}; -var INSERT_MANY_OPTS_DEFAULTS = {}; -var UPDATE_OPTS_DEFAULTS = {}; -var REMOVE_OPTS_DEFAULTS = {}; - -/** - * MongoDBAdapter class. - * - * @example - * // Use Container instead of DataStore on the server - * import {Container} from 'js-data' - * import MongoDBAdapter from 'js-data-mongodb' - * - * // Create a store to hold your Mappers - * const store = new Container({ - * mapperDefaults: { - * // MongoDB uses "_id" as the primary key - * idAttribute: '_id' - * } - * }) - * - * // Create an instance of MongoDBAdapter with default settings - * const adapter = new MongoDBAdapter() - * - * // Mappers in "store" will use the MongoDB adapter by default - * store.registerAdapter('mongodb', adapter, { default: true }) - * - * // Create a Mapper that maps to a "user" collection - * store.defineMapper('user') - * - * @class MongoDBAdapter - * @extends Adapter - * @param {Object} [opts] Configuration options. - * @param {boolean} [opts.debug=false] See {@link Adapter#debug}. - * @param {Object} [opts.countOpts] See {@link MongoDBAdapter#countOpts}. - * @param {Object} [opts.findOpts] See {@link MongoDBAdapter#findOpts}. - * @param {Object} [opts.findOneOpts] See {@link MongoDBAdapter#findOneOpts}. - * @param {Object} [opts.insertOpts] See {@link MongoDBAdapter#insertOpts}. - * @param {Object} [opts.insertManyOpts] See {@link MongoDBAdapter#insertManyOpts}. - * @param {boolean} [opts.raw=false] See {@link Adapter#raw}. - * @param {Object} [opts.removeOpts] See {@link MongoDBAdapter#removeOpts}. - * @param {boolean} [opts.translateId=true] See {@link MongoDBAdapter#translateId}. - * @param {Object} [opts.updateOpts] See {@link MongoDBAdapter#updateOpts}. - * @param {string} [opts.uri="mongodb://localhost:27017"] See {@link MongoDBAdapter#uri}. - */ -function MongoDBAdapter(opts) { - var self = this; - jsData.utils.classCallCheck(self, MongoDBAdapter); - opts || (opts = {}); - if (jsData.utils.isString(opts)) { - opts = { uri: opts }; - } - jsData.utils.fillIn(opts, DEFAULTS); - jsDataAdapter.Adapter.call(self, opts); - - /** - * Default options to pass to collection#count. - * - * @name MongoDBAdapter#countOpts - * @type {Object} - * @default {} - */ - self.countOpts || (self.countOpts = {}); - jsData.utils.fillIn(self.countOpts, COUNT_OPTS_DEFAULTS); - - /** - * Default options to pass to collection#find. - * - * @name MongoDBAdapter#findOpts - * @type {Object} - * @default {} - */ - self.findOpts || (self.findOpts = {}); - jsData.utils.fillIn(self.findOpts, FIND_OPTS_DEFAULTS); - - /** - * Default options to pass to collection#findOne. - * - * @name MongoDBAdapter#findOneOpts - * @type {Object} - * @default {} - */ - self.findOneOpts || (self.findOneOpts = {}); - jsData.utils.fillIn(self.findOneOpts, FIND_ONE_OPTS_DEFAULTS); - - /** - * Default options to pass to collection#insert. - * - * @name MongoDBAdapter#insertOpts - * @type {Object} - * @default {} - */ - self.insertOpts || (self.insertOpts = {}); - jsData.utils.fillIn(self.insertOpts, INSERT_OPTS_DEFAULTS); - - /** - * Default options to pass to collection#insertMany. - * - * @name MongoDBAdapter#insertManyOpts - * @type {Object} - * @default {} - */ - self.insertManyOpts || (self.insertManyOpts = {}); - jsData.utils.fillIn(self.insertManyOpts, INSERT_MANY_OPTS_DEFAULTS); - - /** - * Default options to pass to collection#update. - * - * @name MongoDBAdapter#updateOpts - * @type {Object} - * @default {} - */ - self.updateOpts || (self.updateOpts = {}); - jsData.utils.fillIn(self.updateOpts, UPDATE_OPTS_DEFAULTS); - - /** - * Default options to pass to collection#update. - * - * @name MongoDBAdapter#removeOpts - * @type {Object} - * @default {} - */ - self.removeOpts || (self.removeOpts = {}); - jsData.utils.fillIn(self.removeOpts, REMOVE_OPTS_DEFAULTS); - - /** - * A Promise that resolves to a reference to the MongoDB client being used by - * this adapter. - * - * @name MongoDBAdapter#client - * @type {Object} - */ - self.client = new Promise(function (resolve, reject) { - mongodb.MongoClient.connect(opts.uri, function (err, db) { - return err ? reject(err) : resolve(db); - }); - }); -} - -// Setup prototype inheritance from Adapter -MongoDBAdapter.prototype = Object.create(jsDataAdapter.Adapter.prototype, { - constructor: { - value: MongoDBAdapter, - enumerable: false, - writable: true, - configurable: true - } -}); - -Object.defineProperty(MongoDBAdapter, '__super__', { - configurable: true, - value: jsDataAdapter.Adapter -}); - -/** - * Alternative to ES6 class syntax for extending `MongoDBAdapter`. - * - * @example Using the ES2015 class syntax. - * class MyMongoDBAdapter extends MongoDBAdapter {...} - * const adapter = new MyMongoDBAdapter() - * - * @example Using {@link MongoDBAdapter.extend}. - * var instanceProps = {...} - * var classProps = {...} - * - * var MyMongoDBAdapter = MongoDBAdapter.extend(instanceProps, classProps) - * var adapter = new MyMongoDBAdapter() - * - * @method MongoDBAdapter.extend - * @static - * @param {Object} [instanceProps] Properties that will be added to the - * prototype of the subclass. - * @param {Object} [classProps] Properties that will be added as static - * properties to the subclass itself. - * @return {Object} Subclass of `MongoDBAdapter`. - */ -MongoDBAdapter.extend = jsData.utils.extend; - -jsData.utils.addHiddenPropsToTarget(MongoDBAdapter.prototype, { - /** - * Translate ObjectIDs to strings. - * - * @method MongoDBAdapter#_translateId - * @return {*} - */ - - _translateId: function _translateId(r, opts) { - opts || (opts = {}); - if (this.getOpt('translateId', opts)) { - if (jsData.utils.isArray(r)) { - r.forEach(function (_r) { - var __id = _r._id ? _r._id.toString() : _r._id; - _r._id = typeof __id === 'string' ? __id : _r._id; - }); - } else if (jsData.utils.isObject(r)) { - var __id = r._id ? r._id.toString() : r._id; - r._id = typeof __id === 'string' ? __id : r._id; - } - } - return r; - }, - - - /** - * Retrieve the number of records that match the selection query. - * - * @method MongoDBAdapter#count - * @param {Object} mapper The mapper. - * @param {Object} query Selection query. - * @param {Object} [opts] Configuration options. - * @param {Object} [opts.countOpts] Options to pass to collection#count. - * @param {boolean} [opts.raw=false] Whether to return a more detailed - * response object. - * @param {string[]} [opts.with=[]] Relations to eager load. - * @return {Promise} - */ - - /** - * Retrieve the records that match the selection query. Internal method used - * by Adapter#count. - * - * @method MongoDBAdapter#_count - * @private - * @param {Object} mapper The mapper. - * @param {Object} query Selection query. - * @param {Object} [opts] Configuration options. - * @return {Promise} - */ - _count: function _count(mapper, query, opts) { - var self = this; - opts || (opts = {}); - - var countOpts = self.getOpt('countOpts', opts); - jsData.utils.fillIn(countOpts, self.getQueryOptions(mapper, query)); - var mongoQuery = self.getQuery(mapper, query); - - return self.getClient().then(function (client) { - return new Promise(function (resolve, reject) { - client.collection(mapper.table || underscore(mapper.name)).count(mongoQuery, countOpts, function (err, count) { - return err ? reject(err) : resolve([count, {}]); - }); - }); - }); - }, - - - /** - * Create a new record. - * - * @method MongoDBAdapter#create - * @param {Object} mapper The mapper. - * @param {Object} props The record to be created. - * @param {Object} [opts] Configuration options. - * @param {Object} [opts.insertOpts] Options to pass to collection#insert. - * @param {boolean} [opts.raw=false] Whether to return a more detailed - * @return {Promise} - */ - - /** - * Create a new record. Internal method used by Adapter#create. - * - * @method MongoDBAdapter#_create - * @private - * @param {Object} mapper The mapper. - * @param {Object} props The record to be created. - * @param {Object} [opts] Configuration options. - * @return {Promise} - */ - _create: function _create(mapper, props, opts) { - var self = this; - props || (props = {}); - opts || (opts = {}); - props = jsData.utils.plainCopy(props); - - var insertOpts = self.getOpt('insertOpts', opts); - - return self.getClient().then(function (client) { - return new Promise(function (resolve, reject) { - var collection = client.collection(mapper.table || underscore(mapper.name)); - var method = collection.insertOne ? 'insertOne' : 'insert'; - collection[method](props, insertOpts, function (err, cursor) { - return err ? reject(err) : resolve(cursor); - }); - }); - }).then(function (cursor) { - var record = void 0; - var r = cursor.ops ? cursor.ops : cursor; - self._translateId(r, opts); - record = jsData.utils.isArray(r) ? r[0] : r; - cursor.connection = undefined; - return [record, cursor]; - }); - }, - - - /** - * Create multiple records in a single batch. - * - * @method MongoDBAdapter#createMany - * @param {Object} mapper The mapper. - * @param {Object} props The records to be created. - * @param {Object} [opts] Configuration options. - * @param {Object} [opts.insertManyOpts] Options to pass to - * collection#insertMany. - * @param {boolean} [opts.raw=false] Whether to return a more detailed - * response object. - * @return {Promise} - */ - - /** - * Create multiple records in a single batch. Internal method used by - * Adapter#createMany. - * - * @method MongoDBAdapter#_createMany - * @private - * @param {Object} mapper The mapper. - * @param {Object} props The records to be created. - * @param {Object} [opts] Configuration options. - * @return {Promise} - */ - _createMany: function _createMany(mapper, props, opts) { - var self = this; - props || (props = {}); - opts || (opts = {}); - props = jsData.utils.plainCopy(props); - - var insertManyOpts = self.getOpt('insertManyOpts', opts); - - return self.getClient().then(function (client) { - return new Promise(function (resolve, reject) { - var collection = client.collection(mapper.table || underscore(mapper.name)); - collection.insertMany(props, insertManyOpts, function (err, cursor) { - return err ? reject(err) : resolve(cursor); - }); - }); - }).then(function (cursor) { - var records = []; - var r = cursor.ops ? cursor.ops : cursor; - self._translateId(r, opts); - records = r; - cursor.connection = undefined; - return [records, cursor]; - }); - }, - - - /** - * Destroy the record with the given primary key. - * - * @method MongoDBAdapter#destroy - * @param {Object} mapper The mapper. - * @param {(string|number)} id Primary key of the record to destroy. - * @param {Object} [opts] Configuration options. - * @param {boolean} [opts.raw=false] Whether to return a more detailed - * response object. - * @param {Object} [opts.removeOpts] Options to pass to collection#remove. - * @return {Promise} - */ - - /** - * Destroy the record with the given primary key. Internal method used by - * Adapter#destroy. - * - * @method MongoDBAdapter#_destroy - * @private - * @param {Object} mapper The mapper. - * @param {(string|number)} id Primary key of the record to destroy. - * @param {Object} [opts] Configuration options. - * @return {Promise} - */ - _destroy: function _destroy(mapper, id, opts) { - var self = this; - opts || (opts = {}); - var removeOpts = self.getOpt('removeOpts', opts); - - return self.getClient().then(function (client) { - return new Promise(function (resolve, reject) { - var mongoQuery = {}; - mongoQuery[mapper.idAttribute] = self.toObjectID(mapper, id); - var collection = client.collection(mapper.table || underscore(mapper.name)); - collection[collection.deleteOne ? 'deleteOne' : 'remove'](mongoQuery, removeOpts, function (err, cursor) { - return err ? reject(err) : resolve(cursor); - }); - }); - }).then(function (cursor) { - return [undefined, cursor]; - }); - }, - - - /** - * Destroy the records that match the selection query. - * - * @method MongoDBAdapter#destroyAll - * @param {Object} mapper the mapper. - * @param {Object} [query] Selection query. - * @param {Object} [query.where] Filtering criteria. - * @param {string|Array} [query.orderBy] Sorting criteria. - * @param {string|Array} [query.sort] Same as `query.sort`. - * @param {number} [query.limit] Limit results. - * @param {number} [query.skip] Offset results. - * @param {number} [query.offset] Same as `query.skip`. - * @param {Object} [opts] Configuration options. - * @param {boolean} [opts.raw=false] Whether to return a more detailed - * response object. - * @param {Object} [opts.removeOpts] Options to pass to collection#remove. - * @return {Promise} - */ - - /** - * Destroy the records that match the selection query. Internal method used by - * Adapter#destroyAll. - * - * @method MongoDBAdapter#_destroyAll - * @private - * @param {Object} mapper the mapper. - * @param {Object} [query] Selection query. - * @param {Object} [opts] Configuration options. - * @return {Promise} - */ - _destroyAll: function _destroyAll(mapper, query, opts) { - var self = this; - query || (query = {}); - opts || (opts = {}); - var removeOpts = self.getOpt('removeOpts', opts); - jsData.utils.fillIn(removeOpts, self.getQueryOptions(mapper, query)); - - return self.getClient().then(function (client) { - var mongoQuery = self.getQuery(mapper, query); - return new Promise(function (resolve, reject) { - var collection = client.collection(mapper.table || underscore(mapper.name)); - collection[collection.deleteMany ? 'deleteMany' : 'remove'](mongoQuery, removeOpts, function (err, cursor) { - return err ? reject(err) : resolve(cursor); - }); - }); - }).then(function (cursor) { - cursor.connection = undefined; - return [undefined, cursor]; - }); - }, - - - /** - * Retrieve the record with the given primary key. - * - * @method MongoDBAdapter#find - * @param {Object} mapper The mapper. - * @param {(string|number)} id Primary key of the record to retrieve. - * @param {Object} [opts] Configuration options. - * @param {Object} [opts.findOneOpts] Options to pass to collection#findOne. - * @param {boolean} [opts.raw=false] Whether to return a more detailed - * response object. - * @param {string[]} [opts.with=[]] Relations to eager load. - * @return {Promise} - */ - - /** - * Retrieve the record with the given primary key. Internal method used by - * Adapter#find. - * - * @method MongoDBAdapter#_find - * @private - * @param {Object} mapper The mapper. - * @param {(string|number)} id Primary key of the record to retrieve. - * @param {Object} [opts] Configuration options. - * @return {Promise} - */ - _find: function _find(mapper, id, opts) { - var self = this; - opts || (opts = {}); - opts.with || (opts.with = []); - - var findOneOpts = self.getOpt('findOneOpts', opts); - findOneOpts.fields || (findOneOpts.fields = {}); - - return self.getClient().then(function (client) { - return new Promise(function (resolve, reject) { - var mongoQuery = {}; - mongoQuery[mapper.idAttribute] = self.toObjectID(mapper, id); - client.collection(mapper.table || underscore(mapper.name)).findOne(mongoQuery, findOneOpts, function (err, record) { - return err ? reject(err) : resolve(record); - }); - }); - }).then(function (record) { - if (record) { - self._translateId(record, opts); - } - return [record, {}]; - }); - }, - - - /** - * Retrieve the records that match the selection query. - * - * @method MongoDBAdapter#findAll - * @param {Object} mapper The mapper. - * @param {Object} query Selection query. - * @param {Object} [opts] Configuration options. - * @param {Object} [opts.findOpts] Options to pass to collection#find. - * @param {boolean} [opts.raw=false] Whether to return a more detailed - * response object. - * @param {string[]} [opts.with=[]] Relations to eager load. - * @return {Promise} - */ - - /** - * Retrieve the records that match the selection query. Internal method used - * by Adapter#findAll. - * - * @method MongoDBAdapter#_findAll - * @private - * @param {Object} mapper The mapper. - * @param {Object} query Selection query. - * @param {Object} [opts] Configuration options. - * @return {Promise} - */ - _findAll: function _findAll(mapper, query, opts) { - var self = this; - opts || (opts = {}); - - var findOpts = self.getOpt('findOpts', opts); - jsData.utils.fillIn(findOpts, self.getQueryOptions(mapper, query)); - findOpts.fields || (findOpts.fields = {}); - var mongoQuery = self.getQuery(mapper, query); - - return self.getClient().then(function (client) { - return new Promise(function (resolve, reject) { - client.collection(mapper.table || underscore(mapper.name)).find(mongoQuery, findOpts).toArray(function (err, records) { - return err ? reject(err) : resolve(records); - }); - }); - }).then(function (records) { - self._translateId(records, opts); - return [records, {}]; - }); - }, - - - /** - * Apply the given update to the record with the specified primary key. - * - * @method MongoDBAdapter#update - * @param {Object} mapper The mapper. - * @param {(string|number)} id The primary key of the record to be updated. - * @param {Object} props The update to apply to the record. - * @param {Object} [opts] Configuration options. - * @param {boolean} [opts.raw=false] Whether to return a more detailed - * response object. - * @param {Object} [opts.updateOpts] Options to pass to collection#update. - * @return {Promise} - */ - - /** - * Apply the given update to the record with the specified primary key. - * Internal method used by Adapter#update. - * - * @method MongoDBAdapter#_update - * @private - * @param {Object} mapper The mapper. - * @param {(string|number)} id The primary key of the record to be updated. - * @param {Object} props The update to apply to the record. - * @param {Object} [opts] Configuration options. - * @return {Promise} - */ - _update: function _update(mapper, id, props, opts) { - var self = this; - props || (props = {}); - opts || (opts = {}); - var updateOpts = self.getOpt('updateOpts', opts); - - return self.find(mapper, id, { raw: false }).then(function (record) { - if (!record) { - throw new Error('Not Found'); - } - return self.getClient().then(function (client) { - return new Promise(function (resolve, reject) { - var mongoQuery = {}; - mongoQuery[mapper.idAttribute] = self.toObjectID(mapper, id); - var collection = client.collection(mapper.table || underscore(mapper.name)); - collection[collection.updateOne ? 'updateOne' : 'update'](mongoQuery, { $set: props }, updateOpts, function (err, cursor) { - return err ? reject(err) : resolve(cursor); - }); - }); - }); - }).then(function (cursor) { - return self.find(mapper, id, { raw: false }).then(function (record) { - cursor.connection = undefined; - return [record, cursor]; - }); - }); - }, - - - /** - * Apply the given update to all records that match the selection query. - * - * @method MongoDBAdapter#updateAll - * @param {Object} mapper The mapper. - * @param {Object} props The update to apply to the selected records. - * @param {Object} [query] Selection query. - * @param {Object} [opts] Configuration options. - * @param {boolean} [opts.raw=false] Whether to return a more detailed - * response object. - * @param {Object} [opts.updateOpts] Options to pass to collection#update. - * @return {Promise} - */ - - /** - * Apply the given update to all records that match the selection query. - * Internal method used by Adapter#updateAll. - * - * @method MongoDBAdapter#_updateAll - * @private - * @param {Object} mapper The mapper. - * @param {Object} props The update to apply to the selected records. - * @param {Object} [query] Selection query. - * @param {Object} [opts] Configuration options. - * @return {Promise} - */ - _updateAll: function _updateAll(mapper, props, query, opts) { - var self = this; - props || (props = {}); - query || (query = {}); - opts || (opts = {}); - var ids = void 0; - var updateOpts = self.getOpt('updateOpts', opts); - updateOpts.multi = true; - - return Promise.all([self.findAll(mapper, query, { raw: false }), self.getClient()]).then(function (results) { - var _results = babelHelpers.slicedToArray(results, 2); - - var records = _results[0]; - var client = _results[1]; - - var queryOptions = self.getQueryOptions(mapper, query); - var mongoQuery = self.getQuery(mapper, query); - - queryOptions.$set = props; - ids = records.map(function (record) { - return self.toObjectID(mapper, record[mapper.idAttribute]); - }); - - return new Promise(function (resolve, reject) { - var collection = client.collection(mapper.table || underscore(mapper.name)); - collection[collection.updateMany ? 'updateMany' : 'update'](mongoQuery, queryOptions, updateOpts, function (err, cursor) { - return err ? reject(err) : resolve(cursor); - }); - }); - }).then(function (cursor) { - var query = {}; - query[mapper.idAttribute] = { - 'in': ids - }; - return self.findAll(mapper, query, { raw: false }).then(function (records) { - cursor.connection = undefined; - return [records, cursor]; - }); - }); - }, - - - /** - * Return a Promise that resolves to a reference to the MongoDB client being - * used by this adapter. - * - * Useful when you need to do anything custom with the MongoDB client library. - * - * @method MongoDBAdapter#getClient - * @return {Object} MongoDB client. - */ - getClient: function getClient() { - return this.client; - }, - - - /** - * Map filtering params in a selection query to MongoDB a filtering object. - * - * Handles the following: - * - * - where - * - and bunch of filtering operators - * - * @method MongoDBAdapter#getQuery - * @return {Object} - */ - getQuery: function getQuery(mapper, query) { - query = jsData.utils.plainCopy(query || {}); - query.where || (query.where = {}); - - jsData.utils.forOwn(query, function (config, keyword) { - if (jsDataAdapter.reserved.indexOf(keyword) === -1) { - if (jsData.utils.isObject(config)) { - query.where[keyword] = config; - } else { - query.where[keyword] = { - '==': config - }; - } - delete query[keyword]; - } - }); - - var mongoQuery = {}; - - if (Object.keys(query.where).length !== 0) { - jsData.utils.forOwn(query.where, function (criteria, field) { - if (!jsData.utils.isObject(criteria)) { - query.where[field] = { - '==': criteria - }; - } - jsData.utils.forOwn(criteria, function (v, op) { - if (op === '==' || op === '===' || op === 'contains') { - mongoQuery[field] = v; - } else if (op === '!=' || op === '!==' || op === 'notContains') { - mongoQuery[field] = mongoQuery[field] || {}; - mongoQuery[field].$ne = v; - } else if (op === '>') { - mongoQuery[field] = mongoQuery[field] || {}; - mongoQuery[field].$gt = v; - } else if (op === '>=') { - mongoQuery[field] = mongoQuery[field] || {}; - mongoQuery[field].$gte = v; - } else if (op === '<') { - mongoQuery[field] = mongoQuery[field] || {}; - mongoQuery[field].$lt = v; - } else if (op === '<=') { - mongoQuery[field] = mongoQuery[field] || {}; - mongoQuery[field].$lte = v; - } else if (op === 'in') { - mongoQuery[field] = mongoQuery[field] || {}; - mongoQuery[field].$in = v; - } else if (op === 'notIn') { - mongoQuery[field] = mongoQuery[field] || {}; - mongoQuery[field].$nin = v; - } else if (op === '|==' || op === '|===' || op === '|contains') { - mongoQuery.$or = mongoQuery.$or || []; - var orEqQuery = {}; - orEqQuery[field] = v; - mongoQuery.$or.push(orEqQuery); - } else if (op === '|!=' || op === '|!==' || op === '|notContains') { - mongoQuery.$or = mongoQuery.$or || []; - var orNeQuery = {}; - orNeQuery[field] = { - '$ne': v - }; - mongoQuery.$or.push(orNeQuery); - } else if (op === '|>') { - mongoQuery.$or = mongoQuery.$or || []; - var orGtQuery = {}; - orGtQuery[field] = { - '$gt': v - }; - mongoQuery.$or.push(orGtQuery); - } else if (op === '|>=') { - mongoQuery.$or = mongoQuery.$or || []; - var orGteQuery = {}; - orGteQuery[field] = { - '$gte': v - }; - mongoQuery.$or.push(orGteQuery); - } else if (op === '|<') { - mongoQuery.$or = mongoQuery.$or || []; - var orLtQuery = {}; - orLtQuery[field] = { - '$lt': v - }; - mongoQuery.$or.push(orLtQuery); - } else if (op === '|<=') { - mongoQuery.$or = mongoQuery.$or || []; - var orLteQuery = {}; - orLteQuery[field] = { - '$lte': v - }; - mongoQuery.$or.push(orLteQuery); - } else if (op === '|in') { - mongoQuery.$or = mongoQuery.$or || []; - var orInQuery = {}; - orInQuery[field] = { - '$in': v - }; - mongoQuery.$or.push(orInQuery); - } else if (op === '|notIn') { - mongoQuery.$or = mongoQuery.$or || []; - var orNinQuery = {}; - orNinQuery[field] = { - '$nin': v - }; - mongoQuery.$or.push(orNinQuery); - } - }); - }); - } - - return mongoQuery; - }, - - - /** - * Map non-filtering params in a selection query to MongoDB query options. - * - * Handles the following: - * - * - limit - * - skip/offset - * - orderBy/sort - * - * @method MongoDBAdapter#getQueryOptions - * @return {Object} - */ - getQueryOptions: function getQueryOptions(mapper, query) { - query = jsData.utils.plainCopy(query || {}); - query.orderBy = query.orderBy || query.sort; - query.skip = query.skip || query.offset; - - var queryOptions = {}; - - if (query.orderBy) { - if (jsData.utils.isString(query.orderBy)) { - query.orderBy = [[query.orderBy, 'asc']]; - } - for (var i = 0; i < query.orderBy.length; i++) { - if (jsData.utils.isString(query.orderBy[i])) { - query.orderBy[i] = [query.orderBy[i], 'asc']; - } - } - queryOptions.sort = query.orderBy; - } - - if (query.skip) { - queryOptions.skip = +query.skip; - } - - if (query.limit) { - queryOptions.limit = +query.limit; - } - - return queryOptions; - }, - - - /** - * Turn an _id into an ObjectID if it isn't already an ObjectID. - * - * @method MongoDBAdapter#toObjectID - * @return {*} - */ - toObjectID: function toObjectID(mapper, id) { - if (id !== undefined && mapper.idAttribute === '_id' && typeof id === 'string' && bson.ObjectID.isValid(id) && !(id instanceof bson.ObjectID)) { - return new bson.ObjectID(id); - } - return id; - }, - - - /** - * Return the foreignKey from the given record for the provided relationship. - * - * @method MongoDBAdapter#makeBelongsToForeignKey - * @return {*} - */ - makeBelongsToForeignKey: function makeBelongsToForeignKey(mapper, def, record) { - return this.toObjectID(def.getRelation(), jsDataAdapter.Adapter.prototype.makeBelongsToForeignKey.call(this, mapper, def, record)); - }, - - - /** - * Return the localKeys from the given record for the provided relationship. - * - * Override with care. - * - * @method MongoDBAdapter#makeHasManyLocalKeys - * @return {*} - */ - makeHasManyLocalKeys: function makeHasManyLocalKeys(mapper, def, record) { - var self = this; - var relatedMapper = def.getRelation(); - var localKeys = jsDataAdapter.Adapter.prototype.makeHasManyLocalKeys.call(self, mapper, def, record); - return localKeys.map(function (key) { - return self.toObjectID(relatedMapper, key); - }); - }, - - - /** - * Not supported. - * - * @method MongoDBAdapter#updateMany - */ - updateMany: function updateMany() { - throw new Error('not supported!'); - } -}); - -/** - * Details of the current version of the `js-data-mongodb` module. - * - * @name module:js-data-mongodb.version - * @type {Object} - * @property {string} version.full The full semver value. - * @property {number} version.major The major version number. - * @property {number} version.minor The minor version number. - * @property {number} version.patch The patch version number. - * @property {(string|boolean)} version.alpha The alpha version value, - * otherwise `false` if the current version is not alpha. - * @property {(string|boolean)} version.beta The beta version value, - * otherwise `false` if the current version is not beta. - */ -var version = { - beta: 1, - full: '1.0.0-beta.1', - major: 1, - minor: 0, - patch: 0 -}; - -exports.MongoDBAdapter = MongoDBAdapter; -exports.version = version; -exports['default'] = MongoDBAdapter; -//# sourceMappingURL=js-data-mongodb.js.map \ No newline at end of file diff --git a/dist/js-data-mongodb.js.map b/dist/js-data-mongodb.js.map deleted file mode 100644 index ad73269..0000000 --- a/dist/js-data-mongodb.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"js-data-mongodb.js","sources":["../src/index.js"],"sourcesContent":["import {MongoClient} from 'mongodb'\nimport {ObjectID} from 'bson'\nimport {utils} from 'js-data'\nimport {\n Adapter,\n reserved\n} from 'js-data-adapter'\nimport underscore from 'mout/string/underscore'\n\nconst DEFAULTS = {\n /**\n * Convert ObjectIDs to strings when pulling records out of the database.\n *\n * @name MongoDBAdapter#translateId\n * @type {boolean}\n * @default true\n */\n translateId: true,\n\n /**\n * MongoDB URI.\n *\n * @name MongoDBAdapter#uri\n * @type {string}\n * @default mongodb://localhost:27017\n */\n uri: 'mongodb://localhost:27017'\n}\n\nconst COUNT_OPTS_DEFAULTS = {}\nconst FIND_OPTS_DEFAULTS = {}\nconst FIND_ONE_OPTS_DEFAULTS = {}\nconst INSERT_OPTS_DEFAULTS = {}\nconst INSERT_MANY_OPTS_DEFAULTS = {}\nconst UPDATE_OPTS_DEFAULTS = {}\nconst REMOVE_OPTS_DEFAULTS = {}\n\n/**\n * MongoDBAdapter class.\n *\n * @example\n * // Use Container instead of DataStore on the server\n * import {Container} from 'js-data'\n * import MongoDBAdapter from 'js-data-mongodb'\n *\n * // Create a store to hold your Mappers\n * const store = new Container({\n * mapperDefaults: {\n * // MongoDB uses \"_id\" as the primary key\n * idAttribute: '_id'\n * }\n * })\n *\n * // Create an instance of MongoDBAdapter with default settings\n * const adapter = new MongoDBAdapter()\n *\n * // Mappers in \"store\" will use the MongoDB adapter by default\n * store.registerAdapter('mongodb', adapter, { default: true })\n *\n * // Create a Mapper that maps to a \"user\" collection\n * store.defineMapper('user')\n *\n * @class MongoDBAdapter\n * @extends Adapter\n * @param {Object} [opts] Configuration options.\n * @param {boolean} [opts.debug=false] See {@link Adapter#debug}.\n * @param {Object} [opts.countOpts] See {@link MongoDBAdapter#countOpts}.\n * @param {Object} [opts.findOpts] See {@link MongoDBAdapter#findOpts}.\n * @param {Object} [opts.findOneOpts] See {@link MongoDBAdapter#findOneOpts}.\n * @param {Object} [opts.insertOpts] See {@link MongoDBAdapter#insertOpts}.\n * @param {Object} [opts.insertManyOpts] See {@link MongoDBAdapter#insertManyOpts}.\n * @param {boolean} [opts.raw=false] See {@link Adapter#raw}.\n * @param {Object} [opts.removeOpts] See {@link MongoDBAdapter#removeOpts}.\n * @param {boolean} [opts.translateId=true] See {@link MongoDBAdapter#translateId}.\n * @param {Object} [opts.updateOpts] See {@link MongoDBAdapter#updateOpts}.\n * @param {string} [opts.uri=\"mongodb://localhost:27017\"] See {@link MongoDBAdapter#uri}.\n */\nexport function MongoDBAdapter (opts) {\n const self = this\n utils.classCallCheck(self, MongoDBAdapter)\n opts || (opts = {})\n if (utils.isString(opts)) {\n opts = { uri: opts }\n }\n utils.fillIn(opts, DEFAULTS)\n Adapter.call(self, opts)\n\n /**\n * Default options to pass to collection#count.\n *\n * @name MongoDBAdapter#countOpts\n * @type {Object}\n * @default {}\n */\n self.countOpts || (self.countOpts = {})\n utils.fillIn(self.countOpts, COUNT_OPTS_DEFAULTS)\n\n /**\n * Default options to pass to collection#find.\n *\n * @name MongoDBAdapter#findOpts\n * @type {Object}\n * @default {}\n */\n self.findOpts || (self.findOpts = {})\n utils.fillIn(self.findOpts, FIND_OPTS_DEFAULTS)\n\n /**\n * Default options to pass to collection#findOne.\n *\n * @name MongoDBAdapter#findOneOpts\n * @type {Object}\n * @default {}\n */\n self.findOneOpts || (self.findOneOpts = {})\n utils.fillIn(self.findOneOpts, FIND_ONE_OPTS_DEFAULTS)\n\n /**\n * Default options to pass to collection#insert.\n *\n * @name MongoDBAdapter#insertOpts\n * @type {Object}\n * @default {}\n */\n self.insertOpts || (self.insertOpts = {})\n utils.fillIn(self.insertOpts, INSERT_OPTS_DEFAULTS)\n\n /**\n * Default options to pass to collection#insertMany.\n *\n * @name MongoDBAdapter#insertManyOpts\n * @type {Object}\n * @default {}\n */\n self.insertManyOpts || (self.insertManyOpts = {})\n utils.fillIn(self.insertManyOpts, INSERT_MANY_OPTS_DEFAULTS)\n\n /**\n * Default options to pass to collection#update.\n *\n * @name MongoDBAdapter#updateOpts\n * @type {Object}\n * @default {}\n */\n self.updateOpts || (self.updateOpts = {})\n utils.fillIn(self.updateOpts, UPDATE_OPTS_DEFAULTS)\n\n /**\n * Default options to pass to collection#update.\n *\n * @name MongoDBAdapter#removeOpts\n * @type {Object}\n * @default {}\n */\n self.removeOpts || (self.removeOpts = {})\n utils.fillIn(self.removeOpts, REMOVE_OPTS_DEFAULTS)\n\n /**\n * A Promise that resolves to a reference to the MongoDB client being used by\n * this adapter.\n *\n * @name MongoDBAdapter#client\n * @type {Object}\n */\n self.client = new Promise(function (resolve, reject) {\n MongoClient.connect(opts.uri, function (err, db) {\n return err ? reject(err) : resolve(db)\n })\n })\n}\n\n// Setup prototype inheritance from Adapter\nMongoDBAdapter.prototype = Object.create(Adapter.prototype, {\n constructor: {\n value: MongoDBAdapter,\n enumerable: false,\n writable: true,\n configurable: true\n }\n})\n\nObject.defineProperty(MongoDBAdapter, '__super__', {\n configurable: true,\n value: Adapter\n})\n\n/**\n * Alternative to ES6 class syntax for extending `MongoDBAdapter`.\n *\n * @example Using the ES2015 class syntax.\n * class MyMongoDBAdapter extends MongoDBAdapter {...}\n * const adapter = new MyMongoDBAdapter()\n *\n * @example Using {@link MongoDBAdapter.extend}.\n * var instanceProps = {...}\n * var classProps = {...}\n *\n * var MyMongoDBAdapter = MongoDBAdapter.extend(instanceProps, classProps)\n * var adapter = new MyMongoDBAdapter()\n *\n * @method MongoDBAdapter.extend\n * @static\n * @param {Object} [instanceProps] Properties that will be added to the\n * prototype of the subclass.\n * @param {Object} [classProps] Properties that will be added as static\n * properties to the subclass itself.\n * @return {Object} Subclass of `MongoDBAdapter`.\n */\nMongoDBAdapter.extend = utils.extend\n\nutils.addHiddenPropsToTarget(MongoDBAdapter.prototype, {\n /**\n * Translate ObjectIDs to strings.\n *\n * @method MongoDBAdapter#_translateId\n * @return {*}\n */\n _translateId (r, opts) {\n opts || (opts = {})\n if (this.getOpt('translateId', opts)) {\n if (utils.isArray(r)) {\n r.forEach(function (_r) {\n const __id = _r._id ? _r._id.toString() : _r._id\n _r._id = typeof __id === 'string' ? __id : _r._id\n })\n } else if (utils.isObject(r)) {\n const __id = r._id ? r._id.toString() : r._id\n r._id = typeof __id === 'string' ? __id : r._id\n }\n }\n return r\n },\n\n /**\n * Retrieve the number of records that match the selection query.\n *\n * @method MongoDBAdapter#count\n * @param {Object} mapper The mapper.\n * @param {Object} query Selection query.\n * @param {Object} [opts] Configuration options.\n * @param {Object} [opts.countOpts] Options to pass to collection#count.\n * @param {boolean} [opts.raw=false] Whether to return a more detailed\n * response object.\n * @param {string[]} [opts.with=[]] Relations to eager load.\n * @return {Promise}\n */\n\n /**\n * Retrieve the records that match the selection query. Internal method used\n * by Adapter#count.\n *\n * @method MongoDBAdapter#_count\n * @private\n * @param {Object} mapper The mapper.\n * @param {Object} query Selection query.\n * @param {Object} [opts] Configuration options.\n * @return {Promise}\n */\n _count (mapper, query, opts) {\n const self = this\n opts || (opts = {})\n\n const countOpts = self.getOpt('countOpts', opts)\n utils.fillIn(countOpts, self.getQueryOptions(mapper, query))\n const mongoQuery = self.getQuery(mapper, query)\n\n return self.getClient().then(function (client) {\n return new Promise(function (resolve, reject) {\n client.collection(mapper.table || underscore(mapper.name)).count(mongoQuery, countOpts, function (err, count) {\n return err ? reject(err) : resolve([count, {}])\n })\n })\n })\n },\n\n /**\n * Create a new record.\n *\n * @method MongoDBAdapter#create\n * @param {Object} mapper The mapper.\n * @param {Object} props The record to be created.\n * @param {Object} [opts] Configuration options.\n * @param {Object} [opts.insertOpts] Options to pass to collection#insert.\n * @param {boolean} [opts.raw=false] Whether to return a more detailed\n * @return {Promise}\n */\n\n /**\n * Create a new record. Internal method used by Adapter#create.\n *\n * @method MongoDBAdapter#_create\n * @private\n * @param {Object} mapper The mapper.\n * @param {Object} props The record to be created.\n * @param {Object} [opts] Configuration options.\n * @return {Promise}\n */\n _create (mapper, props, opts) {\n const self = this\n props || (props = {})\n opts || (opts = {})\n props = utils.plainCopy(props)\n\n const insertOpts = self.getOpt('insertOpts', opts)\n\n return self.getClient().then(function (client) {\n return new Promise(function (resolve, reject) {\n const collection = client.collection(mapper.table || underscore(mapper.name))\n const method = collection.insertOne ? 'insertOne' : 'insert'\n collection[method](props, insertOpts, function (err, cursor) {\n return err ? reject(err) : resolve(cursor)\n })\n })\n }).then(function (cursor) {\n let record\n let r = cursor.ops ? cursor.ops : cursor\n self._translateId(r, opts)\n record = utils.isArray(r) ? r[0] : r\n cursor.connection = undefined\n return [record, cursor]\n })\n },\n\n /**\n * Create multiple records in a single batch.\n *\n * @method MongoDBAdapter#createMany\n * @param {Object} mapper The mapper.\n * @param {Object} props The records to be created.\n * @param {Object} [opts] Configuration options.\n * @param {Object} [opts.insertManyOpts] Options to pass to\n * collection#insertMany.\n * @param {boolean} [opts.raw=false] Whether to return a more detailed\n * response object.\n * @return {Promise}\n */\n\n /**\n * Create multiple records in a single batch. Internal method used by\n * Adapter#createMany.\n *\n * @method MongoDBAdapter#_createMany\n * @private\n * @param {Object} mapper The mapper.\n * @param {Object} props The records to be created.\n * @param {Object} [opts] Configuration options.\n * @return {Promise}\n */\n _createMany (mapper, props, opts) {\n const self = this\n props || (props = {})\n opts || (opts = {})\n props = utils.plainCopy(props)\n\n const insertManyOpts = self.getOpt('insertManyOpts', opts)\n\n return self.getClient().then(function (client) {\n return new Promise(function (resolve, reject) {\n const collection = client.collection(mapper.table || underscore(mapper.name))\n collection.insertMany(props, insertManyOpts, function (err, cursor) {\n return err ? reject(err) : resolve(cursor)\n })\n })\n }).then(function (cursor) {\n let records = []\n let r = cursor.ops ? cursor.ops : cursor\n self._translateId(r, opts)\n records = r\n cursor.connection = undefined\n return [records, cursor]\n })\n },\n\n /**\n * Destroy the record with the given primary key.\n *\n * @method MongoDBAdapter#destroy\n * @param {Object} mapper The mapper.\n * @param {(string|number)} id Primary key of the record to destroy.\n * @param {Object} [opts] Configuration options.\n * @param {boolean} [opts.raw=false] Whether to return a more detailed\n * response object.\n * @param {Object} [opts.removeOpts] Options to pass to collection#remove.\n * @return {Promise}\n */\n\n /**\n * Destroy the record with the given primary key. Internal method used by\n * Adapter#destroy.\n *\n * @method MongoDBAdapter#_destroy\n * @private\n * @param {Object} mapper The mapper.\n * @param {(string|number)} id Primary key of the record to destroy.\n * @param {Object} [opts] Configuration options.\n * @return {Promise}\n */\n _destroy (mapper, id, opts) {\n const self = this\n opts || (opts = {})\n const removeOpts = self.getOpt('removeOpts', opts)\n\n return self.getClient().then(function (client) {\n return new Promise(function (resolve, reject) {\n const mongoQuery = {}\n mongoQuery[mapper.idAttribute] = self.toObjectID(mapper, id)\n const collection = client.collection(mapper.table || underscore(mapper.name))\n collection[collection.deleteOne ? 'deleteOne' : 'remove'](mongoQuery, removeOpts, function (err, cursor) {\n return err ? reject(err) : resolve(cursor)\n })\n })\n }).then(function (cursor) {\n return [undefined, cursor]\n })\n },\n\n /**\n * Destroy the records that match the selection query.\n *\n * @method MongoDBAdapter#destroyAll\n * @param {Object} mapper the mapper.\n * @param {Object} [query] Selection query.\n * @param {Object} [query.where] Filtering criteria.\n * @param {string|Array} [query.orderBy] Sorting criteria.\n * @param {string|Array} [query.sort] Same as `query.sort`.\n * @param {number} [query.limit] Limit results.\n * @param {number} [query.skip] Offset results.\n * @param {number} [query.offset] Same as `query.skip`.\n * @param {Object} [opts] Configuration options.\n * @param {boolean} [opts.raw=false] Whether to return a more detailed\n * response object.\n * @param {Object} [opts.removeOpts] Options to pass to collection#remove.\n * @return {Promise}\n */\n\n /**\n * Destroy the records that match the selection query. Internal method used by\n * Adapter#destroyAll.\n *\n * @method MongoDBAdapter#_destroyAll\n * @private\n * @param {Object} mapper the mapper.\n * @param {Object} [query] Selection query.\n * @param {Object} [opts] Configuration options.\n * @return {Promise}\n */\n _destroyAll (mapper, query, opts) {\n const self = this\n query || (query = {})\n opts || (opts = {})\n const removeOpts = self.getOpt('removeOpts', opts)\n utils.fillIn(removeOpts, self.getQueryOptions(mapper, query))\n\n return self.getClient().then(function (client) {\n const mongoQuery = self.getQuery(mapper, query)\n return new Promise(function (resolve, reject) {\n const collection = client.collection(mapper.table || underscore(mapper.name))\n collection[collection.deleteMany ? 'deleteMany' : 'remove'](mongoQuery, removeOpts, function (err, cursor) {\n return err ? reject(err) : resolve(cursor)\n })\n })\n }).then(function (cursor) {\n cursor.connection = undefined\n return [undefined, cursor]\n })\n },\n\n /**\n * Retrieve the record with the given primary key.\n *\n * @method MongoDBAdapter#find\n * @param {Object} mapper The mapper.\n * @param {(string|number)} id Primary key of the record to retrieve.\n * @param {Object} [opts] Configuration options.\n * @param {Object} [opts.findOneOpts] Options to pass to collection#findOne.\n * @param {boolean} [opts.raw=false] Whether to return a more detailed\n * response object.\n * @param {string[]} [opts.with=[]] Relations to eager load.\n * @return {Promise}\n */\n\n /**\n * Retrieve the record with the given primary key. Internal method used by\n * Adapter#find.\n *\n * @method MongoDBAdapter#_find\n * @private\n * @param {Object} mapper The mapper.\n * @param {(string|number)} id Primary key of the record to retrieve.\n * @param {Object} [opts] Configuration options.\n * @return {Promise}\n */\n _find (mapper, id, opts) {\n const self = this\n opts || (opts = {})\n opts.with || (opts.with = [])\n\n const findOneOpts = self.getOpt('findOneOpts', opts)\n findOneOpts.fields || (findOneOpts.fields = {})\n\n return self.getClient().then(function (client) {\n return new Promise(function (resolve, reject) {\n let mongoQuery = {}\n mongoQuery[mapper.idAttribute] = self.toObjectID(mapper, id)\n client.collection(mapper.table || underscore(mapper.name)).findOne(mongoQuery, findOneOpts, function (err, record) {\n return err ? reject(err) : resolve(record)\n })\n })\n }).then(function (record) {\n if (record) {\n self._translateId(record, opts)\n }\n return [record, {}]\n })\n },\n\n /**\n * Retrieve the records that match the selection query.\n *\n * @method MongoDBAdapter#findAll\n * @param {Object} mapper The mapper.\n * @param {Object} query Selection query.\n * @param {Object} [opts] Configuration options.\n * @param {Object} [opts.findOpts] Options to pass to collection#find.\n * @param {boolean} [opts.raw=false] Whether to return a more detailed\n * response object.\n * @param {string[]} [opts.with=[]] Relations to eager load.\n * @return {Promise}\n */\n\n /**\n * Retrieve the records that match the selection query. Internal method used\n * by Adapter#findAll.\n *\n * @method MongoDBAdapter#_findAll\n * @private\n * @param {Object} mapper The mapper.\n * @param {Object} query Selection query.\n * @param {Object} [opts] Configuration options.\n * @return {Promise}\n */\n _findAll (mapper, query, opts) {\n const self = this\n opts || (opts = {})\n\n const findOpts = self.getOpt('findOpts', opts)\n utils.fillIn(findOpts, self.getQueryOptions(mapper, query))\n findOpts.fields || (findOpts.fields = {})\n const mongoQuery = self.getQuery(mapper, query)\n\n return self.getClient().then(function (client) {\n return new Promise(function (resolve, reject) {\n client.collection(mapper.table || underscore(mapper.name)).find(mongoQuery, findOpts).toArray(function (err, records) {\n return err ? reject(err) : resolve(records)\n })\n })\n }).then(function (records) {\n self._translateId(records, opts)\n return [records, {}]\n })\n },\n\n /**\n * Apply the given update to the record with the specified primary key.\n *\n * @method MongoDBAdapter#update\n * @param {Object} mapper The mapper.\n * @param {(string|number)} id The primary key of the record to be updated.\n * @param {Object} props The update to apply to the record.\n * @param {Object} [opts] Configuration options.\n * @param {boolean} [opts.raw=false] Whether to return a more detailed\n * response object.\n * @param {Object} [opts.updateOpts] Options to pass to collection#update.\n * @return {Promise}\n */\n\n /**\n * Apply the given update to the record with the specified primary key.\n * Internal method used by Adapter#update.\n *\n * @method MongoDBAdapter#_update\n * @private\n * @param {Object} mapper The mapper.\n * @param {(string|number)} id The primary key of the record to be updated.\n * @param {Object} props The update to apply to the record.\n * @param {Object} [opts] Configuration options.\n * @return {Promise}\n */\n _update (mapper, id, props, opts) {\n const self = this\n props || (props = {})\n opts || (opts = {})\n const updateOpts = self.getOpt('updateOpts', opts)\n\n return self.find(mapper, id, { raw: false }).then(function (record) {\n if (!record) {\n throw new Error('Not Found')\n }\n return self.getClient().then(function (client) {\n return new Promise(function (resolve, reject) {\n const mongoQuery = {}\n mongoQuery[mapper.idAttribute] = self.toObjectID(mapper, id)\n const collection = client.collection(mapper.table || underscore(mapper.name))\n collection[collection.updateOne ? 'updateOne' : 'update'](mongoQuery, { $set: props }, updateOpts, function (err, cursor) {\n return err ? reject(err) : resolve(cursor)\n })\n })\n })\n }).then(function (cursor) {\n return self.find(mapper, id, { raw: false }).then(function (record) {\n cursor.connection = undefined\n return [record, cursor]\n })\n })\n },\n\n /**\n * Apply the given update to all records that match the selection query.\n *\n * @method MongoDBAdapter#updateAll\n * @param {Object} mapper The mapper.\n * @param {Object} props The update to apply to the selected records.\n * @param {Object} [query] Selection query.\n * @param {Object} [opts] Configuration options.\n * @param {boolean} [opts.raw=false] Whether to return a more detailed\n * response object.\n * @param {Object} [opts.updateOpts] Options to pass to collection#update.\n * @return {Promise}\n */\n\n /**\n * Apply the given update to all records that match the selection query.\n * Internal method used by Adapter#updateAll.\n *\n * @method MongoDBAdapter#_updateAll\n * @private\n * @param {Object} mapper The mapper.\n * @param {Object} props The update to apply to the selected records.\n * @param {Object} [query] Selection query.\n * @param {Object} [opts] Configuration options.\n * @return {Promise}\n */\n _updateAll (mapper, props, query, opts) {\n const self = this\n props || (props = {})\n query || (query = {})\n opts || (opts = {})\n let ids\n const updateOpts = self.getOpt('updateOpts', opts)\n updateOpts.multi = true\n\n return Promise.all([\n self.findAll(mapper, query, { raw: false }),\n self.getClient()\n ]).then(function (results) {\n let [records, client] = results\n const queryOptions = self.getQueryOptions(mapper, query)\n const mongoQuery = self.getQuery(mapper, query)\n\n queryOptions.$set = props\n ids = records.map(function (record) {\n return self.toObjectID(mapper, record[mapper.idAttribute])\n })\n\n return new Promise(function (resolve, reject) {\n const collection = client.collection(mapper.table || underscore(mapper.name))\n collection[collection.updateMany ? 'updateMany' : 'update'](mongoQuery, queryOptions, updateOpts, function (err, cursor) {\n return err ? reject(err) : resolve(cursor)\n })\n })\n }).then(function (cursor) {\n const query = {}\n query[mapper.idAttribute] = {\n 'in': ids\n }\n return self.findAll(mapper, query, { raw: false }).then(function (records) {\n cursor.connection = undefined\n return [records, cursor]\n })\n })\n },\n\n /**\n * Return a Promise that resolves to a reference to the MongoDB client being\n * used by this adapter.\n *\n * Useful when you need to do anything custom with the MongoDB client library.\n *\n * @method MongoDBAdapter#getClient\n * @return {Object} MongoDB client.\n */\n getClient () {\n return this.client\n },\n\n /**\n * Map filtering params in a selection query to MongoDB a filtering object.\n *\n * Handles the following:\n *\n * - where\n * - and bunch of filtering operators\n *\n * @method MongoDBAdapter#getQuery\n * @return {Object}\n */\n getQuery (mapper, query) {\n query = utils.plainCopy(query || {})\n query.where || (query.where = {})\n\n utils.forOwn(query, function (config, keyword) {\n if (reserved.indexOf(keyword) === -1) {\n if (utils.isObject(config)) {\n query.where[keyword] = config\n } else {\n query.where[keyword] = {\n '==': config\n }\n }\n delete query[keyword]\n }\n })\n\n let mongoQuery = {}\n\n if (Object.keys(query.where).length !== 0) {\n utils.forOwn(query.where, function (criteria, field) {\n if (!utils.isObject(criteria)) {\n query.where[field] = {\n '==': criteria\n }\n }\n utils.forOwn(criteria, function (v, op) {\n if (op === '==' || op === '===' || op === 'contains') {\n mongoQuery[field] = v\n } else if (op === '!=' || op === '!==' || op === 'notContains') {\n mongoQuery[field] = mongoQuery[field] || {}\n mongoQuery[field].$ne = v\n } else if (op === '>') {\n mongoQuery[field] = mongoQuery[field] || {}\n mongoQuery[field].$gt = v\n } else if (op === '>=') {\n mongoQuery[field] = mongoQuery[field] || {}\n mongoQuery[field].$gte = v\n } else if (op === '<') {\n mongoQuery[field] = mongoQuery[field] || {}\n mongoQuery[field].$lt = v\n } else if (op === '<=') {\n mongoQuery[field] = mongoQuery[field] || {}\n mongoQuery[field].$lte = v\n } else if (op === 'in') {\n mongoQuery[field] = mongoQuery[field] || {}\n mongoQuery[field].$in = v\n } else if (op === 'notIn') {\n mongoQuery[field] = mongoQuery[field] || {}\n mongoQuery[field].$nin = v\n } else if (op === '|==' || op === '|===' || op === '|contains') {\n mongoQuery.$or = mongoQuery.$or || []\n let orEqQuery = {}\n orEqQuery[field] = v\n mongoQuery.$or.push(orEqQuery)\n } else if (op === '|!=' || op === '|!==' || op === '|notContains') {\n mongoQuery.$or = mongoQuery.$or || []\n let orNeQuery = {}\n orNeQuery[field] = {\n '$ne': v\n }\n mongoQuery.$or.push(orNeQuery)\n } else if (op === '|>') {\n mongoQuery.$or = mongoQuery.$or || []\n let orGtQuery = {}\n orGtQuery[field] = {\n '$gt': v\n }\n mongoQuery.$or.push(orGtQuery)\n } else if (op === '|>=') {\n mongoQuery.$or = mongoQuery.$or || []\n let orGteQuery = {}\n orGteQuery[field] = {\n '$gte': v\n }\n mongoQuery.$or.push(orGteQuery)\n } else if (op === '|<') {\n mongoQuery.$or = mongoQuery.$or || []\n let orLtQuery = {}\n orLtQuery[field] = {\n '$lt': v\n }\n mongoQuery.$or.push(orLtQuery)\n } else if (op === '|<=') {\n mongoQuery.$or = mongoQuery.$or || []\n let orLteQuery = {}\n orLteQuery[field] = {\n '$lte': v\n }\n mongoQuery.$or.push(orLteQuery)\n } else if (op === '|in') {\n mongoQuery.$or = mongoQuery.$or || []\n let orInQuery = {}\n orInQuery[field] = {\n '$in': v\n }\n mongoQuery.$or.push(orInQuery)\n } else if (op === '|notIn') {\n mongoQuery.$or = mongoQuery.$or || []\n let orNinQuery = {}\n orNinQuery[field] = {\n '$nin': v\n }\n mongoQuery.$or.push(orNinQuery)\n }\n })\n })\n }\n\n return mongoQuery\n },\n\n /**\n * Map non-filtering params in a selection query to MongoDB query options.\n *\n * Handles the following:\n *\n * - limit\n * - skip/offset\n * - orderBy/sort\n *\n * @method MongoDBAdapter#getQueryOptions\n * @return {Object}\n */\n getQueryOptions (mapper, query) {\n query = utils.plainCopy(query || {})\n query.orderBy = query.orderBy || query.sort\n query.skip = query.skip || query.offset\n\n let queryOptions = {}\n\n if (query.orderBy) {\n if (utils.isString(query.orderBy)) {\n query.orderBy = [\n [query.orderBy, 'asc']\n ]\n }\n for (var i = 0; i < query.orderBy.length; i++) {\n if (utils.isString(query.orderBy[i])) {\n query.orderBy[i] = [query.orderBy[i], 'asc']\n }\n }\n queryOptions.sort = query.orderBy\n }\n\n if (query.skip) {\n queryOptions.skip = +query.skip\n }\n\n if (query.limit) {\n queryOptions.limit = +query.limit\n }\n\n return queryOptions\n },\n\n /**\n * Turn an _id into an ObjectID if it isn't already an ObjectID.\n *\n * @method MongoDBAdapter#toObjectID\n * @return {*}\n */\n toObjectID (mapper, id) {\n if (id !== undefined && mapper.idAttribute === '_id' && typeof id === 'string' && ObjectID.isValid(id) && !(id instanceof ObjectID)) {\n return new ObjectID(id)\n }\n return id\n },\n\n /**\n * Return the foreignKey from the given record for the provided relationship.\n *\n * @method MongoDBAdapter#makeBelongsToForeignKey\n * @return {*}\n */\n makeBelongsToForeignKey (mapper, def, record) {\n return this.toObjectID(def.getRelation(), Adapter.prototype.makeBelongsToForeignKey.call(this, mapper, def, record))\n },\n\n /**\n * Return the localKeys from the given record for the provided relationship.\n *\n * Override with care.\n *\n * @method MongoDBAdapter#makeHasManyLocalKeys\n * @return {*}\n */\n makeHasManyLocalKeys (mapper, def, record) {\n const self = this\n const relatedMapper = def.getRelation()\n const localKeys = Adapter.prototype.makeHasManyLocalKeys.call(self, mapper, def, record)\n return localKeys.map(function (key) {\n return self.toObjectID(relatedMapper, key)\n })\n },\n\n /**\n * Not supported.\n *\n * @method MongoDBAdapter#updateMany\n */\n updateMany () {\n throw new Error('not supported!')\n }\n})\n\n/**\n * Details of the current version of the `js-data-mongodb` module.\n *\n * @name module:js-data-mongodb.version\n * @type {Object}\n * @property {string} version.full The full semver value.\n * @property {number} version.major The major version number.\n * @property {number} version.minor The minor version number.\n * @property {number} version.patch The patch version number.\n * @property {(string|boolean)} version.alpha The alpha version value,\n * otherwise `false` if the current version is not alpha.\n * @property {(string|boolean)} version.beta The beta version value,\n * otherwise `false` if the current version is not beta.\n */\nexport const version = '<%= version %>'\n\nexport default MongoDBAdapter\n"],"names":["utils","Adapter","reserved","ObjectID"],"mappings":"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"} \ No newline at end of file From e380df810a53e7ecc65dddd016316194ea4727e2 Mon Sep 17 00:00:00 2001 From: Jason Dobry Date: Tue, 3 May 2016 09:19:42 -0700 Subject: [PATCH 14/36] Ignore gh-pages --- circle.yml | 4 ++++ package.json | 4 ++-- src/index.js | 33 +++++++++++++++++++++++++++++++++ 3 files changed, 39 insertions(+), 2 deletions(-) diff --git a/circle.yml b/circle.yml index 79c7241..c51b4af 100644 --- a/circle.yml +++ b/circle.yml @@ -1,3 +1,7 @@ +general: + branches: + ignore: + - gh-pages machine: node: version: 4.1.0 diff --git a/package.json b/package.json index e2dc247..46ddc93 100644 --- a/package.json +++ b/package.json @@ -64,12 +64,12 @@ "mongodb": ">=1.3.x" }, "devDependencies": { - "babel-polyfill": "6.7.4", + "babel-polyfill": "6.8.0", "babel-preset-es2015-rollup": "1.1.1", "istanbul": "0.4.3", "js-data-adapter-tests": "^2.0.0-alpha.16", "js-data-repo-tools": "0.5.0", - "rollup": "0.26.1", + "rollup": "0.26.2", "rollup-plugin-babel": "2.4.0", "source-map-support": "0.4.0", "watch": "0.18.0" diff --git a/src/index.js b/src/index.js index c17b962..4ca03fa 100644 --- a/src/index.js +++ b/src/index.js @@ -913,6 +913,10 @@ utils.addHiddenPropsToTarget(MongoDBAdapter.prototype, { /** * Details of the current version of the `js-data-mongodb` module. * + * @example + * import {version} from 'js-data-mongodb' + * console.log(version.full) + * * @name module:js-data-mongodb.version * @type {Object} * @property {string} version.full The full semver value. @@ -926,4 +930,33 @@ utils.addHiddenPropsToTarget(MongoDBAdapter.prototype, { */ export const version = '<%= version %>' +/** + * {@link MongoDBAdapter} class. + * + * @example + * import {MongoDBAdapter} from 'js-data-mongodb' + * const adapter = new MongoDBAdapter() + * + * @name module:js-data-mongodb.MongoDBAdapter + * @see MongoDBAdapter + * @type {Constructor} + */ + +/** + * Registered as `js-data-mongodb` in NPM. + * + * @example Install from NPM + * npm i --save js-data-mongodb@beta js-data@beta mongodb bson + * + * @example Load via CommonJS + * var MongoDBAdapter = require('js-data-mongodb').MongoDBAdapter + * var adapter = new MongoDBAdapter() + * + * @example Load via ES2015 Modules + * import {MongoDBAdapter} from 'js-data-mongodb' + * const adapter = new MongoDBAdapter() + * + * @module js-data-mongodb + */ + export default MongoDBAdapter From 9ad0e0fcfd9af0dae37178a18f375f05730c3eab Mon Sep 17 00:00:00 2001 From: Jason Dobry Date: Sun, 21 Aug 2016 09:37:09 -0700 Subject: [PATCH 15/36] Upgrade dependencies and build setup. --- .gitignore | 3 ++- circle.yml | 9 +++++---- mocha.start.js | 19 +++++++++---------- package.json | 29 ++++++++++++----------------- rollup.config.js | 11 +++++++++++ src/index.js | 2 -- 6 files changed, 39 insertions(+), 34 deletions(-) diff --git a/.gitignore b/.gitignore index 5fefa24..6a212de 100644 --- a/.gitignore +++ b/.gitignore @@ -33,4 +33,5 @@ node_modules *.iml data/ -doc/ \ No newline at end of file +doc/ +.nyc_output/ \ No newline at end of file diff --git a/circle.yml b/circle.yml index c51b4af..7df1a71 100644 --- a/circle.yml +++ b/circle.yml @@ -4,11 +4,12 @@ general: - gh-pages machine: node: - version: 4.1.0 + version: 5.7.0 dependencies: pre: - npm install -g npm - - npm install js-data@^3.0.0-beta.3 mongodb bson + - npm install -g codecov nyc + - npm install js-data@^3.0.0-rc.4 mongodb bson@^0.4.x test: - override: - - npm run ci + post: + - nyc report --reporter=lcov | codecov diff --git a/mocha.start.js b/mocha.start.js index 009faab..1cd4532 100644 --- a/mocha.start.js +++ b/mocha.start.js @@ -2,21 +2,19 @@ 'use strict' // prepare environment for js-data-adapter-tests -require('babel-polyfill') +import 'babel-polyfill' -var JSData = require('js-data') -var JSDataAdapterTests = require('js-data-adapter-tests') -var JSDataMongoDB = require('./') -var version = JSDataMongoDB.version -var MongoDBAdapter = JSDataMongoDB.MongoDBAdapter +import * as JSData from 'js-data' +import JSDataAdapterTests from './node_modules/js-data-adapter/dist/js-data-adapter-tests' +import * as JSDataMongoDB from './src/index' -var assert = global.assert = JSDataAdapterTests.assert +const assert = global.assert = JSDataAdapterTests.assert global.sinon = JSDataAdapterTests.sinon JSDataAdapterTests.init({ debug: false, JSData: JSData, - Adapter: MongoDBAdapter, + Adapter: JSDataMongoDB.MongoDBAdapter, adapterConfig: { uri: 'mongodb://localhost:27017' }, @@ -44,6 +42,7 @@ JSDataAdapterTests.init({ require('./test/find.test') describe('exports', function () { - assert(version) - assert(version.full) + it('should have exports', function () { + assert(JSDataMongoDB.version, 'Should have version') + }) }) diff --git a/package.json b/package.json index 46ddc93..4ded356 100644 --- a/package.json +++ b/package.json @@ -37,10 +37,14 @@ "beforeEach", "afterEach" ], - "ignore": ["dist/"] + "ignore": [ + "dist/" + ] }, "babel": { - "presets": ["es2015-rollup"] + "presets": [ + "es2015" + ] }, "scripts": { "lint": "repo-tools lint \"**/*.js\"", @@ -48,30 +52,21 @@ "doc": "jsdoc -c conf.json src node_modules/js-data-adapter/src", "watch": "watch \"npm run bundle\" src/", "build": "npm run lint && npm run bundle", - "mocha": "mocha -t 20000 -R dot -r source-map-support/register mocha.start.js", - "cover": "istanbul cover --hook-run-in-context node_modules/mocha/bin/_mocha -- -t 20000 -R dot -r source-map-support/register mocha.start.js", + "mocha": "mocha -t 20000 -R dot -r babel-core/register -r babel-polyfill mocha.start.js", + "cover": "nyc --require babel-core/register --require babel-polyfill --cache mocha -t 20000 -R dot mocha.start.js && nyc report --reporter=html", "test": "npm run build && npm run cover", - "release": "npm test && npm run doc && repo-tools updates && repo-tools changelog && repo-tools authors", - "ci": "npm run test && cat coverage/lcov.info | codecov" + "release": "npm test && npm run doc && repo-tools updates && repo-tools changelog && repo-tools authors" }, "dependencies": { - "js-data-adapter": "~0.6.1", + "js-data-adapter": "~0.8.2", "mout": "1.0.0" }, "peerDependencies": { "bson": "^0.4.x || ^0.3.x", - "js-data": "^3.0.0-beta.3", + "js-data": "^3.0.0-rc.4", "mongodb": ">=1.3.x" }, "devDependencies": { - "babel-polyfill": "6.8.0", - "babel-preset-es2015-rollup": "1.1.1", - "istanbul": "0.4.3", - "js-data-adapter-tests": "^2.0.0-alpha.16", - "js-data-repo-tools": "0.5.0", - "rollup": "0.26.2", - "rollup-plugin-babel": "2.4.0", - "source-map-support": "0.4.0", - "watch": "0.18.0" + "js-data-repo-tools": "0.5.6" } } diff --git a/rollup.config.js b/rollup.config.js index af48aaa..a41b2c5 100644 --- a/rollup.config.js +++ b/rollup.config.js @@ -1,8 +1,19 @@ var babel = require('rollup-plugin-babel') module.exports = { + external: [ + 'mongodb', + 'bson', + 'js-data', + 'js-data-adapter', + 'mout/string/underscore' + ], plugins: [ babel({ + babelrc: false, + presets: [ + 'es2015-rollup' + ], exclude: 'node_modules/**' }) ] diff --git a/src/index.js b/src/index.js index 4ca03fa..dc68920 100644 --- a/src/index.js +++ b/src/index.js @@ -958,5 +958,3 @@ export const version = '<%= version %>' * * @module js-data-mongodb */ - -export default MongoDBAdapter From d386367b30ca6c473d1eb5db8f93cd3debee45da Mon Sep 17 00:00:00 2001 From: Cory Robinson Date: Tue, 23 Aug 2016 12:24:03 -0700 Subject: [PATCH 16/36] add option to translate all ObjectID fields per record (#17) * add option to translate all ObjectID fields per record * add tests for translateObjectIDs opt --- mocha.start.js | 3 ++- src/index.js | 62 +++++++++++++++++++++++++++++++++++------------ test/find.test.js | 20 +++++++++++++++ 3 files changed, 69 insertions(+), 16 deletions(-) diff --git a/mocha.start.js b/mocha.start.js index 1cd4532..4667152 100644 --- a/mocha.start.js +++ b/mocha.start.js @@ -16,7 +16,8 @@ JSDataAdapterTests.init({ JSData: JSData, Adapter: JSDataMongoDB.MongoDBAdapter, adapterConfig: { - uri: 'mongodb://localhost:27017' + uri: 'mongodb://localhost:27017', + translateObjectIDs: true }, containerConfig: { mapperDefaults: { diff --git a/src/index.js b/src/index.js index dc68920..c7b62f2 100644 --- a/src/index.js +++ b/src/index.js @@ -16,6 +16,12 @@ const DEFAULTS = { * @default true */ translateId: true, + /** + * Convert fields of record from databse that are ObjectIDs to strings + * @type {Boolean} + * @default false + */ + translateObjectIDs: false, /** * MongoDB URI. @@ -209,25 +215,51 @@ Object.defineProperty(MongoDBAdapter, '__super__', { MongoDBAdapter.extend = utils.extend utils.addHiddenPropsToTarget(MongoDBAdapter.prototype, { + + _translateObjectIDs (r, opts) { + opts || (opts = {}) + if (this.getOpt('translateObjectIDs', opts)) { + this._translateFieldObjectIDs(r) + } else if (this.getOpt('translateId', opts)) { + this._translateId(r) + } + return r + }, + /** * Translate ObjectIDs to strings. * * @method MongoDBAdapter#_translateId * @return {*} */ - _translateId (r, opts) { - opts || (opts = {}) - if (this.getOpt('translateId', opts)) { - if (utils.isArray(r)) { - r.forEach(function (_r) { - const __id = _r._id ? _r._id.toString() : _r._id - _r._id = typeof __id === 'string' ? __id : _r._id - }) - } else if (utils.isObject(r)) { - const __id = r._id ? r._id.toString() : r._id - r._id = typeof __id === 'string' ? __id : r._id + _translateId (r) { + if (utils.isArray(r)) { + r.forEach(function (_r) { + const __id = _r._id ? _r._id.toString() : _r._id + _r._id = typeof __id === 'string' ? __id : _r._id + }) + } else if (utils.isObject(r)) { + const __id = r._id ? r._id.toString() : r._id + r._id = typeof __id === 'string' ? __id : r._id + } + return r + }, + + _translateFieldObjectIDs (r) { + const _checkFields = (r) => { + for (let field in r) { + if (r[field]._bsontype === 'ObjectID') { + r[field] = typeof r[field].toString() === 'string' ? r[field].toString() : r[field] + } } } + if (utils.isArray(r)) { + r.forEach(function (_r) { + _checkFields(_r) + }) + } else if (utils.isObject(r)) { + _checkFields(r) + } return r }, @@ -314,7 +346,7 @@ utils.addHiddenPropsToTarget(MongoDBAdapter.prototype, { }).then(function (cursor) { let record let r = cursor.ops ? cursor.ops : cursor - self._translateId(r, opts) + self._translateObjectIDs(r, opts) record = utils.isArray(r) ? r[0] : r cursor.connection = undefined return [record, cursor] @@ -364,7 +396,7 @@ utils.addHiddenPropsToTarget(MongoDBAdapter.prototype, { }).then(function (cursor) { let records = [] let r = cursor.ops ? cursor.ops : cursor - self._translateId(r, opts) + self._translateObjectIDs(r, opts) records = r cursor.connection = undefined return [records, cursor] @@ -508,7 +540,7 @@ utils.addHiddenPropsToTarget(MongoDBAdapter.prototype, { }) }).then(function (record) { if (record) { - self._translateId(record, opts) + self._translateObjectIDs(record, opts) } return [record, {}] }) @@ -555,7 +587,7 @@ utils.addHiddenPropsToTarget(MongoDBAdapter.prototype, { }) }) }).then(function (records) { - self._translateId(records, opts) + self._translateObjectIDs(records, opts) return [records, {}] }) }, diff --git a/test/find.test.js b/test/find.test.js index 9786cd0..24f571a 100644 --- a/test/find.test.js +++ b/test/find.test.js @@ -38,4 +38,24 @@ describe('MongoDBAdapter#find', function () { assert.objectsEqual(user, { _id: id, name: 'John' }) }) }) + + it('should convert fields in records that are ObjectID bson type', function () { + var ObjectID = require('bson').ObjectID + var id + + ObjectID = new ObjectID() + + return adapter.findAll(User, { + name: 'John' + }).then(function (users) { + assert.equal(users.length, 0) + return adapter.create(User, { bsonField: ObjectID }) + }).then(function (user) { + id = user._id + assert.equal(typeof id, 'string') + return adapter.find(User, id) + }).then(function (user) { + assert.objectsEqual(user, { _id: id, bsonField: ObjectID.toString() }) + }) + }) }) From dd43e87b8c3b1df00d4835e1dbdce1664e1d71fc Mon Sep 17 00:00:00 2001 From: Jason Dobry Date: Tue, 23 Aug 2016 13:15:47 -0700 Subject: [PATCH 17/36] Prepare for 1.0.0-rc.1 --- AUTHORS | 1 + CHANGELOG.md | 7 + package.json | 2 +- src/index.js | 656 +++++++++++++++++++++++++++++---------------------- 4 files changed, 378 insertions(+), 288 deletions(-) diff --git a/AUTHORS b/AUTHORS index aeb5fb4..6f089b3 100644 --- a/AUTHORS +++ b/AUTHORS @@ -3,5 +3,6 @@ # Names are formatted as: # # commits Name or Organization # The email address is not required for organizations. +Cory Robinson Jason Dobry John Grogg diff --git a/CHANGELOG.md b/CHANGELOG.md index 8df9165..fa582ca 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,10 @@ +##### 1.0.0-rc.1 - 23 August 2016 + +###### Backwards compatible changes +- #16, #17 - Feature - Translate all ObjectID fields by @crobinson42 +- Cleaned up the code +- Improved support for `fields` option in `find` and `findAll` + ##### 1.0.0-beta.1 - 30 April 2016 ###### Breaking changes diff --git a/package.json b/package.json index 4ded356..ecc4124 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "js-data-mongodb", "description": "MongoDB adapter for js-data.", - "version": "1.0.0-beta.1", + "version": "1.0.0-rc.1", "homepage": "https://github.com/js-data/js-data-mongodb", "repository": { "type": "git", diff --git a/src/index.js b/src/index.js index c7b62f2..8e890b2 100644 --- a/src/index.js +++ b/src/index.js @@ -68,153 +68,132 @@ const REMOVE_OPTS_DEFAULTS = {} * * @class MongoDBAdapter * @extends Adapter - * @param {Object} [opts] Configuration options. + * @param {object} [opts] Configuration options. * @param {boolean} [opts.debug=false] See {@link Adapter#debug}. - * @param {Object} [opts.countOpts] See {@link MongoDBAdapter#countOpts}. - * @param {Object} [opts.findOpts] See {@link MongoDBAdapter#findOpts}. - * @param {Object} [opts.findOneOpts] See {@link MongoDBAdapter#findOneOpts}. - * @param {Object} [opts.insertOpts] See {@link MongoDBAdapter#insertOpts}. - * @param {Object} [opts.insertManyOpts] See {@link MongoDBAdapter#insertManyOpts}. + * @param {object} [opts.countOpts] See {@link MongoDBAdapter#countOpts}. + * @param {object} [opts.findOpts] See {@link MongoDBAdapter#findOpts}. + * @param {object} [opts.findOneOpts] See {@link MongoDBAdapter#findOneOpts}. + * @param {object} [opts.insertOpts] See {@link MongoDBAdapter#insertOpts}. + * @param {object} [opts.insertManyOpts] See {@link MongoDBAdapter#insertManyOpts}. * @param {boolean} [opts.raw=false] See {@link Adapter#raw}. - * @param {Object} [opts.removeOpts] See {@link MongoDBAdapter#removeOpts}. + * @param {object} [opts.removeOpts] See {@link MongoDBAdapter#removeOpts}. * @param {boolean} [opts.translateId=true] See {@link MongoDBAdapter#translateId}. - * @param {Object} [opts.updateOpts] See {@link MongoDBAdapter#updateOpts}. + * @param {object} [opts.updateOpts] See {@link MongoDBAdapter#updateOpts}. * @param {string} [opts.uri="mongodb://localhost:27017"] See {@link MongoDBAdapter#uri}. */ export function MongoDBAdapter (opts) { - const self = this - utils.classCallCheck(self, MongoDBAdapter) + utils.classCallCheck(this, MongoDBAdapter) opts || (opts = {}) if (utils.isString(opts)) { opts = { uri: opts } } utils.fillIn(opts, DEFAULTS) - Adapter.call(self, opts) + + // Setup non-enumerable properties + Object.defineProperties(this, { + /** + * A Promise that resolves to a reference to the MongoDB client being used by + * this adapter. + * + * @name MongoDBAdapter#client + * @type {Promise} + */ + client: { + writable: true, + value: undefined + }, + + _db: { + writable: true, + value: undefined + } + }) + + Adapter.call(this, opts) /** * Default options to pass to collection#count. * * @name MongoDBAdapter#countOpts - * @type {Object} + * @type {object} * @default {} */ - self.countOpts || (self.countOpts = {}) - utils.fillIn(self.countOpts, COUNT_OPTS_DEFAULTS) + this.countOpts || (this.countOpts = {}) + utils.fillIn(this.countOpts, COUNT_OPTS_DEFAULTS) /** * Default options to pass to collection#find. * * @name MongoDBAdapter#findOpts - * @type {Object} + * @type {object} * @default {} */ - self.findOpts || (self.findOpts = {}) - utils.fillIn(self.findOpts, FIND_OPTS_DEFAULTS) + this.findOpts || (this.findOpts = {}) + utils.fillIn(this.findOpts, FIND_OPTS_DEFAULTS) /** * Default options to pass to collection#findOne. * * @name MongoDBAdapter#findOneOpts - * @type {Object} + * @type {object} * @default {} */ - self.findOneOpts || (self.findOneOpts = {}) - utils.fillIn(self.findOneOpts, FIND_ONE_OPTS_DEFAULTS) + this.findOneOpts || (this.findOneOpts = {}) + utils.fillIn(this.findOneOpts, FIND_ONE_OPTS_DEFAULTS) /** * Default options to pass to collection#insert. * * @name MongoDBAdapter#insertOpts - * @type {Object} + * @type {object} * @default {} */ - self.insertOpts || (self.insertOpts = {}) - utils.fillIn(self.insertOpts, INSERT_OPTS_DEFAULTS) + this.insertOpts || (this.insertOpts = {}) + utils.fillIn(this.insertOpts, INSERT_OPTS_DEFAULTS) /** * Default options to pass to collection#insertMany. * * @name MongoDBAdapter#insertManyOpts - * @type {Object} + * @type {object} * @default {} */ - self.insertManyOpts || (self.insertManyOpts = {}) - utils.fillIn(self.insertManyOpts, INSERT_MANY_OPTS_DEFAULTS) + this.insertManyOpts || (this.insertManyOpts = {}) + utils.fillIn(this.insertManyOpts, INSERT_MANY_OPTS_DEFAULTS) /** * Default options to pass to collection#update. * * @name MongoDBAdapter#updateOpts - * @type {Object} + * @type {object} * @default {} */ - self.updateOpts || (self.updateOpts = {}) - utils.fillIn(self.updateOpts, UPDATE_OPTS_DEFAULTS) + this.updateOpts || (this.updateOpts = {}) + utils.fillIn(this.updateOpts, UPDATE_OPTS_DEFAULTS) /** * Default options to pass to collection#update. * * @name MongoDBAdapter#removeOpts - * @type {Object} + * @type {object} * @default {} */ - self.removeOpts || (self.removeOpts = {}) - utils.fillIn(self.removeOpts, REMOVE_OPTS_DEFAULTS) + this.removeOpts || (this.removeOpts = {}) + utils.fillIn(this.removeOpts, REMOVE_OPTS_DEFAULTS) - /** - * A Promise that resolves to a reference to the MongoDB client being used by - * this adapter. - * - * @name MongoDBAdapter#client - * @type {Object} - */ - self.client = new Promise(function (resolve, reject) { - MongoClient.connect(opts.uri, function (err, db) { - return err ? reject(err) : resolve(db) + this.client = new utils.Promise((resolve, reject) => { + MongoClient.connect(opts.uri, (err, db) => { + if (err) { + return reject(err) + } + this._db = db + resolve(db) }) }) } -// Setup prototype inheritance from Adapter -MongoDBAdapter.prototype = Object.create(Adapter.prototype, { - constructor: { - value: MongoDBAdapter, - enumerable: false, - writable: true, - configurable: true - } -}) - -Object.defineProperty(MongoDBAdapter, '__super__', { - configurable: true, - value: Adapter -}) - -/** - * Alternative to ES6 class syntax for extending `MongoDBAdapter`. - * - * @example Using the ES2015 class syntax. - * class MyMongoDBAdapter extends MongoDBAdapter {...} - * const adapter = new MyMongoDBAdapter() - * - * @example Using {@link MongoDBAdapter.extend}. - * var instanceProps = {...} - * var classProps = {...} - * - * var MyMongoDBAdapter = MongoDBAdapter.extend(instanceProps, classProps) - * var adapter = new MyMongoDBAdapter() - * - * @method MongoDBAdapter.extend - * @static - * @param {Object} [instanceProps] Properties that will be added to the - * prototype of the subclass. - * @param {Object} [classProps] Properties that will be added as static - * properties to the subclass itself. - * @return {Object} Subclass of `MongoDBAdapter`. - */ -MongoDBAdapter.extend = utils.extend - -utils.addHiddenPropsToTarget(MongoDBAdapter.prototype, { +Adapter.extend({ + constructor: MongoDBAdapter, _translateObjectIDs (r, opts) { opts || (opts = {}) @@ -234,7 +213,7 @@ utils.addHiddenPropsToTarget(MongoDBAdapter.prototype, { */ _translateId (r) { if (utils.isArray(r)) { - r.forEach(function (_r) { + r.forEach((_r) => { const __id = _r._id ? _r._id.toString() : _r._id _r._id = typeof __id === 'string' ? __id : _r._id }) @@ -254,7 +233,7 @@ utils.addHiddenPropsToTarget(MongoDBAdapter.prototype, { } } if (utils.isArray(r)) { - r.forEach(function (_r) { + r.forEach((_r) => { _checkFields(_r) }) } else if (utils.isObject(r)) { @@ -267,10 +246,10 @@ utils.addHiddenPropsToTarget(MongoDBAdapter.prototype, { * Retrieve the number of records that match the selection query. * * @method MongoDBAdapter#count - * @param {Object} mapper The mapper. - * @param {Object} query Selection query. - * @param {Object} [opts] Configuration options. - * @param {Object} [opts.countOpts] Options to pass to collection#count. + * @param {object} mapper The mapper. + * @param {object} query Selection query. + * @param {object} [opts] Configuration options. + * @param {object} [opts.countOpts] Options to pass to collection#count. * @param {boolean} [opts.raw=false] Whether to return a more detailed * response object. * @param {string[]} [opts.with=[]] Relations to eager load. @@ -283,25 +262,24 @@ utils.addHiddenPropsToTarget(MongoDBAdapter.prototype, { * * @method MongoDBAdapter#_count * @private - * @param {Object} mapper The mapper. - * @param {Object} query Selection query. - * @param {Object} [opts] Configuration options. + * @param {object} mapper The mapper. + * @param {object} query Selection query. + * @param {object} [opts] Configuration options. * @return {Promise} */ _count (mapper, query, opts) { - const self = this opts || (opts = {}) - const countOpts = self.getOpt('countOpts', opts) - utils.fillIn(countOpts, self.getQueryOptions(mapper, query)) - const mongoQuery = self.getQuery(mapper, query) + return this._run((client, success, failure) => { + const collectionId = this._getCollectionId(mapper, opts) + const countOpts = this.getOpt('countOpts', opts) + utils.fillIn(countOpts, this.getQueryOptions(mapper, query)) - return self.getClient().then(function (client) { - return new Promise(function (resolve, reject) { - client.collection(mapper.table || underscore(mapper.name)).count(mongoQuery, countOpts, function (err, count) { - return err ? reject(err) : resolve([count, {}]) - }) - }) + const mongoQuery = this.getQuery(mapper, query) + + client + .collection(collectionId) + .count(mongoQuery, countOpts, (err, count) => err ? failure(err) : success([count, {}])) }) }, @@ -309,10 +287,10 @@ utils.addHiddenPropsToTarget(MongoDBAdapter.prototype, { * Create a new record. * * @method MongoDBAdapter#create - * @param {Object} mapper The mapper. - * @param {Object} props The record to be created. - * @param {Object} [opts] Configuration options. - * @param {Object} [opts.insertOpts] Options to pass to collection#insert. + * @param {object} mapper The mapper. + * @param {object} props The record to be created. + * @param {object} [opts] Configuration options. + * @param {object} [opts.insertOpts] Options to pass to collection#insert. * @param {boolean} [opts.raw=false] Whether to return a more detailed * @return {Promise} */ @@ -322,31 +300,35 @@ utils.addHiddenPropsToTarget(MongoDBAdapter.prototype, { * * @method MongoDBAdapter#_create * @private - * @param {Object} mapper The mapper. - * @param {Object} props The record to be created. - * @param {Object} [opts] Configuration options. + * @param {object} mapper The mapper. + * @param {object} props The record to be created. + * @param {object} [opts] Configuration options. * @return {Promise} */ _create (mapper, props, opts) { - const self = this props || (props = {}) opts || (opts = {}) - props = utils.plainCopy(props) - const insertOpts = self.getOpt('insertOpts', opts) + return this._run((client, success, failure) => { + const collectionId = this._getCollectionId(mapper, opts) + const insertOpts = this.getOpt('insertOpts', opts) - return self.getClient().then(function (client) { - return new Promise(function (resolve, reject) { - const collection = client.collection(mapper.table || underscore(mapper.name)) - const method = collection.insertOne ? 'insertOne' : 'insert' - collection[method](props, insertOpts, function (err, cursor) { - return err ? reject(err) : resolve(cursor) - }) - }) - }).then(function (cursor) { + const collection = client.collection(collectionId) + const handler = (err, cursor) => err ? failure(err) : success(cursor) + + props = utils.plainCopy(props) + + if (collection.insertOne) { + collection + .insertOne(props, insertOpts, handler) + } else { + collection + .insert(props, insertOpts, handler) + } + }).then((cursor) => { let record let r = cursor.ops ? cursor.ops : cursor - self._translateObjectIDs(r, opts) + this._translateObjectIDs(r, opts) record = utils.isArray(r) ? r[0] : r cursor.connection = undefined return [record, cursor] @@ -357,10 +339,10 @@ utils.addHiddenPropsToTarget(MongoDBAdapter.prototype, { * Create multiple records in a single batch. * * @method MongoDBAdapter#createMany - * @param {Object} mapper The mapper. - * @param {Object} props The records to be created. - * @param {Object} [opts] Configuration options. - * @param {Object} [opts.insertManyOpts] Options to pass to + * @param {object} mapper The mapper. + * @param {object} props The records to be created. + * @param {object} [opts] Configuration options. + * @param {object} [opts.insertManyOpts] Options to pass to * collection#insertMany. * @param {boolean} [opts.raw=false] Whether to return a more detailed * response object. @@ -373,30 +355,26 @@ utils.addHiddenPropsToTarget(MongoDBAdapter.prototype, { * * @method MongoDBAdapter#_createMany * @private - * @param {Object} mapper The mapper. - * @param {Object} props The records to be created. - * @param {Object} [opts] Configuration options. + * @param {object} mapper The mapper. + * @param {object} props The records to be created. + * @param {object} [opts] Configuration options. * @return {Promise} */ _createMany (mapper, props, opts) { - const self = this props || (props = {}) opts || (opts = {}) - props = utils.plainCopy(props) - const insertManyOpts = self.getOpt('insertManyOpts', opts) + return this._run((client, success, failure) => { + const collectionId = this._getCollectionId(mapper, opts) + const insertManyOpts = this.getOpt('insertManyOpts', opts) + props = utils.plainCopy(props) - return self.getClient().then(function (client) { - return new Promise(function (resolve, reject) { - const collection = client.collection(mapper.table || underscore(mapper.name)) - collection.insertMany(props, insertManyOpts, function (err, cursor) { - return err ? reject(err) : resolve(cursor) - }) - }) - }).then(function (cursor) { + client.collection(collectionId) + .insertMany(props, insertManyOpts, (err, cursor) => err ? failure(err) : success(cursor)) + }).then((cursor) => { let records = [] let r = cursor.ops ? cursor.ops : cursor - self._translateObjectIDs(r, opts) + this._translateObjectIDs(r, opts) records = r cursor.connection = undefined return [records, cursor] @@ -407,12 +385,12 @@ utils.addHiddenPropsToTarget(MongoDBAdapter.prototype, { * Destroy the record with the given primary key. * * @method MongoDBAdapter#destroy - * @param {Object} mapper The mapper. + * @param {object} mapper The mapper. * @param {(string|number)} id Primary key of the record to destroy. - * @param {Object} [opts] Configuration options. + * @param {object} [opts] Configuration options. * @param {boolean} [opts.raw=false] Whether to return a more detailed * response object. - * @param {Object} [opts.removeOpts] Options to pass to collection#remove. + * @param {object} [opts.removeOpts] Options to pass to collection#remove. * @return {Promise} */ @@ -422,46 +400,50 @@ utils.addHiddenPropsToTarget(MongoDBAdapter.prototype, { * * @method MongoDBAdapter#_destroy * @private - * @param {Object} mapper The mapper. + * @param {object} mapper The mapper. * @param {(string|number)} id Primary key of the record to destroy. - * @param {Object} [opts] Configuration options. + * @param {object} [opts] Configuration options. * @return {Promise} */ _destroy (mapper, id, opts) { - const self = this opts || (opts = {}) - const removeOpts = self.getOpt('removeOpts', opts) - - return self.getClient().then(function (client) { - return new Promise(function (resolve, reject) { - const mongoQuery = {} - mongoQuery[mapper.idAttribute] = self.toObjectID(mapper, id) - const collection = client.collection(mapper.table || underscore(mapper.name)) - collection[collection.deleteOne ? 'deleteOne' : 'remove'](mongoQuery, removeOpts, function (err, cursor) { - return err ? reject(err) : resolve(cursor) - }) - }) - }).then(function (cursor) { - return [undefined, cursor] - }) + + return this._run((client, success, failure) => { + const collectionId = this._getCollectionId(mapper, opts) + const removeOpts = this.getOpt('removeOpts', opts) + + const mongoQuery = { + [mapper.idAttribute]: this.toObjectID(mapper, id) + } + const collection = client.collection(collectionId) + const handler = (err, cursor) => err ? failure(err) : success(cursor) + + if (collection.deleteOne) { + collection + .deleteOne(mongoQuery, removeOpts, handler) + } else { + collection + .remove(mongoQuery, removeOpts, handler) + } + }).then((cursor) => [undefined, cursor]) }, /** * Destroy the records that match the selection query. * * @method MongoDBAdapter#destroyAll - * @param {Object} mapper the mapper. - * @param {Object} [query] Selection query. - * @param {Object} [query.where] Filtering criteria. + * @param {object} mapper the mapper. + * @param {object} [query] Selection query. + * @param {object} [query.where] Filtering criteria. * @param {string|Array} [query.orderBy] Sorting criteria. * @param {string|Array} [query.sort] Same as `query.sort`. * @param {number} [query.limit] Limit results. * @param {number} [query.skip] Offset results. * @param {number} [query.offset] Same as `query.skip`. - * @param {Object} [opts] Configuration options. + * @param {object} [opts] Configuration options. * @param {boolean} [opts.raw=false] Whether to return a more detailed * response object. - * @param {Object} [opts.removeOpts] Options to pass to collection#remove. + * @param {object} [opts.removeOpts] Options to pass to collection#remove. * @return {Promise} */ @@ -471,27 +453,32 @@ utils.addHiddenPropsToTarget(MongoDBAdapter.prototype, { * * @method MongoDBAdapter#_destroyAll * @private - * @param {Object} mapper the mapper. - * @param {Object} [query] Selection query. - * @param {Object} [opts] Configuration options. + * @param {object} mapper the mapper. + * @param {object} [query] Selection query. + * @param {object} [opts] Configuration options. * @return {Promise} */ _destroyAll (mapper, query, opts) { - const self = this query || (query = {}) opts || (opts = {}) - const removeOpts = self.getOpt('removeOpts', opts) - utils.fillIn(removeOpts, self.getQueryOptions(mapper, query)) - - return self.getClient().then(function (client) { - const mongoQuery = self.getQuery(mapper, query) - return new Promise(function (resolve, reject) { - const collection = client.collection(mapper.table || underscore(mapper.name)) - collection[collection.deleteMany ? 'deleteMany' : 'remove'](mongoQuery, removeOpts, function (err, cursor) { - return err ? reject(err) : resolve(cursor) - }) - }) - }).then(function (cursor) { + + return this._run((client, success, failure) => { + const collectionId = this._getCollectionId(mapper, opts) + const removeOpts = this.getOpt('removeOpts', opts) + utils.fillIn(removeOpts, this.getQueryOptions(mapper, query)) + + const mongoQuery = this.getQuery(mapper, query) + const collection = client.collection(collectionId) + const handler = (err, cursor) => err ? failure(err) : success(cursor) + + if (collection.deleteMany) { + collection + .deleteMany(mongoQuery, removeOpts, handler) + } else { + collection + .remove(mongoQuery, removeOpts, handler) + } + }).then((cursor) => { cursor.connection = undefined return [undefined, cursor] }) @@ -501,10 +488,11 @@ utils.addHiddenPropsToTarget(MongoDBAdapter.prototype, { * Retrieve the record with the given primary key. * * @method MongoDBAdapter#find - * @param {Object} mapper The mapper. + * @param {object} mapper The mapper. * @param {(string|number)} id Primary key of the record to retrieve. - * @param {Object} [opts] Configuration options. - * @param {Object} [opts.findOneOpts] Options to pass to collection#findOne. + * @param {object} [opts] Configuration options. + * @param {string|string[]|object} [opts.fields] Select a subset of fields to be returned. + * @param {object} [opts.findOneOpts] Options to pass to collection#findOne. * @param {boolean} [opts.raw=false] Whether to return a more detailed * response object. * @param {string[]} [opts.with=[]] Relations to eager load. @@ -517,30 +505,30 @@ utils.addHiddenPropsToTarget(MongoDBAdapter.prototype, { * * @method MongoDBAdapter#_find * @private - * @param {Object} mapper The mapper. + * @param {object} mapper The mapper. * @param {(string|number)} id Primary key of the record to retrieve. - * @param {Object} [opts] Configuration options. + * @param {object} [opts] Configuration options. + * @param {string|string[]|object} [opts.fields] Select a subset of fields to be returned. * @return {Promise} */ _find (mapper, id, opts) { - const self = this opts || (opts = {}) opts.with || (opts.with = []) - const findOneOpts = self.getOpt('findOneOpts', opts) - findOneOpts.fields || (findOneOpts.fields = {}) + return this._run((client, success, failure) => { + const collectionId = this._getCollectionId(mapper, opts) + const findOneOpts = this.getOpt('findOneOpts', opts) + findOneOpts.fields = this._getFields(mapper, opts) - return self.getClient().then(function (client) { - return new Promise(function (resolve, reject) { - let mongoQuery = {} - mongoQuery[mapper.idAttribute] = self.toObjectID(mapper, id) - client.collection(mapper.table || underscore(mapper.name)).findOne(mongoQuery, findOneOpts, function (err, record) { - return err ? reject(err) : resolve(record) - }) - }) - }).then(function (record) { + const mongoQuery = { + [mapper.idAttribute]: this.toObjectID(mapper, id) + } + + client.collection(collectionId) + .findOne(mongoQuery, findOneOpts, (err, record) => err ? failure(err) : success(record)) + }).then((record) => { if (record) { - self._translateObjectIDs(record, opts) + this._translateObjectIDs(record, opts) } return [record, {}] }) @@ -550,10 +538,11 @@ utils.addHiddenPropsToTarget(MongoDBAdapter.prototype, { * Retrieve the records that match the selection query. * * @method MongoDBAdapter#findAll - * @param {Object} mapper The mapper. - * @param {Object} query Selection query. - * @param {Object} [opts] Configuration options. - * @param {Object} [opts.findOpts] Options to pass to collection#find. + * @param {object} mapper The mapper. + * @param {object} query Selection query. + * @param {object} [opts] Configuration options. + * @param {string|string[]|object} [opts.fields] Select a subset of fields to be returned. + * @param {object} [opts.findOpts] Options to pass to collection#find. * @param {boolean} [opts.raw=false] Whether to return a more detailed * response object. * @param {string[]} [opts.with=[]] Relations to eager load. @@ -566,43 +555,76 @@ utils.addHiddenPropsToTarget(MongoDBAdapter.prototype, { * * @method MongoDBAdapter#_findAll * @private - * @param {Object} mapper The mapper. - * @param {Object} query Selection query. - * @param {Object} [opts] Configuration options. + * @param {object} mapper The mapper. + * @param {object} query Selection query. + * @param {object} [opts] Configuration options. + * @param {string|string[]|object} [opts.fields] Select a subset of fields to be returned. * @return {Promise} */ _findAll (mapper, query, opts) { - const self = this opts || (opts = {}) - const findOpts = self.getOpt('findOpts', opts) - utils.fillIn(findOpts, self.getQueryOptions(mapper, query)) - findOpts.fields || (findOpts.fields = {}) - const mongoQuery = self.getQuery(mapper, query) + return this._run((client, success, failure) => { + const collectionId = this._getCollectionId(mapper, opts) + const findOpts = this.getOpt('findOpts', opts) + utils.fillIn(findOpts, this.getQueryOptions(mapper, query)) + findOpts.fields = this._getFields(mapper, opts) - return self.getClient().then(function (client) { - return new Promise(function (resolve, reject) { - client.collection(mapper.table || underscore(mapper.name)).find(mongoQuery, findOpts).toArray(function (err, records) { - return err ? reject(err) : resolve(records) - }) - }) - }).then(function (records) { - self._translateObjectIDs(records, opts) + const mongoQuery = this.getQuery(mapper, query) + + client.collection(collectionId) + .find(mongoQuery, findOpts) + .toArray((err, records) => err ? failure(err) : success(records)) + }).then((records) => { + this._translateObjectIDs(records, opts) return [records, {}] }) }, + _getCollectionId (mapper, opts) { + opts || (opts = {}) + return opts.table || opts.collection || mapper.table || mapper.collection || underscore(mapper.name) + }, + + _getFields (mapper, opts) { + opts || (opts = {}) + if (utils.isString(opts.fields)) { + opts.fields = { [opts.fields]: 1 } + } else if (utils.isArray(opts.fields)) { + const fields = {} + opts.fields.forEach((field) => { + fields[field] = 1 + }) + return fields + } + return opts.fields + }, + + _run (cb) { + if (this._db) { + // Use the cached db object + return new utils.Promise((resolve, reject) => { + cb(this._db, resolve, reject) + }) + } + return this.getClient().then((client) => { + return new utils.Promise((resolve, reject) => { + cb(client, resolve, reject) + }) + }) + }, + /** * Apply the given update to the record with the specified primary key. * * @method MongoDBAdapter#update - * @param {Object} mapper The mapper. + * @param {object} mapper The mapper. * @param {(string|number)} id The primary key of the record to be updated. - * @param {Object} props The update to apply to the record. - * @param {Object} [opts] Configuration options. + * @param {object} props The update to apply to the record. + * @param {object} [opts] Configuration options. * @param {boolean} [opts.raw=false] Whether to return a more detailed * response object. - * @param {Object} [opts.updateOpts] Options to pass to collection#update. + * @param {object} [opts.updateOpts] Options to pass to collection#update. * @return {Promise} */ @@ -612,51 +634,60 @@ utils.addHiddenPropsToTarget(MongoDBAdapter.prototype, { * * @method MongoDBAdapter#_update * @private - * @param {Object} mapper The mapper. + * @param {object} mapper The mapper. * @param {(string|number)} id The primary key of the record to be updated. - * @param {Object} props The update to apply to the record. - * @param {Object} [opts] Configuration options. + * @param {object} props The update to apply to the record. + * @param {object} [opts] Configuration options. * @return {Promise} */ _update (mapper, id, props, opts) { - const self = this props || (props = {}) opts || (opts = {}) - const updateOpts = self.getOpt('updateOpts', opts) - return self.find(mapper, id, { raw: false }).then(function (record) { - if (!record) { - throw new Error('Not Found') - } - return self.getClient().then(function (client) { - return new Promise(function (resolve, reject) { - const mongoQuery = {} - mongoQuery[mapper.idAttribute] = self.toObjectID(mapper, id) - const collection = client.collection(mapper.table || underscore(mapper.name)) - collection[collection.updateOne ? 'updateOne' : 'update'](mongoQuery, { $set: props }, updateOpts, function (err, cursor) { - return err ? reject(err) : resolve(cursor) - }) + return this._find(mapper, id, { raw: false }) + .then((result) => { + if (!result[0]) { + throw new Error('Not Found') + } + return this._run((client, success, failure) => { + const collectionId = this._getCollectionId(mapper, opts) + const updateOpts = this.getOpt('updateOpts', opts) + + const mongoQuery = { + [mapper.idAttribute]: this.toObjectID(mapper, id) + } + const collection = client.collection(collectionId) + const handler = (err, cursor) => err ? failure(err) : success(cursor) + + if (collection.updateOne) { + collection + .updateOne(mongoQuery, { $set: props }, updateOpts, handler) + } else { + collection + .update(mongoQuery, { $set: props }, updateOpts, handler) + } }) }) - }).then(function (cursor) { - return self.find(mapper, id, { raw: false }).then(function (record) { - cursor.connection = undefined - return [record, cursor] + .then((cursor) => { + return this._find(mapper, id, { raw: false }) + .then((result) => { + cursor.connection = undefined + return [result[0], cursor] + }) }) - }) }, /** * Apply the given update to all records that match the selection query. * * @method MongoDBAdapter#updateAll - * @param {Object} mapper The mapper. - * @param {Object} props The update to apply to the selected records. - * @param {Object} [query] Selection query. - * @param {Object} [opts] Configuration options. + * @param {object} mapper The mapper. + * @param {object} props The update to apply to the selected records. + * @param {object} [query] Selection query. + * @param {object} [opts] Configuration options. * @param {boolean} [opts.raw=false] Whether to return a more detailed * response object. - * @param {Object} [opts.updateOpts] Options to pass to collection#update. + * @param {object} [opts.updateOpts] Options to pass to collection#update. * @return {Promise} */ @@ -673,41 +704,42 @@ utils.addHiddenPropsToTarget(MongoDBAdapter.prototype, { * @return {Promise} */ _updateAll (mapper, props, query, opts) { - const self = this props || (props = {}) query || (query = {}) opts || (opts = {}) let ids - const updateOpts = self.getOpt('updateOpts', opts) - updateOpts.multi = true - - return Promise.all([ - self.findAll(mapper, query, { raw: false }), - self.getClient() - ]).then(function (results) { - let [records, client] = results - const queryOptions = self.getQueryOptions(mapper, query) - const mongoQuery = self.getQuery(mapper, query) - - queryOptions.$set = props - ids = records.map(function (record) { - return self.toObjectID(mapper, record[mapper.idAttribute]) - }) - return new Promise(function (resolve, reject) { - const collection = client.collection(mapper.table || underscore(mapper.name)) - collection[collection.updateMany ? 'updateMany' : 'update'](mongoQuery, queryOptions, updateOpts, function (err, cursor) { - return err ? reject(err) : resolve(cursor) - }) + return this._run((client, success, failure) => { + return this._findAll(mapper, query, { raw: false }).then((result) => { + const collectionId = this._getCollectionId(mapper, opts) + const updateOpts = this.getOpt('updateOpts', opts) + updateOpts.multi = true + + const queryOptions = this.getQueryOptions(mapper, query) + queryOptions.$set = props + ids = result[0].map((record) => this.toObjectID(mapper, record[mapper.idAttribute])) + + const mongoQuery = this.getQuery(mapper, query) + const collection = client.collection(collectionId) + const handler = (err, cursor) => err ? failure(err) : success(cursor) + + if (collection.updateMany) { + collection + .updateMany(mongoQuery, queryOptions, updateOpts, handler) + } else { + collection + .update(mongoQuery, queryOptions, updateOpts, handler) + } }) - }).then(function (cursor) { - const query = {} - query[mapper.idAttribute] = { - 'in': ids + }).then((cursor) => { + const query = { + [mapper.idAttribute]: { + 'in': ids + } } - return self.findAll(mapper, query, { raw: false }).then(function (records) { + return this._findAll(mapper, query, { raw: false }).then((result) => { cursor.connection = undefined - return [records, cursor] + return [result[0], cursor] }) }) }, @@ -719,7 +751,7 @@ utils.addHiddenPropsToTarget(MongoDBAdapter.prototype, { * Useful when you need to do anything custom with the MongoDB client library. * * @method MongoDBAdapter#getClient - * @return {Object} MongoDB client. + * @return {object} MongoDB client. */ getClient () { return this.client @@ -734,7 +766,7 @@ utils.addHiddenPropsToTarget(MongoDBAdapter.prototype, { * - and bunch of filtering operators * * @method MongoDBAdapter#getQuery - * @return {Object} + * @return {object} */ getQuery (mapper, query) { query = utils.plainCopy(query || {}) @@ -858,7 +890,7 @@ utils.addHiddenPropsToTarget(MongoDBAdapter.prototype, { * - orderBy/sort * * @method MongoDBAdapter#getQueryOptions - * @return {Object} + * @return {object} */ getQueryOptions (mapper, query) { query = utils.plainCopy(query || {}) @@ -924,12 +956,9 @@ utils.addHiddenPropsToTarget(MongoDBAdapter.prototype, { * @return {*} */ makeHasManyLocalKeys (mapper, def, record) { - const self = this const relatedMapper = def.getRelation() - const localKeys = Adapter.prototype.makeHasManyLocalKeys.call(self, mapper, def, record) - return localKeys.map(function (key) { - return self.toObjectID(relatedMapper, key) - }) + const localKeys = Adapter.prototype.makeHasManyLocalKeys.call(this, mapper, def, record) + return localKeys.map((key) => this.toObjectID(relatedMapper, key)) }, /** @@ -950,7 +979,7 @@ utils.addHiddenPropsToTarget(MongoDBAdapter.prototype, { * console.log(version.full) * * @name module:js-data-mongodb.version - * @type {Object} + * @type {object} * @property {string} version.full The full semver value. * @property {number} version.major The major version number. * @property {number} version.minor The minor version number. @@ -978,7 +1007,7 @@ export const version = '<%= version %>' * Registered as `js-data-mongodb` in NPM. * * @example Install from NPM - * npm i --save js-data-mongodb@beta js-data@beta mongodb bson + * npm i --save js-data-mongodb@rc js-data@rc mongodb bson * * @example Load via CommonJS * var MongoDBAdapter = require('js-data-mongodb').MongoDBAdapter @@ -990,3 +1019,56 @@ export const version = '<%= version %>' * * @module js-data-mongodb */ + + /** + * Create a subclass of this MongoDBAdapter: + * @example MongoDBAdapter.extend + * // Normally you would do: import { MongoDBAdapter } from 'js-data-mongodb' + * const JSDataMongoDB = require('js-data-mongodb') + * const { MongoDBAdapter } = JSDataMongoDB + * console.log('Using JSDataMongoDB v' + JSDataMongoDB.version.full) + * + * // Extend the class using ES2015 class syntax. + * class CustomMongoDBAdapterClass extends MongoDBAdapter { + * foo () { return 'bar' } + * static beep () { return 'boop' } + * } + * const customMongoDBAdapter = new CustomMongoDBAdapterClass() + * console.log(customMongoDBAdapter.foo()) + * console.log(CustomMongoDBAdapterClass.beep()) + * + * // Extend the class using alternate method. + * const OtherMongoDBAdapterClass = MongoDBAdapter.extend({ + * foo () { return 'bar' } + * }, { + * beep () { return 'boop' } + * }) + * const otherMongoDBAdapter = new OtherMongoDBAdapterClass() + * console.log(otherMongoDBAdapter.foo()) + * console.log(OtherMongoDBAdapterClass.beep()) + * + * // Extend the class, providing a custom constructor. + * function AnotherMongoDBAdapterClass () { + * MongoDBAdapter.call(this) + * this.created_at = new Date().getTime() + * } + * MongoDBAdapter.extend({ + * constructor: AnotherMongoDBAdapterClass, + * foo () { return 'bar' } + * }, { + * beep () { return 'boop' } + * }) + * const anotherMongoDBAdapter = new AnotherMongoDBAdapterClass() + * console.log(anotherMongoDBAdapter.created_at) + * console.log(anotherMongoDBAdapter.foo()) + * console.log(AnotherMongoDBAdapterClass.beep()) + * + * @method MongoDBAdapter.extend + * @param {object} [props={}] Properties to add to the prototype of the + * subclass. + * @param {object} [props.constructor] Provide a custom constructor function + * to be used as the subclass itself. + * @param {object} [classProps={}] Static properties to add to the subclass. + * @returns {Constructor} Subclass of this MongoDBAdapter class. + * @since 3.0.0 + */ From fd6664d0c66513f0a84f275915ba5312a1ef3f57 Mon Sep 17 00:00:00 2001 From: Cory Robinson Date: Wed, 14 Sep 2016 16:44:10 -0700 Subject: [PATCH 18/36] chore(dependencies): update bson dep vers (#19) --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index ecc4124..c19e8a1 100644 --- a/package.json +++ b/package.json @@ -62,7 +62,7 @@ "mout": "1.0.0" }, "peerDependencies": { - "bson": "^0.4.x || ^0.3.x", + "bson": ">=0.3.x", "js-data": "^3.0.0-rc.4", "mongodb": ">=1.3.x" }, From d14bd42378de01cbb87de7e8cb0c41258070279b Mon Sep 17 00:00:00 2001 From: Jason Dobry Date: Mon, 19 Sep 2016 18:31:25 -0700 Subject: [PATCH 19/36] Update CONTRIBUTING.md --- .github/CONTRIBUTING.md | 83 ++++++++++++++++++++++++++++++++--------- 1 file changed, 66 insertions(+), 17 deletions(-) diff --git a/.github/CONTRIBUTING.md b/.github/CONTRIBUTING.md index 2e8d87f..0a661cb 100644 --- a/.github/CONTRIBUTING.md +++ b/.github/CONTRIBUTING.md @@ -1,37 +1,86 @@ # Contributing to js-data-mongodb -[Read the general Contributing Guide](http://js-data.io/docs/contributing). +Dear contributor, +**Thank you!** Projects like this are successful because of you! + +## Getting started + +1. Read the the general [JSData Contributing Guide](http://js-data.io/docs/contributing) +1. To report a bug or request a feature, please [open an issue](https://github.com/js-data/js-data-mongodb/issues/new) + * Be sure to search the existing issues to prevent duplication + * Give your issue a short but descriptive title + * For bug reports, please include all steps to reproduce the error + * For feature requests, please include details of your use case +1. To improve to the JSData + MongoDB tutorial, go to [js-data.io/v3.0/docs/js-data-mongodb](http://www.js-data.io/v3.0/docs/js-data-mongodb) and click "Suggest Edits" +1. To improve the API Reference Documentation, write a test, fix a bug, or add a feature: + 1. Create a fork of github.com/js-data/js-data-mongodb. [Click here](https://github.com/js-data/js-data-mongodb#fork-destination-box) to do so now. + 1. Clone your fork: + + ``` + git clone git@github.com:YOUR_USERNAME/js-data-mongodb.git + ``` + 1. Change directory to `js-data-mongodb`: + + ``` + cd js-data-mongodb + ``` + 1. Install development dependencies + + ``` + npm install js-data@rc bson mongodb + npm install + ``` +1. To just update API Reference Documentation, make changes to the [JSDoc](http://usejsdoc.org/) comments in the source code. To regenerate the API documentation: + + ``` + npm run doc + ``` + + You can find the regenerated API Reference Documentation in the `doc/` folder. +1. To write a test, fix a bug, or add a feature, make your changes to files in the `src/` and `test/` folders. +1. To run the tests, first make sure MongoDB is running in another terminal window: + + ``` + mongod --config /path/to/mongod.conf + ``` +1. Now run the tests: + + ``` + npm test + ``` + ## Project structure +* `coverage/` - Code coverage report produced by `npm test` * `dist/` - Contains final build files for distribution * `doc/` - Output folder for JSDocs * `src/` - Project source code * `test/` - Project tests -## Clone, build & test - -1. `clone git@github.com:js-data/js-data-mongodb.git` -1. `cd js-data-mongodb` -1. `npm install` -1. `npm run build` - Lint and build distribution files -1. `npm run mocha` - Run tests (RethinkDB must be running) - ## To cut a release -1. Checkout master +1. `git checkout master` 1. Bump version in `package.json` appropriately 1. Update `CHANGELOG.md` appropriately -1. Run `npm run release` -1. Commit and push changes -1. Checkout `release`, merge `master` into `release` -1. Run `npm run release` again -1. Commit and push changes -1. Make a GitHub release +1. `npm run release` +1. Commit and push changes (message should be something like "Prepare for VERSION") +1. `git checkout release` +1. `git merge master` +1. `npm run release` +1. Commit and push changes (message should be something like "VERSION") +1. [Make a new GitHub release](https://github.com/js-data/js-data-mongodb/releases/new) - tag from `release` branch - set tag name to version - set release name to version - set release body to changelog entry for the version 1. `npm publish .` +1. `git checkout gh-pages` +1. `cp -r doc/js-data-mongodb/VERSION VERSION` +1. `cp -r doc/js-data-mongodb/VERSION latest` +1. `git add -A` +1. `git commit -m "VERSION"` +1. `git push -u origin gh-pages` +1. `git checkout master` -See also [Community & Support](http://js-data.io/docs/community). +See also [JSData Community & Support](http://js-data.io/docs/community). From 50b5793826b1caee164d686b6bf598cbbd20aa8d Mon Sep 17 00:00:00 2001 From: Jason Dobry Date: Mon, 19 Sep 2016 18:33:03 -0700 Subject: [PATCH 20/36] Update CONTRIBUTING.md --- .github/CONTRIBUTING.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/.github/CONTRIBUTING.md b/.github/CONTRIBUTING.md index 0a661cb..f754082 100644 --- a/.github/CONTRIBUTING.md +++ b/.github/CONTRIBUTING.md @@ -49,7 +49,9 @@ Dear contributor, ``` npm test ``` - + +1. Commit your changes, submit a Pull Request, and wait for review! + ## Project structure * `coverage/` - Code coverage report produced by `npm test` From a7ba7f7605c282c90eb0958217fe097574320ea9 Mon Sep 17 00:00:00 2001 From: Jason Dobry Date: Mon, 19 Sep 2016 18:53:19 -0700 Subject: [PATCH 21/36] Update docs. --- .github/ISSUE_TEMPLATE.md | 8 ++- .github/PULL_REQUEST_TEMPLATE.md | 6 +-- README.md | 90 ++++++++++++++++++-------------- 3 files changed, 58 insertions(+), 46 deletions(-) diff --git a/.github/ISSUE_TEMPLATE.md b/.github/ISSUE_TEMPLATE.md index b66d610..3669fd4 100644 --- a/.github/ISSUE_TEMPLATE.md +++ b/.github/ISSUE_TEMPLATE.md @@ -1,5 +1,9 @@ -(delete this line) Find out how to get help here: http://js-data.io/docs/community. +## Description - + + +## Steps to reproduce + + Thanks! diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md index 4a12cfd..618e220 100644 --- a/.github/PULL_REQUEST_TEMPLATE.md +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -1,6 +1,4 @@ Fixes # (it's a good idea to open an issue first for discussion) -- [ ] - `npm test` succeeds -- [ ] - Code coverage does not decrease (if any source code was changed) -- [ ] - Appropriate JSDoc comments were updated in source code (if applicable) -- [ ] - Approprate changes to js-data.io docs have been suggested ("Suggest Edits" button) +- [ ] - If applicable, appropriate JSDoc comments were updated in source code +- [ ] - If applicable, approprate changes to js-data.io docs have been suggested ("Suggest Edits" button) diff --git a/README.md b/README.md index 2a4408f..b968dc6 100644 --- a/README.md +++ b/README.md @@ -2,43 +2,53 @@ # js-data-mongodb -[![Slack Status][sl_b]][sl_l] -[![npm version][npm_b]][npm_l] -[![Circle CI][circle_b]][circle_l] -[![npm downloads][dn_b]][dn_l] -[![Coverage Status][cov_b]][cov_l] - -MongoDB adapter for [js-data](http://www.js-data.io/). - -To get started, visit __[http://js-data.io](http://www.js-data.io/docs/js-data-mongodb)__. - -## Links - -* [Quick start](http://www.js-data.io/docs/home#quick-start) - Get started in 5 minutes -* [Guides and Tutorials](http://www.js-data.io/docs/home) - Learn how to use JSData -* [`MongoDBAdapter` Guide](http://www.js-data.io/docs/js-data-mongodb) - Learn how to use `MongoDBAdapter` -* [API Reference Docs](http://api.js-data.io) - Explore components, methods, options, etc. -* [Community & Support](http://js-data.io/docs/community) - Find solutions and chat with the community -* [General Contributing Guide](http://js-data.io/docs/contributing) - Give back and move the project forward - * [Contributing to js-data-mongodb](https://github.com/js-data/js-data-mongodb/blob/master/.github/CONTRIBUTING.md) - -## License - -The MIT License (MIT) - -Copyright (c) 2014-2016 js-data-mongodb project authors - -* [LICENSE](https://github.com/js-data/js-data-mongodb/blob/master/LICENSE) -* [AUTHORS](https://github.com/js-data/js-data-mongodb/blob/master/AUTHORS) -* [CONTRIBUTORS](https://github.com/js-data/js-data-mongodb/blob/master/CONTRIBUTORS) - -[sl_b]: http://slack.js-data.io/badge.svg -[sl_l]: http://slack.js-data.io -[npm_b]: https://img.shields.io/npm/v/js-data-mongodb.svg?style=flat -[npm_l]: https://www.npmjs.org/package/js-data-mongodb -[circle_b]: https://img.shields.io/circleci/project/js-data/js-data-mongodb.svg?style=flat -[circle_l]: https://circleci.com/gh/js-data/js-data-mongodb -[dn_b]: https://img.shields.io/npm/dm/js-data-mongodb.svg?style=flat -[dn_l]: https://www.npmjs.org/package/js-data-mongodb -[cov_b]: https://img.shields.io/codecov/c/github/js-data/js-data-mongodb.svg?style=flat -[cov_l]: https://codecov.io/github/js-data/js-data-mongodb +[![Slack][1]][2] +[![NPM][3]][4] +[![Tests][5]][6] +[![Downloads][7]][8] +[![Coverage][9]][10] + +A MongoDB adapter for the [JSData Node.js ORM][11]. + +### Just getting started? + +Start with the [JSData + MongoDB tutorial][12] or checkout the [API Reference Documentation][13]. + +### Need help? + +Please [post a question][14] on Stack Overflow. **This is the preferred method.** + +You can also chat with folks on the [Slack Channel][15]. If you end up getting +your question answered, please still consider consider posting your question to +Stack Overflow (then possibly answering it yourself). Thanks! + +### Want to contribute? + +Awesome! You can get started over at the [Contributing guide][16]. + +Thank you! + +### License + +[The MIT License (MIT)][17] + +Copyright (c) 2014-2016 [js-data-mongodb project authors][18] + +[1]: http://slack.js-data.io/badge.svg +[2]: http://slack.js-data.io +[3]: https://img.shields.io/npm/v/js-data-mongodb.svg?style=flat +[4]: https://www.npmjs.org/package/js-data-mongodb +[5]: https://img.shields.io/circleci/project/js-data/js-data-mongodb.svg?style=flat +[6]: https://circleci.com/gh/js-data/js-data-mongodb +[7]: https://img.shields.io/npm/dm/js-data-mongodb.svg?style=flat +[8]: https://www.npmjs.org/package/js-data-mongodb +[9]: https://img.shields.io/codecov/c/github/js-data/js-data-mongodb.svg?style=flat +[10]: https://codecov.io/github/js-data/js-data-mongodb +[11]: http://www.js-data.io/ +[12]: http://www.js-data.io/v3.0/docs/js-data-mongodb +[13]: http://api.js-data.io/js-data-mongodb +[14]: http://stackoverflow.com/questions/tagged/jsdata +[15]: http://slack.js-data.io/ +[16]: https://github.com/js-data/js-data-mongodb/blob/master/.github/CONTRIBUTING.md +[17]: https://github.com/js-data/js-data-mongodb/blob/master/LICENSE +[18]: https://github.com/js-data/js-data-mongodb/blob/master/AUTHORS From 675d4404e4568d343a9ac7c43056df22b300ca63 Mon Sep 17 00:00:00 2001 From: Cory Robinson Date: Tue, 20 Sep 2016 22:54:08 -0700 Subject: [PATCH 22/36] add semantic-release package publishing (#23) * docs(.github/): add comments on semantic-release to PR template .md * chore(build-steps): add semantic-release package and circle.yml configs for auto npm publish --- .github/PULL_REQUEST_TEMPLATE.md | 7 ++++++- circle.yml | 3 ++- package.json | 12 +++++++++--- 3 files changed, 17 insertions(+), 5 deletions(-) diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md index 618e220..468731b 100644 --- a/.github/PULL_REQUEST_TEMPLATE.md +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -1,4 +1,9 @@ Fixes # (it's a good idea to open an issue first for discussion) +> Note: This project uses `semantic-release` to auto publish npm packages on successful builds. +The commit messages must follow AngularJS Commit Msg Conventions: https://docs.google.com/document/d/1QrDFcIiPjSLDn3EL15IJygNPiHORgU1_OOAqWjiDU5Y/edit#heading=h.uyo6cb12dt6w + +- [ ] - My commit messages follow AngularJS Commit Msg Conventions - [ ] - If applicable, appropriate JSDoc comments were updated in source code -- [ ] - If applicable, approprate changes to js-data.io docs have been suggested ("Suggest Edits" button) +- [ ] - If applicable, appropriate changes to js-data.io docs have been suggested ("Suggest Edits" button) +- [ ] - Unit test coverage did not decrease & appropriate tests changes made diff --git a/circle.yml b/circle.yml index 7df1a71..74c6d46 100644 --- a/circle.yml +++ b/circle.yml @@ -4,7 +4,7 @@ general: - gh-pages machine: node: - version: 5.7.0 + version: 6 dependencies: pre: - npm install -g npm @@ -13,3 +13,4 @@ dependencies: test: post: - nyc report --reporter=lcov | codecov + - npm run semantic-release || true diff --git a/package.json b/package.json index c19e8a1..557275d 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "js-data-mongodb", "description": "MongoDB adapter for js-data.", - "version": "1.0.0-rc.1", + "version": "0.0.0-semantic-release", "homepage": "https://github.com/js-data/js-data-mongodb", "repository": { "type": "git", @@ -55,7 +55,11 @@ "mocha": "mocha -t 20000 -R dot -r babel-core/register -r babel-polyfill mocha.start.js", "cover": "nyc --require babel-core/register --require babel-polyfill --cache mocha -t 20000 -R dot mocha.start.js && nyc report --reporter=html", "test": "npm run build && npm run cover", - "release": "npm test && npm run doc && repo-tools updates && repo-tools changelog && repo-tools authors" + "release": "npm test && npm run doc && repo-tools updates && repo-tools changelog && repo-tools authors", + "semantic-release": "semantic-release pre && npm publish && semantic-release post" + }, + "release": { + "verifyConditions": "condition-circle" }, "dependencies": { "js-data-adapter": "~0.8.2", @@ -67,6 +71,8 @@ "mongodb": ">=1.3.x" }, "devDependencies": { - "js-data-repo-tools": "0.5.6" + "condition-circle": "^1.5.0", + "js-data-repo-tools": "0.5.6", + "semantic-release": "^4.3.5" } } From 9457953cfb951de5ddbef3ec4b061ab33cbcfc67 Mon Sep 17 00:00:00 2001 From: Cory Robinson Date: Tue, 20 Sep 2016 23:34:08 -0700 Subject: [PATCH 23/36] Build process - semantic-release npm publish (#24) * docs(.github/): add comments on semantic-release to PR template .md * chore(build-steps): add semantic-release package and circle.yml configs for auto npm publish * test(coverage): add tests to increase coverage --- mocha.start.js | 1 + test/find.test.js | 34 ++++++++++++++++++++++++++++++++++ test/update.test.js | 28 ++++++++++++++++++++++++++++ 3 files changed, 63 insertions(+) create mode 100644 test/update.test.js diff --git a/mocha.start.js b/mocha.start.js index 4667152..11ea0d7 100644 --- a/mocha.start.js +++ b/mocha.start.js @@ -41,6 +41,7 @@ JSDataAdapterTests.init({ }) require('./test/find.test') +require('./test/update.test') describe('exports', function () { it('should have exports', function () { diff --git a/test/find.test.js b/test/find.test.js index 24f571a..f5404c3 100644 --- a/test/find.test.js +++ b/test/find.test.js @@ -58,4 +58,38 @@ describe('MongoDBAdapter#find', function () { assert.objectsEqual(user, { _id: id, bsonField: ObjectID.toString() }) }) }) + + it('should use orderBy array', function () { + var id + + return adapter.findAll(User, { + name: 'John' + }).then(function (users) { + assert.equal(users.length, 0) + return adapter.create(User, { _id: '1', name: 'John' }) + }).then(function (user) { + id = user._id + assert.equal(typeof id, 'string') + return adapter.findAll(User, {where: {id: id}, orderBy: ['name', 'asc']}) + }).then(function (userList) { + assert.objectsEqual(userList, [{ _id: id, name: 'John' }]) + }) + }) + + it('should use orderBy string', function () { + var id + + return adapter.findAll(User, { + name: 'John' + }).then(function (users) { + assert.equal(users.length, 0) + return adapter.create(User, { _id: '1', name: 'John' }) + }).then(function (user) { + id = user._id + assert.equal(typeof id, 'string') + return adapter.findAll(User, {where: {id: id}, orderBy: 'name'}) + }).then(function (userList) { + assert.objectsEqual(userList, [{ _id: id, name: 'John' }]) + }) + }) }) diff --git a/test/update.test.js b/test/update.test.js new file mode 100644 index 0000000..0c07dc7 --- /dev/null +++ b/test/update.test.js @@ -0,0 +1,28 @@ +describe('MongoDBAdapter#find', function () { + var adapter + + // create a record to test update against + before(function () { + var id + + this.$$adapter.findAll(this.$$User, { + name: 'John' + }).then(function (users) { + assert.equal(users.length, 0) + return this.$$adapter.create(this.$$User, {name: 'John'}) + }).then(function (user) { + id = user._id + return this.$$adapter.find(this.$$User, id.toString()) + }).then(function (user) { + assert.objectsEqual(user, {_id: id, name: 'John'}) + }) + }) + + beforeEach(function () { + adapter = this.$$adapter + }) + + it('should not support updateMany', function () { + return assert.throws(adapter.updateMany) + }) +}) From 1936fd8a9004b699f9443c04c1f0f8fb5636e612 Mon Sep 17 00:00:00 2001 From: Cory Robinson Date: Tue, 20 Sep 2016 23:52:38 -0700 Subject: [PATCH 24/36] Build process (#25) * docs(.github/): add comments on semantic-release to PR template .md * chore(build-steps): add semantic-release package and circle.yml configs for auto npm publish * test(coverage): add tests to increase coverage * test(): add missed return stmt * fix(test): demo fix testing semantic-release --- README.md | 2 ++ test/update.test.js | 28 ++++++++++++++++------------ 2 files changed, 18 insertions(+), 12 deletions(-) diff --git a/README.md b/README.md index b968dc6..d3a3aa2 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,5 @@ + +[![semantic-release](https://img.shields.io/badge/%20%20%F0%9F%93%A6%F0%9F%9A%80-semantic--release-e10079.svg)](https://github.com/semantic-release/semantic-release) js-data logo # js-data-mongodb diff --git a/test/update.test.js b/test/update.test.js index 0c07dc7..3bc42ea 100644 --- a/test/update.test.js +++ b/test/update.test.js @@ -3,23 +3,27 @@ describe('MongoDBAdapter#find', function () { // create a record to test update against before(function () { - var id + // var id - this.$$adapter.findAll(this.$$User, { - name: 'John' - }).then(function (users) { - assert.equal(users.length, 0) - return this.$$adapter.create(this.$$User, {name: 'John'}) - }).then(function (user) { - id = user._id - return this.$$adapter.find(this.$$User, id.toString()) - }).then(function (user) { - assert.objectsEqual(user, {_id: id, name: 'John'}) - }) + // adapter = this.$$adapter + // User = this.$$user + + // return adapter.findAll(User, { + // name: 'John' + // }).then(function (users) { + // assert.equal(users.length, 0) + // return adapter.create(User, {name: 'John'}) + // }).then(function (user) { + // id = user._id + // return adapter.find(User, id.toString()) + // }).then(function (user) { + // assert.objectsEqual(user, {_id: id, name: 'John'}) + // }) }) beforeEach(function () { adapter = this.$$adapter + // User = this.$$user }) it('should not support updateMany', function () { From de461ee24af1ee3b95bb83e66945e16114f50361 Mon Sep 17 00:00:00 2001 From: Cory Robinson Date: Tue, 20 Sep 2016 23:57:56 -0700 Subject: [PATCH 25/36] Build process (#26) * docs(.github/): add comments on semantic-release to PR template .md * chore(build-steps): add semantic-release package and circle.yml configs for auto npm publish * test(coverage): add tests to increase coverage * test(): add missed return stmt * fix(test): demo fix testing semantic-release * chore(build): add release branch to the semantic-release config --- package.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/package.json b/package.json index 557275d..ba55d1e 100644 --- a/package.json +++ b/package.json @@ -59,7 +59,8 @@ "semantic-release": "semantic-release pre && npm publish && semantic-release post" }, "release": { - "verifyConditions": "condition-circle" + "verifyConditions": "condition-circle", + "branch": "realease" }, "dependencies": { "js-data-adapter": "~0.8.2", From 1213d5c9a820d8fe2adc5013b1851c6ade341b00 Mon Sep 17 00:00:00 2001 From: Cory Robinson Date: Mon, 26 Sep 2016 20:19:19 -0700 Subject: [PATCH 26/36] Js docs (#28) * fix(test): demo fix testing semantic-release * test(update.test.js): comment out unused code * docs(): small docs changes * test(): add custom mongodb query test --- src/index.js | 7 +++++-- test/find.test.js | 9 +++++++++ 2 files changed, 14 insertions(+), 2 deletions(-) diff --git a/src/index.js b/src/index.js index 8e890b2..50ede48 100644 --- a/src/index.js +++ b/src/index.js @@ -17,7 +17,9 @@ const DEFAULTS = { */ translateId: true, /** - * Convert fields of record from databse that are ObjectIDs to strings + * Convert fields of record from database that are ObjectIDs to strings + * + * @name MongoDBAdapter#translateObjectIDs * @type {Boolean} * @default false */ @@ -78,6 +80,7 @@ const REMOVE_OPTS_DEFAULTS = {} * @param {boolean} [opts.raw=false] See {@link Adapter#raw}. * @param {object} [opts.removeOpts] See {@link MongoDBAdapter#removeOpts}. * @param {boolean} [opts.translateId=true] See {@link MongoDBAdapter#translateId}. + * @param {boolean} [opts.translateObjectIDs=false] See {@link MongoDBAdapter#translateObjectIDs}. * @param {object} [opts.updateOpts] See {@link MongoDBAdapter#updateOpts}. * @param {string} [opts.uri="mongodb://localhost:27017"] See {@link MongoDBAdapter#uri}. */ @@ -172,7 +175,7 @@ export function MongoDBAdapter (opts) { utils.fillIn(this.updateOpts, UPDATE_OPTS_DEFAULTS) /** - * Default options to pass to collection#update. + * Default options to pass to collection#destroy. * * @name MongoDBAdapter#removeOpts * @type {object} diff --git a/test/find.test.js b/test/find.test.js index f5404c3..c72d9cc 100644 --- a/test/find.test.js +++ b/test/find.test.js @@ -92,4 +92,13 @@ describe('MongoDBAdapter#find', function () { assert.objectsEqual(userList, [{ _id: id, name: 'John' }]) }) }) + + it('should allow use of node-mongodb-native via adapter.client', function () { + return adapter.client.then((db) => { + assert.ok(db.collection('user')) + }) + .catch((err) => { + throw new Error(err) + }) + }) }) From f6805aa417b2dee873c51182ee3b5f7650bfcd0e Mon Sep 17 00:00:00 2001 From: Cory Robinson Date: Wed, 19 Oct 2016 17:01:34 -0700 Subject: [PATCH 27/36] revert: remove build-process semantic-release (#31) --- .github/PULL_REQUEST_TEMPLATE.md | 4 ---- README.md | 1 - circle.yml | 1 - package.json | 13 +++---------- 4 files changed, 3 insertions(+), 16 deletions(-) diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md index 468731b..8a76ba5 100644 --- a/.github/PULL_REQUEST_TEMPLATE.md +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -1,9 +1,5 @@ Fixes # (it's a good idea to open an issue first for discussion) -> Note: This project uses `semantic-release` to auto publish npm packages on successful builds. -The commit messages must follow AngularJS Commit Msg Conventions: https://docs.google.com/document/d/1QrDFcIiPjSLDn3EL15IJygNPiHORgU1_OOAqWjiDU5Y/edit#heading=h.uyo6cb12dt6w - -- [ ] - My commit messages follow AngularJS Commit Msg Conventions - [ ] - If applicable, appropriate JSDoc comments were updated in source code - [ ] - If applicable, appropriate changes to js-data.io docs have been suggested ("Suggest Edits" button) - [ ] - Unit test coverage did not decrease & appropriate tests changes made diff --git a/README.md b/README.md index d3a3aa2..52274ec 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,4 @@ -[![semantic-release](https://img.shields.io/badge/%20%20%F0%9F%93%A6%F0%9F%9A%80-semantic--release-e10079.svg)](https://github.com/semantic-release/semantic-release) js-data logo # js-data-mongodb diff --git a/circle.yml b/circle.yml index 74c6d46..109a5c8 100644 --- a/circle.yml +++ b/circle.yml @@ -13,4 +13,3 @@ dependencies: test: post: - nyc report --reporter=lcov | codecov - - npm run semantic-release || true diff --git a/package.json b/package.json index ba55d1e..c19e8a1 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "js-data-mongodb", "description": "MongoDB adapter for js-data.", - "version": "0.0.0-semantic-release", + "version": "1.0.0-rc.1", "homepage": "https://github.com/js-data/js-data-mongodb", "repository": { "type": "git", @@ -55,12 +55,7 @@ "mocha": "mocha -t 20000 -R dot -r babel-core/register -r babel-polyfill mocha.start.js", "cover": "nyc --require babel-core/register --require babel-polyfill --cache mocha -t 20000 -R dot mocha.start.js && nyc report --reporter=html", "test": "npm run build && npm run cover", - "release": "npm test && npm run doc && repo-tools updates && repo-tools changelog && repo-tools authors", - "semantic-release": "semantic-release pre && npm publish && semantic-release post" - }, - "release": { - "verifyConditions": "condition-circle", - "branch": "realease" + "release": "npm test && npm run doc && repo-tools updates && repo-tools changelog && repo-tools authors" }, "dependencies": { "js-data-adapter": "~0.8.2", @@ -72,8 +67,6 @@ "mongodb": ">=1.3.x" }, "devDependencies": { - "condition-circle": "^1.5.0", - "js-data-repo-tools": "0.5.6", - "semantic-release": "^4.3.5" + "js-data-repo-tools": "0.5.6" } } From 4a1aadbe42bb1d05c7d94bedd71442c894378150 Mon Sep 17 00:00:00 2001 From: Cory Robinson Date: Tue, 23 May 2017 22:54:12 -0700 Subject: [PATCH 28/36] feat(): add adapter option mongoDriverOpts, add default option ignoreUndefined (#32) --- src/index.js | 15 +++++++++++-- test/update.test.js | 51 +++++++++++++++++++++++++++------------------ 2 files changed, 44 insertions(+), 22 deletions(-) diff --git a/src/index.js b/src/index.js index 50ede48..7ffed98 100644 --- a/src/index.js +++ b/src/index.js @@ -32,7 +32,18 @@ const DEFAULTS = { * @type {string} * @default mongodb://localhost:27017 */ - uri: 'mongodb://localhost:27017' + uri: 'mongodb://localhost:27017', + + /** + * MongoDB Driver options + * + * @name MongoDBAdapter#mongoDriverOpts + * @type {object} + * @default { ignoreUndefined: true } + */ + mongoDriverOpts: { + ignoreUndefined: true + } } const COUNT_OPTS_DEFAULTS = {} @@ -185,7 +196,7 @@ export function MongoDBAdapter (opts) { utils.fillIn(this.removeOpts, REMOVE_OPTS_DEFAULTS) this.client = new utils.Promise((resolve, reject) => { - MongoClient.connect(opts.uri, (err, db) => { + MongoClient.connect(opts.uri, opts.mongoDriverOpts, (err, db) => { if (err) { return reject(err) } diff --git a/test/update.test.js b/test/update.test.js index 3bc42ea..d802916 100644 --- a/test/update.test.js +++ b/test/update.test.js @@ -1,26 +1,8 @@ +import * as JSData from 'js-data' + describe('MongoDBAdapter#find', function () { var adapter - // create a record to test update against - before(function () { - // var id - - // adapter = this.$$adapter - // User = this.$$user - - // return adapter.findAll(User, { - // name: 'John' - // }).then(function (users) { - // assert.equal(users.length, 0) - // return adapter.create(User, {name: 'John'}) - // }).then(function (user) { - // id = user._id - // return adapter.find(User, id.toString()) - // }).then(function (user) { - // assert.objectsEqual(user, {_id: id, name: 'John'}) - // }) - }) - beforeEach(function () { adapter = this.$$adapter // User = this.$$user @@ -29,4 +11,33 @@ describe('MongoDBAdapter#find', function () { it('should not support updateMany', function () { return assert.throws(adapter.updateMany) }) + + it('should ignore undefined when resource has schema', function () { + var id + + const schema = new JSData.Schema({ + 'type': 'object', + 'properties': { + 'name': { + 'type': 'string' + }, + 'b': { + 'type': 'string' + } + } + }) + const User = this.$$store.defineMapper('user', { schema: schema }) + + return adapter.findAll(User, { + name: 'John' + }).then(function (users) { + assert.equal(users.length, 0) + return adapter.create(User, {name: 'John'}) + }).then(function (user) { + id = user._id + return adapter.find(User, id.toString()) + }).then(function (user) { + assert.objectsEqual(user, {_id: id, name: 'John'}) + }) + }) }) From 0d0edac5df9efde843e00967e2439370d7c1e736 Mon Sep 17 00:00:00 2001 From: Jason Dobry Date: Thu, 25 May 2017 06:59:25 -0700 Subject: [PATCH 29/36] Prepare for 1.0.0-rc.2 release. --- .babelrc | 9 + CONTRIBUTORS | 5 +- mocha.start.js | 2 +- package.json | 32 +- rollup.config.js | 14 +- yarn.lock | 4096 ++++++++++++++++++++++++++++++++++++++++++++++ 6 files changed, 4141 insertions(+), 17 deletions(-) create mode 100644 .babelrc create mode 100644 yarn.lock diff --git a/.babelrc b/.babelrc new file mode 100644 index 0000000..c3b590c --- /dev/null +++ b/.babelrc @@ -0,0 +1,9 @@ +{ + "presets": [ + "es2015" + ], + "plugins": [ + "syntax-async-functions", + "transform-regenerator" + ] +} \ No newline at end of file diff --git a/CONTRIBUTORS b/CONTRIBUTORS index 2813981..f97d70e 100644 --- a/CONTRIBUTORS +++ b/CONTRIBUTORS @@ -4,5 +4,6 @@ # # Names should be added to this file as: # [commit count] Name - 26 Jason Dobry - 1 John Grogg + 9 Cory Robinson + 42 Jason Dobry + 1 John Grogg diff --git a/mocha.start.js b/mocha.start.js index 11ea0d7..8578f77 100644 --- a/mocha.start.js +++ b/mocha.start.js @@ -1,4 +1,4 @@ -/*global assert:true */ +/* global assert:true */ 'use strict' // prepare environment for js-data-adapter-tests diff --git a/package.json b/package.json index c19e8a1..df4d3c2 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "js-data-mongodb", "description": "MongoDB adapter for js-data.", - "version": "1.0.0-rc.1", + "version": "1.0.0-rc.2", "homepage": "https://github.com/js-data/js-data-mongodb", "repository": { "type": "git", @@ -41,16 +41,10 @@ "dist/" ] }, - "babel": { - "presets": [ - "es2015" - ] - }, "scripts": { - "lint": "repo-tools lint \"**/*.js\"", - "bundle": "rollup -c rollup.config.js -f cjs -o dist/js-data-mongodb.js -m dist/js-data-mongodb.js.map src/index.js && repo-tools write-version dist/js-data-mongodb.js", + "lint": "standard '**/*.js'", + "bundle": "rollup src/index.js -c -o dist/js-data-mongodb.js -m dist/js-data-mongodb.js.map -f cjs && repo-tools write-version dist/js-data-mongodb.js", "doc": "jsdoc -c conf.json src node_modules/js-data-adapter/src", - "watch": "watch \"npm run bundle\" src/", "build": "npm run lint && npm run bundle", "mocha": "mocha -t 20000 -R dot -r babel-core/register -r babel-polyfill mocha.start.js", "cover": "nyc --require babel-core/register --require babel-polyfill --cache mocha -t 20000 -R dot mocha.start.js && nyc report --reporter=html", @@ -63,10 +57,26 @@ }, "peerDependencies": { "bson": ">=0.3.x", - "js-data": "^3.0.0-rc.4", + "js-data": "^3.0.0-rc.9", "mongodb": ">=1.3.x" }, "devDependencies": { - "js-data-repo-tools": "0.5.6" + "babel-core": "6.24.1", + "babel-eslint": "7.2.3", + "babel-plugin-external-helpers": "6.22.0", + "babel-plugin-syntax-async-functions": "6.13.0", + "babel-plugin-transform-regenerator": "6.24.1", + "babel-polyfill": "6.23.0", + "babel-preset-es2015": "6.24.1", + "chai": "3.5.0", + "ink-docstrap": "git+https://github.com/js-data/docstrap.git#cfbe45fa313e1628c493076d5e15d2b855dfbf2c", + "js-data-repo-tools": "1.0.0", + "jsdoc": "3.4.3", + "mocha": "3.4.2", + "nyc": "10.3.2", + "rollup": "0.41.6", + "rollup-plugin-babel": "2.7.1", + "sinon": "2.3.1", + "standard": "10.0.2" } } diff --git a/rollup.config.js b/rollup.config.js index a41b2c5..c4da68f 100644 --- a/rollup.config.js +++ b/rollup.config.js @@ -1,6 +1,6 @@ -var babel = require('rollup-plugin-babel') +import babel from 'rollup-plugin-babel' -module.exports = { +export default { external: [ 'mongodb', 'bson', @@ -11,8 +11,16 @@ module.exports = { plugins: [ babel({ babelrc: false, + plugins: [ + 'external-helpers' + ], presets: [ - 'es2015-rollup' + [ + 'es2015', + { + modules: false + } + ] ], exclude: 'node_modules/**' }) diff --git a/yarn.lock b/yarn.lock new file mode 100644 index 0000000..963825b --- /dev/null +++ b/yarn.lock @@ -0,0 +1,4096 @@ +# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. +# yarn lockfile v1 + + +abbrev@1, abbrev@~1.0.9: + version "1.0.9" + resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.0.9.tgz#91b4792588a7738c25f35dd6f63752a2f8776135" + +acorn-jsx@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-3.0.1.tgz#afdf9488fb1ecefc8348f6fb22f464e32a58b36b" + dependencies: + acorn "^3.0.4" + +acorn@^3.0.4, acorn@^3.3.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-3.3.0.tgz#45e37fb39e8da3f25baee3ff5369e2bb5f22017a" + +acorn@^5.0.1: + version "5.0.3" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-5.0.3.tgz#c460df08491463f028ccb82eab3730bf01087b3d" + +ajv-keywords@^1.0.0: + version "1.5.1" + resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-1.5.1.tgz#314dd0a4b3368fad3dfcdc54ede6171b886daf3c" + +ajv@^4.7.0: + version "4.11.8" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-4.11.8.tgz#82ffb02b29e662ae53bdc20af15947706739c536" + dependencies: + co "^4.6.0" + json-stable-stringify "^1.0.1" + +align-text@^0.1.1, align-text@^0.1.3: + version "0.1.4" + resolved "https://registry.yarnpkg.com/align-text/-/align-text-0.1.4.tgz#0cd90a561093f35d0a99256c22b7069433fad117" + dependencies: + kind-of "^3.0.2" + longest "^1.0.1" + repeat-string "^1.5.2" + +amdefine@>=0.0.4: + version "1.0.1" + resolved "https://registry.yarnpkg.com/amdefine/-/amdefine-1.0.1.tgz#4a5282ac164729e93619bcfd3ad151f817ce91f5" + +ansi-align@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/ansi-align/-/ansi-align-1.1.0.tgz#2f0c1658829739add5ebb15e6b0c6e3423f016ba" + dependencies: + string-width "^1.0.1" + +ansi-escapes@^1.1.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-1.4.0.tgz#d3a8a83b319aa67793662b13e761c7911422306e" + +ansi-regex@^2.0.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df" + +ansi-styles@^2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe" + +ansicolors@~0.3.2: + version "0.3.2" + resolved "https://registry.yarnpkg.com/ansicolors/-/ansicolors-0.3.2.tgz#665597de86a9ffe3aa9bfbe6cae5c6ea426b4979" + +ansistyles@~0.1.3: + version "0.1.3" + resolved "https://registry.yarnpkg.com/ansistyles/-/ansistyles-0.1.3.tgz#5de60415bda071bb37127854c864f41b23254539" + +append-transform@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/append-transform/-/append-transform-0.4.0.tgz#d76ebf8ca94d276e247a36bad44a4b74ab611991" + dependencies: + default-require-extensions "^1.0.0" + +aproba@^1.0.3, aproba@~1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/aproba/-/aproba-1.0.4.tgz#2713680775e7614c8ba186c065d4e2e52d1072c0" + +archy@^1.0.0, archy@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/archy/-/archy-1.0.0.tgz#f9c8c13757cc1dd7bc379ac77b2c62a5c2868c40" + +are-we-there-yet@~1.1.2: + version "1.1.4" + resolved "https://registry.yarnpkg.com/are-we-there-yet/-/are-we-there-yet-1.1.4.tgz#bb5dca382bb94f05e15194373d16fd3ba1ca110d" + dependencies: + delegates "^1.0.0" + readable-stream "^2.0.6" + +argparse@^1.0.7: + version "1.0.9" + resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.9.tgz#73d83bc263f86e97f8cc4f6bae1b0e90a7d22c86" + dependencies: + sprintf-js "~1.0.2" + +arr-diff@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-2.0.0.tgz#8f3b827f955a8bd669697e4a4256ac3ceae356cf" + dependencies: + arr-flatten "^1.0.1" + +arr-flatten@^1.0.1: + version "1.0.3" + resolved "https://registry.yarnpkg.com/arr-flatten/-/arr-flatten-1.0.3.tgz#a274ed85ac08849b6bd7847c4580745dc51adfb1" + +array-index@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/array-index/-/array-index-1.0.0.tgz#ec56a749ee103e4e08c790b9c353df16055b97f9" + dependencies: + debug "^2.2.0" + es6-symbol "^3.0.2" + +array-union@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/array-union/-/array-union-1.0.2.tgz#9a34410e4f4e3da23dea375be5be70f24778ec39" + dependencies: + array-uniq "^1.0.1" + +array-uniq@^1.0.1: + version "1.0.3" + resolved "https://registry.yarnpkg.com/array-uniq/-/array-uniq-1.0.3.tgz#af6ac877a25cc7f74e058894753858dfdb24fdb6" + +array-unique@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.2.1.tgz#a1d97ccafcbc2625cc70fadceb36a50c58b01a53" + +array.prototype.find@^2.0.1: + version "2.0.4" + resolved "https://registry.yarnpkg.com/array.prototype.find/-/array.prototype.find-2.0.4.tgz#556a5c5362c08648323ddaeb9de9d14bc1864c90" + dependencies: + define-properties "^1.1.2" + es-abstract "^1.7.0" + +arrify@^1.0.0, arrify@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/arrify/-/arrify-1.0.1.tgz#898508da2226f380df904728456849c1501a4b0d" + +asap@^2.0.0, asap@~2.0.5: + version "2.0.5" + resolved "https://registry.yarnpkg.com/asap/-/asap-2.0.5.tgz#522765b50c3510490e52d7dcfe085ef9ba96958f" + +asn1@~0.2.3: + version "0.2.3" + resolved "https://registry.yarnpkg.com/asn1/-/asn1-0.2.3.tgz#dac8787713c9966849fc8180777ebe9c1ddf3b86" + +assert-plus@1.0.0, assert-plus@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-1.0.0.tgz#f12e0f3c5d77b0b1cdd9146942e4e96c1e4dd525" + +assert-plus@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-0.2.0.tgz#d74e1b87e7affc0db8aadb7021f3fe48101ab234" + +assertion-error@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/assertion-error/-/assertion-error-1.0.2.tgz#13ca515d86206da0bac66e834dd397d87581094c" + +async@^1.4.0: + version "1.5.2" + resolved "https://registry.yarnpkg.com/async/-/async-1.5.2.tgz#ec6a61ae56480c0c3cb241c95618e20892f9672a" + +asynckit@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" + +aws-sign2@~0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.6.0.tgz#14342dd38dbcc94d0e5b87d763cd63612c0e794f" + +aws4@^1.2.1: + version "1.6.0" + resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.6.0.tgz#83ef5ca860b2b32e4a0deedee8c771b9db57471e" + +babel-code-frame@^6.16.0, babel-code-frame@^6.22.0: + version "6.22.0" + resolved "https://registry.yarnpkg.com/babel-code-frame/-/babel-code-frame-6.22.0.tgz#027620bee567a88c32561574e7fd0801d33118e4" + dependencies: + chalk "^1.1.0" + esutils "^2.0.2" + js-tokens "^3.0.0" + +babel-core@6, babel-core@6.24.1, babel-core@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-core/-/babel-core-6.24.1.tgz#8c428564dce1e1f41fb337ec34f4c3b022b5ad83" + dependencies: + babel-code-frame "^6.22.0" + babel-generator "^6.24.1" + babel-helpers "^6.24.1" + babel-messages "^6.23.0" + babel-register "^6.24.1" + babel-runtime "^6.22.0" + babel-template "^6.24.1" + babel-traverse "^6.24.1" + babel-types "^6.24.1" + babylon "^6.11.0" + convert-source-map "^1.1.0" + debug "^2.1.1" + json5 "^0.5.0" + lodash "^4.2.0" + minimatch "^3.0.2" + path-is-absolute "^1.0.0" + private "^0.1.6" + slash "^1.0.0" + source-map "^0.5.0" + +babel-eslint@7.1.1: + version "7.1.1" + resolved "https://registry.yarnpkg.com/babel-eslint/-/babel-eslint-7.1.1.tgz#8a6a884f085aa7060af69cfc77341c2f99370fb2" + dependencies: + babel-code-frame "^6.16.0" + babel-traverse "^6.15.0" + babel-types "^6.15.0" + babylon "^6.13.0" + lodash.pickby "^4.6.0" + +babel-eslint@7.2.3: + version "7.2.3" + resolved "https://registry.yarnpkg.com/babel-eslint/-/babel-eslint-7.2.3.tgz#b2fe2d80126470f5c19442dc757253a897710827" + dependencies: + babel-code-frame "^6.22.0" + babel-traverse "^6.23.1" + babel-types "^6.23.0" + babylon "^6.17.0" + +babel-generator@^6.18.0, babel-generator@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-generator/-/babel-generator-6.24.1.tgz#e715f486c58ded25649d888944d52aa07c5d9497" + dependencies: + babel-messages "^6.23.0" + babel-runtime "^6.22.0" + babel-types "^6.24.1" + detect-indent "^4.0.0" + jsesc "^1.3.0" + lodash "^4.2.0" + source-map "^0.5.0" + trim-right "^1.0.1" + +babel-helper-call-delegate@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-helper-call-delegate/-/babel-helper-call-delegate-6.24.1.tgz#ece6aacddc76e41c3461f88bfc575bd0daa2df8d" + dependencies: + babel-helper-hoist-variables "^6.24.1" + babel-runtime "^6.22.0" + babel-traverse "^6.24.1" + babel-types "^6.24.1" + +babel-helper-define-map@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-helper-define-map/-/babel-helper-define-map-6.24.1.tgz#7a9747f258d8947d32d515f6aa1c7bd02204a080" + dependencies: + babel-helper-function-name "^6.24.1" + babel-runtime "^6.22.0" + babel-types "^6.24.1" + lodash "^4.2.0" + +babel-helper-function-name@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-helper-function-name/-/babel-helper-function-name-6.24.1.tgz#d3475b8c03ed98242a25b48351ab18399d3580a9" + dependencies: + babel-helper-get-function-arity "^6.24.1" + babel-runtime "^6.22.0" + babel-template "^6.24.1" + babel-traverse "^6.24.1" + babel-types "^6.24.1" + +babel-helper-get-function-arity@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-helper-get-function-arity/-/babel-helper-get-function-arity-6.24.1.tgz#8f7782aa93407c41d3aa50908f89b031b1b6853d" + dependencies: + babel-runtime "^6.22.0" + babel-types "^6.24.1" + +babel-helper-hoist-variables@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-helper-hoist-variables/-/babel-helper-hoist-variables-6.24.1.tgz#1ecb27689c9d25513eadbc9914a73f5408be7a76" + dependencies: + babel-runtime "^6.22.0" + babel-types "^6.24.1" + +babel-helper-optimise-call-expression@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-helper-optimise-call-expression/-/babel-helper-optimise-call-expression-6.24.1.tgz#f7a13427ba9f73f8f4fa993c54a97882d1244257" + dependencies: + babel-runtime "^6.22.0" + babel-types "^6.24.1" + +babel-helper-regex@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-helper-regex/-/babel-helper-regex-6.24.1.tgz#d36e22fab1008d79d88648e32116868128456ce8" + dependencies: + babel-runtime "^6.22.0" + babel-types "^6.24.1" + lodash "^4.2.0" + +babel-helper-replace-supers@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-helper-replace-supers/-/babel-helper-replace-supers-6.24.1.tgz#bf6dbfe43938d17369a213ca8a8bf74b6a90ab1a" + dependencies: + babel-helper-optimise-call-expression "^6.24.1" + babel-messages "^6.23.0" + babel-runtime "^6.22.0" + babel-template "^6.24.1" + babel-traverse "^6.24.1" + babel-types "^6.24.1" + +babel-helpers@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-helpers/-/babel-helpers-6.24.1.tgz#3471de9caec388e5c850e597e58a26ddf37602b2" + dependencies: + babel-runtime "^6.22.0" + babel-template "^6.24.1" + +babel-messages@^6.23.0: + version "6.23.0" + resolved "https://registry.yarnpkg.com/babel-messages/-/babel-messages-6.23.0.tgz#f3cdf4703858035b2a2951c6ec5edf6c62f2630e" + dependencies: + babel-runtime "^6.22.0" + +babel-plugin-check-es2015-constants@^6.22.0: + version "6.22.0" + resolved "https://registry.yarnpkg.com/babel-plugin-check-es2015-constants/-/babel-plugin-check-es2015-constants-6.22.0.tgz#35157b101426fd2ffd3da3f75c7d1e91835bbf8a" + dependencies: + babel-runtime "^6.22.0" + +babel-plugin-external-helpers@6.22.0: + version "6.22.0" + resolved "https://registry.yarnpkg.com/babel-plugin-external-helpers/-/babel-plugin-external-helpers-6.22.0.tgz#2285f48b02bd5dede85175caf8c62e86adccefa1" + dependencies: + babel-runtime "^6.22.0" + +babel-plugin-syntax-async-functions@6.13.0: + version "6.13.0" + resolved "https://registry.yarnpkg.com/babel-plugin-syntax-async-functions/-/babel-plugin-syntax-async-functions-6.13.0.tgz#cad9cad1191b5ad634bf30ae0872391e0647be95" + +babel-plugin-transform-es2015-arrow-functions@^6.22.0: + version "6.22.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-arrow-functions/-/babel-plugin-transform-es2015-arrow-functions-6.22.0.tgz#452692cb711d5f79dc7f85e440ce41b9f244d221" + dependencies: + babel-runtime "^6.22.0" + +babel-plugin-transform-es2015-block-scoped-functions@^6.22.0: + version "6.22.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-block-scoped-functions/-/babel-plugin-transform-es2015-block-scoped-functions-6.22.0.tgz#bbc51b49f964d70cb8d8e0b94e820246ce3a6141" + dependencies: + babel-runtime "^6.22.0" + +babel-plugin-transform-es2015-block-scoping@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-block-scoping/-/babel-plugin-transform-es2015-block-scoping-6.24.1.tgz#76c295dc3a4741b1665adfd3167215dcff32a576" + dependencies: + babel-runtime "^6.22.0" + babel-template "^6.24.1" + babel-traverse "^6.24.1" + babel-types "^6.24.1" + lodash "^4.2.0" + +babel-plugin-transform-es2015-classes@^6.24.1, babel-plugin-transform-es2015-classes@^6.9.0: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-classes/-/babel-plugin-transform-es2015-classes-6.24.1.tgz#5a4c58a50c9c9461e564b4b2a3bfabc97a2584db" + dependencies: + babel-helper-define-map "^6.24.1" + babel-helper-function-name "^6.24.1" + babel-helper-optimise-call-expression "^6.24.1" + babel-helper-replace-supers "^6.24.1" + babel-messages "^6.23.0" + babel-runtime "^6.22.0" + babel-template "^6.24.1" + babel-traverse "^6.24.1" + babel-types "^6.24.1" + +babel-plugin-transform-es2015-computed-properties@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-computed-properties/-/babel-plugin-transform-es2015-computed-properties-6.24.1.tgz#6fe2a8d16895d5634f4cd999b6d3480a308159b3" + dependencies: + babel-runtime "^6.22.0" + babel-template "^6.24.1" + +babel-plugin-transform-es2015-destructuring@^6.22.0: + version "6.23.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-destructuring/-/babel-plugin-transform-es2015-destructuring-6.23.0.tgz#997bb1f1ab967f682d2b0876fe358d60e765c56d" + dependencies: + babel-runtime "^6.22.0" + +babel-plugin-transform-es2015-duplicate-keys@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-duplicate-keys/-/babel-plugin-transform-es2015-duplicate-keys-6.24.1.tgz#73eb3d310ca969e3ef9ec91c53741a6f1576423e" + dependencies: + babel-runtime "^6.22.0" + babel-types "^6.24.1" + +babel-plugin-transform-es2015-for-of@^6.22.0: + version "6.23.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-for-of/-/babel-plugin-transform-es2015-for-of-6.23.0.tgz#f47c95b2b613df1d3ecc2fdb7573623c75248691" + dependencies: + babel-runtime "^6.22.0" + +babel-plugin-transform-es2015-function-name@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-function-name/-/babel-plugin-transform-es2015-function-name-6.24.1.tgz#834c89853bc36b1af0f3a4c5dbaa94fd8eacaa8b" + dependencies: + babel-helper-function-name "^6.24.1" + babel-runtime "^6.22.0" + babel-types "^6.24.1" + +babel-plugin-transform-es2015-literals@^6.22.0: + version "6.22.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-literals/-/babel-plugin-transform-es2015-literals-6.22.0.tgz#4f54a02d6cd66cf915280019a31d31925377ca2e" + dependencies: + babel-runtime "^6.22.0" + +babel-plugin-transform-es2015-modules-amd@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-amd/-/babel-plugin-transform-es2015-modules-amd-6.24.1.tgz#3b3e54017239842d6d19c3011c4bd2f00a00d154" + dependencies: + babel-plugin-transform-es2015-modules-commonjs "^6.24.1" + babel-runtime "^6.22.0" + babel-template "^6.24.1" + +babel-plugin-transform-es2015-modules-commonjs@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-commonjs/-/babel-plugin-transform-es2015-modules-commonjs-6.24.1.tgz#d3e310b40ef664a36622200097c6d440298f2bfe" + dependencies: + babel-plugin-transform-strict-mode "^6.24.1" + babel-runtime "^6.22.0" + babel-template "^6.24.1" + babel-types "^6.24.1" + +babel-plugin-transform-es2015-modules-systemjs@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-systemjs/-/babel-plugin-transform-es2015-modules-systemjs-6.24.1.tgz#ff89a142b9119a906195f5f106ecf305d9407d23" + dependencies: + babel-helper-hoist-variables "^6.24.1" + babel-runtime "^6.22.0" + babel-template "^6.24.1" + +babel-plugin-transform-es2015-modules-umd@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-umd/-/babel-plugin-transform-es2015-modules-umd-6.24.1.tgz#ac997e6285cd18ed6176adb607d602344ad38468" + dependencies: + babel-plugin-transform-es2015-modules-amd "^6.24.1" + babel-runtime "^6.22.0" + babel-template "^6.24.1" + +babel-plugin-transform-es2015-object-super@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-object-super/-/babel-plugin-transform-es2015-object-super-6.24.1.tgz#24cef69ae21cb83a7f8603dad021f572eb278f8d" + dependencies: + babel-helper-replace-supers "^6.24.1" + babel-runtime "^6.22.0" + +babel-plugin-transform-es2015-parameters@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-parameters/-/babel-plugin-transform-es2015-parameters-6.24.1.tgz#57ac351ab49caf14a97cd13b09f66fdf0a625f2b" + dependencies: + babel-helper-call-delegate "^6.24.1" + babel-helper-get-function-arity "^6.24.1" + babel-runtime "^6.22.0" + babel-template "^6.24.1" + babel-traverse "^6.24.1" + babel-types "^6.24.1" + +babel-plugin-transform-es2015-shorthand-properties@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-shorthand-properties/-/babel-plugin-transform-es2015-shorthand-properties-6.24.1.tgz#24f875d6721c87661bbd99a4622e51f14de38aa0" + dependencies: + babel-runtime "^6.22.0" + babel-types "^6.24.1" + +babel-plugin-transform-es2015-spread@^6.22.0: + version "6.22.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-spread/-/babel-plugin-transform-es2015-spread-6.22.0.tgz#d6d68a99f89aedc4536c81a542e8dd9f1746f8d1" + dependencies: + babel-runtime "^6.22.0" + +babel-plugin-transform-es2015-sticky-regex@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-sticky-regex/-/babel-plugin-transform-es2015-sticky-regex-6.24.1.tgz#00c1cdb1aca71112cdf0cf6126c2ed6b457ccdbc" + dependencies: + babel-helper-regex "^6.24.1" + babel-runtime "^6.22.0" + babel-types "^6.24.1" + +babel-plugin-transform-es2015-template-literals@^6.22.0: + version "6.22.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-template-literals/-/babel-plugin-transform-es2015-template-literals-6.22.0.tgz#a84b3450f7e9f8f1f6839d6d687da84bb1236d8d" + dependencies: + babel-runtime "^6.22.0" + +babel-plugin-transform-es2015-typeof-symbol@^6.22.0: + version "6.23.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-typeof-symbol/-/babel-plugin-transform-es2015-typeof-symbol-6.23.0.tgz#dec09f1cddff94b52ac73d505c84df59dcceb372" + dependencies: + babel-runtime "^6.22.0" + +babel-plugin-transform-es2015-unicode-regex@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-unicode-regex/-/babel-plugin-transform-es2015-unicode-regex-6.24.1.tgz#d38b12f42ea7323f729387f18a7c5ae1faeb35e9" + dependencies: + babel-helper-regex "^6.24.1" + babel-runtime "^6.22.0" + regexpu-core "^2.0.0" + +babel-plugin-transform-regenerator@6.24.1, babel-plugin-transform-regenerator@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-regenerator/-/babel-plugin-transform-regenerator-6.24.1.tgz#b8da305ad43c3c99b4848e4fe4037b770d23c418" + dependencies: + regenerator-transform "0.9.11" + +babel-plugin-transform-strict-mode@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-strict-mode/-/babel-plugin-transform-strict-mode-6.24.1.tgz#d5faf7aa578a65bbe591cf5edae04a0c67020758" + dependencies: + babel-runtime "^6.22.0" + babel-types "^6.24.1" + +babel-polyfill@6.23.0: + version "6.23.0" + resolved "https://registry.yarnpkg.com/babel-polyfill/-/babel-polyfill-6.23.0.tgz#8364ca62df8eafb830499f699177466c3b03499d" + dependencies: + babel-runtime "^6.22.0" + core-js "^2.4.0" + regenerator-runtime "^0.10.0" + +babel-preset-es2015@6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-preset-es2015/-/babel-preset-es2015-6.24.1.tgz#d44050d6bc2c9feea702aaf38d727a0210538939" + dependencies: + babel-plugin-check-es2015-constants "^6.22.0" + babel-plugin-transform-es2015-arrow-functions "^6.22.0" + babel-plugin-transform-es2015-block-scoped-functions "^6.22.0" + babel-plugin-transform-es2015-block-scoping "^6.24.1" + babel-plugin-transform-es2015-classes "^6.24.1" + babel-plugin-transform-es2015-computed-properties "^6.24.1" + babel-plugin-transform-es2015-destructuring "^6.22.0" + babel-plugin-transform-es2015-duplicate-keys "^6.24.1" + babel-plugin-transform-es2015-for-of "^6.22.0" + babel-plugin-transform-es2015-function-name "^6.24.1" + babel-plugin-transform-es2015-literals "^6.22.0" + babel-plugin-transform-es2015-modules-amd "^6.24.1" + babel-plugin-transform-es2015-modules-commonjs "^6.24.1" + babel-plugin-transform-es2015-modules-systemjs "^6.24.1" + babel-plugin-transform-es2015-modules-umd "^6.24.1" + babel-plugin-transform-es2015-object-super "^6.24.1" + babel-plugin-transform-es2015-parameters "^6.24.1" + babel-plugin-transform-es2015-shorthand-properties "^6.24.1" + babel-plugin-transform-es2015-spread "^6.22.0" + babel-plugin-transform-es2015-sticky-regex "^6.24.1" + babel-plugin-transform-es2015-template-literals "^6.22.0" + babel-plugin-transform-es2015-typeof-symbol "^6.22.0" + babel-plugin-transform-es2015-unicode-regex "^6.24.1" + babel-plugin-transform-regenerator "^6.24.1" + +babel-register@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-register/-/babel-register-6.24.1.tgz#7e10e13a2f71065bdfad5a1787ba45bca6ded75f" + dependencies: + babel-core "^6.24.1" + babel-runtime "^6.22.0" + core-js "^2.4.0" + home-or-tmp "^2.0.0" + lodash "^4.2.0" + mkdirp "^0.5.1" + source-map-support "^0.4.2" + +babel-runtime@^6.18.0, babel-runtime@^6.22.0: + version "6.23.0" + resolved "https://registry.yarnpkg.com/babel-runtime/-/babel-runtime-6.23.0.tgz#0a9489f144de70efb3ce4300accdb329e2fc543b" + dependencies: + core-js "^2.4.0" + regenerator-runtime "^0.10.0" + +babel-template@^6.16.0, babel-template@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-template/-/babel-template-6.24.1.tgz#04ae514f1f93b3a2537f2a0f60a5a45fb8308333" + dependencies: + babel-runtime "^6.22.0" + babel-traverse "^6.24.1" + babel-types "^6.24.1" + babylon "^6.11.0" + lodash "^4.2.0" + +babel-traverse@^6.15.0, babel-traverse@^6.18.0, babel-traverse@^6.23.1, babel-traverse@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-traverse/-/babel-traverse-6.24.1.tgz#ab36673fd356f9a0948659e7b338d5feadb31695" + dependencies: + babel-code-frame "^6.22.0" + babel-messages "^6.23.0" + babel-runtime "^6.22.0" + babel-types "^6.24.1" + babylon "^6.15.0" + debug "^2.2.0" + globals "^9.0.0" + invariant "^2.2.0" + lodash "^4.2.0" + +babel-types@^6.15.0, babel-types@^6.18.0, babel-types@^6.19.0, babel-types@^6.23.0, babel-types@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-types/-/babel-types-6.24.1.tgz#a136879dc15b3606bda0d90c1fc74304c2ff0975" + dependencies: + babel-runtime "^6.22.0" + esutils "^2.0.2" + lodash "^4.2.0" + to-fast-properties "^1.0.1" + +babylon@^6.11.0, babylon@^6.13.0, babylon@^6.15.0, babylon@^6.17.0: + version "6.17.1" + resolved "https://registry.yarnpkg.com/babylon/-/babylon-6.17.1.tgz#17f14fddf361b695981fe679385e4f1c01ebd86f" + +balanced-match@^0.4.1: + version "0.4.2" + resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-0.4.2.tgz#cb3f3e3c732dc0f01ee70b403f302e61d7709838" + +bcrypt-pbkdf@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.1.tgz#63bc5dcb61331b92bc05fd528953c33462a06f8d" + dependencies: + tweetnacl "^0.14.3" + +bl@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/bl/-/bl-1.1.2.tgz#fdca871a99713aa00d19e3bbba41c44787a65398" + dependencies: + readable-stream "~2.0.5" + +block-stream@*: + version "0.0.9" + resolved "https://registry.yarnpkg.com/block-stream/-/block-stream-0.0.9.tgz#13ebfe778a03205cfe03751481ebb4b3300c126a" + dependencies: + inherits "~2.0.0" + +bluebird@^3.4.3, bluebird@~3.4.6: + version "3.4.7" + resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.4.7.tgz#f72d760be09b7f76d08ed8fae98b289a8d05fab3" + +boom@2.x.x: + version "2.10.1" + resolved "https://registry.yarnpkg.com/boom/-/boom-2.10.1.tgz#39c8918ceff5799f83f9492a848f625add0c766f" + dependencies: + hoek "2.x.x" + +boxen@^0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/boxen/-/boxen-0.6.0.tgz#8364d4248ac34ff0ef1b2f2bf49a6c60ce0d81b6" + dependencies: + ansi-align "^1.1.0" + camelcase "^2.1.0" + chalk "^1.1.1" + cli-boxes "^1.0.0" + filled-array "^1.0.0" + object-assign "^4.0.1" + repeating "^2.0.0" + string-width "^1.0.1" + widest-line "^1.0.0" + +brace-expansion@^1.1.7: + version "1.1.7" + resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.7.tgz#3effc3c50e000531fb720eaff80f0ae8ef23cf59" + dependencies: + balanced-match "^0.4.1" + concat-map "0.0.1" + +braces@^1.8.2: + version "1.8.5" + resolved "https://registry.yarnpkg.com/braces/-/braces-1.8.5.tgz#ba77962e12dff969d6b76711e914b737857bf6a7" + dependencies: + expand-range "^1.8.1" + preserve "^0.2.0" + repeat-element "^1.1.2" + +browser-stdout@1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/browser-stdout/-/browser-stdout-1.3.0.tgz#f351d32969d32fa5d7a5567154263d928ae3bd1f" + +bson@>=0.3.x, bson@~1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/bson/-/bson-1.0.4.tgz#93c10d39eaa5b58415cbc4052f3e53e562b0b72c" + +buffer-shims@^1.0.0, buffer-shims@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/buffer-shims/-/buffer-shims-1.0.0.tgz#9978ce317388c649ad8793028c3477ef044a8b51" + +builtin-modules@^1.0.0, builtin-modules@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/builtin-modules/-/builtin-modules-1.1.1.tgz#270f076c5a72c02f5b65a47df94c5fe3a278892f" + +builtins@0.0.7: + version "0.0.7" + resolved "https://registry.yarnpkg.com/builtins/-/builtins-0.0.7.tgz#355219cd6cf18dbe7c01cc7fd2dce765cfdc549a" + +builtins@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/builtins/-/builtins-1.0.3.tgz#cb94faeb61c8696451db36534e1422f94f0aee88" + +caching-transform@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/caching-transform/-/caching-transform-1.0.1.tgz#6dbdb2f20f8d8fbce79f3e94e9d1742dcdf5c0a1" + dependencies: + md5-hex "^1.2.0" + mkdirp "^0.5.1" + write-file-atomic "^1.1.4" + +caller-path@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/caller-path/-/caller-path-0.1.0.tgz#94085ef63581ecd3daa92444a8fe94e82577751f" + dependencies: + callsites "^0.2.0" + +callsites@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/callsites/-/callsites-0.2.0.tgz#afab96262910a7f33c19a5775825c69f34e350ca" + +camelcase@^1.0.2: + version "1.2.1" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-1.2.1.tgz#9bb5304d2e0b56698b2c758b08a3eaa9daa58a39" + +camelcase@^2.1.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-2.1.1.tgz#7c1d16d679a1bbe59ca02cacecfb011e201f5a1f" + +camelcase@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-3.0.0.tgz#32fc4b9fcdaf845fcdf7e73bb97cac2261f0ab0a" + +capture-stack-trace@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/capture-stack-trace/-/capture-stack-trace-1.0.0.tgz#4a6fa07399c26bba47f0b2496b4d0fb408c5550d" + +caseless@~0.11.0: + version "0.11.0" + resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.11.0.tgz#715b96ea9841593cc33067923f5ec60ebda4f7d7" + +catharsis@~0.8.8: + version "0.8.8" + resolved "https://registry.yarnpkg.com/catharsis/-/catharsis-0.8.8.tgz#693479f43aac549d806bd73e924cd0d944951a06" + dependencies: + underscore-contrib "~0.3.0" + +center-align@^0.1.1: + version "0.1.3" + resolved "https://registry.yarnpkg.com/center-align/-/center-align-0.1.3.tgz#aa0d32629b6ee972200411cbd4461c907bc2b7ad" + dependencies: + align-text "^0.1.3" + lazy-cache "^1.0.3" + +chai@3.5.0, chai@^3.5.0: + version "3.5.0" + resolved "https://registry.yarnpkg.com/chai/-/chai-3.5.0.tgz#4d02637b067fe958bdbfdd3a40ec56fef7373247" + dependencies: + assertion-error "^1.0.1" + deep-eql "^0.1.3" + type-detect "^1.0.0" + +chalk@^1.0.0, chalk@^1.1.0, chalk@^1.1.1, chalk@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98" + dependencies: + ansi-styles "^2.2.1" + escape-string-regexp "^1.0.2" + has-ansi "^2.0.0" + strip-ansi "^3.0.0" + supports-color "^2.0.0" + +chownr@~1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.0.1.tgz#e2a75042a9551908bebd25b8523d5f9769d79181" + +cint@^8.2.1: + version "8.2.1" + resolved "https://registry.yarnpkg.com/cint/-/cint-8.2.1.tgz#70386b1b48e2773d0d63166a55aff94ef4456a12" + +circular-json@^0.3.1: + version "0.3.1" + resolved "https://registry.yarnpkg.com/circular-json/-/circular-json-0.3.1.tgz#be8b36aefccde8b3ca7aa2d6afc07a37242c0d2d" + +cli-boxes@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/cli-boxes/-/cli-boxes-1.0.0.tgz#4fa917c3e59c94a004cd61f8ee509da651687143" + +cli-cursor@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-1.0.2.tgz#64da3f7d56a54412e59794bd62dc35295e8f2987" + dependencies: + restore-cursor "^1.0.1" + +cli-table@^0.3.1: + version "0.3.1" + resolved "https://registry.yarnpkg.com/cli-table/-/cli-table-0.3.1.tgz#f53b05266a8b1a0b934b3d0821e6e2dc5914ae23" + dependencies: + colors "1.0.3" + +cli-width@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-2.1.0.tgz#b234ca209b29ef66fc518d9b98d5847b00edf00a" + +cliui@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/cliui/-/cliui-2.1.0.tgz#4b475760ff80264c762c3a1719032e91c7fea0d1" + dependencies: + center-align "^0.1.1" + right-align "^0.1.1" + wordwrap "0.0.2" + +cliui@^3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/cliui/-/cliui-3.2.0.tgz#120601537a916d29940f934da3b48d585a39213d" + dependencies: + string-width "^1.0.1" + strip-ansi "^3.0.1" + wrap-ansi "^2.0.0" + +clone@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/clone/-/clone-1.0.2.tgz#260b7a99ebb1edfe247538175f783243cb19d149" + +cmd-shim@~2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/cmd-shim/-/cmd-shim-2.0.2.tgz#6fcbda99483a8fd15d7d30a196ca69d688a2efdb" + dependencies: + graceful-fs "^4.1.2" + mkdirp "~0.5.0" + +co@^4.6.0: + version "4.6.0" + resolved "https://registry.yarnpkg.com/co/-/co-4.6.0.tgz#6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184" + +code-point-at@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/code-point-at/-/code-point-at-1.1.0.tgz#0d070b4d043a5bea33a2f1a40e2edb3d9a4ccf77" + +colors@1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/colors/-/colors-1.0.3.tgz#0433f44d809680fdeb60ed260f1b0c262e82a40b" + +columnify@~1.5.4: + version "1.5.4" + resolved "https://registry.yarnpkg.com/columnify/-/columnify-1.5.4.tgz#4737ddf1c7b69a8a7c340570782e947eec8e78bb" + dependencies: + strip-ansi "^3.0.0" + wcwidth "^1.0.0" + +combined-stream@^1.0.5, combined-stream@~1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.5.tgz#938370a57b4a51dea2c77c15d5c5fdf895164009" + dependencies: + delayed-stream "~1.0.0" + +commander@2.9.0, commander@^2.9.0: + version "2.9.0" + resolved "https://registry.yarnpkg.com/commander/-/commander-2.9.0.tgz#9c99094176e12240cb22d6c5146098400fe0f7d4" + dependencies: + graceful-readlink ">= 1.0.0" + +commondir@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/commondir/-/commondir-1.0.1.tgz#ddd800da0c66127393cca5950ea968a3aaf1253b" + +concat-map@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" + +concat-stream@^1.4.6, concat-stream@^1.5.2: + version "1.6.0" + resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.6.0.tgz#0aac662fd52be78964d5532f694784e70110acf7" + dependencies: + inherits "^2.0.3" + readable-stream "^2.2.2" + typedarray "^0.0.6" + +config-chain@~1.1.11: + version "1.1.11" + resolved "https://registry.yarnpkg.com/config-chain/-/config-chain-1.1.11.tgz#aba09747dfbe4c3e70e766a6e41586e1859fc6f2" + dependencies: + ini "^1.3.4" + proto-list "~1.2.1" + +configstore@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/configstore/-/configstore-2.1.0.tgz#737a3a7036e9886102aa6099e47bb33ab1aba1a1" + dependencies: + dot-prop "^3.0.0" + graceful-fs "^4.1.2" + mkdirp "^0.5.0" + object-assign "^4.0.1" + os-tmpdir "^1.0.0" + osenv "^0.1.0" + uuid "^2.0.1" + write-file-atomic "^1.1.2" + xdg-basedir "^2.0.0" + +console-control-strings@^1.0.0, console-control-strings@~1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/console-control-strings/-/console-control-strings-1.1.0.tgz#3d7cf4464db6446ea644bf4b39507f9851008e8e" + +contains-path@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/contains-path/-/contains-path-0.1.0.tgz#fe8cf184ff6670b6baef01a9d4861a5cbec4120a" + +convert-source-map@^1.1.0, convert-source-map@^1.3.0: + version "1.5.0" + resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.5.0.tgz#9acd70851c6d5dfdd93d9282e5edf94a03ff46b5" + +core-js@^2.4.0: + version "2.4.1" + resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.4.1.tgz#4de911e667b0eae9124e34254b53aea6fc618d3e" + +core-util-is@~1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" + +create-error-class@^3.0.1: + version "3.0.2" + resolved "https://registry.yarnpkg.com/create-error-class/-/create-error-class-3.0.2.tgz#06be7abef947a3f14a30fd610671d401bca8b7b6" + dependencies: + capture-stack-trace "^1.0.0" + +cross-spawn@^4: + version "4.0.2" + resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-4.0.2.tgz#7b9247621c23adfdd3856004a823cbe397424d41" + dependencies: + lru-cache "^4.0.1" + which "^1.2.9" + +cryptiles@2.x.x: + version "2.0.5" + resolved "https://registry.yarnpkg.com/cryptiles/-/cryptiles-2.0.5.tgz#3bdfecdc608147c1c67202fa291e7dca59eaa3b8" + dependencies: + boom "2.x.x" + +d@1: + version "1.0.0" + resolved "https://registry.yarnpkg.com/d/-/d-1.0.0.tgz#754bb5bfe55451da69a58b94d45f4c5b0462d58f" + dependencies: + es5-ext "^0.10.9" + +dashdash@^1.12.0: + version "1.14.1" + resolved "https://registry.yarnpkg.com/dashdash/-/dashdash-1.14.1.tgz#853cfa0f7cbe2fed5de20326b8dd581035f6e2f0" + dependencies: + assert-plus "^1.0.0" + +debug-log@^1.0.0, debug-log@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/debug-log/-/debug-log-1.0.1.tgz#2307632d4c04382b8df8a32f70b895046d52745f" + +debug@2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/debug/-/debug-2.2.0.tgz#f87057e995b1a1f6ae6a4960664137bc56f039da" + dependencies: + ms "0.7.1" + +debug@2.6.0, debug@^2.1.1, debug@^2.2.0: + version "2.6.0" + resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.0.tgz#bc596bcabe7617f11d9fa15361eded5608b8499b" + dependencies: + ms "0.7.2" + +debug@^2.6.3: + version "2.6.8" + resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.8.tgz#e731531ca2ede27d188222427da17821d68ff4fc" + dependencies: + ms "2.0.0" + +debuglog@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/debuglog/-/debuglog-1.0.1.tgz#aa24ffb9ac3df9a2351837cfb2d279360cd78492" + +decamelize@^1.0.0, decamelize@^1.1.1: + version "1.2.0" + resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" + +deep-eql@^0.1.3: + version "0.1.3" + resolved "https://registry.yarnpkg.com/deep-eql/-/deep-eql-0.1.3.tgz#ef558acab8de25206cd713906d74e56930eb69f2" + dependencies: + type-detect "0.1.1" + +deep-extend@~0.4.0: + version "0.4.2" + resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.4.2.tgz#48b699c27e334bf89f10892be432f6e4c7d34a7f" + +deep-is@~0.1.3: + version "0.1.3" + resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.3.tgz#b369d6fb5dbc13eecf524f91b070feedc357cf34" + +default-require-extensions@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/default-require-extensions/-/default-require-extensions-1.0.0.tgz#f37ea15d3e13ffd9b437d33e1a75b5fb97874cb8" + dependencies: + strip-bom "^2.0.0" + +defaults@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/defaults/-/defaults-1.0.3.tgz#c656051e9817d9ff08ed881477f3fe4019f3ef7d" + dependencies: + clone "^1.0.2" + +define-properties@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.2.tgz#83a73f2fea569898fb737193c8f873caf6d45c94" + dependencies: + foreach "^2.0.5" + object-keys "^1.0.8" + +deglob@^2.0.0, deglob@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/deglob/-/deglob-2.1.0.tgz#4d44abe16ef32c779b4972bd141a80325029a14a" + dependencies: + find-root "^1.0.0" + glob "^7.0.5" + ignore "^3.0.9" + pkg-config "^1.1.0" + run-parallel "^1.1.2" + uniq "^1.0.1" + +del@^2.0.2: + version "2.2.2" + resolved "https://registry.yarnpkg.com/del/-/del-2.2.2.tgz#c12c981d067846c84bcaf862cff930d907ffd1a8" + dependencies: + globby "^5.0.0" + is-path-cwd "^1.0.0" + is-path-in-cwd "^1.0.0" + object-assign "^4.0.1" + pify "^2.0.0" + pinkie-promise "^2.0.0" + rimraf "^2.2.8" + +delayed-stream@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" + +delegates@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/delegates/-/delegates-1.0.0.tgz#84c6e159b81904fdca59a0ef44cd870d31250f9a" + +detect-indent@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/detect-indent/-/detect-indent-4.0.0.tgz#f76d064352cdf43a1cb6ce619c4ee3a9475de208" + dependencies: + repeating "^2.0.0" + +dezalgo@^1.0.0, dezalgo@^1.0.1, dezalgo@~1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/dezalgo/-/dezalgo-1.0.3.tgz#7f742de066fc748bc8db820569dddce49bf0d456" + dependencies: + asap "^2.0.0" + wrappy "1" + +diff@3.2.0, diff@^3.1.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/diff/-/diff-3.2.0.tgz#c9ce393a4b7cbd0b058a725c93df299027868ff9" + +doctrine@1.5.0, doctrine@^1.2.2: + version "1.5.0" + resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-1.5.0.tgz#379dce730f6166f76cefa4e6707a159b02c5a6fa" + dependencies: + esutils "^2.0.2" + isarray "^1.0.0" + +doctrine@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-2.0.0.tgz#c73d8d2909d22291e1a007a395804da8b665fe63" + dependencies: + esutils "^2.0.2" + isarray "^1.0.0" + +dom-serializer@0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-0.1.0.tgz#073c697546ce0780ce23be4a28e293e40bc30c82" + dependencies: + domelementtype "~1.1.1" + entities "~1.1.1" + +domelementtype@1, domelementtype@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-1.3.0.tgz#b17aed82e8ab59e52dd9c19b1756e0fc187204c2" + +domelementtype@~1.1.1: + version "1.1.3" + resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-1.1.3.tgz#bd28773e2642881aec51544924299c5cd822185b" + +domhandler@^2.3.0: + version "2.4.1" + resolved "https://registry.yarnpkg.com/domhandler/-/domhandler-2.4.1.tgz#892e47000a99be55bbf3774ffea0561d8879c259" + dependencies: + domelementtype "1" + +domutils@^1.5.1: + version "1.6.2" + resolved "https://registry.yarnpkg.com/domutils/-/domutils-1.6.2.tgz#1958cc0b4c9426e9ed367fb1c8e854891b0fa3ff" + dependencies: + dom-serializer "0" + domelementtype "1" + +dot-prop@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/dot-prop/-/dot-prop-3.0.0.tgz#1b708af094a49c9a0e7dbcad790aba539dac1177" + dependencies: + is-obj "^1.0.0" + +duplexer2@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/duplexer2/-/duplexer2-0.1.4.tgz#8b12dab878c0d69e3e7891051662a32fc6bddcc1" + dependencies: + readable-stream "^2.0.2" + +ecc-jsbn@~0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/ecc-jsbn/-/ecc-jsbn-0.1.1.tgz#0fc73a9ed5f0d53c38193398523ef7e543777505" + dependencies: + jsbn "~0.1.0" + +editor@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/editor/-/editor-1.0.0.tgz#60c7f87bd62bcc6a894fa8ccd6afb7823a24f742" + +entities@^1.1.1, entities@~1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/entities/-/entities-1.1.1.tgz#6e5c2d0a5621b5dadaecef80b90edfb5cd7772f0" + +error-ex@^1.2.0: + version "1.3.1" + resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.1.tgz#f855a86ce61adc4e8621c3cda21e7a7612c3a8dc" + dependencies: + is-arrayish "^0.2.1" + +es-abstract@^1.7.0: + version "1.7.0" + resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.7.0.tgz#dfade774e01bfcd97f96180298c449c8623fb94c" + dependencies: + es-to-primitive "^1.1.1" + function-bind "^1.1.0" + is-callable "^1.1.3" + is-regex "^1.0.3" + +es-to-primitive@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.1.1.tgz#45355248a88979034b6792e19bb81f2b7975dd0d" + dependencies: + is-callable "^1.1.1" + is-date-object "^1.0.1" + is-symbol "^1.0.1" + +es5-ext@^0.10.14, es5-ext@^0.10.9, es5-ext@~0.10.14: + version "0.10.21" + resolved "https://registry.yarnpkg.com/es5-ext/-/es5-ext-0.10.21.tgz#19a725f9e51d0300bbc1e8e821109fd9daf55925" + dependencies: + es6-iterator "2" + es6-symbol "~3.1" + +es6-iterator@2, es6-iterator@^2.0.1, es6-iterator@~2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/es6-iterator/-/es6-iterator-2.0.1.tgz#8e319c9f0453bf575d374940a655920e59ca5512" + dependencies: + d "1" + es5-ext "^0.10.14" + es6-symbol "^3.1" + +es6-map@^0.1.3: + version "0.1.5" + resolved "https://registry.yarnpkg.com/es6-map/-/es6-map-0.1.5.tgz#9136e0503dcc06a301690f0bb14ff4e364e949f0" + dependencies: + d "1" + es5-ext "~0.10.14" + es6-iterator "~2.0.1" + es6-set "~0.1.5" + es6-symbol "~3.1.1" + event-emitter "~0.3.5" + +es6-promise@3.2.1: + version "3.2.1" + resolved "https://registry.yarnpkg.com/es6-promise/-/es6-promise-3.2.1.tgz#ec56233868032909207170c39448e24449dd1fc4" + +es6-set@~0.1.5: + version "0.1.5" + resolved "https://registry.yarnpkg.com/es6-set/-/es6-set-0.1.5.tgz#d2b3ec5d4d800ced818db538d28974db0a73ccb1" + dependencies: + d "1" + es5-ext "~0.10.14" + es6-iterator "~2.0.1" + es6-symbol "3.1.1" + event-emitter "~0.3.5" + +es6-symbol@3.1.1, es6-symbol@^3.0.2, es6-symbol@^3.1, es6-symbol@^3.1.1, es6-symbol@~3.1, es6-symbol@~3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/es6-symbol/-/es6-symbol-3.1.1.tgz#bf00ef4fdab6ba1b46ecb7b629b4c7ed5715cc77" + dependencies: + d "1" + es5-ext "~0.10.14" + +es6-weak-map@^2.0.1: + version "2.0.2" + resolved "https://registry.yarnpkg.com/es6-weak-map/-/es6-weak-map-2.0.2.tgz#5e3ab32251ffd1538a1f8e5ffa1357772f92d96f" + dependencies: + d "1" + es5-ext "^0.10.14" + es6-iterator "^2.0.1" + es6-symbol "^3.1.1" + +escape-string-regexp@1.0.5, escape-string-regexp@^1.0.2, escape-string-regexp@^1.0.5, escape-string-regexp@~1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" + +escope@^3.6.0: + version "3.6.0" + resolved "https://registry.yarnpkg.com/escope/-/escope-3.6.0.tgz#e01975e812781a163a6dadfdd80398dc64c889c3" + dependencies: + es6-map "^0.1.3" + es6-weak-map "^2.0.1" + esrecurse "^4.1.0" + estraverse "^4.1.1" + +eslint-config-standard-jsx@3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/eslint-config-standard-jsx/-/eslint-config-standard-jsx-3.2.0.tgz#c240e26ed919a11a42aa4de8059472b38268d620" + +eslint-config-standard-jsx@4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/eslint-config-standard-jsx/-/eslint-config-standard-jsx-4.0.1.tgz#cd4e463d0268e2d9e707f61f42f73f5b3333c642" + +eslint-config-standard@10.2.1: + version "10.2.1" + resolved "https://registry.yarnpkg.com/eslint-config-standard/-/eslint-config-standard-10.2.1.tgz#c061e4d066f379dc17cd562c64e819b4dd454591" + +eslint-config-standard@6.2.1: + version "6.2.1" + resolved "https://registry.yarnpkg.com/eslint-config-standard/-/eslint-config-standard-6.2.1.tgz#d3a68aafc7191639e7ee441e7348739026354292" + +eslint-import-resolver-node@^0.2.0: + version "0.2.3" + resolved "https://registry.yarnpkg.com/eslint-import-resolver-node/-/eslint-import-resolver-node-0.2.3.tgz#5add8106e8c928db2cba232bcd9efa846e3da16c" + dependencies: + debug "^2.2.0" + object-assign "^4.0.1" + resolve "^1.1.6" + +eslint-module-utils@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/eslint-module-utils/-/eslint-module-utils-2.0.0.tgz#a6f8c21d901358759cdc35dbac1982ae1ee58bce" + dependencies: + debug "2.2.0" + pkg-dir "^1.0.0" + +eslint-plugin-import@~2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.2.0.tgz#72ba306fad305d67c4816348a4699a4229ac8b4e" + dependencies: + builtin-modules "^1.1.1" + contains-path "^0.1.0" + debug "^2.2.0" + doctrine "1.5.0" + eslint-import-resolver-node "^0.2.0" + eslint-module-utils "^2.0.0" + has "^1.0.1" + lodash.cond "^4.3.0" + minimatch "^3.0.3" + pkg-up "^1.0.0" + +eslint-plugin-node@~4.2.2: + version "4.2.2" + resolved "https://registry.yarnpkg.com/eslint-plugin-node/-/eslint-plugin-node-4.2.2.tgz#82959ca9aed79fcbd28bb1b188d05cac04fb3363" + dependencies: + ignore "^3.0.11" + minimatch "^3.0.2" + object-assign "^4.0.1" + resolve "^1.1.7" + semver "5.3.0" + +eslint-plugin-promise@~3.4.0: + version "3.4.2" + resolved "https://registry.yarnpkg.com/eslint-plugin-promise/-/eslint-plugin-promise-3.4.2.tgz#1be2793eafe2d18b5b123b8136c269f804fe7122" + +eslint-plugin-promise@~3.5.0: + version "3.5.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-promise/-/eslint-plugin-promise-3.5.0.tgz#78fbb6ffe047201627569e85a6c5373af2a68fca" + +eslint-plugin-react@~6.10.0: + version "6.10.3" + resolved "https://registry.yarnpkg.com/eslint-plugin-react/-/eslint-plugin-react-6.10.3.tgz#c5435beb06774e12c7db2f6abaddcbf900cd3f78" + dependencies: + array.prototype.find "^2.0.1" + doctrine "^1.2.2" + has "^1.0.1" + jsx-ast-utils "^1.3.4" + object.assign "^4.0.4" + +eslint-plugin-react@~6.7.1: + version "6.7.1" + resolved "https://registry.yarnpkg.com/eslint-plugin-react/-/eslint-plugin-react-6.7.1.tgz#1af96aea545856825157d97c1b50d5a8fb64a5a7" + dependencies: + doctrine "^1.2.2" + jsx-ast-utils "^1.3.3" + +eslint-plugin-standard@~2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/eslint-plugin-standard/-/eslint-plugin-standard-2.0.1.tgz#3589699ff9c917f2c25f76a916687f641c369ff3" + +eslint-plugin-standard@~3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/eslint-plugin-standard/-/eslint-plugin-standard-3.0.1.tgz#34d0c915b45edc6f010393c7eef3823b08565cf2" + +eslint@~3.10.2: + version "3.10.2" + resolved "https://registry.yarnpkg.com/eslint/-/eslint-3.10.2.tgz#c9a10e8bf6e9d65651204778c503341f1eac3ce7" + dependencies: + babel-code-frame "^6.16.0" + chalk "^1.1.3" + concat-stream "^1.4.6" + debug "^2.1.1" + doctrine "^1.2.2" + escope "^3.6.0" + espree "^3.3.1" + estraverse "^4.2.0" + esutils "^2.0.2" + file-entry-cache "^2.0.0" + glob "^7.0.3" + globals "^9.2.0" + ignore "^3.2.0" + imurmurhash "^0.1.4" + inquirer "^0.12.0" + is-my-json-valid "^2.10.0" + is-resolvable "^1.0.0" + js-yaml "^3.5.1" + json-stable-stringify "^1.0.0" + levn "^0.3.0" + lodash "^4.0.0" + mkdirp "^0.5.0" + natural-compare "^1.4.0" + optionator "^0.8.2" + path-is-inside "^1.0.1" + pluralize "^1.2.1" + progress "^1.1.8" + require-uncached "^1.0.2" + shelljs "^0.7.5" + strip-bom "^3.0.0" + strip-json-comments "~1.0.1" + table "^3.7.8" + text-table "~0.2.0" + user-home "^2.0.0" + +eslint@~3.19.0: + version "3.19.0" + resolved "https://registry.yarnpkg.com/eslint/-/eslint-3.19.0.tgz#c8fc6201c7f40dd08941b87c085767386a679acc" + dependencies: + babel-code-frame "^6.16.0" + chalk "^1.1.3" + concat-stream "^1.5.2" + debug "^2.1.1" + doctrine "^2.0.0" + escope "^3.6.0" + espree "^3.4.0" + esquery "^1.0.0" + estraverse "^4.2.0" + esutils "^2.0.2" + file-entry-cache "^2.0.0" + glob "^7.0.3" + globals "^9.14.0" + ignore "^3.2.0" + imurmurhash "^0.1.4" + inquirer "^0.12.0" + is-my-json-valid "^2.10.0" + is-resolvable "^1.0.0" + js-yaml "^3.5.1" + json-stable-stringify "^1.0.0" + levn "^0.3.0" + lodash "^4.0.0" + mkdirp "^0.5.0" + natural-compare "^1.4.0" + optionator "^0.8.2" + path-is-inside "^1.0.1" + pluralize "^1.2.1" + progress "^1.1.8" + require-uncached "^1.0.2" + shelljs "^0.7.5" + strip-bom "^3.0.0" + strip-json-comments "~2.0.1" + table "^3.7.8" + text-table "~0.2.0" + user-home "^2.0.0" + +espree@^3.3.1, espree@^3.4.0: + version "3.4.3" + resolved "https://registry.yarnpkg.com/espree/-/espree-3.4.3.tgz#2910b5ccd49ce893c2ffffaab4fd8b3a31b82374" + dependencies: + acorn "^5.0.1" + acorn-jsx "^3.0.0" + +espree@~3.1.7: + version "3.1.7" + resolved "https://registry.yarnpkg.com/espree/-/espree-3.1.7.tgz#fd5deec76a97a5120a9cd3a7cb1177a0923b11d2" + dependencies: + acorn "^3.3.0" + acorn-jsx "^3.0.0" + +esprima@^3.1.1: + version "3.1.3" + resolved "https://registry.yarnpkg.com/esprima/-/esprima-3.1.3.tgz#fdca51cee6133895e3c88d535ce49dbff62a4633" + +esquery@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.0.0.tgz#cfba8b57d7fba93f17298a8a006a04cda13d80fa" + dependencies: + estraverse "^4.0.0" + +esrecurse@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.1.0.tgz#4713b6536adf7f2ac4f327d559e7756bff648220" + dependencies: + estraverse "~4.1.0" + object-assign "^4.0.1" + +estraverse@^4.0.0, estraverse@^4.1.1, estraverse@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.2.0.tgz#0dee3fed31fcd469618ce7342099fc1afa0bdb13" + +estraverse@~4.1.0: + version "4.1.1" + resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.1.1.tgz#f6caca728933a850ef90661d0e17982ba47111a2" + +estree-walker@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/estree-walker/-/estree-walker-0.2.1.tgz#bdafe8095383d8414d5dc2ecf4c9173b6db9412e" + +esutils@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.2.tgz#0abf4f1caa5bcb1f7a9d8acc6dea4faaa04bac9b" + +event-emitter@~0.3.5: + version "0.3.5" + resolved "https://registry.yarnpkg.com/event-emitter/-/event-emitter-0.3.5.tgz#df8c69eef1647923c7157b9ce83840610b02cc39" + dependencies: + d "1" + es5-ext "~0.10.14" + +exit-hook@^1.0.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/exit-hook/-/exit-hook-1.1.1.tgz#f05ca233b48c05d54fff07765df8507e95c02ff8" + +expand-brackets@^0.1.4: + version "0.1.5" + resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-0.1.5.tgz#df07284e342a807cd733ac5af72411e581d1177b" + dependencies: + is-posix-bracket "^0.1.0" + +expand-range@^1.8.1: + version "1.8.2" + resolved "https://registry.yarnpkg.com/expand-range/-/expand-range-1.8.2.tgz#a299effd335fe2721ebae8e257ec79644fc85337" + dependencies: + fill-range "^2.1.0" + +extend@~3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.1.tgz#a755ea7bc1adfcc5a31ce7e762dbaadc5e636444" + +extglob@^0.3.1: + version "0.3.2" + resolved "https://registry.yarnpkg.com/extglob/-/extglob-0.3.2.tgz#2e18ff3d2f49ab2765cec9023f011daa8d8349a1" + dependencies: + is-extglob "^1.0.0" + +extsprintf@1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.0.2.tgz#e1080e0658e300b06294990cc70e1502235fd550" + +fast-diff@^1.0.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/fast-diff/-/fast-diff-1.1.1.tgz#0aea0e4e605b6a2189f0e936d4b7fbaf1b7cfd9b" + +fast-levenshtein@~2.0.4: + version "2.0.6" + resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" + +figures@^1.3.5: + version "1.7.0" + resolved "https://registry.yarnpkg.com/figures/-/figures-1.7.0.tgz#cbe1e3affcf1cd44b80cadfed28dc793a9701d2e" + dependencies: + escape-string-regexp "^1.0.5" + object-assign "^4.1.0" + +file-entry-cache@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-2.0.0.tgz#c392990c3e684783d838b8c84a45d8a048458361" + dependencies: + flat-cache "^1.2.1" + object-assign "^4.0.1" + +filename-regex@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/filename-regex/-/filename-regex-2.0.1.tgz#c1c4b9bee3e09725ddb106b75c1e301fe2f18b26" + +fill-range@^2.1.0: + version "2.2.3" + resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-2.2.3.tgz#50b77dfd7e469bc7492470963699fe7a8485a723" + dependencies: + is-number "^2.1.0" + isobject "^2.0.0" + randomatic "^1.1.3" + repeat-element "^1.1.2" + repeat-string "^1.5.2" + +filled-array@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/filled-array/-/filled-array-1.1.0.tgz#c3c4f6c663b923459a9aa29912d2d031f1507f84" + +find-cache-dir@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-0.1.1.tgz#c8defae57c8a52a8a784f9e31c57c742e993a0b9" + dependencies: + commondir "^1.0.1" + mkdirp "^0.5.1" + pkg-dir "^1.0.0" + +find-root@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/find-root/-/find-root-1.0.0.tgz#962ff211aab25c6520feeeb8d6287f8f6e95807a" + +find-up@1.1.2, find-up@^1.0.0, find-up@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-1.1.2.tgz#6b2e9822b1a2ce0a60ab64d610eccad53cb24d0f" + dependencies: + path-exists "^2.0.0" + pinkie-promise "^2.0.0" + +find-up@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-2.1.0.tgz#45d1b7e506c717ddd482775a2b77920a3c0c57a7" + dependencies: + locate-path "^2.0.0" + +flat-cache@^1.2.1: + version "1.2.2" + resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-1.2.2.tgz#fa86714e72c21db88601761ecf2f555d1abc6b96" + dependencies: + circular-json "^0.3.1" + del "^2.0.2" + graceful-fs "^4.1.2" + write "^0.2.1" + +for-in@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/for-in/-/for-in-1.0.2.tgz#81068d295a8142ec0ac726c6e2200c30fb6d5e80" + +for-own@^0.1.4: + version "0.1.5" + resolved "https://registry.yarnpkg.com/for-own/-/for-own-0.1.5.tgz#5265c681a4f294dabbf17c9509b6763aa84510ce" + dependencies: + for-in "^1.0.1" + +foreach@^2.0.5: + version "2.0.5" + resolved "https://registry.yarnpkg.com/foreach/-/foreach-2.0.5.tgz#0bee005018aeb260d0a3af3ae658dd0136ec1b99" + +foreground-child@^1.3.3, foreground-child@^1.5.3: + version "1.5.6" + resolved "https://registry.yarnpkg.com/foreground-child/-/foreground-child-1.5.6.tgz#4fd71ad2dfde96789b980a5c0a295937cb2f5ce9" + dependencies: + cross-spawn "^4" + signal-exit "^3.0.0" + +forever-agent@~0.6.1: + version "0.6.1" + resolved "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91" + +form-data@~2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.0.0.tgz#6f0aebadcc5da16c13e1ecc11137d85f9b883b25" + dependencies: + asynckit "^0.4.0" + combined-stream "^1.0.5" + mime-types "^2.1.11" + +formatio@1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/formatio/-/formatio-1.1.1.tgz#5ed3ccd636551097383465d996199100e86161e9" + dependencies: + samsam "~1.1" + +formatio@1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/formatio/-/formatio-1.2.0.tgz#f3b2167d9068c4698a8d51f4f760a39a54d818eb" + dependencies: + samsam "1.x" + +fs-vacuum@~1.2.9: + version "1.2.10" + resolved "https://registry.yarnpkg.com/fs-vacuum/-/fs-vacuum-1.2.10.tgz#b7629bec07a4031a2548fdf99f5ecf1cc8b31e36" + dependencies: + graceful-fs "^4.1.2" + path-is-inside "^1.0.1" + rimraf "^2.5.2" + +fs-write-stream-atomic@~1.0.8: + version "1.0.10" + resolved "https://registry.yarnpkg.com/fs-write-stream-atomic/-/fs-write-stream-atomic-1.0.10.tgz#b47df53493ef911df75731e70a9ded0189db40c9" + dependencies: + graceful-fs "^4.1.2" + iferr "^0.1.5" + imurmurhash "^0.1.4" + readable-stream "1 || 2" + +fs.realpath@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" + +fstream-ignore@^1.0.0: + version "1.0.5" + resolved "https://registry.yarnpkg.com/fstream-ignore/-/fstream-ignore-1.0.5.tgz#9c31dae34767018fe1d249b24dada67d092da105" + dependencies: + fstream "^1.0.0" + inherits "2" + minimatch "^3.0.0" + +fstream-npm@~1.2.0: + version "1.2.1" + resolved "https://registry.yarnpkg.com/fstream-npm/-/fstream-npm-1.2.1.tgz#08c4a452f789dcbac4c89a4563c902b2c862fd5b" + dependencies: + fstream-ignore "^1.0.0" + inherits "2" + +fstream@^1.0.0, fstream@^1.0.2, fstream@~1.0.10: + version "1.0.11" + resolved "https://registry.yarnpkg.com/fstream/-/fstream-1.0.11.tgz#5c1fb1f117477114f0632a0eb4b71b3cb0fd3171" + dependencies: + graceful-fs "^4.1.2" + inherits "~2.0.0" + mkdirp ">=0.5 0" + rimraf "2" + +function-bind@^1.0.2, function-bind@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.0.tgz#16176714c801798e4e8f2cf7f7529467bb4a5771" + +gauge@~2.6.0: + version "2.6.0" + resolved "https://registry.yarnpkg.com/gauge/-/gauge-2.6.0.tgz#d35301ad18e96902b4751dcbbe40f4218b942a46" + dependencies: + aproba "^1.0.3" + console-control-strings "^1.0.0" + has-color "^0.1.7" + has-unicode "^2.0.0" + object-assign "^4.1.0" + signal-exit "^3.0.0" + string-width "^1.0.1" + strip-ansi "^3.0.1" + wide-align "^1.1.0" + +gauge@~2.7.1: + version "2.7.4" + resolved "https://registry.yarnpkg.com/gauge/-/gauge-2.7.4.tgz#2c03405c7538c39d7eb37b317022e325fb018bf7" + dependencies: + aproba "^1.0.3" + console-control-strings "^1.0.0" + has-unicode "^2.0.0" + object-assign "^4.1.0" + signal-exit "^3.0.0" + string-width "^1.0.1" + strip-ansi "^3.0.1" + wide-align "^1.1.0" + +generate-function@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/generate-function/-/generate-function-2.0.0.tgz#6858fe7c0969b7d4e9093337647ac79f60dfbe74" + +generate-object-property@^1.1.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/generate-object-property/-/generate-object-property-1.2.0.tgz#9c0e1c40308ce804f4783618b937fa88f99d50d0" + dependencies: + is-property "^1.0.0" + +get-caller-file@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-1.0.2.tgz#f702e63127e7e231c160a80c1554acb70d5047e5" + +get-stdin@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/get-stdin/-/get-stdin-5.0.1.tgz#122e161591e21ff4c52530305693f20e6393a398" + +getpass@^0.1.1: + version "0.1.7" + resolved "https://registry.yarnpkg.com/getpass/-/getpass-0.1.7.tgz#5eff8e3e684d569ae4cb2b1282604e8ba62149fa" + dependencies: + assert-plus "^1.0.0" + +glob-base@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/glob-base/-/glob-base-0.3.0.tgz#dbb164f6221b1c0b1ccf82aea328b497df0ea3c4" + dependencies: + glob-parent "^2.0.0" + is-glob "^2.0.0" + +glob-parent@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-2.0.0.tgz#81383d72db054fcccf5336daa902f182f6edbb28" + dependencies: + is-glob "^2.0.0" + +glob@7.1.1, glob@^7.0.0, glob@^7.0.3, glob@^7.0.5, glob@^7.0.6, glob@^7.1.1, glob@~7.1.0: + version "7.1.1" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.1.tgz#805211df04faaf1c63a3600306cdf5ade50b2ec8" + dependencies: + fs.realpath "^1.0.0" + inflight "^1.0.4" + inherits "2" + minimatch "^3.0.2" + once "^1.3.0" + path-is-absolute "^1.0.0" + +globals@^9.0.0, globals@^9.14.0, globals@^9.2.0: + version "9.17.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-9.17.0.tgz#0c0ca696d9b9bb694d2e5470bd37777caad50286" + +globby@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/globby/-/globby-5.0.0.tgz#ebd84667ca0dbb330b99bcfc68eac2bc54370e0d" + dependencies: + array-union "^1.0.1" + arrify "^1.0.0" + glob "^7.0.3" + object-assign "^4.0.1" + pify "^2.0.0" + pinkie-promise "^2.0.0" + +got@^5.0.0: + version "5.7.1" + resolved "https://registry.yarnpkg.com/got/-/got-5.7.1.tgz#5f81635a61e4a6589f180569ea4e381680a51f35" + dependencies: + create-error-class "^3.0.1" + duplexer2 "^0.1.4" + is-redirect "^1.0.0" + is-retry-allowed "^1.0.0" + is-stream "^1.0.0" + lowercase-keys "^1.0.0" + node-status-codes "^1.0.0" + object-assign "^4.0.1" + parse-json "^2.1.0" + pinkie-promise "^2.0.0" + read-all-stream "^3.0.0" + readable-stream "^2.0.5" + timed-out "^3.0.0" + unzip-response "^1.0.2" + url-parse-lax "^1.0.0" + +graceful-fs@^4.1.11, graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.1.9, graceful-fs@~4.1.9: + version "4.1.11" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.1.11.tgz#0e8bdfe4d1ddb8854d64e04ea7c00e2a026e5658" + +"graceful-readlink@>= 1.0.0": + version "1.0.1" + resolved "https://registry.yarnpkg.com/graceful-readlink/-/graceful-readlink-1.0.1.tgz#4cafad76bc62f02fa039b2f94e9a3dd3a391a725" + +growl@1.9.2: + version "1.9.2" + resolved "https://registry.yarnpkg.com/growl/-/growl-1.9.2.tgz#0ea7743715db8d8de2c5ede1775e1b45ac85c02f" + +handlebars@^4.0.3: + version "4.0.10" + resolved "https://registry.yarnpkg.com/handlebars/-/handlebars-4.0.10.tgz#3d30c718b09a3d96f23ea4cc1f403c4d3ba9ff4f" + dependencies: + async "^1.4.0" + optimist "^0.6.1" + source-map "^0.4.4" + optionalDependencies: + uglify-js "^2.6" + +har-validator@~2.0.6: + version "2.0.6" + resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-2.0.6.tgz#cdcbc08188265ad119b6a5a7c8ab70eecfb5d27d" + dependencies: + chalk "^1.1.1" + commander "^2.9.0" + is-my-json-valid "^2.12.4" + pinkie-promise "^2.0.0" + +has-ansi@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/has-ansi/-/has-ansi-2.0.0.tgz#34f5049ce1ecdf2b0649af3ef24e45ed35416d91" + dependencies: + ansi-regex "^2.0.0" + +has-color@^0.1.7: + version "0.1.7" + resolved "https://registry.yarnpkg.com/has-color/-/has-color-0.1.7.tgz#67144a5260c34fc3cca677d041daf52fe7b78b2f" + +has-flag@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-1.0.0.tgz#9d9e793165ce017a00f00418c43f942a7b1d11fa" + +has-unicode@^2.0.0, has-unicode@~2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/has-unicode/-/has-unicode-2.0.1.tgz#e0e6fe6a28cf51138855e086d1691e771de2a8b9" + +has@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/has/-/has-1.0.1.tgz#8461733f538b0837c9361e39a9ab9e9704dc2f28" + dependencies: + function-bind "^1.0.2" + +hawk@~3.1.3: + version "3.1.3" + resolved "https://registry.yarnpkg.com/hawk/-/hawk-3.1.3.tgz#078444bd7c1640b0fe540d2c9b73d59678e8e1c4" + dependencies: + boom "2.x.x" + cryptiles "2.x.x" + hoek "2.x.x" + sntp "1.x.x" + +hoek@2.x.x: + version "2.16.3" + resolved "https://registry.yarnpkg.com/hoek/-/hoek-2.16.3.tgz#20bb7403d3cea398e91dc4710a8ff1b8274a25ed" + +home-or-tmp@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/home-or-tmp/-/home-or-tmp-2.0.0.tgz#e36c3f2d2cae7d746a857e38d18d5f32a7882db8" + dependencies: + os-homedir "^1.0.0" + os-tmpdir "^1.0.1" + +hosted-git-info@^2.1.4, hosted-git-info@^2.1.5, hosted-git-info@~2.1.5: + version "2.1.5" + resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.1.5.tgz#0ba81d90da2e25ab34a332e6ec77936e1598118b" + +htmlparser2@^3.9.0: + version "3.9.2" + resolved "https://registry.yarnpkg.com/htmlparser2/-/htmlparser2-3.9.2.tgz#1bdf87acca0f3f9e53fa4fcceb0f4b4cbb00b338" + dependencies: + domelementtype "^1.3.0" + domhandler "^2.3.0" + domutils "^1.5.1" + entities "^1.1.1" + inherits "^2.0.1" + readable-stream "^2.0.2" + +http-signature@~1.1.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-1.1.1.tgz#df72e267066cd0ac67fb76adf8e134a8fbcf91bf" + dependencies: + assert-plus "^0.2.0" + jsprim "^1.2.2" + sshpk "^1.7.0" + +iferr@^0.1.5, iferr@~0.1.5: + version "0.1.5" + resolved "https://registry.yarnpkg.com/iferr/-/iferr-0.1.5.tgz#c60eed69e6d8fdb6b3104a1fcbca1c192dc5b501" + +ignore@^3.0.11, ignore@^3.0.9, ignore@^3.2.0: + version "3.3.3" + resolved "https://registry.yarnpkg.com/ignore/-/ignore-3.3.3.tgz#432352e57accd87ab3110e82d3fea0e47812156d" + +imurmurhash@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" + +inflight@^1.0.4, inflight@~1.0.5: + version "1.0.6" + resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" + dependencies: + once "^1.3.0" + wrappy "1" + +inherits@2, inherits@2.0.1, inherits@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.1.tgz#b17d08d326b4423e568eff719f91b0b1cbdf69f1" + +inherits@^2.0.3, inherits@~2.0.0, inherits@~2.0.1, inherits@~2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" + +ini@^1.3.4, ini@~1.3.0, ini@~1.3.4: + version "1.3.4" + resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.4.tgz#0537cb79daf59b59a1a517dff706c86ec039162e" + +init-package-json@~1.9.4: + version "1.9.6" + resolved "https://registry.yarnpkg.com/init-package-json/-/init-package-json-1.9.6.tgz#789fc2b74466a4952b9ea77c0575bc78ebd60a61" + dependencies: + glob "^7.1.1" + npm-package-arg "^4.0.0 || ^5.0.0" + promzard "^0.3.0" + read "~1.0.1" + read-package-json "1 || 2" + semver "2.x || 3.x || 4 || 5" + validate-npm-package-license "^3.0.1" + validate-npm-package-name "^3.0.0" + +"ink-docstrap@git+https://github.com/js-data/docstrap.git#cfbe45fa313e1628c493076d5e15d2b855dfbf2c": + version "1.1.4" + resolved "git+https://github.com/js-data/docstrap.git#cfbe45fa313e1628c493076d5e15d2b855dfbf2c" + dependencies: + moment "^2.13.0" + sanitize-html "^1.11.4" + +inquirer@^0.12.0: + version "0.12.0" + resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-0.12.0.tgz#1ef2bfd63504df0bc75785fff8c2c41df12f077e" + dependencies: + ansi-escapes "^1.1.0" + ansi-regex "^2.0.0" + chalk "^1.0.0" + cli-cursor "^1.0.1" + cli-width "^2.0.0" + figures "^1.3.5" + lodash "^4.3.0" + readline2 "^1.0.1" + run-async "^0.1.0" + rx-lite "^3.1.2" + string-width "^1.0.1" + strip-ansi "^3.0.0" + through "^2.3.6" + +interpret@^1.0.0: + version "1.0.3" + resolved "https://registry.yarnpkg.com/interpret/-/interpret-1.0.3.tgz#cbc35c62eeee73f19ab7b10a801511401afc0f90" + +invariant@^2.2.0: + version "2.2.2" + resolved "https://registry.yarnpkg.com/invariant/-/invariant-2.2.2.tgz#9e1f56ac0acdb6bf303306f338be3b204ae60360" + dependencies: + loose-envify "^1.0.0" + +invert-kv@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/invert-kv/-/invert-kv-1.0.0.tgz#104a8e4aaca6d3d8cd157a8ef8bfab2d7a3ffdb6" + +is-arrayish@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" + +is-buffer@^1.1.5: + version "1.1.5" + resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.5.tgz#1f3b26ef613b214b88cbca23cc6c01d87961eecc" + +is-builtin-module@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-builtin-module/-/is-builtin-module-1.0.0.tgz#540572d34f7ac3119f8f76c30cbc1b1e037affbe" + dependencies: + builtin-modules "^1.0.0" + +is-callable@^1.1.1, is-callable@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.1.3.tgz#86eb75392805ddc33af71c92a0eedf74ee7604b2" + +is-date-object@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.1.tgz#9aa20eb6aeebbff77fbd33e74ca01b33581d3a16" + +is-dotfile@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-dotfile/-/is-dotfile-1.0.2.tgz#2c132383f39199f8edc268ca01b9b007d205cc4d" + +is-equal-shallow@^0.1.3: + version "0.1.3" + resolved "https://registry.yarnpkg.com/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz#2238098fc221de0bcfa5d9eac4c45d638aa1c534" + dependencies: + is-primitive "^2.0.0" + +is-extendable@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-0.1.1.tgz#62b110e289a471418e3ec36a617d472e301dfc89" + +is-extglob@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-1.0.0.tgz#ac468177c4943405a092fc8f29760c6ffc6206c0" + +is-finite@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-finite/-/is-finite-1.0.2.tgz#cc6677695602be550ef11e8b4aa6305342b6d0aa" + dependencies: + number-is-nan "^1.0.0" + +is-fullwidth-code-point@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz#ef9e31386f031a7f0d643af82fde50c457ef00cb" + dependencies: + number-is-nan "^1.0.0" + +is-fullwidth-code-point@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f" + +is-glob@^2.0.0, is-glob@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-2.0.1.tgz#d096f926a3ded5600f3fdfd91198cb0888c2d863" + dependencies: + is-extglob "^1.0.0" + +is-my-json-valid@^2.10.0, is-my-json-valid@^2.12.4: + version "2.16.0" + resolved "https://registry.yarnpkg.com/is-my-json-valid/-/is-my-json-valid-2.16.0.tgz#f079dd9bfdae65ee2038aae8acbc86ab109e3693" + dependencies: + generate-function "^2.0.0" + generate-object-property "^1.1.0" + jsonpointer "^4.0.0" + xtend "^4.0.0" + +is-npm@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-npm/-/is-npm-1.0.0.tgz#f2fb63a65e4905b406c86072765a1a4dc793b9f4" + +is-number@^2.0.2, is-number@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-number/-/is-number-2.1.0.tgz#01fcbbb393463a548f2f466cce16dece49db908f" + dependencies: + kind-of "^3.0.2" + +is-obj@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-obj/-/is-obj-1.0.1.tgz#3e4729ac1f5fde025cd7d83a896dab9f4f67db0f" + +is-path-cwd@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-path-cwd/-/is-path-cwd-1.0.0.tgz#d225ec23132e89edd38fda767472e62e65f1106d" + +is-path-in-cwd@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-path-in-cwd/-/is-path-in-cwd-1.0.0.tgz#6477582b8214d602346094567003be8a9eac04dc" + dependencies: + is-path-inside "^1.0.0" + +is-path-inside@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-1.0.0.tgz#fc06e5a1683fbda13de667aff717bbc10a48f37f" + dependencies: + path-is-inside "^1.0.1" + +is-posix-bracket@^0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz#3334dc79774368e92f016e6fbc0a88f5cd6e6bc4" + +is-primitive@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/is-primitive/-/is-primitive-2.0.0.tgz#207bab91638499c07b2adf240a41a87210034575" + +is-property@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-property/-/is-property-1.0.2.tgz#57fe1c4e48474edd65b09911f26b1cd4095dda84" + +is-redirect@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-redirect/-/is-redirect-1.0.0.tgz#1d03dded53bd8db0f30c26e4f95d36fc7c87dc24" + +is-regex@^1.0.3: + version "1.0.4" + resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.0.4.tgz#5517489b547091b0930e095654ced25ee97e9491" + dependencies: + has "^1.0.1" + +is-resolvable@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-resolvable/-/is-resolvable-1.0.0.tgz#8df57c61ea2e3c501408d100fb013cf8d6e0cc62" + dependencies: + tryit "^1.0.1" + +is-retry-allowed@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-retry-allowed/-/is-retry-allowed-1.1.0.tgz#11a060568b67339444033d0125a61a20d564fb34" + +is-stream@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44" + +is-symbol@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.1.tgz#3cc59f00025194b6ab2e38dbae6689256b660572" + +is-typedarray@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" + +is-utf8@^0.2.0: + version "0.2.1" + resolved "https://registry.yarnpkg.com/is-utf8/-/is-utf8-0.2.1.tgz#4b0da1442104d1b336340e80797e865cf39f7d72" + +isarray@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/isarray/-/isarray-0.0.1.tgz#8a18acfca9a8f4177e09abfc6038939b05d1eedf" + +isarray@1.0.0, isarray@^1.0.0, isarray@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" + +isexe@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" + +isobject@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/isobject/-/isobject-2.1.0.tgz#f065561096a3f1da2ef46272f815c840d87e0c89" + dependencies: + isarray "1.0.0" + +isstream@~0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a" + +istanbul-lib-coverage@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/istanbul-lib-coverage/-/istanbul-lib-coverage-1.1.0.tgz#caca19decaef3525b5d6331d701f3f3b7ad48528" + +istanbul-lib-hook@^1.0.6: + version "1.0.6" + resolved "https://registry.yarnpkg.com/istanbul-lib-hook/-/istanbul-lib-hook-1.0.6.tgz#c0866d1e81cf2d5319249510131fc16dee49231f" + dependencies: + append-transform "^0.4.0" + +istanbul-lib-instrument@^1.7.1: + version "1.7.1" + resolved "https://registry.yarnpkg.com/istanbul-lib-instrument/-/istanbul-lib-instrument-1.7.1.tgz#169e31bc62c778851a99439dd99c3cc12184d360" + dependencies: + babel-generator "^6.18.0" + babel-template "^6.16.0" + babel-traverse "^6.18.0" + babel-types "^6.18.0" + babylon "^6.13.0" + istanbul-lib-coverage "^1.1.0" + semver "^5.3.0" + +istanbul-lib-report@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/istanbul-lib-report/-/istanbul-lib-report-1.1.0.tgz#444c4ecca9afa93cf584f56b10f195bf768c0770" + dependencies: + istanbul-lib-coverage "^1.1.0" + mkdirp "^0.5.1" + path-parse "^1.0.5" + supports-color "^3.1.2" + +istanbul-lib-source-maps@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/istanbul-lib-source-maps/-/istanbul-lib-source-maps-1.2.0.tgz#8c7706d497e26feeb6af3e0c28fd5b0669598d0e" + dependencies: + debug "^2.6.3" + istanbul-lib-coverage "^1.1.0" + mkdirp "^0.5.1" + rimraf "^2.6.1" + source-map "^0.5.3" + +istanbul-reports@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/istanbul-reports/-/istanbul-reports-1.1.0.tgz#1ef3b795889219cfb5fad16365f6ce108d5f8c66" + dependencies: + handlebars "^4.0.3" + +jju@^1.1.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/jju/-/jju-1.3.0.tgz#dadd9ef01924bc728b03f2f7979bdbd62f7a2aaa" + +jodid25519@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/jodid25519/-/jodid25519-1.0.2.tgz#06d4912255093419477d425633606e0e90782967" + dependencies: + jsbn "~0.1.0" + +js-data-adapter@~0.8.2: + version "0.8.3" + resolved "https://registry.yarnpkg.com/js-data-adapter/-/js-data-adapter-0.8.3.tgz#0ed7a0eac3003201a9958f00093bd0430168f7c3" + dependencies: + chai "^3.5.0" + mocha "^3.1.2" + sinon "^1.17.6" + +js-data-repo-tools@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/js-data-repo-tools/-/js-data-repo-tools-1.0.0.tgz#0c57831d288d93e1d320c939e2049d57e9e54951" + dependencies: + babel-eslint "7.1.1" + commander "2.9.0" + lodash "4.17.4" + npm-check-updates "2.8.9" + standard "8.6.0" + +js-data@^3.0.0-rc.9: + version "3.0.0-rc.9" + resolved "https://registry.yarnpkg.com/js-data/-/js-data-3.0.0-rc.9.tgz#d447382444416d66daef845f1916fd0280bb7590" + +js-tokens@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-3.0.1.tgz#08e9f132484a2c45a30907e9dc4d5567b7f114d7" + +js-yaml@^3.5.1: + version "3.8.4" + resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.8.4.tgz#520b4564f86573ba96662af85a8cafa7b4b5a6f6" + dependencies: + argparse "^1.0.7" + esprima "^3.1.1" + +js2xmlparser@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/js2xmlparser/-/js2xmlparser-1.0.0.tgz#5a170f2e8d6476ce45405e04823242513782fe30" + +jsbn@~0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513" + +jsdoc@3.4.3: + version "3.4.3" + resolved "https://registry.yarnpkg.com/jsdoc/-/jsdoc-3.4.3.tgz#e5740d6145c681f6679e6c17783a88dbdd97ccd3" + dependencies: + bluebird "~3.4.6" + catharsis "~0.8.8" + escape-string-regexp "~1.0.5" + espree "~3.1.7" + js2xmlparser "~1.0.0" + klaw "~1.3.0" + marked "~0.3.6" + mkdirp "~0.5.1" + requizzle "~0.2.1" + strip-json-comments "~2.0.1" + taffydb "2.6.2" + underscore "~1.8.3" + +jsesc@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-1.3.0.tgz#46c3fec8c1892b12b0833db9bc7622176dbab34b" + +jsesc@~0.5.0: + version "0.5.0" + resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-0.5.0.tgz#e7dee66e35d6fc16f710fe91d5cf69f70f08911d" + +json-parse-helpfulerror@^1.0.2, json-parse-helpfulerror@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/json-parse-helpfulerror/-/json-parse-helpfulerror-1.0.3.tgz#13f14ce02eed4e981297b64eb9e3b932e2dd13dc" + dependencies: + jju "^1.1.0" + +json-schema@0.2.3: + version "0.2.3" + resolved "https://registry.yarnpkg.com/json-schema/-/json-schema-0.2.3.tgz#b480c892e59a2f05954ce727bd3f2a4e882f9e13" + +json-stable-stringify@^1.0.0, json-stable-stringify@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz#9a759d39c5f2ff503fd5300646ed445f88c4f9af" + dependencies: + jsonify "~0.0.0" + +json-stringify-safe@~5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb" + +json3@3.3.2: + version "3.3.2" + resolved "https://registry.yarnpkg.com/json3/-/json3-3.3.2.tgz#3c0434743df93e2f5c42aee7b19bcb483575f4e1" + +json5@^0.5.0: + version "0.5.1" + resolved "https://registry.yarnpkg.com/json5/-/json5-0.5.1.tgz#1eade7acc012034ad84e2396767ead9fa5495821" + +jsonify@~0.0.0: + version "0.0.0" + resolved "https://registry.yarnpkg.com/jsonify/-/jsonify-0.0.0.tgz#2c74b6ee41d93ca51b7b5aaee8f503631d252a73" + +jsonpointer@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/jsonpointer/-/jsonpointer-4.0.1.tgz#4fd92cb34e0e9db3c89c8622ecf51f9b978c6cb9" + +jsprim@^1.2.2: + version "1.4.0" + resolved "https://registry.yarnpkg.com/jsprim/-/jsprim-1.4.0.tgz#a3b87e40298d8c380552d8cc7628a0bb95a22918" + dependencies: + assert-plus "1.0.0" + extsprintf "1.0.2" + json-schema "0.2.3" + verror "1.3.6" + +jsx-ast-utils@^1.3.3, jsx-ast-utils@^1.3.4: + version "1.4.1" + resolved "https://registry.yarnpkg.com/jsx-ast-utils/-/jsx-ast-utils-1.4.1.tgz#3867213e8dd79bf1e8f2300c0cfc1efb182c0df1" + +kind-of@^3.0.2: + version "3.2.2" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-3.2.2.tgz#31ea21a734bab9bbb0f32466d893aea51e4a3c64" + dependencies: + is-buffer "^1.1.5" + +klaw@~1.3.0: + version "1.3.1" + resolved "https://registry.yarnpkg.com/klaw/-/klaw-1.3.1.tgz#4088433b46b3b1ba259d78785d8e96f73ba02439" + optionalDependencies: + graceful-fs "^4.1.9" + +latest-version@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/latest-version/-/latest-version-2.0.0.tgz#56f8d6139620847b8017f8f1f4d78e211324168b" + dependencies: + package-json "^2.0.0" + +lazy-cache@^1.0.3: + version "1.0.4" + resolved "https://registry.yarnpkg.com/lazy-cache/-/lazy-cache-1.0.4.tgz#a1d78fc3a50474cb80845d3b3b6e1da49a446e8e" + +lazy-req@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/lazy-req/-/lazy-req-1.1.0.tgz#bdaebead30f8d824039ce0ce149d4daa07ba1fac" + +lcid@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/lcid/-/lcid-1.0.0.tgz#308accafa0bc483a3867b4b6f2b9506251d1b835" + dependencies: + invert-kv "^1.0.0" + +levn@^0.3.0, levn@~0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/levn/-/levn-0.3.0.tgz#3b09924edf9f083c0490fdd4c0bc4421e04764ee" + dependencies: + prelude-ls "~1.1.2" + type-check "~0.3.2" + +load-json-file@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-1.1.0.tgz#956905708d58b4bab4c2261b04f59f31c99374c0" + dependencies: + graceful-fs "^4.1.2" + parse-json "^2.2.0" + pify "^2.0.0" + pinkie-promise "^2.0.0" + strip-bom "^2.0.0" + +load-json-file@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-2.0.0.tgz#7947e42149af80d696cbf797bcaabcfe1fe29ca8" + dependencies: + graceful-fs "^4.1.2" + parse-json "^2.2.0" + pify "^2.0.0" + strip-bom "^3.0.0" + +locate-path@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-2.0.0.tgz#2b568b265eec944c6d9c0de9c3dbbbca0354cd8e" + dependencies: + p-locate "^2.0.0" + path-exists "^3.0.0" + +lockfile@~1.0.2: + version "1.0.3" + resolved "https://registry.yarnpkg.com/lockfile/-/lockfile-1.0.3.tgz#2638fc39a0331e9cac1a04b71799931c9c50df79" + +lodash._baseassign@^3.0.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/lodash._baseassign/-/lodash._baseassign-3.2.0.tgz#8c38a099500f215ad09e59f1722fd0c52bfe0a4e" + dependencies: + lodash._basecopy "^3.0.0" + lodash.keys "^3.0.0" + +lodash._basecopy@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/lodash._basecopy/-/lodash._basecopy-3.0.1.tgz#8da0e6a876cf344c0ad8a54882111dd3c5c7ca36" + +lodash._basecreate@^3.0.0: + version "3.0.3" + resolved "https://registry.yarnpkg.com/lodash._basecreate/-/lodash._basecreate-3.0.3.tgz#1bc661614daa7fc311b7d03bf16806a0213cf821" + +lodash._baseuniq@~4.6.0: + version "4.6.0" + resolved "https://registry.yarnpkg.com/lodash._baseuniq/-/lodash._baseuniq-4.6.0.tgz#0ebb44e456814af7905c6212fa2c9b2d51b841e8" + dependencies: + lodash._createset "~4.0.0" + lodash._root "~3.0.0" + +lodash._createset@~4.0.0: + version "4.0.3" + resolved "https://registry.yarnpkg.com/lodash._createset/-/lodash._createset-4.0.3.tgz#0f4659fbb09d75194fa9e2b88a6644d363c9fe26" + +lodash._getnative@^3.0.0: + version "3.9.1" + resolved "https://registry.yarnpkg.com/lodash._getnative/-/lodash._getnative-3.9.1.tgz#570bc7dede46d61cdcde687d65d3eecbaa3aaff5" + +lodash._isiterateecall@^3.0.0: + version "3.0.9" + resolved "https://registry.yarnpkg.com/lodash._isiterateecall/-/lodash._isiterateecall-3.0.9.tgz#5203ad7ba425fae842460e696db9cf3e6aac057c" + +lodash._root@~3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/lodash._root/-/lodash._root-3.0.1.tgz#fba1c4524c19ee9a5f8136b4609f017cf4ded692" + +lodash.clonedeep@~4.5.0: + version "4.5.0" + resolved "https://registry.yarnpkg.com/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz#e23f3f9c4f8fbdde872529c1071857a086e5ccef" + +lodash.cond@^4.3.0: + version "4.5.2" + resolved "https://registry.yarnpkg.com/lodash.cond/-/lodash.cond-4.5.2.tgz#f471a1da486be60f6ab955d17115523dd1d255d5" + +lodash.create@3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/lodash.create/-/lodash.create-3.1.1.tgz#d7f2849f0dbda7e04682bb8cd72ab022461debe7" + dependencies: + lodash._baseassign "^3.0.0" + lodash._basecreate "^3.0.0" + lodash._isiterateecall "^3.0.0" + +lodash.isarguments@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz#2f573d85c6a24289ff00663b491c1d338ff3458a" + +lodash.isarray@^3.0.0: + version "3.0.4" + resolved "https://registry.yarnpkg.com/lodash.isarray/-/lodash.isarray-3.0.4.tgz#79e4eb88c36a8122af86f844aa9bcd851b5fbb55" + +lodash.keys@^3.0.0: + version "3.1.2" + resolved "https://registry.yarnpkg.com/lodash.keys/-/lodash.keys-3.1.2.tgz#4dbc0472b156be50a0b286855d1bd0b0c656098a" + dependencies: + lodash._getnative "^3.0.0" + lodash.isarguments "^3.0.0" + lodash.isarray "^3.0.0" + +lodash.pickby@^4.6.0: + version "4.6.0" + resolved "https://registry.yarnpkg.com/lodash.pickby/-/lodash.pickby-4.6.0.tgz#7dea21d8c18d7703a27c704c15d3b84a67e33aff" + +lodash.union@~4.6.0: + version "4.6.0" + resolved "https://registry.yarnpkg.com/lodash.union/-/lodash.union-4.6.0.tgz#48bb5088409f16f1821666641c44dd1aaae3cd88" + +lodash.uniq@~4.5.0: + version "4.5.0" + resolved "https://registry.yarnpkg.com/lodash.uniq/-/lodash.uniq-4.5.0.tgz#d0225373aeb652adc1bc82e4945339a842754773" + +lodash.without@~4.4.0: + version "4.4.0" + resolved "https://registry.yarnpkg.com/lodash.without/-/lodash.without-4.4.0.tgz#3cd4574a00b67bae373a94b748772640507b7aac" + +lodash@4.17.4, lodash@^4.0.0, lodash@^4.15.0, lodash@^4.2.0, lodash@^4.3.0: + version "4.17.4" + resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.4.tgz#78203a4d1c328ae1d86dca6460e369b57f4055ae" + +lolex@1.3.2: + version "1.3.2" + resolved "https://registry.yarnpkg.com/lolex/-/lolex-1.3.2.tgz#7c3da62ffcb30f0f5a80a2566ca24e45d8a01f31" + +lolex@^1.6.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/lolex/-/lolex-1.6.0.tgz#3a9a0283452a47d7439e72731b9e07d7386e49f6" + +longest@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/longest/-/longest-1.0.1.tgz#30a0b2da38f73770e8294a0d22e6625ed77d0097" + +loose-envify@^1.0.0: + version "1.3.1" + resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.3.1.tgz#d1a8ad33fa9ce0e713d65fdd0ac8b748d478c848" + dependencies: + js-tokens "^3.0.0" + +lowercase-keys@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-1.0.0.tgz#4e3366b39e7f5457e35f1324bdf6f88d0bfc7306" + +lru-cache@^4.0.1: + version "4.0.2" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-4.0.2.tgz#1d17679c069cda5d040991a09dbc2c0db377e55e" + dependencies: + pseudomap "^1.0.1" + yallist "^2.0.0" + +marked@~0.3.6: + version "0.3.6" + resolved "https://registry.yarnpkg.com/marked/-/marked-0.3.6.tgz#b2c6c618fccece4ef86c4fc6cb8a7cbf5aeda8d7" + +md5-hex@^1.2.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/md5-hex/-/md5-hex-1.3.0.tgz#d2c4afe983c4370662179b8cad145219135046c4" + dependencies: + md5-o-matic "^0.1.1" + +md5-o-matic@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/md5-o-matic/-/md5-o-matic-0.1.1.tgz#822bccd65e117c514fab176b25945d54100a03c3" + +merge-source-map@^1.0.2: + version "1.0.3" + resolved "https://registry.yarnpkg.com/merge-source-map/-/merge-source-map-1.0.3.tgz#da1415f2722a5119db07b14c4f973410863a2abf" + dependencies: + source-map "^0.5.3" + +micromatch@^2.3.11: + version "2.3.11" + resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-2.3.11.tgz#86677c97d1720b363431d04d0d15293bd38c1565" + dependencies: + arr-diff "^2.0.0" + array-unique "^0.2.1" + braces "^1.8.2" + expand-brackets "^0.1.4" + extglob "^0.3.1" + filename-regex "^2.0.0" + is-extglob "^1.0.0" + is-glob "^2.0.1" + kind-of "^3.0.2" + normalize-path "^2.0.1" + object.omit "^2.0.0" + parse-glob "^3.0.4" + regex-cache "^0.4.2" + +mime-db@~1.27.0: + version "1.27.0" + resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.27.0.tgz#820f572296bbd20ec25ed55e5b5de869e5436eb1" + +mime-types@^2.1.11, mime-types@~2.1.7: + version "2.1.15" + resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.15.tgz#a4ebf5064094569237b8cf70046776d09fc92aed" + dependencies: + mime-db "~1.27.0" + +minimatch@^3.0.0, minimatch@^3.0.2, minimatch@^3.0.3: + version "3.0.4" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" + dependencies: + brace-expansion "^1.1.7" + +minimist@0.0.8, minimist@~0.0.1: + version "0.0.8" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d" + +minimist@^1.1.0, minimist@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.0.tgz#a35008b20f41383eec1fb914f4cd5df79a264284" + +mkdirp@0.5.1, "mkdirp@>=0.5 0", mkdirp@^0.5.0, mkdirp@^0.5.1, mkdirp@~0.5.0, mkdirp@~0.5.1: + version "0.5.1" + resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903" + dependencies: + minimist "0.0.8" + +mocha@3.4.2, mocha@^3.1.2: + version "3.4.2" + resolved "https://registry.yarnpkg.com/mocha/-/mocha-3.4.2.tgz#d0ef4d332126dbf18d0d640c9b382dd48be97594" + dependencies: + browser-stdout "1.3.0" + commander "2.9.0" + debug "2.6.0" + diff "3.2.0" + escape-string-regexp "1.0.5" + glob "7.1.1" + growl "1.9.2" + json3 "3.3.2" + lodash.create "3.1.1" + mkdirp "0.5.1" + supports-color "3.1.2" + +moment@^2.13.0: + version "2.18.1" + resolved "https://registry.yarnpkg.com/moment/-/moment-2.18.1.tgz#c36193dd3ce1c2eed2adb7c802dbbc77a81b1c0f" + +mongodb-core@2.1.11: + version "2.1.11" + resolved "https://registry.yarnpkg.com/mongodb-core/-/mongodb-core-2.1.11.tgz#1c38776ceb174997a99c28860eed9028da9b3e1a" + dependencies: + bson "~1.0.4" + require_optional "~1.0.0" + +mongodb@>=1.3.x: + version "2.2.27" + resolved "https://registry.yarnpkg.com/mongodb/-/mongodb-2.2.27.tgz#34122034db66d983bcf6ab5adb26a24a70fef6e6" + dependencies: + es6-promise "3.2.1" + mongodb-core "2.1.11" + readable-stream "2.2.7" + +mout@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/mout/-/mout-1.0.0.tgz#9bdf1d4af57d66d47cb353a6335a3281098e1501" + +ms@0.7.1: + version "0.7.1" + resolved "https://registry.yarnpkg.com/ms/-/ms-0.7.1.tgz#9cd13c03adbff25b65effde7ce864ee952017098" + +ms@0.7.2: + version "0.7.2" + resolved "https://registry.yarnpkg.com/ms/-/ms-0.7.2.tgz#ae25cf2512b3885a1d95d7f037868d8431124765" + +ms@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" + +mute-stream@0.0.5, mute-stream@~0.0.4: + version "0.0.5" + resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.5.tgz#8fbfabb0a98a253d3184331f9e8deb7372fac6c0" + +native-promise-only@^0.8.1: + version "0.8.1" + resolved "https://registry.yarnpkg.com/native-promise-only/-/native-promise-only-0.8.1.tgz#20a318c30cb45f71fe7adfbf7b21c99c1472ef11" + +natural-compare@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" + +node-alias@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/node-alias/-/node-alias-1.0.4.tgz#1f1b916b56b9ea241c0135f97ced6940f556f292" + dependencies: + chalk "^1.1.1" + lodash "^4.2.0" + +node-gyp@~3.4.0: + version "3.4.0" + resolved "https://registry.yarnpkg.com/node-gyp/-/node-gyp-3.4.0.tgz#dda558393b3ecbbe24c9e6b8703c71194c63fa36" + dependencies: + fstream "^1.0.0" + glob "^7.0.3" + graceful-fs "^4.1.2" + minimatch "^3.0.2" + mkdirp "^0.5.0" + nopt "2 || 3" + npmlog "0 || 1 || 2 || 3" + osenv "0" + path-array "^1.0.0" + request "2" + rimraf "2" + semver "2.x || 3.x || 4 || 5" + tar "^2.0.0" + which "1" + +node-status-codes@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/node-status-codes/-/node-status-codes-1.0.0.tgz#5ae5541d024645d32a58fcddc9ceecea7ae3ac2f" + +node-uuid@~1.4.7: + version "1.4.8" + resolved "https://registry.yarnpkg.com/node-uuid/-/node-uuid-1.4.8.tgz#b040eb0923968afabf8d32fb1f17f1167fdab907" + +"nopt@2 || 3", nopt@~3.0.6: + version "3.0.6" + resolved "https://registry.yarnpkg.com/nopt/-/nopt-3.0.6.tgz#c6465dbf08abcd4db359317f79ac68a646b28ff9" + dependencies: + abbrev "1" + +normalize-git-url@~3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/normalize-git-url/-/normalize-git-url-3.0.2.tgz#8e5f14be0bdaedb73e07200310aa416c27350fc4" + +normalize-package-data@^2.0.0, normalize-package-data@^2.3.2, "normalize-package-data@~1.0.1 || ^2.0.0", normalize-package-data@~2.3.5: + version "2.3.8" + resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.3.8.tgz#d819eda2a9dedbd1ffa563ea4071d936782295bb" + dependencies: + hosted-git-info "^2.1.4" + is-builtin-module "^1.0.0" + semver "2 || 3 || 4 || 5" + validate-npm-package-license "^3.0.1" + +normalize-path@^2.0.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-2.1.1.tgz#1ab28b556e198363a8c1a6f7e6fa20137fe6aed9" + dependencies: + remove-trailing-separator "^1.0.1" + +npm-cache-filename@~1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/npm-cache-filename/-/npm-cache-filename-1.0.2.tgz#ded306c5b0bfc870a9e9faf823bc5f283e05ae11" + +npm-check-updates@2.8.9: + version "2.8.9" + resolved "https://registry.yarnpkg.com/npm-check-updates/-/npm-check-updates-2.8.9.tgz#c084b087a08ecf9292352e2cd591de903f8129c3" + dependencies: + bluebird "^3.4.3" + chalk "^1.1.3" + cint "^8.2.1" + cli-table "^0.3.1" + commander "^2.9.0" + fast-diff "^1.0.1" + find-up "1.1.2" + get-stdin "^5.0.1" + json-parse-helpfulerror "^1.0.3" + lodash "^4.15.0" + node-alias "^1.0.4" + npm "^3.10.6" + npmi "^2.0.1" + require-dir "^0.3.0" + semver "^5.3.0" + semver-utils "^1.1.1" + spawn-please "^0.2.0" + update-notifier "^1.0.2" + +npm-install-checks@~3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/npm-install-checks/-/npm-install-checks-3.0.0.tgz#d4aecdfd51a53e3723b7b2f93b2ee28e307bc0d7" + dependencies: + semver "^2.3.0 || 3.x || 4 || 5" + +"npm-package-arg@^3.0.0 || ^4.0.0", "npm-package-arg@^4.0.0 || ^5.0.0", npm-package-arg@^4.1.1, npm-package-arg@~4.2.0: + version "4.2.1" + resolved "https://registry.yarnpkg.com/npm-package-arg/-/npm-package-arg-4.2.1.tgz#593303fdea85f7c422775f17f9eb7670f680e3ec" + dependencies: + hosted-git-info "^2.1.5" + semver "^5.1.0" + +npm-registry-client@~7.2.1: + version "7.2.1" + resolved "https://registry.yarnpkg.com/npm-registry-client/-/npm-registry-client-7.2.1.tgz#c792266b088cc313f8525e7e35248626c723db75" + dependencies: + concat-stream "^1.5.2" + graceful-fs "^4.1.6" + normalize-package-data "~1.0.1 || ^2.0.0" + npm-package-arg "^3.0.0 || ^4.0.0" + once "^1.3.3" + request "^2.74.0" + retry "^0.10.0" + semver "2 >=2.2.1 || 3.x || 4 || 5" + slide "^1.1.3" + optionalDependencies: + npmlog "~2.0.0 || ~3.1.0" + +npm-user-validate@~0.1.5: + version "0.1.5" + resolved "https://registry.yarnpkg.com/npm-user-validate/-/npm-user-validate-0.1.5.tgz#52465d50c2d20294a57125b996baedbf56c5004b" + +npm@^3, npm@^3.10.6: + version "3.10.10" + resolved "https://registry.yarnpkg.com/npm/-/npm-3.10.10.tgz#5b1d577e4c8869d6c8603bc89e9cd1637303e46e" + dependencies: + abbrev "~1.0.9" + ansicolors "~0.3.2" + ansistyles "~0.1.3" + aproba "~1.0.4" + archy "~1.0.0" + asap "~2.0.5" + chownr "~1.0.1" + cmd-shim "~2.0.2" + columnify "~1.5.4" + config-chain "~1.1.11" + dezalgo "~1.0.3" + editor "~1.0.0" + fs-vacuum "~1.2.9" + fs-write-stream-atomic "~1.0.8" + fstream "~1.0.10" + fstream-npm "~1.2.0" + glob "~7.1.0" + graceful-fs "~4.1.9" + has-unicode "~2.0.1" + hosted-git-info "~2.1.5" + iferr "~0.1.5" + inflight "~1.0.5" + inherits "~2.0.3" + ini "~1.3.4" + init-package-json "~1.9.4" + lockfile "~1.0.2" + lodash._baseuniq "~4.6.0" + lodash.clonedeep "~4.5.0" + lodash.union "~4.6.0" + lodash.uniq "~4.5.0" + lodash.without "~4.4.0" + mkdirp "~0.5.1" + node-gyp "~3.4.0" + nopt "~3.0.6" + normalize-git-url "~3.0.2" + normalize-package-data "~2.3.5" + npm-cache-filename "~1.0.2" + npm-install-checks "~3.0.0" + npm-package-arg "~4.2.0" + npm-registry-client "~7.2.1" + npm-user-validate "~0.1.5" + npmlog "~4.0.0" + once "~1.4.0" + opener "~1.4.2" + osenv "~0.1.3" + path-is-inside "~1.0.2" + read "~1.0.7" + read-cmd-shim "~1.0.1" + read-installed "~4.0.3" + read-package-json "~2.0.4" + read-package-tree "~5.1.5" + readable-stream "~2.1.5" + realize-package-specifier "~3.0.3" + request "~2.75.0" + retry "~0.10.0" + rimraf "~2.5.4" + semver "~5.3.0" + sha "~2.0.1" + slide "~1.1.6" + sorted-object "~2.0.1" + strip-ansi "~3.0.1" + tar "~2.2.1" + text-table "~0.2.0" + uid-number "0.0.6" + umask "~1.1.0" + unique-filename "~1.1.0" + unpipe "~1.0.0" + validate-npm-package-name "~2.2.2" + which "~1.2.11" + wrappy "~1.0.2" + write-file-atomic "~1.2.0" + +npmi@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/npmi/-/npmi-2.0.1.tgz#32607657e1bd47ca857ab4e9d98f0a0cff96bcea" + dependencies: + npm "^3" + semver "^4.1.0" + +"npmlog@0 || 1 || 2 || 3", "npmlog@~2.0.0 || ~3.1.0": + version "3.1.2" + resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-3.1.2.tgz#2d46fa874337af9498a2f12bb43d8d0be4a36873" + dependencies: + are-we-there-yet "~1.1.2" + console-control-strings "~1.1.0" + gauge "~2.6.0" + set-blocking "~2.0.0" + +npmlog@~4.0.0: + version "4.0.2" + resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-4.0.2.tgz#d03950e0e78ce1527ba26d2a7592e9348ac3e75f" + dependencies: + are-we-there-yet "~1.1.2" + console-control-strings "~1.1.0" + gauge "~2.7.1" + set-blocking "~2.0.0" + +number-is-nan@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d" + +nyc@10.3.2: + version "10.3.2" + resolved "https://registry.yarnpkg.com/nyc/-/nyc-10.3.2.tgz#f27f4d91f2a9db36c24f574ff5c6efff0233de46" + dependencies: + archy "^1.0.0" + arrify "^1.0.1" + caching-transform "^1.0.0" + convert-source-map "^1.3.0" + debug-log "^1.0.1" + default-require-extensions "^1.0.0" + find-cache-dir "^0.1.1" + find-up "^1.1.2" + foreground-child "^1.5.3" + glob "^7.0.6" + istanbul-lib-coverage "^1.1.0" + istanbul-lib-hook "^1.0.6" + istanbul-lib-instrument "^1.7.1" + istanbul-lib-report "^1.1.0" + istanbul-lib-source-maps "^1.2.0" + istanbul-reports "^1.1.0" + md5-hex "^1.2.0" + merge-source-map "^1.0.2" + micromatch "^2.3.11" + mkdirp "^0.5.0" + resolve-from "^2.0.0" + rimraf "^2.5.4" + signal-exit "^3.0.1" + spawn-wrap "1.2.4" + test-exclude "^4.1.0" + yargs "^7.1.0" + yargs-parser "^5.0.0" + +oauth-sign@~0.8.1: + version "0.8.2" + resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.8.2.tgz#46a6ab7f0aead8deae9ec0565780b7d4efeb9d43" + +object-assign@^4.0.1, object-assign@^4.1.0: + version "4.1.1" + resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" + +object-keys@^1.0.10, object-keys@^1.0.8: + version "1.0.11" + resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.0.11.tgz#c54601778ad560f1142ce0e01bcca8b56d13426d" + +object.assign@^4.0.4: + version "4.0.4" + resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.0.4.tgz#b1c9cc044ef1b9fe63606fc141abbb32e14730cc" + dependencies: + define-properties "^1.1.2" + function-bind "^1.1.0" + object-keys "^1.0.10" + +object.omit@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/object.omit/-/object.omit-2.0.1.tgz#1a9c744829f39dbb858c76ca3579ae2a54ebd1fa" + dependencies: + for-own "^0.1.4" + is-extendable "^0.1.1" + +once@^1.3.0, once@^1.3.3, once@~1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" + dependencies: + wrappy "1" + +onetime@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/onetime/-/onetime-1.1.0.tgz#a1f7838f8314c516f05ecefcbc4ccfe04b4ed789" + +opener@~1.4.2: + version "1.4.3" + resolved "https://registry.yarnpkg.com/opener/-/opener-1.4.3.tgz#5c6da2c5d7e5831e8ffa3964950f8d6674ac90b8" + +optimist@^0.6.1: + version "0.6.1" + resolved "https://registry.yarnpkg.com/optimist/-/optimist-0.6.1.tgz#da3ea74686fa21a19a111c326e90eb15a0196686" + dependencies: + minimist "~0.0.1" + wordwrap "~0.0.2" + +optionator@^0.8.2: + version "0.8.2" + resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.8.2.tgz#364c5e409d3f4d6301d6c0b4c05bba50180aeb64" + dependencies: + deep-is "~0.1.3" + fast-levenshtein "~2.0.4" + levn "~0.3.0" + prelude-ls "~1.1.2" + type-check "~0.3.2" + wordwrap "~1.0.0" + +os-homedir@^1.0.0, os-homedir@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/os-homedir/-/os-homedir-1.0.2.tgz#ffbc4988336e0e833de0c168c7ef152121aa7fb3" + +os-locale@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/os-locale/-/os-locale-1.4.0.tgz#20f9f17ae29ed345e8bde583b13d2009803c14d9" + dependencies: + lcid "^1.0.0" + +os-tmpdir@^1.0.0, os-tmpdir@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" + +osenv@0, osenv@^0.1.0, osenv@~0.1.3: + version "0.1.4" + resolved "https://registry.yarnpkg.com/osenv/-/osenv-0.1.4.tgz#42fe6d5953df06c8064be6f176c3d05aaaa34644" + dependencies: + os-homedir "^1.0.0" + os-tmpdir "^1.0.0" + +p-limit@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-1.1.0.tgz#b07ff2d9a5d88bec806035895a2bab66a27988bc" + +p-locate@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-2.0.0.tgz#20a0103b222a70c8fd39cc2e580680f3dde5ec43" + dependencies: + p-limit "^1.1.0" + +package-json@^2.0.0: + version "2.4.0" + resolved "https://registry.yarnpkg.com/package-json/-/package-json-2.4.0.tgz#0d15bd67d1cbbddbb2ca222ff2edb86bcb31a8bb" + dependencies: + got "^5.0.0" + registry-auth-token "^3.0.1" + registry-url "^3.0.3" + semver "^5.1.0" + +parse-glob@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/parse-glob/-/parse-glob-3.0.4.tgz#b2c376cfb11f35513badd173ef0bb6e3a388391c" + dependencies: + glob-base "^0.3.0" + is-dotfile "^1.0.0" + is-extglob "^1.0.0" + is-glob "^2.0.0" + +parse-json@^2.1.0, parse-json@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-2.2.0.tgz#f480f40434ef80741f8469099f8dea18f55a4dc9" + dependencies: + error-ex "^1.2.0" + +path-array@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/path-array/-/path-array-1.0.1.tgz#7e2f0f35f07a2015122b868b7eac0eb2c4fec271" + dependencies: + array-index "^1.0.0" + +path-exists@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-2.1.0.tgz#0feb6c64f0fc518d9a754dd5efb62c7022761f4b" + dependencies: + pinkie-promise "^2.0.0" + +path-exists@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515" + +path-is-absolute@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" + +path-is-inside@^1.0.1, path-is-inside@~1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/path-is-inside/-/path-is-inside-1.0.2.tgz#365417dede44430d1c11af61027facf074bdfc53" + +path-parse@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.5.tgz#3c1adf871ea9cd6c9431b6ea2bd74a0ff055c4c1" + +path-to-regexp@^1.7.0: + version "1.7.0" + resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-1.7.0.tgz#59fde0f435badacba103a84e9d3bc64e96b9937d" + dependencies: + isarray "0.0.1" + +path-type@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/path-type/-/path-type-1.1.0.tgz#59c44f7ee491da704da415da5a4070ba4f8fe441" + dependencies: + graceful-fs "^4.1.2" + pify "^2.0.0" + pinkie-promise "^2.0.0" + +pify@^2.0.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c" + +pinkie-promise@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/pinkie-promise/-/pinkie-promise-2.0.1.tgz#2135d6dfa7a358c069ac9b178776288228450ffa" + dependencies: + pinkie "^2.0.0" + +pinkie@^2.0.0: + version "2.0.4" + resolved "https://registry.yarnpkg.com/pinkie/-/pinkie-2.0.4.tgz#72556b80cfa0d48a974e80e77248e80ed4f7f870" + +pkg-conf@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/pkg-conf/-/pkg-conf-2.0.0.tgz#071c87650403bccfb9c627f58751bfe47c067279" + dependencies: + find-up "^2.0.0" + load-json-file "^2.0.0" + +pkg-config@^1.0.1, pkg-config@^1.1.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/pkg-config/-/pkg-config-1.1.1.tgz#557ef22d73da3c8837107766c52eadabde298fe4" + dependencies: + debug-log "^1.0.0" + find-root "^1.0.0" + xtend "^4.0.1" + +pkg-dir@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-1.0.0.tgz#7a4b508a8d5bb2d629d447056ff4e9c9314cf3d4" + dependencies: + find-up "^1.0.0" + +pkg-up@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/pkg-up/-/pkg-up-1.0.0.tgz#3e08fb461525c4421624a33b9f7e6d0af5b05a26" + dependencies: + find-up "^1.0.0" + +pluralize@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/pluralize/-/pluralize-1.2.1.tgz#d1a21483fd22bb41e58a12fa3421823140897c45" + +prelude-ls@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54" + +prepend-http@^1.0.1: + version "1.0.4" + resolved "https://registry.yarnpkg.com/prepend-http/-/prepend-http-1.0.4.tgz#d4f4562b0ce3696e41ac52d0e002e57a635dc6dc" + +preserve@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/preserve/-/preserve-0.2.0.tgz#815ed1f6ebc65926f865b310c0713bcb3315ce4b" + +private@^0.1.6: + version "0.1.7" + resolved "https://registry.yarnpkg.com/private/-/private-0.1.7.tgz#68ce5e8a1ef0a23bb570cc28537b5332aba63ef1" + +process-nextick-args@~1.0.6: + version "1.0.7" + resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-1.0.7.tgz#150e20b756590ad3f91093f25a4f2ad8bff30ba3" + +progress@^1.1.8: + version "1.1.8" + resolved "https://registry.yarnpkg.com/progress/-/progress-1.1.8.tgz#e260c78f6161cdd9b0e56cc3e0a85de17c7a57be" + +promzard@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/promzard/-/promzard-0.3.0.tgz#26a5d6ee8c7dee4cb12208305acfb93ba382a9ee" + dependencies: + read "1" + +proto-list@~1.2.1: + version "1.2.4" + resolved "https://registry.yarnpkg.com/proto-list/-/proto-list-1.2.4.tgz#212d5bfe1318306a420f6402b8e26ff39647a849" + +pseudomap@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/pseudomap/-/pseudomap-1.0.2.tgz#f052a28da70e618917ef0a8ac34c1ae5a68286b3" + +punycode@^1.4.1: + version "1.4.1" + resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e" + +qs@~6.2.0: + version "6.2.3" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.2.3.tgz#1cfcb25c10a9b2b483053ff39f5dfc9233908cfe" + +randomatic@^1.1.3: + version "1.1.6" + resolved "https://registry.yarnpkg.com/randomatic/-/randomatic-1.1.6.tgz#110dcabff397e9dcff7c0789ccc0a49adf1ec5bb" + dependencies: + is-number "^2.0.2" + kind-of "^3.0.2" + +rc@^1.0.1, rc@^1.1.6: + version "1.2.1" + resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.1.tgz#2e03e8e42ee450b8cb3dce65be1bf8974e1dfd95" + dependencies: + deep-extend "~0.4.0" + ini "~1.3.0" + minimist "^1.2.0" + strip-json-comments "~2.0.1" + +read-all-stream@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/read-all-stream/-/read-all-stream-3.1.0.tgz#35c3e177f2078ef789ee4bfafa4373074eaef4fa" + dependencies: + pinkie-promise "^2.0.0" + readable-stream "^2.0.0" + +read-cmd-shim@~1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/read-cmd-shim/-/read-cmd-shim-1.0.1.tgz#2d5d157786a37c055d22077c32c53f8329e91c7b" + dependencies: + graceful-fs "^4.1.2" + +read-installed@~4.0.3: + version "4.0.3" + resolved "https://registry.yarnpkg.com/read-installed/-/read-installed-4.0.3.tgz#ff9b8b67f187d1e4c29b9feb31f6b223acd19067" + dependencies: + debuglog "^1.0.1" + read-package-json "^2.0.0" + readdir-scoped-modules "^1.0.0" + semver "2 || 3 || 4 || 5" + slide "~1.1.3" + util-extend "^1.0.1" + optionalDependencies: + graceful-fs "^4.1.2" + +"read-package-json@1 || 2", read-package-json@^2.0.0, read-package-json@~2.0.4: + version "2.0.5" + resolved "https://registry.yarnpkg.com/read-package-json/-/read-package-json-2.0.5.tgz#f93a64e641529df68a08c64de46389e8a3f88845" + dependencies: + glob "^7.1.1" + json-parse-helpfulerror "^1.0.2" + normalize-package-data "^2.0.0" + optionalDependencies: + graceful-fs "^4.1.2" + +read-package-tree@~5.1.5: + version "5.1.5" + resolved "https://registry.yarnpkg.com/read-package-tree/-/read-package-tree-5.1.5.tgz#ace7e6381c7684f970aaa98fc7c5d2b666addab6" + dependencies: + debuglog "^1.0.1" + dezalgo "^1.0.0" + once "^1.3.0" + read-package-json "^2.0.0" + readdir-scoped-modules "^1.0.0" + +read-pkg-up@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-1.0.1.tgz#9d63c13276c065918d57f002a57f40a1b643fb02" + dependencies: + find-up "^1.0.0" + read-pkg "^1.0.0" + +read-pkg@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-1.1.0.tgz#f5ffaa5ecd29cb31c0474bca7d756b6bb29e3f28" + dependencies: + load-json-file "^1.0.0" + normalize-package-data "^2.3.2" + path-type "^1.0.0" + +read@1, read@~1.0.1, read@~1.0.7: + version "1.0.7" + resolved "https://registry.yarnpkg.com/read/-/read-1.0.7.tgz#b3da19bd052431a97671d44a42634adf710b40c4" + dependencies: + mute-stream "~0.0.4" + +"readable-stream@1 || 2", readable-stream@^2.0.0, readable-stream@^2.0.2, readable-stream@^2.0.5, readable-stream@^2.0.6, readable-stream@^2.2.2: + version "2.2.9" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.2.9.tgz#cf78ec6f4a6d1eb43d26488cac97f042e74b7fc8" + dependencies: + buffer-shims "~1.0.0" + core-util-is "~1.0.0" + inherits "~2.0.1" + isarray "~1.0.0" + process-nextick-args "~1.0.6" + string_decoder "~1.0.0" + util-deprecate "~1.0.1" + +readable-stream@2.2.7: + version "2.2.7" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.2.7.tgz#07057acbe2467b22042d36f98c5ad507054e95b1" + dependencies: + buffer-shims "~1.0.0" + core-util-is "~1.0.0" + inherits "~2.0.1" + isarray "~1.0.0" + process-nextick-args "~1.0.6" + string_decoder "~1.0.0" + util-deprecate "~1.0.1" + +readable-stream@~2.0.5: + version "2.0.6" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.0.6.tgz#8f90341e68a53ccc928788dacfcd11b36eb9b78e" + dependencies: + core-util-is "~1.0.0" + inherits "~2.0.1" + isarray "~1.0.0" + process-nextick-args "~1.0.6" + string_decoder "~0.10.x" + util-deprecate "~1.0.1" + +readable-stream@~2.1.5: + version "2.1.5" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.1.5.tgz#66fa8b720e1438b364681f2ad1a63c618448c9d0" + dependencies: + buffer-shims "^1.0.0" + core-util-is "~1.0.0" + inherits "~2.0.1" + isarray "~1.0.0" + process-nextick-args "~1.0.6" + string_decoder "~0.10.x" + util-deprecate "~1.0.1" + +readdir-scoped-modules@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/readdir-scoped-modules/-/readdir-scoped-modules-1.0.2.tgz#9fafa37d286be5d92cbaebdee030dc9b5f406747" + dependencies: + debuglog "^1.0.1" + dezalgo "^1.0.0" + graceful-fs "^4.1.2" + once "^1.3.0" + +readline2@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/readline2/-/readline2-1.0.1.tgz#41059608ffc154757b715d9989d199ffbf372e35" + dependencies: + code-point-at "^1.0.0" + is-fullwidth-code-point "^1.0.0" + mute-stream "0.0.5" + +realize-package-specifier@~3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/realize-package-specifier/-/realize-package-specifier-3.0.3.tgz#d0def882952b8de3f67eba5e91199661271f41f4" + dependencies: + dezalgo "^1.0.1" + npm-package-arg "^4.1.1" + +rechoir@^0.6.2: + version "0.6.2" + resolved "https://registry.yarnpkg.com/rechoir/-/rechoir-0.6.2.tgz#85204b54dba82d5742e28c96756ef43af50e3384" + dependencies: + resolve "^1.1.6" + +regenerate@^1.2.1: + version "1.3.2" + resolved "https://registry.yarnpkg.com/regenerate/-/regenerate-1.3.2.tgz#d1941c67bad437e1be76433add5b385f95b19260" + +regenerator-runtime@^0.10.0: + version "0.10.5" + resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.10.5.tgz#336c3efc1220adcedda2c9fab67b5a7955a33658" + +regenerator-transform@0.9.11: + version "0.9.11" + resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.9.11.tgz#3a7d067520cb7b7176769eb5ff868691befe1283" + dependencies: + babel-runtime "^6.18.0" + babel-types "^6.19.0" + private "^0.1.6" + +regex-cache@^0.4.2: + version "0.4.3" + resolved "https://registry.yarnpkg.com/regex-cache/-/regex-cache-0.4.3.tgz#9b1a6c35d4d0dfcef5711ae651e8e9d3d7114145" + dependencies: + is-equal-shallow "^0.1.3" + is-primitive "^2.0.0" + +regexp-quote@0.0.0: + version "0.0.0" + resolved "https://registry.yarnpkg.com/regexp-quote/-/regexp-quote-0.0.0.tgz#1e0f4650c862dcbfed54fd42b148e9bb1721fcf2" + +regexpu-core@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-2.0.0.tgz#49d038837b8dcf8bfa5b9a42139938e6ea2ae240" + dependencies: + regenerate "^1.2.1" + regjsgen "^0.2.0" + regjsparser "^0.1.4" + +registry-auth-token@^3.0.1: + version "3.3.1" + resolved "https://registry.yarnpkg.com/registry-auth-token/-/registry-auth-token-3.3.1.tgz#fb0d3289ee0d9ada2cbb52af5dfe66cb070d3006" + dependencies: + rc "^1.1.6" + safe-buffer "^5.0.1" + +registry-url@^3.0.3: + version "3.1.0" + resolved "https://registry.yarnpkg.com/registry-url/-/registry-url-3.1.0.tgz#3d4ef870f73dde1d77f0cf9a381432444e174942" + dependencies: + rc "^1.0.1" + +regjsgen@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/regjsgen/-/regjsgen-0.2.0.tgz#6c016adeac554f75823fe37ac05b92d5a4edb1f7" + +regjsparser@^0.1.4: + version "0.1.5" + resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.1.5.tgz#7ee8f84dc6fa792d3fd0ae228d24bd949ead205c" + dependencies: + jsesc "~0.5.0" + +remove-trailing-separator@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/remove-trailing-separator/-/remove-trailing-separator-1.0.1.tgz#615ebb96af559552d4bf4057c8436d486ab63cc4" + +repeat-element@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/repeat-element/-/repeat-element-1.1.2.tgz#ef089a178d1483baae4d93eb98b4f9e4e11d990a" + +repeat-string@^1.5.2: + version "1.6.1" + resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637" + +repeating@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/repeating/-/repeating-2.0.1.tgz#5214c53a926d3552707527fbab415dbc08d06dda" + dependencies: + is-finite "^1.0.0" + +request@2, request@^2.74.0, request@~2.75.0: + version "2.75.0" + resolved "https://registry.yarnpkg.com/request/-/request-2.75.0.tgz#d2b8268a286da13eaa5d01adf5d18cc90f657d93" + dependencies: + aws-sign2 "~0.6.0" + aws4 "^1.2.1" + bl "~1.1.2" + caseless "~0.11.0" + combined-stream "~1.0.5" + extend "~3.0.0" + forever-agent "~0.6.1" + form-data "~2.0.0" + har-validator "~2.0.6" + hawk "~3.1.3" + http-signature "~1.1.0" + is-typedarray "~1.0.0" + isstream "~0.1.2" + json-stringify-safe "~5.0.1" + mime-types "~2.1.7" + node-uuid "~1.4.7" + oauth-sign "~0.8.1" + qs "~6.2.0" + stringstream "~0.0.4" + tough-cookie "~2.3.0" + tunnel-agent "~0.4.1" + +require-dir@^0.3.0: + version "0.3.1" + resolved "https://registry.yarnpkg.com/require-dir/-/require-dir-0.3.1.tgz#b5a8e28bae0343bb0d0cc38ab1f531e1931b264a" + +require-directory@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" + +require-main-filename@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-1.0.1.tgz#97f717b69d48784f5f526a6c5aa8ffdda055a4d1" + +require-uncached@^1.0.2: + version "1.0.3" + resolved "https://registry.yarnpkg.com/require-uncached/-/require-uncached-1.0.3.tgz#4e0d56d6c9662fd31e43011c4b95aa49955421d3" + dependencies: + caller-path "^0.1.0" + resolve-from "^1.0.0" + +require_optional@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/require_optional/-/require_optional-1.0.0.tgz#52a86137a849728eb60a55533617f8f914f59abf" + dependencies: + resolve-from "^2.0.0" + semver "^5.1.0" + +requizzle@~0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/requizzle/-/requizzle-0.2.1.tgz#6943c3530c4d9a7e46f1cddd51c158fc670cdbde" + dependencies: + underscore "~1.6.0" + +resolve-from@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-1.0.1.tgz#26cbfe935d1aeeeabb29bc3fe5aeb01e93d44226" + +resolve-from@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-2.0.0.tgz#9480ab20e94ffa1d9e80a804c7ea147611966b57" + +resolve@^1.1.6, resolve@^1.1.7: + version "1.3.3" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.3.3.tgz#655907c3469a8680dc2de3a275a8fdd69691f0e5" + dependencies: + path-parse "^1.0.5" + +restore-cursor@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-1.0.1.tgz#34661f46886327fed2991479152252df92daa541" + dependencies: + exit-hook "^1.0.0" + onetime "^1.0.0" + +retry@^0.10.0, retry@~0.10.0: + version "0.10.1" + resolved "https://registry.yarnpkg.com/retry/-/retry-0.10.1.tgz#e76388d217992c252750241d3d3956fed98d8ff4" + +right-align@^0.1.1: + version "0.1.3" + resolved "https://registry.yarnpkg.com/right-align/-/right-align-0.1.3.tgz#61339b722fe6a3515689210d24e14c96148613ef" + dependencies: + align-text "^0.1.1" + +rimraf@2, rimraf@^2.2.8, rimraf@^2.3.3, rimraf@^2.5.2, rimraf@^2.5.4, rimraf@^2.6.1: + version "2.6.1" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.1.tgz#c2338ec643df7a1b7fe5c54fa86f57428a55f33d" + dependencies: + glob "^7.0.5" + +rimraf@~2.5.4: + version "2.5.4" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.5.4.tgz#96800093cbf1a0c86bd95b4625467535c29dfa04" + dependencies: + glob "^7.0.5" + +rollup-plugin-babel@2.7.1: + version "2.7.1" + resolved "https://registry.yarnpkg.com/rollup-plugin-babel/-/rollup-plugin-babel-2.7.1.tgz#16528197b0f938a1536f44683c7a93d573182f57" + dependencies: + babel-core "6" + babel-plugin-transform-es2015-classes "^6.9.0" + object-assign "^4.1.0" + rollup-pluginutils "^1.5.0" + +rollup-pluginutils@^1.5.0: + version "1.5.2" + resolved "https://registry.yarnpkg.com/rollup-pluginutils/-/rollup-pluginutils-1.5.2.tgz#1e156e778f94b7255bfa1b3d0178be8f5c552408" + dependencies: + estree-walker "^0.2.1" + minimatch "^3.0.2" + +rollup@0.41.6: + version "0.41.6" + resolved "https://registry.yarnpkg.com/rollup/-/rollup-0.41.6.tgz#e0d05497877a398c104d816d2733a718a7a94e2a" + dependencies: + source-map-support "^0.4.0" + +run-async@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/run-async/-/run-async-0.1.0.tgz#c8ad4a5e110661e402a7d21b530e009f25f8e389" + dependencies: + once "^1.3.0" + +run-parallel@^1.1.2: + version "1.1.6" + resolved "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.1.6.tgz#29003c9a2163e01e2d2dfc90575f2c6c1d61a039" + +rx-lite@^3.1.2: + version "3.1.2" + resolved "https://registry.yarnpkg.com/rx-lite/-/rx-lite-3.1.2.tgz#19ce502ca572665f3b647b10939f97fd1615f102" + +safe-buffer@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.0.1.tgz#d263ca54696cd8a306b5ca6551e92de57918fbe7" + +samsam@1.1.2, samsam@~1.1: + version "1.1.2" + resolved "https://registry.yarnpkg.com/samsam/-/samsam-1.1.2.tgz#bec11fdc83a9fda063401210e40176c3024d1567" + +samsam@1.x, samsam@^1.1.3: + version "1.2.1" + resolved "https://registry.yarnpkg.com/samsam/-/samsam-1.2.1.tgz#edd39093a3184370cb859243b2bdf255e7d8ea67" + +sanitize-html@^1.11.4: + version "1.14.1" + resolved "https://registry.yarnpkg.com/sanitize-html/-/sanitize-html-1.14.1.tgz#730ffa2249bdf18333effe45b286173c9c5ad0b8" + dependencies: + htmlparser2 "^3.9.0" + regexp-quote "0.0.0" + xtend "^4.0.0" + +semver-diff@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/semver-diff/-/semver-diff-2.1.0.tgz#4bbb8437c8d37e4b0cf1a68fd726ec6d645d6d36" + dependencies: + semver "^5.0.3" + +semver-utils@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/semver-utils/-/semver-utils-1.1.1.tgz#27d92fec34d27cfa42707d3b40d025ae9855f2df" + +"semver@2 >=2.2.1 || 3.x || 4 || 5", "semver@2 || 3 || 4 || 5", "semver@2.x || 3.x || 4 || 5", semver@5.3.0, "semver@^2.3.0 || 3.x || 4 || 5", semver@^5.0.3, semver@^5.1.0, semver@^5.3.0, semver@~5.3.0: + version "5.3.0" + resolved "https://registry.yarnpkg.com/semver/-/semver-5.3.0.tgz#9b2ce5d3de02d17c6012ad326aa6b4d0cf54f94f" + +semver@^4.1.0: + version "4.3.6" + resolved "https://registry.yarnpkg.com/semver/-/semver-4.3.6.tgz#300bc6e0e86374f7ba61068b5b1ecd57fc6532da" + +set-blocking@^2.0.0, set-blocking@~2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" + +sha@~2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/sha/-/sha-2.0.1.tgz#6030822fbd2c9823949f8f72ed6411ee5cf25aae" + dependencies: + graceful-fs "^4.1.2" + readable-stream "^2.0.2" + +shelljs@^0.7.5: + version "0.7.7" + resolved "https://registry.yarnpkg.com/shelljs/-/shelljs-0.7.7.tgz#b2f5c77ef97148f4b4f6e22682e10bba8667cff1" + dependencies: + glob "^7.0.0" + interpret "^1.0.0" + rechoir "^0.6.2" + +signal-exit@^2.0.0: + version "2.1.2" + resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-2.1.2.tgz#375879b1f92ebc3b334480d038dc546a6d558564" + +signal-exit@^3.0.0, signal-exit@^3.0.1: + version "3.0.2" + resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.2.tgz#b5fdc08f1287ea1178628e415e25132b73646c6d" + +sinon@2.3.1: + version "2.3.1" + resolved "https://registry.yarnpkg.com/sinon/-/sinon-2.3.1.tgz#48c9c758b4d0bb86327486833f1c4298919ce9ee" + dependencies: + diff "^3.1.0" + formatio "1.2.0" + lolex "^1.6.0" + native-promise-only "^0.8.1" + path-to-regexp "^1.7.0" + samsam "^1.1.3" + text-encoding "0.6.4" + type-detect "^4.0.0" + +sinon@^1.17.6: + version "1.17.7" + resolved "https://registry.yarnpkg.com/sinon/-/sinon-1.17.7.tgz#4542a4f49ba0c45c05eb2e9dd9d203e2b8efe0bf" + dependencies: + formatio "1.1.1" + lolex "1.3.2" + samsam "1.1.2" + util ">=0.10.3 <1" + +slash@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/slash/-/slash-1.0.0.tgz#c41f2f6c39fc16d1cd17ad4b5d896114ae470d55" + +slice-ansi@0.0.4: + version "0.0.4" + resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-0.0.4.tgz#edbf8903f66f7ce2f8eafd6ceed65e264c831b35" + +slide@^1.1.3, slide@^1.1.5, slide@~1.1.3, slide@~1.1.6: + version "1.1.6" + resolved "https://registry.yarnpkg.com/slide/-/slide-1.1.6.tgz#56eb027d65b4d2dce6cb2e2d32c4d4afc9e1d707" + +sntp@1.x.x: + version "1.0.9" + resolved "https://registry.yarnpkg.com/sntp/-/sntp-1.0.9.tgz#6541184cc90aeea6c6e7b35e2659082443c66198" + dependencies: + hoek "2.x.x" + +sorted-object@~2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/sorted-object/-/sorted-object-2.0.1.tgz#7d631f4bd3a798a24af1dffcfbfe83337a5df5fc" + +source-map-support@^0.4.0, source-map-support@^0.4.2: + version "0.4.15" + resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.4.15.tgz#03202df65c06d2bd8c7ec2362a193056fef8d3b1" + dependencies: + source-map "^0.5.6" + +source-map@^0.4.4: + version "0.4.4" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.4.4.tgz#eba4f5da9c0dc999de68032d8b4f76173652036b" + dependencies: + amdefine ">=0.0.4" + +source-map@^0.5.0, source-map@^0.5.3, source-map@^0.5.6, source-map@~0.5.1: + version "0.5.6" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.6.tgz#75ce38f52bf0733c5a7f0c118d81334a2bb5f412" + +spawn-please@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/spawn-please/-/spawn-please-0.2.0.tgz#bdd85991b80409f9c0dac709bc44a0a318a9760d" + +spawn-wrap@1.2.4: + version "1.2.4" + resolved "https://registry.yarnpkg.com/spawn-wrap/-/spawn-wrap-1.2.4.tgz#920eb211a769c093eebfbd5b0e7a5d2e68ab2e40" + dependencies: + foreground-child "^1.3.3" + mkdirp "^0.5.0" + os-homedir "^1.0.1" + rimraf "^2.3.3" + signal-exit "^2.0.0" + which "^1.2.4" + +spdx-correct@~1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-1.0.2.tgz#4b3073d933ff51f3912f03ac5519498a4150db40" + dependencies: + spdx-license-ids "^1.0.2" + +spdx-expression-parse@~1.0.0: + version "1.0.4" + resolved "https://registry.yarnpkg.com/spdx-expression-parse/-/spdx-expression-parse-1.0.4.tgz#9bdf2f20e1f40ed447fbe273266191fced51626c" + +spdx-license-ids@^1.0.2: + version "1.2.2" + resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-1.2.2.tgz#c9df7a3424594ade6bd11900d596696dc06bac57" + +sprintf-js@~1.0.2: + version "1.0.3" + resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" + +sshpk@^1.7.0: + version "1.13.0" + resolved "https://registry.yarnpkg.com/sshpk/-/sshpk-1.13.0.tgz#ff2a3e4fd04497555fed97b39a0fd82fafb3a33c" + dependencies: + asn1 "~0.2.3" + assert-plus "^1.0.0" + dashdash "^1.12.0" + getpass "^0.1.1" + optionalDependencies: + bcrypt-pbkdf "^1.0.0" + ecc-jsbn "~0.1.1" + jodid25519 "^1.0.0" + jsbn "~0.1.0" + tweetnacl "~0.14.0" + +standard-engine@~5.2.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/standard-engine/-/standard-engine-5.2.0.tgz#400660ae5acce8afd4db60ff2214a9190ad790a3" + dependencies: + deglob "^2.0.0" + find-root "^1.0.0" + get-stdin "^5.0.1" + home-or-tmp "^2.0.0" + minimist "^1.1.0" + pkg-config "^1.0.1" + +standard-engine@~7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/standard-engine/-/standard-engine-7.0.0.tgz#ebb77b9c8fc2c8165ffa353bd91ba0dff41af690" + dependencies: + deglob "^2.1.0" + get-stdin "^5.0.1" + minimist "^1.1.0" + pkg-conf "^2.0.0" + +standard@10.0.2: + version "10.0.2" + resolved "https://registry.yarnpkg.com/standard/-/standard-10.0.2.tgz#974c1c53cc865b075a4b576e78441e1695daaf7b" + dependencies: + eslint "~3.19.0" + eslint-config-standard "10.2.1" + eslint-config-standard-jsx "4.0.1" + eslint-plugin-import "~2.2.0" + eslint-plugin-node "~4.2.2" + eslint-plugin-promise "~3.5.0" + eslint-plugin-react "~6.10.0" + eslint-plugin-standard "~3.0.1" + standard-engine "~7.0.0" + +standard@8.6.0: + version "8.6.0" + resolved "https://registry.yarnpkg.com/standard/-/standard-8.6.0.tgz#635132be7bfb567c2921005f30f9e350e4752aad" + dependencies: + eslint "~3.10.2" + eslint-config-standard "6.2.1" + eslint-config-standard-jsx "3.2.0" + eslint-plugin-promise "~3.4.0" + eslint-plugin-react "~6.7.1" + eslint-plugin-standard "~2.0.1" + standard-engine "~5.2.0" + +string-width@^1.0.1, string-width@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-1.0.2.tgz#118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3" + dependencies: + code-point-at "^1.0.0" + is-fullwidth-code-point "^1.0.0" + strip-ansi "^3.0.0" + +string-width@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.0.0.tgz#635c5436cc72a6e0c387ceca278d4e2eec52687e" + dependencies: + is-fullwidth-code-point "^2.0.0" + strip-ansi "^3.0.0" + +string_decoder@~0.10.x: + version "0.10.31" + resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-0.10.31.tgz#62e203bc41766c6c28c9fc84301dab1c5310fa94" + +string_decoder@~1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.0.1.tgz#62e200f039955a6810d8df0a33ffc0f013662d98" + dependencies: + safe-buffer "^5.0.1" + +stringstream@~0.0.4: + version "0.0.5" + resolved "https://registry.yarnpkg.com/stringstream/-/stringstream-0.0.5.tgz#4e484cd4de5a0bbbee18e46307710a8a81621878" + +strip-ansi@^3.0.0, strip-ansi@^3.0.1, strip-ansi@~3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf" + dependencies: + ansi-regex "^2.0.0" + +strip-bom@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-2.0.0.tgz#6219a85616520491f35788bdbf1447a99c7e6b0e" + dependencies: + is-utf8 "^0.2.0" + +strip-bom@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3" + +strip-json-comments@~1.0.1: + version "1.0.4" + resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-1.0.4.tgz#1e15fbcac97d3ee99bf2d73b4c656b082bbafb91" + +strip-json-comments@~2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" + +supports-color@3.1.2, supports-color@^3.1.2: + version "3.1.2" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-3.1.2.tgz#72a262894d9d408b956ca05ff37b2ed8a6e2a2d5" + dependencies: + has-flag "^1.0.0" + +supports-color@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7" + +table@^3.7.8: + version "3.8.3" + resolved "https://registry.yarnpkg.com/table/-/table-3.8.3.tgz#2bbc542f0fda9861a755d3947fefd8b3f513855f" + dependencies: + ajv "^4.7.0" + ajv-keywords "^1.0.0" + chalk "^1.1.1" + lodash "^4.0.0" + slice-ansi "0.0.4" + string-width "^2.0.0" + +taffydb@2.6.2: + version "2.6.2" + resolved "https://registry.yarnpkg.com/taffydb/-/taffydb-2.6.2.tgz#7cbcb64b5a141b6a2efc2c5d2c67b4e150b2a268" + +tar@^2.0.0, tar@~2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/tar/-/tar-2.2.1.tgz#8e4d2a256c0e2185c6b18ad694aec968b83cb1d1" + dependencies: + block-stream "*" + fstream "^1.0.2" + inherits "2" + +test-exclude@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/test-exclude/-/test-exclude-4.1.0.tgz#04ca70b7390dd38c98d4a003a173806ca7991c91" + dependencies: + arrify "^1.0.1" + micromatch "^2.3.11" + object-assign "^4.1.0" + read-pkg-up "^1.0.1" + require-main-filename "^1.0.1" + +text-encoding@0.6.4: + version "0.6.4" + resolved "https://registry.yarnpkg.com/text-encoding/-/text-encoding-0.6.4.tgz#e399a982257a276dae428bb92845cb71bdc26d19" + +text-table@~0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" + +through@^2.3.6: + version "2.3.8" + resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" + +timed-out@^3.0.0: + version "3.1.3" + resolved "https://registry.yarnpkg.com/timed-out/-/timed-out-3.1.3.tgz#95860bfcc5c76c277f8f8326fd0f5b2e20eba217" + +to-fast-properties@^1.0.1: + version "1.0.3" + resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-1.0.3.tgz#b83571fa4d8c25b82e231b06e3a3055de4ca1a47" + +tough-cookie@~2.3.0: + version "2.3.2" + resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.3.2.tgz#f081f76e4c85720e6c37a5faced737150d84072a" + dependencies: + punycode "^1.4.1" + +trim-right@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/trim-right/-/trim-right-1.0.1.tgz#cb2e1203067e0c8de1f614094b9fe45704ea6003" + +tryit@^1.0.1: + version "1.0.3" + resolved "https://registry.yarnpkg.com/tryit/-/tryit-1.0.3.tgz#393be730a9446fd1ead6da59a014308f36c289cb" + +tunnel-agent@~0.4.1: + version "0.4.3" + resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.4.3.tgz#6373db76909fe570e08d73583365ed828a74eeeb" + +tweetnacl@^0.14.3, tweetnacl@~0.14.0: + version "0.14.5" + resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-0.14.5.tgz#5ae68177f192d4456269d108afa93ff8743f4f64" + +type-check@~0.3.2: + version "0.3.2" + resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.3.2.tgz#5884cab512cf1d355e3fb784f30804b2b520db72" + dependencies: + prelude-ls "~1.1.2" + +type-detect@0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/type-detect/-/type-detect-0.1.1.tgz#0ba5ec2a885640e470ea4e8505971900dac58822" + +type-detect@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/type-detect/-/type-detect-1.0.0.tgz#762217cc06db258ec48908a1298e8b95121e8ea2" + +type-detect@^4.0.0: + version "4.0.3" + resolved "https://registry.yarnpkg.com/type-detect/-/type-detect-4.0.3.tgz#0e3f2670b44099b0b46c284d136a7ef49c74c2ea" + +typedarray@^0.0.6: + version "0.0.6" + resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" + +uglify-js@^2.6: + version "2.8.27" + resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-2.8.27.tgz#47787f912b0f242e5b984343be8e35e95f694c9c" + dependencies: + source-map "~0.5.1" + yargs "~3.10.0" + optionalDependencies: + uglify-to-browserify "~1.0.0" + +uglify-to-browserify@~1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz#6e0924d6bda6b5afe349e39a6d632850a0f882b7" + +uid-number@0.0.6: + version "0.0.6" + resolved "https://registry.yarnpkg.com/uid-number/-/uid-number-0.0.6.tgz#0ea10e8035e8eb5b8e4449f06da1c730663baa81" + +umask@~1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/umask/-/umask-1.1.0.tgz#f29cebf01df517912bb58ff9c4e50fde8e33320d" + +underscore-contrib@~0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/underscore-contrib/-/underscore-contrib-0.3.0.tgz#665b66c24783f8fa2b18c9f8cbb0e2c7d48c26c7" + dependencies: + underscore "1.6.0" + +underscore@1.6.0, underscore@~1.6.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/underscore/-/underscore-1.6.0.tgz#8b38b10cacdef63337b8b24e4ff86d45aea529a8" + +underscore@~1.8.3: + version "1.8.3" + resolved "https://registry.yarnpkg.com/underscore/-/underscore-1.8.3.tgz#4f3fb53b106e6097fcf9cb4109f2a5e9bdfa5022" + +uniq@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/uniq/-/uniq-1.0.1.tgz#b31c5ae8254844a3a8281541ce2b04b865a734ff" + +unique-filename@~1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/unique-filename/-/unique-filename-1.1.0.tgz#d05f2fe4032560871f30e93cbe735eea201514f3" + dependencies: + unique-slug "^2.0.0" + +unique-slug@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/unique-slug/-/unique-slug-2.0.0.tgz#db6676e7c7cc0629878ff196097c78855ae9f4ab" + dependencies: + imurmurhash "^0.1.4" + +unpipe@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" + +unzip-response@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/unzip-response/-/unzip-response-1.0.2.tgz#b984f0877fc0a89c2c773cc1ef7b5b232b5b06fe" + +update-notifier@^1.0.2: + version "1.0.3" + resolved "https://registry.yarnpkg.com/update-notifier/-/update-notifier-1.0.3.tgz#8f92c515482bd6831b7c93013e70f87552c7cf5a" + dependencies: + boxen "^0.6.0" + chalk "^1.0.0" + configstore "^2.0.0" + is-npm "^1.0.0" + latest-version "^2.0.0" + lazy-req "^1.1.0" + semver-diff "^2.0.0" + xdg-basedir "^2.0.0" + +url-parse-lax@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/url-parse-lax/-/url-parse-lax-1.0.0.tgz#7af8f303645e9bd79a272e7a14ac68bc0609da73" + dependencies: + prepend-http "^1.0.1" + +user-home@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/user-home/-/user-home-2.0.0.tgz#9c70bfd8169bc1dcbf48604e0f04b8b49cde9e9f" + dependencies: + os-homedir "^1.0.0" + +util-deprecate@~1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" + +util-extend@^1.0.1: + version "1.0.3" + resolved "https://registry.yarnpkg.com/util-extend/-/util-extend-1.0.3.tgz#a7c216d267545169637b3b6edc6ca9119e2ff93f" + +"util@>=0.10.3 <1": + version "0.10.3" + resolved "https://registry.yarnpkg.com/util/-/util-0.10.3.tgz#7afb1afe50805246489e3db7fe0ed379336ac0f9" + dependencies: + inherits "2.0.1" + +uuid@^2.0.1: + version "2.0.3" + resolved "https://registry.yarnpkg.com/uuid/-/uuid-2.0.3.tgz#67e2e863797215530dff318e5bf9dcebfd47b21a" + +validate-npm-package-license@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/validate-npm-package-license/-/validate-npm-package-license-3.0.1.tgz#2804babe712ad3379459acfbe24746ab2c303fbc" + dependencies: + spdx-correct "~1.0.0" + spdx-expression-parse "~1.0.0" + +validate-npm-package-name@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/validate-npm-package-name/-/validate-npm-package-name-3.0.0.tgz#5fa912d81eb7d0c74afc140de7317f0ca7df437e" + dependencies: + builtins "^1.0.3" + +validate-npm-package-name@~2.2.2: + version "2.2.2" + resolved "https://registry.yarnpkg.com/validate-npm-package-name/-/validate-npm-package-name-2.2.2.tgz#f65695b22f7324442019a3c7fa39a6e7fd299085" + dependencies: + builtins "0.0.7" + +verror@1.3.6: + version "1.3.6" + resolved "https://registry.yarnpkg.com/verror/-/verror-1.3.6.tgz#cff5df12946d297d2baaefaa2689e25be01c005c" + dependencies: + extsprintf "1.0.2" + +wcwidth@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/wcwidth/-/wcwidth-1.0.1.tgz#f0b0dcf915bc5ff1528afadb2c0e17b532da2fe8" + dependencies: + defaults "^1.0.3" + +which-module@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/which-module/-/which-module-1.0.0.tgz#bba63ca861948994ff307736089e3b96026c2a4f" + +which@1, which@^1.2.4, which@^1.2.9, which@~1.2.11: + version "1.2.14" + resolved "https://registry.yarnpkg.com/which/-/which-1.2.14.tgz#9a87c4378f03e827cecaf1acdf56c736c01c14e5" + dependencies: + isexe "^2.0.0" + +wide-align@^1.1.0: + version "1.1.2" + resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.2.tgz#571e0f1b0604636ebc0dfc21b0339bbe31341710" + dependencies: + string-width "^1.0.2" + +widest-line@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/widest-line/-/widest-line-1.0.0.tgz#0c09c85c2a94683d0d7eaf8ee097d564bf0e105c" + dependencies: + string-width "^1.0.1" + +window-size@0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/window-size/-/window-size-0.1.0.tgz#5438cd2ea93b202efa3a19fe8887aee7c94f9c9d" + +wordwrap@0.0.2: + version "0.0.2" + resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-0.0.2.tgz#b79669bb42ecb409f83d583cad52ca17eaa1643f" + +wordwrap@~0.0.2: + version "0.0.3" + resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-0.0.3.tgz#a3d5da6cd5c0bc0008d37234bbaf1bed63059107" + +wordwrap@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-1.0.0.tgz#27584810891456a4171c8d0226441ade90cbcaeb" + +wrap-ansi@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-2.1.0.tgz#d8fc3d284dd05794fe84973caecdd1cf824fdd85" + dependencies: + string-width "^1.0.1" + strip-ansi "^3.0.1" + +wrappy@1, wrappy@~1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" + +write-file-atomic@^1.1.2, write-file-atomic@^1.1.4: + version "1.3.4" + resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-1.3.4.tgz#f807a4f0b1d9e913ae7a48112e6cc3af1991b45f" + dependencies: + graceful-fs "^4.1.11" + imurmurhash "^0.1.4" + slide "^1.1.5" + +write-file-atomic@~1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-1.2.0.tgz#14c66d4e4cb3ca0565c28cf3b7a6f3e4d5938fab" + dependencies: + graceful-fs "^4.1.2" + imurmurhash "^0.1.4" + slide "^1.1.5" + +write@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/write/-/write-0.2.1.tgz#5fc03828e264cea3fe91455476f7a3c566cb0757" + dependencies: + mkdirp "^0.5.1" + +xdg-basedir@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/xdg-basedir/-/xdg-basedir-2.0.0.tgz#edbc903cc385fc04523d966a335504b5504d1bd2" + dependencies: + os-homedir "^1.0.0" + +xtend@^4.0.0, xtend@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.1.tgz#a5c6d532be656e23db820efb943a1f04998d63af" + +y18n@^3.2.1: + version "3.2.1" + resolved "https://registry.yarnpkg.com/y18n/-/y18n-3.2.1.tgz#6d15fba884c08679c0d77e88e7759e811e07fa41" + +yallist@^2.0.0: + version "2.1.2" + resolved "https://registry.yarnpkg.com/yallist/-/yallist-2.1.2.tgz#1c11f9218f076089a47dd512f93c6699a6a81d52" + +yargs-parser@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-5.0.0.tgz#275ecf0d7ffe05c77e64e7c86e4cd94bf0e1228a" + dependencies: + camelcase "^3.0.0" + +yargs@^7.1.0: + version "7.1.0" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-7.1.0.tgz#6ba318eb16961727f5d284f8ea003e8d6154d0c8" + dependencies: + camelcase "^3.0.0" + cliui "^3.2.0" + decamelize "^1.1.1" + get-caller-file "^1.0.1" + os-locale "^1.4.0" + read-pkg-up "^1.0.1" + require-directory "^2.1.1" + require-main-filename "^1.0.1" + set-blocking "^2.0.0" + string-width "^1.0.2" + which-module "^1.0.0" + y18n "^3.2.1" + yargs-parser "^5.0.0" + +yargs@~3.10.0: + version "3.10.0" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-3.10.0.tgz#f7ee7bd857dd7c1d2d38c0e74efbd681d1431fd1" + dependencies: + camelcase "^1.0.2" + cliui "^2.1.0" + decamelize "^1.0.0" + window-size "0.1.0" From 9b824e76fc64202756b08e2dddf47b14f868d414 Mon Sep 17 00:00:00 2001 From: Jason Dobry Date: Thu, 17 Aug 2017 21:46:52 -0700 Subject: [PATCH 30/36] 1.0.0 --- CHANGELOG.md | 4 + CONTRIBUTORS | 2 +- LICENSE | 2 +- README.md | 24 +- circle.yml | 25 +- conf.json | 2 +- package-lock.json | 7373 +++++++++++++++++++++++++++++++++++++++++++++ package.json | 35 +- src/index.js | 6 +- yarn.lock | 668 ++-- 10 files changed, 7878 insertions(+), 263 deletions(-) create mode 100644 package-lock.json diff --git a/CHANGELOG.md b/CHANGELOG.md index fa582ca..b798849 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,7 @@ +##### 1.0.0 - 17 August 2017 + +Stable 1.0.0 release + ##### 1.0.0-rc.1 - 23 August 2016 ###### Backwards compatible changes diff --git a/CONTRIBUTORS b/CONTRIBUTORS index f97d70e..4787cf8 100644 --- a/CONTRIBUTORS +++ b/CONTRIBUTORS @@ -5,5 +5,5 @@ # Names should be added to this file as: # [commit count] Name 9 Cory Robinson - 42 Jason Dobry + 43 Jason Dobry 1 John Grogg diff --git a/LICENSE b/LICENSE index cbb516e..f6afefe 100644 --- a/LICENSE +++ b/LICENSE @@ -1,6 +1,6 @@ The MIT License (MIT) -Copyright (c) 2014-2016 js-data-mongodb project authors +Copyright (c) 2014-2017 js-data-mongodb project authors Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal diff --git a/README.md b/README.md index 52274ec..aa39e1e 100644 --- a/README.md +++ b/README.md @@ -11,7 +11,27 @@ A MongoDB adapter for the [JSData Node.js ORM][11]. -### Just getting started? +### Installation + + npm install --save js-data js-data-mongodb bson mongodb + +### Usage + +```js +import { MongoDBAdapter } from 'js-data-mongodb'; + +// Create an instance of MongoDBAdapter +const adapter = new MongoDBAdapter({ + uri: 'mongodb://localhost:27017' +}); + +// Other JSData setup hidden + +// Register the adapter instance +store.registerAdapter('mongodb', adapter, { default: true }); +``` + +### JSData + MongoDB Tutorial Start with the [JSData + MongoDB tutorial][12] or checkout the [API Reference Documentation][13]. @@ -33,7 +53,7 @@ Thank you! [The MIT License (MIT)][17] -Copyright (c) 2014-2016 [js-data-mongodb project authors][18] +Copyright (c) 2014-2017 [js-data-mongodb project authors][18] [1]: http://slack.js-data.io/badge.svg [2]: http://slack.js-data.io diff --git a/circle.yml b/circle.yml index 109a5c8..ea53167 100644 --- a/circle.yml +++ b/circle.yml @@ -1,15 +1,26 @@ +# Adjust the behavior of the virtual machine (VM) +machine: + node: + version: 6.11.2 + +# Use for broader build-related configuration general: branches: ignore: - gh-pages -machine: - node: - version: 6 + +# Install your project's language-specific dependencies dependencies: pre: - - npm install -g npm - - npm install -g codecov nyc - - npm install js-data@^3.0.0-rc.4 mongodb bson@^0.4.x + - yarn global add nyc codecov + override: + - yarn + cache_directories: + - ~/.cache/yarn + +# Run your tests test: + override: + - yarn test post: - - nyc report --reporter=lcov | codecov + - nyc report --reporter=lcov > coverage.lcov && codecov diff --git a/conf.json b/conf.json index a3bce71..4d4edca 100644 --- a/conf.json +++ b/conf.json @@ -14,7 +14,7 @@ "templates": { "theme": "jsdata", "systemName": "js-data-mongodb", - "copyright": "js-data-mongodb Copyright © 2014-2016 js-data-mongodb project authors", + "copyright": "js-data-mongodb Copyright © 2014-2017 js-data-mongodb project authors", "outputSourceFiles": true, "linenums": true, "footer": "", diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..7275330 --- /dev/null +++ b/package-lock.json @@ -0,0 +1,7373 @@ +{ + "name": "js-data-mongodb", + "version": "1.0.0", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "acorn": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.1.1.tgz", + "integrity": "sha512-vOk6uEMctu0vQrvuSqFdJyqj1Q0S5VTDL79qtjo+DhRr+1mmaD+tluFSCZqhvi/JUhXSzoZN2BhtstaPEeE8cw==", + "dev": true + }, + "acorn-jsx": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-3.0.1.tgz", + "integrity": "sha1-r9+UiPsezvyDSPb7IvRk4ypYs2s=", + "dev": true, + "requires": { + "acorn": "3.3.0" + }, + "dependencies": { + "acorn": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-3.3.0.tgz", + "integrity": "sha1-ReN/s56No/JbruP/U2niu18iAXo=", + "dev": true + } + } + }, + "ajv": { + "version": "4.11.8", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-4.11.8.tgz", + "integrity": "sha1-gv+wKynmYq5TvcIK8VlHcGc5xTY=", + "dev": true, + "requires": { + "co": "4.6.0", + "json-stable-stringify": "1.0.1" + } + }, + "ajv-keywords": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-1.5.1.tgz", + "integrity": "sha1-MU3QpLM2j609/NxU7eYXG4htrzw=", + "dev": true + }, + "ansi-align": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-1.1.0.tgz", + "integrity": "sha1-LwwWWIKXOa3V67FeawxuNCPwFro=", + "dev": true, + "requires": { + "string-width": "1.0.2" + } + }, + "ansi-escapes": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-1.4.0.tgz", + "integrity": "sha1-06ioOzGapneTZisT52HHkRQiMG4=", + "dev": true + }, + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + }, + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true + }, + "argparse": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.9.tgz", + "integrity": "sha1-c9g7wmP4bpf4zE9rrhsOkKfSLIY=", + "dev": true, + "requires": { + "sprintf-js": "1.0.3" + } + }, + "array-union": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", + "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=", + "dev": true, + "requires": { + "array-uniq": "1.0.3" + } + }, + "array-uniq": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", + "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=", + "dev": true + }, + "array.prototype.find": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/array.prototype.find/-/array.prototype.find-2.0.4.tgz", + "integrity": "sha1-VWpcU2LAhkgyPdrrnenRS8GGTJA=", + "dev": true, + "requires": { + "define-properties": "1.1.2", + "es-abstract": "1.8.0" + } + }, + "arrify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", + "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=", + "dev": true + }, + "assertion-error": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.0.2.tgz", + "integrity": "sha1-E8pRXYYgbaC6xm6DTdOX2HWBCUw=" + }, + "babel-code-frame": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz", + "integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=", + "dev": true, + "requires": { + "chalk": "1.1.3", + "esutils": "2.0.2", + "js-tokens": "3.0.2" + } + }, + "babel-core": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-core/-/babel-core-6.26.0.tgz", + "integrity": "sha1-rzL3izGm/O8RnIew/Y2XU/A6C7g=", + "dev": true, + "requires": { + "babel-code-frame": "6.26.0", + "babel-generator": "6.26.0", + "babel-helpers": "6.24.1", + "babel-messages": "6.23.0", + "babel-register": "6.26.0", + "babel-runtime": "6.26.0", + "babel-template": "6.26.0", + "babel-traverse": "6.26.0", + "babel-types": "6.26.0", + "babylon": "6.18.0", + "convert-source-map": "1.5.0", + "debug": "2.6.8", + "json5": "0.5.1", + "lodash": "4.17.4", + "minimatch": "3.0.4", + "path-is-absolute": "1.0.1", + "private": "0.1.7", + "slash": "1.0.0", + "source-map": "0.5.6" + } + }, + "babel-eslint": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/babel-eslint/-/babel-eslint-7.2.3.tgz", + "integrity": "sha1-sv4tgBJkcPXBlELcdXJTqJdxCCc=", + "dev": true, + "requires": { + "babel-code-frame": "6.26.0", + "babel-traverse": "6.26.0", + "babel-types": "6.26.0", + "babylon": "6.18.0" + } + }, + "babel-generator": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-generator/-/babel-generator-6.26.0.tgz", + "integrity": "sha1-rBriAHC3n248odMmlhMFN3TyDcU=", + "dev": true, + "requires": { + "babel-messages": "6.23.0", + "babel-runtime": "6.26.0", + "babel-types": "6.26.0", + "detect-indent": "4.0.0", + "jsesc": "1.3.0", + "lodash": "4.17.4", + "source-map": "0.5.6", + "trim-right": "1.0.1" + } + }, + "babel-helper-call-delegate": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helper-call-delegate/-/babel-helper-call-delegate-6.24.1.tgz", + "integrity": "sha1-7Oaqzdx25Bw0YfiL/Fdb0Nqi340=", + "dev": true, + "requires": { + "babel-helper-hoist-variables": "6.24.1", + "babel-runtime": "6.26.0", + "babel-traverse": "6.26.0", + "babel-types": "6.26.0" + } + }, + "babel-helper-define-map": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-helper-define-map/-/babel-helper-define-map-6.26.0.tgz", + "integrity": "sha1-pfVtq0GiX5fstJjH66ypgZ+Vvl8=", + "dev": true, + "requires": { + "babel-helper-function-name": "6.24.1", + "babel-runtime": "6.26.0", + "babel-types": "6.26.0", + "lodash": "4.17.4" + } + }, + "babel-helper-function-name": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helper-function-name/-/babel-helper-function-name-6.24.1.tgz", + "integrity": "sha1-00dbjAPtmCQqJbSDUasYOZ01gKk=", + "dev": true, + "requires": { + "babel-helper-get-function-arity": "6.24.1", + "babel-runtime": "6.26.0", + "babel-template": "6.26.0", + "babel-traverse": "6.26.0", + "babel-types": "6.26.0" + } + }, + "babel-helper-get-function-arity": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helper-get-function-arity/-/babel-helper-get-function-arity-6.24.1.tgz", + "integrity": "sha1-j3eCqpNAfEHTqlCQj4mwMbG2hT0=", + "dev": true, + "requires": { + "babel-runtime": "6.26.0", + "babel-types": "6.26.0" + } + }, + "babel-helper-hoist-variables": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helper-hoist-variables/-/babel-helper-hoist-variables-6.24.1.tgz", + "integrity": "sha1-HssnaJydJVE+rbyZFKc/VAi+enY=", + "dev": true, + "requires": { + "babel-runtime": "6.26.0", + "babel-types": "6.26.0" + } + }, + "babel-helper-optimise-call-expression": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helper-optimise-call-expression/-/babel-helper-optimise-call-expression-6.24.1.tgz", + "integrity": "sha1-96E0J7qfc/j0+pk8VKl4gtEkQlc=", + "dev": true, + "requires": { + "babel-runtime": "6.26.0", + "babel-types": "6.26.0" + } + }, + "babel-helper-regex": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-helper-regex/-/babel-helper-regex-6.26.0.tgz", + "integrity": "sha1-MlxZ+QL4LyS3T6zu0DY5VPZJXnI=", + "dev": true, + "requires": { + "babel-runtime": "6.26.0", + "babel-types": "6.26.0", + "lodash": "4.17.4" + } + }, + "babel-helper-replace-supers": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helper-replace-supers/-/babel-helper-replace-supers-6.24.1.tgz", + "integrity": "sha1-v22/5Dk40XNpohPKiov3S2qQqxo=", + "dev": true, + "requires": { + "babel-helper-optimise-call-expression": "6.24.1", + "babel-messages": "6.23.0", + "babel-runtime": "6.26.0", + "babel-template": "6.26.0", + "babel-traverse": "6.26.0", + "babel-types": "6.26.0" + } + }, + "babel-helpers": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helpers/-/babel-helpers-6.24.1.tgz", + "integrity": "sha1-NHHenK7DiOXIUOWX5Yom3fN2ArI=", + "dev": true, + "requires": { + "babel-runtime": "6.26.0", + "babel-template": "6.26.0" + } + }, + "babel-messages": { + "version": "6.23.0", + "resolved": "https://registry.npmjs.org/babel-messages/-/babel-messages-6.23.0.tgz", + "integrity": "sha1-8830cDhYA1sqKVHG7F7fbGLyYw4=", + "dev": true, + "requires": { + "babel-runtime": "6.26.0" + } + }, + "babel-plugin-check-es2015-constants": { + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/babel-plugin-check-es2015-constants/-/babel-plugin-check-es2015-constants-6.22.0.tgz", + "integrity": "sha1-NRV7EBQm/S/9PaP3XH0ekYNbv4o=", + "dev": true, + "requires": { + "babel-runtime": "6.26.0" + } + }, + "babel-plugin-external-helpers": { + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/babel-plugin-external-helpers/-/babel-plugin-external-helpers-6.22.0.tgz", + "integrity": "sha1-IoX0iwK9Xe3oUXXK+MYuhq3M76E=", + "dev": true, + "requires": { + "babel-runtime": "6.26.0" + } + }, + "babel-plugin-syntax-async-functions": { + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-async-functions/-/babel-plugin-syntax-async-functions-6.13.0.tgz", + "integrity": "sha1-ytnK0RkbWtY0vzCuCHI5HgZHvpU=", + "dev": true + }, + "babel-plugin-transform-es2015-arrow-functions": { + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-arrow-functions/-/babel-plugin-transform-es2015-arrow-functions-6.22.0.tgz", + "integrity": "sha1-RSaSy3EdX3ncf4XkQM5BufJE0iE=", + "dev": true, + "requires": { + "babel-runtime": "6.26.0" + } + }, + "babel-plugin-transform-es2015-block-scoped-functions": { + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-block-scoped-functions/-/babel-plugin-transform-es2015-block-scoped-functions-6.22.0.tgz", + "integrity": "sha1-u8UbSflk1wy42OC5ToICRs46YUE=", + "dev": true, + "requires": { + "babel-runtime": "6.26.0" + } + }, + "babel-plugin-transform-es2015-block-scoping": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-block-scoping/-/babel-plugin-transform-es2015-block-scoping-6.26.0.tgz", + "integrity": "sha1-1w9SmcEwjQXBL0Y4E7CgnnOxiV8=", + "dev": true, + "requires": { + "babel-runtime": "6.26.0", + "babel-template": "6.26.0", + "babel-traverse": "6.26.0", + "babel-types": "6.26.0", + "lodash": "4.17.4" + } + }, + "babel-plugin-transform-es2015-classes": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-classes/-/babel-plugin-transform-es2015-classes-6.24.1.tgz", + "integrity": "sha1-WkxYpQyclGHlZLSyo7+ryXolhNs=", + "dev": true, + "requires": { + "babel-helper-define-map": "6.26.0", + "babel-helper-function-name": "6.24.1", + "babel-helper-optimise-call-expression": "6.24.1", + "babel-helper-replace-supers": "6.24.1", + "babel-messages": "6.23.0", + "babel-runtime": "6.26.0", + "babel-template": "6.26.0", + "babel-traverse": "6.26.0", + "babel-types": "6.26.0" + } + }, + "babel-plugin-transform-es2015-computed-properties": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-computed-properties/-/babel-plugin-transform-es2015-computed-properties-6.24.1.tgz", + "integrity": "sha1-b+Ko0WiV1WNPTNmZttNICjCBWbM=", + "dev": true, + "requires": { + "babel-runtime": "6.26.0", + "babel-template": "6.26.0" + } + }, + "babel-plugin-transform-es2015-destructuring": { + "version": "6.23.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-destructuring/-/babel-plugin-transform-es2015-destructuring-6.23.0.tgz", + "integrity": "sha1-mXux8auWf2gtKwh2/jWNYOdlxW0=", + "dev": true, + "requires": { + "babel-runtime": "6.26.0" + } + }, + "babel-plugin-transform-es2015-duplicate-keys": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-duplicate-keys/-/babel-plugin-transform-es2015-duplicate-keys-6.24.1.tgz", + "integrity": "sha1-c+s9MQypaePvnskcU3QabxV2Qj4=", + "dev": true, + "requires": { + "babel-runtime": "6.26.0", + "babel-types": "6.26.0" + } + }, + "babel-plugin-transform-es2015-for-of": { + "version": "6.23.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-for-of/-/babel-plugin-transform-es2015-for-of-6.23.0.tgz", + "integrity": "sha1-9HyVsrYT3x0+zC/bdXNiPHUkhpE=", + "dev": true, + "requires": { + "babel-runtime": "6.26.0" + } + }, + "babel-plugin-transform-es2015-function-name": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-function-name/-/babel-plugin-transform-es2015-function-name-6.24.1.tgz", + "integrity": "sha1-g0yJhTvDaxrw86TF26qU/Y6sqos=", + "dev": true, + "requires": { + "babel-helper-function-name": "6.24.1", + "babel-runtime": "6.26.0", + "babel-types": "6.26.0" + } + }, + "babel-plugin-transform-es2015-literals": { + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-literals/-/babel-plugin-transform-es2015-literals-6.22.0.tgz", + "integrity": "sha1-T1SgLWzWbPkVKAAZox0xklN3yi4=", + "dev": true, + "requires": { + "babel-runtime": "6.26.0" + } + }, + "babel-plugin-transform-es2015-modules-amd": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-amd/-/babel-plugin-transform-es2015-modules-amd-6.24.1.tgz", + "integrity": "sha1-Oz5UAXI5hC1tGcMBHEvS8AoA0VQ=", + "dev": true, + "requires": { + "babel-plugin-transform-es2015-modules-commonjs": "6.26.0", + "babel-runtime": "6.26.0", + "babel-template": "6.26.0" + } + }, + "babel-plugin-transform-es2015-modules-commonjs": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-commonjs/-/babel-plugin-transform-es2015-modules-commonjs-6.26.0.tgz", + "integrity": "sha1-DYOUApt9xqvhqX7xgeAHWN0uXYo=", + "dev": true, + "requires": { + "babel-plugin-transform-strict-mode": "6.24.1", + "babel-runtime": "6.26.0", + "babel-template": "6.26.0", + "babel-types": "6.26.0" + } + }, + "babel-plugin-transform-es2015-modules-systemjs": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-systemjs/-/babel-plugin-transform-es2015-modules-systemjs-6.24.1.tgz", + "integrity": "sha1-/4mhQrkRmpBhlfXxBuzzBdlAfSM=", + "dev": true, + "requires": { + "babel-helper-hoist-variables": "6.24.1", + "babel-runtime": "6.26.0", + "babel-template": "6.26.0" + } + }, + "babel-plugin-transform-es2015-modules-umd": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-umd/-/babel-plugin-transform-es2015-modules-umd-6.24.1.tgz", + "integrity": "sha1-rJl+YoXNGO1hdq22B9YCNErThGg=", + "dev": true, + "requires": { + "babel-plugin-transform-es2015-modules-amd": "6.24.1", + "babel-runtime": "6.26.0", + "babel-template": "6.26.0" + } + }, + "babel-plugin-transform-es2015-object-super": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-object-super/-/babel-plugin-transform-es2015-object-super-6.24.1.tgz", + "integrity": "sha1-JM72muIcuDp/hgPa0CH1cusnj40=", + "dev": true, + "requires": { + "babel-helper-replace-supers": "6.24.1", + "babel-runtime": "6.26.0" + } + }, + "babel-plugin-transform-es2015-parameters": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-parameters/-/babel-plugin-transform-es2015-parameters-6.24.1.tgz", + "integrity": "sha1-V6w1GrScrxSpfNE7CfZv3wpiXys=", + "dev": true, + "requires": { + "babel-helper-call-delegate": "6.24.1", + "babel-helper-get-function-arity": "6.24.1", + "babel-runtime": "6.26.0", + "babel-template": "6.26.0", + "babel-traverse": "6.26.0", + "babel-types": "6.26.0" + } + }, + "babel-plugin-transform-es2015-shorthand-properties": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-shorthand-properties/-/babel-plugin-transform-es2015-shorthand-properties-6.24.1.tgz", + "integrity": "sha1-JPh11nIch2YbvZmkYi5R8U3jiqA=", + "dev": true, + "requires": { + "babel-runtime": "6.26.0", + "babel-types": "6.26.0" + } + }, + "babel-plugin-transform-es2015-spread": { + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-spread/-/babel-plugin-transform-es2015-spread-6.22.0.tgz", + "integrity": "sha1-1taKmfia7cRTbIGlQujdnxdG+NE=", + "dev": true, + "requires": { + "babel-runtime": "6.26.0" + } + }, + "babel-plugin-transform-es2015-sticky-regex": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-sticky-regex/-/babel-plugin-transform-es2015-sticky-regex-6.24.1.tgz", + "integrity": "sha1-AMHNsaynERLN8M9hJsLta0V8zbw=", + "dev": true, + "requires": { + "babel-helper-regex": "6.26.0", + "babel-runtime": "6.26.0", + "babel-types": "6.26.0" + } + }, + "babel-plugin-transform-es2015-template-literals": { + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-template-literals/-/babel-plugin-transform-es2015-template-literals-6.22.0.tgz", + "integrity": "sha1-qEs0UPfp+PH2g51taH2oS7EjbY0=", + "dev": true, + "requires": { + "babel-runtime": "6.26.0" + } + }, + "babel-plugin-transform-es2015-typeof-symbol": { + "version": "6.23.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-typeof-symbol/-/babel-plugin-transform-es2015-typeof-symbol-6.23.0.tgz", + "integrity": "sha1-3sCfHN3/lLUqxz1QXITfWdzOs3I=", + "dev": true, + "requires": { + "babel-runtime": "6.26.0" + } + }, + "babel-plugin-transform-es2015-unicode-regex": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-unicode-regex/-/babel-plugin-transform-es2015-unicode-regex-6.24.1.tgz", + "integrity": "sha1-04sS9C6nMj9yk4fxinxa4frrNek=", + "dev": true, + "requires": { + "babel-helper-regex": "6.26.0", + "babel-runtime": "6.26.0", + "regexpu-core": "2.0.0" + } + }, + "babel-plugin-transform-regenerator": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-regenerator/-/babel-plugin-transform-regenerator-6.26.0.tgz", + "integrity": "sha1-4HA2lvveJ/Cj78rPi03KL3s6jy8=", + "dev": true, + "requires": { + "regenerator-transform": "0.10.1" + } + }, + "babel-plugin-transform-strict-mode": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-strict-mode/-/babel-plugin-transform-strict-mode-6.24.1.tgz", + "integrity": "sha1-1fr3qleKZbvlkc9e2uBKDGcCB1g=", + "dev": true, + "requires": { + "babel-runtime": "6.26.0", + "babel-types": "6.26.0" + } + }, + "babel-polyfill": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-polyfill/-/babel-polyfill-6.26.0.tgz", + "integrity": "sha1-N5k3q8Z9eJWXCtxiHyhM2WbPIVM=", + "dev": true, + "requires": { + "babel-runtime": "6.26.0", + "core-js": "2.5.0", + "regenerator-runtime": "0.10.5" + }, + "dependencies": { + "regenerator-runtime": { + "version": "0.10.5", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.10.5.tgz", + "integrity": "sha1-M2w+/BIgrc7dosn6tntaeVWjNlg=", + "dev": true + } + } + }, + "babel-preset-es2015": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-preset-es2015/-/babel-preset-es2015-6.24.1.tgz", + "integrity": "sha1-1EBQ1rwsn+6nAqrzjXJ6AhBTiTk=", + "dev": true, + "requires": { + "babel-plugin-check-es2015-constants": "6.22.0", + "babel-plugin-transform-es2015-arrow-functions": "6.22.0", + "babel-plugin-transform-es2015-block-scoped-functions": "6.22.0", + "babel-plugin-transform-es2015-block-scoping": "6.26.0", + "babel-plugin-transform-es2015-classes": "6.24.1", + "babel-plugin-transform-es2015-computed-properties": "6.24.1", + "babel-plugin-transform-es2015-destructuring": "6.23.0", + "babel-plugin-transform-es2015-duplicate-keys": "6.24.1", + "babel-plugin-transform-es2015-for-of": "6.23.0", + "babel-plugin-transform-es2015-function-name": "6.24.1", + "babel-plugin-transform-es2015-literals": "6.22.0", + "babel-plugin-transform-es2015-modules-amd": "6.24.1", + "babel-plugin-transform-es2015-modules-commonjs": "6.26.0", + "babel-plugin-transform-es2015-modules-systemjs": "6.24.1", + "babel-plugin-transform-es2015-modules-umd": "6.24.1", + "babel-plugin-transform-es2015-object-super": "6.24.1", + "babel-plugin-transform-es2015-parameters": "6.24.1", + "babel-plugin-transform-es2015-shorthand-properties": "6.24.1", + "babel-plugin-transform-es2015-spread": "6.22.0", + "babel-plugin-transform-es2015-sticky-regex": "6.24.1", + "babel-plugin-transform-es2015-template-literals": "6.22.0", + "babel-plugin-transform-es2015-typeof-symbol": "6.23.0", + "babel-plugin-transform-es2015-unicode-regex": "6.24.1", + "babel-plugin-transform-regenerator": "6.26.0" + } + }, + "babel-register": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-register/-/babel-register-6.26.0.tgz", + "integrity": "sha1-btAhFz4vy0htestFxgCahW9kcHE=", + "dev": true, + "requires": { + "babel-core": "6.26.0", + "babel-runtime": "6.26.0", + "core-js": "2.5.0", + "home-or-tmp": "2.0.0", + "lodash": "4.17.4", + "mkdirp": "0.5.1", + "source-map-support": "0.4.16" + } + }, + "babel-runtime": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz", + "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=", + "dev": true, + "requires": { + "core-js": "2.5.0", + "regenerator-runtime": "0.11.0" + } + }, + "babel-template": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-template/-/babel-template-6.26.0.tgz", + "integrity": "sha1-3gPi0WOWsGn0bdn/+FIfsaDjXgI=", + "dev": true, + "requires": { + "babel-runtime": "6.26.0", + "babel-traverse": "6.26.0", + "babel-types": "6.26.0", + "babylon": "6.18.0", + "lodash": "4.17.4" + } + }, + "babel-traverse": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-traverse/-/babel-traverse-6.26.0.tgz", + "integrity": "sha1-RqnL1+3MYsjlwGTi0tjQ9ANXZu4=", + "dev": true, + "requires": { + "babel-code-frame": "6.26.0", + "babel-messages": "6.23.0", + "babel-runtime": "6.26.0", + "babel-types": "6.26.0", + "babylon": "6.18.0", + "debug": "2.6.8", + "globals": "9.18.0", + "invariant": "2.2.2", + "lodash": "4.17.4" + } + }, + "babel-types": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.26.0.tgz", + "integrity": "sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc=", + "dev": true, + "requires": { + "babel-runtime": "6.26.0", + "esutils": "2.0.2", + "lodash": "4.17.4", + "to-fast-properties": "1.0.3" + } + }, + "babylon": { + "version": "6.18.0", + "resolved": "https://registry.npmjs.org/babylon/-/babylon-6.18.0.tgz", + "integrity": "sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ==", + "dev": true + }, + "balanced-match": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" + }, + "bluebird": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.0.tgz", + "integrity": "sha1-eRQg1/VR7qKJdFOop3ZT+WYG1nw=", + "dev": true + }, + "boxen": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/boxen/-/boxen-0.6.0.tgz", + "integrity": "sha1-g2TUJIrDT/DvGy8r9JpsYM4NgbY=", + "dev": true, + "requires": { + "ansi-align": "1.1.0", + "camelcase": "2.1.1", + "chalk": "1.1.3", + "cli-boxes": "1.0.0", + "filled-array": "1.1.0", + "object-assign": "4.1.1", + "repeating": "2.0.1", + "string-width": "1.0.2", + "widest-line": "1.0.0" + } + }, + "brace-expansion": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.8.tgz", + "integrity": "sha1-wHshHHyVLsH479Uad+8NHTmQopI=", + "requires": { + "balanced-match": "1.0.0", + "concat-map": "0.0.1" + } + }, + "browser-stdout": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.0.tgz", + "integrity": "sha1-81HTKWnTL6XXpVZxVCY9korjvR8=" + }, + "bson": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/bson/-/bson-1.0.4.tgz", + "integrity": "sha1-k8ENOeqltYQVy8QFLz5T5WKwtyw=" + }, + "buffer-shims": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/buffer-shims/-/buffer-shims-1.0.0.tgz", + "integrity": "sha1-mXjOMXOIxkmth5MCjDR37wRKi1E=" + }, + "builtin-modules": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz", + "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=", + "dev": true + }, + "caller-path": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/caller-path/-/caller-path-0.1.0.tgz", + "integrity": "sha1-lAhe9jWB7NPaqSREqP6U6CV3dR8=", + "dev": true, + "requires": { + "callsites": "0.2.0" + } + }, + "callsites": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-0.2.0.tgz", + "integrity": "sha1-r6uWJikQp/M8GaV3WCXGnzTjUMo=", + "dev": true + }, + "camelcase": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-2.1.1.tgz", + "integrity": "sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8=", + "dev": true + }, + "capture-stack-trace": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/capture-stack-trace/-/capture-stack-trace-1.0.0.tgz", + "integrity": "sha1-Sm+gc5nCa7pH8LJJa00PtAjFVQ0=", + "dev": true + }, + "catharsis": { + "version": "0.8.9", + "resolved": "https://registry.npmjs.org/catharsis/-/catharsis-0.8.9.tgz", + "integrity": "sha1-mMyJDKZS3S7w5ws3klMQ/56Q/Is=", + "dev": true, + "requires": { + "underscore-contrib": "0.3.0" + } + }, + "chai": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/chai/-/chai-4.1.1.tgz", + "integrity": "sha1-ZuISeebzxkFf+CMYeCJ5AOIXGzk=", + "requires": { + "assertion-error": "1.0.2", + "check-error": "1.0.2", + "deep-eql": "2.0.2", + "get-func-name": "2.0.0", + "pathval": "1.1.0", + "type-detect": "4.0.3" + } + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "dev": true, + "requires": { + "ansi-styles": "2.2.1", + "escape-string-regexp": "1.0.5", + "has-ansi": "2.0.0", + "strip-ansi": "3.0.1", + "supports-color": "2.0.0" + }, + "dependencies": { + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "dev": true + } + } + }, + "check-error": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.2.tgz", + "integrity": "sha1-V00xLt2Iu13YkS6Sht1sCu1KrII=" + }, + "cint": { + "version": "8.2.1", + "resolved": "https://registry.npmjs.org/cint/-/cint-8.2.1.tgz", + "integrity": "sha1-cDhrG0jidz0NYxZqVa/5TvRFahI=", + "dev": true + }, + "circular-json": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/circular-json/-/circular-json-0.3.3.tgz", + "integrity": "sha512-UZK3NBx2Mca+b5LsG7bY183pHWt5Y1xts4P3Pz7ENTwGVnJOUWbRb3ocjvX7hx9tq/yTAdclXm9sZ38gNuem4A==", + "dev": true + }, + "cli-boxes": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-1.0.0.tgz", + "integrity": "sha1-T6kXw+WclKAEzWH47lCdplFocUM=", + "dev": true + }, + "cli-cursor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-1.0.2.tgz", + "integrity": "sha1-ZNo/fValRBLll5S9Ytw1KV6PKYc=", + "dev": true, + "requires": { + "restore-cursor": "1.0.1" + } + }, + "cli-table": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/cli-table/-/cli-table-0.3.1.tgz", + "integrity": "sha1-9TsFJmqLGguTSz0IIebi3FkUriM=", + "dev": true, + "requires": { + "colors": "1.0.3" + } + }, + "cli-width": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.1.0.tgz", + "integrity": "sha1-sjTKIJsp72b8UY2bmNWEewDt8Ao=", + "dev": true + }, + "co": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", + "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=", + "dev": true + }, + "code-point-at": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", + "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", + "dev": true + }, + "colors": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/colors/-/colors-1.0.3.tgz", + "integrity": "sha1-BDP0TYCWgP3rYO0mDxsMJi6CpAs=", + "dev": true + }, + "commander": { + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.9.0.tgz", + "integrity": "sha1-nJkJQXbhIkDLItbFFGCYQA/g99Q=", + "requires": { + "graceful-readlink": "1.0.1" + } + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" + }, + "concat-stream": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.0.tgz", + "integrity": "sha1-CqxmL9Ur54lk1VMvaUeE5wEQrPc=", + "dev": true, + "requires": { + "inherits": "2.0.3", + "readable-stream": "2.2.7", + "typedarray": "0.0.6" + } + }, + "configstore": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/configstore/-/configstore-2.1.0.tgz", + "integrity": "sha1-c3o6cDbpiGECqmCZ5HuzOrGroaE=", + "dev": true, + "requires": { + "dot-prop": "3.0.0", + "graceful-fs": "4.1.11", + "mkdirp": "0.5.1", + "object-assign": "4.1.1", + "os-tmpdir": "1.0.2", + "osenv": "0.1.4", + "uuid": "2.0.3", + "write-file-atomic": "1.3.4", + "xdg-basedir": "2.0.0" + } + }, + "contains-path": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/contains-path/-/contains-path-0.1.0.tgz", + "integrity": "sha1-/ozxhP9mcLa67wGp1IYaXL7EEgo=", + "dev": true + }, + "convert-source-map": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.5.0.tgz", + "integrity": "sha1-ms1whRxtXf3ZPZKC5e35SgP/RrU=", + "dev": true + }, + "core-js": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.5.0.tgz", + "integrity": "sha1-VpwFCRi+ZIazg3VSAorgRmtxcIY=", + "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=" + }, + "create-error-class": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/create-error-class/-/create-error-class-3.0.2.tgz", + "integrity": "sha1-Br56vvlHo/FKMP1hBnHUAbyot7Y=", + "dev": true, + "requires": { + "capture-stack-trace": "1.0.0" + } + }, + "d": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/d/-/d-1.0.0.tgz", + "integrity": "sha1-dUu1v+VUUdpppYuU1F9MWwRi1Y8=", + "dev": true, + "requires": { + "es5-ext": "0.10.27" + } + }, + "debug": { + "version": "2.6.8", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.8.tgz", + "integrity": "sha1-5zFTHKLt4n0YgiJCfaF4IdaP9Pw=", + "requires": { + "ms": "2.0.0" + } + }, + "debug-log": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/debug-log/-/debug-log-1.0.1.tgz", + "integrity": "sha1-IwdjLUwEOCuN+KMvcLiVBG1SdF8=", + "dev": true + }, + "deep-eql": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-2.0.2.tgz", + "integrity": "sha1-sbrAblbwp2d3aG1Qyf63XC7XZ5o=", + "requires": { + "type-detect": "3.0.0" + }, + "dependencies": { + "type-detect": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-3.0.0.tgz", + "integrity": "sha1-RtDMhVOrt7E6NSsNbeov1Y8tm1U=" + } + } + }, + "deep-extend": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.4.2.tgz", + "integrity": "sha1-SLaZwn4zS/ifEIkr5DL25MfTSn8=", + "dev": true + }, + "deep-is": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", + "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=", + "dev": true + }, + "define-properties": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.2.tgz", + "integrity": "sha1-g6c/L+pWmJj7c3GTyPhzyvbUXJQ=", + "dev": true, + "requires": { + "foreach": "2.0.5", + "object-keys": "1.0.11" + } + }, + "deglob": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/deglob/-/deglob-2.1.0.tgz", + "integrity": "sha1-TUSr4W7zLHebSXK9FBqAMlApoUo=", + "dev": true, + "requires": { + "find-root": "1.1.0", + "glob": "7.1.1", + "ignore": "3.3.3", + "pkg-config": "1.1.1", + "run-parallel": "1.1.6", + "uniq": "1.0.1" + } + }, + "del": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/del/-/del-2.2.2.tgz", + "integrity": "sha1-wSyYHQZ4RshLyvhiz/kw2Qf/0ag=", + "dev": true, + "requires": { + "globby": "5.0.0", + "is-path-cwd": "1.0.0", + "is-path-in-cwd": "1.0.0", + "object-assign": "4.1.1", + "pify": "2.3.0", + "pinkie-promise": "2.0.1", + "rimraf": "2.6.1" + } + }, + "detect-indent": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-4.0.0.tgz", + "integrity": "sha1-920GQ1LN9Docts5hnE7jqUdd4gg=", + "dev": true, + "requires": { + "repeating": "2.0.1" + } + }, + "diff": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-3.2.0.tgz", + "integrity": "sha1-yc45Okt8vQsFinJck98pkCeGj/k=" + }, + "doctrine": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-1.5.0.tgz", + "integrity": "sha1-N53Ocw9hZvds76TmcHoVmwLFpvo=", + "dev": true, + "requires": { + "esutils": "2.0.2", + "isarray": "1.0.0" + }, + "dependencies": { + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + } + } + }, + "dom-serializer": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.1.0.tgz", + "integrity": "sha1-BzxpdUbOB4DOI75KKOKT5AvDDII=", + "dev": true, + "requires": { + "domelementtype": "1.1.3", + "entities": "1.1.1" + }, + "dependencies": { + "domelementtype": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.1.3.tgz", + "integrity": "sha1-vSh3PiZCiBrsUVRJJCmcXNgiGFs=", + "dev": true + } + } + }, + "domelementtype": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.0.tgz", + "integrity": "sha1-sXrtguirWeUt2cGbF1bg/BhyBMI=", + "dev": true + }, + "domhandler": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-2.4.1.tgz", + "integrity": "sha1-iS5HAAqZvlW783dP/qBWHYh5wlk=", + "dev": true, + "requires": { + "domelementtype": "1.3.0" + } + }, + "domutils": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.6.2.tgz", + "integrity": "sha1-GVjMC0yUJuntNn+xyOhUiRsPo/8=", + "dev": true, + "requires": { + "dom-serializer": "0.1.0", + "domelementtype": "1.3.0" + } + }, + "dot-prop": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-3.0.0.tgz", + "integrity": "sha1-G3CK8JSknJoOfbyteQq6U52sEXc=", + "dev": true, + "requires": { + "is-obj": "1.0.1" + } + }, + "duplexer2": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.1.4.tgz", + "integrity": "sha1-ixLauHjA1p4+eJEFFmKjL8a93ME=", + "dev": true, + "requires": { + "readable-stream": "2.2.7" + } + }, + "entities": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.1.tgz", + "integrity": "sha1-blwtClYhtdra7O+AuQ7ftc13cvA=", + "dev": true + }, + "error-ex": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.1.tgz", + "integrity": "sha1-+FWobOYa3E6GIcPNoh56dhLDqNw=", + "dev": true, + "requires": { + "is-arrayish": "0.2.1" + } + }, + "es-abstract": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.8.0.tgz", + "integrity": "sha512-Cf9/h5MrXtExM20gSS55YFrGKCyPrRBjIVBtVyy8vmlsDfe0NPKMWj65tPLgzyfPuapWxh5whpXCtW4+AW5mRg==", + "dev": true, + "requires": { + "es-to-primitive": "1.1.1", + "function-bind": "1.1.0", + "has": "1.0.1", + "is-callable": "1.1.3", + "is-regex": "1.0.4" + } + }, + "es-to-primitive": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.1.1.tgz", + "integrity": "sha1-RTVSSKiJeQNLZ5Lhm7gfK3l13Q0=", + "dev": true, + "requires": { + "is-callable": "1.1.3", + "is-date-object": "1.0.1", + "is-symbol": "1.0.1" + } + }, + "es5-ext": { + "version": "0.10.27", + "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.27.tgz", + "integrity": "sha512-3KXJRYzKXTd7xfFy5uZsJCXue55fAYQ035PRjyYk2PicllxIwcW9l3AbM/eGaw3vgVAUW4tl4xg9AXDEI6yw0w==", + "dev": true, + "requires": { + "es6-iterator": "2.0.1", + "es6-symbol": "3.1.1" + } + }, + "es6-iterator": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.1.tgz", + "integrity": "sha1-jjGcnwRTv1ddN0lAplWSDlnKVRI=", + "dev": true, + "requires": { + "d": "1.0.0", + "es5-ext": "0.10.27", + "es6-symbol": "3.1.1" + } + }, + "es6-map": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/es6-map/-/es6-map-0.1.5.tgz", + "integrity": "sha1-kTbgUD3MBqMBaQ8LsU/042TpSfA=", + "dev": true, + "requires": { + "d": "1.0.0", + "es5-ext": "0.10.27", + "es6-iterator": "2.0.1", + "es6-set": "0.1.5", + "es6-symbol": "3.1.1", + "event-emitter": "0.3.5" + } + }, + "es6-promise": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-3.2.1.tgz", + "integrity": "sha1-7FYjOGgDKQkgcXDDlEjiREndH8Q=" + }, + "es6-set": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/es6-set/-/es6-set-0.1.5.tgz", + "integrity": "sha1-0rPsXU2ADO2BjbU40ol02wpzzLE=", + "dev": true, + "requires": { + "d": "1.0.0", + "es5-ext": "0.10.27", + "es6-iterator": "2.0.1", + "es6-symbol": "3.1.1", + "event-emitter": "0.3.5" + } + }, + "es6-symbol": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.1.tgz", + "integrity": "sha1-vwDvT9q2uhtG7Le2KbTH7VcVzHc=", + "dev": true, + "requires": { + "d": "1.0.0", + "es5-ext": "0.10.27" + } + }, + "es6-weak-map": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/es6-weak-map/-/es6-weak-map-2.0.2.tgz", + "integrity": "sha1-XjqzIlH/0VOKH45f+hNXdy+S2W8=", + "dev": true, + "requires": { + "d": "1.0.0", + "es5-ext": "0.10.27", + "es6-iterator": "2.0.1", + "es6-symbol": "3.1.1" + } + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" + }, + "escope": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/escope/-/escope-3.6.0.tgz", + "integrity": "sha1-4Bl16BJ4GhY6ba392AOY3GTIicM=", + "dev": true, + "requires": { + "es6-map": "0.1.5", + "es6-weak-map": "2.0.2", + "esrecurse": "4.2.0", + "estraverse": "4.2.0" + } + }, + "eslint": { + "version": "3.10.2", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-3.10.2.tgz", + "integrity": "sha1-yaEOi/bp1lZRIEd4xQM0Hx6sPOc=", + "dev": true, + "requires": { + "babel-code-frame": "6.26.0", + "chalk": "1.1.3", + "concat-stream": "1.6.0", + "debug": "2.6.8", + "doctrine": "1.5.0", + "escope": "3.6.0", + "espree": "3.5.0", + "estraverse": "4.2.0", + "esutils": "2.0.2", + "file-entry-cache": "2.0.0", + "glob": "7.1.1", + "globals": "9.18.0", + "ignore": "3.3.3", + "imurmurhash": "0.1.4", + "inquirer": "0.12.0", + "is-my-json-valid": "2.16.0", + "is-resolvable": "1.0.0", + "js-yaml": "3.9.1", + "json-stable-stringify": "1.0.1", + "levn": "0.3.0", + "lodash": "4.17.4", + "mkdirp": "0.5.1", + "natural-compare": "1.4.0", + "optionator": "0.8.2", + "path-is-inside": "1.0.2", + "pluralize": "1.2.1", + "progress": "1.1.8", + "require-uncached": "1.0.3", + "shelljs": "0.7.8", + "strip-bom": "3.0.0", + "strip-json-comments": "1.0.4", + "table": "3.8.3", + "text-table": "0.2.0", + "user-home": "2.0.0" + }, + "dependencies": { + "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 + } + } + }, + "eslint-config-standard": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/eslint-config-standard/-/eslint-config-standard-6.2.1.tgz", + "integrity": "sha1-06aKr8cZFjnn7kQec0hzkCY1QpI=", + "dev": true + }, + "eslint-config-standard-jsx": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/eslint-config-standard-jsx/-/eslint-config-standard-jsx-3.2.0.tgz", + "integrity": "sha1-wkDibtkZoRpCqk3oBZRys4Jo1iA=", + "dev": true + }, + "eslint-import-resolver-node": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.2.3.tgz", + "integrity": "sha1-Wt2BBujJKNssuiMrzZ76hG49oWw=", + "dev": true, + "requires": { + "debug": "2.6.8", + "object-assign": "4.1.1", + "resolve": "1.4.0" + } + }, + "eslint-module-utils": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.1.1.tgz", + "integrity": "sha512-jDI/X5l/6D1rRD/3T43q8Qgbls2nq5km5KSqiwlyUbGo5+04fXhMKdCPhjwbqAa6HXWaMxj8Q4hQDIh7IadJQw==", + "dev": true, + "requires": { + "debug": "2.6.8", + "pkg-dir": "1.0.0" + } + }, + "eslint-plugin-import": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.2.0.tgz", + "integrity": "sha1-crowb60wXWfEgWNIpGmaQimsi04=", + "dev": true, + "requires": { + "builtin-modules": "1.1.1", + "contains-path": "0.1.0", + "debug": "2.6.8", + "doctrine": "1.5.0", + "eslint-import-resolver-node": "0.2.3", + "eslint-module-utils": "2.1.1", + "has": "1.0.1", + "lodash.cond": "4.5.2", + "minimatch": "3.0.4", + "pkg-up": "1.0.0" + } + }, + "eslint-plugin-node": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/eslint-plugin-node/-/eslint-plugin-node-4.2.3.tgz", + "integrity": "sha512-vIUQPuwbVYdz/CYnlTLsJrRy7iXHQjdEe5wz0XhhdTym3IInM/zZLlPf9nZ2mThsH0QcsieCOWs2vOeCy/22LQ==", + "dev": true, + "requires": { + "ignore": "3.3.3", + "minimatch": "3.0.4", + "object-assign": "4.1.1", + "resolve": "1.4.0", + "semver": "5.3.0" + }, + "dependencies": { + "semver": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.3.0.tgz", + "integrity": "sha1-myzl094C0XxgEq0yaqa00M9U+U8=", + "dev": true + } + } + }, + "eslint-plugin-promise": { + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/eslint-plugin-promise/-/eslint-plugin-promise-3.4.2.tgz", + "integrity": "sha1-G+J5Pq/i0YtbEjuBNsJp+AT+cSI=", + "dev": true + }, + "eslint-plugin-react": { + "version": "6.7.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-6.7.1.tgz", + "integrity": "sha1-Gvlq6lRYVoJRV9l8G1DVqPtkpac=", + "dev": true, + "requires": { + "doctrine": "1.5.0", + "jsx-ast-utils": "1.4.1" + } + }, + "eslint-plugin-standard": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-standard/-/eslint-plugin-standard-2.0.1.tgz", + "integrity": "sha1-NYlpn/nJF/LCX3apFmh/ZBw2n/M=", + "dev": true + }, + "espree": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-3.5.0.tgz", + "integrity": "sha1-mDWGJb3QVYYeon4oZ+pyn69GPY0=", + "dev": true, + "requires": { + "acorn": "5.1.1", + "acorn-jsx": "3.0.1" + } + }, + "esprima": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.0.tgz", + "integrity": "sha512-oftTcaMu/EGrEIu904mWteKIv8vMuOgGYo7EhVJJN00R/EED9DCua/xxHRdYnKtcECzVg7xOWhflvJMnqcFZjw==", + "dev": true + }, + "esquery": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.0.0.tgz", + "integrity": "sha1-z7qLV9f7qT8XKYqKAGoEzaE9gPo=", + "dev": true, + "requires": { + "estraverse": "4.2.0" + } + }, + "esrecurse": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.2.0.tgz", + "integrity": "sha1-+pVo2Y04I/mkHZHpAtyrnqblsWM=", + "dev": true, + "requires": { + "estraverse": "4.2.0", + "object-assign": "4.1.1" + } + }, + "estraverse": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.2.0.tgz", + "integrity": "sha1-De4/7TH81GlhjOc0IJn8GvoL2xM=", + "dev": true + }, + "estree-walker": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-0.2.1.tgz", + "integrity": "sha1-va/oCVOD2EFNXcLs9MkXO225QS4=", + "dev": true + }, + "esutils": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz", + "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=", + "dev": true + }, + "event-emitter": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/event-emitter/-/event-emitter-0.3.5.tgz", + "integrity": "sha1-34xp7vFkeSPHFXuc6DhAYQsCzDk=", + "dev": true, + "requires": { + "d": "1.0.0", + "es5-ext": "0.10.27" + } + }, + "exit-hook": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/exit-hook/-/exit-hook-1.1.1.tgz", + "integrity": "sha1-8FyiM7SMBdVP/wd2XfhQfpXAL/g=", + "dev": true + }, + "fast-diff": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.1.1.tgz", + "integrity": "sha1-CuoOTmBbaiGJ8Ok21Lf7rxt8/Zs=", + "dev": true + }, + "fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", + "dev": true + }, + "figures": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-1.7.0.tgz", + "integrity": "sha1-y+Hjr/zxzUS4DK3+0o3Hk6lwHS4=", + "dev": true, + "requires": { + "escape-string-regexp": "1.0.5", + "object-assign": "4.1.1" + } + }, + "file-entry-cache": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-2.0.0.tgz", + "integrity": "sha1-w5KZDD5oR4PYOLjISkXYoEhFg2E=", + "dev": true, + "requires": { + "flat-cache": "1.2.2", + "object-assign": "4.1.1" + } + }, + "filled-array": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/filled-array/-/filled-array-1.1.0.tgz", + "integrity": "sha1-w8T2xmO5I0WamqKZEtLQMfFQf4Q=", + "dev": true + }, + "find-root": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/find-root/-/find-root-1.1.0.tgz", + "integrity": "sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng==", + "dev": true + }, + "find-up": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", + "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", + "dev": true, + "requires": { + "path-exists": "2.1.0", + "pinkie-promise": "2.0.1" + } + }, + "flat-cache": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-1.2.2.tgz", + "integrity": "sha1-+oZxTnLCHbiGAXYezy9VXRq8a5Y=", + "dev": true, + "requires": { + "circular-json": "0.3.3", + "del": "2.2.2", + "graceful-fs": "4.1.11", + "write": "0.2.1" + } + }, + "foreach": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/foreach/-/foreach-2.0.5.tgz", + "integrity": "sha1-C+4AUBiusmDQo6865ljdATbsG5k=", + "dev": true + }, + "formatio": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/formatio/-/formatio-1.2.0.tgz", + "integrity": "sha1-87IWfZBoxGmKjVH092CjmlTYGOs=", + "requires": { + "samsam": "1.2.1" + } + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" + }, + "function-bind": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.0.tgz", + "integrity": "sha1-FhdnFMgBeY5Ojyz391KUZ7tKV3E=", + "dev": true + }, + "generate-function": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/generate-function/-/generate-function-2.0.0.tgz", + "integrity": "sha1-aFj+fAlpt9TpCTM3ZHrHn2DfvnQ=", + "dev": true + }, + "generate-object-property": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/generate-object-property/-/generate-object-property-1.2.0.tgz", + "integrity": "sha1-nA4cQDCM6AT0eDYYuTf6iPmdUNA=", + "dev": true, + "requires": { + "is-property": "1.0.2" + } + }, + "get-func-name": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.0.tgz", + "integrity": "sha1-6td0q+5y4gQJQzoGY2YCPdaIekE=" + }, + "get-stdin": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-5.0.1.tgz", + "integrity": "sha1-Ei4WFZHiH/TFJTAwVpPyDmOTo5g=", + "dev": true + }, + "glob": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.1.tgz", + "integrity": "sha1-gFIR3wT6rxxjo2ADBs31reULLsg=", + "requires": { + "fs.realpath": "1.0.0", + "inflight": "1.0.6", + "inherits": "2.0.3", + "minimatch": "3.0.4", + "once": "1.4.0", + "path-is-absolute": "1.0.1" + } + }, + "globals": { + "version": "9.18.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-9.18.0.tgz", + "integrity": "sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ==", + "dev": true + }, + "globby": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-5.0.0.tgz", + "integrity": "sha1-69hGZ8oNuzMLmbz8aOrCvFQ3Dg0=", + "dev": true, + "requires": { + "array-union": "1.0.2", + "arrify": "1.0.1", + "glob": "7.1.1", + "object-assign": "4.1.1", + "pify": "2.3.0", + "pinkie-promise": "2.0.1" + } + }, + "got": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/got/-/got-5.7.1.tgz", + "integrity": "sha1-X4FjWmHkplifGAVp6k44FoClHzU=", + "dev": true, + "requires": { + "create-error-class": "3.0.2", + "duplexer2": "0.1.4", + "is-redirect": "1.0.0", + "is-retry-allowed": "1.1.0", + "is-stream": "1.1.0", + "lowercase-keys": "1.0.0", + "node-status-codes": "1.0.0", + "object-assign": "4.1.1", + "parse-json": "2.2.0", + "pinkie-promise": "2.0.1", + "read-all-stream": "3.1.0", + "readable-stream": "2.2.7", + "timed-out": "3.1.3", + "unzip-response": "1.0.2", + "url-parse-lax": "1.0.0" + } + }, + "graceful-fs": { + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", + "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=", + "dev": true + }, + "graceful-readlink": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/graceful-readlink/-/graceful-readlink-1.0.1.tgz", + "integrity": "sha1-TK+tdrxi8C+gObL5Tpo906ORpyU=" + }, + "growl": { + "version": "1.9.2", + "resolved": "https://registry.npmjs.org/growl/-/growl-1.9.2.tgz", + "integrity": "sha1-Dqd0NxXbjY3ixe3hd14bRayFwC8=" + }, + "has": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.1.tgz", + "integrity": "sha1-hGFzP1OLCDfJNh45qauelwTcLyg=", + "dev": true, + "requires": { + "function-bind": "1.1.0" + } + }, + "has-ansi": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", + "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", + "dev": true, + "requires": { + "ansi-regex": "2.1.1" + } + }, + "has-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", + "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=" + }, + "home-or-tmp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/home-or-tmp/-/home-or-tmp-2.0.0.tgz", + "integrity": "sha1-42w/LSyufXRqhX440Y1fMqeILbg=", + "dev": true, + "requires": { + "os-homedir": "1.0.2", + "os-tmpdir": "1.0.2" + } + }, + "htmlparser2": { + "version": "3.9.2", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.9.2.tgz", + "integrity": "sha1-G9+HrMoPP55T+k/M6w9LTLsAszg=", + "dev": true, + "requires": { + "domelementtype": "1.3.0", + "domhandler": "2.4.1", + "domutils": "1.6.2", + "entities": "1.1.1", + "inherits": "2.0.3", + "readable-stream": "2.2.7" + } + }, + "ignore": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-3.3.3.tgz", + "integrity": "sha1-QyNS5XrM2HqzEQ6C0/6g5HgSFW0=", + "dev": true + }, + "imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", + "dev": true + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "requires": { + "once": "1.4.0", + "wrappy": "1.0.2" + } + }, + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" + }, + "ini": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.4.tgz", + "integrity": "sha1-BTfLedr1m1mhpRff9wbIbsA5Fi4=", + "dev": true + }, + "ink-docstrap": { + "version": "git+https://github.com/js-data/docstrap.git#cfbe45fa313e1628c493076d5e15d2b855dfbf2c", + "dev": true, + "requires": { + "moment": "2.18.1", + "sanitize-html": "1.14.1" + } + }, + "inquirer": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-0.12.0.tgz", + "integrity": "sha1-HvK/1jUE3wvHV4X/+MLEHfEvB34=", + "dev": true, + "requires": { + "ansi-escapes": "1.4.0", + "ansi-regex": "2.1.1", + "chalk": "1.1.3", + "cli-cursor": "1.0.2", + "cli-width": "2.1.0", + "figures": "1.7.0", + "lodash": "4.17.4", + "readline2": "1.0.1", + "run-async": "0.1.0", + "rx-lite": "3.1.2", + "string-width": "1.0.2", + "strip-ansi": "3.0.1", + "through": "2.3.8" + } + }, + "interpret": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.0.3.tgz", + "integrity": "sha1-y8NcYu7uc/Gat7EKgBURQBr8D5A=", + "dev": true + }, + "invariant": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.2.tgz", + "integrity": "sha1-nh9WrArNtr8wMwbzOL47IErmA2A=", + "dev": true, + "requires": { + "loose-envify": "1.3.1" + } + }, + "is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", + "dev": true + }, + "is-callable": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.3.tgz", + "integrity": "sha1-hut1OSgF3cM69xySoO7fdO52BLI=", + "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-finite": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.0.2.tgz", + "integrity": "sha1-zGZ3aVYCvlUO8R6LSqYwU0K20Ko=", + "dev": true, + "requires": { + "number-is-nan": "1.0.1" + } + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", + "dev": true, + "requires": { + "number-is-nan": "1.0.1" + } + }, + "is-my-json-valid": { + "version": "2.16.0", + "resolved": "https://registry.npmjs.org/is-my-json-valid/-/is-my-json-valid-2.16.0.tgz", + "integrity": "sha1-8Hndm/2uZe4gOKrorLyGqxCeNpM=", + "dev": true, + "requires": { + "generate-function": "2.0.0", + "generate-object-property": "1.2.0", + "jsonpointer": "4.0.1", + "xtend": "4.0.1" + } + }, + "is-npm": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-npm/-/is-npm-1.0.0.tgz", + "integrity": "sha1-8vtjpl5JBbQGyGBydloaTceTufQ=", + "dev": true + }, + "is-obj": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", + "integrity": "sha1-PkcprB9f3gJc19g6iW2rn09n2w8=", + "dev": true + }, + "is-path-cwd": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-1.0.0.tgz", + "integrity": "sha1-0iXsIxMuie3Tj9p2dHLmLmXxEG0=", + "dev": true + }, + "is-path-in-cwd": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-path-in-cwd/-/is-path-in-cwd-1.0.0.tgz", + "integrity": "sha1-ZHdYK4IU1gI0YJRWcAO+ip6sBNw=", + "dev": true, + "requires": { + "is-path-inside": "1.0.0" + } + }, + "is-path-inside": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-1.0.0.tgz", + "integrity": "sha1-/AbloWg/vaE95mev9xe7wQpI838=", + "dev": true, + "requires": { + "path-is-inside": "1.0.2" + } + }, + "is-property": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-property/-/is-property-1.0.2.tgz", + "integrity": "sha1-V/4cTkhHTt1lsJkR8msc1Ald2oQ=", + "dev": true + }, + "is-redirect": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-redirect/-/is-redirect-1.0.0.tgz", + "integrity": "sha1-HQPd7VO9jbDzDCbk+V02/HyH3CQ=", + "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-resolvable": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-resolvable/-/is-resolvable-1.0.0.tgz", + "integrity": "sha1-jfV8YeouPFAUCNEA+wE8+NbgzGI=", + "dev": true, + "requires": { + "tryit": "1.0.3" + } + }, + "is-retry-allowed": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-retry-allowed/-/is-retry-allowed-1.1.0.tgz", + "integrity": "sha1-EaBgVotnM5REAz0BJaYaINVk+zQ=", + "dev": true + }, + "is-stream": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", + "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", + "dev": true + }, + "is-symbol": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.1.tgz", + "integrity": "sha1-PMWfAAJRlLarLjjbrmaJJWtmBXI=", + "dev": true + }, + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" + }, + "jju": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/jju/-/jju-1.3.0.tgz", + "integrity": "sha1-2t2e8BkkvHKLA/L3l5vb1i96Kqo=", + "dev": true + }, + "js-data": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/js-data/-/js-data-3.0.0.tgz", + "integrity": "sha512-iMS5IoBib9p92+5Q9uEbbwd6GFCP6bY2HJL8cAGqY3X8si48s98gI2kT88JlqtlwvaHHkrONnZSwkvRQ9yYGJw==" + }, + "js-data-adapter": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/js-data-adapter/-/js-data-adapter-1.0.0.tgz", + "integrity": "sha512-UsDk1Iz2R0JCzdHIIp2PdQurfG/6/V7o5nBS/GpDWZcHWkbSoX/zS8RCuaQ1Chq/fZIyOsRTU2u1lJGbnBbuGQ==", + "requires": { + "chai": "4.1.1", + "js-data": "3.0.0", + "mocha": "3.5.0", + "sinon": "2.4.1" + }, + "dependencies": { + "sinon": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/sinon/-/sinon-2.4.1.tgz", + "integrity": "sha512-vFTrO9Wt0ECffDYIPSP/E5bBugt0UjcBQOfQUMh66xzkyPEnhl/vM2LRZi2ajuTdkH07sA6DzrM6KvdvGIH8xw==", + "requires": { + "diff": "3.2.0", + "formatio": "1.2.0", + "lolex": "1.6.0", + "native-promise-only": "0.8.1", + "path-to-regexp": "1.7.0", + "samsam": "1.2.1", + "text-encoding": "0.6.4", + "type-detect": "4.0.3" + } + } + } + }, + "js-data-repo-tools": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/js-data-repo-tools/-/js-data-repo-tools-1.0.0.tgz", + "integrity": "sha1-DFeDHSiNk+HTIMk54gSdV+nlSVE=", + "dev": true, + "requires": { + "babel-eslint": "7.1.1", + "commander": "2.9.0", + "lodash": "4.17.4", + "npm-check-updates": "2.8.9", + "standard": "8.6.0" + }, + "dependencies": { + "babel-eslint": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/babel-eslint/-/babel-eslint-7.1.1.tgz", + "integrity": "sha1-imqITwhapwYK9pz8dzQcL5k3D7I=", + "dev": true, + "requires": { + "babel-code-frame": "6.26.0", + "babel-traverse": "6.26.0", + "babel-types": "6.26.0", + "babylon": "6.18.0", + "lodash.pickby": "4.6.0" + } + }, + "standard": { + "version": "8.6.0", + "resolved": "https://registry.npmjs.org/standard/-/standard-8.6.0.tgz", + "integrity": "sha1-Y1Eyvnv7VnwpIQBfMPnjUOR1Kq0=", + "dev": true, + "requires": { + "eslint": "3.10.2", + "eslint-config-standard": "6.2.1", + "eslint-config-standard-jsx": "3.2.0", + "eslint-plugin-promise": "3.4.2", + "eslint-plugin-react": "6.7.1", + "eslint-plugin-standard": "2.0.1", + "standard-engine": "5.2.0" + } + } + } + }, + "js-tokens": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz", + "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=", + "dev": true + }, + "js-yaml": { + "version": "3.9.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.9.1.tgz", + "integrity": "sha512-CbcG379L1e+mWBnLvHWWeLs8GyV/EMw862uLI3c+GxVyDHWZcjZinwuBd3iW2pgxgIlksW/1vNJa4to+RvDOww==", + "dev": true, + "requires": { + "argparse": "1.0.9", + "esprima": "4.0.0" + } + }, + "js2xmlparser": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/js2xmlparser/-/js2xmlparser-3.0.0.tgz", + "integrity": "sha1-P7YOqgicVED5MZ9RdgzNB+JJlzM=", + "dev": true, + "requires": { + "xmlcreate": "1.0.2" + } + }, + "jsdoc": { + "version": "3.5.4", + "resolved": "https://registry.npmjs.org/jsdoc/-/jsdoc-3.5.4.tgz", + "integrity": "sha512-VmTw0J+2L16IxAe0JSDSAcH0F+DbZxaj8wN1AjHtKMQU/hO0ciIl5ZE93XqrrFIbknobuqHKJCXZj6+Hk57MjA==", + "dev": true, + "requires": { + "babylon": "7.0.0-beta.19", + "bluebird": "3.5.0", + "catharsis": "0.8.9", + "escape-string-regexp": "1.0.5", + "js2xmlparser": "3.0.0", + "klaw": "2.0.0", + "marked": "0.3.6", + "mkdirp": "0.5.1", + "requizzle": "0.2.1", + "strip-json-comments": "2.0.1", + "taffydb": "2.6.2", + "underscore": "1.8.3" + }, + "dependencies": { + "babylon": { + "version": "7.0.0-beta.19", + "resolved": "https://registry.npmjs.org/babylon/-/babylon-7.0.0-beta.19.tgz", + "integrity": "sha512-Vg0C9s/REX6/WIXN37UKpv5ZhRi6A4pjHlpkE34+8/a6c2W1Q692n3hmc+SZG5lKRnaExLUbxtJ1SVT+KaCQ/A==", + "dev": true + } + } + }, + "jsesc": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-1.3.0.tgz", + "integrity": "sha1-RsP+yMGJKxKwgz25vHYiF226s0s=", + "dev": true + }, + "json-parse-helpfulerror": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/json-parse-helpfulerror/-/json-parse-helpfulerror-1.0.3.tgz", + "integrity": "sha1-E/FM4C7tTpgSl7ZOueO5MuLdE9w=", + "dev": true, + "requires": { + "jju": "1.3.0" + } + }, + "json-stable-stringify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz", + "integrity": "sha1-mnWdOcXy/1A/1TAGRu1EX4jE+a8=", + "dev": true, + "requires": { + "jsonify": "0.0.0" + } + }, + "json3": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/json3/-/json3-3.3.2.tgz", + "integrity": "sha1-PAQ0dD35Pi9cQq7nsZvLSDV19OE=" + }, + "json5": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-0.5.1.tgz", + "integrity": "sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE=", + "dev": true + }, + "jsonify": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.0.tgz", + "integrity": "sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM=", + "dev": true + }, + "jsonpointer": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/jsonpointer/-/jsonpointer-4.0.1.tgz", + "integrity": "sha1-T9kss04OnbPInIYi7PUfm5eMbLk=", + "dev": true + }, + "jsx-ast-utils": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-1.4.1.tgz", + "integrity": "sha1-OGchPo3Xm/Ho8jAMDPwe+xgsDfE=", + "dev": true + }, + "just-extend": { + "version": "1.1.22", + "resolved": "https://registry.npmjs.org/just-extend/-/just-extend-1.1.22.tgz", + "integrity": "sha1-MzCvdWyralQnAMZLLk5KoGLVL/8=", + "dev": true + }, + "klaw": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/klaw/-/klaw-2.0.0.tgz", + "integrity": "sha1-WcEo4Nxc5BAgEVEZTuucv4WGUPY=", + "dev": true, + "requires": { + "graceful-fs": "4.1.11" + } + }, + "latest-version": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/latest-version/-/latest-version-2.0.0.tgz", + "integrity": "sha1-VvjWE5YghHuAF/jx9NeOIRMkFos=", + "dev": true, + "requires": { + "package-json": "2.4.0" + } + }, + "lazy-req": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/lazy-req/-/lazy-req-1.1.0.tgz", + "integrity": "sha1-va6+rTD42CQDnODOFJ1Nqge6H6w=", + "dev": true + }, + "levn": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", + "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", + "dev": true, + "requires": { + "prelude-ls": "1.1.2", + "type-check": "0.3.2" + } + }, + "load-json-file": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-2.0.0.tgz", + "integrity": "sha1-eUfkIUmvgNaWy/eXvKq8/h/inKg=", + "dev": true, + "requires": { + "graceful-fs": "4.1.11", + "parse-json": "2.2.0", + "pify": "2.3.0", + "strip-bom": "3.0.0" + } + }, + "locate-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", + "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", + "dev": true, + "requires": { + "p-locate": "2.0.0", + "path-exists": "3.0.0" + }, + "dependencies": { + "path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", + "dev": true + } + } + }, + "lodash": { + "version": "4.17.4", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.4.tgz", + "integrity": "sha1-eCA6TRwyiuHYbcpkYONptX9AVa4=", + "dev": true + }, + "lodash._baseassign": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/lodash._baseassign/-/lodash._baseassign-3.2.0.tgz", + "integrity": "sha1-jDigmVAPIVrQnlnxci/QxSv+Ck4=", + "requires": { + "lodash._basecopy": "3.0.1", + "lodash.keys": "3.1.2" + } + }, + "lodash._basecopy": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/lodash._basecopy/-/lodash._basecopy-3.0.1.tgz", + "integrity": "sha1-jaDmqHbPNEwK2KVIghEd08XHyjY=" + }, + "lodash._basecreate": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/lodash._basecreate/-/lodash._basecreate-3.0.3.tgz", + "integrity": "sha1-G8ZhYU2qf8MRt9A78WgGoCE8+CE=" + }, + "lodash._getnative": { + "version": "3.9.1", + "resolved": "https://registry.npmjs.org/lodash._getnative/-/lodash._getnative-3.9.1.tgz", + "integrity": "sha1-VwvH3t5G1hzc3mh9ZdPuy6o6r/U=" + }, + "lodash._isiterateecall": { + "version": "3.0.9", + "resolved": "https://registry.npmjs.org/lodash._isiterateecall/-/lodash._isiterateecall-3.0.9.tgz", + "integrity": "sha1-UgOte6Ql+uhCRg5pbbnPPmqsBXw=" + }, + "lodash.cond": { + "version": "4.5.2", + "resolved": "https://registry.npmjs.org/lodash.cond/-/lodash.cond-4.5.2.tgz", + "integrity": "sha1-9HGh2khr5g9quVXRcRVSPdHSVdU=", + "dev": true + }, + "lodash.create": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/lodash.create/-/lodash.create-3.1.1.tgz", + "integrity": "sha1-1/KEnw29p+BGgruM1yqwIkYd6+c=", + "requires": { + "lodash._baseassign": "3.2.0", + "lodash._basecreate": "3.0.3", + "lodash._isiterateecall": "3.0.9" + } + }, + "lodash.isarguments": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz", + "integrity": "sha1-L1c9hcaiQon/AGY7SRwdM4/zRYo=" + }, + "lodash.isarray": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/lodash.isarray/-/lodash.isarray-3.0.4.tgz", + "integrity": "sha1-eeTriMNqgSKvhvhEqpvNhRtfu1U=" + }, + "lodash.keys": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/lodash.keys/-/lodash.keys-3.1.2.tgz", + "integrity": "sha1-TbwEcrFWvlCgsoaFXRvQsMZWCYo=", + "requires": { + "lodash._getnative": "3.9.1", + "lodash.isarguments": "3.1.0", + "lodash.isarray": "3.0.4" + } + }, + "lodash.pickby": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/lodash.pickby/-/lodash.pickby-4.6.0.tgz", + "integrity": "sha1-feoh2MGNdwOifHBMFdO4SmfjOv8=", + "dev": true + }, + "lodash.snakecase": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/lodash.snakecase/-/lodash.snakecase-4.1.1.tgz", + "integrity": "sha1-OdcUo1NXFHg3rv1ktdy7Fr7Nj40=" + }, + "lolex": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/lolex/-/lolex-1.6.0.tgz", + "integrity": "sha1-OpoCg0UqR9dDnnJzG54H1zhuSfY=" + }, + "loose-envify": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.3.1.tgz", + "integrity": "sha1-0aitM/qc4OcT1l/dCsi3SNR4yEg=", + "dev": true, + "requires": { + "js-tokens": "3.0.2" + } + }, + "lowercase-keys": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.0.tgz", + "integrity": "sha1-TjNms55/VFfjXxMkvfb4jQv8cwY=", + "dev": true + }, + "marked": { + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/marked/-/marked-0.3.6.tgz", + "integrity": "sha1-ssbGGPzOzk74bE/Gy4p8v1rtqNc=", + "dev": true + }, + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "requires": { + "brace-expansion": "1.1.8" + } + }, + "minimist": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", + "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=" + }, + "mkdirp": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", + "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", + "requires": { + "minimist": "0.0.8" + } + }, + "mocha": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/mocha/-/mocha-3.5.0.tgz", + "integrity": "sha512-pIU2PJjrPYvYRqVpjXzj76qltO9uBYI7woYAMoxbSefsa+vqAfptjoeevd6bUgwD0mPIO+hv9f7ltvsNreL2PA==", + "requires": { + "browser-stdout": "1.3.0", + "commander": "2.9.0", + "debug": "2.6.8", + "diff": "3.2.0", + "escape-string-regexp": "1.0.5", + "glob": "7.1.1", + "growl": "1.9.2", + "json3": "3.3.2", + "lodash.create": "3.1.1", + "mkdirp": "0.5.1", + "supports-color": "3.1.2" + } + }, + "moment": { + "version": "2.18.1", + "resolved": "https://registry.npmjs.org/moment/-/moment-2.18.1.tgz", + "integrity": "sha1-w2GT3Tzhwu7SrbfIAtu8d6gbHA8=", + "dev": true + }, + "mongodb": { + "version": "2.2.31", + "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-2.2.31.tgz", + "integrity": "sha1-GUBEXGYeGSF7s7+CRdmFSq71SNs=", + "requires": { + "es6-promise": "3.2.1", + "mongodb-core": "2.1.15", + "readable-stream": "2.2.7" + } + }, + "mongodb-core": { + "version": "2.1.15", + "resolved": "https://registry.npmjs.org/mongodb-core/-/mongodb-core-2.1.15.tgz", + "integrity": "sha1-hB9TuH//9MdFgYnDXIroJ+EWl2Q=", + "requires": { + "bson": "1.0.4", + "require_optional": "1.0.1" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + }, + "mute-stream": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.5.tgz", + "integrity": "sha1-j7+rsKmKJT0xhDMfno3rc3L6xsA=", + "dev": true + }, + "native-promise-only": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/native-promise-only/-/native-promise-only-0.8.1.tgz", + "integrity": "sha1-IKMYwwy0X3H+et+/eyHJnBRy7xE=" + }, + "natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", + "dev": true + }, + "nise": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/nise/-/nise-1.0.1.tgz", + "integrity": "sha1-DakrEKhU6XwPSW9sKEWjASgLPu8=", + "dev": true, + "requires": { + "formatio": "1.2.0", + "just-extend": "1.1.22", + "lolex": "1.6.0", + "path-to-regexp": "1.7.0" + } + }, + "node-alias": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/node-alias/-/node-alias-1.0.4.tgz", + "integrity": "sha1-HxuRa1a56iQcATX5fO1pQPVW8pI=", + "dev": true, + "requires": { + "chalk": "1.1.3", + "lodash": "4.17.4" + } + }, + "node-status-codes": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/node-status-codes/-/node-status-codes-1.0.0.tgz", + "integrity": "sha1-WuVUHQJGRdMqWPzdyc7s6nrjrC8=", + "dev": true + }, + "npm": { + "version": "3.10.10", + "resolved": "https://registry.npmjs.org/npm/-/npm-3.10.10.tgz", + "integrity": "sha1-Wx1XfkyIadbIYDvInpzRY3MD5G4=", + "dev": true, + "requires": { + "abbrev": "1.0.9", + "ansi-regex": "2.0.0", + "ansicolors": "0.3.2", + "ansistyles": "0.1.3", + "aproba": "1.0.4", + "archy": "1.0.0", + "asap": "2.0.5", + "chownr": "1.0.1", + "cmd-shim": "2.0.2", + "columnify": "1.5.4", + "config-chain": "1.1.11", + "debuglog": "1.0.1", + "dezalgo": "1.0.3", + "editor": "1.0.0", + "fs-vacuum": "1.2.9", + "fs-write-stream-atomic": "1.0.8", + "fstream": "1.0.10", + "fstream-npm": "1.2.0", + "glob": "7.1.0", + "graceful-fs": "4.1.9", + "has-unicode": "2.0.1", + "hosted-git-info": "2.1.5", + "iferr": "0.1.5", + "imurmurhash": "0.1.4", + "inflight": "1.0.5", + "inherits": "2.0.3", + "ini": "1.3.4", + "init-package-json": "1.9.4", + "lockfile": "1.0.2", + "lodash._baseindexof": "3.1.0", + "lodash._baseuniq": "4.6.0", + "lodash._bindcallback": "3.0.1", + "lodash._cacheindexof": "3.0.2", + "lodash._createcache": "3.1.2", + "lodash._getnative": "3.9.1", + "lodash.clonedeep": "4.5.0", + "lodash.restparam": "3.6.1", + "lodash.union": "4.6.0", + "lodash.uniq": "4.5.0", + "lodash.without": "4.4.0", + "mkdirp": "0.5.1", + "node-gyp": "3.4.0", + "nopt": "3.0.6", + "normalize-git-url": "3.0.2", + "normalize-package-data": "2.3.5", + "npm-cache-filename": "1.0.2", + "npm-install-checks": "3.0.0", + "npm-package-arg": "4.2.0", + "npm-registry-client": "7.2.1", + "npm-user-validate": "0.1.5", + "npmlog": "4.0.0", + "once": "1.4.0", + "opener": "1.4.2", + "osenv": "0.1.3", + "path-is-inside": "1.0.2", + "read": "1.0.7", + "read-cmd-shim": "1.0.1", + "read-installed": "4.0.3", + "read-package-json": "2.0.4", + "read-package-tree": "5.1.5", + "readable-stream": "2.1.5", + "readdir-scoped-modules": "1.0.2", + "realize-package-specifier": "3.0.3", + "request": "2.75.0", + "retry": "0.10.0", + "rimraf": "2.5.4", + "semver": "5.3.0", + "sha": "2.0.1", + "slide": "1.1.6", + "sorted-object": "2.0.1", + "strip-ansi": "3.0.1", + "tar": "2.2.1", + "text-table": "0.2.0", + "uid-number": "0.0.6", + "umask": "1.1.0", + "unique-filename": "1.1.0", + "unpipe": "1.0.0", + "validate-npm-package-license": "3.0.1", + "validate-npm-package-name": "2.2.2", + "which": "1.2.11", + "wrappy": "1.0.2", + "write-file-atomic": "1.2.0" + }, + "dependencies": { + "abbrev": { + "version": "1.0.9", + "bundled": true, + "dev": true + }, + "ansi-regex": { + "version": "2.0.0", + "bundled": true, + "dev": true + }, + "ansicolors": { + "version": "0.3.2", + "bundled": true, + "dev": true + }, + "ansistyles": { + "version": "0.1.3", + "bundled": true, + "dev": true + }, + "aproba": { + "version": "1.0.4", + "bundled": true, + "dev": true + }, + "archy": { + "version": "1.0.0", + "bundled": true, + "dev": true + }, + "asap": { + "version": "2.0.5", + "bundled": true, + "dev": true + }, + "chownr": { + "version": "1.0.1", + "bundled": true, + "dev": true + }, + "cmd-shim": { + "version": "2.0.2", + "bundled": true, + "dev": true, + "requires": { + "graceful-fs": "4.1.9", + "mkdirp": "0.5.1" + } + }, + "columnify": { + "version": "1.5.4", + "bundled": true, + "dev": true, + "requires": { + "strip-ansi": "3.0.1", + "wcwidth": "1.0.0" + }, + "dependencies": { + "wcwidth": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "requires": { + "defaults": "1.0.3" + }, + "dependencies": { + "defaults": { + "version": "1.0.3", + "bundled": true, + "dev": true, + "requires": { + "clone": "1.0.2" + }, + "dependencies": { + "clone": { + "version": "1.0.2", + "bundled": true, + "dev": true + } + } + } + } + } + } + }, + "config-chain": { + "version": "1.1.11", + "bundled": true, + "dev": true, + "requires": { + "ini": "1.3.4", + "proto-list": "1.2.4" + }, + "dependencies": { + "proto-list": { + "version": "1.2.4", + "bundled": true, + "dev": true + } + } + }, + "debuglog": { + "version": "1.0.1", + "bundled": true, + "dev": true + }, + "dezalgo": { + "version": "1.0.3", + "bundled": true, + "dev": true, + "requires": { + "asap": "2.0.5", + "wrappy": "1.0.2" + } + }, + "editor": { + "version": "1.0.0", + "bundled": true, + "dev": true + }, + "fs-vacuum": { + "version": "1.2.9", + "bundled": true, + "dev": true, + "requires": { + "graceful-fs": "4.1.9", + "path-is-inside": "1.0.2", + "rimraf": "2.5.4" + } + }, + "fs-write-stream-atomic": { + "version": "1.0.8", + "bundled": true, + "dev": true, + "requires": { + "graceful-fs": "4.1.9", + "iferr": "0.1.5", + "imurmurhash": "0.1.4", + "readable-stream": "2.1.5" + } + }, + "fstream": { + "version": "1.0.10", + "bundled": true, + "dev": true, + "requires": { + "graceful-fs": "4.1.9", + "inherits": "2.0.3", + "mkdirp": "0.5.1", + "rimraf": "2.5.4" + } + }, + "fstream-npm": { + "version": "1.2.0", + "bundled": true, + "dev": true, + "requires": { + "fstream-ignore": "1.0.5", + "inherits": "2.0.3" + }, + "dependencies": { + "fstream-ignore": { + "version": "1.0.5", + "bundled": true, + "dev": true, + "requires": { + "fstream": "1.0.10", + "inherits": "2.0.3", + "minimatch": "3.0.3" + }, + "dependencies": { + "minimatch": { + "version": "3.0.3", + "bundled": true, + "dev": true, + "requires": { + "brace-expansion": "1.1.6" + }, + "dependencies": { + "brace-expansion": { + "version": "1.1.6", + "bundled": true, + "dev": true, + "requires": { + "balanced-match": "0.4.2", + "concat-map": "0.0.1" + }, + "dependencies": { + "balanced-match": { + "version": "0.4.2", + "bundled": true, + "dev": true + }, + "concat-map": { + "version": "0.0.1", + "bundled": true, + "dev": true + } + } + } + } + } + } + } + } + }, + "glob": { + "version": "7.1.0", + "bundled": true, + "dev": true, + "requires": { + "fs.realpath": "1.0.0", + "inflight": "1.0.5", + "inherits": "2.0.3", + "minimatch": "3.0.3", + "once": "1.4.0", + "path-is-absolute": "1.0.1" + }, + "dependencies": { + "fs.realpath": { + "version": "1.0.0", + "bundled": true, + "dev": true + }, + "minimatch": { + "version": "3.0.3", + "bundled": true, + "dev": true, + "requires": { + "brace-expansion": "1.1.6" + }, + "dependencies": { + "brace-expansion": { + "version": "1.1.6", + "bundled": true, + "dev": true, + "requires": { + "balanced-match": "0.4.2", + "concat-map": "0.0.1" + }, + "dependencies": { + "balanced-match": { + "version": "0.4.2", + "bundled": true, + "dev": true + }, + "concat-map": { + "version": "0.0.1", + "bundled": true, + "dev": true + } + } + } + } + }, + "path-is-absolute": { + "version": "1.0.1", + "bundled": true, + "dev": true + } + } + }, + "graceful-fs": { + "version": "4.1.9", + "bundled": true, + "dev": true + }, + "has-unicode": { + "version": "2.0.1", + "bundled": true, + "dev": true + }, + "hosted-git-info": { + "version": "2.1.5", + "bundled": true, + "dev": true + }, + "iferr": { + "version": "0.1.5", + "bundled": true, + "dev": true + }, + "imurmurhash": { + "version": "0.1.4", + "bundled": true, + "dev": true + }, + "inflight": { + "version": "1.0.5", + "bundled": true, + "dev": true, + "requires": { + "once": "1.4.0", + "wrappy": "1.0.2" + } + }, + "inherits": { + "version": "2.0.3", + "bundled": true, + "dev": true + }, + "ini": { + "version": "1.3.4", + "bundled": true, + "dev": true + }, + "init-package-json": { + "version": "1.9.4", + "bundled": true, + "dev": true, + "requires": { + "glob": "6.0.4", + "npm-package-arg": "4.2.0", + "promzard": "0.3.0", + "read": "1.0.7", + "read-package-json": "2.0.4", + "semver": "5.3.0", + "validate-npm-package-license": "3.0.1", + "validate-npm-package-name": "2.2.2" + }, + "dependencies": { + "glob": { + "version": "6.0.4", + "bundled": true, + "dev": true, + "requires": { + "inflight": "1.0.5", + "inherits": "2.0.3", + "minimatch": "3.0.3", + "once": "1.4.0", + "path-is-absolute": "1.0.0" + }, + "dependencies": { + "minimatch": { + "version": "3.0.3", + "bundled": true, + "dev": true, + "requires": { + "brace-expansion": "1.1.6" + }, + "dependencies": { + "brace-expansion": { + "version": "1.1.6", + "bundled": true, + "dev": true, + "requires": { + "balanced-match": "0.4.2", + "concat-map": "0.0.1" + }, + "dependencies": { + "balanced-match": { + "version": "0.4.2", + "bundled": true, + "dev": true + }, + "concat-map": { + "version": "0.0.1", + "bundled": true, + "dev": true + } + } + } + } + }, + "path-is-absolute": { + "version": "1.0.0", + "bundled": true, + "dev": true + } + } + }, + "promzard": { + "version": "0.3.0", + "bundled": true, + "dev": true, + "requires": { + "read": "1.0.7" + } + } + } + }, + "lockfile": { + "version": "1.0.2", + "bundled": true, + "dev": true + }, + "lodash._baseindexof": { + "version": "3.1.0", + "bundled": true, + "dev": true + }, + "lodash._baseuniq": { + "version": "4.6.0", + "bundled": true, + "dev": true, + "requires": { + "lodash._createset": "4.0.3", + "lodash._root": "3.0.1" + }, + "dependencies": { + "lodash._createset": { + "version": "4.0.3", + "bundled": true, + "dev": true + }, + "lodash._root": { + "version": "3.0.1", + "bundled": true, + "dev": true + } + } + }, + "lodash._bindcallback": { + "version": "3.0.1", + "bundled": true, + "dev": true + }, + "lodash._cacheindexof": { + "version": "3.0.2", + "bundled": true, + "dev": true + }, + "lodash._createcache": { + "version": "3.1.2", + "bundled": true, + "dev": true, + "requires": { + "lodash._getnative": "3.9.1" + } + }, + "lodash._getnative": { + "version": "3.9.1", + "bundled": true, + "dev": true + }, + "lodash.clonedeep": { + "version": "4.5.0", + "bundled": true, + "dev": true + }, + "lodash.restparam": { + "version": "3.6.1", + "bundled": true, + "dev": true + }, + "lodash.union": { + "version": "4.6.0", + "bundled": true, + "dev": true + }, + "lodash.uniq": { + "version": "4.5.0", + "bundled": true, + "dev": true + }, + "lodash.without": { + "version": "4.4.0", + "bundled": true, + "dev": true + }, + "mkdirp": { + "version": "0.5.1", + "bundled": true, + "dev": true, + "requires": { + "minimist": "0.0.8" + }, + "dependencies": { + "minimist": { + "version": "0.0.8", + "bundled": true, + "dev": true + } + } + }, + "node-gyp": { + "version": "3.4.0", + "bundled": true, + "dev": true, + "requires": { + "fstream": "1.0.10", + "glob": "7.1.0", + "graceful-fs": "4.1.9", + "minimatch": "3.0.3", + "mkdirp": "0.5.1", + "nopt": "3.0.6", + "npmlog": "3.1.2", + "osenv": "0.1.3", + "path-array": "1.0.1", + "request": "2.75.0", + "rimraf": "2.5.4", + "semver": "5.3.0", + "tar": "2.2.1", + "which": "1.2.11" + }, + "dependencies": { + "minimatch": { + "version": "3.0.3", + "bundled": true, + "dev": true, + "requires": { + "brace-expansion": "1.1.6" + }, + "dependencies": { + "brace-expansion": { + "version": "1.1.6", + "bundled": true, + "dev": true, + "requires": { + "balanced-match": "0.4.2", + "concat-map": "0.0.1" + }, + "dependencies": { + "balanced-match": { + "version": "0.4.2", + "bundled": true, + "dev": true + }, + "concat-map": { + "version": "0.0.1", + "bundled": true, + "dev": true + } + } + } + } + }, + "npmlog": { + "version": "3.1.2", + "bundled": true, + "dev": true, + "requires": { + "are-we-there-yet": "1.1.2", + "console-control-strings": "1.1.0", + "gauge": "2.6.0", + "set-blocking": "2.0.0" + }, + "dependencies": { + "are-we-there-yet": { + "version": "1.1.2", + "bundled": true, + "dev": true, + "requires": { + "delegates": "1.0.0", + "readable-stream": "2.1.5" + }, + "dependencies": { + "delegates": { + "version": "1.0.0", + "bundled": true, + "dev": true + } + } + }, + "console-control-strings": { + "version": "1.1.0", + "bundled": true, + "dev": true + }, + "gauge": { + "version": "2.6.0", + "bundled": true, + "dev": true, + "requires": { + "aproba": "1.0.4", + "console-control-strings": "1.1.0", + "has-color": "0.1.7", + "has-unicode": "2.0.1", + "object-assign": "4.1.0", + "signal-exit": "3.0.0", + "string-width": "1.0.2", + "strip-ansi": "3.0.1", + "wide-align": "1.1.0" + }, + "dependencies": { + "has-color": { + "version": "0.1.7", + "bundled": true, + "dev": true + }, + "object-assign": { + "version": "4.1.0", + "bundled": true, + "dev": true + }, + "signal-exit": { + "version": "3.0.0", + "bundled": true, + "dev": true + }, + "string-width": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "requires": { + "code-point-at": "1.0.0", + "is-fullwidth-code-point": "1.0.0", + "strip-ansi": "3.0.1" + }, + "dependencies": { + "code-point-at": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "requires": { + "number-is-nan": "1.0.0" + }, + "dependencies": { + "number-is-nan": { + "version": "1.0.0", + "bundled": true, + "dev": true + } + } + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "requires": { + "number-is-nan": "1.0.0" + }, + "dependencies": { + "number-is-nan": { + "version": "1.0.0", + "bundled": true, + "dev": true + } + } + } + } + }, + "wide-align": { + "version": "1.1.0", + "bundled": true, + "dev": true, + "requires": { + "string-width": "1.0.2" + } + } + } + }, + "set-blocking": { + "version": "2.0.0", + "bundled": true, + "dev": true + } + } + }, + "path-array": { + "version": "1.0.1", + "bundled": true, + "dev": true, + "requires": { + "array-index": "1.0.0" + }, + "dependencies": { + "array-index": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "requires": { + "debug": "2.2.0", + "es6-symbol": "3.1.0" + }, + "dependencies": { + "debug": { + "version": "2.2.0", + "bundled": true, + "dev": true, + "requires": { + "ms": "0.7.1" + }, + "dependencies": { + "ms": { + "version": "0.7.1", + "bundled": true, + "dev": true + } + } + }, + "es6-symbol": { + "version": "3.1.0", + "bundled": true, + "dev": true, + "requires": { + "d": "0.1.1", + "es5-ext": "0.10.12" + }, + "dependencies": { + "d": { + "version": "0.1.1", + "bundled": true, + "dev": true, + "requires": { + "es5-ext": "0.10.12" + } + }, + "es5-ext": { + "version": "0.10.12", + "bundled": true, + "dev": true, + "requires": { + "es6-iterator": "2.0.0", + "es6-symbol": "3.1.0" + }, + "dependencies": { + "es6-iterator": { + "version": "2.0.0", + "bundled": true, + "dev": true, + "requires": { + "d": "0.1.1", + "es5-ext": "0.10.12", + "es6-symbol": "3.1.0" + } + } + } + } + } + } + } + } + } + } + } + }, + "nopt": { + "version": "3.0.6", + "bundled": true, + "dev": true, + "requires": { + "abbrev": "1.0.9" + } + }, + "normalize-git-url": { + "version": "3.0.2", + "bundled": true, + "dev": true + }, + "normalize-package-data": { + "version": "2.3.5", + "bundled": true, + "dev": true, + "requires": { + "hosted-git-info": "2.1.5", + "is-builtin-module": "1.0.0", + "semver": "5.3.0", + "validate-npm-package-license": "3.0.1" + }, + "dependencies": { + "is-builtin-module": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "requires": { + "builtin-modules": "1.1.1" + }, + "dependencies": { + "builtin-modules": { + "version": "1.1.1", + "bundled": true, + "dev": true + } + } + } + } + }, + "npm-cache-filename": { + "version": "1.0.2", + "bundled": true, + "dev": true + }, + "npm-install-checks": { + "version": "3.0.0", + "bundled": true, + "dev": true, + "requires": { + "semver": "5.3.0" + } + }, + "npm-package-arg": { + "version": "4.2.0", + "bundled": true, + "dev": true, + "requires": { + "hosted-git-info": "2.1.5", + "semver": "5.3.0" + } + }, + "npm-registry-client": { + "version": "7.2.1", + "bundled": true, + "dev": true, + "requires": { + "concat-stream": "1.5.2", + "graceful-fs": "4.1.9", + "normalize-package-data": "2.3.5", + "npm-package-arg": "4.2.0", + "npmlog": "3.1.2", + "once": "1.4.0", + "request": "2.75.0", + "retry": "0.10.0", + "semver": "5.3.0", + "slide": "1.1.6" + }, + "dependencies": { + "concat-stream": { + "version": "1.5.2", + "bundled": true, + "dev": true, + "requires": { + "inherits": "2.0.3", + "readable-stream": "2.0.6", + "typedarray": "0.0.6" + }, + "dependencies": { + "readable-stream": { + "version": "2.0.6", + "bundled": true, + "dev": true, + "requires": { + "core-util-is": "1.0.2", + "inherits": "2.0.3", + "isarray": "1.0.0", + "process-nextick-args": "1.0.7", + "string_decoder": "0.10.31", + "util-deprecate": "1.0.2" + }, + "dependencies": { + "core-util-is": { + "version": "1.0.2", + "bundled": true, + "dev": true + }, + "isarray": { + "version": "1.0.0", + "bundled": true, + "dev": true + }, + "process-nextick-args": { + "version": "1.0.7", + "bundled": true, + "dev": true + }, + "string_decoder": { + "version": "0.10.31", + "bundled": true, + "dev": true + }, + "util-deprecate": { + "version": "1.0.2", + "bundled": true, + "dev": true + } + } + }, + "typedarray": { + "version": "0.0.6", + "bundled": true, + "dev": true + } + } + }, + "npmlog": { + "version": "3.1.2", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "are-we-there-yet": "1.1.2", + "console-control-strings": "1.1.0", + "gauge": "2.6.0", + "set-blocking": "2.0.0" + }, + "dependencies": { + "are-we-there-yet": { + "version": "1.1.2", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "delegates": "1.0.0", + "readable-stream": "2.1.5" + }, + "dependencies": { + "delegates": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true + } + } + }, + "console-control-strings": { + "version": "1.1.0", + "bundled": true, + "dev": true + }, + "gauge": { + "version": "2.6.0", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "aproba": "1.0.4", + "console-control-strings": "1.1.0", + "has-color": "0.1.7", + "has-unicode": "2.0.1", + "object-assign": "4.1.0", + "signal-exit": "3.0.0", + "string-width": "1.0.2", + "strip-ansi": "3.0.1", + "wide-align": "1.1.0" + }, + "dependencies": { + "has-color": { + "version": "0.1.7", + "bundled": true, + "dev": true, + "optional": true + }, + "object-assign": { + "version": "4.1.0", + "bundled": true, + "dev": true, + "optional": true + }, + "signal-exit": { + "version": "3.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "string-width": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "requires": { + "code-point-at": "1.0.0", + "is-fullwidth-code-point": "1.0.0", + "strip-ansi": "3.0.1" + }, + "dependencies": { + "code-point-at": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "requires": { + "number-is-nan": "1.0.0" + }, + "dependencies": { + "number-is-nan": { + "version": "1.0.0", + "bundled": true, + "dev": true + } + } + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "requires": { + "number-is-nan": "1.0.0" + }, + "dependencies": { + "number-is-nan": { + "version": "1.0.0", + "bundled": true, + "dev": true + } + } + } + } + }, + "wide-align": { + "version": "1.1.0", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "string-width": "1.0.2" + } + } + } + }, + "set-blocking": { + "version": "2.0.0", + "bundled": true, + "dev": true, + "optional": true + } + } + }, + "retry": { + "version": "0.10.0", + "bundled": true, + "dev": true + } + } + }, + "npm-user-validate": { + "version": "0.1.5", + "bundled": true, + "dev": true + }, + "npmlog": { + "version": "4.0.0", + "bundled": true, + "dev": true, + "requires": { + "are-we-there-yet": "1.1.2", + "console-control-strings": "1.1.0", + "gauge": "2.6.0", + "set-blocking": "2.0.0" + }, + "dependencies": { + "are-we-there-yet": { + "version": "1.1.2", + "bundled": true, + "dev": true, + "requires": { + "delegates": "1.0.0", + "readable-stream": "2.1.5" + }, + "dependencies": { + "delegates": { + "version": "1.0.0", + "bundled": true, + "dev": true + } + } + }, + "console-control-strings": { + "version": "1.1.0", + "bundled": true, + "dev": true + }, + "gauge": { + "version": "2.6.0", + "bundled": true, + "dev": true, + "requires": { + "aproba": "1.0.4", + "console-control-strings": "1.1.0", + "has-color": "0.1.7", + "has-unicode": "2.0.1", + "object-assign": "4.1.0", + "signal-exit": "3.0.0", + "string-width": "1.0.2", + "strip-ansi": "3.0.1", + "wide-align": "1.1.0" + }, + "dependencies": { + "has-color": { + "version": "0.1.7", + "bundled": true, + "dev": true + }, + "object-assign": { + "version": "4.1.0", + "bundled": true, + "dev": true + }, + "signal-exit": { + "version": "3.0.0", + "bundled": true, + "dev": true + }, + "string-width": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "requires": { + "code-point-at": "1.0.0", + "is-fullwidth-code-point": "1.0.0", + "strip-ansi": "3.0.1" + }, + "dependencies": { + "code-point-at": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "requires": { + "number-is-nan": "1.0.0" + }, + "dependencies": { + "number-is-nan": { + "version": "1.0.0", + "bundled": true, + "dev": true + } + } + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "requires": { + "number-is-nan": "1.0.0" + }, + "dependencies": { + "number-is-nan": { + "version": "1.0.0", + "bundled": true, + "dev": true + } + } + } + } + }, + "wide-align": { + "version": "1.1.0", + "bundled": true, + "dev": true, + "requires": { + "string-width": "1.0.2" + } + } + } + }, + "set-blocking": { + "version": "2.0.0", + "bundled": true, + "dev": true + } + } + }, + "once": { + "version": "1.4.0", + "bundled": true, + "dev": true, + "requires": { + "wrappy": "1.0.2" + } + }, + "opener": { + "version": "1.4.2", + "bundled": true, + "dev": true + }, + "osenv": { + "version": "0.1.3", + "bundled": true, + "dev": true, + "requires": { + "os-homedir": "1.0.1", + "os-tmpdir": "1.0.1" + }, + "dependencies": { + "os-homedir": { + "version": "1.0.1", + "bundled": true, + "dev": true + }, + "os-tmpdir": { + "version": "1.0.1", + "bundled": true, + "dev": true + } + } + }, + "path-is-inside": { + "version": "1.0.2", + "bundled": true, + "dev": true + }, + "read": { + "version": "1.0.7", + "bundled": true, + "dev": true, + "requires": { + "mute-stream": "0.0.5" + }, + "dependencies": { + "mute-stream": { + "version": "0.0.5", + "bundled": true, + "dev": true + } + } + }, + "read-cmd-shim": { + "version": "1.0.1", + "bundled": true, + "dev": true, + "requires": { + "graceful-fs": "4.1.9" + } + }, + "read-installed": { + "version": "4.0.3", + "bundled": true, + "dev": true, + "requires": { + "debuglog": "1.0.1", + "graceful-fs": "4.1.9", + "read-package-json": "2.0.4", + "readdir-scoped-modules": "1.0.2", + "semver": "5.3.0", + "slide": "1.1.6", + "util-extend": "1.0.3" + }, + "dependencies": { + "util-extend": { + "version": "1.0.3", + "bundled": true, + "dev": true + } + } + }, + "read-package-json": { + "version": "2.0.4", + "bundled": true, + "dev": true, + "requires": { + "glob": "6.0.4", + "graceful-fs": "4.1.9", + "json-parse-helpfulerror": "1.0.3", + "normalize-package-data": "2.3.5" + }, + "dependencies": { + "glob": { + "version": "6.0.4", + "bundled": true, + "dev": true, + "requires": { + "inflight": "1.0.5", + "inherits": "2.0.3", + "minimatch": "3.0.3", + "once": "1.4.0", + "path-is-absolute": "1.0.0" + }, + "dependencies": { + "minimatch": { + "version": "3.0.3", + "bundled": true, + "dev": true, + "requires": { + "brace-expansion": "1.1.6" + }, + "dependencies": { + "brace-expansion": { + "version": "1.1.6", + "bundled": true, + "dev": true, + "requires": { + "balanced-match": "0.4.2", + "concat-map": "0.0.1" + }, + "dependencies": { + "balanced-match": { + "version": "0.4.2", + "bundled": true, + "dev": true + }, + "concat-map": { + "version": "0.0.1", + "bundled": true, + "dev": true + } + } + } + } + }, + "path-is-absolute": { + "version": "1.0.0", + "bundled": true, + "dev": true + } + } + }, + "json-parse-helpfulerror": { + "version": "1.0.3", + "bundled": true, + "dev": true, + "requires": { + "jju": "1.3.0" + }, + "dependencies": { + "jju": { + "version": "1.3.0", + "bundled": true, + "dev": true + } + } + } + } + }, + "read-package-tree": { + "version": "5.1.5", + "bundled": true, + "dev": true, + "requires": { + "debuglog": "1.0.1", + "dezalgo": "1.0.3", + "once": "1.4.0", + "read-package-json": "2.0.4", + "readdir-scoped-modules": "1.0.2" + } + }, + "readable-stream": { + "version": "2.1.5", + "bundled": true, + "dev": true, + "requires": { + "buffer-shims": "1.0.0", + "core-util-is": "1.0.2", + "inherits": "2.0.3", + "isarray": "1.0.0", + "process-nextick-args": "1.0.7", + "string_decoder": "0.10.31", + "util-deprecate": "1.0.2" + }, + "dependencies": { + "buffer-shims": { + "version": "1.0.0", + "bundled": true, + "dev": true + }, + "core-util-is": { + "version": "1.0.2", + "bundled": true, + "dev": true + }, + "isarray": { + "version": "1.0.0", + "bundled": true, + "dev": true + }, + "process-nextick-args": { + "version": "1.0.7", + "bundled": true, + "dev": true + }, + "string_decoder": { + "version": "0.10.31", + "bundled": true, + "dev": true + }, + "util-deprecate": { + "version": "1.0.2", + "bundled": true, + "dev": true + } + } + }, + "readdir-scoped-modules": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "requires": { + "debuglog": "1.0.1", + "dezalgo": "1.0.3", + "graceful-fs": "4.1.9", + "once": "1.4.0" + } + }, + "realize-package-specifier": { + "version": "3.0.3", + "bundled": true, + "dev": true, + "requires": { + "dezalgo": "1.0.3", + "npm-package-arg": "4.2.0" + } + }, + "request": { + "version": "2.75.0", + "bundled": true, + "dev": true, + "requires": { + "aws-sign2": "0.6.0", + "aws4": "1.4.1", + "bl": "1.1.2", + "caseless": "0.11.0", + "combined-stream": "1.0.5", + "extend": "3.0.0", + "forever-agent": "0.6.1", + "form-data": "2.0.0", + "har-validator": "2.0.6", + "hawk": "3.1.3", + "http-signature": "1.1.1", + "is-typedarray": "1.0.0", + "isstream": "0.1.2", + "json-stringify-safe": "5.0.1", + "mime-types": "2.1.12", + "node-uuid": "1.4.7", + "oauth-sign": "0.8.2", + "qs": "6.2.1", + "stringstream": "0.0.5", + "tough-cookie": "2.3.1", + "tunnel-agent": "0.4.3" + }, + "dependencies": { + "aws-sign2": { + "version": "0.6.0", + "bundled": true, + "dev": true + }, + "aws4": { + "version": "1.4.1", + "bundled": true, + "dev": true + }, + "bl": { + "version": "1.1.2", + "bundled": true, + "dev": true, + "requires": { + "readable-stream": "2.0.6" + }, + "dependencies": { + "readable-stream": { + "version": "2.0.6", + "bundled": true, + "dev": true, + "requires": { + "core-util-is": "1.0.2", + "inherits": "2.0.3", + "isarray": "1.0.0", + "process-nextick-args": "1.0.7", + "string_decoder": "0.10.31", + "util-deprecate": "1.0.2" + }, + "dependencies": { + "core-util-is": { + "version": "1.0.2", + "bundled": true, + "dev": true + }, + "isarray": { + "version": "1.0.0", + "bundled": true, + "dev": true + }, + "process-nextick-args": { + "version": "1.0.7", + "bundled": true, + "dev": true + }, + "string_decoder": { + "version": "0.10.31", + "bundled": true, + "dev": true + }, + "util-deprecate": { + "version": "1.0.2", + "bundled": true, + "dev": true + } + } + } + } + }, + "caseless": { + "version": "0.11.0", + "bundled": true, + "dev": true + }, + "combined-stream": { + "version": "1.0.5", + "bundled": true, + "dev": true, + "requires": { + "delayed-stream": "1.0.0" + }, + "dependencies": { + "delayed-stream": { + "version": "1.0.0", + "bundled": true, + "dev": true + } + } + }, + "extend": { + "version": "3.0.0", + "bundled": true, + "dev": true + }, + "forever-agent": { + "version": "0.6.1", + "bundled": true, + "dev": true + }, + "form-data": { + "version": "2.0.0", + "bundled": true, + "dev": true, + "requires": { + "asynckit": "0.4.0", + "combined-stream": "1.0.5", + "mime-types": "2.1.12" + }, + "dependencies": { + "asynckit": { + "version": "0.4.0", + "bundled": true, + "dev": true + } + } + }, + "har-validator": { + "version": "2.0.6", + "bundled": true, + "dev": true, + "requires": { + "chalk": "1.1.3", + "commander": "2.9.0", + "is-my-json-valid": "2.15.0", + "pinkie-promise": "2.0.1" + }, + "dependencies": { + "chalk": { + "version": "1.1.3", + "bundled": true, + "dev": true, + "requires": { + "ansi-styles": "2.2.1", + "escape-string-regexp": "1.0.5", + "has-ansi": "2.0.0", + "strip-ansi": "3.0.1", + "supports-color": "2.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "2.2.1", + "bundled": true, + "dev": true + }, + "escape-string-regexp": { + "version": "1.0.5", + "bundled": true, + "dev": true + }, + "has-ansi": { + "version": "2.0.0", + "bundled": true, + "dev": true, + "requires": { + "ansi-regex": "2.0.0" + } + }, + "supports-color": { + "version": "2.0.0", + "bundled": true, + "dev": true + } + } + }, + "commander": { + "version": "2.9.0", + "bundled": true, + "dev": true, + "requires": { + "graceful-readlink": "1.0.1" + }, + "dependencies": { + "graceful-readlink": { + "version": "1.0.1", + "bundled": true, + "dev": true + } + } + }, + "is-my-json-valid": { + "version": "2.15.0", + "bundled": true, + "dev": true, + "requires": { + "generate-function": "2.0.0", + "generate-object-property": "1.2.0", + "jsonpointer": "4.0.0", + "xtend": "4.0.1" + }, + "dependencies": { + "generate-function": { + "version": "2.0.0", + "bundled": true, + "dev": true + }, + "generate-object-property": { + "version": "1.2.0", + "bundled": true, + "dev": true, + "requires": { + "is-property": "1.0.2" + }, + "dependencies": { + "is-property": { + "version": "1.0.2", + "bundled": true, + "dev": true + } + } + }, + "jsonpointer": { + "version": "4.0.0", + "bundled": true, + "dev": true + }, + "xtend": { + "version": "4.0.1", + "bundled": true, + "dev": true + } + } + }, + "pinkie-promise": { + "version": "2.0.1", + "bundled": true, + "dev": true, + "requires": { + "pinkie": "2.0.4" + }, + "dependencies": { + "pinkie": { + "version": "2.0.4", + "bundled": true, + "dev": true + } + } + } + } + }, + "hawk": { + "version": "3.1.3", + "bundled": true, + "dev": true, + "requires": { + "boom": "2.10.1", + "cryptiles": "2.0.5", + "hoek": "2.16.3", + "sntp": "1.0.9" + }, + "dependencies": { + "boom": { + "version": "2.10.1", + "bundled": true, + "dev": true, + "requires": { + "hoek": "2.16.3" + } + }, + "cryptiles": { + "version": "2.0.5", + "bundled": true, + "dev": true, + "requires": { + "boom": "2.10.1" + } + }, + "hoek": { + "version": "2.16.3", + "bundled": true, + "dev": true + }, + "sntp": { + "version": "1.0.9", + "bundled": true, + "dev": true, + "requires": { + "hoek": "2.16.3" + } + } + } + }, + "http-signature": { + "version": "1.1.1", + "bundled": true, + "dev": true, + "requires": { + "assert-plus": "0.2.0", + "jsprim": "1.3.1", + "sshpk": "1.10.1" + }, + "dependencies": { + "assert-plus": { + "version": "0.2.0", + "bundled": true, + "dev": true + }, + "jsprim": { + "version": "1.3.1", + "bundled": true, + "dev": true, + "requires": { + "extsprintf": "1.0.2", + "json-schema": "0.2.3", + "verror": "1.3.6" + }, + "dependencies": { + "extsprintf": { + "version": "1.0.2", + "bundled": true, + "dev": true + }, + "json-schema": { + "version": "0.2.3", + "bundled": true, + "dev": true + }, + "verror": { + "version": "1.3.6", + "bundled": true, + "dev": true, + "requires": { + "extsprintf": "1.0.2" + } + } + } + }, + "sshpk": { + "version": "1.10.1", + "bundled": true, + "dev": true, + "requires": { + "asn1": "0.2.3", + "assert-plus": "1.0.0", + "bcrypt-pbkdf": "1.0.0", + "dashdash": "1.14.0", + "ecc-jsbn": "0.1.1", + "getpass": "0.1.6", + "jodid25519": "1.0.2", + "jsbn": "0.1.0", + "tweetnacl": "0.14.3" + }, + "dependencies": { + "asn1": { + "version": "0.2.3", + "bundled": true, + "dev": true + }, + "assert-plus": { + "version": "1.0.0", + "bundled": true, + "dev": true + }, + "bcrypt-pbkdf": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "tweetnacl": "0.14.3" + } + }, + "dashdash": { + "version": "1.14.0", + "bundled": true, + "dev": true, + "requires": { + "assert-plus": "1.0.0" + } + }, + "ecc-jsbn": { + "version": "0.1.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "jsbn": "0.1.0" + } + }, + "getpass": { + "version": "0.1.6", + "bundled": true, + "dev": true, + "requires": { + "assert-plus": "1.0.0" + } + }, + "jodid25519": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "jsbn": "0.1.0" + } + }, + "jsbn": { + "version": "0.1.0", + "bundled": true, + "dev": true, + "optional": true + }, + "tweetnacl": { + "version": "0.14.3", + "bundled": true, + "dev": true, + "optional": true + } + } + } + } + }, + "is-typedarray": { + "version": "1.0.0", + "bundled": true, + "dev": true + }, + "isstream": { + "version": "0.1.2", + "bundled": true, + "dev": true + }, + "json-stringify-safe": { + "version": "5.0.1", + "bundled": true, + "dev": true + }, + "mime-types": { + "version": "2.1.12", + "bundled": true, + "dev": true, + "requires": { + "mime-db": "1.24.0" + }, + "dependencies": { + "mime-db": { + "version": "1.24.0", + "bundled": true, + "dev": true + } + } + }, + "node-uuid": { + "version": "1.4.7", + "bundled": true, + "dev": true + }, + "oauth-sign": { + "version": "0.8.2", + "bundled": true, + "dev": true + }, + "qs": { + "version": "6.2.1", + "bundled": true, + "dev": true + }, + "stringstream": { + "version": "0.0.5", + "bundled": true, + "dev": true + }, + "tough-cookie": { + "version": "2.3.1", + "bundled": true, + "dev": true + }, + "tunnel-agent": { + "version": "0.4.3", + "bundled": true, + "dev": true + } + } + }, + "retry": { + "version": "0.10.0", + "bundled": true, + "dev": true + }, + "rimraf": { + "version": "2.5.4", + "bundled": true, + "dev": true, + "requires": { + "glob": "7.1.0" + } + }, + "semver": { + "version": "5.3.0", + "bundled": true, + "dev": true + }, + "sha": { + "version": "2.0.1", + "bundled": true, + "dev": true, + "requires": { + "graceful-fs": "4.1.9", + "readable-stream": "2.1.5" + } + }, + "slide": { + "version": "1.1.6", + "bundled": true, + "dev": true + }, + "sorted-object": { + "version": "2.0.1", + "bundled": true, + "dev": true + }, + "strip-ansi": { + "version": "3.0.1", + "bundled": true, + "dev": true, + "requires": { + "ansi-regex": "2.0.0" + } + }, + "tar": { + "version": "2.2.1", + "bundled": true, + "dev": true, + "requires": { + "block-stream": "0.0.8", + "fstream": "1.0.10", + "inherits": "2.0.3" + }, + "dependencies": { + "block-stream": { + "version": "0.0.8", + "bundled": true, + "dev": true, + "requires": { + "inherits": "2.0.3" + } + } + } + }, + "text-table": { + "version": "0.2.0", + "bundled": true, + "dev": true + }, + "uid-number": { + "version": "0.0.6", + "bundled": true, + "dev": true + }, + "umask": { + "version": "1.1.0", + "bundled": true, + "dev": true + }, + "unique-filename": { + "version": "1.1.0", + "bundled": true, + "dev": true, + "requires": { + "unique-slug": "2.0.0" + }, + "dependencies": { + "unique-slug": { + "version": "2.0.0", + "bundled": true, + "dev": true, + "requires": { + "imurmurhash": "0.1.4" + } + } + } + }, + "unpipe": { + "version": "1.0.0", + "bundled": true, + "dev": true + }, + "validate-npm-package-license": { + "version": "3.0.1", + "bundled": true, + "dev": true, + "requires": { + "spdx-correct": "1.0.2", + "spdx-expression-parse": "1.0.2" + }, + "dependencies": { + "spdx-correct": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "requires": { + "spdx-license-ids": "1.2.0" + }, + "dependencies": { + "spdx-license-ids": { + "version": "1.2.0", + "bundled": true, + "dev": true + } + } + }, + "spdx-expression-parse": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "requires": { + "spdx-exceptions": "1.0.4", + "spdx-license-ids": "1.2.0" + }, + "dependencies": { + "spdx-exceptions": { + "version": "1.0.4", + "bundled": true, + "dev": true + }, + "spdx-license-ids": { + "version": "1.2.0", + "bundled": true, + "dev": true + } + } + } + } + }, + "validate-npm-package-name": { + "version": "2.2.2", + "bundled": true, + "dev": true, + "requires": { + "builtins": "0.0.7" + }, + "dependencies": { + "builtins": { + "version": "0.0.7", + "bundled": true, + "dev": true + } + } + }, + "which": { + "version": "1.2.11", + "bundled": true, + "dev": true, + "requires": { + "isexe": "1.1.2" + }, + "dependencies": { + "isexe": { + "version": "1.1.2", + "bundled": true, + "dev": true + } + } + }, + "wrappy": { + "version": "1.0.2", + "bundled": true, + "dev": true + }, + "write-file-atomic": { + "version": "1.2.0", + "bundled": true, + "dev": true, + "requires": { + "graceful-fs": "4.1.9", + "imurmurhash": "0.1.4", + "slide": "1.1.6" + } + } + } + }, + "npm-check-updates": { + "version": "2.8.9", + "resolved": "https://registry.npmjs.org/npm-check-updates/-/npm-check-updates-2.8.9.tgz", + "integrity": "sha1-wISwh6COz5KSNS4s1ZHekD+BKcM=", + "dev": true, + "requires": { + "bluebird": "3.5.0", + "chalk": "1.1.3", + "cint": "8.2.1", + "cli-table": "0.3.1", + "commander": "2.9.0", + "fast-diff": "1.1.1", + "find-up": "1.1.2", + "get-stdin": "5.0.1", + "json-parse-helpfulerror": "1.0.3", + "lodash": "4.17.4", + "node-alias": "1.0.4", + "npm": "3.10.10", + "npmi": "2.0.1", + "require-dir": "0.3.2", + "semver": "5.4.1", + "semver-utils": "1.1.1", + "spawn-please": "0.2.0", + "update-notifier": "1.0.3" + } + }, + "npmi": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/npmi/-/npmi-2.0.1.tgz", + "integrity": "sha1-MmB2V+G9R8qFerTp2Y8KDP+WvOo=", + "dev": true, + "requires": { + "npm": "3.10.10", + "semver": "4.3.6" + }, + "dependencies": { + "semver": { + "version": "4.3.6", + "resolved": "https://registry.npmjs.org/semver/-/semver-4.3.6.tgz", + "integrity": "sha1-MAvG4OhjdPe6YQaLWx7NV/xlMto=", + "dev": true + } + } + }, + "number-is-nan": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", + "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", + "dev": true + }, + "nyc": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/nyc/-/nyc-11.1.0.tgz", + "integrity": "sha1-1rPF4WiSolr2MTi6SEZ2qooi7ac=", + "dev": true, + "requires": { + "archy": "1.0.0", + "arrify": "1.0.1", + "caching-transform": "1.0.1", + "convert-source-map": "1.5.0", + "debug-log": "1.0.1", + "default-require-extensions": "1.0.0", + "find-cache-dir": "0.1.1", + "find-up": "2.1.0", + "foreground-child": "1.5.6", + "glob": "7.1.2", + "istanbul-lib-coverage": "1.1.1", + "istanbul-lib-hook": "1.0.7", + "istanbul-lib-instrument": "1.7.4", + "istanbul-lib-report": "1.1.1", + "istanbul-lib-source-maps": "1.2.1", + "istanbul-reports": "1.1.1", + "md5-hex": "1.3.0", + "merge-source-map": "1.0.4", + "micromatch": "2.3.11", + "mkdirp": "0.5.1", + "resolve-from": "2.0.0", + "rimraf": "2.6.1", + "signal-exit": "3.0.2", + "spawn-wrap": "1.3.8", + "test-exclude": "4.1.1", + "yargs": "8.0.2", + "yargs-parser": "5.0.0" + }, + "dependencies": { + "align-text": { + "version": "0.1.4", + "bundled": true, + "dev": true, + "requires": { + "kind-of": "3.2.2", + "longest": "1.0.1", + "repeat-string": "1.6.1" + } + }, + "amdefine": { + "version": "1.0.1", + "bundled": true, + "dev": true + }, + "ansi-regex": { + "version": "2.1.1", + "bundled": true, + "dev": true + }, + "ansi-styles": { + "version": "2.2.1", + "bundled": true, + "dev": true + }, + "append-transform": { + "version": "0.4.0", + "bundled": true, + "dev": true, + "requires": { + "default-require-extensions": "1.0.0" + } + }, + "archy": { + "version": "1.0.0", + "bundled": true, + "dev": true + }, + "arr-diff": { + "version": "2.0.0", + "bundled": true, + "dev": true, + "requires": { + "arr-flatten": "1.1.0" + } + }, + "arr-flatten": { + "version": "1.1.0", + "bundled": true, + "dev": true + }, + "array-unique": { + "version": "0.2.1", + "bundled": true, + "dev": true + }, + "arrify": { + "version": "1.0.1", + "bundled": true, + "dev": true + }, + "async": { + "version": "1.5.2", + "bundled": true, + "dev": true + }, + "babel-code-frame": { + "version": "6.22.0", + "bundled": true, + "dev": true, + "requires": { + "chalk": "1.1.3", + "esutils": "2.0.2", + "js-tokens": "3.0.2" + } + }, + "babel-generator": { + "version": "6.25.0", + "bundled": true, + "dev": true, + "requires": { + "babel-messages": "6.23.0", + "babel-runtime": "6.23.0", + "babel-types": "6.25.0", + "detect-indent": "4.0.0", + "jsesc": "1.3.0", + "lodash": "4.17.4", + "source-map": "0.5.6", + "trim-right": "1.0.1" + } + }, + "babel-messages": { + "version": "6.23.0", + "bundled": true, + "dev": true, + "requires": { + "babel-runtime": "6.23.0" + } + }, + "babel-runtime": { + "version": "6.23.0", + "bundled": true, + "dev": true, + "requires": { + "core-js": "2.4.1", + "regenerator-runtime": "0.10.5" + } + }, + "babel-template": { + "version": "6.25.0", + "bundled": true, + "dev": true, + "requires": { + "babel-runtime": "6.23.0", + "babel-traverse": "6.25.0", + "babel-types": "6.25.0", + "babylon": "6.17.4", + "lodash": "4.17.4" + } + }, + "babel-traverse": { + "version": "6.25.0", + "bundled": true, + "dev": true, + "requires": { + "babel-code-frame": "6.22.0", + "babel-messages": "6.23.0", + "babel-runtime": "6.23.0", + "babel-types": "6.25.0", + "babylon": "6.17.4", + "debug": "2.6.8", + "globals": "9.18.0", + "invariant": "2.2.2", + "lodash": "4.17.4" + } + }, + "babel-types": { + "version": "6.25.0", + "bundled": true, + "dev": true, + "requires": { + "babel-runtime": "6.23.0", + "esutils": "2.0.2", + "lodash": "4.17.4", + "to-fast-properties": "1.0.3" + } + }, + "babylon": { + "version": "6.17.4", + "bundled": true, + "dev": true + }, + "balanced-match": { + "version": "1.0.0", + "bundled": true, + "dev": true + }, + "brace-expansion": { + "version": "1.1.8", + "bundled": true, + "dev": true, + "requires": { + "balanced-match": "1.0.0", + "concat-map": "0.0.1" + } + }, + "braces": { + "version": "1.8.5", + "bundled": true, + "dev": true, + "requires": { + "expand-range": "1.8.2", + "preserve": "0.2.0", + "repeat-element": "1.1.2" + } + }, + "builtin-modules": { + "version": "1.1.1", + "bundled": true, + "dev": true + }, + "caching-transform": { + "version": "1.0.1", + "bundled": true, + "dev": true, + "requires": { + "md5-hex": "1.3.0", + "mkdirp": "0.5.1", + "write-file-atomic": "1.3.4" + } + }, + "camelcase": { + "version": "1.2.1", + "bundled": true, + "dev": true, + "optional": true + }, + "center-align": { + "version": "0.1.3", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "align-text": "0.1.4", + "lazy-cache": "1.0.4" + } + }, + "chalk": { + "version": "1.1.3", + "bundled": true, + "dev": true, + "requires": { + "ansi-styles": "2.2.1", + "escape-string-regexp": "1.0.5", + "has-ansi": "2.0.0", + "strip-ansi": "3.0.1", + "supports-color": "2.0.0" + } + }, + "cliui": { + "version": "2.1.0", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "center-align": "0.1.3", + "right-align": "0.1.3", + "wordwrap": "0.0.2" + }, + "dependencies": { + "wordwrap": { + "version": "0.0.2", + "bundled": true, + "dev": true, + "optional": true + } + } + }, + "code-point-at": { + "version": "1.1.0", + "bundled": true, + "dev": true + }, + "commondir": { + "version": "1.0.1", + "bundled": true, + "dev": true + }, + "concat-map": { + "version": "0.0.1", + "bundled": true, + "dev": true + }, + "convert-source-map": { + "version": "1.5.0", + "bundled": true, + "dev": true + }, + "core-js": { + "version": "2.4.1", + "bundled": true, + "dev": true + }, + "cross-spawn": { + "version": "4.0.2", + "bundled": true, + "dev": true, + "requires": { + "lru-cache": "4.1.1", + "which": "1.2.14" + } + }, + "debug": { + "version": "2.6.8", + "bundled": true, + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "debug-log": { + "version": "1.0.1", + "bundled": true, + "dev": true + }, + "decamelize": { + "version": "1.2.0", + "bundled": true, + "dev": true + }, + "default-require-extensions": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "requires": { + "strip-bom": "2.0.0" + } + }, + "detect-indent": { + "version": "4.0.0", + "bundled": true, + "dev": true, + "requires": { + "repeating": "2.0.1" + } + }, + "error-ex": { + "version": "1.3.1", + "bundled": true, + "dev": true, + "requires": { + "is-arrayish": "0.2.1" + } + }, + "escape-string-regexp": { + "version": "1.0.5", + "bundled": true, + "dev": true + }, + "esutils": { + "version": "2.0.2", + "bundled": true, + "dev": true + }, + "execa": { + "version": "0.5.1", + "bundled": true, + "dev": true, + "requires": { + "cross-spawn": "4.0.2", + "get-stream": "2.3.1", + "is-stream": "1.1.0", + "npm-run-path": "2.0.2", + "p-finally": "1.0.0", + "signal-exit": "3.0.2", + "strip-eof": "1.0.0" + } + }, + "expand-brackets": { + "version": "0.1.5", + "bundled": true, + "dev": true, + "requires": { + "is-posix-bracket": "0.1.1" + } + }, + "expand-range": { + "version": "1.8.2", + "bundled": true, + "dev": true, + "requires": { + "fill-range": "2.2.3" + } + }, + "extglob": { + "version": "0.3.2", + "bundled": true, + "dev": true, + "requires": { + "is-extglob": "1.0.0" + } + }, + "filename-regex": { + "version": "2.0.1", + "bundled": true, + "dev": true + }, + "fill-range": { + "version": "2.2.3", + "bundled": true, + "dev": true, + "requires": { + "is-number": "2.1.0", + "isobject": "2.1.0", + "randomatic": "1.1.7", + "repeat-element": "1.1.2", + "repeat-string": "1.6.1" + } + }, + "find-cache-dir": { + "version": "0.1.1", + "bundled": true, + "dev": true, + "requires": { + "commondir": "1.0.1", + "mkdirp": "0.5.1", + "pkg-dir": "1.0.0" + } + }, + "find-up": { + "version": "2.1.0", + "bundled": true, + "dev": true, + "requires": { + "locate-path": "2.0.0" + } + }, + "for-in": { + "version": "1.0.2", + "bundled": true, + "dev": true + }, + "for-own": { + "version": "0.1.5", + "bundled": true, + "dev": true, + "requires": { + "for-in": "1.0.2" + } + }, + "foreground-child": { + "version": "1.5.6", + "bundled": true, + "dev": true, + "requires": { + "cross-spawn": "4.0.2", + "signal-exit": "3.0.2" + } + }, + "fs.realpath": { + "version": "1.0.0", + "bundled": true, + "dev": true + }, + "get-caller-file": { + "version": "1.0.2", + "bundled": true, + "dev": true + }, + "get-stream": { + "version": "2.3.1", + "bundled": true, + "dev": true, + "requires": { + "object-assign": "4.1.1", + "pinkie-promise": "2.0.1" + } + }, + "glob": { + "version": "7.1.2", + "bundled": true, + "dev": true, + "requires": { + "fs.realpath": "1.0.0", + "inflight": "1.0.6", + "inherits": "2.0.3", + "minimatch": "3.0.4", + "once": "1.4.0", + "path-is-absolute": "1.0.1" + } + }, + "glob-base": { + "version": "0.3.0", + "bundled": true, + "dev": true, + "requires": { + "glob-parent": "2.0.0", + "is-glob": "2.0.1" + } + }, + "glob-parent": { + "version": "2.0.0", + "bundled": true, + "dev": true, + "requires": { + "is-glob": "2.0.1" + } + }, + "globals": { + "version": "9.18.0", + "bundled": true, + "dev": true + }, + "graceful-fs": { + "version": "4.1.11", + "bundled": true, + "dev": true + }, + "handlebars": { + "version": "4.0.10", + "bundled": true, + "dev": true, + "requires": { + "async": "1.5.2", + "optimist": "0.6.1", + "source-map": "0.4.4", + "uglify-js": "2.8.29" + }, + "dependencies": { + "source-map": { + "version": "0.4.4", + "bundled": true, + "dev": true, + "requires": { + "amdefine": "1.0.1" + } + } + } + }, + "has-ansi": { + "version": "2.0.0", + "bundled": true, + "dev": true, + "requires": { + "ansi-regex": "2.1.1" + } + }, + "has-flag": { + "version": "1.0.0", + "bundled": true, + "dev": true + }, + "hosted-git-info": { + "version": "2.5.0", + "bundled": true, + "dev": true + }, + "imurmurhash": { + "version": "0.1.4", + "bundled": true, + "dev": true + }, + "inflight": { + "version": "1.0.6", + "bundled": true, + "dev": true, + "requires": { + "once": "1.4.0", + "wrappy": "1.0.2" + } + }, + "inherits": { + "version": "2.0.3", + "bundled": true, + "dev": true + }, + "invariant": { + "version": "2.2.2", + "bundled": true, + "dev": true, + "requires": { + "loose-envify": "1.3.1" + } + }, + "invert-kv": { + "version": "1.0.0", + "bundled": true, + "dev": true + }, + "is-arrayish": { + "version": "0.2.1", + "bundled": true, + "dev": true + }, + "is-buffer": { + "version": "1.1.5", + "bundled": true, + "dev": true + }, + "is-builtin-module": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "requires": { + "builtin-modules": "1.1.1" + } + }, + "is-dotfile": { + "version": "1.0.3", + "bundled": true, + "dev": true + }, + "is-equal-shallow": { + "version": "0.1.3", + "bundled": true, + "dev": true, + "requires": { + "is-primitive": "2.0.0" + } + }, + "is-extendable": { + "version": "0.1.1", + "bundled": true, + "dev": true + }, + "is-extglob": { + "version": "1.0.0", + "bundled": true, + "dev": true + }, + "is-finite": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "requires": { + "number-is-nan": "1.0.1" + } + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "requires": { + "number-is-nan": "1.0.1" + } + }, + "is-glob": { + "version": "2.0.1", + "bundled": true, + "dev": true, + "requires": { + "is-extglob": "1.0.0" + } + }, + "is-number": { + "version": "2.1.0", + "bundled": true, + "dev": true, + "requires": { + "kind-of": "3.2.2" + } + }, + "is-posix-bracket": { + "version": "0.1.1", + "bundled": true, + "dev": true + }, + "is-primitive": { + "version": "2.0.0", + "bundled": true, + "dev": true + }, + "is-stream": { + "version": "1.1.0", + "bundled": true, + "dev": true + }, + "is-utf8": { + "version": "0.2.1", + "bundled": true, + "dev": true + }, + "isarray": { + "version": "1.0.0", + "bundled": true, + "dev": true + }, + "isexe": { + "version": "2.0.0", + "bundled": true, + "dev": true + }, + "isobject": { + "version": "2.1.0", + "bundled": true, + "dev": true, + "requires": { + "isarray": "1.0.0" + } + }, + "istanbul-lib-coverage": { + "version": "1.1.1", + "bundled": true, + "dev": true + }, + "istanbul-lib-hook": { + "version": "1.0.7", + "bundled": true, + "dev": true, + "requires": { + "append-transform": "0.4.0" + } + }, + "istanbul-lib-instrument": { + "version": "1.7.4", + "bundled": true, + "dev": true, + "requires": { + "babel-generator": "6.25.0", + "babel-template": "6.25.0", + "babel-traverse": "6.25.0", + "babel-types": "6.25.0", + "babylon": "6.17.4", + "istanbul-lib-coverage": "1.1.1", + "semver": "5.3.0" + } + }, + "istanbul-lib-report": { + "version": "1.1.1", + "bundled": true, + "dev": true, + "requires": { + "istanbul-lib-coverage": "1.1.1", + "mkdirp": "0.5.1", + "path-parse": "1.0.5", + "supports-color": "3.2.3" + }, + "dependencies": { + "supports-color": { + "version": "3.2.3", + "bundled": true, + "dev": true, + "requires": { + "has-flag": "1.0.0" + } + } + } + }, + "istanbul-lib-source-maps": { + "version": "1.2.1", + "bundled": true, + "dev": true, + "requires": { + "debug": "2.6.8", + "istanbul-lib-coverage": "1.1.1", + "mkdirp": "0.5.1", + "rimraf": "2.6.1", + "source-map": "0.5.6" + } + }, + "istanbul-reports": { + "version": "1.1.1", + "bundled": true, + "dev": true, + "requires": { + "handlebars": "4.0.10" + } + }, + "js-tokens": { + "version": "3.0.2", + "bundled": true, + "dev": true + }, + "jsesc": { + "version": "1.3.0", + "bundled": true, + "dev": true + }, + "kind-of": { + "version": "3.2.2", + "bundled": true, + "dev": true, + "requires": { + "is-buffer": "1.1.5" + } + }, + "lazy-cache": { + "version": "1.0.4", + "bundled": true, + "dev": true, + "optional": true + }, + "lcid": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "requires": { + "invert-kv": "1.0.0" + } + }, + "load-json-file": { + "version": "1.1.0", + "bundled": true, + "dev": true, + "requires": { + "graceful-fs": "4.1.11", + "parse-json": "2.2.0", + "pify": "2.3.0", + "pinkie-promise": "2.0.1", + "strip-bom": "2.0.0" + } + }, + "locate-path": { + "version": "2.0.0", + "bundled": true, + "dev": true, + "requires": { + "p-locate": "2.0.0", + "path-exists": "3.0.0" + }, + "dependencies": { + "path-exists": { + "version": "3.0.0", + "bundled": true, + "dev": true + } + } + }, + "lodash": { + "version": "4.17.4", + "bundled": true, + "dev": true + }, + "longest": { + "version": "1.0.1", + "bundled": true, + "dev": true + }, + "loose-envify": { + "version": "1.3.1", + "bundled": true, + "dev": true, + "requires": { + "js-tokens": "3.0.2" + } + }, + "lru-cache": { + "version": "4.1.1", + "bundled": true, + "dev": true, + "requires": { + "pseudomap": "1.0.2", + "yallist": "2.1.2" + } + }, + "md5-hex": { + "version": "1.3.0", + "bundled": true, + "dev": true, + "requires": { + "md5-o-matic": "0.1.1" + } + }, + "md5-o-matic": { + "version": "0.1.1", + "bundled": true, + "dev": true + }, + "mem": { + "version": "1.1.0", + "bundled": true, + "dev": true, + "requires": { + "mimic-fn": "1.1.0" + } + }, + "merge-source-map": { + "version": "1.0.4", + "bundled": true, + "dev": true, + "requires": { + "source-map": "0.5.6" + } + }, + "micromatch": { + "version": "2.3.11", + "bundled": true, + "dev": true, + "requires": { + "arr-diff": "2.0.0", + "array-unique": "0.2.1", + "braces": "1.8.5", + "expand-brackets": "0.1.5", + "extglob": "0.3.2", + "filename-regex": "2.0.1", + "is-extglob": "1.0.0", + "is-glob": "2.0.1", + "kind-of": "3.2.2", + "normalize-path": "2.1.1", + "object.omit": "2.0.1", + "parse-glob": "3.0.4", + "regex-cache": "0.4.3" + } + }, + "mimic-fn": { + "version": "1.1.0", + "bundled": true, + "dev": true + }, + "minimatch": { + "version": "3.0.4", + "bundled": true, + "dev": true, + "requires": { + "brace-expansion": "1.1.8" + } + }, + "minimist": { + "version": "0.0.8", + "bundled": true, + "dev": true + }, + "mkdirp": { + "version": "0.5.1", + "bundled": true, + "dev": true, + "requires": { + "minimist": "0.0.8" + } + }, + "ms": { + "version": "2.0.0", + "bundled": true, + "dev": true + }, + "normalize-package-data": { + "version": "2.4.0", + "bundled": true, + "dev": true, + "requires": { + "hosted-git-info": "2.5.0", + "is-builtin-module": "1.0.0", + "semver": "5.3.0", + "validate-npm-package-license": "3.0.1" + } + }, + "normalize-path": { + "version": "2.1.1", + "bundled": true, + "dev": true, + "requires": { + "remove-trailing-separator": "1.0.2" + } + }, + "npm-run-path": { + "version": "2.0.2", + "bundled": true, + "dev": true, + "requires": { + "path-key": "2.0.1" + } + }, + "number-is-nan": { + "version": "1.0.1", + "bundled": true, + "dev": true + }, + "object-assign": { + "version": "4.1.1", + "bundled": true, + "dev": true + }, + "object.omit": { + "version": "2.0.1", + "bundled": true, + "dev": true, + "requires": { + "for-own": "0.1.5", + "is-extendable": "0.1.1" + } + }, + "once": { + "version": "1.4.0", + "bundled": true, + "dev": true, + "requires": { + "wrappy": "1.0.2" + } + }, + "optimist": { + "version": "0.6.1", + "bundled": true, + "dev": true, + "requires": { + "minimist": "0.0.8", + "wordwrap": "0.0.3" + } + }, + "os-homedir": { + "version": "1.0.2", + "bundled": true, + "dev": true + }, + "os-locale": { + "version": "2.0.0", + "bundled": true, + "dev": true, + "requires": { + "execa": "0.5.1", + "lcid": "1.0.0", + "mem": "1.1.0" + } + }, + "p-finally": { + "version": "1.0.0", + "bundled": true, + "dev": true + }, + "p-limit": { + "version": "1.1.0", + "bundled": true, + "dev": true + }, + "p-locate": { + "version": "2.0.0", + "bundled": true, + "dev": true, + "requires": { + "p-limit": "1.1.0" + } + }, + "parse-glob": { + "version": "3.0.4", + "bundled": true, + "dev": true, + "requires": { + "glob-base": "0.3.0", + "is-dotfile": "1.0.3", + "is-extglob": "1.0.0", + "is-glob": "2.0.1" + } + }, + "parse-json": { + "version": "2.2.0", + "bundled": true, + "dev": true, + "requires": { + "error-ex": "1.3.1" + } + }, + "path-exists": { + "version": "2.1.0", + "bundled": true, + "dev": true, + "requires": { + "pinkie-promise": "2.0.1" + } + }, + "path-is-absolute": { + "version": "1.0.1", + "bundled": true, + "dev": true + }, + "path-key": { + "version": "2.0.1", + "bundled": true, + "dev": true + }, + "path-parse": { + "version": "1.0.5", + "bundled": true, + "dev": true + }, + "path-type": { + "version": "1.1.0", + "bundled": true, + "dev": true, + "requires": { + "graceful-fs": "4.1.11", + "pify": "2.3.0", + "pinkie-promise": "2.0.1" + } + }, + "pify": { + "version": "2.3.0", + "bundled": true, + "dev": true + }, + "pinkie": { + "version": "2.0.4", + "bundled": true, + "dev": true + }, + "pinkie-promise": { + "version": "2.0.1", + "bundled": true, + "dev": true, + "requires": { + "pinkie": "2.0.4" + } + }, + "pkg-dir": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "requires": { + "find-up": "1.1.2" + }, + "dependencies": { + "find-up": { + "version": "1.1.2", + "bundled": true, + "dev": true, + "requires": { + "path-exists": "2.1.0", + "pinkie-promise": "2.0.1" + } + } + } + }, + "preserve": { + "version": "0.2.0", + "bundled": true, + "dev": true + }, + "pseudomap": { + "version": "1.0.2", + "bundled": true, + "dev": true + }, + "randomatic": { + "version": "1.1.7", + "bundled": true, + "dev": true, + "requires": { + "is-number": "3.0.0", + "kind-of": "4.0.0" + }, + "dependencies": { + "is-number": { + "version": "3.0.0", + "bundled": true, + "dev": true, + "requires": { + "kind-of": "3.2.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "bundled": true, + "dev": true, + "requires": { + "is-buffer": "1.1.5" + } + } + } + }, + "kind-of": { + "version": "4.0.0", + "bundled": true, + "dev": true, + "requires": { + "is-buffer": "1.1.5" + } + } + } + }, + "read-pkg": { + "version": "1.1.0", + "bundled": true, + "dev": true, + "requires": { + "load-json-file": "1.1.0", + "normalize-package-data": "2.4.0", + "path-type": "1.1.0" + } + }, + "read-pkg-up": { + "version": "1.0.1", + "bundled": true, + "dev": true, + "requires": { + "find-up": "1.1.2", + "read-pkg": "1.1.0" + }, + "dependencies": { + "find-up": { + "version": "1.1.2", + "bundled": true, + "dev": true, + "requires": { + "path-exists": "2.1.0", + "pinkie-promise": "2.0.1" + } + } + } + }, + "regenerator-runtime": { + "version": "0.10.5", + "bundled": true, + "dev": true + }, + "regex-cache": { + "version": "0.4.3", + "bundled": true, + "dev": true, + "requires": { + "is-equal-shallow": "0.1.3", + "is-primitive": "2.0.0" + } + }, + "remove-trailing-separator": { + "version": "1.0.2", + "bundled": true, + "dev": true + }, + "repeat-element": { + "version": "1.1.2", + "bundled": true, + "dev": true + }, + "repeat-string": { + "version": "1.6.1", + "bundled": true, + "dev": true + }, + "repeating": { + "version": "2.0.1", + "bundled": true, + "dev": true, + "requires": { + "is-finite": "1.0.2" + } + }, + "require-directory": { + "version": "2.1.1", + "bundled": true, + "dev": true + }, + "require-main-filename": { + "version": "1.0.1", + "bundled": true, + "dev": true + }, + "resolve-from": { + "version": "2.0.0", + "bundled": true, + "dev": true + }, + "right-align": { + "version": "0.1.3", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "align-text": "0.1.4" + } + }, + "rimraf": { + "version": "2.6.1", + "bundled": true, + "dev": true, + "requires": { + "glob": "7.1.2" + } + }, + "semver": { + "version": "5.3.0", + "bundled": true, + "dev": true + }, + "set-blocking": { + "version": "2.0.0", + "bundled": true, + "dev": true + }, + "signal-exit": { + "version": "3.0.2", + "bundled": true, + "dev": true + }, + "slide": { + "version": "1.1.6", + "bundled": true, + "dev": true + }, + "source-map": { + "version": "0.5.6", + "bundled": true, + "dev": true + }, + "spawn-wrap": { + "version": "1.3.8", + "bundled": true, + "dev": true, + "requires": { + "foreground-child": "1.5.6", + "mkdirp": "0.5.1", + "os-homedir": "1.0.2", + "rimraf": "2.6.1", + "signal-exit": "3.0.2", + "which": "1.2.14" + } + }, + "spdx-correct": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "requires": { + "spdx-license-ids": "1.2.2" + } + }, + "spdx-expression-parse": { + "version": "1.0.4", + "bundled": true, + "dev": true + }, + "spdx-license-ids": { + "version": "1.2.2", + "bundled": true, + "dev": true + }, + "string-width": { + "version": "2.1.0", + "bundled": true, + "dev": true, + "requires": { + "is-fullwidth-code-point": "2.0.0", + "strip-ansi": "4.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "3.0.0", + "bundled": true, + "dev": true + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "bundled": true, + "dev": true + }, + "strip-ansi": { + "version": "4.0.0", + "bundled": true, + "dev": true, + "requires": { + "ansi-regex": "3.0.0" + } + } + } + }, + "strip-ansi": { + "version": "3.0.1", + "bundled": true, + "dev": true, + "requires": { + "ansi-regex": "2.1.1" + } + }, + "strip-bom": { + "version": "2.0.0", + "bundled": true, + "dev": true, + "requires": { + "is-utf8": "0.2.1" + } + }, + "strip-eof": { + "version": "1.0.0", + "bundled": true, + "dev": true + }, + "supports-color": { + "version": "2.0.0", + "bundled": true, + "dev": true + }, + "test-exclude": { + "version": "4.1.1", + "bundled": true, + "dev": true, + "requires": { + "arrify": "1.0.1", + "micromatch": "2.3.11", + "object-assign": "4.1.1", + "read-pkg-up": "1.0.1", + "require-main-filename": "1.0.1" + } + }, + "to-fast-properties": { + "version": "1.0.3", + "bundled": true, + "dev": true + }, + "trim-right": { + "version": "1.0.1", + "bundled": true, + "dev": true + }, + "uglify-js": { + "version": "2.8.29", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "source-map": "0.5.6", + "uglify-to-browserify": "1.0.2", + "yargs": "3.10.0" + }, + "dependencies": { + "yargs": { + "version": "3.10.0", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "camelcase": "1.2.1", + "cliui": "2.1.0", + "decamelize": "1.2.0", + "window-size": "0.1.0" + } + } + } + }, + "uglify-to-browserify": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "validate-npm-package-license": { + "version": "3.0.1", + "bundled": true, + "dev": true, + "requires": { + "spdx-correct": "1.0.2", + "spdx-expression-parse": "1.0.4" + } + }, + "which": { + "version": "1.2.14", + "bundled": true, + "dev": true, + "requires": { + "isexe": "2.0.0" + } + }, + "which-module": { + "version": "2.0.0", + "bundled": true, + "dev": true + }, + "window-size": { + "version": "0.1.0", + "bundled": true, + "dev": true, + "optional": true + }, + "wordwrap": { + "version": "0.0.3", + "bundled": true, + "dev": true + }, + "wrap-ansi": { + "version": "2.1.0", + "bundled": true, + "dev": true, + "requires": { + "string-width": "1.0.2", + "strip-ansi": "3.0.1" + }, + "dependencies": { + "string-width": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "requires": { + "code-point-at": "1.1.0", + "is-fullwidth-code-point": "1.0.0", + "strip-ansi": "3.0.1" + } + } + } + }, + "wrappy": { + "version": "1.0.2", + "bundled": true, + "dev": true + }, + "write-file-atomic": { + "version": "1.3.4", + "bundled": true, + "dev": true, + "requires": { + "graceful-fs": "4.1.11", + "imurmurhash": "0.1.4", + "slide": "1.1.6" + } + }, + "y18n": { + "version": "3.2.1", + "bundled": true, + "dev": true + }, + "yallist": { + "version": "2.1.2", + "bundled": true, + "dev": true + }, + "yargs": { + "version": "8.0.2", + "bundled": true, + "dev": true, + "requires": { + "camelcase": "4.1.0", + "cliui": "3.2.0", + "decamelize": "1.2.0", + "get-caller-file": "1.0.2", + "os-locale": "2.0.0", + "read-pkg-up": "2.0.0", + "require-directory": "2.1.1", + "require-main-filename": "1.0.1", + "set-blocking": "2.0.0", + "string-width": "2.1.0", + "which-module": "2.0.0", + "y18n": "3.2.1", + "yargs-parser": "7.0.0" + }, + "dependencies": { + "camelcase": { + "version": "4.1.0", + "bundled": true, + "dev": true + }, + "cliui": { + "version": "3.2.0", + "bundled": true, + "dev": true, + "requires": { + "string-width": "1.0.2", + "strip-ansi": "3.0.1", + "wrap-ansi": "2.1.0" + }, + "dependencies": { + "string-width": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "requires": { + "code-point-at": "1.1.0", + "is-fullwidth-code-point": "1.0.0", + "strip-ansi": "3.0.1" + } + } + } + }, + "load-json-file": { + "version": "2.0.0", + "bundled": true, + "dev": true, + "requires": { + "graceful-fs": "4.1.11", + "parse-json": "2.2.0", + "pify": "2.3.0", + "strip-bom": "3.0.0" + } + }, + "path-type": { + "version": "2.0.0", + "bundled": true, + "dev": true, + "requires": { + "pify": "2.3.0" + } + }, + "read-pkg": { + "version": "2.0.0", + "bundled": true, + "dev": true, + "requires": { + "load-json-file": "2.0.0", + "normalize-package-data": "2.4.0", + "path-type": "2.0.0" + } + }, + "read-pkg-up": { + "version": "2.0.0", + "bundled": true, + "dev": true, + "requires": { + "find-up": "2.1.0", + "read-pkg": "2.0.0" + } + }, + "strip-bom": { + "version": "3.0.0", + "bundled": true, + "dev": true + }, + "yargs-parser": { + "version": "7.0.0", + "bundled": true, + "dev": true, + "requires": { + "camelcase": "4.1.0" + } + } + } + }, + "yargs-parser": { + "version": "5.0.0", + "bundled": true, + "dev": true, + "requires": { + "camelcase": "3.0.0" + }, + "dependencies": { + "camelcase": { + "version": "3.0.0", + "bundled": true, + "dev": true + } + } + } + } + }, + "object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", + "dev": true + }, + "object-keys": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.0.11.tgz", + "integrity": "sha1-xUYBd4rVYPEULODgG8yotW0TQm0=", + "dev": true + }, + "object.assign": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.0.4.tgz", + "integrity": "sha1-scnMBE7xuf5jYG/BQau7MuFHMMw=", + "dev": true, + "requires": { + "define-properties": "1.1.2", + "function-bind": "1.1.0", + "object-keys": "1.0.11" + } + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "requires": { + "wrappy": "1.0.2" + } + }, + "onetime": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-1.1.0.tgz", + "integrity": "sha1-ofeDj4MUxRbwXs78vEzP4EtO14k=", + "dev": true + }, + "optionator": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.2.tgz", + "integrity": "sha1-NkxeQJ0/TWMB1sC0wFu6UBgK62Q=", + "dev": true, + "requires": { + "deep-is": "0.1.3", + "fast-levenshtein": "2.0.6", + "levn": "0.3.0", + "prelude-ls": "1.1.2", + "type-check": "0.3.2", + "wordwrap": "1.0.0" + } + }, + "os-homedir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", + "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=", + "dev": true + }, + "os-tmpdir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", + "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", + "dev": true + }, + "osenv": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/osenv/-/osenv-0.1.4.tgz", + "integrity": "sha1-Qv5tWVPfBsgGS+bxdsPQWqqjRkQ=", + "dev": true, + "requires": { + "os-homedir": "1.0.2", + "os-tmpdir": "1.0.2" + } + }, + "p-limit": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.1.0.tgz", + "integrity": "sha1-sH/y2aXYi+yAYDWJWiurZqJ5iLw=", + "dev": true + }, + "p-locate": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", + "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", + "dev": true, + "requires": { + "p-limit": "1.1.0" + } + }, + "package-json": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/package-json/-/package-json-2.4.0.tgz", + "integrity": "sha1-DRW9Z9HLvduyyiIv8u24a8sxqLs=", + "dev": true, + "requires": { + "got": "5.7.1", + "registry-auth-token": "3.3.1", + "registry-url": "3.1.0", + "semver": "5.4.1" + } + }, + "parse-json": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", + "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", + "dev": true, + "requires": { + "error-ex": "1.3.1" + } + }, + "path-exists": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", + "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", + "dev": true, + "requires": { + "pinkie-promise": "2.0.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=" + }, + "path-is-inside": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz", + "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=", + "dev": true + }, + "path-parse": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.5.tgz", + "integrity": "sha1-PBrfhx6pzWyUMbbqK9dKD/BVxME=", + "dev": true + }, + "path-to-regexp": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.7.0.tgz", + "integrity": "sha1-Wf3g9DW62suhA6hOnTvGTpa5k30=", + "requires": { + "isarray": "0.0.1" + } + }, + "pathval": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.0.tgz", + "integrity": "sha1-uULm1L3mUwBe9rcTYd74cn0GReA=" + }, + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "dev": true + }, + "pinkie": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", + "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=", + "dev": true + }, + "pinkie-promise": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", + "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", + "dev": true, + "requires": { + "pinkie": "2.0.4" + } + }, + "pkg-conf": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/pkg-conf/-/pkg-conf-2.0.0.tgz", + "integrity": "sha1-BxyHZQQDvM+5xif1h1G/5HwGcnk=", + "dev": true, + "requires": { + "find-up": "2.1.0", + "load-json-file": "2.0.0" + }, + "dependencies": { + "find-up": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", + "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", + "dev": true, + "requires": { + "locate-path": "2.0.0" + } + } + } + }, + "pkg-config": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/pkg-config/-/pkg-config-1.1.1.tgz", + "integrity": "sha1-VX7yLXPaPIg3EHdmxS6tq94pj+Q=", + "dev": true, + "requires": { + "debug-log": "1.0.1", + "find-root": "1.1.0", + "xtend": "4.0.1" + } + }, + "pkg-dir": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-1.0.0.tgz", + "integrity": "sha1-ektQio1bstYp1EcFb/TpyTFM89Q=", + "dev": true, + "requires": { + "find-up": "1.1.2" + } + }, + "pkg-up": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/pkg-up/-/pkg-up-1.0.0.tgz", + "integrity": "sha1-Pgj7RhUlxEIWJKM7n35tCvWwWiY=", + "dev": true, + "requires": { + "find-up": "1.1.2" + } + }, + "pluralize": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-1.2.1.tgz", + "integrity": "sha1-0aIUg/0iu0HlihL6NCGCMUCJfEU=", + "dev": true + }, + "prelude-ls": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", + "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=", + "dev": true + }, + "prepend-http": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-1.0.4.tgz", + "integrity": "sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw=", + "dev": true + }, + "private": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/private/-/private-0.1.7.tgz", + "integrity": "sha1-aM5eih7woju1cMwoU3tTMqumPvE=", + "dev": true + }, + "process-nextick-args": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.7.tgz", + "integrity": "sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M=" + }, + "progress": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/progress/-/progress-1.1.8.tgz", + "integrity": "sha1-4mDHj2Fhzdmw5WzD4Khd4Xx6V74=", + "dev": true + }, + "rc": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.1.tgz", + "integrity": "sha1-LgPo5C7kULjLPc5lvhv4l04d/ZU=", + "dev": true, + "requires": { + "deep-extend": "0.4.2", + "ini": "1.3.4", + "minimist": "1.2.0", + "strip-json-comments": "2.0.1" + }, + "dependencies": { + "minimist": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", + "dev": true + } + } + }, + "read-all-stream": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/read-all-stream/-/read-all-stream-3.1.0.tgz", + "integrity": "sha1-NcPhd/IHjveJ7kv6+kNzB06u9Po=", + "dev": true, + "requires": { + "pinkie-promise": "2.0.1", + "readable-stream": "2.2.7" + } + }, + "readable-stream": { + "version": "2.2.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.2.7.tgz", + "integrity": "sha1-BwV6y+JGeyIELTb5jFrVBwVOlbE=", + "requires": { + "buffer-shims": "1.0.0", + "core-util-is": "1.0.2", + "inherits": "2.0.3", + "isarray": "1.0.0", + "process-nextick-args": "1.0.7", + "string_decoder": "1.0.3", + "util-deprecate": "1.0.2" + }, + "dependencies": { + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" + } + } + }, + "readline2": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/readline2/-/readline2-1.0.1.tgz", + "integrity": "sha1-QQWWCP/BVHV7cV2ZidGZ/783LjU=", + "dev": true, + "requires": { + "code-point-at": "1.1.0", + "is-fullwidth-code-point": "1.0.0", + "mute-stream": "0.0.5" + } + }, + "rechoir": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", + "integrity": "sha1-hSBLVNuoLVdC4oyWdW70OvUOM4Q=", + "dev": true, + "requires": { + "resolve": "1.4.0" + } + }, + "regenerate": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.3.2.tgz", + "integrity": "sha1-0ZQcZ7rUN+G+dkM63Vs4X5WxkmA=", + "dev": true + }, + "regenerator-runtime": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.0.tgz", + "integrity": "sha512-/aA0kLeRb5N9K0d4fw7ooEbI+xDe+DKD499EQqygGqeS8N3xto15p09uY2xj7ixP81sNPXvRLnAQIqdVStgb1A==", + "dev": true + }, + "regenerator-transform": { + "version": "0.10.1", + "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.10.1.tgz", + "integrity": "sha512-PJepbvDbuK1xgIgnau7Y90cwaAmO/LCLMI2mPvaXq2heGMR3aWW5/BQvYrhJ8jgmQjXewXvBjzfqKcVOmhjZ6Q==", + "dev": true, + "requires": { + "babel-runtime": "6.26.0", + "babel-types": "6.26.0", + "private": "0.1.7" + } + }, + "regexp-quote": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/regexp-quote/-/regexp-quote-0.0.0.tgz", + "integrity": "sha1-Hg9GUMhi3L/tVP1CsUjpuxch/PI=", + "dev": true + }, + "regexpu-core": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-2.0.0.tgz", + "integrity": "sha1-SdA4g3uNz4v6W5pCE5k45uoq4kA=", + "dev": true, + "requires": { + "regenerate": "1.3.2", + "regjsgen": "0.2.0", + "regjsparser": "0.1.5" + } + }, + "registry-auth-token": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-3.3.1.tgz", + "integrity": "sha1-+w0yie4Nmtosu1KvXf5mywcNMAY=", + "dev": true, + "requires": { + "rc": "1.2.1", + "safe-buffer": "5.1.1" + } + }, + "registry-url": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/registry-url/-/registry-url-3.1.0.tgz", + "integrity": "sha1-PU74cPc93h138M+aOBQyRE4XSUI=", + "dev": true, + "requires": { + "rc": "1.2.1" + } + }, + "regjsgen": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.2.0.tgz", + "integrity": "sha1-bAFq3qxVT3WCP+N6wFuS1aTtsfc=", + "dev": true + }, + "regjsparser": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.1.5.tgz", + "integrity": "sha1-fuj4Tcb6eS0/0K4ijSS9lJ6tIFw=", + "dev": true, + "requires": { + "jsesc": "0.5.0" + }, + "dependencies": { + "jsesc": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", + "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=", + "dev": true + } + } + }, + "repeating": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz", + "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=", + "dev": true, + "requires": { + "is-finite": "1.0.2" + } + }, + "require_optional": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/require_optional/-/require_optional-1.0.1.tgz", + "integrity": "sha512-qhM/y57enGWHAe3v/NcwML6a3/vfESLe/sGM2dII+gEO0BpKRUkWZow/tyloNqJyN6kXSl3RyyM8Ll5D/sJP8g==", + "requires": { + "resolve-from": "2.0.0", + "semver": "5.4.1" + } + }, + "require-dir": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/require-dir/-/require-dir-0.3.2.tgz", + "integrity": "sha1-wdXHXp+//eny5rM+OD209ZS1pqk=", + "dev": true + }, + "require-uncached": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/require-uncached/-/require-uncached-1.0.3.tgz", + "integrity": "sha1-Tg1W1slmL9MeQwEcS5WqSZVUIdM=", + "dev": true, + "requires": { + "caller-path": "0.1.0", + "resolve-from": "1.0.1" + }, + "dependencies": { + "resolve-from": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-1.0.1.tgz", + "integrity": "sha1-Jsv+k10a7uq7Kbw/5a6wHpPUQiY=", + "dev": true + } + } + }, + "requizzle": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/requizzle/-/requizzle-0.2.1.tgz", + "integrity": "sha1-aUPDUwxNmn5G8c3dUcFY/GcM294=", + "dev": true, + "requires": { + "underscore": "1.6.0" + }, + "dependencies": { + "underscore": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.6.0.tgz", + "integrity": "sha1-izixDKze9jM3uLJOT/htRa6lKag=", + "dev": true + } + } + }, + "resolve": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.4.0.tgz", + "integrity": "sha512-aW7sVKPufyHqOmyyLzg/J+8606v5nevBgaliIlV7nUpVMsDnoBGV/cbSLNjZAg9q0Cfd/+easKVKQ8vOu8fn1Q==", + "dev": true, + "requires": { + "path-parse": "1.0.5" + } + }, + "resolve-from": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-2.0.0.tgz", + "integrity": "sha1-lICrIOlP+h2egKgEx+oUdhGWa1c=" + }, + "restore-cursor": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-1.0.1.tgz", + "integrity": "sha1-NGYfRohjJ/7SmRR5FSJS35LapUE=", + "dev": true, + "requires": { + "exit-hook": "1.1.1", + "onetime": "1.1.0" + } + }, + "rimraf": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.1.tgz", + "integrity": "sha1-wjOOxkPfeht/5cVPqG9XQopV8z0=", + "dev": true, + "requires": { + "glob": "7.1.1" + } + }, + "rollup": { + "version": "0.47.6", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-0.47.6.tgz", + "integrity": "sha512-bH3eWh7MzbiKTQcHQN7Ievqbs/yY7T+ZcJYboBYkp7BkRlAr2DXHPfiqlvlEH/M95giEBpinHEi/s9CVIgYT6w==", + "dev": true + }, + "rollup-plugin-babel": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rollup-plugin-babel/-/rollup-plugin-babel-3.0.2.tgz", + "integrity": "sha512-ALGPBFtwJZcYHsNPM6RGJlEncTzAARPvZOGjNPZgDe5hS5t6sJGjiOWibEFVEz5LQN7S7spvCBILaS4N1Cql2w==", + "dev": true, + "requires": { + "rollup-pluginutils": "1.5.2" + } + }, + "rollup-pluginutils": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/rollup-pluginutils/-/rollup-pluginutils-1.5.2.tgz", + "integrity": "sha1-HhVud4+UtyVb+hs9AXi+j1xVJAg=", + "dev": true, + "requires": { + "estree-walker": "0.2.1", + "minimatch": "3.0.4" + } + }, + "run-async": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/run-async/-/run-async-0.1.0.tgz", + "integrity": "sha1-yK1KXhEGYeQCp9IbUw4AnyX444k=", + "dev": true, + "requires": { + "once": "1.4.0" + } + }, + "run-parallel": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.1.6.tgz", + "integrity": "sha1-KQA8miFj4B4tLfyQV18sbB1hoDk=", + "dev": true + }, + "rx-lite": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/rx-lite/-/rx-lite-3.1.2.tgz", + "integrity": "sha1-Gc5QLKVyZl87ZHsQk5+X/RYV8QI=", + "dev": true + }, + "safe-buffer": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz", + "integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg==" + }, + "samsam": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/samsam/-/samsam-1.2.1.tgz", + "integrity": "sha1-7dOQk6MYQ3DLhZJDsr3yVefY6mc=" + }, + "sanitize-html": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/sanitize-html/-/sanitize-html-1.14.1.tgz", + "integrity": "sha1-cw/6Ikm98YMz7/5FsoYXPJxa0Lg=", + "dev": true, + "requires": { + "htmlparser2": "3.9.2", + "regexp-quote": "0.0.0", + "xtend": "4.0.1" + } + }, + "semver": { + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.4.1.tgz", + "integrity": "sha512-WfG/X9+oATh81XtllIo/I8gOiY9EXRdv1cQdyykeXK17YcUW3EXUAi2To4pcH6nZtJPr7ZOpM5OMyWJZm+8Rsg==" + }, + "semver-diff": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/semver-diff/-/semver-diff-2.1.0.tgz", + "integrity": "sha1-S7uEN8jTfksM8aaP1ybsbWRdbTY=", + "dev": true, + "requires": { + "semver": "5.4.1" + } + }, + "semver-utils": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/semver-utils/-/semver-utils-1.1.1.tgz", + "integrity": "sha1-J9kv7DTSfPpCcH07QNAlrphV8t8=", + "dev": true + }, + "shelljs": { + "version": "0.7.8", + "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.7.8.tgz", + "integrity": "sha1-3svPh0sNHl+3LhSxZKloMEjprLM=", + "dev": true, + "requires": { + "glob": "7.1.1", + "interpret": "1.0.3", + "rechoir": "0.6.2" + } + }, + "sinon": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/sinon/-/sinon-3.2.1.tgz", + "integrity": "sha512-KY3OLOWpek/I4NGAMHetuutVgS2aRgMR5g5/1LSYvPJ3qo2BopIvk3esFztPxF40RWf/NNNJzdFPriSkXUVK3A==", + "dev": true, + "requires": { + "diff": "3.2.0", + "formatio": "1.2.0", + "lolex": "2.1.2", + "native-promise-only": "0.8.1", + "nise": "1.0.1", + "path-to-regexp": "1.7.0", + "samsam": "1.2.1", + "text-encoding": "0.6.4", + "type-detect": "4.0.3" + }, + "dependencies": { + "lolex": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/lolex/-/lolex-2.1.2.tgz", + "integrity": "sha1-JpS5U8nqTQE+W4v7qJHJkQJbJik=", + "dev": true + } + } + }, + "slash": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz", + "integrity": "sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU=", + "dev": true + }, + "slice-ansi": { + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-0.0.4.tgz", + "integrity": "sha1-7b+JA/ZvfOL46v1s7tZeJkyDGzU=", + "dev": true + }, + "slide": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/slide/-/slide-1.1.6.tgz", + "integrity": "sha1-VusCfWW00tzmyy4tMsTUr8nh1wc=", + "dev": true + }, + "source-map": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.6.tgz", + "integrity": "sha1-dc449SvwczxafwwRjYEzSiu19BI=", + "dev": true + }, + "source-map-support": { + "version": "0.4.16", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.4.16.tgz", + "integrity": "sha512-A6vlydY7H/ljr4L2UOhDSajQdZQ6dMD7cLH0pzwcmwLyc9u8PNI4WGtnfDDzX7uzGL6c/T+ORL97Zlh+S4iOrg==", + "dev": true, + "requires": { + "source-map": "0.5.6" + } + }, + "spawn-please": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/spawn-please/-/spawn-please-0.2.0.tgz", + "integrity": "sha1-vdhZkbgECfnA2scJvESgoxipdg0=", + "dev": true + }, + "sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", + "dev": true + }, + "standard": { + "version": "10.0.3", + "resolved": "https://registry.npmjs.org/standard/-/standard-10.0.3.tgz", + "integrity": "sha512-JURZ+85ExKLQULckDFijdX5WHzN6RC7fgiZNSV4jFQVo+3tPoQGHyBrGekye/yf0aOfb4210EM5qPNlc2cRh4w==", + "dev": true, + "requires": { + "eslint": "3.19.0", + "eslint-config-standard": "10.2.1", + "eslint-config-standard-jsx": "4.0.2", + "eslint-plugin-import": "2.2.0", + "eslint-plugin-node": "4.2.3", + "eslint-plugin-promise": "3.5.0", + "eslint-plugin-react": "6.10.3", + "eslint-plugin-standard": "3.0.1", + "standard-engine": "7.0.0" + }, + "dependencies": { + "doctrine": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.0.0.tgz", + "integrity": "sha1-xz2NKQnSIpHhoAejlYBNqLZl/mM=", + "dev": true, + "requires": { + "esutils": "2.0.2", + "isarray": "1.0.0" + } + }, + "eslint": { + "version": "3.19.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-3.19.0.tgz", + "integrity": "sha1-yPxiAcf0DdCJQbh8CFdnOGpnmsw=", + "dev": true, + "requires": { + "babel-code-frame": "6.26.0", + "chalk": "1.1.3", + "concat-stream": "1.6.0", + "debug": "2.6.8", + "doctrine": "2.0.0", + "escope": "3.6.0", + "espree": "3.5.0", + "esquery": "1.0.0", + "estraverse": "4.2.0", + "esutils": "2.0.2", + "file-entry-cache": "2.0.0", + "glob": "7.1.1", + "globals": "9.18.0", + "ignore": "3.3.3", + "imurmurhash": "0.1.4", + "inquirer": "0.12.0", + "is-my-json-valid": "2.16.0", + "is-resolvable": "1.0.0", + "js-yaml": "3.9.1", + "json-stable-stringify": "1.0.1", + "levn": "0.3.0", + "lodash": "4.17.4", + "mkdirp": "0.5.1", + "natural-compare": "1.4.0", + "optionator": "0.8.2", + "path-is-inside": "1.0.2", + "pluralize": "1.2.1", + "progress": "1.1.8", + "require-uncached": "1.0.3", + "shelljs": "0.7.8", + "strip-bom": "3.0.0", + "strip-json-comments": "2.0.1", + "table": "3.8.3", + "text-table": "0.2.0", + "user-home": "2.0.0" + } + }, + "eslint-config-standard": { + "version": "10.2.1", + "resolved": "https://registry.npmjs.org/eslint-config-standard/-/eslint-config-standard-10.2.1.tgz", + "integrity": "sha1-wGHk0GbzedwXzVYsZOgZtN1FRZE=", + "dev": true + }, + "eslint-config-standard-jsx": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/eslint-config-standard-jsx/-/eslint-config-standard-jsx-4.0.2.tgz", + "integrity": "sha512-F8fRh2WFnTek7dZH9ZaE0PCBwdVGkwVWZmizla/DDNOmg7Tx6B/IlK5+oYpiX29jpu73LszeJj5i1axEZv6VMw==", + "dev": true + }, + "eslint-plugin-promise": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-promise/-/eslint-plugin-promise-3.5.0.tgz", + "integrity": "sha1-ePu2/+BHIBYnVp6FpsU3OvKmj8o=", + "dev": true + }, + "eslint-plugin-react": { + "version": "6.10.3", + "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-6.10.3.tgz", + "integrity": "sha1-xUNb6wZ3ThLH2y9qut3L+QDNP3g=", + "dev": true, + "requires": { + "array.prototype.find": "2.0.4", + "doctrine": "1.5.0", + "has": "1.0.1", + "jsx-ast-utils": "1.4.1", + "object.assign": "4.0.4" + }, + "dependencies": { + "doctrine": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-1.5.0.tgz", + "integrity": "sha1-N53Ocw9hZvds76TmcHoVmwLFpvo=", + "dev": true, + "requires": { + "esutils": "2.0.2", + "isarray": "1.0.0" + } + } + } + }, + "eslint-plugin-standard": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-standard/-/eslint-plugin-standard-3.0.1.tgz", + "integrity": "sha1-NNDJFbRe3G8BA5PH7vOCOwhWXPI=", + "dev": true + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + }, + "minimist": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", + "dev": true + }, + "standard-engine": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/standard-engine/-/standard-engine-7.0.0.tgz", + "integrity": "sha1-67d7nI/CyBZf+jU72Rug3/Qa9pA=", + "dev": true, + "requires": { + "deglob": "2.1.0", + "get-stdin": "5.0.1", + "minimist": "1.2.0", + "pkg-conf": "2.0.0" + } + } + } + }, + "standard-engine": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/standard-engine/-/standard-engine-5.2.0.tgz", + "integrity": "sha1-QAZgrlrM6K/U22D/IhSpGQrXkKM=", + "dev": true, + "requires": { + "deglob": "2.1.0", + "find-root": "1.1.0", + "get-stdin": "5.0.1", + "home-or-tmp": "2.0.0", + "minimist": "1.2.0", + "pkg-config": "1.1.1" + }, + "dependencies": { + "minimist": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", + "dev": true + } + } + }, + "string_decoder": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz", + "integrity": "sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ==", + "requires": { + "safe-buffer": "5.1.1" + } + }, + "string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "dev": true, + "requires": { + "code-point-at": "1.1.0", + "is-fullwidth-code-point": "1.0.0", + "strip-ansi": "3.0.1" + } + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "requires": { + "ansi-regex": "2.1.1" + } + }, + "strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", + "dev": true + }, + "strip-json-comments": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", + "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", + "dev": true + }, + "supports-color": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.1.2.tgz", + "integrity": "sha1-cqJiiU2dQIuVbKBf83su2KbiotU=", + "requires": { + "has-flag": "1.0.0" + } + }, + "table": { + "version": "3.8.3", + "resolved": "https://registry.npmjs.org/table/-/table-3.8.3.tgz", + "integrity": "sha1-K7xULw/amGGnVdOUf+/Ys/UThV8=", + "dev": true, + "requires": { + "ajv": "4.11.8", + "ajv-keywords": "1.5.1", + "chalk": "1.1.3", + "lodash": "4.17.4", + "slice-ansi": "0.0.4", + "string-width": "2.1.1" + }, + "dependencies": { + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "dev": true + }, + "string-width": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "dev": true, + "requires": { + "is-fullwidth-code-point": "2.0.0", + "strip-ansi": "4.0.0" + } + }, + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "dev": true, + "requires": { + "ansi-regex": "3.0.0" + } + } + } + }, + "taffydb": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/taffydb/-/taffydb-2.6.2.tgz", + "integrity": "sha1-fLy2S1oUG2ou/CxdLGe04VCyomg=", + "dev": true + }, + "text-encoding": { + "version": "0.6.4", + "resolved": "https://registry.npmjs.org/text-encoding/-/text-encoding-0.6.4.tgz", + "integrity": "sha1-45mpgiV6J22uQou5KEXLcb3CbRk=" + }, + "text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", + "dev": true + }, + "through": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", + "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", + "dev": true + }, + "timed-out": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/timed-out/-/timed-out-3.1.3.tgz", + "integrity": "sha1-lYYL/MXHbCd/j4Mm/Q9bLiDrohc=", + "dev": true + }, + "to-fast-properties": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-1.0.3.tgz", + "integrity": "sha1-uDVx+k2MJbguIxsG46MFXeTKGkc=", + "dev": true + }, + "trim-right": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/trim-right/-/trim-right-1.0.1.tgz", + "integrity": "sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM=", + "dev": true + }, + "tryit": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/tryit/-/tryit-1.0.3.tgz", + "integrity": "sha1-OTvnMKlEb9Hq1tpZoBQwjzbCics=", + "dev": true + }, + "type-check": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", + "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", + "dev": true, + "requires": { + "prelude-ls": "1.1.2" + } + }, + "type-detect": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.3.tgz", + "integrity": "sha1-Dj8mcLRAmbC0bChNE2p+9Jx0wuo=" + }, + "typedarray": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", + "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=", + "dev": true + }, + "underscore": { + "version": "1.8.3", + "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.8.3.tgz", + "integrity": "sha1-Tz+1OxBuYJf8+ctBCfKl6b36UCI=", + "dev": true + }, + "underscore-contrib": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/underscore-contrib/-/underscore-contrib-0.3.0.tgz", + "integrity": "sha1-ZltmwkeD+PorGMn4y7Dix9SMJsc=", + "dev": true, + "requires": { + "underscore": "1.6.0" + }, + "dependencies": { + "underscore": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.6.0.tgz", + "integrity": "sha1-izixDKze9jM3uLJOT/htRa6lKag=", + "dev": true + } + } + }, + "uniq": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/uniq/-/uniq-1.0.1.tgz", + "integrity": "sha1-sxxa6CVIRKOoKBVBzisEuGWnNP8=", + "dev": true + }, + "unzip-response": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/unzip-response/-/unzip-response-1.0.2.tgz", + "integrity": "sha1-uYTwh3/AqJwsdzzB73tbIytbBv4=", + "dev": true + }, + "update-notifier": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-1.0.3.tgz", + "integrity": "sha1-j5LFFUgr1oMbfJMBPnD4dVLHz1o=", + "dev": true, + "requires": { + "boxen": "0.6.0", + "chalk": "1.1.3", + "configstore": "2.1.0", + "is-npm": "1.0.0", + "latest-version": "2.0.0", + "lazy-req": "1.1.0", + "semver-diff": "2.1.0", + "xdg-basedir": "2.0.0" + } + }, + "url-parse-lax": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-1.0.0.tgz", + "integrity": "sha1-evjzA2Rem9eaJy56FKxovAYJ2nM=", + "dev": true, + "requires": { + "prepend-http": "1.0.4" + } + }, + "user-home": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/user-home/-/user-home-2.0.0.tgz", + "integrity": "sha1-nHC/2Babwdy/SGBODwS4tJzenp8=", + "dev": true, + "requires": { + "os-homedir": "1.0.2" + } + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" + }, + "uuid": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-2.0.3.tgz", + "integrity": "sha1-Z+LoY3lyFVMN/zGOW/nc6/1Hsho=", + "dev": true + }, + "widest-line": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-1.0.0.tgz", + "integrity": "sha1-DAnIXCqUaD0Nfq+O4JfVZL8OEFw=", + "dev": true, + "requires": { + "string-width": "1.0.2" + } + }, + "wordwrap": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", + "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=", + "dev": true + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" + }, + "write": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/write/-/write-0.2.1.tgz", + "integrity": "sha1-X8A4KOJkzqP+kUVUdvejxWbLB1c=", + "dev": true, + "requires": { + "mkdirp": "0.5.1" + } + }, + "write-file-atomic": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-1.3.4.tgz", + "integrity": "sha1-+Aek8LHZ6ROuekgRLmzDrxmRtF8=", + "dev": true, + "requires": { + "graceful-fs": "4.1.11", + "imurmurhash": "0.1.4", + "slide": "1.1.6" + } + }, + "xdg-basedir": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-2.0.0.tgz", + "integrity": "sha1-7byQPMOF/ARSPZZqM1UEtVBNG9I=", + "dev": true, + "requires": { + "os-homedir": "1.0.2" + } + }, + "xmlcreate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/xmlcreate/-/xmlcreate-1.0.2.tgz", + "integrity": "sha1-+mv3YqYKQT+z3Y9LA8WyaSONMI8=", + "dev": true + }, + "xtend": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz", + "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=", + "dev": true + } + } +} diff --git a/package.json b/package.json index df4d3c2..166ef5b 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "js-data-mongodb", "description": "MongoDB adapter for js-data.", - "version": "1.0.0-rc.2", + "version": "1.0.0", "homepage": "https://github.com/js-data/js-data-mongodb", "repository": { "type": "git", @@ -49,34 +49,37 @@ "mocha": "mocha -t 20000 -R dot -r babel-core/register -r babel-polyfill mocha.start.js", "cover": "nyc --require babel-core/register --require babel-polyfill --cache mocha -t 20000 -R dot mocha.start.js && nyc report --reporter=html", "test": "npm run build && npm run cover", - "release": "npm test && npm run doc && repo-tools updates && repo-tools changelog && repo-tools authors" + "release": "npm test && npm run doc && repo-tools changelog && repo-tools authors" }, "dependencies": { - "js-data-adapter": "~0.8.2", - "mout": "1.0.0" + "bson": ">=0.3.x", + "js-data": ">=3.0.0", + "js-data-adapter": "1.0.0", + "lodash.snakecase": "4.1.1", + "mongodb": ">=1.3.x" }, "peerDependencies": { "bson": ">=0.3.x", - "js-data": "^3.0.0-rc.9", + "js-data": ">=3.0.0", "mongodb": ">=1.3.x" }, "devDependencies": { - "babel-core": "6.24.1", + "babel-core": "6.26.0", "babel-eslint": "7.2.3", "babel-plugin-external-helpers": "6.22.0", "babel-plugin-syntax-async-functions": "6.13.0", - "babel-plugin-transform-regenerator": "6.24.1", - "babel-polyfill": "6.23.0", + "babel-plugin-transform-regenerator": "6.26.0", + "babel-polyfill": "6.26.0", "babel-preset-es2015": "6.24.1", - "chai": "3.5.0", + "chai": "4.1.1", "ink-docstrap": "git+https://github.com/js-data/docstrap.git#cfbe45fa313e1628c493076d5e15d2b855dfbf2c", "js-data-repo-tools": "1.0.0", - "jsdoc": "3.4.3", - "mocha": "3.4.2", - "nyc": "10.3.2", - "rollup": "0.41.6", - "rollup-plugin-babel": "2.7.1", - "sinon": "2.3.1", - "standard": "10.0.2" + "jsdoc": "3.5.4", + "mocha": "3.5.0", + "nyc": "11.1.0", + "rollup": "0.47.6", + "rollup-plugin-babel": "3.0.2", + "sinon": "3.2.1", + "standard": "10.0.3" } } diff --git a/src/index.js b/src/index.js index 7ffed98..0f46771 100644 --- a/src/index.js +++ b/src/index.js @@ -5,7 +5,7 @@ import { Adapter, reserved } from 'js-data-adapter' -import underscore from 'mout/string/underscore' +import snakeCase from 'lodash.snakecase' const DEFAULTS = { /** @@ -543,6 +543,8 @@ Adapter.extend({ }).then((record) => { if (record) { this._translateObjectIDs(record, opts) + } else { + record = undefined } return [record, {}] }) @@ -597,7 +599,7 @@ Adapter.extend({ _getCollectionId (mapper, opts) { opts || (opts = {}) - return opts.table || opts.collection || mapper.table || mapper.collection || underscore(mapper.name) + return opts.table || opts.collection || mapper.table || mapper.collection || snakeCase(mapper.name) }, _getFields (mapper, opts) { diff --git a/yarn.lock b/yarn.lock index 963825b..cc01af3 100644 --- a/yarn.lock +++ b/yarn.lock @@ -12,7 +12,7 @@ acorn-jsx@^3.0.0: dependencies: acorn "^3.0.4" -acorn@^3.0.4, acorn@^3.3.0: +acorn@^3.0.4: version "3.3.0" resolved "https://registry.yarnpkg.com/acorn/-/acorn-3.3.0.tgz#45e37fb39e8da3f25baee3ff5369e2bb5f22017a" @@ -182,29 +182,37 @@ babel-code-frame@^6.16.0, babel-code-frame@^6.22.0: esutils "^2.0.2" js-tokens "^3.0.0" -babel-core@6, babel-core@6.24.1, babel-core@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-core/-/babel-core-6.24.1.tgz#8c428564dce1e1f41fb337ec34f4c3b022b5ad83" +babel-code-frame@^6.26.0: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-code-frame/-/babel-code-frame-6.26.0.tgz#63fd43f7dc1e3bb7ce35947db8fe369a3f58c74b" dependencies: - babel-code-frame "^6.22.0" - babel-generator "^6.24.1" + chalk "^1.1.3" + esutils "^2.0.2" + js-tokens "^3.0.2" + +babel-core@6.26.0, babel-core@^6.26.0: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-core/-/babel-core-6.26.0.tgz#af32f78b31a6fcef119c87b0fd8d9753f03a0bb8" + dependencies: + babel-code-frame "^6.26.0" + babel-generator "^6.26.0" babel-helpers "^6.24.1" babel-messages "^6.23.0" - babel-register "^6.24.1" - babel-runtime "^6.22.0" - babel-template "^6.24.1" - babel-traverse "^6.24.1" - babel-types "^6.24.1" - babylon "^6.11.0" - convert-source-map "^1.1.0" - debug "^2.1.1" - json5 "^0.5.0" - lodash "^4.2.0" - minimatch "^3.0.2" - path-is-absolute "^1.0.0" - private "^0.1.6" + babel-register "^6.26.0" + babel-runtime "^6.26.0" + babel-template "^6.26.0" + babel-traverse "^6.26.0" + babel-types "^6.26.0" + babylon "^6.18.0" + convert-source-map "^1.5.0" + debug "^2.6.8" + json5 "^0.5.1" + lodash "^4.17.4" + minimatch "^3.0.4" + path-is-absolute "^1.0.1" + private "^0.1.7" slash "^1.0.0" - source-map "^0.5.0" + source-map "^0.5.6" babel-eslint@7.1.1: version "7.1.1" @@ -225,7 +233,7 @@ babel-eslint@7.2.3: babel-types "^6.23.0" babylon "^6.17.0" -babel-generator@^6.18.0, babel-generator@^6.24.1: +babel-generator@^6.18.0: version "6.24.1" resolved "https://registry.yarnpkg.com/babel-generator/-/babel-generator-6.24.1.tgz#e715f486c58ded25649d888944d52aa07c5d9497" dependencies: @@ -238,6 +246,19 @@ babel-generator@^6.18.0, babel-generator@^6.24.1: source-map "^0.5.0" trim-right "^1.0.1" +babel-generator@^6.26.0: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-generator/-/babel-generator-6.26.0.tgz#ac1ae20070b79f6e3ca1d3269613053774f20dc5" + dependencies: + babel-messages "^6.23.0" + babel-runtime "^6.26.0" + babel-types "^6.26.0" + detect-indent "^4.0.0" + jsesc "^1.3.0" + lodash "^4.17.4" + source-map "^0.5.6" + trim-right "^1.0.1" + babel-helper-call-delegate@^6.24.1: version "6.24.1" resolved "https://registry.yarnpkg.com/babel-helper-call-delegate/-/babel-helper-call-delegate-6.24.1.tgz#ece6aacddc76e41c3461f88bfc575bd0daa2df8d" @@ -357,7 +378,7 @@ babel-plugin-transform-es2015-block-scoping@^6.24.1: babel-types "^6.24.1" lodash "^4.2.0" -babel-plugin-transform-es2015-classes@^6.24.1, babel-plugin-transform-es2015-classes@^6.9.0: +babel-plugin-transform-es2015-classes@^6.24.1: version "6.24.1" resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-classes/-/babel-plugin-transform-es2015-classes-6.24.1.tgz#5a4c58a50c9c9461e564b4b2a3bfabc97a2584db" dependencies: @@ -503,7 +524,13 @@ babel-plugin-transform-es2015-unicode-regex@^6.24.1: babel-runtime "^6.22.0" regexpu-core "^2.0.0" -babel-plugin-transform-regenerator@6.24.1, babel-plugin-transform-regenerator@^6.24.1: +babel-plugin-transform-regenerator@6.26.0: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-regenerator/-/babel-plugin-transform-regenerator-6.26.0.tgz#e0703696fbde27f0a3efcacf8b4dca2f7b3a8f2f" + dependencies: + regenerator-transform "^0.10.0" + +babel-plugin-transform-regenerator@^6.24.1: version "6.24.1" resolved "https://registry.yarnpkg.com/babel-plugin-transform-regenerator/-/babel-plugin-transform-regenerator-6.24.1.tgz#b8da305ad43c3c99b4848e4fe4037b770d23c418" dependencies: @@ -516,13 +543,13 @@ babel-plugin-transform-strict-mode@^6.24.1: babel-runtime "^6.22.0" babel-types "^6.24.1" -babel-polyfill@6.23.0: - version "6.23.0" - resolved "https://registry.yarnpkg.com/babel-polyfill/-/babel-polyfill-6.23.0.tgz#8364ca62df8eafb830499f699177466c3b03499d" +babel-polyfill@6.26.0: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-polyfill/-/babel-polyfill-6.26.0.tgz#379937abc67d7895970adc621f284cd966cf2153" dependencies: - babel-runtime "^6.22.0" - core-js "^2.4.0" - regenerator-runtime "^0.10.0" + babel-runtime "^6.26.0" + core-js "^2.5.0" + regenerator-runtime "^0.10.5" babel-preset-es2015@6.24.1: version "6.24.1" @@ -553,17 +580,17 @@ babel-preset-es2015@6.24.1: babel-plugin-transform-es2015-unicode-regex "^6.24.1" babel-plugin-transform-regenerator "^6.24.1" -babel-register@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-register/-/babel-register-6.24.1.tgz#7e10e13a2f71065bdfad5a1787ba45bca6ded75f" +babel-register@^6.26.0: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-register/-/babel-register-6.26.0.tgz#6ed021173e2fcb486d7acb45c6009a856f647071" dependencies: - babel-core "^6.24.1" - babel-runtime "^6.22.0" - core-js "^2.4.0" + babel-core "^6.26.0" + babel-runtime "^6.26.0" + core-js "^2.5.0" home-or-tmp "^2.0.0" - lodash "^4.2.0" + lodash "^4.17.4" mkdirp "^0.5.1" - source-map-support "^0.4.2" + source-map-support "^0.4.15" babel-runtime@^6.18.0, babel-runtime@^6.22.0: version "6.23.0" @@ -572,6 +599,13 @@ babel-runtime@^6.18.0, babel-runtime@^6.22.0: core-js "^2.4.0" regenerator-runtime "^0.10.0" +babel-runtime@^6.26.0: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-runtime/-/babel-runtime-6.26.0.tgz#965c7058668e82b55d7bfe04ff2337bc8b5647fe" + dependencies: + core-js "^2.4.0" + regenerator-runtime "^0.11.0" + babel-template@^6.16.0, babel-template@^6.24.1: version "6.24.1" resolved "https://registry.yarnpkg.com/babel-template/-/babel-template-6.24.1.tgz#04ae514f1f93b3a2537f2a0f60a5a45fb8308333" @@ -582,6 +616,16 @@ babel-template@^6.16.0, babel-template@^6.24.1: babylon "^6.11.0" lodash "^4.2.0" +babel-template@^6.26.0: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-template/-/babel-template-6.26.0.tgz#de03e2d16396b069f46dd9fff8521fb1a0e35e02" + dependencies: + babel-runtime "^6.26.0" + babel-traverse "^6.26.0" + babel-types "^6.26.0" + babylon "^6.18.0" + lodash "^4.17.4" + babel-traverse@^6.15.0, babel-traverse@^6.18.0, babel-traverse@^6.23.1, babel-traverse@^6.24.1: version "6.24.1" resolved "https://registry.yarnpkg.com/babel-traverse/-/babel-traverse-6.24.1.tgz#ab36673fd356f9a0948659e7b338d5feadb31695" @@ -596,6 +640,20 @@ babel-traverse@^6.15.0, babel-traverse@^6.18.0, babel-traverse@^6.23.1, babel-tr invariant "^2.2.0" lodash "^4.2.0" +babel-traverse@^6.26.0: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-traverse/-/babel-traverse-6.26.0.tgz#46a9cbd7edcc62c8e5c064e2d2d8d0f4035766ee" + dependencies: + babel-code-frame "^6.26.0" + babel-messages "^6.23.0" + babel-runtime "^6.26.0" + babel-types "^6.26.0" + babylon "^6.18.0" + debug "^2.6.8" + globals "^9.18.0" + invariant "^2.2.2" + lodash "^4.17.4" + babel-types@^6.15.0, babel-types@^6.18.0, babel-types@^6.19.0, babel-types@^6.23.0, babel-types@^6.24.1: version "6.24.1" resolved "https://registry.yarnpkg.com/babel-types/-/babel-types-6.24.1.tgz#a136879dc15b3606bda0d90c1fc74304c2ff0975" @@ -605,10 +663,27 @@ babel-types@^6.15.0, babel-types@^6.18.0, babel-types@^6.19.0, babel-types@^6.23 lodash "^4.2.0" to-fast-properties "^1.0.1" +babel-types@^6.26.0: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-types/-/babel-types-6.26.0.tgz#a3b073f94ab49eb6fa55cd65227a334380632497" + dependencies: + babel-runtime "^6.26.0" + esutils "^2.0.2" + lodash "^4.17.4" + to-fast-properties "^1.0.3" + babylon@^6.11.0, babylon@^6.13.0, babylon@^6.15.0, babylon@^6.17.0: version "6.17.1" resolved "https://registry.yarnpkg.com/babylon/-/babylon-6.17.1.tgz#17f14fddf361b695981fe679385e4f1c01ebd86f" +babylon@^6.17.4, babylon@^6.18.0: + version "6.18.0" + resolved "https://registry.yarnpkg.com/babylon/-/babylon-6.18.0.tgz#af2f3b88fa6f5c1e4c634d1a0f8eac4f55b395e3" + +babylon@~7.0.0-beta.19: + version "7.0.0-beta.19" + resolved "https://registry.yarnpkg.com/babylon/-/babylon-7.0.0-beta.19.tgz#e928c7e807e970e0536b078ab3e0c48f9e052503" + balanced-match@^0.4.1: version "0.4.2" resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-0.4.2.tgz#cb3f3e3c732dc0f01ee70b403f302e61d7709838" @@ -631,10 +706,14 @@ block-stream@*: dependencies: inherits "~2.0.0" -bluebird@^3.4.3, bluebird@~3.4.6: +bluebird@^3.4.3: version "3.4.7" resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.4.7.tgz#f72d760be09b7f76d08ed8fae98b289a8d05fab3" +bluebird@~3.5.0: + version "3.5.0" + resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.5.0.tgz#791420d7f551eea2897453a8a77653f96606d67c" + boom@2.x.x: version "2.10.1" resolved "https://registry.yarnpkg.com/boom/-/boom-2.10.1.tgz#39c8918ceff5799f83f9492a848f625add0c766f" @@ -724,6 +803,10 @@ camelcase@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-3.0.0.tgz#32fc4b9fcdaf845fcdf7e73bb97cac2261f0ab0a" +camelcase@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-4.1.0.tgz#d545635be1e33c542649c69173e5de6acfae34dd" + capture-stack-trace@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/capture-stack-trace/-/capture-stack-trace-1.0.0.tgz#4a6fa07399c26bba47f0b2496b4d0fb408c5550d" @@ -732,9 +815,9 @@ caseless@~0.11.0: version "0.11.0" resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.11.0.tgz#715b96ea9841593cc33067923f5ec60ebda4f7d7" -catharsis@~0.8.8: - version "0.8.8" - resolved "https://registry.yarnpkg.com/catharsis/-/catharsis-0.8.8.tgz#693479f43aac549d806bd73e924cd0d944951a06" +catharsis@~0.8.9: + version "0.8.9" + resolved "https://registry.yarnpkg.com/catharsis/-/catharsis-0.8.9.tgz#98cc890ca652dd2ef0e70b37925310ff9e90fc8b" dependencies: underscore-contrib "~0.3.0" @@ -745,13 +828,16 @@ center-align@^0.1.1: align-text "^0.1.3" lazy-cache "^1.0.3" -chai@3.5.0, chai@^3.5.0: - version "3.5.0" - resolved "https://registry.yarnpkg.com/chai/-/chai-3.5.0.tgz#4d02637b067fe958bdbfdd3a40ec56fef7373247" +chai@4.1.1, chai@^4.0.2: + version "4.1.1" + resolved "https://registry.yarnpkg.com/chai/-/chai-4.1.1.tgz#66e21279e6f3c6415ff8231878227900e2171b39" dependencies: assertion-error "^1.0.1" - deep-eql "^0.1.3" - type-detect "^1.0.0" + check-error "^1.0.1" + deep-eql "^2.0.1" + get-func-name "^2.0.0" + pathval "^1.0.0" + type-detect "^4.0.0" chalk@^1.0.0, chalk@^1.1.0, chalk@^1.1.1, chalk@^1.1.3: version "1.1.3" @@ -763,6 +849,10 @@ chalk@^1.0.0, chalk@^1.1.0, chalk@^1.1.1, chalk@^1.1.3: strip-ansi "^3.0.0" supports-color "^2.0.0" +check-error@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/check-error/-/check-error-1.0.2.tgz#574d312edd88bb5dd8912e9286dd6c0aed4aac82" + chownr@~1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.0.1.tgz#e2a75042a9551908bebd25b8523d5f9769d79181" @@ -898,7 +988,7 @@ contains-path@^0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/contains-path/-/contains-path-0.1.0.tgz#fe8cf184ff6670b6baef01a9d4861a5cbec4120a" -convert-source-map@^1.1.0, convert-source-map@^1.3.0: +convert-source-map@^1.3.0, convert-source-map@^1.5.0: version "1.5.0" resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.5.0.tgz#9acd70851c6d5dfdd93d9282e5edf94a03ff46b5" @@ -906,6 +996,10 @@ core-js@^2.4.0: version "2.4.1" resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.4.1.tgz#4de911e667b0eae9124e34254b53aea6fc618d3e" +core-js@^2.5.0: + version "2.5.0" + resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.5.0.tgz#569c050918be6486b3837552028ae0466b717086" + core-util-is@~1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" @@ -923,6 +1017,14 @@ cross-spawn@^4: lru-cache "^4.0.1" which "^1.2.9" +cross-spawn@^5.0.1: + version "5.1.0" + resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-5.1.0.tgz#e8bd0efee58fcff6f8f94510a0a554bbfa235449" + dependencies: + lru-cache "^4.0.1" + shebang-command "^1.2.0" + which "^1.2.9" + cryptiles@2.x.x: version "2.0.5" resolved "https://registry.yarnpkg.com/cryptiles/-/cryptiles-2.0.5.tgz#3bdfecdc608147c1c67202fa291e7dca59eaa3b8" @@ -951,18 +1053,18 @@ debug@2.2.0: dependencies: ms "0.7.1" -debug@2.6.0, debug@^2.1.1, debug@^2.2.0: - version "2.6.0" - resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.0.tgz#bc596bcabe7617f11d9fa15361eded5608b8499b" - dependencies: - ms "0.7.2" - -debug@^2.6.3: +debug@2.6.8, debug@^2.6.3, debug@^2.6.8: version "2.6.8" resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.8.tgz#e731531ca2ede27d188222427da17821d68ff4fc" dependencies: ms "2.0.0" +debug@^2.1.1, debug@^2.2.0: + version "2.6.0" + resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.0.tgz#bc596bcabe7617f11d9fa15361eded5608b8499b" + dependencies: + ms "0.7.2" + debuglog@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/debuglog/-/debuglog-1.0.1.tgz#aa24ffb9ac3df9a2351837cfb2d279360cd78492" @@ -971,11 +1073,11 @@ decamelize@^1.0.0, decamelize@^1.1.1: version "1.2.0" resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" -deep-eql@^0.1.3: - version "0.1.3" - resolved "https://registry.yarnpkg.com/deep-eql/-/deep-eql-0.1.3.tgz#ef558acab8de25206cd713906d74e56930eb69f2" +deep-eql@^2.0.1: + version "2.0.2" + resolved "https://registry.yarnpkg.com/deep-eql/-/deep-eql-2.0.2.tgz#b1bac06e56f0a76777686d50c9feb75c2ed7679a" dependencies: - type-detect "0.1.1" + type-detect "^3.0.0" deep-extend@~0.4.0: version "0.4.2" @@ -1216,9 +1318,9 @@ eslint-config-standard-jsx@3.2.0: version "3.2.0" resolved "https://registry.yarnpkg.com/eslint-config-standard-jsx/-/eslint-config-standard-jsx-3.2.0.tgz#c240e26ed919a11a42aa4de8059472b38268d620" -eslint-config-standard-jsx@4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/eslint-config-standard-jsx/-/eslint-config-standard-jsx-4.0.1.tgz#cd4e463d0268e2d9e707f61f42f73f5b3333c642" +eslint-config-standard-jsx@4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/eslint-config-standard-jsx/-/eslint-config-standard-jsx-4.0.2.tgz#009e53c4ddb1e9ee70b4650ffe63a7f39f8836e1" eslint-config-standard@10.2.1: version "10.2.1" @@ -1387,13 +1489,6 @@ espree@^3.3.1, espree@^3.4.0: acorn "^5.0.1" acorn-jsx "^3.0.0" -espree@~3.1.7: - version "3.1.7" - resolved "https://registry.yarnpkg.com/espree/-/espree-3.1.7.tgz#fd5deec76a97a5120a9cd3a7cb1177a0923b11d2" - dependencies: - acorn "^3.3.0" - acorn-jsx "^3.0.0" - esprima@^3.1.1: version "3.1.3" resolved "https://registry.yarnpkg.com/esprima/-/esprima-3.1.3.tgz#fdca51cee6133895e3c88d535ce49dbff62a4633" @@ -1434,6 +1529,18 @@ event-emitter@~0.3.5: d "1" es5-ext "~0.10.14" +execa@^0.7.0: + version "0.7.0" + resolved "https://registry.yarnpkg.com/execa/-/execa-0.7.0.tgz#944becd34cc41ee32a63a9faf27ad5a65fc59777" + dependencies: + cross-spawn "^5.0.1" + get-stream "^3.0.0" + is-stream "^1.1.0" + npm-run-path "^2.0.0" + p-finally "^1.0.0" + signal-exit "^3.0.0" + strip-eof "^1.0.0" + exit-hook@^1.0.0: version "1.1.1" resolved "https://registry.yarnpkg.com/exit-hook/-/exit-hook-1.1.1.tgz#f05ca233b48c05d54fff07765df8507e95c02ff8" @@ -1516,14 +1623,14 @@ find-root@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/find-root/-/find-root-1.0.0.tgz#962ff211aab25c6520feeeb8d6287f8f6e95807a" -find-up@1.1.2, find-up@^1.0.0, find-up@^1.1.2: +find-up@1.1.2, find-up@^1.0.0: version "1.1.2" resolved "https://registry.yarnpkg.com/find-up/-/find-up-1.1.2.tgz#6b2e9822b1a2ce0a60ab64d610eccad53cb24d0f" dependencies: path-exists "^2.0.0" pinkie-promise "^2.0.0" -find-up@^2.0.0: +find-up@^2.0.0, find-up@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/find-up/-/find-up-2.1.0.tgz#45d1b7e506c717ddd482775a2b77920a3c0c57a7" dependencies: @@ -1552,7 +1659,7 @@ foreach@^2.0.5: version "2.0.5" resolved "https://registry.yarnpkg.com/foreach/-/foreach-2.0.5.tgz#0bee005018aeb260d0a3af3ae658dd0136ec1b99" -foreground-child@^1.3.3, foreground-child@^1.5.3: +foreground-child@^1.5.3, foreground-child@^1.5.6: version "1.5.6" resolved "https://registry.yarnpkg.com/foreground-child/-/foreground-child-1.5.6.tgz#4fd71ad2dfde96789b980a5c0a295937cb2f5ce9" dependencies: @@ -1571,13 +1678,7 @@ form-data@~2.0.0: combined-stream "^1.0.5" mime-types "^2.1.11" -formatio@1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/formatio/-/formatio-1.1.1.tgz#5ed3ccd636551097383465d996199100e86161e9" - dependencies: - samsam "~1.1" - -formatio@1.2.0: +formatio@1.2.0, formatio@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/formatio/-/formatio-1.2.0.tgz#f3b2167d9068c4698a8d51f4f760a39a54d818eb" dependencies: @@ -1673,10 +1774,18 @@ get-caller-file@^1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-1.0.2.tgz#f702e63127e7e231c160a80c1554acb70d5047e5" +get-func-name@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/get-func-name/-/get-func-name-2.0.0.tgz#ead774abee72e20409433a066366023dd6887a41" + get-stdin@^5.0.1: version "5.0.1" resolved "https://registry.yarnpkg.com/get-stdin/-/get-stdin-5.0.1.tgz#122e161591e21ff4c52530305693f20e6393a398" +get-stream@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-3.0.0.tgz#8e943d1358dc37555054ecbe2edb05aa174ede14" + getpass@^0.1.1: version "0.1.7" resolved "https://registry.yarnpkg.com/getpass/-/getpass-0.1.7.tgz#5eff8e3e684d569ae4cb2b1282604e8ba62149fa" @@ -1711,6 +1820,10 @@ globals@^9.0.0, globals@^9.14.0, globals@^9.2.0: version "9.17.0" resolved "https://registry.yarnpkg.com/globals/-/globals-9.17.0.tgz#0c0ca696d9b9bb694d2e5470bd37777caad50286" +globals@^9.18.0: + version "9.18.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-9.18.0.tgz#aa3896b3e69b487f17e31ed2143d69a8e30c2d8a" + globby@^5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/globby/-/globby-5.0.0.tgz#ebd84667ca0dbb330b99bcfc68eac2bc54370e0d" @@ -1859,7 +1972,7 @@ inflight@^1.0.4, inflight@~1.0.5: once "^1.3.0" wrappy "1" -inherits@2, inherits@2.0.1, inherits@^2.0.1: +inherits@2, inherits@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.1.tgz#b17d08d326b4423e568eff719f91b0b1cbdf69f1" @@ -1913,7 +2026,7 @@ interpret@^1.0.0: version "1.0.3" resolved "https://registry.yarnpkg.com/interpret/-/interpret-1.0.3.tgz#cbc35c62eeee73f19ab7b10a801511401afc0f90" -invariant@^2.2.0: +invariant@^2.2.0, invariant@^2.2.2: version "2.2.2" resolved "https://registry.yarnpkg.com/invariant/-/invariant-2.2.2.tgz#9e1f56ac0acdb6bf303306f338be3b204ae60360" dependencies: @@ -2056,7 +2169,7 @@ is-retry-allowed@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/is-retry-allowed/-/is-retry-allowed-1.1.0.tgz#11a060568b67339444033d0125a61a20d564fb34" -is-stream@^1.0.0: +is-stream@^1.0.0, is-stream@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44" @@ -2094,50 +2207,50 @@ isstream@~0.1.2: version "0.1.2" resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a" -istanbul-lib-coverage@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/istanbul-lib-coverage/-/istanbul-lib-coverage-1.1.0.tgz#caca19decaef3525b5d6331d701f3f3b7ad48528" +istanbul-lib-coverage@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/istanbul-lib-coverage/-/istanbul-lib-coverage-1.1.1.tgz#73bfb998885299415c93d38a3e9adf784a77a9da" -istanbul-lib-hook@^1.0.6: - version "1.0.6" - resolved "https://registry.yarnpkg.com/istanbul-lib-hook/-/istanbul-lib-hook-1.0.6.tgz#c0866d1e81cf2d5319249510131fc16dee49231f" +istanbul-lib-hook@^1.0.7: + version "1.0.7" + resolved "https://registry.yarnpkg.com/istanbul-lib-hook/-/istanbul-lib-hook-1.0.7.tgz#dd6607f03076578fe7d6f2a630cf143b49bacddc" dependencies: append-transform "^0.4.0" -istanbul-lib-instrument@^1.7.1: - version "1.7.1" - resolved "https://registry.yarnpkg.com/istanbul-lib-instrument/-/istanbul-lib-instrument-1.7.1.tgz#169e31bc62c778851a99439dd99c3cc12184d360" +istanbul-lib-instrument@^1.7.4: + version "1.7.4" + resolved "https://registry.yarnpkg.com/istanbul-lib-instrument/-/istanbul-lib-instrument-1.7.4.tgz#e9fd920e4767f3d19edc765e2d6b3f5ccbd0eea8" dependencies: babel-generator "^6.18.0" babel-template "^6.16.0" babel-traverse "^6.18.0" babel-types "^6.18.0" - babylon "^6.13.0" - istanbul-lib-coverage "^1.1.0" + babylon "^6.17.4" + istanbul-lib-coverage "^1.1.1" semver "^5.3.0" -istanbul-lib-report@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/istanbul-lib-report/-/istanbul-lib-report-1.1.0.tgz#444c4ecca9afa93cf584f56b10f195bf768c0770" +istanbul-lib-report@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/istanbul-lib-report/-/istanbul-lib-report-1.1.1.tgz#f0e55f56655ffa34222080b7a0cd4760e1405fc9" dependencies: - istanbul-lib-coverage "^1.1.0" + istanbul-lib-coverage "^1.1.1" mkdirp "^0.5.1" path-parse "^1.0.5" supports-color "^3.1.2" -istanbul-lib-source-maps@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/istanbul-lib-source-maps/-/istanbul-lib-source-maps-1.2.0.tgz#8c7706d497e26feeb6af3e0c28fd5b0669598d0e" +istanbul-lib-source-maps@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/istanbul-lib-source-maps/-/istanbul-lib-source-maps-1.2.1.tgz#a6fe1acba8ce08eebc638e572e294d267008aa0c" dependencies: debug "^2.6.3" - istanbul-lib-coverage "^1.1.0" + istanbul-lib-coverage "^1.1.1" mkdirp "^0.5.1" rimraf "^2.6.1" source-map "^0.5.3" -istanbul-reports@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/istanbul-reports/-/istanbul-reports-1.1.0.tgz#1ef3b795889219cfb5fad16365f6ce108d5f8c66" +istanbul-reports@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/istanbul-reports/-/istanbul-reports-1.1.1.tgz#042be5c89e175bc3f86523caab29c014e77fee4e" dependencies: handlebars "^4.0.3" @@ -2151,13 +2264,14 @@ jodid25519@^1.0.0: dependencies: jsbn "~0.1.0" -js-data-adapter@~0.8.2: - version "0.8.3" - resolved "https://registry.yarnpkg.com/js-data-adapter/-/js-data-adapter-0.8.3.tgz#0ed7a0eac3003201a9958f00093bd0430168f7c3" +js-data-adapter@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/js-data-adapter/-/js-data-adapter-1.0.0.tgz#11c8a6b916015c06277c5b0d439a848f242575f8" dependencies: - chai "^3.5.0" - mocha "^3.1.2" - sinon "^1.17.6" + chai "^4.0.2" + js-data ">= 3.0.0" + mocha "^3.4.2" + sinon "^2.3.6" js-data-repo-tools@1.0.0: version "1.0.0" @@ -2169,14 +2283,18 @@ js-data-repo-tools@1.0.0: npm-check-updates "2.8.9" standard "8.6.0" -js-data@^3.0.0-rc.9: - version "3.0.0-rc.9" - resolved "https://registry.yarnpkg.com/js-data/-/js-data-3.0.0-rc.9.tgz#d447382444416d66daef845f1916fd0280bb7590" +"js-data@>= 3.0.0", js-data@>=3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/js-data/-/js-data-3.0.0.tgz#59628af903fac61cec99a7dad2db6a076f51c6ef" js-tokens@^3.0.0: version "3.0.1" resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-3.0.1.tgz#08e9f132484a2c45a30907e9dc4d5567b7f114d7" +js-tokens@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-3.0.2.tgz#9866df395102130e38f7f996bceb65443209c25b" + js-yaml@^3.5.1: version "3.8.4" resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.8.4.tgz#520b4564f86573ba96662af85a8cafa7b4b5a6f6" @@ -2184,24 +2302,26 @@ js-yaml@^3.5.1: argparse "^1.0.7" esprima "^3.1.1" -js2xmlparser@~1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/js2xmlparser/-/js2xmlparser-1.0.0.tgz#5a170f2e8d6476ce45405e04823242513782fe30" +js2xmlparser@~3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/js2xmlparser/-/js2xmlparser-3.0.0.tgz#3fb60eaa089c5440f9319f51760ccd07e2499733" + dependencies: + xmlcreate "^1.0.1" jsbn@~0.1.0: version "0.1.1" resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513" -jsdoc@3.4.3: - version "3.4.3" - resolved "https://registry.yarnpkg.com/jsdoc/-/jsdoc-3.4.3.tgz#e5740d6145c681f6679e6c17783a88dbdd97ccd3" +jsdoc@3.5.4: + version "3.5.4" + resolved "https://registry.yarnpkg.com/jsdoc/-/jsdoc-3.5.4.tgz#ceeef7c4bac4335cb10ff41e3a0f58939a534428" dependencies: - bluebird "~3.4.6" - catharsis "~0.8.8" + babylon "~7.0.0-beta.19" + bluebird "~3.5.0" + catharsis "~0.8.9" escape-string-regexp "~1.0.5" - espree "~3.1.7" - js2xmlparser "~1.0.0" - klaw "~1.3.0" + js2xmlparser "~3.0.0" + klaw "~2.0.0" marked "~0.3.6" mkdirp "~0.5.1" requizzle "~0.2.1" @@ -2241,7 +2361,7 @@ json3@3.3.2: version "3.3.2" resolved "https://registry.yarnpkg.com/json3/-/json3-3.3.2.tgz#3c0434743df93e2f5c42aee7b19bcb483575f4e1" -json5@^0.5.0: +json5@^0.5.1: version "0.5.1" resolved "https://registry.yarnpkg.com/json5/-/json5-0.5.1.tgz#1eade7acc012034ad84e2396767ead9fa5495821" @@ -2266,16 +2386,20 @@ jsx-ast-utils@^1.3.3, jsx-ast-utils@^1.3.4: version "1.4.1" resolved "https://registry.yarnpkg.com/jsx-ast-utils/-/jsx-ast-utils-1.4.1.tgz#3867213e8dd79bf1e8f2300c0cfc1efb182c0df1" +just-extend@^1.1.22: + version "1.1.22" + resolved "https://registry.yarnpkg.com/just-extend/-/just-extend-1.1.22.tgz#3330af756cab6a542700c64b2e4e4aa062d52fff" + kind-of@^3.0.2: version "3.2.2" resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-3.2.2.tgz#31ea21a734bab9bbb0f32466d893aea51e4a3c64" dependencies: is-buffer "^1.1.5" -klaw@~1.3.0: - version "1.3.1" - resolved "https://registry.yarnpkg.com/klaw/-/klaw-1.3.1.tgz#4088433b46b3b1ba259d78785d8e96f73ba02439" - optionalDependencies: +klaw@~2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/klaw/-/klaw-2.0.0.tgz#59c128e0dc5ce410201151194eeb9cbf858650f6" + dependencies: graceful-fs "^4.1.9" latest-version@^2.0.0: @@ -2409,6 +2533,10 @@ lodash.pickby@^4.6.0: version "4.6.0" resolved "https://registry.yarnpkg.com/lodash.pickby/-/lodash.pickby-4.6.0.tgz#7dea21d8c18d7703a27c704c15d3b84a67e33aff" +lodash.snakecase@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/lodash.snakecase/-/lodash.snakecase-4.1.1.tgz#39d714a35357147837aefd64b5dcbb16becd8f8d" + lodash.union@~4.6.0: version "4.6.0" resolved "https://registry.yarnpkg.com/lodash.union/-/lodash.union-4.6.0.tgz#48bb5088409f16f1821666641c44dd1aaae3cd88" @@ -2421,18 +2549,18 @@ lodash.without@~4.4.0: version "4.4.0" resolved "https://registry.yarnpkg.com/lodash.without/-/lodash.without-4.4.0.tgz#3cd4574a00b67bae373a94b748772640507b7aac" -lodash@4.17.4, lodash@^4.0.0, lodash@^4.15.0, lodash@^4.2.0, lodash@^4.3.0: +lodash@4.17.4, lodash@^4.0.0, lodash@^4.15.0, lodash@^4.17.4, lodash@^4.2.0, lodash@^4.3.0: version "4.17.4" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.4.tgz#78203a4d1c328ae1d86dca6460e369b57f4055ae" -lolex@1.3.2: - version "1.3.2" - resolved "https://registry.yarnpkg.com/lolex/-/lolex-1.3.2.tgz#7c3da62ffcb30f0f5a80a2566ca24e45d8a01f31" - lolex@^1.6.0: version "1.6.0" resolved "https://registry.yarnpkg.com/lolex/-/lolex-1.6.0.tgz#3a9a0283452a47d7439e72731b9e07d7386e49f6" +lolex@^2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/lolex/-/lolex-2.1.2.tgz#2694b953c9ea4d013e5b8bfba891c991025b2629" + longest@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/longest/-/longest-1.0.1.tgz#30a0b2da38f73770e8294a0d22e6625ed77d0097" @@ -2468,6 +2596,12 @@ md5-o-matic@^0.1.1: version "0.1.1" resolved "https://registry.yarnpkg.com/md5-o-matic/-/md5-o-matic-0.1.1.tgz#822bccd65e117c514fab176b25945d54100a03c3" +mem@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/mem/-/mem-1.1.0.tgz#5edd52b485ca1d900fe64895505399a0dfa45f76" + dependencies: + mimic-fn "^1.0.0" + merge-source-map@^1.0.2: version "1.0.3" resolved "https://registry.yarnpkg.com/merge-source-map/-/merge-source-map-1.0.3.tgz#da1415f2722a5119db07b14c4f973410863a2abf" @@ -2502,7 +2636,11 @@ mime-types@^2.1.11, mime-types@~2.1.7: dependencies: mime-db "~1.27.0" -minimatch@^3.0.0, minimatch@^3.0.2, minimatch@^3.0.3: +mimic-fn@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-1.1.0.tgz#e667783d92e89dbd342818b5230b9d62a672ad18" + +minimatch@^3.0.0, minimatch@^3.0.2, minimatch@^3.0.3, minimatch@^3.0.4: version "3.0.4" resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" dependencies: @@ -2522,13 +2660,13 @@ mkdirp@0.5.1, "mkdirp@>=0.5 0", mkdirp@^0.5.0, mkdirp@^0.5.1, mkdirp@~0.5.0, mkd dependencies: minimist "0.0.8" -mocha@3.4.2, mocha@^3.1.2: - version "3.4.2" - resolved "https://registry.yarnpkg.com/mocha/-/mocha-3.4.2.tgz#d0ef4d332126dbf18d0d640c9b382dd48be97594" +mocha@3.5.0, mocha@^3.4.2: + version "3.5.0" + resolved "https://registry.yarnpkg.com/mocha/-/mocha-3.5.0.tgz#1328567d2717f997030f8006234bce9b8cd72465" dependencies: browser-stdout "1.3.0" commander "2.9.0" - debug "2.6.0" + debug "2.6.8" diff "3.2.0" escape-string-regexp "1.0.5" glob "7.1.1" @@ -2557,10 +2695,6 @@ mongodb@>=1.3.x: mongodb-core "2.1.11" readable-stream "2.2.7" -mout@1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/mout/-/mout-1.0.0.tgz#9bdf1d4af57d66d47cb353a6335a3281098e1501" - ms@0.7.1: version "0.7.1" resolved "https://registry.yarnpkg.com/ms/-/ms-0.7.1.tgz#9cd13c03adbff25b65effde7ce864ee952017098" @@ -2585,6 +2719,15 @@ natural-compare@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" +nise@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/nise/-/nise-1.0.1.tgz#0da92b10a854e97c0f496f6c2845a301280b3eef" + dependencies: + formatio "^1.2.0" + just-extend "^1.1.22" + lolex "^1.6.0" + path-to-regexp "^1.7.0" + node-alias@^1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/node-alias/-/node-alias-1.0.4.tgz#1f1b916b56b9ea241c0135f97ced6940f556f292" @@ -2700,6 +2843,12 @@ npm-registry-client@~7.2.1: optionalDependencies: npmlog "~2.0.0 || ~3.1.0" +npm-run-path@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-2.0.2.tgz#35a9232dfa35d7067b4cb2ddf2357b1871536c5f" + dependencies: + path-key "^2.0.0" + npm-user-validate@~0.1.5: version "0.1.5" resolved "https://registry.yarnpkg.com/npm-user-validate/-/npm-user-validate-0.1.5.tgz#52465d50c2d20294a57125b996baedbf56c5004b" @@ -2809,9 +2958,9 @@ number-is-nan@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d" -nyc@10.3.2: - version "10.3.2" - resolved "https://registry.yarnpkg.com/nyc/-/nyc-10.3.2.tgz#f27f4d91f2a9db36c24f574ff5c6efff0233de46" +nyc@11.1.0: + version "11.1.0" + resolved "https://registry.yarnpkg.com/nyc/-/nyc-11.1.0.tgz#d6b3c5e16892a25af63138ba484676aa8a22eda7" dependencies: archy "^1.0.0" arrify "^1.0.1" @@ -2820,15 +2969,15 @@ nyc@10.3.2: debug-log "^1.0.1" default-require-extensions "^1.0.0" find-cache-dir "^0.1.1" - find-up "^1.1.2" + find-up "^2.1.0" foreground-child "^1.5.3" glob "^7.0.6" - istanbul-lib-coverage "^1.1.0" - istanbul-lib-hook "^1.0.6" - istanbul-lib-instrument "^1.7.1" - istanbul-lib-report "^1.1.0" - istanbul-lib-source-maps "^1.2.0" - istanbul-reports "^1.1.0" + istanbul-lib-coverage "^1.1.1" + istanbul-lib-hook "^1.0.7" + istanbul-lib-instrument "^1.7.4" + istanbul-lib-report "^1.1.1" + istanbul-lib-source-maps "^1.2.1" + istanbul-reports "^1.1.1" md5-hex "^1.2.0" merge-source-map "^1.0.2" micromatch "^2.3.11" @@ -2836,9 +2985,9 @@ nyc@10.3.2: resolve-from "^2.0.0" rimraf "^2.5.4" signal-exit "^3.0.1" - spawn-wrap "1.2.4" - test-exclude "^4.1.0" - yargs "^7.1.0" + spawn-wrap "^1.3.8" + test-exclude "^4.1.1" + yargs "^8.0.1" yargs-parser "^5.0.0" oauth-sign@~0.8.1: @@ -2904,11 +3053,13 @@ os-homedir@^1.0.0, os-homedir@^1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/os-homedir/-/os-homedir-1.0.2.tgz#ffbc4988336e0e833de0c168c7ef152121aa7fb3" -os-locale@^1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/os-locale/-/os-locale-1.4.0.tgz#20f9f17ae29ed345e8bde583b13d2009803c14d9" +os-locale@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/os-locale/-/os-locale-2.1.0.tgz#42bc2900a6b5b8bd17376c8e882b65afccf24bf2" dependencies: + execa "^0.7.0" lcid "^1.0.0" + mem "^1.1.0" os-tmpdir@^1.0.0, os-tmpdir@^1.0.1: version "1.0.2" @@ -2921,6 +3072,10 @@ osenv@0, osenv@^0.1.0, osenv@~0.1.3: os-homedir "^1.0.0" os-tmpdir "^1.0.0" +p-finally@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/p-finally/-/p-finally-1.0.0.tgz#3fbcfb15b899a44123b34b6dcc18b724336a2cae" + p-limit@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-1.1.0.tgz#b07ff2d9a5d88bec806035895a2bab66a27988bc" @@ -2971,7 +3126,7 @@ path-exists@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515" -path-is-absolute@^1.0.0: +path-is-absolute@^1.0.0, path-is-absolute@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" @@ -2979,6 +3134,10 @@ path-is-inside@^1.0.1, path-is-inside@~1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/path-is-inside/-/path-is-inside-1.0.2.tgz#365417dede44430d1c11af61027facf074bdfc53" +path-key@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/path-key/-/path-key-2.0.1.tgz#411cadb574c5a140d3a4b1910d40d80cc9f40b40" + path-parse@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.5.tgz#3c1adf871ea9cd6c9431b6ea2bd74a0ff055c4c1" @@ -2997,6 +3156,16 @@ path-type@^1.0.0: pify "^2.0.0" pinkie-promise "^2.0.0" +path-type@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/path-type/-/path-type-2.0.0.tgz#f012ccb8415b7096fc2daa1054c3d72389594c73" + dependencies: + pify "^2.0.0" + +pathval@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/pathval/-/pathval-1.1.0.tgz#b942e6d4bde653005ef6b71361def8727d0645e0" + pify@^2.0.0: version "2.3.0" resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c" @@ -3054,7 +3223,7 @@ preserve@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/preserve/-/preserve-0.2.0.tgz#815ed1f6ebc65926f865b310c0713bcb3315ce4b" -private@^0.1.6: +private@^0.1.6, private@^0.1.7: version "0.1.7" resolved "https://registry.yarnpkg.com/private/-/private-0.1.7.tgz#68ce5e8a1ef0a23bb570cc28537b5332aba63ef1" @@ -3157,6 +3326,13 @@ read-pkg-up@^1.0.1: find-up "^1.0.0" read-pkg "^1.0.0" +read-pkg-up@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-2.0.0.tgz#6b72a8048984e0c41e79510fd5e9fa99b3b549be" + dependencies: + find-up "^2.0.0" + read-pkg "^2.0.0" + read-pkg@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-1.1.0.tgz#f5ffaa5ecd29cb31c0474bca7d756b6bb29e3f28" @@ -3165,6 +3341,14 @@ read-pkg@^1.0.0: normalize-package-data "^2.3.2" path-type "^1.0.0" +read-pkg@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-2.0.0.tgz#8ef1c0623c6a6db0dc6713c4bfac46332b2368f8" + dependencies: + load-json-file "^2.0.0" + normalize-package-data "^2.3.2" + path-type "^2.0.0" + read@1, read@~1.0.1, read@~1.0.7: version "1.0.7" resolved "https://registry.yarnpkg.com/read/-/read-1.0.7.tgz#b3da19bd052431a97671d44a42634adf710b40c4" @@ -3252,10 +3436,14 @@ regenerate@^1.2.1: version "1.3.2" resolved "https://registry.yarnpkg.com/regenerate/-/regenerate-1.3.2.tgz#d1941c67bad437e1be76433add5b385f95b19260" -regenerator-runtime@^0.10.0: +regenerator-runtime@^0.10.0, regenerator-runtime@^0.10.5: version "0.10.5" resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.10.5.tgz#336c3efc1220adcedda2c9fab67b5a7955a33658" +regenerator-runtime@^0.11.0: + version "0.11.0" + resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.11.0.tgz#7e54fe5b5ccd5d6624ea6255c3473be090b802e1" + regenerator-transform@0.9.11: version "0.9.11" resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.9.11.tgz#3a7d067520cb7b7176769eb5ff868691befe1283" @@ -3264,6 +3452,14 @@ regenerator-transform@0.9.11: babel-types "^6.19.0" private "^0.1.6" +regenerator-transform@^0.10.0: + version "0.10.1" + resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.10.1.tgz#1e4996837231da8b7f3cf4114d71b5691a0680dd" + dependencies: + babel-runtime "^6.18.0" + babel-types "^6.19.0" + private "^0.1.6" + regex-cache@^0.4.2: version "0.4.3" resolved "https://registry.yarnpkg.com/regex-cache/-/regex-cache-0.4.3.tgz#9b1a6c35d4d0dfcef5711ae651e8e9d3d7114145" @@ -3425,13 +3621,10 @@ rimraf@~2.5.4: dependencies: glob "^7.0.5" -rollup-plugin-babel@2.7.1: - version "2.7.1" - resolved "https://registry.yarnpkg.com/rollup-plugin-babel/-/rollup-plugin-babel-2.7.1.tgz#16528197b0f938a1536f44683c7a93d573182f57" +rollup-plugin-babel@3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/rollup-plugin-babel/-/rollup-plugin-babel-3.0.2.tgz#a2765dea0eaa8aece351c983573300d17497495b" dependencies: - babel-core "6" - babel-plugin-transform-es2015-classes "^6.9.0" - object-assign "^4.1.0" rollup-pluginutils "^1.5.0" rollup-pluginutils@^1.5.0: @@ -3441,11 +3634,9 @@ rollup-pluginutils@^1.5.0: estree-walker "^0.2.1" minimatch "^3.0.2" -rollup@0.41.6: - version "0.41.6" - resolved "https://registry.yarnpkg.com/rollup/-/rollup-0.41.6.tgz#e0d05497877a398c104d816d2733a718a7a94e2a" - dependencies: - source-map-support "^0.4.0" +rollup@0.47.6: + version "0.47.6" + resolved "https://registry.yarnpkg.com/rollup/-/rollup-0.47.6.tgz#83b90a1890dd3321a3f8d0b2bd216e88483f33de" run-async@^0.1.0: version "0.1.0" @@ -3465,10 +3656,6 @@ safe-buffer@^5.0.1: version "5.0.1" resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.0.1.tgz#d263ca54696cd8a306b5ca6551e92de57918fbe7" -samsam@1.1.2, samsam@~1.1: - version "1.1.2" - resolved "https://registry.yarnpkg.com/samsam/-/samsam-1.1.2.tgz#bec11fdc83a9fda063401210e40176c3024d1567" - samsam@1.x, samsam@^1.1.3: version "1.2.1" resolved "https://registry.yarnpkg.com/samsam/-/samsam-1.2.1.tgz#edd39093a3184370cb859243b2bdf255e7d8ea67" @@ -3510,6 +3697,16 @@ sha@~2.0.1: graceful-fs "^4.1.2" readable-stream "^2.0.2" +shebang-command@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-1.2.0.tgz#44aac65b695b03398968c39f363fee5deafdf1ea" + dependencies: + shebang-regex "^1.0.0" + +shebang-regex@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-1.0.0.tgz#da42f49740c0b42db2ca9728571cb190c98efea3" + shelljs@^0.7.5: version "0.7.7" resolved "https://registry.yarnpkg.com/shelljs/-/shelljs-0.7.7.tgz#b2f5c77ef97148f4b4f6e22682e10bba8667cff1" @@ -3518,35 +3715,36 @@ shelljs@^0.7.5: interpret "^1.0.0" rechoir "^0.6.2" -signal-exit@^2.0.0: - version "2.1.2" - resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-2.1.2.tgz#375879b1f92ebc3b334480d038dc546a6d558564" - -signal-exit@^3.0.0, signal-exit@^3.0.1: +signal-exit@^3.0.0, signal-exit@^3.0.1, signal-exit@^3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.2.tgz#b5fdc08f1287ea1178628e415e25132b73646c6d" -sinon@2.3.1: - version "2.3.1" - resolved "https://registry.yarnpkg.com/sinon/-/sinon-2.3.1.tgz#48c9c758b4d0bb86327486833f1c4298919ce9ee" +sinon@3.2.1: + version "3.2.1" + resolved "https://registry.yarnpkg.com/sinon/-/sinon-3.2.1.tgz#d8adabd900730fd497788a027049c64b08be91c2" dependencies: diff "^3.1.0" formatio "1.2.0" - lolex "^1.6.0" + lolex "^2.1.2" native-promise-only "^0.8.1" + nise "^1.0.1" path-to-regexp "^1.7.0" samsam "^1.1.3" text-encoding "0.6.4" type-detect "^4.0.0" -sinon@^1.17.6: - version "1.17.7" - resolved "https://registry.yarnpkg.com/sinon/-/sinon-1.17.7.tgz#4542a4f49ba0c45c05eb2e9dd9d203e2b8efe0bf" +sinon@^2.3.6: + version "2.4.1" + resolved "https://registry.yarnpkg.com/sinon/-/sinon-2.4.1.tgz#021fd64b54cb77d9d2fb0d43cdedfae7629c3a36" dependencies: - formatio "1.1.1" - lolex "1.3.2" - samsam "1.1.2" - util ">=0.10.3 <1" + diff "^3.1.0" + formatio "1.2.0" + lolex "^1.6.0" + native-promise-only "^0.8.1" + path-to-regexp "^1.7.0" + samsam "^1.1.3" + text-encoding "0.6.4" + type-detect "^4.0.0" slash@^1.0.0: version "1.0.0" @@ -3570,9 +3768,9 @@ sorted-object@~2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/sorted-object/-/sorted-object-2.0.1.tgz#7d631f4bd3a798a24af1dffcfbfe83337a5df5fc" -source-map-support@^0.4.0, source-map-support@^0.4.2: - version "0.4.15" - resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.4.15.tgz#03202df65c06d2bd8c7ec2362a193056fef8d3b1" +source-map-support@^0.4.15: + version "0.4.16" + resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.4.16.tgz#16fecf98212467d017d586a2af68d628b9421cd8" dependencies: source-map "^0.5.6" @@ -3590,15 +3788,15 @@ spawn-please@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/spawn-please/-/spawn-please-0.2.0.tgz#bdd85991b80409f9c0dac709bc44a0a318a9760d" -spawn-wrap@1.2.4: - version "1.2.4" - resolved "https://registry.yarnpkg.com/spawn-wrap/-/spawn-wrap-1.2.4.tgz#920eb211a769c093eebfbd5b0e7a5d2e68ab2e40" +spawn-wrap@^1.3.8: + version "1.3.8" + resolved "https://registry.yarnpkg.com/spawn-wrap/-/spawn-wrap-1.3.8.tgz#fa2a79b990cbb0bb0018dca6748d88367b19ec31" dependencies: - foreground-child "^1.3.3" + foreground-child "^1.5.6" mkdirp "^0.5.0" os-homedir "^1.0.1" rimraf "^2.3.3" - signal-exit "^2.0.0" + signal-exit "^3.0.2" which "^1.2.4" spdx-correct@~1.0.0: @@ -3654,13 +3852,13 @@ standard-engine@~7.0.0: minimist "^1.1.0" pkg-conf "^2.0.0" -standard@10.0.2: - version "10.0.2" - resolved "https://registry.yarnpkg.com/standard/-/standard-10.0.2.tgz#974c1c53cc865b075a4b576e78441e1695daaf7b" +standard@10.0.3: + version "10.0.3" + resolved "https://registry.yarnpkg.com/standard/-/standard-10.0.3.tgz#7869bcbf422bdeeaab689a1ffb1fea9677dd50ea" dependencies: eslint "~3.19.0" eslint-config-standard "10.2.1" - eslint-config-standard-jsx "4.0.1" + eslint-config-standard-jsx "4.0.2" eslint-plugin-import "~2.2.0" eslint-plugin-node "~4.2.2" eslint-plugin-promise "~3.5.0" @@ -3725,6 +3923,10 @@ strip-bom@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3" +strip-eof@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/strip-eof/-/strip-eof-1.0.0.tgz#bb43ff5598a6eb05d89b59fcd129c983313606bf" + strip-json-comments@~1.0.1: version "1.0.4" resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-1.0.4.tgz#1e15fbcac97d3ee99bf2d73b4c656b082bbafb91" @@ -3766,9 +3968,9 @@ tar@^2.0.0, tar@~2.2.1: fstream "^1.0.2" inherits "2" -test-exclude@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/test-exclude/-/test-exclude-4.1.0.tgz#04ca70b7390dd38c98d4a003a173806ca7991c91" +test-exclude@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/test-exclude/-/test-exclude-4.1.1.tgz#4d84964b0966b0087ecc334a2ce002d3d9341e26" dependencies: arrify "^1.0.1" micromatch "^2.3.11" @@ -3792,7 +3994,7 @@ timed-out@^3.0.0: version "3.1.3" resolved "https://registry.yarnpkg.com/timed-out/-/timed-out-3.1.3.tgz#95860bfcc5c76c277f8f8326fd0f5b2e20eba217" -to-fast-properties@^1.0.1: +to-fast-properties@^1.0.1, to-fast-properties@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-1.0.3.tgz#b83571fa4d8c25b82e231b06e3a3055de4ca1a47" @@ -3824,13 +4026,9 @@ type-check@~0.3.2: dependencies: prelude-ls "~1.1.2" -type-detect@0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/type-detect/-/type-detect-0.1.1.tgz#0ba5ec2a885640e470ea4e8505971900dac58822" - -type-detect@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/type-detect/-/type-detect-1.0.0.tgz#762217cc06db258ec48908a1298e8b95121e8ea2" +type-detect@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/type-detect/-/type-detect-3.0.0.tgz#46d0cc8553abb7b13a352b0d6dea2fd58f2d9b55" type-detect@^4.0.0: version "4.0.3" @@ -3932,12 +4130,6 @@ util-extend@^1.0.1: version "1.0.3" resolved "https://registry.yarnpkg.com/util-extend/-/util-extend-1.0.3.tgz#a7c216d267545169637b3b6edc6ca9119e2ff93f" -"util@>=0.10.3 <1": - version "0.10.3" - resolved "https://registry.yarnpkg.com/util/-/util-0.10.3.tgz#7afb1afe50805246489e3db7fe0ed379336ac0f9" - dependencies: - inherits "2.0.1" - uuid@^2.0.1: version "2.0.3" resolved "https://registry.yarnpkg.com/uuid/-/uuid-2.0.3.tgz#67e2e863797215530dff318e5bf9dcebfd47b21a" @@ -3973,9 +4165,9 @@ wcwidth@^1.0.0: dependencies: defaults "^1.0.3" -which-module@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/which-module/-/which-module-1.0.0.tgz#bba63ca861948994ff307736089e3b96026c2a4f" +which-module@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.0.tgz#d9ef07dce77b9902b8a3a8fa4b31c3e3f7e6e87a" which@1, which@^1.2.4, which@^1.2.9, which@~1.2.11: version "1.2.14" @@ -4050,6 +4242,10 @@ xdg-basedir@^2.0.0: dependencies: os-homedir "^1.0.0" +xmlcreate@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/xmlcreate/-/xmlcreate-1.0.2.tgz#fa6bf762a60a413fb3dd8f4b03c5b269238d308f" + xtend@^4.0.0, xtend@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.1.tgz#a5c6d532be656e23db820efb943a1f04998d63af" @@ -4068,23 +4264,29 @@ yargs-parser@^5.0.0: dependencies: camelcase "^3.0.0" -yargs@^7.1.0: - version "7.1.0" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-7.1.0.tgz#6ba318eb16961727f5d284f8ea003e8d6154d0c8" +yargs-parser@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-7.0.0.tgz#8d0ac42f16ea55debd332caf4c4038b3e3f5dfd9" dependencies: - camelcase "^3.0.0" + camelcase "^4.1.0" + +yargs@^8.0.1: + version "8.0.2" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-8.0.2.tgz#6299a9055b1cefc969ff7e79c1d918dceb22c360" + dependencies: + camelcase "^4.1.0" cliui "^3.2.0" decamelize "^1.1.1" get-caller-file "^1.0.1" - os-locale "^1.4.0" - read-pkg-up "^1.0.1" + os-locale "^2.0.0" + read-pkg-up "^2.0.0" require-directory "^2.1.1" require-main-filename "^1.0.1" set-blocking "^2.0.0" - string-width "^1.0.2" - which-module "^1.0.0" + string-width "^2.0.0" + which-module "^2.0.0" y18n "^3.2.1" - yargs-parser "^5.0.0" + yargs-parser "^7.0.0" yargs@~3.10.0: version "3.10.0" From 96bf741b1b4310f0ae180f5e4b01d25189a1b186 Mon Sep 17 00:00:00 2001 From: Jason Dobry Date: Thu, 17 Aug 2017 22:02:39 -0700 Subject: [PATCH 31/36] Trigger rebuild --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index aa39e1e..fe9a024 100644 --- a/README.md +++ b/README.md @@ -13,7 +13,7 @@ A MongoDB adapter for the [JSData Node.js ORM][11]. ### Installation - npm install --save js-data js-data-mongodb bson mongodb + npm install --save js-data js-data-mongodb mongodb bson ### Usage From c5e98d43123787bb31bdde90c70ac8d786ba0b21 Mon Sep 17 00:00:00 2001 From: Jason Dobry Date: Thu, 17 Aug 2017 22:10:16 -0700 Subject: [PATCH 32/36] Update contributors. --- CONTRIBUTORS | 2 -- 1 file changed, 2 deletions(-) diff --git a/CONTRIBUTORS b/CONTRIBUTORS index 4787cf8..55e11a0 100644 --- a/CONTRIBUTORS +++ b/CONTRIBUTORS @@ -1,7 +1,5 @@ # People who have contributed to the js-data-mongodb project. # -# This file is controlled by scripts/authors.js -# # Names should be added to this file as: # [commit count] Name 9 Cory Robinson From ec7dc731044266c91006aecbdfe815ea5056f825 Mon Sep 17 00:00:00 2001 From: Jason Dobry Date: Thu, 17 Aug 2017 22:34:41 -0700 Subject: [PATCH 33/36] Update link --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index fe9a024..c89cee7 100644 --- a/README.md +++ b/README.md @@ -66,7 +66,7 @@ Copyright (c) 2014-2017 [js-data-mongodb project authors][18] [9]: https://img.shields.io/codecov/c/github/js-data/js-data-mongodb.svg?style=flat [10]: https://codecov.io/github/js-data/js-data-mongodb [11]: http://www.js-data.io/ -[12]: http://www.js-data.io/v3.0/docs/js-data-mongodb +[12]: http://www.js-data.io/docs/js-data-mongodb [13]: http://api.js-data.io/js-data-mongodb [14]: http://stackoverflow.com/questions/tagged/jsdata [15]: http://slack.js-data.io/ From 7259f8985a24fc01164e55338f653949da0d7dfe Mon Sep 17 00:00:00 2001 From: Jason Dobry Date: Thu, 17 Aug 2017 22:49:10 -0700 Subject: [PATCH 34/36] Prepare for 1.0.1 release. --- CHANGELOG.md | 5 +++++ package.json | 2 +- rollup.config.js | 2 +- 3 files changed, 7 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index b798849..86461aa 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,8 @@ +##### 1.0.1 - 17 August 2017 + +###### Bug fixes +- Fix Rollup config + ##### 1.0.0 - 17 August 2017 Stable 1.0.0 release diff --git a/package.json b/package.json index 166ef5b..b0c57b4 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "js-data-mongodb", "description": "MongoDB adapter for js-data.", - "version": "1.0.0", + "version": "1.0.1", "homepage": "https://github.com/js-data/js-data-mongodb", "repository": { "type": "git", diff --git a/rollup.config.js b/rollup.config.js index c4da68f..2bb63a2 100644 --- a/rollup.config.js +++ b/rollup.config.js @@ -6,7 +6,7 @@ export default { 'bson', 'js-data', 'js-data-adapter', - 'mout/string/underscore' + 'lodash.snakecase' ], plugins: [ babel({ From 7f93d8c84dcda72e432ef8187e2ff6fa042a3160 Mon Sep 17 00:00:00 2001 From: Jason Dobry Date: Fri, 18 Aug 2017 00:17:18 -0700 Subject: [PATCH 35/36] Prepare for 1.0.2 release. --- CHANGELOG.md | 5 ++++ package.json | 2 +- src/index.js | 80 ++++++++++++++++++++++++++-------------------------- 3 files changed, 46 insertions(+), 41 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 86461aa..8ba9775 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,8 @@ +##### 1.0.2 - 18 August 2017 + +###### Other +- Update JSDoc comments + ##### 1.0.1 - 17 August 2017 ###### Bug fixes diff --git a/package.json b/package.json index b0c57b4..f7dd9b6 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "js-data-mongodb", "description": "MongoDB adapter for js-data.", - "version": "1.0.1", + "version": "1.0.2", "homepage": "https://github.com/js-data/js-data-mongodb", "repository": { "type": "git", diff --git a/src/index.js b/src/index.js index 0f46771..237c7de 100644 --- a/src/index.js +++ b/src/index.js @@ -59,8 +59,8 @@ const REMOVE_OPTS_DEFAULTS = {} * * @example * // Use Container instead of DataStore on the server - * import {Container} from 'js-data' - * import MongoDBAdapter from 'js-data-mongodb' + * import { Container } from 'js-data'; + * import MongoDBAdapter from 'js-data-mongodb'; * * // Create a store to hold your Mappers * const store = new Container({ @@ -68,16 +68,16 @@ const REMOVE_OPTS_DEFAULTS = {} * // MongoDB uses "_id" as the primary key * idAttribute: '_id' * } - * }) + * }); * * // Create an instance of MongoDBAdapter with default settings - * const adapter = new MongoDBAdapter() + * const adapter = new MongoDBAdapter(); * * // Mappers in "store" will use the MongoDB adapter by default - * store.registerAdapter('mongodb', adapter, { default: true }) + * store.registerAdapter('mongodb', adapter, { default: true }); * * // Create a Mapper that maps to a "user" collection - * store.defineMapper('user') + * store.defineMapper('user'); * * @class MongoDBAdapter * @extends Adapter @@ -991,8 +991,8 @@ Adapter.extend({ * Details of the current version of the `js-data-mongodb` module. * * @example - * import {version} from 'js-data-mongodb' - * console.log(version.full) + * import { version } from 'js-data-mongodb'; + * console.log(version.full); * * @name module:js-data-mongodb.version * @type {object} @@ -1011,8 +1011,8 @@ export const version = '<%= version %>' * {@link MongoDBAdapter} class. * * @example - * import {MongoDBAdapter} from 'js-data-mongodb' - * const adapter = new MongoDBAdapter() + * import { MongoDBAdapter } from 'js-data-mongodb'; + * const adapter = new MongoDBAdapter(); * * @name module:js-data-mongodb.MongoDBAdapter * @see MongoDBAdapter @@ -1023,61 +1023,61 @@ export const version = '<%= version %>' * Registered as `js-data-mongodb` in NPM. * * @example Install from NPM - * npm i --save js-data-mongodb@rc js-data@rc mongodb bson + * npm i --save js-data-mongodb js-data mongodb bson * * @example Load via CommonJS - * var MongoDBAdapter = require('js-data-mongodb').MongoDBAdapter - * var adapter = new MongoDBAdapter() + * const MongoDBAdapter = require('js-data-mongodb').MongoDBAdapter; + * const adapter = new MongoDBAdapter(); * * @example Load via ES2015 Modules - * import {MongoDBAdapter} from 'js-data-mongodb' - * const adapter = new MongoDBAdapter() + * import { MongoDBAdapter } from 'js-data-mongodb'; + * const adapter = new MongoDBAdapter(); * * @module js-data-mongodb */ - /** +/** * Create a subclass of this MongoDBAdapter: * @example MongoDBAdapter.extend - * // Normally you would do: import { MongoDBAdapter } from 'js-data-mongodb' - * const JSDataMongoDB = require('js-data-mongodb') - * const { MongoDBAdapter } = JSDataMongoDB - * console.log('Using JSDataMongoDB v' + JSDataMongoDB.version.full) + * // Normally you would do: import { MongoDBAdapter } from 'js-data-mongodb'; + * const JSDataMongoDB = require('js-data-mongodb'); + * const { MongoDBAdapter } = JSDataMongoDB; + * console.log('Using JSDataMongoDB v' + JSDataMongoDB.version.full); * * // Extend the class using ES2015 class syntax. * class CustomMongoDBAdapterClass extends MongoDBAdapter { - * foo () { return 'bar' } - * static beep () { return 'boop' } + * foo () { return 'bar'; } + * static beep () { return 'boop'; } * } - * const customMongoDBAdapter = new CustomMongoDBAdapterClass() - * console.log(customMongoDBAdapter.foo()) - * console.log(CustomMongoDBAdapterClass.beep()) + * const customMongoDBAdapter = new CustomMongoDBAdapterClass(); + * console.log(customMongoDBAdapter.foo()); + * console.log(CustomMongoDBAdapterClass.beep()); * * // Extend the class using alternate method. * const OtherMongoDBAdapterClass = MongoDBAdapter.extend({ - * foo () { return 'bar' } + * foo () { return 'bar'; } * }, { - * beep () { return 'boop' } - * }) - * const otherMongoDBAdapter = new OtherMongoDBAdapterClass() - * console.log(otherMongoDBAdapter.foo()) - * console.log(OtherMongoDBAdapterClass.beep()) + * beep () { return 'boop'; } + * }); + * const otherMongoDBAdapter = new OtherMongoDBAdapterClass(); + * console.log(otherMongoDBAdapter.foo()); + * console.log(OtherMongoDBAdapterClass.beep()); * * // Extend the class, providing a custom constructor. * function AnotherMongoDBAdapterClass () { - * MongoDBAdapter.call(this) - * this.created_at = new Date().getTime() + * MongoDBAdapter.call(this); + * this.created_at = new Date().getTime(); * } * MongoDBAdapter.extend({ * constructor: AnotherMongoDBAdapterClass, - * foo () { return 'bar' } + * foo () { return 'bar'; } * }, { - * beep () { return 'boop' } - * }) - * const anotherMongoDBAdapter = new AnotherMongoDBAdapterClass() - * console.log(anotherMongoDBAdapter.created_at) - * console.log(anotherMongoDBAdapter.foo()) - * console.log(AnotherMongoDBAdapterClass.beep()) + * beep () { return 'boop'; } + * }); + * const anotherMongoDBAdapter = new AnotherMongoDBAdapterClass(); + * console.log(anotherMongoDBAdapter.created_at); + * console.log(anotherMongoDBAdapter.foo()); + * console.log(AnotherMongoDBAdapterClass.beep()); * * @method MongoDBAdapter.extend * @param {object} [props={}] Properties to add to the prototype of the From 00001f7ae9fce75f7d1ac8ee08f12cbdfe805ab9 Mon Sep 17 00:00:00 2001 From: Cory Robinson Date: Fri, 21 Sep 2018 20:14:50 -0700 Subject: [PATCH 36/36] v2.0.0 (#40) * chore(): update dependencies * refactor(MongoClient): refactor use of mongodb lib for version 3 changes * chore(): bump jsdoc dep version for node version 8+ compat * chore(readme): update readme install versions * ci(): update to circle ci 2.0 * chore(): branch ci * chore(): ci testing * chore(): ci testing * chore(): ci testing * chore(): ci testing * chore(): deps * 2.0.0 --- .editorconfig | 9 + .nvmrc | 1 + CHANGELOG.md | 9 + README.md | 2 +- circle.yml | 49 +- package-lock.json | 4605 ++++++++++++++++++++++++++------------------- package.json | 16 +- src/index.js | 31 +- 8 files changed, 2703 insertions(+), 2019 deletions(-) create mode 100644 .editorconfig create mode 100644 .nvmrc diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 0000000..c6c8b36 --- /dev/null +++ b/.editorconfig @@ -0,0 +1,9 @@ +root = true + +[*] +indent_style = space +indent_size = 2 +end_of_line = lf +charset = utf-8 +trim_trailing_whitespace = true +insert_final_newline = true diff --git a/.nvmrc b/.nvmrc new file mode 100644 index 0000000..f599e28 --- /dev/null +++ b/.nvmrc @@ -0,0 +1 @@ +10 diff --git a/CHANGELOG.md b/CHANGELOG.md index 8ba9775..83cddbc 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,12 @@ +##### 2.0.0 - 21 September 2018 + +- updated dependencies to use latest mongodb client lib + +###### BREAKING CHANGES: + +- Dependency `mongodb` version 3+ compatible only +- Dependency `bson` version 1+ compatible only + ##### 1.0.2 - 18 August 2017 ###### Other diff --git a/README.md b/README.md index c89cee7..a7a61b3 100644 --- a/README.md +++ b/README.md @@ -13,7 +13,7 @@ A MongoDB adapter for the [JSData Node.js ORM][11]. ### Installation - npm install --save js-data js-data-mongodb mongodb bson + npm install --save js-data@3 js-data-mongodb@2 mongodb@3 bson@3 ### Usage diff --git a/circle.yml b/circle.yml index ea53167..f0aeca3 100644 --- a/circle.yml +++ b/circle.yml @@ -1,26 +1,25 @@ -# Adjust the behavior of the virtual machine (VM) -machine: - node: - version: 6.11.2 +version: 2 +jobs: + test: + docker: + - image: circleci/node:10 + - image: circleci/mongo:3 + steps: + - checkout + - run: npm install + - run: sudo npm i -g nyc codecov + - run: + name: Test + command: npm test + - run: + name: Generate code coverage + command: nyc report --reporter=lcov > coverage.lcov && codecov -# Use for broader build-related configuration -general: - branches: - ignore: - - gh-pages - -# Install your project's language-specific dependencies -dependencies: - pre: - - yarn global add nyc codecov - override: - - yarn - cache_directories: - - ~/.cache/yarn - -# Run your tests -test: - override: - - yarn test - post: - - nyc report --reporter=lcov > coverage.lcov && codecov +workflows: + version: 2 + build_and_test: + jobs: + - test: + filters: + branches: + ignore: gh-pages diff --git a/package-lock.json b/package-lock.json index 7275330..7c17461 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "js-data-mongodb", - "version": "1.0.0", + "version": "2.0.0", "lockfileVersion": 1, "requires": true, "dependencies": { @@ -16,7 +16,7 @@ "integrity": "sha1-r9+UiPsezvyDSPb7IvRk4ypYs2s=", "dev": true, "requires": { - "acorn": "3.3.0" + "acorn": "^3.0.4" }, "dependencies": { "acorn": { @@ -33,8 +33,8 @@ "integrity": "sha1-gv+wKynmYq5TvcIK8VlHcGc5xTY=", "dev": true, "requires": { - "co": "4.6.0", - "json-stable-stringify": "1.0.1" + "co": "^4.6.0", + "json-stable-stringify": "^1.0.1" } }, "ajv-keywords": { @@ -49,7 +49,7 @@ "integrity": "sha1-LwwWWIKXOa3V67FeawxuNCPwFro=", "dev": true, "requires": { - "string-width": "1.0.2" + "string-width": "^1.0.1" } }, "ansi-escapes": { @@ -76,7 +76,7 @@ "integrity": "sha1-c9g7wmP4bpf4zE9rrhsOkKfSLIY=", "dev": true, "requires": { - "sprintf-js": "1.0.3" + "sprintf-js": "~1.0.2" } }, "array-union": { @@ -85,7 +85,7 @@ "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=", "dev": true, "requires": { - "array-uniq": "1.0.3" + "array-uniq": "^1.0.1" } }, "array-uniq": { @@ -100,8 +100,8 @@ "integrity": "sha1-VWpcU2LAhkgyPdrrnenRS8GGTJA=", "dev": true, "requires": { - "define-properties": "1.1.2", - "es-abstract": "1.8.0" + "define-properties": "^1.1.2", + "es-abstract": "^1.7.0" } }, "arrify": { @@ -121,9 +121,9 @@ "integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=", "dev": true, "requires": { - "chalk": "1.1.3", - "esutils": "2.0.2", - "js-tokens": "3.0.2" + "chalk": "^1.1.3", + "esutils": "^2.0.2", + "js-tokens": "^3.0.2" } }, "babel-core": { @@ -132,25 +132,25 @@ "integrity": "sha1-rzL3izGm/O8RnIew/Y2XU/A6C7g=", "dev": true, "requires": { - "babel-code-frame": "6.26.0", - "babel-generator": "6.26.0", - "babel-helpers": "6.24.1", - "babel-messages": "6.23.0", - "babel-register": "6.26.0", - "babel-runtime": "6.26.0", - "babel-template": "6.26.0", - "babel-traverse": "6.26.0", - "babel-types": "6.26.0", - "babylon": "6.18.0", - "convert-source-map": "1.5.0", - "debug": "2.6.8", - "json5": "0.5.1", - "lodash": "4.17.4", - "minimatch": "3.0.4", - "path-is-absolute": "1.0.1", - "private": "0.1.7", - "slash": "1.0.0", - "source-map": "0.5.6" + "babel-code-frame": "^6.26.0", + "babel-generator": "^6.26.0", + "babel-helpers": "^6.24.1", + "babel-messages": "^6.23.0", + "babel-register": "^6.26.0", + "babel-runtime": "^6.26.0", + "babel-template": "^6.26.0", + "babel-traverse": "^6.26.0", + "babel-types": "^6.26.0", + "babylon": "^6.18.0", + "convert-source-map": "^1.5.0", + "debug": "^2.6.8", + "json5": "^0.5.1", + "lodash": "^4.17.4", + "minimatch": "^3.0.4", + "path-is-absolute": "^1.0.1", + "private": "^0.1.7", + "slash": "^1.0.0", + "source-map": "^0.5.6" } }, "babel-eslint": { @@ -159,10 +159,10 @@ "integrity": "sha1-sv4tgBJkcPXBlELcdXJTqJdxCCc=", "dev": true, "requires": { - "babel-code-frame": "6.26.0", - "babel-traverse": "6.26.0", - "babel-types": "6.26.0", - "babylon": "6.18.0" + "babel-code-frame": "^6.22.0", + "babel-traverse": "^6.23.1", + "babel-types": "^6.23.0", + "babylon": "^6.17.0" } }, "babel-generator": { @@ -171,14 +171,14 @@ "integrity": "sha1-rBriAHC3n248odMmlhMFN3TyDcU=", "dev": true, "requires": { - "babel-messages": "6.23.0", - "babel-runtime": "6.26.0", - "babel-types": "6.26.0", - "detect-indent": "4.0.0", - "jsesc": "1.3.0", - "lodash": "4.17.4", - "source-map": "0.5.6", - "trim-right": "1.0.1" + "babel-messages": "^6.23.0", + "babel-runtime": "^6.26.0", + "babel-types": "^6.26.0", + "detect-indent": "^4.0.0", + "jsesc": "^1.3.0", + "lodash": "^4.17.4", + "source-map": "^0.5.6", + "trim-right": "^1.0.1" } }, "babel-helper-call-delegate": { @@ -187,10 +187,10 @@ "integrity": "sha1-7Oaqzdx25Bw0YfiL/Fdb0Nqi340=", "dev": true, "requires": { - "babel-helper-hoist-variables": "6.24.1", - "babel-runtime": "6.26.0", - "babel-traverse": "6.26.0", - "babel-types": "6.26.0" + "babel-helper-hoist-variables": "^6.24.1", + "babel-runtime": "^6.22.0", + "babel-traverse": "^6.24.1", + "babel-types": "^6.24.1" } }, "babel-helper-define-map": { @@ -199,10 +199,10 @@ "integrity": "sha1-pfVtq0GiX5fstJjH66ypgZ+Vvl8=", "dev": true, "requires": { - "babel-helper-function-name": "6.24.1", - "babel-runtime": "6.26.0", - "babel-types": "6.26.0", - "lodash": "4.17.4" + "babel-helper-function-name": "^6.24.1", + "babel-runtime": "^6.26.0", + "babel-types": "^6.26.0", + "lodash": "^4.17.4" } }, "babel-helper-function-name": { @@ -211,11 +211,11 @@ "integrity": "sha1-00dbjAPtmCQqJbSDUasYOZ01gKk=", "dev": true, "requires": { - "babel-helper-get-function-arity": "6.24.1", - "babel-runtime": "6.26.0", - "babel-template": "6.26.0", - "babel-traverse": "6.26.0", - "babel-types": "6.26.0" + "babel-helper-get-function-arity": "^6.24.1", + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1", + "babel-traverse": "^6.24.1", + "babel-types": "^6.24.1" } }, "babel-helper-get-function-arity": { @@ -224,8 +224,8 @@ "integrity": "sha1-j3eCqpNAfEHTqlCQj4mwMbG2hT0=", "dev": true, "requires": { - "babel-runtime": "6.26.0", - "babel-types": "6.26.0" + "babel-runtime": "^6.22.0", + "babel-types": "^6.24.1" } }, "babel-helper-hoist-variables": { @@ -234,8 +234,8 @@ "integrity": "sha1-HssnaJydJVE+rbyZFKc/VAi+enY=", "dev": true, "requires": { - "babel-runtime": "6.26.0", - "babel-types": "6.26.0" + "babel-runtime": "^6.22.0", + "babel-types": "^6.24.1" } }, "babel-helper-optimise-call-expression": { @@ -244,8 +244,8 @@ "integrity": "sha1-96E0J7qfc/j0+pk8VKl4gtEkQlc=", "dev": true, "requires": { - "babel-runtime": "6.26.0", - "babel-types": "6.26.0" + "babel-runtime": "^6.22.0", + "babel-types": "^6.24.1" } }, "babel-helper-regex": { @@ -254,9 +254,9 @@ "integrity": "sha1-MlxZ+QL4LyS3T6zu0DY5VPZJXnI=", "dev": true, "requires": { - "babel-runtime": "6.26.0", - "babel-types": "6.26.0", - "lodash": "4.17.4" + "babel-runtime": "^6.26.0", + "babel-types": "^6.26.0", + "lodash": "^4.17.4" } }, "babel-helper-replace-supers": { @@ -265,12 +265,12 @@ "integrity": "sha1-v22/5Dk40XNpohPKiov3S2qQqxo=", "dev": true, "requires": { - "babel-helper-optimise-call-expression": "6.24.1", - "babel-messages": "6.23.0", - "babel-runtime": "6.26.0", - "babel-template": "6.26.0", - "babel-traverse": "6.26.0", - "babel-types": "6.26.0" + "babel-helper-optimise-call-expression": "^6.24.1", + "babel-messages": "^6.23.0", + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1", + "babel-traverse": "^6.24.1", + "babel-types": "^6.24.1" } }, "babel-helpers": { @@ -279,8 +279,8 @@ "integrity": "sha1-NHHenK7DiOXIUOWX5Yom3fN2ArI=", "dev": true, "requires": { - "babel-runtime": "6.26.0", - "babel-template": "6.26.0" + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1" } }, "babel-messages": { @@ -289,7 +289,7 @@ "integrity": "sha1-8830cDhYA1sqKVHG7F7fbGLyYw4=", "dev": true, "requires": { - "babel-runtime": "6.26.0" + "babel-runtime": "^6.22.0" } }, "babel-plugin-check-es2015-constants": { @@ -298,7 +298,7 @@ "integrity": "sha1-NRV7EBQm/S/9PaP3XH0ekYNbv4o=", "dev": true, "requires": { - "babel-runtime": "6.26.0" + "babel-runtime": "^6.22.0" } }, "babel-plugin-external-helpers": { @@ -307,7 +307,7 @@ "integrity": "sha1-IoX0iwK9Xe3oUXXK+MYuhq3M76E=", "dev": true, "requires": { - "babel-runtime": "6.26.0" + "babel-runtime": "^6.22.0" } }, "babel-plugin-syntax-async-functions": { @@ -322,7 +322,7 @@ "integrity": "sha1-RSaSy3EdX3ncf4XkQM5BufJE0iE=", "dev": true, "requires": { - "babel-runtime": "6.26.0" + "babel-runtime": "^6.22.0" } }, "babel-plugin-transform-es2015-block-scoped-functions": { @@ -331,7 +331,7 @@ "integrity": "sha1-u8UbSflk1wy42OC5ToICRs46YUE=", "dev": true, "requires": { - "babel-runtime": "6.26.0" + "babel-runtime": "^6.22.0" } }, "babel-plugin-transform-es2015-block-scoping": { @@ -340,11 +340,11 @@ "integrity": "sha1-1w9SmcEwjQXBL0Y4E7CgnnOxiV8=", "dev": true, "requires": { - "babel-runtime": "6.26.0", - "babel-template": "6.26.0", - "babel-traverse": "6.26.0", - "babel-types": "6.26.0", - "lodash": "4.17.4" + "babel-runtime": "^6.26.0", + "babel-template": "^6.26.0", + "babel-traverse": "^6.26.0", + "babel-types": "^6.26.0", + "lodash": "^4.17.4" } }, "babel-plugin-transform-es2015-classes": { @@ -353,15 +353,15 @@ "integrity": "sha1-WkxYpQyclGHlZLSyo7+ryXolhNs=", "dev": true, "requires": { - "babel-helper-define-map": "6.26.0", - "babel-helper-function-name": "6.24.1", - "babel-helper-optimise-call-expression": "6.24.1", - "babel-helper-replace-supers": "6.24.1", - "babel-messages": "6.23.0", - "babel-runtime": "6.26.0", - "babel-template": "6.26.0", - "babel-traverse": "6.26.0", - "babel-types": "6.26.0" + "babel-helper-define-map": "^6.24.1", + "babel-helper-function-name": "^6.24.1", + "babel-helper-optimise-call-expression": "^6.24.1", + "babel-helper-replace-supers": "^6.24.1", + "babel-messages": "^6.23.0", + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1", + "babel-traverse": "^6.24.1", + "babel-types": "^6.24.1" } }, "babel-plugin-transform-es2015-computed-properties": { @@ -370,8 +370,8 @@ "integrity": "sha1-b+Ko0WiV1WNPTNmZttNICjCBWbM=", "dev": true, "requires": { - "babel-runtime": "6.26.0", - "babel-template": "6.26.0" + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1" } }, "babel-plugin-transform-es2015-destructuring": { @@ -380,7 +380,7 @@ "integrity": "sha1-mXux8auWf2gtKwh2/jWNYOdlxW0=", "dev": true, "requires": { - "babel-runtime": "6.26.0" + "babel-runtime": "^6.22.0" } }, "babel-plugin-transform-es2015-duplicate-keys": { @@ -389,8 +389,8 @@ "integrity": "sha1-c+s9MQypaePvnskcU3QabxV2Qj4=", "dev": true, "requires": { - "babel-runtime": "6.26.0", - "babel-types": "6.26.0" + "babel-runtime": "^6.22.0", + "babel-types": "^6.24.1" } }, "babel-plugin-transform-es2015-for-of": { @@ -399,7 +399,7 @@ "integrity": "sha1-9HyVsrYT3x0+zC/bdXNiPHUkhpE=", "dev": true, "requires": { - "babel-runtime": "6.26.0" + "babel-runtime": "^6.22.0" } }, "babel-plugin-transform-es2015-function-name": { @@ -408,9 +408,9 @@ "integrity": "sha1-g0yJhTvDaxrw86TF26qU/Y6sqos=", "dev": true, "requires": { - "babel-helper-function-name": "6.24.1", - "babel-runtime": "6.26.0", - "babel-types": "6.26.0" + "babel-helper-function-name": "^6.24.1", + "babel-runtime": "^6.22.0", + "babel-types": "^6.24.1" } }, "babel-plugin-transform-es2015-literals": { @@ -419,7 +419,7 @@ "integrity": "sha1-T1SgLWzWbPkVKAAZox0xklN3yi4=", "dev": true, "requires": { - "babel-runtime": "6.26.0" + "babel-runtime": "^6.22.0" } }, "babel-plugin-transform-es2015-modules-amd": { @@ -428,9 +428,9 @@ "integrity": "sha1-Oz5UAXI5hC1tGcMBHEvS8AoA0VQ=", "dev": true, "requires": { - "babel-plugin-transform-es2015-modules-commonjs": "6.26.0", - "babel-runtime": "6.26.0", - "babel-template": "6.26.0" + "babel-plugin-transform-es2015-modules-commonjs": "^6.24.1", + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1" } }, "babel-plugin-transform-es2015-modules-commonjs": { @@ -439,10 +439,10 @@ "integrity": "sha1-DYOUApt9xqvhqX7xgeAHWN0uXYo=", "dev": true, "requires": { - "babel-plugin-transform-strict-mode": "6.24.1", - "babel-runtime": "6.26.0", - "babel-template": "6.26.0", - "babel-types": "6.26.0" + "babel-plugin-transform-strict-mode": "^6.24.1", + "babel-runtime": "^6.26.0", + "babel-template": "^6.26.0", + "babel-types": "^6.26.0" } }, "babel-plugin-transform-es2015-modules-systemjs": { @@ -451,9 +451,9 @@ "integrity": "sha1-/4mhQrkRmpBhlfXxBuzzBdlAfSM=", "dev": true, "requires": { - "babel-helper-hoist-variables": "6.24.1", - "babel-runtime": "6.26.0", - "babel-template": "6.26.0" + "babel-helper-hoist-variables": "^6.24.1", + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1" } }, "babel-plugin-transform-es2015-modules-umd": { @@ -462,9 +462,9 @@ "integrity": "sha1-rJl+YoXNGO1hdq22B9YCNErThGg=", "dev": true, "requires": { - "babel-plugin-transform-es2015-modules-amd": "6.24.1", - "babel-runtime": "6.26.0", - "babel-template": "6.26.0" + "babel-plugin-transform-es2015-modules-amd": "^6.24.1", + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1" } }, "babel-plugin-transform-es2015-object-super": { @@ -473,8 +473,8 @@ "integrity": "sha1-JM72muIcuDp/hgPa0CH1cusnj40=", "dev": true, "requires": { - "babel-helper-replace-supers": "6.24.1", - "babel-runtime": "6.26.0" + "babel-helper-replace-supers": "^6.24.1", + "babel-runtime": "^6.22.0" } }, "babel-plugin-transform-es2015-parameters": { @@ -483,12 +483,12 @@ "integrity": "sha1-V6w1GrScrxSpfNE7CfZv3wpiXys=", "dev": true, "requires": { - "babel-helper-call-delegate": "6.24.1", - "babel-helper-get-function-arity": "6.24.1", - "babel-runtime": "6.26.0", - "babel-template": "6.26.0", - "babel-traverse": "6.26.0", - "babel-types": "6.26.0" + "babel-helper-call-delegate": "^6.24.1", + "babel-helper-get-function-arity": "^6.24.1", + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1", + "babel-traverse": "^6.24.1", + "babel-types": "^6.24.1" } }, "babel-plugin-transform-es2015-shorthand-properties": { @@ -497,8 +497,8 @@ "integrity": "sha1-JPh11nIch2YbvZmkYi5R8U3jiqA=", "dev": true, "requires": { - "babel-runtime": "6.26.0", - "babel-types": "6.26.0" + "babel-runtime": "^6.22.0", + "babel-types": "^6.24.1" } }, "babel-plugin-transform-es2015-spread": { @@ -507,7 +507,7 @@ "integrity": "sha1-1taKmfia7cRTbIGlQujdnxdG+NE=", "dev": true, "requires": { - "babel-runtime": "6.26.0" + "babel-runtime": "^6.22.0" } }, "babel-plugin-transform-es2015-sticky-regex": { @@ -516,9 +516,9 @@ "integrity": "sha1-AMHNsaynERLN8M9hJsLta0V8zbw=", "dev": true, "requires": { - "babel-helper-regex": "6.26.0", - "babel-runtime": "6.26.0", - "babel-types": "6.26.0" + "babel-helper-regex": "^6.24.1", + "babel-runtime": "^6.22.0", + "babel-types": "^6.24.1" } }, "babel-plugin-transform-es2015-template-literals": { @@ -527,7 +527,7 @@ "integrity": "sha1-qEs0UPfp+PH2g51taH2oS7EjbY0=", "dev": true, "requires": { - "babel-runtime": "6.26.0" + "babel-runtime": "^6.22.0" } }, "babel-plugin-transform-es2015-typeof-symbol": { @@ -536,7 +536,7 @@ "integrity": "sha1-3sCfHN3/lLUqxz1QXITfWdzOs3I=", "dev": true, "requires": { - "babel-runtime": "6.26.0" + "babel-runtime": "^6.22.0" } }, "babel-plugin-transform-es2015-unicode-regex": { @@ -545,9 +545,9 @@ "integrity": "sha1-04sS9C6nMj9yk4fxinxa4frrNek=", "dev": true, "requires": { - "babel-helper-regex": "6.26.0", - "babel-runtime": "6.26.0", - "regexpu-core": "2.0.0" + "babel-helper-regex": "^6.24.1", + "babel-runtime": "^6.22.0", + "regexpu-core": "^2.0.0" } }, "babel-plugin-transform-regenerator": { @@ -556,7 +556,7 @@ "integrity": "sha1-4HA2lvveJ/Cj78rPi03KL3s6jy8=", "dev": true, "requires": { - "regenerator-transform": "0.10.1" + "regenerator-transform": "^0.10.0" } }, "babel-plugin-transform-strict-mode": { @@ -565,8 +565,8 @@ "integrity": "sha1-1fr3qleKZbvlkc9e2uBKDGcCB1g=", "dev": true, "requires": { - "babel-runtime": "6.26.0", - "babel-types": "6.26.0" + "babel-runtime": "^6.22.0", + "babel-types": "^6.24.1" } }, "babel-polyfill": { @@ -575,9 +575,9 @@ "integrity": "sha1-N5k3q8Z9eJWXCtxiHyhM2WbPIVM=", "dev": true, "requires": { - "babel-runtime": "6.26.0", - "core-js": "2.5.0", - "regenerator-runtime": "0.10.5" + "babel-runtime": "^6.26.0", + "core-js": "^2.5.0", + "regenerator-runtime": "^0.10.5" }, "dependencies": { "regenerator-runtime": { @@ -594,30 +594,30 @@ "integrity": "sha1-1EBQ1rwsn+6nAqrzjXJ6AhBTiTk=", "dev": true, "requires": { - "babel-plugin-check-es2015-constants": "6.22.0", - "babel-plugin-transform-es2015-arrow-functions": "6.22.0", - "babel-plugin-transform-es2015-block-scoped-functions": "6.22.0", - "babel-plugin-transform-es2015-block-scoping": "6.26.0", - "babel-plugin-transform-es2015-classes": "6.24.1", - "babel-plugin-transform-es2015-computed-properties": "6.24.1", - "babel-plugin-transform-es2015-destructuring": "6.23.0", - "babel-plugin-transform-es2015-duplicate-keys": "6.24.1", - "babel-plugin-transform-es2015-for-of": "6.23.0", - "babel-plugin-transform-es2015-function-name": "6.24.1", - "babel-plugin-transform-es2015-literals": "6.22.0", - "babel-plugin-transform-es2015-modules-amd": "6.24.1", - "babel-plugin-transform-es2015-modules-commonjs": "6.26.0", - "babel-plugin-transform-es2015-modules-systemjs": "6.24.1", - "babel-plugin-transform-es2015-modules-umd": "6.24.1", - "babel-plugin-transform-es2015-object-super": "6.24.1", - "babel-plugin-transform-es2015-parameters": "6.24.1", - "babel-plugin-transform-es2015-shorthand-properties": "6.24.1", - "babel-plugin-transform-es2015-spread": "6.22.0", - "babel-plugin-transform-es2015-sticky-regex": "6.24.1", - "babel-plugin-transform-es2015-template-literals": "6.22.0", - "babel-plugin-transform-es2015-typeof-symbol": "6.23.0", - "babel-plugin-transform-es2015-unicode-regex": "6.24.1", - "babel-plugin-transform-regenerator": "6.26.0" + "babel-plugin-check-es2015-constants": "^6.22.0", + "babel-plugin-transform-es2015-arrow-functions": "^6.22.0", + "babel-plugin-transform-es2015-block-scoped-functions": "^6.22.0", + "babel-plugin-transform-es2015-block-scoping": "^6.24.1", + "babel-plugin-transform-es2015-classes": "^6.24.1", + "babel-plugin-transform-es2015-computed-properties": "^6.24.1", + "babel-plugin-transform-es2015-destructuring": "^6.22.0", + "babel-plugin-transform-es2015-duplicate-keys": "^6.24.1", + "babel-plugin-transform-es2015-for-of": "^6.22.0", + "babel-plugin-transform-es2015-function-name": "^6.24.1", + "babel-plugin-transform-es2015-literals": "^6.22.0", + "babel-plugin-transform-es2015-modules-amd": "^6.24.1", + "babel-plugin-transform-es2015-modules-commonjs": "^6.24.1", + "babel-plugin-transform-es2015-modules-systemjs": "^6.24.1", + "babel-plugin-transform-es2015-modules-umd": "^6.24.1", + "babel-plugin-transform-es2015-object-super": "^6.24.1", + "babel-plugin-transform-es2015-parameters": "^6.24.1", + "babel-plugin-transform-es2015-shorthand-properties": "^6.24.1", + "babel-plugin-transform-es2015-spread": "^6.22.0", + "babel-plugin-transform-es2015-sticky-regex": "^6.24.1", + "babel-plugin-transform-es2015-template-literals": "^6.22.0", + "babel-plugin-transform-es2015-typeof-symbol": "^6.22.0", + "babel-plugin-transform-es2015-unicode-regex": "^6.24.1", + "babel-plugin-transform-regenerator": "^6.24.1" } }, "babel-register": { @@ -626,13 +626,13 @@ "integrity": "sha1-btAhFz4vy0htestFxgCahW9kcHE=", "dev": true, "requires": { - "babel-core": "6.26.0", - "babel-runtime": "6.26.0", - "core-js": "2.5.0", - "home-or-tmp": "2.0.0", - "lodash": "4.17.4", - "mkdirp": "0.5.1", - "source-map-support": "0.4.16" + "babel-core": "^6.26.0", + "babel-runtime": "^6.26.0", + "core-js": "^2.5.0", + "home-or-tmp": "^2.0.0", + "lodash": "^4.17.4", + "mkdirp": "^0.5.1", + "source-map-support": "^0.4.15" } }, "babel-runtime": { @@ -641,8 +641,8 @@ "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=", "dev": true, "requires": { - "core-js": "2.5.0", - "regenerator-runtime": "0.11.0" + "core-js": "^2.4.0", + "regenerator-runtime": "^0.11.0" } }, "babel-template": { @@ -651,11 +651,11 @@ "integrity": "sha1-3gPi0WOWsGn0bdn/+FIfsaDjXgI=", "dev": true, "requires": { - "babel-runtime": "6.26.0", - "babel-traverse": "6.26.0", - "babel-types": "6.26.0", - "babylon": "6.18.0", - "lodash": "4.17.4" + "babel-runtime": "^6.26.0", + "babel-traverse": "^6.26.0", + "babel-types": "^6.26.0", + "babylon": "^6.18.0", + "lodash": "^4.17.4" } }, "babel-traverse": { @@ -664,15 +664,15 @@ "integrity": "sha1-RqnL1+3MYsjlwGTi0tjQ9ANXZu4=", "dev": true, "requires": { - "babel-code-frame": "6.26.0", - "babel-messages": "6.23.0", - "babel-runtime": "6.26.0", - "babel-types": "6.26.0", - "babylon": "6.18.0", - "debug": "2.6.8", - "globals": "9.18.0", - "invariant": "2.2.2", - "lodash": "4.17.4" + "babel-code-frame": "^6.26.0", + "babel-messages": "^6.23.0", + "babel-runtime": "^6.26.0", + "babel-types": "^6.26.0", + "babylon": "^6.18.0", + "debug": "^2.6.8", + "globals": "^9.18.0", + "invariant": "^2.2.2", + "lodash": "^4.17.4" } }, "babel-types": { @@ -681,10 +681,10 @@ "integrity": "sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc=", "dev": true, "requires": { - "babel-runtime": "6.26.0", - "esutils": "2.0.2", - "lodash": "4.17.4", - "to-fast-properties": "1.0.3" + "babel-runtime": "^6.26.0", + "esutils": "^2.0.2", + "lodash": "^4.17.4", + "to-fast-properties": "^1.0.3" } }, "babylon": { @@ -710,15 +710,15 @@ "integrity": "sha1-g2TUJIrDT/DvGy8r9JpsYM4NgbY=", "dev": true, "requires": { - "ansi-align": "1.1.0", - "camelcase": "2.1.1", - "chalk": "1.1.3", - "cli-boxes": "1.0.0", - "filled-array": "1.1.0", - "object-assign": "4.1.1", - "repeating": "2.0.1", - "string-width": "1.0.2", - "widest-line": "1.0.0" + "ansi-align": "^1.1.0", + "camelcase": "^2.1.0", + "chalk": "^1.1.1", + "cli-boxes": "^1.0.0", + "filled-array": "^1.0.0", + "object-assign": "^4.0.1", + "repeating": "^2.0.0", + "string-width": "^1.0.1", + "widest-line": "^1.0.0" } }, "brace-expansion": { @@ -726,7 +726,7 @@ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.8.tgz", "integrity": "sha1-wHshHHyVLsH479Uad+8NHTmQopI=", "requires": { - "balanced-match": "1.0.0", + "balanced-match": "^1.0.0", "concat-map": "0.0.1" } }, @@ -736,14 +736,15 @@ "integrity": "sha1-81HTKWnTL6XXpVZxVCY9korjvR8=" }, "bson": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/bson/-/bson-1.0.4.tgz", - "integrity": "sha1-k8ENOeqltYQVy8QFLz5T5WKwtyw=" + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/bson/-/bson-3.0.2.tgz", + "integrity": "sha512-HrDzr7y/ZkgyEVancPVDmfbaD8j81GzSNr6h6yUd/yZfavkrlrqI8aUZMCHrhyMoCW2/I+vEJDat1xDWRwVR6A==" }, "buffer-shims": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/buffer-shims/-/buffer-shims-1.0.0.tgz", - "integrity": "sha1-mXjOMXOIxkmth5MCjDR37wRKi1E=" + "integrity": "sha1-mXjOMXOIxkmth5MCjDR37wRKi1E=", + "dev": true }, "builtin-modules": { "version": "1.1.1", @@ -757,7 +758,7 @@ "integrity": "sha1-lAhe9jWB7NPaqSREqP6U6CV3dR8=", "dev": true, "requires": { - "callsites": "0.2.0" + "callsites": "^0.2.0" } }, "callsites": { @@ -784,7 +785,7 @@ "integrity": "sha1-mMyJDKZS3S7w5ws3klMQ/56Q/Is=", "dev": true, "requires": { - "underscore-contrib": "0.3.0" + "underscore-contrib": "~0.3.0" } }, "chai": { @@ -792,12 +793,12 @@ "resolved": "https://registry.npmjs.org/chai/-/chai-4.1.1.tgz", "integrity": "sha1-ZuISeebzxkFf+CMYeCJ5AOIXGzk=", "requires": { - "assertion-error": "1.0.2", - "check-error": "1.0.2", - "deep-eql": "2.0.2", - "get-func-name": "2.0.0", - "pathval": "1.1.0", - "type-detect": "4.0.3" + "assertion-error": "^1.0.1", + "check-error": "^1.0.1", + "deep-eql": "^2.0.1", + "get-func-name": "^2.0.0", + "pathval": "^1.0.0", + "type-detect": "^4.0.0" } }, "chalk": { @@ -806,11 +807,11 @@ "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", "dev": true, "requires": { - "ansi-styles": "2.2.1", - "escape-string-regexp": "1.0.5", - "has-ansi": "2.0.0", - "strip-ansi": "3.0.1", - "supports-color": "2.0.0" + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" }, "dependencies": { "supports-color": { @@ -850,7 +851,7 @@ "integrity": "sha1-ZNo/fValRBLll5S9Ytw1KV6PKYc=", "dev": true, "requires": { - "restore-cursor": "1.0.1" + "restore-cursor": "^1.0.1" } }, "cli-table": { @@ -880,6 +881,21 @@ "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", "dev": true }, + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "dev": true + }, "colors": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/colors/-/colors-1.0.3.tgz", @@ -891,7 +907,7 @@ "resolved": "https://registry.npmjs.org/commander/-/commander-2.9.0.tgz", "integrity": "sha1-nJkJQXbhIkDLItbFFGCYQA/g99Q=", "requires": { - "graceful-readlink": "1.0.1" + "graceful-readlink": ">= 1.0.0" } }, "concat-map": { @@ -905,9 +921,9 @@ "integrity": "sha1-CqxmL9Ur54lk1VMvaUeE5wEQrPc=", "dev": true, "requires": { - "inherits": "2.0.3", - "readable-stream": "2.2.7", - "typedarray": "0.0.6" + "inherits": "^2.0.3", + "readable-stream": "^2.2.2", + "typedarray": "^0.0.6" } }, "configstore": { @@ -916,15 +932,15 @@ "integrity": "sha1-c3o6cDbpiGECqmCZ5HuzOrGroaE=", "dev": true, "requires": { - "dot-prop": "3.0.0", - "graceful-fs": "4.1.11", - "mkdirp": "0.5.1", - "object-assign": "4.1.1", - "os-tmpdir": "1.0.2", - "osenv": "0.1.4", - "uuid": "2.0.3", - "write-file-atomic": "1.3.4", - "xdg-basedir": "2.0.0" + "dot-prop": "^3.0.0", + "graceful-fs": "^4.1.2", + "mkdirp": "^0.5.0", + "object-assign": "^4.0.1", + "os-tmpdir": "^1.0.0", + "osenv": "^0.1.0", + "uuid": "^2.0.1", + "write-file-atomic": "^1.1.2", + "xdg-basedir": "^2.0.0" } }, "contains-path": { @@ -948,7 +964,8 @@ "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=" + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", + "dev": true }, "create-error-class": { "version": "3.0.2", @@ -956,7 +973,7 @@ "integrity": "sha1-Br56vvlHo/FKMP1hBnHUAbyot7Y=", "dev": true, "requires": { - "capture-stack-trace": "1.0.0" + "capture-stack-trace": "^1.0.0" } }, "d": { @@ -965,7 +982,7 @@ "integrity": "sha1-dUu1v+VUUdpppYuU1F9MWwRi1Y8=", "dev": true, "requires": { - "es5-ext": "0.10.27" + "es5-ext": "^0.10.9" } }, "debug": { @@ -987,7 +1004,7 @@ "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-2.0.2.tgz", "integrity": "sha1-sbrAblbwp2d3aG1Qyf63XC7XZ5o=", "requires": { - "type-detect": "3.0.0" + "type-detect": "^3.0.0" }, "dependencies": { "type-detect": { @@ -1015,8 +1032,8 @@ "integrity": "sha1-g6c/L+pWmJj7c3GTyPhzyvbUXJQ=", "dev": true, "requires": { - "foreach": "2.0.5", - "object-keys": "1.0.11" + "foreach": "^2.0.5", + "object-keys": "^1.0.8" } }, "deglob": { @@ -1025,12 +1042,12 @@ "integrity": "sha1-TUSr4W7zLHebSXK9FBqAMlApoUo=", "dev": true, "requires": { - "find-root": "1.1.0", - "glob": "7.1.1", - "ignore": "3.3.3", - "pkg-config": "1.1.1", - "run-parallel": "1.1.6", - "uniq": "1.0.1" + "find-root": "^1.0.0", + "glob": "^7.0.5", + "ignore": "^3.0.9", + "pkg-config": "^1.1.0", + "run-parallel": "^1.1.2", + "uniq": "^1.0.1" } }, "del": { @@ -1039,13 +1056,13 @@ "integrity": "sha1-wSyYHQZ4RshLyvhiz/kw2Qf/0ag=", "dev": true, "requires": { - "globby": "5.0.0", - "is-path-cwd": "1.0.0", - "is-path-in-cwd": "1.0.0", - "object-assign": "4.1.1", - "pify": "2.3.0", - "pinkie-promise": "2.0.1", - "rimraf": "2.6.1" + "globby": "^5.0.0", + "is-path-cwd": "^1.0.0", + "is-path-in-cwd": "^1.0.0", + "object-assign": "^4.0.1", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0", + "rimraf": "^2.2.8" } }, "detect-indent": { @@ -1054,7 +1071,7 @@ "integrity": "sha1-920GQ1LN9Docts5hnE7jqUdd4gg=", "dev": true, "requires": { - "repeating": "2.0.1" + "repeating": "^2.0.0" } }, "diff": { @@ -1068,8 +1085,8 @@ "integrity": "sha1-N53Ocw9hZvds76TmcHoVmwLFpvo=", "dev": true, "requires": { - "esutils": "2.0.2", - "isarray": "1.0.0" + "esutils": "^2.0.2", + "isarray": "^1.0.0" }, "dependencies": { "isarray": { @@ -1086,8 +1103,8 @@ "integrity": "sha1-BzxpdUbOB4DOI75KKOKT5AvDDII=", "dev": true, "requires": { - "domelementtype": "1.1.3", - "entities": "1.1.1" + "domelementtype": "~1.1.1", + "entities": "~1.1.1" }, "dependencies": { "domelementtype": { @@ -1105,22 +1122,22 @@ "dev": true }, "domhandler": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-2.4.1.tgz", - "integrity": "sha1-iS5HAAqZvlW783dP/qBWHYh5wlk=", + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-2.4.2.tgz", + "integrity": "sha512-JiK04h0Ht5u/80fdLMCEmV4zkNh2BcoMFBmZ/91WtYZ8qVXSKjiw7fXMgFPnHcSZgOo3XdinHvmnDUeMf5R4wA==", "dev": true, "requires": { - "domelementtype": "1.3.0" + "domelementtype": "1" } }, "domutils": { - "version": "1.6.2", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.6.2.tgz", - "integrity": "sha1-GVjMC0yUJuntNn+xyOhUiRsPo/8=", + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.7.0.tgz", + "integrity": "sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg==", "dev": true, "requires": { - "dom-serializer": "0.1.0", - "domelementtype": "1.3.0" + "dom-serializer": "0", + "domelementtype": "1" } }, "dot-prop": { @@ -1129,7 +1146,7 @@ "integrity": "sha1-G3CK8JSknJoOfbyteQq6U52sEXc=", "dev": true, "requires": { - "is-obj": "1.0.1" + "is-obj": "^1.0.0" } }, "duplexer2": { @@ -1138,7 +1155,7 @@ "integrity": "sha1-ixLauHjA1p4+eJEFFmKjL8a93ME=", "dev": true, "requires": { - "readable-stream": "2.2.7" + "readable-stream": "^2.0.2" } }, "entities": { @@ -1153,7 +1170,7 @@ "integrity": "sha1-+FWobOYa3E6GIcPNoh56dhLDqNw=", "dev": true, "requires": { - "is-arrayish": "0.2.1" + "is-arrayish": "^0.2.1" } }, "es-abstract": { @@ -1162,11 +1179,11 @@ "integrity": "sha512-Cf9/h5MrXtExM20gSS55YFrGKCyPrRBjIVBtVyy8vmlsDfe0NPKMWj65tPLgzyfPuapWxh5whpXCtW4+AW5mRg==", "dev": true, "requires": { - "es-to-primitive": "1.1.1", - "function-bind": "1.1.0", - "has": "1.0.1", - "is-callable": "1.1.3", - "is-regex": "1.0.4" + "es-to-primitive": "^1.1.1", + "function-bind": "^1.1.0", + "has": "^1.0.1", + "is-callable": "^1.1.3", + "is-regex": "^1.0.4" } }, "es-to-primitive": { @@ -1175,9 +1192,9 @@ "integrity": "sha1-RTVSSKiJeQNLZ5Lhm7gfK3l13Q0=", "dev": true, "requires": { - "is-callable": "1.1.3", - "is-date-object": "1.0.1", - "is-symbol": "1.0.1" + "is-callable": "^1.1.1", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.1" } }, "es5-ext": { @@ -1186,8 +1203,8 @@ "integrity": "sha512-3KXJRYzKXTd7xfFy5uZsJCXue55fAYQ035PRjyYk2PicllxIwcW9l3AbM/eGaw3vgVAUW4tl4xg9AXDEI6yw0w==", "dev": true, "requires": { - "es6-iterator": "2.0.1", - "es6-symbol": "3.1.1" + "es6-iterator": "2", + "es6-symbol": "~3.1" } }, "es6-iterator": { @@ -1196,9 +1213,9 @@ "integrity": "sha1-jjGcnwRTv1ddN0lAplWSDlnKVRI=", "dev": true, "requires": { - "d": "1.0.0", - "es5-ext": "0.10.27", - "es6-symbol": "3.1.1" + "d": "1", + "es5-ext": "^0.10.14", + "es6-symbol": "^3.1" } }, "es6-map": { @@ -1207,30 +1224,25 @@ "integrity": "sha1-kTbgUD3MBqMBaQ8LsU/042TpSfA=", "dev": true, "requires": { - "d": "1.0.0", - "es5-ext": "0.10.27", - "es6-iterator": "2.0.1", - "es6-set": "0.1.5", - "es6-symbol": "3.1.1", - "event-emitter": "0.3.5" + "d": "1", + "es5-ext": "~0.10.14", + "es6-iterator": "~2.0.1", + "es6-set": "~0.1.5", + "es6-symbol": "~3.1.1", + "event-emitter": "~0.3.5" } }, - "es6-promise": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-3.2.1.tgz", - "integrity": "sha1-7FYjOGgDKQkgcXDDlEjiREndH8Q=" - }, "es6-set": { "version": "0.1.5", "resolved": "https://registry.npmjs.org/es6-set/-/es6-set-0.1.5.tgz", "integrity": "sha1-0rPsXU2ADO2BjbU40ol02wpzzLE=", "dev": true, "requires": { - "d": "1.0.0", - "es5-ext": "0.10.27", - "es6-iterator": "2.0.1", + "d": "1", + "es5-ext": "~0.10.14", + "es6-iterator": "~2.0.1", "es6-symbol": "3.1.1", - "event-emitter": "0.3.5" + "event-emitter": "~0.3.5" } }, "es6-symbol": { @@ -1239,8 +1251,8 @@ "integrity": "sha1-vwDvT9q2uhtG7Le2KbTH7VcVzHc=", "dev": true, "requires": { - "d": "1.0.0", - "es5-ext": "0.10.27" + "d": "1", + "es5-ext": "~0.10.14" } }, "es6-weak-map": { @@ -1249,10 +1261,10 @@ "integrity": "sha1-XjqzIlH/0VOKH45f+hNXdy+S2W8=", "dev": true, "requires": { - "d": "1.0.0", - "es5-ext": "0.10.27", - "es6-iterator": "2.0.1", - "es6-symbol": "3.1.1" + "d": "1", + "es5-ext": "^0.10.14", + "es6-iterator": "^2.0.1", + "es6-symbol": "^3.1.1" } }, "escape-string-regexp": { @@ -1266,10 +1278,10 @@ "integrity": "sha1-4Bl16BJ4GhY6ba392AOY3GTIicM=", "dev": true, "requires": { - "es6-map": "0.1.5", - "es6-weak-map": "2.0.2", - "esrecurse": "4.2.0", - "estraverse": "4.2.0" + "es6-map": "^0.1.3", + "es6-weak-map": "^2.0.1", + "esrecurse": "^4.1.0", + "estraverse": "^4.1.1" } }, "eslint": { @@ -1278,40 +1290,40 @@ "integrity": "sha1-yaEOi/bp1lZRIEd4xQM0Hx6sPOc=", "dev": true, "requires": { - "babel-code-frame": "6.26.0", - "chalk": "1.1.3", - "concat-stream": "1.6.0", - "debug": "2.6.8", - "doctrine": "1.5.0", - "escope": "3.6.0", - "espree": "3.5.0", - "estraverse": "4.2.0", - "esutils": "2.0.2", - "file-entry-cache": "2.0.0", - "glob": "7.1.1", - "globals": "9.18.0", - "ignore": "3.3.3", - "imurmurhash": "0.1.4", - "inquirer": "0.12.0", - "is-my-json-valid": "2.16.0", - "is-resolvable": "1.0.0", - "js-yaml": "3.9.1", - "json-stable-stringify": "1.0.1", - "levn": "0.3.0", - "lodash": "4.17.4", - "mkdirp": "0.5.1", - "natural-compare": "1.4.0", - "optionator": "0.8.2", - "path-is-inside": "1.0.2", - "pluralize": "1.2.1", - "progress": "1.1.8", - "require-uncached": "1.0.3", - "shelljs": "0.7.8", - "strip-bom": "3.0.0", - "strip-json-comments": "1.0.4", - "table": "3.8.3", - "text-table": "0.2.0", - "user-home": "2.0.0" + "babel-code-frame": "^6.16.0", + "chalk": "^1.1.3", + "concat-stream": "^1.4.6", + "debug": "^2.1.1", + "doctrine": "^1.2.2", + "escope": "^3.6.0", + "espree": "^3.3.1", + "estraverse": "^4.2.0", + "esutils": "^2.0.2", + "file-entry-cache": "^2.0.0", + "glob": "^7.0.3", + "globals": "^9.2.0", + "ignore": "^3.2.0", + "imurmurhash": "^0.1.4", + "inquirer": "^0.12.0", + "is-my-json-valid": "^2.10.0", + "is-resolvable": "^1.0.0", + "js-yaml": "^3.5.1", + "json-stable-stringify": "^1.0.0", + "levn": "^0.3.0", + "lodash": "^4.0.0", + "mkdirp": "^0.5.0", + "natural-compare": "^1.4.0", + "optionator": "^0.8.2", + "path-is-inside": "^1.0.1", + "pluralize": "^1.2.1", + "progress": "^1.1.8", + "require-uncached": "^1.0.2", + "shelljs": "^0.7.5", + "strip-bom": "^3.0.0", + "strip-json-comments": "~1.0.1", + "table": "^3.7.8", + "text-table": "~0.2.0", + "user-home": "^2.0.0" }, "dependencies": { "strip-json-comments": { @@ -1340,9 +1352,9 @@ "integrity": "sha1-Wt2BBujJKNssuiMrzZ76hG49oWw=", "dev": true, "requires": { - "debug": "2.6.8", - "object-assign": "4.1.1", - "resolve": "1.4.0" + "debug": "^2.2.0", + "object-assign": "^4.0.1", + "resolve": "^1.1.6" } }, "eslint-module-utils": { @@ -1351,8 +1363,8 @@ "integrity": "sha512-jDI/X5l/6D1rRD/3T43q8Qgbls2nq5km5KSqiwlyUbGo5+04fXhMKdCPhjwbqAa6HXWaMxj8Q4hQDIh7IadJQw==", "dev": true, "requires": { - "debug": "2.6.8", - "pkg-dir": "1.0.0" + "debug": "^2.6.8", + "pkg-dir": "^1.0.0" } }, "eslint-plugin-import": { @@ -1361,16 +1373,16 @@ "integrity": "sha1-crowb60wXWfEgWNIpGmaQimsi04=", "dev": true, "requires": { - "builtin-modules": "1.1.1", - "contains-path": "0.1.0", - "debug": "2.6.8", + "builtin-modules": "^1.1.1", + "contains-path": "^0.1.0", + "debug": "^2.2.0", "doctrine": "1.5.0", - "eslint-import-resolver-node": "0.2.3", - "eslint-module-utils": "2.1.1", - "has": "1.0.1", - "lodash.cond": "4.5.2", - "minimatch": "3.0.4", - "pkg-up": "1.0.0" + "eslint-import-resolver-node": "^0.2.0", + "eslint-module-utils": "^2.0.0", + "has": "^1.0.1", + "lodash.cond": "^4.3.0", + "minimatch": "^3.0.3", + "pkg-up": "^1.0.0" } }, "eslint-plugin-node": { @@ -1379,10 +1391,10 @@ "integrity": "sha512-vIUQPuwbVYdz/CYnlTLsJrRy7iXHQjdEe5wz0XhhdTym3IInM/zZLlPf9nZ2mThsH0QcsieCOWs2vOeCy/22LQ==", "dev": true, "requires": { - "ignore": "3.3.3", - "minimatch": "3.0.4", - "object-assign": "4.1.1", - "resolve": "1.4.0", + "ignore": "^3.0.11", + "minimatch": "^3.0.2", + "object-assign": "^4.0.1", + "resolve": "^1.1.7", "semver": "5.3.0" }, "dependencies": { @@ -1406,8 +1418,8 @@ "integrity": "sha1-Gvlq6lRYVoJRV9l8G1DVqPtkpac=", "dev": true, "requires": { - "doctrine": "1.5.0", - "jsx-ast-utils": "1.4.1" + "doctrine": "^1.2.2", + "jsx-ast-utils": "^1.3.3" } }, "eslint-plugin-standard": { @@ -1422,8 +1434,8 @@ "integrity": "sha1-mDWGJb3QVYYeon4oZ+pyn69GPY0=", "dev": true, "requires": { - "acorn": "5.1.1", - "acorn-jsx": "3.0.1" + "acorn": "^5.1.1", + "acorn-jsx": "^3.0.0" } }, "esprima": { @@ -1438,7 +1450,7 @@ "integrity": "sha1-z7qLV9f7qT8XKYqKAGoEzaE9gPo=", "dev": true, "requires": { - "estraverse": "4.2.0" + "estraverse": "^4.0.0" } }, "esrecurse": { @@ -1447,8 +1459,8 @@ "integrity": "sha1-+pVo2Y04I/mkHZHpAtyrnqblsWM=", "dev": true, "requires": { - "estraverse": "4.2.0", - "object-assign": "4.1.1" + "estraverse": "^4.1.0", + "object-assign": "^4.0.1" } }, "estraverse": { @@ -1475,8 +1487,8 @@ "integrity": "sha1-34xp7vFkeSPHFXuc6DhAYQsCzDk=", "dev": true, "requires": { - "d": "1.0.0", - "es5-ext": "0.10.27" + "d": "1", + "es5-ext": "~0.10.14" } }, "exit-hook": { @@ -1503,8 +1515,8 @@ "integrity": "sha1-y+Hjr/zxzUS4DK3+0o3Hk6lwHS4=", "dev": true, "requires": { - "escape-string-regexp": "1.0.5", - "object-assign": "4.1.1" + "escape-string-regexp": "^1.0.5", + "object-assign": "^4.1.0" } }, "file-entry-cache": { @@ -1513,8 +1525,8 @@ "integrity": "sha1-w5KZDD5oR4PYOLjISkXYoEhFg2E=", "dev": true, "requires": { - "flat-cache": "1.2.2", - "object-assign": "4.1.1" + "flat-cache": "^1.2.1", + "object-assign": "^4.0.1" } }, "filled-array": { @@ -1535,8 +1547,8 @@ "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", "dev": true, "requires": { - "path-exists": "2.1.0", - "pinkie-promise": "2.0.1" + "path-exists": "^2.0.0", + "pinkie-promise": "^2.0.0" } }, "flat-cache": { @@ -1545,10 +1557,10 @@ "integrity": "sha1-+oZxTnLCHbiGAXYezy9VXRq8a5Y=", "dev": true, "requires": { - "circular-json": "0.3.3", - "del": "2.2.2", - "graceful-fs": "4.1.11", - "write": "0.2.1" + "circular-json": "^0.3.1", + "del": "^2.0.2", + "graceful-fs": "^4.1.2", + "write": "^0.2.1" } }, "foreach": { @@ -1562,7 +1574,7 @@ "resolved": "https://registry.npmjs.org/formatio/-/formatio-1.2.0.tgz", "integrity": "sha1-87IWfZBoxGmKjVH092CjmlTYGOs=", "requires": { - "samsam": "1.2.1" + "samsam": "1.x" } }, "fs.realpath": { @@ -1588,7 +1600,7 @@ "integrity": "sha1-nA4cQDCM6AT0eDYYuTf6iPmdUNA=", "dev": true, "requires": { - "is-property": "1.0.2" + "is-property": "^1.0.0" } }, "get-func-name": { @@ -1607,12 +1619,12 @@ "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.1.tgz", "integrity": "sha1-gFIR3wT6rxxjo2ADBs31reULLsg=", "requires": { - "fs.realpath": "1.0.0", - "inflight": "1.0.6", - "inherits": "2.0.3", - "minimatch": "3.0.4", - "once": "1.4.0", - "path-is-absolute": "1.0.1" + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.2", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" } }, "globals": { @@ -1627,12 +1639,12 @@ "integrity": "sha1-69hGZ8oNuzMLmbz8aOrCvFQ3Dg0=", "dev": true, "requires": { - "array-union": "1.0.2", - "arrify": "1.0.1", - "glob": "7.1.1", - "object-assign": "4.1.1", - "pify": "2.3.0", - "pinkie-promise": "2.0.1" + "array-union": "^1.0.1", + "arrify": "^1.0.0", + "glob": "^7.0.3", + "object-assign": "^4.0.1", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0" } }, "got": { @@ -1641,21 +1653,21 @@ "integrity": "sha1-X4FjWmHkplifGAVp6k44FoClHzU=", "dev": true, "requires": { - "create-error-class": "3.0.2", - "duplexer2": "0.1.4", - "is-redirect": "1.0.0", - "is-retry-allowed": "1.1.0", - "is-stream": "1.1.0", - "lowercase-keys": "1.0.0", - "node-status-codes": "1.0.0", - "object-assign": "4.1.1", - "parse-json": "2.2.0", - "pinkie-promise": "2.0.1", - "read-all-stream": "3.1.0", - "readable-stream": "2.2.7", - "timed-out": "3.1.3", - "unzip-response": "1.0.2", - "url-parse-lax": "1.0.0" + "create-error-class": "^3.0.1", + "duplexer2": "^0.1.4", + "is-redirect": "^1.0.0", + "is-retry-allowed": "^1.0.0", + "is-stream": "^1.0.0", + "lowercase-keys": "^1.0.0", + "node-status-codes": "^1.0.0", + "object-assign": "^4.0.1", + "parse-json": "^2.1.0", + "pinkie-promise": "^2.0.0", + "read-all-stream": "^3.0.0", + "readable-stream": "^2.0.5", + "timed-out": "^3.0.0", + "unzip-response": "^1.0.2", + "url-parse-lax": "^1.0.0" } }, "graceful-fs": { @@ -1680,7 +1692,7 @@ "integrity": "sha1-hGFzP1OLCDfJNh45qauelwTcLyg=", "dev": true, "requires": { - "function-bind": "1.1.0" + "function-bind": "^1.0.2" } }, "has-ansi": { @@ -1689,7 +1701,7 @@ "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", "dev": true, "requires": { - "ansi-regex": "2.1.1" + "ansi-regex": "^2.0.0" } }, "has-flag": { @@ -1703,8 +1715,8 @@ "integrity": "sha1-42w/LSyufXRqhX440Y1fMqeILbg=", "dev": true, "requires": { - "os-homedir": "1.0.2", - "os-tmpdir": "1.0.2" + "os-homedir": "^1.0.0", + "os-tmpdir": "^1.0.1" } }, "htmlparser2": { @@ -1713,12 +1725,12 @@ "integrity": "sha1-G9+HrMoPP55T+k/M6w9LTLsAszg=", "dev": true, "requires": { - "domelementtype": "1.3.0", - "domhandler": "2.4.1", - "domutils": "1.6.2", - "entities": "1.1.1", - "inherits": "2.0.3", - "readable-stream": "2.2.7" + "domelementtype": "^1.3.0", + "domhandler": "^2.3.0", + "domutils": "^1.5.1", + "entities": "^1.1.1", + "inherits": "^2.0.1", + "readable-stream": "^2.0.2" } }, "ignore": { @@ -1738,8 +1750,8 @@ "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", "requires": { - "once": "1.4.0", - "wrappy": "1.0.2" + "once": "^1.3.0", + "wrappy": "1" } }, "inherits": { @@ -1755,10 +1767,11 @@ }, "ink-docstrap": { "version": "git+https://github.com/js-data/docstrap.git#cfbe45fa313e1628c493076d5e15d2b855dfbf2c", + "from": "git+https://github.com/js-data/docstrap.git#cfbe45fa313e1628c493076d5e15d2b855dfbf2c", "dev": true, "requires": { - "moment": "2.18.1", - "sanitize-html": "1.14.1" + "moment": "^2.13.0", + "sanitize-html": "^1.11.4" } }, "inquirer": { @@ -1767,19 +1780,19 @@ "integrity": "sha1-HvK/1jUE3wvHV4X/+MLEHfEvB34=", "dev": true, "requires": { - "ansi-escapes": "1.4.0", - "ansi-regex": "2.1.1", - "chalk": "1.1.3", - "cli-cursor": "1.0.2", - "cli-width": "2.1.0", - "figures": "1.7.0", - "lodash": "4.17.4", - "readline2": "1.0.1", - "run-async": "0.1.0", - "rx-lite": "3.1.2", - "string-width": "1.0.2", - "strip-ansi": "3.0.1", - "through": "2.3.8" + "ansi-escapes": "^1.1.0", + "ansi-regex": "^2.0.0", + "chalk": "^1.0.0", + "cli-cursor": "^1.0.1", + "cli-width": "^2.0.0", + "figures": "^1.3.5", + "lodash": "^4.3.0", + "readline2": "^1.0.1", + "run-async": "^0.1.0", + "rx-lite": "^3.1.2", + "string-width": "^1.0.1", + "strip-ansi": "^3.0.0", + "through": "^2.3.6" } }, "interpret": { @@ -1794,7 +1807,7 @@ "integrity": "sha1-nh9WrArNtr8wMwbzOL47IErmA2A=", "dev": true, "requires": { - "loose-envify": "1.3.1" + "loose-envify": "^1.0.0" } }, "is-arrayish": { @@ -1821,7 +1834,7 @@ "integrity": "sha1-zGZ3aVYCvlUO8R6LSqYwU0K20Ko=", "dev": true, "requires": { - "number-is-nan": "1.0.1" + "number-is-nan": "^1.0.0" } }, "is-fullwidth-code-point": { @@ -1830,7 +1843,7 @@ "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", "dev": true, "requires": { - "number-is-nan": "1.0.1" + "number-is-nan": "^1.0.0" } }, "is-my-json-valid": { @@ -1839,10 +1852,10 @@ "integrity": "sha1-8Hndm/2uZe4gOKrorLyGqxCeNpM=", "dev": true, "requires": { - "generate-function": "2.0.0", - "generate-object-property": "1.2.0", - "jsonpointer": "4.0.1", - "xtend": "4.0.1" + "generate-function": "^2.0.0", + "generate-object-property": "^1.1.0", + "jsonpointer": "^4.0.0", + "xtend": "^4.0.0" } }, "is-npm": { @@ -1869,7 +1882,7 @@ "integrity": "sha1-ZHdYK4IU1gI0YJRWcAO+ip6sBNw=", "dev": true, "requires": { - "is-path-inside": "1.0.0" + "is-path-inside": "^1.0.0" } }, "is-path-inside": { @@ -1878,7 +1891,7 @@ "integrity": "sha1-/AbloWg/vaE95mev9xe7wQpI838=", "dev": true, "requires": { - "path-is-inside": "1.0.2" + "path-is-inside": "^1.0.1" } }, "is-property": { @@ -1899,7 +1912,7 @@ "integrity": "sha1-VRdIm1RwkbCTDglWVM7SXul+lJE=", "dev": true, "requires": { - "has": "1.0.1" + "has": "^1.0.1" } }, "is-resolvable": { @@ -1908,7 +1921,7 @@ "integrity": "sha1-jfV8YeouPFAUCNEA+wE8+NbgzGI=", "dev": true, "requires": { - "tryit": "1.0.3" + "tryit": "^1.0.1" } }, "is-retry-allowed": { @@ -1941,19 +1954,19 @@ "dev": true }, "js-data": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/js-data/-/js-data-3.0.0.tgz", - "integrity": "sha512-iMS5IoBib9p92+5Q9uEbbwd6GFCP6bY2HJL8cAGqY3X8si48s98gI2kT88JlqtlwvaHHkrONnZSwkvRQ9yYGJw==" + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/js-data/-/js-data-3.0.3.tgz", + "integrity": "sha512-uzgEgeTOLH4+AIOEtYe6BQsLcBzS4Zo3npcAVvj3Mv93+W0t4oNaRPsIqHMLeDnMiXI9IR86QtZrChm7QIct3g==" }, "js-data-adapter": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/js-data-adapter/-/js-data-adapter-1.0.0.tgz", "integrity": "sha512-UsDk1Iz2R0JCzdHIIp2PdQurfG/6/V7o5nBS/GpDWZcHWkbSoX/zS8RCuaQ1Chq/fZIyOsRTU2u1lJGbnBbuGQ==", "requires": { - "chai": "4.1.1", - "js-data": "3.0.0", - "mocha": "3.5.0", - "sinon": "2.4.1" + "chai": "^4.0.2", + "js-data": ">= 3.0.0", + "mocha": "^3.4.2", + "sinon": "^2.3.6" }, "dependencies": { "sinon": { @@ -1961,14 +1974,14 @@ "resolved": "https://registry.npmjs.org/sinon/-/sinon-2.4.1.tgz", "integrity": "sha512-vFTrO9Wt0ECffDYIPSP/E5bBugt0UjcBQOfQUMh66xzkyPEnhl/vM2LRZi2ajuTdkH07sA6DzrM6KvdvGIH8xw==", "requires": { - "diff": "3.2.0", + "diff": "^3.1.0", "formatio": "1.2.0", - "lolex": "1.6.0", - "native-promise-only": "0.8.1", - "path-to-regexp": "1.7.0", - "samsam": "1.2.1", + "lolex": "^1.6.0", + "native-promise-only": "^0.8.1", + "path-to-regexp": "^1.7.0", + "samsam": "^1.1.3", "text-encoding": "0.6.4", - "type-detect": "4.0.3" + "type-detect": "^4.0.0" } } } @@ -1992,11 +2005,11 @@ "integrity": "sha1-imqITwhapwYK9pz8dzQcL5k3D7I=", "dev": true, "requires": { - "babel-code-frame": "6.26.0", - "babel-traverse": "6.26.0", - "babel-types": "6.26.0", - "babylon": "6.18.0", - "lodash.pickby": "4.6.0" + "babel-code-frame": "^6.16.0", + "babel-traverse": "^6.15.0", + "babel-types": "^6.15.0", + "babylon": "^6.13.0", + "lodash.pickby": "^4.6.0" } }, "standard": { @@ -2005,13 +2018,13 @@ "integrity": "sha1-Y1Eyvnv7VnwpIQBfMPnjUOR1Kq0=", "dev": true, "requires": { - "eslint": "3.10.2", + "eslint": "~3.10.2", "eslint-config-standard": "6.2.1", "eslint-config-standard-jsx": "3.2.0", - "eslint-plugin-promise": "3.4.2", - "eslint-plugin-react": "6.7.1", - "eslint-plugin-standard": "2.0.1", - "standard-engine": "5.2.0" + "eslint-plugin-promise": "~3.4.0", + "eslint-plugin-react": "~6.7.1", + "eslint-plugin-standard": "~2.0.1", + "standard-engine": "~5.2.0" } } } @@ -2028,8 +2041,8 @@ "integrity": "sha512-CbcG379L1e+mWBnLvHWWeLs8GyV/EMw862uLI3c+GxVyDHWZcjZinwuBd3iW2pgxgIlksW/1vNJa4to+RvDOww==", "dev": true, "requires": { - "argparse": "1.0.9", - "esprima": "4.0.0" + "argparse": "^1.0.7", + "esprima": "^4.0.0" } }, "js2xmlparser": { @@ -2038,27 +2051,27 @@ "integrity": "sha1-P7YOqgicVED5MZ9RdgzNB+JJlzM=", "dev": true, "requires": { - "xmlcreate": "1.0.2" + "xmlcreate": "^1.0.1" } }, "jsdoc": { - "version": "3.5.4", - "resolved": "https://registry.npmjs.org/jsdoc/-/jsdoc-3.5.4.tgz", - "integrity": "sha512-VmTw0J+2L16IxAe0JSDSAcH0F+DbZxaj8wN1AjHtKMQU/hO0ciIl5ZE93XqrrFIbknobuqHKJCXZj6+Hk57MjA==", + "version": "3.5.5", + "resolved": "https://registry.npmjs.org/jsdoc/-/jsdoc-3.5.5.tgz", + "integrity": "sha512-6PxB65TAU4WO0Wzyr/4/YhlGovXl0EVYfpKbpSroSj0qBxT4/xod/l40Opkm38dRHRdQgdeY836M0uVnJQG7kg==", "dev": true, "requires": { "babylon": "7.0.0-beta.19", - "bluebird": "3.5.0", - "catharsis": "0.8.9", - "escape-string-regexp": "1.0.5", - "js2xmlparser": "3.0.0", - "klaw": "2.0.0", - "marked": "0.3.6", - "mkdirp": "0.5.1", - "requizzle": "0.2.1", - "strip-json-comments": "2.0.1", + "bluebird": "~3.5.0", + "catharsis": "~0.8.9", + "escape-string-regexp": "~1.0.5", + "js2xmlparser": "~3.0.0", + "klaw": "~2.0.0", + "marked": "~0.3.6", + "mkdirp": "~0.5.1", + "requizzle": "~0.2.1", + "strip-json-comments": "~2.0.1", "taffydb": "2.6.2", - "underscore": "1.8.3" + "underscore": "~1.8.3" }, "dependencies": { "babylon": { @@ -2081,7 +2094,7 @@ "integrity": "sha1-E/FM4C7tTpgSl7ZOueO5MuLdE9w=", "dev": true, "requires": { - "jju": "1.3.0" + "jju": "^1.1.0" } }, "json-stable-stringify": { @@ -2090,7 +2103,7 @@ "integrity": "sha1-mnWdOcXy/1A/1TAGRu1EX4jE+a8=", "dev": true, "requires": { - "jsonify": "0.0.0" + "jsonify": "~0.0.0" } }, "json3": { @@ -2134,7 +2147,7 @@ "integrity": "sha1-WcEo4Nxc5BAgEVEZTuucv4WGUPY=", "dev": true, "requires": { - "graceful-fs": "4.1.11" + "graceful-fs": "^4.1.9" } }, "latest-version": { @@ -2143,7 +2156,7 @@ "integrity": "sha1-VvjWE5YghHuAF/jx9NeOIRMkFos=", "dev": true, "requires": { - "package-json": "2.4.0" + "package-json": "^2.0.0" } }, "lazy-req": { @@ -2158,8 +2171,8 @@ "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", "dev": true, "requires": { - "prelude-ls": "1.1.2", - "type-check": "0.3.2" + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2" } }, "load-json-file": { @@ -2168,10 +2181,10 @@ "integrity": "sha1-eUfkIUmvgNaWy/eXvKq8/h/inKg=", "dev": true, "requires": { - "graceful-fs": "4.1.11", - "parse-json": "2.2.0", - "pify": "2.3.0", - "strip-bom": "3.0.0" + "graceful-fs": "^4.1.2", + "parse-json": "^2.2.0", + "pify": "^2.0.0", + "strip-bom": "^3.0.0" } }, "locate-path": { @@ -2180,8 +2193,8 @@ "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", "dev": true, "requires": { - "p-locate": "2.0.0", - "path-exists": "3.0.0" + "p-locate": "^2.0.0", + "path-exists": "^3.0.0" }, "dependencies": { "path-exists": { @@ -2203,8 +2216,8 @@ "resolved": "https://registry.npmjs.org/lodash._baseassign/-/lodash._baseassign-3.2.0.tgz", "integrity": "sha1-jDigmVAPIVrQnlnxci/QxSv+Ck4=", "requires": { - "lodash._basecopy": "3.0.1", - "lodash.keys": "3.1.2" + "lodash._basecopy": "^3.0.0", + "lodash.keys": "^3.0.0" } }, "lodash._basecopy": { @@ -2227,6 +2240,12 @@ "resolved": "https://registry.npmjs.org/lodash._isiterateecall/-/lodash._isiterateecall-3.0.9.tgz", "integrity": "sha1-UgOte6Ql+uhCRg5pbbnPPmqsBXw=" }, + "lodash.clonedeep": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz", + "integrity": "sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8=", + "dev": true + }, "lodash.cond": { "version": "4.5.2", "resolved": "https://registry.npmjs.org/lodash.cond/-/lodash.cond-4.5.2.tgz", @@ -2238,11 +2257,17 @@ "resolved": "https://registry.npmjs.org/lodash.create/-/lodash.create-3.1.1.tgz", "integrity": "sha1-1/KEnw29p+BGgruM1yqwIkYd6+c=", "requires": { - "lodash._baseassign": "3.2.0", - "lodash._basecreate": "3.0.3", - "lodash._isiterateecall": "3.0.9" + "lodash._baseassign": "^3.0.0", + "lodash._basecreate": "^3.0.0", + "lodash._isiterateecall": "^3.0.0" } }, + "lodash.escaperegexp": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/lodash.escaperegexp/-/lodash.escaperegexp-4.1.2.tgz", + "integrity": "sha1-ZHYsSGGAglGKw99Mz11YhtriA0c=", + "dev": true + }, "lodash.isarguments": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz", @@ -2253,16 +2278,34 @@ "resolved": "https://registry.npmjs.org/lodash.isarray/-/lodash.isarray-3.0.4.tgz", "integrity": "sha1-eeTriMNqgSKvhvhEqpvNhRtfu1U=" }, + "lodash.isplainobject": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", + "integrity": "sha1-fFJqUtibRcRcxpC4gWO+BJf1UMs=", + "dev": true + }, + "lodash.isstring": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/lodash.isstring/-/lodash.isstring-4.0.1.tgz", + "integrity": "sha1-1SfftUVuynzJu5XV2ur4i6VKVFE=", + "dev": true + }, "lodash.keys": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/lodash.keys/-/lodash.keys-3.1.2.tgz", "integrity": "sha1-TbwEcrFWvlCgsoaFXRvQsMZWCYo=", "requires": { - "lodash._getnative": "3.9.1", - "lodash.isarguments": "3.1.0", - "lodash.isarray": "3.0.4" + "lodash._getnative": "^3.0.0", + "lodash.isarguments": "^3.0.0", + "lodash.isarray": "^3.0.0" } }, + "lodash.mergewith": { + "version": "4.6.1", + "resolved": "https://registry.npmjs.org/lodash.mergewith/-/lodash.mergewith-4.6.1.tgz", + "integrity": "sha512-eWw5r+PYICtEBgrBE5hhlT6aAa75f411bgDz/ZL2KZqYV03USvucsxcHUIlGTDTECs1eunpI7HOV7U+WLDvNdQ==", + "dev": true + }, "lodash.pickby": { "version": "4.6.0", "resolved": "https://registry.npmjs.org/lodash.pickby/-/lodash.pickby-4.6.0.tgz", @@ -2285,7 +2328,7 @@ "integrity": "sha1-0aitM/qc4OcT1l/dCsi3SNR4yEg=", "dev": true, "requires": { - "js-tokens": "3.0.2" + "js-tokens": "^3.0.0" } }, "lowercase-keys": { @@ -2295,17 +2338,24 @@ "dev": true }, "marked": { - "version": "0.3.6", - "resolved": "https://registry.npmjs.org/marked/-/marked-0.3.6.tgz", - "integrity": "sha1-ssbGGPzOzk74bE/Gy4p8v1rtqNc=", + "version": "0.3.19", + "resolved": "https://registry.npmjs.org/marked/-/marked-0.3.19.tgz", + "integrity": "sha512-ea2eGWOqNxPcXv8dyERdSr/6FmzvWwzjMxpfGB/sbMccXoct+xY+YukPD+QTUZwyvK7BZwcr4m21WBOW41pAkg==", "dev": true }, + "memory-pager": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/memory-pager/-/memory-pager-1.1.0.tgz", + "integrity": "sha512-Mf9OHV/Y7h6YWDxTzX/b4ZZ4oh9NSXblQL8dtPCOomOtZciEHxePR78+uHFLLlsk01A6jVHhHsQZZ/WcIPpnzg==", + "dev": true, + "optional": true + }, "minimatch": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", "requires": { - "brace-expansion": "1.1.8" + "brace-expansion": "^1.1.7" } }, "minimist": { @@ -2340,28 +2390,53 @@ } }, "moment": { - "version": "2.18.1", - "resolved": "https://registry.npmjs.org/moment/-/moment-2.18.1.tgz", - "integrity": "sha1-w2GT3Tzhwu7SrbfIAtu8d6gbHA8=", + "version": "2.22.2", + "resolved": "https://registry.npmjs.org/moment/-/moment-2.22.2.tgz", + "integrity": "sha1-PCV/mDn8DpP/UxSWMiOeuQeD/2Y=", "dev": true }, "mongodb": { - "version": "2.2.31", - "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-2.2.31.tgz", - "integrity": "sha1-GUBEXGYeGSF7s7+CRdmFSq71SNs=", + "version": "3.1.6", + "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-3.1.6.tgz", + "integrity": "sha512-E5QJuXQoMlT7KyCYqNNMfAkhfQD79AT4F8Xd+6x37OX+8BL17GyXyWvfm6wuyx4wnzCCPoCSLeMeUN2S7dU9yw==", + "dev": true, "requires": { - "es6-promise": "3.2.1", - "mongodb-core": "2.1.15", - "readable-stream": "2.2.7" + "mongodb-core": "3.1.5", + "safe-buffer": "^5.1.2" + }, + "dependencies": { + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + } } }, "mongodb-core": { - "version": "2.1.15", - "resolved": "https://registry.npmjs.org/mongodb-core/-/mongodb-core-2.1.15.tgz", - "integrity": "sha1-hB9TuH//9MdFgYnDXIroJ+EWl2Q=", + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/mongodb-core/-/mongodb-core-3.1.5.tgz", + "integrity": "sha512-emT/tM4ZBinqd6RZok+EzDdtN4LjYJIckv71qQVOEFmvXgT5cperZegVmTgox/1cx4XQu6LJ5ZuIwipP/eKdQg==", + "dev": true, "requires": { - "bson": "1.0.4", - "require_optional": "1.0.1" + "bson": "^1.1.0", + "require_optional": "^1.0.1", + "safe-buffer": "^5.1.2", + "saslprep": "^1.0.0" + }, + "dependencies": { + "bson": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/bson/-/bson-1.1.0.tgz", + "integrity": "sha512-9Aeai9TacfNtWXOYarkFJRW2CWo+dRon+fuLZYJmvLV3+MiUp0bEI6IAZfXEIg7/Pl/7IWlLaDnhzTsD81etQA==", + "dev": true + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + } } }, "ms": { @@ -2392,10 +2467,10 @@ "integrity": "sha1-DakrEKhU6XwPSW9sKEWjASgLPu8=", "dev": true, "requires": { - "formatio": "1.2.0", - "just-extend": "1.1.22", - "lolex": "1.6.0", - "path-to-regexp": "1.7.0" + "formatio": "^1.2.0", + "just-extend": "^1.1.22", + "lolex": "^1.6.0", + "path-to-regexp": "^1.7.0" } }, "node-alias": { @@ -2404,8 +2479,8 @@ "integrity": "sha1-HxuRa1a56iQcATX5fO1pQPVW8pI=", "dev": true, "requires": { - "chalk": "1.1.3", - "lodash": "4.17.4" + "chalk": "^1.1.1", + "lodash": "^4.2.0" } }, "node-status-codes": { @@ -2420,167 +2495,180 @@ "integrity": "sha1-Wx1XfkyIadbIYDvInpzRY3MD5G4=", "dev": true, "requires": { - "abbrev": "1.0.9", - "ansi-regex": "2.0.0", - "ansicolors": "0.3.2", - "ansistyles": "0.1.3", - "aproba": "1.0.4", - "archy": "1.0.0", - "asap": "2.0.5", - "chownr": "1.0.1", - "cmd-shim": "2.0.2", - "columnify": "1.5.4", - "config-chain": "1.1.11", - "debuglog": "1.0.1", - "dezalgo": "1.0.3", - "editor": "1.0.0", - "fs-vacuum": "1.2.9", - "fs-write-stream-atomic": "1.0.8", - "fstream": "1.0.10", - "fstream-npm": "1.2.0", - "glob": "7.1.0", - "graceful-fs": "4.1.9", - "has-unicode": "2.0.1", - "hosted-git-info": "2.1.5", - "iferr": "0.1.5", - "imurmurhash": "0.1.4", - "inflight": "1.0.5", - "inherits": "2.0.3", - "ini": "1.3.4", - "init-package-json": "1.9.4", - "lockfile": "1.0.2", - "lodash._baseindexof": "3.1.0", - "lodash._baseuniq": "4.6.0", - "lodash._bindcallback": "3.0.1", - "lodash._cacheindexof": "3.0.2", - "lodash._createcache": "3.1.2", - "lodash._getnative": "3.9.1", - "lodash.clonedeep": "4.5.0", - "lodash.restparam": "3.6.1", - "lodash.union": "4.6.0", - "lodash.uniq": "4.5.0", - "lodash.without": "4.4.0", - "mkdirp": "0.5.1", - "node-gyp": "3.4.0", - "nopt": "3.0.6", - "normalize-git-url": "3.0.2", - "normalize-package-data": "2.3.5", - "npm-cache-filename": "1.0.2", - "npm-install-checks": "3.0.0", - "npm-package-arg": "4.2.0", - "npm-registry-client": "7.2.1", - "npm-user-validate": "0.1.5", - "npmlog": "4.0.0", - "once": "1.4.0", - "opener": "1.4.2", - "osenv": "0.1.3", - "path-is-inside": "1.0.2", - "read": "1.0.7", - "read-cmd-shim": "1.0.1", - "read-installed": "4.0.3", - "read-package-json": "2.0.4", - "read-package-tree": "5.1.5", - "readable-stream": "2.1.5", - "readdir-scoped-modules": "1.0.2", - "realize-package-specifier": "3.0.3", - "request": "2.75.0", - "retry": "0.10.0", - "rimraf": "2.5.4", - "semver": "5.3.0", - "sha": "2.0.1", - "slide": "1.1.6", - "sorted-object": "2.0.1", - "strip-ansi": "3.0.1", - "tar": "2.2.1", - "text-table": "0.2.0", + "abbrev": "~1.0.9", + "ansi-regex": "*", + "ansicolors": "~0.3.2", + "ansistyles": "~0.1.3", + "aproba": "~1.0.4", + "archy": "~1.0.0", + "asap": "~2.0.5", + "chownr": "~1.0.1", + "cmd-shim": "~2.0.2", + "columnify": "~1.5.4", + "config-chain": "~1.1.11", + "debuglog": "*", + "dezalgo": "~1.0.3", + "editor": "~1.0.0", + "fs-vacuum": "~1.2.9", + "fs-write-stream-atomic": "~1.0.8", + "fstream": "~1.0.10", + "fstream-npm": "~1.2.0", + "glob": "~7.1.0", + "graceful-fs": "~4.1.9", + "has-unicode": "~2.0.1", + "hosted-git-info": "~2.1.5", + "iferr": "~0.1.5", + "imurmurhash": "*", + "inflight": "~1.0.5", + "inherits": "~2.0.3", + "ini": "~1.3.4", + "init-package-json": "~1.9.4", + "lockfile": "~1.0.2", + "lodash._baseindexof": "*", + "lodash._baseuniq": "~4.6.0", + "lodash._bindcallback": "*", + "lodash._cacheindexof": "*", + "lodash._createcache": "*", + "lodash._getnative": "*", + "lodash.clonedeep": "~4.5.0", + "lodash.restparam": "*", + "lodash.union": "~4.6.0", + "lodash.uniq": "~4.5.0", + "lodash.without": "~4.4.0", + "mkdirp": "~0.5.1", + "node-gyp": "~3.4.0", + "nopt": "~3.0.6", + "normalize-git-url": "~3.0.2", + "normalize-package-data": "~2.3.5", + "npm-cache-filename": "~1.0.2", + "npm-install-checks": "~3.0.0", + "npm-package-arg": "~4.2.0", + "npm-registry-client": "~7.2.1", + "npm-user-validate": "~0.1.5", + "npmlog": "~4.0.0", + "once": "~1.4.0", + "opener": "~1.4.2", + "osenv": "~0.1.3", + "path-is-inside": "~1.0.2", + "read": "~1.0.7", + "read-cmd-shim": "~1.0.1", + "read-installed": "~4.0.3", + "read-package-json": "~2.0.4", + "read-package-tree": "~5.1.5", + "readable-stream": "~2.1.5", + "readdir-scoped-modules": "*", + "realize-package-specifier": "~3.0.3", + "request": "~2.75.0", + "retry": "~0.10.0", + "rimraf": "~2.5.4", + "semver": "~5.3.0", + "sha": "~2.0.1", + "slide": "~1.1.6", + "sorted-object": "~2.0.1", + "strip-ansi": "~3.0.1", + "tar": "~2.2.1", + "text-table": "~0.2.0", "uid-number": "0.0.6", - "umask": "1.1.0", - "unique-filename": "1.1.0", - "unpipe": "1.0.0", - "validate-npm-package-license": "3.0.1", - "validate-npm-package-name": "2.2.2", - "which": "1.2.11", - "wrappy": "1.0.2", - "write-file-atomic": "1.2.0" + "umask": "~1.1.0", + "unique-filename": "~1.1.0", + "unpipe": "~1.0.0", + "validate-npm-package-license": "*", + "validate-npm-package-name": "~2.2.2", + "which": "~1.2.11", + "wrappy": "~1.0.2", + "write-file-atomic": "~1.2.0" }, "dependencies": { "abbrev": { "version": "1.0.9", - "bundled": true, + "resolved": false, + "integrity": "sha1-kbR5JYinc4wl813W9jdSovh3YTU=", "dev": true }, "ansi-regex": { "version": "2.0.0", - "bundled": true, + "resolved": false, + "integrity": "sha1-xQYbbg74qBd15Q9dZhUb9r83EQc=", "dev": true }, "ansicolors": { "version": "0.3.2", - "bundled": true, + "resolved": false, + "integrity": "sha1-ZlWX3oap/+Oqm/vmyuXG6kJrSXk=", "dev": true }, "ansistyles": { "version": "0.1.3", - "bundled": true, + "resolved": false, + "integrity": "sha1-XeYEFb2gcbs3EnhUyGT0GyMlRTk=", "dev": true }, "aproba": { "version": "1.0.4", - "bundled": true, + "resolved": false, + "integrity": "sha1-JxNoB3XnYUyLoYbAZdTi5S0QcsA=", "dev": true }, "archy": { "version": "1.0.0", - "bundled": true, + "resolved": false, + "integrity": "sha1-+cjBN1fMHde8N5rHeyxipcKGjEA=", "dev": true }, "asap": { "version": "2.0.5", - "bundled": true, + "resolved": false, + "integrity": "sha1-UidltQw1EEkOUtfc/ghe+bqWlY8=", "dev": true }, "chownr": { "version": "1.0.1", - "bundled": true, + "resolved": false, + "integrity": "sha1-4qdQQqlVGQi+vSW4Uj1fl2nXkYE=", "dev": true }, "cmd-shim": { "version": "2.0.2", - "bundled": true, + "resolved": false, + "integrity": "sha1-b8vamUg6j9FdfTChlspp1oii79s=", "dev": true, "requires": { - "graceful-fs": "4.1.9", - "mkdirp": "0.5.1" + "graceful-fs": "^4.1.2", + "mkdirp": "~0.5.0" } }, "columnify": { "version": "1.5.4", - "bundled": true, + "resolved": false, + "integrity": "sha1-Rzfd8ce2mop8NAVweC6UfuyOeLs=", "dev": true, "requires": { - "strip-ansi": "3.0.1", - "wcwidth": "1.0.0" + "strip-ansi": "^3.0.0", + "wcwidth": "^1.0.0" }, "dependencies": { "wcwidth": { "version": "1.0.0", - "bundled": true, + "resolved": false, + "integrity": "sha1-AtBZ/3qPx0Hg9rXaHmmytA2uym8=", "dev": true, "requires": { - "defaults": "1.0.3" + "defaults": "^1.0.0" }, "dependencies": { "defaults": { "version": "1.0.3", - "bundled": true, + "resolved": false, + "integrity": "sha1-xlYFHpgX2f8I7YgUd/P+QBnz730=", "dev": true, "requires": { - "clone": "1.0.2" + "clone": "^1.0.2" }, "dependencies": { "clone": { "version": "1.0.2", - "bundled": true, + "resolved": false, + "integrity": "sha1-Jgt6meux7f4kdTgXX3gyQ8sZ0Uk=", "dev": true } } @@ -2589,117 +2677,143 @@ } } }, + "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 + }, "config-chain": { "version": "1.1.11", - "bundled": true, + "resolved": false, + "integrity": "sha1-q6CXR9++TD5w52am5BWG4YWfxvI=", "dev": true, "requires": { - "ini": "1.3.4", - "proto-list": "1.2.4" + "ini": "^1.3.4", + "proto-list": "~1.2.1" }, "dependencies": { "proto-list": { "version": "1.2.4", - "bundled": true, + "resolved": false, + "integrity": "sha1-IS1b/hMYMGpCD2QCuOJv85ZHqEk=", "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 + }, "debuglog": { "version": "1.0.1", - "bundled": true, + "resolved": false, + "integrity": "sha1-qiT/uaw9+aI1GDfPstJ5NgzXhJI=", "dev": true }, "dezalgo": { "version": "1.0.3", - "bundled": true, + "resolved": false, + "integrity": "sha1-f3Qt4Gb8dIvI24IFad3c5Jvw1FY=", "dev": true, "requires": { - "asap": "2.0.5", - "wrappy": "1.0.2" + "asap": "^2.0.0", + "wrappy": "1" } }, "editor": { "version": "1.0.0", - "bundled": true, + "resolved": false, + "integrity": "sha1-YMf4e9YrzGqJT6jM1q+3gjok90I=", "dev": true }, "fs-vacuum": { "version": "1.2.9", - "bundled": true, + "resolved": false, + "integrity": "sha1-T5AZOrjqAokJlbzU6ARlml02ay0=", "dev": true, "requires": { - "graceful-fs": "4.1.9", - "path-is-inside": "1.0.2", - "rimraf": "2.5.4" + "graceful-fs": "^4.1.2", + "path-is-inside": "^1.0.1", + "rimraf": "^2.5.2" } }, "fs-write-stream-atomic": { "version": "1.0.8", - "bundled": true, + "resolved": false, + "integrity": "sha1-5Jqt3yiPh9Rv+eiC8hahOrxAd4s=", "dev": true, "requires": { - "graceful-fs": "4.1.9", - "iferr": "0.1.5", - "imurmurhash": "0.1.4", - "readable-stream": "2.1.5" + "graceful-fs": "^4.1.2", + "iferr": "^0.1.5", + "imurmurhash": "^0.1.4", + "readable-stream": "1 || 2" } }, "fstream": { "version": "1.0.10", - "bundled": true, + "resolved": false, + "integrity": "sha1-YE6Kkv4m/9n2+uMDmdSYThqyKCI=", "dev": true, "requires": { - "graceful-fs": "4.1.9", - "inherits": "2.0.3", - "mkdirp": "0.5.1", - "rimraf": "2.5.4" + "graceful-fs": "^4.1.2", + "inherits": "~2.0.0", + "mkdirp": ">=0.5 0", + "rimraf": "2" } }, "fstream-npm": { "version": "1.2.0", - "bundled": true, + "resolved": false, + "integrity": "sha1-0sPIkQE0aYLWTlcJHDhIe9qRb84=", "dev": true, "requires": { - "fstream-ignore": "1.0.5", - "inherits": "2.0.3" + "fstream-ignore": "^1.0.0", + "inherits": "2" }, "dependencies": { "fstream-ignore": { "version": "1.0.5", - "bundled": true, + "resolved": false, + "integrity": "sha1-nDHa40dnAY/h0kmyTa2mfQktoQU=", "dev": true, "requires": { - "fstream": "1.0.10", - "inherits": "2.0.3", - "minimatch": "3.0.3" + "fstream": "^1.0.0", + "inherits": "2", + "minimatch": "^3.0.0" }, "dependencies": { "minimatch": { "version": "3.0.3", - "bundled": true, + "resolved": false, + "integrity": "sha1-Kk5AkLlrLbBqnX3wEFWmKnfJt3Q=", "dev": true, "requires": { - "brace-expansion": "1.1.6" + "brace-expansion": "^1.0.0" }, "dependencies": { "brace-expansion": { "version": "1.1.6", - "bundled": true, + "resolved": false, + "integrity": "sha1-cZfX6qm4fmSDkOph/GbIRCdCDfk=", "dev": true, "requires": { - "balanced-match": "0.4.2", + "balanced-match": "^0.4.1", "concat-map": "0.0.1" }, "dependencies": { "balanced-match": { "version": "0.4.2", - "bundled": true, + "resolved": false, + "integrity": "sha1-yz8+PHMtwPAe5wtAPzAuYddwmDg=", "dev": true }, "concat-map": { "version": "0.0.1", - "bundled": true, + "resolved": false, + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", "dev": true } } @@ -2712,47 +2826,53 @@ }, "glob": { "version": "7.1.0", - "bundled": true, + "resolved": false, + "integrity": "sha1-Nq3YVtdG0NmeTMJ5e7oa4sZycv0=", "dev": true, "requires": { - "fs.realpath": "1.0.0", - "inflight": "1.0.5", - "inherits": "2.0.3", - "minimatch": "3.0.3", - "once": "1.4.0", - "path-is-absolute": "1.0.1" + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.2", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" }, "dependencies": { "fs.realpath": { "version": "1.0.0", - "bundled": true, + "resolved": false, + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", "dev": true }, "minimatch": { "version": "3.0.3", - "bundled": true, + "resolved": false, + "integrity": "sha1-Kk5AkLlrLbBqnX3wEFWmKnfJt3Q=", "dev": true, "requires": { - "brace-expansion": "1.1.6" + "brace-expansion": "^1.0.0" }, "dependencies": { "brace-expansion": { "version": "1.1.6", - "bundled": true, + "resolved": false, + "integrity": "sha1-cZfX6qm4fmSDkOph/GbIRCdCDfk=", "dev": true, "requires": { - "balanced-match": "0.4.2", + "balanced-match": "^0.4.1", "concat-map": "0.0.1" }, "dependencies": { "balanced-match": { "version": "0.4.2", - "bundled": true, + "resolved": false, + "integrity": "sha1-yz8+PHMtwPAe5wtAPzAuYddwmDg=", "dev": true }, "concat-map": { "version": "0.0.1", - "bundled": true, + "resolved": false, + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", "dev": true } } @@ -2761,212 +2881,238 @@ }, "path-is-absolute": { "version": "1.0.1", - "bundled": true, + "resolved": false, + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", "dev": true } } }, "graceful-fs": { "version": "4.1.9", - "bundled": true, + "resolved": false, + "integrity": "sha1-uqy6N9GdEfnRRtNXi8mZWMN4fik=", "dev": true }, "has-unicode": { "version": "2.0.1", - "bundled": true, + "resolved": false, + "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=", "dev": true }, "hosted-git-info": { "version": "2.1.5", - "bundled": true, + "resolved": false, + "integrity": "sha1-C6gdkNouJas0ozLm7HeTbhWYEYs=", "dev": true }, "iferr": { "version": "0.1.5", - "bundled": true, + "resolved": false, + "integrity": "sha1-xg7taebY/bazEEofy8ocGS3FtQE=", "dev": true }, "imurmurhash": { "version": "0.1.4", - "bundled": true, + "resolved": false, + "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", "dev": true }, "inflight": { "version": "1.0.5", - "bundled": true, + "resolved": false, + "integrity": "sha1-2zIEzVqd4ubNiQuFxuL2a89PYgo=", "dev": true, "requires": { - "once": "1.4.0", - "wrappy": "1.0.2" + "once": "^1.3.0", + "wrappy": "1" } }, "inherits": { "version": "2.0.3", - "bundled": true, + "resolved": false, + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", "dev": true }, "ini": { "version": "1.3.4", - "bundled": true, + "resolved": false, + "integrity": "sha1-BTfLedr1m1mhpRff9wbIbsA5Fi4=", "dev": true }, "init-package-json": { "version": "1.9.4", - "bundled": true, - "dev": true, - "requires": { - "glob": "6.0.4", - "npm-package-arg": "4.2.0", - "promzard": "0.3.0", - "read": "1.0.7", - "read-package-json": "2.0.4", - "semver": "5.3.0", - "validate-npm-package-license": "3.0.1", - "validate-npm-package-name": "2.2.2" + "resolved": false, + "integrity": "sha1-tAU9C0Dwz4QqQZZpN8s9wPU06FY=", + "dev": true, + "requires": { + "glob": "^6.0.0", + "npm-package-arg": "^4.0.0", + "promzard": "^0.3.0", + "read": "~1.0.1", + "read-package-json": "1 || 2", + "semver": "2.x || 3.x || 4 || 5", + "validate-npm-package-license": "^3.0.1", + "validate-npm-package-name": "^2.0.1" }, "dependencies": { "glob": { "version": "6.0.4", - "bundled": true, + "resolved": false, + "integrity": "sha1-DwiGD2oVUSey+t1PnOJLGqtuTSI=", "dev": true, "requires": { - "inflight": "1.0.5", - "inherits": "2.0.3", - "minimatch": "3.0.3", - "once": "1.4.0", - "path-is-absolute": "1.0.0" + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "2 || 3", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" }, "dependencies": { "minimatch": { "version": "3.0.3", - "bundled": true, + "resolved": false, + "integrity": "sha1-Kk5AkLlrLbBqnX3wEFWmKnfJt3Q=", "dev": true, "requires": { - "brace-expansion": "1.1.6" + "brace-expansion": "^1.0.0" }, "dependencies": { "brace-expansion": { "version": "1.1.6", - "bundled": true, + "resolved": false, + "integrity": "sha1-cZfX6qm4fmSDkOph/GbIRCdCDfk=", "dev": true, "requires": { - "balanced-match": "0.4.2", + "balanced-match": "^0.4.1", "concat-map": "0.0.1" }, "dependencies": { "balanced-match": { "version": "0.4.2", - "bundled": true, - "dev": true - }, - "concat-map": { - "version": "0.0.1", - "bundled": true, + "resolved": false, + "integrity": "sha1-yz8+PHMtwPAe5wtAPzAuYddwmDg=", "dev": true } } } } - }, - "path-is-absolute": { - "version": "1.0.0", - "bundled": true, - "dev": true } } }, "promzard": { "version": "0.3.0", - "bundled": true, + "resolved": false, + "integrity": "sha1-JqXW7ox97kyxIggwWs+5O6OCqe4=", "dev": true, "requires": { - "read": "1.0.7" + "read": "1" } } } }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + }, "lockfile": { "version": "1.0.2", - "bundled": true, + "resolved": false, + "integrity": "sha1-l+GZAXT2lsvgo6zVikO4SqMMfIM=", "dev": true }, "lodash._baseindexof": { "version": "3.1.0", - "bundled": true, + "resolved": false, + "integrity": "sha1-/lK1OhxnYeQmGNZU5KJXie1hgiw=", "dev": true }, "lodash._baseuniq": { "version": "4.6.0", - "bundled": true, + "resolved": false, + "integrity": "sha1-DrtE5FaBSveQXGIS+iybLVG4Qeg=", "dev": true, "requires": { - "lodash._createset": "4.0.3", - "lodash._root": "3.0.1" + "lodash._createset": "~4.0.0", + "lodash._root": "~3.0.0" }, "dependencies": { "lodash._createset": { "version": "4.0.3", - "bundled": true, + "resolved": false, + "integrity": "sha1-D0ZZ+7CddRlPqeK4imZE02PJ/iY=", "dev": true }, "lodash._root": { "version": "3.0.1", - "bundled": true, + "resolved": false, + "integrity": "sha1-+6HEUkwZ7ppfgTa0YJ8BfPTe1pI=", "dev": true } } }, "lodash._bindcallback": { "version": "3.0.1", - "bundled": true, + "resolved": false, + "integrity": "sha1-5THCdkTPi1epnhftlbNcdIeJOS4=", "dev": true }, "lodash._cacheindexof": { "version": "3.0.2", - "bundled": true, + "resolved": false, + "integrity": "sha1-PcaayCSY0u5ePOVgkbr9Ktx73pI=", "dev": true }, "lodash._createcache": { "version": "3.1.2", - "bundled": true, + "resolved": false, + "integrity": "sha1-VtagZAF2JeeevKa4AY4XRAvc8JM=", "dev": true, "requires": { - "lodash._getnative": "3.9.1" + "lodash._getnative": "^3.0.0" } }, "lodash._getnative": { "version": "3.9.1", - "bundled": true, + "resolved": false, + "integrity": "sha1-VwvH3t5G1hzc3mh9ZdPuy6o6r/U=", "dev": true }, "lodash.clonedeep": { "version": "4.5.0", - "bundled": true, + "resolved": false, + "integrity": "sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8=", "dev": true }, "lodash.restparam": { "version": "3.6.1", - "bundled": true, + "resolved": false, + "integrity": "sha1-k2pOMJ7zMKdkXtQUWYbIWuWyCAU=", "dev": true }, "lodash.union": { "version": "4.6.0", - "bundled": true, + "resolved": false, + "integrity": "sha1-SLtQiECfFvGCFmZkHETdGqrjzYg=", "dev": true }, "lodash.uniq": { "version": "4.5.0", - "bundled": true, + "resolved": false, + "integrity": "sha1-0CJTc662Uq3BvILklFM5qEJ1R3M=", "dev": true }, "lodash.without": { "version": "4.4.0", - "bundled": true, + "resolved": false, + "integrity": "sha1-PNRXSgC2e643OpS3SHcmQFB7eqw=", "dev": true }, "mkdirp": { "version": "0.5.1", - "bundled": true, + "resolved": false, + "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", "dev": true, "requires": { "minimist": "0.0.8" @@ -2974,57 +3120,63 @@ "dependencies": { "minimist": { "version": "0.0.8", - "bundled": true, + "resolved": false, + "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", "dev": true } } }, "node-gyp": { "version": "3.4.0", - "bundled": true, - "dev": true, - "requires": { - "fstream": "1.0.10", - "glob": "7.1.0", - "graceful-fs": "4.1.9", - "minimatch": "3.0.3", - "mkdirp": "0.5.1", - "nopt": "3.0.6", - "npmlog": "3.1.2", - "osenv": "0.1.3", - "path-array": "1.0.1", - "request": "2.75.0", - "rimraf": "2.5.4", - "semver": "5.3.0", - "tar": "2.2.1", - "which": "1.2.11" + "resolved": false, + "integrity": "sha1-3aVYOTs+y74kyea4cDxxGUxj+jY=", + "dev": true, + "requires": { + "fstream": "^1.0.0", + "glob": "^7.0.3", + "graceful-fs": "^4.1.2", + "minimatch": "^3.0.2", + "mkdirp": "^0.5.0", + "nopt": "2 || 3", + "npmlog": "0 || 1 || 2 || 3", + "osenv": "0", + "path-array": "^1.0.0", + "request": "2", + "rimraf": "2", + "semver": "2.x || 3.x || 4 || 5", + "tar": "^2.0.0", + "which": "1" }, "dependencies": { "minimatch": { "version": "3.0.3", - "bundled": true, + "resolved": false, + "integrity": "sha1-Kk5AkLlrLbBqnX3wEFWmKnfJt3Q=", "dev": true, "requires": { - "brace-expansion": "1.1.6" + "brace-expansion": "^1.0.0" }, "dependencies": { "brace-expansion": { "version": "1.1.6", - "bundled": true, + "resolved": false, + "integrity": "sha1-cZfX6qm4fmSDkOph/GbIRCdCDfk=", "dev": true, "requires": { - "balanced-match": "0.4.2", + "balanced-match": "^0.4.1", "concat-map": "0.0.1" }, "dependencies": { "balanced-match": { "version": "0.4.2", - "bundled": true, + "resolved": false, + "integrity": "sha1-yz8+PHMtwPAe5wtAPzAuYddwmDg=", "dev": true }, "concat-map": { "version": "0.0.1", - "bundled": true, + "resolved": false, + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", "dev": true } } @@ -3033,103 +3185,116 @@ }, "npmlog": { "version": "3.1.2", - "bundled": true, + "resolved": false, + "integrity": "sha1-LUb6h0M3r5SYovErtD2NC+SjaHM=", "dev": true, "requires": { - "are-we-there-yet": "1.1.2", - "console-control-strings": "1.1.0", - "gauge": "2.6.0", - "set-blocking": "2.0.0" + "are-we-there-yet": "~1.1.2", + "console-control-strings": "~1.1.0", + "gauge": "~2.6.0", + "set-blocking": "~2.0.0" }, "dependencies": { "are-we-there-yet": { "version": "1.1.2", - "bundled": true, + "resolved": false, + "integrity": "sha1-gORw6VoIR5T+GJkmLFZnxuiN4bM=", "dev": true, "requires": { - "delegates": "1.0.0", - "readable-stream": "2.1.5" + "delegates": "^1.0.0", + "readable-stream": "^2.0.0 || ^1.1.13" }, "dependencies": { "delegates": { "version": "1.0.0", - "bundled": true, + "resolved": false, + "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=", "dev": true } } }, "console-control-strings": { "version": "1.1.0", - "bundled": true, + "resolved": false, + "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=", "dev": true }, "gauge": { "version": "2.6.0", - "bundled": true, + "resolved": false, + "integrity": "sha1-01MBrRjpaQK0dR3LvkD0IYuUKkY=", "dev": true, "requires": { - "aproba": "1.0.4", - "console-control-strings": "1.1.0", - "has-color": "0.1.7", - "has-unicode": "2.0.1", - "object-assign": "4.1.0", - "signal-exit": "3.0.0", - "string-width": "1.0.2", - "strip-ansi": "3.0.1", - "wide-align": "1.1.0" + "aproba": "^1.0.3", + "console-control-strings": "^1.0.0", + "has-color": "^0.1.7", + "has-unicode": "^2.0.0", + "object-assign": "^4.1.0", + "signal-exit": "^3.0.0", + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1", + "wide-align": "^1.1.0" }, "dependencies": { "has-color": { "version": "0.1.7", - "bundled": true, + "resolved": false, + "integrity": "sha1-ZxRKUmDDT8PMpnfQQdr1L+e3iy8=", "dev": true }, "object-assign": { "version": "4.1.0", - "bundled": true, + "resolved": false, + "integrity": "sha1-ejs9DpgGPUP0wD8uiubNUahog6A=", "dev": true }, "signal-exit": { "version": "3.0.0", - "bundled": true, + "resolved": false, + "integrity": "sha1-PAVDtl17T7xgts2UWT2b9DZzm+g=", "dev": true }, "string-width": { "version": "1.0.2", - "bundled": true, + "resolved": false, + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", "dev": true, "requires": { - "code-point-at": "1.0.0", - "is-fullwidth-code-point": "1.0.0", - "strip-ansi": "3.0.1" + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" }, "dependencies": { "code-point-at": { "version": "1.0.0", - "bundled": true, + "resolved": false, + "integrity": "sha1-9psZLT99keOC5Lcb3bd4eGGasMY=", "dev": true, "requires": { - "number-is-nan": "1.0.0" + "number-is-nan": "^1.0.0" }, "dependencies": { "number-is-nan": { "version": "1.0.0", - "bundled": true, + "resolved": false, + "integrity": "sha1-wCD1KcUoKt/dIz2R1LGBw9aG3Es=", "dev": true } } }, "is-fullwidth-code-point": { "version": "1.0.0", - "bundled": true, + "resolved": false, + "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", "dev": true, "requires": { - "number-is-nan": "1.0.0" + "number-is-nan": "^1.0.0" }, "dependencies": { "number-is-nan": { "version": "1.0.0", - "bundled": true, + "resolved": false, + "integrity": "sha1-wCD1KcUoKt/dIz2R1LGBw9aG3Es=", "dev": true } } @@ -3138,41 +3303,46 @@ }, "wide-align": { "version": "1.1.0", - "bundled": true, + "resolved": false, + "integrity": "sha1-QO3egCpx/qHwcNo+YtzaLnrdlq0=", "dev": true, "requires": { - "string-width": "1.0.2" + "string-width": "^1.0.1" } } } }, "set-blocking": { "version": "2.0.0", - "bundled": true, + "resolved": false, + "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", "dev": true } } }, "path-array": { "version": "1.0.1", - "bundled": true, + "resolved": false, + "integrity": "sha1-fi8PNfB6IBUSK4aLfqwOssT+wnE=", "dev": true, "requires": { - "array-index": "1.0.0" + "array-index": "^1.0.0" }, "dependencies": { "array-index": { "version": "1.0.0", - "bundled": true, + "resolved": false, + "integrity": "sha1-7FanSe4QPk4Ix5C5w1PfFgVbl/k=", "dev": true, "requires": { - "debug": "2.2.0", - "es6-symbol": "3.1.0" + "debug": "^2.2.0", + "es6-symbol": "^3.0.2" }, "dependencies": { "debug": { "version": "2.2.0", - "bundled": true, + "resolved": false, + "integrity": "sha1-+HBX6ZWxofauaklgZkE3vFbwOdo=", "dev": true, "requires": { "ms": "0.7.1" @@ -3180,45 +3350,50 @@ "dependencies": { "ms": { "version": "0.7.1", - "bundled": true, + "resolved": false, + "integrity": "sha1-nNE8A62/8ltl7/3nzoZO6VIBcJg=", "dev": true } } }, "es6-symbol": { "version": "3.1.0", - "bundled": true, + "resolved": false, + "integrity": "sha1-lEgcZV56fK2C66gy2X1UM0ltf/o=", "dev": true, "requires": { - "d": "0.1.1", - "es5-ext": "0.10.12" + "d": "~0.1.1", + "es5-ext": "~0.10.11" }, "dependencies": { "d": { "version": "0.1.1", - "bundled": true, + "resolved": false, + "integrity": "sha1-2hhMU10Y2O57oqoim5FACfrhEwk=", "dev": true, "requires": { - "es5-ext": "0.10.12" + "es5-ext": "~0.10.2" } }, "es5-ext": { "version": "0.10.12", - "bundled": true, + "resolved": false, + "integrity": "sha1-qoRkHU23a2Krul5F/YBey6sUAEc=", "dev": true, "requires": { - "es6-iterator": "2.0.0", - "es6-symbol": "3.1.0" + "es6-iterator": "2", + "es6-symbol": "~3.1" }, "dependencies": { "es6-iterator": { "version": "2.0.0", - "bundled": true, + "resolved": false, + "integrity": "sha1-vZaFZ9YWNeM8C4BydhPJy0sJa6w=", "dev": true, "requires": { - "d": "0.1.1", - "es5-ext": "0.10.12", - "es6-symbol": "3.1.0" + "d": "^0.1.1", + "es5-ext": "^0.10.7", + "es6-symbol": "3" } } } @@ -3233,39 +3408,44 @@ }, "nopt": { "version": "3.0.6", - "bundled": true, + "resolved": false, + "integrity": "sha1-xkZdvwirzU2zWTF/eaxopkayj/k=", "dev": true, "requires": { - "abbrev": "1.0.9" + "abbrev": "1" } }, "normalize-git-url": { "version": "3.0.2", - "bundled": true, + "resolved": false, + "integrity": "sha1-jl8Uvgva7bc+ByADEKpBbCc1D8Q=", "dev": true }, "normalize-package-data": { "version": "2.3.5", - "bundled": true, + "resolved": false, + "integrity": "sha1-jZJPFClg4Xd+f/4XBUNjHMfLAt8=", "dev": true, "requires": { - "hosted-git-info": "2.1.5", - "is-builtin-module": "1.0.0", - "semver": "5.3.0", - "validate-npm-package-license": "3.0.1" + "hosted-git-info": "^2.1.4", + "is-builtin-module": "^1.0.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" }, "dependencies": { "is-builtin-module": { "version": "1.0.0", - "bundled": true, + "resolved": false, + "integrity": "sha1-VAVy0096wxGfj3bDDLwbHgN6/74=", "dev": true, "requires": { - "builtin-modules": "1.1.1" + "builtin-modules": "^1.0.0" }, "dependencies": { "builtin-modules": { "version": "1.1.1", - "bundled": true, + "resolved": false, + "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=", "dev": true } } @@ -3274,125 +3454,122 @@ }, "npm-cache-filename": { "version": "1.0.2", - "bundled": true, + "resolved": false, + "integrity": "sha1-3tMGxbC/yHCp6fr4I7xfKD4FrhE=", "dev": true }, "npm-install-checks": { "version": "3.0.0", - "bundled": true, + "resolved": false, + "integrity": "sha1-1K7N/VGlPjcjt7L5Oy7ijjB7wNc=", "dev": true, "requires": { - "semver": "5.3.0" + "semver": "^2.3.0 || 3.x || 4 || 5" } }, "npm-package-arg": { "version": "4.2.0", - "bundled": true, + "resolved": false, + "integrity": "sha1-gJvGHKv1S9X/lPYWXIm6juiMEVw=", "dev": true, "requires": { - "hosted-git-info": "2.1.5", - "semver": "5.3.0" + "hosted-git-info": "^2.1.5", + "semver": "^5.1.0" } }, "npm-registry-client": { "version": "7.2.1", - "bundled": true, - "dev": true, - "requires": { - "concat-stream": "1.5.2", - "graceful-fs": "4.1.9", - "normalize-package-data": "2.3.5", - "npm-package-arg": "4.2.0", - "npmlog": "3.1.2", - "once": "1.4.0", - "request": "2.75.0", - "retry": "0.10.0", - "semver": "5.3.0", - "slide": "1.1.6" + "resolved": false, + "integrity": "sha1-x5ImawiMwxP4Ul5+NSSGJscj23U=", + "dev": true, + "requires": { + "concat-stream": "^1.5.2", + "graceful-fs": "^4.1.6", + "normalize-package-data": "~1.0.1 || ^2.0.0", + "npm-package-arg": "^3.0.0 || ^4.0.0", + "npmlog": "~2.0.0 || ~3.1.0", + "once": "^1.3.3", + "request": "^2.74.0", + "retry": "^0.10.0", + "semver": "2 >=2.2.1 || 3.x || 4 || 5", + "slide": "^1.1.3" }, "dependencies": { "concat-stream": { "version": "1.5.2", - "bundled": true, + "resolved": false, + "integrity": "sha1-cIl4Yk2FavQaWnQd790mHadSwmY=", "dev": true, "requires": { - "inherits": "2.0.3", - "readable-stream": "2.0.6", - "typedarray": "0.0.6" + "inherits": "~2.0.1", + "readable-stream": "~2.0.0", + "typedarray": "~0.0.5" }, "dependencies": { "readable-stream": { "version": "2.0.6", - "bundled": true, + "resolved": false, + "integrity": "sha1-j5A0HmilPMySh4jaz80Rs265t44=", "dev": true, "requires": { - "core-util-is": "1.0.2", - "inherits": "2.0.3", - "isarray": "1.0.0", - "process-nextick-args": "1.0.7", - "string_decoder": "0.10.31", - "util-deprecate": "1.0.2" + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "~1.0.0", + "process-nextick-args": "~1.0.6", + "string_decoder": "~0.10.x", + "util-deprecate": "~1.0.1" }, "dependencies": { - "core-util-is": { - "version": "1.0.2", - "bundled": true, - "dev": true - }, - "isarray": { - "version": "1.0.0", - "bundled": true, - "dev": true - }, "process-nextick-args": { "version": "1.0.7", - "bundled": true, - "dev": true - }, - "string_decoder": { - "version": "0.10.31", - "bundled": true, - "dev": true - }, - "util-deprecate": { - "version": "1.0.2", - "bundled": true, + "resolved": false, + "integrity": "sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M=", "dev": true } } }, "typedarray": { "version": "0.0.6", - "bundled": true, + "resolved": false, + "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=", "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 + }, "npmlog": { "version": "3.1.2", - "bundled": true, + "resolved": false, + "integrity": "sha1-LUb6h0M3r5SYovErtD2NC+SjaHM=", "dev": true, "optional": true, "requires": { - "are-we-there-yet": "1.1.2", - "console-control-strings": "1.1.0", - "gauge": "2.6.0", - "set-blocking": "2.0.0" + "are-we-there-yet": "~1.1.2", + "console-control-strings": "~1.1.0", + "gauge": "~2.6.0", + "set-blocking": "~2.0.0" }, "dependencies": { "are-we-there-yet": { "version": "1.1.2", - "bundled": true, + "resolved": false, + "integrity": "sha1-gORw6VoIR5T+GJkmLFZnxuiN4bM=", "dev": true, "optional": true, "requires": { - "delegates": "1.0.0", - "readable-stream": "2.1.5" + "delegates": "^1.0.0", + "readable-stream": "^2.0.0 || ^1.1.13" }, "dependencies": { "delegates": { "version": "1.0.0", - "bundled": true, + "resolved": false, + "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=", "dev": true, "optional": true } @@ -3400,80 +3577,90 @@ }, "console-control-strings": { "version": "1.1.0", - "bundled": true, + "resolved": false, + "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=", "dev": true }, "gauge": { "version": "2.6.0", - "bundled": true, + "resolved": false, + "integrity": "sha1-01MBrRjpaQK0dR3LvkD0IYuUKkY=", "dev": true, "optional": true, "requires": { - "aproba": "1.0.4", - "console-control-strings": "1.1.0", - "has-color": "0.1.7", - "has-unicode": "2.0.1", - "object-assign": "4.1.0", - "signal-exit": "3.0.0", - "string-width": "1.0.2", - "strip-ansi": "3.0.1", - "wide-align": "1.1.0" + "aproba": "^1.0.3", + "console-control-strings": "^1.0.0", + "has-color": "^0.1.7", + "has-unicode": "^2.0.0", + "object-assign": "^4.1.0", + "signal-exit": "^3.0.0", + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1", + "wide-align": "^1.1.0" }, "dependencies": { "has-color": { "version": "0.1.7", - "bundled": true, + "resolved": false, + "integrity": "sha1-ZxRKUmDDT8PMpnfQQdr1L+e3iy8=", "dev": true, "optional": true }, "object-assign": { "version": "4.1.0", - "bundled": true, + "resolved": false, + "integrity": "sha1-ejs9DpgGPUP0wD8uiubNUahog6A=", "dev": true, "optional": true }, "signal-exit": { "version": "3.0.0", - "bundled": true, + "resolved": false, + "integrity": "sha1-PAVDtl17T7xgts2UWT2b9DZzm+g=", "dev": true, "optional": true }, "string-width": { "version": "1.0.2", - "bundled": true, + "resolved": false, + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", "dev": true, "requires": { - "code-point-at": "1.0.0", - "is-fullwidth-code-point": "1.0.0", - "strip-ansi": "3.0.1" + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" }, "dependencies": { "code-point-at": { "version": "1.0.0", - "bundled": true, + "resolved": false, + "integrity": "sha1-9psZLT99keOC5Lcb3bd4eGGasMY=", "dev": true, "requires": { - "number-is-nan": "1.0.0" + "number-is-nan": "^1.0.0" }, "dependencies": { "number-is-nan": { "version": "1.0.0", - "bundled": true, + "resolved": false, + "integrity": "sha1-wCD1KcUoKt/dIz2R1LGBw9aG3Es=", "dev": true } } }, "is-fullwidth-code-point": { "version": "1.0.0", - "bundled": true, + "resolved": false, + "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", "dev": true, "requires": { - "number-is-nan": "1.0.0" + "number-is-nan": "^1.0.0" }, "dependencies": { "number-is-nan": { "version": "1.0.0", - "bundled": true, + "resolved": false, + "integrity": "sha1-wCD1KcUoKt/dIz2R1LGBw9aG3Es=", "dev": true } } @@ -3482,18 +3669,20 @@ }, "wide-align": { "version": "1.1.0", - "bundled": true, + "resolved": false, + "integrity": "sha1-QO3egCpx/qHwcNo+YtzaLnrdlq0=", "dev": true, "optional": true, "requires": { - "string-width": "1.0.2" + "string-width": "^1.0.1" } } } }, "set-blocking": { "version": "2.0.0", - "bundled": true, + "resolved": false, + "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", "dev": true, "optional": true } @@ -3501,115 +3690,136 @@ }, "retry": { "version": "0.10.0", - "bundled": true, + "resolved": false, + "integrity": "sha1-ZJ4VykCEItmDGBYZNef31lLUNd0=", + "dev": true + }, + "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 } } }, "npm-user-validate": { "version": "0.1.5", - "bundled": true, + "resolved": false, + "integrity": "sha1-UkZdUMLSApSlcSW5lrrtv1bFAEs=", "dev": true }, "npmlog": { "version": "4.0.0", - "bundled": true, + "resolved": false, + "integrity": "sha1-4JRQOWHHDBd063ZpIIDo1Xip+I8=", "dev": true, "requires": { - "are-we-there-yet": "1.1.2", - "console-control-strings": "1.1.0", - "gauge": "2.6.0", - "set-blocking": "2.0.0" + "are-we-there-yet": "~1.1.2", + "console-control-strings": "~1.1.0", + "gauge": "~2.6.0", + "set-blocking": "~2.0.0" }, "dependencies": { "are-we-there-yet": { "version": "1.1.2", - "bundled": true, + "resolved": false, + "integrity": "sha1-gORw6VoIR5T+GJkmLFZnxuiN4bM=", "dev": true, "requires": { - "delegates": "1.0.0", - "readable-stream": "2.1.5" + "delegates": "^1.0.0", + "readable-stream": "^2.0.0 || ^1.1.13" }, "dependencies": { "delegates": { "version": "1.0.0", - "bundled": true, + "resolved": false, + "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=", "dev": true } } }, "console-control-strings": { "version": "1.1.0", - "bundled": true, + "resolved": false, + "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=", "dev": true }, "gauge": { "version": "2.6.0", - "bundled": true, + "resolved": false, + "integrity": "sha1-01MBrRjpaQK0dR3LvkD0IYuUKkY=", "dev": true, "requires": { - "aproba": "1.0.4", - "console-control-strings": "1.1.0", - "has-color": "0.1.7", - "has-unicode": "2.0.1", - "object-assign": "4.1.0", - "signal-exit": "3.0.0", - "string-width": "1.0.2", - "strip-ansi": "3.0.1", - "wide-align": "1.1.0" + "aproba": "^1.0.3", + "console-control-strings": "^1.0.0", + "has-color": "^0.1.7", + "has-unicode": "^2.0.0", + "object-assign": "^4.1.0", + "signal-exit": "^3.0.0", + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1", + "wide-align": "^1.1.0" }, "dependencies": { "has-color": { "version": "0.1.7", - "bundled": true, + "resolved": false, + "integrity": "sha1-ZxRKUmDDT8PMpnfQQdr1L+e3iy8=", "dev": true }, "object-assign": { "version": "4.1.0", - "bundled": true, + "resolved": false, + "integrity": "sha1-ejs9DpgGPUP0wD8uiubNUahog6A=", "dev": true }, "signal-exit": { "version": "3.0.0", - "bundled": true, + "resolved": false, + "integrity": "sha1-PAVDtl17T7xgts2UWT2b9DZzm+g=", "dev": true }, "string-width": { "version": "1.0.2", - "bundled": true, + "resolved": false, + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", "dev": true, "requires": { - "code-point-at": "1.0.0", - "is-fullwidth-code-point": "1.0.0", - "strip-ansi": "3.0.1" + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" }, "dependencies": { "code-point-at": { "version": "1.0.0", - "bundled": true, + "resolved": false, + "integrity": "sha1-9psZLT99keOC5Lcb3bd4eGGasMY=", "dev": true, "requires": { - "number-is-nan": "1.0.0" + "number-is-nan": "^1.0.0" }, "dependencies": { "number-is-nan": { "version": "1.0.0", - "bundled": true, + "resolved": false, + "integrity": "sha1-wCD1KcUoKt/dIz2R1LGBw9aG3Es=", "dev": true } } }, "is-fullwidth-code-point": { "version": "1.0.0", - "bundled": true, + "resolved": false, + "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", "dev": true, "requires": { - "number-is-nan": "1.0.0" + "number-is-nan": "^1.0.0" }, "dependencies": { "number-is-nan": { "version": "1.0.0", - "bundled": true, + "resolved": false, + "integrity": "sha1-wCD1KcUoKt/dIz2R1LGBw9aG3Es=", "dev": true } } @@ -3618,342 +3828,378 @@ }, "wide-align": { "version": "1.1.0", - "bundled": true, + "resolved": false, + "integrity": "sha1-QO3egCpx/qHwcNo+YtzaLnrdlq0=", "dev": true, "requires": { - "string-width": "1.0.2" + "string-width": "^1.0.1" } } } }, "set-blocking": { "version": "2.0.0", - "bundled": true, + "resolved": false, + "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", "dev": true } } }, "once": { "version": "1.4.0", - "bundled": true, + "resolved": false, + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", "dev": true, "requires": { - "wrappy": "1.0.2" + "wrappy": "1" } }, "opener": { "version": "1.4.2", - "bundled": true, + "resolved": false, + "integrity": "sha1-syWCCABCr4aAw4mkmRdbTFT/9SM=", "dev": true }, "osenv": { "version": "0.1.3", - "bundled": true, + "resolved": false, + "integrity": "sha1-g88FxtZFj8TVrGNi6jJdkvJ1Qhc=", "dev": true, "requires": { - "os-homedir": "1.0.1", - "os-tmpdir": "1.0.1" + "os-homedir": "^1.0.0", + "os-tmpdir": "^1.0.0" }, "dependencies": { "os-homedir": { "version": "1.0.1", - "bundled": true, + "resolved": false, + "integrity": "sha1-DWK99EuRb9O73PLKsZGUj7CU8Ac=", "dev": true }, "os-tmpdir": { "version": "1.0.1", - "bundled": true, + "resolved": false, + "integrity": "sha1-6bQjoe2vR5iCVi6S7XHXdDoHG24=", "dev": true } } }, + "path-is-absolute": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.0.tgz", + "integrity": "sha1-Jj2tpmqz8vsQv3+dJN2PPlcO+RI=", + "dev": true + }, "path-is-inside": { "version": "1.0.2", - "bundled": true, + "resolved": false, + "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=", "dev": true }, "read": { "version": "1.0.7", - "bundled": true, + "resolved": false, + "integrity": "sha1-s9oZvQUkMal2cdRKQmNK33ELQMQ=", "dev": true, "requires": { - "mute-stream": "0.0.5" + "mute-stream": "~0.0.4" }, "dependencies": { "mute-stream": { "version": "0.0.5", - "bundled": true, + "resolved": false, + "integrity": "sha1-j7+rsKmKJT0xhDMfno3rc3L6xsA=", "dev": true } } }, "read-cmd-shim": { "version": "1.0.1", - "bundled": true, + "resolved": false, + "integrity": "sha1-LV0Vd4ajfAVdIgd8MsU/gynpHHs=", "dev": true, "requires": { - "graceful-fs": "4.1.9" + "graceful-fs": "^4.1.2" } }, "read-installed": { "version": "4.0.3", - "bundled": true, + "resolved": false, + "integrity": "sha1-/5uLZ/GH0eTCm5/rMfayI6zRkGc=", "dev": true, "requires": { - "debuglog": "1.0.1", - "graceful-fs": "4.1.9", - "read-package-json": "2.0.4", - "readdir-scoped-modules": "1.0.2", - "semver": "5.3.0", - "slide": "1.1.6", - "util-extend": "1.0.3" + "debuglog": "^1.0.1", + "graceful-fs": "^4.1.2", + "read-package-json": "^2.0.0", + "readdir-scoped-modules": "^1.0.0", + "semver": "2 || 3 || 4 || 5", + "slide": "~1.1.3", + "util-extend": "^1.0.1" }, "dependencies": { "util-extend": { "version": "1.0.3", - "bundled": true, + "resolved": false, + "integrity": "sha1-p8IW0mdUUWljeztu3GypEZ4v+T8=", "dev": true } } }, "read-package-json": { "version": "2.0.4", - "bundled": true, + "resolved": false, + "integrity": "sha1-Ye0bIlbqQ42ACIlQkL6EuOeZyFM=", "dev": true, "requires": { - "glob": "6.0.4", - "graceful-fs": "4.1.9", - "json-parse-helpfulerror": "1.0.3", - "normalize-package-data": "2.3.5" + "glob": "^6.0.0", + "graceful-fs": "^4.1.2", + "json-parse-helpfulerror": "^1.0.2", + "normalize-package-data": "^2.0.0" }, "dependencies": { + "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 + }, "glob": { "version": "6.0.4", - "bundled": true, + "resolved": false, + "integrity": "sha1-DwiGD2oVUSey+t1PnOJLGqtuTSI=", "dev": true, "requires": { - "inflight": "1.0.5", - "inherits": "2.0.3", - "minimatch": "3.0.3", - "once": "1.4.0", - "path-is-absolute": "1.0.0" + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "2 || 3", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" }, "dependencies": { "minimatch": { "version": "3.0.3", - "bundled": true, + "resolved": false, + "integrity": "sha1-Kk5AkLlrLbBqnX3wEFWmKnfJt3Q=", "dev": true, "requires": { - "brace-expansion": "1.1.6" + "brace-expansion": "^1.0.0" }, "dependencies": { "brace-expansion": { "version": "1.1.6", - "bundled": true, + "resolved": false, + "integrity": "sha1-cZfX6qm4fmSDkOph/GbIRCdCDfk=", "dev": true, "requires": { - "balanced-match": "0.4.2", + "balanced-match": "^0.4.1", "concat-map": "0.0.1" }, "dependencies": { "balanced-match": { "version": "0.4.2", - "bundled": true, - "dev": true - }, - "concat-map": { - "version": "0.0.1", - "bundled": true, + "resolved": false, + "integrity": "sha1-yz8+PHMtwPAe5wtAPzAuYddwmDg=", "dev": true } } } } - }, - "path-is-absolute": { - "version": "1.0.0", - "bundled": true, - "dev": true } } }, "json-parse-helpfulerror": { "version": "1.0.3", - "bundled": true, + "resolved": false, + "integrity": "sha1-E/FM4C7tTpgSl7ZOueO5MuLdE9w=", "dev": true, "requires": { - "jju": "1.3.0" + "jju": "^1.1.0" }, "dependencies": { "jju": { "version": "1.3.0", - "bundled": true, + "resolved": false, + "integrity": "sha1-2t2e8BkkvHKLA/L3l5vb1i96Kqo=", "dev": true } } + }, + "path-is-absolute": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.0.tgz", + "integrity": "sha1-Jj2tpmqz8vsQv3+dJN2PPlcO+RI=", + "dev": true } } }, "read-package-tree": { "version": "5.1.5", - "bundled": true, + "resolved": false, + "integrity": "sha1-rOfmOBx2hPlwqqmPx8XStmat2rY=", "dev": true, "requires": { - "debuglog": "1.0.1", - "dezalgo": "1.0.3", - "once": "1.4.0", - "read-package-json": "2.0.4", - "readdir-scoped-modules": "1.0.2" + "debuglog": "^1.0.1", + "dezalgo": "^1.0.0", + "once": "^1.3.0", + "read-package-json": "^2.0.0", + "readdir-scoped-modules": "^1.0.0" } }, "readable-stream": { "version": "2.1.5", - "bundled": true, + "resolved": false, + "integrity": "sha1-ZvqLcg4UOLNkaB8q0aY8YYRIydA=", "dev": true, "requires": { - "buffer-shims": "1.0.0", - "core-util-is": "1.0.2", - "inherits": "2.0.3", - "isarray": "1.0.0", - "process-nextick-args": "1.0.7", - "string_decoder": "0.10.31", - "util-deprecate": "1.0.2" + "buffer-shims": "^1.0.0", + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "~1.0.0", + "process-nextick-args": "~1.0.6", + "string_decoder": "~0.10.x", + "util-deprecate": "~1.0.1" }, "dependencies": { "buffer-shims": { "version": "1.0.0", - "bundled": true, - "dev": true - }, - "core-util-is": { - "version": "1.0.2", - "bundled": true, + "resolved": false, + "integrity": "sha1-mXjOMXOIxkmth5MCjDR37wRKi1E=", "dev": true }, "isarray": { "version": "1.0.0", - "bundled": true, + "resolved": false, + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", "dev": true }, "process-nextick-args": { "version": "1.0.7", - "bundled": true, - "dev": true - }, - "string_decoder": { - "version": "0.10.31", - "bundled": true, + "resolved": false, + "integrity": "sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M=", "dev": true }, "util-deprecate": { "version": "1.0.2", - "bundled": true, + "resolved": false, + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", "dev": true } } }, "readdir-scoped-modules": { "version": "1.0.2", - "bundled": true, + "resolved": false, + "integrity": "sha1-n6+jfShr5dksuuve4DDcm19AZ0c=", "dev": true, "requires": { - "debuglog": "1.0.1", - "dezalgo": "1.0.3", - "graceful-fs": "4.1.9", - "once": "1.4.0" + "debuglog": "^1.0.1", + "dezalgo": "^1.0.0", + "graceful-fs": "^4.1.2", + "once": "^1.3.0" } }, "realize-package-specifier": { "version": "3.0.3", - "bundled": true, + "resolved": false, + "integrity": "sha1-0N74gpUrjeP2frpekRmWYScfQfQ=", "dev": true, "requires": { - "dezalgo": "1.0.3", - "npm-package-arg": "4.2.0" + "dezalgo": "^1.0.1", + "npm-package-arg": "^4.1.1" } }, "request": { "version": "2.75.0", - "bundled": true, - "dev": true, - "requires": { - "aws-sign2": "0.6.0", - "aws4": "1.4.1", - "bl": "1.1.2", - "caseless": "0.11.0", - "combined-stream": "1.0.5", - "extend": "3.0.0", - "forever-agent": "0.6.1", - "form-data": "2.0.0", - "har-validator": "2.0.6", - "hawk": "3.1.3", - "http-signature": "1.1.1", - "is-typedarray": "1.0.0", - "isstream": "0.1.2", - "json-stringify-safe": "5.0.1", - "mime-types": "2.1.12", - "node-uuid": "1.4.7", - "oauth-sign": "0.8.2", - "qs": "6.2.1", - "stringstream": "0.0.5", - "tough-cookie": "2.3.1", - "tunnel-agent": "0.4.3" + "resolved": false, + "integrity": "sha1-0rgmiihtoT6qXQGt9dGMyQ9lfZM=", + "dev": true, + "requires": { + "aws-sign2": "~0.6.0", + "aws4": "^1.2.1", + "bl": "~1.1.2", + "caseless": "~0.11.0", + "combined-stream": "~1.0.5", + "extend": "~3.0.0", + "forever-agent": "~0.6.1", + "form-data": "~2.0.0", + "har-validator": "~2.0.6", + "hawk": "~3.1.3", + "http-signature": "~1.1.0", + "is-typedarray": "~1.0.0", + "isstream": "~0.1.2", + "json-stringify-safe": "~5.0.1", + "mime-types": "~2.1.7", + "node-uuid": "~1.4.7", + "oauth-sign": "~0.8.1", + "qs": "~6.2.0", + "stringstream": "~0.0.4", + "tough-cookie": "~2.3.0", + "tunnel-agent": "~0.4.1" }, "dependencies": { "aws-sign2": { "version": "0.6.0", - "bundled": true, + "resolved": false, + "integrity": "sha1-FDQt0428yU0OW4fXY81jYSwOeU8=", "dev": true }, "aws4": { "version": "1.4.1", - "bundled": true, + "resolved": false, + "integrity": "sha1-/efVKSRm0jDl7g9OA42d+qsI/GE=", "dev": true }, "bl": { "version": "1.1.2", - "bundled": true, + "resolved": false, + "integrity": "sha1-/cqHGplxOqANGeO7ukHER4emU5g=", "dev": true, "requires": { - "readable-stream": "2.0.6" + "readable-stream": "~2.0.5" }, "dependencies": { "readable-stream": { "version": "2.0.6", - "bundled": true, + "resolved": false, + "integrity": "sha1-j5A0HmilPMySh4jaz80Rs265t44=", "dev": true, "requires": { - "core-util-is": "1.0.2", - "inherits": "2.0.3", - "isarray": "1.0.0", - "process-nextick-args": "1.0.7", - "string_decoder": "0.10.31", - "util-deprecate": "1.0.2" + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "~1.0.0", + "process-nextick-args": "~1.0.6", + "string_decoder": "~0.10.x", + "util-deprecate": "~1.0.1" }, "dependencies": { "core-util-is": { "version": "1.0.2", - "bundled": true, + "resolved": false, + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", "dev": true }, "isarray": { "version": "1.0.0", - "bundled": true, + "resolved": false, + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", "dev": true }, "process-nextick-args": { "version": "1.0.7", - "bundled": true, + "resolved": false, + "integrity": "sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M=", "dev": true }, "string_decoder": { "version": "0.10.31", - "bundled": true, + "resolved": false, + "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", "dev": true }, "util-deprecate": { "version": "1.0.2", - "bundled": true, + "resolved": false, + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", "dev": true } } @@ -3962,168 +4208,191 @@ }, "caseless": { "version": "0.11.0", - "bundled": true, + "resolved": false, + "integrity": "sha1-cVuW6phBWTzDMGeSP17GDr2k99c=", "dev": true }, "combined-stream": { "version": "1.0.5", - "bundled": true, + "resolved": false, + "integrity": "sha1-k4NwpXtKUd6ix3wV1cX9+JUWQAk=", "dev": true, "requires": { - "delayed-stream": "1.0.0" + "delayed-stream": "~1.0.0" }, "dependencies": { "delayed-stream": { "version": "1.0.0", - "bundled": true, + "resolved": false, + "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", "dev": true } } }, "extend": { "version": "3.0.0", - "bundled": true, + "resolved": false, + "integrity": "sha1-WkdDU7nzNT3dgXbf03uRyDpG8dQ=", "dev": true }, "forever-agent": { "version": "0.6.1", - "bundled": true, + "resolved": false, + "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=", "dev": true }, "form-data": { "version": "2.0.0", - "bundled": true, + "resolved": false, + "integrity": "sha1-bwrrrcxdoWwT4ezBETfYX5uIOyU=", "dev": true, "requires": { - "asynckit": "0.4.0", - "combined-stream": "1.0.5", - "mime-types": "2.1.12" + "asynckit": "^0.4.0", + "combined-stream": "^1.0.5", + "mime-types": "^2.1.11" }, "dependencies": { "asynckit": { "version": "0.4.0", - "bundled": true, + "resolved": false, + "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", "dev": true } } }, "har-validator": { "version": "2.0.6", - "bundled": true, + "resolved": false, + "integrity": "sha1-zcvAgYgmWtEZtqWnyKtw7s+10n0=", "dev": true, "requires": { - "chalk": "1.1.3", - "commander": "2.9.0", - "is-my-json-valid": "2.15.0", - "pinkie-promise": "2.0.1" + "chalk": "^1.1.1", + "commander": "^2.9.0", + "is-my-json-valid": "^2.12.4", + "pinkie-promise": "^2.0.0" }, "dependencies": { "chalk": { "version": "1.1.3", - "bundled": true, + "resolved": false, + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", "dev": true, "requires": { - "ansi-styles": "2.2.1", - "escape-string-regexp": "1.0.5", - "has-ansi": "2.0.0", - "strip-ansi": "3.0.1", - "supports-color": "2.0.0" + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" }, "dependencies": { "ansi-styles": { "version": "2.2.1", - "bundled": true, + "resolved": false, + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", "dev": true }, "escape-string-regexp": { "version": "1.0.5", - "bundled": true, + "resolved": false, + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", "dev": true }, "has-ansi": { "version": "2.0.0", - "bundled": true, + "resolved": false, + "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", "dev": true, "requires": { - "ansi-regex": "2.0.0" + "ansi-regex": "^2.0.0" } }, "supports-color": { "version": "2.0.0", - "bundled": true, + "resolved": false, + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", "dev": true } } }, "commander": { "version": "2.9.0", - "bundled": true, + "resolved": false, + "integrity": "sha1-nJkJQXbhIkDLItbFFGCYQA/g99Q=", "dev": true, "requires": { - "graceful-readlink": "1.0.1" + "graceful-readlink": ">= 1.0.0" }, "dependencies": { "graceful-readlink": { "version": "1.0.1", - "bundled": true, + "resolved": false, + "integrity": "sha1-TK+tdrxi8C+gObL5Tpo906ORpyU=", "dev": true } } }, "is-my-json-valid": { "version": "2.15.0", - "bundled": true, + "resolved": false, + "integrity": "sha1-k27do8o8IR/ZjzstPgjaQ/eykVs=", "dev": true, "requires": { - "generate-function": "2.0.0", - "generate-object-property": "1.2.0", - "jsonpointer": "4.0.0", - "xtend": "4.0.1" + "generate-function": "^2.0.0", + "generate-object-property": "^1.1.0", + "jsonpointer": "^4.0.0", + "xtend": "^4.0.0" }, "dependencies": { "generate-function": { "version": "2.0.0", - "bundled": true, + "resolved": false, + "integrity": "sha1-aFj+fAlpt9TpCTM3ZHrHn2DfvnQ=", "dev": true }, "generate-object-property": { "version": "1.2.0", - "bundled": true, + "resolved": false, + "integrity": "sha1-nA4cQDCM6AT0eDYYuTf6iPmdUNA=", "dev": true, "requires": { - "is-property": "1.0.2" + "is-property": "^1.0.0" }, "dependencies": { "is-property": { "version": "1.0.2", - "bundled": true, + "resolved": false, + "integrity": "sha1-V/4cTkhHTt1lsJkR8msc1Ald2oQ=", "dev": true } } }, "jsonpointer": { "version": "4.0.0", - "bundled": true, + "resolved": false, + "integrity": "sha1-ZmHhYdL8RF8Z+YQwIxNDci4fy9U=", "dev": true }, "xtend": { "version": "4.0.1", - "bundled": true, + "resolved": false, + "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=", "dev": true } } }, "pinkie-promise": { "version": "2.0.1", - "bundled": true, + "resolved": false, + "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", "dev": true, "requires": { - "pinkie": "2.0.4" + "pinkie": "^2.0.0" }, "dependencies": { "pinkie": { "version": "2.0.4", - "bundled": true, + "resolved": false, + "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=", "dev": true } } @@ -4132,64 +4401,72 @@ }, "hawk": { "version": "3.1.3", - "bundled": true, + "resolved": false, + "integrity": "sha1-B4REvXwWQLD+VA0sm3PVlnjo4cQ=", "dev": true, "requires": { - "boom": "2.10.1", - "cryptiles": "2.0.5", - "hoek": "2.16.3", - "sntp": "1.0.9" + "boom": "2.x.x", + "cryptiles": "2.x.x", + "hoek": "2.x.x", + "sntp": "1.x.x" }, "dependencies": { "boom": { "version": "2.10.1", - "bundled": true, + "resolved": false, + "integrity": "sha1-OciRjO/1eZ+D+UkqhI9iWt0Mdm8=", "dev": true, "requires": { - "hoek": "2.16.3" + "hoek": "2.x.x" } }, "cryptiles": { "version": "2.0.5", - "bundled": true, + "resolved": false, + "integrity": "sha1-O9/s3GCBR8HGcgL6KR59ylnqo7g=", "dev": true, "requires": { - "boom": "2.10.1" + "boom": "2.x.x" } }, "hoek": { "version": "2.16.3", - "bundled": true, + "resolved": false, + "integrity": "sha1-ILt0A9POo5jpHcRxCo/xuCdKJe0=", "dev": true }, "sntp": { "version": "1.0.9", - "bundled": true, + "resolved": false, + "integrity": "sha1-ZUEYTMkK7qbG57NeJlkIJEPGYZg=", "dev": true, "requires": { - "hoek": "2.16.3" + "hoek": "2.x.x" } } } }, "http-signature": { "version": "1.1.1", - "bundled": true, + "resolved": false, + "integrity": "sha1-33LiZwZs0Kxn+3at+OE0qPvPkb8=", "dev": true, "requires": { - "assert-plus": "0.2.0", - "jsprim": "1.3.1", - "sshpk": "1.10.1" + "assert-plus": "^0.2.0", + "jsprim": "^1.2.2", + "sshpk": "^1.7.0" }, "dependencies": { "assert-plus": { "version": "0.2.0", - "bundled": true, + "resolved": false, + "integrity": "sha1-104bh+ev/A24qttwIfP+SBAasjQ=", "dev": true }, "jsprim": { "version": "1.3.1", - "bundled": true, + "resolved": false, + "integrity": "sha1-KnJW9wQSop7jZwqspiWZTE3P8lI=", "dev": true, "requires": { "extsprintf": "1.0.2", @@ -4199,17 +4476,20 @@ "dependencies": { "extsprintf": { "version": "1.0.2", - "bundled": true, + "resolved": false, + "integrity": "sha1-4QgOBljjALBilJkMxw4VAiNf1VA=", "dev": true }, "json-schema": { "version": "0.2.3", - "bundled": true, + "resolved": false, + "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=", "dev": true }, "verror": { "version": "1.3.6", - "bundled": true, + "resolved": false, + "integrity": "sha1-z/XfEpRtKX0rqu+qJoniW+AcAFw=", "dev": true, "requires": { "extsprintf": "1.0.2" @@ -4219,82 +4499,92 @@ }, "sshpk": { "version": "1.10.1", - "bundled": true, + "resolved": false, + "integrity": "sha1-MOGl0ykkSXShr2FREznVla9mOLA=", "dev": true, "requires": { - "asn1": "0.2.3", - "assert-plus": "1.0.0", - "bcrypt-pbkdf": "1.0.0", - "dashdash": "1.14.0", - "ecc-jsbn": "0.1.1", - "getpass": "0.1.6", - "jodid25519": "1.0.2", - "jsbn": "0.1.0", - "tweetnacl": "0.14.3" + "asn1": "~0.2.3", + "assert-plus": "^1.0.0", + "bcrypt-pbkdf": "^1.0.0", + "dashdash": "^1.12.0", + "ecc-jsbn": "~0.1.1", + "getpass": "^0.1.1", + "jodid25519": "^1.0.0", + "jsbn": "~0.1.0", + "tweetnacl": "~0.14.0" }, "dependencies": { "asn1": { "version": "0.2.3", - "bundled": true, + "resolved": false, + "integrity": "sha1-2sh4dxPJlmhJ/IGAd36+nB3fO4Y=", "dev": true }, "assert-plus": { "version": "1.0.0", - "bundled": true, + "resolved": false, + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", "dev": true }, "bcrypt-pbkdf": { "version": "1.0.0", - "bundled": true, + "resolved": false, + "integrity": "sha1-PKdrhSQccXC/fZcD57mqdGMAQNQ=", "dev": true, "optional": true, "requires": { - "tweetnacl": "0.14.3" + "tweetnacl": "^0.14.3" } }, "dashdash": { "version": "1.14.0", - "bundled": true, + "resolved": false, + "integrity": "sha1-KeSGxUGL8PNWA0qZPVFoajPoQUE=", "dev": true, "requires": { - "assert-plus": "1.0.0" + "assert-plus": "^1.0.0" } }, "ecc-jsbn": { "version": "0.1.1", - "bundled": true, + "resolved": false, + "integrity": "sha1-D8c6ntXw1Tw4GTOYUj735UN3dQU=", "dev": true, "optional": true, "requires": { - "jsbn": "0.1.0" + "jsbn": "~0.1.0" } }, "getpass": { "version": "0.1.6", - "bundled": true, + "resolved": false, + "integrity": "sha1-KD/9n8ElaECHUxHBtg6MQBhxEOY=", "dev": true, "requires": { - "assert-plus": "1.0.0" + "assert-plus": "^1.0.0" } }, "jodid25519": { "version": "1.0.2", - "bundled": true, + "resolved": false, + "integrity": "sha1-BtSRIlUJNBlHfUJWM2BuDpB4KWc=", "dev": true, "optional": true, "requires": { - "jsbn": "0.1.0" + "jsbn": "~0.1.0" } }, "jsbn": { "version": "0.1.0", - "bundled": true, + "resolved": false, + "integrity": "sha1-ZQmH2g3XT06/WhE3eiqi0nPpff0=", "dev": true, "optional": true }, "tweetnacl": { "version": "0.14.3", - "bundled": true, + "resolved": false, + "integrity": "sha1-PaOC9nDyXe1417PReSEZvKC3Ey0=", "dev": true, "optional": true } @@ -4304,210 +4594,248 @@ }, "is-typedarray": { "version": "1.0.0", - "bundled": true, + "resolved": false, + "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", "dev": true }, "isstream": { "version": "0.1.2", - "bundled": true, + "resolved": false, + "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=", "dev": true }, "json-stringify-safe": { "version": "5.0.1", - "bundled": true, + "resolved": false, + "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=", "dev": true }, "mime-types": { "version": "2.1.12", - "bundled": true, + "resolved": false, + "integrity": "sha1-FSuiVndwIN1GY/VMLnvCY4HnFyk=", "dev": true, "requires": { - "mime-db": "1.24.0" + "mime-db": "~1.24.0" }, "dependencies": { "mime-db": { "version": "1.24.0", - "bundled": true, + "resolved": false, + "integrity": "sha1-4tE/k58AFsbk6a0lqGUvEmxGfww=", "dev": true } } }, "node-uuid": { "version": "1.4.7", - "bundled": true, + "resolved": false, + "integrity": "sha1-baWhdmjEs91ZYjvaEc9/pMH2Cm8=", "dev": true }, "oauth-sign": { "version": "0.8.2", - "bundled": true, + "resolved": false, + "integrity": "sha1-Rqarfwrq2N6unsBWV4C31O/rnUM=", "dev": true }, "qs": { "version": "6.2.1", - "bundled": true, + "resolved": false, + "integrity": "sha1-zgPF/wk1vB2daanxTL0Y5WjWdiU=", "dev": true }, "stringstream": { "version": "0.0.5", - "bundled": true, + "resolved": false, + "integrity": "sha1-TkhM1N5aC7vuGORjB3EKioFiGHg=", "dev": true }, "tough-cookie": { "version": "2.3.1", - "bundled": true, + "resolved": false, + "integrity": "sha1-mcd9+7fYBCSeiimdTLD9gf7wg/0=", "dev": true }, "tunnel-agent": { "version": "0.4.3", - "bundled": true, + "resolved": false, + "integrity": "sha1-Y3PbdpCf5XDgjXNYM2Xtgop07us=", "dev": true } } }, "retry": { "version": "0.10.0", - "bundled": true, + "resolved": false, + "integrity": "sha1-ZJ4VykCEItmDGBYZNef31lLUNd0=", "dev": true }, "rimraf": { "version": "2.5.4", - "bundled": true, + "resolved": false, + "integrity": "sha1-loAAk8vxoMhr2VtGJUZ1NcKd+gQ=", "dev": true, "requires": { - "glob": "7.1.0" + "glob": "^7.0.5" } }, "semver": { "version": "5.3.0", - "bundled": true, + "resolved": false, + "integrity": "sha1-myzl094C0XxgEq0yaqa00M9U+U8=", "dev": true }, "sha": { "version": "2.0.1", - "bundled": true, + "resolved": false, + "integrity": "sha1-YDCCL70smCOUn49y7WQR7lzyWq4=", "dev": true, "requires": { - "graceful-fs": "4.1.9", - "readable-stream": "2.1.5" + "graceful-fs": "^4.1.2", + "readable-stream": "^2.0.2" } }, "slide": { "version": "1.1.6", - "bundled": true, + "resolved": false, + "integrity": "sha1-VusCfWW00tzmyy4tMsTUr8nh1wc=", "dev": true }, "sorted-object": { "version": "2.0.1", - "bundled": true, + "resolved": false, + "integrity": "sha1-fWMfS9OnmKJK8d/8+/6DM3pd9fw=", + "dev": true + }, + "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-ansi": { "version": "3.0.1", - "bundled": true, + "resolved": false, + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", "dev": true, "requires": { - "ansi-regex": "2.0.0" + "ansi-regex": "^2.0.0" } }, "tar": { "version": "2.2.1", - "bundled": true, + "resolved": false, + "integrity": "sha1-jk0qJWwOIYXGsYrWlK7JaLg8sdE=", "dev": true, "requires": { - "block-stream": "0.0.8", - "fstream": "1.0.10", - "inherits": "2.0.3" + "block-stream": "*", + "fstream": "^1.0.2", + "inherits": "2" }, "dependencies": { "block-stream": { "version": "0.0.8", - "bundled": true, + "resolved": false, + "integrity": "sha1-Boj0baK7+c/wxPaCJaDLlcvopGs=", "dev": true, "requires": { - "inherits": "2.0.3" + "inherits": "~2.0.0" } } } }, "text-table": { "version": "0.2.0", - "bundled": true, + "resolved": false, + "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", "dev": true }, "uid-number": { "version": "0.0.6", - "bundled": true, + "resolved": false, + "integrity": "sha1-DqEOgDXo61uOREnwbaHHMGY7qoE=", "dev": true }, "umask": { "version": "1.1.0", - "bundled": true, + "resolved": false, + "integrity": "sha1-8pzr8B31F5ErtY/5xOUP3o4zMg0=", "dev": true }, "unique-filename": { "version": "1.1.0", - "bundled": true, + "resolved": false, + "integrity": "sha1-0F8v5AMlYIcfMOk8vnNe6iAVFPM=", "dev": true, "requires": { - "unique-slug": "2.0.0" + "unique-slug": "^2.0.0" }, "dependencies": { "unique-slug": { "version": "2.0.0", - "bundled": true, + "resolved": false, + "integrity": "sha1-22Z258fMBimHj/GWCXx4hVrp9Ks=", "dev": true, "requires": { - "imurmurhash": "0.1.4" + "imurmurhash": "^0.1.4" } } } }, "unpipe": { "version": "1.0.0", - "bundled": true, + "resolved": false, + "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=", + "dev": true + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", "dev": true }, "validate-npm-package-license": { "version": "3.0.1", - "bundled": true, + "resolved": false, + "integrity": "sha1-KAS6vnEq0zeUWaz74kdGqywwP7w=", "dev": true, "requires": { - "spdx-correct": "1.0.2", - "spdx-expression-parse": "1.0.2" + "spdx-correct": "~1.0.0", + "spdx-expression-parse": "~1.0.0" }, "dependencies": { "spdx-correct": { "version": "1.0.2", - "bundled": true, + "resolved": false, + "integrity": "sha1-SzBz2TP/UfORLwOsVRlJikFQ20A=", "dev": true, "requires": { - "spdx-license-ids": "1.2.0" + "spdx-license-ids": "^1.0.2" }, "dependencies": { "spdx-license-ids": { "version": "1.2.0", - "bundled": true, + "resolved": false, + "integrity": "sha1-tUndD2Pct0Whfi6joHQC4OMy0eI=", "dev": true } } }, "spdx-expression-parse": { "version": "1.0.2", - "bundled": true, + "resolved": false, + "integrity": "sha1-1SsUtelnB3FECvIlvLVjEirEUvY=", "dev": true, "requires": { - "spdx-exceptions": "1.0.4", - "spdx-license-ids": "1.2.0" + "spdx-exceptions": "^1.0.4", + "spdx-license-ids": "^1.0.0" }, "dependencies": { "spdx-exceptions": { "version": "1.0.4", - "bundled": true, - "dev": true - }, - "spdx-license-ids": { - "version": "1.2.0", - "bundled": true, + "resolved": false, + "integrity": "sha1-IguEI5EZrpBFqJLbgag/TOFvgP0=", "dev": true } } @@ -4516,7 +4844,8 @@ }, "validate-npm-package-name": { "version": "2.2.2", - "bundled": true, + "resolved": false, + "integrity": "sha1-9laVsi9zJEQgGaPH+jmm5/0pkIU=", "dev": true, "requires": { "builtins": "0.0.7" @@ -4524,39 +4853,44 @@ "dependencies": { "builtins": { "version": "0.0.7", - "bundled": true, + "resolved": false, + "integrity": "sha1-NVIZzWzxjb58Acx/0tznZc/cVJo=", "dev": true } } }, "which": { "version": "1.2.11", - "bundled": true, + "resolved": false, + "integrity": "sha1-yLLu6muMFln6fB3U/aq+lTPcXos=", "dev": true, "requires": { - "isexe": "1.1.2" + "isexe": "^1.1.1" }, "dependencies": { "isexe": { "version": "1.1.2", - "bundled": true, + "resolved": false, + "integrity": "sha1-NvPiLmB1CSD15yQaR2qMakInWtA=", "dev": true } } }, "wrappy": { "version": "1.0.2", - "bundled": true, + "resolved": false, + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", "dev": true }, "write-file-atomic": { "version": "1.2.0", - "bundled": true, + "resolved": false, + "integrity": "sha1-FMZtTkyzygVlwozzt6bz5NWTj6s=", "dev": true, "requires": { - "graceful-fs": "4.1.9", - "imurmurhash": "0.1.4", - "slide": "1.1.6" + "graceful-fs": "^4.1.2", + "imurmurhash": "^0.1.4", + "slide": "^1.1.5" } } } @@ -4567,24 +4901,24 @@ "integrity": "sha1-wISwh6COz5KSNS4s1ZHekD+BKcM=", "dev": true, "requires": { - "bluebird": "3.5.0", - "chalk": "1.1.3", - "cint": "8.2.1", - "cli-table": "0.3.1", - "commander": "2.9.0", - "fast-diff": "1.1.1", + "bluebird": "^3.4.3", + "chalk": "^1.1.3", + "cint": "^8.2.1", + "cli-table": "^0.3.1", + "commander": "^2.9.0", + "fast-diff": "^1.0.1", "find-up": "1.1.2", - "get-stdin": "5.0.1", - "json-parse-helpfulerror": "1.0.3", - "lodash": "4.17.4", - "node-alias": "1.0.4", - "npm": "3.10.10", - "npmi": "2.0.1", - "require-dir": "0.3.2", - "semver": "5.4.1", - "semver-utils": "1.1.1", - "spawn-please": "0.2.0", - "update-notifier": "1.0.3" + "get-stdin": "^5.0.1", + "json-parse-helpfulerror": "^1.0.3", + "lodash": "^4.15.0", + "node-alias": "^1.0.4", + "npm": "^3.10.6", + "npmi": "^2.0.1", + "require-dir": "^0.3.0", + "semver": "^5.3.0", + "semver-utils": "^1.1.1", + "spawn-please": "^0.2.0", + "update-notifier": "^1.0.2" } }, "npmi": { @@ -4593,8 +4927,8 @@ "integrity": "sha1-MmB2V+G9R8qFerTp2Y8KDP+WvOo=", "dev": true, "requires": { - "npm": "3.10.10", - "semver": "4.3.6" + "npm": "^3", + "semver": "^4.1.0" }, "dependencies": { "semver": { @@ -4617,268 +4951,297 @@ "integrity": "sha1-1rPF4WiSolr2MTi6SEZ2qooi7ac=", "dev": true, "requires": { - "archy": "1.0.0", - "arrify": "1.0.1", - "caching-transform": "1.0.1", - "convert-source-map": "1.5.0", - "debug-log": "1.0.1", - "default-require-extensions": "1.0.0", - "find-cache-dir": "0.1.1", - "find-up": "2.1.0", - "foreground-child": "1.5.6", - "glob": "7.1.2", - "istanbul-lib-coverage": "1.1.1", - "istanbul-lib-hook": "1.0.7", - "istanbul-lib-instrument": "1.7.4", - "istanbul-lib-report": "1.1.1", - "istanbul-lib-source-maps": "1.2.1", - "istanbul-reports": "1.1.1", - "md5-hex": "1.3.0", - "merge-source-map": "1.0.4", - "micromatch": "2.3.11", - "mkdirp": "0.5.1", - "resolve-from": "2.0.0", - "rimraf": "2.6.1", - "signal-exit": "3.0.2", - "spawn-wrap": "1.3.8", - "test-exclude": "4.1.1", - "yargs": "8.0.2", - "yargs-parser": "5.0.0" + "archy": "^1.0.0", + "arrify": "^1.0.1", + "caching-transform": "^1.0.0", + "convert-source-map": "^1.3.0", + "debug-log": "^1.0.1", + "default-require-extensions": "^1.0.0", + "find-cache-dir": "^0.1.1", + "find-up": "^2.1.0", + "foreground-child": "^1.5.3", + "glob": "^7.0.6", + "istanbul-lib-coverage": "^1.1.1", + "istanbul-lib-hook": "^1.0.7", + "istanbul-lib-instrument": "^1.7.4", + "istanbul-lib-report": "^1.1.1", + "istanbul-lib-source-maps": "^1.2.1", + "istanbul-reports": "^1.1.1", + "md5-hex": "^1.2.0", + "merge-source-map": "^1.0.2", + "micromatch": "^2.3.11", + "mkdirp": "^0.5.0", + "resolve-from": "^2.0.0", + "rimraf": "^2.5.4", + "signal-exit": "^3.0.1", + "spawn-wrap": "^1.3.8", + "test-exclude": "^4.1.1", + "yargs": "^8.0.1", + "yargs-parser": "^5.0.0" }, "dependencies": { "align-text": { "version": "0.1.4", - "bundled": true, + "resolved": false, + "integrity": "sha1-DNkKVhCT810KmSVsIrcGlDP60Rc=", "dev": true, "requires": { - "kind-of": "3.2.2", - "longest": "1.0.1", - "repeat-string": "1.6.1" + "kind-of": "^3.0.2", + "longest": "^1.0.1", + "repeat-string": "^1.5.2" } }, "amdefine": { "version": "1.0.1", - "bundled": true, + "resolved": false, + "integrity": "sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU=", "dev": true }, "ansi-regex": { "version": "2.1.1", - "bundled": true, + "resolved": false, + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", "dev": true }, "ansi-styles": { "version": "2.2.1", - "bundled": true, + "resolved": false, + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", "dev": true }, "append-transform": { "version": "0.4.0", - "bundled": true, + "resolved": false, + "integrity": "sha1-126/jKlNJ24keja61EpLdKthGZE=", "dev": true, "requires": { - "default-require-extensions": "1.0.0" + "default-require-extensions": "^1.0.0" } }, "archy": { "version": "1.0.0", - "bundled": true, + "resolved": false, + "integrity": "sha1-+cjBN1fMHde8N5rHeyxipcKGjEA=", "dev": true }, "arr-diff": { "version": "2.0.0", - "bundled": true, + "resolved": false, + "integrity": "sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8=", "dev": true, "requires": { - "arr-flatten": "1.1.0" + "arr-flatten": "^1.0.1" } }, "arr-flatten": { "version": "1.1.0", - "bundled": true, + "resolved": false, + "integrity": "sha1-NgSLv/TntH4TZkQxbJlmnqWukfE=", "dev": true }, "array-unique": { "version": "0.2.1", - "bundled": true, + "resolved": false, + "integrity": "sha1-odl8yvy8JiXMcPrc6zalDFiwGlM=", "dev": true }, "arrify": { "version": "1.0.1", - "bundled": true, + "resolved": false, + "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=", "dev": true }, "async": { "version": "1.5.2", - "bundled": true, + "resolved": false, + "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=", "dev": true }, "babel-code-frame": { "version": "6.22.0", - "bundled": true, + "resolved": false, + "integrity": "sha1-AnYgvuVnqIwyVhV05/0IAdMxGOQ=", "dev": true, "requires": { - "chalk": "1.1.3", - "esutils": "2.0.2", - "js-tokens": "3.0.2" + "chalk": "^1.1.0", + "esutils": "^2.0.2", + "js-tokens": "^3.0.0" } }, "babel-generator": { "version": "6.25.0", - "bundled": true, + "resolved": false, + "integrity": "sha1-M6GvcNXyiQrrRlpKd5PB32qeqfw=", "dev": true, "requires": { - "babel-messages": "6.23.0", - "babel-runtime": "6.23.0", - "babel-types": "6.25.0", - "detect-indent": "4.0.0", - "jsesc": "1.3.0", - "lodash": "4.17.4", - "source-map": "0.5.6", - "trim-right": "1.0.1" + "babel-messages": "^6.23.0", + "babel-runtime": "^6.22.0", + "babel-types": "^6.25.0", + "detect-indent": "^4.0.0", + "jsesc": "^1.3.0", + "lodash": "^4.2.0", + "source-map": "^0.5.0", + "trim-right": "^1.0.1" } }, "babel-messages": { "version": "6.23.0", - "bundled": true, + "resolved": false, + "integrity": "sha1-8830cDhYA1sqKVHG7F7fbGLyYw4=", "dev": true, "requires": { - "babel-runtime": "6.23.0" + "babel-runtime": "^6.22.0" } }, "babel-runtime": { "version": "6.23.0", - "bundled": true, + "resolved": false, + "integrity": "sha1-CpSJ8UTecO+zzkMArM2zKeL8VDs=", "dev": true, "requires": { - "core-js": "2.4.1", - "regenerator-runtime": "0.10.5" + "core-js": "^2.4.0", + "regenerator-runtime": "^0.10.0" } }, "babel-template": { "version": "6.25.0", - "bundled": true, + "resolved": false, + "integrity": "sha1-ZlJBFmt8KqTGGdceGSlpVSsQwHE=", "dev": true, "requires": { - "babel-runtime": "6.23.0", - "babel-traverse": "6.25.0", - "babel-types": "6.25.0", - "babylon": "6.17.4", - "lodash": "4.17.4" + "babel-runtime": "^6.22.0", + "babel-traverse": "^6.25.0", + "babel-types": "^6.25.0", + "babylon": "^6.17.2", + "lodash": "^4.2.0" } }, "babel-traverse": { "version": "6.25.0", - "bundled": true, + "resolved": false, + "integrity": "sha1-IldJfi/NGbie3BPEyROB+VEklvE=", "dev": true, "requires": { - "babel-code-frame": "6.22.0", - "babel-messages": "6.23.0", - "babel-runtime": "6.23.0", - "babel-types": "6.25.0", - "babylon": "6.17.4", - "debug": "2.6.8", - "globals": "9.18.0", - "invariant": "2.2.2", - "lodash": "4.17.4" + "babel-code-frame": "^6.22.0", + "babel-messages": "^6.23.0", + "babel-runtime": "^6.22.0", + "babel-types": "^6.25.0", + "babylon": "^6.17.2", + "debug": "^2.2.0", + "globals": "^9.0.0", + "invariant": "^2.2.0", + "lodash": "^4.2.0" } }, "babel-types": { "version": "6.25.0", - "bundled": true, + "resolved": false, + "integrity": "sha1-cK+ySNVmDl0Y+BHZHIMDtUE0oY4=", "dev": true, "requires": { - "babel-runtime": "6.23.0", - "esutils": "2.0.2", - "lodash": "4.17.4", - "to-fast-properties": "1.0.3" + "babel-runtime": "^6.22.0", + "esutils": "^2.0.2", + "lodash": "^4.2.0", + "to-fast-properties": "^1.0.1" } }, "babylon": { "version": "6.17.4", - "bundled": true, + "resolved": false, + "integrity": "sha1-Pot0AriNIsNCPhN6FXeIOxX/hpo=", "dev": true }, "balanced-match": { "version": "1.0.0", - "bundled": true, + "resolved": false, + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", "dev": true }, "brace-expansion": { "version": "1.1.8", - "bundled": true, + "resolved": false, + "integrity": "sha1-wHshHHyVLsH479Uad+8NHTmQopI=", "dev": true, "requires": { - "balanced-match": "1.0.0", + "balanced-match": "^1.0.0", "concat-map": "0.0.1" } }, "braces": { "version": "1.8.5", - "bundled": true, + "resolved": false, + "integrity": "sha1-uneWLhLf+WnWt2cR6RS3N4V79qc=", "dev": true, "requires": { - "expand-range": "1.8.2", - "preserve": "0.2.0", - "repeat-element": "1.1.2" + "expand-range": "^1.8.1", + "preserve": "^0.2.0", + "repeat-element": "^1.1.2" } }, "builtin-modules": { "version": "1.1.1", - "bundled": true, + "resolved": false, + "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=", "dev": true }, "caching-transform": { "version": "1.0.1", - "bundled": true, + "resolved": false, + "integrity": "sha1-bb2y8g+Nj7znnz6U6dF0Lc31wKE=", "dev": true, "requires": { - "md5-hex": "1.3.0", - "mkdirp": "0.5.1", - "write-file-atomic": "1.3.4" + "md5-hex": "^1.2.0", + "mkdirp": "^0.5.1", + "write-file-atomic": "^1.1.4" } }, "camelcase": { "version": "1.2.1", - "bundled": true, + "resolved": false, + "integrity": "sha1-m7UwTS4LVmmLLHWLCKPqqdqlijk=", "dev": true, "optional": true }, "center-align": { "version": "0.1.3", - "bundled": true, + "resolved": false, + "integrity": "sha1-qg0yYptu6XIgBBHL1EYckHvCt60=", "dev": true, "optional": true, "requires": { - "align-text": "0.1.4", - "lazy-cache": "1.0.4" + "align-text": "^0.1.3", + "lazy-cache": "^1.0.3" } }, "chalk": { "version": "1.1.3", - "bundled": true, + "resolved": false, + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", "dev": true, "requires": { - "ansi-styles": "2.2.1", - "escape-string-regexp": "1.0.5", - "has-ansi": "2.0.0", - "strip-ansi": "3.0.1", - "supports-color": "2.0.0" + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" } }, "cliui": { "version": "2.1.0", - "bundled": true, + "resolved": false, + "integrity": "sha1-S0dXYP+AJkx2LDoXGQMukcf+oNE=", "dev": true, "optional": true, "requires": { - "center-align": "0.1.3", - "right-align": "0.1.3", + "center-align": "^0.1.1", + "right-align": "^0.1.1", "wordwrap": "0.0.2" }, "dependencies": { "wordwrap": { "version": "0.0.2", - "bundled": true, + "resolved": false, + "integrity": "sha1-t5Zpu0LstAn4PVg8rVLKF+qhZD8=", "dev": true, "optional": true } @@ -4886,41 +5249,48 @@ }, "code-point-at": { "version": "1.1.0", - "bundled": true, + "resolved": false, + "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", "dev": true }, "commondir": { "version": "1.0.1", - "bundled": true, + "resolved": false, + "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=", "dev": true }, "concat-map": { "version": "0.0.1", - "bundled": true, + "resolved": false, + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", "dev": true }, "convert-source-map": { "version": "1.5.0", - "bundled": true, + "resolved": false, + "integrity": "sha1-ms1whRxtXf3ZPZKC5e35SgP/RrU=", "dev": true }, "core-js": { "version": "2.4.1", - "bundled": true, + "resolved": false, + "integrity": "sha1-TekR5mew6ukSTjQlS1OupvxhjT4=", "dev": true }, "cross-spawn": { "version": "4.0.2", - "bundled": true, + "resolved": false, + "integrity": "sha1-e5JHYhwjrf3ThWAEqCPL45dCTUE=", "dev": true, "requires": { - "lru-cache": "4.1.1", - "which": "1.2.14" + "lru-cache": "^4.0.1", + "which": "^1.2.9" } }, "debug": { "version": "2.6.8", - "bundled": true, + "resolved": false, + "integrity": "sha1-5zFTHKLt4n0YgiJCfaF4IdaP9Pw=", "dev": true, "requires": { "ms": "2.0.0" @@ -4928,379 +5298,433 @@ }, "debug-log": { "version": "1.0.1", - "bundled": true, + "resolved": false, + "integrity": "sha1-IwdjLUwEOCuN+KMvcLiVBG1SdF8=", "dev": true }, "decamelize": { "version": "1.2.0", - "bundled": true, + "resolved": false, + "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", "dev": true }, "default-require-extensions": { "version": "1.0.0", - "bundled": true, + "resolved": false, + "integrity": "sha1-836hXT4T/9m0N9M+GnW1+5eHTLg=", "dev": true, "requires": { - "strip-bom": "2.0.0" + "strip-bom": "^2.0.0" } }, "detect-indent": { "version": "4.0.0", - "bundled": true, + "resolved": false, + "integrity": "sha1-920GQ1LN9Docts5hnE7jqUdd4gg=", "dev": true, "requires": { - "repeating": "2.0.1" + "repeating": "^2.0.0" } }, "error-ex": { "version": "1.3.1", - "bundled": true, + "resolved": false, + "integrity": "sha1-+FWobOYa3E6GIcPNoh56dhLDqNw=", "dev": true, "requires": { - "is-arrayish": "0.2.1" + "is-arrayish": "^0.2.1" } }, "escape-string-regexp": { "version": "1.0.5", - "bundled": true, + "resolved": false, + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", "dev": true }, "esutils": { "version": "2.0.2", - "bundled": true, + "resolved": false, + "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=", "dev": true }, "execa": { "version": "0.5.1", - "bundled": true, + "resolved": false, + "integrity": "sha1-3j+4XLjW6RyFvLzrFkWBeFy1ezY=", "dev": true, "requires": { - "cross-spawn": "4.0.2", - "get-stream": "2.3.1", - "is-stream": "1.1.0", - "npm-run-path": "2.0.2", - "p-finally": "1.0.0", - "signal-exit": "3.0.2", - "strip-eof": "1.0.0" + "cross-spawn": "^4.0.0", + "get-stream": "^2.2.0", + "is-stream": "^1.1.0", + "npm-run-path": "^2.0.0", + "p-finally": "^1.0.0", + "signal-exit": "^3.0.0", + "strip-eof": "^1.0.0" } }, "expand-brackets": { "version": "0.1.5", - "bundled": true, + "resolved": false, + "integrity": "sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s=", "dev": true, "requires": { - "is-posix-bracket": "0.1.1" + "is-posix-bracket": "^0.1.0" } }, "expand-range": { "version": "1.8.2", - "bundled": true, + "resolved": false, + "integrity": "sha1-opnv/TNf4nIeuujiV+x5ZE/IUzc=", "dev": true, "requires": { - "fill-range": "2.2.3" + "fill-range": "^2.1.0" } }, "extglob": { "version": "0.3.2", - "bundled": true, + "resolved": false, + "integrity": "sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE=", "dev": true, "requires": { - "is-extglob": "1.0.0" + "is-extglob": "^1.0.0" } }, "filename-regex": { "version": "2.0.1", - "bundled": true, + "resolved": false, + "integrity": "sha1-wcS5vuPglyXdsQa3XB4wH+LxiyY=", "dev": true }, "fill-range": { "version": "2.2.3", - "bundled": true, + "resolved": false, + "integrity": "sha1-ULd9/X5Gm8dJJHCWNpn+eoSFpyM=", "dev": true, "requires": { - "is-number": "2.1.0", - "isobject": "2.1.0", - "randomatic": "1.1.7", - "repeat-element": "1.1.2", - "repeat-string": "1.6.1" + "is-number": "^2.1.0", + "isobject": "^2.0.0", + "randomatic": "^1.1.3", + "repeat-element": "^1.1.2", + "repeat-string": "^1.5.2" } }, "find-cache-dir": { "version": "0.1.1", - "bundled": true, + "resolved": false, + "integrity": "sha1-yN765XyKUqinhPnjHFfHQumToLk=", "dev": true, "requires": { - "commondir": "1.0.1", - "mkdirp": "0.5.1", - "pkg-dir": "1.0.0" + "commondir": "^1.0.1", + "mkdirp": "^0.5.1", + "pkg-dir": "^1.0.0" } }, "find-up": { "version": "2.1.0", - "bundled": true, + "resolved": false, + "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", "dev": true, "requires": { - "locate-path": "2.0.0" + "locate-path": "^2.0.0" } }, "for-in": { "version": "1.0.2", - "bundled": true, + "resolved": false, + "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=", "dev": true }, "for-own": { "version": "0.1.5", - "bundled": true, + "resolved": false, + "integrity": "sha1-UmXGgaTylNq78XyVCbZ2OqhFEM4=", "dev": true, "requires": { - "for-in": "1.0.2" + "for-in": "^1.0.1" } }, "foreground-child": { "version": "1.5.6", - "bundled": true, + "resolved": false, + "integrity": "sha1-T9ca0t/elnibmApcCilZN8svXOk=", "dev": true, "requires": { - "cross-spawn": "4.0.2", - "signal-exit": "3.0.2" + "cross-spawn": "^4", + "signal-exit": "^3.0.0" } }, "fs.realpath": { "version": "1.0.0", - "bundled": true, + "resolved": false, + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", "dev": true }, "get-caller-file": { "version": "1.0.2", - "bundled": true, + "resolved": false, + "integrity": "sha1-9wLmMSfn4jHBYKgMFVSstw1QR+U=", "dev": true }, "get-stream": { "version": "2.3.1", - "bundled": true, + "resolved": false, + "integrity": "sha1-Xzj5PzRgCWZu4BUKBUFn+Rvdld4=", "dev": true, "requires": { - "object-assign": "4.1.1", - "pinkie-promise": "2.0.1" + "object-assign": "^4.0.1", + "pinkie-promise": "^2.0.0" } }, "glob": { "version": "7.1.2", - "bundled": true, + "resolved": false, + "integrity": "sha1-wZyd+aAocC1nhhI4SmVSQExjbRU=", "dev": true, "requires": { - "fs.realpath": "1.0.0", - "inflight": "1.0.6", - "inherits": "2.0.3", - "minimatch": "3.0.4", - "once": "1.4.0", - "path-is-absolute": "1.0.1" + "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" } }, "glob-base": { "version": "0.3.0", - "bundled": true, + "resolved": false, + "integrity": "sha1-27Fk9iIbHAscz4Kuoyi0l98Oo8Q=", "dev": true, "requires": { - "glob-parent": "2.0.0", - "is-glob": "2.0.1" + "glob-parent": "^2.0.0", + "is-glob": "^2.0.0" } }, "glob-parent": { "version": "2.0.0", - "bundled": true, + "resolved": false, + "integrity": "sha1-gTg9ctsFT8zPUzbaqQLxgvbtuyg=", "dev": true, "requires": { - "is-glob": "2.0.1" + "is-glob": "^2.0.0" } }, "globals": { "version": "9.18.0", - "bundled": true, + "resolved": false, + "integrity": "sha1-qjiWs+abSH8X4x7SFD1pqOMMLYo=", "dev": true }, "graceful-fs": { "version": "4.1.11", - "bundled": true, + "resolved": false, + "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=", "dev": true }, "handlebars": { "version": "4.0.10", - "bundled": true, + "resolved": false, + "integrity": "sha1-PTDHGLCaPZbyPqTMH0A8TTup/08=", "dev": true, "requires": { - "async": "1.5.2", - "optimist": "0.6.1", - "source-map": "0.4.4", - "uglify-js": "2.8.29" + "async": "^1.4.0", + "optimist": "^0.6.1", + "source-map": "^0.4.4", + "uglify-js": "^2.6" }, "dependencies": { "source-map": { "version": "0.4.4", - "bundled": true, + "resolved": false, + "integrity": "sha1-66T12pwNyZneaAMti092FzZSA2s=", "dev": true, "requires": { - "amdefine": "1.0.1" + "amdefine": ">=0.0.4" } } } }, "has-ansi": { "version": "2.0.0", - "bundled": true, + "resolved": false, + "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", "dev": true, "requires": { - "ansi-regex": "2.1.1" + "ansi-regex": "^2.0.0" } }, "has-flag": { "version": "1.0.0", - "bundled": true, + "resolved": false, + "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", "dev": true }, "hosted-git-info": { "version": "2.5.0", - "bundled": true, + "resolved": false, + "integrity": "sha1-bWDjSzq7yDEwYsO3mO+NkBoHrzw=", "dev": true }, "imurmurhash": { "version": "0.1.4", - "bundled": true, + "resolved": false, + "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", "dev": true }, "inflight": { "version": "1.0.6", - "bundled": true, + "resolved": false, + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", "dev": true, "requires": { - "once": "1.4.0", - "wrappy": "1.0.2" + "once": "^1.3.0", + "wrappy": "1" } }, "inherits": { "version": "2.0.3", - "bundled": true, + "resolved": false, + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", "dev": true }, "invariant": { "version": "2.2.2", - "bundled": true, + "resolved": false, + "integrity": "sha1-nh9WrArNtr8wMwbzOL47IErmA2A=", "dev": true, "requires": { - "loose-envify": "1.3.1" + "loose-envify": "^1.0.0" } }, "invert-kv": { "version": "1.0.0", - "bundled": true, + "resolved": false, + "integrity": "sha1-EEqOSqym09jNFXqO+L+rLXo//bY=", "dev": true }, "is-arrayish": { "version": "0.2.1", - "bundled": true, + "resolved": false, + "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", "dev": true }, "is-buffer": { "version": "1.1.5", - "bundled": true, + "resolved": false, + "integrity": "sha1-Hzsm72E7IUuIy8ojzGwB2Hlh7sw=", "dev": true }, "is-builtin-module": { "version": "1.0.0", - "bundled": true, + "resolved": false, + "integrity": "sha1-VAVy0096wxGfj3bDDLwbHgN6/74=", "dev": true, "requires": { - "builtin-modules": "1.1.1" + "builtin-modules": "^1.0.0" } }, "is-dotfile": { "version": "1.0.3", - "bundled": true, + "resolved": false, + "integrity": "sha1-pqLzL/0t+wT1yiXs0Pa4PPeYoeE=", "dev": true }, "is-equal-shallow": { "version": "0.1.3", - "bundled": true, + "resolved": false, + "integrity": "sha1-IjgJj8Ih3gvPpdnqxMRdY4qhxTQ=", "dev": true, "requires": { - "is-primitive": "2.0.0" + "is-primitive": "^2.0.0" } }, "is-extendable": { "version": "0.1.1", - "bundled": true, + "resolved": false, + "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", "dev": true }, "is-extglob": { "version": "1.0.0", - "bundled": true, + "resolved": false, + "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=", "dev": true }, "is-finite": { "version": "1.0.2", - "bundled": true, + "resolved": false, + "integrity": "sha1-zGZ3aVYCvlUO8R6LSqYwU0K20Ko=", "dev": true, "requires": { - "number-is-nan": "1.0.1" + "number-is-nan": "^1.0.0" } }, "is-fullwidth-code-point": { "version": "1.0.0", - "bundled": true, + "resolved": false, + "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", "dev": true, "requires": { - "number-is-nan": "1.0.1" + "number-is-nan": "^1.0.0" } }, "is-glob": { "version": "2.0.1", - "bundled": true, + "resolved": false, + "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", "dev": true, "requires": { - "is-extglob": "1.0.0" + "is-extglob": "^1.0.0" } }, "is-number": { "version": "2.1.0", - "bundled": true, + "resolved": false, + "integrity": "sha1-Afy7s5NGOlSPL0ZszhbezknbkI8=", "dev": true, "requires": { - "kind-of": "3.2.2" + "kind-of": "^3.0.2" } }, "is-posix-bracket": { "version": "0.1.1", - "bundled": true, + "resolved": false, + "integrity": "sha1-MzTceXdDaOkvAW5vvAqI9c1ua8Q=", "dev": true }, "is-primitive": { "version": "2.0.0", - "bundled": true, + "resolved": false, + "integrity": "sha1-IHurkWOEmcB7Kt8kCkGochADRXU=", "dev": true }, "is-stream": { "version": "1.1.0", - "bundled": true, + "resolved": false, + "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", "dev": true }, "is-utf8": { "version": "0.2.1", - "bundled": true, + "resolved": false, + "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=", "dev": true }, "isarray": { "version": "1.0.0", - "bundled": true, + "resolved": false, + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", "dev": true }, "isexe": { "version": "2.0.0", - "bundled": true, + "resolved": false, + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", "dev": true }, "isobject": { "version": "2.1.0", - "bundled": true, + "resolved": false, + "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", "dev": true, "requires": { "isarray": "1.0.0" @@ -5308,229 +5732,257 @@ }, "istanbul-lib-coverage": { "version": "1.1.1", - "bundled": true, + "resolved": false, + "integrity": "sha1-c7+5mIhSmUFck9OKPprfeEp3qdo=", "dev": true }, "istanbul-lib-hook": { "version": "1.0.7", - "bundled": true, + "resolved": false, + "integrity": "sha1-3WYH8DB2V4/n1vKmMM8UO0m6zdw=", "dev": true, "requires": { - "append-transform": "0.4.0" + "append-transform": "^0.4.0" } }, "istanbul-lib-instrument": { "version": "1.7.4", - "bundled": true, + "resolved": false, + "integrity": "sha1-6f2SDkdn89Ge3HZeLWs/XMvQ7qg=", "dev": true, "requires": { - "babel-generator": "6.25.0", - "babel-template": "6.25.0", - "babel-traverse": "6.25.0", - "babel-types": "6.25.0", - "babylon": "6.17.4", - "istanbul-lib-coverage": "1.1.1", - "semver": "5.3.0" + "babel-generator": "^6.18.0", + "babel-template": "^6.16.0", + "babel-traverse": "^6.18.0", + "babel-types": "^6.18.0", + "babylon": "^6.17.4", + "istanbul-lib-coverage": "^1.1.1", + "semver": "^5.3.0" } }, "istanbul-lib-report": { "version": "1.1.1", - "bundled": true, + "resolved": false, + "integrity": "sha1-8OVfVmVf+jQiIIC3oM1HYOFAX8k=", "dev": true, "requires": { - "istanbul-lib-coverage": "1.1.1", - "mkdirp": "0.5.1", - "path-parse": "1.0.5", - "supports-color": "3.2.3" + "istanbul-lib-coverage": "^1.1.1", + "mkdirp": "^0.5.1", + "path-parse": "^1.0.5", + "supports-color": "^3.1.2" }, "dependencies": { "supports-color": { "version": "3.2.3", - "bundled": true, + "resolved": false, + "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", "dev": true, "requires": { - "has-flag": "1.0.0" + "has-flag": "^1.0.0" } } } }, "istanbul-lib-source-maps": { "version": "1.2.1", - "bundled": true, + "resolved": false, + "integrity": "sha1-pv4ay6jOCO68Y45XLilNJnAIqgw=", "dev": true, "requires": { - "debug": "2.6.8", - "istanbul-lib-coverage": "1.1.1", - "mkdirp": "0.5.1", - "rimraf": "2.6.1", - "source-map": "0.5.6" + "debug": "^2.6.3", + "istanbul-lib-coverage": "^1.1.1", + "mkdirp": "^0.5.1", + "rimraf": "^2.6.1", + "source-map": "^0.5.3" } }, "istanbul-reports": { "version": "1.1.1", - "bundled": true, + "resolved": false, + "integrity": "sha1-BCvlyJ4XW8P4ZSPKqynAFOd/7k4=", "dev": true, "requires": { - "handlebars": "4.0.10" + "handlebars": "^4.0.3" } }, "js-tokens": { "version": "3.0.2", - "bundled": true, + "resolved": false, + "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=", "dev": true }, "jsesc": { "version": "1.3.0", - "bundled": true, + "resolved": false, + "integrity": "sha1-RsP+yMGJKxKwgz25vHYiF226s0s=", "dev": true }, "kind-of": { "version": "3.2.2", - "bundled": true, + "resolved": false, + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", "dev": true, "requires": { - "is-buffer": "1.1.5" + "is-buffer": "^1.1.5" } }, "lazy-cache": { "version": "1.0.4", - "bundled": true, + "resolved": false, + "integrity": "sha1-odePw6UEdMuAhF07O24dpJpEbo4=", "dev": true, "optional": true }, "lcid": { "version": "1.0.0", - "bundled": true, + "resolved": false, + "integrity": "sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=", "dev": true, "requires": { - "invert-kv": "1.0.0" + "invert-kv": "^1.0.0" } }, "load-json-file": { "version": "1.1.0", - "bundled": true, + "resolved": false, + "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=", "dev": true, "requires": { - "graceful-fs": "4.1.11", - "parse-json": "2.2.0", - "pify": "2.3.0", - "pinkie-promise": "2.0.1", - "strip-bom": "2.0.0" + "graceful-fs": "^4.1.2", + "parse-json": "^2.2.0", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0", + "strip-bom": "^2.0.0" } }, "locate-path": { "version": "2.0.0", - "bundled": true, + "resolved": false, + "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", "dev": true, "requires": { - "p-locate": "2.0.0", - "path-exists": "3.0.0" + "p-locate": "^2.0.0", + "path-exists": "^3.0.0" }, "dependencies": { "path-exists": { "version": "3.0.0", - "bundled": true, + "resolved": false, + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", "dev": true } } }, "lodash": { "version": "4.17.4", - "bundled": true, + "resolved": false, + "integrity": "sha1-eCA6TRwyiuHYbcpkYONptX9AVa4=", "dev": true }, "longest": { "version": "1.0.1", - "bundled": true, + "resolved": false, + "integrity": "sha1-MKCy2jj3N3DoKUoNIuZiXtd9AJc=", "dev": true }, "loose-envify": { "version": "1.3.1", - "bundled": true, + "resolved": false, + "integrity": "sha1-0aitM/qc4OcT1l/dCsi3SNR4yEg=", "dev": true, "requires": { - "js-tokens": "3.0.2" + "js-tokens": "^3.0.0" } }, "lru-cache": { "version": "4.1.1", - "bundled": true, + "resolved": false, + "integrity": "sha1-Yi4y6CSItJJ5EUpPns9F581rulU=", "dev": true, "requires": { - "pseudomap": "1.0.2", - "yallist": "2.1.2" + "pseudomap": "^1.0.2", + "yallist": "^2.1.2" } }, "md5-hex": { "version": "1.3.0", - "bundled": true, + "resolved": false, + "integrity": "sha1-0sSv6YPENwZiF5uMrRRSGRNQRsQ=", "dev": true, "requires": { - "md5-o-matic": "0.1.1" + "md5-o-matic": "^0.1.1" } }, "md5-o-matic": { "version": "0.1.1", - "bundled": true, + "resolved": false, + "integrity": "sha1-givM1l4RfFFPqxdrJZRdVBAKA8M=", "dev": true }, "mem": { "version": "1.1.0", - "bundled": true, + "resolved": false, + "integrity": "sha1-Xt1StIXKHZAP5kiVUFOZoN+kX3Y=", "dev": true, "requires": { - "mimic-fn": "1.1.0" + "mimic-fn": "^1.0.0" } }, "merge-source-map": { "version": "1.0.4", - "bundled": true, + "resolved": false, + "integrity": "sha1-pd5GU42uhNQRTMXqArR3KmNGcB8=", "dev": true, "requires": { - "source-map": "0.5.6" + "source-map": "^0.5.6" } }, "micromatch": { "version": "2.3.11", - "bundled": true, + "resolved": false, + "integrity": "sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU=", "dev": true, "requires": { - "arr-diff": "2.0.0", - "array-unique": "0.2.1", - "braces": "1.8.5", - "expand-brackets": "0.1.5", - "extglob": "0.3.2", - "filename-regex": "2.0.1", - "is-extglob": "1.0.0", - "is-glob": "2.0.1", - "kind-of": "3.2.2", - "normalize-path": "2.1.1", - "object.omit": "2.0.1", - "parse-glob": "3.0.4", - "regex-cache": "0.4.3" + "arr-diff": "^2.0.0", + "array-unique": "^0.2.1", + "braces": "^1.8.2", + "expand-brackets": "^0.1.4", + "extglob": "^0.3.1", + "filename-regex": "^2.0.0", + "is-extglob": "^1.0.0", + "is-glob": "^2.0.1", + "kind-of": "^3.0.2", + "normalize-path": "^2.0.1", + "object.omit": "^2.0.0", + "parse-glob": "^3.0.4", + "regex-cache": "^0.4.2" } }, "mimic-fn": { "version": "1.1.0", - "bundled": true, + "resolved": false, + "integrity": "sha1-5md4PZLonb00KBi1IwudYqZyrRg=", "dev": true }, "minimatch": { "version": "3.0.4", - "bundled": true, + "resolved": false, + "integrity": "sha1-UWbihkV/AzBgZL5Ul+jbsMPTIIM=", "dev": true, "requires": { - "brace-expansion": "1.1.8" + "brace-expansion": "^1.1.7" } }, "minimist": { "version": "0.0.8", - "bundled": true, + "resolved": false, + "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", "dev": true }, "mkdirp": { "version": "0.5.1", - "bundled": true, + "resolved": false, + "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", "dev": true, "requires": { "minimist": "0.0.8" @@ -5538,493 +5990,561 @@ }, "ms": { "version": "2.0.0", - "bundled": true, + "resolved": false, + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", "dev": true }, "normalize-package-data": { "version": "2.4.0", - "bundled": true, + "resolved": false, + "integrity": "sha1-EvlaMH1YNSB1oEkHuErIvpisAS8=", "dev": true, "requires": { - "hosted-git-info": "2.5.0", - "is-builtin-module": "1.0.0", - "semver": "5.3.0", - "validate-npm-package-license": "3.0.1" + "hosted-git-info": "^2.1.4", + "is-builtin-module": "^1.0.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" } }, "normalize-path": { "version": "2.1.1", - "bundled": true, + "resolved": false, + "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", "dev": true, "requires": { - "remove-trailing-separator": "1.0.2" + "remove-trailing-separator": "^1.0.1" } }, "npm-run-path": { "version": "2.0.2", - "bundled": true, + "resolved": false, + "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", "dev": true, "requires": { - "path-key": "2.0.1" + "path-key": "^2.0.0" } }, "number-is-nan": { "version": "1.0.1", - "bundled": true, + "resolved": false, + "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", "dev": true }, "object-assign": { "version": "4.1.1", - "bundled": true, + "resolved": false, + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", "dev": true }, "object.omit": { "version": "2.0.1", - "bundled": true, + "resolved": false, + "integrity": "sha1-Gpx0SCnznbuFjHbKNXmuKlTr0fo=", "dev": true, "requires": { - "for-own": "0.1.5", - "is-extendable": "0.1.1" + "for-own": "^0.1.4", + "is-extendable": "^0.1.1" } }, "once": { "version": "1.4.0", - "bundled": true, + "resolved": false, + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", "dev": true, "requires": { - "wrappy": "1.0.2" + "wrappy": "1" } }, "optimist": { "version": "0.6.1", - "bundled": true, + "resolved": false, + "integrity": "sha1-2j6nRob6IaGaERwybpDrFaAZZoY=", "dev": true, "requires": { - "minimist": "0.0.8", - "wordwrap": "0.0.3" + "minimist": "~0.0.1", + "wordwrap": "~0.0.2" } }, "os-homedir": { "version": "1.0.2", - "bundled": true, + "resolved": false, + "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=", "dev": true }, "os-locale": { "version": "2.0.0", - "bundled": true, + "resolved": false, + "integrity": "sha1-FZGN7VEFIrge565aMJ1U9jn8OaQ=", "dev": true, "requires": { - "execa": "0.5.1", - "lcid": "1.0.0", - "mem": "1.1.0" + "execa": "^0.5.0", + "lcid": "^1.0.0", + "mem": "^1.1.0" } }, "p-finally": { "version": "1.0.0", - "bundled": true, + "resolved": false, + "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=", "dev": true }, "p-limit": { "version": "1.1.0", - "bundled": true, + "resolved": false, + "integrity": "sha1-sH/y2aXYi+yAYDWJWiurZqJ5iLw=", "dev": true }, "p-locate": { "version": "2.0.0", - "bundled": true, + "resolved": false, + "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", "dev": true, "requires": { - "p-limit": "1.1.0" + "p-limit": "^1.1.0" } }, "parse-glob": { "version": "3.0.4", - "bundled": true, + "resolved": false, + "integrity": "sha1-ssN2z7EfNVE7rdFz7wu246OIORw=", "dev": true, "requires": { - "glob-base": "0.3.0", - "is-dotfile": "1.0.3", - "is-extglob": "1.0.0", - "is-glob": "2.0.1" + "glob-base": "^0.3.0", + "is-dotfile": "^1.0.0", + "is-extglob": "^1.0.0", + "is-glob": "^2.0.0" } }, "parse-json": { "version": "2.2.0", - "bundled": true, + "resolved": false, + "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", "dev": true, "requires": { - "error-ex": "1.3.1" + "error-ex": "^1.2.0" } }, "path-exists": { "version": "2.1.0", - "bundled": true, + "resolved": false, + "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", "dev": true, "requires": { - "pinkie-promise": "2.0.1" + "pinkie-promise": "^2.0.0" } }, "path-is-absolute": { "version": "1.0.1", - "bundled": true, + "resolved": false, + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", "dev": true }, "path-key": { "version": "2.0.1", - "bundled": true, + "resolved": false, + "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", "dev": true }, "path-parse": { "version": "1.0.5", - "bundled": true, + "resolved": false, + "integrity": "sha1-PBrfhx6pzWyUMbbqK9dKD/BVxME=", "dev": true }, "path-type": { "version": "1.1.0", - "bundled": true, + "resolved": false, + "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=", "dev": true, "requires": { - "graceful-fs": "4.1.11", - "pify": "2.3.0", - "pinkie-promise": "2.0.1" + "graceful-fs": "^4.1.2", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0" } }, "pify": { "version": "2.3.0", - "bundled": true, + "resolved": false, + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", "dev": true }, "pinkie": { "version": "2.0.4", - "bundled": true, + "resolved": false, + "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=", "dev": true }, "pinkie-promise": { "version": "2.0.1", - "bundled": true, + "resolved": false, + "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", "dev": true, "requires": { - "pinkie": "2.0.4" + "pinkie": "^2.0.0" } }, "pkg-dir": { "version": "1.0.0", - "bundled": true, + "resolved": false, + "integrity": "sha1-ektQio1bstYp1EcFb/TpyTFM89Q=", "dev": true, "requires": { - "find-up": "1.1.2" + "find-up": "^1.0.0" }, "dependencies": { "find-up": { "version": "1.1.2", - "bundled": true, + "resolved": false, + "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", "dev": true, "requires": { - "path-exists": "2.1.0", - "pinkie-promise": "2.0.1" + "path-exists": "^2.0.0", + "pinkie-promise": "^2.0.0" } } } }, "preserve": { "version": "0.2.0", - "bundled": true, + "resolved": false, + "integrity": "sha1-gV7R9uvGWSb4ZbMQwHE7yzMVzks=", "dev": true }, "pseudomap": { "version": "1.0.2", - "bundled": true, + "resolved": false, + "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=", "dev": true }, "randomatic": { "version": "1.1.7", - "bundled": true, + "resolved": false, + "integrity": "sha1-x6vpzIuHwLqodrGf3oP9RkeX44w=", "dev": true, "requires": { - "is-number": "3.0.0", - "kind-of": "4.0.0" + "is-number": "^3.0.0", + "kind-of": "^4.0.0" }, "dependencies": { "is-number": { "version": "3.0.0", - "bundled": true, + "resolved": false, + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", "dev": true, "requires": { - "kind-of": "3.2.2" + "kind-of": "^3.0.2" }, "dependencies": { "kind-of": { "version": "3.2.2", - "bundled": true, + "resolved": false, + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", "dev": true, "requires": { - "is-buffer": "1.1.5" + "is-buffer": "^1.1.5" } } } }, "kind-of": { "version": "4.0.0", - "bundled": true, + "resolved": false, + "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", "dev": true, "requires": { - "is-buffer": "1.1.5" + "is-buffer": "^1.1.5" } } } }, "read-pkg": { "version": "1.1.0", - "bundled": true, + "resolved": false, + "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=", "dev": true, "requires": { - "load-json-file": "1.1.0", - "normalize-package-data": "2.4.0", - "path-type": "1.1.0" + "load-json-file": "^1.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^1.0.0" } }, "read-pkg-up": { "version": "1.0.1", - "bundled": true, + "resolved": false, + "integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=", "dev": true, "requires": { - "find-up": "1.1.2", - "read-pkg": "1.1.0" + "find-up": "^1.0.0", + "read-pkg": "^1.0.0" }, "dependencies": { "find-up": { "version": "1.1.2", - "bundled": true, + "resolved": false, + "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", "dev": true, "requires": { - "path-exists": "2.1.0", - "pinkie-promise": "2.0.1" + "path-exists": "^2.0.0", + "pinkie-promise": "^2.0.0" } } } }, "regenerator-runtime": { "version": "0.10.5", - "bundled": true, + "resolved": false, + "integrity": "sha1-M2w+/BIgrc7dosn6tntaeVWjNlg=", "dev": true }, "regex-cache": { "version": "0.4.3", - "bundled": true, + "resolved": false, + "integrity": "sha1-mxpsNdTQ3871cRrmUejp09cRQUU=", "dev": true, "requires": { - "is-equal-shallow": "0.1.3", - "is-primitive": "2.0.0" + "is-equal-shallow": "^0.1.3", + "is-primitive": "^2.0.0" } }, "remove-trailing-separator": { "version": "1.0.2", - "bundled": true, + "resolved": false, + "integrity": "sha1-abBi2XhyetFNxrVrpKt3L9jXBRE=", "dev": true }, "repeat-element": { "version": "1.1.2", - "bundled": true, + "resolved": false, + "integrity": "sha1-7wiaF40Ug7quTZPrmLT55OEdmQo=", "dev": true }, "repeat-string": { "version": "1.6.1", - "bundled": true, + "resolved": false, + "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=", "dev": true }, "repeating": { "version": "2.0.1", - "bundled": true, + "resolved": false, + "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=", "dev": true, "requires": { - "is-finite": "1.0.2" + "is-finite": "^1.0.0" } }, "require-directory": { "version": "2.1.1", - "bundled": true, + "resolved": false, + "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", "dev": true }, "require-main-filename": { "version": "1.0.1", - "bundled": true, + "resolved": false, + "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=", "dev": true }, "resolve-from": { "version": "2.0.0", - "bundled": true, + "resolved": false, + "integrity": "sha1-lICrIOlP+h2egKgEx+oUdhGWa1c=", "dev": true }, "right-align": { "version": "0.1.3", - "bundled": true, + "resolved": false, + "integrity": "sha1-YTObci/mo1FWiSENJOFMlhSGE+8=", "dev": true, "optional": true, "requires": { - "align-text": "0.1.4" + "align-text": "^0.1.1" } }, "rimraf": { "version": "2.6.1", - "bundled": true, + "resolved": false, + "integrity": "sha1-wjOOxkPfeht/5cVPqG9XQopV8z0=", "dev": true, "requires": { - "glob": "7.1.2" + "glob": "^7.0.5" } }, "semver": { "version": "5.3.0", - "bundled": true, + "resolved": false, + "integrity": "sha1-myzl094C0XxgEq0yaqa00M9U+U8=", "dev": true }, "set-blocking": { "version": "2.0.0", - "bundled": true, + "resolved": false, + "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", "dev": true }, "signal-exit": { "version": "3.0.2", - "bundled": true, + "resolved": false, + "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=", "dev": true }, "slide": { "version": "1.1.6", - "bundled": true, + "resolved": false, + "integrity": "sha1-VusCfWW00tzmyy4tMsTUr8nh1wc=", "dev": true }, "source-map": { "version": "0.5.6", - "bundled": true, + "resolved": false, + "integrity": "sha1-dc449SvwczxafwwRjYEzSiu19BI=", "dev": true }, "spawn-wrap": { "version": "1.3.8", - "bundled": true, + "resolved": false, + "integrity": "sha1-+ip5uZDLsLsAGNymdI2INnsZ7DE=", "dev": true, "requires": { - "foreground-child": "1.5.6", - "mkdirp": "0.5.1", - "os-homedir": "1.0.2", - "rimraf": "2.6.1", - "signal-exit": "3.0.2", - "which": "1.2.14" + "foreground-child": "^1.5.6", + "mkdirp": "^0.5.0", + "os-homedir": "^1.0.1", + "rimraf": "^2.3.3", + "signal-exit": "^3.0.2", + "which": "^1.2.4" } }, "spdx-correct": { "version": "1.0.2", - "bundled": true, + "resolved": false, + "integrity": "sha1-SzBz2TP/UfORLwOsVRlJikFQ20A=", "dev": true, "requires": { - "spdx-license-ids": "1.2.2" + "spdx-license-ids": "^1.0.2" } }, "spdx-expression-parse": { "version": "1.0.4", - "bundled": true, + "resolved": false, + "integrity": "sha1-m98vIOH0DtRH++JzJmGR/O1RYmw=", "dev": true }, "spdx-license-ids": { "version": "1.2.2", - "bundled": true, + "resolved": false, + "integrity": "sha1-yd96NCRZSt5r0RkA1ZZpbcBrrFc=", "dev": true }, "string-width": { "version": "2.1.0", - "bundled": true, + "resolved": false, + "integrity": "sha1-AwZkVh/BRslCPsfZeP4kV0N/5tA=", "dev": true, "requires": { - "is-fullwidth-code-point": "2.0.0", - "strip-ansi": "4.0.0" + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^4.0.0" }, "dependencies": { "ansi-regex": { "version": "3.0.0", - "bundled": true, + "resolved": false, + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", "dev": true }, "is-fullwidth-code-point": { "version": "2.0.0", - "bundled": true, + "resolved": false, + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", "dev": true }, "strip-ansi": { "version": "4.0.0", - "bundled": true, + "resolved": false, + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", "dev": true, "requires": { - "ansi-regex": "3.0.0" + "ansi-regex": "^3.0.0" } } } }, "strip-ansi": { "version": "3.0.1", - "bundled": true, + "resolved": false, + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", "dev": true, "requires": { - "ansi-regex": "2.1.1" + "ansi-regex": "^2.0.0" } }, "strip-bom": { "version": "2.0.0", - "bundled": true, + "resolved": false, + "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", "dev": true, "requires": { - "is-utf8": "0.2.1" + "is-utf8": "^0.2.0" } }, "strip-eof": { "version": "1.0.0", - "bundled": true, + "resolved": false, + "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=", "dev": true }, "supports-color": { "version": "2.0.0", - "bundled": true, + "resolved": false, + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", "dev": true }, "test-exclude": { "version": "4.1.1", - "bundled": true, + "resolved": false, + "integrity": "sha1-TYSWSwlmsAh+zDNKLOAC09k0HiY=", "dev": true, "requires": { - "arrify": "1.0.1", - "micromatch": "2.3.11", - "object-assign": "4.1.1", - "read-pkg-up": "1.0.1", - "require-main-filename": "1.0.1" + "arrify": "^1.0.1", + "micromatch": "^2.3.11", + "object-assign": "^4.1.0", + "read-pkg-up": "^1.0.1", + "require-main-filename": "^1.0.1" } }, "to-fast-properties": { "version": "1.0.3", - "bundled": true, + "resolved": false, + "integrity": "sha1-uDVx+k2MJbguIxsG46MFXeTKGkc=", "dev": true }, "trim-right": { "version": "1.0.1", - "bundled": true, + "resolved": false, + "integrity": "sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM=", "dev": true }, "uglify-js": { "version": "2.8.29", - "bundled": true, + "resolved": false, + "integrity": "sha1-KcVzMUgFe7Th913zW3qcty5qWd0=", "dev": true, "optional": true, "requires": { - "source-map": "0.5.6", - "uglify-to-browserify": "1.0.2", - "yargs": "3.10.0" + "source-map": "~0.5.1", + "uglify-to-browserify": "~1.0.0", + "yargs": "~3.10.0" }, "dependencies": { "yargs": { "version": "3.10.0", - "bundled": true, + "resolved": false, + "integrity": "sha1-9+572FfdfB0tOMDnTvvWgdFDH9E=", "dev": true, "optional": true, "requires": { - "camelcase": "1.2.1", - "cliui": "2.1.0", - "decamelize": "1.2.0", + "camelcase": "^1.0.2", + "cliui": "^2.1.0", + "decamelize": "^1.0.0", "window-size": "0.1.0" } } @@ -6032,200 +6552,224 @@ }, "uglify-to-browserify": { "version": "1.0.2", - "bundled": true, + "resolved": false, + "integrity": "sha1-bgkk1r2mta/jSeOabWMoUKD4grc=", "dev": true, "optional": true }, "validate-npm-package-license": { "version": "3.0.1", - "bundled": true, + "resolved": false, + "integrity": "sha1-KAS6vnEq0zeUWaz74kdGqywwP7w=", "dev": true, "requires": { - "spdx-correct": "1.0.2", - "spdx-expression-parse": "1.0.4" + "spdx-correct": "~1.0.0", + "spdx-expression-parse": "~1.0.0" } }, "which": { "version": "1.2.14", - "bundled": true, + "resolved": false, + "integrity": "sha1-mofEN48D6CfOyvGs31bHNsAcFOU=", "dev": true, "requires": { - "isexe": "2.0.0" + "isexe": "^2.0.0" } }, "which-module": { "version": "2.0.0", - "bundled": true, + "resolved": false, + "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", "dev": true }, "window-size": { "version": "0.1.0", - "bundled": true, + "resolved": false, + "integrity": "sha1-VDjNLqk7IC76Ohn+iIeu58lPnJ0=", "dev": true, "optional": true }, "wordwrap": { "version": "0.0.3", - "bundled": true, + "resolved": false, + "integrity": "sha1-o9XabNXAvAAI03I0u68b7WMFkQc=", "dev": true }, "wrap-ansi": { "version": "2.1.0", - "bundled": true, + "resolved": false, + "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", "dev": true, "requires": { - "string-width": "1.0.2", - "strip-ansi": "3.0.1" + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1" }, "dependencies": { "string-width": { "version": "1.0.2", - "bundled": true, + "resolved": false, + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", "dev": true, "requires": { - "code-point-at": "1.1.0", - "is-fullwidth-code-point": "1.0.0", - "strip-ansi": "3.0.1" + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" } } } }, "wrappy": { "version": "1.0.2", - "bundled": true, + "resolved": false, + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", "dev": true }, "write-file-atomic": { "version": "1.3.4", - "bundled": true, + "resolved": false, + "integrity": "sha1-+Aek8LHZ6ROuekgRLmzDrxmRtF8=", "dev": true, "requires": { - "graceful-fs": "4.1.11", - "imurmurhash": "0.1.4", - "slide": "1.1.6" + "graceful-fs": "^4.1.11", + "imurmurhash": "^0.1.4", + "slide": "^1.1.5" } }, "y18n": { "version": "3.2.1", - "bundled": true, + "resolved": false, + "integrity": "sha1-bRX7qITAhnnA136I53WegR4H+kE=", "dev": true }, "yallist": { "version": "2.1.2", - "bundled": true, + "resolved": false, + "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=", "dev": true }, "yargs": { "version": "8.0.2", - "bundled": true, - "dev": true, - "requires": { - "camelcase": "4.1.0", - "cliui": "3.2.0", - "decamelize": "1.2.0", - "get-caller-file": "1.0.2", - "os-locale": "2.0.0", - "read-pkg-up": "2.0.0", - "require-directory": "2.1.1", - "require-main-filename": "1.0.1", - "set-blocking": "2.0.0", - "string-width": "2.1.0", - "which-module": "2.0.0", - "y18n": "3.2.1", - "yargs-parser": "7.0.0" + "resolved": false, + "integrity": "sha1-YpmpBVsc78lp/355wdkY3Osiw2A=", + "dev": true, + "requires": { + "camelcase": "^4.1.0", + "cliui": "^3.2.0", + "decamelize": "^1.1.1", + "get-caller-file": "^1.0.1", + "os-locale": "^2.0.0", + "read-pkg-up": "^2.0.0", + "require-directory": "^2.1.1", + "require-main-filename": "^1.0.1", + "set-blocking": "^2.0.0", + "string-width": "^2.0.0", + "which-module": "^2.0.0", + "y18n": "^3.2.1", + "yargs-parser": "^7.0.0" }, "dependencies": { "camelcase": { "version": "4.1.0", - "bundled": true, + "resolved": false, + "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=", "dev": true }, "cliui": { "version": "3.2.0", - "bundled": true, + "resolved": false, + "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=", "dev": true, "requires": { - "string-width": "1.0.2", - "strip-ansi": "3.0.1", - "wrap-ansi": "2.1.0" + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1", + "wrap-ansi": "^2.0.0" }, "dependencies": { "string-width": { "version": "1.0.2", - "bundled": true, + "resolved": false, + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", "dev": true, "requires": { - "code-point-at": "1.1.0", - "is-fullwidth-code-point": "1.0.0", - "strip-ansi": "3.0.1" + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" } } } }, "load-json-file": { "version": "2.0.0", - "bundled": true, + "resolved": false, + "integrity": "sha1-eUfkIUmvgNaWy/eXvKq8/h/inKg=", "dev": true, "requires": { - "graceful-fs": "4.1.11", - "parse-json": "2.2.0", - "pify": "2.3.0", - "strip-bom": "3.0.0" + "graceful-fs": "^4.1.2", + "parse-json": "^2.2.0", + "pify": "^2.0.0", + "strip-bom": "^3.0.0" } }, "path-type": { "version": "2.0.0", - "bundled": true, + "resolved": false, + "integrity": "sha1-8BLMuEFbcJb8LaoQVMPXI4lZTHM=", "dev": true, "requires": { - "pify": "2.3.0" + "pify": "^2.0.0" } }, "read-pkg": { "version": "2.0.0", - "bundled": true, + "resolved": false, + "integrity": "sha1-jvHAYjxqbbDcZxPEv6xGMysjaPg=", "dev": true, "requires": { - "load-json-file": "2.0.0", - "normalize-package-data": "2.4.0", - "path-type": "2.0.0" + "load-json-file": "^2.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^2.0.0" } }, "read-pkg-up": { "version": "2.0.0", - "bundled": true, + "resolved": false, + "integrity": "sha1-a3KoBImE4MQeeVEP1en6mbO1Sb4=", "dev": true, "requires": { - "find-up": "2.1.0", - "read-pkg": "2.0.0" + "find-up": "^2.0.0", + "read-pkg": "^2.0.0" } }, "strip-bom": { "version": "3.0.0", - "bundled": true, + "resolved": false, + "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", "dev": true }, "yargs-parser": { "version": "7.0.0", - "bundled": true, + "resolved": false, + "integrity": "sha1-jQrELxbqVd69MyyvTEA4s+P139k=", "dev": true, "requires": { - "camelcase": "4.1.0" + "camelcase": "^4.1.0" } } } }, "yargs-parser": { "version": "5.0.0", - "bundled": true, + "resolved": false, + "integrity": "sha1-J17PDX/+Bcd+ZOfIbkzZS/DhIoo=", "dev": true, "requires": { - "camelcase": "3.0.0" + "camelcase": "^3.0.0" }, "dependencies": { "camelcase": { "version": "3.0.0", - "bundled": true, + "resolved": false, + "integrity": "sha1-MvxLn82vhF/N9+c7uXysImHwqwo=", "dev": true } } @@ -6250,9 +6794,9 @@ "integrity": "sha1-scnMBE7xuf5jYG/BQau7MuFHMMw=", "dev": true, "requires": { - "define-properties": "1.1.2", - "function-bind": "1.1.0", - "object-keys": "1.0.11" + "define-properties": "^1.1.2", + "function-bind": "^1.1.0", + "object-keys": "^1.0.10" } }, "once": { @@ -6260,7 +6804,7 @@ "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", "requires": { - "wrappy": "1.0.2" + "wrappy": "1" } }, "onetime": { @@ -6275,12 +6819,12 @@ "integrity": "sha1-NkxeQJ0/TWMB1sC0wFu6UBgK62Q=", "dev": true, "requires": { - "deep-is": "0.1.3", - "fast-levenshtein": "2.0.6", - "levn": "0.3.0", - "prelude-ls": "1.1.2", - "type-check": "0.3.2", - "wordwrap": "1.0.0" + "deep-is": "~0.1.3", + "fast-levenshtein": "~2.0.4", + "levn": "~0.3.0", + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2", + "wordwrap": "~1.0.0" } }, "os-homedir": { @@ -6301,8 +6845,8 @@ "integrity": "sha1-Qv5tWVPfBsgGS+bxdsPQWqqjRkQ=", "dev": true, "requires": { - "os-homedir": "1.0.2", - "os-tmpdir": "1.0.2" + "os-homedir": "^1.0.0", + "os-tmpdir": "^1.0.0" } }, "p-limit": { @@ -6317,7 +6861,7 @@ "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", "dev": true, "requires": { - "p-limit": "1.1.0" + "p-limit": "^1.1.0" } }, "package-json": { @@ -6326,10 +6870,10 @@ "integrity": "sha1-DRW9Z9HLvduyyiIv8u24a8sxqLs=", "dev": true, "requires": { - "got": "5.7.1", - "registry-auth-token": "3.3.1", - "registry-url": "3.1.0", - "semver": "5.4.1" + "got": "^5.0.0", + "registry-auth-token": "^3.0.1", + "registry-url": "^3.0.3", + "semver": "^5.1.0" } }, "parse-json": { @@ -6338,7 +6882,7 @@ "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", "dev": true, "requires": { - "error-ex": "1.3.1" + "error-ex": "^1.2.0" } }, "path-exists": { @@ -6347,7 +6891,7 @@ "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", "dev": true, "requires": { - "pinkie-promise": "2.0.1" + "pinkie-promise": "^2.0.0" } }, "path-is-absolute": { @@ -6398,7 +6942,7 @@ "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", "dev": true, "requires": { - "pinkie": "2.0.4" + "pinkie": "^2.0.0" } }, "pkg-conf": { @@ -6407,8 +6951,8 @@ "integrity": "sha1-BxyHZQQDvM+5xif1h1G/5HwGcnk=", "dev": true, "requires": { - "find-up": "2.1.0", - "load-json-file": "2.0.0" + "find-up": "^2.0.0", + "load-json-file": "^2.0.0" }, "dependencies": { "find-up": { @@ -6417,7 +6961,7 @@ "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", "dev": true, "requires": { - "locate-path": "2.0.0" + "locate-path": "^2.0.0" } } } @@ -6428,9 +6972,9 @@ "integrity": "sha1-VX7yLXPaPIg3EHdmxS6tq94pj+Q=", "dev": true, "requires": { - "debug-log": "1.0.1", - "find-root": "1.1.0", - "xtend": "4.0.1" + "debug-log": "^1.0.0", + "find-root": "^1.0.0", + "xtend": "^4.0.1" } }, "pkg-dir": { @@ -6439,7 +6983,7 @@ "integrity": "sha1-ektQio1bstYp1EcFb/TpyTFM89Q=", "dev": true, "requires": { - "find-up": "1.1.2" + "find-up": "^1.0.0" } }, "pkg-up": { @@ -6448,7 +6992,7 @@ "integrity": "sha1-Pgj7RhUlxEIWJKM7n35tCvWwWiY=", "dev": true, "requires": { - "find-up": "1.1.2" + "find-up": "^1.0.0" } }, "pluralize": { @@ -6457,6 +7001,60 @@ "integrity": "sha1-0aIUg/0iu0HlihL6NCGCMUCJfEU=", "dev": true }, + "postcss": { + "version": "6.0.23", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.23.tgz", + "integrity": "sha512-soOk1h6J3VMTZtVeVpv15/Hpdl2cBLX3CAw4TAbkpTJiNPk9YP/zWcD1ND+xEtvyuuvKzbxliTOIyvkSeSJ6ag==", + "dev": true, + "requires": { + "chalk": "^2.4.1", + "source-map": "^0.6.1", + "supports-color": "^5.4.0" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "chalk": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", + "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, "prelude-ls": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", @@ -6478,7 +7076,8 @@ "process-nextick-args": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.7.tgz", - "integrity": "sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M=" + "integrity": "sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M=", + "dev": true }, "progress": { "version": "1.1.8", @@ -6492,10 +7091,10 @@ "integrity": "sha1-LgPo5C7kULjLPc5lvhv4l04d/ZU=", "dev": true, "requires": { - "deep-extend": "0.4.2", - "ini": "1.3.4", - "minimist": "1.2.0", - "strip-json-comments": "2.0.1" + "deep-extend": "~0.4.0", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" }, "dependencies": { "minimist": { @@ -6512,28 +7111,30 @@ "integrity": "sha1-NcPhd/IHjveJ7kv6+kNzB06u9Po=", "dev": true, "requires": { - "pinkie-promise": "2.0.1", - "readable-stream": "2.2.7" + "pinkie-promise": "^2.0.0", + "readable-stream": "^2.0.0" } }, "readable-stream": { "version": "2.2.7", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.2.7.tgz", "integrity": "sha1-BwV6y+JGeyIELTb5jFrVBwVOlbE=", + "dev": true, "requires": { - "buffer-shims": "1.0.0", - "core-util-is": "1.0.2", - "inherits": "2.0.3", - "isarray": "1.0.0", - "process-nextick-args": "1.0.7", - "string_decoder": "1.0.3", - "util-deprecate": "1.0.2" + "buffer-shims": "~1.0.0", + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "~1.0.0", + "process-nextick-args": "~1.0.6", + "string_decoder": "~1.0.0", + "util-deprecate": "~1.0.1" }, "dependencies": { "isarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true } } }, @@ -6543,8 +7144,8 @@ "integrity": "sha1-QQWWCP/BVHV7cV2ZidGZ/783LjU=", "dev": true, "requires": { - "code-point-at": "1.1.0", - "is-fullwidth-code-point": "1.0.0", + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", "mute-stream": "0.0.5" } }, @@ -6554,7 +7155,7 @@ "integrity": "sha1-hSBLVNuoLVdC4oyWdW70OvUOM4Q=", "dev": true, "requires": { - "resolve": "1.4.0" + "resolve": "^1.1.6" } }, "regenerate": { @@ -6575,26 +7176,20 @@ "integrity": "sha512-PJepbvDbuK1xgIgnau7Y90cwaAmO/LCLMI2mPvaXq2heGMR3aWW5/BQvYrhJ8jgmQjXewXvBjzfqKcVOmhjZ6Q==", "dev": true, "requires": { - "babel-runtime": "6.26.0", - "babel-types": "6.26.0", - "private": "0.1.7" + "babel-runtime": "^6.18.0", + "babel-types": "^6.19.0", + "private": "^0.1.6" } }, - "regexp-quote": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/regexp-quote/-/regexp-quote-0.0.0.tgz", - "integrity": "sha1-Hg9GUMhi3L/tVP1CsUjpuxch/PI=", - "dev": true - }, "regexpu-core": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-2.0.0.tgz", "integrity": "sha1-SdA4g3uNz4v6W5pCE5k45uoq4kA=", "dev": true, "requires": { - "regenerate": "1.3.2", - "regjsgen": "0.2.0", - "regjsparser": "0.1.5" + "regenerate": "^1.2.1", + "regjsgen": "^0.2.0", + "regjsparser": "^0.1.4" } }, "registry-auth-token": { @@ -6603,8 +7198,8 @@ "integrity": "sha1-+w0yie4Nmtosu1KvXf5mywcNMAY=", "dev": true, "requires": { - "rc": "1.2.1", - "safe-buffer": "5.1.1" + "rc": "^1.1.6", + "safe-buffer": "^5.0.1" } }, "registry-url": { @@ -6613,7 +7208,7 @@ "integrity": "sha1-PU74cPc93h138M+aOBQyRE4XSUI=", "dev": true, "requires": { - "rc": "1.2.1" + "rc": "^1.0.1" } }, "regjsgen": { @@ -6628,7 +7223,7 @@ "integrity": "sha1-fuj4Tcb6eS0/0K4ijSS9lJ6tIFw=", "dev": true, "requires": { - "jsesc": "0.5.0" + "jsesc": "~0.5.0" }, "dependencies": { "jsesc": { @@ -6645,16 +7240,7 @@ "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=", "dev": true, "requires": { - "is-finite": "1.0.2" - } - }, - "require_optional": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/require_optional/-/require_optional-1.0.1.tgz", - "integrity": "sha512-qhM/y57enGWHAe3v/NcwML6a3/vfESLe/sGM2dII+gEO0BpKRUkWZow/tyloNqJyN6kXSl3RyyM8Ll5D/sJP8g==", - "requires": { - "resolve-from": "2.0.0", - "semver": "5.4.1" + "is-finite": "^1.0.0" } }, "require-dir": { @@ -6669,8 +7255,8 @@ "integrity": "sha1-Tg1W1slmL9MeQwEcS5WqSZVUIdM=", "dev": true, "requires": { - "caller-path": "0.1.0", - "resolve-from": "1.0.1" + "caller-path": "^0.1.0", + "resolve-from": "^1.0.0" }, "dependencies": { "resolve-from": { @@ -6681,13 +7267,23 @@ } } }, + "require_optional": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/require_optional/-/require_optional-1.0.1.tgz", + "integrity": "sha512-qhM/y57enGWHAe3v/NcwML6a3/vfESLe/sGM2dII+gEO0BpKRUkWZow/tyloNqJyN6kXSl3RyyM8Ll5D/sJP8g==", + "dev": true, + "requires": { + "resolve-from": "^2.0.0", + "semver": "^5.1.0" + } + }, "requizzle": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/requizzle/-/requizzle-0.2.1.tgz", "integrity": "sha1-aUPDUwxNmn5G8c3dUcFY/GcM294=", "dev": true, "requires": { - "underscore": "1.6.0" + "underscore": "~1.6.0" }, "dependencies": { "underscore": { @@ -6704,13 +7300,14 @@ "integrity": "sha512-aW7sVKPufyHqOmyyLzg/J+8606v5nevBgaliIlV7nUpVMsDnoBGV/cbSLNjZAg9q0Cfd/+easKVKQ8vOu8fn1Q==", "dev": true, "requires": { - "path-parse": "1.0.5" + "path-parse": "^1.0.5" } }, "resolve-from": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-2.0.0.tgz", - "integrity": "sha1-lICrIOlP+h2egKgEx+oUdhGWa1c=" + "integrity": "sha1-lICrIOlP+h2egKgEx+oUdhGWa1c=", + "dev": true }, "restore-cursor": { "version": "1.0.1", @@ -6718,8 +7315,8 @@ "integrity": "sha1-NGYfRohjJ/7SmRR5FSJS35LapUE=", "dev": true, "requires": { - "exit-hook": "1.1.1", - "onetime": "1.1.0" + "exit-hook": "^1.0.0", + "onetime": "^1.0.0" } }, "rimraf": { @@ -6728,7 +7325,7 @@ "integrity": "sha1-wjOOxkPfeht/5cVPqG9XQopV8z0=", "dev": true, "requires": { - "glob": "7.1.1" + "glob": "^7.0.5" } }, "rollup": { @@ -6743,7 +7340,7 @@ "integrity": "sha512-ALGPBFtwJZcYHsNPM6RGJlEncTzAARPvZOGjNPZgDe5hS5t6sJGjiOWibEFVEz5LQN7S7spvCBILaS4N1Cql2w==", "dev": true, "requires": { - "rollup-pluginutils": "1.5.2" + "rollup-pluginutils": "^1.5.0" } }, "rollup-pluginutils": { @@ -6752,8 +7349,8 @@ "integrity": "sha1-HhVud4+UtyVb+hs9AXi+j1xVJAg=", "dev": true, "requires": { - "estree-walker": "0.2.1", - "minimatch": "3.0.4" + "estree-walker": "^0.2.1", + "minimatch": "^3.0.2" } }, "run-async": { @@ -6762,7 +7359,7 @@ "integrity": "sha1-yK1KXhEGYeQCp9IbUw4AnyX444k=", "dev": true, "requires": { - "once": "1.4.0" + "once": "^1.3.0" } }, "run-parallel": { @@ -6780,7 +7377,8 @@ "safe-buffer": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz", - "integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg==" + "integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg==", + "dev": true }, "samsam": { "version": "1.2.1", @@ -6788,20 +7386,75 @@ "integrity": "sha1-7dOQk6MYQ3DLhZJDsr3yVefY6mc=" }, "sanitize-html": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/sanitize-html/-/sanitize-html-1.14.1.tgz", - "integrity": "sha1-cw/6Ikm98YMz7/5FsoYXPJxa0Lg=", + "version": "1.19.0", + "resolved": "https://registry.npmjs.org/sanitize-html/-/sanitize-html-1.19.0.tgz", + "integrity": "sha512-Qt2imq49f2qP4537a7R2Xgx9sjTvw18jIT7zKurhu5kpYNQfMo8EZaW3OcpoXCvg3GTN4C4R3mN8ao7STUtKtA==", + "dev": true, + "requires": { + "chalk": "^2.3.0", + "htmlparser2": "^3.9.0", + "lodash.clonedeep": "^4.5.0", + "lodash.escaperegexp": "^4.1.2", + "lodash.isplainobject": "^4.0.6", + "lodash.isstring": "^4.0.1", + "lodash.mergewith": "^4.6.0", + "postcss": "^6.0.14", + "srcset": "^1.0.0", + "xtend": "^4.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "chalk": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", + "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "saslprep": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/saslprep/-/saslprep-1.0.2.tgz", + "integrity": "sha512-4cDsYuAjXssUSjxHKRe4DTZC0agDwsCqcMqtJAQPzC74nJ7LfAJflAtC1Zed5hMzEQKj82d3tuzqdGNRsLJ4Gw==", "dev": true, + "optional": true, "requires": { - "htmlparser2": "3.9.2", - "regexp-quote": "0.0.0", - "xtend": "4.0.1" + "sparse-bitfield": "^3.0.3" } }, "semver": { "version": "5.4.1", "resolved": "https://registry.npmjs.org/semver/-/semver-5.4.1.tgz", - "integrity": "sha512-WfG/X9+oATh81XtllIo/I8gOiY9EXRdv1cQdyykeXK17YcUW3EXUAi2To4pcH6nZtJPr7ZOpM5OMyWJZm+8Rsg==" + "integrity": "sha512-WfG/X9+oATh81XtllIo/I8gOiY9EXRdv1cQdyykeXK17YcUW3EXUAi2To4pcH6nZtJPr7ZOpM5OMyWJZm+8Rsg==", + "dev": true }, "semver-diff": { "version": "2.1.0", @@ -6809,7 +7462,7 @@ "integrity": "sha1-S7uEN8jTfksM8aaP1ybsbWRdbTY=", "dev": true, "requires": { - "semver": "5.4.1" + "semver": "^5.0.3" } }, "semver-utils": { @@ -6824,9 +7477,9 @@ "integrity": "sha1-3svPh0sNHl+3LhSxZKloMEjprLM=", "dev": true, "requires": { - "glob": "7.1.1", - "interpret": "1.0.3", - "rechoir": "0.6.2" + "glob": "^7.0.0", + "interpret": "^1.0.0", + "rechoir": "^0.6.2" } }, "sinon": { @@ -6835,15 +7488,15 @@ "integrity": "sha512-KY3OLOWpek/I4NGAMHetuutVgS2aRgMR5g5/1LSYvPJ3qo2BopIvk3esFztPxF40RWf/NNNJzdFPriSkXUVK3A==", "dev": true, "requires": { - "diff": "3.2.0", + "diff": "^3.1.0", "formatio": "1.2.0", - "lolex": "2.1.2", - "native-promise-only": "0.8.1", - "nise": "1.0.1", - "path-to-regexp": "1.7.0", - "samsam": "1.2.1", + "lolex": "^2.1.2", + "native-promise-only": "^0.8.1", + "nise": "^1.0.1", + "path-to-regexp": "^1.7.0", + "samsam": "^1.1.3", "text-encoding": "0.6.4", - "type-detect": "4.0.3" + "type-detect": "^4.0.0" }, "dependencies": { "lolex": { @@ -6884,7 +7537,17 @@ "integrity": "sha512-A6vlydY7H/ljr4L2UOhDSajQdZQ6dMD7cLH0pzwcmwLyc9u8PNI4WGtnfDDzX7uzGL6c/T+ORL97Zlh+S4iOrg==", "dev": true, "requires": { - "source-map": "0.5.6" + "source-map": "^0.5.6" + } + }, + "sparse-bitfield": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/sparse-bitfield/-/sparse-bitfield-3.0.3.tgz", + "integrity": "sha1-/0rm5oZWBWuks+eSqzM004JzyhE=", + "dev": true, + "optional": true, + "requires": { + "memory-pager": "^1.0.2" } }, "spawn-please": { @@ -6893,27 +7556,43 @@ "integrity": "sha1-vdhZkbgECfnA2scJvESgoxipdg0=", "dev": true }, + "spdx-license-ids": { + "version": "1.2.0", + "resolved": "http://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-1.2.0.tgz", + "integrity": "sha1-tUndD2Pct0Whfi6joHQC4OMy0eI=", + "dev": true + }, "sprintf-js": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", "dev": true }, + "srcset": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/srcset/-/srcset-1.0.0.tgz", + "integrity": "sha1-pWad4StC87HV6D7QPHEEb8SPQe8=", + "dev": true, + "requires": { + "array-uniq": "^1.0.2", + "number-is-nan": "^1.0.0" + } + }, "standard": { "version": "10.0.3", "resolved": "https://registry.npmjs.org/standard/-/standard-10.0.3.tgz", "integrity": "sha512-JURZ+85ExKLQULckDFijdX5WHzN6RC7fgiZNSV4jFQVo+3tPoQGHyBrGekye/yf0aOfb4210EM5qPNlc2cRh4w==", "dev": true, "requires": { - "eslint": "3.19.0", + "eslint": "~3.19.0", "eslint-config-standard": "10.2.1", "eslint-config-standard-jsx": "4.0.2", - "eslint-plugin-import": "2.2.0", - "eslint-plugin-node": "4.2.3", - "eslint-plugin-promise": "3.5.0", - "eslint-plugin-react": "6.10.3", - "eslint-plugin-standard": "3.0.1", - "standard-engine": "7.0.0" + "eslint-plugin-import": "~2.2.0", + "eslint-plugin-node": "~4.2.2", + "eslint-plugin-promise": "~3.5.0", + "eslint-plugin-react": "~6.10.0", + "eslint-plugin-standard": "~3.0.1", + "standard-engine": "~7.0.0" }, "dependencies": { "doctrine": { @@ -6922,8 +7601,8 @@ "integrity": "sha1-xz2NKQnSIpHhoAejlYBNqLZl/mM=", "dev": true, "requires": { - "esutils": "2.0.2", - "isarray": "1.0.0" + "esutils": "^2.0.2", + "isarray": "^1.0.0" } }, "eslint": { @@ -6932,41 +7611,41 @@ "integrity": "sha1-yPxiAcf0DdCJQbh8CFdnOGpnmsw=", "dev": true, "requires": { - "babel-code-frame": "6.26.0", - "chalk": "1.1.3", - "concat-stream": "1.6.0", - "debug": "2.6.8", - "doctrine": "2.0.0", - "escope": "3.6.0", - "espree": "3.5.0", - "esquery": "1.0.0", - "estraverse": "4.2.0", - "esutils": "2.0.2", - "file-entry-cache": "2.0.0", - "glob": "7.1.1", - "globals": "9.18.0", - "ignore": "3.3.3", - "imurmurhash": "0.1.4", - "inquirer": "0.12.0", - "is-my-json-valid": "2.16.0", - "is-resolvable": "1.0.0", - "js-yaml": "3.9.1", - "json-stable-stringify": "1.0.1", - "levn": "0.3.0", - "lodash": "4.17.4", - "mkdirp": "0.5.1", - "natural-compare": "1.4.0", - "optionator": "0.8.2", - "path-is-inside": "1.0.2", - "pluralize": "1.2.1", - "progress": "1.1.8", - "require-uncached": "1.0.3", - "shelljs": "0.7.8", - "strip-bom": "3.0.0", - "strip-json-comments": "2.0.1", - "table": "3.8.3", - "text-table": "0.2.0", - "user-home": "2.0.0" + "babel-code-frame": "^6.16.0", + "chalk": "^1.1.3", + "concat-stream": "^1.5.2", + "debug": "^2.1.1", + "doctrine": "^2.0.0", + "escope": "^3.6.0", + "espree": "^3.4.0", + "esquery": "^1.0.0", + "estraverse": "^4.2.0", + "esutils": "^2.0.2", + "file-entry-cache": "^2.0.0", + "glob": "^7.0.3", + "globals": "^9.14.0", + "ignore": "^3.2.0", + "imurmurhash": "^0.1.4", + "inquirer": "^0.12.0", + "is-my-json-valid": "^2.10.0", + "is-resolvable": "^1.0.0", + "js-yaml": "^3.5.1", + "json-stable-stringify": "^1.0.0", + "levn": "^0.3.0", + "lodash": "^4.0.0", + "mkdirp": "^0.5.0", + "natural-compare": "^1.4.0", + "optionator": "^0.8.2", + "path-is-inside": "^1.0.1", + "pluralize": "^1.2.1", + "progress": "^1.1.8", + "require-uncached": "^1.0.2", + "shelljs": "^0.7.5", + "strip-bom": "^3.0.0", + "strip-json-comments": "~2.0.1", + "table": "^3.7.8", + "text-table": "~0.2.0", + "user-home": "^2.0.0" } }, "eslint-config-standard": { @@ -6993,11 +7672,11 @@ "integrity": "sha1-xUNb6wZ3ThLH2y9qut3L+QDNP3g=", "dev": true, "requires": { - "array.prototype.find": "2.0.4", - "doctrine": "1.5.0", - "has": "1.0.1", - "jsx-ast-utils": "1.4.1", - "object.assign": "4.0.4" + "array.prototype.find": "^2.0.1", + "doctrine": "^1.2.2", + "has": "^1.0.1", + "jsx-ast-utils": "^1.3.4", + "object.assign": "^4.0.4" }, "dependencies": { "doctrine": { @@ -7006,8 +7685,8 @@ "integrity": "sha1-N53Ocw9hZvds76TmcHoVmwLFpvo=", "dev": true, "requires": { - "esutils": "2.0.2", - "isarray": "1.0.0" + "esutils": "^2.0.2", + "isarray": "^1.0.0" } } } @@ -7036,10 +7715,10 @@ "integrity": "sha1-67d7nI/CyBZf+jU72Rug3/Qa9pA=", "dev": true, "requires": { - "deglob": "2.1.0", - "get-stdin": "5.0.1", - "minimist": "1.2.0", - "pkg-conf": "2.0.0" + "deglob": "^2.1.0", + "get-stdin": "^5.0.1", + "minimist": "^1.1.0", + "pkg-conf": "^2.0.0" } } } @@ -7050,12 +7729,12 @@ "integrity": "sha1-QAZgrlrM6K/U22D/IhSpGQrXkKM=", "dev": true, "requires": { - "deglob": "2.1.0", - "find-root": "1.1.0", - "get-stdin": "5.0.1", - "home-or-tmp": "2.0.0", - "minimist": "1.2.0", - "pkg-config": "1.1.1" + "deglob": "^2.0.0", + "find-root": "^1.0.0", + "get-stdin": "^5.0.1", + "home-or-tmp": "^2.0.0", + "minimist": "^1.1.0", + "pkg-config": "^1.0.1" }, "dependencies": { "minimist": { @@ -7066,23 +7745,24 @@ } } }, - "string_decoder": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz", - "integrity": "sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ==", - "requires": { - "safe-buffer": "5.1.1" - } - }, "string-width": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", "dev": true, "requires": { - "code-point-at": "1.1.0", - "is-fullwidth-code-point": "1.0.0", - "strip-ansi": "3.0.1" + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + } + }, + "string_decoder": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz", + "integrity": "sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.0" } }, "strip-ansi": { @@ -7091,7 +7771,7 @@ "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", "dev": true, "requires": { - "ansi-regex": "2.1.1" + "ansi-regex": "^2.0.0" } }, "strip-bom": { @@ -7111,7 +7791,7 @@ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.1.2.tgz", "integrity": "sha1-cqJiiU2dQIuVbKBf83su2KbiotU=", "requires": { - "has-flag": "1.0.0" + "has-flag": "^1.0.0" } }, "table": { @@ -7120,12 +7800,12 @@ "integrity": "sha1-K7xULw/amGGnVdOUf+/Ys/UThV8=", "dev": true, "requires": { - "ajv": "4.11.8", - "ajv-keywords": "1.5.1", - "chalk": "1.1.3", - "lodash": "4.17.4", + "ajv": "^4.7.0", + "ajv-keywords": "^1.0.0", + "chalk": "^1.1.1", + "lodash": "^4.0.0", "slice-ansi": "0.0.4", - "string-width": "2.1.1" + "string-width": "^2.0.0" }, "dependencies": { "ansi-regex": { @@ -7146,8 +7826,8 @@ "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", "dev": true, "requires": { - "is-fullwidth-code-point": "2.0.0", - "strip-ansi": "4.0.0" + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^4.0.0" } }, "strip-ansi": { @@ -7156,7 +7836,7 @@ "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", "dev": true, "requires": { - "ansi-regex": "3.0.0" + "ansi-regex": "^3.0.0" } } } @@ -7214,7 +7894,7 @@ "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", "dev": true, "requires": { - "prelude-ls": "1.1.2" + "prelude-ls": "~1.1.2" } }, "type-detect": { @@ -7269,14 +7949,14 @@ "integrity": "sha1-j5LFFUgr1oMbfJMBPnD4dVLHz1o=", "dev": true, "requires": { - "boxen": "0.6.0", - "chalk": "1.1.3", - "configstore": "2.1.0", - "is-npm": "1.0.0", - "latest-version": "2.0.0", - "lazy-req": "1.1.0", - "semver-diff": "2.1.0", - "xdg-basedir": "2.0.0" + "boxen": "^0.6.0", + "chalk": "^1.0.0", + "configstore": "^2.0.0", + "is-npm": "^1.0.0", + "latest-version": "^2.0.0", + "lazy-req": "^1.1.0", + "semver-diff": "^2.0.0", + "xdg-basedir": "^2.0.0" } }, "url-parse-lax": { @@ -7285,7 +7965,7 @@ "integrity": "sha1-evjzA2Rem9eaJy56FKxovAYJ2nM=", "dev": true, "requires": { - "prepend-http": "1.0.4" + "prepend-http": "^1.0.1" } }, "user-home": { @@ -7294,13 +7974,14 @@ "integrity": "sha1-nHC/2Babwdy/SGBODwS4tJzenp8=", "dev": true, "requires": { - "os-homedir": "1.0.2" + "os-homedir": "^1.0.0" } }, "util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", + "dev": true }, "uuid": { "version": "2.0.3", @@ -7314,7 +7995,7 @@ "integrity": "sha1-DAnIXCqUaD0Nfq+O4JfVZL8OEFw=", "dev": true, "requires": { - "string-width": "1.0.2" + "string-width": "^1.0.1" } }, "wordwrap": { @@ -7334,7 +8015,7 @@ "integrity": "sha1-X8A4KOJkzqP+kUVUdvejxWbLB1c=", "dev": true, "requires": { - "mkdirp": "0.5.1" + "mkdirp": "^0.5.1" } }, "write-file-atomic": { @@ -7343,9 +8024,9 @@ "integrity": "sha1-+Aek8LHZ6ROuekgRLmzDrxmRtF8=", "dev": true, "requires": { - "graceful-fs": "4.1.11", - "imurmurhash": "0.1.4", - "slide": "1.1.6" + "graceful-fs": "^4.1.11", + "imurmurhash": "^0.1.4", + "slide": "^1.1.5" } }, "xdg-basedir": { @@ -7354,7 +8035,7 @@ "integrity": "sha1-7byQPMOF/ARSPZZqM1UEtVBNG9I=", "dev": true, "requires": { - "os-homedir": "1.0.2" + "os-homedir": "^1.0.0" } }, "xmlcreate": { diff --git a/package.json b/package.json index f7dd9b6..df1b51f 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "js-data-mongodb", "description": "MongoDB adapter for js-data.", - "version": "1.0.2", + "version": "2.0.0", "homepage": "https://github.com/js-data/js-data-mongodb", "repository": { "type": "git", @@ -52,16 +52,14 @@ "release": "npm test && npm run doc && repo-tools changelog && repo-tools authors" }, "dependencies": { - "bson": ">=0.3.x", - "js-data": ">=3.0.0", + "bson": "^3.0.2", "js-data-adapter": "1.0.0", - "lodash.snakecase": "4.1.1", - "mongodb": ">=1.3.x" + "lodash.snakecase": "4.1.1" }, "peerDependencies": { - "bson": ">=0.3.x", + "bson": ">=3", "js-data": ">=3.0.0", - "mongodb": ">=1.3.x" + "mongodb": ">=3.0.0" }, "devDependencies": { "babel-core": "6.26.0", @@ -74,8 +72,10 @@ "chai": "4.1.1", "ink-docstrap": "git+https://github.com/js-data/docstrap.git#cfbe45fa313e1628c493076d5e15d2b855dfbf2c", "js-data-repo-tools": "1.0.0", - "jsdoc": "3.5.4", + "jsdoc": "^3.5.5", "mocha": "3.5.0", + "mongodb": "^3.1.6", + "js-data": "^3.0.3", "nyc": "11.1.0", "rollup": "0.47.6", "rollup-plugin-babel": "3.0.2", diff --git a/src/index.js b/src/index.js index 237c7de..d171f75 100644 --- a/src/index.js +++ b/src/index.js @@ -42,12 +42,12 @@ const DEFAULTS = { * @default { ignoreUndefined: true } */ mongoDriverOpts: { - ignoreUndefined: true + ignoreUndefined: true, + useNewUrlParser: true // https://thanhphu.net/2018/05/23/about-mongos-usenewurlparser-warning/ } } const COUNT_OPTS_DEFAULTS = {} -const FIND_OPTS_DEFAULTS = {} const FIND_ONE_OPTS_DEFAULTS = {} const INSERT_OPTS_DEFAULTS = {} const INSERT_MANY_OPTS_DEFAULTS = {} @@ -135,16 +135,6 @@ export function MongoDBAdapter (opts) { this.countOpts || (this.countOpts = {}) utils.fillIn(this.countOpts, COUNT_OPTS_DEFAULTS) - /** - * Default options to pass to collection#find. - * - * @name MongoDBAdapter#findOpts - * @type {object} - * @default {} - */ - this.findOpts || (this.findOpts = {}) - utils.fillIn(this.findOpts, FIND_OPTS_DEFAULTS) - /** * Default options to pass to collection#findOne. * @@ -196,12 +186,12 @@ export function MongoDBAdapter (opts) { utils.fillIn(this.removeOpts, REMOVE_OPTS_DEFAULTS) this.client = new utils.Promise((resolve, reject) => { - MongoClient.connect(opts.uri, opts.mongoDriverOpts, (err, db) => { + MongoClient.connect(opts.uri, opts.mongoDriverOpts, (err, client) => { if (err) { return reject(err) } - this._db = db - resolve(db) + this._db = client.db() + resolve(this._db) }) }) } @@ -293,7 +283,7 @@ Adapter.extend({ client .collection(collectionId) - .count(mongoQuery, countOpts, (err, count) => err ? failure(err) : success([count, {}])) + .countDocuments(mongoQuery, countOpts, (err, count) => err ? failure(err) : success([count, {}])) }) }, @@ -531,15 +521,13 @@ Adapter.extend({ return this._run((client, success, failure) => { const collectionId = this._getCollectionId(mapper, opts) - const findOneOpts = this.getOpt('findOneOpts', opts) - findOneOpts.fields = this._getFields(mapper, opts) const mongoQuery = { [mapper.idAttribute]: this.toObjectID(mapper, id) } client.collection(collectionId) - .findOne(mongoQuery, findOneOpts, (err, record) => err ? failure(err) : success(record)) + .findOne(mongoQuery, (err, record) => err ? failure(err) : success(record)) }).then((record) => { if (record) { this._translateObjectIDs(record, opts) @@ -582,14 +570,11 @@ Adapter.extend({ return this._run((client, success, failure) => { const collectionId = this._getCollectionId(mapper, opts) - const findOpts = this.getOpt('findOpts', opts) - utils.fillIn(findOpts, this.getQueryOptions(mapper, query)) - findOpts.fields = this._getFields(mapper, opts) const mongoQuery = this.getQuery(mapper, query) client.collection(collectionId) - .find(mongoQuery, findOpts) + .find(mongoQuery) .toArray((err, records) => err ? failure(err) : success(records)) }).then((records) => { this._translateObjectIDs(records, opts)