├── .gitignore ├── .travis.yml ├── CHANGELOG.md ├── LICENSE ├── README.md ├── lib ├── helpers.js └── index.js ├── package-lock.json ├── package.json └── test └── index.js /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules/ 2 | *.log 3 | -------------------------------------------------------------------------------- /.travis.yml: -------------------------------------------------------------------------------- 1 | sudo: false 2 | 3 | language: node_js 4 | 5 | services: 6 | - mongodb 7 | 8 | node_js: 9 | - "8" 10 | - "10" 11 | -------------------------------------------------------------------------------- /CHANGELOG.md: -------------------------------------------------------------------------------- 1 | # Changelog 2 | 3 | 4 | ##### 1.3.2 (2018-10-23) 5 | - Remove deprecation: prefer `countDocuments` instead of `count`. 6 | - Remove deprecation: add `useNewUrlParser = true` to connect. 7 | 8 | 9 | ##### 1.3.1 (2018-10-10) 10 | - Fix bug introduced when transactions are disabled. 11 | 12 | 13 | ##### 1.3.0 (2018-10-10) 14 | - Add support for transactions in MongoDB 4.0+. 15 | 16 | 17 | ##### 1.2.0 (2018-05-01) 18 | - Upgrade MongoDB driver from `2.x` to `3.x`. 19 | - Add logical operator support. 20 | 21 | 22 | ##### 1.1.6 (2017-07-05) 23 | - Fix: add `or` operator to `match` option. 24 | 25 | 26 | ##### 1.1.5 (2017-02-04) 27 | - Fix: check for empty replace object, and ignore it if empty. 28 | 29 | 30 | ##### 1.1.4 (2016-08-23) 31 | - Fix: check type constructor for custom types. 32 | - Polish: update dependencies. 33 | - Polish: fix lint issues. 34 | 35 | 36 | ##### 1.1.2 (2016-06-04) 37 | - Polish: update dependencies. 38 | 39 | 40 | ##### 1.1.1 (2016-01-26) 41 | - Remove Babel. 42 | - Implement `range` and `exists`. 43 | - Define `kerberos` as peer dependency. 44 | 45 | 46 | ##### 1.0.9 (2015-09-08) 47 | - Fix minor bug where array of buffers are shown when fields are specified. 48 | 49 | 50 | ##### 1.0.8 (2015-08-26) 51 | - Rename `typeMapping` to `typeMap`. 52 | 53 | 54 | ##### 1.0.7 (2015-08-23) 55 | - Fix `null` option bug. 56 | 57 | 58 | ##### 1.0.5 (2015-08-07) 59 | - Prevent document replacement in `update` method if no updates are applied. 60 | 61 | 62 | ##### 1.0.3 (2015-07-27) 63 | - Fix `generateId` option, add test for regression. 64 | 65 | 66 | ##### 1.0.2 (2015-07-25) 67 | - Added `typeMapping` option, for decoupling type name from collection name. 68 | 69 | 70 | ##### 1.0.1 (2015-07-08) 71 | - Do not save extraneous `id` field. 72 | 73 | 74 | ##### 1.0.0 (2015-06-29) 75 | - Fix delete no-op. 76 | - Fix create no-op. 77 | - Fix sort input. 78 | 79 | 80 | ##### 1.0.0-alpha.10 (2015-06-18) 81 | - Bump dependency versions. 82 | 83 | 84 | ##### 1.0.0-alpha.9 (2015-06-08) 85 | - Change default ID generation: 15 random bytes, base64 encoded string. 86 | - Allow ID generation to be custom function, `generateId` option. 87 | 88 | 89 | ##### 1.0.0-alpha.8 (2015-06-03) 90 | - Allow all connection options as specified by the MongoDB driver. 91 | - Rename `schemas` -> `recordTypes`. 92 | 93 | 94 | ##### 1.0.0-alpha.6 (2015-06-02) 95 | - Fix buffer output. 96 | - Generate URI-safe base64 strings instead of hex. 97 | 98 | 99 | ##### 1.0.0-alpha.5 (2015-06-01) 100 | - Do not enumerate denormalized fields. 101 | 102 | 103 | ##### 1.0.0-alpha.4 (2015-05-31) 104 | - Do not rely on ObjectID for ID generation, instead generate completely random bytes. 105 | 106 | 107 | ##### 1.0.0-alpha.1 (2015-05-30) 108 | - Initial release of rewrite. 109 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Copyright (c) 2017 Dali Zheng (http://daliwa.li) 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in 13 | all copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 21 | THE SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Fortune MongoDB Adapter 2 | 3 | [![Build Status](https://img.shields.io/travis/fortunejs/fortune-mongodb/master.svg?style=flat-square)](https://travis-ci.org/fortunejs/fortune-mongodb) 4 | [![npm Version](https://img.shields.io/npm/v/fortune-mongodb.svg?style=flat-square)](https://www.npmjs.com/package/fortune-mongodb) 5 | [![License](https://img.shields.io/npm/l/fortune-mongodb.svg?style=flat-square)](https://raw.githubusercontent.com/fortunejs/fortune-mongodb/master/LICENSE) 6 | 7 | This is a MongoDB adapter for [Fortune](http://fortune.js.org/). It uses the [official Node.js MongoDB driver](http://mongodb.github.io/node-mongodb-native/) internally. 8 | 9 | 10 | ## Usage 11 | 12 | Install the `fortune-mongodb` package from `npm`: 13 | 14 | ``` 15 | $ npm install fortune-mongodb 16 | ``` 17 | 18 | Then use it with Fortune: 19 | 20 | ```js 21 | const fortune = require('fortune') 22 | const mongodbAdapter = require('fortune-mongodb') 23 | 24 | const store = fortune({ ... }, { 25 | adapter: [ 26 | mongodbAdapter, 27 | { 28 | // options object, URL is mandatory. 29 | url: 'mongodb://localhost:27017/test' 30 | } 31 | ] 32 | }) 33 | ``` 34 | 35 | 36 | ## Options 37 | 38 | **Adapter options**: 39 | 40 | - `url`: MongoDB connection URL. Required. 41 | - `enableTransactions`: Use transactions for handling requests, this requires MongoDB to be using a replica set. Default: `false`. 42 | - `generateId`: Generate the `_id` key on a new document. It must be a function that accepts one argument, the record type, and returns a unique string or number. Optional. 43 | - `typeMap`: An object that maps type names (keys) to MongoDB collection names (values). For example, `{ user: 'users' }`. 44 | 45 | For driver options, see the [official documentation](http://mongodb.github.io/node-mongodb-native/) for details. 46 | 47 | In addition to the constructor options, there is also the `query` function in the `find` method, which accepts the query object as an argument, and may either mutate or return the query object. This allows for arbitrary queries. 48 | 49 | 50 | ## License 51 | 52 | This software is licensed under the [MIT License](//github.com/fortunejs/fortune-mongodb/blob/master/LICENSE). 53 | -------------------------------------------------------------------------------- /lib/helpers.js: -------------------------------------------------------------------------------- 1 | 'use strict' 2 | 3 | const crypto = require('crypto') 4 | 5 | const idKey = '_id' 6 | 7 | 8 | module.exports = { 9 | idKey, 10 | inputRecord, 11 | outputRecord, 12 | generateId, 13 | generateQuery, 14 | mapValues 15 | } 16 | 17 | 18 | // Cast and assign values per field definition. 19 | function inputRecord (type, record) { 20 | const clone = {} 21 | const recordTypes = this.recordTypes 22 | const primaryKey = this.keys.primary 23 | const isArrayKey = this.keys.isArray 24 | const generateId = this.options.generateId 25 | const fields = recordTypes[type] 26 | 27 | // ID business. 28 | const id = record[primaryKey] 29 | clone[idKey] = id ? id : generateId(type) 30 | 31 | for (const field in record) { 32 | if (field === primaryKey) continue 33 | clone[field] = record[field] 34 | } 35 | 36 | for (const field of Object.getOwnPropertyNames(fields)) 37 | if (!(field in record)) 38 | clone[field] = fields[field][isArrayKey] ? [] : null 39 | 40 | return clone 41 | } 42 | 43 | 44 | function outputRecord (type, record) { 45 | const clone = {} 46 | const recordTypes = this.recordTypes 47 | const primaryKey = this.keys.primary 48 | const isArrayKey = this.keys.isArray 49 | const typeKey = this.keys.type 50 | const denormalizedInverseKey = this.keys.denormalizedInverse 51 | const fields = recordTypes[type] 52 | 53 | // ID business. 54 | clone[primaryKey] = record[idKey] 55 | 56 | // Non-native types. 57 | for (const field of Object.getOwnPropertyNames(fields)) { 58 | const value = field in record ? record[field] : 59 | fields[field][isArrayKey] ? [] : null 60 | const fieldType = fields[field][typeKey] 61 | 62 | // Expose native Buffer. 63 | if (fieldType && 64 | (fieldType === Buffer || fieldType.prototype.constructor === Buffer) 65 | && field in record) { 66 | clone[field] = fields[field][isArrayKey] ? 67 | value.map(toBuffer) : value ? toBuffer(value) : null 68 | continue 69 | } 70 | 71 | // Do not enumerate denormalized fields. 72 | if (fields[field][denormalizedInverseKey]) { 73 | Object.defineProperty(clone, field, { 74 | configurable: true, writable: true, value 75 | }) 76 | continue 77 | } 78 | 79 | if (field in record) clone[field] = value 80 | } 81 | 82 | return clone 83 | } 84 | 85 | 86 | /** 87 | * Generate base64 string from 15 bytes of strong randomness (this is 2 less 88 | * bits of entropy than UUID version 4). It is ideal for the length of the 89 | * input to be divisible by 3, since base64 expands the binary input by 90 | * exactly 1 byte for every 3 bytes, and adds padding length of modulus 3. 91 | * 92 | * @return {String} 93 | */ 94 | function generateId () { 95 | return crypto.randomBytes(15).toString('base64') 96 | } 97 | 98 | 99 | /** 100 | * Create a new object with different key values. 101 | * 102 | * @param {Object} object 103 | * @param {Function} map should return the first argument, which is the value 104 | * @return {Object} 105 | */ 106 | function mapValues (object, map) { 107 | return Object.keys(object).reduce((clone, key) => 108 | Object.assign(clone, { [key]: map(object[key], key) }), {}) 109 | } 110 | 111 | 112 | // There is an inconsistency when accessing a record depending on the method, 113 | // it may be either a native `Buffer` or BSON object wrapper. We only want 114 | // native buffers. 115 | function toBuffer (object) { 116 | if (Buffer.isBuffer(object)) return object 117 | if (object.buffer) return object.buffer 118 | throw new TypeError('Could not output buffer type.') 119 | } 120 | 121 | function generateRangeQuery (fields, options) { 122 | const range = {} 123 | Object.keys(options).forEach(key => { 124 | if (!(key in fields)) return 125 | 126 | const value = options[key] 127 | 128 | if (fields[key].isArray) { 129 | if (value[0] != null) 130 | range[`${key}.${value[0] - 1}`] = { $exists: true } 131 | if (value[1] != null) 132 | range[`${key}.${value[1]}`] = { $exists: false } 133 | return 134 | } 135 | 136 | range[key] = { $ne: null } 137 | if (value[0] != null) range[key].$gte = value[0] 138 | if (value[1] != null) range[key].$lte = value[1] 139 | }) 140 | 141 | return range 142 | } 143 | 144 | // Wrap operator queries with the $not operator 145 | function applyNotOperator (clause) { 146 | return mapValues(clause, value => { 147 | return { $not: value } 148 | }) 149 | } 150 | 151 | // Generate a mongoDB query from a fortune query object 152 | function generateQuery (fields, options, not) { 153 | let $and = [] 154 | const $or = [] 155 | const result = {} 156 | 157 | for (const key in options) 158 | switch (key) { 159 | case 'and': 160 | case 'or': 161 | const query = {} 162 | query[`$${key}`] = mapValues(options[key], value => { 163 | return generateQuery(fields, value) 164 | }) 165 | return query 166 | case 'not': 167 | return generateQuery(fields, options[key], true) 168 | case 'range': 169 | $and.push(generateRangeQuery(fields, options.range)) 170 | break 171 | case 'match': 172 | if ('or' in options.match) 173 | for (const key in options.match.or) { 174 | const q = {} 175 | q[key] = options.match.or[key] 176 | $or.push(q) 177 | } 178 | else $and.push(mapValues(options.match, value => 179 | Array.isArray(value) ? { $in: value } : value)) 180 | break 181 | case 'exists': 182 | $and.push(mapValues(options.exists, (value, key) => { 183 | if (!(key in fields)) return void 0 184 | 185 | if (fields[key].isArray) 186 | return value ? { $ne: [] } : [] 187 | 188 | return value ? { $ne: null } : null 189 | })) 190 | break 191 | default: 192 | } 193 | 194 | if (not) 195 | $and = $and.map(applyNotOperator) 196 | 197 | if ($and.length) result.$and = $and 198 | if ($or.length) result.$or = $or 199 | 200 | return result 201 | } 202 | -------------------------------------------------------------------------------- /lib/index.js: -------------------------------------------------------------------------------- 1 | 'use strict' 2 | 3 | const mongodb = require('mongodb') 4 | const MongoClient = mongodb.MongoClient 5 | 6 | const helpers = require('./helpers') 7 | const inputRecord = helpers.inputRecord 8 | const outputRecord = helpers.outputRecord 9 | const mapValues = helpers.mapValues 10 | const idKey = helpers.idKey 11 | const generateId = helpers.generateId 12 | const generateQuery = helpers.generateQuery 13 | 14 | const adapterOptions = new Set([ 15 | 'url', 'generateId', 'typeMap', 'enableTransactions' 16 | ]) 17 | 18 | /** 19 | * MongoDB adapter. 20 | */ 21 | module.exports = Adapter => class MongodbAdapter extends Adapter { 22 | connect () { 23 | const Promise = this.Promise 24 | const options = this.options 25 | 26 | return new Promise((resolve, reject) => { 27 | if (!('url' in options)) 28 | return reject(new Error('Connection URL is required in options.')) 29 | 30 | if (!('generateId' in options)) options.generateId = generateId 31 | if (!('typeMap' in options)) options.typeMap = {} 32 | if (!('enableTransactions' in options)) 33 | options.enableTransactions = false 34 | 35 | const parameters = {} 36 | 37 | for (const key in options) 38 | if (!adapterOptions.has(key)) parameters[key] = options[key] 39 | 40 | parameters.useNewUrlParser = true 41 | 42 | return MongoClient.connect(options.url, parameters, (error, client) => { 43 | if (error) return reject(error) 44 | this.client = client 45 | this.db = client.db() 46 | return resolve() 47 | }) 48 | }) 49 | } 50 | 51 | 52 | disconnect () { 53 | delete this.db 54 | return this.client.close() 55 | } 56 | 57 | 58 | find (type, ids, options, meta) { 59 | // Handle no-op. 60 | if (ids && !ids.length) return super.find() 61 | 62 | if (options == null) options = {} 63 | 64 | const Promise = this.Promise 65 | const fields = this.recordTypes[type] 66 | const typeMap = this.options.typeMap 67 | const collection = type in typeMap ? typeMap[type] : type 68 | let query = generateQuery(fields, options) 69 | 70 | if ('query' in options) { 71 | const result = options.query(query) 72 | if (result != null) query = result 73 | } 74 | 75 | if (ids && ids.length) query[idKey] = { $in: ids } 76 | 77 | // Parallelize the find method with count method. 78 | return Promise.all([ 79 | new Promise((resolve, reject) => { 80 | const queryOptions = {} 81 | 82 | if ('fields' in options) 83 | queryOptions.projection = 84 | mapValues(options.fields, value => value ? 1 : 0) 85 | 86 | if (meta && meta.session) queryOptions.session = meta.session 87 | 88 | const dbCollection = this.db.collection(collection) 89 | const find = 90 | dbCollection.find.call(dbCollection, query, queryOptions) 91 | 92 | if ('sort' in options) 93 | find.sort(mapValues(options.sort, value => value ? 1 : -1)) 94 | 95 | if ('offset' in options) 96 | find.skip(options.offset) 97 | 98 | if ('limit' in options) 99 | find.limit(options.limit) 100 | 101 | find.toArray((error, records) => error ? reject(error) : 102 | resolve(records.map(outputRecord.bind(this, type))) 103 | ) 104 | }), 105 | new Promise((resolve, reject) => 106 | this.db.collection(collection) 107 | .countDocuments(query, (error, count) => 108 | error ? reject(error) : resolve(count))) 109 | ]).then(results => { 110 | // Set the count on the records array. 111 | results[0].count = results[1] 112 | return results[0] 113 | }) 114 | } 115 | 116 | 117 | create (type, records, meta) { 118 | if (!records.length) return super.create() 119 | 120 | const Promise = this.Promise 121 | const ConflictError = this.errors.ConflictError 122 | const typeMap = this.options.typeMap 123 | const collection = type in typeMap ? typeMap[type] : type 124 | const options = {} 125 | 126 | if (meta && meta.session) options.session = meta.session 127 | 128 | return new Promise((resolve, reject) => 129 | this.db.collection(collection).insertMany( 130 | records.map(inputRecord.bind(this, type)), 131 | options, 132 | (error, result) => error ? 133 | // Cryptic error code for unique constraint violation. 134 | reject(error.code === 11000 ? 135 | new ConflictError('Duplicate key.') : error) : 136 | resolve(result.ops.map(outputRecord.bind(this, type))) 137 | )) 138 | } 139 | 140 | 141 | update (type, updates, meta) { 142 | const Promise = this.Promise 143 | const typeMap = this.options.typeMap 144 | const primaryKey = this.keys.primary 145 | const collection = type in typeMap ? typeMap[type] : type 146 | 147 | return Promise.all(updates.map(update => 148 | new Promise((resolve, reject) => { 149 | const modifiers = {} 150 | const options = {} 151 | 152 | if (meta && meta.session) options.session = meta.session 153 | 154 | if ('replace' in update && Object.keys(update.replace).length) 155 | modifiers.$set = update.replace 156 | 157 | if ('push' in update) 158 | modifiers.$push = mapValues(update.push, value => 159 | Array.isArray(value) ? { $each: value } : value) 160 | 161 | if ('pull' in update) 162 | modifiers.$pull = mapValues(update.pull, value => 163 | Array.isArray(value) ? { $in: value } : value) 164 | 165 | // Custom update operators have precedence. 166 | Object.assign(modifiers, update.operate) 167 | 168 | // Short circuit no-op. 169 | if (!Object.keys(modifiers).length) { 170 | resolve(0) 171 | return 172 | } 173 | 174 | this.db.collection(collection).updateOne({ 175 | [idKey]: update[primaryKey] 176 | }, modifiers, options, (error, result) => 177 | error ? reject(error) : resolve(result.result.n)) 178 | }) 179 | )).then(numbers => numbers.reduce((accumulator, number) => 180 | accumulator + number, 0)) 181 | } 182 | 183 | 184 | delete (type, ids, meta) { 185 | if (ids && !ids.length) return super.delete() 186 | 187 | const Promise = this.Promise 188 | const typeMap = this.options.typeMap 189 | const collection = type in typeMap ? typeMap[type] : type 190 | const options = {} 191 | 192 | if (meta && meta.session) options.session = meta.session 193 | 194 | return new Promise((resolve, reject) => 195 | this.db.collection(collection).deleteMany(ids && ids.length ? 196 | { [idKey]: { $in: ids } } : {}, options, 197 | (error, result) => error ? reject(error) : resolve(result.result.n))) 198 | } 199 | 200 | 201 | beginTransaction () { 202 | const self = this 203 | const Promise = this.Promise 204 | 205 | if (!self.options.enableTransactions) 206 | return Promise.resolve(self) 207 | 208 | // Start a session in this closure. 209 | const session = self.client.startSession() 210 | session.startTransaction() 211 | 212 | // Augment the requests with the session. 213 | return { 214 | find (type, ids, options, meta) { 215 | if (meta == null) meta = {} 216 | meta.session = session 217 | return self.find.call(self, type, ids, options, meta) 218 | }, 219 | create (type, records, meta) { 220 | if (meta == null) meta = {} 221 | meta.session = session 222 | return self.create.call(self, type, records, meta) 223 | }, 224 | update (type, updates, meta) { 225 | if (meta == null) meta = {} 226 | meta.session = session 227 | return self.update.call(self, type, updates, meta) 228 | }, 229 | delete (type, ids, meta) { 230 | if (meta == null) meta = {} 231 | meta.session = session 232 | return self.update.call(self, type, ids, meta) 233 | }, 234 | endTransaction (error) { 235 | return (error ? 236 | session.abortTransaction() : 237 | session.commitTransaction()) 238 | .then(() => { 239 | session.endSession() 240 | }) 241 | } 242 | } 243 | } 244 | } 245 | -------------------------------------------------------------------------------- /package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "fortune-mongodb", 3 | "version": "1.3.2", 4 | "lockfileVersion": 1, 5 | "requires": true, 6 | "dependencies": { 7 | "@babel/code-frame": { 8 | "version": "7.0.0", 9 | "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.0.0.tgz", 10 | "integrity": "sha512-OfC2uemaknXr87bdLUkWog7nYuliM9Ij5HUcajsVcMCpQrcLmtxRbVFTIqmcSkSeYRBFBRxs2FiUqFJDLdiebA==", 11 | "dev": true, 12 | "requires": { 13 | "@babel/highlight": "^7.0.0" 14 | } 15 | }, 16 | "@babel/highlight": { 17 | "version": "7.0.0", 18 | "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.0.0.tgz", 19 | "integrity": "sha512-UFMC4ZeFC48Tpvj7C8UgLvtkaUuovQX+5xNWrsIoMG8o2z+XFKjKaN9iVmS84dPwVN00W4wPmqvYoZF3EGAsfw==", 20 | "dev": true, 21 | "requires": { 22 | "chalk": "^2.0.0", 23 | "esutils": "^2.0.2", 24 | "js-tokens": "^4.0.0" 25 | } 26 | }, 27 | "@tap-format/dot": { 28 | "version": "0.3.0", 29 | "resolved": "https://registry.npmjs.org/@tap-format/dot/-/dot-0.3.0.tgz", 30 | "integrity": "sha1-e9RPHdNyoqu4tqEjuQi7fRm84uU=", 31 | "dev": true, 32 | "requires": { 33 | "@tap-format/exit": "0.2.0", 34 | "@tap-format/failures": "0.2.0", 35 | "@tap-format/parser": "0.2.0", 36 | "@tap-format/results": "0.2.0", 37 | "chalk": "^1.1.1", 38 | "figures": "^1.4.0", 39 | "rx": "^4.0.7" 40 | }, 41 | "dependencies": { 42 | "chalk": { 43 | "version": "1.1.3", 44 | "resolved": "http://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", 45 | "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", 46 | "dev": true, 47 | "requires": { 48 | "ansi-styles": "^2.2.1", 49 | "escape-string-regexp": "^1.0.2", 50 | "has-ansi": "^2.0.0", 51 | "strip-ansi": "^3.0.0", 52 | "supports-color": "^2.0.0" 53 | } 54 | } 55 | } 56 | }, 57 | "@tap-format/exit": { 58 | "version": "0.2.0", 59 | "resolved": "https://registry.npmjs.org/@tap-format/exit/-/exit-0.2.0.tgz", 60 | "integrity": "sha1-tYc2vFXTCALAEsWt/KUbRwQDEM0=", 61 | "dev": true, 62 | "requires": { 63 | "ramda": "^0.18.0", 64 | "rx": "^4.0.7" 65 | } 66 | }, 67 | "@tap-format/failures": { 68 | "version": "0.2.0", 69 | "resolved": "https://registry.npmjs.org/@tap-format/failures/-/failures-0.2.0.tgz", 70 | "integrity": "sha1-u29e3DvDxXxiiFvHwhTMer38Kgc=", 71 | "dev": true, 72 | "requires": { 73 | "chalk": "^1.1.1", 74 | "diff": "^2.2.1", 75 | "figures": "^1.4.0", 76 | "ramda": "^0.18.0", 77 | "rx": "^4.0.7" 78 | }, 79 | "dependencies": { 80 | "chalk": { 81 | "version": "1.1.3", 82 | "resolved": "http://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", 83 | "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", 84 | "dev": true, 85 | "requires": { 86 | "ansi-styles": "^2.2.1", 87 | "escape-string-regexp": "^1.0.2", 88 | "has-ansi": "^2.0.0", 89 | "strip-ansi": "^3.0.0", 90 | "supports-color": "^2.0.0" 91 | } 92 | } 93 | } 94 | }, 95 | "@tap-format/parser": { 96 | "version": "0.2.0", 97 | "resolved": "https://registry.npmjs.org/@tap-format/parser/-/parser-0.2.0.tgz", 98 | "integrity": "sha1-vcHZXmlHgRV1kyg7s8P+wTKjEV0=", 99 | "dev": true, 100 | "requires": { 101 | "duplexer": "^0.1.1", 102 | "js-yaml": "^3.4.6", 103 | "ramda": "^0.18.0", 104 | "readable-stream": "^2.0.4", 105 | "rx": "^4.0.7", 106 | "rx-node": "^1.0.1", 107 | "split": "^1.0.0" 108 | } 109 | }, 110 | "@tap-format/results": { 111 | "version": "0.2.0", 112 | "resolved": "https://registry.npmjs.org/@tap-format/results/-/results-0.2.0.tgz", 113 | "integrity": "sha1-GS1krEHxRvonItscCiLtgEePVP0=", 114 | "dev": true, 115 | "requires": { 116 | "chalk": "^1.1.1", 117 | "hirestime": "^1.0.6", 118 | "pretty-ms": "^2.1.0", 119 | "rx": "^4.0.7" 120 | }, 121 | "dependencies": { 122 | "chalk": { 123 | "version": "1.1.3", 124 | "resolved": "http://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", 125 | "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", 126 | "dev": true, 127 | "requires": { 128 | "ansi-styles": "^2.2.1", 129 | "escape-string-regexp": "^1.0.2", 130 | "has-ansi": "^2.0.0", 131 | "strip-ansi": "^3.0.0", 132 | "supports-color": "^2.0.0" 133 | } 134 | } 135 | } 136 | }, 137 | "acorn": { 138 | "version": "5.7.3", 139 | "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.7.3.tgz", 140 | "integrity": "sha512-T/zvzYRfbVojPWahDsE5evJdHb3oJoQfFbsrKM7w5Zcs++Tr257tia3BmMP8XYVjp1S9RZXQMh7gao96BlqZOw==", 141 | "dev": true 142 | }, 143 | "acorn-jsx": { 144 | "version": "4.1.1", 145 | "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-4.1.1.tgz", 146 | "integrity": "sha512-JY+iV6r+cO21KtntVvFkD+iqjtdpRUpGqKWgfkCdZq1R+kbreEl8EcdcJR4SmiIgsIQT33s6QzheQ9a275Q8xw==", 147 | "dev": true, 148 | "requires": { 149 | "acorn": "^5.0.3" 150 | } 151 | }, 152 | "ajv": { 153 | "version": "6.5.4", 154 | "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.5.4.tgz", 155 | "integrity": "sha512-4Wyjt8+t6YszqaXnLDfMmG/8AlO5Zbcsy3ATHncCzjW/NoPzAId8AK6749Ybjmdt+kUY1gP60fCu46oDxPv/mg==", 156 | "dev": true, 157 | "requires": { 158 | "fast-deep-equal": "^2.0.1", 159 | "fast-json-stable-stringify": "^2.0.0", 160 | "json-schema-traverse": "^0.4.1", 161 | "uri-js": "^4.2.2" 162 | } 163 | }, 164 | "ansi-escapes": { 165 | "version": "3.1.0", 166 | "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.1.0.tgz", 167 | "integrity": "sha512-UgAb8H9D41AQnu/PbWlCofQVcnV4Gs2bBJi9eZPxfU/hgglFh3SMDMENRIqdr7H6XFnXdoknctFByVsCOotTVw==", 168 | "dev": true 169 | }, 170 | "ansi-regex": { 171 | "version": "2.1.1", 172 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", 173 | "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", 174 | "dev": true 175 | }, 176 | "ansi-styles": { 177 | "version": "2.2.1", 178 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", 179 | "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", 180 | "dev": true 181 | }, 182 | "argparse": { 183 | "version": "1.0.10", 184 | "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", 185 | "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", 186 | "dev": true, 187 | "requires": { 188 | "sprintf-js": "~1.0.2" 189 | } 190 | }, 191 | "array-union": { 192 | "version": "1.0.2", 193 | "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", 194 | "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=", 195 | "dev": true, 196 | "requires": { 197 | "array-uniq": "^1.0.1" 198 | } 199 | }, 200 | "array-uniq": { 201 | "version": "1.0.3", 202 | "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", 203 | "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=", 204 | "dev": true 205 | }, 206 | "arrify": { 207 | "version": "1.0.1", 208 | "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", 209 | "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=", 210 | "dev": true 211 | }, 212 | "balanced-match": { 213 | "version": "1.0.0", 214 | "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", 215 | "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", 216 | "dev": true 217 | }, 218 | "brace-expansion": { 219 | "version": "1.1.11", 220 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", 221 | "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", 222 | "dev": true, 223 | "requires": { 224 | "balanced-match": "^1.0.0", 225 | "concat-map": "0.0.1" 226 | } 227 | }, 228 | "bson": { 229 | "version": "1.1.0", 230 | "resolved": "https://registry.npmjs.org/bson/-/bson-1.1.0.tgz", 231 | "integrity": "sha512-9Aeai9TacfNtWXOYarkFJRW2CWo+dRon+fuLZYJmvLV3+MiUp0bEI6IAZfXEIg7/Pl/7IWlLaDnhzTsD81etQA==" 232 | }, 233 | "caller-path": { 234 | "version": "0.1.0", 235 | "resolved": "https://registry.npmjs.org/caller-path/-/caller-path-0.1.0.tgz", 236 | "integrity": "sha1-lAhe9jWB7NPaqSREqP6U6CV3dR8=", 237 | "dev": true, 238 | "requires": { 239 | "callsites": "^0.2.0" 240 | } 241 | }, 242 | "callsites": { 243 | "version": "0.2.0", 244 | "resolved": "https://registry.npmjs.org/callsites/-/callsites-0.2.0.tgz", 245 | "integrity": "sha1-r6uWJikQp/M8GaV3WCXGnzTjUMo=", 246 | "dev": true 247 | }, 248 | "chalk": { 249 | "version": "2.4.1", 250 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", 251 | "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", 252 | "dev": true, 253 | "requires": { 254 | "ansi-styles": "^3.2.1", 255 | "escape-string-regexp": "^1.0.5", 256 | "supports-color": "^5.3.0" 257 | }, 258 | "dependencies": { 259 | "ansi-styles": { 260 | "version": "3.2.1", 261 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", 262 | "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", 263 | "dev": true, 264 | "requires": { 265 | "color-convert": "^1.9.0" 266 | } 267 | }, 268 | "supports-color": { 269 | "version": "5.5.0", 270 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", 271 | "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", 272 | "dev": true, 273 | "requires": { 274 | "has-flag": "^3.0.0" 275 | } 276 | } 277 | } 278 | }, 279 | "chardet": { 280 | "version": "0.7.0", 281 | "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", 282 | "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==", 283 | "dev": true 284 | }, 285 | "circular-json": { 286 | "version": "0.3.3", 287 | "resolved": "https://registry.npmjs.org/circular-json/-/circular-json-0.3.3.tgz", 288 | "integrity": "sha512-UZK3NBx2Mca+b5LsG7bY183pHWt5Y1xts4P3Pz7ENTwGVnJOUWbRb3ocjvX7hx9tq/yTAdclXm9sZ38gNuem4A==", 289 | "dev": true 290 | }, 291 | "cli-cursor": { 292 | "version": "2.1.0", 293 | "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz", 294 | "integrity": "sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU=", 295 | "dev": true, 296 | "requires": { 297 | "restore-cursor": "^2.0.0" 298 | } 299 | }, 300 | "cli-width": { 301 | "version": "2.2.0", 302 | "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.0.tgz", 303 | "integrity": "sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk=", 304 | "dev": true 305 | }, 306 | "color-convert": { 307 | "version": "1.9.3", 308 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", 309 | "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", 310 | "dev": true, 311 | "requires": { 312 | "color-name": "1.1.3" 313 | } 314 | }, 315 | "color-name": { 316 | "version": "1.1.3", 317 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", 318 | "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", 319 | "dev": true 320 | }, 321 | "concat-map": { 322 | "version": "0.0.1", 323 | "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", 324 | "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", 325 | "dev": true 326 | }, 327 | "core-util-is": { 328 | "version": "1.0.2", 329 | "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", 330 | "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", 331 | "dev": true 332 | }, 333 | "cross-spawn": { 334 | "version": "6.0.5", 335 | "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", 336 | "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", 337 | "dev": true, 338 | "requires": { 339 | "nice-try": "^1.0.4", 340 | "path-key": "^2.0.1", 341 | "semver": "^5.5.0", 342 | "shebang-command": "^1.2.0", 343 | "which": "^1.2.9" 344 | } 345 | }, 346 | "debug": { 347 | "version": "4.1.0", 348 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.0.tgz", 349 | "integrity": "sha512-heNPJUJIqC+xB6ayLAMHaIrmN9HKa7aQO8MGqKpvCA+uJYVcvR6l5kgdrhRuwPFHU7P5/A1w0BjByPHwpfTDKg==", 350 | "dev": true, 351 | "requires": { 352 | "ms": "^2.1.1" 353 | } 354 | }, 355 | "deep-is": { 356 | "version": "0.1.3", 357 | "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", 358 | "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=", 359 | "dev": true 360 | }, 361 | "del": { 362 | "version": "2.2.2", 363 | "resolved": "https://registry.npmjs.org/del/-/del-2.2.2.tgz", 364 | "integrity": "sha1-wSyYHQZ4RshLyvhiz/kw2Qf/0ag=", 365 | "dev": true, 366 | "requires": { 367 | "globby": "^5.0.0", 368 | "is-path-cwd": "^1.0.0", 369 | "is-path-in-cwd": "^1.0.0", 370 | "object-assign": "^4.0.1", 371 | "pify": "^2.0.0", 372 | "pinkie-promise": "^2.0.0", 373 | "rimraf": "^2.2.8" 374 | } 375 | }, 376 | "diff": { 377 | "version": "2.2.3", 378 | "resolved": "https://registry.npmjs.org/diff/-/diff-2.2.3.tgz", 379 | "integrity": "sha1-YOr9DSjukG5Oj/ClLBIpUhAzv5k=", 380 | "dev": true 381 | }, 382 | "doctrine": { 383 | "version": "2.1.0", 384 | "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", 385 | "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", 386 | "dev": true, 387 | "requires": { 388 | "esutils": "^2.0.2" 389 | } 390 | }, 391 | "duplexer": { 392 | "version": "0.1.1", 393 | "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.1.tgz", 394 | "integrity": "sha1-rOb/gIwc5mtX0ev5eXessCM0z8E=", 395 | "dev": true 396 | }, 397 | "error-class": { 398 | "version": "2.0.2", 399 | "resolved": "https://registry.npmjs.org/error-class/-/error-class-2.0.2.tgz", 400 | "integrity": "sha512-Saa2G4bWSnh/I4Pw9bKHUvNZaxZJqthSV49dQxgM0vKGIBl5ap54AmBqsc0ONQYG5gOrKv4kLvfsZuvxM9Z23Q==", 401 | "dev": true 402 | }, 403 | "escape-string-regexp": { 404 | "version": "1.0.5", 405 | "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", 406 | "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", 407 | "dev": true 408 | }, 409 | "eslint": { 410 | "version": "5.7.0", 411 | "resolved": "https://registry.npmjs.org/eslint/-/eslint-5.7.0.tgz", 412 | "integrity": "sha512-zYCeFQahsxffGl87U2aJ7DPyH8CbWgxBC213Y8+TCanhUTf2gEvfq3EKpHmEcozTLyPmGe9LZdMAwC/CpJBM5A==", 413 | "dev": true, 414 | "requires": { 415 | "@babel/code-frame": "^7.0.0", 416 | "ajv": "^6.5.3", 417 | "chalk": "^2.1.0", 418 | "cross-spawn": "^6.0.5", 419 | "debug": "^4.0.1", 420 | "doctrine": "^2.1.0", 421 | "eslint-scope": "^4.0.0", 422 | "eslint-utils": "^1.3.1", 423 | "eslint-visitor-keys": "^1.0.0", 424 | "espree": "^4.0.0", 425 | "esquery": "^1.0.1", 426 | "esutils": "^2.0.2", 427 | "file-entry-cache": "^2.0.0", 428 | "functional-red-black-tree": "^1.0.1", 429 | "glob": "^7.1.2", 430 | "globals": "^11.7.0", 431 | "ignore": "^4.0.6", 432 | "imurmurhash": "^0.1.4", 433 | "inquirer": "^6.1.0", 434 | "is-resolvable": "^1.1.0", 435 | "js-yaml": "^3.12.0", 436 | "json-stable-stringify-without-jsonify": "^1.0.1", 437 | "levn": "^0.3.0", 438 | "lodash": "^4.17.5", 439 | "minimatch": "^3.0.4", 440 | "mkdirp": "^0.5.1", 441 | "natural-compare": "^1.4.0", 442 | "optionator": "^0.8.2", 443 | "path-is-inside": "^1.0.2", 444 | "pluralize": "^7.0.0", 445 | "progress": "^2.0.0", 446 | "regexpp": "^2.0.1", 447 | "require-uncached": "^1.0.3", 448 | "semver": "^5.5.1", 449 | "strip-ansi": "^4.0.0", 450 | "strip-json-comments": "^2.0.1", 451 | "table": "^5.0.2", 452 | "text-table": "^0.2.0" 453 | }, 454 | "dependencies": { 455 | "ansi-regex": { 456 | "version": "3.0.0", 457 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", 458 | "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", 459 | "dev": true 460 | }, 461 | "strip-ansi": { 462 | "version": "4.0.0", 463 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", 464 | "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", 465 | "dev": true, 466 | "requires": { 467 | "ansi-regex": "^3.0.0" 468 | } 469 | } 470 | } 471 | }, 472 | "eslint-config-boss": { 473 | "version": "1.0.6", 474 | "resolved": "https://registry.npmjs.org/eslint-config-boss/-/eslint-config-boss-1.0.6.tgz", 475 | "integrity": "sha512-Wty0JFe8x+ltLGyjvJ6I7me1I7F6EZliK/Pt5hxwkKYO/Dr2SpXQFLApAUDaWeyw2RPBIq8qh/Zd9Lz7tgdwmg==", 476 | "dev": true 477 | }, 478 | "eslint-scope": { 479 | "version": "4.0.0", 480 | "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-4.0.0.tgz", 481 | "integrity": "sha512-1G6UTDi7Jc1ELFwnR58HV4fK9OQK4S6N985f166xqXxpjU6plxFISJa2Ba9KCQuFa8RCnj/lSFJbHo7UFDBnUA==", 482 | "dev": true, 483 | "requires": { 484 | "esrecurse": "^4.1.0", 485 | "estraverse": "^4.1.1" 486 | } 487 | }, 488 | "eslint-utils": { 489 | "version": "1.3.1", 490 | "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-1.3.1.tgz", 491 | "integrity": "sha512-Z7YjnIldX+2XMcjr7ZkgEsOj/bREONV60qYeB/bjMAqqqZ4zxKyWX+BOUkdmRmA9riiIPVvo5x86m5elviOk0Q==", 492 | "dev": true 493 | }, 494 | "eslint-visitor-keys": { 495 | "version": "1.0.0", 496 | "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.0.0.tgz", 497 | "integrity": "sha512-qzm/XxIbxm/FHyH341ZrbnMUpe+5Bocte9xkmFMzPMjRaZMcXww+MpBptFvtU+79L362nqiLhekCxCxDPaUMBQ==", 498 | "dev": true 499 | }, 500 | "espree": { 501 | "version": "4.0.0", 502 | "resolved": "https://registry.npmjs.org/espree/-/espree-4.0.0.tgz", 503 | "integrity": "sha512-kapdTCt1bjmspxStVKX6huolXVV5ZfyZguY1lcfhVVZstce3bqxH9mcLzNn3/mlgW6wQ732+0fuG9v7h0ZQoKg==", 504 | "dev": true, 505 | "requires": { 506 | "acorn": "^5.6.0", 507 | "acorn-jsx": "^4.1.1" 508 | } 509 | }, 510 | "esprima": { 511 | "version": "4.0.1", 512 | "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", 513 | "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", 514 | "dev": true 515 | }, 516 | "esquery": { 517 | "version": "1.0.1", 518 | "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.0.1.tgz", 519 | "integrity": "sha512-SmiyZ5zIWH9VM+SRUReLS5Q8a7GxtRdxEBVZpm98rJM7Sb+A9DVCndXfkeFUd3byderg+EbDkfnevfCwynWaNA==", 520 | "dev": true, 521 | "requires": { 522 | "estraverse": "^4.0.0" 523 | } 524 | }, 525 | "esrecurse": { 526 | "version": "4.2.1", 527 | "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.2.1.tgz", 528 | "integrity": "sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ==", 529 | "dev": true, 530 | "requires": { 531 | "estraverse": "^4.1.0" 532 | } 533 | }, 534 | "estraverse": { 535 | "version": "4.2.0", 536 | "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.2.0.tgz", 537 | "integrity": "sha1-De4/7TH81GlhjOc0IJn8GvoL2xM=", 538 | "dev": true 539 | }, 540 | "esutils": { 541 | "version": "2.0.2", 542 | "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz", 543 | "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=", 544 | "dev": true 545 | }, 546 | "event-lite": { 547 | "version": "0.1.2", 548 | "resolved": "https://registry.npmjs.org/event-lite/-/event-lite-0.1.2.tgz", 549 | "integrity": "sha512-HnSYx1BsJ87/p6swwzv+2v6B4X+uxUteoDfRxsAb1S1BePzQqOLevVmkdA15GHJVd9A9Ok6wygUR18Hu0YeV9g==", 550 | "dev": true 551 | }, 552 | "external-editor": { 553 | "version": "3.0.3", 554 | "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.0.3.tgz", 555 | "integrity": "sha512-bn71H9+qWoOQKyZDo25mOMVpSmXROAsTJVVVYzrrtol3d4y+AsKjf4Iwl2Q+IuT0kFSQ1qo166UuIwqYq7mGnA==", 556 | "dev": true, 557 | "requires": { 558 | "chardet": "^0.7.0", 559 | "iconv-lite": "^0.4.24", 560 | "tmp": "^0.0.33" 561 | } 562 | }, 563 | "fast-deep-equal": { 564 | "version": "2.0.1", 565 | "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz", 566 | "integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk=", 567 | "dev": true 568 | }, 569 | "fast-json-stable-stringify": { 570 | "version": "2.0.0", 571 | "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz", 572 | "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=", 573 | "dev": true 574 | }, 575 | "fast-levenshtein": { 576 | "version": "2.0.6", 577 | "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", 578 | "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", 579 | "dev": true 580 | }, 581 | "figures": { 582 | "version": "1.7.0", 583 | "resolved": "https://registry.npmjs.org/figures/-/figures-1.7.0.tgz", 584 | "integrity": "sha1-y+Hjr/zxzUS4DK3+0o3Hk6lwHS4=", 585 | "dev": true, 586 | "requires": { 587 | "escape-string-regexp": "^1.0.5", 588 | "object-assign": "^4.1.0" 589 | } 590 | }, 591 | "file-entry-cache": { 592 | "version": "2.0.0", 593 | "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-2.0.0.tgz", 594 | "integrity": "sha1-w5KZDD5oR4PYOLjISkXYoEhFg2E=", 595 | "dev": true, 596 | "requires": { 597 | "flat-cache": "^1.2.1", 598 | "object-assign": "^4.0.1" 599 | } 600 | }, 601 | "flat-cache": { 602 | "version": "1.3.0", 603 | "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-1.3.0.tgz", 604 | "integrity": "sha1-0wMLMrOBVPTjt+nHCfSQ9++XxIE=", 605 | "dev": true, 606 | "requires": { 607 | "circular-json": "^0.3.1", 608 | "del": "^2.0.2", 609 | "graceful-fs": "^4.1.2", 610 | "write": "^0.2.1" 611 | } 612 | }, 613 | "fortune": { 614 | "version": "5.5.14", 615 | "resolved": "https://registry.npmjs.org/fortune/-/fortune-5.5.14.tgz", 616 | "integrity": "sha512-bimO4XpKnanEafx7/5lNjHEGxPEYaU2FlsMy/bzeVB0eHg6LPbR5+FjyrV7EA6JOCJUs2pHA0Dxwx5uSC4N1Zg==", 617 | "dev": true, 618 | "requires": { 619 | "error-class": "^2.0.2", 620 | "event-lite": "^0.1.2" 621 | } 622 | }, 623 | "fs.realpath": { 624 | "version": "1.0.0", 625 | "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", 626 | "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", 627 | "dev": true 628 | }, 629 | "functional-red-black-tree": { 630 | "version": "1.0.1", 631 | "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", 632 | "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=", 633 | "dev": true 634 | }, 635 | "glob": { 636 | "version": "7.1.3", 637 | "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz", 638 | "integrity": "sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==", 639 | "dev": true, 640 | "requires": { 641 | "fs.realpath": "^1.0.0", 642 | "inflight": "^1.0.4", 643 | "inherits": "2", 644 | "minimatch": "^3.0.4", 645 | "once": "^1.3.0", 646 | "path-is-absolute": "^1.0.0" 647 | } 648 | }, 649 | "globals": { 650 | "version": "11.8.0", 651 | "resolved": "https://registry.npmjs.org/globals/-/globals-11.8.0.tgz", 652 | "integrity": "sha512-io6LkyPVuzCHBSQV9fmOwxZkUk6nIaGmxheLDgmuFv89j0fm2aqDbIXKAGfzCMHqz3HLF2Zf8WSG6VqMh2qFmA==", 653 | "dev": true 654 | }, 655 | "globby": { 656 | "version": "5.0.0", 657 | "resolved": "https://registry.npmjs.org/globby/-/globby-5.0.0.tgz", 658 | "integrity": "sha1-69hGZ8oNuzMLmbz8aOrCvFQ3Dg0=", 659 | "dev": true, 660 | "requires": { 661 | "array-union": "^1.0.1", 662 | "arrify": "^1.0.0", 663 | "glob": "^7.0.3", 664 | "object-assign": "^4.0.1", 665 | "pify": "^2.0.0", 666 | "pinkie-promise": "^2.0.0" 667 | } 668 | }, 669 | "graceful-fs": { 670 | "version": "4.1.11", 671 | "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", 672 | "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=", 673 | "dev": true 674 | }, 675 | "has-ansi": { 676 | "version": "2.0.0", 677 | "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", 678 | "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", 679 | "dev": true, 680 | "requires": { 681 | "ansi-regex": "^2.0.0" 682 | } 683 | }, 684 | "has-flag": { 685 | "version": "3.0.0", 686 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", 687 | "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", 688 | "dev": true 689 | }, 690 | "hirestime": { 691 | "version": "1.0.7", 692 | "resolved": "https://registry.npmjs.org/hirestime/-/hirestime-1.0.7.tgz", 693 | "integrity": "sha1-LVJx6oQ1bOw/JdqMVqlAL4/ApwA=", 694 | "dev": true 695 | }, 696 | "iconv-lite": { 697 | "version": "0.4.24", 698 | "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", 699 | "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", 700 | "dev": true, 701 | "requires": { 702 | "safer-buffer": ">= 2.1.2 < 3" 703 | } 704 | }, 705 | "ignore": { 706 | "version": "4.0.6", 707 | "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", 708 | "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", 709 | "dev": true 710 | }, 711 | "imurmurhash": { 712 | "version": "0.1.4", 713 | "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", 714 | "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", 715 | "dev": true 716 | }, 717 | "inflight": { 718 | "version": "1.0.6", 719 | "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", 720 | "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", 721 | "dev": true, 722 | "requires": { 723 | "once": "^1.3.0", 724 | "wrappy": "1" 725 | } 726 | }, 727 | "inherits": { 728 | "version": "2.0.3", 729 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", 730 | "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", 731 | "dev": true 732 | }, 733 | "inquirer": { 734 | "version": "6.2.0", 735 | "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-6.2.0.tgz", 736 | "integrity": "sha512-QIEQG4YyQ2UYZGDC4srMZ7BjHOmNk1lR2JQj5UknBapklm6WHA+VVH7N+sUdX3A7NeCfGF8o4X1S3Ao7nAcIeg==", 737 | "dev": true, 738 | "requires": { 739 | "ansi-escapes": "^3.0.0", 740 | "chalk": "^2.0.0", 741 | "cli-cursor": "^2.1.0", 742 | "cli-width": "^2.0.0", 743 | "external-editor": "^3.0.0", 744 | "figures": "^2.0.0", 745 | "lodash": "^4.17.10", 746 | "mute-stream": "0.0.7", 747 | "run-async": "^2.2.0", 748 | "rxjs": "^6.1.0", 749 | "string-width": "^2.1.0", 750 | "strip-ansi": "^4.0.0", 751 | "through": "^2.3.6" 752 | }, 753 | "dependencies": { 754 | "ansi-regex": { 755 | "version": "3.0.0", 756 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", 757 | "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", 758 | "dev": true 759 | }, 760 | "figures": { 761 | "version": "2.0.0", 762 | "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz", 763 | "integrity": "sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI=", 764 | "dev": true, 765 | "requires": { 766 | "escape-string-regexp": "^1.0.5" 767 | } 768 | }, 769 | "strip-ansi": { 770 | "version": "4.0.0", 771 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", 772 | "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", 773 | "dev": true, 774 | "requires": { 775 | "ansi-regex": "^3.0.0" 776 | } 777 | } 778 | } 779 | }, 780 | "is-finite": { 781 | "version": "1.0.2", 782 | "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.0.2.tgz", 783 | "integrity": "sha1-zGZ3aVYCvlUO8R6LSqYwU0K20Ko=", 784 | "dev": true, 785 | "requires": { 786 | "number-is-nan": "^1.0.0" 787 | } 788 | }, 789 | "is-fullwidth-code-point": { 790 | "version": "2.0.0", 791 | "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", 792 | "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", 793 | "dev": true 794 | }, 795 | "is-path-cwd": { 796 | "version": "1.0.0", 797 | "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-1.0.0.tgz", 798 | "integrity": "sha1-0iXsIxMuie3Tj9p2dHLmLmXxEG0=", 799 | "dev": true 800 | }, 801 | "is-path-in-cwd": { 802 | "version": "1.0.1", 803 | "resolved": "https://registry.npmjs.org/is-path-in-cwd/-/is-path-in-cwd-1.0.1.tgz", 804 | "integrity": "sha512-FjV1RTW48E7CWM7eE/J2NJvAEEVektecDBVBE5Hh3nM1Jd0kvhHtX68Pr3xsDf857xt3Y4AkwVULK1Vku62aaQ==", 805 | "dev": true, 806 | "requires": { 807 | "is-path-inside": "^1.0.0" 808 | } 809 | }, 810 | "is-path-inside": { 811 | "version": "1.0.1", 812 | "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-1.0.1.tgz", 813 | "integrity": "sha1-jvW33lBDej/cprToZe96pVy0gDY=", 814 | "dev": true, 815 | "requires": { 816 | "path-is-inside": "^1.0.1" 817 | } 818 | }, 819 | "is-promise": { 820 | "version": "2.1.0", 821 | "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.1.0.tgz", 822 | "integrity": "sha1-eaKp7OfwlugPNtKy87wWwf9L8/o=", 823 | "dev": true 824 | }, 825 | "is-resolvable": { 826 | "version": "1.1.0", 827 | "resolved": "https://registry.npmjs.org/is-resolvable/-/is-resolvable-1.1.0.tgz", 828 | "integrity": "sha512-qgDYXFSR5WvEfuS5dMj6oTMEbrrSaM0CrFk2Yiq/gXnBvD9pMa2jGXxyhGLfvhZpuMZe18CJpFxAt3CRs42NMg==", 829 | "dev": true 830 | }, 831 | "isarray": { 832 | "version": "1.0.0", 833 | "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", 834 | "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", 835 | "dev": true 836 | }, 837 | "isexe": { 838 | "version": "2.0.0", 839 | "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", 840 | "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", 841 | "dev": true 842 | }, 843 | "js-tokens": { 844 | "version": "4.0.0", 845 | "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", 846 | "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", 847 | "dev": true 848 | }, 849 | "js-yaml": { 850 | "version": "3.12.0", 851 | "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.12.0.tgz", 852 | "integrity": "sha512-PIt2cnwmPfL4hKNwqeiuz4bKfnzHTBv6HyVgjahA6mPLwPDzjDWrplJBMjHUFxku/N3FlmrbyPclad+I+4mJ3A==", 853 | "dev": true, 854 | "requires": { 855 | "argparse": "^1.0.7", 856 | "esprima": "^4.0.0" 857 | } 858 | }, 859 | "json-schema-traverse": { 860 | "version": "0.4.1", 861 | "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", 862 | "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", 863 | "dev": true 864 | }, 865 | "json-stable-stringify-without-jsonify": { 866 | "version": "1.0.1", 867 | "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", 868 | "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=", 869 | "dev": true 870 | }, 871 | "levn": { 872 | "version": "0.3.0", 873 | "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", 874 | "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", 875 | "dev": true, 876 | "requires": { 877 | "prelude-ls": "~1.1.2", 878 | "type-check": "~0.3.2" 879 | } 880 | }, 881 | "lodash": { 882 | "version": "4.17.11", 883 | "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz", 884 | "integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==", 885 | "dev": true 886 | }, 887 | "memory-pager": { 888 | "version": "1.1.0", 889 | "resolved": "https://registry.npmjs.org/memory-pager/-/memory-pager-1.1.0.tgz", 890 | "integrity": "sha512-Mf9OHV/Y7h6YWDxTzX/b4ZZ4oh9NSXblQL8dtPCOomOtZciEHxePR78+uHFLLlsk01A6jVHhHsQZZ/WcIPpnzg==", 891 | "optional": true 892 | }, 893 | "mimic-fn": { 894 | "version": "1.2.0", 895 | "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz", 896 | "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==", 897 | "dev": true 898 | }, 899 | "minimatch": { 900 | "version": "3.0.4", 901 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", 902 | "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", 903 | "dev": true, 904 | "requires": { 905 | "brace-expansion": "^1.1.7" 906 | } 907 | }, 908 | "minimist": { 909 | "version": "0.0.8", 910 | "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", 911 | "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", 912 | "dev": true 913 | }, 914 | "mkdirp": { 915 | "version": "0.5.1", 916 | "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", 917 | "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", 918 | "dev": true, 919 | "requires": { 920 | "minimist": "0.0.8" 921 | } 922 | }, 923 | "mongodb": { 924 | "version": "3.1.8", 925 | "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-3.1.8.tgz", 926 | "integrity": "sha512-yNKwYxQ6m00NV6+pMoWoheFTHSQVv1KkSrfOhRDYMILGWDYtUtQRqHrFqU75rmPIY8hMozVft8zdC4KYMWaM3Q==", 927 | "requires": { 928 | "mongodb-core": "3.1.7", 929 | "safe-buffer": "^5.1.2" 930 | } 931 | }, 932 | "mongodb-core": { 933 | "version": "3.1.7", 934 | "resolved": "https://registry.npmjs.org/mongodb-core/-/mongodb-core-3.1.7.tgz", 935 | "integrity": "sha512-YffpSrLmgFNmrvkGx+yX00KyBNk64C0BalfEn6vHHkXtcMUGXw8nxrMmhq5eXPLLlYeBpD/CsgNxE2Chf0o4zQ==", 936 | "requires": { 937 | "bson": "^1.1.0", 938 | "require_optional": "^1.0.1", 939 | "safe-buffer": "^5.1.2", 940 | "saslprep": "^1.0.0" 941 | } 942 | }, 943 | "ms": { 944 | "version": "2.1.1", 945 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", 946 | "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", 947 | "dev": true 948 | }, 949 | "mute-stream": { 950 | "version": "0.0.7", 951 | "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.7.tgz", 952 | "integrity": "sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s=", 953 | "dev": true 954 | }, 955 | "natural-compare": { 956 | "version": "1.4.0", 957 | "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", 958 | "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", 959 | "dev": true 960 | }, 961 | "nice-try": { 962 | "version": "1.0.5", 963 | "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", 964 | "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", 965 | "dev": true 966 | }, 967 | "number-is-nan": { 968 | "version": "1.0.1", 969 | "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", 970 | "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", 971 | "dev": true 972 | }, 973 | "object-assign": { 974 | "version": "4.1.1", 975 | "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", 976 | "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", 977 | "dev": true 978 | }, 979 | "once": { 980 | "version": "1.4.0", 981 | "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", 982 | "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", 983 | "dev": true, 984 | "requires": { 985 | "wrappy": "1" 986 | } 987 | }, 988 | "onetime": { 989 | "version": "2.0.1", 990 | "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz", 991 | "integrity": "sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ=", 992 | "dev": true, 993 | "requires": { 994 | "mimic-fn": "^1.0.0" 995 | } 996 | }, 997 | "optionator": { 998 | "version": "0.8.2", 999 | "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.2.tgz", 1000 | "integrity": "sha1-NkxeQJ0/TWMB1sC0wFu6UBgK62Q=", 1001 | "dev": true, 1002 | "requires": { 1003 | "deep-is": "~0.1.3", 1004 | "fast-levenshtein": "~2.0.4", 1005 | "levn": "~0.3.0", 1006 | "prelude-ls": "~1.1.2", 1007 | "type-check": "~0.3.2", 1008 | "wordwrap": "~1.0.0" 1009 | } 1010 | }, 1011 | "os-tmpdir": { 1012 | "version": "1.0.2", 1013 | "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", 1014 | "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", 1015 | "dev": true 1016 | }, 1017 | "parse-ms": { 1018 | "version": "1.0.1", 1019 | "resolved": "https://registry.npmjs.org/parse-ms/-/parse-ms-1.0.1.tgz", 1020 | "integrity": "sha1-VjRtR0nXjyNDDKDHE4UK75GqNh0=", 1021 | "dev": true 1022 | }, 1023 | "path-is-absolute": { 1024 | "version": "1.0.1", 1025 | "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", 1026 | "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", 1027 | "dev": true 1028 | }, 1029 | "path-is-inside": { 1030 | "version": "1.0.2", 1031 | "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz", 1032 | "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=", 1033 | "dev": true 1034 | }, 1035 | "path-key": { 1036 | "version": "2.0.1", 1037 | "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", 1038 | "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", 1039 | "dev": true 1040 | }, 1041 | "pify": { 1042 | "version": "2.3.0", 1043 | "resolved": "http://registry.npmjs.org/pify/-/pify-2.3.0.tgz", 1044 | "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", 1045 | "dev": true 1046 | }, 1047 | "pinkie": { 1048 | "version": "2.0.4", 1049 | "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", 1050 | "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=", 1051 | "dev": true 1052 | }, 1053 | "pinkie-promise": { 1054 | "version": "2.0.1", 1055 | "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", 1056 | "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", 1057 | "dev": true, 1058 | "requires": { 1059 | "pinkie": "^2.0.0" 1060 | } 1061 | }, 1062 | "plur": { 1063 | "version": "1.0.0", 1064 | "resolved": "https://registry.npmjs.org/plur/-/plur-1.0.0.tgz", 1065 | "integrity": "sha1-24XGgU9eXlo7Se/CjWBP7GKXUVY=", 1066 | "dev": true 1067 | }, 1068 | "pluralize": { 1069 | "version": "7.0.0", 1070 | "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-7.0.0.tgz", 1071 | "integrity": "sha512-ARhBOdzS3e41FbkW/XWrTEtukqqLoK5+Z/4UeDaLuSW+39JPeFgs4gCGqsrJHVZX0fUrx//4OF0K1CUGwlIFow==", 1072 | "dev": true 1073 | }, 1074 | "prelude-ls": { 1075 | "version": "1.1.2", 1076 | "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", 1077 | "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=", 1078 | "dev": true 1079 | }, 1080 | "pretty-ms": { 1081 | "version": "2.1.0", 1082 | "resolved": "https://registry.npmjs.org/pretty-ms/-/pretty-ms-2.1.0.tgz", 1083 | "integrity": "sha1-QlfCVt8/sLRR1q/6qwIYhBJpgdw=", 1084 | "dev": true, 1085 | "requires": { 1086 | "is-finite": "^1.0.1", 1087 | "parse-ms": "^1.0.0", 1088 | "plur": "^1.0.0" 1089 | } 1090 | }, 1091 | "process-nextick-args": { 1092 | "version": "2.0.0", 1093 | "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz", 1094 | "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==", 1095 | "dev": true 1096 | }, 1097 | "progress": { 1098 | "version": "2.0.1", 1099 | "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.1.tgz", 1100 | "integrity": "sha512-OE+a6vzqazc+K6LxJrX5UPyKFvGnL5CYmq2jFGNIBWHpc4QyE49/YOumcrpQFJpfejmvRtbJzgO1zPmMCqlbBg==", 1101 | "dev": true 1102 | }, 1103 | "punycode": { 1104 | "version": "2.1.1", 1105 | "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", 1106 | "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", 1107 | "dev": true 1108 | }, 1109 | "ramda": { 1110 | "version": "0.18.0", 1111 | "resolved": "https://registry.npmjs.org/ramda/-/ramda-0.18.0.tgz", 1112 | "integrity": "sha1-xuPF1LmrH3kGcn/e6wORUqhdTbM=", 1113 | "dev": true 1114 | }, 1115 | "readable-stream": { 1116 | "version": "2.3.6", 1117 | "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", 1118 | "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", 1119 | "dev": true, 1120 | "requires": { 1121 | "core-util-is": "~1.0.0", 1122 | "inherits": "~2.0.3", 1123 | "isarray": "~1.0.0", 1124 | "process-nextick-args": "~2.0.0", 1125 | "safe-buffer": "~5.1.1", 1126 | "string_decoder": "~1.1.1", 1127 | "util-deprecate": "~1.0.1" 1128 | } 1129 | }, 1130 | "regexpp": { 1131 | "version": "2.0.1", 1132 | "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-2.0.1.tgz", 1133 | "integrity": "sha512-lv0M6+TkDVniA3aD1Eg0DVpfU/booSu7Eev3TDO/mZKHBfVjgCGTV4t4buppESEYDtkArYFOxTJWv6S5C+iaNw==", 1134 | "dev": true 1135 | }, 1136 | "require-uncached": { 1137 | "version": "1.0.3", 1138 | "resolved": "https://registry.npmjs.org/require-uncached/-/require-uncached-1.0.3.tgz", 1139 | "integrity": "sha1-Tg1W1slmL9MeQwEcS5WqSZVUIdM=", 1140 | "dev": true, 1141 | "requires": { 1142 | "caller-path": "^0.1.0", 1143 | "resolve-from": "^1.0.0" 1144 | }, 1145 | "dependencies": { 1146 | "resolve-from": { 1147 | "version": "1.0.1", 1148 | "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-1.0.1.tgz", 1149 | "integrity": "sha1-Jsv+k10a7uq7Kbw/5a6wHpPUQiY=", 1150 | "dev": true 1151 | } 1152 | } 1153 | }, 1154 | "require_optional": { 1155 | "version": "1.0.1", 1156 | "resolved": "https://registry.npmjs.org/require_optional/-/require_optional-1.0.1.tgz", 1157 | "integrity": "sha512-qhM/y57enGWHAe3v/NcwML6a3/vfESLe/sGM2dII+gEO0BpKRUkWZow/tyloNqJyN6kXSl3RyyM8Ll5D/sJP8g==", 1158 | "requires": { 1159 | "resolve-from": "^2.0.0", 1160 | "semver": "^5.1.0" 1161 | } 1162 | }, 1163 | "resolve-from": { 1164 | "version": "2.0.0", 1165 | "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-2.0.0.tgz", 1166 | "integrity": "sha1-lICrIOlP+h2egKgEx+oUdhGWa1c=" 1167 | }, 1168 | "restore-cursor": { 1169 | "version": "2.0.0", 1170 | "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz", 1171 | "integrity": "sha1-n37ih/gv0ybU/RYpI9YhKe7g368=", 1172 | "dev": true, 1173 | "requires": { 1174 | "onetime": "^2.0.0", 1175 | "signal-exit": "^3.0.2" 1176 | } 1177 | }, 1178 | "rimraf": { 1179 | "version": "2.6.2", 1180 | "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.2.tgz", 1181 | "integrity": "sha512-lreewLK/BlghmxtfH36YYVg1i8IAce4TI7oao75I1g245+6BctqTVQiBP3YUJ9C6DQOXJmkYR9X9fCLtCOJc5w==", 1182 | "dev": true, 1183 | "requires": { 1184 | "glob": "^7.0.5" 1185 | } 1186 | }, 1187 | "run-async": { 1188 | "version": "2.3.0", 1189 | "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.3.0.tgz", 1190 | "integrity": "sha1-A3GrSuC91yDUFm19/aZP96RFpsA=", 1191 | "dev": true, 1192 | "requires": { 1193 | "is-promise": "^2.1.0" 1194 | } 1195 | }, 1196 | "rx": { 1197 | "version": "4.1.0", 1198 | "resolved": "https://registry.npmjs.org/rx/-/rx-4.1.0.tgz", 1199 | "integrity": "sha1-pfE/957zt0D+MKqAP7CfmIBdR4I=", 1200 | "dev": true 1201 | }, 1202 | "rx-node": { 1203 | "version": "1.0.2", 1204 | "resolved": "https://registry.npmjs.org/rx-node/-/rx-node-1.0.2.tgz", 1205 | "integrity": "sha1-FRJAclp56Fc2CrBsxiZ5mWXglN4=", 1206 | "dev": true, 1207 | "requires": { 1208 | "rx": "*" 1209 | } 1210 | }, 1211 | "rxjs": { 1212 | "version": "6.3.3", 1213 | "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.3.3.tgz", 1214 | "integrity": "sha512-JTWmoY9tWCs7zvIk/CvRjhjGaOd+OVBM987mxFo+OW66cGpdKjZcpmc74ES1sB//7Kl/PAe8+wEakuhG4pcgOw==", 1215 | "dev": true, 1216 | "requires": { 1217 | "tslib": "^1.9.0" 1218 | } 1219 | }, 1220 | "safe-buffer": { 1221 | "version": "5.1.2", 1222 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", 1223 | "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" 1224 | }, 1225 | "safer-buffer": { 1226 | "version": "2.1.2", 1227 | "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", 1228 | "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", 1229 | "dev": true 1230 | }, 1231 | "saslprep": { 1232 | "version": "1.0.2", 1233 | "resolved": "https://registry.npmjs.org/saslprep/-/saslprep-1.0.2.tgz", 1234 | "integrity": "sha512-4cDsYuAjXssUSjxHKRe4DTZC0agDwsCqcMqtJAQPzC74nJ7LfAJflAtC1Zed5hMzEQKj82d3tuzqdGNRsLJ4Gw==", 1235 | "optional": true, 1236 | "requires": { 1237 | "sparse-bitfield": "^3.0.3" 1238 | } 1239 | }, 1240 | "semver": { 1241 | "version": "5.6.0", 1242 | "resolved": "https://registry.npmjs.org/semver/-/semver-5.6.0.tgz", 1243 | "integrity": "sha512-RS9R6R35NYgQn++fkDWaOmqGoj4Ek9gGs+DPxNUZKuwE183xjJroKvyo1IzVFeXvUrvmALy6FWD5xrdJT25gMg==" 1244 | }, 1245 | "shebang-command": { 1246 | "version": "1.2.0", 1247 | "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", 1248 | "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", 1249 | "dev": true, 1250 | "requires": { 1251 | "shebang-regex": "^1.0.0" 1252 | } 1253 | }, 1254 | "shebang-regex": { 1255 | "version": "1.0.0", 1256 | "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", 1257 | "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", 1258 | "dev": true 1259 | }, 1260 | "signal-exit": { 1261 | "version": "3.0.2", 1262 | "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", 1263 | "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=", 1264 | "dev": true 1265 | }, 1266 | "slice-ansi": { 1267 | "version": "1.0.0", 1268 | "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-1.0.0.tgz", 1269 | "integrity": "sha512-POqxBK6Lb3q6s047D/XsDVNPnF9Dl8JSaqe9h9lURl0OdNqy/ujDrOiIHtsqXMGbWWTIomRzAMaTyawAU//Reg==", 1270 | "dev": true, 1271 | "requires": { 1272 | "is-fullwidth-code-point": "^2.0.0" 1273 | } 1274 | }, 1275 | "sparse-bitfield": { 1276 | "version": "3.0.3", 1277 | "resolved": "https://registry.npmjs.org/sparse-bitfield/-/sparse-bitfield-3.0.3.tgz", 1278 | "integrity": "sha1-/0rm5oZWBWuks+eSqzM004JzyhE=", 1279 | "optional": true, 1280 | "requires": { 1281 | "memory-pager": "^1.0.2" 1282 | } 1283 | }, 1284 | "split": { 1285 | "version": "1.0.1", 1286 | "resolved": "https://registry.npmjs.org/split/-/split-1.0.1.tgz", 1287 | "integrity": "sha512-mTyOoPbrivtXnwnIxZRFYRrPNtEFKlpB2fvjSnCQUiAA6qAZzqwna5envK4uk6OIeP17CsdF3rSBGYVBsU0Tkg==", 1288 | "dev": true, 1289 | "requires": { 1290 | "through": "2" 1291 | } 1292 | }, 1293 | "sprintf-js": { 1294 | "version": "1.0.3", 1295 | "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", 1296 | "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", 1297 | "dev": true 1298 | }, 1299 | "string-width": { 1300 | "version": "2.1.1", 1301 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", 1302 | "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", 1303 | "dev": true, 1304 | "requires": { 1305 | "is-fullwidth-code-point": "^2.0.0", 1306 | "strip-ansi": "^4.0.0" 1307 | }, 1308 | "dependencies": { 1309 | "ansi-regex": { 1310 | "version": "3.0.0", 1311 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", 1312 | "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", 1313 | "dev": true 1314 | }, 1315 | "strip-ansi": { 1316 | "version": "4.0.0", 1317 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", 1318 | "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", 1319 | "dev": true, 1320 | "requires": { 1321 | "ansi-regex": "^3.0.0" 1322 | } 1323 | } 1324 | } 1325 | }, 1326 | "string_decoder": { 1327 | "version": "1.1.1", 1328 | "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", 1329 | "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", 1330 | "dev": true, 1331 | "requires": { 1332 | "safe-buffer": "~5.1.0" 1333 | } 1334 | }, 1335 | "strip-ansi": { 1336 | "version": "3.0.1", 1337 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", 1338 | "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", 1339 | "dev": true, 1340 | "requires": { 1341 | "ansi-regex": "^2.0.0" 1342 | } 1343 | }, 1344 | "strip-json-comments": { 1345 | "version": "2.0.1", 1346 | "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", 1347 | "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", 1348 | "dev": true 1349 | }, 1350 | "supports-color": { 1351 | "version": "2.0.0", 1352 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", 1353 | "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", 1354 | "dev": true 1355 | }, 1356 | "table": { 1357 | "version": "5.1.0", 1358 | "resolved": "https://registry.npmjs.org/table/-/table-5.1.0.tgz", 1359 | "integrity": "sha512-e542in22ZLhD/fOIuXs/8yDZ9W61ltF8daM88rkRNtgTIct+vI2fTnAyu/Db2TCfEcI8i7mjZz6meLq0nW7TYg==", 1360 | "dev": true, 1361 | "requires": { 1362 | "ajv": "^6.5.3", 1363 | "lodash": "^4.17.10", 1364 | "slice-ansi": "1.0.0", 1365 | "string-width": "^2.1.1" 1366 | } 1367 | }, 1368 | "tapdance": { 1369 | "version": "5.1.1", 1370 | "resolved": "https://registry.npmjs.org/tapdance/-/tapdance-5.1.1.tgz", 1371 | "integrity": "sha512-vL8aVPZseZbF7iCdGQZwKnn/B+ZEyw95sU3aBJ7ATOmMSYriBLzGgUev3wZKC4gBPa3X85jdlQnwPwjvzk/tAw==", 1372 | "dev": true 1373 | }, 1374 | "text-table": { 1375 | "version": "0.2.0", 1376 | "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", 1377 | "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", 1378 | "dev": true 1379 | }, 1380 | "through": { 1381 | "version": "2.3.8", 1382 | "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", 1383 | "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", 1384 | "dev": true 1385 | }, 1386 | "tmp": { 1387 | "version": "0.0.33", 1388 | "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", 1389 | "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", 1390 | "dev": true, 1391 | "requires": { 1392 | "os-tmpdir": "~1.0.2" 1393 | } 1394 | }, 1395 | "tslib": { 1396 | "version": "1.9.3", 1397 | "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.9.3.tgz", 1398 | "integrity": "sha512-4krF8scpejhaOgqzBEcGM7yDIEfi0/8+8zDRZhNZZ2kjmHJ4hv3zCbQWxoJGz1iw5U0Jl0nma13xzHXcncMavQ==", 1399 | "dev": true 1400 | }, 1401 | "type-check": { 1402 | "version": "0.3.2", 1403 | "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", 1404 | "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", 1405 | "dev": true, 1406 | "requires": { 1407 | "prelude-ls": "~1.1.2" 1408 | } 1409 | }, 1410 | "uri-js": { 1411 | "version": "4.2.2", 1412 | "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz", 1413 | "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==", 1414 | "dev": true, 1415 | "requires": { 1416 | "punycode": "^2.1.0" 1417 | } 1418 | }, 1419 | "util-deprecate": { 1420 | "version": "1.0.2", 1421 | "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", 1422 | "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", 1423 | "dev": true 1424 | }, 1425 | "which": { 1426 | "version": "1.3.1", 1427 | "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", 1428 | "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", 1429 | "dev": true, 1430 | "requires": { 1431 | "isexe": "^2.0.0" 1432 | } 1433 | }, 1434 | "wordwrap": { 1435 | "version": "1.0.0", 1436 | "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", 1437 | "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=", 1438 | "dev": true 1439 | }, 1440 | "wrappy": { 1441 | "version": "1.0.2", 1442 | "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", 1443 | "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", 1444 | "dev": true 1445 | }, 1446 | "write": { 1447 | "version": "0.2.1", 1448 | "resolved": "https://registry.npmjs.org/write/-/write-0.2.1.tgz", 1449 | "integrity": "sha1-X8A4KOJkzqP+kUVUdvejxWbLB1c=", 1450 | "dev": true, 1451 | "requires": { 1452 | "mkdirp": "^0.5.1" 1453 | } 1454 | } 1455 | } 1456 | } 1457 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "fortune-mongodb", 3 | "description": "MongoDB adapter for Fortune.", 4 | "version": "1.3.2", 5 | "license": "MIT", 6 | "repository": { 7 | "type": "git", 8 | "url": "https://github.com/fortunejs/fortune-mongodb" 9 | }, 10 | "scripts": { 11 | "lint": "eslint lib", 12 | "test": "npm run lint && node test | tf-dot", 13 | "postpublish": "git tag `npm v fortune-mongodb version` && git push origin --tags" 14 | }, 15 | "main": "./lib/index.js", 16 | "dependencies": { 17 | "mongodb": "^3.1.8" 18 | }, 19 | "devDependencies": { 20 | "@tap-format/dot": "^0.3.0", 21 | "chalk": "^2.4.1", 22 | "eslint": "^5.7.0", 23 | "eslint-config-boss": "^1.0.6", 24 | "fortune": "^5.5.14", 25 | "mkdirp": "^0.5.1", 26 | "rimraf": "^2.6.2", 27 | "tapdance": "^5.1.1" 28 | }, 29 | "files": [ 30 | "lib/", 31 | "LICENSE" 32 | ], 33 | "eslintConfig": { 34 | "extends": "boss", 35 | "rules": { 36 | "strict": 0 37 | } 38 | }, 39 | "engines": { 40 | "node": ">=8" 41 | }, 42 | "keywords": [ 43 | "fortune", 44 | "mongodb", 45 | "adapter" 46 | ] 47 | } 48 | -------------------------------------------------------------------------------- /test/index.js: -------------------------------------------------------------------------------- 1 | const testAdapter = require('fortune/test/adapter') 2 | const adapter = require('../lib') 3 | 4 | testAdapter(adapter, { 5 | url: 'mongodb://localhost:27017/test', 6 | generateId: () => Math.floor(Math.random() * Math.pow(2, 32)).toString(16) 7 | }) 8 | --------------------------------------------------------------------------------