├── .gitignore ├── .travis.yml ├── LICENSE ├── README.md ├── index.js ├── package-lock.json ├── package.json └── tests ├── _create_test_db.js ├── connection_error.test.js ├── perf.test.js ├── server ├── index.js └── server_example.js └── test_db_setup.sql /.gitignore: -------------------------------------------------------------------------------- 1 | # Logs 2 | logs 3 | *.log 4 | npm-debug.log* 5 | 6 | # Runtime data 7 | pids 8 | *.pid 9 | *.seed 10 | 11 | # Directory for instrumented libs generated by jscoverage/JSCover 12 | lib-cov 13 | 14 | # Coverage directory used by tools like istanbul 15 | coverage 16 | 17 | # Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files) 18 | .grunt 19 | 20 | # node-waf configuration 21 | .lock-wscript 22 | 23 | # Compiled binary addons (https://nodejs.org/api/addons.html) 24 | build/Release 25 | 26 | # Dependency directory 27 | node_modules 28 | 29 | # Optional npm cache directory 30 | .npm 31 | 32 | # Optional REPL history 33 | .node_repl_history 34 | 35 | # Tests 36 | .nyc_output/ 37 | -------------------------------------------------------------------------------- /.travis.yml: -------------------------------------------------------------------------------- 1 | language: node_js 2 | node_js: 3 | - 12 4 | before_script: 5 | - psql -c 'create database test;' -U postgres 6 | before_install: 7 | - pip install --user codecov 8 | install: 9 | - npm install 10 | after_success: 11 | - codecov --file coverage/lcov.info --disable search 12 | env: 13 | global: 14 | - DATABASE_URL=postgres://postgres:@localhost/test 15 | addons: 16 | postgresql: "9.4" 17 | script: 18 | - npm run test 19 | after_success: npm run coverage 20 | -------------------------------------------------------------------------------- /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 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Hapi Postgres Connection (for Hapi v.19) 2 | 3 | ![hapi-postgres-connection](https://cloud.githubusercontent.com/assets/194400/13723469/73b5d8f2-e85e-11e5-82dc-943e7ebccdce.png) 4 | 5 | Creates a PostgreSQL Connection available anywhere in your Hapi application. 6 | 7 | [![Build Status](https://travis-ci.org/dwyl/hapi-postgres-connection.svg?branch=master)](https://travis-ci.org/dwyl/hapi-postgres-connection) 8 | [![codecov.io](https://codecov.io/github/dwyl/hapi-postgres-connection/coverage.svg?branch=master)](https://codecov.io/github/dwyl/hapi-postgres-connection?branch=master) 9 | [![Code Climate](https://codeclimate.com/github/dwyl/hapi-postgres-connection/badges/gpa.svg)](https://codeclimate.com/github/dwyl/hapi-postgres-connection) 10 | [![devDependency Status](https://david-dm.org/dwyl/hapi-postgres-connection/dev-status.svg)](https://david-dm.org/dwyl/hapi-postgres-connection#info=devDependencies) 11 | [![Dependency Status](https://david-dm.org/dwyl/hapi-postgres-connection.svg)](https://david-dm.org/dwyl/hapi-postgres-connection) 12 | [![npm](https://img.shields.io/npm/v/hapi-postgres-connection.svg)](https://www.npmjs.com/package/hapi-postgres-connection) 13 | [![Join the chat at https://gitter.im/dwyl/chat](https://badges.gitter.im/Join%20Chat.svg)](https://gitter.im/dwyl/chat?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge) 14 | 15 | ## *Why*? 16 | 17 | You are building a PostgreSQL-backed Hapi.js Application 18 | but don't want to be initialising a connection to Postgres 19 | in your route handler because it's *slow* and can lead 20 | to [*interesting* errors](https://github.com/brianc/node-postgres/issues/725) ... 21 | so instead, you spend 1 minute to include a *tiny, tried & tested* plugin 22 | that makes Postgres available in all your route handlers. 23 | 24 | > Got *any questions*? *ask*!! 25 | 26 | ## *What*? 27 | 28 | This Hapi Plugin creates a Connection to PostgreSQL when your 29 | server starts up and makes it available *anywhere* in your app's 30 | route handlers via `request.pg.client`. 31 | 32 | When you shut down your server (*e.g. the `server.stop` in your tests*) 33 | the connection is closed for you. 34 | 35 | ### *One Dependency*: `node-postgres` *always up-to-date* 36 | 37 | This plugin uses 38 | the *most popular* (*actively maintained*) node PostgreSQL Client. 39 | 40 | ## *How*? 41 | 42 | ### 1. *Download/Install* from NPM or Yarn 43 | 44 | ```sh 45 | npm install hapi-postgres-connection --save 46 | ``` 47 | 48 | or 49 | 50 | ```sh 51 | yarn add hapi-postgres-connection 52 | ``` 53 | 54 | ### 2. *Initialize* the plugin in your Hapi Server 55 | 56 | in your server: 57 | 58 | ```js 59 | const HapiPostgresConnection = require('hapi-postgres-connection'); 60 | 61 | await server.register({ 62 | plugin: HapiPostgresConnection 63 | }); 64 | ``` 65 | 66 | Now *all* your route handlers have access to Postgres 67 | via: `request.pg.client` 68 | 69 | You also can also access Postgres through the `getCon` method on the Hapi Postgres Connection module: `const pg = require('hapi-postgres-connection').getCon();` 70 | 71 | This method may be useful when do not have access to the request 72 | object. 73 | 74 | ### 3. Using Postgres Client in your Route Handler 75 | 76 | ```js 77 | server.route({ 78 | method: 'GET', 79 | path: '/', 80 | handler: async function(request, h) { 81 | let email = 'test@test.net'; 82 | let select = `SELECT * FROM people WHERE ${email}`; 83 | 84 | try { 85 | const result = await request.pg.client.query(insertData); 86 | console.log(result); 87 | return h.response(result.rows[0]); 88 | } catch (err) { 89 | console.log(err); 90 | } 91 | } 92 | }); 93 | ``` 94 | 95 | ### *Required/Expected* Environment Variable: `DATABASE_URL` 96 | 97 | The plugin *expects* (*requires*) that you have an Environment Variable set 98 | for the Postgres Connection URL: `DATABASE_URL` in the format: 99 | `postgres://username:password@localhost/database` 100 | 101 | This is the default used by [*Heroku*](https://www.heroku.com/postgres) 102 | so we figured it made sense to keep it. 103 | 104 | > If you are unsure how to set the Environment Variable 105 | or why this is a *good idea* 106 | (*hard-coding values in your app is a really bad idea...*) 107 | please see: 108 | 109 | ### *Optional* Environment Variable: `DATABASE_SSL` 110 | 111 | If your database connection requires the use of SSL, you can set `DATABASE_SSL` environment 112 | variable to true and the pool connection will be done accordingly. This is required 113 | (for example) by databases hosted on [*Heroku*] 114 | ( 115 | 116 | ## *Q*: Don't We need to Close the Postgres Connection? 117 | 118 | ***A***: No! The plugin handles closing the connection for you! 119 | 120 | 121 | ## *Implementation Detail* 122 | 123 | To run the tests *locally* you will need to have 124 | a running instance of PostgreSQL with a database called `test` available. 125 | 126 | Then set your `DATABASE_URL` Environment Variable, on my localhost its: 127 | 128 | ```sh 129 | export DATABASE_URL=postgres://postgres:@localhost/test 130 | ``` 131 | 132 | (*the default `postgres` user does not have a password on localhost*) 133 | 134 | ## *Motivation?* 135 | 136 | We were doing postgres connections the *hard* way in our app(s) ... 137 | We knew there had to be a *better* way 138 | After a few hours of [googling and code-reviewing](https://github.com/dwyl/hapi-login-example-postgres/issues/6) 139 | we decided to write our own little plugin to simplify things. 140 | -------------------------------------------------------------------------------- /index.js: -------------------------------------------------------------------------------- 1 | const assert = require('assert'); 2 | // if DATABASE_URL Environment Variable is unset halt the server.start 3 | assert(process.env.DATABASE_URL, 'Please set DATABASE_URL Env Variable'); 4 | 5 | const pg = require('pg'); 6 | const pkg = require('./package.json'); 7 | const PG_CON = []; // this "global" is local to the plugin. 8 | let run_once = false; 9 | 10 | // create a pool 11 | const pool = new pg.Pool({ 12 | connectionString: process.env.DATABASE_URL, 13 | ssl: process.env.DATABASE_SSL || false 14 | }); 15 | 16 | const createPoolConnection = async () => { 17 | try { 18 | const client = await pool.connect(); 19 | PG_CON.push({ client }); 20 | } catch (err) { 21 | assert(!err, pkg.name + ' ERROR Connecting to PostgreSQL!'); 22 | } 23 | } 24 | 25 | async function assign_connection (request, h) { // DRY 26 | request.pg = await module.exports.getCon(); 27 | return h.continue; 28 | } 29 | 30 | const HapiPostgresConnection = { 31 | pkg, 32 | name: 'HapiPostgresConnection', 33 | version: '1.0.0', 34 | register: async function (server) { 35 | // connection using created pool 36 | await createPoolConnection(); 37 | server.ext({ 38 | type: 'onPreAuth', 39 | method: async function (request, h) { 40 | // each connection created is shut down when the server stops (e.g tests) 41 | if(!run_once) { 42 | run_once = true; 43 | server.events.on('stop', function () { // only one server.on('stop') listener 44 | PG_CON.forEach(async function (con) { // close all the connections 45 | await con.client.end(); 46 | }); 47 | server.log(['info', pkg.name], 'DB Connection Closed'); 48 | }); 49 | } 50 | return assign_connection(request, h); 51 | } 52 | }); 53 | } 54 | }; 55 | 56 | module.exports = HapiPostgresConnection; 57 | 58 | module.exports.getCon = async function () { 59 | if (!PG_CON[0]) { 60 | await createPoolConnection(); 61 | return PG_CON[0]; 62 | } 63 | return PG_CON[0]; 64 | }; 65 | -------------------------------------------------------------------------------- /package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "hapi-postgres-connection", 3 | "version": "6.5.1", 4 | "lockfileVersion": 1, 5 | "requires": true, 6 | "dependencies": { 7 | "@babel/code-frame": { 8 | "version": "7.8.3", 9 | "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.8.3.tgz", 10 | "integrity": "sha512-a9gxpmdXtZEInkCSHUJDLHZVBgb1QS0jhss4cPP93EW7s+uC5bikET2twEF3KV+7rDblJcmNvTR7VJejqd2C2g==", 11 | "dev": true, 12 | "requires": { 13 | "@babel/highlight": "^7.8.3" 14 | } 15 | }, 16 | "@babel/core": { 17 | "version": "7.9.0", 18 | "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.9.0.tgz", 19 | "integrity": "sha512-kWc7L0fw1xwvI0zi8OKVBuxRVefwGOrKSQMvrQ3dW+bIIavBY3/NpXmpjMy7bQnLgwgzWQZ8TlM57YHpHNHz4w==", 20 | "dev": true, 21 | "requires": { 22 | "@babel/code-frame": "^7.8.3", 23 | "@babel/generator": "^7.9.0", 24 | "@babel/helper-module-transforms": "^7.9.0", 25 | "@babel/helpers": "^7.9.0", 26 | "@babel/parser": "^7.9.0", 27 | "@babel/template": "^7.8.6", 28 | "@babel/traverse": "^7.9.0", 29 | "@babel/types": "^7.9.0", 30 | "convert-source-map": "^1.7.0", 31 | "debug": "^4.1.0", 32 | "gensync": "^1.0.0-beta.1", 33 | "json5": "^2.1.2", 34 | "lodash": "^4.17.13", 35 | "resolve": "^1.3.2", 36 | "semver": "^5.4.1", 37 | "source-map": "^0.5.0" 38 | }, 39 | "dependencies": { 40 | "resolve": { 41 | "version": "1.16.1", 42 | "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.16.1.tgz", 43 | "integrity": "sha512-rmAglCSqWWMrrBv/XM6sW0NuRFiKViw/W4d9EbC4pt+49H8JwHy+mcGmALTEg504AUDcLTvb1T2q3E9AnmY+ig==", 44 | "dev": true, 45 | "requires": { 46 | "path-parse": "^1.0.6" 47 | } 48 | }, 49 | "semver": { 50 | "version": "5.7.1", 51 | "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", 52 | "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", 53 | "dev": true 54 | }, 55 | "source-map": { 56 | "version": "0.5.7", 57 | "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", 58 | "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", 59 | "dev": true 60 | } 61 | } 62 | }, 63 | "@babel/generator": { 64 | "version": "7.9.5", 65 | "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.9.5.tgz", 66 | "integrity": "sha512-GbNIxVB3ZJe3tLeDm1HSn2AhuD/mVcyLDpgtLXa5tplmWrJdF/elxB56XNqCuD6szyNkDi6wuoKXln3QeBmCHQ==", 67 | "dev": true, 68 | "requires": { 69 | "@babel/types": "^7.9.5", 70 | "jsesc": "^2.5.1", 71 | "lodash": "^4.17.13", 72 | "source-map": "^0.5.0" 73 | }, 74 | "dependencies": { 75 | "source-map": { 76 | "version": "0.5.7", 77 | "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", 78 | "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", 79 | "dev": true 80 | } 81 | } 82 | }, 83 | "@babel/helper-environment-visitor": { 84 | "version": "7.22.20", 85 | "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz", 86 | "integrity": "sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==", 87 | "dev": true 88 | }, 89 | "@babel/helper-hoist-variables": { 90 | "version": "7.22.5", 91 | "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz", 92 | "integrity": "sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==", 93 | "dev": true, 94 | "requires": { 95 | "@babel/types": "^7.22.5" 96 | }, 97 | "dependencies": { 98 | "@babel/helper-validator-identifier": { 99 | "version": "7.22.20", 100 | "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz", 101 | "integrity": "sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==", 102 | "dev": true 103 | }, 104 | "@babel/types": { 105 | "version": "7.23.0", 106 | "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.23.0.tgz", 107 | "integrity": "sha512-0oIyUfKoI3mSqMvsxBdclDwxXKXAUA8v/apZbc+iSyARYou1o8ZGDxbUYyLFoW2arqS2jDGqJuZvv1d/io1axg==", 108 | "dev": true, 109 | "requires": { 110 | "@babel/helper-string-parser": "^7.22.5", 111 | "@babel/helper-validator-identifier": "^7.22.20", 112 | "to-fast-properties": "^2.0.0" 113 | } 114 | } 115 | } 116 | }, 117 | "@babel/helper-member-expression-to-functions": { 118 | "version": "7.8.3", 119 | "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.8.3.tgz", 120 | "integrity": "sha512-fO4Egq88utkQFjbPrSHGmGLFqmrshs11d46WI+WZDESt7Wu7wN2G2Iu+NMMZJFDOVRHAMIkB5SNh30NtwCA7RA==", 121 | "dev": true, 122 | "requires": { 123 | "@babel/types": "^7.8.3" 124 | } 125 | }, 126 | "@babel/helper-module-imports": { 127 | "version": "7.8.3", 128 | "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.8.3.tgz", 129 | "integrity": "sha512-R0Bx3jippsbAEtzkpZ/6FIiuzOURPcMjHp+Z6xPe6DtApDJx+w7UYyOLanZqO8+wKR9G10s/FmHXvxaMd9s6Kg==", 130 | "dev": true, 131 | "requires": { 132 | "@babel/types": "^7.8.3" 133 | } 134 | }, 135 | "@babel/helper-module-transforms": { 136 | "version": "7.9.0", 137 | "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.9.0.tgz", 138 | "integrity": "sha512-0FvKyu0gpPfIQ8EkxlrAydOWROdHpBmiCiRwLkUiBGhCUPRRbVD2/tm3sFr/c/GWFrQ/ffutGUAnx7V0FzT2wA==", 139 | "dev": true, 140 | "requires": { 141 | "@babel/helper-module-imports": "^7.8.3", 142 | "@babel/helper-replace-supers": "^7.8.6", 143 | "@babel/helper-simple-access": "^7.8.3", 144 | "@babel/helper-split-export-declaration": "^7.8.3", 145 | "@babel/template": "^7.8.6", 146 | "@babel/types": "^7.9.0", 147 | "lodash": "^4.17.13" 148 | } 149 | }, 150 | "@babel/helper-optimise-call-expression": { 151 | "version": "7.8.3", 152 | "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.8.3.tgz", 153 | "integrity": "sha512-Kag20n86cbO2AvHca6EJsvqAd82gc6VMGule4HwebwMlwkpXuVqrNRj6CkCV2sKxgi9MyAUnZVnZ6lJ1/vKhHQ==", 154 | "dev": true, 155 | "requires": { 156 | "@babel/types": "^7.8.3" 157 | } 158 | }, 159 | "@babel/helper-replace-supers": { 160 | "version": "7.8.6", 161 | "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.8.6.tgz", 162 | "integrity": "sha512-PeMArdA4Sv/Wf4zXwBKPqVj7n9UF/xg6slNRtZW84FM7JpE1CbG8B612FyM4cxrf4fMAMGO0kR7voy1ForHHFA==", 163 | "dev": true, 164 | "requires": { 165 | "@babel/helper-member-expression-to-functions": "^7.8.3", 166 | "@babel/helper-optimise-call-expression": "^7.8.3", 167 | "@babel/traverse": "^7.8.6", 168 | "@babel/types": "^7.8.6" 169 | } 170 | }, 171 | "@babel/helper-simple-access": { 172 | "version": "7.8.3", 173 | "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.8.3.tgz", 174 | "integrity": "sha512-VNGUDjx5cCWg4vvCTR8qQ7YJYZ+HBjxOgXEl7ounz+4Sn7+LMD3CFrCTEU6/qXKbA2nKg21CwhhBzO0RpRbdCw==", 175 | "dev": true, 176 | "requires": { 177 | "@babel/template": "^7.8.3", 178 | "@babel/types": "^7.8.3" 179 | } 180 | }, 181 | "@babel/helper-split-export-declaration": { 182 | "version": "7.8.3", 183 | "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.8.3.tgz", 184 | "integrity": "sha512-3x3yOeyBhW851hroze7ElzdkeRXQYQbFIb7gLK1WQYsw2GWDay5gAJNw1sWJ0VFP6z5J1whqeXH/WCdCjZv6dA==", 185 | "dev": true, 186 | "requires": { 187 | "@babel/types": "^7.8.3" 188 | } 189 | }, 190 | "@babel/helper-string-parser": { 191 | "version": "7.22.5", 192 | "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.22.5.tgz", 193 | "integrity": "sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw==", 194 | "dev": true 195 | }, 196 | "@babel/helper-validator-identifier": { 197 | "version": "7.9.5", 198 | "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.9.5.tgz", 199 | "integrity": "sha512-/8arLKUFq882w4tWGj9JYzRpAlZgiWUJ+dtteNTDqrRBz9Iguck9Rn3ykuBDoUwh2TO4tSAJlrxDUOXWklJe4g==", 200 | "dev": true 201 | }, 202 | "@babel/helpers": { 203 | "version": "7.9.2", 204 | "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.9.2.tgz", 205 | "integrity": "sha512-JwLvzlXVPjO8eU9c/wF9/zOIN7X6h8DYf7mG4CiFRZRvZNKEF5dQ3H3V+ASkHoIB3mWhatgl5ONhyqHRI6MppA==", 206 | "dev": true, 207 | "requires": { 208 | "@babel/template": "^7.8.3", 209 | "@babel/traverse": "^7.9.0", 210 | "@babel/types": "^7.9.0" 211 | } 212 | }, 213 | "@babel/highlight": { 214 | "version": "7.9.0", 215 | "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.9.0.tgz", 216 | "integrity": "sha512-lJZPilxX7Op3Nv/2cvFdnlepPXDxi29wxteT57Q965oc5R9v86ztx0jfxVrTcBk8C2kcPkkDa2Z4T3ZsPPVWsQ==", 217 | "dev": true, 218 | "requires": { 219 | "@babel/helper-validator-identifier": "^7.9.0", 220 | "chalk": "^2.0.0", 221 | "js-tokens": "^4.0.0" 222 | }, 223 | "dependencies": { 224 | "ansi-styles": { 225 | "version": "3.2.1", 226 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", 227 | "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", 228 | "dev": true, 229 | "requires": { 230 | "color-convert": "^1.9.0" 231 | } 232 | }, 233 | "chalk": { 234 | "version": "2.4.2", 235 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", 236 | "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", 237 | "dev": true, 238 | "requires": { 239 | "ansi-styles": "^3.2.1", 240 | "escape-string-regexp": "^1.0.5", 241 | "supports-color": "^5.3.0" 242 | } 243 | }, 244 | "has-flag": { 245 | "version": "3.0.0", 246 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", 247 | "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", 248 | "dev": true 249 | }, 250 | "supports-color": { 251 | "version": "5.5.0", 252 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", 253 | "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", 254 | "dev": true, 255 | "requires": { 256 | "has-flag": "^3.0.0" 257 | } 258 | } 259 | } 260 | }, 261 | "@babel/parser": { 262 | "version": "7.9.4", 263 | "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.9.4.tgz", 264 | "integrity": "sha512-bC49otXX6N0/VYhgOMh4gnP26E9xnDZK3TmbNpxYzzz9BQLBosQwfyOe9/cXUU3txYhTzLCbcqd5c8y/OmCjHA==", 265 | "dev": true 266 | }, 267 | "@babel/template": { 268 | "version": "7.8.6", 269 | "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.8.6.tgz", 270 | "integrity": "sha512-zbMsPMy/v0PWFZEhQJ66bqjhH+z0JgMoBWuikXybgG3Gkd/3t5oQ1Rw2WQhnSrsOmsKXnZOx15tkC4qON/+JPg==", 271 | "dev": true, 272 | "requires": { 273 | "@babel/code-frame": "^7.8.3", 274 | "@babel/parser": "^7.8.6", 275 | "@babel/types": "^7.8.6" 276 | } 277 | }, 278 | "@babel/traverse": { 279 | "version": "7.23.2", 280 | "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.23.2.tgz", 281 | "integrity": "sha512-azpe59SQ48qG6nu2CzcMLbxUudtN+dOM9kDbUqGq3HXUJRlo7i8fvPoxQUzYgLZ4cMVmuZgm8vvBpNeRhd6XSw==", 282 | "dev": true, 283 | "requires": { 284 | "@babel/code-frame": "^7.22.13", 285 | "@babel/generator": "^7.23.0", 286 | "@babel/helper-environment-visitor": "^7.22.20", 287 | "@babel/helper-function-name": "^7.23.0", 288 | "@babel/helper-hoist-variables": "^7.22.5", 289 | "@babel/helper-split-export-declaration": "^7.22.6", 290 | "@babel/parser": "^7.23.0", 291 | "@babel/types": "^7.23.0", 292 | "debug": "^4.1.0", 293 | "globals": "^11.1.0" 294 | }, 295 | "dependencies": { 296 | "@babel/code-frame": { 297 | "version": "7.22.13", 298 | "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.22.13.tgz", 299 | "integrity": "sha512-XktuhWlJ5g+3TJXc5upd9Ks1HutSArik6jf2eAjYFyIOf4ej3RN+184cZbzDvbPnuTJIUhPKKJE3cIsYTiAT3w==", 300 | "dev": true, 301 | "requires": { 302 | "@babel/highlight": "^7.22.13", 303 | "chalk": "^2.4.2" 304 | } 305 | }, 306 | "@babel/generator": { 307 | "version": "7.23.0", 308 | "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.23.0.tgz", 309 | "integrity": "sha512-lN85QRR+5IbYrMWM6Y4pE/noaQtg4pNiqeNGX60eqOfo6gtEj6uw/JagelB8vVztSd7R6M5n1+PQkDbHbBRU4g==", 310 | "dev": true, 311 | "requires": { 312 | "@babel/types": "^7.23.0", 313 | "@jridgewell/gen-mapping": "^0.3.2", 314 | "@jridgewell/trace-mapping": "^0.3.17", 315 | "jsesc": "^2.5.1" 316 | } 317 | }, 318 | "@babel/helper-function-name": { 319 | "version": "7.23.0", 320 | "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz", 321 | "integrity": "sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==", 322 | "dev": true, 323 | "requires": { 324 | "@babel/template": "^7.22.15", 325 | "@babel/types": "^7.23.0" 326 | } 327 | }, 328 | "@babel/helper-split-export-declaration": { 329 | "version": "7.22.6", 330 | "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz", 331 | "integrity": "sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==", 332 | "dev": true, 333 | "requires": { 334 | "@babel/types": "^7.22.5" 335 | } 336 | }, 337 | "@babel/helper-validator-identifier": { 338 | "version": "7.22.20", 339 | "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz", 340 | "integrity": "sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==", 341 | "dev": true 342 | }, 343 | "@babel/highlight": { 344 | "version": "7.22.20", 345 | "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.22.20.tgz", 346 | "integrity": "sha512-dkdMCN3py0+ksCgYmGG8jKeGA/8Tk+gJwSYYlFGxG5lmhfKNoAy004YpLxpS1W2J8m/EK2Ew+yOs9pVRwO89mg==", 347 | "dev": true, 348 | "requires": { 349 | "@babel/helper-validator-identifier": "^7.22.20", 350 | "chalk": "^2.4.2", 351 | "js-tokens": "^4.0.0" 352 | } 353 | }, 354 | "@babel/parser": { 355 | "version": "7.23.0", 356 | "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.23.0.tgz", 357 | "integrity": "sha512-vvPKKdMemU85V9WE/l5wZEmImpCtLqbnTvqDS2U1fJ96KrxoW7KrXhNsNCblQlg8Ck4b85yxdTyelsMUgFUXiw==", 358 | "dev": true 359 | }, 360 | "@babel/template": { 361 | "version": "7.22.15", 362 | "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.15.tgz", 363 | "integrity": "sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==", 364 | "dev": true, 365 | "requires": { 366 | "@babel/code-frame": "^7.22.13", 367 | "@babel/parser": "^7.22.15", 368 | "@babel/types": "^7.22.15" 369 | } 370 | }, 371 | "@babel/types": { 372 | "version": "7.23.0", 373 | "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.23.0.tgz", 374 | "integrity": "sha512-0oIyUfKoI3mSqMvsxBdclDwxXKXAUA8v/apZbc+iSyARYou1o8ZGDxbUYyLFoW2arqS2jDGqJuZvv1d/io1axg==", 375 | "dev": true, 376 | "requires": { 377 | "@babel/helper-string-parser": "^7.22.5", 378 | "@babel/helper-validator-identifier": "^7.22.20", 379 | "to-fast-properties": "^2.0.0" 380 | } 381 | }, 382 | "ansi-styles": { 383 | "version": "3.2.1", 384 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", 385 | "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", 386 | "dev": true, 387 | "requires": { 388 | "color-convert": "^1.9.0" 389 | } 390 | }, 391 | "chalk": { 392 | "version": "2.4.2", 393 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", 394 | "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", 395 | "dev": true, 396 | "requires": { 397 | "ansi-styles": "^3.2.1", 398 | "escape-string-regexp": "^1.0.5", 399 | "supports-color": "^5.3.0" 400 | } 401 | } 402 | } 403 | }, 404 | "@babel/types": { 405 | "version": "7.9.5", 406 | "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.9.5.tgz", 407 | "integrity": "sha512-XjnvNqenk818r5zMaba+sLQjnbda31UfUURv3ei0qPQw4u+j2jMyJ5b11y8ZHYTRSI3NnInQkkkRT4fLqqPdHg==", 408 | "dev": true, 409 | "requires": { 410 | "@babel/helper-validator-identifier": "^7.9.5", 411 | "lodash": "^4.17.13", 412 | "to-fast-properties": "^2.0.0" 413 | } 414 | }, 415 | "@hapi/accept": { 416 | "version": "5.0.1", 417 | "resolved": "https://registry.npmjs.org/@hapi/accept/-/accept-5.0.1.tgz", 418 | "integrity": "sha512-fMr4d7zLzsAXo28PRRQPXR1o2Wmu+6z+VY1UzDp0iFo13Twj8WePakwXBiqn3E1aAlTpSNzCXdnnQXFhst8h8Q==", 419 | "dev": true, 420 | "requires": { 421 | "@hapi/boom": "9.x.x", 422 | "@hapi/hoek": "9.x.x" 423 | } 424 | }, 425 | "@hapi/address": { 426 | "version": "4.0.1", 427 | "resolved": "https://registry.npmjs.org/@hapi/address/-/address-4.0.1.tgz", 428 | "integrity": "sha512-0oEP5UiyV4f3d6cBL8F3Z5S7iWSX39Knnl0lY8i+6gfmmIBj44JCBNtcMgwyS+5v7j3VYavNay0NFHDS+UGQcw==", 429 | "dev": true, 430 | "requires": { 431 | "@hapi/hoek": "^9.0.0" 432 | } 433 | }, 434 | "@hapi/ammo": { 435 | "version": "5.0.1", 436 | "resolved": "https://registry.npmjs.org/@hapi/ammo/-/ammo-5.0.1.tgz", 437 | "integrity": "sha512-FbCNwcTbnQP4VYYhLNGZmA76xb2aHg9AMPiy18NZyWMG310P5KdFGyA9v2rm5ujrIny77dEEIkMOwl0Xv+fSSA==", 438 | "dev": true, 439 | "requires": { 440 | "@hapi/hoek": "9.x.x" 441 | } 442 | }, 443 | "@hapi/b64": { 444 | "version": "5.0.0", 445 | "resolved": "https://registry.npmjs.org/@hapi/b64/-/b64-5.0.0.tgz", 446 | "integrity": "sha512-ngu0tSEmrezoiIaNGG6rRvKOUkUuDdf4XTPnONHGYfSGRmDqPZX5oJL6HAdKTo1UQHECbdB4OzhWrfgVppjHUw==", 447 | "dev": true, 448 | "requires": { 449 | "@hapi/hoek": "9.x.x" 450 | } 451 | }, 452 | "@hapi/boom": { 453 | "version": "9.1.0", 454 | "resolved": "https://registry.npmjs.org/@hapi/boom/-/boom-9.1.0.tgz", 455 | "integrity": "sha512-4nZmpp4tXbm162LaZT45P7F7sgiem8dwAh2vHWT6XX24dozNjGMg6BvKCRvtCUcmcXqeMIUqWN8Rc5X8yKuROQ==", 456 | "dev": true, 457 | "requires": { 458 | "@hapi/hoek": "9.x.x" 459 | } 460 | }, 461 | "@hapi/bounce": { 462 | "version": "2.0.0", 463 | "resolved": "https://registry.npmjs.org/@hapi/bounce/-/bounce-2.0.0.tgz", 464 | "integrity": "sha512-JesW92uyzOOyuzJKjoLHM1ThiOvHPOLDHw01YV8yh5nCso7sDwJho1h0Ad2N+E62bZyz46TG3xhAi/78Gsct6A==", 465 | "dev": true, 466 | "requires": { 467 | "@hapi/boom": "9.x.x", 468 | "@hapi/hoek": "9.x.x" 469 | } 470 | }, 471 | "@hapi/bourne": { 472 | "version": "2.0.0", 473 | "resolved": "https://registry.npmjs.org/@hapi/bourne/-/bourne-2.0.0.tgz", 474 | "integrity": "sha512-WEezM1FWztfbzqIUbsDzFRVMxSoLy3HugVcux6KDDtTqzPsLE8NDRHfXvev66aH1i2oOKKar3/XDjbvh/OUBdg==", 475 | "dev": true 476 | }, 477 | "@hapi/call": { 478 | "version": "8.0.0", 479 | "resolved": "https://registry.npmjs.org/@hapi/call/-/call-8.0.0.tgz", 480 | "integrity": "sha512-4xHIWWqaIDQlVU88XAnomACSoC7iWUfaLfdu2T7I0y+HFFwZUrKKGfwn6ik4kwKsJRMnOliG3UXsF8V/94+Lkg==", 481 | "dev": true, 482 | "requires": { 483 | "@hapi/address": "4.x.x", 484 | "@hapi/boom": "9.x.x", 485 | "@hapi/hoek": "9.x.x" 486 | } 487 | }, 488 | "@hapi/catbox": { 489 | "version": "11.1.0", 490 | "resolved": "https://registry.npmjs.org/@hapi/catbox/-/catbox-11.1.0.tgz", 491 | "integrity": "sha512-FDEjfn26RZRyOEPeZdaAL7dRiAK5FOGuwTnTw0gxK30csAlKeOHsEnoIxnLIXx7QOS17eUaOk6+MiweWQM6Keg==", 492 | "dev": true, 493 | "requires": { 494 | "@hapi/boom": "9.x.x", 495 | "@hapi/hoek": "9.x.x", 496 | "@hapi/joi": "17.x.x", 497 | "@hapi/podium": "4.x.x" 498 | } 499 | }, 500 | "@hapi/catbox-memory": { 501 | "version": "5.0.0", 502 | "resolved": "https://registry.npmjs.org/@hapi/catbox-memory/-/catbox-memory-5.0.0.tgz", 503 | "integrity": "sha512-ByuxVJPHNaXwLzbBv4GdTr6ccpe1nG+AfYt+8ftDWEJY7EWBWzD+Klhy5oPTDGzU26pNUh1e7fcYI1ILZRxAXQ==", 504 | "dev": true, 505 | "requires": { 506 | "@hapi/boom": "9.x.x", 507 | "@hapi/hoek": "9.x.x" 508 | } 509 | }, 510 | "@hapi/content": { 511 | "version": "5.0.2", 512 | "resolved": "https://registry.npmjs.org/@hapi/content/-/content-5.0.2.tgz", 513 | "integrity": "sha512-mre4dl1ygd4ZyOH3tiYBrOUBzV7Pu/EOs8VLGf58vtOEECWed8Uuw6B4iR9AN/8uQt42tB04qpVaMyoMQh0oMw==", 514 | "dev": true, 515 | "requires": { 516 | "@hapi/boom": "9.x.x" 517 | } 518 | }, 519 | "@hapi/cryptiles": { 520 | "version": "5.0.0", 521 | "resolved": "https://registry.npmjs.org/@hapi/cryptiles/-/cryptiles-5.0.0.tgz", 522 | "integrity": "sha512-Yq43ti9N51Z7jbm0Q7YVCcofA+4Gh5wsBX/jZ++Z+FM8GYfBQ1WmI9ufZSL+BVX8vRxzDkdQ2fKoG6cxOQlnVQ==", 523 | "dev": true, 524 | "requires": { 525 | "@hapi/boom": "9.x.x" 526 | } 527 | }, 528 | "@hapi/file": { 529 | "version": "2.0.0", 530 | "resolved": "https://registry.npmjs.org/@hapi/file/-/file-2.0.0.tgz", 531 | "integrity": "sha512-WSrlgpvEqgPWkI18kkGELEZfXr0bYLtr16iIN4Krh9sRnzBZN6nnWxHFxtsnP684wueEySBbXPDg/WfA9xJdBQ==", 532 | "dev": true 533 | }, 534 | "@hapi/formula": { 535 | "version": "2.0.0", 536 | "resolved": "https://registry.npmjs.org/@hapi/formula/-/formula-2.0.0.tgz", 537 | "integrity": "sha512-V87P8fv7PI0LH7LiVi8Lkf3x+KCO7pQozXRssAHNXXL9L1K+uyu4XypLXwxqVDKgyQai6qj3/KteNlrqDx4W5A==", 538 | "dev": true 539 | }, 540 | "@hapi/hapi": { 541 | "version": "19.1.1", 542 | "resolved": "https://registry.npmjs.org/@hapi/hapi/-/hapi-19.1.1.tgz", 543 | "integrity": "sha512-rpQzSs0XsHSF7usM4qdJJ0Bcmhs9stWhUW3OiamW33bw4qL8q3uEgUKB9KH8ODmluCAkkXOQ0X0Dh9t94E5VIw==", 544 | "dev": true, 545 | "requires": { 546 | "@hapi/accept": "^5.0.1", 547 | "@hapi/ammo": "^5.0.1", 548 | "@hapi/boom": "9.x.x", 549 | "@hapi/bounce": "2.x.x", 550 | "@hapi/call": "8.x.x", 551 | "@hapi/catbox": "11.x.x", 552 | "@hapi/catbox-memory": "5.x.x", 553 | "@hapi/heavy": "7.x.x", 554 | "@hapi/hoek": "9.x.x", 555 | "@hapi/joi": "17.x.x", 556 | "@hapi/mimos": "5.x.x", 557 | "@hapi/podium": "4.x.x", 558 | "@hapi/shot": "5.x.x", 559 | "@hapi/somever": "3.x.x", 560 | "@hapi/statehood": "^7.0.2", 561 | "@hapi/subtext": "^7.0.3", 562 | "@hapi/teamwork": "4.x.x", 563 | "@hapi/topo": "5.x.x" 564 | } 565 | }, 566 | "@hapi/heavy": { 567 | "version": "7.0.0", 568 | "resolved": "https://registry.npmjs.org/@hapi/heavy/-/heavy-7.0.0.tgz", 569 | "integrity": "sha512-n/nheUG6zNleWkjY+3fzV3VJIAumUCaa/WoTmurjqlYY5JgC5ZKOpvP7tWi8rXmKZhbcXgjH3fHFoM55LoBT7g==", 570 | "dev": true, 571 | "requires": { 572 | "@hapi/boom": "9.x.x", 573 | "@hapi/hoek": "9.x.x", 574 | "@hapi/joi": "17.x.x" 575 | } 576 | }, 577 | "@hapi/hoek": { 578 | "version": "9.0.4", 579 | "resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-9.0.4.tgz", 580 | "integrity": "sha512-EwaJS7RjoXUZ2cXXKZZxZqieGtc7RbvQhUy8FwDoMQtxWVi14tFjeFCYPZAM1mBCpOpiBpyaZbb9NeHc7eGKgw==", 581 | "dev": true 582 | }, 583 | "@hapi/iron": { 584 | "version": "6.0.0", 585 | "resolved": "https://registry.npmjs.org/@hapi/iron/-/iron-6.0.0.tgz", 586 | "integrity": "sha512-zvGvWDufiTGpTJPG1Y/McN8UqWBu0k/xs/7l++HVU535NLHXsHhy54cfEMdW7EjwKfbBfM9Xy25FmTiobb7Hvw==", 587 | "dev": true, 588 | "requires": { 589 | "@hapi/b64": "5.x.x", 590 | "@hapi/boom": "9.x.x", 591 | "@hapi/bourne": "2.x.x", 592 | "@hapi/cryptiles": "5.x.x", 593 | "@hapi/hoek": "9.x.x" 594 | } 595 | }, 596 | "@hapi/joi": { 597 | "version": "17.1.1", 598 | "resolved": "https://registry.npmjs.org/@hapi/joi/-/joi-17.1.1.tgz", 599 | "integrity": "sha512-p4DKeZAoeZW4g3u7ZeRo+vCDuSDgSvtsB/NpfjXEHTUjSeINAi/RrVOWiVQ1isaoLzMvFEhe8n5065mQq1AdQg==", 600 | "dev": true, 601 | "requires": { 602 | "@hapi/address": "^4.0.1", 603 | "@hapi/formula": "^2.0.0", 604 | "@hapi/hoek": "^9.0.0", 605 | "@hapi/pinpoint": "^2.0.0", 606 | "@hapi/topo": "^5.0.0" 607 | } 608 | }, 609 | "@hapi/mimos": { 610 | "version": "5.0.0", 611 | "resolved": "https://registry.npmjs.org/@hapi/mimos/-/mimos-5.0.0.tgz", 612 | "integrity": "sha512-EVS6wJYeE73InTlPWt+2e3Izn319iIvffDreci3qDNT+t3lA5ylJ0/SoTaID8e0TPNUkHUSsgJZXEmLHvoYzrA==", 613 | "dev": true, 614 | "requires": { 615 | "@hapi/hoek": "9.x.x", 616 | "mime-db": "1.x.x" 617 | } 618 | }, 619 | "@hapi/nigel": { 620 | "version": "4.0.0", 621 | "resolved": "https://registry.npmjs.org/@hapi/nigel/-/nigel-4.0.0.tgz", 622 | "integrity": "sha512-Bqs1pjcDnDQo/XGoiCCNHWTFcMzPbz3L4KU04njeFQMzzEmsojMRX7TX+PezQYCMKtHJOtMg0bHxZyMGqYtbSA==", 623 | "dev": true, 624 | "requires": { 625 | "@hapi/hoek": "9.x.x", 626 | "@hapi/vise": "4.x.x" 627 | } 628 | }, 629 | "@hapi/pez": { 630 | "version": "5.0.2", 631 | "resolved": "https://registry.npmjs.org/@hapi/pez/-/pez-5.0.2.tgz", 632 | "integrity": "sha512-jr1lAm8mE7J2IBxvDIuDI1qy2aAsoaD2jxOUd/7JRg/Vmrzco8HdKhtz4fKk6KHU6zbbsAp5m5aSWWVTUrag7g==", 633 | "dev": true, 634 | "requires": { 635 | "@hapi/b64": "5.x.x", 636 | "@hapi/boom": "9.x.x", 637 | "@hapi/content": "^5.0.2", 638 | "@hapi/hoek": "9.x.x", 639 | "@hapi/nigel": "4.x.x" 640 | } 641 | }, 642 | "@hapi/pinpoint": { 643 | "version": "2.0.0", 644 | "resolved": "https://registry.npmjs.org/@hapi/pinpoint/-/pinpoint-2.0.0.tgz", 645 | "integrity": "sha512-vzXR5MY7n4XeIvLpfl3HtE3coZYO4raKXW766R6DZw/6aLqR26iuZ109K7a0NtF2Db0jxqh7xz2AxkUwpUFybw==", 646 | "dev": true 647 | }, 648 | "@hapi/podium": { 649 | "version": "4.1.0", 650 | "resolved": "https://registry.npmjs.org/@hapi/podium/-/podium-4.1.0.tgz", 651 | "integrity": "sha512-k/n0McAu8PvonfQRLyKKUvvdb+Gh/O5iAeIwv535Hpxw9B1qZcrYdZyWtHZ8O5PkA9/b/Kk+BdvtgcxeKMB/2g==", 652 | "dev": true, 653 | "requires": { 654 | "@hapi/hoek": "9.x.x", 655 | "@hapi/joi": "17.x.x", 656 | "@hapi/teamwork": "4.x.x" 657 | } 658 | }, 659 | "@hapi/shot": { 660 | "version": "5.0.0", 661 | "resolved": "https://registry.npmjs.org/@hapi/shot/-/shot-5.0.0.tgz", 662 | "integrity": "sha512-JXddnJkRh3Xhv9lY1tA+TSIUaoODKbdNIPL/M8WFvFQKOttmGaDeqTW5e8Gf01LtLI7L5DraLMULHjrK1+YNFg==", 663 | "dev": true, 664 | "requires": { 665 | "@hapi/hoek": "9.x.x", 666 | "@hapi/joi": "17.x.x" 667 | } 668 | }, 669 | "@hapi/somever": { 670 | "version": "3.0.0", 671 | "resolved": "https://registry.npmjs.org/@hapi/somever/-/somever-3.0.0.tgz", 672 | "integrity": "sha512-Upw/kmKotC9iEmK4y047HMYe4LDKsE5NWfjgX41XNKmFvxsQL7OiaCWVhuyyhU0ShDGBfIAnCH8jZr49z/JzZA==", 673 | "dev": true, 674 | "requires": { 675 | "@hapi/bounce": "2.x.x", 676 | "@hapi/hoek": "9.x.x" 677 | } 678 | }, 679 | "@hapi/statehood": { 680 | "version": "7.0.2", 681 | "resolved": "https://registry.npmjs.org/@hapi/statehood/-/statehood-7.0.2.tgz", 682 | "integrity": "sha512-+0VNxysQu+UYzkfvAXq3X4aN65TnUwiR7gsq2cQ/4Rq26nCJjHAfrkYReEeshU2hPmJ3m5QuaBzyDqRm8WOpyg==", 683 | "dev": true, 684 | "requires": { 685 | "@hapi/boom": "9.x.x", 686 | "@hapi/bounce": "2.x.x", 687 | "@hapi/bourne": "2.x.x", 688 | "@hapi/cryptiles": "5.x.x", 689 | "@hapi/hoek": "9.x.x", 690 | "@hapi/iron": "6.x.x", 691 | "@hapi/joi": "17.x.x" 692 | } 693 | }, 694 | "@hapi/subtext": { 695 | "version": "7.0.3", 696 | "resolved": "https://registry.npmjs.org/@hapi/subtext/-/subtext-7.0.3.tgz", 697 | "integrity": "sha512-CekDizZkDGERJ01C0+TzHlKtqdXZxzSWTOaH6THBrbOHnsr3GY+yiMZC+AfNCypfE17RaIakGIAbpL2Tk1z2+A==", 698 | "dev": true, 699 | "requires": { 700 | "@hapi/boom": "9.x.x", 701 | "@hapi/bourne": "2.x.x", 702 | "@hapi/content": "^5.0.2", 703 | "@hapi/file": "2.x.x", 704 | "@hapi/hoek": "9.x.x", 705 | "@hapi/pez": "^5.0.1", 706 | "@hapi/wreck": "17.x.x" 707 | } 708 | }, 709 | "@hapi/teamwork": { 710 | "version": "4.0.0", 711 | "resolved": "https://registry.npmjs.org/@hapi/teamwork/-/teamwork-4.0.0.tgz", 712 | "integrity": "sha512-V6xYOrr5aFv/IJqNPneaYCu8vuGTKisamqHVRS3JJnbZr18TrpXdsJOYk9pjPhFti+M2YETPebQLUr820N5NoQ==", 713 | "dev": true 714 | }, 715 | "@hapi/topo": { 716 | "version": "5.0.0", 717 | "resolved": "https://registry.npmjs.org/@hapi/topo/-/topo-5.0.0.tgz", 718 | "integrity": "sha512-tFJlT47db0kMqVm3H4nQYgn6Pwg10GTZHb1pwmSiv1K4ks6drQOtfEF5ZnPjkvC+y4/bUPHK+bc87QvLcL+WMw==", 719 | "dev": true, 720 | "requires": { 721 | "@hapi/hoek": "^9.0.0" 722 | } 723 | }, 724 | "@hapi/vise": { 725 | "version": "4.0.0", 726 | "resolved": "https://registry.npmjs.org/@hapi/vise/-/vise-4.0.0.tgz", 727 | "integrity": "sha512-eYyLkuUiFZTer59h+SGy7hUm+qE9p+UemePTHLlIWppEd+wExn3Df5jO04bFQTm7nleF5V8CtuYQYb+VFpZ6Sg==", 728 | "dev": true, 729 | "requires": { 730 | "@hapi/hoek": "9.x.x" 731 | } 732 | }, 733 | "@hapi/wreck": { 734 | "version": "17.0.0", 735 | "resolved": "https://registry.npmjs.org/@hapi/wreck/-/wreck-17.0.0.tgz", 736 | "integrity": "sha512-d8lqCinbKyDByn7GzJDRDbitddhIEydNm44UcAMejfhEH3o4IYvKYq6K8cAqXbilXPuvZc0ErlUOg9SDdgRtMw==", 737 | "dev": true, 738 | "requires": { 739 | "@hapi/boom": "9.x.x", 740 | "@hapi/bourne": "2.x.x", 741 | "@hapi/hoek": "9.x.x" 742 | } 743 | }, 744 | "@istanbuljs/load-nyc-config": { 745 | "version": "1.0.0", 746 | "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.0.0.tgz", 747 | "integrity": "sha512-ZR0rq/f/E4f4XcgnDvtMWXCUJpi8eO0rssVhmztsZqLIEFA9UUP9zmpE0VxlM+kv/E1ul2I876Fwil2ayptDVg==", 748 | "dev": true, 749 | "requires": { 750 | "camelcase": "^5.3.1", 751 | "find-up": "^4.1.0", 752 | "js-yaml": "^3.13.1", 753 | "resolve-from": "^5.0.0" 754 | }, 755 | "dependencies": { 756 | "find-up": { 757 | "version": "4.1.0", 758 | "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", 759 | "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", 760 | "dev": true, 761 | "requires": { 762 | "locate-path": "^5.0.0", 763 | "path-exists": "^4.0.0" 764 | } 765 | }, 766 | "locate-path": { 767 | "version": "5.0.0", 768 | "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", 769 | "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", 770 | "dev": true, 771 | "requires": { 772 | "p-locate": "^4.1.0" 773 | } 774 | }, 775 | "p-limit": { 776 | "version": "2.3.0", 777 | "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", 778 | "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", 779 | "dev": true, 780 | "requires": { 781 | "p-try": "^2.0.0" 782 | } 783 | }, 784 | "p-locate": { 785 | "version": "4.1.0", 786 | "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", 787 | "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", 788 | "dev": true, 789 | "requires": { 790 | "p-limit": "^2.2.0" 791 | } 792 | }, 793 | "p-try": { 794 | "version": "2.2.0", 795 | "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", 796 | "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", 797 | "dev": true 798 | }, 799 | "path-exists": { 800 | "version": "4.0.0", 801 | "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", 802 | "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", 803 | "dev": true 804 | } 805 | } 806 | }, 807 | "@istanbuljs/schema": { 808 | "version": "0.1.2", 809 | "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.2.tgz", 810 | "integrity": "sha512-tsAQNx32a8CoFhjhijUIhI4kccIAgmGhy8LZMZgGfmXcpMbPRUqn5LWmgRttILi6yeGmBJd2xsPkFMs0PzgPCw==", 811 | "dev": true 812 | }, 813 | "@jridgewell/gen-mapping": { 814 | "version": "0.3.3", 815 | "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", 816 | "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==", 817 | "dev": true, 818 | "requires": { 819 | "@jridgewell/set-array": "^1.0.1", 820 | "@jridgewell/sourcemap-codec": "^1.4.10", 821 | "@jridgewell/trace-mapping": "^0.3.9" 822 | } 823 | }, 824 | "@jridgewell/resolve-uri": { 825 | "version": "3.1.1", 826 | "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz", 827 | "integrity": "sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==", 828 | "dev": true 829 | }, 830 | "@jridgewell/set-array": { 831 | "version": "1.1.2", 832 | "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", 833 | "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", 834 | "dev": true 835 | }, 836 | "@jridgewell/sourcemap-codec": { 837 | "version": "1.4.15", 838 | "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", 839 | "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==", 840 | "dev": true 841 | }, 842 | "@jridgewell/trace-mapping": { 843 | "version": "0.3.20", 844 | "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.20.tgz", 845 | "integrity": "sha512-R8LcPeWZol2zR8mmH3JeKQ6QRCFb7XgUhV9ZlGhHLGyg4wpPiPZNQOOWhFZhxKw8u//yTbNGI42Bx/3paXEQ+Q==", 846 | "dev": true, 847 | "requires": { 848 | "@jridgewell/resolve-uri": "^3.1.0", 849 | "@jridgewell/sourcemap-codec": "^1.4.14" 850 | } 851 | }, 852 | "@tootallnate/once": { 853 | "version": "1.1.2", 854 | "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-1.1.2.tgz", 855 | "integrity": "sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==", 856 | "dev": true 857 | }, 858 | "@types/color-name": { 859 | "version": "1.1.1", 860 | "resolved": "https://registry.npmjs.org/@types/color-name/-/color-name-1.1.1.tgz", 861 | "integrity": "sha512-rr+OQyAjxze7GgWrSaJwydHStIhHq2lvY3BOC2Mj7KnzI7XK0Uw1TOOdI9lDoajEbSWLiYgoo4f1R51erQfhPQ==", 862 | "dev": true 863 | }, 864 | "agent-base": { 865 | "version": "6.0.2", 866 | "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", 867 | "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", 868 | "dev": true, 869 | "requires": { 870 | "debug": "4" 871 | } 872 | }, 873 | "aggregate-error": { 874 | "version": "3.0.1", 875 | "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.0.1.tgz", 876 | "integrity": "sha512-quoaXsZ9/BLNae5yiNoUz+Nhkwz83GhWwtYFglcjEQB2NDHCIpApbqXxIFnm4Pq/Nvhrsq5sYJFyohrrxnTGAA==", 877 | "dev": true, 878 | "requires": { 879 | "clean-stack": "^2.0.0", 880 | "indent-string": "^4.0.0" 881 | } 882 | }, 883 | "ansi-regex": { 884 | "version": "2.1.1", 885 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", 886 | "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", 887 | "dev": true 888 | }, 889 | "ansi-styles": { 890 | "version": "2.2.1", 891 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", 892 | "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", 893 | "dev": true 894 | }, 895 | "append-transform": { 896 | "version": "2.0.0", 897 | "resolved": "https://registry.npmjs.org/append-transform/-/append-transform-2.0.0.tgz", 898 | "integrity": "sha512-7yeyCEurROLQJFv5Xj4lEGTy0borxepjFv1g22oAdqFu//SrAlDl1O1Nxx15SH1RoliUml6p8dwJW9jvZughhg==", 899 | "dev": true, 900 | "requires": { 901 | "default-require-extensions": "^3.0.0" 902 | } 903 | }, 904 | "archy": { 905 | "version": "1.0.0", 906 | "resolved": "https://registry.npmjs.org/archy/-/archy-1.0.0.tgz", 907 | "integrity": "sha1-+cjBN1fMHde8N5rHeyxipcKGjEA=", 908 | "dev": true 909 | }, 910 | "argparse": { 911 | "version": "1.0.10", 912 | "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", 913 | "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", 914 | "dev": true, 915 | "requires": { 916 | "sprintf-js": "~1.0.2" 917 | } 918 | }, 919 | "argv": { 920 | "version": "0.0.2", 921 | "resolved": "https://registry.npmjs.org/argv/-/argv-0.0.2.tgz", 922 | "integrity": "sha1-7L0W+JSbFXGDcRsb2jNPN4QBhas=", 923 | "dev": true 924 | }, 925 | "balanced-match": { 926 | "version": "1.0.0", 927 | "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", 928 | "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", 929 | "dev": true 930 | }, 931 | "brace-expansion": { 932 | "version": "1.1.11", 933 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", 934 | "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", 935 | "dev": true, 936 | "requires": { 937 | "balanced-match": "^1.0.0", 938 | "concat-map": "0.0.1" 939 | } 940 | }, 941 | "buffer-shims": { 942 | "version": "1.0.0", 943 | "resolved": "https://registry.npmjs.org/buffer-shims/-/buffer-shims-1.0.0.tgz", 944 | "integrity": "sha1-mXjOMXOIxkmth5MCjDR37wRKi1E=", 945 | "dev": true 946 | }, 947 | "buffer-writer": { 948 | "version": "2.0.0", 949 | "resolved": "https://registry.npmjs.org/buffer-writer/-/buffer-writer-2.0.0.tgz", 950 | "integrity": "sha512-a7ZpuTZU1TRtnwyCNW3I5dc0wWNC3VR9S++Ewyk2HHZdrO3CQJqSpd+95Us590V6AL7JqUAH2IwZ/398PmNFgw==" 951 | }, 952 | "caching-transform": { 953 | "version": "4.0.0", 954 | "resolved": "https://registry.npmjs.org/caching-transform/-/caching-transform-4.0.0.tgz", 955 | "integrity": "sha512-kpqOvwXnjjN44D89K5ccQC+RUrsy7jB/XLlRrx0D7/2HNcTPqzsb6XgYoErwko6QsV184CA2YgS1fxDiiDZMWA==", 956 | "dev": true, 957 | "requires": { 958 | "hasha": "^5.0.0", 959 | "make-dir": "^3.0.0", 960 | "package-hash": "^4.0.0", 961 | "write-file-atomic": "^3.0.0" 962 | }, 963 | "dependencies": { 964 | "make-dir": { 965 | "version": "3.1.0", 966 | "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", 967 | "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", 968 | "dev": true, 969 | "requires": { 970 | "semver": "^6.0.0" 971 | } 972 | }, 973 | "semver": { 974 | "version": "6.3.0", 975 | "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", 976 | "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", 977 | "dev": true 978 | } 979 | } 980 | }, 981 | "callsite": { 982 | "version": "1.0.0", 983 | "resolved": "https://registry.npmjs.org/callsite/-/callsite-1.0.0.tgz", 984 | "integrity": "sha1-KAOY5dZkvXQDi28JBRU+borxvCA=", 985 | "dev": true 986 | }, 987 | "camelcase": { 988 | "version": "5.3.1", 989 | "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", 990 | "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", 991 | "dev": true 992 | }, 993 | "chalk": { 994 | "version": "1.1.3", 995 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", 996 | "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", 997 | "dev": true, 998 | "requires": { 999 | "ansi-styles": "^2.2.1", 1000 | "escape-string-regexp": "^1.0.2", 1001 | "has-ansi": "^2.0.0", 1002 | "strip-ansi": "^3.0.0", 1003 | "supports-color": "^2.0.0" 1004 | }, 1005 | "dependencies": { 1006 | "supports-color": { 1007 | "version": "2.0.0", 1008 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", 1009 | "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", 1010 | "dev": true 1011 | } 1012 | } 1013 | }, 1014 | "clean-stack": { 1015 | "version": "2.2.0", 1016 | "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", 1017 | "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", 1018 | "dev": true 1019 | }, 1020 | "cliui": { 1021 | "version": "6.0.0", 1022 | "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", 1023 | "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", 1024 | "dev": true, 1025 | "requires": { 1026 | "string-width": "^4.2.0", 1027 | "strip-ansi": "^6.0.0", 1028 | "wrap-ansi": "^6.2.0" 1029 | }, 1030 | "dependencies": { 1031 | "ansi-regex": { 1032 | "version": "5.0.0", 1033 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", 1034 | "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", 1035 | "dev": true 1036 | }, 1037 | "strip-ansi": { 1038 | "version": "6.0.0", 1039 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", 1040 | "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", 1041 | "dev": true, 1042 | "requires": { 1043 | "ansi-regex": "^5.0.0" 1044 | } 1045 | } 1046 | } 1047 | }, 1048 | "codecov": { 1049 | "version": "3.7.1", 1050 | "resolved": "https://registry.npmjs.org/codecov/-/codecov-3.7.1.tgz", 1051 | "integrity": "sha512-JHWxyPTkMLLJn9SmKJnwAnvY09kg2Os2+Ux+GG7LwZ9g8gzDDISpIN5wAsH1UBaafA/yGcd3KofMaorE8qd6Lw==", 1052 | "dev": true, 1053 | "requires": { 1054 | "argv": "0.0.2", 1055 | "ignore-walk": "3.0.3", 1056 | "js-yaml": "3.13.1", 1057 | "teeny-request": "6.0.1", 1058 | "urlgrey": "0.4.4" 1059 | } 1060 | }, 1061 | "color-convert": { 1062 | "version": "1.9.3", 1063 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", 1064 | "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", 1065 | "dev": true, 1066 | "requires": { 1067 | "color-name": "1.1.3" 1068 | } 1069 | }, 1070 | "color-name": { 1071 | "version": "1.1.3", 1072 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", 1073 | "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", 1074 | "dev": true 1075 | }, 1076 | "commondir": { 1077 | "version": "1.0.1", 1078 | "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", 1079 | "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=", 1080 | "dev": true 1081 | }, 1082 | "concat-map": { 1083 | "version": "0.0.1", 1084 | "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", 1085 | "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", 1086 | "dev": true 1087 | }, 1088 | "convert-source-map": { 1089 | "version": "1.7.0", 1090 | "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.7.0.tgz", 1091 | "integrity": "sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA==", 1092 | "dev": true, 1093 | "requires": { 1094 | "safe-buffer": "~5.1.1" 1095 | } 1096 | }, 1097 | "core-util-is": { 1098 | "version": "1.0.2", 1099 | "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", 1100 | "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", 1101 | "dev": true 1102 | }, 1103 | "cross-spawn": { 1104 | "version": "7.0.2", 1105 | "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.2.tgz", 1106 | "integrity": "sha512-PD6G8QG3S4FK/XCGFbEQrDqO2AnMMsy0meR7lerlIOHAAbkuavGU/pOqprrlvfTNjvowivTeBsjebAL0NSoMxw==", 1107 | "dev": true, 1108 | "requires": { 1109 | "path-key": "^3.1.0", 1110 | "shebang-command": "^2.0.0", 1111 | "which": "^2.0.1" 1112 | }, 1113 | "dependencies": { 1114 | "which": { 1115 | "version": "2.0.2", 1116 | "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", 1117 | "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", 1118 | "dev": true, 1119 | "requires": { 1120 | "isexe": "^2.0.0" 1121 | } 1122 | } 1123 | } 1124 | }, 1125 | "debug": { 1126 | "version": "4.1.1", 1127 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", 1128 | "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", 1129 | "dev": true, 1130 | "requires": { 1131 | "ms": "^2.1.1" 1132 | } 1133 | }, 1134 | "decache": { 1135 | "version": "4.5.1", 1136 | "resolved": "https://registry.npmjs.org/decache/-/decache-4.5.1.tgz", 1137 | "integrity": "sha512-5J37nATc6FmOTLbcsr9qx7Nm28qQyg1SK4xyEHqM0IBkNhWFp0Sm+vKoWYHD8wq+OUEb9jLyaKFfzzd1A9hcoA==", 1138 | "dev": true, 1139 | "requires": { 1140 | "callsite": "^1.0.0" 1141 | } 1142 | }, 1143 | "decamelize": { 1144 | "version": "1.2.0", 1145 | "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", 1146 | "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", 1147 | "dev": true 1148 | }, 1149 | "deep-equal": { 1150 | "version": "1.1.1", 1151 | "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.1.1.tgz", 1152 | "integrity": "sha512-yd9c5AdiqVcR+JjcwUQb9DkhJc8ngNr0MahEBGvDiJw8puWab2yZlh+nkasOnZP+EGTAP6rRp2JzJhJZzvNF8g==", 1153 | "dev": true, 1154 | "requires": { 1155 | "is-arguments": "^1.0.4", 1156 | "is-date-object": "^1.0.1", 1157 | "is-regex": "^1.0.4", 1158 | "object-is": "^1.0.1", 1159 | "object-keys": "^1.1.1", 1160 | "regexp.prototype.flags": "^1.2.0" 1161 | } 1162 | }, 1163 | "default-require-extensions": { 1164 | "version": "3.0.0", 1165 | "resolved": "https://registry.npmjs.org/default-require-extensions/-/default-require-extensions-3.0.0.tgz", 1166 | "integrity": "sha512-ek6DpXq/SCpvjhpFsLFRVtIxJCRw6fUR42lYMVZuUMK7n8eMz4Uh5clckdBjEpLhn/gEBZo7hDJnJcwdKLKQjg==", 1167 | "dev": true, 1168 | "requires": { 1169 | "strip-bom": "^4.0.0" 1170 | } 1171 | }, 1172 | "define-properties": { 1173 | "version": "1.1.3", 1174 | "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", 1175 | "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", 1176 | "dev": true, 1177 | "requires": { 1178 | "object-keys": "^1.0.12" 1179 | } 1180 | }, 1181 | "defined": { 1182 | "version": "1.0.0", 1183 | "resolved": "https://registry.npmjs.org/defined/-/defined-1.0.0.tgz", 1184 | "integrity": "sha1-yY2bzvdWdBiOEQlpFRGZ45sfppM=", 1185 | "dev": true 1186 | }, 1187 | "dotignore": { 1188 | "version": "0.1.2", 1189 | "resolved": "https://registry.npmjs.org/dotignore/-/dotignore-0.1.2.tgz", 1190 | "integrity": "sha512-UGGGWfSauusaVJC+8fgV+NVvBXkCTmVv7sk6nojDZZvuOUNGUy0Zk4UpHQD6EDjS0jpBwcACvH4eofvyzBcRDw==", 1191 | "dev": true, 1192 | "requires": { 1193 | "minimatch": "^3.0.4" 1194 | } 1195 | }, 1196 | "duplexer": { 1197 | "version": "0.1.1", 1198 | "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.1.tgz", 1199 | "integrity": "sha1-rOb/gIwc5mtX0ev5eXessCM0z8E=", 1200 | "dev": true 1201 | }, 1202 | "emoji-regex": { 1203 | "version": "8.0.0", 1204 | "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", 1205 | "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", 1206 | "dev": true 1207 | }, 1208 | "es-abstract": { 1209 | "version": "1.17.5", 1210 | "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.5.tgz", 1211 | "integrity": "sha512-BR9auzDbySxOcfog0tLECW8l28eRGpDpU3Dm3Hp4q/N+VtLTmyj4EUN088XZWQDW/hzj6sYRDXeOFsaAODKvpg==", 1212 | "dev": true, 1213 | "requires": { 1214 | "es-to-primitive": "^1.2.1", 1215 | "function-bind": "^1.1.1", 1216 | "has": "^1.0.3", 1217 | "has-symbols": "^1.0.1", 1218 | "is-callable": "^1.1.5", 1219 | "is-regex": "^1.0.5", 1220 | "object-inspect": "^1.7.0", 1221 | "object-keys": "^1.1.1", 1222 | "object.assign": "^4.1.0", 1223 | "string.prototype.trimleft": "^2.1.1", 1224 | "string.prototype.trimright": "^2.1.1" 1225 | } 1226 | }, 1227 | "es-to-primitive": { 1228 | "version": "1.2.1", 1229 | "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", 1230 | "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", 1231 | "dev": true, 1232 | "requires": { 1233 | "is-callable": "^1.1.4", 1234 | "is-date-object": "^1.0.1", 1235 | "is-symbol": "^1.0.2" 1236 | } 1237 | }, 1238 | "es6-error": { 1239 | "version": "4.1.1", 1240 | "resolved": "https://registry.npmjs.org/es6-error/-/es6-error-4.1.1.tgz", 1241 | "integrity": "sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg==", 1242 | "dev": true 1243 | }, 1244 | "escape-string-regexp": { 1245 | "version": "1.0.5", 1246 | "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", 1247 | "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", 1248 | "dev": true 1249 | }, 1250 | "figures": { 1251 | "version": "1.7.0", 1252 | "resolved": "https://registry.npmjs.org/figures/-/figures-1.7.0.tgz", 1253 | "integrity": "sha1-y+Hjr/zxzUS4DK3+0o3Hk6lwHS4=", 1254 | "dev": true, 1255 | "requires": { 1256 | "escape-string-regexp": "^1.0.5", 1257 | "object-assign": "^4.1.0" 1258 | } 1259 | }, 1260 | "find-cache-dir": { 1261 | "version": "3.3.1", 1262 | "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.1.tgz", 1263 | "integrity": "sha512-t2GDMt3oGC/v+BMwzmllWDuJF/xcDtE5j/fCGbqDD7OLuJkj0cfh1YSA5VKPvwMeLFLNDBkwOKZ2X85jGLVftQ==", 1264 | "dev": true, 1265 | "requires": { 1266 | "commondir": "^1.0.1", 1267 | "make-dir": "^3.0.2", 1268 | "pkg-dir": "^4.1.0" 1269 | }, 1270 | "dependencies": { 1271 | "make-dir": { 1272 | "version": "3.1.0", 1273 | "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", 1274 | "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", 1275 | "dev": true, 1276 | "requires": { 1277 | "semver": "^6.0.0" 1278 | } 1279 | }, 1280 | "semver": { 1281 | "version": "6.3.0", 1282 | "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", 1283 | "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", 1284 | "dev": true 1285 | } 1286 | } 1287 | }, 1288 | "for-each": { 1289 | "version": "0.3.3", 1290 | "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", 1291 | "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", 1292 | "dev": true, 1293 | "requires": { 1294 | "is-callable": "^1.1.3" 1295 | } 1296 | }, 1297 | "foreground-child": { 1298 | "version": "2.0.0", 1299 | "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-2.0.0.tgz", 1300 | "integrity": "sha512-dCIq9FpEcyQyXKCkyzmlPTFNgrCzPudOe+mhvJU5zAtlBnGVy2yKxtfsxK2tQBThwq225jcvBjpw1Gr40uzZCA==", 1301 | "dev": true, 1302 | "requires": { 1303 | "cross-spawn": "^7.0.0", 1304 | "signal-exit": "^3.0.2" 1305 | } 1306 | }, 1307 | "fromentries": { 1308 | "version": "1.2.0", 1309 | "resolved": "https://registry.npmjs.org/fromentries/-/fromentries-1.2.0.tgz", 1310 | "integrity": "sha512-33X7H/wdfO99GdRLLgkjUrD4geAFdq/Uv0kl3HD4da6HDixd2GUg8Mw7dahLCV9r/EARkmtYBB6Tch4EEokFTQ==", 1311 | "dev": true 1312 | }, 1313 | "fs.realpath": { 1314 | "version": "1.0.0", 1315 | "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", 1316 | "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", 1317 | "dev": true 1318 | }, 1319 | "function-bind": { 1320 | "version": "1.1.1", 1321 | "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", 1322 | "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", 1323 | "dev": true 1324 | }, 1325 | "gensync": { 1326 | "version": "1.0.0-beta.1", 1327 | "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.1.tgz", 1328 | "integrity": "sha512-r8EC6NO1sngH/zdD9fiRDLdcgnbayXah+mLgManTaIZJqEC1MZstmnox8KpnI2/fxQwrp5OpCOYWLp4rBl4Jcg==", 1329 | "dev": true 1330 | }, 1331 | "get-caller-file": { 1332 | "version": "2.0.5", 1333 | "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", 1334 | "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", 1335 | "dev": true 1336 | }, 1337 | "globals": { 1338 | "version": "11.12.0", 1339 | "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", 1340 | "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", 1341 | "dev": true 1342 | }, 1343 | "graceful-fs": { 1344 | "version": "4.2.3", 1345 | "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.3.tgz", 1346 | "integrity": "sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ==", 1347 | "dev": true 1348 | }, 1349 | "has": { 1350 | "version": "1.0.3", 1351 | "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", 1352 | "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", 1353 | "dev": true, 1354 | "requires": { 1355 | "function-bind": "^1.1.1" 1356 | } 1357 | }, 1358 | "has-ansi": { 1359 | "version": "2.0.0", 1360 | "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", 1361 | "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", 1362 | "dev": true, 1363 | "requires": { 1364 | "ansi-regex": "^2.0.0" 1365 | } 1366 | }, 1367 | "has-flag": { 1368 | "version": "3.0.0", 1369 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", 1370 | "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", 1371 | "dev": true 1372 | }, 1373 | "has-symbols": { 1374 | "version": "1.0.1", 1375 | "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.1.tgz", 1376 | "integrity": "sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg==", 1377 | "dev": true 1378 | }, 1379 | "hasha": { 1380 | "version": "5.2.0", 1381 | "resolved": "https://registry.npmjs.org/hasha/-/hasha-5.2.0.tgz", 1382 | "integrity": "sha512-2W+jKdQbAdSIrggA8Q35Br8qKadTrqCTC8+XZvBWepKDK6m9XkX6Iz1a2yh2KP01kzAR/dpuMeUnocoLYDcskw==", 1383 | "dev": true, 1384 | "requires": { 1385 | "is-stream": "^2.0.0", 1386 | "type-fest": "^0.8.0" 1387 | } 1388 | }, 1389 | "html-escaper": { 1390 | "version": "2.0.2", 1391 | "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", 1392 | "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", 1393 | "dev": true 1394 | }, 1395 | "http-proxy-agent": { 1396 | "version": "4.0.1", 1397 | "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz", 1398 | "integrity": "sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==", 1399 | "dev": true, 1400 | "requires": { 1401 | "@tootallnate/once": "1", 1402 | "agent-base": "6", 1403 | "debug": "4" 1404 | } 1405 | }, 1406 | "https-proxy-agent": { 1407 | "version": "4.0.0", 1408 | "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-4.0.0.tgz", 1409 | "integrity": "sha512-zoDhWrkR3of1l9QAL8/scJZyLu8j/gBkcwcaQOZh7Gyh/+uJQzGVETdgT30akuwkpL8HTRfssqI3BZuV18teDg==", 1410 | "dev": true, 1411 | "requires": { 1412 | "agent-base": "5", 1413 | "debug": "4" 1414 | }, 1415 | "dependencies": { 1416 | "agent-base": { 1417 | "version": "5.1.1", 1418 | "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-5.1.1.tgz", 1419 | "integrity": "sha512-TMeqbNl2fMW0nMjTEPOwe3J/PRFP4vqeoNuQMG0HlMrtm5QxKqdvAkZ1pRBQ/ulIyDD5Yq0nJ7YbdD8ey0TO3g==", 1420 | "dev": true 1421 | } 1422 | } 1423 | }, 1424 | "ignore-walk": { 1425 | "version": "3.0.3", 1426 | "resolved": "https://registry.npmjs.org/ignore-walk/-/ignore-walk-3.0.3.tgz", 1427 | "integrity": "sha512-m7o6xuOaT1aqheYHKf8W6J5pYH85ZI9w077erOzLje3JsB1gkafkAhHHY19dqjulgIZHFm32Cp5uNZgcQqdJKw==", 1428 | "dev": true, 1429 | "requires": { 1430 | "minimatch": "^3.0.4" 1431 | } 1432 | }, 1433 | "imurmurhash": { 1434 | "version": "0.1.4", 1435 | "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", 1436 | "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", 1437 | "dev": true 1438 | }, 1439 | "indent-string": { 1440 | "version": "4.0.0", 1441 | "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", 1442 | "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", 1443 | "dev": true 1444 | }, 1445 | "inflight": { 1446 | "version": "1.0.6", 1447 | "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", 1448 | "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", 1449 | "dev": true, 1450 | "requires": { 1451 | "once": "^1.3.0", 1452 | "wrappy": "1" 1453 | } 1454 | }, 1455 | "inherits": { 1456 | "version": "2.0.4", 1457 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", 1458 | "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", 1459 | "dev": true 1460 | }, 1461 | "is-arguments": { 1462 | "version": "1.0.4", 1463 | "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.0.4.tgz", 1464 | "integrity": "sha512-xPh0Rmt8NE65sNzvyUmWgI1tz3mKq74lGA0mL8LYZcoIzKOzDh6HmrYm3d18k60nHerC8A9Km8kYu87zfSFnLA==", 1465 | "dev": true 1466 | }, 1467 | "is-callable": { 1468 | "version": "1.1.5", 1469 | "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.5.tgz", 1470 | "integrity": "sha512-ESKv5sMCJB2jnHTWZ3O5itG+O128Hsus4K4Qh1h2/cgn2vbgnLSVqfV46AeJA9D5EeeLa9w81KUXMtn34zhX+Q==", 1471 | "dev": true 1472 | }, 1473 | "is-date-object": { 1474 | "version": "1.0.2", 1475 | "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.2.tgz", 1476 | "integrity": "sha512-USlDT524woQ08aoZFzh3/Z6ch9Y/EWXEHQ/AaRN0SkKq4t2Jw2R2339tSXmwuVoY7LLlBCbOIlx2myP/L5zk0g==", 1477 | "dev": true 1478 | }, 1479 | "is-finite": { 1480 | "version": "1.1.0", 1481 | "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.1.0.tgz", 1482 | "integrity": "sha512-cdyMtqX/BOqqNBBiKlIVkytNHm49MtMlYyn1zxzvJKWmFMlGzm+ry5BBfYyeY9YmNKbRSo/o7OX9w9ale0wg3w==", 1483 | "dev": true 1484 | }, 1485 | "is-fullwidth-code-point": { 1486 | "version": "3.0.0", 1487 | "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", 1488 | "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", 1489 | "dev": true 1490 | }, 1491 | "is-regex": { 1492 | "version": "1.0.5", 1493 | "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.5.tgz", 1494 | "integrity": "sha512-vlKW17SNq44owv5AQR3Cq0bQPEb8+kF3UKZ2fiZNOWtztYE5i0CzCZxFDwO58qAOWtxdBRVO/V5Qin1wjCqFYQ==", 1495 | "dev": true, 1496 | "requires": { 1497 | "has": "^1.0.3" 1498 | } 1499 | }, 1500 | "is-stream": { 1501 | "version": "2.0.0", 1502 | "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.0.tgz", 1503 | "integrity": "sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw==", 1504 | "dev": true 1505 | }, 1506 | "is-symbol": { 1507 | "version": "1.0.3", 1508 | "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.3.tgz", 1509 | "integrity": "sha512-OwijhaRSgqvhm/0ZdAcXNZt9lYdKFpcRDT5ULUuYXPoT794UNOdU+gpT6Rzo7b4V2HUl/op6GqY894AZwv9faQ==", 1510 | "dev": true, 1511 | "requires": { 1512 | "has-symbols": "^1.0.1" 1513 | } 1514 | }, 1515 | "is-typedarray": { 1516 | "version": "1.0.0", 1517 | "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", 1518 | "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", 1519 | "dev": true 1520 | }, 1521 | "is-windows": { 1522 | "version": "1.0.2", 1523 | "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", 1524 | "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", 1525 | "dev": true 1526 | }, 1527 | "isarray": { 1528 | "version": "1.0.0", 1529 | "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", 1530 | "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", 1531 | "dev": true 1532 | }, 1533 | "isexe": { 1534 | "version": "2.0.0", 1535 | "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", 1536 | "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", 1537 | "dev": true 1538 | }, 1539 | "istanbul-lib-coverage": { 1540 | "version": "3.0.0", 1541 | "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.0.0.tgz", 1542 | "integrity": "sha512-UiUIqxMgRDET6eR+o5HbfRYP1l0hqkWOs7vNxC/mggutCMUIhWMm8gAHb8tHlyfD3/l6rlgNA5cKdDzEAf6hEg==", 1543 | "dev": true 1544 | }, 1545 | "istanbul-lib-hook": { 1546 | "version": "3.0.0", 1547 | "resolved": "https://registry.npmjs.org/istanbul-lib-hook/-/istanbul-lib-hook-3.0.0.tgz", 1548 | "integrity": "sha512-Pt/uge1Q9s+5VAZ+pCo16TYMWPBIl+oaNIjgLQxcX0itS6ueeaA+pEfThZpH8WxhFgCiEb8sAJY6MdUKgiIWaQ==", 1549 | "dev": true, 1550 | "requires": { 1551 | "append-transform": "^2.0.0" 1552 | } 1553 | }, 1554 | "istanbul-lib-instrument": { 1555 | "version": "4.0.1", 1556 | "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-4.0.1.tgz", 1557 | "integrity": "sha512-imIchxnodll7pvQBYOqUu88EufLCU56LMeFPZZM/fJZ1irYcYdqroaV+ACK1Ila8ls09iEYArp+nqyC6lW1Vfg==", 1558 | "dev": true, 1559 | "requires": { 1560 | "@babel/core": "^7.7.5", 1561 | "@babel/parser": "^7.7.5", 1562 | "@babel/template": "^7.7.4", 1563 | "@babel/traverse": "^7.7.4", 1564 | "@istanbuljs/schema": "^0.1.2", 1565 | "istanbul-lib-coverage": "^3.0.0", 1566 | "semver": "^6.3.0" 1567 | }, 1568 | "dependencies": { 1569 | "semver": { 1570 | "version": "6.3.0", 1571 | "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", 1572 | "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", 1573 | "dev": true 1574 | } 1575 | } 1576 | }, 1577 | "istanbul-lib-processinfo": { 1578 | "version": "2.0.2", 1579 | "resolved": "https://registry.npmjs.org/istanbul-lib-processinfo/-/istanbul-lib-processinfo-2.0.2.tgz", 1580 | "integrity": "sha512-kOwpa7z9hme+IBPZMzQ5vdQj8srYgAtaRqeI48NGmAQ+/5yKiHLV0QbYqQpxsdEF0+w14SoB8YbnHKcXE2KnYw==", 1581 | "dev": true, 1582 | "requires": { 1583 | "archy": "^1.0.0", 1584 | "cross-spawn": "^7.0.0", 1585 | "istanbul-lib-coverage": "^3.0.0-alpha.1", 1586 | "make-dir": "^3.0.0", 1587 | "p-map": "^3.0.0", 1588 | "rimraf": "^3.0.0", 1589 | "uuid": "^3.3.3" 1590 | }, 1591 | "dependencies": { 1592 | "make-dir": { 1593 | "version": "3.1.0", 1594 | "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", 1595 | "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", 1596 | "dev": true, 1597 | "requires": { 1598 | "semver": "^6.0.0" 1599 | } 1600 | }, 1601 | "semver": { 1602 | "version": "6.3.0", 1603 | "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", 1604 | "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", 1605 | "dev": true 1606 | } 1607 | } 1608 | }, 1609 | "istanbul-lib-report": { 1610 | "version": "3.0.0", 1611 | "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", 1612 | "integrity": "sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw==", 1613 | "dev": true, 1614 | "requires": { 1615 | "istanbul-lib-coverage": "^3.0.0", 1616 | "make-dir": "^3.0.0", 1617 | "supports-color": "^7.1.0" 1618 | }, 1619 | "dependencies": { 1620 | "has-flag": { 1621 | "version": "4.0.0", 1622 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", 1623 | "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", 1624 | "dev": true 1625 | }, 1626 | "make-dir": { 1627 | "version": "3.1.0", 1628 | "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", 1629 | "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", 1630 | "dev": true, 1631 | "requires": { 1632 | "semver": "^6.0.0" 1633 | } 1634 | }, 1635 | "semver": { 1636 | "version": "6.3.0", 1637 | "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", 1638 | "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", 1639 | "dev": true 1640 | }, 1641 | "supports-color": { 1642 | "version": "7.1.0", 1643 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", 1644 | "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", 1645 | "dev": true, 1646 | "requires": { 1647 | "has-flag": "^4.0.0" 1648 | } 1649 | } 1650 | } 1651 | }, 1652 | "istanbul-lib-source-maps": { 1653 | "version": "4.0.0", 1654 | "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.0.tgz", 1655 | "integrity": "sha512-c16LpFRkR8vQXyHZ5nLpY35JZtzj1PQY1iZmesUbf1FZHbIupcWfjgOXBY9YHkLEQ6puz1u4Dgj6qmU/DisrZg==", 1656 | "dev": true, 1657 | "requires": { 1658 | "debug": "^4.1.1", 1659 | "istanbul-lib-coverage": "^3.0.0", 1660 | "source-map": "^0.6.1" 1661 | }, 1662 | "dependencies": { 1663 | "source-map": { 1664 | "version": "0.6.1", 1665 | "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", 1666 | "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", 1667 | "dev": true 1668 | } 1669 | } 1670 | }, 1671 | "istanbul-reports": { 1672 | "version": "3.0.2", 1673 | "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.0.2.tgz", 1674 | "integrity": "sha512-9tZvz7AiR3PEDNGiV9vIouQ/EAcqMXFmkcA1CDFTwOB98OZVDL0PH9glHotf5Ugp6GCOTypfzGWI/OqjWNCRUw==", 1675 | "dev": true, 1676 | "requires": { 1677 | "html-escaper": "^2.0.0", 1678 | "istanbul-lib-report": "^3.0.0" 1679 | } 1680 | }, 1681 | "js-tokens": { 1682 | "version": "4.0.0", 1683 | "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", 1684 | "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", 1685 | "dev": true 1686 | }, 1687 | "js-yaml": { 1688 | "version": "3.13.1", 1689 | "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz", 1690 | "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==", 1691 | "dev": true, 1692 | "requires": { 1693 | "argparse": "^1.0.7", 1694 | "esprima": "^4.0.0" 1695 | }, 1696 | "dependencies": { 1697 | "esprima": { 1698 | "version": "4.0.1", 1699 | "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", 1700 | "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", 1701 | "dev": true 1702 | } 1703 | } 1704 | }, 1705 | "jsesc": { 1706 | "version": "2.5.2", 1707 | "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", 1708 | "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", 1709 | "dev": true 1710 | }, 1711 | "json5": { 1712 | "version": "2.2.3", 1713 | "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", 1714 | "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", 1715 | "dev": true 1716 | }, 1717 | "lodash": { 1718 | "version": "4.17.21", 1719 | "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", 1720 | "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", 1721 | "dev": true 1722 | }, 1723 | "lodash.flattendeep": { 1724 | "version": "4.4.0", 1725 | "resolved": "https://registry.npmjs.org/lodash.flattendeep/-/lodash.flattendeep-4.4.0.tgz", 1726 | "integrity": "sha1-+wMJF/hqMTTlvJvsDWngAT3f7bI=", 1727 | "dev": true 1728 | }, 1729 | "mime-db": { 1730 | "version": "1.43.0", 1731 | "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.43.0.tgz", 1732 | "integrity": "sha512-+5dsGEEovYbT8UY9yD7eE4XTc4UwJ1jBYlgaQQF38ENsKR3wj/8q8RFZrF9WIZpB2V1ArTVFUva8sAul1NzRzQ==", 1733 | "dev": true 1734 | }, 1735 | "minimatch": { 1736 | "version": "3.1.2", 1737 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", 1738 | "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", 1739 | "dev": true, 1740 | "requires": { 1741 | "brace-expansion": "^1.1.7" 1742 | } 1743 | }, 1744 | "minimist": { 1745 | "version": "1.2.6", 1746 | "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz", 1747 | "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==", 1748 | "dev": true 1749 | }, 1750 | "ms": { 1751 | "version": "2.1.2", 1752 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", 1753 | "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", 1754 | "dev": true 1755 | }, 1756 | "node-fetch": { 1757 | "version": "2.6.7", 1758 | "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz", 1759 | "integrity": "sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==", 1760 | "dev": true, 1761 | "requires": { 1762 | "whatwg-url": "^5.0.0" 1763 | } 1764 | }, 1765 | "node-preload": { 1766 | "version": "0.2.1", 1767 | "resolved": "https://registry.npmjs.org/node-preload/-/node-preload-0.2.1.tgz", 1768 | "integrity": "sha512-RM5oyBy45cLEoHqCeh+MNuFAxO0vTFBLskvQbOKnEE7YTTSN4tbN8QWDIPQ6L+WvKsB/qLEGpYe2ZZ9d4W9OIQ==", 1769 | "dev": true, 1770 | "requires": { 1771 | "process-on-spawn": "^1.0.0" 1772 | } 1773 | }, 1774 | "nyc": { 1775 | "version": "15.0.1", 1776 | "resolved": "https://registry.npmjs.org/nyc/-/nyc-15.0.1.tgz", 1777 | "integrity": "sha512-n0MBXYBYRqa67IVt62qW1r/d9UH/Qtr7SF1w/nQLJ9KxvWF6b2xCHImRAixHN9tnMMYHC2P14uo6KddNGwMgGg==", 1778 | "dev": true, 1779 | "requires": { 1780 | "@istanbuljs/load-nyc-config": "^1.0.0", 1781 | "@istanbuljs/schema": "^0.1.2", 1782 | "caching-transform": "^4.0.0", 1783 | "convert-source-map": "^1.7.0", 1784 | "decamelize": "^1.2.0", 1785 | "find-cache-dir": "^3.2.0", 1786 | "find-up": "^4.1.0", 1787 | "foreground-child": "^2.0.0", 1788 | "glob": "^7.1.6", 1789 | "istanbul-lib-coverage": "^3.0.0", 1790 | "istanbul-lib-hook": "^3.0.0", 1791 | "istanbul-lib-instrument": "^4.0.0", 1792 | "istanbul-lib-processinfo": "^2.0.2", 1793 | "istanbul-lib-report": "^3.0.0", 1794 | "istanbul-lib-source-maps": "^4.0.0", 1795 | "istanbul-reports": "^3.0.2", 1796 | "make-dir": "^3.0.0", 1797 | "node-preload": "^0.2.1", 1798 | "p-map": "^3.0.0", 1799 | "process-on-spawn": "^1.0.0", 1800 | "resolve-from": "^5.0.0", 1801 | "rimraf": "^3.0.0", 1802 | "signal-exit": "^3.0.2", 1803 | "spawn-wrap": "^2.0.0", 1804 | "test-exclude": "^6.0.0", 1805 | "yargs": "^15.0.2" 1806 | }, 1807 | "dependencies": { 1808 | "find-up": { 1809 | "version": "4.1.0", 1810 | "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", 1811 | "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", 1812 | "dev": true, 1813 | "requires": { 1814 | "locate-path": "^5.0.0", 1815 | "path-exists": "^4.0.0" 1816 | } 1817 | }, 1818 | "glob": { 1819 | "version": "7.1.6", 1820 | "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", 1821 | "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", 1822 | "dev": true, 1823 | "requires": { 1824 | "fs.realpath": "^1.0.0", 1825 | "inflight": "^1.0.4", 1826 | "inherits": "2", 1827 | "minimatch": "^3.0.4", 1828 | "once": "^1.3.0", 1829 | "path-is-absolute": "^1.0.0" 1830 | } 1831 | }, 1832 | "locate-path": { 1833 | "version": "5.0.0", 1834 | "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", 1835 | "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", 1836 | "dev": true, 1837 | "requires": { 1838 | "p-locate": "^4.1.0" 1839 | } 1840 | }, 1841 | "make-dir": { 1842 | "version": "3.1.0", 1843 | "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", 1844 | "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", 1845 | "dev": true, 1846 | "requires": { 1847 | "semver": "^6.0.0" 1848 | } 1849 | }, 1850 | "p-limit": { 1851 | "version": "2.3.0", 1852 | "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", 1853 | "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", 1854 | "dev": true, 1855 | "requires": { 1856 | "p-try": "^2.0.0" 1857 | } 1858 | }, 1859 | "p-locate": { 1860 | "version": "4.1.0", 1861 | "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", 1862 | "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", 1863 | "dev": true, 1864 | "requires": { 1865 | "p-limit": "^2.2.0" 1866 | } 1867 | }, 1868 | "p-try": { 1869 | "version": "2.2.0", 1870 | "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", 1871 | "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", 1872 | "dev": true 1873 | }, 1874 | "path-exists": { 1875 | "version": "4.0.0", 1876 | "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", 1877 | "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", 1878 | "dev": true 1879 | }, 1880 | "semver": { 1881 | "version": "6.3.0", 1882 | "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", 1883 | "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", 1884 | "dev": true 1885 | } 1886 | } 1887 | }, 1888 | "object-assign": { 1889 | "version": "4.1.1", 1890 | "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", 1891 | "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", 1892 | "dev": true 1893 | }, 1894 | "object-inspect": { 1895 | "version": "1.7.0", 1896 | "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.7.0.tgz", 1897 | "integrity": "sha512-a7pEHdh1xKIAgTySUGgLMx/xwDZskN1Ud6egYYN3EdRW4ZMPNEDUTF+hwy2LUC+Bl+SyLXANnwz/jyh/qutKUw==", 1898 | "dev": true 1899 | }, 1900 | "object-is": { 1901 | "version": "1.1.2", 1902 | "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.2.tgz", 1903 | "integrity": "sha512-5lHCz+0uufF6wZ7CRFWJN3hp8Jqblpgve06U5CMQ3f//6iDjPr2PEo9MWCjEssDsa+UZEL4PkFpr+BMop6aKzQ==", 1904 | "dev": true, 1905 | "requires": { 1906 | "define-properties": "^1.1.3", 1907 | "es-abstract": "^1.17.5" 1908 | } 1909 | }, 1910 | "object-keys": { 1911 | "version": "1.1.1", 1912 | "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", 1913 | "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", 1914 | "dev": true 1915 | }, 1916 | "object.assign": { 1917 | "version": "4.1.0", 1918 | "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.0.tgz", 1919 | "integrity": "sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w==", 1920 | "dev": true, 1921 | "requires": { 1922 | "define-properties": "^1.1.2", 1923 | "function-bind": "^1.1.1", 1924 | "has-symbols": "^1.0.0", 1925 | "object-keys": "^1.0.11" 1926 | } 1927 | }, 1928 | "once": { 1929 | "version": "1.4.0", 1930 | "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", 1931 | "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", 1932 | "dev": true, 1933 | "requires": { 1934 | "wrappy": "1" 1935 | } 1936 | }, 1937 | "p-map": { 1938 | "version": "3.0.0", 1939 | "resolved": "https://registry.npmjs.org/p-map/-/p-map-3.0.0.tgz", 1940 | "integrity": "sha512-d3qXVTF/s+W+CdJ5A29wywV2n8CQQYahlgz2bFiA+4eVNJbHJodPZ+/gXwPGh0bOqA+j8S+6+ckmvLGPk1QpxQ==", 1941 | "dev": true, 1942 | "requires": { 1943 | "aggregate-error": "^3.0.0" 1944 | } 1945 | }, 1946 | "package-hash": { 1947 | "version": "4.0.0", 1948 | "resolved": "https://registry.npmjs.org/package-hash/-/package-hash-4.0.0.tgz", 1949 | "integrity": "sha512-whdkPIooSu/bASggZ96BWVvZTRMOFxnyUG5PnTSGKoJE2gd5mbVNmR2Nj20QFzxYYgAXpoqC+AiXzl+UMRh7zQ==", 1950 | "dev": true, 1951 | "requires": { 1952 | "graceful-fs": "^4.1.15", 1953 | "hasha": "^5.0.0", 1954 | "lodash.flattendeep": "^4.4.0", 1955 | "release-zalgo": "^1.0.0" 1956 | } 1957 | }, 1958 | "packet-reader": { 1959 | "version": "1.0.0", 1960 | "resolved": "https://registry.npmjs.org/packet-reader/-/packet-reader-1.0.0.tgz", 1961 | "integrity": "sha512-HAKu/fG3HpHFO0AA8WE8q2g+gBJaZ9MG7fcKk+IJPLTGAD6Psw4443l+9DGRbOIh3/aXr7Phy0TjilYivJo5XQ==" 1962 | }, 1963 | "parse-ms": { 1964 | "version": "1.0.1", 1965 | "resolved": "https://registry.npmjs.org/parse-ms/-/parse-ms-1.0.1.tgz", 1966 | "integrity": "sha1-VjRtR0nXjyNDDKDHE4UK75GqNh0=", 1967 | "dev": true 1968 | }, 1969 | "path-is-absolute": { 1970 | "version": "1.0.1", 1971 | "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", 1972 | "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", 1973 | "dev": true 1974 | }, 1975 | "path-key": { 1976 | "version": "3.1.1", 1977 | "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", 1978 | "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", 1979 | "dev": true 1980 | }, 1981 | "path-parse": { 1982 | "version": "1.0.7", 1983 | "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", 1984 | "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", 1985 | "dev": true 1986 | }, 1987 | "pg": { 1988 | "version": "8.0.2", 1989 | "resolved": "https://registry.npmjs.org/pg/-/pg-8.0.2.tgz", 1990 | "integrity": "sha512-ngOUEDk69kLdH/k/YLT2NRIBcUiPFRcY4l51dviqn79P5qIa5jBIGIFTIGXh4OlT/6gpiCAza5a9uy08izpFQQ==", 1991 | "requires": { 1992 | "buffer-writer": "2.0.0", 1993 | "packet-reader": "1.0.0", 1994 | "pg-connection-string": "0.1.3", 1995 | "pg-pool": "^3.1.0", 1996 | "pg-protocol": "^1.2.1", 1997 | "pg-types": "^2.1.0", 1998 | "pgpass": "1.x", 1999 | "semver": "4.3.2" 2000 | } 2001 | }, 2002 | "pg-connection-string": { 2003 | "version": "0.1.3", 2004 | "resolved": "https://registry.npmjs.org/pg-connection-string/-/pg-connection-string-0.1.3.tgz", 2005 | "integrity": "sha1-2hhHsglA5C7hSSvq9l1J2RskXfc=" 2006 | }, 2007 | "pg-escape": { 2008 | "version": "0.2.0", 2009 | "resolved": "https://registry.npmjs.org/pg-escape/-/pg-escape-0.2.0.tgz", 2010 | "integrity": "sha1-ZVlMFpFlm0q24Mu/nVB0S+R0mY4=", 2011 | "dev": true 2012 | }, 2013 | "pg-int8": { 2014 | "version": "1.0.1", 2015 | "resolved": "https://registry.npmjs.org/pg-int8/-/pg-int8-1.0.1.tgz", 2016 | "integrity": "sha512-WCtabS6t3c8SkpDBUlb1kjOs7l66xsGdKpIPZsg4wR+B3+u9UAum2odSsF9tnvxg80h4ZxLWMy4pRjOsFIqQpw==" 2017 | }, 2018 | "pg-pool": { 2019 | "version": "3.1.0", 2020 | "resolved": "https://registry.npmjs.org/pg-pool/-/pg-pool-3.1.0.tgz", 2021 | "integrity": "sha512-CvxGctDwjZZad6Q7vvhFA4BsYdk26UFIZaFH0XXqHId5uBOc26vco/GFh/laUVIQUpD9IKe/f9/mr/OQHyQ2ZA==" 2022 | }, 2023 | "pg-protocol": { 2024 | "version": "1.2.1", 2025 | "resolved": "https://registry.npmjs.org/pg-protocol/-/pg-protocol-1.2.1.tgz", 2026 | "integrity": "sha512-IqZ+VUOqg3yydxSt5NgNKLVK9JgPBuzq4ZbA9GmrmIkQjQAszPT9DLqTtID0mKsLEZB68PU0gjLla561WZ2QkQ==" 2027 | }, 2028 | "pg-types": { 2029 | "version": "2.2.0", 2030 | "resolved": "https://registry.npmjs.org/pg-types/-/pg-types-2.2.0.tgz", 2031 | "integrity": "sha512-qTAAlrEsl8s4OiEQY69wDvcMIdQN6wdz5ojQiOy6YRMuynxenON0O5oCpJI6lshc6scgAY8qvJ2On/p+CXY0GA==", 2032 | "requires": { 2033 | "pg-int8": "1.0.1", 2034 | "postgres-array": "~2.0.0", 2035 | "postgres-bytea": "~1.0.0", 2036 | "postgres-date": "~1.0.4", 2037 | "postgres-interval": "^1.1.0" 2038 | } 2039 | }, 2040 | "pgpass": { 2041 | "version": "1.0.2", 2042 | "resolved": "https://registry.npmjs.org/pgpass/-/pgpass-1.0.2.tgz", 2043 | "integrity": "sha1-Knu0G2BltnkH6R2hsHwYR8h3swY=", 2044 | "requires": { 2045 | "split": "^1.0.0" 2046 | } 2047 | }, 2048 | "pkg-dir": { 2049 | "version": "4.2.0", 2050 | "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", 2051 | "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", 2052 | "dev": true, 2053 | "requires": { 2054 | "find-up": "^4.0.0" 2055 | }, 2056 | "dependencies": { 2057 | "find-up": { 2058 | "version": "4.1.0", 2059 | "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", 2060 | "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", 2061 | "dev": true, 2062 | "requires": { 2063 | "locate-path": "^5.0.0", 2064 | "path-exists": "^4.0.0" 2065 | } 2066 | }, 2067 | "locate-path": { 2068 | "version": "5.0.0", 2069 | "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", 2070 | "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", 2071 | "dev": true, 2072 | "requires": { 2073 | "p-locate": "^4.1.0" 2074 | } 2075 | }, 2076 | "p-limit": { 2077 | "version": "2.3.0", 2078 | "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", 2079 | "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", 2080 | "dev": true, 2081 | "requires": { 2082 | "p-try": "^2.0.0" 2083 | } 2084 | }, 2085 | "p-locate": { 2086 | "version": "4.1.0", 2087 | "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", 2088 | "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", 2089 | "dev": true, 2090 | "requires": { 2091 | "p-limit": "^2.2.0" 2092 | } 2093 | }, 2094 | "p-try": { 2095 | "version": "2.2.0", 2096 | "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", 2097 | "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", 2098 | "dev": true 2099 | }, 2100 | "path-exists": { 2101 | "version": "4.0.0", 2102 | "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", 2103 | "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", 2104 | "dev": true 2105 | } 2106 | } 2107 | }, 2108 | "plur": { 2109 | "version": "1.0.0", 2110 | "resolved": "https://registry.npmjs.org/plur/-/plur-1.0.0.tgz", 2111 | "integrity": "sha1-24XGgU9eXlo7Se/CjWBP7GKXUVY=", 2112 | "dev": true 2113 | }, 2114 | "postgres-array": { 2115 | "version": "2.0.0", 2116 | "resolved": "https://registry.npmjs.org/postgres-array/-/postgres-array-2.0.0.tgz", 2117 | "integrity": "sha512-VpZrUqU5A69eQyW2c5CA1jtLecCsN2U/bD6VilrFDWq5+5UIEVO7nazS3TEcHf1zuPYO/sqGvUvW62g86RXZuA==" 2118 | }, 2119 | "postgres-bytea": { 2120 | "version": "1.0.0", 2121 | "resolved": "https://registry.npmjs.org/postgres-bytea/-/postgres-bytea-1.0.0.tgz", 2122 | "integrity": "sha1-AntTPAqokOJtFy1Hz5zOzFIazTU=" 2123 | }, 2124 | "postgres-date": { 2125 | "version": "1.0.5", 2126 | "resolved": "https://registry.npmjs.org/postgres-date/-/postgres-date-1.0.5.tgz", 2127 | "integrity": "sha512-pdau6GRPERdAYUQwkBnGKxEfPyhVZXG/JiS44iZWiNdSOWE09N2lUgN6yshuq6fVSon4Pm0VMXd1srUUkLe9iA==" 2128 | }, 2129 | "postgres-interval": { 2130 | "version": "1.2.0", 2131 | "resolved": "https://registry.npmjs.org/postgres-interval/-/postgres-interval-1.2.0.tgz", 2132 | "integrity": "sha512-9ZhXKM/rw350N1ovuWHbGxnGh/SNJ4cnxHiM0rxE4VN41wsg8P8zWn9hv/buK00RP4WvlOyr/RBDiptyxVbkZQ==", 2133 | "requires": { 2134 | "xtend": "^4.0.0" 2135 | } 2136 | }, 2137 | "pretty-ms": { 2138 | "version": "2.1.0", 2139 | "resolved": "https://registry.npmjs.org/pretty-ms/-/pretty-ms-2.1.0.tgz", 2140 | "integrity": "sha1-QlfCVt8/sLRR1q/6qwIYhBJpgdw=", 2141 | "dev": true, 2142 | "requires": { 2143 | "is-finite": "^1.0.1", 2144 | "parse-ms": "^1.0.0", 2145 | "plur": "^1.0.0" 2146 | } 2147 | }, 2148 | "process-nextick-args": { 2149 | "version": "1.0.7", 2150 | "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.7.tgz", 2151 | "integrity": "sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M=", 2152 | "dev": true 2153 | }, 2154 | "process-on-spawn": { 2155 | "version": "1.0.0", 2156 | "resolved": "https://registry.npmjs.org/process-on-spawn/-/process-on-spawn-1.0.0.tgz", 2157 | "integrity": "sha512-1WsPDsUSMmZH5LeMLegqkPDrsGgsWwk1Exipy2hvB0o/F0ASzbpIctSCcZIK1ykJvtTJULEH+20WOFjMvGnCTg==", 2158 | "dev": true, 2159 | "requires": { 2160 | "fromentries": "^1.2.0" 2161 | } 2162 | }, 2163 | "re-emitter": { 2164 | "version": "1.1.3", 2165 | "resolved": "https://registry.npmjs.org/re-emitter/-/re-emitter-1.1.3.tgz", 2166 | "integrity": "sha1-+p4xn/3u6zWycpbvDz03TawvUqc=", 2167 | "dev": true 2168 | }, 2169 | "readable-stream": { 2170 | "version": "2.2.9", 2171 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.2.9.tgz", 2172 | "integrity": "sha1-z3jsb0ptHrQ9JkiMrJfwQudLf8g=", 2173 | "dev": true, 2174 | "requires": { 2175 | "buffer-shims": "~1.0.0", 2176 | "core-util-is": "~1.0.0", 2177 | "inherits": "~2.0.1", 2178 | "isarray": "~1.0.0", 2179 | "process-nextick-args": "~1.0.6", 2180 | "string_decoder": "~1.0.0", 2181 | "util-deprecate": "~1.0.1" 2182 | } 2183 | }, 2184 | "regexp.prototype.flags": { 2185 | "version": "1.3.0", 2186 | "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.3.0.tgz", 2187 | "integrity": "sha512-2+Q0C5g951OlYlJz6yu5/M33IcsESLlLfsyIaLJaG4FA2r4yP8MvVMJUUP/fVBkSpbbbZlS5gynbEWLipiiXiQ==", 2188 | "dev": true, 2189 | "requires": { 2190 | "define-properties": "^1.1.3", 2191 | "es-abstract": "^1.17.0-next.1" 2192 | } 2193 | }, 2194 | "release-zalgo": { 2195 | "version": "1.0.0", 2196 | "resolved": "https://registry.npmjs.org/release-zalgo/-/release-zalgo-1.0.0.tgz", 2197 | "integrity": "sha1-CXALflB0Mpc5Mw5TXFqQ+2eFFzA=", 2198 | "dev": true, 2199 | "requires": { 2200 | "es6-error": "^4.0.1" 2201 | } 2202 | }, 2203 | "repeat-string": { 2204 | "version": "1.6.1", 2205 | "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", 2206 | "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=", 2207 | "dev": true 2208 | }, 2209 | "require-directory": { 2210 | "version": "2.1.1", 2211 | "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", 2212 | "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", 2213 | "dev": true 2214 | }, 2215 | "require-main-filename": { 2216 | "version": "2.0.0", 2217 | "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", 2218 | "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", 2219 | "dev": true 2220 | }, 2221 | "resolve-from": { 2222 | "version": "5.0.0", 2223 | "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", 2224 | "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", 2225 | "dev": true 2226 | }, 2227 | "resumer": { 2228 | "version": "0.0.0", 2229 | "resolved": "https://registry.npmjs.org/resumer/-/resumer-0.0.0.tgz", 2230 | "integrity": "sha1-8ej0YeQGS6Oegq883CqMiT0HZ1k=", 2231 | "dev": true, 2232 | "requires": { 2233 | "through": "~2.3.4" 2234 | } 2235 | }, 2236 | "rimraf": { 2237 | "version": "3.0.2", 2238 | "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", 2239 | "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", 2240 | "dev": true, 2241 | "requires": { 2242 | "glob": "^7.1.3" 2243 | }, 2244 | "dependencies": { 2245 | "glob": { 2246 | "version": "7.1.6", 2247 | "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", 2248 | "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", 2249 | "dev": true, 2250 | "requires": { 2251 | "fs.realpath": "^1.0.0", 2252 | "inflight": "^1.0.4", 2253 | "inherits": "2", 2254 | "minimatch": "^3.0.4", 2255 | "once": "^1.3.0", 2256 | "path-is-absolute": "^1.0.0" 2257 | } 2258 | } 2259 | } 2260 | }, 2261 | "safe-buffer": { 2262 | "version": "5.1.2", 2263 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", 2264 | "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", 2265 | "dev": true 2266 | }, 2267 | "semver": { 2268 | "version": "4.3.2", 2269 | "resolved": "https://registry.npmjs.org/semver/-/semver-4.3.2.tgz", 2270 | "integrity": "sha1-x6BxWKgL7dBSNVt3DYLWZA+AO+c=" 2271 | }, 2272 | "set-blocking": { 2273 | "version": "2.0.0", 2274 | "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", 2275 | "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", 2276 | "dev": true 2277 | }, 2278 | "shebang-command": { 2279 | "version": "2.0.0", 2280 | "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", 2281 | "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", 2282 | "dev": true, 2283 | "requires": { 2284 | "shebang-regex": "^3.0.0" 2285 | } 2286 | }, 2287 | "shebang-regex": { 2288 | "version": "3.0.0", 2289 | "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", 2290 | "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", 2291 | "dev": true 2292 | }, 2293 | "signal-exit": { 2294 | "version": "3.0.3", 2295 | "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz", 2296 | "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==", 2297 | "dev": true 2298 | }, 2299 | "spawn-wrap": { 2300 | "version": "2.0.0", 2301 | "resolved": "https://registry.npmjs.org/spawn-wrap/-/spawn-wrap-2.0.0.tgz", 2302 | "integrity": "sha512-EeajNjfN9zMnULLwhZZQU3GWBoFNkbngTUPfaawT4RkMiviTxcX0qfhVbGey39mfctfDHkWtuecgQ8NJcyQWHg==", 2303 | "dev": true, 2304 | "requires": { 2305 | "foreground-child": "^2.0.0", 2306 | "is-windows": "^1.0.2", 2307 | "make-dir": "^3.0.0", 2308 | "rimraf": "^3.0.0", 2309 | "signal-exit": "^3.0.2", 2310 | "which": "^2.0.1" 2311 | }, 2312 | "dependencies": { 2313 | "make-dir": { 2314 | "version": "3.1.0", 2315 | "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", 2316 | "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", 2317 | "dev": true, 2318 | "requires": { 2319 | "semver": "^6.0.0" 2320 | } 2321 | }, 2322 | "semver": { 2323 | "version": "6.3.0", 2324 | "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", 2325 | "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", 2326 | "dev": true 2327 | }, 2328 | "which": { 2329 | "version": "2.0.2", 2330 | "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", 2331 | "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", 2332 | "dev": true, 2333 | "requires": { 2334 | "isexe": "^2.0.0" 2335 | } 2336 | } 2337 | } 2338 | }, 2339 | "split": { 2340 | "version": "1.0.1", 2341 | "resolved": "https://registry.npmjs.org/split/-/split-1.0.1.tgz", 2342 | "integrity": "sha512-mTyOoPbrivtXnwnIxZRFYRrPNtEFKlpB2fvjSnCQUiAA6qAZzqwna5envK4uk6OIeP17CsdF3rSBGYVBsU0Tkg==", 2343 | "requires": { 2344 | "through": "2" 2345 | } 2346 | }, 2347 | "sprintf-js": { 2348 | "version": "1.0.3", 2349 | "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", 2350 | "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", 2351 | "dev": true 2352 | }, 2353 | "stream-events": { 2354 | "version": "1.0.5", 2355 | "resolved": "https://registry.npmjs.org/stream-events/-/stream-events-1.0.5.tgz", 2356 | "integrity": "sha512-E1GUzBSgvct8Jsb3v2X15pjzN1tYebtbLaMg+eBOUOAxgbLoSbT2NS91ckc5lJD1KfLjId+jXJRgo0qnV5Nerg==", 2357 | "dev": true, 2358 | "requires": { 2359 | "stubs": "^3.0.0" 2360 | } 2361 | }, 2362 | "string-width": { 2363 | "version": "4.2.0", 2364 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz", 2365 | "integrity": "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==", 2366 | "dev": true, 2367 | "requires": { 2368 | "emoji-regex": "^8.0.0", 2369 | "is-fullwidth-code-point": "^3.0.0", 2370 | "strip-ansi": "^6.0.0" 2371 | }, 2372 | "dependencies": { 2373 | "ansi-regex": { 2374 | "version": "5.0.0", 2375 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", 2376 | "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", 2377 | "dev": true 2378 | }, 2379 | "strip-ansi": { 2380 | "version": "6.0.0", 2381 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", 2382 | "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", 2383 | "dev": true, 2384 | "requires": { 2385 | "ansi-regex": "^5.0.0" 2386 | } 2387 | } 2388 | } 2389 | }, 2390 | "string.prototype.trim": { 2391 | "version": "1.2.1", 2392 | "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.1.tgz", 2393 | "integrity": "sha512-MjGFEeqixw47dAMFMtgUro/I0+wNqZB5GKXGt1fFr24u3TzDXCPu7J9Buppzoe3r/LqkSDLDDJzE15RGWDGAVw==", 2394 | "dev": true, 2395 | "requires": { 2396 | "define-properties": "^1.1.3", 2397 | "es-abstract": "^1.17.0-next.1", 2398 | "function-bind": "^1.1.1" 2399 | } 2400 | }, 2401 | "string.prototype.trimend": { 2402 | "version": "1.0.1", 2403 | "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.1.tgz", 2404 | "integrity": "sha512-LRPxFUaTtpqYsTeNKaFOw3R4bxIzWOnbQ837QfBylo8jIxtcbK/A/sMV7Q+OAV/vWo+7s25pOE10KYSjaSO06g==", 2405 | "dev": true, 2406 | "requires": { 2407 | "define-properties": "^1.1.3", 2408 | "es-abstract": "^1.17.5" 2409 | } 2410 | }, 2411 | "string.prototype.trimleft": { 2412 | "version": "2.1.2", 2413 | "resolved": "https://registry.npmjs.org/string.prototype.trimleft/-/string.prototype.trimleft-2.1.2.tgz", 2414 | "integrity": "sha512-gCA0tza1JBvqr3bfAIFJGqfdRTyPae82+KTnm3coDXkZN9wnuW3HjGgN386D7hfv5CHQYCI022/rJPVlqXyHSw==", 2415 | "dev": true, 2416 | "requires": { 2417 | "define-properties": "^1.1.3", 2418 | "es-abstract": "^1.17.5", 2419 | "string.prototype.trimstart": "^1.0.0" 2420 | } 2421 | }, 2422 | "string.prototype.trimright": { 2423 | "version": "2.1.2", 2424 | "resolved": "https://registry.npmjs.org/string.prototype.trimright/-/string.prototype.trimright-2.1.2.tgz", 2425 | "integrity": "sha512-ZNRQ7sY3KroTaYjRS6EbNiiHrOkjihL9aQE/8gfQ4DtAC/aEBRHFJa44OmoWxGGqXuJlfKkZW4WcXErGr+9ZFg==", 2426 | "dev": true, 2427 | "requires": { 2428 | "define-properties": "^1.1.3", 2429 | "es-abstract": "^1.17.5", 2430 | "string.prototype.trimend": "^1.0.0" 2431 | } 2432 | }, 2433 | "string.prototype.trimstart": { 2434 | "version": "1.0.1", 2435 | "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.1.tgz", 2436 | "integrity": "sha512-XxZn+QpvrBI1FOcg6dIpxUPgWCPuNXvMD72aaRaUQv1eD4e/Qy8i/hFTe0BUmD60p/QA6bh1avmuPTfNjqVWRw==", 2437 | "dev": true, 2438 | "requires": { 2439 | "define-properties": "^1.1.3", 2440 | "es-abstract": "^1.17.5" 2441 | } 2442 | }, 2443 | "string_decoder": { 2444 | "version": "1.0.3", 2445 | "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz", 2446 | "integrity": "sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ==", 2447 | "dev": true, 2448 | "requires": { 2449 | "safe-buffer": "~5.1.0" 2450 | } 2451 | }, 2452 | "strip-ansi": { 2453 | "version": "3.0.1", 2454 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", 2455 | "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", 2456 | "dev": true, 2457 | "requires": { 2458 | "ansi-regex": "^2.0.0" 2459 | } 2460 | }, 2461 | "strip-bom": { 2462 | "version": "4.0.0", 2463 | "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", 2464 | "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", 2465 | "dev": true 2466 | }, 2467 | "stubs": { 2468 | "version": "3.0.0", 2469 | "resolved": "https://registry.npmjs.org/stubs/-/stubs-3.0.0.tgz", 2470 | "integrity": "sha1-6NK6H6nJBXAwPAMLaQD31fiavls=", 2471 | "dev": true 2472 | }, 2473 | "supports-color": { 2474 | "version": "5.5.0", 2475 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", 2476 | "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", 2477 | "dev": true, 2478 | "requires": { 2479 | "has-flag": "^3.0.0" 2480 | } 2481 | }, 2482 | "tap-out": { 2483 | "version": "2.1.0", 2484 | "resolved": "https://registry.npmjs.org/tap-out/-/tap-out-2.1.0.tgz", 2485 | "integrity": "sha512-LJE+TBoVbOWhwdz4+FQk40nmbIuxJLqaGvj3WauQw3NYYU5TdjoV3C0x/yq37YAvVyi+oeBXmWnxWSjJ7IEyUw==", 2486 | "dev": true, 2487 | "requires": { 2488 | "re-emitter": "1.1.3", 2489 | "readable-stream": "2.2.9", 2490 | "split": "1.0.0", 2491 | "trim": "0.0.1" 2492 | }, 2493 | "dependencies": { 2494 | "split": { 2495 | "version": "1.0.0", 2496 | "resolved": "https://registry.npmjs.org/split/-/split-1.0.0.tgz", 2497 | "integrity": "sha1-xDlc5oOrzSVLwo/h2rtuXCfc/64=", 2498 | "dev": true, 2499 | "requires": { 2500 | "through": "2" 2501 | } 2502 | } 2503 | } 2504 | }, 2505 | "tap-spec": { 2506 | "version": "5.0.0", 2507 | "resolved": "https://registry.npmjs.org/tap-spec/-/tap-spec-5.0.0.tgz", 2508 | "integrity": "sha512-zMDVJiE5I6Y4XGjlueGXJIX2YIkbDN44broZlnypT38Hj/czfOXrszHNNJBF/DXR8n+x6gbfSx68x04kIEHdrw==", 2509 | "dev": true, 2510 | "requires": { 2511 | "chalk": "^1.0.0", 2512 | "duplexer": "^0.1.1", 2513 | "figures": "^1.4.0", 2514 | "lodash": "^4.17.10", 2515 | "pretty-ms": "^2.1.0", 2516 | "repeat-string": "^1.5.2", 2517 | "tap-out": "^2.1.0", 2518 | "through2": "^2.0.0" 2519 | } 2520 | }, 2521 | "tape": { 2522 | "version": "4.13.2", 2523 | "resolved": "https://registry.npmjs.org/tape/-/tape-4.13.2.tgz", 2524 | "integrity": "sha512-waWwC/OqYVE9TS6r1IynlP2sEdk4Lfo6jazlgkuNkPTHIbuG2BTABIaKdlQWwPeB6Oo4ksZ1j33Yt0NTOAlYMQ==", 2525 | "dev": true, 2526 | "requires": { 2527 | "deep-equal": "~1.1.1", 2528 | "defined": "~1.0.0", 2529 | "dotignore": "~0.1.2", 2530 | "for-each": "~0.3.3", 2531 | "function-bind": "~1.1.1", 2532 | "glob": "~7.1.6", 2533 | "has": "~1.0.3", 2534 | "inherits": "~2.0.4", 2535 | "is-regex": "~1.0.5", 2536 | "minimist": "~1.2.0", 2537 | "object-inspect": "~1.7.0", 2538 | "resolve": "~1.15.1", 2539 | "resumer": "~0.0.0", 2540 | "string.prototype.trim": "~1.2.1", 2541 | "through": "~2.3.8" 2542 | }, 2543 | "dependencies": { 2544 | "glob": { 2545 | "version": "7.1.6", 2546 | "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", 2547 | "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", 2548 | "dev": true, 2549 | "requires": { 2550 | "fs.realpath": "^1.0.0", 2551 | "inflight": "^1.0.4", 2552 | "inherits": "2", 2553 | "minimatch": "^3.0.4", 2554 | "once": "^1.3.0", 2555 | "path-is-absolute": "^1.0.0" 2556 | } 2557 | }, 2558 | "resolve": { 2559 | "version": "1.15.1", 2560 | "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.15.1.tgz", 2561 | "integrity": "sha512-84oo6ZTtoTUpjgNEr5SJyzQhzL72gaRodsSfyxC/AXRvwu0Yse9H8eF9IpGo7b8YetZhlI6v7ZQ6bKBFV/6S7w==", 2562 | "dev": true, 2563 | "requires": { 2564 | "path-parse": "^1.0.6" 2565 | } 2566 | } 2567 | } 2568 | }, 2569 | "teeny-request": { 2570 | "version": "6.0.1", 2571 | "resolved": "https://registry.npmjs.org/teeny-request/-/teeny-request-6.0.1.tgz", 2572 | "integrity": "sha512-TAK0c9a00ELOqLrZ49cFxvPVogMUFaWY8dUsQc/0CuQPGF+BOxOQzXfE413BAk2kLomwNplvdtMpeaeGWmoc2g==", 2573 | "dev": true, 2574 | "requires": { 2575 | "http-proxy-agent": "^4.0.0", 2576 | "https-proxy-agent": "^4.0.0", 2577 | "node-fetch": "^2.2.0", 2578 | "stream-events": "^1.0.5", 2579 | "uuid": "^3.3.2" 2580 | } 2581 | }, 2582 | "test-exclude": { 2583 | "version": "6.0.0", 2584 | "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", 2585 | "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", 2586 | "dev": true, 2587 | "requires": { 2588 | "@istanbuljs/schema": "^0.1.2", 2589 | "glob": "^7.1.4", 2590 | "minimatch": "^3.0.4" 2591 | }, 2592 | "dependencies": { 2593 | "glob": { 2594 | "version": "7.1.6", 2595 | "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", 2596 | "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", 2597 | "dev": true, 2598 | "requires": { 2599 | "fs.realpath": "^1.0.0", 2600 | "inflight": "^1.0.4", 2601 | "inherits": "2", 2602 | "minimatch": "^3.0.4", 2603 | "once": "^1.3.0", 2604 | "path-is-absolute": "^1.0.0" 2605 | } 2606 | } 2607 | } 2608 | }, 2609 | "through": { 2610 | "version": "2.3.8", 2611 | "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", 2612 | "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=" 2613 | }, 2614 | "through2": { 2615 | "version": "2.0.5", 2616 | "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", 2617 | "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", 2618 | "dev": true, 2619 | "requires": { 2620 | "readable-stream": "~2.3.6", 2621 | "xtend": "~4.0.1" 2622 | }, 2623 | "dependencies": { 2624 | "process-nextick-args": { 2625 | "version": "2.0.1", 2626 | "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", 2627 | "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", 2628 | "dev": true 2629 | }, 2630 | "readable-stream": { 2631 | "version": "2.3.7", 2632 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", 2633 | "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", 2634 | "dev": true, 2635 | "requires": { 2636 | "core-util-is": "~1.0.0", 2637 | "inherits": "~2.0.3", 2638 | "isarray": "~1.0.0", 2639 | "process-nextick-args": "~2.0.0", 2640 | "safe-buffer": "~5.1.1", 2641 | "string_decoder": "~1.1.1", 2642 | "util-deprecate": "~1.0.1" 2643 | } 2644 | }, 2645 | "string_decoder": { 2646 | "version": "1.1.1", 2647 | "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", 2648 | "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", 2649 | "dev": true, 2650 | "requires": { 2651 | "safe-buffer": "~5.1.0" 2652 | } 2653 | } 2654 | } 2655 | }, 2656 | "to-fast-properties": { 2657 | "version": "2.0.0", 2658 | "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", 2659 | "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", 2660 | "dev": true 2661 | }, 2662 | "tr46": { 2663 | "version": "0.0.3", 2664 | "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", 2665 | "integrity": "sha1-gYT9NH2snNwYWZLzpmIuFLnZq2o=", 2666 | "dev": true 2667 | }, 2668 | "trim": { 2669 | "version": "0.0.1", 2670 | "resolved": "https://registry.npmjs.org/trim/-/trim-0.0.1.tgz", 2671 | "integrity": "sha1-WFhUf2spB1fulczMZm+1AITEYN0=", 2672 | "dev": true 2673 | }, 2674 | "type-fest": { 2675 | "version": "0.8.1", 2676 | "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", 2677 | "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", 2678 | "dev": true 2679 | }, 2680 | "typedarray-to-buffer": { 2681 | "version": "3.1.5", 2682 | "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", 2683 | "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", 2684 | "dev": true, 2685 | "requires": { 2686 | "is-typedarray": "^1.0.0" 2687 | } 2688 | }, 2689 | "urlgrey": { 2690 | "version": "0.4.4", 2691 | "resolved": "https://registry.npmjs.org/urlgrey/-/urlgrey-0.4.4.tgz", 2692 | "integrity": "sha1-iS/pWWCAXoVRnxzUOJ8stMu3ZS8=", 2693 | "dev": true 2694 | }, 2695 | "util-deprecate": { 2696 | "version": "1.0.2", 2697 | "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", 2698 | "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", 2699 | "dev": true 2700 | }, 2701 | "uuid": { 2702 | "version": "3.4.0", 2703 | "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", 2704 | "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", 2705 | "dev": true 2706 | }, 2707 | "webidl-conversions": { 2708 | "version": "3.0.1", 2709 | "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", 2710 | "integrity": "sha1-JFNCdeKnvGvnvIZhHMFq4KVlSHE=", 2711 | "dev": true 2712 | }, 2713 | "whatwg-url": { 2714 | "version": "5.0.0", 2715 | "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", 2716 | "integrity": "sha1-lmRU6HZUYuN2RNNib2dCzotwll0=", 2717 | "dev": true, 2718 | "requires": { 2719 | "tr46": "~0.0.3", 2720 | "webidl-conversions": "^3.0.0" 2721 | } 2722 | }, 2723 | "which-module": { 2724 | "version": "2.0.0", 2725 | "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", 2726 | "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", 2727 | "dev": true 2728 | }, 2729 | "wrap-ansi": { 2730 | "version": "6.2.0", 2731 | "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", 2732 | "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", 2733 | "dev": true, 2734 | "requires": { 2735 | "ansi-styles": "^4.0.0", 2736 | "string-width": "^4.1.0", 2737 | "strip-ansi": "^6.0.0" 2738 | }, 2739 | "dependencies": { 2740 | "ansi-regex": { 2741 | "version": "5.0.0", 2742 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", 2743 | "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", 2744 | "dev": true 2745 | }, 2746 | "ansi-styles": { 2747 | "version": "4.2.1", 2748 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", 2749 | "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", 2750 | "dev": true, 2751 | "requires": { 2752 | "@types/color-name": "^1.1.1", 2753 | "color-convert": "^2.0.1" 2754 | } 2755 | }, 2756 | "color-convert": { 2757 | "version": "2.0.1", 2758 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", 2759 | "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", 2760 | "dev": true, 2761 | "requires": { 2762 | "color-name": "~1.1.4" 2763 | } 2764 | }, 2765 | "color-name": { 2766 | "version": "1.1.4", 2767 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", 2768 | "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", 2769 | "dev": true 2770 | }, 2771 | "strip-ansi": { 2772 | "version": "6.0.0", 2773 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", 2774 | "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", 2775 | "dev": true, 2776 | "requires": { 2777 | "ansi-regex": "^5.0.0" 2778 | } 2779 | } 2780 | } 2781 | }, 2782 | "wrappy": { 2783 | "version": "1.0.2", 2784 | "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", 2785 | "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", 2786 | "dev": true 2787 | }, 2788 | "write-file-atomic": { 2789 | "version": "3.0.3", 2790 | "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz", 2791 | "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==", 2792 | "dev": true, 2793 | "requires": { 2794 | "imurmurhash": "^0.1.4", 2795 | "is-typedarray": "^1.0.0", 2796 | "signal-exit": "^3.0.2", 2797 | "typedarray-to-buffer": "^3.1.5" 2798 | } 2799 | }, 2800 | "xtend": { 2801 | "version": "4.0.2", 2802 | "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", 2803 | "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==" 2804 | }, 2805 | "y18n": { 2806 | "version": "4.0.1", 2807 | "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.1.tgz", 2808 | "integrity": "sha512-wNcy4NvjMYL8gogWWYAO7ZFWFfHcbdbE57tZO8e4cbpj8tfUcwrwqSl3ad8HxpYWCdXcJUCeKKZS62Av1affwQ==", 2809 | "dev": true 2810 | }, 2811 | "yargs": { 2812 | "version": "15.3.1", 2813 | "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.3.1.tgz", 2814 | "integrity": "sha512-92O1HWEjw27sBfgmXiixJWT5hRBp2eobqXicLtPBIDBhYB+1HpwZlXmbW2luivBJHBzki+7VyCLRtAkScbTBQA==", 2815 | "dev": true, 2816 | "requires": { 2817 | "cliui": "^6.0.0", 2818 | "decamelize": "^1.2.0", 2819 | "find-up": "^4.1.0", 2820 | "get-caller-file": "^2.0.1", 2821 | "require-directory": "^2.1.1", 2822 | "require-main-filename": "^2.0.0", 2823 | "set-blocking": "^2.0.0", 2824 | "string-width": "^4.2.0", 2825 | "which-module": "^2.0.0", 2826 | "y18n": "^4.0.0", 2827 | "yargs-parser": "^18.1.1" 2828 | }, 2829 | "dependencies": { 2830 | "find-up": { 2831 | "version": "4.1.0", 2832 | "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", 2833 | "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", 2834 | "dev": true, 2835 | "requires": { 2836 | "locate-path": "^5.0.0", 2837 | "path-exists": "^4.0.0" 2838 | } 2839 | }, 2840 | "locate-path": { 2841 | "version": "5.0.0", 2842 | "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", 2843 | "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", 2844 | "dev": true, 2845 | "requires": { 2846 | "p-locate": "^4.1.0" 2847 | } 2848 | }, 2849 | "p-limit": { 2850 | "version": "2.3.0", 2851 | "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", 2852 | "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", 2853 | "dev": true, 2854 | "requires": { 2855 | "p-try": "^2.0.0" 2856 | } 2857 | }, 2858 | "p-locate": { 2859 | "version": "4.1.0", 2860 | "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", 2861 | "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", 2862 | "dev": true, 2863 | "requires": { 2864 | "p-limit": "^2.2.0" 2865 | } 2866 | }, 2867 | "p-try": { 2868 | "version": "2.2.0", 2869 | "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", 2870 | "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", 2871 | "dev": true 2872 | }, 2873 | "path-exists": { 2874 | "version": "4.0.0", 2875 | "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", 2876 | "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", 2877 | "dev": true 2878 | } 2879 | } 2880 | }, 2881 | "yargs-parser": { 2882 | "version": "18.1.3", 2883 | "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", 2884 | "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", 2885 | "dev": true, 2886 | "requires": { 2887 | "camelcase": "^5.0.0", 2888 | "decamelize": "^1.2.0" 2889 | } 2890 | } 2891 | } 2892 | } 2893 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "hapi-postgres-connection", 3 | "version": "6.5.1", 4 | "description": "A connection (pool) to PostgreSQL available anywhere in your hapi application", 5 | "main": "index.js", 6 | "scripts": { 7 | "start": "PORT=8000 node ./tests/server/server_example.js", 8 | "createTestDB": "node ./tests/_create_test_db.js", 9 | "allTests": "./node_modules/tape/bin/tape ./tests/*.js", 10 | "performanceTest": "PORT=8000 nyc --reporter=lcov node ./tests/perf.test.js | tap-spec", 11 | "connectionErrorTest": "PORT=8000 nyc --reporter=lcov node ./tests/connection_error.test.js | tap-spec", 12 | "test": "npm run createTestDB && npm run performanceTest && npm run connectionErrorTest", 13 | "coverage": "codecov" 14 | }, 15 | "dependencies": { 16 | "pg": "^8.0.2" 17 | }, 18 | "devDependencies": { 19 | "@hapi/hapi": "^19.1.1", 20 | "codecov": "^3.6.5", 21 | "decache": "^4.5.1", 22 | "nyc": "^15.0.1", 23 | "pg-escape": "^0.2.0", 24 | "tap-spec": "^5.0.0", 25 | "tape": "^4.13.2" 26 | }, 27 | "repository": { 28 | "type": "git", 29 | "url": "git+https://github.com/dwyl/hapi-postgres-connection.git" 30 | }, 31 | "keywords": [ 32 | "hapi", 33 | "hapi.js", 34 | "hapijs", 35 | "pg", 36 | "postgres", 37 | "postgresql", 38 | "connection", 39 | "connect", 40 | "sql", 41 | "plugin", 42 | "tested" 43 | ], 44 | "author": "dwyl & friends", 45 | "license": "GPL-2.0", 46 | "bugs": { 47 | "url": "https://github.com/dwyl/hapi-postgres-connection/issues" 48 | }, 49 | "homepage": "https://github.com/dwyl/hapi-postgres-connection#readme" 50 | } 51 | -------------------------------------------------------------------------------- /tests/_create_test_db.js: -------------------------------------------------------------------------------- 1 | var test = require('tape'); 2 | // we display the file (name) in each test name for stack trace 3 | var dir = __dirname.split('/')[__dirname.split('/').length-1]; 4 | var file = dir + __filename.replace(__dirname, '') + ' -> '; 5 | 6 | var pg = require('pg'); 7 | var assert = require('assert'); 8 | 9 | console.log('process.env.DATABASE_URL', process.env.DATABASE_URL) 10 | 11 | function create_tables (callback) { 12 | var pool = new pg.Pool({connectionString: process.env.DATABASE_URL}); 13 | pool.connect( function(err, client) { 14 | assert(!err); // if db connection fails then EXPLODE!! 15 | var file = require('path').resolve(__dirname + '/test_db_setup.sql'); 16 | var query = require('fs').readFileSync(file, 'utf8').toString(); 17 | // console.log('\n', query); 18 | client.query(query, function(err, result) { 19 | if(err) { 20 | return console.error('error running query', err); 21 | } 22 | client.end(); 23 | return callback(err, result); 24 | }); 25 | }); 26 | } 27 | 28 | test('Create "users" table in test database', function (t) { 29 | create_tables(function (err, data) { 30 | t.equal(data[data.length-1].command, 'INSERT', 'DB Table Created & Test Data Inserted'); 31 | t.end(); 32 | }) 33 | }); 34 | -------------------------------------------------------------------------------- /tests/connection_error.test.js: -------------------------------------------------------------------------------- 1 | const test = require('tape'); 2 | const decache = require('decache'); 3 | const escape = require('pg-escape'); 4 | 5 | 6 | (async () => { 7 | test('GET /logs as fast as you can!', async function (t) { 8 | // delete the cached module: 9 | decache('../index.js'); 10 | const HapiPostgresConnection = require('../index.js'); 11 | 12 | const { init } = require('./server'); 13 | const server = await init(); 14 | await server.register({ 15 | plugin: HapiPostgresConnection 16 | }); 17 | const response = await server.inject('/logs'); 18 | await server.stop(); 19 | t.equal(response.statusCode, 200, '/logs visited'); 20 | t.end(); 21 | }); 22 | 23 | test('Test getCon function alone', async function (t) { 24 | // delete the cached module: 25 | decache('../index.js'); 26 | const getCon = require('../index.js').getCon; 27 | 28 | const connection = await getCon(); 29 | 30 | const message = 'Hello World!'; 31 | const insertData = escape('INSERT INTO logs (message) VALUES (%L)', message); 32 | const queryData = 'SELECT * FROM logs ORDER BY log_timestamp DESC LIMIT 1;'; 33 | 34 | await connection.client.query(insertData); 35 | 36 | const queryResult = await connection.client.query(queryData); 37 | 38 | t.equal(queryResult.command, 'SELECT', 'Received correct data'); 39 | t.equal(queryResult.rowCount, 1, 'Received correct data'); 40 | 41 | t.end(); 42 | }); 43 | 44 | test('Test incorrect DATABASE_URL env', async function (t) { 45 | // set incorrect env variable 46 | process.env.DATABASE_URL = 'incorrect DB credentials'; 47 | 48 | // delete the cached module: 49 | decache('../index.js'); 50 | const HapiPostgresConnection = require('../index.js'); 51 | 52 | const { init } = require('./server'); 53 | 54 | const server = await init(); 55 | try { 56 | await server.register({ 57 | plugin: HapiPostgresConnection 58 | }); 59 | } catch (e) { 60 | await server.stop(); 61 | t.error(!e, 'Plugin can\'t initialise - it is correct in this test'); 62 | t.end(); 63 | } 64 | }); 65 | 66 | test.onFinish(() => { 67 | process.exit(); 68 | }); 69 | })(); 70 | 71 | -------------------------------------------------------------------------------- /tests/perf.test.js: -------------------------------------------------------------------------------- 1 | const test = require('tape'); 2 | const { init } = require('./server'); 3 | const decache = require('decache'); 4 | // delete the cached module: 5 | decache('../index.js'); 6 | const HapiPostgresConnection = require('../index.js'); 7 | 8 | (async () => { 9 | const server = await init(); 10 | 11 | await server.register({ 12 | plugin: HapiPostgresConnection 13 | }); 14 | 15 | test('GET /nopg url that do not make any postgres queires', async function (t) { 16 | const nopg = { method: 'GET', url: '/nopg' }; 17 | 18 | const request_total = 5; 19 | for(let request_count = 0; request_count < request_total; request_count++) { 20 | const response = await server.inject(nopg); 21 | t.equal(response.statusCode, 200, `/nopg visited ${request_count}`); 22 | } 23 | t.end(); 24 | }); 25 | 26 | test('POST /insert 1k times to simulate many concurent hits to same endpoint', async function(t){ 27 | const insert = { 28 | method: 'POST', 29 | url: '/insert', 30 | payload: { message: 'Ground control to major Tom.'} 31 | } 32 | 33 | const request_total = 1000; 34 | const start_time = Date.now(); 35 | for(let request_count = 0; request_count < request_total; request_count++) { 36 | console.log('request_count', request_count) 37 | const response = await server.inject(insert); 38 | t.equal(response.statusCode, 200, 'Find Person in Database'); 39 | t.ok(response.result['log_id'] > 1, `Read log entry ${request_count}`); 40 | } 41 | 42 | (function logTime() { 43 | const end_time = Date.now(); 44 | const time_taken = end_time - start_time; 45 | const per_sec = request_total/(time_taken/1000); 46 | console.log('Time Taken:', time_taken, 'ms | Requests per second:', per_sec); 47 | t.end(); 48 | })() 49 | }); 50 | 51 | test.onFinish(async () => { 52 | await server.stop(); 53 | process.exit(); 54 | }); 55 | })(); 56 | -------------------------------------------------------------------------------- /tests/server/index.js: -------------------------------------------------------------------------------- 1 | const Hapi = require('@hapi/hapi'); 2 | const escape = require('pg-escape'); // https://github.com/segmentio/pg-escape 3 | 4 | const serverPreparing = async () => { 5 | const server = Hapi.server({ 6 | port: process.env.PORT, 7 | host: 'localhost', 8 | debug: { 9 | request: ['error'] 10 | } 11 | }); 12 | 13 | server.route({ 14 | method: '*', 15 | path: '/', 16 | handler: async function (request, h) { 17 | 18 | const message = 'Hello World!'; 19 | const insertData = escape('INSERT INTO logs (message) VALUES (%L)', message); 20 | const queryData = 'SELECT * FROM logs ORDER BY log_timestamp DESC LIMIT 1;'; 21 | 22 | await request.pg.client.query(insertData); 23 | const queryResult = await request.pg.client.query(queryData); 24 | 25 | queryResultString = JSON.stringify(queryResult.rows[0]); 26 | return h.response(queryResultString); 27 | } 28 | }); 29 | 30 | server.route({ 31 | method: 'POST', 32 | path: '/insert', 33 | handler: async function (request, h) { 34 | const insertData = escape('INSERT INTO logs (message) VALUES (%L)', request.payload.message); 35 | const select = 'SELECT * FROM logs WHERE (log_id = 2)'; 36 | 37 | await request.pg.client.query(insertData); 38 | const queryResult = await request.pg.client.query(select); 39 | return h.response(queryResult.rows[0]); 40 | } 41 | }); 42 | 43 | server.route({ 44 | method: 'GET', 45 | path: '/nopg', 46 | handler: async function (request, h) { 47 | // does not make any PG queries 48 | return h.response('ok'); 49 | } 50 | }); 51 | 52 | 53 | server.route({ 54 | method: 'GET', 55 | path: '/logs', 56 | handler: async function(request, h) { 57 | var queryString = 'SELECT * FROM logs ORDER BY log_timestamp DESC LIMIT 1'; 58 | 59 | try { 60 | const result = await request.pg.client.query(queryString); 61 | return h.response(result.rows[0]); 62 | } catch (err) { 63 | console.log(err); 64 | } 65 | } 66 | }); 67 | 68 | return server; 69 | }; 70 | 71 | exports.init = async () => { 72 | const server = await serverPreparing(); 73 | await server.initialize(); 74 | console.log('Server is initialized'); 75 | return server; 76 | }; 77 | 78 | exports.start = async () => { 79 | const server = await serverPreparing(); 80 | await server.start(); 81 | console.log(`Server running at: ${server.info.uri}`); 82 | return server; 83 | }; 84 | -------------------------------------------------------------------------------- /tests/server/server_example.js: -------------------------------------------------------------------------------- 1 | const { start } = require('.'); 2 | 3 | start(); 4 | -------------------------------------------------------------------------------- /tests/test_db_setup.sql: -------------------------------------------------------------------------------- 1 | /* These SQL statements setup the test database tables we need for our tests */ 2 | /* first drop test tables from previous session so we have a clean database */ 3 | DROP SCHEMA public cascade; 4 | CREATE SCHEMA public; 5 | /* create the people table */ 6 | CREATE TABLE IF NOT EXISTS people ( 7 | id SERIAL PRIMARY KEY, 8 | email VARCHAR(254) UNIQUE NOT NULL, 9 | password VARCHAR(60) NOT NULL 10 | ); 11 | /* insert a person into the people table */ 12 | INSERT INTO people (email, password) 13 | VALUES ( 14 | 'test@test.net', 15 | '$2a$12$OgPE9DUNM0KaSodSQVJvw.36GjolssAeO.dfi7a9cmc9KbQTDTj7W' 16 | ); 17 | /* create logs table */ 18 | CREATE TABLE logs ( 19 | log_id SERIAL PRIMARY KEY, 20 | log_timestamp INTEGER DEFAULT EXTRACT(EPOCH FROM CURRENT_TIMESTAMP), 21 | message VARCHAR(160) NOT NULL 22 | ); 23 | INSERT INTO logs (message) 24 | VALUES ( 25 | 'Hello World!' 26 | ); 27 | --------------------------------------------------------------------------------