diff --git a/dist/js-data-mongodb.js b/dist/js-data-mongodb.js index 623a3a0..d1d7a30 100644 --- a/dist/js-data-mongodb.js +++ b/dist/js-data-mongodb.js @@ -77,8 +77,8 @@ var 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({ @@ -86,16 +86,16 @@ var 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 @@ -1041,8 +1041,8 @@ jsDataAdapter.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} @@ -1056,18 +1056,18 @@ jsDataAdapter.Adapter.extend({ * otherwise `false` if the current version is not beta. */ var version = { - full: '1.0.1', + full: '1.0.2', major: 1, minor: 0, - patch: 1 + patch: 2 }; /** * {@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 @@ -1078,71 +1078,71 @@ var 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) -* -* // 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 -*/ + * 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 + */ exports.MongoDBAdapter = MongoDBAdapter; exports.version = version; diff --git a/dist/js-data-mongodb.js.map b/dist/js-data-mongodb.js.map index c38b54b..badd373 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 {\n Adapter,\n reserved\n} from 'js-data-adapter'\nimport snakeCase from 'lodash.snakecase'\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 * Convert fields of record from database that are ObjectIDs to strings\n *\n * @name MongoDBAdapter#translateObjectIDs\n * @type {Boolean}\n * @default false\n */\n translateObjectIDs: false,\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 /**\n * MongoDB Driver options\n *\n * @name MongoDBAdapter#mongoDriverOpts\n * @type {object}\n * @default { ignoreUndefined: true }\n */\n mongoDriverOpts: {\n ignoreUndefined: true\n }\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 {boolean} [opts.translateObjectIDs=false] See {@link MongoDBAdapter#translateObjectIDs}.\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 utils.classCallCheck(this, MongoDBAdapter)\n opts || (opts = {})\n if (utils.isString(opts)) {\n opts = { uri: opts }\n }\n utils.fillIn(opts, DEFAULTS)\n\n // Setup non-enumerable properties\n Object.defineProperties(this, {\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 {Promise}\n */\n client: {\n writable: true,\n value: undefined\n },\n\n _db: {\n writable: true,\n value: undefined\n }\n })\n\n Adapter.call(this, opts)\n\n /**\n * Default options to pass to collection#count.\n *\n * @name MongoDBAdapter#countOpts\n * @type {object}\n * @default {}\n */\n this.countOpts || (this.countOpts = {})\n utils.fillIn(this.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 this.findOpts || (this.findOpts = {})\n utils.fillIn(this.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 this.findOneOpts || (this.findOneOpts = {})\n utils.fillIn(this.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 this.insertOpts || (this.insertOpts = {})\n utils.fillIn(this.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 this.insertManyOpts || (this.insertManyOpts = {})\n utils.fillIn(this.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 this.updateOpts || (this.updateOpts = {})\n utils.fillIn(this.updateOpts, UPDATE_OPTS_DEFAULTS)\n\n /**\n * Default options to pass to collection#destroy.\n *\n * @name MongoDBAdapter#removeOpts\n * @type {object}\n * @default {}\n */\n this.removeOpts || (this.removeOpts = {})\n utils.fillIn(this.removeOpts, REMOVE_OPTS_DEFAULTS)\n\n this.client = new utils.Promise((resolve, reject) => {\n MongoClient.connect(opts.uri, opts.mongoDriverOpts, (err, db) => {\n if (err) {\n return reject(err)\n }\n this._db = db\n resolve(db)\n })\n })\n}\n\nAdapter.extend({\n constructor: MongoDBAdapter,\n\n _translateObjectIDs (r, opts) {\n opts || (opts = {})\n if (this.getOpt('translateObjectIDs', opts)) {\n this._translateFieldObjectIDs(r)\n } else if (this.getOpt('translateId', opts)) {\n this._translateId(r)\n }\n return r\n },\n\n /**\n * Translate ObjectIDs to strings.\n *\n * @method MongoDBAdapter#_translateId\n * @return {*}\n */\n _translateId (r) {\n if (utils.isArray(r)) {\n r.forEach((_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 return r\n },\n\n _translateFieldObjectIDs (r) {\n const _checkFields = (r) => {\n for (let field in r) {\n if (r[field]._bsontype === 'ObjectID') {\n r[field] = typeof r[field].toString() === 'string' ? r[field].toString() : r[field]\n }\n }\n }\n if (utils.isArray(r)) {\n r.forEach((_r) => {\n _checkFields(_r)\n })\n } else if (utils.isObject(r)) {\n _checkFields(r)\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 opts || (opts = {})\n\n return this._run((client, success, failure) => {\n const collectionId = this._getCollectionId(mapper, opts)\n const countOpts = this.getOpt('countOpts', opts)\n utils.fillIn(countOpts, this.getQueryOptions(mapper, query))\n\n const mongoQuery = this.getQuery(mapper, query)\n\n client\n .collection(collectionId)\n .count(mongoQuery, countOpts, (err, count) => err ? failure(err) : success([count, {}]))\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 props || (props = {})\n opts || (opts = {})\n\n return this._run((client, success, failure) => {\n const collectionId = this._getCollectionId(mapper, opts)\n const insertOpts = this.getOpt('insertOpts', opts)\n\n const collection = client.collection(collectionId)\n const handler = (err, cursor) => err ? failure(err) : success(cursor)\n\n props = utils.plainCopy(props)\n\n if (collection.insertOne) {\n collection\n .insertOne(props, insertOpts, handler)\n } else {\n collection\n .insert(props, insertOpts, handler)\n }\n }).then((cursor) => {\n let record\n let r = cursor.ops ? cursor.ops : cursor\n this._translateObjectIDs(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 props || (props = {})\n opts || (opts = {})\n\n return this._run((client, success, failure) => {\n const collectionId = this._getCollectionId(mapper, opts)\n const insertManyOpts = this.getOpt('insertManyOpts', opts)\n props = utils.plainCopy(props)\n\n client.collection(collectionId)\n .insertMany(props, insertManyOpts, (err, cursor) => err ? failure(err) : success(cursor))\n }).then((cursor) => {\n let records = []\n let r = cursor.ops ? cursor.ops : cursor\n this._translateObjectIDs(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 opts || (opts = {})\n\n return this._run((client, success, failure) => {\n const collectionId = this._getCollectionId(mapper, opts)\n const removeOpts = this.getOpt('removeOpts', opts)\n\n const mongoQuery = {\n [mapper.idAttribute]: this.toObjectID(mapper, id)\n }\n const collection = client.collection(collectionId)\n const handler = (err, cursor) => err ? failure(err) : success(cursor)\n\n if (collection.deleteOne) {\n collection\n .deleteOne(mongoQuery, removeOpts, handler)\n } else {\n collection\n .remove(mongoQuery, removeOpts, handler)\n }\n }).then((cursor) => [undefined, cursor])\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 query || (query = {})\n opts || (opts = {})\n\n return this._run((client, success, failure) => {\n const collectionId = this._getCollectionId(mapper, opts)\n const removeOpts = this.getOpt('removeOpts', opts)\n utils.fillIn(removeOpts, this.getQueryOptions(mapper, query))\n\n const mongoQuery = this.getQuery(mapper, query)\n const collection = client.collection(collectionId)\n const handler = (err, cursor) => err ? failure(err) : success(cursor)\n\n if (collection.deleteMany) {\n collection\n .deleteMany(mongoQuery, removeOpts, handler)\n } else {\n collection\n .remove(mongoQuery, removeOpts, handler)\n }\n }).then((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 {string|string[]|object} [opts.fields] Select a subset of fields to be returned.\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 * @param {string|string[]|object} [opts.fields] Select a subset of fields to be returned.\n * @return {Promise}\n */\n _find (mapper, id, opts) {\n opts || (opts = {})\n opts.with || (opts.with = [])\n\n return this._run((client, success, failure) => {\n const collectionId = this._getCollectionId(mapper, opts)\n const findOneOpts = this.getOpt('findOneOpts', opts)\n findOneOpts.fields = this._getFields(mapper, opts)\n\n const mongoQuery = {\n [mapper.idAttribute]: this.toObjectID(mapper, id)\n }\n\n client.collection(collectionId)\n .findOne(mongoQuery, findOneOpts, (err, record) => err ? failure(err) : success(record))\n }).then((record) => {\n if (record) {\n this._translateObjectIDs(record, opts)\n } else {\n record = undefined\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 {string|string[]|object} [opts.fields] Select a subset of fields to be returned.\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 * @param {string|string[]|object} [opts.fields] Select a subset of fields to be returned.\n * @return {Promise}\n */\n _findAll (mapper, query, opts) {\n opts || (opts = {})\n\n return this._run((client, success, failure) => {\n const collectionId = this._getCollectionId(mapper, opts)\n const findOpts = this.getOpt('findOpts', opts)\n utils.fillIn(findOpts, this.getQueryOptions(mapper, query))\n findOpts.fields = this._getFields(mapper, opts)\n\n const mongoQuery = this.getQuery(mapper, query)\n\n client.collection(collectionId)\n .find(mongoQuery, findOpts)\n .toArray((err, records) => err ? failure(err) : success(records))\n }).then((records) => {\n this._translateObjectIDs(records, opts)\n return [records, {}]\n })\n },\n\n _getCollectionId (mapper, opts) {\n opts || (opts = {})\n return opts.table || opts.collection || mapper.table || mapper.collection || snakeCase(mapper.name)\n },\n\n _getFields (mapper, opts) {\n opts || (opts = {})\n if (utils.isString(opts.fields)) {\n opts.fields = { [opts.fields]: 1 }\n } else if (utils.isArray(opts.fields)) {\n const fields = {}\n opts.fields.forEach((field) => {\n fields[field] = 1\n })\n return fields\n }\n return opts.fields\n },\n\n _run (cb) {\n if (this._db) {\n // Use the cached db object\n return new utils.Promise((resolve, reject) => {\n cb(this._db, resolve, reject)\n })\n }\n return this.getClient().then((client) => {\n return new utils.Promise((resolve, reject) => {\n cb(client, resolve, reject)\n })\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 props || (props = {})\n opts || (opts = {})\n\n return this._find(mapper, id, { raw: false })\n .then((result) => {\n if (!result[0]) {\n throw new Error('Not Found')\n }\n return this._run((client, success, failure) => {\n const collectionId = this._getCollectionId(mapper, opts)\n const updateOpts = this.getOpt('updateOpts', opts)\n\n const mongoQuery = {\n [mapper.idAttribute]: this.toObjectID(mapper, id)\n }\n const collection = client.collection(collectionId)\n const handler = (err, cursor) => err ? failure(err) : success(cursor)\n\n if (collection.updateOne) {\n collection\n .updateOne(mongoQuery, { $set: props }, updateOpts, handler)\n } else {\n collection\n .update(mongoQuery, { $set: props }, updateOpts, handler)\n }\n })\n })\n .then((cursor) => {\n return this._find(mapper, id, { raw: false })\n .then((result) => {\n cursor.connection = undefined\n return [result[0], 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 props || (props = {})\n query || (query = {})\n opts || (opts = {})\n let ids\n\n return this._run((client, success, failure) => {\n return this._findAll(mapper, query, { raw: false }).then((result) => {\n const collectionId = this._getCollectionId(mapper, opts)\n const updateOpts = this.getOpt('updateOpts', opts)\n updateOpts.multi = true\n\n const queryOptions = this.getQueryOptions(mapper, query)\n queryOptions.$set = props\n ids = result[0].map((record) => this.toObjectID(mapper, record[mapper.idAttribute]))\n\n const mongoQuery = this.getQuery(mapper, query)\n const collection = client.collection(collectionId)\n const handler = (err, cursor) => err ? failure(err) : success(cursor)\n\n if (collection.updateMany) {\n collection\n .updateMany(mongoQuery, queryOptions, updateOpts, handler)\n } else {\n collection\n .update(mongoQuery, queryOptions, updateOpts, handler)\n }\n })\n }).then((cursor) => {\n const query = {\n [mapper.idAttribute]: {\n 'in': ids\n }\n }\n return this._findAll(mapper, query, { raw: false }).then((result) => {\n cursor.connection = undefined\n return [result[0], 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 relatedMapper = def.getRelation()\n const localKeys = Adapter.prototype.makeHasManyLocalKeys.call(this, mapper, def, record)\n return localKeys.map((key) => this.toObjectID(relatedMapper, key))\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 * @example\n * import {version} from 'js-data-mongodb'\n * console.log(version.full)\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\n/**\n * {@link MongoDBAdapter} class.\n *\n * @example\n * import {MongoDBAdapter} from 'js-data-mongodb'\n * const adapter = new MongoDBAdapter()\n *\n * @name module:js-data-mongodb.MongoDBAdapter\n * @see MongoDBAdapter\n * @type {Constructor}\n */\n\n/**\n * Registered as `js-data-mongodb` in NPM.\n *\n * @example Install from NPM\n * npm i --save js-data-mongodb@rc js-data@rc mongodb bson\n *\n * @example Load via CommonJS\n * var MongoDBAdapter = require('js-data-mongodb').MongoDBAdapter\n * var adapter = new MongoDBAdapter()\n *\n * @example Load via ES2015 Modules\n * import {MongoDBAdapter} from 'js-data-mongodb'\n * const adapter = new MongoDBAdapter()\n *\n * @module js-data-mongodb\n */\n\n /**\n * Create a subclass of this MongoDBAdapter:\n * @example MongoDBAdapter.extend\n * // Normally you would do: import { MongoDBAdapter } from 'js-data-mongodb'\n * const JSDataMongoDB = require('js-data-mongodb')\n * const { MongoDBAdapter } = JSDataMongoDB\n * console.log('Using JSDataMongoDB v' + JSDataMongoDB.version.full)\n *\n * // Extend the class using ES2015 class syntax.\n * class CustomMongoDBAdapterClass extends MongoDBAdapter {\n * foo () { return 'bar' }\n * static beep () { return 'boop' }\n * }\n * const customMongoDBAdapter = new CustomMongoDBAdapterClass()\n * console.log(customMongoDBAdapter.foo())\n * console.log(CustomMongoDBAdapterClass.beep())\n *\n * // Extend the class using alternate method.\n * const OtherMongoDBAdapterClass = MongoDBAdapter.extend({\n * foo () { return 'bar' }\n * }, {\n * beep () { return 'boop' }\n * })\n * const otherMongoDBAdapter = new OtherMongoDBAdapterClass()\n * console.log(otherMongoDBAdapter.foo())\n * console.log(OtherMongoDBAdapterClass.beep())\n *\n * // Extend the class, providing a custom constructor.\n * function AnotherMongoDBAdapterClass () {\n * MongoDBAdapter.call(this)\n * this.created_at = new Date().getTime()\n * }\n * MongoDBAdapter.extend({\n * constructor: AnotherMongoDBAdapterClass,\n * foo () { return 'bar' }\n * }, {\n * beep () { return 'boop' }\n * })\n * const anotherMongoDBAdapter = new AnotherMongoDBAdapterClass()\n * console.log(anotherMongoDBAdapter.created_at)\n * console.log(anotherMongoDBAdapter.foo())\n * console.log(AnotherMongoDBAdapterClass.beep())\n *\n * @method MongoDBAdapter.extend\n * @param {object} [props={}] Properties to add to the prototype of the\n * subclass.\n * @param {object} [props.constructor] Provide a custom constructor function\n * to be used as the subclass itself.\n * @param {object} [classProps={}] Static properties to add to the subclass.\n * @returns {Constructor} Subclass of this MongoDBAdapter class.\n * @since 3.0.0\n */\n"],"names":["DEFAULTS","COUNT_OPTS_DEFAULTS","FIND_OPTS_DEFAULTS","FIND_ONE_OPTS_DEFAULTS","INSERT_OPTS_DEFAULTS","INSERT_MANY_OPTS_DEFAULTS","UPDATE_OPTS_DEFAULTS","REMOVE_OPTS_DEFAULTS","MongoDBAdapter","opts","classCallCheck","utils","isString","uri","fillIn","defineProperties","undefined","call","countOpts","findOpts","findOneOpts","insertOpts","insertManyOpts","updateOpts","removeOpts","client","Promise","resolve","reject","connect","mongoDriverOpts","err","db","_db","Adapter","extend","r","getOpt","_translateFieldObjectIDs","_translateId","isArray","forEach","_r","__id","_id","toString","isObject","_checkFields","field","_bsontype","mapper","query","_run","success","failure","collectionId","_getCollectionId","getQueryOptions","mongoQuery","getQuery","collection","count","props","handler","cursor","plainCopy","insertOne","insert","then","record","ops","_translateObjectIDs","connection","insertMany","records","id","idAttribute","toObjectID","deleteOne","remove","deleteMany","with","fields","_getFields","findOne","find","toArray","table","snakeCase","name","cb","getClient","_find","raw","result","Error","updateOne","$set","update","ids","_findAll","multi","queryOptions","map","updateMany","where","forOwn","config","keyword","reserved","indexOf","Object","keys","length","criteria","v","op","$ne","$gt","$gte","$lt","$lte","$in","$nin","$or","orEqQuery","push","orNeQuery","orGtQuery","orGteQuery","orLtQuery","orLteQuery","orInQuery","orNinQuery","orderBy","sort","skip","offset","i","limit","ObjectID","isValid","def","getRelation","prototype","makeBelongsToForeignKey","relatedMapper","localKeys","makeHasManyLocalKeys","key","version"],"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 snakeCase from 'lodash.snakecase'\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 * Convert fields of record from database that are ObjectIDs to strings\n *\n * @name MongoDBAdapter#translateObjectIDs\n * @type {Boolean}\n * @default false\n */\n translateObjectIDs: false,\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 /**\n * MongoDB Driver options\n *\n * @name MongoDBAdapter#mongoDriverOpts\n * @type {object}\n * @default { ignoreUndefined: true }\n */\n mongoDriverOpts: {\n ignoreUndefined: true\n }\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 {boolean} [opts.translateObjectIDs=false] See {@link MongoDBAdapter#translateObjectIDs}.\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 utils.classCallCheck(this, MongoDBAdapter)\n opts || (opts = {})\n if (utils.isString(opts)) {\n opts = { uri: opts }\n }\n utils.fillIn(opts, DEFAULTS)\n\n // Setup non-enumerable properties\n Object.defineProperties(this, {\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 {Promise}\n */\n client: {\n writable: true,\n value: undefined\n },\n\n _db: {\n writable: true,\n value: undefined\n }\n })\n\n Adapter.call(this, opts)\n\n /**\n * Default options to pass to collection#count.\n *\n * @name MongoDBAdapter#countOpts\n * @type {object}\n * @default {}\n */\n this.countOpts || (this.countOpts = {})\n utils.fillIn(this.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 this.findOpts || (this.findOpts = {})\n utils.fillIn(this.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 this.findOneOpts || (this.findOneOpts = {})\n utils.fillIn(this.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 this.insertOpts || (this.insertOpts = {})\n utils.fillIn(this.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 this.insertManyOpts || (this.insertManyOpts = {})\n utils.fillIn(this.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 this.updateOpts || (this.updateOpts = {})\n utils.fillIn(this.updateOpts, UPDATE_OPTS_DEFAULTS)\n\n /**\n * Default options to pass to collection#destroy.\n *\n * @name MongoDBAdapter#removeOpts\n * @type {object}\n * @default {}\n */\n this.removeOpts || (this.removeOpts = {})\n utils.fillIn(this.removeOpts, REMOVE_OPTS_DEFAULTS)\n\n this.client = new utils.Promise((resolve, reject) => {\n MongoClient.connect(opts.uri, opts.mongoDriverOpts, (err, db) => {\n if (err) {\n return reject(err)\n }\n this._db = db\n resolve(db)\n })\n })\n}\n\nAdapter.extend({\n constructor: MongoDBAdapter,\n\n _translateObjectIDs (r, opts) {\n opts || (opts = {})\n if (this.getOpt('translateObjectIDs', opts)) {\n this._translateFieldObjectIDs(r)\n } else if (this.getOpt('translateId', opts)) {\n this._translateId(r)\n }\n return r\n },\n\n /**\n * Translate ObjectIDs to strings.\n *\n * @method MongoDBAdapter#_translateId\n * @return {*}\n */\n _translateId (r) {\n if (utils.isArray(r)) {\n r.forEach((_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 return r\n },\n\n _translateFieldObjectIDs (r) {\n const _checkFields = (r) => {\n for (let field in r) {\n if (r[field]._bsontype === 'ObjectID') {\n r[field] = typeof r[field].toString() === 'string' ? r[field].toString() : r[field]\n }\n }\n }\n if (utils.isArray(r)) {\n r.forEach((_r) => {\n _checkFields(_r)\n })\n } else if (utils.isObject(r)) {\n _checkFields(r)\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 opts || (opts = {})\n\n return this._run((client, success, failure) => {\n const collectionId = this._getCollectionId(mapper, opts)\n const countOpts = this.getOpt('countOpts', opts)\n utils.fillIn(countOpts, this.getQueryOptions(mapper, query))\n\n const mongoQuery = this.getQuery(mapper, query)\n\n client\n .collection(collectionId)\n .count(mongoQuery, countOpts, (err, count) => err ? failure(err) : success([count, {}]))\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 props || (props = {})\n opts || (opts = {})\n\n return this._run((client, success, failure) => {\n const collectionId = this._getCollectionId(mapper, opts)\n const insertOpts = this.getOpt('insertOpts', opts)\n\n const collection = client.collection(collectionId)\n const handler = (err, cursor) => err ? failure(err) : success(cursor)\n\n props = utils.plainCopy(props)\n\n if (collection.insertOne) {\n collection\n .insertOne(props, insertOpts, handler)\n } else {\n collection\n .insert(props, insertOpts, handler)\n }\n }).then((cursor) => {\n let record\n let r = cursor.ops ? cursor.ops : cursor\n this._translateObjectIDs(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 props || (props = {})\n opts || (opts = {})\n\n return this._run((client, success, failure) => {\n const collectionId = this._getCollectionId(mapper, opts)\n const insertManyOpts = this.getOpt('insertManyOpts', opts)\n props = utils.plainCopy(props)\n\n client.collection(collectionId)\n .insertMany(props, insertManyOpts, (err, cursor) => err ? failure(err) : success(cursor))\n }).then((cursor) => {\n let records = []\n let r = cursor.ops ? cursor.ops : cursor\n this._translateObjectIDs(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 opts || (opts = {})\n\n return this._run((client, success, failure) => {\n const collectionId = this._getCollectionId(mapper, opts)\n const removeOpts = this.getOpt('removeOpts', opts)\n\n const mongoQuery = {\n [mapper.idAttribute]: this.toObjectID(mapper, id)\n }\n const collection = client.collection(collectionId)\n const handler = (err, cursor) => err ? failure(err) : success(cursor)\n\n if (collection.deleteOne) {\n collection\n .deleteOne(mongoQuery, removeOpts, handler)\n } else {\n collection\n .remove(mongoQuery, removeOpts, handler)\n }\n }).then((cursor) => [undefined, cursor])\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 query || (query = {})\n opts || (opts = {})\n\n return this._run((client, success, failure) => {\n const collectionId = this._getCollectionId(mapper, opts)\n const removeOpts = this.getOpt('removeOpts', opts)\n utils.fillIn(removeOpts, this.getQueryOptions(mapper, query))\n\n const mongoQuery = this.getQuery(mapper, query)\n const collection = client.collection(collectionId)\n const handler = (err, cursor) => err ? failure(err) : success(cursor)\n\n if (collection.deleteMany) {\n collection\n .deleteMany(mongoQuery, removeOpts, handler)\n } else {\n collection\n .remove(mongoQuery, removeOpts, handler)\n }\n }).then((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 {string|string[]|object} [opts.fields] Select a subset of fields to be returned.\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 * @param {string|string[]|object} [opts.fields] Select a subset of fields to be returned.\n * @return {Promise}\n */\n _find (mapper, id, opts) {\n opts || (opts = {})\n opts.with || (opts.with = [])\n\n return this._run((client, success, failure) => {\n const collectionId = this._getCollectionId(mapper, opts)\n const findOneOpts = this.getOpt('findOneOpts', opts)\n findOneOpts.fields = this._getFields(mapper, opts)\n\n const mongoQuery = {\n [mapper.idAttribute]: this.toObjectID(mapper, id)\n }\n\n client.collection(collectionId)\n .findOne(mongoQuery, findOneOpts, (err, record) => err ? failure(err) : success(record))\n }).then((record) => {\n if (record) {\n this._translateObjectIDs(record, opts)\n } else {\n record = undefined\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 {string|string[]|object} [opts.fields] Select a subset of fields to be returned.\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 * @param {string|string[]|object} [opts.fields] Select a subset of fields to be returned.\n * @return {Promise}\n */\n _findAll (mapper, query, opts) {\n opts || (opts = {})\n\n return this._run((client, success, failure) => {\n const collectionId = this._getCollectionId(mapper, opts)\n const findOpts = this.getOpt('findOpts', opts)\n utils.fillIn(findOpts, this.getQueryOptions(mapper, query))\n findOpts.fields = this._getFields(mapper, opts)\n\n const mongoQuery = this.getQuery(mapper, query)\n\n client.collection(collectionId)\n .find(mongoQuery, findOpts)\n .toArray((err, records) => err ? failure(err) : success(records))\n }).then((records) => {\n this._translateObjectIDs(records, opts)\n return [records, {}]\n })\n },\n\n _getCollectionId (mapper, opts) {\n opts || (opts = {})\n return opts.table || opts.collection || mapper.table || mapper.collection || snakeCase(mapper.name)\n },\n\n _getFields (mapper, opts) {\n opts || (opts = {})\n if (utils.isString(opts.fields)) {\n opts.fields = { [opts.fields]: 1 }\n } else if (utils.isArray(opts.fields)) {\n const fields = {}\n opts.fields.forEach((field) => {\n fields[field] = 1\n })\n return fields\n }\n return opts.fields\n },\n\n _run (cb) {\n if (this._db) {\n // Use the cached db object\n return new utils.Promise((resolve, reject) => {\n cb(this._db, resolve, reject)\n })\n }\n return this.getClient().then((client) => {\n return new utils.Promise((resolve, reject) => {\n cb(client, resolve, reject)\n })\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 props || (props = {})\n opts || (opts = {})\n\n return this._find(mapper, id, { raw: false })\n .then((result) => {\n if (!result[0]) {\n throw new Error('Not Found')\n }\n return this._run((client, success, failure) => {\n const collectionId = this._getCollectionId(mapper, opts)\n const updateOpts = this.getOpt('updateOpts', opts)\n\n const mongoQuery = {\n [mapper.idAttribute]: this.toObjectID(mapper, id)\n }\n const collection = client.collection(collectionId)\n const handler = (err, cursor) => err ? failure(err) : success(cursor)\n\n if (collection.updateOne) {\n collection\n .updateOne(mongoQuery, { $set: props }, updateOpts, handler)\n } else {\n collection\n .update(mongoQuery, { $set: props }, updateOpts, handler)\n }\n })\n })\n .then((cursor) => {\n return this._find(mapper, id, { raw: false })\n .then((result) => {\n cursor.connection = undefined\n return [result[0], 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 props || (props = {})\n query || (query = {})\n opts || (opts = {})\n let ids\n\n return this._run((client, success, failure) => {\n return this._findAll(mapper, query, { raw: false }).then((result) => {\n const collectionId = this._getCollectionId(mapper, opts)\n const updateOpts = this.getOpt('updateOpts', opts)\n updateOpts.multi = true\n\n const queryOptions = this.getQueryOptions(mapper, query)\n queryOptions.$set = props\n ids = result[0].map((record) => this.toObjectID(mapper, record[mapper.idAttribute]))\n\n const mongoQuery = this.getQuery(mapper, query)\n const collection = client.collection(collectionId)\n const handler = (err, cursor) => err ? failure(err) : success(cursor)\n\n if (collection.updateMany) {\n collection\n .updateMany(mongoQuery, queryOptions, updateOpts, handler)\n } else {\n collection\n .update(mongoQuery, queryOptions, updateOpts, handler)\n }\n })\n }).then((cursor) => {\n const query = {\n [mapper.idAttribute]: {\n 'in': ids\n }\n }\n return this._findAll(mapper, query, { raw: false }).then((result) => {\n cursor.connection = undefined\n return [result[0], 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 relatedMapper = def.getRelation()\n const localKeys = Adapter.prototype.makeHasManyLocalKeys.call(this, mapper, def, record)\n return localKeys.map((key) => this.toObjectID(relatedMapper, key))\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 * @example\n * import { version } from 'js-data-mongodb';\n * console.log(version.full);\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\n/**\n * {@link MongoDBAdapter} class.\n *\n * @example\n * import { MongoDBAdapter } from 'js-data-mongodb';\n * const adapter = new MongoDBAdapter();\n *\n * @name module:js-data-mongodb.MongoDBAdapter\n * @see MongoDBAdapter\n * @type {Constructor}\n */\n\n/**\n * Registered as `js-data-mongodb` in NPM.\n *\n * @example Install from NPM\n * npm i --save js-data-mongodb js-data mongodb bson\n *\n * @example Load via CommonJS\n * const MongoDBAdapter = require('js-data-mongodb').MongoDBAdapter;\n * const adapter = new MongoDBAdapter();\n *\n * @example Load via ES2015 Modules\n * import { MongoDBAdapter } from 'js-data-mongodb';\n * const adapter = new MongoDBAdapter();\n *\n * @module js-data-mongodb\n */\n\n/**\n * Create a subclass of this MongoDBAdapter:\n * @example MongoDBAdapter.extend\n * // Normally you would do: import { MongoDBAdapter } from 'js-data-mongodb';\n * const JSDataMongoDB = require('js-data-mongodb');\n * const { MongoDBAdapter } = JSDataMongoDB;\n * console.log('Using JSDataMongoDB v' + JSDataMongoDB.version.full);\n *\n * // Extend the class using ES2015 class syntax.\n * class CustomMongoDBAdapterClass extends MongoDBAdapter {\n * foo () { return 'bar'; }\n * static beep () { return 'boop'; }\n * }\n * const customMongoDBAdapter = new CustomMongoDBAdapterClass();\n * console.log(customMongoDBAdapter.foo());\n * console.log(CustomMongoDBAdapterClass.beep());\n *\n * // Extend the class using alternate method.\n * const OtherMongoDBAdapterClass = MongoDBAdapter.extend({\n * foo () { return 'bar'; }\n * }, {\n * beep () { return 'boop'; }\n * });\n * const otherMongoDBAdapter = new OtherMongoDBAdapterClass();\n * console.log(otherMongoDBAdapter.foo());\n * console.log(OtherMongoDBAdapterClass.beep());\n *\n * // Extend the class, providing a custom constructor.\n * function AnotherMongoDBAdapterClass () {\n * MongoDBAdapter.call(this);\n * this.created_at = new Date().getTime();\n * }\n * MongoDBAdapter.extend({\n * constructor: AnotherMongoDBAdapterClass,\n * foo () { return 'bar'; }\n * }, {\n * beep () { return 'boop'; }\n * });\n * const anotherMongoDBAdapter = new AnotherMongoDBAdapterClass();\n * console.log(anotherMongoDBAdapter.created_at);\n * console.log(anotherMongoDBAdapter.foo());\n * console.log(AnotherMongoDBAdapterClass.beep());\n *\n * @method MongoDBAdapter.extend\n * @param {object} [props={}] Properties to add to the prototype of the\n * subclass.\n * @param {object} [props.constructor] Provide a custom constructor function\n * to be used as the subclass itself.\n * @param {object} [classProps={}] Static properties to add to the subclass.\n * @returns {Constructor} Subclass of this MongoDBAdapter class.\n * @since 3.0.0\n */\n"],"names":["DEFAULTS","COUNT_OPTS_DEFAULTS","FIND_OPTS_DEFAULTS","FIND_ONE_OPTS_DEFAULTS","INSERT_OPTS_DEFAULTS","INSERT_MANY_OPTS_DEFAULTS","UPDATE_OPTS_DEFAULTS","REMOVE_OPTS_DEFAULTS","MongoDBAdapter","opts","classCallCheck","utils","isString","uri","fillIn","defineProperties","undefined","call","countOpts","findOpts","findOneOpts","insertOpts","insertManyOpts","updateOpts","removeOpts","client","Promise","resolve","reject","connect","mongoDriverOpts","err","db","_db","Adapter","extend","r","getOpt","_translateFieldObjectIDs","_translateId","isArray","forEach","_r","__id","_id","toString","isObject","_checkFields","field","_bsontype","mapper","query","_run","success","failure","collectionId","_getCollectionId","getQueryOptions","mongoQuery","getQuery","collection","count","props","handler","cursor","plainCopy","insertOne","insert","then","record","ops","_translateObjectIDs","connection","insertMany","records","id","idAttribute","toObjectID","deleteOne","remove","deleteMany","with","fields","_getFields","findOne","find","toArray","table","snakeCase","name","cb","getClient","_find","raw","result","Error","updateOne","$set","update","ids","_findAll","multi","queryOptions","map","updateMany","where","forOwn","config","keyword","reserved","indexOf","Object","keys","length","criteria","v","op","$ne","$gt","$gte","$lt","$lte","$in","$nin","$or","orEqQuery","push","orNeQuery","orGtQuery","orGteQuery","orLtQuery","orLteQuery","orInQuery","orNinQuery","orderBy","sort","skip","offset","i","limit","ObjectID","isValid","def","getRelation","prototype","makeBelongsToForeignKey","relatedMapper","localKeys","makeHasManyLocalKeys","key","version"],"mappings":"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"} \ No newline at end of file