├── .editorconfig ├── .github ├── contributing.md ├── issue_template.md └── pull_request_template.md ├── .gitignore ├── .istanbul.yml ├── .npmignore ├── .travis.yml ├── CHANGELOG.md ├── LICENSE ├── README.md ├── lib ├── hooks │ ├── hash-password.js │ ├── index.js │ └── protect.js ├── index.js ├── utils │ └── hash.js └── verifier.js ├── mocha.opts ├── package-lock.json ├── package.json └── test ├── hooks ├── hash-password.test.js ├── index.test.js └── protect.test.js ├── index.test.js ├── integration.test.js └── verifier.test.js /.editorconfig: -------------------------------------------------------------------------------- 1 | # http://editorconfig.org 2 | root = true 3 | 4 | [*] 5 | indent_style = space 6 | indent_size = 2 7 | end_of_line = lf 8 | charset = utf-8 9 | trim_trailing_whitespace = true 10 | insert_final_newline = true 11 | 12 | [*.md] 13 | trim_trailing_whitespace = false 14 | -------------------------------------------------------------------------------- /.github/contributing.md: -------------------------------------------------------------------------------- 1 | # Contributing to Feathers 2 | 3 | Thank you for contributing to Feathers! :heart: :tada: 4 | 5 | This repo is the main core and where most issues are reported. Feathers embraces modularity and is broken up across many repos. To make this easier to manage we currently use [Zenhub](https://www.zenhub.com/) for issue triage and visibility. They have a free browser plugin you can install so that you can see what is in flight at any time, but of course you also always see current issues in Github. 6 | 7 | ## Report a bug 8 | 9 | Before creating an issue please make sure you have checked out the docs, specifically the [FAQ](https://docs.feathersjs.com/help/faq.html) section. You might want to also try searching Github. It's pretty likely someone has already asked a similar question. 10 | 11 | If you haven't found your answer please feel free to join our [slack channel](http://slack.feathersjs.com), create an issue on Github, or post on [Stackoverflow](http://stackoverflow.com) using the `feathers` or `feathersjs` tag. We try our best to monitor Stackoverflow but you're likely to get more immediate responses in Slack and Github. 12 | 13 | Issues can be reported in the [issue tracker](https://github.com/feathersjs/feathers/issues). Since feathers combines many modules it can be hard for us to assess the root cause without knowing which modules are being used and what your configuration looks like, so **it helps us immensely if you can link to a simple example that reproduces your issue**. 14 | 15 | ## Report a Security Concern 16 | 17 | We take security very seriously at Feathers. We welcome any peer review of our 100% open source code to ensure nobody's Feathers app is ever compromised or hacked. As a web application developer you are responsible for any security breaches. We do our very best to make sure Feathers is as secure as possible by default. 18 | 19 | In order to give the community time to respond and upgrade we strongly urge you report all security issues to us. Send one of the core team members a PM in [Slack](http://slack.feathersjs.com) or email us at hello@feathersjs.com with details and we will respond ASAP. 20 | 21 | For full details refer to our [Security docs](https://docs.feathersjs.com/SECURITY.html). 22 | 23 | ## Pull Requests 24 | 25 | We :heart: pull requests and we're continually working to make it as easy as possible for people to contribute, including a [Plugin Generator](https://github.com/feathersjs/generator-feathers-plugin) and a [common test suite](https://github.com/feathersjs/feathers-service-tests) for database adapters. 26 | 27 | We prefer small pull requests with minimal code changes. The smaller they are the easier they are to review and merge. A core team member will pick up your PR and review it as soon as they can. They may ask for changes or reject your pull request. This is not a reflection of you as an engineer or a person. Please accept feedback graciously as we will also try to be sensitive when providing it. 28 | 29 | Although we generally accept many PRs they can be rejected for many reasons. We will be as transparent as possible but it may simply be that you do not have the same context or information regarding the roadmap that the core team members have. We value the time you take to put together any contributions so we pledge to always be respectful of that time and will try to be as open as possible so that you don't waste it. :smile: 30 | 31 | **All PRs (except documentation) should be accompanied with tests and pass the linting rules.** 32 | 33 | ### Code style 34 | 35 | Before running the tests from the `test/` folder `npm test` will run ESlint. You can check your code changes individually by running `npm run lint`. 36 | 37 | ### ES6 compilation 38 | 39 | Feathers uses [Babel](https://babeljs.io/) to leverage the latest developments of the JavaScript language. All code and samples are currently written in ES2015. To transpile the code in this repository run 40 | 41 | > npm run compile 42 | 43 | __Note:__ `npm test` will run the compilation automatically before the tests. 44 | 45 | ### Tests 46 | 47 | [Mocha](http://mochajs.org/) tests are located in the `test/` folder and can be run using the `npm run mocha` or `npm test` (with ESLint and code coverage) command. 48 | 49 | ### Documentation 50 | 51 | Feathers documentation is contained in Markdown files in the [feathers-docs](https://github.com/feathersjs/feathers-docs) repository. To change the documentation submit a pull request to that repo, referencing any other PR if applicable, and the docs will be updated with the next release. 52 | 53 | ## External Modules 54 | 55 | If you're written something awesome for Feathers, the Feathers ecosystem, or using Feathers please add it to the [showcase](https://docs.feathersjs.com/why/showcase.html). You also might want to check out the [Plugin Generator](https://github.com/feathersjs/generator-feathers-plugin) that can be used to scaffold plugins to be Feathers compliant from the start. 56 | 57 | If you think it would be a good core module then please contact one of the Feathers core team members in [Slack](http://slack.feathersjs.com) and we can discuss whether it belongs in core and how to get it there. :beers: 58 | 59 | ## Contributor Code of Conduct 60 | 61 | As contributors and maintainers of this project, we pledge to respect all people who contribute through reporting issues, posting feature requests, updating documentation, submitting pull requests or patches, and other activities. 62 | 63 | We are committed to making participation in this project a harassment-free experience for everyone, regardless of level of experience, gender, gender identity and expression, sexual orientation, disability, personal appearance, body size, race, ethnicity, age, or religion. 64 | 65 | Examples of unacceptable behavior by participants include the use of sexual language or imagery, derogatory comments or personal attacks, trolling, public or private harassment, insults, or other unprofessional conduct. 66 | 67 | 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. Project maintainers who do not follow the Code of Conduct may be removed from the project team. 68 | 69 | Instances of abusive, harassing, or otherwise unacceptable behavior may be reported by opening an issue or contacting one or more of the project maintainers. 70 | 71 | This Code of Conduct is adapted from the [Contributor Covenant](http://contributor-covenant.org), version 1.0.0, available at [http://contributor-covenant.org/version/1/0/0/](http://contributor-covenant.org/version/1/0/0/) 72 | -------------------------------------------------------------------------------- /.github/issue_template.md: -------------------------------------------------------------------------------- 1 | ### Steps to reproduce 2 | 3 | (First please check that this issue is not already solved as [described 4 | here](https://github.com/feathersjs/feathers/blob/master/.github/contributing.md#report-a-bug)) 5 | 6 | - [ ] Tell us what broke. The more detailed the better. 7 | - [ ] If you can, please create a simple example that reproduces the issue and link to a gist, jsbin, repo, etc. 8 | 9 | ### Expected behavior 10 | Tell us what should happen 11 | 12 | ### Actual behavior 13 | Tell us what happens instead 14 | 15 | ### System configuration 16 | 17 | Tell us about the applicable parts of your setup. 18 | 19 | **Module versions** (especially the part that's not working): 20 | 21 | **NodeJS version**: 22 | 23 | **Operating System**: 24 | 25 | **Browser Version**: 26 | 27 | **React Native Version**: 28 | 29 | **Module Loader**: -------------------------------------------------------------------------------- /.github/pull_request_template.md: -------------------------------------------------------------------------------- 1 | ### Summary 2 | 3 | (If you have not already please refer to the contributing guideline as [described 4 | here](https://github.com/feathersjs/feathers/blob/master/.github/contributing.md#pull-requests)) 5 | 6 | - [ ] Tell us about the problem your pull request is solving. 7 | - [ ] Are there any open issues that are related to this? 8 | - [ ] Is this PR dependent on PRs in other repos? 9 | 10 | If so, please mention them to keep the conversations linked together. 11 | 12 | ### Other Information 13 | 14 | If there's anything else that's important and relevant to your pull 15 | request, mention that information here. This could include 16 | benchmarks, or other information. 17 | 18 | Your PR will be reviewed by a core team member and they will work with you to get your changes merged in a timely manner. If merged your PR will automatically be added to the changelog in the next release. 19 | 20 | If your changes involve documentation updates please mention that and link the appropriate PR in [feathers-docs](https://github.com/feathersjs/feathers-docs). 21 | 22 | Thanks for contributing to Feathers! :heart: -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | .DS_Store 2 | 3 | # Logs 4 | logs 5 | *.log 6 | 7 | # Runtime data 8 | pids 9 | *.pid 10 | *.seed 11 | 12 | # Directory for instrumented libs generated by jscoverage/JSCover 13 | lib-cov 14 | 15 | # Coverage directory used by tools like istanbul 16 | coverage 17 | 18 | # Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files) 19 | .grunt 20 | 21 | # Compiled binary addons (http://nodejs.org/api/addons.html) 22 | build/Release 23 | 24 | # Dependency directory 25 | # Commenting this out is preferred by some people, see 26 | # https://www.npmjs.org/doc/misc/npm-faq.html#should-i-check-my-node_modules-folder-into-git- 27 | node_modules 28 | 29 | # Users Environment Variables 30 | .lock-wscript 31 | 32 | dist/ 33 | -------------------------------------------------------------------------------- /.istanbul.yml: -------------------------------------------------------------------------------- 1 | verbose: false 2 | instrumentation: 3 | root: ./lib/ 4 | include-all-sources: true 5 | reporting: 6 | print: summary 7 | reports: 8 | - html 9 | - text 10 | - lcov 11 | watermarks: 12 | statements: [50, 80] 13 | lines: [50, 80] 14 | functions: [50, 80] 15 | branches: [50, 80] 16 | -------------------------------------------------------------------------------- /.npmignore: -------------------------------------------------------------------------------- 1 | .editorconfig 2 | .jshintrc 3 | .travis.yml 4 | .istanbul.yml 5 | .babelrc 6 | .idea/ 7 | .vscode/ 8 | test/ 9 | coverage/ 10 | .github/ 11 | -------------------------------------------------------------------------------- /.travis.yml: -------------------------------------------------------------------------------- 1 | language: node_js 2 | node_js: 3 | - node 4 | - '6' 5 | install: npm install 6 | addons: 7 | code_climate: 8 | repo_token: 7b59b3fb1686f11b94d458292f5152bc81d7b7f30650a0a5bc36ac18bc009f76 9 | notifications: 10 | slack: 11 | rooms: 12 | secure: ra5zxeEm6WrG+VeZwdx6ovpysk+gNpkvCTT+t5QP3QNt8GxeiD1Fonk3OrZwT7nmXb/vRCowWwXqJl7VSfyN1NMSiiL7Nal7/nDBijw2rXvfrpO71knZEpRIn3FfeRyRkYFfyAvYH38QygNHfOWHDG1u6Ybaq/+cDmFjYelM6N0O6PhB9vSc1exO9n522kyJVbDn9/I5yszWYQ8V2STPPPtPYwpLDtWJs3GRtSqoSJJGRJdySdshjOFkIPDHxtUAMialChp8bS1IohXMik/hZkxGP/ZgyoXQEZ95XE2ovjjahHd9amDUnn9Uod4joRI5jtQAsQOaLg+hcOetKvPgEVjbEXCWIx49cHcgsCGg2WHcaSXB5vWxsK02VBxBSfSEWB1/0ojVBDpagJzm88BBC9UZVUkudpYnPQjpGGYR1UjRJ/FL1PD7mAyIOKWj5Wb/m0lq784o44iGS4hNTpikrAPQ64Ha0o53H7Y7BUxQSQpX8A6J2v+J7ktrG0ugql/gxrbFpaALhbBdBUW7cDTPK36SNiPjzKGkOj2i7heI7zD8LkGgVr7IbBt5brLATtGD+EMNjNFZs/ttn0lQ4LQ+yWuwJyuk9jkR0Go02uSjFA+NrMRYj0STVS+fqpKhfJIWsZooC9yQ/ceolV1zlrGz0yWxbD2WzYHYKY9ue+d+F5Y= 13 | email: false 14 | before_script: 15 | - npm install -g codeclimate-test-reporter 16 | after_script: 17 | - codeclimate-test-reporter < coverage/lcov.info 18 | -------------------------------------------------------------------------------- /CHANGELOG.md: -------------------------------------------------------------------------------- 1 | # Change Log 2 | 3 | ## [v1.2.1](https://github.com/feathersjs/authentication-local/tree/v1.2.1) (2018-05-02) 4 | [Full Changelog](https://github.com/feathersjs/authentication-local/compare/v1.2.0...v1.2.1) 5 | 6 | **Merged pull requests:** 7 | 8 | - Make sure the original object is not modified [\#65](https://github.com/feathersjs/authentication-local/pull/65) ([daffl](https://github.com/daffl)) 9 | 10 | ## [v1.2.0](https://github.com/feathersjs/authentication-local/tree/v1.2.0) (2018-05-02) 11 | [Full Changelog](https://github.com/feathersjs/authentication-local/compare/v1.1.3...v1.2.0) 12 | 13 | **Merged pull requests:** 14 | 15 | - added support for nested password fields option in hash password hook [\#64](https://github.com/feathersjs/authentication-local/pull/64) ([ThePesta](https://github.com/ThePesta)) 16 | 17 | ## [v1.1.3](https://github.com/feathersjs/authentication-local/tree/v1.1.3) (2018-04-20) 18 | [Full Changelog](https://github.com/feathersjs/authentication-local/compare/v1.1.2...v1.1.3) 19 | 20 | **Merged pull requests:** 21 | 22 | - Adding tests and calling to hasOwnProperty on Object.prototype instead of assuming valid prototype [\#63](https://github.com/feathersjs/authentication-local/pull/63) ([pmabres](https://github.com/pmabres)) 23 | 24 | ## [v1.1.2](https://github.com/feathersjs/authentication-local/tree/v1.1.2) (2018-04-15) 25 | [Full Changelog](https://github.com/feathersjs/authentication-local/compare/v1.1.1...v1.1.2) 26 | 27 | **Closed issues:** 28 | 29 | - Protect hooks does not support dot notation [\#61](https://github.com/feathersjs/authentication-local/issues/61) 30 | 31 | **Merged pull requests:** 32 | 33 | - Use latest version of Lodash [\#62](https://github.com/feathersjs/authentication-local/pull/62) ([daffl](https://github.com/daffl)) 34 | 35 | ## [v1.1.1](https://github.com/feathersjs/authentication-local/tree/v1.1.1) (2018-03-25) 36 | [Full Changelog](https://github.com/feathersjs/authentication-local/compare/v1.1.0...v1.1.1) 37 | 38 | **Closed issues:** 39 | 40 | - hash-password hook will skip users if they are missing password [\#58](https://github.com/feathersjs/authentication-local/issues/58) 41 | - User service create method gets called upon each validation [\#56](https://github.com/feathersjs/authentication-local/issues/56) 42 | 43 | **Merged pull requests:** 44 | 45 | - Do not skip users that have no password [\#60](https://github.com/feathersjs/authentication-local/pull/60) ([daffl](https://github.com/daffl)) 46 | - Update sinon to the latest version 🚀 [\#59](https://github.com/feathersjs/authentication-local/pull/59) ([greenkeeper[bot]](https://github.com/apps/greenkeeper)) 47 | - Update sinon-chai to the latest version 🚀 [\#57](https://github.com/feathersjs/authentication-local/pull/57) ([greenkeeper[bot]](https://github.com/apps/greenkeeper)) 48 | 49 | ## [v1.1.0](https://github.com/feathersjs/authentication-local/tree/v1.1.0) (2018-01-23) 50 | [Full Changelog](https://github.com/feathersjs/authentication-local/compare/v1.0.4...v1.1.0) 51 | 52 | **Closed issues:** 53 | 54 | - protect hook attempts to map through 'result.data' on all service methods. [\#53](https://github.com/feathersjs/authentication-local/issues/53) 55 | - Protect hook should check for toJSON [\#48](https://github.com/feathersjs/authentication-local/issues/48) 56 | 57 | **Merged pull requests:** 58 | 59 | - Use .toJSON if available [\#55](https://github.com/feathersjs/authentication-local/pull/55) ([daffl](https://github.com/daffl)) 60 | - Only map data for find method [\#54](https://github.com/feathersjs/authentication-local/pull/54) ([daffl](https://github.com/daffl)) 61 | - Update @feathersjs/authentication-jwt to the latest version 🚀 [\#52](https://github.com/feathersjs/authentication-local/pull/52) ([greenkeeper[bot]](https://github.com/apps/greenkeeper)) 62 | - Update mocha to the latest version 🚀 [\#51](https://github.com/feathersjs/authentication-local/pull/51) ([greenkeeper[bot]](https://github.com/apps/greenkeeper)) 63 | 64 | ## [v1.0.4](https://github.com/feathersjs/authentication-local/tree/v1.0.4) (2018-01-03) 65 | [Full Changelog](https://github.com/feathersjs/authentication-local/compare/v1.0.3...v1.0.4) 66 | 67 | ## [v1.0.3](https://github.com/feathersjs/authentication-local/tree/v1.0.3) (2018-01-03) 68 | [Full Changelog](https://github.com/feathersjs/authentication-local/compare/v1.0.2...v1.0.3) 69 | 70 | **Closed issues:** 71 | 72 | - local authentication bug with users as sequelize service [\#47](https://github.com/feathersjs/authentication-local/issues/47) 73 | 74 | **Merged pull requests:** 75 | 76 | - Update documentation to correspond with latest release [\#50](https://github.com/feathersjs/authentication-local/pull/50) ([daffl](https://github.com/daffl)) 77 | - Update semistandard to the latest version 🚀 [\#49](https://github.com/feathersjs/authentication-local/pull/49) ([greenkeeper[bot]](https://github.com/apps/greenkeeper)) 78 | 79 | ## [v1.0.2](https://github.com/feathersjs/authentication-local/tree/v1.0.2) (2017-12-06) 80 | [Full Changelog](https://github.com/feathersjs/authentication-local/compare/v1.0.1...v1.0.2) 81 | 82 | **Closed issues:** 83 | 84 | - why is the password send as plain text instead of encrypting it on client side? [\#44](https://github.com/feathersjs/authentication-local/issues/44) 85 | 86 | **Merged pull requests:** 87 | 88 | - Update hook.result if an external provider is set [\#46](https://github.com/feathersjs/authentication-local/pull/46) ([daffl](https://github.com/daffl)) 89 | - Update feathers-memory to the latest version 🚀 [\#45](https://github.com/feathersjs/authentication-local/pull/45) ([greenkeeper[bot]](https://github.com/apps/greenkeeper)) 90 | 91 | ## [v1.0.1](https://github.com/feathersjs/authentication-local/tree/v1.0.1) (2017-11-16) 92 | [Full Changelog](https://github.com/feathersjs/authentication-local/compare/v1.0.0...v1.0.1) 93 | 94 | **Merged pull requests:** 95 | 96 | - Add default export for better ES module \(TypeScript\) compatibility [\#43](https://github.com/feathersjs/authentication-local/pull/43) ([daffl](https://github.com/daffl)) 97 | - Update @feathersjs/authentication to the latest version 🚀 [\#42](https://github.com/feathersjs/authentication-local/pull/42) ([greenkeeper[bot]](https://github.com/apps/greenkeeper)) 98 | 99 | ## [v1.0.0](https://github.com/feathersjs/authentication-local/tree/v1.0.0) (2017-11-01) 100 | [Full Changelog](https://github.com/feathersjs/authentication-local/compare/v1.0.0-pre.2...v1.0.0) 101 | 102 | **Merged pull requests:** 103 | 104 | - Update dependencies for release [\#41](https://github.com/feathersjs/authentication-local/pull/41) ([daffl](https://github.com/daffl)) 105 | 106 | ## [v1.0.0-pre.2](https://github.com/feathersjs/authentication-local/tree/v1.0.0-pre.2) (2017-10-27) 107 | [Full Changelog](https://github.com/feathersjs/authentication-local/compare/v1.0.0-pre.1...v1.0.0-pre.2) 108 | 109 | **Merged pull requests:** 110 | 111 | - Safely dispatch without password [\#40](https://github.com/feathersjs/authentication-local/pull/40) ([daffl](https://github.com/daffl)) 112 | 113 | ## [v1.0.0-pre.1](https://github.com/feathersjs/authentication-local/tree/v1.0.0-pre.1) (2017-10-25) 114 | [Full Changelog](https://github.com/feathersjs/authentication-local/compare/v0.4.4...v1.0.0-pre.1) 115 | 116 | **Closed issues:** 117 | 118 | - How configure local strategy to feathers-authentication? [\#36](https://github.com/feathersjs/authentication-local/issues/36) 119 | - An in-range update of feathers is breaking the build 🚨 [\#32](https://github.com/feathersjs/authentication-local/issues/32) 120 | 121 | **Merged pull requests:** 122 | 123 | - Update to Feathers v3 [\#39](https://github.com/feathersjs/authentication-local/pull/39) ([daffl](https://github.com/daffl)) 124 | - Rename repository and use npm scope [\#38](https://github.com/feathersjs/authentication-local/pull/38) ([daffl](https://github.com/daffl)) 125 | - Update to new plugin infrastructure [\#37](https://github.com/feathersjs/authentication-local/pull/37) ([daffl](https://github.com/daffl)) 126 | - Update mocha to the latest version 🚀 [\#35](https://github.com/feathersjs/authentication-local/pull/35) ([greenkeeper[bot]](https://github.com/apps/greenkeeper)) 127 | - Update sinon to the latest version 🚀 [\#34](https://github.com/feathersjs/authentication-local/pull/34) ([greenkeeper[bot]](https://github.com/apps/greenkeeper)) 128 | - Add babel-polyfill and package-lock.json [\#33](https://github.com/feathersjs/authentication-local/pull/33) ([daffl](https://github.com/daffl)) 129 | - Update sinon to the latest version 🚀 [\#29](https://github.com/feathersjs/authentication-local/pull/29) ([greenkeeper[bot]](https://github.com/apps/greenkeeper)) 130 | 131 | ## [v0.4.4](https://github.com/feathersjs/authentication-local/tree/v0.4.4) (2017-08-11) 132 | [Full Changelog](https://github.com/feathersjs/authentication-local/compare/v0.4.3...v0.4.4) 133 | 134 | **Closed issues:** 135 | 136 | - i18n support [\#28](https://github.com/feathersjs/authentication-local/issues/28) 137 | - Couldn't store jwt token in cookies [\#17](https://github.com/feathersjs/authentication-local/issues/17) 138 | - Strategy for subapp [\#9](https://github.com/feathersjs/authentication-local/issues/9) 139 | 140 | **Merged pull requests:** 141 | 142 | - Update debug to the latest version 🚀 [\#31](https://github.com/feathersjs/authentication-local/pull/31) ([greenkeeper[bot]](https://github.com/apps/greenkeeper)) 143 | - Increase bcrypt cost factor, add future cost factor auto-optimization [\#30](https://github.com/feathersjs/authentication-local/pull/30) ([micaksica2](https://github.com/micaksica2)) 144 | 145 | ## [v0.4.3](https://github.com/feathersjs/authentication-local/tree/v0.4.3) (2017-06-22) 146 | [Full Changelog](https://github.com/feathersjs/authentication-local/compare/v0.4.2...v0.4.3) 147 | 148 | **Closed issues:** 149 | 150 | - Log a warning if service.id is undefined or null [\#19](https://github.com/feathersjs/authentication-local/issues/19) 151 | 152 | **Merged pull requests:** 153 | 154 | - throw error if service.id is missing [\#27](https://github.com/feathersjs/authentication-local/pull/27) ([marshallswain](https://github.com/marshallswain)) 155 | 156 | ## [v0.4.2](https://github.com/feathersjs/authentication-local/tree/v0.4.2) (2017-06-22) 157 | [Full Changelog](https://github.com/feathersjs/authentication-local/compare/v0.4.1...v0.4.2) 158 | 159 | ## [v0.4.1](https://github.com/feathersjs/authentication-local/tree/v0.4.1) (2017-06-22) 160 | [Full Changelog](https://github.com/feathersjs/authentication-local/compare/v0.4.0...v0.4.1) 161 | 162 | **Merged pull requests:** 163 | 164 | - Resolves \#14 - Passes Feathers params to service hooks [\#15](https://github.com/feathersjs/authentication-local/pull/15) ([thomas-p-wilson](https://github.com/thomas-p-wilson)) 165 | 166 | ## [v0.4.0](https://github.com/feathersjs/authentication-local/tree/v0.4.0) (2017-06-22) 167 | [Full Changelog](https://github.com/feathersjs/authentication-local/compare/v0.3.4...v0.4.0) 168 | 169 | **Closed issues:** 170 | 171 | - Module is using the wrong default config key [\#21](https://github.com/feathersjs/authentication-local/issues/21) 172 | - Feathers params not available to user service hooks [\#14](https://github.com/feathersjs/authentication-local/issues/14) 173 | - Bad error message is returned for invalid credentials [\#10](https://github.com/feathersjs/authentication-local/issues/10) 174 | 175 | **Merged pull requests:** 176 | 177 | - Greenkeeper/chai 4.0.2 [\#26](https://github.com/feathersjs/authentication-local/pull/26) ([daffl](https://github.com/daffl)) 178 | - Return Invalid login message when user doesn’t exist [\#25](https://github.com/feathersjs/authentication-local/pull/25) ([marshallswain](https://github.com/marshallswain)) 179 | - Adding separate entity username and password fields [\#23](https://github.com/feathersjs/authentication-local/pull/23) ([adamvr](https://github.com/adamvr)) 180 | - use the correct default config key. Closes \#21 [\#22](https://github.com/feathersjs/authentication-local/pull/22) ([ekryski](https://github.com/ekryski)) 181 | - Update feathers-socketio to the latest version 🚀 [\#20](https://github.com/feathersjs/authentication-local/pull/20) ([greenkeeper[bot]](https://github.com/apps/greenkeeper)) 182 | - Update semistandard to the latest version 🚀 [\#18](https://github.com/feathersjs/authentication-local/pull/18) ([greenkeeper[bot]](https://github.com/apps/greenkeeper)) 183 | - Update feathers-hooks to the latest version 🚀 [\#16](https://github.com/feathersjs/authentication-local/pull/16) ([greenkeeper[bot]](https://github.com/apps/greenkeeper)) 184 | - Update dependencies to enable Greenkeeper 🌴 [\#13](https://github.com/feathersjs/authentication-local/pull/13) ([greenkeeper[bot]](https://github.com/apps/greenkeeper)) 185 | 186 | ## [v0.3.4](https://github.com/feathersjs/authentication-local/tree/v0.3.4) (2017-03-28) 187 | [Full Changelog](https://github.com/feathersjs/authentication-local/compare/v0.3.3...v0.3.4) 188 | 189 | **Closed issues:** 190 | 191 | - Shouldn't it be `authentication` instead of the old `auth` there? [\#11](https://github.com/feathersjs/authentication-local/issues/11) 192 | 193 | **Merged pull requests:** 194 | 195 | - Fix default authentication config name [\#12](https://github.com/feathersjs/authentication-local/pull/12) ([marshallswain](https://github.com/marshallswain)) 196 | 197 | ## [v0.3.3](https://github.com/feathersjs/authentication-local/tree/v0.3.3) (2017-01-27) 198 | [Full Changelog](https://github.com/feathersjs/authentication-local/compare/v0.3.2...v0.3.3) 199 | 200 | **Closed issues:** 201 | 202 | - Support dot notation [\#7](https://github.com/feathersjs/authentication-local/issues/7) 203 | - Automatically register the authenticate hook with 'local' [\#4](https://github.com/feathersjs/authentication-local/issues/4) 204 | 205 | **Merged pull requests:** 206 | 207 | - Add support for dot notation, fix some whitespace [\#8](https://github.com/feathersjs/authentication-local/pull/8) ([elfey](https://github.com/elfey)) 208 | 209 | ## [v0.3.2](https://github.com/feathersjs/authentication-local/tree/v0.3.2) (2016-12-14) 210 | [Full Changelog](https://github.com/feathersjs/authentication-local/compare/v0.3.1...v0.3.2) 211 | 212 | ## [v0.3.1](https://github.com/feathersjs/authentication-local/tree/v0.3.1) (2016-12-14) 213 | [Full Changelog](https://github.com/feathersjs/authentication-local/compare/v0.3.0...v0.3.1) 214 | 215 | **Closed issues:** 216 | 217 | - Add docs section on expected request params. [\#5](https://github.com/feathersjs/authentication-local/issues/5) 218 | 219 | **Merged pull requests:** 220 | 221 | - Document expected request data [\#6](https://github.com/feathersjs/authentication-local/pull/6) ([marshallswain](https://github.com/marshallswain)) 222 | 223 | ## [v0.3.0](https://github.com/feathersjs/authentication-local/tree/v0.3.0) (2016-11-23) 224 | [Full Changelog](https://github.com/feathersjs/authentication-local/compare/v0.2.0...v0.3.0) 225 | 226 | **Closed issues:** 227 | 228 | - Doesn't pull configuration from `auth.local` by default [\#2](https://github.com/feathersjs/authentication-local/issues/2) 229 | - Does not pull from global auth config when strategy has a custom name [\#1](https://github.com/feathersjs/authentication-local/issues/1) 230 | 231 | **Merged pull requests:** 232 | 233 | - Payload support [\#3](https://github.com/feathersjs/authentication-local/pull/3) ([ekryski](https://github.com/ekryski)) 234 | 235 | ## [v0.2.0](https://github.com/feathersjs/authentication-local/tree/v0.2.0) (2016-11-16) 236 | [Full Changelog](https://github.com/feathersjs/authentication-local/compare/v0.1.0...v0.2.0) 237 | 238 | ## [v0.1.0](https://github.com/feathersjs/authentication-local/tree/v0.1.0) (2016-11-09) 239 | 240 | 241 | \* *This Change Log was automatically generated by [github_changelog_generator](https://github.com/skywinder/Github-Changelog-Generator)* -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Copyright (c) 2016 Feathers 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | 23 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # @feathersjs/authentication-local 2 | 3 | > __Important:__ The code for this module has been moved into the main Feathers repository at [feathersjs/feathers](https://github.com/feathersjs/feathers) ([package direct link](https://github.com/feathersjs/feathers/tree/master/packages/authentication-local)). Please open issues and pull requests there. No changes in your existing Feathers applications are necessary. 4 | 5 | [![Build Status](https://travis-ci.org/feathersjs/authentication-local.png?branch=master)](https://travis-ci.org/feathersjs/authentication-local) 6 | 7 | Local authentication strategy for feathers-authentication using Passport without all the boilerplate. 8 | 9 | ## Installation 10 | 11 | ``` 12 | npm install @feathersjs/authentication-local --save 13 | ``` 14 | 15 | ## Quick example 16 | 17 | ```js 18 | const feathers = require('@feathersjs/feathers'); 19 | const authentication = require('feathers-authentication'); 20 | const local = require('@feathersjs/authentication-local'); 21 | const app = feathers(); 22 | 23 | // Setup authentication 24 | app.configure(authentication(settings)); 25 | app.configure(local()); 26 | 27 | // Setup a hook to only allow valid JWTs or successful 28 | // local auth to authenticate and get new JWT access tokens 29 | app.service('authentication').hooks({ 30 | before: { 31 | create: [ 32 | authentication.hooks.authenticate(['local', 'jwt']) 33 | ] 34 | } 35 | }); 36 | ``` 37 | 38 | ## Documentation 39 | 40 | Please refer to the [@feathersjs/authentication-local API documentation](https://docs.feathersjs.com/api/authentication/local.html) for more details. 41 | 42 | ## License 43 | 44 | Copyright (c) 2018 45 | 46 | Licensed under the [MIT license](LICENSE). 47 | -------------------------------------------------------------------------------- /lib/hooks/hash-password.js: -------------------------------------------------------------------------------- 1 | const hasher = require('../utils/hash'); 2 | const { merge, get, set, cloneDeep } = require('lodash'); 3 | const Debug = require('debug'); 4 | 5 | const debug = Debug('@feathersjs/authentication-local:hooks:hash-password'); 6 | 7 | module.exports = function hashPassword (options = {}) { 8 | return function (context) { 9 | if (context.type !== 'before') { 10 | return Promise.reject(new Error(`The 'hashPassword' hook should only be used as a 'before' hook.`)); 11 | } 12 | 13 | const app = context.app; 14 | const authOptions = app.get('authentication') || {}; 15 | 16 | options = merge({ passwordField: 'password' }, authOptions.local, options); 17 | 18 | debug('Running hashPassword hook with options:', options); 19 | 20 | const field = options.passwordField; 21 | const hashPw = options.hash || hasher; 22 | 23 | if (typeof field !== 'string') { 24 | return Promise.reject(new Error(`You must provide a 'passwordField' in your authentication configuration or pass one explicitly`)); 25 | } 26 | 27 | if (typeof hashPw !== 'function') { 28 | return Promise.reject(new Error(`'hash' must be a function that takes a password and returns Promise that resolves with a hashed password.`)); 29 | } 30 | 31 | if (context.data === undefined) { 32 | debug(`hook.data is undefined. Skipping hashPassword hook.`); 33 | return Promise.resolve(context); 34 | } 35 | 36 | const dataIsArray = Array.isArray(context.data); 37 | const data = dataIsArray ? context.data : [ context.data ]; 38 | 39 | return Promise.all(data.map(item => { 40 | const password = get(item, field); 41 | if (password) { 42 | return hashPw(password).then(hashedPassword => 43 | set(cloneDeep(item), field, hashedPassword) 44 | ); 45 | } 46 | 47 | return item; 48 | })).then(results => { 49 | context.data = dataIsArray ? results : results[0]; 50 | 51 | return context; 52 | }); 53 | }; 54 | }; 55 | -------------------------------------------------------------------------------- /lib/hooks/index.js: -------------------------------------------------------------------------------- 1 | const hashPassword = require('./hash-password'); 2 | const protect = require('./protect'); 3 | 4 | module.exports = { 5 | hashPassword, 6 | protect 7 | }; 8 | -------------------------------------------------------------------------------- /lib/hooks/protect.js: -------------------------------------------------------------------------------- 1 | const { omit } = require('lodash'); 2 | 3 | module.exports = function (...fields) { 4 | return function protect (context) { 5 | const result = context.dispatch || context.result; 6 | const o = current => { 7 | const data = typeof current.toJSON === 'function' 8 | ? current.toJSON() : current; 9 | return omit(data, fields); 10 | }; 11 | 12 | if (!result) { 13 | return context; 14 | } 15 | 16 | if (Array.isArray(result)) { 17 | context.dispatch = result.map(o); 18 | } else if (result.data && context.method === 'find') { 19 | context.dispatch = Object.assign({}, result, { 20 | data: result.data.map(o) 21 | }); 22 | } else { 23 | context.dispatch = o(result); 24 | } 25 | 26 | if (context.params && context.params.provider) { 27 | context.result = context.dispatch; 28 | } 29 | 30 | return context; 31 | }; 32 | }; 33 | -------------------------------------------------------------------------------- /lib/index.js: -------------------------------------------------------------------------------- 1 | const Debug = require('debug'); 2 | const { merge, omit, pick } = require('lodash'); 3 | const hooks = require('./hooks'); 4 | const DefaultVerifier = require('./verifier'); 5 | 6 | const passportLocal = require('passport-local'); 7 | 8 | const debug = Debug('@feathersjs/authentication-local'); 9 | const defaults = { 10 | name: 'local', 11 | usernameField: 'email', 12 | passwordField: 'password' 13 | }; 14 | 15 | const KEYS = [ 16 | 'entity', 17 | 'service', 18 | 'passReqToCallback', 19 | 'session' 20 | ]; 21 | 22 | function init (options = {}) { 23 | return function localAuth () { 24 | const app = this; 25 | const _super = app.setup; 26 | 27 | if (!app.passport) { 28 | throw new Error(`Can not find app.passport. Did you initialize feathers-authentication before @feathersjs/authentication-local?`); 29 | } 30 | 31 | let name = options.name || defaults.name; 32 | let authOptions = app.get('authentication') || {}; 33 | let localOptions = authOptions[name] || {}; 34 | 35 | // NOTE (EK): Pull from global auth config to support legacy auth for an easier transition. 36 | const localSettings = merge({}, defaults, pick(authOptions, KEYS), localOptions, omit(options, ['Verifier'])); 37 | let Verifier = DefaultVerifier; 38 | 39 | if (options.Verifier) { 40 | Verifier = options.Verifier; 41 | } 42 | 43 | app.setup = function () { 44 | let result = _super.apply(this, arguments); 45 | let verifier = new Verifier(app, localSettings); 46 | 47 | if (!verifier.verify) { 48 | throw new Error(`Your verifier must implement a 'verify' function. It should have the same signature as a local passport verify callback.`); 49 | } 50 | 51 | // Register 'local' strategy with passport 52 | debug('Registering local authentication strategy with options:', localSettings); 53 | app.passport.use(localSettings.name, new passportLocal.Strategy(localSettings, verifier.verify.bind(verifier))); 54 | app.passport.options(localSettings.name, localSettings); 55 | 56 | return result; 57 | }; 58 | }; 59 | } 60 | 61 | module.exports = init; 62 | 63 | // Exposed Modules 64 | Object.assign(module.exports, { 65 | default: init, 66 | defaults, 67 | hooks, 68 | Verifier: DefaultVerifier 69 | }); 70 | -------------------------------------------------------------------------------- /lib/utils/hash.js: -------------------------------------------------------------------------------- 1 | const bcrypt = require('bcryptjs'); 2 | 3 | const BCRYPT_WORK_FACTOR_BASE = 12; 4 | const BCRYPT_DATE_BASE = 1483228800000; 5 | const BCRYPT_WORK_INCREASE_INTERVAL = 47300000000; 6 | 7 | module.exports = function hasher (password) { 8 | return new Promise((resolve, reject) => { 9 | let BCRYPT_CURRENT_DATE = new Date().getTime(); 10 | let BCRYPT_WORK_INCREASE = Math.max(0, Math.floor((BCRYPT_CURRENT_DATE - BCRYPT_DATE_BASE) / BCRYPT_WORK_INCREASE_INTERVAL)); 11 | let BCRYPT_WORK_FACTOR = Math.min(19, BCRYPT_WORK_FACTOR_BASE + BCRYPT_WORK_INCREASE); 12 | 13 | bcrypt.genSalt(BCRYPT_WORK_FACTOR, function (error, salt) { 14 | if (error) { 15 | return reject(error); 16 | } 17 | 18 | bcrypt.hash(password, salt, function (error, hashedPassword) { 19 | if (error) { 20 | return reject(error); 21 | } 22 | 23 | resolve(hashedPassword); 24 | }); 25 | }); 26 | }); 27 | }; 28 | -------------------------------------------------------------------------------- /lib/verifier.js: -------------------------------------------------------------------------------- 1 | const Debug = require('debug'); 2 | const bcrypt = require('bcryptjs'); 3 | const { get, omit } = require('lodash'); 4 | 5 | const debug = Debug('@feathersjs/authentication-local:verify'); 6 | 7 | class LocalVerifier { 8 | constructor (app, options = {}) { 9 | this.app = app; 10 | this.options = options; 11 | this.service = typeof options.service === 'string' ? app.service(options.service) : options.service; 12 | 13 | if (!this.service) { 14 | throw new Error(`options.service does not exist.\n\tMake sure you are passing a valid service path or service instance and it is initialized before @feathersjs/authentication-local.`); 15 | } 16 | 17 | this._comparePassword = this._comparePassword.bind(this); 18 | this._normalizeResult = this._normalizeResult.bind(this); 19 | this.verify = this.verify.bind(this); 20 | } 21 | 22 | _comparePassword (entity, password) { 23 | // select entity password field - take entityPasswordField over passwordField 24 | const passwordField = this.options.entityPasswordField || this.options.passwordField; 25 | 26 | // find password in entity, this allows for dot notation 27 | const hash = get(entity, passwordField); 28 | 29 | if (!hash) { 30 | return Promise.reject(new Error(`'${this.options.entity}' record in the database is missing a '${passwordField}'`)); 31 | } 32 | 33 | debug('Verifying password'); 34 | 35 | return new Promise((resolve, reject) => { 36 | bcrypt.compare(password, hash, function (error, result) { 37 | // Handle 500 server error. 38 | if (error) { 39 | return reject(error); 40 | } 41 | 42 | if (!result) { 43 | debug('Password incorrect'); 44 | return reject(false); // eslint-disable-line 45 | } 46 | 47 | debug('Password correct'); 48 | return resolve(entity); 49 | }); 50 | }); 51 | } 52 | 53 | _normalizeResult (results) { 54 | // Paginated services return the array of results in the data attribute. 55 | let entities = results.data ? results.data : results; 56 | let entity = entities[0]; 57 | 58 | // Handle bad username. 59 | if (!entity) { 60 | return Promise.reject(false); // eslint-disable-line 61 | } 62 | 63 | debug(`${this.options.entity} found`); 64 | return Promise.resolve(entity); 65 | } 66 | 67 | verify (req, username, password, done) { 68 | debug('Checking credentials', username, password); 69 | 70 | const id = this.service.id; 71 | const usernameField = this.options.entityUsernameField || this.options.usernameField; 72 | const params = Object.assign({ 73 | 'query': { 74 | [usernameField]: username, 75 | '$limit': 1 76 | } 77 | }, omit(req.params, 'query', 'provider', 'headers', 'session', 'cookies')); 78 | 79 | if (id === null || id === undefined) { 80 | debug('failed: the service.id was not set'); 81 | return done(new Error('the `id` property must be set on the entity service for authentication')); 82 | } 83 | 84 | // Look up the entity 85 | this.service.find(params) 86 | .then(response => { 87 | const results = response.data || response; 88 | if (!results.length) { 89 | debug(`a record with ${usernameField} of '${username}' did not exist`); 90 | } 91 | return this._normalizeResult(response); 92 | }) 93 | .then(entity => this._comparePassword(entity, password)) 94 | .then(entity => { 95 | const id = entity[this.service.id]; 96 | const payload = { [`${this.options.entity}Id`]: id }; 97 | done(null, entity, payload); 98 | }) 99 | .catch(error => error ? done(error) : done(null, error, { message: 'Invalid login' })); 100 | } 101 | } 102 | 103 | module.exports = LocalVerifier; 104 | -------------------------------------------------------------------------------- /mocha.opts: -------------------------------------------------------------------------------- 1 | --recursive test/ 2 | -------------------------------------------------------------------------------- /package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "@feathersjs/authentication-local", 3 | "version": "1.2.1", 4 | "lockfileVersion": 1, 5 | "requires": true, 6 | "dependencies": { 7 | "@feathersjs/authentication": { 8 | "version": "2.1.4", 9 | "resolved": "https://registry.npmjs.org/@feathersjs/authentication/-/authentication-2.1.4.tgz", 10 | "integrity": "sha512-i+hLDjx6cAXEUy0bxI8vC1tL+I37WlWFuaSGhOIH8CKuZokUkdmtOQVQxBNytpom8W9VVBcVxedtkDUO0YnHag==", 11 | "dev": true, 12 | "requires": { 13 | "@feathersjs/commons": "1.4.1", 14 | "@feathersjs/errors": "3.3.0", 15 | "@feathersjs/socket-commons": "3.1.5", 16 | "debug": "3.1.0", 17 | "jsonwebtoken": "8.2.1", 18 | "lodash.clone": "4.5.0", 19 | "lodash.merge": "4.6.1", 20 | "lodash.omit": "4.5.0", 21 | "lodash.pick": "4.4.0", 22 | "long-timeout": "0.1.1", 23 | "ms": "2.0.0", 24 | "passport": "0.4.0", 25 | "uuid": "3.2.1" 26 | } 27 | }, 28 | "@feathersjs/authentication-jwt": { 29 | "version": "2.0.0", 30 | "resolved": "https://registry.npmjs.org/@feathersjs/authentication-jwt/-/authentication-jwt-2.0.0.tgz", 31 | "integrity": "sha512-ZNp0Edkehjt8TIyhp7mxRvQRzQ2t6UPJg+niKh8MdnIKkQ6iGEY8+4NbxP3g8JU0QcUBykS+KxsWmPQzws42FA==", 32 | "dev": true, 33 | "requires": { 34 | "@feathersjs/errors": "3.3.0", 35 | "debug": "3.1.0", 36 | "lodash.merge": "4.6.1", 37 | "lodash.omit": "4.5.0", 38 | "lodash.pick": "4.4.0", 39 | "passport-jwt": "3.0.1" 40 | } 41 | }, 42 | "@feathersjs/commons": { 43 | "version": "1.4.1", 44 | "resolved": "https://registry.npmjs.org/@feathersjs/commons/-/commons-1.4.1.tgz", 45 | "integrity": "sha512-hs3Tz0JV/nwd14B9s+mv4SG+Tll9pDxqEn2wuc5CzL4I2vc1+EnwnhpOkokvQMTAdzsaxwOLoQ4y1BPm6WmMNA==", 46 | "dev": true 47 | }, 48 | "@feathersjs/errors": { 49 | "version": "3.3.0", 50 | "resolved": "https://registry.npmjs.org/@feathersjs/errors/-/errors-3.3.0.tgz", 51 | "integrity": "sha512-9oYAhAj4CKIix5KITRDEzvyNJNIaqNde5lGqmrQLw4pTuyWMvx9tgBhtXPA0l8lS1KnMKw4Qf1gHo6aKrM+OyQ==", 52 | "requires": { 53 | "debug": "3.1.0" 54 | } 55 | }, 56 | "@feathersjs/express": { 57 | "version": "1.2.1", 58 | "resolved": "https://registry.npmjs.org/@feathersjs/express/-/express-1.2.1.tgz", 59 | "integrity": "sha512-u7t8FgrcRybjjD3qVOIfvlJJfw772/em9TJ8we/zADtATI1g68bmtC/103VtiUpC+H3n2yJGKpV0lcdHlqt9Kg==", 60 | "dev": true, 61 | "requires": { 62 | "@feathersjs/commons": "1.4.1", 63 | "@feathersjs/errors": "3.3.0", 64 | "debug": "3.1.0", 65 | "express": "4.16.3", 66 | "uberproto": "1.2.0" 67 | } 68 | }, 69 | "@feathersjs/feathers": { 70 | "version": "3.1.4", 71 | "resolved": "https://registry.npmjs.org/@feathersjs/feathers/-/feathers-3.1.4.tgz", 72 | "integrity": "sha512-zFT8a28SoORxxWMHLC2IUSXa3UwKBMlBl1mSLCVALk5GsmnvJpf+P/SU8TMcuzh39Uew7Dj4tZSatu71mnY9cQ==", 73 | "dev": true, 74 | "requires": { 75 | "@feathersjs/commons": "1.4.1", 76 | "debug": "3.1.0", 77 | "events": "2.0.0", 78 | "uberproto": "1.2.0" 79 | } 80 | }, 81 | "@feathersjs/socket-commons": { 82 | "version": "3.1.5", 83 | "resolved": "https://registry.npmjs.org/@feathersjs/socket-commons/-/socket-commons-3.1.5.tgz", 84 | "integrity": "sha512-cnMqVNGR0fOM00UqRmslmPiUZ2UKToTxesoGwZvhvq4unF032KzS4gz8bZ7qYsin9HmAP/E2gs2v0119CR7LKQ==", 85 | "dev": true, 86 | "requires": { 87 | "@feathersjs/errors": "3.3.0", 88 | "debug": "3.1.0", 89 | "lodash": "4.17.5", 90 | "url-pattern": "1.0.3" 91 | } 92 | }, 93 | "@feathersjs/socketio": { 94 | "version": "3.2.1", 95 | "resolved": "https://registry.npmjs.org/@feathersjs/socketio/-/socketio-3.2.1.tgz", 96 | "integrity": "sha512-QGIptIgsbyyKzmCE0Hzd5HBAq80CnM/Qaq4e3aqs3gpe+GUUeVubpmZszLhapzwwto8WshxWVWUQLQZ+uRYH9g==", 97 | "dev": true, 98 | "requires": { 99 | "@feathersjs/transport-commons": "4.0.0", 100 | "debug": "3.1.0", 101 | "socket.io": "2.1.0" 102 | } 103 | }, 104 | "@feathersjs/transport-commons": { 105 | "version": "4.0.0", 106 | "resolved": "https://registry.npmjs.org/@feathersjs/transport-commons/-/transport-commons-4.0.0.tgz", 107 | "integrity": "sha512-O+kuJWpdao0Lw5Pg/65eOuMIlxu+aP9bnK9jNlxfwVdqCxw4eX3Jh8WS0WmQpfZYILk5oyhP/IUdHgSqcjaXgw==", 108 | "dev": true, 109 | "requires": { 110 | "@feathersjs/commons": "1.4.1", 111 | "@feathersjs/errors": "3.3.0", 112 | "debug": "3.1.0", 113 | "lodash": "4.17.5", 114 | "radix-router": "3.0.1" 115 | } 116 | }, 117 | "@sinonjs/formatio": { 118 | "version": "2.0.0", 119 | "resolved": "http://registry.npmjs.org/@sinonjs/formatio/-/formatio-2.0.0.tgz", 120 | "integrity": "sha512-ls6CAMA6/5gG+O/IdsBcblvnd8qcO/l1TYoNeAzp3wcISOxlPXQEus0mLcdwazEkWjaBdaJ3TaxmNgCLWwvWzg==", 121 | "dev": true, 122 | "requires": { 123 | "samsam": "1.3.0" 124 | } 125 | }, 126 | "abbrev": { 127 | "version": "1.0.9", 128 | "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.0.9.tgz", 129 | "integrity": "sha1-kbR5JYinc4wl813W9jdSovh3YTU=", 130 | "dev": true 131 | }, 132 | "accepts": { 133 | "version": "1.3.5", 134 | "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.5.tgz", 135 | "integrity": "sha1-63d99gEXI6OxTopywIBcjoZ0a9I=", 136 | "dev": true, 137 | "requires": { 138 | "mime-types": "2.1.18", 139 | "negotiator": "0.6.1" 140 | } 141 | }, 142 | "acorn": { 143 | "version": "5.5.3", 144 | "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.5.3.tgz", 145 | "integrity": "sha512-jd5MkIUlbbmb07nXH0DT3y7rDVtkzDi4XZOUVWAer8ajmF/DTSSbl5oNFyDOl/OXA33Bl79+ypHhl2pN20VeOQ==", 146 | "dev": true 147 | }, 148 | "acorn-jsx": { 149 | "version": "3.0.1", 150 | "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-3.0.1.tgz", 151 | "integrity": "sha1-r9+UiPsezvyDSPb7IvRk4ypYs2s=", 152 | "dev": true, 153 | "requires": { 154 | "acorn": "3.3.0" 155 | }, 156 | "dependencies": { 157 | "acorn": { 158 | "version": "3.3.0", 159 | "resolved": "https://registry.npmjs.org/acorn/-/acorn-3.3.0.tgz", 160 | "integrity": "sha1-ReN/s56No/JbruP/U2niu18iAXo=", 161 | "dev": true 162 | } 163 | } 164 | }, 165 | "after": { 166 | "version": "0.8.2", 167 | "resolved": "https://registry.npmjs.org/after/-/after-0.8.2.tgz", 168 | "integrity": "sha1-/ts5T58OAqqXaOcCvaI7UF+ufh8=", 169 | "dev": true 170 | }, 171 | "ajv": { 172 | "version": "5.5.2", 173 | "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.5.2.tgz", 174 | "integrity": "sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU=", 175 | "dev": true, 176 | "requires": { 177 | "co": "4.6.0", 178 | "fast-deep-equal": "1.1.0", 179 | "fast-json-stable-stringify": "2.0.0", 180 | "json-schema-traverse": "0.3.1" 181 | } 182 | }, 183 | "ajv-keywords": { 184 | "version": "2.1.1", 185 | "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-2.1.1.tgz", 186 | "integrity": "sha1-YXmX/F9gV2iUxDX5QNgZ4TW4B2I=", 187 | "dev": true 188 | }, 189 | "align-text": { 190 | "version": "0.1.4", 191 | "resolved": "https://registry.npmjs.org/align-text/-/align-text-0.1.4.tgz", 192 | "integrity": "sha1-DNkKVhCT810KmSVsIrcGlDP60Rc=", 193 | "dev": true, 194 | "requires": { 195 | "kind-of": "3.2.2", 196 | "longest": "1.0.1", 197 | "repeat-string": "1.6.1" 198 | }, 199 | "dependencies": { 200 | "kind-of": { 201 | "version": "3.2.2", 202 | "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", 203 | "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", 204 | "dev": true, 205 | "requires": { 206 | "is-buffer": "1.1.6" 207 | } 208 | } 209 | } 210 | }, 211 | "amdefine": { 212 | "version": "1.0.1", 213 | "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz", 214 | "integrity": "sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU=", 215 | "dev": true 216 | }, 217 | "ansi-escapes": { 218 | "version": "3.1.0", 219 | "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.1.0.tgz", 220 | "integrity": "sha512-UgAb8H9D41AQnu/PbWlCofQVcnV4Gs2bBJi9eZPxfU/hgglFh3SMDMENRIqdr7H6XFnXdoknctFByVsCOotTVw==", 221 | "dev": true 222 | }, 223 | "ansi-regex": { 224 | "version": "2.1.1", 225 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", 226 | "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", 227 | "dev": true 228 | }, 229 | "ansi-styles": { 230 | "version": "2.2.1", 231 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", 232 | "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", 233 | "dev": true 234 | }, 235 | "append-transform": { 236 | "version": "0.4.0", 237 | "resolved": "https://registry.npmjs.org/append-transform/-/append-transform-0.4.0.tgz", 238 | "integrity": "sha1-126/jKlNJ24keja61EpLdKthGZE=", 239 | "dev": true, 240 | "requires": { 241 | "default-require-extensions": "1.0.0" 242 | } 243 | }, 244 | "argparse": { 245 | "version": "1.0.10", 246 | "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", 247 | "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", 248 | "dev": true, 249 | "requires": { 250 | "sprintf-js": "1.0.3" 251 | } 252 | }, 253 | "array-flatten": { 254 | "version": "1.1.1", 255 | "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", 256 | "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=", 257 | "dev": true 258 | }, 259 | "array-includes": { 260 | "version": "3.0.3", 261 | "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.0.3.tgz", 262 | "integrity": "sha1-GEtI9i2S10UrsxsyMWXH+L0CJm0=", 263 | "dev": true, 264 | "requires": { 265 | "define-properties": "1.1.2", 266 | "es-abstract": "1.11.0" 267 | } 268 | }, 269 | "array-union": { 270 | "version": "1.0.2", 271 | "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", 272 | "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=", 273 | "dev": true, 274 | "requires": { 275 | "array-uniq": "1.0.3" 276 | } 277 | }, 278 | "array-uniq": { 279 | "version": "1.0.3", 280 | "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", 281 | "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=", 282 | "dev": true 283 | }, 284 | "arraybuffer.slice": { 285 | "version": "0.0.7", 286 | "resolved": "https://registry.npmjs.org/arraybuffer.slice/-/arraybuffer.slice-0.0.7.tgz", 287 | "integrity": "sha512-wGUIVQXuehL5TCqQun8OW81jGzAWycqzFF8lFp+GOM5BXLYj3bKNsYC4daB7n6XjCqxQA/qgTJ+8ANR3acjrog==", 288 | "dev": true 289 | }, 290 | "arrify": { 291 | "version": "1.0.1", 292 | "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", 293 | "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=", 294 | "dev": true 295 | }, 296 | "asap": { 297 | "version": "2.0.6", 298 | "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", 299 | "integrity": "sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY=", 300 | "dev": true 301 | }, 302 | "assertion-error": { 303 | "version": "1.1.0", 304 | "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz", 305 | "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==", 306 | "dev": true 307 | }, 308 | "async": { 309 | "version": "1.5.2", 310 | "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", 311 | "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=", 312 | "dev": true 313 | }, 314 | "async-limiter": { 315 | "version": "1.0.0", 316 | "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.0.tgz", 317 | "integrity": "sha512-jp/uFnooOiO+L211eZOoSyzpOITMXx1rBITauYykG3BRYPu8h0UcxsPNB04RR5vo4Tyz3+ay17tR6JVf9qzYWg==", 318 | "dev": true 319 | }, 320 | "babel-code-frame": { 321 | "version": "6.26.0", 322 | "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz", 323 | "integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=", 324 | "dev": true, 325 | "requires": { 326 | "chalk": "1.1.3", 327 | "esutils": "2.0.2", 328 | "js-tokens": "3.0.2" 329 | } 330 | }, 331 | "babel-generator": { 332 | "version": "6.26.1", 333 | "resolved": "https://registry.npmjs.org/babel-generator/-/babel-generator-6.26.1.tgz", 334 | "integrity": "sha512-HyfwY6ApZj7BYTcJURpM5tznulaBvyio7/0d4zFOeMPUmfxkCjHocCuoLa2SAGzBI8AREcH3eP3758F672DppA==", 335 | "dev": true, 336 | "requires": { 337 | "babel-messages": "6.23.0", 338 | "babel-runtime": "6.26.0", 339 | "babel-types": "6.26.0", 340 | "detect-indent": "4.0.0", 341 | "jsesc": "1.3.0", 342 | "lodash": "4.17.5", 343 | "source-map": "0.5.7", 344 | "trim-right": "1.0.1" 345 | } 346 | }, 347 | "babel-messages": { 348 | "version": "6.23.0", 349 | "resolved": "https://registry.npmjs.org/babel-messages/-/babel-messages-6.23.0.tgz", 350 | "integrity": "sha1-8830cDhYA1sqKVHG7F7fbGLyYw4=", 351 | "dev": true, 352 | "requires": { 353 | "babel-runtime": "6.26.0" 354 | } 355 | }, 356 | "babel-runtime": { 357 | "version": "6.26.0", 358 | "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz", 359 | "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=", 360 | "dev": true, 361 | "requires": { 362 | "core-js": "2.5.5", 363 | "regenerator-runtime": "0.11.1" 364 | } 365 | }, 366 | "babel-template": { 367 | "version": "6.26.0", 368 | "resolved": "https://registry.npmjs.org/babel-template/-/babel-template-6.26.0.tgz", 369 | "integrity": "sha1-3gPi0WOWsGn0bdn/+FIfsaDjXgI=", 370 | "dev": true, 371 | "requires": { 372 | "babel-runtime": "6.26.0", 373 | "babel-traverse": "6.26.0", 374 | "babel-types": "6.26.0", 375 | "babylon": "6.18.0", 376 | "lodash": "4.17.5" 377 | } 378 | }, 379 | "babel-traverse": { 380 | "version": "6.26.0", 381 | "resolved": "https://registry.npmjs.org/babel-traverse/-/babel-traverse-6.26.0.tgz", 382 | "integrity": "sha1-RqnL1+3MYsjlwGTi0tjQ9ANXZu4=", 383 | "dev": true, 384 | "requires": { 385 | "babel-code-frame": "6.26.0", 386 | "babel-messages": "6.23.0", 387 | "babel-runtime": "6.26.0", 388 | "babel-types": "6.26.0", 389 | "babylon": "6.18.0", 390 | "debug": "2.6.9", 391 | "globals": "9.18.0", 392 | "invariant": "2.2.4", 393 | "lodash": "4.17.5" 394 | }, 395 | "dependencies": { 396 | "debug": { 397 | "version": "2.6.9", 398 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", 399 | "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", 400 | "dev": true, 401 | "requires": { 402 | "ms": "2.0.0" 403 | } 404 | } 405 | } 406 | }, 407 | "babel-types": { 408 | "version": "6.26.0", 409 | "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.26.0.tgz", 410 | "integrity": "sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc=", 411 | "dev": true, 412 | "requires": { 413 | "babel-runtime": "6.26.0", 414 | "esutils": "2.0.2", 415 | "lodash": "4.17.5", 416 | "to-fast-properties": "1.0.3" 417 | } 418 | }, 419 | "babylon": { 420 | "version": "6.18.0", 421 | "resolved": "https://registry.npmjs.org/babylon/-/babylon-6.18.0.tgz", 422 | "integrity": "sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ==", 423 | "dev": true 424 | }, 425 | "backo2": { 426 | "version": "1.0.2", 427 | "resolved": "https://registry.npmjs.org/backo2/-/backo2-1.0.2.tgz", 428 | "integrity": "sha1-MasayLEpNjRj41s+u2n038+6eUc=", 429 | "dev": true 430 | }, 431 | "balanced-match": { 432 | "version": "1.0.0", 433 | "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", 434 | "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", 435 | "dev": true 436 | }, 437 | "base64-arraybuffer": { 438 | "version": "0.1.5", 439 | "resolved": "https://registry.npmjs.org/base64-arraybuffer/-/base64-arraybuffer-0.1.5.tgz", 440 | "integrity": "sha1-c5JncZI7Whl0etZmqlzUv5xunOg=", 441 | "dev": true 442 | }, 443 | "base64id": { 444 | "version": "1.0.0", 445 | "resolved": "https://registry.npmjs.org/base64id/-/base64id-1.0.0.tgz", 446 | "integrity": "sha1-R2iMuZu2gE8OBtPnY7HDLlfY5rY=", 447 | "dev": true 448 | }, 449 | "base64url": { 450 | "version": "2.0.0", 451 | "resolved": "https://registry.npmjs.org/base64url/-/base64url-2.0.0.tgz", 452 | "integrity": "sha1-6sFuA+oUOO/5Qj1puqNiYu0fcLs=", 453 | "dev": true 454 | }, 455 | "bcryptjs": { 456 | "version": "2.4.3", 457 | "resolved": "https://registry.npmjs.org/bcryptjs/-/bcryptjs-2.4.3.tgz", 458 | "integrity": "sha1-mrVie5PmBiH/fNrF2pczAn3x0Ms=" 459 | }, 460 | "better-assert": { 461 | "version": "1.0.2", 462 | "resolved": "https://registry.npmjs.org/better-assert/-/better-assert-1.0.2.tgz", 463 | "integrity": "sha1-QIZrnhueC1W0gYlDEeaPr/rrxSI=", 464 | "dev": true, 465 | "requires": { 466 | "callsite": "1.0.0" 467 | } 468 | }, 469 | "blob": { 470 | "version": "0.0.4", 471 | "resolved": "https://registry.npmjs.org/blob/-/blob-0.0.4.tgz", 472 | "integrity": "sha1-vPEwUspURj8w+fx+lbmkdjCpSSE=", 473 | "dev": true 474 | }, 475 | "body-parser": { 476 | "version": "1.18.2", 477 | "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.18.2.tgz", 478 | "integrity": "sha1-h2eKGdhLR9hZuDGZvVm84iKxBFQ=", 479 | "dev": true, 480 | "requires": { 481 | "bytes": "3.0.0", 482 | "content-type": "1.0.4", 483 | "debug": "2.6.9", 484 | "depd": "1.1.2", 485 | "http-errors": "1.6.3", 486 | "iconv-lite": "0.4.19", 487 | "on-finished": "2.3.0", 488 | "qs": "6.5.1", 489 | "raw-body": "2.3.2", 490 | "type-is": "1.6.16" 491 | }, 492 | "dependencies": { 493 | "debug": { 494 | "version": "2.6.9", 495 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", 496 | "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", 497 | "dev": true, 498 | "requires": { 499 | "ms": "2.0.0" 500 | } 501 | } 502 | } 503 | }, 504 | "brace-expansion": { 505 | "version": "1.1.11", 506 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", 507 | "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", 508 | "dev": true, 509 | "requires": { 510 | "balanced-match": "1.0.0", 511 | "concat-map": "0.0.1" 512 | } 513 | }, 514 | "browser-stdout": { 515 | "version": "1.3.1", 516 | "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz", 517 | "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==", 518 | "dev": true 519 | }, 520 | "buffer-equal-constant-time": { 521 | "version": "1.0.1", 522 | "resolved": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz", 523 | "integrity": "sha1-+OcRMvf/5uAaXJaXpMbz5I1cyBk=", 524 | "dev": true 525 | }, 526 | "buffer-from": { 527 | "version": "1.0.0", 528 | "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.0.0.tgz", 529 | "integrity": "sha512-83apNb8KK0Se60UE1+4Ukbe3HbfELJ6UlI4ldtOGs7So4KD26orJM8hIY9lxdzP+UpItH1Yh/Y8GUvNFWFFRxA==", 530 | "dev": true 531 | }, 532 | "builtin-modules": { 533 | "version": "1.1.1", 534 | "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz", 535 | "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=", 536 | "dev": true 537 | }, 538 | "bytes": { 539 | "version": "3.0.0", 540 | "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", 541 | "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=", 542 | "dev": true 543 | }, 544 | "caller-path": { 545 | "version": "0.1.0", 546 | "resolved": "https://registry.npmjs.org/caller-path/-/caller-path-0.1.0.tgz", 547 | "integrity": "sha1-lAhe9jWB7NPaqSREqP6U6CV3dR8=", 548 | "dev": true, 549 | "requires": { 550 | "callsites": "0.2.0" 551 | } 552 | }, 553 | "callsite": { 554 | "version": "1.0.0", 555 | "resolved": "https://registry.npmjs.org/callsite/-/callsite-1.0.0.tgz", 556 | "integrity": "sha1-KAOY5dZkvXQDi28JBRU+borxvCA=", 557 | "dev": true 558 | }, 559 | "callsites": { 560 | "version": "0.2.0", 561 | "resolved": "https://registry.npmjs.org/callsites/-/callsites-0.2.0.tgz", 562 | "integrity": "sha1-r6uWJikQp/M8GaV3WCXGnzTjUMo=", 563 | "dev": true 564 | }, 565 | "camelcase": { 566 | "version": "1.2.1", 567 | "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-1.2.1.tgz", 568 | "integrity": "sha1-m7UwTS4LVmmLLHWLCKPqqdqlijk=", 569 | "dev": true, 570 | "optional": true 571 | }, 572 | "center-align": { 573 | "version": "0.1.3", 574 | "resolved": "https://registry.npmjs.org/center-align/-/center-align-0.1.3.tgz", 575 | "integrity": "sha1-qg0yYptu6XIgBBHL1EYckHvCt60=", 576 | "dev": true, 577 | "optional": true, 578 | "requires": { 579 | "align-text": "0.1.4", 580 | "lazy-cache": "1.0.4" 581 | } 582 | }, 583 | "chai": { 584 | "version": "4.1.2", 585 | "resolved": "https://registry.npmjs.org/chai/-/chai-4.1.2.tgz", 586 | "integrity": "sha1-D2RYS6ZC8PKs4oBiefTwbKI61zw=", 587 | "dev": true, 588 | "requires": { 589 | "assertion-error": "1.1.0", 590 | "check-error": "1.0.2", 591 | "deep-eql": "3.0.1", 592 | "get-func-name": "2.0.0", 593 | "pathval": "1.1.0", 594 | "type-detect": "4.0.8" 595 | } 596 | }, 597 | "chalk": { 598 | "version": "1.1.3", 599 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", 600 | "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", 601 | "dev": true, 602 | "requires": { 603 | "ansi-styles": "2.2.1", 604 | "escape-string-regexp": "1.0.5", 605 | "has-ansi": "2.0.0", 606 | "strip-ansi": "3.0.1", 607 | "supports-color": "2.0.0" 608 | } 609 | }, 610 | "chardet": { 611 | "version": "0.4.2", 612 | "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.4.2.tgz", 613 | "integrity": "sha1-tUc7M9yXxCTl2Y3IfVXU2KKci/I=", 614 | "dev": true 615 | }, 616 | "check-error": { 617 | "version": "1.0.2", 618 | "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.2.tgz", 619 | "integrity": "sha1-V00xLt2Iu13YkS6Sht1sCu1KrII=", 620 | "dev": true 621 | }, 622 | "circular-json": { 623 | "version": "0.3.3", 624 | "resolved": "https://registry.npmjs.org/circular-json/-/circular-json-0.3.3.tgz", 625 | "integrity": "sha512-UZK3NBx2Mca+b5LsG7bY183pHWt5Y1xts4P3Pz7ENTwGVnJOUWbRb3ocjvX7hx9tq/yTAdclXm9sZ38gNuem4A==", 626 | "dev": true 627 | }, 628 | "cli-cursor": { 629 | "version": "2.1.0", 630 | "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz", 631 | "integrity": "sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU=", 632 | "dev": true, 633 | "requires": { 634 | "restore-cursor": "2.0.0" 635 | } 636 | }, 637 | "cli-width": { 638 | "version": "2.2.0", 639 | "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.0.tgz", 640 | "integrity": "sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk=", 641 | "dev": true 642 | }, 643 | "cliui": { 644 | "version": "2.1.0", 645 | "resolved": "https://registry.npmjs.org/cliui/-/cliui-2.1.0.tgz", 646 | "integrity": "sha1-S0dXYP+AJkx2LDoXGQMukcf+oNE=", 647 | "dev": true, 648 | "optional": true, 649 | "requires": { 650 | "center-align": "0.1.3", 651 | "right-align": "0.1.3", 652 | "wordwrap": "0.0.2" 653 | }, 654 | "dependencies": { 655 | "wordwrap": { 656 | "version": "0.0.2", 657 | "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.2.tgz", 658 | "integrity": "sha1-t5Zpu0LstAn4PVg8rVLKF+qhZD8=", 659 | "dev": true, 660 | "optional": true 661 | } 662 | } 663 | }, 664 | "clone-deep": { 665 | "version": "3.0.1", 666 | "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-3.0.1.tgz", 667 | "integrity": "sha512-kWn5hGUnIA4algk62xJIp9jxQZ8DxSPg9ktkkK1WxRGhU/0GKZBekYJHXAXaZKMpxoq/7R4eygeIl9Cf7si+bA==", 668 | "dev": true, 669 | "requires": { 670 | "for-own": "1.0.0", 671 | "is-plain-object": "2.0.4", 672 | "kind-of": "6.0.2", 673 | "shallow-clone": "2.0.2" 674 | } 675 | }, 676 | "co": { 677 | "version": "4.6.0", 678 | "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", 679 | "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=", 680 | "dev": true 681 | }, 682 | "color-convert": { 683 | "version": "1.9.1", 684 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.1.tgz", 685 | "integrity": "sha512-mjGanIiwQJskCC18rPR6OmrZ6fm2Lc7PeGFYwCmy5J34wC6F1PzdGL6xeMfmgicfYcNLGuVFA3WzXtIDCQSZxQ==", 686 | "dev": true, 687 | "requires": { 688 | "color-name": "1.1.3" 689 | } 690 | }, 691 | "color-name": { 692 | "version": "1.1.3", 693 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", 694 | "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", 695 | "dev": true 696 | }, 697 | "commander": { 698 | "version": "2.11.0", 699 | "resolved": "https://registry.npmjs.org/commander/-/commander-2.11.0.tgz", 700 | "integrity": "sha512-b0553uYA5YAEGgyYIGYROzKQ7X5RAqedkfjiZxwi0kL1g3bOaBNNZfYkzt/CL0umgD5wc9Jec2FbB98CjkMRvQ==", 701 | "dev": true 702 | }, 703 | "compare-versions": { 704 | "version": "3.1.0", 705 | "resolved": "https://registry.npmjs.org/compare-versions/-/compare-versions-3.1.0.tgz", 706 | "integrity": "sha512-4hAxDSBypT/yp2ySFD346So6Ragw5xmBn/e/agIGl3bZr6DLUqnoRZPusxKrXdYRZpgexO9daejmIenlq/wrIQ==", 707 | "dev": true 708 | }, 709 | "component-bind": { 710 | "version": "1.0.0", 711 | "resolved": "https://registry.npmjs.org/component-bind/-/component-bind-1.0.0.tgz", 712 | "integrity": "sha1-AMYIq33Nk4l8AAllGx06jh5zu9E=", 713 | "dev": true 714 | }, 715 | "component-emitter": { 716 | "version": "1.2.1", 717 | "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz", 718 | "integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY=", 719 | "dev": true 720 | }, 721 | "component-inherit": { 722 | "version": "0.0.3", 723 | "resolved": "https://registry.npmjs.org/component-inherit/-/component-inherit-0.0.3.tgz", 724 | "integrity": "sha1-ZF/ErfWLcrZJ1crmUTVhnbJv8UM=", 725 | "dev": true 726 | }, 727 | "concat-map": { 728 | "version": "0.0.1", 729 | "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", 730 | "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", 731 | "dev": true 732 | }, 733 | "concat-stream": { 734 | "version": "1.6.2", 735 | "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", 736 | "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", 737 | "dev": true, 738 | "requires": { 739 | "buffer-from": "1.0.0", 740 | "inherits": "2.0.3", 741 | "readable-stream": "2.3.6", 742 | "typedarray": "0.0.6" 743 | } 744 | }, 745 | "contains-path": { 746 | "version": "0.1.0", 747 | "resolved": "https://registry.npmjs.org/contains-path/-/contains-path-0.1.0.tgz", 748 | "integrity": "sha1-/ozxhP9mcLa67wGp1IYaXL7EEgo=", 749 | "dev": true 750 | }, 751 | "content-disposition": { 752 | "version": "0.5.2", 753 | "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.2.tgz", 754 | "integrity": "sha1-DPaLud318r55YcOoUXjLhdunjLQ=", 755 | "dev": true 756 | }, 757 | "content-type": { 758 | "version": "1.0.4", 759 | "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", 760 | "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==", 761 | "dev": true 762 | }, 763 | "cookie": { 764 | "version": "0.3.1", 765 | "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.3.1.tgz", 766 | "integrity": "sha1-5+Ch+e9DtMi6klxcWpboBtFoc7s=", 767 | "dev": true 768 | }, 769 | "cookie-signature": { 770 | "version": "1.0.6", 771 | "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", 772 | "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=", 773 | "dev": true 774 | }, 775 | "core-js": { 776 | "version": "2.5.5", 777 | "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.5.5.tgz", 778 | "integrity": "sha1-sU3ek2xkDAV5prUMq8wTLdYSfjs=", 779 | "dev": true 780 | }, 781 | "core-util-is": { 782 | "version": "1.0.2", 783 | "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", 784 | "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", 785 | "dev": true 786 | }, 787 | "cross-spawn": { 788 | "version": "5.1.0", 789 | "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz", 790 | "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=", 791 | "dev": true, 792 | "requires": { 793 | "lru-cache": "4.1.2", 794 | "shebang-command": "1.2.0", 795 | "which": "1.3.0" 796 | } 797 | }, 798 | "debug": { 799 | "version": "3.1.0", 800 | "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", 801 | "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", 802 | "requires": { 803 | "ms": "2.0.0" 804 | } 805 | }, 806 | "debug-log": { 807 | "version": "1.0.1", 808 | "resolved": "https://registry.npmjs.org/debug-log/-/debug-log-1.0.1.tgz", 809 | "integrity": "sha1-IwdjLUwEOCuN+KMvcLiVBG1SdF8=", 810 | "dev": true 811 | }, 812 | "decamelize": { 813 | "version": "1.2.0", 814 | "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", 815 | "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", 816 | "dev": true, 817 | "optional": true 818 | }, 819 | "deep-eql": { 820 | "version": "3.0.1", 821 | "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-3.0.1.tgz", 822 | "integrity": "sha512-+QeIQyN5ZuO+3Uk5DYh6/1eKO0m0YmJFGNmFHGACpf1ClL1nmlV/p4gNgbl2pJGxgXb4faqo6UE+M5ACEMyVcw==", 823 | "dev": true, 824 | "requires": { 825 | "type-detect": "4.0.8" 826 | } 827 | }, 828 | "deep-is": { 829 | "version": "0.1.3", 830 | "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", 831 | "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=", 832 | "dev": true 833 | }, 834 | "default-require-extensions": { 835 | "version": "1.0.0", 836 | "resolved": "https://registry.npmjs.org/default-require-extensions/-/default-require-extensions-1.0.0.tgz", 837 | "integrity": "sha1-836hXT4T/9m0N9M+GnW1+5eHTLg=", 838 | "dev": true, 839 | "requires": { 840 | "strip-bom": "2.0.0" 841 | } 842 | }, 843 | "define-properties": { 844 | "version": "1.1.2", 845 | "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.2.tgz", 846 | "integrity": "sha1-g6c/L+pWmJj7c3GTyPhzyvbUXJQ=", 847 | "dev": true, 848 | "requires": { 849 | "foreach": "2.0.5", 850 | "object-keys": "1.0.11" 851 | } 852 | }, 853 | "deglob": { 854 | "version": "2.1.0", 855 | "resolved": "https://registry.npmjs.org/deglob/-/deglob-2.1.0.tgz", 856 | "integrity": "sha1-TUSr4W7zLHebSXK9FBqAMlApoUo=", 857 | "dev": true, 858 | "requires": { 859 | "find-root": "1.1.0", 860 | "glob": "7.1.2", 861 | "ignore": "3.3.7", 862 | "pkg-config": "1.1.1", 863 | "run-parallel": "1.1.8", 864 | "uniq": "1.0.1" 865 | } 866 | }, 867 | "del": { 868 | "version": "2.2.2", 869 | "resolved": "https://registry.npmjs.org/del/-/del-2.2.2.tgz", 870 | "integrity": "sha1-wSyYHQZ4RshLyvhiz/kw2Qf/0ag=", 871 | "dev": true, 872 | "requires": { 873 | "globby": "5.0.0", 874 | "is-path-cwd": "1.0.0", 875 | "is-path-in-cwd": "1.0.1", 876 | "object-assign": "4.1.1", 877 | "pify": "2.3.0", 878 | "pinkie-promise": "2.0.1", 879 | "rimraf": "2.6.2" 880 | } 881 | }, 882 | "depd": { 883 | "version": "1.1.2", 884 | "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", 885 | "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=", 886 | "dev": true 887 | }, 888 | "destroy": { 889 | "version": "1.0.4", 890 | "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", 891 | "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=", 892 | "dev": true 893 | }, 894 | "detect-indent": { 895 | "version": "4.0.0", 896 | "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-4.0.0.tgz", 897 | "integrity": "sha1-920GQ1LN9Docts5hnE7jqUdd4gg=", 898 | "dev": true, 899 | "requires": { 900 | "repeating": "2.0.1" 901 | } 902 | }, 903 | "diff": { 904 | "version": "3.5.0", 905 | "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz", 906 | "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==", 907 | "dev": true 908 | }, 909 | "doctrine": { 910 | "version": "2.1.0", 911 | "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", 912 | "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", 913 | "dev": true, 914 | "requires": { 915 | "esutils": "2.0.2" 916 | } 917 | }, 918 | "ecdsa-sig-formatter": { 919 | "version": "1.0.9", 920 | "resolved": "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.9.tgz", 921 | "integrity": "sha1-S8kmJ07Dtau1AW5+HWCSGsJisqE=", 922 | "dev": true, 923 | "requires": { 924 | "base64url": "2.0.0", 925 | "safe-buffer": "5.1.1" 926 | } 927 | }, 928 | "ee-first": { 929 | "version": "1.1.1", 930 | "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", 931 | "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=", 932 | "dev": true 933 | }, 934 | "encodeurl": { 935 | "version": "1.0.2", 936 | "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", 937 | "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=", 938 | "dev": true 939 | }, 940 | "encoding": { 941 | "version": "0.1.12", 942 | "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.12.tgz", 943 | "integrity": "sha1-U4tm8+5izRq1HsMjgp0flIDHS+s=", 944 | "dev": true, 945 | "requires": { 946 | "iconv-lite": "0.4.19" 947 | } 948 | }, 949 | "engine.io": { 950 | "version": "3.2.0", 951 | "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-3.2.0.tgz", 952 | "integrity": "sha512-mRbgmAtQ4GAlKwuPnnAvXXwdPhEx+jkc0OBCLrXuD/CRvwNK3AxRSnqK4FSqmAMRRHryVJP8TopOvmEaA64fKw==", 953 | "dev": true, 954 | "requires": { 955 | "accepts": "1.3.5", 956 | "base64id": "1.0.0", 957 | "cookie": "0.3.1", 958 | "debug": "3.1.0", 959 | "engine.io-parser": "2.1.2", 960 | "ws": "3.3.3" 961 | } 962 | }, 963 | "engine.io-client": { 964 | "version": "3.2.1", 965 | "resolved": "https://registry.npmjs.org/engine.io-client/-/engine.io-client-3.2.1.tgz", 966 | "integrity": "sha512-y5AbkytWeM4jQr7m/koQLc5AxpRKC1hEVUb/s1FUAWEJq5AzJJ4NLvzuKPuxtDi5Mq755WuDvZ6Iv2rXj4PTzw==", 967 | "dev": true, 968 | "requires": { 969 | "component-emitter": "1.2.1", 970 | "component-inherit": "0.0.3", 971 | "debug": "3.1.0", 972 | "engine.io-parser": "2.1.2", 973 | "has-cors": "1.1.0", 974 | "indexof": "0.0.1", 975 | "parseqs": "0.0.5", 976 | "parseuri": "0.0.5", 977 | "ws": "3.3.3", 978 | "xmlhttprequest-ssl": "1.5.5", 979 | "yeast": "0.1.2" 980 | } 981 | }, 982 | "engine.io-parser": { 983 | "version": "2.1.2", 984 | "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-2.1.2.tgz", 985 | "integrity": "sha512-dInLFzr80RijZ1rGpx1+56/uFoH7/7InhH3kZt+Ms6hT8tNx3NGW/WNSA/f8As1WkOfkuyb3tnRyuXGxusclMw==", 986 | "dev": true, 987 | "requires": { 988 | "after": "0.8.2", 989 | "arraybuffer.slice": "0.0.7", 990 | "base64-arraybuffer": "0.1.5", 991 | "blob": "0.0.4", 992 | "has-binary2": "1.0.2" 993 | } 994 | }, 995 | "error-ex": { 996 | "version": "1.3.1", 997 | "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.1.tgz", 998 | "integrity": "sha1-+FWobOYa3E6GIcPNoh56dhLDqNw=", 999 | "dev": true, 1000 | "requires": { 1001 | "is-arrayish": "0.2.1" 1002 | } 1003 | }, 1004 | "es-abstract": { 1005 | "version": "1.11.0", 1006 | "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.11.0.tgz", 1007 | "integrity": "sha512-ZnQrE/lXTTQ39ulXZ+J1DTFazV9qBy61x2bY071B+qGco8Z8q1QddsLdt/EF8Ai9hcWH72dWS0kFqXLxOxqslA==", 1008 | "dev": true, 1009 | "requires": { 1010 | "es-to-primitive": "1.1.1", 1011 | "function-bind": "1.1.1", 1012 | "has": "1.0.1", 1013 | "is-callable": "1.1.3", 1014 | "is-regex": "1.0.4" 1015 | } 1016 | }, 1017 | "es-to-primitive": { 1018 | "version": "1.1.1", 1019 | "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.1.1.tgz", 1020 | "integrity": "sha1-RTVSSKiJeQNLZ5Lhm7gfK3l13Q0=", 1021 | "dev": true, 1022 | "requires": { 1023 | "is-callable": "1.1.3", 1024 | "is-date-object": "1.0.1", 1025 | "is-symbol": "1.0.1" 1026 | } 1027 | }, 1028 | "escape-html": { 1029 | "version": "1.0.3", 1030 | "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", 1031 | "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=", 1032 | "dev": true 1033 | }, 1034 | "escape-string-regexp": { 1035 | "version": "1.0.5", 1036 | "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", 1037 | "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", 1038 | "dev": true 1039 | }, 1040 | "eslint": { 1041 | "version": "4.18.2", 1042 | "resolved": "https://registry.npmjs.org/eslint/-/eslint-4.18.2.tgz", 1043 | "integrity": "sha512-qy4i3wODqKMYfz9LUI8N2qYDkHkoieTbiHpMrYUI/WbjhXJQr7lI4VngixTgaG+yHX+NBCv7nW4hA0ShbvaNKw==", 1044 | "dev": true, 1045 | "requires": { 1046 | "ajv": "5.5.2", 1047 | "babel-code-frame": "6.26.0", 1048 | "chalk": "2.3.2", 1049 | "concat-stream": "1.6.2", 1050 | "cross-spawn": "5.1.0", 1051 | "debug": "3.1.0", 1052 | "doctrine": "2.1.0", 1053 | "eslint-scope": "3.7.1", 1054 | "eslint-visitor-keys": "1.0.0", 1055 | "espree": "3.5.4", 1056 | "esquery": "1.0.1", 1057 | "esutils": "2.0.2", 1058 | "file-entry-cache": "2.0.0", 1059 | "functional-red-black-tree": "1.0.1", 1060 | "glob": "7.1.2", 1061 | "globals": "11.4.0", 1062 | "ignore": "3.3.7", 1063 | "imurmurhash": "0.1.4", 1064 | "inquirer": "3.3.0", 1065 | "is-resolvable": "1.1.0", 1066 | "js-yaml": "3.11.0", 1067 | "json-stable-stringify-without-jsonify": "1.0.1", 1068 | "levn": "0.3.0", 1069 | "lodash": "4.17.5", 1070 | "minimatch": "3.0.4", 1071 | "mkdirp": "0.5.1", 1072 | "natural-compare": "1.4.0", 1073 | "optionator": "0.8.2", 1074 | "path-is-inside": "1.0.2", 1075 | "pluralize": "7.0.0", 1076 | "progress": "2.0.0", 1077 | "require-uncached": "1.0.3", 1078 | "semver": "5.5.0", 1079 | "strip-ansi": "4.0.0", 1080 | "strip-json-comments": "2.0.1", 1081 | "table": "4.0.2", 1082 | "text-table": "0.2.0" 1083 | }, 1084 | "dependencies": { 1085 | "ansi-regex": { 1086 | "version": "3.0.0", 1087 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", 1088 | "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", 1089 | "dev": true 1090 | }, 1091 | "ansi-styles": { 1092 | "version": "3.2.1", 1093 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", 1094 | "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", 1095 | "dev": true, 1096 | "requires": { 1097 | "color-convert": "1.9.1" 1098 | } 1099 | }, 1100 | "chalk": { 1101 | "version": "2.3.2", 1102 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.3.2.tgz", 1103 | "integrity": "sha512-ZM4j2/ld/YZDc3Ma8PgN7gyAk+kHMMMyzLNryCPGhWrsfAuDVeuid5bpRFTDgMH9JBK2lA4dyyAkkZYF/WcqDQ==", 1104 | "dev": true, 1105 | "requires": { 1106 | "ansi-styles": "3.2.1", 1107 | "escape-string-regexp": "1.0.5", 1108 | "supports-color": "5.3.0" 1109 | } 1110 | }, 1111 | "globals": { 1112 | "version": "11.4.0", 1113 | "resolved": "https://registry.npmjs.org/globals/-/globals-11.4.0.tgz", 1114 | "integrity": "sha512-Dyzmifil8n/TmSqYDEXbm+C8yitzJQqQIlJQLNRMwa+BOUJpRC19pyVeN12JAjt61xonvXjtff+hJruTRXn5HA==", 1115 | "dev": true 1116 | }, 1117 | "has-flag": { 1118 | "version": "3.0.0", 1119 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", 1120 | "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", 1121 | "dev": true 1122 | }, 1123 | "strip-ansi": { 1124 | "version": "4.0.0", 1125 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", 1126 | "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", 1127 | "dev": true, 1128 | "requires": { 1129 | "ansi-regex": "3.0.0" 1130 | } 1131 | }, 1132 | "supports-color": { 1133 | "version": "5.3.0", 1134 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.3.0.tgz", 1135 | "integrity": "sha512-0aP01LLIskjKs3lq52EC0aGBAJhLq7B2Rd8HC/DR/PtNNpcLilNmHC12O+hu0usQpo7wtHNRqtrhBwtDb0+dNg==", 1136 | "dev": true, 1137 | "requires": { 1138 | "has-flag": "3.0.0" 1139 | } 1140 | } 1141 | } 1142 | }, 1143 | "eslint-config-semistandard": { 1144 | "version": "12.0.1", 1145 | "resolved": "https://registry.npmjs.org/eslint-config-semistandard/-/eslint-config-semistandard-12.0.1.tgz", 1146 | "integrity": "sha512-4zaPW5uRFasf2uRZkE19Y+W84KBV3q+oyWYOsgUN+5DQXE5HCsh7ZxeWDXxozk7NPycGm0kXcsJzLe5GZ1jCeg==", 1147 | "dev": true 1148 | }, 1149 | "eslint-config-standard": { 1150 | "version": "11.0.0", 1151 | "resolved": "https://registry.npmjs.org/eslint-config-standard/-/eslint-config-standard-11.0.0.tgz", 1152 | "integrity": "sha512-oDdENzpViEe5fwuRCWla7AXQd++/oyIp8zP+iP9jiUPG6NBj3SHgdgtl/kTn00AjeN+1HNvavTKmYbMo+xMOlw==", 1153 | "dev": true 1154 | }, 1155 | "eslint-config-standard-jsx": { 1156 | "version": "5.0.0", 1157 | "resolved": "https://registry.npmjs.org/eslint-config-standard-jsx/-/eslint-config-standard-jsx-5.0.0.tgz", 1158 | "integrity": "sha512-rLToPAEqLMPBfWnYTu6xRhm2OWziS2n40QFqJ8jAM8NSVzeVKTa3nclhsU4DpPJQRY60F34Oo1wi/71PN/eITg==", 1159 | "dev": true 1160 | }, 1161 | "eslint-import-resolver-node": { 1162 | "version": "0.3.2", 1163 | "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.2.tgz", 1164 | "integrity": "sha512-sfmTqJfPSizWu4aymbPr4Iidp5yKm8yDkHp+Ir3YiTHiiDfxh69mOUsmiqW6RZ9zRXFaF64GtYmN7e+8GHBv6Q==", 1165 | "dev": true, 1166 | "requires": { 1167 | "debug": "2.6.9", 1168 | "resolve": "1.7.1" 1169 | }, 1170 | "dependencies": { 1171 | "debug": { 1172 | "version": "2.6.9", 1173 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", 1174 | "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", 1175 | "dev": true, 1176 | "requires": { 1177 | "ms": "2.0.0" 1178 | } 1179 | } 1180 | } 1181 | }, 1182 | "eslint-module-utils": { 1183 | "version": "2.2.0", 1184 | "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.2.0.tgz", 1185 | "integrity": "sha1-snA2LNiLGkitMIl2zn+lTphBF0Y=", 1186 | "dev": true, 1187 | "requires": { 1188 | "debug": "2.6.9", 1189 | "pkg-dir": "1.0.0" 1190 | }, 1191 | "dependencies": { 1192 | "debug": { 1193 | "version": "2.6.9", 1194 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", 1195 | "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", 1196 | "dev": true, 1197 | "requires": { 1198 | "ms": "2.0.0" 1199 | } 1200 | } 1201 | } 1202 | }, 1203 | "eslint-plugin-import": { 1204 | "version": "2.8.0", 1205 | "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.8.0.tgz", 1206 | "integrity": "sha512-Rf7dfKJxZ16QuTgVv1OYNxkZcsu/hULFnC+e+w0Gzi6jMC3guQoWQgxYxc54IDRinlb6/0v5z/PxxIKmVctN+g==", 1207 | "dev": true, 1208 | "requires": { 1209 | "builtin-modules": "1.1.1", 1210 | "contains-path": "0.1.0", 1211 | "debug": "2.6.9", 1212 | "doctrine": "1.5.0", 1213 | "eslint-import-resolver-node": "0.3.2", 1214 | "eslint-module-utils": "2.2.0", 1215 | "has": "1.0.1", 1216 | "lodash.cond": "4.5.2", 1217 | "minimatch": "3.0.4", 1218 | "read-pkg-up": "2.0.0" 1219 | }, 1220 | "dependencies": { 1221 | "debug": { 1222 | "version": "2.6.9", 1223 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", 1224 | "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", 1225 | "dev": true, 1226 | "requires": { 1227 | "ms": "2.0.0" 1228 | } 1229 | }, 1230 | "doctrine": { 1231 | "version": "1.5.0", 1232 | "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-1.5.0.tgz", 1233 | "integrity": "sha1-N53Ocw9hZvds76TmcHoVmwLFpvo=", 1234 | "dev": true, 1235 | "requires": { 1236 | "esutils": "2.0.2", 1237 | "isarray": "1.0.0" 1238 | } 1239 | }, 1240 | "isarray": { 1241 | "version": "1.0.0", 1242 | "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", 1243 | "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", 1244 | "dev": true 1245 | } 1246 | } 1247 | }, 1248 | "eslint-plugin-node": { 1249 | "version": "6.0.1", 1250 | "resolved": "https://registry.npmjs.org/eslint-plugin-node/-/eslint-plugin-node-6.0.1.tgz", 1251 | "integrity": "sha512-Q/Cc2sW1OAISDS+Ji6lZS2KV4b7ueA/WydVWd1BECTQwVvfQy5JAi3glhINoKzoMnfnuRgNP+ZWKrGAbp3QDxw==", 1252 | "dev": true, 1253 | "requires": { 1254 | "ignore": "3.3.7", 1255 | "minimatch": "3.0.4", 1256 | "resolve": "1.7.1", 1257 | "semver": "5.5.0" 1258 | } 1259 | }, 1260 | "eslint-plugin-promise": { 1261 | "version": "3.6.0", 1262 | "resolved": "https://registry.npmjs.org/eslint-plugin-promise/-/eslint-plugin-promise-3.6.0.tgz", 1263 | "integrity": "sha512-YQzM6TLTlApAr7Li8vWKR+K3WghjwKcYzY0d2roWap4SLK+kzuagJX/leTetIDWsFcTFnKNJXWupDCD6aZkP2Q==", 1264 | "dev": true 1265 | }, 1266 | "eslint-plugin-react": { 1267 | "version": "7.6.1", 1268 | "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.6.1.tgz", 1269 | "integrity": "sha512-30aMOHWX/DOaaLJVBHz6RMvYM2qy5GH63+y2PLFdIrYe4YLtODFmT3N1YA7ZqUnaBweVbedr4K4cqxOlWAPjIw==", 1270 | "dev": true, 1271 | "requires": { 1272 | "doctrine": "2.1.0", 1273 | "has": "1.0.1", 1274 | "jsx-ast-utils": "2.0.1", 1275 | "prop-types": "15.6.1" 1276 | } 1277 | }, 1278 | "eslint-plugin-standard": { 1279 | "version": "3.0.1", 1280 | "resolved": "https://registry.npmjs.org/eslint-plugin-standard/-/eslint-plugin-standard-3.0.1.tgz", 1281 | "integrity": "sha1-NNDJFbRe3G8BA5PH7vOCOwhWXPI=", 1282 | "dev": true 1283 | }, 1284 | "eslint-scope": { 1285 | "version": "3.7.1", 1286 | "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-3.7.1.tgz", 1287 | "integrity": "sha1-PWPD7f2gLgbgGkUq2IyqzHzctug=", 1288 | "dev": true, 1289 | "requires": { 1290 | "esrecurse": "4.2.1", 1291 | "estraverse": "4.2.0" 1292 | } 1293 | }, 1294 | "eslint-visitor-keys": { 1295 | "version": "1.0.0", 1296 | "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.0.0.tgz", 1297 | "integrity": "sha512-qzm/XxIbxm/FHyH341ZrbnMUpe+5Bocte9xkmFMzPMjRaZMcXww+MpBptFvtU+79L362nqiLhekCxCxDPaUMBQ==", 1298 | "dev": true 1299 | }, 1300 | "espree": { 1301 | "version": "3.5.4", 1302 | "resolved": "https://registry.npmjs.org/espree/-/espree-3.5.4.tgz", 1303 | "integrity": "sha512-yAcIQxtmMiB/jL32dzEp2enBeidsB7xWPLNiw3IIkpVds1P+h7qF9YwJq1yUNzp2OKXgAprs4F61ih66UsoD1A==", 1304 | "dev": true, 1305 | "requires": { 1306 | "acorn": "5.5.3", 1307 | "acorn-jsx": "3.0.1" 1308 | } 1309 | }, 1310 | "esprima": { 1311 | "version": "4.0.0", 1312 | "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.0.tgz", 1313 | "integrity": "sha512-oftTcaMu/EGrEIu904mWteKIv8vMuOgGYo7EhVJJN00R/EED9DCua/xxHRdYnKtcECzVg7xOWhflvJMnqcFZjw==", 1314 | "dev": true 1315 | }, 1316 | "esquery": { 1317 | "version": "1.0.1", 1318 | "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.0.1.tgz", 1319 | "integrity": "sha512-SmiyZ5zIWH9VM+SRUReLS5Q8a7GxtRdxEBVZpm98rJM7Sb+A9DVCndXfkeFUd3byderg+EbDkfnevfCwynWaNA==", 1320 | "dev": true, 1321 | "requires": { 1322 | "estraverse": "4.2.0" 1323 | } 1324 | }, 1325 | "esrecurse": { 1326 | "version": "4.2.1", 1327 | "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.2.1.tgz", 1328 | "integrity": "sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ==", 1329 | "dev": true, 1330 | "requires": { 1331 | "estraverse": "4.2.0" 1332 | } 1333 | }, 1334 | "estraverse": { 1335 | "version": "4.2.0", 1336 | "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.2.0.tgz", 1337 | "integrity": "sha1-De4/7TH81GlhjOc0IJn8GvoL2xM=", 1338 | "dev": true 1339 | }, 1340 | "esutils": { 1341 | "version": "2.0.2", 1342 | "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz", 1343 | "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=", 1344 | "dev": true 1345 | }, 1346 | "etag": { 1347 | "version": "1.8.1", 1348 | "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", 1349 | "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=", 1350 | "dev": true 1351 | }, 1352 | "events": { 1353 | "version": "2.0.0", 1354 | "resolved": "https://registry.npmjs.org/events/-/events-2.0.0.tgz", 1355 | "integrity": "sha512-r/M5YkNg9zwI8QbSf7tsDWWJvO3PGwZXyG7GpFAxtMASnHL2eblFd7iHiGPtyGKKFPZ59S63NeX10Ws6WqGDcg==", 1356 | "dev": true 1357 | }, 1358 | "express": { 1359 | "version": "4.16.3", 1360 | "resolved": "https://registry.npmjs.org/express/-/express-4.16.3.tgz", 1361 | "integrity": "sha1-avilAjUNsyRuzEvs9rWjTSL37VM=", 1362 | "dev": true, 1363 | "requires": { 1364 | "accepts": "1.3.5", 1365 | "array-flatten": "1.1.1", 1366 | "body-parser": "1.18.2", 1367 | "content-disposition": "0.5.2", 1368 | "content-type": "1.0.4", 1369 | "cookie": "0.3.1", 1370 | "cookie-signature": "1.0.6", 1371 | "debug": "2.6.9", 1372 | "depd": "1.1.2", 1373 | "encodeurl": "1.0.2", 1374 | "escape-html": "1.0.3", 1375 | "etag": "1.8.1", 1376 | "finalhandler": "1.1.1", 1377 | "fresh": "0.5.2", 1378 | "merge-descriptors": "1.0.1", 1379 | "methods": "1.1.2", 1380 | "on-finished": "2.3.0", 1381 | "parseurl": "1.3.2", 1382 | "path-to-regexp": "0.1.7", 1383 | "proxy-addr": "2.0.3", 1384 | "qs": "6.5.1", 1385 | "range-parser": "1.2.0", 1386 | "safe-buffer": "5.1.1", 1387 | "send": "0.16.2", 1388 | "serve-static": "1.13.2", 1389 | "setprototypeof": "1.1.0", 1390 | "statuses": "1.4.0", 1391 | "type-is": "1.6.16", 1392 | "utils-merge": "1.0.1", 1393 | "vary": "1.1.2" 1394 | }, 1395 | "dependencies": { 1396 | "debug": { 1397 | "version": "2.6.9", 1398 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", 1399 | "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", 1400 | "dev": true, 1401 | "requires": { 1402 | "ms": "2.0.0" 1403 | } 1404 | } 1405 | } 1406 | }, 1407 | "external-editor": { 1408 | "version": "2.2.0", 1409 | "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-2.2.0.tgz", 1410 | "integrity": "sha512-bSn6gvGxKt+b7+6TKEv1ZycHleA7aHhRHyAqJyp5pbUFuYYNIzpZnQDk7AsYckyWdEnTeAnay0aCy2aV6iTk9A==", 1411 | "dev": true, 1412 | "requires": { 1413 | "chardet": "0.4.2", 1414 | "iconv-lite": "0.4.19", 1415 | "tmp": "0.0.33" 1416 | } 1417 | }, 1418 | "fast-deep-equal": { 1419 | "version": "1.1.0", 1420 | "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-1.1.0.tgz", 1421 | "integrity": "sha1-wFNHeBfIa1HaqFPIHgWbcz0CNhQ=", 1422 | "dev": true 1423 | }, 1424 | "fast-json-stable-stringify": { 1425 | "version": "2.0.0", 1426 | "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz", 1427 | "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=", 1428 | "dev": true 1429 | }, 1430 | "fast-levenshtein": { 1431 | "version": "2.0.6", 1432 | "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", 1433 | "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", 1434 | "dev": true 1435 | }, 1436 | "fbjs": { 1437 | "version": "0.8.16", 1438 | "resolved": "https://registry.npmjs.org/fbjs/-/fbjs-0.8.16.tgz", 1439 | "integrity": "sha1-XmdDL1UNxBtXK/VYR7ispk5TN9s=", 1440 | "dev": true, 1441 | "requires": { 1442 | "core-js": "1.2.7", 1443 | "isomorphic-fetch": "2.2.1", 1444 | "loose-envify": "1.3.1", 1445 | "object-assign": "4.1.1", 1446 | "promise": "7.3.1", 1447 | "setimmediate": "1.0.5", 1448 | "ua-parser-js": "0.7.17" 1449 | }, 1450 | "dependencies": { 1451 | "core-js": { 1452 | "version": "1.2.7", 1453 | "resolved": "https://registry.npmjs.org/core-js/-/core-js-1.2.7.tgz", 1454 | "integrity": "sha1-ZSKUwUZR2yj6k70tX/KYOk8IxjY=", 1455 | "dev": true 1456 | } 1457 | } 1458 | }, 1459 | "feathers-memory": { 1460 | "version": "2.1.1", 1461 | "resolved": "https://registry.npmjs.org/feathers-memory/-/feathers-memory-2.1.1.tgz", 1462 | "integrity": "sha512-IjHUPJOwOiRJVN1N7majMUO+V1Ob+/UK+gYR6iA+jc1MY0lzBlCKVfkc+Edmck6sE0eIygTsQu6ixyzm4lgldA==", 1463 | "dev": true, 1464 | "requires": { 1465 | "@feathersjs/commons": "1.4.1", 1466 | "@feathersjs/errors": "3.3.0", 1467 | "clone-deep": "3.0.1", 1468 | "sift": "5.1.0", 1469 | "uberproto": "1.2.0" 1470 | } 1471 | }, 1472 | "figures": { 1473 | "version": "2.0.0", 1474 | "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz", 1475 | "integrity": "sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI=", 1476 | "dev": true, 1477 | "requires": { 1478 | "escape-string-regexp": "1.0.5" 1479 | } 1480 | }, 1481 | "file-entry-cache": { 1482 | "version": "2.0.0", 1483 | "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-2.0.0.tgz", 1484 | "integrity": "sha1-w5KZDD5oR4PYOLjISkXYoEhFg2E=", 1485 | "dev": true, 1486 | "requires": { 1487 | "flat-cache": "1.3.0", 1488 | "object-assign": "4.1.1" 1489 | } 1490 | }, 1491 | "fileset": { 1492 | "version": "2.0.3", 1493 | "resolved": "https://registry.npmjs.org/fileset/-/fileset-2.0.3.tgz", 1494 | "integrity": "sha1-jnVIqW08wjJ+5eZ0FocjozO7oqA=", 1495 | "dev": true, 1496 | "requires": { 1497 | "glob": "7.1.2", 1498 | "minimatch": "3.0.4" 1499 | } 1500 | }, 1501 | "finalhandler": { 1502 | "version": "1.1.1", 1503 | "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.1.tgz", 1504 | "integrity": "sha512-Y1GUDo39ez4aHAw7MysnUD5JzYX+WaIj8I57kO3aEPT1fFRL4sr7mjei97FgnwhAyyzRYmQZaTHb2+9uZ1dPtg==", 1505 | "dev": true, 1506 | "requires": { 1507 | "debug": "2.6.9", 1508 | "encodeurl": "1.0.2", 1509 | "escape-html": "1.0.3", 1510 | "on-finished": "2.3.0", 1511 | "parseurl": "1.3.2", 1512 | "statuses": "1.4.0", 1513 | "unpipe": "1.0.0" 1514 | }, 1515 | "dependencies": { 1516 | "debug": { 1517 | "version": "2.6.9", 1518 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", 1519 | "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", 1520 | "dev": true, 1521 | "requires": { 1522 | "ms": "2.0.0" 1523 | } 1524 | } 1525 | } 1526 | }, 1527 | "find-root": { 1528 | "version": "1.1.0", 1529 | "resolved": "https://registry.npmjs.org/find-root/-/find-root-1.1.0.tgz", 1530 | "integrity": "sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng==", 1531 | "dev": true 1532 | }, 1533 | "find-up": { 1534 | "version": "1.1.2", 1535 | "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", 1536 | "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", 1537 | "dev": true, 1538 | "requires": { 1539 | "path-exists": "2.1.0", 1540 | "pinkie-promise": "2.0.1" 1541 | } 1542 | }, 1543 | "flat-cache": { 1544 | "version": "1.3.0", 1545 | "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-1.3.0.tgz", 1546 | "integrity": "sha1-0wMLMrOBVPTjt+nHCfSQ9++XxIE=", 1547 | "dev": true, 1548 | "requires": { 1549 | "circular-json": "0.3.3", 1550 | "del": "2.2.2", 1551 | "graceful-fs": "4.1.11", 1552 | "write": "0.2.1" 1553 | } 1554 | }, 1555 | "for-in": { 1556 | "version": "1.0.2", 1557 | "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", 1558 | "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=", 1559 | "dev": true 1560 | }, 1561 | "for-own": { 1562 | "version": "1.0.0", 1563 | "resolved": "https://registry.npmjs.org/for-own/-/for-own-1.0.0.tgz", 1564 | "integrity": "sha1-xjMy9BXO3EsE2/5wz4NklMU8tEs=", 1565 | "dev": true, 1566 | "requires": { 1567 | "for-in": "1.0.2" 1568 | } 1569 | }, 1570 | "foreach": { 1571 | "version": "2.0.5", 1572 | "resolved": "https://registry.npmjs.org/foreach/-/foreach-2.0.5.tgz", 1573 | "integrity": "sha1-C+4AUBiusmDQo6865ljdATbsG5k=", 1574 | "dev": true 1575 | }, 1576 | "formatio": { 1577 | "version": "1.2.0", 1578 | "resolved": "https://registry.npmjs.org/formatio/-/formatio-1.2.0.tgz", 1579 | "integrity": "sha1-87IWfZBoxGmKjVH092CjmlTYGOs=", 1580 | "dev": true, 1581 | "requires": { 1582 | "samsam": "1.3.0" 1583 | } 1584 | }, 1585 | "forwarded": { 1586 | "version": "0.1.2", 1587 | "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz", 1588 | "integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ=", 1589 | "dev": true 1590 | }, 1591 | "fresh": { 1592 | "version": "0.5.2", 1593 | "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", 1594 | "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=", 1595 | "dev": true 1596 | }, 1597 | "fs.realpath": { 1598 | "version": "1.0.0", 1599 | "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", 1600 | "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", 1601 | "dev": true 1602 | }, 1603 | "function-bind": { 1604 | "version": "1.1.1", 1605 | "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", 1606 | "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", 1607 | "dev": true 1608 | }, 1609 | "functional-red-black-tree": { 1610 | "version": "1.0.1", 1611 | "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", 1612 | "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=", 1613 | "dev": true 1614 | }, 1615 | "get-func-name": { 1616 | "version": "2.0.0", 1617 | "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.0.tgz", 1618 | "integrity": "sha1-6td0q+5y4gQJQzoGY2YCPdaIekE=", 1619 | "dev": true 1620 | }, 1621 | "get-stdin": { 1622 | "version": "6.0.0", 1623 | "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-6.0.0.tgz", 1624 | "integrity": "sha512-jp4tHawyV7+fkkSKyvjuLZswblUtz+SQKzSWnBbii16BuZksJlU1wuBYXY75r+duh/llF1ur6oNwi+2ZzjKZ7g==", 1625 | "dev": true 1626 | }, 1627 | "glob": { 1628 | "version": "7.1.2", 1629 | "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", 1630 | "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", 1631 | "dev": true, 1632 | "requires": { 1633 | "fs.realpath": "1.0.0", 1634 | "inflight": "1.0.6", 1635 | "inherits": "2.0.3", 1636 | "minimatch": "3.0.4", 1637 | "once": "1.4.0", 1638 | "path-is-absolute": "1.0.1" 1639 | } 1640 | }, 1641 | "globals": { 1642 | "version": "9.18.0", 1643 | "resolved": "https://registry.npmjs.org/globals/-/globals-9.18.0.tgz", 1644 | "integrity": "sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ==", 1645 | "dev": true 1646 | }, 1647 | "globby": { 1648 | "version": "5.0.0", 1649 | "resolved": "https://registry.npmjs.org/globby/-/globby-5.0.0.tgz", 1650 | "integrity": "sha1-69hGZ8oNuzMLmbz8aOrCvFQ3Dg0=", 1651 | "dev": true, 1652 | "requires": { 1653 | "array-union": "1.0.2", 1654 | "arrify": "1.0.1", 1655 | "glob": "7.1.2", 1656 | "object-assign": "4.1.1", 1657 | "pify": "2.3.0", 1658 | "pinkie-promise": "2.0.1" 1659 | } 1660 | }, 1661 | "graceful-fs": { 1662 | "version": "4.1.11", 1663 | "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", 1664 | "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=", 1665 | "dev": true 1666 | }, 1667 | "growl": { 1668 | "version": "1.10.3", 1669 | "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.3.tgz", 1670 | "integrity": "sha512-hKlsbA5Vu3xsh1Cg3J7jSmX/WaW6A5oBeqzM88oNbCRQFz+zUaXm6yxS4RVytp1scBoJzSYl4YAEOQIt6O8V1Q==", 1671 | "dev": true 1672 | }, 1673 | "handlebars": { 1674 | "version": "4.0.11", 1675 | "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.0.11.tgz", 1676 | "integrity": "sha1-Ywo13+ApS8KB7a5v/F0yn8eYLcw=", 1677 | "dev": true, 1678 | "requires": { 1679 | "async": "1.5.2", 1680 | "optimist": "0.6.1", 1681 | "source-map": "0.4.4", 1682 | "uglify-js": "2.8.29" 1683 | }, 1684 | "dependencies": { 1685 | "source-map": { 1686 | "version": "0.4.4", 1687 | "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.4.4.tgz", 1688 | "integrity": "sha1-66T12pwNyZneaAMti092FzZSA2s=", 1689 | "dev": true, 1690 | "requires": { 1691 | "amdefine": "1.0.1" 1692 | } 1693 | } 1694 | } 1695 | }, 1696 | "has": { 1697 | "version": "1.0.1", 1698 | "resolved": "https://registry.npmjs.org/has/-/has-1.0.1.tgz", 1699 | "integrity": "sha1-hGFzP1OLCDfJNh45qauelwTcLyg=", 1700 | "dev": true, 1701 | "requires": { 1702 | "function-bind": "1.1.1" 1703 | } 1704 | }, 1705 | "has-ansi": { 1706 | "version": "2.0.0", 1707 | "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", 1708 | "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", 1709 | "dev": true, 1710 | "requires": { 1711 | "ansi-regex": "2.1.1" 1712 | } 1713 | }, 1714 | "has-binary2": { 1715 | "version": "1.0.2", 1716 | "resolved": "https://registry.npmjs.org/has-binary2/-/has-binary2-1.0.2.tgz", 1717 | "integrity": "sha1-6D26SfC5vk0CbSc2U1DZ8D9Uvpg=", 1718 | "dev": true, 1719 | "requires": { 1720 | "isarray": "2.0.1" 1721 | } 1722 | }, 1723 | "has-cors": { 1724 | "version": "1.1.0", 1725 | "resolved": "https://registry.npmjs.org/has-cors/-/has-cors-1.1.0.tgz", 1726 | "integrity": "sha1-XkdHk/fqmEPRu5nCPu9J/xJv/zk=", 1727 | "dev": true 1728 | }, 1729 | "has-flag": { 1730 | "version": "1.0.0", 1731 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", 1732 | "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", 1733 | "dev": true 1734 | }, 1735 | "he": { 1736 | "version": "1.1.1", 1737 | "resolved": "https://registry.npmjs.org/he/-/he-1.1.1.tgz", 1738 | "integrity": "sha1-k0EP0hsAlzUVH4howvJx80J+I/0=", 1739 | "dev": true 1740 | }, 1741 | "hoek": { 1742 | "version": "2.16.3", 1743 | "resolved": "https://registry.npmjs.org/hoek/-/hoek-2.16.3.tgz", 1744 | "integrity": "sha1-ILt0A9POo5jpHcRxCo/xuCdKJe0=", 1745 | "dev": true 1746 | }, 1747 | "hosted-git-info": { 1748 | "version": "2.6.0", 1749 | "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.6.0.tgz", 1750 | "integrity": "sha512-lIbgIIQA3lz5XaB6vxakj6sDHADJiZadYEJB+FgA+C4nubM1NwcuvUr9EJPmnH1skZqpqUzWborWo8EIUi0Sdw==", 1751 | "dev": true 1752 | }, 1753 | "http-errors": { 1754 | "version": "1.6.3", 1755 | "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", 1756 | "integrity": "sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0=", 1757 | "dev": true, 1758 | "requires": { 1759 | "depd": "1.1.2", 1760 | "inherits": "2.0.3", 1761 | "setprototypeof": "1.1.0", 1762 | "statuses": "1.4.0" 1763 | } 1764 | }, 1765 | "iconv-lite": { 1766 | "version": "0.4.19", 1767 | "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.19.tgz", 1768 | "integrity": "sha512-oTZqweIP51xaGPI4uPa56/Pri/480R+mo7SeU+YETByQNhDG55ycFyNLIgta9vXhILrxXDmF7ZGhqZIcuN0gJQ==", 1769 | "dev": true 1770 | }, 1771 | "ignore": { 1772 | "version": "3.3.7", 1773 | "resolved": "https://registry.npmjs.org/ignore/-/ignore-3.3.7.tgz", 1774 | "integrity": "sha512-YGG3ejvBNHRqu0559EOxxNFihD0AjpvHlC/pdGKd3X3ofe+CoJkYazwNJYTNebqpPKN+VVQbh4ZFn1DivMNuHA==", 1775 | "dev": true 1776 | }, 1777 | "imurmurhash": { 1778 | "version": "0.1.4", 1779 | "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", 1780 | "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", 1781 | "dev": true 1782 | }, 1783 | "indexof": { 1784 | "version": "0.0.1", 1785 | "resolved": "https://registry.npmjs.org/indexof/-/indexof-0.0.1.tgz", 1786 | "integrity": "sha1-gtwzbSMrkGIXnQWrMpOmYFn9Q10=", 1787 | "dev": true 1788 | }, 1789 | "inflight": { 1790 | "version": "1.0.6", 1791 | "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", 1792 | "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", 1793 | "dev": true, 1794 | "requires": { 1795 | "once": "1.4.0", 1796 | "wrappy": "1.0.2" 1797 | } 1798 | }, 1799 | "inherits": { 1800 | "version": "2.0.3", 1801 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", 1802 | "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", 1803 | "dev": true 1804 | }, 1805 | "inquirer": { 1806 | "version": "3.3.0", 1807 | "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-3.3.0.tgz", 1808 | "integrity": "sha512-h+xtnyk4EwKvFWHrUYsWErEVR+igKtLdchu+o0Z1RL7VU/jVMFbYir2bp6bAj8efFNxWqHX0dIss6fJQ+/+qeQ==", 1809 | "dev": true, 1810 | "requires": { 1811 | "ansi-escapes": "3.1.0", 1812 | "chalk": "2.3.2", 1813 | "cli-cursor": "2.1.0", 1814 | "cli-width": "2.2.0", 1815 | "external-editor": "2.2.0", 1816 | "figures": "2.0.0", 1817 | "lodash": "4.17.5", 1818 | "mute-stream": "0.0.7", 1819 | "run-async": "2.3.0", 1820 | "rx-lite": "4.0.8", 1821 | "rx-lite-aggregates": "4.0.8", 1822 | "string-width": "2.1.1", 1823 | "strip-ansi": "4.0.0", 1824 | "through": "2.3.8" 1825 | }, 1826 | "dependencies": { 1827 | "ansi-regex": { 1828 | "version": "3.0.0", 1829 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", 1830 | "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", 1831 | "dev": true 1832 | }, 1833 | "ansi-styles": { 1834 | "version": "3.2.1", 1835 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", 1836 | "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", 1837 | "dev": true, 1838 | "requires": { 1839 | "color-convert": "1.9.1" 1840 | } 1841 | }, 1842 | "chalk": { 1843 | "version": "2.3.2", 1844 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.3.2.tgz", 1845 | "integrity": "sha512-ZM4j2/ld/YZDc3Ma8PgN7gyAk+kHMMMyzLNryCPGhWrsfAuDVeuid5bpRFTDgMH9JBK2lA4dyyAkkZYF/WcqDQ==", 1846 | "dev": true, 1847 | "requires": { 1848 | "ansi-styles": "3.2.1", 1849 | "escape-string-regexp": "1.0.5", 1850 | "supports-color": "5.3.0" 1851 | } 1852 | }, 1853 | "has-flag": { 1854 | "version": "3.0.0", 1855 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", 1856 | "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", 1857 | "dev": true 1858 | }, 1859 | "strip-ansi": { 1860 | "version": "4.0.0", 1861 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", 1862 | "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", 1863 | "dev": true, 1864 | "requires": { 1865 | "ansi-regex": "3.0.0" 1866 | } 1867 | }, 1868 | "supports-color": { 1869 | "version": "5.3.0", 1870 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.3.0.tgz", 1871 | "integrity": "sha512-0aP01LLIskjKs3lq52EC0aGBAJhLq7B2Rd8HC/DR/PtNNpcLilNmHC12O+hu0usQpo7wtHNRqtrhBwtDb0+dNg==", 1872 | "dev": true, 1873 | "requires": { 1874 | "has-flag": "3.0.0" 1875 | } 1876 | } 1877 | } 1878 | }, 1879 | "invariant": { 1880 | "version": "2.2.4", 1881 | "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", 1882 | "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==", 1883 | "dev": true, 1884 | "requires": { 1885 | "loose-envify": "1.3.1" 1886 | } 1887 | }, 1888 | "ipaddr.js": { 1889 | "version": "1.6.0", 1890 | "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.6.0.tgz", 1891 | "integrity": "sha1-4/o1e3c9phnybpXwSdBVxyeW+Gs=", 1892 | "dev": true 1893 | }, 1894 | "is-arrayish": { 1895 | "version": "0.2.1", 1896 | "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", 1897 | "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", 1898 | "dev": true 1899 | }, 1900 | "is-buffer": { 1901 | "version": "1.1.6", 1902 | "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", 1903 | "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", 1904 | "dev": true 1905 | }, 1906 | "is-builtin-module": { 1907 | "version": "1.0.0", 1908 | "resolved": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-1.0.0.tgz", 1909 | "integrity": "sha1-VAVy0096wxGfj3bDDLwbHgN6/74=", 1910 | "dev": true, 1911 | "requires": { 1912 | "builtin-modules": "1.1.1" 1913 | } 1914 | }, 1915 | "is-callable": { 1916 | "version": "1.1.3", 1917 | "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.3.tgz", 1918 | "integrity": "sha1-hut1OSgF3cM69xySoO7fdO52BLI=", 1919 | "dev": true 1920 | }, 1921 | "is-date-object": { 1922 | "version": "1.0.1", 1923 | "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.1.tgz", 1924 | "integrity": "sha1-mqIOtq7rv/d/vTPnTKAbM1gdOhY=", 1925 | "dev": true 1926 | }, 1927 | "is-extendable": { 1928 | "version": "1.0.1", 1929 | "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", 1930 | "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", 1931 | "dev": true, 1932 | "requires": { 1933 | "is-plain-object": "2.0.4" 1934 | } 1935 | }, 1936 | "is-finite": { 1937 | "version": "1.0.2", 1938 | "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.0.2.tgz", 1939 | "integrity": "sha1-zGZ3aVYCvlUO8R6LSqYwU0K20Ko=", 1940 | "dev": true, 1941 | "requires": { 1942 | "number-is-nan": "1.0.1" 1943 | } 1944 | }, 1945 | "is-fullwidth-code-point": { 1946 | "version": "2.0.0", 1947 | "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", 1948 | "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", 1949 | "dev": true 1950 | }, 1951 | "is-path-cwd": { 1952 | "version": "1.0.0", 1953 | "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-1.0.0.tgz", 1954 | "integrity": "sha1-0iXsIxMuie3Tj9p2dHLmLmXxEG0=", 1955 | "dev": true 1956 | }, 1957 | "is-path-in-cwd": { 1958 | "version": "1.0.1", 1959 | "resolved": "https://registry.npmjs.org/is-path-in-cwd/-/is-path-in-cwd-1.0.1.tgz", 1960 | "integrity": "sha512-FjV1RTW48E7CWM7eE/J2NJvAEEVektecDBVBE5Hh3nM1Jd0kvhHtX68Pr3xsDf857xt3Y4AkwVULK1Vku62aaQ==", 1961 | "dev": true, 1962 | "requires": { 1963 | "is-path-inside": "1.0.1" 1964 | } 1965 | }, 1966 | "is-path-inside": { 1967 | "version": "1.0.1", 1968 | "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-1.0.1.tgz", 1969 | "integrity": "sha1-jvW33lBDej/cprToZe96pVy0gDY=", 1970 | "dev": true, 1971 | "requires": { 1972 | "path-is-inside": "1.0.2" 1973 | } 1974 | }, 1975 | "is-plain-object": { 1976 | "version": "2.0.4", 1977 | "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", 1978 | "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", 1979 | "dev": true, 1980 | "requires": { 1981 | "isobject": "3.0.1" 1982 | } 1983 | }, 1984 | "is-promise": { 1985 | "version": "2.1.0", 1986 | "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.1.0.tgz", 1987 | "integrity": "sha1-eaKp7OfwlugPNtKy87wWwf9L8/o=", 1988 | "dev": true 1989 | }, 1990 | "is-regex": { 1991 | "version": "1.0.4", 1992 | "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.4.tgz", 1993 | "integrity": "sha1-VRdIm1RwkbCTDglWVM7SXul+lJE=", 1994 | "dev": true, 1995 | "requires": { 1996 | "has": "1.0.1" 1997 | } 1998 | }, 1999 | "is-resolvable": { 2000 | "version": "1.1.0", 2001 | "resolved": "https://registry.npmjs.org/is-resolvable/-/is-resolvable-1.1.0.tgz", 2002 | "integrity": "sha512-qgDYXFSR5WvEfuS5dMj6oTMEbrrSaM0CrFk2Yiq/gXnBvD9pMa2jGXxyhGLfvhZpuMZe18CJpFxAt3CRs42NMg==", 2003 | "dev": true 2004 | }, 2005 | "is-stream": { 2006 | "version": "1.1.0", 2007 | "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", 2008 | "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", 2009 | "dev": true 2010 | }, 2011 | "is-symbol": { 2012 | "version": "1.0.1", 2013 | "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.1.tgz", 2014 | "integrity": "sha1-PMWfAAJRlLarLjjbrmaJJWtmBXI=", 2015 | "dev": true 2016 | }, 2017 | "is-utf8": { 2018 | "version": "0.2.1", 2019 | "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", 2020 | "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=", 2021 | "dev": true 2022 | }, 2023 | "isarray": { 2024 | "version": "2.0.1", 2025 | "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.1.tgz", 2026 | "integrity": "sha1-o32U7ZzaLVmGXJ92/llu4fM4dB4=", 2027 | "dev": true 2028 | }, 2029 | "isemail": { 2030 | "version": "1.2.0", 2031 | "resolved": "https://registry.npmjs.org/isemail/-/isemail-1.2.0.tgz", 2032 | "integrity": "sha1-vgPfjMPineTSxd9lASY/H6RZXpo=", 2033 | "dev": true 2034 | }, 2035 | "isexe": { 2036 | "version": "2.0.0", 2037 | "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", 2038 | "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", 2039 | "dev": true 2040 | }, 2041 | "isobject": { 2042 | "version": "3.0.1", 2043 | "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", 2044 | "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", 2045 | "dev": true 2046 | }, 2047 | "isomorphic-fetch": { 2048 | "version": "2.2.1", 2049 | "resolved": "https://registry.npmjs.org/isomorphic-fetch/-/isomorphic-fetch-2.2.1.tgz", 2050 | "integrity": "sha1-YRrhrPFPXoH3KVB0coGf6XM1WKk=", 2051 | "dev": true, 2052 | "requires": { 2053 | "node-fetch": "1.7.3", 2054 | "whatwg-fetch": "2.0.4" 2055 | } 2056 | }, 2057 | "istanbul": { 2058 | "version": "1.1.0-alpha.1", 2059 | "resolved": "https://registry.npmjs.org/istanbul/-/istanbul-1.1.0-alpha.1.tgz", 2060 | "integrity": "sha1-eBeVZWAYohdMX2DzZ+5dNhy1e3c=", 2061 | "dev": true, 2062 | "requires": { 2063 | "abbrev": "1.0.9", 2064 | "async": "1.5.2", 2065 | "istanbul-api": "1.3.1", 2066 | "js-yaml": "3.11.0", 2067 | "mkdirp": "0.5.1", 2068 | "nopt": "3.0.6", 2069 | "which": "1.3.0", 2070 | "wordwrap": "1.0.0" 2071 | } 2072 | }, 2073 | "istanbul-api": { 2074 | "version": "1.3.1", 2075 | "resolved": "https://registry.npmjs.org/istanbul-api/-/istanbul-api-1.3.1.tgz", 2076 | "integrity": "sha512-duj6AlLcsWNwUpfyfHt0nWIeRiZpuShnP40YTxOGQgtaN8fd6JYSxsvxUphTDy8V5MfDXo4s/xVCIIvVCO808g==", 2077 | "dev": true, 2078 | "requires": { 2079 | "async": "2.6.0", 2080 | "compare-versions": "3.1.0", 2081 | "fileset": "2.0.3", 2082 | "istanbul-lib-coverage": "1.2.0", 2083 | "istanbul-lib-hook": "1.2.0", 2084 | "istanbul-lib-instrument": "1.10.1", 2085 | "istanbul-lib-report": "1.1.4", 2086 | "istanbul-lib-source-maps": "1.2.4", 2087 | "istanbul-reports": "1.3.0", 2088 | "js-yaml": "3.11.0", 2089 | "mkdirp": "0.5.1", 2090 | "once": "1.4.0" 2091 | }, 2092 | "dependencies": { 2093 | "async": { 2094 | "version": "2.6.0", 2095 | "resolved": "https://registry.npmjs.org/async/-/async-2.6.0.tgz", 2096 | "integrity": "sha512-xAfGg1/NTLBBKlHFmnd7PlmUW9KhVQIUuSrYem9xzFUZy13ScvtyGGejaae9iAVRiRq9+Cx7DPFaAAhCpyxyPw==", 2097 | "dev": true, 2098 | "requires": { 2099 | "lodash": "4.17.5" 2100 | } 2101 | } 2102 | } 2103 | }, 2104 | "istanbul-lib-coverage": { 2105 | "version": "1.2.0", 2106 | "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-1.2.0.tgz", 2107 | "integrity": "sha512-GvgM/uXRwm+gLlvkWHTjDAvwynZkL9ns15calTrmhGgowlwJBbWMYzWbKqE2DT6JDP1AFXKa+Zi0EkqNCUqY0A==", 2108 | "dev": true 2109 | }, 2110 | "istanbul-lib-hook": { 2111 | "version": "1.2.0", 2112 | "resolved": "https://registry.npmjs.org/istanbul-lib-hook/-/istanbul-lib-hook-1.2.0.tgz", 2113 | "integrity": "sha512-p3En6/oGkFQV55Up8ZPC2oLxvgSxD8CzA0yBrhRZSh3pfv3OFj9aSGVC0yoerAi/O4u7jUVnOGVX1eVFM+0tmQ==", 2114 | "dev": true, 2115 | "requires": { 2116 | "append-transform": "0.4.0" 2117 | } 2118 | }, 2119 | "istanbul-lib-instrument": { 2120 | "version": "1.10.1", 2121 | "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-1.10.1.tgz", 2122 | "integrity": "sha512-1dYuzkOCbuR5GRJqySuZdsmsNKPL3PTuyPevQfoCXJePT9C8y1ga75neU+Tuy9+yS3G/dgx8wgOmp2KLpgdoeQ==", 2123 | "dev": true, 2124 | "requires": { 2125 | "babel-generator": "6.26.1", 2126 | "babel-template": "6.26.0", 2127 | "babel-traverse": "6.26.0", 2128 | "babel-types": "6.26.0", 2129 | "babylon": "6.18.0", 2130 | "istanbul-lib-coverage": "1.2.0", 2131 | "semver": "5.5.0" 2132 | } 2133 | }, 2134 | "istanbul-lib-report": { 2135 | "version": "1.1.4", 2136 | "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-1.1.4.tgz", 2137 | "integrity": "sha512-Azqvq5tT0U09nrncK3q82e/Zjkxa4tkFZv7E6VcqP0QCPn6oNljDPfrZEC/umNXds2t7b8sRJfs6Kmpzt8m2kA==", 2138 | "dev": true, 2139 | "requires": { 2140 | "istanbul-lib-coverage": "1.2.0", 2141 | "mkdirp": "0.5.1", 2142 | "path-parse": "1.0.5", 2143 | "supports-color": "3.2.3" 2144 | }, 2145 | "dependencies": { 2146 | "supports-color": { 2147 | "version": "3.2.3", 2148 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", 2149 | "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", 2150 | "dev": true, 2151 | "requires": { 2152 | "has-flag": "1.0.0" 2153 | } 2154 | } 2155 | } 2156 | }, 2157 | "istanbul-lib-source-maps": { 2158 | "version": "1.2.4", 2159 | "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-1.2.4.tgz", 2160 | "integrity": "sha512-UzuK0g1wyQijiaYQxj/CdNycFhAd2TLtO2obKQMTZrZ1jzEMRY3rvpASEKkaxbRR6brvdovfA03znPa/pXcejg==", 2161 | "dev": true, 2162 | "requires": { 2163 | "debug": "3.1.0", 2164 | "istanbul-lib-coverage": "1.2.0", 2165 | "mkdirp": "0.5.1", 2166 | "rimraf": "2.6.2", 2167 | "source-map": "0.5.7" 2168 | } 2169 | }, 2170 | "istanbul-reports": { 2171 | "version": "1.3.0", 2172 | "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-1.3.0.tgz", 2173 | "integrity": "sha512-y2Z2IMqE1gefWUaVjrBm0mSKvUkaBy9Vqz8iwr/r40Y9hBbIteH5wqHG/9DLTfJ9xUnUT2j7A3+VVJ6EaYBllA==", 2174 | "dev": true, 2175 | "requires": { 2176 | "handlebars": "4.0.11" 2177 | } 2178 | }, 2179 | "joi": { 2180 | "version": "6.10.1", 2181 | "resolved": "https://registry.npmjs.org/joi/-/joi-6.10.1.tgz", 2182 | "integrity": "sha1-TVDDGAeRIgAP5fFq8f+OGRe3fgY=", 2183 | "dev": true, 2184 | "requires": { 2185 | "hoek": "2.16.3", 2186 | "isemail": "1.2.0", 2187 | "moment": "2.22.1", 2188 | "topo": "1.1.0" 2189 | } 2190 | }, 2191 | "js-tokens": { 2192 | "version": "3.0.2", 2193 | "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz", 2194 | "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=", 2195 | "dev": true 2196 | }, 2197 | "js-yaml": { 2198 | "version": "3.11.0", 2199 | "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.11.0.tgz", 2200 | "integrity": "sha512-saJstZWv7oNeOyBh3+Dx1qWzhW0+e6/8eDzo7p5rDFqxntSztloLtuKu+Ejhtq82jsilwOIZYsCz+lIjthg1Hw==", 2201 | "dev": true, 2202 | "requires": { 2203 | "argparse": "1.0.10", 2204 | "esprima": "4.0.0" 2205 | } 2206 | }, 2207 | "jsesc": { 2208 | "version": "1.3.0", 2209 | "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-1.3.0.tgz", 2210 | "integrity": "sha1-RsP+yMGJKxKwgz25vHYiF226s0s=", 2211 | "dev": true 2212 | }, 2213 | "json-parse-better-errors": { 2214 | "version": "1.0.2", 2215 | "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", 2216 | "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", 2217 | "dev": true 2218 | }, 2219 | "json-schema-traverse": { 2220 | "version": "0.3.1", 2221 | "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz", 2222 | "integrity": "sha1-NJptRMU6Ud6JtAgFxdXlm0F9M0A=", 2223 | "dev": true 2224 | }, 2225 | "json-stable-stringify-without-jsonify": { 2226 | "version": "1.0.1", 2227 | "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", 2228 | "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=", 2229 | "dev": true 2230 | }, 2231 | "jsonwebtoken": { 2232 | "version": "8.2.1", 2233 | "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-8.2.1.tgz", 2234 | "integrity": "sha512-l8rUBr0fqYYwPc8/ZGrue7GiW7vWdZtZqelxo4Sd5lMvuEeCK8/wS54sEo6tJhdZ6hqfutsj6COgC0d1XdbHGw==", 2235 | "dev": true, 2236 | "requires": { 2237 | "jws": "3.1.4", 2238 | "lodash.includes": "4.3.0", 2239 | "lodash.isboolean": "3.0.3", 2240 | "lodash.isinteger": "4.0.4", 2241 | "lodash.isnumber": "3.0.3", 2242 | "lodash.isplainobject": "4.0.6", 2243 | "lodash.isstring": "4.0.1", 2244 | "lodash.once": "4.1.1", 2245 | "ms": "2.1.1", 2246 | "xtend": "4.0.1" 2247 | }, 2248 | "dependencies": { 2249 | "ms": { 2250 | "version": "2.1.1", 2251 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", 2252 | "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", 2253 | "dev": true 2254 | } 2255 | } 2256 | }, 2257 | "jsx-ast-utils": { 2258 | "version": "2.0.1", 2259 | "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-2.0.1.tgz", 2260 | "integrity": "sha1-6AGxs5mF4g//yHtA43SAgOLcrH8=", 2261 | "dev": true, 2262 | "requires": { 2263 | "array-includes": "3.0.3" 2264 | } 2265 | }, 2266 | "just-extend": { 2267 | "version": "1.1.27", 2268 | "resolved": "https://registry.npmjs.org/just-extend/-/just-extend-1.1.27.tgz", 2269 | "integrity": "sha512-mJVp13Ix6gFo3SBAy9U/kL+oeZqzlYYYLQBwXVBlVzIsZwBqGREnOro24oC/8s8aox+rJhtZ2DiQof++IrkA+g==", 2270 | "dev": true 2271 | }, 2272 | "jwa": { 2273 | "version": "1.1.5", 2274 | "resolved": "https://registry.npmjs.org/jwa/-/jwa-1.1.5.tgz", 2275 | "integrity": "sha1-oFUs4CIHQs1S4VN3SjKQXDDnVuU=", 2276 | "dev": true, 2277 | "requires": { 2278 | "base64url": "2.0.0", 2279 | "buffer-equal-constant-time": "1.0.1", 2280 | "ecdsa-sig-formatter": "1.0.9", 2281 | "safe-buffer": "5.1.1" 2282 | } 2283 | }, 2284 | "jws": { 2285 | "version": "3.1.4", 2286 | "resolved": "https://registry.npmjs.org/jws/-/jws-3.1.4.tgz", 2287 | "integrity": "sha1-+ei5M46KhHJ31kRLFGT2GIDgUKI=", 2288 | "dev": true, 2289 | "requires": { 2290 | "base64url": "2.0.0", 2291 | "jwa": "1.1.5", 2292 | "safe-buffer": "5.1.1" 2293 | } 2294 | }, 2295 | "kind-of": { 2296 | "version": "6.0.2", 2297 | "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", 2298 | "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", 2299 | "dev": true 2300 | }, 2301 | "lazy-cache": { 2302 | "version": "1.0.4", 2303 | "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-1.0.4.tgz", 2304 | "integrity": "sha1-odePw6UEdMuAhF07O24dpJpEbo4=", 2305 | "dev": true, 2306 | "optional": true 2307 | }, 2308 | "levn": { 2309 | "version": "0.3.0", 2310 | "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", 2311 | "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", 2312 | "dev": true, 2313 | "requires": { 2314 | "prelude-ls": "1.1.2", 2315 | "type-check": "0.3.2" 2316 | } 2317 | }, 2318 | "load-json-file": { 2319 | "version": "2.0.0", 2320 | "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-2.0.0.tgz", 2321 | "integrity": "sha1-eUfkIUmvgNaWy/eXvKq8/h/inKg=", 2322 | "dev": true, 2323 | "requires": { 2324 | "graceful-fs": "4.1.11", 2325 | "parse-json": "2.2.0", 2326 | "pify": "2.3.0", 2327 | "strip-bom": "3.0.0" 2328 | }, 2329 | "dependencies": { 2330 | "strip-bom": { 2331 | "version": "3.0.0", 2332 | "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", 2333 | "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", 2334 | "dev": true 2335 | } 2336 | } 2337 | }, 2338 | "locate-path": { 2339 | "version": "2.0.0", 2340 | "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", 2341 | "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", 2342 | "dev": true, 2343 | "requires": { 2344 | "p-locate": "2.0.0", 2345 | "path-exists": "3.0.0" 2346 | }, 2347 | "dependencies": { 2348 | "path-exists": { 2349 | "version": "3.0.0", 2350 | "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", 2351 | "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", 2352 | "dev": true 2353 | } 2354 | } 2355 | }, 2356 | "lodash": { 2357 | "version": "4.17.5", 2358 | "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.5.tgz", 2359 | "integrity": "sha512-svL3uiZf1RwhH+cWrfZn3A4+U58wbP0tGVTLQPbjplZxZ8ROD9VLuNgsRniTlLe7OlSqR79RUehXgpBW/s0IQw==" 2360 | }, 2361 | "lodash.clone": { 2362 | "version": "4.5.0", 2363 | "resolved": "https://registry.npmjs.org/lodash.clone/-/lodash.clone-4.5.0.tgz", 2364 | "integrity": "sha1-GVhwRQ9aExkkeN9Lw9I9LeoZB7Y=", 2365 | "dev": true 2366 | }, 2367 | "lodash.cond": { 2368 | "version": "4.5.2", 2369 | "resolved": "https://registry.npmjs.org/lodash.cond/-/lodash.cond-4.5.2.tgz", 2370 | "integrity": "sha1-9HGh2khr5g9quVXRcRVSPdHSVdU=", 2371 | "dev": true 2372 | }, 2373 | "lodash.get": { 2374 | "version": "4.4.2", 2375 | "resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz", 2376 | "integrity": "sha1-LRd/ZS+jHpObRDjVNBSZ36OCXpk=", 2377 | "dev": true 2378 | }, 2379 | "lodash.includes": { 2380 | "version": "4.3.0", 2381 | "resolved": "https://registry.npmjs.org/lodash.includes/-/lodash.includes-4.3.0.tgz", 2382 | "integrity": "sha1-YLuYqHy5I8aMoeUTJUgzFISfVT8=", 2383 | "dev": true 2384 | }, 2385 | "lodash.isboolean": { 2386 | "version": "3.0.3", 2387 | "resolved": "https://registry.npmjs.org/lodash.isboolean/-/lodash.isboolean-3.0.3.tgz", 2388 | "integrity": "sha1-bC4XHbKiV82WgC/UOwGyDV9YcPY=", 2389 | "dev": true 2390 | }, 2391 | "lodash.isinteger": { 2392 | "version": "4.0.4", 2393 | "resolved": "https://registry.npmjs.org/lodash.isinteger/-/lodash.isinteger-4.0.4.tgz", 2394 | "integrity": "sha1-YZwK89A/iwTDH1iChAt3sRzWg0M=", 2395 | "dev": true 2396 | }, 2397 | "lodash.isnumber": { 2398 | "version": "3.0.3", 2399 | "resolved": "https://registry.npmjs.org/lodash.isnumber/-/lodash.isnumber-3.0.3.tgz", 2400 | "integrity": "sha1-POdoEMWSjQM1IwGsKHMX8RwLH/w=", 2401 | "dev": true 2402 | }, 2403 | "lodash.isplainobject": { 2404 | "version": "4.0.6", 2405 | "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", 2406 | "integrity": "sha1-fFJqUtibRcRcxpC4gWO+BJf1UMs=", 2407 | "dev": true 2408 | }, 2409 | "lodash.isstring": { 2410 | "version": "4.0.1", 2411 | "resolved": "https://registry.npmjs.org/lodash.isstring/-/lodash.isstring-4.0.1.tgz", 2412 | "integrity": "sha1-1SfftUVuynzJu5XV2ur4i6VKVFE=", 2413 | "dev": true 2414 | }, 2415 | "lodash.merge": { 2416 | "version": "4.6.1", 2417 | "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.1.tgz", 2418 | "integrity": "sha512-AOYza4+Hf5z1/0Hztxpm2/xiPZgi/cjMqdnKTUWTBSKchJlxXXuUSxCCl8rJlf4g6yww/j6mA8nC8Hw/EZWxKQ==", 2419 | "dev": true 2420 | }, 2421 | "lodash.omit": { 2422 | "version": "4.5.0", 2423 | "resolved": "https://registry.npmjs.org/lodash.omit/-/lodash.omit-4.5.0.tgz", 2424 | "integrity": "sha1-brGa5aHuHdnfC5aeZs4Lf6MLXmA=", 2425 | "dev": true 2426 | }, 2427 | "lodash.once": { 2428 | "version": "4.1.1", 2429 | "resolved": "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz", 2430 | "integrity": "sha1-DdOXEhPHxW34gJd9UEyI+0cal6w=", 2431 | "dev": true 2432 | }, 2433 | "lodash.pick": { 2434 | "version": "4.4.0", 2435 | "resolved": "https://registry.npmjs.org/lodash.pick/-/lodash.pick-4.4.0.tgz", 2436 | "integrity": "sha1-UvBWEP/53tQiYRRB7R/BI6AwAbM=", 2437 | "dev": true 2438 | }, 2439 | "lolex": { 2440 | "version": "2.3.2", 2441 | "resolved": "https://registry.npmjs.org/lolex/-/lolex-2.3.2.tgz", 2442 | "integrity": "sha512-A5pN2tkFj7H0dGIAM6MFvHKMJcPnjZsOMvR7ujCjfgW5TbV6H9vb1PgxLtHvjqNZTHsUolz+6/WEO0N1xNx2ng==", 2443 | "dev": true 2444 | }, 2445 | "long-timeout": { 2446 | "version": "0.1.1", 2447 | "resolved": "https://registry.npmjs.org/long-timeout/-/long-timeout-0.1.1.tgz", 2448 | "integrity": "sha1-lyHXiLR+C8taJMLivuGg2lXatRQ=", 2449 | "dev": true 2450 | }, 2451 | "longest": { 2452 | "version": "1.0.1", 2453 | "resolved": "https://registry.npmjs.org/longest/-/longest-1.0.1.tgz", 2454 | "integrity": "sha1-MKCy2jj3N3DoKUoNIuZiXtd9AJc=", 2455 | "dev": true 2456 | }, 2457 | "loose-envify": { 2458 | "version": "1.3.1", 2459 | "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.3.1.tgz", 2460 | "integrity": "sha1-0aitM/qc4OcT1l/dCsi3SNR4yEg=", 2461 | "dev": true, 2462 | "requires": { 2463 | "js-tokens": "3.0.2" 2464 | } 2465 | }, 2466 | "lru-cache": { 2467 | "version": "4.1.2", 2468 | "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.2.tgz", 2469 | "integrity": "sha512-wgeVXhrDwAWnIF/yZARsFnMBtdFXOg1b8RIrhilp+0iDYN4mdQcNZElDZ0e4B64BhaxeQ5zN7PMyvu7we1kPeQ==", 2470 | "dev": true, 2471 | "requires": { 2472 | "pseudomap": "1.0.2", 2473 | "yallist": "2.1.2" 2474 | } 2475 | }, 2476 | "media-typer": { 2477 | "version": "0.3.0", 2478 | "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", 2479 | "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=", 2480 | "dev": true 2481 | }, 2482 | "merge-descriptors": { 2483 | "version": "1.0.1", 2484 | "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", 2485 | "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=", 2486 | "dev": true 2487 | }, 2488 | "methods": { 2489 | "version": "1.1.2", 2490 | "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", 2491 | "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=", 2492 | "dev": true 2493 | }, 2494 | "mime": { 2495 | "version": "1.4.1", 2496 | "resolved": "https://registry.npmjs.org/mime/-/mime-1.4.1.tgz", 2497 | "integrity": "sha512-KI1+qOZu5DcW6wayYHSzR/tXKCDC5Om4s1z2QJjDULzLcmf3DvzS7oluY4HCTrc+9FiKmWUgeNLg7W3uIQvxtQ==", 2498 | "dev": true 2499 | }, 2500 | "mime-db": { 2501 | "version": "1.33.0", 2502 | "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.33.0.tgz", 2503 | "integrity": "sha512-BHJ/EKruNIqJf/QahvxwQZXKygOQ256myeN/Ew+THcAa5q+PjyTTMMeNQC4DZw5AwfvelsUrA6B67NKMqXDbzQ==", 2504 | "dev": true 2505 | }, 2506 | "mime-types": { 2507 | "version": "2.1.18", 2508 | "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.18.tgz", 2509 | "integrity": "sha512-lc/aahn+t4/SWV/qcmumYjymLsWfN3ELhpmVuUFjgsORruuZPVSwAQryq+HHGvO/SI2KVX26bx+En+zhM8g8hQ==", 2510 | "dev": true, 2511 | "requires": { 2512 | "mime-db": "1.33.0" 2513 | } 2514 | }, 2515 | "mimic-fn": { 2516 | "version": "1.2.0", 2517 | "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz", 2518 | "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==", 2519 | "dev": true 2520 | }, 2521 | "minimatch": { 2522 | "version": "3.0.4", 2523 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", 2524 | "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", 2525 | "dev": true, 2526 | "requires": { 2527 | "brace-expansion": "1.1.11" 2528 | } 2529 | }, 2530 | "minimist": { 2531 | "version": "0.0.8", 2532 | "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", 2533 | "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", 2534 | "dev": true 2535 | }, 2536 | "mixin-object": { 2537 | "version": "3.0.0", 2538 | "resolved": "https://registry.npmjs.org/mixin-object/-/mixin-object-3.0.0.tgz", 2539 | "integrity": "sha512-RsUqTd3DyF9+UPqhLzJIWwGm4ZGIPYOu6WcQhQuBqqVBGhc6LOC8LrFk9KD7PvVwmqri45IJT88WLrNNrMWjxg==", 2540 | "dev": true, 2541 | "requires": { 2542 | "for-in": "1.0.2", 2543 | "is-extendable": "1.0.1" 2544 | } 2545 | }, 2546 | "mkdirp": { 2547 | "version": "0.5.1", 2548 | "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", 2549 | "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", 2550 | "dev": true, 2551 | "requires": { 2552 | "minimist": "0.0.8" 2553 | } 2554 | }, 2555 | "mocha": { 2556 | "version": "5.1.0", 2557 | "resolved": "https://registry.npmjs.org/mocha/-/mocha-5.1.0.tgz", 2558 | "integrity": "sha512-d6RWgYPILd+AoWVOxiD0UwUqRicnE1inTxMr40CXOgqYve1MvnKntoLAtLIcxjEeVjEoYYTe5QAq3mUc6/ySjQ==", 2559 | "dev": true, 2560 | "requires": { 2561 | "browser-stdout": "1.3.1", 2562 | "commander": "2.11.0", 2563 | "debug": "3.1.0", 2564 | "diff": "3.5.0", 2565 | "escape-string-regexp": "1.0.5", 2566 | "glob": "7.1.2", 2567 | "growl": "1.10.3", 2568 | "he": "1.1.1", 2569 | "minimatch": "3.0.4", 2570 | "mkdirp": "0.5.1", 2571 | "supports-color": "4.4.0" 2572 | }, 2573 | "dependencies": { 2574 | "has-flag": { 2575 | "version": "2.0.0", 2576 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-2.0.0.tgz", 2577 | "integrity": "sha1-6CB68cx7MNRGzHC3NLXovhj4jVE=", 2578 | "dev": true 2579 | }, 2580 | "supports-color": { 2581 | "version": "4.4.0", 2582 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.4.0.tgz", 2583 | "integrity": "sha512-rKC3+DyXWgK0ZLKwmRsrkyHVZAjNkfzeehuFWdGGcqGDTZFH73+RH6S/RDAAxl9GusSjZSUWYLmT9N5pzXFOXQ==", 2584 | "dev": true, 2585 | "requires": { 2586 | "has-flag": "2.0.0" 2587 | } 2588 | } 2589 | } 2590 | }, 2591 | "moment": { 2592 | "version": "2.22.1", 2593 | "resolved": "https://registry.npmjs.org/moment/-/moment-2.22.1.tgz", 2594 | "integrity": "sha512-shJkRTSebXvsVqk56I+lkb2latjBs8I+pc2TzWc545y2iFnSjm7Wg0QMh+ZWcdSLQyGEau5jI8ocnmkyTgr9YQ==", 2595 | "dev": true 2596 | }, 2597 | "ms": { 2598 | "version": "2.0.0", 2599 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", 2600 | "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" 2601 | }, 2602 | "mute-stream": { 2603 | "version": "0.0.7", 2604 | "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.7.tgz", 2605 | "integrity": "sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s=", 2606 | "dev": true 2607 | }, 2608 | "natural-compare": { 2609 | "version": "1.4.0", 2610 | "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", 2611 | "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", 2612 | "dev": true 2613 | }, 2614 | "negotiator": { 2615 | "version": "0.6.1", 2616 | "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.1.tgz", 2617 | "integrity": "sha1-KzJxhOiZIQEXeyhWP7XnECrNDKk=", 2618 | "dev": true 2619 | }, 2620 | "nise": { 2621 | "version": "1.3.2", 2622 | "resolved": "https://registry.npmjs.org/nise/-/nise-1.3.2.tgz", 2623 | "integrity": "sha512-KPKb+wvETBiwb4eTwtR/OsA2+iijXP+VnlSFYJo3EHjm2yjek1NWxHOUQat3i7xNLm1Bm18UA5j5Wor0yO2GtA==", 2624 | "dev": true, 2625 | "requires": { 2626 | "@sinonjs/formatio": "2.0.0", 2627 | "just-extend": "1.1.27", 2628 | "lolex": "2.3.2", 2629 | "path-to-regexp": "1.7.0", 2630 | "text-encoding": "0.6.4" 2631 | }, 2632 | "dependencies": { 2633 | "isarray": { 2634 | "version": "0.0.1", 2635 | "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", 2636 | "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", 2637 | "dev": true 2638 | }, 2639 | "path-to-regexp": { 2640 | "version": "1.7.0", 2641 | "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.7.0.tgz", 2642 | "integrity": "sha1-Wf3g9DW62suhA6hOnTvGTpa5k30=", 2643 | "dev": true, 2644 | "requires": { 2645 | "isarray": "0.0.1" 2646 | } 2647 | } 2648 | } 2649 | }, 2650 | "node-fetch": { 2651 | "version": "1.7.3", 2652 | "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-1.7.3.tgz", 2653 | "integrity": "sha512-NhZ4CsKx7cYm2vSrBAr2PvFOe6sWDf0UYLRqA6svUYg7+/TSfVAu49jYC4BvQ4Sms9SZgdqGBgroqfDhJdTyKQ==", 2654 | "dev": true, 2655 | "requires": { 2656 | "encoding": "0.1.12", 2657 | "is-stream": "1.1.0" 2658 | } 2659 | }, 2660 | "nopt": { 2661 | "version": "3.0.6", 2662 | "resolved": "https://registry.npmjs.org/nopt/-/nopt-3.0.6.tgz", 2663 | "integrity": "sha1-xkZdvwirzU2zWTF/eaxopkayj/k=", 2664 | "dev": true, 2665 | "requires": { 2666 | "abbrev": "1.0.9" 2667 | } 2668 | }, 2669 | "normalize-package-data": { 2670 | "version": "2.4.0", 2671 | "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.4.0.tgz", 2672 | "integrity": "sha512-9jjUFbTPfEy3R/ad/2oNbKtW9Hgovl5O1FvFWKkKblNXoN/Oou6+9+KKohPK13Yc3/TyunyWhJp6gvRNR/PPAw==", 2673 | "dev": true, 2674 | "requires": { 2675 | "hosted-git-info": "2.6.0", 2676 | "is-builtin-module": "1.0.0", 2677 | "semver": "5.5.0", 2678 | "validate-npm-package-license": "3.0.3" 2679 | } 2680 | }, 2681 | "number-is-nan": { 2682 | "version": "1.0.1", 2683 | "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", 2684 | "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", 2685 | "dev": true 2686 | }, 2687 | "object-assign": { 2688 | "version": "4.1.1", 2689 | "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", 2690 | "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", 2691 | "dev": true 2692 | }, 2693 | "object-component": { 2694 | "version": "0.0.3", 2695 | "resolved": "https://registry.npmjs.org/object-component/-/object-component-0.0.3.tgz", 2696 | "integrity": "sha1-8MaapQ78lbhmwYb0AKM3acsvEpE=", 2697 | "dev": true 2698 | }, 2699 | "object-keys": { 2700 | "version": "1.0.11", 2701 | "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.0.11.tgz", 2702 | "integrity": "sha1-xUYBd4rVYPEULODgG8yotW0TQm0=", 2703 | "dev": true 2704 | }, 2705 | "on-finished": { 2706 | "version": "2.3.0", 2707 | "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", 2708 | "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", 2709 | "dev": true, 2710 | "requires": { 2711 | "ee-first": "1.1.1" 2712 | } 2713 | }, 2714 | "once": { 2715 | "version": "1.4.0", 2716 | "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", 2717 | "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", 2718 | "dev": true, 2719 | "requires": { 2720 | "wrappy": "1.0.2" 2721 | } 2722 | }, 2723 | "onetime": { 2724 | "version": "2.0.1", 2725 | "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz", 2726 | "integrity": "sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ=", 2727 | "dev": true, 2728 | "requires": { 2729 | "mimic-fn": "1.2.0" 2730 | } 2731 | }, 2732 | "optimist": { 2733 | "version": "0.6.1", 2734 | "resolved": "https://registry.npmjs.org/optimist/-/optimist-0.6.1.tgz", 2735 | "integrity": "sha1-2j6nRob6IaGaERwybpDrFaAZZoY=", 2736 | "dev": true, 2737 | "requires": { 2738 | "minimist": "0.0.8", 2739 | "wordwrap": "0.0.3" 2740 | }, 2741 | "dependencies": { 2742 | "wordwrap": { 2743 | "version": "0.0.3", 2744 | "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.3.tgz", 2745 | "integrity": "sha1-o9XabNXAvAAI03I0u68b7WMFkQc=", 2746 | "dev": true 2747 | } 2748 | } 2749 | }, 2750 | "optionator": { 2751 | "version": "0.8.2", 2752 | "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.2.tgz", 2753 | "integrity": "sha1-NkxeQJ0/TWMB1sC0wFu6UBgK62Q=", 2754 | "dev": true, 2755 | "requires": { 2756 | "deep-is": "0.1.3", 2757 | "fast-levenshtein": "2.0.6", 2758 | "levn": "0.3.0", 2759 | "prelude-ls": "1.1.2", 2760 | "type-check": "0.3.2", 2761 | "wordwrap": "1.0.0" 2762 | } 2763 | }, 2764 | "os-tmpdir": { 2765 | "version": "1.0.2", 2766 | "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", 2767 | "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", 2768 | "dev": true 2769 | }, 2770 | "p-limit": { 2771 | "version": "1.2.0", 2772 | "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.2.0.tgz", 2773 | "integrity": "sha512-Y/OtIaXtUPr4/YpMv1pCL5L5ed0rumAaAeBSj12F+bSlMdys7i8oQF/GUJmfpTS/QoaRrS/k6pma29haJpsMng==", 2774 | "dev": true, 2775 | "requires": { 2776 | "p-try": "1.0.0" 2777 | } 2778 | }, 2779 | "p-locate": { 2780 | "version": "2.0.0", 2781 | "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", 2782 | "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", 2783 | "dev": true, 2784 | "requires": { 2785 | "p-limit": "1.2.0" 2786 | } 2787 | }, 2788 | "p-try": { 2789 | "version": "1.0.0", 2790 | "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", 2791 | "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", 2792 | "dev": true 2793 | }, 2794 | "parse-json": { 2795 | "version": "2.2.0", 2796 | "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", 2797 | "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", 2798 | "dev": true, 2799 | "requires": { 2800 | "error-ex": "1.3.1" 2801 | } 2802 | }, 2803 | "parseqs": { 2804 | "version": "0.0.5", 2805 | "resolved": "https://registry.npmjs.org/parseqs/-/parseqs-0.0.5.tgz", 2806 | "integrity": "sha1-1SCKNzjkZ2bikbouoXNoSSGouJ0=", 2807 | "dev": true, 2808 | "requires": { 2809 | "better-assert": "1.0.2" 2810 | } 2811 | }, 2812 | "parseuri": { 2813 | "version": "0.0.5", 2814 | "resolved": "https://registry.npmjs.org/parseuri/-/parseuri-0.0.5.tgz", 2815 | "integrity": "sha1-gCBKUNTbt3m/3G6+J3jZDkvOMgo=", 2816 | "dev": true, 2817 | "requires": { 2818 | "better-assert": "1.0.2" 2819 | } 2820 | }, 2821 | "parseurl": { 2822 | "version": "1.3.2", 2823 | "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.2.tgz", 2824 | "integrity": "sha1-/CidTtiZMRlGDBViUyYs3I3mW/M=", 2825 | "dev": true 2826 | }, 2827 | "passport": { 2828 | "version": "0.4.0", 2829 | "resolved": "https://registry.npmjs.org/passport/-/passport-0.4.0.tgz", 2830 | "integrity": "sha1-xQlWkTR71a07XhgCOMORTRbwWBE=", 2831 | "dev": true, 2832 | "requires": { 2833 | "passport-strategy": "1.0.0", 2834 | "pause": "0.0.1" 2835 | } 2836 | }, 2837 | "passport-jwt": { 2838 | "version": "3.0.1", 2839 | "resolved": "https://registry.npmjs.org/passport-jwt/-/passport-jwt-3.0.1.tgz", 2840 | "integrity": "sha1-5Pcnba2L0lHUPG/DiIMTC5YycvY=", 2841 | "dev": true, 2842 | "requires": { 2843 | "jsonwebtoken": "7.4.3", 2844 | "passport-strategy": "1.0.0" 2845 | }, 2846 | "dependencies": { 2847 | "jsonwebtoken": { 2848 | "version": "7.4.3", 2849 | "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-7.4.3.tgz", 2850 | "integrity": "sha1-d/UCHeBYtgWheD+hKD6ZgS5kVjg=", 2851 | "dev": true, 2852 | "requires": { 2853 | "joi": "6.10.1", 2854 | "jws": "3.1.4", 2855 | "lodash.once": "4.1.1", 2856 | "ms": "2.0.0", 2857 | "xtend": "4.0.1" 2858 | } 2859 | } 2860 | } 2861 | }, 2862 | "passport-local": { 2863 | "version": "1.0.0", 2864 | "resolved": "https://registry.npmjs.org/passport-local/-/passport-local-1.0.0.tgz", 2865 | "integrity": "sha1-H+YyaMkudWBmJkN+O5BmYsFbpu4=", 2866 | "requires": { 2867 | "passport-strategy": "1.0.0" 2868 | } 2869 | }, 2870 | "passport-strategy": { 2871 | "version": "1.0.0", 2872 | "resolved": "https://registry.npmjs.org/passport-strategy/-/passport-strategy-1.0.0.tgz", 2873 | "integrity": "sha1-tVOaqPwiWj0a0XlHbd8ja0QPUuQ=" 2874 | }, 2875 | "path-exists": { 2876 | "version": "2.1.0", 2877 | "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", 2878 | "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", 2879 | "dev": true, 2880 | "requires": { 2881 | "pinkie-promise": "2.0.1" 2882 | } 2883 | }, 2884 | "path-is-absolute": { 2885 | "version": "1.0.1", 2886 | "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", 2887 | "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", 2888 | "dev": true 2889 | }, 2890 | "path-is-inside": { 2891 | "version": "1.0.2", 2892 | "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz", 2893 | "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=", 2894 | "dev": true 2895 | }, 2896 | "path-parse": { 2897 | "version": "1.0.5", 2898 | "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.5.tgz", 2899 | "integrity": "sha1-PBrfhx6pzWyUMbbqK9dKD/BVxME=", 2900 | "dev": true 2901 | }, 2902 | "path-to-regexp": { 2903 | "version": "0.1.7", 2904 | "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", 2905 | "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=", 2906 | "dev": true 2907 | }, 2908 | "path-type": { 2909 | "version": "2.0.0", 2910 | "resolved": "https://registry.npmjs.org/path-type/-/path-type-2.0.0.tgz", 2911 | "integrity": "sha1-8BLMuEFbcJb8LaoQVMPXI4lZTHM=", 2912 | "dev": true, 2913 | "requires": { 2914 | "pify": "2.3.0" 2915 | } 2916 | }, 2917 | "pathval": { 2918 | "version": "1.1.0", 2919 | "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.0.tgz", 2920 | "integrity": "sha1-uULm1L3mUwBe9rcTYd74cn0GReA=", 2921 | "dev": true 2922 | }, 2923 | "pause": { 2924 | "version": "0.0.1", 2925 | "resolved": "https://registry.npmjs.org/pause/-/pause-0.0.1.tgz", 2926 | "integrity": "sha1-HUCLP9t2kjuVQ9lvtMnf1TXZy10=", 2927 | "dev": true 2928 | }, 2929 | "pify": { 2930 | "version": "2.3.0", 2931 | "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", 2932 | "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", 2933 | "dev": true 2934 | }, 2935 | "pinkie": { 2936 | "version": "2.0.4", 2937 | "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", 2938 | "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=", 2939 | "dev": true 2940 | }, 2941 | "pinkie-promise": { 2942 | "version": "2.0.1", 2943 | "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", 2944 | "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", 2945 | "dev": true, 2946 | "requires": { 2947 | "pinkie": "2.0.4" 2948 | } 2949 | }, 2950 | "pkg-conf": { 2951 | "version": "2.1.0", 2952 | "resolved": "https://registry.npmjs.org/pkg-conf/-/pkg-conf-2.1.0.tgz", 2953 | "integrity": "sha1-ISZRTKbyq/69FoWW3xi6V4Z/AFg=", 2954 | "dev": true, 2955 | "requires": { 2956 | "find-up": "2.1.0", 2957 | "load-json-file": "4.0.0" 2958 | }, 2959 | "dependencies": { 2960 | "find-up": { 2961 | "version": "2.1.0", 2962 | "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", 2963 | "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", 2964 | "dev": true, 2965 | "requires": { 2966 | "locate-path": "2.0.0" 2967 | } 2968 | }, 2969 | "load-json-file": { 2970 | "version": "4.0.0", 2971 | "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz", 2972 | "integrity": "sha1-L19Fq5HjMhYjT9U62rZo607AmTs=", 2973 | "dev": true, 2974 | "requires": { 2975 | "graceful-fs": "4.1.11", 2976 | "parse-json": "4.0.0", 2977 | "pify": "3.0.0", 2978 | "strip-bom": "3.0.0" 2979 | } 2980 | }, 2981 | "parse-json": { 2982 | "version": "4.0.0", 2983 | "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", 2984 | "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", 2985 | "dev": true, 2986 | "requires": { 2987 | "error-ex": "1.3.1", 2988 | "json-parse-better-errors": "1.0.2" 2989 | } 2990 | }, 2991 | "pify": { 2992 | "version": "3.0.0", 2993 | "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", 2994 | "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", 2995 | "dev": true 2996 | }, 2997 | "strip-bom": { 2998 | "version": "3.0.0", 2999 | "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", 3000 | "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", 3001 | "dev": true 3002 | } 3003 | } 3004 | }, 3005 | "pkg-config": { 3006 | "version": "1.1.1", 3007 | "resolved": "https://registry.npmjs.org/pkg-config/-/pkg-config-1.1.1.tgz", 3008 | "integrity": "sha1-VX7yLXPaPIg3EHdmxS6tq94pj+Q=", 3009 | "dev": true, 3010 | "requires": { 3011 | "debug-log": "1.0.1", 3012 | "find-root": "1.1.0", 3013 | "xtend": "4.0.1" 3014 | } 3015 | }, 3016 | "pkg-dir": { 3017 | "version": "1.0.0", 3018 | "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-1.0.0.tgz", 3019 | "integrity": "sha1-ektQio1bstYp1EcFb/TpyTFM89Q=", 3020 | "dev": true, 3021 | "requires": { 3022 | "find-up": "1.1.2" 3023 | } 3024 | }, 3025 | "pluralize": { 3026 | "version": "7.0.0", 3027 | "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-7.0.0.tgz", 3028 | "integrity": "sha512-ARhBOdzS3e41FbkW/XWrTEtukqqLoK5+Z/4UeDaLuSW+39JPeFgs4gCGqsrJHVZX0fUrx//4OF0K1CUGwlIFow==", 3029 | "dev": true 3030 | }, 3031 | "prelude-ls": { 3032 | "version": "1.1.2", 3033 | "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", 3034 | "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=", 3035 | "dev": true 3036 | }, 3037 | "process-nextick-args": { 3038 | "version": "2.0.0", 3039 | "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz", 3040 | "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==", 3041 | "dev": true 3042 | }, 3043 | "progress": { 3044 | "version": "2.0.0", 3045 | "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.0.tgz", 3046 | "integrity": "sha1-ihvjZr+Pwj2yvSPxDG/pILQ4nR8=", 3047 | "dev": true 3048 | }, 3049 | "promise": { 3050 | "version": "7.3.1", 3051 | "resolved": "https://registry.npmjs.org/promise/-/promise-7.3.1.tgz", 3052 | "integrity": "sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg==", 3053 | "dev": true, 3054 | "requires": { 3055 | "asap": "2.0.6" 3056 | } 3057 | }, 3058 | "prop-types": { 3059 | "version": "15.6.1", 3060 | "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.6.1.tgz", 3061 | "integrity": "sha512-4ec7bY1Y66LymSUOH/zARVYObB23AT2h8cf6e/O6ZALB/N0sqZFEx7rq6EYPX2MkOdKORuooI/H5k9TlR4q7kQ==", 3062 | "dev": true, 3063 | "requires": { 3064 | "fbjs": "0.8.16", 3065 | "loose-envify": "1.3.1", 3066 | "object-assign": "4.1.1" 3067 | } 3068 | }, 3069 | "proxy-addr": { 3070 | "version": "2.0.3", 3071 | "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.3.tgz", 3072 | "integrity": "sha512-jQTChiCJteusULxjBp8+jftSQE5Obdl3k4cnmLA6WXtK6XFuWRnvVL7aCiBqaLPM8c4ph0S4tKna8XvmIwEnXQ==", 3073 | "dev": true, 3074 | "requires": { 3075 | "forwarded": "0.1.2", 3076 | "ipaddr.js": "1.6.0" 3077 | } 3078 | }, 3079 | "pseudomap": { 3080 | "version": "1.0.2", 3081 | "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", 3082 | "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=", 3083 | "dev": true 3084 | }, 3085 | "qs": { 3086 | "version": "6.5.1", 3087 | "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.1.tgz", 3088 | "integrity": "sha512-eRzhrN1WSINYCDCbrz796z37LOe3m5tmW7RQf6oBntukAG1nmovJvhnwHHRMAfeoItc1m2Hk02WER2aQ/iqs+A==", 3089 | "dev": true 3090 | }, 3091 | "radix-router": { 3092 | "version": "3.0.1", 3093 | "resolved": "https://registry.npmjs.org/radix-router/-/radix-router-3.0.1.tgz", 3094 | "integrity": "sha512-jpHXHgP+ZmVzEfmZ7WVRSvc/EqMoAqYuMtBsHd9s47Hs9Iy8FDJhkweMrDH0wmdxanLzVIWhq0UpomLXNpW8tg==", 3095 | "dev": true 3096 | }, 3097 | "range-parser": { 3098 | "version": "1.2.0", 3099 | "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.0.tgz", 3100 | "integrity": "sha1-9JvmtIeJTdxA3MlKMi9hEJLgDV4=", 3101 | "dev": true 3102 | }, 3103 | "raw-body": { 3104 | "version": "2.3.2", 3105 | "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.3.2.tgz", 3106 | "integrity": "sha1-vNYMd9Prk83gBQKVw/N5OJvIj4k=", 3107 | "dev": true, 3108 | "requires": { 3109 | "bytes": "3.0.0", 3110 | "http-errors": "1.6.2", 3111 | "iconv-lite": "0.4.19", 3112 | "unpipe": "1.0.0" 3113 | }, 3114 | "dependencies": { 3115 | "depd": { 3116 | "version": "1.1.1", 3117 | "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.1.tgz", 3118 | "integrity": "sha1-V4O04cRZ8G+lyif5kfPQbnoxA1k=", 3119 | "dev": true 3120 | }, 3121 | "http-errors": { 3122 | "version": "1.6.2", 3123 | "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.2.tgz", 3124 | "integrity": "sha1-CgAsyFcHGSp+eUbO7cERVfYOxzY=", 3125 | "dev": true, 3126 | "requires": { 3127 | "depd": "1.1.1", 3128 | "inherits": "2.0.3", 3129 | "setprototypeof": "1.0.3", 3130 | "statuses": "1.4.0" 3131 | } 3132 | }, 3133 | "setprototypeof": { 3134 | "version": "1.0.3", 3135 | "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.0.3.tgz", 3136 | "integrity": "sha1-ZlZ+NwQ+608E2RvWWMDL77VbjgQ=", 3137 | "dev": true 3138 | } 3139 | } 3140 | }, 3141 | "read-pkg": { 3142 | "version": "2.0.0", 3143 | "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-2.0.0.tgz", 3144 | "integrity": "sha1-jvHAYjxqbbDcZxPEv6xGMysjaPg=", 3145 | "dev": true, 3146 | "requires": { 3147 | "load-json-file": "2.0.0", 3148 | "normalize-package-data": "2.4.0", 3149 | "path-type": "2.0.0" 3150 | } 3151 | }, 3152 | "read-pkg-up": { 3153 | "version": "2.0.0", 3154 | "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-2.0.0.tgz", 3155 | "integrity": "sha1-a3KoBImE4MQeeVEP1en6mbO1Sb4=", 3156 | "dev": true, 3157 | "requires": { 3158 | "find-up": "2.1.0", 3159 | "read-pkg": "2.0.0" 3160 | }, 3161 | "dependencies": { 3162 | "find-up": { 3163 | "version": "2.1.0", 3164 | "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", 3165 | "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", 3166 | "dev": true, 3167 | "requires": { 3168 | "locate-path": "2.0.0" 3169 | } 3170 | } 3171 | } 3172 | }, 3173 | "readable-stream": { 3174 | "version": "2.3.6", 3175 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", 3176 | "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", 3177 | "dev": true, 3178 | "requires": { 3179 | "core-util-is": "1.0.2", 3180 | "inherits": "2.0.3", 3181 | "isarray": "1.0.0", 3182 | "process-nextick-args": "2.0.0", 3183 | "safe-buffer": "5.1.1", 3184 | "string_decoder": "1.1.1", 3185 | "util-deprecate": "1.0.2" 3186 | }, 3187 | "dependencies": { 3188 | "isarray": { 3189 | "version": "1.0.0", 3190 | "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", 3191 | "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", 3192 | "dev": true 3193 | } 3194 | } 3195 | }, 3196 | "regenerator-runtime": { 3197 | "version": "0.11.1", 3198 | "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz", 3199 | "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==", 3200 | "dev": true 3201 | }, 3202 | "repeat-string": { 3203 | "version": "1.6.1", 3204 | "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", 3205 | "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=", 3206 | "dev": true 3207 | }, 3208 | "repeating": { 3209 | "version": "2.0.1", 3210 | "resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz", 3211 | "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=", 3212 | "dev": true, 3213 | "requires": { 3214 | "is-finite": "1.0.2" 3215 | } 3216 | }, 3217 | "require-uncached": { 3218 | "version": "1.0.3", 3219 | "resolved": "https://registry.npmjs.org/require-uncached/-/require-uncached-1.0.3.tgz", 3220 | "integrity": "sha1-Tg1W1slmL9MeQwEcS5WqSZVUIdM=", 3221 | "dev": true, 3222 | "requires": { 3223 | "caller-path": "0.1.0", 3224 | "resolve-from": "1.0.1" 3225 | } 3226 | }, 3227 | "resolve": { 3228 | "version": "1.7.1", 3229 | "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.7.1.tgz", 3230 | "integrity": "sha512-c7rwLofp8g1U+h1KNyHL/jicrKg1Ek4q+Lr33AL65uZTinUZHe30D5HlyN5V9NW0JX1D5dXQ4jqW5l7Sy/kGfw==", 3231 | "dev": true, 3232 | "requires": { 3233 | "path-parse": "1.0.5" 3234 | } 3235 | }, 3236 | "resolve-from": { 3237 | "version": "1.0.1", 3238 | "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-1.0.1.tgz", 3239 | "integrity": "sha1-Jsv+k10a7uq7Kbw/5a6wHpPUQiY=", 3240 | "dev": true 3241 | }, 3242 | "restore-cursor": { 3243 | "version": "2.0.0", 3244 | "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz", 3245 | "integrity": "sha1-n37ih/gv0ybU/RYpI9YhKe7g368=", 3246 | "dev": true, 3247 | "requires": { 3248 | "onetime": "2.0.1", 3249 | "signal-exit": "3.0.2" 3250 | } 3251 | }, 3252 | "right-align": { 3253 | "version": "0.1.3", 3254 | "resolved": "https://registry.npmjs.org/right-align/-/right-align-0.1.3.tgz", 3255 | "integrity": "sha1-YTObci/mo1FWiSENJOFMlhSGE+8=", 3256 | "dev": true, 3257 | "optional": true, 3258 | "requires": { 3259 | "align-text": "0.1.4" 3260 | } 3261 | }, 3262 | "rimraf": { 3263 | "version": "2.6.2", 3264 | "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.2.tgz", 3265 | "integrity": "sha512-lreewLK/BlghmxtfH36YYVg1i8IAce4TI7oao75I1g245+6BctqTVQiBP3YUJ9C6DQOXJmkYR9X9fCLtCOJc5w==", 3266 | "dev": true, 3267 | "requires": { 3268 | "glob": "7.1.2" 3269 | } 3270 | }, 3271 | "run-async": { 3272 | "version": "2.3.0", 3273 | "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.3.0.tgz", 3274 | "integrity": "sha1-A3GrSuC91yDUFm19/aZP96RFpsA=", 3275 | "dev": true, 3276 | "requires": { 3277 | "is-promise": "2.1.0" 3278 | } 3279 | }, 3280 | "run-parallel": { 3281 | "version": "1.1.8", 3282 | "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.1.8.tgz", 3283 | "integrity": "sha512-e5t1NVhr5VWmD9V9U4KjjSGkf5w6CcTPgw11A3CfIvkkQxlAKzX3usPUp1NUQTmpOOjU+f9QRICU3tMbKwn9ZQ==", 3284 | "dev": true 3285 | }, 3286 | "rx-lite": { 3287 | "version": "4.0.8", 3288 | "resolved": "https://registry.npmjs.org/rx-lite/-/rx-lite-4.0.8.tgz", 3289 | "integrity": "sha1-Cx4Rr4vESDbwSmQH6S2kJGe3lEQ=", 3290 | "dev": true 3291 | }, 3292 | "rx-lite-aggregates": { 3293 | "version": "4.0.8", 3294 | "resolved": "https://registry.npmjs.org/rx-lite-aggregates/-/rx-lite-aggregates-4.0.8.tgz", 3295 | "integrity": "sha1-dTuHqJoRyVRnxKwWJsTvxOBcZ74=", 3296 | "dev": true, 3297 | "requires": { 3298 | "rx-lite": "4.0.8" 3299 | } 3300 | }, 3301 | "safe-buffer": { 3302 | "version": "5.1.1", 3303 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz", 3304 | "integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg==", 3305 | "dev": true 3306 | }, 3307 | "samsam": { 3308 | "version": "1.3.0", 3309 | "resolved": "https://registry.npmjs.org/samsam/-/samsam-1.3.0.tgz", 3310 | "integrity": "sha512-1HwIYD/8UlOtFS3QO3w7ey+SdSDFE4HRNLZoZRYVQefrOY3l17epswImeB1ijgJFQJodIaHcwkp3r/myBjFVbg==", 3311 | "dev": true 3312 | }, 3313 | "semistandard": { 3314 | "version": "12.0.1", 3315 | "resolved": "https://registry.npmjs.org/semistandard/-/semistandard-12.0.1.tgz", 3316 | "integrity": "sha512-+FBRXBCi8GC1Nivc4ruw2KXER31bE1lrNyESo7prn2Sv9I9+H/Iqpt0NOtlV/GUxq34AgJwJViBUpA3/PUGqOw==", 3317 | "dev": true, 3318 | "requires": { 3319 | "eslint": "4.18.2", 3320 | "eslint-config-semistandard": "12.0.1", 3321 | "eslint-config-standard": "11.0.0", 3322 | "eslint-config-standard-jsx": "5.0.0", 3323 | "eslint-plugin-import": "2.8.0", 3324 | "eslint-plugin-node": "6.0.1", 3325 | "eslint-plugin-promise": "3.6.0", 3326 | "eslint-plugin-react": "7.6.1", 3327 | "eslint-plugin-standard": "3.0.1", 3328 | "standard-engine": "8.0.1" 3329 | } 3330 | }, 3331 | "semver": { 3332 | "version": "5.5.0", 3333 | "resolved": "https://registry.npmjs.org/semver/-/semver-5.5.0.tgz", 3334 | "integrity": "sha512-4SJ3dm0WAwWy/NVeioZh5AntkdJoWKxHxcmyP622fOkgHa4z3R0TdBJICINyaSDE6uNwVc8gZr+ZinwZAH4xIA==", 3335 | "dev": true 3336 | }, 3337 | "send": { 3338 | "version": "0.16.2", 3339 | "resolved": "https://registry.npmjs.org/send/-/send-0.16.2.tgz", 3340 | "integrity": "sha512-E64YFPUssFHEFBvpbbjr44NCLtI1AohxQ8ZSiJjQLskAdKuriYEP6VyGEsRDH8ScozGpkaX1BGvhanqCwkcEZw==", 3341 | "dev": true, 3342 | "requires": { 3343 | "debug": "2.6.9", 3344 | "depd": "1.1.2", 3345 | "destroy": "1.0.4", 3346 | "encodeurl": "1.0.2", 3347 | "escape-html": "1.0.3", 3348 | "etag": "1.8.1", 3349 | "fresh": "0.5.2", 3350 | "http-errors": "1.6.3", 3351 | "mime": "1.4.1", 3352 | "ms": "2.0.0", 3353 | "on-finished": "2.3.0", 3354 | "range-parser": "1.2.0", 3355 | "statuses": "1.4.0" 3356 | }, 3357 | "dependencies": { 3358 | "debug": { 3359 | "version": "2.6.9", 3360 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", 3361 | "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", 3362 | "dev": true, 3363 | "requires": { 3364 | "ms": "2.0.0" 3365 | } 3366 | } 3367 | } 3368 | }, 3369 | "serve-static": { 3370 | "version": "1.13.2", 3371 | "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.13.2.tgz", 3372 | "integrity": "sha512-p/tdJrO4U387R9oMjb1oj7qSMaMfmOyd4j9hOFoxZe2baQszgHcSWjuya/CiT5kgZZKRudHNOA0pYXOl8rQ5nw==", 3373 | "dev": true, 3374 | "requires": { 3375 | "encodeurl": "1.0.2", 3376 | "escape-html": "1.0.3", 3377 | "parseurl": "1.3.2", 3378 | "send": "0.16.2" 3379 | } 3380 | }, 3381 | "setimmediate": { 3382 | "version": "1.0.5", 3383 | "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", 3384 | "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=", 3385 | "dev": true 3386 | }, 3387 | "setprototypeof": { 3388 | "version": "1.1.0", 3389 | "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", 3390 | "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==", 3391 | "dev": true 3392 | }, 3393 | "shallow-clone": { 3394 | "version": "2.0.2", 3395 | "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-2.0.2.tgz", 3396 | "integrity": "sha512-2o81AG/RpLTAG/ZXQekPtH/6yTffzKlJ+i6UhtVTtnP6zWQaNo9vt6LI28bhZLSesB12VQSfJYtXopTogVBveg==", 3397 | "dev": true, 3398 | "requires": { 3399 | "is-extendable": "1.0.1", 3400 | "kind-of": "6.0.2", 3401 | "mixin-object": "3.0.0" 3402 | } 3403 | }, 3404 | "shebang-command": { 3405 | "version": "1.2.0", 3406 | "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", 3407 | "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", 3408 | "dev": true, 3409 | "requires": { 3410 | "shebang-regex": "1.0.0" 3411 | } 3412 | }, 3413 | "shebang-regex": { 3414 | "version": "1.0.0", 3415 | "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", 3416 | "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", 3417 | "dev": true 3418 | }, 3419 | "sift": { 3420 | "version": "5.1.0", 3421 | "resolved": "https://registry.npmjs.org/sift/-/sift-5.1.0.tgz", 3422 | "integrity": "sha1-G78t+w63HlbEzH+1Z/vRNRtlAV4=", 3423 | "dev": true 3424 | }, 3425 | "signal-exit": { 3426 | "version": "3.0.2", 3427 | "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", 3428 | "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=", 3429 | "dev": true 3430 | }, 3431 | "sinon": { 3432 | "version": "5.0.0", 3433 | "resolved": "https://registry.npmjs.org/sinon/-/sinon-5.0.0.tgz", 3434 | "integrity": "sha512-dMX7ZB2E1iQ5DOEOePoNJQp03uyhdMfb+kLXlNPbquv2FwfezD+0GbbHSgCw4MFhpSSS9NMoYJfOPMjCMJtXWA==", 3435 | "dev": true, 3436 | "requires": { 3437 | "diff": "3.5.0", 3438 | "formatio": "1.2.0", 3439 | "lodash.get": "4.4.2", 3440 | "lolex": "2.3.2", 3441 | "nise": "1.3.2", 3442 | "supports-color": "4.5.0", 3443 | "type-detect": "4.0.8" 3444 | }, 3445 | "dependencies": { 3446 | "has-flag": { 3447 | "version": "2.0.0", 3448 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-2.0.0.tgz", 3449 | "integrity": "sha1-6CB68cx7MNRGzHC3NLXovhj4jVE=", 3450 | "dev": true 3451 | }, 3452 | "supports-color": { 3453 | "version": "4.5.0", 3454 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.5.0.tgz", 3455 | "integrity": "sha1-vnoN5ITexcXN34s9WRJQRJEvY1s=", 3456 | "dev": true, 3457 | "requires": { 3458 | "has-flag": "2.0.0" 3459 | } 3460 | } 3461 | } 3462 | }, 3463 | "sinon-chai": { 3464 | "version": "3.0.0", 3465 | "resolved": "https://registry.npmjs.org/sinon-chai/-/sinon-chai-3.0.0.tgz", 3466 | "integrity": "sha512-+cqeKiuMZjZs800fRf4kjJR/Pp4p7bYY3ciZHClFNS8tSzJoAcWni/ZUZD8TrfZ+oFRyLiKWX3fTClDATGy5vQ==", 3467 | "dev": true 3468 | }, 3469 | "slice-ansi": { 3470 | "version": "1.0.0", 3471 | "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-1.0.0.tgz", 3472 | "integrity": "sha512-POqxBK6Lb3q6s047D/XsDVNPnF9Dl8JSaqe9h9lURl0OdNqy/ujDrOiIHtsqXMGbWWTIomRzAMaTyawAU//Reg==", 3473 | "dev": true, 3474 | "requires": { 3475 | "is-fullwidth-code-point": "2.0.0" 3476 | } 3477 | }, 3478 | "socket.io": { 3479 | "version": "2.1.0", 3480 | "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-2.1.0.tgz", 3481 | "integrity": "sha512-KS+3CNWWNtLbVN5j0/B+1hjxRzey+oTK6ejpAOoxMZis6aXeB8cUtfuvjHl97tuZx+t/qD/VyqFMjuzu2Js6uQ==", 3482 | "dev": true, 3483 | "requires": { 3484 | "debug": "3.1.0", 3485 | "engine.io": "3.2.0", 3486 | "has-binary2": "1.0.2", 3487 | "socket.io-adapter": "1.1.1", 3488 | "socket.io-client": "2.1.0", 3489 | "socket.io-parser": "3.2.0" 3490 | } 3491 | }, 3492 | "socket.io-adapter": { 3493 | "version": "1.1.1", 3494 | "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-1.1.1.tgz", 3495 | "integrity": "sha1-KoBeihTWNyEk3ZFZrUUC+MsH8Gs=", 3496 | "dev": true 3497 | }, 3498 | "socket.io-client": { 3499 | "version": "2.1.0", 3500 | "resolved": "https://registry.npmjs.org/socket.io-client/-/socket.io-client-2.1.0.tgz", 3501 | "integrity": "sha512-TvKPpL0cBON5LduQfR8Rxrr+ktj70bLXGvqHCL3er5avBXruB3gpnbaud5ikFYVfANH1gCABAvo0qN8Axpg2ew==", 3502 | "dev": true, 3503 | "requires": { 3504 | "backo2": "1.0.2", 3505 | "base64-arraybuffer": "0.1.5", 3506 | "component-bind": "1.0.0", 3507 | "component-emitter": "1.2.1", 3508 | "debug": "3.1.0", 3509 | "engine.io-client": "3.2.1", 3510 | "has-binary2": "1.0.2", 3511 | "has-cors": "1.1.0", 3512 | "indexof": "0.0.1", 3513 | "object-component": "0.0.3", 3514 | "parseqs": "0.0.5", 3515 | "parseuri": "0.0.5", 3516 | "socket.io-parser": "3.2.0", 3517 | "to-array": "0.1.4" 3518 | } 3519 | }, 3520 | "socket.io-parser": { 3521 | "version": "3.2.0", 3522 | "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-3.2.0.tgz", 3523 | "integrity": "sha512-FYiBx7rc/KORMJlgsXysflWx/RIvtqZbyGLlHZvjfmPTPeuD/I8MaW7cfFrj5tRltICJdgwflhfZ3NVVbVLFQA==", 3524 | "dev": true, 3525 | "requires": { 3526 | "component-emitter": "1.2.1", 3527 | "debug": "3.1.0", 3528 | "isarray": "2.0.1" 3529 | } 3530 | }, 3531 | "source-map": { 3532 | "version": "0.5.7", 3533 | "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", 3534 | "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", 3535 | "dev": true 3536 | }, 3537 | "spdx-correct": { 3538 | "version": "3.0.0", 3539 | "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.0.0.tgz", 3540 | "integrity": "sha512-N19o9z5cEyc8yQQPukRCZ9EUmb4HUpnrmaL/fxS2pBo2jbfcFRVuFZ/oFC+vZz0MNNk0h80iMn5/S6qGZOL5+g==", 3541 | "dev": true, 3542 | "requires": { 3543 | "spdx-expression-parse": "3.0.0", 3544 | "spdx-license-ids": "3.0.0" 3545 | } 3546 | }, 3547 | "spdx-exceptions": { 3548 | "version": "2.1.0", 3549 | "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.1.0.tgz", 3550 | "integrity": "sha512-4K1NsmrlCU1JJgUrtgEeTVyfx8VaYea9J9LvARxhbHtVtohPs/gFGG5yy49beySjlIMhhXZ4QqujIZEfS4l6Cg==", 3551 | "dev": true 3552 | }, 3553 | "spdx-expression-parse": { 3554 | "version": "3.0.0", 3555 | "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz", 3556 | "integrity": "sha512-Yg6D3XpRD4kkOmTpdgbUiEJFKghJH03fiC1OPll5h/0sO6neh2jqRDVHOQ4o/LMea0tgCkbMgea5ip/e+MkWyg==", 3557 | "dev": true, 3558 | "requires": { 3559 | "spdx-exceptions": "2.1.0", 3560 | "spdx-license-ids": "3.0.0" 3561 | } 3562 | }, 3563 | "spdx-license-ids": { 3564 | "version": "3.0.0", 3565 | "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.0.tgz", 3566 | "integrity": "sha512-2+EPwgbnmOIl8HjGBXXMd9NAu02vLjOO1nWw4kmeRDFyHn+M/ETfHxQUK0oXg8ctgVnl9t3rosNVsZ1jG61nDA==", 3567 | "dev": true 3568 | }, 3569 | "sprintf-js": { 3570 | "version": "1.0.3", 3571 | "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", 3572 | "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", 3573 | "dev": true 3574 | }, 3575 | "standard-engine": { 3576 | "version": "8.0.1", 3577 | "resolved": "https://registry.npmjs.org/standard-engine/-/standard-engine-8.0.1.tgz", 3578 | "integrity": "sha512-LA531C3+nljom/XRvdW/hGPXwmilRkaRkENhO3FAGF1Vtq/WtCXzgmnc5S6vUHHsgv534MRy02C1ikMwZXC+tw==", 3579 | "dev": true, 3580 | "requires": { 3581 | "deglob": "2.1.0", 3582 | "get-stdin": "6.0.0", 3583 | "minimist": "1.2.0", 3584 | "pkg-conf": "2.1.0" 3585 | }, 3586 | "dependencies": { 3587 | "minimist": { 3588 | "version": "1.2.0", 3589 | "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", 3590 | "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", 3591 | "dev": true 3592 | } 3593 | } 3594 | }, 3595 | "statuses": { 3596 | "version": "1.4.0", 3597 | "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.4.0.tgz", 3598 | "integrity": "sha512-zhSCtt8v2NDrRlPQpCNtw/heZLtfUDqxBM1udqikb/Hbk52LK4nQSwr10u77iopCW5LsyHpuXS0GnEc48mLeew==", 3599 | "dev": true 3600 | }, 3601 | "string-width": { 3602 | "version": "2.1.1", 3603 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", 3604 | "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", 3605 | "dev": true, 3606 | "requires": { 3607 | "is-fullwidth-code-point": "2.0.0", 3608 | "strip-ansi": "4.0.0" 3609 | }, 3610 | "dependencies": { 3611 | "ansi-regex": { 3612 | "version": "3.0.0", 3613 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", 3614 | "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", 3615 | "dev": true 3616 | }, 3617 | "strip-ansi": { 3618 | "version": "4.0.0", 3619 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", 3620 | "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", 3621 | "dev": true, 3622 | "requires": { 3623 | "ansi-regex": "3.0.0" 3624 | } 3625 | } 3626 | } 3627 | }, 3628 | "string_decoder": { 3629 | "version": "1.1.1", 3630 | "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", 3631 | "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", 3632 | "dev": true, 3633 | "requires": { 3634 | "safe-buffer": "5.1.1" 3635 | } 3636 | }, 3637 | "strip-ansi": { 3638 | "version": "3.0.1", 3639 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", 3640 | "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", 3641 | "dev": true, 3642 | "requires": { 3643 | "ansi-regex": "2.1.1" 3644 | } 3645 | }, 3646 | "strip-bom": { 3647 | "version": "2.0.0", 3648 | "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", 3649 | "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", 3650 | "dev": true, 3651 | "requires": { 3652 | "is-utf8": "0.2.1" 3653 | } 3654 | }, 3655 | "strip-json-comments": { 3656 | "version": "2.0.1", 3657 | "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", 3658 | "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", 3659 | "dev": true 3660 | }, 3661 | "supports-color": { 3662 | "version": "2.0.0", 3663 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", 3664 | "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", 3665 | "dev": true 3666 | }, 3667 | "table": { 3668 | "version": "4.0.2", 3669 | "resolved": "https://registry.npmjs.org/table/-/table-4.0.2.tgz", 3670 | "integrity": "sha512-UUkEAPdSGxtRpiV9ozJ5cMTtYiqz7Ni1OGqLXRCynrvzdtR1p+cfOWe2RJLwvUG8hNanaSRjecIqwOjqeatDsA==", 3671 | "dev": true, 3672 | "requires": { 3673 | "ajv": "5.5.2", 3674 | "ajv-keywords": "2.1.1", 3675 | "chalk": "2.3.2", 3676 | "lodash": "4.17.5", 3677 | "slice-ansi": "1.0.0", 3678 | "string-width": "2.1.1" 3679 | }, 3680 | "dependencies": { 3681 | "ansi-styles": { 3682 | "version": "3.2.1", 3683 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", 3684 | "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", 3685 | "dev": true, 3686 | "requires": { 3687 | "color-convert": "1.9.1" 3688 | } 3689 | }, 3690 | "chalk": { 3691 | "version": "2.3.2", 3692 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.3.2.tgz", 3693 | "integrity": "sha512-ZM4j2/ld/YZDc3Ma8PgN7gyAk+kHMMMyzLNryCPGhWrsfAuDVeuid5bpRFTDgMH9JBK2lA4dyyAkkZYF/WcqDQ==", 3694 | "dev": true, 3695 | "requires": { 3696 | "ansi-styles": "3.2.1", 3697 | "escape-string-regexp": "1.0.5", 3698 | "supports-color": "5.3.0" 3699 | } 3700 | }, 3701 | "has-flag": { 3702 | "version": "3.0.0", 3703 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", 3704 | "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", 3705 | "dev": true 3706 | }, 3707 | "supports-color": { 3708 | "version": "5.3.0", 3709 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.3.0.tgz", 3710 | "integrity": "sha512-0aP01LLIskjKs3lq52EC0aGBAJhLq7B2Rd8HC/DR/PtNNpcLilNmHC12O+hu0usQpo7wtHNRqtrhBwtDb0+dNg==", 3711 | "dev": true, 3712 | "requires": { 3713 | "has-flag": "3.0.0" 3714 | } 3715 | } 3716 | } 3717 | }, 3718 | "text-encoding": { 3719 | "version": "0.6.4", 3720 | "resolved": "https://registry.npmjs.org/text-encoding/-/text-encoding-0.6.4.tgz", 3721 | "integrity": "sha1-45mpgiV6J22uQou5KEXLcb3CbRk=", 3722 | "dev": true 3723 | }, 3724 | "text-table": { 3725 | "version": "0.2.0", 3726 | "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", 3727 | "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", 3728 | "dev": true 3729 | }, 3730 | "through": { 3731 | "version": "2.3.8", 3732 | "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", 3733 | "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", 3734 | "dev": true 3735 | }, 3736 | "tmp": { 3737 | "version": "0.0.33", 3738 | "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", 3739 | "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", 3740 | "dev": true, 3741 | "requires": { 3742 | "os-tmpdir": "1.0.2" 3743 | } 3744 | }, 3745 | "to-array": { 3746 | "version": "0.1.4", 3747 | "resolved": "https://registry.npmjs.org/to-array/-/to-array-0.1.4.tgz", 3748 | "integrity": "sha1-F+bBH3PdTz10zaek/zI46a2b+JA=", 3749 | "dev": true 3750 | }, 3751 | "to-fast-properties": { 3752 | "version": "1.0.3", 3753 | "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-1.0.3.tgz", 3754 | "integrity": "sha1-uDVx+k2MJbguIxsG46MFXeTKGkc=", 3755 | "dev": true 3756 | }, 3757 | "topo": { 3758 | "version": "1.1.0", 3759 | "resolved": "https://registry.npmjs.org/topo/-/topo-1.1.0.tgz", 3760 | "integrity": "sha1-6ddRYV0buH3IZdsYL6HKCl71NtU=", 3761 | "dev": true, 3762 | "requires": { 3763 | "hoek": "2.16.3" 3764 | } 3765 | }, 3766 | "trim-right": { 3767 | "version": "1.0.1", 3768 | "resolved": "https://registry.npmjs.org/trim-right/-/trim-right-1.0.1.tgz", 3769 | "integrity": "sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM=", 3770 | "dev": true 3771 | }, 3772 | "type-check": { 3773 | "version": "0.3.2", 3774 | "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", 3775 | "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", 3776 | "dev": true, 3777 | "requires": { 3778 | "prelude-ls": "1.1.2" 3779 | } 3780 | }, 3781 | "type-detect": { 3782 | "version": "4.0.8", 3783 | "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", 3784 | "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", 3785 | "dev": true 3786 | }, 3787 | "type-is": { 3788 | "version": "1.6.16", 3789 | "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.16.tgz", 3790 | "integrity": "sha512-HRkVv/5qY2G6I8iab9cI7v1bOIdhm94dVjQCPFElW9W+3GeDOSHmy2EBYe4VTApuzolPcmgFTN3ftVJRKR2J9Q==", 3791 | "dev": true, 3792 | "requires": { 3793 | "media-typer": "0.3.0", 3794 | "mime-types": "2.1.18" 3795 | } 3796 | }, 3797 | "typedarray": { 3798 | "version": "0.0.6", 3799 | "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", 3800 | "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=", 3801 | "dev": true 3802 | }, 3803 | "ua-parser-js": { 3804 | "version": "0.7.17", 3805 | "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-0.7.17.tgz", 3806 | "integrity": "sha512-uRdSdu1oA1rncCQL7sCj8vSyZkgtL7faaw9Tc9rZ3mGgraQ7+Pdx7w5mnOSF3gw9ZNG6oc+KXfkon3bKuROm0g==", 3807 | "dev": true 3808 | }, 3809 | "uberproto": { 3810 | "version": "1.2.0", 3811 | "resolved": "https://registry.npmjs.org/uberproto/-/uberproto-1.2.0.tgz", 3812 | "integrity": "sha1-YdTqsCT5CcTm6lK+hnxIlKS+63Y=", 3813 | "dev": true 3814 | }, 3815 | "uglify-js": { 3816 | "version": "2.8.29", 3817 | "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-2.8.29.tgz", 3818 | "integrity": "sha1-KcVzMUgFe7Th913zW3qcty5qWd0=", 3819 | "dev": true, 3820 | "optional": true, 3821 | "requires": { 3822 | "source-map": "0.5.7", 3823 | "uglify-to-browserify": "1.0.2", 3824 | "yargs": "3.10.0" 3825 | } 3826 | }, 3827 | "uglify-to-browserify": { 3828 | "version": "1.0.2", 3829 | "resolved": "https://registry.npmjs.org/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz", 3830 | "integrity": "sha1-bgkk1r2mta/jSeOabWMoUKD4grc=", 3831 | "dev": true, 3832 | "optional": true 3833 | }, 3834 | "ultron": { 3835 | "version": "1.1.1", 3836 | "resolved": "https://registry.npmjs.org/ultron/-/ultron-1.1.1.tgz", 3837 | "integrity": "sha512-UIEXBNeYmKptWH6z8ZnqTeS8fV74zG0/eRU9VGkpzz+LIJNs8W/zM/L+7ctCkRrgbNnnR0xxw4bKOr0cW0N0Og==", 3838 | "dev": true 3839 | }, 3840 | "uniq": { 3841 | "version": "1.0.1", 3842 | "resolved": "https://registry.npmjs.org/uniq/-/uniq-1.0.1.tgz", 3843 | "integrity": "sha1-sxxa6CVIRKOoKBVBzisEuGWnNP8=", 3844 | "dev": true 3845 | }, 3846 | "unpipe": { 3847 | "version": "1.0.0", 3848 | "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", 3849 | "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=", 3850 | "dev": true 3851 | }, 3852 | "url-pattern": { 3853 | "version": "1.0.3", 3854 | "resolved": "https://registry.npmjs.org/url-pattern/-/url-pattern-1.0.3.tgz", 3855 | "integrity": "sha1-BAkpJHGyTyPFDWWkeTF5PStaz8E=", 3856 | "dev": true 3857 | }, 3858 | "util-deprecate": { 3859 | "version": "1.0.2", 3860 | "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", 3861 | "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", 3862 | "dev": true 3863 | }, 3864 | "utils-merge": { 3865 | "version": "1.0.1", 3866 | "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", 3867 | "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=", 3868 | "dev": true 3869 | }, 3870 | "uuid": { 3871 | "version": "3.2.1", 3872 | "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.2.1.tgz", 3873 | "integrity": "sha512-jZnMwlb9Iku/O3smGWvZhauCf6cvvpKi4BKRiliS3cxnI+Gz9j5MEpTz2UFuXiKPJocb7gnsLHwiS05ige5BEA==", 3874 | "dev": true 3875 | }, 3876 | "validate-npm-package-license": { 3877 | "version": "3.0.3", 3878 | "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.3.tgz", 3879 | "integrity": "sha512-63ZOUnL4SIXj4L0NixR3L1lcjO38crAbgrTpl28t8jjrfuiOBL5Iygm+60qPs/KsZGzPNg6Smnc/oY16QTjF0g==", 3880 | "dev": true, 3881 | "requires": { 3882 | "spdx-correct": "3.0.0", 3883 | "spdx-expression-parse": "3.0.0" 3884 | } 3885 | }, 3886 | "vary": { 3887 | "version": "1.1.2", 3888 | "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", 3889 | "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=", 3890 | "dev": true 3891 | }, 3892 | "whatwg-fetch": { 3893 | "version": "2.0.4", 3894 | "resolved": "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-2.0.4.tgz", 3895 | "integrity": "sha512-dcQ1GWpOD/eEQ97k66aiEVpNnapVj90/+R+SXTPYGHpYBBypfKJEQjLrvMZ7YXbKm21gXd4NcuxUTjiv1YtLng==", 3896 | "dev": true 3897 | }, 3898 | "which": { 3899 | "version": "1.3.0", 3900 | "resolved": "https://registry.npmjs.org/which/-/which-1.3.0.tgz", 3901 | "integrity": "sha512-xcJpopdamTuY5duC/KnTTNBraPK54YwpenP4lzxU8H91GudWpFv38u0CKjclE1Wi2EH2EDz5LRcHcKbCIzqGyg==", 3902 | "dev": true, 3903 | "requires": { 3904 | "isexe": "2.0.0" 3905 | } 3906 | }, 3907 | "window-size": { 3908 | "version": "0.1.0", 3909 | "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.1.0.tgz", 3910 | "integrity": "sha1-VDjNLqk7IC76Ohn+iIeu58lPnJ0=", 3911 | "dev": true, 3912 | "optional": true 3913 | }, 3914 | "wordwrap": { 3915 | "version": "1.0.0", 3916 | "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", 3917 | "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=", 3918 | "dev": true 3919 | }, 3920 | "wrappy": { 3921 | "version": "1.0.2", 3922 | "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", 3923 | "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", 3924 | "dev": true 3925 | }, 3926 | "write": { 3927 | "version": "0.2.1", 3928 | "resolved": "https://registry.npmjs.org/write/-/write-0.2.1.tgz", 3929 | "integrity": "sha1-X8A4KOJkzqP+kUVUdvejxWbLB1c=", 3930 | "dev": true, 3931 | "requires": { 3932 | "mkdirp": "0.5.1" 3933 | } 3934 | }, 3935 | "ws": { 3936 | "version": "3.3.3", 3937 | "resolved": "https://registry.npmjs.org/ws/-/ws-3.3.3.tgz", 3938 | "integrity": "sha512-nnWLa/NwZSt4KQJu51MYlCcSQ5g7INpOrOMt4XV8j4dqTXdmlUmSHQ8/oLC069ckre0fRsgfvsKwbTdtKLCDkA==", 3939 | "dev": true, 3940 | "requires": { 3941 | "async-limiter": "1.0.0", 3942 | "safe-buffer": "5.1.1", 3943 | "ultron": "1.1.1" 3944 | } 3945 | }, 3946 | "xmlhttprequest-ssl": { 3947 | "version": "1.5.5", 3948 | "resolved": "https://registry.npmjs.org/xmlhttprequest-ssl/-/xmlhttprequest-ssl-1.5.5.tgz", 3949 | "integrity": "sha1-wodrBhaKrcQOV9l+gRkayPQ5iz4=", 3950 | "dev": true 3951 | }, 3952 | "xtend": { 3953 | "version": "4.0.1", 3954 | "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz", 3955 | "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=", 3956 | "dev": true 3957 | }, 3958 | "yallist": { 3959 | "version": "2.1.2", 3960 | "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", 3961 | "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=", 3962 | "dev": true 3963 | }, 3964 | "yargs": { 3965 | "version": "3.10.0", 3966 | "resolved": "https://registry.npmjs.org/yargs/-/yargs-3.10.0.tgz", 3967 | "integrity": "sha1-9+572FfdfB0tOMDnTvvWgdFDH9E=", 3968 | "dev": true, 3969 | "optional": true, 3970 | "requires": { 3971 | "camelcase": "1.2.1", 3972 | "cliui": "2.1.0", 3973 | "decamelize": "1.2.0", 3974 | "window-size": "0.1.0" 3975 | } 3976 | }, 3977 | "yeast": { 3978 | "version": "0.1.2", 3979 | "resolved": "https://registry.npmjs.org/yeast/-/yeast-0.1.2.tgz", 3980 | "integrity": "sha1-AI4G2AlDIMNy28L47XagymyKxBk=", 3981 | "dev": true 3982 | } 3983 | } 3984 | } 3985 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "@feathersjs/authentication-local", 3 | "description": "Local authentication strategy for @feathers/authentication", 4 | "version": "1.2.1", 5 | "homepage": "https://github.com/feathersjs/authentication-local", 6 | "main": "lib/", 7 | "keywords": [ 8 | "feathers", 9 | "feathers-plugin" 10 | ], 11 | "license": "MIT", 12 | "repository": { 13 | "type": "git", 14 | "url": "git://github.com/feathersjs/authentication-local.git" 15 | }, 16 | "author": { 17 | "name": "Feathers contributors", 18 | "email": "hello@feathersjs.com", 19 | "url": "https://feathersjs.com" 20 | }, 21 | "contributors": [], 22 | "bugs": { 23 | "url": "https://github.com/feathersjs/authentication-local/issues" 24 | }, 25 | "engines": { 26 | "node": ">= 6" 27 | }, 28 | "scripts": { 29 | "publish": "git push origin --tags && npm run changelog && git push origin", 30 | "release:patch": "npm version patch && npm publish --access public", 31 | "release:minor": "npm version minor && npm publish --access public", 32 | "release:major": "npm version major && npm publish --access public", 33 | "release:pre": "npm version prerelease && npm publish --tag pre --access public", 34 | "changelog": "github_changelog_generator && git add CHANGELOG.md && git commit -am \"Updating changelog\"", 35 | "lint": "semistandard --fix", 36 | "mocha": "mocha --opts mocha.opts", 37 | "coverage": "istanbul cover node_modules/mocha/bin/_mocha -- --opts mocha.opts", 38 | "test": "npm run lint && npm run coverage" 39 | }, 40 | "semistandard": { 41 | "sourceType": "module", 42 | "env": [ 43 | "mocha" 44 | ] 45 | }, 46 | "directories": { 47 | "lib": "lib" 48 | }, 49 | "dependencies": { 50 | "@feathersjs/errors": "^3.0.0", 51 | "bcryptjs": "^2.3.0", 52 | "debug": "^3.1.0", 53 | "lodash": "^4.17.5", 54 | "passport-local": "^1.0.0" 55 | }, 56 | "devDependencies": { 57 | "@feathersjs/authentication": "^2.0.0", 58 | "@feathersjs/authentication-jwt": "^2.0.0", 59 | "@feathersjs/express": "^1.0.0", 60 | "@feathersjs/feathers": "^3.0.0", 61 | "@feathersjs/socketio": "^3.0.0", 62 | "body-parser": "^1.15.2", 63 | "chai": "^4.0.2", 64 | "feathers-memory": "^2.0.0", 65 | "istanbul": "^1.1.0-alpha.1", 66 | "mocha": "^5.0.0", 67 | "semistandard": "^12.0.0", 68 | "sinon": "^6.0.0", 69 | "sinon-chai": "^3.0.0" 70 | } 71 | } 72 | -------------------------------------------------------------------------------- /test/hooks/hash-password.test.js: -------------------------------------------------------------------------------- 1 | /* eslint-disable no-unused-expressions */ 2 | const chai = require('chai'); 3 | const sinon = require('sinon'); 4 | const sinonChai = require('sinon-chai'); 5 | 6 | const { hashPassword } = require('../../lib/hooks'); 7 | const { expect } = chai; 8 | 9 | chai.use(sinonChai); 10 | 11 | describe('hooks:hashPassword', () => { 12 | let hook; 13 | 14 | beforeEach(() => { 15 | hook = { 16 | type: 'before', 17 | data: { password: 'secret' }, 18 | params: {}, 19 | app: { 20 | get: () => { 21 | return { 22 | local: { 23 | passwordField: 'password' 24 | } 25 | }; 26 | } 27 | } 28 | }; 29 | }); 30 | 31 | describe('when not called as a before hook', () => { 32 | it('returns an error', () => { 33 | hook.type = 'after'; 34 | return hashPassword()(hook).catch(error => { 35 | expect(error).to.not.equal(undefined); 36 | }); 37 | }); 38 | }); 39 | 40 | describe('when data does not exist', () => { 41 | it('does not do anything', () => { 42 | delete hook.data; 43 | return hashPassword()(hook).then(returnedHook => { 44 | expect(returnedHook).to.deep.equal(hook); 45 | }); 46 | }); 47 | }); 48 | 49 | describe('when data does not have a prototype', () => { 50 | it('does not do anything', () => { 51 | hook.data = Object.create(null); 52 | return hashPassword()(hook).then(returnedHook => { 53 | expect(returnedHook).to.deep.equal(hook); 54 | }); 55 | }); 56 | }); 57 | 58 | describe('when password does not exist', () => { 59 | it('does not do anything', () => { 60 | delete hook.data.password; 61 | return hashPassword()(hook).then(returnedHook => { 62 | expect(returnedHook).to.deep.equal(hook); 63 | }); 64 | }); 65 | }); 66 | 67 | describe('when password exists', () => { 68 | it('hashes with options from global auth config', () => { 69 | return hashPassword()(hook).then(hook => { 70 | expect(hook.data.password).to.not.equal(undefined); 71 | expect(hook.data.password).to.not.equal('secret'); 72 | }); 73 | }); 74 | 75 | it('does not modify the original object', () => { 76 | const data = { password: 'secret' }; 77 | 78 | hook.data = data; 79 | 80 | return hashPassword()(hook).then(hook => { 81 | expect(hook.data.password).to.not.equal(undefined); 82 | expect(hook.data.password).to.not.equal('secret'); 83 | expect(data.password).to.equal('secret'); 84 | }); 85 | }); 86 | 87 | it('hashes with custom options', () => { 88 | hook.data.pass = 'secret'; 89 | 90 | return hashPassword({ passwordField: 'pass' })(hook).then(hook => { 91 | expect(hook.data.pass).to.not.equal(undefined); 92 | expect(hook.data.pass).to.not.equal('secret'); 93 | }); 94 | }); 95 | 96 | it('hashes with nested password field custom option', () => { 97 | hook.data = { 98 | nested: { 99 | pass: 'secret' 100 | } 101 | }; 102 | 103 | return hashPassword({ passwordField: 'nested.pass' })(hook).then(hook => { 104 | expect(hook.data.nested.pass).to.not.equal(undefined); 105 | expect(hook.data.nested.pass).to.not.equal('secret'); 106 | }); 107 | }); 108 | 109 | it('calls custom hash function', () => { 110 | const fn = sinon.stub().returns(Promise.resolve()); 111 | return hashPassword({ hash: fn })(hook).then(() => { 112 | expect(fn).to.have.been.calledOnce; 113 | expect(fn).to.have.been.calledWith('secret'); 114 | }); 115 | }); 116 | 117 | it('returns an error when custom hash is not a function', () => { 118 | return hashPassword({ hash: true })(hook).catch(error => { 119 | expect(error).to.not.equal(undefined); 120 | }); 121 | }); 122 | }); 123 | 124 | describe('when password exists in bulk', () => { 125 | beforeEach(() => { 126 | hook.data = [ 127 | {password: 'secret'}, 128 | {password: 'secret'} 129 | ]; 130 | }); 131 | 132 | it('hashes with options from global auth config', () => { 133 | return hashPassword()(hook).then(hook => { 134 | hook.data.map(item => { 135 | expect(item.password).to.not.equal(undefined); 136 | expect(item.password).to.not.equal('secret'); 137 | }); 138 | }); 139 | }); 140 | 141 | it('does not remove things if there is no password', () => { 142 | hook.data = [ 143 | { id: 0, password: 'secret' }, 144 | { id: 1 } 145 | ]; 146 | 147 | return hashPassword()(hook).then(hook => { 148 | const { data } = hook; 149 | 150 | expect(data.length).to.equal(2); 151 | expect(data[0].password).to.not.equal('secret'); 152 | expect(data[1]).to.exist; 153 | }); 154 | }); 155 | 156 | it('hashes with custom options', () => { 157 | hook.data = [ 158 | {pass: 'secret'}, 159 | {pass: 'secret'} 160 | ]; 161 | 162 | return hashPassword({ passwordField: 'pass' })(hook).then(hook => { 163 | hook.data.map(item => { 164 | expect(item.pass).to.not.equal(undefined); 165 | expect(item.pass).to.not.equal('secret'); 166 | }); 167 | }); 168 | }); 169 | 170 | it('calls custom hash function', () => { 171 | const fn = sinon.stub().returns(Promise.resolve()); 172 | return hashPassword({ hash: fn })(hook).then(() => { 173 | expect(fn).to.have.been.calledTwice; 174 | expect(fn).to.have.been.calledWith('secret'); 175 | }); 176 | }); 177 | }); 178 | }); 179 | -------------------------------------------------------------------------------- /test/hooks/index.test.js: -------------------------------------------------------------------------------- 1 | const { expect } = require('chai'); 2 | const hooks = require('../../lib/hooks'); 3 | 4 | describe('hooks', () => { 5 | it('is CommonJS compatible', () => { 6 | expect(typeof require('../../lib/hooks')).to.equal('object'); 7 | }); 8 | 9 | it('is ES6 compatible', () => { 10 | expect(typeof hooks).to.equal('object'); 11 | }); 12 | 13 | it('exposes hashPassword hook', () => { 14 | expect(typeof hooks.hashPassword).to.equal('function'); 15 | }); 16 | }); 17 | -------------------------------------------------------------------------------- /test/hooks/protect.test.js: -------------------------------------------------------------------------------- 1 | /* eslint-disable no-unused-expressions */ 2 | const chai = require('chai'); 3 | 4 | const { protect } = require('../../lib/hooks'); 5 | const { expect } = chai; 6 | 7 | function testOmit (title, property) { 8 | describe(title, () => { 9 | const fn = protect('password'); 10 | 11 | it('omits from object', () => { 12 | const data = { 13 | email: 'test@user.com', 14 | password: 'supersecret' 15 | }; 16 | const context = { 17 | [property]: data 18 | }; 19 | const result = fn(context); 20 | 21 | expect(result).to.deep.equal({ 22 | [property]: data, 23 | dispatch: { email: 'test@user.com' } 24 | }); 25 | }); 26 | 27 | it('omits from nested object', () => { 28 | const hook = protect('user.password'); 29 | const data = { 30 | user: { 31 | email: 'test@user.com', 32 | password: 'supersecret' 33 | } 34 | }; 35 | const context = { 36 | [property]: data 37 | }; 38 | const result = hook(context); 39 | 40 | expect(result).to.deep.equal({ 41 | [property]: data, 42 | dispatch: { user: { email: 'test@user.com' } } 43 | }); 44 | }); 45 | 46 | it('handles `data` property only for find', () => { 47 | const data = { 48 | email: 'test@user.com', 49 | password: 'supersecret', 50 | data: 'yes' 51 | }; 52 | const context = { 53 | [property]: data 54 | }; 55 | const result = fn(context); 56 | 57 | expect(result).to.deep.equal({ 58 | [property]: data, 59 | dispatch: { email: 'test@user.com', data: 'yes' } 60 | }); 61 | }); 62 | 63 | it('uses .toJSON (#48)', () => { 64 | class MyUser { 65 | toJSON () { 66 | return { 67 | email: 'test@user.com', 68 | password: 'supersecret' 69 | }; 70 | } 71 | } 72 | 73 | const data = new MyUser(); 74 | const context = { 75 | [property]: data 76 | }; 77 | const result = fn(context); 78 | 79 | expect(result).to.deep.equal({ 80 | [property]: data, 81 | dispatch: { email: 'test@user.com' } 82 | }); 83 | }); 84 | 85 | it('omits from array', () => { 86 | const data = [{ 87 | email: 'test1@user.com', 88 | password: 'supersecret' 89 | }, { 90 | email: 'test2@user.com', 91 | password: 'othersecret' 92 | }]; 93 | const context = { 94 | [property]: data 95 | }; 96 | const result = fn(context); 97 | 98 | expect(result).to.deep.equal({ 99 | [property]: data, 100 | dispatch: [ 101 | { email: 'test1@user.com' }, 102 | { email: 'test2@user.com' } 103 | ] 104 | }); 105 | }); 106 | 107 | it('omits from pagination object', () => { 108 | const data = { 109 | total: 2, 110 | data: [{ 111 | email: 'test1@user.com', 112 | password: 'supersecret' 113 | }, { 114 | email: 'test2@user.com', 115 | password: 'othersecret' 116 | }] 117 | }; 118 | const context = { 119 | method: 'find', 120 | [property]: data 121 | }; 122 | const result = fn(context); 123 | 124 | expect(result).to.deep.equal({ 125 | method: 'find', 126 | [property]: data, 127 | dispatch: { 128 | total: 2, 129 | data: [ 130 | { email: 'test1@user.com' }, 131 | { email: 'test2@user.com' } 132 | ] 133 | } 134 | }); 135 | }); 136 | 137 | it('updates result if params.provider is set', () => { 138 | const data = [{ 139 | email: 'test1@user.com', 140 | password: 'supersecret' 141 | }, { 142 | email: 'test2@user.com', 143 | password: 'othersecret' 144 | }]; 145 | const params = { provider: 'test' }; 146 | const context = { 147 | [property]: data, 148 | params 149 | }; 150 | const result = fn(context); 151 | 152 | expect(result).to.deep.equal({ 153 | [property]: data, 154 | params, 155 | result: [ 156 | { email: 'test1@user.com' }, 157 | { email: 'test2@user.com' } 158 | ], 159 | dispatch: [ 160 | { email: 'test1@user.com' }, 161 | { email: 'test2@user.com' } 162 | ] 163 | }); 164 | }); 165 | }); 166 | } 167 | 168 | describe('hooks:protect', () => { 169 | it('does nothing when called with no result', () => { 170 | const fn = protect(); 171 | const original = {}; 172 | 173 | expect(fn(original)).to.deep.equal(original); 174 | }); 175 | 176 | testOmit('with hook.result', 'result'); 177 | testOmit('with hook.dispatch already set', 'dispatch'); 178 | }); 179 | -------------------------------------------------------------------------------- /test/index.test.js: -------------------------------------------------------------------------------- 1 | /* eslint-disable no-unused-expressions */ 2 | const feathers = require('@feathersjs/feathers'); 3 | const expressify = require('@feathersjs/express'); 4 | const authentication = require('@feathersjs/authentication'); 5 | const memory = require('feathers-memory'); 6 | const chai = require('chai'); 7 | const sinon = require('sinon'); 8 | const sinonChai = require('sinon-chai'); 9 | const passportLocal = require('passport-local'); 10 | const local = require('../lib'); 11 | 12 | const { Verifier } = local; 13 | const { expect } = chai; 14 | 15 | chai.use(sinonChai); 16 | 17 | describe('@feathersjs/authentication-local', () => { 18 | it('is CommonJS compatible', () => { 19 | expect(typeof require('../lib')).to.equal('function'); 20 | }); 21 | 22 | it('basic functionality', () => { 23 | expect(typeof local).to.equal('function'); 24 | }); 25 | 26 | it('exposes default', () => { 27 | expect(local.default).to.equal(local); 28 | }); 29 | 30 | it('exposes hooks', () => { 31 | expect(typeof local.hooks).to.equal('object'); 32 | }); 33 | 34 | it('exposes the Verifier class', () => { 35 | expect(typeof Verifier).to.equal('function'); 36 | expect(typeof local.Verifier).to.equal('function'); 37 | }); 38 | 39 | describe('initialization', () => { 40 | let app; 41 | 42 | beforeEach(() => { 43 | app = expressify(feathers()); 44 | app.use('/users', memory()); 45 | app.configure(authentication({ secret: 'supersecret' })); 46 | }); 47 | 48 | it('throws an error if passport has not been registered', () => { 49 | expect(() => { 50 | expressify(feathers()).configure(local()); 51 | }).to.throw(); 52 | }); 53 | 54 | it('registers the local passport strategy', () => { 55 | sinon.spy(app.passport, 'use'); 56 | sinon.spy(passportLocal, 'Strategy'); 57 | app.configure(local()); 58 | app.setup(); 59 | 60 | expect(passportLocal.Strategy).to.have.been.calledOnce; 61 | expect(app.passport.use).to.have.been.calledWith('local'); 62 | 63 | app.passport.use.restore(); 64 | passportLocal.Strategy.restore(); 65 | }); 66 | 67 | it('registers the strategy options', () => { 68 | sinon.spy(app.passport, 'options'); 69 | app.configure(local()); 70 | app.setup(); 71 | 72 | expect(app.passport.options).to.have.been.calledOnce; 73 | 74 | app.passport.options.restore(); 75 | }); 76 | 77 | describe('passport strategy options', () => { 78 | let authOptions; 79 | let args; 80 | 81 | beforeEach(() => { 82 | sinon.spy(passportLocal, 'Strategy'); 83 | app.configure(local({ custom: true })); 84 | app.setup(); 85 | authOptions = app.get('authentication'); 86 | args = passportLocal.Strategy.getCall(0).args[0]; 87 | }); 88 | 89 | afterEach(() => { 90 | passportLocal.Strategy.restore(); 91 | }); 92 | 93 | it('sets usernameField', () => { 94 | expect(args.usernameField).to.equal('email'); 95 | }); 96 | 97 | it('sets passwordField', () => { 98 | expect(args.passwordField).to.equal('password'); 99 | }); 100 | 101 | it('sets entity', () => { 102 | expect(args.entity).to.equal(authOptions.entity); 103 | }); 104 | 105 | it('sets service', () => { 106 | expect(args.service).to.equal(authOptions.service); 107 | }); 108 | 109 | it('sets session', () => { 110 | expect(args.session).to.equal(authOptions.session); 111 | }); 112 | 113 | it('sets passReqToCallback', () => { 114 | expect(args.passReqToCallback).to.equal(authOptions.passReqToCallback); 115 | }); 116 | 117 | it('supports setting custom options', () => { 118 | expect(args.custom).to.equal(true); 119 | }); 120 | }); 121 | 122 | it('supports overriding default options', () => { 123 | sinon.spy(passportLocal, 'Strategy'); 124 | app.configure(local({ usernameField: 'username' })); 125 | app.setup(); 126 | 127 | expect(passportLocal.Strategy.getCall(0).args[0].usernameField).to.equal('username'); 128 | 129 | passportLocal.Strategy.restore(); 130 | }); 131 | 132 | it('pulls options from global config', () => { 133 | sinon.spy(passportLocal, 'Strategy'); 134 | let authOptions = app.get('authentication'); 135 | authOptions.local = { usernameField: 'username' }; 136 | app.set('authentication', authOptions); 137 | 138 | app.configure(local()); 139 | app.setup(); 140 | 141 | expect(passportLocal.Strategy.getCall(0).args[0].usernameField).to.equal('username'); 142 | expect(passportLocal.Strategy.getCall(0).args[0].passwordField).to.equal('password'); 143 | 144 | passportLocal.Strategy.restore(); 145 | }); 146 | 147 | it('pulls options from global config with custom name', () => { 148 | sinon.spy(passportLocal, 'Strategy'); 149 | let authOptions = app.get('authentication'); 150 | authOptions.custom = { usernameField: 'username' }; 151 | app.set('authentication', authOptions); 152 | 153 | app.configure(local({ name: 'custom' })); 154 | app.setup(); 155 | 156 | expect(passportLocal.Strategy.getCall(0).args[0].usernameField).to.equal('username'); 157 | expect(passportLocal.Strategy.getCall(0).args[0].passwordField).to.equal('password'); 158 | 159 | passportLocal.Strategy.restore(); 160 | }); 161 | 162 | describe('custom Verifier', () => { 163 | it('throws an error if a verify function is missing', () => { 164 | expect(() => { 165 | class CustomVerifier { 166 | constructor (app) { 167 | this.app = app; 168 | } 169 | } 170 | app.configure(local({ Verifier: CustomVerifier })); 171 | app.setup(); 172 | }).to.throw(); 173 | }); 174 | 175 | it('verifies through custom verify function', () => { 176 | const User = { 177 | email: 'admin@feathersjs.com', 178 | password: 'password' 179 | }; 180 | 181 | const req = { 182 | query: {}, 183 | body: Object.assign({}, User), 184 | headers: {}, 185 | cookies: {} 186 | }; 187 | class CustomVerifier extends Verifier { 188 | verify (req, username, password, done) { 189 | expect(username).to.equal(User.email); 190 | expect(password).to.equal(User.password); 191 | done(null, User); 192 | } 193 | } 194 | 195 | app.configure(local({ Verifier: CustomVerifier })); 196 | app.setup(); 197 | 198 | return app.authenticate('local')(req).then(result => { 199 | expect(result.data.user).to.deep.equal(User); 200 | }); 201 | }); 202 | }); 203 | }); 204 | }); 205 | -------------------------------------------------------------------------------- /test/integration.test.js: -------------------------------------------------------------------------------- 1 | /* eslint-disable no-unused-expressions */ 2 | const feathers = require('@feathersjs/feathers'); 3 | const expressify = require('@feathersjs/express'); 4 | const authentication = require('@feathersjs/authentication'); 5 | const memory = require('feathers-memory'); 6 | const local = require('../lib'); 7 | 8 | const { expect } = require('chai'); 9 | 10 | describe('integration', () => { 11 | it('verifies', () => { 12 | const User = { 13 | email: 'admin@feathersjs.com', 14 | password: 'password' 15 | }; 16 | 17 | const req = { 18 | query: {}, 19 | body: Object.assign({}, User), 20 | headers: {}, 21 | cookies: {}, 22 | params: { 23 | query: {}, 24 | provider: 'socketio', 25 | headers: {}, 26 | session: {}, 27 | cookies: {}, 28 | data: 'Hello, world' 29 | } 30 | }; 31 | 32 | const app = expressify(feathers()); 33 | let paramsReceived = false; 34 | let dataReceived; 35 | 36 | app.configure(authentication({ secret: 'secret' })) 37 | .configure(local()) 38 | .use('/users', memory()); 39 | 40 | app.service('users').hooks({ 41 | before: { 42 | find: (hook) => { 43 | paramsReceived = Object.keys(hook.params); 44 | dataReceived = hook.params.data; 45 | }, 46 | create: local.hooks.hashPassword({ passwordField: 'password' }) 47 | } 48 | }); 49 | 50 | app.setup(); 51 | 52 | return app.service('users').create(User).then(() => { 53 | return app.authenticate('local')(req).then(result => { 54 | expect(result.success).to.equal(true); 55 | expect(result.data.user.email).to.equal(User.email); 56 | expect(result.data.user.password).to.not.equal(undefined); 57 | expect(paramsReceived).to.have.members(['data', 'query']); 58 | expect(dataReceived).to.equal('Hello, world'); 59 | }); 60 | }); 61 | }); 62 | }); 63 | -------------------------------------------------------------------------------- /test/verifier.test.js: -------------------------------------------------------------------------------- 1 | /* eslint-disable no-unused-expressions */ 2 | const feathers = require('@feathersjs/feathers'); 3 | const authentication = require('@feathersjs/authentication'); 4 | const expressify = require('@feathersjs/express'); 5 | const hasher = require('../lib/utils/hash'); 6 | const { Verifier, defaults } = require('../lib'); 7 | 8 | const chai = require('chai'); 9 | const sinon = require('sinon'); 10 | const sinonChai = require('sinon-chai'); 11 | 12 | const { expect } = require('chai'); 13 | 14 | chai.use(sinonChai); 15 | 16 | describe('Verifier', () => { 17 | let service; 18 | let app; 19 | let options; 20 | let verifier; 21 | let user; 22 | 23 | beforeEach(() => { 24 | app = expressify(feathers()); 25 | 26 | return hasher('admin').then(password => { 27 | user = { 28 | email: 'admin@feathersjs.com', 29 | password 30 | }; 31 | 32 | service = { 33 | id: 'id', 34 | find () {} 35 | }; 36 | 37 | sinon.stub(service, 'find').callsFake(function (params) { 38 | return new Promise((resolve, reject) => { 39 | const { email } = params && params.query; 40 | if (email === 'nonexistinguser@gmail.com') { 41 | return resolve([]); 42 | } 43 | return resolve([user]); 44 | }); 45 | }); 46 | 47 | app.use('users', service) 48 | .configure(authentication({ secret: 'supersecret' })); 49 | 50 | options = Object.assign({}, defaults, app.get('authentication')); 51 | 52 | verifier = new Verifier(app, options); 53 | }); 54 | }); 55 | 56 | it('is CommonJS compatible', () => { 57 | expect(typeof require('../lib/verifier')).to.equal('function'); 58 | }); 59 | 60 | it('exposes the Verifier class', () => { 61 | expect(typeof Verifier).to.equal('function'); 62 | }); 63 | 64 | describe('constructor', () => { 65 | it('retains an app reference', () => { 66 | expect(verifier.app).to.deep.equal(app); 67 | }); 68 | 69 | it('sets options', () => { 70 | expect(verifier.options).to.deep.equal(options); 71 | }); 72 | 73 | it('sets service using service path', () => { 74 | expect(verifier.service).to.deep.equal(app.service('users')); 75 | }); 76 | 77 | it('sets a passed in service instance', () => { 78 | options.service = service; 79 | expect(new Verifier(app, options).service).to.deep.equal(service); 80 | }); 81 | 82 | describe('when service is undefined', () => { 83 | it('throws an error', () => { 84 | expect(() => { 85 | new Verifier(app, {}); // eslint-disable-line 86 | }).to.throw(); 87 | }); 88 | }); 89 | }); 90 | 91 | describe('_comparePassword', () => { 92 | describe('when entity is missing password field', () => { 93 | it('returns an error', () => { 94 | return verifier._comparePassword({}).catch(error => { 95 | expect(error).to.not.equal(undefined); 96 | }); 97 | }); 98 | }); 99 | 100 | describe('password comparison fails', () => { 101 | it('rejects with false', () => { 102 | return verifier._comparePassword(user, 'invalid').catch(error => { 103 | expect(error).to.equal(false); 104 | }); 105 | }); 106 | }); 107 | 108 | describe('password comparison succeeds', () => { 109 | it('returns the entity', () => { 110 | return verifier._comparePassword(user, 'admin').then(result => { 111 | expect(result).to.deep.equal(user); 112 | }); 113 | }); 114 | 115 | it('allows dot notation for password field', () => { 116 | user.password = { 117 | value: user.password 118 | }; 119 | 120 | verifier.options.passwordField = 'password.value'; 121 | 122 | return verifier._comparePassword(user, 'admin').then(result => { 123 | expect(result).to.deep.equal(user); 124 | }); 125 | }); 126 | 127 | it('prefers entityPasswordField over passwordField', () => { 128 | user.password = { 129 | value: user.password 130 | }; 131 | 132 | verifier.options.passwordField = 'password'; 133 | verifier.options.entityPasswordField = 'password.value'; 134 | 135 | return verifier._comparePassword(user, 'admin').then(result => { 136 | expect(result).to.deep.equal(user); 137 | }); 138 | }); 139 | }); 140 | }); 141 | 142 | describe('_normalizeResult', () => { 143 | describe('when has results', () => { 144 | it('returns entity when paginated', () => { 145 | return verifier._normalizeResult({ data: [user] }).then(result => { 146 | expect(result).to.deep.equal(user); 147 | }); 148 | }); 149 | 150 | it('returns entity when not paginated', () => { 151 | return verifier._normalizeResult([user]).then(result => { 152 | expect(result).to.deep.equal(user); 153 | }); 154 | }); 155 | }); 156 | 157 | describe('when no results', () => { 158 | it('rejects with false when paginated', () => { 159 | return verifier._normalizeResult({ data: [] }).catch(error => { 160 | expect(error).to.equal(false); 161 | }); 162 | }); 163 | 164 | it('rejects with false when not paginated', () => { 165 | return verifier._normalizeResult([]).catch(error => { 166 | expect(error).to.equal(false); 167 | }); 168 | }); 169 | }); 170 | }); 171 | 172 | describe('verify', () => { 173 | it('calls find on the provided service', done => { 174 | verifier.verify({}, user.email, 'admin', () => { 175 | const query = { email: user.email, $limit: 1 }; 176 | expect(service.find).to.have.been.calledOnce; 177 | expect(service.find).to.have.been.calledWith({ query }); 178 | done(); 179 | }); 180 | }); 181 | 182 | it('allows overriding of usernameField', done => { 183 | verifier.options.usernameField = 'username'; 184 | 185 | user.username = 'username'; 186 | 187 | verifier.verify({}, 'username', 'admin', (error, entity) => { 188 | expect(error).to.equal(null); 189 | expect(entity).to.deep.equal(user); 190 | done(); 191 | }); 192 | }); 193 | 194 | it('prefers entityUsernameField over usernameField', done => { 195 | verifier.options.usernameField = 'username'; 196 | verifier.options.entityUsernameField = 'users.username'; 197 | 198 | user.username = 'invalid'; 199 | 200 | user.users = { 201 | username: 'valid' 202 | }; 203 | 204 | verifier.verify({}, 'valid', 'admin', (error, entity) => { 205 | expect(error).to.equal(null); 206 | expect(entity).to.deep.equal(user); 207 | done(); 208 | }); 209 | }); 210 | 211 | it('calls _normalizeResult', done => { 212 | sinon.spy(verifier, '_normalizeResult'); 213 | verifier.verify({}, user.email, 'admin', () => { 214 | expect(verifier._normalizeResult).to.have.been.calledOnce; 215 | verifier._normalizeResult.restore(); 216 | done(); 217 | }); 218 | }); 219 | 220 | it('produces an error message when the user did not exist', done => { 221 | verifier.verify({}, 'nonexistinguser@gmail.com', 'admin', (err, user, info) => { 222 | expect(err).to.not.be.undefined; 223 | expect(info.message).to.equal('Invalid login'); 224 | done(); 225 | }); 226 | }); 227 | 228 | it('calls _comparePassword', done => { 229 | sinon.spy(verifier, '_comparePassword'); 230 | verifier.verify({}, user.email, 'admin', () => { 231 | expect(verifier._comparePassword).to.have.been.calledOnce; 232 | verifier._comparePassword.restore(); 233 | done(); 234 | }); 235 | }); 236 | 237 | it('returns the entity', done => { 238 | verifier.verify({}, user.email, 'admin', (error, entity) => { 239 | expect(error).to.equal(null); 240 | expect(entity).to.deep.equal(user); 241 | done(); 242 | }); 243 | }); 244 | 245 | it('handles false rejections in promise chain', (done) => { 246 | verifier._normalizeResult = () => Promise.reject(false); // eslint-disable-line 247 | verifier.verify({}, user.email, 'admin', (error, entity) => { 248 | expect(error).to.equal(null); 249 | expect(entity).to.equal(false); 250 | done(); 251 | }); 252 | }); 253 | 254 | it('returns errors', (done) => { 255 | const authError = new Error('An error'); 256 | verifier._normalizeResult = () => Promise.reject(authError); 257 | verifier.verify({}, user.email, 'admin', (error, entity) => { 258 | expect(error).to.equal(authError); 259 | expect(entity).to.equal(undefined); 260 | done(); 261 | }); 262 | }); 263 | }); 264 | }); 265 | 266 | describe('Verifier without service.id', function () { 267 | let service; 268 | let app; 269 | let options; 270 | let verifier; 271 | let user; 272 | 273 | beforeEach(() => { 274 | app = expressify(feathers()); 275 | 276 | return hasher('admin').then(password => { 277 | user = { 278 | email: 'admin@feathersjs.com', 279 | password 280 | }; 281 | 282 | // testing a missing service.id 283 | service = { 284 | find () { 285 | return Promise.resolve([]); 286 | } 287 | }; 288 | 289 | app.use('users', service) 290 | .configure(authentication({ secret: 'supersecret' })); 291 | 292 | options = Object.assign({}, defaults, app.get('authentication')); 293 | 294 | verifier = new Verifier(app, options); 295 | }); 296 | }); 297 | 298 | it('throws an error when service.id is not set', done => { 299 | verifier.verify({}, user.email, 'admin', (error, entity) => { 300 | expect(error.message.includes('the `id` property must be set')).to.equal(true); 301 | expect(entity).to.equal(undefined); 302 | done(); 303 | }); 304 | }); 305 | }); 306 | --------------------------------------------------------------------------------