From 88072cefbb03ad8dc05a2e20e8d9b530e508f0b1 Mon Sep 17 00:00:00 2001 From: Gregor Martynus <39992+gr2m@users.noreply.github.com> Date: Fri, 3 Dec 2021 22:54:26 -0800 Subject: [PATCH 01/59] build(package): lock file --- package-lock.json | 1511 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 1511 insertions(+) create mode 100644 package-lock.json diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..1376016 --- /dev/null +++ b/package-lock.json @@ -0,0 +1,1511 @@ +{ + "name": "mitm", + "version": "1.7.2", + "lockfileVersion": 2, + "requires": true, + "packages": { + "": { + "name": "mitm", + "version": "1.7.2", + "dependencies": { + "semver": ">= 5 < 6", + "underscore": ">= 1.1.6 < 1.14" + }, + "devDependencies": { + "mocha": ">= 1.12.0 < 3", + "must": ">= 0.13 < 0.14", + "sinon": ">= 1.9 < 2" + }, + "engines": { + "node": ">= 0.10.24" + } + }, + "node_modules/available-typed-arrays": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz", + "integrity": "sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/call-bind": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/commander": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.3.0.tgz", + "integrity": "sha1-/UMOiJgy7DU7ms0d4hfBHLPu+HM=", + "dev": true, + "engines": { + "node": ">= 0.6.x" + } + }, + "node_modules/debug": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.2.0.tgz", + "integrity": "sha1-+HBX6ZWxofauaklgZkE3vFbwOdo=", + "dev": true, + "dependencies": { + "ms": "0.7.1" + } + }, + "node_modules/define-properties": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", + "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", + "dev": true, + "dependencies": { + "object-keys": "^1.0.12" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/diff": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-1.4.0.tgz", + "integrity": "sha1-fyjS657nsVqX79ic5j3P2qPMur8=", + "dev": true, + "engines": { + "node": ">=0.3.1" + } + }, + "node_modules/egal": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/egal/-/egal-1.3.0.tgz", + "integrity": "sha1-IKGc+oDOlzP4QTY10AQmQfQpGHs=", + "dev": true, + "dependencies": { + "kindof": ">= 2.0.0 < 3" + } + }, + "node_modules/es-abstract": { + "version": "1.19.1", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.19.1.tgz", + "integrity": "sha512-2vJ6tjA/UfqLm2MPs7jxVybLoB8i1t1Jd9R3kISld20sIxPcTbLuggQOUxeWeAvIUkduv/CfMjuh4WmiXr2v9w==", + "dev": true, + "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" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/es-to-primitive": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", + "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", + "dev": true, + "dependencies": { + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/escape-string-regexp": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.2.tgz", + "integrity": "sha1-Tbwv5nTnGUnK8/smlc5/LcHZqNE=", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/foreach": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/foreach/-/foreach-2.0.5.tgz", + "integrity": "sha1-C+4AUBiusmDQo6865ljdATbsG5k=", + "dev": true + }, + "node_modules/formatio": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/formatio/-/formatio-1.1.1.tgz", + "integrity": "sha1-XtPM1jZVEJc4NGXZlhmRAOhhYek=", + "deprecated": "This package is unmaintained. Use @sinonjs/formatio instead", + "dev": true, + "dependencies": { + "samsam": "~1.1" + } + }, + "node_modules/function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", + "dev": true + }, + "node_modules/get-intrinsic": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.1.tgz", + "integrity": "sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-symbol-description": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz", + "integrity": "sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/glob": { + "version": "3.2.11", + "resolved": "https://registry.npmjs.org/glob/-/glob-3.2.11.tgz", + "integrity": "sha1-Spc/Y1uRkPcV0QmH1cAP0oFevj0=", + "dev": true, + "dependencies": { + "inherits": "2", + "minimatch": "0.3" + }, + "engines": { + "node": "*" + } + }, + "node_modules/growl": { + "version": "1.9.2", + "resolved": "https://registry.npmjs.org/growl/-/growl-1.9.2.tgz", + "integrity": "sha1-Dqd0NxXbjY3ixe3hd14bRayFwC8=", + "dev": true + }, + "node_modules/has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.1" + }, + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/has-bigints": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.1.tgz", + "integrity": "sha512-LSBS2LjbNBTf6287JEbEzvJgftkF5qFkmCo9hDRpAzKhUOlJ+hx8dd4USs00SgsUNwc4617J9ki5YtEClM2ffA==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-symbols": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.2.tgz", + "integrity": "sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-tostringtag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", + "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", + "dev": true, + "dependencies": { + "has-symbols": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true + }, + "node_modules/internal-slot": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.3.tgz", + "integrity": "sha512-O0DB1JC/sPyZl7cIo78n5dR7eUSwwpYPiXRhTzNxZVAMUuB8vlnRFyLxdrVToks6XPLVnFfbzaVd5WLjhgg+vA==", + "dev": true, + "dependencies": { + "get-intrinsic": "^1.1.0", + "has": "^1.0.3", + "side-channel": "^1.0.4" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/is-arguments": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz", + "integrity": "sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-bigint": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", + "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", + "dev": true, + "dependencies": { + "has-bigints": "^1.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-boolean-object": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", + "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-callable": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.4.tgz", + "integrity": "sha512-nsuwtxZfMX67Oryl9LCQ+upnC0Z0BgpwntpS89m1H/TLF0zNfzfLMV/9Wa/6MZsj0acpEjAO0KF1xT6ZdLl95w==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-date-object": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", + "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", + "dev": true, + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-generator-function": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.10.tgz", + "integrity": "sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==", + "dev": true, + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-negative-zero": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.1.tgz", + "integrity": "sha512-2z6JzQvZRa9A2Y7xC6dQQm4FSTSTNWjKIYYTt4246eMTJmIo0Q+ZyOsU66X8lxK1AbB92dFeglPLrhwpeRKO6w==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-number-object": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.6.tgz", + "integrity": "sha512-bEVOqiRcvo3zO1+G2lVMy+gkkEm9Yh7cDMRusKKu5ZJKPUYSJwICTKZrNKHA2EbSP0Tu0+6B/emsYNHZyn6K8g==", + "dev": true, + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-regex": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", + "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-shared-array-buffer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.1.tgz", + "integrity": "sha512-IU0NmyknYZN0rChcKhRO1X8LYz5Isj/Fsqh8NJOSf+N/hCOTwy29F32Ik7a+QszE63IdvmwdTPDd6cZ5pg4cwA==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-string": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", + "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", + "dev": true, + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-symbol": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", + "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", + "dev": true, + "dependencies": { + "has-symbols": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-typed-array": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.8.tgz", + "integrity": "sha512-HqH41TNZq2fgtGT8WHVFVJhBVGuY3AnP3Q36K8JKXUxSxRgk/d+7NjmwG2vo2mYmXK8UYZKu0qH8bVP5gEisjA==", + "dev": true, + "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" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-weakref": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.1.tgz", + "integrity": "sha512-b2jKc2pQZjaeFYWEf7ScFj+Be1I+PXmlu572Q8coTXZ+LD/QQZ7ShPMst8h16riVgyXTQwUsFEl74mDvc/3MHQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/jade": { + "version": "0.26.3", + "resolved": "https://registry.npmjs.org/jade/-/jade-0.26.3.tgz", + "integrity": "sha1-jxDXl32NefL2/4YqgbBRPMslaGw=", + "deprecated": "Jade has been renamed to pug, please install the latest version of pug instead of jade", + "dev": true, + "dependencies": { + "commander": "0.6.1", + "mkdirp": "0.3.0" + }, + "bin": { + "jade": "bin/jade" + } + }, + "node_modules/jade/node_modules/commander": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-0.6.1.tgz", + "integrity": "sha1-+mihT2qUXVTbvlDYzbMyDp47GgY=", + "dev": true, + "engines": { + "node": ">= 0.4.x" + } + }, + "node_modules/jade/node_modules/mkdirp": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.3.0.tgz", + "integrity": "sha1-G79asbqCevI1dRQ0kEJkVfSB/h4=", + "deprecated": "Legacy versions of mkdirp are no longer supported. Please update to mkdirp 1.x. (Note that the API surface has changed to use Promises in 1.x.)", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/json-stringify-safe": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", + "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=", + "dev": true + }, + "node_modules/kindof": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/kindof/-/kindof-2.0.0.tgz", + "integrity": "sha1-wzW69gOnfMN/i0Brc7ZGP9vfGr4=", + "dev": true + }, + "node_modules/lodash._createwrapper": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/lodash._createwrapper/-/lodash._createwrapper-3.2.0.tgz", + "integrity": "sha1-30U+ZkFjIXuJWkVAZa8cR6DqPE0=", + "dev": true, + "dependencies": { + "lodash._root": "^3.0.0" + } + }, + "node_modules/lodash._root": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/lodash._root/-/lodash._root-3.0.1.tgz", + "integrity": "sha1-+6HEUkwZ7ppfgTa0YJ8BfPTe1pI=", + "dev": true + }, + "node_modules/lodash.wrap": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/lodash.wrap/-/lodash.wrap-3.0.1.tgz", + "integrity": "sha1-P82L74Z7LsjCG6xjjYFhgFk/cas=", + "dev": true, + "dependencies": { + "lodash._createwrapper": "^3.0.0" + } + }, + "node_modules/lolex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/lolex/-/lolex-1.3.2.tgz", + "integrity": "sha1-fD2mL/yzDw9agKJWbKJORdigHzE=", + "dev": true + }, + "node_modules/lru-cache": { + "version": "2.7.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-2.7.3.tgz", + "integrity": "sha1-bUUk6LlV+V1PW1iFHOId1y+06VI=", + "dev": true + }, + "node_modules/minimatch": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-0.3.0.tgz", + "integrity": "sha1-J12O2qxPG7MyZHIInnlJyDlGmd0=", + "deprecated": "Please update to minimatch 3.0.2 or higher to avoid a RegExp DoS issue", + "dev": true, + "dependencies": { + "lru-cache": "2", + "sigmund": "~1.0.0" + }, + "engines": { + "node": "*" + } + }, + "node_modules/minimist": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", + "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", + "dev": true + }, + "node_modules/mkdirp": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", + "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", + "deprecated": "Legacy versions of mkdirp are no longer supported. Please update to mkdirp 1.x. (Note that the API surface has changed to use Promises in 1.x.)", + "dev": true, + "dependencies": { + "minimist": "0.0.8" + }, + "bin": { + "mkdirp": "bin/cmd.js" + } + }, + "node_modules/mocha": { + "version": "2.5.3", + "resolved": "https://registry.npmjs.org/mocha/-/mocha-2.5.3.tgz", + "integrity": "sha1-FhvlvetJZ3HrmzV0UFC2IrWu/Fg=", + "dev": true, + "dependencies": { + "commander": "2.3.0", + "debug": "2.2.0", + "diff": "1.4.0", + "escape-string-regexp": "1.0.2", + "glob": "3.2.11", + "growl": "1.9.2", + "jade": "0.26.3", + "mkdirp": "0.5.1", + "supports-color": "1.2.0", + "to-iso-string": "0.0.2" + }, + "bin": { + "_mocha": "bin/_mocha", + "mocha": "bin/mocha" + }, + "engines": { + "node": ">= 0.8.x" + } + }, + "node_modules/ms": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.1.tgz", + "integrity": "sha1-nNE8A62/8ltl7/3nzoZO6VIBcJg=", + "dev": true + }, + "node_modules/must": { + "version": "0.13.4", + "resolved": "https://registry.npmjs.org/must/-/must-0.13.4.tgz", + "integrity": "sha1-nROJ9FjolLKqBAMr/rekBxT3gXE=", + "dev": true, + "dependencies": { + "egal": ">= 1.3.0 < 2", + "json-stringify-safe": ">= 5 < 6", + "kindof": ">= 2.0.0 < 3", + "lodash.wrap": ">= 3 < 4", + "oolong": ">= 1.11.0 < 2" + } + }, + "node_modules/object-inspect": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.11.0.tgz", + "integrity": "sha512-jp7ikS6Sd3GxQfZJPyH3cjcbJF6GZPClgdV+EFygjFLQ5FmW/dRUnTd9PQ9k0JhoNDabWFbpF1yCdSWCC6gexg==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "dev": true, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.assign": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.2.tgz", + "integrity": "sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.0", + "define-properties": "^1.1.3", + "has-symbols": "^1.0.1", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/oolong": { + "version": "1.15.1", + "resolved": "https://registry.npmjs.org/oolong/-/oolong-1.15.1.tgz", + "integrity": "sha1-kLrJ585S9gkGqyIo2eKxFfEIbOo=", + "dev": true + }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/samsam": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/samsam/-/samsam-1.1.2.tgz", + "integrity": "sha1-vsEf3IOp/aBjQBIQ5AF2wwJNFWc=", + "deprecated": "This package has been deprecated in favour of @sinonjs/samsam", + "dev": true + }, + "node_modules/semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/side-channel": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", + "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.0", + "get-intrinsic": "^1.0.2", + "object-inspect": "^1.9.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/sigmund": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/sigmund/-/sigmund-1.0.1.tgz", + "integrity": "sha1-P/IfGYytIXX587eBhT/ZTQ0ZtZA=", + "dev": true + }, + "node_modules/sinon": { + "version": "1.17.7", + "resolved": "https://registry.npmjs.org/sinon/-/sinon-1.17.7.tgz", + "integrity": "sha1-RUKk9JugxFwF6y6d2dID4rjv4L8=", + "dev": true, + "dependencies": { + "formatio": "1.1.1", + "lolex": "1.3.2", + "samsam": "1.1.2", + "util": ">=0.10.3 <1" + }, + "engines": { + "node": ">=0.1.103" + } + }, + "node_modules/string.prototype.trimend": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.4.tgz", + "integrity": "sha512-y9xCjw1P23Awk8EvTpcyL2NIr1j7wJ39f+k6lvRnSMz+mz9CGz9NYPelDk42kOz6+ql8xjfK8oYzy3jAP5QU5A==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimstart": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.4.tgz", + "integrity": "sha512-jh6e984OBfvxS50tdY2nRZnoC5/mLFKOREQfw8t5yytkoUsJRNxvI/E39qu1sD0OtWI3OC0XgKSmcWwziwYuZw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/supports-color": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-1.2.0.tgz", + "integrity": "sha1-/x7R5hFp0Gs88tWI4YixjYhH4X4=", + "dev": true, + "bin": { + "supports-color": "cli.js" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/to-iso-string": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/to-iso-string/-/to-iso-string-0.0.2.tgz", + "integrity": "sha1-TcGeZk38y+Jb2NtQiwDG2hWCVdE=", + "deprecated": "to-iso-string has been deprecated, use @segment/to-iso-string instead.", + "dev": true + }, + "node_modules/unbox-primitive": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.1.tgz", + "integrity": "sha512-tZU/3NqK3dA5gpE1KtyiJUrEB0lxnGkMFHptJ7q6ewdZ8s12QrODwNbhIJStmJkd1QDXa1NRA8aF2A1zk/Ypyw==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.1", + "has-bigints": "^1.0.1", + "has-symbols": "^1.0.2", + "which-boxed-primitive": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/underscore": { + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.13.1.tgz", + "integrity": "sha512-hzSoAVtJF+3ZtiFX0VgfFPHEDRm7Y/QPjGyNo4TVdnDTdft3tr8hEkD25a1jC+TjTuE7tkHGKkhwCgs9dgBB2g==" + }, + "node_modules/util": { + "version": "0.12.4", + "resolved": "https://registry.npmjs.org/util/-/util-0.12.4.tgz", + "integrity": "sha512-bxZ9qtSlGUWSOy9Qa9Xgk11kSslpuZwaxCg4sNIDj6FLucDab2JxnHwyNTCpHMtK1MjoQiWQ6DiUMZYbSrO+Sw==", + "dev": true, + "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" + } + }, + "node_modules/which-boxed-primitive": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", + "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", + "dev": true, + "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" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-typed-array": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.7.tgz", + "integrity": "sha512-vjxaB4nfDqwKI0ws7wZpxIlde1XrLX5uB0ZjpfshgmapJMD7jJWhZI+yToJTqaFByF0eNBcYxbjmCzoRP7CfEw==", + "dev": true, + "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" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + } + }, + "dependencies": { + "available-typed-arrays": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz", + "integrity": "sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==", + "dev": true + }, + "call-bind": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "dev": true, + "requires": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" + } + }, + "commander": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.3.0.tgz", + "integrity": "sha1-/UMOiJgy7DU7ms0d4hfBHLPu+HM=", + "dev": true + }, + "debug": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.2.0.tgz", + "integrity": "sha1-+HBX6ZWxofauaklgZkE3vFbwOdo=", + "dev": true, + "requires": { + "ms": "0.7.1" + } + }, + "define-properties": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", + "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", + "dev": true, + "requires": { + "object-keys": "^1.0.12" + } + }, + "diff": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-1.4.0.tgz", + "integrity": "sha1-fyjS657nsVqX79ic5j3P2qPMur8=", + "dev": true + }, + "egal": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/egal/-/egal-1.3.0.tgz", + "integrity": "sha1-IKGc+oDOlzP4QTY10AQmQfQpGHs=", + "dev": true, + "requires": { + "kindof": ">= 2.0.0 < 3" + } + }, + "es-abstract": { + "version": "1.19.1", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.19.1.tgz", + "integrity": "sha512-2vJ6tjA/UfqLm2MPs7jxVybLoB8i1t1Jd9R3kISld20sIxPcTbLuggQOUxeWeAvIUkduv/CfMjuh4WmiXr2v9w==", + "dev": true, + "requires": { + "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": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", + "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", + "dev": true, + "requires": { + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" + } + }, + "escape-string-regexp": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.2.tgz", + "integrity": "sha1-Tbwv5nTnGUnK8/smlc5/LcHZqNE=", + "dev": true + }, + "foreach": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/foreach/-/foreach-2.0.5.tgz", + "integrity": "sha1-C+4AUBiusmDQo6865ljdATbsG5k=", + "dev": true + }, + "formatio": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/formatio/-/formatio-1.1.1.tgz", + "integrity": "sha1-XtPM1jZVEJc4NGXZlhmRAOhhYek=", + "dev": true, + "requires": { + "samsam": "~1.1" + } + }, + "function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", + "dev": true + }, + "get-intrinsic": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.1.tgz", + "integrity": "sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==", + "dev": true, + "requires": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1" + } + }, + "get-symbol-description": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz", + "integrity": "sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.1" + } + }, + "glob": { + "version": "3.2.11", + "resolved": "https://registry.npmjs.org/glob/-/glob-3.2.11.tgz", + "integrity": "sha1-Spc/Y1uRkPcV0QmH1cAP0oFevj0=", + "dev": true, + "requires": { + "inherits": "2", + "minimatch": "0.3" + } + }, + "growl": { + "version": "1.9.2", + "resolved": "https://registry.npmjs.org/growl/-/growl-1.9.2.tgz", + "integrity": "sha1-Dqd0NxXbjY3ixe3hd14bRayFwC8=", + "dev": true + }, + "has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dev": true, + "requires": { + "function-bind": "^1.1.1" + } + }, + "has-bigints": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.1.tgz", + "integrity": "sha512-LSBS2LjbNBTf6287JEbEzvJgftkF5qFkmCo9hDRpAzKhUOlJ+hx8dd4USs00SgsUNwc4617J9ki5YtEClM2ffA==", + "dev": true + }, + "has-symbols": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.2.tgz", + "integrity": "sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw==", + "dev": true + }, + "has-tostringtag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", + "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", + "dev": true, + "requires": { + "has-symbols": "^1.0.2" + } + }, + "inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true + }, + "internal-slot": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.3.tgz", + "integrity": "sha512-O0DB1JC/sPyZl7cIo78n5dR7eUSwwpYPiXRhTzNxZVAMUuB8vlnRFyLxdrVToks6XPLVnFfbzaVd5WLjhgg+vA==", + "dev": true, + "requires": { + "get-intrinsic": "^1.1.0", + "has": "^1.0.3", + "side-channel": "^1.0.4" + } + }, + "is-arguments": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz", + "integrity": "sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + } + }, + "is-bigint": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", + "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", + "dev": true, + "requires": { + "has-bigints": "^1.0.1" + } + }, + "is-boolean-object": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", + "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + } + }, + "is-callable": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.4.tgz", + "integrity": "sha512-nsuwtxZfMX67Oryl9LCQ+upnC0Z0BgpwntpS89m1H/TLF0zNfzfLMV/9Wa/6MZsj0acpEjAO0KF1xT6ZdLl95w==", + "dev": true + }, + "is-date-object": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", + "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", + "dev": true, + "requires": { + "has-tostringtag": "^1.0.0" + } + }, + "is-generator-function": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.10.tgz", + "integrity": "sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==", + "dev": true, + "requires": { + "has-tostringtag": "^1.0.0" + } + }, + "is-negative-zero": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.1.tgz", + "integrity": "sha512-2z6JzQvZRa9A2Y7xC6dQQm4FSTSTNWjKIYYTt4246eMTJmIo0Q+ZyOsU66X8lxK1AbB92dFeglPLrhwpeRKO6w==", + "dev": true + }, + "is-number-object": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.6.tgz", + "integrity": "sha512-bEVOqiRcvo3zO1+G2lVMy+gkkEm9Yh7cDMRusKKu5ZJKPUYSJwICTKZrNKHA2EbSP0Tu0+6B/emsYNHZyn6K8g==", + "dev": true, + "requires": { + "has-tostringtag": "^1.0.0" + } + }, + "is-regex": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", + "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + } + }, + "is-shared-array-buffer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.1.tgz", + "integrity": "sha512-IU0NmyknYZN0rChcKhRO1X8LYz5Isj/Fsqh8NJOSf+N/hCOTwy29F32Ik7a+QszE63IdvmwdTPDd6cZ5pg4cwA==", + "dev": true + }, + "is-string": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", + "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", + "dev": true, + "requires": { + "has-tostringtag": "^1.0.0" + } + }, + "is-symbol": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", + "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", + "dev": true, + "requires": { + "has-symbols": "^1.0.2" + } + }, + "is-typed-array": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.8.tgz", + "integrity": "sha512-HqH41TNZq2fgtGT8WHVFVJhBVGuY3AnP3Q36K8JKXUxSxRgk/d+7NjmwG2vo2mYmXK8UYZKu0qH8bVP5gEisjA==", + "dev": true, + "requires": { + "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-weakref": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.1.tgz", + "integrity": "sha512-b2jKc2pQZjaeFYWEf7ScFj+Be1I+PXmlu572Q8coTXZ+LD/QQZ7ShPMst8h16riVgyXTQwUsFEl74mDvc/3MHQ==", + "dev": true, + "requires": { + "call-bind": "^1.0.0" + } + }, + "jade": { + "version": "0.26.3", + "resolved": "https://registry.npmjs.org/jade/-/jade-0.26.3.tgz", + "integrity": "sha1-jxDXl32NefL2/4YqgbBRPMslaGw=", + "dev": true, + "requires": { + "commander": "0.6.1", + "mkdirp": "0.3.0" + }, + "dependencies": { + "commander": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-0.6.1.tgz", + "integrity": "sha1-+mihT2qUXVTbvlDYzbMyDp47GgY=", + "dev": true + }, + "mkdirp": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.3.0.tgz", + "integrity": "sha1-G79asbqCevI1dRQ0kEJkVfSB/h4=", + "dev": true + } + } + }, + "json-stringify-safe": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", + "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=", + "dev": true + }, + "kindof": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/kindof/-/kindof-2.0.0.tgz", + "integrity": "sha1-wzW69gOnfMN/i0Brc7ZGP9vfGr4=", + "dev": true + }, + "lodash._createwrapper": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/lodash._createwrapper/-/lodash._createwrapper-3.2.0.tgz", + "integrity": "sha1-30U+ZkFjIXuJWkVAZa8cR6DqPE0=", + "dev": true, + "requires": { + "lodash._root": "^3.0.0" + } + }, + "lodash._root": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/lodash._root/-/lodash._root-3.0.1.tgz", + "integrity": "sha1-+6HEUkwZ7ppfgTa0YJ8BfPTe1pI=", + "dev": true + }, + "lodash.wrap": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/lodash.wrap/-/lodash.wrap-3.0.1.tgz", + "integrity": "sha1-P82L74Z7LsjCG6xjjYFhgFk/cas=", + "dev": true, + "requires": { + "lodash._createwrapper": "^3.0.0" + } + }, + "lolex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/lolex/-/lolex-1.3.2.tgz", + "integrity": "sha1-fD2mL/yzDw9agKJWbKJORdigHzE=", + "dev": true + }, + "lru-cache": { + "version": "2.7.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-2.7.3.tgz", + "integrity": "sha1-bUUk6LlV+V1PW1iFHOId1y+06VI=", + "dev": true + }, + "minimatch": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-0.3.0.tgz", + "integrity": "sha1-J12O2qxPG7MyZHIInnlJyDlGmd0=", + "dev": true, + "requires": { + "lru-cache": "2", + "sigmund": "~1.0.0" + } + }, + "minimist": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", + "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", + "dev": true + }, + "mkdirp": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", + "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", + "dev": true, + "requires": { + "minimist": "0.0.8" + } + }, + "mocha": { + "version": "2.5.3", + "resolved": "https://registry.npmjs.org/mocha/-/mocha-2.5.3.tgz", + "integrity": "sha1-FhvlvetJZ3HrmzV0UFC2IrWu/Fg=", + "dev": true, + "requires": { + "commander": "2.3.0", + "debug": "2.2.0", + "diff": "1.4.0", + "escape-string-regexp": "1.0.2", + "glob": "3.2.11", + "growl": "1.9.2", + "jade": "0.26.3", + "mkdirp": "0.5.1", + "supports-color": "1.2.0", + "to-iso-string": "0.0.2" + } + }, + "ms": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.1.tgz", + "integrity": "sha1-nNE8A62/8ltl7/3nzoZO6VIBcJg=", + "dev": true + }, + "must": { + "version": "0.13.4", + "resolved": "https://registry.npmjs.org/must/-/must-0.13.4.tgz", + "integrity": "sha1-nROJ9FjolLKqBAMr/rekBxT3gXE=", + "dev": true, + "requires": { + "egal": ">= 1.3.0 < 2", + "json-stringify-safe": ">= 5 < 6", + "kindof": ">= 2.0.0 < 3", + "lodash.wrap": ">= 3 < 4", + "oolong": ">= 1.11.0 < 2" + } + }, + "object-inspect": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.11.0.tgz", + "integrity": "sha512-jp7ikS6Sd3GxQfZJPyH3cjcbJF6GZPClgdV+EFygjFLQ5FmW/dRUnTd9PQ9k0JhoNDabWFbpF1yCdSWCC6gexg==", + "dev": true + }, + "object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "dev": true + }, + "object.assign": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.2.tgz", + "integrity": "sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ==", + "dev": true, + "requires": { + "call-bind": "^1.0.0", + "define-properties": "^1.1.3", + "has-symbols": "^1.0.1", + "object-keys": "^1.1.1" + } + }, + "oolong": { + "version": "1.15.1", + "resolved": "https://registry.npmjs.org/oolong/-/oolong-1.15.1.tgz", + "integrity": "sha1-kLrJ585S9gkGqyIo2eKxFfEIbOo=", + "dev": true + }, + "safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true + }, + "samsam": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/samsam/-/samsam-1.1.2.tgz", + "integrity": "sha1-vsEf3IOp/aBjQBIQ5AF2wwJNFWc=", + "dev": true + }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" + }, + "side-channel": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", + "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "dev": true, + "requires": { + "call-bind": "^1.0.0", + "get-intrinsic": "^1.0.2", + "object-inspect": "^1.9.0" + } + }, + "sigmund": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/sigmund/-/sigmund-1.0.1.tgz", + "integrity": "sha1-P/IfGYytIXX587eBhT/ZTQ0ZtZA=", + "dev": true + }, + "sinon": { + "version": "1.17.7", + "resolved": "https://registry.npmjs.org/sinon/-/sinon-1.17.7.tgz", + "integrity": "sha1-RUKk9JugxFwF6y6d2dID4rjv4L8=", + "dev": true, + "requires": { + "formatio": "1.1.1", + "lolex": "1.3.2", + "samsam": "1.1.2", + "util": ">=0.10.3 <1" + } + }, + "string.prototype.trimend": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.4.tgz", + "integrity": "sha512-y9xCjw1P23Awk8EvTpcyL2NIr1j7wJ39f+k6lvRnSMz+mz9CGz9NYPelDk42kOz6+ql8xjfK8oYzy3jAP5QU5A==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3" + } + }, + "string.prototype.trimstart": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.4.tgz", + "integrity": "sha512-jh6e984OBfvxS50tdY2nRZnoC5/mLFKOREQfw8t5yytkoUsJRNxvI/E39qu1sD0OtWI3OC0XgKSmcWwziwYuZw==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3" + } + }, + "supports-color": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-1.2.0.tgz", + "integrity": "sha1-/x7R5hFp0Gs88tWI4YixjYhH4X4=", + "dev": true + }, + "to-iso-string": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/to-iso-string/-/to-iso-string-0.0.2.tgz", + "integrity": "sha1-TcGeZk38y+Jb2NtQiwDG2hWCVdE=", + "dev": true + }, + "unbox-primitive": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.1.tgz", + "integrity": "sha512-tZU/3NqK3dA5gpE1KtyiJUrEB0lxnGkMFHptJ7q6ewdZ8s12QrODwNbhIJStmJkd1QDXa1NRA8aF2A1zk/Ypyw==", + "dev": true, + "requires": { + "function-bind": "^1.1.1", + "has-bigints": "^1.0.1", + "has-symbols": "^1.0.2", + "which-boxed-primitive": "^1.0.2" + } + }, + "underscore": { + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.13.1.tgz", + "integrity": "sha512-hzSoAVtJF+3ZtiFX0VgfFPHEDRm7Y/QPjGyNo4TVdnDTdft3tr8hEkD25a1jC+TjTuE7tkHGKkhwCgs9dgBB2g==" + }, + "util": { + "version": "0.12.4", + "resolved": "https://registry.npmjs.org/util/-/util-0.12.4.tgz", + "integrity": "sha512-bxZ9qtSlGUWSOy9Qa9Xgk11kSslpuZwaxCg4sNIDj6FLucDab2JxnHwyNTCpHMtK1MjoQiWQ6DiUMZYbSrO+Sw==", + "dev": true, + "requires": { + "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" + } + }, + "which-boxed-primitive": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", + "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", + "dev": true, + "requires": { + "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-typed-array": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.7.tgz", + "integrity": "sha512-vjxaB4nfDqwKI0ws7wZpxIlde1XrLX5uB0ZjpfshgmapJMD7jJWhZI+yToJTqaFByF0eNBcYxbjmCzoRP7CfEw==", + "dev": true, + "requires": { + "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" + } + } + } +} From 87c7121b2d1f44ab8998dc99a37ad4e7feef4865 Mon Sep 17 00:00:00 2001 From: Gregor Martynus <39992+gr2m@users.noreply.github.com> Date: Fri, 3 Dec 2021 22:57:25 -0800 Subject: [PATCH 02/59] build: remove `Makefile` --- Makefile | 36 ------------------------------------ 1 file changed, 36 deletions(-) delete mode 100644 Makefile diff --git a/Makefile b/Makefile deleted file mode 100644 index 5f4cfb7..0000000 --- a/Makefile +++ /dev/null @@ -1,36 +0,0 @@ -NODE = node -NODE_OPTS = -TEST_OPTS = - -love: - @echo "Feel like makin' love." - -test: - @$(NODE) $(NODE_OPTS) ./node_modules/.bin/_mocha -R dot $(TEST_OPTS) - -spec: - @$(NODE) $(NODE_OPTS) ./node_modules/.bin/_mocha -R spec $(TEST_OPTS) - -autotest: - @$(NODE) $(NODE_OPTS) ./node_modules/.bin/_mocha -R dot --watch $(TEST_OPTS) - -autospec: - @$(NODE) $(NODE_OPTS) ./node_modules/.bin/_mocha -R spec --watch $(TEST_OPTS) - -pack: - @file=$$(npm pack); echo "$$file"; tar tf "$$file" - -publish: - npm publish - -tag: - git tag "v$$($(NODE) -e 'console.log(require("./package").version)')" - -clean: - rm -f *.tgz - npm prune --production - -.PHONY: love -.PHONY: test spec autotest autospec -.PHONY: pack publish tag -.PHONY: clean From b7a97e1f35ed59ca336cc7c348b56ffe013bc261 Mon Sep 17 00:00:00 2001 From: Gregor Martynus <39992+gr2m@users.noreply.github.com> Date: Fri, 3 Dec 2021 22:58:01 -0800 Subject: [PATCH 03/59] build: remove `.travis.yml` --- .travis.yml | 89 ----------------------------------------------------- 1 file changed, 89 deletions(-) delete mode 100644 .travis.yml diff --git a/.travis.yml b/.travis.yml deleted file mode 100644 index 57552ec..0000000 --- a/.travis.yml +++ /dev/null @@ -1,89 +0,0 @@ -language: node_js - -node_js: - - "node" - - "0.10" - - "0.11.13" - - # v0.11.14 changed ReadableStream.prototype.resume. Also introduced writing - # binary strings. - - "0.11.14" - - "0.11" - - "0.12" - - "4" - - "5" - - "6.0.0" - - "6.3" - - # v6.4 introduced writing latin1 strings. - - "6.4.0" - - "6" - - # v7 changed the internal _normalizeConnectArgs's function name. - - "7.0.0" - - "7" - - "11.8" - - "8.11" - - # v8.12 revamped parts of HTTP parsing. - - "8.12.0" - - "8" - - "9.5" - - # v9.6 revamped parts of HTTP parsing just like v8.12. - - "9.6.0" - - "9" - - # Node v10 requires InternalSocket.prototype.writev. - - "10.0.0" - - "10.15.0" - - # Node v10.15.1 requires InternalSocket.prototype.shutdown. - - "10.15.1" - - "10" - - "11.0.0" - - # v11.1 changed onStreamRead in stream_base_commons.js to get the byte count - # through a global structure. - - "11.1.0" - - # v11.2 requires InternalSocket.prototype.shutdown. - - "11.2.0" - - "11.7" - - # v11.8 requires InternalSocket.prototype.shutdown to return "0". - - "11.8.0" - - "11" - - "12.0.0" - - "12.3" - - # v12.4 changed decoding the server response buffer to UCS-2 by no longer - # returning a string with 2 little-endian bytes in a String. - # Then again, this could be https://github.com/nodejs/node/pull/27936. - - "12.4" - - "12.16.2" - - # v12.16.3 changed something in InternalSocket.prototype.shutdown or possibly - # WritableStream.prototype.end causing the "close" event to not be emitted. - # https://github.com/moll/node-mitm/issues/66 - - "12.16.3" - - "12" - - "13" - - "14" - - "15" - - "16" - - # IO.js required TlsSocket.prototype.getSession. - - "iojs" - - "iojs-v2.4.0" - - "iojs-v3.2.0" - -# NPM < v3.10.10 fails with "Error: Missing required argument #1" in -# npm/lib/fetch-package-metadata.js:31:3. -before_install: > - if [[ "$(npm --version)" = 3.* ]] && [[ "$(npm --version)" != 3.10.10 ]]; then - npm install --global npm@3 - fi - -notifications: - email: ["andri@dot.ee"] From 9cf59a646797806dc130f606a66c5ce0afd7e426 Mon Sep 17 00:00:00 2001 From: Gregor Martynus <39992+gr2m@users.noreply.github.com> Date: Fri, 3 Dec 2021 22:58:23 -0800 Subject: [PATCH 04/59] build: remove `.npmignore` --- .npmignore | 3 --- 1 file changed, 3 deletions(-) delete mode 100644 .npmignore diff --git a/.npmignore b/.npmignore deleted file mode 100644 index bb89eb0..0000000 --- a/.npmignore +++ /dev/null @@ -1,3 +0,0 @@ -/*.tgz -/tags -/.travis.yml From 78a6a5779b35772e5a8bdc3b8cb2e04d4bd320dc Mon Sep 17 00:00:00 2001 From: Gregor Martynus <39992+gr2m@users.noreply.github.com> Date: Fri, 3 Dec 2021 22:58:44 -0800 Subject: [PATCH 05/59] build: remove `.editorconfig` --- .editorconfig | 8 -------- 1 file changed, 8 deletions(-) delete mode 100644 .editorconfig diff --git a/.editorconfig b/.editorconfig deleted file mode 100644 index a50b250..0000000 --- a/.editorconfig +++ /dev/null @@ -1,8 +0,0 @@ -root = true - -[Makefile] -indent_style = tab - -[*.js] -indent_style = space -indent_size = 2 From 86cf7b101855997852c67604e236a9a3ecb02771 Mon Sep 17 00:00:00 2001 From: Gregor Martynus <39992+gr2m@users.noreply.github.com> Date: Fri, 3 Dec 2021 22:59:55 -0800 Subject: [PATCH 06/59] build(gitignore): -`/*.tgz` --- .gitignore | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/.gitignore b/.gitignore index f42ec36..07e6e47 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1 @@ -/node_modules/ -/*.tgz +/node_modules From 3ffce2e0c8efe36e3063973f19309ed95750897e Mon Sep 17 00:00:00 2001 From: Gregor Martynus <39992+gr2m@users.noreply.github.com> Date: Fri, 3 Dec 2021 23:01:41 -0800 Subject: [PATCH 07/59] build(scripts): test script without Makefile --- package.json | 97 ++++++++++++++++++++++++++-------------------------- 1 file changed, 48 insertions(+), 49 deletions(-) diff --git a/package.json b/package.json index 0ec6f96..5f10a61 100644 --- a/package.json +++ b/package.json @@ -1,51 +1,50 @@ { - "name": "mitm", - "version": "1.7.2", - "description": "Intercept and mock outgoing network TCP connections and HTTP requests for testing. Intercepts and gives you a Net.Socket, Http.IncomingMessage and Http.ServerResponse to test and respond with. Useful when testing code that hits remote servers.", - "keywords": [ - "http", - "https", - "intercept", - "interception", - "mock", - "network", - "socket", - "tcp", - "test", - "webmock" - ], - "homepage": "https://github.com/moll/node-mitm", - "bugs": "https://github.com/moll/node-mitm/issues", - - "author": { - "name": "Andri Möll", - "email": "andri@dot.ee", - "url": "http://themoll.com" - }, - - "repository": { - "type": "git", - "url": "git://github.com/moll/node-mitm.git" - }, - - "licenses": [{ - "type": "LAGPL", - "url": "https://github.com/moll/node-mitm/blob/master/LICENSE" - }], - - "main": "index.js", - "scripts": {"test": "make test"}, - - "dependencies": { - "underscore": ">= 1.1.6 < 1.14", - "semver": ">= 5 < 6" - }, - - "devDependencies": { - "mocha": ">= 1.12.0 < 3", - "must": ">= 0.13 < 0.14", - "sinon": ">= 1.9 < 2" - }, - - "engines": {"node": ">= 0.10.24"} + "name": "mitm", + "version": "1.7.2", + "description": "Intercept and mock outgoing network TCP connections and HTTP requests for testing. Intercepts and gives you a Net.Socket, Http.IncomingMessage and Http.ServerResponse to test and respond with. Useful when testing code that hits remote servers.", + "keywords": [ + "http", + "https", + "intercept", + "interception", + "mock", + "network", + "socket", + "tcp", + "test", + "webmock" + ], + "homepage": "https://github.com/moll/node-mitm", + "bugs": "https://github.com/moll/node-mitm/issues", + "author": { + "name": "Andri Möll", + "email": "andri@dot.ee", + "url": "http://themoll.com" + }, + "repository": { + "type": "git", + "url": "git://github.com/moll/node-mitm.git" + }, + "licenses": [ + { + "type": "LAGPL", + "url": "https://github.com/moll/node-mitm/blob/master/LICENSE" + } + ], + "main": "index.js", + "scripts": { + "test": "mocha" + }, + "dependencies": { + "underscore": ">= 1.1.6 < 1.14", + "semver": ">= 5 < 6" + }, + "devDependencies": { + "mocha": ">= 1.12.0 < 3", + "must": ">= 0.13 < 0.14", + "sinon": ">= 1.9 < 2" + }, + "engines": { + "node": ">= 0.10.24" + } } From eeae2a7d18fb3acdb2c90383fa5f0a9372501515 Mon Sep 17 00:00:00 2001 From: Gregor Martynus <39992+gr2m@users.noreply.github.com> Date: Fri, 3 Dec 2021 23:03:08 -0800 Subject: [PATCH 08/59] build(deps): `nyc` --- package.json | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/package.json b/package.json index 5f10a61..0f6f20d 100644 --- a/package.json +++ b/package.json @@ -33,15 +33,16 @@ ], "main": "index.js", "scripts": { - "test": "mocha" + "test": "nyc mocha" }, "dependencies": { - "underscore": ">= 1.1.6 < 1.14", - "semver": ">= 5 < 6" + "semver": ">= 5 < 6", + "underscore": ">= 1.1.6 < 1.14" }, "devDependencies": { "mocha": ">= 1.12.0 < 3", "must": ">= 0.13 < 0.14", + "nyc": "^15.1.0", "sinon": ">= 1.9 < 2" }, "engines": { From 5dc9c4d48a1bfc21c3a6822f145bf79d945dc310 Mon Sep 17 00:00:00 2001 From: Gregor Martynus <39992+gr2m@users.noreply.github.com> Date: Fri, 3 Dec 2021 23:03:11 -0800 Subject: [PATCH 09/59] build(package): lock file --- package-lock.json | 6184 ++++++++++++++++++++++++++++++++++----------- 1 file changed, 4675 insertions(+), 1509 deletions(-) diff --git a/package-lock.json b/package-lock.json index 1376016..ee5a270 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,1511 +1,4677 @@ { - "name": "mitm", - "version": "1.7.2", - "lockfileVersion": 2, - "requires": true, - "packages": { - "": { - "name": "mitm", - "version": "1.7.2", - "dependencies": { - "semver": ">= 5 < 6", - "underscore": ">= 1.1.6 < 1.14" - }, - "devDependencies": { - "mocha": ">= 1.12.0 < 3", - "must": ">= 0.13 < 0.14", - "sinon": ">= 1.9 < 2" - }, - "engines": { - "node": ">= 0.10.24" - } - }, - "node_modules/available-typed-arrays": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz", - "integrity": "sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==", - "dev": true, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/call-bind": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", - "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", - "dev": true, - "dependencies": { - "function-bind": "^1.1.1", - "get-intrinsic": "^1.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/commander": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.3.0.tgz", - "integrity": "sha1-/UMOiJgy7DU7ms0d4hfBHLPu+HM=", - "dev": true, - "engines": { - "node": ">= 0.6.x" - } - }, - "node_modules/debug": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.2.0.tgz", - "integrity": "sha1-+HBX6ZWxofauaklgZkE3vFbwOdo=", - "dev": true, - "dependencies": { - "ms": "0.7.1" - } - }, - "node_modules/define-properties": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", - "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", - "dev": true, - "dependencies": { - "object-keys": "^1.0.12" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/diff": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/diff/-/diff-1.4.0.tgz", - "integrity": "sha1-fyjS657nsVqX79ic5j3P2qPMur8=", - "dev": true, - "engines": { - "node": ">=0.3.1" - } - }, - "node_modules/egal": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/egal/-/egal-1.3.0.tgz", - "integrity": "sha1-IKGc+oDOlzP4QTY10AQmQfQpGHs=", - "dev": true, - "dependencies": { - "kindof": ">= 2.0.0 < 3" - } - }, - "node_modules/es-abstract": { - "version": "1.19.1", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.19.1.tgz", - "integrity": "sha512-2vJ6tjA/UfqLm2MPs7jxVybLoB8i1t1Jd9R3kISld20sIxPcTbLuggQOUxeWeAvIUkduv/CfMjuh4WmiXr2v9w==", - "dev": true, - "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" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/es-to-primitive": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", - "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", - "dev": true, - "dependencies": { - "is-callable": "^1.1.4", - "is-date-object": "^1.0.1", - "is-symbol": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/escape-string-regexp": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.2.tgz", - "integrity": "sha1-Tbwv5nTnGUnK8/smlc5/LcHZqNE=", - "dev": true, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/foreach": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/foreach/-/foreach-2.0.5.tgz", - "integrity": "sha1-C+4AUBiusmDQo6865ljdATbsG5k=", - "dev": true - }, - "node_modules/formatio": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/formatio/-/formatio-1.1.1.tgz", - "integrity": "sha1-XtPM1jZVEJc4NGXZlhmRAOhhYek=", - "deprecated": "This package is unmaintained. Use @sinonjs/formatio instead", - "dev": true, - "dependencies": { - "samsam": "~1.1" - } - }, - "node_modules/function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", - "dev": true - }, - "node_modules/get-intrinsic": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.1.tgz", - "integrity": "sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==", - "dev": true, - "dependencies": { - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.1" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/get-symbol-description": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz", - "integrity": "sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.1.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/glob": { - "version": "3.2.11", - "resolved": "https://registry.npmjs.org/glob/-/glob-3.2.11.tgz", - "integrity": "sha1-Spc/Y1uRkPcV0QmH1cAP0oFevj0=", - "dev": true, - "dependencies": { - "inherits": "2", - "minimatch": "0.3" - }, - "engines": { - "node": "*" - } - }, - "node_modules/growl": { - "version": "1.9.2", - "resolved": "https://registry.npmjs.org/growl/-/growl-1.9.2.tgz", - "integrity": "sha1-Dqd0NxXbjY3ixe3hd14bRayFwC8=", - "dev": true - }, - "node_modules/has": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", - "dev": true, - "dependencies": { - "function-bind": "^1.1.1" - }, - "engines": { - "node": ">= 0.4.0" - } - }, - "node_modules/has-bigints": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.1.tgz", - "integrity": "sha512-LSBS2LjbNBTf6287JEbEzvJgftkF5qFkmCo9hDRpAzKhUOlJ+hx8dd4USs00SgsUNwc4617J9ki5YtEClM2ffA==", - "dev": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-symbols": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.2.tgz", - "integrity": "sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw==", - "dev": true, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-tostringtag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", - "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", - "dev": true, - "dependencies": { - "has-symbols": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true - }, - "node_modules/internal-slot": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.3.tgz", - "integrity": "sha512-O0DB1JC/sPyZl7cIo78n5dR7eUSwwpYPiXRhTzNxZVAMUuB8vlnRFyLxdrVToks6XPLVnFfbzaVd5WLjhgg+vA==", - "dev": true, - "dependencies": { - "get-intrinsic": "^1.1.0", - "has": "^1.0.3", - "side-channel": "^1.0.4" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/is-arguments": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz", - "integrity": "sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-bigint": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", - "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", - "dev": true, - "dependencies": { - "has-bigints": "^1.0.1" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-boolean-object": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", - "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-callable": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.4.tgz", - "integrity": "sha512-nsuwtxZfMX67Oryl9LCQ+upnC0Z0BgpwntpS89m1H/TLF0zNfzfLMV/9Wa/6MZsj0acpEjAO0KF1xT6ZdLl95w==", - "dev": true, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-date-object": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", - "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", - "dev": true, - "dependencies": { - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-generator-function": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.10.tgz", - "integrity": "sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==", - "dev": true, - "dependencies": { - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-negative-zero": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.1.tgz", - "integrity": "sha512-2z6JzQvZRa9A2Y7xC6dQQm4FSTSTNWjKIYYTt4246eMTJmIo0Q+ZyOsU66X8lxK1AbB92dFeglPLrhwpeRKO6w==", - "dev": true, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-number-object": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.6.tgz", - "integrity": "sha512-bEVOqiRcvo3zO1+G2lVMy+gkkEm9Yh7cDMRusKKu5ZJKPUYSJwICTKZrNKHA2EbSP0Tu0+6B/emsYNHZyn6K8g==", - "dev": true, - "dependencies": { - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-regex": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", - "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-shared-array-buffer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.1.tgz", - "integrity": "sha512-IU0NmyknYZN0rChcKhRO1X8LYz5Isj/Fsqh8NJOSf+N/hCOTwy29F32Ik7a+QszE63IdvmwdTPDd6cZ5pg4cwA==", - "dev": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-string": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", - "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", - "dev": true, - "dependencies": { - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-symbol": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", - "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", - "dev": true, - "dependencies": { - "has-symbols": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-typed-array": { - "version": "1.1.8", - "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.8.tgz", - "integrity": "sha512-HqH41TNZq2fgtGT8WHVFVJhBVGuY3AnP3Q36K8JKXUxSxRgk/d+7NjmwG2vo2mYmXK8UYZKu0qH8bVP5gEisjA==", - "dev": true, - "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" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-weakref": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.1.tgz", - "integrity": "sha512-b2jKc2pQZjaeFYWEf7ScFj+Be1I+PXmlu572Q8coTXZ+LD/QQZ7ShPMst8h16riVgyXTQwUsFEl74mDvc/3MHQ==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/jade": { - "version": "0.26.3", - "resolved": "https://registry.npmjs.org/jade/-/jade-0.26.3.tgz", - "integrity": "sha1-jxDXl32NefL2/4YqgbBRPMslaGw=", - "deprecated": "Jade has been renamed to pug, please install the latest version of pug instead of jade", - "dev": true, - "dependencies": { - "commander": "0.6.1", - "mkdirp": "0.3.0" - }, - "bin": { - "jade": "bin/jade" - } - }, - "node_modules/jade/node_modules/commander": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-0.6.1.tgz", - "integrity": "sha1-+mihT2qUXVTbvlDYzbMyDp47GgY=", - "dev": true, - "engines": { - "node": ">= 0.4.x" - } - }, - "node_modules/jade/node_modules/mkdirp": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.3.0.tgz", - "integrity": "sha1-G79asbqCevI1dRQ0kEJkVfSB/h4=", - "deprecated": "Legacy versions of mkdirp are no longer supported. Please update to mkdirp 1.x. (Note that the API surface has changed to use Promises in 1.x.)", - "dev": true, - "engines": { - "node": "*" - } - }, - "node_modules/json-stringify-safe": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", - "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=", - "dev": true - }, - "node_modules/kindof": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/kindof/-/kindof-2.0.0.tgz", - "integrity": "sha1-wzW69gOnfMN/i0Brc7ZGP9vfGr4=", - "dev": true - }, - "node_modules/lodash._createwrapper": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/lodash._createwrapper/-/lodash._createwrapper-3.2.0.tgz", - "integrity": "sha1-30U+ZkFjIXuJWkVAZa8cR6DqPE0=", - "dev": true, - "dependencies": { - "lodash._root": "^3.0.0" - } - }, - "node_modules/lodash._root": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/lodash._root/-/lodash._root-3.0.1.tgz", - "integrity": "sha1-+6HEUkwZ7ppfgTa0YJ8BfPTe1pI=", - "dev": true - }, - "node_modules/lodash.wrap": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/lodash.wrap/-/lodash.wrap-3.0.1.tgz", - "integrity": "sha1-P82L74Z7LsjCG6xjjYFhgFk/cas=", - "dev": true, - "dependencies": { - "lodash._createwrapper": "^3.0.0" - } - }, - "node_modules/lolex": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/lolex/-/lolex-1.3.2.tgz", - "integrity": "sha1-fD2mL/yzDw9agKJWbKJORdigHzE=", - "dev": true - }, - "node_modules/lru-cache": { - "version": "2.7.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-2.7.3.tgz", - "integrity": "sha1-bUUk6LlV+V1PW1iFHOId1y+06VI=", - "dev": true - }, - "node_modules/minimatch": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-0.3.0.tgz", - "integrity": "sha1-J12O2qxPG7MyZHIInnlJyDlGmd0=", - "deprecated": "Please update to minimatch 3.0.2 or higher to avoid a RegExp DoS issue", - "dev": true, - "dependencies": { - "lru-cache": "2", - "sigmund": "~1.0.0" - }, - "engines": { - "node": "*" - } - }, - "node_modules/minimist": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", - "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", - "dev": true - }, - "node_modules/mkdirp": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", - "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", - "deprecated": "Legacy versions of mkdirp are no longer supported. Please update to mkdirp 1.x. (Note that the API surface has changed to use Promises in 1.x.)", - "dev": true, - "dependencies": { - "minimist": "0.0.8" - }, - "bin": { - "mkdirp": "bin/cmd.js" - } - }, - "node_modules/mocha": { - "version": "2.5.3", - "resolved": "https://registry.npmjs.org/mocha/-/mocha-2.5.3.tgz", - "integrity": "sha1-FhvlvetJZ3HrmzV0UFC2IrWu/Fg=", - "dev": true, - "dependencies": { - "commander": "2.3.0", - "debug": "2.2.0", - "diff": "1.4.0", - "escape-string-regexp": "1.0.2", - "glob": "3.2.11", - "growl": "1.9.2", - "jade": "0.26.3", - "mkdirp": "0.5.1", - "supports-color": "1.2.0", - "to-iso-string": "0.0.2" - }, - "bin": { - "_mocha": "bin/_mocha", - "mocha": "bin/mocha" - }, - "engines": { - "node": ">= 0.8.x" - } - }, - "node_modules/ms": { - "version": "0.7.1", - "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.1.tgz", - "integrity": "sha1-nNE8A62/8ltl7/3nzoZO6VIBcJg=", - "dev": true - }, - "node_modules/must": { - "version": "0.13.4", - "resolved": "https://registry.npmjs.org/must/-/must-0.13.4.tgz", - "integrity": "sha1-nROJ9FjolLKqBAMr/rekBxT3gXE=", - "dev": true, - "dependencies": { - "egal": ">= 1.3.0 < 2", - "json-stringify-safe": ">= 5 < 6", - "kindof": ">= 2.0.0 < 3", - "lodash.wrap": ">= 3 < 4", - "oolong": ">= 1.11.0 < 2" - } - }, - "node_modules/object-inspect": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.11.0.tgz", - "integrity": "sha512-jp7ikS6Sd3GxQfZJPyH3cjcbJF6GZPClgdV+EFygjFLQ5FmW/dRUnTd9PQ9k0JhoNDabWFbpF1yCdSWCC6gexg==", - "dev": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/object-keys": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", - "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", - "dev": true, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/object.assign": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.2.tgz", - "integrity": "sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.0", - "define-properties": "^1.1.3", - "has-symbols": "^1.0.1", - "object-keys": "^1.1.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/oolong": { - "version": "1.15.1", - "resolved": "https://registry.npmjs.org/oolong/-/oolong-1.15.1.tgz", - "integrity": "sha1-kLrJ585S9gkGqyIo2eKxFfEIbOo=", - "dev": true - }, - "node_modules/safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/samsam": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/samsam/-/samsam-1.1.2.tgz", - "integrity": "sha1-vsEf3IOp/aBjQBIQ5AF2wwJNFWc=", - "deprecated": "This package has been deprecated in favour of @sinonjs/samsam", - "dev": true - }, - "node_modules/semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "bin": { - "semver": "bin/semver" - } - }, - "node_modules/side-channel": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", - "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.0", - "get-intrinsic": "^1.0.2", - "object-inspect": "^1.9.0" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/sigmund": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/sigmund/-/sigmund-1.0.1.tgz", - "integrity": "sha1-P/IfGYytIXX587eBhT/ZTQ0ZtZA=", - "dev": true - }, - "node_modules/sinon": { - "version": "1.17.7", - "resolved": "https://registry.npmjs.org/sinon/-/sinon-1.17.7.tgz", - "integrity": "sha1-RUKk9JugxFwF6y6d2dID4rjv4L8=", - "dev": true, - "dependencies": { - "formatio": "1.1.1", - "lolex": "1.3.2", - "samsam": "1.1.2", - "util": ">=0.10.3 <1" - }, - "engines": { - "node": ">=0.1.103" - } - }, - "node_modules/string.prototype.trimend": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.4.tgz", - "integrity": "sha512-y9xCjw1P23Awk8EvTpcyL2NIr1j7wJ39f+k6lvRnSMz+mz9CGz9NYPelDk42kOz6+ql8xjfK8oYzy3jAP5QU5A==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/string.prototype.trimstart": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.4.tgz", - "integrity": "sha512-jh6e984OBfvxS50tdY2nRZnoC5/mLFKOREQfw8t5yytkoUsJRNxvI/E39qu1sD0OtWI3OC0XgKSmcWwziwYuZw==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/supports-color": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-1.2.0.tgz", - "integrity": "sha1-/x7R5hFp0Gs88tWI4YixjYhH4X4=", - "dev": true, - "bin": { - "supports-color": "cli.js" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/to-iso-string": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/to-iso-string/-/to-iso-string-0.0.2.tgz", - "integrity": "sha1-TcGeZk38y+Jb2NtQiwDG2hWCVdE=", - "deprecated": "to-iso-string has been deprecated, use @segment/to-iso-string instead.", - "dev": true - }, - "node_modules/unbox-primitive": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.1.tgz", - "integrity": "sha512-tZU/3NqK3dA5gpE1KtyiJUrEB0lxnGkMFHptJ7q6ewdZ8s12QrODwNbhIJStmJkd1QDXa1NRA8aF2A1zk/Ypyw==", - "dev": true, - "dependencies": { - "function-bind": "^1.1.1", - "has-bigints": "^1.0.1", - "has-symbols": "^1.0.2", - "which-boxed-primitive": "^1.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/underscore": { - "version": "1.13.1", - "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.13.1.tgz", - "integrity": "sha512-hzSoAVtJF+3ZtiFX0VgfFPHEDRm7Y/QPjGyNo4TVdnDTdft3tr8hEkD25a1jC+TjTuE7tkHGKkhwCgs9dgBB2g==" - }, - "node_modules/util": { - "version": "0.12.4", - "resolved": "https://registry.npmjs.org/util/-/util-0.12.4.tgz", - "integrity": "sha512-bxZ9qtSlGUWSOy9Qa9Xgk11kSslpuZwaxCg4sNIDj6FLucDab2JxnHwyNTCpHMtK1MjoQiWQ6DiUMZYbSrO+Sw==", - "dev": true, - "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" - } - }, - "node_modules/which-boxed-primitive": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", - "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", - "dev": true, - "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" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/which-typed-array": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.7.tgz", - "integrity": "sha512-vjxaB4nfDqwKI0ws7wZpxIlde1XrLX5uB0ZjpfshgmapJMD7jJWhZI+yToJTqaFByF0eNBcYxbjmCzoRP7CfEw==", - "dev": true, - "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" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - } - }, - "dependencies": { - "available-typed-arrays": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz", - "integrity": "sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==", - "dev": true - }, - "call-bind": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", - "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", - "dev": true, - "requires": { - "function-bind": "^1.1.1", - "get-intrinsic": "^1.0.2" - } - }, - "commander": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.3.0.tgz", - "integrity": "sha1-/UMOiJgy7DU7ms0d4hfBHLPu+HM=", - "dev": true - }, - "debug": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.2.0.tgz", - "integrity": "sha1-+HBX6ZWxofauaklgZkE3vFbwOdo=", - "dev": true, - "requires": { - "ms": "0.7.1" - } - }, - "define-properties": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", - "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", - "dev": true, - "requires": { - "object-keys": "^1.0.12" - } - }, - "diff": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/diff/-/diff-1.4.0.tgz", - "integrity": "sha1-fyjS657nsVqX79ic5j3P2qPMur8=", - "dev": true - }, - "egal": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/egal/-/egal-1.3.0.tgz", - "integrity": "sha1-IKGc+oDOlzP4QTY10AQmQfQpGHs=", - "dev": true, - "requires": { - "kindof": ">= 2.0.0 < 3" - } - }, - "es-abstract": { - "version": "1.19.1", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.19.1.tgz", - "integrity": "sha512-2vJ6tjA/UfqLm2MPs7jxVybLoB8i1t1Jd9R3kISld20sIxPcTbLuggQOUxeWeAvIUkduv/CfMjuh4WmiXr2v9w==", - "dev": true, - "requires": { - "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": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", - "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", - "dev": true, - "requires": { - "is-callable": "^1.1.4", - "is-date-object": "^1.0.1", - "is-symbol": "^1.0.2" - } - }, - "escape-string-regexp": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.2.tgz", - "integrity": "sha1-Tbwv5nTnGUnK8/smlc5/LcHZqNE=", - "dev": true - }, - "foreach": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/foreach/-/foreach-2.0.5.tgz", - "integrity": "sha1-C+4AUBiusmDQo6865ljdATbsG5k=", - "dev": true - }, - "formatio": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/formatio/-/formatio-1.1.1.tgz", - "integrity": "sha1-XtPM1jZVEJc4NGXZlhmRAOhhYek=", - "dev": true, - "requires": { - "samsam": "~1.1" - } - }, - "function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", - "dev": true - }, - "get-intrinsic": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.1.tgz", - "integrity": "sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==", - "dev": true, - "requires": { - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.1" - } - }, - "get-symbol-description": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz", - "integrity": "sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.1.1" - } - }, - "glob": { - "version": "3.2.11", - "resolved": "https://registry.npmjs.org/glob/-/glob-3.2.11.tgz", - "integrity": "sha1-Spc/Y1uRkPcV0QmH1cAP0oFevj0=", - "dev": true, - "requires": { - "inherits": "2", - "minimatch": "0.3" - } - }, - "growl": { - "version": "1.9.2", - "resolved": "https://registry.npmjs.org/growl/-/growl-1.9.2.tgz", - "integrity": "sha1-Dqd0NxXbjY3ixe3hd14bRayFwC8=", - "dev": true - }, - "has": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", - "dev": true, - "requires": { - "function-bind": "^1.1.1" - } - }, - "has-bigints": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.1.tgz", - "integrity": "sha512-LSBS2LjbNBTf6287JEbEzvJgftkF5qFkmCo9hDRpAzKhUOlJ+hx8dd4USs00SgsUNwc4617J9ki5YtEClM2ffA==", - "dev": true - }, - "has-symbols": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.2.tgz", - "integrity": "sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw==", - "dev": true - }, - "has-tostringtag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", - "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", - "dev": true, - "requires": { - "has-symbols": "^1.0.2" - } - }, - "inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true - }, - "internal-slot": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.3.tgz", - "integrity": "sha512-O0DB1JC/sPyZl7cIo78n5dR7eUSwwpYPiXRhTzNxZVAMUuB8vlnRFyLxdrVToks6XPLVnFfbzaVd5WLjhgg+vA==", - "dev": true, - "requires": { - "get-intrinsic": "^1.1.0", - "has": "^1.0.3", - "side-channel": "^1.0.4" - } - }, - "is-arguments": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz", - "integrity": "sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" - } - }, - "is-bigint": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", - "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", - "dev": true, - "requires": { - "has-bigints": "^1.0.1" - } - }, - "is-boolean-object": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", - "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" - } - }, - "is-callable": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.4.tgz", - "integrity": "sha512-nsuwtxZfMX67Oryl9LCQ+upnC0Z0BgpwntpS89m1H/TLF0zNfzfLMV/9Wa/6MZsj0acpEjAO0KF1xT6ZdLl95w==", - "dev": true - }, - "is-date-object": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", - "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", - "dev": true, - "requires": { - "has-tostringtag": "^1.0.0" - } - }, - "is-generator-function": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.10.tgz", - "integrity": "sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==", - "dev": true, - "requires": { - "has-tostringtag": "^1.0.0" - } - }, - "is-negative-zero": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.1.tgz", - "integrity": "sha512-2z6JzQvZRa9A2Y7xC6dQQm4FSTSTNWjKIYYTt4246eMTJmIo0Q+ZyOsU66X8lxK1AbB92dFeglPLrhwpeRKO6w==", - "dev": true - }, - "is-number-object": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.6.tgz", - "integrity": "sha512-bEVOqiRcvo3zO1+G2lVMy+gkkEm9Yh7cDMRusKKu5ZJKPUYSJwICTKZrNKHA2EbSP0Tu0+6B/emsYNHZyn6K8g==", - "dev": true, - "requires": { - "has-tostringtag": "^1.0.0" - } - }, - "is-regex": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", - "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" - } - }, - "is-shared-array-buffer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.1.tgz", - "integrity": "sha512-IU0NmyknYZN0rChcKhRO1X8LYz5Isj/Fsqh8NJOSf+N/hCOTwy29F32Ik7a+QszE63IdvmwdTPDd6cZ5pg4cwA==", - "dev": true - }, - "is-string": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", - "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", - "dev": true, - "requires": { - "has-tostringtag": "^1.0.0" - } - }, - "is-symbol": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", - "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", - "dev": true, - "requires": { - "has-symbols": "^1.0.2" - } - }, - "is-typed-array": { - "version": "1.1.8", - "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.8.tgz", - "integrity": "sha512-HqH41TNZq2fgtGT8WHVFVJhBVGuY3AnP3Q36K8JKXUxSxRgk/d+7NjmwG2vo2mYmXK8UYZKu0qH8bVP5gEisjA==", - "dev": true, - "requires": { - "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-weakref": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.1.tgz", - "integrity": "sha512-b2jKc2pQZjaeFYWEf7ScFj+Be1I+PXmlu572Q8coTXZ+LD/QQZ7ShPMst8h16riVgyXTQwUsFEl74mDvc/3MHQ==", - "dev": true, - "requires": { - "call-bind": "^1.0.0" - } - }, - "jade": { - "version": "0.26.3", - "resolved": "https://registry.npmjs.org/jade/-/jade-0.26.3.tgz", - "integrity": "sha1-jxDXl32NefL2/4YqgbBRPMslaGw=", - "dev": true, - "requires": { - "commander": "0.6.1", - "mkdirp": "0.3.0" - }, - "dependencies": { - "commander": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-0.6.1.tgz", - "integrity": "sha1-+mihT2qUXVTbvlDYzbMyDp47GgY=", - "dev": true - }, - "mkdirp": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.3.0.tgz", - "integrity": "sha1-G79asbqCevI1dRQ0kEJkVfSB/h4=", - "dev": true - } - } - }, - "json-stringify-safe": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", - "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=", - "dev": true - }, - "kindof": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/kindof/-/kindof-2.0.0.tgz", - "integrity": "sha1-wzW69gOnfMN/i0Brc7ZGP9vfGr4=", - "dev": true - }, - "lodash._createwrapper": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/lodash._createwrapper/-/lodash._createwrapper-3.2.0.tgz", - "integrity": "sha1-30U+ZkFjIXuJWkVAZa8cR6DqPE0=", - "dev": true, - "requires": { - "lodash._root": "^3.0.0" - } - }, - "lodash._root": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/lodash._root/-/lodash._root-3.0.1.tgz", - "integrity": "sha1-+6HEUkwZ7ppfgTa0YJ8BfPTe1pI=", - "dev": true - }, - "lodash.wrap": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/lodash.wrap/-/lodash.wrap-3.0.1.tgz", - "integrity": "sha1-P82L74Z7LsjCG6xjjYFhgFk/cas=", - "dev": true, - "requires": { - "lodash._createwrapper": "^3.0.0" - } - }, - "lolex": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/lolex/-/lolex-1.3.2.tgz", - "integrity": "sha1-fD2mL/yzDw9agKJWbKJORdigHzE=", - "dev": true - }, - "lru-cache": { - "version": "2.7.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-2.7.3.tgz", - "integrity": "sha1-bUUk6LlV+V1PW1iFHOId1y+06VI=", - "dev": true - }, - "minimatch": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-0.3.0.tgz", - "integrity": "sha1-J12O2qxPG7MyZHIInnlJyDlGmd0=", - "dev": true, - "requires": { - "lru-cache": "2", - "sigmund": "~1.0.0" - } - }, - "minimist": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", - "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", - "dev": true - }, - "mkdirp": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", - "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", - "dev": true, - "requires": { - "minimist": "0.0.8" - } - }, - "mocha": { - "version": "2.5.3", - "resolved": "https://registry.npmjs.org/mocha/-/mocha-2.5.3.tgz", - "integrity": "sha1-FhvlvetJZ3HrmzV0UFC2IrWu/Fg=", - "dev": true, - "requires": { - "commander": "2.3.0", - "debug": "2.2.0", - "diff": "1.4.0", - "escape-string-regexp": "1.0.2", - "glob": "3.2.11", - "growl": "1.9.2", - "jade": "0.26.3", - "mkdirp": "0.5.1", - "supports-color": "1.2.0", - "to-iso-string": "0.0.2" - } - }, - "ms": { - "version": "0.7.1", - "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.1.tgz", - "integrity": "sha1-nNE8A62/8ltl7/3nzoZO6VIBcJg=", - "dev": true - }, - "must": { - "version": "0.13.4", - "resolved": "https://registry.npmjs.org/must/-/must-0.13.4.tgz", - "integrity": "sha1-nROJ9FjolLKqBAMr/rekBxT3gXE=", - "dev": true, - "requires": { - "egal": ">= 1.3.0 < 2", - "json-stringify-safe": ">= 5 < 6", - "kindof": ">= 2.0.0 < 3", - "lodash.wrap": ">= 3 < 4", - "oolong": ">= 1.11.0 < 2" - } - }, - "object-inspect": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.11.0.tgz", - "integrity": "sha512-jp7ikS6Sd3GxQfZJPyH3cjcbJF6GZPClgdV+EFygjFLQ5FmW/dRUnTd9PQ9k0JhoNDabWFbpF1yCdSWCC6gexg==", - "dev": true - }, - "object-keys": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", - "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", - "dev": true - }, - "object.assign": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.2.tgz", - "integrity": "sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ==", - "dev": true, - "requires": { - "call-bind": "^1.0.0", - "define-properties": "^1.1.3", - "has-symbols": "^1.0.1", - "object-keys": "^1.1.1" - } - }, - "oolong": { - "version": "1.15.1", - "resolved": "https://registry.npmjs.org/oolong/-/oolong-1.15.1.tgz", - "integrity": "sha1-kLrJ585S9gkGqyIo2eKxFfEIbOo=", - "dev": true - }, - "safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "dev": true - }, - "samsam": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/samsam/-/samsam-1.1.2.tgz", - "integrity": "sha1-vsEf3IOp/aBjQBIQ5AF2wwJNFWc=", - "dev": true - }, - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" - }, - "side-channel": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", - "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", - "dev": true, - "requires": { - "call-bind": "^1.0.0", - "get-intrinsic": "^1.0.2", - "object-inspect": "^1.9.0" - } - }, - "sigmund": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/sigmund/-/sigmund-1.0.1.tgz", - "integrity": "sha1-P/IfGYytIXX587eBhT/ZTQ0ZtZA=", - "dev": true - }, - "sinon": { - "version": "1.17.7", - "resolved": "https://registry.npmjs.org/sinon/-/sinon-1.17.7.tgz", - "integrity": "sha1-RUKk9JugxFwF6y6d2dID4rjv4L8=", - "dev": true, - "requires": { - "formatio": "1.1.1", - "lolex": "1.3.2", - "samsam": "1.1.2", - "util": ">=0.10.3 <1" - } - }, - "string.prototype.trimend": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.4.tgz", - "integrity": "sha512-y9xCjw1P23Awk8EvTpcyL2NIr1j7wJ39f+k6lvRnSMz+mz9CGz9NYPelDk42kOz6+ql8xjfK8oYzy3jAP5QU5A==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3" - } - }, - "string.prototype.trimstart": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.4.tgz", - "integrity": "sha512-jh6e984OBfvxS50tdY2nRZnoC5/mLFKOREQfw8t5yytkoUsJRNxvI/E39qu1sD0OtWI3OC0XgKSmcWwziwYuZw==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3" - } - }, - "supports-color": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-1.2.0.tgz", - "integrity": "sha1-/x7R5hFp0Gs88tWI4YixjYhH4X4=", - "dev": true - }, - "to-iso-string": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/to-iso-string/-/to-iso-string-0.0.2.tgz", - "integrity": "sha1-TcGeZk38y+Jb2NtQiwDG2hWCVdE=", - "dev": true - }, - "unbox-primitive": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.1.tgz", - "integrity": "sha512-tZU/3NqK3dA5gpE1KtyiJUrEB0lxnGkMFHptJ7q6ewdZ8s12QrODwNbhIJStmJkd1QDXa1NRA8aF2A1zk/Ypyw==", - "dev": true, - "requires": { - "function-bind": "^1.1.1", - "has-bigints": "^1.0.1", - "has-symbols": "^1.0.2", - "which-boxed-primitive": "^1.0.2" - } - }, - "underscore": { - "version": "1.13.1", - "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.13.1.tgz", - "integrity": "sha512-hzSoAVtJF+3ZtiFX0VgfFPHEDRm7Y/QPjGyNo4TVdnDTdft3tr8hEkD25a1jC+TjTuE7tkHGKkhwCgs9dgBB2g==" - }, - "util": { - "version": "0.12.4", - "resolved": "https://registry.npmjs.org/util/-/util-0.12.4.tgz", - "integrity": "sha512-bxZ9qtSlGUWSOy9Qa9Xgk11kSslpuZwaxCg4sNIDj6FLucDab2JxnHwyNTCpHMtK1MjoQiWQ6DiUMZYbSrO+Sw==", - "dev": true, - "requires": { - "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" - } - }, - "which-boxed-primitive": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", - "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", - "dev": true, - "requires": { - "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-typed-array": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.7.tgz", - "integrity": "sha512-vjxaB4nfDqwKI0ws7wZpxIlde1XrLX5uB0ZjpfshgmapJMD7jJWhZI+yToJTqaFByF0eNBcYxbjmCzoRP7CfEw==", - "dev": true, - "requires": { - "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" - } - } - } + "name": "mitm", + "version": "1.7.2", + "lockfileVersion": 2, + "requires": true, + "packages": { + "": { + "name": "mitm", + "version": "1.7.2", + "dependencies": { + "semver": ">= 5 < 6", + "underscore": ">= 1.1.6 < 1.14" + }, + "devDependencies": { + "mocha": ">= 1.12.0 < 3", + "must": ">= 0.13 < 0.14", + "nyc": "^15.1.0", + "sinon": ">= 1.9 < 2" + }, + "engines": { + "node": ">= 0.10.24" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.16.0.tgz", + "integrity": "sha512-IF4EOMEV+bfYwOmNxGzSnjR2EmQod7f1UXOpZM3l4i4o4QNwzjtJAu/HxdjHq0aYBvdqMuQEY1eg0nqW9ZPORA==", + "dev": true, + "dependencies": { + "@babel/highlight": "^7.16.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/compat-data": { + "version": "7.16.4", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.16.4.tgz", + "integrity": "sha512-1o/jo7D+kC9ZjHX5v+EHrdjl3PhxMrLSOTGsOdHJ+KL8HCaEK6ehrVL2RS6oHDZp+L7xLirLrPmQtEng769J/Q==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.16.0.tgz", + "integrity": "sha512-mYZEvshBRHGsIAiyH5PzCFTCfbWfoYbO/jcSdXQSUQu1/pW0xDZAUP7KEc32heqWTAfAHhV9j1vH8Sav7l+JNQ==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.16.0", + "@babel/generator": "^7.16.0", + "@babel/helper-compilation-targets": "^7.16.0", + "@babel/helper-module-transforms": "^7.16.0", + "@babel/helpers": "^7.16.0", + "@babel/parser": "^7.16.0", + "@babel/template": "^7.16.0", + "@babel/traverse": "^7.16.0", + "@babel/types": "^7.16.0", + "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" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@babel/core/node_modules/debug": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", + "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", + "dev": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/@babel/core/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "node_modules/@babel/core/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/generator": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.16.0.tgz", + "integrity": "sha512-RR8hUCfRQn9j9RPKEVXo9LiwoxLPYn6hNZlvUOR8tSnaxlD0p0+la00ZP9/SnRt6HchKr+X0fO2r8vrETiJGew==", + "dev": true, + "dependencies": { + "@babel/types": "^7.16.0", + "jsesc": "^2.5.1", + "source-map": "^0.5.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets": { + "version": "7.16.3", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.16.3.tgz", + "integrity": "sha512-vKsoSQAyBmxS35JUOOt+07cLc6Nk/2ljLIHwmq2/NM6hdioUaqEXq/S+nXvbvXbZkNDlWOymPanJGOc4CBjSJA==", + "dev": true, + "dependencies": { + "@babel/compat-data": "^7.16.0", + "@babel/helper-validator-option": "^7.14.5", + "browserslist": "^4.17.5", + "semver": "^6.3.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-compilation-targets/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/helper-function-name": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.16.0.tgz", + "integrity": "sha512-BZh4mEk1xi2h4HFjWUXRQX5AEx4rvaZxHgax9gcjdLWdkjsY7MKt5p0otjsg5noXw+pB+clMCjw+aEVYADMjog==", + "dev": true, + "dependencies": { + "@babel/helper-get-function-arity": "^7.16.0", + "@babel/template": "^7.16.0", + "@babel/types": "^7.16.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-get-function-arity": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.16.0.tgz", + "integrity": "sha512-ASCquNcywC1NkYh/z7Cgp3w31YW8aojjYIlNg4VeJiHkqyP4AzIvr4qx7pYDb4/s8YcsZWqqOSxgkvjUz1kpDQ==", + "dev": true, + "dependencies": { + "@babel/types": "^7.16.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-hoist-variables": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.16.0.tgz", + "integrity": "sha512-1AZlpazjUR0EQZQv3sgRNfM9mEVWPK3M6vlalczA+EECcPz3XPh6VplbErL5UoMpChhSck5wAJHthlj1bYpcmg==", + "dev": true, + "dependencies": { + "@babel/types": "^7.16.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-member-expression-to-functions": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.16.0.tgz", + "integrity": "sha512-bsjlBFPuWT6IWhl28EdrQ+gTvSvj5tqVP5Xeftp07SEuz5pLnsXZuDkDD3Rfcxy0IsHmbZ+7B2/9SHzxO0T+sQ==", + "dev": true, + "dependencies": { + "@babel/types": "^7.16.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-imports": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.16.0.tgz", + "integrity": "sha512-kkH7sWzKPq0xt3H1n+ghb4xEMP8k0U7XV3kkB+ZGy69kDk2ySFW1qPi06sjKzFY3t1j6XbJSqr4mF9L7CYVyhg==", + "dev": true, + "dependencies": { + "@babel/types": "^7.16.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-transforms": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.16.0.tgz", + "integrity": "sha512-My4cr9ATcaBbmaEa8M0dZNA74cfI6gitvUAskgDtAFmAqyFKDSHQo5YstxPbN+lzHl2D9l/YOEFqb2mtUh4gfA==", + "dev": true, + "dependencies": { + "@babel/helper-module-imports": "^7.16.0", + "@babel/helper-replace-supers": "^7.16.0", + "@babel/helper-simple-access": "^7.16.0", + "@babel/helper-split-export-declaration": "^7.16.0", + "@babel/helper-validator-identifier": "^7.15.7", + "@babel/template": "^7.16.0", + "@babel/traverse": "^7.16.0", + "@babel/types": "^7.16.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-optimise-call-expression": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.16.0.tgz", + "integrity": "sha512-SuI467Gi2V8fkofm2JPnZzB/SUuXoJA5zXe/xzyPP2M04686RzFKFHPK6HDVN6JvWBIEW8tt9hPR7fXdn2Lgpw==", + "dev": true, + "dependencies": { + "@babel/types": "^7.16.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-replace-supers": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.16.0.tgz", + "integrity": "sha512-TQxuQfSCdoha7cpRNJvfaYxxxzmbxXw/+6cS7V02eeDYyhxderSoMVALvwupA54/pZcOTtVeJ0xccp1nGWladA==", + "dev": true, + "dependencies": { + "@babel/helper-member-expression-to-functions": "^7.16.0", + "@babel/helper-optimise-call-expression": "^7.16.0", + "@babel/traverse": "^7.16.0", + "@babel/types": "^7.16.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-simple-access": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.16.0.tgz", + "integrity": "sha512-o1rjBT/gppAqKsYfUdfHq5Rk03lMQrkPHG1OWzHWpLgVXRH4HnMM9Et9CVdIqwkCQlobnGHEJMsgWP/jE1zUiw==", + "dev": true, + "dependencies": { + "@babel/types": "^7.16.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-split-export-declaration": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.16.0.tgz", + "integrity": "sha512-0YMMRpuDFNGTHNRiiqJX19GjNXA4H0E8jZ2ibccfSxaCogbm3am5WN/2nQNj0YnQwGWM1J06GOcQ2qnh3+0paw==", + "dev": true, + "dependencies": { + "@babel/types": "^7.16.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.15.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.15.7.tgz", + "integrity": "sha512-K4JvCtQqad9OY2+yTU8w+E82ywk/fe+ELNlt1G8z3bVGlZfn/hOcQQsUhGhW/N+tb3fxK800wLtKOE/aM0m72w==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-option": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.14.5.tgz", + "integrity": "sha512-OX8D5eeX4XwcroVW45NMvoYaIuFI+GQpA2a8Gi+X/U/cDUIRsV37qQfF905F0htTRCREQIB4KqPeaveRJUl3Ow==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers": { + "version": "7.16.3", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.16.3.tgz", + "integrity": "sha512-Xn8IhDlBPhvYTvgewPKawhADichOsbkZuzN7qz2BusOM0brChsyXMDJvldWaYMMUNiCQdQzNEioXTp3sC8Nt8w==", + "dev": true, + "dependencies": { + "@babel/template": "^7.16.0", + "@babel/traverse": "^7.16.3", + "@babel/types": "^7.16.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/highlight": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.16.0.tgz", + "integrity": "sha512-t8MH41kUQylBtu2+4IQA3atqevA2lRgqA2wyVB/YiWmsDSuylZZuXOUy9ric30hfzauEFfdsuk/eXTRrGrfd0g==", + "dev": true, + "dependencies": { + "@babel/helper-validator-identifier": "^7.15.7", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.16.4", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.16.4.tgz", + "integrity": "sha512-6V0qdPUaiVHH3RtZeLIsc+6pDhbYzHR8ogA8w+f+Wc77DuXto19g2QUwveINoS34Uw+W8/hQDGJCx+i4n7xcng==", + "dev": true, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/template": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.16.0.tgz", + "integrity": "sha512-MnZdpFD/ZdYhXwiunMqqgyZyucaYsbL0IrjoGjaVhGilz+x8YB++kRfygSOIj1yOtWKPlx7NBp+9I1RQSgsd5A==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.16.0", + "@babel/parser": "^7.16.0", + "@babel/types": "^7.16.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.16.3", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.16.3.tgz", + "integrity": "sha512-eolumr1vVMjqevCpwVO99yN/LoGL0EyHiLO5I043aYQvwOJ9eR5UsZSClHVCzfhBduMAsSzgA/6AyqPjNayJag==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.16.0", + "@babel/generator": "^7.16.0", + "@babel/helper-function-name": "^7.16.0", + "@babel/helper-hoist-variables": "^7.16.0", + "@babel/helper-split-export-declaration": "^7.16.0", + "@babel/parser": "^7.16.3", + "@babel/types": "^7.16.0", + "debug": "^4.1.0", + "globals": "^11.1.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse/node_modules/debug": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", + "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", + "dev": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/@babel/traverse/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "node_modules/@babel/types": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.16.0.tgz", + "integrity": "sha512-PJgg/k3SdLsGb3hhisFvtLOw5ts113klrpLuIPtCJIU+BB24fqq6lf8RWqKJEjzqXR9AEH1rIb5XTqwBHB+kQg==", + "dev": true, + "dependencies": { + "@babel/helper-validator-identifier": "^7.15.7", + "to-fast-properties": "^2.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@istanbuljs/load-nyc-config": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", + "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", + "dev": true, + "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" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@istanbuljs/schema": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", + "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/aggregate-error": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", + "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", + "dev": true, + "dependencies": { + "clean-stack": "^2.0.0", + "indent-string": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/append-transform": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/append-transform/-/append-transform-2.0.0.tgz", + "integrity": "sha512-7yeyCEurROLQJFv5Xj4lEGTy0borxepjFv1g22oAdqFu//SrAlDl1O1Nxx15SH1RoliUml6p8dwJW9jvZughhg==", + "dev": true, + "dependencies": { + "default-require-extensions": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/archy": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/archy/-/archy-1.0.0.tgz", + "integrity": "sha1-+cjBN1fMHde8N5rHeyxipcKGjEA=", + "dev": true + }, + "node_modules/argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "dependencies": { + "sprintf-js": "~1.0.2" + } + }, + "node_modules/available-typed-arrays": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz", + "integrity": "sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true + }, + "node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/browserslist": { + "version": "4.18.1", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.18.1.tgz", + "integrity": "sha512-8ScCzdpPwR2wQh8IT82CA2VgDwjHyqMovPBZSNH54+tm4Jk2pCuv90gmAdH6J84OCRWi0b4gMe6O6XPXuJnjgQ==", + "dev": true, + "dependencies": { + "caniuse-lite": "^1.0.30001280", + "electron-to-chromium": "^1.3.896", + "escalade": "^3.1.1", + "node-releases": "^2.0.1", + "picocolors": "^1.0.0" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + } + }, + "node_modules/caching-transform": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/caching-transform/-/caching-transform-4.0.0.tgz", + "integrity": "sha512-kpqOvwXnjjN44D89K5ccQC+RUrsy7jB/XLlRrx0D7/2HNcTPqzsb6XgYoErwko6QsV184CA2YgS1fxDiiDZMWA==", + "dev": true, + "dependencies": { + "hasha": "^5.0.0", + "make-dir": "^3.0.0", + "package-hash": "^4.0.0", + "write-file-atomic": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/call-bind": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001284", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001284.tgz", + "integrity": "sha512-t28SKa7g6kiIQi6NHeOcKrOrGMzCRrXvlasPwWC26TH2QNdglgzQIRUuJ0cR3NeQPH+5jpuveeeSFDLm2zbkEw==", + "dev": true, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + } + }, + "node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/chalk/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/chalk/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/clean-stack": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", + "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/cliui": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", + "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", + "dev": true, + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^6.2.0" + } + }, + "node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "dev": true + }, + "node_modules/commander": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.3.0.tgz", + "integrity": "sha1-/UMOiJgy7DU7ms0d4hfBHLPu+HM=", + "dev": true, + "engines": { + "node": ">= 0.6.x" + } + }, + "node_modules/commondir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", + "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=", + "dev": true + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", + "dev": true + }, + "node_modules/convert-source-map": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.8.0.tgz", + "integrity": "sha512-+OQdjP49zViI/6i7nIJpA8rAl4sV/JdPfU9nZs3VqOwGIgizICvuN2ru6fMd+4llL0tar18UYJXfZ/TWtmhUjA==", + "dev": true, + "dependencies": { + "safe-buffer": "~5.1.1" + } + }, + "node_modules/convert-source-map/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, + "node_modules/cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dev": true, + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/debug": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.2.0.tgz", + "integrity": "sha1-+HBX6ZWxofauaklgZkE3vFbwOdo=", + "dev": true, + "dependencies": { + "ms": "0.7.1" + } + }, + "node_modules/decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/default-require-extensions": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/default-require-extensions/-/default-require-extensions-3.0.0.tgz", + "integrity": "sha512-ek6DpXq/SCpvjhpFsLFRVtIxJCRw6fUR42lYMVZuUMK7n8eMz4Uh5clckdBjEpLhn/gEBZo7hDJnJcwdKLKQjg==", + "dev": true, + "dependencies": { + "strip-bom": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/define-properties": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", + "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", + "dev": true, + "dependencies": { + "object-keys": "^1.0.12" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/diff": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-1.4.0.tgz", + "integrity": "sha1-fyjS657nsVqX79ic5j3P2qPMur8=", + "dev": true, + "engines": { + "node": ">=0.3.1" + } + }, + "node_modules/egal": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/egal/-/egal-1.3.0.tgz", + "integrity": "sha1-IKGc+oDOlzP4QTY10AQmQfQpGHs=", + "dev": true, + "dependencies": { + "kindof": ">= 2.0.0 < 3" + } + }, + "node_modules/electron-to-chromium": { + "version": "1.4.11", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.11.tgz", + "integrity": "sha512-2OhsaYgsWGhWjx2et8kaUcdktPbBGjKM2X0BReUCKcSCPttEY+hz2zie820JLbttU8jwL92+JJysWwkut3wZgA==", + "dev": true + }, + "node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "node_modules/es-abstract": { + "version": "1.19.1", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.19.1.tgz", + "integrity": "sha512-2vJ6tjA/UfqLm2MPs7jxVybLoB8i1t1Jd9R3kISld20sIxPcTbLuggQOUxeWeAvIUkduv/CfMjuh4WmiXr2v9w==", + "dev": true, + "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" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/es-to-primitive": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", + "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", + "dev": true, + "dependencies": { + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/es6-error": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/es6-error/-/es6-error-4.1.1.tgz", + "integrity": "sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg==", + "dev": true + }, + "node_modules/escalade": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-string-regexp": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.2.tgz", + "integrity": "sha1-Tbwv5nTnGUnK8/smlc5/LcHZqNE=", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "dev": true, + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/find-cache-dir": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.2.tgz", + "integrity": "sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==", + "dev": true, + "dependencies": { + "commondir": "^1.0.1", + "make-dir": "^3.0.2", + "pkg-dir": "^4.1.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/avajs/find-cache-dir?sponsor=1" + } + }, + "node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/foreach": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/foreach/-/foreach-2.0.5.tgz", + "integrity": "sha1-C+4AUBiusmDQo6865ljdATbsG5k=", + "dev": true + }, + "node_modules/foreground-child": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-2.0.0.tgz", + "integrity": "sha512-dCIq9FpEcyQyXKCkyzmlPTFNgrCzPudOe+mhvJU5zAtlBnGVy2yKxtfsxK2tQBThwq225jcvBjpw1Gr40uzZCA==", + "dev": true, + "dependencies": { + "cross-spawn": "^7.0.0", + "signal-exit": "^3.0.2" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/formatio": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/formatio/-/formatio-1.1.1.tgz", + "integrity": "sha1-XtPM1jZVEJc4NGXZlhmRAOhhYek=", + "deprecated": "This package is unmaintained. Use @sinonjs/formatio instead", + "dev": true, + "dependencies": { + "samsam": "~1.1" + } + }, + "node_modules/fromentries": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/fromentries/-/fromentries-1.3.2.tgz", + "integrity": "sha512-cHEpEQHUg0f8XdtZCc2ZAhrHzKzT0MrFUTcvx+hfxYu7rGMDc5SKoXFh+n4YigxsHXRzc6OrCshdR1bWH6HHyg==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", + "dev": true + }, + "node_modules/function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", + "dev": true + }, + "node_modules/gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "dev": true, + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/get-intrinsic": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.1.tgz", + "integrity": "sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-package-type": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", + "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", + "dev": true, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/get-symbol-description": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz", + "integrity": "sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/glob": { + "version": "3.2.11", + "resolved": "https://registry.npmjs.org/glob/-/glob-3.2.11.tgz", + "integrity": "sha1-Spc/Y1uRkPcV0QmH1cAP0oFevj0=", + "dev": true, + "dependencies": { + "inherits": "2", + "minimatch": "0.3" + }, + "engines": { + "node": "*" + } + }, + "node_modules/globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.8", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.8.tgz", + "integrity": "sha512-qkIilPUYcNhJpd33n0GBXTB1MMPp14TxEsEs0pTrsSVucApsYzW5V+Q8Qxhik6KU3evy+qkAAowTByymK0avdg==", + "dev": true + }, + "node_modules/growl": { + "version": "1.9.2", + "resolved": "https://registry.npmjs.org/growl/-/growl-1.9.2.tgz", + "integrity": "sha1-Dqd0NxXbjY3ixe3hd14bRayFwC8=", + "dev": true + }, + "node_modules/has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.1" + }, + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/has-bigints": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.1.tgz", + "integrity": "sha512-LSBS2LjbNBTf6287JEbEzvJgftkF5qFkmCo9hDRpAzKhUOlJ+hx8dd4USs00SgsUNwc4617J9ki5YtEClM2ffA==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/has-symbols": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.2.tgz", + "integrity": "sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-tostringtag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", + "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", + "dev": true, + "dependencies": { + "has-symbols": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/hasha": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/hasha/-/hasha-5.2.2.tgz", + "integrity": "sha512-Hrp5vIK/xr5SkeN2onO32H0MgNZ0f17HRNH39WfL0SYUNOTZ5Lz1TJ8Pajo/87dYGEFlLMm7mIc/k/s6Bvz9HQ==", + "dev": true, + "dependencies": { + "is-stream": "^2.0.0", + "type-fest": "^0.8.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/html-escaper": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", + "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", + "dev": true + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", + "dev": true, + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/indent-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", + "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "dev": true, + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true + }, + "node_modules/internal-slot": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.3.tgz", + "integrity": "sha512-O0DB1JC/sPyZl7cIo78n5dR7eUSwwpYPiXRhTzNxZVAMUuB8vlnRFyLxdrVToks6XPLVnFfbzaVd5WLjhgg+vA==", + "dev": true, + "dependencies": { + "get-intrinsic": "^1.1.0", + "has": "^1.0.3", + "side-channel": "^1.0.4" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/is-arguments": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz", + "integrity": "sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-bigint": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", + "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", + "dev": true, + "dependencies": { + "has-bigints": "^1.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-boolean-object": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", + "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-callable": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.4.tgz", + "integrity": "sha512-nsuwtxZfMX67Oryl9LCQ+upnC0Z0BgpwntpS89m1H/TLF0zNfzfLMV/9Wa/6MZsj0acpEjAO0KF1xT6ZdLl95w==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-date-object": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", + "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", + "dev": true, + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-generator-function": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.10.tgz", + "integrity": "sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==", + "dev": true, + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-negative-zero": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.1.tgz", + "integrity": "sha512-2z6JzQvZRa9A2Y7xC6dQQm4FSTSTNWjKIYYTt4246eMTJmIo0Q+ZyOsU66X8lxK1AbB92dFeglPLrhwpeRKO6w==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-number-object": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.6.tgz", + "integrity": "sha512-bEVOqiRcvo3zO1+G2lVMy+gkkEm9Yh7cDMRusKKu5ZJKPUYSJwICTKZrNKHA2EbSP0Tu0+6B/emsYNHZyn6K8g==", + "dev": true, + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-regex": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", + "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-shared-array-buffer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.1.tgz", + "integrity": "sha512-IU0NmyknYZN0rChcKhRO1X8LYz5Isj/Fsqh8NJOSf+N/hCOTwy29F32Ik7a+QszE63IdvmwdTPDd6cZ5pg4cwA==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-string": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", + "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", + "dev": true, + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-symbol": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", + "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", + "dev": true, + "dependencies": { + "has-symbols": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-typed-array": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.8.tgz", + "integrity": "sha512-HqH41TNZq2fgtGT8WHVFVJhBVGuY3AnP3Q36K8JKXUxSxRgk/d+7NjmwG2vo2mYmXK8UYZKu0qH8bVP5gEisjA==", + "dev": true, + "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" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", + "dev": true + }, + "node_modules/is-weakref": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.1.tgz", + "integrity": "sha512-b2jKc2pQZjaeFYWEf7ScFj+Be1I+PXmlu572Q8coTXZ+LD/QQZ7ShPMst8h16riVgyXTQwUsFEl74mDvc/3MHQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-windows": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", + "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", + "dev": true + }, + "node_modules/istanbul-lib-coverage": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz", + "integrity": "sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-hook": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-hook/-/istanbul-lib-hook-3.0.0.tgz", + "integrity": "sha512-Pt/uge1Q9s+5VAZ+pCo16TYMWPBIl+oaNIjgLQxcX0itS6ueeaA+pEfThZpH8WxhFgCiEb8sAJY6MdUKgiIWaQ==", + "dev": true, + "dependencies": { + "append-transform": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-instrument": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-4.0.3.tgz", + "integrity": "sha512-BXgQl9kf4WTCPCCpmFGoJkz/+uhvm7h7PFKUYxh7qarQd3ER33vHG//qaE8eN25l07YqZPpHXU9I09l/RD5aGQ==", + "dev": true, + "dependencies": { + "@babel/core": "^7.7.5", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-coverage": "^3.0.0", + "semver": "^6.3.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-instrument/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/istanbul-lib-processinfo": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/istanbul-lib-processinfo/-/istanbul-lib-processinfo-2.0.2.tgz", + "integrity": "sha512-kOwpa7z9hme+IBPZMzQ5vdQj8srYgAtaRqeI48NGmAQ+/5yKiHLV0QbYqQpxsdEF0+w14SoB8YbnHKcXE2KnYw==", + "dev": true, + "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" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-report": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", + "integrity": "sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw==", + "dev": true, + "dependencies": { + "istanbul-lib-coverage": "^3.0.0", + "make-dir": "^3.0.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-report/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-report/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-source-maps": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz", + "integrity": "sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==", + "dev": true, + "dependencies": { + "debug": "^4.1.1", + "istanbul-lib-coverage": "^3.0.0", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/istanbul-lib-source-maps/node_modules/debug": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", + "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", + "dev": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/istanbul-lib-source-maps/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "node_modules/istanbul-lib-source-maps/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/istanbul-reports": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.1.tgz", + "integrity": "sha512-q1kvhAXWSsXfMjCdNHNPKZZv94OlspKnoGv+R9RGbnqOOQ0VbNfLFgQDVgi7hHenKsndGq3/o0OBdzDXthWcNw==", + "dev": true, + "dependencies": { + "html-escaper": "^2.0.0", + "istanbul-lib-report": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jade": { + "version": "0.26.3", + "resolved": "https://registry.npmjs.org/jade/-/jade-0.26.3.tgz", + "integrity": "sha1-jxDXl32NefL2/4YqgbBRPMslaGw=", + "deprecated": "Jade has been renamed to pug, please install the latest version of pug instead of jade", + "dev": true, + "dependencies": { + "commander": "0.6.1", + "mkdirp": "0.3.0" + }, + "bin": { + "jade": "bin/jade" + } + }, + "node_modules/jade/node_modules/commander": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-0.6.1.tgz", + "integrity": "sha1-+mihT2qUXVTbvlDYzbMyDp47GgY=", + "dev": true, + "engines": { + "node": ">= 0.4.x" + } + }, + "node_modules/jade/node_modules/mkdirp": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.3.0.tgz", + "integrity": "sha1-G79asbqCevI1dRQ0kEJkVfSB/h4=", + "deprecated": "Legacy versions of mkdirp are no longer supported. Please update to mkdirp 1.x. (Note that the API surface has changed to use Promises in 1.x.)", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true + }, + "node_modules/js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "dev": true, + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/jsesc": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "dev": true, + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/json-stringify-safe": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", + "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=", + "dev": true + }, + "node_modules/json5": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.0.tgz", + "integrity": "sha512-f+8cldu7X/y7RAJurMEJmdoKXGB/X550w2Nr3tTbezL6RwEE/iMcm+tZnXeoZtKuOq6ft8+CqzEkrIgx1fPoQA==", + "dev": true, + "dependencies": { + "minimist": "^1.2.5" + }, + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/json5/node_modules/minimist": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", + "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", + "dev": true + }, + "node_modules/kindof": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/kindof/-/kindof-2.0.0.tgz", + "integrity": "sha1-wzW69gOnfMN/i0Brc7ZGP9vfGr4=", + "dev": true + }, + "node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/lodash._createwrapper": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/lodash._createwrapper/-/lodash._createwrapper-3.2.0.tgz", + "integrity": "sha1-30U+ZkFjIXuJWkVAZa8cR6DqPE0=", + "dev": true, + "dependencies": { + "lodash._root": "^3.0.0" + } + }, + "node_modules/lodash._root": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/lodash._root/-/lodash._root-3.0.1.tgz", + "integrity": "sha1-+6HEUkwZ7ppfgTa0YJ8BfPTe1pI=", + "dev": true + }, + "node_modules/lodash.flattendeep": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/lodash.flattendeep/-/lodash.flattendeep-4.4.0.tgz", + "integrity": "sha1-+wMJF/hqMTTlvJvsDWngAT3f7bI=", + "dev": true + }, + "node_modules/lodash.wrap": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/lodash.wrap/-/lodash.wrap-3.0.1.tgz", + "integrity": "sha1-P82L74Z7LsjCG6xjjYFhgFk/cas=", + "dev": true, + "dependencies": { + "lodash._createwrapper": "^3.0.0" + } + }, + "node_modules/lolex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/lolex/-/lolex-1.3.2.tgz", + "integrity": "sha1-fD2mL/yzDw9agKJWbKJORdigHzE=", + "dev": true + }, + "node_modules/lru-cache": { + "version": "2.7.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-2.7.3.tgz", + "integrity": "sha1-bUUk6LlV+V1PW1iFHOId1y+06VI=", + "dev": true + }, + "node_modules/make-dir": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", + "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", + "dev": true, + "dependencies": { + "semver": "^6.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/make-dir/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/minimatch": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-0.3.0.tgz", + "integrity": "sha1-J12O2qxPG7MyZHIInnlJyDlGmd0=", + "deprecated": "Please update to minimatch 3.0.2 or higher to avoid a RegExp DoS issue", + "dev": true, + "dependencies": { + "lru-cache": "2", + "sigmund": "~1.0.0" + }, + "engines": { + "node": "*" + } + }, + "node_modules/minimist": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", + "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", + "dev": true + }, + "node_modules/mkdirp": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", + "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", + "deprecated": "Legacy versions of mkdirp are no longer supported. Please update to mkdirp 1.x. (Note that the API surface has changed to use Promises in 1.x.)", + "dev": true, + "dependencies": { + "minimist": "0.0.8" + }, + "bin": { + "mkdirp": "bin/cmd.js" + } + }, + "node_modules/mocha": { + "version": "2.5.3", + "resolved": "https://registry.npmjs.org/mocha/-/mocha-2.5.3.tgz", + "integrity": "sha1-FhvlvetJZ3HrmzV0UFC2IrWu/Fg=", + "dev": true, + "dependencies": { + "commander": "2.3.0", + "debug": "2.2.0", + "diff": "1.4.0", + "escape-string-regexp": "1.0.2", + "glob": "3.2.11", + "growl": "1.9.2", + "jade": "0.26.3", + "mkdirp": "0.5.1", + "supports-color": "1.2.0", + "to-iso-string": "0.0.2" + }, + "bin": { + "_mocha": "bin/_mocha", + "mocha": "bin/mocha" + }, + "engines": { + "node": ">= 0.8.x" + } + }, + "node_modules/ms": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.1.tgz", + "integrity": "sha1-nNE8A62/8ltl7/3nzoZO6VIBcJg=", + "dev": true + }, + "node_modules/must": { + "version": "0.13.4", + "resolved": "https://registry.npmjs.org/must/-/must-0.13.4.tgz", + "integrity": "sha1-nROJ9FjolLKqBAMr/rekBxT3gXE=", + "dev": true, + "dependencies": { + "egal": ">= 1.3.0 < 2", + "json-stringify-safe": ">= 5 < 6", + "kindof": ">= 2.0.0 < 3", + "lodash.wrap": ">= 3 < 4", + "oolong": ">= 1.11.0 < 2" + } + }, + "node_modules/node-preload": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/node-preload/-/node-preload-0.2.1.tgz", + "integrity": "sha512-RM5oyBy45cLEoHqCeh+MNuFAxO0vTFBLskvQbOKnEE7YTTSN4tbN8QWDIPQ6L+WvKsB/qLEGpYe2ZZ9d4W9OIQ==", + "dev": true, + "dependencies": { + "process-on-spawn": "^1.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/node-releases": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.1.tgz", + "integrity": "sha512-CqyzN6z7Q6aMeF/ktcMVTzhAHCEpf8SOarwpzpf8pNBY2k5/oM34UHldUwp8VKI7uxct2HxSRdJjBaZeESzcxA==", + "dev": true + }, + "node_modules/nyc": { + "version": "15.1.0", + "resolved": "https://registry.npmjs.org/nyc/-/nyc-15.1.0.tgz", + "integrity": "sha512-jMW04n9SxKdKi1ZMGhvUTHBN0EICCRkHemEoE5jm6mTYcqcdas0ATzgUgejlQUHMvpnOZqGB5Xxsv9KxJW1j8A==", + "dev": true, + "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" + }, + "bin": { + "nyc": "bin/nyc.js" + }, + "engines": { + "node": ">=8.9" + } + }, + "node_modules/nyc/node_modules/glob": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", + "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", + "dev": true, + "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" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/nyc/node_modules/minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/object-inspect": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.11.0.tgz", + "integrity": "sha512-jp7ikS6Sd3GxQfZJPyH3cjcbJF6GZPClgdV+EFygjFLQ5FmW/dRUnTd9PQ9k0JhoNDabWFbpF1yCdSWCC6gexg==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "dev": true, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.assign": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.2.tgz", + "integrity": "sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.0", + "define-properties": "^1.1.3", + "has-symbols": "^1.0.1", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "dev": true, + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/oolong": { + "version": "1.15.1", + "resolved": "https://registry.npmjs.org/oolong/-/oolong-1.15.1.tgz", + "integrity": "sha1-kLrJ585S9gkGqyIo2eKxFfEIbOo=", + "dev": true + }, + "node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/p-map": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-3.0.0.tgz", + "integrity": "sha512-d3qXVTF/s+W+CdJ5A29wywV2n8CQQYahlgz2bFiA+4eVNJbHJodPZ+/gXwPGh0bOqA+j8S+6+ckmvLGPk1QpxQ==", + "dev": true, + "dependencies": { + "aggregate-error": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/package-hash": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/package-hash/-/package-hash-4.0.0.tgz", + "integrity": "sha512-whdkPIooSu/bASggZ96BWVvZTRMOFxnyUG5PnTSGKoJE2gd5mbVNmR2Nj20QFzxYYgAXpoqC+AiXzl+UMRh7zQ==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.1.15", + "hasha": "^5.0.0", + "lodash.flattendeep": "^4.4.0", + "release-zalgo": "^1.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/picocolors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", + "dev": true + }, + "node_modules/pkg-dir": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", + "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", + "dev": true, + "dependencies": { + "find-up": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/process-on-spawn": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/process-on-spawn/-/process-on-spawn-1.0.0.tgz", + "integrity": "sha512-1WsPDsUSMmZH5LeMLegqkPDrsGgsWwk1Exipy2hvB0o/F0ASzbpIctSCcZIK1ykJvtTJULEH+20WOFjMvGnCTg==", + "dev": true, + "dependencies": { + "fromentries": "^1.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/release-zalgo": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/release-zalgo/-/release-zalgo-1.0.0.tgz", + "integrity": "sha1-CXALflB0Mpc5Mw5TXFqQ+2eFFzA=", + "dev": true, + "dependencies": { + "es6-error": "^4.0.1" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/require-main-filename": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", + "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", + "dev": true + }, + "node_modules/resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dev": true, + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/rimraf/node_modules/glob": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", + "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", + "dev": true, + "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" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/rimraf/node_modules/minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/samsam": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/samsam/-/samsam-1.1.2.tgz", + "integrity": "sha1-vsEf3IOp/aBjQBIQ5AF2wwJNFWc=", + "deprecated": "This package has been deprecated in favour of @sinonjs/samsam", + "dev": true + }, + "node_modules/semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", + "dev": true + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/side-channel": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", + "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.0", + "get-intrinsic": "^1.0.2", + "object-inspect": "^1.9.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/sigmund": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/sigmund/-/sigmund-1.0.1.tgz", + "integrity": "sha1-P/IfGYytIXX587eBhT/ZTQ0ZtZA=", + "dev": true + }, + "node_modules/signal-exit": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.6.tgz", + "integrity": "sha512-sDl4qMFpijcGw22U5w63KmD3cZJfBuFlVNbVMKje2keoKML7X2UzWbc4XrmEbDwg0NXJc3yv4/ox7b+JWb57kQ==", + "dev": true + }, + "node_modules/sinon": { + "version": "1.17.7", + "resolved": "https://registry.npmjs.org/sinon/-/sinon-1.17.7.tgz", + "integrity": "sha1-RUKk9JugxFwF6y6d2dID4rjv4L8=", + "dev": true, + "dependencies": { + "formatio": "1.1.1", + "lolex": "1.3.2", + "samsam": "1.1.2", + "util": ">=0.10.3 <1" + }, + "engines": { + "node": ">=0.1.103" + } + }, + "node_modules/source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/spawn-wrap": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/spawn-wrap/-/spawn-wrap-2.0.0.tgz", + "integrity": "sha512-EeajNjfN9zMnULLwhZZQU3GWBoFNkbngTUPfaawT4RkMiviTxcX0qfhVbGey39mfctfDHkWtuecgQ8NJcyQWHg==", + "dev": true, + "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" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", + "dev": true + }, + "node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/string.prototype.trimend": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.4.tgz", + "integrity": "sha512-y9xCjw1P23Awk8EvTpcyL2NIr1j7wJ39f+k6lvRnSMz+mz9CGz9NYPelDk42kOz6+ql8xjfK8oYzy3jAP5QU5A==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimstart": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.4.tgz", + "integrity": "sha512-jh6e984OBfvxS50tdY2nRZnoC5/mLFKOREQfw8t5yytkoUsJRNxvI/E39qu1sD0OtWI3OC0XgKSmcWwziwYuZw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-bom": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", + "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/supports-color": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-1.2.0.tgz", + "integrity": "sha1-/x7R5hFp0Gs88tWI4YixjYhH4X4=", + "dev": true, + "bin": { + "supports-color": "cli.js" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/test-exclude": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", + "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", + "dev": true, + "dependencies": { + "@istanbuljs/schema": "^0.1.2", + "glob": "^7.1.4", + "minimatch": "^3.0.4" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/test-exclude/node_modules/glob": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", + "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", + "dev": true, + "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" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/test-exclude/node_modules/minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/to-iso-string": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/to-iso-string/-/to-iso-string-0.0.2.tgz", + "integrity": "sha1-TcGeZk38y+Jb2NtQiwDG2hWCVdE=", + "deprecated": "to-iso-string has been deprecated, use @segment/to-iso-string instead.", + "dev": true + }, + "node_modules/type-fest": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", + "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/typedarray-to-buffer": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", + "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", + "dev": true, + "dependencies": { + "is-typedarray": "^1.0.0" + } + }, + "node_modules/unbox-primitive": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.1.tgz", + "integrity": "sha512-tZU/3NqK3dA5gpE1KtyiJUrEB0lxnGkMFHptJ7q6ewdZ8s12QrODwNbhIJStmJkd1QDXa1NRA8aF2A1zk/Ypyw==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.1", + "has-bigints": "^1.0.1", + "has-symbols": "^1.0.2", + "which-boxed-primitive": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/underscore": { + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.13.1.tgz", + "integrity": "sha512-hzSoAVtJF+3ZtiFX0VgfFPHEDRm7Y/QPjGyNo4TVdnDTdft3tr8hEkD25a1jC+TjTuE7tkHGKkhwCgs9dgBB2g==" + }, + "node_modules/util": { + "version": "0.12.4", + "resolved": "https://registry.npmjs.org/util/-/util-0.12.4.tgz", + "integrity": "sha512-bxZ9qtSlGUWSOy9Qa9Xgk11kSslpuZwaxCg4sNIDj6FLucDab2JxnHwyNTCpHMtK1MjoQiWQ6DiUMZYbSrO+Sw==", + "dev": true, + "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" + } + }, + "node_modules/uuid": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", + "deprecated": "Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details.", + "dev": true, + "bin": { + "uuid": "bin/uuid" + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/which-boxed-primitive": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", + "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", + "dev": true, + "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" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-module": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", + "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", + "dev": true + }, + "node_modules/which-typed-array": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.7.tgz", + "integrity": "sha512-vjxaB4nfDqwKI0ws7wZpxIlde1XrLX5uB0ZjpfshgmapJMD7jJWhZI+yToJTqaFByF0eNBcYxbjmCzoRP7CfEw==", + "dev": true, + "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" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/wrap-ansi": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", + "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/wrap-ansi/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/wrap-ansi/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", + "dev": true + }, + "node_modules/write-file-atomic": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz", + "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==", + "dev": true, + "dependencies": { + "imurmurhash": "^0.1.4", + "is-typedarray": "^1.0.0", + "signal-exit": "^3.0.2", + "typedarray-to-buffer": "^3.1.5" + } + }, + "node_modules/y18n": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", + "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==", + "dev": true + }, + "node_modules/yargs": { + "version": "15.4.1", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz", + "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==", + "dev": true, + "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" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/yargs-parser": { + "version": "18.1.3", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", + "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", + "dev": true, + "dependencies": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + }, + "engines": { + "node": ">=6" + } + } + }, + "dependencies": { + "@babel/code-frame": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.16.0.tgz", + "integrity": "sha512-IF4EOMEV+bfYwOmNxGzSnjR2EmQod7f1UXOpZM3l4i4o4QNwzjtJAu/HxdjHq0aYBvdqMuQEY1eg0nqW9ZPORA==", + "dev": true, + "requires": { + "@babel/highlight": "^7.16.0" + } + }, + "@babel/compat-data": { + "version": "7.16.4", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.16.4.tgz", + "integrity": "sha512-1o/jo7D+kC9ZjHX5v+EHrdjl3PhxMrLSOTGsOdHJ+KL8HCaEK6ehrVL2RS6oHDZp+L7xLirLrPmQtEng769J/Q==", + "dev": true + }, + "@babel/core": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.16.0.tgz", + "integrity": "sha512-mYZEvshBRHGsIAiyH5PzCFTCfbWfoYbO/jcSdXQSUQu1/pW0xDZAUP7KEc32heqWTAfAHhV9j1vH8Sav7l+JNQ==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.16.0", + "@babel/generator": "^7.16.0", + "@babel/helper-compilation-targets": "^7.16.0", + "@babel/helper-module-transforms": "^7.16.0", + "@babel/helpers": "^7.16.0", + "@babel/parser": "^7.16.0", + "@babel/template": "^7.16.0", + "@babel/traverse": "^7.16.0", + "@babel/types": "^7.16.0", + "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" + }, + "dependencies": { + "debug": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", + "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", + "dev": true, + "requires": { + "ms": "2.1.2" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + } + } + }, + "@babel/generator": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.16.0.tgz", + "integrity": "sha512-RR8hUCfRQn9j9RPKEVXo9LiwoxLPYn6hNZlvUOR8tSnaxlD0p0+la00ZP9/SnRt6HchKr+X0fO2r8vrETiJGew==", + "dev": true, + "requires": { + "@babel/types": "^7.16.0", + "jsesc": "^2.5.1", + "source-map": "^0.5.0" + } + }, + "@babel/helper-compilation-targets": { + "version": "7.16.3", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.16.3.tgz", + "integrity": "sha512-vKsoSQAyBmxS35JUOOt+07cLc6Nk/2ljLIHwmq2/NM6hdioUaqEXq/S+nXvbvXbZkNDlWOymPanJGOc4CBjSJA==", + "dev": true, + "requires": { + "@babel/compat-data": "^7.16.0", + "@babel/helper-validator-option": "^7.14.5", + "browserslist": "^4.17.5", + "semver": "^6.3.0" + }, + "dependencies": { + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + } + } + }, + "@babel/helper-function-name": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.16.0.tgz", + "integrity": "sha512-BZh4mEk1xi2h4HFjWUXRQX5AEx4rvaZxHgax9gcjdLWdkjsY7MKt5p0otjsg5noXw+pB+clMCjw+aEVYADMjog==", + "dev": true, + "requires": { + "@babel/helper-get-function-arity": "^7.16.0", + "@babel/template": "^7.16.0", + "@babel/types": "^7.16.0" + } + }, + "@babel/helper-get-function-arity": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.16.0.tgz", + "integrity": "sha512-ASCquNcywC1NkYh/z7Cgp3w31YW8aojjYIlNg4VeJiHkqyP4AzIvr4qx7pYDb4/s8YcsZWqqOSxgkvjUz1kpDQ==", + "dev": true, + "requires": { + "@babel/types": "^7.16.0" + } + }, + "@babel/helper-hoist-variables": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.16.0.tgz", + "integrity": "sha512-1AZlpazjUR0EQZQv3sgRNfM9mEVWPK3M6vlalczA+EECcPz3XPh6VplbErL5UoMpChhSck5wAJHthlj1bYpcmg==", + "dev": true, + "requires": { + "@babel/types": "^7.16.0" + } + }, + "@babel/helper-member-expression-to-functions": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.16.0.tgz", + "integrity": "sha512-bsjlBFPuWT6IWhl28EdrQ+gTvSvj5tqVP5Xeftp07SEuz5pLnsXZuDkDD3Rfcxy0IsHmbZ+7B2/9SHzxO0T+sQ==", + "dev": true, + "requires": { + "@babel/types": "^7.16.0" + } + }, + "@babel/helper-module-imports": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.16.0.tgz", + "integrity": "sha512-kkH7sWzKPq0xt3H1n+ghb4xEMP8k0U7XV3kkB+ZGy69kDk2ySFW1qPi06sjKzFY3t1j6XbJSqr4mF9L7CYVyhg==", + "dev": true, + "requires": { + "@babel/types": "^7.16.0" + } + }, + "@babel/helper-module-transforms": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.16.0.tgz", + "integrity": "sha512-My4cr9ATcaBbmaEa8M0dZNA74cfI6gitvUAskgDtAFmAqyFKDSHQo5YstxPbN+lzHl2D9l/YOEFqb2mtUh4gfA==", + "dev": true, + "requires": { + "@babel/helper-module-imports": "^7.16.0", + "@babel/helper-replace-supers": "^7.16.0", + "@babel/helper-simple-access": "^7.16.0", + "@babel/helper-split-export-declaration": "^7.16.0", + "@babel/helper-validator-identifier": "^7.15.7", + "@babel/template": "^7.16.0", + "@babel/traverse": "^7.16.0", + "@babel/types": "^7.16.0" + } + }, + "@babel/helper-optimise-call-expression": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.16.0.tgz", + "integrity": "sha512-SuI467Gi2V8fkofm2JPnZzB/SUuXoJA5zXe/xzyPP2M04686RzFKFHPK6HDVN6JvWBIEW8tt9hPR7fXdn2Lgpw==", + "dev": true, + "requires": { + "@babel/types": "^7.16.0" + } + }, + "@babel/helper-replace-supers": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.16.0.tgz", + "integrity": "sha512-TQxuQfSCdoha7cpRNJvfaYxxxzmbxXw/+6cS7V02eeDYyhxderSoMVALvwupA54/pZcOTtVeJ0xccp1nGWladA==", + "dev": true, + "requires": { + "@babel/helper-member-expression-to-functions": "^7.16.0", + "@babel/helper-optimise-call-expression": "^7.16.0", + "@babel/traverse": "^7.16.0", + "@babel/types": "^7.16.0" + } + }, + "@babel/helper-simple-access": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.16.0.tgz", + "integrity": "sha512-o1rjBT/gppAqKsYfUdfHq5Rk03lMQrkPHG1OWzHWpLgVXRH4HnMM9Et9CVdIqwkCQlobnGHEJMsgWP/jE1zUiw==", + "dev": true, + "requires": { + "@babel/types": "^7.16.0" + } + }, + "@babel/helper-split-export-declaration": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.16.0.tgz", + "integrity": "sha512-0YMMRpuDFNGTHNRiiqJX19GjNXA4H0E8jZ2ibccfSxaCogbm3am5WN/2nQNj0YnQwGWM1J06GOcQ2qnh3+0paw==", + "dev": true, + "requires": { + "@babel/types": "^7.16.0" + } + }, + "@babel/helper-validator-identifier": { + "version": "7.15.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.15.7.tgz", + "integrity": "sha512-K4JvCtQqad9OY2+yTU8w+E82ywk/fe+ELNlt1G8z3bVGlZfn/hOcQQsUhGhW/N+tb3fxK800wLtKOE/aM0m72w==", + "dev": true + }, + "@babel/helper-validator-option": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.14.5.tgz", + "integrity": "sha512-OX8D5eeX4XwcroVW45NMvoYaIuFI+GQpA2a8Gi+X/U/cDUIRsV37qQfF905F0htTRCREQIB4KqPeaveRJUl3Ow==", + "dev": true + }, + "@babel/helpers": { + "version": "7.16.3", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.16.3.tgz", + "integrity": "sha512-Xn8IhDlBPhvYTvgewPKawhADichOsbkZuzN7qz2BusOM0brChsyXMDJvldWaYMMUNiCQdQzNEioXTp3sC8Nt8w==", + "dev": true, + "requires": { + "@babel/template": "^7.16.0", + "@babel/traverse": "^7.16.3", + "@babel/types": "^7.16.0" + } + }, + "@babel/highlight": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.16.0.tgz", + "integrity": "sha512-t8MH41kUQylBtu2+4IQA3atqevA2lRgqA2wyVB/YiWmsDSuylZZuXOUy9ric30hfzauEFfdsuk/eXTRrGrfd0g==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.15.7", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + } + }, + "@babel/parser": { + "version": "7.16.4", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.16.4.tgz", + "integrity": "sha512-6V0qdPUaiVHH3RtZeLIsc+6pDhbYzHR8ogA8w+f+Wc77DuXto19g2QUwveINoS34Uw+W8/hQDGJCx+i4n7xcng==", + "dev": true + }, + "@babel/template": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.16.0.tgz", + "integrity": "sha512-MnZdpFD/ZdYhXwiunMqqgyZyucaYsbL0IrjoGjaVhGilz+x8YB++kRfygSOIj1yOtWKPlx7NBp+9I1RQSgsd5A==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.16.0", + "@babel/parser": "^7.16.0", + "@babel/types": "^7.16.0" + } + }, + "@babel/traverse": { + "version": "7.16.3", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.16.3.tgz", + "integrity": "sha512-eolumr1vVMjqevCpwVO99yN/LoGL0EyHiLO5I043aYQvwOJ9eR5UsZSClHVCzfhBduMAsSzgA/6AyqPjNayJag==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.16.0", + "@babel/generator": "^7.16.0", + "@babel/helper-function-name": "^7.16.0", + "@babel/helper-hoist-variables": "^7.16.0", + "@babel/helper-split-export-declaration": "^7.16.0", + "@babel/parser": "^7.16.3", + "@babel/types": "^7.16.0", + "debug": "^4.1.0", + "globals": "^11.1.0" + }, + "dependencies": { + "debug": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", + "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", + "dev": true, + "requires": { + "ms": "2.1.2" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + } + } + }, + "@babel/types": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.16.0.tgz", + "integrity": "sha512-PJgg/k3SdLsGb3hhisFvtLOw5ts113klrpLuIPtCJIU+BB24fqq6lf8RWqKJEjzqXR9AEH1rIb5XTqwBHB+kQg==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.15.7", + "to-fast-properties": "^2.0.0" + } + }, + "@istanbuljs/load-nyc-config": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", + "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", + "dev": true, + "requires": { + "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": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", + "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", + "dev": true + }, + "aggregate-error": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", + "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", + "dev": true, + "requires": { + "clean-stack": "^2.0.0", + "indent-string": "^4.0.0" + } + }, + "ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true + }, + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "append-transform": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/append-transform/-/append-transform-2.0.0.tgz", + "integrity": "sha512-7yeyCEurROLQJFv5Xj4lEGTy0borxepjFv1g22oAdqFu//SrAlDl1O1Nxx15SH1RoliUml6p8dwJW9jvZughhg==", + "dev": true, + "requires": { + "default-require-extensions": "^3.0.0" + } + }, + "archy": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/archy/-/archy-1.0.0.tgz", + "integrity": "sha1-+cjBN1fMHde8N5rHeyxipcKGjEA=", + "dev": true + }, + "argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "requires": { + "sprintf-js": "~1.0.2" + } + }, + "available-typed-arrays": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz", + "integrity": "sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==", + "dev": true + }, + "balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true + }, + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "browserslist": { + "version": "4.18.1", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.18.1.tgz", + "integrity": "sha512-8ScCzdpPwR2wQh8IT82CA2VgDwjHyqMovPBZSNH54+tm4Jk2pCuv90gmAdH6J84OCRWi0b4gMe6O6XPXuJnjgQ==", + "dev": true, + "requires": { + "caniuse-lite": "^1.0.30001280", + "electron-to-chromium": "^1.3.896", + "escalade": "^3.1.1", + "node-releases": "^2.0.1", + "picocolors": "^1.0.0" + } + }, + "caching-transform": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/caching-transform/-/caching-transform-4.0.0.tgz", + "integrity": "sha512-kpqOvwXnjjN44D89K5ccQC+RUrsy7jB/XLlRrx0D7/2HNcTPqzsb6XgYoErwko6QsV184CA2YgS1fxDiiDZMWA==", + "dev": true, + "requires": { + "hasha": "^5.0.0", + "make-dir": "^3.0.0", + "package-hash": "^4.0.0", + "write-file-atomic": "^3.0.0" + } + }, + "call-bind": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "dev": true, + "requires": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" + } + }, + "camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true + }, + "caniuse-lite": { + "version": "1.0.30001284", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001284.tgz", + "integrity": "sha512-t28SKa7g6kiIQi6NHeOcKrOrGMzCRrXvlasPwWC26TH2QNdglgzQIRUuJ0cR3NeQPH+5jpuveeeSFDLm2zbkEw==", + "dev": true + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "dependencies": { + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "dev": true + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "clean-stack": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", + "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", + "dev": true + }, + "cliui": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", + "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", + "dev": true, + "requires": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^6.2.0" + } + }, + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "dev": true + }, + "commander": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.3.0.tgz", + "integrity": "sha1-/UMOiJgy7DU7ms0d4hfBHLPu+HM=", + "dev": true + }, + "commondir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", + "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=", + "dev": true + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", + "dev": true + }, + "convert-source-map": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.8.0.tgz", + "integrity": "sha512-+OQdjP49zViI/6i7nIJpA8rAl4sV/JdPfU9nZs3VqOwGIgizICvuN2ru6fMd+4llL0tar18UYJXfZ/TWtmhUjA==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.1" + }, + "dependencies": { + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + } + } + }, + "cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dev": true, + "requires": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + } + }, + "debug": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.2.0.tgz", + "integrity": "sha1-+HBX6ZWxofauaklgZkE3vFbwOdo=", + "dev": true, + "requires": { + "ms": "0.7.1" + } + }, + "decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", + "dev": true + }, + "default-require-extensions": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/default-require-extensions/-/default-require-extensions-3.0.0.tgz", + "integrity": "sha512-ek6DpXq/SCpvjhpFsLFRVtIxJCRw6fUR42lYMVZuUMK7n8eMz4Uh5clckdBjEpLhn/gEBZo7hDJnJcwdKLKQjg==", + "dev": true, + "requires": { + "strip-bom": "^4.0.0" + } + }, + "define-properties": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", + "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", + "dev": true, + "requires": { + "object-keys": "^1.0.12" + } + }, + "diff": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-1.4.0.tgz", + "integrity": "sha1-fyjS657nsVqX79ic5j3P2qPMur8=", + "dev": true + }, + "egal": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/egal/-/egal-1.3.0.tgz", + "integrity": "sha1-IKGc+oDOlzP4QTY10AQmQfQpGHs=", + "dev": true, + "requires": { + "kindof": ">= 2.0.0 < 3" + } + }, + "electron-to-chromium": { + "version": "1.4.11", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.11.tgz", + "integrity": "sha512-2OhsaYgsWGhWjx2et8kaUcdktPbBGjKM2X0BReUCKcSCPttEY+hz2zie820JLbttU8jwL92+JJysWwkut3wZgA==", + "dev": true + }, + "emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "es-abstract": { + "version": "1.19.1", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.19.1.tgz", + "integrity": "sha512-2vJ6tjA/UfqLm2MPs7jxVybLoB8i1t1Jd9R3kISld20sIxPcTbLuggQOUxeWeAvIUkduv/CfMjuh4WmiXr2v9w==", + "dev": true, + "requires": { + "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": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", + "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", + "dev": true, + "requires": { + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" + } + }, + "es6-error": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/es6-error/-/es6-error-4.1.1.tgz", + "integrity": "sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg==", + "dev": true + }, + "escalade": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "dev": true + }, + "escape-string-regexp": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.2.tgz", + "integrity": "sha1-Tbwv5nTnGUnK8/smlc5/LcHZqNE=", + "dev": true + }, + "esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "dev": true + }, + "find-cache-dir": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.2.tgz", + "integrity": "sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==", + "dev": true, + "requires": { + "commondir": "^1.0.1", + "make-dir": "^3.0.2", + "pkg-dir": "^4.1.0" + } + }, + "find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "requires": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + } + }, + "foreach": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/foreach/-/foreach-2.0.5.tgz", + "integrity": "sha1-C+4AUBiusmDQo6865ljdATbsG5k=", + "dev": true + }, + "foreground-child": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-2.0.0.tgz", + "integrity": "sha512-dCIq9FpEcyQyXKCkyzmlPTFNgrCzPudOe+mhvJU5zAtlBnGVy2yKxtfsxK2tQBThwq225jcvBjpw1Gr40uzZCA==", + "dev": true, + "requires": { + "cross-spawn": "^7.0.0", + "signal-exit": "^3.0.2" + } + }, + "formatio": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/formatio/-/formatio-1.1.1.tgz", + "integrity": "sha1-XtPM1jZVEJc4NGXZlhmRAOhhYek=", + "dev": true, + "requires": { + "samsam": "~1.1" + } + }, + "fromentries": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/fromentries/-/fromentries-1.3.2.tgz", + "integrity": "sha512-cHEpEQHUg0f8XdtZCc2ZAhrHzKzT0MrFUTcvx+hfxYu7rGMDc5SKoXFh+n4YigxsHXRzc6OrCshdR1bWH6HHyg==", + "dev": true + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", + "dev": true + }, + "function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", + "dev": true + }, + "gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "dev": true + }, + "get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "dev": true + }, + "get-intrinsic": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.1.tgz", + "integrity": "sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==", + "dev": true, + "requires": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1" + } + }, + "get-package-type": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", + "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", + "dev": true + }, + "get-symbol-description": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz", + "integrity": "sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.1" + } + }, + "glob": { + "version": "3.2.11", + "resolved": "https://registry.npmjs.org/glob/-/glob-3.2.11.tgz", + "integrity": "sha1-Spc/Y1uRkPcV0QmH1cAP0oFevj0=", + "dev": true, + "requires": { + "inherits": "2", + "minimatch": "0.3" + } + }, + "globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "dev": true + }, + "graceful-fs": { + "version": "4.2.8", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.8.tgz", + "integrity": "sha512-qkIilPUYcNhJpd33n0GBXTB1MMPp14TxEsEs0pTrsSVucApsYzW5V+Q8Qxhik6KU3evy+qkAAowTByymK0avdg==", + "dev": true + }, + "growl": { + "version": "1.9.2", + "resolved": "https://registry.npmjs.org/growl/-/growl-1.9.2.tgz", + "integrity": "sha1-Dqd0NxXbjY3ixe3hd14bRayFwC8=", + "dev": true + }, + "has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dev": true, + "requires": { + "function-bind": "^1.1.1" + } + }, + "has-bigints": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.1.tgz", + "integrity": "sha512-LSBS2LjbNBTf6287JEbEzvJgftkF5qFkmCo9hDRpAzKhUOlJ+hx8dd4USs00SgsUNwc4617J9ki5YtEClM2ffA==", + "dev": true + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true + }, + "has-symbols": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.2.tgz", + "integrity": "sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw==", + "dev": true + }, + "has-tostringtag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", + "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", + "dev": true, + "requires": { + "has-symbols": "^1.0.2" + } + }, + "hasha": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/hasha/-/hasha-5.2.2.tgz", + "integrity": "sha512-Hrp5vIK/xr5SkeN2onO32H0MgNZ0f17HRNH39WfL0SYUNOTZ5Lz1TJ8Pajo/87dYGEFlLMm7mIc/k/s6Bvz9HQ==", + "dev": true, + "requires": { + "is-stream": "^2.0.0", + "type-fest": "^0.8.0" + } + }, + "html-escaper": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", + "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", + "dev": true + }, + "imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", + "dev": true + }, + "indent-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", + "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", + "dev": true + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "dev": true, + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true + }, + "internal-slot": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.3.tgz", + "integrity": "sha512-O0DB1JC/sPyZl7cIo78n5dR7eUSwwpYPiXRhTzNxZVAMUuB8vlnRFyLxdrVToks6XPLVnFfbzaVd5WLjhgg+vA==", + "dev": true, + "requires": { + "get-intrinsic": "^1.1.0", + "has": "^1.0.3", + "side-channel": "^1.0.4" + } + }, + "is-arguments": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz", + "integrity": "sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + } + }, + "is-bigint": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", + "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", + "dev": true, + "requires": { + "has-bigints": "^1.0.1" + } + }, + "is-boolean-object": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", + "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + } + }, + "is-callable": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.4.tgz", + "integrity": "sha512-nsuwtxZfMX67Oryl9LCQ+upnC0Z0BgpwntpS89m1H/TLF0zNfzfLMV/9Wa/6MZsj0acpEjAO0KF1xT6ZdLl95w==", + "dev": true + }, + "is-date-object": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", + "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", + "dev": true, + "requires": { + "has-tostringtag": "^1.0.0" + } + }, + "is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true + }, + "is-generator-function": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.10.tgz", + "integrity": "sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==", + "dev": true, + "requires": { + "has-tostringtag": "^1.0.0" + } + }, + "is-negative-zero": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.1.tgz", + "integrity": "sha512-2z6JzQvZRa9A2Y7xC6dQQm4FSTSTNWjKIYYTt4246eMTJmIo0Q+ZyOsU66X8lxK1AbB92dFeglPLrhwpeRKO6w==", + "dev": true + }, + "is-number-object": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.6.tgz", + "integrity": "sha512-bEVOqiRcvo3zO1+G2lVMy+gkkEm9Yh7cDMRusKKu5ZJKPUYSJwICTKZrNKHA2EbSP0Tu0+6B/emsYNHZyn6K8g==", + "dev": true, + "requires": { + "has-tostringtag": "^1.0.0" + } + }, + "is-regex": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", + "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + } + }, + "is-shared-array-buffer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.1.tgz", + "integrity": "sha512-IU0NmyknYZN0rChcKhRO1X8LYz5Isj/Fsqh8NJOSf+N/hCOTwy29F32Ik7a+QszE63IdvmwdTPDd6cZ5pg4cwA==", + "dev": true + }, + "is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "dev": true + }, + "is-string": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", + "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", + "dev": true, + "requires": { + "has-tostringtag": "^1.0.0" + } + }, + "is-symbol": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", + "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", + "dev": true, + "requires": { + "has-symbols": "^1.0.2" + } + }, + "is-typed-array": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.8.tgz", + "integrity": "sha512-HqH41TNZq2fgtGT8WHVFVJhBVGuY3AnP3Q36K8JKXUxSxRgk/d+7NjmwG2vo2mYmXK8UYZKu0qH8bVP5gEisjA==", + "dev": true, + "requires": { + "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": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", + "dev": true + }, + "is-weakref": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.1.tgz", + "integrity": "sha512-b2jKc2pQZjaeFYWEf7ScFj+Be1I+PXmlu572Q8coTXZ+LD/QQZ7ShPMst8h16riVgyXTQwUsFEl74mDvc/3MHQ==", + "dev": true, + "requires": { + "call-bind": "^1.0.0" + } + }, + "is-windows": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", + "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", + "dev": true + }, + "isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", + "dev": true + }, + "istanbul-lib-coverage": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz", + "integrity": "sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw==", + "dev": true + }, + "istanbul-lib-hook": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-hook/-/istanbul-lib-hook-3.0.0.tgz", + "integrity": "sha512-Pt/uge1Q9s+5VAZ+pCo16TYMWPBIl+oaNIjgLQxcX0itS6ueeaA+pEfThZpH8WxhFgCiEb8sAJY6MdUKgiIWaQ==", + "dev": true, + "requires": { + "append-transform": "^2.0.0" + } + }, + "istanbul-lib-instrument": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-4.0.3.tgz", + "integrity": "sha512-BXgQl9kf4WTCPCCpmFGoJkz/+uhvm7h7PFKUYxh7qarQd3ER33vHG//qaE8eN25l07YqZPpHXU9I09l/RD5aGQ==", + "dev": true, + "requires": { + "@babel/core": "^7.7.5", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-coverage": "^3.0.0", + "semver": "^6.3.0" + }, + "dependencies": { + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + } + } + }, + "istanbul-lib-processinfo": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/istanbul-lib-processinfo/-/istanbul-lib-processinfo-2.0.2.tgz", + "integrity": "sha512-kOwpa7z9hme+IBPZMzQ5vdQj8srYgAtaRqeI48NGmAQ+/5yKiHLV0QbYqQpxsdEF0+w14SoB8YbnHKcXE2KnYw==", + "dev": true, + "requires": { + "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": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", + "integrity": "sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw==", + "dev": true, + "requires": { + "istanbul-lib-coverage": "^3.0.0", + "make-dir": "^3.0.0", + "supports-color": "^7.1.0" + }, + "dependencies": { + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "istanbul-lib-source-maps": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz", + "integrity": "sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==", + "dev": true, + "requires": { + "debug": "^4.1.1", + "istanbul-lib-coverage": "^3.0.0", + "source-map": "^0.6.1" + }, + "dependencies": { + "debug": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", + "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", + "dev": true, + "requires": { + "ms": "2.1.2" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, + "istanbul-reports": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.1.tgz", + "integrity": "sha512-q1kvhAXWSsXfMjCdNHNPKZZv94OlspKnoGv+R9RGbnqOOQ0VbNfLFgQDVgi7hHenKsndGq3/o0OBdzDXthWcNw==", + "dev": true, + "requires": { + "html-escaper": "^2.0.0", + "istanbul-lib-report": "^3.0.0" + } + }, + "jade": { + "version": "0.26.3", + "resolved": "https://registry.npmjs.org/jade/-/jade-0.26.3.tgz", + "integrity": "sha1-jxDXl32NefL2/4YqgbBRPMslaGw=", + "dev": true, + "requires": { + "commander": "0.6.1", + "mkdirp": "0.3.0" + }, + "dependencies": { + "commander": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-0.6.1.tgz", + "integrity": "sha1-+mihT2qUXVTbvlDYzbMyDp47GgY=", + "dev": true + }, + "mkdirp": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.3.0.tgz", + "integrity": "sha1-G79asbqCevI1dRQ0kEJkVfSB/h4=", + "dev": true + } + } + }, + "js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true + }, + "js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "dev": true, + "requires": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + } + }, + "jsesc": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "dev": true + }, + "json-stringify-safe": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", + "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=", + "dev": true + }, + "json5": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.0.tgz", + "integrity": "sha512-f+8cldu7X/y7RAJurMEJmdoKXGB/X550w2Nr3tTbezL6RwEE/iMcm+tZnXeoZtKuOq6ft8+CqzEkrIgx1fPoQA==", + "dev": true, + "requires": { + "minimist": "^1.2.5" + }, + "dependencies": { + "minimist": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", + "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", + "dev": true + } + } + }, + "kindof": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/kindof/-/kindof-2.0.0.tgz", + "integrity": "sha1-wzW69gOnfMN/i0Brc7ZGP9vfGr4=", + "dev": true + }, + "locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "requires": { + "p-locate": "^4.1.0" + } + }, + "lodash._createwrapper": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/lodash._createwrapper/-/lodash._createwrapper-3.2.0.tgz", + "integrity": "sha1-30U+ZkFjIXuJWkVAZa8cR6DqPE0=", + "dev": true, + "requires": { + "lodash._root": "^3.0.0" + } + }, + "lodash._root": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/lodash._root/-/lodash._root-3.0.1.tgz", + "integrity": "sha1-+6HEUkwZ7ppfgTa0YJ8BfPTe1pI=", + "dev": true + }, + "lodash.flattendeep": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/lodash.flattendeep/-/lodash.flattendeep-4.4.0.tgz", + "integrity": "sha1-+wMJF/hqMTTlvJvsDWngAT3f7bI=", + "dev": true + }, + "lodash.wrap": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/lodash.wrap/-/lodash.wrap-3.0.1.tgz", + "integrity": "sha1-P82L74Z7LsjCG6xjjYFhgFk/cas=", + "dev": true, + "requires": { + "lodash._createwrapper": "^3.0.0" + } + }, + "lolex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/lolex/-/lolex-1.3.2.tgz", + "integrity": "sha1-fD2mL/yzDw9agKJWbKJORdigHzE=", + "dev": true + }, + "lru-cache": { + "version": "2.7.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-2.7.3.tgz", + "integrity": "sha1-bUUk6LlV+V1PW1iFHOId1y+06VI=", + "dev": true + }, + "make-dir": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", + "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", + "dev": true, + "requires": { + "semver": "^6.0.0" + }, + "dependencies": { + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + } + } + }, + "minimatch": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-0.3.0.tgz", + "integrity": "sha1-J12O2qxPG7MyZHIInnlJyDlGmd0=", + "dev": true, + "requires": { + "lru-cache": "2", + "sigmund": "~1.0.0" + } + }, + "minimist": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", + "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", + "dev": true + }, + "mkdirp": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", + "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", + "dev": true, + "requires": { + "minimist": "0.0.8" + } + }, + "mocha": { + "version": "2.5.3", + "resolved": "https://registry.npmjs.org/mocha/-/mocha-2.5.3.tgz", + "integrity": "sha1-FhvlvetJZ3HrmzV0UFC2IrWu/Fg=", + "dev": true, + "requires": { + "commander": "2.3.0", + "debug": "2.2.0", + "diff": "1.4.0", + "escape-string-regexp": "1.0.2", + "glob": "3.2.11", + "growl": "1.9.2", + "jade": "0.26.3", + "mkdirp": "0.5.1", + "supports-color": "1.2.0", + "to-iso-string": "0.0.2" + } + }, + "ms": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.1.tgz", + "integrity": "sha1-nNE8A62/8ltl7/3nzoZO6VIBcJg=", + "dev": true + }, + "must": { + "version": "0.13.4", + "resolved": "https://registry.npmjs.org/must/-/must-0.13.4.tgz", + "integrity": "sha1-nROJ9FjolLKqBAMr/rekBxT3gXE=", + "dev": true, + "requires": { + "egal": ">= 1.3.0 < 2", + "json-stringify-safe": ">= 5 < 6", + "kindof": ">= 2.0.0 < 3", + "lodash.wrap": ">= 3 < 4", + "oolong": ">= 1.11.0 < 2" + } + }, + "node-preload": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/node-preload/-/node-preload-0.2.1.tgz", + "integrity": "sha512-RM5oyBy45cLEoHqCeh+MNuFAxO0vTFBLskvQbOKnEE7YTTSN4tbN8QWDIPQ6L+WvKsB/qLEGpYe2ZZ9d4W9OIQ==", + "dev": true, + "requires": { + "process-on-spawn": "^1.0.0" + } + }, + "node-releases": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.1.tgz", + "integrity": "sha512-CqyzN6z7Q6aMeF/ktcMVTzhAHCEpf8SOarwpzpf8pNBY2k5/oM34UHldUwp8VKI7uxct2HxSRdJjBaZeESzcxA==", + "dev": true + }, + "nyc": { + "version": "15.1.0", + "resolved": "https://registry.npmjs.org/nyc/-/nyc-15.1.0.tgz", + "integrity": "sha512-jMW04n9SxKdKi1ZMGhvUTHBN0EICCRkHemEoE5jm6mTYcqcdas0ATzgUgejlQUHMvpnOZqGB5Xxsv9KxJW1j8A==", + "dev": true, + "requires": { + "@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" + }, + "dependencies": { + "glob": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", + "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", + "dev": true, + "requires": { + "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" + } + }, + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } + } + } + }, + "object-inspect": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.11.0.tgz", + "integrity": "sha512-jp7ikS6Sd3GxQfZJPyH3cjcbJF6GZPClgdV+EFygjFLQ5FmW/dRUnTd9PQ9k0JhoNDabWFbpF1yCdSWCC6gexg==", + "dev": true + }, + "object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "dev": true + }, + "object.assign": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.2.tgz", + "integrity": "sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ==", + "dev": true, + "requires": { + "call-bind": "^1.0.0", + "define-properties": "^1.1.3", + "has-symbols": "^1.0.1", + "object-keys": "^1.1.1" + } + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "dev": true, + "requires": { + "wrappy": "1" + } + }, + "oolong": { + "version": "1.15.1", + "resolved": "https://registry.npmjs.org/oolong/-/oolong-1.15.1.tgz", + "integrity": "sha1-kLrJ585S9gkGqyIo2eKxFfEIbOo=", + "dev": true + }, + "p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "requires": { + "p-try": "^2.0.0" + } + }, + "p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "requires": { + "p-limit": "^2.2.0" + } + }, + "p-map": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-3.0.0.tgz", + "integrity": "sha512-d3qXVTF/s+W+CdJ5A29wywV2n8CQQYahlgz2bFiA+4eVNJbHJodPZ+/gXwPGh0bOqA+j8S+6+ckmvLGPk1QpxQ==", + "dev": true, + "requires": { + "aggregate-error": "^3.0.0" + } + }, + "p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true + }, + "package-hash": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/package-hash/-/package-hash-4.0.0.tgz", + "integrity": "sha512-whdkPIooSu/bASggZ96BWVvZTRMOFxnyUG5PnTSGKoJE2gd5mbVNmR2Nj20QFzxYYgAXpoqC+AiXzl+UMRh7zQ==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.15", + "hasha": "^5.0.0", + "lodash.flattendeep": "^4.4.0", + "release-zalgo": "^1.0.0" + } + }, + "path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", + "dev": true + }, + "path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true + }, + "picocolors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", + "dev": true + }, + "pkg-dir": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", + "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", + "dev": true, + "requires": { + "find-up": "^4.0.0" + } + }, + "process-on-spawn": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/process-on-spawn/-/process-on-spawn-1.0.0.tgz", + "integrity": "sha512-1WsPDsUSMmZH5LeMLegqkPDrsGgsWwk1Exipy2hvB0o/F0ASzbpIctSCcZIK1ykJvtTJULEH+20WOFjMvGnCTg==", + "dev": true, + "requires": { + "fromentries": "^1.2.0" + } + }, + "release-zalgo": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/release-zalgo/-/release-zalgo-1.0.0.tgz", + "integrity": "sha1-CXALflB0Mpc5Mw5TXFqQ+2eFFzA=", + "dev": true, + "requires": { + "es6-error": "^4.0.1" + } + }, + "require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", + "dev": true + }, + "require-main-filename": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", + "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", + "dev": true + }, + "resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true + }, + "rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dev": true, + "requires": { + "glob": "^7.1.3" + }, + "dependencies": { + "glob": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", + "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", + "dev": true, + "requires": { + "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" + } + }, + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } + } + } + }, + "safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true + }, + "samsam": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/samsam/-/samsam-1.1.2.tgz", + "integrity": "sha1-vsEf3IOp/aBjQBIQ5AF2wwJNFWc=", + "dev": true + }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" + }, + "set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", + "dev": true + }, + "shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "requires": { + "shebang-regex": "^3.0.0" + } + }, + "shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true + }, + "side-channel": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", + "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "dev": true, + "requires": { + "call-bind": "^1.0.0", + "get-intrinsic": "^1.0.2", + "object-inspect": "^1.9.0" + } + }, + "sigmund": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/sigmund/-/sigmund-1.0.1.tgz", + "integrity": "sha1-P/IfGYytIXX587eBhT/ZTQ0ZtZA=", + "dev": true + }, + "signal-exit": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.6.tgz", + "integrity": "sha512-sDl4qMFpijcGw22U5w63KmD3cZJfBuFlVNbVMKje2keoKML7X2UzWbc4XrmEbDwg0NXJc3yv4/ox7b+JWb57kQ==", + "dev": true + }, + "sinon": { + "version": "1.17.7", + "resolved": "https://registry.npmjs.org/sinon/-/sinon-1.17.7.tgz", + "integrity": "sha1-RUKk9JugxFwF6y6d2dID4rjv4L8=", + "dev": true, + "requires": { + "formatio": "1.1.1", + "lolex": "1.3.2", + "samsam": "1.1.2", + "util": ">=0.10.3 <1" + } + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + }, + "spawn-wrap": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/spawn-wrap/-/spawn-wrap-2.0.0.tgz", + "integrity": "sha512-EeajNjfN9zMnULLwhZZQU3GWBoFNkbngTUPfaawT4RkMiviTxcX0qfhVbGey39mfctfDHkWtuecgQ8NJcyQWHg==", + "dev": true, + "requires": { + "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" + } + }, + "sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", + "dev": true + }, + "string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + } + }, + "string.prototype.trimend": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.4.tgz", + "integrity": "sha512-y9xCjw1P23Awk8EvTpcyL2NIr1j7wJ39f+k6lvRnSMz+mz9CGz9NYPelDk42kOz6+ql8xjfK8oYzy3jAP5QU5A==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3" + } + }, + "string.prototype.trimstart": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.4.tgz", + "integrity": "sha512-jh6e984OBfvxS50tdY2nRZnoC5/mLFKOREQfw8t5yytkoUsJRNxvI/E39qu1sD0OtWI3OC0XgKSmcWwziwYuZw==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3" + } + }, + "strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "requires": { + "ansi-regex": "^5.0.1" + } + }, + "strip-bom": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", + "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", + "dev": true + }, + "supports-color": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-1.2.0.tgz", + "integrity": "sha1-/x7R5hFp0Gs88tWI4YixjYhH4X4=", + "dev": true + }, + "test-exclude": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", + "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", + "dev": true, + "requires": { + "@istanbuljs/schema": "^0.1.2", + "glob": "^7.1.4", + "minimatch": "^3.0.4" + }, + "dependencies": { + "glob": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", + "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", + "dev": true, + "requires": { + "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" + } + }, + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } + } + } + }, + "to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", + "dev": true + }, + "to-iso-string": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/to-iso-string/-/to-iso-string-0.0.2.tgz", + "integrity": "sha1-TcGeZk38y+Jb2NtQiwDG2hWCVdE=", + "dev": true + }, + "type-fest": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", + "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", + "dev": true + }, + "typedarray-to-buffer": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", + "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", + "dev": true, + "requires": { + "is-typedarray": "^1.0.0" + } + }, + "unbox-primitive": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.1.tgz", + "integrity": "sha512-tZU/3NqK3dA5gpE1KtyiJUrEB0lxnGkMFHptJ7q6ewdZ8s12QrODwNbhIJStmJkd1QDXa1NRA8aF2A1zk/Ypyw==", + "dev": true, + "requires": { + "function-bind": "^1.1.1", + "has-bigints": "^1.0.1", + "has-symbols": "^1.0.2", + "which-boxed-primitive": "^1.0.2" + } + }, + "underscore": { + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.13.1.tgz", + "integrity": "sha512-hzSoAVtJF+3ZtiFX0VgfFPHEDRm7Y/QPjGyNo4TVdnDTdft3tr8hEkD25a1jC+TjTuE7tkHGKkhwCgs9dgBB2g==" + }, + "util": { + "version": "0.12.4", + "resolved": "https://registry.npmjs.org/util/-/util-0.12.4.tgz", + "integrity": "sha512-bxZ9qtSlGUWSOy9Qa9Xgk11kSslpuZwaxCg4sNIDj6FLucDab2JxnHwyNTCpHMtK1MjoQiWQ6DiUMZYbSrO+Sw==", + "dev": true, + "requires": { + "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" + } + }, + "uuid": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", + "dev": true + }, + "which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + }, + "which-boxed-primitive": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", + "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", + "dev": true, + "requires": { + "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": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", + "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", + "dev": true + }, + "which-typed-array": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.7.tgz", + "integrity": "sha512-vjxaB4nfDqwKI0ws7wZpxIlde1XrLX5uB0ZjpfshgmapJMD7jJWhZI+yToJTqaFByF0eNBcYxbjmCzoRP7CfEw==", + "dev": true, + "requires": { + "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" + } + }, + "wrap-ansi": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", + "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", + "dev": true, + "requires": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + } + } + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", + "dev": true + }, + "write-file-atomic": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz", + "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==", + "dev": true, + "requires": { + "imurmurhash": "^0.1.4", + "is-typedarray": "^1.0.0", + "signal-exit": "^3.0.2", + "typedarray-to-buffer": "^3.1.5" + } + }, + "y18n": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", + "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==", + "dev": true + }, + "yargs": { + "version": "15.4.1", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz", + "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==", + "dev": true, + "requires": { + "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-parser": { + "version": "18.1.3", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", + "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", + "dev": true, + "requires": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + } + } + } } From 299ef6bb8793151e6a9b5b084c64eee19bc90a98 Mon Sep 17 00:00:00 2001 From: Gregor Martynus <39992+gr2m@users.noreply.github.com> Date: Fri, 3 Dec 2021 23:03:38 -0800 Subject: [PATCH 10/59] build(gitignore): `.nyc_output/` --- .gitignore | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index 07e6e47..2ac2cb5 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,2 @@ -/node_modules +.nyc_output/ +node_modules/ \ No newline at end of file From b098aea0bc2ce5c02e0dcac12da7ad133782fe0e Mon Sep 17 00:00:00 2001 From: Gregor Martynus <39992+gr2m@users.noreply.github.com> Date: Fri, 3 Dec 2021 23:07:52 -0800 Subject: [PATCH 11/59] build(deps): prettier --- package.json | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/package.json b/package.json index 0f6f20d..c92dd4f 100644 --- a/package.json +++ b/package.json @@ -33,7 +33,9 @@ ], "main": "index.js", "scripts": { - "test": "nyc mocha" + "test": "nyc mocha", + "lint": "prettier --check \"{lib,test}/**/*.{js,json,ts}\" \"*.{js,json,md}\"", + "lint:fix": "prettier --write \"{lib,test}/**/*.{js,json,ts}\" \"*.{js,json,md}\"" }, "dependencies": { "semver": ">= 5 < 6", @@ -43,6 +45,7 @@ "mocha": ">= 1.12.0 < 3", "must": ">= 0.13 < 0.14", "nyc": "^15.1.0", + "prettier": "^2.5.0", "sinon": ">= 1.9 < 2" }, "engines": { From 08597f2936f41f54aa7ce430632aa3c0b330869a Mon Sep 17 00:00:00 2001 From: Gregor Martynus <39992+gr2m@users.noreply.github.com> Date: Fri, 3 Dec 2021 23:07:53 -0800 Subject: [PATCH 12/59] build(package): lock file --- package-lock.json | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/package-lock.json b/package-lock.json index ee5a270..f921537 100644 --- a/package-lock.json +++ b/package-lock.json @@ -15,6 +15,7 @@ "mocha": ">= 1.12.0 < 3", "must": ">= 0.13 < 0.14", "nyc": "^15.1.0", + "prettier": "^2.5.0", "sinon": ">= 1.9 < 2" }, "engines": { @@ -2078,6 +2079,18 @@ "node": ">=8" } }, + "node_modules/prettier": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.5.0.tgz", + "integrity": "sha512-FM/zAKgWTxj40rH03VxzIPdXmj39SwSjwG0heUcNFwI+EMZJnY93yAiKXM3dObIKAM5TA88werc8T/EwhB45eg==", + "dev": true, + "bin": { + "prettier": "bin-prettier.js" + }, + "engines": { + "node": ">=10.13.0" + } + }, "node_modules/process-on-spawn": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/process-on-spawn/-/process-on-spawn-1.0.0.tgz", @@ -4220,6 +4233,12 @@ "find-up": "^4.0.0" } }, + "prettier": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.5.0.tgz", + "integrity": "sha512-FM/zAKgWTxj40rH03VxzIPdXmj39SwSjwG0heUcNFwI+EMZJnY93yAiKXM3dObIKAM5TA88werc8T/EwhB45eg==", + "dev": true + }, "process-on-spawn": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/process-on-spawn/-/process-on-spawn-1.0.0.tgz", From 651b7aec061e462d9252d92bf7efdce7bca11640 Mon Sep 17 00:00:00 2001 From: Gregor Martynus <39992+gr2m@users.noreply.github.com> Date: Fri, 3 Dec 2021 23:08:00 -0800 Subject: [PATCH 13/59] style: prettier --- CHANGELOG.md | 40 +- README.md | 173 ++--- index.js | 208 +++--- lib/internal_socket.js | 212 +++--- lib/socket.js | 18 +- lib/stubs.js | 20 +- lib/tls_socket.js | 30 +- test/index_test.js | 1508 ++++++++++++++++++++++------------------ 8 files changed, 1222 insertions(+), 987 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 3c64a39..75266eb 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,41 +1,52 @@ ## 1.7.2 (May 1, 2021) + - Increases the upper-bound on [Underscore.js](https://underscorejs.org) dependency to v1.13 (inclusive). Thanks, [Martin Caruso](https://github.com/mcaruso85), for the heads-up. ## 1.7.1 (Jun 13, 2020) + - Fixes one test for Node v12.4. - Fixes the socket "close" event on Node v12.16.3. ## 1.7.0 (Jan 30, 2019) + - Adds compatibility with Node v10.15.1. ## 1.6.0 (Jan 26, 2019) + - Adds compatibility with Node v11.8. ## 1.5.0 (Nov 29, 2018) + - Adds compatibility with Node v11.1. - Adds compatibility with Node v11.2. ## 1.4.0 (Sep 17, 2018) + - Adds Node v8.12, Node v9 and Node v10 support. Thanks to [Andreas Lind](https://github.com/papandreou) for help in debugging! Also thanks to him for providing [mitm-papandreou](https://www.npmjs.com/package/mitm-papandreou) while Mitm.js-proper incorporated his fixes. ## 1.3.3 (Sep 16, 2017) + - Fixes `getAsyncId` error on Node v8 when using an `Http.Agent` with the `keepAlive` option. ## 1.3.2 (Nov 10, 2016) + - Adds compatibility with Node v7. Thanks, [Eric Hacke](https://github.com/ehacke), for the help! ## 1.3.1 (Sep 6, 2016) + - Fixes calling `Socket.prototype.ref` and `Socket.prototype.unref` on the returned client and server sockets. Thanks, [Vincent Voyer](http://function.fr), for the help! ## 1.3.0 (Aug 17, 2016) + - Adds compatibility with Node v6.4. Thanks to [Andreas Lind](https://github.com/papandreou)! ## 1.2.1 (Mar 30, 2016) + - Fixes writing to sockets returned by Mitm by postponing writing until the next tick. Brings it in line with Node's behavior. Thanks, [Maarten Winter](https://github.com/mwoc), for the help! @@ -46,10 +57,12 @@ and given a callback, bind it to `secureConnect` rather than `connect`. ## 1.2.0 (Sep 1, 2015) + - Adds Io.js v3 support. Io.js v2.4.0 worked previously Thanks, [Vincent Voyer](http://function.fr), for the help! ## 1.1.0 (Apr 25, 2015) + - Returns an instance of `Tls.TLSSocket` from `Tls.connect`. The returned socket has both `encrypted` and `authorized` set. Thanks to [Andreas Lind](https://github.com/papandreou) for the initial @@ -59,35 +72,43 @@ `encrypted` and `authorized` properties set. ## 1.0.3 (Jan 26, 2015) + - Adds `Mitm.prototype.addListener` to look more like an EventEmitter. Thanks to [Alex Wolfe](https://github.com/alexkwolfe)! ## 1.0.2 (Nov 23, 2014) + - Fixes tests by locking Mocha to v0.18. For more info on Mocha's ill-behavior, see [#1195](https://github.com/mochajs/mocha/issues/1195). ## 1.0.1 (Nov 23, 2014) + - Fixes bypassing TLS connections. Thanks to [Roman Shtylman](https://github.com/defunctzombie)! ## 1.0.0 (Sep 29, 2014) + - Adds compatibility with Node v0.11.14. ## 0.5.1 (May 28, 2014) + - Fixes `Mitm.prototype.off` to remove bound events with (`mitm.off("request", listener)`). ## 0.5.0 (May 19, 2014) + - Adds bypass functionality to not intercept a particular outgoing connection and let it connect as usual. Let a connection happen by calling `bypass` on the socket object given to the `connect` event: ```javascript - var mitm = Mitm() - mitm.on("connect", function(socket) { socket.bypass() }) - Net.connect({host: "example.org", port: 25}) + var mitm = Mitm(); + mitm.on("connect", function (socket) { + socket.bypass(); + }); + Net.connect({ host: "example.org", port: 25 }); ``` - Emits `connect` and `connection` on Mitm with the _options_ object given to @@ -101,9 +122,11 @@ ``` ## 0.4.1 (May 4, 2014) + - Adds [Travis CI](https://travis-ci.org) badge to the README. ## 0.4.0 (May 4, 2014) + - Adds support for Node v0.10.24 and up. - Adds the `connection` event to Mitm to get the remote `Net.Socket`. You can use this to intercept and test any TCP code. @@ -118,9 +141,11 @@ you assert on the content of `POST` requests. ```javascript - var mitm = Mitm() - Http.request({host: "x.org"}).end() - mitm.on("request", function(req) { req.headers.host.must.equal("x.org") }) + var mitm = Mitm(); + Http.request({ host: "x.org" }).end(); + mitm.on("request", function (req) { + req.headers.host.must.equal("x.org"); + }); ``` - Replaces [Concert.js](https://github.com/moll/js-concert) with Node's @@ -128,12 +153,15 @@ Remember kids, _if in doubt, leave it out_. ## 0.3.0 (Apr 26, 2014) + - Adds support for calling `Net.connect` with `port` and `host` arguments. ## 0.2.0 (Apr 19, 2014) + - Does not store requests on an instance of `Mitm` any longer. - Adds `socket` event to `Mitm`. - Updated to work with Node v0.11.12. ## 0.1.337 (Mar 11, 2014) + - First private release. diff --git a/README.md b/README.md index b461ba2..9e11bf8 100644 --- a/README.md +++ b/README.md @@ -1,13 +1,13 @@ -Mitm.js -======= +# Mitm.js + [![NPM version][npm-badge]](https://www.npmjs.com/package/mitm) [![Build status][travis-badge]](https://travis-ci.org/moll/node-mitm) Mitm.js is a library for Node.js (and Io.js) to **intercept and mock** outgoing -network **TCP** and **HTTP** connections. Mitm.js intercepts and gives you +network **TCP** and **HTTP** connections. Mitm.js intercepts and gives you a `Net.Socket` to communicate as if you were the remote server. For **HTTP requests** it even gives you `Http.IncomingMessage` and `Http.ServerResponse` -— just like you're used to when writing Node.js servers. Except there's no +— just like you're used to when writing Node.js servers. Except there's no actual server running, it's all just _In-Process Interception™_. Intercepting connections and requests is **extremely useful to test and ensure @@ -27,14 +27,15 @@ issue][issues] on GitHub. [travis-badge]: https://travis-ci.org/moll/node-mitm.svg?branch=master ### Tour + - Intercept both **TCP socket connections** (`Net.connect`) and **HTTP - requests** (`Http.request` and `Https.request`). + requests** (`Http.request` and `Https.request`). - Hooks to Node.js's network functions at a **very low level** with the goal of not having to patch existing classes and have everything behave as if bytes were arriving from the network. -- Does *not* have any kitchen sink features or yet another API to assert on +- Does _not_ have any kitchen sink features or yet another API to assert on intercepted connections. That's a different responsibility handled better by assertion libraries (you'll do no better than to pick [Must.js][must] for that ;-). @@ -43,12 +44,14 @@ issue][issues] on GitHub. gives you access to a vanilla `Net.Socket` to respond with: ```javascript - mitm.on("connection", function(socket) { socket.write("Hello back!") }) - - var socket = Net.connect(22, "example.org") - socket.write("Hello!") - socket.setEncoding("utf8") - socket.on("data", console.log) // => "Hello back!" + mitm.on("connection", function (socket) { + socket.write("Hello back!"); + }); + + var socket = Net.connect(22, "example.org"); + socket.write("Hello!"); + socket.setEncoding("utf8"); + socket.on("data", console.log); // => "Hello back!" ``` - When you do **HTTP or HTTPS** requests, Mitm.js gives you both @@ -58,27 +61,29 @@ issue][issues] on GitHub. Mitm.js comes very handy to ensure your code makes requests with the appropriate parameters: + ```javascript - mitm.on("request", function(req, res) { - req.headers.authorization.must.equal("OAuth DEADBEEF") - }) + mitm.on("request", function (req, res) { + req.headers.authorization.must.equal("OAuth DEADBEEF"); + }); - Http.get("http://example.org") + Http.get("http://example.org"); ``` It's also useful to see if your code behaves as you'd expect if everything is not `200 OK`: + ```javascript - mitm.on("request", function(req, res) { - res.statusCode = 402 - res.end("Pay up, sugar!") - }) - - Http.get("http://example.org", function(res) { - res.setEncoding("utf8") - res.statusCode // => 402 - res.on("data", console.log) // => "Pay up, sugar!" - }) + mitm.on("request", function (req, res) { + res.statusCode = 402; + res.end("Pay up, sugar!"); + }); + + Http.get("http://example.org", function (res) { + res.setEncoding("utf8"); + res.statusCode; // => 402 + res.on("data", console.log); // => "Pay up, sugar!" + }); ``` `Http.IncomingMessage` and `Http.ServerResponse` are the same objects @@ -87,24 +92,24 @@ issue][issues] on GitHub. - **Bypass** interception selectively for some connections (such as your SQL server) and let them connect as usual. + ```javascript - mitm.on("connect", function(socket, opts) { - if (opts.host == "sql.example.org" && opts.port == 5432) socket.bypass() - }) + mitm.on("connect", function (socket, opts) { + if (opts.host == "sql.example.org" && opts.port == 5432) socket.bypass(); + }); ``` - **Developed with automated tests**. Yeah, I know, why should one list this a feature when writing tests is just a sign of professionalism and respect towards other developers? But in a world where so many libraries and - "production" software are released without *any* tests, I like to point out + "production" software are released without _any_ tests, I like to point out that I even write tests for testing libraries. ;-) [must]: https://github.com/moll/js-must [express]: http://expressjs.com +## Installing -Installing ----------- ``` npm install mitm ``` @@ -114,71 +119,84 @@ breaking changes may appear between minor versions (the middle number). [semver]: http://semver.org/ +## Using -Using ------ Require Mitm.js and invoke it as a function to both create an instance of `Mitm` and enable intercepting: + ```javascript -var Mitm = require("mitm") -var mitm = Mitm() +var Mitm = require("mitm"); +var mitm = Mitm(); ``` Mitm.js will then intercept all requests until you disable it: + ```javascript -mitm.disable() +mitm.disable(); ``` ### Intercepting in tests + In tests, it's best to use the _before_ and _after_ hooks to enable and disable intercepting for each test case: + ```javascript -beforeEach(function() { this.mitm = Mitm() }) -afterEach(function() { this.mitm.disable() }) +beforeEach(function () { + this.mitm = Mitm(); +}); +afterEach(function () { + this.mitm.disable(); +}); ``` ### Intercepting TCP connections + After you've called `Mitm()`, Mitm.js will intercept and emit `connection` on itself for each new connection. The `connection` event will be given a server side `Net.Socket` for you to reply with: ```javascript -mitm.on("connection", function(socket) { socket.write("Hello back!") }) - -var socket = Net.connect(22, "example.org") -socket.write("Hello!") -socket.setEncoding("utf8") -socket.on("data", console.log) // => "Hello back!" +mitm.on("connection", function (socket) { + socket.write("Hello back!"); +}); + +var socket = Net.connect(22, "example.org"); +socket.write("Hello!"); +socket.setEncoding("utf8"); +socket.on("data", console.log); // => "Hello back!" ``` ### Intercepting HTTP/HTTPS requests + After you've called `Mitm()`, Mitm.js will intercept and emit `request` on itself for each new HTTP or HTTPS request. The `request` event will be given a server side `Http.IncomingMessage` and `Http.ServerResponse`. For example, asserting on HTTP requests would look something like this: + ```javascript -mitm.on("request", function(req, res) { - req.headers.authorization.must.equal("OAuth DEADBEEF") -}) +mitm.on("request", function (req, res) { + req.headers.authorization.must.equal("OAuth DEADBEEF"); +}); -Http.get("http://example.org") +Http.get("http://example.org"); ``` Responding to requests is just as easy and exactly like you're used to from using Node.js HTTP servers (or from libraries like [Express.js][express]): + ```javascript -mitm.on("request", function(req, res) { - res.statusCode = 402 - res.end("Pay up, sugar!") -}) - -Http.get("http://example.org", function(res) { - res.statusCode // => 402 - res.setEncoding("utf8") - res.on("data", console.log) // => "Pay up, sugar!" -}) +mitm.on("request", function (req, res) { + res.statusCode = 402; + res.end("Pay up, sugar!"); +}); + +Http.get("http://example.org", function (res) { + res.statusCode; // => 402 + res.setEncoding("utf8"); + res.on("data", console.log); // => "Pay up, sugar!" +}); ``` Please note that HTTPS requests are currently "morphed" into HTTP requests. @@ -187,18 +205,20 @@ verification. But if you do need to test this, please ping me and we'll see if we can get Mitm.js to support that. #### Custom HTTP Methods + Unfortunately because [Node.js's web server doesn't seem to support custom HTTP methods](https://github.com/nodejs/node-v0.x-archive/issues/3192) (that is, ones beyond `require("http").METHODS`), Mitm.js doesn't support them out of the box either. The Node.js HTTP parser throws an error given a request with an unsupported method. However, as Mitm.js also supports intercepting at the TCP level, you could hook in your own HTTP parser. I've briefly alluded to it in [issue #63](https://github.com/moll/node-mitm/issues/63). ### Bypassing interception + You can bypass connections listening to the `connect` event on the Mitm instance and then calling `bypass` on the given socket. To help you do so selectively, `connect` is given the `options` object that was given to `Net.connect`: ```javascript -mitm.on("connect", function(socket, opts) { - if (opts.host == "sql.example.org" && opts.port == 5432) socket.bypass() -}) +mitm.on("connect", function (socket, opts) { + if (opts.host == "sql.example.org" && opts.port == 5432) socket.bypass(); +}); ``` Bypassed connections do **not** emit `connection` or `request` events. They're @@ -208,33 +228,31 @@ In most cases you don't need to bypass because by the time you call `Mitm` in your tests to start intercepting, all of the long-running connections, such as database or cache connections, are already made. -You might need to bypass connections you make to *localhost* when you're running +You might need to bypass connections you make to _localhost_ when you're running integration tests against the HTTP server you started in the test process, but still want to intercept some other connections that this request might invoke. The following should suffice: ```javascript -mitm.on("connect", function(socket, opts) { - if (opts.host == "localhost") socket.bypass() -}) +mitm.on("connect", function (socket, opts) { + if (opts.host == "localhost") socket.bypass(); +}); ``` +## Events -Events ------- All events that Mitm will emit on an instance of itself (see [Using Mitm.js](#using) for examples): -Event | Description ------------|------------ -connect | Emitted when a TCP connection is made.
Given the **client side** `Net.Socket` and `options` from `Net.connect`. -connection | Emitted when a TCP connection is made.
Given the **server side** `Net.Socket` and `options` from `Net.connect`. -request | Emitted when a HTTP/HTTPS request is made.
Given the server side `Http.IncomingMessage` and `Http.ServerResponse`. +| Event | Description | +| ---------- | ---------------------------------------------------------------------------------------------------------------------- | +| connect | Emitted when a TCP connection is made.
Given the **client side** `Net.Socket` and `options` from `Net.connect`. | +| connection | Emitted when a TCP connection is made.
Given the **server side** `Net.Socket` and `options` from `Net.connect`. | +| request | Emitted when a HTTP/HTTPS request is made.
Given the server side `Http.IncomingMessage` and `Http.ServerResponse`. | +## License -License -------- -Mitm.js is released under a *Lesser GNU Affero General Public License*, which +Mitm.js is released under a _Lesser GNU Affero General Public License_, which in summary means: - You **can** use this program for **no cost**. @@ -245,9 +263,8 @@ in summary means: For more convoluted language, see the `LICENSE` file. +## About -About ------ **[Andri Möll][moll]** typed this and the code. [Monday Calendar][monday] supported the engineering work. diff --git a/index.js b/index.js index 28abb66..9db083d 100644 --- a/index.js +++ b/index.js @@ -1,163 +1,179 @@ -var _ = require("underscore") -var Net = require("net") -var Tls = require("tls") -var Http = require("http") -var Https = require("https") -var ClientRequest = Http.ClientRequest -var Socket = require("./lib/socket") -var TlsSocket = require("./lib/tls_socket") -var EventEmitter = require("events").EventEmitter -var InternalSocket = require("./lib/internal_socket") -var Stubs = require("./lib/stubs") -var Semver = require("semver") -var slice = Function.call.bind(Array.prototype.slice) -var normalizeConnectArgs = Net._normalizeConnectArgs || Net._normalizeArgs -var createRequestAndResponse = Http._connectionListener -var NODE_0_10 = Semver.satisfies(process.version, ">= 0.10 < 0.11") -module.exports = Mitm +var _ = require("underscore"); +var Net = require("net"); +var Tls = require("tls"); +var Http = require("http"); +var Https = require("https"); +var ClientRequest = Http.ClientRequest; +var Socket = require("./lib/socket"); +var TlsSocket = require("./lib/tls_socket"); +var EventEmitter = require("events").EventEmitter; +var InternalSocket = require("./lib/internal_socket"); +var Stubs = require("./lib/stubs"); +var Semver = require("semver"); +var slice = Function.call.bind(Array.prototype.slice); +var normalizeConnectArgs = Net._normalizeConnectArgs || Net._normalizeArgs; +var createRequestAndResponse = Http._connectionListener; +var NODE_0_10 = Semver.satisfies(process.version, ">= 0.10 < 0.11"); +module.exports = Mitm; function Mitm() { if (!(this instanceof Mitm)) - return Mitm.apply(Object.create(Mitm.prototype), arguments).enable() + return Mitm.apply(Object.create(Mitm.prototype), arguments).enable(); - this.stubs = new Stubs - this.on("request", addCrossReferences) + this.stubs = new Stubs(); + this.on("request", addCrossReferences); - return this + return this; } -Mitm.prototype.on = EventEmitter.prototype.on -Mitm.prototype.once = EventEmitter.prototype.once -Mitm.prototype.off = EventEmitter.prototype.removeListener -Mitm.prototype.addListener = EventEmitter.prototype.addListener -Mitm.prototype.removeListener = EventEmitter.prototype.removeListener -Mitm.prototype.emit = EventEmitter.prototype.emit +Mitm.prototype.on = EventEmitter.prototype.on; +Mitm.prototype.once = EventEmitter.prototype.once; +Mitm.prototype.off = EventEmitter.prototype.removeListener; +Mitm.prototype.addListener = EventEmitter.prototype.addListener; +Mitm.prototype.removeListener = EventEmitter.prototype.removeListener; +Mitm.prototype.emit = EventEmitter.prototype.emit; if (Semver.satisfies(process.version, "^8.12 || >= 9.6")) { - var IncomingMessage = require("_http_incoming").IncomingMessage - var ServerResponse = require("_http_server").ServerResponse - var incomingMessageKey = require("_http_common").kIncomingMessage - var serverResponseKey = require("_http_server").kServerResponse - Mitm.prototype[serverResponseKey] = ServerResponse - Mitm.prototype[incomingMessageKey] = IncomingMessage + var IncomingMessage = require("_http_incoming").IncomingMessage; + var ServerResponse = require("_http_server").ServerResponse; + var incomingMessageKey = require("_http_common").kIncomingMessage; + var serverResponseKey = require("_http_server").kServerResponse; + Mitm.prototype[serverResponseKey] = ServerResponse; + Mitm.prototype[incomingMessageKey] = IncomingMessage; } -Mitm.prototype.enable = function() { +Mitm.prototype.enable = function () { // Connect is called synchronously. - var netConnect = this.tcpConnect.bind(this, Net.connect) - var tlsConnect = this.tlsConnect.bind(this, Tls.connect) + var netConnect = this.tcpConnect.bind(this, Net.connect); + var tlsConnect = this.tlsConnect.bind(this, Tls.connect); - this.stubs.stub(Net, "connect", netConnect) - this.stubs.stub(Net, "createConnection", netConnect) - this.stubs.stub(Http.Agent.prototype, "createConnection", netConnect) - this.stubs.stub(Tls, "connect", tlsConnect) + this.stubs.stub(Net, "connect", netConnect); + this.stubs.stub(Net, "createConnection", netConnect); + this.stubs.stub(Http.Agent.prototype, "createConnection", netConnect); + this.stubs.stub(Tls, "connect", tlsConnect); if (NODE_0_10) { // Node v0.10 sets createConnection on the object in the constructor. - this.stubs.stub(Http.globalAgent, "createConnection", netConnect) + this.stubs.stub(Http.globalAgent, "createConnection", netConnect); // This will create a lot of sockets in tests, but that's the current price // to pay until I find a better way to force a new socket for each // connection. - this.stubs.stub(Http.globalAgent, "maxSockets", Infinity) - this.stubs.stub(Https.globalAgent, "maxSockets", Infinity) + this.stubs.stub(Http.globalAgent, "maxSockets", Infinity); + this.stubs.stub(Https.globalAgent, "maxSockets", Infinity); } // ClientRequest.prototype.onSocket is called synchronously from // ClientRequest's constructor and is a convenient place to hook into new // ClientRequests. - this.stubs.stub(ClientRequest.prototype, "onSocket", _.compose( - ClientRequest.prototype.onSocket, - this.request.bind(this) - )) + this.stubs.stub( + ClientRequest.prototype, + "onSocket", + _.compose(ClientRequest.prototype.onSocket, this.request.bind(this)) + ); - return this -} + return this; +}; -Mitm.prototype.disable = function() { - return this.stubs.restore(), this -} +Mitm.prototype.disable = function () { + return this.stubs.restore(), this; +}; Mitm.prototype.connect = function connect(orig, Socket, opts, done) { - var sockets = InternalSocket.pair() + var sockets = InternalSocket.pair(); // Don't set client.connecting to false because there's nothing setting it // back to false later. Originally that was done in Socket.prototype.connect // and its afterConnect handler, but we're not calling that. - var client = new Socket(_.defaults({ - handle: sockets[0], - - // Node v10 expects readable and writable to be set at Socket creation time. - readable: true, - writable: true - }, opts)) - - this.emit("connect", client, opts) - if (client.bypassed) return orig.call(this, opts, done) + var client = new Socket( + _.defaults( + { + handle: sockets[0], + + // Node v10 expects readable and writable to be set at Socket creation time. + readable: true, + writable: true, + }, + opts + ) + ); + + this.emit("connect", client, opts); + if (client.bypassed) return orig.call(this, opts, done); // Don't use just "server" because socket.server is used in Node v8.12 and // Node v9.6 and later for modifying the HTTP server response and parser // classes. If unset, it's set to the used HTTP server (Mitm instance in our // case) in _http_server.js. // See also: https://github.com/nodejs/node/issues/13435. - var server = client.serverSocket = new Socket({ + var server = (client.mitmServerSocket = new Socket({ handle: sockets[1], readable: true, - writable: true - }) + writable: true, + })); - this.emit("connection", server, opts) + this.emit("connection", server, opts); // Ensure connect is emitted in next ticks, otherwise it would be impossible // to listen to it after calling Net.connect or listening to it after the // ClientRequest emits "socket". - setTimeout(client.emit.bind(client, "connect")) - setTimeout(server.emit.bind(server, "connect")) + setTimeout(client.emit.bind(client, "connect")); + setTimeout(server.emit.bind(server, "connect")); - return client -} + return client; +}; -Mitm.prototype.tcpConnect = function(orig, opts, done) { - var args = normalizeConnectArgs(slice(arguments, 1)) - opts = args[0]; done = args[1] +Mitm.prototype.tcpConnect = function (orig, opts, done) { + var args = normalizeConnectArgs(slice(arguments, 1)); + opts = args[0]; + done = args[1]; // The callback is originally bound to the connect event in // Socket.prototype.connect. - var client = this.connect(orig, Socket, opts, done) - if (client.serverSocket == null) return client - if (done) client.once("connect", done) + var client = this.connect(orig, Socket, opts, done); + if (client.mitmServerSocket == null) { + return client; + } + if (done) client.once("connect", done); - return client -} + return client; +}; -Mitm.prototype.tlsConnect = function(orig, opts, done) { - var args = normalizeConnectArgs(slice(arguments, 1)) - opts = args[0]; done = args[1] +Mitm.prototype.tlsConnect = function (orig, opts, done) { + var args = normalizeConnectArgs(slice(arguments, 1)); + opts = args[0]; + done = args[1]; - var client = this.connect(orig, TlsSocket, opts, done) - if (client.serverSocket == null) return client - if (done) client.once("secureConnect", done) + var client = this.connect(orig, TlsSocket, opts, done); + if (client.mitmServerSocket == null) return client; + if (done) client.once("secureConnect", done); - setTimeout(client.emit.bind(client, "secureConnect")) + setTimeout(client.emit.bind(client, "secureConnect")); - return client -} + return client; +}; Mitm.prototype.request = function request(socket) { - if (!socket.serverSocket) return socket + if (!socket.mitmServerSocket) return socket; // Node >= v0.10.24 < v0.11 will crash with: «Assertion failed: // (!current_buffer), function Execute, file ../src/node_http_parser.cc, line // 387.» if ServerResponse.prototype.write is called from within the // "request" event handler. Call it in the next tick to work around that. - var self = this + var self = this; if (NODE_0_10) { - self = Object.create(this) - self.emit = _.compose(process.nextTick, Function.bind.bind(this.emit, this)) + self = Object.create(this); + self.emit = _.compose( + process.nextTick, + Function.bind.bind(this.emit, this) + ); } - createRequestAndResponse.call(self, socket.serverSocket) - return socket -} + createRequestAndResponse.call(self, socket.mitmServerSocket); + return socket; +}; -function addCrossReferences(req, res) { req.res = res; res.req = req } +function addCrossReferences(req, res) { + req.res = res; + res.req = req; +} diff --git a/lib/internal_socket.js b/lib/internal_socket.js index 27c359c..02c2cee 100644 --- a/lib/internal_socket.js +++ b/lib/internal_socket.js @@ -1,23 +1,23 @@ -var DuplexStream = require("stream").Duplex -var Semver = require("semver") -var uniqueId = 0 -var NO_ERROR = 0 -var STREAM_STATE -var STREAM_BYTES_READ -var NODE_VERSION = process.version -exports = module.exports = InternalSocket -exports.pair = pair - -var NODE_0_10 = Semver.satisfies(NODE_VERSION, ">= 0.10 < 0.11") -var NODE_10_AND_LATER = Semver.satisfies(NODE_VERSION, ">= 10") -var NODE_11_1_AND_LATER = Semver.satisfies(NODE_VERSION, ">= 11.1") -var NODE_11_2_AND_LATER = Semver.satisfies(NODE_VERSION, ">= 11.2") -var NODE_10_15_1_AND_MAJOR = Semver.satisfies(NODE_VERSION, ">= 10.15.1 < 11") -if (!NODE_0_10) var UV_EOF = process.binding("uv").UV_EOF +var DuplexStream = require("stream").Duplex; +var Semver = require("semver"); +var uniqueId = 0; +var NO_ERROR = 0; +var STREAM_STATE; +var STREAM_BYTES_READ; +var NODE_VERSION = process.version; +exports = module.exports = InternalSocket; +exports.pair = pair; + +var NODE_0_10 = Semver.satisfies(NODE_VERSION, ">= 0.10 < 0.11"); +var NODE_10_AND_LATER = Semver.satisfies(NODE_VERSION, ">= 10"); +var NODE_11_1_AND_LATER = Semver.satisfies(NODE_VERSION, ">= 11.1"); +var NODE_11_2_AND_LATER = Semver.satisfies(NODE_VERSION, ">= 11.2"); +var NODE_10_15_1_AND_MAJOR = Semver.satisfies(NODE_VERSION, ">= 10.15.1 < 11"); +if (!NODE_0_10) var UV_EOF = process.binding("uv").UV_EOF; if (NODE_11_1_AND_LATER) { - STREAM_STATE = process.binding("stream_wrap").streamBaseState - STREAM_BYTES_READ = process.binding("stream_wrap").kReadBytesOrError + STREAM_STATE = process.binding("stream_wrap").streamBaseState; + STREAM_BYTES_READ = process.binding("stream_wrap").kReadBytesOrError; } /** @@ -30,26 +30,26 @@ if (NODE_11_1_AND_LATER) { * InternalSocket is created for both the client side and the server side. */ function InternalSocket(remote) { - DuplexStream.call(this) - if (remote) this.remote = remote - this.id = ++uniqueId + DuplexStream.call(this); + if (remote) this.remote = remote; + this.id = ++uniqueId; // The "end" event follows ReadableStream.prototype.push(null). - this.on("data", readData.bind(this)) - this.on("end", readEof.bind(this)) + this.on("data", readData.bind(this)); + this.on("end", readEof.bind(this)); // The "finish" event follows WritableStream.prototype.end. // // There's WritableStream.prototype._final for processing before "finish" is // emitted, but that's only available in Node v8 and later. - this.on("finish", this._write.bind(this, null, null, noop)) + this.on("finish", this._write.bind(this, null, null, noop)); - return this.pause(), this + return this.pause(), this; } InternalSocket.prototype = Object.create(DuplexStream.prototype, { - constructor: {value: InternalSocket, configurable: true, writeable: true} -}) + constructor: { value: InternalSocket, configurable: true, writeable: true }, +}); // Node v0.11's ReadableStream.prototype.resume and // ReadableStream.prototype.pause return self. InternalSocket's API states that @@ -57,124 +57,136 @@ InternalSocket.prototype = Object.create(DuplexStream.prototype, { // // Node v0.11.13 called ReadableStream.prototype.read(0) synchronously, but // v0.11.14 does it in the next tick. For easier sync use, call it here. -InternalSocket.prototype.readStart = function() { this.resume() } -InternalSocket.prototype.readStop = function() { this.pause() } +InternalSocket.prototype.readStart = function () { + this.resume(); +}; +InternalSocket.prototype.readStop = function () { + this.pause(); +}; -InternalSocket.prototype._read = noop -InternalSocket.prototype.ref = noop -InternalSocket.prototype.unref = noop +InternalSocket.prototype._read = noop; +InternalSocket.prototype.ref = noop; +InternalSocket.prototype.unref = noop; // Node v8 added "getAsyncId". -InternalSocket.prototype.getAsyncId = function() { return this.id } - -InternalSocket.prototype._write = function(data, encoding, done) { - var remote = this.remote - process.nextTick(function() { remote.push(data, encoding); done() }) -} +InternalSocket.prototype.getAsyncId = function () { + return this.id; +}; + +InternalSocket.prototype._write = function (data, encoding, done) { + var remote = this.remote; + process.nextTick(function () { + remote.push(data, encoding); + done(); + }); +}; // Node v10 requires writev to be set on the handler because, while // WritableStream expects _writev, internal/stream_base_commons.js calls // req.handle.writev directly. It's given a flat array of data+type pairs. -if (NODE_10_AND_LATER) InternalSocket.prototype.writev = function(_req, data) { - for (var i = 0; i < data.length; ++i) this._write(data[i], data[++i], noop) - return NO_ERROR -} +if (NODE_10_AND_LATER) + InternalSocket.prototype.writev = function (_req, data) { + for (var i = 0; i < data.length; ++i) this._write(data[i], data[++i], noop); + return NO_ERROR; + }; // NOTE: Node v0.10 expects InternalSocket to return write request objects with // a "oncomplete" and "cb" property. Node v0.11 expects it return an error // instead. Node v10 expects it to return an error code. // InternalSocket.prototype.writeBinaryString was introduced in Node v0.11.14. -InternalSocket.prototype.writeBinaryString = function(_req, data) { - this.write(data, "binary") - if (NODE_10_AND_LATER) return NO_ERROR -} +InternalSocket.prototype.writeBinaryString = function (_req, data) { + this.write(data, "binary"); + if (NODE_10_AND_LATER) return NO_ERROR; +}; // InternalSocket.prototype.writeLatin1String was introduced in Node v6.4. -InternalSocket.prototype.writeLatin1String = function(_req, data) { - this.write(data, "latin1") - if (NODE_10_AND_LATER) return NO_ERROR -} +InternalSocket.prototype.writeLatin1String = function (_req, data) { + this.write(data, "latin1"); + if (NODE_10_AND_LATER) return NO_ERROR; +}; -InternalSocket.prototype.writeBuffer = function(req, data) { +InternalSocket.prototype.writeBuffer = function (req, data) { /* eslint consistent-return: 0 */ - this.write(NODE_0_10 ? req : data) - if (NODE_0_10) return {} - else if (NODE_10_AND_LATER) return NO_ERROR -} + this.write(NODE_0_10 ? req : data); + if (NODE_0_10) return {}; + else if (NODE_10_AND_LATER) return NO_ERROR; +}; -InternalSocket.prototype.writeUtf8String = function(req, data) { +InternalSocket.prototype.writeUtf8String = function (req, data) { /* eslint consistent-return: 0 */ - this.write(NODE_0_10 ? req : data, "utf8") - if (NODE_0_10) return {} - else if (NODE_10_AND_LATER) return NO_ERROR -} + this.write(NODE_0_10 ? req : data, "utf8"); + if (NODE_0_10) return {}; + else if (NODE_10_AND_LATER) return NO_ERROR; +}; -InternalSocket.prototype.writeAsciiString = function(req, data) { +InternalSocket.prototype.writeAsciiString = function (req, data) { /* eslint consistent-return: 0 */ - this.write(NODE_0_10 ? req : data, "ascii") - if (NODE_0_10) return {} - else if (NODE_10_AND_LATER) return NO_ERROR -} + this.write(NODE_0_10 ? req : data, "ascii"); + if (NODE_0_10) return {}; + else if (NODE_10_AND_LATER) return NO_ERROR; +}; -InternalSocket.prototype.writeUcs2String = function(req, data) { +InternalSocket.prototype.writeUcs2String = function (req, data) { /* eslint consistent-return: 0 */ - this.write(NODE_0_10 ? req : data, "ucs2") - if (NODE_0_10) return {} - else if (NODE_10_AND_LATER) return NO_ERROR -} + this.write(NODE_0_10 ? req : data, "ucs2"); + if (NODE_0_10) return {}; + else if (NODE_10_AND_LATER) return NO_ERROR; +}; // While it seems to have existed since Node v0.10, Node v11.2 requires // "shutdown". AFAICT, "shutdown" is for shutting the writable side down and // hence the use of WritableStream.prototype.end and waiting for the "finish" // event. -if ( - NODE_11_2_AND_LATER || - NODE_10_15_1_AND_MAJOR -) InternalSocket.prototype.shutdown = function(req) { - this.once("finish", req.oncomplete.bind(req, NO_ERROR, req.handle)) - this.end() - - // Note v11.8 requires "shutdown" to return an error value, with "1" - // indicating a "synchronous finish" (as per Node's net.js) and "0" - // presumably success. - return 0 -} +if (NODE_11_2_AND_LATER || NODE_10_15_1_AND_MAJOR) + InternalSocket.prototype.shutdown = function (req) { + this.once("finish", req.oncomplete.bind(req, NO_ERROR, req.handle)); + this.end(); + + // Note v11.8 requires "shutdown" to return an error value, with "1" + // indicating a "synchronous finish" (as per Node's net.js) and "0" + // presumably success. + return 0; + }; // I'm unsure of the relationship between InternalSocket.prototype.shutdown and // InternalSocket.prototype.close. -InternalSocket.prototype.close = function(done) { - if (!this._writableState.finished) this.end(done) - else if (done) done() -} +InternalSocket.prototype.close = function (done) { + if (!this._writableState.finished) this.end(done); + else if (done) done(); +}; // Node v0.10 will use writeQueueSize to see if it should set write request's // "cb" property or write more immediately. -if (NODE_0_10) InternalSocket.prototype.writeQueueSize = 0 +if (NODE_0_10) InternalSocket.prototype.writeQueueSize = 0; function pair() { - var a = Object.create(InternalSocket.prototype) - var b = Object.create(InternalSocket.prototype) - return [InternalSocket.call(a, b), InternalSocket.call(b, a)] + var a = Object.create(InternalSocket.prototype); + var b = Object.create(InternalSocket.prototype); + return [InternalSocket.call(a, b), InternalSocket.call(b, a)]; } function readData(data) { - if (NODE_0_10) return void this.onread(data, 0, data.length) - if (!NODE_11_1_AND_LATER) return void this.onread(data.length, data) + if (NODE_0_10) return void this.onread(data, 0, data.length); + if (!NODE_11_1_AND_LATER) return void this.onread(data.length, data); // A system written not in 1960 that passes arguments to functions through // _global_ mutable data structures… - STREAM_STATE[STREAM_BYTES_READ] = data.length - this.onread(data) + STREAM_STATE[STREAM_BYTES_READ] = data.length; + this.onread(data); } function readEof() { - if (this.onread == null) return - if (NODE_0_10) { process._errno = "EOF"; this.onread(null, 0, 0); return } - if (!NODE_11_1_AND_LATER) return void this.onread(UV_EOF) - - STREAM_STATE[STREAM_BYTES_READ] = UV_EOF - this.onread() + if (this.onread == null) return; + if (NODE_0_10) { + process._errno = "EOF"; + this.onread(null, 0, 0); + return; + } + if (!NODE_11_1_AND_LATER) return void this.onread(UV_EOF); + + STREAM_STATE[STREAM_BYTES_READ] = UV_EOF; + this.onread(); } function noop() {} diff --git a/lib/socket.js b/lib/socket.js index d8f3d62..587311f 100644 --- a/lib/socket.js +++ b/lib/socket.js @@ -1,12 +1,14 @@ -var Net = require("net") -module.exports = Socket +var Net = require("net"); +module.exports = Socket; -function Socket() { Net.Socket.apply(this, arguments) } +function Socket() { + Net.Socket.apply(this, arguments); +} Socket.prototype = Object.create(Net.Socket.prototype, { - constructor: {value: Socket, configurable: true, writeable: true} -}) + constructor: { value: Socket, configurable: true, writeable: true }, +}); -Socket.prototype.bypass = function() { - this.bypassed = true -} +Socket.prototype.bypass = function () { + this.bypassed = true; +}; diff --git a/lib/stubs.js b/lib/stubs.js index decc5bd..70c28a2 100644 --- a/lib/stubs.js +++ b/lib/stubs.js @@ -1,15 +1,15 @@ -module.exports = Stubs +module.exports = Stubs; function Stubs() {} -Stubs.prototype = Object.create(Array.prototype) +Stubs.prototype = Object.create(Array.prototype); -Stubs.prototype.stub = function(obj, prop, value) { - this.push([obj, prop, obj[prop]]) - obj[prop] = value -} +Stubs.prototype.stub = function (obj, prop, value) { + this.push([obj, prop, obj[prop]]); + obj[prop] = value; +}; -Stubs.prototype.restore = function() { - var stub - while (stub = this.pop()) stub[0][stub[1]] = stub[2] -} +Stubs.prototype.restore = function () { + var stub; + while ((stub = this.pop())) stub[0][stub[1]] = stub[2]; +}; diff --git a/lib/tls_socket.js b/lib/tls_socket.js index df5a02f..eaa2f87 100644 --- a/lib/tls_socket.js +++ b/lib/tls_socket.js @@ -1,23 +1,27 @@ -var Net = require("net") -var Tls = require("tls") -var Socket = require("./socket") -module.exports = TlsSocket +var Net = require("net"); +var Tls = require("tls"); +var Socket = require("./socket"); +module.exports = TlsSocket; -function TlsSocket() { Socket.apply(this, arguments) } +function TlsSocket() { + Socket.apply(this, arguments); +} // Node v0.10 has no TLSSocket and uses a private ClearTextStream instance. TlsSocket.prototype = Object.create((Tls.TLSSocket || Net.Socket).prototype, { - constructor: {value: TlsSocket, configurable: true, writeable: true} -}) + constructor: { value: TlsSocket, configurable: true, writeable: true }, +}); -Object.keys(Socket.prototype).forEach(function(key) { - TlsSocket.prototype[key] = Socket.prototype[key] -}) +Object.keys(Socket.prototype).forEach(function (key) { + TlsSocket.prototype[key] = Socket.prototype[key]; +}); -TlsSocket.prototype.encrypted = true -TlsSocket.prototype.authorized = true +TlsSocket.prototype.encrypted = true; +TlsSocket.prototype.authorized = true; // Iojs v3 HTTPS/SSL implementation depends on a session. // Not sure whether returning null breaks anything. // https://github.com/nodejs/node/blob/291b310e219023c4d93b216b1081ef47386f8750/lib/_tls_wrap.js#L607 -TlsSocket.prototype.getSession = function() { return null } +TlsSocket.prototype.getSession = function () { + return null; +}; diff --git a/test/index_test.js b/test/index_test.js index e93eb6a..0801ecd 100644 --- a/test/index_test.js +++ b/test/index_test.js @@ -1,759 +1,915 @@ -var _ = require("underscore") -var Sinon = require("sinon") -var Net = require("net") -var Tls = require("tls") -var Http = require("http") -var Https = require("https") -var Semver = require("semver") -var Transform = require("stream").Transform -var IncomingMessage = Http.IncomingMessage -var ServerResponse = Http.ServerResponse -var ClientRequest = Http.ClientRequest -var EventEmitter = require("events").EventEmitter -var Mitm = require("..") -var NODE_0_10 = Semver.satisfies(process.version, ">= 0.10 < 0.11") -var newBuffer = Buffer.from || function(d, enc) { return new Buffer(d, enc) } - -describe("Mitm", function() { - beforeEach(function() { Mitm.passthrough = false }) - - it("must return an instance of Mitm when called as a function", function() { - var mitm = Mitm() - mitm.must.be.an.instanceof(Mitm) - mitm.disable() - }) +var _ = require("underscore"); +var Sinon = require("sinon"); +var Net = require("net"); +var Tls = require("tls"); +var Http = require("http"); +var Https = require("https"); +var Semver = require("semver"); +var Transform = require("stream").Transform; +var IncomingMessage = Http.IncomingMessage; +var ServerResponse = Http.ServerResponse; +var ClientRequest = Http.ClientRequest; +var EventEmitter = require("events").EventEmitter; +var Mitm = require(".."); +var NODE_0_10 = Semver.satisfies(process.version, ">= 0.10 < 0.11"); +var newBuffer = + Buffer.from || + function (d, enc) { + return new Buffer(d, enc); + }; + +describe("Mitm", function () { + beforeEach(function () { + Mitm.passthrough = false; + }); + + it("must return an instance of Mitm when called as a function", function () { + var mitm = Mitm(); + mitm.must.be.an.instanceof(Mitm); + mitm.disable(); + }); function mustConnect(module) { - describe("as connect", function() { - it("must return an instance of Net.Socket", function() { - var socket = module.connect({host: "foo", port: 80}) - socket.must.be.an.instanceof(Net.Socket) - }) - - it("must return an instance of Net.Socket given port", function() { - module.connect(80).must.be.an.instanceof(Net.Socket) - }) - - it("must return an instance of Net.Socket given port and host", - function() { - module.connect(80, "10.0.0.1").must.be.an.instanceof(Net.Socket) - }) - - it("must emit connect on Mitm", function() { - var onConnect = Sinon.spy() - this.mitm.on("connect", onConnect) - var opts = {host: "foo"} - var socket = module.connect(opts) - - onConnect.callCount.must.equal(1) - onConnect.firstCall.args[0].must.equal(socket) - onConnect.firstCall.args[1].must.equal(opts) - }) - - it("must emit connect on Mitm with options object given host and port", - function() { - var onConnect = Sinon.spy() - this.mitm.on("connect", onConnect) - var socket = module.connect(9, "127.0.0.1") - - onConnect.callCount.must.equal(1) - onConnect.firstCall.args[0].must.equal(socket) - onConnect.firstCall.args[1].must.eql({host: "127.0.0.1", port: 9}) - }) - - it("must emit connection on Mitm", function() { - var onConnection = Sinon.spy() - this.mitm.on("connection", onConnection) - var opts = {host: "foo"} - var socket = module.connect(opts) - - onConnection.callCount.must.equal(1) - onConnection.firstCall.args[0].must.be.an.instanceof(Net.Socket) - onConnection.firstCall.args[0].must.not.equal(socket) - onConnection.firstCall.args[1].must.equal(opts) - }) - - it("must emit connect on socket in next ticks", function(done) { - var socket = module.connect({host: "foo"}) - socket.on("connect", done.bind(null, null)) - }) - - it("must call back on connect given callback", function(done) { - module.connect({host: "foo"}, done.bind(null, null)) - }) - - it("must call back on connect given port and callback", function(done) { - module.connect(80, done.bind(null, null)) - }) + describe("as connect", function () { + it("must return an instance of Net.Socket", function () { + var socket = module.connect({ host: "foo", port: 80 }); + socket.must.be.an.instanceof(Net.Socket); + }); + + it("must return an instance of Net.Socket given port", function () { + module.connect(80).must.be.an.instanceof(Net.Socket); + }); + + it("must return an instance of Net.Socket given port and host", function () { + module.connect(80, "10.0.0.1").must.be.an.instanceof(Net.Socket); + }); + + it("must emit connect on Mitm", function () { + var onConnect = Sinon.spy(); + this.mitm.on("connect", onConnect); + var opts = { host: "foo" }; + var socket = module.connect(opts); + + onConnect.callCount.must.equal(1); + onConnect.firstCall.args[0].must.equal(socket); + onConnect.firstCall.args[1].must.equal(opts); + }); + + it("must emit connect on Mitm with options object given host and port", function () { + var onConnect = Sinon.spy(); + this.mitm.on("connect", onConnect); + var socket = module.connect(9, "127.0.0.1"); + + onConnect.callCount.must.equal(1); + onConnect.firstCall.args[0].must.equal(socket); + onConnect.firstCall.args[1].must.eql({ host: "127.0.0.1", port: 9 }); + }); + + it("must emit connection on Mitm", function () { + var onConnection = Sinon.spy(); + this.mitm.on("connection", onConnection); + var opts = { host: "foo" }; + var socket = module.connect(opts); + + onConnection.callCount.must.equal(1); + onConnection.firstCall.args[0].must.be.an.instanceof(Net.Socket); + onConnection.firstCall.args[0].must.not.equal(socket); + onConnection.firstCall.args[1].must.equal(opts); + }); + + it("must emit connect on socket in next ticks", function (done) { + var socket = module.connect({ host: "foo" }); + socket.on("connect", done.bind(null, null)); + }); + + it("must call back on connect given callback", function (done) { + module.connect({ host: "foo" }, done.bind(null, null)); + }); + + it("must call back on connect given port and callback", function (done) { + module.connect(80, done.bind(null, null)); + }); // This was a bug found on Apr 26, 2014 where the host argument was taken // to be the callback because arguments weren't normalized to an options // object. - it("must call back on connect given port, host and callback", - function(done) { - module.connect(80, "localhost", done.bind(null, null)) - }) + it("must call back on connect given port, host and callback", function (done) { + module.connect(80, "localhost", done.bind(null, null)); + }); // The "close" event broke on Node v12.16.3 as the // InternalSocket.prototype.close method didn't call back if // the WritableStream had already been closed. - it("must emit close on socket if ended immediately", function(done) { - this.mitm.on("connection", function(socket) { socket.end() }) - var socket = module.connect({host: "foo"}) - socket.on("close", done.bind(null, null)) - }) - - it("must emit close on socket if ended in next tick", function(done) { - this.mitm.on("connection", function(socket) { - process.nextTick(socket.end.bind(socket)) - }) - - var socket = module.connect({host: "foo"}) - socket.on("close", done.bind(null, null)) - }) - - it("must intercept 127.0.0.1", function(done) { - var server; this.mitm.on("connection", function(s) { server = s }) - var client = module.connect({host: "127.0.0.1"}) - server.write("Hello") - - client.setEncoding("utf8") - client.on("data", function(data) { data.must.equal("Hello") }) - client.on("data", done.bind(null, null)) - }) - - describe("when bypassed", function() { - beforeEach(function() { this.sinon = Sinon.sandbox.create() }) - afterEach(function() { this.sinon.restore() }) - - it("must not intercept", function(done) { - this.mitm.on("connect", function(client) { client.bypass() }) - - module.connect({host: "127.0.0.1", port: 9}).on("error", function(err) { - err.must.be.an.instanceof(Error) - err.message.must.include("ECONNREFUSED") - done() - }) - }) - - it("must call original module.connect", function() { - this.mitm.disable() - - var connect = this.sinon.spy(module, "connect") - var mitm = Mitm() - mitm.on("connect", function(client) { client.bypass() }) + it("must emit close on socket if ended immediately", function (done) { + this.mitm.on("connection", function (socket) { + socket.end(); + }); + var socket = module.connect({ host: "foo" }); + socket.on("close", done.bind(null, null)); + }); + + it("must emit close on socket if ended in next tick", function (done) { + this.mitm.on("connection", function (socket) { + process.nextTick(socket.end.bind(socket)); + }); + + var socket = module.connect({ host: "foo" }); + socket.on("close", done.bind(null, null)); + }); + + it("must intercept 127.0.0.1", function (done) { + var server; + this.mitm.on("connection", function (s) { + server = s; + }); + var client = module.connect({ host: "127.0.0.1" }); + server.write("Hello"); + + client.setEncoding("utf8"); + client.on("data", function (data) { + data.must.equal("Hello"); + }); + client.on("data", done.bind(null, null)); + }); + + describe("when bypassed", function () { + beforeEach(function () { + this.sinon = Sinon.sandbox.create(); + }); + afterEach(function () { + this.sinon.restore(); + }); + + it("must not intercept", function (done) { + this.mitm.on("connect", function (client) { + client.bypass(); + }); + + module + .connect({ host: "127.0.0.1", port: 9 }) + .on("error", function (err) { + err.must.be.an.instanceof(Error); + err.message.must.include("ECONNREFUSED"); + done(); + }); + }); + + it("must call original module.connect", function () { + this.mitm.disable(); + + var connect = this.sinon.spy(module, "connect"); + var mitm = Mitm(); + mitm.on("connect", function (client) { + client.bypass(); + }); try { - module.connect({host: "127.0.0.1", port: 9}).on("error", noop) - connect.callCount.must.equal(1) - connect.firstCall.args[0].must.eql({host: "127.0.0.1", port: 9}) + module.connect({ host: "127.0.0.1", port: 9 }).on("error", noop); + connect.callCount.must.equal(1); + connect.firstCall.args[0].must.eql({ host: "127.0.0.1", port: 9 }); + } finally { + // Working around Mocha's context bug(s) and poor design decision + // with a manual `finally`. + mitm.disable(); } - // Working around Mocha's context bug(s) and poor design decision - // with a manual `finally`. - finally { mitm.disable() } - }) - - it("must not call back twice on connect given callback", - function(done) { - this.mitm.on("connect", function(client) { client.bypass() }) - - var onConnect = Sinon.spy() - var client = module.connect({host: "127.0.0.1", port: 9}, onConnect) - - client.on("error", process.nextTick.bind(null, function() { - onConnect.callCount.must.equal(0) - done() - })) - }) - - it("must not emit connection", function() { - this.mitm.on("connect", function(client) { client.bypass() }) - var onConnection = Sinon.spy() - this.mitm.on("connection", onConnection) - module.connect({host: "127.0.0.1", port: 9}).on("error", noop) - onConnection.callCount.must.equal(0) - }) - }) - }) + }); + + it("must not call back twice on connect given callback", function (done) { + this.mitm.on("connect", function (client) { + client.bypass(); + }); + + var onConnect = Sinon.spy(); + var client = module.connect( + { host: "127.0.0.1", port: 9 }, + onConnect + ); + + client.on( + "error", + process.nextTick.bind(null, function () { + onConnect.callCount.must.equal(0); + done(); + }) + ); + }); + + it("must not emit connection", function () { + this.mitm.on("connect", function (client) { + client.bypass(); + }); + var onConnection = Sinon.spy(); + this.mitm.on("connection", onConnection); + module.connect({ host: "127.0.0.1", port: 9 }).on("error", noop); + onConnection.callCount.must.equal(0); + }); + }); + }); } - describe("Net.connect", function() { - beforeEach(function() { this.mitm = Mitm() }) - afterEach(function() { this.mitm.disable() }) + describe("Net.connect", function () { + beforeEach(function () { + this.mitm = Mitm(); + }); + afterEach(function () { + this.mitm.disable(); + }); - mustConnect(Net) + mustConnect(Net); if (!NODE_0_10) - it("must not return an instance of Tls.TLSSocket", function() { - var client = Net.connect({host: "foo", port: 80}) - client.must.not.be.an.instanceof(Tls.TLSSocket) - }) + it("must not return an instance of Tls.TLSSocket", function () { + var client = Net.connect({ host: "foo", port: 80 }); + client.must.not.be.an.instanceof(Tls.TLSSocket); + }); - it("must not set the encrypted property", function() { - Net.connect({host: "foo"}).must.not.have.property("encrypted") - }) + it("must not set the encrypted property", function () { + Net.connect({ host: "foo" }).must.not.have.property("encrypted"); + }); - it("must not set the authorized property", function() { - Net.connect({host: "foo"}).must.not.have.property("authorized") - }) + it("must not set the authorized property", function () { + Net.connect({ host: "foo" }).must.not.have.property("authorized"); + }); - it("must not emit secureConnect on client", function(done) { - var client = Net.connect({host: "foo"}) + it("must not emit secureConnect on client", function (done) { + var client = Net.connect({ host: "foo" }); // Let Mocha raise an error when done called twice. - client.on("secureConnect", done.bind(null, null)) - done() - }) - - it("must not emit secureConnect on server", function(done) { - var server; this.mitm.on("connection", function(s) { server = s }) - Net.connect({host: "foo"}) + client.on("secureConnect", done.bind(null, null)); + done(); + }); + + it("must not emit secureConnect on server", function (done) { + var server; + this.mitm.on("connection", function (s) { + server = s; + }); + Net.connect({ host: "foo" }); // Let Mocha raise an error when done called twice. - server.on("secureConnect", done.bind(null, null)) - done() - }) - - describe("Socket", function() { - describe(".prototype.write", function() { - it("must write to client from server", function(done) { - var server; this.mitm.on("connection", function(s) { server = s }) - var client = Net.connect({host: "foo"}) - server.write("Hello ☺️") - - client.setEncoding("utf8") - client.on("data", function(data) { data.must.equal("Hello ☺️") }) - client.on("data", done.bind(null, null)) - }) - - it("must write to client from server in the next tick", function(done) { - var server; this.mitm.on("connection", function(s) { server = s }) - var client = Net.connect({host: "foo"}) - - var ticked = false - client.once("data", function() { ticked.must.be.true(); done() }) - server.write("Hello") - ticked = true - }) - - it("must write to server from client", function(done) { - var server; this.mitm.on("connection", function(s) { server = s }) - var client = Net.connect({host: "foo"}) - client.write("Hello ☺️") - - server.setEncoding("utf8") - process.nextTick(function() { server.read().must.equal("Hello ☺️") }) - process.nextTick(done) - }) - - it("must write to server from client in the next tick", function(done) { - var server; this.mitm.on("connection", function(s) { server = s }) - var client = Net.connect({host: "foo"}) - - var ticked = false - server.once("data", function() { ticked.must.be.true(); done() }) - client.write("Hello") - ticked = true - }) + server.on("secureConnect", done.bind(null, null)); + done(); + }); + + describe("Socket", function () { + describe(".prototype.write", function () { + it("must write to client from server", function (done) { + var server; + this.mitm.on("connection", function (s) { + server = s; + }); + var client = Net.connect({ host: "foo" }); + server.write("Hello ☺️"); + + client.setEncoding("utf8"); + client.on("data", function (data) { + data.must.equal("Hello ☺️"); + }); + client.on("data", done.bind(null, null)); + }); + + it("must write to client from server in the next tick", function (done) { + var server; + this.mitm.on("connection", function (s) { + server = s; + }); + var client = Net.connect({ host: "foo" }); + + var ticked = false; + client.once("data", function () { + ticked.must.be.true(); + done(); + }); + server.write("Hello"); + ticked = true; + }); + + it("must write to server from client", function (done) { + var server; + this.mitm.on("connection", function (s) { + server = s; + }); + var client = Net.connect({ host: "foo" }); + client.write("Hello ☺️"); + + server.setEncoding("utf8"); + process.nextTick(function () { + server.read().must.equal("Hello ☺️"); + }); + process.nextTick(done); + }); + + it("must write to server from client in the next tick", function (done) { + var server; + this.mitm.on("connection", function (s) { + server = s; + }); + var client = Net.connect({ host: "foo" }); + + var ticked = false; + server.once("data", function () { + ticked.must.be.true(); + done(); + }); + client.write("Hello"); + ticked = true; + }); // Writing binary strings was introduced in Node v0.11.14. // The test still passes for Node v0.10 and newer v0.11s, so let it be. - it("must write to server from client given binary", function(done) { - var server; this.mitm.on("connection", function(s) { server = s }) - var client = Net.connect({host: "foo"}) - client.write("Hello", "binary") - - server.setEncoding("binary") - process.nextTick(function() { server.read().must.equal("Hello") }) - process.nextTick(done) - }) + it("must write to server from client given binary", function (done) { + var server; + this.mitm.on("connection", function (s) { + server = s; + }); + var client = Net.connect({ host: "foo" }); + client.write("Hello", "binary"); + + server.setEncoding("binary"); + process.nextTick(function () { + server.read().must.equal("Hello"); + }); + process.nextTick(done); + }); // Writing latin1 strings was introduced in v6.4. // https://github.com/nodejs/node/commit/28071a130e2137bd14d0762a25f0ad83b7a28259 if (Semver.satisfies(process.version, ">= 6.4")) - it("must write to server from client given latin1", function(done) { - var server; this.mitm.on("connection", function(s) { server = s }) - var client = Net.connect({host: "foo"}) - client.write("Hello", "latin1") - - server.setEncoding("latin1") - process.nextTick(function() { server.read().must.equal("Hello") }) - process.nextTick(done) - }) - - it("must write to server from client given a buffer", function(done) { - var server; this.mitm.on("connection", function(s) { server = s }) - var client = Net.connect({host: "foo"}) - client.write(newBuffer("Hello", "binary")) - - process.nextTick(function() { - assertBuffers(server.read(), newBuffer("Hello", "binary")) - done() - }) - }) - - it("must write to server from client given a UTF-8 string", - function(done) { - var server; this.mitm.on("connection", function(s) { server = s }) - var client = Net.connect({host: "foo"}) - client.write("Hello", "utf8") - - process.nextTick(function() { - assertBuffers(server.read(), newBuffer("Hello", "binary")) - done() - }) - }) - - it("must write to server from client given a ASCII string", - function(done) { - var server; this.mitm.on("connection", function(s) { server = s }) - var client = Net.connect({host: "foo"}) - client.write("Hello", "ascii") - - process.nextTick(function() { - assertBuffers(server.read(), newBuffer("Hello", "binary")) - done() - }) - }) - - it("must write to server from client given a UCS-2 string", - function(done) { - var server; this.mitm.on("connection", function(s) { server = s }) - var client = Net.connect({host: "foo"}) - client.write("Hello", "ucs2") - - process.nextTick(function() { + it("must write to server from client given latin1", function (done) { + var server; + this.mitm.on("connection", function (s) { + server = s; + }); + var client = Net.connect({ host: "foo" }); + client.write("Hello", "latin1"); + + server.setEncoding("latin1"); + process.nextTick(function () { + server.read().must.equal("Hello"); + }); + process.nextTick(done); + }); + + it("must write to server from client given a buffer", function (done) { + var server; + this.mitm.on("connection", function (s) { + server = s; + }); + var client = Net.connect({ host: "foo" }); + client.write(newBuffer("Hello", "binary")); + + process.nextTick(function () { + assertBuffers(server.read(), newBuffer("Hello", "binary")); + done(); + }); + }); + + it("must write to server from client given a UTF-8 string", function (done) { + var server; + this.mitm.on("connection", function (s) { + server = s; + }); + var client = Net.connect({ host: "foo" }); + client.write("Hello", "utf8"); + + process.nextTick(function () { + assertBuffers(server.read(), newBuffer("Hello", "binary")); + done(); + }); + }); + + it("must write to server from client given a ASCII string", function (done) { + var server; + this.mitm.on("connection", function (s) { + server = s; + }); + var client = Net.connect({ host: "foo" }); + client.write("Hello", "ascii"); + + process.nextTick(function () { + assertBuffers(server.read(), newBuffer("Hello", "binary")); + done(); + }); + }); + + it("must write to server from client given a UCS-2 string", function (done) { + var server; + this.mitm.on("connection", function (s) { + server = s; + }); + var client = Net.connect({ host: "foo" }); + client.write("Hello", "ucs2"); + + process.nextTick(function () { assertBuffers( server.read(), newBuffer("H\u0000e\u0000l\u0000l\u0000o\u0000", "binary") - ) - - done() - }) - }) - }) - - describe(".prototype.end", function() { - it("must emit end when closed on server", function(done) { - var server; this.mitm.on("connection", function(s) { server = s }) - var client = Net.connect({host: "foo"}) - server.end() - client.on("end", done) - }) - }) - - describe(".prototype.ref", function() { - it("must allow calling on client", function() { - Net.connect({host: "foo"}).ref() - }) - - it("must allow calling on server", function() { - var server; this.mitm.on("connection", function(s) { server = s }) - Net.connect({host: "foo"}) - server.ref() - }) - }) - - describe(".prototype.unref", function() { - it("must allow calling on client", function() { - Net.connect({host: "foo"}).unref() - }) - - it("must allow calling on server", function() { - var server; this.mitm.on("connection", function(s) { server = s }) - Net.connect({host: "foo"}) - server.unref() - }) - }) - - describe(".prototype.pipe", function() { + ); + + done(); + }); + }); + }); + + describe(".prototype.end", function () { + it("must emit end when closed on server", function (done) { + var server; + this.mitm.on("connection", function (s) { + server = s; + }); + var client = Net.connect({ host: "foo" }); + server.end(); + client.on("end", done); + }); + }); + + describe(".prototype.ref", function () { + it("must allow calling on client", function () { + Net.connect({ host: "foo" }).ref(); + }); + + it("must allow calling on server", function () { + var server; + this.mitm.on("connection", function (s) { + server = s; + }); + Net.connect({ host: "foo" }); + server.ref(); + }); + }); + + describe(".prototype.unref", function () { + it("must allow calling on client", function () { + Net.connect({ host: "foo" }).unref(); + }); + + it("must allow calling on server", function () { + var server; + this.mitm.on("connection", function (s) { + server = s; + }); + Net.connect({ host: "foo" }); + server.unref(); + }); + }); + + describe(".prototype.pipe", function () { // To confirm https://github.com/moll/node-mitm/issues/47 won't become // an issue. - it("must allow piping to itself", function(done) { - this.mitm.on("connection", function(server) { - server.pipe(new Upcase).pipe(server) - }) - - var client = Net.connect({host: "foo"}) - client.write("Hello") - - client.setEncoding("utf8") - client.on("data", function(data) { data.must.equal("HELLO") }) - client.on("data", done.bind(null, null)) - }) - }) + it("must allow piping to itself", function (done) { + this.mitm.on("connection", function (server) { + server.pipe(new Upcase()).pipe(server); + }); + + var client = Net.connect({ host: "foo" }); + client.write("Hello"); + + client.setEncoding("utf8"); + client.on("data", function (data) { + data.must.equal("HELLO"); + }); + client.on("data", done.bind(null, null)); + }); + }); // Bug report from Io.js v3 days: // https://github.com/moll/node-mitm/issues/26 - describe(".prototype.destroy", function() { - it("must emit end when destroyed on server", function(done) { - var server; this.mitm.on("connection", function(s) { server = s }) - var client = Net.connect({host: "foo"}) - server.destroy() - client.on("end", done) - }) - }) - }) - }) - - describe("Net.createConnection", function() { - beforeEach(function() { this.mitm = Mitm() }) - afterEach(function() { this.mitm.disable() }) - - it("must be equal to Net.connect", function() { - Net.createConnection.must.equal(Net.connect) - }) - }) - - describe("Tls.connect", function() { - beforeEach(function() { this.mitm = Mitm() }) - afterEach(function() { this.mitm.disable() }) - - mustConnect(Tls) + describe(".prototype.destroy", function () { + it("must emit end when destroyed on server", function (done) { + var server; + this.mitm.on("connection", function (s) { + server = s; + }); + var client = Net.connect({ host: "foo" }); + server.destroy(); + client.on("end", done); + }); + }); + }); + }); + + describe("Net.createConnection", function () { + beforeEach(function () { + this.mitm = Mitm(); + }); + afterEach(function () { + this.mitm.disable(); + }); + + it("must be equal to Net.connect", function () { + Net.createConnection.must.equal(Net.connect); + }); + }); + + describe("Tls.connect", function () { + beforeEach(function () { + this.mitm = Mitm(); + }); + afterEach(function () { + this.mitm.disable(); + }); + + mustConnect(Tls); if (!NODE_0_10) - it("must return an instance of Tls.TLSSocket", function() { - Tls.connect({host: "foo", port: 80}).must.be.an.instanceof(Tls.TLSSocket) - }) + it("must return an instance of Tls.TLSSocket", function () { + Tls.connect({ host: "foo", port: 80 }).must.be.an.instanceof( + Tls.TLSSocket + ); + }); if (!NODE_0_10) - it("must return an instance of Tls.TLSSocket given port", function() { - Tls.connect(80).must.be.an.instanceof(Tls.TLSSocket) - }) + it("must return an instance of Tls.TLSSocket given port", function () { + Tls.connect(80).must.be.an.instanceof(Tls.TLSSocket); + }); if (!NODE_0_10) - it("must return an instance of Tls.TLSSocket given port and host", - function() { - Tls.connect(80, "10.0.0.1").must.be.an.instanceof(Tls.TLSSocket) - }) - - it("must emit secureConnect in next ticks", function(done) { - var socket = Tls.connect({host: "foo"}) - socket.on("secureConnect", done.bind(null, null)) - }) - - it("must emit secureConnect after connect in next ticks", function(done) { - var socket = Tls.connect({host: "foo"}) - - socket.on("connect", function() { - socket.on("secureConnect", done.bind(null, null)) - }) - }) - - it("must not emit secureConnect on server", function(done) { - var server; this.mitm.on("connection", function(s) { server = s }) - Tls.connect({host: "foo"}) + it("must return an instance of Tls.TLSSocket given port and host", function () { + Tls.connect(80, "10.0.0.1").must.be.an.instanceof(Tls.TLSSocket); + }); + + it("must emit secureConnect in next ticks", function (done) { + var socket = Tls.connect({ host: "foo" }); + socket.on("secureConnect", done.bind(null, null)); + }); + + it("must emit secureConnect after connect in next ticks", function (done) { + var socket = Tls.connect({ host: "foo" }); + + socket.on("connect", function () { + socket.on("secureConnect", done.bind(null, null)); + }); + }); + + it("must not emit secureConnect on server", function (done) { + var server; + this.mitm.on("connection", function (s) { + server = s; + }); + Tls.connect({ host: "foo" }); // Let Mocha raise an error when done called twice. - server.on("secureConnect", done.bind(null, null)) - done() - }) + server.on("secureConnect", done.bind(null, null)); + done(); + }); - it("must call back on secureConnect", function(done) { - var connected = false + it("must call back on secureConnect", function (done) { + var connected = false; - var client = Tls.connect({host: "foo"}, function() { - connected.must.be.true() - done() - }) + var client = Tls.connect({ host: "foo" }, function () { + connected.must.be.true(); + done(); + }); - client.on("connect", function() { connected = true }) - }) + client.on("connect", function () { + connected = true; + }); + }); - it("must set encrypted true", function() { - Tls.connect({host: "foo"}).encrypted.must.be.true() - }) + it("must set encrypted true", function () { + Tls.connect({ host: "foo" }).encrypted.must.be.true(); + }); - it("must set authorized true", function() { - Tls.connect({host: "foo"}).authorized.must.be.true() - }) - }) + it("must set authorized true", function () { + Tls.connect({ host: "foo" }).authorized.must.be.true(); + }); + }); function mustRequest(request) { - describe("as request", function() { - it("must return ClientRequest", function() { - request({host: "foo"}).must.be.an.instanceof(ClientRequest) - }) - - it("must emit connect on Mitm", function() { - var onConnect = Sinon.spy() - this.mitm.on("connect", onConnect) - request({host: "foo"}) - onConnect.callCount.must.equal(1) - }) - - it("must emit connect on Mitm after multiple connections", function() { - var onConnect = Sinon.spy() - this.mitm.on("connect", onConnect) - request({host: "foo"}) - request({host: "foo"}) - request({host: "foo"}) - onConnect.callCount.must.equal(3) - }) - - it("must emit connection on Mitm", function() { - var onConnection = Sinon.spy() - this.mitm.on("connection", onConnection) - request({host: "foo"}) - onConnection.callCount.must.equal(1) - }) - - it("must emit connection on Mitm after multiple connections", function() { - var onConnection = Sinon.spy() - this.mitm.on("connection", onConnection) - request({host: "foo"}) - request({host: "foo"}) - request({host: "foo"}) - onConnection.callCount.must.equal(3) - }) - - it("must emit request on Mitm", function(done) { - var client = request({host: "foo"}) - client.end() - - this.mitm.on("request", function(req, res) { - req.must.be.an.instanceof(IncomingMessage) - req.must.not.equal(client) - res.must.be.an.instanceof(ServerResponse) - done() - }) - }) - - it("must emit request on Mitm after multiple requests", function(done) { - request({host: "foo"}).end() - request({host: "foo"}).end() - request({host: "foo"}).end() - this.mitm.on("request", _.after(3, done.bind(null, null))) - }) - - it("must emit socket on request in next ticks", function(done) { - var client = request({host: "foo"}) - client.on("socket", done.bind(null, null)) - }) + describe("as request", function () { + it("must return ClientRequest", function () { + request({ host: "foo" }).must.be.an.instanceof(ClientRequest); + }); + + it("must emit connect on Mitm", function () { + var onConnect = Sinon.spy(); + this.mitm.on("connect", onConnect); + request({ host: "foo" }); + onConnect.callCount.must.equal(1); + }); + + it("must emit connect on Mitm after multiple connections", function () { + var onConnect = Sinon.spy(); + this.mitm.on("connect", onConnect); + request({ host: "foo" }); + request({ host: "foo" }); + request({ host: "foo" }); + onConnect.callCount.must.equal(3); + }); + + it("must emit connection on Mitm", function () { + var onConnection = Sinon.spy(); + this.mitm.on("connection", onConnection); + request({ host: "foo" }); + onConnection.callCount.must.equal(1); + }); + + it("must emit connection on Mitm after multiple connections", function () { + var onConnection = Sinon.spy(); + this.mitm.on("connection", onConnection); + request({ host: "foo" }); + request({ host: "foo" }); + request({ host: "foo" }); + onConnection.callCount.must.equal(3); + }); + + it("must emit request on Mitm", function (done) { + var client = request({ host: "foo" }); + client.end(); + + this.mitm.on("request", function (req, res) { + req.must.be.an.instanceof(IncomingMessage); + req.must.not.equal(client); + res.must.be.an.instanceof(ServerResponse); + done(); + }); + }); + + it("must emit request on Mitm after multiple requests", function (done) { + request({ host: "foo" }).end(); + request({ host: "foo" }).end(); + request({ host: "foo" }).end(); + this.mitm.on("request", _.after(3, done.bind(null, null))); + }); + + it("must emit socket on request in next ticks", function (done) { + var client = request({ host: "foo" }); + client.on("socket", done.bind(null, null)); + }); // https://github.com/moll/node-mitm/pull/25 - it("must emit connect after socket event", function(done) { - var client = request({host: "foo"}) - - client.on("socket", function(socket) { - socket.on("connect", done.bind(null, null)) - }) - }) - - describe("when bypassed", function() { - it("must not intercept", function(done) { - this.mitm.on("connect", function(client) { client.bypass() }) - request({host: "127.0.0.1"}).on("error", function(err) { - err.must.be.an.instanceof(Error) - err.message.must.include("ECONNREFUSED") - done() - }) - }) - - it("must not emit request", function(done) { - this.mitm.on("connect", function(client) { client.bypass() }) - var onRequest = Sinon.spy() - this.mitm.on("request", onRequest) - request({host: "127.0.0.1"}).on("error", function(_err) { - onRequest.callCount.must.equal(0) - done() - }) - }) - }) - }) + it("must emit connect after socket event", function (done) { + var client = request({ host: "foo" }); + + client.on("socket", function (socket) { + socket.on("connect", done.bind(null, null)); + }); + }); + + describe("when bypassed", function () { + it("must not intercept", function (done) { + this.mitm.on("connect", function (client) { + client.bypass(); + }); + request({ host: "127.0.0.1" }).on("error", function (err) { + err.must.be.an.instanceof(Error); + err.message.must.include("ECONNREFUSED"); + done(); + }); + }); + + it("must not emit request", function (done) { + this.mitm.on("connect", function (client) { + client.bypass(); + }); + var onRequest = Sinon.spy(); + this.mitm.on("request", onRequest); + request({ host: "127.0.0.1" }).on("error", function (_err) { + onRequest.callCount.must.equal(0); + done(); + }); + }); + }); + }); } - describe("via Http.request", function() { - beforeEach(function() { this.mitm = Mitm() }) - afterEach(function() { this.mitm.disable() }) + describe("via Http.request", function () { + beforeEach(function () { + this.mitm = Mitm(); + }); + afterEach(function () { + this.mitm.disable(); + }); - mustRequest(Http.request) - }) + mustRequest(Http.request); + }); - describe("via Https.request", function() { - beforeEach(function() { this.mitm = Mitm() }) - afterEach(function() { this.mitm.disable() }) + describe("via Https.request", function () { + beforeEach(function () { + this.mitm = Mitm(); + }); + afterEach(function () { + this.mitm.disable(); + }); - mustRequest(Https.request) + mustRequest(Https.request); // https://github.com/moll/node-mitm/pull/25 - it("must emit secureConnect after socket event", function(done) { - var client = Https.request({host: "foo"}) - - client.on("socket", function(socket) { - socket.on("secureConnect", done.bind(null, null)) - }) - }) - }) - - describe("via Http.Agent", function() { - beforeEach(function() { this.mitm = Mitm() }) - afterEach(function() { this.mitm.disable() }) - - mustRequest(function(opts) { - return Http.request(_.extend({agent: new Http.Agent}, opts)) - }) - - it("must support keep-alive", function(done) { + it("must emit secureConnect after socket event", function (done) { + var client = Https.request({ host: "foo" }); + + client.on("socket", function (socket) { + socket.on("secureConnect", done.bind(null, null)); + }); + }); + }); + + describe("via Http.Agent", function () { + beforeEach(function () { + this.mitm = Mitm(); + }); + afterEach(function () { + this.mitm.disable(); + }); + + mustRequest(function (opts) { + return Http.request(_.extend({ agent: new Http.Agent() }, opts)); + }); + + it("must support keep-alive", function (done) { var client = Http.request({ host: "foo", - agent: new Http.Agent({keepAlive: true}) - }) + agent: new Http.Agent({ keepAlive: true }), + }); - client.end() + client.end(); - this.mitm.on("request", function(_req, res) { - res.setHeader("Connection", "keep-alive") - res.end() - }) + this.mitm.on("request", function (_req, res) { + res.setHeader("Connection", "keep-alive"); + res.end(); + }); // Just waiting for response is too early to trigger: // TypeError: socket._handle.getAsyncId is not a function in _http_client. - client.on("response", function(res) { - res.on("data", noop) - res.on("end", done) - }) - }) - }) - - describe("via Https.Agent", function() { - beforeEach(function() { this.mitm = Mitm() }) - afterEach(function() { this.mitm.disable() }) - - mustRequest(function(opts) { - return Https.request(_.extend({agent: new Https.Agent}, opts)) - }) - }) - - describe("IncomingMessage", function() { - beforeEach(function() { this.mitm = Mitm() }) - afterEach(function() { this.mitm.disable() }) - - it("must have URL", function(done) { - Http.request({host: "foo", path: "/foo"}).end() - - this.mitm.on("request", function(req) { - req.url.must.equal("/foo") - done() - }) - }) - - it("must have headers", function(done) { - var req = Http.request({host: "foo"}) - req.setHeader("Content-Type", "application/json") - req.end() - - this.mitm.on("request", function(req) { - req.headers["content-type"].must.equal("application/json") - done() - }) - }) - - it("must have body", function(done) { - var client = Http.request({host: "foo", method: "POST"}) - client.write("Hello") - - this.mitm.on("request", function(req, _res) { - req.setEncoding("utf8") - req.on("data", function(data) { data.must.equal("Hello"); done() }) - }) - }) - - it("must have a reference to the ServerResponse", function(done) { - Http.request({host: "foo", method: "POST"}).end() - this.mitm.on("request", function(req, res) { req.res.must.equal(res) }) - this.mitm.on("request", done.bind(null, null)) - }) - }) - - describe("ServerResponse", function() { - beforeEach(function() { this.mitm = Mitm() }) - afterEach(function() { this.mitm.disable() }) - - it("must respond with status, headers and body", function(done) { - this.mitm.on("request", function(_req, res) { - res.statusCode = 442 - res.setHeader("Content-Type", "application/json") - res.end("Hi!") - }) - - Http.request({host: "foo"}).on("response", function(res) { - res.statusCode.must.equal(442) - res.headers["content-type"].must.equal("application/json") - res.setEncoding("utf8") - res.once("data", function(data) { data.must.equal("Hi!"); done() }) - }).end() - }) - - it("must have a reference to the IncomingMessage", function(done) { - Http.request({host: "foo", method: "POST"}).end() - this.mitm.on("request", function(req, res) { res.req.must.equal(req) }) - this.mitm.on("request", done.bind(null, null)) - }) - - describe(".prototype.write", function() { - it("must make clientRequest emit response", function(done) { - var req = Http.request({host: "foo"}) - req.end() - this.mitm.on("request", function(_req, res) { res.write("Test") }) - req.on("response", done.bind(null, null)) - }) + client.on("response", function (res) { + res.on("data", noop); + res.on("end", done); + }); + }); + }); + + describe("via Https.Agent", function () { + beforeEach(function () { + this.mitm = Mitm(); + }); + afterEach(function () { + this.mitm.disable(); + }); + + mustRequest(function (opts) { + return Https.request(_.extend({ agent: new Https.Agent() }, opts)); + }); + }); + + describe("IncomingMessage", function () { + beforeEach(function () { + this.mitm = Mitm(); + }); + afterEach(function () { + this.mitm.disable(); + }); + + it("must have URL", function (done) { + Http.request({ host: "foo", path: "/foo" }).end(); + + this.mitm.on("request", function (req) { + req.url.must.equal("/foo"); + done(); + }); + }); + + it("must have headers", function (done) { + var req = Http.request({ host: "foo" }); + req.setHeader("Content-Type", "application/json"); + req.end(); + + this.mitm.on("request", function (req) { + req.headers["content-type"].must.equal("application/json"); + done(); + }); + }); + + it("must have body", function (done) { + var client = Http.request({ host: "foo", method: "POST" }); + client.write("Hello"); + + this.mitm.on("request", function (req, _res) { + req.setEncoding("utf8"); + req.on("data", function (data) { + data.must.equal("Hello"); + done(); + }); + }); + }); + + it("must have a reference to the ServerResponse", function (done) { + Http.request({ host: "foo", method: "POST" }).end(); + this.mitm.on("request", function (req, res) { + req.res.must.equal(res); + }); + this.mitm.on("request", done.bind(null, null)); + }); + }); + + describe("ServerResponse", function () { + beforeEach(function () { + this.mitm = Mitm(); + }); + afterEach(function () { + this.mitm.disable(); + }); + + it("must respond with status, headers and body", function (done) { + this.mitm.on("request", function (_req, res) { + res.statusCode = 442; + res.setHeader("Content-Type", "application/json"); + res.end("Hi!"); + }); + + Http.request({ host: "foo" }) + .on("response", function (res) { + res.statusCode.must.equal(442); + res.headers["content-type"].must.equal("application/json"); + res.setEncoding("utf8"); + res.once("data", function (data) { + data.must.equal("Hi!"); + done(); + }); + }) + .end(); + }); + + it("must have a reference to the IncomingMessage", function (done) { + Http.request({ host: "foo", method: "POST" }).end(); + this.mitm.on("request", function (req, res) { + res.req.must.equal(req); + }); + this.mitm.on("request", done.bind(null, null)); + }); + + describe(".prototype.write", function () { + it("must make clientRequest emit response", function (done) { + var req = Http.request({ host: "foo" }); + req.end(); + this.mitm.on("request", function (_req, res) { + res.write("Test"); + }); + req.on("response", done.bind(null, null)); + }); // Under Node v0.10 it's the writeQueueSize that's checked to see if // the callback can be called. - it("must call given callback", function(done) { - Http.request({host: "foo"}).end() - this.mitm.on("request", function(_req, res) { res.write("Test", done) }) - }) - }) - - describe(".prototype.end", function() { - it("must make ClientRequest emit response", function(done) { - var client = Http.request({host: "foo"}) - client.end() - this.mitm.on("request", function(_req, res) { res.end() }) - client.on("response", done.bind(null, null)) - }) + it("must call given callback", function (done) { + Http.request({ host: "foo" }).end(); + this.mitm.on("request", function (_req, res) { + res.write("Test", done); + }); + }); + }); + + describe(".prototype.end", function () { + it("must make ClientRequest emit response", function (done) { + var client = Http.request({ host: "foo" }); + client.end(); + this.mitm.on("request", function (_req, res) { + res.end(); + }); + client.on("response", done.bind(null, null)); + }); // In an app of mine Node v0.11.7 did not emit the end event, but // v0.11.11 did. I'll investigate properly if this becomes a problem in // later Node versions. - it("must make IncomingMessage emit end", function(done) { - var client = Http.request({host: "foo"}) - client.end() - this.mitm.on("request", function(_req, res) { res.end() }) - - client.on("response", function(res) { - res.on("data", noop) - res.on("end", done) - }) - }) - }) - }) - - describe(".prototype.addListener", function() { - it("must be an alias to EventEmitter.prototype.addListener", function() { - Mitm.prototype.addListener.must.equal(EventEmitter.prototype.addListener) - }) - }) - - describe(".prototype.off", function() { - it("must be an alias to EventEmitter.prototype.removeListener", function() { - Mitm.prototype.off.must.equal(EventEmitter.prototype.removeListener) - }) - }) -}) - -function Upcase() { Transform.call(this, arguments) } + it("must make IncomingMessage emit end", function (done) { + var client = Http.request({ host: "foo" }); + client.end(); + this.mitm.on("request", function (_req, res) { + res.end(); + }); + + client.on("response", function (res) { + res.on("data", noop); + res.on("end", done); + }); + }); + }); + }); + + describe(".prototype.addListener", function () { + it("must be an alias to EventEmitter.prototype.addListener", function () { + Mitm.prototype.addListener.must.equal(EventEmitter.prototype.addListener); + }); + }); + + describe(".prototype.off", function () { + it("must be an alias to EventEmitter.prototype.removeListener", function () { + Mitm.prototype.off.must.equal(EventEmitter.prototype.removeListener); + }); + }); +}); + +function Upcase() { + Transform.call(this, arguments); +} Upcase.prototype = Object.create(Transform.prototype, { - constructor: {value: Upcase, configurable: true, writeable: true} -}) + constructor: { value: Upcase, configurable: true, writeable: true }, +}); -Upcase.prototype._transform = function(chunk, _enc, done) { - done(null, String(chunk).toUpperCase()) -} +Upcase.prototype._transform = function (chunk, _enc, done) { + done(null, String(chunk).toUpperCase()); +}; function assertBuffers(a, b) { - if (a.equals) a.equals(b).must.be.true() - else a.toString("utf8").must.equal(b.toString("utf8")) + if (a.equals) a.equals(b).must.be.true(); + else a.toString("utf8").must.equal(b.toString("utf8")); } function noop() {} From c21b5044d487756fa9dbdd1ce4658a1abe086d66 Mon Sep 17 00:00:00 2001 From: Gregor Martynus <39992+gr2m@users.noreply.github.com> Date: Fri, 3 Dec 2021 23:11:49 -0800 Subject: [PATCH 14/59] build(gitignore): `coverage/` --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index 2ac2cb5..debb5ce 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,3 @@ .nyc_output/ +coverage/ node_modules/ \ No newline at end of file From 627ecbffa548cc8d2ff3733138b8a6148741f515 Mon Sep 17 00:00:00 2001 From: Gregor Martynus <39992+gr2m@users.noreply.github.com> Date: Fri, 3 Dec 2021 23:14:15 -0800 Subject: [PATCH 15/59] build(engines): node 14+ --- package.json | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/package.json b/package.json index c92dd4f..24d7d66 100644 --- a/package.json +++ b/package.json @@ -33,9 +33,10 @@ ], "main": "index.js", "scripts": { - "test": "nyc mocha", + "coverage": "nyc report --reporter html && open coverage/index.html", "lint": "prettier --check \"{lib,test}/**/*.{js,json,ts}\" \"*.{js,json,md}\"", - "lint:fix": "prettier --write \"{lib,test}/**/*.{js,json,ts}\" \"*.{js,json,md}\"" + "lint:fix": "prettier --write \"{lib,test}/**/*.{js,json,ts}\" \"*.{js,json,md}\"", + "test": "nyc mocha" }, "dependencies": { "semver": ">= 5 < 6", @@ -49,6 +50,6 @@ "sinon": ">= 1.9 < 2" }, "engines": { - "node": ">= 0.10.24" + "node": ">= 14" } } From 77be99ff7fc44b03bd6db52cba90c4e5d735562a Mon Sep 17 00:00:00 2001 From: Gregor Martynus <39992+gr2m@users.noreply.github.com> Date: Fri, 3 Dec 2021 23:28:53 -0800 Subject: [PATCH 16/59] refactor: remove obosolete code for Node < 14 --- index.js | 43 +++--------------- lib/internal_socket.js | 98 +++++++++++++----------------------------- lib/tls_socket.js | 10 +---- test/index_test.js | 63 ++++++++++++--------------- 4 files changed, 66 insertions(+), 148 deletions(-) diff --git a/index.js b/index.js index 9db083d..7b7a96c 100644 --- a/index.js +++ b/index.js @@ -2,18 +2,15 @@ var _ = require("underscore"); var Net = require("net"); var Tls = require("tls"); var Http = require("http"); -var Https = require("https"); var ClientRequest = Http.ClientRequest; var Socket = require("./lib/socket"); var TlsSocket = require("./lib/tls_socket"); var EventEmitter = require("events").EventEmitter; var InternalSocket = require("./lib/internal_socket"); var Stubs = require("./lib/stubs"); -var Semver = require("semver"); var slice = Function.call.bind(Array.prototype.slice); var normalizeConnectArgs = Net._normalizeConnectArgs || Net._normalizeArgs; var createRequestAndResponse = Http._connectionListener; -var NODE_0_10 = Semver.satisfies(process.version, ">= 0.10 < 0.11"); module.exports = Mitm; function Mitm() { @@ -33,14 +30,12 @@ Mitm.prototype.addListener = EventEmitter.prototype.addListener; Mitm.prototype.removeListener = EventEmitter.prototype.removeListener; Mitm.prototype.emit = EventEmitter.prototype.emit; -if (Semver.satisfies(process.version, "^8.12 || >= 9.6")) { - var IncomingMessage = require("_http_incoming").IncomingMessage; - var ServerResponse = require("_http_server").ServerResponse; - var incomingMessageKey = require("_http_common").kIncomingMessage; - var serverResponseKey = require("_http_server").kServerResponse; - Mitm.prototype[serverResponseKey] = ServerResponse; - Mitm.prototype[incomingMessageKey] = IncomingMessage; -} +var IncomingMessage = require("_http_incoming").IncomingMessage; +var ServerResponse = require("_http_server").ServerResponse; +var incomingMessageKey = require("_http_common").kIncomingMessage; +var serverResponseKey = require("_http_server").kServerResponse; +Mitm.prototype[serverResponseKey] = ServerResponse; +Mitm.prototype[incomingMessageKey] = IncomingMessage; Mitm.prototype.enable = function () { // Connect is called synchronously. @@ -52,17 +47,6 @@ Mitm.prototype.enable = function () { this.stubs.stub(Http.Agent.prototype, "createConnection", netConnect); this.stubs.stub(Tls, "connect", tlsConnect); - if (NODE_0_10) { - // Node v0.10 sets createConnection on the object in the constructor. - this.stubs.stub(Http.globalAgent, "createConnection", netConnect); - - // This will create a lot of sockets in tests, but that's the current price - // to pay until I find a better way to force a new socket for each - // connection. - this.stubs.stub(Http.globalAgent, "maxSockets", Infinity); - this.stubs.stub(Https.globalAgent, "maxSockets", Infinity); - } - // ClientRequest.prototype.onSocket is called synchronously from // ClientRequest's constructor and is a convenient place to hook into new // ClientRequests. @@ -156,20 +140,7 @@ Mitm.prototype.tlsConnect = function (orig, opts, done) { Mitm.prototype.request = function request(socket) { if (!socket.mitmServerSocket) return socket; - // Node >= v0.10.24 < v0.11 will crash with: «Assertion failed: - // (!current_buffer), function Execute, file ../src/node_http_parser.cc, line - // 387.» if ServerResponse.prototype.write is called from within the - // "request" event handler. Call it in the next tick to work around that. - var self = this; - if (NODE_0_10) { - self = Object.create(this); - self.emit = _.compose( - process.nextTick, - Function.bind.bind(this.emit, this) - ); - } - - createRequestAndResponse.call(self, socket.mitmServerSocket); + createRequestAndResponse.call(this, socket.mitmServerSocket); return socket; }; diff --git a/lib/internal_socket.js b/lib/internal_socket.js index 02c2cee..d51a745 100644 --- a/lib/internal_socket.js +++ b/lib/internal_socket.js @@ -1,24 +1,15 @@ var DuplexStream = require("stream").Duplex; -var Semver = require("semver"); var uniqueId = 0; var NO_ERROR = 0; var STREAM_STATE; var STREAM_BYTES_READ; -var NODE_VERSION = process.version; exports = module.exports = InternalSocket; exports.pair = pair; -var NODE_0_10 = Semver.satisfies(NODE_VERSION, ">= 0.10 < 0.11"); -var NODE_10_AND_LATER = Semver.satisfies(NODE_VERSION, ">= 10"); -var NODE_11_1_AND_LATER = Semver.satisfies(NODE_VERSION, ">= 11.1"); -var NODE_11_2_AND_LATER = Semver.satisfies(NODE_VERSION, ">= 11.2"); -var NODE_10_15_1_AND_MAJOR = Semver.satisfies(NODE_VERSION, ">= 10.15.1 < 11"); -if (!NODE_0_10) var UV_EOF = process.binding("uv").UV_EOF; +var UV_EOF = process.binding("uv").UV_EOF; -if (NODE_11_1_AND_LATER) { - STREAM_STATE = process.binding("stream_wrap").streamBaseState; - STREAM_BYTES_READ = process.binding("stream_wrap").kReadBytesOrError; -} +STREAM_STATE = process.binding("stream_wrap").streamBaseState; +STREAM_BYTES_READ = process.binding("stream_wrap").kReadBytesOrError; /** * Sockets write to InternalSocket via write*String functions. The @@ -31,7 +22,7 @@ if (NODE_11_1_AND_LATER) { */ function InternalSocket(remote) { DuplexStream.call(this); - if (remote) this.remote = remote; + this.remote = remote; this.id = ++uniqueId; // The "end" event follows ReadableStream.prototype.push(null). @@ -84,81 +75,65 @@ InternalSocket.prototype._write = function (data, encoding, done) { // Node v10 requires writev to be set on the handler because, while // WritableStream expects _writev, internal/stream_base_commons.js calls // req.handle.writev directly. It's given a flat array of data+type pairs. -if (NODE_10_AND_LATER) - InternalSocket.prototype.writev = function (_req, data) { - for (var i = 0; i < data.length; ++i) this._write(data[i], data[++i], noop); - return NO_ERROR; - }; - -// NOTE: Node v0.10 expects InternalSocket to return write request objects with -// a "oncomplete" and "cb" property. Node v0.11 expects it return an error -// instead. Node v10 expects it to return an error code. - -// InternalSocket.prototype.writeBinaryString was introduced in Node v0.11.14. -InternalSocket.prototype.writeBinaryString = function (_req, data) { - this.write(data, "binary"); - if (NODE_10_AND_LATER) return NO_ERROR; +InternalSocket.prototype.writev = function (_req, data) { + for (var i = 0; i < data.length; ++i) this._write(data[i], data[++i], noop); + return NO_ERROR; }; // InternalSocket.prototype.writeLatin1String was introduced in Node v6.4. InternalSocket.prototype.writeLatin1String = function (_req, data) { this.write(data, "latin1"); - if (NODE_10_AND_LATER) return NO_ERROR; + return NO_ERROR; }; InternalSocket.prototype.writeBuffer = function (req, data) { /* eslint consistent-return: 0 */ - this.write(NODE_0_10 ? req : data); - if (NODE_0_10) return {}; - else if (NODE_10_AND_LATER) return NO_ERROR; + this.write(data); + return NO_ERROR; }; InternalSocket.prototype.writeUtf8String = function (req, data) { /* eslint consistent-return: 0 */ - this.write(NODE_0_10 ? req : data, "utf8"); - if (NODE_0_10) return {}; - else if (NODE_10_AND_LATER) return NO_ERROR; + this.write(data, "utf8"); + return NO_ERROR; }; InternalSocket.prototype.writeAsciiString = function (req, data) { /* eslint consistent-return: 0 */ - this.write(NODE_0_10 ? req : data, "ascii"); - if (NODE_0_10) return {}; - else if (NODE_10_AND_LATER) return NO_ERROR; + this.write(data, "ascii"); + return NO_ERROR; }; InternalSocket.prototype.writeUcs2String = function (req, data) { /* eslint consistent-return: 0 */ - this.write(NODE_0_10 ? req : data, "ucs2"); - if (NODE_0_10) return {}; - else if (NODE_10_AND_LATER) return NO_ERROR; + this.write(data, "ucs2"); + return NO_ERROR; }; // While it seems to have existed since Node v0.10, Node v11.2 requires // "shutdown". AFAICT, "shutdown" is for shutting the writable side down and // hence the use of WritableStream.prototype.end and waiting for the "finish" // event. -if (NODE_11_2_AND_LATER || NODE_10_15_1_AND_MAJOR) - InternalSocket.prototype.shutdown = function (req) { - this.once("finish", req.oncomplete.bind(req, NO_ERROR, req.handle)); - this.end(); - - // Note v11.8 requires "shutdown" to return an error value, with "1" - // indicating a "synchronous finish" (as per Node's net.js) and "0" - // presumably success. - return 0; - }; +InternalSocket.prototype.shutdown = function (req) { + this.once("finish", req.oncomplete.bind(req, NO_ERROR, req.handle)); + this.end(); + + // Note v11.8 requires "shutdown" to return an error value, with "1" + // indicating a "synchronous finish" (as per Node's net.js) and "0" + // presumably success. + return 0; +}; // I'm unsure of the relationship between InternalSocket.prototype.shutdown and // InternalSocket.prototype.close. InternalSocket.prototype.close = function (done) { - if (!this._writableState.finished) this.end(done); - else if (done) done(); -}; + if (!this._writableState.finished) { + this.end(done); + return; + } -// Node v0.10 will use writeQueueSize to see if it should set write request's -// "cb" property or write more immediately. -if (NODE_0_10) InternalSocket.prototype.writeQueueSize = 0; + if (done) done(); +}; function pair() { var a = Object.create(InternalSocket.prototype); @@ -167,9 +142,6 @@ function pair() { } function readData(data) { - if (NODE_0_10) return void this.onread(data, 0, data.length); - if (!NODE_11_1_AND_LATER) return void this.onread(data.length, data); - // A system written not in 1960 that passes arguments to functions through // _global_ mutable data structures… STREAM_STATE[STREAM_BYTES_READ] = data.length; @@ -177,14 +149,6 @@ function readData(data) { } function readEof() { - if (this.onread == null) return; - if (NODE_0_10) { - process._errno = "EOF"; - this.onread(null, 0, 0); - return; - } - if (!NODE_11_1_AND_LATER) return void this.onread(UV_EOF); - STREAM_STATE[STREAM_BYTES_READ] = UV_EOF; this.onread(); } diff --git a/lib/tls_socket.js b/lib/tls_socket.js index eaa2f87..4052ee6 100644 --- a/lib/tls_socket.js +++ b/lib/tls_socket.js @@ -7,8 +7,7 @@ function TlsSocket() { Socket.apply(this, arguments); } -// Node v0.10 has no TLSSocket and uses a private ClearTextStream instance. -TlsSocket.prototype = Object.create((Tls.TLSSocket || Net.Socket).prototype, { +TlsSocket.prototype = Object.create(Tls.TLSSocket.prototype, { constructor: { value: TlsSocket, configurable: true, writeable: true }, }); @@ -18,10 +17,3 @@ Object.keys(Socket.prototype).forEach(function (key) { TlsSocket.prototype.encrypted = true; TlsSocket.prototype.authorized = true; - -// Iojs v3 HTTPS/SSL implementation depends on a session. -// Not sure whether returning null breaks anything. -// https://github.com/nodejs/node/blob/291b310e219023c4d93b216b1081ef47386f8750/lib/_tls_wrap.js#L607 -TlsSocket.prototype.getSession = function () { - return null; -}; diff --git a/test/index_test.js b/test/index_test.js index 0801ecd..49d885d 100644 --- a/test/index_test.js +++ b/test/index_test.js @@ -4,14 +4,12 @@ var Net = require("net"); var Tls = require("tls"); var Http = require("http"); var Https = require("https"); -var Semver = require("semver"); var Transform = require("stream").Transform; var IncomingMessage = Http.IncomingMessage; var ServerResponse = Http.ServerResponse; var ClientRequest = Http.ClientRequest; var EventEmitter = require("events").EventEmitter; var Mitm = require(".."); -var NODE_0_10 = Semver.satisfies(process.version, ">= 0.10 < 0.11"); var newBuffer = Buffer.from || function (d, enc) { @@ -217,11 +215,10 @@ describe("Mitm", function () { mustConnect(Net); - if (!NODE_0_10) - it("must not return an instance of Tls.TLSSocket", function () { - var client = Net.connect({ host: "foo", port: 80 }); - client.must.not.be.an.instanceof(Tls.TLSSocket); - }); + it("must not return an instance of Tls.TLSSocket", function () { + var client = Net.connect({ host: "foo", port: 80 }); + client.must.not.be.an.instanceof(Tls.TLSSocket); + }); it("must not set the encrypted property", function () { Net.connect({ host: "foo" }).must.not.have.property("encrypted"); @@ -330,23 +327,20 @@ describe("Mitm", function () { process.nextTick(done); }); - // Writing latin1 strings was introduced in v6.4. - // https://github.com/nodejs/node/commit/28071a130e2137bd14d0762a25f0ad83b7a28259 - if (Semver.satisfies(process.version, ">= 6.4")) - it("must write to server from client given latin1", function (done) { - var server; - this.mitm.on("connection", function (s) { - server = s; - }); - var client = Net.connect({ host: "foo" }); - client.write("Hello", "latin1"); + it("must write to server from client given latin1", function (done) { + var server; + this.mitm.on("connection", function (s) { + server = s; + }); + var client = Net.connect({ host: "foo" }); + client.write("Hello", "latin1"); - server.setEncoding("latin1"); - process.nextTick(function () { - server.read().must.equal("Hello"); - }); - process.nextTick(done); + server.setEncoding("latin1"); + process.nextTick(function () { + server.read().must.equal("Hello"); }); + process.nextTick(done); + }); it("must write to server from client given a buffer", function (done) { var server; @@ -509,22 +503,19 @@ describe("Mitm", function () { mustConnect(Tls); - if (!NODE_0_10) - it("must return an instance of Tls.TLSSocket", function () { - Tls.connect({ host: "foo", port: 80 }).must.be.an.instanceof( - Tls.TLSSocket - ); - }); + it("must return an instance of Tls.TLSSocket", function () { + Tls.connect({ host: "foo", port: 80 }).must.be.an.instanceof( + Tls.TLSSocket + ); + }); - if (!NODE_0_10) - it("must return an instance of Tls.TLSSocket given port", function () { - Tls.connect(80).must.be.an.instanceof(Tls.TLSSocket); - }); + it("must return an instance of Tls.TLSSocket given port", function () { + Tls.connect(80).must.be.an.instanceof(Tls.TLSSocket); + }); - if (!NODE_0_10) - it("must return an instance of Tls.TLSSocket given port and host", function () { - Tls.connect(80, "10.0.0.1").must.be.an.instanceof(Tls.TLSSocket); - }); + it("must return an instance of Tls.TLSSocket given port and host", function () { + Tls.connect(80, "10.0.0.1").must.be.an.instanceof(Tls.TLSSocket); + }); it("must emit secureConnect in next ticks", function (done) { var socket = Tls.connect({ host: "foo" }); From 6beb1677cce8282ce85a5cb6baf5b52553088e4c Mon Sep 17 00:00:00 2001 From: Gregor Martynus <39992+gr2m@users.noreply.github.com> Date: Fri, 3 Dec 2021 23:33:42 -0800 Subject: [PATCH 17/59] test: 100% test coverage --- lib/internal_socket.js | 1 + 1 file changed, 1 insertion(+) diff --git a/lib/internal_socket.js b/lib/internal_socket.js index d51a745..2a8056f 100644 --- a/lib/internal_socket.js +++ b/lib/internal_socket.js @@ -132,6 +132,7 @@ InternalSocket.prototype.close = function (done) { return; } + /* istanbul ignore next */ if (done) done(); }; From 3b17b70c04876d6066ba25f98c2e0deaa3fa033a Mon Sep 17 00:00:00 2001 From: Gregor Martynus <39992+gr2m@users.noreply.github.com> Date: Fri, 3 Dec 2021 23:34:27 -0800 Subject: [PATCH 18/59] fix(deps): -`semver` --- package.json | 1 - 1 file changed, 1 deletion(-) diff --git a/package.json b/package.json index 24d7d66..cfa9ad3 100644 --- a/package.json +++ b/package.json @@ -39,7 +39,6 @@ "test": "nyc mocha" }, "dependencies": { - "semver": ">= 5 < 6", "underscore": ">= 1.1.6 < 1.14" }, "devDependencies": { From a38070108aeb9385ce17c3784be751a6fc7ff082 Mon Sep 17 00:00:00 2001 From: Gregor Martynus <39992+gr2m@users.noreply.github.com> Date: Fri, 3 Dec 2021 23:51:52 -0800 Subject: [PATCH 19/59] fix(deps): -`underscore` --- package.json | 3 --- 1 file changed, 3 deletions(-) diff --git a/package.json b/package.json index cfa9ad3..e3834dc 100644 --- a/package.json +++ b/package.json @@ -38,9 +38,6 @@ "lint:fix": "prettier --write \"{lib,test}/**/*.{js,json,ts}\" \"*.{js,json,md}\"", "test": "nyc mocha" }, - "dependencies": { - "underscore": ">= 1.1.6 < 1.14" - }, "devDependencies": { "mocha": ">= 1.12.0 < 3", "must": ">= 0.13 < 0.14", From 8917a242f7ac2b17cd95d9d286fa3581d139c04c Mon Sep 17 00:00:00 2001 From: Gregor Martynus <39992+gr2m@users.noreply.github.com> Date: Fri, 3 Dec 2021 23:54:57 -0800 Subject: [PATCH 20/59] build(package): lock file --- package-lock.json | 29 +---------------------------- 1 file changed, 1 insertion(+), 28 deletions(-) diff --git a/package-lock.json b/package-lock.json index f921537..3963174 100644 --- a/package-lock.json +++ b/package-lock.json @@ -7,10 +7,6 @@ "": { "name": "mitm", "version": "1.7.2", - "dependencies": { - "semver": ">= 5 < 6", - "underscore": ">= 1.1.6 < 1.14" - }, "devDependencies": { "mocha": ">= 1.12.0 < 3", "must": ">= 0.13 < 0.14", @@ -19,7 +15,7 @@ "sinon": ">= 1.9 < 2" }, "engines": { - "node": ">= 0.10.24" + "node": ">= 14" } }, "node_modules/@babel/code-frame": { @@ -2213,14 +2209,6 @@ "deprecated": "This package has been deprecated in favour of @sinonjs/samsam", "dev": true }, - "node_modules/semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "bin": { - "semver": "bin/semver" - } - }, "node_modules/set-blocking": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", @@ -2489,11 +2477,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/underscore": { - "version": "1.13.1", - "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.13.1.tgz", - "integrity": "sha512-hzSoAVtJF+3ZtiFX0VgfFPHEDRm7Y/QPjGyNo4TVdnDTdft3tr8hEkD25a1jC+TjTuE7tkHGKkhwCgs9dgBB2g==" - }, "node_modules/util": { "version": "0.12.4", "resolved": "https://registry.npmjs.org/util/-/util-0.12.4.tgz", @@ -4321,11 +4304,6 @@ "integrity": "sha1-vsEf3IOp/aBjQBIQ5AF2wwJNFWc=", "dev": true }, - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" - }, "set-blocking": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", @@ -4535,11 +4513,6 @@ "which-boxed-primitive": "^1.0.2" } }, - "underscore": { - "version": "1.13.1", - "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.13.1.tgz", - "integrity": "sha512-hzSoAVtJF+3ZtiFX0VgfFPHEDRm7Y/QPjGyNo4TVdnDTdft3tr8hEkD25a1jC+TjTuE7tkHGKkhwCgs9dgBB2g==" - }, "util": { "version": "0.12.4", "resolved": "https://registry.npmjs.org/util/-/util-0.12.4.tgz", From 71ce3c636eb6ad66b2f8fdfe57ce103dc1e9678c Mon Sep 17 00:00:00 2001 From: Gregor Martynus <39992+gr2m@users.noreply.github.com> Date: Fri, 3 Dec 2021 23:55:10 -0800 Subject: [PATCH 21/59] refactor: remove usage of `underscore` --- index.js | 33 +++++++++++++++------------------ test/index_test.js | 13 +++++++++---- 2 files changed, 24 insertions(+), 22 deletions(-) diff --git a/index.js b/index.js index 7b7a96c..45eb7bc 100644 --- a/index.js +++ b/index.js @@ -1,4 +1,3 @@ -var _ = require("underscore"); var Net = require("net"); var Tls = require("tls"); var Http = require("http"); @@ -50,11 +49,12 @@ Mitm.prototype.enable = function () { // ClientRequest.prototype.onSocket is called synchronously from // ClientRequest's constructor and is a convenient place to hook into new // ClientRequests. - this.stubs.stub( - ClientRequest.prototype, - "onSocket", - _.compose(ClientRequest.prototype.onSocket, this.request.bind(this)) - ); + const origOnSocket = ClientRequest.prototype.onSocket; + const self = this; + this.stubs.stub(ClientRequest.prototype, "onSocket", function (socket) { + origOnSocket.call(this, socket); + self.request(socket); + }); return this; }; @@ -69,18 +69,15 @@ Mitm.prototype.connect = function connect(orig, Socket, opts, done) { // Don't set client.connecting to false because there's nothing setting it // back to false later. Originally that was done in Socket.prototype.connect // and its afterConnect handler, but we're not calling that. - var client = new Socket( - _.defaults( - { - handle: sockets[0], - - // Node v10 expects readable and writable to be set at Socket creation time. - readable: true, - writable: true, - }, - opts - ) - ); + var client = new Socket({ + handle: sockets[0], + + // Node v10 expects readable and writable to be set at Socket creation time. + readable: true, + writable: true, + + ...opts, + }); this.emit("connect", client, opts); if (client.bypassed) return orig.call(this, opts, done); diff --git a/test/index_test.js b/test/index_test.js index 49d885d..9e5c6ad 100644 --- a/test/index_test.js +++ b/test/index_test.js @@ -1,4 +1,3 @@ -var _ = require("underscore"); var Sinon = require("sinon"); var Net = require("net"); var Tls = require("tls"); @@ -614,10 +613,16 @@ describe("Mitm", function () { }); it("must emit request on Mitm after multiple requests", function (done) { + let counter = 0; request({ host: "foo" }).end(); request({ host: "foo" }).end(); request({ host: "foo" }).end(); - this.mitm.on("request", _.after(3, done.bind(null, null))); + this.mitm.on("request", () => { + counter++; + if (counter === 3) { + done(); + } + }); }); it("must emit socket on request in next ticks", function (done) { @@ -701,7 +706,7 @@ describe("Mitm", function () { }); mustRequest(function (opts) { - return Http.request(_.extend({ agent: new Http.Agent() }, opts)); + return Http.request({ agent: new Http.Agent(), ...opts }); }); it("must support keep-alive", function (done) { @@ -735,7 +740,7 @@ describe("Mitm", function () { }); mustRequest(function (opts) { - return Https.request(_.extend({ agent: new Https.Agent() }, opts)); + return Https.request({ agent: new Https.Agent(), ...opts }); }); }); From 9ccf2c6370b15142da6ef6ea75978ac66b11f998 Mon Sep 17 00:00:00 2001 From: Gregor Martynus <39992+gr2m@users.noreply.github.com> Date: Sat, 4 Dec 2021 00:54:46 -0800 Subject: [PATCH 22/59] build(deps): -`mocha`, +`uvu` --- package.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index e3834dc..0daf48b 100644 --- a/package.json +++ b/package.json @@ -39,11 +39,11 @@ "test": "nyc mocha" }, "devDependencies": { - "mocha": ">= 1.12.0 < 3", "must": ">= 0.13 < 0.14", "nyc": "^15.1.0", "prettier": "^2.5.0", - "sinon": ">= 1.9 < 2" + "sinon": ">= 1.9 < 2", + "uvu": "^0.5.2" }, "engines": { "node": ">= 14" From 6748bce402de892f666ad4b49eb448f5848d9f25 Mon Sep 17 00:00:00 2001 From: Gregor Martynus <39992+gr2m@users.noreply.github.com> Date: Sat, 4 Dec 2021 00:58:02 -0800 Subject: [PATCH 23/59] build(deps): -`mocha`, +`uvu` --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 0daf48b..66f6449 100644 --- a/package.json +++ b/package.json @@ -36,7 +36,7 @@ "coverage": "nyc report --reporter html && open coverage/index.html", "lint": "prettier --check \"{lib,test}/**/*.{js,json,ts}\" \"*.{js,json,md}\"", "lint:fix": "prettier --write \"{lib,test}/**/*.{js,json,ts}\" \"*.{js,json,md}\"", - "test": "nyc mocha" + "test": "nyc uvu" }, "devDependencies": { "must": ">= 0.13 < 0.14", From 4bcc494e88ce8942b7cb60844719512769f87ef3 Mon Sep 17 00:00:00 2001 From: Gregor Martynus <39992+gr2m@users.noreply.github.com> Date: Sat, 4 Dec 2021 00:58:04 -0800 Subject: [PATCH 24/59] build(package): lock file --- package-lock.json | 427 +++++++++++++--------------------------------- 1 file changed, 117 insertions(+), 310 deletions(-) diff --git a/package-lock.json b/package-lock.json index 3963174..3772259 100644 --- a/package-lock.json +++ b/package-lock.json @@ -8,11 +8,11 @@ "name": "mitm", "version": "1.7.2", "devDependencies": { - "mocha": ">= 1.12.0 < 3", "must": ">= 0.13 < 0.14", "nyc": "^15.1.0", "prettier": "^2.5.0", - "sinon": ">= 1.9 < 2" + "sinon": ">= 1.9 < 2", + "uvu": "^0.5.2" }, "engines": { "node": ">= 14" @@ -656,15 +656,6 @@ "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", "dev": true }, - "node_modules/commander": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.3.0.tgz", - "integrity": "sha1-/UMOiJgy7DU7ms0d4hfBHLPu+HM=", - "dev": true, - "engines": { - "node": ">= 0.6.x" - } - }, "node_modules/commondir": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", @@ -706,15 +697,6 @@ "node": ">= 8" } }, - "node_modules/debug": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.2.0.tgz", - "integrity": "sha1-+HBX6ZWxofauaklgZkE3vFbwOdo=", - "dev": true, - "dependencies": { - "ms": "0.7.1" - } - }, "node_modules/decamelize": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", @@ -748,13 +730,13 @@ "node": ">= 0.4" } }, - "node_modules/diff": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/diff/-/diff-1.4.0.tgz", - "integrity": "sha1-fyjS657nsVqX79ic5j3P2qPMur8=", + "node_modules/dequal": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.2.tgz", + "integrity": "sha512-q9K8BlJVxK7hQYqa6XISGmBZbtQQWVXSrRrWreHC94rMt1QL/Impruc+7p2CYSYuVIUr+YCt6hjrs1kkdJRTug==", "dev": true, "engines": { - "node": ">=0.3.1" + "node": ">=6" } }, "node_modules/egal": { @@ -844,15 +826,6 @@ "node": ">=6" } }, - "node_modules/escape-string-regexp": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.2.tgz", - "integrity": "sha1-Tbwv5nTnGUnK8/smlc5/LcHZqNE=", - "dev": true, - "engines": { - "node": ">=0.8.0" - } - }, "node_modules/esprima": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", @@ -1014,19 +987,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/glob": { - "version": "3.2.11", - "resolved": "https://registry.npmjs.org/glob/-/glob-3.2.11.tgz", - "integrity": "sha1-Spc/Y1uRkPcV0QmH1cAP0oFevj0=", - "dev": true, - "dependencies": { - "inherits": "2", - "minimatch": "0.3" - }, - "engines": { - "node": "*" - } - }, "node_modules/globals": { "version": "11.12.0", "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", @@ -1042,12 +1002,6 @@ "integrity": "sha512-qkIilPUYcNhJpd33n0GBXTB1MMPp14TxEsEs0pTrsSVucApsYzW5V+Q8Qxhik6KU3evy+qkAAowTByymK0avdg==", "dev": true }, - "node_modules/growl": { - "version": "1.9.2", - "resolved": "https://registry.npmjs.org/growl/-/growl-1.9.2.tgz", - "integrity": "sha1-Dqd0NxXbjY3ixe3hd14bRayFwC8=", - "dev": true - }, "node_modules/has": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", @@ -1573,39 +1527,6 @@ "node": ">=8" } }, - "node_modules/jade": { - "version": "0.26.3", - "resolved": "https://registry.npmjs.org/jade/-/jade-0.26.3.tgz", - "integrity": "sha1-jxDXl32NefL2/4YqgbBRPMslaGw=", - "deprecated": "Jade has been renamed to pug, please install the latest version of pug instead of jade", - "dev": true, - "dependencies": { - "commander": "0.6.1", - "mkdirp": "0.3.0" - }, - "bin": { - "jade": "bin/jade" - } - }, - "node_modules/jade/node_modules/commander": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-0.6.1.tgz", - "integrity": "sha1-+mihT2qUXVTbvlDYzbMyDp47GgY=", - "dev": true, - "engines": { - "node": ">= 0.4.x" - } - }, - "node_modules/jade/node_modules/mkdirp": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.3.0.tgz", - "integrity": "sha1-G79asbqCevI1dRQ0kEJkVfSB/h4=", - "deprecated": "Legacy versions of mkdirp are no longer supported. Please update to mkdirp 1.x. (Note that the API surface has changed to use Promises in 1.x.)", - "dev": true, - "engines": { - "node": "*" - } - }, "node_modules/js-tokens": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", @@ -1670,6 +1591,15 @@ "integrity": "sha1-wzW69gOnfMN/i0Brc7ZGP9vfGr4=", "dev": true }, + "node_modules/kleur": { + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/kleur/-/kleur-4.1.4.tgz", + "integrity": "sha512-8QADVssbrFjivHWQU7KkMgptGTl6WAcSdlbBPY4uNF+mWr6DGcKrvY2w4FQJoXch7+fKMjj0dRrL75vk3k23OA==", + "dev": true, + "engines": { + "node": ">=6" + } + }, "node_modules/locate-path": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", @@ -1718,12 +1648,6 @@ "integrity": "sha1-fD2mL/yzDw9agKJWbKJORdigHzE=", "dev": true }, - "node_modules/lru-cache": { - "version": "2.7.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-2.7.3.tgz", - "integrity": "sha1-bUUk6LlV+V1PW1iFHOId1y+06VI=", - "dev": true - }, "node_modules/make-dir": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", @@ -1748,70 +1672,15 @@ "semver": "bin/semver.js" } }, - "node_modules/minimatch": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-0.3.0.tgz", - "integrity": "sha1-J12O2qxPG7MyZHIInnlJyDlGmd0=", - "deprecated": "Please update to minimatch 3.0.2 or higher to avoid a RegExp DoS issue", + "node_modules/mri": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/mri/-/mri-1.2.0.tgz", + "integrity": "sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==", "dev": true, - "dependencies": { - "lru-cache": "2", - "sigmund": "~1.0.0" - }, "engines": { - "node": "*" - } - }, - "node_modules/minimist": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", - "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", - "dev": true - }, - "node_modules/mkdirp": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", - "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", - "deprecated": "Legacy versions of mkdirp are no longer supported. Please update to mkdirp 1.x. (Note that the API surface has changed to use Promises in 1.x.)", - "dev": true, - "dependencies": { - "minimist": "0.0.8" - }, - "bin": { - "mkdirp": "bin/cmd.js" - } - }, - "node_modules/mocha": { - "version": "2.5.3", - "resolved": "https://registry.npmjs.org/mocha/-/mocha-2.5.3.tgz", - "integrity": "sha1-FhvlvetJZ3HrmzV0UFC2IrWu/Fg=", - "dev": true, - "dependencies": { - "commander": "2.3.0", - "debug": "2.2.0", - "diff": "1.4.0", - "escape-string-regexp": "1.0.2", - "glob": "3.2.11", - "growl": "1.9.2", - "jade": "0.26.3", - "mkdirp": "0.5.1", - "supports-color": "1.2.0", - "to-iso-string": "0.0.2" - }, - "bin": { - "_mocha": "bin/_mocha", - "mocha": "bin/mocha" - }, - "engines": { - "node": ">= 0.8.x" + "node": ">=4" } }, - "node_modules/ms": { - "version": "0.7.1", - "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.1.tgz", - "integrity": "sha1-nNE8A62/8ltl7/3nzoZO6VIBcJg=", - "dev": true - }, "node_modules/must": { "version": "0.13.4", "resolved": "https://registry.npmjs.org/must/-/must-0.13.4.tgz", @@ -2182,6 +2051,18 @@ "node": "*" } }, + "node_modules/sade": { + "version": "1.7.4", + "resolved": "https://registry.npmjs.org/sade/-/sade-1.7.4.tgz", + "integrity": "sha512-y5yauMD93rX840MwUJr7C1ysLFBgMspsdTo4UVrDg3fXDvtwOyIqykhVAAm6fk/3au77773itJStObgK+LKaiA==", + "dev": true, + "dependencies": { + "mri": "^1.1.0" + }, + "engines": { + "node": ">= 6" + } + }, "node_modules/safe-buffer": { "version": "5.2.1", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", @@ -2250,12 +2131,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/sigmund": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/sigmund/-/sigmund-1.0.1.tgz", - "integrity": "sha1-P/IfGYytIXX587eBhT/ZTQ0ZtZA=", - "dev": true - }, "node_modules/signal-exit": { "version": "3.0.6", "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.6.tgz", @@ -2370,18 +2245,6 @@ "node": ">=8" } }, - "node_modules/supports-color": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-1.2.0.tgz", - "integrity": "sha1-/x7R5hFp0Gs88tWI4YixjYhH4X4=", - "dev": true, - "bin": { - "supports-color": "cli.js" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/test-exclude": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", @@ -2437,12 +2300,14 @@ "node": ">=4" } }, - "node_modules/to-iso-string": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/to-iso-string/-/to-iso-string-0.0.2.tgz", - "integrity": "sha1-TcGeZk38y+Jb2NtQiwDG2hWCVdE=", - "deprecated": "to-iso-string has been deprecated, use @segment/to-iso-string instead.", - "dev": true + "node_modules/totalist": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/totalist/-/totalist-2.0.0.tgz", + "integrity": "sha512-+Y17F0YzxfACxTyjfhnJQEe7afPA0GSpYlFkl2VFMxYP7jshQf9gXV7cH47EfToBumFThfKBvfAcoUn6fdNeRQ==", + "dev": true, + "engines": { + "node": ">=6" + } }, "node_modules/type-fest": { "version": "0.8.1", @@ -2501,6 +2366,34 @@ "uuid": "bin/uuid" } }, + "node_modules/uvu": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/uvu/-/uvu-0.5.2.tgz", + "integrity": "sha512-m2hLe7I2eROhh+tm3WE5cTo/Cv3WQA7Oc9f7JB6uWv+/zVKvfAm53bMyOoGOSZeQ7Ov2Fu9pLhFr7p07bnT20w==", + "dev": true, + "dependencies": { + "dequal": "^2.0.0", + "diff": "^5.0.0", + "kleur": "^4.0.3", + "sade": "^1.7.3", + "totalist": "^2.0.0" + }, + "bin": { + "uvu": "bin.js" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/uvu/node_modules/diff": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-5.0.0.tgz", + "integrity": "sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w==", + "dev": true, + "engines": { + "node": ">=0.3.1" + } + }, "node_modules/which": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", @@ -3152,12 +3045,6 @@ "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", "dev": true }, - "commander": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.3.0.tgz", - "integrity": "sha1-/UMOiJgy7DU7ms0d4hfBHLPu+HM=", - "dev": true - }, "commondir": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", @@ -3198,15 +3085,6 @@ "which": "^2.0.1" } }, - "debug": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.2.0.tgz", - "integrity": "sha1-+HBX6ZWxofauaklgZkE3vFbwOdo=", - "dev": true, - "requires": { - "ms": "0.7.1" - } - }, "decamelize": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", @@ -3231,10 +3109,10 @@ "object-keys": "^1.0.12" } }, - "diff": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/diff/-/diff-1.4.0.tgz", - "integrity": "sha1-fyjS657nsVqX79ic5j3P2qPMur8=", + "dequal": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.2.tgz", + "integrity": "sha512-q9K8BlJVxK7hQYqa6XISGmBZbtQQWVXSrRrWreHC94rMt1QL/Impruc+7p2CYSYuVIUr+YCt6hjrs1kkdJRTug==", "dev": true }, "egal": { @@ -3309,12 +3187,6 @@ "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", "dev": true }, - "escape-string-regexp": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.2.tgz", - "integrity": "sha1-Tbwv5nTnGUnK8/smlc5/LcHZqNE=", - "dev": true - }, "esprima": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", @@ -3424,16 +3296,6 @@ "get-intrinsic": "^1.1.1" } }, - "glob": { - "version": "3.2.11", - "resolved": "https://registry.npmjs.org/glob/-/glob-3.2.11.tgz", - "integrity": "sha1-Spc/Y1uRkPcV0QmH1cAP0oFevj0=", - "dev": true, - "requires": { - "inherits": "2", - "minimatch": "0.3" - } - }, "globals": { "version": "11.12.0", "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", @@ -3446,12 +3308,6 @@ "integrity": "sha512-qkIilPUYcNhJpd33n0GBXTB1MMPp14TxEsEs0pTrsSVucApsYzW5V+Q8Qxhik6KU3evy+qkAAowTByymK0avdg==", "dev": true }, - "growl": { - "version": "1.9.2", - "resolved": "https://registry.npmjs.org/growl/-/growl-1.9.2.tgz", - "integrity": "sha1-Dqd0NxXbjY3ixe3hd14bRayFwC8=", - "dev": true - }, "has": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", @@ -3819,30 +3675,6 @@ "istanbul-lib-report": "^3.0.0" } }, - "jade": { - "version": "0.26.3", - "resolved": "https://registry.npmjs.org/jade/-/jade-0.26.3.tgz", - "integrity": "sha1-jxDXl32NefL2/4YqgbBRPMslaGw=", - "dev": true, - "requires": { - "commander": "0.6.1", - "mkdirp": "0.3.0" - }, - "dependencies": { - "commander": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-0.6.1.tgz", - "integrity": "sha1-+mihT2qUXVTbvlDYzbMyDp47GgY=", - "dev": true - }, - "mkdirp": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.3.0.tgz", - "integrity": "sha1-G79asbqCevI1dRQ0kEJkVfSB/h4=", - "dev": true - } - } - }, "js-tokens": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", @@ -3894,6 +3726,12 @@ "integrity": "sha1-wzW69gOnfMN/i0Brc7ZGP9vfGr4=", "dev": true }, + "kleur": { + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/kleur/-/kleur-4.1.4.tgz", + "integrity": "sha512-8QADVssbrFjivHWQU7KkMgptGTl6WAcSdlbBPY4uNF+mWr6DGcKrvY2w4FQJoXch7+fKMjj0dRrL75vk3k23OA==", + "dev": true + }, "locate-path": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", @@ -3939,12 +3777,6 @@ "integrity": "sha1-fD2mL/yzDw9agKJWbKJORdigHzE=", "dev": true }, - "lru-cache": { - "version": "2.7.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-2.7.3.tgz", - "integrity": "sha1-bUUk6LlV+V1PW1iFHOId1y+06VI=", - "dev": true - }, "make-dir": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", @@ -3962,53 +3794,10 @@ } } }, - "minimatch": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-0.3.0.tgz", - "integrity": "sha1-J12O2qxPG7MyZHIInnlJyDlGmd0=", - "dev": true, - "requires": { - "lru-cache": "2", - "sigmund": "~1.0.0" - } - }, - "minimist": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", - "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", - "dev": true - }, - "mkdirp": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", - "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", - "dev": true, - "requires": { - "minimist": "0.0.8" - } - }, - "mocha": { - "version": "2.5.3", - "resolved": "https://registry.npmjs.org/mocha/-/mocha-2.5.3.tgz", - "integrity": "sha1-FhvlvetJZ3HrmzV0UFC2IrWu/Fg=", - "dev": true, - "requires": { - "commander": "2.3.0", - "debug": "2.2.0", - "diff": "1.4.0", - "escape-string-regexp": "1.0.2", - "glob": "3.2.11", - "growl": "1.9.2", - "jade": "0.26.3", - "mkdirp": "0.5.1", - "supports-color": "1.2.0", - "to-iso-string": "0.0.2" - } - }, - "ms": { - "version": "0.7.1", - "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.1.tgz", - "integrity": "sha1-nNE8A62/8ltl7/3nzoZO6VIBcJg=", + "mri": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/mri/-/mri-1.2.0.tgz", + "integrity": "sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==", "dev": true }, "must": { @@ -4292,6 +4081,15 @@ } } }, + "sade": { + "version": "1.7.4", + "resolved": "https://registry.npmjs.org/sade/-/sade-1.7.4.tgz", + "integrity": "sha512-y5yauMD93rX840MwUJr7C1ysLFBgMspsdTo4UVrDg3fXDvtwOyIqykhVAAm6fk/3au77773itJStObgK+LKaiA==", + "dev": true, + "requires": { + "mri": "^1.1.0" + } + }, "safe-buffer": { "version": "5.2.1", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", @@ -4336,12 +4134,6 @@ "object-inspect": "^1.9.0" } }, - "sigmund": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/sigmund/-/sigmund-1.0.1.tgz", - "integrity": "sha1-P/IfGYytIXX587eBhT/ZTQ0ZtZA=", - "dev": true - }, "signal-exit": { "version": "3.0.6", "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.6.tgz", @@ -4432,12 +4224,6 @@ "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", "dev": true }, - "supports-color": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-1.2.0.tgz", - "integrity": "sha1-/x7R5hFp0Gs88tWI4YixjYhH4X4=", - "dev": true - }, "test-exclude": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", @@ -4480,10 +4266,10 @@ "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", "dev": true }, - "to-iso-string": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/to-iso-string/-/to-iso-string-0.0.2.tgz", - "integrity": "sha1-TcGeZk38y+Jb2NtQiwDG2hWCVdE=", + "totalist": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/totalist/-/totalist-2.0.0.tgz", + "integrity": "sha512-+Y17F0YzxfACxTyjfhnJQEe7afPA0GSpYlFkl2VFMxYP7jshQf9gXV7cH47EfToBumFThfKBvfAcoUn6fdNeRQ==", "dev": true }, "type-fest": { @@ -4533,6 +4319,27 @@ "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", "dev": true }, + "uvu": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/uvu/-/uvu-0.5.2.tgz", + "integrity": "sha512-m2hLe7I2eROhh+tm3WE5cTo/Cv3WQA7Oc9f7JB6uWv+/zVKvfAm53bMyOoGOSZeQ7Ov2Fu9pLhFr7p07bnT20w==", + "dev": true, + "requires": { + "dequal": "^2.0.0", + "diff": "^5.0.0", + "kleur": "^4.0.3", + "sade": "^1.7.3", + "totalist": "^2.0.0" + }, + "dependencies": { + "diff": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-5.0.0.tgz", + "integrity": "sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w==", + "dev": true + } + } + }, "which": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", From 33bf6c63bc86b40ab6de80208c1bfc7eff64d739 Mon Sep 17 00:00:00 2001 From: Gregor Martynus <39992+gr2m@users.noreply.github.com> Date: Sat, 4 Dec 2021 00:58:26 -0800 Subject: [PATCH 25/59] refactor: replace `mocha with uvu --- test/index_test.js | 1419 ++++++++++++++++++++++---------------------- 1 file changed, 699 insertions(+), 720 deletions(-) diff --git a/test/index_test.js b/test/index_test.js index 9e5c6ad..fc80d63 100644 --- a/test/index_test.js +++ b/test/index_test.js @@ -1,896 +1,875 @@ -var Sinon = require("sinon"); var Net = require("net"); var Tls = require("tls"); var Http = require("http"); var Https = require("https"); var Transform = require("stream").Transform; +var EventEmitter = require("events").EventEmitter; + +var Sinon = require("sinon"); +var { suite } = require("uvu"); +require("must/register"); + var IncomingMessage = Http.IncomingMessage; var ServerResponse = Http.ServerResponse; var ClientRequest = Http.ClientRequest; -var EventEmitter = require("events").EventEmitter; + var Mitm = require(".."); + var newBuffer = Buffer.from || function (d, enc) { return new Buffer(d, enc); }; -describe("Mitm", function () { - beforeEach(function () { - Mitm.passthrough = false; - }); +const test = suite("Mitm"); +let mitm; +let sinon; - it("must return an instance of Mitm when called as a function", function () { - var mitm = Mitm(); - mitm.must.be.an.instanceof(Mitm); - mitm.disable(); +test.before.each(() => { + Mitm.passthrough = false; + mitm = Mitm(); + sinon = Sinon.sandbox.create(); +}); +test.after.each(() => { + mitm.disable(); + sinon.restore(); +}); + +test("must return an instance of Mitm when called as a function", () => { + mitm.must.be.an.instanceof(Mitm); +}); + +function mustConnect(moduleName, module) { + test(`${moduleName}: must return an instance of Net.Socket`, () => { + var socket = module.connect({ host: "foo", port: 80 }); + socket.must.be.an.instanceof(Net.Socket); }); - function mustConnect(module) { - describe("as connect", function () { - it("must return an instance of Net.Socket", function () { - var socket = module.connect({ host: "foo", port: 80 }); - socket.must.be.an.instanceof(Net.Socket); - }); + test(`${moduleName}: must return an instance of Net.Socket given port`, () => { + module.connect(80).must.be.an.instanceof(Net.Socket); + }); - it("must return an instance of Net.Socket given port", function () { - module.connect(80).must.be.an.instanceof(Net.Socket); - }); + test(`${moduleName}: must return an instance of Net.Socket given port and host`, () => { + module.connect(80, "10.0.0.1").must.be.an.instanceof(Net.Socket); + }); - it("must return an instance of Net.Socket given port and host", function () { - module.connect(80, "10.0.0.1").must.be.an.instanceof(Net.Socket); - }); + test(`${moduleName}: must emit connect on Mitm`, () => { + var onConnect = Sinon.spy(); + mitm.on("connect", onConnect); + var opts = { host: "foo" }; + var socket = module.connect(opts); - it("must emit connect on Mitm", function () { - var onConnect = Sinon.spy(); - this.mitm.on("connect", onConnect); - var opts = { host: "foo" }; - var socket = module.connect(opts); + onConnect.callCount.must.equal(1); + onConnect.firstCall.args[0].must.equal(socket); + onConnect.firstCall.args[1].must.equal(opts); + }); - onConnect.callCount.must.equal(1); - onConnect.firstCall.args[0].must.equal(socket); - onConnect.firstCall.args[1].must.equal(opts); - }); + test(`${moduleName}: must emit connect on Mitm with options object given host and port`, () => { + var onConnect = Sinon.spy(); + mitm.on("connect", onConnect); + var socket = module.connect(9, "127.0.0.1"); - it("must emit connect on Mitm with options object given host and port", function () { - var onConnect = Sinon.spy(); - this.mitm.on("connect", onConnect); - var socket = module.connect(9, "127.0.0.1"); + onConnect.callCount.must.equal(1); + onConnect.firstCall.args[0].must.equal(socket); + onConnect.firstCall.args[1].must.eql({ host: "127.0.0.1", port: 9 }); + }); - onConnect.callCount.must.equal(1); - onConnect.firstCall.args[0].must.equal(socket); - onConnect.firstCall.args[1].must.eql({ host: "127.0.0.1", port: 9 }); - }); + test(`${moduleName}: must emit connection on Mitm`, () => { + var onConnection = Sinon.spy(); + mitm.on("connection", onConnection); + var opts = { host: "foo" }; + var socket = module.connect(opts); - it("must emit connection on Mitm", function () { - var onConnection = Sinon.spy(); - this.mitm.on("connection", onConnection); - var opts = { host: "foo" }; - var socket = module.connect(opts); + onConnection.callCount.must.equal(1); + onConnection.firstCall.args[0].must.be.an.instanceof(Net.Socket); + onConnection.firstCall.args[0].must.not.equal(socket); + onConnection.firstCall.args[1].must.equal(opts); + }); - onConnection.callCount.must.equal(1); - onConnection.firstCall.args[0].must.be.an.instanceof(Net.Socket); - onConnection.firstCall.args[0].must.not.equal(socket); - onConnection.firstCall.args[1].must.equal(opts); - }); + test(`${moduleName}: must emit connect on socket in next ticks`, () => { + return new Promise((resolve) => { + var socket = module.connect({ host: "foo" }); + socket.on("connect", resolve); + }); + }); - it("must emit connect on socket in next ticks", function (done) { - var socket = module.connect({ host: "foo" }); - socket.on("connect", done.bind(null, null)); - }); + test(`${moduleName}: must call back on connect given callback`, () => { + return new Promise((resolve) => { + module.connect({ host: "foo" }, resolve); + }); + }); - it("must call back on connect given callback", function (done) { - module.connect({ host: "foo" }, done.bind(null, null)); - }); + test(`${moduleName}: must call back on connect given port and callback`, () => { + return new Promise((resolve) => { + module.connect(80, resolve); + }); + }); - it("must call back on connect given port and callback", function (done) { - module.connect(80, done.bind(null, null)); - }); + // This was a bug found on Apr 26, 2014 where the host argument was taken + // to be the callback because arguments weren't normalized to an options + // object. + test(`${moduleName}: must call back on connect given port, host and callback`, () => { + return new Promise((resolve) => { + module.connect(80, "localhost", resolve); + }); + }); - // This was a bug found on Apr 26, 2014 where the host argument was taken - // to be the callback because arguments weren't normalized to an options - // object. - it("must call back on connect given port, host and callback", function (done) { - module.connect(80, "localhost", done.bind(null, null)); + // The "close" event broke on Node v12.16.3 as the + // InternalSocket.prototype.close method didn't call back if + // the WritableStream had already been closed. + test(`${moduleName}: must emit close on socket if ended immediately`, () => { + return new Promise((resolve) => { + mitm.on("connection", function (socket) { + socket.end(); }); + var socket = module.connect({ host: "foo" }); + socket.on("close", resolve); + }); + }); - // The "close" event broke on Node v12.16.3 as the - // InternalSocket.prototype.close method didn't call back if - // the WritableStream had already been closed. - it("must emit close on socket if ended immediately", function (done) { - this.mitm.on("connection", function (socket) { - socket.end(); - }); - var socket = module.connect({ host: "foo" }); - socket.on("close", done.bind(null, null)); + test(`${moduleName}: must emit close on socket if ended in next tick`, () => { + return new Promise((resolve) => { + mitm.on("connection", function (socket) { + process.nextTick(socket.end.bind(socket)); }); - it("must emit close on socket if ended in next tick", function (done) { - this.mitm.on("connection", function (socket) { - process.nextTick(socket.end.bind(socket)); - }); + var socket = module.connect({ host: "foo" }); + socket.on("close", resolve); + }); + }); - var socket = module.connect({ host: "foo" }); - socket.on("close", done.bind(null, null)); + test(`${moduleName}: must intercept 127.0.0.1`, () => { + return new Promise((resolve) => { + var server; + mitm.on("connection", function (s) { + server = s; }); + var client = module.connect({ host: "127.0.0.1" }); + server.write("Hello"); - it("must intercept 127.0.0.1", function (done) { - var server; - this.mitm.on("connection", function (s) { - server = s; - }); - var client = module.connect({ host: "127.0.0.1" }); - server.write("Hello"); - - client.setEncoding("utf8"); - client.on("data", function (data) { - data.must.equal("Hello"); - }); - client.on("data", done.bind(null, null)); + client.setEncoding("utf8"); + client.on("data", function (data) { + data.must.equal("Hello"); }); + client.on("data", resolve); + }); + }); - describe("when bypassed", function () { - beforeEach(function () { - this.sinon = Sinon.sandbox.create(); - }); - afterEach(function () { - this.sinon.restore(); - }); - - it("must not intercept", function (done) { - this.mitm.on("connect", function (client) { - client.bypass(); - }); - - module - .connect({ host: "127.0.0.1", port: 9 }) - .on("error", function (err) { - err.must.be.an.instanceof(Error); - err.message.must.include("ECONNREFUSED"); - done(); - }); - }); - - it("must call original module.connect", function () { - this.mitm.disable(); - - var connect = this.sinon.spy(module, "connect"); - var mitm = Mitm(); - mitm.on("connect", function (client) { - client.bypass(); - }); - - try { - module.connect({ host: "127.0.0.1", port: 9 }).on("error", noop); - connect.callCount.must.equal(1); - connect.firstCall.args[0].must.eql({ host: "127.0.0.1", port: 9 }); - } finally { - // Working around Mocha's context bug(s) and poor design decision - // with a manual `finally`. - mitm.disable(); - } - }); - - it("must not call back twice on connect given callback", function (done) { - this.mitm.on("connect", function (client) { - client.bypass(); - }); - - var onConnect = Sinon.spy(); - var client = module.connect( - { host: "127.0.0.1", port: 9 }, - onConnect - ); - - client.on( - "error", - process.nextTick.bind(null, function () { - onConnect.callCount.must.equal(0); - done(); - }) - ); - }); + test(`${moduleName}: when bypassed must not intercept`, () => { + return new Promise((resolve) => { + mitm.on("connect", function (client) { + client.bypass(); + }); - it("must not emit connection", function () { - this.mitm.on("connect", function (client) { - client.bypass(); - }); - var onConnection = Sinon.spy(); - this.mitm.on("connection", onConnection); - module.connect({ host: "127.0.0.1", port: 9 }).on("error", noop); - onConnection.callCount.must.equal(0); + module + .connect({ host: "127.0.0.1", port: 9 }) + .on("error", function (err) { + err.must.be.an.instanceof(Error); + err.message.must.include("ECONNREFUSED"); + resolve(); }); - }); }); - } + }); - describe("Net.connect", function () { - beforeEach(function () { - this.mitm = Mitm(); - }); - afterEach(function () { - this.mitm.disable(); - }); + test(`${moduleName}: when bypassed must call original module.connect`, () => { + mitm.disable(); - mustConnect(Net); + var connect = sinon.spy(module, "connect"); + var testMitm = Mitm(); + testMitm.on("connect", function (client) { + client.bypass(); + }); + + try { + module.connect({ host: "127.0.0.1", port: 9 }).on("error", noop); + connect.callCount.must.equal(1); + connect.firstCall.args[0].must.eql({ host: "127.0.0.1", port: 9 }); + } finally { + // Working around Mocha's context bug(s) and poor design decision + // with a manual `finally`. + testMitm.disable(); + } + }); - it("must not return an instance of Tls.TLSSocket", function () { - var client = Net.connect({ host: "foo", port: 80 }); - client.must.not.be.an.instanceof(Tls.TLSSocket); - }); + test(`${moduleName}: when bypassed must not call back twice on connect given callback`, () => { + return new Promise((resolve) => { + mitm.on("connect", function (client) { + client.bypass(); + }); - it("must not set the encrypted property", function () { - Net.connect({ host: "foo" }).must.not.have.property("encrypted"); - }); + var onConnect = Sinon.spy(); + var client = module.connect({ host: "127.0.0.1", port: 9 }, onConnect); - it("must not set the authorized property", function () { - Net.connect({ host: "foo" }).must.not.have.property("authorized"); + client.on( + "error", + process.nextTick.bind(null, () => { + onConnect.callCount.must.equal(0); + resolve(); + }) + ); }); + }); - it("must not emit secureConnect on client", function (done) { - var client = Net.connect({ host: "foo" }); - // Let Mocha raise an error when done called twice. - client.on("secureConnect", done.bind(null, null)); - done(); + test(`${moduleName}: when bypassed must not emit connection`, () => { + mitm.on("connect", function (client) { + client.bypass(); }); + var onConnection = Sinon.spy(); + mitm.on("connection", onConnection); + module.connect({ host: "127.0.0.1", port: 9 }).on("error", noop); + onConnection.callCount.must.equal(0); + }); +} - it("must not emit secureConnect on server", function (done) { - var server; - this.mitm.on("connection", function (s) { - server = s; - }); - Net.connect({ host: "foo" }); - // Let Mocha raise an error when done called twice. - server.on("secureConnect", done.bind(null, null)); - done(); - }); - - describe("Socket", function () { - describe(".prototype.write", function () { - it("must write to client from server", function (done) { - var server; - this.mitm.on("connection", function (s) { - server = s; - }); - var client = Net.connect({ host: "foo" }); - server.write("Hello ☺️"); - - client.setEncoding("utf8"); - client.on("data", function (data) { - data.must.equal("Hello ☺️"); - }); - client.on("data", done.bind(null, null)); - }); +mustConnect("Net.connect", Net); - it("must write to client from server in the next tick", function (done) { - var server; - this.mitm.on("connection", function (s) { - server = s; - }); - var client = Net.connect({ host: "foo" }); - - var ticked = false; - client.once("data", function () { - ticked.must.be.true(); - done(); - }); - server.write("Hello"); - ticked = true; - }); - - it("must write to server from client", function (done) { - var server; - this.mitm.on("connection", function (s) { - server = s; - }); - var client = Net.connect({ host: "foo" }); - client.write("Hello ☺️"); - - server.setEncoding("utf8"); - process.nextTick(function () { - server.read().must.equal("Hello ☺️"); - }); - process.nextTick(done); - }); +test("Net.connect must not return an instance of Tls.TLSSocket", () => { + var client = Net.connect({ host: "foo", port: 80 }); + client.must.not.be.an.instanceof(Tls.TLSSocket); +}); - it("must write to server from client in the next tick", function (done) { - var server; - this.mitm.on("connection", function (s) { - server = s; - }); - var client = Net.connect({ host: "foo" }); - - var ticked = false; - server.once("data", function () { - ticked.must.be.true(); - done(); - }); - client.write("Hello"); - ticked = true; - }); +test("Net.connect must not set the encrypted property", () => { + Net.connect({ host: "foo" }).must.not.have.property("encrypted"); +}); - // Writing binary strings was introduced in Node v0.11.14. - // The test still passes for Node v0.10 and newer v0.11s, so let it be. - it("must write to server from client given binary", function (done) { - var server; - this.mitm.on("connection", function (s) { - server = s; - }); - var client = Net.connect({ host: "foo" }); - client.write("Hello", "binary"); - - server.setEncoding("binary"); - process.nextTick(function () { - server.read().must.equal("Hello"); - }); - process.nextTick(done); - }); +test("Net.connect must not set the authorized property", () => { + Net.connect({ host: "foo" }).must.not.have.property("authorized"); +}); - it("must write to server from client given latin1", function (done) { - var server; - this.mitm.on("connection", function (s) { - server = s; - }); - var client = Net.connect({ host: "foo" }); - client.write("Hello", "latin1"); - - server.setEncoding("latin1"); - process.nextTick(function () { - server.read().must.equal("Hello"); - }); - process.nextTick(done); - }); +test("Net.connect must not emit secureConnect on client", () => { + return new Promise((resolve) => { + var client = Net.connect({ host: "foo" }); + client.on("secureConnect", resolve); + resolve(); + }); +}); - it("must write to server from client given a buffer", function (done) { - var server; - this.mitm.on("connection", function (s) { - server = s; - }); - var client = Net.connect({ host: "foo" }); - client.write(newBuffer("Hello", "binary")); - - process.nextTick(function () { - assertBuffers(server.read(), newBuffer("Hello", "binary")); - done(); - }); - }); +test("Net.connect must not emit secureConnect on server", () => { + return new Promise((resolve) => { + var server; + mitm.on("connection", function (s) { + server = s; + }); + Net.connect({ host: "foo" }); + server.on("secureConnect", resolve); + resolve(); + }); +}); - it("must write to server from client given a UTF-8 string", function (done) { - var server; - this.mitm.on("connection", function (s) { - server = s; - }); - var client = Net.connect({ host: "foo" }); - client.write("Hello", "utf8"); - - process.nextTick(function () { - assertBuffers(server.read(), newBuffer("Hello", "binary")); - done(); - }); - }); +test("Socket.prototype.write must write to client from server", () => { + return new Promise((resolve) => { + var server; + mitm.on("connection", function (s) { + server = s; + }); + var client = Net.connect({ host: "foo" }); + server.write("Hello ☺️"); - it("must write to server from client given a ASCII string", function (done) { - var server; - this.mitm.on("connection", function (s) { - server = s; - }); - var client = Net.connect({ host: "foo" }); - client.write("Hello", "ascii"); - - process.nextTick(function () { - assertBuffers(server.read(), newBuffer("Hello", "binary")); - done(); - }); - }); + client.setEncoding("utf8"); + client.on("data", function (data) { + data.must.equal("Hello ☺️"); + }); + client.on("data", resolve); + }); +}); - it("must write to server from client given a UCS-2 string", function (done) { - var server; - this.mitm.on("connection", function (s) { - server = s; - }); - var client = Net.connect({ host: "foo" }); - client.write("Hello", "ucs2"); - - process.nextTick(function () { - assertBuffers( - server.read(), - newBuffer("H\u0000e\u0000l\u0000l\u0000o\u0000", "binary") - ); - - done(); - }); - }); - }); +test("Socket.prototype.write must write to client from server in the next tick", () => { + return new Promise((resolve) => { + var server; + mitm.on("connection", function (s) { + server = s; + }); + var client = Net.connect({ host: "foo" }); - describe(".prototype.end", function () { - it("must emit end when closed on server", function (done) { - var server; - this.mitm.on("connection", function (s) { - server = s; - }); - var client = Net.connect({ host: "foo" }); - server.end(); - client.on("end", done); - }); - }); + var ticked = false; + client.once("data", () => { + ticked.must.be.true(); + resolve(); + }); + server.write("Hello"); + ticked = true; + }); +}); - describe(".prototype.ref", function () { - it("must allow calling on client", function () { - Net.connect({ host: "foo" }).ref(); - }); +test("Socket.prototype.write must write to server from client", () => { + return new Promise((resolve) => { + var server; + mitm.on("connection", function (s) { + server = s; + }); + var client = Net.connect({ host: "foo" }); + client.write("Hello ☺️"); - it("must allow calling on server", function () { - var server; - this.mitm.on("connection", function (s) { - server = s; - }); - Net.connect({ host: "foo" }); - server.ref(); - }); - }); + server.setEncoding("utf8"); + process.nextTick(() => { + server.read().must.equal("Hello ☺️"); + }); + process.nextTick(resolve); + }); +}); - describe(".prototype.unref", function () { - it("must allow calling on client", function () { - Net.connect({ host: "foo" }).unref(); - }); +test("Socket.prototype.write must write to server from client in the next tick", () => { + return new Promise((resolve) => { + var server; + mitm.on("connection", function (s) { + server = s; + }); + var client = Net.connect({ host: "foo" }); - it("must allow calling on server", function () { - var server; - this.mitm.on("connection", function (s) { - server = s; - }); - Net.connect({ host: "foo" }); - server.unref(); - }); - }); + var ticked = false; + server.once("data", () => { + ticked.must.be.true(); + resolve(); + }); + client.write("Hello"); + ticked = true; + }); +}); - describe(".prototype.pipe", function () { - // To confirm https://github.com/moll/node-mitm/issues/47 won't become - // an issue. - it("must allow piping to itself", function (done) { - this.mitm.on("connection", function (server) { - server.pipe(new Upcase()).pipe(server); - }); - - var client = Net.connect({ host: "foo" }); - client.write("Hello"); - - client.setEncoding("utf8"); - client.on("data", function (data) { - data.must.equal("HELLO"); - }); - client.on("data", done.bind(null, null)); - }); - }); +// Writing binary strings was introduced in Node v0.11.14. +// The test still passes for Node v0.10 and newer v0.11s, so let it be. +test("Socket.prototype.write must write to server from client given binary", () => { + return new Promise((resolve) => { + var server; + mitm.on("connection", function (s) { + server = s; + }); + var client = Net.connect({ host: "foo" }); + client.write("Hello", "binary"); - // Bug report from Io.js v3 days: - // https://github.com/moll/node-mitm/issues/26 - describe(".prototype.destroy", function () { - it("must emit end when destroyed on server", function (done) { - var server; - this.mitm.on("connection", function (s) { - server = s; - }); - var client = Net.connect({ host: "foo" }); - server.destroy(); - client.on("end", done); - }); - }); + server.setEncoding("binary"); + process.nextTick(() => { + server.read().must.equal("Hello"); }); + process.nextTick(resolve); }); +}); - describe("Net.createConnection", function () { - beforeEach(function () { - this.mitm = Mitm(); - }); - afterEach(function () { - this.mitm.disable(); +test("Socket.prototype.write must write to server from client given latin1", () => { + return new Promise((resolve) => { + var server; + mitm.on("connection", function (s) { + server = s; }); + var client = Net.connect({ host: "foo" }); + client.write("Hello", "latin1"); - it("must be equal to Net.connect", function () { - Net.createConnection.must.equal(Net.connect); + server.setEncoding("latin1"); + process.nextTick(() => { + server.read().must.equal("Hello"); }); + process.nextTick(resolve); }); +}); - describe("Tls.connect", function () { - beforeEach(function () { - this.mitm = Mitm(); +test("Socket.prototype.write must write to server from client given a buffer", () => { + return new Promise((resolve) => { + var server; + mitm.on("connection", function (s) { + server = s; }); - afterEach(function () { - this.mitm.disable(); + var client = Net.connect({ host: "foo" }); + client.write(newBuffer("Hello", "binary")); + + process.nextTick(() => { + assertBuffers(server.read(), newBuffer("Hello", "binary")); + resolve(); }); + }); +}); - mustConnect(Tls); +test("Socket.prototype.write must write to server from client given a UTF-8 string", () => { + return new Promise((resolve) => { + var server; + mitm.on("connection", function (s) { + server = s; + }); + var client = Net.connect({ host: "foo" }); + client.write("Hello", "utf8"); - it("must return an instance of Tls.TLSSocket", function () { - Tls.connect({ host: "foo", port: 80 }).must.be.an.instanceof( - Tls.TLSSocket - ); + process.nextTick(() => { + assertBuffers(server.read(), newBuffer("Hello", "binary")); + resolve(); }); + }); +}); - it("must return an instance of Tls.TLSSocket given port", function () { - Tls.connect(80).must.be.an.instanceof(Tls.TLSSocket); +test("Socket.prototype.write must write to server from client given a ASCII string", () => { + return new Promise((resolve) => { + var server; + mitm.on("connection", function (s) { + server = s; }); + var client = Net.connect({ host: "foo" }); + client.write("Hello", "ascii"); - it("must return an instance of Tls.TLSSocket given port and host", function () { - Tls.connect(80, "10.0.0.1").must.be.an.instanceof(Tls.TLSSocket); + process.nextTick(() => { + assertBuffers(server.read(), newBuffer("Hello", "binary")); + resolve(); }); + }); +}); - it("must emit secureConnect in next ticks", function (done) { - var socket = Tls.connect({ host: "foo" }); - socket.on("secureConnect", done.bind(null, null)); +test("Socket.prototype.write must write to server from client given a UCS-2 string", () => { + return new Promise((resolve) => { + var server; + mitm.on("connection", function (s) { + server = s; }); + var client = Net.connect({ host: "foo" }); + client.write("Hello", "ucs2"); - it("must emit secureConnect after connect in next ticks", function (done) { - var socket = Tls.connect({ host: "foo" }); + process.nextTick(() => { + assertBuffers( + server.read(), + newBuffer("H\u0000e\u0000l\u0000l\u0000o\u0000", "binary") + ); - socket.on("connect", function () { - socket.on("secureConnect", done.bind(null, null)); - }); + resolve(); }); + }); +}); - it("must not emit secureConnect on server", function (done) { - var server; - this.mitm.on("connection", function (s) { - server = s; - }); - Tls.connect({ host: "foo" }); - // Let Mocha raise an error when done called twice. - server.on("secureConnect", done.bind(null, null)); - done(); +test("Socket.prototype.end() must emit end when closed on server", () => { + return new Promise((resolve) => { + var server; + mitm.on("connection", function (s) { + server = s; }); + var client = Net.connect({ host: "foo" }); + server.end(); + client.on("end", resolve); + }); +}); - it("must call back on secureConnect", function (done) { - var connected = false; +test("Socket.prototype.ref must allow calling on client", () => { + Net.connect({ host: "foo" }).ref(); +}); - var client = Tls.connect({ host: "foo" }, function () { - connected.must.be.true(); - done(); - }); +test("Socket.prototype.ref must allow calling on server", () => { + var server; + mitm.on("connection", function (s) { + server = s; + }); + Net.connect({ host: "foo" }); + server.ref(); +}); - client.on("connect", function () { - connected = true; - }); - }); +test("Socket.prototype.unref must allow calling on client", () => { + Net.connect({ host: "foo" }).unref(); +}); - it("must set encrypted true", function () { - Tls.connect({ host: "foo" }).encrypted.must.be.true(); +test("Socket.prototype.unref must allow calling on server", () => { + var server; + mitm.on("connection", function (s) { + server = s; + }); + Net.connect({ host: "foo" }); + server.unref(); +}); + +// To confirm https://github.com/moll/node-mitm/issues/47 won't become +// an issue. +test("Socket.prototype.pipe must allow piping to itself", () => { + return new Promise((resolve) => { + mitm.on("connection", function (server) { + server.pipe(new Upcase()).pipe(server); }); - it("must set authorized true", function () { - Tls.connect({ host: "foo" }).authorized.must.be.true(); + var client = Net.connect({ host: "foo" }); + client.write("Hello"); + + client.setEncoding("utf8"); + client.on("data", function (data) { + data.must.equal("HELLO"); }); + client.on("data", resolve); }); +}); - function mustRequest(request) { - describe("as request", function () { - it("must return ClientRequest", function () { - request({ host: "foo" }).must.be.an.instanceof(ClientRequest); - }); - - it("must emit connect on Mitm", function () { - var onConnect = Sinon.spy(); - this.mitm.on("connect", onConnect); - request({ host: "foo" }); - onConnect.callCount.must.equal(1); - }); +// Bug report from Io.js v3 days: +// https://github.com/moll/node-mitm/issues/26 +test("Socket.prototype.destroy must emit end when destroyed on server", () => { + return new Promise((resolve) => { + var server; + mitm.on("connection", function (s) { + server = s; + }); + var client = Net.connect({ host: "foo" }); + server.destroy(); + client.on("end", resolve); + }); +}); - it("must emit connect on Mitm after multiple connections", function () { - var onConnect = Sinon.spy(); - this.mitm.on("connect", onConnect); - request({ host: "foo" }); - request({ host: "foo" }); - request({ host: "foo" }); - onConnect.callCount.must.equal(3); - }); +test("Net.createConnection must be equal to Net.connect", () => { + Net.createConnection.must.equal(Net.connect); +}); - it("must emit connection on Mitm", function () { - var onConnection = Sinon.spy(); - this.mitm.on("connection", onConnection); - request({ host: "foo" }); - onConnection.callCount.must.equal(1); - }); +mustConnect("Tls.connect", Tls); - it("must emit connection on Mitm after multiple connections", function () { - var onConnection = Sinon.spy(); - this.mitm.on("connection", onConnection); - request({ host: "foo" }); - request({ host: "foo" }); - request({ host: "foo" }); - onConnection.callCount.must.equal(3); - }); +test("Tls.connect must return an instance of Tls.TLSSocket", () => { + Tls.connect({ host: "foo", port: 80 }).must.be.an.instanceof(Tls.TLSSocket); +}); - it("must emit request on Mitm", function (done) { - var client = request({ host: "foo" }); - client.end(); +test("Tls.connect must return an instance of Tls.TLSSocket given port", () => { + Tls.connect(80).must.be.an.instanceof(Tls.TLSSocket); +}); - this.mitm.on("request", function (req, res) { - req.must.be.an.instanceof(IncomingMessage); - req.must.not.equal(client); - res.must.be.an.instanceof(ServerResponse); - done(); - }); - }); +test("Tls.connect must return an instance of Tls.TLSSocket given port and host", () => { + Tls.connect(80, "10.0.0.1").must.be.an.instanceof(Tls.TLSSocket); +}); - it("must emit request on Mitm after multiple requests", function (done) { - let counter = 0; - request({ host: "foo" }).end(); - request({ host: "foo" }).end(); - request({ host: "foo" }).end(); - this.mitm.on("request", () => { - counter++; - if (counter === 3) { - done(); - } - }); - }); +test("Tls.connect must emit secureConnect in next ticks", () => { + return new Promise((resolve) => { + var socket = Tls.connect({ host: "foo" }); + socket.on("secureConnect", resolve); + }); +}); - it("must emit socket on request in next ticks", function (done) { - var client = request({ host: "foo" }); - client.on("socket", done.bind(null, null)); - }); +test("Tls.connect must emit secureConnect after connect in next ticks", () => { + return new Promise((resolve) => { + var socket = Tls.connect({ host: "foo" }); - // https://github.com/moll/node-mitm/pull/25 - it("must emit connect after socket event", function (done) { - var client = request({ host: "foo" }); + socket.on("connect", () => { + socket.on("secureConnect", resolve); + }); + }); +}); - client.on("socket", function (socket) { - socket.on("connect", done.bind(null, null)); - }); - }); +test("Tls.connect must not emit secureConnect on server", () => { + return new Promise((resolve) => { + var server; + mitm.on("connection", function (s) { + server = s; + }); + Tls.connect({ host: "foo" }); + server.on("secureConnect", resolve); + resolve(); + }); +}); - describe("when bypassed", function () { - it("must not intercept", function (done) { - this.mitm.on("connect", function (client) { - client.bypass(); - }); - request({ host: "127.0.0.1" }).on("error", function (err) { - err.must.be.an.instanceof(Error); - err.message.must.include("ECONNREFUSED"); - done(); - }); - }); +test("Tls.connect must call back on secureConnect", () => { + return new Promise((resolve) => { + var connected = false; - it("must not emit request", function (done) { - this.mitm.on("connect", function (client) { - client.bypass(); - }); - var onRequest = Sinon.spy(); - this.mitm.on("request", onRequest); - request({ host: "127.0.0.1" }).on("error", function (_err) { - onRequest.callCount.must.equal(0); - done(); - }); - }); - }); + var client = Tls.connect({ host: "foo" }, () => { + connected.must.be.true(); + resolve(); }); - } - describe("via Http.request", function () { - beforeEach(function () { - this.mitm = Mitm(); - }); - afterEach(function () { - this.mitm.disable(); + client.on("connect", () => { + connected = true; }); - - mustRequest(Http.request); }); +}); - describe("via Https.request", function () { - beforeEach(function () { - this.mitm = Mitm(); - }); - afterEach(function () { - this.mitm.disable(); - }); +test("Tls.connect must set encrypted true", () => { + Tls.connect({ host: "foo" }).encrypted.must.be.true(); +}); - mustRequest(Https.request); +test("Tls.connect must set authorized true", () => { + Tls.connect({ host: "foo" }).authorized.must.be.true(); +}); - // https://github.com/moll/node-mitm/pull/25 - it("must emit secureConnect after socket event", function (done) { - var client = Https.request({ host: "foo" }); +function mustRequest(context, request) { + test(`${context}: must return ClientRequest`, () => { + request({ host: "foo" }).must.be.an.instanceof(ClientRequest); + }); - client.on("socket", function (socket) { - socket.on("secureConnect", done.bind(null, null)); - }); - }); + test(`${context}: must emit connect on Mitm`, () => { + var onConnect = Sinon.spy(); + mitm.on("connect", onConnect); + request({ host: "foo" }); + onConnect.callCount.must.equal(1); }); - describe("via Http.Agent", function () { - beforeEach(function () { - this.mitm = Mitm(); - }); - afterEach(function () { - this.mitm.disable(); - }); + test(`${context}: must emit connect on Mitm after multiple connections`, () => { + var onConnect = Sinon.spy(); + mitm.on("connect", onConnect); + request({ host: "foo" }); + request({ host: "foo" }); + request({ host: "foo" }); + onConnect.callCount.must.equal(3); + }); - mustRequest(function (opts) { - return Http.request({ agent: new Http.Agent(), ...opts }); - }); + test(`${context}: must emit connection on Mitm`, () => { + var onConnection = Sinon.spy(); + mitm.on("connection", onConnection); + request({ host: "foo" }); + onConnection.callCount.must.equal(1); + }); - it("must support keep-alive", function (done) { - var client = Http.request({ - host: "foo", - agent: new Http.Agent({ keepAlive: true }), - }); + test(`${context}: must emit connection on Mitm after multiple connections`, () => { + var onConnection = Sinon.spy(); + mitm.on("connection", onConnection); + request({ host: "foo" }); + request({ host: "foo" }); + request({ host: "foo" }); + onConnection.callCount.must.equal(3); + }); + test(`${context}: must emit request on Mitm`, () => { + return new Promise((resolve) => { + var client = request({ host: "foo" }); client.end(); - this.mitm.on("request", function (_req, res) { - res.setHeader("Connection", "keep-alive"); - res.end(); + mitm.on("request", function (req, res) { + req.must.be.an.instanceof(IncomingMessage); + req.must.not.equal(client); + res.must.be.an.instanceof(ServerResponse); + resolve(); }); + }); + }); - // Just waiting for response is too early to trigger: - // TypeError: socket._handle.getAsyncId is not a function in _http_client. - client.on("response", function (res) { - res.on("data", noop); - res.on("end", done); + test(`${context}: must emit request on Mitm after multiple requests`, () => { + return new Promise((resolve) => { + let counter = 0; + request({ host: "foo" }).end(); + request({ host: "foo" }).end(); + request({ host: "foo" }).end(); + mitm.on("request", () => { + counter++; + if (counter === 3) { + resolve(); + } }); }); }); - describe("via Https.Agent", function () { - beforeEach(function () { - this.mitm = Mitm(); - }); - afterEach(function () { - this.mitm.disable(); + test(`${context}: must emit socket on request in next ticks`, () => { + return new Promise((resolve) => { + var client = request({ host: "foo" }); + client.on("socket", resolve); }); + }); + + // https://github.com/moll/node-mitm/pull/25 + test(`${context}: must emit connect after socket event`, () => { + return new Promise((resolve) => { + var client = request({ host: "foo" }); - mustRequest(function (opts) { - return Https.request({ agent: new Https.Agent(), ...opts }); + client.on("socket", function (socket) { + socket.on("connect", resolve); + }); }); }); - describe("IncomingMessage", function () { - beforeEach(function () { - this.mitm = Mitm(); + test(`${context} when bypassed must not intercept`, () => { + return new Promise((resolve) => { + mitm.on("connect", function (client) { + client.bypass(); + }); + request({ host: "127.0.0.1" }).on("error", function (err) { + err.must.be.an.instanceof(Error); + err.message.must.include("ECONNREFUSED"); + resolve(); + }); }); - afterEach(function () { - this.mitm.disable(); + }); + + test(`${context} when bypassed must not emit request`, () => { + return new Promise((resolve) => { + mitm.on("connect", function (client) { + client.bypass(); + }); + var onRequest = Sinon.spy(); + mitm.on("request", onRequest); + request({ host: "127.0.0.1" }).on("error", function (_err) { + onRequest.callCount.must.equal(0); + resolve(); + }); }); + }); +} - it("must have URL", function (done) { - Http.request({ host: "foo", path: "/foo" }).end(); +mustRequest("Http.request", Http.request); +mustRequest("Https.request", Https.request); - this.mitm.on("request", function (req) { - req.url.must.equal("/foo"); - done(); - }); +// https://github.com/moll/node-mitm/pull/25 +test("Https.request must emit secureConnect after socket event", () => { + return new Promise((resolve) => { + var client = Https.request({ host: "foo" }); + + client.on("socket", function (socket) { + socket.on("secureConnect", resolve); }); + }); +}); - it("must have headers", function (done) { - var req = Http.request({ host: "foo" }); - req.setHeader("Content-Type", "application/json"); - req.end(); +mustRequest("Using Http.Agent", function (opts) { + return Http.request({ agent: new Http.Agent(), ...opts }); +}); - this.mitm.on("request", function (req) { - req.headers["content-type"].must.equal("application/json"); - done(); - }); +test("Using Http.Agent must support keep-alive", () => { + return new Promise((resolve) => { + var client = Http.request({ + host: "foo", + agent: new Http.Agent({ keepAlive: true }), }); - it("must have body", function (done) { - var client = Http.request({ host: "foo", method: "POST" }); - client.write("Hello"); + client.end(); - this.mitm.on("request", function (req, _res) { - req.setEncoding("utf8"); - req.on("data", function (data) { - data.must.equal("Hello"); - done(); - }); - }); + mitm.on("request", function (_req, res) { + res.setHeader("Connection", "keep-alive"); + res.end(); }); - it("must have a reference to the ServerResponse", function (done) { - Http.request({ host: "foo", method: "POST" }).end(); - this.mitm.on("request", function (req, res) { - req.res.must.equal(res); - }); - this.mitm.on("request", done.bind(null, null)); + // Just waiting for response is too early to trigger: + // TypeError: socket._handle.getAsyncId is not a function in _http_client. + client.on("response", function (res) { + res.on("data", noop); + res.on("end", resolve); }); }); +}); - describe("ServerResponse", function () { - beforeEach(function () { - this.mitm = Mitm(); - }); - afterEach(function () { - this.mitm.disable(); - }); +mustRequest("Using Https.Agent", function (opts) { + return Https.request({ agent: new Https.Agent(), ...opts }); +}); - it("must respond with status, headers and body", function (done) { - this.mitm.on("request", function (_req, res) { - res.statusCode = 442; - res.setHeader("Content-Type", "application/json"); - res.end("Hi!"); - }); +test("IncomingMessage must have URL", () => { + return new Promise((resolve) => { + Http.request({ host: "foo", path: "/foo" }).end(); - Http.request({ host: "foo" }) - .on("response", function (res) { - res.statusCode.must.equal(442); - res.headers["content-type"].must.equal("application/json"); - res.setEncoding("utf8"); - res.once("data", function (data) { - data.must.equal("Hi!"); - done(); - }); - }) - .end(); + mitm.on("request", function (req) { + req.url.must.equal("/foo"); + resolve(); }); + }); +}); - it("must have a reference to the IncomingMessage", function (done) { - Http.request({ host: "foo", method: "POST" }).end(); - this.mitm.on("request", function (req, res) { - res.req.must.equal(req); - }); - this.mitm.on("request", done.bind(null, null)); +test("IncomingMessage must have headers", () => { + return new Promise((resolve) => { + var req = Http.request({ host: "foo" }); + req.setHeader("Content-Type", "application/json"); + req.end(); + + mitm.on("request", function (req) { + req.headers["content-type"].must.equal("application/json"); + resolve(); }); + }); +}); - describe(".prototype.write", function () { - it("must make clientRequest emit response", function (done) { - var req = Http.request({ host: "foo" }); - req.end(); - this.mitm.on("request", function (_req, res) { - res.write("Test"); - }); - req.on("response", done.bind(null, null)); - }); +test("IncomingMessage must have body", () => { + return new Promise((resolve) => { + var client = Http.request({ host: "foo", method: "POST" }); + client.write("Hello"); - // Under Node v0.10 it's the writeQueueSize that's checked to see if - // the callback can be called. - it("must call given callback", function (done) { - Http.request({ host: "foo" }).end(); - this.mitm.on("request", function (_req, res) { - res.write("Test", done); - }); + mitm.on("request", function (req, _res) { + req.setEncoding("utf8"); + req.on("data", function (data) { + data.must.equal("Hello"); + resolve(); }); }); + }); +}); - describe(".prototype.end", function () { - it("must make ClientRequest emit response", function (done) { - var client = Http.request({ host: "foo" }); - client.end(); - this.mitm.on("request", function (_req, res) { - res.end(); - }); - client.on("response", done.bind(null, null)); - }); +test("IncomingMessage must have a reference to the ServerResponse", () => { + return new Promise((resolve) => { + Http.request({ host: "foo", method: "POST" }).end(); + mitm.on("request", function (req, res) { + req.res.must.equal(res); + }); + mitm.on("request", resolve); + }); +}); - // In an app of mine Node v0.11.7 did not emit the end event, but - // v0.11.11 did. I'll investigate properly if this becomes a problem in - // later Node versions. - it("must make IncomingMessage emit end", function (done) { - var client = Http.request({ host: "foo" }); - client.end(); - this.mitm.on("request", function (_req, res) { - res.end(); - }); +test("ServerResponse must respond with status, headers and body", () => { + return new Promise((resolve) => { + mitm.on("request", function (_req, res) { + res.statusCode = 442; + res.setHeader("Content-Type", "application/json"); + res.end("Hi!"); + }); + + Http.request({ host: "foo" }) + .on("response", function (res) { + res.statusCode.must.equal(442); + res.headers["content-type"].must.equal("application/json"); + res.setEncoding("utf8"); + res.once("data", function (data) { + data.must.equal("Hi!"); + resolve(); + }); + }) + .end(); + }); +}); - client.on("response", function (res) { - res.on("data", noop); - res.on("end", done); - }); - }); +test("ServerResponse must have a reference to the IncomingMessage", () => { + return new Promise((resolve) => { + Http.request({ host: "foo", method: "POST" }).end(); + mitm.on("request", function (req, res) { + res.req.must.equal(req); }); + mitm.on("request", resolve); }); +}); - describe(".prototype.addListener", function () { - it("must be an alias to EventEmitter.prototype.addListener", function () { - Mitm.prototype.addListener.must.equal(EventEmitter.prototype.addListener); +test("ServerResponse.prototype.write must make clientRequest emit response", () => { + return new Promise((resolve) => { + var req = Http.request({ host: "foo" }); + req.end(); + mitm.on("request", function (_req, res) { + res.write("Test"); }); + req.on("response", resolve); }); +}); - describe(".prototype.off", function () { - it("must be an alias to EventEmitter.prototype.removeListener", function () { - Mitm.prototype.off.must.equal(EventEmitter.prototype.removeListener); +// Under Node v0.10 it's the writeQueueSize that's checked to see if +// the callback can be called. +test("ServerResponse.prototype.write must call given callback", () => { + return new Promise((resolve) => { + Http.request({ host: "foo" }).end(); + mitm.on("request", function (_req, res) { + res.write("Test", resolve); }); }); }); +test("ServerResponse.prototype.end must make ClientRequest emit response", () => { + return new Promise((resolve) => { + var client = Http.request({ host: "foo" }); + client.end(); + mitm.on("request", function (_req, res) { + res.end(); + }); + client.on("response", resolve); + }); +}); + +// In an app of mine Node v0.11.7 did not emit the end event, but +// v0.11.11 did. I'll investigate properly if this becomes a problem in +// later Node versions. +test("ServerResponse.prototype.end must make IncomingMessage emit end", () => { + return new Promise((resolve) => { + var client = Http.request({ host: "foo" }); + client.end(); + mitm.on("request", function (_req, res) { + res.end(); + }); + + client.on("response", function (res) { + res.on("data", noop); + res.on("end", resolve); + }); + }); +}); + +test("Mitm.prototype.addListener must be an alias to EventEmitter.prototype.addListener", () => { + Mitm.prototype.addListener.must.equal(EventEmitter.prototype.addListener); +}); + +test("Mitm.prototype.off must be an alias to EventEmitter.prototype.removeListener", () => { + Mitm.prototype.off.must.equal(EventEmitter.prototype.removeListener); +}); + +test.run(); + function Upcase() { Transform.call(this, arguments); } From ca7cfb60646d3a8c87de27d5e47debe899f73acb Mon Sep 17 00:00:00 2001 From: Gregor Martynus <39992+gr2m@users.noreply.github.com> Date: Sat, 4 Dec 2021 01:00:57 -0800 Subject: [PATCH 26/59] refactor: remove obsolete `net._normalizeConnectArgs` --- index.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/index.js b/index.js index 45eb7bc..9111588 100644 --- a/index.js +++ b/index.js @@ -8,7 +8,7 @@ var EventEmitter = require("events").EventEmitter; var InternalSocket = require("./lib/internal_socket"); var Stubs = require("./lib/stubs"); var slice = Function.call.bind(Array.prototype.slice); -var normalizeConnectArgs = Net._normalizeConnectArgs || Net._normalizeArgs; +var normalizeConnectArgs = Net._normalizeArgs; var createRequestAndResponse = Http._connectionListener; module.exports = Mitm; From 67de0e1d9c2594299bbb0372b7c0457d8ea4838a Mon Sep 17 00:00:00 2001 From: Gregor Martynus <39992+gr2m@users.noreply.github.com> Date: Sat, 4 Dec 2021 14:00:37 -0800 Subject: [PATCH 27/59] refactor: use `Buffer.from()` --- test/index_test.js | 18 ++++++------------ 1 file changed, 6 insertions(+), 12 deletions(-) diff --git a/test/index_test.js b/test/index_test.js index fc80d63..25a2f10 100644 --- a/test/index_test.js +++ b/test/index_test.js @@ -15,12 +15,6 @@ var ClientRequest = Http.ClientRequest; var Mitm = require(".."); -var newBuffer = - Buffer.from || - function (d, enc) { - return new Buffer(d, enc); - }; - const test = suite("Mitm"); let mitm; let sinon; @@ -335,7 +329,7 @@ test("Socket.prototype.write must write to server from client given binary", () server = s; }); var client = Net.connect({ host: "foo" }); - client.write("Hello", "binary"); + client.write("Hello", "utf-8"); server.setEncoding("binary"); process.nextTick(() => { @@ -369,10 +363,10 @@ test("Socket.prototype.write must write to server from client given a buffer", ( server = s; }); var client = Net.connect({ host: "foo" }); - client.write(newBuffer("Hello", "binary")); + client.write(Buffer.from("Hello", "utf-8")); process.nextTick(() => { - assertBuffers(server.read(), newBuffer("Hello", "binary")); + assertBuffers(server.read(), Buffer.from("Hello", "utf-8")); resolve(); }); }); @@ -388,7 +382,7 @@ test("Socket.prototype.write must write to server from client given a UTF-8 stri client.write("Hello", "utf8"); process.nextTick(() => { - assertBuffers(server.read(), newBuffer("Hello", "binary")); + assertBuffers(server.read(), Buffer.from("Hello", "utf-8")); resolve(); }); }); @@ -404,7 +398,7 @@ test("Socket.prototype.write must write to server from client given a ASCII stri client.write("Hello", "ascii"); process.nextTick(() => { - assertBuffers(server.read(), newBuffer("Hello", "binary")); + assertBuffers(server.read(), Buffer.from("Hello", "utf-8")); resolve(); }); }); @@ -422,7 +416,7 @@ test("Socket.prototype.write must write to server from client given a UCS-2 stri process.nextTick(() => { assertBuffers( server.read(), - newBuffer("H\u0000e\u0000l\u0000l\u0000o\u0000", "binary") + Buffer.from("H\u0000e\u0000l\u0000l\u0000o\u0000", "utf-8") ); resolve(); From a41abdc2ea620c66ca0f400f4cce3c11491bc137 Mon Sep 17 00:00:00 2001 From: Gregor Martynus <39992+gr2m@users.noreply.github.com> Date: Sat, 4 Dec 2021 14:09:57 -0800 Subject: [PATCH 28/59] refactor: replace `var` with `const` and `let` --- README.md | 8 +- index.js | 50 ++++++------ lib/internal_socket.js | 21 +++--- lib/socket.js | 2 +- lib/stubs.js | 2 +- lib/tls_socket.js | 6 +- test/index_test.js | 168 ++++++++++++++++++++--------------------- 7 files changed, 129 insertions(+), 128 deletions(-) diff --git a/README.md b/README.md index 9e11bf8..23b1c72 100644 --- a/README.md +++ b/README.md @@ -48,7 +48,7 @@ issue][issues] on GitHub. socket.write("Hello back!"); }); - var socket = Net.connect(22, "example.org"); + const socket = Net.connect(22, "example.org"); socket.write("Hello!"); socket.setEncoding("utf8"); socket.on("data", console.log); // => "Hello back!" @@ -125,8 +125,8 @@ Require Mitm.js and invoke it as a function to both create an instance of `Mitm` and enable intercepting: ```javascript -var Mitm = require("mitm"); -var mitm = Mitm(); +const Mitm = require("mitm"); +const mitm = Mitm(); ``` Mitm.js will then intercept all requests until you disable it: @@ -161,7 +161,7 @@ mitm.on("connection", function (socket) { socket.write("Hello back!"); }); -var socket = Net.connect(22, "example.org"); +const socket = Net.connect(22, "example.org"); socket.write("Hello!"); socket.setEncoding("utf8"); socket.on("data", console.log); // => "Hello back!" diff --git a/index.js b/index.js index 9111588..5601db0 100644 --- a/index.js +++ b/index.js @@ -1,15 +1,15 @@ -var Net = require("net"); -var Tls = require("tls"); -var Http = require("http"); -var ClientRequest = Http.ClientRequest; -var Socket = require("./lib/socket"); -var TlsSocket = require("./lib/tls_socket"); -var EventEmitter = require("events").EventEmitter; -var InternalSocket = require("./lib/internal_socket"); -var Stubs = require("./lib/stubs"); -var slice = Function.call.bind(Array.prototype.slice); -var normalizeConnectArgs = Net._normalizeArgs; -var createRequestAndResponse = Http._connectionListener; +const Net = require("net"); +const Tls = require("tls"); +const Http = require("http"); +const ClientRequest = Http.ClientRequest; +const Socket = require("./lib/socket"); +const TlsSocket = require("./lib/tls_socket"); +const EventEmitter = require("events").EventEmitter; +const InternalSocket = require("./lib/internal_socket"); +const Stubs = require("./lib/stubs"); +const slice = Function.call.bind(Array.prototype.slice); +const normalizeConnectArgs = Net._normalizeArgs; +const createRequestAndResponse = Http._connectionListener; module.exports = Mitm; function Mitm() { @@ -29,17 +29,17 @@ Mitm.prototype.addListener = EventEmitter.prototype.addListener; Mitm.prototype.removeListener = EventEmitter.prototype.removeListener; Mitm.prototype.emit = EventEmitter.prototype.emit; -var IncomingMessage = require("_http_incoming").IncomingMessage; -var ServerResponse = require("_http_server").ServerResponse; -var incomingMessageKey = require("_http_common").kIncomingMessage; -var serverResponseKey = require("_http_server").kServerResponse; +const IncomingMessage = require("_http_incoming").IncomingMessage; +const ServerResponse = require("_http_server").ServerResponse; +const incomingMessageKey = require("_http_common").kIncomingMessage; +const serverResponseKey = require("_http_server").kServerResponse; Mitm.prototype[serverResponseKey] = ServerResponse; Mitm.prototype[incomingMessageKey] = IncomingMessage; Mitm.prototype.enable = function () { // Connect is called synchronously. - var netConnect = this.tcpConnect.bind(this, Net.connect); - var tlsConnect = this.tlsConnect.bind(this, Tls.connect); + const netConnect = this.tcpConnect.bind(this, Net.connect); + const tlsConnect = this.tlsConnect.bind(this, Tls.connect); this.stubs.stub(Net, "connect", netConnect); this.stubs.stub(Net, "createConnection", netConnect); @@ -64,12 +64,12 @@ Mitm.prototype.disable = function () { }; Mitm.prototype.connect = function connect(orig, Socket, opts, done) { - var sockets = InternalSocket.pair(); + const sockets = InternalSocket.pair(); // Don't set client.connecting to false because there's nothing setting it // back to false later. Originally that was done in Socket.prototype.connect // and its afterConnect handler, but we're not calling that. - var client = new Socket({ + const client = new Socket({ handle: sockets[0], // Node v10 expects readable and writable to be set at Socket creation time. @@ -87,7 +87,7 @@ Mitm.prototype.connect = function connect(orig, Socket, opts, done) { // classes. If unset, it's set to the used HTTP server (Mitm instance in our // case) in _http_server.js. // See also: https://github.com/nodejs/node/issues/13435. - var server = (client.mitmServerSocket = new Socket({ + const server = (client.mitmServerSocket = new Socket({ handle: sockets[1], readable: true, writable: true, @@ -105,13 +105,13 @@ Mitm.prototype.connect = function connect(orig, Socket, opts, done) { }; Mitm.prototype.tcpConnect = function (orig, opts, done) { - var args = normalizeConnectArgs(slice(arguments, 1)); + const args = normalizeConnectArgs(slice(arguments, 1)); opts = args[0]; done = args[1]; // The callback is originally bound to the connect event in // Socket.prototype.connect. - var client = this.connect(orig, Socket, opts, done); + const client = this.connect(orig, Socket, opts, done); if (client.mitmServerSocket == null) { return client; } @@ -121,11 +121,11 @@ Mitm.prototype.tcpConnect = function (orig, opts, done) { }; Mitm.prototype.tlsConnect = function (orig, opts, done) { - var args = normalizeConnectArgs(slice(arguments, 1)); + const args = normalizeConnectArgs(slice(arguments, 1)); opts = args[0]; done = args[1]; - var client = this.connect(orig, TlsSocket, opts, done); + const client = this.connect(orig, TlsSocket, opts, done); if (client.mitmServerSocket == null) return client; if (done) client.once("secureConnect", done); diff --git a/lib/internal_socket.js b/lib/internal_socket.js index 2a8056f..3f00181 100644 --- a/lib/internal_socket.js +++ b/lib/internal_socket.js @@ -1,12 +1,13 @@ -var DuplexStream = require("stream").Duplex; -var uniqueId = 0; -var NO_ERROR = 0; -var STREAM_STATE; -var STREAM_BYTES_READ; +const DuplexStream = require("stream").Duplex; + +const NO_ERROR = 0; +let uniqueId = 0; +let STREAM_STATE; +let STREAM_BYTES_READ; exports = module.exports = InternalSocket; exports.pair = pair; -var UV_EOF = process.binding("uv").UV_EOF; +const UV_EOF = process.binding("uv").UV_EOF; STREAM_STATE = process.binding("stream_wrap").streamBaseState; STREAM_BYTES_READ = process.binding("stream_wrap").kReadBytesOrError; @@ -65,7 +66,7 @@ InternalSocket.prototype.getAsyncId = function () { }; InternalSocket.prototype._write = function (data, encoding, done) { - var remote = this.remote; + const remote = this.remote; process.nextTick(function () { remote.push(data, encoding); done(); @@ -76,7 +77,7 @@ InternalSocket.prototype._write = function (data, encoding, done) { // WritableStream expects _writev, internal/stream_base_commons.js calls // req.handle.writev directly. It's given a flat array of data+type pairs. InternalSocket.prototype.writev = function (_req, data) { - for (var i = 0; i < data.length; ++i) this._write(data[i], data[++i], noop); + for (let i = 0; i < data.length; ++i) this._write(data[i], data[++i], noop); return NO_ERROR; }; @@ -137,8 +138,8 @@ InternalSocket.prototype.close = function (done) { }; function pair() { - var a = Object.create(InternalSocket.prototype); - var b = Object.create(InternalSocket.prototype); + const a = Object.create(InternalSocket.prototype); + const b = Object.create(InternalSocket.prototype); return [InternalSocket.call(a, b), InternalSocket.call(b, a)]; } diff --git a/lib/socket.js b/lib/socket.js index 587311f..a88093d 100644 --- a/lib/socket.js +++ b/lib/socket.js @@ -1,4 +1,4 @@ -var Net = require("net"); +const Net = require("net"); module.exports = Socket; function Socket() { diff --git a/lib/stubs.js b/lib/stubs.js index 70c28a2..1d24d5a 100644 --- a/lib/stubs.js +++ b/lib/stubs.js @@ -10,6 +10,6 @@ Stubs.prototype.stub = function (obj, prop, value) { }; Stubs.prototype.restore = function () { - var stub; + let stub; while ((stub = this.pop())) stub[0][stub[1]] = stub[2]; }; diff --git a/lib/tls_socket.js b/lib/tls_socket.js index 4052ee6..3f98bae 100644 --- a/lib/tls_socket.js +++ b/lib/tls_socket.js @@ -1,6 +1,6 @@ -var Net = require("net"); -var Tls = require("tls"); -var Socket = require("./socket"); +const Tls = require("tls"); +const Socket = require("./socket"); + module.exports = TlsSocket; function TlsSocket() { diff --git a/test/index_test.js b/test/index_test.js index 25a2f10..42f9760 100644 --- a/test/index_test.js +++ b/test/index_test.js @@ -1,19 +1,19 @@ -var Net = require("net"); -var Tls = require("tls"); -var Http = require("http"); -var Https = require("https"); -var Transform = require("stream").Transform; -var EventEmitter = require("events").EventEmitter; - -var Sinon = require("sinon"); -var { suite } = require("uvu"); +const Net = require("net"); +const Tls = require("tls"); +const Http = require("http"); +const Https = require("https"); +const Transform = require("stream").Transform; +const EventEmitter = require("events").EventEmitter; + +const Sinon = require("sinon"); +const { suite } = require("uvu"); require("must/register"); -var IncomingMessage = Http.IncomingMessage; -var ServerResponse = Http.ServerResponse; -var ClientRequest = Http.ClientRequest; +const IncomingMessage = Http.IncomingMessage; +const ServerResponse = Http.ServerResponse; +const ClientRequest = Http.ClientRequest; -var Mitm = require(".."); +const Mitm = require(".."); const test = suite("Mitm"); let mitm; @@ -35,7 +35,7 @@ test("must return an instance of Mitm when called as a function", () => { function mustConnect(moduleName, module) { test(`${moduleName}: must return an instance of Net.Socket`, () => { - var socket = module.connect({ host: "foo", port: 80 }); + const socket = module.connect({ host: "foo", port: 80 }); socket.must.be.an.instanceof(Net.Socket); }); @@ -48,10 +48,10 @@ function mustConnect(moduleName, module) { }); test(`${moduleName}: must emit connect on Mitm`, () => { - var onConnect = Sinon.spy(); + const onConnect = Sinon.spy(); mitm.on("connect", onConnect); - var opts = { host: "foo" }; - var socket = module.connect(opts); + const opts = { host: "foo" }; + const socket = module.connect(opts); onConnect.callCount.must.equal(1); onConnect.firstCall.args[0].must.equal(socket); @@ -59,9 +59,9 @@ function mustConnect(moduleName, module) { }); test(`${moduleName}: must emit connect on Mitm with options object given host and port`, () => { - var onConnect = Sinon.spy(); + const onConnect = Sinon.spy(); mitm.on("connect", onConnect); - var socket = module.connect(9, "127.0.0.1"); + const socket = module.connect(9, "127.0.0.1"); onConnect.callCount.must.equal(1); onConnect.firstCall.args[0].must.equal(socket); @@ -69,10 +69,10 @@ function mustConnect(moduleName, module) { }); test(`${moduleName}: must emit connection on Mitm`, () => { - var onConnection = Sinon.spy(); + const onConnection = Sinon.spy(); mitm.on("connection", onConnection); - var opts = { host: "foo" }; - var socket = module.connect(opts); + const opts = { host: "foo" }; + const socket = module.connect(opts); onConnection.callCount.must.equal(1); onConnection.firstCall.args[0].must.be.an.instanceof(Net.Socket); @@ -82,7 +82,7 @@ function mustConnect(moduleName, module) { test(`${moduleName}: must emit connect on socket in next ticks`, () => { return new Promise((resolve) => { - var socket = module.connect({ host: "foo" }); + const socket = module.connect({ host: "foo" }); socket.on("connect", resolve); }); }); @@ -116,7 +116,7 @@ function mustConnect(moduleName, module) { mitm.on("connection", function (socket) { socket.end(); }); - var socket = module.connect({ host: "foo" }); + const socket = module.connect({ host: "foo" }); socket.on("close", resolve); }); }); @@ -127,18 +127,18 @@ function mustConnect(moduleName, module) { process.nextTick(socket.end.bind(socket)); }); - var socket = module.connect({ host: "foo" }); + const socket = module.connect({ host: "foo" }); socket.on("close", resolve); }); }); test(`${moduleName}: must intercept 127.0.0.1`, () => { return new Promise((resolve) => { - var server; + let server; mitm.on("connection", function (s) { server = s; }); - var client = module.connect({ host: "127.0.0.1" }); + const client = module.connect({ host: "127.0.0.1" }); server.write("Hello"); client.setEncoding("utf8"); @@ -168,8 +168,8 @@ function mustConnect(moduleName, module) { test(`${moduleName}: when bypassed must call original module.connect`, () => { mitm.disable(); - var connect = sinon.spy(module, "connect"); - var testMitm = Mitm(); + const connect = sinon.spy(module, "connect"); + const testMitm = Mitm(); testMitm.on("connect", function (client) { client.bypass(); }); @@ -191,8 +191,8 @@ function mustConnect(moduleName, module) { client.bypass(); }); - var onConnect = Sinon.spy(); - var client = module.connect({ host: "127.0.0.1", port: 9 }, onConnect); + const onConnect = Sinon.spy(); + const client = module.connect({ host: "127.0.0.1", port: 9 }, onConnect); client.on( "error", @@ -208,7 +208,7 @@ function mustConnect(moduleName, module) { mitm.on("connect", function (client) { client.bypass(); }); - var onConnection = Sinon.spy(); + const onConnection = Sinon.spy(); mitm.on("connection", onConnection); module.connect({ host: "127.0.0.1", port: 9 }).on("error", noop); onConnection.callCount.must.equal(0); @@ -218,7 +218,7 @@ function mustConnect(moduleName, module) { mustConnect("Net.connect", Net); test("Net.connect must not return an instance of Tls.TLSSocket", () => { - var client = Net.connect({ host: "foo", port: 80 }); + const client = Net.connect({ host: "foo", port: 80 }); client.must.not.be.an.instanceof(Tls.TLSSocket); }); @@ -232,7 +232,7 @@ test("Net.connect must not set the authorized property", () => { test("Net.connect must not emit secureConnect on client", () => { return new Promise((resolve) => { - var client = Net.connect({ host: "foo" }); + const client = Net.connect({ host: "foo" }); client.on("secureConnect", resolve); resolve(); }); @@ -240,7 +240,7 @@ test("Net.connect must not emit secureConnect on client", () => { test("Net.connect must not emit secureConnect on server", () => { return new Promise((resolve) => { - var server; + let server; mitm.on("connection", function (s) { server = s; }); @@ -252,11 +252,11 @@ test("Net.connect must not emit secureConnect on server", () => { test("Socket.prototype.write must write to client from server", () => { return new Promise((resolve) => { - var server; + let server; mitm.on("connection", function (s) { server = s; }); - var client = Net.connect({ host: "foo" }); + const client = Net.connect({ host: "foo" }); server.write("Hello ☺️"); client.setEncoding("utf8"); @@ -269,13 +269,13 @@ test("Socket.prototype.write must write to client from server", () => { test("Socket.prototype.write must write to client from server in the next tick", () => { return new Promise((resolve) => { - var server; + let server; mitm.on("connection", function (s) { server = s; }); - var client = Net.connect({ host: "foo" }); + const client = Net.connect({ host: "foo" }); - var ticked = false; + let ticked = false; client.once("data", () => { ticked.must.be.true(); resolve(); @@ -287,11 +287,11 @@ test("Socket.prototype.write must write to client from server in the next tick", test("Socket.prototype.write must write to server from client", () => { return new Promise((resolve) => { - var server; + let server; mitm.on("connection", function (s) { server = s; }); - var client = Net.connect({ host: "foo" }); + const client = Net.connect({ host: "foo" }); client.write("Hello ☺️"); server.setEncoding("utf8"); @@ -304,13 +304,13 @@ test("Socket.prototype.write must write to server from client", () => { test("Socket.prototype.write must write to server from client in the next tick", () => { return new Promise((resolve) => { - var server; + let server; mitm.on("connection", function (s) { server = s; }); - var client = Net.connect({ host: "foo" }); + const client = Net.connect({ host: "foo" }); - var ticked = false; + let ticked = false; server.once("data", () => { ticked.must.be.true(); resolve(); @@ -324,11 +324,11 @@ test("Socket.prototype.write must write to server from client in the next tick", // The test still passes for Node v0.10 and newer v0.11s, so let it be. test("Socket.prototype.write must write to server from client given binary", () => { return new Promise((resolve) => { - var server; + let server; mitm.on("connection", function (s) { server = s; }); - var client = Net.connect({ host: "foo" }); + const client = Net.connect({ host: "foo" }); client.write("Hello", "utf-8"); server.setEncoding("binary"); @@ -341,11 +341,11 @@ test("Socket.prototype.write must write to server from client given binary", () test("Socket.prototype.write must write to server from client given latin1", () => { return new Promise((resolve) => { - var server; + let server; mitm.on("connection", function (s) { server = s; }); - var client = Net.connect({ host: "foo" }); + const client = Net.connect({ host: "foo" }); client.write("Hello", "latin1"); server.setEncoding("latin1"); @@ -358,11 +358,11 @@ test("Socket.prototype.write must write to server from client given latin1", () test("Socket.prototype.write must write to server from client given a buffer", () => { return new Promise((resolve) => { - var server; + let server; mitm.on("connection", function (s) { server = s; }); - var client = Net.connect({ host: "foo" }); + const client = Net.connect({ host: "foo" }); client.write(Buffer.from("Hello", "utf-8")); process.nextTick(() => { @@ -374,11 +374,11 @@ test("Socket.prototype.write must write to server from client given a buffer", ( test("Socket.prototype.write must write to server from client given a UTF-8 string", () => { return new Promise((resolve) => { - var server; + let server; mitm.on("connection", function (s) { server = s; }); - var client = Net.connect({ host: "foo" }); + const client = Net.connect({ host: "foo" }); client.write("Hello", "utf8"); process.nextTick(() => { @@ -390,11 +390,11 @@ test("Socket.prototype.write must write to server from client given a UTF-8 stri test("Socket.prototype.write must write to server from client given a ASCII string", () => { return new Promise((resolve) => { - var server; + let server; mitm.on("connection", function (s) { server = s; }); - var client = Net.connect({ host: "foo" }); + const client = Net.connect({ host: "foo" }); client.write("Hello", "ascii"); process.nextTick(() => { @@ -406,11 +406,11 @@ test("Socket.prototype.write must write to server from client given a ASCII stri test("Socket.prototype.write must write to server from client given a UCS-2 string", () => { return new Promise((resolve) => { - var server; + let server; mitm.on("connection", function (s) { server = s; }); - var client = Net.connect({ host: "foo" }); + const client = Net.connect({ host: "foo" }); client.write("Hello", "ucs2"); process.nextTick(() => { @@ -426,11 +426,11 @@ test("Socket.prototype.write must write to server from client given a UCS-2 stri test("Socket.prototype.end() must emit end when closed on server", () => { return new Promise((resolve) => { - var server; + let server; mitm.on("connection", function (s) { server = s; }); - var client = Net.connect({ host: "foo" }); + const client = Net.connect({ host: "foo" }); server.end(); client.on("end", resolve); }); @@ -441,7 +441,7 @@ test("Socket.prototype.ref must allow calling on client", () => { }); test("Socket.prototype.ref must allow calling on server", () => { - var server; + let server; mitm.on("connection", function (s) { server = s; }); @@ -454,7 +454,7 @@ test("Socket.prototype.unref must allow calling on client", () => { }); test("Socket.prototype.unref must allow calling on server", () => { - var server; + let server; mitm.on("connection", function (s) { server = s; }); @@ -470,7 +470,7 @@ test("Socket.prototype.pipe must allow piping to itself", () => { server.pipe(new Upcase()).pipe(server); }); - var client = Net.connect({ host: "foo" }); + const client = Net.connect({ host: "foo" }); client.write("Hello"); client.setEncoding("utf8"); @@ -485,11 +485,11 @@ test("Socket.prototype.pipe must allow piping to itself", () => { // https://github.com/moll/node-mitm/issues/26 test("Socket.prototype.destroy must emit end when destroyed on server", () => { return new Promise((resolve) => { - var server; + let server; mitm.on("connection", function (s) { server = s; }); - var client = Net.connect({ host: "foo" }); + const client = Net.connect({ host: "foo" }); server.destroy(); client.on("end", resolve); }); @@ -515,14 +515,14 @@ test("Tls.connect must return an instance of Tls.TLSSocket given port and host", test("Tls.connect must emit secureConnect in next ticks", () => { return new Promise((resolve) => { - var socket = Tls.connect({ host: "foo" }); + const socket = Tls.connect({ host: "foo" }); socket.on("secureConnect", resolve); }); }); test("Tls.connect must emit secureConnect after connect in next ticks", () => { return new Promise((resolve) => { - var socket = Tls.connect({ host: "foo" }); + const socket = Tls.connect({ host: "foo" }); socket.on("connect", () => { socket.on("secureConnect", resolve); @@ -532,7 +532,7 @@ test("Tls.connect must emit secureConnect after connect in next ticks", () => { test("Tls.connect must not emit secureConnect on server", () => { return new Promise((resolve) => { - var server; + let server; mitm.on("connection", function (s) { server = s; }); @@ -544,9 +544,9 @@ test("Tls.connect must not emit secureConnect on server", () => { test("Tls.connect must call back on secureConnect", () => { return new Promise((resolve) => { - var connected = false; + let connected = false; - var client = Tls.connect({ host: "foo" }, () => { + const client = Tls.connect({ host: "foo" }, () => { connected.must.be.true(); resolve(); }); @@ -571,14 +571,14 @@ function mustRequest(context, request) { }); test(`${context}: must emit connect on Mitm`, () => { - var onConnect = Sinon.spy(); + const onConnect = Sinon.spy(); mitm.on("connect", onConnect); request({ host: "foo" }); onConnect.callCount.must.equal(1); }); test(`${context}: must emit connect on Mitm after multiple connections`, () => { - var onConnect = Sinon.spy(); + const onConnect = Sinon.spy(); mitm.on("connect", onConnect); request({ host: "foo" }); request({ host: "foo" }); @@ -587,14 +587,14 @@ function mustRequest(context, request) { }); test(`${context}: must emit connection on Mitm`, () => { - var onConnection = Sinon.spy(); + const onConnection = Sinon.spy(); mitm.on("connection", onConnection); request({ host: "foo" }); onConnection.callCount.must.equal(1); }); test(`${context}: must emit connection on Mitm after multiple connections`, () => { - var onConnection = Sinon.spy(); + const onConnection = Sinon.spy(); mitm.on("connection", onConnection); request({ host: "foo" }); request({ host: "foo" }); @@ -604,7 +604,7 @@ function mustRequest(context, request) { test(`${context}: must emit request on Mitm`, () => { return new Promise((resolve) => { - var client = request({ host: "foo" }); + const client = request({ host: "foo" }); client.end(); mitm.on("request", function (req, res) { @@ -633,7 +633,7 @@ function mustRequest(context, request) { test(`${context}: must emit socket on request in next ticks`, () => { return new Promise((resolve) => { - var client = request({ host: "foo" }); + const client = request({ host: "foo" }); client.on("socket", resolve); }); }); @@ -641,7 +641,7 @@ function mustRequest(context, request) { // https://github.com/moll/node-mitm/pull/25 test(`${context}: must emit connect after socket event`, () => { return new Promise((resolve) => { - var client = request({ host: "foo" }); + const client = request({ host: "foo" }); client.on("socket", function (socket) { socket.on("connect", resolve); @@ -667,7 +667,7 @@ function mustRequest(context, request) { mitm.on("connect", function (client) { client.bypass(); }); - var onRequest = Sinon.spy(); + const onRequest = Sinon.spy(); mitm.on("request", onRequest); request({ host: "127.0.0.1" }).on("error", function (_err) { onRequest.callCount.must.equal(0); @@ -683,7 +683,7 @@ mustRequest("Https.request", Https.request); // https://github.com/moll/node-mitm/pull/25 test("Https.request must emit secureConnect after socket event", () => { return new Promise((resolve) => { - var client = Https.request({ host: "foo" }); + const client = Https.request({ host: "foo" }); client.on("socket", function (socket) { socket.on("secureConnect", resolve); @@ -697,7 +697,7 @@ mustRequest("Using Http.Agent", function (opts) { test("Using Http.Agent must support keep-alive", () => { return new Promise((resolve) => { - var client = Http.request({ + const client = Http.request({ host: "foo", agent: new Http.Agent({ keepAlive: true }), }); @@ -735,7 +735,7 @@ test("IncomingMessage must have URL", () => { test("IncomingMessage must have headers", () => { return new Promise((resolve) => { - var req = Http.request({ host: "foo" }); + const req = Http.request({ host: "foo" }); req.setHeader("Content-Type", "application/json"); req.end(); @@ -748,7 +748,7 @@ test("IncomingMessage must have headers", () => { test("IncomingMessage must have body", () => { return new Promise((resolve) => { - var client = Http.request({ host: "foo", method: "POST" }); + const client = Http.request({ host: "foo", method: "POST" }); client.write("Hello"); mitm.on("request", function (req, _res) { @@ -805,7 +805,7 @@ test("ServerResponse must have a reference to the IncomingMessage", () => { test("ServerResponse.prototype.write must make clientRequest emit response", () => { return new Promise((resolve) => { - var req = Http.request({ host: "foo" }); + const req = Http.request({ host: "foo" }); req.end(); mitm.on("request", function (_req, res) { res.write("Test"); @@ -827,7 +827,7 @@ test("ServerResponse.prototype.write must call given callback", () => { test("ServerResponse.prototype.end must make ClientRequest emit response", () => { return new Promise((resolve) => { - var client = Http.request({ host: "foo" }); + const client = Http.request({ host: "foo" }); client.end(); mitm.on("request", function (_req, res) { res.end(); @@ -841,7 +841,7 @@ test("ServerResponse.prototype.end must make ClientRequest emit response", () => // later Node versions. test("ServerResponse.prototype.end must make IncomingMessage emit end", () => { return new Promise((resolve) => { - var client = Http.request({ host: "foo" }); + const client = Http.request({ host: "foo" }); client.end(); mitm.on("request", function (_req, res) { res.end(); From 8ffd11ba9b8bb1fbb1d3aec367b80d6f572a56b5 Mon Sep 17 00:00:00 2001 From: Gregor Martynus <39992+gr2m@users.noreply.github.com> Date: Sat, 4 Dec 2021 14:39:41 -0800 Subject: [PATCH 29/59] refactor: make it a native ES Module --- README.md | 4 +- index.js | 41 +++++---- lib/internal_socket.js | 8 +- lib/socket.js | 5 +- lib/stubs.js | 4 +- lib/tls_socket.js | 8 +- package.json | 3 +- test/index_test.js | 205 ++++++++++++++++++++--------------------- 8 files changed, 137 insertions(+), 141 deletions(-) diff --git a/README.md b/README.md index 23b1c72..766c0d3 100644 --- a/README.md +++ b/README.md @@ -125,7 +125,7 @@ Require Mitm.js and invoke it as a function to both create an instance of `Mitm` and enable intercepting: ```javascript -const Mitm = require("mitm"); +import Mitm from "mitm"; const mitm = Mitm(); ``` @@ -206,7 +206,7 @@ we can get Mitm.js to support that. #### Custom HTTP Methods -Unfortunately because [Node.js's web server doesn't seem to support custom HTTP methods](https://github.com/nodejs/node-v0.x-archive/issues/3192) (that is, ones beyond `require("http").METHODS`), Mitm.js doesn't support them out of the box either. The Node.js HTTP parser throws an error given a request with an unsupported method. However, as Mitm.js also supports intercepting at the TCP level, you could hook in your own HTTP parser. I've briefly alluded to it in [issue #63](https://github.com/moll/node-mitm/issues/63). +Unfortunately because [Node.js's web server doesn't seem to support custom HTTP methods](https://github.com/nodejs/node-v0.x-archive/issues/3192) (that is, ones beyond Node's `http.METHODS`), Mitm.js doesn't support them out of the box either. The Node.js HTTP parser throws an error given a request with an unsupported method. However, as Mitm.js also supports intercepting at the TCP level, you could hook in your own HTTP parser. I've briefly alluded to it in [issue #63](https://github.com/moll/node-mitm/issues/63). ### Bypassing interception diff --git a/index.js b/index.js index 5601db0..702c462 100644 --- a/index.js +++ b/index.js @@ -1,18 +1,25 @@ -const Net = require("net"); -const Tls = require("tls"); -const Http = require("http"); -const ClientRequest = Http.ClientRequest; -const Socket = require("./lib/socket"); -const TlsSocket = require("./lib/tls_socket"); -const EventEmitter = require("events").EventEmitter; -const InternalSocket = require("./lib/internal_socket"); -const Stubs = require("./lib/stubs"); +// Native Node APIs +import Net from "net"; +import Tls from "tls"; +import { ClientRequest, Agent } from "http"; +import { EventEmitter } from "events"; + +// Internal APIs +import { _connectionListener as createRequestAndResponse } from "http"; +import { _normalizeArgs as normalizeConnectArgs } from "net"; +import { IncomingMessage } from "_http_incoming"; +import { ServerResponse } from "_http_server"; +import { kIncomingMessage as incomingMessageKey } from "_http_common"; +import { kServerResponse as serverResponseKey } from "_http_server"; + +import Socket from "./lib/socket.js"; +import TlsSocket from "./lib/tls_socket.js"; +import { createInternalSocketPair } from "./lib/internal_socket.js"; +import Stubs from "./lib/stubs.js"; + const slice = Function.call.bind(Array.prototype.slice); -const normalizeConnectArgs = Net._normalizeArgs; -const createRequestAndResponse = Http._connectionListener; -module.exports = Mitm; -function Mitm() { +export default function Mitm() { if (!(this instanceof Mitm)) return Mitm.apply(Object.create(Mitm.prototype), arguments).enable(); @@ -29,10 +36,6 @@ Mitm.prototype.addListener = EventEmitter.prototype.addListener; Mitm.prototype.removeListener = EventEmitter.prototype.removeListener; Mitm.prototype.emit = EventEmitter.prototype.emit; -const IncomingMessage = require("_http_incoming").IncomingMessage; -const ServerResponse = require("_http_server").ServerResponse; -const incomingMessageKey = require("_http_common").kIncomingMessage; -const serverResponseKey = require("_http_server").kServerResponse; Mitm.prototype[serverResponseKey] = ServerResponse; Mitm.prototype[incomingMessageKey] = IncomingMessage; @@ -43,7 +46,7 @@ Mitm.prototype.enable = function () { this.stubs.stub(Net, "connect", netConnect); this.stubs.stub(Net, "createConnection", netConnect); - this.stubs.stub(Http.Agent.prototype, "createConnection", netConnect); + this.stubs.stub(Agent.prototype, "createConnection", netConnect); this.stubs.stub(Tls, "connect", tlsConnect); // ClientRequest.prototype.onSocket is called synchronously from @@ -64,7 +67,7 @@ Mitm.prototype.disable = function () { }; Mitm.prototype.connect = function connect(orig, Socket, opts, done) { - const sockets = InternalSocket.pair(); + const sockets = createInternalSocketPair(); // Don't set client.connecting to false because there's nothing setting it // back to false later. Originally that was done in Socket.prototype.connect diff --git a/lib/internal_socket.js b/lib/internal_socket.js index 3f00181..2229b51 100644 --- a/lib/internal_socket.js +++ b/lib/internal_socket.js @@ -1,11 +1,9 @@ -const DuplexStream = require("stream").Duplex; +import { Duplex as DuplexStream } from "stream"; const NO_ERROR = 0; let uniqueId = 0; let STREAM_STATE; let STREAM_BYTES_READ; -exports = module.exports = InternalSocket; -exports.pair = pair; const UV_EOF = process.binding("uv").UV_EOF; @@ -21,7 +19,7 @@ STREAM_BYTES_READ = process.binding("stream_wrap").kReadBytesOrError; * * InternalSocket is created for both the client side and the server side. */ -function InternalSocket(remote) { +export default function InternalSocket(remote) { DuplexStream.call(this); this.remote = remote; this.id = ++uniqueId; @@ -137,7 +135,7 @@ InternalSocket.prototype.close = function (done) { if (done) done(); }; -function pair() { +export function createInternalSocketPair() { const a = Object.create(InternalSocket.prototype); const b = Object.create(InternalSocket.prototype); return [InternalSocket.call(a, b), InternalSocket.call(b, a)]; diff --git a/lib/socket.js b/lib/socket.js index a88093d..e367752 100644 --- a/lib/socket.js +++ b/lib/socket.js @@ -1,7 +1,6 @@ -const Net = require("net"); -module.exports = Socket; +import Net from "net"; -function Socket() { +export default function Socket() { Net.Socket.apply(this, arguments); } diff --git a/lib/stubs.js b/lib/stubs.js index 1d24d5a..a33c555 100644 --- a/lib/stubs.js +++ b/lib/stubs.js @@ -1,6 +1,4 @@ -module.exports = Stubs; - -function Stubs() {} +export default function Stubs() {} Stubs.prototype = Object.create(Array.prototype); diff --git a/lib/tls_socket.js b/lib/tls_socket.js index 3f98bae..1530977 100644 --- a/lib/tls_socket.js +++ b/lib/tls_socket.js @@ -1,13 +1,13 @@ -const Tls = require("tls"); -const Socket = require("./socket"); +import { TLSSocket } from "tls"; +import Socket from "./socket.js"; -module.exports = TlsSocket; +export default TlsSocket; function TlsSocket() { Socket.apply(this, arguments); } -TlsSocket.prototype = Object.create(Tls.TLSSocket.prototype, { +TlsSocket.prototype = Object.create(TLSSocket.prototype, { constructor: { value: TlsSocket, configurable: true, writeable: true }, }); diff --git a/package.json b/package.json index 66f6449..4135832 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,7 @@ { "name": "mitm", "version": "1.7.2", + "type": "module", "description": "Intercept and mock outgoing network TCP connections and HTTP requests for testing. Intercepts and gives you a Net.Socket, Http.IncomingMessage and Http.ServerResponse to test and respond with. Useful when testing code that hits remote servers.", "keywords": [ "http", @@ -31,7 +32,7 @@ "url": "https://github.com/moll/node-mitm/blob/master/LICENSE" } ], - "main": "index.js", + "exports": "./index.js", "scripts": { "coverage": "nyc report --reporter html && open coverage/index.html", "lint": "prettier --check \"{lib,test}/**/*.{js,json,ts}\" \"*.{js,json,md}\"", diff --git a/test/index_test.js b/test/index_test.js index 42f9760..15eac85 100644 --- a/test/index_test.js +++ b/test/index_test.js @@ -1,19 +1,15 @@ -const Net = require("net"); -const Tls = require("tls"); -const Http = require("http"); -const Https = require("https"); -const Transform = require("stream").Transform; -const EventEmitter = require("events").EventEmitter; +import net from "net"; +import tls from "tls"; +import http from "http"; +import https from "https"; +import stream from "stream"; +import { EventEmitter } from "events"; -const Sinon = require("sinon"); -const { suite } = require("uvu"); -require("must/register"); +import Sinon from "sinon"; +import { suite } from "uvu"; +import "must/register.js"; -const IncomingMessage = Http.IncomingMessage; -const ServerResponse = Http.ServerResponse; -const ClientRequest = Http.ClientRequest; - -const Mitm = require(".."); +import Mitm from "../index.js"; const test = suite("Mitm"); let mitm; @@ -34,17 +30,17 @@ test("must return an instance of Mitm when called as a function", () => { }); function mustConnect(moduleName, module) { - test(`${moduleName}: must return an instance of Net.Socket`, () => { + test(`${moduleName}: must return an instance of net.Socket`, () => { const socket = module.connect({ host: "foo", port: 80 }); - socket.must.be.an.instanceof(Net.Socket); + socket.must.be.an.instanceof(net.Socket); }); - test(`${moduleName}: must return an instance of Net.Socket given port`, () => { - module.connect(80).must.be.an.instanceof(Net.Socket); + test(`${moduleName}: must return an instance of net.Socket given port`, () => { + module.connect(80).must.be.an.instanceof(net.Socket); }); - test(`${moduleName}: must return an instance of Net.Socket given port and host`, () => { - module.connect(80, "10.0.0.1").must.be.an.instanceof(Net.Socket); + test(`${moduleName}: must return an instance of net.Socket given port and host`, () => { + module.connect(80, "10.0.0.1").must.be.an.instanceof(net.Socket); }); test(`${moduleName}: must emit connect on Mitm`, () => { @@ -75,7 +71,7 @@ function mustConnect(moduleName, module) { const socket = module.connect(opts); onConnection.callCount.must.equal(1); - onConnection.firstCall.args[0].must.be.an.instanceof(Net.Socket); + onConnection.firstCall.args[0].must.be.an.instanceof(net.Socket); onConnection.firstCall.args[0].must.not.equal(socket); onConnection.firstCall.args[1].must.equal(opts); }); @@ -215,36 +211,36 @@ function mustConnect(moduleName, module) { }); } -mustConnect("Net.connect", Net); +mustConnect("net.connect", net); -test("Net.connect must not return an instance of Tls.TLSSocket", () => { - const client = Net.connect({ host: "foo", port: 80 }); - client.must.not.be.an.instanceof(Tls.TLSSocket); +test("net.connect must not return an instance of tls.TLSSocket", () => { + const client = net.connect({ host: "foo", port: 80 }); + client.must.not.be.an.instanceof(tls.TLSSocket); }); -test("Net.connect must not set the encrypted property", () => { - Net.connect({ host: "foo" }).must.not.have.property("encrypted"); +test("net.connect must not set the encrypted property", () => { + net.connect({ host: "foo" }).must.not.have.property("encrypted"); }); -test("Net.connect must not set the authorized property", () => { - Net.connect({ host: "foo" }).must.not.have.property("authorized"); +test("net.connect must not set the authorized property", () => { + net.connect({ host: "foo" }).must.not.have.property("authorized"); }); -test("Net.connect must not emit secureConnect on client", () => { +test("net.connect must not emit secureConnect on client", () => { return new Promise((resolve) => { - const client = Net.connect({ host: "foo" }); + const client = net.connect({ host: "foo" }); client.on("secureConnect", resolve); resolve(); }); }); -test("Net.connect must not emit secureConnect on server", () => { +test("net.connect must not emit secureConnect on server", () => { return new Promise((resolve) => { let server; mitm.on("connection", function (s) { server = s; }); - Net.connect({ host: "foo" }); + net.connect({ host: "foo" }); server.on("secureConnect", resolve); resolve(); }); @@ -256,7 +252,7 @@ test("Socket.prototype.write must write to client from server", () => { mitm.on("connection", function (s) { server = s; }); - const client = Net.connect({ host: "foo" }); + const client = net.connect({ host: "foo" }); server.write("Hello ☺️"); client.setEncoding("utf8"); @@ -273,7 +269,7 @@ test("Socket.prototype.write must write to client from server in the next tick", mitm.on("connection", function (s) { server = s; }); - const client = Net.connect({ host: "foo" }); + const client = net.connect({ host: "foo" }); let ticked = false; client.once("data", () => { @@ -291,7 +287,7 @@ test("Socket.prototype.write must write to server from client", () => { mitm.on("connection", function (s) { server = s; }); - const client = Net.connect({ host: "foo" }); + const client = net.connect({ host: "foo" }); client.write("Hello ☺️"); server.setEncoding("utf8"); @@ -308,7 +304,7 @@ test("Socket.prototype.write must write to server from client in the next tick", mitm.on("connection", function (s) { server = s; }); - const client = Net.connect({ host: "foo" }); + const client = net.connect({ host: "foo" }); let ticked = false; server.once("data", () => { @@ -328,7 +324,7 @@ test("Socket.prototype.write must write to server from client given binary", () mitm.on("connection", function (s) { server = s; }); - const client = Net.connect({ host: "foo" }); + const client = net.connect({ host: "foo" }); client.write("Hello", "utf-8"); server.setEncoding("binary"); @@ -345,7 +341,7 @@ test("Socket.prototype.write must write to server from client given latin1", () mitm.on("connection", function (s) { server = s; }); - const client = Net.connect({ host: "foo" }); + const client = net.connect({ host: "foo" }); client.write("Hello", "latin1"); server.setEncoding("latin1"); @@ -362,7 +358,7 @@ test("Socket.prototype.write must write to server from client given a buffer", ( mitm.on("connection", function (s) { server = s; }); - const client = Net.connect({ host: "foo" }); + const client = net.connect({ host: "foo" }); client.write(Buffer.from("Hello", "utf-8")); process.nextTick(() => { @@ -378,7 +374,7 @@ test("Socket.prototype.write must write to server from client given a UTF-8 stri mitm.on("connection", function (s) { server = s; }); - const client = Net.connect({ host: "foo" }); + const client = net.connect({ host: "foo" }); client.write("Hello", "utf8"); process.nextTick(() => { @@ -394,7 +390,7 @@ test("Socket.prototype.write must write to server from client given a ASCII stri mitm.on("connection", function (s) { server = s; }); - const client = Net.connect({ host: "foo" }); + const client = net.connect({ host: "foo" }); client.write("Hello", "ascii"); process.nextTick(() => { @@ -410,7 +406,7 @@ test("Socket.prototype.write must write to server from client given a UCS-2 stri mitm.on("connection", function (s) { server = s; }); - const client = Net.connect({ host: "foo" }); + const client = net.connect({ host: "foo" }); client.write("Hello", "ucs2"); process.nextTick(() => { @@ -430,14 +426,14 @@ test("Socket.prototype.end() must emit end when closed on server", () => { mitm.on("connection", function (s) { server = s; }); - const client = Net.connect({ host: "foo" }); + const client = net.connect({ host: "foo" }); server.end(); client.on("end", resolve); }); }); test("Socket.prototype.ref must allow calling on client", () => { - Net.connect({ host: "foo" }).ref(); + net.connect({ host: "foo" }).ref(); }); test("Socket.prototype.ref must allow calling on server", () => { @@ -445,12 +441,12 @@ test("Socket.prototype.ref must allow calling on server", () => { mitm.on("connection", function (s) { server = s; }); - Net.connect({ host: "foo" }); + net.connect({ host: "foo" }); server.ref(); }); test("Socket.prototype.unref must allow calling on client", () => { - Net.connect({ host: "foo" }).unref(); + net.connect({ host: "foo" }).unref(); }); test("Socket.prototype.unref must allow calling on server", () => { @@ -458,7 +454,7 @@ test("Socket.prototype.unref must allow calling on server", () => { mitm.on("connection", function (s) { server = s; }); - Net.connect({ host: "foo" }); + net.connect({ host: "foo" }); server.unref(); }); @@ -470,7 +466,7 @@ test("Socket.prototype.pipe must allow piping to itself", () => { server.pipe(new Upcase()).pipe(server); }); - const client = Net.connect({ host: "foo" }); + const client = net.connect({ host: "foo" }); client.write("Hello"); client.setEncoding("utf8"); @@ -489,40 +485,40 @@ test("Socket.prototype.destroy must emit end when destroyed on server", () => { mitm.on("connection", function (s) { server = s; }); - const client = Net.connect({ host: "foo" }); + const client = net.connect({ host: "foo" }); server.destroy(); client.on("end", resolve); }); }); -test("Net.createConnection must be equal to Net.connect", () => { - Net.createConnection.must.equal(Net.connect); +test("net.createConnection must be equal to net.connect", () => { + net.createConnection.must.equal(net.connect); }); -mustConnect("Tls.connect", Tls); +mustConnect("tls.connect", tls); -test("Tls.connect must return an instance of Tls.TLSSocket", () => { - Tls.connect({ host: "foo", port: 80 }).must.be.an.instanceof(Tls.TLSSocket); +test("tls.connect must return an instance of tls.TLSSocket", () => { + tls.connect({ host: "foo", port: 80 }).must.be.an.instanceof(tls.TLSSocket); }); -test("Tls.connect must return an instance of Tls.TLSSocket given port", () => { - Tls.connect(80).must.be.an.instanceof(Tls.TLSSocket); +test("tls.connect must return an instance of tls.TLSSocket given port", () => { + tls.connect(80).must.be.an.instanceof(tls.TLSSocket); }); -test("Tls.connect must return an instance of Tls.TLSSocket given port and host", () => { - Tls.connect(80, "10.0.0.1").must.be.an.instanceof(Tls.TLSSocket); +test("tls.connect must return an instance of tls.TLSSocket given port and host", () => { + tls.connect(80, "10.0.0.1").must.be.an.instanceof(tls.TLSSocket); }); -test("Tls.connect must emit secureConnect in next ticks", () => { +test("tls.connect must emit secureConnect in next ticks", () => { return new Promise((resolve) => { - const socket = Tls.connect({ host: "foo" }); + const socket = tls.connect({ host: "foo" }); socket.on("secureConnect", resolve); }); }); -test("Tls.connect must emit secureConnect after connect in next ticks", () => { +test("tls.connect must emit secureConnect after connect in next ticks", () => { return new Promise((resolve) => { - const socket = Tls.connect({ host: "foo" }); + const socket = tls.connect({ host: "foo" }); socket.on("connect", () => { socket.on("secureConnect", resolve); @@ -530,23 +526,23 @@ test("Tls.connect must emit secureConnect after connect in next ticks", () => { }); }); -test("Tls.connect must not emit secureConnect on server", () => { +test("tls.connect must not emit secureConnect on server", () => { return new Promise((resolve) => { let server; mitm.on("connection", function (s) { server = s; }); - Tls.connect({ host: "foo" }); + tls.connect({ host: "foo" }); server.on("secureConnect", resolve); resolve(); }); }); -test("Tls.connect must call back on secureConnect", () => { +test("tls.connect must call back on secureConnect", () => { return new Promise((resolve) => { let connected = false; - const client = Tls.connect({ host: "foo" }, () => { + const client = tls.connect({ host: "foo" }, () => { connected.must.be.true(); resolve(); }); @@ -557,17 +553,17 @@ test("Tls.connect must call back on secureConnect", () => { }); }); -test("Tls.connect must set encrypted true", () => { - Tls.connect({ host: "foo" }).encrypted.must.be.true(); +test("tls.connect must set encrypted true", () => { + tls.connect({ host: "foo" }).encrypted.must.be.true(); }); -test("Tls.connect must set authorized true", () => { - Tls.connect({ host: "foo" }).authorized.must.be.true(); +test("tls.connect must set authorized true", () => { + tls.connect({ host: "foo" }).authorized.must.be.true(); }); function mustRequest(context, request) { - test(`${context}: must return ClientRequest`, () => { - request({ host: "foo" }).must.be.an.instanceof(ClientRequest); + test(`${context}: must return http.ClientRequest`, () => { + request({ host: "foo" }).must.be.an.instanceof(http.ClientRequest); }); test(`${context}: must emit connect on Mitm`, () => { @@ -608,9 +604,9 @@ function mustRequest(context, request) { client.end(); mitm.on("request", function (req, res) { - req.must.be.an.instanceof(IncomingMessage); + req.must.be.an.instanceof(http.IncomingMessage); req.must.not.equal(client); - res.must.be.an.instanceof(ServerResponse); + res.must.be.an.instanceof(http.ServerResponse); resolve(); }); }); @@ -677,13 +673,13 @@ function mustRequest(context, request) { }); } -mustRequest("Http.request", Http.request); -mustRequest("Https.request", Https.request); +mustRequest("Http.request", http.request); +mustRequest("Https.request", https.request); // https://github.com/moll/node-mitm/pull/25 test("Https.request must emit secureConnect after socket event", () => { return new Promise((resolve) => { - const client = Https.request({ host: "foo" }); + const client = https.request({ host: "foo" }); client.on("socket", function (socket) { socket.on("secureConnect", resolve); @@ -692,14 +688,14 @@ test("Https.request must emit secureConnect after socket event", () => { }); mustRequest("Using Http.Agent", function (opts) { - return Http.request({ agent: new Http.Agent(), ...opts }); + return http.request({ agent: new http.Agent(), ...opts }); }); test("Using Http.Agent must support keep-alive", () => { return new Promise((resolve) => { - const client = Http.request({ + const client = http.request({ host: "foo", - agent: new Http.Agent({ keepAlive: true }), + agent: new http.Agent({ keepAlive: true }), }); client.end(); @@ -719,12 +715,12 @@ test("Using Http.Agent must support keep-alive", () => { }); mustRequest("Using Https.Agent", function (opts) { - return Https.request({ agent: new Https.Agent(), ...opts }); + return https.request({ agent: new https.Agent(), ...opts }); }); -test("IncomingMessage must have URL", () => { +test("http.IncomingMessage must have URL", () => { return new Promise((resolve) => { - Http.request({ host: "foo", path: "/foo" }).end(); + http.request({ host: "foo", path: "/foo" }).end(); mitm.on("request", function (req) { req.url.must.equal("/foo"); @@ -733,9 +729,9 @@ test("IncomingMessage must have URL", () => { }); }); -test("IncomingMessage must have headers", () => { +test("http.IncomingMessage must have headers", () => { return new Promise((resolve) => { - const req = Http.request({ host: "foo" }); + const req = http.request({ host: "foo" }); req.setHeader("Content-Type", "application/json"); req.end(); @@ -746,9 +742,9 @@ test("IncomingMessage must have headers", () => { }); }); -test("IncomingMessage must have body", () => { +test("http.IncomingMessage must have body", () => { return new Promise((resolve) => { - const client = Http.request({ host: "foo", method: "POST" }); + const client = http.request({ host: "foo", method: "POST" }); client.write("Hello"); mitm.on("request", function (req, _res) { @@ -761,9 +757,9 @@ test("IncomingMessage must have body", () => { }); }); -test("IncomingMessage must have a reference to the ServerResponse", () => { +test("http.IncomingMessage must have a reference to the http.ServerResponse", () => { return new Promise((resolve) => { - Http.request({ host: "foo", method: "POST" }).end(); + http.request({ host: "foo", method: "POST" }).end(); mitm.on("request", function (req, res) { req.res.must.equal(res); }); @@ -771,7 +767,7 @@ test("IncomingMessage must have a reference to the ServerResponse", () => { }); }); -test("ServerResponse must respond with status, headers and body", () => { +test("http.ServerResponse must respond with status, headers and body", () => { return new Promise((resolve) => { mitm.on("request", function (_req, res) { res.statusCode = 442; @@ -779,7 +775,8 @@ test("ServerResponse must respond with status, headers and body", () => { res.end("Hi!"); }); - Http.request({ host: "foo" }) + http + .request({ host: "foo" }) .on("response", function (res) { res.statusCode.must.equal(442); res.headers["content-type"].must.equal("application/json"); @@ -793,9 +790,9 @@ test("ServerResponse must respond with status, headers and body", () => { }); }); -test("ServerResponse must have a reference to the IncomingMessage", () => { +test("http.ServerResponse must have a reference to the http.IncomingMessage", () => { return new Promise((resolve) => { - Http.request({ host: "foo", method: "POST" }).end(); + http.request({ host: "foo", method: "POST" }).end(); mitm.on("request", function (req, res) { res.req.must.equal(req); }); @@ -803,9 +800,9 @@ test("ServerResponse must have a reference to the IncomingMessage", () => { }); }); -test("ServerResponse.prototype.write must make clientRequest emit response", () => { +test("http.ServerResponse.prototype.write must make clientRequest emit response", () => { return new Promise((resolve) => { - const req = Http.request({ host: "foo" }); + const req = http.request({ host: "foo" }); req.end(); mitm.on("request", function (_req, res) { res.write("Test"); @@ -816,18 +813,18 @@ test("ServerResponse.prototype.write must make clientRequest emit response", () // Under Node v0.10 it's the writeQueueSize that's checked to see if // the callback can be called. -test("ServerResponse.prototype.write must call given callback", () => { +test("http.ServerResponse.prototype.write must call given callback", () => { return new Promise((resolve) => { - Http.request({ host: "foo" }).end(); + http.request({ host: "foo" }).end(); mitm.on("request", function (_req, res) { res.write("Test", resolve); }); }); }); -test("ServerResponse.prototype.end must make ClientRequest emit response", () => { +test("http.ServerResponse.prototype.end must make http.ClientRequest emit response", () => { return new Promise((resolve) => { - const client = Http.request({ host: "foo" }); + const client = http.request({ host: "foo" }); client.end(); mitm.on("request", function (_req, res) { res.end(); @@ -839,9 +836,9 @@ test("ServerResponse.prototype.end must make ClientRequest emit response", () => // In an app of mine Node v0.11.7 did not emit the end event, but // v0.11.11 did. I'll investigate properly if this becomes a problem in // later Node versions. -test("ServerResponse.prototype.end must make IncomingMessage emit end", () => { +test("http.ServerResponse.prototype.end must make http.IncomingMessage emit end", () => { return new Promise((resolve) => { - const client = Http.request({ host: "foo" }); + const client = http.request({ host: "foo" }); client.end(); mitm.on("request", function (_req, res) { res.end(); @@ -865,10 +862,10 @@ test("Mitm.prototype.off must be an alias to EventEmitter.prototype.removeListe test.run(); function Upcase() { - Transform.call(this, arguments); + stream.Transform.call(this, arguments); } -Upcase.prototype = Object.create(Transform.prototype, { +Upcase.prototype = Object.create(stream.Transform.prototype, { constructor: { value: Upcase, configurable: true, writeable: true }, }); From 0785d597d66c4e1405a2cccb75e0baaa99d54dc5 Mon Sep 17 00:00:00 2001 From: Gregor Martynus <39992+gr2m@users.noreply.github.com> Date: Sat, 4 Dec 2021 14:41:31 -0800 Subject: [PATCH 30/59] refactor: use rest spread instead of Array.prototype.slice on arguments --- index.js | 14 ++++---------- 1 file changed, 4 insertions(+), 10 deletions(-) diff --git a/index.js b/index.js index 702c462..b54938d 100644 --- a/index.js +++ b/index.js @@ -17,8 +17,6 @@ import TlsSocket from "./lib/tls_socket.js"; import { createInternalSocketPair } from "./lib/internal_socket.js"; import Stubs from "./lib/stubs.js"; -const slice = Function.call.bind(Array.prototype.slice); - export default function Mitm() { if (!(this instanceof Mitm)) return Mitm.apply(Object.create(Mitm.prototype), arguments).enable(); @@ -107,10 +105,8 @@ Mitm.prototype.connect = function connect(orig, Socket, opts, done) { return client; }; -Mitm.prototype.tcpConnect = function (orig, opts, done) { - const args = normalizeConnectArgs(slice(arguments, 1)); - opts = args[0]; - done = args[1]; +Mitm.prototype.tcpConnect = function (orig, ...args) { + const [opts, done] = normalizeConnectArgs(args); // The callback is originally bound to the connect event in // Socket.prototype.connect. @@ -123,10 +119,8 @@ Mitm.prototype.tcpConnect = function (orig, opts, done) { return client; }; -Mitm.prototype.tlsConnect = function (orig, opts, done) { - const args = normalizeConnectArgs(slice(arguments, 1)); - opts = args[0]; - done = args[1]; +Mitm.prototype.tlsConnect = function (orig, ...args) { + const [opts, done] = normalizeConnectArgs(args); const client = this.connect(orig, TlsSocket, opts, done); if (client.mitmServerSocket == null) return client; From cbe84cf1c31feec1dcd2025d54546e49ede35a6d Mon Sep 17 00:00:00 2001 From: Gregor Martynus <39992+gr2m@users.noreply.github.com> Date: Sat, 4 Dec 2021 15:08:07 -0800 Subject: [PATCH 31/59] refactor: make Mitm a Class --- index.js | 225 ++++++++++++++++++++++----------------------- test/index_test.js | 8 +- 2 files changed, 115 insertions(+), 118 deletions(-) diff --git a/index.js b/index.js index b54938d..074e0c4 100644 --- a/index.js +++ b/index.js @@ -1,15 +1,21 @@ -// Native Node APIs +// @ts-check + import Net from "net"; import Tls from "tls"; import { ClientRequest, Agent } from "http"; import { EventEmitter } from "events"; -// Internal APIs +// @ts-expect-error - internal API import { _connectionListener as createRequestAndResponse } from "http"; +// @ts-expect-error - internal API import { _normalizeArgs as normalizeConnectArgs } from "net"; +// @ts-expect-error - internal API import { IncomingMessage } from "_http_incoming"; +// @ts-expect-error - internal API import { ServerResponse } from "_http_server"; +// @ts-expect-error - internal API import { kIncomingMessage as incomingMessageKey } from "_http_common"; +// @ts-expect-error - internal API import { kServerResponse as serverResponseKey } from "_http_server"; import Socket from "./lib/socket.js"; @@ -17,128 +23,121 @@ import TlsSocket from "./lib/tls_socket.js"; import { createInternalSocketPair } from "./lib/internal_socket.js"; import Stubs from "./lib/stubs.js"; -export default function Mitm() { - if (!(this instanceof Mitm)) - return Mitm.apply(Object.create(Mitm.prototype), arguments).enable(); +export default class Mitm extends EventEmitter { + constructor() { + super(); - this.stubs = new Stubs(); - this.on("request", addCrossReferences); + this.stubs = new Stubs(); - return this; -} + // add cross-reference + this.on("request", (request, response) => { + request.res = response; + response.req = request; + }); + + this[serverResponseKey] = ServerResponse; + this[incomingMessageKey] = IncomingMessage; + + this.enable(); + } + + enable() { + // Connect is called synchronously. + const netConnect = this.tcpConnect.bind(this, Net.connect); + const tlsConnect = this.tlsConnect.bind(this, Tls.connect); + + this.stubs.stub(Net, "connect", netConnect); + this.stubs.stub(Net, "createConnection", netConnect); + this.stubs.stub(Agent.prototype, "createConnection", netConnect); + this.stubs.stub(Tls, "connect", tlsConnect); + + // ClientRequest.prototype.onSocket is called synchronously from ClientRequest's constructor + // and is a convenient place to hook into new ClientRequest instances. + const origOnSocket = ClientRequest.prototype.onSocket; + const self = this; + this.stubs.stub(ClientRequest.prototype, "onSocket", function (socket) { + origOnSocket.call(this, socket); + self.request(socket); + }); + + return this; + } + + disable() { + return this.stubs.restore(), this; + } + + connect(orig, Socket, opts, done) { + const sockets = createInternalSocketPair(); + + // Don't set client.connecting to false because there's nothing setting it + // back to false later. Originally that was done in Socket.prototype.connect + // and its afterConnect handler, but we're not calling that. + const client = new Socket({ + handle: sockets[0], + + // Node v10 expects readable and writable to be set at Socket creation time. + readable: true, + writable: true, + + ...opts, + }); + + this.emit("connect", client, opts); + if (client.bypassed) return orig.call(this, opts, done); + + // Don't use just "server" because socket.server is used in Node v8.12 and + // Node v9.6 and later for modifying the HTTP server response and parser + // classes. If unset, it's set to the used HTTP server (Mitm instance in our + // case) in _http_server.js. + // See also: https://github.com/nodejs/node/issues/13435. + const server = (client.mitmServerSocket = new Socket({ + handle: sockets[1], + readable: true, + writable: true, + })); + + this.emit("connection", server, opts); + + // Ensure connect is emitted in next ticks, otherwise it would be impossible + // to listen to it after calling Net.connect or listening to it after the + // ClientRequest emits "socket". + setTimeout(client.emit.bind(client, "connect")); + setTimeout(server.emit.bind(server, "connect")); -Mitm.prototype.on = EventEmitter.prototype.on; -Mitm.prototype.once = EventEmitter.prototype.once; -Mitm.prototype.off = EventEmitter.prototype.removeListener; -Mitm.prototype.addListener = EventEmitter.prototype.addListener; -Mitm.prototype.removeListener = EventEmitter.prototype.removeListener; -Mitm.prototype.emit = EventEmitter.prototype.emit; - -Mitm.prototype[serverResponseKey] = ServerResponse; -Mitm.prototype[incomingMessageKey] = IncomingMessage; - -Mitm.prototype.enable = function () { - // Connect is called synchronously. - const netConnect = this.tcpConnect.bind(this, Net.connect); - const tlsConnect = this.tlsConnect.bind(this, Tls.connect); - - this.stubs.stub(Net, "connect", netConnect); - this.stubs.stub(Net, "createConnection", netConnect); - this.stubs.stub(Agent.prototype, "createConnection", netConnect); - this.stubs.stub(Tls, "connect", tlsConnect); - - // ClientRequest.prototype.onSocket is called synchronously from - // ClientRequest's constructor and is a convenient place to hook into new - // ClientRequests. - const origOnSocket = ClientRequest.prototype.onSocket; - const self = this; - this.stubs.stub(ClientRequest.prototype, "onSocket", function (socket) { - origOnSocket.call(this, socket); - self.request(socket); - }); - - return this; -}; - -Mitm.prototype.disable = function () { - return this.stubs.restore(), this; -}; - -Mitm.prototype.connect = function connect(orig, Socket, opts, done) { - const sockets = createInternalSocketPair(); - - // Don't set client.connecting to false because there's nothing setting it - // back to false later. Originally that was done in Socket.prototype.connect - // and its afterConnect handler, but we're not calling that. - const client = new Socket({ - handle: sockets[0], - - // Node v10 expects readable and writable to be set at Socket creation time. - readable: true, - writable: true, - - ...opts, - }); - - this.emit("connect", client, opts); - if (client.bypassed) return orig.call(this, opts, done); - - // Don't use just "server" because socket.server is used in Node v8.12 and - // Node v9.6 and later for modifying the HTTP server response and parser - // classes. If unset, it's set to the used HTTP server (Mitm instance in our - // case) in _http_server.js. - // See also: https://github.com/nodejs/node/issues/13435. - const server = (client.mitmServerSocket = new Socket({ - handle: sockets[1], - readable: true, - writable: true, - })); - - this.emit("connection", server, opts); - - // Ensure connect is emitted in next ticks, otherwise it would be impossible - // to listen to it after calling Net.connect or listening to it after the - // ClientRequest emits "socket". - setTimeout(client.emit.bind(client, "connect")); - setTimeout(server.emit.bind(server, "connect")); - - return client; -}; - -Mitm.prototype.tcpConnect = function (orig, ...args) { - const [opts, done] = normalizeConnectArgs(args); - - // The callback is originally bound to the connect event in - // Socket.prototype.connect. - const client = this.connect(orig, Socket, opts, done); - if (client.mitmServerSocket == null) { return client; } - if (done) client.once("connect", done); - return client; -}; + tcpConnect(orig, ...args) { + const [opts, done] = normalizeConnectArgs(args); -Mitm.prototype.tlsConnect = function (orig, ...args) { - const [opts, done] = normalizeConnectArgs(args); + // The callback is originally bound to the connect event in + // Socket.prototype.connect. + const client = this.connect(orig, Socket, opts, done); + if (client.mitmServerSocket == null) { + return client; + } + if (done) client.once("connect", done); - const client = this.connect(orig, TlsSocket, opts, done); - if (client.mitmServerSocket == null) return client; - if (done) client.once("secureConnect", done); + return client; + } - setTimeout(client.emit.bind(client, "secureConnect")); + tlsConnect(orig, ...args) { + const [opts, done] = normalizeConnectArgs(args); - return client; -}; + const client = this.connect(orig, TlsSocket, opts, done); + if (client.mitmServerSocket == null) return client; + if (done) client.once("secureConnect", done); -Mitm.prototype.request = function request(socket) { - if (!socket.mitmServerSocket) return socket; + setTimeout(client.emit.bind(client, "secureConnect")); - createRequestAndResponse.call(this, socket.mitmServerSocket); - return socket; -}; + return client; + } -function addCrossReferences(req, res) { - req.res = res; - res.req = req; + request(socket) { + if (!socket.mitmServerSocket) return socket; + + createRequestAndResponse.call(this, socket.mitmServerSocket); + return socket; + } } diff --git a/test/index_test.js b/test/index_test.js index 15eac85..266cadd 100644 --- a/test/index_test.js +++ b/test/index_test.js @@ -6,18 +6,16 @@ import stream from "stream"; import { EventEmitter } from "events"; import Sinon from "sinon"; -import { suite } from "uvu"; +import { test } from "uvu"; import "must/register.js"; import Mitm from "../index.js"; -const test = suite("Mitm"); let mitm; let sinon; test.before.each(() => { - Mitm.passthrough = false; - mitm = Mitm(); + mitm = new Mitm(); sinon = Sinon.sandbox.create(); }); test.after.each(() => { @@ -165,7 +163,7 @@ function mustConnect(moduleName, module) { mitm.disable(); const connect = sinon.spy(module, "connect"); - const testMitm = Mitm(); + const testMitm = new Mitm(); testMitm.on("connect", function (client) { client.bypass(); }); From 6a897df218d1516c3485a4b1404ab35de54b5054 Mon Sep 17 00:00:00 2001 From: Gregor Martynus <39992+gr2m@users.noreply.github.com> Date: Sun, 5 Dec 2021 10:52:34 -0800 Subject: [PATCH 32/59] refactor: rewrite `lib/socket.js` and `lib/tls_socket.js` using classes --- lib/socket.js | 16 +++++----------- lib/tls_socket.js | 23 ++++++++--------------- test/index_test.js | 6 +++--- 3 files changed, 16 insertions(+), 29 deletions(-) diff --git a/lib/socket.js b/lib/socket.js index e367752..825cd80 100644 --- a/lib/socket.js +++ b/lib/socket.js @@ -1,13 +1,7 @@ -import Net from "net"; +import net from "net"; -export default function Socket() { - Net.Socket.apply(this, arguments); +export default class Socket extends net.Socket { + bypass() { + this.bypassed = true; + } } - -Socket.prototype = Object.create(Net.Socket.prototype, { - constructor: { value: Socket, configurable: true, writeable: true }, -}); - -Socket.prototype.bypass = function () { - this.bypassed = true; -}; diff --git a/lib/tls_socket.js b/lib/tls_socket.js index 1530977..2e89d09 100644 --- a/lib/tls_socket.js +++ b/lib/tls_socket.js @@ -1,19 +1,12 @@ import { TLSSocket } from "tls"; import Socket from "./socket.js"; -export default TlsSocket; - -function TlsSocket() { - Socket.apply(this, arguments); +export default class TlsSocket extends Socket { + constructor(...args) { + super(...args); + Object.assign(this, TLSSocket.prototype); + } + + encrypted = true; + authorized = true; } - -TlsSocket.prototype = Object.create(TLSSocket.prototype, { - constructor: { value: TlsSocket, configurable: true, writeable: true }, -}); - -Object.keys(Socket.prototype).forEach(function (key) { - TlsSocket.prototype[key] = Socket.prototype[key]; -}); - -TlsSocket.prototype.encrypted = true; -TlsSocket.prototype.authorized = true; diff --git a/test/index_test.js b/test/index_test.js index 266cadd..804495f 100644 --- a/test/index_test.js +++ b/test/index_test.js @@ -496,15 +496,15 @@ test("net.createConnection must be equal to net.connect", () => { mustConnect("tls.connect", tls); test("tls.connect must return an instance of tls.TLSSocket", () => { - tls.connect({ host: "foo", port: 80 }).must.be.an.instanceof(tls.TLSSocket); + tls.connect({ host: "foo", port: 80 }).must.have.property("getCertificate"); }); test("tls.connect must return an instance of tls.TLSSocket given port", () => { - tls.connect(80).must.be.an.instanceof(tls.TLSSocket); + tls.connect(80).must.have.property("getCertificate"); }); test("tls.connect must return an instance of tls.TLSSocket given port and host", () => { - tls.connect(80, "10.0.0.1").must.be.an.instanceof(tls.TLSSocket); + tls.connect(80, "10.0.0.1").must.have.property("getCertificate"); }); test("tls.connect must emit secureConnect in next ticks", () => { From 667b8cf42296c5752c6561b4d5b221e7e3494f65 Mon Sep 17 00:00:00 2001 From: Gregor Martynus <39992+gr2m@users.noreply.github.com> Date: Sun, 5 Dec 2021 11:29:43 -0800 Subject: [PATCH 33/59] ci: test --- .github/workflows/test.yml | 65 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 65 insertions(+) create mode 100644 .github/workflows/test.yml diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml new file mode 100644 index 0000000..cf1edb3 --- /dev/null +++ b/.github/workflows/test.yml @@ -0,0 +1,65 @@ +name: Test + +on: + push: + branches: + - master + - main + - esm-and-other-musings + # renovate/** branches are generated by https://github.com/apps/renovate + - renovate/** + + pull_request: + types: + - opened + - synchronize + +jobs: + test_matrix: + strategy: + matrix: + node-version: + - 12 + - 14 + - 16 + - 17 + + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@v2 + - run: git config --global user.name github-actions + - run: git config --global user.email github-actions@github.com + - name: Use Node.js ${{ matrix.node-version }} + uses: actions/setup-node@v2 + with: + node-version: ${{ matrix.node-version }} + cache: npm + - run: npm ci + - run: npm run test:ci + + # separate job to set as required in branch protection, + # as the build names above change each time Node versions change + test: + runs-on: ubuntu-latest + needs: test_matrix + if: $ + env: + conclusion: $ + steps: + # when enforcing `test` in branch protection, we must make sure that + # it's not considered skipped none of the `test_matrix` jobs run yet + - run: | + echo "Result = $conclusion" + if [ ${conclusion} == "success" ]; then + exit 0 + else + exit 1 + fi + - uses: actions/checkout@v2 + - uses: actions/setup-node@v2 + with: + node-version: 16 + cache: npm + - run: npm ci + - run: npm run lint From ddfeb90f885815bd664dd6db142a858cd5b255cf Mon Sep 17 00:00:00 2001 From: Gregor Martynus <39992+gr2m@users.noreply.github.com> Date: Sun, 5 Dec 2021 11:31:01 -0800 Subject: [PATCH 34/59] docs: replace travis badge with actions badge --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 766c0d3..02526d0 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,7 @@ # Mitm.js [![NPM version][npm-badge]](https://www.npmjs.com/package/mitm) -[![Build status][travis-badge]](https://travis-ci.org/moll/node-mitm) +[![Build Status](https://github.com/gr2m/node-mitm.js/workflows/Test/badge.svg)](https://github.com/gr2m/node-mitm.js/actions?query=workflow%3ATest+branch%3Amaster) Mitm.js is a library for Node.js (and Io.js) to **intercept and mock** outgoing network **TCP** and **HTTP** connections. Mitm.js intercepts and gives you From b7a94ba4c709f26847aa20c63a36edb5fc3fbbdf Mon Sep 17 00:00:00 2001 From: Gregor Martynus <39992+gr2m@users.noreply.github.com> Date: Sun, 5 Dec 2021 11:32:10 -0800 Subject: [PATCH 35/59] docs: remove npm badge temporarily --- README.md | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/README.md b/README.md index 02526d0..5967f4c 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,6 @@ # Mitm.js -[![NPM version][npm-badge]](https://www.npmjs.com/package/mitm) -[![Build Status](https://github.com/gr2m/node-mitm.js/workflows/Test/badge.svg)](https://github.com/gr2m/node-mitm.js/actions?query=workflow%3ATest+branch%3Amaster) +[![Build Status](https://github.com/gr2m/node-mitm.js/workflows/Test/badge.svg)](https://github.com/gr2m/node-mitm.js/actions?query=workflow%3ATest+branch%3Aesm-and-other-musings) Mitm.js is a library for Node.js (and Io.js) to **intercept and mock** outgoing network **TCP** and **HTTP** connections. Mitm.js intercepts and gives you @@ -23,9 +22,6 @@ Calendar][monday]'s syncing, so if you find a use-case I haven't come across, please fling me an [email][email], a [tweet][twitter] or [create an issue][issues] on GitHub. -[npm-badge]: https://img.shields.io/npm/v/mitm.svg -[travis-badge]: https://travis-ci.org/moll/node-mitm.svg?branch=master - ### Tour - Intercept both **TCP socket connections** (`Net.connect`) and **HTTP From 546210c5aa86dad5b61d41f23cc7a3453e34d677 Mon Sep 17 00:00:00 2001 From: Gregor Martynus <39992+gr2m@users.noreply.github.com> Date: Sun, 5 Dec 2021 11:35:03 -0800 Subject: [PATCH 36/59] test: remove test_matrix workaround --- .github/workflows/test.yml | 12 ------------ 1 file changed, 12 deletions(-) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index cf1edb3..9b715cb 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -43,19 +43,7 @@ jobs: test: runs-on: ubuntu-latest needs: test_matrix - if: $ - env: - conclusion: $ steps: - # when enforcing `test` in branch protection, we must make sure that - # it's not considered skipped none of the `test_matrix` jobs run yet - - run: | - echo "Result = $conclusion" - if [ ${conclusion} == "success" ]; then - exit 0 - else - exit 1 - fi - uses: actions/checkout@v2 - uses: actions/setup-node@v2 with: From e44fb61a3374f3d9103c1b3b83f318522e2be746 Mon Sep 17 00:00:00 2001 From: Gregor Martynus <39992+gr2m@users.noreply.github.com> Date: Sun, 5 Dec 2021 11:36:27 -0800 Subject: [PATCH 37/59] ci(test): run `test` npm script --- .github/workflows/test.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 9b715cb..012e87c 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -36,7 +36,7 @@ jobs: node-version: ${{ matrix.node-version }} cache: npm - run: npm ci - - run: npm run test:ci + - run: npm test # separate job to set as required in branch protection, # as the build names above change each time Node versions change From 1250c81bec69f6805e96dfd0a4a7ea2e9aeb22c0 Mon Sep 17 00:00:00 2001 From: Gregor Martynus <39992+gr2m@users.noreply.github.com> Date: Sun, 5 Dec 2021 13:52:00 -0800 Subject: [PATCH 38/59] docs: add comment to TLSSocket overwrite class --- lib/tls_socket.js | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/lib/tls_socket.js b/lib/tls_socket.js index 2e89d09..112de5f 100644 --- a/lib/tls_socket.js +++ b/lib/tls_socket.js @@ -1,12 +1,18 @@ -import { TLSSocket } from "tls"; +import tls from "tls"; import Socket from "./socket.js"; +/** + * TlsSocket is extending `tls.TLSSocket` because the + * logic is a lot different to `net.Socket`. So we inherit + * from `net.Socket` instead and then only apply the instances + * methods from `tls.TLSSocket`. + */ export default class TlsSocket extends Socket { + encrypted = true; + authorized = true; + constructor(...args) { super(...args); - Object.assign(this, TLSSocket.prototype); + Object.assign(this, tls.TLSSocket.prototype); } - - encrypted = true; - authorized = true; } From 52c8e6e699e76f9ead52327cfe840b0b4b696f07 Mon Sep 17 00:00:00 2001 From: Gregor Martynus <39992+gr2m@users.noreply.github.com> Date: Sun, 5 Dec 2021 14:04:36 -0800 Subject: [PATCH 39/59] refactor: use classes in `lib/internal_socket.js` --- lib/internal_socket.js | 231 +++++++++++++++++++++-------------------- 1 file changed, 116 insertions(+), 115 deletions(-) diff --git a/lib/internal_socket.js b/lib/internal_socket.js index 2229b51..599f48f 100644 --- a/lib/internal_socket.js +++ b/lib/internal_socket.js @@ -1,4 +1,4 @@ -import { Duplex as DuplexStream } from "stream"; +import stream from "stream"; const NO_ERROR = 0; let uniqueId = 0; @@ -19,126 +19,129 @@ STREAM_BYTES_READ = process.binding("stream_wrap").kReadBytesOrError; * * InternalSocket is created for both the client side and the server side. */ -export default function InternalSocket(remote) { - DuplexStream.call(this); - this.remote = remote; - this.id = ++uniqueId; - - // The "end" event follows ReadableStream.prototype.push(null). - this.on("data", readData.bind(this)); - this.on("end", readEof.bind(this)); +class InternalSocket extends stream.Duplex { + constructor() { + super(); + this.id = ++uniqueId; + + // The "end" event follows ReadableStream.prototype.push(null). + this.on("data", readData.bind(this)); + this.on("end", readEof.bind(this)); + + // The "finish" event follows WritableStream.prototype.end. + // + // There's WritableStream.prototype._final for processing before "finish" is + // emitted, but that's only available in Node v8 and later. + this.on( + "finish", + this._write.bind(this, null, null, () => {}) + ); + + this.pause(); + } - // The "finish" event follows WritableStream.prototype.end. + // Node v0.11's ReadableStream.prototype.resume and + // ReadableStream.prototype.pause return self. InternalSocket's API states that + // they should return error codes instead. // - // There's WritableStream.prototype._final for processing before "finish" is - // emitted, but that's only available in Node v8 and later. - this.on("finish", this._write.bind(this, null, null, noop)); + // Node v0.11.13 called ReadableStream.prototype.read(0) synchronously, but + // v0.11.14 does it in the next tick. For easier sync use, call it here. + readStart() { + this.resume(); + } + readStop() { + this.pause(); + } - return this.pause(), this; -} + _read() {} + ref() {} + unref() {} -InternalSocket.prototype = Object.create(DuplexStream.prototype, { - constructor: { value: InternalSocket, configurable: true, writeable: true }, -}); - -// Node v0.11's ReadableStream.prototype.resume and -// ReadableStream.prototype.pause return self. InternalSocket's API states that -// they should return error codes instead. -// -// Node v0.11.13 called ReadableStream.prototype.read(0) synchronously, but -// v0.11.14 does it in the next tick. For easier sync use, call it here. -InternalSocket.prototype.readStart = function () { - this.resume(); -}; -InternalSocket.prototype.readStop = function () { - this.pause(); -}; - -InternalSocket.prototype._read = noop; -InternalSocket.prototype.ref = noop; -InternalSocket.prototype.unref = noop; - -// Node v8 added "getAsyncId". -InternalSocket.prototype.getAsyncId = function () { - return this.id; -}; - -InternalSocket.prototype._write = function (data, encoding, done) { - const remote = this.remote; - process.nextTick(function () { - remote.push(data, encoding); - done(); - }); -}; - -// Node v10 requires writev to be set on the handler because, while -// WritableStream expects _writev, internal/stream_base_commons.js calls -// req.handle.writev directly. It's given a flat array of data+type pairs. -InternalSocket.prototype.writev = function (_req, data) { - for (let i = 0; i < data.length; ++i) this._write(data[i], data[++i], noop); - return NO_ERROR; -}; - -// InternalSocket.prototype.writeLatin1String was introduced in Node v6.4. -InternalSocket.prototype.writeLatin1String = function (_req, data) { - this.write(data, "latin1"); - return NO_ERROR; -}; - -InternalSocket.prototype.writeBuffer = function (req, data) { - /* eslint consistent-return: 0 */ - this.write(data); - return NO_ERROR; -}; - -InternalSocket.prototype.writeUtf8String = function (req, data) { - /* eslint consistent-return: 0 */ - this.write(data, "utf8"); - return NO_ERROR; -}; - -InternalSocket.prototype.writeAsciiString = function (req, data) { - /* eslint consistent-return: 0 */ - this.write(data, "ascii"); - return NO_ERROR; -}; - -InternalSocket.prototype.writeUcs2String = function (req, data) { - /* eslint consistent-return: 0 */ - this.write(data, "ucs2"); - return NO_ERROR; -}; - -// While it seems to have existed since Node v0.10, Node v11.2 requires -// "shutdown". AFAICT, "shutdown" is for shutting the writable side down and -// hence the use of WritableStream.prototype.end and waiting for the "finish" -// event. -InternalSocket.prototype.shutdown = function (req) { - this.once("finish", req.oncomplete.bind(req, NO_ERROR, req.handle)); - this.end(); - - // Note v11.8 requires "shutdown" to return an error value, with "1" - // indicating a "synchronous finish" (as per Node's net.js) and "0" - // presumably success. - return 0; -}; - -// I'm unsure of the relationship between InternalSocket.prototype.shutdown and -// InternalSocket.prototype.close. -InternalSocket.prototype.close = function (done) { - if (!this._writableState.finished) { - this.end(done); - return; + // Node v8 added "getAsyncId". + getAsyncId() { + return this.id; } - /* istanbul ignore next */ - if (done) done(); -}; + _write(data, encoding, done) { + const remote = this.remote; + process.nextTick(function () { + remote.push(data, encoding); + done(); + }); + } + + // Node v10 requires writev to be set on the handler because, while + // WritableStream expects _writev, internal/stream_base_commons.js calls + // req.handle.writev directly. It's given a flat array of data+type pairs. + writev(_req, data) { + for (let i = 0; i < data.length; ++i) + this._write(data[i], data[++i], () => {}); + return NO_ERROR; + } + + // InternalSocket.prototype.writeLatin1String was introduced in Node v6.4. + writeLatin1String(_req, data) { + this.write(data, "latin1"); + return NO_ERROR; + } + + writeBuffer(req, data) { + /* eslint consistent-return: 0 */ + this.write(data); + return NO_ERROR; + } + + writeUtf8String(req, data) { + /* eslint consistent-return: 0 */ + this.write(data, "utf8"); + return NO_ERROR; + } + + writeAsciiString(req, data) { + /* eslint consistent-return: 0 */ + this.write(data, "ascii"); + return NO_ERROR; + } + + writeUcs2String(req, data) { + /* eslint consistent-return: 0 */ + this.write(data, "ucs2"); + return NO_ERROR; + } + + // While it seems to have existed since Node v0.10, Node v11.2 requires + // "shutdown". AFAICT, "shutdown" is for shutting the writable side down and + // hence the use of WritableStream.prototype.end and waiting for the "finish" + // event. + shutdown(req) { + this.once("finish", req.oncomplete.bind(req, NO_ERROR, req.handle)); + this.end(); + + // Note v11.8 requires "shutdown" to return an error value, with "1" + // indicating a "synchronous finish" (as per Node's net.js) and "0" + // presumably success. + return 0; + } + + // I'm unsure of the relationship between InternalSocket.prototype.shutdown and + // InternalSocket.prototype.close. + close(done) { + if (!this._writableState.finished) { + this.end(done); + return; + } + + /* istanbul ignore next */ + if (done) done(); + } +} export function createInternalSocketPair() { - const a = Object.create(InternalSocket.prototype); - const b = Object.create(InternalSocket.prototype); - return [InternalSocket.call(a, b), InternalSocket.call(b, a)]; + const a = new InternalSocket(); + const b = new InternalSocket(); + a.remote = b; + b.remote = a; + return [a, b]; } function readData(data) { @@ -152,5 +155,3 @@ function readEof() { STREAM_STATE[STREAM_BYTES_READ] = UV_EOF; this.onread(); } - -function noop() {} From 726bfe8e89a0f9b3f91e397794fb6973079ab090 Mon Sep 17 00:00:00 2001 From: Gregor Martynus <39992+gr2m@users.noreply.github.com> Date: Sun, 5 Dec 2021 14:05:13 -0800 Subject: [PATCH 40/59] build: remove obsolete `test/mocha.opts` --- test/mocha.opts | 3 --- 1 file changed, 3 deletions(-) delete mode 100644 test/mocha.opts diff --git a/test/mocha.opts b/test/mocha.opts deleted file mode 100644 index e1228ac..0000000 --- a/test/mocha.opts +++ /dev/null @@ -1,3 +0,0 @@ ---recursive ---require must ---timeout 100 From 67a02bc6ceabdc9ece32ea766b1f18d38a6431b0 Mon Sep 17 00:00:00 2001 From: Gregor Martynus <39992+gr2m@users.noreply.github.com> Date: Sun, 5 Dec 2021 14:06:52 -0800 Subject: [PATCH 41/59] refactor: make `Stubs` a class --- lib/stubs.js | 22 ++++++++++------------ 1 file changed, 10 insertions(+), 12 deletions(-) diff --git a/lib/stubs.js b/lib/stubs.js index a33c555..ed9f483 100644 --- a/lib/stubs.js +++ b/lib/stubs.js @@ -1,13 +1,11 @@ -export default function Stubs() {} +export default class Stubs extends Array { + stub(obj, prop, value) { + this.push([obj, prop, obj[prop]]); + obj[prop] = value; + } -Stubs.prototype = Object.create(Array.prototype); - -Stubs.prototype.stub = function (obj, prop, value) { - this.push([obj, prop, obj[prop]]); - obj[prop] = value; -}; - -Stubs.prototype.restore = function () { - let stub; - while ((stub = this.pop())) stub[0][stub[1]] = stub[2]; -}; + restore() { + let stub; + while ((stub = this.pop())) stub[0][stub[1]] = stub[2]; + } +} From 87d79d1ebe75bb3019dc25ee7c209dabff9182a8 Mon Sep 17 00:00:00 2001 From: Gregor Martynus <39992+gr2m@users.noreply.github.com> Date: Sun, 5 Dec 2021 14:10:47 -0800 Subject: [PATCH 42/59] test: add comments to explain why we no longer use `instanceof(tls.TLSSocket)` in the checks --- test/index_test.js | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/test/index_test.js b/test/index_test.js index 804495f..68b2f6d 100644 --- a/test/index_test.js +++ b/test/index_test.js @@ -213,7 +213,9 @@ mustConnect("net.connect", net); test("net.connect must not return an instance of tls.TLSSocket", () => { const client = net.connect({ host: "foo", port: 80 }); - client.must.not.be.an.instanceof(tls.TLSSocket); + // we don't use `instanceof(tls.TLSSocket)` here because our TlsSocket + // implementation doesn't extend tls.TLSSocket. + client.must.not.have.property("getCertificate"); }); test("net.connect must not set the encrypted property", () => { @@ -496,14 +498,20 @@ test("net.createConnection must be equal to net.connect", () => { mustConnect("tls.connect", tls); test("tls.connect must return an instance of tls.TLSSocket", () => { + // we don't use `instanceof(tls.TLSSocket)` here because our TlsSocket + // implementation doesn't extend tls.TLSSocket. tls.connect({ host: "foo", port: 80 }).must.have.property("getCertificate"); }); test("tls.connect must return an instance of tls.TLSSocket given port", () => { + // we don't use `instanceof(tls.TLSSocket)` here because our TlsSocket + // implementation doesn't extend tls.TLSSocket. tls.connect(80).must.have.property("getCertificate"); }); test("tls.connect must return an instance of tls.TLSSocket given port and host", () => { + // we don't use `instanceof(tls.TLSSocket)` here because our TlsSocket + // implementation doesn't extend tls.TLSSocket. tls.connect(80, "10.0.0.1").must.have.property("getCertificate"); }); From bbe864981a9910a085f461af1055a7eb2b3acb57 Mon Sep 17 00:00:00 2001 From: Gregor Martynus <39992+gr2m@users.noreply.github.com> Date: Sun, 5 Dec 2021 14:23:26 -0800 Subject: [PATCH 43/59] build(deps): -`must` --- package.json | 1 - 1 file changed, 1 deletion(-) diff --git a/package.json b/package.json index 4135832..a4a0e67 100644 --- a/package.json +++ b/package.json @@ -40,7 +40,6 @@ "test": "nyc uvu" }, "devDependencies": { - "must": ">= 0.13 < 0.14", "nyc": "^15.1.0", "prettier": "^2.5.0", "sinon": ">= 1.9 < 2", From 3093a05743fe5d7b9bd9f169009ba4a8ee57b881 Mon Sep 17 00:00:00 2001 From: Gregor Martynus <39992+gr2m@users.noreply.github.com> Date: Sun, 5 Dec 2021 14:23:27 -0800 Subject: [PATCH 44/59] build(package): lock file --- package-lock.json | 129 ---------------------------------------------- 1 file changed, 129 deletions(-) diff --git a/package-lock.json b/package-lock.json index 3772259..92c1f8b 100644 --- a/package-lock.json +++ b/package-lock.json @@ -8,7 +8,6 @@ "name": "mitm", "version": "1.7.2", "devDependencies": { - "must": ">= 0.13 < 0.14", "nyc": "^15.1.0", "prettier": "^2.5.0", "sinon": ">= 1.9 < 2", @@ -739,15 +738,6 @@ "node": ">=6" } }, - "node_modules/egal": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/egal/-/egal-1.3.0.tgz", - "integrity": "sha1-IKGc+oDOlzP4QTY10AQmQfQpGHs=", - "dev": true, - "dependencies": { - "kindof": ">= 2.0.0 < 3" - } - }, "node_modules/electron-to-chromium": { "version": "1.4.11", "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.11.tgz", @@ -1558,12 +1548,6 @@ "node": ">=4" } }, - "node_modules/json-stringify-safe": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", - "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=", - "dev": true - }, "node_modules/json5": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.0.tgz", @@ -1585,12 +1569,6 @@ "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", "dev": true }, - "node_modules/kindof": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/kindof/-/kindof-2.0.0.tgz", - "integrity": "sha1-wzW69gOnfMN/i0Brc7ZGP9vfGr4=", - "dev": true - }, "node_modules/kleur": { "version": "4.1.4", "resolved": "https://registry.npmjs.org/kleur/-/kleur-4.1.4.tgz", @@ -1612,36 +1590,12 @@ "node": ">=8" } }, - "node_modules/lodash._createwrapper": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/lodash._createwrapper/-/lodash._createwrapper-3.2.0.tgz", - "integrity": "sha1-30U+ZkFjIXuJWkVAZa8cR6DqPE0=", - "dev": true, - "dependencies": { - "lodash._root": "^3.0.0" - } - }, - "node_modules/lodash._root": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/lodash._root/-/lodash._root-3.0.1.tgz", - "integrity": "sha1-+6HEUkwZ7ppfgTa0YJ8BfPTe1pI=", - "dev": true - }, "node_modules/lodash.flattendeep": { "version": "4.4.0", "resolved": "https://registry.npmjs.org/lodash.flattendeep/-/lodash.flattendeep-4.4.0.tgz", "integrity": "sha1-+wMJF/hqMTTlvJvsDWngAT3f7bI=", "dev": true }, - "node_modules/lodash.wrap": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/lodash.wrap/-/lodash.wrap-3.0.1.tgz", - "integrity": "sha1-P82L74Z7LsjCG6xjjYFhgFk/cas=", - "dev": true, - "dependencies": { - "lodash._createwrapper": "^3.0.0" - } - }, "node_modules/lolex": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/lolex/-/lolex-1.3.2.tgz", @@ -1681,19 +1635,6 @@ "node": ">=4" } }, - "node_modules/must": { - "version": "0.13.4", - "resolved": "https://registry.npmjs.org/must/-/must-0.13.4.tgz", - "integrity": "sha1-nROJ9FjolLKqBAMr/rekBxT3gXE=", - "dev": true, - "dependencies": { - "egal": ">= 1.3.0 < 2", - "json-stringify-safe": ">= 5 < 6", - "kindof": ">= 2.0.0 < 3", - "lodash.wrap": ">= 3 < 4", - "oolong": ">= 1.11.0 < 2" - } - }, "node_modules/node-preload": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/node-preload/-/node-preload-0.2.1.tgz", @@ -1830,12 +1771,6 @@ "wrappy": "1" } }, - "node_modules/oolong": { - "version": "1.15.1", - "resolved": "https://registry.npmjs.org/oolong/-/oolong-1.15.1.tgz", - "integrity": "sha1-kLrJ585S9gkGqyIo2eKxFfEIbOo=", - "dev": true - }, "node_modules/p-limit": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", @@ -3115,15 +3050,6 @@ "integrity": "sha512-q9K8BlJVxK7hQYqa6XISGmBZbtQQWVXSrRrWreHC94rMt1QL/Impruc+7p2CYSYuVIUr+YCt6hjrs1kkdJRTug==", "dev": true }, - "egal": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/egal/-/egal-1.3.0.tgz", - "integrity": "sha1-IKGc+oDOlzP4QTY10AQmQfQpGHs=", - "dev": true, - "requires": { - "kindof": ">= 2.0.0 < 3" - } - }, "electron-to-chromium": { "version": "1.4.11", "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.11.tgz", @@ -3697,12 +3623,6 @@ "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", "dev": true }, - "json-stringify-safe": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", - "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=", - "dev": true - }, "json5": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.0.tgz", @@ -3720,12 +3640,6 @@ } } }, - "kindof": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/kindof/-/kindof-2.0.0.tgz", - "integrity": "sha1-wzW69gOnfMN/i0Brc7ZGP9vfGr4=", - "dev": true - }, "kleur": { "version": "4.1.4", "resolved": "https://registry.npmjs.org/kleur/-/kleur-4.1.4.tgz", @@ -3741,36 +3655,12 @@ "p-locate": "^4.1.0" } }, - "lodash._createwrapper": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/lodash._createwrapper/-/lodash._createwrapper-3.2.0.tgz", - "integrity": "sha1-30U+ZkFjIXuJWkVAZa8cR6DqPE0=", - "dev": true, - "requires": { - "lodash._root": "^3.0.0" - } - }, - "lodash._root": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/lodash._root/-/lodash._root-3.0.1.tgz", - "integrity": "sha1-+6HEUkwZ7ppfgTa0YJ8BfPTe1pI=", - "dev": true - }, "lodash.flattendeep": { "version": "4.4.0", "resolved": "https://registry.npmjs.org/lodash.flattendeep/-/lodash.flattendeep-4.4.0.tgz", "integrity": "sha1-+wMJF/hqMTTlvJvsDWngAT3f7bI=", "dev": true }, - "lodash.wrap": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/lodash.wrap/-/lodash.wrap-3.0.1.tgz", - "integrity": "sha1-P82L74Z7LsjCG6xjjYFhgFk/cas=", - "dev": true, - "requires": { - "lodash._createwrapper": "^3.0.0" - } - }, "lolex": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/lolex/-/lolex-1.3.2.tgz", @@ -3800,19 +3690,6 @@ "integrity": "sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==", "dev": true }, - "must": { - "version": "0.13.4", - "resolved": "https://registry.npmjs.org/must/-/must-0.13.4.tgz", - "integrity": "sha1-nROJ9FjolLKqBAMr/rekBxT3gXE=", - "dev": true, - "requires": { - "egal": ">= 1.3.0 < 2", - "json-stringify-safe": ">= 5 < 6", - "kindof": ">= 2.0.0 < 3", - "lodash.wrap": ">= 3 < 4", - "oolong": ">= 1.11.0 < 2" - } - }, "node-preload": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/node-preload/-/node-preload-0.2.1.tgz", @@ -3921,12 +3798,6 @@ "wrappy": "1" } }, - "oolong": { - "version": "1.15.1", - "resolved": "https://registry.npmjs.org/oolong/-/oolong-1.15.1.tgz", - "integrity": "sha1-kLrJ585S9gkGqyIo2eKxFfEIbOo=", - "dev": true - }, "p-limit": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", From 760d595db56cf9405fbed13565e6c72e76be25ba Mon Sep 17 00:00:00 2001 From: Gregor Martynus <39992+gr2m@users.noreply.github.com> Date: Sun, 5 Dec 2021 14:23:43 -0800 Subject: [PATCH 45/59] test: replace `must` with `uvu/assert` --- test/index_test.js | 133 ++++++++++++++++++++++----------------------- 1 file changed, 64 insertions(+), 69 deletions(-) diff --git a/test/index_test.js b/test/index_test.js index 68b2f6d..e7d8b88 100644 --- a/test/index_test.js +++ b/test/index_test.js @@ -7,7 +7,7 @@ import { EventEmitter } from "events"; import Sinon from "sinon"; import { test } from "uvu"; -import "must/register.js"; +import * as assert from "uvu/assert"; import Mitm from "../index.js"; @@ -24,21 +24,21 @@ test.after.each(() => { }); test("must return an instance of Mitm when called as a function", () => { - mitm.must.be.an.instanceof(Mitm); + assert.instance(mitm, Mitm); }); function mustConnect(moduleName, module) { test(`${moduleName}: must return an instance of net.Socket`, () => { const socket = module.connect({ host: "foo", port: 80 }); - socket.must.be.an.instanceof(net.Socket); + assert.instance(socket, net.Socket); }); test(`${moduleName}: must return an instance of net.Socket given port`, () => { - module.connect(80).must.be.an.instanceof(net.Socket); + assert.instance(module.connect(80), net.Socket); }); test(`${moduleName}: must return an instance of net.Socket given port and host`, () => { - module.connect(80, "10.0.0.1").must.be.an.instanceof(net.Socket); + assert.instance(module.connect(80, "10.0.0.1"), net.Socket); }); test(`${moduleName}: must emit connect on Mitm`, () => { @@ -47,9 +47,9 @@ function mustConnect(moduleName, module) { const opts = { host: "foo" }; const socket = module.connect(opts); - onConnect.callCount.must.equal(1); - onConnect.firstCall.args[0].must.equal(socket); - onConnect.firstCall.args[1].must.equal(opts); + assert.equal(onConnect.callCount, 1); + assert.equal(onConnect.firstCall.args[0], socket); + assert.equal(onConnect.firstCall.args[1], opts); }); test(`${moduleName}: must emit connect on Mitm with options object given host and port`, () => { @@ -57,9 +57,9 @@ function mustConnect(moduleName, module) { mitm.on("connect", onConnect); const socket = module.connect(9, "127.0.0.1"); - onConnect.callCount.must.equal(1); - onConnect.firstCall.args[0].must.equal(socket); - onConnect.firstCall.args[1].must.eql({ host: "127.0.0.1", port: 9 }); + assert.equal(onConnect.callCount, 1); + assert.equal(onConnect.firstCall.args[0], socket); + assert.equal(onConnect.firstCall.args[1], { host: "127.0.0.1", port: 9 }); }); test(`${moduleName}: must emit connection on Mitm`, () => { @@ -68,10 +68,10 @@ function mustConnect(moduleName, module) { const opts = { host: "foo" }; const socket = module.connect(opts); - onConnection.callCount.must.equal(1); - onConnection.firstCall.args[0].must.be.an.instanceof(net.Socket); - onConnection.firstCall.args[0].must.not.equal(socket); - onConnection.firstCall.args[1].must.equal(opts); + assert.equal(onConnection.callCount, 1); + assert.instance(onConnection.firstCall.args[0], net.Socket); + assert.not.equal(onConnection.firstCall.args[0], socket); + assert.equal(onConnection.firstCall.args[1], opts); }); test(`${moduleName}: must emit connect on socket in next ticks`, () => { @@ -137,7 +137,7 @@ function mustConnect(moduleName, module) { client.setEncoding("utf8"); client.on("data", function (data) { - data.must.equal("Hello"); + assert.equal(data, "Hello"); }); client.on("data", resolve); }); @@ -152,8 +152,8 @@ function mustConnect(moduleName, module) { module .connect({ host: "127.0.0.1", port: 9 }) .on("error", function (err) { - err.must.be.an.instanceof(Error); - err.message.must.include("ECONNREFUSED"); + assert.instance(err, Error); + assert.match(err.message, /ECONNREFUSED/); resolve(); }); }); @@ -170,8 +170,8 @@ function mustConnect(moduleName, module) { try { module.connect({ host: "127.0.0.1", port: 9 }).on("error", noop); - connect.callCount.must.equal(1); - connect.firstCall.args[0].must.eql({ host: "127.0.0.1", port: 9 }); + assert.equal(connect.callCount, 1); + assert.equal(connect.firstCall.args[0], { host: "127.0.0.1", port: 9 }); } finally { // Working around Mocha's context bug(s) and poor design decision // with a manual `finally`. @@ -191,7 +191,7 @@ function mustConnect(moduleName, module) { client.on( "error", process.nextTick.bind(null, () => { - onConnect.callCount.must.equal(0); + assert.equal(onConnect.callCount, 0); resolve(); }) ); @@ -205,7 +205,7 @@ function mustConnect(moduleName, module) { const onConnection = Sinon.spy(); mitm.on("connection", onConnection); module.connect({ host: "127.0.0.1", port: 9 }).on("error", noop); - onConnection.callCount.must.equal(0); + assert.equal(onConnection.callCount, 0); }); } @@ -215,15 +215,15 @@ test("net.connect must not return an instance of tls.TLSSocket", () => { const client = net.connect({ host: "foo", port: 80 }); // we don't use `instanceof(tls.TLSSocket)` here because our TlsSocket // implementation doesn't extend tls.TLSSocket. - client.must.not.have.property("getCertificate"); + assert.not.ok("getCertificate" in client); }); test("net.connect must not set the encrypted property", () => { - net.connect({ host: "foo" }).must.not.have.property("encrypted"); + assert.not.ok("encrypted" in net.connect({ host: "foo" })); }); test("net.connect must not set the authorized property", () => { - net.connect({ host: "foo" }).must.not.have.property("authorized"); + assert.not.ok("authorized" in net.connect({ host: "foo" })); }); test("net.connect must not emit secureConnect on client", () => { @@ -257,7 +257,7 @@ test("Socket.prototype.write must write to client from server", () => { client.setEncoding("utf8"); client.on("data", function (data) { - data.must.equal("Hello ☺️"); + assert.equal(data, "Hello ☺️"); }); client.on("data", resolve); }); @@ -273,7 +273,7 @@ test("Socket.prototype.write must write to client from server in the next tick", let ticked = false; client.once("data", () => { - ticked.must.be.true(); + assert.equal(ticked, true); resolve(); }); server.write("Hello"); @@ -292,7 +292,7 @@ test("Socket.prototype.write must write to server from client", () => { server.setEncoding("utf8"); process.nextTick(() => { - server.read().must.equal("Hello ☺️"); + assert.equal(server.read(), "Hello ☺️"); }); process.nextTick(resolve); }); @@ -308,7 +308,7 @@ test("Socket.prototype.write must write to server from client in the next tick", let ticked = false; server.once("data", () => { - ticked.must.be.true(); + assert.equal(ticked, true); resolve(); }); client.write("Hello"); @@ -329,7 +329,7 @@ test("Socket.prototype.write must write to server from client given binary", () server.setEncoding("binary"); process.nextTick(() => { - server.read().must.equal("Hello"); + assert.equal(server.read(), "Hello"); }); process.nextTick(resolve); }); @@ -346,7 +346,7 @@ test("Socket.prototype.write must write to server from client given latin1", () server.setEncoding("latin1"); process.nextTick(() => { - server.read().must.equal("Hello"); + assert.equal(server.read(), "Hello"); }); process.nextTick(resolve); }); @@ -362,7 +362,7 @@ test("Socket.prototype.write must write to server from client given a buffer", ( client.write(Buffer.from("Hello", "utf-8")); process.nextTick(() => { - assertBuffers(server.read(), Buffer.from("Hello", "utf-8")); + assert.equal(server.read(), Buffer.from("Hello", "utf-8")); resolve(); }); }); @@ -378,7 +378,7 @@ test("Socket.prototype.write must write to server from client given a UTF-8 stri client.write("Hello", "utf8"); process.nextTick(() => { - assertBuffers(server.read(), Buffer.from("Hello", "utf-8")); + assert.equal(server.read(), Buffer.from("Hello", "utf-8")); resolve(); }); }); @@ -394,7 +394,7 @@ test("Socket.prototype.write must write to server from client given a ASCII stri client.write("Hello", "ascii"); process.nextTick(() => { - assertBuffers(server.read(), Buffer.from("Hello", "utf-8")); + assert.equal(server.read(), Buffer.from("Hello", "utf-8")); resolve(); }); }); @@ -410,7 +410,7 @@ test("Socket.prototype.write must write to server from client given a UCS-2 stri client.write("Hello", "ucs2"); process.nextTick(() => { - assertBuffers( + assert.equal( server.read(), Buffer.from("H\u0000e\u0000l\u0000l\u0000o\u0000", "utf-8") ); @@ -471,7 +471,7 @@ test("Socket.prototype.pipe must allow piping to itself", () => { client.setEncoding("utf8"); client.on("data", function (data) { - data.must.equal("HELLO"); + assert.equal(data, "HELLO"); }); client.on("data", resolve); }); @@ -492,7 +492,7 @@ test("Socket.prototype.destroy must emit end when destroyed on server", () => { }); test("net.createConnection must be equal to net.connect", () => { - net.createConnection.must.equal(net.connect); + assert.equal(net.createConnection, net.connect); }); mustConnect("tls.connect", tls); @@ -500,19 +500,19 @@ mustConnect("tls.connect", tls); test("tls.connect must return an instance of tls.TLSSocket", () => { // we don't use `instanceof(tls.TLSSocket)` here because our TlsSocket // implementation doesn't extend tls.TLSSocket. - tls.connect({ host: "foo", port: 80 }).must.have.property("getCertificate"); + assert.ok("getCertificate" in tls.connect({ host: "foo", port: 80 })); }); test("tls.connect must return an instance of tls.TLSSocket given port", () => { // we don't use `instanceof(tls.TLSSocket)` here because our TlsSocket // implementation doesn't extend tls.TLSSocket. - tls.connect(80).must.have.property("getCertificate"); + assert.ok("getCertificate" in tls.connect(80)); }); test("tls.connect must return an instance of tls.TLSSocket given port and host", () => { // we don't use `instanceof(tls.TLSSocket)` here because our TlsSocket // implementation doesn't extend tls.TLSSocket. - tls.connect(80, "10.0.0.1").must.have.property("getCertificate"); + assert.ok("getCertificate" in tls.connect(80, "10.0.0.1")); }); test("tls.connect must emit secureConnect in next ticks", () => { @@ -549,7 +549,7 @@ test("tls.connect must call back on secureConnect", () => { let connected = false; const client = tls.connect({ host: "foo" }, () => { - connected.must.be.true(); + assert.equal(connected, true); resolve(); }); @@ -560,23 +560,23 @@ test("tls.connect must call back on secureConnect", () => { }); test("tls.connect must set encrypted true", () => { - tls.connect({ host: "foo" }).encrypted.must.be.true(); + assert.equal(tls.connect({ host: "foo" }).encrypted, true); }); test("tls.connect must set authorized true", () => { - tls.connect({ host: "foo" }).authorized.must.be.true(); + assert.equal(tls.connect({ host: "foo" }).authorized, true); }); function mustRequest(context, request) { test(`${context}: must return http.ClientRequest`, () => { - request({ host: "foo" }).must.be.an.instanceof(http.ClientRequest); + assert.instance(request({ host: "foo" }), http.ClientRequest); }); test(`${context}: must emit connect on Mitm`, () => { const onConnect = Sinon.spy(); mitm.on("connect", onConnect); request({ host: "foo" }); - onConnect.callCount.must.equal(1); + assert.equal(onConnect.callCount, 1); }); test(`${context}: must emit connect on Mitm after multiple connections`, () => { @@ -585,14 +585,14 @@ function mustRequest(context, request) { request({ host: "foo" }); request({ host: "foo" }); request({ host: "foo" }); - onConnect.callCount.must.equal(3); + assert.equal(onConnect.callCount, 3); }); test(`${context}: must emit connection on Mitm`, () => { const onConnection = Sinon.spy(); mitm.on("connection", onConnection); request({ host: "foo" }); - onConnection.callCount.must.equal(1); + assert.equal(onConnection.callCount, 1); }); test(`${context}: must emit connection on Mitm after multiple connections`, () => { @@ -601,7 +601,7 @@ function mustRequest(context, request) { request({ host: "foo" }); request({ host: "foo" }); request({ host: "foo" }); - onConnection.callCount.must.equal(3); + assert.equal(onConnection.callCount, 3); }); test(`${context}: must emit request on Mitm`, () => { @@ -610,9 +610,9 @@ function mustRequest(context, request) { client.end(); mitm.on("request", function (req, res) { - req.must.be.an.instanceof(http.IncomingMessage); - req.must.not.equal(client); - res.must.be.an.instanceof(http.ServerResponse); + assert.instance(req, http.IncomingMessage); + assert.not.equal(req, client); + assert.instance(res, http.ServerResponse); resolve(); }); }); @@ -657,8 +657,8 @@ function mustRequest(context, request) { client.bypass(); }); request({ host: "127.0.0.1" }).on("error", function (err) { - err.must.be.an.instanceof(Error); - err.message.must.include("ECONNREFUSED"); + assert.instance(err, Error); + assert.match(err.message, /ECONNREFUSED/); resolve(); }); }); @@ -672,7 +672,7 @@ function mustRequest(context, request) { const onRequest = Sinon.spy(); mitm.on("request", onRequest); request({ host: "127.0.0.1" }).on("error", function (_err) { - onRequest.callCount.must.equal(0); + assert.equal(onRequest.callCount, 0); resolve(); }); }); @@ -729,7 +729,7 @@ test("http.IncomingMessage must have URL", () => { http.request({ host: "foo", path: "/foo" }).end(); mitm.on("request", function (req) { - req.url.must.equal("/foo"); + assert.equal(req.url, "/foo"); resolve(); }); }); @@ -742,7 +742,7 @@ test("http.IncomingMessage must have headers", () => { req.end(); mitm.on("request", function (req) { - req.headers["content-type"].must.equal("application/json"); + assert.equal(req.headers["content-type"], "application/json"); resolve(); }); }); @@ -756,7 +756,7 @@ test("http.IncomingMessage must have body", () => { mitm.on("request", function (req, _res) { req.setEncoding("utf8"); req.on("data", function (data) { - data.must.equal("Hello"); + assert.equal(data, "Hello"); resolve(); }); }); @@ -767,7 +767,7 @@ test("http.IncomingMessage must have a reference to the http.ServerResponse", () return new Promise((resolve) => { http.request({ host: "foo", method: "POST" }).end(); mitm.on("request", function (req, res) { - req.res.must.equal(res); + assert.equal(req.res, res); }); mitm.on("request", resolve); }); @@ -784,11 +784,11 @@ test("http.ServerResponse must respond with status, headers and body", () => { http .request({ host: "foo" }) .on("response", function (res) { - res.statusCode.must.equal(442); - res.headers["content-type"].must.equal("application/json"); + assert.equal(res.statusCode, 442); + assert.equal(res.headers["content-type"], "application/json"); res.setEncoding("utf8"); res.once("data", function (data) { - data.must.equal("Hi!"); + assert.equal(data, "Hi!"); resolve(); }); }) @@ -800,7 +800,7 @@ test("http.ServerResponse must have a reference to the http.IncomingMessage", () return new Promise((resolve) => { http.request({ host: "foo", method: "POST" }).end(); mitm.on("request", function (req, res) { - res.req.must.equal(req); + assert.equal(res.req, req); }); mitm.on("request", resolve); }); @@ -858,11 +858,11 @@ test("http.ServerResponse.prototype.end must make http.IncomingMessage emit end" }); test("Mitm.prototype.addListener must be an alias to EventEmitter.prototype.addListener", () => { - Mitm.prototype.addListener.must.equal(EventEmitter.prototype.addListener); + assert.equal(Mitm.prototype.addListener, EventEmitter.prototype.addListener); }); test("Mitm.prototype.off must be an alias to EventEmitter.prototype.removeListener", () => { - Mitm.prototype.off.must.equal(EventEmitter.prototype.removeListener); + assert.equal(Mitm.prototype.off, EventEmitter.prototype.removeListener); }); test.run(); @@ -879,9 +879,4 @@ Upcase.prototype._transform = function (chunk, _enc, done) { done(null, String(chunk).toUpperCase()); }; -function assertBuffers(a, b) { - if (a.equals) a.equals(b).must.be.true(); - else a.toString("utf8").must.equal(b.toString("utf8")); -} - function noop() {} From 4a0b720a3f0c9da1c0fa793127a1760035dc046c Mon Sep 17 00:00:00 2001 From: Gregor Martynus <39992+gr2m@users.noreply.github.com> Date: Sun, 5 Dec 2021 14:26:40 -0800 Subject: [PATCH 46/59] build(deps): -`nyc`, +`c8` --- package.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/package.json b/package.json index a4a0e67..4b3d648 100644 --- a/package.json +++ b/package.json @@ -34,13 +34,13 @@ ], "exports": "./index.js", "scripts": { - "coverage": "nyc report --reporter html && open coverage/index.html", + "coverage": "c8 report --reporter html && open coverage/index.html", "lint": "prettier --check \"{lib,test}/**/*.{js,json,ts}\" \"*.{js,json,md}\"", "lint:fix": "prettier --write \"{lib,test}/**/*.{js,json,ts}\" \"*.{js,json,md}\"", - "test": "nyc uvu" + "test": "c8 --100 uvu" }, "devDependencies": { - "nyc": "^15.1.0", + "c8": "^7.10.0", "prettier": "^2.5.0", "sinon": ">= 1.9 < 2", "uvu": "^0.5.2" From 32121c2de4684198f58c5e5340077fcfe1ace211 Mon Sep 17 00:00:00 2001 From: Gregor Martynus <39992+gr2m@users.noreply.github.com> Date: Sun, 5 Dec 2021 14:31:28 -0800 Subject: [PATCH 47/59] build(deps): update `sinon` from v2 to v12 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 4b3d648..dad1fea 100644 --- a/package.json +++ b/package.json @@ -42,7 +42,7 @@ "devDependencies": { "c8": "^7.10.0", "prettier": "^2.5.0", - "sinon": ">= 1.9 < 2", + "sinon": "^12.0.1", "uvu": "^0.5.2" }, "engines": { From ca3eb6b500ec79516db96b05e5030ac03166f5eb Mon Sep 17 00:00:00 2001 From: Gregor Martynus <39992+gr2m@users.noreply.github.com> Date: Sun, 5 Dec 2021 14:31:45 -0800 Subject: [PATCH 48/59] build(package): lock file --- package-lock.json | 4078 +++++++-------------------------------------- 1 file changed, 620 insertions(+), 3458 deletions(-) diff --git a/package-lock.json b/package-lock.json index 92c1f8b..d9db21d 100644 --- a/package-lock.json +++ b/package-lock.json @@ -8,1598 +8,414 @@ "name": "mitm", "version": "1.7.2", "devDependencies": { - "nyc": "^15.1.0", + "c8": "^7.10.0", "prettier": "^2.5.0", - "sinon": ">= 1.9 < 2", + "sinon": "^12.0.1", "uvu": "^0.5.2" }, "engines": { "node": ">= 14" } }, - "node_modules/@babel/code-frame": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.16.0.tgz", - "integrity": "sha512-IF4EOMEV+bfYwOmNxGzSnjR2EmQod7f1UXOpZM3l4i4o4QNwzjtJAu/HxdjHq0aYBvdqMuQEY1eg0nqW9ZPORA==", + "node_modules/@bcoe/v8-coverage": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz", + "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==", + "dev": true + }, + "node_modules/@istanbuljs/schema": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", + "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", "dev": true, - "dependencies": { - "@babel/highlight": "^7.16.0" - }, "engines": { - "node": ">=6.9.0" + "node": ">=8" } }, - "node_modules/@babel/compat-data": { - "version": "7.16.4", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.16.4.tgz", - "integrity": "sha512-1o/jo7D+kC9ZjHX5v+EHrdjl3PhxMrLSOTGsOdHJ+KL8HCaEK6ehrVL2RS6oHDZp+L7xLirLrPmQtEng769J/Q==", + "node_modules/@sinonjs/commons": { + "version": "1.8.3", + "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.8.3.tgz", + "integrity": "sha512-xkNcLAn/wZaX14RPlwizcKicDk9G3F8m2nU3L7Ukm5zBgTwiT0wsoFAHx9Jq56fJA1z/7uKGtCRu16sOUCLIHQ==", "dev": true, - "engines": { - "node": ">=6.9.0" + "dependencies": { + "type-detect": "4.0.8" } }, - "node_modules/@babel/core": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.16.0.tgz", - "integrity": "sha512-mYZEvshBRHGsIAiyH5PzCFTCfbWfoYbO/jcSdXQSUQu1/pW0xDZAUP7KEc32heqWTAfAHhV9j1vH8Sav7l+JNQ==", + "node_modules/@sinonjs/fake-timers": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-8.1.0.tgz", + "integrity": "sha512-OAPJUAtgeINhh/TAlUID4QTs53Njm7xzddaVlEs/SXwgtiD1tW22zAB/W1wdqfrpmikgaWQ9Fw6Ws+hsiRm5Vg==", "dev": true, "dependencies": { - "@babel/code-frame": "^7.16.0", - "@babel/generator": "^7.16.0", - "@babel/helper-compilation-targets": "^7.16.0", - "@babel/helper-module-transforms": "^7.16.0", - "@babel/helpers": "^7.16.0", - "@babel/parser": "^7.16.0", - "@babel/template": "^7.16.0", - "@babel/traverse": "^7.16.0", - "@babel/types": "^7.16.0", - "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" - }, - "engines": { - "node": ">=6.9.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/babel" + "@sinonjs/commons": "^1.7.0" } }, - "node_modules/@babel/core/node_modules/debug": { - "version": "4.3.3", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", - "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", + "node_modules/@sinonjs/samsam": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/@sinonjs/samsam/-/samsam-6.0.2.tgz", + "integrity": "sha512-jxPRPp9n93ci7b8hMfJOFDPRLFYadN6FSpeROFTR4UNF4i5b+EK6m4QXPO46BDhFgRy1JuS87zAnFOzCUwMJcQ==", "dev": true, "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } + "@sinonjs/commons": "^1.6.0", + "lodash.get": "^4.4.2", + "type-detect": "^4.0.8" } }, - "node_modules/@babel/core/node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "node_modules/@sinonjs/text-encoding": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/@sinonjs/text-encoding/-/text-encoding-0.7.1.tgz", + "integrity": "sha512-+iTbntw2IZPb/anVDbypzfQa+ay64MW0Zo8aJ8gZPWMMK6/OubMVb6lUPMagqjOPnmtauXnFCACVl3O7ogjeqQ==", "dev": true }, - "node_modules/@babel/core/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - } + "node_modules/@types/istanbul-lib-coverage": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.3.tgz", + "integrity": "sha512-sz7iLqvVUg1gIedBOvlkxPlc8/uVzyS5OwGz1cKjXzkl3FpL3al0crU8YGU1WoHkxn0Wxbw5tyi6hvzJKNzFsw==", + "dev": true }, - "node_modules/@babel/generator": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.16.0.tgz", - "integrity": "sha512-RR8hUCfRQn9j9RPKEVXo9LiwoxLPYn6hNZlvUOR8tSnaxlD0p0+la00ZP9/SnRt6HchKr+X0fO2r8vrETiJGew==", + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", "dev": true, - "dependencies": { - "@babel/types": "^7.16.0", - "jsesc": "^2.5.1", - "source-map": "^0.5.0" - }, "engines": { - "node": ">=6.9.0" + "node": ">=8" } }, - "node_modules/@babel/helper-compilation-targets": { - "version": "7.16.3", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.16.3.tgz", - "integrity": "sha512-vKsoSQAyBmxS35JUOOt+07cLc6Nk/2ljLIHwmq2/NM6hdioUaqEXq/S+nXvbvXbZkNDlWOymPanJGOc4CBjSJA==", + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, "dependencies": { - "@babel/compat-data": "^7.16.0", - "@babel/helper-validator-option": "^7.14.5", - "browserslist": "^4.17.5", - "semver": "^6.3.0" + "color-convert": "^2.0.1" }, "engines": { - "node": ">=6.9.0" + "node": ">=8" }, - "peerDependencies": { - "@babel/core": "^7.0.0" + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/@babel/helper-compilation-targets/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true + }, + "node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", "dev": true, - "bin": { - "semver": "bin/semver.js" + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" } }, - "node_modules/@babel/helper-function-name": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.16.0.tgz", - "integrity": "sha512-BZh4mEk1xi2h4HFjWUXRQX5AEx4rvaZxHgax9gcjdLWdkjsY7MKt5p0otjsg5noXw+pB+clMCjw+aEVYADMjog==", + "node_modules/c8": { + "version": "7.10.0", + "resolved": "https://registry.npmjs.org/c8/-/c8-7.10.0.tgz", + "integrity": "sha512-OAwfC5+emvA6R7pkYFVBTOtI5ruf9DahffGmIqUc9l6wEh0h7iAFP6dt/V9Ioqlr2zW5avX9U9/w1I4alTRHkA==", "dev": true, "dependencies": { - "@babel/helper-get-function-arity": "^7.16.0", - "@babel/template": "^7.16.0", - "@babel/types": "^7.16.0" + "@bcoe/v8-coverage": "^0.2.3", + "@istanbuljs/schema": "^0.1.2", + "find-up": "^5.0.0", + "foreground-child": "^2.0.0", + "istanbul-lib-coverage": "^3.0.1", + "istanbul-lib-report": "^3.0.0", + "istanbul-reports": "^3.0.2", + "rimraf": "^3.0.0", + "test-exclude": "^6.0.0", + "v8-to-istanbul": "^8.0.0", + "yargs": "^16.2.0", + "yargs-parser": "^20.2.7" + }, + "bin": { + "c8": "bin/c8.js" }, "engines": { - "node": ">=6.9.0" + "node": ">=10.12.0" } }, - "node_modules/@babel/helper-get-function-arity": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.16.0.tgz", - "integrity": "sha512-ASCquNcywC1NkYh/z7Cgp3w31YW8aojjYIlNg4VeJiHkqyP4AzIvr4qx7pYDb4/s8YcsZWqqOSxgkvjUz1kpDQ==", + "node_modules/cliui": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", + "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", "dev": true, "dependencies": { - "@babel/types": "^7.16.0" - }, - "engines": { - "node": ">=6.9.0" + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^7.0.0" } }, - "node_modules/@babel/helper-hoist-variables": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.16.0.tgz", - "integrity": "sha512-1AZlpazjUR0EQZQv3sgRNfM9mEVWPK3M6vlalczA+EECcPz3XPh6VplbErL5UoMpChhSck5wAJHthlj1bYpcmg==", + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, "dependencies": { - "@babel/types": "^7.16.0" + "color-name": "~1.1.4" }, "engines": { - "node": ">=6.9.0" + "node": ">=7.0.0" } }, - "node_modules/@babel/helper-member-expression-to-functions": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.16.0.tgz", - "integrity": "sha512-bsjlBFPuWT6IWhl28EdrQ+gTvSvj5tqVP5Xeftp07SEuz5pLnsXZuDkDD3Rfcxy0IsHmbZ+7B2/9SHzxO0T+sQ==", + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", + "dev": true + }, + "node_modules/convert-source-map": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.8.0.tgz", + "integrity": "sha512-+OQdjP49zViI/6i7nIJpA8rAl4sV/JdPfU9nZs3VqOwGIgizICvuN2ru6fMd+4llL0tar18UYJXfZ/TWtmhUjA==", "dev": true, "dependencies": { - "@babel/types": "^7.16.0" - }, - "engines": { - "node": ">=6.9.0" + "safe-buffer": "~5.1.1" } }, - "node_modules/@babel/helper-module-imports": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.16.0.tgz", - "integrity": "sha512-kkH7sWzKPq0xt3H1n+ghb4xEMP8k0U7XV3kkB+ZGy69kDk2ySFW1qPi06sjKzFY3t1j6XbJSqr4mF9L7CYVyhg==", + "node_modules/cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", "dev": true, "dependencies": { - "@babel/types": "^7.16.0" + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" }, "engines": { - "node": ">=6.9.0" + "node": ">= 8" } }, - "node_modules/@babel/helper-module-transforms": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.16.0.tgz", - "integrity": "sha512-My4cr9ATcaBbmaEa8M0dZNA74cfI6gitvUAskgDtAFmAqyFKDSHQo5YstxPbN+lzHl2D9l/YOEFqb2mtUh4gfA==", + "node_modules/dequal": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.2.tgz", + "integrity": "sha512-q9K8BlJVxK7hQYqa6XISGmBZbtQQWVXSrRrWreHC94rMt1QL/Impruc+7p2CYSYuVIUr+YCt6hjrs1kkdJRTug==", "dev": true, - "dependencies": { - "@babel/helper-module-imports": "^7.16.0", - "@babel/helper-replace-supers": "^7.16.0", - "@babel/helper-simple-access": "^7.16.0", - "@babel/helper-split-export-declaration": "^7.16.0", - "@babel/helper-validator-identifier": "^7.15.7", - "@babel/template": "^7.16.0", - "@babel/traverse": "^7.16.0", - "@babel/types": "^7.16.0" - }, "engines": { - "node": ">=6.9.0" + "node": ">=6" } }, - "node_modules/@babel/helper-optimise-call-expression": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.16.0.tgz", - "integrity": "sha512-SuI467Gi2V8fkofm2JPnZzB/SUuXoJA5zXe/xzyPP2M04686RzFKFHPK6HDVN6JvWBIEW8tt9hPR7fXdn2Lgpw==", + "node_modules/diff": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-5.0.0.tgz", + "integrity": "sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w==", "dev": true, - "dependencies": { - "@babel/types": "^7.16.0" - }, "engines": { - "node": ">=6.9.0" + "node": ">=0.3.1" } }, - "node_modules/@babel/helper-replace-supers": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.16.0.tgz", - "integrity": "sha512-TQxuQfSCdoha7cpRNJvfaYxxxzmbxXw/+6cS7V02eeDYyhxderSoMVALvwupA54/pZcOTtVeJ0xccp1nGWladA==", + "node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "node_modules/escalade": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", "dev": true, - "dependencies": { - "@babel/helper-member-expression-to-functions": "^7.16.0", - "@babel/helper-optimise-call-expression": "^7.16.0", - "@babel/traverse": "^7.16.0", - "@babel/types": "^7.16.0" - }, "engines": { - "node": ">=6.9.0" + "node": ">=6" } }, - "node_modules/@babel/helper-simple-access": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.16.0.tgz", - "integrity": "sha512-o1rjBT/gppAqKsYfUdfHq5Rk03lMQrkPHG1OWzHWpLgVXRH4HnMM9Et9CVdIqwkCQlobnGHEJMsgWP/jE1zUiw==", + "node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", "dev": true, "dependencies": { - "@babel/types": "^7.16.0" + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" }, "engines": { - "node": ">=6.9.0" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@babel/helper-split-export-declaration": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.16.0.tgz", - "integrity": "sha512-0YMMRpuDFNGTHNRiiqJX19GjNXA4H0E8jZ2ibccfSxaCogbm3am5WN/2nQNj0YnQwGWM1J06GOcQ2qnh3+0paw==", + "node_modules/foreground-child": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-2.0.0.tgz", + "integrity": "sha512-dCIq9FpEcyQyXKCkyzmlPTFNgrCzPudOe+mhvJU5zAtlBnGVy2yKxtfsxK2tQBThwq225jcvBjpw1Gr40uzZCA==", "dev": true, "dependencies": { - "@babel/types": "^7.16.0" + "cross-spawn": "^7.0.0", + "signal-exit": "^3.0.2" }, "engines": { - "node": ">=6.9.0" + "node": ">=8.0.0" } }, - "node_modules/@babel/helper-validator-identifier": { - "version": "7.15.7", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.15.7.tgz", - "integrity": "sha512-K4JvCtQqad9OY2+yTU8w+E82ywk/fe+ELNlt1G8z3bVGlZfn/hOcQQsUhGhW/N+tb3fxK800wLtKOE/aM0m72w==", + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", + "dev": true + }, + "node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", "dev": true, "engines": { - "node": ">=6.9.0" + "node": "6.* || 8.* || >= 10.*" } }, - "node_modules/@babel/helper-validator-option": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.14.5.tgz", - "integrity": "sha512-OX8D5eeX4XwcroVW45NMvoYaIuFI+GQpA2a8Gi+X/U/cDUIRsV37qQfF905F0htTRCREQIB4KqPeaveRJUl3Ow==", + "node_modules/glob": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", + "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", "dev": true, + "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" + }, "engines": { - "node": ">=6.9.0" + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/@babel/helpers": { - "version": "7.16.3", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.16.3.tgz", - "integrity": "sha512-Xn8IhDlBPhvYTvgewPKawhADichOsbkZuzN7qz2BusOM0brChsyXMDJvldWaYMMUNiCQdQzNEioXTp3sC8Nt8w==", + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true, - "dependencies": { - "@babel/template": "^7.16.0", - "@babel/traverse": "^7.16.3", - "@babel/types": "^7.16.0" - }, "engines": { - "node": ">=6.9.0" + "node": ">=8" } }, - "node_modules/@babel/highlight": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.16.0.tgz", - "integrity": "sha512-t8MH41kUQylBtu2+4IQA3atqevA2lRgqA2wyVB/YiWmsDSuylZZuXOUy9ric30hfzauEFfdsuk/eXTRrGrfd0g==", + "node_modules/html-escaper": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", + "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", + "dev": true + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", "dev": true, "dependencies": { - "@babel/helper-validator-identifier": "^7.15.7", - "chalk": "^2.0.0", - "js-tokens": "^4.0.0" - }, - "engines": { - "node": ">=6.9.0" + "once": "^1.3.0", + "wrappy": "1" } }, - "node_modules/@babel/parser": { - "version": "7.16.4", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.16.4.tgz", - "integrity": "sha512-6V0qdPUaiVHH3RtZeLIsc+6pDhbYzHR8ogA8w+f+Wc77DuXto19g2QUwveINoS34Uw+W8/hQDGJCx+i4n7xcng==", + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", "dev": true, - "bin": { - "parser": "bin/babel-parser.js" - }, "engines": { - "node": ">=6.0.0" + "node": ">=8" } }, - "node_modules/@babel/template": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.16.0.tgz", - "integrity": "sha512-MnZdpFD/ZdYhXwiunMqqgyZyucaYsbL0IrjoGjaVhGilz+x8YB++kRfygSOIj1yOtWKPlx7NBp+9I1RQSgsd5A==", + "node_modules/isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", + "dev": true + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", + "dev": true + }, + "node_modules/istanbul-lib-coverage": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz", + "integrity": "sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw==", "dev": true, - "dependencies": { - "@babel/code-frame": "^7.16.0", - "@babel/parser": "^7.16.0", - "@babel/types": "^7.16.0" - }, "engines": { - "node": ">=6.9.0" + "node": ">=8" } }, - "node_modules/@babel/traverse": { - "version": "7.16.3", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.16.3.tgz", - "integrity": "sha512-eolumr1vVMjqevCpwVO99yN/LoGL0EyHiLO5I043aYQvwOJ9eR5UsZSClHVCzfhBduMAsSzgA/6AyqPjNayJag==", + "node_modules/istanbul-lib-report": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", + "integrity": "sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw==", "dev": true, "dependencies": { - "@babel/code-frame": "^7.16.0", - "@babel/generator": "^7.16.0", - "@babel/helper-function-name": "^7.16.0", - "@babel/helper-hoist-variables": "^7.16.0", - "@babel/helper-split-export-declaration": "^7.16.0", - "@babel/parser": "^7.16.3", - "@babel/types": "^7.16.0", - "debug": "^4.1.0", - "globals": "^11.1.0" + "istanbul-lib-coverage": "^3.0.0", + "make-dir": "^3.0.0", + "supports-color": "^7.1.0" }, "engines": { - "node": ">=6.9.0" + "node": ">=8" } }, - "node_modules/@babel/traverse/node_modules/debug": { - "version": "4.3.3", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", - "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", + "node_modules/istanbul-reports": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.1.tgz", + "integrity": "sha512-q1kvhAXWSsXfMjCdNHNPKZZv94OlspKnoGv+R9RGbnqOOQ0VbNfLFgQDVgi7hHenKsndGq3/o0OBdzDXthWcNw==", "dev": true, "dependencies": { - "ms": "2.1.2" + "html-escaper": "^2.0.0", + "istanbul-lib-report": "^3.0.0" }, "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } + "node": ">=8" } }, - "node_modules/@babel/traverse/node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "node_modules/just-extend": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/just-extend/-/just-extend-4.2.1.tgz", + "integrity": "sha512-g3UB796vUFIY90VIv/WX3L2c8CS2MdWUww3CNrYmqza1Fg0DURc2K/O4YrnklBdQarSJ/y8JnJYDGc+1iumQjg==", "dev": true }, - "node_modules/@babel/types": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.16.0.tgz", - "integrity": "sha512-PJgg/k3SdLsGb3hhisFvtLOw5ts113klrpLuIPtCJIU+BB24fqq6lf8RWqKJEjzqXR9AEH1rIb5XTqwBHB+kQg==", + "node_modules/kleur": { + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/kleur/-/kleur-4.1.4.tgz", + "integrity": "sha512-8QADVssbrFjivHWQU7KkMgptGTl6WAcSdlbBPY4uNF+mWr6DGcKrvY2w4FQJoXch7+fKMjj0dRrL75vk3k23OA==", "dev": true, - "dependencies": { - "@babel/helper-validator-identifier": "^7.15.7", - "to-fast-properties": "^2.0.0" - }, "engines": { - "node": ">=6.9.0" + "node": ">=6" } }, - "node_modules/@istanbuljs/load-nyc-config": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", - "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", + "node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", "dev": true, "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" + "p-locate": "^5.0.0" }, "engines": { - "node": ">=8" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@istanbuljs/schema": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", - "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/aggregate-error": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", - "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", - "dev": true, - "dependencies": { - "clean-stack": "^2.0.0", - "indent-string": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/append-transform": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/append-transform/-/append-transform-2.0.0.tgz", - "integrity": "sha512-7yeyCEurROLQJFv5Xj4lEGTy0borxepjFv1g22oAdqFu//SrAlDl1O1Nxx15SH1RoliUml6p8dwJW9jvZughhg==", - "dev": true, - "dependencies": { - "default-require-extensions": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/archy": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/archy/-/archy-1.0.0.tgz", - "integrity": "sha1-+cjBN1fMHde8N5rHeyxipcKGjEA=", - "dev": true - }, - "node_modules/argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "dev": true, - "dependencies": { - "sprintf-js": "~1.0.2" - } - }, - "node_modules/available-typed-arrays": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz", - "integrity": "sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==", - "dev": true, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "dev": true - }, - "node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/browserslist": { - "version": "4.18.1", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.18.1.tgz", - "integrity": "sha512-8ScCzdpPwR2wQh8IT82CA2VgDwjHyqMovPBZSNH54+tm4Jk2pCuv90gmAdH6J84OCRWi0b4gMe6O6XPXuJnjgQ==", - "dev": true, - "dependencies": { - "caniuse-lite": "^1.0.30001280", - "electron-to-chromium": "^1.3.896", - "escalade": "^3.1.1", - "node-releases": "^2.0.1", - "picocolors": "^1.0.0" - }, - "bin": { - "browserslist": "cli.js" - }, - "engines": { - "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - } - }, - "node_modules/caching-transform": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/caching-transform/-/caching-transform-4.0.0.tgz", - "integrity": "sha512-kpqOvwXnjjN44D89K5ccQC+RUrsy7jB/XLlRrx0D7/2HNcTPqzsb6XgYoErwko6QsV184CA2YgS1fxDiiDZMWA==", - "dev": true, - "dependencies": { - "hasha": "^5.0.0", - "make-dir": "^3.0.0", - "package-hash": "^4.0.0", - "write-file-atomic": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/call-bind": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", - "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", - "dev": true, - "dependencies": { - "function-bind": "^1.1.1", - "get-intrinsic": "^1.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/caniuse-lite": { - "version": "1.0.30001284", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001284.tgz", - "integrity": "sha512-t28SKa7g6kiIQi6NHeOcKrOrGMzCRrXvlasPwWC26TH2QNdglgzQIRUuJ0cR3NeQPH+5jpuveeeSFDLm2zbkEw==", - "dev": true, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - } - }, - "node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/chalk/node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", - "dev": true, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/chalk/node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/clean-stack": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", - "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/cliui": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", - "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", - "dev": true, - "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^6.2.0" - } - }, - "node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "dependencies": { - "color-name": "1.1.3" - } - }, - "node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", - "dev": true - }, - "node_modules/commondir": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", - "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=", - "dev": true - }, - "node_modules/concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", - "dev": true - }, - "node_modules/convert-source-map": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.8.0.tgz", - "integrity": "sha512-+OQdjP49zViI/6i7nIJpA8rAl4sV/JdPfU9nZs3VqOwGIgizICvuN2ru6fMd+4llL0tar18UYJXfZ/TWtmhUjA==", - "dev": true, - "dependencies": { - "safe-buffer": "~5.1.1" - } - }, - "node_modules/convert-source-map/node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true - }, - "node_modules/cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", - "dev": true, - "dependencies": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/decamelize": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/default-require-extensions": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/default-require-extensions/-/default-require-extensions-3.0.0.tgz", - "integrity": "sha512-ek6DpXq/SCpvjhpFsLFRVtIxJCRw6fUR42lYMVZuUMK7n8eMz4Uh5clckdBjEpLhn/gEBZo7hDJnJcwdKLKQjg==", - "dev": true, - "dependencies": { - "strip-bom": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/define-properties": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", - "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", - "dev": true, - "dependencies": { - "object-keys": "^1.0.12" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/dequal": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.2.tgz", - "integrity": "sha512-q9K8BlJVxK7hQYqa6XISGmBZbtQQWVXSrRrWreHC94rMt1QL/Impruc+7p2CYSYuVIUr+YCt6hjrs1kkdJRTug==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/electron-to-chromium": { - "version": "1.4.11", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.11.tgz", - "integrity": "sha512-2OhsaYgsWGhWjx2et8kaUcdktPbBGjKM2X0BReUCKcSCPttEY+hz2zie820JLbttU8jwL92+JJysWwkut3wZgA==", - "dev": true - }, - "node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true - }, - "node_modules/es-abstract": { - "version": "1.19.1", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.19.1.tgz", - "integrity": "sha512-2vJ6tjA/UfqLm2MPs7jxVybLoB8i1t1Jd9R3kISld20sIxPcTbLuggQOUxeWeAvIUkduv/CfMjuh4WmiXr2v9w==", - "dev": true, - "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" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/es-to-primitive": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", - "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", - "dev": true, - "dependencies": { - "is-callable": "^1.1.4", - "is-date-object": "^1.0.1", - "is-symbol": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/es6-error": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/es6-error/-/es6-error-4.1.1.tgz", - "integrity": "sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg==", - "dev": true - }, - "node_modules/escalade": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", - "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", - "dev": true, - "bin": { - "esparse": "bin/esparse.js", - "esvalidate": "bin/esvalidate.js" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/find-cache-dir": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.2.tgz", - "integrity": "sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==", - "dev": true, - "dependencies": { - "commondir": "^1.0.1", - "make-dir": "^3.0.2", - "pkg-dir": "^4.1.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/avajs/find-cache-dir?sponsor=1" - } - }, - "node_modules/find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dev": true, - "dependencies": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/foreach": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/foreach/-/foreach-2.0.5.tgz", - "integrity": "sha1-C+4AUBiusmDQo6865ljdATbsG5k=", - "dev": true - }, - "node_modules/foreground-child": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-2.0.0.tgz", - "integrity": "sha512-dCIq9FpEcyQyXKCkyzmlPTFNgrCzPudOe+mhvJU5zAtlBnGVy2yKxtfsxK2tQBThwq225jcvBjpw1Gr40uzZCA==", - "dev": true, - "dependencies": { - "cross-spawn": "^7.0.0", - "signal-exit": "^3.0.2" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/formatio": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/formatio/-/formatio-1.1.1.tgz", - "integrity": "sha1-XtPM1jZVEJc4NGXZlhmRAOhhYek=", - "deprecated": "This package is unmaintained. Use @sinonjs/formatio instead", - "dev": true, - "dependencies": { - "samsam": "~1.1" - } - }, - "node_modules/fromentries": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/fromentries/-/fromentries-1.3.2.tgz", - "integrity": "sha512-cHEpEQHUg0f8XdtZCc2ZAhrHzKzT0MrFUTcvx+hfxYu7rGMDc5SKoXFh+n4YigxsHXRzc6OrCshdR1bWH6HHyg==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", - "dev": true - }, - "node_modules/function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", - "dev": true - }, - "node_modules/gensync": { - "version": "1.0.0-beta.2", - "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", - "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", - "dev": true, - "engines": { - "node": "6.* || 8.* || >= 10.*" - } - }, - "node_modules/get-intrinsic": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.1.tgz", - "integrity": "sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==", - "dev": true, - "dependencies": { - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.1" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/get-package-type": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", - "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", - "dev": true, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/get-symbol-description": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz", - "integrity": "sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.1.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/globals": { - "version": "11.12.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", - "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/graceful-fs": { - "version": "4.2.8", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.8.tgz", - "integrity": "sha512-qkIilPUYcNhJpd33n0GBXTB1MMPp14TxEsEs0pTrsSVucApsYzW5V+Q8Qxhik6KU3evy+qkAAowTByymK0avdg==", - "dev": true - }, - "node_modules/has": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", - "dev": true, - "dependencies": { - "function-bind": "^1.1.1" - }, - "engines": { - "node": ">= 0.4.0" - } - }, - "node_modules/has-bigints": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.1.tgz", - "integrity": "sha512-LSBS2LjbNBTf6287JEbEzvJgftkF5qFkmCo9hDRpAzKhUOlJ+hx8dd4USs00SgsUNwc4617J9ki5YtEClM2ffA==", - "dev": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/has-symbols": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.2.tgz", - "integrity": "sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw==", - "dev": true, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-tostringtag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", - "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", - "dev": true, - "dependencies": { - "has-symbols": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/hasha": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/hasha/-/hasha-5.2.2.tgz", - "integrity": "sha512-Hrp5vIK/xr5SkeN2onO32H0MgNZ0f17HRNH39WfL0SYUNOTZ5Lz1TJ8Pajo/87dYGEFlLMm7mIc/k/s6Bvz9HQ==", - "dev": true, - "dependencies": { - "is-stream": "^2.0.0", - "type-fest": "^0.8.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/html-escaper": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", - "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", - "dev": true - }, - "node_modules/imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", - "dev": true, - "engines": { - "node": ">=0.8.19" - } - }, - "node_modules/indent-string": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", - "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", - "dev": true, - "dependencies": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "node_modules/inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true - }, - "node_modules/internal-slot": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.3.tgz", - "integrity": "sha512-O0DB1JC/sPyZl7cIo78n5dR7eUSwwpYPiXRhTzNxZVAMUuB8vlnRFyLxdrVToks6XPLVnFfbzaVd5WLjhgg+vA==", - "dev": true, - "dependencies": { - "get-intrinsic": "^1.1.0", - "has": "^1.0.3", - "side-channel": "^1.0.4" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/is-arguments": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz", - "integrity": "sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-bigint": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", - "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", - "dev": true, - "dependencies": { - "has-bigints": "^1.0.1" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-boolean-object": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", - "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-callable": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.4.tgz", - "integrity": "sha512-nsuwtxZfMX67Oryl9LCQ+upnC0Z0BgpwntpS89m1H/TLF0zNfzfLMV/9Wa/6MZsj0acpEjAO0KF1xT6ZdLl95w==", - "dev": true, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-date-object": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", - "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", - "dev": true, - "dependencies": { - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/is-generator-function": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.10.tgz", - "integrity": "sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==", - "dev": true, - "dependencies": { - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-negative-zero": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.1.tgz", - "integrity": "sha512-2z6JzQvZRa9A2Y7xC6dQQm4FSTSTNWjKIYYTt4246eMTJmIo0Q+ZyOsU66X8lxK1AbB92dFeglPLrhwpeRKO6w==", - "dev": true, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-number-object": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.6.tgz", - "integrity": "sha512-bEVOqiRcvo3zO1+G2lVMy+gkkEm9Yh7cDMRusKKu5ZJKPUYSJwICTKZrNKHA2EbSP0Tu0+6B/emsYNHZyn6K8g==", - "dev": true, - "dependencies": { - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-regex": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", - "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-shared-array-buffer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.1.tgz", - "integrity": "sha512-IU0NmyknYZN0rChcKhRO1X8LYz5Isj/Fsqh8NJOSf+N/hCOTwy29F32Ik7a+QszE63IdvmwdTPDd6cZ5pg4cwA==", - "dev": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-stream": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", - "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", - "dev": true, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-string": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", - "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", - "dev": true, - "dependencies": { - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-symbol": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", - "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", - "dev": true, - "dependencies": { - "has-symbols": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-typed-array": { - "version": "1.1.8", - "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.8.tgz", - "integrity": "sha512-HqH41TNZq2fgtGT8WHVFVJhBVGuY3AnP3Q36K8JKXUxSxRgk/d+7NjmwG2vo2mYmXK8UYZKu0qH8bVP5gEisjA==", - "dev": true, - "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" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-typedarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", - "dev": true - }, - "node_modules/is-weakref": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.1.tgz", - "integrity": "sha512-b2jKc2pQZjaeFYWEf7ScFj+Be1I+PXmlu572Q8coTXZ+LD/QQZ7ShPMst8h16riVgyXTQwUsFEl74mDvc/3MHQ==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-windows": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", - "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", - "dev": true - }, - "node_modules/istanbul-lib-coverage": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz", - "integrity": "sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/istanbul-lib-hook": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-hook/-/istanbul-lib-hook-3.0.0.tgz", - "integrity": "sha512-Pt/uge1Q9s+5VAZ+pCo16TYMWPBIl+oaNIjgLQxcX0itS6ueeaA+pEfThZpH8WxhFgCiEb8sAJY6MdUKgiIWaQ==", - "dev": true, - "dependencies": { - "append-transform": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/istanbul-lib-instrument": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-4.0.3.tgz", - "integrity": "sha512-BXgQl9kf4WTCPCCpmFGoJkz/+uhvm7h7PFKUYxh7qarQd3ER33vHG//qaE8eN25l07YqZPpHXU9I09l/RD5aGQ==", - "dev": true, - "dependencies": { - "@babel/core": "^7.7.5", - "@istanbuljs/schema": "^0.1.2", - "istanbul-lib-coverage": "^3.0.0", - "semver": "^6.3.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/istanbul-lib-instrument/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/istanbul-lib-processinfo": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/istanbul-lib-processinfo/-/istanbul-lib-processinfo-2.0.2.tgz", - "integrity": "sha512-kOwpa7z9hme+IBPZMzQ5vdQj8srYgAtaRqeI48NGmAQ+/5yKiHLV0QbYqQpxsdEF0+w14SoB8YbnHKcXE2KnYw==", - "dev": true, - "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" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/istanbul-lib-report": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", - "integrity": "sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw==", - "dev": true, - "dependencies": { - "istanbul-lib-coverage": "^3.0.0", - "make-dir": "^3.0.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/istanbul-lib-report/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/istanbul-lib-report/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/istanbul-lib-source-maps": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz", - "integrity": "sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==", - "dev": true, - "dependencies": { - "debug": "^4.1.1", - "istanbul-lib-coverage": "^3.0.0", - "source-map": "^0.6.1" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/istanbul-lib-source-maps/node_modules/debug": { - "version": "4.3.3", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", - "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", - "dev": true, - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/istanbul-lib-source-maps/node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - }, - "node_modules/istanbul-lib-source-maps/node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/istanbul-reports": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.1.tgz", - "integrity": "sha512-q1kvhAXWSsXfMjCdNHNPKZZv94OlspKnoGv+R9RGbnqOOQ0VbNfLFgQDVgi7hHenKsndGq3/o0OBdzDXthWcNw==", - "dev": true, - "dependencies": { - "html-escaper": "^2.0.0", - "istanbul-lib-report": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", - "dev": true - }, - "node_modules/js-yaml": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", - "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", - "dev": true, - "dependencies": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/jsesc": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", - "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", - "dev": true, - "bin": { - "jsesc": "bin/jsesc" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/json5": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.0.tgz", - "integrity": "sha512-f+8cldu7X/y7RAJurMEJmdoKXGB/X550w2Nr3tTbezL6RwEE/iMcm+tZnXeoZtKuOq6ft8+CqzEkrIgx1fPoQA==", - "dev": true, - "dependencies": { - "minimist": "^1.2.5" - }, - "bin": { - "json5": "lib/cli.js" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/json5/node_modules/minimist": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", - "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", - "dev": true - }, - "node_modules/kleur": { - "version": "4.1.4", - "resolved": "https://registry.npmjs.org/kleur/-/kleur-4.1.4.tgz", - "integrity": "sha512-8QADVssbrFjivHWQU7KkMgptGTl6WAcSdlbBPY4uNF+mWr6DGcKrvY2w4FQJoXch7+fKMjj0dRrL75vk3k23OA==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "dev": true, - "dependencies": { - "p-locate": "^4.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/lodash.flattendeep": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/lodash.flattendeep/-/lodash.flattendeep-4.4.0.tgz", - "integrity": "sha1-+wMJF/hqMTTlvJvsDWngAT3f7bI=", - "dev": true - }, - "node_modules/lolex": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/lolex/-/lolex-1.3.2.tgz", - "integrity": "sha1-fD2mL/yzDw9agKJWbKJORdigHzE=", + "node_modules/lodash.get": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz", + "integrity": "sha1-LRd/ZS+jHpObRDjVNBSZ36OCXpk=", "dev": true }, "node_modules/make-dir": { @@ -1617,104 +433,7 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/make-dir/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/mri": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/mri/-/mri-1.2.0.tgz", - "integrity": "sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/node-preload": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/node-preload/-/node-preload-0.2.1.tgz", - "integrity": "sha512-RM5oyBy45cLEoHqCeh+MNuFAxO0vTFBLskvQbOKnEE7YTTSN4tbN8QWDIPQ6L+WvKsB/qLEGpYe2ZZ9d4W9OIQ==", - "dev": true, - "dependencies": { - "process-on-spawn": "^1.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/node-releases": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.1.tgz", - "integrity": "sha512-CqyzN6z7Q6aMeF/ktcMVTzhAHCEpf8SOarwpzpf8pNBY2k5/oM34UHldUwp8VKI7uxct2HxSRdJjBaZeESzcxA==", - "dev": true - }, - "node_modules/nyc": { - "version": "15.1.0", - "resolved": "https://registry.npmjs.org/nyc/-/nyc-15.1.0.tgz", - "integrity": "sha512-jMW04n9SxKdKi1ZMGhvUTHBN0EICCRkHemEoE5jm6mTYcqcdas0ATzgUgejlQUHMvpnOZqGB5Xxsv9KxJW1j8A==", - "dev": true, - "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" - }, - "bin": { - "nyc": "bin/nyc.js" - }, - "engines": { - "node": ">=8.9" - } - }, - "node_modules/nyc/node_modules/glob": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", - "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", - "dev": true, - "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" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/nyc/node_modules/minimatch": { + "node_modules/minimatch": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", @@ -1726,40 +445,35 @@ "node": "*" } }, - "node_modules/object-inspect": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.11.0.tgz", - "integrity": "sha512-jp7ikS6Sd3GxQfZJPyH3cjcbJF6GZPClgdV+EFygjFLQ5FmW/dRUnTd9PQ9k0JhoNDabWFbpF1yCdSWCC6gexg==", + "node_modules/mri": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/mri/-/mri-1.2.0.tgz", + "integrity": "sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==", "dev": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "engines": { + "node": ">=4" } }, - "node_modules/object-keys": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", - "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "node_modules/nise": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/nise/-/nise-5.1.0.tgz", + "integrity": "sha512-W5WlHu+wvo3PaKLsJJkgPup2LrsXCcm7AWwyNZkUnn5rwPkuPBi3Iwk5SQtN0mv+K65k7nKKjwNQ30wg3wLAQQ==", "dev": true, - "engines": { - "node": ">= 0.4" + "dependencies": { + "@sinonjs/commons": "^1.7.0", + "@sinonjs/fake-timers": "^7.0.4", + "@sinonjs/text-encoding": "^0.7.1", + "just-extend": "^4.0.2", + "path-to-regexp": "^1.7.0" } }, - "node_modules/object.assign": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.2.tgz", - "integrity": "sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ==", + "node_modules/nise/node_modules/@sinonjs/fake-timers": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-7.1.2.tgz", + "integrity": "sha512-iQADsW4LBMISqZ6Ci1dupJL9pprqwcVFTcOsEmQOEhW+KLCVn/Y4Jrvg2k19fIHCp+iFprriYPTdRcQR8NbUPg==", "dev": true, "dependencies": { - "call-bind": "^1.0.0", - "define-properties": "^1.1.3", - "has-symbols": "^1.0.1", - "object-keys": "^1.1.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "@sinonjs/commons": "^1.7.0" } }, "node_modules/once": { @@ -1772,66 +486,33 @@ } }, "node_modules/p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", "dev": true, "dependencies": { - "p-try": "^2.0.0" + "yocto-queue": "^0.1.0" }, "engines": { - "node": ">=6" + "node": ">=10" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "dev": true, - "dependencies": { - "p-limit": "^2.2.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/p-map": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-3.0.0.tgz", - "integrity": "sha512-d3qXVTF/s+W+CdJ5A29wywV2n8CQQYahlgz2bFiA+4eVNJbHJodPZ+/gXwPGh0bOqA+j8S+6+ckmvLGPk1QpxQ==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", "dev": true, "dependencies": { - "aggregate-error": "^3.0.0" + "p-limit": "^3.0.2" }, "engines": { - "node": ">=8" - } - }, - "node_modules/p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/package-hash": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/package-hash/-/package-hash-4.0.0.tgz", - "integrity": "sha512-whdkPIooSu/bASggZ96BWVvZTRMOFxnyUG5PnTSGKoJE2gd5mbVNmR2Nj20QFzxYYgAXpoqC+AiXzl+UMRh7zQ==", - "dev": true, - "dependencies": { - "graceful-fs": "^4.1.15", - "hasha": "^5.0.0", - "lodash.flattendeep": "^4.4.0", - "release-zalgo": "^1.0.0" + "node": ">=10" }, - "engines": { - "node": ">=8" + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/path-exists": { @@ -1861,28 +542,19 @@ "node": ">=8" } }, - "node_modules/picocolors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", - "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", - "dev": true - }, - "node_modules/pkg-dir": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", - "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", + "node_modules/path-to-regexp": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.8.0.tgz", + "integrity": "sha512-n43JRhlUKUAlibEJhPeir1ncUID16QnEjNpwzNdO3Lm4ywrBpBZ5oLD0I6br9evr1Y9JTqwRtAh7JLoOzAQdVA==", "dev": true, "dependencies": { - "find-up": "^4.0.0" - }, - "engines": { - "node": ">=8" + "isarray": "0.0.1" } }, "node_modules/prettier": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.5.0.tgz", - "integrity": "sha512-FM/zAKgWTxj40rH03VxzIPdXmj39SwSjwG0heUcNFwI+EMZJnY93yAiKXM3dObIKAM5TA88werc8T/EwhB45eg==", + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.5.1.tgz", + "integrity": "sha512-vBZcPRUR5MZJwoyi3ZoyQlc1rXeEck8KgeC9AwwOn+exuxLxq5toTRDTSaVrXHxelDMHy9zlicw8u66yxoSUFg==", "dev": true, "bin": { "prettier": "bin-prettier.js" @@ -1891,30 +563,6 @@ "node": ">=10.13.0" } }, - "node_modules/process-on-spawn": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/process-on-spawn/-/process-on-spawn-1.0.0.tgz", - "integrity": "sha512-1WsPDsUSMmZH5LeMLegqkPDrsGgsWwk1Exipy2hvB0o/F0ASzbpIctSCcZIK1ykJvtTJULEH+20WOFjMvGnCTg==", - "dev": true, - "dependencies": { - "fromentries": "^1.2.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/release-zalgo": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/release-zalgo/-/release-zalgo-1.0.0.tgz", - "integrity": "sha1-CXALflB0Mpc5Mw5TXFqQ+2eFFzA=", - "dev": true, - "dependencies": { - "es6-error": "^4.0.1" - }, - "engines": { - "node": ">=4" - } - }, "node_modules/require-directory": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", @@ -1924,21 +572,6 @@ "node": ">=0.10.0" } }, - "node_modules/require-main-filename": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", - "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", - "dev": true - }, - "node_modules/resolve-from": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", - "dev": true, - "engines": { - "node": ">=8" - } - }, "node_modules/rimraf": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", @@ -1954,38 +587,6 @@ "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/rimraf/node_modules/glob": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", - "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", - "dev": true, - "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" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/rimraf/node_modules/minimatch": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", - "dev": true, - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, "node_modules/sade": { "version": "1.7.4", "resolved": "https://registry.npmjs.org/sade/-/sade-1.7.4.tgz", @@ -1999,37 +600,19 @@ } }, "node_modules/safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/samsam": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/samsam/-/samsam-1.1.2.tgz", - "integrity": "sha1-vsEf3IOp/aBjQBIQ5AF2wwJNFWc=", - "deprecated": "This package has been deprecated in favour of @sinonjs/samsam", + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", "dev": true }, - "node_modules/set-blocking": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", - "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", - "dev": true + "node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } }, "node_modules/shebang-command": { "version": "2.0.0", @@ -2052,20 +635,6 @@ "node": ">=8" } }, - "node_modules/side-channel": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", - "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.0", - "get-intrinsic": "^1.0.2", - "object-inspect": "^1.9.0" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/signal-exit": { "version": "3.0.6", "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.6.tgz", @@ -2073,52 +642,32 @@ "dev": true }, "node_modules/sinon": { - "version": "1.17.7", - "resolved": "https://registry.npmjs.org/sinon/-/sinon-1.17.7.tgz", - "integrity": "sha1-RUKk9JugxFwF6y6d2dID4rjv4L8=", + "version": "12.0.1", + "resolved": "https://registry.npmjs.org/sinon/-/sinon-12.0.1.tgz", + "integrity": "sha512-iGu29Xhym33ydkAT+aNQFBINakjq69kKO6ByPvTsm3yyIACfyQttRTP03aBP/I8GfhFmLzrnKwNNkr0ORb1udg==", "dev": true, "dependencies": { - "formatio": "1.1.1", - "lolex": "1.3.2", - "samsam": "1.1.2", - "util": ">=0.10.3 <1" + "@sinonjs/commons": "^1.8.3", + "@sinonjs/fake-timers": "^8.1.0", + "@sinonjs/samsam": "^6.0.2", + "diff": "^5.0.0", + "nise": "^5.1.0", + "supports-color": "^7.2.0" }, - "engines": { - "node": ">=0.1.103" - } - }, - "node_modules/source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true, - "engines": { - "node": ">=0.10.0" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/sinon" } }, - "node_modules/spawn-wrap": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/spawn-wrap/-/spawn-wrap-2.0.0.tgz", - "integrity": "sha512-EeajNjfN9zMnULLwhZZQU3GWBoFNkbngTUPfaawT4RkMiviTxcX0qfhVbGey39mfctfDHkWtuecgQ8NJcyQWHg==", + "node_modules/source-map": { + "version": "0.7.3", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", + "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==", "dev": true, - "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" - }, "engines": { - "node": ">=8" + "node": ">= 8" } }, - "node_modules/sprintf-js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", - "dev": true - }, "node_modules/string-width": { "version": "4.2.3", "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", @@ -2133,32 +682,6 @@ "node": ">=8" } }, - "node_modules/string.prototype.trimend": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.4.tgz", - "integrity": "sha512-y9xCjw1P23Awk8EvTpcyL2NIr1j7wJ39f+k6lvRnSMz+mz9CGz9NYPelDk42kOz6+ql8xjfK8oYzy3jAP5QU5A==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/string.prototype.trimstart": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.4.tgz", - "integrity": "sha512-jh6e984OBfvxS50tdY2nRZnoC5/mLFKOREQfw8t5yytkoUsJRNxvI/E39qu1sD0OtWI3OC0XgKSmcWwziwYuZw==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/strip-ansi": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", @@ -2171,11 +694,14 @@ "node": ">=8" } }, - "node_modules/strip-bom": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", - "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", + "node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, "engines": { "node": ">=8" } @@ -2194,47 +720,6 @@ "node": ">=8" } }, - "node_modules/test-exclude/node_modules/glob": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", - "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", - "dev": true, - "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" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/test-exclude/node_modules/minimatch": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", - "dev": true, - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/to-fast-properties": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", - "dev": true, - "engines": { - "node": ">=4" - } - }, "node_modules/totalist": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/totalist/-/totalist-2.0.0.tgz", @@ -2244,61 +729,13 @@ "node": ">=6" } }, - "node_modules/type-fest": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", - "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", + "node_modules/type-detect": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", + "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", "dev": true, "engines": { - "node": ">=8" - } - }, - "node_modules/typedarray-to-buffer": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", - "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", - "dev": true, - "dependencies": { - "is-typedarray": "^1.0.0" - } - }, - "node_modules/unbox-primitive": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.1.tgz", - "integrity": "sha512-tZU/3NqK3dA5gpE1KtyiJUrEB0lxnGkMFHptJ7q6ewdZ8s12QrODwNbhIJStmJkd1QDXa1NRA8aF2A1zk/Ypyw==", - "dev": true, - "dependencies": { - "function-bind": "^1.1.1", - "has-bigints": "^1.0.1", - "has-symbols": "^1.0.2", - "which-boxed-primitive": "^1.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/util": { - "version": "0.12.4", - "resolved": "https://registry.npmjs.org/util/-/util-0.12.4.tgz", - "integrity": "sha512-bxZ9qtSlGUWSOy9Qa9Xgk11kSslpuZwaxCg4sNIDj6FLucDab2JxnHwyNTCpHMtK1MjoQiWQ6DiUMZYbSrO+Sw==", - "dev": true, - "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" - } - }, - "node_modules/uuid": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", - "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", - "deprecated": "Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details.", - "dev": true, - "bin": { - "uuid": "bin/uuid" + "node": ">=4" } }, "node_modules/uvu": { @@ -2320,13 +757,18 @@ "node": ">=8" } }, - "node_modules/uvu/node_modules/diff": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/diff/-/diff-5.0.0.tgz", - "integrity": "sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w==", + "node_modules/v8-to-istanbul": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-8.1.0.tgz", + "integrity": "sha512-/PRhfd8aTNp9Ggr62HPzXg2XasNFGy5PBt0Rp04du7/8GNNSgxFL6WBTkgMKSL9bFjH+8kKEG3f37FmxiTqUUA==", "dev": true, + "dependencies": { + "@types/istanbul-lib-coverage": "^2.0.1", + "convert-source-map": "^1.6.0", + "source-map": "^0.7.3" + }, "engines": { - "node": ">=0.3.1" + "node": ">=10.12.0" } }, "node_modules/which": { @@ -2344,52 +786,10 @@ "node": ">= 8" } }, - "node_modules/which-boxed-primitive": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", - "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", - "dev": true, - "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" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/which-module": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", - "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", - "dev": true - }, - "node_modules/which-typed-array": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.7.tgz", - "integrity": "sha512-vjxaB4nfDqwKI0ws7wZpxIlde1XrLX5uB0ZjpfshgmapJMD7jJWhZI+yToJTqaFByF0eNBcYxbjmCzoRP7CfEw==", - "dev": true, - "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" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/wrap-ansi": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", - "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", "dev": true, "dependencies": { "ansi-styles": "^4.0.0", @@ -2397,404 +797,73 @@ "strip-ansi": "^6.0.0" }, "engines": { - "node": ">=8" - } - }, - "node_modules/wrap-ansi/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" + "node": ">=10" }, "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, - "node_modules/wrap-ansi/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/wrap-ansi/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, "node_modules/wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", "dev": true }, - "node_modules/write-file-atomic": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz", - "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==", - "dev": true, - "dependencies": { - "imurmurhash": "^0.1.4", - "is-typedarray": "^1.0.0", - "signal-exit": "^3.0.2", - "typedarray-to-buffer": "^3.1.5" - } - }, "node_modules/y18n": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", - "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==", - "dev": true - }, - "node_modules/yargs": { - "version": "15.4.1", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz", - "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==", - "dev": true, - "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" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/yargs-parser": { - "version": "18.1.3", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", - "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", "dev": true, - "dependencies": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" - }, "engines": { - "node": ">=6" - } - } - }, - "dependencies": { - "@babel/code-frame": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.16.0.tgz", - "integrity": "sha512-IF4EOMEV+bfYwOmNxGzSnjR2EmQod7f1UXOpZM3l4i4o4QNwzjtJAu/HxdjHq0aYBvdqMuQEY1eg0nqW9ZPORA==", - "dev": true, - "requires": { - "@babel/highlight": "^7.16.0" - } - }, - "@babel/compat-data": { - "version": "7.16.4", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.16.4.tgz", - "integrity": "sha512-1o/jo7D+kC9ZjHX5v+EHrdjl3PhxMrLSOTGsOdHJ+KL8HCaEK6ehrVL2RS6oHDZp+L7xLirLrPmQtEng769J/Q==", - "dev": true - }, - "@babel/core": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.16.0.tgz", - "integrity": "sha512-mYZEvshBRHGsIAiyH5PzCFTCfbWfoYbO/jcSdXQSUQu1/pW0xDZAUP7KEc32heqWTAfAHhV9j1vH8Sav7l+JNQ==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.16.0", - "@babel/generator": "^7.16.0", - "@babel/helper-compilation-targets": "^7.16.0", - "@babel/helper-module-transforms": "^7.16.0", - "@babel/helpers": "^7.16.0", - "@babel/parser": "^7.16.0", - "@babel/template": "^7.16.0", - "@babel/traverse": "^7.16.0", - "@babel/types": "^7.16.0", - "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" - }, - "dependencies": { - "debug": { - "version": "4.3.3", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", - "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", - "dev": true, - "requires": { - "ms": "2.1.2" - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - }, - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true - } - } - }, - "@babel/generator": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.16.0.tgz", - "integrity": "sha512-RR8hUCfRQn9j9RPKEVXo9LiwoxLPYn6hNZlvUOR8tSnaxlD0p0+la00ZP9/SnRt6HchKr+X0fO2r8vrETiJGew==", - "dev": true, - "requires": { - "@babel/types": "^7.16.0", - "jsesc": "^2.5.1", - "source-map": "^0.5.0" - } - }, - "@babel/helper-compilation-targets": { - "version": "7.16.3", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.16.3.tgz", - "integrity": "sha512-vKsoSQAyBmxS35JUOOt+07cLc6Nk/2ljLIHwmq2/NM6hdioUaqEXq/S+nXvbvXbZkNDlWOymPanJGOc4CBjSJA==", - "dev": true, - "requires": { - "@babel/compat-data": "^7.16.0", - "@babel/helper-validator-option": "^7.14.5", - "browserslist": "^4.17.5", - "semver": "^6.3.0" - }, - "dependencies": { - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true - } - } - }, - "@babel/helper-function-name": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.16.0.tgz", - "integrity": "sha512-BZh4mEk1xi2h4HFjWUXRQX5AEx4rvaZxHgax9gcjdLWdkjsY7MKt5p0otjsg5noXw+pB+clMCjw+aEVYADMjog==", - "dev": true, - "requires": { - "@babel/helper-get-function-arity": "^7.16.0", - "@babel/template": "^7.16.0", - "@babel/types": "^7.16.0" - } - }, - "@babel/helper-get-function-arity": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.16.0.tgz", - "integrity": "sha512-ASCquNcywC1NkYh/z7Cgp3w31YW8aojjYIlNg4VeJiHkqyP4AzIvr4qx7pYDb4/s8YcsZWqqOSxgkvjUz1kpDQ==", - "dev": true, - "requires": { - "@babel/types": "^7.16.0" - } - }, - "@babel/helper-hoist-variables": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.16.0.tgz", - "integrity": "sha512-1AZlpazjUR0EQZQv3sgRNfM9mEVWPK3M6vlalczA+EECcPz3XPh6VplbErL5UoMpChhSck5wAJHthlj1bYpcmg==", - "dev": true, - "requires": { - "@babel/types": "^7.16.0" - } - }, - "@babel/helper-member-expression-to-functions": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.16.0.tgz", - "integrity": "sha512-bsjlBFPuWT6IWhl28EdrQ+gTvSvj5tqVP5Xeftp07SEuz5pLnsXZuDkDD3Rfcxy0IsHmbZ+7B2/9SHzxO0T+sQ==", - "dev": true, - "requires": { - "@babel/types": "^7.16.0" - } - }, - "@babel/helper-module-imports": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.16.0.tgz", - "integrity": "sha512-kkH7sWzKPq0xt3H1n+ghb4xEMP8k0U7XV3kkB+ZGy69kDk2ySFW1qPi06sjKzFY3t1j6XbJSqr4mF9L7CYVyhg==", - "dev": true, - "requires": { - "@babel/types": "^7.16.0" - } - }, - "@babel/helper-module-transforms": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.16.0.tgz", - "integrity": "sha512-My4cr9ATcaBbmaEa8M0dZNA74cfI6gitvUAskgDtAFmAqyFKDSHQo5YstxPbN+lzHl2D9l/YOEFqb2mtUh4gfA==", - "dev": true, - "requires": { - "@babel/helper-module-imports": "^7.16.0", - "@babel/helper-replace-supers": "^7.16.0", - "@babel/helper-simple-access": "^7.16.0", - "@babel/helper-split-export-declaration": "^7.16.0", - "@babel/helper-validator-identifier": "^7.15.7", - "@babel/template": "^7.16.0", - "@babel/traverse": "^7.16.0", - "@babel/types": "^7.16.0" - } - }, - "@babel/helper-optimise-call-expression": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.16.0.tgz", - "integrity": "sha512-SuI467Gi2V8fkofm2JPnZzB/SUuXoJA5zXe/xzyPP2M04686RzFKFHPK6HDVN6JvWBIEW8tt9hPR7fXdn2Lgpw==", - "dev": true, - "requires": { - "@babel/types": "^7.16.0" - } - }, - "@babel/helper-replace-supers": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.16.0.tgz", - "integrity": "sha512-TQxuQfSCdoha7cpRNJvfaYxxxzmbxXw/+6cS7V02eeDYyhxderSoMVALvwupA54/pZcOTtVeJ0xccp1nGWladA==", - "dev": true, - "requires": { - "@babel/helper-member-expression-to-functions": "^7.16.0", - "@babel/helper-optimise-call-expression": "^7.16.0", - "@babel/traverse": "^7.16.0", - "@babel/types": "^7.16.0" - } - }, - "@babel/helper-simple-access": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.16.0.tgz", - "integrity": "sha512-o1rjBT/gppAqKsYfUdfHq5Rk03lMQrkPHG1OWzHWpLgVXRH4HnMM9Et9CVdIqwkCQlobnGHEJMsgWP/jE1zUiw==", - "dev": true, - "requires": { - "@babel/types": "^7.16.0" - } - }, - "@babel/helper-split-export-declaration": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.16.0.tgz", - "integrity": "sha512-0YMMRpuDFNGTHNRiiqJX19GjNXA4H0E8jZ2ibccfSxaCogbm3am5WN/2nQNj0YnQwGWM1J06GOcQ2qnh3+0paw==", - "dev": true, - "requires": { - "@babel/types": "^7.16.0" - } - }, - "@babel/helper-validator-identifier": { - "version": "7.15.7", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.15.7.tgz", - "integrity": "sha512-K4JvCtQqad9OY2+yTU8w+E82ywk/fe+ELNlt1G8z3bVGlZfn/hOcQQsUhGhW/N+tb3fxK800wLtKOE/aM0m72w==", - "dev": true - }, - "@babel/helper-validator-option": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.14.5.tgz", - "integrity": "sha512-OX8D5eeX4XwcroVW45NMvoYaIuFI+GQpA2a8Gi+X/U/cDUIRsV37qQfF905F0htTRCREQIB4KqPeaveRJUl3Ow==", - "dev": true - }, - "@babel/helpers": { - "version": "7.16.3", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.16.3.tgz", - "integrity": "sha512-Xn8IhDlBPhvYTvgewPKawhADichOsbkZuzN7qz2BusOM0brChsyXMDJvldWaYMMUNiCQdQzNEioXTp3sC8Nt8w==", - "dev": true, - "requires": { - "@babel/template": "^7.16.0", - "@babel/traverse": "^7.16.3", - "@babel/types": "^7.16.0" - } - }, - "@babel/highlight": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.16.0.tgz", - "integrity": "sha512-t8MH41kUQylBtu2+4IQA3atqevA2lRgqA2wyVB/YiWmsDSuylZZuXOUy9ric30hfzauEFfdsuk/eXTRrGrfd0g==", - "dev": true, - "requires": { - "@babel/helper-validator-identifier": "^7.15.7", - "chalk": "^2.0.0", - "js-tokens": "^4.0.0" - } - }, - "@babel/parser": { - "version": "7.16.4", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.16.4.tgz", - "integrity": "sha512-6V0qdPUaiVHH3RtZeLIsc+6pDhbYzHR8ogA8w+f+Wc77DuXto19g2QUwveINoS34Uw+W8/hQDGJCx+i4n7xcng==", - "dev": true - }, - "@babel/template": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.16.0.tgz", - "integrity": "sha512-MnZdpFD/ZdYhXwiunMqqgyZyucaYsbL0IrjoGjaVhGilz+x8YB++kRfygSOIj1yOtWKPlx7NBp+9I1RQSgsd5A==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.16.0", - "@babel/parser": "^7.16.0", - "@babel/types": "^7.16.0" + "node": ">=10" } }, - "@babel/traverse": { - "version": "7.16.3", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.16.3.tgz", - "integrity": "sha512-eolumr1vVMjqevCpwVO99yN/LoGL0EyHiLO5I043aYQvwOJ9eR5UsZSClHVCzfhBduMAsSzgA/6AyqPjNayJag==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.16.0", - "@babel/generator": "^7.16.0", - "@babel/helper-function-name": "^7.16.0", - "@babel/helper-hoist-variables": "^7.16.0", - "@babel/helper-split-export-declaration": "^7.16.0", - "@babel/parser": "^7.16.3", - "@babel/types": "^7.16.0", - "debug": "^4.1.0", - "globals": "^11.1.0" - }, + "node_modules/yargs": { + "version": "16.2.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", + "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", + "dev": true, "dependencies": { - "debug": { - "version": "4.3.3", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", - "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", - "dev": true, - "requires": { - "ms": "2.1.2" - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - } + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.0", + "y18n": "^5.0.5", + "yargs-parser": "^20.2.2" + }, + "engines": { + "node": ">=10" } }, - "@babel/types": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.16.0.tgz", - "integrity": "sha512-PJgg/k3SdLsGb3hhisFvtLOw5ts113klrpLuIPtCJIU+BB24fqq6lf8RWqKJEjzqXR9AEH1rIb5XTqwBHB+kQg==", + "node_modules/yargs-parser": { + "version": "20.2.9", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", + "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", "dev": true, - "requires": { - "@babel/helper-validator-identifier": "^7.15.7", - "to-fast-properties": "^2.0.0" + "engines": { + "node": ">=10" } }, - "@istanbuljs/load-nyc-config": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", - "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", + "node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", "dev": true, - "requires": { - "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" + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } + } + }, + "dependencies": { + "@bcoe/v8-coverage": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz", + "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==", + "dev": true }, "@istanbuljs/schema": { "version": "0.1.3", @@ -2802,61 +871,62 @@ "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", "dev": true }, - "aggregate-error": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", - "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", + "@sinonjs/commons": { + "version": "1.8.3", + "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.8.3.tgz", + "integrity": "sha512-xkNcLAn/wZaX14RPlwizcKicDk9G3F8m2nU3L7Ukm5zBgTwiT0wsoFAHx9Jq56fJA1z/7uKGtCRu16sOUCLIHQ==", "dev": true, "requires": { - "clean-stack": "^2.0.0", - "indent-string": "^4.0.0" + "type-detect": "4.0.8" } }, - "ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true - }, - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "@sinonjs/fake-timers": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-8.1.0.tgz", + "integrity": "sha512-OAPJUAtgeINhh/TAlUID4QTs53Njm7xzddaVlEs/SXwgtiD1tW22zAB/W1wdqfrpmikgaWQ9Fw6Ws+hsiRm5Vg==", "dev": true, "requires": { - "color-convert": "^1.9.0" + "@sinonjs/commons": "^1.7.0" } }, - "append-transform": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/append-transform/-/append-transform-2.0.0.tgz", - "integrity": "sha512-7yeyCEurROLQJFv5Xj4lEGTy0borxepjFv1g22oAdqFu//SrAlDl1O1Nxx15SH1RoliUml6p8dwJW9jvZughhg==", + "@sinonjs/samsam": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/@sinonjs/samsam/-/samsam-6.0.2.tgz", + "integrity": "sha512-jxPRPp9n93ci7b8hMfJOFDPRLFYadN6FSpeROFTR4UNF4i5b+EK6m4QXPO46BDhFgRy1JuS87zAnFOzCUwMJcQ==", "dev": true, "requires": { - "default-require-extensions": "^3.0.0" + "@sinonjs/commons": "^1.6.0", + "lodash.get": "^4.4.2", + "type-detect": "^4.0.8" } }, - "archy": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/archy/-/archy-1.0.0.tgz", - "integrity": "sha1-+cjBN1fMHde8N5rHeyxipcKGjEA=", + "@sinonjs/text-encoding": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/@sinonjs/text-encoding/-/text-encoding-0.7.1.tgz", + "integrity": "sha512-+iTbntw2IZPb/anVDbypzfQa+ay64MW0Zo8aJ8gZPWMMK6/OubMVb6lUPMagqjOPnmtauXnFCACVl3O7ogjeqQ==", + "dev": true + }, + "@types/istanbul-lib-coverage": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.3.tgz", + "integrity": "sha512-sz7iLqvVUg1gIedBOvlkxPlc8/uVzyS5OwGz1cKjXzkl3FpL3al0crU8YGU1WoHkxn0Wxbw5tyi6hvzJKNzFsw==", + "dev": true + }, + "ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", "dev": true }, - "argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, "requires": { - "sprintf-js": "~1.0.2" + "color-convert": "^2.0.1" } }, - "available-typed-arrays": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz", - "integrity": "sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==", - "dev": true - }, "balanced-match": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", @@ -2873,117 +943,50 @@ "concat-map": "0.0.1" } }, - "browserslist": { - "version": "4.18.1", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.18.1.tgz", - "integrity": "sha512-8ScCzdpPwR2wQh8IT82CA2VgDwjHyqMovPBZSNH54+tm4Jk2pCuv90gmAdH6J84OCRWi0b4gMe6O6XPXuJnjgQ==", - "dev": true, - "requires": { - "caniuse-lite": "^1.0.30001280", - "electron-to-chromium": "^1.3.896", - "escalade": "^3.1.1", - "node-releases": "^2.0.1", - "picocolors": "^1.0.0" - } - }, - "caching-transform": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/caching-transform/-/caching-transform-4.0.0.tgz", - "integrity": "sha512-kpqOvwXnjjN44D89K5ccQC+RUrsy7jB/XLlRrx0D7/2HNcTPqzsb6XgYoErwko6QsV184CA2YgS1fxDiiDZMWA==", - "dev": true, - "requires": { - "hasha": "^5.0.0", - "make-dir": "^3.0.0", - "package-hash": "^4.0.0", - "write-file-atomic": "^3.0.0" - } - }, - "call-bind": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", - "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", - "dev": true, - "requires": { - "function-bind": "^1.1.1", - "get-intrinsic": "^1.0.2" - } - }, - "camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", - "dev": true - }, - "caniuse-lite": { - "version": "1.0.30001284", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001284.tgz", - "integrity": "sha512-t28SKa7g6kiIQi6NHeOcKrOrGMzCRrXvlasPwWC26TH2QNdglgzQIRUuJ0cR3NeQPH+5jpuveeeSFDLm2zbkEw==", - "dev": true - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "c8": { + "version": "7.10.0", + "resolved": "https://registry.npmjs.org/c8/-/c8-7.10.0.tgz", + "integrity": "sha512-OAwfC5+emvA6R7pkYFVBTOtI5ruf9DahffGmIqUc9l6wEh0h7iAFP6dt/V9Ioqlr2zW5avX9U9/w1I4alTRHkA==", "dev": true, "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", - "dev": true - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } + "@bcoe/v8-coverage": "^0.2.3", + "@istanbuljs/schema": "^0.1.2", + "find-up": "^5.0.0", + "foreground-child": "^2.0.0", + "istanbul-lib-coverage": "^3.0.1", + "istanbul-lib-report": "^3.0.0", + "istanbul-reports": "^3.0.2", + "rimraf": "^3.0.0", + "test-exclude": "^6.0.0", + "v8-to-istanbul": "^8.0.0", + "yargs": "^16.2.0", + "yargs-parser": "^20.2.7" } }, - "clean-stack": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", - "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", - "dev": true - }, "cliui": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", - "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", + "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", "dev": true, "requires": { "string-width": "^4.2.0", "strip-ansi": "^6.0.0", - "wrap-ansi": "^6.2.0" + "wrap-ansi": "^7.0.0" } }, "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, "requires": { - "color-name": "1.1.3" + "color-name": "~1.1.4" } }, "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", - "dev": true - }, - "commondir": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", - "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=", + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, "concat-map": { @@ -2999,14 +1002,6 @@ "dev": true, "requires": { "safe-buffer": "~5.1.1" - }, - "dependencies": { - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true - } } }, "cross-spawn": { @@ -3020,40 +1015,16 @@ "which": "^2.0.1" } }, - "decamelize": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", - "dev": true - }, - "default-require-extensions": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/default-require-extensions/-/default-require-extensions-3.0.0.tgz", - "integrity": "sha512-ek6DpXq/SCpvjhpFsLFRVtIxJCRw6fUR42lYMVZuUMK7n8eMz4Uh5clckdBjEpLhn/gEBZo7hDJnJcwdKLKQjg==", - "dev": true, - "requires": { - "strip-bom": "^4.0.0" - } - }, - "define-properties": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", - "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", - "dev": true, - "requires": { - "object-keys": "^1.0.12" - } - }, "dequal": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.2.tgz", "integrity": "sha512-q9K8BlJVxK7hQYqa6XISGmBZbtQQWVXSrRrWreHC94rMt1QL/Impruc+7p2CYSYuVIUr+YCt6hjrs1kkdJRTug==", "dev": true }, - "electron-to-chromium": { - "version": "1.4.11", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.11.tgz", - "integrity": "sha512-2OhsaYgsWGhWjx2et8kaUcdktPbBGjKM2X0BReUCKcSCPttEY+hz2zie820JLbttU8jwL92+JJysWwkut3wZgA==", + "diff": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-5.0.0.tgz", + "integrity": "sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w==", "dev": true }, "emoji-regex": { @@ -3062,90 +1033,22 @@ "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", "dev": true }, - "es-abstract": { - "version": "1.19.1", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.19.1.tgz", - "integrity": "sha512-2vJ6tjA/UfqLm2MPs7jxVybLoB8i1t1Jd9R3kISld20sIxPcTbLuggQOUxeWeAvIUkduv/CfMjuh4WmiXr2v9w==", - "dev": true, - "requires": { - "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": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", - "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", - "dev": true, - "requires": { - "is-callable": "^1.1.4", - "is-date-object": "^1.0.1", - "is-symbol": "^1.0.2" - } - }, - "es6-error": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/es6-error/-/es6-error-4.1.1.tgz", - "integrity": "sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg==", - "dev": true - }, "escalade": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", "dev": true }, - "esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", - "dev": true - }, - "find-cache-dir": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.2.tgz", - "integrity": "sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==", - "dev": true, - "requires": { - "commondir": "^1.0.1", - "make-dir": "^3.0.2", - "pkg-dir": "^4.1.0" - } - }, "find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", "dev": true, "requires": { - "locate-path": "^5.0.0", + "locate-path": "^6.0.0", "path-exists": "^4.0.0" } }, - "foreach": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/foreach/-/foreach-2.0.5.tgz", - "integrity": "sha1-C+4AUBiusmDQo6865ljdATbsG5k=", - "dev": true - }, "foreground-child": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-2.0.0.tgz", @@ -3156,148 +1059,44 @@ "signal-exit": "^3.0.2" } }, - "formatio": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/formatio/-/formatio-1.1.1.tgz", - "integrity": "sha1-XtPM1jZVEJc4NGXZlhmRAOhhYek=", - "dev": true, - "requires": { - "samsam": "~1.1" - } - }, - "fromentries": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/fromentries/-/fromentries-1.3.2.tgz", - "integrity": "sha512-cHEpEQHUg0f8XdtZCc2ZAhrHzKzT0MrFUTcvx+hfxYu7rGMDc5SKoXFh+n4YigxsHXRzc6OrCshdR1bWH6HHyg==", - "dev": true - }, "fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", "dev": true }, - "function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", - "dev": true - }, - "gensync": { - "version": "1.0.0-beta.2", - "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", - "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", - "dev": true - }, "get-caller-file": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", "dev": true }, - "get-intrinsic": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.1.tgz", - "integrity": "sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==", - "dev": true, - "requires": { - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.1" - } - }, - "get-package-type": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", - "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", - "dev": true - }, - "get-symbol-description": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz", - "integrity": "sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.1.1" - } - }, - "globals": { - "version": "11.12.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", - "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", - "dev": true - }, - "graceful-fs": { - "version": "4.2.8", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.8.tgz", - "integrity": "sha512-qkIilPUYcNhJpd33n0GBXTB1MMPp14TxEsEs0pTrsSVucApsYzW5V+Q8Qxhik6KU3evy+qkAAowTByymK0avdg==", - "dev": true - }, - "has": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "glob": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", + "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", "dev": true, "requires": { - "function-bind": "^1.1.1" + "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" } }, - "has-bigints": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.1.tgz", - "integrity": "sha512-LSBS2LjbNBTf6287JEbEzvJgftkF5qFkmCo9hDRpAzKhUOlJ+hx8dd4USs00SgsUNwc4617J9ki5YtEClM2ffA==", - "dev": true - }, "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", - "dev": true - }, - "has-symbols": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.2.tgz", - "integrity": "sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true }, - "has-tostringtag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", - "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", - "dev": true, - "requires": { - "has-symbols": "^1.0.2" - } - }, - "hasha": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/hasha/-/hasha-5.2.2.tgz", - "integrity": "sha512-Hrp5vIK/xr5SkeN2onO32H0MgNZ0f17HRNH39WfL0SYUNOTZ5Lz1TJ8Pajo/87dYGEFlLMm7mIc/k/s6Bvz9HQ==", - "dev": true, - "requires": { - "is-stream": "^2.0.0", - "type-fest": "^0.8.0" - } - }, "html-escaper": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", "dev": true }, - "imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", - "dev": true - }, - "indent-string": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", - "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", - "dev": true - }, "inflight": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", @@ -3314,163 +1113,16 @@ "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", "dev": true }, - "internal-slot": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.3.tgz", - "integrity": "sha512-O0DB1JC/sPyZl7cIo78n5dR7eUSwwpYPiXRhTzNxZVAMUuB8vlnRFyLxdrVToks6XPLVnFfbzaVd5WLjhgg+vA==", - "dev": true, - "requires": { - "get-intrinsic": "^1.1.0", - "has": "^1.0.3", - "side-channel": "^1.0.4" - } - }, - "is-arguments": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz", - "integrity": "sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" - } - }, - "is-bigint": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", - "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", - "dev": true, - "requires": { - "has-bigints": "^1.0.1" - } - }, - "is-boolean-object": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", - "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" - } - }, - "is-callable": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.4.tgz", - "integrity": "sha512-nsuwtxZfMX67Oryl9LCQ+upnC0Z0BgpwntpS89m1H/TLF0zNfzfLMV/9Wa/6MZsj0acpEjAO0KF1xT6ZdLl95w==", - "dev": true - }, - "is-date-object": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", - "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", - "dev": true, - "requires": { - "has-tostringtag": "^1.0.0" - } - }, "is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true - }, - "is-generator-function": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.10.tgz", - "integrity": "sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==", - "dev": true, - "requires": { - "has-tostringtag": "^1.0.0" - } - }, - "is-negative-zero": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.1.tgz", - "integrity": "sha512-2z6JzQvZRa9A2Y7xC6dQQm4FSTSTNWjKIYYTt4246eMTJmIo0Q+ZyOsU66X8lxK1AbB92dFeglPLrhwpeRKO6w==", - "dev": true - }, - "is-number-object": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.6.tgz", - "integrity": "sha512-bEVOqiRcvo3zO1+G2lVMy+gkkEm9Yh7cDMRusKKu5ZJKPUYSJwICTKZrNKHA2EbSP0Tu0+6B/emsYNHZyn6K8g==", - "dev": true, - "requires": { - "has-tostringtag": "^1.0.0" - } - }, - "is-regex": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", - "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" - } - }, - "is-shared-array-buffer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.1.tgz", - "integrity": "sha512-IU0NmyknYZN0rChcKhRO1X8LYz5Isj/Fsqh8NJOSf+N/hCOTwy29F32Ik7a+QszE63IdvmwdTPDd6cZ5pg4cwA==", - "dev": true - }, - "is-stream": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", - "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", - "dev": true - }, - "is-string": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", - "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", - "dev": true, - "requires": { - "has-tostringtag": "^1.0.0" - } - }, - "is-symbol": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", - "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", - "dev": true, - "requires": { - "has-symbols": "^1.0.2" - } - }, - "is-typed-array": { - "version": "1.1.8", - "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.8.tgz", - "integrity": "sha512-HqH41TNZq2fgtGT8WHVFVJhBVGuY3AnP3Q36K8JKXUxSxRgk/d+7NjmwG2vo2mYmXK8UYZKu0qH8bVP5gEisjA==", - "dev": true, - "requires": { - "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": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", "dev": true }, - "is-weakref": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.1.tgz", - "integrity": "sha512-b2jKc2pQZjaeFYWEf7ScFj+Be1I+PXmlu572Q8coTXZ+LD/QQZ7ShPMst8h16riVgyXTQwUsFEl74mDvc/3MHQ==", - "dev": true, - "requires": { - "call-bind": "^1.0.0" - } - }, - "is-windows": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", - "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", "dev": true }, "isexe": { @@ -3485,50 +1137,6 @@ "integrity": "sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw==", "dev": true }, - "istanbul-lib-hook": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-hook/-/istanbul-lib-hook-3.0.0.tgz", - "integrity": "sha512-Pt/uge1Q9s+5VAZ+pCo16TYMWPBIl+oaNIjgLQxcX0itS6ueeaA+pEfThZpH8WxhFgCiEb8sAJY6MdUKgiIWaQ==", - "dev": true, - "requires": { - "append-transform": "^2.0.0" - } - }, - "istanbul-lib-instrument": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-4.0.3.tgz", - "integrity": "sha512-BXgQl9kf4WTCPCCpmFGoJkz/+uhvm7h7PFKUYxh7qarQd3ER33vHG//qaE8eN25l07YqZPpHXU9I09l/RD5aGQ==", - "dev": true, - "requires": { - "@babel/core": "^7.7.5", - "@istanbuljs/schema": "^0.1.2", - "istanbul-lib-coverage": "^3.0.0", - "semver": "^6.3.0" - }, - "dependencies": { - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true - } - } - }, - "istanbul-lib-processinfo": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/istanbul-lib-processinfo/-/istanbul-lib-processinfo-2.0.2.tgz", - "integrity": "sha512-kOwpa7z9hme+IBPZMzQ5vdQj8srYgAtaRqeI48NGmAQ+/5yKiHLV0QbYqQpxsdEF0+w14SoB8YbnHKcXE2KnYw==", - "dev": true, - "requires": { - "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": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", @@ -3538,57 +1146,6 @@ "istanbul-lib-coverage": "^3.0.0", "make-dir": "^3.0.0", "supports-color": "^7.1.0" - }, - "dependencies": { - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "istanbul-lib-source-maps": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz", - "integrity": "sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==", - "dev": true, - "requires": { - "debug": "^4.1.1", - "istanbul-lib-coverage": "^3.0.0", - "source-map": "^0.6.1" - }, - "dependencies": { - "debug": { - "version": "4.3.3", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", - "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", - "dev": true, - "requires": { - "ms": "2.1.2" - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - } } }, "istanbul-reports": { @@ -3601,45 +1158,12 @@ "istanbul-lib-report": "^3.0.0" } }, - "js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", - "dev": true - }, - "js-yaml": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", - "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", - "dev": true, - "requires": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - } - }, - "jsesc": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", - "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "just-extend": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/just-extend/-/just-extend-4.2.1.tgz", + "integrity": "sha512-g3UB796vUFIY90VIv/WX3L2c8CS2MdWUww3CNrYmqza1Fg0DURc2K/O4YrnklBdQarSJ/y8JnJYDGc+1iumQjg==", "dev": true }, - "json5": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.0.tgz", - "integrity": "sha512-f+8cldu7X/y7RAJurMEJmdoKXGB/X550w2Nr3tTbezL6RwEE/iMcm+tZnXeoZtKuOq6ft8+CqzEkrIgx1fPoQA==", - "dev": true, - "requires": { - "minimist": "^1.2.5" - }, - "dependencies": { - "minimist": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", - "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", - "dev": true - } - } - }, "kleur": { "version": "4.1.4", "resolved": "https://registry.npmjs.org/kleur/-/kleur-4.1.4.tgz", @@ -3647,24 +1171,18 @@ "dev": true }, "locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", "dev": true, "requires": { - "p-locate": "^4.1.0" + "p-locate": "^5.0.0" } }, - "lodash.flattendeep": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/lodash.flattendeep/-/lodash.flattendeep-4.4.0.tgz", - "integrity": "sha1-+wMJF/hqMTTlvJvsDWngAT3f7bI=", - "dev": true - }, - "lolex": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/lolex/-/lolex-1.3.2.tgz", - "integrity": "sha1-fD2mL/yzDw9agKJWbKJORdigHzE=", + "lodash.get": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz", + "integrity": "sha1-LRd/ZS+jHpObRDjVNBSZ36OCXpk=", "dev": true }, "make-dir": { @@ -3674,121 +1192,47 @@ "dev": true, "requires": { "semver": "^6.0.0" - }, - "dependencies": { - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true - } } }, - "mri": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/mri/-/mri-1.2.0.tgz", - "integrity": "sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==", - "dev": true - }, - "node-preload": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/node-preload/-/node-preload-0.2.1.tgz", - "integrity": "sha512-RM5oyBy45cLEoHqCeh+MNuFAxO0vTFBLskvQbOKnEE7YTTSN4tbN8QWDIPQ6L+WvKsB/qLEGpYe2ZZ9d4W9OIQ==", + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", "dev": true, "requires": { - "process-on-spawn": "^1.0.0" + "brace-expansion": "^1.1.7" } }, - "node-releases": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.1.tgz", - "integrity": "sha512-CqyzN6z7Q6aMeF/ktcMVTzhAHCEpf8SOarwpzpf8pNBY2k5/oM34UHldUwp8VKI7uxct2HxSRdJjBaZeESzcxA==", + "mri": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/mri/-/mri-1.2.0.tgz", + "integrity": "sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==", "dev": true }, - "nyc": { - "version": "15.1.0", - "resolved": "https://registry.npmjs.org/nyc/-/nyc-15.1.0.tgz", - "integrity": "sha512-jMW04n9SxKdKi1ZMGhvUTHBN0EICCRkHemEoE5jm6mTYcqcdas0ATzgUgejlQUHMvpnOZqGB5Xxsv9KxJW1j8A==", + "nise": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/nise/-/nise-5.1.0.tgz", + "integrity": "sha512-W5WlHu+wvo3PaKLsJJkgPup2LrsXCcm7AWwyNZkUnn5rwPkuPBi3Iwk5SQtN0mv+K65k7nKKjwNQ30wg3wLAQQ==", "dev": true, "requires": { - "@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" + "@sinonjs/commons": "^1.7.0", + "@sinonjs/fake-timers": "^7.0.4", + "@sinonjs/text-encoding": "^0.7.1", + "just-extend": "^4.0.2", + "path-to-regexp": "^1.7.0" }, "dependencies": { - "glob": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", - "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", - "dev": true, - "requires": { - "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" - } - }, - "minimatch": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "@sinonjs/fake-timers": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-7.1.2.tgz", + "integrity": "sha512-iQADsW4LBMISqZ6Ci1dupJL9pprqwcVFTcOsEmQOEhW+KLCVn/Y4Jrvg2k19fIHCp+iFprriYPTdRcQR8NbUPg==", "dev": true, "requires": { - "brace-expansion": "^1.1.7" + "@sinonjs/commons": "^1.7.0" } } } }, - "object-inspect": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.11.0.tgz", - "integrity": "sha512-jp7ikS6Sd3GxQfZJPyH3cjcbJF6GZPClgdV+EFygjFLQ5FmW/dRUnTd9PQ9k0JhoNDabWFbpF1yCdSWCC6gexg==", - "dev": true - }, - "object-keys": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", - "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", - "dev": true - }, - "object.assign": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.2.tgz", - "integrity": "sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ==", - "dev": true, - "requires": { - "call-bind": "^1.0.0", - "define-properties": "^1.1.3", - "has-symbols": "^1.0.1", - "object-keys": "^1.1.1" - } - }, "once": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", @@ -3799,48 +1243,21 @@ } }, "p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", "dev": true, "requires": { - "p-try": "^2.0.0" + "yocto-queue": "^0.1.0" } }, "p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "dev": true, - "requires": { - "p-limit": "^2.2.0" - } - }, - "p-map": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-3.0.0.tgz", - "integrity": "sha512-d3qXVTF/s+W+CdJ5A29wywV2n8CQQYahlgz2bFiA+4eVNJbHJodPZ+/gXwPGh0bOqA+j8S+6+ckmvLGPk1QpxQ==", - "dev": true, - "requires": { - "aggregate-error": "^3.0.0" - } - }, - "p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", - "dev": true - }, - "package-hash": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/package-hash/-/package-hash-4.0.0.tgz", - "integrity": "sha512-whdkPIooSu/bASggZ96BWVvZTRMOFxnyUG5PnTSGKoJE2gd5mbVNmR2Nj20QFzxYYgAXpoqC+AiXzl+UMRh7zQ==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", "dev": true, "requires": { - "graceful-fs": "^4.1.15", - "hasha": "^5.0.0", - "lodash.flattendeep": "^4.4.0", - "release-zalgo": "^1.0.0" + "p-limit": "^3.0.2" } }, "path-exists": { @@ -3861,63 +1278,27 @@ "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", "dev": true }, - "picocolors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", - "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", - "dev": true - }, - "pkg-dir": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", - "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", + "path-to-regexp": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.8.0.tgz", + "integrity": "sha512-n43JRhlUKUAlibEJhPeir1ncUID16QnEjNpwzNdO3Lm4ywrBpBZ5oLD0I6br9evr1Y9JTqwRtAh7JLoOzAQdVA==", "dev": true, "requires": { - "find-up": "^4.0.0" + "isarray": "0.0.1" } }, "prettier": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.5.0.tgz", - "integrity": "sha512-FM/zAKgWTxj40rH03VxzIPdXmj39SwSjwG0heUcNFwI+EMZJnY93yAiKXM3dObIKAM5TA88werc8T/EwhB45eg==", + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.5.1.tgz", + "integrity": "sha512-vBZcPRUR5MZJwoyi3ZoyQlc1rXeEck8KgeC9AwwOn+exuxLxq5toTRDTSaVrXHxelDMHy9zlicw8u66yxoSUFg==", "dev": true }, - "process-on-spawn": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/process-on-spawn/-/process-on-spawn-1.0.0.tgz", - "integrity": "sha512-1WsPDsUSMmZH5LeMLegqkPDrsGgsWwk1Exipy2hvB0o/F0ASzbpIctSCcZIK1ykJvtTJULEH+20WOFjMvGnCTg==", - "dev": true, - "requires": { - "fromentries": "^1.2.0" - } - }, - "release-zalgo": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/release-zalgo/-/release-zalgo-1.0.0.tgz", - "integrity": "sha1-CXALflB0Mpc5Mw5TXFqQ+2eFFzA=", - "dev": true, - "requires": { - "es6-error": "^4.0.1" - } - }, "require-directory": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", "dev": true }, - "require-main-filename": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", - "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", - "dev": true - }, - "resolve-from": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", - "dev": true - }, "rimraf": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", @@ -3925,31 +1306,6 @@ "dev": true, "requires": { "glob": "^7.1.3" - }, - "dependencies": { - "glob": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", - "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", - "dev": true, - "requires": { - "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" - } - }, - "minimatch": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", - "dev": true, - "requires": { - "brace-expansion": "^1.1.7" - } - } } }, "sade": { @@ -3962,21 +1318,15 @@ } }, "safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "dev": true - }, - "samsam": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/samsam/-/samsam-1.1.2.tgz", - "integrity": "sha1-vsEf3IOp/aBjQBIQ5AF2wwJNFWc=", + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", "dev": true }, - "set-blocking": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", - "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", "dev": true }, "shebang-command": { @@ -3994,17 +1344,6 @@ "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", "dev": true }, - "side-channel": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", - "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", - "dev": true, - "requires": { - "call-bind": "^1.0.0", - "get-intrinsic": "^1.0.2", - "object-inspect": "^1.9.0" - } - }, "signal-exit": { "version": "3.0.6", "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.6.tgz", @@ -4012,41 +1351,23 @@ "dev": true }, "sinon": { - "version": "1.17.7", - "resolved": "https://registry.npmjs.org/sinon/-/sinon-1.17.7.tgz", - "integrity": "sha1-RUKk9JugxFwF6y6d2dID4rjv4L8=", + "version": "12.0.1", + "resolved": "https://registry.npmjs.org/sinon/-/sinon-12.0.1.tgz", + "integrity": "sha512-iGu29Xhym33ydkAT+aNQFBINakjq69kKO6ByPvTsm3yyIACfyQttRTP03aBP/I8GfhFmLzrnKwNNkr0ORb1udg==", "dev": true, "requires": { - "formatio": "1.1.1", - "lolex": "1.3.2", - "samsam": "1.1.2", - "util": ">=0.10.3 <1" + "@sinonjs/commons": "^1.8.3", + "@sinonjs/fake-timers": "^8.1.0", + "@sinonjs/samsam": "^6.0.2", + "diff": "^5.0.0", + "nise": "^5.1.0", + "supports-color": "^7.2.0" } }, "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true - }, - "spawn-wrap": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/spawn-wrap/-/spawn-wrap-2.0.0.tgz", - "integrity": "sha512-EeajNjfN9zMnULLwhZZQU3GWBoFNkbngTUPfaawT4RkMiviTxcX0qfhVbGey39mfctfDHkWtuecgQ8NJcyQWHg==", - "dev": true, - "requires": { - "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" - } - }, - "sprintf-js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", + "version": "0.7.3", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", + "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==", "dev": true }, "string-width": { @@ -4060,26 +1381,6 @@ "strip-ansi": "^6.0.1" } }, - "string.prototype.trimend": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.4.tgz", - "integrity": "sha512-y9xCjw1P23Awk8EvTpcyL2NIr1j7wJ39f+k6lvRnSMz+mz9CGz9NYPelDk42kOz6+ql8xjfK8oYzy3jAP5QU5A==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3" - } - }, - "string.prototype.trimstart": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.4.tgz", - "integrity": "sha512-jh6e984OBfvxS50tdY2nRZnoC5/mLFKOREQfw8t5yytkoUsJRNxvI/E39qu1sD0OtWI3OC0XgKSmcWwziwYuZw==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3" - } - }, "strip-ansi": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", @@ -4089,11 +1390,14 @@ "ansi-regex": "^5.0.1" } }, - "strip-bom": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", - "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", - "dev": true + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } }, "test-exclude": { "version": "6.0.0", @@ -4104,90 +1408,18 @@ "@istanbuljs/schema": "^0.1.2", "glob": "^7.1.4", "minimatch": "^3.0.4" - }, - "dependencies": { - "glob": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", - "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", - "dev": true, - "requires": { - "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" - } - }, - "minimatch": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", - "dev": true, - "requires": { - "brace-expansion": "^1.1.7" - } - } } }, - "to-fast-properties": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", - "dev": true - }, "totalist": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/totalist/-/totalist-2.0.0.tgz", "integrity": "sha512-+Y17F0YzxfACxTyjfhnJQEe7afPA0GSpYlFkl2VFMxYP7jshQf9gXV7cH47EfToBumFThfKBvfAcoUn6fdNeRQ==", "dev": true }, - "type-fest": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", - "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", - "dev": true - }, - "typedarray-to-buffer": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", - "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", - "dev": true, - "requires": { - "is-typedarray": "^1.0.0" - } - }, - "unbox-primitive": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.1.tgz", - "integrity": "sha512-tZU/3NqK3dA5gpE1KtyiJUrEB0lxnGkMFHptJ7q6ewdZ8s12QrODwNbhIJStmJkd1QDXa1NRA8aF2A1zk/Ypyw==", - "dev": true, - "requires": { - "function-bind": "^1.1.1", - "has-bigints": "^1.0.1", - "has-symbols": "^1.0.2", - "which-boxed-primitive": "^1.0.2" - } - }, - "util": { - "version": "0.12.4", - "resolved": "https://registry.npmjs.org/util/-/util-0.12.4.tgz", - "integrity": "sha512-bxZ9qtSlGUWSOy9Qa9Xgk11kSslpuZwaxCg4sNIDj6FLucDab2JxnHwyNTCpHMtK1MjoQiWQ6DiUMZYbSrO+Sw==", - "dev": true, - "requires": { - "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" - } - }, - "uuid": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", - "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", + "type-detect": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", + "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", "dev": true }, "uvu": { @@ -4201,14 +1433,17 @@ "kleur": "^4.0.3", "sade": "^1.7.3", "totalist": "^2.0.0" - }, - "dependencies": { - "diff": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/diff/-/diff-5.0.0.tgz", - "integrity": "sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w==", - "dev": true - } + } + }, + "v8-to-istanbul": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-8.1.0.tgz", + "integrity": "sha512-/PRhfd8aTNp9Ggr62HPzXg2XasNFGy5PBt0Rp04du7/8GNNSgxFL6WBTkgMKSL9bFjH+8kKEG3f37FmxiTqUUA==", + "dev": true, + "requires": { + "@types/istanbul-lib-coverage": "^2.0.1", + "convert-source-map": "^1.6.0", + "source-map": "^0.7.3" } }, "which": { @@ -4220,74 +1455,15 @@ "isexe": "^2.0.0" } }, - "which-boxed-primitive": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", - "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", - "dev": true, - "requires": { - "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": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", - "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", - "dev": true - }, - "which-typed-array": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.7.tgz", - "integrity": "sha512-vjxaB4nfDqwKI0ws7wZpxIlde1XrLX5uB0ZjpfshgmapJMD7jJWhZI+yToJTqaFByF0eNBcYxbjmCzoRP7CfEw==", - "dev": true, - "requires": { - "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" - } - }, "wrap-ansi": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", - "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", "dev": true, "requires": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", "strip-ansi": "^6.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - } } }, "wrappy": { @@ -4296,52 +1472,38 @@ "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", "dev": true }, - "write-file-atomic": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz", - "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==", - "dev": true, - "requires": { - "imurmurhash": "^0.1.4", - "is-typedarray": "^1.0.0", - "signal-exit": "^3.0.2", - "typedarray-to-buffer": "^3.1.5" - } - }, "y18n": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", - "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==", + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", "dev": true }, "yargs": { - "version": "15.4.1", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz", - "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==", + "version": "16.2.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", + "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", "dev": true, "requires": { - "cliui": "^6.0.0", - "decamelize": "^1.2.0", - "find-up": "^4.1.0", - "get-caller-file": "^2.0.1", + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", "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" + "y18n": "^5.0.5", + "yargs-parser": "^20.2.2" } }, "yargs-parser": { - "version": "18.1.3", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", - "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", - "dev": true, - "requires": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" - } + "version": "20.2.9", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", + "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", + "dev": true + }, + "yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true } } } From f4228bf238d702b748c3e08cfe845c2d69363903 Mon Sep 17 00:00:00 2001 From: Gregor Martynus <39992+gr2m@users.noreply.github.com> Date: Sun, 5 Dec 2021 14:31:57 -0800 Subject: [PATCH 49/59] test: adapt to `sinon@12` --- test/index_test.js | 24 +++++++++++------------- 1 file changed, 11 insertions(+), 13 deletions(-) diff --git a/test/index_test.js b/test/index_test.js index e7d8b88..999709b 100644 --- a/test/index_test.js +++ b/test/index_test.js @@ -5,18 +5,16 @@ import https from "https"; import stream from "stream"; import { EventEmitter } from "events"; -import Sinon from "sinon"; +import sinon from "sinon"; import { test } from "uvu"; import * as assert from "uvu/assert"; import Mitm from "../index.js"; let mitm; -let sinon; test.before.each(() => { mitm = new Mitm(); - sinon = Sinon.sandbox.create(); }); test.after.each(() => { mitm.disable(); @@ -42,7 +40,7 @@ function mustConnect(moduleName, module) { }); test(`${moduleName}: must emit connect on Mitm`, () => { - const onConnect = Sinon.spy(); + const onConnect = sinon.spy(); mitm.on("connect", onConnect); const opts = { host: "foo" }; const socket = module.connect(opts); @@ -53,7 +51,7 @@ function mustConnect(moduleName, module) { }); test(`${moduleName}: must emit connect on Mitm with options object given host and port`, () => { - const onConnect = Sinon.spy(); + const onConnect = sinon.spy(); mitm.on("connect", onConnect); const socket = module.connect(9, "127.0.0.1"); @@ -63,7 +61,7 @@ function mustConnect(moduleName, module) { }); test(`${moduleName}: must emit connection on Mitm`, () => { - const onConnection = Sinon.spy(); + const onConnection = sinon.spy(); mitm.on("connection", onConnection); const opts = { host: "foo" }; const socket = module.connect(opts); @@ -185,7 +183,7 @@ function mustConnect(moduleName, module) { client.bypass(); }); - const onConnect = Sinon.spy(); + const onConnect = sinon.spy(); const client = module.connect({ host: "127.0.0.1", port: 9 }, onConnect); client.on( @@ -202,7 +200,7 @@ function mustConnect(moduleName, module) { mitm.on("connect", function (client) { client.bypass(); }); - const onConnection = Sinon.spy(); + const onConnection = sinon.spy(); mitm.on("connection", onConnection); module.connect({ host: "127.0.0.1", port: 9 }).on("error", noop); assert.equal(onConnection.callCount, 0); @@ -573,14 +571,14 @@ function mustRequest(context, request) { }); test(`${context}: must emit connect on Mitm`, () => { - const onConnect = Sinon.spy(); + const onConnect = sinon.spy(); mitm.on("connect", onConnect); request({ host: "foo" }); assert.equal(onConnect.callCount, 1); }); test(`${context}: must emit connect on Mitm after multiple connections`, () => { - const onConnect = Sinon.spy(); + const onConnect = sinon.spy(); mitm.on("connect", onConnect); request({ host: "foo" }); request({ host: "foo" }); @@ -589,14 +587,14 @@ function mustRequest(context, request) { }); test(`${context}: must emit connection on Mitm`, () => { - const onConnection = Sinon.spy(); + const onConnection = sinon.spy(); mitm.on("connection", onConnection); request({ host: "foo" }); assert.equal(onConnection.callCount, 1); }); test(`${context}: must emit connection on Mitm after multiple connections`, () => { - const onConnection = Sinon.spy(); + const onConnection = sinon.spy(); mitm.on("connection", onConnection); request({ host: "foo" }); request({ host: "foo" }); @@ -669,7 +667,7 @@ function mustRequest(context, request) { mitm.on("connect", function (client) { client.bypass(); }); - const onRequest = Sinon.spy(); + const onRequest = sinon.spy(); mitm.on("request", onRequest); request({ host: "127.0.0.1" }).on("error", function (_err) { assert.equal(onRequest.callCount, 0); From 4ac7345c546fd06b1f7ee4c6cba4a55bdf6c66fb Mon Sep 17 00:00:00 2001 From: Gregor Martynus <39992+gr2m@users.noreply.github.com> Date: Sun, 5 Dec 2021 14:45:26 -0800 Subject: [PATCH 50/59] refactor: move all imports from Node-internals into `lib/node_internals.js` --- index.js | 23 ++++++----------------- lib/internal_socket.js | 13 ++++++------- lib/node_internals.js | 22 ++++++++++++++++++++++ 3 files changed, 34 insertions(+), 24 deletions(-) create mode 100644 lib/node_internals.js diff --git a/index.js b/index.js index 074e0c4..fd9f075 100644 --- a/index.js +++ b/index.js @@ -5,18 +5,7 @@ import Tls from "tls"; import { ClientRequest, Agent } from "http"; import { EventEmitter } from "events"; -// @ts-expect-error - internal API -import { _connectionListener as createRequestAndResponse } from "http"; -// @ts-expect-error - internal API -import { _normalizeArgs as normalizeConnectArgs } from "net"; -// @ts-expect-error - internal API -import { IncomingMessage } from "_http_incoming"; -// @ts-expect-error - internal API -import { ServerResponse } from "_http_server"; -// @ts-expect-error - internal API -import { kIncomingMessage as incomingMessageKey } from "_http_common"; -// @ts-expect-error - internal API -import { kServerResponse as serverResponseKey } from "_http_server"; +import { NODE_INTERNALS } from "./lib/node_internals.js"; import Socket from "./lib/socket.js"; import TlsSocket from "./lib/tls_socket.js"; @@ -35,8 +24,8 @@ export default class Mitm extends EventEmitter { response.req = request; }); - this[serverResponseKey] = ServerResponse; - this[incomingMessageKey] = IncomingMessage; + this[NODE_INTERNALS.serverResponseKey] = NODE_INTERNALS.ServerResponse; + this[NODE_INTERNALS.incomingMessageKey] = NODE_INTERNALS.IncomingMessage; this.enable(); } @@ -109,7 +98,7 @@ export default class Mitm extends EventEmitter { } tcpConnect(orig, ...args) { - const [opts, done] = normalizeConnectArgs(args); + const [opts, done] = NODE_INTERNALS.normalizeConnectArgs(args); // The callback is originally bound to the connect event in // Socket.prototype.connect. @@ -123,7 +112,7 @@ export default class Mitm extends EventEmitter { } tlsConnect(orig, ...args) { - const [opts, done] = normalizeConnectArgs(args); + const [opts, done] = NODE_INTERNALS.normalizeConnectArgs(args); const client = this.connect(orig, TlsSocket, opts, done); if (client.mitmServerSocket == null) return client; @@ -137,7 +126,7 @@ export default class Mitm extends EventEmitter { request(socket) { if (!socket.mitmServerSocket) return socket; - createRequestAndResponse.call(this, socket.mitmServerSocket); + NODE_INTERNALS.createRequestAndResponse.call(this, socket.mitmServerSocket); return socket; } } diff --git a/lib/internal_socket.js b/lib/internal_socket.js index 599f48f..cc08c29 100644 --- a/lib/internal_socket.js +++ b/lib/internal_socket.js @@ -1,14 +1,13 @@ import stream from "stream"; -const NO_ERROR = 0; -let uniqueId = 0; -let STREAM_STATE; -let STREAM_BYTES_READ; +import { NODE_INTERNALS } from "./node_internals.js"; -const UV_EOF = process.binding("uv").UV_EOF; +const NO_ERROR = 0; +const UV_EOF = NODE_INTERNALS.UV_EOF; -STREAM_STATE = process.binding("stream_wrap").streamBaseState; -STREAM_BYTES_READ = process.binding("stream_wrap").kReadBytesOrError; +let uniqueId = 0; +let STREAM_STATE = NODE_INTERNALS.STREAM_STATE; +let STREAM_BYTES_READ = NODE_INTERNALS.STREAM_BYTES_READ; /** * Sockets write to InternalSocket via write*String functions. The diff --git a/lib/node_internals.js b/lib/node_internals.js new file mode 100644 index 0000000..667b698 --- /dev/null +++ b/lib/node_internals.js @@ -0,0 +1,22 @@ +import { _connectionListener as createRequestAndResponse } from "http"; +import { _normalizeArgs as normalizeConnectArgs } from "net"; +import { IncomingMessage } from "_http_incoming"; +import { ServerResponse } from "_http_server"; +import { kIncomingMessage as incomingMessageKey } from "_http_common"; +import { kServerResponse as serverResponseKey } from "_http_server"; + +const UV_EOF = process.binding("uv").UV_EOF; +const STREAM_STATE = process.binding("stream_wrap").streamBaseState; +const STREAM_BYTES_READ = process.binding("stream_wrap").kReadBytesOrError; + +export const NODE_INTERNALS = { + createRequestAndResponse, + normalizeConnectArgs, + IncomingMessage, + ServerResponse, + incomingMessageKey, + serverResponseKey, + UV_EOF, + STREAM_STATE, + STREAM_BYTES_READ, +}; From e890739099e7a7eb128c7a55390c87c7d70024b5 Mon Sep 17 00:00:00 2001 From: Gregor Martynus <39992+gr2m@users.noreply.github.com> Date: Sun, 5 Dec 2021 15:05:28 -0800 Subject: [PATCH 51/59] refactor: add type checks, update some comments --- index.js | 62 +++++++++++++++++------------------ lib/internal_socket.js | 73 +++++++++++++++++++++--------------------- lib/socket.js | 2 ++ lib/stubs.js | 10 ++++-- lib/tls_socket.js | 2 ++ 5 files changed, 77 insertions(+), 72 deletions(-) diff --git a/index.js b/index.js index fd9f075..a4c4afc 100644 --- a/index.js +++ b/index.js @@ -57,13 +57,13 @@ export default class Mitm extends EventEmitter { } connect(orig, Socket, opts, done) { - const sockets = createInternalSocketPair(); + const [requestSocket, responseSocket] = createInternalSocketPair(); - // Don't set client.connecting to false because there's nothing setting it + // Don't set request.connecting to false because there's nothing setting it // back to false later. Originally that was done in Socket.prototype.connect // and its afterConnect handler, but we're not calling that. - const client = new Socket({ - handle: sockets[0], + const request = new Socket({ + handle: requestSocket, // Node v10 expects readable and writable to be set at Socket creation time. readable: true, @@ -72,51 +72,46 @@ export default class Mitm extends EventEmitter { ...opts, }); - this.emit("connect", client, opts); - if (client.bypassed) return orig.call(this, opts, done); + this.emit("connect", request, opts); + if (request.bypassed) return orig.call(this, opts, done); - // Don't use just "server" because socket.server is used in Node v8.12 and - // Node v9.6 and later for modifying the HTTP server response and parser - // classes. If unset, it's set to the used HTTP server (Mitm instance in our - // case) in _http_server.js. - // See also: https://github.com/nodejs/node/issues/13435. - const server = (client.mitmServerSocket = new Socket({ - handle: sockets[1], + const response = new Socket({ + handle: responseSocket, readable: true, writable: true, - })); + }); + + // We use `.mitmResponseSocket` as a means to check if a request is intercepted + // for net connects and to pass use it as a response when intercepting http(s) requests. + request.mitmResponseSocket = response; - this.emit("connection", server, opts); + this.emit("connection", response, opts); // Ensure connect is emitted in next ticks, otherwise it would be impossible // to listen to it after calling Net.connect or listening to it after the // ClientRequest emits "socket". - setTimeout(client.emit.bind(client, "connect")); - setTimeout(server.emit.bind(server, "connect")); + setTimeout(request.emit.bind(request, "connect")); + setTimeout(response.emit.bind(response, "connect")); - return client; + return request; } tcpConnect(orig, ...args) { - const [opts, done] = NODE_INTERNALS.normalizeConnectArgs(args); + const [opts, callback] = NODE_INTERNALS.normalizeConnectArgs(args); - // The callback is originally bound to the connect event in - // Socket.prototype.connect. - const client = this.connect(orig, Socket, opts, done); - if (client.mitmServerSocket == null) { - return client; - } - if (done) client.once("connect", done); + const client = this.connect(orig, Socket, opts, callback); + if (client.mitmResponseSocket == null) return client; + if (callback) client.once("connect", callback); return client; } tlsConnect(orig, ...args) { - const [opts, done] = NODE_INTERNALS.normalizeConnectArgs(args); + const [opts, callback] = NODE_INTERNALS.normalizeConnectArgs(args); - const client = this.connect(orig, TlsSocket, opts, done); - if (client.mitmServerSocket == null) return client; - if (done) client.once("secureConnect", done); + const client = this.connect(orig, TlsSocket, opts, callback); + if (client.mitmResponseSocket == null) return client; + if (callback) client.once("secureConnect", callback); setTimeout(client.emit.bind(client, "secureConnect")); @@ -124,9 +119,12 @@ export default class Mitm extends EventEmitter { } request(socket) { - if (!socket.mitmServerSocket) return socket; + if (!socket.mitmResponseSocket) return socket; - NODE_INTERNALS.createRequestAndResponse.call(this, socket.mitmServerSocket); + NODE_INTERNALS.createRequestAndResponse.call( + this, + socket.mitmResponseSocket + ); return socket; } } diff --git a/lib/internal_socket.js b/lib/internal_socket.js index cc08c29..085f516 100644 --- a/lib/internal_socket.js +++ b/lib/internal_socket.js @@ -1,14 +1,24 @@ +// @ts-check + import stream from "stream"; import { NODE_INTERNALS } from "./node_internals.js"; -const NO_ERROR = 0; +const NO_ERROR_CODE = 0; const UV_EOF = NODE_INTERNALS.UV_EOF; let uniqueId = 0; let STREAM_STATE = NODE_INTERNALS.STREAM_STATE; let STREAM_BYTES_READ = NODE_INTERNALS.STREAM_BYTES_READ; +export function createInternalSocketPair() { + const a = new InternalSocket(); + const b = new InternalSocket(); + a.remote = b; + b.remote = a; + return [a, b]; +} + /** * Sockets write to InternalSocket via write*String functions. The * WritableStream.prototype.write function is just used internally by @@ -16,9 +26,11 @@ let STREAM_BYTES_READ = NODE_INTERNALS.STREAM_BYTES_READ; * ReadableStream.prototype.push. The receiver will then forward it to its * owner Socket via the onread property. * - * InternalSocket is created for both the client side and the server side. + * InternalSocket is created for both the request side and the response side. */ class InternalSocket extends stream.Duplex { + remote = null; + constructor() { super(); this.id = ++uniqueId; @@ -39,12 +51,6 @@ class InternalSocket extends stream.Duplex { this.pause(); } - // Node v0.11's ReadableStream.prototype.resume and - // ReadableStream.prototype.pause return self. InternalSocket's API states that - // they should return error codes instead. - // - // Node v0.11.13 called ReadableStream.prototype.read(0) synchronously, but - // v0.11.14 does it in the next tick. For easier sync use, call it here. readStart() { this.resume(); } @@ -52,11 +58,12 @@ class InternalSocket extends stream.Duplex { this.pause(); } + // noops _read() {} ref() {} unref() {} - // Node v8 added "getAsyncId". + // Introduced in Node v8 getAsyncId() { return this.id; } @@ -75,56 +82,56 @@ class InternalSocket extends stream.Duplex { writev(_req, data) { for (let i = 0; i < data.length; ++i) this._write(data[i], data[++i], () => {}); - return NO_ERROR; + return NO_ERROR_CODE; } - // InternalSocket.prototype.writeLatin1String was introduced in Node v6.4. + // Introduced in Node v6.4. writeLatin1String(_req, data) { this.write(data, "latin1"); - return NO_ERROR; + return NO_ERROR_CODE; } - writeBuffer(req, data) { - /* eslint consistent-return: 0 */ + writeBuffer(request, data) { this.write(data); - return NO_ERROR; + return NO_ERROR_CODE; } - writeUtf8String(req, data) { - /* eslint consistent-return: 0 */ + writeUtf8String(request, data) { this.write(data, "utf8"); - return NO_ERROR; + return NO_ERROR_CODE; } - writeAsciiString(req, data) { - /* eslint consistent-return: 0 */ + writeAsciiString(request, data) { this.write(data, "ascii"); - return NO_ERROR; + return NO_ERROR_CODE; } - writeUcs2String(req, data) { - /* eslint consistent-return: 0 */ + writeUcs2String(request, data) { this.write(data, "ucs2"); - return NO_ERROR; + return NO_ERROR_CODE; } // While it seems to have existed since Node v0.10, Node v11.2 requires // "shutdown". AFAICT, "shutdown" is for shutting the writable side down and // hence the use of WritableStream.prototype.end and waiting for the "finish" // event. - shutdown(req) { - this.once("finish", req.oncomplete.bind(req, NO_ERROR, req.handle)); + shutdown(request) { + this.once( + "finish", + request.oncomplete.bind(request, NO_ERROR_CODE, request.handle) + ); this.end(); - // Note v11.8 requires "shutdown" to return an error value, with "1" - // indicating a "synchronous finish" (as per Node's net.js) and "0" + // Since v11.8 `.shutdown()` must return an error code, where `1` + // indicating a "synchronous finish" (as per Node's net.js) and `0` // presumably success. return 0; } - // I'm unsure of the relationship between InternalSocket.prototype.shutdown and + // Unsure of the relationship between InternalSocket.prototype.shutdown and // InternalSocket.prototype.close. close(done) { + // @ts-expect-error - `._writeableState` is an internal API and not typed if (!this._writableState.finished) { this.end(done); return; @@ -135,14 +142,6 @@ class InternalSocket extends stream.Duplex { } } -export function createInternalSocketPair() { - const a = new InternalSocket(); - const b = new InternalSocket(); - a.remote = b; - b.remote = a; - return [a, b]; -} - function readData(data) { // A system written not in 1960 that passes arguments to functions through // _global_ mutable data structures… diff --git a/lib/socket.js b/lib/socket.js index 825cd80..a671276 100644 --- a/lib/socket.js +++ b/lib/socket.js @@ -1,3 +1,5 @@ +// @ts-check + import net from "net"; export default class Socket extends net.Socket { diff --git a/lib/stubs.js b/lib/stubs.js index ed9f483..63d5be3 100644 --- a/lib/stubs.js +++ b/lib/stubs.js @@ -1,11 +1,15 @@ -export default class Stubs extends Array { +// @ts-check + +export default class Stubs { + _stubs = []; + stub(obj, prop, value) { - this.push([obj, prop, obj[prop]]); + this._stubs.push([obj, prop, obj[prop]]); obj[prop] = value; } restore() { let stub; - while ((stub = this.pop())) stub[0][stub[1]] = stub[2]; + while ((stub = this._stubs.pop())) stub[0][stub[1]] = stub[2]; } } diff --git a/lib/tls_socket.js b/lib/tls_socket.js index 112de5f..6cbdf52 100644 --- a/lib/tls_socket.js +++ b/lib/tls_socket.js @@ -1,3 +1,5 @@ +// @ts-check + import tls from "tls"; import Socket from "./socket.js"; From b117eb41a1b8ecf994d54475e45dd358ffe988f8 Mon Sep 17 00:00:00 2001 From: Gregor Martynus <39992+gr2m@users.noreply.github.com> Date: Sun, 5 Dec 2021 15:10:16 -0800 Subject: [PATCH 52/59] build(pkg): add `typecheck` script --- package.json | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/package.json b/package.json index dad1fea..42a7235 100644 --- a/package.json +++ b/package.json @@ -37,12 +37,15 @@ "coverage": "c8 report --reporter html && open coverage/index.html", "lint": "prettier --check \"{lib,test}/**/*.{js,json,ts}\" \"*.{js,json,md}\"", "lint:fix": "prettier --write \"{lib,test}/**/*.{js,json,ts}\" \"*.{js,json,md}\"", - "test": "c8 --100 uvu" + "test": "c8 --100 uvu", + "typecheck": "tsc --allowJs --noEmit --esModuleInterop *.js lib/*.js" }, "devDependencies": { + "@types/node": "^16.11.11", "c8": "^7.10.0", "prettier": "^2.5.0", "sinon": "^12.0.1", + "typescript": "^4.5.2", "uvu": "^0.5.2" }, "engines": { From 965065d9e2cda3e95e8623de3246354b0c53ce30 Mon Sep 17 00:00:00 2001 From: Gregor Martynus <39992+gr2m@users.noreply.github.com> Date: Sun, 5 Dec 2021 15:10:18 -0800 Subject: [PATCH 53/59] build(package): lock file --- package-lock.json | 33 +++++++++++++++++++++++++++++++++ 1 file changed, 33 insertions(+) diff --git a/package-lock.json b/package-lock.json index d9db21d..6bbff6c 100644 --- a/package-lock.json +++ b/package-lock.json @@ -8,9 +8,11 @@ "name": "mitm", "version": "1.7.2", "devDependencies": { + "@types/node": "^16.11.11", "c8": "^7.10.0", "prettier": "^2.5.0", "sinon": "^12.0.1", + "typescript": "^4.5.2", "uvu": "^0.5.2" }, "engines": { @@ -73,6 +75,12 @@ "integrity": "sha512-sz7iLqvVUg1gIedBOvlkxPlc8/uVzyS5OwGz1cKjXzkl3FpL3al0crU8YGU1WoHkxn0Wxbw5tyi6hvzJKNzFsw==", "dev": true }, + "node_modules/@types/node": { + "version": "16.11.11", + "resolved": "https://registry.npmjs.org/@types/node/-/node-16.11.11.tgz", + "integrity": "sha512-KB0sixD67CeecHC33MYn+eYARkqTheIRNuu97y2XMjR7Wu3XibO1vaY6VBV6O/a89SPI81cEUIYT87UqUWlZNw==", + "dev": true + }, "node_modules/ansi-regex": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", @@ -738,6 +746,19 @@ "node": ">=4" } }, + "node_modules/typescript": { + "version": "4.5.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.5.2.tgz", + "integrity": "sha512-5BlMof9H1yGt0P8/WF+wPNw6GfctgGjXp5hkblpyT+8rkASSmkUKMXrxR0Xg8ThVCi/JnHQiKXeBaEwCeQwMFw==", + "dev": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=4.2.0" + } + }, "node_modules/uvu": { "version": "0.5.2", "resolved": "https://registry.npmjs.org/uvu/-/uvu-0.5.2.tgz", @@ -912,6 +933,12 @@ "integrity": "sha512-sz7iLqvVUg1gIedBOvlkxPlc8/uVzyS5OwGz1cKjXzkl3FpL3al0crU8YGU1WoHkxn0Wxbw5tyi6hvzJKNzFsw==", "dev": true }, + "@types/node": { + "version": "16.11.11", + "resolved": "https://registry.npmjs.org/@types/node/-/node-16.11.11.tgz", + "integrity": "sha512-KB0sixD67CeecHC33MYn+eYARkqTheIRNuu97y2XMjR7Wu3XibO1vaY6VBV6O/a89SPI81cEUIYT87UqUWlZNw==", + "dev": true + }, "ansi-regex": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", @@ -1422,6 +1449,12 @@ "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", "dev": true }, + "typescript": { + "version": "4.5.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.5.2.tgz", + "integrity": "sha512-5BlMof9H1yGt0P8/WF+wPNw6GfctgGjXp5hkblpyT+8rkASSmkUKMXrxR0Xg8ThVCi/JnHQiKXeBaEwCeQwMFw==", + "dev": true + }, "uvu": { "version": "0.5.2", "resolved": "https://registry.npmjs.org/uvu/-/uvu-0.5.2.tgz", From 5b64c83dec0719dae0e41c78af870262646d991b Mon Sep 17 00:00:00 2001 From: Gregor Martynus <39992+gr2m@users.noreply.github.com> Date: Sun, 5 Dec 2021 15:10:31 -0800 Subject: [PATCH 54/59] ci: run `typecheck` --- .github/workflows/test.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 012e87c..65e2f6a 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -50,4 +50,5 @@ jobs: node-version: 16 cache: npm - run: npm ci + - run: npm run typecheck - run: npm run lint From a2c5c7f12fa80cc31deede113f00bd4405dbf8cf Mon Sep 17 00:00:00 2001 From: Gregor Martynus <39992+gr2m@users.noreply.github.com> Date: Sun, 5 Dec 2021 15:32:35 -0800 Subject: [PATCH 55/59] refactor: add some types, rename some variables fro clarity --- index.js | 133 +++++++++++++++++++++++++++++---------------------- lib/stubs.js | 12 +++-- 2 files changed, 83 insertions(+), 62 deletions(-) diff --git a/index.js b/index.js index a4c4afc..9bb7590 100644 --- a/index.js +++ b/index.js @@ -1,7 +1,7 @@ // @ts-check -import Net from "net"; -import Tls from "tls"; +import net from "net"; +import tls from "tls"; import { ClientRequest, Agent } from "http"; import { EventEmitter } from "events"; @@ -30,33 +30,87 @@ export default class Mitm extends EventEmitter { this.enable(); } + /** + * @returns {Mitm} + */ enable() { // Connect is called synchronously. - const netConnect = this.tcpConnect.bind(this, Net.connect); - const tlsConnect = this.tlsConnect.bind(this, Tls.connect); + const netConnect = this.onNetConnect.bind(this, net.connect); + const tlsConnect = this.onTlsConnect.bind(this, tls.connect); - this.stubs.stub(Net, "connect", netConnect); - this.stubs.stub(Net, "createConnection", netConnect); + this.stubs.stub(net, "connect", netConnect); + this.stubs.stub(net, "createConnection", netConnect); this.stubs.stub(Agent.prototype, "createConnection", netConnect); - this.stubs.stub(Tls, "connect", tlsConnect); + this.stubs.stub(tls, "connect", tlsConnect); // ClientRequest.prototype.onSocket is called synchronously from ClientRequest's constructor // and is a convenient place to hook into new ClientRequest instances. - const origOnSocket = ClientRequest.prototype.onSocket; + const originalOnSocket = ClientRequest.prototype.onSocket; const self = this; this.stubs.stub(ClientRequest.prototype, "onSocket", function (socket) { - origOnSocket.call(this, socket); - self.request(socket); + originalOnSocket.call(this, socket); + self.clientRequestOnSocket(socket); }); return this; } + /** + * @returns {Mitm} + */ disable() { - return this.stubs.restore(), this; + this.stubs.restore(); + return this; + } + + /** + * @param {typeof net.connect} originalNetConnect + * @param {...any} args + * @returns {Socket} + */ + onNetConnect(originalNetConnect, ...args) { + const [options, callback] = NODE_INTERNALS.normalizeConnectArgs(args); + + const request = this.connect(originalNetConnect, Socket, options, callback); + if (request.mitmResponseSocket == null) return request; + if (callback) request.once("connect", callback); + + return request; + } + + /** + * @param {typeof tls.connect} originalTlsConnect + * @param {...any} args + * @returns {TlsSocket} + */ + onTlsConnect(originalTlsConnect, ...args) { + const [options, callback] = NODE_INTERNALS.normalizeConnectArgs(args); + + const request = this.connect( + originalTlsConnect, + TlsSocket, + options, + callback + ); + if (request.mitmResponseSocket == null) return request; + if (callback) request.once("secureConnect", callback); + + setTimeout(request.emit.bind(request, "secureConnect")); + + return request; } - connect(orig, Socket, opts, done) { + clientRequestOnSocket(socket) { + if (!socket.mitmResponseSocket) return socket; + + NODE_INTERNALS.createRequestAndResponse.call( + this, + socket.mitmResponseSocket + ); + return socket; + } + + connect(originalConnect, Socket, options, callback) { const [requestSocket, responseSocket] = createInternalSocketPair(); // Don't set request.connecting to false because there's nothing setting it @@ -64,16 +118,11 @@ export default class Mitm extends EventEmitter { // and its afterConnect handler, but we're not calling that. const request = new Socket({ handle: requestSocket, - - // Node v10 expects readable and writable to be set at Socket creation time. - readable: true, - writable: true, - - ...opts, + ...options, }); - this.emit("connect", request, opts); - if (request.bypassed) return orig.call(this, opts, done); + this.emit("connect", request, options); + if (request.bypassed) return originalConnect.call(this, options, callback); const response = new Socket({ handle: responseSocket, @@ -85,46 +134,16 @@ export default class Mitm extends EventEmitter { // for net connects and to pass use it as a response when intercepting http(s) requests. request.mitmResponseSocket = response; - this.emit("connection", response, opts); + this.emit("connection", response, options); - // Ensure connect is emitted in next ticks, otherwise it would be impossible - // to listen to it after calling Net.connect or listening to it after the + // Ensure connect is emitted asynchronously, otherwise it would be impossible + // to listen to it after calling net.connect or listening to it after the // ClientRequest emits "socket". - setTimeout(request.emit.bind(request, "connect")); - setTimeout(response.emit.bind(response, "connect")); + setTimeout(() => { + request.emit("connect"); + response.emit("connect"); + }); return request; } - - tcpConnect(orig, ...args) { - const [opts, callback] = NODE_INTERNALS.normalizeConnectArgs(args); - - const client = this.connect(orig, Socket, opts, callback); - if (client.mitmResponseSocket == null) return client; - if (callback) client.once("connect", callback); - - return client; - } - - tlsConnect(orig, ...args) { - const [opts, callback] = NODE_INTERNALS.normalizeConnectArgs(args); - - const client = this.connect(orig, TlsSocket, opts, callback); - if (client.mitmResponseSocket == null) return client; - if (callback) client.once("secureConnect", callback); - - setTimeout(client.emit.bind(client, "secureConnect")); - - return client; - } - - request(socket) { - if (!socket.mitmResponseSocket) return socket; - - NODE_INTERNALS.createRequestAndResponse.call( - this, - socket.mitmResponseSocket - ); - return socket; - } } diff --git a/lib/stubs.js b/lib/stubs.js index 63d5be3..73506a8 100644 --- a/lib/stubs.js +++ b/lib/stubs.js @@ -3,13 +3,15 @@ export default class Stubs { _stubs = []; - stub(obj, prop, value) { - this._stubs.push([obj, prop, obj[prop]]); - obj[prop] = value; + stub(api, prop, value) { + this._stubs.push([api, prop, api[prop]]); + api[prop] = value; } restore() { - let stub; - while ((stub = this._stubs.pop())) stub[0][stub[1]] = stub[2]; + for (const [api, property, originalValue] of this._stubs) { + api[property] = originalValue; + } + this._stubs = []; } } From 0fc47d40a4668716e1f75954797f6b5b12824a64 Mon Sep 17 00:00:00 2001 From: Gregor Martynus <39992+gr2m@users.noreply.github.com> Date: Sun, 5 Dec 2021 15:42:06 -0800 Subject: [PATCH 56/59] build: rename module to `mitm-esm` --- README.md | 260 ++------------------------------------------------- package.json | 11 +-- 2 files changed, 9 insertions(+), 262 deletions(-) diff --git a/README.md b/README.md index 5967f4c..61c897f 100644 --- a/README.md +++ b/README.md @@ -1,254 +1,14 @@ -# Mitm.js +# `mitm-esm` [![Build Status](https://github.com/gr2m/node-mitm.js/workflows/Test/badge.svg)](https://github.com/gr2m/node-mitm.js/actions?query=workflow%3ATest+branch%3Aesm-and-other-musings) -Mitm.js is a library for Node.js (and Io.js) to **intercept and mock** outgoing -network **TCP** and **HTTP** connections. Mitm.js intercepts and gives you -a `Net.Socket` to communicate as if you were the remote server. For **HTTP -requests** it even gives you `Http.IncomingMessage` and `Http.ServerResponse` -— just like you're used to when writing Node.js servers. Except there's no -actual server running, it's all just _In-Process Interception™_. +`mitm-esm` is the native ES Module version of [moll/node-mitm](https://github.com/moll/node-mitm). -Intercepting connections and requests is **extremely useful to test and ensure -your code does what you expect**. Assert on request parameters and send back -various responses to your code without ever having to hit the real network. -**Fast as hell** and **a lot easier to develop with than external test -servers**. - -Mitm.js works on all Node versions: ancient **v0.10**, **v0.11** and **v0.12** versions, previous and current LTS versions like **v4** to **v12** and the newest **v13** and beyond. For all it has **automated tests** to ensure it will stay that way. - -I've developed Mitm.js on a need-to basis for testing [Monday -Calendar][monday]'s syncing, so if you find a use-case I haven't come across, -please fling me an [email][email], a [tweet][twitter] or [create an -issue][issues] on GitHub. - -### Tour - -- Intercept both **TCP socket connections** (`Net.connect`) and **HTTP - requests** (`Http.request` and `Https.request`). - -- Hooks to Node.js's network functions at a **very low level** with the goal of - not having to patch existing classes and have everything behave as if bytes - were arriving from the network. - -- Does _not_ have any kitchen sink features or yet another API to assert on - intercepted connections. - That's a different responsibility handled better by assertion libraries - (you'll do no better than to pick [Must.js][must] for that ;-). - -- Use an **API you already know** to assert or respond to requests — Mitm.js - gives you access to a vanilla `Net.Socket` to respond with: - - ```javascript - mitm.on("connection", function (socket) { - socket.write("Hello back!"); - }); - - const socket = Net.connect(22, "example.org"); - socket.write("Hello!"); - socket.setEncoding("utf8"); - socket.on("data", console.log); // => "Hello back!" - ``` - -- When you do **HTTP or HTTPS** requests, Mitm.js gives you both - a `Http.IncomingMessage` and `Http.ServerResponse` to play the server with. - That means you'll be using an **API you're already familiar with** - rather than yet another idiosyncratic domain specific language. - - Mitm.js comes very handy to ensure your code makes requests with the - appropriate parameters: - - ```javascript - mitm.on("request", function (req, res) { - req.headers.authorization.must.equal("OAuth DEADBEEF"); - }); - - Http.get("http://example.org"); - ``` - - It's also useful to see if your code behaves as you'd expect if everything is - not `200 OK`: - - ```javascript - mitm.on("request", function (req, res) { - res.statusCode = 402; - res.end("Pay up, sugar!"); - }); - - Http.get("http://example.org", function (res) { - res.setEncoding("utf8"); - res.statusCode; // => 402 - res.on("data", console.log); // => "Pay up, sugar!" - }); - ``` - - `Http.IncomingMessage` and `Http.ServerResponse` are the same objects - you get when you write Node.js HTTP servers with `Net.Server` or use a library - like [Express.js][express]. - -- **Bypass** interception selectively for some connections (such as your SQL - server) and let them connect as usual. - - ```javascript - mitm.on("connect", function (socket, opts) { - if (opts.host == "sql.example.org" && opts.port == 5432) socket.bypass(); - }); - ``` - -- **Developed with automated tests**. Yeah, I know, why should one list this - a feature when writing tests is just a sign of professionalism and respect - towards other developers? But in a world where so many libraries and - "production" software are released without _any_ tests, I like to point out - that I even write tests for testing libraries. ;-) - -[must]: https://github.com/moll/js-must -[express]: http://expressjs.com - -## Installing - -``` -npm install mitm -``` - -From v1.0.0 Mitm.js will follow [semantic versioning][semver], but until then, -breaking changes may appear between minor versions (the middle number). - -[semver]: http://semver.org/ - -## Using - -Require Mitm.js and invoke it as a function to both create an instance of `Mitm` -and enable intercepting: - -```javascript -import Mitm from "mitm"; -const mitm = Mitm(); -``` - -Mitm.js will then intercept all requests until you disable it: - -```javascript -mitm.disable(); -``` - -### Intercepting in tests - -In tests, it's best to use the _before_ and _after_ hooks to enable and disable -intercepting for each test case: - -```javascript -beforeEach(function () { - this.mitm = Mitm(); -}); -afterEach(function () { - this.mitm.disable(); -}); -``` - -### Intercepting TCP connections - -After you've called `Mitm()`, Mitm.js will intercept and emit `connection` on -itself for each new connection. -The `connection` event will be given a server side `Net.Socket` for you to reply -with: - -```javascript -mitm.on("connection", function (socket) { - socket.write("Hello back!"); -}); - -const socket = Net.connect(22, "example.org"); -socket.write("Hello!"); -socket.setEncoding("utf8"); -socket.on("data", console.log); // => "Hello back!" -``` - -### Intercepting HTTP/HTTPS requests - -After you've called `Mitm()`, Mitm.js will intercept and emit `request` on itself for each new HTTP or HTTPS request. -The `request` event will be given a server side `Http.IncomingMessage` and -`Http.ServerResponse`. - -For example, asserting on HTTP requests would look something like this: - -```javascript -mitm.on("request", function (req, res) { - req.headers.authorization.must.equal("OAuth DEADBEEF"); -}); - -Http.get("http://example.org"); -``` - -Responding to requests is just as easy and exactly like you're used to from -using Node.js HTTP servers (or from libraries like [Express.js][express]): - -```javascript -mitm.on("request", function (req, res) { - res.statusCode = 402; - res.end("Pay up, sugar!"); -}); - -Http.get("http://example.org", function (res) { - res.statusCode; // => 402 - res.setEncoding("utf8"); - res.on("data", console.log); // => "Pay up, sugar!" -}); -``` - -Please note that HTTPS requests are currently "morphed" into HTTP requests. -That's to save us from having to set up certificates and disable their -verification. But if you do need to test this, please ping me and we'll see if -we can get Mitm.js to support that. - -#### Custom HTTP Methods - -Unfortunately because [Node.js's web server doesn't seem to support custom HTTP methods](https://github.com/nodejs/node-v0.x-archive/issues/3192) (that is, ones beyond Node's `http.METHODS`), Mitm.js doesn't support them out of the box either. The Node.js HTTP parser throws an error given a request with an unsupported method. However, as Mitm.js also supports intercepting at the TCP level, you could hook in your own HTTP parser. I've briefly alluded to it in [issue #63](https://github.com/moll/node-mitm/issues/63). - -### Bypassing interception - -You can bypass connections listening to the `connect` event on the Mitm instance -and then calling `bypass` on the given socket. To help you do -so selectively, `connect` is given the `options` object that was given to -`Net.connect`: - -```javascript -mitm.on("connect", function (socket, opts) { - if (opts.host == "sql.example.org" && opts.port == 5432) socket.bypass(); -}); -``` - -Bypassed connections do **not** emit `connection` or `request` events. They're -ignored by Mitm.js. - -In most cases you don't need to bypass because by the time you call `Mitm` in -your tests to start intercepting, all of the long-running connections, such as -database or cache connections, are already made. - -You might need to bypass connections you make to _localhost_ when you're running -integration tests against the HTTP server you started in the test process, but -still want to intercept some other connections that this request might invoke. -The following should suffice: - -```javascript -mitm.on("connect", function (socket, opts) { - if (opts.host == "localhost") socket.bypass(); -}); -``` - -## Events - -All events that Mitm will emit on an instance of itself (see [Using -Mitm.js](#using) for examples): - -| Event | Description | -| ---------- | ---------------------------------------------------------------------------------------------------------------------- | -| connect | Emitted when a TCP connection is made.
Given the **client side** `Net.Socket` and `options` from `Net.connect`. | -| connection | Emitted when a TCP connection is made.
Given the **server side** `Net.Socket` and `options` from `Net.connect`. | -| request | Emitted when a HTTP/HTTPS request is made.
Given the server side `Http.IncomingMessage` and `Http.ServerResponse`. | +See [#1](https://github.com/gr2m/node-mitm/pull/1) for more details on the rewrite. ## License -Mitm.js is released under a _Lesser GNU Affero General Public License_, which +`mitm-esm` is released under a _Lesser GNU Affero General Public License_, which in summary means: - You **can** use this program for **no cost**. @@ -261,14 +21,6 @@ For more convoluted language, see the `LICENSE` file. ## About -**[Andri Möll][moll]** typed this and the code. -[Monday Calendar][monday] supported the engineering work. - -If you find Mitm.js needs improving, please don't hesitate to type to me now -at [andri@dot.ee][email] or [create an issue online][issues]. +**[Andri Möll](http://themoll.com)** created the original version at [moll/node-mitm](https://github.com/moll/node-mitm). [Monday Calendar](https://mondayapp.com) supported the engineering work. -[email]: mailto:andri@dot.ee -[issues]: https://github.com/moll/node-mitm/issues -[moll]: http://themoll.com -[monday]: https://mondayapp.com -[twitter]: https://twitter.com/theml +**[Gregor Martynus](https://github.com/gr2m)** made the code a native ES Module. diff --git a/package.json b/package.json index 42a7235..2d21369 100644 --- a/package.json +++ b/package.json @@ -1,5 +1,5 @@ { - "name": "mitm", + "name": "mitm-esm", "version": "1.7.2", "type": "module", "description": "Intercept and mock outgoing network TCP connections and HTTP requests for testing. Intercepts and gives you a Net.Socket, Http.IncomingMessage and Http.ServerResponse to test and respond with. Useful when testing code that hits remote servers.", @@ -15,21 +15,16 @@ "test", "webmock" ], - "homepage": "https://github.com/moll/node-mitm", - "bugs": "https://github.com/moll/node-mitm/issues", "author": { "name": "Andri Möll", "email": "andri@dot.ee", "url": "http://themoll.com" }, - "repository": { - "type": "git", - "url": "git://github.com/moll/node-mitm.git" - }, + "repository": "github:gr2m/mitm-esm", "licenses": [ { "type": "LAGPL", - "url": "https://github.com/moll/node-mitm/blob/master/LICENSE" + "url": "https://github.com/gr2m/mitm-esm/blob/master/LICENSE" } ], "exports": "./index.js", From 21bd148b7c8672575e41fa1a54cfac612138f2ec Mon Sep 17 00:00:00 2001 From: Gregor Martynus <39992+gr2m@users.noreply.github.com> Date: Sun, 5 Dec 2021 15:42:34 -0800 Subject: [PATCH 57/59] build(pkg): set verion to `"0.0.0-development"` --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 2d21369..cedc417 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "mitm-esm", - "version": "1.7.2", + "version": "0.0.0-development", "type": "module", "description": "Intercept and mock outgoing network TCP connections and HTTP requests for testing. Intercepts and gives you a Net.Socket, Http.IncomingMessage and Http.ServerResponse to test and respond with. Useful when testing code that hits remote servers.", "keywords": [ From 6976151fead1d440b760cbace765c95cb223546a Mon Sep 17 00:00:00 2001 From: Gregor Martynus <39992+gr2m@users.noreply.github.com> Date: Sun, 5 Dec 2021 15:44:27 -0800 Subject: [PATCH 58/59] ci: release --- .github/workflows/release.yml | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) create mode 100644 .github/workflows/release.yml diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml new file mode 100644 index 0000000..32512de --- /dev/null +++ b/.github/workflows/release.yml @@ -0,0 +1,22 @@ +name: Release +"on": + push: + branches: + - master + - next + - beta + - "*.x" +jobs: + release: + name: release + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + - uses: actions/setup-node@v2 + with: + node-version: 16 + - run: npm ci + - run: npx semantic-release + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + NPM_TOKEN: ${{ secrets.NPM_TOKEN }} From 239d003477b1d3a6777c0949c5acfdbfa2ec7d27 Mon Sep 17 00:00:00 2001 From: Gregor Martynus <39992+gr2m@users.noreply.github.com> Date: Sun, 5 Dec 2021 15:45:20 -0800 Subject: [PATCH 59/59] test: stop testing in Node 12 --- .github/workflows/test.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 65e2f6a..aabf8ef 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -19,7 +19,6 @@ jobs: strategy: matrix: node-version: - - 12 - 14 - 16 - 17