├── .gitignore
├── .travis.yml
├── GITHUB-APP-STEP-BY-STEP-GUIDE.md
├── LICENSE
├── README.md
├── example
├── github_oauth_handler.js
└── github_server.js
├── lib
├── http_request.js
└── index.js
├── package-lock.json
├── package.json
└── test
├── fixtures
├── sample_access_token.json
├── sample_profile.json
└── sample_response.json
├── github.test.js
└── http_request.test.js
/.gitignore:
--------------------------------------------------------------------------------
1 | # Logs
2 | logs
3 | *.log
4 |
5 | # Runtime data
6 | pids
7 | *.pid
8 | *.seed
9 |
10 | # Directory for instrumented libs generated by jscoverage/JSCover
11 | lib-cov
12 |
13 | # Coverage directory used by tools like istanbul
14 | coverage
15 |
16 | # Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files)
17 | .grunt
18 |
19 | # node-waf configuration
20 | .lock-wscript
21 |
22 | # Compiled binary addons (http://nodejs.org/api/addons.html)
23 | build/Release
24 |
25 | # Dependency directory
26 | # https://www.npmjs.org/doc/misc/npm-faq.html#should-i-check-my-node_modules-folder-into-git
27 | node_modules
28 | .env
29 | .eslintrc.js
30 |
--------------------------------------------------------------------------------
/.travis.yml:
--------------------------------------------------------------------------------
1 | language: node_js
2 | node_js:
3 | - "8"
4 | before_install:
5 | - pip install --user codecov
6 | after_success:
7 | - codecov --file coverage/lcov.info --disable search
8 |
--------------------------------------------------------------------------------
/GITHUB-APP-STEP-BY-STEP-GUIDE.md:
--------------------------------------------------------------------------------
1 | # Steps to Register a new GitHub Application
2 |
3 | ## 1 - Open Your GitHub Account Settings
4 |
5 | > Visit: https://github.com/settings/developers
6 |
7 | 
8 |
9 | ## 2 - Define the details for your applications
10 |
11 | Ensure that you set the `callback URL` to something obvious like `/githubauth`
12 |
13 | 
14 |
15 | *Note: You can edit/change any of these values later*.
16 |
17 | Click on **Register Application**
18 |
19 | ## 3 - Copy the Client ID & Secret for the App
20 |
21 | Once you've successfully created your GitHub App,
22 | copy the Client ID and Secret and save them as environment variables
23 | `GITHUB_CLIENT_ID` and `GITHUB_CLIENT_SECRET` respectively.
24 |
25 | 
26 |
27 |
28 | Copy the two keys and export them in your project
29 | see: Step 3 of the Readme.
30 |
--------------------------------------------------------------------------------
/LICENSE:
--------------------------------------------------------------------------------
1 | GNU GENERAL PUBLIC LICENSE
2 | Version 2, June 1991
3 |
4 | Copyright (C) 1989, 1991 Free Software Foundation, Inc.,
5 | 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
6 | Everyone is permitted to copy and distribute verbatim copies
7 | of this license document, but changing it is not allowed.
8 |
9 | Preamble
10 |
11 | The licenses for most software are designed to take away your
12 | freedom to share and change it. By contrast, the GNU General Public
13 | License is intended to guarantee your freedom to share and change free
14 | software--to make sure the software is free for all its users. This
15 | General Public License applies to most of the Free Software
16 | Foundation's software and to any other program whose authors commit to
17 | using it. (Some other Free Software Foundation software is covered by
18 | the GNU Lesser General Public License instead.) You can apply it to
19 | your programs, too.
20 |
21 | When we speak of free software, we are referring to freedom, not
22 | price. Our General Public Licenses are designed to make sure that you
23 | have the freedom to distribute copies of free software (and charge for
24 | this service if you wish), that you receive source code or can get it
25 | if you want it, that you can change the software or use pieces of it
26 | in new free programs; and that you know you can do these things.
27 |
28 | To protect your rights, we need to make restrictions that forbid
29 | anyone to deny you these rights or to ask you to surrender the rights.
30 | These restrictions translate to certain responsibilities for you if you
31 | distribute copies of the software, or if you modify it.
32 |
33 | For example, if you distribute copies of such a program, whether
34 | gratis or for a fee, you must give the recipients all the rights that
35 | you have. You must make sure that they, too, receive or can get the
36 | source code. And you must show them these terms so they know their
37 | rights.
38 |
39 | We protect your rights with two steps: (1) copyright the software, and
40 | (2) offer you this license which gives you legal permission to copy,
41 | distribute and/or modify the software.
42 |
43 | Also, for each author's protection and ours, we want to make certain
44 | that everyone understands that there is no warranty for this free
45 | software. If the software is modified by someone else and passed on, we
46 | want its recipients to know that what they have is not the original, so
47 | that any problems introduced by others will not reflect on the original
48 | authors' reputations.
49 |
50 | Finally, any free program is threatened constantly by software
51 | patents. We wish to avoid the danger that redistributors of a free
52 | program will individually obtain patent licenses, in effect making the
53 | program proprietary. To prevent this, we have made it clear that any
54 | patent must be licensed for everyone's free use or not licensed at all.
55 |
56 | The precise terms and conditions for copying, distribution and
57 | modification follow.
58 |
59 | GNU GENERAL PUBLIC LICENSE
60 | TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
61 |
62 | 0. This License applies to any program or other work which contains
63 | a notice placed by the copyright holder saying it may be distributed
64 | under the terms of this General Public License. The "Program", below,
65 | refers to any such program or work, and a "work based on the Program"
66 | means either the Program or any derivative work under copyright law:
67 | that is to say, a work containing the Program or a portion of it,
68 | either verbatim or with modifications and/or translated into another
69 | language. (Hereinafter, translation is included without limitation in
70 | the term "modification".) Each licensee is addressed as "you".
71 |
72 | Activities other than copying, distribution and modification are not
73 | covered by this License; they are outside its scope. The act of
74 | running the Program is not restricted, and the output from the Program
75 | is covered only if its contents constitute a work based on the
76 | Program (independent of having been made by running the Program).
77 | Whether that is true depends on what the Program does.
78 |
79 | 1. You may copy and distribute verbatim copies of the Program's
80 | source code as you receive it, in any medium, provided that you
81 | conspicuously and appropriately publish on each copy an appropriate
82 | copyright notice and disclaimer of warranty; keep intact all the
83 | notices that refer to this License and to the absence of any warranty;
84 | and give any other recipients of the Program a copy of this License
85 | along with the Program.
86 |
87 | You may charge a fee for the physical act of transferring a copy, and
88 | you may at your option offer warranty protection in exchange for a fee.
89 |
90 | 2. You may modify your copy or copies of the Program or any portion
91 | of it, thus forming a work based on the Program, and copy and
92 | distribute such modifications or work under the terms of Section 1
93 | above, provided that you also meet all of these conditions:
94 |
95 | a) You must cause the modified files to carry prominent notices
96 | stating that you changed the files and the date of any change.
97 |
98 | b) You must cause any work that you distribute or publish, that in
99 | whole or in part contains or is derived from the Program or any
100 | part thereof, to be licensed as a whole at no charge to all third
101 | parties under the terms of this License.
102 |
103 | c) If the modified program normally reads commands interactively
104 | when run, you must cause it, when started running for such
105 | interactive use in the most ordinary way, to print or display an
106 | announcement including an appropriate copyright notice and a
107 | notice that there is no warranty (or else, saying that you provide
108 | a warranty) and that users may redistribute the program under
109 | these conditions, and telling the user how to view a copy of this
110 | License. (Exception: if the Program itself is interactive but
111 | does not normally print such an announcement, your work based on
112 | the Program is not required to print an announcement.)
113 |
114 | These requirements apply to the modified work as a whole. If
115 | identifiable sections of that work are not derived from the Program,
116 | and can be reasonably considered independent and separate works in
117 | themselves, then this License, and its terms, do not apply to those
118 | sections when you distribute them as separate works. But when you
119 | distribute the same sections as part of a whole which is a work based
120 | on the Program, the distribution of the whole must be on the terms of
121 | this License, whose permissions for other licensees extend to the
122 | entire whole, and thus to each and every part regardless of who wrote it.
123 |
124 | Thus, it is not the intent of this section to claim rights or contest
125 | your rights to work written entirely by you; rather, the intent is to
126 | exercise the right to control the distribution of derivative or
127 | collective works based on the Program.
128 |
129 | In addition, mere aggregation of another work not based on the Program
130 | with the Program (or with a work based on the Program) on a volume of
131 | a storage or distribution medium does not bring the other work under
132 | the scope of this License.
133 |
134 | 3. You may copy and distribute the Program (or a work based on it,
135 | under Section 2) in object code or executable form under the terms of
136 | Sections 1 and 2 above provided that you also do one of the following:
137 |
138 | a) Accompany it with the complete corresponding machine-readable
139 | source code, which must be distributed under the terms of Sections
140 | 1 and 2 above on a medium customarily used for software interchange; or,
141 |
142 | b) Accompany it with a written offer, valid for at least three
143 | years, to give any third party, for a charge no more than your
144 | cost of physically performing source distribution, a complete
145 | machine-readable copy of the corresponding source code, to be
146 | distributed under the terms of Sections 1 and 2 above on a medium
147 | customarily used for software interchange; or,
148 |
149 | c) Accompany it with the information you received as to the offer
150 | to distribute corresponding source code. (This alternative is
151 | allowed only for noncommercial distribution and only if you
152 | received the program in object code or executable form with such
153 | an offer, in accord with Subsection b above.)
154 |
155 | The source code for a work means the preferred form of the work for
156 | making modifications to it. For an executable work, complete source
157 | code means all the source code for all modules it contains, plus any
158 | associated interface definition files, plus the scripts used to
159 | control compilation and installation of the executable. However, as a
160 | special exception, the source code distributed need not include
161 | anything that is normally distributed (in either source or binary
162 | form) with the major components (compiler, kernel, and so on) of the
163 | operating system on which the executable runs, unless that component
164 | itself accompanies the executable.
165 |
166 | If distribution of executable or object code is made by offering
167 | access to copy from a designated place, then offering equivalent
168 | access to copy the source code from the same place counts as
169 | distribution of the source code, even though third parties are not
170 | compelled to copy the source along with the object code.
171 |
172 | 4. You may not copy, modify, sublicense, or distribute the Program
173 | except as expressly provided under this License. Any attempt
174 | otherwise to copy, modify, sublicense or distribute the Program is
175 | void, and will automatically terminate your rights under this License.
176 | However, parties who have received copies, or rights, from you under
177 | this License will not have their licenses terminated so long as such
178 | parties remain in full compliance.
179 |
180 | 5. You are not required to accept this License, since you have not
181 | signed it. However, nothing else grants you permission to modify or
182 | distribute the Program or its derivative works. These actions are
183 | prohibited by law if you do not accept this License. Therefore, by
184 | modifying or distributing the Program (or any work based on the
185 | Program), you indicate your acceptance of this License to do so, and
186 | all its terms and conditions for copying, distributing or modifying
187 | the Program or works based on it.
188 |
189 | 6. Each time you redistribute the Program (or any work based on the
190 | Program), the recipient automatically receives a license from the
191 | original licensor to copy, distribute or modify the Program subject to
192 | these terms and conditions. You may not impose any further
193 | restrictions on the recipients' exercise of the rights granted herein.
194 | You are not responsible for enforcing compliance by third parties to
195 | this License.
196 |
197 | 7. If, as a consequence of a court judgment or allegation of patent
198 | infringement or for any other reason (not limited to patent issues),
199 | conditions are imposed on you (whether by court order, agreement or
200 | otherwise) that contradict the conditions of this License, they do not
201 | excuse you from the conditions of this License. If you cannot
202 | distribute so as to satisfy simultaneously your obligations under this
203 | License and any other pertinent obligations, then as a consequence you
204 | may not distribute the Program at all. For example, if a patent
205 | license would not permit royalty-free redistribution of the Program by
206 | all those who receive copies directly or indirectly through you, then
207 | the only way you could satisfy both it and this License would be to
208 | refrain entirely from distribution of the Program.
209 |
210 | If any portion of this section is held invalid or unenforceable under
211 | any particular circumstance, the balance of the section is intended to
212 | apply and the section as a whole is intended to apply in other
213 | circumstances.
214 |
215 | It is not the purpose of this section to induce you to infringe any
216 | patents or other property right claims or to contest validity of any
217 | such claims; this section has the sole purpose of protecting the
218 | integrity of the free software distribution system, which is
219 | implemented by public license practices. Many people have made
220 | generous contributions to the wide range of software distributed
221 | through that system in reliance on consistent application of that
222 | system; it is up to the author/donor to decide if he or she is willing
223 | to distribute software through any other system and a licensee cannot
224 | impose that choice.
225 |
226 | This section is intended to make thoroughly clear what is believed to
227 | be a consequence of the rest of this License.
228 |
229 | 8. If the distribution and/or use of the Program is restricted in
230 | certain countries either by patents or by copyrighted interfaces, the
231 | original copyright holder who places the Program under this License
232 | may add an explicit geographical distribution limitation excluding
233 | those countries, so that distribution is permitted only in or among
234 | countries not thus excluded. In such case, this License incorporates
235 | the limitation as if written in the body of this License.
236 |
237 | 9. The Free Software Foundation may publish revised and/or new versions
238 | of the General Public License from time to time. Such new versions will
239 | be similar in spirit to the present version, but may differ in detail to
240 | address new problems or concerns.
241 |
242 | Each version is given a distinguishing version number. If the Program
243 | specifies a version number of this License which applies to it and "any
244 | later version", you have the option of following the terms and conditions
245 | either of that version or of any later version published by the Free
246 | Software Foundation. If the Program does not specify a version number of
247 | this License, you may choose any version ever published by the Free Software
248 | Foundation.
249 |
250 | 10. If you wish to incorporate parts of the Program into other free
251 | programs whose distribution conditions are different, write to the author
252 | to ask for permission. For software which is copyrighted by the Free
253 | Software Foundation, write to the Free Software Foundation; we sometimes
254 | make exceptions for this. Our decision will be guided by the two goals
255 | of preserving the free status of all derivatives of our free software and
256 | of promoting the sharing and reuse of software generally.
257 |
258 | NO WARRANTY
259 |
260 | 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
261 | FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
262 | OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
263 | PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
264 | OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
265 | MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS
266 | TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE
267 | PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
268 | REPAIR OR CORRECTION.
269 |
270 | 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
271 | WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
272 | REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
273 | INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
274 | OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
275 | TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
276 | YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
277 | PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
278 | POSSIBILITY OF SUCH DAMAGES.
279 |
280 | END OF TERMS AND CONDITIONS
281 |
282 | How to Apply These Terms to Your New Programs
283 |
284 | If you develop a new program, and you want it to be of the greatest
285 | possible use to the public, the best way to achieve this is to make it
286 | free software which everyone can redistribute and change under these terms.
287 |
288 | To do so, attach the following notices to the program. It is safest
289 | to attach them to the start of each source file to most effectively
290 | convey the exclusion of warranty; and each file should have at least
291 | the "copyright" line and a pointer to where the full notice is found.
292 |
293 | {description}
294 | Copyright (C) {year} {fullname}
295 |
296 | This program is free software; you can redistribute it and/or modify
297 | it under the terms of the GNU General Public License as published by
298 | the Free Software Foundation; either version 2 of the License, or
299 | (at your option) any later version.
300 |
301 | This program is distributed in the hope that it will be useful,
302 | but WITHOUT ANY WARRANTY; without even the implied warranty of
303 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
304 | GNU General Public License for more details.
305 |
306 | You should have received a copy of the GNU General Public License along
307 | with this program; if not, write to the Free Software Foundation, Inc.,
308 | 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
309 |
310 | Also add information on how to contact you by electronic and paper mail.
311 |
312 | If the program is interactive, make it output a short notice like this
313 | when it starts in an interactive mode:
314 |
315 | Gnomovision version 69, Copyright (C) year name of author
316 | Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
317 | This is free software, and you are welcome to redistribute it
318 | under certain conditions; type `show c' for details.
319 |
320 | The hypothetical commands `show w' and `show c' should show the appropriate
321 | parts of the General Public License. Of course, the commands you use may
322 | be called something other than `show w' and `show c'; they could even be
323 | mouse-clicks or menu items--whatever suits your program.
324 |
325 | You should also get your employer (if you work as a programmer) or your
326 | school, if any, to sign a "copyright disclaimer" for the program, if
327 | necessary. Here is a sample; alter the names:
328 |
329 | Yoyodyne, Inc., hereby disclaims all copyright interest in the program
330 | `Gnomovision' (which makes passes at compilers) written by James Hacker.
331 |
332 | {signature of Ty Coon}, 1 April 1989
333 | Ty Coon, President of Vice
334 |
335 | This General Public License does not permit incorporating your program into
336 | proprietary programs. If your program is a subroutine library, you may
337 | consider it more useful to permit linking proprietary applications with the
338 | library. If this is what you want to do, use the GNU Lesser General
339 | Public License instead of this License.
340 |
341 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # `hapi-auth-github` makes it *easy* to
2 |
3 | **GitHub Authentication** Plugin for Hapi.js Apps with ***detailed documentation***.
4 |
5 | [](https://travis-ci.org/dwyl/hapi-auth-github)
6 | [](https://codecov.io/github/dwyl/hapi-auth-github?branch=master)
7 | [](https://github.com/dwyl/goodparts)
8 | [](https://codeclimate.com/github/dwyl/hapi-auth-github)
9 | [](https://david-dm.org/dwyl/hapi-auth-github)
10 | [](https://david-dm.org/dwyl/hapi-auth-github?type=dev)
11 | ## Why?
12 |
13 | We use *GitHub* for ***all*** our coding projects and are building
14 | a tool to keep track of all them: https://github.com/dwyl/tudo
15 |
16 | Given that other people will have projects that need GitHub Authentication,
17 | we have *de-coupled* our OAuth code into this re-useable Hapi Plugin.
18 |
19 | > If you have _any_ questions or would like to *contribute* to this module,
20 | please get in touch:
21 | [](https://gitter.im/dwyl/chat?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge)
22 |
23 | ## *What*?
24 |
25 | An easy-to-use Hapi.js plugin that gives you GitHub OAuth Authentication
26 | in a few simple steps and has *human-readable*, maintained code.
27 |
28 | > Note: if you are new to Hapi check out:
29 | https://github.com/dwyl/learn-hapi
30 |
31 | ## How?
32 |
33 | If you're *new* to GitHub Authentication, and want to *understand* how it works, read the GitHub OAuth Web Application flow:
34 | https://developer.github.com/v3/oauth/#web-application-flow
35 |
36 | *Or*, if you just need to get up and running *fast*, follow these simple steps:
37 |
38 | ### 1. Install `hapi-auth-github` from NPM
39 |
40 | Install the plugin from npm and save it to your `package.json`:
41 |
42 | ```sh
43 | npm install hapi-auth-github --save
44 | ```
45 |
46 | ### 2. Create an App on GitHub
47 |
48 | Follow the instructions in:
49 | [GITHUB-APP-STEP-BY-STEP-GUIDE.md](https://github.com/dwyl/hapi-auth-github/blob/master/GITHUB-APP-STEP-BY-STEP-GUIDE.md)
50 |
51 | ### 3. Export the *Required* Environment Variables
52 |
53 | Once you've created your app following the [*GitHub App Step-by-Step Guide*](https://github.com/dwyl/hapi-auth-github/blob/master/GITHUB-APP-STEP-BY-STEP-GUIDE.md)
54 |
55 | Export the Environment Variables:
56 | ```sh
57 | BASE_URL=http://localhost:8000 # same as Authorized JavaScript Origin
58 | GITHUB_CLIENT_ID=YourGitHubClientID
59 | GITHUB_CLIENT_SECRET=SuperSecret
60 | GITHUB_AUTH_REDIRECT_URL=/githubauth
61 | PORT=8000
62 |
63 | # Optionals
64 | # (If you are using hapi-auth-jwt2)
65 | JWT_SECRET=ItsNoSecretBecauseYouToldEverybody
66 | # If you are using custom instance of GitHub
67 | GITHUB_HOSTNAME=github.mycompany.com
68 | GITHUB_API_HOSTNAME=api.github.mycompany.com
69 | ```
70 |
71 | #### Notes on Environment Variables:
72 |
73 | > Tip: If you (*or anyone on your team*) are new to
74 | Environment Variables or need a refresher,
75 | see: [https://github.com/dwyl/**learn-environment-variables**](https://github.com/dwyl/learn-environment-variables)
76 |
77 | We named/exported the 5 variables prefixed with `GITHUB_`
78 | to _distinguish_ them from other services you may be using which
79 | may also have an environment variable named `CLIENT_ID`...
80 |
81 | The `BASE_URL` is required to know which url your app is using.
82 | it needs to be identical to the `Authorized JavaScript Origin`
83 | that you set in step 2 above.
84 |
85 | The `GITHUB_AUTH_REDIRECT_URL` is the url (*endpoint*) where GitHub will
86 | send the initial OAuth2 `code` to _confirm_ your application is *real*.
87 | Make *sure* that the url is *identical* to the one you defined when
88 | setting up your app on GitHub. e.g: http://localhost:8000/githubauth
89 |
90 | The `GITHUB_HOSTNAME` and `GITHUB_API_HOSTNAME` let's you define
91 | other instance of GitHub e.g. enterprise. Defaults are `github.com`
92 | and `api.github.com` accordingly.
93 |
94 | ### 4. Create Your (Custom) Handler Function
95 |
96 | This is where you *decide* what to do with the person's `profile` details
97 | once they have authorized your App to use their GitHub details.
98 |
99 | Your custom handler should have the following signature:
100 | ```js
101 | function custom_handler(request, reply, tokens, profile) {
102 | // save the profile as a session so you can personalize their experience of your app
103 | // use the reply() to send a response/view to the visitor
104 | }
105 | ```
106 | The handler function parameters are:
107 | + **request** is the hapi request object with all the properties.
108 | + **reply** is the standard hapi reply object used to send your response to the client or send a rendered view.
109 | + ***tokens*** are the OAuth2 tokens returned by GitHub for the session
110 | see: [**sample_auth_token.json**](https://github.com/dwyl/hapi-auth-github/blob/master/test/fixtures/sample-auth-token.json)
111 | + ***profile*** is the person's GitHub profile
112 | see: [**sample_profile.json**](https://github.com/dwyl/hapi-auth-github/blob/master/test/fixtures/sample-profile.json)
113 |
114 | > For an *example* custom_handler, see:
115 | [example/**github_oauth_handler.js**](https://github.com/dwyl/hapi-auth-github/blob/605c9d59f6d26cbfbd2fbcf932fa9efb78d4aa5f/example/github_oauth_handler.js#L3)
116 |
117 | ### 5. Register the Plugin into your Hapi.js Server
118 |
119 | The final step is to register the plugin into your Hapi.js Server
120 | declaring your desired options:
121 |
122 | ```js
123 | // declare your desired options for the plugin
124 | var opts = {
125 | handler: require('./github_oauth_handler.js'), // your handler
126 | SCOPE: 'user' // ask for their public email address
127 | };
128 |
129 | server.register([{ register: require('hapi-auth-github'), options:opts }],
130 | function (err) {
131 | if(err){
132 | // handle the error if the plugin failed to load:
133 | }
134 | // the rest of your app ...
135 | });
136 | ```
137 |
138 | #### `options` *explained*
139 |
140 | + `handler` - the handler you defined above in **step 4**
141 | which is your custom logic for GitHub auth enabled app.
142 | + `SCOPE` - these are the ***permissions*** your app is requesting.
143 |
144 |
145 | ## Implementation Notes:
146 |
147 | To run the *example* you will need an extra environment variable:
148 | ```sh
149 | BASE_URL=http://localhost:8000 # same as Authorized JavaScript Origin
150 | GITHUB_CLIENT_ID=YourGitHubClientID
151 | GITHUB_CLIENT_SECRET=SuperSecret
152 | GITHUB_AUTH_REDIRECT_URL=/githubauth
153 | PORT=8000
154 | # Optionally (If you are using hapi-auth-jwt2)
155 | JWT_SECRET=ItsNoSecretBecauseYouToldEverybody
156 | ```
157 |
158 | > Also, if you're wondering what that `JWT_SECRET` *Environment Variables* is for,
159 | see: [https://github.com/dwyl/**learn-json-web-tokens**](https://github.com/dwyl/learn-json-web-tokens)
160 |
161 |
162 | ## Background Reading
163 |
164 | + Basics: https://developer.github.com/guides/basics-of-authentication
165 | + Intro to OAuth2: https://www.digitalocean.com/community/tutorials/an-introduction-to-oauth-2
166 | + GitHub OAuth Scopes: https://developer.github.com/v3/oauth/#scopes
167 | (*what you should ask to access on a person' GitHub account*)
168 |
--------------------------------------------------------------------------------
/example/github_oauth_handler.js:
--------------------------------------------------------------------------------
1 | var JWT = require('jsonwebtoken'); // session stored as a JWT cookie
2 |
3 | module.exports = function custom_handler(req, reply, tokens, profile) {
4 | if(profile) {
5 | // console.log(JSON.stringify(profile, null, 2));
6 | // extract the relevant data from Profile to store in JWT object
7 | var session = {
8 | fistname : profile.name, // the person's name e.g: Anita
9 | image : profile.avatar_url, // profile image url
10 | id : profile.id, // their github id
11 | // exp : Math.floor(new Date().getTime()/1000) + 7*24*60*60, // Epiry in seconds!
12 | agent : req.headers['user-agent']
13 | }
14 | // create a JWT to set as the cookie:
15 | var token = JWT.sign(session, process.env.JWT_SECRET);
16 | // store the Profile and Oauth tokens in the Redis DB using G+ id as key
17 | // Detailed Example...? https://github.com/dwyl/hapi-auth-google/issues/2
18 |
19 | // reply to client with a view
20 | return reply("Hello " +profile.name + ", You Logged in Using GitHub!")
21 | .state('token', token); // see: http://hapijs.com/tutorials/cookies
22 | }
23 | else {
24 | return reply("Sorry, something went wrong, please try again.").code(401);
25 | }
26 | }
27 |
--------------------------------------------------------------------------------
/example/github_server.js:
--------------------------------------------------------------------------------
1 | require('env2')('.env');
2 | var querystring = require('querystring'); // nodejs.org/api/querystring.html
3 | var assert = require('assert');
4 | var Hapi = require('hapi');
5 |
6 | var server = new Hapi.Server();
7 | server.connection({
8 | host: 'localhost',
9 | port: Number(process.env.PORT)
10 | });
11 |
12 | var opts = {
13 | handler: require('./github_oauth_handler.js'), // your handler
14 | SCOPE: 'user' // get user's profile see: developer.github.com/v3/oauth/#scopes
15 | };
16 |
17 | var hapi_auth_github = require('../lib');
18 |
19 | server.register([{ register: hapi_auth_github, options:opts }], function (err) {
20 | // handle the error if the plugin failed to load:
21 | assert(!err, "FAILED TO LOAD PLUGIN!!! :-("); // fatal error
22 | });
23 |
24 | server.route({
25 | method: 'GET',
26 | path: '/',
27 | handler: function(req, reply) {
28 | var url = hapi_auth_github.login_url();
29 | console.log(url);
30 | var src = 'https://cloud.githubusercontent.com/assets/194400/11214293/4e309bf2-8d38-11e5-8d46-b347b2bd242e.png';
31 | var btn = '
';
32 | reply(btn);
33 | }
34 | });
35 |
36 | server.start(function(err){ // boots your server
37 | assert(!err, "FAILED TO Start Server");
38 | console.log('Now Visit: http://localhost:'+server.info.port);
39 | });
40 |
41 | module.exports = server;
42 |
--------------------------------------------------------------------------------
/lib/http_request.js:
--------------------------------------------------------------------------------
1 | 'use strict';
2 |
3 | var http = require('https'); // ALWAYS use TLS over the internets!
4 |
5 | /**
6 | * request is a bare-bones http request using node.js core http module
7 | * see: https://nodejs.org/api/http.html#http_http_request_options_callback
8 | * @param {Object} options - any valid request options (e.g. method or path)
9 | * @param {Function} callback - called once request has finished
10 | * @returns {Boolean} callback - no point returning anything else ...!
11 | */
12 | module.exports = function request (options, callback) {
13 | var file = __filename;
14 | var msg = 'http.request requires valid http request options';
15 | var req; // http request defined below
16 |
17 | if (!options || !options.hostname || !options.port || !options.path) {
18 | throw new Error('ERROR: ' + file + ':17 \n' + msg);
19 | }
20 | // check for existence of a callback function
21 | if (!callback || typeof callback !== 'function') {
22 | msg = 'http.request is Asynchronous, callback required as second param!';
23 | throw new Error('ERROR: ' + file + ':21 \n' + msg);
24 | }
25 | req = http.request(options, function (res) {
26 | var resStr = '';
27 | var response;
28 |
29 | if (res.statusCode !== 200) {
30 | return callback(200);
31 | }
32 |
33 | res.setEncoding('utf8');
34 | res.on('data', function (chunk) {
35 | resStr += chunk;
36 | }).on('end', function () {
37 | response = JSON.parse(resStr);
38 |
39 | return callback(null, response); // return response as object
40 | });
41 |
42 | return true;
43 | }).on('error', function (e) {
44 | return callback(e);
45 | });
46 | // write to request body if passed to options
47 | if (options.body) {
48 | req.write(options.body);
49 | }
50 | req.end();
51 | };
52 |
--------------------------------------------------------------------------------
/lib/index.js:
--------------------------------------------------------------------------------
1 | 'use strict';
2 |
3 | var OPTIONS; // global object set when plugin loads
4 | var crypto = require('crypto'); // http://nodejs.org/api/crypto.html
5 | var pkg = require('../package.json');
6 | var request = require('./http_request');
7 | var querystring = require('querystring'); // nodejs.org/api/querystring.html
8 |
9 | /**
10 | * make_post_data simply extracts the code and state (hash) from the request
11 | * and combines those data with the GitHub Client Id & Secret as a query string
12 | * @param {Object} req - the request object sent by GitHub with code & state
13 | * @returns {Object} the stringified object required to request OAuth2 Token
14 | */
15 | function make_post_data (req) {
16 | return querystring.stringify({
17 | client_id: process.env.GITHUB_CLIENT_ID,
18 | client_secret: process.env.GITHUB_CLIENT_SECRET,
19 | code: req.query.code,
20 | state: req.query.state
21 | });
22 | }
23 |
24 | /**
25 | * http.request options for requesting the OAuth2 token
26 | * see: developer.github.com/v3/oauth/#github-redirects-back-to-your-site
27 | * @param {String} post_data the POST data we are sending to GitHub
28 | * @returns {Object} data & headers we are sending to GitHub in our HTTP request
29 | */
30 | function token_options (post_data) {
31 | return {
32 | body: post_data, // see make_post_data above
33 | headers: {
34 | 'Accept': 'application/json',
35 | 'Content-Type': 'application/x-www-form-urlencoded',
36 | 'Content-Length': post_data.length
37 | },
38 | hostname: process.env.GITHUB_HOSTNAME || 'github.com',
39 | method: 'POST',
40 | path: '/login/oauth/access_token',
41 | port: 443
42 | };
43 | }
44 | /**
45 | * http request to get the profile of the person that just authenticated
46 | * see: https://developer.github.com/v3/users/#get-the-authenticated-user
47 | * @param {Object} access_json returned by GitHub OAuth access_token request.
48 | * @returns {Object} data & headers we are sending to GitHub in our HTTP request
49 | */
50 | function user_options (access_json) {
51 | return {
52 | headers: {
53 | 'Authorization': 'token ' + access_json.access_token,
54 | 'Accept': 'application/json',
55 | 'User-Agent': 'hapi-auth-github' // a User-Agent is *REQUIRED*!!
56 | },
57 | hostname: process.env.GITHUB_API_HOSTNAME || 'api.github.com',
58 | method: 'GET',
59 | path: '/user',
60 | port: 443
61 | };
62 | }
63 |
64 | /**
65 | * this plugin creates the github Oauth Callback URL
66 | * e.g: /githubauth where github calls back to with the OAuth code
67 | * @param {Object} server - the Hapi server object/instance
68 | * @param {Object} options - any valid request options (e.g. method or path)
69 | * @param {Function} next - called once plugin has been registered
70 | * @returns {Boolean} callback - no point returning anything else ...!
71 | */
72 | exports.register = function (server, options, next) {
73 | OPTIONS = options; // should we check the options have been set?
74 | server.route([
75 | {
76 | method: 'GET', // ping
77 | path: process.env.GITHUB_AUTH_REDIRECT_URL, // must be identical to Authorized callback URL
78 | config: { auth: false },
79 | handler: function (req, reply) {
80 | var post_data = make_post_data(req);
81 | var options1 = token_options(post_data);
82 |
83 | request(options1, function (err, oauth_access_token_json) {
84 | var options2;
85 | var profile = null;
86 |
87 | server.log('error', err); // see: github.com/dwyl/hapi-error#logging
88 | options2 = user_options(oauth_access_token_json);
89 |
90 | request(options2, function (oauth_err, user_profile) {
91 | if (oauth_err) {
92 | server.log('error', oauth_err); // add "good" logging to see logs
93 | } else {
94 | profile = user_profile;
95 | }
96 | OPTIONS.handler(req, reply, oauth_access_token_json, profile);
97 |
98 | return true;
99 | });
100 | });
101 | }
102 | }
103 | ]);
104 |
105 | return next(); // everything worked, continue booting the hapi server!
106 | };
107 |
108 | exports.register.attributes = { pkg: pkg };
109 |
110 | module.exports.login_url = function () {
111 | var params = {
112 | client_id: process.env.GITHUB_CLIENT_ID,
113 | redirect_uri: process.env.BASE_URL + process.env.GITHUB_AUTH_REDIRECT_URL,
114 | scope: OPTIONS.SCOPE,
115 | state: crypto.createHash('sha256')
116 | .update(Math.random().toString())
117 | .digest('hex')
118 | };
119 | var qs = querystring.stringify(params);
120 | var url = 'https://github.com/login/oauth/authorize?' + qs;
121 |
122 | return url;
123 | };
124 |
--------------------------------------------------------------------------------
/package-lock.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "hapi-auth-github",
3 | "version": "2.0.0",
4 | "lockfileVersion": 1,
5 | "requires": true,
6 | "dependencies": {
7 | "abbrev": {
8 | "version": "1.0.9",
9 | "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.0.9.tgz",
10 | "integrity": "sha1-kbR5JYinc4wl813W9jdSovh3YTU=",
11 | "dev": true
12 | },
13 | "acorn": {
14 | "version": "5.2.1",
15 | "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.2.1.tgz",
16 | "integrity": "sha512-jG0u7c4Ly+3QkkW18V+NRDN+4bWHdln30NL1ZL2AvFZZmQe/BfopYCtghCKKVBUSetZ4QKcyA0pY6/4Gw8Pv8w==",
17 | "dev": true
18 | },
19 | "acorn-jsx": {
20 | "version": "3.0.1",
21 | "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-3.0.1.tgz",
22 | "integrity": "sha1-r9+UiPsezvyDSPb7IvRk4ypYs2s=",
23 | "dev": true,
24 | "requires": {
25 | "acorn": "3.3.0"
26 | },
27 | "dependencies": {
28 | "acorn": {
29 | "version": "3.3.0",
30 | "resolved": "https://registry.npmjs.org/acorn/-/acorn-3.3.0.tgz",
31 | "integrity": "sha1-ReN/s56No/JbruP/U2niu18iAXo=",
32 | "dev": true
33 | }
34 | }
35 | },
36 | "ajv": {
37 | "version": "4.11.8",
38 | "resolved": "https://registry.npmjs.org/ajv/-/ajv-4.11.8.tgz",
39 | "integrity": "sha1-gv+wKynmYq5TvcIK8VlHcGc5xTY=",
40 | "dev": true,
41 | "requires": {
42 | "co": "4.6.0",
43 | "json-stable-stringify": "1.0.1"
44 | }
45 | },
46 | "ajv-keywords": {
47 | "version": "1.5.1",
48 | "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-1.5.1.tgz",
49 | "integrity": "sha1-MU3QpLM2j609/NxU7eYXG4htrzw=",
50 | "dev": true
51 | },
52 | "align-text": {
53 | "version": "0.1.4",
54 | "resolved": "https://registry.npmjs.org/align-text/-/align-text-0.1.4.tgz",
55 | "integrity": "sha1-DNkKVhCT810KmSVsIrcGlDP60Rc=",
56 | "dev": true,
57 | "requires": {
58 | "kind-of": "3.2.2",
59 | "longest": "1.0.1",
60 | "repeat-string": "1.6.1"
61 | }
62 | },
63 | "amdefine": {
64 | "version": "1.0.1",
65 | "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz",
66 | "integrity": "sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU=",
67 | "dev": true
68 | },
69 | "ansi-align": {
70 | "version": "2.0.0",
71 | "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-2.0.0.tgz",
72 | "integrity": "sha1-w2rsy6VjuJzrVW82kPCx2eNUf38=",
73 | "dev": true,
74 | "requires": {
75 | "string-width": "2.1.1"
76 | },
77 | "dependencies": {
78 | "ansi-regex": {
79 | "version": "3.0.0",
80 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz",
81 | "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=",
82 | "dev": true
83 | },
84 | "is-fullwidth-code-point": {
85 | "version": "2.0.0",
86 | "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz",
87 | "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=",
88 | "dev": true
89 | },
90 | "string-width": {
91 | "version": "2.1.1",
92 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz",
93 | "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==",
94 | "dev": true,
95 | "requires": {
96 | "is-fullwidth-code-point": "2.0.0",
97 | "strip-ansi": "4.0.0"
98 | }
99 | },
100 | "strip-ansi": {
101 | "version": "4.0.0",
102 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz",
103 | "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=",
104 | "dev": true,
105 | "requires": {
106 | "ansi-regex": "3.0.0"
107 | }
108 | }
109 | }
110 | },
111 | "ansi-escapes": {
112 | "version": "1.4.0",
113 | "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-1.4.0.tgz",
114 | "integrity": "sha1-06ioOzGapneTZisT52HHkRQiMG4=",
115 | "dev": true
116 | },
117 | "ansi-regex": {
118 | "version": "2.1.1",
119 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz",
120 | "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=",
121 | "dev": true
122 | },
123 | "ansi-styles": {
124 | "version": "2.2.1",
125 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz",
126 | "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=",
127 | "dev": true
128 | },
129 | "anymatch": {
130 | "version": "1.3.2",
131 | "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-1.3.2.tgz",
132 | "integrity": "sha512-0XNayC8lTHQ2OI8aljNCN3sSx6hsr/1+rlcDAotXJR7C1oZZHCNsfpbKwMjRA3Uqb5tF1Rae2oloTr4xpq+WjA==",
133 | "dev": true,
134 | "requires": {
135 | "micromatch": "2.3.11",
136 | "normalize-path": "2.1.1"
137 | }
138 | },
139 | "argparse": {
140 | "version": "1.0.9",
141 | "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.9.tgz",
142 | "integrity": "sha1-c9g7wmP4bpf4zE9rrhsOkKfSLIY=",
143 | "dev": true,
144 | "requires": {
145 | "sprintf-js": "1.0.3"
146 | }
147 | },
148 | "arr-diff": {
149 | "version": "2.0.0",
150 | "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-2.0.0.tgz",
151 | "integrity": "sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8=",
152 | "dev": true,
153 | "requires": {
154 | "arr-flatten": "1.1.0"
155 | }
156 | },
157 | "arr-flatten": {
158 | "version": "1.1.0",
159 | "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz",
160 | "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==",
161 | "dev": true
162 | },
163 | "array-union": {
164 | "version": "1.0.2",
165 | "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz",
166 | "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=",
167 | "dev": true,
168 | "requires": {
169 | "array-uniq": "1.0.3"
170 | }
171 | },
172 | "array-uniq": {
173 | "version": "1.0.3",
174 | "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz",
175 | "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=",
176 | "dev": true
177 | },
178 | "array-unique": {
179 | "version": "0.2.1",
180 | "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.2.1.tgz",
181 | "integrity": "sha1-odl8yvy8JiXMcPrc6zalDFiwGlM=",
182 | "dev": true
183 | },
184 | "arrify": {
185 | "version": "1.0.1",
186 | "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz",
187 | "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=",
188 | "dev": true
189 | },
190 | "assertion-error": {
191 | "version": "1.0.2",
192 | "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.0.2.tgz",
193 | "integrity": "sha1-E8pRXYYgbaC6xm6DTdOX2HWBCUw=",
194 | "dev": true
195 | },
196 | "async": {
197 | "version": "1.5.2",
198 | "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz",
199 | "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=",
200 | "dev": true
201 | },
202 | "async-each": {
203 | "version": "1.0.1",
204 | "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.1.tgz",
205 | "integrity": "sha1-GdOGodntxufByF04iu28xW0zYC0=",
206 | "dev": true
207 | },
208 | "babel-code-frame": {
209 | "version": "6.26.0",
210 | "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz",
211 | "integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=",
212 | "dev": true,
213 | "requires": {
214 | "chalk": "1.1.3",
215 | "esutils": "2.0.2",
216 | "js-tokens": "3.0.2"
217 | }
218 | },
219 | "balanced-match": {
220 | "version": "1.0.0",
221 | "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz",
222 | "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=",
223 | "dev": true
224 | },
225 | "base64url": {
226 | "version": "2.0.0",
227 | "resolved": "https://registry.npmjs.org/base64url/-/base64url-2.0.0.tgz",
228 | "integrity": "sha1-6sFuA+oUOO/5Qj1puqNiYu0fcLs=",
229 | "dev": true
230 | },
231 | "binary-extensions": {
232 | "version": "1.11.0",
233 | "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.11.0.tgz",
234 | "integrity": "sha1-RqoXUftqL5PuXmibsQh9SxTGwgU=",
235 | "dev": true
236 | },
237 | "boxen": {
238 | "version": "1.3.0",
239 | "resolved": "https://registry.npmjs.org/boxen/-/boxen-1.3.0.tgz",
240 | "integrity": "sha512-TNPjfTr432qx7yOjQyaXm3dSR0MH9vXp7eT1BFSl/C51g+EFnOR9hTg1IreahGBmDNCehscshe45f+C1TBZbLw==",
241 | "dev": true,
242 | "requires": {
243 | "ansi-align": "2.0.0",
244 | "camelcase": "4.1.0",
245 | "chalk": "2.3.0",
246 | "cli-boxes": "1.0.0",
247 | "string-width": "2.1.1",
248 | "term-size": "1.2.0",
249 | "widest-line": "2.0.0"
250 | },
251 | "dependencies": {
252 | "ansi-regex": {
253 | "version": "3.0.0",
254 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz",
255 | "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=",
256 | "dev": true
257 | },
258 | "ansi-styles": {
259 | "version": "3.2.0",
260 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.0.tgz",
261 | "integrity": "sha512-NnSOmMEYtVR2JVMIGTzynRkkaxtiq1xnFBcdQD/DnNCYPoEPsVJhM98BDyaoNOQIi7p4okdi3E27eN7GQbsUug==",
262 | "dev": true,
263 | "requires": {
264 | "color-convert": "1.9.1"
265 | }
266 | },
267 | "camelcase": {
268 | "version": "4.1.0",
269 | "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz",
270 | "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=",
271 | "dev": true
272 | },
273 | "chalk": {
274 | "version": "2.3.0",
275 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.3.0.tgz",
276 | "integrity": "sha512-Az5zJR2CBujap2rqXGaJKaPHyJ0IrUimvYNX+ncCy8PJP4ltOGTrHUIo097ZaL2zMeKYpiCdqDvS6zdrTFok3Q==",
277 | "dev": true,
278 | "requires": {
279 | "ansi-styles": "3.2.0",
280 | "escape-string-regexp": "1.0.5",
281 | "supports-color": "4.5.0"
282 | }
283 | },
284 | "has-flag": {
285 | "version": "2.0.0",
286 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-2.0.0.tgz",
287 | "integrity": "sha1-6CB68cx7MNRGzHC3NLXovhj4jVE=",
288 | "dev": true
289 | },
290 | "is-fullwidth-code-point": {
291 | "version": "2.0.0",
292 | "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz",
293 | "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=",
294 | "dev": true
295 | },
296 | "string-width": {
297 | "version": "2.1.1",
298 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz",
299 | "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==",
300 | "dev": true,
301 | "requires": {
302 | "is-fullwidth-code-point": "2.0.0",
303 | "strip-ansi": "4.0.0"
304 | }
305 | },
306 | "strip-ansi": {
307 | "version": "4.0.0",
308 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz",
309 | "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=",
310 | "dev": true,
311 | "requires": {
312 | "ansi-regex": "3.0.0"
313 | }
314 | },
315 | "supports-color": {
316 | "version": "4.5.0",
317 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.5.0.tgz",
318 | "integrity": "sha1-vnoN5ITexcXN34s9WRJQRJEvY1s=",
319 | "dev": true,
320 | "requires": {
321 | "has-flag": "2.0.0"
322 | }
323 | }
324 | }
325 | },
326 | "brace-expansion": {
327 | "version": "1.1.8",
328 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.8.tgz",
329 | "integrity": "sha1-wHshHHyVLsH479Uad+8NHTmQopI=",
330 | "dev": true,
331 | "requires": {
332 | "balanced-match": "1.0.0",
333 | "concat-map": "0.0.1"
334 | }
335 | },
336 | "braces": {
337 | "version": "1.8.5",
338 | "resolved": "https://registry.npmjs.org/braces/-/braces-1.8.5.tgz",
339 | "integrity": "sha1-uneWLhLf+WnWt2cR6RS3N4V79qc=",
340 | "dev": true,
341 | "requires": {
342 | "expand-range": "1.8.2",
343 | "preserve": "0.2.0",
344 | "repeat-element": "1.1.2"
345 | }
346 | },
347 | "buffer-equal-constant-time": {
348 | "version": "1.0.1",
349 | "resolved": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz",
350 | "integrity": "sha1-+OcRMvf/5uAaXJaXpMbz5I1cyBk=",
351 | "dev": true
352 | },
353 | "caller-path": {
354 | "version": "0.1.0",
355 | "resolved": "https://registry.npmjs.org/caller-path/-/caller-path-0.1.0.tgz",
356 | "integrity": "sha1-lAhe9jWB7NPaqSREqP6U6CV3dR8=",
357 | "dev": true,
358 | "requires": {
359 | "callsites": "0.2.0"
360 | }
361 | },
362 | "callsites": {
363 | "version": "0.2.0",
364 | "resolved": "https://registry.npmjs.org/callsites/-/callsites-0.2.0.tgz",
365 | "integrity": "sha1-r6uWJikQp/M8GaV3WCXGnzTjUMo=",
366 | "dev": true
367 | },
368 | "camelcase": {
369 | "version": "1.2.1",
370 | "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-1.2.1.tgz",
371 | "integrity": "sha1-m7UwTS4LVmmLLHWLCKPqqdqlijk=",
372 | "dev": true,
373 | "optional": true
374 | },
375 | "capture-stack-trace": {
376 | "version": "1.0.0",
377 | "resolved": "https://registry.npmjs.org/capture-stack-trace/-/capture-stack-trace-1.0.0.tgz",
378 | "integrity": "sha1-Sm+gc5nCa7pH8LJJa00PtAjFVQ0=",
379 | "dev": true
380 | },
381 | "center-align": {
382 | "version": "0.1.3",
383 | "resolved": "https://registry.npmjs.org/center-align/-/center-align-0.1.3.tgz",
384 | "integrity": "sha1-qg0yYptu6XIgBBHL1EYckHvCt60=",
385 | "dev": true,
386 | "optional": true,
387 | "requires": {
388 | "align-text": "0.1.4",
389 | "lazy-cache": "1.0.4"
390 | }
391 | },
392 | "chai": {
393 | "version": "3.5.0",
394 | "resolved": "https://registry.npmjs.org/chai/-/chai-3.5.0.tgz",
395 | "integrity": "sha1-TQJjewZ/6Vi9v906QOxW/vc3Mkc=",
396 | "dev": true,
397 | "requires": {
398 | "assertion-error": "1.0.2",
399 | "deep-eql": "0.1.3",
400 | "type-detect": "1.0.0"
401 | }
402 | },
403 | "chalk": {
404 | "version": "1.1.3",
405 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
406 | "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
407 | "dev": true,
408 | "requires": {
409 | "ansi-styles": "2.2.1",
410 | "escape-string-regexp": "1.0.5",
411 | "has-ansi": "2.0.0",
412 | "strip-ansi": "3.0.1",
413 | "supports-color": "2.0.0"
414 | }
415 | },
416 | "chokidar": {
417 | "version": "1.7.0",
418 | "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-1.7.0.tgz",
419 | "integrity": "sha1-eY5ol3gVHIB2tLNg5e3SjNortGg=",
420 | "dev": true,
421 | "requires": {
422 | "anymatch": "1.3.2",
423 | "async-each": "1.0.1",
424 | "fsevents": "1.1.3",
425 | "glob-parent": "2.0.0",
426 | "inherits": "2.0.3",
427 | "is-binary-path": "1.0.1",
428 | "is-glob": "2.0.1",
429 | "path-is-absolute": "1.0.1",
430 | "readdirp": "2.1.0"
431 | }
432 | },
433 | "circular-json": {
434 | "version": "0.3.3",
435 | "resolved": "https://registry.npmjs.org/circular-json/-/circular-json-0.3.3.tgz",
436 | "integrity": "sha512-UZK3NBx2Mca+b5LsG7bY183pHWt5Y1xts4P3Pz7ENTwGVnJOUWbRb3ocjvX7hx9tq/yTAdclXm9sZ38gNuem4A==",
437 | "dev": true
438 | },
439 | "cli-boxes": {
440 | "version": "1.0.0",
441 | "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-1.0.0.tgz",
442 | "integrity": "sha1-T6kXw+WclKAEzWH47lCdplFocUM=",
443 | "dev": true
444 | },
445 | "cli-cursor": {
446 | "version": "1.0.2",
447 | "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-1.0.2.tgz",
448 | "integrity": "sha1-ZNo/fValRBLll5S9Ytw1KV6PKYc=",
449 | "dev": true,
450 | "requires": {
451 | "restore-cursor": "1.0.1"
452 | }
453 | },
454 | "cli-width": {
455 | "version": "2.2.0",
456 | "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.0.tgz",
457 | "integrity": "sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk=",
458 | "dev": true
459 | },
460 | "cliui": {
461 | "version": "2.1.0",
462 | "resolved": "https://registry.npmjs.org/cliui/-/cliui-2.1.0.tgz",
463 | "integrity": "sha1-S0dXYP+AJkx2LDoXGQMukcf+oNE=",
464 | "dev": true,
465 | "optional": true,
466 | "requires": {
467 | "center-align": "0.1.3",
468 | "right-align": "0.1.3",
469 | "wordwrap": "0.0.2"
470 | },
471 | "dependencies": {
472 | "wordwrap": {
473 | "version": "0.0.2",
474 | "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.2.tgz",
475 | "integrity": "sha1-t5Zpu0LstAn4PVg8rVLKF+qhZD8=",
476 | "dev": true,
477 | "optional": true
478 | }
479 | }
480 | },
481 | "co": {
482 | "version": "4.6.0",
483 | "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz",
484 | "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=",
485 | "dev": true
486 | },
487 | "code-point-at": {
488 | "version": "1.1.0",
489 | "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz",
490 | "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=",
491 | "dev": true
492 | },
493 | "color-convert": {
494 | "version": "1.9.1",
495 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.1.tgz",
496 | "integrity": "sha512-mjGanIiwQJskCC18rPR6OmrZ6fm2Lc7PeGFYwCmy5J34wC6F1PzdGL6xeMfmgicfYcNLGuVFA3WzXtIDCQSZxQ==",
497 | "dev": true,
498 | "requires": {
499 | "color-name": "1.1.3"
500 | }
501 | },
502 | "color-name": {
503 | "version": "1.1.3",
504 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
505 | "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=",
506 | "dev": true
507 | },
508 | "concat-map": {
509 | "version": "0.0.1",
510 | "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
511 | "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=",
512 | "dev": true
513 | },
514 | "concat-stream": {
515 | "version": "1.6.0",
516 | "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.0.tgz",
517 | "integrity": "sha1-CqxmL9Ur54lk1VMvaUeE5wEQrPc=",
518 | "dev": true,
519 | "requires": {
520 | "inherits": "2.0.3",
521 | "readable-stream": "2.3.3",
522 | "typedarray": "0.0.6"
523 | }
524 | },
525 | "configstore": {
526 | "version": "3.1.1",
527 | "resolved": "https://registry.npmjs.org/configstore/-/configstore-3.1.1.tgz",
528 | "integrity": "sha512-5oNkD/L++l0O6xGXxb1EWS7SivtjfGQlRyxJsYgE0Z495/L81e2h4/d3r969hoPXuFItzNOKMtsXgYG4c7dYvw==",
529 | "dev": true,
530 | "requires": {
531 | "dot-prop": "4.2.0",
532 | "graceful-fs": "4.1.11",
533 | "make-dir": "1.1.0",
534 | "unique-string": "1.0.0",
535 | "write-file-atomic": "2.3.0",
536 | "xdg-basedir": "3.0.0"
537 | }
538 | },
539 | "core-util-is": {
540 | "version": "1.0.2",
541 | "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz",
542 | "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=",
543 | "dev": true
544 | },
545 | "create-error-class": {
546 | "version": "3.0.2",
547 | "resolved": "https://registry.npmjs.org/create-error-class/-/create-error-class-3.0.2.tgz",
548 | "integrity": "sha1-Br56vvlHo/FKMP1hBnHUAbyot7Y=",
549 | "dev": true,
550 | "requires": {
551 | "capture-stack-trace": "1.0.0"
552 | }
553 | },
554 | "cross-spawn": {
555 | "version": "5.1.0",
556 | "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz",
557 | "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=",
558 | "dev": true,
559 | "requires": {
560 | "lru-cache": "4.1.1",
561 | "shebang-command": "1.2.0",
562 | "which": "1.3.0"
563 | }
564 | },
565 | "crypto-random-string": {
566 | "version": "1.0.0",
567 | "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-1.0.0.tgz",
568 | "integrity": "sha1-ojD2T1aDEOFJgAmUB5DsmVRbyn4=",
569 | "dev": true
570 | },
571 | "d": {
572 | "version": "1.0.0",
573 | "resolved": "https://registry.npmjs.org/d/-/d-1.0.0.tgz",
574 | "integrity": "sha1-dUu1v+VUUdpppYuU1F9MWwRi1Y8=",
575 | "dev": true,
576 | "requires": {
577 | "es5-ext": "0.10.37"
578 | }
579 | },
580 | "debug": {
581 | "version": "2.6.9",
582 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
583 | "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
584 | "dev": true,
585 | "requires": {
586 | "ms": "2.0.0"
587 | }
588 | },
589 | "decamelize": {
590 | "version": "1.2.0",
591 | "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz",
592 | "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=",
593 | "dev": true,
594 | "optional": true
595 | },
596 | "deep-eql": {
597 | "version": "0.1.3",
598 | "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-0.1.3.tgz",
599 | "integrity": "sha1-71WKyrjeJSBs1xOQbXTlaTDrafI=",
600 | "dev": true,
601 | "requires": {
602 | "type-detect": "0.1.1"
603 | },
604 | "dependencies": {
605 | "type-detect": {
606 | "version": "0.1.1",
607 | "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-0.1.1.tgz",
608 | "integrity": "sha1-C6XsKohWQORw6k6FBZcZANrFiCI=",
609 | "dev": true
610 | }
611 | }
612 | },
613 | "deep-equal": {
614 | "version": "1.0.1",
615 | "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.0.1.tgz",
616 | "integrity": "sha1-9dJgKStmDghO/0zbyfCK0yR0SLU=",
617 | "dev": true
618 | },
619 | "deep-extend": {
620 | "version": "0.4.2",
621 | "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.4.2.tgz",
622 | "integrity": "sha1-SLaZwn4zS/ifEIkr5DL25MfTSn8=",
623 | "dev": true
624 | },
625 | "deep-is": {
626 | "version": "0.1.3",
627 | "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz",
628 | "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=",
629 | "dev": true
630 | },
631 | "define-properties": {
632 | "version": "1.1.2",
633 | "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.2.tgz",
634 | "integrity": "sha1-g6c/L+pWmJj7c3GTyPhzyvbUXJQ=",
635 | "dev": true,
636 | "requires": {
637 | "foreach": "2.0.5",
638 | "object-keys": "1.0.11"
639 | }
640 | },
641 | "defined": {
642 | "version": "1.0.0",
643 | "resolved": "https://registry.npmjs.org/defined/-/defined-1.0.0.tgz",
644 | "integrity": "sha1-yY2bzvdWdBiOEQlpFRGZ45sfppM=",
645 | "dev": true
646 | },
647 | "del": {
648 | "version": "2.2.2",
649 | "resolved": "https://registry.npmjs.org/del/-/del-2.2.2.tgz",
650 | "integrity": "sha1-wSyYHQZ4RshLyvhiz/kw2Qf/0ag=",
651 | "dev": true,
652 | "requires": {
653 | "globby": "5.0.0",
654 | "is-path-cwd": "1.0.0",
655 | "is-path-in-cwd": "1.0.0",
656 | "object-assign": "4.1.1",
657 | "pify": "2.3.0",
658 | "pinkie-promise": "2.0.1",
659 | "rimraf": "2.6.2"
660 | }
661 | },
662 | "doctrine": {
663 | "version": "2.0.2",
664 | "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.0.2.tgz",
665 | "integrity": "sha512-y0tm5Pq6ywp3qSTZ1vPgVdAnbDEoeoc5wlOHXoY1c4Wug/a7JvqHIl7BTvwodaHmejWkK/9dSb3sCYfyo/om8A==",
666 | "dev": true,
667 | "requires": {
668 | "esutils": "2.0.2"
669 | }
670 | },
671 | "dot-prop": {
672 | "version": "4.2.0",
673 | "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-4.2.0.tgz",
674 | "integrity": "sha512-tUMXrxlExSW6U2EXiiKGSBVdYgtV8qlHL+C10TsW4PURY/ic+eaysnSkwB4kA/mBlCyy/IKDJ+Lc3wbWeaXtuQ==",
675 | "dev": true,
676 | "requires": {
677 | "is-obj": "1.0.1"
678 | }
679 | },
680 | "double-ended-queue": {
681 | "version": "2.1.0-0",
682 | "resolved": "https://registry.npmjs.org/double-ended-queue/-/double-ended-queue-2.1.0-0.tgz",
683 | "integrity": "sha1-ED01J/0xUo9AGIEwyEHv3XgmTlw=",
684 | "dev": true
685 | },
686 | "duplexer": {
687 | "version": "0.1.1",
688 | "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.1.tgz",
689 | "integrity": "sha1-rOb/gIwc5mtX0ev5eXessCM0z8E=",
690 | "dev": true
691 | },
692 | "duplexer3": {
693 | "version": "0.1.4",
694 | "resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.4.tgz",
695 | "integrity": "sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI=",
696 | "dev": true
697 | },
698 | "ecdsa-sig-formatter": {
699 | "version": "1.0.9",
700 | "resolved": "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.9.tgz",
701 | "integrity": "sha1-S8kmJ07Dtau1AW5+HWCSGsJisqE=",
702 | "dev": true,
703 | "requires": {
704 | "base64url": "2.0.0",
705 | "safe-buffer": "5.1.1"
706 | }
707 | },
708 | "env2": {
709 | "version": "2.2.0",
710 | "resolved": "https://registry.npmjs.org/env2/-/env2-2.2.0.tgz",
711 | "integrity": "sha1-1GtC03Xi8lU/8O80wVPJBPplLfE=",
712 | "dev": true
713 | },
714 | "es-abstract": {
715 | "version": "1.10.0",
716 | "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.10.0.tgz",
717 | "integrity": "sha512-/uh/DhdqIOSkAWifU+8nG78vlQxdLckUdI/sPgy0VhuXi2qJ7T8czBmqIYtLQVpCIFYafChnsRsB5pyb1JdmCQ==",
718 | "dev": true,
719 | "requires": {
720 | "es-to-primitive": "1.1.1",
721 | "function-bind": "1.1.1",
722 | "has": "1.0.1",
723 | "is-callable": "1.1.3",
724 | "is-regex": "1.0.4"
725 | }
726 | },
727 | "es-to-primitive": {
728 | "version": "1.1.1",
729 | "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.1.1.tgz",
730 | "integrity": "sha1-RTVSSKiJeQNLZ5Lhm7gfK3l13Q0=",
731 | "dev": true,
732 | "requires": {
733 | "is-callable": "1.1.3",
734 | "is-date-object": "1.0.1",
735 | "is-symbol": "1.0.1"
736 | }
737 | },
738 | "es5-ext": {
739 | "version": "0.10.37",
740 | "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.37.tgz",
741 | "integrity": "sha1-DudB0Ui4AGm6J9AgOTdWryV978M=",
742 | "dev": true,
743 | "requires": {
744 | "es6-iterator": "2.0.3",
745 | "es6-symbol": "3.1.1"
746 | }
747 | },
748 | "es6-iterator": {
749 | "version": "2.0.3",
750 | "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz",
751 | "integrity": "sha1-p96IkUGgWpSwhUQDstCg+/qY87c=",
752 | "dev": true,
753 | "requires": {
754 | "d": "1.0.0",
755 | "es5-ext": "0.10.37",
756 | "es6-symbol": "3.1.1"
757 | }
758 | },
759 | "es6-map": {
760 | "version": "0.1.5",
761 | "resolved": "https://registry.npmjs.org/es6-map/-/es6-map-0.1.5.tgz",
762 | "integrity": "sha1-kTbgUD3MBqMBaQ8LsU/042TpSfA=",
763 | "dev": true,
764 | "requires": {
765 | "d": "1.0.0",
766 | "es5-ext": "0.10.37",
767 | "es6-iterator": "2.0.3",
768 | "es6-set": "0.1.5",
769 | "es6-symbol": "3.1.1",
770 | "event-emitter": "0.3.5"
771 | }
772 | },
773 | "es6-promise": {
774 | "version": "3.3.1",
775 | "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-3.3.1.tgz",
776 | "integrity": "sha1-oIzd6EzNvzTQJ6FFG8kdS80ophM=",
777 | "dev": true
778 | },
779 | "es6-set": {
780 | "version": "0.1.5",
781 | "resolved": "https://registry.npmjs.org/es6-set/-/es6-set-0.1.5.tgz",
782 | "integrity": "sha1-0rPsXU2ADO2BjbU40ol02wpzzLE=",
783 | "dev": true,
784 | "requires": {
785 | "d": "1.0.0",
786 | "es5-ext": "0.10.37",
787 | "es6-iterator": "2.0.3",
788 | "es6-symbol": "3.1.1",
789 | "event-emitter": "0.3.5"
790 | }
791 | },
792 | "es6-symbol": {
793 | "version": "3.1.1",
794 | "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.1.tgz",
795 | "integrity": "sha1-vwDvT9q2uhtG7Le2KbTH7VcVzHc=",
796 | "dev": true,
797 | "requires": {
798 | "d": "1.0.0",
799 | "es5-ext": "0.10.37"
800 | }
801 | },
802 | "es6-weak-map": {
803 | "version": "2.0.2",
804 | "resolved": "https://registry.npmjs.org/es6-weak-map/-/es6-weak-map-2.0.2.tgz",
805 | "integrity": "sha1-XjqzIlH/0VOKH45f+hNXdy+S2W8=",
806 | "dev": true,
807 | "requires": {
808 | "d": "1.0.0",
809 | "es5-ext": "0.10.37",
810 | "es6-iterator": "2.0.3",
811 | "es6-symbol": "3.1.1"
812 | }
813 | },
814 | "escape-string-regexp": {
815 | "version": "1.0.5",
816 | "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
817 | "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=",
818 | "dev": true
819 | },
820 | "escodegen": {
821 | "version": "1.8.1",
822 | "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.8.1.tgz",
823 | "integrity": "sha1-WltTr0aTEQvrsIZ6o0MN07cKEBg=",
824 | "dev": true,
825 | "requires": {
826 | "esprima": "2.7.3",
827 | "estraverse": "1.9.3",
828 | "esutils": "2.0.2",
829 | "optionator": "0.8.2",
830 | "source-map": "0.2.0"
831 | },
832 | "dependencies": {
833 | "esprima": {
834 | "version": "2.7.3",
835 | "resolved": "https://registry.npmjs.org/esprima/-/esprima-2.7.3.tgz",
836 | "integrity": "sha1-luO3DVd59q1JzQMmc9HDEnZ7pYE=",
837 | "dev": true
838 | },
839 | "estraverse": {
840 | "version": "1.9.3",
841 | "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-1.9.3.tgz",
842 | "integrity": "sha1-r2fy3JIlgkFZUJJgkaQAXSnJu0Q=",
843 | "dev": true
844 | }
845 | }
846 | },
847 | "escope": {
848 | "version": "3.6.0",
849 | "resolved": "https://registry.npmjs.org/escope/-/escope-3.6.0.tgz",
850 | "integrity": "sha1-4Bl16BJ4GhY6ba392AOY3GTIicM=",
851 | "dev": true,
852 | "requires": {
853 | "es6-map": "0.1.5",
854 | "es6-weak-map": "2.0.2",
855 | "esrecurse": "4.2.0",
856 | "estraverse": "4.2.0"
857 | }
858 | },
859 | "eslint": {
860 | "version": "3.19.0",
861 | "resolved": "https://registry.npmjs.org/eslint/-/eslint-3.19.0.tgz",
862 | "integrity": "sha1-yPxiAcf0DdCJQbh8CFdnOGpnmsw=",
863 | "dev": true,
864 | "requires": {
865 | "babel-code-frame": "6.26.0",
866 | "chalk": "1.1.3",
867 | "concat-stream": "1.6.0",
868 | "debug": "2.6.9",
869 | "doctrine": "2.0.2",
870 | "escope": "3.6.0",
871 | "espree": "3.5.2",
872 | "esquery": "1.0.0",
873 | "estraverse": "4.2.0",
874 | "esutils": "2.0.2",
875 | "file-entry-cache": "2.0.0",
876 | "glob": "7.1.2",
877 | "globals": "9.18.0",
878 | "ignore": "3.3.7",
879 | "imurmurhash": "0.1.4",
880 | "inquirer": "0.12.0",
881 | "is-my-json-valid": "2.16.1",
882 | "is-resolvable": "1.0.1",
883 | "js-yaml": "3.10.0",
884 | "json-stable-stringify": "1.0.1",
885 | "levn": "0.3.0",
886 | "lodash": "4.17.4",
887 | "mkdirp": "0.5.1",
888 | "natural-compare": "1.4.0",
889 | "optionator": "0.8.2",
890 | "path-is-inside": "1.0.2",
891 | "pluralize": "1.2.1",
892 | "progress": "1.1.8",
893 | "require-uncached": "1.0.3",
894 | "shelljs": "0.7.8",
895 | "strip-bom": "3.0.0",
896 | "strip-json-comments": "2.0.1",
897 | "table": "3.8.3",
898 | "text-table": "0.2.0",
899 | "user-home": "2.0.0"
900 | }
901 | },
902 | "espree": {
903 | "version": "3.5.2",
904 | "resolved": "https://registry.npmjs.org/espree/-/espree-3.5.2.tgz",
905 | "integrity": "sha512-sadKeYwaR/aJ3stC2CdvgXu1T16TdYN+qwCpcWbMnGJ8s0zNWemzrvb2GbD4OhmJ/fwpJjudThAlLobGbWZbCQ==",
906 | "dev": true,
907 | "requires": {
908 | "acorn": "5.2.1",
909 | "acorn-jsx": "3.0.1"
910 | }
911 | },
912 | "esprima": {
913 | "version": "4.0.0",
914 | "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.0.tgz",
915 | "integrity": "sha512-oftTcaMu/EGrEIu904mWteKIv8vMuOgGYo7EhVJJN00R/EED9DCua/xxHRdYnKtcECzVg7xOWhflvJMnqcFZjw==",
916 | "dev": true
917 | },
918 | "esquery": {
919 | "version": "1.0.0",
920 | "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.0.0.tgz",
921 | "integrity": "sha1-z7qLV9f7qT8XKYqKAGoEzaE9gPo=",
922 | "dev": true,
923 | "requires": {
924 | "estraverse": "4.2.0"
925 | }
926 | },
927 | "esrecurse": {
928 | "version": "4.2.0",
929 | "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.2.0.tgz",
930 | "integrity": "sha1-+pVo2Y04I/mkHZHpAtyrnqblsWM=",
931 | "dev": true,
932 | "requires": {
933 | "estraverse": "4.2.0",
934 | "object-assign": "4.1.1"
935 | }
936 | },
937 | "estraverse": {
938 | "version": "4.2.0",
939 | "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.2.0.tgz",
940 | "integrity": "sha1-De4/7TH81GlhjOc0IJn8GvoL2xM=",
941 | "dev": true
942 | },
943 | "esutils": {
944 | "version": "2.0.2",
945 | "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz",
946 | "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=",
947 | "dev": true
948 | },
949 | "event-emitter": {
950 | "version": "0.3.5",
951 | "resolved": "https://registry.npmjs.org/event-emitter/-/event-emitter-0.3.5.tgz",
952 | "integrity": "sha1-34xp7vFkeSPHFXuc6DhAYQsCzDk=",
953 | "dev": true,
954 | "requires": {
955 | "d": "1.0.0",
956 | "es5-ext": "0.10.37"
957 | }
958 | },
959 | "event-stream": {
960 | "version": "3.3.4",
961 | "resolved": "https://registry.npmjs.org/event-stream/-/event-stream-3.3.4.tgz",
962 | "integrity": "sha1-SrTJoPWlTbkzi0w02Gv86PSzVXE=",
963 | "dev": true,
964 | "requires": {
965 | "duplexer": "0.1.1",
966 | "from": "0.1.7",
967 | "map-stream": "0.1.0",
968 | "pause-stream": "0.0.11",
969 | "split": "0.3.3",
970 | "stream-combiner": "0.0.4",
971 | "through": "2.3.8"
972 | }
973 | },
974 | "execa": {
975 | "version": "0.7.0",
976 | "resolved": "https://registry.npmjs.org/execa/-/execa-0.7.0.tgz",
977 | "integrity": "sha1-lEvs00zEHuMqY6n68nrVpl/Fl3c=",
978 | "dev": true,
979 | "requires": {
980 | "cross-spawn": "5.1.0",
981 | "get-stream": "3.0.0",
982 | "is-stream": "1.1.0",
983 | "npm-run-path": "2.0.2",
984 | "p-finally": "1.0.0",
985 | "signal-exit": "3.0.2",
986 | "strip-eof": "1.0.0"
987 | }
988 | },
989 | "exit-hook": {
990 | "version": "1.1.1",
991 | "resolved": "https://registry.npmjs.org/exit-hook/-/exit-hook-1.1.1.tgz",
992 | "integrity": "sha1-8FyiM7SMBdVP/wd2XfhQfpXAL/g=",
993 | "dev": true
994 | },
995 | "expand-brackets": {
996 | "version": "0.1.5",
997 | "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-0.1.5.tgz",
998 | "integrity": "sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s=",
999 | "dev": true,
1000 | "requires": {
1001 | "is-posix-bracket": "0.1.1"
1002 | }
1003 | },
1004 | "expand-range": {
1005 | "version": "1.8.2",
1006 | "resolved": "https://registry.npmjs.org/expand-range/-/expand-range-1.8.2.tgz",
1007 | "integrity": "sha1-opnv/TNf4nIeuujiV+x5ZE/IUzc=",
1008 | "dev": true,
1009 | "requires": {
1010 | "fill-range": "2.2.3"
1011 | }
1012 | },
1013 | "extglob": {
1014 | "version": "0.3.2",
1015 | "resolved": "https://registry.npmjs.org/extglob/-/extglob-0.3.2.tgz",
1016 | "integrity": "sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE=",
1017 | "dev": true,
1018 | "requires": {
1019 | "is-extglob": "1.0.0"
1020 | }
1021 | },
1022 | "fast-levenshtein": {
1023 | "version": "2.0.6",
1024 | "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz",
1025 | "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=",
1026 | "dev": true
1027 | },
1028 | "figures": {
1029 | "version": "1.7.0",
1030 | "resolved": "https://registry.npmjs.org/figures/-/figures-1.7.0.tgz",
1031 | "integrity": "sha1-y+Hjr/zxzUS4DK3+0o3Hk6lwHS4=",
1032 | "dev": true,
1033 | "requires": {
1034 | "escape-string-regexp": "1.0.5",
1035 | "object-assign": "4.1.1"
1036 | }
1037 | },
1038 | "file-entry-cache": {
1039 | "version": "2.0.0",
1040 | "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-2.0.0.tgz",
1041 | "integrity": "sha1-w5KZDD5oR4PYOLjISkXYoEhFg2E=",
1042 | "dev": true,
1043 | "requires": {
1044 | "flat-cache": "1.3.0",
1045 | "object-assign": "4.1.1"
1046 | }
1047 | },
1048 | "filename-regex": {
1049 | "version": "2.0.1",
1050 | "resolved": "https://registry.npmjs.org/filename-regex/-/filename-regex-2.0.1.tgz",
1051 | "integrity": "sha1-wcS5vuPglyXdsQa3XB4wH+LxiyY=",
1052 | "dev": true
1053 | },
1054 | "fill-range": {
1055 | "version": "2.2.3",
1056 | "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-2.2.3.tgz",
1057 | "integrity": "sha1-ULd9/X5Gm8dJJHCWNpn+eoSFpyM=",
1058 | "dev": true,
1059 | "requires": {
1060 | "is-number": "2.1.0",
1061 | "isobject": "2.1.0",
1062 | "randomatic": "1.1.7",
1063 | "repeat-element": "1.1.2",
1064 | "repeat-string": "1.6.1"
1065 | }
1066 | },
1067 | "flat-cache": {
1068 | "version": "1.3.0",
1069 | "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-1.3.0.tgz",
1070 | "integrity": "sha1-0wMLMrOBVPTjt+nHCfSQ9++XxIE=",
1071 | "dev": true,
1072 | "requires": {
1073 | "circular-json": "0.3.3",
1074 | "del": "2.2.2",
1075 | "graceful-fs": "4.1.11",
1076 | "write": "0.2.1"
1077 | }
1078 | },
1079 | "for-each": {
1080 | "version": "0.3.2",
1081 | "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.2.tgz",
1082 | "integrity": "sha1-LEBFC5NI6X8oEyJZO6lnBLmr1NQ=",
1083 | "dev": true,
1084 | "requires": {
1085 | "is-function": "1.0.1"
1086 | }
1087 | },
1088 | "for-in": {
1089 | "version": "1.0.2",
1090 | "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz",
1091 | "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=",
1092 | "dev": true
1093 | },
1094 | "for-own": {
1095 | "version": "0.1.5",
1096 | "resolved": "https://registry.npmjs.org/for-own/-/for-own-0.1.5.tgz",
1097 | "integrity": "sha1-UmXGgaTylNq78XyVCbZ2OqhFEM4=",
1098 | "dev": true,
1099 | "requires": {
1100 | "for-in": "1.0.2"
1101 | }
1102 | },
1103 | "foreach": {
1104 | "version": "2.0.5",
1105 | "resolved": "https://registry.npmjs.org/foreach/-/foreach-2.0.5.tgz",
1106 | "integrity": "sha1-C+4AUBiusmDQo6865ljdATbsG5k=",
1107 | "dev": true
1108 | },
1109 | "from": {
1110 | "version": "0.1.7",
1111 | "resolved": "https://registry.npmjs.org/from/-/from-0.1.7.tgz",
1112 | "integrity": "sha1-g8YK/Fi5xWmXAH7Rp2izqzA6RP4=",
1113 | "dev": true
1114 | },
1115 | "fs.realpath": {
1116 | "version": "1.0.0",
1117 | "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
1118 | "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=",
1119 | "dev": true
1120 | },
1121 | "fsevents": {
1122 | "version": "1.1.3",
1123 | "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.1.3.tgz",
1124 | "integrity": "sha512-WIr7iDkdmdbxu/Gh6eKEZJL6KPE74/5MEsf2whTOFNxbIoIixogroLdKYqB6FDav4Wavh/lZdzzd3b2KxIXC5Q==",
1125 | "dev": true,
1126 | "optional": true,
1127 | "requires": {
1128 | "nan": "2.8.0",
1129 | "node-pre-gyp": "0.6.39"
1130 | },
1131 | "dependencies": {
1132 | "abbrev": {
1133 | "version": "1.1.0",
1134 | "bundled": true,
1135 | "dev": true,
1136 | "optional": true
1137 | },
1138 | "ajv": {
1139 | "version": "4.11.8",
1140 | "bundled": true,
1141 | "dev": true,
1142 | "optional": true,
1143 | "requires": {
1144 | "co": "4.6.0",
1145 | "json-stable-stringify": "1.0.1"
1146 | }
1147 | },
1148 | "ansi-regex": {
1149 | "version": "2.1.1",
1150 | "bundled": true,
1151 | "dev": true
1152 | },
1153 | "aproba": {
1154 | "version": "1.1.1",
1155 | "bundled": true,
1156 | "dev": true,
1157 | "optional": true
1158 | },
1159 | "are-we-there-yet": {
1160 | "version": "1.1.4",
1161 | "bundled": true,
1162 | "dev": true,
1163 | "optional": true,
1164 | "requires": {
1165 | "delegates": "1.0.0",
1166 | "readable-stream": "2.2.9"
1167 | }
1168 | },
1169 | "asn1": {
1170 | "version": "0.2.3",
1171 | "bundled": true,
1172 | "dev": true,
1173 | "optional": true
1174 | },
1175 | "assert-plus": {
1176 | "version": "0.2.0",
1177 | "bundled": true,
1178 | "dev": true,
1179 | "optional": true
1180 | },
1181 | "asynckit": {
1182 | "version": "0.4.0",
1183 | "bundled": true,
1184 | "dev": true,
1185 | "optional": true
1186 | },
1187 | "aws-sign2": {
1188 | "version": "0.6.0",
1189 | "bundled": true,
1190 | "dev": true,
1191 | "optional": true
1192 | },
1193 | "aws4": {
1194 | "version": "1.6.0",
1195 | "bundled": true,
1196 | "dev": true,
1197 | "optional": true
1198 | },
1199 | "balanced-match": {
1200 | "version": "0.4.2",
1201 | "bundled": true,
1202 | "dev": true
1203 | },
1204 | "bcrypt-pbkdf": {
1205 | "version": "1.0.1",
1206 | "bundled": true,
1207 | "dev": true,
1208 | "optional": true,
1209 | "requires": {
1210 | "tweetnacl": "0.14.5"
1211 | }
1212 | },
1213 | "block-stream": {
1214 | "version": "0.0.9",
1215 | "bundled": true,
1216 | "dev": true,
1217 | "requires": {
1218 | "inherits": "2.0.3"
1219 | }
1220 | },
1221 | "boom": {
1222 | "version": "2.10.1",
1223 | "bundled": true,
1224 | "dev": true,
1225 | "requires": {
1226 | "hoek": "2.16.3"
1227 | }
1228 | },
1229 | "brace-expansion": {
1230 | "version": "1.1.7",
1231 | "bundled": true,
1232 | "dev": true,
1233 | "requires": {
1234 | "balanced-match": "0.4.2",
1235 | "concat-map": "0.0.1"
1236 | }
1237 | },
1238 | "buffer-shims": {
1239 | "version": "1.0.0",
1240 | "bundled": true,
1241 | "dev": true
1242 | },
1243 | "caseless": {
1244 | "version": "0.12.0",
1245 | "bundled": true,
1246 | "dev": true,
1247 | "optional": true
1248 | },
1249 | "co": {
1250 | "version": "4.6.0",
1251 | "bundled": true,
1252 | "dev": true,
1253 | "optional": true
1254 | },
1255 | "code-point-at": {
1256 | "version": "1.1.0",
1257 | "bundled": true,
1258 | "dev": true
1259 | },
1260 | "combined-stream": {
1261 | "version": "1.0.5",
1262 | "bundled": true,
1263 | "dev": true,
1264 | "requires": {
1265 | "delayed-stream": "1.0.0"
1266 | }
1267 | },
1268 | "concat-map": {
1269 | "version": "0.0.1",
1270 | "bundled": true,
1271 | "dev": true
1272 | },
1273 | "console-control-strings": {
1274 | "version": "1.1.0",
1275 | "bundled": true,
1276 | "dev": true
1277 | },
1278 | "core-util-is": {
1279 | "version": "1.0.2",
1280 | "bundled": true,
1281 | "dev": true
1282 | },
1283 | "cryptiles": {
1284 | "version": "2.0.5",
1285 | "bundled": true,
1286 | "dev": true,
1287 | "requires": {
1288 | "boom": "2.10.1"
1289 | }
1290 | },
1291 | "dashdash": {
1292 | "version": "1.14.1",
1293 | "bundled": true,
1294 | "dev": true,
1295 | "optional": true,
1296 | "requires": {
1297 | "assert-plus": "1.0.0"
1298 | },
1299 | "dependencies": {
1300 | "assert-plus": {
1301 | "version": "1.0.0",
1302 | "bundled": true,
1303 | "dev": true,
1304 | "optional": true
1305 | }
1306 | }
1307 | },
1308 | "debug": {
1309 | "version": "2.6.8",
1310 | "bundled": true,
1311 | "dev": true,
1312 | "optional": true,
1313 | "requires": {
1314 | "ms": "2.0.0"
1315 | }
1316 | },
1317 | "deep-extend": {
1318 | "version": "0.4.2",
1319 | "bundled": true,
1320 | "dev": true,
1321 | "optional": true
1322 | },
1323 | "delayed-stream": {
1324 | "version": "1.0.0",
1325 | "bundled": true,
1326 | "dev": true
1327 | },
1328 | "delegates": {
1329 | "version": "1.0.0",
1330 | "bundled": true,
1331 | "dev": true,
1332 | "optional": true
1333 | },
1334 | "detect-libc": {
1335 | "version": "1.0.2",
1336 | "bundled": true,
1337 | "dev": true,
1338 | "optional": true
1339 | },
1340 | "ecc-jsbn": {
1341 | "version": "0.1.1",
1342 | "bundled": true,
1343 | "dev": true,
1344 | "optional": true,
1345 | "requires": {
1346 | "jsbn": "0.1.1"
1347 | }
1348 | },
1349 | "extend": {
1350 | "version": "3.0.1",
1351 | "bundled": true,
1352 | "dev": true,
1353 | "optional": true
1354 | },
1355 | "extsprintf": {
1356 | "version": "1.0.2",
1357 | "bundled": true,
1358 | "dev": true
1359 | },
1360 | "forever-agent": {
1361 | "version": "0.6.1",
1362 | "bundled": true,
1363 | "dev": true,
1364 | "optional": true
1365 | },
1366 | "form-data": {
1367 | "version": "2.1.4",
1368 | "bundled": true,
1369 | "dev": true,
1370 | "optional": true,
1371 | "requires": {
1372 | "asynckit": "0.4.0",
1373 | "combined-stream": "1.0.5",
1374 | "mime-types": "2.1.15"
1375 | }
1376 | },
1377 | "fs.realpath": {
1378 | "version": "1.0.0",
1379 | "bundled": true,
1380 | "dev": true
1381 | },
1382 | "fstream": {
1383 | "version": "1.0.11",
1384 | "bundled": true,
1385 | "dev": true,
1386 | "requires": {
1387 | "graceful-fs": "4.1.11",
1388 | "inherits": "2.0.3",
1389 | "mkdirp": "0.5.1",
1390 | "rimraf": "2.6.1"
1391 | }
1392 | },
1393 | "fstream-ignore": {
1394 | "version": "1.0.5",
1395 | "bundled": true,
1396 | "dev": true,
1397 | "optional": true,
1398 | "requires": {
1399 | "fstream": "1.0.11",
1400 | "inherits": "2.0.3",
1401 | "minimatch": "3.0.4"
1402 | }
1403 | },
1404 | "gauge": {
1405 | "version": "2.7.4",
1406 | "bundled": true,
1407 | "dev": true,
1408 | "optional": true,
1409 | "requires": {
1410 | "aproba": "1.1.1",
1411 | "console-control-strings": "1.1.0",
1412 | "has-unicode": "2.0.1",
1413 | "object-assign": "4.1.1",
1414 | "signal-exit": "3.0.2",
1415 | "string-width": "1.0.2",
1416 | "strip-ansi": "3.0.1",
1417 | "wide-align": "1.1.2"
1418 | }
1419 | },
1420 | "getpass": {
1421 | "version": "0.1.7",
1422 | "bundled": true,
1423 | "dev": true,
1424 | "optional": true,
1425 | "requires": {
1426 | "assert-plus": "1.0.0"
1427 | },
1428 | "dependencies": {
1429 | "assert-plus": {
1430 | "version": "1.0.0",
1431 | "bundled": true,
1432 | "dev": true,
1433 | "optional": true
1434 | }
1435 | }
1436 | },
1437 | "glob": {
1438 | "version": "7.1.2",
1439 | "bundled": true,
1440 | "dev": true,
1441 | "requires": {
1442 | "fs.realpath": "1.0.0",
1443 | "inflight": "1.0.6",
1444 | "inherits": "2.0.3",
1445 | "minimatch": "3.0.4",
1446 | "once": "1.4.0",
1447 | "path-is-absolute": "1.0.1"
1448 | }
1449 | },
1450 | "graceful-fs": {
1451 | "version": "4.1.11",
1452 | "bundled": true,
1453 | "dev": true
1454 | },
1455 | "har-schema": {
1456 | "version": "1.0.5",
1457 | "bundled": true,
1458 | "dev": true,
1459 | "optional": true
1460 | },
1461 | "har-validator": {
1462 | "version": "4.2.1",
1463 | "bundled": true,
1464 | "dev": true,
1465 | "optional": true,
1466 | "requires": {
1467 | "ajv": "4.11.8",
1468 | "har-schema": "1.0.5"
1469 | }
1470 | },
1471 | "has-unicode": {
1472 | "version": "2.0.1",
1473 | "bundled": true,
1474 | "dev": true,
1475 | "optional": true
1476 | },
1477 | "hawk": {
1478 | "version": "3.1.3",
1479 | "bundled": true,
1480 | "dev": true,
1481 | "requires": {
1482 | "boom": "2.10.1",
1483 | "cryptiles": "2.0.5",
1484 | "hoek": "2.16.3",
1485 | "sntp": "1.0.9"
1486 | }
1487 | },
1488 | "hoek": {
1489 | "version": "2.16.3",
1490 | "bundled": true,
1491 | "dev": true
1492 | },
1493 | "http-signature": {
1494 | "version": "1.1.1",
1495 | "bundled": true,
1496 | "dev": true,
1497 | "optional": true,
1498 | "requires": {
1499 | "assert-plus": "0.2.0",
1500 | "jsprim": "1.4.0",
1501 | "sshpk": "1.13.0"
1502 | }
1503 | },
1504 | "inflight": {
1505 | "version": "1.0.6",
1506 | "bundled": true,
1507 | "dev": true,
1508 | "requires": {
1509 | "once": "1.4.0",
1510 | "wrappy": "1.0.2"
1511 | }
1512 | },
1513 | "inherits": {
1514 | "version": "2.0.3",
1515 | "bundled": true,
1516 | "dev": true
1517 | },
1518 | "ini": {
1519 | "version": "1.3.4",
1520 | "bundled": true,
1521 | "dev": true,
1522 | "optional": true
1523 | },
1524 | "is-fullwidth-code-point": {
1525 | "version": "1.0.0",
1526 | "bundled": true,
1527 | "dev": true,
1528 | "requires": {
1529 | "number-is-nan": "1.0.1"
1530 | }
1531 | },
1532 | "is-typedarray": {
1533 | "version": "1.0.0",
1534 | "bundled": true,
1535 | "dev": true,
1536 | "optional": true
1537 | },
1538 | "isarray": {
1539 | "version": "1.0.0",
1540 | "bundled": true,
1541 | "dev": true
1542 | },
1543 | "isstream": {
1544 | "version": "0.1.2",
1545 | "bundled": true,
1546 | "dev": true,
1547 | "optional": true
1548 | },
1549 | "jodid25519": {
1550 | "version": "1.0.2",
1551 | "bundled": true,
1552 | "dev": true,
1553 | "optional": true,
1554 | "requires": {
1555 | "jsbn": "0.1.1"
1556 | }
1557 | },
1558 | "jsbn": {
1559 | "version": "0.1.1",
1560 | "bundled": true,
1561 | "dev": true,
1562 | "optional": true
1563 | },
1564 | "json-schema": {
1565 | "version": "0.2.3",
1566 | "bundled": true,
1567 | "dev": true,
1568 | "optional": true
1569 | },
1570 | "json-stable-stringify": {
1571 | "version": "1.0.1",
1572 | "bundled": true,
1573 | "dev": true,
1574 | "optional": true,
1575 | "requires": {
1576 | "jsonify": "0.0.0"
1577 | }
1578 | },
1579 | "json-stringify-safe": {
1580 | "version": "5.0.1",
1581 | "bundled": true,
1582 | "dev": true,
1583 | "optional": true
1584 | },
1585 | "jsonify": {
1586 | "version": "0.0.0",
1587 | "bundled": true,
1588 | "dev": true,
1589 | "optional": true
1590 | },
1591 | "jsprim": {
1592 | "version": "1.4.0",
1593 | "bundled": true,
1594 | "dev": true,
1595 | "optional": true,
1596 | "requires": {
1597 | "assert-plus": "1.0.0",
1598 | "extsprintf": "1.0.2",
1599 | "json-schema": "0.2.3",
1600 | "verror": "1.3.6"
1601 | },
1602 | "dependencies": {
1603 | "assert-plus": {
1604 | "version": "1.0.0",
1605 | "bundled": true,
1606 | "dev": true,
1607 | "optional": true
1608 | }
1609 | }
1610 | },
1611 | "mime-db": {
1612 | "version": "1.27.0",
1613 | "bundled": true,
1614 | "dev": true
1615 | },
1616 | "mime-types": {
1617 | "version": "2.1.15",
1618 | "bundled": true,
1619 | "dev": true,
1620 | "requires": {
1621 | "mime-db": "1.27.0"
1622 | }
1623 | },
1624 | "minimatch": {
1625 | "version": "3.0.4",
1626 | "bundled": true,
1627 | "dev": true,
1628 | "requires": {
1629 | "brace-expansion": "1.1.7"
1630 | }
1631 | },
1632 | "minimist": {
1633 | "version": "0.0.8",
1634 | "bundled": true,
1635 | "dev": true
1636 | },
1637 | "mkdirp": {
1638 | "version": "0.5.1",
1639 | "bundled": true,
1640 | "dev": true,
1641 | "requires": {
1642 | "minimist": "0.0.8"
1643 | }
1644 | },
1645 | "ms": {
1646 | "version": "2.0.0",
1647 | "bundled": true,
1648 | "dev": true,
1649 | "optional": true
1650 | },
1651 | "node-pre-gyp": {
1652 | "version": "0.6.39",
1653 | "bundled": true,
1654 | "dev": true,
1655 | "optional": true,
1656 | "requires": {
1657 | "detect-libc": "1.0.2",
1658 | "hawk": "3.1.3",
1659 | "mkdirp": "0.5.1",
1660 | "nopt": "4.0.1",
1661 | "npmlog": "4.1.0",
1662 | "rc": "1.2.1",
1663 | "request": "2.81.0",
1664 | "rimraf": "2.6.1",
1665 | "semver": "5.3.0",
1666 | "tar": "2.2.1",
1667 | "tar-pack": "3.4.0"
1668 | }
1669 | },
1670 | "nopt": {
1671 | "version": "4.0.1",
1672 | "bundled": true,
1673 | "dev": true,
1674 | "optional": true,
1675 | "requires": {
1676 | "abbrev": "1.1.0",
1677 | "osenv": "0.1.4"
1678 | }
1679 | },
1680 | "npmlog": {
1681 | "version": "4.1.0",
1682 | "bundled": true,
1683 | "dev": true,
1684 | "optional": true,
1685 | "requires": {
1686 | "are-we-there-yet": "1.1.4",
1687 | "console-control-strings": "1.1.0",
1688 | "gauge": "2.7.4",
1689 | "set-blocking": "2.0.0"
1690 | }
1691 | },
1692 | "number-is-nan": {
1693 | "version": "1.0.1",
1694 | "bundled": true,
1695 | "dev": true
1696 | },
1697 | "oauth-sign": {
1698 | "version": "0.8.2",
1699 | "bundled": true,
1700 | "dev": true,
1701 | "optional": true
1702 | },
1703 | "object-assign": {
1704 | "version": "4.1.1",
1705 | "bundled": true,
1706 | "dev": true,
1707 | "optional": true
1708 | },
1709 | "once": {
1710 | "version": "1.4.0",
1711 | "bundled": true,
1712 | "dev": true,
1713 | "requires": {
1714 | "wrappy": "1.0.2"
1715 | }
1716 | },
1717 | "os-homedir": {
1718 | "version": "1.0.2",
1719 | "bundled": true,
1720 | "dev": true,
1721 | "optional": true
1722 | },
1723 | "os-tmpdir": {
1724 | "version": "1.0.2",
1725 | "bundled": true,
1726 | "dev": true,
1727 | "optional": true
1728 | },
1729 | "osenv": {
1730 | "version": "0.1.4",
1731 | "bundled": true,
1732 | "dev": true,
1733 | "optional": true,
1734 | "requires": {
1735 | "os-homedir": "1.0.2",
1736 | "os-tmpdir": "1.0.2"
1737 | }
1738 | },
1739 | "path-is-absolute": {
1740 | "version": "1.0.1",
1741 | "bundled": true,
1742 | "dev": true
1743 | },
1744 | "performance-now": {
1745 | "version": "0.2.0",
1746 | "bundled": true,
1747 | "dev": true,
1748 | "optional": true
1749 | },
1750 | "process-nextick-args": {
1751 | "version": "1.0.7",
1752 | "bundled": true,
1753 | "dev": true
1754 | },
1755 | "punycode": {
1756 | "version": "1.4.1",
1757 | "bundled": true,
1758 | "dev": true,
1759 | "optional": true
1760 | },
1761 | "qs": {
1762 | "version": "6.4.0",
1763 | "bundled": true,
1764 | "dev": true,
1765 | "optional": true
1766 | },
1767 | "rc": {
1768 | "version": "1.2.1",
1769 | "bundled": true,
1770 | "dev": true,
1771 | "optional": true,
1772 | "requires": {
1773 | "deep-extend": "0.4.2",
1774 | "ini": "1.3.4",
1775 | "minimist": "1.2.0",
1776 | "strip-json-comments": "2.0.1"
1777 | },
1778 | "dependencies": {
1779 | "minimist": {
1780 | "version": "1.2.0",
1781 | "bundled": true,
1782 | "dev": true,
1783 | "optional": true
1784 | }
1785 | }
1786 | },
1787 | "readable-stream": {
1788 | "version": "2.2.9",
1789 | "bundled": true,
1790 | "dev": true,
1791 | "requires": {
1792 | "buffer-shims": "1.0.0",
1793 | "core-util-is": "1.0.2",
1794 | "inherits": "2.0.3",
1795 | "isarray": "1.0.0",
1796 | "process-nextick-args": "1.0.7",
1797 | "string_decoder": "1.0.1",
1798 | "util-deprecate": "1.0.2"
1799 | }
1800 | },
1801 | "request": {
1802 | "version": "2.81.0",
1803 | "bundled": true,
1804 | "dev": true,
1805 | "optional": true,
1806 | "requires": {
1807 | "aws-sign2": "0.6.0",
1808 | "aws4": "1.6.0",
1809 | "caseless": "0.12.0",
1810 | "combined-stream": "1.0.5",
1811 | "extend": "3.0.1",
1812 | "forever-agent": "0.6.1",
1813 | "form-data": "2.1.4",
1814 | "har-validator": "4.2.1",
1815 | "hawk": "3.1.3",
1816 | "http-signature": "1.1.1",
1817 | "is-typedarray": "1.0.0",
1818 | "isstream": "0.1.2",
1819 | "json-stringify-safe": "5.0.1",
1820 | "mime-types": "2.1.15",
1821 | "oauth-sign": "0.8.2",
1822 | "performance-now": "0.2.0",
1823 | "qs": "6.4.0",
1824 | "safe-buffer": "5.0.1",
1825 | "stringstream": "0.0.5",
1826 | "tough-cookie": "2.3.2",
1827 | "tunnel-agent": "0.6.0",
1828 | "uuid": "3.0.1"
1829 | }
1830 | },
1831 | "rimraf": {
1832 | "version": "2.6.1",
1833 | "bundled": true,
1834 | "dev": true,
1835 | "requires": {
1836 | "glob": "7.1.2"
1837 | }
1838 | },
1839 | "safe-buffer": {
1840 | "version": "5.0.1",
1841 | "bundled": true,
1842 | "dev": true
1843 | },
1844 | "semver": {
1845 | "version": "5.3.0",
1846 | "bundled": true,
1847 | "dev": true,
1848 | "optional": true
1849 | },
1850 | "set-blocking": {
1851 | "version": "2.0.0",
1852 | "bundled": true,
1853 | "dev": true,
1854 | "optional": true
1855 | },
1856 | "signal-exit": {
1857 | "version": "3.0.2",
1858 | "bundled": true,
1859 | "dev": true,
1860 | "optional": true
1861 | },
1862 | "sntp": {
1863 | "version": "1.0.9",
1864 | "bundled": true,
1865 | "dev": true,
1866 | "requires": {
1867 | "hoek": "2.16.3"
1868 | }
1869 | },
1870 | "sshpk": {
1871 | "version": "1.13.0",
1872 | "bundled": true,
1873 | "dev": true,
1874 | "optional": true,
1875 | "requires": {
1876 | "asn1": "0.2.3",
1877 | "assert-plus": "1.0.0",
1878 | "bcrypt-pbkdf": "1.0.1",
1879 | "dashdash": "1.14.1",
1880 | "ecc-jsbn": "0.1.1",
1881 | "getpass": "0.1.7",
1882 | "jodid25519": "1.0.2",
1883 | "jsbn": "0.1.1",
1884 | "tweetnacl": "0.14.5"
1885 | },
1886 | "dependencies": {
1887 | "assert-plus": {
1888 | "version": "1.0.0",
1889 | "bundled": true,
1890 | "dev": true,
1891 | "optional": true
1892 | }
1893 | }
1894 | },
1895 | "string-width": {
1896 | "version": "1.0.2",
1897 | "bundled": true,
1898 | "dev": true,
1899 | "requires": {
1900 | "code-point-at": "1.1.0",
1901 | "is-fullwidth-code-point": "1.0.0",
1902 | "strip-ansi": "3.0.1"
1903 | }
1904 | },
1905 | "string_decoder": {
1906 | "version": "1.0.1",
1907 | "bundled": true,
1908 | "dev": true,
1909 | "requires": {
1910 | "safe-buffer": "5.0.1"
1911 | }
1912 | },
1913 | "stringstream": {
1914 | "version": "0.0.5",
1915 | "bundled": true,
1916 | "dev": true,
1917 | "optional": true
1918 | },
1919 | "strip-ansi": {
1920 | "version": "3.0.1",
1921 | "bundled": true,
1922 | "dev": true,
1923 | "requires": {
1924 | "ansi-regex": "2.1.1"
1925 | }
1926 | },
1927 | "strip-json-comments": {
1928 | "version": "2.0.1",
1929 | "bundled": true,
1930 | "dev": true,
1931 | "optional": true
1932 | },
1933 | "tar": {
1934 | "version": "2.2.1",
1935 | "bundled": true,
1936 | "dev": true,
1937 | "requires": {
1938 | "block-stream": "0.0.9",
1939 | "fstream": "1.0.11",
1940 | "inherits": "2.0.3"
1941 | }
1942 | },
1943 | "tar-pack": {
1944 | "version": "3.4.0",
1945 | "bundled": true,
1946 | "dev": true,
1947 | "optional": true,
1948 | "requires": {
1949 | "debug": "2.6.8",
1950 | "fstream": "1.0.11",
1951 | "fstream-ignore": "1.0.5",
1952 | "once": "1.4.0",
1953 | "readable-stream": "2.2.9",
1954 | "rimraf": "2.6.1",
1955 | "tar": "2.2.1",
1956 | "uid-number": "0.0.6"
1957 | }
1958 | },
1959 | "tough-cookie": {
1960 | "version": "2.3.2",
1961 | "bundled": true,
1962 | "dev": true,
1963 | "optional": true,
1964 | "requires": {
1965 | "punycode": "1.4.1"
1966 | }
1967 | },
1968 | "tunnel-agent": {
1969 | "version": "0.6.0",
1970 | "bundled": true,
1971 | "dev": true,
1972 | "optional": true,
1973 | "requires": {
1974 | "safe-buffer": "5.0.1"
1975 | }
1976 | },
1977 | "tweetnacl": {
1978 | "version": "0.14.5",
1979 | "bundled": true,
1980 | "dev": true,
1981 | "optional": true
1982 | },
1983 | "uid-number": {
1984 | "version": "0.0.6",
1985 | "bundled": true,
1986 | "dev": true,
1987 | "optional": true
1988 | },
1989 | "util-deprecate": {
1990 | "version": "1.0.2",
1991 | "bundled": true,
1992 | "dev": true
1993 | },
1994 | "uuid": {
1995 | "version": "3.0.1",
1996 | "bundled": true,
1997 | "dev": true,
1998 | "optional": true
1999 | },
2000 | "verror": {
2001 | "version": "1.3.6",
2002 | "bundled": true,
2003 | "dev": true,
2004 | "optional": true,
2005 | "requires": {
2006 | "extsprintf": "1.0.2"
2007 | }
2008 | },
2009 | "wide-align": {
2010 | "version": "1.1.2",
2011 | "bundled": true,
2012 | "dev": true,
2013 | "optional": true,
2014 | "requires": {
2015 | "string-width": "1.0.2"
2016 | }
2017 | },
2018 | "wrappy": {
2019 | "version": "1.0.2",
2020 | "bundled": true,
2021 | "dev": true
2022 | }
2023 | }
2024 | },
2025 | "function-bind": {
2026 | "version": "1.1.1",
2027 | "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz",
2028 | "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==",
2029 | "dev": true
2030 | },
2031 | "generate-function": {
2032 | "version": "2.0.0",
2033 | "resolved": "https://registry.npmjs.org/generate-function/-/generate-function-2.0.0.tgz",
2034 | "integrity": "sha1-aFj+fAlpt9TpCTM3ZHrHn2DfvnQ=",
2035 | "dev": true
2036 | },
2037 | "generate-object-property": {
2038 | "version": "1.2.0",
2039 | "resolved": "https://registry.npmjs.org/generate-object-property/-/generate-object-property-1.2.0.tgz",
2040 | "integrity": "sha1-nA4cQDCM6AT0eDYYuTf6iPmdUNA=",
2041 | "dev": true,
2042 | "requires": {
2043 | "is-property": "1.0.2"
2044 | }
2045 | },
2046 | "get-stream": {
2047 | "version": "3.0.0",
2048 | "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz",
2049 | "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=",
2050 | "dev": true
2051 | },
2052 | "glob": {
2053 | "version": "7.1.2",
2054 | "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz",
2055 | "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==",
2056 | "dev": true,
2057 | "requires": {
2058 | "fs.realpath": "1.0.0",
2059 | "inflight": "1.0.6",
2060 | "inherits": "2.0.3",
2061 | "minimatch": "3.0.4",
2062 | "once": "1.4.0",
2063 | "path-is-absolute": "1.0.1"
2064 | }
2065 | },
2066 | "glob-base": {
2067 | "version": "0.3.0",
2068 | "resolved": "https://registry.npmjs.org/glob-base/-/glob-base-0.3.0.tgz",
2069 | "integrity": "sha1-27Fk9iIbHAscz4Kuoyi0l98Oo8Q=",
2070 | "dev": true,
2071 | "requires": {
2072 | "glob-parent": "2.0.0",
2073 | "is-glob": "2.0.1"
2074 | }
2075 | },
2076 | "glob-parent": {
2077 | "version": "2.0.0",
2078 | "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-2.0.0.tgz",
2079 | "integrity": "sha1-gTg9ctsFT8zPUzbaqQLxgvbtuyg=",
2080 | "dev": true,
2081 | "requires": {
2082 | "is-glob": "2.0.1"
2083 | }
2084 | },
2085 | "global-dirs": {
2086 | "version": "0.1.1",
2087 | "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-0.1.1.tgz",
2088 | "integrity": "sha1-sxnA3UYH81PzvpzKTHL8FIxJ9EU=",
2089 | "dev": true,
2090 | "requires": {
2091 | "ini": "1.3.5"
2092 | }
2093 | },
2094 | "globals": {
2095 | "version": "9.18.0",
2096 | "resolved": "https://registry.npmjs.org/globals/-/globals-9.18.0.tgz",
2097 | "integrity": "sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ==",
2098 | "dev": true
2099 | },
2100 | "globby": {
2101 | "version": "5.0.0",
2102 | "resolved": "https://registry.npmjs.org/globby/-/globby-5.0.0.tgz",
2103 | "integrity": "sha1-69hGZ8oNuzMLmbz8aOrCvFQ3Dg0=",
2104 | "dev": true,
2105 | "requires": {
2106 | "array-union": "1.0.2",
2107 | "arrify": "1.0.1",
2108 | "glob": "7.1.2",
2109 | "object-assign": "4.1.1",
2110 | "pify": "2.3.0",
2111 | "pinkie-promise": "2.0.1"
2112 | }
2113 | },
2114 | "goodparts": {
2115 | "version": "1.2.1",
2116 | "resolved": "https://registry.npmjs.org/goodparts/-/goodparts-1.2.1.tgz",
2117 | "integrity": "sha1-45JVt1/fp3xBo9xsRjb06AdE0ms=",
2118 | "dev": true,
2119 | "requires": {
2120 | "eslint": "3.19.0",
2121 | "minimist": "1.2.0"
2122 | }
2123 | },
2124 | "got": {
2125 | "version": "6.7.1",
2126 | "resolved": "https://registry.npmjs.org/got/-/got-6.7.1.tgz",
2127 | "integrity": "sha1-JAzQV4WpoY5WHcG0S0HHY+8ejbA=",
2128 | "dev": true,
2129 | "requires": {
2130 | "create-error-class": "3.0.2",
2131 | "duplexer3": "0.1.4",
2132 | "get-stream": "3.0.0",
2133 | "is-redirect": "1.0.0",
2134 | "is-retry-allowed": "1.1.0",
2135 | "is-stream": "1.1.0",
2136 | "lowercase-keys": "1.0.0",
2137 | "safe-buffer": "5.1.1",
2138 | "timed-out": "4.0.1",
2139 | "unzip-response": "2.0.1",
2140 | "url-parse-lax": "1.0.0"
2141 | }
2142 | },
2143 | "graceful-fs": {
2144 | "version": "4.1.11",
2145 | "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz",
2146 | "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=",
2147 | "dev": true
2148 | },
2149 | "handlebars": {
2150 | "version": "4.0.11",
2151 | "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.0.11.tgz",
2152 | "integrity": "sha1-Ywo13+ApS8KB7a5v/F0yn8eYLcw=",
2153 | "dev": true,
2154 | "requires": {
2155 | "async": "1.5.2",
2156 | "optimist": "0.6.1",
2157 | "source-map": "0.4.4",
2158 | "uglify-js": "2.8.29"
2159 | },
2160 | "dependencies": {
2161 | "source-map": {
2162 | "version": "0.4.4",
2163 | "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.4.4.tgz",
2164 | "integrity": "sha1-66T12pwNyZneaAMti092FzZSA2s=",
2165 | "dev": true,
2166 | "requires": {
2167 | "amdefine": "1.0.1"
2168 | }
2169 | }
2170 | }
2171 | },
2172 | "hapi": {
2173 | "version": "15.2.0",
2174 | "resolved": "https://registry.npmjs.org/hapi/-/hapi-15.2.0.tgz",
2175 | "integrity": "sha1-VwTKLAS2OGwDyvnukB8d4IAxbSM=",
2176 | "dev": true,
2177 | "requires": {
2178 | "accept": "2.1.2",
2179 | "ammo": "2.0.2",
2180 | "boom": "4.0.0",
2181 | "call": "3.0.3",
2182 | "catbox": "7.1.2",
2183 | "catbox-memory": "2.0.3",
2184 | "cryptiles": "3.0.2",
2185 | "heavy": "4.0.2",
2186 | "hoek": "4.0.2",
2187 | "iron": "4.0.3",
2188 | "items": "2.1.1",
2189 | "joi": "9.0.4",
2190 | "mimos": "3.0.3",
2191 | "podium": "1.2.3",
2192 | "shot": "3.3.2",
2193 | "statehood": "5.0.0",
2194 | "subtext": "4.3.0",
2195 | "topo": "2.0.2"
2196 | },
2197 | "dependencies": {
2198 | "accept": {
2199 | "version": "2.1.2",
2200 | "resolved": "https://registry.npmjs.org/accept/-/accept-2.1.2.tgz",
2201 | "integrity": "sha1-VRh07Y8saLJwe/8qsl/hNT5GHWs=",
2202 | "dev": true,
2203 | "requires": {
2204 | "boom": "4.0.0",
2205 | "hoek": "4.0.2"
2206 | }
2207 | },
2208 | "ammo": {
2209 | "version": "2.0.2",
2210 | "resolved": "https://registry.npmjs.org/ammo/-/ammo-2.0.2.tgz",
2211 | "integrity": "sha1-NmxV97xPLyQhjtOk3UuN8TXC5so=",
2212 | "dev": true,
2213 | "requires": {
2214 | "boom": "4.0.0",
2215 | "hoek": "4.0.2"
2216 | }
2217 | },
2218 | "boom": {
2219 | "version": "4.0.0",
2220 | "resolved": "https://registry.npmjs.org/boom/-/boom-4.0.0.tgz",
2221 | "integrity": "sha1-fllGkmTq3bdP7fvBsWUk1pppRXc=",
2222 | "dev": true,
2223 | "requires": {
2224 | "hoek": "4.0.2"
2225 | }
2226 | },
2227 | "call": {
2228 | "version": "3.0.3",
2229 | "resolved": "https://registry.npmjs.org/call/-/call-3.0.3.tgz",
2230 | "integrity": "sha1-5HSN27t/Qa5AzuBV+LJwtzO/fI0=",
2231 | "dev": true,
2232 | "requires": {
2233 | "boom": "4.0.0",
2234 | "hoek": "4.0.2"
2235 | }
2236 | },
2237 | "catbox": {
2238 | "version": "7.1.2",
2239 | "resolved": "https://registry.npmjs.org/catbox/-/catbox-7.1.2.tgz",
2240 | "integrity": "sha1-RnIbHJmWdRP9e36UUXBqBe3+1a0=",
2241 | "dev": true,
2242 | "requires": {
2243 | "boom": "4.0.0",
2244 | "hoek": "4.0.2",
2245 | "joi": "9.0.4"
2246 | }
2247 | },
2248 | "catbox-memory": {
2249 | "version": "2.0.3",
2250 | "resolved": "https://registry.npmjs.org/catbox-memory/-/catbox-memory-2.0.3.tgz",
2251 | "integrity": "sha1-36qcFj+tND2a3W18H9x7Qps2nDg=",
2252 | "dev": true,
2253 | "requires": {
2254 | "hoek": "4.0.2"
2255 | }
2256 | },
2257 | "cryptiles": {
2258 | "version": "3.0.2",
2259 | "resolved": "https://registry.npmjs.org/cryptiles/-/cryptiles-3.0.2.tgz",
2260 | "integrity": "sha1-7M30qFuHVPFdC1Mg1Kt41A0PokQ=",
2261 | "dev": true,
2262 | "requires": {
2263 | "boom": "4.0.0"
2264 | }
2265 | },
2266 | "heavy": {
2267 | "version": "4.0.2",
2268 | "resolved": "https://registry.npmjs.org/heavy/-/heavy-4.0.2.tgz",
2269 | "integrity": "sha1-27Zs2l8BellPxsgwHfaZnqjVM/A=",
2270 | "dev": true,
2271 | "requires": {
2272 | "boom": "4.0.0",
2273 | "hoek": "4.0.2",
2274 | "joi": "9.0.4"
2275 | }
2276 | },
2277 | "hoek": {
2278 | "version": "4.0.2",
2279 | "resolved": "https://registry.npmjs.org/hoek/-/hoek-4.0.2.tgz",
2280 | "integrity": "sha1-e5afTIoa+KOMosZmxmv6bEL+LN0=",
2281 | "dev": true
2282 | },
2283 | "iron": {
2284 | "version": "4.0.3",
2285 | "resolved": "https://registry.npmjs.org/iron/-/iron-4.0.3.tgz",
2286 | "integrity": "sha1-DA0yUmYdihxhS+2e07B32A6g/Xg=",
2287 | "dev": true,
2288 | "requires": {
2289 | "boom": "4.0.0",
2290 | "cryptiles": "3.0.2",
2291 | "hoek": "4.0.2"
2292 | }
2293 | },
2294 | "items": {
2295 | "version": "2.1.1",
2296 | "resolved": "https://registry.npmjs.org/items/-/items-2.1.1.tgz",
2297 | "integrity": "sha1-i9FtnIOxlSneWuoyGsqtp4NkoZg=",
2298 | "dev": true
2299 | },
2300 | "joi": {
2301 | "version": "9.0.4",
2302 | "resolved": "https://registry.npmjs.org/joi/-/joi-9.0.4.tgz",
2303 | "integrity": "sha1-iNZIkJFavrEnzXVwJxFtUN8+aN8=",
2304 | "dev": true,
2305 | "requires": {
2306 | "hoek": "4.0.2",
2307 | "isemail": "2.2.1",
2308 | "items": "2.1.1",
2309 | "moment": "2.14.1",
2310 | "topo": "2.0.2"
2311 | },
2312 | "dependencies": {
2313 | "isemail": {
2314 | "version": "2.2.1",
2315 | "resolved": "https://registry.npmjs.org/isemail/-/isemail-2.2.1.tgz",
2316 | "integrity": "sha1-A1PT2aYpUQgMJiwqoKQrjqjp4qY=",
2317 | "dev": true
2318 | },
2319 | "moment": {
2320 | "version": "2.14.1",
2321 | "resolved": "https://registry.npmjs.org/moment/-/moment-2.14.1.tgz",
2322 | "integrity": "sha1-s1snxH5X7S3ccAU9awe+zbKRdBw=",
2323 | "dev": true
2324 | }
2325 | }
2326 | },
2327 | "mimos": {
2328 | "version": "3.0.3",
2329 | "resolved": "https://registry.npmjs.org/mimos/-/mimos-3.0.3.tgz",
2330 | "integrity": "sha1-uRCQcq03jCty9qAQHEPd+ys2ZB8=",
2331 | "dev": true,
2332 | "requires": {
2333 | "hoek": "4.0.2",
2334 | "mime-db": "1.23.0"
2335 | },
2336 | "dependencies": {
2337 | "mime-db": {
2338 | "version": "1.23.0",
2339 | "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.23.0.tgz",
2340 | "integrity": "sha1-oxtAcK2uon1zLqMzdApk0OyaZlk=",
2341 | "dev": true
2342 | }
2343 | }
2344 | },
2345 | "podium": {
2346 | "version": "1.2.3",
2347 | "resolved": "https://registry.npmjs.org/podium/-/podium-1.2.3.tgz",
2348 | "integrity": "sha1-XJW3zC9ch90yTgrUqTY6xi1ms3E=",
2349 | "dev": true,
2350 | "requires": {
2351 | "hoek": "4.0.2",
2352 | "items": "2.1.1",
2353 | "joi": "9.0.4"
2354 | }
2355 | },
2356 | "shot": {
2357 | "version": "3.3.2",
2358 | "resolved": "https://registry.npmjs.org/shot/-/shot-3.3.2.tgz",
2359 | "integrity": "sha1-aRwmEXWd7MIEh7INJcwpnznl+bc=",
2360 | "dev": true,
2361 | "requires": {
2362 | "hoek": "4.0.2",
2363 | "joi": "9.0.4"
2364 | }
2365 | },
2366 | "statehood": {
2367 | "version": "5.0.0",
2368 | "resolved": "https://registry.npmjs.org/statehood/-/statehood-5.0.0.tgz",
2369 | "integrity": "sha1-ziKFqr6uOYrofLunRhhLdZm4+jE=",
2370 | "dev": true,
2371 | "requires": {
2372 | "boom": "4.0.0",
2373 | "cryptiles": "3.0.2",
2374 | "hoek": "4.0.2",
2375 | "iron": "4.0.3",
2376 | "items": "2.1.1",
2377 | "joi": "9.0.4"
2378 | }
2379 | },
2380 | "subtext": {
2381 | "version": "4.3.0",
2382 | "resolved": "https://registry.npmjs.org/subtext/-/subtext-4.3.0.tgz",
2383 | "integrity": "sha1-36yQSS7DVmn9bgDG5dk4sG18z7s=",
2384 | "dev": true,
2385 | "requires": {
2386 | "boom": "4.0.0",
2387 | "content": "3.0.2",
2388 | "hoek": "4.0.2",
2389 | "pez": "2.1.2",
2390 | "wreck": "10.0.0"
2391 | },
2392 | "dependencies": {
2393 | "content": {
2394 | "version": "3.0.2",
2395 | "resolved": "https://registry.npmjs.org/content/-/content-3.0.2.tgz",
2396 | "integrity": "sha1-8di0w6uyHqTA4hc/Q6wCKaTtbRw=",
2397 | "dev": true,
2398 | "requires": {
2399 | "boom": "4.0.0"
2400 | }
2401 | },
2402 | "pez": {
2403 | "version": "2.1.2",
2404 | "resolved": "https://registry.npmjs.org/pez/-/pez-2.1.2.tgz",
2405 | "integrity": "sha1-0dEjcXkqVYluI+IeUJxAle0IHbI=",
2406 | "dev": true,
2407 | "requires": {
2408 | "b64": "3.0.2",
2409 | "boom": "4.0.0",
2410 | "content": "3.0.2",
2411 | "hoek": "4.0.2",
2412 | "nigel": "2.0.2"
2413 | },
2414 | "dependencies": {
2415 | "b64": {
2416 | "version": "3.0.2",
2417 | "resolved": "https://registry.npmjs.org/b64/-/b64-3.0.2.tgz",
2418 | "integrity": "sha1-ep1gRmrfe43hFMvfZRpf38yQiU0=",
2419 | "dev": true
2420 | },
2421 | "nigel": {
2422 | "version": "2.0.2",
2423 | "resolved": "https://registry.npmjs.org/nigel/-/nigel-2.0.2.tgz",
2424 | "integrity": "sha1-k6GGb7DFLYc5CqdeKxYfS1x15bE=",
2425 | "dev": true,
2426 | "requires": {
2427 | "hoek": "4.0.2",
2428 | "vise": "2.0.2"
2429 | },
2430 | "dependencies": {
2431 | "vise": {
2432 | "version": "2.0.2",
2433 | "resolved": "https://registry.npmjs.org/vise/-/vise-2.0.2.tgz",
2434 | "integrity": "sha1-awjo+0y3bjpQzW3Q7DczjoEaDTk=",
2435 | "dev": true,
2436 | "requires": {
2437 | "hoek": "4.0.2"
2438 | }
2439 | }
2440 | }
2441 | }
2442 | }
2443 | },
2444 | "wreck": {
2445 | "version": "10.0.0",
2446 | "resolved": "https://registry.npmjs.org/wreck/-/wreck-10.0.0.tgz",
2447 | "integrity": "sha1-mKuIL4XhalJjMlB/EB9aeEEWIng=",
2448 | "dev": true,
2449 | "requires": {
2450 | "boom": "4.0.0",
2451 | "hoek": "4.0.2"
2452 | }
2453 | }
2454 | }
2455 | },
2456 | "topo": {
2457 | "version": "2.0.2",
2458 | "resolved": "https://registry.npmjs.org/topo/-/topo-2.0.2.tgz",
2459 | "integrity": "sha1-zVYVdSU5BXwNwEkaYhw7xvvh0YI=",
2460 | "dev": true,
2461 | "requires": {
2462 | "hoek": "4.0.2"
2463 | }
2464 | }
2465 | }
2466 | },
2467 | "has": {
2468 | "version": "1.0.1",
2469 | "resolved": "https://registry.npmjs.org/has/-/has-1.0.1.tgz",
2470 | "integrity": "sha1-hGFzP1OLCDfJNh45qauelwTcLyg=",
2471 | "dev": true,
2472 | "requires": {
2473 | "function-bind": "1.1.1"
2474 | }
2475 | },
2476 | "has-ansi": {
2477 | "version": "2.0.0",
2478 | "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz",
2479 | "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=",
2480 | "dev": true,
2481 | "requires": {
2482 | "ansi-regex": "2.1.1"
2483 | }
2484 | },
2485 | "has-flag": {
2486 | "version": "1.0.0",
2487 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz",
2488 | "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=",
2489 | "dev": true
2490 | },
2491 | "hoek": {
2492 | "version": "4.2.0",
2493 | "resolved": "https://registry.npmjs.org/hoek/-/hoek-4.2.0.tgz",
2494 | "integrity": "sha512-v0XCLxICi9nPfYrS9RL8HbYnXi9obYAeLbSP00BmnZwCK9+Ih9WOjoZ8YoHCoav2csqn4FOz4Orldsy2dmDwmQ==",
2495 | "dev": true
2496 | },
2497 | "ignore": {
2498 | "version": "3.3.7",
2499 | "resolved": "https://registry.npmjs.org/ignore/-/ignore-3.3.7.tgz",
2500 | "integrity": "sha512-YGG3ejvBNHRqu0559EOxxNFihD0AjpvHlC/pdGKd3X3ofe+CoJkYazwNJYTNebqpPKN+VVQbh4ZFn1DivMNuHA==",
2501 | "dev": true
2502 | },
2503 | "ignore-by-default": {
2504 | "version": "1.0.1",
2505 | "resolved": "https://registry.npmjs.org/ignore-by-default/-/ignore-by-default-1.0.1.tgz",
2506 | "integrity": "sha1-SMptcvbGo68Aqa1K5odr44ieKwk=",
2507 | "dev": true
2508 | },
2509 | "import-lazy": {
2510 | "version": "2.1.0",
2511 | "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-2.1.0.tgz",
2512 | "integrity": "sha1-BWmOPUXIjo1+nZLLBYTnfwlvPkM=",
2513 | "dev": true
2514 | },
2515 | "imurmurhash": {
2516 | "version": "0.1.4",
2517 | "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz",
2518 | "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=",
2519 | "dev": true
2520 | },
2521 | "inflight": {
2522 | "version": "1.0.6",
2523 | "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
2524 | "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=",
2525 | "dev": true,
2526 | "requires": {
2527 | "once": "1.4.0",
2528 | "wrappy": "1.0.2"
2529 | }
2530 | },
2531 | "inherits": {
2532 | "version": "2.0.3",
2533 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz",
2534 | "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=",
2535 | "dev": true
2536 | },
2537 | "ini": {
2538 | "version": "1.3.5",
2539 | "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz",
2540 | "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==",
2541 | "dev": true
2542 | },
2543 | "inquirer": {
2544 | "version": "0.12.0",
2545 | "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-0.12.0.tgz",
2546 | "integrity": "sha1-HvK/1jUE3wvHV4X/+MLEHfEvB34=",
2547 | "dev": true,
2548 | "requires": {
2549 | "ansi-escapes": "1.4.0",
2550 | "ansi-regex": "2.1.1",
2551 | "chalk": "1.1.3",
2552 | "cli-cursor": "1.0.2",
2553 | "cli-width": "2.2.0",
2554 | "figures": "1.7.0",
2555 | "lodash": "4.17.4",
2556 | "readline2": "1.0.1",
2557 | "run-async": "0.1.0",
2558 | "rx-lite": "3.1.2",
2559 | "string-width": "1.0.2",
2560 | "strip-ansi": "3.0.1",
2561 | "through": "2.3.8"
2562 | }
2563 | },
2564 | "interpret": {
2565 | "version": "1.1.0",
2566 | "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.1.0.tgz",
2567 | "integrity": "sha1-ftGxQQxqDg94z5XTuEQMY/eLhhQ=",
2568 | "dev": true
2569 | },
2570 | "is-binary-path": {
2571 | "version": "1.0.1",
2572 | "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz",
2573 | "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=",
2574 | "dev": true,
2575 | "requires": {
2576 | "binary-extensions": "1.11.0"
2577 | }
2578 | },
2579 | "is-buffer": {
2580 | "version": "1.1.6",
2581 | "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz",
2582 | "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==",
2583 | "dev": true
2584 | },
2585 | "is-callable": {
2586 | "version": "1.1.3",
2587 | "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.3.tgz",
2588 | "integrity": "sha1-hut1OSgF3cM69xySoO7fdO52BLI=",
2589 | "dev": true
2590 | },
2591 | "is-date-object": {
2592 | "version": "1.0.1",
2593 | "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.1.tgz",
2594 | "integrity": "sha1-mqIOtq7rv/d/vTPnTKAbM1gdOhY=",
2595 | "dev": true
2596 | },
2597 | "is-dotfile": {
2598 | "version": "1.0.3",
2599 | "resolved": "https://registry.npmjs.org/is-dotfile/-/is-dotfile-1.0.3.tgz",
2600 | "integrity": "sha1-pqLzL/0t+wT1yiXs0Pa4PPeYoeE=",
2601 | "dev": true
2602 | },
2603 | "is-equal-shallow": {
2604 | "version": "0.1.3",
2605 | "resolved": "https://registry.npmjs.org/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz",
2606 | "integrity": "sha1-IjgJj8Ih3gvPpdnqxMRdY4qhxTQ=",
2607 | "dev": true,
2608 | "requires": {
2609 | "is-primitive": "2.0.0"
2610 | }
2611 | },
2612 | "is-extendable": {
2613 | "version": "0.1.1",
2614 | "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz",
2615 | "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=",
2616 | "dev": true
2617 | },
2618 | "is-extglob": {
2619 | "version": "1.0.0",
2620 | "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz",
2621 | "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=",
2622 | "dev": true
2623 | },
2624 | "is-finite": {
2625 | "version": "1.0.2",
2626 | "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.0.2.tgz",
2627 | "integrity": "sha1-zGZ3aVYCvlUO8R6LSqYwU0K20Ko=",
2628 | "dev": true,
2629 | "requires": {
2630 | "number-is-nan": "1.0.1"
2631 | }
2632 | },
2633 | "is-fullwidth-code-point": {
2634 | "version": "1.0.0",
2635 | "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz",
2636 | "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=",
2637 | "dev": true,
2638 | "requires": {
2639 | "number-is-nan": "1.0.1"
2640 | }
2641 | },
2642 | "is-function": {
2643 | "version": "1.0.1",
2644 | "resolved": "https://registry.npmjs.org/is-function/-/is-function-1.0.1.tgz",
2645 | "integrity": "sha1-Es+5i2W1fdPRk6MSH19uL0N2ArU=",
2646 | "dev": true
2647 | },
2648 | "is-glob": {
2649 | "version": "2.0.1",
2650 | "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz",
2651 | "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=",
2652 | "dev": true,
2653 | "requires": {
2654 | "is-extglob": "1.0.0"
2655 | }
2656 | },
2657 | "is-installed-globally": {
2658 | "version": "0.1.0",
2659 | "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.1.0.tgz",
2660 | "integrity": "sha1-Df2Y9akRFxbdU13aZJL2e/PSWoA=",
2661 | "dev": true,
2662 | "requires": {
2663 | "global-dirs": "0.1.1",
2664 | "is-path-inside": "1.0.1"
2665 | }
2666 | },
2667 | "is-my-json-valid": {
2668 | "version": "2.16.1",
2669 | "resolved": "https://registry.npmjs.org/is-my-json-valid/-/is-my-json-valid-2.16.1.tgz",
2670 | "integrity": "sha512-ochPsqWS1WXj8ZnMIV0vnNXooaMhp7cyL4FMSIPKTtnV0Ha/T19G2b9kkhcNsabV9bxYkze7/aLZJb/bYuFduQ==",
2671 | "dev": true,
2672 | "requires": {
2673 | "generate-function": "2.0.0",
2674 | "generate-object-property": "1.2.0",
2675 | "jsonpointer": "4.0.1",
2676 | "xtend": "4.0.1"
2677 | }
2678 | },
2679 | "is-npm": {
2680 | "version": "1.0.0",
2681 | "resolved": "https://registry.npmjs.org/is-npm/-/is-npm-1.0.0.tgz",
2682 | "integrity": "sha1-8vtjpl5JBbQGyGBydloaTceTufQ=",
2683 | "dev": true
2684 | },
2685 | "is-number": {
2686 | "version": "2.1.0",
2687 | "resolved": "https://registry.npmjs.org/is-number/-/is-number-2.1.0.tgz",
2688 | "integrity": "sha1-Afy7s5NGOlSPL0ZszhbezknbkI8=",
2689 | "dev": true,
2690 | "requires": {
2691 | "kind-of": "3.2.2"
2692 | }
2693 | },
2694 | "is-obj": {
2695 | "version": "1.0.1",
2696 | "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz",
2697 | "integrity": "sha1-PkcprB9f3gJc19g6iW2rn09n2w8=",
2698 | "dev": true
2699 | },
2700 | "is-path-cwd": {
2701 | "version": "1.0.0",
2702 | "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-1.0.0.tgz",
2703 | "integrity": "sha1-0iXsIxMuie3Tj9p2dHLmLmXxEG0=",
2704 | "dev": true
2705 | },
2706 | "is-path-in-cwd": {
2707 | "version": "1.0.0",
2708 | "resolved": "https://registry.npmjs.org/is-path-in-cwd/-/is-path-in-cwd-1.0.0.tgz",
2709 | "integrity": "sha1-ZHdYK4IU1gI0YJRWcAO+ip6sBNw=",
2710 | "dev": true,
2711 | "requires": {
2712 | "is-path-inside": "1.0.1"
2713 | }
2714 | },
2715 | "is-path-inside": {
2716 | "version": "1.0.1",
2717 | "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-1.0.1.tgz",
2718 | "integrity": "sha1-jvW33lBDej/cprToZe96pVy0gDY=",
2719 | "dev": true,
2720 | "requires": {
2721 | "path-is-inside": "1.0.2"
2722 | }
2723 | },
2724 | "is-posix-bracket": {
2725 | "version": "0.1.1",
2726 | "resolved": "https://registry.npmjs.org/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz",
2727 | "integrity": "sha1-MzTceXdDaOkvAW5vvAqI9c1ua8Q=",
2728 | "dev": true
2729 | },
2730 | "is-primitive": {
2731 | "version": "2.0.0",
2732 | "resolved": "https://registry.npmjs.org/is-primitive/-/is-primitive-2.0.0.tgz",
2733 | "integrity": "sha1-IHurkWOEmcB7Kt8kCkGochADRXU=",
2734 | "dev": true
2735 | },
2736 | "is-property": {
2737 | "version": "1.0.2",
2738 | "resolved": "https://registry.npmjs.org/is-property/-/is-property-1.0.2.tgz",
2739 | "integrity": "sha1-V/4cTkhHTt1lsJkR8msc1Ald2oQ=",
2740 | "dev": true
2741 | },
2742 | "is-redirect": {
2743 | "version": "1.0.0",
2744 | "resolved": "https://registry.npmjs.org/is-redirect/-/is-redirect-1.0.0.tgz",
2745 | "integrity": "sha1-HQPd7VO9jbDzDCbk+V02/HyH3CQ=",
2746 | "dev": true
2747 | },
2748 | "is-regex": {
2749 | "version": "1.0.4",
2750 | "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.4.tgz",
2751 | "integrity": "sha1-VRdIm1RwkbCTDglWVM7SXul+lJE=",
2752 | "dev": true,
2753 | "requires": {
2754 | "has": "1.0.1"
2755 | }
2756 | },
2757 | "is-resolvable": {
2758 | "version": "1.0.1",
2759 | "resolved": "https://registry.npmjs.org/is-resolvable/-/is-resolvable-1.0.1.tgz",
2760 | "integrity": "sha512-y5CXYbzvB3jTnWAZH1Nl7ykUWb6T3BcTs56HUruwBf8MhF56n1HWqhDWnVFo8GHrUPDgvUUNVhrc2U8W7iqz5g==",
2761 | "dev": true
2762 | },
2763 | "is-retry-allowed": {
2764 | "version": "1.1.0",
2765 | "resolved": "https://registry.npmjs.org/is-retry-allowed/-/is-retry-allowed-1.1.0.tgz",
2766 | "integrity": "sha1-EaBgVotnM5REAz0BJaYaINVk+zQ=",
2767 | "dev": true
2768 | },
2769 | "is-stream": {
2770 | "version": "1.1.0",
2771 | "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz",
2772 | "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=",
2773 | "dev": true
2774 | },
2775 | "is-symbol": {
2776 | "version": "1.0.1",
2777 | "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.1.tgz",
2778 | "integrity": "sha1-PMWfAAJRlLarLjjbrmaJJWtmBXI=",
2779 | "dev": true
2780 | },
2781 | "isarray": {
2782 | "version": "1.0.0",
2783 | "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
2784 | "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=",
2785 | "dev": true
2786 | },
2787 | "isemail": {
2788 | "version": "1.2.0",
2789 | "resolved": "https://registry.npmjs.org/isemail/-/isemail-1.2.0.tgz",
2790 | "integrity": "sha1-vgPfjMPineTSxd9lASY/H6RZXpo=",
2791 | "dev": true
2792 | },
2793 | "isexe": {
2794 | "version": "2.0.0",
2795 | "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
2796 | "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=",
2797 | "dev": true
2798 | },
2799 | "isobject": {
2800 | "version": "2.1.0",
2801 | "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz",
2802 | "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=",
2803 | "dev": true,
2804 | "requires": {
2805 | "isarray": "1.0.0"
2806 | }
2807 | },
2808 | "istanbul": {
2809 | "version": "0.4.5",
2810 | "resolved": "https://registry.npmjs.org/istanbul/-/istanbul-0.4.5.tgz",
2811 | "integrity": "sha1-ZcfXPUxNqE1POsMQuRj7C4Azczs=",
2812 | "dev": true,
2813 | "requires": {
2814 | "abbrev": "1.0.9",
2815 | "async": "1.5.2",
2816 | "escodegen": "1.8.1",
2817 | "esprima": "2.7.3",
2818 | "glob": "5.0.15",
2819 | "handlebars": "4.0.11",
2820 | "js-yaml": "3.10.0",
2821 | "mkdirp": "0.5.1",
2822 | "nopt": "3.0.6",
2823 | "once": "1.4.0",
2824 | "resolve": "1.1.7",
2825 | "supports-color": "3.2.3",
2826 | "which": "1.3.0",
2827 | "wordwrap": "1.0.0"
2828 | },
2829 | "dependencies": {
2830 | "esprima": {
2831 | "version": "2.7.3",
2832 | "resolved": "https://registry.npmjs.org/esprima/-/esprima-2.7.3.tgz",
2833 | "integrity": "sha1-luO3DVd59q1JzQMmc9HDEnZ7pYE=",
2834 | "dev": true
2835 | },
2836 | "glob": {
2837 | "version": "5.0.15",
2838 | "resolved": "https://registry.npmjs.org/glob/-/glob-5.0.15.tgz",
2839 | "integrity": "sha1-G8k2ueAvSmA/zCIuz3Yz0wuLk7E=",
2840 | "dev": true,
2841 | "requires": {
2842 | "inflight": "1.0.6",
2843 | "inherits": "2.0.3",
2844 | "minimatch": "3.0.4",
2845 | "once": "1.4.0",
2846 | "path-is-absolute": "1.0.1"
2847 | }
2848 | },
2849 | "resolve": {
2850 | "version": "1.1.7",
2851 | "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.1.7.tgz",
2852 | "integrity": "sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs=",
2853 | "dev": true
2854 | },
2855 | "supports-color": {
2856 | "version": "3.2.3",
2857 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz",
2858 | "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=",
2859 | "dev": true,
2860 | "requires": {
2861 | "has-flag": "1.0.0"
2862 | }
2863 | }
2864 | }
2865 | },
2866 | "joi": {
2867 | "version": "6.10.1",
2868 | "resolved": "https://registry.npmjs.org/joi/-/joi-6.10.1.tgz",
2869 | "integrity": "sha1-TVDDGAeRIgAP5fFq8f+OGRe3fgY=",
2870 | "dev": true,
2871 | "requires": {
2872 | "hoek": "2.16.3",
2873 | "isemail": "1.2.0",
2874 | "moment": "2.19.4",
2875 | "topo": "1.1.0"
2876 | },
2877 | "dependencies": {
2878 | "hoek": {
2879 | "version": "2.16.3",
2880 | "resolved": "https://registry.npmjs.org/hoek/-/hoek-2.16.3.tgz",
2881 | "integrity": "sha1-ILt0A9POo5jpHcRxCo/xuCdKJe0=",
2882 | "dev": true
2883 | }
2884 | }
2885 | },
2886 | "js-tokens": {
2887 | "version": "3.0.2",
2888 | "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz",
2889 | "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=",
2890 | "dev": true
2891 | },
2892 | "js-yaml": {
2893 | "version": "3.10.0",
2894 | "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.10.0.tgz",
2895 | "integrity": "sha512-O2v52ffjLa9VeM43J4XocZE//WT9N0IiwDa3KSHH7Tu8CtH+1qM8SIZvnsTh6v+4yFy5KUY3BHUVwjpfAWsjIA==",
2896 | "dev": true,
2897 | "requires": {
2898 | "argparse": "1.0.9",
2899 | "esprima": "4.0.0"
2900 | }
2901 | },
2902 | "json-stable-stringify": {
2903 | "version": "1.0.1",
2904 | "resolved": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz",
2905 | "integrity": "sha1-mnWdOcXy/1A/1TAGRu1EX4jE+a8=",
2906 | "dev": true,
2907 | "requires": {
2908 | "jsonify": "0.0.0"
2909 | }
2910 | },
2911 | "json-stringify-safe": {
2912 | "version": "5.0.1",
2913 | "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz",
2914 | "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=",
2915 | "dev": true
2916 | },
2917 | "jsonify": {
2918 | "version": "0.0.0",
2919 | "resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.0.tgz",
2920 | "integrity": "sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM=",
2921 | "dev": true
2922 | },
2923 | "jsonpointer": {
2924 | "version": "4.0.1",
2925 | "resolved": "https://registry.npmjs.org/jsonpointer/-/jsonpointer-4.0.1.tgz",
2926 | "integrity": "sha1-T9kss04OnbPInIYi7PUfm5eMbLk=",
2927 | "dev": true
2928 | },
2929 | "jsonwebtoken": {
2930 | "version": "7.4.3",
2931 | "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-7.4.3.tgz",
2932 | "integrity": "sha1-d/UCHeBYtgWheD+hKD6ZgS5kVjg=",
2933 | "dev": true,
2934 | "requires": {
2935 | "joi": "6.10.1",
2936 | "jws": "3.1.4",
2937 | "lodash.once": "4.1.1",
2938 | "ms": "2.0.0",
2939 | "xtend": "4.0.1"
2940 | }
2941 | },
2942 | "jwa": {
2943 | "version": "1.1.5",
2944 | "resolved": "https://registry.npmjs.org/jwa/-/jwa-1.1.5.tgz",
2945 | "integrity": "sha1-oFUs4CIHQs1S4VN3SjKQXDDnVuU=",
2946 | "dev": true,
2947 | "requires": {
2948 | "base64url": "2.0.0",
2949 | "buffer-equal-constant-time": "1.0.1",
2950 | "ecdsa-sig-formatter": "1.0.9",
2951 | "safe-buffer": "5.1.1"
2952 | }
2953 | },
2954 | "jws": {
2955 | "version": "3.1.4",
2956 | "resolved": "https://registry.npmjs.org/jws/-/jws-3.1.4.tgz",
2957 | "integrity": "sha1-+ei5M46KhHJ31kRLFGT2GIDgUKI=",
2958 | "dev": true,
2959 | "requires": {
2960 | "base64url": "2.0.0",
2961 | "jwa": "1.1.5",
2962 | "safe-buffer": "5.1.1"
2963 | }
2964 | },
2965 | "kind-of": {
2966 | "version": "3.2.2",
2967 | "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
2968 | "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
2969 | "dev": true,
2970 | "requires": {
2971 | "is-buffer": "1.1.6"
2972 | }
2973 | },
2974 | "latest-version": {
2975 | "version": "3.1.0",
2976 | "resolved": "https://registry.npmjs.org/latest-version/-/latest-version-3.1.0.tgz",
2977 | "integrity": "sha1-ogU4P+oyKzO1rjsYq+4NwvNW7hU=",
2978 | "dev": true,
2979 | "requires": {
2980 | "package-json": "4.0.1"
2981 | }
2982 | },
2983 | "lazy-cache": {
2984 | "version": "1.0.4",
2985 | "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-1.0.4.tgz",
2986 | "integrity": "sha1-odePw6UEdMuAhF07O24dpJpEbo4=",
2987 | "dev": true,
2988 | "optional": true
2989 | },
2990 | "levn": {
2991 | "version": "0.3.0",
2992 | "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz",
2993 | "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=",
2994 | "dev": true,
2995 | "requires": {
2996 | "prelude-ls": "1.1.2",
2997 | "type-check": "0.3.2"
2998 | }
2999 | },
3000 | "lodash": {
3001 | "version": "4.17.4",
3002 | "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.4.tgz",
3003 | "integrity": "sha1-eCA6TRwyiuHYbcpkYONptX9AVa4=",
3004 | "dev": true
3005 | },
3006 | "lodash._baseassign": {
3007 | "version": "3.2.0",
3008 | "resolved": "https://registry.npmjs.org/lodash._baseassign/-/lodash._baseassign-3.2.0.tgz",
3009 | "integrity": "sha1-jDigmVAPIVrQnlnxci/QxSv+Ck4=",
3010 | "dev": true,
3011 | "requires": {
3012 | "lodash._basecopy": "3.0.1",
3013 | "lodash.keys": "3.1.2"
3014 | }
3015 | },
3016 | "lodash._basecopy": {
3017 | "version": "3.0.1",
3018 | "resolved": "https://registry.npmjs.org/lodash._basecopy/-/lodash._basecopy-3.0.1.tgz",
3019 | "integrity": "sha1-jaDmqHbPNEwK2KVIghEd08XHyjY=",
3020 | "dev": true
3021 | },
3022 | "lodash._bindcallback": {
3023 | "version": "3.0.1",
3024 | "resolved": "https://registry.npmjs.org/lodash._bindcallback/-/lodash._bindcallback-3.0.1.tgz",
3025 | "integrity": "sha1-5THCdkTPi1epnhftlbNcdIeJOS4=",
3026 | "dev": true
3027 | },
3028 | "lodash._createassigner": {
3029 | "version": "3.1.1",
3030 | "resolved": "https://registry.npmjs.org/lodash._createassigner/-/lodash._createassigner-3.1.1.tgz",
3031 | "integrity": "sha1-g4pbri/aymOsIt7o4Z+k5taXCxE=",
3032 | "dev": true,
3033 | "requires": {
3034 | "lodash._bindcallback": "3.0.1",
3035 | "lodash._isiterateecall": "3.0.9",
3036 | "lodash.restparam": "3.6.1"
3037 | }
3038 | },
3039 | "lodash._getnative": {
3040 | "version": "3.9.1",
3041 | "resolved": "https://registry.npmjs.org/lodash._getnative/-/lodash._getnative-3.9.1.tgz",
3042 | "integrity": "sha1-VwvH3t5G1hzc3mh9ZdPuy6o6r/U=",
3043 | "dev": true
3044 | },
3045 | "lodash._isiterateecall": {
3046 | "version": "3.0.9",
3047 | "resolved": "https://registry.npmjs.org/lodash._isiterateecall/-/lodash._isiterateecall-3.0.9.tgz",
3048 | "integrity": "sha1-UgOte6Ql+uhCRg5pbbnPPmqsBXw=",
3049 | "dev": true
3050 | },
3051 | "lodash.assign": {
3052 | "version": "3.2.0",
3053 | "resolved": "https://registry.npmjs.org/lodash.assign/-/lodash.assign-3.2.0.tgz",
3054 | "integrity": "sha1-POnwI0tLIiPilrj6CsH+6OvKZPo=",
3055 | "dev": true,
3056 | "requires": {
3057 | "lodash._baseassign": "3.2.0",
3058 | "lodash._createassigner": "3.1.1",
3059 | "lodash.keys": "3.1.2"
3060 | }
3061 | },
3062 | "lodash.defaults": {
3063 | "version": "3.1.2",
3064 | "resolved": "https://registry.npmjs.org/lodash.defaults/-/lodash.defaults-3.1.2.tgz",
3065 | "integrity": "sha1-xzCLGNv4vJNy1wGnNJPGEZK9Liw=",
3066 | "dev": true,
3067 | "requires": {
3068 | "lodash.assign": "3.2.0",
3069 | "lodash.restparam": "3.6.1"
3070 | }
3071 | },
3072 | "lodash.isarguments": {
3073 | "version": "3.1.0",
3074 | "resolved": "https://registry.npmjs.org/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz",
3075 | "integrity": "sha1-L1c9hcaiQon/AGY7SRwdM4/zRYo=",
3076 | "dev": true
3077 | },
3078 | "lodash.isarray": {
3079 | "version": "3.0.4",
3080 | "resolved": "https://registry.npmjs.org/lodash.isarray/-/lodash.isarray-3.0.4.tgz",
3081 | "integrity": "sha1-eeTriMNqgSKvhvhEqpvNhRtfu1U=",
3082 | "dev": true
3083 | },
3084 | "lodash.keys": {
3085 | "version": "3.1.2",
3086 | "resolved": "https://registry.npmjs.org/lodash.keys/-/lodash.keys-3.1.2.tgz",
3087 | "integrity": "sha1-TbwEcrFWvlCgsoaFXRvQsMZWCYo=",
3088 | "dev": true,
3089 | "requires": {
3090 | "lodash._getnative": "3.9.1",
3091 | "lodash.isarguments": "3.1.0",
3092 | "lodash.isarray": "3.0.4"
3093 | }
3094 | },
3095 | "lodash.once": {
3096 | "version": "4.1.1",
3097 | "resolved": "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz",
3098 | "integrity": "sha1-DdOXEhPHxW34gJd9UEyI+0cal6w=",
3099 | "dev": true
3100 | },
3101 | "lodash.restparam": {
3102 | "version": "3.6.1",
3103 | "resolved": "https://registry.npmjs.org/lodash.restparam/-/lodash.restparam-3.6.1.tgz",
3104 | "integrity": "sha1-k2pOMJ7zMKdkXtQUWYbIWuWyCAU=",
3105 | "dev": true
3106 | },
3107 | "longest": {
3108 | "version": "1.0.1",
3109 | "resolved": "https://registry.npmjs.org/longest/-/longest-1.0.1.tgz",
3110 | "integrity": "sha1-MKCy2jj3N3DoKUoNIuZiXtd9AJc=",
3111 | "dev": true
3112 | },
3113 | "lowercase-keys": {
3114 | "version": "1.0.0",
3115 | "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.0.tgz",
3116 | "integrity": "sha1-TjNms55/VFfjXxMkvfb4jQv8cwY=",
3117 | "dev": true
3118 | },
3119 | "lru-cache": {
3120 | "version": "4.1.1",
3121 | "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.1.tgz",
3122 | "integrity": "sha512-q4spe4KTfsAS1SUHLO0wz8Qiyf1+vMIAgpRYioFYDMNqKfHQbg+AVDH3i4fvpl71/P1L0dBl+fQi+P37UYf0ew==",
3123 | "dev": true,
3124 | "requires": {
3125 | "pseudomap": "1.0.2",
3126 | "yallist": "2.1.2"
3127 | }
3128 | },
3129 | "make-dir": {
3130 | "version": "1.1.0",
3131 | "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-1.1.0.tgz",
3132 | "integrity": "sha512-0Pkui4wLJ7rxvmfUvs87skoEaxmu0hCUApF8nonzpl7q//FWp9zu8W61Scz4sd/kUiqDxvUhtoam2efDyiBzcA==",
3133 | "dev": true,
3134 | "requires": {
3135 | "pify": "3.0.0"
3136 | },
3137 | "dependencies": {
3138 | "pify": {
3139 | "version": "3.0.0",
3140 | "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz",
3141 | "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=",
3142 | "dev": true
3143 | }
3144 | }
3145 | },
3146 | "map-stream": {
3147 | "version": "0.1.0",
3148 | "resolved": "https://registry.npmjs.org/map-stream/-/map-stream-0.1.0.tgz",
3149 | "integrity": "sha1-5WqpTEyAVaFkBKBnS3jyFffI4ZQ=",
3150 | "dev": true
3151 | },
3152 | "micromatch": {
3153 | "version": "2.3.11",
3154 | "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-2.3.11.tgz",
3155 | "integrity": "sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU=",
3156 | "dev": true,
3157 | "requires": {
3158 | "arr-diff": "2.0.0",
3159 | "array-unique": "0.2.1",
3160 | "braces": "1.8.5",
3161 | "expand-brackets": "0.1.5",
3162 | "extglob": "0.3.2",
3163 | "filename-regex": "2.0.1",
3164 | "is-extglob": "1.0.0",
3165 | "is-glob": "2.0.1",
3166 | "kind-of": "3.2.2",
3167 | "normalize-path": "2.1.1",
3168 | "object.omit": "2.0.1",
3169 | "parse-glob": "3.0.4",
3170 | "regex-cache": "0.4.4"
3171 | }
3172 | },
3173 | "minimatch": {
3174 | "version": "3.0.4",
3175 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz",
3176 | "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==",
3177 | "dev": true,
3178 | "requires": {
3179 | "brace-expansion": "1.1.8"
3180 | }
3181 | },
3182 | "minimist": {
3183 | "version": "1.2.0",
3184 | "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz",
3185 | "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=",
3186 | "dev": true
3187 | },
3188 | "mkdirp": {
3189 | "version": "0.5.1",
3190 | "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz",
3191 | "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=",
3192 | "dev": true,
3193 | "requires": {
3194 | "minimist": "0.0.8"
3195 | },
3196 | "dependencies": {
3197 | "minimist": {
3198 | "version": "0.0.8",
3199 | "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz",
3200 | "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=",
3201 | "dev": true
3202 | }
3203 | }
3204 | },
3205 | "moment": {
3206 | "version": "2.19.4",
3207 | "resolved": "https://registry.npmjs.org/moment/-/moment-2.19.4.tgz",
3208 | "integrity": "sha512-1xFTAknSLfc47DIxHDUbnJWC+UwgWxATmymaxIPQpmMh7LBm7ZbwVEsuushqwL2GYZU0jie4xO+TK44hJPjNSQ==",
3209 | "dev": true
3210 | },
3211 | "ms": {
3212 | "version": "2.0.0",
3213 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
3214 | "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=",
3215 | "dev": true
3216 | },
3217 | "mute-stream": {
3218 | "version": "0.0.5",
3219 | "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.5.tgz",
3220 | "integrity": "sha1-j7+rsKmKJT0xhDMfno3rc3L6xsA=",
3221 | "dev": true
3222 | },
3223 | "nan": {
3224 | "version": "2.8.0",
3225 | "resolved": "https://registry.npmjs.org/nan/-/nan-2.8.0.tgz",
3226 | "integrity": "sha1-7XFfP+neArV6XmJS2QqWZ14fCFo=",
3227 | "dev": true,
3228 | "optional": true
3229 | },
3230 | "natural-compare": {
3231 | "version": "1.4.0",
3232 | "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz",
3233 | "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=",
3234 | "dev": true
3235 | },
3236 | "nock": {
3237 | "version": "8.2.2",
3238 | "resolved": "https://registry.npmjs.org/nock/-/nock-8.2.2.tgz",
3239 | "integrity": "sha512-f4s5qR4Eg/NgaLuBYTThc/abl5mohCgIvnGdHkoqR5WgRe5amjFQTU2aia085OE8o3OAY7ZerDkRAeXfR720TA==",
3240 | "dev": true,
3241 | "requires": {
3242 | "chai": "3.5.0",
3243 | "debug": "2.6.9",
3244 | "deep-equal": "1.0.1",
3245 | "json-stringify-safe": "5.0.1",
3246 | "lodash": "4.9.0",
3247 | "mkdirp": "0.5.1",
3248 | "propagate": "0.4.0",
3249 | "qs": "6.5.1"
3250 | },
3251 | "dependencies": {
3252 | "lodash": {
3253 | "version": "4.9.0",
3254 | "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.9.0.tgz",
3255 | "integrity": "sha1-TCDXQvA86F3HAODderm8q4Xm/BQ=",
3256 | "dev": true
3257 | }
3258 | }
3259 | },
3260 | "nodemon": {
3261 | "version": "1.12.7",
3262 | "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-1.12.7.tgz",
3263 | "integrity": "sha512-Dz/9fPJUjtnwA2ceSah4Vr/K4IFsPlYaS0YF3TrppqZxRfQcqN3iN+LnrFGShiUqdWzDBTVZKUnHJRuOjPRn6w==",
3264 | "dev": true,
3265 | "requires": {
3266 | "chokidar": "1.7.0",
3267 | "debug": "2.6.9",
3268 | "es6-promise": "3.3.1",
3269 | "ignore-by-default": "1.0.1",
3270 | "lodash.defaults": "3.1.2",
3271 | "minimatch": "3.0.4",
3272 | "ps-tree": "1.1.0",
3273 | "touch": "3.1.0",
3274 | "undefsafe": "0.0.3",
3275 | "update-notifier": "2.3.0"
3276 | }
3277 | },
3278 | "nopt": {
3279 | "version": "3.0.6",
3280 | "resolved": "https://registry.npmjs.org/nopt/-/nopt-3.0.6.tgz",
3281 | "integrity": "sha1-xkZdvwirzU2zWTF/eaxopkayj/k=",
3282 | "dev": true,
3283 | "requires": {
3284 | "abbrev": "1.0.9"
3285 | }
3286 | },
3287 | "normalize-path": {
3288 | "version": "2.1.1",
3289 | "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz",
3290 | "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=",
3291 | "dev": true,
3292 | "requires": {
3293 | "remove-trailing-separator": "1.1.0"
3294 | }
3295 | },
3296 | "npm-run-path": {
3297 | "version": "2.0.2",
3298 | "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz",
3299 | "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=",
3300 | "dev": true,
3301 | "requires": {
3302 | "path-key": "2.0.1"
3303 | }
3304 | },
3305 | "number-is-nan": {
3306 | "version": "1.0.1",
3307 | "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz",
3308 | "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=",
3309 | "dev": true
3310 | },
3311 | "object-assign": {
3312 | "version": "4.1.1",
3313 | "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
3314 | "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=",
3315 | "dev": true
3316 | },
3317 | "object-inspect": {
3318 | "version": "1.3.0",
3319 | "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.3.0.tgz",
3320 | "integrity": "sha512-OHHnLgLNXpM++GnJRyyhbr2bwl3pPVm4YvaraHrRvDt/N3r+s/gDVHciA7EJBTkijKXj61ssgSAikq1fb0IBRg==",
3321 | "dev": true
3322 | },
3323 | "object-keys": {
3324 | "version": "1.0.11",
3325 | "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.0.11.tgz",
3326 | "integrity": "sha1-xUYBd4rVYPEULODgG8yotW0TQm0=",
3327 | "dev": true
3328 | },
3329 | "object.omit": {
3330 | "version": "2.0.1",
3331 | "resolved": "https://registry.npmjs.org/object.omit/-/object.omit-2.0.1.tgz",
3332 | "integrity": "sha1-Gpx0SCnznbuFjHbKNXmuKlTr0fo=",
3333 | "dev": true,
3334 | "requires": {
3335 | "for-own": "0.1.5",
3336 | "is-extendable": "0.1.1"
3337 | }
3338 | },
3339 | "once": {
3340 | "version": "1.4.0",
3341 | "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
3342 | "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=",
3343 | "dev": true,
3344 | "requires": {
3345 | "wrappy": "1.0.2"
3346 | }
3347 | },
3348 | "onetime": {
3349 | "version": "1.1.0",
3350 | "resolved": "https://registry.npmjs.org/onetime/-/onetime-1.1.0.tgz",
3351 | "integrity": "sha1-ofeDj4MUxRbwXs78vEzP4EtO14k=",
3352 | "dev": true
3353 | },
3354 | "optimist": {
3355 | "version": "0.6.1",
3356 | "resolved": "https://registry.npmjs.org/optimist/-/optimist-0.6.1.tgz",
3357 | "integrity": "sha1-2j6nRob6IaGaERwybpDrFaAZZoY=",
3358 | "dev": true,
3359 | "requires": {
3360 | "minimist": "0.0.10",
3361 | "wordwrap": "0.0.3"
3362 | },
3363 | "dependencies": {
3364 | "minimist": {
3365 | "version": "0.0.10",
3366 | "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.10.tgz",
3367 | "integrity": "sha1-3j+YVD2/lggr5IrRoMfNqDYwHc8=",
3368 | "dev": true
3369 | },
3370 | "wordwrap": {
3371 | "version": "0.0.3",
3372 | "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.3.tgz",
3373 | "integrity": "sha1-o9XabNXAvAAI03I0u68b7WMFkQc=",
3374 | "dev": true
3375 | }
3376 | }
3377 | },
3378 | "optionator": {
3379 | "version": "0.8.2",
3380 | "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.2.tgz",
3381 | "integrity": "sha1-NkxeQJ0/TWMB1sC0wFu6UBgK62Q=",
3382 | "dev": true,
3383 | "requires": {
3384 | "deep-is": "0.1.3",
3385 | "fast-levenshtein": "2.0.6",
3386 | "levn": "0.3.0",
3387 | "prelude-ls": "1.1.2",
3388 | "type-check": "0.3.2",
3389 | "wordwrap": "1.0.0"
3390 | }
3391 | },
3392 | "os-homedir": {
3393 | "version": "1.0.2",
3394 | "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz",
3395 | "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=",
3396 | "dev": true
3397 | },
3398 | "os-shim": {
3399 | "version": "0.1.3",
3400 | "resolved": "https://registry.npmjs.org/os-shim/-/os-shim-0.1.3.tgz",
3401 | "integrity": "sha1-a2LDeRz3kJ6jXtRuF2WLtBfLORc=",
3402 | "dev": true
3403 | },
3404 | "p-finally": {
3405 | "version": "1.0.0",
3406 | "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz",
3407 | "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=",
3408 | "dev": true
3409 | },
3410 | "package-json": {
3411 | "version": "4.0.1",
3412 | "resolved": "https://registry.npmjs.org/package-json/-/package-json-4.0.1.tgz",
3413 | "integrity": "sha1-iGmgQBJTZhxMTKPabCEh7VVfXu0=",
3414 | "dev": true,
3415 | "requires": {
3416 | "got": "6.7.1",
3417 | "registry-auth-token": "3.3.1",
3418 | "registry-url": "3.1.0",
3419 | "semver": "5.4.1"
3420 | }
3421 | },
3422 | "parse-glob": {
3423 | "version": "3.0.4",
3424 | "resolved": "https://registry.npmjs.org/parse-glob/-/parse-glob-3.0.4.tgz",
3425 | "integrity": "sha1-ssN2z7EfNVE7rdFz7wu246OIORw=",
3426 | "dev": true,
3427 | "requires": {
3428 | "glob-base": "0.3.0",
3429 | "is-dotfile": "1.0.3",
3430 | "is-extglob": "1.0.0",
3431 | "is-glob": "2.0.1"
3432 | }
3433 | },
3434 | "parse-ms": {
3435 | "version": "1.0.1",
3436 | "resolved": "https://registry.npmjs.org/parse-ms/-/parse-ms-1.0.1.tgz",
3437 | "integrity": "sha1-VjRtR0nXjyNDDKDHE4UK75GqNh0=",
3438 | "dev": true
3439 | },
3440 | "path-is-absolute": {
3441 | "version": "1.0.1",
3442 | "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
3443 | "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=",
3444 | "dev": true
3445 | },
3446 | "path-is-inside": {
3447 | "version": "1.0.2",
3448 | "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz",
3449 | "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=",
3450 | "dev": true
3451 | },
3452 | "path-key": {
3453 | "version": "2.0.1",
3454 | "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz",
3455 | "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=",
3456 | "dev": true
3457 | },
3458 | "path-parse": {
3459 | "version": "1.0.5",
3460 | "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.5.tgz",
3461 | "integrity": "sha1-PBrfhx6pzWyUMbbqK9dKD/BVxME=",
3462 | "dev": true
3463 | },
3464 | "pause-stream": {
3465 | "version": "0.0.11",
3466 | "resolved": "https://registry.npmjs.org/pause-stream/-/pause-stream-0.0.11.tgz",
3467 | "integrity": "sha1-/lo0sMvOErWqaitAPuLnO2AvFEU=",
3468 | "dev": true,
3469 | "requires": {
3470 | "through": "2.3.8"
3471 | }
3472 | },
3473 | "pify": {
3474 | "version": "2.3.0",
3475 | "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz",
3476 | "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=",
3477 | "dev": true
3478 | },
3479 | "pinkie": {
3480 | "version": "2.0.4",
3481 | "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz",
3482 | "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=",
3483 | "dev": true
3484 | },
3485 | "pinkie-promise": {
3486 | "version": "2.0.1",
3487 | "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz",
3488 | "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=",
3489 | "dev": true,
3490 | "requires": {
3491 | "pinkie": "2.0.4"
3492 | }
3493 | },
3494 | "plur": {
3495 | "version": "1.0.0",
3496 | "resolved": "https://registry.npmjs.org/plur/-/plur-1.0.0.tgz",
3497 | "integrity": "sha1-24XGgU9eXlo7Se/CjWBP7GKXUVY=",
3498 | "dev": true
3499 | },
3500 | "pluralize": {
3501 | "version": "1.2.1",
3502 | "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-1.2.1.tgz",
3503 | "integrity": "sha1-0aIUg/0iu0HlihL6NCGCMUCJfEU=",
3504 | "dev": true
3505 | },
3506 | "pre-commit": {
3507 | "version": "1.2.2",
3508 | "resolved": "https://registry.npmjs.org/pre-commit/-/pre-commit-1.2.2.tgz",
3509 | "integrity": "sha1-287g7p3nI15X95xW186UZBpp7sY=",
3510 | "dev": true,
3511 | "requires": {
3512 | "cross-spawn": "5.1.0",
3513 | "spawn-sync": "1.0.15",
3514 | "which": "1.2.14"
3515 | },
3516 | "dependencies": {
3517 | "which": {
3518 | "version": "1.2.14",
3519 | "resolved": "https://registry.npmjs.org/which/-/which-1.2.14.tgz",
3520 | "integrity": "sha1-mofEN48D6CfOyvGs31bHNsAcFOU=",
3521 | "dev": true,
3522 | "requires": {
3523 | "isexe": "2.0.0"
3524 | }
3525 | }
3526 | }
3527 | },
3528 | "prelude-ls": {
3529 | "version": "1.1.2",
3530 | "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz",
3531 | "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=",
3532 | "dev": true
3533 | },
3534 | "prepend-http": {
3535 | "version": "1.0.4",
3536 | "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-1.0.4.tgz",
3537 | "integrity": "sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw=",
3538 | "dev": true
3539 | },
3540 | "preserve": {
3541 | "version": "0.2.0",
3542 | "resolved": "https://registry.npmjs.org/preserve/-/preserve-0.2.0.tgz",
3543 | "integrity": "sha1-gV7R9uvGWSb4ZbMQwHE7yzMVzks=",
3544 | "dev": true
3545 | },
3546 | "pretty-ms": {
3547 | "version": "2.1.0",
3548 | "resolved": "https://registry.npmjs.org/pretty-ms/-/pretty-ms-2.1.0.tgz",
3549 | "integrity": "sha1-QlfCVt8/sLRR1q/6qwIYhBJpgdw=",
3550 | "dev": true,
3551 | "requires": {
3552 | "is-finite": "1.0.2",
3553 | "parse-ms": "1.0.1",
3554 | "plur": "1.0.0"
3555 | }
3556 | },
3557 | "process-nextick-args": {
3558 | "version": "1.0.7",
3559 | "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.7.tgz",
3560 | "integrity": "sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M=",
3561 | "dev": true
3562 | },
3563 | "progress": {
3564 | "version": "1.1.8",
3565 | "resolved": "https://registry.npmjs.org/progress/-/progress-1.1.8.tgz",
3566 | "integrity": "sha1-4mDHj2Fhzdmw5WzD4Khd4Xx6V74=",
3567 | "dev": true
3568 | },
3569 | "propagate": {
3570 | "version": "0.4.0",
3571 | "resolved": "https://registry.npmjs.org/propagate/-/propagate-0.4.0.tgz",
3572 | "integrity": "sha1-8/zKCm/gZzanulcpZgaWF8EwtIE=",
3573 | "dev": true
3574 | },
3575 | "ps-tree": {
3576 | "version": "1.1.0",
3577 | "resolved": "https://registry.npmjs.org/ps-tree/-/ps-tree-1.1.0.tgz",
3578 | "integrity": "sha1-tCGyQUDWID8e08dplrRCewjowBQ=",
3579 | "dev": true,
3580 | "requires": {
3581 | "event-stream": "3.3.4"
3582 | }
3583 | },
3584 | "pseudomap": {
3585 | "version": "1.0.2",
3586 | "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz",
3587 | "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=",
3588 | "dev": true
3589 | },
3590 | "qs": {
3591 | "version": "6.5.1",
3592 | "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.1.tgz",
3593 | "integrity": "sha512-eRzhrN1WSINYCDCbrz796z37LOe3m5tmW7RQf6oBntukAG1nmovJvhnwHHRMAfeoItc1m2Hk02WER2aQ/iqs+A==",
3594 | "dev": true
3595 | },
3596 | "randomatic": {
3597 | "version": "1.1.7",
3598 | "resolved": "https://registry.npmjs.org/randomatic/-/randomatic-1.1.7.tgz",
3599 | "integrity": "sha512-D5JUjPyJbaJDkuAazpVnSfVkLlpeO3wDlPROTMLGKG1zMFNFRgrciKo1ltz/AzNTkqE0HzDx655QOL51N06how==",
3600 | "dev": true,
3601 | "requires": {
3602 | "is-number": "3.0.0",
3603 | "kind-of": "4.0.0"
3604 | },
3605 | "dependencies": {
3606 | "is-number": {
3607 | "version": "3.0.0",
3608 | "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz",
3609 | "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=",
3610 | "dev": true,
3611 | "requires": {
3612 | "kind-of": "3.2.2"
3613 | },
3614 | "dependencies": {
3615 | "kind-of": {
3616 | "version": "3.2.2",
3617 | "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
3618 | "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
3619 | "dev": true,
3620 | "requires": {
3621 | "is-buffer": "1.1.6"
3622 | }
3623 | }
3624 | }
3625 | },
3626 | "kind-of": {
3627 | "version": "4.0.0",
3628 | "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz",
3629 | "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=",
3630 | "dev": true,
3631 | "requires": {
3632 | "is-buffer": "1.1.6"
3633 | }
3634 | }
3635 | }
3636 | },
3637 | "rc": {
3638 | "version": "1.2.2",
3639 | "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.2.tgz",
3640 | "integrity": "sha1-2M6ctX6NZNnHut2YdsfDTL48cHc=",
3641 | "dev": true,
3642 | "requires": {
3643 | "deep-extend": "0.4.2",
3644 | "ini": "1.3.5",
3645 | "minimist": "1.2.0",
3646 | "strip-json-comments": "2.0.1"
3647 | }
3648 | },
3649 | "re-emitter": {
3650 | "version": "1.1.3",
3651 | "resolved": "https://registry.npmjs.org/re-emitter/-/re-emitter-1.1.3.tgz",
3652 | "integrity": "sha1-+p4xn/3u6zWycpbvDz03TawvUqc=",
3653 | "dev": true
3654 | },
3655 | "readable-stream": {
3656 | "version": "2.3.3",
3657 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.3.tgz",
3658 | "integrity": "sha512-m+qzzcn7KUxEmd1gMbchF+Y2eIUbieUaxkWtptyHywrX0rE8QEYqPC07Vuy4Wm32/xE16NcdBctb8S0Xe/5IeQ==",
3659 | "dev": true,
3660 | "requires": {
3661 | "core-util-is": "1.0.2",
3662 | "inherits": "2.0.3",
3663 | "isarray": "1.0.0",
3664 | "process-nextick-args": "1.0.7",
3665 | "safe-buffer": "5.1.1",
3666 | "string_decoder": "1.0.3",
3667 | "util-deprecate": "1.0.2"
3668 | }
3669 | },
3670 | "readdirp": {
3671 | "version": "2.1.0",
3672 | "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.1.0.tgz",
3673 | "integrity": "sha1-TtCtBg3zBzMAxIRANz9y0cxkLXg=",
3674 | "dev": true,
3675 | "requires": {
3676 | "graceful-fs": "4.1.11",
3677 | "minimatch": "3.0.4",
3678 | "readable-stream": "2.3.3",
3679 | "set-immediate-shim": "1.0.1"
3680 | }
3681 | },
3682 | "readline2": {
3683 | "version": "1.0.1",
3684 | "resolved": "https://registry.npmjs.org/readline2/-/readline2-1.0.1.tgz",
3685 | "integrity": "sha1-QQWWCP/BVHV7cV2ZidGZ/783LjU=",
3686 | "dev": true,
3687 | "requires": {
3688 | "code-point-at": "1.1.0",
3689 | "is-fullwidth-code-point": "1.0.0",
3690 | "mute-stream": "0.0.5"
3691 | }
3692 | },
3693 | "rechoir": {
3694 | "version": "0.6.2",
3695 | "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz",
3696 | "integrity": "sha1-hSBLVNuoLVdC4oyWdW70OvUOM4Q=",
3697 | "dev": true,
3698 | "requires": {
3699 | "resolve": "1.5.0"
3700 | }
3701 | },
3702 | "redis": {
3703 | "version": "2.8.0",
3704 | "resolved": "https://registry.npmjs.org/redis/-/redis-2.8.0.tgz",
3705 | "integrity": "sha512-M1OkonEQwtRmZv4tEWF2VgpG0JWJ8Fv1PhlgT5+B+uNq2cA3Rt1Yt/ryoR+vQNOQcIEgdCdfH0jr3bDpihAw1A==",
3706 | "dev": true,
3707 | "requires": {
3708 | "double-ended-queue": "2.1.0-0",
3709 | "redis-commands": "1.3.1",
3710 | "redis-parser": "2.6.0"
3711 | }
3712 | },
3713 | "redis-commands": {
3714 | "version": "1.3.1",
3715 | "resolved": "https://registry.npmjs.org/redis-commands/-/redis-commands-1.3.1.tgz",
3716 | "integrity": "sha1-gdgm9F+pyLIBH0zXoP5ZfSQdRCs=",
3717 | "dev": true
3718 | },
3719 | "redis-connection": {
3720 | "version": "5.4.0",
3721 | "resolved": "https://registry.npmjs.org/redis-connection/-/redis-connection-5.4.0.tgz",
3722 | "integrity": "sha1-hT4v5/u671pEIzQeRH+AciuRfgU=",
3723 | "dev": true,
3724 | "requires": {
3725 | "redis": "2.8.0"
3726 | }
3727 | },
3728 | "redis-parser": {
3729 | "version": "2.6.0",
3730 | "resolved": "https://registry.npmjs.org/redis-parser/-/redis-parser-2.6.0.tgz",
3731 | "integrity": "sha1-Uu0J2srBCPGmMcB+m2mUHnoZUEs=",
3732 | "dev": true
3733 | },
3734 | "regex-cache": {
3735 | "version": "0.4.4",
3736 | "resolved": "https://registry.npmjs.org/regex-cache/-/regex-cache-0.4.4.tgz",
3737 | "integrity": "sha512-nVIZwtCjkC9YgvWkpM55B5rBhBYRZhAaJbgcFYXXsHnbZ9UZI9nnVWYZpBlCqv9ho2eZryPnWrZGsOdPwVWXWQ==",
3738 | "dev": true,
3739 | "requires": {
3740 | "is-equal-shallow": "0.1.3"
3741 | }
3742 | },
3743 | "registry-auth-token": {
3744 | "version": "3.3.1",
3745 | "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-3.3.1.tgz",
3746 | "integrity": "sha1-+w0yie4Nmtosu1KvXf5mywcNMAY=",
3747 | "dev": true,
3748 | "requires": {
3749 | "rc": "1.2.2",
3750 | "safe-buffer": "5.1.1"
3751 | }
3752 | },
3753 | "registry-url": {
3754 | "version": "3.1.0",
3755 | "resolved": "https://registry.npmjs.org/registry-url/-/registry-url-3.1.0.tgz",
3756 | "integrity": "sha1-PU74cPc93h138M+aOBQyRE4XSUI=",
3757 | "dev": true,
3758 | "requires": {
3759 | "rc": "1.2.2"
3760 | }
3761 | },
3762 | "remove-trailing-separator": {
3763 | "version": "1.1.0",
3764 | "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz",
3765 | "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=",
3766 | "dev": true
3767 | },
3768 | "repeat-element": {
3769 | "version": "1.1.2",
3770 | "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.2.tgz",
3771 | "integrity": "sha1-7wiaF40Ug7quTZPrmLT55OEdmQo=",
3772 | "dev": true
3773 | },
3774 | "repeat-string": {
3775 | "version": "1.6.1",
3776 | "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz",
3777 | "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=",
3778 | "dev": true
3779 | },
3780 | "require-uncached": {
3781 | "version": "1.0.3",
3782 | "resolved": "https://registry.npmjs.org/require-uncached/-/require-uncached-1.0.3.tgz",
3783 | "integrity": "sha1-Tg1W1slmL9MeQwEcS5WqSZVUIdM=",
3784 | "dev": true,
3785 | "requires": {
3786 | "caller-path": "0.1.0",
3787 | "resolve-from": "1.0.1"
3788 | }
3789 | },
3790 | "resolve": {
3791 | "version": "1.5.0",
3792 | "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.5.0.tgz",
3793 | "integrity": "sha512-hgoSGrc3pjzAPHNBg+KnFcK2HwlHTs/YrAGUr6qgTVUZmXv1UEXXl0bZNBKMA9fud6lRYFdPGz0xXxycPzmmiw==",
3794 | "dev": true,
3795 | "requires": {
3796 | "path-parse": "1.0.5"
3797 | }
3798 | },
3799 | "resolve-from": {
3800 | "version": "1.0.1",
3801 | "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-1.0.1.tgz",
3802 | "integrity": "sha1-Jsv+k10a7uq7Kbw/5a6wHpPUQiY=",
3803 | "dev": true
3804 | },
3805 | "restore-cursor": {
3806 | "version": "1.0.1",
3807 | "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-1.0.1.tgz",
3808 | "integrity": "sha1-NGYfRohjJ/7SmRR5FSJS35LapUE=",
3809 | "dev": true,
3810 | "requires": {
3811 | "exit-hook": "1.1.1",
3812 | "onetime": "1.1.0"
3813 | }
3814 | },
3815 | "resumer": {
3816 | "version": "0.0.0",
3817 | "resolved": "https://registry.npmjs.org/resumer/-/resumer-0.0.0.tgz",
3818 | "integrity": "sha1-8ej0YeQGS6Oegq883CqMiT0HZ1k=",
3819 | "dev": true,
3820 | "requires": {
3821 | "through": "2.3.8"
3822 | }
3823 | },
3824 | "right-align": {
3825 | "version": "0.1.3",
3826 | "resolved": "https://registry.npmjs.org/right-align/-/right-align-0.1.3.tgz",
3827 | "integrity": "sha1-YTObci/mo1FWiSENJOFMlhSGE+8=",
3828 | "dev": true,
3829 | "optional": true,
3830 | "requires": {
3831 | "align-text": "0.1.4"
3832 | }
3833 | },
3834 | "rimraf": {
3835 | "version": "2.6.2",
3836 | "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.2.tgz",
3837 | "integrity": "sha512-lreewLK/BlghmxtfH36YYVg1i8IAce4TI7oao75I1g245+6BctqTVQiBP3YUJ9C6DQOXJmkYR9X9fCLtCOJc5w==",
3838 | "dev": true,
3839 | "requires": {
3840 | "glob": "7.1.2"
3841 | }
3842 | },
3843 | "run-async": {
3844 | "version": "0.1.0",
3845 | "resolved": "https://registry.npmjs.org/run-async/-/run-async-0.1.0.tgz",
3846 | "integrity": "sha1-yK1KXhEGYeQCp9IbUw4AnyX444k=",
3847 | "dev": true,
3848 | "requires": {
3849 | "once": "1.4.0"
3850 | }
3851 | },
3852 | "rx-lite": {
3853 | "version": "3.1.2",
3854 | "resolved": "https://registry.npmjs.org/rx-lite/-/rx-lite-3.1.2.tgz",
3855 | "integrity": "sha1-Gc5QLKVyZl87ZHsQk5+X/RYV8QI=",
3856 | "dev": true
3857 | },
3858 | "safe-buffer": {
3859 | "version": "5.1.1",
3860 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz",
3861 | "integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg==",
3862 | "dev": true
3863 | },
3864 | "semver": {
3865 | "version": "5.4.1",
3866 | "resolved": "https://registry.npmjs.org/semver/-/semver-5.4.1.tgz",
3867 | "integrity": "sha512-WfG/X9+oATh81XtllIo/I8gOiY9EXRdv1cQdyykeXK17YcUW3EXUAi2To4pcH6nZtJPr7ZOpM5OMyWJZm+8Rsg==",
3868 | "dev": true
3869 | },
3870 | "semver-diff": {
3871 | "version": "2.1.0",
3872 | "resolved": "https://registry.npmjs.org/semver-diff/-/semver-diff-2.1.0.tgz",
3873 | "integrity": "sha1-S7uEN8jTfksM8aaP1ybsbWRdbTY=",
3874 | "dev": true,
3875 | "requires": {
3876 | "semver": "5.4.1"
3877 | }
3878 | },
3879 | "set-immediate-shim": {
3880 | "version": "1.0.1",
3881 | "resolved": "https://registry.npmjs.org/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz",
3882 | "integrity": "sha1-SysbJ+uAip+NzEgaWOXlb1mfP2E=",
3883 | "dev": true
3884 | },
3885 | "shebang-command": {
3886 | "version": "1.2.0",
3887 | "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz",
3888 | "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=",
3889 | "dev": true,
3890 | "requires": {
3891 | "shebang-regex": "1.0.0"
3892 | }
3893 | },
3894 | "shebang-regex": {
3895 | "version": "1.0.0",
3896 | "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz",
3897 | "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=",
3898 | "dev": true
3899 | },
3900 | "shelljs": {
3901 | "version": "0.7.8",
3902 | "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.7.8.tgz",
3903 | "integrity": "sha1-3svPh0sNHl+3LhSxZKloMEjprLM=",
3904 | "dev": true,
3905 | "requires": {
3906 | "glob": "7.1.2",
3907 | "interpret": "1.1.0",
3908 | "rechoir": "0.6.2"
3909 | }
3910 | },
3911 | "signal-exit": {
3912 | "version": "3.0.2",
3913 | "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz",
3914 | "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=",
3915 | "dev": true
3916 | },
3917 | "slice-ansi": {
3918 | "version": "0.0.4",
3919 | "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-0.0.4.tgz",
3920 | "integrity": "sha1-7b+JA/ZvfOL46v1s7tZeJkyDGzU=",
3921 | "dev": true
3922 | },
3923 | "source-map": {
3924 | "version": "0.2.0",
3925 | "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.2.0.tgz",
3926 | "integrity": "sha1-2rc/vPwrqBm03gO9b26qSBZLP50=",
3927 | "dev": true,
3928 | "optional": true,
3929 | "requires": {
3930 | "amdefine": "1.0.1"
3931 | }
3932 | },
3933 | "spawn-sync": {
3934 | "version": "1.0.15",
3935 | "resolved": "https://registry.npmjs.org/spawn-sync/-/spawn-sync-1.0.15.tgz",
3936 | "integrity": "sha1-sAeZVX63+wyDdsKdROih6mfldHY=",
3937 | "dev": true,
3938 | "requires": {
3939 | "concat-stream": "1.6.0",
3940 | "os-shim": "0.1.3"
3941 | }
3942 | },
3943 | "split": {
3944 | "version": "0.3.3",
3945 | "resolved": "https://registry.npmjs.org/split/-/split-0.3.3.tgz",
3946 | "integrity": "sha1-zQ7qXmOiEd//frDwkcQTPi0N0o8=",
3947 | "dev": true,
3948 | "requires": {
3949 | "through": "2.3.8"
3950 | }
3951 | },
3952 | "sprintf-js": {
3953 | "version": "1.0.3",
3954 | "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz",
3955 | "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=",
3956 | "dev": true
3957 | },
3958 | "stream-combiner": {
3959 | "version": "0.0.4",
3960 | "resolved": "https://registry.npmjs.org/stream-combiner/-/stream-combiner-0.0.4.tgz",
3961 | "integrity": "sha1-TV5DPBhSYd3mI8o/RMWGvPXErRQ=",
3962 | "dev": true,
3963 | "requires": {
3964 | "duplexer": "0.1.1"
3965 | }
3966 | },
3967 | "string-width": {
3968 | "version": "1.0.2",
3969 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz",
3970 | "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=",
3971 | "dev": true,
3972 | "requires": {
3973 | "code-point-at": "1.1.0",
3974 | "is-fullwidth-code-point": "1.0.0",
3975 | "strip-ansi": "3.0.1"
3976 | }
3977 | },
3978 | "string.prototype.trim": {
3979 | "version": "1.1.2",
3980 | "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.1.2.tgz",
3981 | "integrity": "sha1-0E3iyJ4Tf019IG8Ia17S+ua+jOo=",
3982 | "dev": true,
3983 | "requires": {
3984 | "define-properties": "1.1.2",
3985 | "es-abstract": "1.10.0",
3986 | "function-bind": "1.1.1"
3987 | }
3988 | },
3989 | "string_decoder": {
3990 | "version": "1.0.3",
3991 | "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz",
3992 | "integrity": "sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ==",
3993 | "dev": true,
3994 | "requires": {
3995 | "safe-buffer": "5.1.1"
3996 | }
3997 | },
3998 | "strip-ansi": {
3999 | "version": "3.0.1",
4000 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz",
4001 | "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=",
4002 | "dev": true,
4003 | "requires": {
4004 | "ansi-regex": "2.1.1"
4005 | }
4006 | },
4007 | "strip-bom": {
4008 | "version": "3.0.0",
4009 | "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz",
4010 | "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=",
4011 | "dev": true
4012 | },
4013 | "strip-eof": {
4014 | "version": "1.0.0",
4015 | "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz",
4016 | "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=",
4017 | "dev": true
4018 | },
4019 | "strip-json-comments": {
4020 | "version": "2.0.1",
4021 | "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz",
4022 | "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=",
4023 | "dev": true
4024 | },
4025 | "supports-color": {
4026 | "version": "2.0.0",
4027 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz",
4028 | "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=",
4029 | "dev": true
4030 | },
4031 | "table": {
4032 | "version": "3.8.3",
4033 | "resolved": "https://registry.npmjs.org/table/-/table-3.8.3.tgz",
4034 | "integrity": "sha1-K7xULw/amGGnVdOUf+/Ys/UThV8=",
4035 | "dev": true,
4036 | "requires": {
4037 | "ajv": "4.11.8",
4038 | "ajv-keywords": "1.5.1",
4039 | "chalk": "1.1.3",
4040 | "lodash": "4.17.4",
4041 | "slice-ansi": "0.0.4",
4042 | "string-width": "2.1.1"
4043 | },
4044 | "dependencies": {
4045 | "ansi-regex": {
4046 | "version": "3.0.0",
4047 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz",
4048 | "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=",
4049 | "dev": true
4050 | },
4051 | "is-fullwidth-code-point": {
4052 | "version": "2.0.0",
4053 | "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz",
4054 | "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=",
4055 | "dev": true
4056 | },
4057 | "string-width": {
4058 | "version": "2.1.1",
4059 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz",
4060 | "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==",
4061 | "dev": true,
4062 | "requires": {
4063 | "is-fullwidth-code-point": "2.0.0",
4064 | "strip-ansi": "4.0.0"
4065 | }
4066 | },
4067 | "strip-ansi": {
4068 | "version": "4.0.0",
4069 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz",
4070 | "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=",
4071 | "dev": true,
4072 | "requires": {
4073 | "ansi-regex": "3.0.0"
4074 | }
4075 | }
4076 | }
4077 | },
4078 | "tap-out": {
4079 | "version": "1.4.2",
4080 | "resolved": "https://registry.npmjs.org/tap-out/-/tap-out-1.4.2.tgz",
4081 | "integrity": "sha1-yQfsG/lAURHQiCY+kvVgi4jLs3o=",
4082 | "dev": true,
4083 | "requires": {
4084 | "re-emitter": "1.1.3",
4085 | "readable-stream": "2.3.3",
4086 | "split": "1.0.1",
4087 | "trim": "0.0.1"
4088 | },
4089 | "dependencies": {
4090 | "split": {
4091 | "version": "1.0.1",
4092 | "resolved": "https://registry.npmjs.org/split/-/split-1.0.1.tgz",
4093 | "integrity": "sha512-mTyOoPbrivtXnwnIxZRFYRrPNtEFKlpB2fvjSnCQUiAA6qAZzqwna5envK4uk6OIeP17CsdF3rSBGYVBsU0Tkg==",
4094 | "dev": true,
4095 | "requires": {
4096 | "through": "2.3.8"
4097 | }
4098 | }
4099 | }
4100 | },
4101 | "tap-spec": {
4102 | "version": "4.1.1",
4103 | "resolved": "https://registry.npmjs.org/tap-spec/-/tap-spec-4.1.1.tgz",
4104 | "integrity": "sha1-4unyb1IIIysfViKIyXYk1YqI8Fo=",
4105 | "dev": true,
4106 | "requires": {
4107 | "chalk": "1.1.3",
4108 | "duplexer": "0.1.1",
4109 | "figures": "1.7.0",
4110 | "lodash": "3.10.1",
4111 | "pretty-ms": "2.1.0",
4112 | "repeat-string": "1.6.1",
4113 | "tap-out": "1.4.2",
4114 | "through2": "2.0.3"
4115 | },
4116 | "dependencies": {
4117 | "lodash": {
4118 | "version": "3.10.1",
4119 | "resolved": "https://registry.npmjs.org/lodash/-/lodash-3.10.1.tgz",
4120 | "integrity": "sha1-W/Rejkm6QYnhfUgnid/RW9FAt7Y=",
4121 | "dev": true
4122 | }
4123 | }
4124 | },
4125 | "tape": {
4126 | "version": "4.8.0",
4127 | "resolved": "https://registry.npmjs.org/tape/-/tape-4.8.0.tgz",
4128 | "integrity": "sha512-TWILfEnvO7I8mFe35d98F6T5fbLaEtbFTG/lxWvid8qDfFTxt19EBijWmB4j3+Hoh5TfHE2faWs73ua+EphuBA==",
4129 | "dev": true,
4130 | "requires": {
4131 | "deep-equal": "1.0.1",
4132 | "defined": "1.0.0",
4133 | "for-each": "0.3.2",
4134 | "function-bind": "1.1.1",
4135 | "glob": "7.1.2",
4136 | "has": "1.0.1",
4137 | "inherits": "2.0.3",
4138 | "minimist": "1.2.0",
4139 | "object-inspect": "1.3.0",
4140 | "resolve": "1.4.0",
4141 | "resumer": "0.0.0",
4142 | "string.prototype.trim": "1.1.2",
4143 | "through": "2.3.8"
4144 | },
4145 | "dependencies": {
4146 | "resolve": {
4147 | "version": "1.4.0",
4148 | "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.4.0.tgz",
4149 | "integrity": "sha512-aW7sVKPufyHqOmyyLzg/J+8606v5nevBgaliIlV7nUpVMsDnoBGV/cbSLNjZAg9q0Cfd/+easKVKQ8vOu8fn1Q==",
4150 | "dev": true,
4151 | "requires": {
4152 | "path-parse": "1.0.5"
4153 | }
4154 | }
4155 | }
4156 | },
4157 | "term-size": {
4158 | "version": "1.2.0",
4159 | "resolved": "https://registry.npmjs.org/term-size/-/term-size-1.2.0.tgz",
4160 | "integrity": "sha1-RYuDiH8oj8Vtb/+/rSYuJmOO+mk=",
4161 | "dev": true,
4162 | "requires": {
4163 | "execa": "0.7.0"
4164 | }
4165 | },
4166 | "text-table": {
4167 | "version": "0.2.0",
4168 | "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz",
4169 | "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=",
4170 | "dev": true
4171 | },
4172 | "through": {
4173 | "version": "2.3.8",
4174 | "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz",
4175 | "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=",
4176 | "dev": true
4177 | },
4178 | "through2": {
4179 | "version": "2.0.3",
4180 | "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.3.tgz",
4181 | "integrity": "sha1-AARWmzfHx0ujnEPzzteNGtlBQL4=",
4182 | "dev": true,
4183 | "requires": {
4184 | "readable-stream": "2.3.3",
4185 | "xtend": "4.0.1"
4186 | }
4187 | },
4188 | "timed-out": {
4189 | "version": "4.0.1",
4190 | "resolved": "https://registry.npmjs.org/timed-out/-/timed-out-4.0.1.tgz",
4191 | "integrity": "sha1-8y6srFoXW+ol1/q1Zas+2HQe9W8=",
4192 | "dev": true
4193 | },
4194 | "topo": {
4195 | "version": "1.1.0",
4196 | "resolved": "https://registry.npmjs.org/topo/-/topo-1.1.0.tgz",
4197 | "integrity": "sha1-6ddRYV0buH3IZdsYL6HKCl71NtU=",
4198 | "dev": true,
4199 | "requires": {
4200 | "hoek": "2.16.3"
4201 | },
4202 | "dependencies": {
4203 | "hoek": {
4204 | "version": "2.16.3",
4205 | "resolved": "https://registry.npmjs.org/hoek/-/hoek-2.16.3.tgz",
4206 | "integrity": "sha1-ILt0A9POo5jpHcRxCo/xuCdKJe0=",
4207 | "dev": true
4208 | }
4209 | }
4210 | },
4211 | "touch": {
4212 | "version": "3.1.0",
4213 | "resolved": "https://registry.npmjs.org/touch/-/touch-3.1.0.tgz",
4214 | "integrity": "sha512-WBx8Uy5TLtOSRtIq+M03/sKDrXCLHxwDcquSP2c43Le03/9serjQBIztjRz6FkJez9D/hleyAXTBGLwwZUw9lA==",
4215 | "dev": true,
4216 | "requires": {
4217 | "nopt": "1.0.10"
4218 | },
4219 | "dependencies": {
4220 | "nopt": {
4221 | "version": "1.0.10",
4222 | "resolved": "https://registry.npmjs.org/nopt/-/nopt-1.0.10.tgz",
4223 | "integrity": "sha1-bd0hvSoxQXuScn3Vhfim83YI6+4=",
4224 | "dev": true,
4225 | "requires": {
4226 | "abbrev": "1.0.9"
4227 | }
4228 | }
4229 | }
4230 | },
4231 | "trim": {
4232 | "version": "0.0.1",
4233 | "resolved": "https://registry.npmjs.org/trim/-/trim-0.0.1.tgz",
4234 | "integrity": "sha1-WFhUf2spB1fulczMZm+1AITEYN0=",
4235 | "dev": true
4236 | },
4237 | "type-check": {
4238 | "version": "0.3.2",
4239 | "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz",
4240 | "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=",
4241 | "dev": true,
4242 | "requires": {
4243 | "prelude-ls": "1.1.2"
4244 | }
4245 | },
4246 | "type-detect": {
4247 | "version": "1.0.0",
4248 | "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-1.0.0.tgz",
4249 | "integrity": "sha1-diIXzAbbJY7EiQihKY6LlRIejqI=",
4250 | "dev": true
4251 | },
4252 | "typedarray": {
4253 | "version": "0.0.6",
4254 | "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz",
4255 | "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=",
4256 | "dev": true
4257 | },
4258 | "uglify-js": {
4259 | "version": "2.8.29",
4260 | "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-2.8.29.tgz",
4261 | "integrity": "sha1-KcVzMUgFe7Th913zW3qcty5qWd0=",
4262 | "dev": true,
4263 | "optional": true,
4264 | "requires": {
4265 | "source-map": "0.5.7",
4266 | "uglify-to-browserify": "1.0.2",
4267 | "yargs": "3.10.0"
4268 | },
4269 | "dependencies": {
4270 | "source-map": {
4271 | "version": "0.5.7",
4272 | "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
4273 | "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=",
4274 | "dev": true,
4275 | "optional": true
4276 | }
4277 | }
4278 | },
4279 | "uglify-to-browserify": {
4280 | "version": "1.0.2",
4281 | "resolved": "https://registry.npmjs.org/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz",
4282 | "integrity": "sha1-bgkk1r2mta/jSeOabWMoUKD4grc=",
4283 | "dev": true,
4284 | "optional": true
4285 | },
4286 | "undefsafe": {
4287 | "version": "0.0.3",
4288 | "resolved": "https://registry.npmjs.org/undefsafe/-/undefsafe-0.0.3.tgz",
4289 | "integrity": "sha1-7Mo6A+VrmvFzhbqsgSrIO5lKli8=",
4290 | "dev": true
4291 | },
4292 | "unique-string": {
4293 | "version": "1.0.0",
4294 | "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-1.0.0.tgz",
4295 | "integrity": "sha1-nhBXzKhRq7kzmPizOuGHuZyuwRo=",
4296 | "dev": true,
4297 | "requires": {
4298 | "crypto-random-string": "1.0.0"
4299 | }
4300 | },
4301 | "unzip-response": {
4302 | "version": "2.0.1",
4303 | "resolved": "https://registry.npmjs.org/unzip-response/-/unzip-response-2.0.1.tgz",
4304 | "integrity": "sha1-0vD3N9FrBhXnKmk17QQhRXLVb5c=",
4305 | "dev": true
4306 | },
4307 | "update-notifier": {
4308 | "version": "2.3.0",
4309 | "resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-2.3.0.tgz",
4310 | "integrity": "sha1-TognpruRUUCrCTVZ1wFOPruDdFE=",
4311 | "dev": true,
4312 | "requires": {
4313 | "boxen": "1.3.0",
4314 | "chalk": "2.3.0",
4315 | "configstore": "3.1.1",
4316 | "import-lazy": "2.1.0",
4317 | "is-installed-globally": "0.1.0",
4318 | "is-npm": "1.0.0",
4319 | "latest-version": "3.1.0",
4320 | "semver-diff": "2.1.0",
4321 | "xdg-basedir": "3.0.0"
4322 | },
4323 | "dependencies": {
4324 | "ansi-styles": {
4325 | "version": "3.2.0",
4326 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.0.tgz",
4327 | "integrity": "sha512-NnSOmMEYtVR2JVMIGTzynRkkaxtiq1xnFBcdQD/DnNCYPoEPsVJhM98BDyaoNOQIi7p4okdi3E27eN7GQbsUug==",
4328 | "dev": true,
4329 | "requires": {
4330 | "color-convert": "1.9.1"
4331 | }
4332 | },
4333 | "chalk": {
4334 | "version": "2.3.0",
4335 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.3.0.tgz",
4336 | "integrity": "sha512-Az5zJR2CBujap2rqXGaJKaPHyJ0IrUimvYNX+ncCy8PJP4ltOGTrHUIo097ZaL2zMeKYpiCdqDvS6zdrTFok3Q==",
4337 | "dev": true,
4338 | "requires": {
4339 | "ansi-styles": "3.2.0",
4340 | "escape-string-regexp": "1.0.5",
4341 | "supports-color": "4.5.0"
4342 | }
4343 | },
4344 | "has-flag": {
4345 | "version": "2.0.0",
4346 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-2.0.0.tgz",
4347 | "integrity": "sha1-6CB68cx7MNRGzHC3NLXovhj4jVE=",
4348 | "dev": true
4349 | },
4350 | "supports-color": {
4351 | "version": "4.5.0",
4352 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.5.0.tgz",
4353 | "integrity": "sha1-vnoN5ITexcXN34s9WRJQRJEvY1s=",
4354 | "dev": true,
4355 | "requires": {
4356 | "has-flag": "2.0.0"
4357 | }
4358 | }
4359 | }
4360 | },
4361 | "url-parse-lax": {
4362 | "version": "1.0.0",
4363 | "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-1.0.0.tgz",
4364 | "integrity": "sha1-evjzA2Rem9eaJy56FKxovAYJ2nM=",
4365 | "dev": true,
4366 | "requires": {
4367 | "prepend-http": "1.0.4"
4368 | }
4369 | },
4370 | "user-home": {
4371 | "version": "2.0.0",
4372 | "resolved": "https://registry.npmjs.org/user-home/-/user-home-2.0.0.tgz",
4373 | "integrity": "sha1-nHC/2Babwdy/SGBODwS4tJzenp8=",
4374 | "dev": true,
4375 | "requires": {
4376 | "os-homedir": "1.0.2"
4377 | }
4378 | },
4379 | "util-deprecate": {
4380 | "version": "1.0.2",
4381 | "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
4382 | "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=",
4383 | "dev": true
4384 | },
4385 | "which": {
4386 | "version": "1.3.0",
4387 | "resolved": "https://registry.npmjs.org/which/-/which-1.3.0.tgz",
4388 | "integrity": "sha512-xcJpopdamTuY5duC/KnTTNBraPK54YwpenP4lzxU8H91GudWpFv38u0CKjclE1Wi2EH2EDz5LRcHcKbCIzqGyg==",
4389 | "dev": true,
4390 | "requires": {
4391 | "isexe": "2.0.0"
4392 | }
4393 | },
4394 | "widest-line": {
4395 | "version": "2.0.0",
4396 | "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-2.0.0.tgz",
4397 | "integrity": "sha1-AUKk6KJD+IgsAjOqDgKBqnYVInM=",
4398 | "dev": true,
4399 | "requires": {
4400 | "string-width": "2.1.1"
4401 | },
4402 | "dependencies": {
4403 | "ansi-regex": {
4404 | "version": "3.0.0",
4405 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz",
4406 | "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=",
4407 | "dev": true
4408 | },
4409 | "is-fullwidth-code-point": {
4410 | "version": "2.0.0",
4411 | "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz",
4412 | "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=",
4413 | "dev": true
4414 | },
4415 | "string-width": {
4416 | "version": "2.1.1",
4417 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz",
4418 | "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==",
4419 | "dev": true,
4420 | "requires": {
4421 | "is-fullwidth-code-point": "2.0.0",
4422 | "strip-ansi": "4.0.0"
4423 | }
4424 | },
4425 | "strip-ansi": {
4426 | "version": "4.0.0",
4427 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz",
4428 | "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=",
4429 | "dev": true,
4430 | "requires": {
4431 | "ansi-regex": "3.0.0"
4432 | }
4433 | }
4434 | }
4435 | },
4436 | "window-size": {
4437 | "version": "0.1.0",
4438 | "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.1.0.tgz",
4439 | "integrity": "sha1-VDjNLqk7IC76Ohn+iIeu58lPnJ0=",
4440 | "dev": true,
4441 | "optional": true
4442 | },
4443 | "wordwrap": {
4444 | "version": "1.0.0",
4445 | "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz",
4446 | "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=",
4447 | "dev": true
4448 | },
4449 | "wrappy": {
4450 | "version": "1.0.2",
4451 | "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
4452 | "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=",
4453 | "dev": true
4454 | },
4455 | "write": {
4456 | "version": "0.2.1",
4457 | "resolved": "https://registry.npmjs.org/write/-/write-0.2.1.tgz",
4458 | "integrity": "sha1-X8A4KOJkzqP+kUVUdvejxWbLB1c=",
4459 | "dev": true,
4460 | "requires": {
4461 | "mkdirp": "0.5.1"
4462 | }
4463 | },
4464 | "write-file-atomic": {
4465 | "version": "2.3.0",
4466 | "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-2.3.0.tgz",
4467 | "integrity": "sha512-xuPeK4OdjWqtfi59ylvVL0Yn35SF3zgcAcv7rBPFHVaEapaDr4GdGgm3j7ckTwH9wHL7fGmgfAnb0+THrHb8tA==",
4468 | "dev": true,
4469 | "requires": {
4470 | "graceful-fs": "4.1.11",
4471 | "imurmurhash": "0.1.4",
4472 | "signal-exit": "3.0.2"
4473 | }
4474 | },
4475 | "xdg-basedir": {
4476 | "version": "3.0.0",
4477 | "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-3.0.0.tgz",
4478 | "integrity": "sha1-SWsswQnsqNus/i3HK2A8F8WHCtQ=",
4479 | "dev": true
4480 | },
4481 | "xtend": {
4482 | "version": "4.0.1",
4483 | "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz",
4484 | "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=",
4485 | "dev": true
4486 | },
4487 | "yallist": {
4488 | "version": "2.1.2",
4489 | "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz",
4490 | "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=",
4491 | "dev": true
4492 | },
4493 | "yargs": {
4494 | "version": "3.10.0",
4495 | "resolved": "https://registry.npmjs.org/yargs/-/yargs-3.10.0.tgz",
4496 | "integrity": "sha1-9+572FfdfB0tOMDnTvvWgdFDH9E=",
4497 | "dev": true,
4498 | "optional": true,
4499 | "requires": {
4500 | "camelcase": "1.2.1",
4501 | "cliui": "2.1.0",
4502 | "decamelize": "1.2.0",
4503 | "window-size": "0.1.0"
4504 | }
4505 | }
4506 | }
4507 | }
4508 |
--------------------------------------------------------------------------------
/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "hapi-auth-github",
3 | "version": "2.1.2",
4 | "description": "Quick & Simple GitHub Authentication for Hapi.js apps",
5 | "main": "lib/index.js",
6 | "directories": {
7 | "example": "example",
8 | "test": "test"
9 | },
10 | "scripts": {
11 | "coverage": "./node_modules/.bin/istanbul cover ./node_modules/tape/bin/tape ./test/*.test.js && ./node_modules/.bin/istanbul check-coverage --statements 100 --functions 100 --lines 100 --branches 100",
12 | "lint": "node_modules/.bin/goodparts lib/",
13 | "spec": "node ./node_modules/tape/bin/tape ./test/*.test.js | node_modules/tap-spec/bin/cmd.js",
14 | "test": "./node_modules/.bin/istanbul cover ./node_modules/tape/bin/tape ./test/*.test.js",
15 | "start": "PORT=8000 node_modules/.bin/nodemon example/github_server.js"
16 | },
17 | "repository": {
18 | "type": "git",
19 | "url": "git+https://github.com/dwyl/hapi-auth-github.git"
20 | },
21 | "keywords": [
22 | "GitHub",
23 | "Auth",
24 | "Authentication",
25 | "OAuth2",
26 | "Simple",
27 | "Easy",
28 | "Tested",
29 | "Painless"
30 | ],
31 | "author": "@rjmk & @nelsonic @dwyl",
32 | "license": "GPL-2.0",
33 | "bugs": {
34 | "url": "https://github.com/dwyl/hapi-auth-github/issues"
35 | },
36 | "homepage": "https://github.com/dwyl/hapi-auth-github#readme",
37 | "devDependencies": {
38 | "env2": "^2.2.0",
39 | "goodparts": "^1.2.1",
40 | "hapi": "^16.6.2",
41 | "hoek": "^4.1.0",
42 | "istanbul": "^0.4.5",
43 | "jsonwebtoken": "^8.1.0",
44 | "nock": "^9.1.6",
45 | "nodemon": "^1.14.10",
46 | "pre-commit": "^1.2.2",
47 | "redis-connection": "^5.4.0",
48 | "tap-spec": "^4.1.1",
49 | "tape": "^4.8.0"
50 | },
51 | "pre-commit": [
52 | "lint",
53 | "coverage"
54 | ]
55 | }
56 |
--------------------------------------------------------------------------------
/test/fixtures/sample_access_token.json:
--------------------------------------------------------------------------------
1 | {
2 | "access_token":"d9d650834c5c844dce6757a10149ac11b838b0e1",
3 | "token_type":"bearer",
4 | "scope":"repo"
5 | }
6 |
--------------------------------------------------------------------------------
/test/fixtures/sample_profile.json:
--------------------------------------------------------------------------------
1 | {
2 | "login": "octocat",
3 | "id": 1,
4 | "avatar_url": "https://github.com/images/error/octocat_happy.gif",
5 | "gravatar_id": "",
6 | "url": "https://api.github.com/users/octocat",
7 | "html_url": "https://github.com/octocat",
8 | "followers_url": "https://api.github.com/users/octocat/followers",
9 | "following_url": "https://api.github.com/users/octocat/following{/other_user}",
10 | "gists_url": "https://api.github.com/users/octocat/gists{/gist_id}",
11 | "starred_url": "https://api.github.com/users/octocat/starred{/owner}{/repo}",
12 | "subscriptions_url": "https://api.github.com/users/octocat/subscriptions",
13 | "organizations_url": "https://api.github.com/users/octocat/orgs",
14 | "repos_url": "https://api.github.com/users/octocat/repos",
15 | "events_url": "https://api.github.com/users/octocat/events{/privacy}",
16 | "received_events_url": "https://api.github.com/users/octocat/received_events",
17 | "type": "User",
18 | "site_admin": false,
19 | "name": "Alex",
20 | "company": "GitHub",
21 | "blog": "https://github.com/blog",
22 | "location": "San Francisco",
23 | "email": "octocat@github.com",
24 | "hireable": false,
25 | "bio": "There once was...",
26 | "public_repos": 2,
27 | "public_gists": 1,
28 | "followers": 20,
29 | "following": 0,
30 | "created_at": "2008-01-14T04:33:35Z",
31 | "updated_at": "2008-01-14T04:33:35Z",
32 | "total_private_repos": 100,
33 | "owned_private_repos": 100,
34 | "private_gists": 81,
35 | "disk_usage": 10000,
36 | "collaborators": 8,
37 | "plan": {
38 | "name": "Medium",
39 | "space": 400,
40 | "private_repos": 20,
41 | "collaborators": 0
42 | }
43 | }
44 |
--------------------------------------------------------------------------------
/test/fixtures/sample_response.json:
--------------------------------------------------------------------------------
1 | {
2 | "server":"GitHub.com",
3 | "date":"Wed, 18 Nov 2015 23:01:02 GMT",
4 | "content-type":"application/json; charset=utf-8",
5 | "transfer-encoding":"chunked",
6 | "connection":"close",
7 | "status":"200 OK",
8 | "content-security-policy":"default-src *; script-src assets-cdn.github.com; object-src assets-cdn.github.com; style-src 'self' 'unsafe-inline' 'unsafe-eval' assets-cdn.github.com; img-src 'self' data: assets-cdn.github.com identicons.github.com www.google-analytics.com checkout.paypal.com collector.githubapp.com *.githubusercontent.com *.gravatar.com *.wp.com; media-src 'none'; frame-src 'self' render.githubusercontent.com gist.github.com www.youtube.com player.vimeo.com checkout.paypal.com; font-src assets-cdn.github.com; connect-src 'self' live.github.com wss://live.github.com uploads.github.com status.github.com api.github.com www.google-analytics.com api.braintreegateway.com client-analytics.braintreegateway.com github-cloud.s3.amazonaws.com; base-uri 'self'; form-action 'self' github.com gist.github.com",
9 | "public-key-pins":"max-age=300; pin-sha256=\"WoiWRyIOVNa9ihaBciRSC7XHjliYS9VwUGOIud4PB18=\"; pin-sha256=\"JbQbUG5JMJUoI6brnx0x3vZF6jilxsapbXGVfjhN8Fg=\"; includeSubDomains",
10 | "cache-control":"no-cache",
11 | "vary":"X-PJAX, Accept-Encoding",
12 | "x-ua-compatible":"IE=Edge,chrome=1",
13 | "x-request-id":"330c8ea9c0f1920a7b6f3d9a059d1b59",
14 | "x-runtime":"0.014658",
15 | "strict-transport-security":"max-age=31536000; includeSubdomains; preload",
16 | "x-content-type-options":"nosniff",
17 | "x-xss-protection":"1; mode=block",
18 | "x-frame-options":"deny",
19 | "x-served-by":"a128136e4734a9f74c013356c773ece7",
20 | "x-github-request-id":"521949CD:678E:51C9887:564E40FE"
21 | }
22 |
--------------------------------------------------------------------------------
/test/github.test.js:
--------------------------------------------------------------------------------
1 | var test = require('tape');
2 | var nock = require('nock');
3 | var fs = require('fs');
4 | var dir = __dirname.split('/')[__dirname.split('/').length-1];
5 | var file = dir + __filename.replace(__dirname, '') + " > ";
6 |
7 | var server = require('../example/github_server.js');
8 |
9 | test(file+'Visit / root url expect to see a link', function(t) {
10 | var options = {
11 | method: "GET",
12 | url: "/"
13 | };
14 | server.inject(options, function(response) {
15 | t.equal(response.statusCode, 200, "Server is working.");
16 | setTimeout(function(){ server.stop(t.end); }, 100);
17 | });
18 | });
19 |
20 | // test a bad code does not crash the server!
21 | test(file+'GET /githubauth?code=oauth2codehere', function(t) {
22 | var options = {
23 | method: "GET",
24 | url: "/githubauth?code=badcode"
25 | };
26 | server.inject(options, function(response) {
27 | t.equal(response.statusCode, 401, "Bad Code is Rejected (as expected)");
28 | t.ok(response.payload.indexOf('something went wrong') > -1,
29 | 'Got: '+response.payload + ' (as expected)');
30 | server.stop(t.end);
31 | });
32 | });
33 |
34 |
35 | test(file+'MOCK GitHub OAuth2 Flow /githubauth?code=mockcode', function(t) {
36 | // google oauth2 token request url:
37 | var token_fixture = fs.readFileSync('./test/fixtures/sample_access_token.json');
38 | nock('https://github.com')
39 | .persist() // https://github.com/pgte/nock#persist
40 | .post('/login/oauth/access_token')
41 | .reply(200, token_fixture);
42 |
43 | // see: http://git.io/v4nTR for google plus api url
44 | // https://www.googleapis.com/plus/v1/people/{userId}
45 | var sample_profile = fs.readFileSync('./test/fixtures/sample_profile.json');
46 | nock('https://api.github.com')
47 | .get('/user')
48 | .reply(200, sample_profile);
49 |
50 | var options = {
51 | method: "GET",
52 | url: "/githubauth?code=mockcode"
53 | };
54 | server.inject(options, function(response) {
55 | t.equal(response.statusCode, 200, "Profile retrieved (Mock)");
56 | var expected = 'Hello Alex, You Logged in Using GitHub!';
57 | t.equal(response.payload, expected, "Got: " + expected + " (as expected)");
58 | // console.log(' - - - - - - - - - - - - - - - - - -');
59 | // console.log(response.payload);
60 | // console.log(' - - - - - - - - - - - - - - - - - -');
61 | server.stop(t.end);
62 | });
63 | });
64 |
65 | test(file+'MOCK GitHub OAuth2 Flow /githubauth?code=mockcode with custom GitHub URLs', function(t) {
66 | process.env.GITHUB_HOSTNAME = 'github.at-my-custom.host';
67 | process.env.GITHUB_API_HOSTNAME = 'api.github.at-my-custom.host';
68 |
69 | // google oauth2 token request url:
70 | var token_fixture = fs.readFileSync('./test/fixtures/sample_access_token.json');
71 | nock('https://' + process.env.GITHUB_HOSTNAME)
72 | .persist() // https://github.com/pgte/nock#persist
73 | .post('/login/oauth/access_token')
74 | .reply(200, token_fixture);
75 |
76 | // see: http://git.io/v4nTR for google plus api url
77 | // https://www.googleapis.com/plus/v1/people/{userId}
78 | var sample_profile = fs.readFileSync('./test/fixtures/sample_profile.json');
79 | nock('https://' + process.env.GITHUB_API_HOSTNAME)
80 | .get('/user')
81 | .reply(200, sample_profile);
82 |
83 | var options = {
84 | method: "GET",
85 | url: "/githubauth?code=mockcode"
86 | };
87 | server.inject(options, function(response) {
88 | t.equal(response.statusCode, 200, "Profile retrieved (Mock)");
89 | var expected = 'Hello Alex, You Logged in Using GitHub!';
90 | t.equal(response.payload, expected, "Got: " + expected + " (as expected)");
91 | // console.log(' - - - - - - - - - - - - - - - - - -');
92 | // console.log(response.payload);
93 | // console.log(' - - - - - - - - - - - - - - - - - -');
94 | server.stop(t.end);
95 | });
96 | });
97 |
--------------------------------------------------------------------------------
/test/http_request.test.js:
--------------------------------------------------------------------------------
1 | var test = require('tape');
2 | var REQUEST = require('../lib/http_request');
3 | var optsmsg = 'requires valid http request options';
4 | var cberrmsg = 'callback required as second param'
5 |
6 | test('Attepmt to invoke REQUEST WITHOUT http request options (ERROR CHECK)', function(t) {
7 | try {
8 | var result = REQUEST(); // no options or callback! :-O
9 | } catch (error){
10 | // console.log('>>> ', error.message);
11 | t.ok(error.message.indexOf(optsmsg) > -1, '*Wanted Error* Got ' + error + ' (as expected!)');
12 | t.end();
13 | }
14 | })
15 |
16 | test('Attepmt to invoke REQUEST WITHOUT VALID callback function (ERROR CHECK)', function(t) {
17 | try {
18 | var options = {
19 | hostname: '127.0.0.1', // gets over-written below if using HEROKU
20 | port: 8000, // also over-written below if using HEROKU
21 | path: '/',
22 | method: 'GET', // e.g. GET, POST, DELETE for our CRUD
23 | headers: {
24 | 'Content-Type': 'application/json'
25 | }
26 | };
27 | var result = REQUEST(options);
28 | } catch (error){
29 | // console.log(error);
30 | t.ok(error.message.indexOf(cberrmsg) > -1, '*Wanted Error* Got '+error + ' (as expected!)');
31 | t.end();
32 | }
33 | })
34 |
35 | test('Force req.on(`error`) condition in http request', function(t) {
36 | var options = {
37 | hostname: '127.0.0.1', // gets over-written below if using HEROKU
38 | port: 8000, // also over-written below if using HEROKU
39 | path: '/',
40 | method: 'GET', // e.g. GET, POST, DELETE for our CRUD
41 | headers: {
42 | 'Content-Type': 'application/json'
43 | }
44 | };
45 | REQUEST(options, function(error) {
46 | // console.log(error);
47 | t.ok(error.code === 'ECONNREFUSED', '*Wanted Error* Got '+error.code + ' (as expected!)');
48 | t.end();
49 | });
50 | })
51 |
--------------------------------------------------------------------------------