pax_global_header00006660000000000000000000000064141720417330014514gustar00rootroot0000000000000052 comment=6a101c27ba18e9e8820c31f083e82e6de2c5fae6 superagent-7.1.1/000077500000000000000000000000001417204173300136775ustar00rootroot00000000000000superagent-7.1.1/.browserslistrc000066400000000000000000000000661417204173300167710ustar00rootroot00000000000000# Browsers that we support > 1% last 2 versions ie 9 superagent-7.1.1/.dist.babelrc000066400000000000000000000002671417204173300162410ustar00rootroot00000000000000{ "presets": [ ["@babel/env", { "targets": { "browsers": [ "> 1%", "last 2 versions", "ie 9" ] } }] ], "sourceMaps": "inline", "comments": false } superagent-7.1.1/.dist.eslintrc000066400000000000000000000020471417204173300164700ustar00rootroot00000000000000{ "extends": ["eslint:recommended"], "env": { "node": false, "browser": true, "amd": true, "es6": true }, "plugins": ["compat"], "rules": { "compat/compat": "error", "no-console": "off", "no-empty": "off", "no-extra-semi": "off", "no-func-assign": "off", "no-undef": "off", "no-unused-vars": "off", "no-useless-escape": "off", "no-cond-assign": "off", "no-redeclare": "off", "node/no-exports-assign": "off", "no-unsafe-finally": "off", "complexity": ["error", 10000], "max-statements": "off", "no-constant-condition": "off", "no-control-regex": "off", "no-fallthrough": "off", "operator-linebreak": "off" }, "globals": { "regeneratorRuntime": "writable" }, "settings": { "polyfills": [ "Promise", "Array.from", "Symbol", "Object.getOwnPropertySymbols", "Object.setPrototypeOf", "Set", "Math.trunc", "BigInt", "Map", "Reflect", "WeakMap", "WeakRef", "WeakSet" ] } } superagent-7.1.1/.editorconfig000066400000000000000000000002231417204173300163510ustar00rootroot00000000000000root = true [*] indent_style = space indent_size = 2 end_of_line = lf charset = utf-8 trim_trailing_whitespace = true insert_final_newline = true superagent-7.1.1/.gitattributes000066400000000000000000000000141417204173300165650ustar00rootroot00000000000000* text=auto superagent-7.1.1/.github/000077500000000000000000000000001417204173300152375ustar00rootroot00000000000000superagent-7.1.1/.github/FUNDING.yml000066400000000000000000000001321417204173300170500ustar00rootroot00000000000000# These are supported funding model platforms github: niftylettuce patreon: niftylettuce superagent-7.1.1/.gitignore000066400000000000000000000002711417204173300156670ustar00rootroot00000000000000build lib-cov coverage.html .DS_Store node_modules *.sock test.js components test/node/fixtures/tmp.json .idea superagent.js package-lock.json *.log coverage .nyc_output lib dist *.swp superagent-7.1.1/.husky/000077500000000000000000000000001417204173300151205ustar00rootroot00000000000000superagent-7.1.1/.husky/commit-msg000077500000000000000000000001201417204173300171130ustar00rootroot00000000000000#!/bin/sh . "$(dirname "$0")/_/husky.sh" npx --no-install commitlint --edit $1 superagent-7.1.1/.husky/pre-commit000077500000000000000000000001351417204173300171210ustar00rootroot00000000000000#!/bin/sh . "$(dirname "$0")/_/husky.sh" # enable next line when tests are fixed # npm test superagent-7.1.1/.lib.babelrc000066400000000000000000000002731417204173300160410ustar00rootroot00000000000000{ "presets": [ ["@babel/env", { "targets": { "node": "6.4.0", "browsers": [ "> 1%", "last 2 versions", "ie 9" ] } }] ], "sourceMaps": "inline" } superagent-7.1.1/.lib.eslintrc000066400000000000000000000012131417204173300162650ustar00rootroot00000000000000{ "extends": ["eslint:recommended", "plugin:node/recommended"], "env": { "browser": true }, "rules": { "node/no-deprecated-api": "off", "no-console": "off", "no-unused-vars": "off", "no-empty": "off", "node/no-unsupported-features/node-builtins": "off", "no-func-assign": "off", "no-global-assign": ["error", {"exceptions": ["exports"]}], "no-fallthrough": "off", "no-constant-condition": "off", "node/no-exports-assign": "off", "no-unsafe-finally": "off" }, "overrides": [ { "files": [ "lib/client.js" ], "globals": { "ActiveXObject": "readable" } } ] } superagent-7.1.1/.remarkignore000066400000000000000000000000401417204173300163570ustar00rootroot00000000000000CONTRIBUTING.md HISTORY.md docs superagent-7.1.1/.travis.yml000066400000000000000000000005171417204173300160130ustar00rootroot00000000000000sudo: false language: node_js node_js: - '16' - '14' - '12' after_success: npm run coverage env: global: - SAUCE_USERNAME='shtylman-superagent' - SAUCE_ACCESS_KEY='39a45464-cb1d-4b8d-aa1f-83c7c04fa673' matrix: include: - node_js: "10" env: BROWSER=1 include: - node_js: "12" env: HTTP2_TEST=1 superagent-7.1.1/.zuul.yml000066400000000000000000000005041417204173300154760ustar00rootroot00000000000000ui: mocha-bdd server: ./test/support/server.js tunnel_host: http://focusaurus.com browsers: - name: chrome version: latest - name: firefox version: latest - name: safari version: latest - name: ie version: 9..latest browserify: - transform: name: babelify configFile: './.dist.babelrc' superagent-7.1.1/CONTRIBUTING.md000066400000000000000000000005461417204173300161350ustar00rootroot00000000000000When submitting a PR, your chance of acceptance increases if you do the following: * Code style is consistent with existing in the file. * Tests are passing (client and server). * You add a test for the failing issue you are fixing. * Code changes are focused on the area of discussion. * Do not rebuild the distribution files or increment version numbers. superagent-7.1.1/HISTORY.md000066400000000000000000000606051417204173300153710ustar00rootroot00000000000000# This HISTORY log is deprecated Please see [GitHub releases page](https://github.com/visionmedia/superagent/releases) for the current changelog. # 4.1.0 (2018-12-26) * `.connect()` IP/DNS override option (Kornel) * `.trustLocalhost()` option for allowing broken HTTPS on `localhost` * `.abort()` used with promises rejects the promise. # 4.0.0 (2018-11-17) ## Breaking changes * Node.js v4 has reached it's end of life, so we no longer support it. It's v6+ or later. We recommend Node.js 10. * We now use ES6 in the browser code, too. * If you're using Browserify or Webpack to package code for Internet Explorer, you will also have to use Babel. * The pre-built node_modules/superagent.js is still ES5-compatible. * `.end(…)` returns `undefined` instead of the request. If you need the request object after calling `.end()` (and you probably don't), save it in a variable and call `request.end(…)`. Consider not using `.end()` at all, and migrating to promises by calling `.then()` instead. * In Node, responses with unknown MIME type are buffered by default. To get old behavior, if you use custom _unbuffered_ parsers, add `.buffer(false)` to requests or set `superagent.buffer[yourMimeType] = false`. * Invalid uses of `.pipe()` throw. ## Minor changes * Throw if `req.abort().end()` is called * Throw if using unsupported mix of send and field * Reject `.end()` promise on all error events (Kornel Lesiński) * Set `https.servername` from the `Host` header (Kornel Lesiński) * Leave backticks unencoded in query strings where possible (Ethan Resnick) * Update node-mime to 2.x (Alexey Kucherenko) * Allow default buffer settings based on response-type (shrey) * `response.buffered` is more accurate. # 3.8.3 (2018-04-29) * Add flags for 201 & 422 responses (Nikhil Fadnis) * Emit progress event while uploading Node `Buffer` via send method (Sergey Akhalkov) * Fixed setting correct cookies for redirects (Damien Clark) * Replace .catch with ['catch'] for IE9 Support (Miguel Stevens) # 3.8.2 (2017-12-09) * Fixed handling of exceptions thrown from callbacks * Stricter matching of `+json` MIME types. # 3.8.1 (2017-11-08) * Clear authorization header on cross-domain redirect # 3.8.0 * Added support for "globally" defined headers and event handlers via `superagent.agent()`. It now remembers default settings for all its requests. * Added optional callback to `.retry()` (Alexander Murphy) * Unified auth args handling in node/browser (Edmundo Alvarez) * Fixed error handling in zlib pipes (Kornel) * Documented that 3xx status codes are errors (Mickey Reiss) # 3.7.0 (2017-10-17) * Limit maximum response size. Prevents zip bombs (Kornel) * Catch and pass along errors in `.ok()` callback (Jeremy Ruppel) * Fixed parsing of XHR headers without a newline (nsf) # 3.6.2 (2017-10-02) * Upgrade MIME type dependency to a newer, secure version * Recognize PDF MIME as binary * Fix for error in subsequent require() calls (Steven de Salas) # 3.6.0 (2017-08-20) * Support disabling TCP_NODELAY option ([#1240](https://github.com/visionmedia/superagent/issues/1240)) (xiamengyu) * Send payload in query string for GET and HEAD shorthand API (Peter Lyons) * Support passphrase with pfx certificate (Paul Westerdale (ABRS Limited)) * Documentation improvements (Peter Lyons) * Fixed duplicated query string params ([#1200](https://github.com/visionmedia/superagent/issues/1200)) (Kornel) # 3.5.1 (2017-03-18) * Allow crossDomain errors to be retried ([#1194](https://github.com/visionmedia/superagent/issues/1194)) (Michael Olson) * Read responseType property from the correct object (Julien Dupouy) * Check for ownProperty before adding header (Lucas Vieira) # 3.5.0 (2017-02-23) * Add errno to distinguish between request timeout and body download timeout ([#1184](https://github.com/visionmedia/superagent/issues/1184)) (Kornel Lesiński) * Warn about bogus timeout options ([#1185](https://github.com/visionmedia/superagent/issues/1185)) (Kornel Lesiński) # 3.4.4 (2017-02-17) * Treat videos like images (Kornel Lesiński) * Avoid renaming module (Kornel Lesiński) # 3.4.3 (2017-02-14) * Fixed being able to define own parsers when their mime type starts with `text/` (Damien Clark) * `withCredentials(false)` (Andy Woods) * Use `formData.on` instead of `.once` (Kornel Lesiński) * Ignore `attach("file",null)` (Kornel Lesiński) # 3.4.1 (2017-01-29) * Allow `retry()` and `retry(0)` (Alexander Pope) * Allow optional body/data in DELETE requests (Alpha Shuro) * Fixed query string on retried requests (Kornel Lesiński) # 3.4.0 (2017-01-25) * New `.retry(n)` method and `err.retries` (Alexander Pope) * Docs for HTTPS request (Jun Wan Goh) # 3.3.1 (2016-12-17) * Fixed "double callback bug" warning on timeouts of gzipped responses # 3.3.0 (2016-12-14) * Added `.ok(callback)` that allows customizing which responses are errors (Kornel Lesiński) * Added `.responseType()` to Node version (Kornel Lesiński) * Added `.parse()` to browser version (jakepearson) * Fixed parse error when using `responseType('blob')` (Kornel Lesiński) # 3.2.0 (2016-12-11) * Added `.timeout({response:ms})`, which allows limiting maximum response time independently from total download time (Kornel Lesiński) * Added warnings when `.end()` is called more than once (Kornel Lesiński) * Added `response.links` to browser version (Lukas Eipert) * `btoa` is no longer required in IE9 (Kornel Lesiński) * Fixed `.sortQuery()` on URLs without query strings (Kornel Lesiński) * Refactored common response code into `ResponseBase` (Lukas Eipert) # 3.1.0 (2016-11-28) * Added `.sortQuery()` (vicanso) * Added support for arrays and bools in `.field()` (Kornel Lesiński) * Made `superagent.Request` subclassable without need to patch all static methods (Kornel Lesiński) # 3.0.0 (2016-11-19) * Dropped support for Node 0.x. Please upgrade to at least Node 4. * Dropped support for componentjs (Damien Caselli) * Removed deprecated `.part()`/`superagent.Part` APIs. * Removed unreliable `.body` property on internal response object used by unbuffered parsers. Note: the normal `response.body` is unaffected. * Multiple `.send()` calls mixing `Buffer`/`Blob` and JSON data are not possible and will now throw instead of messing up the data. * Improved `.send()` data object type check (Fernando Mendes) * Added common prototype for Node and browser versions (Andreas Helmberger) * Added `http+unix:` schema to support Unix sockets (Yuki KAN) * Added full `attach` options parameter in the Node version (Lapo Luchini) * Added `pfx` TLS option with new `pfx()` method. (Reid Burke) * Internally changed `.on` to `.once` to prevent possible memory leaks (Matt Blair) * Made all errors reported as an event (Kornel Lesiński) # 2.3.0 (2016-09-20) * Enabled `.field()` to handle objects (Affan Shahid) * Added authentication with client certificates (terusus) * Added `.catch()` for more Promise-like interface (Maxim Samoilov, Kornel Lesiński) * Silenced errors from incomplete gzip streams for compatibility with web browsers (Kornel Lesiński) * Fixed `event.direction` in uploads (Kornel Lesiński) * Fixed returned value of overwritten response object's `on()` method (Juan Dopazo) # 2.2.0 (2016-08-13) * Added `timedout` property to node Request instance (Alexander Pope) * Unified `null` querystring values in node and browser environments. (George Chung) # 2.1.0 (2016-06-14) * Refactored async parsers. Now the `end` callback waits for async parsers to finish (Kornel Lesiński) * Errors thrown in `.end()` callback don't cause the callback to be called twice (Kornel Lesiński) * Added `headers` to `toJSON()` (Tao) # 2.0.0 (2016-05-29) ## Breaking changes Breaking changes are in rarely used functionality, so we hope upgrade will be smooth for most users. * Browser: The `.parse()` method has been renamed to `.serialize()` for consistency with NodeJS version. * Browser: Query string keys without a value used to be parsed as `'undefined'`, now their value is `''` (empty string) (shura, Kornel Lesiński). * NodeJS: The `redirect` event is called after new query string and headers have been set and is allowed to override the request URL (Kornel Lesiński) * `.then()` returns a real `Promise`. Note that use of superagent with promises now requires a global `Promise` object. If you target Internet Explorer or Node 0.10, you'll need `require('es6-promise').polyfill()` or similar. * Upgraded all dependencies (Peter Lyons) * Renamed properties documented as `@api private` to have `_prefixed` names (Kornel Lesiński) ## Probably not breaking changes: * Extracted common functions to request-base (Peter Lyons) * Fixed race condition in pipe tests (Peter Lyons) * Handle `FormData` error events (scriptype) * Fixed wrong jsdoc of Request#attach (George Chung) * Updated and improved tests (Peter Lyons) * `request.head()` supports `.redirects(5)` call (Kornel Lesiński) * `response` event is also emitted when using `.pipe()` # 1.8.2 (2016-03-20) * Fixed handling of HTTP status 204 with content-encoding: gzip (Andrew Shelton) * Handling of FormData error events (scriptype) * Fixed parsing of `vnd+json` MIME types (Kornel Lesiński) * Aliased browser implementation of `.parse()` as `.serialize()` for forward compatibility # 1.8.1 (2016-03-14) * Fixed form-data incompatibility with IE9 # 1.8.0 (2016-03-09) * Extracted common code into request-base class (Peter Lyons) * It does not affect the public API, but please let us know if you notice any plugins/subclasses breaking! * Added option `{type:'auto'}` to `auth` method, which enables browser-native auth types (Jungle, Askar Yusupov) * Added `responseType()` to set XHR `responseType` (chris) * Switched to form-data for browserify-compatible `FormData` (Peter Lyons) * Added `statusCode` to error response when JSON response is malformed (mattdell) * Prevented TCP port conflicts in all tests (Peter Lyons) * Updated form-data dependency # 1.7.2 (2016-01-26) * Fix case-sensitivity of header fields introduced by [`a4ddd6a`](https://github.com/visionmedia/superagent/commit/a4ddd6a). (Edward J. Jinotti) * bump extend dependency, as former version did not contain any license information (Lukas Eipert) # 1.7.1 (2016-01-21) * Fixed a conflict with express when using npm 3.x (Glenn) * Fixed redirects after a multipart/form-data POST request (cyclist2) # 1.7.0 (2016-01-18) * When attaching files, read default filename from the `File` object (JD Isaacks) * Add `direction` property to `progress` events (Joseph Dykstra) * Update component-emitter & formidable (Kornel Lesiński) * Don't re-encode query string needlessly (Ruben Verborgh) * ensure querystring is appended when doing `stream.pipe(request)` (Keith Grennan) * change set header function, not call `this.request()` until call `this.end()` (vicanso) * Add no-op `withCredentials` to Node API (markdalgleish) * fix `delete` breaking on ie8 (kenjiokabe) * Don't let request error override responses (Clay Reimann) * Increased number of tests shared between node and client (Kornel Lesiński) # 1.6.0/1.6.1 (2015-12-09) * avoid misleading CORS error message * added 'progress' event on file/form upload in Node (Olivier Lalonde) * return raw response if the response parsing fails (Rei Colina) * parse content-types ending with `+json` as JSON (Eiryyy) * fix to avoid throwing errors on aborted requests (gjurgens) * retain cookies on redirect when hosts match (Tom Conroy) * added Bower manifest (Johnny Freeman) * upgrade to latest cookiejar (Andy Burke) # 1.5.0 (2015-11-30) * encode array values as `key=1&key=2&key=3` etc... (aalpern, Davis Kim) * avoid the error which is omitted from 'socket hang up' * faster JSON parsing, handling of zlib errors (jbellenger) * fix IE11 sends 'undefined' string if data was undefined (Vadim Goncharov) * alias `del()` method as `delete()` (Aaron Krause) * revert Request#parse since it was actually Response#parse # 1.4.0 (2015-09-14) * add Request#parse method to client library * add missing statusCode in client response * don't apply JSON heuristics if a valid parser is found * fix detection of root object for webworkers # 1.3.0 (2015-08-05) * fix incorrect content-length of data set to buffer * serialize request data takes into account charsets * add basic promise support via a `then` function # 1.2.0 (2015-04-13) * add progress events to downlodas * make usable in webworkers * add support for 308 redirects * update node-form-data dependency * update to work in react native * update node-mime dependency # 1.1.0 (2015-03-13) * Fix responseType checks without xhr2 and ie9 tests (rase-) * errors have .status and .response fields if applicable (defunctzombie) * fix end callback called before saving cookies (rase-) # 1.0.0 / 2015-03-08 * All non-200 responses are treated as errors now. (The callback is called with an error when the response has a status < 200 or >= 300 now. In previous versions this would not have raised an error and the client would have to check the `res` object. See [#283](https://github.com/visionmedia/superagent/issues/283). * keep timeouts intact across redirects (hopkinsth) * handle falsy json values (themaarten) * fire response events in browser version (Schoonology) * getXHR exported in client version (KidsKilla) * remove arity check on `.end()` callbacks (defunctzombie) * avoid setting content-type for host objects (rexxars) * don't index array strings in querystring (travisjeffery) * fix pipe() with redirects (cyrilis) * add xhr2 file download (vstirbu) * set default response type to text/plain if not specified (warrenseine) # 0.21.0 / 2014-11-11 * Trim text before parsing json (gjohnson) * Update tests to express 4 (gaastonsr) * Prevent double callback when error is thrown (pgn-vole) * Fix missing clearTimeout (nickdima) * Update debug (TooTallNate) # 0.20.0 / 2014-10-02 * Add toJSON() to request and response instances. (yields) * Prevent HEAD requests from getting parsed. (gjohnson) * Update debug. (TooTallNate) # 0.19.1 / 2014-09-24 * Fix basic auth issue when password is falsey value. (gjohnson) # 0.19.0 / 2014-09-24 * Add unset() to browser. (shesek) * Prefer XHR over ActiveX. (omeid) * Catch parse errors. (jacwright) * Update qs dependency. (wercker) * Add use() to node. (Financial-Times) * Add response text to errors. (yields) * Don't send empty cookie headers. (undoZen) * Don't parse empty response bodies. (DveMac) * Use hostname when setting cookie host. (prasunsultania) # 0.18.2 / 2014-07-12 * Handle parser errors. (kof) * Ensure not to use default parsers when there is a user defined one. (kof) # 0.18.1 / 2014-07-05 * Upgrade cookiejar dependency (juanpin) * Support image mime types (nebulade) * Make .agent chainable (kof) * Upgrade debug (TooTallNate) * Fix docs (aheckmann) # 0.18.0 / 2014-04-29 * Use "form-data" module for the multipart/form-data implementation. (TooTallNate) * Add basic `field()` and `attach()` functions for HTML5 FormData. (TooTallNate) * Deprecate `part()`. (TooTallNate) * Set default user-agent header. (bevacqua) * Add `unset()` method for removing headers. (bevacqua) * Update cookiejar. (missinglink) * Fix response error formatting. (shesek) # 0.17.0 / 2014-03-06 * supply uri malformed error to the callback (yields) * add request event (yields) * allow simple auth (yields) * add request event (yields) * switch to component/reduce (visionmedia) * fix part content-disposition (mscdex) * add browser testing via zuul (defunctzombie) * adds request.use() (johntron) # 0.16.0 / 2014-01-07 * remove support for 0.6 (superjoe30) * fix CORS withCredentials (wejendorp) * add "test" script (superjoe30) * add request .accept() method (nickl-) * add xml to mime types mappings (nickl-) * fix parse body error on HEAD requests (gjohnson) * fix documentation typos (matteofigus) * fix content-type + charset (bengourley) * fix null values on query parameters (cristiandouce) # 0.15.7 / 2013-10-19 * pin should.js to 1.3.0 due to breaking change in 2.0.x * fix browserify regression # 0.15.5 / 2013-10-09 * add browser field to support browserify * fix .field() value number support # 0.15.4 / 2013-07-09 * node: add a Request#agent() function to set the http Agent to use # 0.15.3 / 2013-07-05 * fix .pipe() unzipping on more recent nodes. Closes [#240](https://github.com/visionmedia/superagent/issues/240) * fix passing an empty object to .query() no longer appends "?" * fix formidable error handling * update formidable # 0.15.2 / 2013-07-02 * fix: emit 'end' when piping. # 0.15.1 / 2013-06-26 * add try/catch around parseLinks # 0.15.0 / 2013-06-25 * make `Response#toError()` have a more meaningful `message` # 0.14.9 / 2013-06-15 * add debug()s to the node client * add .abort() method to node client # 0.14.8 / 2013-06-13 * set .agent = false always * remove X-Requested-With. Closes [#189](https://github.com/visionmedia/superagent/issues/189) # 0.14.7 / 2013-06-06 * fix unzip error handling # 0.14.6 / 2013-05-23 * fix HEAD unzip bug # 0.14.5 / 2013-05-23 * add flag to ensure the callback is **never** invoked twice # 0.14.4 / 2013-05-22 * add superagent.js build output * update qs * update emitter-component * revert "add browser field to support browserify" see [GH-221](https://github.com/visionmedia/superagent/issues/221) # 0.14.3 / 2013-05-18 * add browser field to support browserify # 0.14.2/ 2013-05-07 * add host object check to fix serialization of File/Blobs etc as json # 0.14.1 / 2013-04-09 * update qs # 0.14.0 / 2013-04-02 * add client-side basic auth * fix retaining of .set() header field case # 0.13.0 / 2013-03-13 * add progress events to client * add simple example * add res.headers as alias of res.header for browser client * add res.get(field) to node/client # 0.12.4 / 2013-02-11 * fix get content-type even if can't get other headers in firefox. fixes [#181](https://github.com/visionmedia/superagent/issues/181) # 0.12.3 / 2013-02-11 * add quick "progress" event support # 0.12.2 / 2013-02-04 * add test to check if response acts as a readable stream * add ReadableStream in the Response prototype. * add test to assert correct redirection when the host changes in the location header. * add default Accept-Encoding. Closes [#155](https://github.com/visionmedia/superagent/issues/155) * fix req.pipe() return value of original stream for node parity. Closes [#171](https://github.com/visionmedia/superagent/issues/171) * remove the host header when cleaning headers to properly follow the redirection. # 0.12.1 / 2013-01-10 * add x-domain error handling # 0.12.0 / 2013-01-04 * add header persistence on redirects # 0.11.0 / 2013-01-02 * add .error Error object. Closes [#156](https://github.com/visionmedia/superagent/issues/156) * add forcing of res.text removal for FF HEAD responses. Closes [#162](https://github.com/visionmedia/superagent/issues/162) * add reduce component usage. Closes [#90](https://github.com/visionmedia/superagent/issues/90) * move better-assert dep to development deps # 0.10.0 / 2012-11-14 * add req.timeout(ms) support for the client # 0.9.10 / 2012-11-14 * fix client-side .query(str) support # 0.9.9 / 2012-11-14 * add .parse(fn) support * fix socket hangup with dates in querystring. Closes [#146](https://github.com/visionmedia/superagent/issues/146) * fix socket hangup "error" event when a callback of arity 2 is provided # 0.9.8 / 2012-11-03 * add emission of error from `Request#callback()` * add a better fix for nodes weird socket hang up error * add PUT/POST/PATCH data support to client short-hand functions * add .license property to component.json * change client portion to build using component(1) * fix GET body support [guille] # 0.9.7 / 2012-10-19 * fix `.buffer()` `res.text` when no parser matches # 0.9.6 / 2012-10-17 * change: use `this` when `window` is undefined * update to new component spec [juliangruber] * fix emission of "data" events for compressed responses without encoding. Closes [#125](https://github.com/visionmedia/superagent/issues/125) # 0.9.5 / 2012-10-01 * add field name to .attach() * add text "parser" * refactor isObject() * remove wtf isFunction() helper # 0.9.4 / 2012-09-20 * fix `Buffer` responses [TooTallNate] * fix `res.type` when a "type" param is present [TooTallNate] # 0.9.3 / 2012-09-18 * remove **GET** `.send()` == `.query()` special-case (**API** change !!!) # 0.9.2 / 2012-09-17 * add `.aborted` prop * add `.abort()`. Closes [#115](https://github.com/visionmedia/superagent/issues/115) # 0.9.1 / 2012-09-07 * add `.forbidden` response property * add component.json * change emitter-component to 0.0.5 * fix client-side tests # 0.9.0 / 2012-08-28 * add `.timeout(ms)`. Closes [#17](https://github.com/visionmedia/superagent/issues/17) # 0.8.2 / 2012-08-28 * fix pathname relative redirects. Closes [#112](https://github.com/visionmedia/superagent/issues/112) # 0.8.1 / 2012-08-21 * fix redirects when schema is specified # 0.8.0 / 2012-08-19 * add `res.buffered` flag * add buffering of text/\*, json and forms only by default. Closes [#61](https://github.com/visionmedia/superagent/issues/61) * add `.buffer(false)` cancellation * add cookie jar support [hunterloftis] * add agent functionality [hunterloftis] # 0.7.0 / 2012-08-03 * allow `query()` to be called after the internal `req` has been created [tootallnate] # 0.6.0 / 2012-07-17 * add `res.send('foo=bar')` default of "application/x-www-form-urlencoded" # 0.5.1 / 2012-07-16 * add "methods" dep * add `.end()` arity check to node callbacks * fix unzip support due to weird node internals # 0.5.0 / 2012-06-16 * Added "Link" response header field parsing, exposing `res.links` # 0.4.3 / 2012-06-15 * Added 303, 305 and 307 as redirect status codes [slaskis] * Fixed passing an object as the url # 0.4.2 / 2012-06-02 * Added component support * Fixed redirect data # 0.4.1 / 2012-04-13 * Added HTTP PATCH support * Fixed: GET / HEAD when following redirects. Closes [#86](https://github.com/visionmedia/superagent/issues/86) * Fixed Content-Length detection for multibyte chars # 0.4.0 / 2012-03-04 * Added `.head()` method [browser]. Closes [#78](https://github.com/visionmedia/superagent/issues/78) * Added `make test-cov` support * Added multipart request support. Closes [#11](https://github.com/visionmedia/superagent/issues/11) * Added all methods that node supports. Closes [#71](https://github.com/visionmedia/superagent/issues/71) * Added "response" event providing a Response object. Closes [#28](https://github.com/visionmedia/superagent/issues/28) * Added `.query(obj)`. Closes [#59](https://github.com/visionmedia/superagent/issues/59) * Added `res.type` (browser). Closes [#54](https://github.com/visionmedia/superagent/issues/54) * Changed: default `res.body` and `res.files` to {} * Fixed: port existing query-string fix (browser). Closes [#57](https://github.com/visionmedia/superagent/issues/57) # 0.3.0 / 2012-01-24 * Added deflate/gzip support [guillermo] * Added `res.type` (Content-Type void of params) * Added `res.statusCode` to mirror node * Added `res.headers` to mirror node * Changed: parsers take callbacks * Fixed optional schema support. Closes [#49](https://github.com/visionmedia/superagent/issues/49) # 0.2.0 / 2012-01-05 * Added url auth support * Added `.auth(username, password)` * Added basic auth support [node]. Closes [#41](https://github.com/visionmedia/superagent/issues/41) * Added `make test-docs` * Added guillermo's EventEmitter. Closes [#16](https://github.com/visionmedia/superagent/issues/16) * Removed `Request#data()` for SS, renamed to `send()` * Removed `Request#data()` from client, renamed to `send()` * Fixed array support. [browser] * Fixed array support. Closes [#35](https://github.com/visionmedia/superagent/issues/35) [node] * Fixed `EventEmitter#emit()` # 0.1.3 / 2011-10-25 * Added error to callback * Bumped node dep for 0.5.x # 0.1.2 / 2011-09-24 * Added markdown documentation * Added `request(url[, fn])` support to the client * Added `qs` dependency to package.json * Added options for `Request#pipe()` * Added support for `request(url, callback)` * Added `request(url)` as shortcut for `request.get(url)` * Added `Request#pipe(stream)` * Added inherit from `Stream` * Added multipart support * Added ssl support (node) * Removed Content-Length field from client * Fixed buffering, `setEncoding()` to utf8 [reported by stagas] * Fixed "end" event when piping # 0.1.1 / 2011-08-20 * Added `res.redirect` flag (node) * Added redirect support (node) * Added `Request#redirects(n)` (node) * Added `.set(object)` header field support * Fixed `Content-Length` support # 0.1.0 / 2011-08-09 * Added support for multiple calls to `.data()` * Added support for `.get(uri, obj)` * Added GET `.data()` querystring support * Added IE{6,7,8} support [alexyoung] # 0.0.1 / 2011-08-05 * Initial commit superagent-7.1.1/LICENSE000066400000000000000000000021171417204173300147050ustar00rootroot00000000000000(The MIT License) Copyright (c) 2014-2016 TJ Holowaychuk Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the 'Software'), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. superagent-7.1.1/Makefile000066400000000000000000000025061417204173300153420ustar00rootroot00000000000000 NODETESTS ?= test/*.js test/node/*.js BROWSERTESTS ?= test/*.js test/client/*.js REPORTER = spec test: @if [ "x$(BROWSER)" = "x" ]; then make test-node; else make test-browser; fi test-node: @NODE_ENV=test ./node_modules/.bin/mocha \ --require should \ --trace-warnings \ --throw-deprecation \ --reporter $(REPORTER) \ --timeout 5000 \ --exit \ $(NODETESTS) test-node-http2: @NODE_ENV=test HTTP2_TEST=1 node ./node_modules/.bin/mocha \ --require should \ --trace-warnings \ --throw-deprecation \ --reporter $(REPORTER) \ --timeout 5000 \ --exit \ $(NODETESTS) test-cov: lib-cov SUPERAGENT_COV=1 $(MAKE) test REPORTER=html-cov > coverage.html test-browser: SAUCE_APPIUM_VERSION=1.7 ./node_modules/.bin/zuul -- $(BROWSERTESTS) test-browser-local: ./node_modules/.bin/zuul --no-coverage --local 4000 -- $(BROWSERTESTS) lib-cov: jscoverage lib lib-cov test-server: @node test/server docs: index.html test-docs docs/index.md index.html: docs/index.md docs/head.html docs/tail.html marked < $< \ | cat docs/head.html - docs/tail.html \ > $@ docclean: rm -f index.html docs/test.html test-docs: docs/head.html docs/tail.html make test REPORTER=doc \ | cat docs/head.html - docs/tail.html \ > docs/test.html clean: rm -fr components .PHONY: test-cov test docs test-docs clean test-browser-local superagent-7.1.1/README.md000066400000000000000000000245341417204173300151660ustar00rootroot00000000000000# superagent [![build status](https://img.shields.io/travis/visionmedia/superagent.svg)](https://travis-ci.org/visionmedia/superagent) [![code coverage](https://img.shields.io/codecov/c/github/visionmedia/superagent.svg)](https://codecov.io/gh/visionmedia/superagent) [![code style](https://img.shields.io/badge/code_style-XO-5ed9c7.svg)](https://github.com/sindresorhus/xo) [![styled with prettier](https://img.shields.io/badge/styled_with-prettier-ff69b4.svg)](https://github.com/prettier/prettier) [![made with lass](https://img.shields.io/badge/made_with-lass-95CC28.svg)](https://lass.js.org) [![license](https://img.shields.io/github/license/visionmedia/superagent.svg)](LICENSE) > Small progressive client-side HTTP request library, and Node.js module with the same API, supporting many high-level HTTP client features ## Table of Contents * [Install](#install) * [Usage](#usage) * [Node](#node) * [Browser](#browser) * [Supported Platforms](#supported-platforms) * [Required Browser Features](#required-browser-features) * [Plugins](#plugins) * [Upgrading from previous versions](#upgrading-from-previous-versions) * [Contributors](#contributors) * [License](#license) ## Install [npm][]: ```sh npm install superagent ``` [yarn][]: ```sh yarn add superagent ``` ## Usage ### Node ```js const superagent = require('superagent'); // callback superagent .post('/api/pet') .send({ name: 'Manny', species: 'cat' }) // sends a JSON post body .set('X-API-Key', 'foobar') .set('accept', 'json') .end((err, res) => { // Calling the end function will send the request }); // promise with then/catch superagent.post('/api/pet').then(console.log).catch(console.error); // promise with async/await (async () => { try { const res = await superagent.post('/api/pet'); console.log(res); } catch (err) { console.error(err); } })(); ``` ### Browser **The browser-ready, minified version of `superagent` is only 6 KB (minified and gzipped)!** Browser-ready versions of this module are available via [jsdelivr][], [unpkg][], and also in the `node_modules/superagent/dist` folder in downloads of the `superagent` package. > Note that we also provide unminified versions with `.js` instead of `.min.js` file extensions. #### VanillaJS This is the solution for you if you're just using ` ``` #### Bundler If you are using [browserify][], [webpack][], [rollup][], or another bundler, then you can follow the same usage as [Node](#node) above. ## Supported Platforms * Node: v6.x+ * Browsers (see [.browserslistrc](.browserslistrc)): ```sh npx browserslist ``` ```sh and_chr 71 and_ff 64 and_qq 1.2 and_uc 11.8 android 67 android 4.4.3-4.4.4 baidu 7.12 bb 10 bb 7 chrome 73 chrome 72 chrome 71 edge 18 edge 17 firefox 66 firefox 65 ie 11 ie 10 ie 9 ie_mob 11 ie_mob 10 ios_saf 12.0-12.1 ios_saf 11.3-11.4 op_mini all op_mob 46 op_mob 12.1 opera 58 opera 57 safari 12 safari 11.1 samsung 8.2 samsung 7.2-7.4 ``` ### Required Browser Features We recommend using (specifically with the bundle mentioned in [VanillaJS](#vanillajs) above): ```html ``` * IE 9-10 requires a polyfill for `Promise`, `Array.from`, `Symbol`, `Object.getOwnPropertySymbols`, and `Object.setPrototypeOf` * IE 9 requires a polyfill for `window.FormData` (we recommend [formdata-polyfill][]), `Set`, `Math.trunc`, `BigInt`, `Map`, `Reflect`, `WeakMap`, `WeakRef`, and `WeakSet` ## Plugins SuperAgent is easily extended via plugins. ```js const nocache = require('superagent-no-cache'); const superagent = require('superagent'); const prefix = require('superagent-prefix')('/static'); superagent .get('/some-url') .query({ action: 'edit', city: 'London' }) // query string .use(prefix) // Prefixes *only* this request .use(nocache) // Prevents caching of *only* this request .end((err, res) => { // Do something }); ``` Existing plugins: * [superagent-no-cache](https://github.com/johntron/superagent-no-cache) - prevents caching by including Cache-Control header * [superagent-prefix](https://github.com/johntron/superagent-prefix) - prefixes absolute URLs (useful in test environment) * [superagent-suffix](https://github.com/timneutkens1/superagent-suffix) - suffix URLs with a given path * [superagent-mock](https://github.com/M6Web/superagent-mock) - simulate HTTP calls by returning data fixtures based on the requested URL * [superagent-mocker](https://github.com/shuvalov-anton/superagent-mocker) — simulate REST API * [superagent-cache](https://github.com/jpodwys/superagent-cache) - A global SuperAgent patch with built-in, flexible caching * [superagent-cache-plugin](https://github.com/jpodwys/superagent-cache-plugin) - A SuperAgent plugin with built-in, flexible caching * [superagent-jsonapify](https://github.com/alex94puchades/superagent-jsonapify) - A lightweight [json-api](http://jsonapi.org/format/) client addon for superagent * [superagent-serializer](https://github.com/zzarcon/superagent-serializer) - Converts server payload into different cases * [superagent-httpbackend](https://www.npmjs.com/package/superagent-httpbackend) - stub out requests using AngularJS' $httpBackend syntax * [superagent-throttle](https://github.com/leviwheatcroft/superagent-throttle) - queues and intelligently throttles requests * [superagent-charset](https://github.com/magicdawn/superagent-charset) - add charset support for node's SuperAgent * [superagent-verbose-errors](https://github.com/jcoreio/superagent-verbose-errors) - include response body in error messages for failed requests * [superagent-declare](https://github.com/damoclark/superagent-declare) - A simple [declarative](https://en.wikipedia.org/wiki/Declarative_programming) API for SuperAgent * [superagent-node-http-timings](https://github.com/webuniverseio/superagent-node-http-timings) - measure http timings in node.js Please prefix your plugin with `superagent-*` so that it can easily be found by others. For SuperAgent extensions such as couchdb and oauth visit the [wiki](https://github.com/visionmedia/superagent/wiki). ## Upgrading from previous versions Please see [GitHub releases page](https://github.com/visionmedia/superagent/releases) for the current changelog. Our breaking changes are mostly in rarely used functionality and from stricter error handling. * [6.0 to 6.1](https://github.com/visionmedia/superagent/releases/tag/v6.1.0) * Browser behaviour changed to match Node when serializing `application/x-www-form-urlencoded`, using `arrayFormat: 'indices'` semantics of `qs` library. (See: ) * [5.x to 6.x](https://github.com/visionmedia/superagent/releases/tag/v6.0.0): * Retry behavior is still opt-in, however we now have a more fine-grained list of status codes and error codes that we retry against (see updated docs) * A specific issue with Content-Type matching not being case-insensitive is fixed * Set is now required for IE 9, see [Required Browser Features](#required-browser-features) for more insight * [4.x to 5.x](https://github.com/visionmedia/superagent/releases/tag/v5.0.0): * We've implemented the build setup of [Lass](https://lass.js.org) to simplify our stack and linting * Unminified browserified build size has been reduced from 48KB to 20KB (via `tinyify` and the latest version of Babel using `@babel/preset-env` and `.browserslistrc`) * Linting support has been added using `caniuse-lite` and `eslint-plugin-compat` * We can now target what versions of Node we wish to support more easily using `.babelrc` * [3.x to 4.x](https://github.com/visionmedia/superagent/releases/tag/v4.0.0-alpha.1): * Ensure you're running Node 6 or later. We've dropped support for Node 4. * We've started using ES6 and for compatibility with Internet Explorer you may need to use Babel. * We suggest migrating from `.end()` callbacks to `.then()` or `await`. * [2.x to 3.x](https://github.com/visionmedia/superagent/releases/tag/v3.0.0): * Ensure you're running Node 4 or later. We've dropped support for Node 0.x. * Test code that calls `.send()` multiple times. Invalid calls to `.send()` will now throw instead of sending garbage. * [1.x to 2.x](https://github.com/visionmedia/superagent/releases/tag/v2.0.0): * If you use `.parse()` in the *browser* version, rename it to `.serialize()`. * If you rely on `undefined` in query-string values being sent literally as the text "undefined", switch to checking for missing value instead. `?key=undefined` is now `?key` (without a value). * If you use `.then()` in Internet Explorer, ensure that you have a polyfill that adds a global `Promise` object. * 0.x to 1.x: * Instead of 1-argument callback `.end(function(res){})` use `.then(res => {})`. ## Contributors | Name | | ------------------- | | **Kornel Lesiński** | | **Peter Lyons** | | **Hunter Loftis** | | **Nick Baugh** | ## License [MIT](LICENSE) © TJ Holowaychuk ## [npm]: https://www.npmjs.com/ [yarn]: https://yarnpkg.com/ [formdata-polyfill]: https://www.npmjs.com/package/formdata-polyfill [jsdelivr]: https://www.jsdelivr.com/ [unpkg]: https://unpkg.com/ [browserify]: https://github.com/browserify/browserify [webpack]: https://github.com/webpack/webpack [rollup]: https://github.com/rollup/rollup superagent-7.1.1/SECURITY.md000066400000000000000000000001541417204173300154700ustar00rootroot00000000000000# Security Policy ## Reporting a Vulnerability Please report security issues to `niftylettuce@gmail.com` superagent-7.1.1/docs/000077500000000000000000000000001417204173300146275ustar00rootroot00000000000000superagent-7.1.1/docs/head.html000066400000000000000000000005341417204173300164200ustar00rootroot00000000000000 SuperAgent — elegant API for AJAX in Node and browsers
superagent-7.1.1/docs/images/000077500000000000000000000000001417204173300160745ustar00rootroot00000000000000superagent-7.1.1/docs/images/bg.png000066400000000000000000000212301417204173300171700ustar00rootroot00000000000000PNG  IHDRffPzPLTE#%%:;;!##9::*+-668,--556#$%355 !#%%'455/00:<<%'(566(*+666+--689)+,446+,-88://08::445-//::<##%89:,-/688--/!#$/11'(*()+++-*,,$%%'()+,,)*,022133*,----)*+,,-456002014)++()*/01-/0699135++,///*++3569;;**,::;001145(**345/0224656866999:335466889"#%"#$899.01&(*024011+-.*+,013!"#)**)+--.0$%'144//1146244&()99;%&(9:;$%&134+-/ !"012(()555%%%''(000888""#!!"<<<:::999))*##$;;;222))+,,,:;<569k| IDATx4zw/> U^D%"Q\&$Mwݫjr #i*}3>S6|n K^Lbp)63 FfWmS[!>׾3;%]|ʴ޵$ф '7EV~ngHIkvsmj~WT5Z%ԣU7X?{ ӱd`r ȕW `D⛁h :b~[@FWuMcniUԽe&)Y z}ЌZqۚřhrb%Ɖ+ 3,%,: (9=l~9j*LJQ,M.h&[ n#O檉p9"w!&i=^<# ")Ð* 6ꤗ@5)M%z4YWsDj MդY}A J#kt>7cKV(.Kb꜃>١sQdV;:8ȹ#-v\%vLp+A />&TVf8Ͼa- )Z?Z[wF[lH^KZnh*5 )v5i\٩3iZ͸׮p@&'G ЦX&(ӆؓX9 bËԥꢺtmoڪǾOW8Ue?؎8mj4ͮmyX03[hW]l 3}uE=>-x.LruKEW|ke!&O9lWx:'|=52Xy& 2%mm?z,@ r}b4sV5(Q`oS7э-(F^Xd_\CU& d1J2Xp47R5OuͰ |Ku)L*ĶI?(R?Vfx,nF\tF⾋P9$BFY4+j5R黉7FO+ NcTmgb?C*KeA`n!6^/:C~QWcKs9bǰf{"דp(m ƹ-g[%0f.DL%5Y+U׋45N\&{F[J&P$[R`'c9 ?&EnC "0n;,gP):\]i?Z4GX_K&Nݺ`w0 [%. K>\qҏFVN5UJM.nB'Z,d?l?mOC.&X%槈 b,~13JrJr" #sh@5b ɄIwND7.-r^ZW55 bD*%V~'9ܖȖHOmԍa5g]#7ӑNGpwVCF:;0QDD[{h>g~ZxҹAq*1WԎ)OȔ2*L-3BTYnOm.[wZOiB]z8 D\{:${࢘ytFOG &,< ƇQsmA'sB:4[fJ`CpuVJHdvԃk5v#kZ6+Մ;\F^f9)~:3wХU'TI"_~|913~LxD2#v!JGD&I] G»Y~*`j}fς* >}ݝw<ٹ]NX?8-#]1bw3`ۄRS pT:I#R/S#,MpSt䮑Qo+\ꘑTDԙ49ҽ)JLV'`oCR5iw; ٺJ5:@JKgB`&ɑ掩ה&;ht̒`ܭg}BG ׋;E9̮b?`ֆؔ~@,uTϦ%6*klr?0c7n{H솋<+~r)X@#xX?_ uf YFHBKjQh7ݞ) s٨ĞΗpZb`-Nz5c 5JTW-q 7 G77'&^e.d.M` 8`I !$BVXKܶV GBFh$-(#1dylyJ5=$Bb#JX^RBm&t0 }A }'0h,Mu,t,`搹=8L~@+QA7},[œwz"kb7_(U[o5<6ȓrx| sk$a1d@lrq \v*SLPM%~nՋ~A?v3HMy"=xWR.^ 9r@='W Kc ?$ 6Ef5(|ߤw|u302yf &H\H=ਈ)r*uK^U%SHjn,!HPYorbrډ^? HYpq{4Ws\ _SΔ0\㎮5 =_^Юʠt`˰.7)*u_ˊOʍD;/;"-M~,XЁsMc&nG 3ڠ9LSEsZ"-TkpO}*/uKMQ?O/uׄ{kѵxct>2YY#sT;94&U򑭉Lo$P֙ve`A݇X5*x6/|׶ x\,;-?sF P:r"YlՃM\P{!bP[&C& 3btA}ax}^_]:vn |j-ѿ:Y"R?h{Afv5[w/bs՛IVg;t@ uXi/NSDM= -Hը蘹,R)ޑzJ$_O>ObQHn@;_9cݑ+%07 ٣&xK-jXld]}UI%UQ'X'۽/ o,D(Oܳ8~R  L&q|>d/ZO%O$'x?Qb\CQJ/@ȿiiR>4d#N&};Ax.33Ʌu~3JO$a /h'Z-us|a\QS")qGݑ?uA_F)3Yapfm&?[u c 8Nئ xcl֞?*+ބ)bǬcyڄvO󎲸ettv.;3zJ ~We%:ZޱkQ^@ n0a۔8DJPvl "ꠂkh.T35*,O)i96u*NqwPDv-Qـp9/ P@hҔNXIcl|ʕA=5|7?5@|i_fX4lu~dj'}oi2ؕ4De<;O0K_/T7I̐xBpxBJMf$~Q~p@QZ2"d n>[^e: pqfe4|%;kySEOo]tH^ᖁ*=7-7( }WlPG40*: 0m"zsjtrJ6cji4q o,TX4O fr~C7TkkRzzH_eUP 8 KkܕTz[KV/Hĕ*Mj)I?"Lqps5z3{:י̠eB_x|"KDibq?jnX>tB{%_>.+GJM+@;pCy(~4z". V |hz:3msX.@FkxW UMHƀ\~gN~vX }MĖW+_ 5mLcj(MکƇ3@@t%[X ˟uVP!Dzpk@E9$R?&58 :HnAg_m0MnwMM5O_eѥ/ʅi!m|.cM~wU|N 5'+|zWs@JHMk 37lT"O:y0]k\ :~JPui)lҒ2]{-E %%?Ly&`6jW!!> V7f ZTܵ%mT{ICo^QT\FrI߬xV^n%v XGyn_6l9%==vaoư7z8_gQa?+81 8W$-;jj 0MV+bHBuܪ9kjWn孬+og#TE{|y!Az}&VwR ir? pG?mFLVs r9bM(٠xyQ[ ^¿p 7 gt8X#b&-kjŸ+/| xm `Ӓ-K >mHC5yW~8˩:gp&L R$8\+^DQkG D7-B<}"S,GRHE3gĆtH:Wel}aP񵻗I)/ ,ͅmר2d% H`)-FU8vѺmmPZͤDssK \@S琭_tpot{M{ZѦ?U'K?.X Ggd! '^s>$YWi_GXfB90aПHfhu 0^f@'}Š*'H;>nwNF4l Id5h(EoqGS[I|d7r9]M7Є2h!N!Lq̽yNhqW-t=#tp,D0ֺe;W ",alHuI`*Dàe>$nbFkV̖hrW'qpJRzXG?$?sPU p- k_Ѓ \3Z^M\oQ&U6OV]䟯zjiD7`ýg,Y^),b/)6&`xU_y3nj\쏇/9=8km'2l4/AKY@H])Z}ZBVx1|Iږ#mRx3H)9hhl;qdG1j{ t:#3W\?g3/i٠Xǂ EB6"tE%=Nmy; hˉ"q "eKnbD;`JK#qLywߓ44;Kec24h%0SeeCàvAB\%@5nLHLa1'u! ۍF:hqkHG3o޽h9lײsSƜDH"e+{푟-0YJ}nw"#L7`8/7YP\L5n'p%;}"fv>,O,Tͦ Z߽6Mv8;bgUo=j~UV"͉V}pmS^c[SkQnl7U%-z]EY?4m.ٯz+XtAl~;|i>.t=hoh>xOd вbXp+- V?Wf*V>V",\0#[8x 6ړݚl^' v7߽LFk[ۃICЎ[=UO |UK‹LWnmZ/Ղ&e;y4@nۼV9&sRF_20KvY{Lf\ B>8YSAxi4lj=Zh߲mK] KKIENDB`superagent-7.1.1/docs/index.md000066400000000000000000000752151417204173300162720ustar00rootroot00000000000000 # SuperAgent SuperAgent is light-weight progressive ajax API crafted for flexibility, readability, and a low learning curve after being frustrated with many of the existing request APIs. It also works with Node.js! ```javascript request .post('/api/pet') .send({ name: 'Manny', species: 'cat' }) .set('X-API-Key', 'foobar') .set('Accept', 'application/json') .then(res => { alert('yay got ' + JSON.stringify(res.body)); }); ``` ## Test documentation [**中文文档**](docs/zh_CN/index.html) The following [test documentation](docs/test.html) was generated with [Mocha's](https://mochajs.org/) "doc" reporter, and directly reflects the test suite. This provides an additional source of documentation. ## Request basics A request can be initiated by invoking the appropriate method on the `request` object, then calling `.then()` (or `.end()` [or `await`](#promise-and-generator-support)) to send the request. For example a simple __GET__ request: ```javascript request .get('/search') .then(res => { // res.body, res.headers, res.status }) .catch(err => { // err.message, err.response }); ``` HTTP method may also be passed as a string: ```javascript request('GET', '/search').then(success, failure); ``` Old-style callbacks are also supported, but not recommended. *Instead of* `.then()` you can call `.end()`: ```javascript request('GET', '/search').end(function(err, res){ if (res.ok) {} }); ``` Absolute URLs can be used. In web browsers absolute URLs work only if the server implements [CORS](#cors). ```javascript request .get('https://example.com/search') .then(res => { }); ``` The __Node__ client supports making requests to [Unix Domain Sockets](https://en.wikipedia.org/wiki/Unix_domain_socket): ```javascript // pattern: https?+unix://SOCKET_PATH/REQUEST_PATH // Use `%2F` as `/` in SOCKET_PATH try { const res = await request .get('http+unix://%2Fabsolute%2Fpath%2Fto%2Funix.sock/search'); // res.body, res.headers, res.status } catch(err) { // err.message, err.response } ``` __DELETE__, __HEAD__, __PATCH__, __POST__, and __PUT__ requests can also be used, simply change the method name: ```javascript request .head('/favicon.ico') .then(res => { }); ``` __DELETE__ can be also called as `.del()` for compatibility with old IE where `delete` is a reserved word. The HTTP method defaults to __GET__, so if you wish, the following is valid: ```javascript request('/search', (err, res) => { }); ``` ## Setting header fields Setting header fields is simple, invoke `.set()` with a field name and value: ```javascript request .get('/search') .set('API-Key', 'foobar') .set('Accept', 'application/json') .then(callback); ``` You may also pass an object to set several fields in a single call: ```javascript request .get('/search') .set({ 'API-Key': 'foobar', Accept: 'application/json' }) .then(callback); ``` ## `GET` requests The `.query()` method accepts objects, which when used with the __GET__ method will form a query-string. The following will produce the path `/search?query=Manny&range=1..5&order=desc`. ```javascript request .get('/search') .query({ query: 'Manny' }) .query({ range: '1..5' }) .query({ order: 'desc' }) .then(res => { }); ``` Or as a single object: ```javascript request .get('/search') .query({ query: 'Manny', range: '1..5', order: 'desc' }) .then(res => { }); ``` The `.query()` method accepts strings as well: ```javascript request .get('/querystring') .query('search=Manny&range=1..5') .then(res => { }); ``` Or joined: ```javascript request .get('/querystring') .query('search=Manny') .query('range=1..5') .then(res => { }); ``` ## `HEAD` requests You can also use the `.query()` method for HEAD requests. The following will produce the path `/users?email=joe@smith.com`. ```javascript request .head('/users') .query({ email: 'joe@smith.com' }) .then(res => { }); ``` ## `POST` / `PUT` requests A typical JSON __POST__ request might look a little like the following, where we set the Content-Type header field appropriately, and "write" some data, in this case just a JSON string. ```javascript request.post('/user') .set('Content-Type', 'application/json') .send('{"name":"tj","pet":"tobi"}') .then(callback) .catch(errorCallback) ``` Since JSON is undoubtedly the most common, it's the _default_! The following example is equivalent to the previous. ```javascript request.post('/user') .send({ name: 'tj', pet: 'tobi' }) .then(callback, errorCallback) ``` Or using multiple `.send()` calls: ```javascript request.post('/user') .send({ name: 'tj' }) .send({ pet: 'tobi' }) .then(callback, errorCallback) ``` By default sending strings will set the `Content-Type` to `application/x-www-form-urlencoded`, multiple calls will be concatenated with `&`, here resulting in `name=tj&pet=tobi`: ```javascript request.post('/user') .send('name=tj') .send('pet=tobi') .then(callback, errorCallback); ``` SuperAgent formats are extensible, however by default "json" and "form" are supported. To send the data as `application/x-www-form-urlencoded` simply invoke `.type()` with "form", where the default is "json". This request will __POST__ the body "name=tj&pet=tobi". ```javascript request.post('/user') .type('form') .send({ name: 'tj' }) .send({ pet: 'tobi' }) .then(callback, errorCallback) ``` Sending a [`FormData`](https://developer.mozilla.org/en-US/docs/Web/API/FormData/FormData) object is also supported. The following example will __POST__ the content of the HTML form identified by id="myForm": ```javascript request.post('/user') .send(new FormData(document.getElementById('myForm'))) .then(callback, errorCallback) ``` ## Setting the `Content-Type` The obvious solution is to use the `.set()` method: ```javascript request.post('/user') .set('Content-Type', 'application/json') ``` As a short-hand the `.type()` method is also available, accepting the canonicalized MIME type name complete with type/subtype, or simply the extension name such as "xml", "json", "png", etc: ```javascript request.post('/user') .type('application/json') request.post('/user') .type('json') request.post('/user') .type('png') ``` ## Serializing request body SuperAgent will automatically serialize JSON and forms. You can setup automatic serialization for other types as well: ```js request.serialize['application/xml'] = function (obj) { return 'string generated from obj'; }; // going forward, all requests with a Content-type of // 'application/xml' will be automatically serialized ``` If you want to send the payload in a custom format, you can replace the built-in serialization with the `.serialize()` method on a per-request basis: ```js request .post('/user') .send({foo: 'bar'}) .serialize(obj => { return 'string generated from obj'; }); ``` ## Retrying requests When given the `.retry()` method, SuperAgent will automatically retry requests, if they fail in a way that is transient or could be due to a flaky Internet connection. This method has two optional arguments: number of retries (default 1) and a callback. It calls `callback(err, res)` before each retry. The callback may return `true`/`false` to control whether the request should be retried (but the maximum number of retries is always applied). ```javascript request .get('https://example.com/search') .retry(2) // or: .retry(2, callback) .then(finished); .catch(failed); ``` Use `.retry()` only with requests that are *idempotent* (i.e. multiple requests reaching the server won't cause undesirable side effects like duplicate purchases). All request methods are tried by default (which means if you do not want POST requests to be retried, you will need to pass a custom retry callback). By default the following status codes are retried: * `408` * `413` * `429` * `500` * `502` * `503` * `504` * `521` * `522` * `524` By default the following error codes are retried: * `'ETIMEDOUT'` * `'ECONNRESET'` * `'EADDRINUSE'` * `'ECONNREFUSED'` * `'EPIPE'` * `'ENOTFOUND'` * `'ENETUNREACH'` * `'EAI_AGAIN'` ## Setting Accept In a similar fashion to the `.type()` method it is also possible to set the `Accept` header via the short hand method `.accept()`. Which references `request.types` as well allowing you to specify either the full canonicalized MIME type name as `type/subtype`, or the extension suffix form as "xml", "json", "png", etc. for convenience: ```javascript request.get('/user') .accept('application/json') request.get('/user') .accept('json') request.post('/user') .accept('png') ``` ### Facebook and Accept JSON If you are calling Facebook's API, be sure to send an `Accept: application/json` header in your request. If you don't do this, Facebook will respond with `Content-Type: text/javascript; charset=UTF-8`, which SuperAgent will not parse and thus `res.body` will be undefined. You can do this with either `req.accept('json')` or `req.set('Accept', 'application/json')`. See [issue 1078](https://github.com/visionmedia/superagent/issues/1078) for details. ## Query strings `req.query(obj)` is a method which may be used to build up a query-string. For example populating `?format=json&dest=/login` on a __POST__: ```javascript request .post('/') .query({ format: 'json' }) .query({ dest: '/login' }) .send({ post: 'data', here: 'wahoo' }) .then(callback); ``` By default the query string is not assembled in any particular order. An asciibetically-sorted query string can be enabled with `req.sortQuery()`. You may also provide a custom sorting comparison function with `req.sortQuery(myComparisonFn)`. The comparison function should take 2 arguments and return a negative/zero/positive integer. ```js // default order request.get('/user') .query('name=Nick') .query('search=Manny') .sortQuery() .then(callback) // customized sort function request.get('/user') .query('name=Nick') .query('search=Manny') .sortQuery((a, b) => a.length - b.length) .then(callback) ``` ## TLS options In Node.js SuperAgent supports methods to configure HTTPS requests: - `.ca()`: Set the CA certificate(s) to trust - `.cert()`: Set the client certificate chain(s) - `.key()`: Set the client private key(s) - `.pfx()`: Set the client PFX or PKCS12 encoded private key and certificate chain - `.disableTLSCerts()`: Does not reject expired or invalid TLS certs. Sets internally `rejectUnauthorized=true`. *Be warned, this method allows MITM attacks.* For more information, see Node.js [https.request docs](https://nodejs.org/api/https.html#https_https_request_options_callback). ```js var key = fs.readFileSync('key.pem'), cert = fs.readFileSync('cert.pem'); request .post('/client-auth') .key(key) .cert(cert) .then(callback); ``` ```js var ca = fs.readFileSync('ca.cert.pem'); request .post('https://localhost/private-ca-server') .ca(ca) .then(res => {}); ``` ## Parsing response bodies SuperAgent will parse known response-body data for you, currently supporting `application/x-www-form-urlencoded`, `application/json`, and `multipart/form-data`. You can setup automatic parsing for other response-body data as well: ```js //browser request.parse['application/xml'] = function (str) { return {'object': 'parsed from str'}; }; //node request.parse['application/xml'] = function (res, cb) { //parse response text and set res.body here cb(null, res); }; //going forward, responses of type 'application/xml' //will be parsed automatically ``` You can set a custom parser (that takes precedence over built-in parsers) with the `.buffer(true).parse(fn)` method. If response buffering is not enabled (`.buffer(false)`) then the `response` event will be emitted without waiting for the body parser to finish, so `response.body` won't be available. ### JSON / Urlencoded The property `res.body` is the parsed object, for example if a request responded with the JSON string '{"user":{"name":"tobi"}}', `res.body.user.name` would be "tobi". Likewise the x-www-form-urlencoded value of "user[name]=tobi" would yield the same result. Only one level of nesting is supported. If you need more complex data, send JSON instead. Arrays are sent by repeating the key. `.send({color: ['red','blue']})` sends `color=red&color=blue`. If you want the array keys to contain `[]` in their name, you must add it yourself, as SuperAgent doesn't add it automatically. ### Multipart The Node client supports _multipart/form-data_ via the [Formidable](https://github.com/felixge/node-formidable) module. When parsing multipart responses, the object `res.files` is also available to you. Suppose for example a request responds with the following multipart body: --whoop Content-Disposition: attachment; name="image"; filename="tobi.png" Content-Type: image/png ... data here ... --whoop Content-Disposition: form-data; name="name" Content-Type: text/plain Tobi --whoop-- You would have the values `res.body.name` provided as "Tobi", and `res.files.image` as a `File` object containing the path on disk, filename, and other properties. ### Binary In browsers, you may use `.responseType('blob')` to request handling of binary response bodies. This API is unnecessary when running in node.js. The supported argument values for this method are - `'blob'` passed through to the XmlHTTPRequest `responseType` property - `'arraybuffer'` passed through to the XmlHTTPRequest `responseType` property ```js req.get('/binary.data') .responseType('blob') .then(res => { // res.body will be a browser native Blob type here }); ``` For more information, see the Mozilla Developer Network [xhr.responseType docs](https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest/responseType). ## Response properties Many helpful flags and properties are set on the `Response` object, ranging from the response text, parsed response body, header fields, status flags and more. ### Response text The `res.text` property contains the unparsed response body string. This property is always present for the client API, and only when the mime type matches "text/*", "*/json", or "x-www-form-urlencoded" by default for node. The reasoning is to conserve memory, as buffering text of large bodies such as multipart files or images is extremely inefficient. To force buffering see the "Buffering responses" section. ### Response body Much like SuperAgent can auto-serialize request data, it can also automatically parse it. When a parser is defined for the Content-Type, it is parsed, which by default includes "application/json" and "application/x-www-form-urlencoded". The parsed object is then available via `res.body`. ### Response header fields The `res.header` contains an object of parsed header fields, lowercasing field names much like node does. For example `res.header['content-length']`. ### Response Content-Type The Content-Type response header is special-cased, providing `res.type`, which is void of the charset (if any). For example the Content-Type of "text/html; charset=utf8" will provide "text/html" as `res.type`, and the `res.charset` property would then contain "utf8". ### Response status The response status flags help determine if the request was a success, among other useful information, making SuperAgent ideal for interacting with RESTful web services. These flags are currently defined as: ```javascript var type = status / 100 | 0; // status / class res.status = status; res.statusType = type; // basics res.info = 1 == type; res.ok = 2 == type; res.clientError = 4 == type; res.serverError = 5 == type; res.error = 4 == type || 5 == type; // sugar res.accepted = 202 == status; res.noContent = 204 == status || 1223 == status; res.badRequest = 400 == status; res.unauthorized = 401 == status; res.notAcceptable = 406 == status; res.notFound = 404 == status; res.forbidden = 403 == status; ``` ## Aborting requests To abort requests simply invoke the `req.abort()` method. ## Timeouts Sometimes networks and servers get "stuck" and never respond after accepting a request. Set timeouts to avoid requests waiting forever. * `req.timeout({deadline:ms})` or `req.timeout(ms)` (where `ms` is a number of milliseconds > 0) sets a deadline for the entire request (including all uploads, redirects, server processing time) to complete. If the response isn't fully downloaded within that time, the request will be aborted. * `req.timeout({response:ms})` sets maximum time to wait for the first byte to arrive from the server, but it does not limit how long the entire download can take. Response timeout should be at least few seconds longer than just the time it takes the server to respond, because it also includes time to make DNS lookup, TCP/IP and TLS connections, and time to upload request data. You should use both `deadline` and `response` timeouts. This way you can use a short response timeout to detect unresponsive networks quickly, and a long deadline to give time for downloads on slow, but reliable, networks. Note that both of these timers limit how long *uploads* of attached files are allowed to take. Use long timeouts if you're uploading files. ```javascript request .get('/big-file?network=slow') .timeout({ response: 5000, // Wait 5 seconds for the server to start sending, deadline: 60000, // but allow 1 minute for the file to finish loading. }) .then(res => { /* responded in time */ }, err => { if (err.timeout) { /* timed out! */ } else { /* other error */ } }); ``` Timeout errors have a `.timeout` property. ## Authentication In both Node and browsers auth available via the `.auth()` method: ```javascript request .get('http://local') .auth('tobi', 'learnboost') .then(callback); ``` In the _Node_ client Basic auth can be in the URL as "user:pass": ```javascript request.get('http://tobi:learnboost@local').then(callback); ``` By default only `Basic` auth is used. In browser you can add `{type:'auto'}` to enable all methods built-in in the browser (Digest, NTLM, etc.): ```javascript request.auth('digest', 'secret', {type:'auto'}) ``` The `auth` method also supports a `type` of `bearer`, to specify token-based authentication: ```javascript request.auth('my_token', { type: 'bearer' }) ``` ## Following redirects By default up to 5 redirects will be followed, however you may specify this with the `res.redirects(n)` method: ```javascript const response = await request.get('/some.png').redirects(2); ``` Redirects exceeding the limit are treated as errors. Use `.ok(res => res.status < 400)` to read them as successful responses. ## Agents for global state ### Saving cookies In Node SuperAgent does not save cookies by default, but you can use the `.agent()` method to create a copy of SuperAgent that saves cookies. Each copy has a separate cookie jar. ```javascript const agent = request.agent(); agent .post('/login') .then(() => { return agent.get('/cookied-page'); }); ``` In browsers cookies are managed automatically by the browser, so the `.agent()` does not isolate cookies. ### Default options for multiple requests Regular request methods called on the agent will be used as defaults for all requests made by that agent. ```javascript const agent = request.agent() .use(plugin) .auth(shared); await agent.get('/with-plugin-and-auth'); await agent.get('/also-with-plugin-and-auth'); ``` The complete list of methods that the agent can use to set defaults is: `use`, `on`, `once`, `set`, `query`, `type`, `accept`, `auth`, `withCredentials`, `sortQuery`, `retry`, `ok`, `redirects`, `timeout`, `buffer`, `serialize`, `parse`, `ca`, `key`, `pfx`, `cert`. ## Piping data The Node client allows you to pipe data to and from the request. Please note that `.pipe()` is used **instead of** `.end()`/`.then()` methods. For example piping a file's contents as the request: ```javascript const request = require('superagent'); const fs = require('fs'); const stream = fs.createReadStream('path/to/my.json'); const req = request.post('/somewhere'); req.type('json'); stream.pipe(req); ``` Note that when you pipe to a request, superagent sends the piped data with [chunked transfer encoding](https://en.wikipedia.org/wiki/Chunked_transfer_encoding), which isn't supported by all servers (for instance, Python WSGI servers). Or piping the response to a file: ```javascript const stream = fs.createWriteStream('path/to/my.json'); const req = request.get('/some.json'); req.pipe(stream); ``` It's not possible to mix pipes and callbacks or promises. Note that you should **NOT** attempt to pipe the result of `.end()` or the `Response` object: ```javascript // Don't do either of these: const stream = getAWritableStream(); const req = request .get('/some.json') // BAD: this pipes garbage to the stream and fails in unexpected ways .end((err, this_does_not_work) => this_does_not_work.pipe(stream)) const req = request .get('/some.json') .end() // BAD: this is also unsupported, .pipe calls .end for you. .pipe(nope_its_too_late); ``` In a [future version](https://github.com/visionmedia/superagent/issues/1188) of superagent, improper calls to `pipe()` will fail. ## Multipart requests SuperAgent is also great for _building_ multipart requests for which it provides methods `.attach()` and `.field()`. When you use `.field()` or `.attach()` you can't use `.send()` and you *must not* set `Content-Type` (the correct type will be set for you). ### Attaching files To send a file use `.attach(name, [file], [options])`. You can attach multiple files by calling `.attach` multiple times. The arguments are: * `name` — field name in the form. * `file` — either string with file path or `Blob`/`Buffer` object. * `options` — (optional) either string with custom file name or `{filename: string}` object. In Node also `{contentType: 'mime/type'}` is supported. In browser create a `Blob` with an appropriate type instead.
```javascript request .post('/upload') .attach('image1', 'path/to/felix.jpeg') .attach('image2', imageBuffer, 'luna.jpeg') .field('caption', 'My cats') .then(callback); ``` ### Field values Much like form fields in HTML, you can set field values with `.field(name, value)` and `.field({name: value})`. Suppose you want to upload a few images with your name and email, your request might look something like this: ```javascript request .post('/upload') .field('user[name]', 'Tobi') .field('user[email]', 'tobi@learnboost.com') .field('friends[]', ['loki', 'jane']) .attach('image', 'path/to/tobi.png') .then(callback); ``` ## Compression The node client supports compressed responses, best of all, you don't have to do anything! It just works. ## Buffering responses To force buffering of response bodies as `res.text` you may invoke `req.buffer()`. To undo the default of buffering for text responses such as "text/plain", "text/html" etc you may invoke `req.buffer(false)`. When buffered the `res.buffered` flag is provided, you may use this to handle both buffered and unbuffered responses in the same callback. ## CORS For security reasons, browsers will block cross-origin requests unless the server opts-in using CORS headers. Browsers will also make extra __OPTIONS__ requests to check what HTTP headers and methods are allowed by the server. [Read more about CORS](https://developer.mozilla.org/en-US/docs/Web/HTTP/Access_control_CORS). The `.withCredentials()` method enables the ability to send cookies from the origin, however only when `Access-Control-Allow-Origin` is _not_ a wildcard ("*"), and `Access-Control-Allow-Credentials` is "true". ```javascript request .get('https://api.example.com:4001/') .withCredentials() .then(res => { assert.equal(200, res.status); assert.equal('tobi', res.text); }) ``` ## Error handling Your callback function will always be passed two arguments: error and response. If no error occurred, the first argument will be null: ```javascript request .post('/upload') .attach('image', 'path/to/tobi.png') .then(res => { }); ``` An "error" event is also emitted, with you can listen for: ```javascript request .post('/upload') .attach('image', 'path/to/tobi.png') .on('error', handle) .then(res => { }); ``` Note that **superagent considers 4xx and 5xx responses (as well as unhandled 3xx responses) errors by default**. For example, if you get a `304 Not modified`, `403 Forbidden` or `500 Internal server error` response, this status information will be available via `err.status`. Errors from such responses also contain an `err.response` field with all of the properties mentioned in "[Response properties](#response-properties)". The library behaves in this way to handle the common case of wanting success responses and treating HTTP error status codes as errors while still allowing for custom logic around specific error conditions. Network failures, timeouts, and other errors that produce no response will contain no `err.status` or `err.response` fields. If you wish to handle 404 or other HTTP error responses, you can query the `err.status` property. When an HTTP error occurs (4xx or 5xx response) the `res.error` property is an `Error` object, this allows you to perform checks such as: ```javascript if (err && err.status === 404) { alert('oh no ' + res.body.message); } else if (err) { // all other error types we handle generically } ``` Alternatively, you can use the `.ok(callback)` method to decide whether a response is an error or not. The callback to the `ok` function gets a response and returns `true` if the response should be interpreted as success. ```javascript request.get('/404') .ok(res => res.status < 500) .then(response => { // reads 404 page as a successful response }) ``` ## Progress tracking SuperAgent fires `progress` events on upload and download of large files. ```javascript request.post(url) .attach('field_name', file) .on('progress', event => { /* the event is: { direction: "upload" or "download" percent: 0 to 100 // may be missing if file size is unknown total: // total file size, may be missing loaded: // bytes downloaded or uploaded so far } */ }) .then() ``` ## Testing on localhost ### Forcing specific connection IP address In Node.js it's possible to ignore DNS resolution and direct all requests to a specific IP address using `.connect()` method. For example, this request will go to localhost instead of `example.com`: ```javascript const res = await request.get("http://example.com").connect("127.0.0.1"); ``` Because the request may be redirected, it's possible to specify multiple hostnames and multiple IPs, as well as a special `*` as the fallback (note: other wildcards are not supported). The requests will keep their `Host` header with the original value. `.connect(undefined)` turns off the feature. ```javascript const res = await request.get("http://redir.example.com:555") .connect({ "redir.example.com": "127.0.0.1", // redir.example.com:555 will use 127.0.0.1:555 "www.example.com": false, // don't override this one; use DNS as normal "mapped.example.com": { host: "127.0.0.1", port: 8080}, // mapped.example.com:* will use 127.0.0.1:8080 "*": "proxy.example.com", // all other requests will go to this host }); ``` ### Ignoring broken/insecure HTTPS on localhost In Node.js, when HTTPS is misconfigured and insecure (e.g. using self-signed certificate *without* specifying own `.ca()`), it's still possible to permit requests to `localhost` by calling `.trustLocalhost()`: ```javascript const res = await request.get("https://localhost").trustLocalhost() ``` Together with `.connect("127.0.0.1")` this may be used to force HTTPS requests to any domain to be re-routed to `localhost` instead. It's generally safe to ignore broken HTTPS on `localhost`, because the loopback interface is not exposed to untrusted networks. Trusting `localhost` may become the default in the future. Use `.trustLocalhost(false)` to force check of `127.0.0.1`'s authenticity. We intentionally don't support disabling of HTTPS security when making requests to any other IP, because such options end up abused as a quick "fix" for HTTPS problems. You can get free HTTPS certificates from [Let's Encrypt](https://certbot.eff.org) or set your own CA (`.ca(ca_public_pem)`) to make your self-signed certificates trusted. ## Promise and Generator support SuperAgent's request is a "thenable" object that's compatible with JavaScript promises and the `async`/`await` syntax. ```javascript const res = await request.get(url); ``` If you're using promises, **do not** call `.end()` or `.pipe()`. Any use of `.then()` or `await` disables all other ways of using the request. Libraries like [co](https://github.com/tj/co) or a web framework like [koa](https://github.com/koajs/koa) can `yield` on any SuperAgent method: ```javascript const req = request .get('http://local') .auth('tobi', 'learnboost'); const res = yield req; ``` Note that SuperAgent expects the global `Promise` object to be present. You'll need a polyfill to use promises in Internet Explorer or Node.js 0.10. ## Browser and node versions SuperAgent has two implementations: one for web browsers (using XHR) and one for Node.JS (using core http module). By default Browserify and WebPack will pick the browser version. If want to use WebPack to compile code for Node.JS, you *must* specify [node target](https://webpack.github.io/docs/configuration.html#target) in its configuration. ### Using browser version in electron [Electron](https://electron.atom.io/) developers report if you would prefer to use the browser version of SuperAgent instead of the Node version, you can `require('superagent/superagent')`. Your requests will now show up in the Chrome developer tools Network tab. Note this environment is not covered by automated test suite and not officially supported. superagent-7.1.1/docs/style.css000066400000000000000000000026351417204173300165070ustar00rootroot00000000000000body { padding: 40px 80px; font: 14px/1.5 "Helvetica Neue", Helvetica, sans-serif; background: #181818 url(images/bg.png); text-align: center; } #content { margin: 0 auto; padding: 10px 40px; text-align: left; background: white; width: 50%; -webkit-border-radius: 2px; -moz-border-radius: 2px; border-radius: 2px; -webkit-box-shadow: 0 2px 5px 0 black; } #menu { font-size: 13px; margin: 0; padding: 0; text-align: left; position: fixed; top: 15px; left: 15px; } #menu ul { margin: 0; padding: 0; } #menu li { list-style: none; } #menu a { color: rgba(255,255,255,.5); text-decoration: none; } #menu a:hover { color: white; } #menu .active a { color: white; } pre { padding: 10px; } code { font-family: monaco, monospace, sans-serif; font-size: 0.85em; } p code { border: 1px solid #ECEA75; padding: 1px 3px; -webkit-border-radius: 2px; -moz-border-radius: 2px; border-radius: 2px; background: #FDFCD1; } pre { padding: 20px 25px; border: 1px solid #ddd; -webkit-box-shadow: inset 0 0 5px #eee; -moz-box-shadow: inset 0 0 5px #eee; box-shadow: inset 0 0 5px #eee; } code .comment { color: #ddd } code .init { color: #2F6FAD } code .string { color: #5890AD } code .keyword { color: #8A6343 } code .number { color: #2F6FAD } /* override tocbot style to avoid vertical white line in table of content */ .toc-link::before { content: initial; } superagent-7.1.1/docs/tail.html000066400000000000000000000030651417204173300164520ustar00rootroot00000000000000
Fork me on GitHub superagent-7.1.1/docs/test.html000066400000000000000000004442651417204173300165130ustar00rootroot00000000000000 SuperAgent — elegant API for AJAX in Node and browsers

Agent

should remember defaults
if (typeof Promise === 'undefined') {
  return;
}
let called = 0;
let event_called = 0;
const agent = request
  .agent()
  .accept('json')
  .use(() => {
    called++;
  })
  .once('request', () => {
    event_called++;
  })
  .query({ hello: 'world' })
  .set('X-test', 'testing');
assert.equal(0, called);
assert.equal(0, event_called);
return agent
  .get(`${base}/echo`)
  .then((res) => {
    assert.equal(1, called);
    assert.equal(1, event_called);
    assert.equal('application/json', res.headers.accept);
    assert.equal('testing', res.headers['x-test']);
    return agent.get(`${base}/querystring`);
  })
  .then((res) => {
    assert.equal(2, called);
    assert.equal(2, event_called);
    assert.deepEqual({ hello: 'world' }, res.body);
  });

request

res.statusCode

should set statusCode
request.get(`${uri}/login`, (err, res) => {
  try {
    assert.strictEqual(res.statusCode, 200);
    done();
  } catch (err_) {
    done(err_);
  }
});

should allow the send shorthand

with callback in the method call
request.get(`${uri}/login`, (err, res) => {
  assert.equal(res.status, 200);
  done();
});
with data in the method call
request.post(`${uri}/echo`, { foo: 'bar' }).end((err, res) => {
  assert.equal('{"foo":"bar"}', res.text);
  done();
});
with callback and data in the method call
request.post(`${uri}/echo`, { foo: 'bar' }, (err, res) => {
  assert.equal('{"foo":"bar"}', res.text);
  done();
});

with a callback

should invoke .end()
request.get(`${uri}/login`, (err, res) => {
  try {
    assert.equal(res.status, 200);
    done();
  } catch (err_) {
    done(err_);
  }
});

.end()

should issue a request
request.get(`${uri}/login`).end((err, res) => {
  try {
    assert.equal(res.status, 200);
    done();
  } catch (err_) {
    done(err_);
  }
});
is optional with a promise
if (typeof Promise === 'undefined') {
  return;
}
return request
  .get(`${uri}/login`)
  .then((res) => res.status)
  .then()
  .then((status) => {
    assert.equal(200, status, 'Real promises pass results through');
  });
called only once with a promise
if (typeof Promise === 'undefined') {
  return;
}
const req = request.get(`${uri}/unique`);
return Promise.all([req, req, req]).then((results) => {
  results.forEach((item) => {
    assert.equal(
      item.body,
      results[0].body,
      'It should keep returning the same result after being called once'
    );
  });
});

res.error

ok
let calledErrorEvent = false;
let calledOKHandler = false;
request
  .get(`${uri}/error`)
  .ok((res) => {
    assert.strictEqual(500, res.status);
    calledOKHandler = true;
    return true;
  })
  .on('error', (err) => {
    calledErrorEvent = true;
  })
  .end((err, res) => {
    try {
      assert.ifError(err);
      assert.strictEqual(res.status, 500);
      assert(!calledErrorEvent);
      assert(calledOKHandler);
      done();
    } catch (err_) {
      done(err_);
    }
  });
should be an Error object
let calledErrorEvent = false;
request
  .get(`${uri}/error`)
  .on('error', (err) => {
    assert.strictEqual(err.status, 500);
    calledErrorEvent = true;
  })
  .end((err, res) => {
    try {
      if (NODE) {
        res.error.message.should.equal('cannot GET /error (500)');
      } else {
        res.error.message.should.equal(`cannot GET ${uri}/error (500)`);
      }
      assert.strictEqual(res.error.status, 500);
      assert(err, 'should have an error for 500');
      assert.equal(err.message, 'Internal Server Error');
      assert(calledErrorEvent);
      done();
    } catch (err_) {
      done(err_);
    }
  });
with .then() promise
if (typeof Promise === 'undefined') {
  return;
}
return request.get(`${uri}/error`).then(
  () => {
    assert.fail();
  },
  (err) => {
    assert.equal(err.message, 'Internal Server Error');
  }
);
with .ok() returning false
if (typeof Promise === 'undefined') {
  return;
}
return request
  .get(`${uri}/echo`)
  .ok(() => false)
  .then(
    () => {
      assert.fail();
    },
    (err) => {
      assert.equal(200, err.response.status);
      assert.equal(err.message, 'OK');
    }
  );
with .ok() throwing an Error
if (typeof Promise === 'undefined') {
  return;
}
return request
  .get(`${uri}/echo`)
  .ok(() => {
    throw new Error('boom');
  })
  .then(
    () => {
      assert.fail();
    },
    (err) => {
      assert.equal(200, err.response.status);
      assert.equal(err.message, 'boom');
    }
  );

res.header

should be an object
request.get(`${uri}/login`).end((err, res) => {
  try {
    assert.equal('Express', res.header['x-powered-by']);
    done();
  } catch (err_) {
    done(err_);
  }
});

set headers

should only set headers for ownProperties of header
try {
  request
    .get(`${uri}/echo-headers`)
    .set('valid', 'ok')
    .end((err, res) => {
      if (
        !err &&
        res.body &&
        res.body.valid &&
        !res.body.hasOwnProperty('invalid')
      ) {
        return done();
      }
      done(err || new Error('fail'));
    });
} catch (err) {
  done(err);
}

res.charset

should be set when present
request.get(`${uri}/login`).end((err, res) => {
  try {
    res.charset.should.equal('utf-8');
    done();
  } catch (err_) {
    done(err_);
  }
});

res.statusType

should provide the first digit
request.get(`${uri}/login`).end((err, res) => {
  try {
    assert(!err, 'should not have an error for success responses');
    assert.equal(200, res.status);
    assert.equal(2, res.statusType);
    done();
  } catch (err_) {
    done(err_);
  }
});

res.type

should provide the mime-type void of params
request.get(`${uri}/login`).end((err, res) => {
  try {
    res.type.should.equal('text/html');
    res.charset.should.equal('utf-8');
    done();
  } catch (err_) {
    done(err_);
  }
});

req.set(field, val)

should set the header field
request
  .post(`${uri}/echo`)
  .set('X-Foo', 'bar')
  .set('X-Bar', 'baz')
  .end((err, res) => {
    try {
      assert.equal('bar', res.header['x-foo']);
      assert.equal('baz', res.header['x-bar']);
      done();
    } catch (err_) {
      done(err_);
    }
  });

req.set(obj)

should set the header fields
request
  .post(`${uri}/echo`)
  .set({ 'X-Foo': 'bar', 'X-Bar': 'baz' })
  .end((err, res) => {
    try {
      assert.equal('bar', res.header['x-foo']);
      assert.equal('baz', res.header['x-bar']);
      done();
    } catch (err_) {
      done(err_);
    }
  });

req.type(str)

should set the Content-Type
request
  .post(`${uri}/echo`)
  .type('text/x-foo')
  .end((err, res) => {
    try {
      res.header['content-type'].should.equal('text/x-foo');
      done();
    } catch (err_) {
      done(err_);
    }
  });
should map "json"
request
  .post(`${uri}/echo`)
  .type('json')
  .send('{"a": 1}')
  .end((err, res) => {
    try {
      res.should.be.json();
      done();
    } catch (err_) {
      done(err_);
    }
  });
should map "html"
request
  .post(`${uri}/echo`)
  .type('html')
  .end((err, res) => {
    try {
      res.header['content-type'].should.equal('text/html');
      done();
    } catch (err_) {
      done(err_);
    }
  });

req.accept(str)

should set Accept
request
  .get(`${uri}/echo`)
  .accept('text/x-foo')
  .end((err, res) => {
    try {
      res.header.accept.should.equal('text/x-foo');
      done();
    } catch (err_) {
      done(err_);
    }
  });
should map "json"
request
  .get(`${uri}/echo`)
  .accept('json')
  .end((err, res) => {
    try {
      res.header.accept.should.equal('application/json');
      done();
    } catch (err_) {
      done(err_);
    }
  });
should map "xml"
request
  .get(`${uri}/echo`)
  .accept('xml')
  .end((err, res) => {
    try {
      // Mime module keeps changing this :(
      assert(
        res.header.accept == 'application/xml' ||
          res.header.accept == 'text/xml'
      );
      done();
    } catch (err_) {
      done(err_);
    }
  });
should map "html"
request
  .get(`${uri}/echo`)
  .accept('html')
  .end((err, res) => {
    try {
      res.header.accept.should.equal('text/html');
      done();
    } catch (err_) {
      done(err_);
    }
  });

req.send(str)

should write the string
request
  .post(`${uri}/echo`)
  .type('json')
  .send('{"name":"tobi"}')
  .end((err, res) => {
    try {
      res.text.should.equal('{"name":"tobi"}');
      done();
    } catch (err_) {
      done(err_);
    }
  });

req.send(Object)

should default to json
request
  .post(`${uri}/echo`)
  .send({ name: 'tobi' })
  .end((err, res) => {
    try {
      res.should.be.json();
      res.text.should.equal('{"name":"tobi"}');
      done();
    } catch (err_) {
      done(err_);
    }
  });

when called several times

should merge the objects
request
  .post(`${uri}/echo`)
  .send({ name: 'tobi' })
  .send({ age: 1 })
  .end((err, res) => {
    try {
      res.should.be.json();
      if (NODE) {
        res.buffered.should.be.true();
      }
      res.text.should.equal('{"name":"tobi","age":1}');
      done();
    } catch (err_) {
      done(err_);
    }
  });

.end(fn)

should check arity
request
  .post(`${uri}/echo`)
  .send({ name: 'tobi' })
  .end((err, res) => {
    try {
      assert.ifError(err);
      res.text.should.equal('{"name":"tobi"}');
      done();
    } catch (err_) {
      done(err_);
    }
  });
should emit request
const req = request.post(`${uri}/echo`);
req.on('request', (request) => {
  assert.equal(req, request);
  done();
});
req.end();
should emit response
request
  .post(`${uri}/echo`)
  .send({ name: 'tobi' })
  .on('response', (res) => {
    res.text.should.equal('{"name":"tobi"}');
    done();
  })
  .end();

.then(fulfill, reject)

should support successful fulfills with .then(fulfill)
if (typeof Promise === 'undefined') {
  return done();
}
request
  .post(`${uri}/echo`)
  .send({ name: 'tobi' })
  .then((res) => {
    res.type.should.equal('application/json');
    res.text.should.equal('{"name":"tobi"}');
    done();
  });
should reject an error with .then(null, reject)
if (typeof Promise === 'undefined') {
  return done();
}
request.get(`${uri}/error`).then(null, (err) => {
  assert.equal(err.status, 500);
  assert.equal(err.response.text, 'boom');
  done();
});

.catch(reject)

should reject an error with .catch(reject)
if (typeof Promise === 'undefined') {
  return done();
}
request.get(`${uri}/error`).catch((err) => {
  assert.equal(err.status, 500);
  assert.equal(err.response.text, 'boom');
  done();
});

.abort()

should abort the request
const req = request.get(`${uri}/delay/3000`);
req.end((err, res) => {
  try {
    assert(false, 'should not complete the request');
  } catch (err_) {
    done(err_);
  }
});
req.on('error', (error) => {
  done(error);
});
req.on('abort', done);
setTimeout(() => {
  req.abort();
}, 500);
should abort the promise
const req = request.get(`${uri}/delay/3000`);
setTimeout(() => {
  req.abort();
}, 10);
return req.then(
  () => {
    assert.fail('should not complete the request');
  },
  (err) => {
    assert.equal('ABORTED', err.code);
  }
);
should allow chaining .abort() several times
const req = request.get(`${uri}/delay/3000`);
req.end((err, res) => {
  try {
    assert(false, 'should not complete the request');
  } catch (err_) {
    done(err_);
  }
});
// This also verifies only a single 'done' event is emitted
req.on('abort', done);
setTimeout(() => {
  req.abort().abort().abort();
}, 1000);
should not allow abort then end
request
  .get(`${uri}/delay/3000`)
  .abort()
  .end((err, res) => {
    done(err ? undefined : new Error('Expected abort error'));
  });

req.toJSON()

should describe the request
const req = request.post(`${uri}/echo`).send({ foo: 'baz' });
req.end((err, res) => {
  try {
    const json = req.toJSON();
    assert.equal('POST', json.method);
    assert(/\/echo$/.test(json.url));
    assert.equal('baz', json.data.foo);
    done();
  } catch (err_) {
    done(err_);
  }
});

req.options()

should allow request body
request
  .options(`${uri}/options/echo/body`)
  .send({ foo: 'baz' })
  .end((err, res) => {
    try {
      assert.equal(err, null);
      assert.strictEqual(res.body.foo, 'baz');
      done();
    } catch (err_) {
      done(err_);
    }
  });

req.sortQuery()

nop with no querystring
request
  .get(`${uri}/url`)
  .sortQuery()
  .end((err, res) => {
    try {
      assert.equal(res.text, '/url');
      done();
    } catch (err_) {
      done(err_);
    }
  });
should sort the request querystring
request
  .get(`${uri}/url`)
  .query('search=Manny')
  .query('order=desc')
  .sortQuery()
  .end((err, res) => {
    try {
      assert.equal(res.text, '/url?order=desc&search=Manny');
      done();
    } catch (err_) {
      done(err_);
    }
  });
should allow disabling sorting
request
  .get(`${uri}/url`)
  .query('search=Manny')
  .query('order=desc')
  .sortQuery() // take default of true
  .sortQuery(false) // override it in later call
  .end((err, res) => {
    try {
      assert.equal(res.text, '/url?search=Manny&order=desc');
      done();
    } catch (err_) {
      done(err_);
    }
  });
should sort the request querystring using customized function
request
  .get(`${uri}/url`)
  .query('name=Nick')
  .query('search=Manny')
  .query('order=desc')
  .sortQuery((a, b) => a.length - b.length)
  .end((err, res) => {
    try {
      assert.equal(res.text, '/url?name=Nick&order=desc&search=Manny');
      done();
    } catch (err_) {
      done(err_);
    }
  });

req.set("Content-Type", contentType)

should work with just the contentType component
request
  .post(`${uri}/echo`)
  .set('Content-Type', 'application/json')
  .send({ name: 'tobi' })
  .end((err, res) => {
    assert(!err);
    done();
  });
should work with the charset component
request
  .post(`${uri}/echo`)
  .set('Content-Type', 'application/json; charset=utf-8')
  .send({ name: 'tobi' })
  .end((err, res) => {
    assert(!err);
    done();
  });

req.send(Object) as "form"

with req.type() set to form

should send x-www-form-urlencoded data
request
  .post(`${base}/echo`)
  .type('form')
  .send({ name: 'tobi' })
  .end((err, res) => {
    res.header['content-type'].should.equal(
      'application/x-www-form-urlencoded'
    );
    res.text.should.equal('name=tobi');
    done();
  });

when called several times

should merge the objects
request
  .post(`${base}/echo`)
  .type('form')
  .send({ name: { first: 'tobi', last: 'holowaychuk' } })
  .send({ age: '1' })
  .end((err, res) => {
    res.header['content-type'].should.equal(
      'application/x-www-form-urlencoded'
    );
    res.text.should.equal(
      'name%5Bfirst%5D=tobi&name%5Blast%5D=holowaychuk&age=1'
    );
    done();
  });

req.attach

ignores null file
request
  .post('/echo')
  .attach('image', null)
  .end((err, res) => {
    done();
  });

req.field

allow bools
if (!formDataSupported) {
  return done();
}
request
  .post(`${base}/formecho`)
  .field('bools', true)
  .field('strings', 'true')
  .end((err, res) => {
    assert.ifError(err);
    assert.deepStrictEqual(res.body, { bools: 'true', strings: 'true' });
    done();
  });
allow objects
if (!formDataSupported) {
  return done();
}
request
  .post(`${base}/formecho`)
  .field({ bools: true, strings: 'true' })
  .end((err, res) => {
    assert.ifError(err);
    assert.deepStrictEqual(res.body, { bools: 'true', strings: 'true' });
    done();
  });
works with arrays in objects
if (!formDataSupported) {
  return done();
}
request
  .post(`${base}/formecho`)
  .field({ numbers: [1, 2, 3] })
  .end((err, res) => {
    assert.ifError(err);
    assert.deepStrictEqual(res.body, { numbers: ['1', '2', '3'] });
    done();
  });
works with arrays
if (!formDataSupported) {
  return done();
}
request
  .post(`${base}/formecho`)
  .field('letters', ['a', 'b', 'c'])
  .end((err, res) => {
    assert.ifError(err);
    assert.deepStrictEqual(res.body, { letters: ['a', 'b', 'c'] });
    done();
  });
throw when empty
should.throws(() => {
  request.post(`${base}/echo`).field();
}, /name/);
should.throws(() => {
  request.post(`${base}/echo`).field('name');
}, /val/);
cannot be mixed with send()
assert.throws(() => {
  request.post('/echo').field('form', 'data').send('hi');
});
assert.throws(() => {
  request.post('/echo').send('hi').field('form', 'data');
});

req.send(Object) as "json"

should default to json
request
  .post(`${uri}/echo`)
  .send({ name: 'tobi' })
  .end((err, res) => {
    res.should.be.json();
    res.text.should.equal('{"name":"tobi"}');
    done();
  });
should work with arrays
request
  .post(`${uri}/echo`)
  .send([1, 2, 3])
  .end((err, res) => {
    res.should.be.json();
    res.text.should.equal('[1,2,3]');
    done();
  });
should work with value null
request
  .post(`${uri}/echo`)
  .type('json')
  .send('null')
  .end((err, res) => {
    res.should.be.json();
    assert.strictEqual(res.body, null);
    done();
  });
should work with value false
request
  .post(`${uri}/echo`)
  .type('json')
  .send('false')
  .end((err, res) => {
    res.should.be.json();
    res.body.should.equal(false);
    done();
  });
should work with value 0
// fails in IE9
request
  .post(`${uri}/echo`)
  .type('json')
  .send('0')
  .end((err, res) => {
    res.should.be.json();
    res.body.should.equal(0);
    done();
  });
should work with empty string value
request
  .post(`${uri}/echo`)
  .type('json')
  .send('""')
  .end((err, res) => {
    res.should.be.json();
    res.body.should.equal('');
    done();
  });
should work with GET
request
  .get(`${uri}/echo`)
  .send({ tobi: 'ferret' })
  .end((err, res) => {
    try {
      res.should.be.json();
      res.text.should.equal('{"tobi":"ferret"}');
      ({ tobi: 'ferret' }.should.eql(res.body));
      done();
    } catch (err_) {
      done(err_);
    }
  });
should work with vendor MIME type
request
  .post(`${uri}/echo`)
  .set('Content-Type', 'application/vnd.example+json')
  .send({ name: 'vendor' })
  .end((err, res) => {
    res.text.should.equal('{"name":"vendor"}');
    ({ name: 'vendor' }.should.eql(res.body));
    done();
  });

when called several times

should merge the objects
request
  .post(`${uri}/echo`)
  .send({ name: 'tobi' })
  .send({ age: 1 })
  .end((err, res) => {
    res.should.be.json();
    res.text.should.equal('{"name":"tobi","age":1}');
    ({ name: 'tobi', age: 1 }.should.eql(res.body));
    done();
  });

res.body

application/json

should parse the body
request.get(`${uri}/json`).end((err, res) => {
  res.text.should.equal('{"name":"manny"}');
  res.body.should.eql({ name: 'manny' });
  done();
});

HEAD requests

should not throw a parse error
request.head(`${uri}/json`).end((err, res) => {
  try {
    assert.strictEqual(err, null);
    assert.strictEqual(res.text, undefined);
    assert.strictEqual(Object.keys(res.body).length, 0);
    done();
  } catch (err_) {
    done(err_);
  }
});

Invalid JSON response

should return the raw response
request.get(`${uri}/invalid-json`).end((err, res) => {
  assert.deepEqual(
    err.rawResponse,
    ")]}', {'header':{'code':200,'text':'OK','version':'1.0'},'data':'some data'}"
  );
  done();
});
should return the http status code
request.get(`${uri}/invalid-json-forbidden`).end((err, res) => {
  assert.equal(err.statusCode, 403);
  done();
});

No content

should not throw a parse error
request.get(`${uri}/no-content`).end((err, res) => {
  try {
    assert.strictEqual(err, null);
    assert.strictEqual(res.text, '');
    assert.strictEqual(Object.keys(res.body).length, 0);
    done();
  } catch (err_) {
    done(err_);
  }
});

application/json+hal

should parse the body
request.get(`${uri}/json-hal`).end((err, res) => {
  if (err) return done(err);
  res.text.should.equal('{"name":"hal 5000"}');
  res.body.should.eql({ name: 'hal 5000' });
  done();
});

vnd.collection+json

should parse the body
request.get(`${uri}/collection-json`).end((err, res) => {
  res.text.should.equal('{"name":"chewbacca"}');
  res.body.should.eql({ name: 'chewbacca' });
  done();
});

request

on redirect

should retain header fields
request
  .get(`${base}/header`)
  .set('X-Foo', 'bar')
  .end((err, res) => {
    try {
      assert(res.body);
      res.body.should.have.property('x-foo', 'bar');
      done();
    } catch (err_) {
      done(err_);
    }
  });
should preserve timeout across redirects
request
  .get(`${base}/movies/random`)
  .timeout(250)
  .end((err, res) => {
    try {
      assert(err instanceof Error, 'expected an error');
      err.should.have.property('timeout', 250);
      done();
    } catch (err_) {
      done(err_);
    }
  });
should successfully redirect after retry on error
const id = Math.random() * 1000000 * Date.now();
request
  .get(`${base}/error/redirect/${id}`)
  .retry(2)
  .end((err, res) => {
    assert(res.ok, 'response should be ok');
    assert(res.text, 'first movie page');
    done();
  });
should preserve retries across redirects
const id = Math.random() * 1000000 * Date.now();
request
  .get(`${base}/error/redirect-error${id}`)
  .retry(2)
  .end((err, res) => {
    assert(err, 'expected an error');
    assert.equal(2, err.retries, 'expected an error with .retries');
    assert.equal(500, err.status, 'expected an error status of 500');
    done();
  });

on 303

should redirect with same method
request
  .put(`${base}/redirect-303`)
  .send({ msg: 'hello' })
  .redirects(1)
  .on('redirect', (res) => {
    res.headers.location.should.equal('/reply-method');
  })
  .end((err, res) => {
    if (err) {
      done(err);
      return;
    }
    res.text.should.equal('method=get');
    done();
  });

on 307

should redirect with same method
if (isMSIE) return done(); // IE9 broken
request
  .put(`${base}/redirect-307`)
  .send({ msg: 'hello' })
  .redirects(1)
  .on('redirect', (res) => {
    res.headers.location.should.equal('/reply-method');
  })
  .end((err, res) => {
    if (err) {
      done(err);
      return;
    }
    res.text.should.equal('method=put');
    done();
  });

on 308

should redirect with same method
if (isMSIE) return done(); // IE9 broken
request
  .put(`${base}/redirect-308`)
  .send({ msg: 'hello' })
  .redirects(1)
  .on('redirect', (res) => {
    res.headers.location.should.equal('/reply-method');
  })
  .end((err, res) => {
    if (err) {
      done(err);
      return;
    }
    res.text.should.equal('method=put');
    done();
  });

request

Request inheritance
assert(request.get(`${uri}/`) instanceof request.Request);
request() simple GET without callback
request('GET', 'test/test.request.js').end();
next();
request() simple GET
request('GET', `${uri}/ok`).end((err, res) => {
  try {
    assert(res instanceof request.Response, 'respond with Response');
    assert(res.ok, 'response should be ok');
    assert(res.text, 'res.text');
    next();
  } catch (err_) {
    next(err_);
  }
});
request() simple HEAD
request.head(`${uri}/ok`).end((err, res) => {
  try {
    assert(res instanceof request.Response, 'respond with Response');
    assert(res.ok, 'response should be ok');
    assert(!res.text, 'res.text');
    next();
  } catch (err_) {
    next(err_);
  }
});
request() GET 5xx
request('GET', `${uri}/error`).end((err, res) => {
  try {
    assert(err);
    assert.equal(err.message, 'Internal Server Error');
    assert(!res.ok, 'response should not be ok');
    assert(res.error, 'response should be an error');
    assert(!res.clientError, 'response should not be a client error');
    assert(res.serverError, 'response should be a server error');
    next();
  } catch (err_) {
    next(err_);
  }
});
request() GET 4xx
request('GET', `${uri}/notfound`).end((err, res) => {
  try {
    assert(err);
    assert.equal(err.message, 'Not Found');
    assert(!res.ok, 'response should not be ok');
    assert(res.error, 'response should be an error');
    assert(res.clientError, 'response should be a client error');
    assert(!res.serverError, 'response should not be a server error');
    next();
  } catch (err_) {
    next(err_);
  }
});
request() GET 404 Not Found
request('GET', `${uri}/notfound`).end((err, res) => {
  try {
    assert(err);
    assert(res.notFound, 'response should be .notFound');
    next();
  } catch (err_) {
    next(err_);
  }
});
request() GET 400 Bad Request
request('GET', `${uri}/bad-request`).end((err, res) => {
  try {
    assert(err);
    assert(res.badRequest, 'response should be .badRequest');
    next();
  } catch (err_) {
    next(err_);
  }
});
request() GET 401 Bad Request
request('GET', `${uri}/unauthorized`).end((err, res) => {
  try {
    assert(err);
    assert(res.unauthorized, 'response should be .unauthorized');
    next();
  } catch (err_) {
    next(err_);
  }
});
request() GET 406 Not Acceptable
request('GET', `${uri}/not-acceptable`).end((err, res) => {
  try {
    assert(err);
    assert(res.notAcceptable, 'response should be .notAcceptable');
    next();
  } catch (err_) {
    next(err_);
  }
});
request() GET 204 No Content
request('GET', `${uri}/no-content`).end((err, res) => {
  try {
    assert.ifError(err);
    assert(res.noContent, 'response should be .noContent');
    next();
  } catch (err_) {
    next(err_);
  }
});
request() DELETE 204 No Content
request('DELETE', `${uri}/no-content`).end((err, res) => {
  try {
    assert.ifError(err);
    assert(res.noContent, 'response should be .noContent');
    next();
  } catch (err_) {
    next(err_);
  }
});
request() header parsing
request('GET', `${uri}/notfound`).end((err, res) => {
  try {
    assert(err);
    assert.equal('text/html; charset=utf-8', res.header['content-type']);
    assert.equal('Express', res.header['x-powered-by']);
    next();
  } catch (err_) {
    next(err_);
  }
});
request() .status
request('GET', `${uri}/notfound`).end((err, res) => {
  try {
    assert(err);
    assert.equal(404, res.status, 'response .status');
    assert.equal(4, res.statusType, 'response .statusType');
    next();
  } catch (err_) {
    next(err_);
  }
});
get()
request.get(`${uri}/notfound`).end((err, res) => {
  try {
    assert(err);
    assert.equal(404, res.status, 'response .status');
    assert.equal(4, res.statusType, 'response .statusType');
    next();
  } catch (err_) {
    next(err_);
  }
});
put()
request.put(`${uri}/user/12`).end((err, res) => {
  try {
    assert.equal('updated', res.text, 'response text');
    next();
  } catch (err_) {
    next(err_);
  }
});
put().send()
request
  .put(`${uri}/user/13/body`)
  .send({ user: 'new' })
  .end((err, res) => {
    try {
      assert.equal('received new', res.text, 'response text');
      next();
    } catch (err_) {
      next(err_);
    }
  });
post()
request.post(`${uri}/user`).end((err, res) => {
  try {
    assert.equal('created', res.text, 'response text');
    next();
  } catch (err_) {
    next(err_);
  }
});
del()
request.del(`${uri}/user/12`).end((err, res) => {
  try {
    assert.equal('deleted', res.text, 'response text');
    next();
  } catch (err_) {
    next(err_);
  }
});
delete()
request.delete(`${uri}/user/12`).end((err, res) => {
  try {
    assert.equal('deleted', res.text, 'response text');
    next();
  } catch (err_) {
    next(err_);
  }
});
post() data
request
  .post(`${uri}/todo/item`)
  .type('application/octet-stream')
  .send('tobi')
  .end((err, res) => {
    try {
      assert.equal('added "tobi"', res.text, 'response text');
      next();
    } catch (err_) {
      next(err_);
    }
  });
request .type()
request
  .post(`${uri}/user/12/pet`)
  .type('urlencoded')
  .send('pet=tobi')
  .end((err, res) => {
    try {
      assert.equal('added pet "tobi"', res.text, 'response text');
      next();
    } catch (err_) {
      next(err_);
    }
  });
request .type() with alias
request
  .post(`${uri}/user/12/pet`)
  .type('application/x-www-form-urlencoded')
  .send('pet=tobi')
  .end((err, res) => {
    try {
      assert.equal('added pet "tobi"', res.text, 'response text');
      next();
    } catch (err_) {
      next(err_);
    }
  });
request .get() with no data or callback
request.get(`${uri}/echo-header/content-type`);
next();
request .send() with no data only
request.post(`${uri}/user/5/pet`).type('urlencoded').send('pet=tobi');
next();
request .send() with callback only
request
  .get(`${uri}/echo-header/accept`)
  .set('Accept', 'foo/bar')
  .end((err, res) => {
    try {
      assert.equal('foo/bar', res.text);
      next();
    } catch (err_) {
      next(err_);
    }
  });
request .accept() with json
request
  .get(`${uri}/echo-header/accept`)
  .accept('json')
  .end((err, res) => {
    try {
      assert.equal('application/json', res.text);
      next();
    } catch (err_) {
      next(err_);
    }
  });
request .accept() with application/json
request
  .get(`${uri}/echo-header/accept`)
  .accept('application/json')
  .end((err, res) => {
    try {
      assert.equal('application/json', res.text);
      next();
    } catch (err_) {
      next(err_);
    }
  });
request .accept() with xml
request
  .get(`${uri}/echo-header/accept`)
  .accept('xml')
  .end((err, res) => {
    try {
      // We can't depend on mime module to be consistent with this
      assert(res.text == 'application/xml' || res.text == 'text/xml');
      next();
    } catch (err_) {
      next(err_);
    }
  });
request .accept() with application/xml
request
  .get(`${uri}/echo-header/accept`)
  .accept('application/xml')
  .end((err, res) => {
    try {
      assert.equal('application/xml', res.text);
      next();
    } catch (err_) {
      next(err_);
    }
  });
request .end()
request
  .put(`${uri}/echo-header/content-type`)
  .set('Content-Type', 'text/plain')
  .send('wahoo')
  .end((err, res) => {
    try {
      assert.equal('text/plain', res.text);
      next();
    } catch (err_) {
      next(err_);
    }
  });
request .send()
request
  .put(`${uri}/echo-header/content-type`)
  .set('Content-Type', 'text/plain')
  .send('wahoo')
  .end((err, res) => {
    try {
      assert.equal('text/plain', res.text);
      next();
    } catch (err_) {
      next(err_);
    }
  });
request .set()
request
  .put(`${uri}/echo-header/content-type`)
  .set('Content-Type', 'text/plain')
  .send('wahoo')
  .end((err, res) => {
    try {
      assert.equal('text/plain', res.text);
      next();
    } catch (err_) {
      next(err_);
    }
  });
request .set(object)
request
  .put(`${uri}/echo-header/content-type`)
  .set({ 'Content-Type': 'text/plain' })
  .send('wahoo')
  .end((err, res) => {
    try {
      assert.equal('text/plain', res.text);
      next();
    } catch (err_) {
      next(err_);
    }
  });
POST urlencoded
request
  .post(`${uri}/pet`)
  .type('urlencoded')
  .send({ name: 'Manny', species: 'cat' })
  .end((err, res) => {
    try {
      assert.equal('added Manny the cat', res.text);
      next();
    } catch (err_) {
      next(err_);
    }
  });
POST json
request
  .post(`${uri}/pet`)
  .type('json')
  .send({ name: 'Manny', species: 'cat' })
  .end((err, res) => {
    try {
      assert.equal('added Manny the cat', res.text);
      next();
    } catch (err_) {
      next(err_);
    }
  });
POST json array
request
  .post(`${uri}/echo`)
  .send([1, 2, 3])
  .end((err, res) => {
    try {
      assert.equal(
        'application/json',
        res.header['content-type'].split(';')[0]
      );
      assert.equal('[1,2,3]', res.text);
      next();
    } catch (err_) {
      next(err_);
    }
  });
POST json default
request
  .post(`${uri}/pet`)
  .send({ name: 'Manny', species: 'cat' })
  .end((err, res) => {
    try {
      assert.equal('added Manny the cat', res.text);
      next();
    } catch (err_) {
      next(err_);
    }
  });
POST json contentType charset
request
  .post(`${uri}/echo`)
  .set('Content-Type', 'application/json; charset=UTF-8')
  .send({ data: ['data1', 'data2'] })
  .end((err, res) => {
    try {
      assert.equal('{"data":["data1","data2"]}', res.text);
      next();
    } catch (err_) {
      next(err_);
    }
  });
POST json contentType vendor
request
  .post(`${uri}/echo`)
  .set('Content-Type', 'application/vnd.example+json')
  .send({ data: ['data1', 'data2'] })
  .end((err, res) => {
    try {
      assert.equal('{"data":["data1","data2"]}', res.text);
      next();
    } catch (err_) {
      next(err_);
    }
  });
POST multiple .send() calls
request
  .post(`${uri}/pet`)
  .send({ name: 'Manny' })
  .send({ species: 'cat' })
  .end((err, res) => {
    try {
      assert.equal('added Manny the cat', res.text);
      next();
    } catch (err_) {
      next(err_);
    }
  });
POST multiple .send() strings
request
  .post(`${uri}/echo`)
  .send('user[name]=tj')
  .send('user[email]=tj@vision-media.ca')
  .end((err, res) => {
    try {
      assert.equal(
        'application/x-www-form-urlencoded',
        res.header['content-type'].split(';')[0]
      );
      assert.equal(
        res.text,
        'user[name]=tj&user[email]=tj@vision-media.ca'
      );
      next();
    } catch (err_) {
      next(err_);
    }
  });
POST with no data
request
  .post(`${uri}/empty-body`)
  .send()
  .end((err, res) => {
    try {
      assert.ifError(err);
      assert(res.noContent, 'response should be .noContent');
      next();
    } catch (err_) {
      next(err_);
    }
  });
GET .type
request.get(`${uri}/pets`).end((err, res) => {
  try {
    assert.equal('application/json', res.type);
    next();
  } catch (err_) {
    next(err_);
  }
});
GET Content-Type params
request.get(`${uri}/text`).end((err, res) => {
  try {
    assert.equal('utf-8', res.charset);
    next();
  } catch (err_) {
    next(err_);
  }
});
GET json
request.get(`${uri}/pets`).end((err, res) => {
  try {
    assert.deepEqual(res.body, ['tobi', 'loki', 'jane']);
    next();
  } catch (err_) {
    next(err_);
  }
});
GET json-seq
request
  .get(`${uri}/json-seq`)
  .buffer()
  .end((err, res) => {
    try {
      assert.ifError(err);
      assert.deepEqual(res.text, '\u001E{"id":1}\n\u001E{"id":2}\n');
      next();
    } catch (err_) {
      next(err_);
    }
  });
GET x-www-form-urlencoded
request.get(`${uri}/foo`).end((err, res) => {
  try {
    assert.deepEqual(res.body, { foo: 'bar' });
    next();
  } catch (err_) {
    next(err_);
  }
});
GET shorthand
request.get(`${uri}/foo`, (err, res) => {
  try {
    assert.equal('foo=bar', res.text);
    next();
  } catch (err_) {
    next(err_);
  }
});
POST shorthand
request.post(`${uri}/user/0/pet`, { pet: 'tobi' }, (err, res) => {
  try {
    assert.equal('added pet "tobi"', res.text);
    next();
  } catch (err_) {
    next(err_);
  }
});
POST shorthand without callback
request.post(`${uri}/user/0/pet`, { pet: 'tobi' }).end((err, res) => {
  try {
    assert.equal('added pet "tobi"', res.text);
    next();
  } catch (err_) {
    next(err_);
  }
});
GET querystring object with array
request
  .get(`${uri}/querystring`)
  .query({ val: ['a', 'b', 'c'] })
  .end((err, res) => {
    try {
      assert.deepEqual(res.body, { val: ['a', 'b', 'c'] });
      next();
    } catch (err_) {
      next(err_);
    }
  });
GET querystring object with array and primitives
request
  .get(`${uri}/querystring`)
  .query({ array: ['a', 'b', 'c'], string: 'foo', number: 10 })
  .end((err, res) => {
    try {
      assert.deepEqual(res.body, {
        array: ['a', 'b', 'c'],
        string: 'foo',
        number: 10
      });
      next();
    } catch (err_) {
      next(err_);
    }
  });
GET querystring object with two arrays
request
  .get(`${uri}/querystring`)
  .query({ array1: ['a', 'b', 'c'], array2: [1, 2, 3] })
  .end((err, res) => {
    try {
      assert.deepEqual(res.body, {
        array1: ['a', 'b', 'c'],
        array2: [1, 2, 3]
      });
      next();
    } catch (err_) {
      next(err_);
    }
  });
GET querystring object
request
  .get(`${uri}/querystring`)
  .query({ search: 'Manny' })
  .end((err, res) => {
    try {
      assert.deepEqual(res.body, { search: 'Manny' });
      next();
    } catch (err_) {
      next(err_);
    }
  });
GET querystring append original
request
  .get(`${uri}/querystring?search=Manny`)
  .query({ range: '1..5' })
  .end((err, res) => {
    try {
      assert.deepEqual(res.body, { search: 'Manny', range: '1..5' });
      next();
    } catch (err_) {
      next(err_);
    }
  });
GET querystring multiple objects
request
  .get(`${uri}/querystring`)
  .query({ search: 'Manny' })
  .query({ range: '1..5' })
  .query({ order: 'desc' })
  .end((err, res) => {
    try {
      assert.deepEqual(res.body, {
        search: 'Manny',
        range: '1..5',
        order: 'desc'
      });
      next();
    } catch (err_) {
      next(err_);
    }
  });
GET querystring with strings
request
  .get(`${uri}/querystring`)
  .query('search=Manny')
  .query('range=1..5')
  .query('order=desc')
  .end((err, res) => {
    try {
      assert.deepEqual(res.body, {
        search: 'Manny',
        range: '1..5',
        order: 'desc'
      });
      next();
    } catch (err_) {
      next(err_);
    }
  });
GET querystring with strings and objects
request
  .get(`${uri}/querystring`)
  .query('search=Manny')
  .query({ order: 'desc', range: '1..5' })
  .end((err, res) => {
    try {
      assert.deepEqual(res.body, {
        search: 'Manny',
        range: '1..5',
        order: 'desc'
      });
      next();
    } catch (err_) {
      next(err_);
    }
  });
GET shorthand payload goes to querystring
request.get(
  `${uri}/querystring`,
  { foo: 'FOO', bar: 'BAR' },
  (err, res) => {
    try {
      assert.deepEqual(res.body, { foo: 'FOO', bar: 'BAR' });
      next();
    } catch (err_) {
      next(err_);
    }
  }
);
HEAD shorthand payload goes to querystring
request.head(
  `${uri}/querystring-in-header`,
  { foo: 'FOO', bar: 'BAR' },
  (err, res) => {
    try {
      assert.deepEqual(JSON.parse(res.headers.query), {
        foo: 'FOO',
        bar: 'BAR'
      });
      next();
    } catch (err_) {
      next(err_);
    }
  }
);
request(method, url)
request('GET', `${uri}/foo`).end((err, res) => {
  try {
    assert.equal('bar', res.body.foo);
    next();
  } catch (err_) {
    next(err_);
  }
});
request(url)
request(`${uri}/foo`).end((err, res) => {
  try {
    assert.equal('bar', res.body.foo);
    next();
  } catch (err_) {
    next(err_);
  }
});
request(url, fn)
request(`${uri}/foo`, (err, res) => {
  try {
    assert.equal('bar', res.body.foo);
    next();
  } catch (err_) {
    next(err_);
  }
});
req.timeout(ms)
const req = request.get(`${uri}/delay/3000`).timeout(1000);
req.end((err, res) => {
  try {
    assert(err, 'error missing');
    assert.equal(1000, err.timeout, 'err.timeout missing');
    assert.equal(
      'Timeout of 1000ms exceeded',
      err.message,
      'err.message incorrect'
    );
    assert.equal(null, res);
    assert(req.timedout, true);
    next();
  } catch (err_) {
    next(err_);
  }
});
req.timeout(ms) with redirect
const req = request.get(`${uri}/delay/const`).timeout(1000);
req.end((err, res) => {
  try {
    assert(err, 'error missing');
    assert.equal(1000, err.timeout, 'err.timeout missing');
    assert.equal(
      'Timeout of 1000ms exceeded',
      err.message,
      'err.message incorrect'
    );
    assert.equal(null, res);
    assert(req.timedout, true);
    next();
  } catch (err_) {
    next(err_);
  }
});
request event
request
  .get(`${uri}/foo`)
  .on('request', (req) => {
    try {
      assert.equal(`${uri}/foo`, req.url);
      next();
    } catch (err) {
      next(err);
    }
  })
  .end();
response event
request
  .get(`${uri}/foo`)
  .on('response', (res) => {
    try {
      assert.equal('bar', res.body.foo);
      next();
    } catch (err) {
      next(err);
    }
  })
  .end();
response should set statusCode
request.get(`${uri}/ok`, (err, res) => {
  try {
    assert.strictEqual(res.statusCode, 200);
    next();
  } catch (err_) {
    next(err_);
  }
});
req.toJSON()
request.get(`${uri}/ok`).end((err, res) => {
  try {
    const j = (res.request || res.req).toJSON();
    ['url', 'method', 'data', 'headers'].forEach((prop) => {
      assert(j.hasOwnProperty(prop));
    });
    next();
  } catch (err_) {
    next(err_);
  }
});

.retry(count)

should not retry if passed "0"
request
  .get(`${base}/error`)
  .retry(0)
  .end((err, res) => {
    try {
      assert(err, 'expected an error');
      assert.equal(
        undefined,
        err.retries,
        'expected an error without .retries'
      );
      assert.equal(500, err.status, 'expected an error status of 500');
      done();
    } catch (err_) {
      done(err_);
    }
  });
should not retry if passed an invalid number
request
  .get(`${base}/error`)
  .retry(-2)
  .end((err, res) => {
    try {
      assert(err, 'expected an error');
      assert.equal(
        undefined,
        err.retries,
        'expected an error without .retries'
      );
      assert.equal(500, err.status, 'expected an error status of 500');
      done();
    } catch (err_) {
      done(err_);
    }
  });
should not retry if passed undefined
request
  .get(`${base}/error`)
  .retry(undefined)
  .end((err, res) => {
    try {
      assert(err, 'expected an error');
      assert.equal(
        undefined,
        err.retries,
        'expected an error without .retries'
      );
      assert.equal(500, err.status, 'expected an error status of 500');
      done();
    } catch (err_) {
      done(err_);
    }
  });
should handle server error after repeat attempt
request
  .get(`${base}/error`)
  .retry(2)
  .end((err, res) => {
    try {
      assert(err, 'expected an error');
      assert.equal(2, err.retries, 'expected an error with .retries');
      assert.equal(500, err.status, 'expected an error status of 500');
      done();
    } catch (err_) {
      done(err_);
    }
  });
should retry if passed nothing
request
  .get(`${base}/error`)
  .retry()
  .end((err, res) => {
    try {
      assert(err, 'expected an error');
      assert.equal(1, err.retries, 'expected an error with .retries');
      assert.equal(500, err.status, 'expected an error status of 500');
      done();
    } catch (err_) {
      done(err_);
    }
  });
should retry if passed "true"
request
  .get(`${base}/error`)
  .retry(true)
  .end((err, res) => {
    try {
      assert(err, 'expected an error');
      assert.equal(1, err.retries, 'expected an error with .retries');
      assert.equal(500, err.status, 'expected an error status of 500');
      done();
    } catch (err_) {
      done(err_);
    }
  });
should handle successful request after repeat attempt from server error
request
  .get(`${base}/error/ok/${uniqid()}`)
  .query({ qs: 'present' })
  .retry(2)
  .end((err, res) => {
    try {
      assert.ifError(err);
      assert(res.ok, 'response should be ok');
      assert(res.text, 'res.text');
      done();
    } catch (err_) {
      done(err_);
    }
  });
should handle server timeout error after repeat attempt
request
  .get(`${base}/delay/400`)
  .timeout(200)
  .retry(2)
  .end((err, res) => {
    try {
      assert(err, 'expected an error');
      assert.equal(2, err.retries, 'expected an error with .retries');
      assert.equal(
        'number',
        typeof err.timeout,
        'expected an error with .timeout'
      );
      assert.equal('ECONNABORTED', err.code, 'expected abort error code');
      done();
    } catch (err_) {
      done(err_);
    }
  });
should handle successful request after repeat attempt from server timeout
const url = `/delay/1200/ok/${uniqid()}?built=in`;
request
  .get(base + url)
  .query('string=ified')
  .query({ json: 'ed' })
  .timeout(600)
  .retry(2)
  .end((err, res) => {
    try {
      assert.ifError(err);
      assert(res.ok, 'response should be ok');
      assert.equal(res.text, `ok = ${url}&string=ified&json=ed`);
      done();
    } catch (err_) {
      done(err_);
    }
  });
should handle successful request after repeat attempt from server timeout when using .then(fulfill, reject)
const url = `/delay/1200/ok/${uniqid()}?built=in`;
request
  .get(base + url)
  .query('string=ified')
  .query({ json: 'ed' })
  .timeout(600)
  .retry(1)
  .then((res, err) => {
    try {
      assert.ifError(err);
      assert(res.ok, 'response should be ok');
      assert.equal(res.text, `ok = ${url}&string=ified&json=ed`);
      done();
    } catch (err_) {
      done(err_);
    }
  });
should correctly abort a retry attempt
let aborted = false;
const req = request.get(`${base}/delay/400`).timeout(200).retry(2);
req.end((err, res) => {
  try {
    assert(false, 'should not complete the request');
  } catch (err_) {
    done(err_);
  }
});
req.on('abort', () => {
  aborted = true;
});
setTimeout(() => {
  req.abort();
  setTimeout(() => {
    try {
      assert(aborted, 'should be aborted');
      done();
    } catch (err) {
      done(err);
    }
  }, 150);
}, 150);
should correctly retain header fields
request
  .get(`${base}/error/ok/${uniqid()}`)
  .query({ qs: 'present' })
  .retry(2)
  .set('X-Foo', 'bar')
  .end((err, res) => {
    try {
      assert.ifError(err);
      assert(res.body);
      res.body.should.have.property('x-foo', 'bar');
      done();
    } catch (err_) {
      done(err_);
    }
  });
should not retry on 4xx responses
request
  .get(`${base}/bad-request`)
  .retry(2)
  .end((err, res) => {
    try {
      assert(err, 'expected an error');
      assert.equal(0, err.retries, 'expected an error with 0 .retries');
      assert.equal(400, err.status, 'expected an error status of 400');
      done();
    } catch (err_) {
      done(err_);
    }
  });
should execute callback on retry if passed
let callbackCallCount = 0;
function retryCallback(request) {
  callbackCallCount++;
}
request
  .get(`${base}/error`)
  .retry(2, retryCallback)
  .end((err, res) => {
    try {
      assert(err, 'expected an error');
      assert.equal(2, err.retries, 'expected an error with .retries');
      assert.equal(500, err.status, 'expected an error status of 500');
      assert.equal(
        2,
        callbackCallCount,
        'expected the callback to be called on each retry'
      );
      done();
    } catch (err_) {
      done(err_);
    }
  });

.timeout(ms)

when timeout is exceeded

should error
request
  .get(`${base}/delay/500`)
  .timeout(150)
  .end((err, res) => {
    assert(err, 'expected an error');
    assert.equal(
      'number',
      typeof err.timeout,
      'expected an error with .timeout'
    );
    assert.equal('ECONNABORTED', err.code, 'expected abort error code');
    done();
  });
should error in promise interface
request
  .get(`${base}/delay/500`)
  .timeout(150)
  .catch((err) => {
    assert(err, 'expected an error');
    assert.equal(
      'number',
      typeof err.timeout,
      'expected an error with .timeout'
    );
    assert.equal('ECONNABORTED', err.code, 'expected abort error code');
    done();
  });
should handle gzip timeout
request
  .get(`${base}/delay/zip`)
  .timeout(150)
  .end((err, res) => {
    assert(err, 'expected an error');
    assert.equal(
      'number',
      typeof err.timeout,
      'expected an error with .timeout'
    );
    assert.equal('ECONNABORTED', err.code, 'expected abort error code');
    done();
  });
should handle buffer timeout
request
  .get(`${base}/delay/json`)
  .buffer(true)
  .timeout(150)
  .end((err, res) => {
    assert(err, 'expected an error');
    assert.equal(
      'number',
      typeof err.timeout,
      'expected an error with .timeout'
    );
    assert.equal('ECONNABORTED', err.code, 'expected abort error code');
    done();
  });
should error on deadline
request
  .get(`${base}/delay/500`)
  .timeout({ deadline: 150 })
  .end((err, res) => {
    assert(err, 'expected an error');
    assert.equal(
      'number',
      typeof err.timeout,
      'expected an error with .timeout'
    );
    assert.equal('ECONNABORTED', err.code, 'expected abort error code');
    done();
  });
should support setting individual options
request
  .get(`${base}/delay/500`)
  .timeout({ deadline: 10 })
  .timeout({ response: 99999 })
  .end((err, res) => {
    assert(err, 'expected an error');
    assert.equal('ECONNABORTED', err.code, 'expected abort error code');
    assert.equal('ETIME', err.errno);
    done();
  });
should error on response
request
  .get(`${base}/delay/500`)
  .timeout({ response: 150 })
  .end((err, res) => {
    assert(err, 'expected an error');
    assert.equal(
      'number',
      typeof err.timeout,
      'expected an error with .timeout'
    );
    assert.equal('ECONNABORTED', err.code, 'expected abort error code');
    assert.equal('ETIMEDOUT', err.errno);
    done();
  });
should accept slow body with fast response
request
  .get(`${base}/delay/slowbody`)
  .timeout({ response: 1000 })
  .on('progress', () => {
    // This only makes the test faster without relying on arbitrary timeouts
    request.get(`${base}/delay/slowbody/finish`).end();
  })
  .end(done);

request

use

should use plugin success
const now = `${Date.now()}`;
function uuid(req) {
  req.set('X-UUID', now);
  return req;
}
function prefix(req) {
  req.url = uri + req.url;
  return req;
}
request
  .get('/echo')
  .use(uuid)
  .use(prefix)
  .end((err, res) => {
    assert.strictEqual(res.statusCode, 200);
    assert.equal(res.get('X-UUID'), now);
    done();
  });

subclass

should be an instance of Request
const req = request.get('/');
assert(req instanceof request.Request);
should use patched subclass
assert(OriginalRequest);
let constructorCalled;
let sendCalled;
function NewRequest(...args) {
  constructorCalled = true;
  OriginalRequest.apply(this, args);
}
NewRequest.prototype = Object.create(OriginalRequest.prototype);
NewRequest.prototype.send = function () {
  sendCalled = true;
  return this;
};
request.Request = NewRequest;
const req = request.get('/').send();
assert(constructorCalled);
assert(sendCalled);
assert(req instanceof NewRequest);
assert(req instanceof OriginalRequest);
should use patched subclass in agent too
if (!request.agent) return; // Node-only
function NewRequest(...args) {
  OriginalRequest.apply(this, args);
}
NewRequest.prototype = Object.create(OriginalRequest.prototype);
request.Request = NewRequest;
const req = request.agent().del('/');
assert(req instanceof NewRequest);
assert(req instanceof OriginalRequest);

request

persistent agent

should gain a session on POST
agent3.post(`${base}/signin`).then((res) => {
        res.should.have.status(200);
        should.not.exist(res.headers['set-cookie']);
        res.text.should.containEql('dashboard');
      })
should start with empty session (set cookies)
agent1.get(`${base}/dashboard`).end((err, res) => {
  should.exist(err);
  res.should.have.status(401);
  should.exist(res.headers['set-cookie']);
  done();
});
should gain a session (cookies already set)
agent1.post(`${base}/signin`).then((res) => {
        res.should.have.status(200);
        should.not.exist(res.headers['set-cookie']);
        res.text.should.containEql('dashboard');
      })
should persist cookies across requests
agent1.get(`${base}/dashboard`).then((res) => {
        res.should.have.status(200);
      })
should have the cookie set in the end callback
agent4
        .post(`${base}/setcookie`)
        .then(() => agent4.get(`${base}/getcookie`))
        .then((res) => {
          res.should.have.status(200);
          assert.strictEqual(res.text, 'jar');
        })
should not share cookies
agent2.get(`${base}/dashboard`).end((err, res) => {
  should.exist(err);
  res.should.have.status(401);
  done();
});
should not lose cookies between agents
agent1.get(`${base}/dashboard`).then((res) => {
        res.should.have.status(200);
      })
should be able to follow redirects
agent1.get(base).then((res) => {
        res.should.have.status(200);
        res.text.should.containEql('dashboard');
      })
should be able to post redirects
agent1
        .post(`${base}/redirect`)
        .send({ foo: 'bar', baz: 'blaaah' })
        .then((res) => {
          res.should.have.status(200);
          res.text.should.containEql('simple');
          res.redirects.should.eql([`${base}/simple`]);
        })
should be able to limit redirects
agent1
  .get(base)
  .redirects(0)
  .end((err, res) => {
    should.exist(err);
    res.should.have.status(302);
    res.redirects.should.eql([]);
    res.header.location.should.equal('/dashboard');
    done();
  });
should be able to create a new session (clear cookie)
agent1.post(`${base}/signout`).then((res) => {
        res.should.have.status(200);
        should.exist(res.headers['set-cookie']);
      })
should regenerate with an empty session
agent1.get(`${base}/dashboard`).end((err, res) => {
  should.exist(err);
  res.should.have.status(401);
  should.not.exist(res.headers['set-cookie']);
  done();
});

Basic auth

when credentials are present in url

should set Authorization
const new_url = URL.parse(base);
new_url.auth = 'tobi:learnboost';
new_url.pathname = '/basic-auth';
request.get(URL.format(new_url)).end((err, res) => {
  res.status.should.equal(200);
  done();
});

req.auth(user, pass)

should set Authorization
request
  .get(`${base}/basic-auth`)
  .auth('tobi', 'learnboost')
  .end((err, res) => {
    res.status.should.equal(200);
    done();
  });

req.auth(user + ":" + pass)

should set authorization
request
  .get(`${base}/basic-auth/again`)
  .auth('tobi')
  .end((err, res) => {
    res.status.should.eql(200);
    done();
  });

[node] request

should send body with .get().send()
request
  .get(`${base}/echo`)
  .set('Content-Type', 'text/plain')
  .send('wahoo')
  .end((err, res) => {
    try {
      assert.equal('wahoo', res.text);
      next();
    } catch (err_) {
      next(err_);
    }
  });

with an url

should preserve the encoding of the url
request.get(`${base}/url?a=(b%29`).end((err, res) => {
  assert.equal('/url?a=(b%29', res.text);
  done();
});

with an object

should format the url
request.get(url.parse(`${base}/login`)).then((res) => {
        assert(res.ok);
      })

without a schema

should default to http
request.get('localhost:5000/login').then((res) => {
        assert.equal(res.status, 200);
      })

res.toJSON()

should describe the response
request
        .post(`${base}/echo`)
        .send({ foo: 'baz' })
        .then((res) => {
          const obj = res.toJSON();
          assert.equal('object', typeof obj.header);
          assert.equal('object', typeof obj.req);
          assert.equal(200, obj.status);
          assert.equal('{"foo":"baz"}', obj.text);
        })

res.links

should default to an empty object
request.get(`${base}/login`).then((res) => {
        res.links.should.eql({});
      })
should parse the Link header field
request.get(`${base}/links`).end((err, res) => {
  res.links.next.should.equal(
    'https://api.github.com/repos/visionmedia/mocha/issues?page=2'
  );
  done();
});

req.unset(field)

should remove the header field
request
  .post(`${base}/echo`)
  .unset('User-Agent')
  .end((err, res) => {
    assert.equal(void 0, res.header['user-agent']);
    done();
  });

case-insensitive

should set/get header fields case-insensitively
const r = request.post(`${base}/echo`);
r.set('MiXeD', 'helloes');
assert.strictEqual(r.get('mixed'), 'helloes');
should unset header fields case-insensitively
const r = request.post(`${base}/echo`);
r.set('MiXeD', 'helloes');
r.unset('MIXED');
assert.strictEqual(r.get('mixed'), undefined);

req.write(str)

should write the given data
const req = request.post(`${base}/echo`);
req.set('Content-Type', 'application/json');
assert.equal('boolean', typeof req.write('{"name"'));
assert.equal('boolean', typeof req.write(':"tobi"}'));
req.end((err, res) => {
  res.text.should.equal('{"name":"tobi"}');
  done();
});

req.pipe(stream)

should pipe the response to the given stream
const stream = new EventEmitter();
stream.buf = '';
stream.writable = true;
stream.write = function (chunk) {
  this.buf += chunk;
};
stream.end = function () {
  this.buf.should.equal('{"name":"tobi"}');
  done();
};
request.post(`${base}/echo`).send('{"name":"tobi"}').pipe(stream);

.buffer()

should enable buffering
request
  .get(`${base}/custom`)
  .buffer()
  .end((err, res) => {
    assert.ifError(err);
    assert.equal('custom stuff', res.text);
    assert(res.buffered);
    done();
  });
should take precedence over request.buffer['someMimeType'] = false
const type = 'application/barbaz';
const send = 'some text';
request.buffer[type] = false;
request
  .post(`${base}/echo`)
  .type(type)
  .send(send)
  .buffer()
  .end((err, res) => {
    delete request.buffer[type];
    assert.ifError(err);
    assert.equal(res.type, type);
    assert.equal(send, res.text);
    assert(res.buffered);
    done();
  });

.buffer(false)

should disable buffering
request
  .post(`${base}/echo`)
  .type('application/x-dog')
  .send('hello this is dog')
  .buffer(false)
  .end((err, res) => {
    assert.ifError(err);
    assert.equal(null, res.text);
    res.body.should.eql({});
    let buf = '';
    res.setEncoding('utf8');
    res.on('data', (chunk) => {
      buf += chunk;
    });
    res.on('end', () => {
      buf.should.equal('hello this is dog');
      done();
    });
  });
should take precedence over request.buffer['someMimeType'] = true
const type = 'application/foobar';
const send = 'hello this is a dog';
request.buffer[type] = true;
request
  .post(`${base}/echo`)
  .type(type)
  .send(send)
  .buffer(false)
  .end((err, res) => {
    delete request.buffer[type];
    assert.ifError(err);
    assert.equal(null, res.text);
    assert.equal(res.type, type);
    assert(!res.buffered);
    res.body.should.eql({});
    let buf = '';
    res.setEncoding('utf8');
    res.on('data', (chunk) => {
      buf += chunk;
    });
    res.on('end', () => {
      buf.should.equal(send);
      done();
    });
  });

.withCredentials()

should not throw an error when using the client-side "withCredentials" method
request
  .get(`${base}/custom`)
  .withCredentials()
  .end((err, res) => {
    assert.ifError(err);
    done();
  });

.agent()

should return the defaut agent
const req = request.post(`${base}/echo`);
req.agent().should.equal(false);
done();

.agent(undefined)

should set an agent to undefined and ensure it is chainable
const req = request.get(`${base}/echo`);
const ret = req.agent(undefined);
ret.should.equal(req);
assert.strictEqual(req.agent(), undefined);
done();

.agent(new http.Agent())

should set passed agent
const http = require('http');
const req = request.get(`${base}/echo`);
const agent = new http.Agent();
const ret = req.agent(agent);
ret.should.equal(req);
req.agent().should.equal(agent);
done();

with a content type other than application/json or text/*

should still use buffering
return request
  .post(`${base}/echo`)
  .type('application/x-dog')
  .send('hello this is dog')
  .then((res) => {
    assert.equal(null, res.text);
    assert.equal(res.body.toString(), 'hello this is dog');
    res.buffered.should.be.true;
  });

content-length

should be set to the byte length of a non-buffer object
const decoder = new StringDecoder('utf8');
let img = fs.readFileSync(`${__dirname}/fixtures/test.png`);
img = decoder.write(img);
request
  .post(`${base}/echo`)
  .type('application/x-image')
  .send(img)
  .buffer(false)
  .end((err, res) => {
    assert.ifError(err);
    assert(!res.buffered);
    assert.equal(res.header['content-length'], Buffer.byteLength(img));
    done();
  });
should be set to the length of a buffer object
const img = fs.readFileSync(`${__dirname}/fixtures/test.png`);
request
  .post(`${base}/echo`)
  .type('application/x-image')
  .send(img)
  .buffer(true)
  .end((err, res) => {
    assert.ifError(err);
    assert(res.buffered);
    assert.equal(res.header['content-length'], img.length);
    done();
  });

req.buffer['someMimeType']

should respect that agent.buffer(true) takes precedent
const agent = request.agent();
agent.buffer(true);
const type = 'application/somerandomtype';
const send = 'somerandomtext';
request.buffer[type] = false;
agent
  .post(`${base}/echo`)
  .type(type)
  .send(send)
  .end((err, res) => {
    delete request.buffer[type];
    assert.ifError(err);
    assert.equal(res.type, type);
    assert.equal(send, res.text);
    assert(res.buffered);
    done();
  });
should respect that agent.buffer(false) takes precedent
const agent = request.agent();
agent.buffer(false);
const type = 'application/barrr';
const send = 'some random text2';
request.buffer[type] = true;
agent
  .post(`${base}/echo`)
  .type(type)
  .send(send)
  .end((err, res) => {
    delete request.buffer[type];
    assert.ifError(err);
    assert.equal(null, res.text);
    assert.equal(res.type, type);
    assert(!res.buffered);
    res.body.should.eql({});
    let buf = '';
    res.setEncoding('utf8');
    res.on('data', (chunk) => {
      buf += chunk;
    });
    res.on('end', () => {
      buf.should.equal(send);
      done();
    });
  });
should disable buffering for that mimetype when false
const type = 'application/bar';
const send = 'some random text';
request.buffer[type] = false;
request
  .post(`${base}/echo`)
  .type(type)
  .send(send)
  .end((err, res) => {
    delete request.buffer[type];
    assert.ifError(err);
    assert.equal(null, res.text);
    assert.equal(res.type, type);
    assert(!res.buffered);
    res.body.should.eql({});
    let buf = '';
    res.setEncoding('utf8');
    res.on('data', (chunk) => {
      buf += chunk;
    });
    res.on('end', () => {
      buf.should.equal(send);
      done();
    });
  });
should enable buffering for that mimetype when true
const type = 'application/baz';
const send = 'woooo';
request.buffer[type] = true;
request
  .post(`${base}/echo`)
  .type(type)
  .send(send)
  .end((err, res) => {
    delete request.buffer[type];
    assert.ifError(err);
    assert.equal(res.type, type);
    assert.equal(send, res.text);
    assert(res.buffered);
    done();
  });
should fallback to default handling for that mimetype when undefined
const type = 'application/bazzz';
const send = 'woooooo';
return request
  .post(`${base}/echo`)
  .type(type)
  .send(send)
  .then((res) => {
    assert.equal(res.type, type);
    assert.equal(send, res.body.toString());
    assert(res.buffered);
  });

exports

should expose .protocols
Object.keys(request.protocols).should.eql(['http:', 'https:', 'http2:']);
should expose .serialize
Object.keys(request.serialize).should.eql([
  'application/x-www-form-urlencoded',
  'application/json'
]);
should expose .parse
Object.keys(request.parse).should.eql([
  'application/x-www-form-urlencoded',
  'application/json',
  'text',
  'application/octet-stream',
  'application/pdf',
  'image'
]);
should export .buffer
Object.keys(request.buffer).should.eql([]);

flags

with 4xx response

should set res.error and res.clientError
request.get(`${base}/notfound`).end((err, res) => {
  assert(err);
  assert(!res.ok, 'response should not be ok');
  assert(res.error, 'response should be an error');
  assert(res.clientError, 'response should be a client error');
  assert(!res.serverError, 'response should not be a server error');
  done();
});

with 5xx response

should set res.error and res.serverError
request.get(`${base}/error`).end((err, res) => {
  assert(err);
  assert(!res.ok, 'response should not be ok');
  assert(!res.notFound, 'response should not be notFound');
  assert(res.error, 'response should be an error');
  assert(!res.clientError, 'response should not be a client error');
  assert(res.serverError, 'response should be a server error');
  done();
});

with 404 Not Found

should res.notFound
request.get(`${base}/notfound`).end((err, res) => {
  assert(err);
  assert(res.notFound, 'response should be .notFound');
  done();
});

with 400 Bad Request

should set req.badRequest
request.get(`${base}/bad-request`).end((err, res) => {
  assert(err);
  assert(res.badRequest, 'response should be .badRequest');
  done();
});

with 401 Bad Request

should set res.unauthorized
request.get(`${base}/unauthorized`).end((err, res) => {
  assert(err);
  assert(res.unauthorized, 'response should be .unauthorized');
  done();
});

with 406 Not Acceptable

should set res.notAcceptable
request.get(`${base}/not-acceptable`).end((err, res) => {
  assert(err);
  assert(res.notAcceptable, 'response should be .notAcceptable');
  done();
});

with 204 No Content

should set res.noContent
request.get(`${base}/no-content`).end((err, res) => {
  assert(!err);
  assert(res.noContent, 'response should be .noContent');
  done();
});

with 201 Created

should set res.created
request.post(`${base}/created`).end((err, res) => {
  assert(!err);
  assert(res.created, 'response should be .created');
  done();
});

with 422 Unprocessable Entity

should set res.unprocessableEntity
request.post(`${base}/unprocessable-entity`).end((err, res) => {
  assert(err);
  assert(
    res.unprocessableEntity,
    'response should be .unprocessableEntity'
  );
  done();
});

Merging objects

Don't mix Buffer and JSON
assert.throws(() => {
  request
    .post('/echo')
    .send(Buffer.from('some buffer'))
    .send({ allowed: false });
});

req.send(String)

should default to "form"
request
  .post(`${base}/echo`)
  .send('user[name]=tj')
  .send('user[email]=tj@vision-media.ca')
  .end((err, res) => {
    res.header['content-type'].should.equal(
      'application/x-www-form-urlencoded'
    );
    res.body.should.eql({
      user: { name: 'tj', email: 'tj@vision-media.ca' }
    });
    done();
  });

res.body

application/x-www-form-urlencoded

should parse the body
request.get(`${base}/form-data`).end((err, res) => {
  res.text.should.equal('pet[name]=manny');
  res.body.should.eql({ pet: { name: 'manny' } });
  done();
});

https

certificate authority

request

should give a good response
request
  .get(testEndpoint)
  .ca(ca)
  .end((err, res) => {
    assert.ifError(err);
    assert(res.ok);
    assert.strictEqual('Safe and secure!', res.text);
    done();
  });
should reject unauthorized response
return request
  .get(testEndpoint)
  .trustLocalhost(false)
  .then(
    () => {
      throw new Error('Allows MITM');
    },
    () => {}
  );
should not reject unauthorized response
return request
  .get(testEndpoint)
  .disableTLSCerts()
  .then(({ status }) => {
    assert.strictEqual(status, 200);
  });
should trust localhost unauthorized response
return request.get(testEndpoint).trustLocalhost(true);
should trust overriden localhost unauthorized response
return request
  .get(`https://example.com:${server.address().port}`)
  .connect('127.0.0.1')
  .trustLocalhost();

.agent

should be able to make multiple requests without redefining the certificate
const agent = request.agent({ ca });
agent.get(testEndpoint).end((err, res) => {
  assert.ifError(err);
  assert(res.ok);
  assert.strictEqual('Safe and secure!', res.text);
  agent.get(url.parse(testEndpoint)).end((err, res) => {
    assert.ifError(err);
    assert(res.ok);
    assert.strictEqual('Safe and secure!', res.text);
    done();
  });
});

client certificates

request

.agent

res.body

image/png

should parse the body
request.get(`${base}/image`).end((err, res) => {
  res.type.should.equal('image/png');
  Buffer.isBuffer(res.body).should.be.true();
  (res.body.length - img.length).should.equal(0);
  done();
});

application/octet-stream

should parse the body
request
  .get(`${base}/image-as-octets`)
  .buffer(true) // that's tech debt :(
  .end((err, res) => {
    res.type.should.equal('application/octet-stream');
    Buffer.isBuffer(res.body).should.be.true();
    (res.body.length - img.length).should.equal(0);
    done();
  });

application/octet-stream

should parse the body (using responseType)
request
  .get(`${base}/image-as-octets`)
  .responseType('blob')
  .end((err, res) => {
    res.type.should.equal('application/octet-stream');
    Buffer.isBuffer(res.body).should.be.true();
    (res.body.length - img.length).should.equal(0);
    done();
  });

zlib

should deflate the content
request.get(base).end((err, res) => {
  res.should.have.status(200);
  res.text.should.equal(subject);
  res.headers['content-length'].should.be.below(subject.length);
  done();
});
should protect from zip bombs
request
  .get(base)
  .buffer(true)
  .maxResponseSize(1)
  .end((err, res) => {
    try {
      assert.equal('Maximum response size reached', err && err.message);
      done();
    } catch (err_) {
      done(err_);
    }
  });
should ignore trailing junk
request.get(`${base}/junk`).end((err, res) => {
  res.should.have.status(200);
  res.text.should.equal(subject);
  done();
});
should ignore missing data
request.get(`${base}/chopped`).end((err, res) => {
  assert.equal(undefined, err);
  res.should.have.status(200);
  res.text.should.startWith(subject);
  done();
});
should handle corrupted responses
request.get(`${base}/corrupt`).end((err, res) => {
  assert(err, 'missing error');
  assert(!res, 'response should not be defined');
  done();
});
should handle no content with gzip header
request.get(`${base}/nocontent`).end((err, res) => {
  assert.ifError(err);
  assert(res);
  res.should.have.status(204);
  res.text.should.equal('');
  res.headers.should.not.have.property('content-length');
  done();
});

without encoding set

should buffer if asked
return request
  .get(`${base}/binary`)
  .buffer(true)
  .then((res) => {
    res.should.have.status(200);
    assert(res.headers['content-length']);
    assert(res.body.byteLength);
    assert.equal(subject, res.body.toString());
  });
should emit buffers
request.get(`${base}/binary`).end((err, res) => {
  res.should.have.status(200);
  res.headers['content-length'].should.be.below(subject.length);
  res.on('data', (chunk) => {
    chunk.should.have.length(subject.length);
  });
  res.on('end', done);
});

Multipart

#field(name, value)

should set a multipart field value
const req = request.post(`${base}/echo`);
req.field('user[name]', 'tobi');
req.field('user[age]', '2');
req.field('user[species]', 'ferret');
return req.then((res) => {
  res.body['user[name]'].should.equal('tobi');
  res.body['user[age]'].should.equal('2');
  res.body['user[species]'].should.equal('ferret');
});
should work with file attachments
const req = request.post(`${base}/echo`);
req.field('name', 'Tobi');
req.attach('document', 'test/node/fixtures/user.html');
req.field('species', 'ferret');
return req.then((res) => {
  res.body.name.should.equal('Tobi');
  res.body.species.should.equal('ferret');
  const html = res.files.document;
  html.name.should.equal('user.html');
  html.type.should.equal('text/html');
  read(html.path).should.equal('<h1>name</h1>');
});

#attach(name, path)

should attach a file
const req = request.post(`${base}/echo`);
req.attach('one', 'test/node/fixtures/user.html');
req.attach('two', 'test/node/fixtures/user.json');
req.attach('three', 'test/node/fixtures/user.txt');
return req.then((res) => {
  const html = res.files.one;
  const json = res.files.two;
  const text = res.files.three;
  html.name.should.equal('user.html');
  html.type.should.equal('text/html');
  read(html.path).should.equal('<h1>name</h1>');
  json.name.should.equal('user.json');
  json.type.should.equal('application/json');
  read(json.path).should.equal('{"name":"tobi"}');
  text.name.should.equal('user.txt');
  text.type.should.equal('text/plain');
  read(text.path).should.equal('Tobi');
});

when a file does not exist

should fail the request with an error
const req = request.post(`${base}/echo`);
req.attach('name', 'foo');
req.attach('name2', 'bar');
req.attach('name3', 'baz');
req.end((err, res) => {
  assert.ok(Boolean(err), 'Request should have failed.');
  err.code.should.equal('ENOENT');
  err.message.should.containEql('ENOENT');
  err.path.should.equal('foo');
  done();
});
promise should fail
return request
  .post(`${base}/echo`)
  .field({ a: 1, b: 2 })
  .attach('c', 'does-not-exist.txt')
  .then(
    (res) => assert.fail('It should not allow this'),
    (err) => {
      err.code.should.equal('ENOENT');
      err.path.should.equal('does-not-exist.txt');
    }
  );
should report ECONNREFUSED via the callback
request
  .post('http://127.0.0.1:1') // nobody is listening there
  .attach('name', 'file-does-not-exist')
  .end((err, res) => {
    assert.ok(Boolean(err), 'Request should have failed');
    err.code.should.equal('ECONNREFUSED');
    done();
  });
should report ECONNREFUSED via Promise
return request
  .post('http://127.0.0.1:1') // nobody is listening there
  .attach('name', 'file-does-not-exist')
  .then(
    (res) => assert.fail('Request should have failed'),
    (err) => err.code.should.equal('ECONNREFUSED')
  );

#attach(name, path, filename)

should use the custom filename
request
        .post(`${base}/echo`)
        .attach('document', 'test/node/fixtures/user.html', 'doc.html')
        .then((res) => {
          const html = res.files.document;
          html.name.should.equal('doc.html');
          html.type.should.equal('text/html');
          read(html.path).should.equal('<h1>name</h1>');
        })
should fire progress event
let loaded = 0;
let total = 0;
let uploadEventWasFired = false;
request
  .post(`${base}/echo`)
  .attach('document', 'test/node/fixtures/user.html')
  .on('progress', (event) => {
    total = event.total;
    loaded = event.loaded;
    if (event.direction === 'upload') {
      uploadEventWasFired = true;
    }
  })
  .end((err, res) => {
    if (err) return done(err);
    const html = res.files.document;
    html.name.should.equal('user.html');
    html.type.should.equal('text/html');
    read(html.path).should.equal('<h1>name</h1>');
    total.should.equal(223);
    loaded.should.equal(223);
    uploadEventWasFired.should.equal(true);
    done();
  });
filesystem errors should be caught
request
  .post(`${base}/echo`)
  .attach('filedata', 'test/node/fixtures/non-existent-file.ext')
  .end((err, res) => {
    assert.ok(Boolean(err), 'Request should have failed.');
    err.code.should.equal('ENOENT');
    err.path.should.equal('test/node/fixtures/non-existent-file.ext');
    done();
  });

#field(name, val)

should set a multipart field value
request
  .post(`${base}/echo`)
  .field('first-name', 'foo')
  .field('last-name', 'bar')
  .end((err, res) => {
    if (err) done(err);
    res.should.be.ok();
    res.body['first-name'].should.equal('foo');
    res.body['last-name'].should.equal('bar');
    done();
  });

#field(object)

should set multiple multipart fields
request
  .post(`${base}/echo`)
  .field({ 'first-name': 'foo', 'last-name': 'bar' })
  .end((err, res) => {
    if (err) done(err);
    res.should.be.ok();
    res.body['first-name'].should.equal('foo');
    res.body['last-name'].should.equal('bar');
    done();
  });

with network error

should error
request.get(`http://localhost:${this.port}/`).end((err, res) => {
  assert(err, 'expected an error');
  done();
});

request

not modified

should start with 200
request.get(`${base}/if-mod`).end((err, res) => {
  res.should.have.status(200);
  res.text.should.match(/^\d+$/);
  ts = Number(res.text);
  done();
});
should then be 304
request
  .get(`${base}/if-mod`)
  .set('If-Modified-Since', new Date(ts).toUTCString())
  .end((err, res) => {
    res.should.have.status(304);
    // res.text.should.be.empty
    done();
  });

req.parse(fn)

should take precedence over default parsers
request
  .get(`${base}/manny`)
  .parse(request.parse['application/json'])
  .end((err, res) => {
    assert(res.ok);
    assert.equal('{"name":"manny"}', res.text);
    assert.equal('manny', res.body.name);
    done();
  });
should be the only parser
request
      .get(`${base}/image`)
      .buffer(false)
      .parse((res, fn) => {
        res.on('data', () => {});
      })
      .then((res) => {
        assert(res.ok);
        assert.strictEqual(res.text, undefined);
        res.body.should.eql({});
      })
should emit error if parser throws
request
  .get(`${base}/manny`)
  .parse(() => {
    throw new Error('I am broken');
  })
  .on('error', (err) => {
    err.message.should.equal('I am broken');
    done();
  })
  .end();
should emit error if parser returns an error
request
  .get(`${base}/manny`)
  .parse((res, fn) => {
    fn(new Error('I am broken'));
  })
  .on('error', (err) => {
    err.message.should.equal('I am broken');
    done();
  })
  .end();
should not emit error on chunked json
request.get(`${base}/chunked-json`).end((err) => {
  assert.ifError(err);
  done();
});
should not emit error on aborted chunked json
const req = request.get(`${base}/chunked-json`);
req.end((err) => {
  assert.ifError(err);
  done();
});
setTimeout(() => {
  req.abort();
}, 50);

pipe on redirect

should follow Location
const stream = fs.createWriteStream(destPath);
const redirects = [];
const req = request
  .get(base)
  .on('redirect', (res) => {
    redirects.push(res.headers.location);
  })
  .connect({
    inapplicable: 'should be ignored'
  });
stream.on('finish', () => {
  redirects.should.eql(['/movies', '/movies/all', '/movies/all/0']);
  fs.readFileSync(destPath, 'utf8').should.eql('first movie page');
  done();
});
req.pipe(stream);

request pipe

should act as a writable stream
const req = request.post(base);
const stream = fs.createReadStream('test/node/fixtures/user.json');
req.type('json');
req.on('response', (res) => {
  res.body.should.eql({ name: 'tobi' });
  done();
});
stream.pipe(req);
end() stops piping
const stream = fs.createWriteStream(destPath);
request.get(base).end((err, res) => {
  try {
    res.pipe(stream);
    return done(new Error('Did not prevent nonsense pipe'));
  } catch {
    /* expected error */
  }
  done();
});
should act as a readable stream
const stream = fs.createWriteStream(destPath);
let responseCalled = false;
const req = request.get(base);
req.type('json');
req.on('response', (res) => {
  res.status.should.eql(200);
  responseCalled = true;
});
stream.on('finish', () => {
  JSON.parse(fs.readFileSync(destPath, 'utf8')).should.eql({
    name: 'tobi'
  });
  responseCalled.should.be.true();
  done();
});
req.pipe(stream);
should follow redirects
const stream = fs.createWriteStream(destPath);
let responseCalled = false;
const req = request.get(base + '/redirect');
req.type('json');
req.on('response', (res) => {
  res.status.should.eql(200);
  responseCalled = true;
});
stream.on('finish', () => {
  JSON.parse(fs.readFileSync(destPath, 'utf8')).should.eql({
    name: 'tobi'
  });
  responseCalled.should.be.true();
  done();
});
req.pipe(stream);
should not throw on bad redirects
const stream = fs.createWriteStream(destPath);
let responseCalled = false;
let errorCalled = false;
const req = request.get(base + '/badRedirectNoLocation');
req.type('json');
req.on('response', (res) => {
  responseCalled = true;
});
req.on('error', (err) => {
  err.message.should.eql('No location header for redirect');
  errorCalled = true;
  stream.end();
});
stream.on('finish', () => {
  responseCalled.should.be.false();
  errorCalled.should.be.true();
  done();
});
req.pipe(stream);

req.query(String)

should support passing in a string
request
  .del(base)
  .query('name=t%F6bi')
  .end((err, res) => {
    res.body.should.eql({ name: 't%F6bi' });
    done();
  });
should work with url query-string and string for query
request
  .del(`${base}/?name=tobi`)
  .query('age=2%20')
  .end((err, res) => {
    res.body.should.eql({ name: 'tobi', age: '2 ' });
    done();
  });
should support compound elements in a string
request
  .del(base)
  .query('name=t%F6bi&age=2')
  .end((err, res) => {
    res.body.should.eql({ name: 't%F6bi', age: '2' });
    done();
  });
should work when called multiple times with a string
request
  .del(base)
  .query('name=t%F6bi')
  .query('age=2%F6')
  .end((err, res) => {
    res.body.should.eql({ name: 't%F6bi', age: '2%F6' });
    done();
  });
should work with normal `query` object and query string
request
  .del(base)
  .query('name=t%F6bi')
  .query({ age: '2' })
  .end((err, res) => {
    res.body.should.eql({ name: 't%F6bi', age: '2' });
    done();
  });
should not encode raw backticks, but leave encoded ones as is
return Promise.all([
  request
    .get(`${base}/raw-query`)
    .query('name=`t%60bi`&age`=2')
    .then((res) => {
      res.text.should.eql('name=`t%60bi`&age`=2');
    }),
  request.get(base + '/raw-query?`age%60`=2%60`').then((res) => {
    res.text.should.eql('`age%60`=2%60`');
  }),
  request
    .get(`${base}/raw-query`)
    .query('name=`t%60bi`')
    .query('age`=2')
    .then((res) => {
      res.text.should.eql('name=`t%60bi`&age`=2');
    })
]);

req.query(Object)

should construct the query-string
request
  .del(base)
  .query({ name: 'tobi' })
  .query({ order: 'asc' })
  .query({ limit: ['1', '2'] })
  .end((err, res) => {
    res.body.should.eql({ name: 'tobi', order: 'asc', limit: ['1', '2'] });
    done();
  });
should encode raw backticks
request
  .get(`${base}/raw-query`)
  .query({ name: '`tobi`' })
  .query({ 'orde%60r': null })
  .query({ '`limit`': ['%602`'] })
  .end((err, res) => {
    res.text.should.eql('name=%60tobi%60&orde%2560r&%60limit%60=%25602%60');
    done();
  });
should not error on dates
const date = new Date(0);
request
  .del(base)
  .query({ at: date })
  .end((err, res) => {
    assert.equal(date.toISOString(), res.body.at);
    done();
  });
should work after setting header fields
request
  .del(base)
  .set('Foo', 'bar')
  .set('Bar', 'baz')
  .query({ name: 'tobi' })
  .query({ order: 'asc' })
  .query({ limit: ['1', '2'] })
  .end((err, res) => {
    res.body.should.eql({ name: 'tobi', order: 'asc', limit: ['1', '2'] });
    done();
  });
should append to the original query-string
request
  .del(`${base}/?name=tobi`)
  .query({ order: 'asc' })
  .end((err, res) => {
    res.body.should.eql({ name: 'tobi', order: 'asc' });
    done();
  });
should retain the original query-string
request.del(`${base}/?name=tobi`).end((err, res) => {
  res.body.should.eql({ name: 'tobi' });
  done();
});
should keep only keys with null querystring values
request
  .del(`${base}/url`)
  .query({ nil: null })
  .end((err, res) => {
    res.text.should.equal('/url?nil');
    done();
  });
query-string should be sent on pipe
const req = request.put(`${base}/?name=tobi`);
const stream = fs.createReadStream('test/node/fixtures/user.json');
req.on('response', (res) => {
  res.body.should.eql({ name: 'tobi' });
  done();
});
stream.pipe(req);

request.get

on 301 redirect

should follow Location with a GET request
const req = request.get(`${base}/test-301`).redirects(1);
req.end((err, res) => {
  const headers = req.req.getHeaders
    ? req.req.getHeaders()
    : req.req._headers;
  headers.host.should.eql(`localhost:${server2.address().port}`);
  res.status.should.eql(200);
  res.text.should.eql('GET');
  done();
});

on 302 redirect

should follow Location with a GET request
const req = request.get(`${base}/test-302`).redirects(1);
req.end((err, res) => {
  const headers = req.req.getHeaders
    ? req.req.getHeaders()
    : req.req._headers;
  res.status.should.eql(200);
  res.text.should.eql('GET');
  done();
});

on 303 redirect

should follow Location with a GET request
const req = request.get(`${base}/test-303`).redirects(1);
req.end((err, res) => {
  const headers = req.req.getHeaders
    ? req.req.getHeaders()
    : req.req._headers;
  headers.host.should.eql(`localhost:${server2.address().port}`);
  res.status.should.eql(200);
  res.text.should.eql('GET');
  done();
});

on 307 redirect

should follow Location with a GET request
const req = request.get(`${base}/test-307`).redirects(1);
req.end((err, res) => {
  const headers = req.req.getHeaders
    ? req.req.getHeaders()
    : req.req._headers;
  headers.host.should.eql(`localhost:${server2.address().port}`);
  res.status.should.eql(200);
  res.text.should.eql('GET');
  done();
});

on 308 redirect

should follow Location with a GET request
const req = request.get(`${base}/test-308`).redirects(1);
req.end((err, res) => {
  const headers = req.req.getHeaders
    ? req.req.getHeaders()
    : req.req._headers;
  headers.host.should.eql(`localhost:${server2.address().port}`);
  res.status.should.eql(200);
  res.text.should.eql('GET');
  done();
});

request.post

on 301 redirect

should follow Location with a GET request
const req = request.post(`${base}/test-301`).redirects(1);
req.end((err, res) => {
  const headers = req.req.getHeaders
    ? req.req.getHeaders()
    : req.req._headers;
  headers.host.should.eql(`localhost:${server2.address().port}`);
  res.status.should.eql(200);
  res.text.should.eql('GET');
  done();
});

on 302 redirect

should follow Location with a GET request
const req = request.post(`${base}/test-302`).redirects(1);
req.end((err, res) => {
  const headers = req.req.getHeaders
    ? req.req.getHeaders()
    : req.req._headers;
  headers.host.should.eql(`localhost:${server2.address().port}`);
  res.status.should.eql(200);
  res.text.should.eql('GET');
  done();
});

on 303 redirect

should follow Location with a GET request
const req = request.post(`${base}/test-303`).redirects(1);
req.end((err, res) => {
  const headers = req.req.getHeaders
    ? req.req.getHeaders()
    : req.req._headers;
  headers.host.should.eql(`localhost:${server2.address().port}`);
  res.status.should.eql(200);
  res.text.should.eql('GET');
  done();
});

on 307 redirect

should follow Location with a POST request
const req = request.post(`${base}/test-307`).redirects(1);
req.end((err, res) => {
  const headers = req.req.getHeaders
    ? req.req.getHeaders()
    : req.req._headers;
  headers.host.should.eql(`localhost:${server2.address().port}`);
  res.status.should.eql(200);
  res.text.should.eql('POST');
  done();
});

on 308 redirect

should follow Location with a POST request
const req = request.post(`${base}/test-308`).redirects(1);
req.end((err, res) => {
  const headers = req.req.getHeaders
    ? req.req.getHeaders()
    : req.req._headers;
  headers.host.should.eql(`localhost:${server2.address().port}`);
  res.status.should.eql(200);
  res.text.should.eql('POST');
  done();
});

request

on redirect

should merge cookies if agent is used
request
  .agent()
  .get(`${base}/cookie-redirect`)
  .set('Cookie', 'orig=1; replaced=not')
  .end((err, res) => {
    try {
      assert.ifError(err);
      assert(/orig=1/.test(res.text), 'orig=1/.test');
      assert(/replaced=yes/.test(res.text), 'replaced=yes/.test');
      assert(/from-redir=1/.test(res.text), 'from-redir=1');
      done();
    } catch (err_) {
      done(err_);
    }
  });
should not merge cookies if agent is not used
request
  .get(`${base}/cookie-redirect`)
  .set('Cookie', 'orig=1; replaced=not')
  .end((err, res) => {
    try {
      assert.ifError(err);
      assert(/orig=1/.test(res.text), '/orig=1');
      assert(/replaced=not/.test(res.text), '/replaced=not');
      assert(!/replaced=yes/.test(res.text), '!/replaced=yes');
      assert(!/from-redir/.test(res.text), '!/from-redir');
      done();
    } catch (err_) {
      done(err_);
    }
  });
should have previously set cookie for subsquent requests when agent is used
const agent = request.agent();
agent.get(`${base}/set-cookie`).end((err) => {
  assert.ifError(err);
  agent
    .get(`${base}/show-cookies`)
    .set({ Cookie: 'orig=1' })
    .end((err, res) => {
      try {
        assert.ifError(err);
        assert(/orig=1/.test(res.text), 'orig=1/.test');
        assert(/persist=123/.test(res.text), 'persist=123');
        done();
      } catch (err_) {
        done(err_);
      }
    });
});
should follow Location
const redirects = [];
request
  .get(base)
  .on('redirect', (res) => {
    redirects.push(res.headers.location);
  })
  .end((err, res) => {
    try {
      const arr = ['/movies', '/movies/all', '/movies/all/0'];
      redirects.should.eql(arr);
      res.text.should.equal('first movie page');
      done();
    } catch (err_) {
      done(err_);
    }
  });
should follow Location with IP override
const redirects = [];
const url = URL.parse(base);
return request
  .get(`http://redir.example.com:${url.port || '80'}${url.pathname}`)
  .connect({
    '*': url.hostname
  })
  .on('redirect', (res) => {
    redirects.push(res.headers.location);
  })
  .then((res) => {
    const arr = ['/movies', '/movies/all', '/movies/all/0'];
    redirects.should.eql(arr);
    res.text.should.equal('first movie page');
  });
should follow Location with IP:port override
const redirects = [];
const url = URL.parse(base);
return request
  .get(`http://redir.example.com:9999${url.pathname}`)
  .connect({
    '*': { host: url.hostname, port: url.port || 80 }
  })
  .on('redirect', (res) => {
    redirects.push(res.headers.location);
  })
  .then((res) => {
    const arr = ['/movies', '/movies/all', '/movies/all/0'];
    redirects.should.eql(arr);
    res.text.should.equal('first movie page');
  });
should not follow on HEAD by default
const redirects = [];
return request
  .head(base)
  .ok(() => true)
  .on('redirect', (res) => {
    redirects.push(res.headers.location);
  })
  .then((res) => {
    redirects.should.eql([]);
    res.status.should.equal(302);
  });
should follow on HEAD when redirects are set
const redirects = [];
request
  .head(base)
  .redirects(10)
  .on('redirect', (res) => {
    redirects.push(res.headers.location);
  })
  .end((err, res) => {
    try {
      const arr = [];
      arr.push('/movies');
      arr.push('/movies/all');
      arr.push('/movies/all/0');
      redirects.should.eql(arr);
      assert(!res.text);
      done();
    } catch (err_) {
      done(err_);
    }
  });
should remove Content-* fields
request
  .post(`${base}/header`)
  .type('txt')
  .set('X-Foo', 'bar')
  .set('X-Bar', 'baz')
  .send('hey')
  .end((err, res) => {
    try {
      assert(res.body);
      res.body.should.have.property('x-foo', 'bar');
      res.body.should.have.property('x-bar', 'baz');
      res.body.should.not.have.property('content-type');
      res.body.should.not.have.property('content-length');
      res.body.should.not.have.property('transfer-encoding');
      done();
    } catch (err_) {
      done(err_);
    }
  });
should retain cookies
request
  .get(`${base}/header`)
  .set('Cookie', 'foo=bar;')
  .end((err, res) => {
    try {
      assert(res.body);
      res.body.should.have.property('cookie', 'foo=bar;');
      done();
    } catch (err_) {
      done(err_);
    }
  });
should not resend query parameters
const redirects = [];
const query = [];
request
  .get(`${base}/?foo=bar`)
  .on('redirect', (res) => {
    query.push(res.headers.query);
    redirects.push(res.headers.location);
  })
  .end((err, res) => {
    try {
      const arr = [];
      arr.push('/movies');
      arr.push('/movies/all');
      arr.push('/movies/all/0');
      redirects.should.eql(arr);
      res.text.should.equal('first movie page');
      query.should.eql(['{"foo":"bar"}', '{}', '{}']);
      res.headers.query.should.eql('{}');
      done();
    } catch (err_) {
      done(err_);
    }
  });
should handle no location header
request.get(`${base}/bad-redirect`).end((err, res) => {
  try {
    err.message.should.equal('No location header for redirect');
    done();
  } catch (err_) {
    done(err_);
  }
});

when relative

should redirect to a sibling path
const redirects = [];
request
  .get(`${base}/relative`)
  .on('redirect', (res) => {
    redirects.push(res.headers.location);
  })
  .end((err, res) => {
    try {
      redirects.should.eql(['tobi']);
      res.text.should.equal('tobi');
      done();
    } catch (err_) {
      done(err_);
    }
  });
should redirect to a parent path
const redirects = [];
request
  .get(`${base}/relative/sub`)
  .on('redirect', (res) => {
    redirects.push(res.headers.location);
  })
  .end((err, res) => {
    try {
      redirects.should.eql(['../tobi']);
      res.text.should.equal('tobi');
      done();
    } catch (err_) {
      done(err_);
    }
  });

req.redirects(n)

should alter the default number of redirects to follow
const redirects = [];
request
  .get(base)
  .redirects(2)
  .on('redirect', (res) => {
    redirects.push(res.headers.location);
  })
  .end((err, res) => {
    try {
      const arr = [];
      assert(res.redirect, 'res.redirect');
      arr.push('/movies');
      arr.push('/movies/all');
      redirects.should.eql(arr);
      res.text.should.match(/Moved Temporarily|Found/);
      done();
    } catch (err_) {
      done(err_);
    }
  });

on POST

should redirect as GET
const redirects = [];
return request
  .post(`${base}/movie`)
  .send({ name: 'Tobi' })
  .redirects(2)
  .on('redirect', (res) => {
    redirects.push(res.headers.location);
  })
  .then((res) => {
    redirects.should.eql(['/movies/all/0']);
    res.text.should.equal('first movie page');
  });
using multipart/form-data should redirect as GET
const redirects = [];
request
  .post(`${base}/movie`)
  .type('form')
  .field('name', 'Tobi')
  .redirects(2)
  .on('redirect', (res) => {
    redirects.push(res.headers.location);
  })
  .then((res) => {
    redirects.should.eql(['/movies/all/0']);
    res.text.should.equal('first movie page');
  });

response

should act as a readable stream
const req = request.get(base).buffer(false);
req.end((err, res) => {
  if (err) return done(err);
  let trackEndEvent = 0;
  let trackCloseEvent = 0;
  res.on('end', () => {
    trackEndEvent++;
    trackEndEvent.should.equal(1);
    if (!process.env.HTTP2_TEST) {
      trackCloseEvent.should.equal(0); // close should not have been called
    }
    done();
  });
  res.on('close', () => {
    trackCloseEvent++;
  });
  (() => {
    res.pause();
  }).should.not.throw();
  (() => {
    res.resume();
  }).should.not.throw();
  (() => {
    res.destroy();
  }).should.not.throw();
});

req.serialize(fn)

should take precedence over default parsers
request
  .post(`${base}/echo`)
  .send({ foo: 123 })
  .serialize((data) => '{"bar":456}')
  .end((err, res) => {
    assert.ifError(err);
    assert.equal('{"bar":456}', res.text);
    assert.equal(456, res.body.bar);
    done();
  });

request.get().set()

should set host header after get()
app.get('/', (req, res) => {
  assert.equal(req.hostname, 'example.com');
  res.end();
});
server = http.createServer(app);
server.listen(0, function listening() {
  request
    .get(`http://localhost:${server.address().port}`)
    .set('host', 'example.com')
    .then(() => {
      return request
        .get(`http://example.com:${server.address().port}`)
        .connect({
          'example.com': 'localhost',
          '*': 'fail'
        });
    })
    .then(() => done(), done);
});

res.toError()

should return an Error
request.get(base).end((err, res) => {
  var err = res.toError();
  assert.equal(err.status, 400);
  assert.equal(err.method, 'GET');
  assert.equal(err.path, '/');
  assert.equal(err.message, 'cannot GET / (400)');
  assert.equal(err.text, 'invalid json');
  done();
});

[unix-sockets] http

request

path: / (root)
request.get(`${base}/`).end((err, res) => {
  assert(res.ok);
  assert.strictEqual('root ok!', res.text);
  done();
});
path: /request/path
request.get(`${base}/request/path`).end((err, res) => {
  assert(res.ok);
  assert.strictEqual('request path ok!', res.text);
  done();
});

[unix-sockets] https

request

path: / (root)
request
  .get(`${base}/`)
  .ca(cacert)
  .end((err, res) => {
    assert.ifError(err);
    assert(res.ok);
    assert.strictEqual('root ok!', res.text);
    done();
  });
path: /request/path
request
  .get(`${base}/request/path`)
  .ca(cacert)
  .end((err, res) => {
    assert.ifError(err);
    assert(res.ok);
    assert.strictEqual('request path ok!', res.text);
    done();
  });

req.get()

should not set a default user-agent
request.get(`${base}/ua`).then((res) => {
      assert(res.headers);
      assert(!res.headers['user-agent']);
    })

utils.type(str)

should return the mime type
utils
  .type('application/json; charset=utf-8')
  .should.equal('application/json');
utils.type('application/json').should.equal('application/json');

utils.params(str)

should return the field parameters
const obj = utils.params('application/json; charset=utf-8; foo  = bar');
obj.charset.should.equal('utf-8');
obj.foo.should.equal('bar');
utils.params('application/json').should.eql({});

utils.parseLinks(str)

should parse links
const str =
  '<https://api.github.com/repos/visionmedia/mocha/issues?page=2>; rel="next", <https://api.github.com/repos/visionmedia/mocha/issues?page=5>; rel="last"';
const ret = utils.parseLinks(str);
ret.next.should.equal(
  'https://api.github.com/repos/visionmedia/mocha/issues?page=2'
);
ret.last.should.equal(
  'https://api.github.com/repos/visionmedia/mocha/issues?page=5'
);
Fork me on GitHub superagent-7.1.1/docs/zh_CN/000077500000000000000000000000001417204173300156305ustar00rootroot00000000000000superagent-7.1.1/docs/zh_CN/index.html000066400000000000000000001152261417204173300176340ustar00rootroot00000000000000 SuperAgent — elegant API for AJAX in Node and browsers

SuperAgent

SuperAgent是轻量级的渐进式ajax API,具有灵活性、可读性和较低的学习曲线。 它也适用于Node.js!

 request
   .post('/api/pet')
   .send({ name: 'Manny', species: 'cat' })
   .set('X-API-Key', 'foobar')
   .set('Accept', 'application/json')
   .then(res => {
      alert('yay got ' + JSON.stringify(res.body));
   });

测试文档

English

下面的测试文档是用Mocha的"文档"报告器生成的,并直接反映了测试套件。 这提供了额外的文档来源。

基本请求

可以通过调用 request 对象上的适当方法来发起请求,然后调用 .then() ( 或 .end()await )发送请求。例如一个简单的 GET 请求:

 request
   .get('/search')
   .then(res => {
      // res.body, res.headers, res.status
   })
   .catch(err => {
      // err.message, err.response
   });

HTTP 方法也可以作为字符串传递:
译者注:大小写皆可。

request('GET', '/search').then(success, failure);

旧式回调也受支持,但不推荐使用。您可以调用 .end() 代替 .then()

request('GET', '/search').end(function(err, res){
  if (res.ok) {}
});

可以使用绝对 URL。在 Web 浏览器中,绝对 URL 仅在服务器实现 CORS 时才有效。

 request
   .get('https://example.com/search')
   .then(res => {

   });

Node 客户端支持向 Unix 域套接字 发出请求:

// pattern: https?+unix://SOCKET_PATH/REQUEST_PATH
//在套接字路径中将 `%2F` 用作 `/`
try {
  const res = await request
    .get('http+unix://%2Fabsolute%2Fpath%2Fto%2Funix.sock/search');
  // res.body, res.headers, res.status
} catch(err) {
  // err.message, err.response
}

DELETE__、__HEAD__、__PATCH__、__POSTPUT 请求也可以使用,只需更改方法名称:

request
  .head('/favicon.ico')
  .then(res => {

  });

DELETE 也可以用 .del() 调用以与旧版 IE 兼容,其中 delete 是保留字。

HTTP 方法默认为 __GET__,因此如果您愿意,以下代码是有效的:

 request('/search', (err, res) => {

 });

设置请求头字段

设置请求头字段很简单,调用 .set() 时传入字段名称和值:

 request
   .get('/search')
   .set('API-Key', 'foobar')
   .set('Accept', 'application/json')
   .then(callback);

您还可以在一次调用中传入一个对象来设置多个字段:

 request
   .get('/search')
   .set({ 'API-Key': 'foobar', Accept: 'application/json' })
   .then(callback);

GET 请求

.query() 方法接受对象,当与 GET 方法一起使用时将形成一个查询字符串。以下将产生路径 /search?query=Manny&range=1..5&order=desc。 译者注:.query() 方法的参数不需要提前进行url编码。

 request
   .get('/search')
   .query({ query: 'Manny' })
   .query({ range: '1..5' })
   .query({ order: 'desc' })
   .then(res => {

   });

或传入单个对象:

request
  .get('/search')
  .query({ query: 'Manny', range: '1..5', order: 'desc' })
  .then(res => {

  });

.query() 方法也可以接受字符串。

  request
    .get('/querystring')
    .query('search=Manny&range=1..5')
    .then(res => {

    });

或者一个个加入:

  request
    .get('/querystring')
    .query('search=Manny')
    .query('range=1..5')
    .then(res => {

    });

HEAD 请求

您还可以对 HEAD 请求使用 .query() 方法。以下将生成路径 /users?email=joe@smith.com

  request
    .head('/users')
    .query({ email: 'joe@smith.com' })
    .then(res => {

    });

POST / PUT 请求

一个典型的 JSON POST 请求可能如下所示,我们适当地设置 Content-Type 请求头字段,并"写入"一些数据,在本例中只是一个 JSON 字符串。

  request.post('/user')
    .set('Content-Type', 'application/json')
    .send('{"name":"tj","pet":"tobi"}')
    .then(callback)
    .catch(errorCallback)

由于 JSON 无疑是最常见的,所以它是 默认 的!下面的例子与前面的例子是等价的。

  request.post('/user')
    .send({ name: 'tj', pet: 'tobi' })
    .then(callback, errorCallback)

或者调用多个 .send()

  request.post('/user')
    .send({ name: 'tj' })
    .send({ pet: 'tobi' })
    .then(callback, errorCallback)

默认情况下,发送字符串会将 Content-Type 设置为 application/x-www-form-urlencoded,多个调用将用 & 连接,这里产生 name=tj&pet=tobi

  request.post('/user')
    .send('name=tj')
    .send('pet=tobi')
    .then(callback, errorCallback);

SuperAgent 格式是可扩展的,但默认情况下支持 "json" 和 "form"。要将数据作为 application/x-www-form-urlencoded 发送,只需在调用 .type() 时传入 "form",默认为 "json"。此 POST 请求的请求体将是 "name=tj&pet=tobi"。

  request.post('/user')
    .type('form')
    .send({ name: 'tj' })
    .send({ pet: 'tobi' })
    .then(callback, errorCallback)

还支持发送 FormData 对象。以下示例将 POST 请求由 id="myForm" 标识的 HTML 表单的内容:

  request.post('/user')
    .send(new FormData(document.getElementById('myForm')))
    .then(callback, errorCallback)

设置 Content-Type

显而易见的解决方案是使用 .set() 方法:

 request.post('/user')
   .set('Content-Type', 'application/json')

.type() 方法也可以作为简写,接受带有类型/子类型的规范化 MIME 类型 名称,或者只是扩展名,例如"xml"、"json"、"png"等:

 request.post('/user')
   .type('application/json')

 request.post('/user')
   .type('json')

 request.post('/user')
   .type('png')

序列化请求体

SuperAgent 将自动序列化 JSON 和表单。您也可以为其他类型设置自动序列化:

request.serialize['application/xml'] = function (obj) {
    return '从obj生成的字符串';
};

// 接下来,内容类型为 "application/xml" 的所有请求都将自动序列化

如果您想以自定义格式发送 数据体(payload),您可以根据每个请求将内置序列化替换为 .serialize() 方法:

request
    .post('/user')
    .send({foo: 'bar'})
    .serialize(obj => {
        return '从obj生成的字符串';
    });

重试请求

如果请求暂时失败或可能是网络连接不稳定造成的失败,且当给定 .retry() 方法时,SuperAgent 将自动重试请求。

此方法有两个可选参数:重试次数(默认为 1)和回调函数。它在每次重试之前调用 callback(err, res) 。回调可以返回 true/false 以控制是否应重试请求(但始终应该用最大重试次数)。 request .get('https://example.com/search') .retry(2) // 或者: .retry(2, callback) // 二选一 .then(finished); .catch(failed);

.retry() 仅用于幂等请求(即到达服务器的多个请求不会导致重复购买等不良副作用)。

默认情况下会尝试所有请求方法(这意味着如果您不希望重试 POST 请求,则需要传递自定义的重试回调函数)。

默认情况下会重试以下状态代码:

  • 408
  • 413
  • 429
  • 500
  • 502
  • 503
  • 504
  • 521
  • 522
  • 524

默认情况下会重试以下错误代码:

  • 'ETIMEDOUT'
  • 'ECONNRESET'
  • 'EADDRINUSE'
  • 'ECONNREFUSED'
  • 'EPIPE'
  • 'ENOTFOUND'
  • 'ENETUNREACH'
  • 'EAI_AGAIN'

设置 Accept

.type() 方法类似,也可以通过简写方法 .accept() 设置 Accept 请求头。方便起见,其中还引用了 request.types,允许您将完整的规范化 MIME 类型 名称指定为类型/子类型,或将扩展后缀形式指定为"xml"、"json"、"png"等:

 request.get('/user')
   .accept('application/json')

 request.get('/user')
   .accept('json')

 request.post('/user')
   .accept('png')

Facebook 和 Accept JSON

如果您正在调用 Facebook 的 API,请务必在您的请求中发送 Accept: application/json 请求头。如果你不这样做,Facebook 会回复 Content-Type: text/javascript; charset=UTF-8,SuperAgent 将不会解析,因此 res.body 将是未定义的。您可以使用 req.accept('json')req.header('Accept', 'application/json') 来执行此操作。有关详细信息,请参阅 issue 1078

查询字符串(Query strings)

req.query(obj) 是一种可用于构建查询字符串的方法。例如在 POST 上增加 ?format=json&dest=/login

request
  .post('/')
  .query({ format: 'json' })
  .query({ dest: '/login' })
  .send({ post: 'data', here: 'wahoo' })
  .then(callback);

默认情况下,查询字符串不按任何特定顺序组装。可以使用 req.sortQuery() 启用 ASCIIbetically 排序的查询字符串。您还可以使用 req.sortQuery(myComparisonFn) 提供自定义排序比较函数。比较函数应该接受 2 个参数并返回一个负/零/正整数。

 // 默认顺序
 request.get('/user')
   .query('name=Nick')
   .query('search=Manny')
   .sortQuery()
   .then(callback)

 // 自定义排序函数
 request.get('/user')
   .query('name=Nick')
   .query('search=Manny')
   .sortQuery((a, b) => a.length - b.length)
   .then(callback)

TLS 选项

在 Node.js 中,SuperAgent 支持配置 HTTPS 请求的方法:

  • .ca(): 将 CA 证书设置为信任
  • .cert(): 设置客户端证书链
  • .key(): 设置客户端私钥
  • .pfx(): 设置客户端 PFX 或 PKCS12 编码的私钥和证书链
  • .disableTLSCerts(): 不拒绝过期或无效的 TLS 证书。在内部设置 rejectUnauthorized=true请注意,此方法允许中间人攻击。

有关更多信息,请参阅 Node.js https.request 文档

var key = fs.readFileSync('key.pem'),
    cert = fs.readFileSync('cert.pem');

request
  .post('/client-auth')
  .key(key)
  .cert(cert)
  .then(callback);
var ca = fs.readFileSync('ca.cert.pem');

request
  .post('https://localhost/private-ca-server')
  .ca(ca)
  .then(res => {});

解析响应体

SuperAgent将为您解析已知的响应主体数据,目前支持application/x-www-form-urlencodedapplication/json,以及multipart/form data。您可以设置自动解析其他响应主体数据:

//浏览器
request.parse['application/xml'] = function (str) {
    return {'object': '从str解析的'};
};

//node
request.parse['application/xml'] = function (res, cb) {
    //解析响应文本并在此处设置res.body

    cb(null, res);
};

//接下来,将自动解析 'application/xml' 类型的响应

您可以使用 .buffer(true).parse(fn) 方法设置自定义解析器(优先于内置解析器)。如果未启用响应缓冲 (.buffer(false)),则将触发响应(response)事件而无需等待正文解析器完成,因此 response.body 将不可用。

JSON / Urlencoded

属性 res.body 是解析后的对象,例如,如果请求以 JSON 字符串 '{"user":{"name":"tobi"}}' 响应,则 res.body.user.name 将为 "tobi" .同样,"user[name]=tobi" 的 x-www-form-urlencoded 值将产生相同的结果。仅支持一级嵌套。如果您需要更复杂的数据,请改为发送 JSON。

通过重复的键发送数组。 .send({color: ['red','blue']}) 会发送 color=red&color=blue。如果您希望数组键的名称中包含 [],您必须自己添加它,因为 SuperAgent 不会自动添加它。

Multipart

Node 客户端通过 Formidable 模块支持 _multipart/form-data_。解析 multipart 响应时,对象 res.files 也可供您使用。例如,假设一个请求使用以下 multipart 请求体进行响应:

--whoop
Content-Disposition: attachment; name="image"; filename="tobi.png"
Content-Type: image/png

... data here ...
--whoop
Content-Disposition: form-data; name="name"
Content-Type: text/plain

Tobi
--whoop--

res.body.name的值将为 "Tobi",并且 res.files.image 将作为包含磁盘路径、文件名和其他属性的 File 对象。

二进制数据

在浏览器中,您可以使用 .responseType('blob') 来请求处理二进制响应体。在 node.js 中运行时不需要此 API。此方法支持的参数值为

  • 'blob' 赋值给 XmlHTTPRequest 的 responseType 属性
  • 'arraybuffer' 赋值给 XmlHTTPRequest 的 responseType 属性
req.get('/binary.data')
  .responseType('blob')
  .then(res => {
    // res.body 将是浏览器原生 Blob 类型
  });

有关更多信息,请参阅 Mozilla 开发人员网络 xhr.responseType 文档

响应属性

Response 对象上设置了许多有用的标志和属性,包括响应文本、解析的响应正文、响应头字段、状态标志等等。

响应文本

res.text 属性包含未解析的响应正文字符串。此属性始终存在于客户端 API 中,并且仅当默认情况下节点的 mime 类型与 "text/"、"/json" 或 "x-www-form-urlencoded" 匹配时。原因是为了节省内存,因为缓冲大型正文(例如 multipart 文件或图像)的文本效率极低。要强制缓冲,请参阅"缓冲响应"部分。

响应体

就像 SuperAgent 可以自动序列化请求数据一样,它也可以自动解析响应体。为 Content-Type 定义解析器时,会对其进行解析,默认情况下包括 "application/json" 和 "application/x-www-form-urlencoded"。然后可以通过 res.body 获得解析的对象。

响应头字段

res.header 包含已解析的响应头字段的对象,字段名称小写,就像 node 做的一样。例如 res.header['content-length']

响应内容类型(Content-Type)

Content-Type 响应头是特殊情况,提供 res.type,它没有字符集(也可以有)。例如,"text/html; charset=utf8" 的 Content-Type 将提供 "text/html" 作为 res.type,然后 res.charset 属性将包含 "utf8"。

响应状态

响应状态标志有助于确定请求是否成功,以及其他有用的信息,使 SuperAgent 成为与 RESTful Web 服务交互的理想选择。这些标志当前定义为:

 var type = status / 100 | 0;

 // status / class
 res.status = status;
 res.statusType = type;

 // basics
 res.info = 1 == type;
 res.ok = 2 == type;
 res.clientError = 4 == type;
 res.serverError = 5 == type;
 res.error = 4 == type || 5 == type;

 // 语法糖
 res.accepted = 202 == status;
 res.noContent = 204 == status || 1223 == status;
 res.badRequest = 400 == status;
 res.unauthorized = 401 == status;
 res.notAcceptable = 406 == status;
 res.notFound = 404 == status;
 res.forbidden = 403 == status;

中止请求

要中止请求,只需调用 req.abort() 方法。

超时设定

有时网络和服务器会 "卡住" 并且在接受请求后从不响应。设置超时以避免请求永远等待。

  • req.timeout({deadline:ms})req.timeout(ms)(其中 ms 是毫秒数 > 0)设置完成整个请求(包括所有上传、重定向、服务器处理时间)的最后期限。如果在这段时间内没有完全下载响应,则请求将被中止。

  • req.timeout({response:ms}) 设置等待第一个字节从服务器到达的最长时间,但它不限制整个下载需要多长时间。响应超时应该至少比服务器响应的时间长几秒钟,因为它还包括进行 DNS 查找、TCP/IP 和 TLS 连接的时间,以及上传请求数据的时间。

您应该同时使用 deadlineresponse 超时。通过这种方式,您可以使用较短的响应超时来快速检测无响应的网络,并使用较长的截止时间来为缓慢但可靠的网络上的下载留出时间。请注意,这两个计时器都限制了允许上传附件的时间。如果您要上传文件,请使用长超时。

request
  .get('/big-file?network=slow')
  .timeout({
    response: 5000,  // 等待 5 秒让服务器开始发送
    deadline: 60000, // 但允许文件用 1 分钟完成加载。
  })
  .then(res => {
      /* 及时响应 */
    }, err => {
      if (err.timeout) { /* 超时! */ } else { /* 其他错误 */ }
  });

超时错误有个 .timeout 属性。

验证

在 Node 和浏览器中都可以通过 .auth() 方法进行身份验证:

request
  .get('http://local')
  .auth('tobi', 'learnboost')
  .then(callback);

Node 客户端中,基本身份验证可以在 URL 中写成 "user:pass":

request.get('http://tobi:learnboost@local').then(callback);

默认情况下,仅使用基本(Basic)身份验证。在浏览器中,您可以添加 {type:'auto'} 以启用浏览器中内置的所有方法(Digest、NTLM 等):

request.auth('digest', 'secret', {type:'auto'})

auth 方法还支持一种承载类型,以指定基于令牌的身份验证:

request.auth('my_token', { type: 'bearer' })

跟随重定向

默认情况下将跟随最多 5 个重定向,但是您可以使用 res.redirects(n) 方法指定它:

const response = await request.get('/some.png').redirects(2);

超出限制的重定向被视为错误。使用 .ok(res => res.status < 400) 将它们读取为成功响应。

全局状态代理程序

在 Node 中 SuperAgent 默认不保存 cookie,但您可以使用 .agent() 方法创建保存 cookie 的 SuperAgent 副本。每个副本都有一个单独的 cookie 储存器。

const agent = request.agent();
agent
  .post('/login')
  .then(() => {
    return agent.get('/cookied-page');
  });

在浏览器中,cookie 由浏览器自动管理,因此 .agent() 不会隔离 cookie。

多个请求的默认选项

代理程序上调用的常规请求方法将用作该代理发出的所有请求的默认值。

const agent = request.agent()
  .use(plugin)
  .auth(shared);

await agent.get('/with-plugin-and-auth'); // 带有插件和身份验证
await agent.get('/also-with-plugin-and-auth'); // 也带有插件和身份验证

代理可以用来设置默认值的完整方法列表是:useononcesetquerytypeacceptauthwithCredentialssortQueryretryokredirectstimeoutbufferserializeparsecakeypfxcert.

管道数据

Node 客户端允许您通过管道将数据传入和传出请求。请注意,使用 .pipe() 代替 .end()/.then() 方法。

管道文件的内容作为请求的例子:

const request = require('superagent');
const fs = require('fs');

const stream = fs.createReadStream('path/to/my.json');
const req = request.post('/somewhere');
req.type('json');
stream.pipe(req);

请注意,当您通过管道发送请求时,superagent 使用分块传输编码发送管道数据,并非所有服务器(例如 Python WSGI 服务器)都支持。

或将响应传送到文件:

const stream = fs.createWriteStream('path/to/my.json');
const req = request.get('/some.json');
req.pipe(stream);

不能混合使用管道和回调函数或 promises。请注意,您不应尝试通过管道传输 .end()Response 对象的结果:

// 别特么这么写:
const stream = getAWritableStream();
const req = request
  .get('/some.json')
  // BAD: 这会将无用信息管道传输到流中并以意想不到的方式失败
  .end((err, this_does_not_work) => this_does_not_work.pipe(stream))
const req = request
  .get('/some.json')
  .end()
  // BAD: 这也不支持,调用 .end 之后调用 .pipe。
  .pipe(nope_its_too_late);

在 superagent 的未来版本中,对 pipe() 的不当调用将失败。

多部分请求

SuperAgent 也非常适合 构建 它提供方法 .attach().field() 的多部分请求。

当您使用 .field().attach() 时,您不能使用 .send() 并且您不能设置 Content-Type(将为您设置正确的类型)。

附加文件

要发送文件,请使用 .attach(name, [file], [options])。您可以通过多次调用 .attach 来附加多个文件。参数是:

  • name — form 表单中的字段名。
  • file — 带有文件路径的字符串或 Blob/Buffer 对象。
  • options — (可选)自定义文件名的字符串或 {filename: string} 对象。在 Node 中也支持 {contentType: 'mime/type'}。在浏览器中创建一个具有适当类型的 Blob

request
  .post('/upload')
  .attach('image1', 'path/to/felix.jpeg')
  .attach('image2', imageBuffer, 'luna.jpeg')
  .field('caption', 'My cats')
  .then(callback);

字段值

与 HTML 中的表单字段非常相似,您可以使用 .field(name, value).field({name: value}) 设置字段值。假设您想上传一些带有您的姓名和电子邮件的图片,您的请求可能如下所示:

 request
   .post('/upload')
   .field('user[name]', 'Tobi')
   .field('user[email]', 'tobi@learnboost.com')
   .field('friends[]', ['loki', 'jane'])
   .attach('image', 'path/to/tobi.png')
   .then(callback);

压缩

node 客户端支持压缩过的响应,最重要的是,您无需执行任何操作!它就能用。

缓冲响应

要强制将响应主体缓冲为 res.text,您可以调用 req.buffer()。要取消对文本响应(例如 "text/plain"、"text/html" 等)的默认缓冲,您可以调用 req.buffer(false)

当缓冲提供 res.buffered 标志时,您可以使用它在同一个回调中处理缓冲和非缓冲响应。

CORS

出于安全原因,浏览器将阻止跨域请求,除非服务器选择使用 CORS 标头。浏览器还会发出额外的 OPTIONS 请求来检查服务器允许哪些 HTTP 标头和方法。阅读有关 CORS 的更多信息

.withCredentials() 方法支持从源发送 cookie,但仅当 Access-Control-Allow-Origin 不是 通配符 ("*") 且 Access-Control-Allow-Credentials 为 "true" 时。

request
  .get('https://api.example.com:4001/')
  .withCredentials()
  .then(res => {
    assert.equal(200, res.status);
    assert.equal('tobi', res.text);
  })

错误处理

您的回调函数将始终传递两个参数:错误和响应。如果没有发生错误,第一个参数将为null

request
 .post('/upload')
 .attach('image', 'path/to/tobi.png')
 .then(res => {

 });

还会触发"错误"事件,您可以监听:

request
  .post('/upload')
  .attach('image', 'path/to/tobi.png')
  .on('error', handle)
  .then(res => {

  });

请注意,默认情况下,superagent 会考虑 4xx 和 5xx 响应(以及未处理的 3xx 响应)视为错误。例如,如果您收到 304 Not modified403 Forbidden500 Internal server 错误响应,则此状态信息将通过 err.status 提供。来自此类响应的错误还包含一个 err.response 字段,其中包含"响应属性"中提到的所有属性。该库以这种方式运行以处理需要成功响应并将 HTTP 错误状态代码视为错误的常见情况,同时仍允许围绕特定错误条件进行自定义逻辑。

网络故障、超时和其他不产生响应的错误将不包含 err.statuserr.response 字段。

如果您希望处理 404 或其他 HTTP 错误响应,您可以查询 err.status 属性。当发生 HTTP 错误(4xx 或 5xx 响应)时, res.error 属性是一个 Error 对象,这允许您执行以下检查:

if (err && err.status === 404) {
  alert('oh no ' + res.body.message);
}
else if (err) {
  // 所有其他需要处理的错误类型
}

或者,您可以使用 .ok(callback) 方法来确定响应是否为错误。 ok 函数的回调函数获得响应,如果响应应该被解释为成功,则返回 true。

request.get('/404')
  .ok(res => res.status < 500)
  .then(response => {
    // 将 404 页面作为成功响应
  })

进度跟踪

SuperAgent 在上传和下载大文件时触发 progress 事件。

request.post(url)
  .attach('field_name', file)
  .on('progress', event => {
    /* event的值:
    {
      direction: "upload" or "download"
      percent: 0 to 100 // 如果文件大小未知,可能会没有
      total: // 总文件大小,可能没有
      loaded: // 到目前为止下载或上传的字节数
    } */
  })
  .then()

在本地主机上测试

强制连接特定 IP 地址

在 Node.js 中,可以忽略 DNS 解析并使用 .connect() 方法将所有请求定向到特定 IP 地址。例如,此请求将转到 localhost 而不是 example.com

const res = await request.get("http://example.com").connect("127.0.0.1");

因为请求可能被重定向,所以可以指定多个主机名和多个 IP,以及一个特殊的 * 作为后备(注意:不支持其他通配符)。请求将保留其 Host 请求头的原始值。

const res = await request.get("http://redir.example.com:555")
  .connect({
    "redir.example.com": "127.0.0.1", // redir.example.com:555 将使用 127.0.0.1:555
    "www.example.com": false, // 不覆盖这个;正常使用 DNS
    "mapped.example.com": { host: "127.0.0.1", port: 8080}, // mapped.example.com:* 将使用 127.0.0.1:8080
    "*": "proxy.example.com", // 所有其他请求都将发送到该主机
  });

忽略本地主机上损坏/不安全的 HTTPS

在 Node.js 中,当 HTTPS 配置错误且不安全(例如,使用自签名证书而不指定自己的 .ca())时,仍然可以通过调用 .trustLocalhost() 来允许对 localhost 的请求:

const res = await request.get("https://localhost").trustLocalhost()

.connect("127.0.0.1") 一起,这可用于强制将对任何域的 HTTPS 请求重新路由到 localhost

忽略本地主机上损坏的 HTTPS 通常是安全的,因为环回接口不会暴露给不受信任的网络。信任 localhost 可能会成为未来的默认设置。使用 .trustLocalhost(false) 强制检查 127.0.0.1 的可靠性。

当向任何其他 IP 发出请求时,我们故意不支持禁用 HTTPS 安全性,因为这些选项最终被滥用为 HTTPS 问题的快速"修复"。您可以从 Let's Encrypt 获得免费的 HTTPS 证书或设置您自己的 CA (.ca(ca_public_pem)) 以使您的自签名证书受信任。

Promise 和生成器函数支持

SuperAgent 的请求是一个 "thenable" 对象(带有then方法的对象),它与 JavaScript Promise 和 async/await 语法兼容。

const res = await request.get(url);

如果你使用 Promise,不要调用 .end().pipe()。任何使用 .then()await 都会禁用所有其他使用请求的方式。 像 co 这样的库或像 koa 这样的 web 框架可以在任何 SuperAgent 方法上 yield

const req = request
  .get('http://local')
  .auth('tobi', 'learnboost');
const res = yield req;

请注意,SuperAgent 期望全局 Promise 对象存在。您需要一个 polyfill 才能在 Internet Explorer 或 Node.js 0.10 中使用 Promise。

浏览器和 node 版本

SuperAgent 有两种实现:一种用于 Web 浏览器(使用 XHR),另一种用于 Node.JS(使用核心 http 模块)。默认情况下,Browserify 和 WebPack 将选择浏览器版本。

如果要使用 WebPack 为 Node.JS 编译代码,您必须在其配置中指定node target

在 electron 中使用浏览器版本

Electron 开发人员报告说,如果您希望使用浏览器版本的 SuperAgent 而不是 Node 版本,您可以 require('superagent/superagent')。这样您的请求将显示在 Chrome 开发者工具的"网络(Network)"选项卡中。请注意,自动化测试套件未涵盖此环境,也未得到官方支持。

使用代理发送请求

可以使用另一个作者的 superagent-proxy 模块

翻译说明

文档全部内容都是根据原英文文档翻译的,译者也没水平,所以如果有错误还请指出

Fork me on GitHub superagent-7.1.1/docs/zh_CN/index.md000066400000000000000000000723231417204173300172700ustar00rootroot00000000000000# SuperAgent SuperAgent是轻量级的渐进式ajax API,具有灵活性、可读性和较低的学习曲线。 它也适用于Node.js! request .post('/api/pet') .send({ name: 'Manny', species: 'cat' }) .set('X-API-Key', 'foobar') .set('Accept', 'application/json') .then(res => { alert('yay got ' + JSON.stringify(res.body)); }); ## 测试文档 [**English**](/) 下面的[测试文档](../test.html)是用[Mocha](https://mochajs.org/)的"文档"报告器生成的,并直接反映了测试套件。 这提供了额外的文档来源。 ## 基本请求 可以通过调用 `request` 对象上的适当方法来发起请求,然后调用 `.then()` ( 或 `.end()` 或 [`await`](#promise-and-generator-support) )发送请求。例如一个简单的 __GET__ 请求: request .get('/search') .then(res => { // res.body, res.headers, res.status }) .catch(err => { // err.message, err.response }); HTTP 方法也可以作为字符串传递: 译者注:大小写皆可。 request('GET', '/search').then(success, failure); 旧式回调也受支持,但不推荐使用。您可以调用 `.end()` *代替* `.then()`: request('GET', '/search').end(function(err, res){ if (res.ok) {} }); 可以使用绝对 URL。在 Web 浏览器中,绝对 URL 仅在服务器实现 [CORS](#cors) 时才有效。 request .get('https://example.com/search') .then(res => { }); __Node__ 客户端支持向 [Unix 域套接字](https://zh.wikipedia.org/wiki/Unix%E5%9F%9F%E5%A5%97%E6%8E%A5%E5%AD%97) 发出请求: // pattern: https?+unix://SOCKET_PATH/REQUEST_PATH //在套接字路径中将 `%2F` 用作 `/` try { const res = await request .get('http+unix://%2Fabsolute%2Fpath%2Fto%2Funix.sock/search'); // res.body, res.headers, res.status } catch(err) { // err.message, err.response } __DELETE__、__HEAD__、__PATCH__、__POST__ 和 __PUT__ 请求也可以使用,只需更改方法名称: request .head('/favicon.ico') .then(res => { }); __DELETE__ 也可以用 `.del()` 调用以与旧版 IE 兼容,其中 `delete` 是保留字。 HTTP 方法默认为 __GET__,因此如果您愿意,以下代码是有效的: request('/search', (err, res) => { }); ## 设置请求头字段 设置请求头字段很简单,调用 `.set()` 时传入字段名称和值: request .get('/search') .set('API-Key', 'foobar') .set('Accept', 'application/json') .then(callback); 您还可以在一次调用中传入一个对象来设置多个字段: request .get('/search') .set({ 'API-Key': 'foobar', Accept: 'application/json' }) .then(callback); ## `GET` 请求 `.query()` 方法接受对象,当与 __GET__ 方法一起使用时将形成一个查询字符串。以下将产生路径 `/search?query=Manny&range=1..5&order=desc`。 译者注:`.query()` 方法的参数不需要提前进行url编码。 request .get('/search') .query({ query: 'Manny' }) .query({ range: '1..5' }) .query({ order: 'desc' }) .then(res => { }); 或传入单个对象: request .get('/search') .query({ query: 'Manny', range: '1..5', order: 'desc' }) .then(res => { }); `.query()` 方法也可以接受字符串。 request .get('/querystring') .query('search=Manny&range=1..5') .then(res => { }); 或者一个个加入: request .get('/querystring') .query('search=Manny') .query('range=1..5') .then(res => { }); ## `HEAD` 请求 您还可以对 __HEAD__ 请求使用 .query() 方法。以下将生成路径 `/users?email=joe@smith.com`。 request .head('/users') .query({ email: 'joe@smith.com' }) .then(res => { }); ## `POST` / `PUT` 请求 一个典型的 JSON __POST__ 请求可能如下所示,我们适当地设置 `Content-Type` 请求头字段,并"写入"一些数据,在本例中只是一个 JSON 字符串。 request.post('/user') .set('Content-Type', 'application/json') .send('{"name":"tj","pet":"tobi"}') .then(callback) .catch(errorCallback) 由于 JSON 无疑是最常见的,所以它是 _默认_ 的!下面的例子与前面的例子是等价的。 request.post('/user') .send({ name: 'tj', pet: 'tobi' }) .then(callback, errorCallback) 或者调用多个 `.send()`: request.post('/user') .send({ name: 'tj' }) .send({ pet: 'tobi' }) .then(callback, errorCallback) 默认情况下,发送字符串会将 `Content-Type` 设置为 `application/x-www-form-urlencoded`,多个调用将用 `&` 连接,这里产生 `name=tj&pet=tobi`: request.post('/user') .send('name=tj') .send('pet=tobi') .then(callback, errorCallback); SuperAgent 格式是可扩展的,但默认情况下支持 "json" 和 "form"。要将数据作为 `application/x-www-form-urlencoded` 发送,只需在调用 `.type()` 时传入 "form",默认为 "json"。此 __POST__ 请求的请求体将是 "name=tj&pet=tobi"。 request.post('/user') .type('form') .send({ name: 'tj' }) .send({ pet: 'tobi' }) .then(callback, errorCallback) 还支持发送 [`FormData`](https://developer.mozilla.org/zh-CN/docs/Web/API/FormData/FormData) 对象。以下示例将 __POST__ 请求由 id="myForm" 标识的 HTML 表单的内容: request.post('/user') .send(new FormData(document.getElementById('myForm'))) .then(callback, errorCallback) ## 设置 `Content-Type` 显而易见的解决方案是使用 `.set()` 方法: request.post('/user') .set('Content-Type', 'application/json') `.type()` 方法也可以作为简写,接受带有类型/子类型的规范化 [MIME 类型](https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Basics_of_HTTP/MIME_types) 名称,或者只是扩展名,例如"xml"、"json"、"png"等: request.post('/user') .type('application/json') request.post('/user') .type('json') request.post('/user') .type('png') ## 序列化请求体 SuperAgent 将自动序列化 JSON 和表单。您也可以为其他类型设置自动序列化: ```js request.serialize['application/xml'] = function (obj) { return '从obj生成的字符串'; }; // 接下来,内容类型为 "application/xml" 的所有请求都将自动序列化 ``` 如果您想以自定义格式发送 数据体(payload),您可以根据每个请求将内置序列化替换为 `.serialize()` 方法: ```js request .post('/user') .send({foo: 'bar'}) .serialize(obj => { return '从obj生成的字符串'; }); ``` ## 重试请求 如果请求暂时失败或可能是网络连接不稳定造成的失败,且当给定 `.retry()` 方法时,SuperAgent 将自动重试请求。 此方法有两个可选参数:重试次数(默认为 `1`)和回调函数。它在每次重试之前调用 callback(err, res) 。回调可以返回 `true`/`false` 以控制是否应重试请求(但始终应该用最大重试次数)。 request .get('https://example.com/search') .retry(2) // 或者: .retry(2, callback) // 二选一 .then(finished); .catch(failed); `.retry()` 仅用于[*幂等*](https://baike.baidu.com/item/%E5%B9%82%E7%AD%89/8600688?fr=aladdin)请求(即到达服务器的多个请求不会导致重复购买等不良副作用)。 默认情况下会尝试所有请求方法(这意味着如果您不希望重试 POST 请求,则需要传递自定义的重试回调函数)。 默认情况下会重试以下状态代码: * `408` * `413` * `429` * `500` * `502` * `503` * `504` * `521` * `522` * `524` 默认情况下会重试以下错误代码: * `'ETIMEDOUT'` * `'ECONNRESET'` * `'EADDRINUSE'` * `'ECONNREFUSED'` * `'EPIPE'` * `'ENOTFOUND'` * `'ENETUNREACH'` * `'EAI_AGAIN'` ## 设置 Accept 与 `.type()` 方法类似,也可以通过简写方法 `.accept()` 设置 `Accept` 请求头。方便起见,其中还引用了 `request.types`,允许您将完整的规范化 [MIME 类型](https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Basics_of_HTTP/MIME_types) 名称指定为`类型/子类型`,或将扩展后缀形式指定为"xml"、"json"、"png"等: request.get('/user') .accept('application/json') request.get('/user') .accept('json') request.post('/user') .accept('png') ### Facebook 和 Accept JSON 如果您正在调用 Facebook 的 API,请务必在您的请求中发送 `Accept: application/json` 请求头。如果你不这样做,Facebook 会回复 `Content-Type: text/javascript; charset=UTF-8`,SuperAgent 将不会解析,因此 `res.body` 将是未定义的。您可以使用 `req.accept('json')` 或 `req.header('Accept', 'application/json')` 来执行此操作。有关详细信息,请参阅 [issue 1078](https://github.com/visionmedia/superagent/issues/1078)。 ## 查询字符串(Query strings) `req.query(obj)` 是一种可用于构建查询字符串的方法。例如在 __POST__ 上增加 `?format=json&dest=/login`: request .post('/') .query({ format: 'json' }) .query({ dest: '/login' }) .send({ post: 'data', here: 'wahoo' }) .then(callback); 默认情况下,查询字符串不按任何特定顺序组装。可以使用 `req.sortQuery()` 启用 ASCIIbetically 排序的查询字符串。您还可以使用 `req.sortQuery(myComparisonFn)` 提供自定义排序比较函数。比较函数应该接受 2 个参数并返回一个负/零/正整数。 ```js // 默认顺序 request.get('/user') .query('name=Nick') .query('search=Manny') .sortQuery() .then(callback) // 自定义排序函数 request.get('/user') .query('name=Nick') .query('search=Manny') .sortQuery((a, b) => a.length - b.length) .then(callback) ``` ## TLS 选项 在 Node.js 中,SuperAgent 支持配置 HTTPS 请求的方法: - `.ca()`: 将 CA 证书设置为信任 - `.cert()`: 设置客户端证书链 - `.key()`: 设置客户端私钥 - `.pfx()`: 设置客户端 PFX 或 PKCS12 编码的私钥和证书链 - `.disableTLSCerts()`: 不拒绝过期或无效的 TLS 证书。在内部设置 `rejectUnauthorized=true`。*请注意,此方法允许中间人攻击。* 有关更多信息,请参阅 Node.js [https.request 文档](http://nodejs.cn/api/https.html#httpsrequesturl-options-callback)。 ```js var key = fs.readFileSync('key.pem'), cert = fs.readFileSync('cert.pem'); request .post('/client-auth') .key(key) .cert(cert) .then(callback); ``` ```js var ca = fs.readFileSync('ca.cert.pem'); request .post('https://localhost/private-ca-server') .ca(ca) .then(res => {}); ``` ## 解析响应体 SuperAgent将为您解析已知的响应主体数据,目前支持`application/x-www-form-urlencoded`,`application/json`,以及`multipart/form data`。您可以设置自动解析其他响应主体数据: ```js //浏览器 request.parse['application/xml'] = function (str) { return {'object': '从str解析的'}; }; //node request.parse['application/xml'] = function (res, cb) { //解析响应文本并在此处设置res.body cb(null, res); }; //接下来,将自动解析 'application/xml' 类型的响应 ``` 您可以使用 `.buffer(true).parse(fn)` 方法设置自定义解析器(优先于内置解析器)。如果未启用响应缓冲 (`.buffer(false)`),则将触发`响应(response)`事件而无需等待正文解析器完成,因此 `response.body` 将不可用。 ### JSON / Urlencoded 属性 `res.body` 是解析后的对象,例如,如果请求以 JSON 字符串 '{"user":{"name":"tobi"}}' 响应,则 `res.body.user.name` 将为 "tobi" .同样,"user[name]=tobi" 的 x-www-form-urlencoded 值将产生相同的结果。仅支持一级嵌套。如果您需要更复杂的数据,请改为发送 JSON。 通过重复的键发送数组。 `.send({color: ['red','blue']})` 会发送 `color=red&color=blue`。如果您希望数组键的名称中包含 `[]`,您必须自己添加它,因为 SuperAgent 不会自动添加它。 ### Multipart Node 客户端通过 [Formidable](https://github.com/felixge/node-formidable) 模块支持 _multipart/form-data_。解析 multipart 响应时,对象 `res.files` 也可供您使用。例如,假设一个请求使用以下 multipart 请求体进行响应: --whoop Content-Disposition: attachment; name="image"; filename="tobi.png" Content-Type: image/png ... data here ... --whoop Content-Disposition: form-data; name="name" Content-Type: text/plain Tobi --whoop-- `res.body.name`的值将为 "Tobi",并且 `res.files.image` 将作为包含磁盘路径、文件名和其他属性的 `File` 对象。 ### 二进制数据 在浏览器中,您可以使用 `.responseType('blob')` 来请求处理二进制响应体。在 node.js 中运行时不需要此 API。此方法支持的参数值为 - `'blob'` 赋值给 XmlHTTPRequest 的 `responseType` 属性 - `'arraybuffer'` 赋值给 XmlHTTPRequest 的 responseType 属性 ```js req.get('/binary.data') .responseType('blob') .then(res => { // res.body 将是浏览器原生 Blob 类型 }); ``` 有关更多信息,请参阅 Mozilla 开发人员网络 [xhr.responseType 文档](https://developer.mozilla.org/zh-CN/docs/Web/API/XMLHttpRequest/responseType)。 ## 响应属性 在 `Response` 对象上设置了许多有用的标志和属性,包括响应文本、解析的响应正文、响应头字段、状态标志等等。 ### 响应文本 `res.text` 属性包含未解析的响应正文字符串。此属性始终存在于客户端 API 中,并且仅当默认情况下节点的 mime 类型与 "text/*"、"*/json" 或 "x-www-form-urlencoded" 匹配时。原因是为了节省内存,因为缓冲大型正文(例如 multipart 文件或图像)的文本效率极低。要强制缓冲,请参阅"[缓冲响应](#缓冲响应)"部分。 ### 响应体 就像 SuperAgent 可以自动序列化请求数据一样,它也可以自动解析响应体。为 Content-Type 定义解析器时,会对其进行解析,默认情况下包括 "application/json" 和 "application/x-www-form-urlencoded"。然后可以通过 `res.body` 获得解析的对象。 ### 响应头字段 `res.header` 包含已解析的响应头字段的对象,字段名称小写,就像 node 做的一样。例如 `res.header['content-length']`。 ### 响应内容类型(Content-Type) Content-Type 响应头是特殊情况,提供 `res.type`,它没有字符集(也可以有)。例如,"text/html; charset=utf8" 的 `Content-Type` 将提供 "text/html" 作为 `res.type`,然后 `res.charset` 属性将包含 "utf8"。 ### 响应状态 响应状态标志有助于确定请求是否成功,以及其他有用的信息,使 SuperAgent 成为与 RESTful Web 服务交互的理想选择。这些标志当前定义为: var type = status / 100 | 0; // status / class res.status = status; res.statusType = type; // basics res.info = 1 == type; res.ok = 2 == type; res.clientError = 4 == type; res.serverError = 5 == type; res.error = 4 == type || 5 == type; // 语法糖 res.accepted = 202 == status; res.noContent = 204 == status || 1223 == status; res.badRequest = 400 == status; res.unauthorized = 401 == status; res.notAcceptable = 406 == status; res.notFound = 404 == status; res.forbidden = 403 == status; ## 中止请求 要中止请求,只需调用 `req.abort()` 方法。 ## 超时设定 有时网络和服务器会 "卡住" 并且在接受请求后从不响应。设置超时以避免请求永远等待。 * `req.timeout({deadline:ms})` 或 `req.timeout(ms)`(其中 `ms` 是毫秒数 > 0)设置完成整个请求(包括所有上传、重定向、服务器处理时间)的最后期限。如果在这段时间内没有完全下载响应,则请求将被中止。 * `req.timeout({response:ms})` 设置等待第一个字节从服务器到达的最长时间,但它不限制整个下载需要多长时间。响应超时应该至少比服务器响应的时间长几秒钟,因为它还包括进行 DNS 查找、TCP/IP 和 TLS 连接的时间,以及上传请求数据的时间。 您应该同时使用 `deadline` 和 `response` 超时。通过这种方式,您可以使用较短的响应超时来快速检测无响应的网络,并使用较长的截止时间来为缓慢但可靠的网络上的下载留出时间。请注意,这两个计时器都限制了允许*上传*附件的时间。如果您要上传文件,请使用长超时。 request .get('/big-file?network=slow') .timeout({ response: 5000, // 等待 5 秒让服务器开始发送 deadline: 60000, // 但允许文件用 1 分钟完成加载。 }) .then(res => { /* 及时响应 */ }, err => { if (err.timeout) { /* 超时! */ } else { /* 其他错误 */ } }); 超时错误有个 `.timeout` 属性。 ## 验证 在 Node 和浏览器中都可以通过 `.auth()` 方法进行身份验证: request .get('http://local') .auth('tobi', 'learnboost') .then(callback); 在 _Node_ 客户端中,基本身份验证可以在 URL 中写成 "user:pass": request.get('http://tobi:learnboost@local').then(callback); 默认情况下,仅使用`基本(Basic)`身份验证。在浏览器中,您可以添加 `{type:'auto'}` 以启用浏览器中内置的所有方法(Digest、NTLM 等): request.auth('digest', 'secret', {type:'auto'}) `auth` 方法还支持一种`承载类型`,以指定基于令牌的身份验证: request.auth('my_token', { type: 'bearer' }) ## 跟随重定向 默认情况下将跟随最多 5 个重定向,但是您可以使用 `res.redirects(n)` 方法指定它: const response = await request.get('/some.png').redirects(2); 超出限制的重定向被视为错误。使用 `.ok(res => res.status < 400)` 将它们读取为成功响应。 ## 全局状态代理程序 ### 保存 cookie 在 Node 中 SuperAgent 默认不保存 cookie,但您可以使用 `.agent()` 方法创建保存 cookie 的 SuperAgent 副本。每个副本都有一个单独的 cookie 储存器。 const agent = request.agent(); agent .post('/login') .then(() => { return agent.get('/cookied-page'); }); 在浏览器中,cookie 由浏览器自动管理,因此 `.agent()` 不会隔离 cookie。 ### 多个请求的默认选项 代理程序上调用的常规请求方法将用作该代理发出的所有请求的默认值。 const agent = request.agent() .use(plugin) .auth(shared); await agent.get('/with-plugin-and-auth'); // 带有插件和身份验证 await agent.get('/also-with-plugin-and-auth'); // 也带有插件和身份验证 代理可以用来设置默认值的完整方法列表是:`use`、 `on`、 `once`、 `set`、 `query`、 `type`、 `accept`、 `auth`、 `withCredentials`、 `sortQuery`、 `retry`、 `ok`、 `redirects`、 `timeout`、 `buffer`、 `serialize`、 `parse`、 `ca`、 `key`、 `pfx`、 `cert`. ## 管道数据 Node 客户端允许您通过管道将数据传入和传出请求。请注意,使用 `.pipe()` **代替** `.end()/.then()` 方法。 管道文件的内容作为请求的例子: const request = require('superagent'); const fs = require('fs'); const stream = fs.createReadStream('path/to/my.json'); const req = request.post('/somewhere'); req.type('json'); stream.pipe(req); 请注意,当您通过管道发送请求时,superagent 使用[分块传输编码](https://baike.baidu.com/item/%E5%88%86%E5%9D%97%E4%BC%A0%E8%BE%93%E7%BC%96%E7%A0%81/8359216?fr=aladdin)发送管道数据,并非所有服务器(例如 Python WSGI 服务器)都支持。 或将响应传送到文件: const stream = fs.createWriteStream('path/to/my.json'); const req = request.get('/some.json'); req.pipe(stream); 不能混合使用管道和回调函数或 promises。请注意,您**不应**尝试通过管道传输 `.end()` 或 `Response` 对象的结果: // 别特么这么写: const stream = getAWritableStream(); const req = request .get('/some.json') // BAD: 这会将无用信息管道传输到流中并以意想不到的方式失败 .end((err, this_does_not_work) => this_does_not_work.pipe(stream)) const req = request .get('/some.json') .end() // BAD: 这也不支持,调用 .end 之后调用 .pipe。 .pipe(nope_its_too_late); 在 superagent 的[未来版本](https://github.com/visionmedia/superagent/issues/1188)中,对 `pipe()` 的不当调用将失败。 ## 多部分请求 SuperAgent 也非常适合 _构建_ 它提供方法 `.attach()` 和 `.field()` 的多部分请求。 当您使用 `.field()` 或 `.attach()` 时,您不能使用 `.send()` 并且您*不能*设置 `Content-Type`(将为您设置正确的类型)。 ### 附加文件 要发送文件,请使用 `.attach(name, [file], [options])`。您可以通过多次调用 `.attach` 来附加多个文件。参数是: * `name` — form 表单中的字段名。 * `file` — 带有文件路径的字符串或 `Blob/Buffer` 对象。 * `options` — (可选)自定义文件名的字符串或 `{filename: string}` 对象。在 Node 中也支持 `{contentType: 'mime/type'}`。在浏览器中创建一个具有适当类型的 `Blob`。
request .post('/upload') .attach('image1', 'path/to/felix.jpeg') .attach('image2', imageBuffer, 'luna.jpeg') .field('caption', 'My cats') .then(callback); ### 字段值 与 HTML 中的表单字段非常相似,您可以使用 `.field(name, value)` 和 `.field({name: value})` 设置字段值。假设您想上传一些带有您的姓名和电子邮件的图片,您的请求可能如下所示: request .post('/upload') .field('user[name]', 'Tobi') .field('user[email]', 'tobi@learnboost.com') .field('friends[]', ['loki', 'jane']) .attach('image', 'path/to/tobi.png') .then(callback); ## 压缩 node 客户端支持压缩过的响应,最重要的是,您无需执行任何操作!它就能用。 ## 缓冲响应 要强制将响应主体缓冲为 `res.text`,您可以调用 `req.buffer()`。要取消对文本响应(例如 "text/plain"、"text/html" 等)的默认缓冲,您可以调用 `req.buffer(false)`。 当缓冲提供 `res.buffered` 标志时,您可以使用它在同一个回调中处理缓冲和非缓冲响应。 ## CORS 出于安全原因,浏览器将阻止跨域请求,除非服务器选择使用 CORS 标头。浏览器还会发出额外的 __OPTIONS__ 请求来检查服务器允许哪些 HTTP 标头和方法。[阅读有关 CORS 的更多信息](https://developer.mozilla.org/zh-CN/docs/Web/HTTP/CORS)。 `.withCredentials()` 方法支持从源发送 cookie,但仅当 Access-Control-Allow-Origin _不是_ 通配符 ("*") 且 `Access-Control-Allow-Credentials` 为 "true" 时。 request .get('https://api.example.com:4001/') .withCredentials() .then(res => { assert.equal(200, res.status); assert.equal('tobi', res.text); }) ## 错误处理 您的回调函数将始终传递两个参数:错误和响应。如果没有发生错误,第一个参数将为`null`: request .post('/upload') .attach('image', 'path/to/tobi.png') .then(res => { }); 还会触发"错误"事件,您可以监听: request .post('/upload') .attach('image', 'path/to/tobi.png') .on('error', handle) .then(res => { }); 请注意,**默认情况下,superagent 会考虑 4xx 和 5xx 响应(以及未处理的 3xx 响应)视为错误**。例如,如果您收到 `304 Not modified`、`403 Forbidden` 或 `500 Internal server` 错误响应,则此状态信息将通过 `err.status` 提供。来自此类响应的错误还包含一个 `err.response` 字段,其中包含"[响应属性](#响应属性)"中提到的所有属性。该库以这种方式运行以处理需要成功响应并将 HTTP 错误状态代码视为错误的常见情况,同时仍允许围绕特定错误条件进行自定义逻辑。 网络故障、超时和其他不产生响应的错误将不包含 `err.status` 或 `err.response` 字段。 如果您希望处理 404 或其他 HTTP 错误响应,您可以查询 `err.status` 属性。当发生 HTTP 错误(4xx 或 5xx 响应)时, `res.error` 属性是一个 `Error` 对象,这允许您执行以下检查: if (err && err.status === 404) { alert('oh no ' + res.body.message); } else if (err) { // 所有其他需要处理的错误类型 } 或者,您可以使用 `.ok(callback)` 方法来确定响应是否为错误。 `ok` 函数的回调函数获得响应,如果响应应该被解释为成功,则返回 true。 request.get('/404') .ok(res => res.status < 500) .then(response => { // 将 404 页面作为成功响应 }) ## 进度跟踪 SuperAgent 在上传和下载大文件时触发 `progress` 事件。 request.post(url) .attach('field_name', file) .on('progress', event => { /* event的值: { direction: "upload" or "download" percent: 0 to 100 // 如果文件大小未知,可能会没有 total: // 总文件大小,可能没有 loaded: // 到目前为止下载或上传的字节数 } */ }) .then() ## 在本地主机上测试 ### 强制连接特定 IP 地址 在 Node.js 中,可以忽略 DNS 解析并使用 `.connect()` 方法将所有请求定向到特定 IP 地址。例如,此请求将转到 localhost 而不是 `example.com`: const res = await request.get("http://example.com").connect("127.0.0.1"); 因为请求可能被重定向,所以可以指定多个主机名和多个 IP,以及一个特殊的 `*` 作为后备(注意:不支持其他通配符)。请求将保留其 `Host` 请求头的原始值。 const res = await request.get("http://redir.example.com:555") .connect({ "redir.example.com": "127.0.0.1", // redir.example.com:555 将使用 127.0.0.1:555 "www.example.com": false, // 不覆盖这个;正常使用 DNS "mapped.example.com": { host: "127.0.0.1", port: 8080}, // mapped.example.com:* 将使用 127.0.0.1:8080 "*": "proxy.example.com", // 所有其他请求都将发送到该主机 }); ### 忽略本地主机上损坏/不安全的 HTTPS 在 Node.js 中,当 HTTPS 配置错误且不安全(例如,使用自签名证书而*不指定*自己的 `.ca()`)时,仍然可以通过调用 `.trustLocalhost()` 来允许对 `localhost` 的请求: const res = await request.get("https://localhost").trustLocalhost() 与 `.connect("127.0.0.1")` 一起,这可用于强制将对任何域的 HTTPS 请求重新路由到 `localhost`。 忽略本地主机上损坏的 HTTPS 通常是安全的,因为环回接口不会暴露给不受信任的网络。信任 `localhost` 可能会成为未来的默认设置。使用 `.trustLocalhost(false)` 强制检查 `127.0.0.1` 的可靠性。 当向任何其他 IP 发出请求时,我们故意不支持禁用 HTTPS 安全性,因为这些选项最终被滥用为 HTTPS 问题的快速"修复"。您可以从 [Let's Encrypt](https://certbot.eff.org) 获得免费的 HTTPS 证书或设置您自己的 CA (`.ca(ca_public_pem)`) 以使您的自签名证书受信任。 ## Promise 和生成器函数支持 SuperAgent 的请求是一个 "thenable" 对象(带有then方法的对象),它与 JavaScript Promise 和 `async/await` 语法兼容。 const res = await request.get(url); 如果你使用 Promise,**不要**调用 `.end()` 或 `.pipe()`。任何使用 `.then()` 或 `await` 都会禁用所有其他使用请求的方式。 像 [co](https://github.com/tj/co) 这样的库或像 [koa](https://github.com/koajs/koa) 这样的 web 框架可以在任何 SuperAgent 方法上 `yield`: const req = request .get('http://local') .auth('tobi', 'learnboost'); const res = yield req; 请注意,SuperAgent 期望全局 `Promise` 对象存在。您需要一个 polyfill 才能在 Internet Explorer 或 Node.js 0.10 中使用 Promise。 ## 浏览器和 node 版本 SuperAgent 有两种实现:一种用于 Web 浏览器(使用 XHR),另一种用于 Node.JS(使用核心 http 模块)。默认情况下,Browserify 和 WebPack 将选择浏览器版本。 如果要使用 WebPack 为 Node.JS 编译代码,您*必须*在其配置中指定[node target](https://webpack.github.io/docs/configuration.html#target)。 ### 在 electron 中使用浏览器版本 [Electron](https://electron.atom.io/) 开发人员报告说,如果您希望使用浏览器版本的 SuperAgent 而不是 Node 版本,您可以 `require('superagent/superagent')`。这样您的请求将显示在 Chrome 开发者工具的"网络(Network)"选项卡中。请注意,自动化测试套件未涵盖此环境,也未得到官方支持。 ## 使用代理发送请求 可以使用另一个作者的 [superagent-proxy](https://www.npmjs.com/package/superagent-proxy) 模块 ## 翻译说明 文档全部内容都是根据原英文文档翻译的,译者也没水平,所以如果有错误还请指出superagent-7.1.1/examples/000077500000000000000000000000001417204173300155155ustar00rootroot00000000000000superagent-7.1.1/examples/simple-get.js000066400000000000000000000004521417204173300201220ustar00rootroot00000000000000/** * Module dependencies. */ const request = require('..'); const url = 'https://gist.githubusercontent.com/reinaldo13/cdbb4d663ba23410a77b/raw/0345267767d50790051951ddc460e2699649de2b/it-works.txt'; request.get(url, (error, res) => { if (error) throw error; console.log(res.text); }); superagent-7.1.1/index.html000066400000000000000000001163121417204173300157000ustar00rootroot00000000000000 SuperAgent — elegant API for AJAX in Node and browsers

SuperAgent

SuperAgent is light-weight progressive ajax API crafted for flexibility, readability, and a low learning curve after being frustrated with many of the existing request APIs. It also works with Node.js!

 request
   .post('/api/pet')
   .send({ name: 'Manny', species: 'cat' })
   .set('X-API-Key', 'foobar')
   .set('Accept', 'application/json')
   .then(res => {
      alert('yay got ' + JSON.stringify(res.body));
   });

Test documentation

中文文档

The following test documentation was generated with Mocha's "doc" reporter, and directly reflects the test suite. This provides an additional source of documentation.

Request basics

A request can be initiated by invoking the appropriate method on the request object, then calling .then() (or .end() or await) to send the request. For example a simple GET request:

 request
   .get('/search')
   .then(res => {
      // res.body, res.headers, res.status
   })
   .catch(err => {
      // err.message, err.response
   });

HTTP method may also be passed as a string:

request('GET', '/search').then(success, failure);

Old-style callbacks are also supported, but not recommended. Instead of .then() you can call .end():

request('GET', '/search').end(function(err, res){
  if (res.ok) {}
});

Absolute URLs can be used. In web browsers absolute URLs work only if the server implements CORS.

 request
   .get('https://example.com/search')
   .then(res => {

   });

The Node client supports making requests to Unix Domain Sockets:

// pattern: https?+unix://SOCKET_PATH/REQUEST_PATH
//          Use `%2F` as `/` in SOCKET_PATH
try {
  const res = await request
    .get('http+unix://%2Fabsolute%2Fpath%2Fto%2Funix.sock/search');
  // res.body, res.headers, res.status
} catch(err) {
  // err.message, err.response
}

DELETE, HEAD, PATCH, POST, and PUT requests can also be used, simply change the method name:

request
  .head('/favicon.ico')
  .then(res => {

  });

DELETE can be also called as .del() for compatibility with old IE where delete is a reserved word.

The HTTP method defaults to GET, so if you wish, the following is valid:

 request('/search', (err, res) => {

 });

Setting header fields

Setting header fields is simple, invoke .set() with a field name and value:

 request
   .get('/search')
   .set('API-Key', 'foobar')
   .set('Accept', 'application/json')
   .then(callback);

You may also pass an object to set several fields in a single call:

 request
   .get('/search')
   .set({ 'API-Key': 'foobar', Accept: 'application/json' })
   .then(callback);

GET requests

The .query() method accepts objects, which when used with the GET method will form a query-string. The following will produce the path /search?query=Manny&range=1..5&order=desc.

 request
   .get('/search')
   .query({ query: 'Manny' })
   .query({ range: '1..5' })
   .query({ order: 'desc' })
   .then(res => {

   });

Or as a single object:

request
  .get('/search')
  .query({ query: 'Manny', range: '1..5', order: 'desc' })
  .then(res => {

  });

The .query() method accepts strings as well:

  request
    .get('/querystring')
    .query('search=Manny&range=1..5')
    .then(res => {

    });

Or joined:

  request
    .get('/querystring')
    .query('search=Manny')
    .query('range=1..5')
    .then(res => {

    });

HEAD requests

You can also use the .query() method for HEAD requests. The following will produce the path /users?email=joe@smith.com.

  request
    .head('/users')
    .query({ email: 'joe@smith.com' })
    .then(res => {

    });

POST / PUT requests

A typical JSON POST request might look a little like the following, where we set the Content-Type header field appropriately, and "write" some data, in this case just a JSON string.

  request.post('/user')
    .set('Content-Type', 'application/json')
    .send('{"name":"tj","pet":"tobi"}')
    .then(callback)
    .catch(errorCallback)

Since JSON is undoubtedly the most common, it's the default! The following example is equivalent to the previous.

  request.post('/user')
    .send({ name: 'tj', pet: 'tobi' })
    .then(callback, errorCallback)

Or using multiple .send() calls:

  request.post('/user')
    .send({ name: 'tj' })
    .send({ pet: 'tobi' })
    .then(callback, errorCallback)

By default sending strings will set the Content-Type to application/x-www-form-urlencoded, multiple calls will be concatenated with &, here resulting in name=tj&pet=tobi:

  request.post('/user')
    .send('name=tj')
    .send('pet=tobi')
    .then(callback, errorCallback);

SuperAgent formats are extensible, however by default "json" and "form" are supported. To send the data as application/x-www-form-urlencoded simply invoke .type() with "form", where the default is "json". This request will POST the body "name=tj&pet=tobi".

  request.post('/user')
    .type('form')
    .send({ name: 'tj' })
    .send({ pet: 'tobi' })
    .then(callback, errorCallback)

Sending a FormData object is also supported. The following example will POST the content of the HTML form identified by id="myForm":

  request.post('/user')
    .send(new FormData(document.getElementById('myForm')))
    .then(callback, errorCallback)

Setting the Content-Type

The obvious solution is to use the .set() method:

 request.post('/user')
   .set('Content-Type', 'application/json')

As a short-hand the .type() method is also available, accepting the canonicalized MIME type name complete with type/subtype, or simply the extension name such as "xml", "json", "png", etc:

 request.post('/user')
   .type('application/json')

 request.post('/user')
   .type('json')

 request.post('/user')
   .type('png')

Serializing request body

SuperAgent will automatically serialize JSON and forms. You can setup automatic serialization for other types as well:

request.serialize['application/xml'] = function (obj) {
    return 'string generated from obj';
};

// going forward, all requests with a Content-type of
// 'application/xml' will be automatically serialized

If you want to send the payload in a custom format, you can replace the built-in serialization with the .serialize() method on a per-request basis:

request
    .post('/user')
    .send({foo: 'bar'})
    .serialize(obj => {
        return 'string generated from obj';
    });

Retrying requests

When given the .retry() method, SuperAgent will automatically retry requests, if they fail in a way that is transient or could be due to a flaky Internet connection.

This method has two optional arguments: number of retries (default 1) and a callback. It calls callback(err, res) before each retry. The callback may return true/false to control whether the request should be retried (but the maximum number of retries is always applied).

 request
   .get('https://example.com/search')
   .retry(2) // or:
   .retry(2, callback)
   .then(finished);
   .catch(failed);

Use .retry() only with requests that are idempotent (i.e. multiple requests reaching the server won't cause undesirable side effects like duplicate purchases).

All request methods are tried by default (which means if you do not want POST requests to be retried, you will need to pass a custom retry callback).

By default the following status codes are retried:

  • 408
  • 413
  • 429
  • 500
  • 502
  • 503
  • 504
  • 521
  • 522
  • 524

By default the following error codes are retried:

  • 'ETIMEDOUT'
  • 'ECONNRESET'
  • 'EADDRINUSE'
  • 'ECONNREFUSED'
  • 'EPIPE'
  • 'ENOTFOUND'
  • 'ENETUNREACH'
  • 'EAI_AGAIN'

Setting Accept

In a similar fashion to the .type() method it is also possible to set the Accept header via the short hand method .accept(). Which references request.types as well allowing you to specify either the full canonicalized MIME type name as type/subtype, or the extension suffix form as "xml", "json", "png", etc. for convenience:

 request.get('/user')
   .accept('application/json')

 request.get('/user')
   .accept('json')

 request.post('/user')
   .accept('png')

Facebook and Accept JSON

If you are calling Facebook's API, be sure to send an Accept: application/json header in your request. If you don't do this, Facebook will respond with Content-Type: text/javascript; charset=UTF-8, which SuperAgent will not parse and thus res.body will be undefined. You can do this with either req.accept('json') or req.header('Accept', 'application/json'). See issue 1078 for details.

Query strings

req.query(obj) is a method which may be used to build up a query-string. For example populating ?format=json&dest=/login on a POST:

request
  .post('/')
  .query({ format: 'json' })
  .query({ dest: '/login' })
  .send({ post: 'data', here: 'wahoo' })
  .then(callback);

By default the query string is not assembled in any particular order. An asciibetically-sorted query string can be enabled with req.sortQuery(). You may also provide a custom sorting comparison function with req.sortQuery(myComparisonFn). The comparison function should take 2 arguments and return a negative/zero/positive integer.

 // default order
 request.get('/user')
   .query('name=Nick')
   .query('search=Manny')
   .sortQuery()
   .then(callback)

 // customized sort function
 request.get('/user')
   .query('name=Nick')
   .query('search=Manny')
   .sortQuery((a, b) => a.length - b.length)
   .then(callback)

TLS options

In Node.js SuperAgent supports methods to configure HTTPS requests:

  • .ca(): Set the CA certificate(s) to trust
  • .cert(): Set the client certificate chain(s)
  • .key(): Set the client private key(s)
  • .pfx(): Set the client PFX or PKCS12 encoded private key and certificate chain
  • .disableTLSCerts(): Does not reject expired or invalid TLS certs. Sets internally rejectUnauthorized=true. Be warned, this method allows MITM attacks.

For more information, see Node.js https.request docs.

var key = fs.readFileSync('key.pem'),
    cert = fs.readFileSync('cert.pem');

request
  .post('/client-auth')
  .key(key)
  .cert(cert)
  .then(callback);
var ca = fs.readFileSync('ca.cert.pem');

request
  .post('https://localhost/private-ca-server')
  .ca(ca)
  .then(res => {});

Parsing response bodies

SuperAgent will parse known response-body data for you, currently supporting application/x-www-form-urlencoded, application/json, and multipart/form-data. You can setup automatic parsing for other response-body data as well:

//browser
request.parse['application/xml'] = function (str) {
    return {'object': 'parsed from str'};
};

//node
request.parse['application/xml'] = function (res, cb) {
    //parse response text and set res.body here

    cb(null, res);
};

//going forward, responses of type 'application/xml'
//will be parsed automatically

You can set a custom parser (that takes precedence over built-in parsers) with the .buffer(true).parse(fn) method. If response buffering is not enabled (.buffer(false)) then the response event will be emitted without waiting for the body parser to finish, so response.body won't be available.

JSON / Urlencoded

The property res.body is the parsed object, for example if a request responded with the JSON string '{"user":{"name":"tobi"}}', res.body.user.name would be "tobi". Likewise the x-www-form-urlencoded value of "user[name]=tobi" would yield the same result. Only one level of nesting is supported. If you need more complex data, send JSON instead.

Arrays are sent by repeating the key. .send({color: ['red','blue']}) sends color=red&color=blue. If you want the array keys to contain [] in their name, you must add it yourself, as SuperAgent doesn't add it automatically.

Multipart

The Node client supports multipart/form-data via the Formidable module. When parsing multipart responses, the object res.files is also available to you. Suppose for example a request responds with the following multipart body:

--whoop
Content-Disposition: attachment; name="image"; filename="tobi.png"
Content-Type: image/png

... data here ...
--whoop
Content-Disposition: form-data; name="name"
Content-Type: text/plain

Tobi
--whoop--

You would have the values res.body.name provided as "Tobi", and res.files.image as a File object containing the path on disk, filename, and other properties.

Binary

In browsers, you may use .responseType('blob') to request handling of binary response bodies. This API is unnecessary when running in node.js. The supported argument values for this method are

  • 'blob' passed through to the XmlHTTPRequest responseType property
  • 'arraybuffer' passed through to the XmlHTTPRequest responseType property
req.get('/binary.data')
  .responseType('blob')
  .then(res => {
    // res.body will be a browser native Blob type here
  });

For more information, see the Mozilla Developer Network xhr.responseType docs.

Response properties

Many helpful flags and properties are set on the Response object, ranging from the response text, parsed response body, header fields, status flags and more.

Response text

The res.text property contains the unparsed response body string. This property is always present for the client API, and only when the mime type matches "text/", "/json", or "x-www-form-urlencoded" by default for node. The reasoning is to conserve memory, as buffering text of large bodies such as multipart files or images is extremely inefficient. To force buffering see the "Buffering responses" section.

Response body

Much like SuperAgent can auto-serialize request data, it can also automatically parse it. When a parser is defined for the Content-Type, it is parsed, which by default includes "application/json" and "application/x-www-form-urlencoded". The parsed object is then available via res.body.

Response header fields

The res.header contains an object of parsed header fields, lowercasing field names much like node does. For example res.header['content-length'].

Response Content-Type

The Content-Type response header is special-cased, providing res.type, which is void of the charset (if any). For example the Content-Type of "text/html; charset=utf8" will provide "text/html" as res.type, and the res.charset property would then contain "utf8".

Response status

The response status flags help determine if the request was a success, among other useful information, making SuperAgent ideal for interacting with RESTful web services. These flags are currently defined as:

 var type = status / 100 | 0;

 // status / class
 res.status = status;
 res.statusType = type;

 // basics
 res.info = 1 == type;
 res.ok = 2 == type;
 res.clientError = 4 == type;
 res.serverError = 5 == type;
 res.error = 4 == type || 5 == type;

 // sugar
 res.accepted = 202 == status;
 res.noContent = 204 == status || 1223 == status;
 res.badRequest = 400 == status;
 res.unauthorized = 401 == status;
 res.notAcceptable = 406 == status;
 res.notFound = 404 == status;
 res.forbidden = 403 == status;

Aborting requests

To abort requests simply invoke the req.abort() method.

Timeouts

Sometimes networks and servers get "stuck" and never respond after accepting a request. Set timeouts to avoid requests waiting forever.

  • req.timeout({deadline:ms}) or req.timeout(ms) (where ms is a number of milliseconds > 0) sets a deadline for the entire request (including all uploads, redirects, server processing time) to complete. If the response isn't fully downloaded within that time, the request will be aborted.

  • req.timeout({response:ms}) sets maximum time to wait for the first byte to arrive from the server, but it does not limit how long the entire download can take. Response timeout should be at least few seconds longer than just the time it takes the server to respond, because it also includes time to make DNS lookup, TCP/IP and TLS connections, and time to upload request data.

You should use both deadline and response timeouts. This way you can use a short response timeout to detect unresponsive networks quickly, and a long deadline to give time for downloads on slow, but reliable, networks. Note that both of these timers limit how long uploads of attached files are allowed to take. Use long timeouts if you're uploading files.

request
  .get('/big-file?network=slow')
  .timeout({
    response: 5000,  // Wait 5 seconds for the server to start sending,
    deadline: 60000, // but allow 1 minute for the file to finish loading.
  })
  .then(res => {
      /* responded in time */
    }, err => {
      if (err.timeout) { /* timed out! */ } else { /* other error */ }
  });

Timeout errors have a .timeout property.

Authentication

In both Node and browsers auth available via the .auth() method:

request
  .get('http://local')
  .auth('tobi', 'learnboost')
  .then(callback);

In the Node client Basic auth can be in the URL as "user:pass":

request.get('http://tobi:learnboost@local').then(callback);

By default only Basic auth is used. In browser you can add {type:'auto'} to enable all methods built-in in the browser (Digest, NTLM, etc.):

request.auth('digest', 'secret', {type:'auto'})

The auth method also supports a type of bearer, to specify token-based authentication:

request.auth('my_token', { type: 'bearer' })

Following redirects

By default up to 5 redirects will be followed, however you may specify this with the res.redirects(n) method:

const response = await request.get('/some.png').redirects(2);

Redirects exceeding the limit are treated as errors. Use .ok(res => res.status < 400) to read them as successful responses.

Agents for global state

Saving cookies

In Node SuperAgent does not save cookies by default, but you can use the .agent() method to create a copy of SuperAgent that saves cookies. Each copy has a separate cookie jar.

const agent = request.agent();
agent
  .post('/login')
  .then(() => {
    return agent.get('/cookied-page');
  });

In browsers cookies are managed automatically by the browser, so the .agent() does not isolate cookies.

Default options for multiple requests

Regular request methods called on the agent will be used as defaults for all requests made by that agent.

const agent = request.agent()
  .use(plugin)
  .auth(shared);

await agent.get('/with-plugin-and-auth');
await agent.get('/also-with-plugin-and-auth');

The complete list of methods that the agent can use to set defaults is: use, on, once, set, query, type, accept, auth, withCredentials, sortQuery, retry, ok, redirects, timeout, buffer, serialize, parse, ca, key, pfx, cert.

Piping data

The Node client allows you to pipe data to and from the request. Please note that .pipe() is used instead of .end()/.then() methods.

For example piping a file's contents as the request:

const request = require('superagent');
const fs = require('fs');

const stream = fs.createReadStream('path/to/my.json');
const req = request.post('/somewhere');
req.type('json');
stream.pipe(req);

Note that when you pipe to a request, superagent sends the piped data with chunked transfer encoding, which isn't supported by all servers (for instance, Python WSGI servers).

Or piping the response to a file:

const stream = fs.createWriteStream('path/to/my.json');
const req = request.get('/some.json');
req.pipe(stream);

It's not possible to mix pipes and callbacks or promises. Note that you should NOT attempt to pipe the result of .end() or the Response object:

// Don't do either of these:
const stream = getAWritableStream();
const req = request
  .get('/some.json')
  // BAD: this pipes garbage to the stream and fails in unexpected ways
  .end((err, this_does_not_work) => this_does_not_work.pipe(stream))
const req = request
  .get('/some.json')
  .end()
  // BAD: this is also unsupported, .pipe calls .end for you.
  .pipe(nope_its_too_late);

In a future version of superagent, improper calls to pipe() will fail.

Multipart requests

SuperAgent is also great for building multipart requests for which it provides methods .attach() and .field().

When you use .field() or .attach() you can't use .send() and you must not set Content-Type (the correct type will be set for you).

Attaching files

To send a file use .attach(name, [file], [options]). You can attach multiple files by calling .attach multiple times. The arguments are:

  • name — field name in the form.
  • file — either string with file path or Blob/Buffer object.
  • options — (optional) either string with custom file name or {filename: string} object. In Node also {contentType: 'mime/type'} is supported. In browser create a Blob with an appropriate type instead.

request
  .post('/upload')
  .attach('image1', 'path/to/felix.jpeg')
  .attach('image2', imageBuffer, 'luna.jpeg')
  .field('caption', 'My cats')
  .then(callback);

Field values

Much like form fields in HTML, you can set field values with .field(name, value) and .field({name: value}). Suppose you want to upload a few images with your name and email, your request might look something like this:

 request
   .post('/upload')
   .field('user[name]', 'Tobi')
   .field('user[email]', 'tobi@learnboost.com')
   .field('friends[]', ['loki', 'jane'])
   .attach('image', 'path/to/tobi.png')
   .then(callback);

Compression

The node client supports compressed responses, best of all, you don't have to do anything! It just works.

Buffering responses

To force buffering of response bodies as res.text you may invoke req.buffer(). To undo the default of buffering for text responses such as "text/plain", "text/html" etc you may invoke req.buffer(false).

When buffered the res.buffered flag is provided, you may use this to handle both buffered and unbuffered responses in the same callback.

CORS

For security reasons, browsers will block cross-origin requests unless the server opts-in using CORS headers. Browsers will also make extra OPTIONS requests to check what HTTP headers and methods are allowed by the server. Read more about CORS.

The .withCredentials() method enables the ability to send cookies from the origin, however only when Access-Control-Allow-Origin is not a wildcard ("*"), and Access-Control-Allow-Credentials is "true".

request
  .get('https://api.example.com:4001/')
  .withCredentials()
  .then(res => {
    assert.equal(200, res.status);
    assert.equal('tobi', res.text);
  })

Error handling

Your callback function will always be passed two arguments: error and response. If no error occurred, the first argument will be null:

request
 .post('/upload')
 .attach('image', 'path/to/tobi.png')
 .then(res => {

 });

An "error" event is also emitted, with you can listen for:

request
  .post('/upload')
  .attach('image', 'path/to/tobi.png')
  .on('error', handle)
  .then(res => {

  });

Note that superagent considers 4xx and 5xx responses (as well as unhandled 3xx responses) errors by default. For example, if you get a 304 Not modified, 403 Forbidden or 500 Internal server error response, this status information will be available via err.status. Errors from such responses also contain an err.response field with all of the properties mentioned in "Response properties". The library behaves in this way to handle the common case of wanting success responses and treating HTTP error status codes as errors while still allowing for custom logic around specific error conditions.

Network failures, timeouts, and other errors that produce no response will contain no err.status or err.response fields.

If you wish to handle 404 or other HTTP error responses, you can query the err.status property. When an HTTP error occurs (4xx or 5xx response) the res.error property is an Error object, this allows you to perform checks such as:

if (err && err.status === 404) {
  alert('oh no ' + res.body.message);
}
else if (err) {
  // all other error types we handle generically
}

Alternatively, you can use the .ok(callback) method to decide whether a response is an error or not. The callback to the ok function gets a response and returns true if the response should be interpreted as success.

request.get('/404')
  .ok(res => res.status < 500)
  .then(response => {
    // reads 404 page as a successful response
  })

Progress tracking

SuperAgent fires progress events on upload and download of large files.

request.post(url)
  .attach('field_name', file)
  .on('progress', event => {
    /* the event is:
    {
      direction: "upload" or "download"
      percent: 0 to 100 // may be missing if file size is unknown
      total: // total file size, may be missing
      loaded: // bytes downloaded or uploaded so far
    } */
  })
  .then()

Testing on localhost

Forcing specific connection IP address

In Node.js it's possible to ignore DNS resolution and direct all requests to a specific IP address using .connect() method. For example, this request will go to localhost instead of example.com:

const res = await request.get("http://example.com").connect("127.0.0.1");

Because the request may be redirected, it's possible to specify multiple hostnames and multiple IPs, as well as a special * as the fallback (note: other wildcards are not supported). The requests will keep their Host header with the original value. .connect(undefined) turns off the feature.

const res = await request.get("http://redir.example.com:555")
  .connect({
    "redir.example.com": "127.0.0.1", // redir.example.com:555 will use 127.0.0.1:555
    "www.example.com": false, // don't override this one; use DNS as normal
    "mapped.example.com": { host: "127.0.0.1", port: 8080}, // mapped.example.com:* will use 127.0.0.1:8080
    "*": "proxy.example.com", // all other requests will go to this host
  });

Ignoring broken/insecure HTTPS on localhost

In Node.js, when HTTPS is misconfigured and insecure (e.g. using self-signed certificate without specifying own .ca()), it's still possible to permit requests to localhost by calling .trustLocalhost():

const res = await request.get("https://localhost").trustLocalhost()

Together with .connect("127.0.0.1") this may be used to force HTTPS requests to any domain to be re-routed to localhost instead.

It's generally safe to ignore broken HTTPS on localhost, because the loopback interface is not exposed to untrusted networks. Trusting localhost may become the default in the future. Use .trustLocalhost(false) to force check of 127.0.0.1's authenticity.

We intentionally don't support disabling of HTTPS security when making requests to any other IP, because such options end up abused as a quick "fix" for HTTPS problems. You can get free HTTPS certificates from Let's Encrypt or set your own CA (.ca(ca_public_pem)) to make your self-signed certificates trusted.

Promise and Generator support

SuperAgent's request is a "thenable" object that's compatible with JavaScript promises and the async/await syntax.

const res = await request.get(url);

If you're using promises, do not call .end() or .pipe(). Any use of .then() or await disables all other ways of using the request.

Libraries like co or a web framework like koa can yield on any SuperAgent method:

const req = request
  .get('http://local')
  .auth('tobi', 'learnboost');
const res = yield req;

Note that SuperAgent expects the global Promise object to be present. You'll need a polyfill to use promises in Internet Explorer or Node.js 0.10.

Browser and node versions

SuperAgent has two implementations: one for web browsers (using XHR) and one for Node.JS (using core http module). By default Browserify and WebPack will pick the browser version.

If want to use WebPack to compile code for Node.JS, you must specify node target in its configuration.

Using browser version in electron

Electron developers report if you would prefer to use the browser version of SuperAgent instead of the Node version, you can require('superagent/superagent'). Your requests will now show up in the Chrome developer tools Network tab. Note this environment is not covered by automated test suite and not officially supported.

Fork me on GitHub superagent-7.1.1/package.json000066400000000000000000000146001417204173300161660ustar00rootroot00000000000000{ "name": "superagent", "description": "elegant & feature rich browser / node HTTP with a fluent API", "version": "7.1.1", "author": "TJ Holowaychuk ", "browser": { "./src/node/index.js": "./src/client.js", "./lib/node/index.js": "./lib/client.js", "./test/support/server.js": "./test/support/blank.js", "semver": false }, "bugs": { "url": "https://github.com/visionmedia/superagent/issues" }, "commitlint": { "extends": [ "@commitlint/config-conventional" ] }, "contributors": [ "Kornel Lesiński ", "Peter Lyons ", "Hunter Loftis ", "Nick Baugh " ], "dependencies": { "component-emitter": "^1.3.0", "cookiejar": "^2.1.3", "debug": "^4.3.3", "fast-safe-stringify": "^2.1.1", "form-data": "^4.0.0", "formidable": "^2.0.1", "methods": "^1.1.2", "mime": "^2.5.0", "qs": "^6.10.1", "readable-stream": "^3.6.0", "semver": "^7.3.5" }, "devDependencies": { "@babel/cli": "^7.16.0", "@babel/core": "^7.16.0", "@babel/plugin-transform-runtime": "^7.16.4", "@babel/preset-env": "^7.16.4", "@commitlint/cli": "^15.0.0", "@commitlint/config-conventional": "^15.0.0", "Base64": "^1.1.0", "babelify": "^10.0.0", "basic-auth-connect": "^1.0.0", "body-parser": "^1.19.0", "browserify": "^17.0.0", "codecov": "^3.8.3", "cookie-parser": "^1.4.6", "cross-env": "^7.0.3", "eslint": "^8.3.0", "eslint-config-xo-lass": "^1.0.6", "eslint-plugin-compat": "^4.0.0", "eslint-plugin-node": "^11.1.0", "express": "^4.17.1", "express-session": "^1.17.2", "fixpack": "^4.0.0", "get-port": "4.2.0", "husky": "^7.0.4", "lint-staged": "^12.1.2", "marked": "^2.0.0", "mocha": "6.2.2", "multer": "^1.4.3", "nyc": "^15.1.0", "remark-cli": "^10.0.1", "remark-preset-github": "^4.0.1", "rimraf": "^3.0.2", "should": "^13.2.3", "should-http": "^0.1.1", "tinyify": "^3.0.0", "xo": "^0.47.0", "zuul": "^3.12.0" }, "engines": { "node": ">=6.4.0 <13 || >=14" }, "files": [ "dist/*.js", "lib/**/*.js" ], "homepage": "https://github.com/visionmedia/superagent", "jsdelivr": "dist/superagent.min.js", "keywords": [ "agent", "ajax", "ajax", "api", "async", "await", "axios", "cancel", "client", "frisbee", "got", "http", "http", "https", "ky", "promise", "promise", "promises", "request", "request", "requests", "response", "rest", "retry", "super", "superagent", "timeout", "transform", "xhr", "xmlhttprequest" ], "license": "MIT", "lint-staged": { "linters": { "*.js": [ "xo --fix", "git add" ], "*.md": [ "remark . -qfo", "git add" ], "package.json": [ "fixpack", "git add" ] } }, "main": "lib/node/index.js", "prettier": { "singleQuote": true, "bracketSpacing": true, "trailingComma": "none" }, "remarkConfig": { "plugins": [ "preset-github" ] }, "repository": { "type": "git", "url": "git://github.com/visionmedia/superagent.git" }, "scripts": { "prepare": "husky install", "browserify": "browserify src/node/index.js -o dist/superagent.js -s superagent -g [ babelify --configFile ./.dist.babelrc ]", "build": "npm run build:clean && npm run build:lib && npm run build:dist", "build:clean": "rimraf lib dist", "build:dist": "npm run browserify && npm run minify", "build:lib": "babel --config-file ./.lib.babelrc src --out-dir lib", "coverage": "nyc report --reporter=text-lcov > coverage.lcov && codecov", "lint": "xo && remark . -qfo && eslint -c .lib.eslintrc lib && eslint -c .dist.eslintrc dist", "minify": "cross-env NODE_ENV=production browserify src/node/index.js -o dist/superagent.min.js -s superagent -g [ babelify --configFile ./.dist.babelrc ] -p tinyify", "nyc": "cross-env NODE_ENV=test nyc ava", "test": "npm run build && npm run lint && make test", "test-http2": "npm run build && npm run lint && make test-node-http2" }, "unpkg": "dist/superagent.min.js", "xo": { "prettier": true, "space": true, "extends": [ "xo-lass" ], "envs": [ "node", "browser" ], "overrides": [ { "files": "test/**/*.js", "envs": [ "mocha" ], "rules": { "block-scoped-var": "warn", "complexity": "warn", "default-case": "warn", "eqeqeq": "warn", "func-name-matching": "warn", "func-names": "warn", "guard-for-in": "warn", "handle-callback-err": "warn", "import/no-extraneous-dependencies": "warn", "import/no-unassigned-import": "warn", "import/order": "warn", "max-nested-callbacks": "warn", "new-cap": "warn", "no-eq-null": "warn", "no-extend-native": "warn", "no-implicit-coercion": "warn", "no-multi-assign": "warn", "no-negated-condition": "warn", "no-prototype-builtins": "warn", "no-redeclare": "warn", "no-undef": "warn", "no-unused-expressions": "warn", "no-unused-vars": "warn", "no-use-extend-native/no-use-extend-native": "warn", "no-useless-escape": "warn", "no-var": "warn", "no-void": "warn", "node/no-deprecated-api": "warn", "prefer-rest-params": "warn", "prefer-spread": "warn", "unicorn/filename-case": "warn", "valid-jsdoc": "warn", "node/no-path-concat": "warn", "unicorn/no-empty-file": "warn" } } ], "rules": { "unicorn/prevent-abbreviations": [ "warn", { "replacements": { "res": false, "args": false } } ], "no-bitwise": "warn", "node/prefer-global/buffer": "warn", "node/prefer-global/process": "warn", "unicorn/no-new-array": "warn", "unicorn/no-this-assignment": "warn", "unicorn/prefer-spread": "warn", "unicorn/catch-error-name": "warn", "unicorn/prefer-code-point": "warn" }, "globals": [ "ActiveXObject" ] } } superagent-7.1.1/src/000077500000000000000000000000001417204173300144665ustar00rootroot00000000000000superagent-7.1.1/src/agent-base.js000066400000000000000000000012041417204173300170270ustar00rootroot00000000000000function Agent() { this._defaults = []; } for (const fn of [ 'use', 'on', 'once', 'set', 'query', 'type', 'accept', 'auth', 'withCredentials', 'sortQuery', 'retry', 'ok', 'redirects', 'timeout', 'buffer', 'serialize', 'parse', 'ca', 'key', 'pfx', 'cert', 'disableTLSCerts' ]) { // Default setting for all requests from this agent Agent.prototype[fn] = function (...args) { this._defaults.push({ fn, args }); return this; }; } Agent.prototype._setDefaults = function (request) { for (const def of this._defaults) { request[def.fn](...def.args); } }; module.exports = Agent; superagent-7.1.1/src/client.js000066400000000000000000000556751417204173300163240ustar00rootroot00000000000000/** * Root reference for iframes. */ let root; if (typeof window !== 'undefined') { // Browser window root = window; } else if (typeof self === 'undefined') { // Other environments console.warn( 'Using browser-only version of superagent in non-browser environment' ); root = this; } else { // Web Worker root = self; } const Emitter = require('component-emitter'); const safeStringify = require('fast-safe-stringify'); const qs = require('qs'); const RequestBase = require('./request-base'); const { isObject, mixin, hasOwn } = require('./utils'); const ResponseBase = require('./response-base'); const Agent = require('./agent-base'); /** * Noop. */ function noop() {} /** * Expose `request`. */ module.exports = function (method, url) { // callback if (typeof url === 'function') { return new exports.Request('GET', method).end(url); } // url first if (arguments.length === 1) { return new exports.Request('GET', method); } return new exports.Request(method, url); }; exports = module.exports; const request = exports; exports.Request = Request; /** * Determine XHR. */ request.getXHR = () => { if ( root.XMLHttpRequest && (!root.location || root.location.protocol !== 'file:' || !root.ActiveXObject) ) { return new XMLHttpRequest(); } try { return new ActiveXObject('Microsoft.XMLHTTP'); } catch {} try { return new ActiveXObject('Msxml2.XMLHTTP.6.0'); } catch {} try { return new ActiveXObject('Msxml2.XMLHTTP.3.0'); } catch {} try { return new ActiveXObject('Msxml2.XMLHTTP'); } catch {} throw new Error('Browser-only version of superagent could not find XHR'); }; /** * Removes leading and trailing whitespace, added to support IE. * * @param {String} s * @return {String} * @api private */ const trim = ''.trim ? (s) => s.trim() : (s) => s.replace(/(^\s*|\s*$)/g, ''); /** * Serialize the given `obj`. * * @param {Object} obj * @return {String} * @api private */ function serialize(object) { if (!isObject(object)) return object; const pairs = []; for (const key in object) { if (hasOwn(object, key)) pushEncodedKeyValuePair(pairs, key, object[key]); } return pairs.join('&'); } /** * Helps 'serialize' with serializing arrays. * Mutates the pairs array. * * @param {Array} pairs * @param {String} key * @param {Mixed} val */ function pushEncodedKeyValuePair(pairs, key, value) { if (value === undefined) return; if (value === null) { pairs.push(encodeURI(key)); return; } if (Array.isArray(value)) { for (const v of value) { pushEncodedKeyValuePair(pairs, key, v); } } else if (isObject(value)) { for (const subkey in value) { if (hasOwn(value, subkey)) pushEncodedKeyValuePair(pairs, `${key}[${subkey}]`, value[subkey]); } } else { pairs.push(encodeURI(key) + '=' + encodeURIComponent(value)); } } /** * Expose serialization method. */ request.serializeObject = serialize; /** * Parse the given x-www-form-urlencoded `str`. * * @param {String} str * @return {Object} * @api private */ function parseString(string_) { const object = {}; const pairs = string_.split('&'); let pair; let pos; for (let i = 0, length_ = pairs.length; i < length_; ++i) { pair = pairs[i]; pos = pair.indexOf('='); if (pos === -1) { object[decodeURIComponent(pair)] = ''; } else { object[decodeURIComponent(pair.slice(0, pos))] = decodeURIComponent( pair.slice(pos + 1) ); } } return object; } /** * Expose parser. */ request.parseString = parseString; /** * Default MIME type map. * * superagent.types.xml = 'application/xml'; * */ request.types = { html: 'text/html', json: 'application/json', xml: 'text/xml', urlencoded: 'application/x-www-form-urlencoded', form: 'application/x-www-form-urlencoded', 'form-data': 'application/x-www-form-urlencoded' }; /** * Default serialization map. * * superagent.serialize['application/xml'] = function(obj){ * return 'generated xml here'; * }; * */ request.serialize = { 'application/x-www-form-urlencoded': qs.stringify, 'application/json': safeStringify }; /** * Default parsers. * * superagent.parse['application/xml'] = function(str){ * return { object parsed from str }; * }; * */ request.parse = { 'application/x-www-form-urlencoded': parseString, 'application/json': JSON.parse }; /** * Parse the given header `str` into * an object containing the mapped fields. * * @param {String} str * @return {Object} * @api private */ function parseHeader(string_) { const lines = string_.split(/\r?\n/); const fields = {}; let index; let line; let field; let value; for (let i = 0, length_ = lines.length; i < length_; ++i) { line = lines[i]; index = line.indexOf(':'); if (index === -1) { // could be empty line, just skip it continue; } field = line.slice(0, index).toLowerCase(); value = trim(line.slice(index + 1)); fields[field] = value; } return fields; } /** * Check if `mime` is json or has +json structured syntax suffix. * * @param {String} mime * @return {Boolean} * @api private */ function isJSON(mime) { // should match /json or +json // but not /json-seq return /[/+]json($|[^-\w])/i.test(mime); } /** * Initialize a new `Response` with the given `xhr`. * * - set flags (.ok, .error, etc) * - parse header * * Examples: * * Aliasing `superagent` as `request` is nice: * * request = superagent; * * We can use the promise-like API, or pass callbacks: * * request.get('/').end(function(res){}); * request.get('/', function(res){}); * * Sending data can be chained: * * request * .post('/user') * .send({ name: 'tj' }) * .end(function(res){}); * * Or passed to `.send()`: * * request * .post('/user') * .send({ name: 'tj' }, function(res){}); * * Or passed to `.post()`: * * request * .post('/user', { name: 'tj' }) * .end(function(res){}); * * Or further reduced to a single call for simple cases: * * request * .post('/user', { name: 'tj' }, function(res){}); * * @param {XMLHTTPRequest} xhr * @param {Object} options * @api private */ function Response(request_) { this.req = request_; this.xhr = this.req.xhr; // responseText is accessible only if responseType is '' or 'text' and on older browsers this.text = (this.req.method !== 'HEAD' && (this.xhr.responseType === '' || this.xhr.responseType === 'text')) || typeof this.xhr.responseType === 'undefined' ? this.xhr.responseText : null; this.statusText = this.req.xhr.statusText; let { status } = this.xhr; // handle IE9 bug: http://stackoverflow.com/questions/10046972/msie-returns-status-code-of-1223-for-ajax-request if (status === 1223) { status = 204; } this._setStatusProperties(status); this.headers = parseHeader(this.xhr.getAllResponseHeaders()); this.header = this.headers; // getAllResponseHeaders sometimes falsely returns "" for CORS requests, but // getResponseHeader still works. so we get content-type even if getting // other headers fails. this.header['content-type'] = this.xhr.getResponseHeader('content-type'); this._setHeaderProperties(this.header); if (this.text === null && request_._responseType) { this.body = this.xhr.response; } else { this.body = this.req.method === 'HEAD' ? null : this._parseBody(this.text ? this.text : this.xhr.response); } } mixin(Response.prototype, ResponseBase.prototype); /** * Parse the given body `str`. * * Used for auto-parsing of bodies. Parsers * are defined on the `superagent.parse` object. * * @param {String} str * @return {Mixed} * @api private */ Response.prototype._parseBody = function (string_) { let parse = request.parse[this.type]; if (this.req._parser) { return this.req._parser(this, string_); } if (!parse && isJSON(this.type)) { parse = request.parse['application/json']; } return parse && string_ && (string_.length > 0 || string_ instanceof Object) ? parse(string_) : null; }; /** * Return an `Error` representative of this response. * * @return {Error} * @api public */ Response.prototype.toError = function () { const { req } = this; const { method } = req; const { url } = req; const message = `cannot ${method} ${url} (${this.status})`; const error = new Error(message); error.status = this.status; error.method = method; error.url = url; return error; }; /** * Expose `Response`. */ request.Response = Response; /** * Initialize a new `Request` with the given `method` and `url`. * * @param {String} method * @param {String} url * @api public */ function Request(method, url) { const self = this; this._query = this._query || []; this.method = method; this.url = url; this.header = {}; // preserves header name case this._header = {}; // coerces header names to lowercase this.on('end', () => { let error = null; let res = null; try { res = new Response(self); } catch (error_) { error = new Error('Parser is unable to parse the response'); error.parse = true; error.original = error_; // issue #675: return the raw response if the response parsing fails if (self.xhr) { // ie9 doesn't have 'response' property error.rawResponse = typeof self.xhr.responseType === 'undefined' ? self.xhr.responseText : self.xhr.response; // issue #876: return the http status code if the response parsing fails error.status = self.xhr.status ? self.xhr.status : null; error.statusCode = error.status; // backwards-compat only } else { error.rawResponse = null; error.status = null; } return self.callback(error); } self.emit('response', res); let new_error; try { if (!self._isResponseOK(res)) { new_error = new Error( res.statusText || res.text || 'Unsuccessful HTTP response' ); } } catch (err) { new_error = err; // ok() callback can throw } // #1000 don't catch errors from the callback to avoid double calling it if (new_error) { new_error.original = error; new_error.response = res; new_error.status = res.status; self.callback(new_error, res); } else { self.callback(null, res); } }); } /** * Mixin `Emitter` and `RequestBase`. */ // eslint-disable-next-line new-cap Emitter(Request.prototype); mixin(Request.prototype, RequestBase.prototype); /** * Set Content-Type to `type`, mapping values from `request.types`. * * Examples: * * superagent.types.xml = 'application/xml'; * * request.post('/') * .type('xml') * .send(xmlstring) * .end(callback); * * request.post('/') * .type('application/xml') * .send(xmlstring) * .end(callback); * * @param {String} type * @return {Request} for chaining * @api public */ Request.prototype.type = function (type) { this.set('Content-Type', request.types[type] || type); return this; }; /** * Set Accept to `type`, mapping values from `request.types`. * * Examples: * * superagent.types.json = 'application/json'; * * request.get('/agent') * .accept('json') * .end(callback); * * request.get('/agent') * .accept('application/json') * .end(callback); * * @param {String} accept * @return {Request} for chaining * @api public */ Request.prototype.accept = function (type) { this.set('Accept', request.types[type] || type); return this; }; /** * Set Authorization field value with `user` and `pass`. * * @param {String} user * @param {String} [pass] optional in case of using 'bearer' as type * @param {Object} options with 'type' property 'auto', 'basic' or 'bearer' (default 'basic') * @return {Request} for chaining * @api public */ Request.prototype.auth = function (user, pass, options) { if (arguments.length === 1) pass = ''; if (typeof pass === 'object' && pass !== null) { // pass is optional and can be replaced with options options = pass; pass = ''; } if (!options) { options = { type: typeof btoa === 'function' ? 'basic' : 'auto' }; } const encoder = (string) => { if (typeof btoa === 'function') { return btoa(string); } throw new Error('Cannot use basic auth, btoa is not a function'); }; return this._auth(user, pass, options, encoder); }; /** * Add query-string `val`. * * Examples: * * request.get('/shoes') * .query('size=10') * .query({ color: 'blue' }) * * @param {Object|String} val * @return {Request} for chaining * @api public */ Request.prototype.query = function (value) { if (typeof value !== 'string') value = serialize(value); if (value) this._query.push(value); return this; }; /** * Queue the given `file` as an attachment to the specified `field`, * with optional `options` (or filename). * * ``` js * request.post('/upload') * .attach('content', new Blob(['hey!'], { type: "text/html"})) * .end(callback); * ``` * * @param {String} field * @param {Blob|File} file * @param {String|Object} options * @return {Request} for chaining * @api public */ Request.prototype.attach = function (field, file, options) { if (file) { if (this._data) { throw new Error("superagent can't mix .send() and .attach()"); } this._getFormData().append(field, file, options || file.name); } return this; }; Request.prototype._getFormData = function () { if (!this._formData) { this._formData = new root.FormData(); } return this._formData; }; /** * Invoke the callback with `err` and `res` * and handle arity check. * * @param {Error} err * @param {Response} res * @api private */ Request.prototype.callback = function (error, res) { if (this._shouldRetry(error, res)) { return this._retry(); } const fn = this._callback; this.clearTimeout(); if (error) { if (this._maxRetries) error.retries = this._retries - 1; this.emit('error', error); } fn(error, res); }; /** * Invoke callback with x-domain error. * * @api private */ Request.prototype.crossDomainError = function () { const error = new Error( 'Request has been terminated\nPossible causes: the network is offline, Origin is not allowed by Access-Control-Allow-Origin, the page is being unloaded, etc.' ); error.crossDomain = true; error.status = this.status; error.method = this.method; error.url = this.url; this.callback(error); }; // This only warns, because the request is still likely to work Request.prototype.agent = function () { console.warn('This is not supported in browser version of superagent'); return this; }; Request.prototype.ca = Request.prototype.agent; Request.prototype.buffer = Request.prototype.ca; // This throws, because it can't send/receive data as expected Request.prototype.write = () => { throw new Error( 'Streaming is not supported in browser version of superagent' ); }; Request.prototype.pipe = Request.prototype.write; /** * Check if `obj` is a host object, * we don't want to serialize these :) * * @param {Object} obj host object * @return {Boolean} is a host object * @api private */ Request.prototype._isHost = function (object) { // Native objects stringify to [object File], [object Blob], [object FormData], etc. return ( object && typeof object === 'object' && !Array.isArray(object) && Object.prototype.toString.call(object) !== '[object Object]' ); }; /** * Initiate request, invoking callback `fn(res)` * with an instanceof `Response`. * * @param {Function} fn * @return {Request} for chaining * @api public */ Request.prototype.end = function (fn) { if (this._endCalled) { console.warn( 'Warning: .end() was called twice. This is not supported in superagent' ); } this._endCalled = true; // store callback this._callback = fn || noop; // querystring this._finalizeQueryString(); this._end(); }; Request.prototype._setUploadTimeout = function () { const self = this; // upload timeout it's wokrs only if deadline timeout is off if (this._uploadTimeout && !this._uploadTimeoutTimer) { this._uploadTimeoutTimer = setTimeout(() => { self._timeoutError( 'Upload timeout of ', self._uploadTimeout, 'ETIMEDOUT' ); }, this._uploadTimeout); } }; // eslint-disable-next-line complexity Request.prototype._end = function () { if (this._aborted) return this.callback( new Error('The request has been aborted even before .end() was called') ); const self = this; this.xhr = request.getXHR(); const { xhr } = this; let data = this._formData || this._data; this._setTimeouts(); // state change xhr.addEventListener('readystatechange', () => { const { readyState } = xhr; if (readyState >= 2 && self._responseTimeoutTimer) { clearTimeout(self._responseTimeoutTimer); } if (readyState !== 4) { return; } // In IE9, reads to any property (e.g. status) off of an aborted XHR will // result in the error "Could not complete the operation due to error c00c023f" let status; try { status = xhr.status; } catch { status = 0; } if (!status) { if (self.timedout || self._aborted) return; return self.crossDomainError(); } self.emit('end'); }); // progress const handleProgress = (direction, e) => { if (e.total > 0) { e.percent = (e.loaded / e.total) * 100; if (e.percent === 100) { clearTimeout(self._uploadTimeoutTimer); } } e.direction = direction; self.emit('progress', e); }; if (this.hasListeners('progress')) { try { xhr.addEventListener('progress', handleProgress.bind(null, 'download')); if (xhr.upload) { xhr.upload.addEventListener( 'progress', handleProgress.bind(null, 'upload') ); } } catch { // Accessing xhr.upload fails in IE from a web worker, so just pretend it doesn't exist. // Reported here: // https://connect.microsoft.com/IE/feedback/details/837245/xmlhttprequest-upload-throws-invalid-argument-when-used-from-web-worker-context } } if (xhr.upload) { this._setUploadTimeout(); } // initiate request try { if (this.username && this.password) { xhr.open(this.method, this.url, true, this.username, this.password); } else { xhr.open(this.method, this.url, true); } } catch (err) { // see #1149 return this.callback(err); } // CORS if (this._withCredentials) xhr.withCredentials = true; // body if ( !this._formData && this.method !== 'GET' && this.method !== 'HEAD' && typeof data !== 'string' && !this._isHost(data) ) { // serialize stuff const contentType = this._header['content-type']; let serialize = this._serializer || request.serialize[contentType ? contentType.split(';')[0] : '']; if (!serialize && isJSON(contentType)) { serialize = request.serialize['application/json']; } if (serialize) data = serialize(data); } // set header fields for (const field in this.header) { if (this.header[field] === null) continue; if (hasOwn(this.header, field)) xhr.setRequestHeader(field, this.header[field]); } if (this._responseType) { xhr.responseType = this._responseType; } // send stuff this.emit('request', this); // IE11 xhr.send(undefined) sends 'undefined' string as POST payload (instead of nothing) // We need null here if data is undefined xhr.send(typeof data === 'undefined' ? null : data); }; request.agent = () => new Agent(); for (const method of ['GET', 'POST', 'OPTIONS', 'PATCH', 'PUT', 'DELETE']) { Agent.prototype[method.toLowerCase()] = function (url, fn) { const request_ = new request.Request(method, url); this._setDefaults(request_); if (fn) { request_.end(fn); } return request_; }; } Agent.prototype.del = Agent.prototype.delete; /** * GET `url` with optional callback `fn(res)`. * * @param {String} url * @param {Mixed|Function} [data] or fn * @param {Function} [fn] * @return {Request} * @api public */ request.get = (url, data, fn) => { const request_ = request('GET', url); if (typeof data === 'function') { fn = data; data = null; } if (data) request_.query(data); if (fn) request_.end(fn); return request_; }; /** * HEAD `url` with optional callback `fn(res)`. * * @param {String} url * @param {Mixed|Function} [data] or fn * @param {Function} [fn] * @return {Request} * @api public */ request.head = (url, data, fn) => { const request_ = request('HEAD', url); if (typeof data === 'function') { fn = data; data = null; } if (data) request_.query(data); if (fn) request_.end(fn); return request_; }; /** * OPTIONS query to `url` with optional callback `fn(res)`. * * @param {String} url * @param {Mixed|Function} [data] or fn * @param {Function} [fn] * @return {Request} * @api public */ request.options = (url, data, fn) => { const request_ = request('OPTIONS', url); if (typeof data === 'function') { fn = data; data = null; } if (data) request_.send(data); if (fn) request_.end(fn); return request_; }; /** * DELETE `url` with optional `data` and callback `fn(res)`. * * @param {String} url * @param {Mixed} [data] * @param {Function} [fn] * @return {Request} * @api public */ function del(url, data, fn) { const request_ = request('DELETE', url); if (typeof data === 'function') { fn = data; data = null; } if (data) request_.send(data); if (fn) request_.end(fn); return request_; } request.del = del; request.delete = del; /** * PATCH `url` with optional `data` and callback `fn(res)`. * * @param {String} url * @param {Mixed} [data] * @param {Function} [fn] * @return {Request} * @api public */ request.patch = (url, data, fn) => { const request_ = request('PATCH', url); if (typeof data === 'function') { fn = data; data = null; } if (data) request_.send(data); if (fn) request_.end(fn); return request_; }; /** * POST `url` with optional `data` and callback `fn(res)`. * * @param {String} url * @param {Mixed} [data] * @param {Function} [fn] * @return {Request} * @api public */ request.post = (url, data, fn) => { const request_ = request('POST', url); if (typeof data === 'function') { fn = data; data = null; } if (data) request_.send(data); if (fn) request_.end(fn); return request_; }; /** * PUT `url` with optional `data` and callback `fn(res)`. * * @param {String} url * @param {Mixed|Function} [data] or fn * @param {Function} [fn] * @return {Request} * @api public */ request.put = (url, data, fn) => { const request_ = request('PUT', url); if (typeof data === 'function') { fn = data; data = null; } if (data) request_.send(data); if (fn) request_.end(fn); return request_; }; superagent-7.1.1/src/node/000077500000000000000000000000001417204173300154135ustar00rootroot00000000000000superagent-7.1.1/src/node/agent.js000066400000000000000000000042511417204173300170510ustar00rootroot00000000000000/** * Module dependencies. */ // eslint-disable-next-line node/no-deprecated-api const { parse } = require('url'); const { CookieJar } = require('cookiejar'); const { CookieAccessInfo } = require('cookiejar'); const methods = require('methods'); const request = require('../..'); const AgentBase = require('../agent-base'); /** * Expose `Agent`. */ module.exports = Agent; /** * Initialize a new `Agent`. * * @api public */ function Agent(options) { if (!(this instanceof Agent)) { return new Agent(options); } AgentBase.call(this); this.jar = new CookieJar(); if (options) { if (options.ca) { this.ca(options.ca); } if (options.key) { this.key(options.key); } if (options.pfx) { this.pfx(options.pfx); } if (options.cert) { this.cert(options.cert); } if (options.rejectUnauthorized === false) { this.disableTLSCerts(); } } } Agent.prototype = Object.create(AgentBase.prototype); /** * Save the cookies in the given `res` to * the agent's cookie jar for persistence. * * @param {Response} res * @api private */ Agent.prototype._saveCookies = function (res) { const cookies = res.headers['set-cookie']; if (cookies) this.jar.setCookies(cookies); }; /** * Attach cookies when available to the given `req`. * * @param {Request} req * @api private */ Agent.prototype._attachCookies = function (request_) { const url = parse(request_.url); const access = new CookieAccessInfo( url.hostname, url.pathname, url.protocol === 'https:' ); const cookies = this.jar.getCookies(access).toValueString(); request_.cookies = cookies; }; for (const name of methods) { const method = name.toUpperCase(); Agent.prototype[name] = function (url, fn) { const request_ = new request.Request(method, url); request_.on('response', this._saveCookies.bind(this)); request_.on('redirect', this._saveCookies.bind(this)); request_.on('redirect', this._attachCookies.bind(this, request_)); this._setDefaults(request_); this._attachCookies(request_); if (fn) { request_.end(fn); } return request_; }; } Agent.prototype.del = Agent.prototype.delete; superagent-7.1.1/src/node/http2wrapper.js000066400000000000000000000117211417204173300204150ustar00rootroot00000000000000const Stream = require('stream'); const util = require('util'); const net = require('net'); const tls = require('tls'); // eslint-disable-next-line node/no-deprecated-api const { parse } = require('url'); const process = require('process'); const semverGte = require('semver/functions/gte'); let http2; if (semverGte(process.version, 'v10.10.0')) http2 = require('http2'); else throw new Error('superagent: this version of Node.js does not support http2'); const { HTTP2_HEADER_PATH, HTTP2_HEADER_STATUS, HTTP2_HEADER_METHOD, HTTP2_HEADER_AUTHORITY, HTTP2_HEADER_HOST, HTTP2_HEADER_SET_COOKIE, NGHTTP2_CANCEL } = http2.constants; function setProtocol(protocol) { return { request(options) { return new Request(protocol, options); } }; } function Request(protocol, options) { Stream.call(this); const defaultPort = protocol === 'https:' ? 443 : 80; const defaultHost = 'localhost'; const port = options.port || defaultPort; const host = options.host || defaultHost; delete options.port; delete options.host; this.method = options.method; this.path = options.path; this.protocol = protocol; this.host = host; delete options.method; delete options.path; const sessionOptions = { ...options }; if (options.socketPath) { sessionOptions.socketPath = options.socketPath; sessionOptions.createConnection = this.createUnixConnection.bind(this); } this._headers = {}; const session = http2.connect(`${protocol}//${host}:${port}`, sessionOptions); this.setHeader('host', `${host}:${port}`); session.on('error', (error) => this.emit('error', error)); this.session = session; } /** * Inherit from `Stream` (which inherits from `EventEmitter`). */ util.inherits(Request, Stream); Request.prototype.createUnixConnection = function (authority, options) { switch (this.protocol) { case 'http:': return net.connect(options.socketPath); case 'https:': options.ALPNProtocols = ['h2']; options.servername = this.host; options.allowHalfOpen = true; return tls.connect(options.socketPath, options); default: throw new Error('Unsupported protocol', this.protocol); } }; // eslint-disable-next-line no-unused-vars Request.prototype.setNoDelay = function (bool) { // We can not use setNoDelay with HTTP/2. // Node 10 limits http2session.socket methods to ones safe to use with HTTP/2. // See also https://nodejs.org/api/http2.html#http2_http2session_socket }; Request.prototype.getFrame = function () { if (this.frame) { return this.frame; } const method = { [HTTP2_HEADER_PATH]: this.path, [HTTP2_HEADER_METHOD]: this.method }; let headers = this.mapToHttp2Header(this._headers); headers = Object.assign(headers, method); const frame = this.session.request(headers); // eslint-disable-next-line no-unused-vars frame.once('response', (headers, flags) => { headers = this.mapToHttpHeader(headers); frame.headers = headers; frame.statusCode = headers[HTTP2_HEADER_STATUS]; frame.status = frame.statusCode; this.emit('response', frame); }); this._headerSent = true; frame.once('drain', () => this.emit('drain')); frame.on('error', (error) => this.emit('error', error)); frame.on('close', () => this.session.close()); this.frame = frame; return frame; }; Request.prototype.mapToHttpHeader = function (headers) { const keys = Object.keys(headers); const http2Headers = {}; for (let key of keys) { let value = headers[key]; key = key.toLowerCase(); switch (key) { case HTTP2_HEADER_SET_COOKIE: value = Array.isArray(value) ? value : [value]; break; default: break; } http2Headers[key] = value; } return http2Headers; }; Request.prototype.mapToHttp2Header = function (headers) { const keys = Object.keys(headers); const http2Headers = {}; for (let key of keys) { let value = headers[key]; key = key.toLowerCase(); switch (key) { case HTTP2_HEADER_HOST: key = HTTP2_HEADER_AUTHORITY; value = /^http:\/\/|^https:\/\//.test(value) ? parse(value).host : value; break; default: break; } http2Headers[key] = value; } return http2Headers; }; Request.prototype.setHeader = function (name, value) { this._headers[name.toLowerCase()] = value; }; Request.prototype.getHeader = function (name) { return this._headers[name.toLowerCase()]; }; Request.prototype.write = function (data, encoding) { const frame = this.getFrame(); return frame.write(data, encoding); }; Request.prototype.pipe = function (stream, options) { const frame = this.getFrame(); return frame.pipe(stream, options); }; Request.prototype.end = function (data) { const frame = this.getFrame(); frame.end(data); }; // eslint-disable-next-line no-unused-vars Request.prototype.abort = function (data) { const frame = this.getFrame(); frame.close(NGHTTP2_CANCEL); this.session.destroy(); }; exports.setProtocol = setProtocol; superagent-7.1.1/src/node/index.js000066400000000000000000001005251417204173300170630ustar00rootroot00000000000000/** * Module dependencies. */ // eslint-disable-next-line node/no-deprecated-api const { parse, format, resolve } = require('url'); const Stream = require('stream'); const https = require('https'); const http = require('http'); const fs = require('fs'); const zlib = require('zlib'); const util = require('util'); const qs = require('qs'); const mime = require('mime'); let methods = require('methods'); const FormData = require('form-data'); const formidable = require('formidable'); const debug = require('debug')('superagent'); const CookieJar = require('cookiejar'); const semverGte = require('semver/functions/gte'); const safeStringify = require('fast-safe-stringify'); const utils = require('../utils'); const RequestBase = require('../request-base'); const { unzip } = require('./unzip'); const Response = require('./response'); const { mixin, hasOwn } = utils; let http2; if (semverGte(process.version, 'v10.10.0')) http2 = require('./http2wrapper'); function request(method, url) { // callback if (typeof url === 'function') { return new exports.Request('GET', method).end(url); } // url first if (arguments.length === 1) { return new exports.Request('GET', method); } return new exports.Request(method, url); } module.exports = request; exports = module.exports; /** * Expose `Request`. */ exports.Request = Request; /** * Expose the agent function */ exports.agent = require('./agent'); /** * Noop. */ function noop() {} /** * Expose `Response`. */ exports.Response = Response; /** * Define "form" mime type. */ mime.define( { 'application/x-www-form-urlencoded': ['form', 'urlencoded', 'form-data'] }, true ); /** * Protocol map. */ exports.protocols = { 'http:': http, 'https:': https, 'http2:': http2 }; /** * Default serialization map. * * superagent.serialize['application/xml'] = function(obj){ * return 'generated xml here'; * }; * */ exports.serialize = { 'application/x-www-form-urlencoded': qs.stringify, 'application/json': safeStringify }; /** * Default parsers. * * superagent.parse['application/xml'] = function(res, fn){ * fn(null, res); * }; * */ exports.parse = require('./parsers'); /** * Default buffering map. Can be used to set certain * response types to buffer/not buffer. * * superagent.buffer['application/xml'] = true; */ exports.buffer = {}; /** * Initialize internal header tracking properties on a request instance. * * @param {Object} req the instance * @api private */ function _initHeaders(request_) { request_._header = { // coerces header names to lowercase }; request_.header = { // preserves header name case }; } /** * Initialize a new `Request` with the given `method` and `url`. * * @param {String} method * @param {String|Object} url * @api public */ function Request(method, url) { Stream.call(this); if (typeof url !== 'string') url = format(url); this._enableHttp2 = Boolean(process.env.HTTP2_TEST); // internal only this._agent = false; this._formData = null; this.method = method; this.url = url; _initHeaders(this); this.writable = true; this._redirects = 0; this.redirects(method === 'HEAD' ? 0 : 5); this.cookies = ''; this.qs = {}; this._query = []; this.qsRaw = this._query; // Unused, for backwards compatibility only this._redirectList = []; this._streamRequest = false; this.once('end', this.clearTimeout.bind(this)); } /** * Inherit from `Stream` (which inherits from `EventEmitter`). * Mixin `RequestBase`. */ util.inherits(Request, Stream); mixin(Request.prototype, RequestBase.prototype); /** * Enable or Disable http2. * * Enable http2. * * ``` js * request.get('http://localhost/') * .http2() * .end(callback); * * request.get('http://localhost/') * .http2(true) * .end(callback); * ``` * * Disable http2. * * ``` js * request = request.http2(); * request.get('http://localhost/') * .http2(false) * .end(callback); * ``` * * @param {Boolean} enable * @return {Request} for chaining * @api public */ Request.prototype.http2 = function (bool) { if (exports.protocols['http2:'] === undefined) { throw new Error( 'superagent: this version of Node.js does not support http2' ); } this._enableHttp2 = bool === undefined ? true : bool; return this; }; /** * Queue the given `file` as an attachment to the specified `field`, * with optional `options` (or filename). * * ``` js * request.post('http://localhost/upload') * .attach('field', Buffer.from('Hello world'), 'hello.html') * .end(callback); * ``` * * A filename may also be used: * * ``` js * request.post('http://localhost/upload') * .attach('files', 'image.jpg') * .end(callback); * ``` * * @param {String} field * @param {String|fs.ReadStream|Buffer} file * @param {String|Object} options * @return {Request} for chaining * @api public */ Request.prototype.attach = function (field, file, options) { if (file) { if (this._data) { throw new Error("superagent can't mix .send() and .attach()"); } let o = options || {}; if (typeof options === 'string') { o = { filename: options }; } if (typeof file === 'string') { if (!o.filename) o.filename = file; debug('creating `fs.ReadStream` instance for file: %s', file); file = fs.createReadStream(file); file.on('error', (error) => { const formData = this._getFormData(); formData.emit('error', error); }); } else if (!o.filename && file.path) { o.filename = file.path; } this._getFormData().append(field, file, o); } return this; }; Request.prototype._getFormData = function () { if (!this._formData) { this._formData = new FormData(); this._formData.on('error', (error) => { debug('FormData error', error); if (this.called) { // The request has already finished and the callback was called. // Silently ignore the error. return; } this.callback(error); this.abort(); }); } return this._formData; }; /** * Gets/sets the `Agent` to use for this HTTP request. The default (if this * function is not called) is to opt out of connection pooling (`agent: false`). * * @param {http.Agent} agent * @return {http.Agent} * @api public */ Request.prototype.agent = function (agent) { if (arguments.length === 0) return this._agent; this._agent = agent; return this; }; /** * Set _Content-Type_ response header passed through `mime.getType()`. * * Examples: * * request.post('/') * .type('xml') * .send(xmlstring) * .end(callback); * * request.post('/') * .type('json') * .send(jsonstring) * .end(callback); * * request.post('/') * .type('application/json') * .send(jsonstring) * .end(callback); * * @param {String} type * @return {Request} for chaining * @api public */ Request.prototype.type = function (type) { return this.set( 'Content-Type', type.includes('/') ? type : mime.getType(type) ); }; /** * Set _Accept_ response header passed through `mime.getType()`. * * Examples: * * superagent.types.json = 'application/json'; * * request.get('/agent') * .accept('json') * .end(callback); * * request.get('/agent') * .accept('application/json') * .end(callback); * * @param {String} accept * @return {Request} for chaining * @api public */ Request.prototype.accept = function (type) { return this.set('Accept', type.includes('/') ? type : mime.getType(type)); }; /** * Add query-string `val`. * * Examples: * * request.get('/shoes') * .query('size=10') * .query({ color: 'blue' }) * * @param {Object|String} val * @return {Request} for chaining * @api public */ Request.prototype.query = function (value) { if (typeof value === 'string') { this._query.push(value); } else { Object.assign(this.qs, value); } return this; }; /** * Write raw `data` / `encoding` to the socket. * * @param {Buffer|String} data * @param {String} encoding * @return {Boolean} * @api public */ Request.prototype.write = function (data, encoding) { const request_ = this.request(); if (!this._streamRequest) { this._streamRequest = true; } return request_.write(data, encoding); }; /** * Pipe the request body to `stream`. * * @param {Stream} stream * @param {Object} options * @return {Stream} * @api public */ Request.prototype.pipe = function (stream, options) { this.piped = true; // HACK... this.buffer(false); this.end(); return this._pipeContinue(stream, options); }; Request.prototype._pipeContinue = function (stream, options) { this.req.once('response', (res) => { // redirect if ( isRedirect(res.statusCode) && this._redirects++ !== this._maxRedirects ) { return this._redirect(res) === this ? this._pipeContinue(stream, options) : undefined; } this.res = res; this._emitResponse(); if (this._aborted) return; if (this._shouldUnzip(res)) { const unzipObject = zlib.createUnzip(); unzipObject.on('error', (error) => { if (error && error.code === 'Z_BUF_ERROR') { // unexpected end of file is ignored by browsers and curl stream.emit('end'); return; } stream.emit('error', error); }); res.pipe(unzipObject).pipe(stream, options); } else { res.pipe(stream, options); } res.once('end', () => { this.emit('end'); }); }); return stream; }; /** * Enable / disable buffering. * * @return {Boolean} [val] * @return {Request} for chaining * @api public */ Request.prototype.buffer = function (value) { this._buffer = value !== false; return this; }; /** * Redirect to `url * * @param {IncomingMessage} res * @return {Request} for chaining * @api private */ Request.prototype._redirect = function (res) { let url = res.headers.location; if (!url) { return this.callback(new Error('No location header for redirect'), res); } debug('redirect %s -> %s', this.url, url); // location url = resolve(this.url, url); // ensure the response is being consumed // this is required for Node v0.10+ res.resume(); let headers = this.req.getHeaders ? this.req.getHeaders() : this.req._headers; const changesOrigin = parse(url).host !== parse(this.url).host; // implementation of 302 following defacto standard if (res.statusCode === 301 || res.statusCode === 302) { // strip Content-* related fields // in case of POST etc headers = utils.cleanHeader(headers, changesOrigin); // force GET this.method = this.method === 'HEAD' ? 'HEAD' : 'GET'; // clear data this._data = null; } // 303 is always GET if (res.statusCode === 303) { // strip Content-* related fields // in case of POST etc headers = utils.cleanHeader(headers, changesOrigin); // force method this.method = 'GET'; // clear data this._data = null; } // 307 preserves method // 308 preserves method delete headers.host; delete this.req; delete this._formData; // remove all add header except User-Agent _initHeaders(this); // redirect this._endCalled = false; this.url = url; this.qs = {}; this._query.length = 0; this.set(headers); this.emit('redirect', res); this._redirectList.push(this.url); this.end(this._callback); return this; }; /** * Set Authorization field value with `user` and `pass`. * * Examples: * * .auth('tobi', 'learnboost') * .auth('tobi:learnboost') * .auth('tobi') * .auth(accessToken, { type: 'bearer' }) * * @param {String} user * @param {String} [pass] * @param {Object} [options] options with authorization type 'basic' or 'bearer' ('basic' is default) * @return {Request} for chaining * @api public */ Request.prototype.auth = function (user, pass, options) { if (arguments.length === 1) pass = ''; if (typeof pass === 'object' && pass !== null) { // pass is optional and can be replaced with options options = pass; pass = ''; } if (!options) { options = { type: 'basic' }; } const encoder = (string) => Buffer.from(string).toString('base64'); return this._auth(user, pass, options, encoder); }; /** * Set the certificate authority option for https request. * * @param {Buffer | Array} cert * @return {Request} for chaining * @api public */ Request.prototype.ca = function (cert) { this._ca = cert; return this; }; /** * Set the client certificate key option for https request. * * @param {Buffer | String} cert * @return {Request} for chaining * @api public */ Request.prototype.key = function (cert) { this._key = cert; return this; }; /** * Set the key, certificate, and CA certs of the client in PFX or PKCS12 format. * * @param {Buffer | String} cert * @return {Request} for chaining * @api public */ Request.prototype.pfx = function (cert) { if (typeof cert === 'object' && !Buffer.isBuffer(cert)) { this._pfx = cert.pfx; this._passphrase = cert.passphrase; } else { this._pfx = cert; } return this; }; /** * Set the client certificate option for https request. * * @param {Buffer | String} cert * @return {Request} for chaining * @api public */ Request.prototype.cert = function (cert) { this._cert = cert; return this; }; /** * Do not reject expired or invalid TLS certs. * sets `rejectUnauthorized=true`. Be warned that this allows MITM attacks. * * @return {Request} for chaining * @api public */ Request.prototype.disableTLSCerts = function () { this._disableTLSCerts = true; return this; }; /** * Return an http[s] request. * * @return {OutgoingMessage} * @api private */ // eslint-disable-next-line complexity Request.prototype.request = function () { if (this.req) return this.req; const options = {}; try { const query = qs.stringify(this.qs, { indices: false, strictNullHandling: true }); if (query) { this.qs = {}; this._query.push(query); } this._finalizeQueryString(); } catch (err) { return this.emit('error', err); } let { url } = this; const retries = this._retries; // Capture backticks as-is from the final query string built above. // Note: this'll only find backticks entered in req.query(String) // calls, because qs.stringify unconditionally encodes backticks. let queryStringBackticks; if (url.includes('`')) { const queryStartIndex = url.indexOf('?'); if (queryStartIndex !== -1) { const queryString = url.slice(queryStartIndex + 1); queryStringBackticks = queryString.match(/`|%60/g); } } // default to http:// if (url.indexOf('http') !== 0) url = `http://${url}`; url = parse(url); // See https://github.com/visionmedia/superagent/issues/1367 if (queryStringBackticks) { let i = 0; url.query = url.query.replace(/%60/g, () => queryStringBackticks[i++]); url.search = `?${url.query}`; url.path = url.pathname + url.search; } // support unix sockets if (/^https?\+unix:/.test(url.protocol) === true) { // get the protocol url.protocol = `${url.protocol.split('+')[0]}:`; // get the socket, path const unixParts = url.path.match(/^([^/]+)(.+)$/); options.socketPath = unixParts[1].replace(/%2F/g, '/'); url.path = unixParts[2]; } // Override IP address of a hostname if (this._connectOverride) { const { hostname } = url; const match = hostname in this._connectOverride ? this._connectOverride[hostname] : this._connectOverride['*']; if (match) { // backup the real host if (!this._header.host) { this.set('host', url.host); } let newHost; let newPort; if (typeof match === 'object') { newHost = match.host; newPort = match.port; } else { newHost = match; newPort = url.port; } // wrap [ipv6] url.host = /:/.test(newHost) ? `[${newHost}]` : newHost; if (newPort) { url.host += `:${newPort}`; url.port = newPort; } url.hostname = newHost; } } // options options.method = this.method; options.port = url.port; options.path = url.path; options.host = url.hostname; options.ca = this._ca; options.key = this._key; options.pfx = this._pfx; options.cert = this._cert; options.passphrase = this._passphrase; options.agent = this._agent; options.rejectUnauthorized = typeof this._disableTLSCerts === 'boolean' ? !this._disableTLSCerts : process.env.NODE_TLS_REJECT_UNAUTHORIZED !== '0'; // Allows request.get('https://1.2.3.4/').set('Host', 'example.com') if (this._header.host) { options.servername = this._header.host.replace(/:\d+$/, ''); } if ( this._trustLocalhost && /^(?:localhost|127\.0\.0\.\d+|(0*:)+:0*1)$/.test(url.hostname) ) { options.rejectUnauthorized = false; } // initiate request const mod = this._enableHttp2 ? exports.protocols['http2:'].setProtocol(url.protocol) : exports.protocols[url.protocol]; // request this.req = mod.request(options); const { req } = this; // set tcp no delay req.setNoDelay(true); if (options.method !== 'HEAD') { req.setHeader('Accept-Encoding', 'gzip, deflate'); } this.protocol = url.protocol; this.host = url.host; // expose events req.once('drain', () => { this.emit('drain'); }); req.on('error', (error) => { // flag abortion here for out timeouts // because node will emit a faux-error "socket hang up" // when request is aborted before a connection is made if (this._aborted) return; // if not the same, we are in the **old** (cancelled) request, // so need to continue (same as for above) if (this._retries !== retries) return; // if we've received a response then we don't want to let // an error in the request blow up the response if (this.response) return; this.callback(error); }); // auth if (url.auth) { const auth = url.auth.split(':'); this.auth(auth[0], auth[1]); } if (this.username && this.password) { this.auth(this.username, this.password); } for (const key in this.header) { if (hasOwn(this.header, key)) req.setHeader(key, this.header[key]); } // add cookies if (this.cookies) { if (hasOwn(this._header, 'cookie')) { // merge const temporaryJar = new CookieJar.CookieJar(); temporaryJar.setCookies(this._header.cookie.split(';')); temporaryJar.setCookies(this.cookies.split(';')); req.setHeader( 'Cookie', temporaryJar.getCookies(CookieJar.CookieAccessInfo.All).toValueString() ); } else { req.setHeader('Cookie', this.cookies); } } return req; }; /** * Invoke the callback with `err` and `res` * and handle arity check. * * @param {Error} err * @param {Response} res * @api private */ Request.prototype.callback = function (error, res) { if (this._shouldRetry(error, res)) { return this._retry(); } // Avoid the error which is emitted from 'socket hang up' to cause the fn undefined error on JS runtime. const fn = this._callback || noop; this.clearTimeout(); if (this.called) return console.warn('superagent: double callback bug'); this.called = true; if (!error) { try { if (!this._isResponseOK(res)) { let message = 'Unsuccessful HTTP response'; if (res) { message = http.STATUS_CODES[res.status] || message; } error = new Error(message); error.status = res ? res.status : undefined; } } catch (error_) { error = error_; } } // It's important that the callback is called outside try/catch // to avoid double callback if (!error) { return fn(null, res); } error.response = res; if (this._maxRetries) error.retries = this._retries - 1; // only emit error event if there is a listener // otherwise we assume the callback to `.end()` will get the error if (error && this.listeners('error').length > 0) { this.emit('error', error); } fn(error, res); }; /** * Check if `obj` is a host object, * * @param {Object} obj host object * @return {Boolean} is a host object * @api private */ Request.prototype._isHost = function (object) { return ( Buffer.isBuffer(object) || object instanceof Stream || object instanceof FormData ); }; /** * Initiate request, invoking callback `fn(err, res)` * with an instanceof `Response`. * * @param {Function} fn * @return {Request} for chaining * @api public */ Request.prototype._emitResponse = function (body, files) { const response = new Response(this); this.response = response; response.redirects = this._redirectList; if (undefined !== body) { response.body = body; } response.files = files; if (this._endCalled) { response.pipe = function () { throw new Error( "end() has already been called, so it's too late to start piping" ); }; } this.emit('response', response); return response; }; Request.prototype.end = function (fn) { this.request(); debug('%s %s', this.method, this.url); if (this._endCalled) { throw new Error( '.end() was called twice. This is not supported in superagent' ); } this._endCalled = true; // store callback this._callback = fn || noop; this._end(); }; Request.prototype._end = function () { if (this._aborted) return this.callback( new Error('The request has been aborted even before .end() was called') ); let data = this._data; const { req } = this; const { method } = this; this._setTimeouts(); // body if (method !== 'HEAD' && !req._headerSent) { // serialize stuff if (typeof data !== 'string') { let contentType = req.getHeader('Content-Type'); // Parse out just the content type from the header (ignore the charset) if (contentType) contentType = contentType.split(';')[0]; let serialize = this._serializer || exports.serialize[contentType]; if (!serialize && isJSON(contentType)) { serialize = exports.serialize['application/json']; } if (serialize) data = serialize(data); } // content-length if (data && !req.getHeader('Content-Length')) { req.setHeader( 'Content-Length', Buffer.isBuffer(data) ? data.length : Buffer.byteLength(data) ); } } // response // eslint-disable-next-line complexity req.once('response', (res) => { debug('%s %s -> %s', this.method, this.url, res.statusCode); if (this._responseTimeoutTimer) { clearTimeout(this._responseTimeoutTimer); } if (this.piped) { return; } const max = this._maxRedirects; const mime = utils.type(res.headers['content-type'] || '') || 'text/plain'; let type = mime.split('/')[0]; if (type) type = type.toLowerCase().trim(); const multipart = type === 'multipart'; const redirect = isRedirect(res.statusCode); const responseType = this._responseType; this.res = res; // redirect if (redirect && this._redirects++ !== max) { return this._redirect(res); } if (this.method === 'HEAD') { this.emit('end'); this.callback(null, this._emitResponse()); return; } // zlib support if (this._shouldUnzip(res)) { unzip(req, res); } let buffer = this._buffer; if (buffer === undefined && mime in exports.buffer) { buffer = Boolean(exports.buffer[mime]); } let parser = this._parser; if (undefined === buffer && parser) { console.warn( "A custom superagent parser has been set, but buffering strategy for the parser hasn't been configured. Call `req.buffer(true or false)` or set `superagent.buffer[mime] = true or false`" ); buffer = true; } if (!parser) { if (responseType) { parser = exports.parse.image; // It's actually a generic Buffer buffer = true; } else if (multipart) { const form = formidable(); parser = form.parse.bind(form); buffer = true; } else if (isImageOrVideo(mime)) { parser = exports.parse.image; buffer = true; // For backwards-compatibility buffering default is ad-hoc MIME-dependent } else if (exports.parse[mime]) { parser = exports.parse[mime]; } else if (type === 'text') { parser = exports.parse.text; buffer = buffer !== false; // everyone wants their own white-labeled json } else if (isJSON(mime)) { parser = exports.parse['application/json']; buffer = buffer !== false; } else if (buffer) { parser = exports.parse.text; } else if (undefined === buffer) { parser = exports.parse.image; // It's actually a generic Buffer buffer = true; } } // by default only buffer text/*, json and messed up thing from hell if ((undefined === buffer && isText(mime)) || isJSON(mime)) { buffer = true; } this._resBuffered = buffer; let parserHandlesEnd = false; if (buffer) { // Protectiona against zip bombs and other nuisance let responseBytesLeft = this._maxResponseSize || 200_000_000; res.on('data', (buf) => { responseBytesLeft -= buf.byteLength || buf.length > 0 ? buf.length : 0; if (responseBytesLeft < 0) { // This will propagate through error event const error = new Error('Maximum response size reached'); error.code = 'ETOOLARGE'; // Parsers aren't required to observe error event, // so would incorrectly report success parserHandlesEnd = false; // Will not emit error event res.destroy(error); // so we do callback now this.callback(error, null); } }); } if (parser) { try { // Unbuffered parsers are supposed to emit response early, // which is weird BTW, because response.body won't be there. parserHandlesEnd = buffer; parser(res, (error, object, files) => { if (this.timedout) { // Timeout has already handled all callbacks return; } // Intentional (non-timeout) abort is supposed to preserve partial response, // even if it doesn't parse. if (error && !this._aborted) { return this.callback(error); } if (parserHandlesEnd) { this.emit('end'); this.callback(null, this._emitResponse(object, files)); } }); } catch (err) { this.callback(err); return; } } this.res = res; // unbuffered if (!buffer) { debug('unbuffered %s %s', this.method, this.url); this.callback(null, this._emitResponse()); if (multipart) return; // allow multipart to handle end event res.once('end', () => { debug('end %s %s', this.method, this.url); this.emit('end'); }); return; } // terminating events res.once('error', (error) => { parserHandlesEnd = false; this.callback(error, null); }); if (!parserHandlesEnd) res.once('end', () => { debug('end %s %s', this.method, this.url); // TODO: unless buffering emit earlier to stream this.emit('end'); this.callback(null, this._emitResponse()); }); }); this.emit('request', this); const getProgressMonitor = () => { const lengthComputable = true; const total = req.getHeader('Content-Length'); let loaded = 0; const progress = new Stream.Transform(); progress._transform = (chunk, encoding, cb) => { loaded += chunk.length; this.emit('progress', { direction: 'upload', lengthComputable, loaded, total }); cb(null, chunk); }; return progress; }; const bufferToChunks = (buffer) => { const chunkSize = 16 * 1024; // default highWaterMark value const chunking = new Stream.Readable(); const totalLength = buffer.length; const remainder = totalLength % chunkSize; const cutoff = totalLength - remainder; for (let i = 0; i < cutoff; i += chunkSize) { const chunk = buffer.slice(i, i + chunkSize); chunking.push(chunk); } if (remainder > 0) { const remainderBuffer = buffer.slice(-remainder); chunking.push(remainderBuffer); } chunking.push(null); // no more data return chunking; }; // if a FormData instance got created, then we send that as the request body const formData = this._formData; if (formData) { // set headers const headers = formData.getHeaders(); for (const i in headers) { if (hasOwn(headers, i)) { debug('setting FormData header: "%s: %s"', i, headers[i]); req.setHeader(i, headers[i]); } } // attempt to get "Content-Length" header formData.getLength((error, length) => { // TODO: Add chunked encoding when no length (if err) if (error) debug('formData.getLength had error', error, length); debug('got FormData Content-Length: %s', length); if (typeof length === 'number') { req.setHeader('Content-Length', length); } formData.pipe(getProgressMonitor()).pipe(req); }); } else if (Buffer.isBuffer(data)) { bufferToChunks(data).pipe(getProgressMonitor()).pipe(req); } else { req.end(data); } }; // Check whether response has a non-0-sized gzip-encoded body Request.prototype._shouldUnzip = (res) => { if (res.statusCode === 204 || res.statusCode === 304) { // These aren't supposed to have any body return false; } // header content is a string, and distinction between 0 and no information is crucial if (res.headers['content-length'] === '0') { // We know that the body is empty (unfortunately, this check does not cover chunked encoding) return false; } // console.log(res); return /^\s*(?:deflate|gzip)\s*$/.test(res.headers['content-encoding']); }; /** * Overrides DNS for selected hostnames. Takes object mapping hostnames to IP addresses. * * When making a request to a URL with a hostname exactly matching a key in the object, * use the given IP address to connect, instead of using DNS to resolve the hostname. * * A special host `*` matches every hostname (keep redirects in mind!) * * request.connect({ * 'test.example.com': '127.0.0.1', * 'ipv6.example.com': '::1', * }) */ Request.prototype.connect = function (connectOverride) { if (typeof connectOverride === 'string') { this._connectOverride = { '*': connectOverride }; } else if (typeof connectOverride === 'object') { this._connectOverride = connectOverride; } else { this._connectOverride = undefined; } return this; }; Request.prototype.trustLocalhost = function (toggle) { this._trustLocalhost = toggle === undefined ? true : toggle; return this; }; // generate HTTP verb methods if (!methods.includes('del')) { // create a copy so we don't cause conflicts with // other packages using the methods package and // npm 3.x methods = [...methods]; methods.push('del'); } for (let method of methods) { const name = method; method = method === 'del' ? 'delete' : method; method = method.toUpperCase(); request[name] = (url, data, fn) => { const request_ = request(method, url); if (typeof data === 'function') { fn = data; data = null; } if (data) { if (method === 'GET' || method === 'HEAD') { request_.query(data); } else { request_.send(data); } } if (fn) request_.end(fn); return request_; }; } /** * Check if `mime` is text and should be buffered. * * @param {String} mime * @return {Boolean} * @api public */ function isText(mime) { const parts = mime.split('/'); let type = parts[0]; if (type) type = type.toLowerCase().trim(); let subtype = parts[1]; if (subtype) subtype = subtype.toLowerCase().trim(); return type === 'text' || subtype === 'x-www-form-urlencoded'; } function isImageOrVideo(mime) { let type = mime.split('/')[0]; if (type) type = type.toLowerCase().trim(); return type === 'image' || type === 'video'; } /** * Check if `mime` is json or has +json structured syntax suffix. * * @param {String} mime * @return {Boolean} * @api private */ function isJSON(mime) { // should match /json or +json // but not /json-seq return /[/+]json($|[^-\w])/i.test(mime); } /** * Check if we should follow the redirect `code`. * * @param {Number} code * @return {Boolean} * @api private */ function isRedirect(code) { return [301, 302, 303, 305, 307, 308].includes(code); } superagent-7.1.1/src/node/parsers/000077500000000000000000000000001417204173300170725ustar00rootroot00000000000000superagent-7.1.1/src/node/parsers/image.js000066400000000000000000000003261417204173300205130ustar00rootroot00000000000000module.exports = (res, fn) => { const data = []; // Binary data needs binary storage res.on('data', (chunk) => { data.push(chunk); }); res.on('end', () => { fn(null, Buffer.concat(data)); }); }; superagent-7.1.1/src/node/parsers/index.js000066400000000000000000000004531417204173300205410ustar00rootroot00000000000000exports['application/x-www-form-urlencoded'] = require('./urlencoded'); exports['application/json'] = require('./json'); exports.text = require('./text'); const binary = require('./image'); exports['application/octet-stream'] = binary; exports['application/pdf'] = binary; exports.image = binary; superagent-7.1.1/src/node/parsers/json.js000066400000000000000000000011151417204173300203770ustar00rootroot00000000000000module.exports = function (res, fn) { res.text = ''; res.setEncoding('utf8'); res.on('data', (chunk) => { res.text += chunk; }); res.on('end', () => { let body; let error; try { body = res.text && JSON.parse(res.text); } catch (error_) { error = error_; // issue #675: return the raw response if the response parsing fails error.rawResponse = res.text || null; // issue #876: return the http status code if the response parsing fails error.statusCode = res.statusCode; } finally { fn(error, body); } }); }; superagent-7.1.1/src/node/parsers/text.js000066400000000000000000000002371417204173300204160ustar00rootroot00000000000000module.exports = (res, fn) => { res.text = ''; res.setEncoding('utf8'); res.on('data', (chunk) => { res.text += chunk; }); res.on('end', fn); }; superagent-7.1.1/src/node/parsers/urlencoded.js000066400000000000000000000004741417204173300215610ustar00rootroot00000000000000/** * Module dependencies. */ const qs = require('qs'); module.exports = (res, fn) => { res.text = ''; res.setEncoding('ascii'); res.on('data', (chunk) => { res.text += chunk; }); res.on('end', () => { try { fn(null, qs.parse(res.text)); } catch (err) { fn(err); } }); }; superagent-7.1.1/src/node/response.js000066400000000000000000000052751417204173300176200ustar00rootroot00000000000000/** * Module dependencies. */ const util = require('util'); const Stream = require('stream'); const ResponseBase = require('../response-base'); const { mixin } = require('../utils'); /** * Expose `Response`. */ module.exports = Response; /** * Initialize a new `Response` with the given `xhr`. * * - set flags (.ok, .error, etc) * - parse header * * @param {Request} req * @param {Object} options * @constructor * @extends {Stream} * @implements {ReadableStream} * @api private */ function Response(request) { Stream.call(this); this.res = request.res; const { res } = this; this.request = request; this.req = request.req; this.text = res.text; this.files = res.files || {}; this.buffered = request._resBuffered; this.headers = res.headers; this.header = this.headers; this._setStatusProperties(res.statusCode); this._setHeaderProperties(this.header); this.setEncoding = res.setEncoding.bind(res); res.on('data', this.emit.bind(this, 'data')); res.on('end', this.emit.bind(this, 'end')); res.on('close', this.emit.bind(this, 'close')); res.on('error', this.emit.bind(this, 'error')); } // Lazy access res.body. // https://github.com/nodejs/node/pull/39520#issuecomment-889697136 Object.defineProperty(Response.prototype, 'body', { get() { return this._body !== undefined ? this._body : this.res.body !== undefined ? this.res.body : {}; }, set(value) { this._body = value; } }); /** * Inherit from `Stream`. */ util.inherits(Response, Stream); mixin(Response.prototype, ResponseBase.prototype); /** * Implements methods of a `ReadableStream` */ Response.prototype.destroy = function (error) { this.res.destroy(error); }; /** * Pause. */ Response.prototype.pause = function () { this.res.pause(); }; /** * Resume. */ Response.prototype.resume = function () { this.res.resume(); }; /** * Return an `Error` representative of this response. * * @return {Error} * @api public */ Response.prototype.toError = function () { const { req } = this; const { method } = req; const { path } = req; const message = `cannot ${method} ${path} (${this.status})`; const error = new Error(message); error.status = this.status; error.text = this.text; error.method = method; error.path = path; return error; }; Response.prototype.setStatusProperties = function (status) { console.warn('In superagent 2.x setStatusProperties is a private method'); return this._setStatusProperties(status); }; /** * To json. * * @return {Object} * @api public */ Response.prototype.toJSON = function () { return { req: this.request.toJSON(), header: this.header, status: this.status, text: this.text }; }; superagent-7.1.1/src/node/unzip.js000066400000000000000000000030231417204173300171140ustar00rootroot00000000000000/** * Module dependencies. */ const { StringDecoder } = require('string_decoder'); const Stream = require('stream'); const zlib = require('zlib'); /** * Buffers response data events and re-emits when they're unzipped. * * @param {Request} req * @param {Response} res * @api private */ exports.unzip = (request, res) => { const unzip = zlib.createUnzip(); const stream = new Stream(); let decoder; // make node responseOnEnd() happy stream.req = request; unzip.on('error', (error) => { if (error && error.code === 'Z_BUF_ERROR') { // unexpected end of file is ignored by browsers and curl stream.emit('end'); return; } stream.emit('error', error); }); // pipe to unzip res.pipe(unzip); // override `setEncoding` to capture encoding res.setEncoding = (type) => { decoder = new StringDecoder(type); }; // decode upon decompressing with captured encoding unzip.on('data', (buf) => { if (decoder) { const string_ = decoder.write(buf); if (string_.length > 0) stream.emit('data', string_); } else { stream.emit('data', buf); } }); unzip.on('end', () => { stream.emit('end'); }); // override `on` to capture data listeners const _on = res.on; res.on = function (type, fn) { if (type === 'data' || type === 'end') { stream.on(type, fn.bind(res)); } else if (type === 'error') { stream.on(type, fn.bind(res)); _on.call(res, type, fn); } else { _on.call(res, type, fn); } return this; }; }; superagent-7.1.1/src/request-base.js000066400000000000000000000454661417204173300174430ustar00rootroot00000000000000const semver = require('semver'); /** * Module of mixed-in functions shared between node and client code */ const { isObject, hasOwn } = require('./utils'); /** * Expose `RequestBase`. */ module.exports = RequestBase; /** * Initialize a new `RequestBase`. * * @api public */ function RequestBase() {} /** * Clear previous timeout. * * @return {Request} for chaining * @api public */ RequestBase.prototype.clearTimeout = function () { clearTimeout(this._timer); clearTimeout(this._responseTimeoutTimer); clearTimeout(this._uploadTimeoutTimer); delete this._timer; delete this._responseTimeoutTimer; delete this._uploadTimeoutTimer; return this; }; /** * Override default response body parser * * This function will be called to convert incoming data into request.body * * @param {Function} * @api public */ RequestBase.prototype.parse = function (fn) { this._parser = fn; return this; }; /** * Set format of binary response body. * In browser valid formats are 'blob' and 'arraybuffer', * which return Blob and ArrayBuffer, respectively. * * In Node all values result in Buffer. * * Examples: * * req.get('/') * .responseType('blob') * .end(callback); * * @param {String} val * @return {Request} for chaining * @api public */ RequestBase.prototype.responseType = function (value) { this._responseType = value; return this; }; /** * Override default request body serializer * * This function will be called to convert data set via .send or .attach into payload to send * * @param {Function} * @api public */ RequestBase.prototype.serialize = function (fn) { this._serializer = fn; return this; }; /** * Set timeouts. * * - response timeout is time between sending request and receiving the first byte of the response. Includes DNS and connection time. * - deadline is the time from start of the request to receiving response body in full. If the deadline is too short large files may not load at all on slow connections. * - upload is the time since last bit of data was sent or received. This timeout works only if deadline timeout is off * * Value of 0 or false means no timeout. * * @param {Number|Object} ms or {response, deadline} * @return {Request} for chaining * @api public */ RequestBase.prototype.timeout = function (options) { if (!options || typeof options !== 'object') { this._timeout = options; this._responseTimeout = 0; this._uploadTimeout = 0; return this; } for (const option in options) { if (hasOwn(options, option)) { switch (option) { case 'deadline': this._timeout = options.deadline; break; case 'response': this._responseTimeout = options.response; break; case 'upload': this._uploadTimeout = options.upload; break; default: console.warn('Unknown timeout option', option); } } } return this; }; /** * Set number of retry attempts on error. * * Failed requests will be retried 'count' times if timeout or err.code >= 500. * * @param {Number} count * @param {Function} [fn] * @return {Request} for chaining * @api public */ RequestBase.prototype.retry = function (count, fn) { // Default to 1 if no count passed or true if (arguments.length === 0 || count === true) count = 1; if (count <= 0) count = 0; this._maxRetries = count; this._retries = 0; this._retryCallback = fn; return this; }; // // NOTE: we do not include ESOCKETTIMEDOUT because that is from `request` package // // // NOTE: we do not include EADDRINFO because it was removed from libuv in 2014 // // // // // TODO: expose these as configurable defaults // const ERROR_CODES = new Set([ 'ETIMEDOUT', 'ECONNRESET', 'EADDRINUSE', 'ECONNREFUSED', 'EPIPE', 'ENOTFOUND', 'ENETUNREACH', 'EAI_AGAIN' ]); const STATUS_CODES = new Set([ 408, 413, 429, 500, 502, 503, 504, 521, 522, 524 ]); // TODO: we would need to make this easily configurable before adding it in (e.g. some might want to add POST) // const METHODS = new Set(['GET', 'PUT', 'HEAD', 'DELETE', 'OPTIONS', 'TRACE']); /** * Determine if a request should be retried. * (Inspired by https://github.com/sindresorhus/got#retry) * * @param {Error} err an error * @param {Response} [res] response * @returns {Boolean} if segment should be retried */ RequestBase.prototype._shouldRetry = function (error, res) { if (!this._maxRetries || this._retries++ >= this._maxRetries) { return false; } if (this._retryCallback) { try { const override = this._retryCallback(error, res); if (override === true) return true; if (override === false) return false; // undefined falls back to defaults } catch (error_) { console.error(error_); } } // TODO: we would need to make this easily configurable before adding it in (e.g. some might want to add POST) /* if ( this.req && this.req.method && !METHODS.has(this.req.method.toUpperCase()) ) return false; */ if (res && res.status && STATUS_CODES.has(res.status)) return true; if (error) { if (error.code && ERROR_CODES.has(error.code)) return true; // Superagent timeout if (error.timeout && error.code === 'ECONNABORTED') return true; if (error.crossDomain) return true; } return false; }; /** * Retry request * * @return {Request} for chaining * @api private */ RequestBase.prototype._retry = function () { this.clearTimeout(); // node if (this.req) { this.req = null; this.req = this.request(); } this._aborted = false; this.timedout = false; this.timedoutError = null; return this._end(); }; /** * Promise support * * @param {Function} resolve * @param {Function} [reject] * @return {Request} */ RequestBase.prototype.then = function (resolve, reject) { if (!this._fullfilledPromise) { const self = this; if (this._endCalled) { console.warn( 'Warning: superagent request was sent twice, because both .end() and .then() were called. Never call .end() if you use promises' ); } this._fullfilledPromise = new Promise((resolve, reject) => { self.on('abort', () => { if (this._maxRetries && this._maxRetries > this._retries) { return; } if (this.timedout && this.timedoutError) { reject(this.timedoutError); return; } const error = new Error('Aborted'); error.code = 'ABORTED'; error.status = this.status; error.method = this.method; error.url = this.url; reject(error); }); self.end((error, res) => { if (error) reject(error); else resolve(res); }); }); } return this._fullfilledPromise.then(resolve, reject); }; RequestBase.prototype.catch = function (cb) { return this.then(undefined, cb); }; /** * Allow for extension */ RequestBase.prototype.use = function (fn) { fn(this); return this; }; RequestBase.prototype.ok = function (cb) { if (typeof cb !== 'function') throw new Error('Callback required'); this._okCallback = cb; return this; }; RequestBase.prototype._isResponseOK = function (res) { if (!res) { return false; } if (this._okCallback) { return this._okCallback(res); } return res.status >= 200 && res.status < 300; }; /** * Get request header `field`. * Case-insensitive. * * @param {String} field * @return {String} * @api public */ RequestBase.prototype.get = function (field) { return this._header[field.toLowerCase()]; }; /** * Get case-insensitive header `field` value. * This is a deprecated internal API. Use `.get(field)` instead. * * (getHeader is no longer used internally by the superagent code base) * * @param {String} field * @return {String} * @api private * @deprecated */ RequestBase.prototype.getHeader = RequestBase.prototype.get; /** * Set header `field` to `val`, or multiple fields with one object. * Case-insensitive. * * Examples: * * req.get('/') * .set('Accept', 'application/json') * .set('X-API-Key', 'foobar') * .end(callback); * * req.get('/') * .set({ Accept: 'application/json', 'X-API-Key': 'foobar' }) * .end(callback); * * @param {String|Object} field * @param {String} val * @return {Request} for chaining * @api public */ RequestBase.prototype.set = function (field, value) { if (isObject(field)) { for (const key in field) { if (hasOwn(field, key)) this.set(key, field[key]); } return this; } this._header[field.toLowerCase()] = value; this.header[field] = value; return this; }; /** * Remove header `field`. * Case-insensitive. * * Example: * * req.get('/') * .unset('User-Agent') * .end(callback); * * @param {String} field field name */ RequestBase.prototype.unset = function (field) { delete this._header[field.toLowerCase()]; delete this.header[field]; return this; }; /** * Write the field `name` and `val`, or multiple fields with one object * for "multipart/form-data" request bodies. * * ``` js * request.post('/upload') * .field('foo', 'bar') * .end(callback); * * request.post('/upload') * .field({ foo: 'bar', baz: 'qux' }) * .end(callback); * ``` * * @param {String|Object} name name of field * @param {String|Blob|File|Buffer|fs.ReadStream} val value of field * @param {String} options extra options, e.g. 'blob' * @return {Request} for chaining * @api public */ RequestBase.prototype.field = function (name, value, options) { // name should be either a string or an object. if (name === null || undefined === name) { throw new Error('.field(name, val) name can not be empty'); } if (this._data) { throw new Error( ".field() can't be used if .send() is used. Please use only .send() or only .field() & .attach()" ); } if (isObject(name)) { for (const key in name) { if (hasOwn(name, key)) this.field(key, name[key]); } return this; } if (Array.isArray(value)) { for (const i in value) { if (hasOwn(value, i)) this.field(name, value[i]); } return this; } // val should be defined now if (value === null || undefined === value) { throw new Error('.field(name, val) val can not be empty'); } if (typeof value === 'boolean') { value = String(value); } this._getFormData().append(name, value, options); return this; }; /** * Abort the request, and clear potential timeout. * * @return {Request} request * @api public */ RequestBase.prototype.abort = function () { if (this._aborted) { return this; } this._aborted = true; if (this.xhr) this.xhr.abort(); // browser if (this.req) { // Node v13 has major differences in `abort()` // https://github.com/nodejs/node/blob/v12.x/lib/internal/streams/end-of-stream.js // https://github.com/nodejs/node/blob/v13.x/lib/internal/streams/end-of-stream.js // https://github.com/nodejs/node/blob/v14.x/lib/internal/streams/end-of-stream.js // (if you run a diff across these you will see the differences) // // References: // // // // Thanks to @shadowgate15 and @niftylettuce if ( semver.gte(process.version, 'v13.0.0') && semver.lt(process.version, 'v14.0.0') ) { // Note that the reason this doesn't work is because in v13 as compared to v14 // there is no `callback = nop` set in end-of-stream.js above throw new Error( 'Superagent does not work in v13 properly with abort() due to Node.js core changes' ); } else if (semver.gte(process.version, 'v14.0.0')) { // We have to manually set `destroyed` to `true` in order for this to work // (see core internals of end-of-stream.js above in v14 branch as compared to v12) this.req.destroyed = true; } this.req.abort(); // node } this.clearTimeout(); this.emit('abort'); return this; }; RequestBase.prototype._auth = function (user, pass, options, base64Encoder) { switch (options.type) { case 'basic': this.set('Authorization', `Basic ${base64Encoder(`${user}:${pass}`)}`); break; case 'auto': this.username = user; this.password = pass; break; case 'bearer': // usage would be .auth(accessToken, { type: 'bearer' }) this.set('Authorization', `Bearer ${user}`); break; default: break; } return this; }; /** * Enable transmission of cookies with x-domain requests. * * Note that for this to work the origin must not be * using "Access-Control-Allow-Origin" with a wildcard, * and also must set "Access-Control-Allow-Credentials" * to "true". * * @api public */ RequestBase.prototype.withCredentials = function (on) { // This is browser-only functionality. Node side is no-op. if (on === undefined) on = true; this._withCredentials = on; return this; }; /** * Set the max redirects to `n`. Does nothing in browser XHR implementation. * * @param {Number} n * @return {Request} for chaining * @api public */ RequestBase.prototype.redirects = function (n) { this._maxRedirects = n; return this; }; /** * Maximum size of buffered response body, in bytes. Counts uncompressed size. * Default 200MB. * * @param {Number} n number of bytes * @return {Request} for chaining */ RequestBase.prototype.maxResponseSize = function (n) { if (typeof n !== 'number') { throw new TypeError('Invalid argument'); } this._maxResponseSize = n; return this; }; /** * Convert to a plain javascript object (not JSON string) of scalar properties. * Note as this method is designed to return a useful non-this value, * it cannot be chained. * * @return {Object} describing method, url, and data of this request * @api public */ RequestBase.prototype.toJSON = function () { return { method: this.method, url: this.url, data: this._data, headers: this._header }; }; /** * Send `data` as the request body, defaulting the `.type()` to "json" when * an object is given. * * Examples: * * // manual json * request.post('/user') * .type('json') * .send('{"name":"tj"}') * .end(callback) * * // auto json * request.post('/user') * .send({ name: 'tj' }) * .end(callback) * * // manual x-www-form-urlencoded * request.post('/user') * .type('form') * .send('name=tj') * .end(callback) * * // auto x-www-form-urlencoded * request.post('/user') * .type('form') * .send({ name: 'tj' }) * .end(callback) * * // defaults to x-www-form-urlencoded * request.post('/user') * .send('name=tobi') * .send('species=ferret') * .end(callback) * * @param {String|Object} data * @return {Request} for chaining * @api public */ // eslint-disable-next-line complexity RequestBase.prototype.send = function (data) { const isObject_ = isObject(data); let type = this._header['content-type']; if (this._formData) { throw new Error( ".send() can't be used if .attach() or .field() is used. Please use only .send() or only .field() & .attach()" ); } if (isObject_ && !this._data) { if (Array.isArray(data)) { this._data = []; } else if (!this._isHost(data)) { this._data = {}; } } else if (data && this._data && this._isHost(this._data)) { throw new Error("Can't merge these send calls"); } // merge if (isObject_ && isObject(this._data)) { for (const key in data) { if (hasOwn(data, key)) this._data[key] = data[key]; } } else if (typeof data === 'string') { // default to x-www-form-urlencoded if (!type) this.type('form'); type = this._header['content-type']; if (type) type = type.toLowerCase().trim(); if (type === 'application/x-www-form-urlencoded') { this._data = this._data ? `${this._data}&${data}` : data; } else { this._data = (this._data || '') + data; } } else { this._data = data; } if (!isObject_ || this._isHost(data)) { return this; } // default to json if (!type) this.type('json'); return this; }; /** * Sort `querystring` by the sort function * * * Examples: * * // default order * request.get('/user') * .query('name=Nick') * .query('search=Manny') * .sortQuery() * .end(callback) * * // customized sort function * request.get('/user') * .query('name=Nick') * .query('search=Manny') * .sortQuery(function(a, b){ * return a.length - b.length; * }) * .end(callback) * * * @param {Function} sort * @return {Request} for chaining * @api public */ RequestBase.prototype.sortQuery = function (sort) { // _sort default to true but otherwise can be a function or boolean this._sort = typeof sort === 'undefined' ? true : sort; return this; }; /** * Compose querystring to append to req.url * * @api private */ RequestBase.prototype._finalizeQueryString = function () { const query = this._query.join('&'); if (query) { this.url += (this.url.includes('?') ? '&' : '?') + query; } this._query.length = 0; // Makes the call idempotent if (this._sort) { const index = this.url.indexOf('?'); if (index >= 0) { const queryArray = this.url.slice(index + 1).split('&'); if (typeof this._sort === 'function') { queryArray.sort(this._sort); } else { queryArray.sort(); } this.url = this.url.slice(0, index) + '?' + queryArray.join('&'); } } }; // For backwards compat only RequestBase.prototype._appendQueryString = () => { console.warn('Unsupported'); }; /** * Invoke callback with timeout error. * * @api private */ RequestBase.prototype._timeoutError = function (reason, timeout, errno) { if (this._aborted) { return; } const error = new Error(`${reason + timeout}ms exceeded`); error.timeout = timeout; error.code = 'ECONNABORTED'; error.errno = errno; this.timedout = true; this.timedoutError = error; this.abort(); this.callback(error); }; RequestBase.prototype._setTimeouts = function () { const self = this; // deadline if (this._timeout && !this._timer) { this._timer = setTimeout(() => { self._timeoutError('Timeout of ', self._timeout, 'ETIME'); }, this._timeout); } // response timeout if (this._responseTimeout && !this._responseTimeoutTimer) { this._responseTimeoutTimer = setTimeout(() => { self._timeoutError( 'Response timeout of ', self._responseTimeout, 'ETIMEDOUT' ); }, this._responseTimeout); } }; superagent-7.1.1/src/response-base.js000066400000000000000000000050721417204173300175760ustar00rootroot00000000000000/** * Module dependencies. */ const utils = require('./utils'); /** * Expose `ResponseBase`. */ module.exports = ResponseBase; /** * Initialize a new `ResponseBase`. * * @api public */ function ResponseBase() {} /** * Get case-insensitive `field` value. * * @param {String} field * @return {String} * @api public */ ResponseBase.prototype.get = function (field) { return this.header[field.toLowerCase()]; }; /** * Set header related properties: * * - `.type` the content type without params * * A response of "Content-Type: text/plain; charset=utf-8" * will provide you with a `.type` of "text/plain". * * @param {Object} header * @api private */ ResponseBase.prototype._setHeaderProperties = function (header) { // TODO: moar! // TODO: make this a util // content-type const ct = header['content-type'] || ''; this.type = utils.type(ct); // params const parameters = utils.params(ct); for (const key in parameters) { if (Object.prototype.hasOwnProperty.call(parameters, key)) this[key] = parameters[key]; } this.links = {}; // links try { if (header.link) { this.links = utils.parseLinks(header.link); } } catch { // ignore } }; /** * Set flags such as `.ok` based on `status`. * * For example a 2xx response will give you a `.ok` of __true__ * whereas 5xx will be __false__ and `.error` will be __true__. The * `.clientError` and `.serverError` are also available to be more * specific, and `.statusType` is the class of error ranging from 1..5 * sometimes useful for mapping respond colors etc. * * "sugar" properties are also defined for common cases. Currently providing: * * - .noContent * - .badRequest * - .unauthorized * - .notAcceptable * - .notFound * * @param {Number} status * @api private */ ResponseBase.prototype._setStatusProperties = function (status) { const type = Math.trunc(status / 100); // status / class this.statusCode = status; this.status = this.statusCode; this.statusType = type; // basics this.info = type === 1; this.ok = type === 2; this.redirect = type === 3; this.clientError = type === 4; this.serverError = type === 5; this.error = type === 4 || type === 5 ? this.toError() : false; // sugar this.created = status === 201; this.accepted = status === 202; this.noContent = status === 204; this.badRequest = status === 400; this.unauthorized = status === 401; this.notAcceptable = status === 406; this.forbidden = status === 403; this.notFound = status === 404; this.unprocessableEntity = status === 422; }; superagent-7.1.1/src/utils.js000066400000000000000000000041031417204173300161620ustar00rootroot00000000000000/** * Return the mime type for the given `str`. * * @param {String} str * @return {String} * @api private */ exports.type = (string_) => string_.split(/ *; */).shift(); /** * Return header field parameters. * * @param {String} str * @return {Object} * @api private */ exports.params = (value) => { const object = {}; for (const string_ of value.split(/ *; */)) { const parts = string_.split(/ *= */); const key = parts.shift(); const value = parts.shift(); if (key && value) object[key] = value; } return object; }; /** * Parse Link header fields. * * @param {String} str * @return {Object} * @api private */ exports.parseLinks = (value) => { const object = {}; for (const string_ of value.split(/ *, */)) { const parts = string_.split(/ *; */); const url = parts[0].slice(1, -1); const rel = parts[1].split(/ *= */)[1].slice(1, -1); object[rel] = url; } return object; }; /** * Strip content related fields from `header`. * * @param {Object} header * @return {Object} header * @api private */ exports.cleanHeader = (header, changesOrigin) => { delete header['content-type']; delete header['content-length']; delete header['transfer-encoding']; delete header.host; // secuirty if (changesOrigin) { delete header.authorization; delete header.cookie; } return header; }; /** * Check if `obj` is an object. * * @param {Object} object * @return {Boolean} * @api private */ exports.isObject = (object) => { return object !== null && typeof object === 'object'; }; /** * Object.hasOwn fallback/polyfill. * * @type {(object: object, property: string) => boolean} object * @api private */ exports.hasOwn = Object.hasOwn || function (object, property) { if (object == null) { throw new TypeError('Cannot convert undefined or null to object'); } return Object.prototype.hasOwnProperty.call(new Object(object), property); }; exports.mixin = (target, source) => { for (const key in source) { if (exports.hasOwn(source, key)) { target[key] = source[key]; } } }; superagent-7.1.1/test/000077500000000000000000000000001417204173300146565ustar00rootroot00000000000000superagent-7.1.1/test/agent-base.js000066400000000000000000000022611417204173300172230ustar00rootroot00000000000000const assert = require('assert'); const getSetup = require('./support/setup'); const request = require('./support/client'); describe('Agent', () => { let setup; let base; before(async () => { setup = await getSetup(); base = setup.uri; }); it('should remember defaults', () => { if (typeof Promise === 'undefined') { return; } let called = 0; let event_called = 0; const agent = request .agent() .accept('json') .use(() => { called++; }) .once('request', () => { event_called++; }) .query({ hello: 'world' }) .set('X-test', 'testing'); assert.equal(0, called); assert.equal(0, event_called); return agent .get(`${base}/echo`) .then((res) => { assert.equal(1, called); assert.equal(1, event_called); assert.equal('application/json', res.headers.accept); assert.equal('testing', res.headers['x-test']); return agent.get(`${base}/querystring`); }) .then((res) => { assert.equal(2, called); assert.equal(2, event_called); assert.deepEqual({ hello: 'world' }, res.body); }); }); }); superagent-7.1.1/test/basic.js000066400000000000000000000440041417204173300162770ustar00rootroot00000000000000const assert = require('assert'); const getSetup = require('./support/setup'); const request = require('./support/client'); describe('request', function () { let setup; let NODE; let uri; before(async () => { setup = await getSetup(); NODE = setup.NODE; uri = setup.uri; }); this.timeout(20_000); describe('res.statusCode', () => { it('should set statusCode', (done) => { request.get(`${uri}/login`, (error, res) => { try { assert.strictEqual(res.statusCode, 200); done(); } catch (err) { done(err); } }); }); }); describe('should allow the send shorthand', () => { it('with callback in the method call', (done) => { request.get(`${uri}/login`, (error, res) => { assert.equal(res.status, 200); done(); }); }); it('with data in the method call', (done) => { request.post(`${uri}/echo`, { foo: 'bar' }).end((error, res) => { assert.equal('{"foo":"bar"}', res.text); done(); }); }); it('with callback and data in the method call', (done) => { request.post(`${uri}/echo`, { foo: 'bar' }, (error, res) => { assert.equal('{"foo":"bar"}', res.text); done(); }); }); }); describe('with a callback', () => { it('should invoke .end()', (done) => { request.get(`${uri}/login`, (error, res) => { try { assert.equal(res.status, 200); done(); } catch (err) { done(err); } }); }); }); describe('.end()', () => { it('should issue a request', (done) => { request.get(`${uri}/login`).end((error, res) => { try { assert.equal(res.status, 200); done(); } catch (err) { done(err); } }); }); it('is optional with a promise', () => { if (typeof Promise === 'undefined') { return; } return request .get(`${uri}/login`) .then((res) => res.status) .then() .then((status) => { assert.equal(200, status, 'Real promises pass results through'); }); }); it('called only once with a promise', () => { if (typeof Promise === 'undefined') { return; } const request_ = request.get(`${uri}/unique`); return Promise.all([request_, request_, request_]).then((results) => { for (const item of results) { assert.equal( item.body, results[0].body, 'It should keep returning the same result after being called once' ); } }); }); }); describe('res.error', () => { it('ok', (done) => { let calledErrorEvent = false; let calledOKHandler = false; request .get(`${uri}/error`) .ok((res) => { assert.strictEqual(500, res.status); calledOKHandler = true; return true; }) .on('error', (error) => { calledErrorEvent = true; }) .end((error, res) => { try { assert.ifError(error); assert.strictEqual(res.status, 500); assert(!calledErrorEvent); assert(calledOKHandler); done(); } catch (err) { done(err); } }); }); it('should be an Error object', (done) => { let calledErrorEvent = false; request .get(`${uri}/error`) .on('error', (error) => { assert.strictEqual(error.status, 500); calledErrorEvent = true; }) .end((error, res) => { try { if (NODE) { res.error.message.should.equal('cannot GET /error (500)'); } else { res.error.message.should.equal(`cannot GET ${uri}/error (500)`); } assert.strictEqual(res.error.status, 500); assert(error, 'should have an error for 500'); assert.equal(error.message, 'Internal Server Error'); assert(calledErrorEvent); done(); } catch (err) { done(err); } }); }); it('with .then() promise', () => { if (typeof Promise === 'undefined') { return; } return request.get(`${uri}/error`).then( () => { assert.fail(); }, (err) => { assert.equal(err.message, 'Internal Server Error'); } ); }); it('with .ok() returning false', () => { if (typeof Promise === 'undefined') { return; } return request .get(`${uri}/echo`) .ok(() => false) .then( () => { assert.fail(); }, (err) => { assert.equal(200, err.response.status); assert.equal(err.message, 'OK'); } ); }); it('with .ok() throwing an Error', () => { if (typeof Promise === 'undefined') { return; } return request .get(`${uri}/echo`) .ok(() => { throw new Error('boom'); }) .then( () => { assert.fail(); }, (err) => { assert.equal(200, err.response.status); assert.equal(err.message, 'boom'); } ); }); }); describe('res.header', () => { it('should be an object', (done) => { request.get(`${uri}/login`).end((error, res) => { try { assert.equal('Express', res.header['x-powered-by']); done(); } catch (err) { done(err); } }); }); }); describe('set headers', () => { before(() => { Object.prototype.invalid = 'invalid'; }); after(() => { delete Object.prototype.invalid; }); it('should only set headers for ownProperties of header', (done) => { try { request .get(`${uri}/echo-headers`) .set('valid', 'ok') .end((error, res) => { if ( !error && res.body && res.body.valid && !res.body.hasOwnProperty('invalid') ) { return done(); } done(error || new Error('fail')); }); } catch (err) { done(err); } }); }); describe('res.charset', () => { it('should be set when present', (done) => { request.get(`${uri}/login`).end((error, res) => { try { res.charset.should.equal('utf-8'); done(); } catch (err) { done(err); } }); }); }); describe('res.statusType', () => { it('should provide the first digit', (done) => { request.get(`${uri}/login`).end((error, res) => { try { assert(!error, 'should not have an error for success responses'); assert.equal(200, res.status); assert.equal(2, res.statusType); done(); } catch (err) { done(err); } }); }); }); describe('res.type', () => { it('should provide the mime-type void of params', (done) => { request.get(`${uri}/login`).end((error, res) => { try { res.type.should.equal('text/html'); res.charset.should.equal('utf-8'); done(); } catch (err) { done(err); } }); }); }); describe('req.set(field, val)', () => { it('should set the header field', (done) => { request .post(`${uri}/echo`) .set('X-Foo', 'bar') .set('X-Bar', 'baz') .end((error, res) => { try { assert.equal('bar', res.header['x-foo']); assert.equal('baz', res.header['x-bar']); done(); } catch (err) { done(err); } }); }); }); describe('req.set(obj)', () => { it('should set the header fields', (done) => { request .post(`${uri}/echo`) .set({ 'X-Foo': 'bar', 'X-Bar': 'baz' }) .end((error, res) => { try { assert.equal('bar', res.header['x-foo']); assert.equal('baz', res.header['x-bar']); done(); } catch (err) { done(err); } }); }); }); describe('req.type(str)', () => { it('should set the Content-Type', (done) => { request .post(`${uri}/echo`) .type('text/x-foo') .end((error, res) => { try { res.header['content-type'].should.equal('text/x-foo'); done(); } catch (err) { done(err); } }); }); it('should map "json"', (done) => { request .post(`${uri}/echo`) .type('json') .send('{"a": 1}') .end((error, res) => { try { res.should.be.json(); done(); } catch (err) { done(err); } }); }); it('should map "html"', (done) => { request .post(`${uri}/echo`) .type('html') .end((error, res) => { try { res.header['content-type'].should.equal('text/html'); done(); } catch (err) { done(err); } }); }); }); describe('req.accept(str)', () => { it('should set Accept', (done) => { request .get(`${uri}/echo`) .accept('text/x-foo') .end((error, res) => { try { res.header.accept.should.equal('text/x-foo'); done(); } catch (err) { done(err); } }); }); it('should map "json"', (done) => { request .get(`${uri}/echo`) .accept('json') .end((error, res) => { try { res.header.accept.should.equal('application/json'); done(); } catch (err) { done(err); } }); }); it('should map "xml"', (done) => { request .get(`${uri}/echo`) .accept('xml') .end((error, res) => { try { // Mime module keeps changing this :( assert( res.header.accept == 'application/xml' || res.header.accept == 'text/xml' ); done(); } catch (err) { done(err); } }); }); it('should map "html"', (done) => { request .get(`${uri}/echo`) .accept('html') .end((error, res) => { try { res.header.accept.should.equal('text/html'); done(); } catch (err) { done(err); } }); }); }); describe('req.send(str)', () => { it('should write the string', (done) => { request .post(`${uri}/echo`) .type('json') .send('{"name":"tobi"}') .end((error, res) => { try { res.text.should.equal('{"name":"tobi"}'); done(); } catch (err) { done(err); } }); }); }); describe('req.send(Object)', () => { it('should default to json', (done) => { request .post(`${uri}/echo`) .send({ name: 'tobi' }) .end((error, res) => { try { res.should.be.json(); res.text.should.equal('{"name":"tobi"}'); done(); } catch (err) { done(err); } }); }); describe('when called several times', () => { it('should merge the objects', (done) => { request .post(`${uri}/echo`) .send({ name: 'tobi' }) .send({ age: 1 }) .end((error, res) => { try { res.should.be.json(); if (NODE) { res.buffered.should.be.true(); } res.text.should.equal('{"name":"tobi","age":1}'); done(); } catch (err) { done(err); } }); }); }); }); describe('.end(fn)', () => { it('should check arity', (done) => { request .post(`${uri}/echo`) .send({ name: 'tobi' }) .end((error, res) => { try { assert.ifError(error); res.text.should.equal('{"name":"tobi"}'); done(); } catch (err) { done(err); } }); }); it('should emit request', (done) => { const request_ = request.post(`${uri}/echo`); request_.on('request', (request) => { assert.equal(request_, request); done(); }); request_.end(); }); it('should emit response', (done) => { request .post(`${uri}/echo`) .send({ name: 'tobi' }) .on('response', (res) => { res.text.should.equal('{"name":"tobi"}'); done(); }) .end(); }); }); describe('.then(fulfill, reject)', () => { it('should support successful fulfills with .then(fulfill)', (done) => { if (typeof Promise === 'undefined') { return done(); } request .post(`${uri}/echo`) .send({ name: 'tobi' }) .then((res) => { res.type.should.equal('application/json'); res.text.should.equal('{"name":"tobi"}'); done(); }); }); it('should reject an error with .then(null, reject)', (done) => { if (typeof Promise === 'undefined') { return done(); } request.get(`${uri}/error`).then(null, (err) => { assert.equal(err.status, 500); assert.equal(err.response.text, 'boom'); done(); }); }); }); describe('.catch(reject)', () => { it('should reject an error with .catch(reject)', (done) => { if (typeof Promise === 'undefined') { return done(); } request.get(`${uri}/error`).catch((err) => { assert.equal(err.status, 500); assert.equal(err.response.text, 'boom'); done(); }); }); }); describe('.abort()', () => { it('should abort the request', (done) => { const request_ = request.get(`${uri}/delay/3000`); request_.end((error, res) => { try { assert(false, 'should not complete the request'); } catch (error_) { done(error_); } }); request_.on('error', (error) => { done(error); }); request_.on('abort', done); setTimeout(() => { request_.abort(); }, 500); }); it('should abort the promise', () => { const request_ = request.get(`${uri}/delay/3000`); setTimeout(() => { request_.abort(); }, 10); return request_.then( () => { assert.fail('should not complete the request'); }, (err) => { assert.equal('ABORTED', err.code); } ); }); it('should allow chaining .abort() several times', (done) => { const request_ = request.get(`${uri}/delay/3000`); request_.end((error, res) => { try { assert(false, 'should not complete the request'); } catch (error_) { done(error_); } }); // This also verifies only a single 'done' event is emitted request_.on('abort', done); setTimeout(() => { request_.abort().abort().abort(); }, 1000); }); it('should not allow abort then end', (done) => { request .get(`${uri}/delay/3000`) .abort() .end((error, res) => { done(error ? undefined : new Error('Expected abort error')); }); }); }); describe('req.toJSON()', () => { it('should describe the request', (done) => { const request_ = request.post(`${uri}/echo`).send({ foo: 'baz' }); request_.end((error, res) => { try { const json = request_.toJSON(); assert.equal('POST', json.method); assert(/\/echo$/.test(json.url)); assert.equal('baz', json.data.foo); done(); } catch (err) { done(err); } }); }); }); describe('req.options()', () => { it('should allow request body', (done) => { request .options(`${uri}/options/echo/body`) .send({ foo: 'baz' }) .end((error, res) => { try { assert.equal(error, null); assert.strictEqual(res.body.foo, 'baz'); done(); } catch (err) { done(err); } }); }); }); describe('req.sortQuery()', () => { it('nop with no querystring', (done) => { request .get(`${uri}/url`) .sortQuery() .end((error, res) => { try { assert.equal(res.text, '/url'); done(); } catch (err) { done(err); } }); }); it('should sort the request querystring', (done) => { request .get(`${uri}/url`) .query('search=Manny') .query('order=desc') .sortQuery() .end((error, res) => { try { assert.equal(res.text, '/url?order=desc&search=Manny'); done(); } catch (err) { done(err); } }); }); it('should allow disabling sorting', (done) => { request .get(`${uri}/url`) .query('search=Manny') .query('order=desc') .sortQuery() // take default of true .sortQuery(false) // override it in later call .end((error, res) => { try { assert.equal(res.text, '/url?search=Manny&order=desc'); done(); } catch (err) { done(err); } }); }); it('should sort the request querystring using customized function', (done) => { request .get(`${uri}/url`) .query('name=Nick') .query('search=Manny') .query('order=desc') .sortQuery((a, b) => a.length - b.length) .end((error, res) => { try { assert.equal(res.text, '/url?name=Nick&order=desc&search=Manny'); done(); } catch (err) { done(err); } }); }); }); }); superagent-7.1.1/test/client/000077500000000000000000000000001417204173300161345ustar00rootroot00000000000000superagent-7.1.1/test/client/request.js000066400000000000000000000203131417204173300201610ustar00rootroot00000000000000const assert = require('assert'); const request = require('../support/client'); describe('request', function () { this.timeout(20_000); it('request() error object', (next) => { request('GET', '/error').end((error, res) => { assert(error); assert(res.error, 'response should be an error'); assert.equal(res.error.message, 'cannot GET /error (500)'); assert.equal(res.error.status, 500); assert.equal(res.error.method, 'GET'); assert.equal(res.error.url, '/error'); next(); }); }); // This test results in a weird Jetty error on IE9 and IE11 saying PATCH is not a supported method. Looks like something's up with SauceLabs const isIE11 = Boolean(/Trident.*rv[ :]*11\./.test(navigator.userAgent)); const isIE9OrOlder = !window.atob; if (!isIE9OrOlder && !isIE11) { // Don't run on IE9 or older, or IE11 it('patch()', (next) => { request.patch('/user/12').end((error, res) => { assert.equal('updated', res.text); next(); }); }); } it('POST native FormData', (next) => { if (!window.FormData) { // Skip test if FormData is not supported by browser return next(); } const data = new FormData(); data.append('foo', 'bar'); request .post('/echo') .send(data) .end((error, res) => { assert.equal('multipart/form-data', res.type); next(); }); }); it('defaults attached files to original file names', (next) => { if (!window.FormData) { // Skip test if FormData is are not supported by browser return next(); } try { var file = new File([''], 'image.jpg', { type: 'image/jpeg' }); // eslint-disable-next-line unicorn/prefer-optional-catch-binding } catch (err) { // Skip if file constructor not supported. return next(); } request .post('/echo') .attach('image', file) .end((error, res) => { const regx = new RegExp(`filename="${file.name}"`); assert.notEqual(res.text.match(regx), null); next(); }); }); it('attach() cannot be mixed with send()', () => { if (!window.FormData || !window.File) { // Skip test if FormData is are not supported by browser return; } assert.throws(() => { const file = new File([''], 'image.jpg', { type: 'image/jpeg' }); request.post('/echo').attach('image', file).send('hi'); }); assert.throws(() => { const file = new File([''], 'image.jpg', { type: 'image/jpeg' }); request.post('/echo').send('hi').attach('image', file); }); }); it('GET invalid json', (next) => { request.get('/invalid-json').end((error, res) => { assert(error.parse); assert.deepEqual( error.rawResponse, ")]}', {'header':{'code':200,'text':'OK','version':'1.0'},'data':'some data'}" ); next(); }); }); it('GET querystring empty objects', (next) => { const request_ = request.get('/querystring').query({}); request_.end((error, res) => { assert.deepEqual(request_._query, []); assert.deepEqual(res.body, {}); next(); }); }); it('GET querystring object .get(uri, obj)', (next) => { request.get('/querystring', { search: 'Manny' }).end((error, res) => { assert.deepEqual(res.body, { search: 'Manny' }); next(); }); }); it('GET querystring object .get(uri, obj, fn)', (next) => { request.get('/querystring', { search: 'Manny' }, (error, res) => { assert.deepEqual(res.body, { search: 'Manny' }); next(); }); }); it('GET querystring object with null value', (next) => { request.get('/url', { nil: null }).end((error, res) => { assert.equal(res.text, '/url?nil'); next(); }); }); it('GET blob object', (next) => { if (typeof Blob === 'undefined') { return next(); } request .get('/blob', { foo: 'bar' }) .responseType('blob') .end((error, res) => { assert(res.xhr.response instanceof Blob); assert(res.body instanceof Blob); next(); }); }); it('Reject node-only function', () => { assert.throws(() => { request.get().write(); }); assert.throws(() => { request.get().pipe(); }); }); window.btoa = window.btoa || null; it('basic auth', (next) => { window.btoa = window.btoa || require('Base64').btoa; request .post('/auth') .auth('foo', 'bar') .end((error, res) => { assert.equal('foo', res.body.user); assert.equal('bar', res.body.pass); next(); }); }); it('auth type "basic"', (next) => { window.btoa = window.btoa || require('Base64').btoa; request .post('/auth') .auth('foo', 'bar', { type: 'basic' }) .end((error, res) => { assert.equal('foo', res.body.user); assert.equal('bar', res.body.pass); next(); }); }); it('auth type "auto"', (next) => { window.btoa = window.btoa || require('Base64').btoa; request .post('/auth') .auth('foo', 'bar', { type: 'auto' }) .end((error, res) => { assert.equal('foo', res.body.user); assert.equal('bar', res.body.pass); next(); }); }); it('progress event listener on xhr object registered when some on the request', () => { const request_ = request.get('/foo').on('progress', (data) => {}); request_.end(); if (request_.xhr.upload) { // Only run assertion on capable browsers assert.notEqual(null, request_.xhr.upload.onprogress); } }); it('no progress event listener on xhr object when none registered on request', () => { const request_ = request.get('/foo'); request_.end(); if (request_.xhr.upload) { // Only run assertion on capable browsers assert.strictEqual(null, request_.xhr.upload.onprogress); } }); it('Request#parse overrides body parser no matter Content-Type', (done) => { let runParser = false; function testParser(data) { runParser = true; return JSON.stringify(data); } request .post('/user') .serialize(testParser) .type('json') .send({ foo: 123 }) .end((error) => { if (error) return done(error); assert(runParser); done(); }); }); // Don't run on browsers without xhr2 support if ('FormData' in window) { it('xhr2 download file old hack', (next) => { request.parse['application/vnd.superagent'] = (object) => object; request .get('/arraybuffer') .on('request', function () { this.xhr.responseType = 'arraybuffer'; }) .on('response', (res) => { assert(res.body instanceof ArrayBuffer); next(); }) .end(); }); it('xhr2 download file responseType', (next) => { request.parse['application/vnd.superagent'] = (object) => object; request .get('/arraybuffer') .responseType('arraybuffer') .on('response', (res) => { assert(res.body instanceof ArrayBuffer); next(); }) .end(); }); it('get error status code and rawResponse on file download', (next) => { request .get('/arraybuffer-unauthorized') .responseType('arraybuffer') .end((error, res) => { assert.equal(error.status, 401); assert(res.body instanceof ArrayBuffer); assert(error.response.body instanceof ArrayBuffer); const decodedString = String.fromCharCode.apply( null, new Uint8Array(res.body) ); assert( decodedString, '{"message":"Authorization has been denied for this request."}' ); next(); }); }); } it('parse should take precedence over default parse', (done) => { request .get('/foo') .parse((res, text) => `customText: ${res.status}`) .end((error, res) => { assert(res.ok); assert(res.body === 'customText: 200'); done(); }); }); it('handles `xhr.open()` errors', (done) => { request .get('http://foo\0.com') // throws "Failed to execute 'open' on 'XMLHttpRequest': Invalid URL" .end((error, res) => { assert(error); done(); }); }); }); superagent-7.1.1/test/client/serialize.js000066400000000000000000000043311417204173300204620ustar00rootroot00000000000000const assert = require('assert'); const request = require('../support/client'); function serialize(object, res) { const value = request.serializeObject(object); assert.equal( value, res, `${JSON.stringify( object )} to "${res}" serialization failed. got: "${value}"` ); } function parse(string_, object) { const value = request.parseString(string_); assert.deepEqual( value, object, `"${string_}" to ${JSON.stringify( object )} parse failed. got: ${JSON.stringify(value)}` ); } describe('request.serializeObject()', () => { it('should serialize', () => { serialize('test', 'test'); serialize('foo=bar', 'foo=bar'); serialize({ foo: 'bar' }, 'foo=bar'); serialize({ foo: null }, 'foo'); serialize({ foo: 'null' }, 'foo=null'); serialize({ foo: undefined }, ''); serialize({ foo: 'undefined' }, 'foo=undefined'); serialize({ name: 'tj', age: 24 }, 'name=tj&age=24'); serialize({ name: '&tj&' }, 'name=%26tj%26'); serialize({ '&name&': 'tj' }, '%26name%26=tj'); serialize({ hello: '`test`' }, 'hello=%60test%60'); serialize({ $hello: 'test' }, '$hello=test'); }); }); describe('request.parseString()', () => { it('should parse', () => { parse('name=tj', { name: 'tj' }); parse('name=Manny&species=cat', { name: 'Manny', species: 'cat' }); parse('redirect=/&ok', { redirect: '/', ok: '' }); parse('%26name=tj', { '&name': 'tj' }); parse('name=tj%26', { name: 'tj&' }); parse('%60', { '`': '' }); }); }); describe('Merging objects', () => { it("Don't mix FormData and JSON", () => { if (!window.FormData) { // Skip test if FormData is not supported by browser return; } const data = new FormData(); data.append('foo', 'bar'); assert.throws(() => { request.post('/echo').send(data).send({ allowed: false }); }); }); it("Don't mix Blob and JSON", () => { if (!window.Blob) { return; } request .post('/echo') .send(new Blob(['will be cleared'])) .send(false) .send({ allowed: true }); assert.throws(() => { request .post('/echo') .send(new Blob(['hello'])) .send({ allowed: false }); }); }); }); superagent-7.1.1/test/client/xdomain.js000066400000000000000000000030371417204173300201340ustar00rootroot00000000000000const assert = require('assert'); const request = require('../support/client'); describe('xdomain', function () { this.timeout(20_000); // TODO (defunctzombie) I am not certain this actually forces xdomain request // use localtunnel.me and tunnel127.com alias instead it('should support req.withCredentials()', (next) => { request .get(`//${window.location.host}/xdomain`) .withCredentials() .end((error, res) => { assert.equal(200, res.status); assert.equal('tobi', res.text); next(); }); }); // xdomain not supported in old IE and IE11 gives weird Jetty errors (looks like a SauceLabs issue) const isIE11 = Boolean(/Trident.*rv[ :]*11\./.test(navigator.userAgent)); const isIE9OrOlder = !window.atob; if (!isIE9OrOlder && !isIE11) { // Don't run on IE9 or older, or IE11 it('should handle x-domain failure', (next) => { request.get('//tunne127.com').end((error, res) => { assert(error, 'error missing'); assert(error.crossDomain, 'not .crossDomain'); next(); }); }); it('should handle x-domain failure after repeat attempts', (next) => { request .get('//tunne127.com') .retry(2) .end((error, res) => { try { assert(error, 'error missing'); assert(error.crossDomain, 'not .crossDomain'); assert.equal(2, error.retries, 'expected an error with .retries'); next(); } catch (err) { next(err); } }); }); } }); superagent-7.1.1/test/content-type.js000066400000000000000000000015331417204173300176470ustar00rootroot00000000000000const assert = require('assert'); const getSetup = require('./support/setup'); const request = require('./support/client'); describe('req.set("Content-Type", contentType)', function () { let setup; let uri; before(async () => { setup = await getSetup(); uri = setup.uri; }); this.timeout(20_000); it('should work with just the contentType component', (done) => { request .post(`${uri}/echo`) .set('Content-Type', 'application/json') .send({ name: 'tobi' }) .end((error) => { assert(!error); done(); }); }); it('should work with the charset component', (done) => { request .post(`${uri}/echo`) .set('Content-Type', 'application/json; charset=utf-8') .send({ name: 'tobi' }) .end((error) => { assert(!error); done(); }); }); }); superagent-7.1.1/test/form.js000066400000000000000000000072161417204173300161650ustar00rootroot00000000000000const assert = require('assert'); const should = require('should'); const getSetup = require('./support/setup'); const request = require('./support/client'); if (!assert.deepStrictEqual) assert.deepStrictEqual = assert.deepEqual; describe('req.send(Object) as "form"', () => { let setup; let base; before(async () => { setup = await getSetup(); base = setup.uri; }); describe('with req.type() set to form', () => { it('should send x-www-form-urlencoded data', (done) => { request .post(`${base}/echo`) .type('form') .send({ name: 'tobi' }) .end((error, res) => { res.header['content-type'].should.equal( 'application/x-www-form-urlencoded' ); res.text.should.equal('name=tobi'); done(); }); }); }); describe('when called several times', () => { it('should merge the objects', (done) => { request .post(`${base}/echo`) .type('form') .send({ name: { first: 'tobi', last: 'holowaychuk' } }) .send({ age: '1' }) .end((error, res) => { res.header['content-type'].should.equal( 'application/x-www-form-urlencoded' ); res.text.should.equal( 'name%5Bfirst%5D=tobi&name%5Blast%5D=holowaychuk&age=1' ); done(); }); }); }); }); describe('req.attach', () => { it('ignores null file', (done) => { request .post('/echo') .attach('image', null) .end((error, res) => { done(); }); }); }); describe('req.field', function () { let setup; let base; let formDataSupported; before(async () => { setup = await getSetup(); base = setup.uri; formDataSupported = setup.NODE || FormData !== 'undefined'; }); this.timeout(5000); it('allow bools', (done) => { if (!formDataSupported) { return done(); } request .post(`${base}/formecho`) .field('bools', true) .field('strings', 'true') .end((error, res) => { assert.ifError(error); assert.deepStrictEqual(res.body, { bools: 'true', strings: 'true' }); done(); }); }); it('allow objects', (done) => { if (!formDataSupported) { return done(); } request .post(`${base}/formecho`) .field({ bools: true, strings: 'true' }) .end((error, res) => { assert.ifError(error); assert.deepStrictEqual(res.body, { bools: 'true', strings: 'true' }); done(); }); }); it('works with arrays in objects', (done) => { if (!formDataSupported) { return done(); } request .post(`${base}/formecho`) .field({ numbers: [1, 2, 3] }) .end((error, res) => { assert.ifError(error); assert.deepStrictEqual(res.body, { numbers: ['1', '2', '3'] }); done(); }); }); it('works with arrays', (done) => { if (!formDataSupported) { return done(); } request .post(`${base}/formecho`) .field('letters', ['a', 'b', 'c']) .end((error, res) => { assert.ifError(error); assert.deepStrictEqual(res.body, { letters: ['a', 'b', 'c'] }); done(); }); }); it('throw when empty', () => { should.throws(() => { request.post(`${base}/echo`).field(); }, /name/); should.throws(() => { request.post(`${base}/echo`).field('name'); }, /val/); }); it('cannot be mixed with send()', () => { assert.throws(() => { request.post('/echo').field('form', 'data').send('hi'); }); assert.throws(() => { request.post('/echo').send('hi').field('form', 'data'); }); }); }); superagent-7.1.1/test/json.js000066400000000000000000000136061417204173300161730ustar00rootroot00000000000000const getSetup = require('./support/setup'); const doesntWorkInHttp2 = !process.env.HTTP2_TEST; const assert = require('assert'); const request = require('./support/client'); describe('req.send(Object) as "json"', function () { let setup; let uri; let doesntWorkInBrowserYet; before(async () => { setup = await getSetup(); uri = setup.uri; doesntWorkInBrowserYet = setup.NODE; }); this.timeout(20_000); it('should default to json', (done) => { request .post(`${uri}/echo`) .send({ name: 'tobi' }) .end((error, res) => { res.should.be.json(); res.text.should.equal('{"name":"tobi"}'); done(); }); }); it('should work with arrays', (done) => { request .post(`${uri}/echo`) .send([1, 2, 3]) .end((error, res) => { res.should.be.json(); res.text.should.equal('[1,2,3]'); done(); }); }); it('should work with value null', (done) => { request .post(`${uri}/echo`) .type('json') .send('null') .end((error, res) => { res.should.be.json(); assert.strictEqual(res.body, null); done(); }); }); it('should work with value false', (done) => { request .post(`${uri}/echo`) .type('json') .send('false') .end((error, res) => { res.should.be.json(); res.body.should.equal(false); done(); }); }); if (doesntWorkInBrowserYet) it('should work with value 0', (done) => { // fails in IE9 request .post(`${uri}/echo`) .type('json') .send('0') .end((error, res) => { res.should.be.json(); res.body.should.equal(0); done(); }); }); it('should work with empty string value', (done) => { request .post(`${uri}/echo`) .type('json') .send('""') .end((error, res) => { res.should.be.json(); res.body.should.equal(''); done(); }); }); if (doesntWorkInBrowserYet && doesntWorkInHttp2) it('should work with GET', (done) => { request .get(`${uri}/echo`) .send({ tobi: 'ferret' }) .end((error, res) => { try { res.should.be.json(); res.text.should.equal('{"tobi":"ferret"}'); ({ tobi: 'ferret' }.should.eql(res.body)); done(); } catch (err) { done(err); } }); }); it('should work with vendor MIME type', (done) => { request .post(`${uri}/echo`) .set('Content-Type', 'application/vnd.example+json') .send({ name: 'vendor' }) .end((error, res) => { res.text.should.equal('{"name":"vendor"}'); ({ name: 'vendor' }.should.eql(res.body)); done(); }); }); describe('when called several times', () => { it('should merge the objects', (done) => { request .post(`${uri}/echo`) .send({ name: 'tobi' }) .send({ age: 1 }) .end((error, res) => { res.should.be.json(); res.text.should.equal('{"name":"tobi","age":1}'); ({ name: 'tobi', age: 1 }.should.eql(res.body)); done(); }); }); }); }); describe('res.body', function () { let setup; let uri; let doesntWorkInBrowserYet; before(async () => { setup = await getSetup(); uri = setup.uri; doesntWorkInBrowserYet = setup.NODE; }); this.timeout(20_000); describe('application/json', () => { it('should parse the body', (done) => { request.get(`${uri}/json`).end((error, res) => { res.text.should.equal('{"name":"manny"}'); res.body.should.eql({ name: 'manny' }); done(); }); }); }); if (doesntWorkInBrowserYet) describe('HEAD requests', () => { it('should not throw a parse error', (done) => { request.head(`${uri}/json`).end((error, res) => { try { assert.strictEqual(error, null); assert.strictEqual(res.text, undefined); assert.strictEqual(Object.keys(res.body).length, 0); done(); } catch (err) { done(err); } }); }); }); describe('Invalid JSON response', () => { it('should return the raw response', (done) => { request.get(`${uri}/invalid-json`).end((error, res) => { assert.deepEqual( error.rawResponse, ")]}', {'header':{'code':200,'text':'OK','version':'1.0'},'data':'some data'}" ); done(); }); }); it('should return the http status code', (done) => { request.get(`${uri}/invalid-json-forbidden`).end((error, res) => { assert.equal(error.statusCode, 403); done(); }); }); }); if (doesntWorkInBrowserYet) describe('No content', () => { it('should not throw a parse error', (done) => { request.get(`${uri}/no-content`).end((error, res) => { try { assert.strictEqual(error, null); assert.strictEqual(res.text, ''); assert.strictEqual(Object.keys(res.body).length, 0); done(); } catch (err) { done(err); } }); }); }); if (doesntWorkInBrowserYet) describe('application/json+hal', () => { it('should parse the body', (done) => { request.get(`${uri}/json-hal`).end((error, res) => { if (error) return done(error); res.text.should.equal('{"name":"hal 5000"}'); res.body.should.eql({ name: 'hal 5000' }); done(); }); }); }); if (doesntWorkInBrowserYet) describe('vnd.collection+json', () => { it('should parse the body', (done) => { request.get(`${uri}/collection-json`).end((error, res) => { res.text.should.equal('{"name":"chewbacca"}'); res.body.should.eql({ name: 'chewbacca' }); done(); }); }); }); }); superagent-7.1.1/test/node/000077500000000000000000000000001417204173300156035ustar00rootroot00000000000000superagent-7.1.1/test/node/agency.js000066400000000000000000000113411417204173300174070ustar00rootroot00000000000000'use strict'; require('should-http'); const express = require('../support/express'); const app = express(); const request = require('../support/client'); const assert = require('assert'); const should = require('should'); const cookieParser = require('cookie-parser'); const session = require('express-session'); let http = require('http'); if (process.env.HTTP2_TEST) { http = require('http2'); } app.use(cookieParser()); app.use( session({ secret: 'secret', resave: true, saveUninitialized: true }) ); app.post('/signin', (request_, res) => { request_.session.user = 'hunter@hunterloftis.com'; res.redirect('/dashboard'); }); app.post('/setcookie', (request_, res) => { res.cookie('cookie', 'jar'); res.sendStatus(200); }); app.get('/getcookie', (request_, res) => { res.status(200).send(request_.cookies.cookie); }); app.get('/dashboard', (request_, res) => { if (request_.session.user) return res.status(200).send('dashboard'); res.status(401).send('dashboard'); }); app.all('/signout', (request_, res) => { request_.session.regenerate(() => { res.status(200).send('signout'); }); }); app.get('/', (request_, res) => { if (request_.session.user) return res.redirect('/dashboard'); res.status(200).send('home'); }); app.post('/redirect', (request_, res) => { res.redirect('/simple'); }); app.get('/simple', (request_, res) => { res.status(200).send('simple'); }); let base = 'http://localhost'; let server; before(function listen(done) { server = http.createServer(app); server = server.listen(0, function listening() { base += `:${server.address().port}`; done(); }); }); describe('request', () => { describe('persistent agent', () => { const agent1 = request.agent(); const agent2 = request.agent(); const agent3 = request.agent(); const agent4 = request.agent(); it('should gain a session on POST', () => agent3.post(`${base}/signin`).then((res) => { res.should.have.status(200); should.not.exist(res.headers['set-cookie']); res.text.should.containEql('dashboard'); })); it('should start with empty session (set cookies)', (done) => { agent1.get(`${base}/dashboard`).end((error, res) => { should.exist(error); res.should.have.status(401); should.exist(res.headers['set-cookie']); done(); }); }); it('should gain a session (cookies already set)', () => agent1.post(`${base}/signin`).then((res) => { res.should.have.status(200); should.not.exist(res.headers['set-cookie']); res.text.should.containEql('dashboard'); })); it('should persist cookies across requests', () => agent1.get(`${base}/dashboard`).then((res) => { res.should.have.status(200); })); it('should have the cookie set in the end callback', () => agent4 .post(`${base}/setcookie`) .then(() => agent4.get(`${base}/getcookie`)) .then((res) => { res.should.have.status(200); assert.strictEqual(res.text, 'jar'); })); it('should not share cookies', (done) => { agent2.get(`${base}/dashboard`).end((error, res) => { should.exist(error); res.should.have.status(401); done(); }); }); it('should not lose cookies between agents', () => agent1.get(`${base}/dashboard`).then((res) => { res.should.have.status(200); })); it('should be able to follow redirects', () => agent1.get(base).then((res) => { res.should.have.status(200); res.text.should.containEql('dashboard'); })); it('should be able to post redirects', () => agent1 .post(`${base}/redirect`) .send({ foo: 'bar', baz: 'blaaah' }) .then((res) => { res.should.have.status(200); res.text.should.containEql('simple'); res.redirects.should.eql([`${base}/simple`]); })); it('should be able to limit redirects', (done) => { agent1 .get(base) .redirects(0) .end((error, res) => { should.exist(error); res.should.have.status(302); res.redirects.should.eql([]); res.header.location.should.equal('/dashboard'); done(); }); }); it('should be able to create a new session (clear cookie)', () => agent1.post(`${base}/signout`).then((res) => { res.should.have.status(200); should.exist(res.headers['set-cookie']); })); it('should regenerate with an empty session', (done) => { agent1.get(`${base}/dashboard`).end((error, res) => { should.exist(error); res.should.have.status(401); should.not.exist(res.headers['set-cookie']); done(); }); }); }); }); superagent-7.1.1/test/node/basic-auth.js000066400000000000000000000023051417204173300201610ustar00rootroot00000000000000'use strict'; const URL = require('url'); const request = require('../support/client'); const getSetup = require('../support/setup'); describe('Basic auth', () => { let setup; let base; before(async () => { setup = await getSetup(); base = setup.uri; }); describe('when credentials are present in url', () => { it('should set Authorization', (done) => { const new_url = URL.parse(base); new_url.auth = 'tobi:learnboost'; new_url.pathname = '/basic-auth'; request.get(URL.format(new_url)).end((error, res) => { res.status.should.equal(200); done(); }); }); }); describe('req.auth(user, pass)', () => { it('should set Authorization', (done) => { request .get(`${base}/basic-auth`) .auth('tobi', 'learnboost') .end((error, res) => { res.status.should.equal(200); done(); }); }); }); describe('req.auth(user + ":" + pass)', () => { it('should set authorization', (done) => { request .get(`${base}/basic-auth/again`) .auth('tobi') .end((error, res) => { res.status.should.eql(200); done(); }); }); }); }); superagent-7.1.1/test/node/basic.js000066400000000000000000000220141417204173300172210ustar00rootroot00000000000000'use strict'; const assert = require('assert'); const fs = require('fs'); const { EventEmitter } = require('events'); const { StringDecoder } = require('string_decoder'); const url = require('url'); const getSetup = require('../support/setup'); const request = require('../support/client'); const doesntWorkInHttp2 = !process.env.HTTP2_TEST; describe('[node] request', () => { let setup; let base; before(async () => { setup = await getSetup(); base = setup.uri; }); describe('with an url', () => { it('should preserve the encoding of the url', (done) => { request.get(`${base}/url?a=(b%29`).end((error, res) => { assert.equal('/url?a=(b%29', res.text); done(); }); }); }); describe('with an object', () => { it('should format the url', () => request.get(url.parse(`${base}/login`)).then((res) => { assert(res.ok); })); }); describe('without a schema', () => { it('should default to http', () => request.get(`${base}/login`).then((res) => { assert.equal(res.status, 200); })); }); describe('res.toJSON()', () => { it('should describe the response', () => request .post(`${base}/echo`) .send({ foo: 'baz' }) .then((res) => { const object = res.toJSON(); assert.equal('object', typeof object.header); assert.equal('object', typeof object.req); assert.equal(200, object.status); assert.equal('{"foo":"baz"}', object.text); })); }); describe('res.links', () => { it('should default to an empty object', () => request.get(`${base}/login`).then((res) => { res.links.should.eql({}); })); it('should parse the Link header field', (done) => { request.get(`${base}/links`).end((error, res) => { res.links.next.should.equal( 'https://api.github.com/repos/visionmedia/mocha/issues?page=2' ); done(); }); }); }); describe('req.unset(field)', () => { it('should remove the header field', (done) => { request .post(`${base}/echo`) .unset('User-Agent') .end((error, res) => { assert.equal(void 0, res.header['user-agent']); done(); }); }); }); describe('case-insensitive', () => { it('should set/get header fields case-insensitively', () => { const r = request.post(`${base}/echo`); r.set('MiXeD', 'helloes'); assert.strictEqual(r.get('mixed'), 'helloes'); }); it('should unset header fields case-insensitively', () => { const r = request.post(`${base}/echo`); r.set('MiXeD', 'helloes'); r.unset('MIXED'); assert.strictEqual(r.get('mixed'), undefined); }); }); describe('req.write(str)', () => { it('should write the given data', (done) => { const request_ = request.post(`${base}/echo`); request_.set('Content-Type', 'application/json'); assert.equal('boolean', typeof request_.write('{"name"')); assert.equal('boolean', typeof request_.write(':"tobi"}')); request_.end((error, res) => { res.text.should.equal('{"name":"tobi"}'); done(); }); }); }); describe('req.pipe(stream)', () => { it('should pipe the response to the given stream', (done) => { const stream = new EventEmitter(); stream.buf = ''; stream.writable = true; stream.write = function (chunk) { this.buf += chunk; }; stream.end = function () { this.buf.should.equal('{"name":"tobi"}'); done(); }; request.post(`${base}/echo`).send('{"name":"tobi"}').pipe(stream); }); }); describe('.buffer()', () => { it('should enable buffering', (done) => { request .get(`${base}/custom`) .buffer() .end((error, res) => { assert.ifError(error); assert.equal('custom stuff', res.text); assert(res.buffered); done(); }); }); it("should take precedence over request.buffer['someMimeType'] = false", (done) => { const type = 'application/barbaz'; const send = 'some text'; request.buffer[type] = false; request .post(`${base}/echo`) .type(type) .send(send) .buffer() .end((error, res) => { delete request.buffer[type]; assert.ifError(error); assert.equal(res.type, type); assert.equal(send, res.text); assert(res.buffered); done(); }); }); }); describe('.buffer(false)', () => { it('should disable buffering', (done) => { request .post(`${base}/echo`) .type('application/x-dog') .send('hello this is dog') .buffer(false) .end((error, res) => { assert.ifError(error); assert.equal(null, res.text); res.body.should.eql({}); let buf = ''; res.setEncoding('utf8'); res.on('data', (chunk) => { buf += chunk; }); res.on('end', () => { buf.should.equal('hello this is dog'); done(); }); }); }); it("should take precedence over request.buffer['someMimeType'] = true", (done) => { const type = 'application/foobar'; const send = 'hello this is a dog'; request.buffer[type] = true; request .post(`${base}/echo`) .type(type) .send(send) .buffer(false) .end((error, res) => { delete request.buffer[type]; assert.ifError(error); assert.equal(null, res.text); assert.equal(res.type, type); assert(!res.buffered); res.body.should.eql({}); let buf = ''; res.setEncoding('utf8'); res.on('data', (chunk) => { buf += chunk; }); res.on('end', () => { buf.should.equal(send); done(); }); }); }); }); describe('.withCredentials()', () => { it('should not throw an error when using the client-side "withCredentials" method', (done) => { request .get(`${base}/custom`) .withCredentials() .end((error, res) => { assert.ifError(error); done(); }); }); }); describe('.agent()', () => { it('should return the defaut agent', (done) => { const request_ = request.post(`${base}/echo`); request_.agent().should.equal(false); done(); }); }); describe('.agent(undefined)', () => { it('should set an agent to undefined and ensure it is chainable', (done) => { const request_ = request.get(`${base}/echo`); const returnValue = request_.agent(undefined); returnValue.should.equal(request_); assert.strictEqual(request_.agent(), undefined); done(); }); }); describe('.agent(new http.Agent())', () => { it('should set passed agent', (done) => { const http = require('http'); const request_ = request.get(`${base}/echo`); const agent = new http.Agent(); const returnValue = request_.agent(agent); returnValue.should.equal(request_); request_.agent().should.equal(agent); done(); }); }); describe('with a content type other than application/json or text/*', () => { it('should still use buffering', () => { return request .post(`${base}/echo`) .type('application/x-dog') .send('hello this is dog') .then((res) => { assert.equal(null, res.text); assert.equal(res.body.toString(), 'hello this is dog'); res.buffered.should.be.true; }); }); }); describe('content-length', () => { it('should be set to the byte length of a non-buffer object', (done) => { const decoder = new StringDecoder('utf8'); let img = fs.readFileSync(`${__dirname}/fixtures/test.png`); img = decoder.write(img); request .post(`${base}/echo`) .type('application/x-image') .send(img) .buffer(false) .end((error, res) => { assert.ifError(error); assert(!res.buffered); assert.equal(res.header['content-length'], Buffer.byteLength(img)); done(); }); }); it('should be set to the length of a buffer object', (done) => { const img = fs.readFileSync(`${__dirname}/fixtures/test.png`); request .post(`${base}/echo`) .type('application/x-image') .send(img) .buffer(true) .end((error, res) => { assert.ifError(error); assert(res.buffered); assert.equal(res.header['content-length'], img.length); done(); }); }); }); if (doesntWorkInHttp2) it('should send body with .get().send()', (next) => { request .get(`${base}/echo`) .set('Content-Type', 'text/plain') .send('wahoo') .end((error, res) => { try { assert.equal('wahoo', res.text); next(); } catch (err) { next(err); } }); }); }); superagent-7.1.1/test/node/buffers.js000066400000000000000000000062651417204173300176060ustar00rootroot00000000000000'use strict'; const assert = require('assert'); const request = require('../support/client'); const getSetup = require('../support/setup'); describe("req.buffer['someMimeType']", () => { let setup; let base; before(async () => { setup = await getSetup(); base = setup.uri; }); it('should respect that agent.buffer(true) takes precedent', (done) => { const agent = request.agent(); agent.buffer(true); const type = 'application/somerandomtype'; const send = 'somerandomtext'; request.buffer[type] = false; agent .post(`${base}/echo`) .type(type) .send(send) .end((error, res) => { delete request.buffer[type]; assert.ifError(error); assert.equal(res.type, type); assert.equal(send, res.text); assert(res.buffered); done(); }); }); it('should respect that agent.buffer(false) takes precedent', (done) => { const agent = request.agent(); agent.buffer(false); const type = 'application/barrr'; const send = 'some random text2'; request.buffer[type] = true; agent .post(`${base}/echo`) .type(type) .send(send) .end((error, res) => { delete request.buffer[type]; assert.ifError(error); assert.equal(null, res.text); assert.equal(res.type, type); assert(!res.buffered); res.body.should.eql({}); let buf = ''; res.setEncoding('utf8'); res.on('data', (chunk) => { buf += chunk; }); res.on('end', () => { buf.should.equal(send); done(); }); }); }); it('should disable buffering for that mimetype when false', (done) => { const type = 'application/bar'; const send = 'some random text'; request.buffer[type] = false; request .post(`${base}/echo`) .type(type) .send(send) .end((error, res) => { delete request.buffer[type]; assert.ifError(error); assert.equal(null, res.text); assert.equal(res.type, type); assert(!res.buffered); res.body.should.eql({}); let buf = ''; res.setEncoding('utf8'); res.on('data', (chunk) => { buf += chunk; }); res.on('end', () => { buf.should.equal(send); done(); }); }); }); it('should enable buffering for that mimetype when true', (done) => { const type = 'application/baz'; const send = 'woooo'; request.buffer[type] = true; request .post(`${base}/echo`) .type(type) .send(send) .end((error, res) => { delete request.buffer[type]; assert.ifError(error); assert.equal(res.type, type); assert.equal(send, res.text); assert(res.buffered); done(); }); }); it('should fallback to default handling for that mimetype when undefined', () => { const type = 'application/bazzz'; const send = 'woooooo'; return request .post(`${base}/echo`) .type(type) .send(send) .then((res) => { assert.equal(res.type, type); assert.equal(send, res.body.toString()); assert(res.buffered); }); }); }); superagent-7.1.1/test/node/exports.js000066400000000000000000000013371417204173300176510ustar00rootroot00000000000000'use strict'; const request = require('../support/client'); describe('exports', () => { it('should expose .protocols', () => { Object.keys(request.protocols).should.eql(['http:', 'https:', 'http2:']); }); it('should expose .serialize', () => { Object.keys(request.serialize).should.eql([ 'application/x-www-form-urlencoded', 'application/json' ]); }); it('should expose .parse', () => { Object.keys(request.parse).should.eql([ 'application/x-www-form-urlencoded', 'application/json', 'text', 'application/octet-stream', 'application/pdf', 'image' ]); }); it('should export .buffer', () => { Object.keys(request.buffer).should.eql([]); }); }); superagent-7.1.1/test/node/fixtures/000077500000000000000000000000001417204173300174545ustar00rootroot00000000000000superagent-7.1.1/test/node/fixtures/ca.cert.pem000066400000000000000000000016741417204173300215060ustar00rootroot00000000000000-----BEGIN CERTIFICATE----- MIICljCCAX4CCQDnGz3+qH/zGzANBgkqhkiG9w0BAQsFADANMQswCQYDVQQDDAJD QTAeFw0xODEyMDIxNjIyMThaFw0zMjA4MTAxNjIyMThaMA0xCzAJBgNVBAMMAkNB MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAtgUDcB7R94A22I0D8Iba c000ZBINtvnyvoPP5U2hRsxI9tcW/LLm0GhzM5XJJNQ0jSv0ixIFKomtFBSjKMq/ NH156SqKqyDGU1fPnGjzcJulxceODIokAqNCbZ7Bys6nqUdilNfLQ4bBBWYsEUWT vgbUeDRHvQGycou/pLpYGLCJ4tpc4n6ybox1uPi0qlvFI7aWvQFjOxxR0VeRixXf qXjVCDIr9OJIWiXLrJYDlYqG2gRF/yTDZ4qmQxbZzJ6AXMpaRUiHUO0FHu7baEux ylIc0KVcAmYMGdhFlmDrMNRsmnADKPX9DIMh92XWyE10oNK50I1rIhpvN4XfQx6E UwIDAQABMA0GCSqGSIb3DQEBCwUAA4IBAQCIXj1vfTVRB4ea/udjazPHaLAeocbg d8babbDItOm1ApAoUhNuxPVxyISSFrowCVlaWxB+1ztfeUAB/Axfj0mbXk1hgo2D 4+rft8hOtdg91bU+gHPd/7QGkpPIs5PC+TsnVj0mNqZ5o8qZsLhgoXp3Dl5yMhEs sRegLkmBQHzEsKFU2cSxVD7BXXGLDJxcoR4friGOXdIZeYwqHTZsuR3O7JOVbLew dURqD70jPuf9v1tBnkJPbUECMlL7BCw6ZQtglSvjPP/waWir9TMsDk+xwPK8NPbv DGi+w++cImBbxcnIMBTk4XtlFcOnCCAYUfkaxZMw2jNhYbjiEZOGUG8m -----END CERTIFICATE----- superagent-7.1.1/test/node/fixtures/ca.key.pem000066400000000000000000000032131417204173300213300ustar00rootroot00000000000000-----BEGIN RSA PRIVATE KEY----- MIIEogIBAAKCAQEAtgUDcB7R94A22I0D8Ibac000ZBINtvnyvoPP5U2hRsxI9tcW /LLm0GhzM5XJJNQ0jSv0ixIFKomtFBSjKMq/NH156SqKqyDGU1fPnGjzcJulxceO DIokAqNCbZ7Bys6nqUdilNfLQ4bBBWYsEUWTvgbUeDRHvQGycou/pLpYGLCJ4tpc 4n6ybox1uPi0qlvFI7aWvQFjOxxR0VeRixXfqXjVCDIr9OJIWiXLrJYDlYqG2gRF /yTDZ4qmQxbZzJ6AXMpaRUiHUO0FHu7baEuxylIc0KVcAmYMGdhFlmDrMNRsmnAD KPX9DIMh92XWyE10oNK50I1rIhpvN4XfQx6EUwIDAQABAoIBAAomAWkQ7tgD2Ar+ 4cdZXXisR02FDCq1iOlCZCb+yw0teqv4lhmEyAW6rSGlKk/ZXQy59KqEWLFkd7f0 5pvxofOFQ3TSoGSmMSiYbsTjvR78LqP2Wl8snJFhFOUTwu5R01tG1aJC3dxn+P8a ET7tSC2CJ/qDv7Q0EgT88bR3h03pAc2PJAGWJ2QwutAwV+6Ilyt3hcz29f7JGQac Da0jY/7RIpvZL20gsecb/6Q0a50VEbkuJ+OF5QyIQNT9qtfvsqavtsjHgBWs3iFG yKaDCey4X7D+NsyJBKNCuDqWXzq/4+mQ3atBIvYq2mcIpIbaku7TEWHvpxfzsT/F SzLncMECgYEA4qR1GU38UxZ/8x6Cc4Z3DKUuCLBqvv69IHPcfSkhrtTeApdsv14U KE66/Z3g4FXeV018GYUzGODfjBt4VnDCutz9tmiHFH+T2zDpgC7hvODC8rJ+D21b G3Q5eyA+XRao1XHjc2UD/Ev6iJPjgCT23Lur2bhAqCKkV4g2EAWCgyMCgYEAzZjY 5M7Jw+0g5b6ILnFX66JbESrw87OtiIpiQh5XUQssKsmfONzbXUp6ch/MRTFVHVDZ XmG35Xyg6vy1FYg9HTALl1tnkh9UIhKrH7jx+6euhc0HyWCCqSp/3CpJqVjdoxtS vtZigSaxwTDaOYc8r54cWhHIIrpTrcqY4mxdZRECgYBpGWhv9pkXEqz82d4Wonlc dNDXGLA3p7uea/wIUmWbRH07aGr2hzMDyhaue2MHxOoZRAZTc1BRrh4cQ7TXKO00 aDyDNQ/G8q5nC9SMK7FkvDnK//izQLvqDEiHj1k8I8DhUjHulh52BenFIgdyqjGM BL9ZdDcPgRkCuliPr25pTwKBgG8rf9QxEJ51oT05Sk+6j+zk7FMbIhDUjjfvg/P2 jgZPgUFdpk/L9H28YPtGwGCFrV1dszu6oQJg4m5N2OjcsxcOPKZKEXXMpOSLraZI jegiolbNJ7G3Es/AIET/RLdiSu4APzzblYX6U1GARe+ndaQMXY5CYTKOB+NIUmTU bafRAoGAV8PptnjWf9ehJvt96Rz0FdfpN7leqdweK2JrGZwJQ9BRcKwUO758lmyN nC62Sd0mwHivxRqI6e2u7OSvGj9e7iLnHMl4qYie7VvsWAWmztH2ntEI0iWA3V3N M3T9+sz+nslfhWKgIA80EqOWB1AF0EmbmmqK0igWEbYynAr6v0Q= -----END RSA PRIVATE KEY----- superagent-7.1.1/test/node/fixtures/ca.srl000066400000000000000000000000211417204173300205520ustar00rootroot00000000000000B23299143E26EFC5 superagent-7.1.1/test/node/fixtures/cert.csr000066400000000000000000000015731417204173300211300ustar00rootroot00000000000000-----BEGIN CERTIFICATE REQUEST----- MIICWTCCAUECAQAwFDESMBAGA1UEAwwJbG9jYWxob3N0MIIBIjANBgkqhkiG9w0B AQEFAAOCAQ8AMIIBCgKCAQEAsjNYMUk1HzBLM4fL/8c6Z86X/b13V1bMXrrcV28w jmvQv4lADlghZGt/zbinyvZrASp8v1btR9gLaNTdrxxnz5FWu1bY947ljgadudh0 STLNs4jWI2wcjgguA8B2rDtvap0bn9JkpjQGcFuqEdJRlr26OwsC5SNCtFxQmTrb sneFMWK3JsL1riCrV9Cw0L3joki/YKYTTwRZJ2TXrrHvOLQCIUacwCU4oJg19D0F KU/rDtdUFFojnTio0RFU4/OpjxKzwqjSJE80nPSRHAqXtSgmphrRk4ZVeTxKEGKC oAt/RBwqvxPFjNlbr1EWY9S7SpFu06V35jXJYD9CWD/WcQIDAQABoAAwDQYJKoZI hvcNAQELBQADggEBACia2hDAe1YqzVn/P2KSX+/9yDrjOhU20hKF1CTZr3Zfjep9 R86ldz1aFc2N2yqDjUYpj0+DODEXlEfNaYcD2nn93qgy/gAmfQUvCejBh6vsGiIW qc41lzEGHa9/ErxQ7yvETeuY8OozjDAoUs5NUbFL6OmwJFqX9VzLbQ8uQxNU3z3l AKVkWBWIubqpSa8tDn/+wf8vW/xtOCZ/Zd5YBQdTCwb5BdS3vpBkwpJbPBvR97Mc 2d+2a5qyNqZdb1CuATS2MJC35zp62FErhcnnVqtaAcaE/C/in1OO3wLJvXa5/LKp 1riBUJLHscGbIhe+KjlLoosXuOcUNvBkNbt8MFQ= -----END CERTIFICATE REQUEST----- superagent-7.1.1/test/node/fixtures/cert.pem000066400000000000000000000017111417204173300211140ustar00rootroot00000000000000-----BEGIN CERTIFICATE----- MIICnTCCAYUCCQCyMpkUPibvxTANBgkqhkiG9w0BAQsFADANMQswCQYDVQQDDAJD QTAeFw0xODEyMDIxNjIzNTBaFw0zMjA4MTAxNjIzNTBaMBQxEjAQBgNVBAMMCWxv Y2FsaG9zdDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALIzWDFJNR8w SzOHy//HOmfOl/29d1dWzF663FdvMI5r0L+JQA5YIWRrf824p8r2awEqfL9W7UfY C2jU3a8cZ8+RVrtW2PeO5Y4GnbnYdEkyzbOI1iNsHI4ILgPAdqw7b2qdG5/SZKY0 BnBbqhHSUZa9ujsLAuUjQrRcUJk627J3hTFitybC9a4gq1fQsNC946JIv2CmE08E WSdk166x7zi0AiFGnMAlOKCYNfQ9BSlP6w7XVBRaI504qNERVOPzqY8Ss8Ko0iRP NJz0kRwKl7UoJqYa0ZOGVXk8ShBigqALf0QcKr8TxYzZW69RFmPUu0qRbtOld+Y1 yWA/Qlg/1nECAwEAATANBgkqhkiG9w0BAQsFAAOCAQEAWYlRC8e5flZED/JDP0VG aNENVwv0bFbbzp1urgQeq1TVBDHGKuMJM9klVMBQiMT9q+nPjEgfynSiLVuY7FWs yD/hFjQMLV2cz7tdBY6l+IV1sAtBdX3ZRmmzttaAs4xmFXCLXdTm4KJ5bPcRnRLA klMKOsvNY90mRteXvhQy04J2TJVpIld05+yjnYVWoODyX9A/Xda+33qjZECLTnj4 c5L3mamPZEo4nwY+329d7dNvEu+ETp4UzwkzwPFHSGLD01YEJIu83TTi1WDBZygz dxPUkLKYzRkpYVp3hbZsvkCQVtruY/e6DADZTKAlhL41V6VdH35Es0uw7JrbPf7z jQ== -----END CERTIFICATE----- superagent-7.1.1/test/node/fixtures/cert.pfx000066400000000000000000000043451417204173300211360ustar00rootroot0000000000000000 *H 00G *H 8040- *H 0 *H  0(R*exZ}.F|7dCx) 2 Ðf@BLA{ɋcHEb奋b-Fk^c nCI`ФԎaE!}s]\KAe-yH((M6 r9I'Ζ%^JŽM;޸ڕǺ09R+wJZdx.u?9 Na+-GC>YCZPYtQS&RJO7zg7*ISlN:mi܏T-d[ p;hQ7h2CKys0=/NO29D`FѼ&Xb *kU\HʧXvpX(PX~"ujoE|C#BWS A}l|?8|{aJ Y30U]kE!3rWk,} :-Ef 2]jK;R8`fhܬkv_ObAz3}Լ::36[EYToռ!n1@Zy R؁Z˅1%t?t͔H1'=Q, q,pЏ8>9Y(oo( ',CsS9jbfR56?!h.P04d+aV(~4~ 0Yu!Ug+Xp^&xvU0A *H 2.0*0& *H  00 *H  0$b|NrZ>7-7 Ym&nmM 1 V[ ƺzsKPj0:J$)>lMb-dL@6X;xao_|_X B͐(-8aZη9 `U Z r! KNJH*C,lf473"7_EX犤g*F|2eZJ.S{#x!F@_BӭiNm`%*]OLDܣ&c>J.tz\ugdGvűe:  %b}tZ撱 [:ІmE i'r3H=J?ƿ~9(eG5vVE*3A0]B?ǦRmGLr+(5'e(ߌgW?K]w~|&*FJb 0݈2!!Z1 zfǵm# u< duF򜷡@ $23{_^_ߕaMcÍb.2t5pQc[nOs~·?IB\cftLJ*=%]Ni b YH:C|6 4bVNA姬-3B;Sw2'd̲%L-$E#E|TJOYy.9yjYAnp ,SmHWj ]~%G/8SJFyIwAs" *0TH]~m>IqZbyب:L^ &bwR Qdq*la}xV;&$!lـB ^'$oFe+I|ݠJMr ?J_N&Zag vcqٳ27/f} "] ^"&{1cT|I>iCO!.L ㈽` Gkm@!Qh08О!1Ur!Ԍ\./AۚrXoV \BN].4Jݷz@2 k-o㲔ESP6WyD3$NMϭF |x=cSʇ3H4ZN.n̽?PUwUZR٭pPZL+u/*֍fՍ<ִd&>Lw>8l !훐897 U<['uWmpU͇XpS[-Q.LgiI{ fڝpLxؚcC(f(aL)4Y锛! 坦%:)4 t)i9pVJV܊Gd\E]%{UQj} q[JZ6 ԱIat{kH _ah{HzUS^2N,jrR)~通 F Cԗ2T$D LZ֬QLϚ۵52KX>y?={f(@ucjdoX)d0A *H 2.0*0& *H  00 *H  0Džu衺ȆE"KK\(맓 ;(r|:!۹*q9fIY \ז'9PvyJ+o;eb'ku*MdJۀZ}'W++rO_3s%Y ,Aש'͊Y!b^^YT)c[US(PۨbQVwwBz}-߈د<Γaʹ 3c] 'u5(n 4 Rmcq*,%*l9n'Ho۞v KyF~CnM[krW$F4drZ+W5H@Woi̫n謿Ǐ{Qhl`C@ώxH ?o#8< 0y=9^:!xZ fS1%0# *H  17$)ej5y010!0 +LjdXxr:-찃:h2superagent-7.1.1/test/node/fixtures/test.png000066400000000000000000000002371417204173300211430ustar00rootroot00000000000000PNG  IHDR PX pHYs  tIME 4=iTXtCommentCreated with GIMPd.eIDATcd_Ā01#UvIENDB`superagent-7.1.1/test/node/fixtures/user.html000066400000000000000000000000151417204173300213140ustar00rootroot00000000000000

name

superagent-7.1.1/test/node/fixtures/user.json000066400000000000000000000000171417204173300213230ustar00rootroot00000000000000{"name":"tobi"}superagent-7.1.1/test/node/fixtures/user.txt000066400000000000000000000000041417204173300211650ustar00rootroot00000000000000Tobisuperagent-7.1.1/test/node/flags.js000066400000000000000000000064421417204173300172430ustar00rootroot00000000000000'use strict'; const assert = require('assert'); const request = require('../support/client'); const getSetup = require('../support/setup'); describe('flags', () => { let setup; let base; before(async () => { setup = await getSetup(); base = setup.uri; }); describe('with 4xx response', () => { it('should set res.error and res.clientError', (done) => { request.get(`${base}/notfound`).end((error, res) => { assert(error); assert(!res.ok, 'response should not be ok'); assert(res.error, 'response should be an error'); assert(res.clientError, 'response should be a client error'); assert(!res.serverError, 'response should not be a server error'); done(); }); }); }); describe('with 5xx response', () => { it('should set res.error and res.serverError', (done) => { request.get(`${base}/error`).end((error, res) => { assert(error); assert(!res.ok, 'response should not be ok'); assert(!res.notFound, 'response should not be notFound'); assert(res.error, 'response should be an error'); assert(!res.clientError, 'response should not be a client error'); assert(res.serverError, 'response should be a server error'); done(); }); }); }); describe('with 404 Not Found', () => { it('should res.notFound', (done) => { request.get(`${base}/notfound`).end((error, res) => { assert(error); assert(res.notFound, 'response should be .notFound'); done(); }); }); }); describe('with 400 Bad Request', () => { it('should set req.badRequest', (done) => { request.get(`${base}/bad-request`).end((error, res) => { assert(error); assert(res.badRequest, 'response should be .badRequest'); done(); }); }); }); describe('with 401 Bad Request', () => { it('should set res.unauthorized', (done) => { request.get(`${base}/unauthorized`).end((error, res) => { assert(error); assert(res.unauthorized, 'response should be .unauthorized'); done(); }); }); }); describe('with 406 Not Acceptable', () => { it('should set res.notAcceptable', (done) => { request.get(`${base}/not-acceptable`).end((error, res) => { assert(error); assert(res.notAcceptable, 'response should be .notAcceptable'); done(); }); }); }); describe('with 204 No Content', () => { it('should set res.noContent', (done) => { request.get(`${base}/no-content`).end((error, res) => { assert(!error); assert(res.noContent, 'response should be .noContent'); done(); }); }); }); describe('with 201 Created', () => { it('should set res.created', (done) => { request.post(`${base}/created`).end((error, res) => { assert(!error); assert(res.created, 'response should be .created'); done(); }); }); }); describe('with 422 Unprocessable Entity', () => { it('should set res.unprocessableEntity', (done) => { request.post(`${base}/unprocessable-entity`).end((error, res) => { assert(error); assert( res.unprocessableEntity, 'response should be .unprocessableEntity' ); done(); }); }); }); }); superagent-7.1.1/test/node/form.js000066400000000000000000000027531417204173300171130ustar00rootroot00000000000000'use strict'; const assert = require('assert'); const request = require('../support/client'); const getSetup = require('../support/setup'); describe('Merging objects', () => { let setup; let base; before(async () => { setup = await getSetup(); base = setup.uri; }); it("Don't mix Buffer and JSON", () => { assert.throws(() => { request .post('/echo') .send(Buffer.from('some buffer')) .send({ allowed: false }); }); }); }); describe('req.send(String)', () => { let setup; let base; before(async () => { setup = await getSetup(); base = setup.uri; }); it('should default to "form"', (done) => { request .post(`${base}/echo`) .send('user[name]=tj') .send('user[email]=tj@vision-media.ca') .end((error, res) => { res.header['content-type'].should.equal( 'application/x-www-form-urlencoded' ); res.body.should.eql({ user: { name: 'tj', email: 'tj@vision-media.ca' } }); done(); }); }); }); describe('res.body', () => { let setup; let base; before(async () => { setup = await getSetup(); base = setup.uri; }); describe('application/x-www-form-urlencoded', () => { it('should parse the body', (done) => { request.get(`${base}/form-data`).end((error, res) => { res.text.should.equal('pet[name]=manny'); res.body.should.eql({ pet: { name: 'manny' } }); done(); }); }); }); }); superagent-7.1.1/test/node/http2.js000066400000000000000000000016271417204173300172100ustar00rootroot00000000000000'use strict'; if (!process.env.HTTP2_TEST) { return; } const assert = require('assert'); const url = require('url'); const request = require('../..'); const getSetup = require('../support/setup'); describe('request.get().http2()', () => { let setup; let base; before(async () => { setup = await getSetup(); base = setup.uri; }); it('should preserve the encoding of the url', (done) => { request .get(`${base}/url?a=(b%29`) .http2() .end((error, res) => { assert.equal('/url?a=(b%29', res.text); done(); }); }); it('should format the url', () => request .get(url.parse(`${base}/login`)) .http2() .then((res) => { assert(res.ok); })); it('should default to http', () => request .get('localhost:5000/login') .http2() .then((res) => { assert.equal(res.status, 200); })); }); superagent-7.1.1/test/node/https.js000066400000000000000000000156161417204173300173140ustar00rootroot00000000000000'use strict'; const assert = require('assert'); const url = require('url'); const https = require('https'); const fs = require('fs'); const express = require('../support/express'); const request = require('../support/client'); const app = express(); const ca = fs.readFileSync(`${__dirname}/fixtures/ca.cert.pem`); const key = fs.readFileSync(`${__dirname}/fixtures/key.pem`); const pfx = fs.readFileSync(`${__dirname}/fixtures/cert.pfx`); const cert = fs.readFileSync(`${__dirname}/fixtures/cert.pem`); const passpfx = fs.readFileSync(`${__dirname}/fixtures/passcert.pfx`); /* openssl genrsa -out ca.key.pem 2048 openssl req -x509 -new -nodes -key ca.key.pem -sha256 -days 5000 -out ca.cert.pem # specify CN = CA openssl genrsa -out key.pem 2048 openssl req -new -key key.pem -out cert.csr # specify CN = localhost openssl x509 -req -in cert.csr -CA ca.cert.pem -CAkey ca.key.pem -CAcreateserial -out cert.pem -days 5000 -sha256 openssl pkcs12 -export -in cert.pem -inkey key.pem -out cert.pfx # empty password openssl pkcs12 -export -in cert.pem -inkey key.pem -out passcert.pfx # password test */ let http2; if (process.env.HTTP2_TEST) { http2 = require('http2'); } let server; app.get('/', (request_, res) => { res.send('Safe and secure!'); }); // WARNING: this .listen() boilerplate is slightly different from most tests // due to HTTPS. Do not copy/paste without examination. const base = 'https://localhost'; let testEndpoint; describe('https', () => { describe('certificate authority', () => { before(function listen(done) { server = process.env.HTTP2_TEST ? http2.createSecureServer( { key, cert }, app ) : https.createServer( { key, cert }, app ); server.listen(0, function listening() { testEndpoint = `${base}:${server.address().port}`; done(); }); }); after(() => { if (server) server.close(); }); describe('request', () => { it('should give a good response', (done) => { request .get(testEndpoint) .ca(ca) .end((error, res) => { assert.ifError(error); assert(res.ok); assert.strictEqual('Safe and secure!', res.text); done(); }); }); it('should reject unauthorized response', () => { return request .get(testEndpoint) .trustLocalhost(false) .then( () => { throw new Error('Allows MITM'); }, () => {} ); }); it('should not reject unauthorized response', () => { return request .get(testEndpoint) .disableTLSCerts() .then(({ status }) => { assert.strictEqual(status, 200); }); }); it('should trust localhost unauthorized response', () => { return request.get(testEndpoint).trustLocalhost(true); }); it('should trust overriden localhost unauthorized response', () => { return request .get(`https://example.com:${server.address().port}`) .connect('127.0.0.1') .trustLocalhost(); }); }); describe('.agent', () => { it('should be able to make multiple requests without redefining the certificate', (done) => { const agent = request.agent({ ca }); agent.get(testEndpoint).end((error, res) => { assert.ifError(error); assert(res.ok); assert.strictEqual('Safe and secure!', res.text); agent.get(url.parse(testEndpoint)).end((error, res) => { assert.ifError(error); assert(res.ok); assert.strictEqual('Safe and secure!', res.text); done(); }); }); }); }); }); describe.skip('client certificates', () => { before(function listen(done) { server = process.env.HTTP2_TEST ? http2.createSecureServer( { ca, key, cert, requestCert: true, rejectUnauthorized: true }, app ) : https.createServer( { ca, key, cert, requestCert: true, rejectUnauthorized: true }, app ); server.listen(0, function listening() { testEndpoint = `${base}:${server.address().port}`; done(); }); }); after(() => { if (server) server.close(); }); describe('request', () => { it('should give a good response with client certificates and CA', (done) => { request .get(testEndpoint) .ca(ca) .key(key) .cert(cert) .end((error, res) => { assert.ifError(error); assert(res.ok); assert.strictEqual('Safe and secure!', res.text); done(); }); }); it('should give a good response with client pfx', (done) => { request .get(testEndpoint) .pfx(pfx) .end((error, res) => { assert.ifError(error); assert(res.ok); assert.strictEqual('Safe and secure!', res.text); done(); }); }); it('should give a good response with client pfx with passphrase', (done) => { request .get(testEndpoint) .pfx({ pfx: passpfx, passphrase: 'test' }) .end((error, res) => { assert.ifError(error); assert(res.ok); assert.strictEqual('Safe and secure!', res.text); done(); }); }); }); describe('.agent', () => { it('should be able to make multiple requests without redefining the certificates', (done) => { const agent = request.agent({ ca, key, cert }); agent.get(testEndpoint).end((error, res) => { assert.ifError(error); assert(res.ok); assert.strictEqual('Safe and secure!', res.text); agent.get(url.parse(testEndpoint)).end((error, res) => { assert.ifError(error); assert(res.ok); assert.strictEqual('Safe and secure!', res.text); done(); }); }); }); it('should be able to make multiple requests without redefining pfx', (done) => { const agent = request.agent({ pfx }); agent.get(testEndpoint).end((error, res) => { assert.ifError(error); assert(res.ok); assert.strictEqual('Safe and secure!', res.text); agent.get(url.parse(testEndpoint)).end((error, res) => { assert.ifError(error); assert(res.ok); assert.strictEqual('Safe and secure!', res.text); done(); }); }); }); }); }); }); superagent-7.1.1/test/node/image.js000066400000000000000000000030121417204173300172170ustar00rootroot00000000000000'use strict'; const fs = require('fs'); const request = require('../support/client'); const getSetup = require('../support/setup'); const img = fs.readFileSync(`${__dirname}/fixtures/test.png`); describe('res.body', () => { let setup; let base; before(async () => { setup = await getSetup(); base = setup.uri; }); describe('image/png', () => { it('should parse the body', (done) => { request.get(`${base}/image`).end((error, res) => { res.type.should.equal('image/png'); Buffer.isBuffer(res.body).should.be.true(); (res.body.length - img.length).should.equal(0); done(); }); }); }); describe('application/octet-stream', () => { it('should parse the body', (done) => { request .get(`${base}/image-as-octets`) .buffer(true) // that's tech debt :( .end((error, res) => { res.type.should.equal('application/octet-stream'); Buffer.isBuffer(res.body).should.be.true(); (res.body.length - img.length).should.equal(0); done(); }); }); }); describe('application/octet-stream', () => { it('should parse the body (using responseType)', (done) => { request .get(`${base}/image-as-octets`) .responseType('blob') .end((error, res) => { res.type.should.equal('application/octet-stream'); Buffer.isBuffer(res.body).should.be.true(); (res.body.length - img.length).should.equal(0); done(); }); }); }); }); superagent-7.1.1/test/node/incoming-multipart.js000066400000000000000000000032121417204173300217610ustar00rootroot00000000000000// var request = require('../support/client') // , express = require('express') // , assert = require('assert') // , app = express() // , fs = require('fs'); // app.get('/', function(req, res){ // res.set('Content-Type', 'multipart/form-data; boundary=awesome'); // // res.write('\r\n'); TODO: formidable bug // res.write('--awesome\r\n'); // res.write('Content-Disposition: attachment; name="image"; filename="something.png"\r\n'); // res.write('Content-Type: image/png\r\n'); // res.write('\r\n'); // res.write('some data'); // res.write('\r\n--awesome\r\n'); // res.write('Content-Disposition: form-data; name="name"\r\n'); // res.write('Content-Type: text/plain\r\n'); // res.write('\r\n'); // res.write('tobi'); // res.write('\r\n--awesome--'); // setTimeout(function(){ // TODO: lolnode... // res.end(); // }, 1000); // }); // var base = 'http://localhost' // var server; // before(function listen(done) { // server = app.listen(0, function listening() { // base += ':' + server.address().port; // done(); // }); // }); // describe('request multipart/form-data', function(){ // describe('req.body', function(){ // it('should be populated with fields', function(done){ // request.get(base, function(err, res){ // if (err) return done(err); // res.status.should.equal(200); // res.body.should.eql({ name: 'tobi' }); // res.files.image.name.should.equal('something.png'); // res.files.image.type.should.equal('image/png'); // assert.equal(null, res.text, 'res.text should be empty for multipart'); // done(); // }); // }) // }) // }) superagent-7.1.1/test/node/inflate.js000066400000000000000000000100611417204173300175610ustar00rootroot00000000000000'use strict'; require('should'); require('should-http'); const assert = require('assert'); const zlib = require('zlib'); let http = require('http'); const getPort = require('get-port'); const express = require('../support/express'); const request = require('../support/client'); if (process.env.HTTP2_TEST) { http = require('http2'); } const app = express(); const subject = 'some long long long long string'; let base = 'http://localhost'; let server; before(function listen(done) { server = http.createServer(app); getPort().then((port) => { server = server.listen(port, function listening() { base += `:${server.address().port}`; done(); }); }); }); app.get('/binary', (request_, res) => { zlib.deflate(subject, (error, buf) => { res.set('Content-Encoding', 'gzip'); res.send(buf); }); }); app.get('/corrupt', (request_, res) => { res.set('Content-Encoding', 'gzip'); res.send('blah'); }); app.get('/nocontent', (request_, res, next) => { res.statusCode = 204; res.set('Content-Type', 'text/plain'); res.set('Content-Encoding', 'gzip'); res.send(''); }); app.get('/', (request_, res, next) => { zlib.deflate(subject, (error, buf) => { res.set('Content-Type', 'text/plain'); res.set('Content-Encoding', 'gzip'); res.send(buf); }); }); app.get('/junk', (request_, res) => { zlib.deflate(subject, (error, buf) => { res.set('Content-Type', 'text/plain'); res.set('Content-Encoding', 'gzip'); res.write(buf); res.end(' 0 junk'); }); }); app.get('/chopped', (request_, res) => { zlib.deflate(`${subject}123456`, (error, buf) => { res.set('Content-Type', 'text/plain'); res.set('Content-Encoding', 'gzip'); res.send(buf.slice(0, -1)); }); }); describe('zlib', () => { it('should deflate the content', (done) => { request.get(base).end((error, res) => { res.should.have.status(200); res.text.should.equal(subject); res.headers['content-length'].should.be.below(subject.length); done(); }); }); it('should protect from zip bombs', (done) => { request .get(base) .buffer(true) .maxResponseSize(1) .end((error, res) => { try { assert.equal('Maximum response size reached', error && error.message); done(); } catch (err) { done(err); } }); }); it('should ignore trailing junk', (done) => { request.get(`${base}/junk`).end((error, res) => { res.should.have.status(200); res.text.should.equal(subject); done(); }); }); it('should ignore missing data', (done) => { request.get(`${base}/chopped`).end((error, res) => { assert.equal(undefined, error); res.should.have.status(200); res.text.should.startWith(subject); done(); }); }); it('should handle corrupted responses', (done) => { request.get(`${base}/corrupt`).end((error, res) => { assert(error, 'missing error'); assert(!res, 'response should not be defined'); done(); }); }); it('should handle no content with gzip header', (done) => { request.get(`${base}/nocontent`).end((error, res) => { assert.ifError(error); assert(res); res.should.have.status(204); res.text.should.equal(''); res.headers.should.not.have.property('content-length'); done(); }); }); describe('without encoding set', () => { it('should buffer if asked', () => { return request .get(`${base}/binary`) .buffer(true) .then((res) => { res.should.have.status(200); assert(res.headers['content-length']); assert(res.body.byteLength); assert.equal(subject, res.body.toString()); }); }); it('should emit buffers', (done) => { request.get(`${base}/binary`).end((error, res) => { res.should.have.status(200); res.headers['content-length'].should.be.below(subject.length); res.on('data', (chunk) => { chunk.should.have.length(subject.length); }); res.on('end', done); }); }); }); }); superagent-7.1.1/test/node/multipart.js000066400000000000000000000155351417204173300201730ustar00rootroot00000000000000'use strict'; const assert = require('assert'); const fs = require('fs'); const should = require('should'); const getPort = require('get-port'); const request = require('../support/client'); const getSetup = require('../support/setup'); function read(file) { return fs.readFileSync(file, 'utf8'); } describe('Multipart', () => { let setup; let base; before(async () => { setup = await getSetup(); base = setup.uri; }); describe('#field(name, value)', () => { it('should set a multipart field value', () => { const request_ = request.post(`${base}/echo`); request_.field('user[name]', 'tobi'); request_.field('user[age]', '2'); request_.field('user[species]', 'ferret'); return request_.then((res) => { res.body['user[name]'].should.equal('tobi'); res.body['user[age]'].should.equal('2'); res.body['user[species]'].should.equal('ferret'); }); }); it('should work with file attachments', () => { const request_ = request.post(`${base}/echo`); request_.field('name', 'Tobi'); request_.attach('document', 'test/node/fixtures/user.html'); request_.field('species', 'ferret'); return request_.then((res) => { res.body.name.should.equal('Tobi'); res.body.species.should.equal('ferret'); const html = res.files.document; html.originalFilename.should.equal('user.html'); html.mimetype.should.equal('text/html'); read(html.filepath).should.equal('

name

'); }); }); }); describe('#attach(name, path)', () => { it('should attach a file', () => { const request_ = request.post(`${base}/echo`); request_.attach('one', 'test/node/fixtures/user.html'); request_.attach('two', 'test/node/fixtures/user.json'); request_.attach('three', 'test/node/fixtures/user.txt'); return request_.then((res) => { const html = res.files.one; const json = res.files.two; const text = res.files.three; html.originalFilename.should.equal('user.html'); html.mimetype.should.equal('text/html'); read(html.filepath).should.equal('

name

'); json.originalFilename.should.equal('user.json'); json.mimetype.should.equal('application/json'); read(json.filepath).should.equal('{"name":"tobi"}'); text.originalFilename.should.equal('user.txt'); text.mimetype.should.equal('text/plain'); read(text.filepath).should.equal('Tobi'); }); }); describe('when a file does not exist', () => { it('should fail the request with an error', (done) => { const request_ = request.post(`${base}/echo`); request_.attach('name', 'foo'); request_.attach('name2', 'bar'); request_.attach('name3', 'baz'); request_.end((error, res) => { assert.ok(Boolean(error), 'Request should have failed.'); error.code.should.equal('ENOENT'); error.message.should.containEql('ENOENT'); error.path.should.equal('foo'); done(); }); }); it('promise should fail', () => { return request .post(`${base}/echo`) .field({ a: 1, b: 2 }) .attach('c', 'does-not-exist.txt') .then( (res) => assert.fail('It should not allow this'), (err) => { err.code.should.equal('ENOENT'); err.path.should.equal('does-not-exist.txt'); } ); }); it('should report ENOENT via the callback', (done) => { request .post('http://127.0.0.1:1') // nobody is listening there .attach('name', 'file-does-not-exist') .end((error, res) => { assert.ok(Boolean(error), 'Request should have failed'); error.code.should.equal('ENOENT'); done(); }); }); it('should report ENOENT via Promise', () => { return request .post(`http://127.0.0.1:1`) // nobody is listening there .attach('name', 'file-does-not-exist') .then( (res) => assert.fail('Request should have failed'), (err) => err.code.should.equal('ENOENT') ); }); }); }); describe('#attach(name, path, filename)', () => { it('should use the custom filename', () => request .post(`${base}/echo`) .attach('document', 'test/node/fixtures/user.html', 'doc.html') .then((res) => { const html = res.files.document; html.originalFilename.should.equal('doc.html'); html.mimetype.should.equal('text/html'); read(html.filepath).should.equal('

name

'); })); it('should fire progress event', (done) => { let loaded = 0; let total = 0; let uploadEventWasFired = false; request .post(`${base}/echo`) .attach('document', 'test/node/fixtures/user.html') .on('progress', (event) => { total = event.total; loaded = event.loaded; if (event.direction === 'upload') { uploadEventWasFired = true; } }) .end((error, res) => { if (error) return done(error); const html = res.files.document; html.originalFilename.should.equal('user.html'); html.mimetype.should.equal('text/html'); read(html.filepath).should.equal('

name

'); total.should.equal(223); loaded.should.equal(223); uploadEventWasFired.should.equal(true); done(); }); }); it('filesystem errors should be caught', (done) => { request .post(`${base}/echo`) .attach('filedata', 'test/node/fixtures/non-existent-file.ext') .end((error, res) => { assert.ok(Boolean(error), 'Request should have failed.'); error.code.should.equal('ENOENT'); error.path.should.equal('test/node/fixtures/non-existent-file.ext'); done(); }); }); }); describe('#field(name, val)', () => { it('should set a multipart field value', (done) => { request .post(`${base}/echo`) .field('first-name', 'foo') .field('last-name', 'bar') .end((error, res) => { if (error) done(error); res.should.be.ok(); res.body['first-name'].should.equal('foo'); res.body['last-name'].should.equal('bar'); done(); }); }); }); describe('#field(object)', () => { it('should set multiple multipart fields', (done) => { request .post(`${base}/echo`) .field({ 'first-name': 'foo', 'last-name': 'bar' }) .end((error, res) => { if (error) done(error); res.should.be.ok(); res.body['first-name'].should.equal('foo'); res.body['last-name'].should.equal('bar'); done(); }); }); }); }); superagent-7.1.1/test/node/network-error.js000066400000000000000000000013741417204173300207660ustar00rootroot00000000000000'use strict'; const assert = require('assert'); const net = require('net'); const request = require('../support/client'); const express = require('../support/express'); function getFreePort(fn) { const server = net.createServer(); server.listen(0, () => { const { port } = server.address(); server.close(() => { fn(port); }); }); } describe('with network error', () => { before(function (done) { // connecting to a free port // will trigger a connection refused getFreePort((port) => { this.port = port; done(); }); }); it('should error', function (done) { request.get(`http://localhost:${this.port}/`).end((error, res) => { assert(error, 'expected an error'); done(); }); }); }); superagent-7.1.1/test/node/not-modified.js000066400000000000000000000015071417204173300205220ustar00rootroot00000000000000'use strict'; const request = require('../support/client'); const getSetup = require('../support/setup'); describe('request', () => { let setup; let base; before(async () => { setup = await getSetup(); base = setup.uri; }); describe('not modified', () => { let ts; it('should start with 200', (done) => { request.get(`${base}/if-mod`).end((error, res) => { res.should.have.status(200); res.text.should.match(/^\d+$/); ts = Number(res.text); done(); }); }); it('should then be 304', (done) => { request .get(`${base}/if-mod`) .set('If-Modified-Since', new Date(ts).toUTCString()) .end((error, res) => { res.should.have.status(304); // res.text.should.be.empty done(); }); }); }); }); superagent-7.1.1/test/node/parsers.js000066400000000000000000000041051417204173300176200ustar00rootroot00000000000000'use strict'; const assert = require('assert'); const request = require('../support/client'); const getSetup = require('../support/setup'); const doesntWorkInHttp2 = !process.env.HTTP2_TEST; describe('req.parse(fn)', () => { let setup; let base; before(async () => { setup = await getSetup(); base = setup.uri; }); it('should take precedence over default parsers', (done) => { request .get(`${base}/manny`) .parse(request.parse['application/json']) .end((error, res) => { assert(res.ok); assert.equal('{"name":"manny"}', res.text); assert.equal('manny', res.body.name); done(); }); }); it('should be the only parser', () => request .get(`${base}/image`) .buffer(false) .parse((res, fn) => { res.on('data', () => {}); }) .then((res) => { assert(res.ok); assert.strictEqual(res.text, undefined); res.body.should.eql({}); })); it('should emit error if parser throws', (done) => { request .get(`${base}/manny`) .parse(() => { throw new Error('I am broken'); }) .on('error', (error) => { error.message.should.equal('I am broken'); done(); }) .end(); }); it('should emit error if parser returns an error', (done) => { request .get(`${base}/manny`) .parse((res, fn) => { fn(new Error('I am broken')); }) .on('error', (error) => { error.message.should.equal('I am broken'); done(); }) .end(); }); if (doesntWorkInHttp2) it('should not emit error on chunked json', (done) => { request.get(`${base}/chunked-json`).end((error) => { assert.ifError(error); done(); }); }); if (doesntWorkInHttp2) it('should not emit error on aborted chunked json', (done) => { const request_ = request.get(`${base}/chunked-json`); request_.end((error) => { assert.ifError(error); done(); }); setTimeout(() => { request_.abort(); }, 50); }); }); superagent-7.1.1/test/node/pipe-redirect.js000066400000000000000000000017441417204173300207030ustar00rootroot00000000000000'use strict'; const fs = require('fs'); const request = require('../support/client'); const getSetup = require('../support/setup'); describe('pipe on redirect', () => { let setup; let base; const destinationPath = 'test/node/fixtures/pipe.txt'; before(async () => { setup = await getSetup(); base = setup.uri; }); after((done) => { // Remove tmp file fs.unlink(destinationPath, done); }); it('should follow Location', (done) => { const stream = fs.createWriteStream(destinationPath); const redirects = []; const request_ = request .get(base) .on('redirect', (res) => { redirects.push(res.headers.location); }) .connect({ inapplicable: 'should be ignored' }); stream.on('finish', () => { redirects.should.eql(['/movies', '/movies/all', '/movies/all/0']); fs.readFileSync(destinationPath, 'utf8').should.eql('first movie page'); done(); }); request_.pipe(stream); }); }); superagent-7.1.1/test/node/pipe.js000066400000000000000000000071611417204173300171030ustar00rootroot00000000000000'use strict'; const request = require('../support/client'); const express = require('../support/express'); const app = express(); const fs = require('fs'); const bodyParser = require('body-parser'); let http = require('http'); if (process.env.HTTP2_TEST) { http = require('http2'); } app.use(bodyParser.json()); app.get('/', (request_, res) => { fs.createReadStream('test/node/fixtures/user.json').pipe(res); }); app.get('/redirect', (request_, res) => { res.set('Location', '/').sendStatus(302); }); app.get('/badRedirectNoLocation', (request_, res) => { res.set('Location', '').sendStatus(302); }); app.post('/', (request_, res) => { if (process.env.HTTP2_TEST) { // body-parser does not support http2 yet. // This section can be remove after body-parser supporting http2. res.set('content-type', 'application/json'); request_.pipe(res); } else { res.send(request_.body); } }); let base = 'http://localhost'; let server; before(function listen(done) { server = http.createServer(app); server.listen(0, function listening() { base += `:${server.address().port}`; done(); }); }); describe('request pipe', () => { const destPath = 'test/node/fixtures/tmp.json'; after(function removeTmpfile(done) { fs.unlink(destPath, done); }); it('should act as a writable stream', (done) => { const request_ = request.post(base); const stream = fs.createReadStream('test/node/fixtures/user.json'); request_.type('json'); request_.on('response', (res) => { res.body.should.eql({ name: 'tobi' }); done(); }); stream.pipe(request_); }); it('end() stops piping', (done) => { const stream = fs.createWriteStream(destPath); request.get(base).end((error, res) => { try { res.pipe(stream); return done(new Error('Did not prevent nonsense pipe')); } catch { /* expected error */ } done(); }); }); it('should act as a readable stream', (done) => { const stream = fs.createWriteStream(destPath); let responseCalled = false; const request_ = request.get(base); request_.type('json'); request_.on('response', (res) => { res.status.should.eql(200); responseCalled = true; }); stream.on('finish', () => { JSON.parse(fs.readFileSync(destPath, 'utf8')).should.eql({ name: 'tobi' }); responseCalled.should.be.true(); done(); }); request_.pipe(stream); }); it('should follow redirects', (done) => { const stream = fs.createWriteStream(destPath); let responseCalled = false; const request_ = request.get(base + '/redirect'); request_.type('json'); request_.on('response', (res) => { res.status.should.eql(200); responseCalled = true; }); stream.on('finish', () => { JSON.parse(fs.readFileSync(destPath, 'utf8')).should.eql({ name: 'tobi' }); responseCalled.should.be.true(); done(); }); request_.pipe(stream); }); it('should not throw on bad redirects', (done) => { const stream = fs.createWriteStream(destPath); let responseCalled = false; let errorCalled = false; const request_ = request.get(base + '/badRedirectNoLocation'); request_.type('json'); request_.on('response', (res) => { responseCalled = true; }); request_.on('error', (error) => { error.message.should.eql('No location header for redirect'); errorCalled = true; stream.end(); }); stream.on('finish', () => { responseCalled.should.be.false(); errorCalled.should.be.true(); done(); }); request_.pipe(stream); }); }); superagent-7.1.1/test/node/query.js000066400000000000000000000125771417204173300173220ustar00rootroot00000000000000'use strict'; let http = require('http'); const assert = require('assert'); const fs = require('fs'); const request = require('../support/client'); const express = require('../support/express'); const app = express(); if (process.env.HTTP2_TEST) { http = require('http2'); } app.get('/raw-query', (request_, res) => { res.status(200).send(request_.url.slice(request_.url.indexOf('?') + 1)); }); app.get('/', (request_, res) => { res.status(200).send(request_.query); }); app.delete('/url', (request_, res) => { res.status(200).send(request_.url); }); app.delete('/', (request_, res) => { res.status(200).send(request_.query); }); app.put('/', (request_, res) => { res.status(200).send(request_.query); }); let base = 'http://localhost'; let server; before(function listen(done) { server = http.createServer(app); server = server.listen(0, function listening() { base += `:${server.address().port}`; done(); }); }); describe('req.query(String)', () => { // This is no longer true as of qs v3.0.0 (https://github.com/ljharb/qs/commit/0c6f2a6318c94f6226d3cf7fe36094e9685042b6) // it('should supply uri malformed error to the callback') it('should support passing in a string', (done) => { request .del(base) .query('name=t%F6bi') .end((error, res) => { res.body.should.eql({ name: 't%F6bi' }); done(); }); }); it('should work with url query-string and string for query', (done) => { request .del(`${base}/?name=tobi`) .query('age=2%20') .end((error, res) => { res.body.should.eql({ name: 'tobi', age: '2 ' }); done(); }); }); it('should support compound elements in a string', (done) => { request .del(base) .query('name=t%F6bi&age=2') .end((error, res) => { res.body.should.eql({ name: 't%F6bi', age: '2' }); done(); }); }); it('should work when called multiple times with a string', (done) => { request .del(base) .query('name=t%F6bi') .query('age=2%F6') .end((error, res) => { res.body.should.eql({ name: 't%F6bi', age: '2%F6' }); done(); }); }); it('should work with normal `query` object and query string', (done) => { request .del(base) .query('name=t%F6bi') .query({ age: '2' }) .end((error, res) => { res.body.should.eql({ name: 't%F6bi', age: '2' }); done(); }); }); it('should not encode raw backticks, but leave encoded ones as is', () => { return Promise.all([ request .get(`${base}/raw-query`) .query('name=`t%60bi`&age`=2') .then((res) => { res.text.should.eql('name=`t%60bi`&age`=2'); }), request.get(base + '/raw-query?`age%60`=2%60`').then((res) => { res.text.should.eql('`age%60`=2%60`'); }), request .get(`${base}/raw-query`) .query('name=`t%60bi`') .query('age`=2') .then((res) => { res.text.should.eql('name=`t%60bi`&age`=2'); }) ]); }); }); describe('req.query(Object)', () => { it('should construct the query-string', (done) => { request .del(base) .query({ name: 'tobi' }) .query({ order: 'asc' }) .query({ limit: ['1', '2'] }) .end((error, res) => { res.body.should.eql({ name: 'tobi', order: 'asc', limit: ['1', '2'] }); done(); }); }); // See commit message for the reasoning here. it('should encode raw backticks', (done) => { request .get(`${base}/raw-query`) .query({ name: '`tobi`' }) .query({ 'orde%60r': null }) .query({ '`limit`': ['%602`'] }) .end((error, res) => { res.text.should.eql('name=%60tobi%60&orde%2560r&%60limit%60=%25602%60'); done(); }); }); it('should not error on dates', (done) => { const date = new Date(0); request .del(base) .query({ at: date }) .end((error, res) => { assert.equal(date.toISOString(), res.body.at); done(); }); }); it('should work after setting header fields', (done) => { request .del(base) .set('Foo', 'bar') .set('Bar', 'baz') .query({ name: 'tobi' }) .query({ order: 'asc' }) .query({ limit: ['1', '2'] }) .end((error, res) => { res.body.should.eql({ name: 'tobi', order: 'asc', limit: ['1', '2'] }); done(); }); }); it('should append to the original query-string', (done) => { request .del(`${base}/?name=tobi`) .query({ order: 'asc' }) .end((error, res) => { res.body.should.eql({ name: 'tobi', order: 'asc' }); done(); }); }); it('should retain the original query-string', (done) => { request.del(`${base}/?name=tobi`).end((error, res) => { res.body.should.eql({ name: 'tobi' }); done(); }); }); it('should keep only keys with null querystring values', (done) => { request .del(`${base}/url`) .query({ nil: null }) .end((error, res) => { res.text.should.equal('/url?nil'); done(); }); }); it('query-string should be sent on pipe', (done) => { const request_ = request.put(`${base}/?name=tobi`); const stream = fs.createReadStream('test/node/fixtures/user.json'); request_.on('response', (res) => { res.body.should.eql({ name: 'tobi' }); done(); }); stream.pipe(request_); }); }); superagent-7.1.1/test/node/redirects-other-host.js000066400000000000000000000143531417204173300222250ustar00rootroot00000000000000'use strict'; const assert = require('assert'); const request = require('../support/client'); const express = require('../support/express'); const app = express(); const app2 = express(); const should = require('should'); let http = require('http'); if (process.env.HTTP2_TEST) { http = require('http2'); } let base = 'http://localhost'; let server; before(function listen(done) { server = http.createServer(app); server = server.listen(0, function listening() { base += `:${server.address().port}`; done(); }); }); let base2 = 'http://localhost'; let server2; before(function listen(done) { server2 = http.createServer(app2); server2 = server2.listen(0, function listening() { base2 += `:${server2.address().port}`; done(); }); }); app.all('/test-301', (request_, res) => { res.redirect(301, `${base2}/`); }); app.all('/test-302', (request_, res) => { res.redirect(302, `${base2}/`); }); app.all('/test-303', (request_, res) => { res.redirect(303, `${base2}/`); }); app.all('/test-307', (request_, res) => { res.redirect(307, `${base2}/`); }); app.all('/test-308', (request_, res) => { res.redirect(308, `${base2}/`); }); app2.all('/', (request_, res) => { res.send(request_.method); }); describe('request.get', () => { describe('on 301 redirect', () => { it('should follow Location with a GET request', (done) => { const request_ = request.get(`${base}/test-301`).redirects(1); request_.end((error, res) => { const headers = request_.req.getHeaders ? request_.req.getHeaders() : request_.req._headers; headers.host.should.eql(`localhost:${server2.address().port}`); res.status.should.eql(200); res.text.should.eql('GET'); done(); }); }); }); describe('on 302 redirect', () => { it('should follow Location with a GET request', (done) => { const request_ = request.get(`${base}/test-302`).redirects(1); request_.end((error, res) => { const headers = request_.req.getHeaders ? request_.req.getHeaders() : request_.req._headers; res.status.should.eql(200); res.text.should.eql('GET'); done(); }); }); }); describe('on 303 redirect', () => { it('should follow Location with a GET request', (done) => { const request_ = request.get(`${base}/test-303`).redirects(1); request_.end((error, res) => { const headers = request_.req.getHeaders ? request_.req.getHeaders() : request_.req._headers; headers.host.should.eql(`localhost:${server2.address().port}`); res.status.should.eql(200); res.text.should.eql('GET'); done(); }); }); }); describe('on 307 redirect', () => { it('should follow Location with a GET request', (done) => { const request_ = request.get(`${base}/test-307`).redirects(1); request_.end((error, res) => { const headers = request_.req.getHeaders ? request_.req.getHeaders() : request_.req._headers; headers.host.should.eql(`localhost:${server2.address().port}`); res.status.should.eql(200); res.text.should.eql('GET'); done(); }); }); }); describe('on 308 redirect', () => { it('should follow Location with a GET request', (done) => { const request_ = request.get(`${base}/test-308`).redirects(1); request_.end((error, res) => { const headers = request_.req.getHeaders ? request_.req.getHeaders() : request_.req._headers; headers.host.should.eql(`localhost:${server2.address().port}`); res.status.should.eql(200); res.text.should.eql('GET'); done(); }); }); }); }); describe('request.post', () => { describe('on 301 redirect', () => { it('should follow Location with a GET request', (done) => { const request_ = request.post(`${base}/test-301`).redirects(1); request_.end((error, res) => { const headers = request_.req.getHeaders ? request_.req.getHeaders() : request_.req._headers; headers.host.should.eql(`localhost:${server2.address().port}`); res.status.should.eql(200); res.text.should.eql('GET'); done(); }); }); }); describe('on 302 redirect', () => { it('should follow Location with a GET request', (done) => { const request_ = request.post(`${base}/test-302`).redirects(1); request_.end((error, res) => { const headers = request_.req.getHeaders ? request_.req.getHeaders() : request_.req._headers; headers.host.should.eql(`localhost:${server2.address().port}`); res.status.should.eql(200); res.text.should.eql('GET'); done(); }); }); }); describe('on 303 redirect', () => { it('should follow Location with a GET request', (done) => { const request_ = request.post(`${base}/test-303`).redirects(1); request_.end((error, res) => { const headers = request_.req.getHeaders ? request_.req.getHeaders() : request_.req._headers; headers.host.should.eql(`localhost:${server2.address().port}`); res.status.should.eql(200); res.text.should.eql('GET'); done(); }); }); }); describe('on 307 redirect', () => { it('should follow Location with a POST request', (done) => { const request_ = request.post(`${base}/test-307`).redirects(1); request_.end((error, res) => { const headers = request_.req.getHeaders ? request_.req.getHeaders() : request_.req._headers; headers.host.should.eql(`localhost:${server2.address().port}`); res.status.should.eql(200); res.text.should.eql('POST'); done(); }); }); }); describe('on 308 redirect', () => { it('should follow Location with a POST request', (done) => { const request_ = request.post(`${base}/test-308`).redirects(1); request_.end((error, res) => { const headers = request_.req.getHeaders ? request_.req.getHeaders() : request_.req._headers; headers.host.should.eql(`localhost:${server2.address().port}`); res.status.should.eql(200); res.text.should.eql('POST'); done(); }); }); }); }); superagent-7.1.1/test/node/redirects.js000066400000000000000000000225071417204173300201330ustar00rootroot00000000000000'use strict'; const URL = require('url'); const assert = require('assert'); const getSetup = require('../support/setup'); const request = require('../support/client'); describe('request', () => { let setup; let base; before(async () => { setup = await getSetup(); base = setup.uri; }); describe('on redirect', () => { it('should merge cookies if agent is used', (done) => { request .agent() .get(`${base}/cookie-redirect`) .set('Cookie', 'orig=1; replaced=not') .end((error, res) => { try { assert.ifError(error); assert(/orig=1/.test(res.text), 'orig=1/.test'); assert(/replaced=yes/.test(res.text), 'replaced=yes/.test'); assert(/from-redir=1/.test(res.text), 'from-redir=1'); done(); } catch (err) { done(err); } }); }); it('should not merge cookies if agent is not used', (done) => { request .get(`${base}/cookie-redirect`) .set('Cookie', 'orig=1; replaced=not') .end((error, res) => { try { assert.ifError(error); assert(/orig=1/.test(res.text), '/orig=1'); assert(/replaced=not/.test(res.text), '/replaced=not'); assert(!/replaced=yes/.test(res.text), '!/replaced=yes'); assert(!/from-redir/.test(res.text), '!/from-redir'); done(); } catch (err) { done(err); } }); }); it('should have previously set cookie for subsquent requests when agent is used', (done) => { const agent = request.agent(); agent.get(`${base}/set-cookie`).end((error) => { assert.ifError(error); agent .get(`${base}/show-cookies`) .set({ Cookie: 'orig=1' }) .end((error, res) => { try { assert.ifError(error); assert(/orig=1/.test(res.text), 'orig=1/.test'); assert(/persist=123/.test(res.text), 'persist=123'); done(); } catch (err) { done(err); } }); }); }); it('should follow Location', (done) => { const redirects = []; request .get(base) .on('redirect', (res) => { redirects.push(res.headers.location); }) .end((error, res) => { try { const array = ['/movies', '/movies/all', '/movies/all/0']; redirects.should.eql(array); res.text.should.equal('first movie page'); done(); } catch (err) { done(err); } }); }); it('should follow Location with IP override', () => { const redirects = []; const url = URL.parse(base); return request .get(`http://redir.example.com:${url.port || '80'}${url.pathname}`) .connect({ '*': url.hostname }) .on('redirect', (res) => { redirects.push(res.headers.location); }) .then((res) => { const array = ['/movies', '/movies/all', '/movies/all/0']; redirects.should.eql(array); res.text.should.equal('first movie page'); }); }); it('should follow Location with IP:port override', () => { const redirects = []; const url = URL.parse(base); return request .get(`http://redir.example.com:9999${url.pathname}`) .connect({ '*': { host: url.hostname, port: url.port || 80 } }) .on('redirect', (res) => { redirects.push(res.headers.location); }) .then((res) => { const array = ['/movies', '/movies/all', '/movies/all/0']; redirects.should.eql(array); res.text.should.equal('first movie page'); }); }); it('should not follow on HEAD by default', () => { const redirects = []; return request .head(base) .ok(() => true) .on('redirect', (res) => { redirects.push(res.headers.location); }) .then((res) => { redirects.should.eql([]); res.status.should.equal(302); }); }); it('should follow on HEAD when redirects are set', (done) => { const redirects = []; request .head(base) .redirects(10) .on('redirect', (res) => { redirects.push(res.headers.location); }) .end((error, res) => { try { const array = []; array.push('/movies', '/movies/all', '/movies/all/0'); redirects.should.eql(array); assert(!res.text); done(); } catch (err) { done(err); } }); }); it('should remove Content-* fields', (done) => { request .post(`${base}/header`) .type('txt') .set('X-Foo', 'bar') .set('X-Bar', 'baz') .send('hey') .end((error, res) => { try { assert(res.body); res.body.should.have.property('x-foo', 'bar'); res.body.should.have.property('x-bar', 'baz'); res.body.should.not.have.property('content-type'); res.body.should.not.have.property('content-length'); res.body.should.not.have.property('transfer-encoding'); done(); } catch (err) { done(err); } }); }); it('should retain cookies', (done) => { request .get(`${base}/header`) .set('Cookie', 'foo=bar;') .end((error, res) => { try { assert(res.body); res.body.should.have.property('cookie', 'foo=bar;'); done(); } catch (err) { done(err); } }); }); it('should not resend query parameters', (done) => { const redirects = []; const query = []; request .get(`${base}/?foo=bar`) .on('redirect', (res) => { query.push(res.headers.query); redirects.push(res.headers.location); }) .end((error, res) => { try { const array = []; array.push('/movies', '/movies/all', '/movies/all/0'); redirects.should.eql(array); res.text.should.equal('first movie page'); query.should.eql(['{"foo":"bar"}', '{}', '{}']); res.headers.query.should.eql('{}'); done(); } catch (err) { done(err); } }); }); it('should handle no location header', (done) => { request.get(`${base}/bad-redirect`).end((error, res) => { try { error.message.should.equal('No location header for redirect'); done(); } catch (err) { done(err); } }); }); describe('when relative', () => { it('should redirect to a sibling path', (done) => { const redirects = []; request .get(`${base}/relative`) .on('redirect', (res) => { redirects.push(res.headers.location); }) .end((error, res) => { try { redirects.should.eql(['tobi']); res.text.should.equal('tobi'); done(); } catch (err) { done(err); } }); }); it('should redirect to a parent path', (done) => { const redirects = []; request .get(`${base}/relative/sub`) .on('redirect', (res) => { redirects.push(res.headers.location); }) .end((error, res) => { try { redirects.should.eql(['../tobi']); res.text.should.equal('tobi'); done(); } catch (err) { done(err); } }); }); }); }); describe('req.redirects(n)', () => { it('should alter the default number of redirects to follow', (done) => { const redirects = []; request .get(base) .redirects(2) .on('redirect', (res) => { redirects.push(res.headers.location); }) .end((error, res) => { try { const array = []; assert(res.redirect, 'res.redirect'); array.push('/movies', '/movies/all'); redirects.should.eql(array); res.text.should.match(/Moved Temporarily|Found/); done(); } catch (err) { done(err); } }); }); }); describe('on POST', () => { it('should redirect as GET', () => { const redirects = []; return request .post(`${base}/movie`) .send({ name: 'Tobi' }) .redirects(2) .on('redirect', (res) => { redirects.push(res.headers.location); }) .then((res) => { redirects.should.eql(['/movies/all/0']); res.text.should.equal('first movie page'); }); }); it('using multipart/form-data should redirect as GET', () => { const redirects = []; request .post(`${base}/movie`) .type('form') .field('name', 'Tobi') .redirects(2) .on('redirect', (res) => { redirects.push(res.headers.location); }) .then((res) => { redirects.should.eql(['/movies/all/0']); res.text.should.equal('first movie page'); }); }); }); }); superagent-7.1.1/test/node/response-readable-stream.js000066400000000000000000000026311417204173300230270ustar00rootroot00000000000000'use strict'; const request = require('../support/client'); const express = require('../support/express'); const app = express(); const fs = require('fs'); let http = require('http'); if (process.env.HTTP2_TEST) { http = require('http2'); } app.get('/', (request_, res) => { fs.createReadStream('test/node/fixtures/user.json').pipe(res); }); let base = 'http://localhost'; let server; before(function listen(done) { server = http.createServer(app); server = server.listen(0, function listening() { base += `:${server.address().port}`; done(); }); }); describe('response', () => { it('should act as a readable stream', (done) => { const request_ = request.get(base).buffer(false); request_.end((error, res) => { if (error) return done(error); let trackEndEvent = 0; let trackCloseEvent = 0; res.on('end', () => { trackEndEvent++; trackEndEvent.should.equal(1); if (!process.env.HTTP2_TEST) { trackCloseEvent.should.equal(0); // close should not have been called } done(); }); res.on('close', () => { trackCloseEvent++; }); setTimeout(() => { (() => { res.pause(); }).should.not.throw(); (() => { res.resume(); }).should.not.throw(); (() => { res.destroy(); }).should.not.throw(); }, 50); }); }); }); superagent-7.1.1/test/node/serialize.js000066400000000000000000000012001417204173300201210ustar00rootroot00000000000000'use strict'; const assert = require('assert'); const request = require('../support/client'); const getSetup = require('../support/setup'); describe('req.serialize(fn)', () => { let setup; let base; before(async () => { setup = await getSetup(); base = setup.uri; }); it('should take precedence over default parsers', (done) => { request .post(`${base}/echo`) .send({ foo: 123 }) .serialize(() => '{"bar":456}') .end((error, res) => { assert.ifError(error); assert.equal('{"bar":456}', res.text); assert.equal(456, res.body.bar); done(); }); }); }); superagent-7.1.1/test/node/set-host.js000066400000000000000000000021561417204173300177130ustar00rootroot00000000000000'use strict'; const request = require('../support/client'); const express = require('../support/express'); const app = express(); const http = require('http'); const assert = require('assert'); describe('request.get().set()', () => { if (process.env.HTTP2_TEST) { return; // request object doesn't look the same } let server; after(function exitServer() { if (typeof server.close === 'function') { server.close(); } else { server.destroy(); } }); it('should set host header after get()', (done) => { app.get('/', (request_, res) => { assert.equal(request_.hostname, 'example.com'); res.end(); }); server = http.createServer(app); server.listen(0, function listening() { request .get(`http://localhost:${server.address().port}`) .set('host', 'example.com') .then(() => { return request .get(`http://example.com:${server.address().port}`) .connect({ 'example.com': 'localhost', '*': 'fail' }); }) .then(() => done(), done); }); }); }); superagent-7.1.1/test/node/toError.js000066400000000000000000000017051417204173300176000ustar00rootroot00000000000000'use strict'; const assert = require('assert'); const request = require('../support/client'); const express = require('../support/express'); const app = express(); let http = require('http'); if (process.env.HTTP2_TEST) { http = require('http2'); } app.get('/', (request_, res) => { res.status(400).send('invalid json'); }); let base = 'http://localhost'; let server; before(function listen(done) { server = http.createServer(app); server = server.listen(0, function listening() { base += `:${server.address().port}`; done(); }); }); describe('res.toError()', () => { it('should return an Error', (done) => { request.get(base).end((error, res) => { var error = res.toError(); assert.equal(error.status, 400); assert.equal(error.method, 'GET'); assert.equal(error.path, '/'); assert.equal(error.message, 'cannot GET / (400)'); assert.equal(error.text, 'invalid json'); done(); }); }); }); superagent-7.1.1/test/node/unix-sockets.js000066400000000000000000000057521417204173300206060ustar00rootroot00000000000000'use strict'; const assert = require('assert'); let http = require('http'); let https = require('https'); const os = require('os'); const fs = require('fs'); const express = require('../support/express'); const request = require('../support/client'); const app = express(); const key = fs.readFileSync(`${__dirname}/fixtures/key.pem`); const cert = fs.readFileSync(`${__dirname}/fixtures/cert.pem`); const cacert = fs.readFileSync(`${__dirname}/fixtures/ca.cert.pem`); const httpSockPath = [os.tmpdir(), 'superagent-http.sock'].join('/'); const httpsSockPath = [os.tmpdir(), 'superagent-https.sock'].join('/'); let httpServer; let httpsServer; if (process.env.HTTP2_TEST) { http = https = require('http2'); } app.get('/', (request_, res) => { res.send('root ok!'); }); app.get('/request/path', (request_, res) => { res.send('request path ok!'); }); describe('[unix-sockets] http', () => { if (process.platform === 'win32') { return; } before((done) => { if (fs.existsSync(httpSockPath) === true) { // try unlink if sock file exists fs.unlinkSync(httpSockPath); } httpServer = http.createServer(app); httpServer.listen(httpSockPath, done); }); const base = `http+unix://${httpSockPath.replace(/\//g, '%2F')}`; describe('request', () => { it('path: / (root)', (done) => { request.get(`${base}/`).end((error, res) => { assert(res.ok); assert.strictEqual('root ok!', res.text); done(); }); }); it('path: /request/path', (done) => { request.get(`${base}/request/path`).end((error, res) => { assert(res.ok); assert.strictEqual('request path ok!', res.text); done(); }); }); }); after(() => { if (typeof httpServer.close === 'function') { httpServer.close(); } else httpServer.destroy(); }); }); describe('[unix-sockets] https', () => { if (process.platform === 'win32') { return; } before((done) => { if (fs.existsSync(httpsSockPath) === true) { // try unlink if sock file exists fs.unlinkSync(httpsSockPath); } httpsServer = process.env.HTTP2_TEST ? https.createSecureServer({ key, cert }, app) : https.createServer({ key, cert }, app); httpsServer.listen(httpsSockPath, done); }); const base = `https+unix://${httpsSockPath.replace(/\//g, '%2F')}`; describe('request', () => { it('path: / (root)', (done) => { request .get(`${base}/`) .ca(cacert) .end((error, res) => { assert.ifError(error); assert(res.ok); assert.strictEqual('root ok!', res.text); done(); }); }); it('path: /request/path', (done) => { request .get(`${base}/request/path`) .ca(cacert) .end((error, res) => { assert.ifError(error); assert(res.ok); assert.strictEqual('request path ok!', res.text); done(); }); }); }); after((done) => { httpsServer.close(done); }); }); superagent-7.1.1/test/node/user-agent.js000066400000000000000000000007111417204173300202120ustar00rootroot00000000000000'use strict'; const assert = require('assert'); const request = require('../support/client'); const getSetup = require('../support/setup'); describe('req.get()', () => { let setup; let base; before(async () => { setup = await getSetup(); base = setup.uri; }); it('should not set a default user-agent', () => request.get(`${base}/ua`).then((res) => { assert(res.headers); assert(!res.headers['user-agent']); })); }); superagent-7.1.1/test/node/utils.js000066400000000000000000000022621417204173300173030ustar00rootroot00000000000000'use strict'; const assert = require('assert'); const utils = require('../../lib/utils'); describe('utils.type(str)', () => { it('should return the mime type', () => { utils .type('application/json; charset=utf-8') .should.equal('application/json'); utils.type('application/json').should.equal('application/json'); }); }); describe('utils.params(str)', () => { it('should return the field parameters', () => { const object = utils.params('application/json; charset=utf-8; foo = bar'); object.charset.should.equal('utf-8'); object.foo.should.equal('bar'); utils.params('application/json').should.eql({}); }); }); describe('utils.parseLinks(str)', () => { it('should parse links', () => { const string_ = '; rel="next", ; rel="last"'; const returnValue = utils.parseLinks(string_); returnValue.next.should.equal( 'https://api.github.com/repos/visionmedia/mocha/issues?page=2' ); returnValue.last.should.equal( 'https://api.github.com/repos/visionmedia/mocha/issues?page=5' ); }); }); superagent-7.1.1/test/redirects.js000066400000000000000000000070601417204173300172030ustar00rootroot00000000000000const assert = require('assert'); const getSetup = require('./support/setup'); const request = require('./support/client'); describe('request', function () { let setup; let base; let isMSIE; before(async () => { setup = await getSetup(); base = setup.uri; isMSIE = !setup.NODE && /Trident\//.test(navigator.userAgent); }); this.timeout(20_000); describe('on redirect', () => { it('should retain header fields', (done) => { request .get(`${base}/header`) .set('X-Foo', 'bar') .end((error, res) => { try { assert(res.body); res.body.should.have.property('x-foo', 'bar'); done(); } catch (err) { done(err); } }); }); it('should preserve timeout across redirects', (done) => { request .get(`${base}/movies/random`) .timeout(250) .end((error, res) => { try { assert(error instanceof Error, 'expected an error'); error.should.have.property('timeout', 250); done(); } catch (err) { done(err); } }); }); it('should successfully redirect after retry on error', (done) => { const id = Math.random() * 1_000_000 * Date.now(); request .get(`${base}/error/redirect/${id}`) .retry(2) .end((error, res) => { assert(res.ok, 'response should be ok'); assert(res.text, 'first movie page'); done(); }); }); it('should preserve retries across redirects', (done) => { const id = Math.random() * 1_000_000 * Date.now(); request .get(`${base}/error/redirect-error${id}`) .retry(2) .end((error, res) => { assert(error, 'expected an error'); assert.equal(2, error.retries, 'expected an error with .retries'); assert.equal(500, error.status, 'expected an error status of 500'); done(); }); }); }); describe('on 303', () => { it('should redirect with same method', (done) => { request .put(`${base}/redirect-303`) .send({ msg: 'hello' }) .redirects(1) .on('redirect', (res) => { res.headers.location.should.equal('/reply-method'); }) .end((error, res) => { if (error) { done(error); return; } res.text.should.equal('method=get'); done(); }); }); }); describe('on 307', () => { it('should redirect with same method', (done) => { if (isMSIE) return done(); // IE9 broken request .put(`${base}/redirect-307`) .send({ msg: 'hello' }) .redirects(1) .on('redirect', (res) => { res.headers.location.should.equal('/reply-method'); }) .end((error, res) => { if (error) { done(error); return; } res.text.should.equal('method=put'); done(); }); }); }); describe('on 308', () => { it('should redirect with same method', (done) => { if (isMSIE) return done(); // IE9 broken request .put(`${base}/redirect-308`) .send({ msg: 'hello' }) .redirects(1) .on('redirect', (res) => { res.headers.location.should.equal('/reply-method'); }) .end((error, res) => { if (error) { done(error); return; } res.text.should.equal('method=put'); done(); }); }); }); }); superagent-7.1.1/test/request.js000066400000000000000000000550311417204173300167100ustar00rootroot00000000000000const assert = require('assert'); const getSetup = require('./support/setup'); const request = require('./support/client'); describe('request', function () { let setup; let uri; before(async () => { setup = await getSetup(); uri = setup.uri; }); this.timeout(20_000); it('Request inheritance', () => { assert(request.get(`${uri}/`) instanceof request.Request); }); it('request() simple GET without callback', (next) => { request('GET', 'test/test.request.js').end(); next(); }); it('request() simple GET', (next) => { request('GET', `${uri}/ok`).end((error, res) => { try { assert(res instanceof request.Response, 'respond with Response'); assert(res.ok, 'response should be ok'); assert(res.text, 'res.text'); next(); } catch (err) { next(err); } }); }); it('request() simple HEAD', (next) => { request.head(`${uri}/ok`).end((error, res) => { try { assert(res instanceof request.Response, 'respond with Response'); assert(res.ok, 'response should be ok'); assert(!res.text, 'res.text'); next(); } catch (err) { next(err); } }); }); it('request() GET 5xx', (next) => { request('GET', `${uri}/error`).end((error, res) => { try { assert(error); assert.equal(error.message, 'Internal Server Error'); assert(!res.ok, 'response should not be ok'); assert(res.error, 'response should be an error'); assert(!res.clientError, 'response should not be a client error'); assert(res.serverError, 'response should be a server error'); next(); } catch (err) { next(err); } }); }); it('request() GET 4xx', (next) => { request('GET', `${uri}/notfound`).end((error, res) => { try { assert(error); assert.equal(error.message, 'Not Found'); assert(!res.ok, 'response should not be ok'); assert(res.error, 'response should be an error'); assert(res.clientError, 'response should be a client error'); assert(!res.serverError, 'response should not be a server error'); next(); } catch (err) { next(err); } }); }); it('request() GET 404 Not Found', (next) => { request('GET', `${uri}/notfound`).end((error, res) => { try { assert(error); assert(res.notFound, 'response should be .notFound'); next(); } catch (err) { next(err); } }); }); it('request() GET 400 Bad Request', (next) => { request('GET', `${uri}/bad-request`).end((error, res) => { try { assert(error); assert(res.badRequest, 'response should be .badRequest'); next(); } catch (err) { next(err); } }); }); it('request() GET 401 Bad Request', (next) => { request('GET', `${uri}/unauthorized`).end((error, res) => { try { assert(error); assert(res.unauthorized, 'response should be .unauthorized'); next(); } catch (err) { next(err); } }); }); it('request() GET 406 Not Acceptable', (next) => { request('GET', `${uri}/not-acceptable`).end((error, res) => { try { assert(error); assert(res.notAcceptable, 'response should be .notAcceptable'); next(); } catch (err) { next(err); } }); }); it('request() GET 204 No Content', (next) => { request('GET', `${uri}/no-content`).end((error, res) => { try { assert.ifError(error); assert(res.noContent, 'response should be .noContent'); next(); } catch (err) { next(err); } }); }); it('request() DELETE 204 No Content', (next) => { request('DELETE', `${uri}/no-content`).end((error, res) => { try { assert.ifError(error); assert(res.noContent, 'response should be .noContent'); next(); } catch (err) { next(err); } }); }); it('request() header parsing', (next) => { request('GET', `${uri}/notfound`).end((error, res) => { try { assert(error); assert.equal('text/html; charset=utf-8', res.header['content-type']); assert.equal('Express', res.header['x-powered-by']); next(); } catch (err) { next(err); } }); }); it('request() .status', (next) => { request('GET', `${uri}/notfound`).end((error, res) => { try { assert(error); assert.equal(404, res.status, 'response .status'); assert.equal(4, res.statusType, 'response .statusType'); next(); } catch (err) { next(err); } }); }); it('get()', (next) => { request.get(`${uri}/notfound`).end((error, res) => { try { assert(error); assert.equal(404, res.status, 'response .status'); assert.equal(4, res.statusType, 'response .statusType'); next(); } catch (err) { next(err); } }); }); it('put()', (next) => { request.put(`${uri}/user/12`).end((error, res) => { try { assert.equal('updated', res.text, 'response text'); next(); } catch (err) { next(err); } }); }); it('put().send()', (next) => { request .put(`${uri}/user/13/body`) .send({ user: 'new' }) .end((error, res) => { try { assert.equal('received new', res.text, 'response text'); next(); } catch (err) { next(err); } }); }); it('post()', (next) => { request.post(`${uri}/user`).end((error, res) => { try { assert.equal('created', res.text, 'response text'); next(); } catch (err) { next(err); } }); }); it('del()', (next) => { request.del(`${uri}/user/12`).end((error, res) => { try { assert.equal('deleted', res.text, 'response text'); next(); } catch (err) { next(err); } }); }); it('delete()', (next) => { request.delete(`${uri}/user/12`).end((error, res) => { try { assert.equal('deleted', res.text, 'response text'); next(); } catch (err) { next(err); } }); }); it('post() data', (next) => { request .post(`${uri}/todo/item`) .type('application/octet-stream') .send('tobi') .end((error, res) => { try { assert.equal('added "tobi"', res.text, 'response text'); next(); } catch (err) { next(err); } }); }); it('request .type()', (next) => { request .post(`${uri}/user/12/pet`) .type('urlencoded') .send('pet=tobi') .end((error, res) => { try { assert.equal('added pet "tobi"', res.text, 'response text'); next(); } catch (err) { next(err); } }); }); it('request .type() with alias', (next) => { request .post(`${uri}/user/12/pet`) .type('application/x-www-form-urlencoded') .send('pet=tobi') .end((error, res) => { try { assert.equal('added pet "tobi"', res.text, 'response text'); next(); } catch (err) { next(err); } }); }); it('request .get() with no data or callback', (next) => { request.get(`${uri}/echo-header/content-type`); next(); }); it('request .send() with no data only', (next) => { request.post(`${uri}/user/5/pet`).type('urlencoded').send('pet=tobi'); next(); }); it('request .send() with callback only', (next) => { request .get(`${uri}/echo-header/accept`) .set('Accept', 'foo/bar') .end((error, res) => { try { assert.equal('foo/bar', res.text); next(); } catch (err) { next(err); } }); }); it('request .accept() with json', (next) => { request .get(`${uri}/echo-header/accept`) .accept('json') .end((error, res) => { try { assert.equal('application/json', res.text); next(); } catch (err) { next(err); } }); }); it('request .accept() with application/json', (next) => { request .get(`${uri}/echo-header/accept`) .accept('application/json') .end((error, res) => { try { assert.equal('application/json', res.text); next(); } catch (err) { next(err); } }); }); it('request .accept() with xml', (next) => { request .get(`${uri}/echo-header/accept`) .accept('xml') .end((error, res) => { try { // We can't depend on mime module to be consistent with this assert(res.text == 'application/xml' || res.text == 'text/xml'); next(); } catch (err) { next(err); } }); }); it('request .accept() with application/xml', (next) => { request .get(`${uri}/echo-header/accept`) .accept('application/xml') .end((error, res) => { try { assert.equal('application/xml', res.text); next(); } catch (err) { next(err); } }); }); // FIXME: ie6 will POST rather than GET here due to data(), // but I'm not 100% sure why. Newer IEs are OK. it('request .end()', (next) => { request .put(`${uri}/echo-header/content-type`) .set('Content-Type', 'text/plain') .send('wahoo') .end((error, res) => { try { assert.equal('text/plain', res.text); next(); } catch (err) { next(err); } }); }); it('request .send()', (next) => { request .put(`${uri}/echo-header/content-type`) .set('Content-Type', 'text/plain') .send('wahoo') .end((error, res) => { try { assert.equal('text/plain', res.text); next(); } catch (err) { next(err); } }); }); it('request .set()', (next) => { request .put(`${uri}/echo-header/content-type`) .set('Content-Type', 'text/plain') .send('wahoo') .end((error, res) => { try { assert.equal('text/plain', res.text); next(); } catch (err) { next(err); } }); }); it('request .set(object)', (next) => { request .put(`${uri}/echo-header/content-type`) .set({ 'Content-Type': 'text/plain' }) .send('wahoo') .end((error, res) => { try { assert.equal('text/plain', res.text); next(); } catch (err) { next(err); } }); }); it('POST urlencoded', (next) => { request .post(`${uri}/pet`) .type('urlencoded') .send({ name: 'Manny', species: 'cat' }) .end((error, res) => { try { assert.equal('added Manny the cat', res.text); next(); } catch (err) { next(err); } }); }); it('POST json', (next) => { request .post(`${uri}/pet`) .type('json') .send({ name: 'Manny', species: 'cat' }) .end((error, res) => { try { assert.equal('added Manny the cat', res.text); next(); } catch (err) { next(err); } }); }); it('POST json array', (next) => { request .post(`${uri}/echo`) .send([1, 2, 3]) .end((error, res) => { try { assert.equal( 'application/json', res.header['content-type'].split(';')[0] ); assert.equal('[1,2,3]', res.text); next(); } catch (err) { next(err); } }); }); it('POST json default', (next) => { request .post(`${uri}/pet`) .send({ name: 'Manny', species: 'cat' }) .end((error, res) => { try { assert.equal('added Manny the cat', res.text); next(); } catch (err) { next(err); } }); }); it('POST json contentType charset', (next) => { request .post(`${uri}/echo`) .set('Content-Type', 'application/json; charset=UTF-8') .send({ data: ['data1', 'data2'] }) .end((error, res) => { try { assert.equal('{"data":["data1","data2"]}', res.text); next(); } catch (err) { next(err); } }); }); it('POST json contentType vendor', (next) => { request .post(`${uri}/echo`) .set('Content-Type', 'application/vnd.example+json') .send({ data: ['data1', 'data2'] }) .end((error, res) => { try { assert.equal('{"data":["data1","data2"]}', res.text); next(); } catch (err) { next(err); } }); }); it('POST multiple .send() calls', (next) => { request .post(`${uri}/pet`) .send({ name: 'Manny' }) .send({ species: 'cat' }) .end((error, res) => { try { assert.equal('added Manny the cat', res.text); next(); } catch (err) { next(err); } }); }); it('POST multiple .send() strings', (next) => { request .post(`${uri}/echo`) .send('user[name]=tj') .send('user[email]=tj@vision-media.ca') .end((error, res) => { try { assert.equal( 'application/x-www-form-urlencoded', res.header['content-type'].split(';')[0] ); assert.equal( res.text, 'user[name]=tj&user[email]=tj@vision-media.ca' ); next(); } catch (err) { next(err); } }); }); it('POST with no data', (next) => { request .post(`${uri}/empty-body`) .send() .end((error, res) => { try { assert.ifError(error); assert(res.noContent, 'response should be .noContent'); next(); } catch (err) { next(err); } }); }); it('GET .type', (next) => { request.get(`${uri}/pets`).end((error, res) => { try { assert.equal('application/json', res.type); next(); } catch (err) { next(err); } }); }); it('GET Content-Type params', (next) => { request.get(`${uri}/text`).end((error, res) => { try { assert.equal('utf-8', res.charset); next(); } catch (err) { next(err); } }); }); it('GET json', (next) => { request.get(`${uri}/pets`).end((error, res) => { try { assert.deepEqual(res.body, ['tobi', 'loki', 'jane']); next(); } catch (err) { next(err); } }); }); it('GET json-seq', (next) => { request .get(`${uri}/json-seq`) .buffer() .end((error, res) => { try { assert.ifError(error); assert.deepEqual(res.text, '\u001E{"id":1}\n\u001E{"id":2}\n'); next(); } catch (err) { next(err); } }); }); it('GET x-www-form-urlencoded', (next) => { request.get(`${uri}/foo`).end((error, res) => { try { assert.deepEqual(res.body, { foo: 'bar' }); next(); } catch (err) { next(err); } }); }); it('GET shorthand', (next) => { request.get(`${uri}/foo`, (error, res) => { try { assert.equal('foo=bar', res.text); next(); } catch (err) { next(err); } }); }); it('POST shorthand', (next) => { request.post(`${uri}/user/0/pet`, { pet: 'tobi' }, (error, res) => { try { assert.equal('added pet "tobi"', res.text); next(); } catch (err) { next(err); } }); }); it('POST shorthand without callback', (next) => { request.post(`${uri}/user/0/pet`, { pet: 'tobi' }).end((error, res) => { try { assert.equal('added pet "tobi"', res.text); next(); } catch (err) { next(err); } }); }); it('GET querystring object with array', (next) => { request .get(`${uri}/querystring`) .query({ val: ['a', 'b', 'c'] }) .end((error, res) => { try { assert.deepEqual(res.body, { val: ['a', 'b', 'c'] }); next(); } catch (err) { next(err); } }); }); it('GET querystring object with array and primitives', (next) => { request .get(`${uri}/querystring`) .query({ array: ['a', 'b', 'c'], string: 'foo', number: 10 }) .end((error, res) => { try { assert.deepEqual(res.body, { array: ['a', 'b', 'c'], string: 'foo', number: 10 }); next(); } catch (err) { next(err); } }); }); it('GET querystring object with two arrays', (next) => { request .get(`${uri}/querystring`) .query({ array1: ['a', 'b', 'c'], array2: [1, 2, 3] }) .end((error, res) => { try { assert.deepEqual(res.body, { array1: ['a', 'b', 'c'], array2: [1, 2, 3] }); next(); } catch (err) { next(err); } }); }); it('GET querystring object', (next) => { request .get(`${uri}/querystring`) .query({ search: 'Manny' }) .end((error, res) => { try { assert.deepEqual(res.body, { search: 'Manny' }); next(); } catch (err) { next(err); } }); }); it('GET querystring append original', (next) => { request .get(`${uri}/querystring?search=Manny`) .query({ range: '1..5' }) .end((error, res) => { try { assert.deepEqual(res.body, { search: 'Manny', range: '1..5' }); next(); } catch (err) { next(err); } }); }); it('GET querystring multiple objects', (next) => { request .get(`${uri}/querystring`) .query({ search: 'Manny' }) .query({ range: '1..5' }) .query({ order: 'desc' }) .end((error, res) => { try { assert.deepEqual(res.body, { search: 'Manny', range: '1..5', order: 'desc' }); next(); } catch (err) { next(err); } }); }); it('GET querystring with strings', (next) => { request .get(`${uri}/querystring`) .query('search=Manny') .query('range=1..5') .query('order=desc') .end((error, res) => { try { assert.deepEqual(res.body, { search: 'Manny', range: '1..5', order: 'desc' }); next(); } catch (err) { next(err); } }); }); it('GET querystring with strings and objects', (next) => { request .get(`${uri}/querystring`) .query('search=Manny') .query({ order: 'desc', range: '1..5' }) .end((error, res) => { try { assert.deepEqual(res.body, { search: 'Manny', range: '1..5', order: 'desc' }); next(); } catch (err) { next(err); } }); }); it('GET shorthand payload goes to querystring', (next) => { request.get( `${uri}/querystring`, { foo: 'FOO', bar: 'BAR' }, (error, res) => { try { assert.deepEqual(res.body, { foo: 'FOO', bar: 'BAR' }); next(); } catch (err) { next(err); } } ); }); it('HEAD shorthand payload goes to querystring', (next) => { request.head( `${uri}/querystring-in-header`, { foo: 'FOO', bar: 'BAR' }, (error, res) => { try { assert.deepEqual(JSON.parse(res.headers.query), { foo: 'FOO', bar: 'BAR' }); next(); } catch (err) { next(err); } } ); }); it('request(method, url)', (next) => { request('GET', `${uri}/foo`).end((error, res) => { try { assert.equal('bar', res.body.foo); next(); } catch (err) { next(err); } }); }); it('request(url)', (next) => { request(`${uri}/foo`).end((error, res) => { try { assert.equal('bar', res.body.foo); next(); } catch (err) { next(err); } }); }); it('request(url, fn)', (next) => { request(`${uri}/foo`, (error, res) => { try { assert.equal('bar', res.body.foo); next(); } catch (err) { next(err); } }); }); it('req.timeout(ms)', (next) => { const request_ = request.get(`${uri}/delay/3000`).timeout(1000); request_.end((error, res) => { try { assert(error, 'error missing'); assert.equal(1000, error.timeout, 'err.timeout missing'); assert.equal( 'Timeout of 1000ms exceeded', error.message, 'err.message incorrect' ); assert.equal(null, res); assert(request_.timedout, true); next(); } catch (err) { next(err); } }); }); it('req.timeout(ms) with redirect', (next) => { const request_ = request.get(`${uri}/delay/const`).timeout(1000); request_.end((error, res) => { try { assert(error, 'error missing'); assert.equal(1000, error.timeout, 'err.timeout missing'); assert.equal( 'Timeout of 1000ms exceeded', error.message, 'err.message incorrect' ); assert.equal(null, res); assert(request_.timedout, true); next(); } catch (err) { next(err); } }); }); it('request event', (next) => { request .get(`${uri}/foo`) .on('request', (request_) => { try { assert.equal(`${uri}/foo`, request_.url); next(); } catch (err) { next(err); } }) .end(); }); it('response event', (next) => { request .get(`${uri}/foo`) .on('response', (res) => { try { assert.equal('bar', res.body.foo); next(); } catch (err) { next(err); } }) .end(); }); it('response should set statusCode', (next) => { request.get(`${uri}/ok`, (error, res) => { try { assert.strictEqual(res.statusCode, 200); next(); } catch (err) { next(err); } }); }); it('req.toJSON()', (next) => { request.get(`${uri}/ok`).end((error, res) => { try { const j = (res.request || res.req).toJSON(); for (const prop of ['url', 'method', 'data', 'headers']) { assert(j.hasOwnProperty(prop)); } next(); } catch (err) { next(err); } }); }); }); superagent-7.1.1/test/retry.js000066400000000000000000000170551417204173300163710ustar00rootroot00000000000000const assert = require('assert'); const getSetup = require('./support/setup'); const request = require('./support/client'); function uniqid() { return Math.random() * 10_000_000; } describe('.retry(count)', function () { let setup; let base; before(async () => { setup = await getSetup(); base = setup.uri; }); this.timeout(15_000); it('should not retry if passed "0"', (done) => { request .get(`${base}/error`) .retry(0) .end((error, res) => { try { assert(error, 'expected an error'); assert.equal( undefined, error.retries, 'expected an error without .retries' ); assert.equal(500, error.status, 'expected an error status of 500'); done(); } catch (err) { done(err); } }); }); it('should not retry if passed an invalid number', (done) => { request .get(`${base}/error`) .retry(-2) .end((error, res) => { try { assert(error, 'expected an error'); assert.equal( undefined, error.retries, 'expected an error without .retries' ); assert.equal(500, error.status, 'expected an error status of 500'); done(); } catch (err) { done(err); } }); }); it('should not retry if passed undefined', (done) => { request .get(`${base}/error`) .retry(undefined) .end((error, res) => { try { assert(error, 'expected an error'); assert.equal( undefined, error.retries, 'expected an error without .retries' ); assert.equal(500, error.status, 'expected an error status of 500'); done(); } catch (err) { done(err); } }); }); it('should handle server error after repeat attempt', (done) => { request .get(`${base}/error`) .retry(2) .end((error, res) => { try { assert(error, 'expected an error'); assert.equal(2, error.retries, 'expected an error with .retries'); assert.equal(500, error.status, 'expected an error status of 500'); done(); } catch (err) { done(err); } }); }); it('should retry if passed nothing', (done) => { request .get(`${base}/error`) .retry() .end((error, res) => { try { assert(error, 'expected an error'); assert.equal(1, error.retries, 'expected an error with .retries'); assert.equal(500, error.status, 'expected an error status of 500'); done(); } catch (err) { done(err); } }); }); it('should retry if passed "true"', (done) => { request .get(`${base}/error`) .retry(true) .end((error, res) => { try { assert(error, 'expected an error'); assert.equal(1, error.retries, 'expected an error with .retries'); assert.equal(500, error.status, 'expected an error status of 500'); done(); } catch (err) { done(err); } }); }); it('should handle successful request after repeat attempt from server error', (done) => { request .get(`${base}/error/ok/${uniqid()}`) .query({ qs: 'present' }) .retry(2) .end((error, res) => { try { assert.ifError(error); assert(res.ok, 'response should be ok'); assert(res.text, 'res.text'); done(); } catch (err) { done(err); } }); }); it('should handle server timeout error after repeat attempt', (done) => { request .get(`${base}/delay/400`) .timeout(200) .retry(2) .end((error, res) => { try { assert(error, 'expected an error'); assert.equal(2, error.retries, 'expected an error with .retries'); assert.equal( 'number', typeof error.timeout, 'expected an error with .timeout' ); assert.equal('ECONNABORTED', error.code, 'expected abort error code'); done(); } catch (err) { done(err); } }); }); it('should handle successful request after repeat attempt from server timeout', (done) => { const url = `/delay/1200/ok/${uniqid()}?built=in`; request .get(base + url) .query('string=ified') .query({ json: 'ed' }) .timeout(600) .retry(2) .end((error, res) => { try { assert.ifError(error); assert(res.ok, 'response should be ok'); assert.equal(res.text, `ok = ${url}&string=ified&json=ed`); done(); } catch (err) { done(err); } }); }); it('should handle successful request after repeat attempt from server timeout when using .then(fulfill, reject)', (done) => { const url = `/delay/1200/ok/${uniqid()}?built=in`; request .get(base + url) .query('string=ified') .query({ json: 'ed' }) .timeout(600) .retry(1) .then((res, error) => { try { assert.ifError(error); assert(res.ok, 'response should be ok'); assert.equal(res.text, `ok = ${url}&string=ified&json=ed`); done(); } catch (err) { done(err); } }); }); it('should correctly abort a retry attempt', (done) => { let aborted = false; const request_ = request.get(`${base}/delay/400`).timeout(200).retry(2); request_.end((error, res) => { try { assert(false, 'should not complete the request'); } catch (error_) { done(error_); } }); request_.on('abort', () => { aborted = true; }); setTimeout(() => { request_.abort(); setTimeout(() => { try { assert(aborted, 'should be aborted'); done(); } catch (err) { done(err); } }, 150); }, 150); }); it('should correctly retain header fields', (done) => { request .get(`${base}/error/ok/${uniqid()}`) .query({ qs: 'present' }) .retry(2) .set('X-Foo', 'bar') .end((error, res) => { try { assert.ifError(error); assert(res.body); res.body.should.have.property('x-foo', 'bar'); done(); } catch (err) { done(err); } }); }); it('should not retry on 4xx responses', (done) => { request .get(`${base}/bad-request`) .retry(2) .end((error, res) => { try { assert(error, 'expected an error'); assert.equal(0, error.retries, 'expected an error with 0 .retries'); assert.equal(400, error.status, 'expected an error status of 400'); done(); } catch (err) { done(err); } }); }); it('should execute callback on retry if passed', (done) => { let callbackCallCount = 0; function retryCallback(request) { callbackCallCount++; } request .get(`${base}/error`) .retry(2, retryCallback) .end((error, res) => { try { assert(error, 'expected an error'); assert.equal(2, error.retries, 'expected an error with .retries'); assert.equal(500, error.status, 'expected an error status of 500'); assert.equal( 2, callbackCallCount, 'expected the callback to be called on each retry' ); done(); } catch (err) { done(err); } }); }); }); superagent-7.1.1/test/support/000077500000000000000000000000001417204173300163725ustar00rootroot00000000000000superagent-7.1.1/test/support/blank.js000066400000000000000000000000001417204173300200050ustar00rootroot00000000000000superagent-7.1.1/test/support/client.js000066400000000000000000000002001417204173300201760ustar00rootroot00000000000000const request = require('../..'); if (process.env.HTTP2_TEST) { request.http2 = true; } exports = module.exports = request; superagent-7.1.1/test/support/express/000077500000000000000000000000001417204173300200635ustar00rootroot00000000000000superagent-7.1.1/test/support/express/index.js000066400000000000000000000015211417204173300215270ustar00rootroot00000000000000const process = require('process'); const express = require('express'); let http2Request; let http2Res; if (process.env.HTTP2_TEST) { const http2 = require('http2'); const reqDecorator = require('./requestDecorator'); const resDecorator = require('./responseDecorator'); http2Request = reqDecorator( Object.create(http2.Http2ServerRequest.prototype) ); http2Res = resDecorator(Object.create(http2.Http2ServerResponse.prototype)); } function createApp() { const app = express(); if (process.env.HTTP2_TEST) { app.request = Object.create(http2Request, { app: { configurable: true, enumerable: true, writable: true, value: app } }); app.response = Object.create(http2Res, { app: { configurable: true, enumerable: true, writable: true, value: app } }); } return app; } module.exports = createApp; superagent-7.1.1/test/support/express/requestDecorator.js000066400000000000000000000301571417204173300237620ustar00rootroot00000000000000/*! * express * Copyright(c) 2009-2013 TJ Holowaychuk * Copyright(c) 2013 Roman Shtylman * Copyright(c) 2014-2015 Douglas Christopher Wilson * MIT Licensed */ 'use strict'; /** * Module dependencies. * @private */ const { isIP } = require('net'); const accepts = require('accepts'); const typeis = require('type-is'); const fresh = require('fresh'); const parseRange = require('range-parser'); const parse = require('parseurl'); const proxyaddr = require('proxy-addr'); /** * Request prototype. * @public */ /** * Module exports. * @public */ module.exports = setMethods; function setMethods(request) { /** * Return request header. * * The `Referrer` header field is special-cased, * both `Referrer` and `Referer` are interchangeable. * * Examples: * * req.get('Content-Type'); * // => "text/plain" * * req.get('content-type'); * // => "text/plain" * * req.get('Something'); * // => undefined * * Aliased as `req.header()`. * * @param {String} name * @return {String} * @public */ request.get = request.header = function header(name) { if (!name) { throw new TypeError('name argument is required to req.get'); } if (typeof name !== 'string') { throw new TypeError('name must be a string to req.get'); } const lc = name.toLowerCase(); switch (lc) { case 'referer': case 'referrer': return this.headers.referrer || this.headers.referer; default: return this.headers[lc]; } }; /** * To do: update docs. * * Check if the given `type(s)` is acceptable, returning * the best match when true, otherwise `undefined`, in which * case you should respond with 406 "Not Acceptable". * * The `type` value may be a single MIME type string * such as "application/json", an extension name * such as "json", a comma-delimited list such as "json, html, text/plain", * an argument list such as `"json", "html", "text/plain"`, * or an array `["json", "html", "text/plain"]`. When a list * or array is given, the _best_ match, if any is returned. * * Examples: * * // Accept: text/html * req.accepts('html'); * // => "html" * * // Accept: text/*, application/json * req.accepts('html'); * // => "html" * req.accepts('text/html'); * // => "text/html" * req.accepts('json, text'); * // => "json" * req.accepts('application/json'); * // => "application/json" * * // Accept: text/*, application/json * req.accepts('image/png'); * req.accepts('png'); * // => undefined * * // Accept: text/*;q=.5, application/json * req.accepts(['html', 'json']); * req.accepts('html', 'json'); * req.accepts('html, json'); * // => "json" * * @param {String|Array} type(s) * @return {String|Array|Boolean} * @public */ request.accepts = function () { const accept = accepts(this); return accept.types.apply(accept, arguments); }; /** * Check if the given `encoding`s are accepted. * * @param {String} ...encoding * @return {String|Array} * @public */ request.acceptsEncodings = function () { const accept = accepts(this); return accept.encodings.apply(accept, arguments); }; /** * Check if the given `charset`s are acceptable, * otherwise you should respond with 406 "Not Acceptable". * * @param {String} ...charset * @return {String|Array} * @public */ request.acceptsCharsets = function () { const accept = accepts(this); return accept.charsets.apply(accept, arguments); }; /** * Check if the given `lang`s are acceptable, * otherwise you should respond with 406 "Not Acceptable". * * @param {String} ...lang * @return {String|Array} * @public */ request.acceptsLanguages = function () { const accept = accepts(this); return accept.languages.apply(accept, arguments); }; /** * Parse Range header field, capping to the given `size`. * * Unspecified ranges such as "0-" require knowledge of your resource length. In * the case of a byte range this is of course the total number of bytes. If the * Range header field is not given `undefined` is returned, `-1` when unsatisfiable, * and `-2` when syntactically invalid. * * When ranges are returned, the array has a "type" property which is the type of * range that is required (most commonly, "bytes"). Each array element is an object * with a "start" and "end" property for the portion of the range. * * The "combine" option can be set to `true` and overlapping & adjacent ranges * will be combined into a single range. * * NOTE: remember that ranges are inclusive, so for example "Range: users=0-3" * should respond with 4 users when available, not 3. * * @param {number} size * @param {object} [options] * @param {boolean} [options.combine=false] * @return {number|array} * @public */ request.range = function range(size, options) { const range = this.get('Range'); if (!range) return; return parseRange(size, range, options); }; /** * Parse the query string of `req.url`. * * This uses the "query parser" setting to parse the raw * string into an object. * * @return {String} * @api public */ defineGetter(request, 'query', function query() { const queryparse = this.app.get('query parser fn'); if (!queryparse) { // parsing is disabled return Object.create(null); } const querystring = parse(this).query; return queryparse(querystring); }); /** * Check if the incoming request contains the "Content-Type" * header field, and it contains the give mime `type`. * * Examples: * * // With Content-Type: text/html; charset=utf-8 * req.is('html'); * req.is('text/html'); * req.is('text/*'); * // => true * * // When Content-Type is application/json * req.is('json'); * req.is('application/json'); * req.is('application/*'); * // => true * * req.is('html'); * // => false * * @param {String|Array} types... * @return {String|false|null} * @public */ request.is = function is(types) { let array = types; // support flattened arguments if (!Array.isArray(types)) { array = new Array(arguments.length); for (let i = 0; i < array.length; i++) { array[i] = arguments[i]; } } return typeis(this, array); }; /** * Return the protocol string "http" or "https" * when requested with TLS. When the "trust proxy" * setting trusts the socket address, the * "X-Forwarded-Proto" header field will be trusted * and used if present. * * If you're running behind a reverse proxy that * supplies https for you this may be enabled. * * @return {String} * @public */ defineGetter(request, 'protocol', function protocol() { const proto = this.connection.encrypted ? 'https' : 'http'; const trust = this.app.get('trust proxy fn'); if (!trust(this.connection.remoteAddress, 0)) { return proto; } // Note: X-Forwarded-Proto is normally only ever a // single value, but this is to be safe. const header = this.get('X-Forwarded-Proto') || proto; const index = header.indexOf(','); return index !== -1 ? header.slice(0, index).trim() : header.trim(); }); /** * Short-hand for: * * req.protocol === 'https' * * @return {Boolean} * @public */ defineGetter(request, 'secure', function secure() { return this.protocol === 'https'; }); /** * Return the remote address from the trusted proxy. * * The is the remote address on the socket unless * "trust proxy" is set. * * @return {String} * @public */ defineGetter(request, 'ip', function ip() { const trust = this.app.get('trust proxy fn'); return proxyaddr(this, trust); }); /** * When "trust proxy" is set, trusted proxy addresses + client. * * For example if the value were "client, proxy1, proxy2" * you would receive the array `["client", "proxy1", "proxy2"]` * where "proxy2" is the furthest down-stream and "proxy1" and * "proxy2" were trusted. * * @return {Array} * @public */ defineGetter(request, 'ips', function ips() { const trust = this.app.get('trust proxy fn'); const addrs = proxyaddr.all(this, trust); // reverse the order (to farthest -> closest) // and remove socket address addrs.reverse().pop(); return addrs; }); /** * Return subdomains as an array. * * Subdomains are the dot-separated parts of the host before the main domain of * the app. By default, the domain of the app is assumed to be the last two * parts of the host. This can be changed by setting "subdomain offset". * * For example, if the domain is "tobi.ferrets.example.com": * If "subdomain offset" is not set, req.subdomains is `["ferrets", "tobi"]`. * If "subdomain offset" is 3, req.subdomains is `["tobi"]`. * * @return {Array} * @public */ defineGetter(request, 'subdomains', function subdomains() { const { hostname } = this; if (!hostname) return []; const offset = this.app.get('subdomain offset'); const subdomains = !isIP(hostname) ? hostname.split('.').reverse() : [hostname]; return subdomains.slice(offset); }); /** * Short-hand for `url.parse(req.url).pathname`. * * @return {String} * @public */ defineGetter(request, 'path', function path() { return parse(this).pathname; }); /** * Parse the "Host" header field to a host. * * When the "trust proxy" setting trusts the socket * address, the "X-Forwarded-Host" header field will * be trusted. * * @return {String} * @public */ defineGetter(request, 'host', function host() { const trust = this.app.get('trust proxy fn'); let value = this.get('X-Forwarded-Host'); if (!value || !trust(this.connection.remoteAddress, 0)) { value = this.get('Host'); } return value || undefined; }); /** * Parse the "Host" header field to a hostname. * * When the "trust proxy" setting trusts the socket * address, the "X-Forwarded-Host" header field will * be trusted. * * @return {String} * @api public */ defineGetter(request, 'hostname', function hostname() { const { host } = this; if (!host) return; // IPv6 literal support const offset = host[0] === '[' ? host.indexOf(']') + 1 : 0; const index = host.indexOf(':', offset); return index !== -1 ? host.slice(0, index) : host; }); /** * Check if the request is fresh, aka * Last-Modified and/or the ETag * still match. * * @return {Boolean} * @public */ defineGetter(request, 'fresh', function () { const { method } = this; const { res } = this; const status = res.statusCode; // GET or HEAD for weak freshness validation only if (method !== 'GET' && method !== 'HEAD') return false; // 2xx or 304 as per rfc2616 14.26 if ((status >= 200 && status < 300) || status === 304) { return fresh(this.headers, { etag: res.get('ETag'), 'last-modified': res.get('Last-Modified') }); } return false; }); /** * Check if the request is stale, aka * "Last-Modified" and / or the "ETag" for the * resource has changed. * * @return {Boolean} * @public */ defineGetter(request, 'stale', function stale() { return !this.fresh; }); /** * Check if the request was an _XMLHttpRequest_. * * @return {Boolean} * @public */ defineGetter(request, 'xhr', function xhr() { const value = this.get('X-Requested-With') || ''; return value.toLowerCase() === 'xmlhttprequest'; }); return request; } /** * Helper function for creating a getter on an object. * * @param {Object} obj * @param {String} name * @param {Function} getter * @private */ function defineGetter(object, name, getter) { Object.defineProperty(object, name, { configurable: true, enumerable: true, get: getter }); } superagent-7.1.1/test/support/express/responseDecorator.js000066400000000000000000000602111417204173300241220ustar00rootroot00000000000000/*! * express * Copyright(c) 2009-2013 TJ Holowaychuk * Copyright(c) 2014-2015 Douglas Christopher Wilson * MIT Licensed */ 'use strict'; /** * Module dependencies. * @private */ const path = require('path'); const { Buffer } = require('safe-buffer'); const contentDisposition = require('content-disposition'); const encodeUrl = require('encodeurl'); const escapeHtml = require('escape-html'); const onFinished = require('on-finished'); const pathIsAbsolute = require('path-is-absolute'); const statuses = require('statuses'); const merge = require('utils-merge'); const { sign } = require('cookie-signature'); const cookie = require('cookie'); const send = require('send'); const { normalizeType } = require('./utils'); const { normalizeTypes } = require('./utils'); const { setCharset } = require('./utils'); const { extname } = path; const { mime } = send; const { resolve } = path; const vary = require('vary'); /** * Module exports. * @public */ module.exports = setMethods; function setMethods(res) { /** * Module variables. * @private */ const charsetRegExp = /;\s*charset\s*=/; /** * Set status `code`. * * @param {Number} code * @return {ServerResponse} * @public */ res.status = function status(code) { this.statusCode = code; return this; }; /** * Set Link header field with the given `links`. * * Examples: * * res.links({ * next: 'http://api.example.com/users?page=2', * last: 'http://api.example.com/users?page=5' * }); * * @param {Object} links * @return {ServerResponse} * @public */ res.links = function (links) { let link = this.get('Link') || ''; if (link) link += ', '; return this.set( 'Link', link + Object.keys(links) .map((rel) => { return '<' + links[rel] + '>; rel="' + rel + '"'; }) .join(', ') ); }; /** * Send a response. * * Examples: * * res.send(Buffer.from('wahoo')); * res.send({ some: 'json' }); * res.send('

some html

'); * * @param {string|number|boolean|object|Buffer} body * @public */ res.send = function send(body) { let chunk = body; let encoding; const { req } = this; let type; // settings const { app } = this; switch (typeof chunk) { // string defaulting to html case 'string': if (!this.get('Content-Type')) { this.type('html'); } break; case 'boolean': case 'number': case 'object': if (chunk === null) { chunk = ''; } else if (Buffer.isBuffer(chunk)) { if (!this.get('Content-Type')) { this.type('bin'); } } else { return this.json(chunk); } break; } // write strings in utf-8 if (typeof chunk === 'string') { encoding = 'utf8'; type = this.get('Content-Type'); // reflect this in content-type if (typeof type === 'string') { this.set('Content-Type', setCharset(type, 'utf-8')); } } // determine if ETag should be generated const etagFn = app.get('etag fn'); const generateETag = !this.get('ETag') && typeof etagFn === 'function'; // populate Content-Length let length_; if (chunk !== undefined) { if (Buffer.isBuffer(chunk)) { // get length of Buffer length_ = chunk.length; } else if (!generateETag && chunk.length < 1000) { // just calculate length when no ETag + small chunk length_ = Buffer.byteLength(chunk, encoding); } else { // convert chunk to Buffer and calculate chunk = Buffer.from(chunk, encoding); encoding = undefined; length_ = chunk.length; } this.set('Content-Length', length_); } // populate ETag let etag; if ( generateETag && length_ !== undefined && (etag = etagFn(chunk, encoding)) ) { this.set('ETag', etag); } // freshness if (req.fresh) this.statusCode = 304; // strip irrelevant headers if (this.statusCode === 204 || this.statusCode === 304) { this.removeHeader('Content-Type'); this.removeHeader('Content-Length'); this.removeHeader('Transfer-Encoding'); chunk = ''; } if (req.method === 'HEAD') { // skip body for HEAD this.end(); } else { // respond this.end(chunk, encoding); } return this; }; /** * Send JSON response. * * Examples: * * res.json(null); * res.json({ user: 'tj' }); * * @param {string|number|boolean|object} obj * @public */ res.json = function json(object) { // settings const { app } = this; const escape = app.get('json escape'); const replacer = app.get('json replacer'); const spaces = app.get('json spaces'); const body = stringify(object, replacer, spaces, escape); // content-type if (!this.get('Content-Type')) { this.set('Content-Type', 'application/json'); } return this.send(body); }; /** * Send JSON response with JSONP callback support. * * Examples: * * res.jsonp(null); * res.jsonp({ user: 'tj' }); * * @param {string|number|boolean|object} obj * @public */ res.jsonp = function jsonp(object) { // settings const { app } = this; const escape = app.get('json escape'); const replacer = app.get('json replacer'); const spaces = app.get('json spaces'); let body = stringify(object, replacer, spaces, escape); let callback = this.req.query[app.get('jsonp callback name')]; // content-type if (!this.get('Content-Type')) { this.set('X-Content-Type-Options', 'nosniff'); this.set('Content-Type', 'application/json'); } // fixup callback if (Array.isArray(callback)) { callback = callback[0]; } // jsonp if (typeof callback === 'string' && callback.length > 0) { this.set('X-Content-Type-Options', 'nosniff'); this.set('Content-Type', 'text/javascript'); // restrict callback charset callback = callback.replace(/[^[\]\w$.]/g, ''); // replace chars not allowed in JavaScript that are in JSON body = body.replace(/\u2028/g, '\\u2028').replace(/\u2029/g, '\\u2029'); // the /**/ is a specific security mitigation for "Rosetta Flash JSONP abuse" // the typeof check is just to reduce client error noise body = '/**/ typeof ' + callback + " === 'function' && " + callback + '(' + body + ');'; } return this.send(body); }; /** * Send given HTTP status code. * * Sets the response status to `statusCode` and the body of the * response to the standard description from node's http.STATUS_CODES * or the statusCode number if no description. * * Examples: * * res.sendStatus(200); * * @param {number} statusCode * @public */ res.sendStatus = function sendStatus(statusCode) { const body = statuses[statusCode] || String(statusCode); this.statusCode = statusCode; this.type('txt'); return this.send(body); }; /** * Transfer the file at the given `path`. * * Automatically sets the _Content-Type_ response header field. * The callback `callback(err)` is invoked when the transfer is complete * or when an error occurs. Be sure to check `res.sentHeader` * if you wish to attempt responding, as the header and some data * may have already been transferred. * * Options: * * - `maxAge` defaulting to 0 (can be string converted by `ms`) * - `root` root directory for relative filenames * - `headers` object of headers to serve with file * - `dotfiles` serve dotfiles, defaulting to false; can be `"allow"` to send them * * Other options are passed along to `send`. * * Examples: * * The following example illustrates how `res.sendFile()` may * be used as an alternative for the `static()` middleware for * dynamic situations. The code backing `res.sendFile()` is actually * the same code, so HTTP cache support etc is identical. * * app.get('/user/:uid/photos/:file', function(req, res){ * var uid = req.params.uid * , file = req.params.file; * * req.user.mayViewFilesFrom(uid, function(yes){ * if (yes) { * res.sendFile('/uploads/' + uid + '/' + file); * } else { * res.send(403, 'Sorry! you cant see that.'); * } * }); * }); * * @public */ res.sendFile = function sendFile(path, options, callback) { let done = callback; const { req } = this; const res = this; const { next } = req; let options_ = options || {}; if (!path) { throw new TypeError('path argument is required to res.sendFile'); } // support function as second arg if (typeof options === 'function') { done = options; options_ = {}; } if (!options_.root && !pathIsAbsolute(path)) { throw new TypeError( 'path must be absolute or specify root to res.sendFile' ); } // create file stream const pathname = encodeURI(path); const file = send(req, pathname, options_); // transfer sendfile(res, file, options_, (error) => { if (done) return done(error); if (error && error.code === 'EISDIR') return next(); // next() all but write errors if (error && error.code !== 'ECONNABORTED' && error.syscall !== 'write') { next(error); } }); }; /** * Transfer the file at the given `path` as an attachment. * * Optionally providing an alternate attachment `filename`, * and optional callback `callback(err)`. The callback is invoked * when the data transfer is complete, or when an error has * ocurred. Be sure to check `res.headersSent` if you plan to respond. * * Optionally providing an `options` object to use with `res.sendFile()`. * This function will set the `Content-Disposition` header, overriding * any `Content-Disposition` header passed as header options in order * to set the attachment and filename. * * This method uses `res.sendFile()`. * * @public */ res.download = function download(path, filename, options, callback) { let done = callback; let name = filename; let options_ = options || null; // support function as second or third arg if (typeof filename === 'function') { done = filename; name = null; options_ = null; } else if (typeof options === 'function') { done = options; options_ = null; } // set Content-Disposition when file is sent const headers = { 'Content-Disposition': contentDisposition(name || path) }; // merge user-provided headers if (options_ && options_.headers) { const keys = Object.keys(options_.headers); for (const key of keys) { if (key.toLowerCase() !== 'content-disposition') { headers[key] = options_.headers[key]; } } } // merge user-provided options options_ = Object.create(options_); options_.headers = headers; // Resolve the full path for sendFile const fullPath = resolve(path); // send file return this.sendFile(fullPath, options_, done); }; /** * Set _Content-Type_ response header with `type` through `mime.lookup()` * when it does not contain "/", or set the Content-Type to `type` otherwise. * * Examples: * * res.type('.html'); * res.type('html'); * res.type('json'); * res.type('application/json'); * res.type('png'); * * @param {String} type * @return {ServerResponse} for chaining * @public */ res.contentType = res.type = function contentType(type) { const ct = !type.includes('/') ? mime.lookup(type) : type; return this.set('Content-Type', ct); }; /** * Respond to the Acceptable formats using an `obj` * of mime-type callbacks. * * This method uses `req.accepted`, an array of * acceptable types ordered by their quality values. * When "Accept" is not present the _first_ callback * is invoked, otherwise the first match is used. When * no match is performed the server responds with * 406 "Not Acceptable". * * Content-Type is set for you, however if you choose * you may alter this within the callback using `res.type()` * or `res.set('Content-Type', ...)`. * * res.format({ * 'text/plain': function(){ * res.send('hey'); * }, * * 'text/html': function(){ * res.send('

hey

'); * }, * * 'appliation/json': function(){ * res.send({ message: 'hey' }); * } * }); * * In addition to canonicalized MIME types you may * also use extnames mapped to these types: * * res.format({ * text: function(){ * res.send('hey'); * }, * * html: function(){ * res.send('

hey

'); * }, * * json: function(){ * res.send({ message: 'hey' }); * } * }); * * By default Express passes an `Error` * with a `.status` of 406 to `next(err)` * if a match is not made. If you provide * a `.default` callback it will be invoked * instead. * * @param {Object} obj * @return {ServerResponse} for chaining * @public */ res.format = function (object) { const { req } = this; const { next } = req; const fn = object.default; if (fn) delete object.default; const keys = Object.keys(object); const key = keys.length > 0 ? req.accepts(keys) : false; this.vary('Accept'); if (key) { this.set('Content-Type', normalizeType(key).value); object[key](req, this, next); } else if (fn) { fn(); } else { const error = new Error('Not Acceptable'); error.status = error.statusCode = 406; error.types = normalizeTypes(keys).map((o) => { return o.value; }); next(error); } return this; }; /** * Set _Content-Disposition_ header to _attachment_ with optional `filename`. * * @param {String} filename * @return {ServerResponse} * @public */ res.attachment = function attachment(filename) { if (filename) { this.type(extname(filename)); } this.set('Content-Disposition', contentDisposition(filename)); return this; }; /** * Append additional header `field` with value `val`. * * Example: * * res.append('Link', ['', '']); * res.append('Set-Cookie', 'foo=bar; Path=/; HttpOnly'); * res.append('Warning', '199 Miscellaneous warning'); * * @param {String} field * @param {String|Array} val * @return {ServerResponse} for chaining * @public */ res.append = function append(field, value_) { const previous = this.get(field); let value = value_; if (previous) { // concat the new and prev vals value = Array.isArray(previous) ? previous.concat(value_) : Array.isArray(value_) ? [previous].concat(value_) : [previous, value_]; } return this.set(field, value); }; /** * Set header `field` to `val`, or pass * an object of header fields. * * Examples: * * res.set('Foo', ['bar', 'baz']); * res.set('Accept', 'application/json'); * res.set({ Accept: 'text/plain', 'X-API-Key': 'tobi' }); * * Aliased as `res.header()`. * * @param {String|Object} field * @param {String|Array} val * @return {ServerResponse} for chaining * @public */ res.set = res.header = function header(field, value_) { if (arguments.length === 2) { let value = Array.isArray(value_) ? value_.map((v) => String(v)) : String(value_); // add charset to content-type if (field.toLowerCase() === 'content-type') { if (Array.isArray(value)) { throw new TypeError('Content-Type cannot be set to an Array'); } if (!charsetRegExp.test(value)) { const charset = mime.charsets.lookup(value.split(';')[0]); if (charset) value += '; charset=' + charset.toLowerCase(); } } this.setHeader(field, value); } else { for (const key in field) { this.set(key, field[key]); } } return this; }; /** * Get value for header `field`. * * @param {String} field * @return {String} * @public */ res.get = function (field) { return this.getHeader(field); }; /** * Clear cookie `name`. * * @param {String} name * @param {Object} [options] * @return {ServerResponse} for chaining * @public */ res.clearCookie = function clearCookie(name, options) { const options_ = merge({ expires: new Date(1), path: '/' }, options); return this.cookie(name, '', options_); }; /** * Set cookie `name` to `value`, with the given `options`. * * Options: * * - `maxAge` max-age in milliseconds, converted to `expires` * - `signed` sign the cookie * - `path` defaults to "/" * * Examples: * * // "Remember Me" for 15 minutes * res.cookie('rememberme', '1', { expires: new Date(Date.now() + 900000), httpOnly: true }); * * // save as above * res.cookie('rememberme', '1', { maxAge: 900000, httpOnly: true }) * * @param {String} name * @param {String|Object} value * @param {Object} [options] * @return {ServerResponse} for chaining * @public */ res.cookie = function (name, value, options) { const options_ = merge({}, options); const { secret } = this.req; const { signed } = options_; if (signed && !secret) { throw new Error('cookieParser("secret") required for signed cookies'); } let value_ = typeof value === 'object' ? 'j:' + JSON.stringify(value) : String(value); if (signed) { value_ = 's:' + sign(value_, secret); } if ('maxAge' in options_) { options_.expires = new Date(Date.now() + options_.maxAge); options_.maxAge /= 1000; } if (options_.path == null) { options_.path = '/'; } this.append('Set-Cookie', cookie.serialize(name, String(value_), options_)); return this; }; /** * Set the location header to `url`. * * The given `url` can also be "back", which redirects * to the _Referrer_ or _Referer_ headers or "/". * * Examples: * * res.location('/foo/bar').; * res.location('http://example.com'); * res.location('../login'); * * @param {String} url * @return {ServerResponse} for chaining * @public */ res.location = function location(url) { let loc = url; // "back" is an alias for the referrer if (url === 'back') { loc = this.req.get('Referrer') || '/'; } // set location return this.set('Location', encodeUrl(loc)); }; /** * Redirect to the given `url` with optional response `status` * defaulting to 302. * * The resulting `url` is determined by `res.location()`, so * it will play nicely with mounted apps, relative paths, * `"back"` etc. * * Examples: * * res.redirect('/foo/bar'); * res.redirect('http://example.com'); * res.redirect(301, 'http://example.com'); * res.redirect('../login'); // /blog/post/1 -> /blog/login * * @public */ res.redirect = function redirect(url) { let address = url; let body; let status = 302; // allow status / url if (arguments.length === 2) { status = arguments[0]; address = arguments[1]; } // Set location header address = this.location(address).get('Location'); // Support text/{plain,html} by default this.format({ text() { body = statuses[status] + '. Redirecting to ' + address; }, html() { const u = escapeHtml(address); body = '

' + statuses[status] + '. Redirecting to ' + u + '

'; }, default() { body = ''; } }); // Respond this.statusCode = status; this.set('Content-Length', Buffer.byteLength(body)); if (this.req.method === 'HEAD') { this.end(); } else { this.end(body); } }; /** * Add `field` to Vary. If already present in the Vary set, then * this call is simply ignored. * * @param {Array|String} field * @return {ServerResponse} for chaining * @public */ res.vary = function (field) { vary(this, field); return this; }; /** * Render `view` with the given `options` and optional callback `fn`. * When a callback function is given a response will _not_ be made * automatically, otherwise a response of _200_ and _text/html_ is given. * * Options: * * - `cache` boolean hinting to the engine it should cache * - `filename` filename of the view being rendered * * @public */ res.render = function render(view, options, callback) { const { app } = this.req; let done = callback; let options_ = options || {}; const { req } = this; const self = this; // support callback function as second arg if (typeof options === 'function') { done = options; options_ = {}; } // merge res.locals options_._locals = self.locals; // default callback to respond done = done || function (error, string_) { if (error) return req.next(error); self.send(string_); }; // render app.render(view, options_, done); }; // pipe the send file stream function sendfile(res, file, options, callback) { let done = false; let streaming; // request aborted function onaborted() { if (done) return; done = true; const error = new Error('Request aborted'); error.code = 'ECONNABORTED'; callback(error); } // directory function ondirectory() { if (done) return; done = true; const error = new Error('EISDIR, read'); error.code = 'EISDIR'; callback(error); } // errors function onerror(error) { if (done) return; done = true; callback(error); } // ended function onend() { if (done) return; done = true; callback(); } // file function onfile() { streaming = false; } // finished function onfinish(error) { if (error && error.code === 'ECONNRESET') return onaborted(); if (error) return onerror(error); if (done) return; setImmediate(() => { if (streaming !== false && !done) { onaborted(); return; } if (done) return; done = true; callback(); }); } // streaming function onstream() { streaming = true; } file.on('directory', ondirectory); file.on('end', onend); file.on('error', onerror); file.on('file', onfile); file.on('stream', onstream); if (options.headers) { // set headers on successful transfer file.on('headers', function headers(res) { const object = options.headers; const keys = Object.keys(object); for (const k of keys) { res.setHeader(k, object[k]); } }); } // pipe file.pipe(res); onFinished(res, onfinish); } return res; } /** * Stringify JSON, like JSON.stringify, but v8 optimized, with the * ability to escape characters that can trigger HTML sniffing. * * @param {*} value * @param {function} replaces * @param {number} spaces * @param {boolean} escape * @returns {string} * @private */ function stringify(value, replacer, spaces, escape) { // v8 checks arguments.length for optimizing simple call // https://bugs.chromium.org/p/v8/issues/detail?id=4730 let json = replacer || spaces ? JSON.stringify(value, replacer, spaces) : JSON.stringify(value); if (escape) { json = json.replace(/[<>&]/g, (c) => { switch (c.charCodeAt(0)) { case 0x3c: return '\\u003c'; case 0x3e: return '\\u003e'; case 0x26: return '\\u0026'; default: return c; } }); } return json; } superagent-7.1.1/test/support/express/utils.js000066400000000000000000000120601417204173300215600ustar00rootroot00000000000000/*! * express * Copyright(c) 2009-2013 TJ Holowaychuk * Copyright(c) 2014-2015 Douglas Christopher Wilson * MIT Licensed */ 'use strict'; /** * Module dependencies. * @api private */ const querystring = require('querystring'); const { Buffer } = require('safe-buffer'); const contentType = require('content-type'); const { mime } = require('send'); const etag = require('etag'); const proxyaddr = require('proxy-addr'); const qs = require('qs'); let isHttp2Supported = true; /** * Test for http2 support * @api private */ try { require('http2'); } catch { isHttp2Supported = false; } /** * Return strong ETag for `body`. * * @param {String|Buffer} body * @param {String} [encoding] * @return {String} * @api private */ exports.etag = createETagGenerator({ weak: false }); /** * Return weak ETag for `body`. * * @param {String|Buffer} body * @param {String} [encoding] * @return {String} * @api private */ exports.wetag = createETagGenerator({ weak: true }); /** * Normalize the given `type`, for example "html" becomes "text/html". * * @param {String} type * @return {Object} * @api private */ exports.normalizeType = function (type) { return ~type.indexOf('/') ? acceptParameters(type) : { value: mime.lookup(type), params: {} }; }; /** * Normalize `types`, for example "html" becomes "text/html". * * @param {Array} types * @return {Array} * @api private */ exports.normalizeTypes = function (types) { const returnValue = []; for (const element of types) { returnValue.push(exports.normalizeType(element)); } return returnValue; }; /** * Parse accept params `str` returning an * object with `.value`, `.quality` and `.params`. * also includes `.originalIndex` for stable sorting * * @param {String} str * @return {Object} * @api private */ function acceptParameters(string_, index) { const parts = string_.split(/ *; */); const returnValue = { value: parts[0], quality: 1, params: {}, originalIndex: index }; for (let i = 1; i < parts.length; ++i) { const pms = parts[i].split(/ *= */); if (pms[0] === 'q') { returnValue.quality = Number.parseFloat(pms[1]); } else { returnValue.params[pms[0]] = pms[1]; } } return returnValue; } /** * Compile "etag" value to function. * * @param {Boolean|String|Function} val * @return {Function} * @api private */ exports.compileETag = function (value) { let fn; if (typeof value === 'function') { return value; } switch (value) { case true: fn = exports.wetag; break; case false: break; case 'strong': fn = exports.etag; break; case 'weak': fn = exports.wetag; break; default: throw new TypeError('unknown value for etag function: ' + value); } return fn; }; /** * Compile "query parser" value to function. * * @param {String|Function} val * @return {Function} * @api private */ exports.compileQueryParser = function compileQueryParser(value) { let fn; if (typeof value === 'function') { return value; } switch (value) { case true: fn = querystring.parse; break; case false: break; case 'extended': fn = parseExtendedQueryString; break; case 'simple': fn = querystring.parse; break; default: throw new TypeError('unknown value for query parser function: ' + value); } return fn; }; /** * Compile "proxy trust" value to function. * * @param {Boolean|String|Number|Array|Function} val * @return {Function} * @api private */ exports.compileTrust = function (value) { if (typeof value === 'function') return value; if (value === true) { // Support plain true/false return function () { return true; }; } if (typeof value === 'number') { // Support trusting hop count return function (a, i) { return i < value; }; } if (typeof value === 'string') { // Support comma-separated values value = value.split(/ *, */); } return proxyaddr.compile(value || []); }; /** * Flag for http2 support */ exports.isHttp2Supported = isHttp2Supported; /** * Set the charset in a given Content-Type string. * * @param {String} type * @param {String} charset * @return {String} * @api private */ exports.setCharset = function setCharset(type, charset) { if (!type || !charset) { return type; } // parse type const parsed = contentType.parse(type); // set charset parsed.parameters.charset = charset; // format type return contentType.format(parsed); }; /** * Create an ETag generator function, generating ETags with * the given options. * * @param {object} options * @return {function} * @private */ function createETagGenerator(options) { return function generateETag(body, encoding) { const buf = !Buffer.isBuffer(body) ? Buffer.from(body, encoding) : body; return etag(buf, options); }; } /** * Parse an extended query string with qs. * * @return {Object} * @private */ function parseExtendedQueryString(string_) { return qs.parse(string_, { allowPrototypes: true }); } superagent-7.1.1/test/support/server.js000066400000000000000000000331171417204173300202430ustar00rootroot00000000000000const fs = require('fs'); let http = require('http'); const multer = require('multer'); const bodyParser = require('body-parser'); const cookieParser = require('cookie-parser'); const basicAuth = require('basic-auth-connect'); const express = require('./express'); let isPseudoHeader; if (process.env.HTTP2_TEST) { http = require('http2'); const { HTTP2_HEADER_AUTHORITY, HTTP2_HEADER_METHOD, HTTP2_HEADER_PATH, HTTP2_HEADER_SCHEME, HTTP2_HEADER_STATUS } = http.constants; isPseudoHeader = function (name) { switch (name) { case HTTP2_HEADER_STATUS: // :status case HTTP2_HEADER_METHOD: // :method case HTTP2_HEADER_PATH: // :path case HTTP2_HEADER_AUTHORITY: // :authority case HTTP2_HEADER_SCHEME: // :scheme return true; default: return false; } }; } const app = express(); app.use((request, res, next) => { res.set('Cache-Control', 'no-cache, no-store'); next(); }); app.all('/url', (request, res) => { res.send(request.url); }); app.all('/echo', (request, res) => { const { headers } = request; if (process.env.HTTP2_TEST) { for (const name of Object.keys(headers)) { if (isPseudoHeader(name)) { delete headers[name]; } } } res.writeHead(200, headers); request.pipe(res); }); let uniq = 0; app.all('/unique', (request, res) => { res.send(`never the same ${uniq++}`); }); app.use(bodyParser.urlencoded({ extended: true })); app.use(multer().none()); app.all('/formecho', (request, res) => { if ( !/application\/x-www-form-urlencoded|multipart\/form-data/.test( request.headers['content-type'] ) ) { return res.status(400).end('wrong type'); } res.json(request.body); }); app.use(bodyParser.json()); app.use(cookieParser()); app.use('/xdomain', (request, res, next) => { if (!request.get('Origin')) return next(); res.set('Access-Control-Allow-Origin', request.get('Origin')); res.set('Access-Control-Allow-Credentials', 'true'); res.set('Access-Control-Allow-Methods', 'POST'); res.set('Access-Control-Allow-Headers', 'X-Requested-With, Content-Type'); if (request.method == 'OPTIONS') return res.send(200); next(); }); app.get('/xdomain', (request, res) => { res.send('tobi'); }); app.get('/login', (request, res) => { res.status(200).send('
'); }); app.get('/json', (request, res) => { res.status(200).json({ name: 'manny' }); }); app.get('/json-hal', (request, res) => { res.set('content-type', 'application/hal+json'); res.send({ name: 'hal 5000' }); }); app.get('/ok', (request, res) => { res.send('ok'); }); app.get('/foo', (request, res) => { res .header('Content-Type', 'application/x-www-form-urlencoded') .send('foo=bar'); }); app.get('/form-data', (request, res) => { res.header('Content-Type', 'application/x-www-form-urlencoded'); res.send('pet[name]=manny'); }); app.post('/movie', (request, res) => { res.redirect('/movies/all/0'); }); app.get('/', (request, res) => { res.set('QUERY', JSON.stringify(request.query)); res.redirect('/movies'); }); app.get('/movies', (request, res) => { res.set('QUERY', JSON.stringify(request.query)); res.redirect('/movies/all'); }); app.get('/movies/all', (request, res) => { res.set('QUERY', JSON.stringify(request.query)); res.redirect('/movies/all/0'); }); app.get('/movies/all/0', (request, res) => { res.set('QUERY', JSON.stringify(request.query)); res.status(200).send('first movie page'); }); app.get('/movies/random', (request, res) => { res.redirect('/movie/4'); }); app.get('/movie/4', (request, res) => { setTimeout(() => { res.send('not-so-random movie'); }, 1000); }); app.get('/links', (request, res) => { res.header( 'Link', '; rel="next"' ); res.end(); }); app.get('/xml', (request, res) => { res.type('xml'); res.status(200).send(''); }); app.get('/custom', (request, res) => { res.type('application/x-custom'); res.status(200).send('custom stuff'); }); app.put('/user/:id', (request, res) => { res.send('updated'); }); app.put('/user/:id/body', (request, res) => { res.send(`received ${request.body.user}`); }); app.patch('/user/:id', (request, res) => { res.send('updated'); }); app.post('/user/:id/pet', (request, res) => { res.send(`added pet "${request.body.pet}"`); }); app.post('/user', (request, res) => { res.send('created'); }); app.delete('/user/:id', (request, res) => { res.send('deleted'); }); app.post('/todo/item', (request, res) => { let buf = ''; request.on('data', (chunk) => { buf += chunk; }); request.on('end', () => { res.send(`added "${buf}"`); }); }); app.get('/delay/const', (request, res) => { res.redirect('/delay/3000'); }); app.get('/delay/zip', (request, res) => { res.writeHead(200, { 'Content-Type': 'text/plain', 'Content-Encoding': 'gzip' }); setTimeout(() => { res.end(); }, 10_000); }); app.get('/delay/json', (request, res) => { res.writeHead(200, { 'Content-Type': 'application/json' }); setTimeout(() => { res.end(); }, 10_000); }); let slowBodyCallback; app.get('/delay/slowbody', (request, res) => { res.writeHead(200, { 'Content-Type': 'application/octet-stream' }); // Send lots of garbage data to overflow all buffers along the way, // so that the browser gets some data before the request is done const initialDataSent = new Promise((resolve) => { res.write(new Buffer.alloc(4000), () => { res.write(new Buffer.alloc(16_000)); resolve(); }); }); // Make sure sending of request body takes over 1s, // so that the test can't pass by accident. const minimumTime = new Promise((resolve) => { setTimeout(resolve, 1001); }); new Promise((resolve) => { // Waiting full 10 seconds for the test would be too annoying, // so the remote callback is a hack to push the test forward slowBodyCallback = resolve; setTimeout(resolve, 10_000); }) .then(() => Promise.all([initialDataSent, minimumTime])) .then(() => { res.end('bye'); }); }); app.get('/delay/slowbody/finish', (request, res) => { if (slowBodyCallback) slowBodyCallback(); res.sendStatus(204); }); app.get('/delay/:ms', (request, res) => { const ms = Math.trunc(request.params.ms); setTimeout(() => { res.sendStatus(200); }, ms); }); app.get('/querystring', (request, res) => { res.send(request.query); }); app.get('/querystring-in-header', (request, res) => { res.set('query', JSON.stringify(request.query)); res.send(); }); app.all('/echo-header/:field', (request, res) => { res.send(request.headers[request.params.field]); }); app.get('/echo-headers', (request, res) => { res.json(request.headers); }); app.post('/pet', (request, res) => { res.send(`added ${request.body.name} the ${request.body.species}`); }); app.get('/pets', (request, res) => { res.send(['tobi', 'loki', 'jane']); }); app.get('/json-seq', (request, res) => { res .set('content-type', 'application/json-seq') .send('\u001E{"id":1}\n\u001E{"id":2}\n'); }); app.get('/invalid-json', (request, res) => { res.set('content-type', 'application/json'); // sample invalid json taken from https://github.com/swagger-api/swagger-ui/issues/1354 res.send( ")]}', {'header':{'code':200,'text':'OK','version':'1.0'},'data':'some data'}" ); }); app.get('/invalid-json-forbidden', (request, res) => { res.set('content-type', 'application/json'); res.status(403).send('Forbidden'); }); app.get('/text', (request, res) => { res.send('just some text'); }); app.get('/basic-auth', basicAuth('tobi', 'learnboost'), (request, res) => { res.end('you win!'); }); app.get('/basic-auth/again', basicAuth('tobi', ''), (request, res) => { res.end('you win again!'); }); app.post('/auth', basicAuth('foo', 'bar'), (request, res) => { const auth = request.headers.authorization; const parts = auth.split(' '); const credentials = Buffer.from(parts[1], 'base64').toString().split(':'); const user = credentials[0]; const pass = credentials[1]; res.send({ user, pass }); }); app.get('/error', (request, res) => { res.status(500).send('boom'); }); app.get('/unauthorized', (request, res) => { res.sendStatus(401); }); app.get('/bad-request', (request, res) => { res.sendStatus(400); }); app.get('/not-acceptable', (request, res) => { res.sendStatus(406); }); app.get('/no-content', (request, res) => { res.sendStatus(204); }); app.delete('/no-content', (request, res) => { res.set('content-type', 'application/json'); res.sendStatus(204); }); app.post('/created', (request, res) => { res.status(201).send('created'); }); app.post('/unprocessable-entity', (request, res) => { res.status(422).send('unprocessable entity'); }); app.get('/arraybuffer', (request, res) => { const content = new ArrayBuffer(1000); res.set('Content-Type', 'application/vnd.superagent'); res.send(content); }); app.get('/arraybuffer-unauthorized', (request, res) => { res.set('Content-Type', 'application/json'); res .status(401) .send('{"message":"Authorization has been denied for this request."}'); }); app.post('/empty-body', bodyParser.text(), (request, res) => { if ( typeof request.body === 'object' && Object.keys(request.body).length === 0 ) { res.sendStatus(204); } else { res.sendStatus(400); } }); app.get('/collection-json', (request, res) => { res.set('content-type', 'application/vnd.collection+json'); res.send({ name: 'chewbacca' }); }); app.get('/invalid-json', (request, res) => { res.set('content-type', 'application/json'); // sample invalid json taken from https://github.com/swagger-api/swagger-ui/issues/1354 res.send( ")]}', {'header':{'code':200,'text':'OK','version':'1.0'},'data':'some data'}" ); }); app.options('/options/echo/body', bodyParser.json(), (request, res) => { res.send(request.body); }); app.get('/cookie-redirect', (request, res) => { res.set('Set-Cookie', 'replaced=yes'); res.append('Set-Cookie', 'from-redir=1', true); res.redirect(303, '/show-cookies'); }); app.get('/set-cookie', (request, res) => { res.cookie('persist', '123'); res.send('ok'); }); app.get('/show-cookies', (request, res) => { res.set('content-type', 'text/plain'); res.send(request.headers.cookie); }); app.put('/redirect-303', (request, res) => { res.redirect(303, '/reply-method'); }); app.put('/redirect-307', (request, res) => { res.redirect(307, '/reply-method'); }); app.put('/redirect-308', (request, res) => { res.redirect(308, '/reply-method'); }); app.all('/reply-method', (request, res) => { res.send(`method=${request.method.toLowerCase()}`); }); app.get('/tobi', (request, res) => { res.send('tobi'); }); app.get('/relative', (request, res) => { res.redirect('tobi'); }); app.get('/relative/sub', (request, res) => { res.redirect('../tobi'); }); app.get('/header', (request, res) => { res.redirect('/header/2'); }); app.post('/header', (request, res) => { res.redirect('/header/2'); }); app.get('/header/2', (request, res) => { res.send(request.headers); }); app.get('/bad-redirect', (request, res) => { res.status(307).end(); }); app.all('/ua', (request, res) => { const { headers } = request; if (process.env.HTTP2_TEST) { for (const name of Object.keys(headers)) { if (isPseudoHeader(name)) { delete headers[name]; } } } res.writeHead(200, headers); request.pipe(res); }); app.get('/manny', (request, res) => { res.status(200).json({ name: 'manny' }); }); function serveImageWithType(res, type) { const img = fs.readFileSync(`${__dirname}/../node/fixtures/test.png`); res.writeHead(200, { 'Content-Type': type }); res.end(img, 'binary'); } app.get('/image', (request, res) => { serveImageWithType(res, 'image/png'); }); app.get('/image-as-octets', (request, res) => { serveImageWithType(res, 'application/octet-stream'); }); app.get('/chunked-json', (request, res) => { res.set('content-type', 'application/json'); res.set('Transfer-Encoding', 'chunked'); let chunk = 0; const interval = setInterval(() => { chunk++; if (chunk === 1) res.write(`{ "name_${chunk}": "`); if (chunk > 1) res.write(`value_${chunk}", "name_${chunk}": "`); if (chunk === 10) { clearInterval(interval); res.write(`value_${chunk}"}`); res.end(); } }, 10); }); app.get('/if-mod', (request, res) => { if (request.header('if-modified-since')) { res.status(304).end(); } else { res.send(`${Date.now()}`); } }); const called = {}; app.get('/error/ok/:id', (request, res) => { if (request.query.qs != 'present') { return res.status(400).end('query string lost'); } const { id } = request.params; if (!called[id]) { called[id] = true; res.status(500).send('boom'); } else { res.send(request.headers); delete called[id]; } }); app.get('/delay/:ms/ok/:id', (request, res) => { const { id } = request.params; if (!called[id]) { called[id] = true; const ms = Math.trunc(request.params.ms); setTimeout(() => { res.sendStatus(200); }, ms); } else { res.send(`ok = ${request.url}`); delete called[id]; } }); app.get('/error/redirect/:id', (request, res) => { const { id } = request.params; if (!called[id]) { called[id] = true; res.status(500).send('boom'); } else { res.redirect('/movies'); delete called[id]; } }); app.get('/error/redirect-error:id', (request, res) => { const { id } = request.params; if (!called[id]) { called[id] = true; res.status(500).send('boom'); } else { res.redirect('/error'); delete called[id]; } }); const server = http.createServer(app); server.listen(process.env.ZUUL_PORT); superagent-7.1.1/test/support/setup.js000066400000000000000000000012621417204173300200710ustar00rootroot00000000000000require('should'); require('should-http'); const getPort = require('get-port'); let NODE; let uri; async function getSetup() { if (NODE && uri) { return { NODE, uri }; } NODE = true; if (typeof window !== 'undefined') { NODE = false; uri = `//${window.location.host}`; } else { try { const port = await getPort(); // check that another call to the function hasn't set the uri already if (!uri) { process.env.ZUUL_PORT = port; uri = `http://localhost:${process.env.ZUUL_PORT}`; require('./server'); } } catch (err) { console.error(err); } } return { NODE, uri }; } module.exports = getSetup; superagent-7.1.1/test/timeout.js000066400000000000000000000075771417204173300167220ustar00rootroot00000000000000const assert = require('assert'); const getSetup = require('./support/setup'); const request = require('./support/client'); describe('.timeout(ms)', function () { let setup; let base; before(async () => { setup = await getSetup(); base = setup.uri; }); this.timeout(15_000); describe('when timeout is exceeded', () => { it('should error', (done) => { request .get(`${base}/delay/500`) .timeout(150) .end((error, res) => { assert(error, 'expected an error'); assert.equal( 'number', typeof error.timeout, 'expected an error with .timeout' ); assert.equal('ECONNABORTED', error.code, 'expected abort error code'); done(); }); }); it('should error in promise interface ', (done) => { request .get(`${base}/delay/500`) .timeout(150) .catch((err) => { assert(err, 'expected an error'); assert.equal( 'number', typeof err.timeout, 'expected an error with .timeout' ); assert.equal('ECONNABORTED', err.code, 'expected abort error code'); done(); }); }); it('should handle gzip timeout', (done) => { request .get(`${base}/delay/zip`) .timeout(150) .end((error, res) => { assert(error, 'expected an error'); assert.equal( 'number', typeof error.timeout, 'expected an error with .timeout' ); assert.equal('ECONNABORTED', error.code, 'expected abort error code'); done(); }); }); it('should handle buffer timeout', (done) => { request .get(`${base}/delay/json`) .buffer(true) .timeout(150) .end((error, res) => { assert(error, 'expected an error'); assert.equal( 'number', typeof error.timeout, 'expected an error with .timeout' ); assert.equal('ECONNABORTED', error.code, 'expected abort error code'); done(); }); }); it('should error on deadline', (done) => { request .get(`${base}/delay/500`) .timeout({ deadline: 150 }) .end((error, res) => { assert(error, 'expected an error'); assert.equal( 'number', typeof error.timeout, 'expected an error with .timeout' ); assert.equal('ECONNABORTED', error.code, 'expected abort error code'); done(); }); }); it('should support setting individual options', (done) => { request .get(`${base}/delay/500`) .timeout({ deadline: 10 }) .timeout({ response: 99_999 }) .end((error, res) => { assert(error, 'expected an error'); assert.equal('ECONNABORTED', error.code, 'expected abort error code'); assert.equal('ETIME', error.errno); done(); }); }); it('should error on response', (done) => { request .get(`${base}/delay/500`) .timeout({ response: 150 }) .end((error, res) => { assert(error, 'expected an error'); assert.equal( 'number', typeof error.timeout, 'expected an error with .timeout' ); assert.equal('ECONNABORTED', error.code, 'expected abort error code'); assert.equal('ETIMEDOUT', error.errno); done(); }); }); it('should accept slow body with fast response', (done) => { request .get(`${base}/delay/slowbody`) .timeout({ response: 1000 }) .on('progress', () => { // This only makes the test faster without relying on arbitrary timeouts request.get(`${base}/delay/slowbody/finish`).end(); }) .end(done); }); }); }); superagent-7.1.1/test/use.js000066400000000000000000000043511417204173300160130ustar00rootroot00000000000000const assert = require('assert'); const getSetup = require('./support/setup'); const request = require('./support/client'); describe('request', function () { let setup; let uri; before(async function () { setup = await getSetup(); uri = setup.uri; }); this.timeout(20_000); describe('use', () => { it('should use plugin success', (done) => { const now = `${Date.now()}`; function uuid(request_) { request_.set('X-UUID', now); return request_; } function prefix(request_) { request_.url = uri + request_.url; return request_; } request .get('/echo') .use(uuid) .use(prefix) .end((error, res) => { assert.strictEqual(res.statusCode, 200); assert.equal(res.get('X-UUID'), now); done(); }); }); }); }); describe('subclass', () => { let OriginalRequest; beforeEach(() => { OriginalRequest = request.Request; }); afterEach(() => { request.Request = OriginalRequest; }); it('should be an instance of Request', () => { const request_ = request.get('/'); assert(request_ instanceof request.Request); }); it('should use patched subclass', () => { assert(OriginalRequest); let constructorCalled; let sendCalled; function NewRequest(...args) { constructorCalled = true; OriginalRequest.apply(this, args); } NewRequest.prototype = Object.create(OriginalRequest.prototype); NewRequest.prototype.send = function () { sendCalled = true; return this; }; request.Request = NewRequest; const request_ = request.get('/').send(); assert(constructorCalled); assert(sendCalled); assert(request_ instanceof NewRequest); assert(request_ instanceof OriginalRequest); }); it('should use patched subclass in agent too', () => { if (!request.agent) return; // Node-only function NewRequest(...args) { OriginalRequest.apply(this, args); } NewRequest.prototype = Object.create(OriginalRequest.prototype); request.Request = NewRequest; const request_ = request.agent().del('/'); assert(request_ instanceof NewRequest); assert(request_ instanceof OriginalRequest); }); }); superagent-7.1.1/yarn.lock000066400000000000000000017656531417204173300155510ustar00rootroot00000000000000# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. # yarn lockfile v1 "@babel/cli@^7.16.0": version "7.16.7" resolved "https://registry.yarnpkg.com/@babel/cli/-/cli-7.16.7.tgz#4184b5ec6a22106e9dd64bbcaa2eb22675ff595d" integrity sha512-0iBF+G2Qml0y3mY5dirolyToLSR88a/KB6F2Gm8J/lOnyL8wbEOHak0DHF8gjc9XZGgTDGv/jYXNiapvsYyHTA== dependencies: commander "^4.0.1" convert-source-map "^1.1.0" fs-readdir-recursive "^1.1.0" glob "^7.0.0" make-dir "^2.1.0" slash "^2.0.0" source-map "^0.5.0" optionalDependencies: "@nicolo-ribaudo/chokidar-2" "2.1.8-no-fsevents.3" chokidar "^3.4.0" "@babel/code-frame@^7.0.0", "@babel/code-frame@^7.16.0", "@babel/code-frame@^7.16.7": version "7.16.7" resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.16.7.tgz#44416b6bd7624b998f5b1af5d470856c40138789" integrity sha512-iAXqUn8IIeBTNd72xsFlgaXHkMBMt6y4HJp1tIaK465CWLT/fG1aqB7ykr95gHHmlBdGbFeWWfyB4NJJ0nmeIg== dependencies: "@babel/highlight" "^7.16.7" "@babel/compat-data@^7.13.11", "@babel/compat-data@^7.16.4": version "7.16.4" resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.16.4.tgz#081d6bbc336ec5c2435c6346b2ae1fb98b5ac68e" integrity sha512-1o/jo7D+kC9ZjHX5v+EHrdjl3PhxMrLSOTGsOdHJ+KL8HCaEK6ehrVL2RS6oHDZp+L7xLirLrPmQtEng769J/Q== "@babel/core@^7.12.16", "@babel/core@^7.16.0", "@babel/core@^7.7.5": version "7.16.7" resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.16.7.tgz#db990f931f6d40cb9b87a0dc7d2adc749f1dcbcf" integrity sha512-aeLaqcqThRNZYmbMqtulsetOQZ/5gbR/dWruUCJcpas4Qoyy+QeagfDsPdMrqwsPRDNxJvBlRiZxxX7THO7qtA== dependencies: "@babel/code-frame" "^7.16.7" "@babel/generator" "^7.16.7" "@babel/helper-compilation-targets" "^7.16.7" "@babel/helper-module-transforms" "^7.16.7" "@babel/helpers" "^7.16.7" "@babel/parser" "^7.16.7" "@babel/template" "^7.16.7" "@babel/traverse" "^7.16.7" "@babel/types" "^7.16.7" convert-source-map "^1.7.0" debug "^4.1.0" gensync "^1.0.0-beta.2" json5 "^2.1.2" semver "^6.3.0" source-map "^0.5.0" "@babel/eslint-parser@^7.12.16": version "7.16.5" resolved "https://registry.yarnpkg.com/@babel/eslint-parser/-/eslint-parser-7.16.5.tgz#48d3485091d6e36915358e4c0d0b2ebe6da90462" integrity sha512-mUqYa46lgWqHKQ33Q6LNCGp/wPR3eqOYTUixHFsfrSQqRxH0+WOzca75iEjFr5RDGH1dDz622LaHhLOzOuQRUA== dependencies: eslint-scope "^5.1.1" eslint-visitor-keys "^2.1.0" semver "^6.3.0" "@babel/generator@^7.16.7": version "7.16.7" resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.16.7.tgz#b42bf46a3079fa65e1544135f32e7958f048adbb" integrity sha512-/ST3Sg8MLGY5HVYmrjOgL60ENux/HfO/CsUh7y4MalThufhE/Ff/6EibFDHi4jiDCaWfJKoqbE6oTh21c5hrRg== dependencies: "@babel/types" "^7.16.7" jsesc "^2.5.1" source-map "^0.5.0" "@babel/helper-annotate-as-pure@^7.16.7": version "7.16.7" resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.16.7.tgz#bb2339a7534a9c128e3102024c60760a3a7f3862" integrity sha512-s6t2w/IPQVTAET1HitoowRGXooX8mCgtuP5195wD/QJPV6wYjpujCGF7JuMODVX2ZAJOf1GT6DT9MHEZvLOFSw== dependencies: "@babel/types" "^7.16.7" "@babel/helper-builder-binary-assignment-operator-visitor@^7.16.7": version "7.16.7" resolved "https://registry.yarnpkg.com/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.16.7.tgz#38d138561ea207f0f69eb1626a418e4f7e6a580b" integrity sha512-C6FdbRaxYjwVu/geKW4ZeQ0Q31AftgRcdSnZ5/jsH6BzCJbtvXvhpfkbkThYSuutZA7nCXpPR6AD9zd1dprMkA== dependencies: "@babel/helper-explode-assignable-expression" "^7.16.7" "@babel/types" "^7.16.7" "@babel/helper-compilation-targets@^7.13.0", "@babel/helper-compilation-targets@^7.16.7": version "7.16.7" resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.16.7.tgz#06e66c5f299601e6c7da350049315e83209d551b" integrity sha512-mGojBwIWcwGD6rfqgRXVlVYmPAv7eOpIemUG3dGnDdCY4Pae70ROij3XmfrH6Fa1h1aiDylpglbZyktfzyo/hA== dependencies: "@babel/compat-data" "^7.16.4" "@babel/helper-validator-option" "^7.16.7" browserslist "^4.17.5" semver "^6.3.0" "@babel/helper-create-class-features-plugin@^7.16.7": version "7.16.7" resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.16.7.tgz#9c5b34b53a01f2097daf10678d65135c1b9f84ba" integrity sha512-kIFozAvVfK05DM4EVQYKK+zteWvY85BFdGBRQBytRyY3y+6PX0DkDOn/CZ3lEuczCfrCxEzwt0YtP/87YPTWSw== dependencies: "@babel/helper-annotate-as-pure" "^7.16.7" "@babel/helper-environment-visitor" "^7.16.7" "@babel/helper-function-name" "^7.16.7" "@babel/helper-member-expression-to-functions" "^7.16.7" "@babel/helper-optimise-call-expression" "^7.16.7" "@babel/helper-replace-supers" "^7.16.7" "@babel/helper-split-export-declaration" "^7.16.7" "@babel/helper-create-regexp-features-plugin@^7.16.7": version "7.16.7" resolved "https://registry.yarnpkg.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.16.7.tgz#0cb82b9bac358eb73bfbd73985a776bfa6b14d48" integrity sha512-fk5A6ymfp+O5+p2yCkXAu5Kyj6v0xh0RBeNcAkYUMDvvAAoxvSKXn+Jb37t/yWFiQVDFK1ELpUTD8/aLhCPu+g== dependencies: "@babel/helper-annotate-as-pure" "^7.16.7" regexpu-core "^4.7.1" "@babel/helper-define-polyfill-provider@^0.3.0": version "0.3.0" resolved "https://registry.yarnpkg.com/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.3.0.tgz#c5b10cf4b324ff840140bb07e05b8564af2ae971" integrity sha512-7hfT8lUljl/tM3h+izTX/pO3W3frz2ok6Pk+gzys8iJqDfZrZy2pXjRTZAvG2YmfHun1X4q8/UZRLatMfqc5Tg== dependencies: "@babel/helper-compilation-targets" "^7.13.0" "@babel/helper-module-imports" "^7.12.13" "@babel/helper-plugin-utils" "^7.13.0" "@babel/traverse" "^7.13.0" debug "^4.1.1" lodash.debounce "^4.0.8" resolve "^1.14.2" semver "^6.1.2" "@babel/helper-environment-visitor@^7.16.7": version "7.16.7" resolved "https://registry.yarnpkg.com/@babel/helper-environment-visitor/-/helper-environment-visitor-7.16.7.tgz#ff484094a839bde9d89cd63cba017d7aae80ecd7" integrity sha512-SLLb0AAn6PkUeAfKJCCOl9e1R53pQlGAfc4y4XuMRZfqeMYLE0dM1LMhqbGAlGQY0lfw5/ohoYWAe9V1yibRag== dependencies: "@babel/types" "^7.16.7" "@babel/helper-explode-assignable-expression@^7.16.7": version "7.16.7" resolved "https://registry.yarnpkg.com/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.16.7.tgz#12a6d8522fdd834f194e868af6354e8650242b7a" integrity sha512-KyUenhWMC8VrxzkGP0Jizjo4/Zx+1nNZhgocs+gLzyZyB8SHidhoq9KK/8Ato4anhwsivfkBLftky7gvzbZMtQ== dependencies: "@babel/types" "^7.16.7" "@babel/helper-function-name@^7.16.7": version "7.16.7" resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.16.7.tgz#f1ec51551fb1c8956bc8dd95f38523b6cf375f8f" integrity sha512-QfDfEnIUyyBSR3HtrtGECuZ6DAyCkYFp7GHl75vFtTnn6pjKeK0T1DB5lLkFvBea8MdaiUABx3osbgLyInoejA== dependencies: "@babel/helper-get-function-arity" "^7.16.7" "@babel/template" "^7.16.7" "@babel/types" "^7.16.7" "@babel/helper-get-function-arity@^7.16.7": version "7.16.7" resolved "https://registry.yarnpkg.com/@babel/helper-get-function-arity/-/helper-get-function-arity-7.16.7.tgz#ea08ac753117a669f1508ba06ebcc49156387419" integrity sha512-flc+RLSOBXzNzVhcLu6ujeHUrD6tANAOU5ojrRx/as+tbzf8+stUCj7+IfRRoAbEZqj/ahXEMsjhOhgeZsrnTw== dependencies: "@babel/types" "^7.16.7" "@babel/helper-hoist-variables@^7.16.7": version "7.16.7" resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.16.7.tgz#86bcb19a77a509c7b77d0e22323ef588fa58c246" integrity sha512-m04d/0Op34H5v7pbZw6pSKP7weA6lsMvfiIAMeIvkY/R4xQtBSMFEigu9QTZ2qB/9l22vsxtM8a+Q8CzD255fg== dependencies: "@babel/types" "^7.16.7" "@babel/helper-member-expression-to-functions@^7.16.7": version "7.16.7" resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.16.7.tgz#42b9ca4b2b200123c3b7e726b0ae5153924905b0" integrity sha512-VtJ/65tYiU/6AbMTDwyoXGPKHgTsfRarivm+YbB5uAzKUyuPjgZSgAFeG87FCigc7KNHu2Pegh1XIT3lXjvz3Q== dependencies: "@babel/types" "^7.16.7" "@babel/helper-module-imports@^7.12.13", "@babel/helper-module-imports@^7.16.7": version "7.16.7" resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.16.7.tgz#25612a8091a999704461c8a222d0efec5d091437" integrity sha512-LVtS6TqjJHFc+nYeITRo6VLXve70xmq7wPhWTqDJusJEgGmkAACWwMiTNrvfoQo6hEhFwAIixNkvB0jPXDL8Wg== dependencies: "@babel/types" "^7.16.7" "@babel/helper-module-transforms@^7.16.7": version "7.16.7" resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.16.7.tgz#7665faeb721a01ca5327ddc6bba15a5cb34b6a41" integrity sha512-gaqtLDxJEFCeQbYp9aLAefjhkKdjKcdh6DB7jniIGU3Pz52WAmP268zK0VgPz9hUNkMSYeH976K2/Y6yPadpng== dependencies: "@babel/helper-environment-visitor" "^7.16.7" "@babel/helper-module-imports" "^7.16.7" "@babel/helper-simple-access" "^7.16.7" "@babel/helper-split-export-declaration" "^7.16.7" "@babel/helper-validator-identifier" "^7.16.7" "@babel/template" "^7.16.7" "@babel/traverse" "^7.16.7" "@babel/types" "^7.16.7" "@babel/helper-optimise-call-expression@^7.16.7": version "7.16.7" resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.16.7.tgz#a34e3560605abbd31a18546bd2aad3e6d9a174f2" integrity sha512-EtgBhg7rd/JcnpZFXpBy0ze1YRfdm7BnBX4uKMBd3ixa3RGAE002JZB66FJyNH7g0F38U05pXmA5P8cBh7z+1w== dependencies: "@babel/types" "^7.16.7" "@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.12.13", "@babel/helper-plugin-utils@^7.13.0", "@babel/helper-plugin-utils@^7.14.5", "@babel/helper-plugin-utils@^7.16.7", "@babel/helper-plugin-utils@^7.8.0", "@babel/helper-plugin-utils@^7.8.3": version "7.16.7" resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.16.7.tgz#aa3a8ab4c3cceff8e65eb9e73d87dc4ff320b2f5" integrity sha512-Qg3Nk7ZxpgMrsox6HreY1ZNKdBq7K72tDSliA6dCl5f007jR4ne8iD5UzuNnCJH2xBf2BEEVGr+/OL6Gdp7RxA== "@babel/helper-remap-async-to-generator@^7.16.7": version "7.16.7" resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.16.7.tgz#5ce2416990d55eb6e099128338848ae8ffa58a9a" integrity sha512-C3o117GnP/j/N2OWo+oepeWbFEKRfNaay+F1Eo5Mj3A1SRjyx+qaFhm23nlipub7Cjv2azdUUiDH+VlpdwUFRg== dependencies: "@babel/helper-annotate-as-pure" "^7.16.7" "@babel/helper-wrap-function" "^7.16.7" "@babel/types" "^7.16.7" "@babel/helper-replace-supers@^7.16.7": version "7.16.7" resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.16.7.tgz#e9f5f5f32ac90429c1a4bdec0f231ef0c2838ab1" integrity sha512-y9vsWilTNaVnVh6xiJfABzsNpgDPKev9HnAgz6Gb1p6UUwf9NepdlsV7VXGCftJM+jqD5f7JIEubcpLjZj5dBw== dependencies: "@babel/helper-environment-visitor" "^7.16.7" "@babel/helper-member-expression-to-functions" "^7.16.7" "@babel/helper-optimise-call-expression" "^7.16.7" "@babel/traverse" "^7.16.7" "@babel/types" "^7.16.7" "@babel/helper-simple-access@^7.16.7": version "7.16.7" resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.16.7.tgz#d656654b9ea08dbb9659b69d61063ccd343ff0f7" integrity sha512-ZIzHVyoeLMvXMN/vok/a4LWRy8G2v205mNP0XOuf9XRLyX5/u9CnVulUtDgUTama3lT+bf/UqucuZjqiGuTS1g== dependencies: "@babel/types" "^7.16.7" "@babel/helper-skip-transparent-expression-wrappers@^7.16.0": version "7.16.0" resolved "https://registry.yarnpkg.com/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.16.0.tgz#0ee3388070147c3ae051e487eca3ebb0e2e8bb09" integrity sha512-+il1gTy0oHwUsBQZyJvukbB4vPMdcYBrFHa0Uc4AizLxbq6BOYC51Rv4tWocX9BLBDLZ4kc6qUFpQ6HRgL+3zw== dependencies: "@babel/types" "^7.16.0" "@babel/helper-split-export-declaration@^7.16.7": version "7.16.7" resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.16.7.tgz#0b648c0c42da9d3920d85ad585f2778620b8726b" integrity sha512-xbWoy/PFoxSWazIToT9Sif+jJTlrMcndIsaOKvTA6u7QEo7ilkRZpjew18/W3c7nm8fXdUDXh02VXTbZ0pGDNw== dependencies: "@babel/types" "^7.16.7" "@babel/helper-validator-identifier@^7.14.9", "@babel/helper-validator-identifier@^7.16.7": version "7.16.7" resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.16.7.tgz#e8c602438c4a8195751243da9031d1607d247cad" integrity sha512-hsEnFemeiW4D08A5gUAZxLBTXpZ39P+a+DGDsHw1yxqyQ/jzFEnxf5uTEGp+3bzAbNOxU1paTgYS4ECU/IgfDw== "@babel/helper-validator-option@^7.16.7": version "7.16.7" resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.16.7.tgz#b203ce62ce5fe153899b617c08957de860de4d23" integrity sha512-TRtenOuRUVo9oIQGPC5G9DgK4743cdxvtOw0weQNpZXaS16SCBi5MNjZF8vba3ETURjZpTbVn7Vvcf2eAwFozQ== "@babel/helper-wrap-function@^7.16.7": version "7.16.7" resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.16.7.tgz#8ddf9eaa770ed43de4bc3687f3f3b0d6d5ecf014" integrity sha512-7a9sABeVwcunnztZZ7WTgSw6jVYLzM1wua0Z4HIXm9S3/HC96WKQTkFgGEaj5W06SHHihPJ6Le6HzS5cGOQMNw== dependencies: "@babel/helper-function-name" "^7.16.7" "@babel/template" "^7.16.7" "@babel/traverse" "^7.16.7" "@babel/types" "^7.16.7" "@babel/helpers@^7.16.7": version "7.16.7" resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.16.7.tgz#7e3504d708d50344112767c3542fc5e357fffefc" integrity sha512-9ZDoqtfY7AuEOt3cxchfii6C7GDyyMBffktR5B2jvWv8u2+efwvpnVKXMWzNehqy68tKgAfSwfdw/lWpthS2bw== dependencies: "@babel/template" "^7.16.7" "@babel/traverse" "^7.16.7" "@babel/types" "^7.16.7" "@babel/highlight@^7.16.7": version "7.16.7" resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.16.7.tgz#81a01d7d675046f0d96f82450d9d9578bdfd6b0b" integrity sha512-aKpPMfLvGO3Q97V0qhw/V2SWNWlwfJknuwAunU7wZLSfrM4xTBvg7E5opUVi1kJTBKihE38CPg4nBiqX83PWYw== dependencies: "@babel/helper-validator-identifier" "^7.16.7" chalk "^2.0.0" js-tokens "^4.0.0" "@babel/parser@^7.16.7": version "7.16.7" resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.16.7.tgz#d372dda9c89fcec340a82630a9f533f2fe15877e" integrity sha512-sR4eaSrnM7BV7QPzGfEX5paG/6wrZM3I0HDzfIAK06ESvo9oy3xBuVBxE3MbQaKNhvg8g/ixjMWo2CGpzpHsDA== "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@^7.16.7": version "7.16.7" resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.16.7.tgz#4eda6d6c2a0aa79c70fa7b6da67763dfe2141050" integrity sha512-anv/DObl7waiGEnC24O9zqL0pSuI9hljihqiDuFHC8d7/bjr/4RLGPWuc8rYOff/QPzbEPSkzG8wGG9aDuhHRg== dependencies: "@babel/helper-plugin-utils" "^7.16.7" "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@^7.16.7": version "7.16.7" resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.16.7.tgz#cc001234dfc139ac45f6bcf801866198c8c72ff9" integrity sha512-di8vUHRdf+4aJ7ltXhaDbPoszdkh59AQtJM5soLsuHpQJdFQZOA4uGj0V2u/CZ8bJ/u8ULDL5yq6FO/bCXnKHw== dependencies: "@babel/helper-plugin-utils" "^7.16.7" "@babel/helper-skip-transparent-expression-wrappers" "^7.16.0" "@babel/plugin-proposal-optional-chaining" "^7.16.7" "@babel/plugin-proposal-async-generator-functions@^7.16.7": version "7.16.7" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.16.7.tgz#739adc1212a9e4892de440cd7dfffb06172df78d" integrity sha512-TTXBT3A5c11eqRzaC6beO6rlFT3Mo9C2e8eB44tTr52ESXSK2CIc2fOp1ynpAwQA8HhBMho+WXhMHWlAe3xkpw== dependencies: "@babel/helper-plugin-utils" "^7.16.7" "@babel/helper-remap-async-to-generator" "^7.16.7" "@babel/plugin-syntax-async-generators" "^7.8.4" "@babel/plugin-proposal-class-properties@^7.16.7": version "7.16.7" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.16.7.tgz#925cad7b3b1a2fcea7e59ecc8eb5954f961f91b0" integrity sha512-IobU0Xme31ewjYOShSIqd/ZGM/r/cuOz2z0MDbNrhF5FW+ZVgi0f2lyeoj9KFPDOAqsYxmLWZte1WOwlvY9aww== dependencies: "@babel/helper-create-class-features-plugin" "^7.16.7" "@babel/helper-plugin-utils" "^7.16.7" "@babel/plugin-proposal-class-static-block@^7.16.7": version "7.16.7" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-static-block/-/plugin-proposal-class-static-block-7.16.7.tgz#712357570b612106ef5426d13dc433ce0f200c2a" integrity sha512-dgqJJrcZoG/4CkMopzhPJjGxsIe9A8RlkQLnL/Vhhx8AA9ZuaRwGSlscSh42hazc7WSrya/IK7mTeoF0DP9tEw== dependencies: "@babel/helper-create-class-features-plugin" "^7.16.7" "@babel/helper-plugin-utils" "^7.16.7" "@babel/plugin-syntax-class-static-block" "^7.14.5" "@babel/plugin-proposal-dynamic-import@^7.16.7": version "7.16.7" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.16.7.tgz#c19c897eaa46b27634a00fee9fb7d829158704b2" integrity sha512-I8SW9Ho3/8DRSdmDdH3gORdyUuYnk1m4cMxUAdu5oy4n3OfN8flDEH+d60iG7dUfi0KkYwSvoalHzzdRzpWHTg== dependencies: "@babel/helper-plugin-utils" "^7.16.7" "@babel/plugin-syntax-dynamic-import" "^7.8.3" "@babel/plugin-proposal-export-namespace-from@^7.16.7": version "7.16.7" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.16.7.tgz#09de09df18445a5786a305681423ae63507a6163" integrity sha512-ZxdtqDXLRGBL64ocZcs7ovt71L3jhC1RGSyR996svrCi3PYqHNkb3SwPJCs8RIzD86s+WPpt2S73+EHCGO+NUA== dependencies: "@babel/helper-plugin-utils" "^7.16.7" "@babel/plugin-syntax-export-namespace-from" "^7.8.3" "@babel/plugin-proposal-json-strings@^7.16.7": version "7.16.7" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.16.7.tgz#9732cb1d17d9a2626a08c5be25186c195b6fa6e8" integrity sha512-lNZ3EEggsGY78JavgbHsK9u5P3pQaW7k4axlgFLYkMd7UBsiNahCITShLjNQschPyjtO6dADrL24757IdhBrsQ== dependencies: "@babel/helper-plugin-utils" "^7.16.7" "@babel/plugin-syntax-json-strings" "^7.8.3" "@babel/plugin-proposal-logical-assignment-operators@^7.16.7": version "7.16.7" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.16.7.tgz#be23c0ba74deec1922e639832904be0bea73cdea" integrity sha512-K3XzyZJGQCr00+EtYtrDjmwX7o7PLK6U9bi1nCwkQioRFVUv6dJoxbQjtWVtP+bCPy82bONBKG8NPyQ4+i6yjg== dependencies: "@babel/helper-plugin-utils" "^7.16.7" "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4" "@babel/plugin-proposal-nullish-coalescing-operator@^7.16.7": version "7.16.7" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.16.7.tgz#141fc20b6857e59459d430c850a0011e36561d99" integrity sha512-aUOrYU3EVtjf62jQrCj63pYZ7k6vns2h/DQvHPWGmsJRYzWXZ6/AsfgpiRy6XiuIDADhJzP2Q9MwSMKauBQ+UQ== dependencies: "@babel/helper-plugin-utils" "^7.16.7" "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3" "@babel/plugin-proposal-numeric-separator@^7.16.7": version "7.16.7" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.16.7.tgz#d6b69f4af63fb38b6ca2558442a7fb191236eba9" integrity sha512-vQgPMknOIgiuVqbokToyXbkY/OmmjAzr/0lhSIbG/KmnzXPGwW/AdhdKpi+O4X/VkWiWjnkKOBiqJrTaC98VKw== dependencies: "@babel/helper-plugin-utils" "^7.16.7" "@babel/plugin-syntax-numeric-separator" "^7.10.4" "@babel/plugin-proposal-object-rest-spread@^7.16.7": version "7.16.7" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.16.7.tgz#94593ef1ddf37021a25bdcb5754c4a8d534b01d8" integrity sha512-3O0Y4+dw94HA86qSg9IHfyPktgR7q3gpNVAeiKQd+8jBKFaU5NQS1Yatgo4wY+UFNuLjvxcSmzcsHqrhgTyBUA== dependencies: "@babel/compat-data" "^7.16.4" "@babel/helper-compilation-targets" "^7.16.7" "@babel/helper-plugin-utils" "^7.16.7" "@babel/plugin-syntax-object-rest-spread" "^7.8.3" "@babel/plugin-transform-parameters" "^7.16.7" "@babel/plugin-proposal-optional-catch-binding@^7.16.7": version "7.16.7" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.16.7.tgz#c623a430674ffc4ab732fd0a0ae7722b67cb74cf" integrity sha512-eMOH/L4OvWSZAE1VkHbr1vckLG1WUcHGJSLqqQwl2GaUqG6QjddvrOaTUMNYiv77H5IKPMZ9U9P7EaHwvAShfA== dependencies: "@babel/helper-plugin-utils" "^7.16.7" "@babel/plugin-syntax-optional-catch-binding" "^7.8.3" "@babel/plugin-proposal-optional-chaining@^7.16.7": version "7.16.7" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.16.7.tgz#7cd629564724816c0e8a969535551f943c64c39a" integrity sha512-eC3xy+ZrUcBtP7x+sq62Q/HYd674pPTb/77XZMb5wbDPGWIdUbSr4Agr052+zaUPSb+gGRnjxXfKFvx5iMJ+DA== dependencies: "@babel/helper-plugin-utils" "^7.16.7" "@babel/helper-skip-transparent-expression-wrappers" "^7.16.0" "@babel/plugin-syntax-optional-chaining" "^7.8.3" "@babel/plugin-proposal-private-methods@^7.16.7": version "7.16.7" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.16.7.tgz#e418e3aa6f86edd6d327ce84eff188e479f571e0" integrity sha512-7twV3pzhrRxSwHeIvFE6coPgvo+exNDOiGUMg39o2LiLo1Y+4aKpfkcLGcg1UHonzorCt7SNXnoMyCnnIOA8Sw== dependencies: "@babel/helper-create-class-features-plugin" "^7.16.7" "@babel/helper-plugin-utils" "^7.16.7" "@babel/plugin-proposal-private-property-in-object@^7.16.7": version "7.16.7" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.16.7.tgz#b0b8cef543c2c3d57e59e2c611994861d46a3fce" integrity sha512-rMQkjcOFbm+ufe3bTZLyOfsOUOxyvLXZJCTARhJr+8UMSoZmqTe1K1BgkFcrW37rAchWg57yI69ORxiWvUINuQ== dependencies: "@babel/helper-annotate-as-pure" "^7.16.7" "@babel/helper-create-class-features-plugin" "^7.16.7" "@babel/helper-plugin-utils" "^7.16.7" "@babel/plugin-syntax-private-property-in-object" "^7.14.5" "@babel/plugin-proposal-unicode-property-regex@^7.16.7", "@babel/plugin-proposal-unicode-property-regex@^7.4.4": version "7.16.7" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.16.7.tgz#635d18eb10c6214210ffc5ff4932552de08188a2" integrity sha512-QRK0YI/40VLhNVGIjRNAAQkEHws0cswSdFFjpFyt943YmJIU1da9uW63Iu6NFV6CxTZW5eTDCrwZUstBWgp/Rg== dependencies: "@babel/helper-create-regexp-features-plugin" "^7.16.7" "@babel/helper-plugin-utils" "^7.16.7" "@babel/plugin-syntax-async-generators@^7.8.4": version "7.8.4" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz#a983fb1aeb2ec3f6ed042a210f640e90e786fe0d" integrity sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw== dependencies: "@babel/helper-plugin-utils" "^7.8.0" "@babel/plugin-syntax-class-properties@^7.12.13": version "7.12.13" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz#b5c987274c4a3a82b89714796931a6b53544ae10" integrity sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA== dependencies: "@babel/helper-plugin-utils" "^7.12.13" "@babel/plugin-syntax-class-static-block@^7.14.5": version "7.14.5" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz#195df89b146b4b78b3bf897fd7a257c84659d406" integrity sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw== dependencies: "@babel/helper-plugin-utils" "^7.14.5" "@babel/plugin-syntax-dynamic-import@^7.8.3": version "7.8.3" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz#62bf98b2da3cd21d626154fc96ee5b3cb68eacb3" integrity sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ== dependencies: "@babel/helper-plugin-utils" "^7.8.0" "@babel/plugin-syntax-export-namespace-from@^7.8.3": version "7.8.3" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz#028964a9ba80dbc094c915c487ad7c4e7a66465a" integrity sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q== dependencies: "@babel/helper-plugin-utils" "^7.8.3" "@babel/plugin-syntax-json-strings@^7.8.3": version "7.8.3" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz#01ca21b668cd8218c9e640cb6dd88c5412b2c96a" integrity sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA== dependencies: "@babel/helper-plugin-utils" "^7.8.0" "@babel/plugin-syntax-logical-assignment-operators@^7.10.4": version "7.10.4" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz#ca91ef46303530448b906652bac2e9fe9941f699" integrity sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig== dependencies: "@babel/helper-plugin-utils" "^7.10.4" "@babel/plugin-syntax-nullish-coalescing-operator@^7.8.3": version "7.8.3" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz#167ed70368886081f74b5c36c65a88c03b66d1a9" integrity sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ== dependencies: "@babel/helper-plugin-utils" "^7.8.0" "@babel/plugin-syntax-numeric-separator@^7.10.4": version "7.10.4" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz#b9b070b3e33570cd9fd07ba7fa91c0dd37b9af97" integrity sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug== dependencies: "@babel/helper-plugin-utils" "^7.10.4" "@babel/plugin-syntax-object-rest-spread@^7.8.3": version "7.8.3" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz#60e225edcbd98a640332a2e72dd3e66f1af55871" integrity sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA== dependencies: "@babel/helper-plugin-utils" "^7.8.0" "@babel/plugin-syntax-optional-catch-binding@^7.8.3": version "7.8.3" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz#6111a265bcfb020eb9efd0fdfd7d26402b9ed6c1" integrity sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q== dependencies: "@babel/helper-plugin-utils" "^7.8.0" "@babel/plugin-syntax-optional-chaining@^7.8.3": version "7.8.3" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz#4f69c2ab95167e0180cd5336613f8c5788f7d48a" integrity sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg== dependencies: "@babel/helper-plugin-utils" "^7.8.0" "@babel/plugin-syntax-private-property-in-object@^7.14.5": version "7.14.5" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz#0dc6671ec0ea22b6e94a1114f857970cd39de1ad" integrity sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg== dependencies: "@babel/helper-plugin-utils" "^7.14.5" "@babel/plugin-syntax-top-level-await@^7.14.5": version "7.14.5" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz#c1cfdadc35a646240001f06138247b741c34d94c" integrity sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw== dependencies: "@babel/helper-plugin-utils" "^7.14.5" "@babel/plugin-transform-arrow-functions@^7.16.7": version "7.16.7" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.16.7.tgz#44125e653d94b98db76369de9c396dc14bef4154" integrity sha512-9ffkFFMbvzTvv+7dTp/66xvZAWASuPD5Tl9LK3Z9vhOmANo6j94rik+5YMBt4CwHVMWLWpMsriIc2zsa3WW3xQ== dependencies: "@babel/helper-plugin-utils" "^7.16.7" "@babel/plugin-transform-async-to-generator@^7.16.7": version "7.16.7" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.16.7.tgz#646e1262ac341b587ff5449844d4492dbb10ac4b" integrity sha512-pFEfjnK4DfXCfAlA5I98BYdDJD8NltMzx19gt6DAmfE+2lXRfPUoa0/5SUjT4+TDE1W/rcxU/1lgN55vpAjjdg== dependencies: "@babel/helper-module-imports" "^7.16.7" "@babel/helper-plugin-utils" "^7.16.7" "@babel/helper-remap-async-to-generator" "^7.16.7" "@babel/plugin-transform-block-scoped-functions@^7.16.7": version "7.16.7" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.16.7.tgz#4d0d57d9632ef6062cdf354bb717102ee042a620" integrity sha512-JUuzlzmF40Z9cXyytcbZEZKckgrQzChbQJw/5PuEHYeqzCsvebDx0K0jWnIIVcmmDOAVctCgnYs0pMcrYj2zJg== dependencies: "@babel/helper-plugin-utils" "^7.16.7" "@babel/plugin-transform-block-scoping@^7.16.7": version "7.16.7" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.16.7.tgz#f50664ab99ddeaee5bc681b8f3a6ea9d72ab4f87" integrity sha512-ObZev2nxVAYA4bhyusELdo9hb3H+A56bxH3FZMbEImZFiEDYVHXQSJ1hQKFlDnlt8G9bBrCZ5ZpURZUrV4G5qQ== dependencies: "@babel/helper-plugin-utils" "^7.16.7" "@babel/plugin-transform-classes@^7.16.7": version "7.16.7" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.16.7.tgz#8f4b9562850cd973de3b498f1218796eb181ce00" integrity sha512-WY7og38SFAGYRe64BrjKf8OrE6ulEHtr5jEYaZMwox9KebgqPi67Zqz8K53EKk1fFEJgm96r32rkKZ3qA2nCWQ== dependencies: "@babel/helper-annotate-as-pure" "^7.16.7" "@babel/helper-environment-visitor" "^7.16.7" "@babel/helper-function-name" "^7.16.7" "@babel/helper-optimise-call-expression" "^7.16.7" "@babel/helper-plugin-utils" "^7.16.7" "@babel/helper-replace-supers" "^7.16.7" "@babel/helper-split-export-declaration" "^7.16.7" globals "^11.1.0" "@babel/plugin-transform-computed-properties@^7.16.7": version "7.16.7" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.16.7.tgz#66dee12e46f61d2aae7a73710f591eb3df616470" integrity sha512-gN72G9bcmenVILj//sv1zLNaPyYcOzUho2lIJBMh/iakJ9ygCo/hEF9cpGb61SCMEDxbbyBoVQxrt+bWKu5KGw== dependencies: "@babel/helper-plugin-utils" "^7.16.7" "@babel/plugin-transform-destructuring@^7.16.7": version "7.16.7" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.16.7.tgz#ca9588ae2d63978a4c29d3f33282d8603f618e23" integrity sha512-VqAwhTHBnu5xBVDCvrvqJbtLUa++qZaWC0Fgr2mqokBlulZARGyIvZDoqbPlPaKImQ9dKAcCzbv+ul//uqu70A== dependencies: "@babel/helper-plugin-utils" "^7.16.7" "@babel/plugin-transform-dotall-regex@^7.16.7", "@babel/plugin-transform-dotall-regex@^7.4.4": version "7.16.7" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.16.7.tgz#6b2d67686fab15fb6a7fd4bd895d5982cfc81241" integrity sha512-Lyttaao2SjZF6Pf4vk1dVKv8YypMpomAbygW+mU5cYP3S5cWTfCJjG8xV6CFdzGFlfWK81IjL9viiTvpb6G7gQ== dependencies: "@babel/helper-create-regexp-features-plugin" "^7.16.7" "@babel/helper-plugin-utils" "^7.16.7" "@babel/plugin-transform-duplicate-keys@^7.16.7": version "7.16.7" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.16.7.tgz#2207e9ca8f82a0d36a5a67b6536e7ef8b08823c9" integrity sha512-03DvpbRfvWIXyK0/6QiR1KMTWeT6OcQ7tbhjrXyFS02kjuX/mu5Bvnh5SDSWHxyawit2g5aWhKwI86EE7GUnTw== dependencies: "@babel/helper-plugin-utils" "^7.16.7" "@babel/plugin-transform-exponentiation-operator@^7.16.7": version "7.16.7" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.16.7.tgz#efa9862ef97e9e9e5f653f6ddc7b665e8536fe9b" integrity sha512-8UYLSlyLgRixQvlYH3J2ekXFHDFLQutdy7FfFAMm3CPZ6q9wHCwnUyiXpQCe3gVVnQlHc5nsuiEVziteRNTXEA== dependencies: "@babel/helper-builder-binary-assignment-operator-visitor" "^7.16.7" "@babel/helper-plugin-utils" "^7.16.7" "@babel/plugin-transform-for-of@^7.16.7": version "7.16.7" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.16.7.tgz#649d639d4617dff502a9a158c479b3b556728d8c" integrity sha512-/QZm9W92Ptpw7sjI9Nx1mbcsWz33+l8kuMIQnDwgQBG5s3fAfQvkRjQ7NqXhtNcKOnPkdICmUHyCaWW06HCsqg== dependencies: "@babel/helper-plugin-utils" "^7.16.7" "@babel/plugin-transform-function-name@^7.16.7": version "7.16.7" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.16.7.tgz#5ab34375c64d61d083d7d2f05c38d90b97ec65cf" integrity sha512-SU/C68YVwTRxqWj5kgsbKINakGag0KTgq9f2iZEXdStoAbOzLHEBRYzImmA6yFo8YZhJVflvXmIHUO7GWHmxxA== dependencies: "@babel/helper-compilation-targets" "^7.16.7" "@babel/helper-function-name" "^7.16.7" "@babel/helper-plugin-utils" "^7.16.7" "@babel/plugin-transform-literals@^7.16.7": version "7.16.7" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-literals/-/plugin-transform-literals-7.16.7.tgz#254c9618c5ff749e87cb0c0cef1a0a050c0bdab1" integrity sha512-6tH8RTpTWI0s2sV6uq3e/C9wPo4PTqqZps4uF0kzQ9/xPLFQtipynvmT1g/dOfEJ+0EQsHhkQ/zyRId8J2b8zQ== dependencies: "@babel/helper-plugin-utils" "^7.16.7" "@babel/plugin-transform-member-expression-literals@^7.16.7": version "7.16.7" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.16.7.tgz#6e5dcf906ef8a098e630149d14c867dd28f92384" integrity sha512-mBruRMbktKQwbxaJof32LT9KLy2f3gH+27a5XSuXo6h7R3vqltl0PgZ80C8ZMKw98Bf8bqt6BEVi3svOh2PzMw== dependencies: "@babel/helper-plugin-utils" "^7.16.7" "@babel/plugin-transform-modules-amd@^7.16.7": version "7.16.7" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.16.7.tgz#b28d323016a7daaae8609781d1f8c9da42b13186" integrity sha512-KaaEtgBL7FKYwjJ/teH63oAmE3lP34N3kshz8mm4VMAw7U3PxjVwwUmxEFksbgsNUaO3wId9R2AVQYSEGRa2+g== dependencies: "@babel/helper-module-transforms" "^7.16.7" "@babel/helper-plugin-utils" "^7.16.7" babel-plugin-dynamic-import-node "^2.3.3" "@babel/plugin-transform-modules-commonjs@^7.16.7": version "7.16.7" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.16.7.tgz#fd119e6a433c527d368425b45df361e1e95d3c1a" integrity sha512-h2RP2kE7He1ZWKyAlanMZrAbdv+Acw1pA8dQZhE025WJZE2z0xzFADAinXA9fxd5bn7JnM+SdOGcndGx1ARs9w== dependencies: "@babel/helper-module-transforms" "^7.16.7" "@babel/helper-plugin-utils" "^7.16.7" "@babel/helper-simple-access" "^7.16.7" babel-plugin-dynamic-import-node "^2.3.3" "@babel/plugin-transform-modules-systemjs@^7.16.7": version "7.16.7" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.16.7.tgz#887cefaef88e684d29558c2b13ee0563e287c2d7" integrity sha512-DuK5E3k+QQmnOqBR9UkusByy5WZWGRxfzV529s9nPra1GE7olmxfqO2FHobEOYSPIjPBTr4p66YDcjQnt8cBmw== dependencies: "@babel/helper-hoist-variables" "^7.16.7" "@babel/helper-module-transforms" "^7.16.7" "@babel/helper-plugin-utils" "^7.16.7" "@babel/helper-validator-identifier" "^7.16.7" babel-plugin-dynamic-import-node "^2.3.3" "@babel/plugin-transform-modules-umd@^7.16.7": version "7.16.7" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.16.7.tgz#23dad479fa585283dbd22215bff12719171e7618" integrity sha512-EMh7uolsC8O4xhudF2F6wedbSHm1HHZ0C6aJ7K67zcDNidMzVcxWdGr+htW9n21klm+bOn+Rx4CBsAntZd3rEQ== dependencies: "@babel/helper-module-transforms" "^7.16.7" "@babel/helper-plugin-utils" "^7.16.7" "@babel/plugin-transform-named-capturing-groups-regex@^7.16.7": version "7.16.7" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.16.7.tgz#749d90d94e73cf62c60a0cc8d6b94d29305a81f2" integrity sha512-kFy35VwmwIQwCjwrAQhl3+c/kr292i4KdLPKp5lPH03Ltc51qnFlIADoyPxc/6Naz3ok3WdYKg+KK6AH+D4utg== dependencies: "@babel/helper-create-regexp-features-plugin" "^7.16.7" "@babel/plugin-transform-new-target@^7.16.7": version "7.16.7" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.16.7.tgz#9967d89a5c243818e0800fdad89db22c5f514244" integrity sha512-xiLDzWNMfKoGOpc6t3U+etCE2yRnn3SM09BXqWPIZOBpL2gvVrBWUKnsJx0K/ADi5F5YC5f8APFfWrz25TdlGg== dependencies: "@babel/helper-plugin-utils" "^7.16.7" "@babel/plugin-transform-object-super@^7.16.7": version "7.16.7" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.16.7.tgz#ac359cf8d32cf4354d27a46867999490b6c32a94" integrity sha512-14J1feiQVWaGvRxj2WjyMuXS2jsBkgB3MdSN5HuC2G5nRspa5RK9COcs82Pwy5BuGcjb+fYaUj94mYcOj7rCvw== dependencies: "@babel/helper-plugin-utils" "^7.16.7" "@babel/helper-replace-supers" "^7.16.7" "@babel/plugin-transform-parameters@^7.16.7": version "7.16.7" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.16.7.tgz#a1721f55b99b736511cb7e0152f61f17688f331f" integrity sha512-AT3MufQ7zZEhU2hwOA11axBnExW0Lszu4RL/tAlUJBuNoRak+wehQW8h6KcXOcgjY42fHtDxswuMhMjFEuv/aw== dependencies: "@babel/helper-plugin-utils" "^7.16.7" "@babel/plugin-transform-property-literals@^7.16.7": version "7.16.7" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.16.7.tgz#2dadac85155436f22c696c4827730e0fe1057a55" integrity sha512-z4FGr9NMGdoIl1RqavCqGG+ZuYjfZ/hkCIeuH6Do7tXmSm0ls11nYVSJqFEUOSJbDab5wC6lRE/w6YjVcr6Hqw== dependencies: "@babel/helper-plugin-utils" "^7.16.7" "@babel/plugin-transform-regenerator@^7.16.7": version "7.16.7" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.16.7.tgz#9e7576dc476cb89ccc5096fff7af659243b4adeb" integrity sha512-mF7jOgGYCkSJagJ6XCujSQg+6xC1M77/03K2oBmVJWoFGNUtnVJO4WHKJk3dnPC8HCcj4xBQP1Egm8DWh3Pb3Q== dependencies: regenerator-transform "^0.14.2" "@babel/plugin-transform-reserved-words@^7.16.7": version "7.16.7" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.16.7.tgz#1d798e078f7c5958eec952059c460b220a63f586" integrity sha512-KQzzDnZ9hWQBjwi5lpY5v9shmm6IVG0U9pB18zvMu2i4H90xpT4gmqwPYsn8rObiadYe2M0gmgsiOIF5A/2rtg== dependencies: "@babel/helper-plugin-utils" "^7.16.7" "@babel/plugin-transform-runtime@^7.16.4": version "7.16.7" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.16.7.tgz#1da184cb83a2287a01956c10c60e66dd503c18aa" integrity sha512-2FoHiSAWkdq4L06uaDN3rS43i6x28desUVxq+zAFuE6kbWYQeiLPJI5IC7Sg9xKYVcrBKSQkVUfH6aeQYbl9QA== dependencies: "@babel/helper-module-imports" "^7.16.7" "@babel/helper-plugin-utils" "^7.16.7" babel-plugin-polyfill-corejs2 "^0.3.0" babel-plugin-polyfill-corejs3 "^0.4.0" babel-plugin-polyfill-regenerator "^0.3.0" semver "^6.3.0" "@babel/plugin-transform-shorthand-properties@^7.16.7": version "7.16.7" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.16.7.tgz#e8549ae4afcf8382f711794c0c7b6b934c5fbd2a" integrity sha512-hah2+FEnoRoATdIb05IOXf+4GzXYTq75TVhIn1PewihbpyrNWUt2JbudKQOETWw6QpLe+AIUpJ5MVLYTQbeeUg== dependencies: "@babel/helper-plugin-utils" "^7.16.7" "@babel/plugin-transform-spread@^7.16.7": version "7.16.7" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.16.7.tgz#a303e2122f9f12e0105daeedd0f30fb197d8ff44" integrity sha512-+pjJpgAngb53L0iaA5gU/1MLXJIfXcYepLgXB3esVRf4fqmj8f2cxM3/FKaHsZms08hFQJkFccEWuIpm429TXg== dependencies: "@babel/helper-plugin-utils" "^7.16.7" "@babel/helper-skip-transparent-expression-wrappers" "^7.16.0" "@babel/plugin-transform-sticky-regex@^7.16.7": version "7.16.7" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.16.7.tgz#c84741d4f4a38072b9a1e2e3fd56d359552e8660" integrity sha512-NJa0Bd/87QV5NZZzTuZG5BPJjLYadeSZ9fO6oOUoL4iQx+9EEuw/eEM92SrsT19Yc2jgB1u1hsjqDtH02c3Drw== dependencies: "@babel/helper-plugin-utils" "^7.16.7" "@babel/plugin-transform-template-literals@^7.16.7": version "7.16.7" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.16.7.tgz#f3d1c45d28967c8e80f53666fc9c3e50618217ab" integrity sha512-VwbkDDUeenlIjmfNeDX/V0aWrQH2QiVyJtwymVQSzItFDTpxfyJh3EVaQiS0rIN/CqbLGr0VcGmuwyTdZtdIsA== dependencies: "@babel/helper-plugin-utils" "^7.16.7" "@babel/plugin-transform-typeof-symbol@^7.16.7": version "7.16.7" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.16.7.tgz#9cdbe622582c21368bd482b660ba87d5545d4f7e" integrity sha512-p2rOixCKRJzpg9JB4gjnG4gjWkWa89ZoYUnl9snJ1cWIcTH/hvxZqfO+WjG6T8DRBpctEol5jw1O5rA8gkCokQ== dependencies: "@babel/helper-plugin-utils" "^7.16.7" "@babel/plugin-transform-unicode-escapes@^7.16.7": version "7.16.7" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.16.7.tgz#da8717de7b3287a2c6d659750c964f302b31ece3" integrity sha512-TAV5IGahIz3yZ9/Hfv35TV2xEm+kaBDaZQCn2S/hG9/CZ0DktxJv9eKfPc7yYCvOYR4JGx1h8C+jcSOvgaaI/Q== dependencies: "@babel/helper-plugin-utils" "^7.16.7" "@babel/plugin-transform-unicode-regex@^7.16.7": version "7.16.7" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.16.7.tgz#0f7aa4a501198976e25e82702574c34cfebe9ef2" integrity sha512-oC5tYYKw56HO75KZVLQ+R/Nl3Hro9kf8iG0hXoaHP7tjAyCpvqBiSNe6vGrZni1Z6MggmUOC6A7VP7AVmw225Q== dependencies: "@babel/helper-create-regexp-features-plugin" "^7.16.7" "@babel/helper-plugin-utils" "^7.16.7" "@babel/preset-env@^7.16.4": version "7.16.7" resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.16.7.tgz#c491088856d0b3177822a2bf06cb74d76327aa56" integrity sha512-urX3Cee4aOZbRWOSa3mKPk0aqDikfILuo+C7qq7HY0InylGNZ1fekq9jmlr3pLWwZHF4yD7heQooc2Pow2KMyQ== dependencies: "@babel/compat-data" "^7.16.4" "@babel/helper-compilation-targets" "^7.16.7" "@babel/helper-plugin-utils" "^7.16.7" "@babel/helper-validator-option" "^7.16.7" "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression" "^7.16.7" "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining" "^7.16.7" "@babel/plugin-proposal-async-generator-functions" "^7.16.7" "@babel/plugin-proposal-class-properties" "^7.16.7" "@babel/plugin-proposal-class-static-block" "^7.16.7" "@babel/plugin-proposal-dynamic-import" "^7.16.7" "@babel/plugin-proposal-export-namespace-from" "^7.16.7" "@babel/plugin-proposal-json-strings" "^7.16.7" "@babel/plugin-proposal-logical-assignment-operators" "^7.16.7" "@babel/plugin-proposal-nullish-coalescing-operator" "^7.16.7" "@babel/plugin-proposal-numeric-separator" "^7.16.7" "@babel/plugin-proposal-object-rest-spread" "^7.16.7" "@babel/plugin-proposal-optional-catch-binding" "^7.16.7" "@babel/plugin-proposal-optional-chaining" "^7.16.7" "@babel/plugin-proposal-private-methods" "^7.16.7" "@babel/plugin-proposal-private-property-in-object" "^7.16.7" "@babel/plugin-proposal-unicode-property-regex" "^7.16.7" "@babel/plugin-syntax-async-generators" "^7.8.4" "@babel/plugin-syntax-class-properties" "^7.12.13" "@babel/plugin-syntax-class-static-block" "^7.14.5" "@babel/plugin-syntax-dynamic-import" "^7.8.3" "@babel/plugin-syntax-export-namespace-from" "^7.8.3" "@babel/plugin-syntax-json-strings" "^7.8.3" "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4" "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3" "@babel/plugin-syntax-numeric-separator" "^7.10.4" "@babel/plugin-syntax-object-rest-spread" "^7.8.3" "@babel/plugin-syntax-optional-catch-binding" "^7.8.3" "@babel/plugin-syntax-optional-chaining" "^7.8.3" "@babel/plugin-syntax-private-property-in-object" "^7.14.5" "@babel/plugin-syntax-top-level-await" "^7.14.5" "@babel/plugin-transform-arrow-functions" "^7.16.7" "@babel/plugin-transform-async-to-generator" "^7.16.7" "@babel/plugin-transform-block-scoped-functions" "^7.16.7" "@babel/plugin-transform-block-scoping" "^7.16.7" "@babel/plugin-transform-classes" "^7.16.7" "@babel/plugin-transform-computed-properties" "^7.16.7" "@babel/plugin-transform-destructuring" "^7.16.7" "@babel/plugin-transform-dotall-regex" "^7.16.7" "@babel/plugin-transform-duplicate-keys" "^7.16.7" "@babel/plugin-transform-exponentiation-operator" "^7.16.7" "@babel/plugin-transform-for-of" "^7.16.7" "@babel/plugin-transform-function-name" "^7.16.7" "@babel/plugin-transform-literals" "^7.16.7" "@babel/plugin-transform-member-expression-literals" "^7.16.7" "@babel/plugin-transform-modules-amd" "^7.16.7" "@babel/plugin-transform-modules-commonjs" "^7.16.7" "@babel/plugin-transform-modules-systemjs" "^7.16.7" "@babel/plugin-transform-modules-umd" "^7.16.7" "@babel/plugin-transform-named-capturing-groups-regex" "^7.16.7" "@babel/plugin-transform-new-target" "^7.16.7" "@babel/plugin-transform-object-super" "^7.16.7" "@babel/plugin-transform-parameters" "^7.16.7" "@babel/plugin-transform-property-literals" "^7.16.7" "@babel/plugin-transform-regenerator" "^7.16.7" "@babel/plugin-transform-reserved-words" "^7.16.7" "@babel/plugin-transform-shorthand-properties" "^7.16.7" "@babel/plugin-transform-spread" "^7.16.7" "@babel/plugin-transform-sticky-regex" "^7.16.7" "@babel/plugin-transform-template-literals" "^7.16.7" "@babel/plugin-transform-typeof-symbol" "^7.16.7" "@babel/plugin-transform-unicode-escapes" "^7.16.7" "@babel/plugin-transform-unicode-regex" "^7.16.7" "@babel/preset-modules" "^0.1.5" "@babel/types" "^7.16.7" babel-plugin-polyfill-corejs2 "^0.3.0" babel-plugin-polyfill-corejs3 "^0.4.0" babel-plugin-polyfill-regenerator "^0.3.0" core-js-compat "^3.19.1" semver "^6.3.0" "@babel/preset-modules@^0.1.5": version "0.1.5" resolved "https://registry.yarnpkg.com/@babel/preset-modules/-/preset-modules-0.1.5.tgz#ef939d6e7f268827e1841638dc6ff95515e115d9" integrity sha512-A57th6YRG7oR3cq/yt/Y84MvGgE0eJG2F1JLhKuyG+jFxEgrd/HAMJatiFtmOiZurz+0DkrvbheCLaV5f2JfjA== dependencies: "@babel/helper-plugin-utils" "^7.0.0" "@babel/plugin-proposal-unicode-property-regex" "^7.4.4" "@babel/plugin-transform-dotall-regex" "^7.4.4" "@babel/types" "^7.4.4" esutils "^2.0.2" "@babel/runtime@^7.8.4": version "7.16.7" resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.16.7.tgz#03ff99f64106588c9c403c6ecb8c3bafbbdff1fa" integrity sha512-9E9FJowqAsytyOY6LG+1KuueckRL+aQW+mKvXRXnuFGyRAyepJPmEo9vgMfXUA6O9u3IeEdv9MAkppFcaQwogQ== dependencies: regenerator-runtime "^0.13.4" "@babel/template@^7.16.7": version "7.16.7" resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.16.7.tgz#8d126c8701fde4d66b264b3eba3d96f07666d155" integrity sha512-I8j/x8kHUrbYRTUxXrrMbfCa7jxkE7tZre39x3kjr9hvI82cK1FfqLygotcWN5kdPGWcLdWMHpSBavse5tWw3w== dependencies: "@babel/code-frame" "^7.16.7" "@babel/parser" "^7.16.7" "@babel/types" "^7.16.7" "@babel/traverse@^7.13.0", "@babel/traverse@^7.16.7": version "7.16.7" resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.16.7.tgz#dac01236a72c2560073658dd1a285fe4e0865d76" integrity sha512-8KWJPIb8c2VvY8AJrydh6+fVRo2ODx1wYBU2398xJVq0JomuLBZmVQzLPBblJgHIGYG4znCpUZUZ0Pt2vdmVYQ== dependencies: "@babel/code-frame" "^7.16.7" "@babel/generator" "^7.16.7" "@babel/helper-environment-visitor" "^7.16.7" "@babel/helper-function-name" "^7.16.7" "@babel/helper-hoist-variables" "^7.16.7" "@babel/helper-split-export-declaration" "^7.16.7" "@babel/parser" "^7.16.7" "@babel/types" "^7.16.7" debug "^4.1.0" globals "^11.1.0" "@babel/types@^7.16.0", "@babel/types@^7.16.7", "@babel/types@^7.4.4": version "7.16.7" resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.16.7.tgz#4ed19d51f840ed4bd5645be6ce40775fecf03159" integrity sha512-E8HuV7FO9qLpx6OtoGfUQ2cjIYnbFwvZWYBS+87EwtdMvmUPJSwykpovFB+8insbpF0uJcpr8KMUi64XZntZcg== dependencies: "@babel/helper-validator-identifier" "^7.16.7" to-fast-properties "^2.0.0" "@commitlint/cli@^15.0.0": version "15.0.0" resolved "https://registry.yarnpkg.com/@commitlint/cli/-/cli-15.0.0.tgz#8e78e86ee2b6955c1a5d140e734a6c171ce367ee" integrity sha512-Y5xmDCweytqzo4N4lOI2YRiuX35xTjcs8n5hUceBH8eyK0YbwtgWX50BJOH2XbkwEmII9blNhlBog6AdQsqicg== dependencies: "@commitlint/format" "^15.0.0" "@commitlint/lint" "^15.0.0" "@commitlint/load" "^15.0.0" "@commitlint/read" "^15.0.0" "@commitlint/types" "^15.0.0" lodash "^4.17.19" resolve-from "5.0.0" resolve-global "1.0.0" yargs "^17.0.0" "@commitlint/config-conventional@^15.0.0": version "15.0.0" resolved "https://registry.yarnpkg.com/@commitlint/config-conventional/-/config-conventional-15.0.0.tgz#3bf1adf319e3b431de12ba82dc399524038b2d8f" integrity sha512-eZBRL8Lk3hMNHp1wUMYj0qrZQEsST1ai7KHR8J1IDD9aHgT7L2giciibuQ+Og7vxVhR5WtYDvh9xirXFVPaSkQ== dependencies: conventional-changelog-conventionalcommits "^4.3.1" "@commitlint/ensure@^15.0.0": version "15.0.0" resolved "https://registry.yarnpkg.com/@commitlint/ensure/-/ensure-15.0.0.tgz#06a63738e2393970a085b428e6cf80fa1fe76f48" integrity sha512-7DV4iNIald3vycwaWBNGk5FbonaNzOlU8nBe5m5AgU2dIeNKuXwLm+zzJzG27j0Ho56rgz//3F6RIvmsoxY9ZA== dependencies: "@commitlint/types" "^15.0.0" lodash "^4.17.19" "@commitlint/execute-rule@^15.0.0": version "15.0.0" resolved "https://registry.yarnpkg.com/@commitlint/execute-rule/-/execute-rule-15.0.0.tgz#6bff7962df38e89ff9fdbc00abd79b8849c7e9f9" integrity sha512-pyE4ApxjbWhb1TXz5vRiGwI2ssdMMgZbaaheZq1/7WC0xRnqnIhE1yUC1D2q20qPtvkZPstTYvMiRVtF+DvjUg== "@commitlint/format@^15.0.0": version "15.0.0" resolved "https://registry.yarnpkg.com/@commitlint/format/-/format-15.0.0.tgz#10935180913de9384bea4c9217f4c6c5ee100ab3" integrity sha512-bPhAfqwRhPk92WiuY0ktEJNpRRHSCd+Eg1MdhGyL9Bl3U25E5zvuInA+dNctnzZiOBSH/37ZaD0eOKCpQE6acg== dependencies: "@commitlint/types" "^15.0.0" chalk "^4.0.0" "@commitlint/is-ignored@^15.0.0": version "15.0.0" resolved "https://registry.yarnpkg.com/@commitlint/is-ignored/-/is-ignored-15.0.0.tgz#382bf9f6f8d810f2ffc59ccc527f4389eadd7949" integrity sha512-edtnkf2QZ/7e/YCJDgn1WDw9wfF1WfOitW5YEoSOb4SxjJEb/oE87kxNPZ2j8mnDMuunspcMfGHeg6fRlwaEWg== dependencies: "@commitlint/types" "^15.0.0" semver "7.3.5" "@commitlint/lint@^15.0.0": version "15.0.0" resolved "https://registry.yarnpkg.com/@commitlint/lint/-/lint-15.0.0.tgz#a93b8896fb25b05ab2ed0246d365f4908654588d" integrity sha512-hUi2+Im/2dJ5FBvWnodypTkg+5haCgsDzB0fyMApWLUA1IucYUAqRCQCW5em1Mhk9Crw1pd5YzFNikhIclkqCw== dependencies: "@commitlint/is-ignored" "^15.0.0" "@commitlint/parse" "^15.0.0" "@commitlint/rules" "^15.0.0" "@commitlint/types" "^15.0.0" "@commitlint/load@^15.0.0": version "15.0.0" resolved "https://registry.yarnpkg.com/@commitlint/load/-/load-15.0.0.tgz#5bd391c1387aafe92b54cf2a86b76a5228fcf4ef" integrity sha512-Ak1YPeOhvxmY3ioe0o6m1yLGvUAYb4BdfGgShU8jiTCmU3Mnmms0Xh/kfQz8AybhezCC3AmVTyBLaBZxOHR8kg== dependencies: "@commitlint/execute-rule" "^15.0.0" "@commitlint/resolve-extends" "^15.0.0" "@commitlint/types" "^15.0.0" "@endemolshinegroup/cosmiconfig-typescript-loader" "^3.0.2" chalk "^4.0.0" cosmiconfig "^7.0.0" lodash "^4.17.19" resolve-from "^5.0.0" typescript "^4.4.3" "@commitlint/message@^15.0.0": version "15.0.0" resolved "https://registry.yarnpkg.com/@commitlint/message/-/message-15.0.0.tgz#98a38aca1b3cd996a0fcdbd9ad67e9039df60b0a" integrity sha512-L8euabzboKavPuDJsdIYAY2wx97LbiGEYsckMo6NmV8pOun50c8hQx6ouXFSAx4pp+mX9yUGmMiVqfrk2LKDJQ== "@commitlint/parse@^15.0.0": version "15.0.0" resolved "https://registry.yarnpkg.com/@commitlint/parse/-/parse-15.0.0.tgz#cac77b7514748b8d01d00c0e67d5e54c695c302c" integrity sha512-7fweM67tZfBNS7zw1KTuuT5K2u9nGytUJqFqT/1Ln3Na9cBCsoAqR47mfsNOTlRCgGwakm4xiQ7BpS2gN0OGuw== dependencies: "@commitlint/types" "^15.0.0" conventional-changelog-angular "^5.0.11" conventional-commits-parser "^3.2.2" "@commitlint/read@^15.0.0": version "15.0.0" resolved "https://registry.yarnpkg.com/@commitlint/read/-/read-15.0.0.tgz#da839f3b4d49b05586a9cd2666cc8c4a36b9ec91" integrity sha512-5yI1o2HKZFVe7RTjL7IhuhHMKar/MDNY34vEHqqz9gMI7BK/rdP8uVb4Di1efl2V0UPnwID0nPKWESjQ8Ti0gw== dependencies: "@commitlint/top-level" "^15.0.0" "@commitlint/types" "^15.0.0" fs-extra "^10.0.0" git-raw-commits "^2.0.0" "@commitlint/resolve-extends@^15.0.0": version "15.0.0" resolved "https://registry.yarnpkg.com/@commitlint/resolve-extends/-/resolve-extends-15.0.0.tgz#baf21227e2ac52cef546ec35dd6732e9b0b6e57c" integrity sha512-7apfRJjgJsKja7lHsPfEFixKjA/fk/UeD3owkOw1174yYu4u8xBDLSeU3IinGPdMuF9m245eX8wo7vLUy+EBSg== dependencies: import-fresh "^3.0.0" lodash "^4.17.19" resolve-from "^5.0.0" resolve-global "^1.0.0" "@commitlint/rules@^15.0.0": version "15.0.0" resolved "https://registry.yarnpkg.com/@commitlint/rules/-/rules-15.0.0.tgz#326370abc004492fcb5543198d1d55b14e25e3c8" integrity sha512-SqXfp6QUlwBS+0IZm4FEA/NmmAwcFQIkG3B05BtemOVWXQdZ8j1vV6hDwvA9oMPCmUSrrGpHOtZK7HaHhng2yA== dependencies: "@commitlint/ensure" "^15.0.0" "@commitlint/message" "^15.0.0" "@commitlint/to-lines" "^15.0.0" "@commitlint/types" "^15.0.0" execa "^5.0.0" "@commitlint/to-lines@^15.0.0": version "15.0.0" resolved "https://registry.yarnpkg.com/@commitlint/to-lines/-/to-lines-15.0.0.tgz#b86ac98f319688990ecc2e09227fadf591b65c92" integrity sha512-mY3MNA9ujPqVpiJjTYG9MDsYCobue5PJFO0MfcIzS1mCVvngH8ZFTPAh1fT5t+t1h876boS88+9WgqjRvbYItw== "@commitlint/top-level@^15.0.0": version "15.0.0" resolved "https://registry.yarnpkg.com/@commitlint/top-level/-/top-level-15.0.0.tgz#467ec8377e81dfc916e1a20a27558862be1a4254" integrity sha512-7Gz3t7xcuuUw1d1Nou6YLaztzp2Em+qZ6YdCzrqYc+aquca3Vt0O696nuiBDU/oE+tls4Hx2CNpAbWhTgEwB5A== dependencies: find-up "^5.0.0" "@commitlint/types@^15.0.0": version "15.0.0" resolved "https://registry.yarnpkg.com/@commitlint/types/-/types-15.0.0.tgz#46fa7bda3e6340caf3e3a2e415bcb78ff0195eed" integrity sha512-OMSLX+QJnyNoTwws54ULv9sOvuw9GdVezln76oyUd4YbMMJyaav62aSXDuCdWyL2sm9hTkSzyEi52PNaIj/vqw== dependencies: chalk "^4.0.0" "@endemolshinegroup/cosmiconfig-typescript-loader@^3.0.2": version "3.0.2" resolved "https://registry.yarnpkg.com/@endemolshinegroup/cosmiconfig-typescript-loader/-/cosmiconfig-typescript-loader-3.0.2.tgz#eea4635828dde372838b0909693ebd9aafeec22d" integrity sha512-QRVtqJuS1mcT56oHpVegkKBlgtWjXw/gHNWO3eL9oyB5Sc7HBoc2OLG/nYpVfT/Jejvo3NUrD0Udk7XgoyDKkA== dependencies: lodash.get "^4" make-error "^1" ts-node "^9" tslib "^2" "@eslint/eslintrc@^1.0.4", "@eslint/eslintrc@^1.0.5": version "1.0.5" resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-1.0.5.tgz#33f1b838dbf1f923bfa517e008362b78ddbbf318" integrity sha512-BLxsnmK3KyPunz5wmCCpqy0YelEoxxGmH73Is+Z74oOTMtExcjkr3dDR6quwrjh1YspA8DH9gnX1o069KiS9AQ== dependencies: ajv "^6.12.4" debug "^4.3.2" espree "^9.2.0" globals "^13.9.0" ignore "^4.0.6" import-fresh "^3.2.1" js-yaml "^4.1.0" minimatch "^3.0.4" strip-json-comments "^3.1.1" "@goto-bus-stop/common-shake@^2.2.0": version "2.4.0" resolved "https://registry.yarnpkg.com/@goto-bus-stop/common-shake/-/common-shake-2.4.0.tgz#7b29b093ed10d4075c061bf48905c02eb75d643c" integrity sha512-LO+7v+UbxE3IyAS4Suf/KYB7Zq9DEIHibwDe6Wph4apNEfDyyxP7BSxzRS/Qa9lUH5gsm9eL9nF8EE1E0/nQkQ== dependencies: acorn-walk "^7.0.0" debug "^3.2.6" escope "^3.6.0" "@goto-bus-stop/envify@^5.0.0": version "5.0.0" resolved "https://registry.yarnpkg.com/@goto-bus-stop/envify/-/envify-5.0.0.tgz#db7db712f00901d9f71f852ed13dbb3db0909b1a" integrity sha512-xAnxuDWmwQxO8CgVuPTxKuNsKDfwyXXTyAabG4sNoK59H/ZMC7BHxTA/4ehtinsxbcH7/9L65F5VhyNdQfUyqA== dependencies: acorn-node "^2.0.1" dash-ast "^2.0.1" multisplice "^1.0.0" through2 "^2.0.5" "@humanwhocodes/config-array@^0.9.2": version "0.9.2" resolved "https://registry.yarnpkg.com/@humanwhocodes/config-array/-/config-array-0.9.2.tgz#68be55c737023009dfc5fe245d51181bb6476914" integrity sha512-UXOuFCGcwciWckOpmfKDq/GyhlTf9pN/BzG//x8p8zTOFEcGuA68ANXheFS0AGvy3qgZqLBUkMs7hqzqCKOVwA== dependencies: "@humanwhocodes/object-schema" "^1.2.1" debug "^4.1.1" minimatch "^3.0.4" "@humanwhocodes/object-schema@^1.2.1": version "1.2.1" resolved "https://registry.yarnpkg.com/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz#b520529ec21d8e5945a1851dfd1c32e94e39ff45" integrity sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA== "@istanbuljs/load-nyc-config@^1.0.0": version "1.1.0" resolved "https://registry.yarnpkg.com/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz#fd3db1d59ecf7cf121e80650bb86712f9b55eced" integrity sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ== dependencies: camelcase "^5.3.1" find-up "^4.1.0" get-package-type "^0.1.0" js-yaml "^3.13.1" resolve-from "^5.0.0" "@istanbuljs/schema@^0.1.2": version "0.1.3" resolved "https://registry.yarnpkg.com/@istanbuljs/schema/-/schema-0.1.3.tgz#e45e384e4b8ec16bce2fd903af78450f6bf7ec98" integrity sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA== "@mdn/browser-compat-data@^3.3.14": version "3.3.14" resolved "https://registry.yarnpkg.com/@mdn/browser-compat-data/-/browser-compat-data-3.3.14.tgz#b72a37c654e598f9ae6f8335faaee182bebc6b28" integrity sha512-n2RC9d6XatVbWFdHLimzzUJxJ1KY8LdjqrW6YvGPiRmsHkhOUx74/Ct10x5Yo7bC/Jvqx7cDEW8IMPv/+vwEzA== "@nicolo-ribaudo/chokidar-2@2.1.8-no-fsevents.3": version "2.1.8-no-fsevents.3" resolved "https://registry.yarnpkg.com/@nicolo-ribaudo/chokidar-2/-/chokidar-2-2.1.8-no-fsevents.3.tgz#323d72dd25103d0c4fbdce89dadf574a787b1f9b" integrity sha512-s88O1aVtXftvp5bCPB7WnmXc5IwOZZ7YPuwNPt+GtOOXpPvad1LfbmjYv+qII7zP6RU2QGnqve27dnLycEnyEQ== "@nodelib/fs.scandir@2.1.5": version "2.1.5" resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz#7619c2eb21b25483f6d167548b4cfd5a7488c3d5" integrity sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g== dependencies: "@nodelib/fs.stat" "2.0.5" run-parallel "^1.1.9" "@nodelib/fs.stat@2.0.5", "@nodelib/fs.stat@^2.0.2": version "2.0.5" resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz#5bd262af94e9d25bd1e71b05deed44876a222e8b" integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A== "@nodelib/fs.walk@^1.2.3": version "1.2.8" resolved "https://registry.yarnpkg.com/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz#e95737e8bb6746ddedf69c556953494f196fe69a" integrity sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg== dependencies: "@nodelib/fs.scandir" "2.1.5" fastq "^1.6.0" "@tootallnate/once@1": version "1.1.2" resolved "https://registry.yarnpkg.com/@tootallnate/once/-/once-1.1.2.tgz#ccb91445360179a04e7fe6aff78c00ffc1eeaf82" integrity sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw== "@types/concat-stream@^1.0.0": version "1.6.1" resolved "https://registry.yarnpkg.com/@types/concat-stream/-/concat-stream-1.6.1.tgz#24bcfc101ecf68e886aaedce60dfd74b632a1b74" integrity sha512-eHE4cQPoj6ngxBZMvVf6Hw7Mh4jMW4U9lpGmS5GBPB9RYxlFg+CHaVN7ErNY4W9XfLIEn20b4VDYaIrbq0q4uA== dependencies: "@types/node" "*" "@types/debug@^4.0.0": version "4.1.7" resolved "https://registry.yarnpkg.com/@types/debug/-/debug-4.1.7.tgz#7cc0ea761509124709b8b2d1090d8f6c17aadb82" integrity sha512-9AonUzyTjXXhEOa0DnqpzZi6VHlqKMswga9EXjpXnnqxwLtdvPPtlO8evrI5D9S6asFRCQ6v+wpiUKbw+vKqyg== dependencies: "@types/ms" "*" "@types/eslint@^7.2.13": version "7.29.0" resolved "https://registry.yarnpkg.com/@types/eslint/-/eslint-7.29.0.tgz#e56ddc8e542815272720bb0b4ccc2aff9c3e1c78" integrity sha512-VNcvioYDH8/FxaeTKkM4/TiTwt6pBV9E3OfGmvaw8tPl0rrHCJ4Ll15HRT+pMiFAf/MLQvAzC+6RzUMEL9Ceng== dependencies: "@types/estree" "*" "@types/json-schema" "*" "@types/estree@*": version "0.0.50" resolved "https://registry.yarnpkg.com/@types/estree/-/estree-0.0.50.tgz#1e0caa9364d3fccd2931c3ed96fdbeaa5d4cca83" integrity sha512-C6N5s2ZFtuZRj54k2/zyRhNDjJwwcViAM3Nbm8zjBpbqAdZ00mr0CFxvSKeO8Y/e03WVFLpQMdHYVfUd6SB+Hw== "@types/is-empty@^1.0.0": version "1.2.1" resolved "https://registry.yarnpkg.com/@types/is-empty/-/is-empty-1.2.1.tgz#18d7256a73e43ec51f8b75c25fbdc31350be52a6" integrity sha512-a3xgqnFTuNJDm1fjsTjHocYJ40Cz3t8utYpi5GNaxzrJC2HSD08ym+whIL7fNqiqBCdM9bcqD1H/tORWAFXoZw== "@types/js-yaml@^4.0.0": version "4.0.5" resolved "https://registry.yarnpkg.com/@types/js-yaml/-/js-yaml-4.0.5.tgz#738dd390a6ecc5442f35e7f03fa1431353f7e138" integrity sha512-FhpRzf927MNQdRZP0J5DLIdTXhjLYzeUTmLAu69mnVksLH9CJY3IuSeEgbKUki7GQZm0WqDkGzyxju2EZGD2wA== "@types/json-schema@*", "@types/json-schema@^7.0.9": version "7.0.9" resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.9.tgz#97edc9037ea0c38585320b28964dde3b39e4660d" integrity sha512-qcUXuemtEu+E5wZSJHNxUXeCZhAfXKQ41D+duX+VYPde7xyEVZci+/oXKJL13tnRs9lR2pr4fod59GT6/X1/yQ== "@types/json5@^0.0.29": version "0.0.29" resolved "https://registry.yarnpkg.com/@types/json5/-/json5-0.0.29.tgz#ee28707ae94e11d2b827bcbe5270bcea7f3e71ee" integrity sha1-7ihweulOEdK4J7y+UnC86n8+ce4= "@types/mdast@^3.0.0", "@types/mdast@^3.0.3": version "3.0.10" resolved "https://registry.yarnpkg.com/@types/mdast/-/mdast-3.0.10.tgz#4724244a82a4598884cbbe9bcfd73dff927ee8af" integrity sha512-W864tg/Osz1+9f4lrGTZpCSO5/z4608eUp19tbozkq2HJK6i3z1kT0H9tlADXuYIb1YYOBByU4Jsqkk75q48qA== dependencies: "@types/unist" "*" "@types/minimist@^1.2.0", "@types/minimist@^1.2.2": version "1.2.2" resolved "https://registry.yarnpkg.com/@types/minimist/-/minimist-1.2.2.tgz#ee771e2ba4b3dc5b372935d549fd9617bf345b8c" integrity sha512-jhuKLIRrhvCPLqwPcx6INqmKeiA5EWrsCOPhrlFSrbrmU4ZMPjj5Ul/oLCMDO98XRUIwVm78xICz4EPCektzeQ== "@types/ms@*": version "0.7.31" resolved "https://registry.yarnpkg.com/@types/ms/-/ms-0.7.31.tgz#31b7ca6407128a3d2bbc27fe2d21b345397f6197" integrity sha512-iiUgKzV9AuaEkZqkOLDIvlQiL6ltuZd9tGcW3gwpnX8JbuiuhFlEGmmFXEXkN50Cvq7Os88IY2v0dkDqXYWVgA== "@types/node@*", "@types/node@^17.0.0": version "17.0.8" resolved "https://registry.yarnpkg.com/@types/node/-/node-17.0.8.tgz#50d680c8a8a78fe30abe6906453b21ad8ab0ad7b" integrity sha512-YofkM6fGv4gDJq78g4j0mMuGMkZVxZDgtU0JRdx6FgiJDG+0fY0GKVolOV8WqVmEhLCXkQRjwDdKyPxJp/uucg== "@types/normalize-package-data@^2.4.0": version "2.4.1" resolved "https://registry.yarnpkg.com/@types/normalize-package-data/-/normalize-package-data-2.4.1.tgz#d3357479a0fdfdd5907fe67e17e0a85c906e1301" integrity sha512-Gj7cI7z+98M282Tqmp2K5EIsoouUEzbBJhQQzDE3jSIRk6r9gsz0oUokqIUR4u1R3dMHo0pDHM7sNOHyhulypw== "@types/parse-json@^4.0.0": version "4.0.0" resolved "https://registry.yarnpkg.com/@types/parse-json/-/parse-json-4.0.0.tgz#2f8bb441434d163b35fb8ffdccd7138927ffb8c0" integrity sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA== "@types/supports-color@^8.0.0": version "8.1.1" resolved "https://registry.yarnpkg.com/@types/supports-color/-/supports-color-8.1.1.tgz#1b44b1b096479273adf7f93c75fc4ecc40a61ee4" integrity sha512-dPWnWsf+kzIG140B8z2w3fr5D03TLWbOAFQl45xUpI3vcizeXriNR5VYkWZ+WTMsUHqZ9Xlt3hrxGNANFyNQfw== "@types/text-table@^0.2.0": version "0.2.2" resolved "https://registry.yarnpkg.com/@types/text-table/-/text-table-0.2.2.tgz#774c90cfcfbc8b4b0ebb00fecbe861dc8b1e8e26" integrity sha512-dGoI5Af7To0R2XE8wJuc6vwlavWARsCh3UKJPjWs1YEqGUqfgBI/j/4GX0yf19/DsDPPf0YAXWAp8psNeIehLg== "@types/unist@*", "@types/unist@^2.0.0", "@types/unist@^2.0.2", "@types/unist@^2.0.3": version "2.0.6" resolved "https://registry.yarnpkg.com/@types/unist/-/unist-2.0.6.tgz#250a7b16c3b91f672a24552ec64678eeb1d3a08d" integrity sha512-PBjIUxZHOuj0R15/xuwJYjFi+KZdNFrehocChv4g5hu6aFroHue8m0lBP0POdK2nKzbw0cgV1mws8+V/JAcEkQ== "@typescript-eslint/eslint-plugin@^5.4.0": version "5.9.0" resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.9.0.tgz#382182d5cb062f52aac54434cfc47c28898c8006" integrity sha512-qT4lr2jysDQBQOPsCCvpPUZHjbABoTJW8V9ZzIYKHMfppJtpdtzszDYsldwhFxlhvrp7aCHeXD1Lb9M1zhwWwQ== dependencies: "@typescript-eslint/experimental-utils" "5.9.0" "@typescript-eslint/scope-manager" "5.9.0" "@typescript-eslint/type-utils" "5.9.0" debug "^4.3.2" functional-red-black-tree "^1.0.1" ignore "^5.1.8" regexpp "^3.2.0" semver "^7.3.5" tsutils "^3.21.0" "@typescript-eslint/experimental-utils@5.9.0": version "5.9.0" resolved "https://registry.yarnpkg.com/@typescript-eslint/experimental-utils/-/experimental-utils-5.9.0.tgz#652762d37d6565ef07af285021b8347b6c79a827" integrity sha512-ZnLVjBrf26dn7ElyaSKa6uDhqwvAi4jBBmHK1VxuFGPRAxhdi18ubQYSGA7SRiFiES3q9JiBOBHEBStOFkwD2g== dependencies: "@types/json-schema" "^7.0.9" "@typescript-eslint/scope-manager" "5.9.0" "@typescript-eslint/types" "5.9.0" "@typescript-eslint/typescript-estree" "5.9.0" eslint-scope "^5.1.1" eslint-utils "^3.0.0" "@typescript-eslint/parser@^5.4.0": version "5.9.0" resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-5.9.0.tgz#fdbb08767a4caa6ca6ccfed5f9ffe9387f0c7d97" integrity sha512-/6pOPz8yAxEt4PLzgbFRDpZmHnXCeZgPDrh/1DaVKOjvn/UPMlWhbx/gA96xRi2JxY1kBl2AmwVbyROUqys5xQ== dependencies: "@typescript-eslint/scope-manager" "5.9.0" "@typescript-eslint/types" "5.9.0" "@typescript-eslint/typescript-estree" "5.9.0" debug "^4.3.2" "@typescript-eslint/scope-manager@5.9.0": version "5.9.0" resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-5.9.0.tgz#02dfef920290c1dcd7b1999455a3eaae7a1a3117" integrity sha512-DKtdIL49Qxk2a8icF6whRk7uThuVz4A6TCXfjdJSwOsf+9ree7vgQWcx0KOyCdk0i9ETX666p4aMhrRhxhUkyg== dependencies: "@typescript-eslint/types" "5.9.0" "@typescript-eslint/visitor-keys" "5.9.0" "@typescript-eslint/type-utils@5.9.0": version "5.9.0" resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-5.9.0.tgz#fd5963ead04bc9b7af9c3a8e534d8d39f1ce5f93" integrity sha512-uVCb9dJXpBrK1071ri5aEW7ZHdDHAiqEjYznF3HSSvAJXyrkxGOw2Ejibz/q6BXdT8lea8CMI0CzKNFTNI6TEQ== dependencies: "@typescript-eslint/experimental-utils" "5.9.0" debug "^4.3.2" tsutils "^3.21.0" "@typescript-eslint/types@5.9.0": version "5.9.0" resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-5.9.0.tgz#e5619803e39d24a03b3369506df196355736e1a3" integrity sha512-mWp6/b56Umo1rwyGCk8fPIzb9Migo8YOniBGPAQDNC6C52SeyNGN4gsVwQTAR+RS2L5xyajON4hOLwAGwPtUwg== "@typescript-eslint/typescript-estree@5.9.0": version "5.9.0" resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-5.9.0.tgz#0e5c6f03f982931abbfbc3c1b9df5fbf92a3490f" integrity sha512-kxo3xL2mB7XmiVZcECbaDwYCt3qFXz99tBSuVJR4L/sR7CJ+UNAPrYILILktGj1ppfZ/jNt/cWYbziJUlHl1Pw== dependencies: "@typescript-eslint/types" "5.9.0" "@typescript-eslint/visitor-keys" "5.9.0" debug "^4.3.2" globby "^11.0.4" is-glob "^4.0.3" semver "^7.3.5" tsutils "^3.21.0" "@typescript-eslint/visitor-keys@5.9.0": version "5.9.0" resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-5.9.0.tgz#7585677732365e9d27f1878150fab3922784a1a6" integrity sha512-6zq0mb7LV0ThExKlecvpfepiB+XEtFv/bzx7/jKSgyXTFD7qjmSu1FoiS0x3OZaiS+UIXpH2vd9O89f02RCtgw== dependencies: "@typescript-eslint/types" "5.9.0" eslint-visitor-keys "^3.0.0" Base64@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/Base64/-/Base64-1.1.0.tgz#810ef21afa8357df92ad7b5389188c446b9cb956" integrity sha512-qeacf8dvGpf+XAT27ESHMh7z84uRzj/ua2pQdJg483m3bEXv/kVFtDnMgvf70BQGqzbZhR9t6BmASzKvqfJf3Q== JSON2@0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/JSON2/-/JSON2-0.1.0.tgz#8d7493040a63d5835af75f47decb83ab6c8c0790" integrity sha1-jXSTBApj1YNa919H3suDq2yMB5A= JSONStream@^1.0.3, JSONStream@^1.0.4, JSONStream@^1.3.2: version "1.3.5" resolved "https://registry.yarnpkg.com/JSONStream/-/JSONStream-1.3.5.tgz#3208c1f08d3a4d99261ab64f92302bc15e111ca0" integrity sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ== dependencies: jsonparse "^1.2.0" through ">=2.2.7 <3" abbrev@1: version "1.1.1" resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8" integrity sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q== abbrev@1.0.x: version "1.0.9" resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.0.9.tgz#91b4792588a7738c25f35dd6f63752a2f8776135" integrity sha1-kbR5JYinc4wl813W9jdSovh3YTU= accepts@~1.2.9: version "1.2.13" resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.2.13.tgz#e5f1f3928c6d95fd96558c36ec3d9d0de4a6ecea" integrity sha1-5fHzkoxtlf2WVYw27D2dDeSm7Oo= dependencies: mime-types "~2.1.6" negotiator "0.5.3" accepts@~1.3.7: version "1.3.7" resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.7.tgz#531bc726517a3b2b41f850021c6cc15eaab507cd" integrity sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA== dependencies: mime-types "~2.1.24" negotiator "0.6.2" acorn-jsx@^5.3.1: version "5.3.2" resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz#7ed5bb55908b3b2f1bc55c6af1653bada7f07937" integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ== acorn-node@^1.2.0, acorn-node@^1.3.0, acorn-node@^1.5.2, acorn-node@^1.6.1, acorn-node@^1.8.2: version "1.8.2" resolved "https://registry.yarnpkg.com/acorn-node/-/acorn-node-1.8.2.tgz#114c95d64539e53dede23de8b9d96df7c7ae2af8" integrity sha512-8mt+fslDufLYntIoPAaIMUe/lrbrehIiwmR3t2k9LljIzoigEPF27eLk2hy8zSGzmR/ogr7zbRKINMo1u0yh5A== dependencies: acorn "^7.0.0" acorn-walk "^7.0.0" xtend "^4.0.2" acorn-node@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/acorn-node/-/acorn-node-2.0.1.tgz#4a93ba32335950da9250175c654721f20f3375a7" integrity sha512-VLR5sHqjk+8c5hrKeP2fWaIHb8eewsoxnZ8r2qpwRHXMHuC7KyOPflnOx9dLssVQUurzJ7rO0OzIFjHcndafWw== dependencies: acorn "^7.0.0" acorn-walk "^7.0.0" xtend "^4.0.2" acorn-walk@^7.0.0: version "7.2.0" resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-7.2.0.tgz#0de889a601203909b0fbe07b8938dc21d2e967bc" integrity sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA== acorn@^5.1.0, acorn@^5.2.1: version "5.7.4" resolved "https://registry.yarnpkg.com/acorn/-/acorn-5.7.4.tgz#3e8d8a9947d0599a1796d10225d7432f4a4acf5e" integrity sha512-1D++VG7BhrtvQpNbBzovKNc1FLGGEE/oGe7b9xJm/RFHMBeUaUGpluV9RLjZa47YFdPcDAenEYuq9pQPcMdLJg== acorn@^7.0.0, acorn@^7.1.1: version "7.4.1" resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.4.1.tgz#feaed255973d2e77555b83dbc08851a6c63520fa" integrity sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A== acorn@^8.7.0: version "8.7.0" resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.7.0.tgz#90951fde0f8f09df93549481e5fc141445b791cf" integrity sha512-V/LGr1APy+PXIwKebEWrkZPwoeoF+w1jiOBUmuxuiUIaOHtob8Qc9BTrYo7VuI5fR8tqsy+buA2WFooR5olqvQ== adm-zip@~0.4.3: version "0.4.16" resolved "https://registry.yarnpkg.com/adm-zip/-/adm-zip-0.4.16.tgz#cf4c508fdffab02c269cbc7f471a875f05570365" integrity sha512-TFi4HBKSGfIKsK5YCkKaaFG2m4PEDyViZmEwof3MTIgzimHLto6muaHVpbrljdIvIrFZzEq/p4nafOeLcYegrg== agent-base@6: version "6.0.2" resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-6.0.2.tgz#49fff58577cfee3f37176feab4c22e00f86d7f77" integrity sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ== dependencies: debug "4" aggregate-error@^3.0.0: version "3.1.0" resolved "https://registry.yarnpkg.com/aggregate-error/-/aggregate-error-3.1.0.tgz#92670ff50f5359bdb7a3e0d40d0ec30c5737687a" integrity sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA== dependencies: clean-stack "^2.0.0" indent-string "^4.0.0" ajv@^6.10.0, ajv@^6.12.4: version "6.12.6" resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4" integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== dependencies: fast-deep-equal "^3.1.1" fast-json-stable-stringify "^2.0.0" json-schema-traverse "^0.4.1" uri-js "^4.2.2" alce@1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/alce/-/alce-1.2.0.tgz#a8be2dacaac42494612f18dc09db691f3dea4aab" integrity sha1-qL4trKrEJJRhLxjcCdtpHz3qSqs= dependencies: esprima "^1.2.0" estraverse "^1.5.0" amdefine@>=0.0.4: version "1.0.1" resolved "https://registry.yarnpkg.com/amdefine/-/amdefine-1.0.1.tgz#4a5282ac164729e93619bcfd3ad151f817ce91f5" integrity sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU= ansi-colors@3.2.3: version "3.2.3" resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-3.2.3.tgz#57d35b8686e851e2cc04c403f1c00203976a1813" integrity sha512-LEHHyuhlPY3TmuUYMh2oz89lTShfvgbmzaBcxve9t/9Wuy7Dwf4yoAKcND7KFT1HAQfqZ12qtc+DUrBMeKF9nw== ansi-colors@^4.1.1: version "4.1.1" resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-4.1.1.tgz#cbb9ae256bf750af1eab344f229aa27fe94ba348" integrity sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA== ansi-escapes@^4.2.1, ansi-escapes@^4.3.0: version "4.3.2" resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-4.3.2.tgz#6b2291d1db7d98b6521d5f1efa42d0f3a9feb65e" integrity sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ== dependencies: type-fest "^0.21.3" ansi-regex@^2.0.0: version "2.1.1" resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df" integrity sha1-w7M6te42DYbg5ijwRorn7yfWVN8= ansi-regex@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-3.0.0.tgz#ed0317c322064f79466c02966bddb605ab37d998" integrity sha1-7QMXwyIGT3lGbAKWa922Bas32Zg= ansi-regex@^4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-4.1.0.tgz#8b9f8f08cf1acb843756a839ca8c7e3168c51997" integrity sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg== ansi-regex@^5.0.1: version "5.0.1" resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== ansi-regex@^6.0.1: version "6.0.1" resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-6.0.1.tgz#3183e38fae9a65d7cb5e53945cd5897d0260a06a" integrity sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA== ansi-styles@^2.2.1: version "2.2.1" resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe" integrity sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4= ansi-styles@^3.2.0, ansi-styles@^3.2.1: version "3.2.1" resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== dependencies: color-convert "^1.9.0" ansi-styles@^4.0.0, ansi-styles@^4.1.0: version "4.3.0" resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== dependencies: color-convert "^2.0.1" ansi-styles@^6.0.0: version "6.1.0" resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-6.1.0.tgz#87313c102b8118abd57371afab34618bf7350ed3" integrity sha512-VbqNsoz55SYGczauuup0MFUyXNQviSpFTj1RQtFzmQLk18qbVSpTFFGMT293rmDaQuKCT6InmbuEyUne4mTuxQ== anymatch@^1.3.0: version "1.3.2" resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-1.3.2.tgz#553dcb8f91e3c889845dfdba34c77721b90b9d7a" integrity sha512-0XNayC8lTHQ2OI8aljNCN3sSx6hsr/1+rlcDAotXJR7C1oZZHCNsfpbKwMjRA3Uqb5tF1Rae2oloTr4xpq+WjA== dependencies: micromatch "^2.1.5" normalize-path "^2.0.0" anymatch@~3.1.2: version "3.1.2" resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.2.tgz#c0557c096af32f106198f4f4e2a383537e378716" integrity sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg== dependencies: normalize-path "^3.0.0" picomatch "^2.0.4" append-field@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/append-field/-/append-field-1.0.0.tgz#1e3440e915f0b1203d23748e78edd7b9b5b43e56" integrity sha1-HjRA6RXwsSA9I3SOeO3XubW0PlY= append-transform@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/append-transform/-/append-transform-2.0.0.tgz#99d9d29c7b38391e6f428d28ce136551f0b77e12" integrity sha512-7yeyCEurROLQJFv5Xj4lEGTy0borxepjFv1g22oAdqFu//SrAlDl1O1Nxx15SH1RoliUml6p8dwJW9jvZughhg== dependencies: default-require-extensions "^3.0.0" archiver@0.14.x: version "0.14.4" resolved "https://registry.yarnpkg.com/archiver/-/archiver-0.14.4.tgz#5b9ddb9f5ee1ceef21cb8f3b020e6240ecb4315c" integrity sha1-W53bn17hzu8hy487Ag5iQOy0MVw= dependencies: async "~0.9.0" buffer-crc32 "~0.2.1" glob "~4.3.0" lazystream "~0.1.0" lodash "~3.2.0" readable-stream "~1.0.26" tar-stream "~1.1.0" zip-stream "~0.5.0" archiver@~0.12.0: version "0.12.0" resolved "https://registry.yarnpkg.com/archiver/-/archiver-0.12.0.tgz#b8ccde2508cab9092bb7106630139c0f39a280cc" integrity sha1-uMzeJQjKuQkrtxBmMBOcDzmigMw= dependencies: async "~0.9.0" buffer-crc32 "~0.2.1" glob "~4.0.6" lazystream "~0.1.0" lodash "~2.4.1" readable-stream "~1.0.26" tar-stream "~1.0.0" zip-stream "~0.4.0" archiver@~0.7.1: version "0.7.1" resolved "https://registry.yarnpkg.com/archiver/-/archiver-0.7.1.tgz#cf152d794f86bbd93f9858da60d36aaeabad9bbf" integrity sha1-zxUteU+Gu9k/mFjaYNNqrqutm78= dependencies: file-utils "~0.1.5" lazystream "~0.1.0" lodash "~2.4.1" readable-stream "~1.0.24" zip-stream "~0.2.0" archy@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/archy/-/archy-1.0.0.tgz#f9c8c13757cc1dd7bc379ac77b2c62a5c2868c40" integrity sha1-+cjBN1fMHde8N5rHeyxipcKGjEA= arg@^4.1.0: version "4.1.3" resolved "https://registry.yarnpkg.com/arg/-/arg-4.1.3.tgz#269fc7ad5b8e42cb63c896d5666017261c144089" integrity sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA== argparse@^1.0.7: version "1.0.10" resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911" integrity sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg== dependencies: sprintf-js "~1.0.2" argparse@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38" integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== argv@0.0.2: version "0.0.2" resolved "https://registry.yarnpkg.com/argv/-/argv-0.0.2.tgz#ecbd16f8949b157183711b1bda334f37840185ab" integrity sha1-7L0W+JSbFXGDcRsb2jNPN4QBhas= arr-diff@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-2.0.0.tgz#8f3b827f955a8bd669697e4a4256ac3ceae356cf" integrity sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8= dependencies: arr-flatten "^1.0.1" arr-diff@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-4.0.0.tgz#d6461074febfec71e7e15235761a329a5dc7c520" integrity sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA= arr-flatten@^1.0.1, arr-flatten@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/arr-flatten/-/arr-flatten-1.1.0.tgz#36048bbff4e7b47e136644316c99669ea5ae91f1" integrity sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg== arr-union@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/arr-union/-/arr-union-3.1.0.tgz#e39b09aea9def866a8f206e288af63919bae39c4" integrity sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ= array-filter@~0.0.0: version "0.0.1" resolved "https://registry.yarnpkg.com/array-filter/-/array-filter-0.0.1.tgz#7da8cf2e26628ed732803581fd21f67cacd2eeec" integrity sha1-fajPLiZijtcygDWB/SH2fKzS7uw= array-find@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/array-find/-/array-find-1.0.0.tgz#6c8e286d11ed768327f8e62ecee87353ca3e78b8" integrity sha1-bI4obRHtdoMn+OYuzuhzU8o+eLg= array-flatten@1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-1.1.1.tgz#9a5f699051b1e7073328f2a008968b64ea2955d2" integrity sha1-ml9pkFGx5wczKPKgCJaLZOopVdI= array-from@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/array-from/-/array-from-2.1.1.tgz#cfe9d8c26628b9dc5aecc62a9f5d8f1f352c1195" integrity sha1-z+nYwmYoudxa7MYqn12PHzUsEZU= array-ify@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/array-ify/-/array-ify-1.0.0.tgz#9e528762b4a9066ad163a6962a364418e9626ece" integrity sha1-nlKHYrSpBmrRY6aWKjZEGOlibs4= array-includes@^3.1.4: version "3.1.4" resolved "https://registry.yarnpkg.com/array-includes/-/array-includes-3.1.4.tgz#f5b493162c760f3539631f005ba2bb46acb45ba9" integrity sha512-ZTNSQkmWumEbiHO2GF4GmWxYVTiQyJy2XOTa15sdQSrvKn7l+180egQMqlrMOUMCyLMD7pmyQe4mMDUT6Behrw== dependencies: call-bind "^1.0.2" define-properties "^1.1.3" es-abstract "^1.19.1" get-intrinsic "^1.1.1" is-string "^1.0.7" array-iterate@^1.0.0: version "1.1.4" resolved "https://registry.yarnpkg.com/array-iterate/-/array-iterate-1.1.4.tgz#add1522e9dd9749bb41152d08b845bd08d6af8b7" integrity sha512-sNRaPGh9nnmdC8Zf+pT3UqP8rnWj5Hf9wiFGsX3wUQ2yVSIhO2ShFwCoceIPpB41QF6i2OEmrHmCo36xronCVA== array-map@0.0.0, array-map@~0.0.0: version "0.0.0" resolved "https://registry.yarnpkg.com/array-map/-/array-map-0.0.0.tgz#88a2bab73d1cf7bcd5c1b118a003f66f665fa662" integrity sha1-iKK6tz0c97zVwbEYoAP2b2ZfpmI= array-reduce@~0.0.0: version "0.0.0" resolved "https://registry.yarnpkg.com/array-reduce/-/array-reduce-0.0.0.tgz#173899d3ffd1c7d9383e4479525dbe278cab5f2b" integrity sha1-FziZ0//Rx9k4PkR5Ul2+J4yrXys= array-union@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/array-union/-/array-union-2.1.0.tgz#b798420adbeb1de828d84acd8a2e23d3efe85e8d" integrity sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw== array-union@^3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/array-union/-/array-union-3.0.1.tgz#da52630d327f8b88cfbfb57728e2af5cd9b6b975" integrity sha512-1OvF9IbWwaeiM9VhzYXVQacMibxpXOMYVNIvMtKRyX9SImBXpKcFr8XvFDeEslCyuH/t6KRt7HEO94AlP8Iatw== array-uniq@~1.0.2: version "1.0.3" resolved "https://registry.yarnpkg.com/array-uniq/-/array-uniq-1.0.3.tgz#af6ac877a25cc7f74e058894753858dfdb24fdb6" integrity sha1-r2rId6Jcx/dOBYiUdThY39sk/bY= array-unique@^0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.2.1.tgz#a1d97ccafcbc2625cc70fadceb36a50c58b01a53" integrity sha1-odl8yvy8JiXMcPrc6zalDFiwGlM= array-unique@^0.3.2: version "0.3.2" resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.3.2.tgz#a894b75d4bc4f6cd679ef3244a9fd8f46ae2d428" integrity sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg= array.prototype.flat@^1.2.5: version "1.2.5" resolved "https://registry.yarnpkg.com/array.prototype.flat/-/array.prototype.flat-1.2.5.tgz#07e0975d84bbc7c48cd1879d609e682598d33e13" integrity sha512-KaYU+S+ndVqyUnignHftkwc58o3uVU1jzczILJ1tN2YaIZpFIKBiP/x/j97E5MVPsaCloPbqWLB/8qCTVvT2qg== dependencies: call-bind "^1.0.2" define-properties "^1.1.3" es-abstract "^1.19.0" arrify@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/arrify/-/arrify-1.0.1.tgz#898508da2226f380df904728456849c1501a4b0d" integrity sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0= arrify@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/arrify/-/arrify-3.0.0.tgz#ccdefb8eaf2a1d2ab0da1ca2ce53118759fd46bc" integrity sha512-tLkvA81vQG/XqE2mjDkGQHoOINtMHtysSnemrmoGe6PydDPMRbVugqyk4A6V/WDWEfm3l+0d8anA9r8cv/5Jaw== asap@^2.0.0: version "2.0.6" resolved "https://registry.yarnpkg.com/asap/-/asap-2.0.6.tgz#e50347611d7e690943208bbdafebcbc2fb866d46" integrity sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY= asn1.js@^5.2.0: version "5.4.1" resolved "https://registry.yarnpkg.com/asn1.js/-/asn1.js-5.4.1.tgz#11a980b84ebb91781ce35b0fdc2ee294e3783f07" integrity sha512-+I//4cYPccV8LdmBLiX8CYvf9Sp3vQsrqu2QNXRcrbiWvcx/UdlFiqUJJzxRQxgsZmvhXhn4cSKeSmoFjVdupA== dependencies: bn.js "^4.0.0" inherits "^2.0.1" minimalistic-assert "^1.0.0" safer-buffer "^2.1.0" asn1@0.1.11: version "0.1.11" resolved "https://registry.yarnpkg.com/asn1/-/asn1-0.1.11.tgz#559be18376d08a4ec4dbe80877d27818639b2df7" integrity sha1-VZvhg3bQik7E2+gId9J4GGObLfc= assert-plus@^0.1.5: version "0.1.5" resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-0.1.5.tgz#ee74009413002d84cec7219c6ac811812e723160" integrity sha1-7nQAlBMALYTOxyGcasgRgS5yMWA= assert@^1.4.0: version "1.5.0" resolved "https://registry.yarnpkg.com/assert/-/assert-1.5.0.tgz#55c109aaf6e0aefdb3dc4b71240c70bf574b18eb" integrity sha512-EDsgawzwoun2CZkCgtxJbv392v4nbk9XDD06zI+kQYoBM/3RBWLlEyJARDOmhAAosBjWACEkKL6S+lIZtcAubA== dependencies: object-assign "^4.1.1" util "0.10.3" assert@~1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/assert/-/assert-1.3.0.tgz#03939a622582a812cc202320a0b9a56c9b815849" integrity sha1-A5OaYiWCqBLMICMgoLmlbJuBWEk= dependencies: util "0.10.3" assign-symbols@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/assign-symbols/-/assign-symbols-1.0.0.tgz#59667f41fadd4f20ccbc2bb96b8d4f7f78ec0367" integrity sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c= ast-metadata-inferer@^0.7.0: version "0.7.0" resolved "https://registry.yarnpkg.com/ast-metadata-inferer/-/ast-metadata-inferer-0.7.0.tgz#c45d874cbdecabea26dc5de11fc6fa1919807c66" integrity sha512-OkMLzd8xelb3gmnp6ToFvvsHLtS6CbagTkFQvQ+ZYFe3/AIl9iKikNR9G7pY3GfOR/2Xc222hwBjzI7HLkE76Q== dependencies: "@mdn/browser-compat-data" "^3.3.14" astral-regex@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/astral-regex/-/astral-regex-2.0.0.tgz#483143c567aeed4785759c0865786dc77d7d2e31" integrity sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ== async-each@^1.0.0: version "1.0.3" resolved "https://registry.yarnpkg.com/async-each/-/async-each-1.0.3.tgz#b727dbf87d7651602f06f4d4ac387f47d91b0cbf" integrity sha512-z/WhQ5FPySLdvREByI2vZiTWwCnF0moMJ1hK9YQwDTHKh6I7/uSckMetoRGb5UBZPC1z0jlw+n/XCgjeH7y1AQ== async@0.9.x, async@~0.9.0: version "0.9.2" resolved "https://registry.yarnpkg.com/async/-/async-0.9.2.tgz#aea74d5e61c1f899613bf64bda66d4c78f2fd17d" integrity sha1-rqdNXmHB+JlhO/ZL2mbUx48v0X0= async@1.x: version "1.5.2" resolved "https://registry.yarnpkg.com/async/-/async-1.5.2.tgz#ec6a61ae56480c0c3cb241c95618e20892f9672a" integrity sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo= async@~0.2.6, async@~0.2.7, async@~0.2.9: version "0.2.10" resolved "https://registry.yarnpkg.com/async/-/async-0.2.10.tgz#b6bbe0b0674b9d719708ca38de8c237cb526c3d1" integrity sha1-trvgsGdLnXGXCMo43owjfLUmw9E= asynckit@^0.4.0: version "0.4.0" resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" integrity sha1-x57Zf380y48robyXkLzDZkdLS3k= asyncreduce@~0.1.4: version "0.1.4" resolved "https://registry.yarnpkg.com/asyncreduce/-/asyncreduce-0.1.4.tgz#18210e01978bfdcba043955497a5cd315c0a6a41" integrity sha1-GCEOAZeL/cugQ5VUl6XNMVwKakE= dependencies: runnel "~0.5.0" atob@^2.1.2: version "2.1.2" resolved "https://registry.yarnpkg.com/atob/-/atob-2.1.2.tgz#6d9517eb9e030d2436666651e86bd9f6f13533c9" integrity sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg== author-regex@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/author-regex/-/author-regex-1.0.0.tgz#d08885be6b9bbf9439fe087c76287245f0a81450" integrity sha1-0IiFvmubv5Q5/gh8dihyRfCoFFA= available-typed-arrays@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz#92f95616501069d07d10edb2fc37d3e1c65123b7" integrity sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw== aws-sign2@~0.5.0: version "0.5.0" resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.5.0.tgz#c57103f7a17fc037f02d7c2e64b602ea223f7d63" integrity sha1-xXED96F/wDfwLXwuZLYC6iI/fWM= babel-plugin-dynamic-import-node@^2.3.3: version "2.3.3" resolved "https://registry.yarnpkg.com/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.3.tgz#84fda19c976ec5c6defef57f9427b3def66e17a3" integrity sha512-jZVI+s9Zg3IqA/kdi0i6UDCybUI3aSBLnglhYbSSjKlV7yF1F/5LWv8MakQmvYpnbJDS6fcBL2KzHSxNCMtWSQ== dependencies: object.assign "^4.1.0" babel-plugin-polyfill-corejs2@^0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.3.0.tgz#407082d0d355ba565af24126fb6cb8e9115251fd" integrity sha512-wMDoBJ6uG4u4PNFh72Ty6t3EgfA91puCuAwKIazbQlci+ENb/UU9A3xG5lutjUIiXCIn1CY5L15r9LimiJyrSA== dependencies: "@babel/compat-data" "^7.13.11" "@babel/helper-define-polyfill-provider" "^0.3.0" semver "^6.1.1" babel-plugin-polyfill-corejs3@^0.4.0: version "0.4.0" resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.4.0.tgz#0b571f4cf3d67f911512f5c04842a7b8e8263087" integrity sha512-YxFreYwUfglYKdLUGvIF2nJEsGwj+RhWSX/ije3D2vQPOXuyMLMtg/cCGMDpOA7Nd+MwlNdnGODbd2EwUZPlsw== dependencies: "@babel/helper-define-polyfill-provider" "^0.3.0" core-js-compat "^3.18.0" babel-plugin-polyfill-regenerator@^0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.3.0.tgz#9ebbcd7186e1a33e21c5e20cae4e7983949533be" integrity sha512-dhAPTDLGoMW5/84wkgwiLRwMnio2i1fUe53EuvtKMv0pn2p3S8OCoV1xAzfJPl0KOX7IB89s2ib85vbYiea3jg== dependencies: "@babel/helper-define-polyfill-provider" "^0.3.0" babelify@^10.0.0: version "10.0.0" resolved "https://registry.yarnpkg.com/babelify/-/babelify-10.0.0.tgz#fe73b1a22583f06680d8d072e25a1e0d1d1d7fb5" integrity sha512-X40FaxyH7t3X+JFAKvb1H9wooWKLRCi8pg3m8poqtdZaIng+bjzp9RvKQCvRjF9isHiPkXspbbXT/zwXLtwgwg== bail@^1.0.0: version "1.0.5" resolved "https://registry.yarnpkg.com/bail/-/bail-1.0.5.tgz#b6fa133404a392cbc1f8c4bf63f5953351e7a776" integrity sha512-xFbRxM1tahm08yHBP16MMjVUAvDaBMD38zsM9EMAUN61omwLmKlOpB/Zku5QkjZ8TZ4vn53pj+t518cH0S03RQ== bail@^2.0.0: version "2.0.2" resolved "https://registry.yarnpkg.com/bail/-/bail-2.0.2.tgz#d26f5cd8fe5d6f832a31517b9f7c356040ba6d5d" integrity sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw== balanced-match@^1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== base64-js@^1.0.2: version "1.5.1" resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a" integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA== base@^0.11.1: version "0.11.2" resolved "https://registry.yarnpkg.com/base/-/base-0.11.2.tgz#7bde5ced145b6d551a90db87f83c558b4eb48a8f" integrity sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg== dependencies: cache-base "^1.0.1" class-utils "^0.3.5" component-emitter "^1.2.1" define-property "^1.0.0" isobject "^3.0.1" mixin-deep "^1.2.0" pascalcase "^0.1.1" basic-auth-connect@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/basic-auth-connect/-/basic-auth-connect-1.0.0.tgz#fdb0b43962ca7b40456a7c2bb48fe173da2d2122" integrity sha1-/bC0OWLKe0BFanwrtI/hc9otISI= batch@0.5.0: version "0.5.0" resolved "https://registry.yarnpkg.com/batch/-/batch-0.5.0.tgz#fd2e05a7a5d696b4db9314013e285d8ff3557ec3" integrity sha1-/S4Fp6XWlrTbkxQBPihdj/NVfsM= binary-extensions@^1.0.0: version "1.13.1" resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-1.13.1.tgz#598afe54755b2868a5330d2aff9d4ebb53209b65" integrity sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw== binary-extensions@^2.0.0: version "2.2.0" resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.2.0.tgz#75f502eeaf9ffde42fc98829645be4ea76bd9e2d" integrity sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA== bindings@^1.5.0: version "1.5.0" resolved "https://registry.yarnpkg.com/bindings/-/bindings-1.5.0.tgz#10353c9e945334bc0511a6d90b38fbc7c9c504df" integrity sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ== dependencies: file-uri-to-path "1.0.0" bl@^0.9.0, bl@~0.9.0: version "0.9.5" resolved "https://registry.yarnpkg.com/bl/-/bl-0.9.5.tgz#c06b797af085ea00bc527afc8efcf11de2232054" integrity sha1-wGt5evCF6gC8Unr8jvzxHeIjIFQ= dependencies: readable-stream "~1.0.26" bn.js@^4.0.0, bn.js@^4.1.0, bn.js@^4.11.9: version "4.12.0" resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.12.0.tgz#775b3f278efbb9718eec7361f483fb36fbbfea88" integrity sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA== bn.js@^5.0.0, bn.js@^5.1.1: version "5.2.0" resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-5.2.0.tgz#358860674396c6997771a9d051fcc1b57d4ae002" integrity sha512-D7iWRBvnZE8ecXiLj/9wbxH7Tk79fAh8IHaTNq1RWRixsS02W+5qS+iE9yq6RYl0asXx5tw0bLhmT5pIfbSquw== body-parser@1.19.1, body-parser@^1.19.0: version "1.19.1" resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.19.1.tgz#1499abbaa9274af3ecc9f6f10396c995943e31d4" integrity sha512-8ljfQi5eBk8EJfECMrgqNGWPEY5jWP+1IzkzkGdFFEwFQZZyaZ21UqdaHktgiMlH0xLHqIFtE/u2OYE5dOtViA== dependencies: bytes "3.1.1" content-type "~1.0.4" debug "2.6.9" depd "~1.1.2" http-errors "1.8.1" iconv-lite "0.4.24" on-finished "~2.3.0" qs "6.9.6" raw-body "2.4.2" type-is "~1.6.18" body-parser@~1.12.3: version "1.12.4" resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.12.4.tgz#090700c4ba28862a8520ef378395fdee5f61c229" integrity sha1-CQcAxLoohiqFIO83g5X97l9hwik= dependencies: bytes "1.0.0" content-type "~1.0.1" debug "~2.2.0" depd "~1.0.1" iconv-lite "0.4.8" on-finished "~2.2.1" qs "2.4.2" raw-body "~2.0.1" type-is "~1.6.2" boom@0.4.x: version "0.4.2" resolved "https://registry.yarnpkg.com/boom/-/boom-0.4.2.tgz#7a636e9ded4efcefb19cef4947a3c67dfaee911b" integrity sha1-emNune1O/O+xnO9JR6PGffrukRs= dependencies: hoek "0.9.x" brace-expansion@^1.0.0, brace-expansion@^1.1.7: version "1.1.11" resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== dependencies: balanced-match "^1.0.0" concat-map "0.0.1" braces@^1.8.2: version "1.8.5" resolved "https://registry.yarnpkg.com/braces/-/braces-1.8.5.tgz#ba77962e12dff969d6b76711e914b737857bf6a7" integrity sha1-uneWLhLf+WnWt2cR6RS3N4V79qc= dependencies: expand-range "^1.8.1" preserve "^0.2.0" repeat-element "^1.1.2" braces@^2.3.1: version "2.3.2" resolved "https://registry.yarnpkg.com/braces/-/braces-2.3.2.tgz#5979fd3f14cd531565e5fa2df1abfff1dfaee729" integrity sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w== dependencies: arr-flatten "^1.1.0" array-unique "^0.3.2" extend-shallow "^2.0.1" fill-range "^4.0.0" isobject "^3.0.1" repeat-element "^1.1.2" snapdragon "^0.8.1" snapdragon-node "^2.0.1" split-string "^3.0.2" to-regex "^3.0.1" braces@^3.0.1, braces@~3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107" integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== dependencies: fill-range "^7.0.1" brorand@^1.0.1, brorand@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/brorand/-/brorand-1.1.0.tgz#12c25efe40a45e3c323eb8675a0a0ce57b22371f" integrity sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8= browser-pack-flat@^3.0.9: version "3.4.2" resolved "https://registry.yarnpkg.com/browser-pack-flat/-/browser-pack-flat-3.4.2.tgz#aa3bee87ad1aab8f7de34d4704610a5981c6cf24" integrity sha512-TrUo6n2fGSOCYFAKkt/EkgenytAuuCI88fmXFA60aNFVHvz3CZEBTXYSvvXVpU6xpjM8lj/6vkC6Exn8KPjtPw== dependencies: JSONStream "^1.3.2" combine-source-map "^0.8.0" convert-source-map "^1.5.1" count-lines "^0.1.2" dedent "^0.7.0" estree-is-member-expression "^1.0.0" estree-is-require "^1.0.0" esutils "^2.0.2" path-parse "^1.0.5" scope-analyzer "^2.0.0" stream-combiner "^0.2.2" through2 "^2.0.3" transform-ast "^2.4.2" umd "^3.0.3" wrap-comment "^1.0.0" browser-pack@^6.0.1, browser-pack@^6.0.2: version "6.1.0" resolved "https://registry.yarnpkg.com/browser-pack/-/browser-pack-6.1.0.tgz#c34ba10d0b9ce162b5af227c7131c92c2ecd5774" integrity sha512-erYug8XoqzU3IfcU8fUgyHqyOXqIE4tUTTQ+7mqUjQlvnXkOO6OlT9c/ZoJVHYoAaqGxr09CN53G7XIsO4KtWA== dependencies: JSONStream "^1.0.3" combine-source-map "~0.8.0" defined "^1.0.0" safe-buffer "^5.1.1" through2 "^2.0.0" umd "^3.0.0" browser-process-hrtime@^0.1.2: version "0.1.3" resolved "https://registry.yarnpkg.com/browser-process-hrtime/-/browser-process-hrtime-0.1.3.tgz#616f00faef1df7ec1b5bf9cfe2bdc3170f26c7b4" integrity sha512-bRFnI4NnjO6cnyLmOV/7PVoDEMJChlcfN0z4s1YMBY989/SvlfMI1lgCnkFUs53e9gQF+w7qu7XdllSTiSl8Aw== browser-resolve@^1.11.0, browser-resolve@^1.7.0: version "1.11.3" resolved "https://registry.yarnpkg.com/browser-resolve/-/browser-resolve-1.11.3.tgz#9b7cbb3d0f510e4cb86bdbd796124d28b5890af6" integrity sha512-exDi1BYWB/6raKHmDTCicQfTkqwN5fioMFV4j8BsfMU4R2DK/QfZfK7kOVkmWCNANf0snkBzqGqAJBao9gZMdQ== dependencies: resolve "1.1.7" browser-resolve@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/browser-resolve/-/browser-resolve-2.0.0.tgz#99b7304cb392f8d73dba741bb2d7da28c6d7842b" integrity sha512-7sWsQlYL2rGLy2IWm8WL8DCTJvYLc/qlOnsakDac87SOoCd16WLsaAMdCiAqsTNHIe+SXfaqyxyo6THoWqs8WQ== dependencies: resolve "^1.17.0" browser-stdout@1.3.1: version "1.3.1" resolved "https://registry.yarnpkg.com/browser-stdout/-/browser-stdout-1.3.1.tgz#baa559ee14ced73452229bad7326467c61fabd60" integrity sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw== browser-unpack@^1.1.0: version "1.4.2" resolved "https://registry.yarnpkg.com/browser-unpack/-/browser-unpack-1.4.2.tgz#7a708774dc7448df1c24a735d65d409708b95ce2" integrity sha512-uHkiY4bmXjjBBWoKH1aRnEGTQxUUCCcVtoJfH9w1lmGGjETY4u93Zk+GRYkCE/SRMrdoMTINQ/1/manr/3aMVA== dependencies: acorn-node "^1.5.2" concat-stream "^1.5.0" minimist "^1.1.1" browserify-aes@^1.0.0, browserify-aes@^1.0.4: version "1.2.0" resolved "https://registry.yarnpkg.com/browserify-aes/-/browserify-aes-1.2.0.tgz#326734642f403dabc3003209853bb70ad428ef48" integrity sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA== dependencies: buffer-xor "^1.0.3" cipher-base "^1.0.0" create-hash "^1.1.0" evp_bytestokey "^1.0.3" inherits "^2.0.1" safe-buffer "^5.0.1" browserify-cipher@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/browserify-cipher/-/browserify-cipher-1.0.1.tgz#8d6474c1b870bfdabcd3bcfcc1934a10e94f15f0" integrity sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w== dependencies: browserify-aes "^1.0.4" browserify-des "^1.0.0" evp_bytestokey "^1.0.0" browserify-des@^1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/browserify-des/-/browserify-des-1.0.2.tgz#3af4f1f59839403572f1c66204375f7a7f703e9c" integrity sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A== dependencies: cipher-base "^1.0.1" des.js "^1.0.0" inherits "^2.0.1" safe-buffer "^5.1.2" browserify-istanbul@0.1.5: version "0.1.5" resolved "https://registry.yarnpkg.com/browserify-istanbul/-/browserify-istanbul-0.1.5.tgz#01c8e31d6a358ee5150f4321c3f28995a964c39f" integrity sha1-AcjjHWo1juUVD0Mhw/KJlalkw58= dependencies: istanbul "^0.2.8" minimatch "^0.2.14" through "^2.3.4" browserify-rsa@^4.0.0, browserify-rsa@^4.0.1: version "4.1.0" resolved "https://registry.yarnpkg.com/browserify-rsa/-/browserify-rsa-4.1.0.tgz#b2fd06b5b75ae297f7ce2dc651f918f5be158c8d" integrity sha512-AdEER0Hkspgno2aR97SAf6vi0y0k8NuOpGnVH3O99rcA5Q6sh8QxcngtHuJ6uXwnfAXNM4Gn1Gb7/MV1+Ymbog== dependencies: bn.js "^5.0.0" randombytes "^2.0.1" browserify-sign@^4.0.0: version "4.2.1" resolved "https://registry.yarnpkg.com/browserify-sign/-/browserify-sign-4.2.1.tgz#eaf4add46dd54be3bb3b36c0cf15abbeba7956c3" integrity sha512-/vrA5fguVAKKAVTNJjgSm1tRQDHUU6DbwO9IROu/0WAzC8PKhucDSh18J0RMvVeHAn5puMd+QHC2erPRNf8lmg== dependencies: bn.js "^5.1.1" browserify-rsa "^4.0.1" create-hash "^1.2.0" create-hmac "^1.1.7" elliptic "^6.5.3" inherits "^2.0.4" parse-asn1 "^5.1.5" readable-stream "^3.6.0" safe-buffer "^5.2.0" browserify-zlib@~0.1.2: version "0.1.4" resolved "https://registry.yarnpkg.com/browserify-zlib/-/browserify-zlib-0.1.4.tgz#bb35f8a519f600e0fa6b8485241c979d0141fb2d" integrity sha1-uzX4pRn2AOD6a4SFJByXnQFB+y0= dependencies: pako "~0.2.0" browserify-zlib@~0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/browserify-zlib/-/browserify-zlib-0.2.0.tgz#2869459d9aa3be245fe8fe2ca1f46e2e7f54d73f" integrity sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA== dependencies: pako "~1.0.5" browserify@13.0.0: version "13.0.0" resolved "https://registry.yarnpkg.com/browserify/-/browserify-13.0.0.tgz#8f223bb24ff4ee4335e6bea9671de294e43ba6a3" integrity sha1-jyI7sk/07kM15r6pZx3ilOQ7pqM= dependencies: JSONStream "^1.0.3" assert "~1.3.0" browser-pack "^6.0.1" browser-resolve "^1.11.0" browserify-zlib "~0.1.2" buffer "^4.1.0" concat-stream "~1.5.1" console-browserify "^1.1.0" constants-browserify "~1.0.0" crypto-browserify "^3.0.0" defined "^1.0.0" deps-sort "^2.0.0" domain-browser "~1.1.0" duplexer2 "~0.1.2" events "~1.1.0" glob "^5.0.15" has "^1.0.0" htmlescape "^1.1.0" https-browserify "~0.0.0" inherits "~2.0.1" insert-module-globals "^7.0.0" isarray "0.0.1" labeled-stream-splicer "^2.0.0" module-deps "^4.0.2" os-browserify "~0.1.1" parents "^1.0.1" path-browserify "~0.0.0" process "~0.11.0" punycode "^1.3.2" querystring-es3 "~0.2.0" read-only-stream "^2.0.0" readable-stream "^2.0.2" resolve "^1.1.4" shasum "^1.0.0" shell-quote "^1.4.3" stream-browserify "^2.0.0" stream-http "^2.0.0" string_decoder "~0.10.0" subarg "^1.0.0" syntax-error "^1.1.1" through2 "^2.0.0" timers-browserify "^1.0.1" tty-browserify "~0.0.0" url "~0.11.0" util "~0.10.1" vm-browserify "~0.0.1" xtend "^4.0.0" browserify@^13.0.0: version "13.3.0" resolved "https://registry.yarnpkg.com/browserify/-/browserify-13.3.0.tgz#b5a9c9020243f0c70e4675bec8223bc627e415ce" integrity sha1-tanJAgJD8McORnW+yCI7xifkFc4= dependencies: JSONStream "^1.0.3" assert "^1.4.0" browser-pack "^6.0.1" browser-resolve "^1.11.0" browserify-zlib "~0.1.2" buffer "^4.1.0" cached-path-relative "^1.0.0" concat-stream "~1.5.1" console-browserify "^1.1.0" constants-browserify "~1.0.0" crypto-browserify "^3.0.0" defined "^1.0.0" deps-sort "^2.0.0" domain-browser "~1.1.0" duplexer2 "~0.1.2" events "~1.1.0" glob "^7.1.0" has "^1.0.0" htmlescape "^1.1.0" https-browserify "~0.0.0" inherits "~2.0.1" insert-module-globals "^7.0.0" labeled-stream-splicer "^2.0.0" module-deps "^4.0.8" os-browserify "~0.1.1" parents "^1.0.1" path-browserify "~0.0.0" process "~0.11.0" punycode "^1.3.2" querystring-es3 "~0.2.0" read-only-stream "^2.0.0" readable-stream "^2.0.2" resolve "^1.1.4" shasum "^1.0.0" shell-quote "^1.6.1" stream-browserify "^2.0.0" stream-http "^2.0.0" string_decoder "~0.10.0" subarg "^1.0.0" syntax-error "^1.1.1" through2 "^2.0.0" timers-browserify "^1.0.1" tty-browserify "~0.0.0" url "~0.11.0" util "~0.10.1" vm-browserify "~0.0.1" xtend "^4.0.0" browserify@^17.0.0: version "17.0.0" resolved "https://registry.yarnpkg.com/browserify/-/browserify-17.0.0.tgz#4c48fed6c02bfa2b51fd3b670fddb805723cdc22" integrity sha512-SaHqzhku9v/j6XsQMRxPyBrSP3gnwmE27gLJYZgMT2GeK3J0+0toN+MnuNYDfHwVGQfLiMZ7KSNSIXHemy905w== dependencies: JSONStream "^1.0.3" assert "^1.4.0" browser-pack "^6.0.1" browser-resolve "^2.0.0" browserify-zlib "~0.2.0" buffer "~5.2.1" cached-path-relative "^1.0.0" concat-stream "^1.6.0" console-browserify "^1.1.0" constants-browserify "~1.0.0" crypto-browserify "^3.0.0" defined "^1.0.0" deps-sort "^2.0.1" domain-browser "^1.2.0" duplexer2 "~0.1.2" events "^3.0.0" glob "^7.1.0" has "^1.0.0" htmlescape "^1.1.0" https-browserify "^1.0.0" inherits "~2.0.1" insert-module-globals "^7.2.1" labeled-stream-splicer "^2.0.0" mkdirp-classic "^0.5.2" module-deps "^6.2.3" os-browserify "~0.3.0" parents "^1.0.1" path-browserify "^1.0.0" process "~0.11.0" punycode "^1.3.2" querystring-es3 "~0.2.0" read-only-stream "^2.0.0" readable-stream "^2.0.2" resolve "^1.1.4" shasum-object "^1.0.0" shell-quote "^1.6.1" stream-browserify "^3.0.0" stream-http "^3.0.0" string_decoder "^1.1.1" subarg "^1.0.0" syntax-error "^1.1.1" through2 "^2.0.0" timers-browserify "^1.0.1" tty-browserify "0.0.1" url "~0.11.0" util "~0.12.0" vm-browserify "^1.0.0" xtend "^4.0.0" browserslist@^4.16.8, browserslist@^4.17.5, browserslist@^4.19.1: version "4.19.1" resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.19.1.tgz#4ac0435b35ab655896c31d53018b6dd5e9e4c9a3" integrity sha512-u2tbbG5PdKRTUoctO3NBD8FQ5HdPh1ZXPHzp1rwaa5jTc+RV9/+RlWiAIKmjRPQF+xbGM9Kklj5bZQFa2s/38A== dependencies: caniuse-lite "^1.0.30001286" electron-to-chromium "^1.4.17" escalade "^3.1.1" node-releases "^2.0.1" picocolors "^1.0.0" buffer-crc32@0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/buffer-crc32/-/buffer-crc32-0.2.1.tgz#be3e5382fc02b6d6324956ac1af98aa98b08534c" integrity sha1-vj5TgvwCttYySVasGvmKqYsIU0w= buffer-crc32@~0.2.1: version "0.2.13" resolved "https://registry.yarnpkg.com/buffer-crc32/-/buffer-crc32-0.2.13.tgz#0d333e3f00eac50aa1454abd30ef8c2a5d9a7242" integrity sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI= buffer-from@^1.0.0: version "1.1.2" resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.2.tgz#2b146a6fd72e80b4f55d255f35ed59a3a9a41bd5" integrity sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ== buffer-xor@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/buffer-xor/-/buffer-xor-1.0.3.tgz#26e61ed1422fb70dd42e6e36729ed51d855fe8d9" integrity sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk= buffer@^4.1.0: version "4.9.2" resolved "https://registry.yarnpkg.com/buffer/-/buffer-4.9.2.tgz#230ead344002988644841ab0244af8c44bbe3ef8" integrity sha512-xq+q3SRMOxGivLhBNaUdC64hDTQwejJ+H0T/NB1XMtTVEwNTrfFF3gAxiyW0Bu/xWEGhjVKgUcMhCrUy2+uCWg== dependencies: base64-js "^1.0.2" ieee754 "^1.1.4" isarray "^1.0.0" buffer@~5.2.1: version "5.2.1" resolved "https://registry.yarnpkg.com/buffer/-/buffer-5.2.1.tgz#dd57fa0f109ac59c602479044dca7b8b3d0b71d6" integrity sha512-c+Ko0loDaFfuPWiL02ls9Xd3GO3cPVmUobQ6t3rXNUk304u6hGq+8N/kFi+QEIKhzK3uwolVhLzszmfLmMLnqg== dependencies: base64-js "^1.0.2" ieee754 "^1.1.4" builtin-modules@^3.0.0: version "3.2.0" resolved "https://registry.yarnpkg.com/builtin-modules/-/builtin-modules-3.2.0.tgz#45d5db99e7ee5e6bc4f362e008bf917ab5049887" integrity sha512-lGzLKcioL90C7wMczpkY0n/oART3MbBa8R9OFGE1rJxoVI86u4WAGfEk8Wjv10eKSyTHVGkSo3bvBylCEtk7LA== builtin-status-codes@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz#85982878e21b98e1c66425e03d0174788f569ee8" integrity sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug= builtins@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/builtins/-/builtins-4.0.0.tgz#a8345420de82068fdc4d6559d0456403a8fb1905" integrity sha512-qC0E2Dxgou1IHhvJSLwGDSTvokbRovU5zZFuDY6oY8Y2lF3nGt5Ad8YZK7GMtqzY84Wu7pXTPeHQeHcXSXsRhw== dependencies: semver "^7.0.0" bundle-collapser@^1.3.0: version "1.4.0" resolved "https://registry.yarnpkg.com/bundle-collapser/-/bundle-collapser-1.4.0.tgz#c6e5c1104e91865b5158e91053b38788f50aa1d7" integrity sha512-Gd3K3+3KI1Utuk+gwAvuOVOjT/2XLGL8tU6FwDKk04LlOZkYfT0pwQllsG1Dv8RRhgcjNxZSDmmSXb0AOkwSwg== dependencies: browser-pack "^6.0.2" browser-unpack "^1.1.0" concat-stream "^1.5.0" falafel "^2.1.0" minimist "^1.1.1" through2 "^2.0.0" busboy@^0.2.11: version "0.2.14" resolved "https://registry.yarnpkg.com/busboy/-/busboy-0.2.14.tgz#6c2a622efcf47c57bbbe1e2a9c37ad36c7925453" integrity sha1-bCpiLvz0fFe7vh4qnDetNseSVFM= dependencies: dicer "0.2.5" readable-stream "1.1.x" bytes@0.2.1, bytes@~0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/bytes/-/bytes-0.2.1.tgz#555b08abcb063f8975905302523e4cd4ffdfdf31" integrity sha1-VVsIq8sGP4l1kFMCUj5M1P/f3zE= bytes@1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/bytes/-/bytes-1.0.0.tgz#3569ede8ba34315fab99c3e92cb04c7220de1fa8" integrity sha1-NWnt6Lo0MV+rmcPpLLBMciDeH6g= bytes@2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/bytes/-/bytes-2.1.0.tgz#ac93c410e2ffc9cc7cf4b464b38289067f5e47b4" integrity sha1-rJPEEOL/ycx89LRks4KJBn9eR7Q= bytes@3.1.1: version "3.1.1" resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.1.1.tgz#3f018291cb4cbad9accb6e6970bca9c8889e879a" integrity sha512-dWe4nWO/ruEOY7HkUJ5gFt1DCFV9zPRoJr8pV0/ASQermOZjtq8jMjOprC0Kd10GLN+l7xaUPvxzJFWtxGu8Fg== cache-base@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/cache-base/-/cache-base-1.0.1.tgz#0a7f46416831c8b662ee36fe4e7c59d76f666ab2" integrity sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ== dependencies: collection-visit "^1.0.0" component-emitter "^1.2.1" get-value "^2.0.6" has-value "^1.0.0" isobject "^3.0.1" set-value "^2.0.0" to-object-path "^0.3.0" union-value "^1.0.0" unset-value "^1.0.0" cached-path-relative@^1.0.0, cached-path-relative@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/cached-path-relative/-/cached-path-relative-1.0.2.tgz#a13df4196d26776220cc3356eb147a52dba2c6db" integrity sha512-5r2GqsoEb4qMTTN9J+WzXfjov+hjxT+j3u5K+kIVNIwAd99DLCJE9pBIMP1qVeybV6JiijL385Oz0DcYxfbOIg== caching-transform@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/caching-transform/-/caching-transform-4.0.0.tgz#00d297a4206d71e2163c39eaffa8157ac0651f0f" integrity sha512-kpqOvwXnjjN44D89K5ccQC+RUrsy7jB/XLlRrx0D7/2HNcTPqzsb6XgYoErwko6QsV184CA2YgS1fxDiiDZMWA== dependencies: hasha "^5.0.0" make-dir "^3.0.0" package-hash "^4.0.0" write-file-atomic "^3.0.0" call-bind@^1.0.0, call-bind@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.2.tgz#b1d4e89e688119c3c9a903ad30abb2f6a919be3c" integrity sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA== dependencies: function-bind "^1.1.1" get-intrinsic "^1.0.2" call-matcher@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/call-matcher/-/call-matcher-2.0.0.tgz#a38bee4e9ddbeec76aa31cc20311085a34dd395b" integrity sha512-CIDC5wZZfZ2VjZu849WQckS58Z3pJXFfRaSjNjgo/q3in5zxkhTwVL83vttgtmvyLG7TuDlLlBya7SKP6CjDIA== dependencies: deep-equal "^1.0.0" espurify "^2.0.0" estraverse "^4.0.0" callsites@^3.0.0: version "3.1.0" resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== camelcase-keys@^6.2.2: version "6.2.2" resolved "https://registry.yarnpkg.com/camelcase-keys/-/camelcase-keys-6.2.2.tgz#5e755d6ba51aa223ec7d3d52f25778210f9dc3c0" integrity sha512-YrwaA0vEKazPBkn0ipTiMpSajYDSe+KjQfrjhcBMxJt/znbvlHd8Pw/Vamaz5EB4Wfhs3SUR3Z9mwRu/P3s3Yg== dependencies: camelcase "^5.3.1" map-obj "^4.0.0" quick-lru "^4.0.1" camelcase-keys@^7.0.0: version "7.0.1" resolved "https://registry.yarnpkg.com/camelcase-keys/-/camelcase-keys-7.0.1.tgz#5a57e6dfb3f6c7929dad15599ee4476a7e9a3b2d" integrity sha512-P331lEls98pW8JLyodNWfzuz91BEDVA4VpW2/SwXnyv2K495tq1N777xzDbFgnEigfA7UIY0xa6PwR/H9jijjA== dependencies: camelcase "^6.2.0" map-obj "^4.1.0" quick-lru "^5.1.1" type-fest "^1.2.1" camelcase@^5.0.0, camelcase@^5.3.1: version "5.3.1" resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320" integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg== camelcase@^6.0.0, camelcase@^6.2.0: version "6.3.0" resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-6.3.0.tgz#5685b95eb209ac9c0c177467778c9c84df58ba9a" integrity sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA== caniuse-lite@^1.0.30001267, caniuse-lite@^1.0.30001286: version "1.0.30001296" resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001296.tgz#d99f0f3bee66544800b93d261c4be55a35f1cec8" integrity sha512-WfrtPEoNSoeATDlf4y3QvkwiELl9GyPLISV5GejTbbQRtQx4LhsXmc9IQ6XCL2d7UxCyEzToEZNMeqR79OUw8Q== caseless@~0.6.0: version "0.6.0" resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.6.0.tgz#8167c1ab8397fb5bb95f96d28e5a81c50f247ac4" integrity sha1-gWfBq4OX+1u5X5bSjlqBxQ8kesQ= ccount@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/ccount/-/ccount-1.1.0.tgz#246687debb6014735131be8abab2d93898f8d043" integrity sha512-vlNK021QdI7PNeiUh/lKkC/mNHHfV0m/Ad5JoI0TYtlBnJAslM/JIkm/tGC88bkLIwO6OQ5uV6ztS6kVAtCDlg== chalk@^1.1.3: version "1.1.3" resolved "https://registry.yarnpkg.com/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98" integrity sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg= dependencies: ansi-styles "^2.2.1" escape-string-regexp "^1.0.2" has-ansi "^2.0.0" strip-ansi "^3.0.0" supports-color "^2.0.0" chalk@^2.0.0, chalk@^2.0.1: version "2.4.2" resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== dependencies: ansi-styles "^3.2.1" escape-string-regexp "^1.0.5" supports-color "^5.3.0" chalk@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/chalk/-/chalk-3.0.0.tgz#3f73c2bf526591f574cc492c51e2456349f844e4" integrity sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg== dependencies: ansi-styles "^4.1.0" supports-color "^7.1.0" chalk@^4.0.0, chalk@^4.1.0: version "4.1.2" resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== dependencies: ansi-styles "^4.1.0" supports-color "^7.1.0" char-split@0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/char-split/-/char-split-0.2.0.tgz#8755eda641e5db277dd0f509b517c827e50a8edf" integrity sha1-h1XtpkHl2yd90PUJtRfIJ+UKjt8= dependencies: through "2.3.4" character-entities-legacy@^1.0.0: version "1.1.4" resolved "https://registry.yarnpkg.com/character-entities-legacy/-/character-entities-legacy-1.1.4.tgz#94bc1845dce70a5bb9d2ecc748725661293d8fc1" integrity sha512-3Xnr+7ZFS1uxeiUDvV02wQ+QDbc55o97tIV5zHScSPJpcLm/r0DFPcoY3tYRp+VZukxuMeKgXYmsXQHO05zQeA== character-entities@^1.0.0: version "1.2.4" resolved "https://registry.yarnpkg.com/character-entities/-/character-entities-1.2.4.tgz#e12c3939b7eaf4e5b15e7ad4c5e28e1d48c5b16b" integrity sha512-iBMyeEHxfVnIakwOuDXpVkc54HijNgCyQB2w0VfGQThle6NXn50zU6V/u+LDhxHcDUPojn6Kpga3PTAD8W1bQw== character-entities@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/character-entities/-/character-entities-2.0.1.tgz#98724833e1e27990dee0bd0f2b8a859c3476aac7" integrity sha512-OzmutCf2Kmc+6DrFrrPS8/tDh2+DpnrfzdICHWhcVC9eOd0N1PXmQEE1a8iM4IziIAG+8tmTq3K+oo0ubH6RRQ== character-reference-invalid@^1.0.0: version "1.1.4" resolved "https://registry.yarnpkg.com/character-reference-invalid/-/character-reference-invalid-1.1.4.tgz#083329cda0eae272ab3dbbf37e9a382c13af1560" integrity sha512-mKKUkUbhPpQlCOfIuZkvSEgktjPFIsZKRRbC6KWVEMvlzblj3i3asQv5ODsrwt0N3pHAEvjP8KTQPHkp0+6jOg== chokidar@^1.0.0: version "1.7.0" resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-1.7.0.tgz#798e689778151c8076b4b360e5edd28cda2bb468" integrity sha1-eY5ol3gVHIB2tLNg5e3SjNortGg= dependencies: anymatch "^1.3.0" async-each "^1.0.0" glob-parent "^2.0.0" inherits "^2.0.1" is-binary-path "^1.0.0" is-glob "^2.0.0" path-is-absolute "^1.0.0" readdirp "^2.0.0" optionalDependencies: fsevents "^1.0.0" chokidar@^3.0.0, chokidar@^3.4.0: version "3.5.2" resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.5.2.tgz#dba3976fcadb016f66fd365021d91600d01c1e75" integrity sha512-ekGhOnNVPgT77r4K/U3GDhu+FQ2S8TnK/s2KbIGXi0SZWuwkZ2QNyfWdZW+TVfn84DpEP7rLeCt2UI6bJ8GwbQ== dependencies: anymatch "~3.1.2" braces "~3.0.2" glob-parent "~5.1.2" is-binary-path "~2.1.0" is-glob "~4.0.1" normalize-path "~3.0.0" readdirp "~3.6.0" optionalDependencies: fsevents "~2.3.2" ci-info@^3.2.0: version "3.3.0" resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-3.3.0.tgz#b4ed1fb6818dea4803a55c623041f9165d2066b2" integrity sha512-riT/3vI5YpVH6/qomlDnJow6TBee2PBKSEpx3O32EGPYbWGIRsIlGRms3Sm74wYE1JMo8RnO04Hb12+v1J5ICw== cipher-base@^1.0.0, cipher-base@^1.0.1, cipher-base@^1.0.3: version "1.0.4" resolved "https://registry.yarnpkg.com/cipher-base/-/cipher-base-1.0.4.tgz#8760e4ecc272f4c363532f926d874aae2c1397de" integrity sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q== dependencies: inherits "^2.0.1" safe-buffer "^5.0.1" class-utils@^0.3.5: version "0.3.6" resolved "https://registry.yarnpkg.com/class-utils/-/class-utils-0.3.6.tgz#f93369ae8b9a7ce02fd41faad0ca83033190c463" integrity sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg== dependencies: arr-union "^3.1.0" define-property "^0.2.5" isobject "^3.0.0" static-extend "^0.1.1" clean-regexp@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/clean-regexp/-/clean-regexp-1.0.0.tgz#8df7c7aae51fd36874e8f8d05b9180bc11a3fed7" integrity sha1-jffHquUf02h06PjQW5GAvBGj/tc= dependencies: escape-string-regexp "^1.0.5" clean-stack@^2.0.0: version "2.2.0" resolved "https://registry.yarnpkg.com/clean-stack/-/clean-stack-2.2.0.tgz#ee8472dbb129e727b31e8a10a427dee9dfe4008b" integrity sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A== cli-cursor@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-3.1.0.tgz#264305a7ae490d1d03bf0c9ba7c925d1753af307" integrity sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw== dependencies: restore-cursor "^3.1.0" cli-truncate@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/cli-truncate/-/cli-truncate-2.1.0.tgz#c39e28bf05edcde5be3b98992a22deed5a2b93c7" integrity sha512-n8fOixwDD6b/ObinzTrp1ZKFzbgvKZvuz/TvejnLn1aQfC6r52XEx85FmuC+3HI+JM7coBRXUvNqEU2PHVrHpg== dependencies: slice-ansi "^3.0.0" string-width "^4.2.0" cli-truncate@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/cli-truncate/-/cli-truncate-3.1.0.tgz#3f23ab12535e3d73e839bb43e73c9de487db1389" integrity sha512-wfOBkjXteqSnI59oPcJkcPl/ZmwvMMOj340qUIY1SKZCv0B9Cf4D4fAucRkIKQmsIuYK3x1rrgU7MeGRruiuiA== dependencies: slice-ansi "^5.0.0" string-width "^5.0.0" cliui@^5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/cliui/-/cliui-5.0.0.tgz#deefcfdb2e800784aa34f46fa08e06851c7bbbc5" integrity sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA== dependencies: string-width "^3.1.0" strip-ansi "^5.2.0" wrap-ansi "^5.1.0" cliui@^6.0.0: version "6.0.0" resolved "https://registry.yarnpkg.com/cliui/-/cliui-6.0.0.tgz#511d702c0c4e41ca156d7d0e96021f23e13225b1" integrity sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ== dependencies: string-width "^4.2.0" strip-ansi "^6.0.0" wrap-ansi "^6.2.0" cliui@^7.0.2: version "7.0.4" resolved "https://registry.yarnpkg.com/cliui/-/cliui-7.0.4.tgz#a0265ee655476fc807aea9df3df8df7783808b4f" integrity sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ== dependencies: string-width "^4.2.0" strip-ansi "^6.0.0" wrap-ansi "^7.0.0" co@3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/co/-/co-3.1.0.tgz#4ea54ea5a08938153185e15210c68d9092bc1b78" integrity sha1-TqVOpaCJOBUxheFSEMaNkJK8G3g= codecov@^3.8.3: version "3.8.3" resolved "https://registry.yarnpkg.com/codecov/-/codecov-3.8.3.tgz#9c3e364b8a700c597346ae98418d09880a3fdbe7" integrity sha512-Y8Hw+V3HgR7V71xWH2vQ9lyS358CbGCldWlJFR0JirqoGtOoas3R3/OclRTvgUYFK29mmJICDPauVKmpqbwhOA== dependencies: argv "0.0.2" ignore-walk "3.0.4" js-yaml "3.14.1" teeny-request "7.1.1" urlgrey "1.0.0" collapse-white-space@^1.0.4: version "1.0.6" resolved "https://registry.yarnpkg.com/collapse-white-space/-/collapse-white-space-1.0.6.tgz#e63629c0016665792060dbbeb79c42239d2c5287" integrity sha512-jEovNnrhMuqyCcjfEJA56v0Xq8SkIoPKDyaHahwo3POf4qcSXqMYuwNcOTzp74vTsR9Tn08z4MxWqAhcekogkQ== collection-visit@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/collection-visit/-/collection-visit-1.0.0.tgz#4bc0373c164bc3291b4d368c829cf1a80a59dca0" integrity sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA= dependencies: map-visit "^1.0.0" object-visit "^1.0.0" color-convert@^1.9.0: version "1.9.3" resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== dependencies: color-name "1.1.3" color-convert@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== dependencies: color-name "~1.1.4" color-name@1.1.3: version "1.1.3" resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" integrity sha1-p9BVi9icQveV3UIyj3QIMcpTvCU= color-name@~1.1.4: version "1.1.4" resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== colorette@^2.0.16: version "2.0.16" resolved "https://registry.yarnpkg.com/colorette/-/colorette-2.0.16.tgz#713b9af84fdb000139f04546bd4a93f62a5085da" integrity sha512-hUewv7oMjCp+wkBv5Rm0v87eJhq4woh5rSR+42YSQJKecCqgIqNkZ6lAlQms/BwHPJA5NKMRlpxPRv0n8HQW6g== colors@0.6.2: version "0.6.2" resolved "https://registry.yarnpkg.com/colors/-/colors-0.6.2.tgz#2423fe6678ac0c5dae8852e5d0e5be08c997abcc" integrity sha1-JCP+ZnisDF2uiFLl0OW+CMmXq8w= combine-source-map@^0.8.0, combine-source-map@~0.8.0: version "0.8.0" resolved "https://registry.yarnpkg.com/combine-source-map/-/combine-source-map-0.8.0.tgz#a58d0df042c186fcf822a8e8015f5450d2d79a8b" integrity sha1-pY0N8ELBhvz4IqjoAV9UUNLXmos= dependencies: convert-source-map "~1.1.0" inline-source-map "~0.6.0" lodash.memoize "~3.0.3" source-map "~0.5.3" combined-stream@^1.0.8: version "1.0.8" resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f" integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg== dependencies: delayed-stream "~1.0.0" combined-stream@~0.0.4: version "0.0.7" resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-0.0.7.tgz#0137e657baa5a7541c57ac37ac5fc07d73b4dc1f" integrity sha1-ATfmV7qlp1QcV6w3rF/AfXO03B8= dependencies: delayed-stream "0.0.5" commander@1.3.2: version "1.3.2" resolved "https://registry.yarnpkg.com/commander/-/commander-1.3.2.tgz#8a8f30ec670a6fdd64af52f1914b907d79ead5b5" integrity sha1-io8w7GcKb91kr1LxkUuQfXnq1bU= dependencies: keypress "0.1.x" commander@2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/commander/-/commander-2.1.0.tgz#d121bbae860d9992a3d517ba96f56588e47c6781" integrity sha1-0SG7roYNmZKj1Re6lvVliOR8Z4E= commander@^2.19.0, commander@^2.20.0: version "2.20.3" resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33" integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ== commander@^4.0.1: version "4.1.1" resolved "https://registry.yarnpkg.com/commander/-/commander-4.1.1.tgz#9fd602bd936294e9e9ef46a3f4d6964044b18068" integrity sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA== commander@^8.3.0: version "8.3.0" resolved "https://registry.yarnpkg.com/commander/-/commander-8.3.0.tgz#4837ea1b2da67b9c616a67afbb0fafee567bca66" integrity sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww== common-shakeify@^0.6.0: version "0.6.2" resolved "https://registry.yarnpkg.com/common-shakeify/-/common-shakeify-0.6.2.tgz#4663fe5ccda665d11ee4c77368b079a7df033d29" integrity sha512-vxlXr26fqxm8ZJ0jh8MlvpeN6IbyUKqsVmgb4rAjDM/0f4nKebiHaAXpF/Mm86W9ENR5iSI7UOnUTylpVyplUA== dependencies: "@goto-bus-stop/common-shake" "^2.2.0" convert-source-map "^1.5.1" through2 "^2.0.3" transform-ast "^2.4.3" wrap-comment "^1.0.1" commondir@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/commondir/-/commondir-1.0.1.tgz#ddd800da0c66127393cca5950ea968a3aaf1253b" integrity sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs= compare-func@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/compare-func/-/compare-func-2.0.0.tgz#fb65e75edbddfd2e568554e8b5b05fff7a51fcb3" integrity sha512-zHig5N+tPWARooBnb0Zx1MFcdfpyJrfTJ3Y5L+IFvUm8rM74hHz66z0gw0x4tijh5CorKkKUCnW82R2vmpeCRA== dependencies: array-ify "^1.0.0" dot-prop "^5.1.0" component-emitter@^1.2.1, component-emitter@^1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.3.0.tgz#16e4070fba8ae29b679f2215853ee181ab2eabc0" integrity sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg== compress-commons@~0.1.0: version "0.1.6" resolved "https://registry.yarnpkg.com/compress-commons/-/compress-commons-0.1.6.tgz#0c740870fde58cba516f0ac0c822e33a0b85dfa3" integrity sha1-DHQIcP3ljLpRbwrAyCLjOguF36M= dependencies: buffer-crc32 "~0.2.1" crc32-stream "~0.3.1" readable-stream "~1.0.26" compress-commons@~0.2.0: version "0.2.9" resolved "https://registry.yarnpkg.com/compress-commons/-/compress-commons-0.2.9.tgz#422d927430c01abd06cd455b6dfc04cb4cf8003c" integrity sha1-Qi2SdDDAGr0GzUVbbfwEy0z4ADw= dependencies: buffer-crc32 "~0.2.1" crc32-stream "~0.3.1" node-int64 "~0.3.0" readable-stream "~1.0.26" compressible@~2.0.3: version "2.0.18" resolved "https://registry.yarnpkg.com/compressible/-/compressible-2.0.18.tgz#af53cca6b070d4c3c0750fbd77286a6d7cc46fba" integrity sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg== dependencies: mime-db ">= 1.43.0 < 2" compression@1.5.0: version "1.5.0" resolved "https://registry.yarnpkg.com/compression/-/compression-1.5.0.tgz#ccc1a54788da1b3ad7729c49f6a00b3ac9adf47f" integrity sha1-zMGlR4jaGzrXcpxJ9qALOsmt9H8= dependencies: accepts "~1.2.9" bytes "2.1.0" compressible "~2.0.3" debug "~2.2.0" on-headers "~1.0.0" vary "~1.0.0" concat-map@0.0.1: version "0.0.1" resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s= concat-stream@^1.5.0, concat-stream@^1.5.2, concat-stream@^1.6.0, concat-stream@^1.6.1, concat-stream@~1.6.0: version "1.6.2" resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.6.2.tgz#904bdf194cd3122fc675c77fc4ac3d4ff0fd1a34" integrity sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw== dependencies: buffer-from "^1.0.0" inherits "^2.0.3" readable-stream "^2.2.2" typedarray "^0.0.6" concat-stream@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-2.0.0.tgz#414cf5af790a48c60ab9be4527d56d5e41133cb1" integrity sha512-MWufYdFw53ccGjCA+Ol7XJYpAlW6/prSMzuPOTRnJGcGzuhLn4Scrz7qf6o8bROZ514ltazcIFJZevcfbo0x7A== dependencies: buffer-from "^1.0.0" inherits "^2.0.3" readable-stream "^3.0.2" typedarray "^0.0.6" concat-stream@~1.5.0, concat-stream@~1.5.1: version "1.5.2" resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.5.2.tgz#708978624d856af41a5a741defdd261da752c266" integrity sha1-cIl4Yk2FavQaWnQd790mHadSwmY= dependencies: inherits "~2.0.1" readable-stream "~2.0.0" typedarray "~0.0.5" confusing-browser-globals@1.0.10: version "1.0.10" resolved "https://registry.yarnpkg.com/confusing-browser-globals/-/confusing-browser-globals-1.0.10.tgz#30d1e7f3d1b882b25ec4933d1d1adac353d20a59" integrity sha512-gNld/3lySHwuhaVluJUKLePYirM3QNCKzVxqAdhJII9/WXKVX5PURzMVJspS1jTslSqjeuG4KMVTSouit5YPHA== connect@2.12.0: version "2.12.0" resolved "https://registry.yarnpkg.com/connect/-/connect-2.12.0.tgz#31d8fa0dcacdf1908d822bd2923be8a2d2a7ed9a" integrity sha1-Mdj6DcrN8ZCNgivSkjvootKn7Zo= dependencies: batch "0.5.0" buffer-crc32 "0.2.1" bytes "0.2.1" cookie "0.1.0" cookie-signature "1.0.1" debug ">= 0.7.3 < 1" fresh "0.2.0" methods "0.1.0" multiparty "2.2.0" negotiator "0.3.0" pause "0.0.1" qs "0.6.6" raw-body "1.1.2" send "0.1.4" uid2 "0.0.3" console-browserify@^1.1.0: version "1.2.0" resolved "https://registry.yarnpkg.com/console-browserify/-/console-browserify-1.2.0.tgz#67063cef57ceb6cf4993a2ab3a55840ae8c49336" integrity sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA== constants-browserify@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/constants-browserify/-/constants-browserify-1.0.0.tgz#c20b96d8c617748aaf1c16021760cd27fcb8cb75" integrity sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U= content-disposition@0.5.4: version "0.5.4" resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.4.tgz#8b82b4efac82512a02bb0b1dcec9d2c5e8eb5bfe" integrity sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ== dependencies: safe-buffer "5.2.1" content-type@^1.0.2, content-type@~1.0.1, content-type@~1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.4.tgz#e138cc75e040c727b1966fe5e5f8c9aee256fe3b" integrity sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA== conventional-changelog-angular@^5.0.11: version "5.0.13" resolved "https://registry.yarnpkg.com/conventional-changelog-angular/-/conventional-changelog-angular-5.0.13.tgz#896885d63b914a70d4934b59d2fe7bde1832b28c" integrity sha512-i/gipMxs7s8L/QeuavPF2hLnJgH6pEZAttySB6aiQLWcX3puWDL3ACVmvBhJGxnAy52Qc15ua26BufY6KpmrVA== dependencies: compare-func "^2.0.0" q "^1.5.1" conventional-changelog-conventionalcommits@^4.3.1: version "4.6.3" resolved "https://registry.yarnpkg.com/conventional-changelog-conventionalcommits/-/conventional-changelog-conventionalcommits-4.6.3.tgz#0765490f56424b46f6cb4db9135902d6e5a36dc2" integrity sha512-LTTQV4fwOM4oLPad317V/QNQ1FY4Hju5qeBIM1uTHbrnCE+Eg4CdRZ3gO2pUeR+tzWdp80M2j3qFFEDWVqOV4g== dependencies: compare-func "^2.0.0" lodash "^4.17.15" q "^1.5.1" conventional-commits-parser@^3.2.2: version "3.2.4" resolved "https://registry.yarnpkg.com/conventional-commits-parser/-/conventional-commits-parser-3.2.4.tgz#a7d3b77758a202a9b2293d2112a8d8052c740972" integrity sha512-nK7sAtfi+QXbxHCYfhpZsfRtaitZLIA6889kFIouLvz6repszQDgxBu7wf2WbU+Dco7sAnNCJYERCwt54WPC2Q== dependencies: JSONStream "^1.0.4" is-text-path "^1.0.1" lodash "^4.17.15" meow "^8.0.0" split2 "^3.0.0" through2 "^4.0.0" convert-source-map@1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.0.0.tgz#dbdcb69523d3af582f7b5c94b3c25ecf2f3b7355" integrity sha1-29y2lSPTr1gve1yUs8Jezy87c1U= convert-source-map@^1.1.0, convert-source-map@^1.1.1, convert-source-map@^1.5.0, convert-source-map@^1.5.1, convert-source-map@^1.7.0: version "1.8.0" resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.8.0.tgz#f3373c32d21b4d780dd8004514684fb791ca4369" integrity sha512-+OQdjP49zViI/6i7nIJpA8rAl4sV/JdPfU9nZs3VqOwGIgizICvuN2ru6fMd+4llL0tar18UYJXfZ/TWtmhUjA== dependencies: safe-buffer "~5.1.1" convert-source-map@~1.1.0: version "1.1.3" resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.1.3.tgz#4829c877e9fe49b3161f3bf3673888e204699860" integrity sha1-SCnId+n+SbMWHzvzZziI4gRpmGA= cookie-parser@^1.4.6: version "1.4.6" resolved "https://registry.yarnpkg.com/cookie-parser/-/cookie-parser-1.4.6.tgz#3ac3a7d35a7a03bbc7e365073a26074824214594" integrity sha512-z3IzaNjdwUC2olLIB5/ITd0/setiaFMLYiZJle7xg5Fe9KWAceil7xszYfHHBtDFYLSgJduS2Ty0P1uJdPDJeA== dependencies: cookie "0.4.1" cookie-signature "1.0.6" cookie-signature@1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.0.1.tgz#44e072148af01e6e8e24afbf12690d68ae698ecb" integrity sha1-ROByFIrwHm6OJK+/EmkNaK5pjss= cookie-signature@1.0.6: version "1.0.6" resolved "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.0.6.tgz#e303a882b342cc3ee8ca513a79999734dab3ae2c" integrity sha1-4wOogrNCzD7oylE6eZmXNNqzriw= cookie@0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.1.0.tgz#90eb469ddce905c866de687efc43131d8801f9d0" integrity sha1-kOtGndzpBchm3mh+/EMTHYgB+dA= cookie@0.4.1: version "0.4.1" resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.4.1.tgz#afd713fe26ebd21ba95ceb61f9a8116e50a537d1" integrity sha512-ZwrFkGJxUR3EIoXtO+yVE69Eb7KlixbaeAWfBQB9vVsNn/o+Yw69gBWSSDK825hQNdN+wF8zELf3dFNl/kxkUA== cookiejar@1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/cookiejar/-/cookiejar-1.3.0.tgz#dd00b35679021e99cbd4e855b9ad041913474765" integrity sha1-3QCzVnkCHpnL1OhVua0EGRNHR2U= cookiejar@^2.1.3: version "2.1.3" resolved "https://registry.yarnpkg.com/cookiejar/-/cookiejar-2.1.3.tgz#fc7a6216e408e74414b90230050842dacda75acc" integrity sha512-JxbCBUdrfr6AQjOXrxoTvAMJO4HBTUIlBzslcJPAz+/KT8yk53fXun51u+RenNYvad/+Vc2DIz5o9UxlCDymFQ== copy-descriptor@^0.1.0: version "0.1.1" resolved "https://registry.yarnpkg.com/copy-descriptor/-/copy-descriptor-0.1.1.tgz#676f6eb3c39997c2ee1ac3a924fd6124748f578d" integrity sha1-Z29us8OZl8LuGsOpJP1hJHSPV40= core-js-compat@^3.18.0, core-js-compat@^3.19.1: version "3.20.2" resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.20.2.tgz#d1ff6936c7330959b46b2e08b122a8b14e26140b" integrity sha512-qZEzVQ+5Qh6cROaTPFLNS4lkvQ6mBzE3R6A6EEpssj7Zr2egMHgsy4XapdifqJDGC9CBiNv7s+ejI96rLNQFdg== dependencies: browserslist "^4.19.1" semver "7.0.0" core-js@^3.16.2: version "3.20.2" resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.20.2.tgz#46468d8601eafc8b266bd2dd6bf9dee622779581" integrity sha512-nuqhq11DcOAbFBV4zCbKeGbKQsUDRqTX0oqx7AttUBuqe3h20ixsE039QHelbL6P4h+9kytVqyEtyZ6gsiwEYw== core-util-is@~1.0.0: version "1.0.3" resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.3.tgz#a6042d3634c2b27e9328f837b965fac83808db85" integrity sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ== cosmiconfig@^7.0.0, cosmiconfig@^7.0.1: version "7.0.1" resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-7.0.1.tgz#714d756522cace867867ccb4474c5d01bbae5d6d" integrity sha512-a1YWNUV2HwGimB7dU2s1wUMurNKjpx60HxBB6xUM8Re+2s1g1IIfJvFR0/iCF+XHdE0GMTKTuLR32UQff4TEyQ== dependencies: "@types/parse-json" "^4.0.0" import-fresh "^3.2.1" parse-json "^5.0.0" path-type "^4.0.0" yaml "^1.10.0" count-lines@^0.1.2: version "0.1.2" resolved "https://registry.yarnpkg.com/count-lines/-/count-lines-0.1.2.tgz#e33493fb6860a82f7159d8237843fbfaefee5962" integrity sha1-4zST+2hgqC9xWdgjeEP7+u/uWWI= crc32-stream@~0.3.1: version "0.3.4" resolved "https://registry.yarnpkg.com/crc32-stream/-/crc32-stream-0.3.4.tgz#73bc25b45fac1db6632231a7bfce8927e9f06552" integrity sha1-c7wltF+sHbZjIjGnv86JJ+nwZVI= dependencies: buffer-crc32 "~0.2.1" readable-stream "~1.0.24" create-ecdh@^4.0.0: version "4.0.4" resolved "https://registry.yarnpkg.com/create-ecdh/-/create-ecdh-4.0.4.tgz#d6e7f4bffa66736085a0762fd3a632684dabcc4e" integrity sha512-mf+TCx8wWc9VpuxfP2ht0iSISLZnt0JgWlrOKZiNqyUZWnjIaCIVNQArMHnCZKfEYRg6IM7A+NeJoN8gf/Ws0A== dependencies: bn.js "^4.1.0" elliptic "^6.5.3" create-hash@^1.1.0, create-hash@^1.1.2, create-hash@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/create-hash/-/create-hash-1.2.0.tgz#889078af11a63756bcfb59bd221996be3a9ef196" integrity sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg== dependencies: cipher-base "^1.0.1" inherits "^2.0.1" md5.js "^1.3.4" ripemd160 "^2.0.1" sha.js "^2.4.0" create-hmac@^1.1.0, create-hmac@^1.1.4, create-hmac@^1.1.7: version "1.1.7" resolved "https://registry.yarnpkg.com/create-hmac/-/create-hmac-1.1.7.tgz#69170c78b3ab957147b2b8b04572e47ead2243ff" integrity sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg== dependencies: cipher-base "^1.0.3" create-hash "^1.1.0" inherits "^2.0.1" ripemd160 "^2.0.0" safe-buffer "^5.0.1" sha.js "^2.4.8" create-require@^1.1.0: version "1.1.1" resolved "https://registry.yarnpkg.com/create-require/-/create-require-1.1.1.tgz#c1d7e8f1e5f6cfc9ff65f9cd352d37348756c333" integrity sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ== cross-env@^7.0.3: version "7.0.3" resolved "https://registry.yarnpkg.com/cross-env/-/cross-env-7.0.3.tgz#865264b29677dc015ba8418918965dd232fc54cf" integrity sha512-+/HKd6EgcQCJGh2PSjZuUitQBQynKor4wrFbRg4DtAgS1aWO+gU52xpH7M9ScGgXSYmAVS9bIJ8EzuaGw0oNAw== dependencies: cross-spawn "^7.0.1" cross-spawn@^7.0.0, cross-spawn@^7.0.1, cross-spawn@^7.0.2, cross-spawn@^7.0.3: version "7.0.3" resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6" integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w== dependencies: path-key "^3.1.0" shebang-command "^2.0.0" which "^2.0.1" cryptiles@0.2.x: version "0.2.2" resolved "https://registry.yarnpkg.com/cryptiles/-/cryptiles-0.2.2.tgz#ed91ff1f17ad13d3748288594f8a48a0d26f325c" integrity sha1-7ZH/HxetE9N0gohZT4pIoNJvMlw= dependencies: boom "0.4.x" crypto-browserify@^3.0.0: version "3.12.0" resolved "https://registry.yarnpkg.com/crypto-browserify/-/crypto-browserify-3.12.0.tgz#396cf9f3137f03e4b8e532c58f698254e00f80ec" integrity sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg== dependencies: browserify-cipher "^1.0.0" browserify-sign "^4.0.0" create-ecdh "^4.0.0" create-hash "^1.1.0" create-hmac "^1.1.0" diffie-hellman "^5.0.0" inherits "^2.0.1" pbkdf2 "^3.0.3" public-encrypt "^4.0.0" randombytes "^2.0.0" randomfill "^1.0.3" ctype@0.5.3: version "0.5.3" resolved "https://registry.yarnpkg.com/ctype/-/ctype-0.5.3.tgz#82c18c2461f74114ef16c135224ad0b9144ca12f" integrity sha1-gsGMJGH3QRTvFsE1IkrQuRRMoS8= d@1, d@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/d/-/d-1.0.1.tgz#8698095372d58dbee346ffd0c7093f99f8f9eb5a" integrity sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA== dependencies: es5-ext "^0.10.50" type "^1.0.1" dargs@^7.0.0: version "7.0.0" resolved "https://registry.yarnpkg.com/dargs/-/dargs-7.0.0.tgz#04015c41de0bcb69ec84050f3d9be0caf8d6d5cc" integrity sha512-2iy1EkLdlBzQGvbweYRFxmFath8+K7+AKB0TlhHWkNuH+TmovaMH/Wp7V7R4u7f4SnX3OgLsU9t1NI9ioDnUpg== dash-ast@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/dash-ast/-/dash-ast-1.0.0.tgz#12029ba5fb2f8aa6f0a861795b23c1b4b6c27d37" integrity sha512-Vy4dx7gquTeMcQR/hDkYLGUnwVil6vk4FOOct+djUnHOUWt+zJPJAaRIXaAFkPXtJjvlY7o3rfRu0/3hpnwoUA== dash-ast@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/dash-ast/-/dash-ast-2.0.1.tgz#8d0fd2e601c59bf874cc22877ee7dd889f54dee8" integrity sha512-5TXltWJGc+RdnabUGzhRae1TRq6m4gr+3K2wQX0is5/F2yS6MJXJvLyI3ErAnsAXuJoGqvfVD5icRgim07DrxQ== debug@*, debug@4, debug@^4.0.0, debug@^4.1.0, debug@^4.1.1, debug@^4.3.2, debug@^4.3.3: version "4.3.3" resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.3.tgz#04266e0b70a98d4462e6e288e38259213332b664" integrity sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q== dependencies: ms "2.1.2" debug@0.7.4, debug@~0.7.2, debug@~0.7.4: version "0.7.4" resolved "https://registry.yarnpkg.com/debug/-/debug-0.7.4.tgz#06e1ea8082c2cb14e39806e22e2f6f757f92af39" integrity sha1-BuHqgILCyxTjmAbiLi9vdX+Srzk= debug@2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/debug/-/debug-2.1.0.tgz#33ab915659d8c2cc8a41443d94d6ebd37697ed21" integrity sha1-M6uRVlnYwsyKQUQ9lNbr03aX7SE= dependencies: ms "0.6.2" debug@2.6.9, debug@^2.2.0, debug@^2.3.3, debug@^2.6.9: version "2.6.9" resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== dependencies: ms "2.0.0" debug@3.2.6: version "3.2.6" resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.6.tgz#e83d17de16d8a7efb7717edbe5fb10135eee629b" integrity sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ== dependencies: ms "^2.1.1" "debug@>= 0.7.3 < 1": version "0.8.1" resolved "https://registry.yarnpkg.com/debug/-/debug-0.8.1.tgz#20ff4d26f5e422cb68a1bacbbb61039ad8c1c130" integrity sha1-IP9NJvXkIstoobrLu2EDmtjBwTA= debug@^3.2.6, debug@^3.2.7: version "3.2.7" resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.7.tgz#72580b7e9145fb39b6676f9c5e5fb100b934179a" integrity sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ== dependencies: ms "^2.1.1" debug@~2.2.0: version "2.2.0" resolved "https://registry.yarnpkg.com/debug/-/debug-2.2.0.tgz#f87057e995b1a1f6ae6a4960664137bc56f039da" integrity sha1-+HBX6ZWxofauaklgZkE3vFbwOdo= dependencies: ms "0.7.1" decamelize-keys@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/decamelize-keys/-/decamelize-keys-1.1.0.tgz#d171a87933252807eb3cb61dc1c1445d078df2d9" integrity sha1-0XGoeTMlKAfrPLYdwcFEXQeN8tk= dependencies: decamelize "^1.1.0" map-obj "^1.0.0" decamelize@^1.1.0, decamelize@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" integrity sha1-9lNNFRSCabIDUue+4m9QH5oZEpA= decamelize@^5.0.0: version "5.0.1" resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-5.0.1.tgz#db11a92e58c741ef339fb0a2868d8a06a9a7b1e9" integrity sha512-VfxadyCECXgQlkoEAjeghAr5gY3Hf+IKjKb+X8tGVDtveCjN+USwprd2q3QXBR9T1+x2DG0XZF5/w+7HAtSaXA== decode-named-character-reference@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/decode-named-character-reference/-/decode-named-character-reference-1.0.1.tgz#57b2bd9112659cacbc449d3577d7dadb8e1f3d1b" integrity sha512-YV/0HQHreRwKb7uBopyIkLG17jG6Sv2qUchk9qSoVJ2f+flwRsPNBO0hAnjt6mTNYUT+vw9Gy2ihXg4sUWPi2w== dependencies: character-entities "^2.0.0" decode-uri-component@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/decode-uri-component/-/decode-uri-component-0.2.0.tgz#eb3913333458775cb84cd1a1fae062106bb87545" integrity sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU= dedent@^0.7.0: version "0.7.0" resolved "https://registry.yarnpkg.com/dedent/-/dedent-0.7.0.tgz#2495ddbaf6eb874abb0e1be9df22d2e5a544326c" integrity sha1-JJXduvbrh0q7Dhvp3yLS5aVEMmw= deep-equal@^1.0.0: version "1.1.1" resolved "https://registry.yarnpkg.com/deep-equal/-/deep-equal-1.1.1.tgz#b5c98c942ceffaf7cb051e24e1434a25a2e6076a" integrity sha512-yd9c5AdiqVcR+JjcwUQb9DkhJc8ngNr0MahEBGvDiJw8puWab2yZlh+nkasOnZP+EGTAP6rRp2JzJhJZzvNF8g== dependencies: is-arguments "^1.0.4" is-date-object "^1.0.1" is-regex "^1.0.4" object-is "^1.0.1" object-keys "^1.1.1" regexp.prototype.flags "^1.2.0" deep-extend@^0.6.0: version "0.6.0" resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.6.0.tgz#c4fa7c95404a17a9c3e8ca7e1537312b736330ac" integrity sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA== deep-is@^0.1.3, deep-is@~0.1.3: version "0.1.4" resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.4.tgz#a6f2dce612fadd2ef1f519b73551f17e85199831" integrity sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ== default-require-extensions@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/default-require-extensions/-/default-require-extensions-3.0.0.tgz#e03f93aac9b2b6443fc52e5e4a37b3ad9ad8df96" integrity sha512-ek6DpXq/SCpvjhpFsLFRVtIxJCRw6fUR42lYMVZuUMK7n8eMz4Uh5clckdBjEpLhn/gEBZo7hDJnJcwdKLKQjg== dependencies: strip-bom "^4.0.0" define-lazy-prop@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz#3f7ae421129bcaaac9bc74905c98a0009ec9ee7f" integrity sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og== define-lazy-prop@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/define-lazy-prop/-/define-lazy-prop-3.0.0.tgz#dbb19adfb746d7fc6d734a06b72f4a00d021255f" integrity sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg== define-properties@^1.1.2, define-properties@^1.1.3: version "1.1.3" resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.3.tgz#cf88da6cbee26fe6db7094f61d870cbd84cee9f1" integrity sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ== dependencies: object-keys "^1.0.12" define-property@^0.2.5: version "0.2.5" resolved "https://registry.yarnpkg.com/define-property/-/define-property-0.2.5.tgz#c35b1ef918ec3c990f9a5bc57be04aacec5c8116" integrity sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY= dependencies: is-descriptor "^0.1.0" define-property@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/define-property/-/define-property-1.0.0.tgz#769ebaaf3f4a63aad3af9e8d304c9bbe79bfb0e6" integrity sha1-dp66rz9KY6rTr56NMEybvnm/sOY= dependencies: is-descriptor "^1.0.0" define-property@^2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/define-property/-/define-property-2.0.2.tgz#d459689e8d654ba77e02a817f8710d702cb16e9d" integrity sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ== dependencies: is-descriptor "^1.0.2" isobject "^3.0.1" defined@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/defined/-/defined-1.0.0.tgz#c98d9bcef75674188e110969151199e39b1fa693" integrity sha1-yY2bzvdWdBiOEQlpFRGZ45sfppM= delayed-stream@0.0.5: version "0.0.5" resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-0.0.5.tgz#d4b1f43a93e8296dfe02694f4680bc37a313c73f" integrity sha1-1LH0OpPoKW3+AmlPRoC8N6MTxz8= delayed-stream@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" integrity sha1-3zrhmayt+31ECqrgsp4icrJOxhk= depd@~1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/depd/-/depd-1.0.1.tgz#80aec64c9d6d97e65cc2a9caa93c0aa6abf73aaa" integrity sha1-gK7GTJ1tl+ZcwqnKqTwKpqv3Oqo= depd@~1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.2.tgz#9bcd52e14c097763e749b274c4346ed2e560b5a9" integrity sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak= depd@~2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/depd/-/depd-2.0.0.tgz#b696163cc757560d09cf22cc8fad1571b79e76df" integrity sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw== deps-sort@^2.0.0, deps-sort@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/deps-sort/-/deps-sort-2.0.1.tgz#9dfdc876d2bcec3386b6829ac52162cda9fa208d" integrity sha512-1orqXQr5po+3KI6kQb9A4jnXT1PBwggGl2d7Sq2xsnOeI9GPcE/tGcF9UiSZtZBM7MukY4cAh7MemS6tZYipfw== dependencies: JSONStream "^1.0.3" shasum-object "^1.0.0" subarg "^1.0.0" through2 "^2.0.0" dequal@^2.0.0: version "2.0.2" resolved "https://registry.yarnpkg.com/dequal/-/dequal-2.0.2.tgz#85ca22025e3a87e65ef75a7a437b35284a7e319d" integrity sha512-q9K8BlJVxK7hQYqa6XISGmBZbtQQWVXSrRrWreHC94rMt1QL/Impruc+7p2CYSYuVIUr+YCt6hjrs1kkdJRTug== des.js@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/des.js/-/des.js-1.0.1.tgz#5382142e1bdc53f85d86d53e5f4aa7deb91e0843" integrity sha512-Q0I4pfFrv2VPd34/vfLrFOoRmlYj3OV50i7fskps1jZWK1kApMWWT9G6RRUeYedLcBDIhnSDaUvJMb3AhUlaEA== dependencies: inherits "^2.0.1" minimalistic-assert "^1.0.0" destroy@~1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.0.4.tgz#978857442c44749e4206613e37946205826abd80" integrity sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA= detect-indent@^6.0.0: version "6.1.0" resolved "https://registry.yarnpkg.com/detect-indent/-/detect-indent-6.1.0.tgz#592485ebbbf6b3b1ab2be175c8393d04ca0d57e6" integrity sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA== detect-newline@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/detect-newline/-/detect-newline-3.1.0.tgz#576f5dfc63ae1a192ff192d8ad3af6308991b651" integrity sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA== detective@^4.0.0: version "4.7.1" resolved "https://registry.yarnpkg.com/detective/-/detective-4.7.1.tgz#0eca7314338442febb6d65da54c10bb1c82b246e" integrity sha512-H6PmeeUcZloWtdt4DAkFyzFL94arpHr3NOwwmVILFiy+9Qd4JTxxXrzfyGk/lmct2qVGBwTSwSXagqu2BxmWig== dependencies: acorn "^5.2.1" defined "^1.0.0" detective@^5.2.0: version "5.2.0" resolved "https://registry.yarnpkg.com/detective/-/detective-5.2.0.tgz#feb2a77e85b904ecdea459ad897cc90a99bd2a7b" integrity sha512-6SsIx+nUUbuK0EthKjv0zrdnajCCXVYGmbYYiYjFVpzcjwEs/JMDZ8tPRG29J/HhN56t3GJp2cGSWDRjjot8Pg== dependencies: acorn-node "^1.6.1" defined "^1.0.0" minimist "^1.1.1" dezalgo@1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/dezalgo/-/dezalgo-1.0.3.tgz#7f742de066fc748bc8db820569dddce49bf0d456" integrity sha1-f3Qt4Gb8dIvI24IFad3c5Jvw1FY= dependencies: asap "^2.0.0" wrappy "1" dicer@0.2.5: version "0.2.5" resolved "https://registry.yarnpkg.com/dicer/-/dicer-0.2.5.tgz#5996c086bb33218c812c090bddc09cd12facb70f" integrity sha1-WZbAhrszIYyBLAkL3cCc0S+stw8= dependencies: readable-stream "1.1.x" streamsearch "0.1.2" diff@3.5.0: version "3.5.0" resolved "https://registry.yarnpkg.com/diff/-/diff-3.5.0.tgz#800c0dd1e0a8bfbc95835c202ad220fe317e5a12" integrity sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA== diff@^4.0.1: version "4.0.2" resolved "https://registry.yarnpkg.com/diff/-/diff-4.0.2.tgz#60f3aecb89d5fae520c11aa19efc2bb982aade7d" integrity sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A== diff@^5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/diff/-/diff-5.0.0.tgz#7ed6ad76d859d030787ec35855f5b1daf31d852b" integrity sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w== diffie-hellman@^5.0.0: version "5.0.3" resolved "https://registry.yarnpkg.com/diffie-hellman/-/diffie-hellman-5.0.3.tgz#40e8ee98f55a2149607146921c63e1ae5f3d2875" integrity sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg== dependencies: bn.js "^4.1.0" miller-rabin "^4.0.0" randombytes "^2.0.0" dir-glob@^3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-3.0.1.tgz#56dbf73d992a4a93ba1584f4534063fd2e41717f" integrity sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA== dependencies: path-type "^4.0.0" doctrine@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-2.1.0.tgz#5cd01fc101621b42c4cd7f5d1a66243716d3f39d" integrity sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw== dependencies: esutils "^2.0.2" doctrine@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-3.0.0.tgz#addebead72a6574db783639dc87a121773973961" integrity sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w== dependencies: esutils "^2.0.2" domain-browser@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/domain-browser/-/domain-browser-1.2.0.tgz#3d31f50191a6749dd1375a7f522e823d42e54eda" integrity sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA== domain-browser@~1.1.0: version "1.1.7" resolved "https://registry.yarnpkg.com/domain-browser/-/domain-browser-1.1.7.tgz#867aa4b093faa05f1de08c06f4d7b21fdf8698bc" integrity sha1-hnqksJP6oF8d4IwG9NeyH9+GmLw= dot-prop@^5.1.0: version "5.3.0" resolved "https://registry.yarnpkg.com/dot-prop/-/dot-prop-5.3.0.tgz#90ccce708cd9cd82cc4dc8c3ddd9abdd55b20e88" integrity sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q== dependencies: is-obj "^2.0.0" duplexer2@^0.1.2, duplexer2@~0.1.0, duplexer2@~0.1.2: version "0.1.4" resolved "https://registry.yarnpkg.com/duplexer2/-/duplexer2-0.1.4.tgz#8b12dab878c0d69e3e7891051662a32fc6bddcc1" integrity sha1-ixLauHjA1p4+eJEFFmKjL8a93ME= dependencies: readable-stream "^2.0.2" duplexer@~0.1.1: version "0.1.2" resolved "https://registry.yarnpkg.com/duplexer/-/duplexer-0.1.2.tgz#3abe43aef3835f8ae077d136ddce0f276b0400e6" integrity sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg== duplexify@^4.1.1: version "4.1.2" resolved "https://registry.yarnpkg.com/duplexify/-/duplexify-4.1.2.tgz#18b4f8d28289132fa0b9573c898d9f903f81c7b0" integrity sha512-fz3OjcNCHmRP12MJoZMPglx8m4rrFP8rovnk4vT8Fs+aonZoCwGg10dSsQsfP/E62eZcPTMSMP6686fu9Qlqtw== dependencies: end-of-stream "^1.4.1" inherits "^2.0.3" readable-stream "^3.1.1" stream-shift "^1.0.0" ee-first@1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.0.tgz#6a0d7c6221e490feefd92ec3f441c9ce8cd097f4" integrity sha1-ag18YiHkkP7v2S7D9EHJzozQl/Q= ee-first@1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" integrity sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0= electron-to-chromium@^1.4.17: version "1.4.37" resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.37.tgz#eedd53cad229ae2d1632b958a92a3d7d7b27f553" integrity sha512-XIvFB1omSAxYgHYX48sC+HR8i/p7lx7R+0cX9faElg1g++h9IilCrJ12+bQuY+d96Wp7zkBiJwMOv+AhLtLrTg== elliptic@^6.5.3: version "6.5.4" resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.5.4.tgz#da37cebd31e79a1367e941b592ed1fbebd58abbb" integrity sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ== dependencies: bn.js "^4.11.9" brorand "^1.1.0" hash.js "^1.0.0" hmac-drbg "^1.0.1" inherits "^2.0.4" minimalistic-assert "^1.0.1" minimalistic-crypto-utils "^1.0.1" emitter-component@1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/emitter-component/-/emitter-component-1.0.0.tgz#f04dd18fc3dc3e9a74cbc0f310b088666e4c016f" integrity sha1-8E3Rj8PcPpp0y8DzELCIZm5MAW8= emoji-regex@^7.0.1: version "7.0.3" resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-7.0.3.tgz#933a04052860c85e83c122479c4748a8e4c72156" integrity sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA== emoji-regex@^8.0.0: version "8.0.0" resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== emoji-regex@^9.2.2: version "9.2.2" resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-9.2.2.tgz#840c8803b0d8047f4ff0cf963176b32d4ef3ed72" integrity sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg== encodeurl@~1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59" integrity sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k= end-of-stream@^1.0.0, end-of-stream@^1.4.1: version "1.4.4" resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.4.tgz#5ae64a5f45057baf3626ec14da0ca5e4b2431eb0" integrity sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q== dependencies: once "^1.4.0" enhance-visitors@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/enhance-visitors/-/enhance-visitors-1.0.0.tgz#aa945d05da465672a1ebd38fee2ed3da8518e95a" integrity sha1-qpRdBdpGVnKh69OP7i7T2oUY6Vo= dependencies: lodash "^4.13.1" enhanced-resolve@^0.9.1: version "0.9.1" resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-0.9.1.tgz#4d6e689b3725f86090927ccc86cd9f1635b89e2e" integrity sha1-TW5omzcl+GCQknzMhs2fFjW4ni4= dependencies: graceful-fs "^4.1.2" memory-fs "^0.2.0" tapable "^0.1.8" enquirer@^2.3.5: version "2.3.6" resolved "https://registry.yarnpkg.com/enquirer/-/enquirer-2.3.6.tgz#2a7fe5dd634a1e4125a975ec994ff5456dc3734d" integrity sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg== dependencies: ansi-colors "^4.1.1" env-editor@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/env-editor/-/env-editor-1.0.0.tgz#a7de585a96f0198d9ba20a786c17a691c53afaab" integrity sha512-SRy6e7u1tZgohoxL952q9+kbRkkUrzi63dB7J4zr6wOSMQrCD0KJUNhMZajGTNQfdY68PaStfmIzh7To/FKilQ== error-ex@^1.3.1, error-ex@^1.3.2: version "1.3.2" resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf" integrity sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g== dependencies: is-arrayish "^0.2.1" error-stack-parser@^1.3.6: version "1.3.6" resolved "https://registry.yarnpkg.com/error-stack-parser/-/error-stack-parser-1.3.6.tgz#e0e73b93e417138d1cd7c0b746b1a4a14854c292" integrity sha1-4Oc7k+QXE40c18C3RrGkoUhUwpI= dependencies: stackframe "^0.3.1" es-abstract@^1.18.5, es-abstract@^1.19.0, es-abstract@^1.19.1: version "1.19.1" resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.19.1.tgz#d4885796876916959de78edaa0df456627115ec3" integrity sha512-2vJ6tjA/UfqLm2MPs7jxVybLoB8i1t1Jd9R3kISld20sIxPcTbLuggQOUxeWeAvIUkduv/CfMjuh4WmiXr2v9w== dependencies: call-bind "^1.0.2" es-to-primitive "^1.2.1" function-bind "^1.1.1" get-intrinsic "^1.1.1" get-symbol-description "^1.0.0" has "^1.0.3" has-symbols "^1.0.2" internal-slot "^1.0.3" is-callable "^1.2.4" is-negative-zero "^2.0.1" is-regex "^1.1.4" is-shared-array-buffer "^1.0.1" is-string "^1.0.7" is-weakref "^1.0.1" object-inspect "^1.11.0" object-keys "^1.1.1" object.assign "^4.1.2" string.prototype.trimend "^1.0.4" string.prototype.trimstart "^1.0.4" unbox-primitive "^1.0.1" es-to-primitive@^1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.2.1.tgz#e55cd4c9cdc188bcefb03b366c736323fc5c898a" integrity sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA== dependencies: is-callable "^1.1.4" is-date-object "^1.0.1" is-symbol "^1.0.2" es5-ext@^0.10.35, es5-ext@^0.10.46, es5-ext@^0.10.50, es5-ext@~0.10.14: version "0.10.53" resolved "https://registry.yarnpkg.com/es5-ext/-/es5-ext-0.10.53.tgz#93c5a3acfdbef275220ad72644ad02ee18368de1" integrity sha512-Xs2Stw6NiNHWypzRTY1MtaG/uJlwCk8kH81920ma8mvN8Xq1gsfhZvpkImLQArw8AHnv8MT2I45J3c0R8slE+Q== dependencies: es6-iterator "~2.0.3" es6-symbol "~3.1.3" next-tick "~1.0.0" es6-error@^4.0.1: version "4.1.1" resolved "https://registry.yarnpkg.com/es6-error/-/es6-error-4.1.1.tgz#9e3af407459deed47e9a91f9b885a84eb05c561d" integrity sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg== es6-iterator@^2.0.3, es6-iterator@~2.0.1, es6-iterator@~2.0.3: version "2.0.3" resolved "https://registry.yarnpkg.com/es6-iterator/-/es6-iterator-2.0.3.tgz#a7de889141a05a94b0854403b2d0a0fbfa98f3b7" integrity sha1-p96IkUGgWpSwhUQDstCg+/qY87c= dependencies: d "1" es5-ext "^0.10.35" es6-symbol "^3.1.1" es6-map@^0.1.3, es6-map@^0.1.5: version "0.1.5" resolved "https://registry.yarnpkg.com/es6-map/-/es6-map-0.1.5.tgz#9136e0503dcc06a301690f0bb14ff4e364e949f0" integrity sha1-kTbgUD3MBqMBaQ8LsU/042TpSfA= dependencies: d "1" es5-ext "~0.10.14" es6-iterator "~2.0.1" es6-set "~0.1.5" es6-symbol "~3.1.1" event-emitter "~0.3.5" es6-set@^0.1.5, es6-set@~0.1.5: version "0.1.5" resolved "https://registry.yarnpkg.com/es6-set/-/es6-set-0.1.5.tgz#d2b3ec5d4d800ced818db538d28974db0a73ccb1" integrity sha1-0rPsXU2ADO2BjbU40ol02wpzzLE= dependencies: d "1" es5-ext "~0.10.14" es6-iterator "~2.0.1" es6-symbol "3.1.1" event-emitter "~0.3.5" es6-symbol@3.1.1: version "3.1.1" resolved "https://registry.yarnpkg.com/es6-symbol/-/es6-symbol-3.1.1.tgz#bf00ef4fdab6ba1b46ecb7b629b4c7ed5715cc77" integrity sha1-vwDvT9q2uhtG7Le2KbTH7VcVzHc= dependencies: d "1" es5-ext "~0.10.14" es6-symbol@^3.1.1, es6-symbol@~3.1.1, es6-symbol@~3.1.3: version "3.1.3" resolved "https://registry.yarnpkg.com/es6-symbol/-/es6-symbol-3.1.3.tgz#bad5d3c1bcdac28269f4cb331e431c78ac705d18" integrity sha512-NJ6Yn3FuDinBaBRWl/q5X/s4koRHBrgKAu+yGI6JCBeiu3qrcbJhwT2GeR/EXVfylRk8dpQVJoLEFhK+Mu31NA== dependencies: d "^1.0.1" ext "^1.1.2" es6-weak-map@^2.0.1: version "2.0.3" resolved "https://registry.yarnpkg.com/es6-weak-map/-/es6-weak-map-2.0.3.tgz#b6da1f16cc2cc0d9be43e6bdbfc5e7dfcdf31d53" integrity sha512-p5um32HOTO1kP+w7PRnB+5lQ43Z6muuMuIMffvDN8ZB4GcnjLBV6zGStpbASIMk4DCAvEaamhe2zhyCb/QXXsA== dependencies: d "1" es5-ext "^0.10.46" es6-iterator "^2.0.3" es6-symbol "^3.1.1" escalade@^3.1.1: version "3.1.1" resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.1.tgz#d8cfdc7000965c5a0174b4a82eaa5c0552742e40" integrity sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw== escape-html@~1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988" integrity sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg= escape-string-regexp@1.0.5, escape-string-regexp@^1.0.2, escape-string-regexp@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ= escape-string-regexp@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34" integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== escodegen@1.3.x: version "1.3.3" resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-1.3.3.tgz#f024016f5a88e046fd12005055e939802e6c5f23" integrity sha1-8CQBb1qI4Eb9EgBQVek5gC5sXyM= dependencies: esprima "~1.1.1" estraverse "~1.5.0" esutils "~1.0.0" optionalDependencies: source-map "~0.1.33" escodegen@1.8.x: version "1.8.1" resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-1.8.1.tgz#5a5b53af4693110bebb0867aa3430dd3b70a1018" integrity sha1-WltTr0aTEQvrsIZ6o0MN07cKEBg= dependencies: esprima "^2.7.1" estraverse "^1.9.1" esutils "^2.0.2" optionator "^0.8.1" optionalDependencies: source-map "~0.2.0" escodegen@^1.6.1: version "1.14.3" resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-1.14.3.tgz#4e7b81fba61581dc97582ed78cab7f0e8d63f503" integrity sha512-qFcX0XJkdg+PB3xjZZG/wKSuT1PnQWx57+TVSjIMmILd2yC/6ByYElPwJnslDsuWuSAp4AwJGumarAAmJch5Kw== dependencies: esprima "^4.0.1" estraverse "^4.2.0" esutils "^2.0.2" optionator "^0.8.1" optionalDependencies: source-map "~0.6.1" escope@^3.6.0: version "3.6.0" resolved "https://registry.yarnpkg.com/escope/-/escope-3.6.0.tgz#e01975e812781a163a6dadfdd80398dc64c889c3" integrity sha1-4Bl16BJ4GhY6ba392AOY3GTIicM= dependencies: es6-map "^0.1.3" es6-weak-map "^2.0.1" esrecurse "^4.1.0" estraverse "^4.1.1" eslint-config-prettier@^8.3.0: version "8.3.0" resolved "https://registry.yarnpkg.com/eslint-config-prettier/-/eslint-config-prettier-8.3.0.tgz#f7471b20b6fe8a9a9254cc684454202886a2dd7a" integrity sha512-BgZuLUSeKzvlL/VUjx/Yb787VQ26RU3gGjA3iiFvdsp/2bMfVIWUVP7tjxtjS0e+HP409cPlPvNkQloz8C91ew== eslint-config-xo-lass@^1.0.6: version "1.0.6" resolved "https://registry.yarnpkg.com/eslint-config-xo-lass/-/eslint-config-xo-lass-1.0.6.tgz#6c27c2b694aea2e3ebc49ab50b4699ce747a5a5b" integrity sha512-C/oftF0mIBWuuj9tiy41qS1EmpXryEu9oVmoujNOnC31Ouyhvj8rQ4RgRn7QMBGs0vSbShq9TAZyLb3rPh2Ozw== eslint-config-xo-typescript@^0.47.1: version "0.47.1" resolved "https://registry.yarnpkg.com/eslint-config-xo-typescript/-/eslint-config-xo-typescript-0.47.1.tgz#87b5865d8a3428fa26cc8dc3146ef4f712dfed46" integrity sha512-BkbzIltZCWp8QLekKJKG8zJ/ZGezD8Z9FaJ+hJ5PrAVUGkIPmxXLLEHCKS3ax7oOqZLYQiG+jyKfQDIEdTQgbg== eslint-config-xo@^0.39.0: version "0.39.0" resolved "https://registry.yarnpkg.com/eslint-config-xo/-/eslint-config-xo-0.39.0.tgz#a76074270d5ecaa6655a740cbdc86eba621590b7" integrity sha512-QX+ZnQgzy/UtgF8dksIiIBzpYoEKmiL0CmZ8O0Gnby7rGXg8Cny1CXirmHp1zKYIpO7BuTmtWj8eUYOsGr0IGQ== dependencies: confusing-browser-globals "1.0.10" eslint-formatter-pretty@^4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/eslint-formatter-pretty/-/eslint-formatter-pretty-4.1.0.tgz#7a6877c14ffe2672066c853587d89603e97c7708" integrity sha512-IsUTtGxF1hrH6lMWiSl1WbGaiP01eT6kzywdY1U+zLc0MP+nwEnUiS9UI8IaOTUhTeQJLlCEWIbXINBH4YJbBQ== dependencies: "@types/eslint" "^7.2.13" ansi-escapes "^4.2.1" chalk "^4.1.0" eslint-rule-docs "^1.1.5" log-symbols "^4.0.0" plur "^4.0.0" string-width "^4.2.0" supports-hyperlinks "^2.0.0" eslint-import-resolver-node@^0.3.6: version "0.3.6" resolved "https://registry.yarnpkg.com/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.6.tgz#4048b958395da89668252001dbd9eca6b83bacbd" integrity sha512-0En0w03NRVMn9Uiyn8YRPDKvWjxCWkslUEhGNTdGx15RvPJYQ+lbOlqrlNI2vEAs4pDYK4f/HN2TbDmk5TP0iw== dependencies: debug "^3.2.7" resolve "^1.20.0" eslint-import-resolver-webpack@^0.13.2: version "0.13.2" resolved "https://registry.yarnpkg.com/eslint-import-resolver-webpack/-/eslint-import-resolver-webpack-0.13.2.tgz#fc813df0d08b9265cc7072d22393bda5198bdc1e" integrity sha512-XodIPyg1OgE2h5BDErz3WJoK7lawxKTJNhgPNafRST6csC/MZC+L5P6kKqsZGRInpbgc02s/WZMrb4uGJzcuRg== dependencies: array-find "^1.0.0" debug "^3.2.7" enhanced-resolve "^0.9.1" find-root "^1.1.0" has "^1.0.3" interpret "^1.4.0" is-core-module "^2.7.0" is-regex "^1.1.4" lodash "^4.17.21" resolve "^1.20.0" semver "^5.7.1" eslint-module-utils@^2.7.2: version "2.7.2" resolved "https://registry.yarnpkg.com/eslint-module-utils/-/eslint-module-utils-2.7.2.tgz#1d0aa455dcf41052339b63cada8ab5fd57577129" integrity sha512-zquepFnWCY2ISMFwD/DqzaM++H+7PDzOpUvotJWm/y1BAFt5R4oeULgdrTejKqLkz7MA/tgstsUMNYc7wNdTrg== dependencies: debug "^3.2.7" find-up "^2.1.0" eslint-plugin-ava@^13.1.0: version "13.1.0" resolved "https://registry.yarnpkg.com/eslint-plugin-ava/-/eslint-plugin-ava-13.1.0.tgz#c53463e1ce46edd87501fc5329fa1db287b989af" integrity sha512-Bdwyqv4Xh+4ekqbk601HcZNcx8+9ClNGz5GdbC2hv977jUPHQPDMx2arTD3zi1EeyOnOG2Kx22Ow3wecbPCRjQ== dependencies: enhance-visitors "^1.0.0" eslint-utils "^3.0.0" espree "^9.0.0" espurify "^2.1.1" import-modules "^2.1.0" micro-spelling-correcter "^1.1.1" pkg-dir "^5.0.0" resolve-from "^5.0.0" eslint-plugin-compat@^4.0.0: version "4.0.1" resolved "https://registry.yarnpkg.com/eslint-plugin-compat/-/eslint-plugin-compat-4.0.1.tgz#54e1b5095a7c3ef45701556fce1923d615c76445" integrity sha512-vs4oa+WQcCRH7lD/0H8eh90tnSQurV3Cebt32x28JlP0Kn9UkQT+N8Pm939KavTO3/DiFPQyTPCNdYXcIWP/GA== dependencies: "@mdn/browser-compat-data" "^3.3.14" ast-metadata-inferer "^0.7.0" browserslist "^4.16.8" caniuse-lite "^1.0.30001267" core-js "^3.16.2" find-up "^5.0.0" lodash.memoize "4.1.2" semver "7.3.5" eslint-plugin-es@^3.0.0: version "3.0.1" resolved "https://registry.yarnpkg.com/eslint-plugin-es/-/eslint-plugin-es-3.0.1.tgz#75a7cdfdccddc0589934aeeb384175f221c57893" integrity sha512-GUmAsJaN4Fc7Gbtl8uOBlayo2DqhwWvEzykMHSCZHU3XdJ+NSzzZcVhXh3VxX5icqQ+oQdIEawXX8xkR3mIFmQ== dependencies: eslint-utils "^2.0.0" regexpp "^3.0.0" eslint-plugin-eslint-comments@^3.2.0: version "3.2.0" resolved "https://registry.yarnpkg.com/eslint-plugin-eslint-comments/-/eslint-plugin-eslint-comments-3.2.0.tgz#9e1cd7b4413526abb313933071d7aba05ca12ffa" integrity sha512-0jkOl0hfojIHHmEHgmNdqv4fmh7300NdpA9FFpF7zaoLvB/QeXOGNLIo86oAveJFrfB1p05kC8hpEMHM8DwWVQ== dependencies: escape-string-regexp "^1.0.5" ignore "^5.0.5" eslint-plugin-import@^2.25.3: version "2.25.4" resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.25.4.tgz#322f3f916a4e9e991ac7af32032c25ce313209f1" integrity sha512-/KJBASVFxpu0xg1kIBn9AUa8hQVnszpwgE7Ld0lKAlx7Ie87yzEzCgSkekt+le/YVhiaosO4Y14GDAOc41nfxA== dependencies: array-includes "^3.1.4" array.prototype.flat "^1.2.5" debug "^2.6.9" doctrine "^2.1.0" eslint-import-resolver-node "^0.3.6" eslint-module-utils "^2.7.2" has "^1.0.3" is-core-module "^2.8.0" is-glob "^4.0.3" minimatch "^3.0.4" object.values "^1.1.5" resolve "^1.20.0" tsconfig-paths "^3.12.0" eslint-plugin-no-use-extend-native@^0.5.0: version "0.5.0" resolved "https://registry.yarnpkg.com/eslint-plugin-no-use-extend-native/-/eslint-plugin-no-use-extend-native-0.5.0.tgz#d6855e3a823a819b467cf7df56adca57de741bf9" integrity sha512-dBNjs8hor8rJgeXLH4HTut5eD3RGWf9JUsadIfuL7UosVQ/dnvOKwxEcRrXrFxrMZ8llUVWT+hOimxJABsAUzQ== dependencies: is-get-set-prop "^1.0.0" is-js-type "^2.0.0" is-obj-prop "^1.0.0" is-proto-prop "^2.0.0" eslint-plugin-node@^11.1.0: version "11.1.0" resolved "https://registry.yarnpkg.com/eslint-plugin-node/-/eslint-plugin-node-11.1.0.tgz#c95544416ee4ada26740a30474eefc5402dc671d" integrity sha512-oUwtPJ1W0SKD0Tr+wqu92c5xuCeQqB3hSCHasn/ZgjFdA9iDGNkNf2Zi9ztY7X+hNuMib23LNGRm6+uN+KLE3g== dependencies: eslint-plugin-es "^3.0.0" eslint-utils "^2.0.0" ignore "^5.1.1" minimatch "^3.0.4" resolve "^1.10.1" semver "^6.1.0" eslint-plugin-prettier@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/eslint-plugin-prettier/-/eslint-plugin-prettier-4.0.0.tgz#8b99d1e4b8b24a762472b4567992023619cb98e0" integrity sha512-98MqmCJ7vJodoQK359bqQWaxOE0CS8paAz/GgjaZLyex4TTk3g9HugoO89EqWCrFiOqn9EVvcoo7gZzONCWVwQ== dependencies: prettier-linter-helpers "^1.0.0" eslint-plugin-unicorn@^39.0.0: version "39.0.0" resolved "https://registry.yarnpkg.com/eslint-plugin-unicorn/-/eslint-plugin-unicorn-39.0.0.tgz#ee76d4f3bf37c605d89fa449d5e7c0c44c54b0cc" integrity sha512-fd5RK2FtYjGcIx3wra7csIE/wkkmBo22T1gZtRTsLr1Mb+KsFKJ+JOdSqhHXQUrI/JTs/Mon64cEYzTgSCbltw== dependencies: "@babel/helper-validator-identifier" "^7.14.9" ci-info "^3.2.0" clean-regexp "^1.0.0" eslint-template-visitor "^2.3.2" eslint-utils "^3.0.0" esquery "^1.4.0" indent-string "4" is-builtin-module "^3.1.0" lodash "^4.17.21" pluralize "^8.0.0" read-pkg-up "^7.0.1" regexp-tree "^0.1.23" safe-regex "^2.1.1" semver "^7.3.5" strip-indent "^3.0.0" eslint-rule-docs@^1.1.5: version "1.1.231" resolved "https://registry.yarnpkg.com/eslint-rule-docs/-/eslint-rule-docs-1.1.231.tgz#648b978bc5a1bb740be5f28d07470f0926b9cdf1" integrity sha512-egHz9A1WG7b8CS0x1P6P/Rj5FqZOjray/VjpJa14tMZalfRKvpE2ONJ3plCM7+PcinmU4tcmbPLv0VtwzSdLVA== eslint-scope@^5.1.1: version "5.1.1" resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-5.1.1.tgz#e786e59a66cb92b3f6c1fb0d508aab174848f48c" integrity sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw== dependencies: esrecurse "^4.3.0" estraverse "^4.1.1" eslint-scope@^7.1.0: version "7.1.0" resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-7.1.0.tgz#c1f6ea30ac583031f203d65c73e723b01298f153" integrity sha512-aWwkhnS0qAXqNOgKOK0dJ2nvzEbhEvpy8OlJ9kZ0FeZnA6zpjv1/Vei+puGFFX7zkPCkHHXb7IDX3A+7yPrRWg== dependencies: esrecurse "^4.3.0" estraverse "^5.2.0" eslint-template-visitor@^2.3.2: version "2.3.2" resolved "https://registry.yarnpkg.com/eslint-template-visitor/-/eslint-template-visitor-2.3.2.tgz#b52f96ff311e773a345d79053ccc78275bbc463d" integrity sha512-3ydhqFpuV7x1M9EK52BPNj6V0Kwu0KKkcIAfpUhwHbR8ocRln/oUHgfxQupY8O1h4Qv/POHDumb/BwwNfxbtnA== dependencies: "@babel/core" "^7.12.16" "@babel/eslint-parser" "^7.12.16" eslint-visitor-keys "^2.0.0" esquery "^1.3.1" multimap "^1.1.0" eslint-utils@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/eslint-utils/-/eslint-utils-2.1.0.tgz#d2de5e03424e707dc10c74068ddedae708741b27" integrity sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg== dependencies: eslint-visitor-keys "^1.1.0" eslint-utils@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/eslint-utils/-/eslint-utils-3.0.0.tgz#8aebaface7345bb33559db0a1f13a1d2d48c3672" integrity sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA== dependencies: eslint-visitor-keys "^2.0.0" eslint-visitor-keys@^1.1.0: version "1.3.0" resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz#30ebd1ef7c2fdff01c3a4f151044af25fab0523e" integrity sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ== eslint-visitor-keys@^2.0.0, eslint-visitor-keys@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz#f65328259305927392c938ed44eb0a5c9b2bd303" integrity sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw== eslint-visitor-keys@^3.0.0, eslint-visitor-keys@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-3.1.0.tgz#eee4acea891814cda67a7d8812d9647dd0179af2" integrity sha512-yWJFpu4DtjsWKkt5GeNBBuZMlNcYVs6vRCLoCVEJrTjaSB6LC98gFipNK/erM2Heg/E8mIK+hXG/pJMLK+eRZA== eslint@^8.3.0: version "8.6.0" resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.6.0.tgz#4318c6a31c5584838c1a2e940c478190f58d558e" integrity sha512-UvxdOJ7mXFlw7iuHZA4jmzPaUqIw54mZrv+XPYKNbKdLR0et4rf60lIZUU9kiNtnzzMzGWxMV+tQ7uG7JG8DPw== dependencies: "@eslint/eslintrc" "^1.0.5" "@humanwhocodes/config-array" "^0.9.2" ajv "^6.10.0" chalk "^4.0.0" cross-spawn "^7.0.2" debug "^4.3.2" doctrine "^3.0.0" enquirer "^2.3.5" escape-string-regexp "^4.0.0" eslint-scope "^7.1.0" eslint-utils "^3.0.0" eslint-visitor-keys "^3.1.0" espree "^9.3.0" esquery "^1.4.0" esutils "^2.0.2" fast-deep-equal "^3.1.3" file-entry-cache "^6.0.1" functional-red-black-tree "^1.0.1" glob-parent "^6.0.1" globals "^13.6.0" ignore "^4.0.6" import-fresh "^3.0.0" imurmurhash "^0.1.4" is-glob "^4.0.0" js-yaml "^4.1.0" json-stable-stringify-without-jsonify "^1.0.1" levn "^0.4.1" lodash.merge "^4.6.2" minimatch "^3.0.4" natural-compare "^1.4.0" optionator "^0.9.1" progress "^2.0.0" regexpp "^3.2.0" semver "^7.2.1" strip-ansi "^6.0.1" strip-json-comments "^3.1.0" text-table "^0.2.0" v8-compile-cache "^2.0.3" esm-utils@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/esm-utils/-/esm-utils-2.0.1.tgz#233b691b5542cafdc3a6f4b24bd4af083ea21bd0" integrity sha512-eoz4dzSzykeh9mfRlCDTkNezD2zlPdFftiTH/5OZpE08hGpUPljh5rHDZqucIhX1Wl4cO6FDUUBp3tobvV7dWA== espree@^9.0.0, espree@^9.2.0, espree@^9.3.0: version "9.3.0" resolved "https://registry.yarnpkg.com/espree/-/espree-9.3.0.tgz#c1240d79183b72aaee6ccfa5a90bc9111df085a8" integrity sha512-d/5nCsb0JcqsSEeQzFZ8DH1RmxPcglRWh24EFTlUEmCKoehXGdpsx0RkHDubqUI8LSAIKMQp4r9SzQ3n+sm4HQ== dependencies: acorn "^8.7.0" acorn-jsx "^5.3.1" eslint-visitor-keys "^3.1.0" esprima@1.2.x, esprima@^1.2.0: version "1.2.5" resolved "https://registry.yarnpkg.com/esprima/-/esprima-1.2.5.tgz#0993502feaf668138325756f30f9a51feeec11e9" integrity sha1-CZNQL+r2aBODJXVvMPmlH+7sEek= esprima@2.7.x, esprima@^2.7.1: version "2.7.3" resolved "https://registry.yarnpkg.com/esprima/-/esprima-2.7.3.tgz#96e3b70d5779f6ad49cd032673d1c312767ba581" integrity sha1-luO3DVd59q1JzQMmc9HDEnZ7pYE= esprima@^4.0.0, esprima@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== esprima@~1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/esprima/-/esprima-1.1.1.tgz#5b6f1547f4d102e670e140c509be6771d6aeb549" integrity sha1-W28VR/TRAuZw4UDFCb5ncdautUk= espurify@^2.0.0, espurify@^2.0.1, espurify@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/espurify/-/espurify-2.1.1.tgz#afb043f22fac908d991dd25f7bf40bcf03935b9c" integrity sha512-zttWvnkhcDyGOhSH4vO2qCBILpdCMv/MX8lp4cqgRkQoDRGK2oZxi2GfWhlP2dIXmk7BaKeOTuzbHhyC68o8XQ== esquery@^1.3.1, esquery@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.4.0.tgz#2148ffc38b82e8c7057dfed48425b3e61f0f24a5" integrity sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w== dependencies: estraverse "^5.1.0" esrecurse@^4.1.0, esrecurse@^4.3.0: version "4.3.0" resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.3.0.tgz#7ad7964d679abb28bee72cec63758b1c5d2c9921" integrity sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag== dependencies: estraverse "^5.2.0" estraverse@^1.5.0, estraverse@^1.9.1: version "1.9.3" resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-1.9.3.tgz#af67f2dc922582415950926091a4005d29c9bb44" integrity sha1-r2fy3JIlgkFZUJJgkaQAXSnJu0Q= estraverse@^4.0.0, estraverse@^4.1.0, estraverse@^4.1.1, estraverse@^4.2.0: version "4.3.0" resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.3.0.tgz#398ad3f3c5a24948be7725e83d11a7de28cdbd1d" integrity sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw== estraverse@^5.1.0, estraverse@^5.2.0: version "5.3.0" resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.3.0.tgz#2eea5290702f26ab8fe5370370ff86c965d21123" integrity sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA== estraverse@~1.5.0: version "1.5.1" resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-1.5.1.tgz#867a3e8e58a9f84618afb6c2ddbcd916b7cbaf71" integrity sha1-hno+jlip+EYYr7bC3bzZFrfLr3E= estree-is-function@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/estree-is-function/-/estree-is-function-1.0.0.tgz#c0adc29806d7f18a74db7df0f3b2666702e37ad2" integrity sha512-nSCWn1jkSq2QAtkaVLJZY2ezwcFO161HVc174zL1KPW3RJ+O6C3eJb8Nx7OXzvhoEv+nLgSR1g71oWUHUDTrJA== estree-is-identifier@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/estree-is-identifier/-/estree-is-identifier-1.0.0.tgz#50433fa88d3d00a1bf7a1d7df6e4e67f36aa89f7" integrity sha512-2BDRGrkQJV/NhCAmmE33A35WAaxq3WQaGHgQuD//7orGWfpFqj8Srkwvx0TH+20yIdOF1yMQwi8anv5ISec2AQ== estree-is-member-expression@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/estree-is-member-expression/-/estree-is-member-expression-1.0.0.tgz#e724721e0a14949d363915fd71448eaa6312f590" integrity sha512-Ec+X44CapIGExvSZN+pGkmr5p7HwUVQoPQSd458Lqwvaf4/61k/invHSh4BYK8OXnCkfEhWuIoG5hayKLQStIg== estree-is-require@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/estree-is-require/-/estree-is-require-1.0.0.tgz#fce2c6126d141d1f9316e8c07799d7f0a55bb69b" integrity sha512-oWxQdSEmnUwNZsDQYiBNpVxKEhMmsJQSSxnDrwsr1MWtooCLfhgzsNGzmokdmfK0EzEIS5V4LPvqxv1Kmb1vvA== dependencies: estree-is-identifier "^1.0.0" esutils@^2.0.2: version "2.0.3" resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== esutils@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/esutils/-/esutils-1.0.0.tgz#8151d358e20c8acc7fb745e7472c0025fe496570" integrity sha1-gVHTWOIMisx/t0XnRywAJf5JZXA= etag@~1.8.1: version "1.8.1" resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887" integrity sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc= event-emitter@~0.3.5: version "0.3.5" resolved "https://registry.yarnpkg.com/event-emitter/-/event-emitter-0.3.5.tgz#df8c69eef1647923c7157b9ce83840610b02cc39" integrity sha1-34xp7vFkeSPHFXuc6DhAYQsCzDk= dependencies: d "1" es5-ext "~0.10.14" eventemitter3@1.x.x: version "1.2.0" resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-1.2.0.tgz#1c86991d816ad1e504750e73874224ecf3bec508" integrity sha1-HIaZHYFq0eUEdQ5zh0Ik7PO+xQg= events@^3.0.0: version "3.3.0" resolved "https://registry.yarnpkg.com/events/-/events-3.3.0.tgz#31a95ad0a924e2d2c419a813aeb2c4e878ea7400" integrity sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q== events@~1.1.0: version "1.1.1" resolved "https://registry.yarnpkg.com/events/-/events-1.1.1.tgz#9ebdb7635ad099c70dcc4c2a1f5004288e8bd924" integrity sha1-nr23Y1rQmccNzEwqH1AEKI6L2SQ= evp_bytestokey@^1.0.0, evp_bytestokey@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz#7fcbdb198dc71959432efe13842684e0525acb02" integrity sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA== dependencies: md5.js "^1.3.4" safe-buffer "^5.1.1" execa@^5.0.0, execa@^5.1.1: version "5.1.1" resolved "https://registry.yarnpkg.com/execa/-/execa-5.1.1.tgz#f80ad9cbf4298f7bd1d4c9555c21e93741c411dd" integrity sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg== dependencies: cross-spawn "^7.0.3" get-stream "^6.0.0" human-signals "^2.1.0" is-stream "^2.0.0" merge-stream "^2.0.0" npm-run-path "^4.0.1" onetime "^5.1.2" signal-exit "^3.0.3" strip-final-newline "^2.0.0" expand-brackets@^0.1.4: version "0.1.5" resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-0.1.5.tgz#df07284e342a807cd733ac5af72411e581d1177b" integrity sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s= dependencies: is-posix-bracket "^0.1.0" expand-brackets@^2.1.4: version "2.1.4" resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-2.1.4.tgz#b77735e315ce30f6b6eff0f83b04151a22449622" integrity sha1-t3c14xXOMPa27/D4OwQVGiJEliI= dependencies: debug "^2.3.3" define-property "^0.2.5" extend-shallow "^2.0.1" posix-character-classes "^0.1.0" regex-not "^1.0.0" snapdragon "^0.8.1" to-regex "^3.0.1" expand-range@^1.8.1: version "1.8.2" resolved "https://registry.yarnpkg.com/expand-range/-/expand-range-1.8.2.tgz#a299effd335fe2721ebae8e257ec79644fc85337" integrity sha1-opnv/TNf4nIeuujiV+x5ZE/IUzc= dependencies: fill-range "^2.1.0" express-session@^1.17.2: version "1.17.2" resolved "https://registry.yarnpkg.com/express-session/-/express-session-1.17.2.tgz#397020374f9bf7997f891b85ea338767b30d0efd" integrity sha512-mPcYcLA0lvh7D4Oqr5aNJFMtBMKPLl++OKKxkHzZ0U0oDq1rpKBnkR5f5vCHR26VeArlTOEF9td4x5IjICksRQ== dependencies: cookie "0.4.1" cookie-signature "1.0.6" debug "2.6.9" depd "~2.0.0" on-headers "~1.0.2" parseurl "~1.3.3" safe-buffer "5.2.1" uid-safe "~2.1.5" express-state@1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/express-state/-/express-state-1.0.3.tgz#b6f368743a95d8a91b7683adf593d02b1577ec02" integrity sha1-tvNodDqV2KkbdoOt9ZPQKxV37AI= express@3.4.8: version "3.4.8" resolved "https://registry.yarnpkg.com/express/-/express-3.4.8.tgz#aa7a8986de07053337f4bc5ed9a6453d9cc8e2e1" integrity sha1-qnqJht4HBTM39Lxe2aZFPZzI4uE= dependencies: buffer-crc32 "0.2.1" commander "1.3.2" connect "2.12.0" cookie "0.1.0" cookie-signature "1.0.1" debug ">= 0.7.3 < 1" fresh "0.2.0" merge-descriptors "0.0.1" methods "0.1.0" mkdirp "0.3.5" range-parser "0.0.4" send "0.1.4" express@4.x, express@^4.17.1: version "4.17.2" resolved "https://registry.yarnpkg.com/express/-/express-4.17.2.tgz#c18369f265297319beed4e5558753cc8c1364cb3" integrity sha512-oxlxJxcQlYwqPWKVJJtvQiwHgosH/LrLSPA+H4UxpyvSS6jC5aH+5MoHFM+KABgTOt0APue4w66Ha8jCUo9QGg== dependencies: accepts "~1.3.7" array-flatten "1.1.1" body-parser "1.19.1" content-disposition "0.5.4" content-type "~1.0.4" cookie "0.4.1" cookie-signature "1.0.6" debug "2.6.9" depd "~1.1.2" encodeurl "~1.0.2" escape-html "~1.0.3" etag "~1.8.1" finalhandler "~1.1.2" fresh "0.5.2" merge-descriptors "1.0.1" methods "~1.1.2" on-finished "~2.3.0" parseurl "~1.3.3" path-to-regexp "0.1.7" proxy-addr "~2.0.7" qs "6.9.6" range-parser "~1.2.1" safe-buffer "5.2.1" send "0.17.2" serve-static "1.14.2" setprototypeof "1.2.0" statuses "~1.5.0" type-is "~1.6.18" utils-merge "1.0.1" vary "~1.1.2" ext@^1.1.2: version "1.6.0" resolved "https://registry.yarnpkg.com/ext/-/ext-1.6.0.tgz#3871d50641e874cc172e2b53f919842d19db4c52" integrity sha512-sdBImtzkq2HpkdRLtlLWDa6w4DX22ijZLKx8BMPUuKe1c5lbN6xwQDQCxSfxBQnHZ13ls/FH0MQZx/q/gr6FQg== dependencies: type "^2.5.0" extend-object@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/extend-object/-/extend-object-1.0.0.tgz#42514f84015d1356caf5187969dfb2bc1bda0823" integrity sha1-QlFPhAFdE1bK9Rh5ad+yvBvaCCM= extend-shallow@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-2.0.1.tgz#51af7d614ad9a9f610ea1bafbb989d6b1c56890f" integrity sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8= dependencies: is-extendable "^0.1.0" extend-shallow@^3.0.0, extend-shallow@^3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-3.0.2.tgz#26a71aaf073b39fb2127172746131c2704028db8" integrity sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg= dependencies: assign-symbols "^1.0.0" is-extendable "^1.0.1" extend@^3.0.0, extend@^3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa" integrity sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g== extglob@^0.3.1: version "0.3.2" resolved "https://registry.yarnpkg.com/extglob/-/extglob-0.3.2.tgz#2e18ff3d2f49ab2765cec9023f011daa8d8349a1" integrity sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE= dependencies: is-extglob "^1.0.0" extglob@^2.0.4: version "2.0.4" resolved "https://registry.yarnpkg.com/extglob/-/extglob-2.0.4.tgz#ad00fe4dc612a9232e8718711dc5cb5ab0285543" integrity sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw== dependencies: array-unique "^0.3.2" define-property "^1.0.0" expand-brackets "^2.1.4" extend-shallow "^2.0.1" fragment-cache "^0.2.1" regex-not "^1.0.0" snapdragon "^0.8.1" to-regex "^3.0.1" falafel@^2.1.0: version "2.2.4" resolved "https://registry.yarnpkg.com/falafel/-/falafel-2.2.4.tgz#b5d86c060c2412a43166243cb1bce44d1abd2819" integrity sha512-0HXjo8XASWRmsS0X1EkhwEMZaD3Qvp7FfURwjLKjG1ghfRm/MGZl2r4cWUTv41KdNghTw4OUMmVtdGQp3+H+uQ== dependencies: acorn "^7.1.1" foreach "^2.0.5" isarray "^2.0.1" object-keys "^1.0.6" fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: version "3.1.3" resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== fast-diff@^1.1.2: version "1.2.0" resolved "https://registry.yarnpkg.com/fast-diff/-/fast-diff-1.2.0.tgz#73ee11982d86caaf7959828d519cfe927fac5f03" integrity sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w== fast-glob@^3.1.1, fast-glob@^3.2.7: version "3.2.7" resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.2.7.tgz#fd6cb7a2d7e9aa7a7846111e85a196d6b2f766a1" integrity sha512-rYGMRwip6lUMvYD3BTScMwT1HtAs2d71SMv66Vrxs0IekGZEjhM0pcMfjQPnknBt2zeCwQMEupiN02ZP4DiT1Q== dependencies: "@nodelib/fs.stat" "^2.0.2" "@nodelib/fs.walk" "^1.2.3" glob-parent "^5.1.2" merge2 "^1.3.0" micromatch "^4.0.4" fast-json-stable-stringify@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== fast-levenshtein@^2.0.6, fast-levenshtein@~2.0.6: version "2.0.6" resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" integrity sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc= fast-safe-stringify@^2.0.7, fast-safe-stringify@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/fast-safe-stringify/-/fast-safe-stringify-2.1.1.tgz#c406a83b6e70d9e35ce3b30a81141df30aeba884" integrity sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA== fast-url-parser@^1.1.3: version "1.1.3" resolved "https://registry.yarnpkg.com/fast-url-parser/-/fast-url-parser-1.1.3.tgz#f4af3ea9f34d8a271cf58ad2b3759f431f0b318d" integrity sha1-9K8+qfNNiicc9YrSs3WfQx8LMY0= dependencies: punycode "^1.3.2" fastq@^1.6.0: version "1.13.0" resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.13.0.tgz#616760f88a7526bdfc596b7cab8c18938c36b98c" integrity sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw== dependencies: reusify "^1.0.4" fault@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/fault/-/fault-2.0.1.tgz#d47ca9f37ca26e4bd38374a7c500b5a384755b6c" integrity sha512-WtySTkS4OKev5JtpHXnib4Gxiurzh5NCGvWrFaZ34m6JehfTUhKZvn9njTfw48t6JumVQOmrKqpmGcdwxnhqBQ== dependencies: format "^0.2.0" figgy-pudding@^3.5.1: version "3.5.2" resolved "https://registry.yarnpkg.com/figgy-pudding/-/figgy-pudding-3.5.2.tgz#b4eee8148abb01dcf1d1ac34367d59e12fa61d6e" integrity sha512-0btnI/H8f2pavGMN8w40mlSKOfTK2SVJmBfBeVIj3kNw0swwgzyRq0d5TJVOwodFmtvpPeWPN/MCcfuWF0Ezbw== file-entry-cache@^6.0.1: version "6.0.1" resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-6.0.1.tgz#211b2dd9659cb0394b073e7323ac3c933d522027" integrity sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg== dependencies: flat-cache "^3.0.4" file-uri-to-path@1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz#553a7b8446ff6f684359c445f1e37a05dacc33dd" integrity sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw== file-utils@~0.1.5: version "0.1.5" resolved "https://registry.yarnpkg.com/file-utils/-/file-utils-0.1.5.tgz#dc8153c855387cb4dacb0a1725531fa444a6b48c" integrity sha1-3IFTyFU4fLTaywoXJVMfpESmtIw= dependencies: findup-sync "~0.1.2" glob "~3.2.6" iconv-lite "~0.2.11" isbinaryfile "~0.1.9" lodash "~2.1.0" minimatch "~0.2.12" rimraf "~2.2.2" filename-regex@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/filename-regex/-/filename-regex-2.0.1.tgz#c1c4b9bee3e09725ddb106b75c1e301fe2f18b26" integrity sha1-wcS5vuPglyXdsQa3XB4wH+LxiyY= fileset@0.1.x: version "0.1.8" resolved "https://registry.yarnpkg.com/fileset/-/fileset-0.1.8.tgz#506b91a9396eaa7e32fb42a84077c7a0c736b741" integrity sha1-UGuRqTluqn4y+0KoQHfHoMc2t0E= dependencies: glob "3.x" minimatch "0.x" fill-range@^2.1.0: version "2.2.4" resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-2.2.4.tgz#eb1e773abb056dcd8df2bfdf6af59b8b3a936565" integrity sha512-cnrcCbj01+j2gTG921VZPnHbjmdAf8oQV/iGeV2kZxGSyfYjjTyY79ErsK1WJWMpw6DaApEX72binqJE+/d+5Q== dependencies: is-number "^2.1.0" isobject "^2.0.0" randomatic "^3.0.0" repeat-element "^1.1.2" repeat-string "^1.5.2" fill-range@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-4.0.0.tgz#d544811d428f98eb06a63dc402d2403c328c38f7" integrity sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc= dependencies: extend-shallow "^2.0.1" is-number "^3.0.0" repeat-string "^1.6.1" to-regex-range "^2.1.0" fill-range@^7.0.1: version "7.0.1" resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40" integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ== dependencies: to-regex-range "^5.0.1" finalhandler@~1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.1.2.tgz#b7e7d000ffd11938d0fdb053506f6ebabe9f587d" integrity sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA== dependencies: debug "2.6.9" encodeurl "~1.0.2" escape-html "~1.0.3" on-finished "~2.3.0" parseurl "~1.3.3" statuses "~1.5.0" unpipe "~1.0.0" find-cache-dir@^3.2.0, find-cache-dir@^3.3.2: version "3.3.2" resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-3.3.2.tgz#b30c5b6eff0730731aea9bbd9dbecbd80256d64b" integrity sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig== dependencies: commondir "^1.0.1" make-dir "^3.0.2" pkg-dir "^4.1.0" find-nearest-file@1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/find-nearest-file/-/find-nearest-file-1.0.0.tgz#bf539d7d0f02996631fa2196680f6776762b9f70" integrity sha1-v1OdfQ8CmWYx+iGWaA9ndnYrn3A= find-root@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/find-root/-/find-root-1.1.0.tgz#abcfc8ba76f708c42a97b3d685b7e9450bfb9ce4" integrity sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng== find-up@3.0.0, find-up@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/find-up/-/find-up-3.0.0.tgz#49169f1d7993430646da61ecc5ae355c21c97b73" integrity sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg== dependencies: locate-path "^3.0.0" find-up@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/find-up/-/find-up-2.1.0.tgz#45d1b7e506c717ddd482775a2b77920a3c0c57a7" integrity sha1-RdG35QbHF93UgndaK3eSCjwMV6c= dependencies: locate-path "^2.0.0" find-up@^4.0.0, find-up@^4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/find-up/-/find-up-4.1.0.tgz#97afe7d6cdc0bc5928584b7c8d7b16e8a9aa5d19" integrity sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw== dependencies: locate-path "^5.0.0" path-exists "^4.0.0" find-up@^5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/find-up/-/find-up-5.0.0.tgz#4c92819ecb7083561e4f4a240a86be5198f536fc" integrity sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng== dependencies: locate-path "^6.0.0" path-exists "^4.0.0" find-up@^6.2.0: version "6.2.0" resolved "https://registry.yarnpkg.com/find-up/-/find-up-6.2.0.tgz#f3b81d633fa83bebe64f83a8bab357f86d5914be" integrity sha512-yWHzMzXCaFoABSnFTCPKNFlYoq4mSga9QLRRKOCLSJ33hSkzROB14ITbAWW0QDQDyuzsPQ33S1DsOWQb/oW1yA== dependencies: locate-path "^7.0.0" path-exists "^5.0.0" findup-sync@~0.1.2: version "0.1.3" resolved "https://registry.yarnpkg.com/findup-sync/-/findup-sync-0.1.3.tgz#7f3e7a97b82392c653bf06589bd85190e93c3683" integrity sha1-fz56l7gjksZTvwZYm9hRkOk8NoM= dependencies: glob "~3.2.9" lodash "~2.4.1" firefox-profile@0.2.7: version "0.2.7" resolved "https://registry.yarnpkg.com/firefox-profile/-/firefox-profile-0.2.7.tgz#fe46afc2ed6a96f62c5c3bd446fa259f6014a909" integrity sha1-/kavwu1qlvYsXDvURvoln2AUqQk= dependencies: adm-zip "~0.4.3" archiver "~0.7.1" async "~0.2.9" fs-extra "~0.8.1" lazystream "~0.1.0" node-uuid "~1.4.1" wrench "~1.5.1" xml2js "~0.4.0" fixpack@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/fixpack/-/fixpack-4.0.0.tgz#28b9fb8ca04f89aab382021cfa826b36dc381dfd" integrity sha512-5SM1+H2CcuJ3gGEwTiVo/+nd/hYpNj9Ch3iMDOQ58ndY+VGQ2QdvaUTkd3otjZvYnd/8LF/HkJ5cx7PBq0orCQ== dependencies: alce "1.2.0" chalk "^3.0.0" detect-indent "^6.0.0" detect-newline "^3.1.0" extend-object "^1.0.0" rc "^1.2.8" flat-cache@^3.0.4: version "3.0.4" resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-3.0.4.tgz#61b0338302b2fe9f957dcc32fc2a87f1c3048b11" integrity sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg== dependencies: flatted "^3.1.0" rimraf "^3.0.2" flat@^4.1.0: version "4.1.1" resolved "https://registry.yarnpkg.com/flat/-/flat-4.1.1.tgz#a392059cc382881ff98642f5da4dde0a959f309b" integrity sha512-FmTtBsHskrU6FJ2VxCnsDb84wu9zhmO3cUX2kGFb5tuwhfXxGciiT0oRY+cck35QmG+NmGh5eLz6lLCpWTqwpA== dependencies: is-buffer "~2.0.3" flatted@^3.1.0: version "3.2.4" resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.2.4.tgz#28d9969ea90661b5134259f312ab6aa7929ac5e2" integrity sha512-8/sOawo8tJ4QOBX8YlQBMxL8+RLZfxMQOif9o0KUKTNTjMYElWPE0r/m5VNFxTRd0NSw8qSy8dajrwX4RYI1Hw== for-in@^1.0.1, for-in@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/for-in/-/for-in-1.0.2.tgz#81068d295a8142ec0ac726c6e2200c30fb6d5e80" integrity sha1-gQaNKVqBQuwKxybG4iAMMPttXoA= for-own@^0.1.4: version "0.1.5" resolved "https://registry.yarnpkg.com/for-own/-/for-own-0.1.5.tgz#5265c681a4f294dabbf17c9509b6763aa84510ce" integrity sha1-UmXGgaTylNq78XyVCbZ2OqhFEM4= dependencies: for-in "^1.0.1" forEachAsync@~2.2: version "2.2.1" resolved "https://registry.yarnpkg.com/forEachAsync/-/forEachAsync-2.2.1.tgz#e3723f00903910e1eb4b1db3ad51b5c64a319fec" integrity sha1-43I/AJA5EOHrSx2zrVG1xkoxn+w= dependencies: sequence "2.x" foreach-shim@~0.1.1: version "0.1.1" resolved "https://registry.yarnpkg.com/foreach-shim/-/foreach-shim-0.1.1.tgz#be61d75f46abb7176f5abd295e35885751b71d94" integrity sha1-vmHXX0artxdvWr0pXjWIV1G3HZQ= foreach@^2.0.5: version "2.0.5" resolved "https://registry.yarnpkg.com/foreach/-/foreach-2.0.5.tgz#0bee005018aeb260d0a3af3ae658dd0136ec1b99" integrity sha1-C+4AUBiusmDQo6865ljdATbsG5k= foreground-child@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/foreground-child/-/foreground-child-2.0.0.tgz#71b32800c9f15aa8f2f83f4a6bd9bff35d861a53" integrity sha512-dCIq9FpEcyQyXKCkyzmlPTFNgrCzPudOe+mhvJU5zAtlBnGVy2yKxtfsxK2tQBThwq225jcvBjpw1Gr40uzZCA== dependencies: cross-spawn "^7.0.0" signal-exit "^3.0.2" forever-agent@~0.5.0: version "0.5.2" resolved "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.5.2.tgz#6d0e09c4921f94a27f63d3b49c5feff1ea4c5130" integrity sha1-bQ4JxJIflKJ/Y9O0nF/v8epMUTA= form-data@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/form-data/-/form-data-4.0.0.tgz#93919daeaf361ee529584b9b31664dc12c9fa452" integrity sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww== dependencies: asynckit "^0.4.0" combined-stream "^1.0.8" mime-types "^2.1.12" form-data@~0.0.3: version "0.0.10" resolved "https://registry.yarnpkg.com/form-data/-/form-data-0.0.10.tgz#db345a5378d86aeeb1ed5d553b869ac192d2f5ed" integrity sha1-2zRaU3jYau6x7V1VO4aawZLS9e0= dependencies: async "~0.2.7" combined-stream "~0.0.4" mime "~1.2.2" form-data@~0.1.0: version "0.1.4" resolved "https://registry.yarnpkg.com/form-data/-/form-data-0.1.4.tgz#91abd788aba9702b1aabfa8bc01031a2ac9e3b12" integrity sha1-kavXiKupcCsaq/qLwBAxoqyeOxI= dependencies: async "~0.9.0" combined-stream "~0.0.4" mime "~1.2.11" format@^0.2.0, format@^0.2.2: version "0.2.2" resolved "https://registry.yarnpkg.com/format/-/format-0.2.2.tgz#d6170107e9efdc4ed30c9dc39016df942b5cb58b" integrity sha1-1hcBB+nv3E7TDJ3DkBbflCtctYs= formidable@1.0.14: version "1.0.14" resolved "https://registry.yarnpkg.com/formidable/-/formidable-1.0.14.tgz#2b3f4c411cbb5fdd695c44843e2a23514a43231a" integrity sha1-Kz9MQRy7X91pXESEPiojUUpDIxo= formidable@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/formidable/-/formidable-2.0.1.tgz#4310bc7965d185536f9565184dee74fbb75557ff" integrity sha512-rjTMNbp2BpfQShhFbR3Ruk3qk2y9jKpvMW78nJgx8QKtxjDVrwbZG+wvDOmVbifHyOUOQJXxqEy6r0faRrPzTQ== dependencies: dezalgo "1.0.3" hexoid "1.0.0" once "1.4.0" qs "6.9.3" forwarded@0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.2.0.tgz#2269936428aad4c15c7ebe9779a84bf0b2a81811" integrity sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow== fragment-cache@^0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/fragment-cache/-/fragment-cache-0.2.1.tgz#4290fad27f13e89be7f33799c6bc5a0abfff0d19" integrity sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk= dependencies: map-cache "^0.2.2" fresh@0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.2.0.tgz#bfd9402cf3df12c4a4c310c79f99a3dde13d34a7" integrity sha1-v9lALPPfEsSkwxDHn5mj3eE9NKc= fresh@0.5.2: version "0.5.2" resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7" integrity sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac= from2-string@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/from2-string/-/from2-string-1.1.0.tgz#18282b27d08a267cb3030cd2b8b4b0f212af752a" integrity sha1-GCgrJ9CKJnyzAwzSuLSw8hKvdSo= dependencies: from2 "^2.0.3" from2@^2.0.3: version "2.3.0" resolved "https://registry.yarnpkg.com/from2/-/from2-2.3.0.tgz#8bfb5502bde4a4d36cfdeea007fcca21d7e382af" integrity sha1-i/tVAr3kpNNs/e6gB/zKIdfjgq8= dependencies: inherits "^2.0.1" readable-stream "^2.0.0" fromentries@^1.2.0: version "1.3.2" resolved "https://registry.yarnpkg.com/fromentries/-/fromentries-1.3.2.tgz#e4bca6808816bf8f93b52750f1127f5a6fd86e3a" integrity sha512-cHEpEQHUg0f8XdtZCc2ZAhrHzKzT0MrFUTcvx+hfxYu7rGMDc5SKoXFh+n4YigxsHXRzc6OrCshdR1bWH6HHyg== fs-extra@^10.0.0: version "10.0.0" resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-10.0.0.tgz#9ff61b655dde53fb34a82df84bb214ce802e17c1" integrity sha512-C5owb14u9eJwizKGdchcDUQeFtlSHHthBk8pbX9Vc1PFZrLombudjDnNns88aYslCyF6IY5SUw3Roz6xShcEIQ== dependencies: graceful-fs "^4.2.0" jsonfile "^6.0.1" universalify "^2.0.0" fs-extra@~0.8.1: version "0.8.1" resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-0.8.1.tgz#0e5779ffbfedf511bc755595c7f03c06d4b43e8d" integrity sha1-Dld5/7/t9RG8dVWVx/A8BtS0Po0= dependencies: jsonfile "~1.1.0" mkdirp "0.3.x" ncp "~0.4.2" rimraf "~2.2.0" fs-readdir-recursive@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/fs-readdir-recursive/-/fs-readdir-recursive-1.1.0.tgz#e32fc030a2ccee44a6b5371308da54be0b397d27" integrity sha512-GNanXlVr2pf02+sPN40XN8HG+ePaNcvM0q5mZBd668Obwb0yD5GiUbZOFgwn8kGMY6I3mdyDJzieUy3PTYyTRA== fs.realpath@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8= fsevents@^1.0.0: version "1.2.13" resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-1.2.13.tgz#f325cb0455592428bcf11b383370ef70e3bfcc38" integrity sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw== dependencies: bindings "^1.5.0" nan "^2.12.1" fsevents@~2.3.2: version "2.3.2" resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.2.tgz#8a526f78b8fdf4623b709e0b975c52c24c02fd1a" integrity sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA== function-bind@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== functional-red-black-tree@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz#1b0ab3bd553b2a0d6399d29c0e3ea0b252078327" integrity sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc= gensync@^1.0.0-beta.2: version "1.0.0-beta.2" resolved "https://registry.yarnpkg.com/gensync/-/gensync-1.0.0-beta.2.tgz#32a6ee76c3d7f52d46b2b1ae5d93fea8580a25e0" integrity sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg== get-assigned-identifiers@^1.1.0, get-assigned-identifiers@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/get-assigned-identifiers/-/get-assigned-identifiers-1.2.0.tgz#6dbf411de648cbaf8d9169ebb0d2d576191e2ff1" integrity sha512-mBBwmeGTrxEMO4pMaaf/uUEFHnYtwr8FTe8Y/mer4rcV/bye0qGm6pw1bGZFGStxC5O76c5ZAVBGnqHmOaJpdQ== get-caller-file@^2.0.1, get-caller-file@^2.0.5: version "2.0.5" resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== get-intrinsic@^1.0.2, get-intrinsic@^1.1.0, get-intrinsic@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.1.1.tgz#15f59f376f855c446963948f0d24cd3637b4abc6" integrity sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q== dependencies: function-bind "^1.1.1" has "^1.0.3" has-symbols "^1.0.1" get-package-type@^0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/get-package-type/-/get-package-type-0.1.0.tgz#8de2d803cff44df3bc6c456e6668b36c3926e11a" integrity sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q== get-port@4.2.0: version "4.2.0" resolved "https://registry.yarnpkg.com/get-port/-/get-port-4.2.0.tgz#e37368b1e863b7629c43c5a323625f95cf24b119" integrity sha512-/b3jarXkH8KJoOMQc3uVGHASwGLPq3gSFJ7tgJm2diza+bydJPTGOibin2steecKeOylE8oY2JERlVWkAJO6yw== get-set-props@^0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/get-set-props/-/get-set-props-0.1.0.tgz#998475c178445686d0b32246da5df8dbcfbe8ea3" integrity sha1-mYR1wXhEVobQsyJG2l3428++jqM= get-stdin@^9.0.0: version "9.0.0" resolved "https://registry.yarnpkg.com/get-stdin/-/get-stdin-9.0.0.tgz#3983ff82e03d56f1b2ea0d3e60325f39d703a575" integrity sha512-dVKBjfWisLAicarI2Sf+JuBE/DghV4UzNAVe9yhEJuzeREd3JhOTE9cUaJTeSa77fsbQUK3pcOpJfM59+VKZaA== get-stream@^6.0.0: version "6.0.1" resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-6.0.1.tgz#a262d8eef67aced57c2852ad6167526a43cbf7b7" integrity sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg== get-symbol-description@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/get-symbol-description/-/get-symbol-description-1.0.0.tgz#7fdb81c900101fbd564dd5f1a30af5aadc1e58d6" integrity sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw== dependencies: call-bind "^1.0.2" get-intrinsic "^1.1.1" get-value@^2.0.3, get-value@^2.0.6: version "2.0.6" resolved "https://registry.yarnpkg.com/get-value/-/get-value-2.0.6.tgz#dc15ca1c672387ca76bd37ac0a395ba2042a2c28" integrity sha1-3BXKHGcjh8p2vTesCjlbogQqLCg= git-raw-commits@^2.0.0: version "2.0.11" resolved "https://registry.yarnpkg.com/git-raw-commits/-/git-raw-commits-2.0.11.tgz#bc3576638071d18655e1cc60d7f524920008d723" integrity sha512-VnctFhw+xfj8Va1xtfEqCUD2XDrbAPSJx+hSrE5K7fGdjZruW7XV+QOrN7LF/RJyvspRiD2I0asWsxFp0ya26A== dependencies: dargs "^7.0.0" lodash "^4.17.15" meow "^8.0.0" split2 "^3.0.0" through2 "^4.0.0" github-slugger@^1.2.1: version "1.4.0" resolved "https://registry.yarnpkg.com/github-slugger/-/github-slugger-1.4.0.tgz#206eb96cdb22ee56fdc53a28d5a302338463444e" integrity sha512-w0dzqw/nt51xMVmlaV1+JRzN+oCa1KfcgGEWhxUG16wbdA+Xnt/yoFO8Z8x/V82ZcZ0wy6ln9QDup5avbhiDhQ== glob-base@^0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/glob-base/-/glob-base-0.3.0.tgz#dbb164f6221b1c0b1ccf82aea328b497df0ea3c4" integrity sha1-27Fk9iIbHAscz4Kuoyi0l98Oo8Q= dependencies: glob-parent "^2.0.0" is-glob "^2.0.0" glob-parent@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-2.0.0.tgz#81383d72db054fcccf5336daa902f182f6edbb28" integrity sha1-gTg9ctsFT8zPUzbaqQLxgvbtuyg= dependencies: is-glob "^2.0.0" glob-parent@^5.1.2, glob-parent@~5.1.2: version "5.1.2" resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== dependencies: is-glob "^4.0.1" glob-parent@^6.0.1: version "6.0.2" resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-6.0.2.tgz#6d237d99083950c79290f24c7642a3de9a28f9e3" integrity sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A== dependencies: is-glob "^4.0.3" glob@3.x, glob@~3.2.6, glob@~3.2.9: version "3.2.11" resolved "https://registry.yarnpkg.com/glob/-/glob-3.2.11.tgz#4a973f635b9190f715d10987d5c00fd2815ebe3d" integrity sha1-Spc/Y1uRkPcV0QmH1cAP0oFevj0= dependencies: inherits "2" minimatch "0.3" glob@7.1.3: version "7.1.3" resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.3.tgz#3960832d3f1574108342dafd3a67b332c0969df1" integrity sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ== dependencies: fs.realpath "^1.0.0" inflight "^1.0.4" inherits "2" minimatch "^3.0.4" once "^1.3.0" path-is-absolute "^1.0.0" glob@^5.0.10, glob@^5.0.15: version "5.0.15" resolved "https://registry.yarnpkg.com/glob/-/glob-5.0.15.tgz#1bc936b9e02f4a603fcc222ecf7633d30b8b93b1" integrity sha1-G8k2ueAvSmA/zCIuz3Yz0wuLk7E= dependencies: inflight "^1.0.4" inherits "2" minimatch "2 || 3" once "^1.3.0" path-is-absolute "^1.0.0" glob@^7.0.0, glob@^7.0.5, glob@^7.1.0, glob@^7.1.3, glob@^7.1.4, glob@^7.1.6: version "7.2.0" resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.0.tgz#d15535af7732e02e948f4c41628bd910293f6023" integrity sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q== dependencies: fs.realpath "^1.0.0" inflight "^1.0.4" inherits "2" minimatch "^3.0.4" once "^1.3.0" path-is-absolute "^1.0.0" glob@~4.0.6: version "4.0.6" resolved "https://registry.yarnpkg.com/glob/-/glob-4.0.6.tgz#695c50bdd4e2fb5c5d370b091f388d3707e291a7" integrity sha1-aVxQvdTi+1xdNwsJHziNNwfikac= dependencies: graceful-fs "^3.0.2" inherits "2" minimatch "^1.0.0" once "^1.3.0" glob@~4.3.0: version "4.3.5" resolved "https://registry.yarnpkg.com/glob/-/glob-4.3.5.tgz#80fbb08ca540f238acce5d11d1e9bc41e75173d3" integrity sha1-gPuwjKVA8jiszl0R0em8QedRc9M= dependencies: inflight "^1.0.4" inherits "2" minimatch "^2.0.1" once "^1.3.0" global-dirs@^0.1.1: version "0.1.1" resolved "https://registry.yarnpkg.com/global-dirs/-/global-dirs-0.1.1.tgz#b319c0dd4607f353f3be9cca4c72fc148c49f445" integrity sha1-sxnA3UYH81PzvpzKTHL8FIxJ9EU= dependencies: ini "^1.3.4" globals@^11.1.0: version "11.12.0" resolved "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e" integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA== globals@^13.6.0, globals@^13.9.0: version "13.12.0" resolved "https://registry.yarnpkg.com/globals/-/globals-13.12.0.tgz#4d733760304230a0082ed96e21e5c565f898089e" integrity sha512-uS8X6lSKN2JumVoXrbUz+uG4BYG+eiawqm3qFcT7ammfbUHeCBoJMlHcec/S3krSk73/AE/f0szYFmgAA3kYZg== dependencies: type-fest "^0.20.2" globby@^11.0.4: version "11.0.4" resolved "https://registry.yarnpkg.com/globby/-/globby-11.0.4.tgz#2cbaff77c2f2a62e71e9b2813a67b97a3a3001a5" integrity sha512-9O4MVG9ioZJ08ffbcyVYyLOJLk5JQ688pJ4eMGLpdWLHq/Wr1D9BlriLQyL0E+jbkuePVZXYFj47QM/v093wHg== dependencies: array-union "^2.1.0" dir-glob "^3.0.1" fast-glob "^3.1.1" ignore "^5.1.4" merge2 "^1.3.0" slash "^3.0.0" globby@^12.0.2: version "12.0.2" resolved "https://registry.yarnpkg.com/globby/-/globby-12.0.2.tgz#53788b2adf235602ed4cabfea5c70a1139e1ab11" integrity sha512-lAsmb/5Lww4r7MM9nCCliDZVIKbZTavrsunAsHLr9oHthrZP1qi7/gAnHOsUs9bLvEt2vKVJhHmxuL7QbDuPdQ== dependencies: array-union "^3.0.1" dir-glob "^3.0.1" fast-glob "^3.2.7" ignore "^5.1.8" merge2 "^1.4.1" slash "^4.0.0" globs-to-files@1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/globs-to-files/-/globs-to-files-1.0.0.tgz#54490f6d1f4b9fd2de9d99445146ffb37550380d" integrity sha1-VEkPbR9Ln9LenZlEUUb/s3VQOA0= dependencies: array-uniq "~1.0.2" asyncreduce "~0.1.4" glob "^5.0.10" xtend "^4.0.0" graceful-fs@^3.0.2: version "3.0.12" resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-3.0.12.tgz#0034947ce9ed695ec8ab0b854bc919e82b1ffaef" integrity sha512-J55gaCS4iTTJfTXIxSVw3EMQckcqkpdRv3IR7gu6sq0+tbC363Zx6KH/SEwXASK9JRbhyZmVjJEVJIOxYsB3Qg== dependencies: natives "^1.1.3" graceful-fs@^4.1.11, graceful-fs@^4.1.15, graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.2.0: version "4.2.9" resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.9.tgz#041b05df45755e587a24942279b9d113146e1c96" integrity sha512-NtNxqUcXgpW2iMrfqSfR73Glt39K+BLwWsPs94yR63v45T0Wbej7eRmL5cWfwEgqXnmjQp3zaJTshdRW/qC2ZQ== growl@1.10.5: version "1.10.5" resolved "https://registry.yarnpkg.com/growl/-/growl-1.10.5.tgz#f2735dc2283674fa67478b10181059355c369e5e" integrity sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA== handlebars@1.0.12: version "1.0.12" resolved "https://registry.yarnpkg.com/handlebars/-/handlebars-1.0.12.tgz#18c6d3440c35e91b19b3ff582b9151ab4985d4fc" integrity sha1-GMbTRAw16RsZs/9YK5FRq0mF1Pw= dependencies: optimist "~0.3" uglify-js "~2.3" handlebars@1.3.x: version "1.3.0" resolved "https://registry.yarnpkg.com/handlebars/-/handlebars-1.3.0.tgz#9e9b130a93e389491322d975cf3ec1818c37ce34" integrity sha1-npsTCpPjiUkTItl1zz7BgYw3zjQ= dependencies: optimist "~0.3" optionalDependencies: uglify-js "~2.3" handlebars@^4.0.1: version "4.7.7" resolved "https://registry.yarnpkg.com/handlebars/-/handlebars-4.7.7.tgz#9ce33416aad02dbd6c8fafa8240d5d98004945a1" integrity sha512-aAcXm5OAfE/8IXkcZvCepKU3VzW1/39Fb5ZuqMtgI/hT8X2YgoMvBY5dLhq/cpOvw7Lk1nK/UF71aLG/ZnVYRA== dependencies: minimist "^1.2.5" neo-async "^2.6.0" source-map "^0.6.1" wordwrap "^1.0.0" optionalDependencies: uglify-js "^3.1.4" hard-rejection@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/hard-rejection/-/hard-rejection-2.1.0.tgz#1c6eda5c1685c63942766d79bb40ae773cecd883" integrity sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA== has-ansi@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/has-ansi/-/has-ansi-2.0.0.tgz#34f5049ce1ecdf2b0649af3ef24e45ed35416d91" integrity sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE= dependencies: ansi-regex "^2.0.0" has-bigints@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/has-bigints/-/has-bigints-1.0.1.tgz#64fe6acb020673e3b78db035a5af69aa9d07b113" integrity sha512-LSBS2LjbNBTf6287JEbEzvJgftkF5qFkmCo9hDRpAzKhUOlJ+hx8dd4USs00SgsUNwc4617J9ki5YtEClM2ffA== has-flag@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-1.0.0.tgz#9d9e793165ce017a00f00418c43f942a7b1d11fa" integrity sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo= has-flag@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" integrity sha1-tdRU3CGZriJWmfNGfloH87lVuv0= has-flag@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== has-symbols@^1.0.0, has-symbols@^1.0.1, has-symbols@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.2.tgz#165d3070c00309752a1236a479331e3ac56f1423" integrity sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw== has-tostringtag@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/has-tostringtag/-/has-tostringtag-1.0.0.tgz#7e133818a7d394734f941e73c3d3f9291e658b25" integrity sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ== dependencies: has-symbols "^1.0.2" has-value@^0.3.1: version "0.3.1" resolved "https://registry.yarnpkg.com/has-value/-/has-value-0.3.1.tgz#7b1f58bada62ca827ec0a2078025654845995e1f" integrity sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8= dependencies: get-value "^2.0.3" has-values "^0.1.4" isobject "^2.0.0" has-value@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/has-value/-/has-value-1.0.0.tgz#18b281da585b1c5c51def24c930ed29a0be6b177" integrity sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc= dependencies: get-value "^2.0.6" has-values "^1.0.0" isobject "^3.0.0" has-values@^0.1.4: version "0.1.4" resolved "https://registry.yarnpkg.com/has-values/-/has-values-0.1.4.tgz#6d61de95d91dfca9b9a02089ad384bff8f62b771" integrity sha1-bWHeldkd/Km5oCCJrThL/49it3E= has-values@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/has-values/-/has-values-1.0.0.tgz#95b0b63fec2146619a6fe57fe75628d5a39efe4f" integrity sha1-lbC2P+whRmGab+V/51Yo1aOe/k8= dependencies: is-number "^3.0.0" kind-of "^4.0.0" has@^1.0.0, has@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796" integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw== dependencies: function-bind "^1.1.1" hash-base@^3.0.0: version "3.1.0" resolved "https://registry.yarnpkg.com/hash-base/-/hash-base-3.1.0.tgz#55c381d9e06e1d2997a883b4a3fddfe7f0d3af33" integrity sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA== dependencies: inherits "^2.0.4" readable-stream "^3.6.0" safe-buffer "^5.2.0" hash.js@^1.0.0, hash.js@^1.0.3: version "1.1.7" resolved "https://registry.yarnpkg.com/hash.js/-/hash.js-1.1.7.tgz#0babca538e8d4ee4a0f8988d68866537a003cf42" integrity sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA== dependencies: inherits "^2.0.3" minimalistic-assert "^1.0.1" hasha@^5.0.0: version "5.2.2" resolved "https://registry.yarnpkg.com/hasha/-/hasha-5.2.2.tgz#a48477989b3b327aea3c04f53096d816d97522a1" integrity sha512-Hrp5vIK/xr5SkeN2onO32H0MgNZ0f17HRNH39WfL0SYUNOTZ5Lz1TJ8Pajo/87dYGEFlLMm7mIc/k/s6Bvz9HQ== dependencies: is-stream "^2.0.0" type-fest "^0.8.0" hawk@1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/hawk/-/hawk-1.1.1.tgz#87cd491f9b46e4e2aeaca335416766885d2d1ed9" integrity sha1-h81JH5tG5OKurKM1QWdmiF0tHtk= dependencies: boom "0.4.x" cryptiles "0.2.x" hoek "0.9.x" sntp "0.2.x" hbs@2.4.0: version "2.4.0" resolved "https://registry.yarnpkg.com/hbs/-/hbs-2.4.0.tgz#f4c956cb660d6974dc61214b7c49a21f6aaa3f51" integrity sha1-9MlWy2YNaXTcYSFLfEmiH2qqP1E= dependencies: handlebars "1.0.12" walk "2.2.1" he@1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/he/-/he-1.2.0.tgz#84ae65fa7eafb165fddb61566ae14baf05664f0f" integrity sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw== hexoid@1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/hexoid/-/hexoid-1.0.0.tgz#ad10c6573fb907de23d9ec63a711267d9dc9bc18" integrity sha512-QFLV0taWQOZtvIRIAdBChesmogZrtuXvVWsFHZTk2SU+anspqZ2vMnoLg7IE1+Uk16N19APic1BuF8bC8c2m5g== highlight.js@7.5.0: version "7.5.0" resolved "https://registry.yarnpkg.com/highlight.js/-/highlight.js-7.5.0.tgz#0052595eef15845d842e02a03313afadc3ebd6cc" integrity sha1-AFJZXu8VhF2ELgKgMxOvrcPr1sw= hmac-drbg@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/hmac-drbg/-/hmac-drbg-1.0.1.tgz#d2745701025a6c775a6c545793ed502fc0c649a1" integrity sha1-0nRXAQJabHdabFRXk+1QL8DGSaE= dependencies: hash.js "^1.0.3" minimalistic-assert "^1.0.0" minimalistic-crypto-utils "^1.0.1" hoek@0.9.x: version "0.9.1" resolved "https://registry.yarnpkg.com/hoek/-/hoek-0.9.1.tgz#3d322462badf07716ea7eb85baf88079cddce505" integrity sha1-PTIkYrrfB3Fup+uFuviAec3c5QU= hosted-git-info@^2.1.4: version "2.8.9" resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.8.9.tgz#dffc0bf9a21c02209090f2aa69429e1414daf3f9" integrity sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw== hosted-git-info@^4.0.1: version "4.1.0" resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-4.1.0.tgz#827b82867e9ff1c8d0c4d9d53880397d2c86d224" integrity sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA== dependencies: lru-cache "^6.0.0" html-escaper@^2.0.0: version "2.0.2" resolved "https://registry.yarnpkg.com/html-escaper/-/html-escaper-2.0.2.tgz#dfd60027da36a36dfcbe236262c00a5822681453" integrity sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg== htmlescape@^1.1.0: version "1.1.1" resolved "https://registry.yarnpkg.com/htmlescape/-/htmlescape-1.1.1.tgz#3a03edc2214bca3b66424a3e7959349509cb0351" integrity sha1-OgPtwiFLyjtmQko+eVk0lQnLA1E= http-errors@1.8.1: version "1.8.1" resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.8.1.tgz#7c3f28577cbc8a207388455dbd62295ed07bd68c" integrity sha512-Kpk9Sm7NmI+RHhnj6OIWDI1d6fIoFAtFt9RLaTMRlg/8w49juAStsrBgp0Dp4OdxdVbRIeKhtCUvoi/RuAhO4g== dependencies: depd "~1.1.2" inherits "2.0.4" setprototypeof "1.2.0" statuses ">= 1.5.0 < 2" toidentifier "1.0.1" http-proxy-agent@^4.0.0: version "4.0.1" resolved "https://registry.yarnpkg.com/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz#8a8c8ef7f5932ccf953c296ca8291b95aa74aa3a" integrity sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg== dependencies: "@tootallnate/once" "1" agent-base "6" debug "4" http-proxy@1.11.2: version "1.11.2" resolved "https://registry.yarnpkg.com/http-proxy/-/http-proxy-1.11.2.tgz#c50d2fb06eca79d4238e66fd94393d2e41e63740" integrity sha1-xQ0vsG7KedQjjmb9lDk9LkHmN0A= dependencies: eventemitter3 "1.x.x" requires-port "0.x.x" http-signature@~0.10.0: version "0.10.1" resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-0.10.1.tgz#4fbdac132559aa8323121e540779c0a012b27e66" integrity sha1-T72sEyVZqoMjEh5UB3nAoBKyfmY= dependencies: asn1 "0.1.11" assert-plus "^0.1.5" ctype "0.5.3" https-browserify@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/https-browserify/-/https-browserify-1.0.0.tgz#ec06c10e0a34c0f2faf199f7fd7fc78fffd03c73" integrity sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM= https-browserify@~0.0.0: version "0.0.1" resolved "https://registry.yarnpkg.com/https-browserify/-/https-browserify-0.0.1.tgz#3f91365cabe60b77ed0ebba24b454e3e09d95a82" integrity sha1-P5E2XKvmC3ftDruiS0VOPgnZWoI= https-proxy-agent@^5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-5.0.0.tgz#e2a90542abb68a762e0a0850f6c9edadfd8506b2" integrity sha512-EkYm5BcKUGiduxzSt3Eppko+PiNWNEpa4ySk9vTC6wDsQJW9rHSa+UhGNJoRYp7bz6Ht1eaRIa6QaJqO5rCFbA== dependencies: agent-base "6" debug "4" human-signals@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-2.1.0.tgz#dc91fcba42e4d06e4abaed33b3e7a3c02f514ea0" integrity sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw== humanize-duration@2.4.0: version "2.4.0" resolved "https://registry.yarnpkg.com/humanize-duration/-/humanize-duration-2.4.0.tgz#04da89e6784af1c881b06ebc9f494dda07b08a17" integrity sha1-BNqJ5nhK8ciBsG68n0lN2gewihc= husky@^7.0.4: version "7.0.4" resolved "https://registry.yarnpkg.com/husky/-/husky-7.0.4.tgz#242048245dc49c8fb1bf0cc7cfb98dd722531535" integrity sha512-vbaCKN2QLtP/vD4yvs6iz6hBEo6wkSzs8HpRah1Z6aGmF2KW5PdYuAd7uX5a+OyBZHBhd+TFLqgjUgytQr4RvQ== iconv-lite@0.4.24: version "0.4.24" resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== dependencies: safer-buffer ">= 2.1.2 < 3" iconv-lite@0.4.8: version "0.4.8" resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.8.tgz#c6019a7595f2cefca702eab694a010bcd9298d20" integrity sha1-xgGadZXyzvynAuq2lKAQvNkpjSA= iconv-lite@~0.2.11: version "0.2.11" resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.2.11.tgz#1ce60a3a57864a292d1321ff4609ca4bb965adc8" integrity sha1-HOYKOleGSiktEyH/RgnKS7llrcg= ieee754@^1.1.4: version "1.2.1" resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352" integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA== ignore-walk@3.0.4: version "3.0.4" resolved "https://registry.yarnpkg.com/ignore-walk/-/ignore-walk-3.0.4.tgz#c9a09f69b7c7b479a5d74ac1a3c0d4236d2a6335" integrity sha512-PY6Ii8o1jMRA1z4F2hRkH/xN59ox43DavKvD3oDpfurRlOJyAHpifIwpbdv1n4jt4ov0jSpw3kQ4GhJnpBL6WQ== dependencies: minimatch "^3.0.4" ignore@^4.0.6: version "4.0.6" resolved "https://registry.yarnpkg.com/ignore/-/ignore-4.0.6.tgz#750e3db5862087b4737ebac8207ffd1ef27b25fc" integrity sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg== ignore@^5.0.0, ignore@^5.0.5, ignore@^5.1.1, ignore@^5.1.4, ignore@^5.1.8: version "5.2.0" resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.2.0.tgz#6d3bac8fa7fe0d45d9f9be7bac2fc279577e345a" integrity sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ== import-fresh@^3.0.0, import-fresh@^3.2.1: version "3.3.0" resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.3.0.tgz#37162c25fcb9ebaa2e6e53d5b4d88ce17d9e0c2b" integrity sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw== dependencies: parent-module "^1.0.0" resolve-from "^4.0.0" import-meta-resolve@^1.0.0: version "1.1.1" resolved "https://registry.yarnpkg.com/import-meta-resolve/-/import-meta-resolve-1.1.1.tgz#244fd542fd1fae73550d4f8b3cde3bba1d7b2b18" integrity sha512-JiTuIvVyPaUg11eTrNDx5bgQ/yMKMZffc7YSjvQeSMXy58DO2SQ8BtAf3xteZvmzvjYh14wnqNjL8XVeDy2o9A== dependencies: builtins "^4.0.0" import-modules@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/import-modules/-/import-modules-2.1.0.tgz#abe7df297cb6c1f19b57246eb8b8bd9664b6d8c2" integrity sha512-8HEWcnkbGpovH9yInoisxaSoIg9Brbul+Ju3Kqe2UsYDUBJD/iQjSgEj0zPcTDPKfPp2fs5xlv1i+JSye/m1/A== imurmurhash@^0.1.4: version "0.1.4" resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" integrity sha1-khi5srkoojixPcT7a21XbyMUU+o= indent-string@4, indent-string@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-4.0.0.tgz#624f8f4497d619b2d9768531d58f4122854d7251" integrity sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg== indent-string@^5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-5.0.0.tgz#4fd2980fccaf8622d14c64d694f4cf33c81951a5" integrity sha512-m6FAo/spmsW2Ab2fU35JTYwtOKa2yAwXSwgjSv1TJzh4Mh7mC3lzAOVLBprb72XsTrgkEIsl7YrFNAiDiRhIGg== indexof@0.0.1: version "0.0.1" resolved "https://registry.yarnpkg.com/indexof/-/indexof-0.0.1.tgz#82dc336d232b9062179d05ab3293a66059fd435d" integrity sha1-gtwzbSMrkGIXnQWrMpOmYFn9Q10= inflight@^1.0.4: version "1.0.6" resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" integrity sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk= dependencies: once "^1.3.0" wrappy "1" inherits@2, inherits@2.0.4, inherits@^2.0.0, inherits@^2.0.1, inherits@^2.0.3, inherits@^2.0.4, inherits@~2.0.1, inherits@~2.0.3, inherits@~2.0.4: version "2.0.4" resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== inherits@2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.1.tgz#b17d08d326b4423e568eff719f91b0b1cbdf69f1" integrity sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE= inherits@2.0.3: version "2.0.3" resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" integrity sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4= ini@^1.3.4, ini@^1.3.5, ini@~1.3.0: version "1.3.8" resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.8.tgz#a29da425b48806f34767a4efce397269af28432c" integrity sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew== inline-source-map@~0.6.0: version "0.6.2" resolved "https://registry.yarnpkg.com/inline-source-map/-/inline-source-map-0.6.2.tgz#f9393471c18a79d1724f863fa38b586370ade2a5" integrity sha1-+Tk0ccGKedFyT4Y/o4tYY3Ct4qU= dependencies: source-map "~0.5.3" insert-module-globals@^7.0.0, insert-module-globals@^7.2.1: version "7.2.1" resolved "https://registry.yarnpkg.com/insert-module-globals/-/insert-module-globals-7.2.1.tgz#d5e33185181a4e1f33b15f7bf100ee91890d5cb3" integrity sha512-ufS5Qq9RZN+Bu899eA9QCAYThY+gGW7oRkmb0vC93Vlyu/CFGcH0OYPEjVkDXA5FEbTt1+VWzdoOD3Ny9N+8tg== dependencies: JSONStream "^1.0.3" acorn-node "^1.5.2" combine-source-map "^0.8.0" concat-stream "^1.6.1" is-buffer "^1.1.0" path-is-absolute "^1.0.1" process "~0.11.0" through2 "^2.0.0" undeclared-identifiers "^1.1.2" xtend "^4.0.0" internal-slot@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/internal-slot/-/internal-slot-1.0.3.tgz#7347e307deeea2faac2ac6205d4bc7d34967f59c" integrity sha512-O0DB1JC/sPyZl7cIo78n5dR7eUSwwpYPiXRhTzNxZVAMUuB8vlnRFyLxdrVToks6XPLVnFfbzaVd5WLjhgg+vA== dependencies: get-intrinsic "^1.1.0" has "^1.0.3" side-channel "^1.0.4" interpret@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/interpret/-/interpret-1.4.0.tgz#665ab8bc4da27a774a40584e812e3e0fa45b1a1e" integrity sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA== ipaddr.js@1.9.1: version "1.9.1" resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.9.1.tgz#bff38543eeb8984825079ff3a2a8e6cbd46781b3" integrity sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g== irregular-plurals@^3.2.0: version "3.3.0" resolved "https://registry.yarnpkg.com/irregular-plurals/-/irregular-plurals-3.3.0.tgz#67d0715d4361a60d9fd9ee80af3881c631a31ee2" integrity sha512-MVBLKUTangM3EfRPFROhmWQQKRDsrgI83J8GS3jXy+OwYqiR2/aoWndYQ5416jLE3uaGgLH7ncme3X9y09gZ3g== is-absolute@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-absolute/-/is-absolute-1.0.0.tgz#395e1ae84b11f26ad1795e73c17378e48a301576" integrity sha512-dOWoqflvcydARa360Gvv18DZ/gRuHKi2NU/wU5X1ZFzdYfH29nkiNZsF3mp4OJ3H4yo9Mx8A/uAGNzpzPN3yBA== dependencies: is-relative "^1.0.0" is-windows "^1.0.1" is-accessor-descriptor@^0.1.6: version "0.1.6" resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz#a9e12cb3ae8d876727eeef3843f8a0897b5c98d6" integrity sha1-qeEss66Nh2cn7u84Q/igiXtcmNY= dependencies: kind-of "^3.0.2" is-accessor-descriptor@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz#169c2f6d3df1f992618072365c9b0ea1f6878656" integrity sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ== dependencies: kind-of "^6.0.0" is-alphabetical@^1.0.0: version "1.0.4" resolved "https://registry.yarnpkg.com/is-alphabetical/-/is-alphabetical-1.0.4.tgz#9e7d6b94916be22153745d184c298cbf986a686d" integrity sha512-DwzsA04LQ10FHTZuL0/grVDk4rFoVH1pjAToYwBrHSxcrBIGQuXrQMtD5U1b0U2XVgKZCTLLP8u2Qxqhy3l2Vg== is-alphanumerical@^1.0.0: version "1.0.4" resolved "https://registry.yarnpkg.com/is-alphanumerical/-/is-alphanumerical-1.0.4.tgz#7eb9a2431f855f6b1ef1a78e326df515696c4dbf" integrity sha512-UzoZUr+XfVz3t3v4KyGEniVL9BDRoQtY7tOyrRybkVNjDFWyo1yhXNGrrBTQxp3ib9BLAWs7k2YKBQsFRkZG9A== dependencies: is-alphabetical "^1.0.0" is-decimal "^1.0.0" is-arguments@^1.0.4: version "1.1.1" resolved "https://registry.yarnpkg.com/is-arguments/-/is-arguments-1.1.1.tgz#15b3f88fda01f2a97fec84ca761a560f123efa9b" integrity sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA== dependencies: call-bind "^1.0.2" has-tostringtag "^1.0.0" is-arrayish@^0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" integrity sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0= is-bigint@^1.0.1: version "1.0.4" resolved "https://registry.yarnpkg.com/is-bigint/-/is-bigint-1.0.4.tgz#08147a1875bc2b32005d41ccd8291dffc6691df3" integrity sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg== dependencies: has-bigints "^1.0.1" is-binary-path@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-1.0.1.tgz#75f16642b480f187a711c814161fd3a4a7655898" integrity sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg= dependencies: binary-extensions "^1.0.0" is-binary-path@~2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-2.1.0.tgz#ea1f7f3b80f064236e83470f86c09c254fb45b09" integrity sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw== dependencies: binary-extensions "^2.0.0" is-boolean-object@^1.1.0: version "1.1.2" resolved "https://registry.yarnpkg.com/is-boolean-object/-/is-boolean-object-1.1.2.tgz#5c6dc200246dd9321ae4b885a114bb1f75f63719" integrity sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA== dependencies: call-bind "^1.0.2" has-tostringtag "^1.0.0" is-buffer@^1.1.0, is-buffer@^1.1.5: version "1.1.6" resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be" integrity sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w== is-buffer@^2.0.0, is-buffer@~2.0.3: version "2.0.5" resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-2.0.5.tgz#ebc252e400d22ff8d77fa09888821a24a658c191" integrity sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ== is-builtin-module@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/is-builtin-module/-/is-builtin-module-3.1.0.tgz#6fdb24313b1c03b75f8b9711c0feb8c30b903b00" integrity sha512-OV7JjAgOTfAFJmHZLvpSTb4qi0nIILDV1gWPYDnDJUTNFM5aGlRAhk4QcT8i7TuAleeEV5Fdkqn3t4mS+Q11fg== dependencies: builtin-modules "^3.0.0" is-callable@^1.1.4, is-callable@^1.2.4: version "1.2.4" resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.4.tgz#47301d58dd0259407865547853df6d61fe471945" integrity sha512-nsuwtxZfMX67Oryl9LCQ+upnC0Z0BgpwntpS89m1H/TLF0zNfzfLMV/9Wa/6MZsj0acpEjAO0KF1xT6ZdLl95w== is-core-module@^2.5.0, is-core-module@^2.7.0, is-core-module@^2.8.0: version "2.8.1" resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.8.1.tgz#f59fdfca701d5879d0a6b100a40aa1560ce27211" integrity sha512-SdNCUs284hr40hFTFP6l0IfZ/RSrMXF3qgoRHd3/79unUTvrFO/JoXwkGm+5J/Oe3E/b5GsnG330uUNgRpu1PA== dependencies: has "^1.0.3" is-data-descriptor@^0.1.4: version "0.1.4" resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz#0b5ee648388e2c860282e793f1856fec3f301b56" integrity sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y= dependencies: kind-of "^3.0.2" is-data-descriptor@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz#d84876321d0e7add03990406abbbbd36ba9268c7" integrity sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ== dependencies: kind-of "^6.0.0" is-date-object@^1.0.1: version "1.0.5" resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.5.tgz#0841d5536e724c25597bf6ea62e1bd38298df31f" integrity sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ== dependencies: has-tostringtag "^1.0.0" is-decimal@^1.0.0: version "1.0.4" resolved "https://registry.yarnpkg.com/is-decimal/-/is-decimal-1.0.4.tgz#65a3a5958a1c5b63a706e1b333d7cd9f630d3fa5" integrity sha512-RGdriMmQQvZ2aqaQq3awNA6dCGtKpiDFcOzrTWrDAT2MiWrKQVPmxLGHl7Y2nNu6led0kEyoX0enY0qXYsv9zw== is-descriptor@^0.1.0: version "0.1.6" resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-0.1.6.tgz#366d8240dde487ca51823b1ab9f07a10a78251ca" integrity sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg== dependencies: is-accessor-descriptor "^0.1.6" is-data-descriptor "^0.1.4" kind-of "^5.0.0" is-descriptor@^1.0.0, is-descriptor@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-1.0.2.tgz#3b159746a66604b04f8c81524ba365c5f14d86ec" integrity sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg== dependencies: is-accessor-descriptor "^1.0.0" is-data-descriptor "^1.0.0" kind-of "^6.0.2" is-docker@^2.0.0, is-docker@^2.1.1: version "2.2.1" resolved "https://registry.yarnpkg.com/is-docker/-/is-docker-2.2.1.tgz#33eeabe23cfe86f14bde4408a02c0cfb853acdaa" integrity sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ== is-dotfile@^1.0.0: version "1.0.3" resolved "https://registry.yarnpkg.com/is-dotfile/-/is-dotfile-1.0.3.tgz#a6a2f32ffd2dfb04f5ca25ecd0f6b83cf798a1e1" integrity sha1-pqLzL/0t+wT1yiXs0Pa4PPeYoeE= is-empty@^1.0.0: version "1.2.0" resolved "https://registry.yarnpkg.com/is-empty/-/is-empty-1.2.0.tgz#de9bb5b278738a05a0b09a57e1fb4d4a341a9f6b" integrity sha1-3pu1snhzigWgsJpX4ftNSjQan2s= is-equal-shallow@^0.1.3: version "0.1.3" resolved "https://registry.yarnpkg.com/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz#2238098fc221de0bcfa5d9eac4c45d638aa1c534" integrity sha1-IjgJj8Ih3gvPpdnqxMRdY4qhxTQ= dependencies: is-primitive "^2.0.0" is-extendable@^0.1.0, is-extendable@^0.1.1: version "0.1.1" resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-0.1.1.tgz#62b110e289a471418e3ec36a617d472e301dfc89" integrity sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik= is-extendable@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-1.0.1.tgz#a7470f9e426733d81bd81e1155264e3a3507cab4" integrity sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA== dependencies: is-plain-object "^2.0.4" is-extglob@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-1.0.0.tgz#ac468177c4943405a092fc8f29760c6ffc6206c0" integrity sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA= is-extglob@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" integrity sha1-qIwCU1eR8C7TfHahueqXc8gz+MI= is-fullwidth-code-point@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f" integrity sha1-o7MKXE8ZkYMWeqq5O+764937ZU8= is-fullwidth-code-point@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== is-fullwidth-code-point@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-4.0.0.tgz#fae3167c729e7463f8461ce512b080a49268aa88" integrity sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ== is-generator-function@^1.0.7: version "1.0.10" resolved "https://registry.yarnpkg.com/is-generator-function/-/is-generator-function-1.0.10.tgz#f1558baf1ac17e0deea7c0415c438351ff2b3c72" integrity sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A== dependencies: has-tostringtag "^1.0.0" is-get-set-prop@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-get-set-prop/-/is-get-set-prop-1.0.0.tgz#2731877e4d78a6a69edcce6bb9d68b0779e76312" integrity sha1-JzGHfk14pqae3M5rudaLB3nnYxI= dependencies: get-set-props "^0.1.0" lowercase-keys "^1.0.0" is-glob@^2.0.0, is-glob@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-2.0.1.tgz#d096f926a3ded5600f3fdfd91198cb0888c2d863" integrity sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM= dependencies: is-extglob "^1.0.0" is-glob@^4.0.0, is-glob@^4.0.1, is-glob@^4.0.3, is-glob@~4.0.1: version "4.0.3" resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084" integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== dependencies: is-extglob "^2.1.1" is-hexadecimal@^1.0.0: version "1.0.4" resolved "https://registry.yarnpkg.com/is-hexadecimal/-/is-hexadecimal-1.0.4.tgz#cc35c97588da4bd49a8eedd6bc4082d44dcb23a7" integrity sha512-gyPJuv83bHMpocVYoqof5VDiZveEoGoFL8m3BXNb2VW8Xs+rz9kqO8LOQ5DH6EsuvilT1ApazU0pyl+ytbPtlw== is-js-type@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/is-js-type/-/is-js-type-2.0.0.tgz#73617006d659b4eb4729bba747d28782df0f7e22" integrity sha1-c2FwBtZZtOtHKbunR9KHgt8PfiI= dependencies: js-types "^1.0.0" is-negated-glob@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-negated-glob/-/is-negated-glob-1.0.0.tgz#6910bca5da8c95e784b5751b976cf5a10fee36d2" integrity sha1-aRC8pdqMleeEtXUbl2z1oQ/uNtI= is-negative-zero@^2.0.1: version "2.0.2" resolved "https://registry.yarnpkg.com/is-negative-zero/-/is-negative-zero-2.0.2.tgz#7bf6f03a28003b8b3965de3ac26f664d765f3150" integrity sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA== is-number-object@^1.0.4: version "1.0.6" resolved "https://registry.yarnpkg.com/is-number-object/-/is-number-object-1.0.6.tgz#6a7aaf838c7f0686a50b4553f7e54a96494e89f0" integrity sha512-bEVOqiRcvo3zO1+G2lVMy+gkkEm9Yh7cDMRusKKu5ZJKPUYSJwICTKZrNKHA2EbSP0Tu0+6B/emsYNHZyn6K8g== dependencies: has-tostringtag "^1.0.0" is-number@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/is-number/-/is-number-2.1.0.tgz#01fcbbb393463a548f2f466cce16dece49db908f" integrity sha1-Afy7s5NGOlSPL0ZszhbezknbkI8= dependencies: kind-of "^3.0.2" is-number@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/is-number/-/is-number-3.0.0.tgz#24fd6201a4782cf50561c810276afc7d12d71195" integrity sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU= dependencies: kind-of "^3.0.2" is-number@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/is-number/-/is-number-4.0.0.tgz#0026e37f5454d73e356dfe6564699867c6a7f0ff" integrity sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ== is-number@^7.0.0: version "7.0.0" resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== is-obj-prop@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-obj-prop/-/is-obj-prop-1.0.0.tgz#b34de79c450b8d7c73ab2cdf67dc875adb85f80e" integrity sha1-s03nnEULjXxzqyzfZ9yHWtuF+A4= dependencies: lowercase-keys "^1.0.0" obj-props "^1.0.0" is-obj@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/is-obj/-/is-obj-2.0.0.tgz#473fb05d973705e3fd9620545018ca8e22ef4982" integrity sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w== is-plain-obj@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-1.1.0.tgz#71a50c8429dfca773c92a390a4a03b39fcd51d3e" integrity sha1-caUMhCnfync8kqOQpKA7OfzVHT4= is-plain-obj@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-2.1.0.tgz#45e42e37fccf1f40da8e5f76ee21515840c09287" integrity sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA== is-plain-obj@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-4.0.0.tgz#06c0999fd7574edf5a906ba5644ad0feb3a84d22" integrity sha512-NXRbBtUdBioI73y/HmOhogw/U5msYPC9DAtGkJXeFcFWSFZw0mCUsPxk/snTuJHzNKA8kLBK4rH97RMB1BfCXw== is-plain-object@^2.0.3, is-plain-object@^2.0.4: version "2.0.4" resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-2.0.4.tgz#2c163b3fafb1b606d9d17928f05c2a1c38e07677" integrity sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og== dependencies: isobject "^3.0.1" is-posix-bracket@^0.1.0: version "0.1.1" resolved "https://registry.yarnpkg.com/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz#3334dc79774368e92f016e6fbc0a88f5cd6e6bc4" integrity sha1-MzTceXdDaOkvAW5vvAqI9c1ua8Q= is-primitive@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/is-primitive/-/is-primitive-2.0.0.tgz#207bab91638499c07b2adf240a41a87210034575" integrity sha1-IHurkWOEmcB7Kt8kCkGochADRXU= is-proto-prop@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/is-proto-prop/-/is-proto-prop-2.0.0.tgz#99ab2863462e44090fd083efd1929058f9d935e1" integrity sha512-jl3NbQ/fGLv5Jhan4uX+Ge9ohnemqyblWVVCpAvtTQzNFvV2xhJq+esnkIbYQ9F1nITXoLfDDQLp7LBw/zzncg== dependencies: lowercase-keys "^1.0.0" proto-props "^2.0.0" is-regex@^1.0.4, is-regex@^1.1.4: version "1.1.4" resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.1.4.tgz#eef5663cd59fa4c0ae339505323df6854bb15958" integrity sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg== dependencies: call-bind "^1.0.2" has-tostringtag "^1.0.0" is-relative@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-relative/-/is-relative-1.0.0.tgz#a1bb6935ce8c5dba1e8b9754b9b2dcc020e2260d" integrity sha512-Kw/ReK0iqwKeu0MITLFuj0jbPAmEiOsIwyIXvvbfa6QfmN9pkD1M+8pdk7Rl/dTKbH34/XBFMbgD4iMJhLQbGA== dependencies: is-unc-path "^1.0.0" is-shared-array-buffer@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/is-shared-array-buffer/-/is-shared-array-buffer-1.0.1.tgz#97b0c85fbdacb59c9c446fe653b82cf2b5b7cfe6" integrity sha512-IU0NmyknYZN0rChcKhRO1X8LYz5Isj/Fsqh8NJOSf+N/hCOTwy29F32Ik7a+QszE63IdvmwdTPDd6cZ5pg4cwA== is-stream@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-2.0.1.tgz#fac1e3d53b97ad5a9d0ae9cef2389f5810a5c077" integrity sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg== is-string@^1.0.5, is-string@^1.0.7: version "1.0.7" resolved "https://registry.yarnpkg.com/is-string/-/is-string-1.0.7.tgz#0dd12bf2006f255bb58f695110eff7491eebc0fd" integrity sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg== dependencies: has-tostringtag "^1.0.0" is-symbol@^1.0.2, is-symbol@^1.0.3: version "1.0.4" resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.4.tgz#a6dac93b635b063ca6872236de88910a57af139c" integrity sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg== dependencies: has-symbols "^1.0.2" is-text-path@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/is-text-path/-/is-text-path-1.0.1.tgz#4e1aa0fb51bfbcb3e92688001397202c1775b66e" integrity sha1-Thqg+1G/vLPpJogAE5cgLBd1tm4= dependencies: text-extensions "^1.0.0" is-typed-array@^1.1.3, is-typed-array@^1.1.7: version "1.1.8" resolved "https://registry.yarnpkg.com/is-typed-array/-/is-typed-array-1.1.8.tgz#cbaa6585dc7db43318bc5b89523ea384a6f65e79" integrity sha512-HqH41TNZq2fgtGT8WHVFVJhBVGuY3AnP3Q36K8JKXUxSxRgk/d+7NjmwG2vo2mYmXK8UYZKu0qH8bVP5gEisjA== dependencies: available-typed-arrays "^1.0.5" call-bind "^1.0.2" es-abstract "^1.18.5" foreach "^2.0.5" has-tostringtag "^1.0.0" is-typedarray@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" integrity sha1-5HnICFjfDBsR3dppQPlgEfzaSpo= is-unc-path@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-unc-path/-/is-unc-path-1.0.0.tgz#d731e8898ed090a12c352ad2eaed5095ad322c9d" integrity sha512-mrGpVd0fs7WWLfVsStvgF6iEJnbjDFZh9/emhRDcGWTduTfNHd9CHeUwH3gYIjdbwo4On6hunkztwOaAw0yllQ== dependencies: unc-path-regex "^0.1.2" is-unicode-supported@^0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz#3f26c76a809593b52bfa2ecb5710ed2779b522a7" integrity sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw== is-url@^1.2.2: version "1.2.4" resolved "https://registry.yarnpkg.com/is-url/-/is-url-1.2.4.tgz#04a4df46d28c4cff3d73d01ff06abeb318a1aa52" integrity sha512-ITvGim8FhRiYe4IQ5uHSkj7pVaPDrCTkNd3yq3cV7iZAcJdHTUMPMEHcqSOy9xZ9qFenQCvi+2wjH9a1nXqHww== is-weakref@^1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/is-weakref/-/is-weakref-1.0.2.tgz#9529f383a9338205e89765e0392efc2f100f06f2" integrity sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ== dependencies: call-bind "^1.0.2" is-windows@^1.0.1, is-windows@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-1.0.2.tgz#d1850eb9791ecd18e6182ce12a30f396634bb19d" integrity sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA== is-wsl@^2.2.0: version "2.2.0" resolved "https://registry.yarnpkg.com/is-wsl/-/is-wsl-2.2.0.tgz#74a4c76e77ca9fd3f932f290c17ea326cd157271" integrity sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww== dependencies: is-docker "^2.0.0" isarray@0.0.1: version "0.0.1" resolved "https://registry.yarnpkg.com/isarray/-/isarray-0.0.1.tgz#8a18acfca9a8f4177e09abfc6038939b05d1eedf" integrity sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8= isarray@1.0.0, isarray@^1.0.0, isarray@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" integrity sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE= isarray@^2.0.1: version "2.0.5" resolved "https://registry.yarnpkg.com/isarray/-/isarray-2.0.5.tgz#8af1e4c1221244cc62459faf38940d4e644a5723" integrity sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw== isbinaryfile@~0.1.9: version "0.1.9" resolved "https://registry.yarnpkg.com/isbinaryfile/-/isbinaryfile-0.1.9.tgz#15eece35c4ab708d8924da99fb874f2b5cc0b6c4" integrity sha1-Fe7ONcSrcI2JJNqZ+4dPK1zAtsQ= isexe@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" integrity sha1-6PvzdNxVb/iUehDcsFctYz8s+hA= isobject@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/isobject/-/isobject-2.1.0.tgz#f065561096a3f1da2ef46272f815c840d87e0c89" integrity sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk= dependencies: isarray "1.0.0" isobject@^3.0.0, isobject@^3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df" integrity sha1-TkMekrEalzFjaqH5yNHMvP2reN8= istanbul-lib-coverage@^3.0.0, istanbul-lib-coverage@^3.0.0-alpha.1: version "3.2.0" resolved "https://registry.yarnpkg.com/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz#189e7909d0a39fa5a3dfad5b03f71947770191d3" integrity sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw== istanbul-lib-hook@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/istanbul-lib-hook/-/istanbul-lib-hook-3.0.0.tgz#8f84c9434888cc6b1d0a9d7092a76d239ebf0cc6" integrity sha512-Pt/uge1Q9s+5VAZ+pCo16TYMWPBIl+oaNIjgLQxcX0itS6ueeaA+pEfThZpH8WxhFgCiEb8sAJY6MdUKgiIWaQ== dependencies: append-transform "^2.0.0" istanbul-lib-instrument@^4.0.0: version "4.0.3" resolved "https://registry.yarnpkg.com/istanbul-lib-instrument/-/istanbul-lib-instrument-4.0.3.tgz#873c6fff897450118222774696a3f28902d77c1d" integrity sha512-BXgQl9kf4WTCPCCpmFGoJkz/+uhvm7h7PFKUYxh7qarQd3ER33vHG//qaE8eN25l07YqZPpHXU9I09l/RD5aGQ== dependencies: "@babel/core" "^7.7.5" "@istanbuljs/schema" "^0.1.2" istanbul-lib-coverage "^3.0.0" semver "^6.3.0" istanbul-lib-processinfo@^2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/istanbul-lib-processinfo/-/istanbul-lib-processinfo-2.0.2.tgz#e1426514662244b2f25df728e8fd1ba35fe53b9c" integrity sha512-kOwpa7z9hme+IBPZMzQ5vdQj8srYgAtaRqeI48NGmAQ+/5yKiHLV0QbYqQpxsdEF0+w14SoB8YbnHKcXE2KnYw== dependencies: archy "^1.0.0" cross-spawn "^7.0.0" istanbul-lib-coverage "^3.0.0-alpha.1" make-dir "^3.0.0" p-map "^3.0.0" rimraf "^3.0.0" uuid "^3.3.3" istanbul-lib-report@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz#7518fe52ea44de372f460a76b5ecda9ffb73d8a6" integrity sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw== dependencies: istanbul-lib-coverage "^3.0.0" make-dir "^3.0.0" supports-color "^7.1.0" istanbul-lib-source-maps@^4.0.0: version "4.0.1" resolved "https://registry.yarnpkg.com/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz#895f3a709fcfba34c6de5a42939022f3e4358551" integrity sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw== dependencies: debug "^4.1.1" istanbul-lib-coverage "^3.0.0" source-map "^0.6.1" istanbul-middleware@0.2.2: version "0.2.2" resolved "https://registry.yarnpkg.com/istanbul-middleware/-/istanbul-middleware-0.2.2.tgz#83c4c13c128e1a0d6a147792391af3c15a8ab8e0" integrity sha1-g8TBPBKOGg1qFHeSORrzwVqKuOA= dependencies: archiver "0.14.x" body-parser "~1.12.3" express "4.x" istanbul "0.4.x" istanbul-reports@^3.0.2: version "3.1.3" resolved "https://registry.yarnpkg.com/istanbul-reports/-/istanbul-reports-3.1.3.tgz#4bcae3103b94518117930d51283690960b50d3c2" integrity sha512-x9LtDVtfm/t1GFiLl3NffC7hz+I1ragvgX1P/Lg1NlIagifZDKUkuuaAxH/qpwj2IuEfD8G2Bs/UKp+sZ/pKkg== dependencies: html-escaper "^2.0.0" istanbul-lib-report "^3.0.0" istanbul@0.4.x: version "0.4.5" resolved "https://registry.yarnpkg.com/istanbul/-/istanbul-0.4.5.tgz#65c7d73d4c4da84d4f3ac310b918fb0b8033733b" integrity sha1-ZcfXPUxNqE1POsMQuRj7C4Azczs= dependencies: abbrev "1.0.x" async "1.x" escodegen "1.8.x" esprima "2.7.x" glob "^5.0.15" handlebars "^4.0.1" js-yaml "3.x" mkdirp "0.5.x" nopt "3.x" once "1.x" resolve "1.1.x" supports-color "^3.1.0" which "^1.1.1" wordwrap "^1.0.0" istanbul@^0.2.8: version "0.2.16" resolved "https://registry.yarnpkg.com/istanbul/-/istanbul-0.2.16.tgz#870545a0d4f4b4ce161039e9e805a98c2c700bd9" integrity sha1-hwVFoNT0tM4WEDnp6AWpjCxwC9k= dependencies: abbrev "1.0.x" async "0.9.x" escodegen "1.3.x" esprima "1.2.x" fileset "0.1.x" handlebars "1.3.x" js-yaml "3.x" mkdirp "0.5.x" nopt "3.x" resolve "0.7.x" which "1.0.x" wordwrap "0.0.x" js-tokens@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== js-types@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/js-types/-/js-types-1.0.0.tgz#d242e6494ed572ad3c92809fc8bed7f7687cbf03" integrity sha1-0kLmSU7Vcq08koCfyL7X92h8vwM= js-yaml@3.13.1: version "3.13.1" resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.13.1.tgz#aff151b30bfdfa8e49e05da22e7415e9dfa37847" integrity sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw== dependencies: argparse "^1.0.7" esprima "^4.0.0" js-yaml@3.14.1, js-yaml@3.x, js-yaml@^3.13.1: version "3.14.1" resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.14.1.tgz#dae812fdb3825fa306609a8717383c50c36a0537" integrity sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g== dependencies: argparse "^1.0.7" esprima "^4.0.0" js-yaml@^4.0.0, js-yaml@^4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-4.1.0.tgz#c1fb65f8f5017901cdd2c951864ba18458a10602" integrity sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA== dependencies: argparse "^2.0.1" jsesc@^2.5.1: version "2.5.2" resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-2.5.2.tgz#80564d2e483dacf6e8ef209650a67df3f0c283a4" integrity sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA== jsesc@~0.5.0: version "0.5.0" resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-0.5.0.tgz#e7dee66e35d6fc16f710fe91d5cf69f70f08911d" integrity sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0= json-parse-even-better-errors@^2.3.0, json-parse-even-better-errors@^2.3.1: version "2.3.1" resolved "https://registry.yarnpkg.com/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz#7c47805a94319928e05777405dc12e1f7a4ee02d" integrity sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w== json-schema-traverse@^0.4.1: version "0.4.1" resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== json-stable-stringify-without-jsonify@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651" integrity sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE= json-stable-stringify@~0.0.0: version "0.0.1" resolved "https://registry.yarnpkg.com/json-stable-stringify/-/json-stable-stringify-0.0.1.tgz#611c23e814db375527df851193db59dd2af27f45" integrity sha1-YRwj6BTbN1Un34URk9tZ3Sryf0U= dependencies: jsonify "~0.0.0" json-stringify-safe@~5.0.0: version "5.0.1" resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb" integrity sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus= json5@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/json5/-/json5-1.0.1.tgz#779fb0018604fa854eacbf6252180d83543e3dbe" integrity sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow== dependencies: minimist "^1.2.0" json5@^2.0.0, json5@^2.1.2, json5@^2.2.0: version "2.2.0" resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.0.tgz#2dfefe720c6ba525d9ebd909950f0515316c89a3" integrity sha512-f+8cldu7X/y7RAJurMEJmdoKXGB/X550w2Nr3tTbezL6RwEE/iMcm+tZnXeoZtKuOq6ft8+CqzEkrIgx1fPoQA== dependencies: minimist "^1.2.5" jsonfile@^6.0.1: version "6.1.0" resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-6.1.0.tgz#bc55b2634793c679ec6403094eb13698a6ec0aae" integrity sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ== dependencies: universalify "^2.0.0" optionalDependencies: graceful-fs "^4.1.6" jsonfile@~1.1.0: version "1.1.1" resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-1.1.1.tgz#da4fd6ad77f1a255203ea63c7bc32dc31ef64433" integrity sha1-2k/WrXfxolUgPqY8e8Mtwx72RDM= jsonify@~0.0.0: version "0.0.0" resolved "https://registry.yarnpkg.com/jsonify/-/jsonify-0.0.0.tgz#2c74b6ee41d93ca51b7b5aaee8f503631d252a73" integrity sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM= jsonparse@^1.2.0: version "1.3.1" resolved "https://registry.yarnpkg.com/jsonparse/-/jsonparse-1.3.1.tgz#3f4dae4a91fac315f71062f8521cc239f1366280" integrity sha1-P02uSpH6wxX3EGL4UhzCOfE2YoA= keypress@0.1.x: version "0.1.0" resolved "https://registry.yarnpkg.com/keypress/-/keypress-0.1.0.tgz#4a3188d4291b66b4f65edb99f806aa9ae293592a" integrity sha1-SjGI1CkbZrT2XtuZ+AaqmuKTWSo= kind-of@^3.0.2, kind-of@^3.0.3, kind-of@^3.2.0: version "3.2.2" resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-3.2.2.tgz#31ea21a734bab9bbb0f32466d893aea51e4a3c64" integrity sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ= dependencies: is-buffer "^1.1.5" kind-of@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-4.0.0.tgz#20813df3d712928b207378691a45066fae72dd57" integrity sha1-IIE989cSkosgc3hpGkUGb65y3Vc= dependencies: is-buffer "^1.1.5" kind-of@^5.0.0: version "5.1.0" resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-5.1.0.tgz#729c91e2d857b7a419a1f9aa65685c4c33f5845d" integrity sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw== kind-of@^6.0.0, kind-of@^6.0.2, kind-of@^6.0.3: version "6.0.3" resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.3.tgz#07c05034a6c349fa06e24fa35aa76db4580ce4dd" integrity sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw== kleur@^4.0.3: version "4.1.4" resolved "https://registry.yarnpkg.com/kleur/-/kleur-4.1.4.tgz#8c202987d7e577766d039a8cd461934c01cda04d" integrity sha512-8QADVssbrFjivHWQU7KkMgptGTl6WAcSdlbBPY4uNF+mWr6DGcKrvY2w4FQJoXch7+fKMjj0dRrL75vk3k23OA== labeled-stream-splicer@^2.0.0: version "2.0.2" resolved "https://registry.yarnpkg.com/labeled-stream-splicer/-/labeled-stream-splicer-2.0.2.tgz#42a41a16abcd46fd046306cf4f2c3576fffb1c21" integrity sha512-Ca4LSXFFZUjPScRaqOcFxneA0VpKZr4MMYCljyQr4LIewTLb3Y0IUTIsnBBsVubIeEfxeSZpSjSsRM8APEQaAw== dependencies: inherits "^2.0.1" stream-splicer "^2.0.0" lazystream@~0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/lazystream/-/lazystream-0.1.0.tgz#1b25d63c772a4c20f0a5ed0a9d77f484b6e16920" integrity sha1-GyXWPHcqTCDwpe0KnXf0hLbhaSA= dependencies: readable-stream "~1.0.2" levn@^0.4.1: version "0.4.1" resolved "https://registry.yarnpkg.com/levn/-/levn-0.4.1.tgz#ae4562c007473b932a6200d403268dd2fffc6ade" integrity sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ== dependencies: prelude-ls "^1.2.1" type-check "~0.4.0" levn@~0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/levn/-/levn-0.3.0.tgz#3b09924edf9f083c0490fdd4c0bc4421e04764ee" integrity sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4= dependencies: prelude-ls "~1.1.2" type-check "~0.3.2" libnpmconfig@^1.0.0: version "1.2.1" resolved "https://registry.yarnpkg.com/libnpmconfig/-/libnpmconfig-1.2.1.tgz#c0c2f793a74e67d4825e5039e7a02a0044dfcbc0" integrity sha512-9esX8rTQAHqarx6qeZqmGQKBNZR5OIbl/Ayr0qQDy3oXja2iFVQQI81R6GZ2a02bSNZ9p3YOGX1O6HHCb1X7kA== dependencies: figgy-pudding "^3.5.1" find-up "^3.0.0" ini "^1.3.5" lilconfig@2.0.4: version "2.0.4" resolved "https://registry.yarnpkg.com/lilconfig/-/lilconfig-2.0.4.tgz#f4507d043d7058b380b6a8f5cb7bcd4b34cee082" integrity sha512-bfTIN7lEsiooCocSISTWXkiWJkRqtL9wYtYy+8EK3Y41qh3mpwPU0ycTOgjdY9ErwXCc8QyrQp82bdL0Xkm9yA== line-column-path@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/line-column-path/-/line-column-path-3.0.0.tgz#c873b42feb57f5f97bc72af30d21581076b3119e" integrity sha512-Atocnm7Wr9nuvAn97yEPQa3pcQI5eLQGBz+m6iTb+CVw+IOzYB9MrYK7jI7BfC9ISnT4Fu0eiwhAScV//rp4Hw== dependencies: type-fest "^2.0.0" lines-and-columns@^1.1.6: version "1.2.4" resolved "https://registry.yarnpkg.com/lines-and-columns/-/lines-and-columns-1.2.4.tgz#eca284f75d2965079309dc0ad9255abb2ebc1632" integrity sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg== lines-and-columns@^2.0.2: version "2.0.3" resolved "https://registry.yarnpkg.com/lines-and-columns/-/lines-and-columns-2.0.3.tgz#b2f0badedb556b747020ab8ea7f0373e22efac1b" integrity sha512-cNOjgCnLB+FnvWWtyRTzmB3POJ+cXxTA81LoW7u8JdmhfXzriropYwpjShnz1QLLWsQwY7nIxoDmcPTwphDK9w== lint-staged@^12.1.2: version "12.1.5" resolved "https://registry.yarnpkg.com/lint-staged/-/lint-staged-12.1.5.tgz#e05582fc39aed5cb13b9dd1dfb8330407246d809" integrity sha512-WyKb+0sNKDTd1LwwAfTBPp0XmdaKkAOEbg4oHE4Kq2+oQVchg/VAcjVQtSqZih1izNsTURjc2EkhG/syRQUXdA== dependencies: cli-truncate "^3.1.0" colorette "^2.0.16" commander "^8.3.0" debug "^4.3.3" execa "^5.1.1" lilconfig "2.0.4" listr2 "^3.13.5" micromatch "^4.0.4" normalize-path "^3.0.0" object-inspect "^1.11.1" string-argv "^0.3.1" supports-color "^9.2.1" yaml "^1.10.2" listr2@^3.13.5: version "3.14.0" resolved "https://registry.yarnpkg.com/listr2/-/listr2-3.14.0.tgz#23101cc62e1375fd5836b248276d1d2b51fdbe9e" integrity sha512-TyWI8G99GX9GjE54cJ+RrNMcIFBfwMPxc3XTFiAYGN4s10hWROGtOg7+O6u6LE3mNkyld7RSLE6nrKBvTfcs3g== dependencies: cli-truncate "^2.1.0" colorette "^2.0.16" log-update "^4.0.0" p-map "^4.0.0" rfdc "^1.3.0" rxjs "^7.5.1" through "^2.3.8" wrap-ansi "^7.0.0" load-plugin@^4.0.0: version "4.0.1" resolved "https://registry.yarnpkg.com/load-plugin/-/load-plugin-4.0.1.tgz#9a239b0337064c9b8aac82b0c9f89b067db487c5" integrity sha512-4kMi+mOSn/TR51pDo4tgxROHfBHXsrcyEYSGHcJ1o6TtRaP2PsRM5EwmYbj1uiLDvbfA/ohwuSWZJzqGiai8Dw== dependencies: import-meta-resolve "^1.0.0" libnpmconfig "^1.0.0" load-script@0.0.5: version "0.0.5" resolved "https://registry.yarnpkg.com/load-script/-/load-script-0.0.5.tgz#cbd54b27cd7309902b749640c70e996f4c643b63" integrity sha1-y9VLJ81zCZArdJZAxw6Zb0xkO2M= localtunnel@1.5.0: version "1.5.0" resolved "https://registry.yarnpkg.com/localtunnel/-/localtunnel-1.5.0.tgz#5be949779325e9f3273021a3f38d2e7a8dcd7c4f" integrity sha1-W+lJd5Ml6fMnMCGj840ueo3NfE8= dependencies: debug "0.7.4" optimist "0.3.4" request "2.11.4" locate-path@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-2.0.0.tgz#2b568b265eec944c6d9c0de9c3dbbbca0354cd8e" integrity sha1-K1aLJl7slExtnA3pw9u7ygNUzY4= dependencies: p-locate "^2.0.0" path-exists "^3.0.0" locate-path@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-3.0.0.tgz#dbec3b3ab759758071b58fe59fc41871af21400e" integrity sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A== dependencies: p-locate "^3.0.0" path-exists "^3.0.0" locate-path@^5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-5.0.0.tgz#1afba396afd676a6d42504d0a67a3a7eb9f62aa0" integrity sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g== dependencies: p-locate "^4.1.0" locate-path@^6.0.0: version "6.0.0" resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-6.0.0.tgz#55321eb309febbc59c4801d931a72452a681d286" integrity sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw== dependencies: p-locate "^5.0.0" locate-path@^7.0.0: version "7.0.0" resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-7.0.0.tgz#f0a60c8dd7ef0f737699eb9461b9567a92bc97da" integrity sha512-+cg2yXqDUKfo4hsFxwa3G1cBJeA+gs1vD8FyV9/odWoUlQe/4syxHQ5DPtKjtfm6gnKbZzjCqzX03kXosvZB1w== dependencies: p-locate "^6.0.0" lodash-es@^4.17.21: version "4.17.21" resolved "https://registry.yarnpkg.com/lodash-es/-/lodash-es-4.17.21.tgz#43e626c46e6591b7750beb2b50117390c609e3ee" integrity sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw== lodash._isnative@~2.4.1: version "2.4.1" resolved "https://registry.yarnpkg.com/lodash._isnative/-/lodash._isnative-2.4.1.tgz#3ea6404b784a7be836c7b57580e1cdf79b14832c" integrity sha1-PqZAS3hKe+g2x7V1gOHN95sUgyw= lodash._objecttypes@~2.4.1: version "2.4.1" resolved "https://registry.yarnpkg.com/lodash._objecttypes/-/lodash._objecttypes-2.4.1.tgz#7c0b7f69d98a1f76529f890b0cdb1b4dfec11c11" integrity sha1-fAt/admKH3ZSn4kLDNsbTf7BHBE= lodash._shimkeys@~2.4.1: version "2.4.1" resolved "https://registry.yarnpkg.com/lodash._shimkeys/-/lodash._shimkeys-2.4.1.tgz#6e9cc9666ff081f0b5a6c978b83e242e6949d203" integrity sha1-bpzJZm/wgfC1psl4uD4kLmlJ0gM= dependencies: lodash._objecttypes "~2.4.1" lodash.debounce@^4.0.8: version "4.0.8" resolved "https://registry.yarnpkg.com/lodash.debounce/-/lodash.debounce-4.0.8.tgz#82d79bff30a67c4005ffd5e2515300ad9ca4d7af" integrity sha1-gteb/zCmfEAF/9XiUVMArZyk168= lodash.defaults@~2.4.1: version "2.4.1" resolved "https://registry.yarnpkg.com/lodash.defaults/-/lodash.defaults-2.4.1.tgz#a7e8885f05e68851144b6e12a8f3678026bc4c54" integrity sha1-p+iIXwXmiFEUS24SqPNngCa8TFQ= dependencies: lodash._objecttypes "~2.4.1" lodash.keys "~2.4.1" lodash.flattendeep@^4.4.0: version "4.4.0" resolved "https://registry.yarnpkg.com/lodash.flattendeep/-/lodash.flattendeep-4.4.0.tgz#fb030917f86a3134e5bc9bec0d69e0013ddfedb2" integrity sha1-+wMJF/hqMTTlvJvsDWngAT3f7bI= lodash.get@^4: version "4.4.2" resolved "https://registry.yarnpkg.com/lodash.get/-/lodash.get-4.4.2.tgz#2d177f652fa31e939b4438d5341499dfa3825e99" integrity sha1-LRd/ZS+jHpObRDjVNBSZ36OCXpk= lodash.isobject@~2.4.1: version "2.4.1" resolved "https://registry.yarnpkg.com/lodash.isobject/-/lodash.isobject-2.4.1.tgz#5a2e47fe69953f1ee631a7eba1fe64d2d06558f5" integrity sha1-Wi5H/mmVPx7mMafrof5k0tBlWPU= dependencies: lodash._objecttypes "~2.4.1" lodash.keys@~2.4.1: version "2.4.1" resolved "https://registry.yarnpkg.com/lodash.keys/-/lodash.keys-2.4.1.tgz#48dea46df8ff7632b10d706b8acb26591e2b3727" integrity sha1-SN6kbfj/djKxDXBrissmWR4rNyc= dependencies: lodash._isnative "~2.4.1" lodash._shimkeys "~2.4.1" lodash.isobject "~2.4.1" lodash.memoize@4.1.2: version "4.1.2" resolved "https://registry.yarnpkg.com/lodash.memoize/-/lodash.memoize-4.1.2.tgz#bcc6c49a42a2840ed997f323eada5ecd182e0bfe" integrity sha1-vMbEmkKihA7Zl/Mj6tpezRguC/4= lodash.memoize@~3.0.3: version "3.0.4" resolved "https://registry.yarnpkg.com/lodash.memoize/-/lodash.memoize-3.0.4.tgz#2dcbd2c287cbc0a55cc42328bd0c736150d53e3f" integrity sha1-LcvSwofLwKVcxCMovQxzYVDVPj8= lodash.merge@^4.6.2: version "4.6.2" resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.2.tgz#558aa53b43b661e1925a0afdfa36a9a1085fe57a" integrity sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ== lodash@3.10.1: version "3.10.1" resolved "https://registry.yarnpkg.com/lodash/-/lodash-3.10.1.tgz#5bf45e8e49ba4189e17d482789dfd15bd140b7b6" integrity sha1-W/Rejkm6QYnhfUgnid/RW9FAt7Y= lodash@^4.13.1, lodash@^4.17.15, lodash@^4.17.19, lodash@^4.17.21: version "4.17.21" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== lodash@~2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/lodash/-/lodash-2.1.0.tgz#0637eaaa36a8a1cfc865c3adfb942189bfb0998d" integrity sha1-Bjfqqjaooc/IZcOt+5Qhib+wmY0= lodash@~2.4.1: version "2.4.2" resolved "https://registry.yarnpkg.com/lodash/-/lodash-2.4.2.tgz#fadd834b9683073da179b3eae6d9c0d15053f73e" integrity sha1-+t2DS5aDBz2hebPq5tnA0VBT9z4= lodash@~3.2.0: version "3.2.0" resolved "https://registry.yarnpkg.com/lodash/-/lodash-3.2.0.tgz#4bf50a3243f9aeb0bac41a55d3d5990675a462fb" integrity sha1-S/UKMkP5rrC6xBpV09WZBnWkYvs= log-symbols@2.2.0: version "2.2.0" resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-2.2.0.tgz#5740e1c5d6f0dfda4ad9323b5332107ef6b4c40a" integrity sha512-VeIAFslyIerEJLXHziedo2basKbMKtTw3vfn5IzG0XTjhAVEJyNHnL2p7vc+wBDSdQuUpNw3M2u6xb9QsAY5Eg== dependencies: chalk "^2.0.1" log-symbols@^4.0.0: version "4.1.0" resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-4.1.0.tgz#3fbdbb95b4683ac9fc785111e792e558d4abd503" integrity sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg== dependencies: chalk "^4.1.0" is-unicode-supported "^0.1.0" log-update@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/log-update/-/log-update-4.0.0.tgz#589ecd352471f2a1c0c570287543a64dfd20e0a1" integrity sha512-9fkkDevMefjg0mmzWFBW8YkFP91OrizzkW3diF7CpG+S2EYdy4+TVfGwz1zeF8x7hCx1ovSPTOE9Ngib74qqUg== dependencies: ansi-escapes "^4.3.0" cli-cursor "^3.1.0" slice-ansi "^4.0.0" wrap-ansi "^6.2.0" longest-streak@^2.0.0: version "2.0.4" resolved "https://registry.yarnpkg.com/longest-streak/-/longest-streak-2.0.4.tgz#b8599957da5b5dab64dee3fe316fa774597d90e4" integrity sha512-vM6rUVCVUJJt33bnmHiZEvr7wPT78ztX7rojL+LW51bHtLh6HTjx84LA5W4+oa6aKEJA7jJu5LR6vQRBpA5DVg== longest-streak@^3.0.0: version "3.0.1" resolved "https://registry.yarnpkg.com/longest-streak/-/longest-streak-3.0.1.tgz#c97315b7afa0e7d9525db9a5a2953651432bdc5d" integrity sha512-cHlYSUpL2s7Fb3394mYxwTYj8niTaNHUCLr0qdiCXQfSjfuA7CKofpX2uSwEfFDQ0EB7JcnMnm+GjbqqoinYYg== lowercase-keys@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-1.0.1.tgz#6f9e30b47084d971a7c820ff15a6c5167b74c26f" integrity sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA== lru-cache@2: version "2.7.3" resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-2.7.3.tgz#6d4524e8b955f95d4f5b58851ce21dd72fb4e952" integrity sha1-bUUk6LlV+V1PW1iFHOId1y+06VI= lru-cache@^6.0.0: version "6.0.0" resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-6.0.0.tgz#6d6fe6570ebd96aaf90fcad1dafa3b2566db3a94" integrity sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA== dependencies: yallist "^4.0.0" magic-string@^0.23.2: version "0.23.2" resolved "https://registry.yarnpkg.com/magic-string/-/magic-string-0.23.2.tgz#204d7c3ea36c7d940209fcc54c39b9f243f13369" integrity sha512-oIUZaAxbcxYIp4AyLafV6OVKoB3YouZs0UTCJ8mOKBHNyJgGDaMJ4TgA+VylJh6fx7EQCC52XkbURxxG9IoJXA== dependencies: sourcemap-codec "^1.4.1" make-dir@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-2.1.0.tgz#5f0310e18b8be898cc07009295a30ae41e91e6f5" integrity sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA== dependencies: pify "^4.0.1" semver "^5.6.0" make-dir@^3.0.0, make-dir@^3.0.2: version "3.1.0" resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-3.1.0.tgz#415e967046b3a7f1d185277d84aa58203726a13f" integrity sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw== dependencies: semver "^6.0.0" make-error@^1, make-error@^1.1.1: version "1.3.6" resolved "https://registry.yarnpkg.com/make-error/-/make-error-1.3.6.tgz#2eb2e37ea9b67c4891f684a1394799af484cf7a2" integrity sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw== map-cache@^0.2.2: version "0.2.2" resolved "https://registry.yarnpkg.com/map-cache/-/map-cache-0.2.2.tgz#c32abd0bd6525d9b051645bb4f26ac5dc98a0dbf" integrity sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8= map-obj@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/map-obj/-/map-obj-1.0.1.tgz#d933ceb9205d82bdcf4886f6742bdc2b4dea146d" integrity sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0= map-obj@^4.0.0, map-obj@^4.1.0: version "4.3.0" resolved "https://registry.yarnpkg.com/map-obj/-/map-obj-4.3.0.tgz#9304f906e93faae70880da102a9f1df0ea8bb05a" integrity sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ== map-visit@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/map-visit/-/map-visit-1.0.0.tgz#ecdca8f13144e660f1b5bd41f12f3479d98dfb8f" integrity sha1-7Nyo8TFE5mDxtb1B8S80edmN+48= dependencies: object-visit "^1.0.0" markdown-table@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/markdown-table/-/markdown-table-2.0.0.tgz#194a90ced26d31fe753d8b9434430214c011865b" integrity sha512-Ezda85ToJUBhM6WGaG6veasyym+Tbs3cMAw/ZhOPqXiYsr0jgocBV3j3nx+4lk47plLlIqjwuTm/ywVI+zjJ/A== dependencies: repeat-string "^1.0.0" marked@^2.0.0: version "2.1.3" resolved "https://registry.yarnpkg.com/marked/-/marked-2.1.3.tgz#bd017cef6431724fd4b27e0657f5ceb14bff3753" integrity sha512-/Q+7MGzaETqifOMWYEA7HVMaZb4XbcRfaOzcSsHZEith83KGlvaSG33u0SKu89Mj5h+T8V2hM+8O45Qc5XTgwA== match-casing@^1.0.0: version "1.0.3" resolved "https://registry.yarnpkg.com/match-casing/-/match-casing-1.0.3.tgz#cda6c33e377dbe49daff286e0d500d90766b16a4" integrity sha512-oMyC3vUVCFbGu+M2Zxl212LPJThcaw7QxB5lFuJPQCgV/dsGBP0yZeCoLmX6CiBkoBcVbAKDJZrBpJVu0XcLMw== math-random@^1.0.1: version "1.0.4" resolved "https://registry.yarnpkg.com/math-random/-/math-random-1.0.4.tgz#5dd6943c938548267016d4e34f057583080c514c" integrity sha512-rUxjysqif/BZQH2yhd5Aaq7vXMSx9NdEsQcyA07uEzIvxgI7zIr33gGsh+RU0/XjmQpCW7RsVof1vlkvQVCK5A== md5.js@^1.3.4: version "1.3.5" resolved "https://registry.yarnpkg.com/md5.js/-/md5.js-1.3.5.tgz#b5d07b8e3216e3e27cd728d72f70d1e6a342005f" integrity sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg== dependencies: hash-base "^3.0.0" inherits "^2.0.1" safe-buffer "^5.1.2" mdast-comment-marker@^1.0.0, mdast-comment-marker@^1.0.1: version "1.1.2" resolved "https://registry.yarnpkg.com/mdast-comment-marker/-/mdast-comment-marker-1.1.2.tgz#5ad2e42cfcc41b92a10c1421a98c288d7b447a6d" integrity sha512-vTFXtmbbF3rgnTh3Zl3irso4LtvwUq/jaDvT2D1JqTGAwaipcS7RpTxzi6KjoRqI9n2yuAhzLDAC8xVTF3XYVQ== mdast-util-find-and-replace@^1.1.0: version "1.1.1" resolved "https://registry.yarnpkg.com/mdast-util-find-and-replace/-/mdast-util-find-and-replace-1.1.1.tgz#b7db1e873f96f66588c321f1363069abf607d1b5" integrity sha512-9cKl33Y21lyckGzpSmEQnIDjEfeeWelN5s1kUW1LwdB0Fkuq2u+4GdqcGEygYxJE8GVqCl0741bYXHgamfWAZA== dependencies: escape-string-regexp "^4.0.0" unist-util-is "^4.0.0" unist-util-visit-parents "^3.0.0" mdast-util-from-markdown@^1.0.0: version "1.2.0" resolved "https://registry.yarnpkg.com/mdast-util-from-markdown/-/mdast-util-from-markdown-1.2.0.tgz#84df2924ccc6c995dec1e2368b2b208ad0a76268" integrity sha512-iZJyyvKD1+K7QX1b5jXdE7Sc5dtoTry1vzV28UZZe8Z1xVnB/czKntJ7ZAkG0tANqRnBF6p3p7GpU1y19DTf2Q== dependencies: "@types/mdast" "^3.0.0" "@types/unist" "^2.0.0" decode-named-character-reference "^1.0.0" mdast-util-to-string "^3.1.0" micromark "^3.0.0" micromark-util-decode-numeric-character-reference "^1.0.0" micromark-util-decode-string "^1.0.0" micromark-util-normalize-identifier "^1.0.0" micromark-util-symbol "^1.0.0" micromark-util-types "^1.0.0" unist-util-stringify-position "^3.0.0" uvu "^0.5.0" mdast-util-gfm-autolink-literal@^0.1.0: version "0.1.3" resolved "https://registry.yarnpkg.com/mdast-util-gfm-autolink-literal/-/mdast-util-gfm-autolink-literal-0.1.3.tgz#9c4ff399c5ddd2ece40bd3b13e5447d84e385fb7" integrity sha512-GjmLjWrXg1wqMIO9+ZsRik/s7PLwTaeCHVB7vRxUwLntZc8mzmTsLVr6HW1yLokcnhfURsn5zmSVdi3/xWWu1A== dependencies: ccount "^1.0.0" mdast-util-find-and-replace "^1.1.0" micromark "^2.11.3" mdast-util-gfm-strikethrough@^0.2.0: version "0.2.3" resolved "https://registry.yarnpkg.com/mdast-util-gfm-strikethrough/-/mdast-util-gfm-strikethrough-0.2.3.tgz#45eea337b7fff0755a291844fbea79996c322890" integrity sha512-5OQLXpt6qdbttcDG/UxYY7Yjj3e8P7X16LzvpX8pIQPYJ/C2Z1qFGMmcw+1PZMUM3Z8wt8NRfYTvCni93mgsgA== dependencies: mdast-util-to-markdown "^0.6.0" mdast-util-gfm-table@^0.1.0: version "0.1.6" resolved "https://registry.yarnpkg.com/mdast-util-gfm-table/-/mdast-util-gfm-table-0.1.6.tgz#af05aeadc8e5ee004eeddfb324b2ad8c029b6ecf" integrity sha512-j4yDxQ66AJSBwGkbpFEp9uG/LS1tZV3P33fN1gkyRB2LoRL+RR3f76m0HPHaby6F4Z5xr9Fv1URmATlRRUIpRQ== dependencies: markdown-table "^2.0.0" mdast-util-to-markdown "~0.6.0" mdast-util-gfm-task-list-item@^0.1.0: version "0.1.6" resolved "https://registry.yarnpkg.com/mdast-util-gfm-task-list-item/-/mdast-util-gfm-task-list-item-0.1.6.tgz#70c885e6b9f543ddd7e6b41f9703ee55b084af10" integrity sha512-/d51FFIfPsSmCIRNp7E6pozM9z1GYPIkSy1urQ8s/o4TC22BZ7DqfHFWiqBD23bc7J3vV1Fc9O4QIHBlfuit8A== dependencies: mdast-util-to-markdown "~0.6.0" mdast-util-gfm@^0.1.0: version "0.1.2" resolved "https://registry.yarnpkg.com/mdast-util-gfm/-/mdast-util-gfm-0.1.2.tgz#8ecddafe57d266540f6881f5c57ff19725bd351c" integrity sha512-NNkhDx/qYcuOWB7xHUGWZYVXvjPFFd6afg6/e2g+SV4r9q5XUcCbV4Wfa3DLYIiD+xAEZc6K4MGaE/m0KDcPwQ== dependencies: mdast-util-gfm-autolink-literal "^0.1.0" mdast-util-gfm-strikethrough "^0.2.0" mdast-util-gfm-table "^0.1.0" mdast-util-gfm-task-list-item "^0.1.0" mdast-util-to-markdown "^0.6.1" mdast-util-heading-range@^2.0.0, mdast-util-heading-range@^2.1.2: version "2.1.5" resolved "https://registry.yarnpkg.com/mdast-util-heading-range/-/mdast-util-heading-range-2.1.5.tgz#9a8e07bd46d07d40ad1596b0b6ab8535337725c3" integrity sha512-jXbFD0C+MfRkwsaze+btzG9CmVrxnc5kpcJLtx3SvSlPWnNdGMlDRHKDB9/TIPEq9nRHnkixppT8yvaUJ5agJg== dependencies: mdast-util-to-string "^1.0.0" mdast-util-heading-style@^1.0.2: version "1.0.6" resolved "https://registry.yarnpkg.com/mdast-util-heading-style/-/mdast-util-heading-style-1.0.6.tgz#6410418926fd5673d40f519406b35d17da10e3c5" integrity sha512-8ZuuegRqS0KESgjAGW8zTx4tJ3VNIiIaGFNEzFpRSAQBavVc7AvOo9I4g3crcZBfYisHs4seYh0rAVimO6HyOw== mdast-util-to-markdown@^0.6.0, mdast-util-to-markdown@^0.6.1, mdast-util-to-markdown@~0.6.0: version "0.6.5" resolved "https://registry.yarnpkg.com/mdast-util-to-markdown/-/mdast-util-to-markdown-0.6.5.tgz#b33f67ca820d69e6cc527a93d4039249b504bebe" integrity sha512-XeV9sDE7ZlOQvs45C9UKMtfTcctcaj/pGwH8YLbMHoMOXNNCn2LsqVQOqrF1+/NU8lKDAqozme9SCXWyo9oAcQ== dependencies: "@types/unist" "^2.0.0" longest-streak "^2.0.0" mdast-util-to-string "^2.0.0" parse-entities "^2.0.0" repeat-string "^1.0.0" zwitch "^1.0.0" mdast-util-to-markdown@^1.0.0: version "1.2.6" resolved "https://registry.yarnpkg.com/mdast-util-to-markdown/-/mdast-util-to-markdown-1.2.6.tgz#9d0d1fcb22838e4af83fb04841cbde92525972f3" integrity sha512-doJZmTEGagHypWvJ8ltinmwUsT9ZaNgNIQW6Gl7jNdsI1QZkTHTimYW561Niy2s8AEPAqEgV0dIh2UOVlSXUJA== dependencies: "@types/mdast" "^3.0.0" "@types/unist" "^2.0.0" longest-streak "^3.0.0" mdast-util-to-string "^3.0.0" micromark-util-decode-string "^1.0.0" unist-util-visit "^4.0.0" zwitch "^2.0.0" mdast-util-to-nlcst@^4.0.0: version "4.0.1" resolved "https://registry.yarnpkg.com/mdast-util-to-nlcst/-/mdast-util-to-nlcst-4.0.1.tgz#ff8b5339c960b38209273fa8bf4dd7a9498f8636" integrity sha512-Y4ffygj85MTt70STKnEquw6k73jYWJBaYcb4ITAKgSNokZF7fH8rEHZ1GsRY/JaxqUevMaEnsDmkVv5Z9uVRdg== dependencies: nlcst-to-string "^2.0.0" repeat-string "^1.0.0" unist-util-position "^3.0.0" vfile-location "^3.1.0" mdast-util-to-string@^1.0.0, mdast-util-to-string@^1.0.2: version "1.1.0" resolved "https://registry.yarnpkg.com/mdast-util-to-string/-/mdast-util-to-string-1.1.0.tgz#27055500103f51637bd07d01da01eb1967a43527" integrity sha512-jVU0Nr2B9X3MU4tSK7JP1CMkSvOj7X5l/GboG1tKRw52lLF1x2Ju92Ms9tNetCcbfX3hzlM73zYo2NKkWSfF/A== mdast-util-to-string@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/mdast-util-to-string/-/mdast-util-to-string-2.0.0.tgz#b8cfe6a713e1091cb5b728fc48885a4767f8b97b" integrity sha512-AW4DRS3QbBayY/jJmD8437V1Gombjf8RSOUCMFBuo5iHi58AGEgVCKQ+ezHkZZDpAQS75hcBMpLqjpJTjtUL7w== mdast-util-to-string@^3.0.0, mdast-util-to-string@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/mdast-util-to-string/-/mdast-util-to-string-3.1.0.tgz#56c506d065fbf769515235e577b5a261552d56e9" integrity sha512-n4Vypz/DZgwo0iMHLQL49dJzlp7YtAJP+N07MZHpjPf/5XJuHUWstviF4Mn2jEiR/GNmtnRRqnwsXExk3igfFA== mdast-util-toc@^5.0.0: version "5.1.0" resolved "https://registry.yarnpkg.com/mdast-util-toc/-/mdast-util-toc-5.1.0.tgz#3af0f9c9a764b993538af03f1f79f4e3cec22736" integrity sha512-csimbRIVkiqc+PpFeKDGQ/Ck2N4f9FYH3zzBMMJzcxoKL8m+cM0n94xXm0I9eaxHnKdY9n145SGTdyJC7i273g== dependencies: "@types/mdast" "^3.0.3" "@types/unist" "^2.0.3" extend "^3.0.2" github-slugger "^1.2.1" mdast-util-to-string "^2.0.0" unist-util-is "^4.0.0" unist-util-visit "^2.0.0" media-typer@0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748" integrity sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g= memory-fs@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/memory-fs/-/memory-fs-0.2.0.tgz#f2bb25368bc121e391c2520de92969caee0a0290" integrity sha1-8rslNovBIeORwlIN6Slpyu4KApA= meow@^10.1.2: version "10.1.2" resolved "https://registry.yarnpkg.com/meow/-/meow-10.1.2.tgz#62951cb69afa69594142c8250806bc30a3912e4d" integrity sha512-zbuAlN+V/sXlbGchNS9WTWjUzeamwMt/BApKCJi7B0QyZstZaMx0n4Unll/fg0njGtMdC9UP5SAscvOCLYdM+Q== dependencies: "@types/minimist" "^1.2.2" camelcase-keys "^7.0.0" decamelize "^5.0.0" decamelize-keys "^1.1.0" hard-rejection "^2.1.0" minimist-options "4.1.0" normalize-package-data "^3.0.2" read-pkg-up "^8.0.0" redent "^4.0.0" trim-newlines "^4.0.2" type-fest "^1.2.2" yargs-parser "^20.2.9" meow@^8.0.0: version "8.1.2" resolved "https://registry.yarnpkg.com/meow/-/meow-8.1.2.tgz#bcbe45bda0ee1729d350c03cffc8395a36c4e897" integrity sha512-r85E3NdZ+mpYk1C6RjPFEMSE+s1iZMuHtsHAqY0DT3jZczl0diWUZ8g6oU7h0M9cD2EL+PzaYghhCLzR0ZNn5Q== dependencies: "@types/minimist" "^1.2.0" camelcase-keys "^6.2.2" decamelize-keys "^1.1.0" hard-rejection "^2.1.0" minimist-options "4.1.0" normalize-package-data "^3.0.0" read-pkg-up "^7.0.1" redent "^3.0.0" trim-newlines "^3.0.0" type-fest "^0.18.0" yargs-parser "^20.2.3" merge-descriptors@0.0.1: version "0.0.1" resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-0.0.1.tgz#2ff0980c924cf81d0b5d1fb601177cb8bb56c0d0" integrity sha1-L/CYDJJM+B0LXR+2ARd8uLtWwNA= merge-descriptors@1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.1.tgz#b00aaa556dd8b44568150ec9d1b953f3f90cbb61" integrity sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E= merge-source-map@1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/merge-source-map/-/merge-source-map-1.0.4.tgz#a5de46538dae84d4114cc5ea02b4772a6346701f" integrity sha1-pd5GU42uhNQRTMXqArR3KmNGcB8= dependencies: source-map "^0.5.6" merge-stream@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60" integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w== merge2@^1.3.0, merge2@^1.4.1: version "1.4.1" resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae" integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== methods@0.0.1: version "0.0.1" resolved "https://registry.yarnpkg.com/methods/-/methods-0.0.1.tgz#277c90f8bef39709645a8371c51c3b6c648e068c" integrity sha1-J3yQ+L7zlwlkWoNxxRw7bGSOBow= methods@0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/methods/-/methods-0.1.0.tgz#335d429eefd21b7bacf2e9c922a8d2bd14a30e4f" integrity sha1-M11Cnu/SG3us8unJIqjSvRSjDk8= methods@^1.1.2, methods@~1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee" integrity sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4= micro-spelling-correcter@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/micro-spelling-correcter/-/micro-spelling-correcter-1.1.1.tgz#805a06a26ccfcad8f3e5c6a1ac5ff29d4530166e" integrity sha512-lkJ3Rj/mtjlRcHk6YyCbvZhyWTOzdBvTHsxMmZSk5jxN1YyVSQ+JETAom55mdzfcyDrY/49Z7UCW760BK30crg== micromark-core-commonmark@^1.0.1: version "1.0.6" resolved "https://registry.yarnpkg.com/micromark-core-commonmark/-/micromark-core-commonmark-1.0.6.tgz#edff4c72e5993d93724a3c206970f5a15b0585ad" integrity sha512-K+PkJTxqjFfSNkfAhp4GB+cZPfQd6dxtTXnf+RjZOV7T4EEXnvgzOcnp+eSTmpGk9d1S9sL6/lqrgSNn/s0HZA== dependencies: decode-named-character-reference "^1.0.0" micromark-factory-destination "^1.0.0" micromark-factory-label "^1.0.0" micromark-factory-space "^1.0.0" micromark-factory-title "^1.0.0" micromark-factory-whitespace "^1.0.0" micromark-util-character "^1.0.0" micromark-util-chunked "^1.0.0" micromark-util-classify-character "^1.0.0" micromark-util-html-tag-name "^1.0.0" micromark-util-normalize-identifier "^1.0.0" micromark-util-resolve-all "^1.0.0" micromark-util-subtokenize "^1.0.0" micromark-util-symbol "^1.0.0" micromark-util-types "^1.0.1" uvu "^0.5.0" micromark-extension-gfm-autolink-literal@~0.5.0: version "0.5.7" resolved "https://registry.yarnpkg.com/micromark-extension-gfm-autolink-literal/-/micromark-extension-gfm-autolink-literal-0.5.7.tgz#53866c1f0c7ef940ae7ca1f72c6faef8fed9f204" integrity sha512-ePiDGH0/lhcngCe8FtH4ARFoxKTUelMp4L7Gg2pujYD5CSMb9PbblnyL+AAMud/SNMyusbS2XDSiPIRcQoNFAw== dependencies: micromark "~2.11.3" micromark-extension-gfm-strikethrough@~0.6.5: version "0.6.5" resolved "https://registry.yarnpkg.com/micromark-extension-gfm-strikethrough/-/micromark-extension-gfm-strikethrough-0.6.5.tgz#96cb83356ff87bf31670eefb7ad7bba73e6514d1" integrity sha512-PpOKlgokpQRwUesRwWEp+fHjGGkZEejj83k9gU5iXCbDG+XBA92BqnRKYJdfqfkrRcZRgGuPuXb7DaK/DmxOhw== dependencies: micromark "~2.11.0" micromark-extension-gfm-table@~0.4.0: version "0.4.3" resolved "https://registry.yarnpkg.com/micromark-extension-gfm-table/-/micromark-extension-gfm-table-0.4.3.tgz#4d49f1ce0ca84996c853880b9446698947f1802b" integrity sha512-hVGvESPq0fk6ALWtomcwmgLvH8ZSVpcPjzi0AjPclB9FsVRgMtGZkUcpE0zgjOCFAznKepF4z3hX8z6e3HODdA== dependencies: micromark "~2.11.0" micromark-extension-gfm-tagfilter@~0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/micromark-extension-gfm-tagfilter/-/micromark-extension-gfm-tagfilter-0.3.0.tgz#d9f26a65adee984c9ccdd7e182220493562841ad" integrity sha512-9GU0xBatryXifL//FJH+tAZ6i240xQuFrSL7mYi8f4oZSbc+NvXjkrHemeYP0+L4ZUT+Ptz3b95zhUZnMtoi/Q== micromark-extension-gfm-task-list-item@~0.3.0: version "0.3.3" resolved "https://registry.yarnpkg.com/micromark-extension-gfm-task-list-item/-/micromark-extension-gfm-task-list-item-0.3.3.tgz#d90c755f2533ed55a718129cee11257f136283b8" integrity sha512-0zvM5iSLKrc/NQl84pZSjGo66aTGd57C1idmlWmE87lkMcXrTxg1uXa/nXomxJytoje9trP0NDLvw4bZ/Z/XCQ== dependencies: micromark "~2.11.0" micromark-extension-gfm@^0.3.0: version "0.3.3" resolved "https://registry.yarnpkg.com/micromark-extension-gfm/-/micromark-extension-gfm-0.3.3.tgz#36d1a4c089ca8bdfd978c9bd2bf1a0cb24e2acfe" integrity sha512-oVN4zv5/tAIA+l3GbMi7lWeYpJ14oQyJ3uEim20ktYFAcfX1x3LNlFGGlmrZHt7u9YlKExmyJdDGaTt6cMSR/A== dependencies: micromark "~2.11.0" micromark-extension-gfm-autolink-literal "~0.5.0" micromark-extension-gfm-strikethrough "~0.6.5" micromark-extension-gfm-table "~0.4.0" micromark-extension-gfm-tagfilter "~0.3.0" micromark-extension-gfm-task-list-item "~0.3.0" micromark-factory-destination@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/micromark-factory-destination/-/micromark-factory-destination-1.0.0.tgz#fef1cb59ad4997c496f887b6977aa3034a5a277e" integrity sha512-eUBA7Rs1/xtTVun9TmV3gjfPz2wEwgK5R5xcbIM5ZYAtvGF6JkyaDsj0agx8urXnO31tEO6Ug83iVH3tdedLnw== dependencies: micromark-util-character "^1.0.0" micromark-util-symbol "^1.0.0" micromark-util-types "^1.0.0" micromark-factory-label@^1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/micromark-factory-label/-/micromark-factory-label-1.0.2.tgz#6be2551fa8d13542fcbbac478258fb7a20047137" integrity sha512-CTIwxlOnU7dEshXDQ+dsr2n+yxpP0+fn271pu0bwDIS8uqfFcumXpj5mLn3hSC8iw2MUr6Gx8EcKng1dD7i6hg== dependencies: micromark-util-character "^1.0.0" micromark-util-symbol "^1.0.0" micromark-util-types "^1.0.0" uvu "^0.5.0" micromark-factory-space@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/micromark-factory-space/-/micromark-factory-space-1.0.0.tgz#cebff49968f2b9616c0fcb239e96685cb9497633" integrity sha512-qUmqs4kj9a5yBnk3JMLyjtWYN6Mzfcx8uJfi5XAveBniDevmZasdGBba5b4QsvRcAkmvGo5ACmSUmyGiKTLZew== dependencies: micromark-util-character "^1.0.0" micromark-util-types "^1.0.0" micromark-factory-title@^1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/micromark-factory-title/-/micromark-factory-title-1.0.2.tgz#7e09287c3748ff1693930f176e1c4a328382494f" integrity sha512-zily+Nr4yFqgMGRKLpTVsNl5L4PMu485fGFDOQJQBl2NFpjGte1e86zC0da93wf97jrc4+2G2GQudFMHn3IX+A== dependencies: micromark-factory-space "^1.0.0" micromark-util-character "^1.0.0" micromark-util-symbol "^1.0.0" micromark-util-types "^1.0.0" uvu "^0.5.0" micromark-factory-whitespace@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/micromark-factory-whitespace/-/micromark-factory-whitespace-1.0.0.tgz#e991e043ad376c1ba52f4e49858ce0794678621c" integrity sha512-Qx7uEyahU1lt1RnsECBiuEbfr9INjQTGa6Err+gF3g0Tx4YEviPbqqGKNv/NrBaE7dVHdn1bVZKM/n5I/Bak7A== dependencies: micromark-factory-space "^1.0.0" micromark-util-character "^1.0.0" micromark-util-symbol "^1.0.0" micromark-util-types "^1.0.0" micromark-util-character@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/micromark-util-character/-/micromark-util-character-1.1.0.tgz#d97c54d5742a0d9611a68ca0cd4124331f264d86" integrity sha512-agJ5B3unGNJ9rJvADMJ5ZiYjBRyDpzKAOk01Kpi1TKhlT1APx3XZk6eN7RtSz1erbWHC2L8T3xLZ81wdtGRZzg== dependencies: micromark-util-symbol "^1.0.0" micromark-util-types "^1.0.0" micromark-util-chunked@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/micromark-util-chunked/-/micromark-util-chunked-1.0.0.tgz#5b40d83f3d53b84c4c6bce30ed4257e9a4c79d06" integrity sha512-5e8xTis5tEZKgesfbQMKRCyzvffRRUX+lK/y+DvsMFdabAicPkkZV6gO+FEWi9RfuKKoxxPwNL+dFF0SMImc1g== dependencies: micromark-util-symbol "^1.0.0" micromark-util-classify-character@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/micromark-util-classify-character/-/micromark-util-classify-character-1.0.0.tgz#cbd7b447cb79ee6997dd274a46fc4eb806460a20" integrity sha512-F8oW2KKrQRb3vS5ud5HIqBVkCqQi224Nm55o5wYLzY/9PwHGXC01tr3d7+TqHHz6zrKQ72Okwtvm/xQm6OVNZA== dependencies: micromark-util-character "^1.0.0" micromark-util-symbol "^1.0.0" micromark-util-types "^1.0.0" micromark-util-combine-extensions@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/micromark-util-combine-extensions/-/micromark-util-combine-extensions-1.0.0.tgz#91418e1e74fb893e3628b8d496085639124ff3d5" integrity sha512-J8H058vFBdo/6+AsjHp2NF7AJ02SZtWaVUjsayNFeAiydTxUwViQPxN0Hf8dp4FmCQi0UUFovFsEyRSUmFH3MA== dependencies: micromark-util-chunked "^1.0.0" micromark-util-types "^1.0.0" micromark-util-decode-numeric-character-reference@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/micromark-util-decode-numeric-character-reference/-/micromark-util-decode-numeric-character-reference-1.0.0.tgz#dcc85f13b5bd93ff8d2868c3dba28039d490b946" integrity sha512-OzO9AI5VUtrTD7KSdagf4MWgHMtET17Ua1fIpXTpuhclCqD8egFWo85GxSGvxgkGS74bEahvtM0WP0HjvV0e4w== dependencies: micromark-util-symbol "^1.0.0" micromark-util-decode-string@^1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/micromark-util-decode-string/-/micromark-util-decode-string-1.0.2.tgz#942252ab7a76dec2dbf089cc32505ee2bc3acf02" integrity sha512-DLT5Ho02qr6QWVNYbRZ3RYOSSWWFuH3tJexd3dgN1odEuPNxCngTCXJum7+ViRAd9BbdxCvMToPOD/IvVhzG6Q== dependencies: decode-named-character-reference "^1.0.0" micromark-util-character "^1.0.0" micromark-util-decode-numeric-character-reference "^1.0.0" micromark-util-symbol "^1.0.0" micromark-util-encode@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/micromark-util-encode/-/micromark-util-encode-1.0.1.tgz#2c1c22d3800870ad770ece5686ebca5920353383" integrity sha512-U2s5YdnAYexjKDel31SVMPbfi+eF8y1U4pfiRW/Y8EFVCy/vgxk/2wWTxzcqE71LHtCuCzlBDRU2a5CQ5j+mQA== micromark-util-html-tag-name@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/micromark-util-html-tag-name/-/micromark-util-html-tag-name-1.0.0.tgz#75737e92fef50af0c6212bd309bc5cb8dbd489ed" integrity sha512-NenEKIshW2ZI/ERv9HtFNsrn3llSPZtY337LID/24WeLqMzeZhBEE6BQ0vS2ZBjshm5n40chKtJ3qjAbVV8S0g== micromark-util-normalize-identifier@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/micromark-util-normalize-identifier/-/micromark-util-normalize-identifier-1.0.0.tgz#4a3539cb8db954bbec5203952bfe8cedadae7828" integrity sha512-yg+zrL14bBTFrQ7n35CmByWUTFsgst5JhA4gJYoty4Dqzj4Z4Fr/DHekSS5aLfH9bdlfnSvKAWsAgJhIbogyBg== dependencies: micromark-util-symbol "^1.0.0" micromark-util-resolve-all@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/micromark-util-resolve-all/-/micromark-util-resolve-all-1.0.0.tgz#a7c363f49a0162e931960c44f3127ab58f031d88" integrity sha512-CB/AGk98u50k42kvgaMM94wzBqozSzDDaonKU7P7jwQIuH2RU0TeBqGYJz2WY1UdihhjweivStrJ2JdkdEmcfw== dependencies: micromark-util-types "^1.0.0" micromark-util-sanitize-uri@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/micromark-util-sanitize-uri/-/micromark-util-sanitize-uri-1.0.0.tgz#27dc875397cd15102274c6c6da5585d34d4f12b2" integrity sha512-cCxvBKlmac4rxCGx6ejlIviRaMKZc0fWm5HdCHEeDWRSkn44l6NdYVRyU+0nT1XC72EQJMZV8IPHF+jTr56lAg== dependencies: micromark-util-character "^1.0.0" micromark-util-encode "^1.0.0" micromark-util-symbol "^1.0.0" micromark-util-subtokenize@^1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/micromark-util-subtokenize/-/micromark-util-subtokenize-1.0.2.tgz#ff6f1af6ac836f8bfdbf9b02f40431760ad89105" integrity sha512-d90uqCnXp/cy4G881Ub4psE57Sf8YD0pim9QdjCRNjfas2M1u6Lbt+XZK9gnHL2XFhnozZiEdCa9CNfXSfQ6xA== dependencies: micromark-util-chunked "^1.0.0" micromark-util-symbol "^1.0.0" micromark-util-types "^1.0.0" uvu "^0.5.0" micromark-util-symbol@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/micromark-util-symbol/-/micromark-util-symbol-1.0.1.tgz#b90344db62042ce454f351cf0bebcc0a6da4920e" integrity sha512-oKDEMK2u5qqAptasDAwWDXq0tG9AssVwAx3E9bBF3t/shRIGsWIRG+cGafs2p/SnDSOecnt6hZPCE2o6lHfFmQ== micromark-util-types@^1.0.0, micromark-util-types@^1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/micromark-util-types/-/micromark-util-types-1.0.2.tgz#f4220fdb319205812f99c40f8c87a9be83eded20" integrity sha512-DCfg/T8fcrhrRKTPjRrw/5LLvdGV7BHySf/1LOZx7TzWZdYRjogNtyNq885z3nNallwr3QUKARjqvHqX1/7t+w== micromark@^2.11.3, micromark@~2.11.0, micromark@~2.11.3: version "2.11.4" resolved "https://registry.yarnpkg.com/micromark/-/micromark-2.11.4.tgz#d13436138eea826383e822449c9a5c50ee44665a" integrity sha512-+WoovN/ppKolQOFIAajxi7Lu9kInbPxFuTBVEavFcL8eAfVstoc5MocPmqBeAdBOJV00uaVjegzH4+MA0DN/uA== dependencies: debug "^4.0.0" parse-entities "^2.0.0" micromark@^3.0.0: version "3.0.10" resolved "https://registry.yarnpkg.com/micromark/-/micromark-3.0.10.tgz#1eac156f0399d42736458a14b0ca2d86190b457c" integrity sha512-ryTDy6UUunOXy2HPjelppgJ2sNfcPz1pLlMdA6Rz9jPzhLikWXv/irpWV/I2jd68Uhmny7hHxAlAhk4+vWggpg== dependencies: "@types/debug" "^4.0.0" debug "^4.0.0" decode-named-character-reference "^1.0.0" micromark-core-commonmark "^1.0.1" micromark-factory-space "^1.0.0" micromark-util-character "^1.0.0" micromark-util-chunked "^1.0.0" micromark-util-combine-extensions "^1.0.0" micromark-util-decode-numeric-character-reference "^1.0.0" micromark-util-encode "^1.0.0" micromark-util-normalize-identifier "^1.0.0" micromark-util-resolve-all "^1.0.0" micromark-util-sanitize-uri "^1.0.0" micromark-util-subtokenize "^1.0.0" micromark-util-symbol "^1.0.0" micromark-util-types "^1.0.1" uvu "^0.5.0" micromatch@^2.1.5: version "2.3.11" resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-2.3.11.tgz#86677c97d1720b363431d04d0d15293bd38c1565" integrity sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU= dependencies: arr-diff "^2.0.0" array-unique "^0.2.1" braces "^1.8.2" expand-brackets "^0.1.4" extglob "^0.3.1" filename-regex "^2.0.0" is-extglob "^1.0.0" is-glob "^2.0.1" kind-of "^3.0.2" normalize-path "^2.0.1" object.omit "^2.0.0" parse-glob "^3.0.4" regex-cache "^0.4.2" micromatch@^3.1.10: version "3.1.10" resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-3.1.10.tgz#70859bc95c9840952f359a068a3fc49f9ecfac23" integrity sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg== dependencies: arr-diff "^4.0.0" array-unique "^0.3.2" braces "^2.3.1" define-property "^2.0.2" extend-shallow "^3.0.2" extglob "^2.0.4" fragment-cache "^0.2.1" kind-of "^6.0.2" nanomatch "^1.2.9" object.pick "^1.3.0" regex-not "^1.0.0" snapdragon "^0.8.1" to-regex "^3.0.2" micromatch@^4.0.4: version "4.0.4" resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.4.tgz#896d519dfe9db25fce94ceb7a500919bf881ebf9" integrity sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg== dependencies: braces "^3.0.1" picomatch "^2.2.3" miller-rabin@^4.0.0: version "4.0.1" resolved "https://registry.yarnpkg.com/miller-rabin/-/miller-rabin-4.0.1.tgz#f080351c865b0dc562a8462966daa53543c78a4d" integrity sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA== dependencies: bn.js "^4.0.0" brorand "^1.0.1" mime-db@1.51.0, "mime-db@>= 1.43.0 < 2": version "1.51.0" resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.51.0.tgz#d9ff62451859b18342d960850dc3cfb77e63fb0c" integrity sha512-5y8A56jg7XVQx2mbv1lu49NR4dokRnhZYTtL+KGfaa27uq4pSTXkwQkFJl4pkRMyNFz/EtYDSkiiEHx3F7UN6g== mime-types@^2.1.12, mime-types@~2.1.24, mime-types@~2.1.6: version "2.1.34" resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.34.tgz#5a712f9ec1503511a945803640fafe09d3793c24" integrity sha512-6cP692WwGIs9XXdOO4++N+7qjqv0rqxxVvJ3VHPh/Sc9mVZcQP+ZGhkKiTvWMQRr2tbHkJP/Yn7Y0npb3ZBs4A== dependencies: mime-db "1.51.0" mime-types@~1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-1.0.2.tgz#995ae1392ab8affcbfcb2641dd054e943c0d5dce" integrity sha1-mVrhOSq4r/y/yyZB3QVOlDwNXc4= mime@1.2.5: version "1.2.5" resolved "https://registry.yarnpkg.com/mime/-/mime-1.2.5.tgz#9eed073022a8bf5e16c8566c6867b8832bfbfa13" integrity sha1-nu0HMCKov14WyFZsaGe4gyv7+hM= mime@1.6.0: version "1.6.0" resolved "https://registry.yarnpkg.com/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1" integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg== mime@^2.5.0: version "2.6.0" resolved "https://registry.yarnpkg.com/mime/-/mime-2.6.0.tgz#a2a682a95cd4d0cb1d6257e28f83da7e35800367" integrity sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg== mime@~1.2.11, mime@~1.2.2, mime@~1.2.7, mime@~1.2.9: version "1.2.11" resolved "https://registry.yarnpkg.com/mime/-/mime-1.2.11.tgz#58203eed86e3a5ef17aed2b7d9ebd47f0a60dd10" integrity sha1-WCA+7Ybjpe8XrtK32evUfwpg3RA= mimic-fn@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== min-indent@^1.0.0, min-indent@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/min-indent/-/min-indent-1.0.1.tgz#a63f681673b30571fbe8bc25686ae746eefa9869" integrity sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg== minify-stream@^2.0.1: version "2.1.0" resolved "https://registry.yarnpkg.com/minify-stream/-/minify-stream-2.1.0.tgz#2df5cceee43260f57017cb90739fbf15ca7ade04" integrity sha512-P5xE4EQRkn7Td54VGcgfDMFx1jmKPPIXCdcMfrbXS6cNHK4dO1LXwtYFb48hHrSmZfT+jlGImvHgSZEkbpNtCw== dependencies: concat-stream "^2.0.0" convert-source-map "^1.5.0" duplexify "^4.1.1" from2-string "^1.1.0" terser "^4.7.0" xtend "^4.0.1" minimalistic-assert@^1.0.0, minimalistic-assert@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz#2e194de044626d4a10e7f7fbc00ce73e83e4d5c7" integrity sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A== minimalistic-crypto-utils@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz#f6c00c1c0b082246e5c4d99dfb8c7c083b2b582a" integrity sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo= minimatch@0.3: version "0.3.0" resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-0.3.0.tgz#275d8edaac4f1bb3326472089e7949c8394699dd" integrity sha1-J12O2qxPG7MyZHIInnlJyDlGmd0= dependencies: lru-cache "2" sigmund "~1.0.0" minimatch@0.x: version "0.4.0" resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-0.4.0.tgz#bd2c7d060d2c8c8fd7cde7f1f2ed2d5b270fdb1b" integrity sha1-vSx9Bg0sjI/Xzefx8u0tWycP2xs= dependencies: lru-cache "2" sigmund "~1.0.0" "minimatch@2 || 3", minimatch@3.0.4, minimatch@^3.0.2, minimatch@^3.0.4: version "3.0.4" resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" integrity sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA== dependencies: brace-expansion "^1.1.7" minimatch@^0.2.14, minimatch@~0.2.12: version "0.2.14" resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-0.2.14.tgz#c74e780574f63c6f9a090e90efbe6ef53a6a756a" integrity sha1-x054BXT2PG+aCQ6Q775u9TpqdWo= dependencies: lru-cache "2" sigmund "~1.0.0" minimatch@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-1.0.0.tgz#e0dd2120b49e1b724ce8d714c520822a9438576d" integrity sha1-4N0hILSeG3JM6NcUxSCCKpQ4V20= dependencies: lru-cache "2" sigmund "~1.0.0" minimatch@^2.0.1: version "2.0.10" resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-2.0.10.tgz#8d087c39c6b38c001b97fca7ce6d0e1e80afbac7" integrity sha1-jQh8OcazjAAbl/ynzm0OHoCvusc= dependencies: brace-expansion "^1.0.0" minimist-options@4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/minimist-options/-/minimist-options-4.1.0.tgz#c0655713c53a8a2ebd77ffa247d342c40f010619" integrity sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A== dependencies: arrify "^1.0.1" is-plain-obj "^1.1.0" kind-of "^6.0.3" minimist@0.0.8: version "0.0.8" resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d" integrity sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0= minimist@^0.2.0: version "0.2.1" resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.2.1.tgz#827ba4e7593464e7c221e8c5bed930904ee2c455" integrity sha512-GY8fANSrTMfBVfInqJAY41QkOM+upUTytK1jZ0c8+3HdHrJxBJ3rF5i9moClXTE8uUSnUo8cAsCoxDXvSY4DHg== minimist@^1.0.0, minimist@^1.1.0, minimist@^1.1.1, minimist@^1.2.0, minimist@^1.2.5: version "1.2.5" resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.5.tgz#67d66014b66a6a8aaa0c083c5fd58df4e4e97602" integrity sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw== mixin-deep@^1.2.0: version "1.3.2" resolved "https://registry.yarnpkg.com/mixin-deep/-/mixin-deep-1.3.2.tgz#1120b43dc359a785dce65b55b82e257ccf479566" integrity sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA== dependencies: for-in "^1.0.2" is-extendable "^1.0.1" mkdirp-classic@^0.5.2: version "0.5.3" resolved "https://registry.yarnpkg.com/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz#fa10c9115cc6d8865be221ba47ee9bed78601113" integrity sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A== mkdirp@0.3.5, mkdirp@0.3.x: version "0.3.5" resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.3.5.tgz#de3e5f8961c88c787ee1368df849ac4413eca8d7" integrity sha1-3j5fiWHIjHh+4TaN+EmsRBPsqNc= mkdirp@0.5.1: version "0.5.1" resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903" integrity sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM= dependencies: minimist "0.0.8" mkdirp@0.5.x, mkdirp@^0.5.4: version "0.5.5" resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.5.tgz#d91cefd62d1436ca0f41620e251288d420099def" integrity sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ== dependencies: minimist "^1.2.5" mocha@6.2.2: version "6.2.2" resolved "https://registry.yarnpkg.com/mocha/-/mocha-6.2.2.tgz#5d8987e28940caf8957a7d7664b910dc5b2fea20" integrity sha512-FgDS9Re79yU1xz5d+C4rv1G7QagNGHZ+iXF81hO8zY35YZZcLEsJVfFolfsqKFWunATEvNzMK0r/CwWd/szO9A== dependencies: ansi-colors "3.2.3" browser-stdout "1.3.1" debug "3.2.6" diff "3.5.0" escape-string-regexp "1.0.5" find-up "3.0.0" glob "7.1.3" growl "1.10.5" he "1.2.0" js-yaml "3.13.1" log-symbols "2.2.0" minimatch "3.0.4" mkdirp "0.5.1" ms "2.1.1" node-environment-flags "1.0.5" object.assign "4.1.0" strip-json-comments "2.0.1" supports-color "6.0.0" which "1.3.1" wide-align "1.1.3" yargs "13.3.0" yargs-parser "13.1.1" yargs-unparser "1.6.0" module-deps@^4.0.2, module-deps@^4.0.8: version "4.1.1" resolved "https://registry.yarnpkg.com/module-deps/-/module-deps-4.1.1.tgz#23215833f1da13fd606ccb8087b44852dcb821fd" integrity sha1-IyFYM/HaE/1gbMuAh7RIUty4If0= dependencies: JSONStream "^1.0.3" browser-resolve "^1.7.0" cached-path-relative "^1.0.0" concat-stream "~1.5.0" defined "^1.0.0" detective "^4.0.0" duplexer2 "^0.1.2" inherits "^2.0.1" parents "^1.0.0" readable-stream "^2.0.2" resolve "^1.1.3" stream-combiner2 "^1.1.1" subarg "^1.0.0" through2 "^2.0.0" xtend "^4.0.0" module-deps@^6.2.3: version "6.2.3" resolved "https://registry.yarnpkg.com/module-deps/-/module-deps-6.2.3.tgz#15490bc02af4b56cf62299c7c17cba32d71a96ee" integrity sha512-fg7OZaQBcL4/L+AK5f4iVqf9OMbCclXfy/znXRxTVhJSeW5AIlS9AwheYwDaXM3lVW7OBeaeUEY3gbaC6cLlSA== dependencies: JSONStream "^1.0.3" browser-resolve "^2.0.0" cached-path-relative "^1.0.2" concat-stream "~1.6.0" defined "^1.0.0" detective "^5.2.0" duplexer2 "^0.1.2" inherits "^2.0.1" parents "^1.0.0" readable-stream "^2.0.2" resolve "^1.4.0" stream-combiner2 "^1.1.1" subarg "^1.0.0" through2 "^2.0.0" xtend "^4.0.0" mri@^1.1.0: version "1.2.0" resolved "https://registry.yarnpkg.com/mri/-/mri-1.2.0.tgz#6721480fec2a11a4889861115a48b6cbe7cc8f0b" integrity sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA== ms@0.6.2: version "0.6.2" resolved "https://registry.yarnpkg.com/ms/-/ms-0.6.2.tgz#d89c2124c6fdc1353d65a8b77bf1aac4b193708c" integrity sha1-2JwhJMb9wTU9Zai3e/GqxLGTcIw= ms@0.7.1: version "0.7.1" resolved "https://registry.yarnpkg.com/ms/-/ms-0.7.1.tgz#9cd13c03adbff25b65effde7ce864ee952017098" integrity sha1-nNE8A62/8ltl7/3nzoZO6VIBcJg= ms@2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" integrity sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g= ms@2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.1.tgz#30a5864eb3ebb0a66f2ebe6d727af06a09d86e0a" integrity sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg== ms@2.1.2: version "2.1.2" resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== ms@2.1.3, ms@^2.1.1: version "2.1.3" resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== multer@^1.4.3: version "1.4.4" resolved "https://registry.yarnpkg.com/multer/-/multer-1.4.4.tgz#e2bc6cac0df57a8832b858d7418ccaa8ebaf7d8c" integrity sha512-2wY2+xD4udX612aMqMcB8Ws2Voq6NIUPEtD1be6m411T4uDH/VtL9i//xvcyFlTVfRdaBsk7hV5tgrGQqhuBiw== dependencies: append-field "^1.0.0" busboy "^0.2.11" concat-stream "^1.5.2" mkdirp "^0.5.4" object-assign "^4.1.1" on-finished "^2.3.0" type-is "^1.6.4" xtend "^4.0.0" multi-stage-sourcemap@^0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/multi-stage-sourcemap/-/multi-stage-sourcemap-0.2.1.tgz#b09fc8586eaa17f81d575c4ad02e0f7a3f6b1105" integrity sha1-sJ/IWG6qF/gdV1xK0C4Pej9rEQU= dependencies: source-map "^0.1.34" multimap@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/multimap/-/multimap-1.1.0.tgz#5263febc085a1791c33b59bb3afc6a76a2a10ca8" integrity sha512-0ZIR9PasPxGXmRsEF8jsDzndzHDj7tIav+JUmvIFB/WHswliFnquxECT/De7GR4yg99ky/NlRKJT82G1y271bw== multiparty@2.2.0: version "2.2.0" resolved "https://registry.yarnpkg.com/multiparty/-/multiparty-2.2.0.tgz#a567c2af000ad22dc8f2a653d91978ae1f5316f4" integrity sha1-pWfCrwAK0i3I8qZT2Rl4rh9TFvQ= dependencies: readable-stream "~1.1.9" stream-counter "~0.2.0" multisplice@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/multisplice/-/multisplice-1.0.0.tgz#e74cf2948dcb51a6c317fc5e22980a652f7830e9" integrity sha512-KU5tVjIdTGsMb92JlWwEZCGrvtI1ku9G9GuNbWdQT/Ici1ztFXX0L8lWpbbC3pISVMfBNL56wdqplHvva2XSlA== mutexify@^1.1.0: version "1.4.0" resolved "https://registry.yarnpkg.com/mutexify/-/mutexify-1.4.0.tgz#b7f4ac0273c81824b840887c6a6e0bfab14bbe94" integrity sha512-pbYSsOrSB/AKN5h/WzzLRMFgZhClWccf2XIB4RSMC8JbquiB0e0/SH5AIfdQMdyHmYtv4seU7yV/TvAwPLJ1Yg== dependencies: queue-tick "^1.0.0" nan@^2.12.1: version "2.15.0" resolved "https://registry.yarnpkg.com/nan/-/nan-2.15.0.tgz#3f34a473ff18e15c1b5626b62903b5ad6e665fee" integrity sha512-8ZtvEnA2c5aYCZYd1cvgdnU6cqwixRoYg70xPLWUws5ORTa/lnw+u4amixRS/Ac5U5mQVgp9pnlSUnbNWFaWZQ== nanobench@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/nanobench/-/nanobench-2.1.1.tgz#c2f23fcce116d50b4998b1954ba114674c137269" integrity sha512-z+Vv7zElcjN+OpzAxAquUayFLGK3JI/ubCl0Oh64YQqsTGG09CGqieJVQw4ui8huDnnAgrvTv93qi5UaOoNj8A== dependencies: browser-process-hrtime "^0.1.2" chalk "^1.1.3" mutexify "^1.1.0" pretty-hrtime "^1.0.2" nanomatch@^1.2.9: version "1.2.13" resolved "https://registry.yarnpkg.com/nanomatch/-/nanomatch-1.2.13.tgz#b87a8aa4fc0de8fe6be88895b38983ff265bd119" integrity sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA== dependencies: arr-diff "^4.0.0" array-unique "^0.3.2" define-property "^2.0.2" extend-shallow "^3.0.2" fragment-cache "^0.2.1" is-windows "^1.0.2" kind-of "^6.0.2" object.pick "^1.3.0" regex-not "^1.0.0" snapdragon "^0.8.1" to-regex "^3.0.1" natives@^1.1.3: version "1.1.6" resolved "https://registry.yarnpkg.com/natives/-/natives-1.1.6.tgz#a603b4a498ab77173612b9ea1acdec4d980f00bb" integrity sha512-6+TDFewD4yxY14ptjKaS63GVdtKiES1pTPyxn9Jb0rBqPMZ7VcCiooEhPNsr+mqHtMGxa/5c/HhcC4uPEUw/nA== natural-compare@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" integrity sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc= ncp@~0.4.2: version "0.4.2" resolved "https://registry.yarnpkg.com/ncp/-/ncp-0.4.2.tgz#abcc6cbd3ec2ed2a729ff6e7c1fa8f01784a8574" integrity sha1-q8xsvT7C7Spyn/bnwfqPAXhKhXQ= negotiator@0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.3.0.tgz#706d692efeddf574d57ea9fb1ab89a4fa7ee8f60" integrity sha1-cG1pLv7d9XTVfqn7GriaT6fuj2A= negotiator@0.5.3: version "0.5.3" resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.5.3.tgz#269d5c476810ec92edbe7b6c2f28316384f9a7e8" integrity sha1-Jp1cR2gQ7JLtvntsLygxY4T5p+g= negotiator@0.6.2: version "0.6.2" resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.2.tgz#feacf7ccf525a77ae9634436a64883ffeca346fb" integrity sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw== neo-async@^2.6.0: version "2.6.2" resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.6.2.tgz#b4aafb93e3aeb2d8174ca53cf163ab7d7308305f" integrity sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw== next-tick@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/next-tick/-/next-tick-1.0.0.tgz#ca86d1fe8828169b0120208e3dc8424b9db8342c" integrity sha1-yobR/ogoFpsBICCOPchCS524NCw= nlcst-is-literal@^1.0.0, nlcst-is-literal@^1.1.0: version "1.2.2" resolved "https://registry.yarnpkg.com/nlcst-is-literal/-/nlcst-is-literal-1.2.2.tgz#e64595ced168ae586ae905a2fe6825f39ccf1a7b" integrity sha512-R+1OJEmRl3ZOp9d8PbiRxGpnvmpi3jU+lzSqCJoLeogdEh0FYDRH1aC223qUbaKffxNTJkEfeDOeQfziw749yA== dependencies: nlcst-to-string "^2.0.0" nlcst-normalize@^2.0.0, nlcst-normalize@^2.1.0: version "2.1.5" resolved "https://registry.yarnpkg.com/nlcst-normalize/-/nlcst-normalize-2.1.5.tgz#14d320b346a833d1ac91dfb60558b947e4444f99" integrity sha512-xSqTKv8IHIy3n/orD7wj81BZljLfbrTot0Pv64MYUnQUXfDbi1xDSpJR4qEmbFWyFoHsmivcOdgrK+o7ky3mcw== dependencies: nlcst-to-string "^2.0.0" nlcst-search@^1.0.0: version "1.5.1" resolved "https://registry.yarnpkg.com/nlcst-search/-/nlcst-search-1.5.1.tgz#86791990b9b8785bb6d5a910d49b9ec4a7e81801" integrity sha512-G3ws0fgNlVsUvHvA2G1PTjyxzGOJ0caI0+WOvlZzev5iSUTX+R1q4lnlL4Y7E+he4ZMUW/0FMn9rYwdYon/13g== dependencies: nlcst-is-literal "^1.1.0" nlcst-normalize "^2.1.0" unist-util-visit "^1.0.0" nlcst-to-string@^2.0.0: version "2.0.4" resolved "https://registry.yarnpkg.com/nlcst-to-string/-/nlcst-to-string-2.0.4.tgz#9315dfab80882bbfd86ddf1b706f53622dc400cc" integrity sha512-3x3jwTd6UPG7vi5k4GEzvxJ5rDA7hVUIRNHPblKuMVP9Z3xmlsd9cgLcpAMkc5uPOBna82EeshROFhsPkbnTZg== node-environment-flags@1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/node-environment-flags/-/node-environment-flags-1.0.5.tgz#fa930275f5bf5dae188d6192b24b4c8bbac3d76a" integrity sha512-VNYPRfGfmZLx0Ye20jWzHUjyTW/c+6Wq+iLhDzUI4XmhrDd9l/FozXV3F2xOaXjvp0co0+v1YSR3CMP6g+VvLQ== dependencies: object.getownpropertydescriptors "^2.0.3" semver "^5.7.0" node-fetch@^2.6.1: version "2.6.6" resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.6.tgz#1751a7c01834e8e1697758732e9efb6eeadfaf89" integrity sha512-Z8/6vRlTUChSdIgMa51jxQ4lrw/Jy5SOW10ObaA47/RElsAN2c5Pn8bTgFGWn/ibwzXTE8qwr1Yzx28vsecXEA== dependencies: whatwg-url "^5.0.0" node-int64@~0.3.0: version "0.3.3" resolved "https://registry.yarnpkg.com/node-int64/-/node-int64-0.3.3.tgz#2d6e6b2ece5de8588b43d88d1bc41b26cd1fa84d" integrity sha1-LW5rLs5d6FiLQ9iNG8QbJs0fqE0= node-preload@^0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/node-preload/-/node-preload-0.2.1.tgz#c03043bb327f417a18fee7ab7ee57b408a144301" integrity sha512-RM5oyBy45cLEoHqCeh+MNuFAxO0vTFBLskvQbOKnEE7YTTSN4tbN8QWDIPQ6L+WvKsB/qLEGpYe2ZZ9d4W9OIQ== dependencies: process-on-spawn "^1.0.0" node-releases@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.1.tgz#3d1d395f204f1f2f29a54358b9fb678765ad2fc5" integrity sha512-CqyzN6z7Q6aMeF/ktcMVTzhAHCEpf8SOarwpzpf8pNBY2k5/oM34UHldUwp8VKI7uxct2HxSRdJjBaZeESzcxA== node-uuid@~1.4.0, node-uuid@~1.4.1: version "1.4.8" resolved "https://registry.yarnpkg.com/node-uuid/-/node-uuid-1.4.8.tgz#b040eb0923968afabf8d32fb1f17f1167fdab907" integrity sha1-sEDrCSOWivq/jTL7HxfxFn/auQc= nopt@3.x: version "3.0.6" resolved "https://registry.yarnpkg.com/nopt/-/nopt-3.0.6.tgz#c6465dbf08abcd4db359317f79ac68a646b28ff9" integrity sha1-xkZdvwirzU2zWTF/eaxopkayj/k= dependencies: abbrev "1" normalize-package-data@^2.5.0: version "2.5.0" resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.5.0.tgz#e66db1838b200c1dfc233225d12cb36520e234a8" integrity sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA== dependencies: hosted-git-info "^2.1.4" resolve "^1.10.0" semver "2 || 3 || 4 || 5" validate-npm-package-license "^3.0.1" normalize-package-data@^3.0.0, normalize-package-data@^3.0.2: version "3.0.3" resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-3.0.3.tgz#dbcc3e2da59509a0983422884cd172eefdfa525e" integrity sha512-p2W1sgqij3zMMyRC067Dg16bfzVH+w7hyegmpIvZ4JNjqtGOVAIvLmjBx3yP7YTe9vKJgkoNOPjwQGogDoMXFA== dependencies: hosted-git-info "^4.0.1" is-core-module "^2.5.0" semver "^7.3.4" validate-npm-package-license "^3.0.1" normalize-path@^2.0.0, normalize-path@^2.0.1: version "2.1.1" resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-2.1.1.tgz#1ab28b556e198363a8c1a6f7e6fa20137fe6aed9" integrity sha1-GrKLVW4Zg2Oowab35vogE3/mrtk= dependencies: remove-trailing-separator "^1.0.1" normalize-path@^3.0.0, normalize-path@~3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== npm-run-path@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-4.0.1.tgz#b7ecd1e5ed53da8e37a55e1c2269e0b97ed748ea" integrity sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw== dependencies: path-key "^3.0.0" number-to-words@^1.2.3: version "1.2.4" resolved "https://registry.yarnpkg.com/number-to-words/-/number-to-words-1.2.4.tgz#e0f124de9628f8d86c4eeb89bac6c07699264501" integrity sha512-/fYevVkXRcyBiZDg6yzZbm0RuaD6i0qRfn8yr+6D0KgBMOndFPxuW10qCHpzs50nN8qKuv78k8MuotZhcVX6Pw== nyc@^15.1.0: version "15.1.0" resolved "https://registry.yarnpkg.com/nyc/-/nyc-15.1.0.tgz#1335dae12ddc87b6e249d5a1994ca4bdaea75f02" integrity sha512-jMW04n9SxKdKi1ZMGhvUTHBN0EICCRkHemEoE5jm6mTYcqcdas0ATzgUgejlQUHMvpnOZqGB5Xxsv9KxJW1j8A== dependencies: "@istanbuljs/load-nyc-config" "^1.0.0" "@istanbuljs/schema" "^0.1.2" caching-transform "^4.0.0" convert-source-map "^1.7.0" decamelize "^1.2.0" find-cache-dir "^3.2.0" find-up "^4.1.0" foreground-child "^2.0.0" get-package-type "^0.1.0" glob "^7.1.6" istanbul-lib-coverage "^3.0.0" istanbul-lib-hook "^3.0.0" istanbul-lib-instrument "^4.0.0" istanbul-lib-processinfo "^2.0.2" istanbul-lib-report "^3.0.0" istanbul-lib-source-maps "^4.0.0" istanbul-reports "^3.0.2" make-dir "^3.0.0" node-preload "^0.2.1" p-map "^3.0.0" process-on-spawn "^1.0.0" resolve-from "^5.0.0" rimraf "^3.0.0" signal-exit "^3.0.2" spawn-wrap "^2.0.0" test-exclude "^6.0.0" yargs "^15.0.2" oauth-sign@~0.4.0: version "0.4.0" resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.4.0.tgz#f22956f31ea7151a821e5f2fb32c113cad8b9f69" integrity sha1-8ilW8x6nFRqCHl8vsywRPK2Ln2k= obj-props@^1.0.0: version "1.3.0" resolved "https://registry.yarnpkg.com/obj-props/-/obj-props-1.3.0.tgz#8884ab21c8d8496c4a7f696c78bf82289c51680b" integrity sha512-k2Xkjx5wn6eC3537SWAXHzB6lkI81kS+icMKMkh4nG3w7shWG6MaWOBrNvhWVOszrtL5uxdfymQQfPUxwY+2eg== object-assign@^4.1.0, object-assign@^4.1.1: version "4.1.1" resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" integrity sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM= object-copy@^0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/object-copy/-/object-copy-0.1.0.tgz#7e7d858b781bd7c991a41ba975ed3812754e998c" integrity sha1-fn2Fi3gb18mRpBupde04EnVOmYw= dependencies: copy-descriptor "^0.1.0" define-property "^0.2.5" kind-of "^3.0.3" object-inspect@^1.11.0, object-inspect@^1.11.1, object-inspect@^1.9.0: version "1.12.0" resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.12.0.tgz#6e2c120e868fd1fd18cb4f18c31741d0d6e776f0" integrity sha512-Ho2z80bVIvJloH+YzRmpZVQe87+qASmBUKZDWgx9cu+KDrX2ZDH/3tMy+gXbZETVGs2M8YdxObOh7XAtim9Y0g== object-is@^1.0.1: version "1.1.5" resolved "https://registry.yarnpkg.com/object-is/-/object-is-1.1.5.tgz#b9deeaa5fc7f1846a0faecdceec138e5778f53ac" integrity sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw== dependencies: call-bind "^1.0.2" define-properties "^1.1.3" object-keys@^1.0.11, object-keys@^1.0.12, object-keys@^1.0.6, object-keys@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== object-keys@~0.4.0: version "0.4.0" resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-0.4.0.tgz#28a6aae7428dd2c3a92f3d95f21335dd204e0336" integrity sha1-KKaq50KN0sOpLz2V8hM13SBOAzY= object-visit@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/object-visit/-/object-visit-1.0.1.tgz#f79c4493af0c5377b59fe39d395e41042dd045bb" integrity sha1-95xEk68MU3e1n+OdOV5BBC3QRbs= dependencies: isobject "^3.0.0" object.assign@4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.0.tgz#968bf1100d7956bb3ca086f006f846b3bc4008da" integrity sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w== dependencies: define-properties "^1.1.2" function-bind "^1.1.1" has-symbols "^1.0.0" object-keys "^1.0.11" object.assign@^4.1.0, object.assign@^4.1.2: version "4.1.2" resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.2.tgz#0ed54a342eceb37b38ff76eb831a0e788cb63940" integrity sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ== dependencies: call-bind "^1.0.0" define-properties "^1.1.3" has-symbols "^1.0.1" object-keys "^1.1.1" object.getownpropertydescriptors@^2.0.3: version "2.1.3" resolved "https://registry.yarnpkg.com/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.3.tgz#b223cf38e17fefb97a63c10c91df72ccb386df9e" integrity sha512-VdDoCwvJI4QdC6ndjpqFmoL3/+HxffFBbcJzKi5hwLLqqx3mdbedRpfZDdK0SrOSauj8X4GzBvnDZl4vTN7dOw== dependencies: call-bind "^1.0.2" define-properties "^1.1.3" es-abstract "^1.19.1" object.omit@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/object.omit/-/object.omit-2.0.1.tgz#1a9c744829f39dbb858c76ca3579ae2a54ebd1fa" integrity sha1-Gpx0SCnznbuFjHbKNXmuKlTr0fo= dependencies: for-own "^0.1.4" is-extendable "^0.1.1" object.pick@^1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/object.pick/-/object.pick-1.3.0.tgz#87a10ac4c1694bd2e1cbf53591a66141fb5dd747" integrity sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c= dependencies: isobject "^3.0.1" object.values@^1.1.5: version "1.1.5" resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.1.5.tgz#959f63e3ce9ef108720333082131e4a459b716ac" integrity sha512-QUZRW0ilQ3PnPpbNtgdNV1PDbEqLIiSFB3l+EnGtBQ/8SUTLj1PZwtQHABZtLgwpJZTSZhuGLOGk57Drx2IvYg== dependencies: call-bind "^1.0.2" define-properties "^1.1.3" es-abstract "^1.19.1" on-finished@^2.3.0, on-finished@~2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.3.0.tgz#20f1336481b083cd75337992a16971aa2d906947" integrity sha1-IPEzZIGwg811M3mSoWlxqi2QaUc= dependencies: ee-first "1.1.1" on-finished@~2.2.1: version "2.2.1" resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.2.1.tgz#5c85c1cc36299f78029653f667f27b6b99ebc029" integrity sha1-XIXBzDYpn3gCllP2Z/J7a5nrwCk= dependencies: ee-first "1.1.0" on-headers@~1.0.0, on-headers@~1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/on-headers/-/on-headers-1.0.2.tgz#772b0ae6aaa525c399e489adfad90c403eb3c28f" integrity sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA== once@1.4.0, once@1.x, once@^1.3.0, once@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" integrity sha1-WDsap3WWHUsROsF9nFC6753Xa9E= dependencies: wrappy "1" onetime@^5.1.0, onetime@^5.1.2: version "5.1.2" resolved "https://registry.yarnpkg.com/onetime/-/onetime-5.1.2.tgz#d0e96ebb56b07476df1dd9c4806e5237985ca45e" integrity sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg== dependencies: mimic-fn "^2.1.0" open-editor@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/open-editor/-/open-editor-4.0.0.tgz#881900b3c5540eaeef5b880abd05638ee82ca81f" integrity sha512-5mKZ98iFdkivozt5XTCOspoKbL3wtYu6oOoVxfWQ0qUX9NYsK8pdkHE7VUHXr+CwyC3nf6mV0S5FPsMS65innw== dependencies: env-editor "^1.0.0" execa "^5.1.1" line-column-path "^3.0.0" open "^8.4.0" open@^8.4.0: version "8.4.0" resolved "https://registry.yarnpkg.com/open/-/open-8.4.0.tgz#345321ae18f8138f82565a910fdc6b39e8c244f8" integrity sha512-XgFPPM+B28FtCCgSb9I+s9szOC1vZRSwgWsRUA5ylIxRTgKozqjOCrVOqGsYABPYK5qnfqClxZTFBa8PKt2v6Q== dependencies: define-lazy-prop "^2.0.0" is-docker "^2.1.1" is-wsl "^2.2.0" opener@1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/opener/-/opener-1.4.0.tgz#d11f86eeeb076883735c9d509f538fe82d10b941" integrity sha1-0R+G7usHaINzXJ1Qn1OP6C0QuUE= optimist@0.3.4: version "0.3.4" resolved "https://registry.yarnpkg.com/optimist/-/optimist-0.3.4.tgz#4d6d0bd71ffad0da4ba4f6d876d5eeb04e07480b" integrity sha1-TW0L1x/60NpLpPbYdtXusE4HSAs= dependencies: wordwrap "~0.0.2" optimist@~0.3, optimist@~0.3.5: version "0.3.7" resolved "https://registry.yarnpkg.com/optimist/-/optimist-0.3.7.tgz#c90941ad59e4273328923074d2cf2e7cbc6ec0d9" integrity sha1-yQlBrVnkJzMokjB00s8ufLxuwNk= dependencies: wordwrap "~0.0.2" optionator@^0.8.1: version "0.8.3" resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.8.3.tgz#84fa1d036fe9d3c7e21d99884b601167ec8fb495" integrity sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA== dependencies: deep-is "~0.1.3" fast-levenshtein "~2.0.6" levn "~0.3.0" prelude-ls "~1.1.2" type-check "~0.3.2" word-wrap "~1.2.3" optionator@^0.9.1: version "0.9.1" resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.9.1.tgz#4f236a6373dae0566a6d43e1326674f50c291499" integrity sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw== dependencies: deep-is "^0.1.3" fast-levenshtein "^2.0.6" levn "^0.4.1" prelude-ls "^1.2.1" type-check "^0.4.0" word-wrap "^1.2.3" os-browserify@~0.1.1: version "0.1.2" resolved "https://registry.yarnpkg.com/os-browserify/-/os-browserify-0.1.2.tgz#49ca0293e0b19590a5f5de10c7f265a617d8fe54" integrity sha1-ScoCk+CxlZCl9d4Qx/JlphfY/lQ= os-browserify@~0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/os-browserify/-/os-browserify-0.3.0.tgz#854373c7f5c2315914fc9bfc6bd8238fdda1ec27" integrity sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc= osenv@0.0.3: version "0.0.3" resolved "https://registry.yarnpkg.com/osenv/-/osenv-0.0.3.tgz#cd6ad8ddb290915ad9e22765576025d411f29cb6" integrity sha1-zWrY3bKQkVrZ4idlV2Al1BHynLY= outpipe@^1.1.0: version "1.1.1" resolved "https://registry.yarnpkg.com/outpipe/-/outpipe-1.1.1.tgz#50cf8616365e87e031e29a5ec9339a3da4725fa2" integrity sha1-UM+GFjZeh+Ax4ppeyTOaPaRyX6I= dependencies: shell-quote "^1.4.2" p-limit@^1.1.0: version "1.3.0" resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-1.3.0.tgz#b86bd5f0c25690911c7590fcbfc2010d54b3ccb8" integrity sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q== dependencies: p-try "^1.0.0" p-limit@^2.0.0, p-limit@^2.2.0: version "2.3.0" resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.3.0.tgz#3dd33c647a214fdfffd835933eb086da0dc21db1" integrity sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w== dependencies: p-try "^2.0.0" p-limit@^3.0.2: version "3.1.0" resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-3.1.0.tgz#e1daccbe78d0d1388ca18c64fea38e3e57e3706b" integrity sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ== dependencies: yocto-queue "^0.1.0" p-limit@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-4.0.0.tgz#914af6544ed32bfa54670b061cafcbd04984b644" integrity sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ== dependencies: yocto-queue "^1.0.0" p-locate@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-2.0.0.tgz#20a0103b222a70c8fd39cc2e580680f3dde5ec43" integrity sha1-IKAQOyIqcMj9OcwuWAaA893l7EM= dependencies: p-limit "^1.1.0" p-locate@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-3.0.0.tgz#322d69a05c0264b25997d9f40cd8a891ab0064a4" integrity sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ== dependencies: p-limit "^2.0.0" p-locate@^4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-4.1.0.tgz#a3428bb7088b3a60292f66919278b7c297ad4f07" integrity sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A== dependencies: p-limit "^2.2.0" p-locate@^5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-5.0.0.tgz#83c8315c6785005e3bd021839411c9e110e6d834" integrity sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw== dependencies: p-limit "^3.0.2" p-locate@^6.0.0: version "6.0.0" resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-6.0.0.tgz#3da9a49d4934b901089dca3302fa65dc5a05c04f" integrity sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw== dependencies: p-limit "^4.0.0" p-map@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/p-map/-/p-map-3.0.0.tgz#d704d9af8a2ba684e2600d9a215983d4141a979d" integrity sha512-d3qXVTF/s+W+CdJ5A29wywV2n8CQQYahlgz2bFiA+4eVNJbHJodPZ+/gXwPGh0bOqA+j8S+6+ckmvLGPk1QpxQ== dependencies: aggregate-error "^3.0.0" p-map@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/p-map/-/p-map-4.0.0.tgz#bb2f95a5eda2ec168ec9274e06a747c3e2904d2b" integrity sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ== dependencies: aggregate-error "^3.0.0" p-try@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/p-try/-/p-try-1.0.0.tgz#cbc79cdbaf8fd4228e13f621f2b1a237c1b207b3" integrity sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M= p-try@^2.0.0: version "2.2.0" resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6" integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ== package-hash@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/package-hash/-/package-hash-4.0.0.tgz#3537f654665ec3cc38827387fc904c163c54f506" integrity sha512-whdkPIooSu/bASggZ96BWVvZTRMOFxnyUG5PnTSGKoJE2gd5mbVNmR2Nj20QFzxYYgAXpoqC+AiXzl+UMRh7zQ== dependencies: graceful-fs "^4.1.15" hasha "^5.0.0" lodash.flattendeep "^4.4.0" release-zalgo "^1.0.0" pako@~0.2.0: version "0.2.9" resolved "https://registry.yarnpkg.com/pako/-/pako-0.2.9.tgz#f3f7522f4ef782348da8161bad9ecfd51bf83a75" integrity sha1-8/dSL073gjSNqBYbrZ7P1Rv4OnU= pako@~1.0.5: version "1.0.11" resolved "https://registry.yarnpkg.com/pako/-/pako-1.0.11.tgz#6c9599d340d54dfd3946380252a35705a6b992bf" integrity sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw== parent-module@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/parent-module/-/parent-module-1.0.1.tgz#691d2709e78c79fae3a156622452d00762caaaa2" integrity sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g== dependencies: callsites "^3.0.0" parents@^1.0.0, parents@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/parents/-/parents-1.0.1.tgz#fedd4d2bf193a77745fe71e371d73c3307d9c751" integrity sha1-/t1NK/GTp3dF/nHjcdc8MwfZx1E= dependencies: path-platform "~0.11.15" parse-asn1@^5.0.0, parse-asn1@^5.1.5: version "5.1.6" resolved "https://registry.yarnpkg.com/parse-asn1/-/parse-asn1-5.1.6.tgz#385080a3ec13cb62a62d39409cb3e88844cdaed4" integrity sha512-RnZRo1EPU6JBnra2vGHj0yhp6ebyjBZpmUCLHWiFhxlzvBCCpAuZ7elsBp1PVAbQN0/04VD/19rfzlBSwLstMw== dependencies: asn1.js "^5.2.0" browserify-aes "^1.0.0" evp_bytestokey "^1.0.0" pbkdf2 "^3.0.3" safe-buffer "^5.1.1" parse-author@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/parse-author/-/parse-author-2.0.0.tgz#d3460bf1ddd0dfaeed42da754242e65fb684a81f" integrity sha1-00YL8d3Q367tQtp1QkLmX7aEqB8= dependencies: author-regex "^1.0.0" parse-english@^4.0.0: version "4.2.0" resolved "https://registry.yarnpkg.com/parse-english/-/parse-english-4.2.0.tgz#037b68f34d1a1bdf3d33668b87791bdfc1f01e1e" integrity sha512-jw5N6wZUZViIw3VLG/FUSeL3vDhfw5Q2g4E3nYC69Mm5ANbh9ZWd+eligQbeUoyObZM8neynTn3l14e09pjEWg== dependencies: nlcst-to-string "^2.0.0" parse-latin "^4.0.0" unist-util-modify-children "^2.0.0" unist-util-visit-children "^1.0.0" parse-entities@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/parse-entities/-/parse-entities-2.0.0.tgz#53c6eb5b9314a1f4ec99fa0fdf7ce01ecda0cbe8" integrity sha512-kkywGpCcRYhqQIchaWqZ875wzpS/bMKhz5HnN3p7wveJTkTtyAB/AlnS0f8DFSqYW1T82t6yEAkEcB+A1I3MbQ== dependencies: character-entities "^1.0.0" character-entities-legacy "^1.0.0" character-reference-invalid "^1.0.0" is-alphanumerical "^1.0.0" is-decimal "^1.0.0" is-hexadecimal "^1.0.0" parse-glob@^3.0.4: version "3.0.4" resolved "https://registry.yarnpkg.com/parse-glob/-/parse-glob-3.0.4.tgz#b2c376cfb11f35513badd173ef0bb6e3a388391c" integrity sha1-ssN2z7EfNVE7rdFz7wu246OIORw= dependencies: glob-base "^0.3.0" is-dotfile "^1.0.0" is-extglob "^1.0.0" is-glob "^2.0.0" parse-json@^5.0.0, parse-json@^5.2.0: version "5.2.0" resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-5.2.0.tgz#c76fc66dee54231c962b22bcc8a72cf2f99753cd" integrity sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg== dependencies: "@babel/code-frame" "^7.0.0" error-ex "^1.3.1" json-parse-even-better-errors "^2.3.0" lines-and-columns "^1.1.6" parse-json@^6.0.0: version "6.0.2" resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-6.0.2.tgz#6bf79c201351cc12d5d66eba48d5a097c13dc200" integrity sha512-SA5aMiaIjXkAiBrW/yPgLgQAQg42f7K3ACO+2l/zOvtQBwX58DMUsFJXelW2fx3yMBmWOVkR6j1MGsdSbCA4UA== dependencies: "@babel/code-frame" "^7.16.0" error-ex "^1.3.2" json-parse-even-better-errors "^2.3.1" lines-and-columns "^2.0.2" parse-latin@^4.0.0: version "4.3.0" resolved "https://registry.yarnpkg.com/parse-latin/-/parse-latin-4.3.0.tgz#1a70fc5601743baa06c5f12253c334fc94b4a917" integrity sha512-TYKL+K98dcAWoCw/Ac1yrPviU8Trk+/gmjQVaoWEFDZmVD4KRg6c/80xKqNNFQObo2mTONgF8trzAf2UTwKafw== dependencies: nlcst-to-string "^2.0.0" unist-util-modify-children "^2.0.0" unist-util-visit-children "^1.0.0" parseurl@~1.3.3: version "1.3.3" resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.3.tgz#9da19e7bee8d12dff0513ed5b76957793bc2e8d4" integrity sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ== pascalcase@^0.1.1: version "0.1.1" resolved "https://registry.yarnpkg.com/pascalcase/-/pascalcase-0.1.1.tgz#b363e55e8006ca6fe21784d2db22bd15d7917f14" integrity sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ= path-browserify@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/path-browserify/-/path-browserify-1.0.1.tgz#d98454a9c3753d5790860f16f68867b9e46be1fd" integrity sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g== path-browserify@~0.0.0: version "0.0.1" resolved "https://registry.yarnpkg.com/path-browserify/-/path-browserify-0.0.1.tgz#e6c4ddd7ed3aa27c68a20cc4e50e1a4ee83bbc4a" integrity sha512-BapA40NHICOS+USX9SN4tyhq+A2RrN/Ws5F0Z5aMHDp98Fl86lX8Oti8B7uN93L4Ifv4fHOEA+pQw87gmMO/lQ== path-exists@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515" integrity sha1-zg6+ql94yxiSXqfYENe1mwEP1RU= path-exists@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3" integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== path-exists@^5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-5.0.0.tgz#a6aad9489200b21fab31e49cf09277e5116fb9e7" integrity sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ== path-is-absolute@^1.0.0, path-is-absolute@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" integrity sha1-F0uSaHNVNP+8es5r9TpanhtcX18= path-key@^3.0.0, path-key@^3.1.0: version "3.1.1" resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== path-parse@^1.0.5, path-parse@^1.0.7: version "1.0.7" resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== path-platform@~0.11.15: version "0.11.15" resolved "https://registry.yarnpkg.com/path-platform/-/path-platform-0.11.15.tgz#e864217f74c36850f0852b78dc7bf7d4a5721bf2" integrity sha1-6GQhf3TDaFDwhSt43Hv31KVyG/I= path-to-regexp@0.1.7: version "0.1.7" resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.7.tgz#df604178005f522f15eb4490e7247a1bfaa67f8c" integrity sha1-32BBeABfUi8V60SQ5yR6G/qmf4w= path-type@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b" integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw== pause@0.0.1: version "0.0.1" resolved "https://registry.yarnpkg.com/pause/-/pause-0.0.1.tgz#1d408b3fdb76923b9543d96fb4c9dfd535d9cb5d" integrity sha1-HUCLP9t2kjuVQ9lvtMnf1TXZy10= pbkdf2@^3.0.3: version "3.1.2" resolved "https://registry.yarnpkg.com/pbkdf2/-/pbkdf2-3.1.2.tgz#dd822aa0887580e52f1a039dc3eda108efae3075" integrity sha512-iuh7L6jA7JEGu2WxDwtQP1ddOpaJNC4KlDEFfdQajSGgGPNi4OyDc2R7QnbY2bR9QjBVGwgvTdNJZoE7RaxUMA== dependencies: create-hash "^1.1.2" create-hmac "^1.1.4" ripemd160 "^2.0.1" safe-buffer "^5.0.1" sha.js "^2.4.8" picocolors@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.0.0.tgz#cb5bdc74ff3f51892236eaf79d68bc44564ab81c" integrity sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ== picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.2.3: version "2.3.1" resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== pify@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/pify/-/pify-4.0.1.tgz#4b2cd25c50d598735c50292224fd8c6df41e3231" integrity sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g== pkg-dir@^4.1.0: version "4.2.0" resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-4.2.0.tgz#f099133df7ede422e81d1d8448270eeb3e4261f3" integrity sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ== dependencies: find-up "^4.0.0" pkg-dir@^5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-5.0.0.tgz#a02d6aebe6ba133a928f74aec20bafdfe6b8e760" integrity sha512-NPE8TDbzl/3YQYY7CSS228s3g2ollTFnc+Qi3tqmqJp9Vg2ovUpixcJEo2HJScN2Ez+kEaal6y70c0ehqJBJeA== dependencies: find-up "^5.0.0" plur@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/plur/-/plur-4.0.0.tgz#729aedb08f452645fe8c58ef115bf16b0a73ef84" integrity sha512-4UGewrYgqDFw9vV6zNV+ADmPAUAfJPKtGvb/VdpQAx25X5f3xXdGdyOEVFwkl8Hl/tl7+xbeHqSEM+D5/TirUg== dependencies: irregular-plurals "^3.2.0" pluralize@^8.0.0: version "8.0.0" resolved "https://registry.yarnpkg.com/pluralize/-/pluralize-8.0.0.tgz#1a6fa16a38d12a1901e0320fa017051c539ce3b1" integrity sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA== posix-character-classes@^0.1.0: version "0.1.1" resolved "https://registry.yarnpkg.com/posix-character-classes/-/posix-character-classes-0.1.1.tgz#01eac0fe3b5af71a2a6c02feabb8c1fef7e00eab" integrity sha1-AerA/jta9xoqbAL+q7jB/vfgDqs= prelude-ls@^1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.2.1.tgz#debc6489d7a6e6b0e7611888cec880337d316396" integrity sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g== prelude-ls@~1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54" integrity sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ= preserve@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/preserve/-/preserve-0.2.0.tgz#815ed1f6ebc65926f865b310c0713bcb3315ce4b" integrity sha1-gV7R9uvGWSb4ZbMQwHE7yzMVzks= prettier-linter-helpers@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz#d23d41fe1375646de2d0104d3454a3008802cf7b" integrity sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w== dependencies: fast-diff "^1.1.2" prettier@^2.5.0: version "2.5.1" resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.5.1.tgz#fff75fa9d519c54cf0fce328c1017d94546bc56a" integrity sha512-vBZcPRUR5MZJwoyi3ZoyQlc1rXeEck8KgeC9AwwOn+exuxLxq5toTRDTSaVrXHxelDMHy9zlicw8u66yxoSUFg== pretty-hrtime@^1.0.2: version "1.0.3" resolved "https://registry.yarnpkg.com/pretty-hrtime/-/pretty-hrtime-1.0.3.tgz#b7e3ea42435a4c9b2759d99e0f201eb195802ee1" integrity sha1-t+PqQkNaTJsnWdmeDyAesZWALuE= process-nextick-args@~1.0.6: version "1.0.7" resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-1.0.7.tgz#150e20b756590ad3f91093f25a4f2ad8bff30ba3" integrity sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M= process-nextick-args@~2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2" integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag== process-on-spawn@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/process-on-spawn/-/process-on-spawn-1.0.0.tgz#95b05a23073d30a17acfdc92a440efd2baefdc93" integrity sha512-1WsPDsUSMmZH5LeMLegqkPDrsGgsWwk1Exipy2hvB0o/F0ASzbpIctSCcZIK1ykJvtTJULEH+20WOFjMvGnCTg== dependencies: fromentries "^1.2.0" process@~0.11.0: version "0.11.10" resolved "https://registry.yarnpkg.com/process/-/process-0.11.10.tgz#7332300e840161bda3e69a1d1d91a7d4bc16f182" integrity sha1-czIwDoQBYb2j5podHZGn1LwW8YI= progress@^2.0.0: version "2.0.3" resolved "https://registry.yarnpkg.com/progress/-/progress-2.0.3.tgz#7e8cf8d8f5b8f239c1bc68beb4eb78567d572ef8" integrity sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA== proto-props@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/proto-props/-/proto-props-2.0.0.tgz#8ac6e6dec658545815c623a3bc81580deda9a181" integrity sha512-2yma2tog9VaRZY2mn3Wq51uiSW4NcPYT1cQdBagwyrznrilKSZwIZ0UG3ZPL/mx+axEns0hE35T5ufOYZXEnBQ== proxy-addr@~2.0.7: version "2.0.7" resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.7.tgz#f19fe69ceab311eeb94b42e70e8c2070f9ba1025" integrity sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg== dependencies: forwarded "0.2.0" ipaddr.js "1.9.1" psl@^1.1.33: version "1.8.0" resolved "https://registry.yarnpkg.com/psl/-/psl-1.8.0.tgz#9326f8bcfb013adcc005fdff056acce020e51c24" integrity sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ== public-encrypt@^4.0.0: version "4.0.3" resolved "https://registry.yarnpkg.com/public-encrypt/-/public-encrypt-4.0.3.tgz#4fcc9d77a07e48ba7527e7cbe0de33d0701331e0" integrity sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q== dependencies: bn.js "^4.1.0" browserify-rsa "^4.0.0" create-hash "^1.1.0" parse-asn1 "^5.0.0" randombytes "^2.0.1" safe-buffer "^5.1.2" punycode@1.3.2: version "1.3.2" resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.3.2.tgz#9653a036fb7c1ee42342f2325cceefea3926c48d" integrity sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0= punycode@^1.3.2: version "1.4.1" resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e" integrity sha1-wNWmOycYgArY4esPpSachN1BhF4= punycode@^2.1.0, punycode@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec" integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A== q@^1.5.1: version "1.5.1" resolved "https://registry.yarnpkg.com/q/-/q-1.5.1.tgz#7e32f75b41381291d04611f1bf14109ac00651d7" integrity sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc= q@~1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/q/-/q-1.0.1.tgz#11872aeedee89268110b10a718448ffb10112a14" integrity sha1-EYcq7t7okmgRCxCnGESP+xARKhQ= qs@0.6.5: version "0.6.5" resolved "https://registry.yarnpkg.com/qs/-/qs-0.6.5.tgz#294b268e4b0d4250f6dde19b3b8b34935dff14ef" integrity sha1-KUsmjksNQlD23eGbO4s0k13/FO8= qs@0.6.6: version "0.6.6" resolved "https://registry.yarnpkg.com/qs/-/qs-0.6.6.tgz#6e015098ff51968b8a3c819001d5f2c89bc4b107" integrity sha1-bgFQmP9RlouKPIGQAdXyyJvEsQc= qs@2.4.2: version "2.4.2" resolved "https://registry.yarnpkg.com/qs/-/qs-2.4.2.tgz#f7ce788e5777df0b5010da7f7c4e73ba32470f5a" integrity sha1-9854jld33wtQENp/fE5zujJHD1o= qs@6.9.3: version "6.9.3" resolved "https://registry.yarnpkg.com/qs/-/qs-6.9.3.tgz#bfadcd296c2d549f1dffa560619132c977f5008e" integrity sha512-EbZYNarm6138UKKq46tdx08Yo/q9ZhFoAXAI1meAFd2GtbRDhbZY2WQSICskT0c5q99aFzLG1D4nvTk9tqfXIw== qs@6.9.6: version "6.9.6" resolved "https://registry.yarnpkg.com/qs/-/qs-6.9.6.tgz#26ed3c8243a431b2924aca84cc90471f35d5a0ee" integrity sha512-TIRk4aqYLNoJUbd+g2lEdz5kLWIuTMRagAXxl78Q0RiVjAOugHmeKNGdd3cwo/ktpf9aL9epCfFqWDEKysUlLQ== qs@^6.10.1: version "6.10.2" resolved "https://registry.yarnpkg.com/qs/-/qs-6.10.2.tgz#c1431bea37fc5b24c5bdbafa20f16bdf2a4b9ffe" integrity sha512-mSIdjzqznWgfd4pMii7sHtaYF8rx8861hBO80SraY5GT0XQibWZWJSid0avzHGkDIZLImux2S5mXO0Hfct2QCw== dependencies: side-channel "^1.0.4" qs@~1.2.0: version "1.2.2" resolved "https://registry.yarnpkg.com/qs/-/qs-1.2.2.tgz#19b57ff24dc2a99ce1f8bdf6afcda59f8ef61f88" integrity sha1-GbV/8k3CqZzh+L32r82ln472H4g= querystring-es3@~0.2.0: version "0.2.1" resolved "https://registry.yarnpkg.com/querystring-es3/-/querystring-es3-0.2.1.tgz#9ec61f79049875707d69414596fd907a4d711e73" integrity sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM= querystring@0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/querystring/-/querystring-0.2.0.tgz#b209849203bb25df820da756e747005878521620" integrity sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA= queue-microtask@^1.2.2: version "1.2.3" resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243" integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== queue-tick@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/queue-tick/-/queue-tick-1.0.0.tgz#011104793a3309ae86bfeddd54e251dc94a36725" integrity sha512-ULWhjjE8BmiICGn3G8+1L9wFpERNxkf8ysxkAer4+TFdRefDaXOCV5m92aMB9FtBVmn/8sETXLXY6BfW7hyaWQ== quick-lru@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/quick-lru/-/quick-lru-4.0.1.tgz#5b8878f113a58217848c6482026c73e1ba57727f" integrity sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g== quick-lru@^5.1.1: version "5.1.1" resolved "https://registry.yarnpkg.com/quick-lru/-/quick-lru-5.1.1.tgz#366493e6b3e42a3a6885e2e99d18f80fb7a8c932" integrity sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA== quotation@^1.0.0, quotation@^1.0.1: version "1.1.3" resolved "https://registry.yarnpkg.com/quotation/-/quotation-1.1.3.tgz#2a4d11f70105ad398b577883f310469367f53351" integrity sha512-45gUgmX/RtQOQV1kwM06boP49OYXcKCPrYwdmAvs5YqkpiobhNKKwo524JM6Ma0ko3oN9tXNcWs9+ABq3Ry7YA== random-bytes@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/random-bytes/-/random-bytes-1.0.0.tgz#4f68a1dc0ae58bd3fb95848c30324db75d64360b" integrity sha1-T2ih3Arli9P7lYSMMDJNt11kNgs= randomatic@^3.0.0: version "3.1.1" resolved "https://registry.yarnpkg.com/randomatic/-/randomatic-3.1.1.tgz#b776efc59375984e36c537b2f51a1f0aff0da1ed" integrity sha512-TuDE5KxZ0J461RVjrJZCJc+J+zCkTb1MbH9AQUq68sMhOMcy9jLcb3BrZKgp9q9Ncltdg4QVqWrH02W2EFFVYw== dependencies: is-number "^4.0.0" kind-of "^6.0.0" math-random "^1.0.1" randombytes@^2.0.0, randombytes@^2.0.1, randombytes@^2.0.5: version "2.1.0" resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.1.0.tgz#df6f84372f0270dc65cdf6291349ab7a473d4f2a" integrity sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ== dependencies: safe-buffer "^5.1.0" randomfill@^1.0.3: version "1.0.4" resolved "https://registry.yarnpkg.com/randomfill/-/randomfill-1.0.4.tgz#c92196fc86ab42be983f1bf31778224931d61458" integrity sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw== dependencies: randombytes "^2.0.5" safe-buffer "^5.1.0" range-parser@0.0.4: version "0.0.4" resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-0.0.4.tgz#c0427ffef51c10acba0782a46c9602e744ff620b" integrity sha1-wEJ//vUcEKy6B4KkbJYC50T/Ygs= range-parser@~1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.1.tgz#3cf37023d199e1c24d1a55b84800c2f3e6468031" integrity sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg== raw-body@1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-1.1.2.tgz#c74b3004dea5defd1696171106ac740ec31d62be" integrity sha1-x0swBN6l3v0WlhcRBqx0DsMdYr4= dependencies: bytes "~0.2.1" raw-body@2.4.2: version "2.4.2" resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.4.2.tgz#baf3e9c21eebced59dd6533ac872b71f7b61cb32" integrity sha512-RPMAFUJP19WIet/99ngh6Iv8fzAbqum4Li7AD6DtGaW2RpMB/11xDoalPiJMTbu6I3hkbMVkATvZrqb9EEqeeQ== dependencies: bytes "3.1.1" http-errors "1.8.1" iconv-lite "0.4.24" unpipe "1.0.0" raw-body@~2.0.1: version "2.0.2" resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.0.2.tgz#a2c2f98c8531cee99c63d8d238b7de97bb659fca" integrity sha1-osL5jIUxzumcY9jSOLfel7tln8o= dependencies: bytes "2.1.0" iconv-lite "0.4.8" rc@^1.2.8: version "1.2.8" resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.8.tgz#cd924bf5200a075b83c188cd6b9e211b7fc0d3ed" integrity sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw== dependencies: deep-extend "^0.6.0" ini "~1.3.0" minimist "^1.2.0" strip-json-comments "~2.0.1" read-only-stream@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/read-only-stream/-/read-only-stream-2.0.0.tgz#2724fd6a8113d73764ac288d4386270c1dbf17f0" integrity sha1-JyT9aoET1zdkrCiNQ4YnDB2/F/A= dependencies: readable-stream "^2.0.2" read-pkg-up@^7.0.1: version "7.0.1" resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-7.0.1.tgz#f3a6135758459733ae2b95638056e1854e7ef507" integrity sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg== dependencies: find-up "^4.1.0" read-pkg "^5.2.0" type-fest "^0.8.1" read-pkg-up@^8.0.0: version "8.0.0" resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-8.0.0.tgz#72f595b65e66110f43b052dd9af4de6b10534670" integrity sha512-snVCqPczksT0HS2EC+SxUndvSzn6LRCwpfSvLrIfR5BKDQQZMaI6jPRC9dYvYFDRAuFEAnkwww8kBBNE/3VvzQ== dependencies: find-up "^5.0.0" read-pkg "^6.0.0" type-fest "^1.0.1" read-pkg@^5.2.0: version "5.2.0" resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-5.2.0.tgz#7bf295438ca5a33e56cd30e053b34ee7250c93cc" integrity sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg== dependencies: "@types/normalize-package-data" "^2.4.0" normalize-package-data "^2.5.0" parse-json "^5.0.0" type-fest "^0.6.0" read-pkg@^6.0.0: version "6.0.0" resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-6.0.0.tgz#a67a7d6a1c2b0c3cd6aa2ea521f40c458a4a504c" integrity sha512-X1Fu3dPuk/8ZLsMhEj5f4wFAF0DWoK7qhGJvgaijocXxBmSToKfbFtqbxMO7bVjNA1dmE5huAzjXj/ey86iw9Q== dependencies: "@types/normalize-package-data" "^2.4.0" normalize-package-data "^3.0.2" parse-json "^5.2.0" type-fest "^1.0.1" readable-stream@1.1.x, readable-stream@^1.0.27-1, readable-stream@~1.1.11, readable-stream@~1.1.8, readable-stream@~1.1.9: version "1.1.14" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-1.1.14.tgz#7cf4c54ef648e3813084c636dd2079e166c081d9" integrity sha1-fPTFTvZI44EwhMY23SB54WbAgdk= dependencies: core-util-is "~1.0.0" inherits "~2.0.1" isarray "0.0.1" string_decoder "~0.10.x" "readable-stream@2 || 3", readable-stream@3, readable-stream@^3.0.0, readable-stream@^3.0.2, readable-stream@^3.1.1, readable-stream@^3.5.0, readable-stream@^3.6.0: version "3.6.0" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.0.tgz#337bbda3adc0706bd3e024426a286d4b4b2c9198" integrity sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA== dependencies: inherits "^2.0.3" string_decoder "^1.1.1" util-deprecate "^1.0.1" readable-stream@^2.0.0, readable-stream@^2.0.2, readable-stream@^2.2.2, readable-stream@^2.3.6, readable-stream@~2.3.6: version "2.3.7" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.7.tgz#1eca1cf711aef814c04f62252a36a62f6cb23b57" integrity sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw== dependencies: core-util-is "~1.0.0" inherits "~2.0.3" isarray "~1.0.0" process-nextick-args "~2.0.0" safe-buffer "~5.1.1" string_decoder "~1.1.1" util-deprecate "~1.0.1" readable-stream@~1.0.2, readable-stream@~1.0.24, readable-stream@~1.0.26, readable-stream@~1.0.33: version "1.0.34" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-1.0.34.tgz#125820e34bc842d2f2aaafafe4c2916ee32c157c" integrity sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw= dependencies: core-util-is "~1.0.0" inherits "~2.0.1" isarray "0.0.1" string_decoder "~0.10.x" readable-stream@~2.0.0: version "2.0.6" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.0.6.tgz#8f90341e68a53ccc928788dacfcd11b36eb9b78e" integrity sha1-j5A0HmilPMySh4jaz80Rs265t44= dependencies: core-util-is "~1.0.0" inherits "~2.0.1" isarray "~1.0.0" process-nextick-args "~1.0.6" string_decoder "~0.10.x" util-deprecate "~1.0.1" readdirp@^2.0.0: version "2.2.1" resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-2.2.1.tgz#0e87622a3325aa33e892285caf8b4e846529a525" integrity sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ== dependencies: graceful-fs "^4.1.11" micromatch "^3.1.10" readable-stream "^2.0.2" readdirp@~3.6.0: version "3.6.0" resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.6.0.tgz#74a370bd857116e245b29cc97340cd431a02a6c7" integrity sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA== dependencies: picomatch "^2.2.1" redent@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/redent/-/redent-3.0.0.tgz#e557b7998316bb53c9f1f56fa626352c6963059f" integrity sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg== dependencies: indent-string "^4.0.0" strip-indent "^3.0.0" redent@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/redent/-/redent-4.0.0.tgz#0c0ba7caabb24257ab3bb7a4fd95dd1d5c5681f9" integrity sha512-tYkDkVVtYkSVhuQ4zBgfvciymHaeuel+zFKXShfDnFP5SyVEP7qo70Rf1jTOTCx3vGNAbnEi/xFkcfQVMIBWag== dependencies: indent-string "^5.0.0" strip-indent "^4.0.0" reduce-component@1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/reduce-component/-/reduce-component-1.0.1.tgz#e0c93542c574521bea13df0f9488ed82ab77c5da" integrity sha1-4Mk1QsV0UhvqE98PlIjtgqt3xdo= regenerate-unicode-properties@^9.0.0: version "9.0.0" resolved "https://registry.yarnpkg.com/regenerate-unicode-properties/-/regenerate-unicode-properties-9.0.0.tgz#54d09c7115e1f53dc2314a974b32c1c344efe326" integrity sha512-3E12UeNSPfjrgwjkR81m5J7Aw/T55Tu7nUyZVQYCKEOs+2dkxEY+DpPtZzO4YruuiPb7NkYLVcyJC4+zCbk5pA== dependencies: regenerate "^1.4.2" regenerate@^1.4.2: version "1.4.2" resolved "https://registry.yarnpkg.com/regenerate/-/regenerate-1.4.2.tgz#b9346d8827e8f5a32f7ba29637d398b69014848a" integrity sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A== regenerator-runtime@^0.13.4: version "0.13.9" resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.9.tgz#8925742a98ffd90814988d7566ad30ca3b263b52" integrity sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA== regenerator-transform@^0.14.2: version "0.14.5" resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.14.5.tgz#c98da154683671c9c4dcb16ece736517e1b7feb4" integrity sha512-eOf6vka5IO151Jfsw2NO9WpGX58W6wWmefK3I1zEGr0lOD0u8rwPaNqQL1aRxUaxLeKO3ArNh3VYg1KbaD+FFw== dependencies: "@babel/runtime" "^7.8.4" regex-cache@^0.4.2: version "0.4.4" resolved "https://registry.yarnpkg.com/regex-cache/-/regex-cache-0.4.4.tgz#75bdc58a2a1496cec48a12835bc54c8d562336dd" integrity sha512-nVIZwtCjkC9YgvWkpM55B5rBhBYRZhAaJbgcFYXXsHnbZ9UZI9nnVWYZpBlCqv9ho2eZryPnWrZGsOdPwVWXWQ== dependencies: is-equal-shallow "^0.1.3" regex-not@^1.0.0, regex-not@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/regex-not/-/regex-not-1.0.2.tgz#1f4ece27e00b0b65e0247a6810e6a85d83a5752c" integrity sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A== dependencies: extend-shallow "^3.0.2" safe-regex "^1.1.0" regexp-tree@^0.1.23, regexp-tree@~0.1.1: version "0.1.24" resolved "https://registry.yarnpkg.com/regexp-tree/-/regexp-tree-0.1.24.tgz#3d6fa238450a4d66e5bc9c4c14bb720e2196829d" integrity sha512-s2aEVuLhvnVJW6s/iPgEGK6R+/xngd2jNQ+xy4bXNDKxZKJH6jpPHY6kVeVv1IeLCHgswRj+Kl3ELaDjG6V1iw== regexp.prototype.flags@^1.2.0: version "1.3.1" resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.3.1.tgz#7ef352ae8d159e758c0eadca6f8fcb4eef07be26" integrity sha512-JiBdRBq91WlY7uRJ0ds7R+dU02i6LKi8r3BuQhNXn+kmeLN+EfHhfjqMRis1zJxnlu88hq/4dx0P2OP3APRTOA== dependencies: call-bind "^1.0.2" define-properties "^1.1.3" regexpp@^3.0.0, regexpp@^3.2.0: version "3.2.0" resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-3.2.0.tgz#0425a2768d8f23bad70ca4b90461fa2f1213e1b2" integrity sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg== regexpu-core@^4.7.1: version "4.8.0" resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-4.8.0.tgz#e5605ba361b67b1718478501327502f4479a98f0" integrity sha512-1F6bYsoYiz6is+oz70NWur2Vlh9KWtswuRuzJOfeYUrfPX2o8n74AnUVaOGDbUqVGO9fNHu48/pjJO4sNVwsOg== dependencies: regenerate "^1.4.2" regenerate-unicode-properties "^9.0.0" regjsgen "^0.5.2" regjsparser "^0.7.0" unicode-match-property-ecmascript "^2.0.0" unicode-match-property-value-ecmascript "^2.0.0" regjsgen@^0.5.2: version "0.5.2" resolved "https://registry.yarnpkg.com/regjsgen/-/regjsgen-0.5.2.tgz#92ff295fb1deecbf6ecdab2543d207e91aa33733" integrity sha512-OFFT3MfrH90xIW8OOSyUrk6QHD5E9JOTeGodiJeBS3J6IwlgzJMNE/1bZklWz5oTg+9dCMyEetclvCVXOPoN3A== regjsparser@^0.7.0: version "0.7.0" resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.7.0.tgz#a6b667b54c885e18b52554cb4960ef71187e9968" integrity sha512-A4pcaORqmNMDVwUjWoTzuhwMGpP+NykpfqAsEgI1FSH/EzC7lrN5TMd+kN8YCovX+jMpu8eaqXgXPCa0g8FQNQ== dependencies: jsesc "~0.5.0" release-zalgo@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/release-zalgo/-/release-zalgo-1.0.0.tgz#09700b7e5074329739330e535c5a90fb67851730" integrity sha1-CXALflB0Mpc5Mw5TXFqQ+2eFFzA= dependencies: es6-error "^4.0.1" remark-cli@^10.0.1: version "10.0.1" resolved "https://registry.yarnpkg.com/remark-cli/-/remark-cli-10.0.1.tgz#0a38166b8bb1a1720f5ed8a324715563f63dbcba" integrity sha512-+eln31zLE69JwBMoa8nd2sPC0DFZyiWgBrshL8aKb3L2XXTRMuEKWE/IAtNPYEtcktceAQw+OpmqVy8pAmGOwQ== dependencies: remark "^14.0.0" unified-args "^9.0.0" remark-comment-config@^6.0.0: version "6.0.0" resolved "https://registry.yarnpkg.com/remark-comment-config/-/remark-comment-config-6.0.0.tgz#057f780a3cc3afd9572912575e6948941ba956ba" integrity sha512-hpv4RS6AASn+ah+j9k+3+RsQmtAfRbt2evXCEoW/9W93CJ7PLkxCgeoNnkssGjQ6mLNV6vS5vNflSVIJALn29Q== dependencies: mdast-comment-marker "^1.0.1" remark-contributors@^5.0.1: version "5.1.0" resolved "https://registry.yarnpkg.com/remark-contributors/-/remark-contributors-5.1.0.tgz#ffc333c32918a3e8f7db9ab545a9ea377cf37e4a" integrity sha512-BP/TqmLUudgXXs6/7vIR+lM2MSuvLEpuD5JPPacDSUHL9i1JoXQtvFJTebY4rIvgoYzPsO8nN3QWQge4mk5M0A== dependencies: is-url "^1.2.2" mdast-util-heading-range "^2.1.2" parse-author "^2.0.0" unist-builder "^2.0.0" vfile-find-up "^5.0.0" remark-gfm@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/remark-gfm/-/remark-gfm-1.0.0.tgz#9213643001be3f277da6256464d56fd28c3b3c0d" integrity sha512-KfexHJCiqvrdBZVbQ6RopMZGwaXz6wFJEfByIuEwGf0arvITHjiKKZ1dpXujjH9KZdm1//XJQwgfnJ3lmXaDPA== dependencies: mdast-util-gfm "^0.1.0" micromark-extension-gfm "^0.3.0" remark-heading-gap@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/remark-heading-gap/-/remark-heading-gap-4.0.0.tgz#cb1a24c20f3f2752b409bbfc5dc8776a59d79c42" integrity sha512-7kHv4qauAo/bJa73D/S9pU6sdJpLZS/6M75bJ5HYRLs6VRwpFz7XEReBP7tlPQ2CapD//qLd9LVRJ4ShieDbIg== remark-license@niftylettuce/remark-license: version "4.0.1" resolved "https://codeload.github.com/niftylettuce/remark-license/tar.gz/17ecb8f64f8f6082414d14f9267a12764e6ddbfb" dependencies: mdast-util-heading-range "^2.0.0" parse-author "^2.0.0" spdx-license-list "^3.0.1" remark-lint-blockquote-indentation@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/remark-lint-blockquote-indentation/-/remark-lint-blockquote-indentation-2.0.1.tgz#27347959acf42a6c3e401488d8210e973576b254" integrity sha512-uJ9az/Ms9AapnkWpLSCJfawBfnBI2Tn1yUsPNqIFv6YM98ymetItUMyP6ng9NFPqDvTQBbiarulkgoEo0wcafQ== dependencies: mdast-util-to-string "^1.0.2" pluralize "^8.0.0" unified-lint-rule "^1.0.0" unist-util-generated "^1.1.0" unist-util-position "^3.0.0" unist-util-visit "^2.0.0" remark-lint-checkbox-character-style@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/remark-lint-checkbox-character-style/-/remark-lint-checkbox-character-style-3.0.0.tgz#3a982c7318ea86f80fe5ee5d6d8711b5b3cad0a2" integrity sha512-691OJ5RdBRXVpvnOEiBhMB4uhHJSHVttw83O4qyAkNBiqxa1Axqhsz8FgmzYgRLQbOGd2ncVUcXG1LOJt6C0DQ== dependencies: unified-lint-rule "^1.0.0" unist-util-generated "^1.1.0" unist-util-position "^3.0.0" unist-util-visit "^2.0.0" remark-lint-checkbox-content-indent@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/remark-lint-checkbox-content-indent/-/remark-lint-checkbox-content-indent-3.0.0.tgz#fa2b74b81cbac9db23e2d3e5954421cabc78072e" integrity sha512-+T4+hoY85qZE2drD2rCe14vF7fAgD3Kv2fkFd1HRvv3M5Riy148w/4YeoBI5U5BpybGTVUeEUYLCeJ8zbJLjkw== dependencies: unified-lint-rule "^1.0.0" unist-util-generated "^1.1.0" unist-util-position "^3.0.0" unist-util-visit "^2.0.0" vfile-location "^3.0.0" remark-lint-code-block-style@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/remark-lint-code-block-style/-/remark-lint-code-block-style-2.0.1.tgz#448b0f2660acfcdfff2138d125ff5b1c1279c0cb" integrity sha512-eRhmnColmSxJhO61GHZkvO67SpHDshVxs2j3+Zoc5Y1a4zQT2133ZAij04XKaBFfsVLjhbY/+YOWxgvtjx2nmA== dependencies: unified-lint-rule "^1.0.0" unist-util-generated "^1.1.0" unist-util-position "^3.0.0" unist-util-visit "^2.0.0" remark-lint-definition-case@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/remark-lint-definition-case/-/remark-lint-definition-case-2.0.1.tgz#10340eb2f87acff41140d52ad7e5b40b47e6690a" integrity sha512-M+XlThtQwEJLQnQb5Gi6xZdkw92rGp7m2ux58WMw/Qlcg02WgHR/O0OcHPe5VO5hMJrtI+cGG5T0svsCgRZd3w== dependencies: unified-lint-rule "^1.0.0" unist-util-generated "^1.1.0" unist-util-position "^3.0.0" unist-util-visit "^2.0.0" remark-lint-definition-spacing@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/remark-lint-definition-spacing/-/remark-lint-definition-spacing-2.0.1.tgz#97f01bf9bf77a7bdf8013b124b7157dd90b07c64" integrity sha512-xK9DOQO5MudITD189VyUiMHBIKltW1oc55L7Fti3i9DedXoBG7Phm+V9Mm7IdWzCVkquZVgVk63xQdqzSQRrSQ== dependencies: unified-lint-rule "^1.0.0" unist-util-generated "^1.1.0" unist-util-position "^3.0.0" unist-util-visit "^2.0.0" remark-lint-emphasis-marker@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/remark-lint-emphasis-marker/-/remark-lint-emphasis-marker-2.0.1.tgz#1d5ca2070d4798d16c23120726158157796dc317" integrity sha512-7mpbAUrSnHiWRyGkbXRL5kfSKY9Cs8cdob7Fw+Z02/pufXMF4yRWaegJ5NTUu1RE+SKlF44wtWWjvcIoyY6/aw== dependencies: unified-lint-rule "^1.0.0" unist-util-generated "^1.1.0" unist-util-position "^3.0.0" unist-util-visit "^2.0.0" remark-lint-fenced-code-flag@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/remark-lint-fenced-code-flag/-/remark-lint-fenced-code-flag-2.0.1.tgz#2cb3ddb1157082c45760c7d01ca08e13376aaf62" integrity sha512-+COnWHlS/h02FMxoZWxNlZW3Y8M0cQQpmx3aNCbG7xkyMyCKsMLg9EmRvYHHIbxQCuF3JT0WWx5AySqlc7d+NA== dependencies: unified-lint-rule "^1.0.0" unist-util-generated "^1.1.0" unist-util-position "^3.0.0" unist-util-visit "^2.0.0" remark-lint-fenced-code-marker@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/remark-lint-fenced-code-marker/-/remark-lint-fenced-code-marker-2.0.1.tgz#7bbeb0fb45b0818a3c8a2d232cf0c723ade58ecf" integrity sha512-lujpjm04enn3ma6lITlttadld6eQ1OWAEcT3qZzvFHp+zPraC0yr0eXlvtDN/0UH8mrln/QmGiZp3i8IdbucZg== dependencies: unified-lint-rule "^1.0.0" unist-util-generated "^1.1.0" unist-util-position "^3.0.0" unist-util-visit "^2.0.0" remark-lint-file-extension@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/remark-lint-file-extension/-/remark-lint-file-extension-1.0.5.tgz#7e2feec02919aa3db5c71fda19d726a9e24a4c6c" integrity sha512-oVQdf5vEomwHkfQ7R/mgmsWW2H/t9kSvnrxtVoNOHr+qnOEafKKDn+AFhioN2kqtjCZBAjSSrePs6xGKmXKDTw== dependencies: unified-lint-rule "^1.0.0" remark-lint-final-definition@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/remark-lint-final-definition/-/remark-lint-final-definition-2.1.0.tgz#b6e654c01ebcb1afc936d7b9cd74db8ec273e0bb" integrity sha512-83K7n2icOHPfBzbR5Mr1o7cu8gOjD8FwJkFx/ly+rW+8SHfjCj4D3WOFGQ1xVdmHjfomBDXXDSNo2oiacADVXQ== dependencies: unified-lint-rule "^1.0.0" unist-util-generated "^1.1.0" unist-util-position "^3.0.0" unist-util-visit "^2.0.0" remark-lint-final-newline@^1.0.0: version "1.0.5" resolved "https://registry.yarnpkg.com/remark-lint-final-newline/-/remark-lint-final-newline-1.0.5.tgz#666f609a91f97c44f5ab7facf1fb3c5b3ffe398f" integrity sha512-rfLlW8+Fz2dqnaEgU4JwLA55CQF1T4mfSs/GwkkeUCGPenvEYwSkCN2KO2Gr1dy8qPoOdTFE1rSufLjmeTW5HA== dependencies: unified-lint-rule "^1.0.0" remark-lint-first-heading-level@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/remark-lint-first-heading-level/-/remark-lint-first-heading-level-2.0.1.tgz#24d0fd118d69a3aa08bda64b3435a9db0457eb45" integrity sha512-XoK/eLfnz1VSA8QkfMbdbvlCqOwgw29MAWEGC4Cv0666nTcY9uWHlZ/SV/20YNmuEVdfCA+92v92mM486qcASQ== dependencies: unified-lint-rule "^1.0.0" unist-util-generated "^1.1.0" unist-util-visit "^2.0.0" remark-lint-hard-break-spaces@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/remark-lint-hard-break-spaces/-/remark-lint-hard-break-spaces-2.0.1.tgz#2149b55cda17604562d040c525a2a0d26aeb0f0f" integrity sha512-Qfn/BMQFamHhtbfLrL8Co/dbYJFLRL4PGVXZ5wumkUO5f9FkZC2RsV+MD9lisvGTkJK0ZEJrVVeaPbUIFM0OAw== dependencies: unified-lint-rule "^1.0.0" unist-util-generated "^1.1.0" unist-util-position "^3.0.0" unist-util-visit "^2.0.0" remark-lint-heading-style@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/remark-lint-heading-style/-/remark-lint-heading-style-2.0.1.tgz#8216fca67d97bbbeec8a19b6c71bfefc16549f72" integrity sha512-IrFLNs0M5Vbn9qg51AYhGUfzgLAcDOjh2hFGMz3mx664dV6zLcNZOPSdJBBJq3JQR4gKpoXcNwN1+FFaIATj+A== dependencies: mdast-util-heading-style "^1.0.2" unified-lint-rule "^1.0.0" unist-util-generated "^1.1.0" unist-util-visit "^2.0.0" remark-lint-list-item-bullet-indent@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/remark-lint-list-item-bullet-indent/-/remark-lint-list-item-bullet-indent-3.0.0.tgz#3c902e75e841850da8b37126da45fc1fe850d7d6" integrity sha512-X2rleWP8XReC4LXKF7Qi5vYiPJkA4Grx5zxsjHofFrVRz6j0PYOCuz7vsO+ZzMunFMfom6FODnscSWz4zouDVw== dependencies: pluralize "^8.0.0" unified-lint-rule "^1.0.0" unist-util-generated "^1.1.0" unist-util-visit "^2.0.0" remark-lint-list-item-indent@2.0.1, remark-lint-list-item-indent@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/remark-lint-list-item-indent/-/remark-lint-list-item-indent-2.0.1.tgz#c6472514e17bc02136ca87936260407ada90bf8d" integrity sha512-4IKbA9GA14Q9PzKSQI6KEHU/UGO36CSQEjaDIhmb9UOhyhuzz4vWhnSIsxyI73n9nl9GGRAMNUSGzr4pQUFwTA== dependencies: pluralize "^8.0.0" unified-lint-rule "^1.0.0" unist-util-generated "^1.1.0" unist-util-position "^3.0.0" unist-util-visit "^2.0.0" remark-lint-no-auto-link-without-protocol@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/remark-lint-no-auto-link-without-protocol/-/remark-lint-no-auto-link-without-protocol-2.0.1.tgz#f75e5c24adb42385593e0d75ca39987edb70b6c4" integrity sha512-TFcXxzucsfBb/5uMqGF1rQA+WJJqm1ZlYQXyvJEXigEZ8EAxsxZGPb/gOQARHl/y0vymAuYxMTaChavPKaBqpQ== dependencies: mdast-util-to-string "^1.0.2" unified-lint-rule "^1.0.0" unist-util-generated "^1.1.0" unist-util-position "^3.0.0" unist-util-visit "^2.0.0" remark-lint-no-blockquote-without-marker@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/remark-lint-no-blockquote-without-marker/-/remark-lint-no-blockquote-without-marker-4.0.0.tgz#856fb64dd038fa8fc27928163caa24a30ff4d790" integrity sha512-Y59fMqdygRVFLk1gpx2Qhhaw5IKOR9T38Wf7pjR07bEFBGUNfcoNVIFMd1TCJfCPQxUyJzzSqfZz/KT7KdUuiQ== dependencies: unified-lint-rule "^1.0.0" unist-util-generated "^1.0.0" unist-util-position "^3.0.0" unist-util-visit "^2.0.0" vfile-location "^3.0.0" remark-lint-no-consecutive-blank-lines@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/remark-lint-no-consecutive-blank-lines/-/remark-lint-no-consecutive-blank-lines-3.0.0.tgz#c8fe11095b8f031a1406da273722bd4a9174bf41" integrity sha512-kmzLlOLrapBKEngwYFTdCZDmeOaze6adFPB7G0EdymD9V1mpAlnneINuOshRLEDKK5fAhXKiZXxdGIaMPkiXrA== dependencies: pluralize "^8.0.0" unified-lint-rule "^1.0.0" unist-util-generated "^1.1.0" unist-util-position "^3.0.0" unist-util-visit "^2.0.0" remark-lint-no-duplicate-definitions@^2.0.0, remark-lint-no-duplicate-definitions@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/remark-lint-no-duplicate-definitions/-/remark-lint-no-duplicate-definitions-2.0.1.tgz#588039881f63fe01df69d3b64265760b3e83b477" integrity sha512-XL22benJZB01m+aOse91nsu1IMFqeWJWme9QvoJuxIcBROO1BG1VoqLOkwNcawE/M/0CkvTo5rfx0eMlcnXOIw== dependencies: unified-lint-rule "^1.0.0" unist-util-generated "^1.1.0" unist-util-position "^3.0.0" unist-util-stringify-position "^2.0.0" unist-util-visit "^2.0.0" remark-lint-no-emphasis-as-heading@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/remark-lint-no-emphasis-as-heading/-/remark-lint-no-emphasis-as-heading-2.0.1.tgz#fcc064133fe00745943c334080fed822f72711ea" integrity sha512-z86+yWtVivtuGIxIC4g9RuATbgZgOgyLcnaleonJ7/HdGTYssjJNyqCJweaWSLoaI0akBQdDwmtJahW5iuX3/g== dependencies: unified-lint-rule "^1.0.0" unist-util-generated "^1.1.0" unist-util-visit "^2.0.0" remark-lint-no-file-name-articles@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/remark-lint-no-file-name-articles/-/remark-lint-no-file-name-articles-1.0.5.tgz#4ca3425f6613f94feaef6941028583299727c339" integrity sha512-AQk5eTb3s3TAPPjiglZgqlQj4ycao+gPs8/XkdN1VCPUtewW0GgwoQe7YEuBKayJ6ioN8dGP37Kg/P/PlKaRQA== dependencies: unified-lint-rule "^1.0.0" remark-lint-no-file-name-consecutive-dashes@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/remark-lint-no-file-name-consecutive-dashes/-/remark-lint-no-file-name-consecutive-dashes-1.0.5.tgz#e9a6f2aeab948aa249c8a8356359e3d8843a4c5c" integrity sha512-Mg2IDsi790/dSdAzwnBnsMYdZm3qC2QgGwqOWcr0TPABJhhjC3p8r5fX4MNMTXI5It7B7bW9+ImmCeLOZiXkLg== dependencies: unified-lint-rule "^1.0.0" remark-lint-no-file-name-irregular-characters@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/remark-lint-no-file-name-irregular-characters/-/remark-lint-no-file-name-irregular-characters-1.0.5.tgz#6866f5b8370cdc916d55e7cf87bb6a55f9b6e0c6" integrity sha512-Oe5i99qNUKc2bxmiH421o5B/kqlf1dfjAxpHNLhi2X2dXE91zRGavrlRM/4f4oR0N9Bqb3qB9JZPyMPWrzu9XA== dependencies: unified-lint-rule "^1.0.0" remark-lint-no-file-name-mixed-case@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/remark-lint-no-file-name-mixed-case/-/remark-lint-no-file-name-mixed-case-1.0.5.tgz#3e37bfef74bbdd4b07aa9ef9dd452758f8b46731" integrity sha512-ilrUCbHZin/ENwr8c3SC2chgkFsizXjBQIB/oZ7gnm1IkCkZPiMyXZAHdpwC/DjbrpGxfMYh9JmIHao4giS5+A== dependencies: unified-lint-rule "^1.0.0" remark-lint-no-file-name-outer-dashes@^1.0.6: version "1.0.6" resolved "https://registry.yarnpkg.com/remark-lint-no-file-name-outer-dashes/-/remark-lint-no-file-name-outer-dashes-1.0.6.tgz#4e0e4d42a63f0fdfb856bb5d8d8112725656e700" integrity sha512-rT8CmcIlenegS0Yst4maYXdZfqIjBOiRUY8j/KJkORF5tKH+3O1/S07025qPGmcRihzK3w4yO0K8rgkKQw0b9w== dependencies: unified-lint-rule "^1.0.0" remark-lint-no-heading-content-indent@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/remark-lint-no-heading-content-indent/-/remark-lint-no-heading-content-indent-3.0.0.tgz#faa323a52fcb5db9b3ce16cb8e417e43ab433af1" integrity sha512-yULDoVSIqKylLDfW6mVUbrHlyEWUSFtVFiKc+/BA412xDIhm8HZLUnP+FsuBC0OzbIZ+bO9Txy52WtO3LGnK1A== dependencies: mdast-util-heading-style "^1.0.2" pluralize "^8.0.0" unified-lint-rule "^1.0.0" unist-util-generated "^1.1.0" unist-util-position "^3.0.0" unist-util-visit "^2.0.0" remark-lint-no-heading-indent@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/remark-lint-no-heading-indent/-/remark-lint-no-heading-indent-3.0.0.tgz#2304b8525929c7eb189d34aaaa59871ae480d1b3" integrity sha512-b8ImhLv2AnRDxtYUODplzsl/7IwQ+lqRmD1bwbZgSerEP9MLaULW3SjH37EyA6z+8rCDjvEyppKKU6zec0TCjg== dependencies: pluralize "^8.0.0" unified-lint-rule "^1.0.0" unist-util-generated "^1.1.0" unist-util-position "^3.0.0" unist-util-visit "^2.0.0" remark-lint-no-heading-punctuation@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/remark-lint-no-heading-punctuation/-/remark-lint-no-heading-punctuation-2.0.1.tgz#face59f9a95c8aa278a8ee0c728bc44cd53ea9ed" integrity sha512-lY/eF6GbMeGu4cSuxfGHyvaQQBIq/6T/o+HvAR5UfxSTxmxZFwbZneAI2lbeR1zPcqOU87NsZ5ZZzWVwdLpPBw== dependencies: mdast-util-to-string "^1.0.2" unified-lint-rule "^1.0.0" unist-util-generated "^1.1.0" unist-util-visit "^2.0.0" remark-lint-no-inline-padding@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/remark-lint-no-inline-padding/-/remark-lint-no-inline-padding-3.0.0.tgz#14c2722bcddc648297a54298107a922171faf6eb" integrity sha512-3s9uW3Yux9RFC0xV81MQX3bsYs+UY7nPnRuMxeIxgcVwxQ4E/mTJd9QjXUwBhU9kdPtJ5AalngdmOW2Tgar8Cg== dependencies: mdast-util-to-string "^1.0.2" unified-lint-rule "^1.0.0" unist-util-generated "^1.1.0" unist-util-visit "^2.0.0" remark-lint-no-literal-urls@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/remark-lint-no-literal-urls/-/remark-lint-no-literal-urls-2.0.1.tgz#731908f9866c1880e6024dcee1269fb0f40335d6" integrity sha512-IDdKtWOMuKVQIlb1CnsgBoyoTcXU3LppelDFAIZePbRPySVHklTtuK57kacgU5grc7gPM04bZV96eliGrRU7Iw== dependencies: mdast-util-to-string "^1.0.2" unified-lint-rule "^1.0.0" unist-util-generated "^1.1.0" unist-util-position "^3.0.0" unist-util-visit "^2.0.0" remark-lint-no-missing-blank-lines@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/remark-lint-no-missing-blank-lines/-/remark-lint-no-missing-blank-lines-2.0.1.tgz#217bfb35c68eb0486b3db654d6cd3853a1703f8d" integrity sha512-gM46JM8NMFj5PG8pkxOQ0AvkRMEX1lD7UO9b/eqUgYQ6OiJaCG8dInogCd++MVSUDpMMf4FF9dksRM/AOiFgIQ== dependencies: unified-lint-rule "^1.0.0" unist-util-generated "^1.1.0" unist-util-position "^3.0.0" unist-util-visit "^2.0.0" remark-lint-no-multiple-toplevel-headings@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/remark-lint-no-multiple-toplevel-headings/-/remark-lint-no-multiple-toplevel-headings-2.0.1.tgz#3ff2b505adf720f4ff2ad2b1021f8cfd50ad8635" integrity sha512-VKSItR6c+u3OsE5pUiSmNusERNyQS9Nnji26ezoQ1uvy06k3RypIjmzQqJ/hCkSiF+hoyC3ibtrrGT8gorzCmQ== dependencies: unified-lint-rule "^1.0.0" unist-util-generated "^1.1.0" unist-util-position "^3.0.0" unist-util-stringify-position "^2.0.0" unist-util-visit "^2.0.0" remark-lint-no-shell-dollars@^2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/remark-lint-no-shell-dollars/-/remark-lint-no-shell-dollars-2.0.2.tgz#b2c6c3ed95e5615f8e5f031c7d271a18dc17618e" integrity sha512-zhkHZOuyaD3r/TUUkkVqW0OxsR9fnSrAnHIF63nfJoAAUezPOu8D1NBsni6rX8H2DqGbPYkoeWrNsTwiKP0yow== dependencies: unified-lint-rule "^1.0.0" unist-util-generated "^1.1.0" unist-util-visit "^2.0.0" remark-lint-no-shortcut-reference-image@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/remark-lint-no-shortcut-reference-image/-/remark-lint-no-shortcut-reference-image-2.0.1.tgz#d174d12a57e8307caf6232f61a795bc1d64afeaa" integrity sha512-2jcZBdnN6ecP7u87gkOVFrvICLXIU5OsdWbo160FvS/2v3qqqwF2e/n/e7D9Jd+KTq1mR1gEVVuTqkWWuh3cig== dependencies: unified-lint-rule "^1.0.0" unist-util-generated "^1.1.0" unist-util-visit "^2.0.0" remark-lint-no-shortcut-reference-link@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/remark-lint-no-shortcut-reference-link/-/remark-lint-no-shortcut-reference-link-2.0.1.tgz#8f963f81036e45cfb7061b3639e9c6952308bc94" integrity sha512-pTZbslG412rrwwGQkIboA8wpBvcjmGFmvugIA+UQR+GfFysKtJ5OZMPGJ98/9CYWjw9Z5m0/EktplZ5TjFjqwA== dependencies: unified-lint-rule "^1.0.0" unist-util-generated "^1.1.0" unist-util-visit "^2.0.0" remark-lint-no-table-indentation@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/remark-lint-no-table-indentation/-/remark-lint-no-table-indentation-3.0.0.tgz#f3c3fc24375069ec8e510f43050600fb22436731" integrity sha512-+l7GovI6T+3LhnTtz/SmSRyOb6Fxy6tmaObKHrwb/GAebI/4MhFS1LVo3vbiP/RpPYtyQoFbbuXI55hqBG4ibQ== dependencies: unified-lint-rule "^1.0.0" unist-util-position "^3.0.0" unist-util-visit "^2.0.0" vfile-location "^3.0.0" remark-lint-no-tabs@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/remark-lint-no-tabs/-/remark-lint-no-tabs-2.0.1.tgz#abb30e6d61a6add664a1e26325ef9febc65c1528" integrity sha512-Fy5fMKNA8AsfhRtxyxBnHlGMpDDfns9VSSYv00RiC96qwRD82VhDRM3tYWZRBBxE+j71t6g47x9o/poGC7PThQ== dependencies: unified-lint-rule "^1.0.0" vfile-location "^3.0.0" remark-lint-no-undefined-references@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/remark-lint-no-undefined-references/-/remark-lint-no-undefined-references-3.0.0.tgz#59dab8f815f8de9f1dcbd69e7cc705978e931cb0" integrity sha512-0hzaJS9GuzSQVOeeNdJr/s66LRQOzp618xuOQPYWHcJdd+SCaRTyWbjMrTM/cCI5L1sYjgurp410NkIBQ32Vqg== dependencies: collapse-white-space "^1.0.4" unified-lint-rule "^1.0.0" unist-util-generated "^1.1.0" unist-util-position "^3.1.0" unist-util-visit "^2.0.0" vfile-location "^3.1.0" remark-lint-no-unused-definitions@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/remark-lint-no-unused-definitions/-/remark-lint-no-unused-definitions-2.0.1.tgz#ba45d9105b61b77ae02b92d3d339a638ab4ed59a" integrity sha512-+BMc0BOjc364SvKYLkspmxDch8OaKPbnUGgQBvK0Bmlwy42baR4C9zhwAWBxm0SBy5Z4AyM4G4jKpLXPH40Oxg== dependencies: unified-lint-rule "^1.0.0" unist-util-generated "^1.1.0" unist-util-visit "^2.0.0" remark-lint-ordered-list-marker-style@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/remark-lint-ordered-list-marker-style/-/remark-lint-ordered-list-marker-style-2.0.1.tgz#183c31967e6f2ae8ef00effad03633f7fd00ffaa" integrity sha512-Cnpw1Dn9CHn+wBjlyf4qhPciiJroFOEGmyfX008sQ8uGoPZsoBVIJx76usnHklojSONbpjEDcJCjnOvfAcWW1A== dependencies: unified-lint-rule "^1.0.0" unist-util-generated "^1.1.0" unist-util-position "^3.0.0" unist-util-visit "^2.0.0" remark-lint-ordered-list-marker-value@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/remark-lint-ordered-list-marker-value/-/remark-lint-ordered-list-marker-value-2.0.1.tgz#0de343de2efb41f01eae9f0f7e7d30fe43db5595" integrity sha512-blt9rS7OKxZ2NW8tqojELeyNEwPhhTJGVa+YpUkdEH+KnrdcD7Nzhnj6zfLWOx6jFNZk3jpq5nvLFAPteHaNKg== dependencies: unified-lint-rule "^1.0.0" unist-util-generated "^1.1.0" unist-util-position "^3.0.0" unist-util-visit "^2.0.0" remark-lint-rule-style@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/remark-lint-rule-style/-/remark-lint-rule-style-2.0.1.tgz#f59bd82e75d3eaabd0eee1c8c0f5513372eb553c" integrity sha512-hz4Ff9UdlYmtO6Czz99WJavCjqCer7Cav4VopXt+yVIikObw96G5bAuLYcVS7hvMUGqC9ZuM02/Y/iq9n8pkAg== dependencies: unified-lint-rule "^1.0.0" unist-util-generated "^1.1.0" unist-util-position "^3.0.0" unist-util-visit "^2.0.0" remark-lint-strong-marker@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/remark-lint-strong-marker/-/remark-lint-strong-marker-2.0.1.tgz#1ad8f190c6ac0f8138b638965ccf3bcd18f6d4e4" integrity sha512-8X2IsW1jZ5FmW9PLfQjkL0OVy/J3xdXLcZrG1GTeQKQ91BrPFyEZqUM2oM6Y4S6LGtxWer+neZkPZNroZoRPBQ== dependencies: unified-lint-rule "^1.0.0" unist-util-generated "^1.1.0" unist-util-position "^3.0.0" unist-util-visit "^2.0.0" remark-lint-table-cell-padding@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/remark-lint-table-cell-padding/-/remark-lint-table-cell-padding-3.0.0.tgz#a769ba1999984ff5f90294fb6ccb8aead7e8a12f" integrity sha512-sEKrbyFZPZpxI39R8/r+CwUrin9YtyRwVn0SQkNQEZWZcIpylK+bvoKIldvLIXQPob+ZxklL0GPVRzotQMwuWQ== dependencies: unified-lint-rule "^1.0.0" unist-util-generated "^1.1.0" unist-util-position "^3.0.0" unist-util-visit "^2.0.0" remark-lint-table-pipe-alignment@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/remark-lint-table-pipe-alignment/-/remark-lint-table-pipe-alignment-2.0.1.tgz#12b7e4c54473d69c9866cb33439c718d09cffcc5" integrity sha512-O89U7bp0ja6uQkT2uQrNB76GaPvFabrHiUGhqEUnld21yEdyj7rgS57kn84lZNSuuvN1Oor6bDyCwWQGzzpoOQ== dependencies: unified-lint-rule "^1.0.0" unist-util-generated "^1.1.0" unist-util-position "^3.0.0" unist-util-visit "^2.0.0" remark-lint-table-pipes@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/remark-lint-table-pipes/-/remark-lint-table-pipes-3.0.0.tgz#b30b055d594cae782667eec91c6c5b35928ab259" integrity sha512-QPokSazEdl0Y8ayUV9UB0Ggn3Jos/RAQwIo0z1KDGnJlGDiF80Jc6iU9RgDNUOjlpQffSLIfSVxH5VVYF/K3uQ== dependencies: unified-lint-rule "^1.0.0" unist-util-generated "^1.1.0" unist-util-position "^3.0.0" unist-util-visit "^2.0.0" remark-lint-unordered-list-marker-style@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/remark-lint-unordered-list-marker-style/-/remark-lint-unordered-list-marker-style-2.0.1.tgz#e64692aa9594dbe7e945ae76ab2218949cd92477" integrity sha512-8KIDJNDtgbymEvl3LkrXgdxPMTOndcux3BHhNGB2lU4UnxSpYeHsxcDgirbgU6dqCAfQfvMjPvfYk19QTF9WZA== dependencies: unified-lint-rule "^1.0.0" unist-util-generated "^1.1.0" unist-util-position "^3.0.0" unist-util-visit "^2.0.0" remark-lint@^8.0.0: version "8.0.0" resolved "https://registry.yarnpkg.com/remark-lint/-/remark-lint-8.0.0.tgz#6e40894f4a39eaea31fc4dd45abfaba948bf9a09" integrity sha512-ESI8qJQ/TIRjABDnqoFsTiZntu+FRifZ5fJ77yX63eIDijl/arvmDvT+tAf75/Nm5BFL4R2JFUtkHRGVjzYUsg== dependencies: remark-message-control "^6.0.0" remark-message-control@^6.0.0: version "6.0.0" resolved "https://registry.yarnpkg.com/remark-message-control/-/remark-message-control-6.0.0.tgz#955b054b38c197c9f2e35b1d88a4912949db7fc5" integrity sha512-k9bt7BYc3G7YBdmeAhvd3VavrPa/XlKWR3CyHjr4sLO9xJyly8WHHT3Sp+8HPR8lEUv+/sZaffL7IjMLV0f6BA== dependencies: mdast-comment-marker "^1.0.0" unified-message-control "^3.0.0" remark-parse@^10.0.0: version "10.0.1" resolved "https://registry.yarnpkg.com/remark-parse/-/remark-parse-10.0.1.tgz#6f60ae53edbf0cf38ea223fe643db64d112e0775" integrity sha512-1fUyHr2jLsVOkhbvPRBJ5zTKZZyD6yZzYaWCS6BPBdQ8vEMBCH+9zNCDA6tET/zHCi/jLqjCWtlJZUPk+DbnFw== dependencies: "@types/mdast" "^3.0.0" mdast-util-from-markdown "^1.0.0" unified "^10.0.0" remark-preset-github@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/remark-preset-github/-/remark-preset-github-4.0.1.tgz#146dc120d6c6e73116ad8e8fb5dec76a85ad5083" integrity sha512-2fwgL9484VA6WCc9EL3wNllo3VuP+FT84SZJncj4tAb7QsRUJwaDkh+3c6Htv19zSRfxCJ9PIikzyEuCrS7Gtw== dependencies: remark-comment-config "^6.0.0" remark-contributors "^5.0.1" remark-gfm "^1.0.0" remark-heading-gap "^4.0.0" remark-license niftylettuce/remark-license remark-lint-blockquote-indentation "^2.0.1" remark-lint-checkbox-character-style "^3.0.0" remark-lint-checkbox-content-indent "^3.0.0" remark-lint-code-block-style "^2.0.1" remark-lint-definition-case "^2.0.1" remark-lint-definition-spacing "^2.0.1" remark-lint-emphasis-marker "^2.0.1" remark-lint-fenced-code-flag "^2.0.1" remark-lint-fenced-code-marker "^2.0.1" remark-lint-file-extension "^1.0.5" remark-lint-final-definition "^2.1.0" remark-lint-first-heading-level "^2.0.1" remark-lint-heading-style "^2.0.1" remark-lint-list-item-indent "2.0.1" remark-lint-no-consecutive-blank-lines "^3.0.0" remark-lint-no-duplicate-definitions "^2.0.1" remark-lint-no-emphasis-as-heading "^2.0.1" remark-lint-no-file-name-articles "^1.0.5" remark-lint-no-file-name-consecutive-dashes "^1.0.5" remark-lint-no-file-name-irregular-characters "^1.0.5" remark-lint-no-file-name-mixed-case "^1.0.5" remark-lint-no-file-name-outer-dashes "^1.0.6" remark-lint-no-heading-content-indent "^3.0.0" remark-lint-no-heading-indent "^3.0.0" remark-lint-no-heading-punctuation "^2.0.1" remark-lint-no-missing-blank-lines "^2.0.1" remark-lint-no-multiple-toplevel-headings "^2.0.1" remark-lint-no-shell-dollars "^2.0.2" remark-lint-no-table-indentation "^3.0.0" remark-lint-no-tabs "^2.0.1" remark-lint-ordered-list-marker-value "^2.0.1" remark-lint-rule-style "^2.0.1" remark-lint-strong-marker "^2.0.1" remark-lint-table-cell-padding "^3.0.0" remark-lint-table-pipe-alignment "^2.0.1" remark-lint-table-pipes "^3.0.0" remark-lint-unordered-list-marker-style "^2.0.1" remark-preset-lint-recommended "^5.0.0" remark-retext "^4.0.0" remark-toc "^7.0.0" retext-english "^3.0.4" retext-preset-github "^0.0.6" unified "^9.2.0" remark-preset-lint-recommended@^5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/remark-preset-lint-recommended/-/remark-preset-lint-recommended-5.0.0.tgz#cc0da5bf532a47392e01ad2ee34c8076edad1207" integrity sha512-uu+Ab8JCwMMaKvvB0LOWTWtM3uAvJbKQM/oyWCEJqj7lUVNTKZS575Ro5rKM3Dx7kQjjR1iw0e99bpAYTc5xNA== dependencies: remark-lint "^8.0.0" remark-lint-final-newline "^1.0.0" remark-lint-hard-break-spaces "^2.0.0" remark-lint-list-item-bullet-indent "^3.0.0" remark-lint-list-item-indent "^2.0.0" remark-lint-no-auto-link-without-protocol "^2.0.0" remark-lint-no-blockquote-without-marker "^4.0.0" remark-lint-no-duplicate-definitions "^2.0.0" remark-lint-no-heading-content-indent "^3.0.0" remark-lint-no-inline-padding "^3.0.0" remark-lint-no-literal-urls "^2.0.0" remark-lint-no-shortcut-reference-image "^2.0.0" remark-lint-no-shortcut-reference-link "^2.0.0" remark-lint-no-undefined-references "^3.0.0" remark-lint-no-unused-definitions "^2.0.0" remark-lint-ordered-list-marker-style "^2.0.0" remark-retext@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/remark-retext/-/remark-retext-4.0.0.tgz#255ed98ac3e0a68da5c6ba4f172299b8d062bb28" integrity sha512-cYCchalpf25bTtfXF24ribYvqytPKq0TiEhqQDBHvVEEsApebwruPWP1cTcvTFBidmpXyqzycm+y8ng7Kmvc8Q== dependencies: mdast-util-to-nlcst "^4.0.0" remark-stringify@^10.0.0: version "10.0.2" resolved "https://registry.yarnpkg.com/remark-stringify/-/remark-stringify-10.0.2.tgz#50414a6983f5008eb9e72eed05f980582d1f69d7" integrity sha512-6wV3pvbPvHkbNnWB0wdDvVFHOe1hBRAx1Q/5g/EpH4RppAII6J8Gnwe7VbHuXaoKIF6LAg6ExTel/+kNqSQ7lw== dependencies: "@types/mdast" "^3.0.0" mdast-util-to-markdown "^1.0.0" unified "^10.0.0" remark-toc@^7.0.0: version "7.2.0" resolved "https://registry.yarnpkg.com/remark-toc/-/remark-toc-7.2.0.tgz#1c5159e9091826150db14c97ac00c2ad5a7f1523" integrity sha512-ppHepvpbg7j5kPFmU5rzDC4k2GTcPDvWcxXyr/7BZzO1cBSPk0stKtEJdsgAyw2WHKPGxadcHIZRjb2/sHxjkg== dependencies: "@types/unist" "^2.0.3" mdast-util-toc "^5.0.0" remark@^14.0.0: version "14.0.2" resolved "https://registry.yarnpkg.com/remark/-/remark-14.0.2.tgz#4a1833f7441a5c29e44b37bb1843fb820797b40f" integrity sha512-A3ARm2V4BgiRXaUo5K0dRvJ1lbogrbXnhkJRmD0yw092/Yl0kOCZt1k9ZeElEwkZsWGsMumz6qL5MfNJH9nOBA== dependencies: "@types/mdast" "^3.0.0" remark-parse "^10.0.0" remark-stringify "^10.0.0" unified "^10.0.0" remove-trailing-separator@^1.0.1: version "1.1.0" resolved "https://registry.yarnpkg.com/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz#c24bce2a283adad5bc3f58e0d48249b92379d8ef" integrity sha1-wkvOKig62tW8P1jg1IJJuSN52O8= repeat-element@^1.1.2: version "1.1.4" resolved "https://registry.yarnpkg.com/repeat-element/-/repeat-element-1.1.4.tgz#be681520847ab58c7568ac75fbfad28ed42d39e9" integrity sha512-LFiNfRcSu7KK3evMyYOuCzv3L10TW7yC1G2/+StMjK8Y6Vqd2MG7r/Qjw4ghtuCOjFvlnms/iMmLqpvW/ES/WQ== repeat-string@^1.0.0, repeat-string@^1.5.2, repeat-string@^1.6.1: version "1.6.1" resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637" integrity sha1-jcrkcOHIirwtYA//Sndihtp15jc= request@2.11.4: version "2.11.4" resolved "https://registry.yarnpkg.com/request/-/request-2.11.4.tgz#6347d7d44e52dc588108cc1ce5cee975fc8926de" integrity sha1-Y0fX1E5S3FiBCMwc5c7pdfyJJt4= dependencies: form-data "~0.0.3" mime "~1.2.7" request@~2.46.0: version "2.46.0" resolved "https://registry.yarnpkg.com/request/-/request-2.46.0.tgz#359195d52eaf720bc69742579d04ad6d265a8274" integrity sha1-NZGV1S6vcgvGl0JXnQStbSZagnQ= dependencies: aws-sign2 "~0.5.0" bl "~0.9.0" caseless "~0.6.0" forever-agent "~0.5.0" form-data "~0.1.0" hawk "1.1.1" http-signature "~0.10.0" json-stringify-safe "~5.0.0" mime-types "~1.0.1" node-uuid "~1.4.0" oauth-sign "~0.4.0" qs "~1.2.0" stringstream "~0.0.4" tough-cookie ">=0.12.0" tunnel-agent "~0.4.0" require-directory@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" integrity sha1-jGStX9MNqxyXbiNE/+f3kqam30I= require-main-filename@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-2.0.0.tgz#d0b329ecc7cc0f61649f62215be69af54aa8989b" integrity sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg== requires-port@0.x.x: version "0.0.1" resolved "https://registry.yarnpkg.com/requires-port/-/requires-port-0.0.1.tgz#4b4414411d9df7c855995dd899a8c78a2951c16d" integrity sha1-S0QUQR2d98hVmV3YmajHiilRwW0= resolve-from@5.0.0, resolve-from@^5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-5.0.0.tgz#c35225843df8f776df21c57557bc087e9dfdfc69" integrity sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw== resolve-from@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6" integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== resolve-global@1.0.0, resolve-global@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/resolve-global/-/resolve-global-1.0.0.tgz#a2a79df4af2ca3f49bf77ef9ddacd322dad19255" integrity sha512-zFa12V4OLtT5XUX/Q4VLvTfBf+Ok0SPc1FNGM/z9ctUdiU618qwKpWnd0CHs3+RqROfyEg/DhuHbMWYqcgljEw== dependencies: global-dirs "^0.1.1" resolve-url@^0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/resolve-url/-/resolve-url-0.2.1.tgz#2c637fe77c893afd2a663fe21aa9080068e2052a" integrity sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo= resolve@0.7.x: version "0.7.4" resolved "https://registry.yarnpkg.com/resolve/-/resolve-0.7.4.tgz#395a9ef9e873fbfe12bd14408bd91bb936003d69" integrity sha1-OVqe+ehz+/4SvRRAi9kbuTYAPWk= resolve@1.1.7, resolve@1.1.x: version "1.1.7" resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.1.7.tgz#203114d82ad2c5ed9e8e0411b3932875e889e97b" integrity sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs= resolve@^1.1.3, resolve@^1.1.4, resolve@^1.10.0, resolve@^1.10.1, resolve@^1.14.2, resolve@^1.17.0, resolve@^1.20.0, resolve@^1.4.0: version "1.21.0" resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.21.0.tgz#b51adc97f3472e6a5cf4444d34bc9d6b9037591f" integrity sha512-3wCbTpk5WJlyE4mSOtDLhqQmGFi0/TD9VPwmiolnk8U0wRgMEktqCXd3vy5buTO3tljvalNvKrjHEfrd2WpEKA== dependencies: is-core-module "^2.8.0" path-parse "^1.0.7" supports-preserve-symlinks-flag "^1.0.0" restore-cursor@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-3.1.0.tgz#39f67c54b3a7a58cea5236d95cf0034239631f7e" integrity sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA== dependencies: onetime "^5.1.0" signal-exit "^3.0.2" ret@~0.1.10: version "0.1.15" resolved "https://registry.yarnpkg.com/ret/-/ret-0.1.15.tgz#b8a4825d5bdb1fc3f6f53c2bc33f81388681c7bc" integrity sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg== retext-contractions@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/retext-contractions/-/retext-contractions-3.0.0.tgz#01fa2d0864340cf79bf4c86637c87dd4f9eab767" integrity sha512-Wn95agseXHTsoXvhavuTcnwUEb9TbL7QtnYkHeFMh8L53jdQbbooLX68cbpKyaaPbxYiomrgJpu7eB3arcr2rw== dependencies: nlcst-is-literal "^1.0.0" nlcst-to-string "^2.0.0" unist-util-visit "^1.1.0" retext-diacritics@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/retext-diacritics/-/retext-diacritics-2.0.0.tgz#db4f6da81d42acae34fb149500421dec1f26af78" integrity sha512-wr3mqJ9whlIG/q6vP601qR+/C7AMgc7O60kebs9kvN/HtTX7CpvFsKF68+yw86drMOMVCBJP8JB1Qlnj8CkY5A== dependencies: match-casing "^1.0.0" nlcst-search "^1.0.0" nlcst-to-string "^2.0.0" quotation "^1.0.1" unist-util-position "^3.0.0" retext-english@^3.0.4: version "3.0.4" resolved "https://registry.yarnpkg.com/retext-english/-/retext-english-3.0.4.tgz#f978828d51fbcee842bc3807a45b7f709822ea8d" integrity sha512-yr1PgaBDde+25aJXrnt3p1jvT8FVLVat2Bx8XeAWX13KXo8OT+3nWGU3HWxM4YFJvmfqvJYJZG2d7xxaO774gw== dependencies: parse-english "^4.0.0" unherit "^1.0.4" retext-indefinite-article@^1.1.7: version "1.1.7" resolved "https://registry.yarnpkg.com/retext-indefinite-article/-/retext-indefinite-article-1.1.7.tgz#a9de7cca8c24a11cb8fcd5c68e54d8e38e5ab525" integrity sha512-pqvEfEHL8uoeonbEjk8+d/hmyA3ozIeNTl4t3uurMcBpoIqN3+nbuMCFQrfDy2wjaKZ40KsLmEi+Zjv7m1ejLQ== dependencies: format "^0.2.2" nlcst-to-string "^2.0.0" number-to-words "^1.2.3" unist-util-is "^3.0.0" unist-util-visit "^1.1.0" retext-preset-github@^0.0.6: version "0.0.6" resolved "https://registry.yarnpkg.com/retext-preset-github/-/retext-preset-github-0.0.6.tgz#708f9d6d693d0e5913aa2b0354dd28f33a8bf092" integrity sha512-6YGaTBK7YJBYTrHOeorIqJUtm72/y1rWV0zKB8ba1Kb0gs57YigLaWjuKnRzULSmhP1i1uXUx2xcsEh6lwgNvw== dependencies: retext-contractions "^3.0.0" retext-diacritics "^2.0.0" retext-indefinite-article "^1.1.7" retext-quotes "^3.0.0" retext-redundant-acronyms "^2.0.0" retext-repeated-words "^2.0.0" retext-sentence-spacing "^3.0.0" retext-quotes@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/retext-quotes/-/retext-quotes-3.0.0.tgz#47f772e886b9b513dc6f1b97c482e15b1446b84a" integrity sha512-2htggeOFsrorhXrQvb4BI1O/r7CGVQZx/TysAT7wlVMsRUTZooiIGkBcLrcySa4sbqjsVgg1RjMy8K5O+gCQlg== dependencies: nlcst-to-string "^2.0.0" unist-util-is "^3.0.0" unist-util-visit "^1.1.0" retext-redundant-acronyms@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/retext-redundant-acronyms/-/retext-redundant-acronyms-2.0.0.tgz#e4fb92a97b0db76dfa20192e0d3915470458e80c" integrity sha512-9E62yXkDKYItNZO+lT4Pp0rAP8e/H7ppjYP681L0fk74xyItoE6okl0BMNVOa0W4XidLoGX2uWdlwWpCUeqQiw== dependencies: nlcst-normalize "^2.0.0" nlcst-search "^1.0.0" nlcst-to-string "^2.0.0" pluralize "^8.0.0" quotation "^1.0.0" unist-util-find-after "^2.0.0" unist-util-position "^3.0.0" retext-repeated-words@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/retext-repeated-words/-/retext-repeated-words-2.0.0.tgz#93e8f5b81b76388910b1453a0d9c527460e95637" integrity sha512-CGqM88ViAKtSgdWGObTU974AdmfxyiyB19MvuQTBBW3crWYIS7p21m0sJH/pCnp11gVa0YOU+vqdNaSvRiLTFA== dependencies: nlcst-to-string "^2.0.0" unist-util-is "^3.0.0" unist-util-visit "^1.1.0" retext-sentence-spacing@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/retext-sentence-spacing/-/retext-sentence-spacing-3.0.0.tgz#bfdfc4fc5990f816cc79a6caa335046878208300" integrity sha512-UWltTXZNh6kBwJJc0js3nOmbqze3LqhJg68jaRErNIPZQHtZ5hMn7h7f8kVY5OrbEL9XiY88m5DRPbFz16eTkQ== dependencies: nlcst-to-string "^2.0.0" unist-util-is "^3.0.0" unist-util-visit "^1.1.0" reusify@^1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76" integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw== rfdc@^1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/rfdc/-/rfdc-1.3.0.tgz#d0b7c441ab2720d05dc4cf26e01c89631d9da08b" integrity sha512-V2hovdzFbOi77/WajaSMXk2OLm+xNIeQdMMuB7icj7bk6zi2F8GGAxigcnDFpJHbNyNcgyJDiP+8nOrY5cZGrA== rimraf@^3.0.0, rimraf@^3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a" integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA== dependencies: glob "^7.1.3" rimraf@~2.2.0, rimraf@~2.2.2: version "2.2.8" resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.2.8.tgz#e439be2aaee327321952730f99a8929e4fc50582" integrity sha1-5Dm+Kq7jJzIZUnMPmaiSnk/FBYI= ripemd160@^2.0.0, ripemd160@^2.0.1: version "2.0.2" resolved "https://registry.yarnpkg.com/ripemd160/-/ripemd160-2.0.2.tgz#a1c1a6f624751577ba5d07914cbc92850585890c" integrity sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA== dependencies: hash-base "^3.0.0" inherits "^2.0.1" run-parallel@^1.1.9: version "1.2.0" resolved "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.2.0.tgz#66d1368da7bdf921eb9d95bd1a9229e7f21a43ee" integrity sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA== dependencies: queue-microtask "^1.2.2" runnel@~0.5.0: version "0.5.3" resolved "https://registry.yarnpkg.com/runnel/-/runnel-0.5.3.tgz#f9362b165a05fc6f5e46e458f77a1f7ecdc0daec" integrity sha1-+TYrFloF/G9eRuRY93offs3A2uw= rxjs@^7.5.1: version "7.5.1" resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-7.5.1.tgz#af73df343cbcab37628197f43ea0c8256f54b157" integrity sha512-KExVEeZWxMZnZhUZtsJcFwz8IvPvgu4G2Z2QyqjZQzUGr32KDYuSxrEYO4w3tFFNbfLozcrKUTvTPi+E9ywJkQ== dependencies: tslib "^2.1.0" sade@^1.7.3: version "1.8.1" resolved "https://registry.yarnpkg.com/sade/-/sade-1.8.1.tgz#0a78e81d658d394887be57d2a409bf703a3b2701" integrity sha512-xal3CZX1Xlo/k4ApwCFrHVACi9fBqJ7V+mwhBsuf/1IOKbBy098Fex+Wa/5QMubw09pSZ/u8EY8PWgevJsXp1A== dependencies: mri "^1.1.0" safe-buffer@5.2.1, safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1, safe-buffer@^5.1.2, safe-buffer@^5.2.0, safe-buffer@~5.2.0: version "5.2.1" resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== safe-buffer@~5.1.0, safe-buffer@~5.1.1: version "5.1.2" resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== safe-regex@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/safe-regex/-/safe-regex-1.1.0.tgz#40a3669f3b077d1e943d44629e157dd48023bf2e" integrity sha1-QKNmnzsHfR6UPURinhV91IAjvy4= dependencies: ret "~0.1.10" safe-regex@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/safe-regex/-/safe-regex-2.1.1.tgz#f7128f00d056e2fe5c11e81a1324dd974aadced2" integrity sha512-rx+x8AMzKb5Q5lQ95Zoi6ZbJqwCLkqi3XuJXp5P3rT8OEc6sZCJG5AE5dU3lsgRr/F4Bs31jSlVN+j5KrsGu9A== dependencies: regexp-tree "~0.1.1" "safer-buffer@>= 2.1.2 < 3", safer-buffer@^2.1.0: version "2.1.2" resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== sax@>=0.6.0: version "1.2.4" resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9" integrity sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw== scope-analyzer@^2.0.0: version "2.1.2" resolved "https://registry.yarnpkg.com/scope-analyzer/-/scope-analyzer-2.1.2.tgz#b958162feb59823c2835c7b0229187a97c77e9cd" integrity sha512-5cfCmsTYV/wPaRIItNxatw02ua/MThdIUNnUOCYp+3LSEJvnG804ANw2VLaavNILIfWXF1D1G2KNANkBBvInwQ== dependencies: array-from "^2.1.1" dash-ast "^2.0.1" es6-map "^0.1.5" es6-set "^0.1.5" es6-symbol "^3.1.1" estree-is-function "^1.0.0" get-assigned-identifiers "^1.1.0" "semver@2 || 3 || 4 || 5", semver@^5.6.0, semver@^5.7.0, semver@^5.7.1: version "5.7.1" resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7" integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== semver@7.0.0: version "7.0.0" resolved "https://registry.yarnpkg.com/semver/-/semver-7.0.0.tgz#5f3ca35761e47e05b206c6daff2cf814f0316b8e" integrity sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A== semver@7.3.5, semver@^7.0.0, semver@^7.2.1, semver@^7.3.4, semver@^7.3.5: version "7.3.5" resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.5.tgz#0b621c879348d8998e4b0e4be94b3f12e6018ef7" integrity sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ== dependencies: lru-cache "^6.0.0" semver@^6.0.0, semver@^6.1.0, semver@^6.1.1, semver@^6.1.2, semver@^6.3.0: version "6.3.0" resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== send@0.1.4: version "0.1.4" resolved "https://registry.yarnpkg.com/send/-/send-0.1.4.tgz#be70d8d1be01de61821af13780b50345a4f71abd" integrity sha1-vnDY0b4B3mGCGvE3gLUDRaT3Gr0= dependencies: debug "*" fresh "0.2.0" mime "~1.2.9" range-parser "0.0.4" send@0.17.2: version "0.17.2" resolved "https://registry.yarnpkg.com/send/-/send-0.17.2.tgz#926622f76601c41808012c8bf1688fe3906f7820" integrity sha512-UJYB6wFSJE3G00nEivR5rgWp8c2xXvJ3OPWPhmuteU0IKj8nKbG3DrjiOmLwpnHGYWAVwA69zmTm++YG0Hmwww== dependencies: debug "2.6.9" depd "~1.1.2" destroy "~1.0.4" encodeurl "~1.0.2" escape-html "~1.0.3" etag "~1.8.1" fresh "0.5.2" http-errors "1.8.1" mime "1.6.0" ms "2.1.3" on-finished "~2.3.0" range-parser "~1.2.1" statuses "~1.5.0" sequence@2.x: version "2.2.1" resolved "https://registry.yarnpkg.com/sequence/-/sequence-2.2.1.tgz#7f5617895d44351c0a047e764467690490a16b03" integrity sha1-f1YXiV1ENRwKBH52RGdpBJChawM= serve-static@1.14.2: version "1.14.2" resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.14.2.tgz#722d6294b1d62626d41b43a013ece4598d292bfa" integrity sha512-+TMNA9AFxUEGuC0z2mevogSnn9MXKb4fa7ngeRMJaaGv8vTwnIEkKi+QGvPt33HSnf8pRS+WGM0EbMtCJLKMBQ== dependencies: encodeurl "~1.0.2" escape-html "~1.0.3" parseurl "~1.3.3" send "0.17.2" set-blocking@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" integrity sha1-BF+XgtARrppoA93TgrJDkrPYkPc= set-value@^2.0.0, set-value@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/set-value/-/set-value-2.0.1.tgz#a18d40530e6f07de4228c7defe4227af8cad005b" integrity sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw== dependencies: extend-shallow "^2.0.1" is-extendable "^0.1.1" is-plain-object "^2.0.3" split-string "^3.0.1" setprototypeof@1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.2.0.tgz#66c9a24a73f9fc28cbe66b09fed3d33dcaf1b424" integrity sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw== sha.js@^2.4.0, sha.js@^2.4.8, sha.js@~2.4.4: version "2.4.11" resolved "https://registry.yarnpkg.com/sha.js/-/sha.js-2.4.11.tgz#37a5cf0b81ecbc6943de109ba2960d1b26584ae7" integrity sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ== dependencies: inherits "^2.0.1" safe-buffer "^5.0.1" shallow-copy@0.0.1: version "0.0.1" resolved "https://registry.yarnpkg.com/shallow-copy/-/shallow-copy-0.0.1.tgz#415f42702d73d810330292cc5ee86eae1a11a170" integrity sha1-QV9CcC1z2BAzApLMXuhurhoRoXA= shasum-object@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/shasum-object/-/shasum-object-1.0.0.tgz#0b7b74ff5b66ecf9035475522fa05090ac47e29e" integrity sha512-Iqo5rp/3xVi6M4YheapzZhhGPVs0yZwHj7wvwQ1B9z8H6zk+FEnI7y3Teq7qwnekfEhu8WmG2z0z4iWZaxLWVg== dependencies: fast-safe-stringify "^2.0.7" shasum@^1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/shasum/-/shasum-1.0.2.tgz#e7012310d8f417f4deb5712150e5678b87ae565f" integrity sha1-5wEjENj0F/TetXEhUOVni4euVl8= dependencies: json-stable-stringify "~0.0.0" sha.js "~2.4.4" shebang-command@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea" integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA== dependencies: shebang-regex "^3.0.0" shebang-regex@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== shell-quote@1.4.1: version "1.4.1" resolved "https://registry.yarnpkg.com/shell-quote/-/shell-quote-1.4.1.tgz#ae18442b536a08c720239b079d2f228acbedee40" integrity sha1-rhhEK1NqCMcgI5sHnS8iisvt7kA= dependencies: array-filter "~0.0.0" array-map "~0.0.0" array-reduce "~0.0.0" jsonify "~0.0.0" shell-quote@^1.4.2, shell-quote@^1.4.3, shell-quote@^1.6.1: version "1.7.3" resolved "https://registry.yarnpkg.com/shell-quote/-/shell-quote-1.7.3.tgz#aa40edac170445b9a431e17bb62c0b881b9c4123" integrity sha512-Vpfqwm4EnqGdlsBFNmHhxhElJYrdfcxPThu+ryKS5J8L/fhAwLazFZtq+S+TWZ9ANj2piSQLGj6NQg+lKPmxrw== should-equal@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/should-equal/-/should-equal-2.0.0.tgz#6072cf83047360867e68e98b09d71143d04ee0c3" integrity sha512-ZP36TMrK9euEuWQYBig9W55WPC7uo37qzAEmbjHz4gfyuXrEUgF8cUvQVO+w+d3OMfPvSRQJ22lSm8MQJ43LTA== dependencies: should-type "^1.4.0" should-format@^3.0.3: version "3.0.3" resolved "https://registry.yarnpkg.com/should-format/-/should-format-3.0.3.tgz#9bfc8f74fa39205c53d38c34d717303e277124f1" integrity sha1-m/yPdPo5IFxT04w01xcwPidxJPE= dependencies: should-type "^1.3.0" should-type-adaptors "^1.0.1" should-http@^0.1.1: version "0.1.1" resolved "https://registry.yarnpkg.com/should-http/-/should-http-0.1.1.tgz#9b793843f4024885781eb6abacc4030e1e9f21f0" integrity sha1-m3k4Q/QCSIV4HrarrMQDDh6fIfA= dependencies: content-type "^1.0.2" should-type-adaptors@^1.0.1: version "1.1.0" resolved "https://registry.yarnpkg.com/should-type-adaptors/-/should-type-adaptors-1.1.0.tgz#401e7f33b5533033944d5cd8bf2b65027792e27a" integrity sha512-JA4hdoLnN+kebEp2Vs8eBe9g7uy0zbRo+RMcU0EsNy+R+k049Ki+N5tT5Jagst2g7EAja+euFuoXFCa8vIklfA== dependencies: should-type "^1.3.0" should-util "^1.0.0" should-type@^1.3.0, should-type@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/should-type/-/should-type-1.4.0.tgz#0756d8ce846dfd09843a6947719dfa0d4cff5cf3" integrity sha1-B1bYzoRt/QmEOmlHcZ36DUz/XPM= should-util@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/should-util/-/should-util-1.0.1.tgz#fb0d71338f532a3a149213639e2d32cbea8bcb28" integrity sha512-oXF8tfxx5cDk8r2kYqlkUJzZpDBqVY/II2WhvU0n9Y3XYvAYRmeaf1PvvIvTgPnv4KJ+ES5M0PyDq5Jp+Ygy2g== should@^13.2.3: version "13.2.3" resolved "https://registry.yarnpkg.com/should/-/should-13.2.3.tgz#96d8e5acf3e97b49d89b51feaa5ae8d07ef58f10" integrity sha512-ggLesLtu2xp+ZxI+ysJTmNjh2U0TsC+rQ/pfED9bUZZ4DKefP27D+7YJVVTvKsmjLpIi9jAa7itwDGkDDmt1GQ== dependencies: should-equal "^2.0.0" should-format "^3.0.3" should-type "^1.4.0" should-type-adaptors "^1.0.1" should-util "^1.0.0" side-channel@^1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.0.4.tgz#efce5c8fdc104ee751b25c58d4290011fa5ea2cf" integrity sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw== dependencies: call-bind "^1.0.0" get-intrinsic "^1.0.2" object-inspect "^1.9.0" sigmund@~1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/sigmund/-/sigmund-1.0.1.tgz#3ff21f198cad2175f9f3b781853fd94d0d19b590" integrity sha1-P/IfGYytIXX587eBhT/ZTQ0ZtZA= signal-exit@^3.0.2, signal-exit@^3.0.3: version "3.0.6" resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.6.tgz#24e630c4b0f03fea446a2bd299e62b4a6ca8d0af" integrity sha512-sDl4qMFpijcGw22U5w63KmD3cZJfBuFlVNbVMKje2keoKML7X2UzWbc4XrmEbDwg0NXJc3yv4/ox7b+JWb57kQ== simple-concat@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/simple-concat/-/simple-concat-1.0.1.tgz#f46976082ba35c2263f1c8ab5edfe26c41c9552f" integrity sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q== slash@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/slash/-/slash-2.0.0.tgz#de552851a1759df3a8f206535442f5ec4ddeab44" integrity sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A== slash@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634" integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q== slash@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/slash/-/slash-4.0.0.tgz#2422372176c4c6c5addb5e2ada885af984b396a7" integrity sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew== slice-ansi@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-3.0.0.tgz#31ddc10930a1b7e0b67b08c96c2f49b77a789787" integrity sha512-pSyv7bSTC7ig9Dcgbw9AuRNUb5k5V6oDudjZoMBSr13qpLBG7tB+zgCkARjq7xIUgdz5P1Qe8u+rSGdouOOIyQ== dependencies: ansi-styles "^4.0.0" astral-regex "^2.0.0" is-fullwidth-code-point "^3.0.0" slice-ansi@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-4.0.0.tgz#500e8dd0fd55b05815086255b3195adf2a45fe6b" integrity sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ== dependencies: ansi-styles "^4.0.0" astral-regex "^2.0.0" is-fullwidth-code-point "^3.0.0" slice-ansi@^5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-5.0.0.tgz#b73063c57aa96f9cd881654b15294d95d285c42a" integrity sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ== dependencies: ansi-styles "^6.0.0" is-fullwidth-code-point "^4.0.0" sliced@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/sliced/-/sliced-1.0.1.tgz#0b3a662b5d04c3177b1926bea82b03f837a2ef41" integrity sha1-CzpmK10Ewxd7GSa+qCsD+Dei70E= snapdragon-node@^2.0.1: version "2.1.1" resolved "https://registry.yarnpkg.com/snapdragon-node/-/snapdragon-node-2.1.1.tgz#6c175f86ff14bdb0724563e8f3c1b021a286853b" integrity sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw== dependencies: define-property "^1.0.0" isobject "^3.0.0" snapdragon-util "^3.0.1" snapdragon-util@^3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/snapdragon-util/-/snapdragon-util-3.0.1.tgz#f956479486f2acd79700693f6f7b805e45ab56e2" integrity sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ== dependencies: kind-of "^3.2.0" snapdragon@^0.8.1: version "0.8.2" resolved "https://registry.yarnpkg.com/snapdragon/-/snapdragon-0.8.2.tgz#64922e7c565b0e14204ba1aa7d6964278d25182d" integrity sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg== dependencies: base "^0.11.1" debug "^2.2.0" define-property "^0.2.5" extend-shallow "^2.0.1" map-cache "^0.2.2" source-map "^0.5.6" source-map-resolve "^0.5.0" use "^3.1.0" sntp@0.2.x: version "0.2.4" resolved "https://registry.yarnpkg.com/sntp/-/sntp-0.2.4.tgz#fb885f18b0f3aad189f824862536bceeec750900" integrity sha1-+4hfGLDzqtGJ+CSGJTa87ux1CQA= dependencies: hoek "0.9.x" source-map-cjs@~0.1.31: version "0.1.32" resolved "https://registry.yarnpkg.com/source-map-cjs/-/source-map-cjs-0.1.32.tgz#b113f00065b484f4d3a1123ef084046a56228ce7" integrity sha1-sRPwAGW0hPTToRI+8IQEalYijOc= source-map-resolve@^0.5.0: version "0.5.3" resolved "https://registry.yarnpkg.com/source-map-resolve/-/source-map-resolve-0.5.3.tgz#190866bece7553e1f8f267a2ee82c606b5509a1a" integrity sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw== dependencies: atob "^2.1.2" decode-uri-component "^0.2.0" resolve-url "^0.2.1" source-map-url "^0.4.0" urix "^0.1.0" source-map-support@^0.5.17, source-map-support@~0.5.10, source-map-support@~0.5.12: version "0.5.21" resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.21.tgz#04fe7c7f9e1ed2d662233c28cb2b35b9f63f6e4f" integrity sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w== dependencies: buffer-from "^1.0.0" source-map "^0.6.0" source-map-url@^0.4.0: version "0.4.1" resolved "https://registry.yarnpkg.com/source-map-url/-/source-map-url-0.4.1.tgz#0af66605a745a5a2f91cf1bbf8a7afbc283dec56" integrity sha512-cPiFOTLUKvJFIg4SKVScy4ilPPW6rFgMgfuZJPNoDuMs3nC1HbMUycBoJw77xFIp6z1UJQJOfx6C9GMH80DiTw== source-map@0.5.6: version "0.5.6" resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.6.tgz#75ce38f52bf0733c5a7f0c118d81334a2bb5f412" integrity sha1-dc449SvwczxafwwRjYEzSiu19BI= source-map@^0.1.34, source-map@~0.1.33, source-map@~0.1.7: version "0.1.43" resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.1.43.tgz#c24bc146ca517c1471f5dacbe2571b2b7f9e3346" integrity sha1-wkvBRspRfBRx9drL4lcbK3+eM0Y= dependencies: amdefine ">=0.0.4" source-map@^0.5.0, source-map@^0.5.6, source-map@~0.5.3: version "0.5.7" resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" integrity sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w= source-map@^0.6.0, source-map@^0.6.1, source-map@~0.6.1: version "0.6.1" resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== source-map@~0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.2.0.tgz#dab73fbcfc2ba819b4de03bd6f6eaa48164b3f9d" integrity sha1-2rc/vPwrqBm03gO9b26qSBZLP50= dependencies: amdefine ">=0.0.4" sourcemap-codec@^1.4.1: version "1.4.8" resolved "https://registry.yarnpkg.com/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz#ea804bd94857402e6992d05a38ef1ae35a9ab4c4" integrity sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA== spawn-wrap@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/spawn-wrap/-/spawn-wrap-2.0.0.tgz#103685b8b8f9b79771318827aa78650a610d457e" integrity sha512-EeajNjfN9zMnULLwhZZQU3GWBoFNkbngTUPfaawT4RkMiviTxcX0qfhVbGey39mfctfDHkWtuecgQ8NJcyQWHg== dependencies: foreground-child "^2.0.0" is-windows "^1.0.2" make-dir "^3.0.0" rimraf "^3.0.0" signal-exit "^3.0.2" which "^2.0.1" spdx-correct@^3.0.0: version "3.1.1" resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-3.1.1.tgz#dece81ac9c1e6713e5f7d1b6f17d468fa53d89a9" integrity sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w== dependencies: spdx-expression-parse "^3.0.0" spdx-license-ids "^3.0.0" spdx-exceptions@^2.1.0: version "2.3.0" resolved "https://registry.yarnpkg.com/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz#3f28ce1a77a00372683eade4a433183527a2163d" integrity sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A== spdx-expression-parse@^3.0.0: version "3.0.1" resolved "https://registry.yarnpkg.com/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz#cf70f50482eefdc98e3ce0a6833e4a53ceeba679" integrity sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q== dependencies: spdx-exceptions "^2.1.0" spdx-license-ids "^3.0.0" spdx-license-ids@^3.0.0: version "3.0.11" resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.11.tgz#50c0d8c40a14ec1bf449bae69a0ea4685a9d9f95" integrity sha512-Ctl2BrFiM0X3MANYgj3CkygxhRmr9mi6xhejbdO960nF6EDJApTYpn0BQnDKlnNBULKiCN1n3w9EBkHK8ZWg+g== spdx-license-list@^3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/spdx-license-list/-/spdx-license-list-3.0.1.tgz#163d72123e00f4f8bd6e18125696b009f1248ff5" integrity sha1-Fj1yEj4A9Pi9bhgSVpawCfEkj/U= split-string@^3.0.1, split-string@^3.0.2: version "3.1.0" resolved "https://registry.yarnpkg.com/split-string/-/split-string-3.1.0.tgz#7cb09dda3a86585705c64b39a6466038682e8fe2" integrity sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw== dependencies: extend-shallow "^3.0.0" split2@^3.0.0: version "3.2.2" resolved "https://registry.yarnpkg.com/split2/-/split2-3.2.2.tgz#bf2cf2a37d838312c249c89206fd7a17dd12365f" integrity sha512-9NThjpgZnifTkJpzTZ7Eue85S49QwpNhZTq6GRJwObb6jnLFNGB7Qm73V5HewTROPyxD0C29xqmaI68bQtV+hg== dependencies: readable-stream "^3.0.0" split@~0.1.2: version "0.1.2" resolved "https://registry.yarnpkg.com/split/-/split-0.1.2.tgz#f0710744c453d551fc7143ead983da6014e336cc" integrity sha1-8HEHRMRT1VH8cUPq2YPaYBTjNsw= dependencies: through "1" sprintf-js@~1.0.2: version "1.0.3" resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" integrity sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw= stack-generator@^1.0.7: version "1.1.0" resolved "https://registry.yarnpkg.com/stack-generator/-/stack-generator-1.1.0.tgz#36f6a920751a6c10f499a13c32cbb5f51a0b8b25" integrity sha1-NvapIHUabBD0maE8Msu19RoLiyU= dependencies: stackframe "^1.0.2" stack-mapper@0.2.2: version "0.2.2" resolved "https://registry.yarnpkg.com/stack-mapper/-/stack-mapper-0.2.2.tgz#789029054937b7d47c1b5b67612cbb1e7cfe7071" integrity sha1-eJApBUk3t9R8G1tnYSy7Hnz+cHE= dependencies: array-map "0.0.0" foreach-shim "~0.1.1" isarray "0.0.1" source-map-cjs "~0.1.31" stackframe@^0.3.1, stackframe@~0.3: version "0.3.1" resolved "https://registry.yarnpkg.com/stackframe/-/stackframe-0.3.1.tgz#33aa84f1177a5548c8935533cbfeb3420975f5a4" integrity sha1-M6qE8Rd6VUjIk1Uzy/6zQgl19aQ= stackframe@^1.0.2: version "1.2.0" resolved "https://registry.yarnpkg.com/stackframe/-/stackframe-1.2.0.tgz#52429492d63c62eb989804c11552e3d22e779303" integrity sha512-GrdeshiRmS1YLMYgzF16olf2jJ/IzxXY9lhKOskuVziubpTYcYqyOwYeJKzQkwy7uN0fYSsbsC4RQaXf9LCrYA== stacktrace-gps@^2.4.3: version "2.4.4" resolved "https://registry.yarnpkg.com/stacktrace-gps/-/stacktrace-gps-2.4.4.tgz#69c827e9d6d6f41cf438d7f195e2e3cbfcf28c44" integrity sha1-acgn6dbW9Bz0ONfxleLjy/zyjEQ= dependencies: source-map "0.5.6" stackframe "~0.3" stacktrace-js@1.3.1: version "1.3.1" resolved "https://registry.yarnpkg.com/stacktrace-js/-/stacktrace-js-1.3.1.tgz#67cab2589af5c417b962f7369940277bb3b6a18b" integrity sha1-Z8qyWJr1xBe5Yvc2mUAne7O2oYs= dependencies: error-stack-parser "^1.3.6" stack-generator "^1.0.7" stacktrace-gps "^2.4.3" static-extend@^0.1.1: version "0.1.2" resolved "https://registry.yarnpkg.com/static-extend/-/static-extend-0.1.2.tgz#60809c39cbff55337226fd5e0b520f341f1fb5c6" integrity sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY= dependencies: define-property "^0.2.5" object-copy "^0.1.0" "statuses@>= 1.5.0 < 2", statuses@~1.5.0: version "1.5.0" resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.5.0.tgz#161c7dac177659fd9811f43771fa99381478628c" integrity sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow= stream-browserify@^2.0.0: version "2.0.2" resolved "https://registry.yarnpkg.com/stream-browserify/-/stream-browserify-2.0.2.tgz#87521d38a44aa7ee91ce1cd2a47df0cb49dd660b" integrity sha512-nX6hmklHs/gr2FuxYDltq8fJA1GDlxKQCz8O/IM4atRqBH8OORmBNgfvW5gG10GT/qQ9u0CzIvr2X5Pkt6ntqg== dependencies: inherits "~2.0.1" readable-stream "^2.0.2" stream-browserify@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/stream-browserify/-/stream-browserify-3.0.0.tgz#22b0a2850cdf6503e73085da1fc7b7d0c2122f2f" integrity sha512-H73RAHsVBapbim0tU2JwwOiXUj+fikfiaoYAKHF3VJfA0pe2BCzkhAHBlLG6REzE+2WNZcxOXjK7lkso+9euLA== dependencies: inherits "~2.0.4" readable-stream "^3.5.0" stream-combiner2@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/stream-combiner2/-/stream-combiner2-1.1.1.tgz#fb4d8a1420ea362764e21ad4780397bebcb41cbe" integrity sha1-+02KFCDqNidk4hrUeAOXvry0HL4= dependencies: duplexer2 "~0.1.0" readable-stream "^2.0.2" stream-combiner@^0.2.2: version "0.2.2" resolved "https://registry.yarnpkg.com/stream-combiner/-/stream-combiner-0.2.2.tgz#aec8cbac177b56b6f4fa479ced8c1912cee52858" integrity sha1-rsjLrBd7Vrb0+kec7YwZEs7lKFg= dependencies: duplexer "~0.1.1" through "~2.3.4" stream-counter@~0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/stream-counter/-/stream-counter-0.2.0.tgz#ded266556319c8b0e222812b9cf3b26fa7d947de" integrity sha1-3tJmVWMZyLDiIoErnPOyb6fZR94= dependencies: readable-stream "~1.1.8" stream-events@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/stream-events/-/stream-events-1.0.5.tgz#bbc898ec4df33a4902d892333d47da9bf1c406d5" integrity sha512-E1GUzBSgvct8Jsb3v2X15pjzN1tYebtbLaMg+eBOUOAxgbLoSbT2NS91ckc5lJD1KfLjId+jXJRgo0qnV5Nerg== dependencies: stubs "^3.0.0" stream-http@^2.0.0: version "2.8.3" resolved "https://registry.yarnpkg.com/stream-http/-/stream-http-2.8.3.tgz#b2d242469288a5a27ec4fe8933acf623de6514fc" integrity sha512-+TSkfINHDo4J+ZobQLWiMouQYB+UVYFttRA94FpEzzJ7ZdqcL4uUUQ7WkdkI4DSozGmgBUE/a47L+38PenXhUw== dependencies: builtin-status-codes "^3.0.0" inherits "^2.0.1" readable-stream "^2.3.6" to-arraybuffer "^1.0.0" xtend "^4.0.0" stream-http@^3.0.0: version "3.2.0" resolved "https://registry.yarnpkg.com/stream-http/-/stream-http-3.2.0.tgz#1872dfcf24cb15752677e40e5c3f9cc1926028b5" integrity sha512-Oq1bLqisTyK3TSCXpPbT4sdeYNdmyZJv1LxpEm2vu1ZhK89kSE5YXwZc3cWk0MagGaKriBh9mCFbVGtO+vY29A== dependencies: builtin-status-codes "^3.0.0" inherits "^2.0.4" readable-stream "^3.6.0" xtend "^4.0.2" stream-shift@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/stream-shift/-/stream-shift-1.0.1.tgz#d7088281559ab2778424279b0877da3c392d5a3d" integrity sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ== stream-splicer@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/stream-splicer/-/stream-splicer-2.0.1.tgz#0b13b7ee2b5ac7e0609a7463d83899589a363fcd" integrity sha512-Xizh4/NPuYSyAXyT7g8IvdJ9HJpxIGL9PjyhtywCZvvP0OPIdqyrr4dMikeuvY8xahpdKEBlBTySe583totajg== dependencies: inherits "^2.0.1" readable-stream "^2.0.2" streamsearch@0.1.2: version "0.1.2" resolved "https://registry.yarnpkg.com/streamsearch/-/streamsearch-0.1.2.tgz#808b9d0e56fc273d809ba57338e929919a1a9f1a" integrity sha1-gIudDlb8Jz2Am6VzOOkpkZoanxo= string-argv@^0.3.1: version "0.3.1" resolved "https://registry.yarnpkg.com/string-argv/-/string-argv-0.3.1.tgz#95e2fbec0427ae19184935f816d74aaa4c5c19da" integrity sha512-a1uQGz7IyVy9YwhqjZIZu1c8JO8dNIe20xBmSS6qu9kv++k3JGzCVmprbNN5Kn+BgzD5E7YYwg1CcjuJMRNsvg== "string-width@^1.0.2 || 2": version "2.1.1" resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.1.1.tgz#ab93f27a8dc13d28cac815c462143a6d9012ae9e" integrity sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw== dependencies: is-fullwidth-code-point "^2.0.0" strip-ansi "^4.0.0" string-width@^3.0.0, string-width@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/string-width/-/string-width-3.1.0.tgz#22767be21b62af1081574306f69ac51b62203961" integrity sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w== dependencies: emoji-regex "^7.0.1" is-fullwidth-code-point "^2.0.0" strip-ansi "^5.1.0" string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: version "4.2.3" resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== dependencies: emoji-regex "^8.0.0" is-fullwidth-code-point "^3.0.0" strip-ansi "^6.0.1" string-width@^5.0.0: version "5.0.1" resolved "https://registry.yarnpkg.com/string-width/-/string-width-5.0.1.tgz#0d8158335a6cfd8eb95da9b6b262ce314a036ffd" integrity sha512-5ohWO/M4//8lErlUUtrFy3b11GtNOuMOU0ysKCDXFcfXuuvUXu95akgj/i8ofmaGdN0hCqyl6uu9i8dS/mQp5g== dependencies: emoji-regex "^9.2.2" is-fullwidth-code-point "^4.0.0" strip-ansi "^7.0.1" string.prototype.trimend@^1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.4.tgz#e75ae90c2942c63504686c18b287b4a0b1a45f80" integrity sha512-y9xCjw1P23Awk8EvTpcyL2NIr1j7wJ39f+k6lvRnSMz+mz9CGz9NYPelDk42kOz6+ql8xjfK8oYzy3jAP5QU5A== dependencies: call-bind "^1.0.2" define-properties "^1.1.3" string.prototype.trimstart@^1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.4.tgz#b36399af4ab2999b4c9c648bd7a3fb2bb26feeed" integrity sha512-jh6e984OBfvxS50tdY2nRZnoC5/mLFKOREQfw8t5yytkoUsJRNxvI/E39qu1sD0OtWI3OC0XgKSmcWwziwYuZw== dependencies: call-bind "^1.0.2" define-properties "^1.1.3" string_decoder@^1.1.1: version "1.3.0" resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e" integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA== dependencies: safe-buffer "~5.2.0" string_decoder@~0.10.0, string_decoder@~0.10.x: version "0.10.31" resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-0.10.31.tgz#62e203bc41766c6c28c9fc84301dab1c5310fa94" integrity sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ= string_decoder@~1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8" integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg== dependencies: safe-buffer "~5.1.0" stringstream@~0.0.4: version "0.0.6" resolved "https://registry.yarnpkg.com/stringstream/-/stringstream-0.0.6.tgz#7880225b0d4ad10e30927d167a1d6f2fd3b33a72" integrity sha512-87GEBAkegbBcweToUrdzf3eLhWNg06FJTebl4BVJz/JgWy8CvEr9dRtX5qWphiynMSQlxxi+QqN0z5T32SLlhA== strip-ansi@^3.0.0: version "3.0.1" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf" integrity sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8= dependencies: ansi-regex "^2.0.0" strip-ansi@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-4.0.0.tgz#a8479022eb1ac368a871389b635262c505ee368f" integrity sha1-qEeQIusaw2iocTibY1JixQXuNo8= dependencies: ansi-regex "^3.0.0" strip-ansi@^5.0.0, strip-ansi@^5.1.0, strip-ansi@^5.2.0: version "5.2.0" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-5.2.0.tgz#8c9a536feb6afc962bdfa5b104a5091c1ad9c0ae" integrity sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA== dependencies: ansi-regex "^4.1.0" strip-ansi@^6.0.0, strip-ansi@^6.0.1: version "6.0.1" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== dependencies: ansi-regex "^5.0.1" strip-ansi@^7.0.1: version "7.0.1" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-7.0.1.tgz#61740a08ce36b61e50e65653f07060d000975fb2" integrity sha512-cXNxvT8dFNRVfhVME3JAe98mkXDYN2O1l7jmcwMnOslDeESg1rF/OZMtK0nRAhiari1unG5cD4jG3rapUAkLbw== dependencies: ansi-regex "^6.0.1" strip-bom@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3" integrity sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM= strip-bom@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-4.0.0.tgz#9c3505c1db45bcedca3d9cf7a16f5c5aa3901878" integrity sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w== strip-final-newline@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/strip-final-newline/-/strip-final-newline-2.0.0.tgz#89b852fb2fcbe936f6f4b3187afb0a12c1ab58ad" integrity sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA== strip-indent@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/strip-indent/-/strip-indent-3.0.0.tgz#c32e1cee940b6b3432c771bc2c54bcce73cd3001" integrity sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ== dependencies: min-indent "^1.0.0" strip-indent@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/strip-indent/-/strip-indent-4.0.0.tgz#b41379433dd06f5eae805e21d631e07ee670d853" integrity sha512-mnVSV2l+Zv6BLpSD/8V87CW/y9EmmbYzGCIavsnsI6/nwn26DwffM/yztm30Z/I2DY9wdS3vXVCMnHDgZaVNoA== dependencies: min-indent "^1.0.1" strip-json-comments@2.0.1, strip-json-comments@~2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" integrity sha1-PFMZQukIwml8DsNEhYwobHygpgo= strip-json-comments@^3.1.0, strip-json-comments@^3.1.1: version "3.1.1" resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== stubs@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/stubs/-/stubs-3.0.0.tgz#e8d2ba1fa9c90570303c030b6900f7d5f89abe5b" integrity sha1-6NK6H6nJBXAwPAMLaQD31fiavls= subarg@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/subarg/-/subarg-1.0.0.tgz#f62cf17581e996b48fc965699f54c06ae268b8d2" integrity sha1-9izxdYHplrSPyWVpn1TAauJouNI= dependencies: minimist "^1.1.0" superagent@0.15.7: version "0.15.7" resolved "https://registry.yarnpkg.com/superagent/-/superagent-0.15.7.tgz#095c70b8afffbc072f1458f39684d4854d6333a3" integrity sha1-CVxwuK//vAcvFFjzloTUhU1jM6M= dependencies: cookiejar "1.3.0" debug "~0.7.2" emitter-component "1.0.0" formidable "1.0.14" methods "0.0.1" mime "1.2.5" qs "0.6.5" reduce-component "1.0.1" supports-color@6.0.0: version "6.0.0" resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-6.0.0.tgz#76cfe742cf1f41bb9b1c29ad03068c05b4c0e40a" integrity sha512-on9Kwidc1IUQo+bQdhi8+Tijpo0e1SS6RoGo2guUwn5vdaxw8RXOF9Vb2ws+ihWOmh4JnCJOvaziZWP1VABaLg== dependencies: has-flag "^3.0.0" supports-color@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7" integrity sha1-U10EXOa2Nj+kARcIRimZXp3zJMc= supports-color@^3.1.0: version "3.2.3" resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-3.2.3.tgz#65ac0504b3954171d8a64946b2ae3cbb8a5f54f6" integrity sha1-ZawFBLOVQXHYpklGsq48u4pfVPY= dependencies: has-flag "^1.0.0" supports-color@^5.3.0: version "5.5.0" resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== dependencies: has-flag "^3.0.0" supports-color@^7.0.0, supports-color@^7.1.0: version "7.2.0" resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da" integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== dependencies: has-flag "^4.0.0" supports-color@^9.0.0, supports-color@^9.2.1: version "9.2.1" resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-9.2.1.tgz#599dc9d45acf74c6176e0d880bab1d7d718fe891" integrity sha512-Obv7ycoCTG51N7y175StI9BlAXrmgZrFhZOb0/PyjHBher/NmsdBgbbQ1Inhq+gIhz6+7Gb+jWF2Vqi7Mf1xnQ== supports-hyperlinks@^2.0.0: version "2.2.0" resolved "https://registry.yarnpkg.com/supports-hyperlinks/-/supports-hyperlinks-2.2.0.tgz#4f77b42488765891774b70c79babd87f9bd594bb" integrity sha512-6sXEzV5+I5j8Bmq9/vUphGRM/RJNT9SCURJLjwfOg51heRtguGWDzcaBlgAzKhQa0EVNpPEKzQuBwZ8S8WaCeQ== dependencies: has-flag "^4.0.0" supports-color "^7.0.0" supports-preserve-symlinks-flag@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09" integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w== syntax-error@^1.1.1: version "1.4.0" resolved "https://registry.yarnpkg.com/syntax-error/-/syntax-error-1.4.0.tgz#2d9d4ff5c064acb711594a3e3b95054ad51d907c" integrity sha512-YPPlu67mdnHGTup2A8ff7BC2Pjq0e0Yp/IyTFN03zWO0RcK07uLcbi7C2KpGR2FvWbaB0+bfE27a+sBKebSo7w== dependencies: acorn-node "^1.2.0" tap-finished@0.0.1: version "0.0.1" resolved "https://registry.yarnpkg.com/tap-finished/-/tap-finished-0.0.1.tgz#08b5b543fdc04830290c6c561279552e71c4bd67" integrity sha1-CLW1Q/3ASDApDGxWEnlVLnHEvWc= dependencies: tap-parser "~0.2.0" through "~2.3.4" tap-parser@0.7.0: version "0.7.0" resolved "https://registry.yarnpkg.com/tap-parser/-/tap-parser-0.7.0.tgz#728a61d64680a5b48d5dbd9dbd0a4d48f5c35bcb" integrity sha1-coph1kaApbSNXb2dvQpNSPXDW8s= dependencies: inherits "~2.0.1" minimist "^0.2.0" readable-stream "~1.1.11" tap-parser@~0.2.0: version "0.2.1" resolved "https://registry.yarnpkg.com/tap-parser/-/tap-parser-0.2.1.tgz#8e1e823f2114ee21d032e2f31e4fb642a296f50b" integrity sha1-jh6CPyEU7iHQMuLzHk+2QqKW9Qs= dependencies: split "~0.1.2" tapable@^0.1.8: version "0.1.10" resolved "https://registry.yarnpkg.com/tapable/-/tapable-0.1.10.tgz#29c35707c2b70e50d07482b5d202e8ed446dafd4" integrity sha1-KcNXB8K3DlDQdIK10gLo7URtr9Q= tar-stream@~1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/tar-stream/-/tar-stream-1.0.2.tgz#fd19b4a17900fa704f6a133e3045aead0562ab95" integrity sha1-/Rm0oXkA+nBPahM+MEWurQViq5U= dependencies: bl "^0.9.0" end-of-stream "^1.0.0" readable-stream "^1.0.27-1" xtend "^4.0.0" tar-stream@~1.1.0: version "1.1.5" resolved "https://registry.yarnpkg.com/tar-stream/-/tar-stream-1.1.5.tgz#be9218c130c20029e107b0f967fb23de0579d13c" integrity sha1-vpIYwTDCACnhB7D5Z/sj3gV50Tw= dependencies: bl "^0.9.0" end-of-stream "^1.0.0" readable-stream "~1.0.33" xtend "^4.0.0" teeny-request@7.1.1: version "7.1.1" resolved "https://registry.yarnpkg.com/teeny-request/-/teeny-request-7.1.1.tgz#2b0d156f4a8ad81de44303302ba8d7f1f05e20e6" integrity sha512-iwY6rkW5DDGq8hE2YgNQlKbptYpY5Nn2xecjQiNjOXWbKzPGUfmeUBCSQbbr306d7Z7U2N0TPl+/SwYRfua1Dg== dependencies: http-proxy-agent "^4.0.0" https-proxy-agent "^5.0.0" node-fetch "^2.6.1" stream-events "^1.0.5" uuid "^8.0.0" terser@^3.7.5: version "3.17.0" resolved "https://registry.yarnpkg.com/terser/-/terser-3.17.0.tgz#f88ffbeda0deb5637f9d24b0da66f4e15ab10cb2" integrity sha512-/FQzzPJmCpjAH9Xvk2paiWrFq+5M6aVOf+2KRbwhByISDX/EujxsK+BAvrhb6H+2rtrLCHK9N01wO014vrIwVQ== dependencies: commander "^2.19.0" source-map "~0.6.1" source-map-support "~0.5.10" terser@^4.7.0: version "4.8.0" resolved "https://registry.yarnpkg.com/terser/-/terser-4.8.0.tgz#63056343d7c70bb29f3af665865a46fe03a0df17" integrity sha512-EAPipTNeWsb/3wLPeup1tVPaXfIaU68xMnVdPafIL1TV05OhASArYyIfFvnvJCNrR2NIOvDVNNTFRa+Re2MWyw== dependencies: commander "^2.20.0" source-map "~0.6.1" source-map-support "~0.5.12" test-exclude@^6.0.0: version "6.0.0" resolved "https://registry.yarnpkg.com/test-exclude/-/test-exclude-6.0.0.tgz#04a8698661d805ea6fa293b6cb9e63ac044ef15e" integrity sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w== dependencies: "@istanbuljs/schema" "^0.1.2" glob "^7.1.4" minimatch "^3.0.4" text-extensions@^1.0.0: version "1.9.0" resolved "https://registry.yarnpkg.com/text-extensions/-/text-extensions-1.9.0.tgz#1853e45fee39c945ce6f6c36b2d659b5aabc2a26" integrity sha512-wiBrwC1EhBelW12Zy26JeOUkQ5mRu+5o8rpsJk5+2t+Y5vE7e842qtZDQ2g1NpX/29HdyFeJ4nSIhI47ENSxlQ== text-table@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" integrity sha1-f17oI66AUgfACvLfSoTsP8+lcLQ= through2@^2.0.0, through2@^2.0.3, through2@^2.0.5: version "2.0.5" resolved "https://registry.yarnpkg.com/through2/-/through2-2.0.5.tgz#01c1e39eb31d07cb7d03a96a70823260b23132cd" integrity sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ== dependencies: readable-stream "~2.3.6" xtend "~4.0.1" through2@^3.0.1: version "3.0.2" resolved "https://registry.yarnpkg.com/through2/-/through2-3.0.2.tgz#99f88931cfc761ec7678b41d5d7336b5b6a07bf4" integrity sha512-enaDQ4MUyP2W6ZyT6EsMzqBPZaM/avg8iuo+l2d3QCs0J+6RaqkHV/2/lOwDTueBHeJ/2LG9lrLW3d5rWPucuQ== dependencies: inherits "^2.0.4" readable-stream "2 || 3" through2@^4.0.0: version "4.0.2" resolved "https://registry.yarnpkg.com/through2/-/through2-4.0.2.tgz#a7ce3ac2a7a8b0b966c80e7c49f0484c3b239764" integrity sha512-iOqSav00cVxEEICeD7TjLB1sueEL+81Wpzp2bY17uZjZN0pWZPuo4suZ/61VujxmqSGFfgOcNuTZ85QJwNZQpw== dependencies: readable-stream "3" through@1: version "1.1.2" resolved "https://registry.yarnpkg.com/through/-/through-1.1.2.tgz#344a5425a3773314ca7e0eb6512fbafaf76c0bfe" integrity sha1-NEpUJaN3MxTKfg62US+6+vdsC/4= through@2.3.4: version "2.3.4" resolved "https://registry.yarnpkg.com/through/-/through-2.3.4.tgz#495e40e8d8a8eaebc7c275ea88c2b8fc14c56455" integrity sha1-SV5A6Nio6uvHwnXqiMK4/BTFZFU= "through@>=2.2.7 <3", through@^2.3.4, through@^2.3.7, through@^2.3.8, through@~2.3.4: version "2.3.8" resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" integrity sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU= timers-browserify@^1.0.1: version "1.4.2" resolved "https://registry.yarnpkg.com/timers-browserify/-/timers-browserify-1.4.2.tgz#c9c58b575be8407375cb5e2462dacee74359f41d" integrity sha1-ycWLV1voQHN1y14kYtrO50NZ9B0= dependencies: process "~0.11.0" tinyify@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/tinyify/-/tinyify-3.0.0.tgz#99d5f805191558c6d85dacabe634d617da5509e6" integrity sha512-RtjVjC1xwwxt8AMVfxEmo+FzRJB6p5sAOtFaJj8vMrkWShtArsM4dLVRWhx2Vc07Me3NWgmP7pi9UPm/a2XNNA== dependencies: "@goto-bus-stop/envify" "^5.0.0" acorn-node "^1.8.2" browser-pack-flat "^3.0.9" bundle-collapser "^1.3.0" common-shakeify "^0.6.0" dash-ast "^1.0.0" minify-stream "^2.0.1" multisplice "^1.0.0" through2 "^3.0.1" uglifyify "^5.0.0" unassertify "^2.1.1" to-absolute-glob@^2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/to-absolute-glob/-/to-absolute-glob-2.0.2.tgz#1865f43d9e74b0822db9f145b78cff7d0f7c849b" integrity sha1-GGX0PZ50sIItufFFt4z/fQ98hJs= dependencies: is-absolute "^1.0.0" is-negated-glob "^1.0.0" to-arraybuffer@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz#7d229b1fcc637e466ca081180836a7aabff83f43" integrity sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M= to-fast-properties@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz#dc5e698cbd079265bc73e0377681a4e4e83f616e" integrity sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4= to-object-path@^0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/to-object-path/-/to-object-path-0.3.0.tgz#297588b7b0e7e0ac08e04e672f85c1f4999e17af" integrity sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68= dependencies: kind-of "^3.0.2" to-regex-range@^2.1.0: version "2.1.1" resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-2.1.1.tgz#7c80c17b9dfebe599e27367e0d4dd5590141db38" integrity sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg= dependencies: is-number "^3.0.0" repeat-string "^1.6.1" to-regex-range@^5.0.1: version "5.0.1" resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== dependencies: is-number "^7.0.0" to-regex@^3.0.1, to-regex@^3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/to-regex/-/to-regex-3.0.2.tgz#13cfdd9b336552f30b51f33a8ae1b42a7a7599ce" integrity sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw== dependencies: define-property "^2.0.2" extend-shallow "^3.0.2" regex-not "^1.0.2" safe-regex "^1.1.0" to-vfile@^6.0.0: version "6.1.0" resolved "https://registry.yarnpkg.com/to-vfile/-/to-vfile-6.1.0.tgz#5f7a3f65813c2c4e34ee1f7643a5646344627699" integrity sha512-BxX8EkCxOAZe+D/ToHdDsJcVI4HqQfmw0tCkp31zf3dNP/XWIAjU4CmeuSwsSoOzOTqHPOL0KUzyZqJplkD0Qw== dependencies: is-buffer "^2.0.0" vfile "^4.0.0" to-vfile@^7.0.0: version "7.2.3" resolved "https://registry.yarnpkg.com/to-vfile/-/to-vfile-7.2.3.tgz#4e54ad10878901703f1a956a33ba4f131c31eef7" integrity sha512-QO0A9aE6Z/YkmQadJ0syxpmNXtcQiu0qAtCKYKD5cS3EfgfFTAXfgLX6AOaBrSfWSek5nfsMf3gBZ9KGVFcLuw== dependencies: is-buffer "^2.0.0" vfile "^5.1.0" toidentifier@1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.1.tgz#3be34321a88a820ed1bd80dfaa33e479fbb8dd35" integrity sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA== tough-cookie@>=0.12.0: version "4.0.0" resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-4.0.0.tgz#d822234eeca882f991f0f908824ad2622ddbece4" integrity sha512-tHdtEpQCMrc1YLrMaqXXcj6AxhYi/xgit6mZu1+EDWUn+qhUf8wMQoFIy9NXuq23zAwtcB0t/MjACGR18pcRbg== dependencies: psl "^1.1.33" punycode "^2.1.1" universalify "^0.1.2" tr46@~0.0.3: version "0.0.3" resolved "https://registry.yarnpkg.com/tr46/-/tr46-0.0.3.tgz#8184fd347dac9cdc185992f3a6622e14b9d9ab6a" integrity sha1-gYT9NH2snNwYWZLzpmIuFLnZq2o= transform-ast@^2.4.2, transform-ast@^2.4.3: version "2.4.4" resolved "https://registry.yarnpkg.com/transform-ast/-/transform-ast-2.4.4.tgz#bebf494e2e73f024746f76348bc86a5992851d00" integrity sha512-AxjeZAcIOUO2lev2GDe3/xZ1Q0cVGjIMk5IsriTy8zbWlsEnjeB025AhkhBJHoy997mXpLd4R+kRbvnnQVuQHQ== dependencies: acorn-node "^1.3.0" convert-source-map "^1.5.1" dash-ast "^1.0.0" is-buffer "^2.0.0" magic-string "^0.23.2" merge-source-map "1.0.4" nanobench "^2.1.1" trim-newlines@^3.0.0: version "3.0.1" resolved "https://registry.yarnpkg.com/trim-newlines/-/trim-newlines-3.0.1.tgz#260a5d962d8b752425b32f3a7db0dcacd176c144" integrity sha512-c1PTsA3tYrIsLGkJkzHF+w9F2EyxfXGo4UyJc4pFL++FMjnq0HJS69T3M7d//gKrFKwy429bouPescbjecU+Zw== trim-newlines@^4.0.2: version "4.0.2" resolved "https://registry.yarnpkg.com/trim-newlines/-/trim-newlines-4.0.2.tgz#d6aaaf6a0df1b4b536d183879a6b939489808c7c" integrity sha512-GJtWyq9InR/2HRiLZgpIKv+ufIKrVrvjQWEj7PxAXNc5dwbNJkqhAUoAGgzRmULAnoOM5EIpveYd3J2VeSAIew== trough@^1.0.0: version "1.0.5" resolved "https://registry.yarnpkg.com/trough/-/trough-1.0.5.tgz#b8b639cefad7d0bb2abd37d433ff8293efa5f406" integrity sha512-rvuRbTarPXmMb79SmzEp8aqXNKcK+y0XaB298IXueQ8I2PsrATcPBCSPyK/dDNa2iWOhKlfNnOjdAOTBU/nkFA== trough@^2.0.0: version "2.0.2" resolved "https://registry.yarnpkg.com/trough/-/trough-2.0.2.tgz#94a3aa9d5ce379fc561f6244905b3f36b7458d96" integrity sha512-FnHq5sTMxC0sk957wHDzRnemFnNBvt/gSY99HzK8F7UP5WAbvP70yX5bd7CjEQkN+TjdxwI7g7lJ6podqrG2/w== ts-node@^9: version "9.1.1" resolved "https://registry.yarnpkg.com/ts-node/-/ts-node-9.1.1.tgz#51a9a450a3e959401bda5f004a72d54b936d376d" integrity sha512-hPlt7ZACERQGf03M253ytLY3dHbGNGrAq9qIHWUY9XHYl1z7wYngSr3OQ5xmui8o2AaxsONxIzjafLUiWBo1Fg== dependencies: arg "^4.1.0" create-require "^1.1.0" diff "^4.0.1" make-error "^1.1.1" source-map-support "^0.5.17" yn "3.1.1" tsconfig-paths@^3.12.0: version "3.12.0" resolved "https://registry.yarnpkg.com/tsconfig-paths/-/tsconfig-paths-3.12.0.tgz#19769aca6ee8f6a1a341e38c8fa45dd9fb18899b" integrity sha512-e5adrnOYT6zqVnWqZu7i/BQ3BnhzvGbjEjejFXO20lKIKpwTaupkCPgEfv4GZK1IBciJUEhYs3J3p75FdaTFVg== dependencies: "@types/json5" "^0.0.29" json5 "^1.0.1" minimist "^1.2.0" strip-bom "^3.0.0" tslib@^1.8.1: version "1.14.1" resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00" integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== tslib@^2, tslib@^2.1.0: version "2.3.1" resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.3.1.tgz#e8a335add5ceae51aa261d32a490158ef042ef01" integrity sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw== tsutils@^3.21.0: version "3.21.0" resolved "https://registry.yarnpkg.com/tsutils/-/tsutils-3.21.0.tgz#b48717d394cea6c1e096983eed58e9d61715b623" integrity sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA== dependencies: tslib "^1.8.1" tty-browserify@0.0.1, tty-browserify@~0.0.0: version "0.0.1" resolved "https://registry.yarnpkg.com/tty-browserify/-/tty-browserify-0.0.1.tgz#3f05251ee17904dfd0677546670db9651682b811" integrity sha512-C3TaO7K81YvjCgQH9Q1S3R3P3BtN3RIM8n+OvX4il1K1zgE8ZhI0op7kClgkxtutIE8hQrcrHBXvIheqKUUCxw== tunnel-agent@~0.4.0: version "0.4.3" resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.4.3.tgz#6373db76909fe570e08d73583365ed828a74eeeb" integrity sha1-Y3PbdpCf5XDgjXNYM2Xtgop07us= type-check@^0.4.0, type-check@~0.4.0: version "0.4.0" resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.4.0.tgz#07b8203bfa7056c0657050e3ccd2c37730bab8f1" integrity sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew== dependencies: prelude-ls "^1.2.1" type-check@~0.3.2: version "0.3.2" resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.3.2.tgz#5884cab512cf1d355e3fb784f30804b2b520db72" integrity sha1-WITKtRLPHTVeP7eE8wgEsrUg23I= dependencies: prelude-ls "~1.1.2" type-fest@^0.18.0: version "0.18.1" resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.18.1.tgz#db4bc151a4a2cf4eebf9add5db75508db6cc841f" integrity sha512-OIAYXk8+ISY+qTOwkHtKqzAuxchoMiD9Udx+FSGQDuiRR+PJKJHc2NJAXlbhkGwTt/4/nKZxELY1w3ReWOL8mw== type-fest@^0.20.2: version "0.20.2" resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.20.2.tgz#1bf207f4b28f91583666cb5fbd327887301cd5f4" integrity sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ== type-fest@^0.21.3: version "0.21.3" resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.21.3.tgz#d260a24b0198436e133fa26a524a6d65fa3b2e37" integrity sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w== type-fest@^0.6.0: version "0.6.0" resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.6.0.tgz#8d2a2370d3df886eb5c90ada1c5bf6188acf838b" integrity sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg== type-fest@^0.8.0, type-fest@^0.8.1: version "0.8.1" resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.8.1.tgz#09e249ebde851d3b1e48d27c105444667f17b83d" integrity sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA== type-fest@^1.0.1, type-fest@^1.2.1, type-fest@^1.2.2: version "1.4.0" resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-1.4.0.tgz#e9fb813fe3bf1744ec359d55d1affefa76f14be1" integrity sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA== type-fest@^2.0.0: version "2.9.0" resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-2.9.0.tgz#7a2d430dd966f52b6bc723da2aaa2c9867530551" integrity sha512-uC0hJKi7eAGXUJ/YKk53RhnKxMwzHWgzf4t92oz8Qez28EBgVTfpDTB59y9hMYLzc/Wl85cD7Tv1hLZZoEJtrg== type-is@^1.6.4, type-is@~1.6.18, type-is@~1.6.2: version "1.6.18" resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.18.tgz#4e552cd05df09467dcbc4ef739de89f2cf37c131" integrity sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g== dependencies: media-typer "0.3.0" mime-types "~2.1.24" type@^1.0.1: version "1.2.0" resolved "https://registry.yarnpkg.com/type/-/type-1.2.0.tgz#848dd7698dafa3e54a6c479e759c4bc3f18847a0" integrity sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg== type@^2.5.0: version "2.5.0" resolved "https://registry.yarnpkg.com/type/-/type-2.5.0.tgz#0a2e78c2e77907b252abe5f298c1b01c63f0db3d" integrity sha512-180WMDQaIMm3+7hGXWf12GtdniDEy7nYcyFMKJn/eZz/6tSLXrUN9V0wKSbMjej0I1WHWbpREDEKHtqPQa9NNw== typedarray-to-buffer@^3.1.5: version "3.1.5" resolved "https://registry.yarnpkg.com/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz#a97ee7a9ff42691b9f783ff1bc5112fe3fca9080" integrity sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q== dependencies: is-typedarray "^1.0.0" typedarray@^0.0.6, typedarray@~0.0.5: version "0.0.6" resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" integrity sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c= typescript@^4.4.3, typescript@^4.5.2: version "4.5.4" resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.5.4.tgz#a17d3a0263bf5c8723b9c52f43c5084edf13c2e8" integrity sha512-VgYs2A2QIRuGphtzFV7aQJduJ2gyfTljngLzjpfW9FoYZF6xuw1W0vW9ghCKLfcWrCFxK81CSGRAvS1pn4fIUg== uglify-js@^3.1.4: version "3.14.5" resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.14.5.tgz#cdabb7d4954231d80cb4a927654c4655e51f4859" integrity sha512-qZukoSxOG0urUTvjc2ERMTcAy+BiFh3weWAkeurLwjrCba73poHmG3E36XEjd/JGukMzwTL7uCxZiAexj8ppvQ== uglify-js@~2.3: version "2.3.6" resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-2.3.6.tgz#fa0984770b428b7a9b2a8058f46355d14fef211a" integrity sha1-+gmEdwtCi3qbKoBY9GNV0U/vIRo= dependencies: async "~0.2.6" optimist "~0.3.5" source-map "~0.1.7" uglifyify@^5.0.0: version "5.0.2" resolved "https://registry.yarnpkg.com/uglifyify/-/uglifyify-5.0.2.tgz#7d0269885e09faa963208a9ec6721afcaf45fc50" integrity sha512-NcSk6pgoC+IgwZZ2tVLVHq+VNKSvLPlLkF5oUiHPVOJI0s/OlSVYEGXG9PCAH0hcyFZLyvt4KBdPAQBRlVDn1Q== dependencies: convert-source-map "~1.1.0" minimatch "^3.0.2" terser "^3.7.5" through "~2.3.4" xtend "^4.0.1" uid-safe@~2.1.5: version "2.1.5" resolved "https://registry.yarnpkg.com/uid-safe/-/uid-safe-2.1.5.tgz#2b3d5c7240e8fc2e58f8aa269e5ee49c0857bd3a" integrity sha512-KPHm4VL5dDXKz01UuEd88Df+KzynaohSL9fBh096KWAxSKZQDI2uBrVqtvRM4rwrIrRRKsdLNML/lnaaVSRioA== dependencies: random-bytes "~1.0.0" uid2@0.0.3: version "0.0.3" resolved "https://registry.yarnpkg.com/uid2/-/uid2-0.0.3.tgz#483126e11774df2f71b8b639dcd799c376162b82" integrity sha1-SDEm4Rd03y9xuLY53NeZw3YWK4I= umd@^3.0.0, umd@^3.0.3: version "3.0.3" resolved "https://registry.yarnpkg.com/umd/-/umd-3.0.3.tgz#aa9fe653c42b9097678489c01000acb69f0b26cf" integrity sha512-4IcGSufhFshvLNcMCV80UnQVlZ5pMOC8mvNPForqwA4+lzYQuetTESLDQkeLmihq8bRcnpbQa48Wb8Lh16/xow== unassert@^1.3.1: version "1.6.0" resolved "https://registry.yarnpkg.com/unassert/-/unassert-1.6.0.tgz#ceb6d39ce47c6d2bfa9cb3cab407352cbfb60a19" integrity sha512-GoMtWTwGSxSFuRD0NKmbjlx3VJkgvSogzDzMPpJXYmBZv6MIWButsyMqEYhMx3NI4osXACcZA9mXiBteXyJtRw== dependencies: acorn "^7.0.0" call-matcher "^2.0.0" deep-equal "^1.0.0" espurify "^2.0.1" estraverse "^4.1.0" esutils "^2.0.2" object-assign "^4.1.0" unassertify@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/unassertify/-/unassertify-2.1.1.tgz#23772d76c136fb3d5df7dad4911c737d952357d3" integrity sha512-YIAaIlc6/KC9Oib8cVZLlpDDhK1UTEuaDyx9BwD97xqxDZC0cJOqwFcs/Y6K3m73B5VzHsRTBLXNO0dxS/GkTw== dependencies: acorn "^5.1.0" convert-source-map "^1.1.1" escodegen "^1.6.1" multi-stage-sourcemap "^0.2.1" through "^2.3.7" unassert "^1.3.1" unbox-primitive@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/unbox-primitive/-/unbox-primitive-1.0.1.tgz#085e215625ec3162574dc8859abee78a59b14471" integrity sha512-tZU/3NqK3dA5gpE1KtyiJUrEB0lxnGkMFHptJ7q6ewdZ8s12QrODwNbhIJStmJkd1QDXa1NRA8aF2A1zk/Ypyw== dependencies: function-bind "^1.1.1" has-bigints "^1.0.1" has-symbols "^1.0.2" which-boxed-primitive "^1.0.2" unc-path-regex@^0.1.2: version "0.1.2" resolved "https://registry.yarnpkg.com/unc-path-regex/-/unc-path-regex-0.1.2.tgz#e73dd3d7b0d7c5ed86fbac6b0ae7d8c6a69d50fa" integrity sha1-5z3T17DXxe2G+6xrCufYxqadUPo= undeclared-identifiers@^1.1.2: version "1.1.3" resolved "https://registry.yarnpkg.com/undeclared-identifiers/-/undeclared-identifiers-1.1.3.tgz#9254c1d37bdac0ac2b52de4b6722792d2a91e30f" integrity sha512-pJOW4nxjlmfwKApE4zvxLScM/njmwj/DiUBv7EabwE4O8kRUy+HIwxQtZLBPll/jx1LJyBcqNfB3/cpv9EZwOw== dependencies: acorn-node "^1.3.0" dash-ast "^1.0.0" get-assigned-identifiers "^1.2.0" simple-concat "^1.0.0" xtend "^4.0.1" underscore.string@~2.3.3: version "2.3.3" resolved "https://registry.yarnpkg.com/underscore.string/-/underscore.string-2.3.3.tgz#71c08bf6b428b1133f37e78fa3a21c82f7329b0d" integrity sha1-ccCL9rQosRM/N+ePo6Icgvcymw0= unherit@^1.0.4: version "1.1.3" resolved "https://registry.yarnpkg.com/unherit/-/unherit-1.1.3.tgz#6c9b503f2b41b262330c80e91c8614abdaa69c22" integrity sha512-Ft16BJcnapDKp0+J/rqFC3Rrk6Y/Ng4nzsC028k2jdDII/rdZ7Wd3pPT/6+vIIxRagwRc9K0IUX0Ra4fKvw+WQ== dependencies: inherits "^2.0.0" xtend "^4.0.0" unicode-canonical-property-names-ecmascript@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz#301acdc525631670d39f6146e0e77ff6bbdebddc" integrity sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ== unicode-match-property-ecmascript@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz#54fd16e0ecb167cf04cf1f756bdcc92eba7976c3" integrity sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q== dependencies: unicode-canonical-property-names-ecmascript "^2.0.0" unicode-property-aliases-ecmascript "^2.0.0" unicode-match-property-value-ecmascript@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.0.0.tgz#1a01aa57247c14c568b89775a54938788189a714" integrity sha512-7Yhkc0Ye+t4PNYzOGKedDhXbYIBe1XEQYQxOPyhcXNMJ0WCABqqj6ckydd6pWRZTHV4GuCPKdBAUiMc60tsKVw== unicode-property-aliases-ecmascript@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.0.0.tgz#0a36cb9a585c4f6abd51ad1deddb285c165297c8" integrity sha512-5Zfuy9q/DFr4tfO7ZPeVXb1aPoeQSdeFMLpYuFebehDAhbuevLs5yxSZmIFN1tP5F9Wl4IpJrYojg85/zgyZHQ== unified-args@^9.0.0: version "9.0.2" resolved "https://registry.yarnpkg.com/unified-args/-/unified-args-9.0.2.tgz#0c14f555e73ee29c23f9a567942e29069f56e5a2" integrity sha512-qSqryjoqfJSII4E4Z2Jx7MhXX2MuUIn6DsrlmL8UnWFdGtrWvEtvm7Rx5fKT5TPUz7q/Fb4oxwIHLCttvAuRLQ== dependencies: "@types/text-table" "^0.2.0" camelcase "^6.0.0" chalk "^4.0.0" chokidar "^3.0.0" fault "^2.0.0" json5 "^2.0.0" minimist "^1.0.0" text-table "^0.2.0" unified-engine "^9.0.0" unified-engine@^9.0.0: version "9.0.5" resolved "https://registry.yarnpkg.com/unified-engine/-/unified-engine-9.0.5.tgz#7e417f2560942793ce41753ad53ee7428aaea40c" integrity sha512-frQ6lUNlkTwVC0JELJqSSITpE7MLrLJqAWmDrUFj5Do6A4/3n6eX5Jyg8fhe4Dbwwh38spqUJd39FtRFG34QWg== dependencies: "@types/concat-stream" "^1.0.0" "@types/debug" "^4.0.0" "@types/is-empty" "^1.0.0" "@types/js-yaml" "^4.0.0" "@types/node" "^17.0.0" "@types/unist" "^2.0.0" concat-stream "^2.0.0" debug "^4.0.0" fault "^2.0.0" glob "^7.0.0" ignore "^5.0.0" is-buffer "^2.0.0" is-empty "^1.0.0" is-plain-obj "^4.0.0" js-yaml "^4.0.0" load-plugin "^4.0.0" parse-json "^6.0.0" to-vfile "^7.0.0" trough "^2.0.0" unist-util-inspect "^7.0.0" vfile-message "^3.0.0" vfile-reporter "^7.0.0" vfile-statistics "^2.0.0" unified-lint-rule@^1.0.0: version "1.0.6" resolved "https://registry.yarnpkg.com/unified-lint-rule/-/unified-lint-rule-1.0.6.tgz#b4ab801ff93c251faa917a8d1c10241af030de84" integrity sha512-YPK15YBFwnsVorDFG/u0cVVQN5G2a3V8zv5/N6KN3TCG+ajKtaALcy7u14DCSrJI+gZeyYquFL9cioJXOGXSvg== dependencies: wrapped "^1.0.1" unified-message-control@^3.0.0: version "3.0.3" resolved "https://registry.yarnpkg.com/unified-message-control/-/unified-message-control-3.0.3.tgz#d08c4564092a507668de71451a33c0d80e734bbd" integrity sha512-oY5z2n8ugjpNHXOmcgrw0pQeJzavHS0VjPBP21tOcm7rc2C+5Q+kW9j5+gqtf8vfW/8sabbsK5+P+9QPwwEHDA== dependencies: unist-util-visit "^2.0.0" vfile-location "^3.0.0" unified@^10.0.0: version "10.1.1" resolved "https://registry.yarnpkg.com/unified/-/unified-10.1.1.tgz#345e349e3ab353ab612878338eb9d57b4dea1d46" integrity sha512-v4ky1+6BN9X3pQrOdkFIPWAaeDsHPE1svRDxq7YpTc2plkIqFMwukfqM+l0ewpP9EfwARlt9pPFAeWYhHm8X9w== dependencies: "@types/unist" "^2.0.0" bail "^2.0.0" extend "^3.0.0" is-buffer "^2.0.0" is-plain-obj "^4.0.0" trough "^2.0.0" vfile "^5.0.0" unified@^9.2.0: version "9.2.2" resolved "https://registry.yarnpkg.com/unified/-/unified-9.2.2.tgz#67649a1abfc3ab85d2969502902775eb03146975" integrity sha512-Sg7j110mtefBD+qunSLO1lqOEKdrwBFBrR6Qd8f4uwkhWNlbkaqwHse6e7QvD3AP/MNoJdEDLaf8OxYyoWgorQ== dependencies: bail "^1.0.0" extend "^3.0.0" is-buffer "^2.0.0" is-plain-obj "^2.0.0" trough "^1.0.0" vfile "^4.0.0" union-value@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/union-value/-/union-value-1.0.1.tgz#0b6fe7b835aecda61c6ea4d4f02c14221e109847" integrity sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg== dependencies: arr-union "^3.1.0" get-value "^2.0.6" is-extendable "^0.1.1" set-value "^2.0.1" unist-builder@^2.0.0: version "2.0.3" resolved "https://registry.yarnpkg.com/unist-builder/-/unist-builder-2.0.3.tgz#77648711b5d86af0942f334397a33c5e91516436" integrity sha512-f98yt5pnlMWlzP539tPc4grGMsFaQQlP/vM396b00jngsiINumNmsY8rkXjfoi1c6QaM8nQ3vaGDuoKWbe/1Uw== unist-util-find-after@^2.0.0: version "2.0.4" resolved "https://registry.yarnpkg.com/unist-util-find-after/-/unist-util-find-after-2.0.4.tgz#3fcccf0df3a2e7291fa119224c0f22158357cc10" integrity sha512-zo0ShIr+E/aU9xSK7JC9Kb+WP9seTFCuqVYdo5+HJSjN009XMfhiA1FIExEKzdDP1UsgvKGleGlB/pSdTSqZww== dependencies: unist-util-is "^3.0.0" unist-util-generated@^1.0.0, unist-util-generated@^1.1.0: version "1.1.6" resolved "https://registry.yarnpkg.com/unist-util-generated/-/unist-util-generated-1.1.6.tgz#5ab51f689e2992a472beb1b35f2ce7ff2f324d4b" integrity sha512-cln2Mm1/CZzN5ttGK7vkoGw+RZ8VcUH6BtGbq98DDtRGquAAOXig1mrBQYelOwMXYS8rK+vZDyyojSjp7JX+Lg== unist-util-inspect@^7.0.0: version "7.0.0" resolved "https://registry.yarnpkg.com/unist-util-inspect/-/unist-util-inspect-7.0.0.tgz#98426f0219e24d011a27e32539be0693d9eb973e" integrity sha512-2Utgv78I7PUu461Y9cdo+IUiiKSKpDV5CE/XD6vTj849a3xlpDAScvSJ6cQmtFBGgAmCn2wR7jLuXhpg1XLlJw== dependencies: "@types/unist" "^2.0.0" unist-util-is@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/unist-util-is/-/unist-util-is-3.0.0.tgz#d9e84381c2468e82629e4a5be9d7d05a2dd324cd" integrity sha512-sVZZX3+kspVNmLWBPAB6r+7D9ZgAFPNWm66f7YNb420RlQSbn+n8rG8dGZSkrER7ZIXGQYNm5pqC3v3HopH24A== unist-util-is@^4.0.0: version "4.1.0" resolved "https://registry.yarnpkg.com/unist-util-is/-/unist-util-is-4.1.0.tgz#976e5f462a7a5de73d94b706bac1b90671b57797" integrity sha512-ZOQSsnce92GrxSqlnEEseX0gi7GH9zTJZ0p9dtu87WRb/37mMPO2Ilx1s/t9vBHrFhbgweUwb+t7cIn5dxPhZg== unist-util-is@^5.0.0: version "5.1.1" resolved "https://registry.yarnpkg.com/unist-util-is/-/unist-util-is-5.1.1.tgz#e8aece0b102fa9bc097b0fef8f870c496d4a6236" integrity sha512-F5CZ68eYzuSvJjGhCLPL3cYx45IxkqXSetCcRgUXtbcm50X2L9oOWQlfUfDdAf+6Pd27YDblBfdtmsThXmwpbQ== unist-util-modify-children@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/unist-util-modify-children/-/unist-util-modify-children-2.0.0.tgz#9c9c30d4e32502aabb3fde10d7872a17c86801e2" integrity sha512-HGrj7JQo9DwZt8XFsX8UD4gGqOsIlCih9opG6Y+N11XqkBGKzHo8cvDi+MfQQgiZ7zXRUiQREYHhjOBHERTMdg== dependencies: array-iterate "^1.0.0" unist-util-position@^3.0.0, unist-util-position@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/unist-util-position/-/unist-util-position-3.1.0.tgz#1c42ee6301f8d52f47d14f62bbdb796571fa2d47" integrity sha512-w+PkwCbYSFw8vpgWD0v7zRCl1FpY3fjDSQ3/N/wNd9Ffa4gPi8+4keqt99N3XW6F99t/mUzp2xAhNmfKWp95QA== unist-util-stringify-position@^2.0.0: version "2.0.3" resolved "https://registry.yarnpkg.com/unist-util-stringify-position/-/unist-util-stringify-position-2.0.3.tgz#cce3bfa1cdf85ba7375d1d5b17bdc4cada9bd9da" integrity sha512-3faScn5I+hy9VleOq/qNbAd6pAx7iH5jYBMS9I1HgQVijz/4mv5Bvw5iw1sC/90CODiKo81G/ps8AJrISn687g== dependencies: "@types/unist" "^2.0.2" unist-util-stringify-position@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/unist-util-stringify-position/-/unist-util-stringify-position-3.0.0.tgz#d517d2883d74d0daa0b565adc3d10a02b4a8cde9" integrity sha512-SdfAl8fsDclywZpfMDTVDxA2V7LjtRDTOFd44wUJamgl6OlVngsqWjxvermMYf60elWHbxhuRCZml7AnuXCaSA== dependencies: "@types/unist" "^2.0.0" unist-util-visit-children@^1.0.0: version "1.1.4" resolved "https://registry.yarnpkg.com/unist-util-visit-children/-/unist-util-visit-children-1.1.4.tgz#e8a087e58a33a2815f76ea1901c15dec2cb4b432" integrity sha512-sA/nXwYRCQVRwZU2/tQWUqJ9JSFM1X3x7JIOsIgSzrFHcfVt6NkzDtKzyxg2cZWkCwGF9CO8x4QNZRJRMK8FeQ== unist-util-visit-parents@^2.0.0: version "2.1.2" resolved "https://registry.yarnpkg.com/unist-util-visit-parents/-/unist-util-visit-parents-2.1.2.tgz#25e43e55312166f3348cae6743588781d112c1e9" integrity sha512-DyN5vD4NE3aSeB+PXYNKxzGsfocxp6asDc2XXE3b0ekO2BaRUpBicbbUygfSvYfUz1IkmjFR1YF7dPklraMZ2g== dependencies: unist-util-is "^3.0.0" unist-util-visit-parents@^3.0.0: version "3.1.1" resolved "https://registry.yarnpkg.com/unist-util-visit-parents/-/unist-util-visit-parents-3.1.1.tgz#65a6ce698f78a6b0f56aa0e88f13801886cdaef6" integrity sha512-1KROIZWo6bcMrZEwiH2UrXDyalAa0uqzWCxCJj6lPOvTve2WkfgCytoDTPaMnodXh1WrXOq0haVYHj99ynJlsg== dependencies: "@types/unist" "^2.0.0" unist-util-is "^4.0.0" unist-util-visit-parents@^5.0.0: version "5.1.0" resolved "https://registry.yarnpkg.com/unist-util-visit-parents/-/unist-util-visit-parents-5.1.0.tgz#44bbc5d25f2411e7dfc5cecff12de43296aa8521" integrity sha512-y+QVLcY5eR/YVpqDsLf/xh9R3Q2Y4HxkZTp7ViLDU6WtJCEcPmRzW1gpdWDCDIqIlhuPDXOgttqPlykrHYDekg== dependencies: "@types/unist" "^2.0.0" unist-util-is "^5.0.0" unist-util-visit@^1.0.0, unist-util-visit@^1.1.0: version "1.4.1" resolved "https://registry.yarnpkg.com/unist-util-visit/-/unist-util-visit-1.4.1.tgz#4724aaa8486e6ee6e26d7ff3c8685960d560b1e3" integrity sha512-AvGNk7Bb//EmJZyhtRUnNMEpId/AZ5Ph/KUpTI09WHQuDZHKovQ1oEv3mfmKpWKtoMzyMC4GLBm1Zy5k12fjIw== dependencies: unist-util-visit-parents "^2.0.0" unist-util-visit@^2.0.0: version "2.0.3" resolved "https://registry.yarnpkg.com/unist-util-visit/-/unist-util-visit-2.0.3.tgz#c3703893146df47203bb8a9795af47d7b971208c" integrity sha512-iJ4/RczbJMkD0712mGktuGpm/U4By4FfDonL7N/9tATGIF4imikjOuagyMY53tnZq3NP6BcmlrHhEKAfGWjh7Q== dependencies: "@types/unist" "^2.0.0" unist-util-is "^4.0.0" unist-util-visit-parents "^3.0.0" unist-util-visit@^4.0.0: version "4.1.0" resolved "https://registry.yarnpkg.com/unist-util-visit/-/unist-util-visit-4.1.0.tgz#f41e407a9e94da31594e6b1c9811c51ab0b3d8f5" integrity sha512-n7lyhFKJfVZ9MnKtqbsqkQEk5P1KShj0+//V7mAcoI6bpbUjh3C/OG8HVD+pBihfh6Ovl01m8dkcv9HNqYajmQ== dependencies: "@types/unist" "^2.0.0" unist-util-is "^5.0.0" unist-util-visit-parents "^5.0.0" universalify@^0.1.2: version "0.1.2" resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.1.2.tgz#b646f69be3942dabcecc9d6639c80dc105efaa66" integrity sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg== universalify@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/universalify/-/universalify-2.0.0.tgz#75a4984efedc4b08975c5aeb73f530d02df25717" integrity sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ== unpipe@1.0.0, unpipe@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" integrity sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw= unset-value@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/unset-value/-/unset-value-1.0.0.tgz#8376873f7d2335179ffb1e6fc3a8ed0dfc8ab559" integrity sha1-g3aHP30jNRef+x5vw6jtDfyKtVk= dependencies: has-value "^0.3.1" isobject "^3.0.0" uri-js@^4.2.2: version "4.4.1" resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.1.tgz#9b1a52595225859e55f669d928f88c6c57f2a77e" integrity sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg== dependencies: punycode "^2.1.0" urix@^0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/urix/-/urix-0.1.0.tgz#da937f7a62e21fec1fd18d49b35c2935067a6c72" integrity sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI= url@~0.11.0: version "0.11.0" resolved "https://registry.yarnpkg.com/url/-/url-0.11.0.tgz#3838e97cfc60521eb73c525a8e55bfdd9e2e28f1" integrity sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE= dependencies: punycode "1.3.2" querystring "0.2.0" urlgrey@1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/urlgrey/-/urlgrey-1.0.0.tgz#72d2f904482d0b602e3c7fa599343d699bbe1017" integrity sha512-hJfIzMPJmI9IlLkby8QrsCykQ+SXDeO2W5Q9QTW3QpqZVTx4a/K7p8/5q+/isD8vsbVaFgql/gvAoQCRQ2Cb5w== dependencies: fast-url-parser "^1.1.3" use@^3.1.0: version "3.1.1" resolved "https://registry.yarnpkg.com/use/-/use-3.1.1.tgz#d50c8cac79a19fbc20f2911f56eb973f4e10070f" integrity sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ== util-deprecate@^1.0.1, util-deprecate@~1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" integrity sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8= util@0.10.3: version "0.10.3" resolved "https://registry.yarnpkg.com/util/-/util-0.10.3.tgz#7afb1afe50805246489e3db7fe0ed379336ac0f9" integrity sha1-evsa/lCAUkZInj23/g7TeTNqwPk= dependencies: inherits "2.0.1" util@~0.10.1: version "0.10.4" resolved "https://registry.yarnpkg.com/util/-/util-0.10.4.tgz#3aa0125bfe668a4672de58857d3ace27ecb76901" integrity sha512-0Pm9hTQ3se5ll1XihRic3FDIku70C+iHUdT/W926rSgHV5QgXsYbKZN8MSC3tJtSkhuROzvsQjAaFENRXr+19A== dependencies: inherits "2.0.3" util@~0.12.0: version "0.12.4" resolved "https://registry.yarnpkg.com/util/-/util-0.12.4.tgz#66121a31420df8f01ca0c464be15dfa1d1850253" integrity sha512-bxZ9qtSlGUWSOy9Qa9Xgk11kSslpuZwaxCg4sNIDj6FLucDab2JxnHwyNTCpHMtK1MjoQiWQ6DiUMZYbSrO+Sw== dependencies: inherits "^2.0.3" is-arguments "^1.0.4" is-generator-function "^1.0.7" is-typed-array "^1.1.3" safe-buffer "^5.1.2" which-typed-array "^1.1.2" utils-merge@1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713" integrity sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM= uuid@^3.3.3: version "3.4.0" resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.4.0.tgz#b23e4358afa8a202fe7a100af1f5f883f02007ee" integrity sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A== uuid@^8.0.0: version "8.3.2" resolved "https://registry.yarnpkg.com/uuid/-/uuid-8.3.2.tgz#80d5b5ced271bb9af6c445f21a1a04c606cefbe2" integrity sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg== uvu@^0.5.0: version "0.5.3" resolved "https://registry.yarnpkg.com/uvu/-/uvu-0.5.3.tgz#3d83c5bc1230f153451877bfc7f4aea2392219ae" integrity sha512-brFwqA3FXzilmtnIyJ+CxdkInkY/i4ErvP7uV0DnUVxQcQ55reuHphorpF+tZoVHK2MniZ/VJzI7zJQoc9T9Yw== dependencies: dequal "^2.0.0" diff "^5.0.0" kleur "^4.0.3" sade "^1.7.3" v8-compile-cache@^2.0.3: version "2.3.0" resolved "https://registry.yarnpkg.com/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz#2de19618c66dc247dcfb6f99338035d8245a2cee" integrity sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA== validate-npm-package-license@^3.0.1: version "3.0.4" resolved "https://registry.yarnpkg.com/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz#fc91f6b9c7ba15c857f4cb2c5defeec39d4f410a" integrity sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew== dependencies: spdx-correct "^3.0.0" spdx-expression-parse "^3.0.0" vargs@~0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/vargs/-/vargs-0.1.0.tgz#6b6184da6520cc3204ce1b407cac26d92609ebff" integrity sha1-a2GE2mUgzDIEzhtAfKwm2SYJ6/8= vary@~1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/vary/-/vary-1.0.1.tgz#99e4981566a286118dfb2b817357df7993376d10" integrity sha1-meSYFWaihhGN+yuBc1ffeZM3bRA= vary@~1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc" integrity sha1-IpnwLG3tMNSllhsLn3RSShj2NPw= vfile-find-up@^5.0.0: version "5.0.1" resolved "https://registry.yarnpkg.com/vfile-find-up/-/vfile-find-up-5.0.1.tgz#2d3d855e99013b852c604b18a0e559acf6fd385e" integrity sha512-YWx8fhWQNYpHxFkR5fDO4lCdvPcY4jfCG7qUMHVvSp14vRfkEYxFG/vUEV0eJuXoKFfiAmMkAS8dekOYnpAJ+A== dependencies: to-vfile "^6.0.0" vfile-location@^3.0.0, vfile-location@^3.1.0: version "3.2.0" resolved "https://registry.yarnpkg.com/vfile-location/-/vfile-location-3.2.0.tgz#d8e41fbcbd406063669ebf6c33d56ae8721d0f3c" integrity sha512-aLEIZKv/oxuCDZ8lkJGhuhztf/BW4M+iHdCwglA/eWc+vtuRFJj8EtgceYFX4LRjOhCAAiNHsKGssC6onJ+jbA== vfile-message@^2.0.0: version "2.0.4" resolved "https://registry.yarnpkg.com/vfile-message/-/vfile-message-2.0.4.tgz#5b43b88171d409eae58477d13f23dd41d52c371a" integrity sha512-DjssxRGkMvifUOJre00juHoP9DPWuzjxKuMDrhNbk2TdaYYBNMStsNhEOt3idrtI12VQYM/1+iM0KOzXi4pxwQ== dependencies: "@types/unist" "^2.0.0" unist-util-stringify-position "^2.0.0" vfile-message@^3.0.0: version "3.1.0" resolved "https://registry.yarnpkg.com/vfile-message/-/vfile-message-3.1.0.tgz#5437035aa43185ff4b9210d32fada6c640e59143" integrity sha512-4QJbBk+DkPEhBXq3f260xSaWtjE4gPKOfulzfMFF8ZNwaPZieWsg3iVlcmF04+eebzpcpeXOOFMfrYzJHVYg+g== dependencies: "@types/unist" "^2.0.0" unist-util-stringify-position "^3.0.0" vfile-reporter@^7.0.0: version "7.0.3" resolved "https://registry.yarnpkg.com/vfile-reporter/-/vfile-reporter-7.0.3.tgz#faa72f6d2d56841b352480c827b53f8417cb1b33" integrity sha512-q+ruTWxFHbow359TDqoNJn5THdwRDeV+XUOtzdT/OESgaGw05CjL68ImlbzRzqS5xL62Y1IaIWb8x+RbaNjayA== dependencies: "@types/supports-color" "^8.0.0" string-width "^5.0.0" supports-color "^9.0.0" unist-util-stringify-position "^3.0.0" vfile-sort "^3.0.0" vfile-statistics "^2.0.0" vfile-sort@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/vfile-sort/-/vfile-sort-3.0.0.tgz#ee13d3eaac0446200a2047a3b45d78fad6b106e6" integrity sha512-fJNctnuMi3l4ikTVcKpxTbzHeCgvDhnI44amA3NVDvA6rTC6oKCFpCVyT5n2fFMr3ebfr+WVQZedOCd73rzSxg== dependencies: vfile-message "^3.0.0" vfile-statistics@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/vfile-statistics/-/vfile-statistics-2.0.0.tgz#f04ee3e3c666809a3c10c06021becd41ea9c8037" integrity sha512-foOWtcnJhKN9M2+20AOTlWi2dxNfAoeNIoxD5GXcO182UJyId4QrXa41fWrgcfV3FWTjdEDy3I4cpLVcQscIMA== dependencies: vfile-message "^3.0.0" vfile@^4.0.0: version "4.2.1" resolved "https://registry.yarnpkg.com/vfile/-/vfile-4.2.1.tgz#03f1dce28fc625c625bc6514350fbdb00fa9e624" integrity sha512-O6AE4OskCG5S1emQ/4gl8zK586RqA3srz3nfK/Viy0UPToBc5Trp9BVFb1u0CjsKrAWwnpr4ifM/KBXPWwJbCA== dependencies: "@types/unist" "^2.0.0" is-buffer "^2.0.0" unist-util-stringify-position "^2.0.0" vfile-message "^2.0.0" vfile@^5.0.0, vfile@^5.1.0: version "5.2.1" resolved "https://registry.yarnpkg.com/vfile/-/vfile-5.2.1.tgz#9278072d576e320917204a3291eec0b346c4ed5d" integrity sha512-vXW5XKbELM6mLj88kmkJ+gjFGZ/2gTmpdqPDjs3y+qbvI5i7md7rba/+pbYEawa7t22W7ynywPV6lUUAS1WiYg== dependencies: "@types/unist" "^2.0.0" is-buffer "^2.0.0" unist-util-stringify-position "^3.0.0" vfile-message "^3.0.0" vm-browserify@^1.0.0: version "1.1.2" resolved "https://registry.yarnpkg.com/vm-browserify/-/vm-browserify-1.1.2.tgz#78641c488b8e6ca91a75f511e7a3b32a86e5dda0" integrity sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ== vm-browserify@~0.0.1: version "0.0.4" resolved "https://registry.yarnpkg.com/vm-browserify/-/vm-browserify-0.0.4.tgz#5d7ea45bbef9e4a6ff65f95438e0a87c357d5a73" integrity sha1-XX6kW7755Kb/ZflUOOCofDV9WnM= dependencies: indexof "0.0.1" walk@2.2.1: version "2.2.1" resolved "https://registry.yarnpkg.com/walk/-/walk-2.2.1.tgz#5ada1f8e49e47d4b7445d8be7a2e1e631ab43016" integrity sha1-WtofjknkfUt0Rdi+ei4eYxq0MBY= dependencies: forEachAsync "~2.2" watchify@3.7.0: version "3.7.0" resolved "https://registry.yarnpkg.com/watchify/-/watchify-3.7.0.tgz#ee2f2c5c8c37312303f998b818b2b3450eefe648" integrity sha1-7i8sXIw3MSMD+Zi4GLKzRQ7v5kg= dependencies: anymatch "^1.3.0" browserify "^13.0.0" chokidar "^1.0.0" defined "^1.0.0" outpipe "^1.1.0" through2 "^2.0.0" xtend "^4.0.0" wd@0.3.11: version "0.3.11" resolved "https://registry.yarnpkg.com/wd/-/wd-0.3.11.tgz#522716c79a7a10e781acbb2c6cafe588f701fcc0" integrity sha1-UicWx5p6EOeBrLssbK/liPcB/MA= dependencies: archiver "~0.12.0" async "~0.9.0" lodash "~2.4.1" q "~1.0.1" request "~2.46.0" underscore.string "~2.3.3" vargs "~0.1.0" webidl-conversions@^3.0.0: version "3.0.1" resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-3.0.1.tgz#24534275e2a7bc6be7bc86611cc16ae0a5654871" integrity sha1-JFNCdeKnvGvnvIZhHMFq4KVlSHE= whatwg-url@^5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-5.0.0.tgz#966454e8765462e37644d3626f6742ce8b70965d" integrity sha1-lmRU6HZUYuN2RNNib2dCzotwll0= dependencies: tr46 "~0.0.3" webidl-conversions "^3.0.0" which-boxed-primitive@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz#13757bc89b209b049fe5d86430e21cf40a89a8e6" integrity sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg== dependencies: is-bigint "^1.0.1" is-boolean-object "^1.1.0" is-number-object "^1.0.4" is-string "^1.0.5" is-symbol "^1.0.3" which-module@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.0.tgz#d9ef07dce77b9902b8a3a8fa4b31c3e3f7e6e87a" integrity sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho= which-typed-array@^1.1.2: version "1.1.7" resolved "https://registry.yarnpkg.com/which-typed-array/-/which-typed-array-1.1.7.tgz#2761799b9a22d4b8660b3c1b40abaa7739691793" integrity sha512-vjxaB4nfDqwKI0ws7wZpxIlde1XrLX5uB0ZjpfshgmapJMD7jJWhZI+yToJTqaFByF0eNBcYxbjmCzoRP7CfEw== dependencies: available-typed-arrays "^1.0.5" call-bind "^1.0.2" es-abstract "^1.18.5" foreach "^2.0.5" has-tostringtag "^1.0.0" is-typed-array "^1.1.7" which@1.0.x: version "1.0.9" resolved "https://registry.yarnpkg.com/which/-/which-1.0.9.tgz#460c1da0f810103d0321a9b633af9e575e64486f" integrity sha1-RgwdoPgQED0DIam2M6+eV15kSG8= which@1.3.1, which@^1.1.1: version "1.3.1" resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ== dependencies: isexe "^2.0.0" which@^2.0.1: version "2.0.2" resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== dependencies: isexe "^2.0.0" wide-align@1.1.3: version "1.1.3" resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.3.tgz#ae074e6bdc0c14a431e804e624549c633b000457" integrity sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA== dependencies: string-width "^1.0.2 || 2" word-wrap@^1.2.3, word-wrap@~1.2.3: version "1.2.3" resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.3.tgz#610636f6b1f703891bd34771ccb17fb93b47079c" integrity sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ== wordwrap@0.0.x, wordwrap@~0.0.2: version "0.0.3" resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-0.0.3.tgz#a3d5da6cd5c0bc0008d37234bbaf1bed63059107" integrity sha1-o9XabNXAvAAI03I0u68b7WMFkQc= wordwrap@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-1.0.0.tgz#27584810891456a4171c8d0226441ade90cbcaeb" integrity sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus= wrap-ansi@^5.1.0: version "5.1.0" resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-5.1.0.tgz#1fd1f67235d5b6d0fee781056001bfb694c03b09" integrity sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q== dependencies: ansi-styles "^3.2.0" string-width "^3.0.0" strip-ansi "^5.0.0" wrap-ansi@^6.2.0: version "6.2.0" resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-6.2.0.tgz#e9393ba07102e6c91a3b221478f0257cd2856e53" integrity sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA== dependencies: ansi-styles "^4.0.0" string-width "^4.1.0" strip-ansi "^6.0.0" wrap-ansi@^7.0.0: version "7.0.0" resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== dependencies: ansi-styles "^4.0.0" string-width "^4.1.0" strip-ansi "^6.0.0" wrap-comment@^1.0.0, wrap-comment@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/wrap-comment/-/wrap-comment-1.0.1.tgz#941bb1400b9b590bc007599e79cacc0bb3ea62f3" integrity sha512-APccrMwl/ont0RHFTXNAQfM647duYYEfs6cngrIyTByTI0xbWnDnPSptFZhS68L4WCjt2ZxuhCFwuY6Pe88KZQ== wrapped@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/wrapped/-/wrapped-1.0.1.tgz#c783d9d807b273e9b01e851680a938c87c907242" integrity sha1-x4PZ2Aeyc+mwHoUWgKk4yHyQckI= dependencies: co "3.1.0" sliced "^1.0.1" wrappy@1: version "1.0.2" resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8= wrench@~1.5.1: version "1.5.9" resolved "https://registry.yarnpkg.com/wrench/-/wrench-1.5.9.tgz#411691c63a9b2531b1700267279bdeca23b2142a" integrity sha1-QRaRxjqbJTGxcAJnJ5veyiOyFCo= write-file-atomic@^3.0.0: version "3.0.3" resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-3.0.3.tgz#56bd5c5a5c70481cd19c571bd39ab965a5de56e8" integrity sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q== dependencies: imurmurhash "^0.1.4" is-typedarray "^1.0.0" signal-exit "^3.0.2" typedarray-to-buffer "^3.1.5" xml2js@~0.4.0: version "0.4.23" resolved "https://registry.yarnpkg.com/xml2js/-/xml2js-0.4.23.tgz#a0c69516752421eb2ac758ee4d4ccf58843eac66" integrity sha512-ySPiMjM0+pLDftHgXY4By0uswI3SPKLDw/i3UXbnO8M/p28zqexCUoPmQFrYD+/1BzhGJSs2i1ERWKJAtiLrug== dependencies: sax ">=0.6.0" xmlbuilder "~11.0.0" xmlbuilder@~11.0.0: version "11.0.1" resolved "https://registry.yarnpkg.com/xmlbuilder/-/xmlbuilder-11.0.1.tgz#be9bae1c8a046e76b31127726347d0ad7002beb3" integrity sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA== xo@^0.47.0: version "0.47.0" resolved "https://registry.yarnpkg.com/xo/-/xo-0.47.0.tgz#6653bb3693c786e3b409e7271e9522bf9ff6c765" integrity sha512-QHRIpaPSG7tK7PX4K4fqe0V4EH1u2IkM7Pr356u1fKcVsZskw7i9gfEqyBLsnnc4e4Y8gnLtIqasLJsGPqM8sA== dependencies: "@eslint/eslintrc" "^1.0.4" "@typescript-eslint/eslint-plugin" "^5.4.0" "@typescript-eslint/parser" "^5.4.0" arrify "^3.0.0" cosmiconfig "^7.0.1" define-lazy-prop "^3.0.0" eslint "^8.3.0" eslint-config-prettier "^8.3.0" eslint-config-xo "^0.39.0" eslint-config-xo-typescript "^0.47.1" eslint-formatter-pretty "^4.1.0" eslint-import-resolver-webpack "^0.13.2" eslint-plugin-ava "^13.1.0" eslint-plugin-eslint-comments "^3.2.0" eslint-plugin-import "^2.25.3" eslint-plugin-no-use-extend-native "^0.5.0" eslint-plugin-node "^11.1.0" eslint-plugin-prettier "^4.0.0" eslint-plugin-unicorn "^39.0.0" esm-utils "^2.0.0" find-cache-dir "^3.3.2" find-up "^6.2.0" get-stdin "^9.0.0" globby "^12.0.2" imurmurhash "^0.1.4" json-stable-stringify-without-jsonify "^1.0.1" json5 "^2.2.0" lodash-es "^4.17.21" meow "^10.1.2" micromatch "^4.0.4" open-editor "^4.0.0" prettier "^2.5.0" semver "^7.3.5" slash "^4.0.0" to-absolute-glob "^2.0.2" typescript "^4.5.2" xtend@2.1.2: version "2.1.2" resolved "https://registry.yarnpkg.com/xtend/-/xtend-2.1.2.tgz#6efecc2a4dad8e6962c4901b337ce7ba87b5d28b" integrity sha1-bv7MKk2tjmlixJAbM3znuoe10os= dependencies: object-keys "~0.4.0" xtend@^4.0.0, xtend@^4.0.1, xtend@^4.0.2, xtend@~4.0.1: version "4.0.2" resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.2.tgz#bb72779f5fa465186b1f438f674fa347fdb5db54" integrity sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ== y18n@^4.0.0: version "4.0.3" resolved "https://registry.yarnpkg.com/y18n/-/y18n-4.0.3.tgz#b5f259c82cd6e336921efd7bfd8bf560de9eeedf" integrity sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ== y18n@^5.0.5: version "5.0.8" resolved "https://registry.yarnpkg.com/y18n/-/y18n-5.0.8.tgz#7f4934d0f7ca8c56f95314939ddcd2dd91ce1d55" integrity sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA== yallist@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72" integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== yaml@^1.10.0, yaml@^1.10.2: version "1.10.2" resolved "https://registry.yarnpkg.com/yaml/-/yaml-1.10.2.tgz#2301c5ffbf12b467de8da2333a459e29e7920e4b" integrity sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg== yamljs@0.2.8: version "0.2.8" resolved "https://registry.yarnpkg.com/yamljs/-/yamljs-0.2.8.tgz#ef23fb006e62f6ae07b406aa2a949561f336ea5c" integrity sha1-7yP7AG5i9q4HtAaqKpSVYfM26lw= dependencies: argparse "^1.0.7" glob "^7.0.5" yargs-parser@13.1.1: version "13.1.1" resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-13.1.1.tgz#d26058532aa06d365fe091f6a1fc06b2f7e5eca0" integrity sha512-oVAVsHz6uFrg3XQheFII8ESO2ssAf9luWuAd6Wexsu4F3OtIW0o8IribPXYrD4WC24LWtPrJlGy87y5udK+dxQ== dependencies: camelcase "^5.0.0" decamelize "^1.2.0" yargs-parser@^13.1.1, yargs-parser@^13.1.2: version "13.1.2" resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-13.1.2.tgz#130f09702ebaeef2650d54ce6e3e5706f7a4fb38" integrity sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg== dependencies: camelcase "^5.0.0" decamelize "^1.2.0" yargs-parser@^18.1.2: version "18.1.3" resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-18.1.3.tgz#be68c4975c6b2abf469236b0c870362fab09a7b0" integrity sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ== dependencies: camelcase "^5.0.0" decamelize "^1.2.0" yargs-parser@^20.2.3, yargs-parser@^20.2.9: version "20.2.9" resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.9.tgz#2eb7dc3b0289718fc295f362753845c41a0c94ee" integrity sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w== yargs-parser@^21.0.0: version "21.0.0" resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-21.0.0.tgz#a485d3966be4317426dd56bdb6a30131b281dc55" integrity sha512-z9kApYUOCwoeZ78rfRYYWdiU/iNL6mwwYlkkZfJoyMR1xps+NEBX5X7XmRpxkZHhXJ6+Ey00IwKxBBSW9FIjyA== yargs-unparser@1.6.0: version "1.6.0" resolved "https://registry.yarnpkg.com/yargs-unparser/-/yargs-unparser-1.6.0.tgz#ef25c2c769ff6bd09e4b0f9d7c605fb27846ea9f" integrity sha512-W9tKgmSn0DpSatfri0nx52Joq5hVXgeLiqR/5G0sZNDoLZFOr/xjBUDcShCOGNsBnEMNo1KAMBkTej1Hm62HTw== dependencies: flat "^4.1.0" lodash "^4.17.15" yargs "^13.3.0" yargs@13.3.0: version "13.3.0" resolved "https://registry.yarnpkg.com/yargs/-/yargs-13.3.0.tgz#4c657a55e07e5f2cf947f8a366567c04a0dedc83" integrity sha512-2eehun/8ALW8TLoIl7MVaRUrg+yCnenu8B4kBlRxj3GJGDKU1Og7sMXPNm1BYyM1DOJmTZ4YeN/Nwxv+8XJsUA== dependencies: cliui "^5.0.0" find-up "^3.0.0" get-caller-file "^2.0.1" require-directory "^2.1.1" require-main-filename "^2.0.0" set-blocking "^2.0.0" string-width "^3.0.0" which-module "^2.0.0" y18n "^4.0.0" yargs-parser "^13.1.1" yargs@^13.3.0: version "13.3.2" resolved "https://registry.yarnpkg.com/yargs/-/yargs-13.3.2.tgz#ad7ffefec1aa59565ac915f82dccb38a9c31a2dd" integrity sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw== dependencies: cliui "^5.0.0" find-up "^3.0.0" get-caller-file "^2.0.1" require-directory "^2.1.1" require-main-filename "^2.0.0" set-blocking "^2.0.0" string-width "^3.0.0" which-module "^2.0.0" y18n "^4.0.0" yargs-parser "^13.1.2" yargs@^15.0.2: version "15.4.1" resolved "https://registry.yarnpkg.com/yargs/-/yargs-15.4.1.tgz#0d87a16de01aee9d8bec2bfbf74f67851730f4f8" integrity sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A== dependencies: cliui "^6.0.0" decamelize "^1.2.0" find-up "^4.1.0" get-caller-file "^2.0.1" require-directory "^2.1.1" require-main-filename "^2.0.0" set-blocking "^2.0.0" string-width "^4.2.0" which-module "^2.0.0" y18n "^4.0.0" yargs-parser "^18.1.2" yargs@^17.0.0: version "17.3.1" resolved "https://registry.yarnpkg.com/yargs/-/yargs-17.3.1.tgz#da56b28f32e2fd45aefb402ed9c26f42be4c07b9" integrity sha512-WUANQeVgjLbNsEmGk20f+nlHgOqzRFpiGWVaBrYGYIGANIIu3lWjoyi0fNlFmJkvfhCZ6BXINe7/W2O2bV4iaA== dependencies: cliui "^7.0.2" escalade "^3.1.1" get-caller-file "^2.0.5" require-directory "^2.1.1" string-width "^4.2.3" y18n "^5.0.5" yargs-parser "^21.0.0" yn@3.1.1: version "3.1.1" resolved "https://registry.yarnpkg.com/yn/-/yn-3.1.1.tgz#1e87401a09d767c1d5eab26a6e4c185182d2eb50" integrity sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q== yocto-queue@^0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b" integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q== yocto-queue@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-1.0.0.tgz#7f816433fb2cbc511ec8bf7d263c3b58a1a3c251" integrity sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g== zip-stream@~0.2.0: version "0.2.3" resolved "https://registry.yarnpkg.com/zip-stream/-/zip-stream-0.2.3.tgz#aef095376cfe138959a81341981d26338b46d8d3" integrity sha1-rvCVN2z+E4lZqBNBmB0mM4tG2NM= dependencies: debug "~0.7.4" lodash.defaults "~2.4.1" readable-stream "~1.0.24" zip-stream@~0.4.0: version "0.4.1" resolved "https://registry.yarnpkg.com/zip-stream/-/zip-stream-0.4.1.tgz#4ea795a8ce19e9fab49a31d1d0877214159f03a3" integrity sha1-TqeVqM4Z6fq0mjHR0IdyFBWfA6M= dependencies: compress-commons "~0.1.0" lodash "~2.4.1" readable-stream "~1.0.26" zip-stream@~0.5.0: version "0.5.2" resolved "https://registry.yarnpkg.com/zip-stream/-/zip-stream-0.5.2.tgz#32dcbc506d0dab4d21372625bd7ebaac3c2fff56" integrity sha1-Mty8UG0Nq00hNyYlvX66rDwv/1Y= dependencies: compress-commons "~0.2.0" lodash "~3.2.0" readable-stream "~1.0.26" zuul-localtunnel@1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/zuul-localtunnel/-/zuul-localtunnel-1.1.0.tgz#70ad27fb0a6af968a2151fc5d5e895daa1aed15d" integrity sha1-cK0n+wpq+WiiFR/F1eiV2qGu0V0= dependencies: localtunnel "1.5.0" zuul@^3.12.0: version "3.12.0" resolved "https://registry.yarnpkg.com/zuul/-/zuul-3.12.0.tgz#2ba48310588e173d74e61a9e51cf01e7cfe53e4d" integrity sha512-ABOM+J+get8DsLXmFmCUjJOwxZILsedXZ0+bJnG9ajmDhVmtLqaUPJ9NEardYzSHxq6Vxi5qXf4mluA7PePq/A== dependencies: JSON2 "0.1.0" batch "0.5.0" browserify "13.0.0" browserify-istanbul "0.1.5" char-split "0.2.0" colors "0.6.2" commander "2.1.0" compression "1.5.0" convert-source-map "1.0.0" debug "2.1.0" express "3.4.8" express-state "1.0.3" find-nearest-file "1.0.0" firefox-profile "0.2.7" globs-to-files "1.0.0" hbs "2.4.0" highlight.js "7.5.0" http-proxy "1.11.2" humanize-duration "2.4.0" istanbul-middleware "0.2.2" load-script "0.0.5" lodash "3.10.1" opener "1.4.0" osenv "0.0.3" shallow-copy "0.0.1" shell-quote "1.4.1" stack-mapper "0.2.2" stacktrace-js "1.3.1" superagent "0.15.7" tap-finished "0.0.1" tap-parser "0.7.0" watchify "3.7.0" wd "0.3.11" xtend "2.1.2" yamljs "0.2.8" zuul-localtunnel "1.1.0" zwitch@^1.0.0: version "1.0.5" resolved "https://registry.yarnpkg.com/zwitch/-/zwitch-1.0.5.tgz#d11d7381ffed16b742f6af7b3f223d5cd9fe9920" integrity sha512-V50KMwwzqJV0NpZIZFwfOD5/lyny3WlSzRiXgA0G7VUnRlqttta1L6UQIHzd6EuBY/cHGfwTIck7w1yH6Q5zUw== zwitch@^2.0.0: version "2.0.2" resolved "https://registry.yarnpkg.com/zwitch/-/zwitch-2.0.2.tgz#91f8d0e901ffa3d66599756dde7f57b17c95dce1" integrity sha512-JZxotl7SxAJH0j7dN4pxsTV6ZLXoLdGME+PsjkL/DaBrVryK9kTGq06GfKrwcSOqypP+fdXGoCHE36b99fWVoA==