├── .gitignore ├── .npmrc ├── .travis.yml ├── LICENSE ├── README.md ├── lib ├── get-secret.js ├── index.js ├── resolvers │ ├── auth-header.js │ └── cookie.js └── verify.js ├── package.json ├── test ├── test-server.js └── test.js ├── types └── index.d.ts └── yarn.lock /.gitignore: -------------------------------------------------------------------------------- 1 | # OS # 2 | ################### 3 | .DS_Store 4 | .idea 5 | Thumbs.db 6 | tmp/ 7 | temp/ 8 | 9 | 10 | # Node.js # 11 | ################### 12 | node_modules 13 | package-lock.json 14 | npm-debug.log 15 | yarn-debug.log 16 | yarn-error.log 17 | 18 | 19 | # NYC # 20 | ################### 21 | coverage 22 | *.lcov 23 | .nyc_output 24 | -------------------------------------------------------------------------------- /.npmrc: -------------------------------------------------------------------------------- 1 | package-lock=false -------------------------------------------------------------------------------- /.travis.yml: -------------------------------------------------------------------------------- 1 | language: node_js 2 | node_js: 3 | - 8 4 | - 10 5 | - 12 6 | - 'lts/*' 7 | - 'node' 8 | script: 9 | - npm run test-cov 10 | after_script: 11 | - npm i coveralls 12 | - cat ./coverage/lcov.info | node ./node_modules/coveralls/bin/coveralls -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2020 Koa contributors 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # [**koa-jwt**](https://github.com/koajs/jwt) 2 | 3 | > Koa middleware for validating JSON Web Tokens. 4 | 5 | [![node version][node-image]][node-url] 6 | [![npm download][download-image]][download-url] 7 | [![npm stats][npm-image]][npm-url] 8 | [![test status][travis-image]][travis-url] 9 | [![coverage][coveralls-image]][coveralls-url] 10 | [![license][license-image]][license-url] 11 | 12 | [npm-image]: https://img.shields.io/npm/v/koa-jwt.svg?maxAge=2592000&style=flat-square 13 | [npm-url]: https://npmjs.org/package/koa-jwt 14 | [travis-image]: https://img.shields.io/travis/koajs/jwt/master.svg?maxAge=3600&style=flat-square 15 | [travis-url]: https://travis-ci.org/koajs/jwt 16 | [coveralls-image]: https://img.shields.io/coveralls/koajs/jwt/master.svg?maxAge=2592000&style=flat-square 17 | [coveralls-url]: https://coveralls.io/r/koajs/jwt 18 | [node-image]: https://img.shields.io/node/v/koa-jwt.svg?maxAge=2592000&style=flat-square 19 | [node-url]: http://nodejs.org/download/ 20 | [download-image]: https://img.shields.io/npm/dm/koa-jwt.svg?maxAge=2592000&style=flat-square 21 | [download-url]: https://npmjs.org/package/koa-jwt 22 | [license-image]: https://img.shields.io/npm/l/koa-jwt.svg?maxAge=2592000&style=flat-square 23 | [license-url]: https://github.com/koajs/jwt/blob/master/LICENSE 24 | 25 | 26 | ## Table of Contents 27 | 28 | - [koa-jwt](#koa-jwt) 29 | - [Table of Contents](#table-of-contents) 30 | - [Introduction](#introduction) 31 | - [Install](#install) 32 | - [Usage](#usage) 33 | - [Retrieving the token](#retrieving-the-token) 34 | - [Passing the secret](#passing-the-secret) 35 | - [Checking if the token is revoked](#checking-if-the-token-is-revoked) 36 | - [Example](#example) 37 | - [Token Verification Exceptions](#token-verification-exceptions) 38 | - [Related Modules](#related-modules) 39 | - [Tests](#tests) 40 | - [Author](#author) 41 | - [Credits](#credits) 42 | - [Contributors](#contributors) 43 | - [License](#license) 44 | 45 | 46 | ## Introduction 47 | 48 | This module lets you authenticate HTTP requests using JSON Web Tokens 49 | in your [Koa](http://koajs.com/) (node.js) applications. 50 | 51 | See [this article](https://github.com/dentarg/blog/blob/master/_posts/2014-01-07-angularjs-authentication-with-cookies-vs-token.markdown) 52 | for a good introduction. 53 | 54 | * If you are using `koa` version 2+, and you have a version of node < 7.6, install `koa-jwt@2`. 55 | * `koa-jwt` version 3+ on the [master](https://github.com/koajs/jwt) branch uses `async` / `await` and hence requires node >= 7.6. 56 | * If you are using `koa` version 1, you need to install `koa-jwt@1` from npm. This is the code on the [koa-v1](https://github.com/koajs/jwt/tree/koa-v1) branch. 57 | 58 | 59 | ## Install 60 | 61 | ```bash 62 | npm install koa-jwt 63 | ``` 64 | 65 | 66 | ## Usage 67 | 68 | The JWT authentication middleware authenticates callers using a JWT 69 | token. If the token is valid, `ctx.state.user` (by default) will be set 70 | with the JSON object decoded to be used by later middleware for 71 | authorization and access control. 72 | 73 | 74 | ### Retrieving the token 75 | 76 | The token is normally provided in a HTTP header (`Authorization`), but it 77 | can also be provided in a cookie by setting the `opts.cookie` option 78 | to the name of the cookie that contains the token. Custom token retrieval 79 | can also be done through the `opts.getToken` option. The provided function 80 | should match the following interface: 81 | 82 | ```js 83 | /** 84 | * Your custom token resolver 85 | * @this The ctx object passed to the middleware 86 | * 87 | * @param {Object} opts The middleware's options 88 | * @return {String|null} The resolved token or null if not found 89 | */ 90 | ``` 91 | 92 | opts, the middleware's options: 93 | 94 | * getToken 95 | * secret 96 | * key 97 | * isRevoked 98 | * passthrough 99 | * cookie 100 | * audience 101 | * issuer 102 | * debug 103 | 104 | The resolution order for the token is the following. The first non-empty token resolved will be the one that is verified. 105 | 106 | * `opts.getToken` function. 107 | * check the cookies (if `opts.cookie` is set). 108 | * check the Authorization header for a bearer token. 109 | 110 | ### Passing the secret 111 | 112 | One can provide a single secret, or array of secrets in `opts.secret`. An 113 | alternative is to have an earlier middleware set `ctx.state.secret`, 114 | typically per request. If this property exists, it will be used instead 115 | of `opts.secret`. 116 | 117 | ### Checking if the token is revoked 118 | 119 | You can provide a async function to jwt for it check the token is revoked. 120 | Only you set the function in `opts.isRevoked`. The provided function should 121 | match the following interface: 122 | 123 | ```js 124 | /** 125 | * Your custom isRevoked resolver 126 | * 127 | * @param {object} ctx The ctx object passed to the middleware 128 | * @param {object} decodedToken Content of the token 129 | * @param {object} token token The token 130 | * @return {Promise} If the token is not revoked, the promise must resolve with false, otherwise (the promise resolve with true or error) the token is revoked 131 | */ 132 | ``` 133 | 134 | 135 | ## Example 136 | 137 | ```js 138 | var Koa = require('koa'); 139 | var jwt = require('koa-jwt'); 140 | 141 | var app = new Koa(); 142 | 143 | // Custom 401 handling if you don't want to expose koa-jwt errors to users 144 | app.use(function(ctx, next){ 145 | return next().catch((err) => { 146 | if (401 == err.status) { 147 | ctx.status = 401; 148 | ctx.body = 'Protected resource, use Authorization header to get access\n'; 149 | } else { 150 | throw err; 151 | } 152 | }); 153 | }); 154 | 155 | // Unprotected middleware 156 | app.use(function(ctx, next){ 157 | if (ctx.url.match(/^\/public/)) { 158 | ctx.body = 'unprotected\n'; 159 | } else { 160 | return next(); 161 | } 162 | }); 163 | 164 | // Middleware below this line is only reached if JWT token is valid 165 | app.use(jwt({ secret: 'shared-secret' })); 166 | 167 | // Protected middleware 168 | app.use(function(ctx){ 169 | if (ctx.url.match(/^\/api/)) { 170 | ctx.body = 'protected\n'; 171 | } 172 | }); 173 | 174 | app.listen(3000); 175 | ``` 176 | 177 | Alternatively you can conditionally run the `jwt` middleware under certain conditions: 178 | 179 | ```js 180 | var Koa = require('koa'); 181 | var jwt = require('koa-jwt'); 182 | 183 | var app = new Koa(); 184 | 185 | // Middleware below this line is only reached if JWT token is valid 186 | // unless the URL starts with '/public' 187 | app.use(jwt({ secret: 'shared-secret' }).unless({ path: [/^\/public/] })); 188 | 189 | // Unprotected middleware 190 | app.use(function(ctx, next){ 191 | if (ctx.url.match(/^\/public/)) { 192 | ctx.body = 'unprotected\n'; 193 | } else { 194 | return next(); 195 | } 196 | }); 197 | 198 | // Protected middleware 199 | app.use(function(ctx){ 200 | if (ctx.url.match(/^\/api/)) { 201 | ctx.body = 'protected\n'; 202 | } 203 | }); 204 | 205 | app.listen(3000); 206 | ``` 207 | 208 | For more information on `unless` exceptions, check [koa-unless](https://github.com/Foxandxss/koa-unless). 209 | 210 | You can also add the `passthrough` option to always yield next, 211 | even if no valid Authorization header was found: 212 | 213 | ```js 214 | app.use(jwt({ secret: 'shared-secret', passthrough: true })); 215 | ``` 216 | 217 | This lets downstream middleware make decisions based on whether `ctx.state.user` is set. You can still handle errors using `ctx.state.jwtOriginalError`. 218 | 219 | If you prefer to use another ctx key for the decoded data, just pass in `key`, like so: 220 | 221 | ```js 222 | app.use(jwt({ secret: 'shared-secret', key: 'jwtdata' })); 223 | ``` 224 | 225 | This makes the decoded data available as `ctx.state.jwtdata`. 226 | 227 | You can specify audience and/or issuer as well: 228 | 229 | ```js 230 | app.use(jwt({ secret: 'shared-secret', 231 | audience: 'http://myapi/protected', 232 | issuer: 'http://issuer' })); 233 | ``` 234 | 235 | You can specify an array of secrets. 236 | 237 | The token will be considered valid if it validates successfully against _any_ of the supplied secrets. 238 | This allows for rolling shared secrets, for example: 239 | 240 | ```js 241 | app.use(jwt({ secret: ['old-shared-secret', 'new-shared-secret'] })); 242 | ``` 243 | 244 | 245 | ## Token Verification Exceptions 246 | 247 | If the JWT has an expiration (`exp`), it will be checked. 248 | 249 | All error codes for token verification can be found at: [https://github.com/auth0/node-jsonwebtoken#errors--codes](https://github.com/auth0/node-jsonwebtoken#errors--codes). 250 | 251 | Notifying a client of error codes (e.g token expiration) can be achieved by sending the `err.originalError.message` error code to the client. If passthrough is enabled use `ctx.state.jwtOriginalError`. 252 | 253 | ```js 254 | // Custom 401 handling (first middleware) 255 | app.use(function (ctx, next) { 256 | return next().catch((err) => { 257 | if (err.status === 401) { 258 | ctx.status = 401; 259 | ctx.body = { 260 | error: err.originalError ? err.originalError.message : err.message 261 | }; 262 | } else { 263 | throw err; 264 | } 265 | }); 266 | }); 267 | ``` 268 | 269 | If the `tokenKey` option is present, and a valid token is found, the original raw token 270 | is made available to subsequent middleware as `ctx.state[opts.tokenKey]`. 271 | 272 | This module also support tokens signed with public/private key pairs. Instead 273 | of a secret, you can specify a Buffer with the public key: 274 | 275 | ```js 276 | var publicKey = fs.readFileSync('/path/to/public.pub'); 277 | app.use(jwt({ secret: publicKey })); 278 | ``` 279 | 280 | If the `secret` option is a function, this function is called for each JWT received in 281 | order to determine which secret is used to verify the JWT. 282 | 283 | The signature of this function should be `(header, payload) => [Promise(secret)]`, where 284 | `header` is the token header and `payload` is the token payload. For instance to support JWKS token header should contain `alg` and `kid`: algorithm and key id fields respectively. 285 | 286 | This option can be used to support JWKS (JSON Web Key Set) providers by using 287 | [node-jwks-rsa](https://github.com/auth0/node-jwks-rsa). For example: 288 | 289 | ```js 290 | const { koaJwtSecret } = require('jwks-rsa'); 291 | 292 | app.use(jwt({ 293 | secret: koaJwtSecret({ 294 | jwksUri: 'https://sandrino.auth0.com/.well-known/jwks.json', 295 | cache: true, 296 | cacheMaxEntries: 5, 297 | cacheMaxAge: ms('10h') 298 | }), 299 | audience: 'http://myapi/protected', 300 | issuer: 'http://issuer' 301 | })); 302 | ``` 303 | 304 | 305 | ## Related Modules 306 | 307 | * [jsonwebtoken](https://github.com/auth0/node-jsonwebtoken) — JSON Web Token signing and verification. 308 | 309 | Note that koa-jwt no longer exports the `sign`, `verify` and `decode` functions from `jsonwebtoken` in the koa-v2 branch. 310 | 311 | ## Tests 312 | 313 | ```bash 314 | npm install 315 | npm test 316 | ``` 317 | 318 | 319 | ## Authors/Maintainers 320 | 321 | * [Stian Grytøyr](https://github.com/stiang) (initial author) 322 | * [Scott Donnelly](https://github.com/sdd) (current maintainer) 323 | 324 | ## Credits 325 | 326 | The initial code was largely based on [express-jwt](https://github.com/auth0/express-jwt). 327 | 328 | * [Auth0](http://auth0.com/) 329 | * [Matias Woloski](http://github.com/woloski) 330 | 331 | ## Contributors 332 | 333 | * [Foxandxss](https://github.com/Foxandxss) 334 | * [soygul](https://github.com/soygul) 335 | * [tunnckoCore](https://github.com/tunnckoCore) 336 | * [getuliojr](https://github.com/getuliojr) 337 | * [cesarandreu](https://github.com/cesarandreu) 338 | * [michaelwestphal](https://github.com/michaelwestphal) 339 | * [Jackong](https://github.com/Jackong) 340 | * [danwkennedy](https://github.com/danwkennedy) 341 | * [nfantone](https://github.com/nfantone) 342 | * [scttcper](https://github.com/scttcper) 343 | * [jhnns](https://github.com/jhnns) 344 | * [dunnock](https://github.com/dunnock) 345 | * [3imed-jaberi](https://github.com/3imed-jaberi) 346 | 347 | 348 | ## License 349 | 350 | [MIT](/LICENSE) 351 | -------------------------------------------------------------------------------- /lib/get-secret.js: -------------------------------------------------------------------------------- 1 | const { decode } = require('jsonwebtoken'); 2 | 3 | module.exports = async (provider, token) => { 4 | const decoded = decode(token, { complete: true }); 5 | 6 | if (!decoded || !decoded.header) { 7 | throw new Error('Invalid token'); 8 | } 9 | 10 | return provider(decoded.header, decoded.payload); 11 | }; 12 | -------------------------------------------------------------------------------- /lib/index.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | const pAny = require('p-any'); 4 | const unless = require('koa-unless'); 5 | const verify = require('./verify'); 6 | const getSecret = require('./get-secret'); 7 | const resolveAuthHeader = require('./resolvers/auth-header'); 8 | const resolveCookies = require('./resolvers/cookie'); 9 | 10 | module.exports = (opts = {}) => { 11 | const { debug, getToken, isRevoked, key = 'user', passthrough, tokenKey } = opts; 12 | const tokenResolvers = [resolveCookies, resolveAuthHeader]; 13 | 14 | if (getToken && typeof getToken === 'function') { 15 | tokenResolvers.unshift(getToken); 16 | } 17 | 18 | const middleware = async function jwt(ctx, next) { 19 | let token; 20 | tokenResolvers.find(resolver => token = resolver(ctx, opts)); 21 | 22 | if (!token && !passthrough) { 23 | ctx.throw(401, debug ? 'Token not found' : 'Authentication Error'); 24 | } 25 | 26 | let { state: { secret = opts.secret } } = ctx; 27 | 28 | try { 29 | if (typeof secret === 'function') { 30 | secret = await getSecret(secret, token); 31 | } 32 | 33 | if (!secret) { 34 | throw new Error('Secret not provided'); 35 | } 36 | 37 | let secrets = Array.isArray(secret) ? secret : [secret]; 38 | const decodedTokens = secrets.map(async s => await verify(token, s, opts)); 39 | 40 | const decodedToken = await pAny(decodedTokens) 41 | .catch(function (err) { 42 | if (err instanceof pAny.AggregateError) { 43 | for (const e of err) { 44 | throw e; 45 | } 46 | } else { 47 | throw err; 48 | } 49 | }); 50 | 51 | if (isRevoked) { 52 | const tokenRevoked = await isRevoked(ctx, decodedToken, token); 53 | if (tokenRevoked) { 54 | throw new Error('Token revoked'); 55 | } 56 | } 57 | 58 | ctx.state[key] = decodedToken; 59 | if (tokenKey) { 60 | ctx.state[tokenKey] = token; 61 | } 62 | 63 | } catch (e) { 64 | if (!passthrough) { 65 | const msg = debug ? e.message : 'Authentication Error'; 66 | ctx.throw(401, msg, { originalError: e }); 67 | }else{ 68 | //lets downstream middlewares handle JWT exceptions 69 | ctx.state.jwtOriginalError = e; 70 | } 71 | } 72 | 73 | return next(); 74 | }; 75 | 76 | middleware.unless = unless; 77 | return middleware; 78 | }; 79 | -------------------------------------------------------------------------------- /lib/resolvers/auth-header.js: -------------------------------------------------------------------------------- 1 | /** 2 | * resolveAuthorizationHeader - Attempts to parse the token from the Authorization header 3 | * 4 | * This function checks the Authorization header for a `Bearer ` pattern and return the token section 5 | * 6 | * @param {Object} ctx The ctx object passed to the middleware 7 | * @param {Object} opts The middleware's options 8 | * @return {String|null} The resolved token or null if not found 9 | */ 10 | module.exports = function resolveAuthorizationHeader(ctx, opts) { 11 | if (!ctx.header || !ctx.header.authorization) { 12 | return; 13 | } 14 | 15 | const parts = ctx.header.authorization.trim().split(' '); 16 | 17 | if (parts.length === 2) { 18 | const scheme = parts[0]; 19 | const credentials = parts[1]; 20 | 21 | if (/^Bearer$/i.test(scheme)) { 22 | return credentials; 23 | } 24 | } 25 | if (!opts.passthrough) { 26 | ctx.throw(401, 'Bad Authorization header format. Format is "Authorization: Bearer "'); 27 | } 28 | }; 29 | -------------------------------------------------------------------------------- /lib/resolvers/cookie.js: -------------------------------------------------------------------------------- 1 | /** 2 | * resolveCookies - Attempts to retrieve the token from a cookie 3 | * 4 | * This function uses the opts.cookie option to retrieve the token 5 | * 6 | * @param {Object} ctx The ctx object passed to the middleware 7 | * @param {Object} opts This middleware's options 8 | * @return {String|null|undefined} The resolved token or null if not found or undefined if opts.cookie is not set 9 | */ 10 | module.exports = function resolveCookies(ctx, opts) { 11 | return opts.cookie && ctx.cookies.get(opts.cookie); 12 | }; 13 | -------------------------------------------------------------------------------- /lib/verify.js: -------------------------------------------------------------------------------- 1 | const jwt = require('jsonwebtoken'); 2 | 3 | module.exports = (...args) => { 4 | return new Promise((resolve, reject) => { 5 | jwt.verify(...args, (error, decoded) => { 6 | error ? reject(error) : resolve(decoded); 7 | }); 8 | }); 9 | }; 10 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "koa-jwt", 3 | "version": "4.0.3", 4 | "description": "Koa middleware for validating JSON Web Tokens", 5 | "main": "./lib", 6 | "types": "types/index.d.ts", 7 | "keywords": [ 8 | "auth", 9 | "authn", 10 | "authentication", 11 | "authz", 12 | "authorization", 13 | "http", 14 | "jwt", 15 | "json", 16 | "middleware", 17 | "token", 18 | "oauth", 19 | "permissions", 20 | "koa" 21 | ], 22 | "repository": { 23 | "type": "git", 24 | "url": "git://github.com/koajs/jwt.git" 25 | }, 26 | "license": "MIT", 27 | "authors": [ 28 | { 29 | "name": "Stian Grytøyr", 30 | "email": "stian@grytoyr.net", 31 | "url": "http://stian.grytoyr.net/" 32 | }, 33 | { 34 | "name": "Scott Donnelly", 35 | "url": "http://scott.donnel.ly/" 36 | } 37 | ], 38 | "contributors": [ 39 | { 40 | "name": "Jesús Rodríguez", 41 | "email": "Foxandxss@gmail.com", 42 | "url": "http://angular-tips.com/" 43 | }, 44 | { 45 | "name": "Teoman Soygul", 46 | "url": "http://soygul.com" 47 | }, 48 | { 49 | "name": "Charlike Mike Reagent", 50 | "email": "hello@tunnckocore.com", 51 | "url": "https://tunnckoCore.com" 52 | }, 53 | { 54 | "name": "Getulio Romão Campos Junior", 55 | "email": "gromao@gmail.com", 56 | "url": "https://github.com/getuliojr" 57 | }, 58 | { 59 | "name": "Cesar Andreu", 60 | "email": "cesarandreu@gmail.com", 61 | "url": "https://cesarandreu.com" 62 | }, 63 | { 64 | "name": "Michael Westphal", 65 | "url": "https://github.com/michaelwestphal" 66 | }, 67 | { 68 | "name": "Jackong", 69 | "url": "https://github.com/Jackong" 70 | }, 71 | { 72 | "name": "Daniel Kennedy", 73 | "url": "https://github.com/danwkennedy" 74 | }, 75 | { 76 | "name": "Nicolás Fantone", 77 | "email": "contact@nfantone.dev", 78 | "url": "https://github.com/nfantone" 79 | }, 80 | { 81 | "name": "Scott Cooper", 82 | "email": "scttcper@gmail.com", 83 | "url": "https://github.com/scttcper" 84 | }, 85 | { 86 | "name": "Johannes Ewald", 87 | "email": "mail@johannesewald.de", 88 | "url": "https://github.com/jhnns" 89 | }, 90 | { 91 | "name": "Maxim Vorobjov", 92 | "url": "https://github.com/dunnock" 93 | }, 94 | { 95 | "name": "Imed Jaberi", 96 | "email": "imed_jebari@hotmail.fr", 97 | "url": "https://github.com/3imed-jaberi" 98 | } 99 | ], 100 | "nyc": { 101 | "reporter": [ 102 | "lcov", 103 | "text-summary" 104 | ], 105 | "report-dir": "./coverage" 106 | }, 107 | "dependencies": { 108 | "jsonwebtoken": "^9.0.0", 109 | "koa-unless": "^1.0.7", 110 | "p-any": "^2.1.0" 111 | }, 112 | "devDependencies": { 113 | "chai": "latest", 114 | "koa": "^2.11.0", 115 | "mocha": "^7.1.1", 116 | "nyc": "^15.0.1", 117 | "supertest": "^4.0.2" 118 | }, 119 | "engines": { 120 | "node": ">= 8" 121 | }, 122 | "scripts": { 123 | "test": "mocha --reporter spec test/test.js --exit", 124 | "test-cov": "nyc npm run test" 125 | }, 126 | "bugs": { 127 | "url": "https://github.com/koajs/jwt/issues" 128 | }, 129 | "homepage": "https://github.com/koajs/jwt" 130 | } 131 | -------------------------------------------------------------------------------- /test/test-server.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | const Koa = require('koa'); 3 | const koajwt = require('../lib'); 4 | const jwt = require('jsonwebtoken'); 5 | 6 | const profile = { 7 | id: 123 8 | }; 9 | 10 | const TOKEN = jwt.sign(profile, 'secret', { expiresIn: 60*5 }); 11 | 12 | console.log('Starting koa-jwt test server on http://localhost:3000/'); 13 | console.log(''); 14 | console.log('You can test the server by issuing curl commands like the following:'); 15 | console.log(''); 16 | console.log(' curl http://localhost:3000/public/foo # should succeed (return "unprotected")'); 17 | console.log(' curl http://localhost:3000/api/foo # should fail (return "401 Unauthorized ...")'); 18 | console.log(` curl -H "Authorization: Bearer ${TOKEN}" http://localhost:3000/api/foo # should succeed (return "protected")`); 19 | console.log(''); 20 | 21 | const app = new Koa(); 22 | 23 | // Custom 401 handling 24 | app.use((ctx, next) => { 25 | return next().catch(err => { 26 | if (401 == err.status) { 27 | ctx.status = 401; 28 | ctx.body = '401 Unauthorized - Protected resource, use Authorization header to get access\n'; 29 | } else { 30 | throw err; 31 | } 32 | }); 33 | }); 34 | 35 | // Unprotected middleware 36 | app.use((ctx, next) => { 37 | if (ctx.url.match(/^\/public/)) { 38 | ctx.body = 'unprotected\n'; 39 | } else { 40 | return next(); 41 | } 42 | }); 43 | 44 | // Middleware below this line is only reached if JWT token is valid 45 | app.use(koajwt({ secret: 'secret' })); 46 | 47 | app.use(ctx => { 48 | if (ctx.url.match(/^\/api/)) { 49 | ctx.body = 'protected\n'; 50 | } 51 | }); 52 | 53 | app.listen(3000); 54 | -------------------------------------------------------------------------------- /test/test.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | const Koa = require('koa'); 4 | const request = require('supertest'); 5 | const jwt = require('jsonwebtoken'); 6 | const koajwt = require('../lib'); 7 | const expect = require('chai').expect; 8 | 9 | describe('failure tests', () => { 10 | 11 | it('should throw 401 if no authorization header', done => { 12 | const app = new Koa(); 13 | 14 | app.use(koajwt({ secret: 'shhhh' })); 15 | request(app.listen()) 16 | .get('/') 17 | .expect(401) 18 | .expect('Authentication Error') 19 | .end(done); 20 | }); 21 | 22 | it('should throw 401 if no authorization header', done => { 23 | const app = new Koa(); 24 | 25 | app.use(koajwt({ secret: 'shhhh', debug: true })); 26 | request(app.listen()) 27 | .get('/') 28 | .expect(401) 29 | .expect('Token not found') 30 | .end(done); 31 | }); 32 | 33 | it('should return 401 if authorization header is malformed', done => { 34 | const app = new Koa(); 35 | 36 | app.use(koajwt({ secret: 'shhhh' })); 37 | request(app.listen()) 38 | .get('/') 39 | .set('Authorization', 'wrong') 40 | .expect(401) 41 | .expect('Bad Authorization header format. Format is "Authorization: Bearer "') 42 | .end(done); 43 | }); 44 | 45 | it('should return 401 if authorization header does not start with Bearer', done => { 46 | const app = new Koa(); 47 | 48 | app.use(koajwt({ secret: 'shhhh' })); 49 | request(app.listen()) 50 | .get('/') 51 | .set('Authorization', 'Bearskin Jacket') 52 | .expect(401) 53 | .expect('Bad Authorization header format. Format is "Authorization: Bearer "') 54 | .end(done); 55 | }); 56 | 57 | it('should allow provided getToken function to throw', done => { 58 | const app = new Koa(); 59 | 60 | app.use(koajwt({ 61 | secret: 'shhhh', 62 | getToken: ctx => ctx.throw(401, 'Bad Authorization') 63 | })); 64 | request(app.listen()) 65 | .get('/') 66 | .expect(401) 67 | .expect('Bad Authorization') 68 | .end(done); 69 | }); 70 | 71 | it('should throw if getToken function returns invalid jwt', done => { 72 | const app = new Koa(); 73 | 74 | app.use(koajwt({ 75 | secret: 'shhhhhh', 76 | getToken: () => jwt.sign({foo: 'bar'}, 'bad'), 77 | debug: true 78 | })); 79 | request(app.listen()) 80 | .get('/') 81 | .expect(401) 82 | .expect('invalid signature') 83 | .end(done); 84 | }); 85 | 86 | it('should throw if authorization header is not well-formatted jwt', done => { 87 | const app = new Koa(); 88 | 89 | app.use(koajwt({ secret: 'shhhh', debug: true })); 90 | request(app.listen()) 91 | .get('/') 92 | .set('Authorization', 'Bearer wrongjwt') 93 | .expect(401) 94 | .expect('jwt malformed') 95 | .end(done); 96 | }); 97 | 98 | it('should throw if authorization header is not valid jwt', done => { 99 | const secret = 'shhhhhh'; 100 | const token = jwt.sign({foo: 'bar'}, secret); 101 | 102 | const app = new Koa(); 103 | 104 | app.use(koajwt({ secret: 'different-shhhh', debug: true })); 105 | request(app.listen()) 106 | .get('/') 107 | .set('Authorization', `Bearer ${token}`) 108 | .expect(401) 109 | .expect('invalid signature') 110 | .end(done); 111 | }); 112 | 113 | it('should throw if authorization header is not valid jwt according to any secret', done => { 114 | const secret = 'shhhhhh'; 115 | const token = jwt.sign({foo: 'bar'}, secret); 116 | 117 | const app = new Koa(); 118 | 119 | app.use(koajwt({ secret: ['different-shhhh', 'some-other-shhhhh'], debug: true })); 120 | request(app.listen()) 121 | .get('/') 122 | .set('Authorization', `Bearer ${token}`) 123 | .expect(401) 124 | .expect('invalid signature') 125 | .end(done); 126 | }); 127 | 128 | it('should throw non-descriptive errors when debug is false', done => { 129 | const secret = 'shhhhhh'; 130 | const token = jwt.sign({foo: 'bar'}, secret); 131 | 132 | const app = new Koa(); 133 | 134 | app.use(koajwt({ secret: 'different-shhhh', debug: false })); 135 | request(app.listen()) 136 | .get('/') 137 | .set('Authorization', `Bearer ${token}`) 138 | .expect(401) 139 | .expect('Authentication Error') 140 | .end(done); 141 | }); 142 | 143 | it('should throw if opts.cookies is set and the specified cookie is not well-formatted jwt', done => { 144 | const secret = 'shhhhhh'; 145 | const token = jwt.sign({foo: 'bar'}, secret); 146 | 147 | const app = new Koa(); 148 | 149 | app.use(koajwt({ secret: secret, cookie: 'jwt', debug: true })); 150 | app.use(ctx => { ctx.body = ctx.state.user; }); 151 | 152 | request(app.listen()) 153 | .get('/') 154 | .set('Cookie', `jwt=bad${token};`) 155 | .expect(401) 156 | .expect('invalid token') 157 | .end(done); 158 | 159 | }); 160 | 161 | it('should throw if audience is not expected', done => { 162 | const secret = 'shhhhhh'; 163 | const token = jwt.sign({foo: 'bar', aud: 'expected-audience'}, secret); 164 | 165 | const app = new Koa(); 166 | app.use(koajwt({ 167 | secret: 'shhhhhh', 168 | audience: 'not-expected-audience', 169 | debug: true 170 | })); 171 | 172 | request(app.listen()) 173 | .get('/') 174 | .set('Authorization', `Bearer ${token}`) 175 | .expect(401) 176 | .expect('jwt audience invalid. expected: not-expected-audience') 177 | .end(done); 178 | }); 179 | 180 | it('should throw if token is expired', done => { 181 | const secret = 'shhhhhh'; 182 | const token = jwt.sign({foo: 'bar', exp: 1382412921 }, secret); 183 | 184 | const app = new Koa(); 185 | app.use(koajwt({ secret: 'shhhhhh', debug: true })); 186 | 187 | request(app.listen()) 188 | .get('/') 189 | .set('Authorization', `Bearer ${token}`) 190 | .expect(401) 191 | .expect('jwt expired') 192 | .end(done); 193 | }); 194 | 195 | it('should throw with original jsonwebtoken error as originalError property', done => { 196 | const secret = 'shhhhhh'; 197 | const token = jwt.sign({foo: 'bar', exp: 1382412921 }, secret); 198 | 199 | const app = new Koa(); 200 | // Custom 401 handling 201 | app.use((ctx, next) => { 202 | return next().catch(err => { 203 | expect(err).to.have.property('originalError'); 204 | expect(err.originalError.message).to.equal('jwt expired'); 205 | throw err; 206 | }); 207 | }); 208 | app.use(koajwt({ secret: 'shhhhhh', debug: true })); 209 | request(app.listen()) 210 | .get('/') 211 | .set('Authorization', `Bearer ${token}`) 212 | .expect(401) 213 | .expect('jwt expired') 214 | .end(done); 215 | }); 216 | 217 | it('should throw if token issuer is wrong', done => { 218 | const secret = 'shhhhhh'; 219 | const token = jwt.sign({foo: 'bar', iss: 'http://foo' }, secret); 220 | 221 | const app = new Koa(); 222 | app.use(koajwt({ secret: 'shhhhhh', issuer: 'http://wrong', debug: true })); 223 | 224 | request(app.listen()) 225 | .get('/') 226 | .set('Authorization', `Bearer ${token}`) 227 | .expect(401) 228 | .expect('jwt issuer invalid. expected: http://wrong') 229 | .end(done); 230 | }); 231 | 232 | it('should throw if secret neither provided by options or middleware', done => { 233 | const secret = 'shhhhhh'; 234 | const token = jwt.sign({foo: 'bar', iss: 'http://foo' }, secret); 235 | 236 | const app = new Koa(); 237 | app.use(koajwt({debug: true})); 238 | 239 | request(app.listen()) 240 | .get('/') 241 | .set('Authorization', `Bearer ${token}`) 242 | .expect(401) 243 | .expect('Secret not provided') 244 | .end(done); 245 | }); 246 | 247 | it('should throw if secret both provided by options (right secret) and middleware (wrong secret)', done => { 248 | const secret = 'shhhhhh'; 249 | const token = jwt.sign({foo: 'bar', iss: 'http://foo' }, secret); 250 | 251 | const app = new Koa(); 252 | app.use(koajwt({secret: 'wrong secret', debug: true})); 253 | 254 | request(app.listen()) 255 | .get('/') 256 | .set('Authorization', `Bearer ${token}`) 257 | .expect(401) 258 | .expect('invalid signature') 259 | .end(done); 260 | }); 261 | 262 | it('should throw 401 if isRevoked throw error', done => { 263 | 264 | const isRevoked = (ctx, token, user) => Promise.reject(new Error('Token revocation check error')); 265 | const secret = 'shhhhhh'; 266 | const token = jwt.sign({foo: 'bar'}, secret); 267 | 268 | const app = new Koa(); 269 | 270 | app.use(koajwt({ secret: secret, isRevoked, debug: true })); 271 | 272 | request(app.listen()) 273 | .get('/') 274 | .set('Authorization', `Bearer ${token}`) 275 | .expect(401) 276 | .expect('Token revocation check error') 277 | .end(done); 278 | }); 279 | 280 | it('should throw 401 if revoked token', done => { 281 | 282 | const isRevoked = (ctx, token, user) => Promise.resolve(true); 283 | const secret = 'shhhhhh'; 284 | const token = jwt.sign({foo: 'bar'}, secret); 285 | 286 | const app = new Koa(); 287 | 288 | app.use(koajwt({ secret: secret, isRevoked, debug: true })); 289 | 290 | request(app.listen()) 291 | .get('/') 292 | .set('Authorization', `Bearer ${token}`) 293 | .expect(401) 294 | .expect('Token revoked') 295 | .end(done); 296 | }); 297 | 298 | it('should throw if secret provider rejects', done => { 299 | 300 | const secret = 'shhhhhh'; 301 | const provider = ({alg, kid}) => Promise.reject(new Error('Not supported')); 302 | const token = jwt.sign({foo: 'bar'}, secret); 303 | 304 | const app = new Koa(); 305 | 306 | app.use(koajwt({ secret: provider, debug: true })); 307 | app.use(ctx => { 308 | ctx.body = ctx.state.user; 309 | }); 310 | 311 | request(app.listen()) 312 | .get('/') 313 | .set('Authorization', `Bearer ${token}`) 314 | .expect(401) 315 | .expect('Not supported') 316 | .end(done); 317 | }); 318 | 319 | it('should throw if secret provider used but token invalid', done => { 320 | const provider = ({ alg, kid }) => Promise.resolve('a nice secret'); 321 | const app = new Koa(); 322 | 323 | app.use(koajwt({ secret: provider, debug: true })); 324 | app.use(ctx => { 325 | ctx.body = ctx.state.user; 326 | }); 327 | 328 | request(app.listen()) 329 | .get('/') 330 | .set('Authorization', 'Bearer dodgytoken') 331 | .expect(401) 332 | .expect('Invalid token') 333 | .end(done); 334 | }); 335 | 336 | it('should throw if secret provider returns a secret that does not match jwt', done => { 337 | 338 | const secret = 'shhhhhh'; 339 | const provider = ({alg, kid}) => Promise.resolve('not my secret'); 340 | const token = jwt.sign({foo: 'bar'}, secret); 341 | 342 | const app = new Koa(); 343 | 344 | app.use(koajwt({ secret: provider, debug: true })); 345 | app.use(ctx => { 346 | ctx.body = ctx.state.user; 347 | }); 348 | 349 | request(app.listen()) 350 | .get('/') 351 | .set('Authorization', `Bearer ${token}`) 352 | .expect(401) 353 | .expect('invalid signature') 354 | .end(done); 355 | }); 356 | 357 | it('should throw if no secret provider returns a secret that matches jwt', done => { 358 | 359 | const secret = 'shhhhhh'; 360 | const provider = ({alg, kid}) => Promise.resolve(['not my secret', 'still not my secret']) 361 | const token = jwt.sign({foo: 'bar'}, secret); 362 | 363 | const app = new Koa(); 364 | 365 | app.use(koajwt({ secret: provider, debug: true })); 366 | app.use(ctx => { 367 | ctx.body = ctx.state.user; 368 | }); 369 | 370 | request(app.listen()) 371 | .get('/') 372 | .set('Authorization', `Bearer ${token}`) 373 | .expect(401) 374 | .expect('invalid signature') 375 | .end(done); 376 | }); 377 | }); 378 | 379 | describe('passthrough tests', () => { 380 | it('should continue if `passthrough` is true', done => { 381 | const app = new Koa(); 382 | 383 | app.use(koajwt({ secret: 'shhhhhh', passthrough: true, debug: true })); 384 | app.use(ctx => { 385 | ctx.body = ctx.state.user; 386 | }); 387 | 388 | request(app.listen()) 389 | .get('/') 390 | .expect(204) // No content 391 | .expect('') 392 | .end(done); 393 | }); 394 | 395 | it('should continue if `passthrough` is true with bad auth header format', done => { 396 | const app = new Koa(); 397 | 398 | app.use(koajwt({ secret: 'shhhhhh', passthrough: true, debug: true })); 399 | app.use(ctx => { 400 | ctx.body = ctx.state.user; 401 | }); 402 | 403 | request(app.listen()) 404 | .get('/') 405 | .set('Authorization', 'liver and onions') 406 | .expect(204) // No content 407 | .expect('') 408 | .end(done); 409 | }); 410 | }); 411 | 412 | 413 | describe('success tests', () => { 414 | 415 | it('should work if authorization header is valid jwt', done => { 416 | const validUserResponse = res => res.body.foo !== 'bar' && 'Wrong user'; 417 | 418 | const secret = 'shhhhhh'; 419 | const token = jwt.sign({foo: 'bar'}, secret); 420 | 421 | const app = new Koa(); 422 | 423 | app.use(koajwt({ secret: secret })); 424 | app.use(ctx => { 425 | ctx.body = ctx.state.user; 426 | }); 427 | 428 | request(app.listen()) 429 | .get('/') 430 | .set('Authorization', `Bearer ${token}`) 431 | .expect(200) 432 | .expect(validUserResponse) 433 | .end(done); 434 | }); 435 | 436 | it('should work if authorization header contains leading and/or trailing whitespace', done => { 437 | const validUserResponse = res => res.body.foo !== 'bar' && 'Wrong user'; 438 | 439 | const secret = 'shhhhhh'; 440 | const token = jwt.sign({foo: 'bar'}, secret); 441 | 442 | const app = new Koa(); 443 | 444 | app.use(koajwt({ secret: secret })); 445 | app.use(ctx => { 446 | ctx.body = ctx.state.user; 447 | }); 448 | 449 | request(app.listen()) 450 | .get('/') 451 | .set('Authorization', ` Bearer ${token} `) 452 | .expect(200) 453 | .expect(validUserResponse) 454 | .end(done); 455 | }); 456 | 457 | it('should work if authorization header is valid jwt according to one of the secrets', done => { 458 | const validUserResponse = res => res.body.foo !== 'bar' && 'Wrong user'; 459 | 460 | const secret = 'shhhhhh'; 461 | const token = jwt.sign({foo: 'bar'}, secret); 462 | 463 | const app = new Koa(); 464 | 465 | app.use(koajwt({ secret: [secret, 'another secret'] })); 466 | app.use(ctx => { 467 | ctx.body = ctx.state.user; 468 | }); 469 | 470 | request(app.listen()) 471 | .get('/') 472 | .set('Authorization', `Bearer ${token}`) 473 | .expect(200) 474 | .expect(validUserResponse) 475 | .end(done); 476 | }); 477 | 478 | it('should work if the provided getToken function returns a valid jwt', done => { 479 | const validUserResponse = res => res.body.foo !== 'bar' && 'Wrong user'; 480 | 481 | const secret = 'shhhhhh'; 482 | const token = jwt.sign({foo: 'bar'}, secret); 483 | 484 | const app = new Koa(); 485 | app.use(koajwt({ secret: secret, getToken: ctx => ctx.request.query.token })); 486 | app.use(ctx => { 487 | ctx.body = ctx.state.user; 488 | }); 489 | 490 | request(app.listen()) 491 | .get(`/?token=${token}`) 492 | .expect(200) 493 | .expect(validUserResponse) 494 | .end(done); 495 | }); 496 | 497 | it('should use the first resolved token', done => { 498 | const validUserResponse = res => res.body.foo !== 'bar' && 'Wrong user'; 499 | 500 | const secret = 'shhhhhh'; 501 | const token = jwt.sign({foo: 'bar'}, secret); 502 | const invalidToken = jwt.sign({foo: 'bar'}, 'badSecret'); 503 | 504 | const app = new Koa(); 505 | 506 | app.use(koajwt({ secret: secret, cookie: 'jwt'})); 507 | app.use(ctx => { 508 | ctx.body = ctx.state.user; 509 | }); 510 | 511 | request(app.listen()) 512 | .get('/') 513 | .set('Cookie', `jwt=${token};`) 514 | .set('Authorization', `Bearer ${invalidToken}`) 515 | .expect(200) 516 | .expect(validUserResponse) 517 | .end(done); 518 | }); 519 | 520 | it('should work if opts.cookies is set and the specified cookie contains valid jwt', done => { 521 | const validUserResponse = res => res.body.foo !== 'bar' && 'Wrong user'; 522 | 523 | const secret = 'shhhhhh'; 524 | const token = jwt.sign({foo: 'bar'}, secret); 525 | 526 | const app = new Koa(); 527 | 528 | app.use(koajwt({ secret: secret, cookie: 'jwt' })); 529 | app.use(ctx => { 530 | ctx.body = ctx.state.user; 531 | }); 532 | 533 | request(app.listen()) 534 | .get('/') 535 | .set('Cookie', `jwt=${token};`) 536 | .expect(200) 537 | .expect(validUserResponse) 538 | .end(done); 539 | 540 | }); 541 | 542 | it('should use provided key for decoded data', done => { 543 | const validUserResponse = res => res.body.foo === 'bar' && 'Key param not used properly'; 544 | 545 | const secret = 'shhhhhh'; 546 | const token = jwt.sign({foo: 'bar'}, secret); 547 | 548 | const app = new Koa(); 549 | 550 | app.use(koajwt({ secret: secret, key: 'jwtdata' })); 551 | app.use(ctx => { 552 | ctx.body = ctx.state.jwtdata; 553 | }); 554 | 555 | request(app.listen()) 556 | .get('/') 557 | .set('Authorization', `Bearer ${token}`) 558 | .expect(200) 559 | .expect(validUserResponse) 560 | .end(done); 561 | 562 | }); 563 | 564 | it('should work if secret is provided by middleware', done => { 565 | const validUserResponse = res => res.body.foo !== 'bar' && 'Wrong user'; 566 | 567 | const secret = 'shhhhhh'; 568 | const token = jwt.sign({foo: 'bar'}, secret); 569 | 570 | const app = new Koa(); 571 | 572 | app.use((ctx, next) => { 573 | ctx.state.secret = secret; 574 | return next(); 575 | }); 576 | app.use(koajwt()); 577 | app.use(ctx => { 578 | ctx.body = ctx.state.user; 579 | }); 580 | 581 | request(app.listen()) 582 | .get('/') 583 | .set('Authorization', `Bearer ${token}`) 584 | .expect(200) 585 | .expect(validUserResponse) 586 | .end(done); 587 | }); 588 | 589 | it('should work if secret is provided by secret provider function', done => { 590 | const validUserResponse = res => res.body.foo !== 'bar' && 'Wrong user'; 591 | 592 | const secret = 'shhhhhh'; 593 | const provider = ({ alg, kid }) => Promise.resolve(secret); 594 | const token = jwt.sign({foo: 'bar'}, secret); 595 | 596 | const app = new Koa(); 597 | 598 | app.use(koajwt({ secret: provider })); 599 | app.use(ctx => { 600 | ctx.body = ctx.state.user; 601 | }); 602 | 603 | request(app.listen()) 604 | .get('/') 605 | .set('Authorization', `Bearer ${token}`) 606 | .expect(200) 607 | .expect(validUserResponse) 608 | .end(done); 609 | }); 610 | 611 | it('should work if a valid secret is provided by one of the secret provider functions', done => { 612 | const validUserResponse = res => res.body.foo !== 'bar' && 'Wrong user'; 613 | 614 | const secret = 'shhhhhh'; 615 | const provider = ({ alg, kid }) => Promise.resolve(['other-shhhh', secret]); 616 | const token = jwt.sign({foo: 'bar'}, secret); 617 | 618 | const app = new Koa(); 619 | 620 | app.use(koajwt({ secret: provider })); 621 | app.use(ctx => { 622 | ctx.body = ctx.state.user; 623 | }); 624 | 625 | request(app.listen()) 626 | .get('/') 627 | .set('Authorization', `Bearer ${token}`) 628 | .expect(200) 629 | .expect(validUserResponse) 630 | .end(done); 631 | }); 632 | 633 | it('should not overwrite ctx.state.token on successful token verification if opts.tokenKey is undefined', done => { 634 | const validUserResponse = res => res.body.token === 'DONT_CLOBBER_ME' && 'ctx.state.token not clobbered'; 635 | 636 | const secret = 'shhhhhh'; 637 | const token = jwt.sign({foo: 'bar'}, secret); 638 | 639 | const app = new Koa(); 640 | 641 | app.use((ctx, next) => { 642 | ctx.state = { token: 'DONT_CLOBBER_ME' }; 643 | return next(); 644 | }); 645 | app.use(koajwt({ secret: secret, key: 'jwtdata' })); 646 | app.use(ctx => { 647 | ctx.body = { token: ctx.state.token }; 648 | }); 649 | 650 | request(app.listen()) 651 | .get('/') 652 | .set('Authorization', `Bearer ${token}`) 653 | .expect(200) 654 | .expect(validUserResponse) 655 | .end(done); 656 | }); 657 | 658 | it('should populate the raw token to ctx.state, in key from opts.tokenKey', done => { 659 | const validUserResponse = res => res.body.token !== token && 'Token not passed through'; 660 | 661 | const secret = 'shhhhhh'; 662 | const token = jwt.sign({foo: 'bar'}, secret); 663 | 664 | const app = new Koa(); 665 | 666 | app.use(koajwt({ secret: secret, key: 'jwtdata', tokenKey: 'testTokenKey' })); 667 | app.use(ctx => { 668 | ctx.body = { token: ctx.state.testTokenKey }; 669 | }); 670 | 671 | request(app.listen()) 672 | .get('/') 673 | .set('Authorization', `Bearer ${token}`) 674 | .expect(200) 675 | .expect(validUserResponse) 676 | .end(done); 677 | }); 678 | 679 | it('should use middleware secret if both middleware and options provided', done => { 680 | const validUserResponse = res => res.body.foo !== 'bar' && 'Wrong user'; 681 | 682 | const secret = 'shhhhhh'; 683 | const token = jwt.sign({foo: 'bar'}, secret); 684 | 685 | const app = new Koa(); 686 | 687 | app.use((ctx, next) => { 688 | ctx.state.secret = secret; 689 | return next(); 690 | }); 691 | app.use(koajwt({secret: 'wrong secret'})); 692 | app.use(ctx => { 693 | ctx.body = ctx.state.user; 694 | }); 695 | 696 | request(app.listen()) 697 | .get('/') 698 | .set('Authorization', `Bearer ${token}`) 699 | .expect(200) 700 | .expect(validUserResponse) 701 | .end(done); 702 | }); 703 | }); 704 | 705 | describe('unless tests', () => { 706 | 707 | it('should pass if the route is excluded', done => { 708 | const validUserResponse = res => res.body.success === true && 'koa-jwt is getting fired.'; 709 | 710 | const secret = 'shhhhhh'; 711 | const app = new Koa(); 712 | 713 | app.use(koajwt({ secret: secret }).unless({ path: ['/public']})); 714 | app.use(ctx => { 715 | ctx.body = { success: true }; 716 | }); 717 | 718 | request(app.listen()) 719 | .get('/public') 720 | .set('Authorization', 'wrong') 721 | .expect(200) 722 | .expect(validUserResponse) 723 | .end(done); 724 | }); 725 | 726 | it('should fail if the route is not excluded', done => { 727 | const secret = 'shhhhhh'; 728 | const token = jwt.sign({foo: 'bar'}, secret); 729 | 730 | const app = new Koa(); 731 | 732 | app.use(koajwt({ secret: secret }).unless({ path: ['/public']})); 733 | app.use(ctx => { 734 | ctx.body = { success: true }; 735 | }); 736 | 737 | request(app.listen()) 738 | .get('/private') 739 | .set('Authorization', 'wrong') 740 | .expect(401) 741 | .expect('Bad Authorization header format. Format is "Authorization: Bearer "') 742 | .end(done); 743 | }); 744 | 745 | it('should pass if the route is not excluded and the token is present', done => { 746 | const validUserResponse = res => res.body.foo !== 'bar' && 'Key param not used properly'; 747 | 748 | const secret = 'shhhhhh'; 749 | const token = jwt.sign({foo: 'bar'}, secret); 750 | 751 | const app = new Koa(); 752 | 753 | app.use(koajwt({ secret: secret, key: 'jwtdata' }).unless({ path: ['/public']})); 754 | app.use(ctx => { 755 | ctx.body = ctx.state.jwtdata; 756 | }); 757 | 758 | request(app.listen()) 759 | .get('/') 760 | .set('Authorization', `Bearer ${token}`) 761 | .expect(200) 762 | .expect(validUserResponse) 763 | .end(done); 764 | }); 765 | 766 | it('should work if authorization header is valid jwt and is not revoked', done => { 767 | const validUserResponse = res => res.body.foo !== 'bar' && 'Wrong user'; 768 | 769 | const isRevoked = (token, ctx, user) => Promise.resolve(false); 770 | 771 | const secret = 'shhhhhh'; 772 | const token = jwt.sign({foo: 'bar'}, secret); 773 | 774 | const app = new Koa(); 775 | 776 | app.use(koajwt({ secret: secret, isRevoked })); 777 | app.use(ctx => { 778 | ctx.body = ctx.state.user; 779 | }); 780 | 781 | request(app.listen()) 782 | .get('/') 783 | .set('Authorization', `Bearer ${token}`) 784 | .expect(200) 785 | .expect(validUserResponse) 786 | .end(done); 787 | }); 788 | }); 789 | -------------------------------------------------------------------------------- /types/index.d.ts: -------------------------------------------------------------------------------- 1 | // Type definitions for koa-jwt 2.x 2 | // Project: https://github.com/koajs/jwt 3 | // Definitions by: Bruno Krebs 4 | // Definitions: https://github.com/DefinitelyTyped/DefinitelyTyped 5 | 6 | import Koa = require('koa'); 7 | 8 | export = jwt; 9 | 10 | declare function jwt(options: jwt.Options): jwt.Middleware; 11 | 12 | declare namespace jwt { 13 | export interface Options { 14 | secret: Secret | SecretLoader; 15 | key?: string; 16 | tokenKey?: string; 17 | getToken?(ctx: Koa.Context, opts: jwt.Options): string | null; 18 | isRevoked?(ctx: Koa.Context, decodedToken: object, token: string): Promise; 19 | passthrough?: boolean; 20 | cookie?: string; 21 | debug?: boolean; 22 | audience?: string | string[]; 23 | issuer?: string | string[]; 24 | algorithms?: string[]; 25 | } 26 | 27 | export type Secret = string | string[] | Buffer | Buffer[]; 28 | export type SecretLoader = (header: any, payload: any) => Promise; 29 | 30 | export type UnlessOptions = (params?: {custom?: (ctx: Koa.Context) => boolean, path?: string | RegExp | (string | RegExp)[], ext?: string | string[], method?: string | string[], useOriginalUrl?: boolean}) => Koa.Middleware 31 | export interface Middleware extends Koa.Middleware { 32 | unless: UnlessOptions; 33 | } 34 | } 35 | -------------------------------------------------------------------------------- /yarn.lock: -------------------------------------------------------------------------------- 1 | # THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. 2 | # yarn lockfile v1 3 | 4 | 5 | "@babel/code-frame@^7.8.3": 6 | version "7.8.3" 7 | resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.8.3.tgz#33e25903d7481181534e12ec0a25f16b6fcf419e" 8 | integrity sha512-a9gxpmdXtZEInkCSHUJDLHZVBgb1QS0jhss4cPP93EW7s+uC5bikET2twEF3KV+7rDblJcmNvTR7VJejqd2C2g== 9 | dependencies: 10 | "@babel/highlight" "^7.8.3" 11 | 12 | "@babel/core@^7.7.5": 13 | version "7.9.0" 14 | resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.9.0.tgz#ac977b538b77e132ff706f3b8a4dbad09c03c56e" 15 | integrity sha512-kWc7L0fw1xwvI0zi8OKVBuxRVefwGOrKSQMvrQ3dW+bIIavBY3/NpXmpjMy7bQnLgwgzWQZ8TlM57YHpHNHz4w== 16 | dependencies: 17 | "@babel/code-frame" "^7.8.3" 18 | "@babel/generator" "^7.9.0" 19 | "@babel/helper-module-transforms" "^7.9.0" 20 | "@babel/helpers" "^7.9.0" 21 | "@babel/parser" "^7.9.0" 22 | "@babel/template" "^7.8.6" 23 | "@babel/traverse" "^7.9.0" 24 | "@babel/types" "^7.9.0" 25 | convert-source-map "^1.7.0" 26 | debug "^4.1.0" 27 | gensync "^1.0.0-beta.1" 28 | json5 "^2.1.2" 29 | lodash "^4.17.13" 30 | resolve "^1.3.2" 31 | semver "^5.4.1" 32 | source-map "^0.5.0" 33 | 34 | "@babel/generator@^7.9.0", "@babel/generator@^7.9.5": 35 | version "7.9.5" 36 | resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.9.5.tgz#27f0917741acc41e6eaaced6d68f96c3fa9afaf9" 37 | integrity sha512-GbNIxVB3ZJe3tLeDm1HSn2AhuD/mVcyLDpgtLXa5tplmWrJdF/elxB56XNqCuD6szyNkDi6wuoKXln3QeBmCHQ== 38 | dependencies: 39 | "@babel/types" "^7.9.5" 40 | jsesc "^2.5.1" 41 | lodash "^4.17.13" 42 | source-map "^0.5.0" 43 | 44 | "@babel/helper-function-name@^7.9.5": 45 | version "7.9.5" 46 | resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.9.5.tgz#2b53820d35275120e1874a82e5aabe1376920a5c" 47 | integrity sha512-JVcQZeXM59Cd1qanDUxv9fgJpt3NeKUaqBqUEvfmQ+BCOKq2xUgaWZW2hr0dkbyJgezYuplEoh5knmrnS68efw== 48 | dependencies: 49 | "@babel/helper-get-function-arity" "^7.8.3" 50 | "@babel/template" "^7.8.3" 51 | "@babel/types" "^7.9.5" 52 | 53 | "@babel/helper-get-function-arity@^7.8.3": 54 | version "7.8.3" 55 | resolved "https://registry.yarnpkg.com/@babel/helper-get-function-arity/-/helper-get-function-arity-7.8.3.tgz#b894b947bd004381ce63ea1db9f08547e920abd5" 56 | integrity sha512-FVDR+Gd9iLjUMY1fzE2SR0IuaJToR4RkCDARVfsBBPSP53GEqSFjD8gNyxg246VUyc/ALRxFaAK8rVG7UT7xRA== 57 | dependencies: 58 | "@babel/types" "^7.8.3" 59 | 60 | "@babel/helper-member-expression-to-functions@^7.8.3": 61 | version "7.8.3" 62 | resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.8.3.tgz#659b710498ea6c1d9907e0c73f206eee7dadc24c" 63 | integrity sha512-fO4Egq88utkQFjbPrSHGmGLFqmrshs11d46WI+WZDESt7Wu7wN2G2Iu+NMMZJFDOVRHAMIkB5SNh30NtwCA7RA== 64 | dependencies: 65 | "@babel/types" "^7.8.3" 66 | 67 | "@babel/helper-module-imports@^7.8.3": 68 | version "7.8.3" 69 | resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.8.3.tgz#7fe39589b39c016331b6b8c3f441e8f0b1419498" 70 | integrity sha512-R0Bx3jippsbAEtzkpZ/6FIiuzOURPcMjHp+Z6xPe6DtApDJx+w7UYyOLanZqO8+wKR9G10s/FmHXvxaMd9s6Kg== 71 | dependencies: 72 | "@babel/types" "^7.8.3" 73 | 74 | "@babel/helper-module-transforms@^7.9.0": 75 | version "7.9.0" 76 | resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.9.0.tgz#43b34dfe15961918707d247327431388e9fe96e5" 77 | integrity sha512-0FvKyu0gpPfIQ8EkxlrAydOWROdHpBmiCiRwLkUiBGhCUPRRbVD2/tm3sFr/c/GWFrQ/ffutGUAnx7V0FzT2wA== 78 | dependencies: 79 | "@babel/helper-module-imports" "^7.8.3" 80 | "@babel/helper-replace-supers" "^7.8.6" 81 | "@babel/helper-simple-access" "^7.8.3" 82 | "@babel/helper-split-export-declaration" "^7.8.3" 83 | "@babel/template" "^7.8.6" 84 | "@babel/types" "^7.9.0" 85 | lodash "^4.17.13" 86 | 87 | "@babel/helper-optimise-call-expression@^7.8.3": 88 | version "7.8.3" 89 | resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.8.3.tgz#7ed071813d09c75298ef4f208956006b6111ecb9" 90 | integrity sha512-Kag20n86cbO2AvHca6EJsvqAd82gc6VMGule4HwebwMlwkpXuVqrNRj6CkCV2sKxgi9MyAUnZVnZ6lJ1/vKhHQ== 91 | dependencies: 92 | "@babel/types" "^7.8.3" 93 | 94 | "@babel/helper-replace-supers@^7.8.6": 95 | version "7.8.6" 96 | resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.8.6.tgz#5ada744fd5ad73203bf1d67459a27dcba67effc8" 97 | integrity sha512-PeMArdA4Sv/Wf4zXwBKPqVj7n9UF/xg6slNRtZW84FM7JpE1CbG8B612FyM4cxrf4fMAMGO0kR7voy1ForHHFA== 98 | dependencies: 99 | "@babel/helper-member-expression-to-functions" "^7.8.3" 100 | "@babel/helper-optimise-call-expression" "^7.8.3" 101 | "@babel/traverse" "^7.8.6" 102 | "@babel/types" "^7.8.6" 103 | 104 | "@babel/helper-simple-access@^7.8.3": 105 | version "7.8.3" 106 | resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.8.3.tgz#7f8109928b4dab4654076986af575231deb639ae" 107 | integrity sha512-VNGUDjx5cCWg4vvCTR8qQ7YJYZ+HBjxOgXEl7ounz+4Sn7+LMD3CFrCTEU6/qXKbA2nKg21CwhhBzO0RpRbdCw== 108 | dependencies: 109 | "@babel/template" "^7.8.3" 110 | "@babel/types" "^7.8.3" 111 | 112 | "@babel/helper-split-export-declaration@^7.8.3": 113 | version "7.8.3" 114 | resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.8.3.tgz#31a9f30070f91368a7182cf05f831781065fc7a9" 115 | integrity sha512-3x3yOeyBhW851hroze7ElzdkeRXQYQbFIb7gLK1WQYsw2GWDay5gAJNw1sWJ0VFP6z5J1whqeXH/WCdCjZv6dA== 116 | dependencies: 117 | "@babel/types" "^7.8.3" 118 | 119 | "@babel/helper-validator-identifier@^7.9.0", "@babel/helper-validator-identifier@^7.9.5": 120 | version "7.9.5" 121 | resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.9.5.tgz#90977a8e6fbf6b431a7dc31752eee233bf052d80" 122 | integrity sha512-/8arLKUFq882w4tWGj9JYzRpAlZgiWUJ+dtteNTDqrRBz9Iguck9Rn3ykuBDoUwh2TO4tSAJlrxDUOXWklJe4g== 123 | 124 | "@babel/helpers@^7.9.0": 125 | version "7.9.2" 126 | resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.9.2.tgz#b42a81a811f1e7313b88cba8adc66b3d9ae6c09f" 127 | integrity sha512-JwLvzlXVPjO8eU9c/wF9/zOIN7X6h8DYf7mG4CiFRZRvZNKEF5dQ3H3V+ASkHoIB3mWhatgl5ONhyqHRI6MppA== 128 | dependencies: 129 | "@babel/template" "^7.8.3" 130 | "@babel/traverse" "^7.9.0" 131 | "@babel/types" "^7.9.0" 132 | 133 | "@babel/highlight@^7.8.3": 134 | version "7.9.0" 135 | resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.9.0.tgz#4e9b45ccb82b79607271b2979ad82c7b68163079" 136 | integrity sha512-lJZPilxX7Op3Nv/2cvFdnlepPXDxi29wxteT57Q965oc5R9v86ztx0jfxVrTcBk8C2kcPkkDa2Z4T3ZsPPVWsQ== 137 | dependencies: 138 | "@babel/helper-validator-identifier" "^7.9.0" 139 | chalk "^2.0.0" 140 | js-tokens "^4.0.0" 141 | 142 | "@babel/parser@^7.7.5", "@babel/parser@^7.8.6", "@babel/parser@^7.9.0": 143 | version "7.9.4" 144 | resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.9.4.tgz#68a35e6b0319bbc014465be43828300113f2f2e8" 145 | integrity sha512-bC49otXX6N0/VYhgOMh4gnP26E9xnDZK3TmbNpxYzzz9BQLBosQwfyOe9/cXUU3txYhTzLCbcqd5c8y/OmCjHA== 146 | 147 | "@babel/template@^7.7.4", "@babel/template@^7.8.3", "@babel/template@^7.8.6": 148 | version "7.8.6" 149 | resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.8.6.tgz#86b22af15f828dfb086474f964dcc3e39c43ce2b" 150 | integrity sha512-zbMsPMy/v0PWFZEhQJ66bqjhH+z0JgMoBWuikXybgG3Gkd/3t5oQ1Rw2WQhnSrsOmsKXnZOx15tkC4qON/+JPg== 151 | dependencies: 152 | "@babel/code-frame" "^7.8.3" 153 | "@babel/parser" "^7.8.6" 154 | "@babel/types" "^7.8.6" 155 | 156 | "@babel/traverse@^7.7.4", "@babel/traverse@^7.8.6", "@babel/traverse@^7.9.0": 157 | version "7.9.5" 158 | resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.9.5.tgz#6e7c56b44e2ac7011a948c21e283ddd9d9db97a2" 159 | integrity sha512-c4gH3jsvSuGUezlP6rzSJ6jf8fYjLj3hsMZRx/nX0h+fmHN0w+ekubRrHPqnMec0meycA2nwCsJ7dC8IPem2FQ== 160 | dependencies: 161 | "@babel/code-frame" "^7.8.3" 162 | "@babel/generator" "^7.9.5" 163 | "@babel/helper-function-name" "^7.9.5" 164 | "@babel/helper-split-export-declaration" "^7.8.3" 165 | "@babel/parser" "^7.9.0" 166 | "@babel/types" "^7.9.5" 167 | debug "^4.1.0" 168 | globals "^11.1.0" 169 | lodash "^4.17.13" 170 | 171 | "@babel/types@^7.8.3", "@babel/types@^7.8.6", "@babel/types@^7.9.0", "@babel/types@^7.9.5": 172 | version "7.9.5" 173 | resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.9.5.tgz#89231f82915a8a566a703b3b20133f73da6b9444" 174 | integrity sha512-XjnvNqenk818r5zMaba+sLQjnbda31UfUURv3ei0qPQw4u+j2jMyJ5b11y8ZHYTRSI3NnInQkkkRT4fLqqPdHg== 175 | dependencies: 176 | "@babel/helper-validator-identifier" "^7.9.5" 177 | lodash "^4.17.13" 178 | to-fast-properties "^2.0.0" 179 | 180 | "@istanbuljs/load-nyc-config@^1.0.0": 181 | version "1.0.0" 182 | resolved "https://registry.yarnpkg.com/@istanbuljs/load-nyc-config/-/load-nyc-config-1.0.0.tgz#10602de5570baea82f8afbfa2630b24e7a8cfe5b" 183 | integrity sha512-ZR0rq/f/E4f4XcgnDvtMWXCUJpi8eO0rssVhmztsZqLIEFA9UUP9zmpE0VxlM+kv/E1ul2I876Fwil2ayptDVg== 184 | dependencies: 185 | camelcase "^5.3.1" 186 | find-up "^4.1.0" 187 | js-yaml "^3.13.1" 188 | resolve-from "^5.0.0" 189 | 190 | "@istanbuljs/schema@^0.1.2": 191 | version "0.1.2" 192 | resolved "https://registry.yarnpkg.com/@istanbuljs/schema/-/schema-0.1.2.tgz#26520bf09abe4a5644cd5414e37125a8954241dd" 193 | integrity sha512-tsAQNx32a8CoFhjhijUIhI4kccIAgmGhy8LZMZgGfmXcpMbPRUqn5LWmgRttILi6yeGmBJd2xsPkFMs0PzgPCw== 194 | 195 | "@types/color-name@^1.1.1": 196 | version "1.1.1" 197 | resolved "https://registry.yarnpkg.com/@types/color-name/-/color-name-1.1.1.tgz#1c1261bbeaa10a8055bbc5d8ab84b7b2afc846a0" 198 | integrity sha512-rr+OQyAjxze7GgWrSaJwydHStIhHq2lvY3BOC2Mj7KnzI7XK0Uw1TOOdI9lDoajEbSWLiYgoo4f1R51erQfhPQ== 199 | 200 | accepts@^1.3.5: 201 | version "1.3.7" 202 | resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.7.tgz#531bc726517a3b2b41f850021c6cc15eaab507cd" 203 | integrity sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA== 204 | dependencies: 205 | mime-types "~2.1.24" 206 | negotiator "0.6.2" 207 | 208 | aggregate-error@^3.0.0: 209 | version "3.0.1" 210 | resolved "https://registry.yarnpkg.com/aggregate-error/-/aggregate-error-3.0.1.tgz#db2fe7246e536f40d9b5442a39e117d7dd6a24e0" 211 | integrity sha512-quoaXsZ9/BLNae5yiNoUz+Nhkwz83GhWwtYFglcjEQB2NDHCIpApbqXxIFnm4Pq/Nvhrsq5sYJFyohrrxnTGAA== 212 | dependencies: 213 | clean-stack "^2.0.0" 214 | indent-string "^4.0.0" 215 | 216 | ansi-colors@3.2.3: 217 | version "3.2.3" 218 | resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-3.2.3.tgz#57d35b8686e851e2cc04c403f1c00203976a1813" 219 | integrity sha512-LEHHyuhlPY3TmuUYMh2oz89lTShfvgbmzaBcxve9t/9Wuy7Dwf4yoAKcND7KFT1HAQfqZ12qtc+DUrBMeKF9nw== 220 | 221 | ansi-regex@^3.0.0: 222 | version "3.0.1" 223 | resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-3.0.1.tgz#123d6479e92ad45ad897d4054e3c7ca7db4944e1" 224 | integrity sha512-+O9Jct8wf++lXxxFc4hc8LsjaSq0HFzzL7cVsw8pRDIPdjKD2mT4ytDZlLuSBZ4cLKZFXIrMGO7DbQCtMJJMKw== 225 | 226 | ansi-regex@^4.1.0: 227 | version "4.1.0" 228 | resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-4.1.0.tgz#8b9f8f08cf1acb843756a839ca8c7e3168c51997" 229 | integrity sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg== 230 | 231 | ansi-regex@^5.0.0: 232 | version "5.0.0" 233 | resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.0.tgz#388539f55179bf39339c81af30a654d69f87cb75" 234 | integrity sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg== 235 | 236 | ansi-styles@^3.2.0, ansi-styles@^3.2.1: 237 | version "3.2.1" 238 | resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" 239 | integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== 240 | dependencies: 241 | color-convert "^1.9.0" 242 | 243 | ansi-styles@^4.0.0: 244 | version "4.2.1" 245 | resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.2.1.tgz#90ae75c424d008d2624c5bf29ead3177ebfcf359" 246 | integrity sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA== 247 | dependencies: 248 | "@types/color-name" "^1.1.1" 249 | color-convert "^2.0.1" 250 | 251 | any-promise@^1.1.0: 252 | version "1.3.0" 253 | resolved "https://registry.yarnpkg.com/any-promise/-/any-promise-1.3.0.tgz#abc6afeedcea52e809cdc0376aed3ce39635d17f" 254 | integrity sha1-q8av7tzqUugJzcA3au0845Y10X8= 255 | 256 | anymatch@~3.1.1: 257 | version "3.1.1" 258 | resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.1.tgz#c55ecf02185e2469259399310c173ce31233b142" 259 | integrity sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg== 260 | dependencies: 261 | normalize-path "^3.0.0" 262 | picomatch "^2.0.4" 263 | 264 | append-transform@^2.0.0: 265 | version "2.0.0" 266 | resolved "https://registry.yarnpkg.com/append-transform/-/append-transform-2.0.0.tgz#99d9d29c7b38391e6f428d28ce136551f0b77e12" 267 | integrity sha512-7yeyCEurROLQJFv5Xj4lEGTy0borxepjFv1g22oAdqFu//SrAlDl1O1Nxx15SH1RoliUml6p8dwJW9jvZughhg== 268 | dependencies: 269 | default-require-extensions "^3.0.0" 270 | 271 | archy@^1.0.0: 272 | version "1.0.0" 273 | resolved "https://registry.yarnpkg.com/archy/-/archy-1.0.0.tgz#f9c8c13757cc1dd7bc379ac77b2c62a5c2868c40" 274 | integrity sha1-+cjBN1fMHde8N5rHeyxipcKGjEA= 275 | 276 | argparse@^1.0.7: 277 | version "1.0.10" 278 | resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911" 279 | integrity sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg== 280 | dependencies: 281 | sprintf-js "~1.0.2" 282 | 283 | assertion-error@^1.1.0: 284 | version "1.1.0" 285 | resolved "https://registry.yarnpkg.com/assertion-error/-/assertion-error-1.1.0.tgz#e60b6b0e8f301bd97e5375215bda406c85118c0b" 286 | integrity sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw== 287 | 288 | asynckit@^0.4.0: 289 | version "0.4.0" 290 | resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" 291 | integrity sha1-x57Zf380y48robyXkLzDZkdLS3k= 292 | 293 | balanced-match@^1.0.0: 294 | version "1.0.0" 295 | resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767" 296 | integrity sha1-ibTRmasr7kneFk6gK4nORi1xt2c= 297 | 298 | binary-extensions@^2.0.0: 299 | version "2.0.0" 300 | resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.0.0.tgz#23c0df14f6a88077f5f986c0d167ec03c3d5537c" 301 | integrity sha512-Phlt0plgpIIBOGTT/ehfFnbNlfsDEiqmzE2KRXoX1bLIlir4X/MR+zSyBEkL05ffWgnRSf/DXv+WrUAVr93/ow== 302 | 303 | brace-expansion@^1.1.7: 304 | version "1.1.11" 305 | resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" 306 | integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== 307 | dependencies: 308 | balanced-match "^1.0.0" 309 | concat-map "0.0.1" 310 | 311 | braces@~3.0.2: 312 | version "3.0.2" 313 | resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107" 314 | integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== 315 | dependencies: 316 | fill-range "^7.0.1" 317 | 318 | browser-stdout@1.3.1: 319 | version "1.3.1" 320 | resolved "https://registry.yarnpkg.com/browser-stdout/-/browser-stdout-1.3.1.tgz#baa559ee14ced73452229bad7326467c61fabd60" 321 | integrity sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw== 322 | 323 | buffer-equal-constant-time@1.0.1: 324 | version "1.0.1" 325 | resolved "https://registry.yarnpkg.com/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz#f8e71132f7ffe6e01a5c9697a4c6f3e48d5cc819" 326 | integrity sha1-+OcRMvf/5uAaXJaXpMbz5I1cyBk= 327 | 328 | cache-content-type@^1.0.0: 329 | version "1.0.1" 330 | resolved "https://registry.yarnpkg.com/cache-content-type/-/cache-content-type-1.0.1.tgz#035cde2b08ee2129f4a8315ea8f00a00dba1453c" 331 | integrity sha512-IKufZ1o4Ut42YUrZSo8+qnMTrFuKkvyoLXUywKz9GJ5BrhOFGhLdkx9sG4KAnVvbY6kEcSFjLQul+DVmBm2bgA== 332 | dependencies: 333 | mime-types "^2.1.18" 334 | ylru "^1.2.0" 335 | 336 | caching-transform@^4.0.0: 337 | version "4.0.0" 338 | resolved "https://registry.yarnpkg.com/caching-transform/-/caching-transform-4.0.0.tgz#00d297a4206d71e2163c39eaffa8157ac0651f0f" 339 | integrity sha512-kpqOvwXnjjN44D89K5ccQC+RUrsy7jB/XLlRrx0D7/2HNcTPqzsb6XgYoErwko6QsV184CA2YgS1fxDiiDZMWA== 340 | dependencies: 341 | hasha "^5.0.0" 342 | make-dir "^3.0.0" 343 | package-hash "^4.0.0" 344 | write-file-atomic "^3.0.0" 345 | 346 | call-bind@^1.0.0: 347 | version "1.0.2" 348 | resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.2.tgz#b1d4e89e688119c3c9a903ad30abb2f6a919be3c" 349 | integrity sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA== 350 | dependencies: 351 | function-bind "^1.1.1" 352 | get-intrinsic "^1.0.2" 353 | 354 | camelcase@^5.0.0, camelcase@^5.3.1: 355 | version "5.3.1" 356 | resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320" 357 | integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg== 358 | 359 | chai@latest: 360 | version "4.2.0" 361 | resolved "https://registry.yarnpkg.com/chai/-/chai-4.2.0.tgz#760aa72cf20e3795e84b12877ce0e83737aa29e5" 362 | integrity sha512-XQU3bhBukrOsQCuwZndwGcCVQHyZi53fQ6Ys1Fym7E4olpIqqZZhhoFJoaKVvV17lWQoXYwgWN2nF5crA8J2jw== 363 | dependencies: 364 | assertion-error "^1.1.0" 365 | check-error "^1.0.2" 366 | deep-eql "^3.0.1" 367 | get-func-name "^2.0.0" 368 | pathval "^1.1.0" 369 | type-detect "^4.0.5" 370 | 371 | chalk@^2.0.0, chalk@^2.4.2: 372 | version "2.4.2" 373 | resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" 374 | integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== 375 | dependencies: 376 | ansi-styles "^3.2.1" 377 | escape-string-regexp "^1.0.5" 378 | supports-color "^5.3.0" 379 | 380 | check-error@^1.0.2: 381 | version "1.0.2" 382 | resolved "https://registry.yarnpkg.com/check-error/-/check-error-1.0.2.tgz#574d312edd88bb5dd8912e9286dd6c0aed4aac82" 383 | integrity sha1-V00xLt2Iu13YkS6Sht1sCu1KrII= 384 | 385 | chokidar@3.3.0: 386 | version "3.3.0" 387 | resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.3.0.tgz#12c0714668c55800f659e262d4962a97faf554a6" 388 | integrity sha512-dGmKLDdT3Gdl7fBUe8XK+gAtGmzy5Fn0XkkWQuYxGIgWVPPse2CxFA5mtrlD0TOHaHjEUqkWNyP1XdHoJES/4A== 389 | dependencies: 390 | anymatch "~3.1.1" 391 | braces "~3.0.2" 392 | glob-parent "~5.1.0" 393 | is-binary-path "~2.1.0" 394 | is-glob "~4.0.1" 395 | normalize-path "~3.0.0" 396 | readdirp "~3.2.0" 397 | optionalDependencies: 398 | fsevents "~2.1.1" 399 | 400 | clean-stack@^2.0.0: 401 | version "2.2.0" 402 | resolved "https://registry.yarnpkg.com/clean-stack/-/clean-stack-2.2.0.tgz#ee8472dbb129e727b31e8a10a427dee9dfe4008b" 403 | integrity sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A== 404 | 405 | cliui@^5.0.0: 406 | version "5.0.0" 407 | resolved "https://registry.yarnpkg.com/cliui/-/cliui-5.0.0.tgz#deefcfdb2e800784aa34f46fa08e06851c7bbbc5" 408 | integrity sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA== 409 | dependencies: 410 | string-width "^3.1.0" 411 | strip-ansi "^5.2.0" 412 | wrap-ansi "^5.1.0" 413 | 414 | cliui@^6.0.0: 415 | version "6.0.0" 416 | resolved "https://registry.yarnpkg.com/cliui/-/cliui-6.0.0.tgz#511d702c0c4e41ca156d7d0e96021f23e13225b1" 417 | integrity sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ== 418 | dependencies: 419 | string-width "^4.2.0" 420 | strip-ansi "^6.0.0" 421 | wrap-ansi "^6.2.0" 422 | 423 | co@^4.6.0: 424 | version "4.6.0" 425 | resolved "https://registry.yarnpkg.com/co/-/co-4.6.0.tgz#6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184" 426 | integrity sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ= 427 | 428 | color-convert@^1.9.0: 429 | version "1.9.3" 430 | resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" 431 | integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== 432 | dependencies: 433 | color-name "1.1.3" 434 | 435 | color-convert@^2.0.1: 436 | version "2.0.1" 437 | resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" 438 | integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== 439 | dependencies: 440 | color-name "~1.1.4" 441 | 442 | color-name@1.1.3: 443 | version "1.1.3" 444 | resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" 445 | integrity sha1-p9BVi9icQveV3UIyj3QIMcpTvCU= 446 | 447 | color-name@~1.1.4: 448 | version "1.1.4" 449 | resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" 450 | integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== 451 | 452 | combined-stream@^1.0.6: 453 | version "1.0.8" 454 | resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f" 455 | integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg== 456 | dependencies: 457 | delayed-stream "~1.0.0" 458 | 459 | commondir@^1.0.1: 460 | version "1.0.1" 461 | resolved "https://registry.yarnpkg.com/commondir/-/commondir-1.0.1.tgz#ddd800da0c66127393cca5950ea968a3aaf1253b" 462 | integrity sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs= 463 | 464 | component-emitter@^1.2.0: 465 | version "1.3.0" 466 | resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.3.0.tgz#16e4070fba8ae29b679f2215853ee181ab2eabc0" 467 | integrity sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg== 468 | 469 | concat-map@0.0.1: 470 | version "0.0.1" 471 | resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" 472 | integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s= 473 | 474 | content-disposition@~0.5.2: 475 | version "0.5.3" 476 | resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.3.tgz#e130caf7e7279087c5616c2007d0485698984fbd" 477 | integrity sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g== 478 | dependencies: 479 | safe-buffer "5.1.2" 480 | 481 | content-type@^1.0.4: 482 | version "1.0.4" 483 | resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.4.tgz#e138cc75e040c727b1966fe5e5f8c9aee256fe3b" 484 | integrity sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA== 485 | 486 | convert-source-map@^1.7.0: 487 | version "1.7.0" 488 | resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.7.0.tgz#17a2cb882d7f77d3490585e2ce6c524424a3a442" 489 | integrity sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA== 490 | dependencies: 491 | safe-buffer "~5.1.1" 492 | 493 | cookiejar@^2.1.0: 494 | version "2.1.2" 495 | resolved "https://registry.yarnpkg.com/cookiejar/-/cookiejar-2.1.2.tgz#dd8a235530752f988f9a0844f3fc589e3111125c" 496 | integrity sha512-Mw+adcfzPxcPeI+0WlvRrr/3lGVO0bD75SxX6811cxSh1Wbxx7xZBGK1eVtDf6si8rg2lhnUjsVLMFMfbRIuwA== 497 | 498 | cookies@~0.8.0: 499 | version "0.8.0" 500 | resolved "https://registry.yarnpkg.com/cookies/-/cookies-0.8.0.tgz#1293ce4b391740a8406e3c9870e828c4b54f3f90" 501 | integrity sha512-8aPsApQfebXnuI+537McwYsDtjVxGm8gTIzQI3FDW6t5t/DAhERxtnbEPN/8RX+uZthoz4eCOgloXaE5cYyNow== 502 | dependencies: 503 | depd "~2.0.0" 504 | keygrip "~1.1.0" 505 | 506 | core-util-is@~1.0.0: 507 | version "1.0.2" 508 | resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" 509 | integrity sha1-tf1UIgqivFq1eqtxQMlAdUUDwac= 510 | 511 | cross-spawn@^7.0.0: 512 | version "7.0.2" 513 | resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.2.tgz#d0d7dcfa74e89115c7619f4f721a94e1fdb716d6" 514 | integrity sha512-PD6G8QG3S4FK/XCGFbEQrDqO2AnMMsy0meR7lerlIOHAAbkuavGU/pOqprrlvfTNjvowivTeBsjebAL0NSoMxw== 515 | dependencies: 516 | path-key "^3.1.0" 517 | shebang-command "^2.0.0" 518 | which "^2.0.1" 519 | 520 | debug@3.2.6, debug@^3.1.0: 521 | version "3.2.6" 522 | resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.6.tgz#e83d17de16d8a7efb7717edbe5fb10135eee629b" 523 | integrity sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ== 524 | dependencies: 525 | ms "^2.1.1" 526 | 527 | debug@^4.1.0, debug@^4.1.1: 528 | version "4.1.1" 529 | resolved "https://registry.yarnpkg.com/debug/-/debug-4.1.1.tgz#3b72260255109c6b589cee050f1d516139664791" 530 | integrity sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw== 531 | dependencies: 532 | ms "^2.1.1" 533 | 534 | debug@~3.1.0: 535 | version "3.1.0" 536 | resolved "https://registry.yarnpkg.com/debug/-/debug-3.1.0.tgz#5bb5a0672628b64149566ba16819e61518c67261" 537 | integrity sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g== 538 | dependencies: 539 | ms "2.0.0" 540 | 541 | decamelize@^1.2.0: 542 | version "1.2.0" 543 | resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" 544 | integrity sha1-9lNNFRSCabIDUue+4m9QH5oZEpA= 545 | 546 | deep-eql@^3.0.1: 547 | version "3.0.1" 548 | resolved "https://registry.yarnpkg.com/deep-eql/-/deep-eql-3.0.1.tgz#dfc9404400ad1c8fe023e7da1df1c147c4b444df" 549 | integrity sha512-+QeIQyN5ZuO+3Uk5DYh6/1eKO0m0YmJFGNmFHGACpf1ClL1nmlV/p4gNgbl2pJGxgXb4faqo6UE+M5ACEMyVcw== 550 | dependencies: 551 | type-detect "^4.0.0" 552 | 553 | deep-equal@~1.0.1: 554 | version "1.0.1" 555 | resolved "https://registry.yarnpkg.com/deep-equal/-/deep-equal-1.0.1.tgz#f5d260292b660e084eff4cdbc9f08ad3247448b5" 556 | integrity sha1-9dJgKStmDghO/0zbyfCK0yR0SLU= 557 | 558 | default-require-extensions@^3.0.0: 559 | version "3.0.0" 560 | resolved "https://registry.yarnpkg.com/default-require-extensions/-/default-require-extensions-3.0.0.tgz#e03f93aac9b2b6443fc52e5e4a37b3ad9ad8df96" 561 | integrity sha512-ek6DpXq/SCpvjhpFsLFRVtIxJCRw6fUR42lYMVZuUMK7n8eMz4Uh5clckdBjEpLhn/gEBZo7hDJnJcwdKLKQjg== 562 | dependencies: 563 | strip-bom "^4.0.0" 564 | 565 | define-properties@^1.1.2, define-properties@^1.1.3: 566 | version "1.1.3" 567 | resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.3.tgz#cf88da6cbee26fe6db7094f61d870cbd84cee9f1" 568 | integrity sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ== 569 | dependencies: 570 | object-keys "^1.0.12" 571 | 572 | delayed-stream@~1.0.0: 573 | version "1.0.0" 574 | resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" 575 | integrity sha1-3zrhmayt+31ECqrgsp4icrJOxhk= 576 | 577 | delegates@^1.0.0: 578 | version "1.0.0" 579 | resolved "https://registry.yarnpkg.com/delegates/-/delegates-1.0.0.tgz#84c6e159b81904fdca59a0ef44cd870d31250f9a" 580 | integrity sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o= 581 | 582 | depd@^1.1.2, depd@~1.1.2: 583 | version "1.1.2" 584 | resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.2.tgz#9bcd52e14c097763e749b274c4346ed2e560b5a9" 585 | integrity sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak= 586 | 587 | depd@~2.0.0: 588 | version "2.0.0" 589 | resolved "https://registry.yarnpkg.com/depd/-/depd-2.0.0.tgz#b696163cc757560d09cf22cc8fad1571b79e76df" 590 | integrity sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw== 591 | 592 | destroy@^1.0.4: 593 | version "1.0.4" 594 | resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.0.4.tgz#978857442c44749e4206613e37946205826abd80" 595 | integrity sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA= 596 | 597 | diff@3.5.0: 598 | version "3.5.0" 599 | resolved "https://registry.yarnpkg.com/diff/-/diff-3.5.0.tgz#800c0dd1e0a8bfbc95835c202ad220fe317e5a12" 600 | integrity sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA== 601 | 602 | ecdsa-sig-formatter@1.0.11: 603 | version "1.0.11" 604 | resolved "https://registry.yarnpkg.com/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz#ae0f0fa2d85045ef14a817daa3ce9acd0489e5bf" 605 | integrity sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ== 606 | dependencies: 607 | safe-buffer "^5.0.1" 608 | 609 | ee-first@1.1.1: 610 | version "1.1.1" 611 | resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" 612 | integrity sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0= 613 | 614 | emoji-regex@^7.0.1: 615 | version "7.0.3" 616 | resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-7.0.3.tgz#933a04052860c85e83c122479c4748a8e4c72156" 617 | integrity sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA== 618 | 619 | emoji-regex@^8.0.0: 620 | version "8.0.0" 621 | resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" 622 | integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== 623 | 624 | encodeurl@^1.0.2: 625 | version "1.0.2" 626 | resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59" 627 | integrity sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k= 628 | 629 | error-inject@^1.0.0: 630 | version "1.0.0" 631 | resolved "https://registry.yarnpkg.com/error-inject/-/error-inject-1.0.0.tgz#e2b3d91b54aed672f309d950d154850fa11d4f37" 632 | integrity sha1-4rPZG1Su1nLzCdlQ0VSFD6EdTzc= 633 | 634 | es-abstract@^1.17.0-next.1, es-abstract@^1.17.5: 635 | version "1.17.5" 636 | resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.17.5.tgz#d8c9d1d66c8981fb9200e2251d799eee92774ae9" 637 | integrity sha512-BR9auzDbySxOcfog0tLECW8l28eRGpDpU3Dm3Hp4q/N+VtLTmyj4EUN088XZWQDW/hzj6sYRDXeOFsaAODKvpg== 638 | dependencies: 639 | es-to-primitive "^1.2.1" 640 | function-bind "^1.1.1" 641 | has "^1.0.3" 642 | has-symbols "^1.0.1" 643 | is-callable "^1.1.5" 644 | is-regex "^1.0.5" 645 | object-inspect "^1.7.0" 646 | object-keys "^1.1.1" 647 | object.assign "^4.1.0" 648 | string.prototype.trimleft "^2.1.1" 649 | string.prototype.trimright "^2.1.1" 650 | 651 | es-to-primitive@^1.2.1: 652 | version "1.2.1" 653 | resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.2.1.tgz#e55cd4c9cdc188bcefb03b366c736323fc5c898a" 654 | integrity sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA== 655 | dependencies: 656 | is-callable "^1.1.4" 657 | is-date-object "^1.0.1" 658 | is-symbol "^1.0.2" 659 | 660 | es6-error@^4.0.1: 661 | version "4.1.1" 662 | resolved "https://registry.yarnpkg.com/es6-error/-/es6-error-4.1.1.tgz#9e3af407459deed47e9a91f9b885a84eb05c561d" 663 | integrity sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg== 664 | 665 | escape-html@^1.0.3: 666 | version "1.0.3" 667 | resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988" 668 | integrity sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg= 669 | 670 | escape-string-regexp@1.0.5, escape-string-regexp@^1.0.5: 671 | version "1.0.5" 672 | resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" 673 | integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ= 674 | 675 | esprima@^4.0.0: 676 | version "4.0.1" 677 | resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" 678 | integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== 679 | 680 | extend@^3.0.0: 681 | version "3.0.2" 682 | resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa" 683 | integrity sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g== 684 | 685 | fill-range@^7.0.1: 686 | version "7.0.1" 687 | resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40" 688 | integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ== 689 | dependencies: 690 | to-regex-range "^5.0.1" 691 | 692 | find-cache-dir@^3.2.0: 693 | version "3.3.1" 694 | resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-3.3.1.tgz#89b33fad4a4670daa94f855f7fbe31d6d84fe880" 695 | integrity sha512-t2GDMt3oGC/v+BMwzmllWDuJF/xcDtE5j/fCGbqDD7OLuJkj0cfh1YSA5VKPvwMeLFLNDBkwOKZ2X85jGLVftQ== 696 | dependencies: 697 | commondir "^1.0.1" 698 | make-dir "^3.0.2" 699 | pkg-dir "^4.1.0" 700 | 701 | find-up@3.0.0, find-up@^3.0.0: 702 | version "3.0.0" 703 | resolved "https://registry.yarnpkg.com/find-up/-/find-up-3.0.0.tgz#49169f1d7993430646da61ecc5ae355c21c97b73" 704 | integrity sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg== 705 | dependencies: 706 | locate-path "^3.0.0" 707 | 708 | find-up@^4.0.0, find-up@^4.1.0: 709 | version "4.1.0" 710 | resolved "https://registry.yarnpkg.com/find-up/-/find-up-4.1.0.tgz#97afe7d6cdc0bc5928584b7c8d7b16e8a9aa5d19" 711 | integrity sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw== 712 | dependencies: 713 | locate-path "^5.0.0" 714 | path-exists "^4.0.0" 715 | 716 | flat@^4.1.0: 717 | version "4.1.0" 718 | resolved "https://registry.yarnpkg.com/flat/-/flat-4.1.0.tgz#090bec8b05e39cba309747f1d588f04dbaf98db2" 719 | integrity sha512-Px/TiLIznH7gEDlPXcUD4KnBusa6kR6ayRUVcnEAbreRIuhkqow/mun59BuRXwoYk7ZQOLW1ZM05ilIvK38hFw== 720 | dependencies: 721 | is-buffer "~2.0.3" 722 | 723 | foreground-child@^2.0.0: 724 | version "2.0.0" 725 | resolved "https://registry.yarnpkg.com/foreground-child/-/foreground-child-2.0.0.tgz#71b32800c9f15aa8f2f83f4a6bd9bff35d861a53" 726 | integrity sha512-dCIq9FpEcyQyXKCkyzmlPTFNgrCzPudOe+mhvJU5zAtlBnGVy2yKxtfsxK2tQBThwq225jcvBjpw1Gr40uzZCA== 727 | dependencies: 728 | cross-spawn "^7.0.0" 729 | signal-exit "^3.0.2" 730 | 731 | form-data@^2.3.1: 732 | version "2.5.1" 733 | resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.5.1.tgz#f2cbec57b5e59e23716e128fe44d4e5dd23895f4" 734 | integrity sha512-m21N3WOmEEURgk6B9GLOE4RuWOFf28Lhh9qGYeNlGq4VDXUlJy2th2slBNU8Gp8EzloYZOibZJ7t5ecIrFSjVA== 735 | dependencies: 736 | asynckit "^0.4.0" 737 | combined-stream "^1.0.6" 738 | mime-types "^2.1.12" 739 | 740 | formidable@^1.2.0: 741 | version "1.2.2" 742 | resolved "https://registry.yarnpkg.com/formidable/-/formidable-1.2.2.tgz#bf69aea2972982675f00865342b982986f6b8dd9" 743 | integrity sha512-V8gLm+41I/8kguQ4/o1D3RIHRmhYFG4pnNyonvua+40rqcEmT4+V71yaZ3B457xbbgCsCfjSPi65u/W6vK1U5Q== 744 | 745 | fresh@~0.5.2: 746 | version "0.5.2" 747 | resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7" 748 | integrity sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac= 749 | 750 | fromentries@^1.2.0: 751 | version "1.2.0" 752 | resolved "https://registry.yarnpkg.com/fromentries/-/fromentries-1.2.0.tgz#e6aa06f240d6267f913cea422075ef88b63e7897" 753 | integrity sha512-33X7H/wdfO99GdRLLgkjUrD4geAFdq/Uv0kl3HD4da6HDixd2GUg8Mw7dahLCV9r/EARkmtYBB6Tch4EEokFTQ== 754 | 755 | fs.realpath@^1.0.0: 756 | version "1.0.0" 757 | resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" 758 | integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8= 759 | 760 | fsevents@~2.1.1: 761 | version "2.1.2" 762 | resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.1.2.tgz#4c0a1fb34bc68e543b4b82a9ec392bfbda840805" 763 | integrity sha512-R4wDiBwZ0KzpgOWetKDug1FZcYhqYnUYKtfZYt4mD5SBz76q0KR4Q9o7GIPamsVPGmW3EYPPJ0dOOjvx32ldZA== 764 | 765 | function-bind@^1.1.1: 766 | version "1.1.1" 767 | resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" 768 | integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== 769 | 770 | gensync@^1.0.0-beta.1: 771 | version "1.0.0-beta.1" 772 | resolved "https://registry.yarnpkg.com/gensync/-/gensync-1.0.0-beta.1.tgz#58f4361ff987e5ff6e1e7a210827aa371eaac269" 773 | integrity sha512-r8EC6NO1sngH/zdD9fiRDLdcgnbayXah+mLgManTaIZJqEC1MZstmnox8KpnI2/fxQwrp5OpCOYWLp4rBl4Jcg== 774 | 775 | get-caller-file@^2.0.1: 776 | version "2.0.5" 777 | resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" 778 | integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== 779 | 780 | get-func-name@^2.0.0: 781 | version "2.0.0" 782 | resolved "https://registry.yarnpkg.com/get-func-name/-/get-func-name-2.0.0.tgz#ead774abee72e20409433a066366023dd6887a41" 783 | integrity sha1-6td0q+5y4gQJQzoGY2YCPdaIekE= 784 | 785 | get-intrinsic@^1.0.2: 786 | version "1.1.3" 787 | resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.1.3.tgz#063c84329ad93e83893c7f4f243ef63ffa351385" 788 | integrity sha512-QJVz1Tj7MS099PevUG5jvnt9tSkXN8K14dxQlikJuPt4uD9hHAHjLyLBiLR5zELelBdD9QNRAXZzsJx0WaDL9A== 789 | dependencies: 790 | function-bind "^1.1.1" 791 | has "^1.0.3" 792 | has-symbols "^1.0.3" 793 | 794 | glob-parent@~5.1.0: 795 | version "5.1.2" 796 | resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" 797 | integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== 798 | dependencies: 799 | is-glob "^4.0.1" 800 | 801 | glob@7.1.3: 802 | version "7.1.3" 803 | resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.3.tgz#3960832d3f1574108342dafd3a67b332c0969df1" 804 | integrity sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ== 805 | dependencies: 806 | fs.realpath "^1.0.0" 807 | inflight "^1.0.4" 808 | inherits "2" 809 | minimatch "^3.0.4" 810 | once "^1.3.0" 811 | path-is-absolute "^1.0.0" 812 | 813 | glob@^7.1.3, glob@^7.1.4, glob@^7.1.6: 814 | version "7.1.6" 815 | resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.6.tgz#141f33b81a7c2492e125594307480c46679278a6" 816 | integrity sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA== 817 | dependencies: 818 | fs.realpath "^1.0.0" 819 | inflight "^1.0.4" 820 | inherits "2" 821 | minimatch "^3.0.4" 822 | once "^1.3.0" 823 | path-is-absolute "^1.0.0" 824 | 825 | globals@^11.1.0: 826 | version "11.12.0" 827 | resolved "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e" 828 | integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA== 829 | 830 | graceful-fs@^4.1.15: 831 | version "4.2.3" 832 | resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.3.tgz#4a12ff1b60376ef09862c2093edd908328be8423" 833 | integrity sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ== 834 | 835 | growl@1.10.5: 836 | version "1.10.5" 837 | resolved "https://registry.yarnpkg.com/growl/-/growl-1.10.5.tgz#f2735dc2283674fa67478b10181059355c369e5e" 838 | integrity sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA== 839 | 840 | has-flag@^3.0.0: 841 | version "3.0.0" 842 | resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" 843 | integrity sha1-tdRU3CGZriJWmfNGfloH87lVuv0= 844 | 845 | has-flag@^4.0.0: 846 | version "4.0.0" 847 | resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" 848 | integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== 849 | 850 | has-symbols@^1.0.0, has-symbols@^1.0.1: 851 | version "1.0.1" 852 | resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.1.tgz#9f5214758a44196c406d9bd76cebf81ec2dd31e8" 853 | integrity sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg== 854 | 855 | has-symbols@^1.0.3: 856 | version "1.0.3" 857 | resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.3.tgz#bb7b2c4349251dce87b125f7bdf874aa7c8b39f8" 858 | integrity sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A== 859 | 860 | has@^1.0.3: 861 | version "1.0.3" 862 | resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796" 863 | integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw== 864 | dependencies: 865 | function-bind "^1.1.1" 866 | 867 | hasha@^5.0.0: 868 | version "5.2.0" 869 | resolved "https://registry.yarnpkg.com/hasha/-/hasha-5.2.0.tgz#33094d1f69c40a4a6ac7be53d5fe3ff95a269e0c" 870 | integrity sha512-2W+jKdQbAdSIrggA8Q35Br8qKadTrqCTC8+XZvBWepKDK6m9XkX6Iz1a2yh2KP01kzAR/dpuMeUnocoLYDcskw== 871 | dependencies: 872 | is-stream "^2.0.0" 873 | type-fest "^0.8.0" 874 | 875 | he@1.2.0: 876 | version "1.2.0" 877 | resolved "https://registry.yarnpkg.com/he/-/he-1.2.0.tgz#84ae65fa7eafb165fddb61566ae14baf05664f0f" 878 | integrity sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw== 879 | 880 | html-escaper@^2.0.0: 881 | version "2.0.2" 882 | resolved "https://registry.yarnpkg.com/html-escaper/-/html-escaper-2.0.2.tgz#dfd60027da36a36dfcbe236262c00a5822681453" 883 | integrity sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg== 884 | 885 | http-assert@^1.3.0: 886 | version "1.4.1" 887 | resolved "https://registry.yarnpkg.com/http-assert/-/http-assert-1.4.1.tgz#c5f725d677aa7e873ef736199b89686cceb37878" 888 | integrity sha512-rdw7q6GTlibqVVbXr0CKelfV5iY8G2HqEUkhSk297BMbSpSL8crXC+9rjKoMcZZEsksX30le6f/4ul4E28gegw== 889 | dependencies: 890 | deep-equal "~1.0.1" 891 | http-errors "~1.7.2" 892 | 893 | http-errors@^1.6.3, http-errors@~1.7.2: 894 | version "1.7.3" 895 | resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.7.3.tgz#6c619e4f9c60308c38519498c14fbb10aacebb06" 896 | integrity sha512-ZTTX0MWrsQ2ZAhA1cejAwDLycFsd7I7nVtnkT3Ol0aqodaKW+0CTZDQ1uBv5whptCnc8e8HeRRJxRs0kmm/Qfw== 897 | dependencies: 898 | depd "~1.1.2" 899 | inherits "2.0.4" 900 | setprototypeof "1.1.1" 901 | statuses ">= 1.5.0 < 2" 902 | toidentifier "1.0.0" 903 | 904 | imurmurhash@^0.1.4: 905 | version "0.1.4" 906 | resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" 907 | integrity sha1-khi5srkoojixPcT7a21XbyMUU+o= 908 | 909 | indent-string@^4.0.0: 910 | version "4.0.0" 911 | resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-4.0.0.tgz#624f8f4497d619b2d9768531d58f4122854d7251" 912 | integrity sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg== 913 | 914 | inflight@^1.0.4: 915 | version "1.0.6" 916 | resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" 917 | integrity sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk= 918 | dependencies: 919 | once "^1.3.0" 920 | wrappy "1" 921 | 922 | inherits@2, inherits@2.0.4, inherits@~2.0.3: 923 | version "2.0.4" 924 | resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" 925 | integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== 926 | 927 | is-binary-path@~2.1.0: 928 | version "2.1.0" 929 | resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-2.1.0.tgz#ea1f7f3b80f064236e83470f86c09c254fb45b09" 930 | integrity sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw== 931 | dependencies: 932 | binary-extensions "^2.0.0" 933 | 934 | is-buffer@~2.0.3: 935 | version "2.0.4" 936 | resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-2.0.4.tgz#3e572f23c8411a5cfd9557c849e3665e0b290623" 937 | integrity sha512-Kq1rokWXOPXWuaMAqZiJW4XxsmD9zGx9q4aePabbn3qCRGedtH7Cm+zV8WETitMfu1wdh+Rvd6w5egwSngUX2A== 938 | 939 | is-callable@^1.1.4, is-callable@^1.1.5: 940 | version "1.1.5" 941 | resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.1.5.tgz#f7e46b596890456db74e7f6e976cb3273d06faab" 942 | integrity sha512-ESKv5sMCJB2jnHTWZ3O5itG+O128Hsus4K4Qh1h2/cgn2vbgnLSVqfV46AeJA9D5EeeLa9w81KUXMtn34zhX+Q== 943 | 944 | is-date-object@^1.0.1: 945 | version "1.0.2" 946 | resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.2.tgz#bda736f2cd8fd06d32844e7743bfa7494c3bfd7e" 947 | integrity sha512-USlDT524woQ08aoZFzh3/Z6ch9Y/EWXEHQ/AaRN0SkKq4t2Jw2R2339tSXmwuVoY7LLlBCbOIlx2myP/L5zk0g== 948 | 949 | is-extglob@^2.1.1: 950 | version "2.1.1" 951 | resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" 952 | integrity sha1-qIwCU1eR8C7TfHahueqXc8gz+MI= 953 | 954 | is-fullwidth-code-point@^2.0.0: 955 | version "2.0.0" 956 | resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f" 957 | integrity sha1-o7MKXE8ZkYMWeqq5O+764937ZU8= 958 | 959 | is-fullwidth-code-point@^3.0.0: 960 | version "3.0.0" 961 | resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" 962 | integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== 963 | 964 | is-generator-function@^1.0.7: 965 | version "1.0.7" 966 | resolved "https://registry.yarnpkg.com/is-generator-function/-/is-generator-function-1.0.7.tgz#d2132e529bb0000a7f80794d4bdf5cd5e5813522" 967 | integrity sha512-YZc5EwyO4f2kWCax7oegfuSr9mFz1ZvieNYBEjmukLxgXfBUbxAWGVF7GZf0zidYtoBl3WvC07YK0wT76a+Rtw== 968 | 969 | is-glob@^4.0.1, is-glob@~4.0.1: 970 | version "4.0.1" 971 | resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.1.tgz#7567dbe9f2f5e2467bc77ab83c4a29482407a5dc" 972 | integrity sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg== 973 | dependencies: 974 | is-extglob "^2.1.1" 975 | 976 | is-number@^7.0.0: 977 | version "7.0.0" 978 | resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" 979 | integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== 980 | 981 | is-regex@^1.0.5: 982 | version "1.0.5" 983 | resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.0.5.tgz#39d589a358bf18967f726967120b8fc1aed74eae" 984 | integrity sha512-vlKW17SNq44owv5AQR3Cq0bQPEb8+kF3UKZ2fiZNOWtztYE5i0CzCZxFDwO58qAOWtxdBRVO/V5Qin1wjCqFYQ== 985 | dependencies: 986 | has "^1.0.3" 987 | 988 | is-stream@^2.0.0: 989 | version "2.0.0" 990 | resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-2.0.0.tgz#bde9c32680d6fae04129d6ac9d921ce7815f78e3" 991 | integrity sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw== 992 | 993 | is-symbol@^1.0.2: 994 | version "1.0.3" 995 | resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.3.tgz#38e1014b9e6329be0de9d24a414fd7441ec61937" 996 | integrity sha512-OwijhaRSgqvhm/0ZdAcXNZt9lYdKFpcRDT5ULUuYXPoT794UNOdU+gpT6Rzo7b4V2HUl/op6GqY894AZwv9faQ== 997 | dependencies: 998 | has-symbols "^1.0.1" 999 | 1000 | is-typedarray@^1.0.0: 1001 | version "1.0.0" 1002 | resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" 1003 | integrity sha1-5HnICFjfDBsR3dppQPlgEfzaSpo= 1004 | 1005 | is-windows@^1.0.2: 1006 | version "1.0.2" 1007 | resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-1.0.2.tgz#d1850eb9791ecd18e6182ce12a30f396634bb19d" 1008 | integrity sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA== 1009 | 1010 | isarray@~1.0.0: 1011 | version "1.0.0" 1012 | resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" 1013 | integrity sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE= 1014 | 1015 | isexe@^2.0.0: 1016 | version "2.0.0" 1017 | resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" 1018 | integrity sha1-6PvzdNxVb/iUehDcsFctYz8s+hA= 1019 | 1020 | istanbul-lib-coverage@^3.0.0, istanbul-lib-coverage@^3.0.0-alpha.1: 1021 | version "3.0.0" 1022 | resolved "https://registry.yarnpkg.com/istanbul-lib-coverage/-/istanbul-lib-coverage-3.0.0.tgz#f5944a37c70b550b02a78a5c3b2055b280cec8ec" 1023 | integrity sha512-UiUIqxMgRDET6eR+o5HbfRYP1l0hqkWOs7vNxC/mggutCMUIhWMm8gAHb8tHlyfD3/l6rlgNA5cKdDzEAf6hEg== 1024 | 1025 | istanbul-lib-hook@^3.0.0: 1026 | version "3.0.0" 1027 | resolved "https://registry.yarnpkg.com/istanbul-lib-hook/-/istanbul-lib-hook-3.0.0.tgz#8f84c9434888cc6b1d0a9d7092a76d239ebf0cc6" 1028 | integrity sha512-Pt/uge1Q9s+5VAZ+pCo16TYMWPBIl+oaNIjgLQxcX0itS6ueeaA+pEfThZpH8WxhFgCiEb8sAJY6MdUKgiIWaQ== 1029 | dependencies: 1030 | append-transform "^2.0.0" 1031 | 1032 | istanbul-lib-instrument@^4.0.0: 1033 | version "4.0.1" 1034 | resolved "https://registry.yarnpkg.com/istanbul-lib-instrument/-/istanbul-lib-instrument-4.0.1.tgz#61f13ac2c96cfefb076fe7131156cc05907874e6" 1035 | integrity sha512-imIchxnodll7pvQBYOqUu88EufLCU56LMeFPZZM/fJZ1irYcYdqroaV+ACK1Ila8ls09iEYArp+nqyC6lW1Vfg== 1036 | dependencies: 1037 | "@babel/core" "^7.7.5" 1038 | "@babel/parser" "^7.7.5" 1039 | "@babel/template" "^7.7.4" 1040 | "@babel/traverse" "^7.7.4" 1041 | "@istanbuljs/schema" "^0.1.2" 1042 | istanbul-lib-coverage "^3.0.0" 1043 | semver "^6.3.0" 1044 | 1045 | istanbul-lib-processinfo@^2.0.2: 1046 | version "2.0.2" 1047 | resolved "https://registry.yarnpkg.com/istanbul-lib-processinfo/-/istanbul-lib-processinfo-2.0.2.tgz#e1426514662244b2f25df728e8fd1ba35fe53b9c" 1048 | integrity sha512-kOwpa7z9hme+IBPZMzQ5vdQj8srYgAtaRqeI48NGmAQ+/5yKiHLV0QbYqQpxsdEF0+w14SoB8YbnHKcXE2KnYw== 1049 | dependencies: 1050 | archy "^1.0.0" 1051 | cross-spawn "^7.0.0" 1052 | istanbul-lib-coverage "^3.0.0-alpha.1" 1053 | make-dir "^3.0.0" 1054 | p-map "^3.0.0" 1055 | rimraf "^3.0.0" 1056 | uuid "^3.3.3" 1057 | 1058 | istanbul-lib-report@^3.0.0: 1059 | version "3.0.0" 1060 | resolved "https://registry.yarnpkg.com/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz#7518fe52ea44de372f460a76b5ecda9ffb73d8a6" 1061 | integrity sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw== 1062 | dependencies: 1063 | istanbul-lib-coverage "^3.0.0" 1064 | make-dir "^3.0.0" 1065 | supports-color "^7.1.0" 1066 | 1067 | istanbul-lib-source-maps@^4.0.0: 1068 | version "4.0.0" 1069 | resolved "https://registry.yarnpkg.com/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.0.tgz#75743ce6d96bb86dc7ee4352cf6366a23f0b1ad9" 1070 | integrity sha512-c16LpFRkR8vQXyHZ5nLpY35JZtzj1PQY1iZmesUbf1FZHbIupcWfjgOXBY9YHkLEQ6puz1u4Dgj6qmU/DisrZg== 1071 | dependencies: 1072 | debug "^4.1.1" 1073 | istanbul-lib-coverage "^3.0.0" 1074 | source-map "^0.6.1" 1075 | 1076 | istanbul-reports@^3.0.2: 1077 | version "3.0.2" 1078 | resolved "https://registry.yarnpkg.com/istanbul-reports/-/istanbul-reports-3.0.2.tgz#d593210e5000683750cb09fc0644e4b6e27fd53b" 1079 | integrity sha512-9tZvz7AiR3PEDNGiV9vIouQ/EAcqMXFmkcA1CDFTwOB98OZVDL0PH9glHotf5Ugp6GCOTypfzGWI/OqjWNCRUw== 1080 | dependencies: 1081 | html-escaper "^2.0.0" 1082 | istanbul-lib-report "^3.0.0" 1083 | 1084 | js-tokens@^4.0.0: 1085 | version "4.0.0" 1086 | resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" 1087 | integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== 1088 | 1089 | js-yaml@3.13.1, js-yaml@^3.13.1: 1090 | version "3.13.1" 1091 | resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.13.1.tgz#aff151b30bfdfa8e49e05da22e7415e9dfa37847" 1092 | integrity sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw== 1093 | dependencies: 1094 | argparse "^1.0.7" 1095 | esprima "^4.0.0" 1096 | 1097 | jsesc@^2.5.1: 1098 | version "2.5.2" 1099 | resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-2.5.2.tgz#80564d2e483dacf6e8ef209650a67df3f0c283a4" 1100 | integrity sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA== 1101 | 1102 | json5@^2.1.2: 1103 | version "2.1.3" 1104 | resolved "https://registry.yarnpkg.com/json5/-/json5-2.1.3.tgz#c9b0f7fa9233bfe5807fe66fcf3a5617ed597d43" 1105 | integrity sha512-KXPvOm8K9IJKFM0bmdn8QXh7udDh1g/giieX0NLCaMnb4hEiVFqnop2ImTXCc5e0/oHz3LTqmHGtExn5hfMkOA== 1106 | dependencies: 1107 | minimist "^1.2.5" 1108 | 1109 | jsonwebtoken@^9.0.0: 1110 | version "9.0.0" 1111 | resolved "https://registry.yarnpkg.com/jsonwebtoken/-/jsonwebtoken-9.0.0.tgz#d0faf9ba1cc3a56255fe49c0961a67e520c1926d" 1112 | integrity sha512-tuGfYXxkQGDPnLJ7SibiQgVgeDgfbPq2k2ICcbgqW8WxWLBAxKQM/ZCu/IT8SOSwmaYl4dpTFCW5xZv7YbbWUw== 1113 | dependencies: 1114 | jws "^3.2.2" 1115 | lodash "^4.17.21" 1116 | ms "^2.1.1" 1117 | semver "^7.3.8" 1118 | 1119 | jwa@^1.4.1: 1120 | version "1.4.1" 1121 | resolved "https://registry.yarnpkg.com/jwa/-/jwa-1.4.1.tgz#743c32985cb9e98655530d53641b66c8645b039a" 1122 | integrity sha512-qiLX/xhEEFKUAJ6FiBMbes3w9ATzyk5W7Hvzpa/SLYdxNtng+gcurvrI7TbACjIXlsJyr05/S1oUhZrc63evQA== 1123 | dependencies: 1124 | buffer-equal-constant-time "1.0.1" 1125 | ecdsa-sig-formatter "1.0.11" 1126 | safe-buffer "^5.0.1" 1127 | 1128 | jws@^3.2.2: 1129 | version "3.2.2" 1130 | resolved "https://registry.yarnpkg.com/jws/-/jws-3.2.2.tgz#001099f3639468c9414000e99995fa52fb478304" 1131 | integrity sha512-YHlZCB6lMTllWDtSPHz/ZXTsi8S00usEV6v1tjq8tOUZzw7DpSDWVXjXDre6ed1w/pd495ODpHZYSdkRTsa0HA== 1132 | dependencies: 1133 | jwa "^1.4.1" 1134 | safe-buffer "^5.0.1" 1135 | 1136 | keygrip@~1.1.0: 1137 | version "1.1.0" 1138 | resolved "https://registry.yarnpkg.com/keygrip/-/keygrip-1.1.0.tgz#871b1681d5e159c62a445b0c74b615e0917e7226" 1139 | integrity sha512-iYSchDJ+liQ8iwbSI2QqsQOvqv58eJCEanyJPJi+Khyu8smkcKSFUCbPwzFcL7YVtZ6eONjqRX/38caJ7QjRAQ== 1140 | dependencies: 1141 | tsscmp "1.0.6" 1142 | 1143 | koa-compose@^3.0.0: 1144 | version "3.2.1" 1145 | resolved "https://registry.yarnpkg.com/koa-compose/-/koa-compose-3.2.1.tgz#a85ccb40b7d986d8e5a345b3a1ace8eabcf54de7" 1146 | integrity sha1-qFzLQLfZhtjlo0Wzoazo6rz1Tec= 1147 | dependencies: 1148 | any-promise "^1.1.0" 1149 | 1150 | koa-compose@^4.1.0: 1151 | version "4.1.0" 1152 | resolved "https://registry.yarnpkg.com/koa-compose/-/koa-compose-4.1.0.tgz#507306b9371901db41121c812e923d0d67d3e877" 1153 | integrity sha512-8ODW8TrDuMYvXRwra/Kh7/rJo9BtOfPc6qO8eAfC80CnCvSjSl0bkRM24X6/XBBEyj0v1nRUQ1LyOy3dbqOWXw== 1154 | 1155 | koa-convert@^1.2.0: 1156 | version "1.2.0" 1157 | resolved "https://registry.yarnpkg.com/koa-convert/-/koa-convert-1.2.0.tgz#da40875df49de0539098d1700b50820cebcd21d0" 1158 | integrity sha1-2kCHXfSd4FOQmNFwC1CCDOvNIdA= 1159 | dependencies: 1160 | co "^4.6.0" 1161 | koa-compose "^3.0.0" 1162 | 1163 | koa-unless@^1.0.7: 1164 | version "1.0.7" 1165 | resolved "https://registry.yarnpkg.com/koa-unless/-/koa-unless-1.0.7.tgz#b9df375e2b4da3043918d48622520c2c0b79f032" 1166 | integrity sha1-ud83XitNowQ5GNSGIlIMLAt58DI= 1167 | 1168 | koa@^2.11.0: 1169 | version "2.11.0" 1170 | resolved "https://registry.yarnpkg.com/koa/-/koa-2.11.0.tgz#fe5a51c46f566d27632dd5dc8fd5d7dd44f935a4" 1171 | integrity sha512-EpR9dElBTDlaDgyhDMiLkXrPwp6ZqgAIBvhhmxQ9XN4TFgW+gEz6tkcsNI6BnUbUftrKDjVFj4lW2/J2aNBMMA== 1172 | dependencies: 1173 | accepts "^1.3.5" 1174 | cache-content-type "^1.0.0" 1175 | content-disposition "~0.5.2" 1176 | content-type "^1.0.4" 1177 | cookies "~0.8.0" 1178 | debug "~3.1.0" 1179 | delegates "^1.0.0" 1180 | depd "^1.1.2" 1181 | destroy "^1.0.4" 1182 | encodeurl "^1.0.2" 1183 | error-inject "^1.0.0" 1184 | escape-html "^1.0.3" 1185 | fresh "~0.5.2" 1186 | http-assert "^1.3.0" 1187 | http-errors "^1.6.3" 1188 | is-generator-function "^1.0.7" 1189 | koa-compose "^4.1.0" 1190 | koa-convert "^1.2.0" 1191 | on-finished "^2.3.0" 1192 | only "~0.0.2" 1193 | parseurl "^1.3.2" 1194 | statuses "^1.5.0" 1195 | type-is "^1.6.16" 1196 | vary "^1.1.2" 1197 | 1198 | locate-path@^3.0.0: 1199 | version "3.0.0" 1200 | resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-3.0.0.tgz#dbec3b3ab759758071b58fe59fc41871af21400e" 1201 | integrity sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A== 1202 | dependencies: 1203 | p-locate "^3.0.0" 1204 | path-exists "^3.0.0" 1205 | 1206 | locate-path@^5.0.0: 1207 | version "5.0.0" 1208 | resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-5.0.0.tgz#1afba396afd676a6d42504d0a67a3a7eb9f62aa0" 1209 | integrity sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g== 1210 | dependencies: 1211 | p-locate "^4.1.0" 1212 | 1213 | lodash.flattendeep@^4.4.0: 1214 | version "4.4.0" 1215 | resolved "https://registry.yarnpkg.com/lodash.flattendeep/-/lodash.flattendeep-4.4.0.tgz#fb030917f86a3134e5bc9bec0d69e0013ddfedb2" 1216 | integrity sha1-+wMJF/hqMTTlvJvsDWngAT3f7bI= 1217 | 1218 | lodash@^4.17.13, lodash@^4.17.15, lodash@^4.17.21: 1219 | version "4.17.21" 1220 | resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" 1221 | integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== 1222 | 1223 | log-symbols@3.0.0: 1224 | version "3.0.0" 1225 | resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-3.0.0.tgz#f3a08516a5dea893336a7dee14d18a1cfdab77c4" 1226 | integrity sha512-dSkNGuI7iG3mfvDzUuYZyvk5dD9ocYCYzNU6CYDE6+Xqd+gwme6Z00NS3dUh8mq/73HaEtT7m6W+yUPtU6BZnQ== 1227 | dependencies: 1228 | chalk "^2.4.2" 1229 | 1230 | lru-cache@^6.0.0: 1231 | version "6.0.0" 1232 | resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-6.0.0.tgz#6d6fe6570ebd96aaf90fcad1dafa3b2566db3a94" 1233 | integrity sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA== 1234 | dependencies: 1235 | yallist "^4.0.0" 1236 | 1237 | make-dir@^3.0.0, make-dir@^3.0.2: 1238 | version "3.0.2" 1239 | resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-3.0.2.tgz#04a1acbf22221e1d6ef43559f43e05a90dbb4392" 1240 | integrity sha512-rYKABKutXa6vXTXhoV18cBE7PaewPXHe/Bdq4v+ZLMhxbWApkFFplT0LcbMW+6BbjnQXzZ/sAvSE/JdguApG5w== 1241 | dependencies: 1242 | semver "^6.0.0" 1243 | 1244 | media-typer@0.3.0: 1245 | version "0.3.0" 1246 | resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748" 1247 | integrity sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g= 1248 | 1249 | methods@^1.1.1, methods@^1.1.2: 1250 | version "1.1.2" 1251 | resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee" 1252 | integrity sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4= 1253 | 1254 | mime-db@1.43.0: 1255 | version "1.43.0" 1256 | resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.43.0.tgz#0a12e0502650e473d735535050e7c8f4eb4fae58" 1257 | integrity sha512-+5dsGEEovYbT8UY9yD7eE4XTc4UwJ1jBYlgaQQF38ENsKR3wj/8q8RFZrF9WIZpB2V1ArTVFUva8sAul1NzRzQ== 1258 | 1259 | mime-types@^2.1.12, mime-types@^2.1.18, mime-types@~2.1.24: 1260 | version "2.1.26" 1261 | resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.26.tgz#9c921fc09b7e149a65dfdc0da4d20997200b0a06" 1262 | integrity sha512-01paPWYgLrkqAyrlDorC1uDwl2p3qZT7yl806vW7DvDoxwXi46jsjFbg+WdwotBIk6/MbEhO/dh5aZ5sNj/dWQ== 1263 | dependencies: 1264 | mime-db "1.43.0" 1265 | 1266 | mime@^1.4.1: 1267 | version "1.6.0" 1268 | resolved "https://registry.yarnpkg.com/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1" 1269 | integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg== 1270 | 1271 | minimatch@3.0.4, minimatch@^3.0.4: 1272 | version "3.0.4" 1273 | resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" 1274 | integrity sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA== 1275 | dependencies: 1276 | brace-expansion "^1.1.7" 1277 | 1278 | minimist@^1.2.5: 1279 | version "1.2.6" 1280 | resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.6.tgz#8637a5b759ea0d6e98702cfb3a9283323c93af44" 1281 | integrity sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q== 1282 | 1283 | mkdirp@0.5.3: 1284 | version "0.5.3" 1285 | resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.3.tgz#5a514b7179259287952881e94410ec5465659f8c" 1286 | integrity sha512-P+2gwrFqx8lhew375MQHHeTlY8AuOJSrGf0R5ddkEndUkmwpgUob/vQuBD1V22/Cw1/lJr4x+EjllSezBThzBg== 1287 | dependencies: 1288 | minimist "^1.2.5" 1289 | 1290 | mocha@^7.1.1: 1291 | version "7.1.1" 1292 | resolved "https://registry.yarnpkg.com/mocha/-/mocha-7.1.1.tgz#89fbb30d09429845b1bb893a830bf5771049a441" 1293 | integrity sha512-3qQsu3ijNS3GkWcccT5Zw0hf/rWvu1fTN9sPvEd81hlwsr30GX2GcDSSoBxo24IR8FelmrAydGC6/1J5QQP4WA== 1294 | dependencies: 1295 | ansi-colors "3.2.3" 1296 | browser-stdout "1.3.1" 1297 | chokidar "3.3.0" 1298 | debug "3.2.6" 1299 | diff "3.5.0" 1300 | escape-string-regexp "1.0.5" 1301 | find-up "3.0.0" 1302 | glob "7.1.3" 1303 | growl "1.10.5" 1304 | he "1.2.0" 1305 | js-yaml "3.13.1" 1306 | log-symbols "3.0.0" 1307 | minimatch "3.0.4" 1308 | mkdirp "0.5.3" 1309 | ms "2.1.1" 1310 | node-environment-flags "1.0.6" 1311 | object.assign "4.1.0" 1312 | strip-json-comments "2.0.1" 1313 | supports-color "6.0.0" 1314 | which "1.3.1" 1315 | wide-align "1.1.3" 1316 | yargs "13.3.2" 1317 | yargs-parser "13.1.2" 1318 | yargs-unparser "1.6.0" 1319 | 1320 | ms@2.0.0: 1321 | version "2.0.0" 1322 | resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" 1323 | integrity sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g= 1324 | 1325 | ms@2.1.1: 1326 | version "2.1.1" 1327 | resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.1.tgz#30a5864eb3ebb0a66f2ebe6d727af06a09d86e0a" 1328 | integrity sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg== 1329 | 1330 | ms@^2.1.1: 1331 | version "2.1.2" 1332 | resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" 1333 | integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== 1334 | 1335 | negotiator@0.6.2: 1336 | version "0.6.2" 1337 | resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.2.tgz#feacf7ccf525a77ae9634436a64883ffeca346fb" 1338 | integrity sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw== 1339 | 1340 | node-environment-flags@1.0.6: 1341 | version "1.0.6" 1342 | resolved "https://registry.yarnpkg.com/node-environment-flags/-/node-environment-flags-1.0.6.tgz#a30ac13621f6f7d674260a54dede048c3982c088" 1343 | integrity sha512-5Evy2epuL+6TM0lCQGpFIj6KwiEsGh1SrHUhTbNX+sLbBtjidPZFAnVK9y5yU1+h//RitLbRHTIMyxQPtxMdHw== 1344 | dependencies: 1345 | object.getownpropertydescriptors "^2.0.3" 1346 | semver "^5.7.0" 1347 | 1348 | node-preload@^0.2.1: 1349 | version "0.2.1" 1350 | resolved "https://registry.yarnpkg.com/node-preload/-/node-preload-0.2.1.tgz#c03043bb327f417a18fee7ab7ee57b408a144301" 1351 | integrity sha512-RM5oyBy45cLEoHqCeh+MNuFAxO0vTFBLskvQbOKnEE7YTTSN4tbN8QWDIPQ6L+WvKsB/qLEGpYe2ZZ9d4W9OIQ== 1352 | dependencies: 1353 | process-on-spawn "^1.0.0" 1354 | 1355 | normalize-path@^3.0.0, normalize-path@~3.0.0: 1356 | version "3.0.0" 1357 | resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" 1358 | integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== 1359 | 1360 | nyc@^15.0.1: 1361 | version "15.0.1" 1362 | resolved "https://registry.yarnpkg.com/nyc/-/nyc-15.0.1.tgz#bd4d5c2b17f2ec04370365a5ca1fc0ed26f9f93d" 1363 | integrity sha512-n0MBXYBYRqa67IVt62qW1r/d9UH/Qtr7SF1w/nQLJ9KxvWF6b2xCHImRAixHN9tnMMYHC2P14uo6KddNGwMgGg== 1364 | dependencies: 1365 | "@istanbuljs/load-nyc-config" "^1.0.0" 1366 | "@istanbuljs/schema" "^0.1.2" 1367 | caching-transform "^4.0.0" 1368 | convert-source-map "^1.7.0" 1369 | decamelize "^1.2.0" 1370 | find-cache-dir "^3.2.0" 1371 | find-up "^4.1.0" 1372 | foreground-child "^2.0.0" 1373 | glob "^7.1.6" 1374 | istanbul-lib-coverage "^3.0.0" 1375 | istanbul-lib-hook "^3.0.0" 1376 | istanbul-lib-instrument "^4.0.0" 1377 | istanbul-lib-processinfo "^2.0.2" 1378 | istanbul-lib-report "^3.0.0" 1379 | istanbul-lib-source-maps "^4.0.0" 1380 | istanbul-reports "^3.0.2" 1381 | make-dir "^3.0.0" 1382 | node-preload "^0.2.1" 1383 | p-map "^3.0.0" 1384 | process-on-spawn "^1.0.0" 1385 | resolve-from "^5.0.0" 1386 | rimraf "^3.0.0" 1387 | signal-exit "^3.0.2" 1388 | spawn-wrap "^2.0.0" 1389 | test-exclude "^6.0.0" 1390 | yargs "^15.0.2" 1391 | 1392 | object-inspect@^1.7.0: 1393 | version "1.7.0" 1394 | resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.7.0.tgz#f4f6bd181ad77f006b5ece60bd0b6f398ff74a67" 1395 | integrity sha512-a7pEHdh1xKIAgTySUGgLMx/xwDZskN1Ud6egYYN3EdRW4ZMPNEDUTF+hwy2LUC+Bl+SyLXANnwz/jyh/qutKUw== 1396 | 1397 | object-inspect@^1.9.0: 1398 | version "1.12.2" 1399 | resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.12.2.tgz#c0641f26394532f28ab8d796ab954e43c009a8ea" 1400 | integrity sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ== 1401 | 1402 | object-keys@^1.0.11, object-keys@^1.0.12, object-keys@^1.1.1: 1403 | version "1.1.1" 1404 | resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" 1405 | integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== 1406 | 1407 | object.assign@4.1.0, object.assign@^4.1.0: 1408 | version "4.1.0" 1409 | resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.0.tgz#968bf1100d7956bb3ca086f006f846b3bc4008da" 1410 | integrity sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w== 1411 | dependencies: 1412 | define-properties "^1.1.2" 1413 | function-bind "^1.1.1" 1414 | has-symbols "^1.0.0" 1415 | object-keys "^1.0.11" 1416 | 1417 | object.getownpropertydescriptors@^2.0.3: 1418 | version "2.1.0" 1419 | resolved "https://registry.yarnpkg.com/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.0.tgz#369bf1f9592d8ab89d712dced5cb81c7c5352649" 1420 | integrity sha512-Z53Oah9A3TdLoblT7VKJaTDdXdT+lQO+cNpKVnya5JDe9uLvzu1YyY1yFDFrcxrlRgWrEFH0jJtD/IbuwjcEVg== 1421 | dependencies: 1422 | define-properties "^1.1.3" 1423 | es-abstract "^1.17.0-next.1" 1424 | 1425 | on-finished@^2.3.0: 1426 | version "2.3.0" 1427 | resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.3.0.tgz#20f1336481b083cd75337992a16971aa2d906947" 1428 | integrity sha1-IPEzZIGwg811M3mSoWlxqi2QaUc= 1429 | dependencies: 1430 | ee-first "1.1.1" 1431 | 1432 | once@^1.3.0: 1433 | version "1.4.0" 1434 | resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" 1435 | integrity sha1-WDsap3WWHUsROsF9nFC6753Xa9E= 1436 | dependencies: 1437 | wrappy "1" 1438 | 1439 | only@~0.0.2: 1440 | version "0.0.2" 1441 | resolved "https://registry.yarnpkg.com/only/-/only-0.0.2.tgz#2afde84d03e50b9a8edc444e30610a70295edfb4" 1442 | integrity sha1-Kv3oTQPlC5qO3EROMGEKcCle37Q= 1443 | 1444 | p-any@^2.1.0: 1445 | version "2.1.0" 1446 | resolved "https://registry.yarnpkg.com/p-any/-/p-any-2.1.0.tgz#719489408e14f5f941a748f1e817f5c71cab35cb" 1447 | integrity sha512-JAERcaMBLYKMq+voYw36+x5Dgh47+/o7yuv2oQYuSSUml4YeqJEFznBrY2UeEkoSHqBua6hz518n/PsowTYLLg== 1448 | dependencies: 1449 | p-cancelable "^2.0.0" 1450 | p-some "^4.0.0" 1451 | type-fest "^0.3.0" 1452 | 1453 | p-cancelable@^2.0.0: 1454 | version "2.0.0" 1455 | resolved "https://registry.yarnpkg.com/p-cancelable/-/p-cancelable-2.0.0.tgz#4a3740f5bdaf5ed5d7c3e34882c6fb5d6b266a6e" 1456 | integrity sha512-wvPXDmbMmu2ksjkB4Z3nZWTSkJEb9lqVdMaCKpZUGJG9TMiNp9XcbG3fn9fPKjem04fJMJnXoyFPk2FmgiaiNg== 1457 | 1458 | p-limit@^2.0.0, p-limit@^2.2.0: 1459 | version "2.3.0" 1460 | resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.3.0.tgz#3dd33c647a214fdfffd835933eb086da0dc21db1" 1461 | integrity sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w== 1462 | dependencies: 1463 | p-try "^2.0.0" 1464 | 1465 | p-locate@^3.0.0: 1466 | version "3.0.0" 1467 | resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-3.0.0.tgz#322d69a05c0264b25997d9f40cd8a891ab0064a4" 1468 | integrity sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ== 1469 | dependencies: 1470 | p-limit "^2.0.0" 1471 | 1472 | p-locate@^4.1.0: 1473 | version "4.1.0" 1474 | resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-4.1.0.tgz#a3428bb7088b3a60292f66919278b7c297ad4f07" 1475 | integrity sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A== 1476 | dependencies: 1477 | p-limit "^2.2.0" 1478 | 1479 | p-map@^3.0.0: 1480 | version "3.0.0" 1481 | resolved "https://registry.yarnpkg.com/p-map/-/p-map-3.0.0.tgz#d704d9af8a2ba684e2600d9a215983d4141a979d" 1482 | integrity sha512-d3qXVTF/s+W+CdJ5A29wywV2n8CQQYahlgz2bFiA+4eVNJbHJodPZ+/gXwPGh0bOqA+j8S+6+ckmvLGPk1QpxQ== 1483 | dependencies: 1484 | aggregate-error "^3.0.0" 1485 | 1486 | p-some@^4.0.0: 1487 | version "4.1.0" 1488 | resolved "https://registry.yarnpkg.com/p-some/-/p-some-4.1.0.tgz#28e73bc1e0d62db54c2ed513acd03acba30d5c04" 1489 | integrity sha512-MF/HIbq6GeBqTrTIl5OJubzkGU+qfFhAFi0gnTAK6rgEIJIknEiABHOTtQu4e6JiXjIwuMPMUFQzyHh5QjCl1g== 1490 | dependencies: 1491 | aggregate-error "^3.0.0" 1492 | p-cancelable "^2.0.0" 1493 | 1494 | p-try@^2.0.0: 1495 | version "2.2.0" 1496 | resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6" 1497 | integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ== 1498 | 1499 | package-hash@^4.0.0: 1500 | version "4.0.0" 1501 | resolved "https://registry.yarnpkg.com/package-hash/-/package-hash-4.0.0.tgz#3537f654665ec3cc38827387fc904c163c54f506" 1502 | integrity sha512-whdkPIooSu/bASggZ96BWVvZTRMOFxnyUG5PnTSGKoJE2gd5mbVNmR2Nj20QFzxYYgAXpoqC+AiXzl+UMRh7zQ== 1503 | dependencies: 1504 | graceful-fs "^4.1.15" 1505 | hasha "^5.0.0" 1506 | lodash.flattendeep "^4.4.0" 1507 | release-zalgo "^1.0.0" 1508 | 1509 | parseurl@^1.3.2: 1510 | version "1.3.3" 1511 | resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.3.tgz#9da19e7bee8d12dff0513ed5b76957793bc2e8d4" 1512 | integrity sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ== 1513 | 1514 | path-exists@^3.0.0: 1515 | version "3.0.0" 1516 | resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515" 1517 | integrity sha1-zg6+ql94yxiSXqfYENe1mwEP1RU= 1518 | 1519 | path-exists@^4.0.0: 1520 | version "4.0.0" 1521 | resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3" 1522 | integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== 1523 | 1524 | path-is-absolute@^1.0.0: 1525 | version "1.0.1" 1526 | resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" 1527 | integrity sha1-F0uSaHNVNP+8es5r9TpanhtcX18= 1528 | 1529 | path-key@^3.1.0: 1530 | version "3.1.1" 1531 | resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" 1532 | integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== 1533 | 1534 | path-parse@^1.0.6: 1535 | version "1.0.7" 1536 | resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" 1537 | integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== 1538 | 1539 | pathval@^1.1.0: 1540 | version "1.1.1" 1541 | resolved "https://registry.yarnpkg.com/pathval/-/pathval-1.1.1.tgz#8534e77a77ce7ac5a2512ea21e0fdb8fcf6c3d8d" 1542 | integrity sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ== 1543 | 1544 | picomatch@^2.0.4: 1545 | version "2.2.2" 1546 | resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.2.2.tgz#21f333e9b6b8eaff02468f5146ea406d345f4dad" 1547 | integrity sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg== 1548 | 1549 | pkg-dir@^4.1.0: 1550 | version "4.2.0" 1551 | resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-4.2.0.tgz#f099133df7ede422e81d1d8448270eeb3e4261f3" 1552 | integrity sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ== 1553 | dependencies: 1554 | find-up "^4.0.0" 1555 | 1556 | process-nextick-args@~2.0.0: 1557 | version "2.0.1" 1558 | resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2" 1559 | integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag== 1560 | 1561 | process-on-spawn@^1.0.0: 1562 | version "1.0.0" 1563 | resolved "https://registry.yarnpkg.com/process-on-spawn/-/process-on-spawn-1.0.0.tgz#95b05a23073d30a17acfdc92a440efd2baefdc93" 1564 | integrity sha512-1WsPDsUSMmZH5LeMLegqkPDrsGgsWwk1Exipy2hvB0o/F0ASzbpIctSCcZIK1ykJvtTJULEH+20WOFjMvGnCTg== 1565 | dependencies: 1566 | fromentries "^1.2.0" 1567 | 1568 | qs@^6.5.1: 1569 | version "6.11.0" 1570 | resolved "https://registry.yarnpkg.com/qs/-/qs-6.11.0.tgz#fd0d963446f7a65e1367e01abd85429453f0c37a" 1571 | integrity sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q== 1572 | dependencies: 1573 | side-channel "^1.0.4" 1574 | 1575 | readable-stream@^2.3.5: 1576 | version "2.3.7" 1577 | resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.7.tgz#1eca1cf711aef814c04f62252a36a62f6cb23b57" 1578 | integrity sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw== 1579 | dependencies: 1580 | core-util-is "~1.0.0" 1581 | inherits "~2.0.3" 1582 | isarray "~1.0.0" 1583 | process-nextick-args "~2.0.0" 1584 | safe-buffer "~5.1.1" 1585 | string_decoder "~1.1.1" 1586 | util-deprecate "~1.0.1" 1587 | 1588 | readdirp@~3.2.0: 1589 | version "3.2.0" 1590 | resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.2.0.tgz#c30c33352b12c96dfb4b895421a49fd5a9593839" 1591 | integrity sha512-crk4Qu3pmXwgxdSgGhgA/eXiJAPQiX4GMOZZMXnqKxHX7TaoL+3gQVo/WeuAiogr07DpnfjIMpXXa+PAIvwPGQ== 1592 | dependencies: 1593 | picomatch "^2.0.4" 1594 | 1595 | release-zalgo@^1.0.0: 1596 | version "1.0.0" 1597 | resolved "https://registry.yarnpkg.com/release-zalgo/-/release-zalgo-1.0.0.tgz#09700b7e5074329739330e535c5a90fb67851730" 1598 | integrity sha1-CXALflB0Mpc5Mw5TXFqQ+2eFFzA= 1599 | dependencies: 1600 | es6-error "^4.0.1" 1601 | 1602 | require-directory@^2.1.1: 1603 | version "2.1.1" 1604 | resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" 1605 | integrity sha1-jGStX9MNqxyXbiNE/+f3kqam30I= 1606 | 1607 | require-main-filename@^2.0.0: 1608 | version "2.0.0" 1609 | resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-2.0.0.tgz#d0b329ecc7cc0f61649f62215be69af54aa8989b" 1610 | integrity sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg== 1611 | 1612 | resolve-from@^5.0.0: 1613 | version "5.0.0" 1614 | resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-5.0.0.tgz#c35225843df8f776df21c57557bc087e9dfdfc69" 1615 | integrity sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw== 1616 | 1617 | resolve@^1.3.2: 1618 | version "1.15.1" 1619 | resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.15.1.tgz#27bdcdeffeaf2d6244b95bb0f9f4b4653451f3e8" 1620 | integrity sha512-84oo6ZTtoTUpjgNEr5SJyzQhzL72gaRodsSfyxC/AXRvwu0Yse9H8eF9IpGo7b8YetZhlI6v7ZQ6bKBFV/6S7w== 1621 | dependencies: 1622 | path-parse "^1.0.6" 1623 | 1624 | rimraf@^3.0.0: 1625 | version "3.0.2" 1626 | resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a" 1627 | integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA== 1628 | dependencies: 1629 | glob "^7.1.3" 1630 | 1631 | safe-buffer@5.1.2, safe-buffer@~5.1.0, safe-buffer@~5.1.1: 1632 | version "5.1.2" 1633 | resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" 1634 | integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== 1635 | 1636 | safe-buffer@^5.0.1: 1637 | version "5.2.0" 1638 | resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.0.tgz#b74daec49b1148f88c64b68d49b1e815c1f2f519" 1639 | integrity sha512-fZEwUGbVl7kouZs1jCdMLdt95hdIv0ZeHg6L7qPeciMZhZ+/gdesW4wgTARkrFWEpspjEATAzUGPG8N2jJiwbg== 1640 | 1641 | semver@^5.4.1, semver@^5.7.0: 1642 | version "5.7.1" 1643 | resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7" 1644 | integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== 1645 | 1646 | semver@^6.0.0, semver@^6.3.0: 1647 | version "6.3.0" 1648 | resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" 1649 | integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== 1650 | 1651 | semver@^7.3.8: 1652 | version "7.3.8" 1653 | resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.8.tgz#07a78feafb3f7b32347d725e33de7e2a2df67798" 1654 | integrity sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A== 1655 | dependencies: 1656 | lru-cache "^6.0.0" 1657 | 1658 | set-blocking@^2.0.0: 1659 | version "2.0.0" 1660 | resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" 1661 | integrity sha1-BF+XgtARrppoA93TgrJDkrPYkPc= 1662 | 1663 | setprototypeof@1.1.1: 1664 | version "1.1.1" 1665 | resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.1.1.tgz#7e95acb24aa92f5885e0abef5ba131330d4ae683" 1666 | integrity sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw== 1667 | 1668 | shebang-command@^2.0.0: 1669 | version "2.0.0" 1670 | resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea" 1671 | integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA== 1672 | dependencies: 1673 | shebang-regex "^3.0.0" 1674 | 1675 | shebang-regex@^3.0.0: 1676 | version "3.0.0" 1677 | resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" 1678 | integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== 1679 | 1680 | side-channel@^1.0.4: 1681 | version "1.0.4" 1682 | resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.0.4.tgz#efce5c8fdc104ee751b25c58d4290011fa5ea2cf" 1683 | integrity sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw== 1684 | dependencies: 1685 | call-bind "^1.0.0" 1686 | get-intrinsic "^1.0.2" 1687 | object-inspect "^1.9.0" 1688 | 1689 | signal-exit@^3.0.2: 1690 | version "3.0.3" 1691 | resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.3.tgz#a1410c2edd8f077b08b4e253c8eacfcaf057461c" 1692 | integrity sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA== 1693 | 1694 | source-map@^0.5.0: 1695 | version "0.5.7" 1696 | resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" 1697 | integrity sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w= 1698 | 1699 | source-map@^0.6.1: 1700 | version "0.6.1" 1701 | resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" 1702 | integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== 1703 | 1704 | spawn-wrap@^2.0.0: 1705 | version "2.0.0" 1706 | resolved "https://registry.yarnpkg.com/spawn-wrap/-/spawn-wrap-2.0.0.tgz#103685b8b8f9b79771318827aa78650a610d457e" 1707 | integrity sha512-EeajNjfN9zMnULLwhZZQU3GWBoFNkbngTUPfaawT4RkMiviTxcX0qfhVbGey39mfctfDHkWtuecgQ8NJcyQWHg== 1708 | dependencies: 1709 | foreground-child "^2.0.0" 1710 | is-windows "^1.0.2" 1711 | make-dir "^3.0.0" 1712 | rimraf "^3.0.0" 1713 | signal-exit "^3.0.2" 1714 | which "^2.0.1" 1715 | 1716 | sprintf-js@~1.0.2: 1717 | version "1.0.3" 1718 | resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" 1719 | integrity sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw= 1720 | 1721 | "statuses@>= 1.5.0 < 2", statuses@^1.5.0: 1722 | version "1.5.0" 1723 | resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.5.0.tgz#161c7dac177659fd9811f43771fa99381478628c" 1724 | integrity sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow= 1725 | 1726 | "string-width@^1.0.2 || 2": 1727 | version "2.1.1" 1728 | resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.1.1.tgz#ab93f27a8dc13d28cac815c462143a6d9012ae9e" 1729 | integrity sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw== 1730 | dependencies: 1731 | is-fullwidth-code-point "^2.0.0" 1732 | strip-ansi "^4.0.0" 1733 | 1734 | string-width@^3.0.0, string-width@^3.1.0: 1735 | version "3.1.0" 1736 | resolved "https://registry.yarnpkg.com/string-width/-/string-width-3.1.0.tgz#22767be21b62af1081574306f69ac51b62203961" 1737 | integrity sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w== 1738 | dependencies: 1739 | emoji-regex "^7.0.1" 1740 | is-fullwidth-code-point "^2.0.0" 1741 | strip-ansi "^5.1.0" 1742 | 1743 | string-width@^4.1.0, string-width@^4.2.0: 1744 | version "4.2.0" 1745 | resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.0.tgz#952182c46cc7b2c313d1596e623992bd163b72b5" 1746 | integrity sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg== 1747 | dependencies: 1748 | emoji-regex "^8.0.0" 1749 | is-fullwidth-code-point "^3.0.0" 1750 | strip-ansi "^6.0.0" 1751 | 1752 | string.prototype.trimend@^1.0.0: 1753 | version "1.0.1" 1754 | resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.1.tgz#85812a6b847ac002270f5808146064c995fb6913" 1755 | integrity sha512-LRPxFUaTtpqYsTeNKaFOw3R4bxIzWOnbQ837QfBylo8jIxtcbK/A/sMV7Q+OAV/vWo+7s25pOE10KYSjaSO06g== 1756 | dependencies: 1757 | define-properties "^1.1.3" 1758 | es-abstract "^1.17.5" 1759 | 1760 | string.prototype.trimleft@^2.1.1: 1761 | version "2.1.2" 1762 | resolved "https://registry.yarnpkg.com/string.prototype.trimleft/-/string.prototype.trimleft-2.1.2.tgz#4408aa2e5d6ddd0c9a80739b087fbc067c03b3cc" 1763 | integrity sha512-gCA0tza1JBvqr3bfAIFJGqfdRTyPae82+KTnm3coDXkZN9wnuW3HjGgN386D7hfv5CHQYCI022/rJPVlqXyHSw== 1764 | dependencies: 1765 | define-properties "^1.1.3" 1766 | es-abstract "^1.17.5" 1767 | string.prototype.trimstart "^1.0.0" 1768 | 1769 | string.prototype.trimright@^2.1.1: 1770 | version "2.1.2" 1771 | resolved "https://registry.yarnpkg.com/string.prototype.trimright/-/string.prototype.trimright-2.1.2.tgz#c76f1cef30f21bbad8afeb8db1511496cfb0f2a3" 1772 | integrity sha512-ZNRQ7sY3KroTaYjRS6EbNiiHrOkjihL9aQE/8gfQ4DtAC/aEBRHFJa44OmoWxGGqXuJlfKkZW4WcXErGr+9ZFg== 1773 | dependencies: 1774 | define-properties "^1.1.3" 1775 | es-abstract "^1.17.5" 1776 | string.prototype.trimend "^1.0.0" 1777 | 1778 | string.prototype.trimstart@^1.0.0: 1779 | version "1.0.1" 1780 | resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.1.tgz#14af6d9f34b053f7cfc89b72f8f2ee14b9039a54" 1781 | integrity sha512-XxZn+QpvrBI1FOcg6dIpxUPgWCPuNXvMD72aaRaUQv1eD4e/Qy8i/hFTe0BUmD60p/QA6bh1avmuPTfNjqVWRw== 1782 | dependencies: 1783 | define-properties "^1.1.3" 1784 | es-abstract "^1.17.5" 1785 | 1786 | string_decoder@~1.1.1: 1787 | version "1.1.1" 1788 | resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8" 1789 | integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg== 1790 | dependencies: 1791 | safe-buffer "~5.1.0" 1792 | 1793 | strip-ansi@^4.0.0: 1794 | version "4.0.0" 1795 | resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-4.0.0.tgz#a8479022eb1ac368a871389b635262c505ee368f" 1796 | integrity sha1-qEeQIusaw2iocTibY1JixQXuNo8= 1797 | dependencies: 1798 | ansi-regex "^3.0.0" 1799 | 1800 | strip-ansi@^5.0.0, strip-ansi@^5.1.0, strip-ansi@^5.2.0: 1801 | version "5.2.0" 1802 | resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-5.2.0.tgz#8c9a536feb6afc962bdfa5b104a5091c1ad9c0ae" 1803 | integrity sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA== 1804 | dependencies: 1805 | ansi-regex "^4.1.0" 1806 | 1807 | strip-ansi@^6.0.0: 1808 | version "6.0.0" 1809 | resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.0.tgz#0b1571dd7669ccd4f3e06e14ef1eed26225ae532" 1810 | integrity sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w== 1811 | dependencies: 1812 | ansi-regex "^5.0.0" 1813 | 1814 | strip-bom@^4.0.0: 1815 | version "4.0.0" 1816 | resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-4.0.0.tgz#9c3505c1db45bcedca3d9cf7a16f5c5aa3901878" 1817 | integrity sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w== 1818 | 1819 | strip-json-comments@2.0.1: 1820 | version "2.0.1" 1821 | resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" 1822 | integrity sha1-PFMZQukIwml8DsNEhYwobHygpgo= 1823 | 1824 | superagent@^3.8.3: 1825 | version "3.8.3" 1826 | resolved "https://registry.yarnpkg.com/superagent/-/superagent-3.8.3.tgz#460ea0dbdb7d5b11bc4f78deba565f86a178e128" 1827 | integrity sha512-GLQtLMCoEIK4eDv6OGtkOoSMt3D+oq0y3dsxMuYuDvaNUvuT8eFBuLmfR0iYYzHC1e8hpzC6ZsxbuP6DIalMFA== 1828 | dependencies: 1829 | component-emitter "^1.2.0" 1830 | cookiejar "^2.1.0" 1831 | debug "^3.1.0" 1832 | extend "^3.0.0" 1833 | form-data "^2.3.1" 1834 | formidable "^1.2.0" 1835 | methods "^1.1.1" 1836 | mime "^1.4.1" 1837 | qs "^6.5.1" 1838 | readable-stream "^2.3.5" 1839 | 1840 | supertest@^4.0.2: 1841 | version "4.0.2" 1842 | resolved "https://registry.yarnpkg.com/supertest/-/supertest-4.0.2.tgz#c2234dbdd6dc79b6f15b99c8d6577b90e4ce3f36" 1843 | integrity sha512-1BAbvrOZsGA3YTCWqbmh14L0YEq0EGICX/nBnfkfVJn7SrxQV1I3pMYjSzG9y/7ZU2V9dWqyqk2POwxlb09duQ== 1844 | dependencies: 1845 | methods "^1.1.2" 1846 | superagent "^3.8.3" 1847 | 1848 | supports-color@6.0.0: 1849 | version "6.0.0" 1850 | resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-6.0.0.tgz#76cfe742cf1f41bb9b1c29ad03068c05b4c0e40a" 1851 | integrity sha512-on9Kwidc1IUQo+bQdhi8+Tijpo0e1SS6RoGo2guUwn5vdaxw8RXOF9Vb2ws+ihWOmh4JnCJOvaziZWP1VABaLg== 1852 | dependencies: 1853 | has-flag "^3.0.0" 1854 | 1855 | supports-color@^5.3.0: 1856 | version "5.5.0" 1857 | resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" 1858 | integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== 1859 | dependencies: 1860 | has-flag "^3.0.0" 1861 | 1862 | supports-color@^7.1.0: 1863 | version "7.1.0" 1864 | resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.1.0.tgz#68e32591df73e25ad1c4b49108a2ec507962bfd1" 1865 | integrity sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g== 1866 | dependencies: 1867 | has-flag "^4.0.0" 1868 | 1869 | test-exclude@^6.0.0: 1870 | version "6.0.0" 1871 | resolved "https://registry.yarnpkg.com/test-exclude/-/test-exclude-6.0.0.tgz#04a8698661d805ea6fa293b6cb9e63ac044ef15e" 1872 | integrity sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w== 1873 | dependencies: 1874 | "@istanbuljs/schema" "^0.1.2" 1875 | glob "^7.1.4" 1876 | minimatch "^3.0.4" 1877 | 1878 | to-fast-properties@^2.0.0: 1879 | version "2.0.0" 1880 | resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz#dc5e698cbd079265bc73e0377681a4e4e83f616e" 1881 | integrity sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4= 1882 | 1883 | to-regex-range@^5.0.1: 1884 | version "5.0.1" 1885 | resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" 1886 | integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== 1887 | dependencies: 1888 | is-number "^7.0.0" 1889 | 1890 | toidentifier@1.0.0: 1891 | version "1.0.0" 1892 | resolved "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.0.tgz#7e1be3470f1e77948bc43d94a3c8f4d7752ba553" 1893 | integrity sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw== 1894 | 1895 | tsscmp@1.0.6: 1896 | version "1.0.6" 1897 | resolved "https://registry.yarnpkg.com/tsscmp/-/tsscmp-1.0.6.tgz#85b99583ac3589ec4bfef825b5000aa911d605eb" 1898 | integrity sha512-LxhtAkPDTkVCMQjt2h6eBVY28KCjikZqZfMcC15YBeNjkgUpdCfBu5HoiOTDu86v6smE8yOjyEktJ8hlbANHQA== 1899 | 1900 | type-detect@^4.0.0, type-detect@^4.0.5: 1901 | version "4.0.8" 1902 | resolved "https://registry.yarnpkg.com/type-detect/-/type-detect-4.0.8.tgz#7646fb5f18871cfbb7749e69bd39a6388eb7450c" 1903 | integrity sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g== 1904 | 1905 | type-fest@^0.3.0: 1906 | version "0.3.1" 1907 | resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.3.1.tgz#63d00d204e059474fe5e1b7c011112bbd1dc29e1" 1908 | integrity sha512-cUGJnCdr4STbePCgqNFbpVNCepa+kAVohJs1sLhxzdH+gnEoOd8VhbYa7pD3zZYGiURWM2xzEII3fQcRizDkYQ== 1909 | 1910 | type-fest@^0.8.0: 1911 | version "0.8.1" 1912 | resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.8.1.tgz#09e249ebde851d3b1e48d27c105444667f17b83d" 1913 | integrity sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA== 1914 | 1915 | type-is@^1.6.16: 1916 | version "1.6.18" 1917 | resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.18.tgz#4e552cd05df09467dcbc4ef739de89f2cf37c131" 1918 | integrity sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g== 1919 | dependencies: 1920 | media-typer "0.3.0" 1921 | mime-types "~2.1.24" 1922 | 1923 | typedarray-to-buffer@^3.1.5: 1924 | version "3.1.5" 1925 | resolved "https://registry.yarnpkg.com/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz#a97ee7a9ff42691b9f783ff1bc5112fe3fca9080" 1926 | integrity sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q== 1927 | dependencies: 1928 | is-typedarray "^1.0.0" 1929 | 1930 | util-deprecate@~1.0.1: 1931 | version "1.0.2" 1932 | resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" 1933 | integrity sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8= 1934 | 1935 | uuid@^3.3.3: 1936 | version "3.4.0" 1937 | resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.4.0.tgz#b23e4358afa8a202fe7a100af1f5f883f02007ee" 1938 | integrity sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A== 1939 | 1940 | vary@^1.1.2: 1941 | version "1.1.2" 1942 | resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc" 1943 | integrity sha1-IpnwLG3tMNSllhsLn3RSShj2NPw= 1944 | 1945 | which-module@^2.0.0: 1946 | version "2.0.0" 1947 | resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.0.tgz#d9ef07dce77b9902b8a3a8fa4b31c3e3f7e6e87a" 1948 | integrity sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho= 1949 | 1950 | which@1.3.1: 1951 | version "1.3.1" 1952 | resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" 1953 | integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ== 1954 | dependencies: 1955 | isexe "^2.0.0" 1956 | 1957 | which@^2.0.1: 1958 | version "2.0.2" 1959 | resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" 1960 | integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== 1961 | dependencies: 1962 | isexe "^2.0.0" 1963 | 1964 | wide-align@1.1.3: 1965 | version "1.1.3" 1966 | resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.3.tgz#ae074e6bdc0c14a431e804e624549c633b000457" 1967 | integrity sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA== 1968 | dependencies: 1969 | string-width "^1.0.2 || 2" 1970 | 1971 | wrap-ansi@^5.1.0: 1972 | version "5.1.0" 1973 | resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-5.1.0.tgz#1fd1f67235d5b6d0fee781056001bfb694c03b09" 1974 | integrity sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q== 1975 | dependencies: 1976 | ansi-styles "^3.2.0" 1977 | string-width "^3.0.0" 1978 | strip-ansi "^5.0.0" 1979 | 1980 | wrap-ansi@^6.2.0: 1981 | version "6.2.0" 1982 | resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-6.2.0.tgz#e9393ba07102e6c91a3b221478f0257cd2856e53" 1983 | integrity sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA== 1984 | dependencies: 1985 | ansi-styles "^4.0.0" 1986 | string-width "^4.1.0" 1987 | strip-ansi "^6.0.0" 1988 | 1989 | wrappy@1: 1990 | version "1.0.2" 1991 | resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" 1992 | integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8= 1993 | 1994 | write-file-atomic@^3.0.0: 1995 | version "3.0.3" 1996 | resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-3.0.3.tgz#56bd5c5a5c70481cd19c571bd39ab965a5de56e8" 1997 | integrity sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q== 1998 | dependencies: 1999 | imurmurhash "^0.1.4" 2000 | is-typedarray "^1.0.0" 2001 | signal-exit "^3.0.2" 2002 | typedarray-to-buffer "^3.1.5" 2003 | 2004 | y18n@^4.0.0: 2005 | version "4.0.1" 2006 | resolved "https://registry.yarnpkg.com/y18n/-/y18n-4.0.1.tgz#8db2b83c31c5d75099bb890b23f3094891e247d4" 2007 | integrity sha512-wNcy4NvjMYL8gogWWYAO7ZFWFfHcbdbE57tZO8e4cbpj8tfUcwrwqSl3ad8HxpYWCdXcJUCeKKZS62Av1affwQ== 2008 | 2009 | yallist@^4.0.0: 2010 | version "4.0.0" 2011 | resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72" 2012 | integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== 2013 | 2014 | yargs-parser@13.1.2, yargs-parser@^13.1.2: 2015 | version "13.1.2" 2016 | resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-13.1.2.tgz#130f09702ebaeef2650d54ce6e3e5706f7a4fb38" 2017 | integrity sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg== 2018 | dependencies: 2019 | camelcase "^5.0.0" 2020 | decamelize "^1.2.0" 2021 | 2022 | yargs-parser@^18.1.1: 2023 | version "18.1.2" 2024 | resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-18.1.2.tgz#2f482bea2136dbde0861683abea7756d30b504f1" 2025 | integrity sha512-hlIPNR3IzC1YuL1c2UwwDKpXlNFBqD1Fswwh1khz5+d8Cq/8yc/Mn0i+rQXduu8hcrFKvO7Eryk+09NecTQAAQ== 2026 | dependencies: 2027 | camelcase "^5.0.0" 2028 | decamelize "^1.2.0" 2029 | 2030 | yargs-unparser@1.6.0: 2031 | version "1.6.0" 2032 | resolved "https://registry.yarnpkg.com/yargs-unparser/-/yargs-unparser-1.6.0.tgz#ef25c2c769ff6bd09e4b0f9d7c605fb27846ea9f" 2033 | integrity sha512-W9tKgmSn0DpSatfri0nx52Joq5hVXgeLiqR/5G0sZNDoLZFOr/xjBUDcShCOGNsBnEMNo1KAMBkTej1Hm62HTw== 2034 | dependencies: 2035 | flat "^4.1.0" 2036 | lodash "^4.17.15" 2037 | yargs "^13.3.0" 2038 | 2039 | yargs@13.3.2, yargs@^13.3.0: 2040 | version "13.3.2" 2041 | resolved "https://registry.yarnpkg.com/yargs/-/yargs-13.3.2.tgz#ad7ffefec1aa59565ac915f82dccb38a9c31a2dd" 2042 | integrity sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw== 2043 | dependencies: 2044 | cliui "^5.0.0" 2045 | find-up "^3.0.0" 2046 | get-caller-file "^2.0.1" 2047 | require-directory "^2.1.1" 2048 | require-main-filename "^2.0.0" 2049 | set-blocking "^2.0.0" 2050 | string-width "^3.0.0" 2051 | which-module "^2.0.0" 2052 | y18n "^4.0.0" 2053 | yargs-parser "^13.1.2" 2054 | 2055 | yargs@^15.0.2: 2056 | version "15.3.1" 2057 | resolved "https://registry.yarnpkg.com/yargs/-/yargs-15.3.1.tgz#9505b472763963e54afe60148ad27a330818e98b" 2058 | integrity sha512-92O1HWEjw27sBfgmXiixJWT5hRBp2eobqXicLtPBIDBhYB+1HpwZlXmbW2luivBJHBzki+7VyCLRtAkScbTBQA== 2059 | dependencies: 2060 | cliui "^6.0.0" 2061 | decamelize "^1.2.0" 2062 | find-up "^4.1.0" 2063 | get-caller-file "^2.0.1" 2064 | require-directory "^2.1.1" 2065 | require-main-filename "^2.0.0" 2066 | set-blocking "^2.0.0" 2067 | string-width "^4.2.0" 2068 | which-module "^2.0.0" 2069 | y18n "^4.0.0" 2070 | yargs-parser "^18.1.1" 2071 | 2072 | ylru@^1.2.0: 2073 | version "1.2.1" 2074 | resolved "https://registry.yarnpkg.com/ylru/-/ylru-1.2.1.tgz#f576b63341547989c1de7ba288760923b27fe84f" 2075 | integrity sha512-faQrqNMzcPCHGVC2aaOINk13K+aaBDUPjGWl0teOXywElLjyVAB6Oe2jj62jHYtwsU49jXhScYbvPENK+6zAvQ== 2076 | --------------------------------------------------------------------------------