Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/npm/cli.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRuy Adorno <ruyadorno@hotmail.com>2021-03-25 07:45:30 +0300
committerRuy Adorno <ruyadorno@hotmail.com>2021-03-26 00:32:24 +0300
commit97b41528739460b2e9e72e09000aded412418cb2 (patch)
tree98236ceca0ff02dc8528f674d09d319a7cc871de /smoke-tests
parent59cf37962a2286e0f7d3bd37fa9c8bc3bac94218 (diff)
add smoke tests
Lightweight smoke test suite that runs common commands so that we can also have a holistic check during CI. PR-URL: https://github.com/npm/cli/pull/2959 Credit: @ruyadorno Close: #2959 Reviewed-by: @nlf
Diffstat (limited to 'smoke-tests')
-rw-r--r--smoke-tests/content/abbrev.json449
-rw-r--r--smoke-tests/content/abbrev.min.json89
-rw-r--r--smoke-tests/content/abbrev/-/abbrev-1.0.4.tgzbin0 -> 2295 bytes
-rw-r--r--smoke-tests/content/abbrev/-/abbrev-1.1.1.tgzbin0 -> 2301 bytes
-rw-r--r--smoke-tests/content/promise-all-reject-late.json138
-rw-r--r--smoke-tests/content/promise-all-reject-late.min.json44
-rw-r--r--smoke-tests/content/promise-all-reject-late/-/promise-all-reject-late-1.0.1.tgzbin0 -> 30838 bytes
-rw-r--r--smoke-tests/index.js196
-rw-r--r--smoke-tests/server.js276
9 files changed, 1192 insertions, 0 deletions
diff --git a/smoke-tests/content/abbrev.json b/smoke-tests/content/abbrev.json
new file mode 100644
index 000000000..ffcf5474a
--- /dev/null
+++ b/smoke-tests/content/abbrev.json
@@ -0,0 +1,449 @@
+{
+ "_id": "abbrev",
+ "_rev": "72-d1d46bef3d311d6da6737e109e771869",
+ "name": "abbrev",
+ "dist-tags": {
+ "latest": "1.1.1"
+ },
+ "versions": {
+ "1.0.3": {
+ "name": "abbrev",
+ "version": "1.0.3",
+ "description": "Like ruby's abbrev module, but in js",
+ "author": {
+ "name": "Isaac Z. Schlueter",
+ "email": "i@izs.me"
+ },
+ "main": "./lib/abbrev.js",
+ "scripts": {
+ "test": "node lib/abbrev.js"
+ },
+ "repository": {
+ "type": "git",
+ "url": "git://github.com/isaacs/abbrev-js.git"
+ },
+ "_id": "abbrev@1.0.3",
+ "engines": {
+ "node": "*"
+ },
+ "_engineSupported": true,
+ "_npmVersion": "1.0.0rc7",
+ "_nodeVersion": "v0.5.0-pre",
+ "_defaultsLoaded": true,
+ "dist": {
+ "shasum": "aa049c967f999222aa42e14434f0c562ef468241",
+ "tarball": "https://registry.npmjs.org/abbrev/-/abbrev-1.0.3.tgz"
+ },
+ "directories": {}
+ },
+ "1.0.4": {
+ "name": "abbrev",
+ "version": "1.0.4",
+ "description": "Like ruby's abbrev module, but in js",
+ "author": {
+ "name": "Isaac Z. Schlueter",
+ "email": "i@izs.me"
+ },
+ "main": "./lib/abbrev.js",
+ "scripts": {
+ "test": "node lib/abbrev.js"
+ },
+ "repository": {
+ "type": "git",
+ "url": "http://github.com/isaacs/abbrev-js"
+ },
+ "license": {
+ "type": "MIT",
+ "url": "https://github.com/isaacs/abbrev-js/raw/master/LICENSE"
+ },
+ "_id": "abbrev@1.0.4",
+ "dist": {
+ "shasum": "bd55ae5e413ba1722ee4caba1f6ea10414a59ecd",
+ "tarball": "https://registry.npmjs.org/abbrev/-/abbrev-1.0.4.tgz"
+ },
+ "_npmVersion": "1.1.70",
+ "_npmUser": {
+ "name": "isaacs",
+ "email": "i@izs.me"
+ },
+ "maintainers": [
+ {
+ "name": "isaacs",
+ "email": "i@izs.me"
+ }
+ ],
+ "directories": {}
+ },
+ "1.0.5": {
+ "name": "abbrev",
+ "version": "1.0.5",
+ "description": "Like ruby's abbrev module, but in js",
+ "author": {
+ "name": "Isaac Z. Schlueter",
+ "email": "i@izs.me"
+ },
+ "main": "abbrev.js",
+ "scripts": {
+ "test": "node test.js"
+ },
+ "repository": {
+ "type": "git",
+ "url": "http://github.com/isaacs/abbrev-js"
+ },
+ "license": {
+ "type": "MIT",
+ "url": "https://github.com/isaacs/abbrev-js/raw/master/LICENSE"
+ },
+ "bugs": {
+ "url": "https://github.com/isaacs/abbrev-js/issues"
+ },
+ "homepage": "https://github.com/isaacs/abbrev-js",
+ "_id": "abbrev@1.0.5",
+ "_shasum": "5d8257bd9ebe435e698b2fa431afde4fe7b10b03",
+ "_from": ".",
+ "_npmVersion": "1.4.7",
+ "_npmUser": {
+ "name": "isaacs",
+ "email": "i@izs.me"
+ },
+ "maintainers": [
+ {
+ "name": "isaacs",
+ "email": "i@izs.me"
+ }
+ ],
+ "dist": {
+ "shasum": "5d8257bd9ebe435e698b2fa431afde4fe7b10b03",
+ "tarball": "https://registry.npmjs.org/abbrev/-/abbrev-1.0.5.tgz"
+ },
+ "directories": {}
+ },
+ "1.0.6": {
+ "name": "abbrev",
+ "version": "1.0.6",
+ "description": "Like ruby's abbrev module, but in js",
+ "author": {
+ "name": "Isaac Z. Schlueter",
+ "email": "i@izs.me"
+ },
+ "main": "abbrev.js",
+ "scripts": {
+ "test": "node test.js"
+ },
+ "repository": {
+ "type": "git",
+ "url": "git+ssh://git@github.com/isaacs/abbrev-js.git"
+ },
+ "license": "ISC",
+ "gitHead": "648a6735d9c5a7a04885e3ada49eed4db36181c2",
+ "bugs": {
+ "url": "https://github.com/isaacs/abbrev-js/issues"
+ },
+ "homepage": "https://github.com/isaacs/abbrev-js#readme",
+ "_id": "abbrev@1.0.6",
+ "_shasum": "b6d632b859b3fa2d6f7e4b195472461b9e32dc30",
+ "_from": ".",
+ "_npmVersion": "2.10.0",
+ "_nodeVersion": "2.0.1",
+ "_npmUser": {
+ "name": "isaacs",
+ "email": "isaacs@npmjs.com"
+ },
+ "dist": {
+ "shasum": "b6d632b859b3fa2d6f7e4b195472461b9e32dc30",
+ "tarball": "https://registry.npmjs.org/abbrev/-/abbrev-1.0.6.tgz"
+ },
+ "maintainers": [
+ {
+ "name": "isaacs",
+ "email": "i@izs.me"
+ }
+ ],
+ "directories": {}
+ },
+ "1.0.7": {
+ "name": "abbrev",
+ "version": "1.0.7",
+ "description": "Like ruby's abbrev module, but in js",
+ "author": {
+ "name": "Isaac Z. Schlueter",
+ "email": "i@izs.me"
+ },
+ "main": "abbrev.js",
+ "scripts": {
+ "test": "tap test.js --cov"
+ },
+ "repository": {
+ "type": "git",
+ "url": "git+ssh://git@github.com/isaacs/abbrev-js.git"
+ },
+ "license": "ISC",
+ "devDependencies": {
+ "tap": "^1.2.0"
+ },
+ "gitHead": "821d09ce7da33627f91bbd8ed631497ed6f760c2",
+ "bugs": {
+ "url": "https://github.com/isaacs/abbrev-js/issues"
+ },
+ "homepage": "https://github.com/isaacs/abbrev-js#readme",
+ "_id": "abbrev@1.0.7",
+ "_shasum": "5b6035b2ee9d4fb5cf859f08a9be81b208491843",
+ "_from": ".",
+ "_npmVersion": "2.10.1",
+ "_nodeVersion": "2.0.1",
+ "_npmUser": {
+ "name": "isaacs",
+ "email": "isaacs@npmjs.com"
+ },
+ "dist": {
+ "shasum": "5b6035b2ee9d4fb5cf859f08a9be81b208491843",
+ "tarball": "https://registry.npmjs.org/abbrev/-/abbrev-1.0.7.tgz"
+ },
+ "maintainers": [
+ {
+ "name": "isaacs",
+ "email": "i@izs.me"
+ }
+ ],
+ "directories": {}
+ },
+ "1.0.9": {
+ "name": "abbrev",
+ "version": "1.0.9",
+ "description": "Like ruby's abbrev module, but in js",
+ "author": {
+ "name": "Isaac Z. Schlueter",
+ "email": "i@izs.me"
+ },
+ "main": "abbrev.js",
+ "scripts": {
+ "test": "tap test.js --cov"
+ },
+ "repository": {
+ "type": "git",
+ "url": "git+ssh://git@github.com/isaacs/abbrev-js.git"
+ },
+ "license": "ISC",
+ "devDependencies": {
+ "tap": "^5.7.2"
+ },
+ "files": [
+ "abbrev.js"
+ ],
+ "gitHead": "c386cd9dbb1d8d7581718c54d4ba944cc9298d6f",
+ "bugs": {
+ "url": "https://github.com/isaacs/abbrev-js/issues"
+ },
+ "homepage": "https://github.com/isaacs/abbrev-js#readme",
+ "_id": "abbrev@1.0.9",
+ "_shasum": "91b4792588a7738c25f35dd6f63752a2f8776135",
+ "_from": ".",
+ "_npmVersion": "3.9.1",
+ "_nodeVersion": "4.4.4",
+ "_npmUser": {
+ "name": "isaacs",
+ "email": "i@izs.me"
+ },
+ "dist": {
+ "shasum": "91b4792588a7738c25f35dd6f63752a2f8776135",
+ "tarball": "https://registry.npmjs.org/abbrev/-/abbrev-1.0.9.tgz"
+ },
+ "maintainers": [
+ {
+ "name": "isaacs",
+ "email": "i@izs.me"
+ }
+ ],
+ "_npmOperationalInternal": {
+ "host": "packages-16-east.internal.npmjs.com",
+ "tmp": "tmp/abbrev-1.0.9.tgz_1466016055839_0.7825860097073019"
+ },
+ "directories": {}
+ },
+ "1.1.0": {
+ "name": "abbrev",
+ "version": "1.1.0",
+ "description": "Like ruby's abbrev module, but in js",
+ "author": {
+ "name": "Isaac Z. Schlueter",
+ "email": "i@izs.me"
+ },
+ "main": "abbrev.js",
+ "scripts": {
+ "test": "tap test.js --100",
+ "preversion": "npm test",
+ "postversion": "npm publish",
+ "postpublish": "git push origin --all; git push origin --tags"
+ },
+ "repository": {
+ "type": "git",
+ "url": "git+ssh://git@github.com/isaacs/abbrev-js.git"
+ },
+ "license": "ISC",
+ "devDependencies": {
+ "tap": "^10.1"
+ },
+ "files": [
+ "abbrev.js"
+ ],
+ "gitHead": "7136d4d95449dc44115d4f78b80ec907724f64e0",
+ "bugs": {
+ "url": "https://github.com/isaacs/abbrev-js/issues"
+ },
+ "homepage": "https://github.com/isaacs/abbrev-js#readme",
+ "_id": "abbrev@1.1.0",
+ "_shasum": "d0554c2256636e2f56e7c2e5ad183f859428d81f",
+ "_from": ".",
+ "_npmVersion": "4.3.0",
+ "_nodeVersion": "8.0.0-pre",
+ "_npmUser": {
+ "name": "isaacs",
+ "email": "i@izs.me"
+ },
+ "dist": {
+ "shasum": "d0554c2256636e2f56e7c2e5ad183f859428d81f",
+ "tarball": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.0.tgz"
+ },
+ "maintainers": [
+ {
+ "name": "isaacs",
+ "email": "i@izs.me"
+ }
+ ],
+ "_npmOperationalInternal": {
+ "host": "packages-12-west.internal.npmjs.com",
+ "tmp": "tmp/abbrev-1.1.0.tgz_1487054000015_0.9229173036292195"
+ },
+ "directories": {}
+ },
+ "1.1.1": {
+ "name": "abbrev",
+ "version": "1.1.1",
+ "description": "Like ruby's abbrev module, but in js",
+ "author": {
+ "name": "Isaac Z. Schlueter",
+ "email": "i@izs.me"
+ },
+ "main": "abbrev.js",
+ "scripts": {
+ "test": "tap test.js --100",
+ "preversion": "npm test",
+ "postversion": "npm publish",
+ "postpublish": "git push origin --all; git push origin --tags"
+ },
+ "repository": {
+ "type": "git",
+ "url": "git+ssh://git@github.com/isaacs/abbrev-js.git"
+ },
+ "license": "ISC",
+ "devDependencies": {
+ "tap": "^10.1"
+ },
+ "files": [
+ "abbrev.js"
+ ],
+ "gitHead": "a9ee72ebc8fe3975f1b0c7aeb3a8f2a806a432eb",
+ "bugs": {
+ "url": "https://github.com/isaacs/abbrev-js/issues"
+ },
+ "homepage": "https://github.com/isaacs/abbrev-js#readme",
+ "_id": "abbrev@1.1.1",
+ "_npmVersion": "5.4.2",
+ "_nodeVersion": "8.5.0",
+ "_npmUser": {
+ "name": "isaacs",
+ "email": "i@izs.me"
+ },
+ "dist": {
+ "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==",
+ "shasum": "f8f2c887ad10bf67f634f005b6987fed3179aac8",
+ "tarball": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz"
+ },
+ "maintainers": [
+ {
+ "name": "gabra",
+ "email": "jerry+1@npmjs.com"
+ },
+ {
+ "name": "isaacs",
+ "email": "i@izs.me"
+ }
+ ],
+ "_npmOperationalInternal": {
+ "host": "s3://npm-registry-packages",
+ "tmp": "tmp/abbrev-1.1.1.tgz_1506566833068_0.05750026390887797"
+ },
+ "directories": {}
+ }
+ },
+ "maintainers": [
+ {
+ "email": "quitlahok@gmail.com",
+ "name": "nlf"
+ },
+ {
+ "email": "ruyadorno@hotmail.com",
+ "name": "ruyadorno"
+ },
+ {
+ "email": "darcy@darcyclarke.me",
+ "name": "darcyclarke"
+ },
+ {
+ "email": "evilpacket@gmail.com",
+ "name": "adam_baldwin"
+ },
+ {
+ "email": "i@izs.me",
+ "name": "isaacs"
+ }
+ ],
+ "author": {
+ "name": "Isaac Z. Schlueter",
+ "email": "i@izs.me"
+ },
+ "description": "Like ruby's abbrev module, but in js",
+ "time": {
+ "modified": "2020-10-13T05:04:03.636Z",
+ "created": "2011-03-21T22:21:11.183Z",
+ "1.0.1": "2011-03-21T22:21:11.183Z",
+ "1.0.2": "2011-03-21T22:21:11.183Z",
+ "1.0.3": "2011-03-21T22:21:11.183Z",
+ "1.0.3-1": "2011-03-24T23:01:19.581Z",
+ "1.0.4": "2013-01-09T00:01:24.135Z",
+ "1.0.5": "2014-04-17T20:09:12.523Z",
+ "1.0.6": "2015-05-21T00:58:16.778Z",
+ "1.0.7": "2015-05-30T22:57:54.685Z",
+ "1.0.9": "2016-06-15T18:41:01.215Z",
+ "1.1.0": "2017-02-14T06:33:20.235Z",
+ "1.1.1": "2017-09-28T02:47:13.220Z"
+ },
+ "repository": {
+ "type": "git",
+ "url": "git+ssh://git@github.com/isaacs/abbrev-js.git"
+ },
+ "users": {
+ "leesei": true,
+ "ceejbot": true,
+ "isaacs": true,
+ "npm-www": true,
+ "tunnckocore": true,
+ "ruanyu1": true,
+ "leodutra": true,
+ "jessaustin": true,
+ "jian263994241": true,
+ "floriannagel": true,
+ "tdmalone": true,
+ "ryanve": true,
+ "detj": true,
+ "monjer": true,
+ "d-band": true
+ },
+ "readme": "# abbrev-js\n\nJust like [ruby's Abbrev](http://apidock.com/ruby/Abbrev).\n\nUsage:\n\n var abbrev = require(\"abbrev\");\n abbrev(\"foo\", \"fool\", \"folding\", \"flop\");\n \n // returns:\n { fl: 'flop'\n , flo: 'flop'\n , flop: 'flop'\n , fol: 'folding'\n , fold: 'folding'\n , foldi: 'folding'\n , foldin: 'folding'\n , folding: 'folding'\n , foo: 'foo'\n , fool: 'fool'\n }\n\nThis is handy for command-line scripts, or other cases where you want to be able to accept shorthands.\n",
+ "readmeFilename": "README.md",
+ "homepage": "https://github.com/isaacs/abbrev-js#readme",
+ "bugs": {
+ "url": "https://github.com/isaacs/abbrev-js/issues"
+ },
+ "license": "ISC"
+}
diff --git a/smoke-tests/content/abbrev.min.json b/smoke-tests/content/abbrev.min.json
new file mode 100644
index 000000000..c03d91c9c
--- /dev/null
+++ b/smoke-tests/content/abbrev.min.json
@@ -0,0 +1,89 @@
+{
+ "name": "abbrev",
+ "dist-tags": {
+ "latest": "1.1.1"
+ },
+ "versions": {
+ "1.0.3": {
+ "name": "abbrev",
+ "version": "1.0.3",
+ "dist": {
+ "shasum": "aa049c967f999222aa42e14434f0c562ef468241",
+ "tarball": "https://registry.npmjs.org/abbrev/-/abbrev-1.0.3.tgz"
+ },
+ "engines": {
+ "node": "*"
+ }
+ },
+ "1.0.4": {
+ "name": "abbrev",
+ "version": "1.0.4",
+ "dist": {
+ "shasum": "bd55ae5e413ba1722ee4caba1f6ea10414a59ecd",
+ "tarball": "https://registry.npmjs.org/abbrev/-/abbrev-1.0.4.tgz"
+ }
+ },
+ "1.0.5": {
+ "name": "abbrev",
+ "version": "1.0.5",
+ "dist": {
+ "shasum": "5d8257bd9ebe435e698b2fa431afde4fe7b10b03",
+ "tarball": "https://registry.npmjs.org/abbrev/-/abbrev-1.0.5.tgz"
+ }
+ },
+ "1.0.6": {
+ "name": "abbrev",
+ "version": "1.0.6",
+ "dist": {
+ "shasum": "b6d632b859b3fa2d6f7e4b195472461b9e32dc30",
+ "tarball": "https://registry.npmjs.org/abbrev/-/abbrev-1.0.6.tgz"
+ }
+ },
+ "1.0.7": {
+ "name": "abbrev",
+ "version": "1.0.7",
+ "devDependencies": {
+ "tap": "^1.2.0"
+ },
+ "dist": {
+ "shasum": "5b6035b2ee9d4fb5cf859f08a9be81b208491843",
+ "tarball": "https://registry.npmjs.org/abbrev/-/abbrev-1.0.7.tgz"
+ }
+ },
+ "1.0.9": {
+ "name": "abbrev",
+ "version": "1.0.9",
+ "devDependencies": {
+ "tap": "^5.7.2"
+ },
+ "dist": {
+ "shasum": "91b4792588a7738c25f35dd6f63752a2f8776135",
+ "tarball": "https://registry.npmjs.org/abbrev/-/abbrev-1.0.9.tgz"
+ }
+ },
+ "1.1.0": {
+ "name": "abbrev",
+ "version": "1.1.0",
+ "devDependencies": {
+ "tap": "^10.1"
+ },
+ "dist": {
+ "shasum": "d0554c2256636e2f56e7c2e5ad183f859428d81f",
+ "tarball": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.0.tgz"
+ }
+ },
+ "1.1.1": {
+ "name": "abbrev",
+ "version": "1.1.1",
+ "devDependencies": {
+ "tap": "^10.1"
+ },
+ "dist": {
+ "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==",
+ "shasum": "f8f2c887ad10bf67f634f005b6987fed3179aac8",
+ "tarball": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz"
+ }
+ }
+ },
+ "modified": "2020-10-13T05:04:03.636Z"
+}
diff --git a/smoke-tests/content/abbrev/-/abbrev-1.0.4.tgz b/smoke-tests/content/abbrev/-/abbrev-1.0.4.tgz
new file mode 100644
index 000000000..dfd1b5591
--- /dev/null
+++ b/smoke-tests/content/abbrev/-/abbrev-1.0.4.tgz
Binary files differ
diff --git a/smoke-tests/content/abbrev/-/abbrev-1.1.1.tgz b/smoke-tests/content/abbrev/-/abbrev-1.1.1.tgz
new file mode 100644
index 000000000..4d9504504
--- /dev/null
+++ b/smoke-tests/content/abbrev/-/abbrev-1.1.1.tgz
Binary files differ
diff --git a/smoke-tests/content/promise-all-reject-late.json b/smoke-tests/content/promise-all-reject-late.json
new file mode 100644
index 000000000..e243b92a3
--- /dev/null
+++ b/smoke-tests/content/promise-all-reject-late.json
@@ -0,0 +1,138 @@
+{
+ "_id": "promise-all-reject-late",
+ "_rev": "1-bb2ac9479869cc8479d1dd01c568acc0",
+ "name": "promise-all-reject-late",
+ "dist-tags": {
+ "latest": "1.0.1"
+ },
+ "versions": {
+ "1.0.0": {
+ "name": "promise-all-reject-late",
+ "version": "1.0.0",
+ "description": "Like Promise.all, but save rejections until all promises are resolved",
+ "author": {
+ "name": "Isaac Z. Schlueter",
+ "email": "i@izs.me",
+ "url": "https://izs.me"
+ },
+ "license": "ISC",
+ "scripts": {
+ "test": "tap",
+ "preversion": "npm test",
+ "postversion": "npm publish",
+ "prepublishOnly": "git push origin --follow-tags"
+ },
+ "tap": {
+ "check-coverage": true
+ },
+ "devDependencies": {
+ "tap": "^14.10.5"
+ },
+ "gitHead": "e9614a15b22f421aa97ff281d4e0f23681edbe98",
+ "_id": "promise-all-reject-late@1.0.0",
+ "_nodeVersion": "13.3.0",
+ "_npmVersion": "6.13.4",
+ "dist": {
+ "integrity": "sha512-f5XvVl++12pEo7Sv7f7FGfzVuVpeY2msNKjn7nNcXyOSKh5uVu7IAzDO6RE9hDVoHJhxvg+gqEacwkZ891Se5g==",
+ "shasum": "4fa37515e2d78c3b0462414402a8debce62b8b9f",
+ "tarball": "https://registry.npmjs.org/promise-all-reject-late/-/promise-all-reject-late-1.0.0.tgz",
+ "fileCount": 7,
+ "unpackedSize": 123039,
+ "npm-signature": "-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJeBmldCRA9TVsSAnZWagAAaigP/2CarvNCbglNS0dgjOoH\n7ZuFo1cG+N8BkZct00TyEJjuB+5UUmv9TSnZogfEOGutvMqUTSRhvm3fOWsJ\n7TXs8zJ6SotDR9+xlxqi/skpYXfRdNjdaMvo9kYO5jaV84pstdbl17sPeYXd\nCudbAKp1sYodlaJyqpyfUd2PWUNe/VGLODmjLogHB4/bevT3tdjsdauKrUS4\n3VFw8sS1Fwp7P2YneNIK3C1TY/Yb66KysZO23VsQemCQFKXpQJMa9B6yj8zs\n5BQp+W5tM70IfW6OXD0+Vt2jWr9jmKmoWVEiL5usJT3zD7vRbeH3xQvSEgDD\nskI8vH8iJ+3EbEOWTGlIu7mX88Dp2KnHOoRUkOR03WJWuGnsTC8Uyqi0F1Xd\nFeFlaeNzynR/R2LcdRNiFOM+1xtzfAtVGF7TIp9UjgJwSNNkEMlkNzQqSiC7\n/AeqsAYoBBNmYWY2fvXdS9HQ4HfIGjI++jCYWX4I7sUvOjqfcwlEz8MwromA\nqeBAFPdvnB0F/q/AOOLkcdsO81jES7ts0nB7bDt0rDbztWWq34BSMDnNoSDo\nDE9q8u7g68tQcr3WmOQr4ro10sSbJVJZmz8DSJKCbVJ+FN0+GM+49oyyhIFl\nOjokXn5U8ASEdiZnmFnt51dr9A4fyjhehotJA6qSs7t2fBe86VnufijC971U\nv3Jc\r\n=lLwf\r\n-----END PGP SIGNATURE-----\r\n"
+ },
+ "maintainers": [
+ {
+ "name": "isaacs",
+ "email": "i@izs.me"
+ }
+ ],
+ "_npmUser": {
+ "name": "isaacs",
+ "email": "i@izs.me"
+ },
+ "directories": {},
+ "_npmOperationalInternal": {
+ "host": "s3://npm-registry-packages",
+ "tmp": "tmp/promise-all-reject-late_1.0.0_1577478492470_0.9438095135747766"
+ },
+ "_hasShrinkwrap": false
+ },
+ "1.0.1": {
+ "name": "promise-all-reject-late",
+ "version": "1.0.1",
+ "description": "Like Promise.all, but save rejections until all promises are resolved",
+ "author": {
+ "name": "Isaac Z. Schlueter",
+ "email": "i@izs.me",
+ "url": "https://izs.me"
+ },
+ "license": "ISC",
+ "scripts": {
+ "test": "tap",
+ "preversion": "npm test",
+ "postversion": "npm publish",
+ "prepublishOnly": "git push origin --follow-tags"
+ },
+ "tap": {
+ "check-coverage": true
+ },
+ "devDependencies": {
+ "tap": "^14.10.5"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ },
+ "gitHead": "c892a9db86650c9229ab4cc70395106684d6818a",
+ "_id": "promise-all-reject-late@1.0.1",
+ "_nodeVersion": "12.14.1",
+ "_npmVersion": "6.13.6",
+ "dist": {
+ "integrity": "sha512-vuf0Lf0lOxyQREH7GDIOUMLS7kz+gs8i6B+Yi8dC68a2sychGrHTJYghMBD6k7eUcH0H5P73EckCA48xijWqXw==",
+ "shasum": "f8ebf13483e5ca91ad809ccc2fcf25f26f8643c2",
+ "tarball": "https://registry.npmjs.org/promise-all-reject-late/-/promise-all-reject-late-1.0.1.tgz",
+ "fileCount": 8,
+ "unpackedSize": 123171,
+ "npm-signature": "-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJeL65kCRA9TVsSAnZWagAAas4P/2WFFJvncp0LWb3DbE0t\ndx9BhZEwY3W8V6ug8uKvph24LoQp1PakkncscKS7PsCVHyIslD+fi6V99AmI\nOmL2ECAMUd5N69Cs8eTi4tKTNtUoIslfCu0+SMlCAF11D7oBXSabdOxGQofA\nuksoHdCqGM6M1y2BGjK7FR8dSwvgbQCPaUzazZ5w7w4XqVxDlzbvNj2E5mSF\n5HjlT5q239uNQppwPIFpisyi9DKa0ran2N7F2ioZ1PHvhFCqo6rmL8tAQsxQ\n+3OA4eFD0FJCJuqd3MOaY66mkncfNpmPvQYMyigKBUdJJyrgNsB67yfaFduy\ndK198Bnva5kotttQ4EHxM6gkqRm2d9o1/sYmAUtDELgrVDxzeNl+yG+nCkho\n1ta4cY+wy1dTjqAYaprQJ855nIeGGnr3tvz4dEGX/5eyh5K+oYVOYRFvWFX6\nVlEhBmSRqamfW5N1ndMyY18FM+Vc12yu66yZ3z1FqbgEGqdf3EP3lwWqClpP\nbPdXANzHM1FIz1PGHC7IZFWXH5KV1z+JXXahg/d8CLzz0PY6jaBt4c2xDvo7\nLaEAm7kNMbdewKvuTuG7x2Kqyf1KwjpOhXMrq6h0rlFm0pRt0xAArQ9Sglw8\n2Vq9Ic9EEsSIpzA5iQ86O1xkTREGHTB3uTRXUJixXIGkhLkhBB+Uj9y+GoOh\nX+Dm\r\n=yF+m\r\n-----END PGP SIGNATURE-----\r\n"
+ },
+ "maintainers": [
+ {
+ "name": "isaacs",
+ "email": "i@izs.me"
+ }
+ ],
+ "_npmUser": {
+ "name": "isaacs",
+ "email": "i@izs.me"
+ },
+ "directories": {},
+ "_npmOperationalInternal": {
+ "host": "s3://npm-registry-packages",
+ "tmp": "tmp/promise-all-reject-late_1.0.1_1580183139628_0.5159334029276426"
+ },
+ "_hasShrinkwrap": false
+ }
+ },
+ "time": {
+ "created": "2019-12-27T20:28:12.428Z",
+ "1.0.0": "2019-12-27T20:28:12.645Z",
+ "modified": "2020-01-28T03:45:42.154Z",
+ "1.0.1": "2020-01-28T03:45:39.762Z"
+ },
+ "maintainers": [
+ {
+ "name": "isaacs",
+ "email": "i@izs.me"
+ }
+ ],
+ "description": "Like Promise.all, but save rejections until all promises are resolved",
+ "author": {
+ "name": "Isaac Z. Schlueter",
+ "email": "i@izs.me",
+ "url": "https://izs.me"
+ },
+ "license": "ISC",
+ "readme": "# promise-all-reject-late\n\nLike Promise.all, but save rejections until all promises are resolved.\n\nThis is handy when you want to do a bunch of things in parallel, and\nrollback on failure, without clobbering or conflicting with those parallel\nactions that may be in flight. For example, creating a bunch of files,\nand deleting any if they don't all succeed.\n\nExample:\n\n```js\nconst lateReject = require('promise-all-reject-late')\n\nconst { promisify } = require('util')\nconst fs = require('fs')\nconst writeFile = promisify(fs.writeFile)\n\nconst createFilesOrRollback = (files) => {\n return lateReject(files.map(file => writeFile(file, 'some data')))\n .catch(er => {\n // try to clean up, then fail with the initial error\n // we know that all write attempts are finished at this point\n return lateReject(files.map(file => rimraf(file)))\n .catch(er => {\n console.error('failed to clean up, youre on your own i guess', er)\n })\n .then(() => {\n // fail with the original error\n throw er\n })\n })\n}\n```\n\n## API\n\n* `lateReject([array, of, promises])` - Resolve all the promises,\n returning a promise that rejects with the first error, or resolves with\n the array of results, but only after all promises are settled.\n",
+ "readmeFilename": "README.md",
+ "_cached": false,
+ "_contentLength": 0
+} \ No newline at end of file
diff --git a/smoke-tests/content/promise-all-reject-late.min.json b/smoke-tests/content/promise-all-reject-late.min.json
new file mode 100644
index 000000000..699be7aaf
--- /dev/null
+++ b/smoke-tests/content/promise-all-reject-late.min.json
@@ -0,0 +1,44 @@
+{
+ "name": "promise-all-reject-late",
+ "dist-tags": {
+ "latest": "1.0.1"
+ },
+ "versions": {
+ "1.0.0": {
+ "name": "promise-all-reject-late",
+ "version": "1.0.0",
+ "devDependencies": {
+ "tap": "^14.10.5"
+ },
+ "dist": {
+ "integrity": "sha512-f5XvVl++12pEo7Sv7f7FGfzVuVpeY2msNKjn7nNcXyOSKh5uVu7IAzDO6RE9hDVoHJhxvg+gqEacwkZ891Se5g==",
+ "shasum": "4fa37515e2d78c3b0462414402a8debce62b8b9f",
+ "tarball": "https://registry.npmjs.org/promise-all-reject-late/-/promise-all-reject-late-1.0.0.tgz",
+ "fileCount": 7,
+ "unpackedSize": 123039,
+ "npm-signature": "-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJeBmldCRA9TVsSAnZWagAAaigP/2CarvNCbglNS0dgjOoH\n7ZuFo1cG+N8BkZct00TyEJjuB+5UUmv9TSnZogfEOGutvMqUTSRhvm3fOWsJ\n7TXs8zJ6SotDR9+xlxqi/skpYXfRdNjdaMvo9kYO5jaV84pstdbl17sPeYXd\nCudbAKp1sYodlaJyqpyfUd2PWUNe/VGLODmjLogHB4/bevT3tdjsdauKrUS4\n3VFw8sS1Fwp7P2YneNIK3C1TY/Yb66KysZO23VsQemCQFKXpQJMa9B6yj8zs\n5BQp+W5tM70IfW6OXD0+Vt2jWr9jmKmoWVEiL5usJT3zD7vRbeH3xQvSEgDD\nskI8vH8iJ+3EbEOWTGlIu7mX88Dp2KnHOoRUkOR03WJWuGnsTC8Uyqi0F1Xd\nFeFlaeNzynR/R2LcdRNiFOM+1xtzfAtVGF7TIp9UjgJwSNNkEMlkNzQqSiC7\n/AeqsAYoBBNmYWY2fvXdS9HQ4HfIGjI++jCYWX4I7sUvOjqfcwlEz8MwromA\nqeBAFPdvnB0F/q/AOOLkcdsO81jES7ts0nB7bDt0rDbztWWq34BSMDnNoSDo\nDE9q8u7g68tQcr3WmOQr4ro10sSbJVJZmz8DSJKCbVJ+FN0+GM+49oyyhIFl\nOjokXn5U8ASEdiZnmFnt51dr9A4fyjhehotJA6qSs7t2fBe86VnufijC971U\nv3Jc\r\n=lLwf\r\n-----END PGP SIGNATURE-----\r\n"
+ }
+ },
+ "1.0.1": {
+ "name": "promise-all-reject-late",
+ "version": "1.0.1",
+ "devDependencies": {
+ "tap": "^14.10.5"
+ },
+ "dist": {
+ "integrity": "sha512-vuf0Lf0lOxyQREH7GDIOUMLS7kz+gs8i6B+Yi8dC68a2sychGrHTJYghMBD6k7eUcH0H5P73EckCA48xijWqXw==",
+ "shasum": "f8ebf13483e5ca91ad809ccc2fcf25f26f8643c2",
+ "tarball": "https://registry.npmjs.org/promise-all-reject-late/-/promise-all-reject-late-1.0.1.tgz",
+ "fileCount": 8,
+ "unpackedSize": 123171,
+ "npm-signature": "-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJeL65kCRA9TVsSAnZWagAAas4P/2WFFJvncp0LWb3DbE0t\ndx9BhZEwY3W8V6ug8uKvph24LoQp1PakkncscKS7PsCVHyIslD+fi6V99AmI\nOmL2ECAMUd5N69Cs8eTi4tKTNtUoIslfCu0+SMlCAF11D7oBXSabdOxGQofA\nuksoHdCqGM6M1y2BGjK7FR8dSwvgbQCPaUzazZ5w7w4XqVxDlzbvNj2E5mSF\n5HjlT5q239uNQppwPIFpisyi9DKa0ran2N7F2ioZ1PHvhFCqo6rmL8tAQsxQ\n+3OA4eFD0FJCJuqd3MOaY66mkncfNpmPvQYMyigKBUdJJyrgNsB67yfaFduy\ndK198Bnva5kotttQ4EHxM6gkqRm2d9o1/sYmAUtDELgrVDxzeNl+yG+nCkho\n1ta4cY+wy1dTjqAYaprQJ855nIeGGnr3tvz4dEGX/5eyh5K+oYVOYRFvWFX6\nVlEhBmSRqamfW5N1ndMyY18FM+Vc12yu66yZ3z1FqbgEGqdf3EP3lwWqClpP\nbPdXANzHM1FIz1PGHC7IZFWXH5KV1z+JXXahg/d8CLzz0PY6jaBt4c2xDvo7\nLaEAm7kNMbdewKvuTuG7x2Kqyf1KwjpOhXMrq6h0rlFm0pRt0xAArQ9Sglw8\n2Vq9Ic9EEsSIpzA5iQ86O1xkTREGHTB3uTRXUJixXIGkhLkhBB+Uj9y+GoOh\nX+Dm\r\n=yF+m\r\n-----END PGP SIGNATURE-----\r\n"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ }
+ },
+ "modified": "2020-01-28T03:45:42.154Z",
+ "_cached": false,
+ "_contentLength": 2803
+} \ No newline at end of file
diff --git a/smoke-tests/content/promise-all-reject-late/-/promise-all-reject-late-1.0.1.tgz b/smoke-tests/content/promise-all-reject-late/-/promise-all-reject-late-1.0.1.tgz
new file mode 100644
index 000000000..7da404423
--- /dev/null
+++ b/smoke-tests/content/promise-all-reject-late/-/promise-all-reject-late-1.0.1.tgz
Binary files differ
diff --git a/smoke-tests/index.js b/smoke-tests/index.js
new file mode 100644
index 000000000..38c3ed306
--- /dev/null
+++ b/smoke-tests/index.js
@@ -0,0 +1,196 @@
+const fs = require('fs')
+const { promisify } = require('util')
+const execAsync = promisify(require('child_process').exec)
+const { resolve } = require('path')
+const t = require('tap')
+
+const normalizePath = path => path.replace(/[A-Z]:/, '').replace(/\\/g, '/')
+const cwd = normalizePath(process.cwd())
+t.cleanSnapshot = s => s.split(cwd).join('{CWD}')
+ .split(registry).join('https://registry.npmjs.org/')
+ .split(normalizePath(process.execPath)).join('node')
+ .split(process.cwd()).join('{CWD}')
+ .replace(/\\+/g, '/')
+ .replace(/\r\n/g, '\n')
+
+// setup server
+const registryServer = require('./server.js')
+const { registry } = registryServer
+t.test('setup server', { bail: true, buffered: false }, registryServer)
+
+// setup fixtures
+const path = t.testdir({
+ '.npmrc': '',
+ cache: {},
+ project: {},
+ bin: {},
+})
+const localPrefix = resolve(path, 'project')
+const userconfigLocation = resolve(path, '.npmrc')
+const npmLocation = resolve(__dirname, '..')
+const cacheLocation = resolve(path, 'cache')
+const binLocation = resolve(path, 'bin')
+const env = {
+ HOME: path,
+ PATH: `${process.env.PATH}:${binLocation}`,
+}
+const npmOpts = `--registry=${registry} --cache="${cacheLocation}" --userconfig="${userconfigLocation}" --no-audit --no-update-notifier --loglevel=silly`
+const npmBin = `"${process.execPath}" "${npmLocation}" ${npmOpts}`
+const exec = async cmd => {
+ const res = await execAsync(cmd, { cwd: localPrefix, env })
+ if (res.stderr)
+ console.error(res.stderr)
+ return String(res.stdout)
+}
+const readFile = filename =>
+ String(fs.readFileSync(resolve(localPrefix, filename)))
+
+t.test('npm init', async t => {
+ const cmd = `${npmBin} init -y`
+ const cmdRes = await exec(cmd)
+
+ t.matchSnapshot(cmdRes, 'should have successful npm init result')
+ const pkg = JSON.parse(fs.readFileSync(resolve(localPrefix, 'package.json')))
+ t.equal(pkg.name, 'project', 'should have expected generated name')
+ t.equal(pkg.version, '1.0.0', 'should have expected generated version')
+})
+
+t.test('npm install prodDep@version', async t => {
+ const cmd = `${npmBin} install abbrev@1.0.4`
+ const cmdRes = await exec(cmd)
+
+ t.matchSnapshot(cmdRes.replace(/in.*s/, ''),
+ 'should have expected install reify output')
+ t.matchSnapshot(
+ readFile('package.json'),
+ 'should have expected package.json result'
+ )
+ t.matchSnapshot(
+ readFile('package-lock.json'),
+ 'should have expected lockfile result'
+ )
+})
+
+t.test('npm install dev dep', async t => {
+ const cmd = `${npmBin} install -D promise-all-reject-late`
+ const cmdRes = await exec(cmd)
+
+ t.matchSnapshot(cmdRes.replace(/in.*s/, ''),
+ 'should have expected dev dep added reify output')
+ t.matchSnapshot(
+ readFile('package.json'),
+ 'should have expected dev dep added package.json result'
+ )
+ t.matchSnapshot(
+ readFile('package-lock.json'),
+ 'should have expected dev dep added lockfile result'
+ )
+})
+
+t.test('npm ls', async t => {
+ const cmd = `${npmBin} ls`
+ const cmdRes = await exec(cmd)
+
+ t.matchSnapshot(cmdRes,
+ 'should have expected ls output')
+})
+
+t.test('npm fund', async t => {
+ const cmd = `${npmBin} fund`
+ const cmdRes = await exec(cmd)
+
+ t.matchSnapshot(cmdRes,
+ 'should have expected fund output')
+})
+
+t.test('npm explain', async t => {
+ const cmd = `${npmBin} explain abbrev`
+ const cmdRes = await exec(cmd)
+
+ t.matchSnapshot(cmdRes,
+ 'should have expected explain output')
+})
+
+t.test('npm diff', async t => {
+ const cmd = `${npmBin} diff --diff=abbrev@1.0.4 --diff=abbrev@1.1.1`
+ const cmdRes = await exec(cmd)
+
+ t.matchSnapshot(cmdRes,
+ 'should have expected diff output')
+})
+
+t.test('npm outdated', async t => {
+ const cmd = `${npmBin} outdated`
+ const cmdRes = await exec(cmd)
+
+ t.matchSnapshot(cmdRes,
+ 'should have expected outdated output')
+})
+
+t.test('npm set-script', async t => {
+ const cmd = `${npmBin} set-script "hello" "echo Hello"`
+ const cmdRes = await exec(cmd)
+
+ t.matchSnapshot(cmdRes,
+ 'should have expected set-script output')
+ t.matchSnapshot(
+ readFile('package.json'),
+ 'should have expected script added package.json result'
+ )
+})
+
+t.test('npm run-script', async t => {
+ const cmd = `${npmBin} run hello`
+ const cmdRes = await exec(cmd)
+
+ t.matchSnapshot(cmdRes,
+ 'should have expected run-script output')
+})
+
+t.test('npm prefix', async t => {
+ const cmd = `${npmBin} prefix`
+ const cmdRes = await exec(cmd)
+
+ t.matchSnapshot(cmdRes,
+ 'should have expected prefix output')
+})
+
+t.test('npm view', async t => {
+ const cmd = `${npmBin} view abbrev@1.0.4`
+ const cmdRes = await exec(cmd)
+
+ t.matchSnapshot(cmdRes,
+ 'should have expected view output')
+})
+
+t.test('npm update dep', async t => {
+ const cmd = `${npmBin} update abbrev`
+ const cmdRes = await exec(cmd)
+
+ t.matchSnapshot(cmdRes.replace(/in.*s/, ''),
+ 'should have expected update reify output')
+ t.matchSnapshot(
+ readFile('package.json'),
+ 'should have expected update package.json result'
+ )
+ t.matchSnapshot(
+ readFile('package-lock.json'),
+ 'should have expected update lockfile result'
+ )
+})
+
+t.test('npm uninstall', async t => {
+ const cmd = `${npmBin} uninstall promise-all-reject-late`
+ const cmdRes = await exec(cmd)
+
+ t.matchSnapshot(cmdRes.replace(/in.*s/, ''),
+ 'should have expected uninstall reify output')
+ t.matchSnapshot(
+ readFile('package.json'),
+ 'should have expected uninstall package.json result'
+ )
+ t.matchSnapshot(
+ readFile('package-lock.json'),
+ 'should have expected uninstall lockfile result'
+ )
+})
diff --git a/smoke-tests/server.js b/smoke-tests/server.js
new file mode 100644
index 000000000..88cb5883d
--- /dev/null
+++ b/smoke-tests/server.js
@@ -0,0 +1,276 @@
+const {join, dirname} = require('path')
+const {existsSync, readFileSync, writeFileSync} = require('fs')
+const PORT = 12345 + (+process.env.TAP_CHILD_ID || 0)
+const http = require('http')
+const https = require('https')
+
+const mkdirp = require('mkdirp')
+const doProxy = process.env.ARBORIST_TEST_PROXY
+const missing = /\/@isaacs(\/|%2[fF])(this-does-not-exist-at-all|testing-missing-tgz\/-\/)/
+const corgiDoc = 'application/vnd.npm.install-v1+json; q=1.0, application/json; q=0.8, */*'
+const { gzipSync, unzipSync } = require('zlib')
+
+let advisoryBulkResponse = null
+let failAdvisoryBulk = false
+let auditResponse = null
+let failAudit = false
+const startServer = cb => {
+ const server = module.exports.server = http.createServer((req, res) => {
+ res.setHeader('connection', 'close')
+
+ if (req.url === '/-/npm/v1/security/advisories/bulk') {
+ const body = []
+ req.on('data', c => body.push(c))
+ req.on('end', () => {
+ res.setHeader('connection', 'close')
+ if (failAdvisoryBulk) {
+ res.statusCode = 503
+ return res.end('no advisory bulk for you')
+ }
+ if (!advisoryBulkResponse) {
+ if (auditResponse && !failAudit) {
+ // simulate what the registry does when quick audits are allowed,
+ // but advisory bulk requests are not
+ res.statusCode = 405
+ return res.end(JSON.stringify({
+ code: 'MethodNotAllowedError',
+ message: 'POST is not allowed',
+ }))
+ } else {
+ res.statusCode = 404
+ return res.end('not found')
+ }
+ }
+ if (doProxy && !existsSync(advisoryBulkResponse)) {
+ // hit the main registry, then fall back to staging for now
+ // XXX: remove this when bulk advisory endpoint pushed to production!
+ const opts = {
+ host: 'registry.npmjs.org',
+ method: req.method,
+ path: req.url,
+ headers: {
+ ...req.headers,
+ accept: '*',
+ host: 'registry.npmjs.org',
+ connection: 'close',
+ 'if-none-match': '',
+ },
+ }
+ const handleUpstream = upstream => {
+ res.statusCode = upstream.statusCode
+ if (upstream.statusCode >= 300 || upstream.statusCode < 200) {
+ console.error('UPSTREAM ERROR', upstream.statusCode)
+ return upstream.pipe(res)
+ }
+ res.setHeader('content-encoding', upstream.headers['content-encoding'])
+ const file = advisoryBulkResponse
+ console.error('PROXY', `${req.url} -> ${file} ${upstream.statusCode}`)
+ mkdirp.sync(dirname(file))
+ const data = []
+ upstream.on('end', () => {
+ const out = Buffer.concat(data)
+ const obj = JSON.parse(unzipSync(out).toString())
+ writeFileSync(file, JSON.stringify(obj, 0, 2) + '\n')
+ res.end(out)
+ })
+ upstream.on('data', c => data.push(c))
+ }
+ return https.request(opts).on('response', upstream => {
+ if (upstream.statusCode !== 200) {
+ console.error('ATTEMPTING TO PROXY FROM STAGING')
+ console.error('NOTE: THIS WILL FAIL WHEN NOT ON VPN!')
+ opts.host = 'security-microservice-3-west.npm.red'
+ opts.headers.host = opts.host
+ opts.path = '/v1/advisories/bulk'
+ https.request(opts)
+ .on('response', upstream => handleUpstream(upstream))
+ .end(Buffer.concat(body))
+ } else
+ handleUpstream(upstream)
+ }).end(Buffer.concat(body))
+ } else {
+ res.setHeader('content-encoding', 'gzip')
+ res.end(gzipSync(readFileSync(advisoryBulkResponse)))
+ }
+ })
+ return
+ } else if (req.url === '/-/npm/v1/security/audits/quick') {
+ const body = []
+ req.on('data', c => body.push(c))
+ req.on('end', () => {
+ res.setHeader('connection', 'close')
+ if (failAudit) {
+ res.statusCode = 503
+ return res.end('no audit for you')
+ }
+ if (!auditResponse) {
+ res.statusCode = 404
+ return res.end('not found')
+ }
+ if (doProxy && !existsSync(auditResponse)) {
+ return https.request({
+ host: 'registry.npmjs.org',
+ method: req.method,
+ path: req.url,
+ headers: {
+ ...req.headers,
+ accept: '*',
+ host: 'registry.npmjs.org',
+ connection: 'close',
+ 'if-none-match': '',
+ },
+ }).on('response', upstream => {
+ res.statusCode = upstream.statusCode
+ if (upstream.statusCode >= 300 || upstream.statusCode < 200) {
+ console.error('UPSTREAM ERROR', upstream.statusCode)
+ // don't save if it's not a valid response
+ return upstream.pipe(res)
+ }
+ res.setHeader('content-encoding', upstream.headers['content-encoding'])
+ const file = auditResponse
+ console.error('PROXY', `${req.url} -> ${file} ${upstream.statusCode}`)
+ mkdirp.sync(dirname(file))
+ const data = []
+ upstream.on('end', () => {
+ const out = Buffer.concat(data)
+ // make it a bit prettier to read later
+ const obj = JSON.parse(unzipSync(out).toString())
+ writeFileSync(file, JSON.stringify(obj, 0, 2) + '\n')
+ res.end(out)
+ })
+ upstream.on('data', c => data.push(c))
+ }).end(Buffer.concat(body))
+ } else {
+ res.setHeader('content-encoding', 'gzip')
+ res.end(gzipSync(readFileSync(auditResponse)))
+ }
+ })
+ return
+ }
+
+ const f = join(__dirname, 'content', join('/', req.url.replace(/@/, '').replace(/%2f/i, '/')))
+ const isCorgi = req.headers.accept.includes('application/vnd.npm.install-v1+json')
+ const file = f + (
+ isCorgi && existsSync(`${f}.min.json`) ? '.min.json'
+ : existsSync(`${f}.json`) ? '.json'
+ : existsSync(`${f}/index.json`) ? 'index.json'
+ : ''
+ )
+
+ try {
+ const body = readFileSync(file)
+ res.setHeader('content-length', body.length)
+ res.setHeader('content-type', /\.min\.json$/.test(file) ? corgiDoc
+ : /\.json$/.test(file) ? 'application/json'
+ : 'application/octet-stream')
+ res.end(body)
+ } catch (er) {
+ // testing things going missing from the registry somehow
+ if (missing.test(req.url)) {
+ res.statusCode = 404
+ res.end('{"error": "not found"}')
+ return
+ }
+
+ if (doProxy) {
+ return https.get({
+ host: 'registry.npmjs.org',
+ path: req.url,
+ headers: {
+ ...req.headers,
+ accept: '*',
+ 'accept-encoding': 'identity',
+ host: 'registry.npmjs.org',
+ connection: 'close',
+ 'if-none-match': '',
+ },
+ }).on('response', upstream => {
+ const errorStatus =
+ upstream.statusCode >= 300 || upstream.statusCode < 200
+
+ if (errorStatus)
+ console.error('UPSTREAM ERROR', upstream.statusCode)
+
+ const ct = upstream.headers['content-type']
+ const isJson = ct.includes('application/json')
+ const file = isJson ? f + '.json' : f
+ console.error('PROXY', `${req.url} -> ${file} ${ct}`)
+ mkdirp.sync(dirname(file))
+ const data = []
+ res.statusCode = upstream.statusCode
+ res.setHeader('content-type', ct)
+ upstream.on('end', () => {
+ console.error('ENDING', req.url)
+ const out = Buffer.concat(data)
+ if (!errorStatus) {
+ if (isJson) {
+ const obj = JSON.parse(out.toString())
+ writeFileSync(file, JSON.stringify(obj, 0, 2) + '\n')
+ const mrm = require('minify-registry-metadata')
+ const minFile = file.replace(/\.json$/, '.min.json')
+ writeFileSync(minFile, JSON.stringify(mrm(obj), 0, 2) + '\n')
+ console.error('WROTE JSONS', [file, minFile])
+ } else
+ writeFileSync(file, out)
+ }
+ res.end(out)
+ })
+ upstream.on('data', c => data.push(c))
+ }).end()
+ }
+
+ res.statusCode = er.code === 'ENOENT' ? 404 : 500
+ if (res.method === 'GET')
+ console.error(er)
+ res.setHeader('content-type', 'text/plain')
+ res.end(er.stack)
+ }
+ })
+ server.listen(PORT, cb)
+}
+
+module.exports = t => startServer(() => {
+ t.parent.teardown(() => module.exports.server.close())
+ t.end()
+})
+
+module.exports.auditResponse = value => {
+ if (auditResponse && auditResponse !== value) {
+ throw new Error('setting audit response, but already set\n' +
+ '(did you forget to call the returned function on teardown?)')
+ }
+ auditResponse = value
+ return () => auditResponse = null
+}
+module.exports.failAudit = () => {
+ failAudit = true
+ return () => failAudit = false
+}
+
+module.exports.advisoryBulkResponse = value => {
+ if (advisoryBulkResponse && advisoryBulkResponse !== value) {
+ throw new Error('setting advisory bulk response, but already set\n' +
+ '(did you forget to call the returned function on teardown?)')
+ }
+ advisoryBulkResponse = value
+ return () => advisoryBulkResponse = null
+}
+module.exports.failAdvisoryBulk = () => {
+ failAdvisoryBulk = true
+ return () => failAdvisoryBulk = false
+}
+
+module.exports.registry = `http://localhost:${PORT}/`
+
+module.exports.start = startServer
+module.exports.stop = () => module.exports.server.close()
+
+if (require.main === module) {
+ startServer(() => {
+ console.log(`Mock registry live at:
+ ${module.exports.registry}
+Press ^D to close gracefully.`)
+ })
+ process.openStdin()
+ process.stdin.on('end', () => module.exports.server.close())
+}