├── .editorconfig ├── .eslintignore ├── .eslintrc ├── .gitignore ├── .npmignore ├── .travis.yml ├── CHANGELOG.md ├── CODE_OF_CONDUCT.md ├── CONTRIBUTING.md ├── LICENSE ├── README.md ├── index.js ├── lib └── queue.js ├── package-lock.json ├── package.json └── test └── microq.js /.editorconfig: -------------------------------------------------------------------------------- 1 | # editorconfig.org 2 | 3 | root = true 4 | 5 | [*] 6 | charset = utf-8 7 | indent_size = 2 8 | end_of_line = lf 9 | indent_style = space 10 | insert_final_newline = false 11 | trim_trailing_whitespace = true 12 | 13 | [*.md] 14 | trim_trailing_whitespace = false 15 | -------------------------------------------------------------------------------- /.eslintignore: -------------------------------------------------------------------------------- 1 | coverage/** -------------------------------------------------------------------------------- /.eslintrc: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "eslint:recommended", 3 | "parserOptions": { 4 | "ecmaVersion": 2017, 5 | "sourceType": "module" 6 | }, 7 | "env": { 8 | "es6": true, 9 | "node": true, 10 | "mocha": true 11 | } 12 | } -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # test related 2 | coverage/ 3 | .nyc_output/ 4 | testing 5 | testapp 6 | 7 | # OSX 8 | .DS_Store 9 | 10 | # npm 11 | node_modules 12 | npm-debug.log 13 | 14 | # IDE 15 | .idea/ 16 | *~ 17 | *.swp 18 | 19 | # Things 20 | README.html 21 | *.tgz 22 | docs/ 23 | -------------------------------------------------------------------------------- /.npmignore: -------------------------------------------------------------------------------- 1 | test 2 | examples 3 | coverage 4 | .nyc_output 5 | docs 6 | .idea 7 | .gitattributes 8 | *.tgz 9 | *~ 10 | .travis.yml 11 | gulpfile.js 12 | -------------------------------------------------------------------------------- /.travis.yml: -------------------------------------------------------------------------------- 1 | language: node_js 2 | 3 | sudo: false 4 | 5 | node_js: 6 | - "8" 7 | - "9" 8 | 9 | env: 10 | - MONGODB_VERSION="2.6.12" 11 | - MONGODB_VERSION="3.0.15" 12 | - MONGODB_VERSION="3.2.16" 13 | - MONGODB_VERSION="3.4.7" 14 | - MONGODB_VERSION="3.4.10" 15 | 16 | before_script: 17 | - wget http://fastdl.mongodb.org/linux/mongodb-linux-x86_64-${MONGODB_VERSION}.tgz -O /tmp/mongodb.tgz 18 | - tar -xvf /tmp/mongodb.tgz 19 | - mkdir /tmp/data 20 | - ${PWD}/mongodb-linux-x86_64-${MONGODB_VERSION}/bin/mongod --dbpath /tmp/data &> /dev/null & 21 | - ${PWD}/mongodb-linux-x86_64-${MONGODB_VERSION}/bin/mongod --version 22 | - until nc -z localhost 27017; do echo Waiting for MongoDB; sleep 1; done 23 | 24 | after_success: npm run coverage -------------------------------------------------------------------------------- /CHANGELOG.md: -------------------------------------------------------------------------------- 1 | 1.1.0 / 2017-09-19 2 | ================== 3 | 4 | * 1.1.0 5 | * feat: implement parallel and serial options 6 | 7 | 1.0.1 / 2017-09-15 8 | ================== 9 | 10 | * 1.0.1 11 | * Ignore coverage js files in eslint 12 | * Switch to mongoist a promisified connection managing mongodb driver 13 | * Merge branch 'master' of github.com:saintedlama/microq 14 | * Ignore nyc output 15 | * Add eslint 16 | * Remove unused variables and arguments 17 | * Remove superfluous setImmediate 18 | * Update CONTRIBUTING.md 19 | * Create CONTRIBUTING.md 20 | * Merge pull request [#1](https://github.com/saintedlama/microq/issues/1) from saintedlama/add-code-of-conduct-1 21 | Create CODE_OF_CONDUCT.md 22 | * Create CODE_OF_CONDUCT.md 23 | 24 | 1.0.0 / 2017-09-13 25 | ================== 26 | 27 | * Add badges 28 | * Add README.md 29 | * initial commit 30 | -------------------------------------------------------------------------------- /CODE_OF_CONDUCT.md: -------------------------------------------------------------------------------- 1 | # Contributor Covenant Code of Conduct 2 | 3 | ## Our Pledge 4 | 5 | In the interest of fostering an open and welcoming environment, we as contributors and maintainers pledge to making participation in our project and our community a harassment-free experience for everyone, regardless of age, body size, disability, ethnicity, gender identity and expression, level of experience, nationality, personal appearance, race, religion, or sexual identity and orientation. 6 | 7 | ## Our Standards 8 | 9 | Examples of behavior that contributes to creating a positive environment include: 10 | 11 | * Using welcoming and inclusive language 12 | * Being respectful of differing viewpoints and experiences 13 | * Gracefully accepting constructive criticism 14 | * Focusing on what is best for the community 15 | * Showing empathy towards other community members 16 | 17 | Examples of unacceptable behavior by participants include: 18 | 19 | * The use of sexualized language or imagery and unwelcome sexual attention or advances 20 | * Trolling, insulting/derogatory comments, and personal or political attacks 21 | * Public or private harassment 22 | * Publishing others' private information, such as a physical or electronic address, without explicit permission 23 | * Other conduct which could reasonably be considered inappropriate in a professional setting 24 | 25 | ## Our Responsibilities 26 | 27 | Project maintainers are responsible for clarifying the standards of acceptable behavior and are expected to take appropriate and fair corrective action in response to any instances of unacceptable behavior. 28 | 29 | Project maintainers have the right and responsibility to remove, edit, or reject comments, commits, code, wiki edits, issues, and other contributions that are not aligned to this Code of Conduct, or to ban temporarily or permanently any contributor for other behaviors that they deem inappropriate, threatening, offensive, or harmful. 30 | 31 | ## Scope 32 | 33 | This Code of Conduct applies both within project spaces and in public spaces when an individual is representing the project or its community. Examples of representing a project or community include using an official project e-mail address, posting via an official social media account, or acting as an appointed representative at an online or offline event. Representation of a project may be further defined and clarified by project maintainers. 34 | 35 | ## Enforcement 36 | 37 | Instances of abusive, harassing, or otherwise unacceptable behavior may be reported by contacting the project team at Christoph.Walcher@gmail.com. The project team will review and investigate all complaints, and will respond in a way that it deems appropriate to the circumstances. The project team is obligated to maintain confidentiality with regard to the reporter of an incident. Further details of specific enforcement policies may be posted separately. 38 | 39 | Project maintainers who do not follow or enforce the Code of Conduct in good faith may face temporary or permanent repercussions as determined by other members of the project's leadership. 40 | 41 | ## Attribution 42 | 43 | This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4, available at [http://contributor-covenant.org/version/1/4][version] 44 | 45 | [homepage]: http://contributor-covenant.org 46 | [version]: http://contributor-covenant.org/version/1/4/ 47 | -------------------------------------------------------------------------------- /CONTRIBUTING.md: -------------------------------------------------------------------------------- 1 | # Contributing to Microq 2 | 3 | :+1::tada: First off, thanks for taking the time to contribute! :tada::+1: 4 | 5 | The following is a set of guidelines for contributing to microq. 6 | These are just guidelines, not rules, use your best judgment and feel free to 7 | propose changes to this document in a pull request. 8 | 9 | This project adheres to the code of conduct https://github.com/saintedlama/microq/blob/master/CODE_OF_CONDUCT.md. 10 | By participating, you are expected to uphold this code. 11 | 12 | ## Submitting Issues 13 | 14 | * You can create an issue [here](https://github.com/saintedlama/microq/issues/new), but 15 | before doing that please read the notes below on debugging and submitting issues, 16 | and include as many details as possible with your report. 17 | * Include the version of microq you are using. 18 | * Include some source code snippet to demo the issue 19 | * Include a stack trace and error message if applicable 20 | 21 | ## Pull Requests 22 | 23 | * Run the tests before creating a pull requests (`npm test`). 24 | * Include tests in the `test` directory. 25 | * Update `README.md` if your pull request adds/changes functionality 26 | 27 | ## Git Commit Messages 28 | 29 | * Use the present tense ("Add feature" not "Added feature") 30 | * Use the imperative mood ("Open database when..." not "Opens database when...") 31 | * Limit the first line to 72 characters or less 32 | * Reference issues and pull requests liberally 33 | * Consider starting the commit message with an applicable emoji: 34 | * :art: `:art:` when improving the format/structure of the code 35 | * :racehorse: `:racehorse:` when improving performance 36 | * :non-potable_water: `:non-potable_water:` when plugging memory leaks 37 | * :memo: `:memo:` when writing docs 38 | * :bug: `:bug:` when fixing a bug 39 | * :fire: `:fire:` when removing code or files 40 | * :green_heart: `:green_heart:` when fixing the CI build 41 | * :white_check_mark: `:white_check_mark:` when adding tests 42 | * :lock: `:lock:` when dealing with security 43 | * :arrow_up: `:arrow_up:` when upgrading dependencies 44 | * :arrow_down: `:arrow_down:` when downgrading dependencies 45 | * :shirt: `:shirt:` when removing linter warnings 46 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | Copyright (c) 2017, Christoph Walcher <christoph.walcher@gmail.com> 2 | 3 | Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. 4 | 5 | THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # microq 2 | 3 | [![Build Status](https://travis-ci.org/saintedlama/microq.svg?branch=master)](https://travis-ci.org/saintedlama/microq) 4 | [![Coverage Status](https://coveralls.io/repos/github/saintedlama/microq/badge.svg?branch=master)](https://coveralls.io/github/saintedlama/microq?branch=master) 5 | [![microq analyzed by Codellama.io](https://app.codellama.io/api/badges/5a04388b1b4c363a0f9427b3/4e1ef4e8caa46432342aebc78f892a34)](https://app.codellama.io/repositories/5a04388b1b4c363a0f9427b3) 6 | 7 | Microq is a simple but reliable message queue built on mongodb. 8 | 9 | ## Installation 10 | 11 | ```bash 12 | $ npm install microq 13 | ``` 14 | 15 | **Notice** microq needs async/await support. So use node.js 8.x please 16 | 17 | ## Usage 18 | 19 | ### Adding a job 20 | 21 | ```javascript 22 | const microq = require('microq'); 23 | const queue = microq(connectionUrl); 24 | 25 | const job = await queue.enqueue('foo', { data: 'hello' }); 26 | ``` 27 | 28 | ### Starting workers 29 | 30 | ```javascript 31 | const microq = require('microq'); 32 | const queue = microq(connectionUrl); 33 | 34 | queue.start({ 35 | foo(params, job) => { 36 | // Work on job data passed in params ({ data: 'hello' }) 37 | // To fail, throw an error 38 | // To succeed return something, even undefined is accepted:) 39 | } 40 | }, { interval: 500 }); 41 | ``` 42 | 43 | **Notice** microq uses the `debug` (https://www.npmjs.com/package/debug) with prefix *microq*. So if you need some log output turn debug on. 44 | 45 | ## Writing a worker 46 | 47 | Microq supports workers to use async/await or to return Promises. A worker may throw an exception to fail. The queue will NOT shut down if a worker fails. 48 | 49 | Worker function should return a promise or should be defined as async functions. 50 | 51 | ```javascript 52 | async foo(params, job) => { 53 | await something(); 54 | 55 | await somthingOther(); 56 | 57 | // ... 58 | return; 59 | } 60 | ``` 61 | 62 | In case the worker queue is started with option `parallel` set to `false` this allows the worker queue to wait until 63 | the job finishes and to set the status of the job correctly. 64 | 65 | ## API 66 | 67 | ### `microq(connectionUrl, [options])` 68 | 69 | Creates a new queue connected to a mongodb database specified by connectionUrl. You can optionally pass connection options to mongodb. 70 | 71 | ### `queue.enqueue(jobName, [params], [options])` 72 | 73 | Enqueues a job with name *jobName* and optional params passed to the worker. 74 | 75 | **Options** 76 | 77 | * *priority* - defines the dequeue priority. jobs with higher priority are dequeued first. 78 | 79 | **Returns** a promise resolving to the persisted job 80 | 81 | ### `queue.start(workers, options)` 82 | 83 | Starts the queue with workers passed in the workers object. A worker must be a function. 84 | 85 | **Options** 86 | 87 | * *recover* (Boolean) - Defines if jobs that are in status *dequeued* should be recovered when starting the queue. Defaults to `true`. 88 | * *interval* (number in milliseconds) - Defines the poll interval. Defaults to `5000` ms. 89 | * *parallel* (Boolean) - Defines whether jobs are executed in parallel. Defaults to `true`. 90 | 91 | ### `queue.query(status)` 92 | 93 | Query the queue for jobs with the given status. Status must be one of *enqueued*, *dequeued*, *completed*, *failed*. 94 | 95 | **Returns** a promise resolving to a list of jobs 96 | 97 | ### `queue.recover()` 98 | 99 | Updates all jobs currently in *dequeue* status to *enqueued* status and adds a date field *recoveredAt* 100 | 101 | ### `queue.cleanup([date])` 102 | 103 | Removes all jobs before a specified date (new Date() if not given) in status *completed* or *failed*. 104 | 105 | ### `queue.stop()` 106 | 107 | Stops polling. No workers are started after stopping the queue. 108 | 109 | ## Events 110 | 111 | The queue object returned by `microq(connectionUrl)` is an EventEmitter emitting events: 112 | 113 | * *failed* - A worker failed to process a job 114 | * *completed* - A woker processed a job successfully 115 | * *empty* - The job queue is currently empty 116 | -------------------------------------------------------------------------------- /index.js: -------------------------------------------------------------------------------- 1 | const Queue = require('./lib/queue'); 2 | 3 | module.exports = function(connectionUrl, options) { 4 | return new Queue(connectionUrl, options); 5 | } -------------------------------------------------------------------------------- /lib/queue.js: -------------------------------------------------------------------------------- 1 | const { EventEmitter } = require('events'); 2 | const mongoist = require('mongoist'); 3 | const debug = require('debug')('microq'); 4 | 5 | module.exports = class Queue extends EventEmitter { 6 | constructor(connectionUrl, connectionOptions) { 7 | super(); 8 | 9 | const db = mongoist(connectionUrl, connectionOptions); 10 | this.jobs = db.jobs; 11 | } 12 | 13 | enqueue(name, params, options) { 14 | options = options || {}; 15 | 16 | const job = { 17 | name: name, 18 | status: 'enqueued', 19 | params: params, 20 | priority: options.priority, 21 | enqueuedAt: new Date(), 22 | }; 23 | 24 | debug(`Enqueuing job ${name}`); 25 | 26 | return this.jobs.insert(job); 27 | } 28 | 29 | async start(workers, options) { 30 | options = options || {}; 31 | options.interval = options.interval || 5000; 32 | options.recover = (options.recover === false) ? options.recover : true; 33 | options.parallel = (options.parallel === false) ? options.parallel : true; 34 | 35 | this.started = true; 36 | 37 | if (options.recover) { 38 | await this.recover(); 39 | } 40 | 41 | const poll = async () => { 42 | if (!this.started) { 43 | this.emit('stopped'); 44 | 45 | return; 46 | } 47 | 48 | const job = await this.dequeue(workers); 49 | 50 | if (!job) { 51 | setTimeout(poll, options.interval); 52 | 53 | return; 54 | } 55 | 56 | if (options.parallel) { 57 | this.executeWorker(workers[job.name], job); 58 | } else { 59 | await this.executeWorker(workers[job.name], job); 60 | } 61 | 62 | setImmediate(poll); 63 | } 64 | 65 | poll(); 66 | } 67 | 68 | async executeWorker(worker, job) { 69 | debug(`Processing worker for job ${job.name}...`); 70 | 71 | try { 72 | const result = await worker(job.params, job); 73 | 74 | const jobResult = await this.jobs.findAndModify({ 75 | query: { _id: job._id }, 76 | update: { $set: { status: 'completed', result, endedAt: new Date() }}, 77 | new: true 78 | }); 79 | 80 | debug(`Worker for job ${job.name} completed`); 81 | 82 | this.emit('completed', jobResult); 83 | } catch (e) { 84 | const jobResult = await this.jobs.findAndModify({ 85 | query: { _id: job._id }, 86 | update: { $set: { status: 'failed', error: e.message, stack: e.stack, endedAt: new Date() }}, 87 | new: true 88 | }); 89 | 90 | debug(e, `Worker for job ${job.name} failed`); 91 | 92 | this.emit('failed', jobResult); 93 | } 94 | } 95 | 96 | async dequeue(workers) { 97 | const query = { 98 | status: 'enqueued', 99 | name: { $in: Object.keys(workers) } 100 | }; 101 | 102 | const sort = { 103 | priority: -1, 104 | _id: 1 105 | }; 106 | 107 | const update = { $set: { status: 'dequeued', dequeuedAt: new Date() }}; 108 | 109 | debug(`Querying job queue for new jobs`); 110 | 111 | const job = await this.jobs.findAndModify({ 112 | query: query, 113 | sort: sort, 114 | update: update, 115 | new: true 116 | }); 117 | 118 | if (!job) { 119 | debug(`Job queue is empty`); 120 | this.emit('empty'); 121 | } 122 | 123 | return job; 124 | } 125 | 126 | recover() { 127 | return this.jobs.update({ status: 'dequeued' }, { $set: { status: 'enqueued', recoveredAt: new Date() }}, { multi: true}); 128 | } 129 | 130 | query(status) { 131 | status = status || 'enqueued'; 132 | 133 | return this.jobs.find({ status }); 134 | } 135 | 136 | cleanup(beforeDate) { 137 | beforeDate = beforeDate || new Date(); 138 | 139 | return this.jobs.remove({ status: { $in: ['completed', 'failed' ]}, enqueuedAt: { $lte: beforeDate }}); 140 | } 141 | 142 | stop() { 143 | this.started = false; 144 | } 145 | } -------------------------------------------------------------------------------- /package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "microq", 3 | "version": "1.1.0", 4 | "lockfileVersion": 1, 5 | "requires": true, 6 | "dependencies": { 7 | "acorn": { 8 | "version": "5.1.2", 9 | "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.1.2.tgz", 10 | "integrity": "sha512-o96FZLJBPY1lvTuJylGA9Bk3t/GKPPJG8H0ydQQl01crzwJgspa4AEIq/pVTXigmK0PHVQhiAtn8WMBLL9D2WA==", 11 | "dev": true 12 | }, 13 | "acorn-jsx": { 14 | "version": "3.0.1", 15 | "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-3.0.1.tgz", 16 | "integrity": "sha1-r9+UiPsezvyDSPb7IvRk4ypYs2s=", 17 | "dev": true, 18 | "requires": { 19 | "acorn": "3.3.0" 20 | }, 21 | "dependencies": { 22 | "acorn": { 23 | "version": "3.3.0", 24 | "resolved": "https://registry.npmjs.org/acorn/-/acorn-3.3.0.tgz", 25 | "integrity": "sha1-ReN/s56No/JbruP/U2niu18iAXo=", 26 | "dev": true 27 | } 28 | } 29 | }, 30 | "ajv": { 31 | "version": "5.2.2", 32 | "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.2.2.tgz", 33 | "integrity": "sha1-R8aNaehvXZUxA7AHSpQw3GPaXjk=", 34 | "dev": true, 35 | "requires": { 36 | "co": "4.6.0", 37 | "fast-deep-equal": "1.0.0", 38 | "json-schema-traverse": "0.3.1", 39 | "json-stable-stringify": "1.0.1" 40 | } 41 | }, 42 | "ajv-keywords": { 43 | "version": "1.5.1", 44 | "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-1.5.1.tgz", 45 | "integrity": "sha1-MU3QpLM2j609/NxU7eYXG4htrzw=", 46 | "dev": true 47 | }, 48 | "ansi-escapes": { 49 | "version": "2.0.0", 50 | "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-2.0.0.tgz", 51 | "integrity": "sha1-W65SvkJIeN2Xg+iRDj/Cki6DyBs=", 52 | "dev": true 53 | }, 54 | "ansi-regex": { 55 | "version": "2.1.1", 56 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", 57 | "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", 58 | "dev": true 59 | }, 60 | "ansi-styles": { 61 | "version": "2.2.1", 62 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", 63 | "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", 64 | "dev": true 65 | }, 66 | "argparse": { 67 | "version": "1.0.9", 68 | "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.9.tgz", 69 | "integrity": "sha1-c9g7wmP4bpf4zE9rrhsOkKfSLIY=", 70 | "dev": true, 71 | "requires": { 72 | "sprintf-js": "1.0.3" 73 | } 74 | }, 75 | "array-union": { 76 | "version": "1.0.2", 77 | "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", 78 | "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=", 79 | "dev": true, 80 | "requires": { 81 | "array-uniq": "1.0.3" 82 | } 83 | }, 84 | "array-uniq": { 85 | "version": "1.0.3", 86 | "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", 87 | "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=", 88 | "dev": true 89 | }, 90 | "arrify": { 91 | "version": "1.0.1", 92 | "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", 93 | "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=", 94 | "dev": true 95 | }, 96 | "asn1": { 97 | "version": "0.2.3", 98 | "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.3.tgz", 99 | "integrity": "sha1-2sh4dxPJlmhJ/IGAd36+nB3fO4Y=", 100 | "dev": true 101 | }, 102 | "assert-plus": { 103 | "version": "0.2.0", 104 | "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-0.2.0.tgz", 105 | "integrity": "sha1-104bh+ev/A24qttwIfP+SBAasjQ=", 106 | "dev": true 107 | }, 108 | "assertion-error": { 109 | "version": "1.0.2", 110 | "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.0.2.tgz", 111 | "integrity": "sha1-E8pRXYYgbaC6xm6DTdOX2HWBCUw=", 112 | "dev": true 113 | }, 114 | "asynckit": { 115 | "version": "0.4.0", 116 | "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", 117 | "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", 118 | "dev": true 119 | }, 120 | "aws-sign2": { 121 | "version": "0.6.0", 122 | "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.6.0.tgz", 123 | "integrity": "sha1-FDQt0428yU0OW4fXY81jYSwOeU8=", 124 | "dev": true 125 | }, 126 | "aws4": { 127 | "version": "1.6.0", 128 | "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.6.0.tgz", 129 | "integrity": "sha1-g+9cqGCysy5KDe7e6MdxudtXRx4=", 130 | "dev": true 131 | }, 132 | "babel-code-frame": { 133 | "version": "6.26.0", 134 | "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz", 135 | "integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=", 136 | "dev": true, 137 | "requires": { 138 | "chalk": "1.1.3", 139 | "esutils": "2.0.2", 140 | "js-tokens": "3.0.2" 141 | } 142 | }, 143 | "balanced-match": { 144 | "version": "1.0.0", 145 | "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", 146 | "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", 147 | "dev": true 148 | }, 149 | "bcrypt-pbkdf": { 150 | "version": "1.0.1", 151 | "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.1.tgz", 152 | "integrity": "sha1-Y7xdy2EzG5K8Bf1SiVPDNGKgb40=", 153 | "dev": true, 154 | "optional": true, 155 | "requires": { 156 | "tweetnacl": "0.14.5" 157 | } 158 | }, 159 | "boom": { 160 | "version": "2.10.1", 161 | "resolved": "https://registry.npmjs.org/boom/-/boom-2.10.1.tgz", 162 | "integrity": "sha1-OciRjO/1eZ+D+UkqhI9iWt0Mdm8=", 163 | "dev": true, 164 | "requires": { 165 | "hoek": "2.16.3" 166 | } 167 | }, 168 | "brace-expansion": { 169 | "version": "1.1.8", 170 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.8.tgz", 171 | "integrity": "sha1-wHshHHyVLsH479Uad+8NHTmQopI=", 172 | "dev": true, 173 | "requires": { 174 | "balanced-match": "1.0.0", 175 | "concat-map": "0.0.1" 176 | } 177 | }, 178 | "browser-stdout": { 179 | "version": "1.3.0", 180 | "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.0.tgz", 181 | "integrity": "sha1-81HTKWnTL6XXpVZxVCY9korjvR8=", 182 | "dev": true 183 | }, 184 | "bson": { 185 | "version": "1.0.4", 186 | "resolved": "https://registry.npmjs.org/bson/-/bson-1.0.4.tgz", 187 | "integrity": "sha1-k8ENOeqltYQVy8QFLz5T5WKwtyw=" 188 | }, 189 | "buffer-shims": { 190 | "version": "1.0.0", 191 | "resolved": "https://registry.npmjs.org/buffer-shims/-/buffer-shims-1.0.0.tgz", 192 | "integrity": "sha1-mXjOMXOIxkmth5MCjDR37wRKi1E=" 193 | }, 194 | "caller-path": { 195 | "version": "0.1.0", 196 | "resolved": "https://registry.npmjs.org/caller-path/-/caller-path-0.1.0.tgz", 197 | "integrity": "sha1-lAhe9jWB7NPaqSREqP6U6CV3dR8=", 198 | "dev": true, 199 | "requires": { 200 | "callsites": "0.2.0" 201 | } 202 | }, 203 | "callsites": { 204 | "version": "0.2.0", 205 | "resolved": "https://registry.npmjs.org/callsites/-/callsites-0.2.0.tgz", 206 | "integrity": "sha1-r6uWJikQp/M8GaV3WCXGnzTjUMo=", 207 | "dev": true 208 | }, 209 | "caseless": { 210 | "version": "0.11.0", 211 | "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.11.0.tgz", 212 | "integrity": "sha1-cVuW6phBWTzDMGeSP17GDr2k99c=", 213 | "dev": true 214 | }, 215 | "chai": { 216 | "version": "4.1.2", 217 | "resolved": "https://registry.npmjs.org/chai/-/chai-4.1.2.tgz", 218 | "integrity": "sha1-D2RYS6ZC8PKs4oBiefTwbKI61zw=", 219 | "dev": true, 220 | "requires": { 221 | "assertion-error": "1.0.2", 222 | "check-error": "1.0.2", 223 | "deep-eql": "3.0.1", 224 | "get-func-name": "2.0.0", 225 | "pathval": "1.1.0", 226 | "type-detect": "4.0.3" 227 | } 228 | }, 229 | "chalk": { 230 | "version": "1.1.3", 231 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", 232 | "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", 233 | "dev": true, 234 | "requires": { 235 | "ansi-styles": "2.2.1", 236 | "escape-string-regexp": "1.0.5", 237 | "has-ansi": "2.0.0", 238 | "strip-ansi": "3.0.1", 239 | "supports-color": "2.0.0" 240 | }, 241 | "dependencies": { 242 | "supports-color": { 243 | "version": "2.0.0", 244 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", 245 | "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", 246 | "dev": true 247 | } 248 | } 249 | }, 250 | "check-error": { 251 | "version": "1.0.2", 252 | "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.2.tgz", 253 | "integrity": "sha1-V00xLt2Iu13YkS6Sht1sCu1KrII=", 254 | "dev": true 255 | }, 256 | "circular-json": { 257 | "version": "0.3.3", 258 | "resolved": "https://registry.npmjs.org/circular-json/-/circular-json-0.3.3.tgz", 259 | "integrity": "sha512-UZK3NBx2Mca+b5LsG7bY183pHWt5Y1xts4P3Pz7ENTwGVnJOUWbRb3ocjvX7hx9tq/yTAdclXm9sZ38gNuem4A==", 260 | "dev": true 261 | }, 262 | "cli-cursor": { 263 | "version": "2.1.0", 264 | "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz", 265 | "integrity": "sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU=", 266 | "dev": true, 267 | "requires": { 268 | "restore-cursor": "2.0.0" 269 | } 270 | }, 271 | "cli-width": { 272 | "version": "2.2.0", 273 | "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.0.tgz", 274 | "integrity": "sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk=", 275 | "dev": true 276 | }, 277 | "co": { 278 | "version": "4.6.0", 279 | "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", 280 | "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=", 281 | "dev": true 282 | }, 283 | "color-convert": { 284 | "version": "1.9.0", 285 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.0.tgz", 286 | "integrity": "sha1-Gsz5fdc5uYO/mU1W/sj5WFNkG3o=", 287 | "dev": true, 288 | "requires": { 289 | "color-name": "1.1.3" 290 | } 291 | }, 292 | "color-name": { 293 | "version": "1.1.3", 294 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", 295 | "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", 296 | "dev": true 297 | }, 298 | "combined-stream": { 299 | "version": "1.0.5", 300 | "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.5.tgz", 301 | "integrity": "sha1-k4NwpXtKUd6ix3wV1cX9+JUWQAk=", 302 | "dev": true, 303 | "requires": { 304 | "delayed-stream": "1.0.0" 305 | } 306 | }, 307 | "commander": { 308 | "version": "2.9.0", 309 | "resolved": "https://registry.npmjs.org/commander/-/commander-2.9.0.tgz", 310 | "integrity": "sha1-nJkJQXbhIkDLItbFFGCYQA/g99Q=", 311 | "dev": true, 312 | "requires": { 313 | "graceful-readlink": "1.0.1" 314 | } 315 | }, 316 | "concat-map": { 317 | "version": "0.0.1", 318 | "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", 319 | "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", 320 | "dev": true 321 | }, 322 | "concat-stream": { 323 | "version": "1.6.0", 324 | "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.0.tgz", 325 | "integrity": "sha1-CqxmL9Ur54lk1VMvaUeE5wEQrPc=", 326 | "dev": true, 327 | "requires": { 328 | "inherits": "2.0.3", 329 | "readable-stream": "2.3.3", 330 | "typedarray": "0.0.6" 331 | } 332 | }, 333 | "core-util-is": { 334 | "version": "1.0.2", 335 | "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", 336 | "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" 337 | }, 338 | "coveralls": { 339 | "version": "2.13.1", 340 | "resolved": "https://registry.npmjs.org/coveralls/-/coveralls-2.13.1.tgz", 341 | "integrity": "sha1-1wu5rMGDXsTwY/+drFQjwXsR8Xg=", 342 | "dev": true, 343 | "requires": { 344 | "js-yaml": "3.6.1", 345 | "lcov-parse": "0.0.10", 346 | "log-driver": "1.2.5", 347 | "minimist": "1.2.0", 348 | "request": "2.79.0" 349 | }, 350 | "dependencies": { 351 | "minimist": { 352 | "version": "1.2.0", 353 | "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", 354 | "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", 355 | "dev": true 356 | } 357 | } 358 | }, 359 | "cross-env": { 360 | "version": "5.0.5", 361 | "resolved": "https://registry.npmjs.org/cross-env/-/cross-env-5.0.5.tgz", 362 | "integrity": "sha1-Q4PTZNlmCHPdGFs5ivO/717//vM=", 363 | "dev": true, 364 | "requires": { 365 | "cross-spawn": "5.1.0", 366 | "is-windows": "1.0.1" 367 | } 368 | }, 369 | "cross-spawn": { 370 | "version": "5.1.0", 371 | "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz", 372 | "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=", 373 | "dev": true, 374 | "requires": { 375 | "lru-cache": "4.1.1", 376 | "shebang-command": "1.2.0", 377 | "which": "1.3.0" 378 | } 379 | }, 380 | "cryptiles": { 381 | "version": "2.0.5", 382 | "resolved": "https://registry.npmjs.org/cryptiles/-/cryptiles-2.0.5.tgz", 383 | "integrity": "sha1-O9/s3GCBR8HGcgL6KR59ylnqo7g=", 384 | "dev": true, 385 | "requires": { 386 | "boom": "2.10.1" 387 | } 388 | }, 389 | "dashdash": { 390 | "version": "1.14.1", 391 | "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", 392 | "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", 393 | "dev": true, 394 | "requires": { 395 | "assert-plus": "1.0.0" 396 | }, 397 | "dependencies": { 398 | "assert-plus": { 399 | "version": "1.0.0", 400 | "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", 401 | "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", 402 | "dev": true 403 | } 404 | } 405 | }, 406 | "debug": { 407 | "version": "3.0.1", 408 | "resolved": "https://registry.npmjs.org/debug/-/debug-3.0.1.tgz", 409 | "integrity": "sha512-6nVc6S36qbt/mutyt+UGMnawAMrPDZUPQjRZI3FS9tCtDRhvxJbK79unYBLPi+z5SLXQ3ftoVBFCblQtNSls8w==", 410 | "requires": { 411 | "ms": "2.0.0" 412 | } 413 | }, 414 | "deep-eql": { 415 | "version": "3.0.1", 416 | "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-3.0.1.tgz", 417 | "integrity": "sha512-+QeIQyN5ZuO+3Uk5DYh6/1eKO0m0YmJFGNmFHGACpf1ClL1nmlV/p4gNgbl2pJGxgXb4faqo6UE+M5ACEMyVcw==", 418 | "dev": true, 419 | "requires": { 420 | "type-detect": "4.0.3" 421 | } 422 | }, 423 | "deep-is": { 424 | "version": "0.1.3", 425 | "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", 426 | "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=", 427 | "dev": true 428 | }, 429 | "del": { 430 | "version": "2.2.2", 431 | "resolved": "https://registry.npmjs.org/del/-/del-2.2.2.tgz", 432 | "integrity": "sha1-wSyYHQZ4RshLyvhiz/kw2Qf/0ag=", 433 | "dev": true, 434 | "requires": { 435 | "globby": "5.0.0", 436 | "is-path-cwd": "1.0.0", 437 | "is-path-in-cwd": "1.0.0", 438 | "object-assign": "4.1.1", 439 | "pify": "2.3.0", 440 | "pinkie-promise": "2.0.1", 441 | "rimraf": "2.6.2" 442 | } 443 | }, 444 | "delayed-stream": { 445 | "version": "1.0.0", 446 | "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", 447 | "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", 448 | "dev": true 449 | }, 450 | "diff": { 451 | "version": "3.2.0", 452 | "resolved": "https://registry.npmjs.org/diff/-/diff-3.2.0.tgz", 453 | "integrity": "sha1-yc45Okt8vQsFinJck98pkCeGj/k=", 454 | "dev": true 455 | }, 456 | "doctrine": { 457 | "version": "2.0.0", 458 | "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.0.0.tgz", 459 | "integrity": "sha1-xz2NKQnSIpHhoAejlYBNqLZl/mM=", 460 | "dev": true, 461 | "requires": { 462 | "esutils": "2.0.2", 463 | "isarray": "1.0.0" 464 | } 465 | }, 466 | "ecc-jsbn": { 467 | "version": "0.1.1", 468 | "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.1.tgz", 469 | "integrity": "sha1-D8c6ntXw1Tw4GTOYUj735UN3dQU=", 470 | "dev": true, 471 | "optional": true, 472 | "requires": { 473 | "jsbn": "0.1.1" 474 | } 475 | }, 476 | "es6-promise": { 477 | "version": "3.2.1", 478 | "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-3.2.1.tgz", 479 | "integrity": "sha1-7FYjOGgDKQkgcXDDlEjiREndH8Q=" 480 | }, 481 | "escape-string-regexp": { 482 | "version": "1.0.5", 483 | "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", 484 | "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", 485 | "dev": true 486 | }, 487 | "eslint": { 488 | "version": "4.6.1", 489 | "resolved": "https://registry.npmjs.org/eslint/-/eslint-4.6.1.tgz", 490 | "integrity": "sha1-3cf8f9cL+TIFsLNEm7FqHp59SVA=", 491 | "dev": true, 492 | "requires": { 493 | "ajv": "5.2.2", 494 | "babel-code-frame": "6.26.0", 495 | "chalk": "2.1.0", 496 | "concat-stream": "1.6.0", 497 | "cross-spawn": "5.1.0", 498 | "debug": "2.6.8", 499 | "doctrine": "2.0.0", 500 | "eslint-scope": "3.7.1", 501 | "espree": "3.5.0", 502 | "esquery": "1.0.0", 503 | "estraverse": "4.2.0", 504 | "esutils": "2.0.2", 505 | "file-entry-cache": "2.0.0", 506 | "functional-red-black-tree": "1.0.1", 507 | "glob": "7.1.2", 508 | "globals": "9.18.0", 509 | "ignore": "3.3.5", 510 | "imurmurhash": "0.1.4", 511 | "inquirer": "3.2.3", 512 | "is-resolvable": "1.0.0", 513 | "js-yaml": "3.10.0", 514 | "json-stable-stringify": "1.0.1", 515 | "levn": "0.3.0", 516 | "lodash": "4.17.4", 517 | "minimatch": "3.0.4", 518 | "mkdirp": "0.5.1", 519 | "natural-compare": "1.4.0", 520 | "optionator": "0.8.2", 521 | "path-is-inside": "1.0.2", 522 | "pluralize": "4.0.0", 523 | "progress": "2.0.0", 524 | "require-uncached": "1.0.3", 525 | "semver": "5.4.1", 526 | "strip-ansi": "4.0.0", 527 | "strip-json-comments": "2.0.1", 528 | "table": "4.0.1", 529 | "text-table": "0.2.0" 530 | }, 531 | "dependencies": { 532 | "ansi-regex": { 533 | "version": "3.0.0", 534 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", 535 | "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", 536 | "dev": true 537 | }, 538 | "ansi-styles": { 539 | "version": "3.2.0", 540 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.0.tgz", 541 | "integrity": "sha512-NnSOmMEYtVR2JVMIGTzynRkkaxtiq1xnFBcdQD/DnNCYPoEPsVJhM98BDyaoNOQIi7p4okdi3E27eN7GQbsUug==", 542 | "dev": true, 543 | "requires": { 544 | "color-convert": "1.9.0" 545 | } 546 | }, 547 | "chalk": { 548 | "version": "2.1.0", 549 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.1.0.tgz", 550 | "integrity": "sha512-LUHGS/dge4ujbXMJrnihYMcL4AoOweGnw9Tp3kQuqy1Kx5c1qKjqvMJZ6nVJPMWJtKCTN72ZogH3oeSO9g9rXQ==", 551 | "dev": true, 552 | "requires": { 553 | "ansi-styles": "3.2.0", 554 | "escape-string-regexp": "1.0.5", 555 | "supports-color": "4.4.0" 556 | } 557 | }, 558 | "debug": { 559 | "version": "2.6.8", 560 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.8.tgz", 561 | "integrity": "sha1-5zFTHKLt4n0YgiJCfaF4IdaP9Pw=", 562 | "dev": true, 563 | "requires": { 564 | "ms": "2.0.0" 565 | } 566 | }, 567 | "esprima": { 568 | "version": "4.0.0", 569 | "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.0.tgz", 570 | "integrity": "sha512-oftTcaMu/EGrEIu904mWteKIv8vMuOgGYo7EhVJJN00R/EED9DCua/xxHRdYnKtcECzVg7xOWhflvJMnqcFZjw==", 571 | "dev": true 572 | }, 573 | "glob": { 574 | "version": "7.1.2", 575 | "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", 576 | "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", 577 | "dev": true, 578 | "requires": { 579 | "fs.realpath": "1.0.0", 580 | "inflight": "1.0.6", 581 | "inherits": "2.0.3", 582 | "minimatch": "3.0.4", 583 | "once": "1.4.0", 584 | "path-is-absolute": "1.0.1" 585 | } 586 | }, 587 | "has-flag": { 588 | "version": "2.0.0", 589 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-2.0.0.tgz", 590 | "integrity": "sha1-6CB68cx7MNRGzHC3NLXovhj4jVE=", 591 | "dev": true 592 | }, 593 | "js-yaml": { 594 | "version": "3.10.0", 595 | "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.10.0.tgz", 596 | "integrity": "sha512-O2v52ffjLa9VeM43J4XocZE//WT9N0IiwDa3KSHH7Tu8CtH+1qM8SIZvnsTh6v+4yFy5KUY3BHUVwjpfAWsjIA==", 597 | "dev": true, 598 | "requires": { 599 | "argparse": "1.0.9", 600 | "esprima": "4.0.0" 601 | } 602 | }, 603 | "strip-ansi": { 604 | "version": "4.0.0", 605 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", 606 | "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", 607 | "dev": true, 608 | "requires": { 609 | "ansi-regex": "3.0.0" 610 | } 611 | }, 612 | "supports-color": { 613 | "version": "4.4.0", 614 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.4.0.tgz", 615 | "integrity": "sha512-rKC3+DyXWgK0ZLKwmRsrkyHVZAjNkfzeehuFWdGGcqGDTZFH73+RH6S/RDAAxl9GusSjZSUWYLmT9N5pzXFOXQ==", 616 | "dev": true, 617 | "requires": { 618 | "has-flag": "2.0.0" 619 | } 620 | } 621 | } 622 | }, 623 | "eslint-scope": { 624 | "version": "3.7.1", 625 | "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-3.7.1.tgz", 626 | "integrity": "sha1-PWPD7f2gLgbgGkUq2IyqzHzctug=", 627 | "dev": true, 628 | "requires": { 629 | "esrecurse": "4.2.0", 630 | "estraverse": "4.2.0" 631 | } 632 | }, 633 | "espree": { 634 | "version": "3.5.0", 635 | "resolved": "https://registry.npmjs.org/espree/-/espree-3.5.0.tgz", 636 | "integrity": "sha1-mDWGJb3QVYYeon4oZ+pyn69GPY0=", 637 | "dev": true, 638 | "requires": { 639 | "acorn": "5.1.2", 640 | "acorn-jsx": "3.0.1" 641 | } 642 | }, 643 | "esprima": { 644 | "version": "2.7.3", 645 | "resolved": "https://registry.npmjs.org/esprima/-/esprima-2.7.3.tgz", 646 | "integrity": "sha1-luO3DVd59q1JzQMmc9HDEnZ7pYE=", 647 | "dev": true 648 | }, 649 | "esquery": { 650 | "version": "1.0.0", 651 | "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.0.0.tgz", 652 | "integrity": "sha1-z7qLV9f7qT8XKYqKAGoEzaE9gPo=", 653 | "dev": true, 654 | "requires": { 655 | "estraverse": "4.2.0" 656 | } 657 | }, 658 | "esrecurse": { 659 | "version": "4.2.0", 660 | "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.2.0.tgz", 661 | "integrity": "sha1-+pVo2Y04I/mkHZHpAtyrnqblsWM=", 662 | "dev": true, 663 | "requires": { 664 | "estraverse": "4.2.0", 665 | "object-assign": "4.1.1" 666 | } 667 | }, 668 | "estraverse": { 669 | "version": "4.2.0", 670 | "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.2.0.tgz", 671 | "integrity": "sha1-De4/7TH81GlhjOc0IJn8GvoL2xM=", 672 | "dev": true 673 | }, 674 | "esutils": { 675 | "version": "2.0.2", 676 | "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz", 677 | "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=", 678 | "dev": true 679 | }, 680 | "extend": { 681 | "version": "3.0.1", 682 | "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.1.tgz", 683 | "integrity": "sha1-p1Xqe8Gt/MWjHOfnYtuq3F5jZEQ=", 684 | "dev": true 685 | }, 686 | "external-editor": { 687 | "version": "2.0.4", 688 | "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-2.0.4.tgz", 689 | "integrity": "sha1-HtkZnanL/i7y96MbL96LDRI2iXI=", 690 | "dev": true, 691 | "requires": { 692 | "iconv-lite": "0.4.19", 693 | "jschardet": "1.5.1", 694 | "tmp": "0.0.31" 695 | } 696 | }, 697 | "extsprintf": { 698 | "version": "1.3.0", 699 | "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", 700 | "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=", 701 | "dev": true 702 | }, 703 | "fast-deep-equal": { 704 | "version": "1.0.0", 705 | "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-1.0.0.tgz", 706 | "integrity": "sha1-liVqO8l1WV6zbYLpkp0GDYk0Of8=", 707 | "dev": true 708 | }, 709 | "fast-levenshtein": { 710 | "version": "2.0.6", 711 | "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", 712 | "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", 713 | "dev": true 714 | }, 715 | "figures": { 716 | "version": "2.0.0", 717 | "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz", 718 | "integrity": "sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI=", 719 | "dev": true, 720 | "requires": { 721 | "escape-string-regexp": "1.0.5" 722 | } 723 | }, 724 | "file-entry-cache": { 725 | "version": "2.0.0", 726 | "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-2.0.0.tgz", 727 | "integrity": "sha1-w5KZDD5oR4PYOLjISkXYoEhFg2E=", 728 | "dev": true, 729 | "requires": { 730 | "flat-cache": "1.2.2", 731 | "object-assign": "4.1.1" 732 | } 733 | }, 734 | "flat-cache": { 735 | "version": "1.2.2", 736 | "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-1.2.2.tgz", 737 | "integrity": "sha1-+oZxTnLCHbiGAXYezy9VXRq8a5Y=", 738 | "dev": true, 739 | "requires": { 740 | "circular-json": "0.3.3", 741 | "del": "2.2.2", 742 | "graceful-fs": "4.1.11", 743 | "write": "0.2.1" 744 | } 745 | }, 746 | "forever-agent": { 747 | "version": "0.6.1", 748 | "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", 749 | "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=", 750 | "dev": true 751 | }, 752 | "form-data": { 753 | "version": "2.1.4", 754 | "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.1.4.tgz", 755 | "integrity": "sha1-M8GDrPGTJ27KqYFDpp6Uv+4XUNE=", 756 | "dev": true, 757 | "requires": { 758 | "asynckit": "0.4.0", 759 | "combined-stream": "1.0.5", 760 | "mime-types": "2.1.17" 761 | } 762 | }, 763 | "fs.realpath": { 764 | "version": "1.0.0", 765 | "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", 766 | "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", 767 | "dev": true 768 | }, 769 | "functional-red-black-tree": { 770 | "version": "1.0.1", 771 | "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", 772 | "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=", 773 | "dev": true 774 | }, 775 | "generate-function": { 776 | "version": "2.0.0", 777 | "resolved": "https://registry.npmjs.org/generate-function/-/generate-function-2.0.0.tgz", 778 | "integrity": "sha1-aFj+fAlpt9TpCTM3ZHrHn2DfvnQ=", 779 | "dev": true 780 | }, 781 | "generate-object-property": { 782 | "version": "1.2.0", 783 | "resolved": "https://registry.npmjs.org/generate-object-property/-/generate-object-property-1.2.0.tgz", 784 | "integrity": "sha1-nA4cQDCM6AT0eDYYuTf6iPmdUNA=", 785 | "dev": true, 786 | "requires": { 787 | "is-property": "1.0.2" 788 | } 789 | }, 790 | "get-func-name": { 791 | "version": "2.0.0", 792 | "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.0.tgz", 793 | "integrity": "sha1-6td0q+5y4gQJQzoGY2YCPdaIekE=", 794 | "dev": true 795 | }, 796 | "getpass": { 797 | "version": "0.1.7", 798 | "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", 799 | "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", 800 | "dev": true, 801 | "requires": { 802 | "assert-plus": "1.0.0" 803 | }, 804 | "dependencies": { 805 | "assert-plus": { 806 | "version": "1.0.0", 807 | "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", 808 | "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", 809 | "dev": true 810 | } 811 | } 812 | }, 813 | "glob": { 814 | "version": "7.1.1", 815 | "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.1.tgz", 816 | "integrity": "sha1-gFIR3wT6rxxjo2ADBs31reULLsg=", 817 | "dev": true, 818 | "requires": { 819 | "fs.realpath": "1.0.0", 820 | "inflight": "1.0.6", 821 | "inherits": "2.0.3", 822 | "minimatch": "3.0.4", 823 | "once": "1.4.0", 824 | "path-is-absolute": "1.0.1" 825 | } 826 | }, 827 | "globals": { 828 | "version": "9.18.0", 829 | "resolved": "https://registry.npmjs.org/globals/-/globals-9.18.0.tgz", 830 | "integrity": "sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ==", 831 | "dev": true 832 | }, 833 | "globby": { 834 | "version": "5.0.0", 835 | "resolved": "https://registry.npmjs.org/globby/-/globby-5.0.0.tgz", 836 | "integrity": "sha1-69hGZ8oNuzMLmbz8aOrCvFQ3Dg0=", 837 | "dev": true, 838 | "requires": { 839 | "array-union": "1.0.2", 840 | "arrify": "1.0.1", 841 | "glob": "7.1.1", 842 | "object-assign": "4.1.1", 843 | "pify": "2.3.0", 844 | "pinkie-promise": "2.0.1" 845 | } 846 | }, 847 | "graceful-fs": { 848 | "version": "4.1.11", 849 | "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", 850 | "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=", 851 | "dev": true 852 | }, 853 | "graceful-readlink": { 854 | "version": "1.0.1", 855 | "resolved": "https://registry.npmjs.org/graceful-readlink/-/graceful-readlink-1.0.1.tgz", 856 | "integrity": "sha1-TK+tdrxi8C+gObL5Tpo906ORpyU=", 857 | "dev": true 858 | }, 859 | "growl": { 860 | "version": "1.9.2", 861 | "resolved": "https://registry.npmjs.org/growl/-/growl-1.9.2.tgz", 862 | "integrity": "sha1-Dqd0NxXbjY3ixe3hd14bRayFwC8=", 863 | "dev": true 864 | }, 865 | "har-validator": { 866 | "version": "2.0.6", 867 | "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-2.0.6.tgz", 868 | "integrity": "sha1-zcvAgYgmWtEZtqWnyKtw7s+10n0=", 869 | "dev": true, 870 | "requires": { 871 | "chalk": "1.1.3", 872 | "commander": "2.9.0", 873 | "is-my-json-valid": "2.16.1", 874 | "pinkie-promise": "2.0.1" 875 | } 876 | }, 877 | "has-ansi": { 878 | "version": "2.0.0", 879 | "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", 880 | "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", 881 | "dev": true, 882 | "requires": { 883 | "ansi-regex": "2.1.1" 884 | } 885 | }, 886 | "has-flag": { 887 | "version": "1.0.0", 888 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", 889 | "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", 890 | "dev": true 891 | }, 892 | "hawk": { 893 | "version": "3.1.3", 894 | "resolved": "https://registry.npmjs.org/hawk/-/hawk-3.1.3.tgz", 895 | "integrity": "sha1-B4REvXwWQLD+VA0sm3PVlnjo4cQ=", 896 | "dev": true, 897 | "requires": { 898 | "boom": "2.10.1", 899 | "cryptiles": "2.0.5", 900 | "hoek": "2.16.3", 901 | "sntp": "1.0.9" 902 | } 903 | }, 904 | "he": { 905 | "version": "1.1.1", 906 | "resolved": "https://registry.npmjs.org/he/-/he-1.1.1.tgz", 907 | "integrity": "sha1-k0EP0hsAlzUVH4howvJx80J+I/0=", 908 | "dev": true 909 | }, 910 | "hoek": { 911 | "version": "2.16.3", 912 | "resolved": "https://registry.npmjs.org/hoek/-/hoek-2.16.3.tgz", 913 | "integrity": "sha1-ILt0A9POo5jpHcRxCo/xuCdKJe0=", 914 | "dev": true 915 | }, 916 | "http-signature": { 917 | "version": "1.1.1", 918 | "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.1.1.tgz", 919 | "integrity": "sha1-33LiZwZs0Kxn+3at+OE0qPvPkb8=", 920 | "dev": true, 921 | "requires": { 922 | "assert-plus": "0.2.0", 923 | "jsprim": "1.4.1", 924 | "sshpk": "1.13.1" 925 | } 926 | }, 927 | "iconv-lite": { 928 | "version": "0.4.19", 929 | "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.19.tgz", 930 | "integrity": "sha512-oTZqweIP51xaGPI4uPa56/Pri/480R+mo7SeU+YETByQNhDG55ycFyNLIgta9vXhILrxXDmF7ZGhqZIcuN0gJQ==", 931 | "dev": true 932 | }, 933 | "ignore": { 934 | "version": "3.3.5", 935 | "resolved": "https://registry.npmjs.org/ignore/-/ignore-3.3.5.tgz", 936 | "integrity": "sha512-JLH93mL8amZQhh/p6mfQgVBH3M6epNq3DfsXsTSuSrInVjwyYlFE1nv2AgfRCC8PoOhM0jwQ5v8s9LgbK7yGDw==", 937 | "dev": true 938 | }, 939 | "imurmurhash": { 940 | "version": "0.1.4", 941 | "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", 942 | "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", 943 | "dev": true 944 | }, 945 | "inflight": { 946 | "version": "1.0.6", 947 | "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", 948 | "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", 949 | "dev": true, 950 | "requires": { 951 | "once": "1.4.0", 952 | "wrappy": "1.0.2" 953 | } 954 | }, 955 | "inherits": { 956 | "version": "2.0.3", 957 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", 958 | "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" 959 | }, 960 | "inquirer": { 961 | "version": "3.2.3", 962 | "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-3.2.3.tgz", 963 | "integrity": "sha512-Bc3KbimpDTOeQdDj18Ir/rlsGuhBSSNqdOnxaAuKhpkdnMMuKsEGbZD2v5KFF9oso2OU+BPh7+/u5obmFDRmWw==", 964 | "dev": true, 965 | "requires": { 966 | "ansi-escapes": "2.0.0", 967 | "chalk": "2.1.0", 968 | "cli-cursor": "2.1.0", 969 | "cli-width": "2.2.0", 970 | "external-editor": "2.0.4", 971 | "figures": "2.0.0", 972 | "lodash": "4.17.4", 973 | "mute-stream": "0.0.7", 974 | "run-async": "2.3.0", 975 | "rx-lite": "4.0.8", 976 | "rx-lite-aggregates": "4.0.8", 977 | "string-width": "2.1.1", 978 | "strip-ansi": "4.0.0", 979 | "through": "2.3.8" 980 | }, 981 | "dependencies": { 982 | "ansi-regex": { 983 | "version": "3.0.0", 984 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", 985 | "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", 986 | "dev": true 987 | }, 988 | "ansi-styles": { 989 | "version": "3.2.0", 990 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.0.tgz", 991 | "integrity": "sha512-NnSOmMEYtVR2JVMIGTzynRkkaxtiq1xnFBcdQD/DnNCYPoEPsVJhM98BDyaoNOQIi7p4okdi3E27eN7GQbsUug==", 992 | "dev": true, 993 | "requires": { 994 | "color-convert": "1.9.0" 995 | } 996 | }, 997 | "chalk": { 998 | "version": "2.1.0", 999 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.1.0.tgz", 1000 | "integrity": "sha512-LUHGS/dge4ujbXMJrnihYMcL4AoOweGnw9Tp3kQuqy1Kx5c1qKjqvMJZ6nVJPMWJtKCTN72ZogH3oeSO9g9rXQ==", 1001 | "dev": true, 1002 | "requires": { 1003 | "ansi-styles": "3.2.0", 1004 | "escape-string-regexp": "1.0.5", 1005 | "supports-color": "4.4.0" 1006 | } 1007 | }, 1008 | "has-flag": { 1009 | "version": "2.0.0", 1010 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-2.0.0.tgz", 1011 | "integrity": "sha1-6CB68cx7MNRGzHC3NLXovhj4jVE=", 1012 | "dev": true 1013 | }, 1014 | "strip-ansi": { 1015 | "version": "4.0.0", 1016 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", 1017 | "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", 1018 | "dev": true, 1019 | "requires": { 1020 | "ansi-regex": "3.0.0" 1021 | } 1022 | }, 1023 | "supports-color": { 1024 | "version": "4.4.0", 1025 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.4.0.tgz", 1026 | "integrity": "sha512-rKC3+DyXWgK0ZLKwmRsrkyHVZAjNkfzeehuFWdGGcqGDTZFH73+RH6S/RDAAxl9GusSjZSUWYLmT9N5pzXFOXQ==", 1027 | "dev": true, 1028 | "requires": { 1029 | "has-flag": "2.0.0" 1030 | } 1031 | } 1032 | } 1033 | }, 1034 | "is-fullwidth-code-point": { 1035 | "version": "2.0.0", 1036 | "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", 1037 | "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", 1038 | "dev": true 1039 | }, 1040 | "is-my-json-valid": { 1041 | "version": "2.16.1", 1042 | "resolved": "https://registry.npmjs.org/is-my-json-valid/-/is-my-json-valid-2.16.1.tgz", 1043 | "integrity": "sha512-ochPsqWS1WXj8ZnMIV0vnNXooaMhp7cyL4FMSIPKTtnV0Ha/T19G2b9kkhcNsabV9bxYkze7/aLZJb/bYuFduQ==", 1044 | "dev": true, 1045 | "requires": { 1046 | "generate-function": "2.0.0", 1047 | "generate-object-property": "1.2.0", 1048 | "jsonpointer": "4.0.1", 1049 | "xtend": "4.0.1" 1050 | } 1051 | }, 1052 | "is-path-cwd": { 1053 | "version": "1.0.0", 1054 | "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-1.0.0.tgz", 1055 | "integrity": "sha1-0iXsIxMuie3Tj9p2dHLmLmXxEG0=", 1056 | "dev": true 1057 | }, 1058 | "is-path-in-cwd": { 1059 | "version": "1.0.0", 1060 | "resolved": "https://registry.npmjs.org/is-path-in-cwd/-/is-path-in-cwd-1.0.0.tgz", 1061 | "integrity": "sha1-ZHdYK4IU1gI0YJRWcAO+ip6sBNw=", 1062 | "dev": true, 1063 | "requires": { 1064 | "is-path-inside": "1.0.0" 1065 | } 1066 | }, 1067 | "is-path-inside": { 1068 | "version": "1.0.0", 1069 | "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-1.0.0.tgz", 1070 | "integrity": "sha1-/AbloWg/vaE95mev9xe7wQpI838=", 1071 | "dev": true, 1072 | "requires": { 1073 | "path-is-inside": "1.0.2" 1074 | } 1075 | }, 1076 | "is-promise": { 1077 | "version": "2.1.0", 1078 | "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.1.0.tgz", 1079 | "integrity": "sha1-eaKp7OfwlugPNtKy87wWwf9L8/o=", 1080 | "dev": true 1081 | }, 1082 | "is-property": { 1083 | "version": "1.0.2", 1084 | "resolved": "https://registry.npmjs.org/is-property/-/is-property-1.0.2.tgz", 1085 | "integrity": "sha1-V/4cTkhHTt1lsJkR8msc1Ald2oQ=", 1086 | "dev": true 1087 | }, 1088 | "is-resolvable": { 1089 | "version": "1.0.0", 1090 | "resolved": "https://registry.npmjs.org/is-resolvable/-/is-resolvable-1.0.0.tgz", 1091 | "integrity": "sha1-jfV8YeouPFAUCNEA+wE8+NbgzGI=", 1092 | "dev": true, 1093 | "requires": { 1094 | "tryit": "1.0.3" 1095 | } 1096 | }, 1097 | "is-typedarray": { 1098 | "version": "1.0.0", 1099 | "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", 1100 | "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", 1101 | "dev": true 1102 | }, 1103 | "is-windows": { 1104 | "version": "1.0.1", 1105 | "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.1.tgz", 1106 | "integrity": "sha1-MQ23D3QtJZoWo2kgK1GvhCMzENk=", 1107 | "dev": true 1108 | }, 1109 | "isarray": { 1110 | "version": "1.0.0", 1111 | "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", 1112 | "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" 1113 | }, 1114 | "isexe": { 1115 | "version": "2.0.0", 1116 | "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", 1117 | "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", 1118 | "dev": true 1119 | }, 1120 | "isstream": { 1121 | "version": "0.1.2", 1122 | "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", 1123 | "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=", 1124 | "dev": true 1125 | }, 1126 | "js-tokens": { 1127 | "version": "3.0.2", 1128 | "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz", 1129 | "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=", 1130 | "dev": true 1131 | }, 1132 | "js-yaml": { 1133 | "version": "3.6.1", 1134 | "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.6.1.tgz", 1135 | "integrity": "sha1-bl/mfYsgXOTSL60Ft3geja3MSzA=", 1136 | "dev": true, 1137 | "requires": { 1138 | "argparse": "1.0.9", 1139 | "esprima": "2.7.3" 1140 | } 1141 | }, 1142 | "jsbn": { 1143 | "version": "0.1.1", 1144 | "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", 1145 | "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", 1146 | "dev": true, 1147 | "optional": true 1148 | }, 1149 | "jschardet": { 1150 | "version": "1.5.1", 1151 | "resolved": "https://registry.npmjs.org/jschardet/-/jschardet-1.5.1.tgz", 1152 | "integrity": "sha512-vE2hT1D0HLZCLLclfBSfkfTTedhVj0fubHpJBHKwwUWX0nSbhPAfk+SG9rTX95BYNmau8rGFfCeaT6T5OW1C2A==", 1153 | "dev": true 1154 | }, 1155 | "json-schema": { 1156 | "version": "0.2.3", 1157 | "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", 1158 | "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=", 1159 | "dev": true 1160 | }, 1161 | "json-schema-traverse": { 1162 | "version": "0.3.1", 1163 | "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz", 1164 | "integrity": "sha1-NJptRMU6Ud6JtAgFxdXlm0F9M0A=", 1165 | "dev": true 1166 | }, 1167 | "json-stable-stringify": { 1168 | "version": "1.0.1", 1169 | "resolved": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz", 1170 | "integrity": "sha1-mnWdOcXy/1A/1TAGRu1EX4jE+a8=", 1171 | "dev": true, 1172 | "requires": { 1173 | "jsonify": "0.0.0" 1174 | } 1175 | }, 1176 | "json-stringify-safe": { 1177 | "version": "5.0.1", 1178 | "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", 1179 | "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=", 1180 | "dev": true 1181 | }, 1182 | "json3": { 1183 | "version": "3.3.2", 1184 | "resolved": "https://registry.npmjs.org/json3/-/json3-3.3.2.tgz", 1185 | "integrity": "sha1-PAQ0dD35Pi9cQq7nsZvLSDV19OE=", 1186 | "dev": true 1187 | }, 1188 | "jsonify": { 1189 | "version": "0.0.0", 1190 | "resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.0.tgz", 1191 | "integrity": "sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM=", 1192 | "dev": true 1193 | }, 1194 | "jsonpointer": { 1195 | "version": "4.0.1", 1196 | "resolved": "https://registry.npmjs.org/jsonpointer/-/jsonpointer-4.0.1.tgz", 1197 | "integrity": "sha1-T9kss04OnbPInIYi7PUfm5eMbLk=", 1198 | "dev": true 1199 | }, 1200 | "jsprim": { 1201 | "version": "1.4.1", 1202 | "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", 1203 | "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", 1204 | "dev": true, 1205 | "requires": { 1206 | "assert-plus": "1.0.0", 1207 | "extsprintf": "1.3.0", 1208 | "json-schema": "0.2.3", 1209 | "verror": "1.10.0" 1210 | }, 1211 | "dependencies": { 1212 | "assert-plus": { 1213 | "version": "1.0.0", 1214 | "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", 1215 | "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", 1216 | "dev": true 1217 | } 1218 | } 1219 | }, 1220 | "lcov-parse": { 1221 | "version": "0.0.10", 1222 | "resolved": "https://registry.npmjs.org/lcov-parse/-/lcov-parse-0.0.10.tgz", 1223 | "integrity": "sha1-GwuP+ayceIklBYK3C3ExXZ2m2aM=", 1224 | "dev": true 1225 | }, 1226 | "levn": { 1227 | "version": "0.3.0", 1228 | "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", 1229 | "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", 1230 | "dev": true, 1231 | "requires": { 1232 | "prelude-ls": "1.1.2", 1233 | "type-check": "0.3.2" 1234 | } 1235 | }, 1236 | "lodash": { 1237 | "version": "4.17.4", 1238 | "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.4.tgz", 1239 | "integrity": "sha1-eCA6TRwyiuHYbcpkYONptX9AVa4=", 1240 | "dev": true 1241 | }, 1242 | "lodash._baseassign": { 1243 | "version": "3.2.0", 1244 | "resolved": "https://registry.npmjs.org/lodash._baseassign/-/lodash._baseassign-3.2.0.tgz", 1245 | "integrity": "sha1-jDigmVAPIVrQnlnxci/QxSv+Ck4=", 1246 | "dev": true, 1247 | "requires": { 1248 | "lodash._basecopy": "3.0.1", 1249 | "lodash.keys": "3.1.2" 1250 | } 1251 | }, 1252 | "lodash._basecopy": { 1253 | "version": "3.0.1", 1254 | "resolved": "https://registry.npmjs.org/lodash._basecopy/-/lodash._basecopy-3.0.1.tgz", 1255 | "integrity": "sha1-jaDmqHbPNEwK2KVIghEd08XHyjY=", 1256 | "dev": true 1257 | }, 1258 | "lodash._basecreate": { 1259 | "version": "3.0.3", 1260 | "resolved": "https://registry.npmjs.org/lodash._basecreate/-/lodash._basecreate-3.0.3.tgz", 1261 | "integrity": "sha1-G8ZhYU2qf8MRt9A78WgGoCE8+CE=", 1262 | "dev": true 1263 | }, 1264 | "lodash._getnative": { 1265 | "version": "3.9.1", 1266 | "resolved": "https://registry.npmjs.org/lodash._getnative/-/lodash._getnative-3.9.1.tgz", 1267 | "integrity": "sha1-VwvH3t5G1hzc3mh9ZdPuy6o6r/U=", 1268 | "dev": true 1269 | }, 1270 | "lodash._isiterateecall": { 1271 | "version": "3.0.9", 1272 | "resolved": "https://registry.npmjs.org/lodash._isiterateecall/-/lodash._isiterateecall-3.0.9.tgz", 1273 | "integrity": "sha1-UgOte6Ql+uhCRg5pbbnPPmqsBXw=", 1274 | "dev": true 1275 | }, 1276 | "lodash.create": { 1277 | "version": "3.1.1", 1278 | "resolved": "https://registry.npmjs.org/lodash.create/-/lodash.create-3.1.1.tgz", 1279 | "integrity": "sha1-1/KEnw29p+BGgruM1yqwIkYd6+c=", 1280 | "dev": true, 1281 | "requires": { 1282 | "lodash._baseassign": "3.2.0", 1283 | "lodash._basecreate": "3.0.3", 1284 | "lodash._isiterateecall": "3.0.9" 1285 | } 1286 | }, 1287 | "lodash.isarguments": { 1288 | "version": "3.1.0", 1289 | "resolved": "https://registry.npmjs.org/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz", 1290 | "integrity": "sha1-L1c9hcaiQon/AGY7SRwdM4/zRYo=", 1291 | "dev": true 1292 | }, 1293 | "lodash.isarray": { 1294 | "version": "3.0.4", 1295 | "resolved": "https://registry.npmjs.org/lodash.isarray/-/lodash.isarray-3.0.4.tgz", 1296 | "integrity": "sha1-eeTriMNqgSKvhvhEqpvNhRtfu1U=", 1297 | "dev": true 1298 | }, 1299 | "lodash.keys": { 1300 | "version": "3.1.2", 1301 | "resolved": "https://registry.npmjs.org/lodash.keys/-/lodash.keys-3.1.2.tgz", 1302 | "integrity": "sha1-TbwEcrFWvlCgsoaFXRvQsMZWCYo=", 1303 | "dev": true, 1304 | "requires": { 1305 | "lodash._getnative": "3.9.1", 1306 | "lodash.isarguments": "3.1.0", 1307 | "lodash.isarray": "3.0.4" 1308 | } 1309 | }, 1310 | "log-driver": { 1311 | "version": "1.2.5", 1312 | "resolved": "https://registry.npmjs.org/log-driver/-/log-driver-1.2.5.tgz", 1313 | "integrity": "sha1-euTsJXMC/XkNVXyxDJcQDYV7AFY=", 1314 | "dev": true 1315 | }, 1316 | "lru-cache": { 1317 | "version": "4.1.1", 1318 | "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.1.tgz", 1319 | "integrity": "sha512-q4spe4KTfsAS1SUHLO0wz8Qiyf1+vMIAgpRYioFYDMNqKfHQbg+AVDH3i4fvpl71/P1L0dBl+fQi+P37UYf0ew==", 1320 | "dev": true, 1321 | "requires": { 1322 | "pseudomap": "1.0.2", 1323 | "yallist": "2.1.2" 1324 | } 1325 | }, 1326 | "mime-db": { 1327 | "version": "1.30.0", 1328 | "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.30.0.tgz", 1329 | "integrity": "sha1-dMZD2i3Z1qRTmZY0ZbJtXKfXHwE=", 1330 | "dev": true 1331 | }, 1332 | "mime-types": { 1333 | "version": "2.1.17", 1334 | "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.17.tgz", 1335 | "integrity": "sha1-Cdejk/A+mVp5+K+Fe3Cp4KsWVXo=", 1336 | "dev": true, 1337 | "requires": { 1338 | "mime-db": "1.30.0" 1339 | } 1340 | }, 1341 | "mimic-fn": { 1342 | "version": "1.1.0", 1343 | "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.1.0.tgz", 1344 | "integrity": "sha1-5md4PZLonb00KBi1IwudYqZyrRg=", 1345 | "dev": true 1346 | }, 1347 | "minimatch": { 1348 | "version": "3.0.4", 1349 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", 1350 | "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", 1351 | "dev": true, 1352 | "requires": { 1353 | "brace-expansion": "1.1.8" 1354 | } 1355 | }, 1356 | "minimist": { 1357 | "version": "0.0.8", 1358 | "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", 1359 | "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", 1360 | "dev": true 1361 | }, 1362 | "mkdirp": { 1363 | "version": "0.5.1", 1364 | "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", 1365 | "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", 1366 | "dev": true, 1367 | "requires": { 1368 | "minimist": "0.0.8" 1369 | } 1370 | }, 1371 | "mocha": { 1372 | "version": "3.5.3", 1373 | "resolved": "https://registry.npmjs.org/mocha/-/mocha-3.5.3.tgz", 1374 | "integrity": "sha512-/6na001MJWEtYxHOV1WLfsmR4YIynkUEhBwzsb+fk2qmQ3iqsi258l/Q2MWHJMImAcNpZ8DEdYAK72NHoIQ9Eg==", 1375 | "dev": true, 1376 | "requires": { 1377 | "browser-stdout": "1.3.0", 1378 | "commander": "2.9.0", 1379 | "debug": "2.6.8", 1380 | "diff": "3.2.0", 1381 | "escape-string-regexp": "1.0.5", 1382 | "glob": "7.1.1", 1383 | "growl": "1.9.2", 1384 | "he": "1.1.1", 1385 | "json3": "3.3.2", 1386 | "lodash.create": "3.1.1", 1387 | "mkdirp": "0.5.1", 1388 | "supports-color": "3.1.2" 1389 | }, 1390 | "dependencies": { 1391 | "debug": { 1392 | "version": "2.6.8", 1393 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.8.tgz", 1394 | "integrity": "sha1-5zFTHKLt4n0YgiJCfaF4IdaP9Pw=", 1395 | "dev": true, 1396 | "requires": { 1397 | "ms": "2.0.0" 1398 | } 1399 | } 1400 | } 1401 | }, 1402 | "mongodb": { 1403 | "version": "2.2.31", 1404 | "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-2.2.31.tgz", 1405 | "integrity": "sha1-GUBEXGYeGSF7s7+CRdmFSq71SNs=", 1406 | "requires": { 1407 | "es6-promise": "3.2.1", 1408 | "mongodb-core": "2.1.15", 1409 | "readable-stream": "2.2.7" 1410 | }, 1411 | "dependencies": { 1412 | "readable-stream": { 1413 | "version": "2.2.7", 1414 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.2.7.tgz", 1415 | "integrity": "sha1-BwV6y+JGeyIELTb5jFrVBwVOlbE=", 1416 | "requires": { 1417 | "buffer-shims": "1.0.0", 1418 | "core-util-is": "1.0.2", 1419 | "inherits": "2.0.3", 1420 | "isarray": "1.0.0", 1421 | "process-nextick-args": "1.0.7", 1422 | "string_decoder": "1.0.3", 1423 | "util-deprecate": "1.0.2" 1424 | } 1425 | } 1426 | } 1427 | }, 1428 | "mongodb-core": { 1429 | "version": "2.1.15", 1430 | "resolved": "https://registry.npmjs.org/mongodb-core/-/mongodb-core-2.1.15.tgz", 1431 | "integrity": "sha1-hB9TuH//9MdFgYnDXIroJ+EWl2Q=", 1432 | "requires": { 1433 | "bson": "1.0.4", 1434 | "require_optional": "1.0.1" 1435 | } 1436 | }, 1437 | "mongoist": { 1438 | "version": "1.0.1", 1439 | "resolved": "https://registry.npmjs.org/mongoist/-/mongoist-1.0.1.tgz", 1440 | "integrity": "sha512-iwfo+P01qTKdKYDxZiXtuXauklSkONauRFKMb3Mm9KKCeVsNXEoAmySL4TUIOawr53FGIuplHjYjxOv2XP9r/Q==", 1441 | "requires": { 1442 | "mongodb": "2.2.31" 1443 | } 1444 | }, 1445 | "ms": { 1446 | "version": "2.0.0", 1447 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", 1448 | "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" 1449 | }, 1450 | "mute-stream": { 1451 | "version": "0.0.7", 1452 | "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.7.tgz", 1453 | "integrity": "sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s=", 1454 | "dev": true 1455 | }, 1456 | "natural-compare": { 1457 | "version": "1.4.0", 1458 | "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", 1459 | "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", 1460 | "dev": true 1461 | }, 1462 | "nyc": { 1463 | "version": "11.2.1", 1464 | "resolved": "https://registry.npmjs.org/nyc/-/nyc-11.2.1.tgz", 1465 | "integrity": "sha1-rYUK/p261/SXByi0suR/7Rw4chw=", 1466 | "dev": true, 1467 | "requires": { 1468 | "archy": "1.0.0", 1469 | "arrify": "1.0.1", 1470 | "caching-transform": "1.0.1", 1471 | "convert-source-map": "1.5.0", 1472 | "debug-log": "1.0.1", 1473 | "default-require-extensions": "1.0.0", 1474 | "find-cache-dir": "0.1.1", 1475 | "find-up": "2.1.0", 1476 | "foreground-child": "1.5.6", 1477 | "glob": "7.1.2", 1478 | "istanbul-lib-coverage": "1.1.1", 1479 | "istanbul-lib-hook": "1.0.7", 1480 | "istanbul-lib-instrument": "1.8.0", 1481 | "istanbul-lib-report": "1.1.1", 1482 | "istanbul-lib-source-maps": "1.2.1", 1483 | "istanbul-reports": "1.1.2", 1484 | "md5-hex": "1.3.0", 1485 | "merge-source-map": "1.0.4", 1486 | "micromatch": "2.3.11", 1487 | "mkdirp": "0.5.1", 1488 | "resolve-from": "2.0.0", 1489 | "rimraf": "2.6.1", 1490 | "signal-exit": "3.0.2", 1491 | "spawn-wrap": "1.3.8", 1492 | "test-exclude": "4.1.1", 1493 | "yargs": "8.0.2", 1494 | "yargs-parser": "5.0.0" 1495 | }, 1496 | "dependencies": { 1497 | "align-text": { 1498 | "version": "0.1.4", 1499 | "bundled": true, 1500 | "dev": true, 1501 | "requires": { 1502 | "kind-of": "3.2.2", 1503 | "longest": "1.0.1", 1504 | "repeat-string": "1.6.1" 1505 | } 1506 | }, 1507 | "amdefine": { 1508 | "version": "1.0.1", 1509 | "bundled": true, 1510 | "dev": true 1511 | }, 1512 | "ansi-regex": { 1513 | "version": "2.1.1", 1514 | "bundled": true, 1515 | "dev": true 1516 | }, 1517 | "ansi-styles": { 1518 | "version": "2.2.1", 1519 | "bundled": true, 1520 | "dev": true 1521 | }, 1522 | "append-transform": { 1523 | "version": "0.4.0", 1524 | "bundled": true, 1525 | "dev": true, 1526 | "requires": { 1527 | "default-require-extensions": "1.0.0" 1528 | } 1529 | }, 1530 | "archy": { 1531 | "version": "1.0.0", 1532 | "bundled": true, 1533 | "dev": true 1534 | }, 1535 | "arr-diff": { 1536 | "version": "2.0.0", 1537 | "bundled": true, 1538 | "dev": true, 1539 | "requires": { 1540 | "arr-flatten": "1.1.0" 1541 | } 1542 | }, 1543 | "arr-flatten": { 1544 | "version": "1.1.0", 1545 | "bundled": true, 1546 | "dev": true 1547 | }, 1548 | "array-unique": { 1549 | "version": "0.2.1", 1550 | "bundled": true, 1551 | "dev": true 1552 | }, 1553 | "arrify": { 1554 | "version": "1.0.1", 1555 | "bundled": true, 1556 | "dev": true 1557 | }, 1558 | "async": { 1559 | "version": "1.5.2", 1560 | "bundled": true, 1561 | "dev": true 1562 | }, 1563 | "babel-code-frame": { 1564 | "version": "6.26.0", 1565 | "bundled": true, 1566 | "dev": true, 1567 | "requires": { 1568 | "chalk": "1.1.3", 1569 | "esutils": "2.0.2", 1570 | "js-tokens": "3.0.2" 1571 | } 1572 | }, 1573 | "babel-generator": { 1574 | "version": "6.26.0", 1575 | "bundled": true, 1576 | "dev": true, 1577 | "requires": { 1578 | "babel-messages": "6.23.0", 1579 | "babel-runtime": "6.26.0", 1580 | "babel-types": "6.26.0", 1581 | "detect-indent": "4.0.0", 1582 | "jsesc": "1.3.0", 1583 | "lodash": "4.17.4", 1584 | "source-map": "0.5.7", 1585 | "trim-right": "1.0.1" 1586 | } 1587 | }, 1588 | "babel-messages": { 1589 | "version": "6.23.0", 1590 | "bundled": true, 1591 | "dev": true, 1592 | "requires": { 1593 | "babel-runtime": "6.26.0" 1594 | } 1595 | }, 1596 | "babel-runtime": { 1597 | "version": "6.26.0", 1598 | "bundled": true, 1599 | "dev": true, 1600 | "requires": { 1601 | "core-js": "2.5.1", 1602 | "regenerator-runtime": "0.11.0" 1603 | } 1604 | }, 1605 | "babel-template": { 1606 | "version": "6.26.0", 1607 | "bundled": true, 1608 | "dev": true, 1609 | "requires": { 1610 | "babel-runtime": "6.26.0", 1611 | "babel-traverse": "6.26.0", 1612 | "babel-types": "6.26.0", 1613 | "babylon": "6.18.0", 1614 | "lodash": "4.17.4" 1615 | } 1616 | }, 1617 | "babel-traverse": { 1618 | "version": "6.26.0", 1619 | "bundled": true, 1620 | "dev": true, 1621 | "requires": { 1622 | "babel-code-frame": "6.26.0", 1623 | "babel-messages": "6.23.0", 1624 | "babel-runtime": "6.26.0", 1625 | "babel-types": "6.26.0", 1626 | "babylon": "6.18.0", 1627 | "debug": "2.6.8", 1628 | "globals": "9.18.0", 1629 | "invariant": "2.2.2", 1630 | "lodash": "4.17.4" 1631 | } 1632 | }, 1633 | "babel-types": { 1634 | "version": "6.26.0", 1635 | "bundled": true, 1636 | "dev": true, 1637 | "requires": { 1638 | "babel-runtime": "6.26.0", 1639 | "esutils": "2.0.2", 1640 | "lodash": "4.17.4", 1641 | "to-fast-properties": "1.0.3" 1642 | } 1643 | }, 1644 | "babylon": { 1645 | "version": "6.18.0", 1646 | "bundled": true, 1647 | "dev": true 1648 | }, 1649 | "balanced-match": { 1650 | "version": "1.0.0", 1651 | "bundled": true, 1652 | "dev": true 1653 | }, 1654 | "brace-expansion": { 1655 | "version": "1.1.8", 1656 | "bundled": true, 1657 | "dev": true, 1658 | "requires": { 1659 | "balanced-match": "1.0.0", 1660 | "concat-map": "0.0.1" 1661 | } 1662 | }, 1663 | "braces": { 1664 | "version": "1.8.5", 1665 | "bundled": true, 1666 | "dev": true, 1667 | "requires": { 1668 | "expand-range": "1.8.2", 1669 | "preserve": "0.2.0", 1670 | "repeat-element": "1.1.2" 1671 | } 1672 | }, 1673 | "builtin-modules": { 1674 | "version": "1.1.1", 1675 | "bundled": true, 1676 | "dev": true 1677 | }, 1678 | "caching-transform": { 1679 | "version": "1.0.1", 1680 | "bundled": true, 1681 | "dev": true, 1682 | "requires": { 1683 | "md5-hex": "1.3.0", 1684 | "mkdirp": "0.5.1", 1685 | "write-file-atomic": "1.3.4" 1686 | } 1687 | }, 1688 | "camelcase": { 1689 | "version": "1.2.1", 1690 | "bundled": true, 1691 | "dev": true, 1692 | "optional": true 1693 | }, 1694 | "center-align": { 1695 | "version": "0.1.3", 1696 | "bundled": true, 1697 | "dev": true, 1698 | "optional": true, 1699 | "requires": { 1700 | "align-text": "0.1.4", 1701 | "lazy-cache": "1.0.4" 1702 | } 1703 | }, 1704 | "chalk": { 1705 | "version": "1.1.3", 1706 | "bundled": true, 1707 | "dev": true, 1708 | "requires": { 1709 | "ansi-styles": "2.2.1", 1710 | "escape-string-regexp": "1.0.5", 1711 | "has-ansi": "2.0.0", 1712 | "strip-ansi": "3.0.1", 1713 | "supports-color": "2.0.0" 1714 | } 1715 | }, 1716 | "cliui": { 1717 | "version": "2.1.0", 1718 | "bundled": true, 1719 | "dev": true, 1720 | "optional": true, 1721 | "requires": { 1722 | "center-align": "0.1.3", 1723 | "right-align": "0.1.3", 1724 | "wordwrap": "0.0.2" 1725 | }, 1726 | "dependencies": { 1727 | "wordwrap": { 1728 | "version": "0.0.2", 1729 | "bundled": true, 1730 | "dev": true, 1731 | "optional": true 1732 | } 1733 | } 1734 | }, 1735 | "code-point-at": { 1736 | "version": "1.1.0", 1737 | "bundled": true, 1738 | "dev": true 1739 | }, 1740 | "commondir": { 1741 | "version": "1.0.1", 1742 | "bundled": true, 1743 | "dev": true 1744 | }, 1745 | "concat-map": { 1746 | "version": "0.0.1", 1747 | "bundled": true, 1748 | "dev": true 1749 | }, 1750 | "convert-source-map": { 1751 | "version": "1.5.0", 1752 | "bundled": true, 1753 | "dev": true 1754 | }, 1755 | "core-js": { 1756 | "version": "2.5.1", 1757 | "bundled": true, 1758 | "dev": true 1759 | }, 1760 | "cross-spawn": { 1761 | "version": "4.0.2", 1762 | "bundled": true, 1763 | "dev": true, 1764 | "requires": { 1765 | "lru-cache": "4.1.1", 1766 | "which": "1.3.0" 1767 | } 1768 | }, 1769 | "debug": { 1770 | "version": "2.6.8", 1771 | "bundled": true, 1772 | "dev": true, 1773 | "requires": { 1774 | "ms": "2.0.0" 1775 | } 1776 | }, 1777 | "debug-log": { 1778 | "version": "1.0.1", 1779 | "bundled": true, 1780 | "dev": true 1781 | }, 1782 | "decamelize": { 1783 | "version": "1.2.0", 1784 | "bundled": true, 1785 | "dev": true 1786 | }, 1787 | "default-require-extensions": { 1788 | "version": "1.0.0", 1789 | "bundled": true, 1790 | "dev": true, 1791 | "requires": { 1792 | "strip-bom": "2.0.0" 1793 | } 1794 | }, 1795 | "detect-indent": { 1796 | "version": "4.0.0", 1797 | "bundled": true, 1798 | "dev": true, 1799 | "requires": { 1800 | "repeating": "2.0.1" 1801 | } 1802 | }, 1803 | "error-ex": { 1804 | "version": "1.3.1", 1805 | "bundled": true, 1806 | "dev": true, 1807 | "requires": { 1808 | "is-arrayish": "0.2.1" 1809 | } 1810 | }, 1811 | "escape-string-regexp": { 1812 | "version": "1.0.5", 1813 | "bundled": true, 1814 | "dev": true 1815 | }, 1816 | "esutils": { 1817 | "version": "2.0.2", 1818 | "bundled": true, 1819 | "dev": true 1820 | }, 1821 | "execa": { 1822 | "version": "0.7.0", 1823 | "bundled": true, 1824 | "dev": true, 1825 | "requires": { 1826 | "cross-spawn": "5.1.0", 1827 | "get-stream": "3.0.0", 1828 | "is-stream": "1.1.0", 1829 | "npm-run-path": "2.0.2", 1830 | "p-finally": "1.0.0", 1831 | "signal-exit": "3.0.2", 1832 | "strip-eof": "1.0.0" 1833 | }, 1834 | "dependencies": { 1835 | "cross-spawn": { 1836 | "version": "5.1.0", 1837 | "bundled": true, 1838 | "dev": true, 1839 | "requires": { 1840 | "lru-cache": "4.1.1", 1841 | "shebang-command": "1.2.0", 1842 | "which": "1.3.0" 1843 | } 1844 | } 1845 | } 1846 | }, 1847 | "expand-brackets": { 1848 | "version": "0.1.5", 1849 | "bundled": true, 1850 | "dev": true, 1851 | "requires": { 1852 | "is-posix-bracket": "0.1.1" 1853 | } 1854 | }, 1855 | "expand-range": { 1856 | "version": "1.8.2", 1857 | "bundled": true, 1858 | "dev": true, 1859 | "requires": { 1860 | "fill-range": "2.2.3" 1861 | } 1862 | }, 1863 | "extglob": { 1864 | "version": "0.3.2", 1865 | "bundled": true, 1866 | "dev": true, 1867 | "requires": { 1868 | "is-extglob": "1.0.0" 1869 | } 1870 | }, 1871 | "filename-regex": { 1872 | "version": "2.0.1", 1873 | "bundled": true, 1874 | "dev": true 1875 | }, 1876 | "fill-range": { 1877 | "version": "2.2.3", 1878 | "bundled": true, 1879 | "dev": true, 1880 | "requires": { 1881 | "is-number": "2.1.0", 1882 | "isobject": "2.1.0", 1883 | "randomatic": "1.1.7", 1884 | "repeat-element": "1.1.2", 1885 | "repeat-string": "1.6.1" 1886 | } 1887 | }, 1888 | "find-cache-dir": { 1889 | "version": "0.1.1", 1890 | "bundled": true, 1891 | "dev": true, 1892 | "requires": { 1893 | "commondir": "1.0.1", 1894 | "mkdirp": "0.5.1", 1895 | "pkg-dir": "1.0.0" 1896 | } 1897 | }, 1898 | "find-up": { 1899 | "version": "2.1.0", 1900 | "bundled": true, 1901 | "dev": true, 1902 | "requires": { 1903 | "locate-path": "2.0.0" 1904 | } 1905 | }, 1906 | "for-in": { 1907 | "version": "1.0.2", 1908 | "bundled": true, 1909 | "dev": true 1910 | }, 1911 | "for-own": { 1912 | "version": "0.1.5", 1913 | "bundled": true, 1914 | "dev": true, 1915 | "requires": { 1916 | "for-in": "1.0.2" 1917 | } 1918 | }, 1919 | "foreground-child": { 1920 | "version": "1.5.6", 1921 | "bundled": true, 1922 | "dev": true, 1923 | "requires": { 1924 | "cross-spawn": "4.0.2", 1925 | "signal-exit": "3.0.2" 1926 | } 1927 | }, 1928 | "fs.realpath": { 1929 | "version": "1.0.0", 1930 | "bundled": true, 1931 | "dev": true 1932 | }, 1933 | "get-caller-file": { 1934 | "version": "1.0.2", 1935 | "bundled": true, 1936 | "dev": true 1937 | }, 1938 | "get-stream": { 1939 | "version": "3.0.0", 1940 | "bundled": true, 1941 | "dev": true 1942 | }, 1943 | "glob": { 1944 | "version": "7.1.2", 1945 | "bundled": true, 1946 | "dev": true, 1947 | "requires": { 1948 | "fs.realpath": "1.0.0", 1949 | "inflight": "1.0.6", 1950 | "inherits": "2.0.3", 1951 | "minimatch": "3.0.4", 1952 | "once": "1.4.0", 1953 | "path-is-absolute": "1.0.1" 1954 | } 1955 | }, 1956 | "glob-base": { 1957 | "version": "0.3.0", 1958 | "bundled": true, 1959 | "dev": true, 1960 | "requires": { 1961 | "glob-parent": "2.0.0", 1962 | "is-glob": "2.0.1" 1963 | } 1964 | }, 1965 | "glob-parent": { 1966 | "version": "2.0.0", 1967 | "bundled": true, 1968 | "dev": true, 1969 | "requires": { 1970 | "is-glob": "2.0.1" 1971 | } 1972 | }, 1973 | "globals": { 1974 | "version": "9.18.0", 1975 | "bundled": true, 1976 | "dev": true 1977 | }, 1978 | "graceful-fs": { 1979 | "version": "4.1.11", 1980 | "bundled": true, 1981 | "dev": true 1982 | }, 1983 | "handlebars": { 1984 | "version": "4.0.10", 1985 | "bundled": true, 1986 | "dev": true, 1987 | "requires": { 1988 | "async": "1.5.2", 1989 | "optimist": "0.6.1", 1990 | "source-map": "0.4.4", 1991 | "uglify-js": "2.8.29" 1992 | }, 1993 | "dependencies": { 1994 | "source-map": { 1995 | "version": "0.4.4", 1996 | "bundled": true, 1997 | "dev": true, 1998 | "requires": { 1999 | "amdefine": "1.0.1" 2000 | } 2001 | } 2002 | } 2003 | }, 2004 | "has-ansi": { 2005 | "version": "2.0.0", 2006 | "bundled": true, 2007 | "dev": true, 2008 | "requires": { 2009 | "ansi-regex": "2.1.1" 2010 | } 2011 | }, 2012 | "has-flag": { 2013 | "version": "1.0.0", 2014 | "bundled": true, 2015 | "dev": true 2016 | }, 2017 | "hosted-git-info": { 2018 | "version": "2.5.0", 2019 | "bundled": true, 2020 | "dev": true 2021 | }, 2022 | "imurmurhash": { 2023 | "version": "0.1.4", 2024 | "bundled": true, 2025 | "dev": true 2026 | }, 2027 | "inflight": { 2028 | "version": "1.0.6", 2029 | "bundled": true, 2030 | "dev": true, 2031 | "requires": { 2032 | "once": "1.4.0", 2033 | "wrappy": "1.0.2" 2034 | } 2035 | }, 2036 | "inherits": { 2037 | "version": "2.0.3", 2038 | "bundled": true, 2039 | "dev": true 2040 | }, 2041 | "invariant": { 2042 | "version": "2.2.2", 2043 | "bundled": true, 2044 | "dev": true, 2045 | "requires": { 2046 | "loose-envify": "1.3.1" 2047 | } 2048 | }, 2049 | "invert-kv": { 2050 | "version": "1.0.0", 2051 | "bundled": true, 2052 | "dev": true 2053 | }, 2054 | "is-arrayish": { 2055 | "version": "0.2.1", 2056 | "bundled": true, 2057 | "dev": true 2058 | }, 2059 | "is-buffer": { 2060 | "version": "1.1.5", 2061 | "bundled": true, 2062 | "dev": true 2063 | }, 2064 | "is-builtin-module": { 2065 | "version": "1.0.0", 2066 | "bundled": true, 2067 | "dev": true, 2068 | "requires": { 2069 | "builtin-modules": "1.1.1" 2070 | } 2071 | }, 2072 | "is-dotfile": { 2073 | "version": "1.0.3", 2074 | "bundled": true, 2075 | "dev": true 2076 | }, 2077 | "is-equal-shallow": { 2078 | "version": "0.1.3", 2079 | "bundled": true, 2080 | "dev": true, 2081 | "requires": { 2082 | "is-primitive": "2.0.0" 2083 | } 2084 | }, 2085 | "is-extendable": { 2086 | "version": "0.1.1", 2087 | "bundled": true, 2088 | "dev": true 2089 | }, 2090 | "is-extglob": { 2091 | "version": "1.0.0", 2092 | "bundled": true, 2093 | "dev": true 2094 | }, 2095 | "is-finite": { 2096 | "version": "1.0.2", 2097 | "bundled": true, 2098 | "dev": true, 2099 | "requires": { 2100 | "number-is-nan": "1.0.1" 2101 | } 2102 | }, 2103 | "is-fullwidth-code-point": { 2104 | "version": "1.0.0", 2105 | "bundled": true, 2106 | "dev": true, 2107 | "requires": { 2108 | "number-is-nan": "1.0.1" 2109 | } 2110 | }, 2111 | "is-glob": { 2112 | "version": "2.0.1", 2113 | "bundled": true, 2114 | "dev": true, 2115 | "requires": { 2116 | "is-extglob": "1.0.0" 2117 | } 2118 | }, 2119 | "is-number": { 2120 | "version": "2.1.0", 2121 | "bundled": true, 2122 | "dev": true, 2123 | "requires": { 2124 | "kind-of": "3.2.2" 2125 | } 2126 | }, 2127 | "is-posix-bracket": { 2128 | "version": "0.1.1", 2129 | "bundled": true, 2130 | "dev": true 2131 | }, 2132 | "is-primitive": { 2133 | "version": "2.0.0", 2134 | "bundled": true, 2135 | "dev": true 2136 | }, 2137 | "is-stream": { 2138 | "version": "1.1.0", 2139 | "bundled": true, 2140 | "dev": true 2141 | }, 2142 | "is-utf8": { 2143 | "version": "0.2.1", 2144 | "bundled": true, 2145 | "dev": true 2146 | }, 2147 | "isarray": { 2148 | "version": "1.0.0", 2149 | "bundled": true, 2150 | "dev": true 2151 | }, 2152 | "isexe": { 2153 | "version": "2.0.0", 2154 | "bundled": true, 2155 | "dev": true 2156 | }, 2157 | "isobject": { 2158 | "version": "2.1.0", 2159 | "bundled": true, 2160 | "dev": true, 2161 | "requires": { 2162 | "isarray": "1.0.0" 2163 | } 2164 | }, 2165 | "istanbul-lib-coverage": { 2166 | "version": "1.1.1", 2167 | "bundled": true, 2168 | "dev": true 2169 | }, 2170 | "istanbul-lib-hook": { 2171 | "version": "1.0.7", 2172 | "bundled": true, 2173 | "dev": true, 2174 | "requires": { 2175 | "append-transform": "0.4.0" 2176 | } 2177 | }, 2178 | "istanbul-lib-instrument": { 2179 | "version": "1.8.0", 2180 | "bundled": true, 2181 | "dev": true, 2182 | "requires": { 2183 | "babel-generator": "6.26.0", 2184 | "babel-template": "6.26.0", 2185 | "babel-traverse": "6.26.0", 2186 | "babel-types": "6.26.0", 2187 | "babylon": "6.18.0", 2188 | "istanbul-lib-coverage": "1.1.1", 2189 | "semver": "5.4.1" 2190 | } 2191 | }, 2192 | "istanbul-lib-report": { 2193 | "version": "1.1.1", 2194 | "bundled": true, 2195 | "dev": true, 2196 | "requires": { 2197 | "istanbul-lib-coverage": "1.1.1", 2198 | "mkdirp": "0.5.1", 2199 | "path-parse": "1.0.5", 2200 | "supports-color": "3.2.3" 2201 | }, 2202 | "dependencies": { 2203 | "supports-color": { 2204 | "version": "3.2.3", 2205 | "bundled": true, 2206 | "dev": true, 2207 | "requires": { 2208 | "has-flag": "1.0.0" 2209 | } 2210 | } 2211 | } 2212 | }, 2213 | "istanbul-lib-source-maps": { 2214 | "version": "1.2.1", 2215 | "bundled": true, 2216 | "dev": true, 2217 | "requires": { 2218 | "debug": "2.6.8", 2219 | "istanbul-lib-coverage": "1.1.1", 2220 | "mkdirp": "0.5.1", 2221 | "rimraf": "2.6.1", 2222 | "source-map": "0.5.7" 2223 | } 2224 | }, 2225 | "istanbul-reports": { 2226 | "version": "1.1.2", 2227 | "bundled": true, 2228 | "dev": true, 2229 | "requires": { 2230 | "handlebars": "4.0.10" 2231 | } 2232 | }, 2233 | "js-tokens": { 2234 | "version": "3.0.2", 2235 | "bundled": true, 2236 | "dev": true 2237 | }, 2238 | "jsesc": { 2239 | "version": "1.3.0", 2240 | "bundled": true, 2241 | "dev": true 2242 | }, 2243 | "kind-of": { 2244 | "version": "3.2.2", 2245 | "bundled": true, 2246 | "dev": true, 2247 | "requires": { 2248 | "is-buffer": "1.1.5" 2249 | } 2250 | }, 2251 | "lazy-cache": { 2252 | "version": "1.0.4", 2253 | "bundled": true, 2254 | "dev": true, 2255 | "optional": true 2256 | }, 2257 | "lcid": { 2258 | "version": "1.0.0", 2259 | "bundled": true, 2260 | "dev": true, 2261 | "requires": { 2262 | "invert-kv": "1.0.0" 2263 | } 2264 | }, 2265 | "load-json-file": { 2266 | "version": "1.1.0", 2267 | "bundled": true, 2268 | "dev": true, 2269 | "requires": { 2270 | "graceful-fs": "4.1.11", 2271 | "parse-json": "2.2.0", 2272 | "pify": "2.3.0", 2273 | "pinkie-promise": "2.0.1", 2274 | "strip-bom": "2.0.0" 2275 | } 2276 | }, 2277 | "locate-path": { 2278 | "version": "2.0.0", 2279 | "bundled": true, 2280 | "dev": true, 2281 | "requires": { 2282 | "p-locate": "2.0.0", 2283 | "path-exists": "3.0.0" 2284 | }, 2285 | "dependencies": { 2286 | "path-exists": { 2287 | "version": "3.0.0", 2288 | "bundled": true, 2289 | "dev": true 2290 | } 2291 | } 2292 | }, 2293 | "lodash": { 2294 | "version": "4.17.4", 2295 | "bundled": true, 2296 | "dev": true 2297 | }, 2298 | "longest": { 2299 | "version": "1.0.1", 2300 | "bundled": true, 2301 | "dev": true 2302 | }, 2303 | "loose-envify": { 2304 | "version": "1.3.1", 2305 | "bundled": true, 2306 | "dev": true, 2307 | "requires": { 2308 | "js-tokens": "3.0.2" 2309 | } 2310 | }, 2311 | "lru-cache": { 2312 | "version": "4.1.1", 2313 | "bundled": true, 2314 | "dev": true, 2315 | "requires": { 2316 | "pseudomap": "1.0.2", 2317 | "yallist": "2.1.2" 2318 | } 2319 | }, 2320 | "md5-hex": { 2321 | "version": "1.3.0", 2322 | "bundled": true, 2323 | "dev": true, 2324 | "requires": { 2325 | "md5-o-matic": "0.1.1" 2326 | } 2327 | }, 2328 | "md5-o-matic": { 2329 | "version": "0.1.1", 2330 | "bundled": true, 2331 | "dev": true 2332 | }, 2333 | "mem": { 2334 | "version": "1.1.0", 2335 | "bundled": true, 2336 | "dev": true, 2337 | "requires": { 2338 | "mimic-fn": "1.1.0" 2339 | } 2340 | }, 2341 | "merge-source-map": { 2342 | "version": "1.0.4", 2343 | "bundled": true, 2344 | "dev": true, 2345 | "requires": { 2346 | "source-map": "0.5.7" 2347 | } 2348 | }, 2349 | "micromatch": { 2350 | "version": "2.3.11", 2351 | "bundled": true, 2352 | "dev": true, 2353 | "requires": { 2354 | "arr-diff": "2.0.0", 2355 | "array-unique": "0.2.1", 2356 | "braces": "1.8.5", 2357 | "expand-brackets": "0.1.5", 2358 | "extglob": "0.3.2", 2359 | "filename-regex": "2.0.1", 2360 | "is-extglob": "1.0.0", 2361 | "is-glob": "2.0.1", 2362 | "kind-of": "3.2.2", 2363 | "normalize-path": "2.1.1", 2364 | "object.omit": "2.0.1", 2365 | "parse-glob": "3.0.4", 2366 | "regex-cache": "0.4.4" 2367 | } 2368 | }, 2369 | "mimic-fn": { 2370 | "version": "1.1.0", 2371 | "bundled": true, 2372 | "dev": true 2373 | }, 2374 | "minimatch": { 2375 | "version": "3.0.4", 2376 | "bundled": true, 2377 | "dev": true, 2378 | "requires": { 2379 | "brace-expansion": "1.1.8" 2380 | } 2381 | }, 2382 | "minimist": { 2383 | "version": "0.0.8", 2384 | "bundled": true, 2385 | "dev": true 2386 | }, 2387 | "mkdirp": { 2388 | "version": "0.5.1", 2389 | "bundled": true, 2390 | "dev": true, 2391 | "requires": { 2392 | "minimist": "0.0.8" 2393 | } 2394 | }, 2395 | "ms": { 2396 | "version": "2.0.0", 2397 | "bundled": true, 2398 | "dev": true 2399 | }, 2400 | "normalize-package-data": { 2401 | "version": "2.4.0", 2402 | "bundled": true, 2403 | "dev": true, 2404 | "requires": { 2405 | "hosted-git-info": "2.5.0", 2406 | "is-builtin-module": "1.0.0", 2407 | "semver": "5.4.1", 2408 | "validate-npm-package-license": "3.0.1" 2409 | } 2410 | }, 2411 | "normalize-path": { 2412 | "version": "2.1.1", 2413 | "bundled": true, 2414 | "dev": true, 2415 | "requires": { 2416 | "remove-trailing-separator": "1.1.0" 2417 | } 2418 | }, 2419 | "npm-run-path": { 2420 | "version": "2.0.2", 2421 | "bundled": true, 2422 | "dev": true, 2423 | "requires": { 2424 | "path-key": "2.0.1" 2425 | } 2426 | }, 2427 | "number-is-nan": { 2428 | "version": "1.0.1", 2429 | "bundled": true, 2430 | "dev": true 2431 | }, 2432 | "object-assign": { 2433 | "version": "4.1.1", 2434 | "bundled": true, 2435 | "dev": true 2436 | }, 2437 | "object.omit": { 2438 | "version": "2.0.1", 2439 | "bundled": true, 2440 | "dev": true, 2441 | "requires": { 2442 | "for-own": "0.1.5", 2443 | "is-extendable": "0.1.1" 2444 | } 2445 | }, 2446 | "once": { 2447 | "version": "1.4.0", 2448 | "bundled": true, 2449 | "dev": true, 2450 | "requires": { 2451 | "wrappy": "1.0.2" 2452 | } 2453 | }, 2454 | "optimist": { 2455 | "version": "0.6.1", 2456 | "bundled": true, 2457 | "dev": true, 2458 | "requires": { 2459 | "minimist": "0.0.8", 2460 | "wordwrap": "0.0.3" 2461 | } 2462 | }, 2463 | "os-homedir": { 2464 | "version": "1.0.2", 2465 | "bundled": true, 2466 | "dev": true 2467 | }, 2468 | "os-locale": { 2469 | "version": "2.1.0", 2470 | "bundled": true, 2471 | "dev": true, 2472 | "requires": { 2473 | "execa": "0.7.0", 2474 | "lcid": "1.0.0", 2475 | "mem": "1.1.0" 2476 | } 2477 | }, 2478 | "p-finally": { 2479 | "version": "1.0.0", 2480 | "bundled": true, 2481 | "dev": true 2482 | }, 2483 | "p-limit": { 2484 | "version": "1.1.0", 2485 | "bundled": true, 2486 | "dev": true 2487 | }, 2488 | "p-locate": { 2489 | "version": "2.0.0", 2490 | "bundled": true, 2491 | "dev": true, 2492 | "requires": { 2493 | "p-limit": "1.1.0" 2494 | } 2495 | }, 2496 | "parse-glob": { 2497 | "version": "3.0.4", 2498 | "bundled": true, 2499 | "dev": true, 2500 | "requires": { 2501 | "glob-base": "0.3.0", 2502 | "is-dotfile": "1.0.3", 2503 | "is-extglob": "1.0.0", 2504 | "is-glob": "2.0.1" 2505 | } 2506 | }, 2507 | "parse-json": { 2508 | "version": "2.2.0", 2509 | "bundled": true, 2510 | "dev": true, 2511 | "requires": { 2512 | "error-ex": "1.3.1" 2513 | } 2514 | }, 2515 | "path-exists": { 2516 | "version": "2.1.0", 2517 | "bundled": true, 2518 | "dev": true, 2519 | "requires": { 2520 | "pinkie-promise": "2.0.1" 2521 | } 2522 | }, 2523 | "path-is-absolute": { 2524 | "version": "1.0.1", 2525 | "bundled": true, 2526 | "dev": true 2527 | }, 2528 | "path-key": { 2529 | "version": "2.0.1", 2530 | "bundled": true, 2531 | "dev": true 2532 | }, 2533 | "path-parse": { 2534 | "version": "1.0.5", 2535 | "bundled": true, 2536 | "dev": true 2537 | }, 2538 | "path-type": { 2539 | "version": "1.1.0", 2540 | "bundled": true, 2541 | "dev": true, 2542 | "requires": { 2543 | "graceful-fs": "4.1.11", 2544 | "pify": "2.3.0", 2545 | "pinkie-promise": "2.0.1" 2546 | } 2547 | }, 2548 | "pify": { 2549 | "version": "2.3.0", 2550 | "bundled": true, 2551 | "dev": true 2552 | }, 2553 | "pinkie": { 2554 | "version": "2.0.4", 2555 | "bundled": true, 2556 | "dev": true 2557 | }, 2558 | "pinkie-promise": { 2559 | "version": "2.0.1", 2560 | "bundled": true, 2561 | "dev": true, 2562 | "requires": { 2563 | "pinkie": "2.0.4" 2564 | } 2565 | }, 2566 | "pkg-dir": { 2567 | "version": "1.0.0", 2568 | "bundled": true, 2569 | "dev": true, 2570 | "requires": { 2571 | "find-up": "1.1.2" 2572 | }, 2573 | "dependencies": { 2574 | "find-up": { 2575 | "version": "1.1.2", 2576 | "bundled": true, 2577 | "dev": true, 2578 | "requires": { 2579 | "path-exists": "2.1.0", 2580 | "pinkie-promise": "2.0.1" 2581 | } 2582 | } 2583 | } 2584 | }, 2585 | "preserve": { 2586 | "version": "0.2.0", 2587 | "bundled": true, 2588 | "dev": true 2589 | }, 2590 | "pseudomap": { 2591 | "version": "1.0.2", 2592 | "bundled": true, 2593 | "dev": true 2594 | }, 2595 | "randomatic": { 2596 | "version": "1.1.7", 2597 | "bundled": true, 2598 | "dev": true, 2599 | "requires": { 2600 | "is-number": "3.0.0", 2601 | "kind-of": "4.0.0" 2602 | }, 2603 | "dependencies": { 2604 | "is-number": { 2605 | "version": "3.0.0", 2606 | "bundled": true, 2607 | "dev": true, 2608 | "requires": { 2609 | "kind-of": "3.2.2" 2610 | }, 2611 | "dependencies": { 2612 | "kind-of": { 2613 | "version": "3.2.2", 2614 | "bundled": true, 2615 | "dev": true, 2616 | "requires": { 2617 | "is-buffer": "1.1.5" 2618 | } 2619 | } 2620 | } 2621 | }, 2622 | "kind-of": { 2623 | "version": "4.0.0", 2624 | "bundled": true, 2625 | "dev": true, 2626 | "requires": { 2627 | "is-buffer": "1.1.5" 2628 | } 2629 | } 2630 | } 2631 | }, 2632 | "read-pkg": { 2633 | "version": "1.1.0", 2634 | "bundled": true, 2635 | "dev": true, 2636 | "requires": { 2637 | "load-json-file": "1.1.0", 2638 | "normalize-package-data": "2.4.0", 2639 | "path-type": "1.1.0" 2640 | } 2641 | }, 2642 | "read-pkg-up": { 2643 | "version": "1.0.1", 2644 | "bundled": true, 2645 | "dev": true, 2646 | "requires": { 2647 | "find-up": "1.1.2", 2648 | "read-pkg": "1.1.0" 2649 | }, 2650 | "dependencies": { 2651 | "find-up": { 2652 | "version": "1.1.2", 2653 | "bundled": true, 2654 | "dev": true, 2655 | "requires": { 2656 | "path-exists": "2.1.0", 2657 | "pinkie-promise": "2.0.1" 2658 | } 2659 | } 2660 | } 2661 | }, 2662 | "regenerator-runtime": { 2663 | "version": "0.11.0", 2664 | "bundled": true, 2665 | "dev": true 2666 | }, 2667 | "regex-cache": { 2668 | "version": "0.4.4", 2669 | "bundled": true, 2670 | "dev": true, 2671 | "requires": { 2672 | "is-equal-shallow": "0.1.3" 2673 | } 2674 | }, 2675 | "remove-trailing-separator": { 2676 | "version": "1.1.0", 2677 | "bundled": true, 2678 | "dev": true 2679 | }, 2680 | "repeat-element": { 2681 | "version": "1.1.2", 2682 | "bundled": true, 2683 | "dev": true 2684 | }, 2685 | "repeat-string": { 2686 | "version": "1.6.1", 2687 | "bundled": true, 2688 | "dev": true 2689 | }, 2690 | "repeating": { 2691 | "version": "2.0.1", 2692 | "bundled": true, 2693 | "dev": true, 2694 | "requires": { 2695 | "is-finite": "1.0.2" 2696 | } 2697 | }, 2698 | "require-directory": { 2699 | "version": "2.1.1", 2700 | "bundled": true, 2701 | "dev": true 2702 | }, 2703 | "require-main-filename": { 2704 | "version": "1.0.1", 2705 | "bundled": true, 2706 | "dev": true 2707 | }, 2708 | "resolve-from": { 2709 | "version": "2.0.0", 2710 | "bundled": true, 2711 | "dev": true 2712 | }, 2713 | "right-align": { 2714 | "version": "0.1.3", 2715 | "bundled": true, 2716 | "dev": true, 2717 | "optional": true, 2718 | "requires": { 2719 | "align-text": "0.1.4" 2720 | } 2721 | }, 2722 | "rimraf": { 2723 | "version": "2.6.1", 2724 | "bundled": true, 2725 | "dev": true, 2726 | "requires": { 2727 | "glob": "7.1.2" 2728 | } 2729 | }, 2730 | "semver": { 2731 | "version": "5.4.1", 2732 | "bundled": true, 2733 | "dev": true 2734 | }, 2735 | "set-blocking": { 2736 | "version": "2.0.0", 2737 | "bundled": true, 2738 | "dev": true 2739 | }, 2740 | "shebang-command": { 2741 | "version": "1.2.0", 2742 | "bundled": true, 2743 | "dev": true, 2744 | "requires": { 2745 | "shebang-regex": "1.0.0" 2746 | } 2747 | }, 2748 | "shebang-regex": { 2749 | "version": "1.0.0", 2750 | "bundled": true, 2751 | "dev": true 2752 | }, 2753 | "signal-exit": { 2754 | "version": "3.0.2", 2755 | "bundled": true, 2756 | "dev": true 2757 | }, 2758 | "slide": { 2759 | "version": "1.1.6", 2760 | "bundled": true, 2761 | "dev": true 2762 | }, 2763 | "source-map": { 2764 | "version": "0.5.7", 2765 | "bundled": true, 2766 | "dev": true 2767 | }, 2768 | "spawn-wrap": { 2769 | "version": "1.3.8", 2770 | "bundled": true, 2771 | "dev": true, 2772 | "requires": { 2773 | "foreground-child": "1.5.6", 2774 | "mkdirp": "0.5.1", 2775 | "os-homedir": "1.0.2", 2776 | "rimraf": "2.6.1", 2777 | "signal-exit": "3.0.2", 2778 | "which": "1.3.0" 2779 | } 2780 | }, 2781 | "spdx-correct": { 2782 | "version": "1.0.2", 2783 | "bundled": true, 2784 | "dev": true, 2785 | "requires": { 2786 | "spdx-license-ids": "1.2.2" 2787 | } 2788 | }, 2789 | "spdx-expression-parse": { 2790 | "version": "1.0.4", 2791 | "bundled": true, 2792 | "dev": true 2793 | }, 2794 | "spdx-license-ids": { 2795 | "version": "1.2.2", 2796 | "bundled": true, 2797 | "dev": true 2798 | }, 2799 | "string-width": { 2800 | "version": "2.1.1", 2801 | "bundled": true, 2802 | "dev": true, 2803 | "requires": { 2804 | "is-fullwidth-code-point": "2.0.0", 2805 | "strip-ansi": "4.0.0" 2806 | }, 2807 | "dependencies": { 2808 | "ansi-regex": { 2809 | "version": "3.0.0", 2810 | "bundled": true, 2811 | "dev": true 2812 | }, 2813 | "is-fullwidth-code-point": { 2814 | "version": "2.0.0", 2815 | "bundled": true, 2816 | "dev": true 2817 | }, 2818 | "strip-ansi": { 2819 | "version": "4.0.0", 2820 | "bundled": true, 2821 | "dev": true, 2822 | "requires": { 2823 | "ansi-regex": "3.0.0" 2824 | } 2825 | } 2826 | } 2827 | }, 2828 | "strip-ansi": { 2829 | "version": "3.0.1", 2830 | "bundled": true, 2831 | "dev": true, 2832 | "requires": { 2833 | "ansi-regex": "2.1.1" 2834 | } 2835 | }, 2836 | "strip-bom": { 2837 | "version": "2.0.0", 2838 | "bundled": true, 2839 | "dev": true, 2840 | "requires": { 2841 | "is-utf8": "0.2.1" 2842 | } 2843 | }, 2844 | "strip-eof": { 2845 | "version": "1.0.0", 2846 | "bundled": true, 2847 | "dev": true 2848 | }, 2849 | "supports-color": { 2850 | "version": "2.0.0", 2851 | "bundled": true, 2852 | "dev": true 2853 | }, 2854 | "test-exclude": { 2855 | "version": "4.1.1", 2856 | "bundled": true, 2857 | "dev": true, 2858 | "requires": { 2859 | "arrify": "1.0.1", 2860 | "micromatch": "2.3.11", 2861 | "object-assign": "4.1.1", 2862 | "read-pkg-up": "1.0.1", 2863 | "require-main-filename": "1.0.1" 2864 | } 2865 | }, 2866 | "to-fast-properties": { 2867 | "version": "1.0.3", 2868 | "bundled": true, 2869 | "dev": true 2870 | }, 2871 | "trim-right": { 2872 | "version": "1.0.1", 2873 | "bundled": true, 2874 | "dev": true 2875 | }, 2876 | "uglify-js": { 2877 | "version": "2.8.29", 2878 | "bundled": true, 2879 | "dev": true, 2880 | "optional": true, 2881 | "requires": { 2882 | "source-map": "0.5.7", 2883 | "uglify-to-browserify": "1.0.2", 2884 | "yargs": "3.10.0" 2885 | }, 2886 | "dependencies": { 2887 | "yargs": { 2888 | "version": "3.10.0", 2889 | "bundled": true, 2890 | "dev": true, 2891 | "optional": true, 2892 | "requires": { 2893 | "camelcase": "1.2.1", 2894 | "cliui": "2.1.0", 2895 | "decamelize": "1.2.0", 2896 | "window-size": "0.1.0" 2897 | } 2898 | } 2899 | } 2900 | }, 2901 | "uglify-to-browserify": { 2902 | "version": "1.0.2", 2903 | "bundled": true, 2904 | "dev": true, 2905 | "optional": true 2906 | }, 2907 | "validate-npm-package-license": { 2908 | "version": "3.0.1", 2909 | "bundled": true, 2910 | "dev": true, 2911 | "requires": { 2912 | "spdx-correct": "1.0.2", 2913 | "spdx-expression-parse": "1.0.4" 2914 | } 2915 | }, 2916 | "which": { 2917 | "version": "1.3.0", 2918 | "bundled": true, 2919 | "dev": true, 2920 | "requires": { 2921 | "isexe": "2.0.0" 2922 | } 2923 | }, 2924 | "which-module": { 2925 | "version": "2.0.0", 2926 | "bundled": true, 2927 | "dev": true 2928 | }, 2929 | "window-size": { 2930 | "version": "0.1.0", 2931 | "bundled": true, 2932 | "dev": true, 2933 | "optional": true 2934 | }, 2935 | "wordwrap": { 2936 | "version": "0.0.3", 2937 | "bundled": true, 2938 | "dev": true 2939 | }, 2940 | "wrap-ansi": { 2941 | "version": "2.1.0", 2942 | "bundled": true, 2943 | "dev": true, 2944 | "requires": { 2945 | "string-width": "1.0.2", 2946 | "strip-ansi": "3.0.1" 2947 | }, 2948 | "dependencies": { 2949 | "string-width": { 2950 | "version": "1.0.2", 2951 | "bundled": true, 2952 | "dev": true, 2953 | "requires": { 2954 | "code-point-at": "1.1.0", 2955 | "is-fullwidth-code-point": "1.0.0", 2956 | "strip-ansi": "3.0.1" 2957 | } 2958 | } 2959 | } 2960 | }, 2961 | "wrappy": { 2962 | "version": "1.0.2", 2963 | "bundled": true, 2964 | "dev": true 2965 | }, 2966 | "write-file-atomic": { 2967 | "version": "1.3.4", 2968 | "bundled": true, 2969 | "dev": true, 2970 | "requires": { 2971 | "graceful-fs": "4.1.11", 2972 | "imurmurhash": "0.1.4", 2973 | "slide": "1.1.6" 2974 | } 2975 | }, 2976 | "y18n": { 2977 | "version": "3.2.1", 2978 | "bundled": true, 2979 | "dev": true 2980 | }, 2981 | "yallist": { 2982 | "version": "2.1.2", 2983 | "bundled": true, 2984 | "dev": true 2985 | }, 2986 | "yargs": { 2987 | "version": "8.0.2", 2988 | "bundled": true, 2989 | "dev": true, 2990 | "requires": { 2991 | "camelcase": "4.1.0", 2992 | "cliui": "3.2.0", 2993 | "decamelize": "1.2.0", 2994 | "get-caller-file": "1.0.2", 2995 | "os-locale": "2.1.0", 2996 | "read-pkg-up": "2.0.0", 2997 | "require-directory": "2.1.1", 2998 | "require-main-filename": "1.0.1", 2999 | "set-blocking": "2.0.0", 3000 | "string-width": "2.1.1", 3001 | "which-module": "2.0.0", 3002 | "y18n": "3.2.1", 3003 | "yargs-parser": "7.0.0" 3004 | }, 3005 | "dependencies": { 3006 | "camelcase": { 3007 | "version": "4.1.0", 3008 | "bundled": true, 3009 | "dev": true 3010 | }, 3011 | "cliui": { 3012 | "version": "3.2.0", 3013 | "bundled": true, 3014 | "dev": true, 3015 | "requires": { 3016 | "string-width": "1.0.2", 3017 | "strip-ansi": "3.0.1", 3018 | "wrap-ansi": "2.1.0" 3019 | }, 3020 | "dependencies": { 3021 | "string-width": { 3022 | "version": "1.0.2", 3023 | "bundled": true, 3024 | "dev": true, 3025 | "requires": { 3026 | "code-point-at": "1.1.0", 3027 | "is-fullwidth-code-point": "1.0.0", 3028 | "strip-ansi": "3.0.1" 3029 | } 3030 | } 3031 | } 3032 | }, 3033 | "load-json-file": { 3034 | "version": "2.0.0", 3035 | "bundled": true, 3036 | "dev": true, 3037 | "requires": { 3038 | "graceful-fs": "4.1.11", 3039 | "parse-json": "2.2.0", 3040 | "pify": "2.3.0", 3041 | "strip-bom": "3.0.0" 3042 | } 3043 | }, 3044 | "path-type": { 3045 | "version": "2.0.0", 3046 | "bundled": true, 3047 | "dev": true, 3048 | "requires": { 3049 | "pify": "2.3.0" 3050 | } 3051 | }, 3052 | "read-pkg": { 3053 | "version": "2.0.0", 3054 | "bundled": true, 3055 | "dev": true, 3056 | "requires": { 3057 | "load-json-file": "2.0.0", 3058 | "normalize-package-data": "2.4.0", 3059 | "path-type": "2.0.0" 3060 | } 3061 | }, 3062 | "read-pkg-up": { 3063 | "version": "2.0.0", 3064 | "bundled": true, 3065 | "dev": true, 3066 | "requires": { 3067 | "find-up": "2.1.0", 3068 | "read-pkg": "2.0.0" 3069 | } 3070 | }, 3071 | "strip-bom": { 3072 | "version": "3.0.0", 3073 | "bundled": true, 3074 | "dev": true 3075 | }, 3076 | "yargs-parser": { 3077 | "version": "7.0.0", 3078 | "bundled": true, 3079 | "dev": true, 3080 | "requires": { 3081 | "camelcase": "4.1.0" 3082 | } 3083 | } 3084 | } 3085 | }, 3086 | "yargs-parser": { 3087 | "version": "5.0.0", 3088 | "bundled": true, 3089 | "dev": true, 3090 | "requires": { 3091 | "camelcase": "3.0.0" 3092 | }, 3093 | "dependencies": { 3094 | "camelcase": { 3095 | "version": "3.0.0", 3096 | "bundled": true, 3097 | "dev": true 3098 | } 3099 | } 3100 | } 3101 | } 3102 | }, 3103 | "oauth-sign": { 3104 | "version": "0.8.2", 3105 | "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.8.2.tgz", 3106 | "integrity": "sha1-Rqarfwrq2N6unsBWV4C31O/rnUM=", 3107 | "dev": true 3108 | }, 3109 | "object-assign": { 3110 | "version": "4.1.1", 3111 | "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", 3112 | "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", 3113 | "dev": true 3114 | }, 3115 | "once": { 3116 | "version": "1.4.0", 3117 | "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", 3118 | "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", 3119 | "dev": true, 3120 | "requires": { 3121 | "wrappy": "1.0.2" 3122 | } 3123 | }, 3124 | "onetime": { 3125 | "version": "2.0.1", 3126 | "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz", 3127 | "integrity": "sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ=", 3128 | "dev": true, 3129 | "requires": { 3130 | "mimic-fn": "1.1.0" 3131 | } 3132 | }, 3133 | "optionator": { 3134 | "version": "0.8.2", 3135 | "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.2.tgz", 3136 | "integrity": "sha1-NkxeQJ0/TWMB1sC0wFu6UBgK62Q=", 3137 | "dev": true, 3138 | "requires": { 3139 | "deep-is": "0.1.3", 3140 | "fast-levenshtein": "2.0.6", 3141 | "levn": "0.3.0", 3142 | "prelude-ls": "1.1.2", 3143 | "type-check": "0.3.2", 3144 | "wordwrap": "1.0.0" 3145 | } 3146 | }, 3147 | "os-tmpdir": { 3148 | "version": "1.0.2", 3149 | "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", 3150 | "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", 3151 | "dev": true 3152 | }, 3153 | "path-is-absolute": { 3154 | "version": "1.0.1", 3155 | "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", 3156 | "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", 3157 | "dev": true 3158 | }, 3159 | "path-is-inside": { 3160 | "version": "1.0.2", 3161 | "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz", 3162 | "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=", 3163 | "dev": true 3164 | }, 3165 | "pathval": { 3166 | "version": "1.1.0", 3167 | "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.0.tgz", 3168 | "integrity": "sha1-uULm1L3mUwBe9rcTYd74cn0GReA=", 3169 | "dev": true 3170 | }, 3171 | "pify": { 3172 | "version": "2.3.0", 3173 | "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", 3174 | "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", 3175 | "dev": true 3176 | }, 3177 | "pinkie": { 3178 | "version": "2.0.4", 3179 | "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", 3180 | "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=", 3181 | "dev": true 3182 | }, 3183 | "pinkie-promise": { 3184 | "version": "2.0.1", 3185 | "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", 3186 | "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", 3187 | "dev": true, 3188 | "requires": { 3189 | "pinkie": "2.0.4" 3190 | } 3191 | }, 3192 | "pluralize": { 3193 | "version": "4.0.0", 3194 | "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-4.0.0.tgz", 3195 | "integrity": "sha1-WbcIwcAZCi9pLxx2GMRGsFL9F2I=", 3196 | "dev": true 3197 | }, 3198 | "prelude-ls": { 3199 | "version": "1.1.2", 3200 | "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", 3201 | "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=", 3202 | "dev": true 3203 | }, 3204 | "process-nextick-args": { 3205 | "version": "1.0.7", 3206 | "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.7.tgz", 3207 | "integrity": "sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M=" 3208 | }, 3209 | "progress": { 3210 | "version": "2.0.0", 3211 | "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.0.tgz", 3212 | "integrity": "sha1-ihvjZr+Pwj2yvSPxDG/pILQ4nR8=", 3213 | "dev": true 3214 | }, 3215 | "pseudomap": { 3216 | "version": "1.0.2", 3217 | "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", 3218 | "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=", 3219 | "dev": true 3220 | }, 3221 | "punycode": { 3222 | "version": "1.4.1", 3223 | "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", 3224 | "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", 3225 | "dev": true 3226 | }, 3227 | "qs": { 3228 | "version": "6.3.2", 3229 | "resolved": "https://registry.npmjs.org/qs/-/qs-6.3.2.tgz", 3230 | "integrity": "sha1-51vV9uJoEioqDgvaYwslUMFmUCw=", 3231 | "dev": true 3232 | }, 3233 | "readable-stream": { 3234 | "version": "2.3.3", 3235 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.3.tgz", 3236 | "integrity": "sha512-m+qzzcn7KUxEmd1gMbchF+Y2eIUbieUaxkWtptyHywrX0rE8QEYqPC07Vuy4Wm32/xE16NcdBctb8S0Xe/5IeQ==", 3237 | "dev": true, 3238 | "requires": { 3239 | "core-util-is": "1.0.2", 3240 | "inherits": "2.0.3", 3241 | "isarray": "1.0.0", 3242 | "process-nextick-args": "1.0.7", 3243 | "safe-buffer": "5.1.1", 3244 | "string_decoder": "1.0.3", 3245 | "util-deprecate": "1.0.2" 3246 | } 3247 | }, 3248 | "request": { 3249 | "version": "2.79.0", 3250 | "resolved": "https://registry.npmjs.org/request/-/request-2.79.0.tgz", 3251 | "integrity": "sha1-Tf5b9r6LjNw3/Pk+BLZVd3InEN4=", 3252 | "dev": true, 3253 | "requires": { 3254 | "aws-sign2": "0.6.0", 3255 | "aws4": "1.6.0", 3256 | "caseless": "0.11.0", 3257 | "combined-stream": "1.0.5", 3258 | "extend": "3.0.1", 3259 | "forever-agent": "0.6.1", 3260 | "form-data": "2.1.4", 3261 | "har-validator": "2.0.6", 3262 | "hawk": "3.1.3", 3263 | "http-signature": "1.1.1", 3264 | "is-typedarray": "1.0.0", 3265 | "isstream": "0.1.2", 3266 | "json-stringify-safe": "5.0.1", 3267 | "mime-types": "2.1.17", 3268 | "oauth-sign": "0.8.2", 3269 | "qs": "6.3.2", 3270 | "stringstream": "0.0.5", 3271 | "tough-cookie": "2.3.2", 3272 | "tunnel-agent": "0.4.3", 3273 | "uuid": "3.1.0" 3274 | } 3275 | }, 3276 | "require_optional": { 3277 | "version": "1.0.1", 3278 | "resolved": "https://registry.npmjs.org/require_optional/-/require_optional-1.0.1.tgz", 3279 | "integrity": "sha512-qhM/y57enGWHAe3v/NcwML6a3/vfESLe/sGM2dII+gEO0BpKRUkWZow/tyloNqJyN6kXSl3RyyM8Ll5D/sJP8g==", 3280 | "requires": { 3281 | "resolve-from": "2.0.0", 3282 | "semver": "5.4.1" 3283 | } 3284 | }, 3285 | "require-uncached": { 3286 | "version": "1.0.3", 3287 | "resolved": "https://registry.npmjs.org/require-uncached/-/require-uncached-1.0.3.tgz", 3288 | "integrity": "sha1-Tg1W1slmL9MeQwEcS5WqSZVUIdM=", 3289 | "dev": true, 3290 | "requires": { 3291 | "caller-path": "0.1.0", 3292 | "resolve-from": "1.0.1" 3293 | }, 3294 | "dependencies": { 3295 | "resolve-from": { 3296 | "version": "1.0.1", 3297 | "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-1.0.1.tgz", 3298 | "integrity": "sha1-Jsv+k10a7uq7Kbw/5a6wHpPUQiY=", 3299 | "dev": true 3300 | } 3301 | } 3302 | }, 3303 | "resolve-from": { 3304 | "version": "2.0.0", 3305 | "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-2.0.0.tgz", 3306 | "integrity": "sha1-lICrIOlP+h2egKgEx+oUdhGWa1c=" 3307 | }, 3308 | "restore-cursor": { 3309 | "version": "2.0.0", 3310 | "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz", 3311 | "integrity": "sha1-n37ih/gv0ybU/RYpI9YhKe7g368=", 3312 | "dev": true, 3313 | "requires": { 3314 | "onetime": "2.0.1", 3315 | "signal-exit": "3.0.2" 3316 | } 3317 | }, 3318 | "rimraf": { 3319 | "version": "2.6.2", 3320 | "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.2.tgz", 3321 | "integrity": "sha512-lreewLK/BlghmxtfH36YYVg1i8IAce4TI7oao75I1g245+6BctqTVQiBP3YUJ9C6DQOXJmkYR9X9fCLtCOJc5w==", 3322 | "dev": true, 3323 | "requires": { 3324 | "glob": "7.1.1" 3325 | } 3326 | }, 3327 | "run-async": { 3328 | "version": "2.3.0", 3329 | "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.3.0.tgz", 3330 | "integrity": "sha1-A3GrSuC91yDUFm19/aZP96RFpsA=", 3331 | "dev": true, 3332 | "requires": { 3333 | "is-promise": "2.1.0" 3334 | } 3335 | }, 3336 | "rx-lite": { 3337 | "version": "4.0.8", 3338 | "resolved": "https://registry.npmjs.org/rx-lite/-/rx-lite-4.0.8.tgz", 3339 | "integrity": "sha1-Cx4Rr4vESDbwSmQH6S2kJGe3lEQ=", 3340 | "dev": true 3341 | }, 3342 | "rx-lite-aggregates": { 3343 | "version": "4.0.8", 3344 | "resolved": "https://registry.npmjs.org/rx-lite-aggregates/-/rx-lite-aggregates-4.0.8.tgz", 3345 | "integrity": "sha1-dTuHqJoRyVRnxKwWJsTvxOBcZ74=", 3346 | "dev": true, 3347 | "requires": { 3348 | "rx-lite": "4.0.8" 3349 | } 3350 | }, 3351 | "safe-buffer": { 3352 | "version": "5.1.1", 3353 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz", 3354 | "integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg==" 3355 | }, 3356 | "semver": { 3357 | "version": "5.4.1", 3358 | "resolved": "https://registry.npmjs.org/semver/-/semver-5.4.1.tgz", 3359 | "integrity": "sha512-WfG/X9+oATh81XtllIo/I8gOiY9EXRdv1cQdyykeXK17YcUW3EXUAi2To4pcH6nZtJPr7ZOpM5OMyWJZm+8Rsg==" 3360 | }, 3361 | "shebang-command": { 3362 | "version": "1.2.0", 3363 | "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", 3364 | "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", 3365 | "dev": true, 3366 | "requires": { 3367 | "shebang-regex": "1.0.0" 3368 | } 3369 | }, 3370 | "shebang-regex": { 3371 | "version": "1.0.0", 3372 | "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", 3373 | "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", 3374 | "dev": true 3375 | }, 3376 | "signal-exit": { 3377 | "version": "3.0.2", 3378 | "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", 3379 | "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=", 3380 | "dev": true 3381 | }, 3382 | "slice-ansi": { 3383 | "version": "0.0.4", 3384 | "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-0.0.4.tgz", 3385 | "integrity": "sha1-7b+JA/ZvfOL46v1s7tZeJkyDGzU=", 3386 | "dev": true 3387 | }, 3388 | "sntp": { 3389 | "version": "1.0.9", 3390 | "resolved": "https://registry.npmjs.org/sntp/-/sntp-1.0.9.tgz", 3391 | "integrity": "sha1-ZUEYTMkK7qbG57NeJlkIJEPGYZg=", 3392 | "dev": true, 3393 | "requires": { 3394 | "hoek": "2.16.3" 3395 | } 3396 | }, 3397 | "sprintf-js": { 3398 | "version": "1.0.3", 3399 | "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", 3400 | "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", 3401 | "dev": true 3402 | }, 3403 | "sshpk": { 3404 | "version": "1.13.1", 3405 | "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.13.1.tgz", 3406 | "integrity": "sha1-US322mKHFEMW3EwY/hzx2UBzm+M=", 3407 | "dev": true, 3408 | "requires": { 3409 | "asn1": "0.2.3", 3410 | "assert-plus": "1.0.0", 3411 | "bcrypt-pbkdf": "1.0.1", 3412 | "dashdash": "1.14.1", 3413 | "ecc-jsbn": "0.1.1", 3414 | "getpass": "0.1.7", 3415 | "jsbn": "0.1.1", 3416 | "tweetnacl": "0.14.5" 3417 | }, 3418 | "dependencies": { 3419 | "assert-plus": { 3420 | "version": "1.0.0", 3421 | "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", 3422 | "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", 3423 | "dev": true 3424 | } 3425 | } 3426 | }, 3427 | "string_decoder": { 3428 | "version": "1.0.3", 3429 | "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz", 3430 | "integrity": "sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ==", 3431 | "requires": { 3432 | "safe-buffer": "5.1.1" 3433 | } 3434 | }, 3435 | "string-width": { 3436 | "version": "2.1.1", 3437 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", 3438 | "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", 3439 | "dev": true, 3440 | "requires": { 3441 | "is-fullwidth-code-point": "2.0.0", 3442 | "strip-ansi": "4.0.0" 3443 | }, 3444 | "dependencies": { 3445 | "ansi-regex": { 3446 | "version": "3.0.0", 3447 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", 3448 | "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", 3449 | "dev": true 3450 | }, 3451 | "strip-ansi": { 3452 | "version": "4.0.0", 3453 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", 3454 | "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", 3455 | "dev": true, 3456 | "requires": { 3457 | "ansi-regex": "3.0.0" 3458 | } 3459 | } 3460 | } 3461 | }, 3462 | "stringstream": { 3463 | "version": "0.0.5", 3464 | "resolved": "https://registry.npmjs.org/stringstream/-/stringstream-0.0.5.tgz", 3465 | "integrity": "sha1-TkhM1N5aC7vuGORjB3EKioFiGHg=", 3466 | "dev": true 3467 | }, 3468 | "strip-ansi": { 3469 | "version": "3.0.1", 3470 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", 3471 | "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", 3472 | "dev": true, 3473 | "requires": { 3474 | "ansi-regex": "2.1.1" 3475 | } 3476 | }, 3477 | "strip-json-comments": { 3478 | "version": "2.0.1", 3479 | "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", 3480 | "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", 3481 | "dev": true 3482 | }, 3483 | "supports-color": { 3484 | "version": "3.1.2", 3485 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.1.2.tgz", 3486 | "integrity": "sha1-cqJiiU2dQIuVbKBf83su2KbiotU=", 3487 | "dev": true, 3488 | "requires": { 3489 | "has-flag": "1.0.0" 3490 | } 3491 | }, 3492 | "table": { 3493 | "version": "4.0.1", 3494 | "resolved": "https://registry.npmjs.org/table/-/table-4.0.1.tgz", 3495 | "integrity": "sha1-qBFsEz+sLGH0pCCrbN9cTWHw5DU=", 3496 | "dev": true, 3497 | "requires": { 3498 | "ajv": "4.11.8", 3499 | "ajv-keywords": "1.5.1", 3500 | "chalk": "1.1.3", 3501 | "lodash": "4.17.4", 3502 | "slice-ansi": "0.0.4", 3503 | "string-width": "2.1.1" 3504 | }, 3505 | "dependencies": { 3506 | "ajv": { 3507 | "version": "4.11.8", 3508 | "resolved": "https://registry.npmjs.org/ajv/-/ajv-4.11.8.tgz", 3509 | "integrity": "sha1-gv+wKynmYq5TvcIK8VlHcGc5xTY=", 3510 | "dev": true, 3511 | "requires": { 3512 | "co": "4.6.0", 3513 | "json-stable-stringify": "1.0.1" 3514 | } 3515 | } 3516 | } 3517 | }, 3518 | "text-table": { 3519 | "version": "0.2.0", 3520 | "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", 3521 | "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", 3522 | "dev": true 3523 | }, 3524 | "through": { 3525 | "version": "2.3.8", 3526 | "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", 3527 | "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", 3528 | "dev": true 3529 | }, 3530 | "tmp": { 3531 | "version": "0.0.31", 3532 | "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.31.tgz", 3533 | "integrity": "sha1-jzirlDjhcxXl29izZX6L+yd65Kc=", 3534 | "dev": true, 3535 | "requires": { 3536 | "os-tmpdir": "1.0.2" 3537 | } 3538 | }, 3539 | "tough-cookie": { 3540 | "version": "2.3.2", 3541 | "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.3.2.tgz", 3542 | "integrity": "sha1-8IH3bkyFcg5sN6X6ztc3FQ2EByo=", 3543 | "dev": true, 3544 | "requires": { 3545 | "punycode": "1.4.1" 3546 | } 3547 | }, 3548 | "tryit": { 3549 | "version": "1.0.3", 3550 | "resolved": "https://registry.npmjs.org/tryit/-/tryit-1.0.3.tgz", 3551 | "integrity": "sha1-OTvnMKlEb9Hq1tpZoBQwjzbCics=", 3552 | "dev": true 3553 | }, 3554 | "tunnel-agent": { 3555 | "version": "0.4.3", 3556 | "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.4.3.tgz", 3557 | "integrity": "sha1-Y3PbdpCf5XDgjXNYM2Xtgop07us=", 3558 | "dev": true 3559 | }, 3560 | "tweetnacl": { 3561 | "version": "0.14.5", 3562 | "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", 3563 | "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", 3564 | "dev": true, 3565 | "optional": true 3566 | }, 3567 | "type-check": { 3568 | "version": "0.3.2", 3569 | "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", 3570 | "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", 3571 | "dev": true, 3572 | "requires": { 3573 | "prelude-ls": "1.1.2" 3574 | } 3575 | }, 3576 | "type-detect": { 3577 | "version": "4.0.3", 3578 | "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.3.tgz", 3579 | "integrity": "sha1-Dj8mcLRAmbC0bChNE2p+9Jx0wuo=", 3580 | "dev": true 3581 | }, 3582 | "typedarray": { 3583 | "version": "0.0.6", 3584 | "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", 3585 | "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=", 3586 | "dev": true 3587 | }, 3588 | "util-deprecate": { 3589 | "version": "1.0.2", 3590 | "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", 3591 | "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" 3592 | }, 3593 | "uuid": { 3594 | "version": "3.1.0", 3595 | "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.1.0.tgz", 3596 | "integrity": "sha512-DIWtzUkw04M4k3bf1IcpS2tngXEL26YUD2M0tMDUpnUrz2hgzUBlD55a4FjdLGPvfHxS6uluGWvaVEqgBcVa+g==", 3597 | "dev": true 3598 | }, 3599 | "verror": { 3600 | "version": "1.10.0", 3601 | "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", 3602 | "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", 3603 | "dev": true, 3604 | "requires": { 3605 | "assert-plus": "1.0.0", 3606 | "core-util-is": "1.0.2", 3607 | "extsprintf": "1.3.0" 3608 | }, 3609 | "dependencies": { 3610 | "assert-plus": { 3611 | "version": "1.0.0", 3612 | "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", 3613 | "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", 3614 | "dev": true 3615 | } 3616 | } 3617 | }, 3618 | "which": { 3619 | "version": "1.3.0", 3620 | "resolved": "https://registry.npmjs.org/which/-/which-1.3.0.tgz", 3621 | "integrity": "sha512-xcJpopdamTuY5duC/KnTTNBraPK54YwpenP4lzxU8H91GudWpFv38u0CKjclE1Wi2EH2EDz5LRcHcKbCIzqGyg==", 3622 | "dev": true, 3623 | "requires": { 3624 | "isexe": "2.0.0" 3625 | } 3626 | }, 3627 | "wordwrap": { 3628 | "version": "1.0.0", 3629 | "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", 3630 | "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=", 3631 | "dev": true 3632 | }, 3633 | "wrappy": { 3634 | "version": "1.0.2", 3635 | "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", 3636 | "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", 3637 | "dev": true 3638 | }, 3639 | "write": { 3640 | "version": "0.2.1", 3641 | "resolved": "https://registry.npmjs.org/write/-/write-0.2.1.tgz", 3642 | "integrity": "sha1-X8A4KOJkzqP+kUVUdvejxWbLB1c=", 3643 | "dev": true, 3644 | "requires": { 3645 | "mkdirp": "0.5.1" 3646 | } 3647 | }, 3648 | "xtend": { 3649 | "version": "4.0.1", 3650 | "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz", 3651 | "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=", 3652 | "dev": true 3653 | }, 3654 | "yallist": { 3655 | "version": "2.1.2", 3656 | "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", 3657 | "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=", 3658 | "dev": true 3659 | } 3660 | } 3661 | } 3662 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "microq", 3 | "version": "1.1.0", 4 | "description": "Micro job queue built on mongo", 5 | "main": "index.js", 6 | "scripts": { 7 | "test": "cross-env NODE_ENV=test nyc --reporter=text-summary mocha --recursive --throw-deprecation", 8 | "coverage": "nyc report --reporter=text-lcov | coveralls", 9 | "lint": "eslint .", 10 | "lint:fix": "eslint . --fix" 11 | }, 12 | "repository": { 13 | "type": "git", 14 | "url": "git+https://github.com/saintedlama/microq.git" 15 | }, 16 | "keywords": [ 17 | "mq", 18 | "queue", 19 | "job queue" 20 | ], 21 | "author": "Christoph Walcher ", 22 | "license": "ISC", 23 | "bugs": { 24 | "url": "https://github.com/saintedlama/microq/issues" 25 | }, 26 | "homepage": "https://github.com/saintedlama/microq#readme", 27 | "devDependencies": { 28 | "chai": "^4.1.2", 29 | "coveralls": "^2.13.1", 30 | "cross-env": "^5.0.5", 31 | "eslint": "^4.6.1", 32 | "mocha": "^3.5.3", 33 | "nyc": "^11.2.1" 34 | }, 35 | "dependencies": { 36 | "debug": "^3.0.1", 37 | "mongoist": "^1.0.1" 38 | } 39 | } 40 | -------------------------------------------------------------------------------- /test/microq.js: -------------------------------------------------------------------------------- 1 | const { expect } = require('chai'); 2 | 3 | const mongoist = require('mongoist'); 4 | const microq = require('..'); 5 | 6 | const connectionUrl = 'mongodb://localhost/microqtests'; 7 | 8 | const db = mongoist(connectionUrl); 9 | const jobs = db.jobs; 10 | 11 | describe('microq', function() { 12 | this.timeout(5000); 13 | 14 | beforeEach(() => jobs.remove({})); 15 | 16 | it('should enqueue jobs', async () => { 17 | const queue = microq(connectionUrl); 18 | 19 | const job = await queue.enqueue('jobName', { foo: 'bar' }); 20 | expect(job).to.exist; 21 | 22 | const persistedJobs = await jobs.find({}); 23 | 24 | expect(persistedJobs).to.have.length(1); 25 | 26 | expect(persistedJobs[0]._id).to.exist; 27 | expect(persistedJobs[0].name).to.equal('jobName'); 28 | expect(persistedJobs[0].params).to.deep.equal({ foo: 'bar' }); 29 | expect(persistedJobs[0].priority).to.be.null; 30 | }); 31 | 32 | it('should dequeue jobs', async () => { 33 | const queue = microq(connectionUrl); 34 | 35 | await queue.enqueue('jobName', { foo: 'bar' }); 36 | 37 | return new Promise((resolve) => { 38 | queue.start({ 39 | jobName: (params) => { 40 | expect(params).to.deep.equal({ foo: 'bar' }); 41 | resolve(); 42 | } 43 | }, { interval: 500 }); 44 | }); 45 | }); 46 | 47 | it('should start the queue with default options if not specified ', async () => { 48 | const queue = microq(connectionUrl); 49 | 50 | return new Promise((resolve) => { 51 | queue.on('empty', resolve); 52 | 53 | queue.start({ 54 | jobName: () => {} 55 | }); 56 | }); 57 | }); 58 | 59 | it('should not poll for jobs if stopped', async () => { 60 | const queue = microq(connectionUrl); 61 | 62 | return new Promise((resolve) => { 63 | queue.on('stopped', resolve); 64 | queue.on('completed', resolve); 65 | 66 | queue.start({ 67 | jobName: () => { throw new Error('Should not be processed after queue being stopped!'); } 68 | }); 69 | 70 | queue.stop(); 71 | 72 | queue.enqueue('jobName', {}); 73 | }); 74 | }); 75 | 76 | it('should recover dequeued but not completed or failed jobs', async () => { 77 | const queue = microq(connectionUrl); 78 | 79 | const job = await queue.enqueue('jobName', { foo: 'bar' }); 80 | 81 | await jobs.update({ _id: job._id}, { $set: { status: 'dequeued' }}); 82 | 83 | return new Promise((resolve) => { 84 | queue.start({ 85 | jobName: resolve 86 | }, { 87 | interval: 500, 88 | recover: true 89 | }); 90 | }); 91 | }); 92 | 93 | it('should not recover if specified', async () => { 94 | const queue = microq(connectionUrl); 95 | 96 | const job = await queue.enqueue('jobName', { foo: 'bar' }); 97 | await jobs.update({ _id: job._id}, { $set: { status: 'dequeued' }}); 98 | 99 | return new Promise((resolve, reject) => { 100 | queue.on('empty', resolve); 101 | 102 | queue.start({ 103 | jobName: reject 104 | }, { 105 | interval: 100, 106 | recover: false 107 | }); 108 | }); 109 | }); 110 | 111 | it('should fire empty events if no jobs found in queue', async () => { 112 | const queue = microq(connectionUrl); 113 | 114 | return new Promise((resolve) => { 115 | queue.on('empty', resolve); 116 | 117 | queue.start({ jobName: resolve }, { interval: 500 }); 118 | }); 119 | }); 120 | 121 | it('should fire failed events if a job fails', async () => { 122 | const queue = microq(connectionUrl); 123 | 124 | await queue.enqueue('jobName', { foo: 'bar' }); 125 | 126 | return new Promise((resolve) => { 127 | queue.on('failed', resolve); 128 | 129 | queue.start({ 130 | jobName: () => { 131 | throw new Error('does not work'); 132 | } 133 | }, { interval: 500 }); 134 | }); 135 | }); 136 | 137 | it('should fire completed events if a job completes without an error', async () => { 138 | const queue = microq(connectionUrl); 139 | 140 | await queue.enqueue('jobName', { foo: 'bar' }); 141 | 142 | return new Promise((resolve) => { 143 | queue.on('completed', resolve); 144 | 145 | queue.start({ jobName: resolve }, { interval: 500 }); 146 | }); 147 | }); 148 | 149 | it('should allow querying for jobs', async () => { 150 | const queue = microq(connectionUrl); 151 | 152 | await queue.enqueue('jobName', { foo: 'bar' }); 153 | 154 | const enqueuedJobs = await queue.query(); 155 | expect(enqueuedJobs).to.have.length(1); 156 | 157 | const dequeuedJobs = await queue.query('dequeued'); 158 | expect(dequeuedJobs).to.have.length(0); 159 | }); 160 | 161 | it('should execute jobs serial if specified', async () => { 162 | const queue = microq(connectionUrl); 163 | 164 | await queue.enqueue('jobName', { foo: 1 }); 165 | await queue.enqueue('jobName', { foo: 2 }); 166 | 167 | return new Promise((resolve, reject) => { 168 | queue.on('empty', resolve); 169 | 170 | let runningJobs = 0; 171 | 172 | queue.start({ 173 | jobName: async () => { 174 | if (runningJobs > 0) { 175 | reject(new Error('Another job is running...')); 176 | } 177 | 178 | runningJobs++; 179 | 180 | await timeout(500); 181 | 182 | if (runningJobs != 1) { 183 | reject(new Error('Another job was started...')); 184 | } 185 | 186 | runningJobs--; 187 | } 188 | }, { interval: 100, parallel: false }); 189 | }); 190 | }); 191 | 192 | it('should execute jobs in parallel if specified', async () => { 193 | const queue = microq(connectionUrl); 194 | 195 | await queue.enqueue('jobName', { foo: 1 }); 196 | await queue.enqueue('jobName', { foo: 2 }); 197 | 198 | return new Promise((resolve) => { 199 | let runningJobs = 0; 200 | const startJob = () => { 201 | runningJobs++; 202 | 203 | if (runningJobs == 2) { 204 | resolve(); 205 | } 206 | } 207 | 208 | queue.start({ 209 | jobName: async () => { 210 | startJob(); 211 | 212 | await timeout(500); 213 | } 214 | }, { interval: 100, parallel: true }); 215 | }); 216 | }); 217 | 218 | it('should cleanup completed and failed jobs', async () => { 219 | const queue = microq(connectionUrl); 220 | 221 | await queue.enqueue('jobName', { foo: 'bar' }); 222 | await queue.enqueue('jobName', { foo: 'bar' }); 223 | 224 | return new Promise((resolve) => { 225 | queue.on('empty', async () => { 226 | await queue.cleanup(); 227 | 228 | const jobDocuments = await jobs.find({}); 229 | expect(jobDocuments).to.have.length(0); 230 | 231 | resolve(); 232 | }); 233 | 234 | queue.start({ jobName: resolve }, { interval: 100 }); 235 | }); 236 | }); 237 | 238 | it('should cleanup with beforeDate specified', async () => { 239 | const queue = microq(connectionUrl); 240 | 241 | await queue.enqueue('jobName', { foo: 'bar' }); 242 | await queue.enqueue('jobName', { foo: 'bar' }); 243 | 244 | return new Promise((resolve) => { 245 | queue.on('empty', async () => { 246 | await queue.cleanup(new Date()); 247 | 248 | const jobDocuments = await jobs.find({}); 249 | expect(jobDocuments).to.have.length(0); 250 | 251 | resolve(); 252 | }); 253 | 254 | queue.start({ jobName: resolve }, { interval: 100 }); 255 | }); 256 | }); 257 | }); 258 | 259 | function timeout(ms) { 260 | return new Promise(resolve => setTimeout(resolve, ms)); 261 | } --------------------------------------------------------------------------------